[H8-ML(658)] Re: 初歩的な質問なんですが・・・
From: Masataka Hirota <mhirota@xxxxxxxxxxxxx>
Date: 2000年06月27日(火)01時59分08秒
> 問題は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
******************************************************************************/
スレッド概略
[654(R)](起点)
 └[657(U)]
   └[表示中]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]