User Tools

Site Tools


base:decimal_to_hexadecimal_conversion

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 would be 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.txt · Last modified: 2016-02-14 22:02 by verz