> 問題は16進数をどうやって10進数にするか?です
> 例えばR1に入っている16ビットのデータを10進5桁にしたい場合
> 皆様ならどのような方法で処理するのでしょうか?
>
> 自分はいままでZ80を使ってから最近H8にシフトした口なので
> 割り算などよく使い方がわからず、引き算で商を出し、余りをさらに割る
CCRの変化を注意して、Z80の命令をそのままH8に書き換えてしまえば
動作するような気がしますが。Z80でHEX2BCDプログラムを作りませんでしたか?
で、こんな古典的なプログラムを紹介しましょう。
原典は「日立のHD6800アプリケーションマニュアル」(ふる〜い!!)です。
これを6809用にコンバートして使用し、最近H8/300Hに乗り換えたので
H8/300H用に再コンバートしました。
かけ算命令や、わり算命令を持っていないし、アドレッシングも貧弱なCPU用
プログラムですが、問題なくどうさするので最適化しないまま使用し続けています。
参考にして下され。
以下H8/300H用プログラム例-----------------------------------------------
;*************************************************************************
;
; ROUTINE: 16bitBIN TO BCD CONVERTER
; TRANSPLANT FROM 6809 MPU PROGRAM
; INPUT
; R0.W= BIN (0 -- H'FFFF)
; OUTPUT
; ER0.L = BCD (0 -- 65535)
; USED REGISTER
; CCR
; WORK AREA=ER7(SP)+0 ---E0H
; +1 ---E0L
; +2 ---BIN_HIGH *
; +3 ---BIN_LOW *
; +4 ---0 *
; +5 ---0 *
; +6 ---0 *
; +7 ---DEC4 *
; +8 ---DEC3 *
; +9 ---DEC2 *
; +10 ---DEC1 *
; +11 ---DEC0 *
; +12 ---E1H SAVE *
; +13 ---E1L SAAVE *
;*************************************************************************
BIN4BCD
PUSH ER5
PUSH ER4
PUSH ER3
PUSH ER2
PUSH ER1
MOV.L #0,ER1 ;CLEAR RESULT EREAS
PUSH ER1 ;"
PUSH ER1 ;"
PUSH ER0 ;SAVE BIN DATA
; CONVERT 000x
MOV.L ER7,ER5 ;WORK AREA POINTER MOVE
MOV.B @(3,ER5),R0L ;GET LOWER BYTE
AND.B #H'0F,R0L ;GET 4 LSB
MOV.B #H'00,R1L ;GET #0
ADD.B R1L,R0L
DAA.B R0L ;10進補正
MOV.B R0L,@(11,ER5) ;STORE LSB
; CONVERT 00x0
MOV.L #CONB7-3,ER4 ;GET TABLE TOP - OFFSET
MOV.B @(3,ER5),R1L ;GET LOWST BYTE
AND.B #H'F0,R1L ;SAVE 4 MSB OF LOWST BYTE
BITSR
ADD.L #3,ER4 ;R4+3-->R4
SHAL.B R1L ;SHIFT BIT TO CARRY
BCC NEXTB ;BRANCH IF BIT IS ZERO
BSR ADDSR ;ADD CONSTANT IF NOT ZERO
NEXTB
AND.B #H'FF,R1L ;TEST R1L
BNE BITSR ;DO NEXT BIT IF ANY REMAIN
; CONVERT xx00
MOV.L #CONB15-3,ER4 ;GET TABLE -OFFSET
MOV.B @(2,ER5),R1L ;GET HIGHER BYTE
BITSR15
ADD.L #3,ER4 ;ER4+3-->ER4
SHAL.B R1L ;SHIFT BIT TO CARRY
BCC NEXTB15 ;BRANCH IF BIT IS ZERO
BSR ADDSR ;ADD CONSTANT IF NOT ZERO
;
NEXTB15
AND.B #H'FF,R1L ;TEST R1L
BNE BITSR15 ;DO NEXT BIT IF ANY REMAIN
POP ER0 ;RELEASE STACK
POP ER0 ;RELEASE STACK
POP ER0 ;GET RESULT
POP ER1 ;RETURN R1
POP ER2 ;RETURN R2
POP ER3 ;RETURN R3
POP ER4 ;RETURN R4
POP ER5 ;RETURN R5
RTS
;
ADDSR
MOV.B @(11,ER5),R0L ;ADD CONSTANT TO RESULT
MOV.B @ER4,R0H ;GET BIN TO TEMPORARY REG
ADD.B R0H,R0L ;(ADD.B @R4,R0L)
DAA R0L
MOV.B R0L,@(11,ER5) ;SAVE
MOV.B @(10,ER5),R0L
MOV.B @(1,ER4),R0H
ADDX.B R0H,R0L
DAA R0L
MOV.B R0L,@(10,ER5) ;SAVE
MOV.B @(9,ER5),R0L
MOV.B @(2,ER4),R0H
ADDX.B R0H,R0L
DAA R0L
MOV.B R0L,@(9,ER5)
RTS
.ALIGN 2
; 変換テーブル
CONB7 .DATA.B H'28,1,0,H'64,0,0,H'32,0,0,H'16,0,0
CONB15 .DATA.B H'68,H'27,3,H'84,H'63,1,H'92,H'81,0
.DATA.B H'96,H'40,0,H'48,H'20,0,H'24,H'10,0,H'12,5,0,H'56,2,0
ここまで---------------------------------------------------------------
--
/******************************************************************************
Name: "Masataka Hirota"
E-mail address: mhirota@xxxxxxxxxxxxx
GCD03040@xxxxxxxxxxx
******************************************************************************/