User Tools

Site Tools


No renderer 'pdf' found for mode 'pdf'
base:decimal_to_hexadecimal_conversion

This is an old revision of the document!


Decimal to hexadecimal conversion

By Mace

This routine converts two bytes decimal to two bytes hexadecimal. 'hiInput' contains hundreds, 'loInput' contains tens and ones, so $0365 equals #365 decimal. It will be converted to 'hiResult' and 'loResult' (in this case $016d, the hexadecimal of 365).

	.pc = $0810

		lda #$00	; Init result bytes
		sta loResult
		sta hiResult
		lda loInput	; Fetch ones and tens
		tax		; Save to X
		and #$0f	; Strip the ones
		tay		; Save to Y
		txa		; Get original ones and tens
		lsr
		lsr
		lsr
		lsr		; Divide by 16 to get tens only
		tax		; Save to X
		tya		; Put the ones in A
		cpx #$00	; No tens? Then skip
		beq PROCEED
		clc
TENS:		adc #$0a	; Add as many tens as value of X
		dex
		bne TENS
PROCEED:	ldx hiInput	; Fetch the hundreds
		beq END		; No hundreds? Then go to end
HUND:		clc
		adc #$64	; Add as many hundreds as value of X
		bcc !+
		inc hiResult	; Increase high byte every passed $FF
!:		dex
		bne HUND
END:		sta loResult	; Store low byte
		rts

hiInput:	.byte $00
loInput:	.byte $01
hiResult:	.byte $00
loResult:	.byte $00

By Verz:

I made a small improvement, the idea being that a 10x multiplication can be computed as a sum of a (8x + 2x); since we're shifting the high nibble to the right, we get the 8x and 2x values in the process. (Note that using a loResult in page zero there are 5 bytes/cycles of improvement)

bcdbin
            lda #$00        ; Init result bytes
            ;sta loResult    ; useless
            sta hiResult
            lda loInput     ; Fetch ones and tens
            tay             ; Save to Y
            and #$f0        ; this two instructions, or use the undocumented ALR #$f0 = (and #$f0) + (lsr)
            lsr
            ;alr #$f0
            sta loResult
            lsr
            lsr
            adc loResult
            sta loResult
            tya
            and #$0f        ; Strip the ones
            adc loResult

            ldx hiInput     ; Fetch the hundreds
            beq END         ; No hundreds? Then go to end
HUND:       clc
            adc #$64        ; Add as many hundreds as value of X
            bcc loop
            inc hiResult    ; Increase high byte every passed $FF
loop:       dex
            bne HUND
END:        sta loResult    ; Store low byte
            rts

hiInput:	.byte $00
loInput:	.byte $01
hiResult:	.byte $00
loResult:	.byte $00

Here a routine to convert a single BCD byte (0-99) in A, to a binary in A:

BCDBIN8
          tay
          and            #%11110000 
          lsr
          ;alr            #%11110000  ;  =(And #$f0)+(Lsr), to replace the two previous instructions
          sta            pzTmp     
          lsr
          lsr
          adc            pzTmp       
          sta            pzTmp      
          tya
          and            #%1111     
          adc            pzTmp      
          rts
          
pzTmp .equ $02    ; $02 is a unused zeropage memory location in C64
base/decimal_to_hexadecimal_conversion.1455483542.txt.gz · Last modified: 2016-02-14 21:59 by verz