HexToDecimal.8

From NESdev Wiki
Jump to navigationJump to search

Celius wrote 8-, 16-, and 24-bit binary to decimal converters. They work by storing the BCD version of 1, 2, 4, 8, 16, ..., 32768, adding them all up digit-wise, and performing the carry through big lookup tables.

HexToDecimal.8:
;Given: Hex value in Hex0
;Returns decimal value in DecOnes, DecTens, and DecHundreds.

	lda #$00
	sta DecOnes
	sta DecTens
	sta DecHundreds

	lda Hex0
	and #$0F
	tax
	lda HexDigit00Table,x
	sta DecOnes
	lda HexDigit01Table,x
	sta DecTens

	lda Hex0
	lsr a
	lsr a
	lsr a
	lsr a
	tax
	lda HexDigit10Table,x
	clc
	adc DecOnes
	sta DecOnes
	lda HexDigit11Table,x
	adc DecTens
	sta DecTens
	lda HexDigit12Table,x
	sta DecHundreds

	clc
	ldx DecOnes
	lda DecimalSumsLow,x
	sta DecOnes
	

	lda DecimalSumsHigh,x
	adc DecTens
	tax
	lda DecimalSumsLow,x
	sta DecTens

	lda DecimalSumsHigh,x
	adc DecHundreds
	tax
	lda DecimalSumsLow,x
	sta DecHundreds			;118

	rts

HexToDecimal.16:
;Given: Hex value in Hex0 and Hex1.
;Returns decimal value in DecOnes, DecTens, DecHundreds, DecThousands, DecTenThousands.

	lda #$00
	sta DecOnes
	sta DecTens
	sta DecHundreds
	sta DecThousands
	sta DecTenThousands

	lda Hex0
	and #$0F
	tax
	lda HexDigit00Table,x
	sta DecOnes
	lda HexDigit01Table,x
	sta DecTens

	lda Hex0
	lsr a
	lsr a
	lsr a
	lsr a
	tax
	lda HexDigit10Table,x
	clc
	adc DecOnes
	sta DecOnes
	lda HexDigit11Table,x
	adc DecTens
	sta DecTens
	lda HexDigit12Table,x
	sta DecHundreds

	lda Hex1
	and #$0F
	tax
	lda HexDigit20Table,x
	clc
	adc DecOnes
	sta DecOnes
	lda HexDigit21Table,x
	adc DecTens
	sta DecTens
	lda HexDigit22Table,x
	adc DecHundreds
	sta DecHundreds
	lda HexDigit23Table,x
	sta DecThousands

	lda Hex1
	lsr a
	lsr a
	lsr a
	lsr a
	tax
	clc
	lda HexDigit30Table,x
	adc DecOnes
	sta DecOnes
	lda HexDigit31Table,x
	adc DecTens
	sta DecTens
	lda HexDigit32Table,x
	adc DecHundreds
	sta DecHundreds
	lda HexDigit33Table,x
	adc DecThousands
	sta DecThousands
	lda HexDigit34Table,x
	sta DecTenThousands

	clc
	ldx DecOnes
	lda DecimalSumsLow,x
	sta DecOnes
	

	lda DecimalSumsHigh,x
	adc DecTens
	tax
	lda DecimalSumsLow,x
	sta DecTens

	lda DecimalSumsHigh,x
	adc DecHundreds
	tax
	lda DecimalSumsLow,x
	sta DecHundreds

	lda DecimalSumsHigh,x
	adc DecThousands
	tax
	lda DecimalSumsLow,x
	sta DecThousands

	lda DecimalSumsHigh,x
	adc DecTenThousands
	tax
	lda DecimalSumsLow,x
	sta DecTenThousands			;263

	rts


HexToDecimal.24:
;Given hex value in Hex0, Hex1, and Hex2
;Returns decimal value in DecOnes, DecTens, DecHundreds, DecThousands, DecTenThousands, DecHundredThousands, DecMillions,
;and DecTenMillions.

	lda #$00
	sta DecOnes
	sta DecTens
	sta DecHundreds
	sta DecThousands
	sta DecTenThousands
	sta DecHundredThousands
	sta DecMillions
	sta DecTenMillions
	

	lda Hex0
	and #$0F
	tax
	lda HexDigit00Table,x
	sta DecOnes
	lda HexDigit01Table,x
	sta DecTens

	lda Hex0
	lsr a
	lsr a
	lsr a
	lsr a
	tax
	lda HexDigit10Table,x
	clc
	adc DecOnes
	sta DecOnes
	lda HexDigit11Table,x
	adc DecTens
	sta DecTens
	lda HexDigit12Table,x
	sta DecHundreds


	lda Hex1
	and #$0F
	tax
	lda HexDigit20Table,x
	clc
	adc DecOnes
	sta DecOnes
	lda HexDigit21Table,x
	adc DecTens
	sta DecTens
	lda HexDigit22Table,x
	adc DecHundreds
	sta DecHundreds
	lda HexDigit23Table,x
	sta DecThousands


	lda Hex1
	lsr a
	lsr a
	lsr a
	lsr a
	tax
	clc
	lda HexDigit30Table,x
	adc DecOnes
	sta DecOnes
	lda HexDigit31Table,x
	adc DecTens
	sta DecTens
	lda HexDigit32Table,x
	adc DecHundreds
	sta DecHundreds
	lda HexDigit33Table,x
	adc DecThousands
	sta DecThousands
	lda HexDigit34Table,x
	sta DecTenThousands

	lda Hex2
	and #$0F
	tax
	clc
	lda HexDigit40Table,x
	adc DecOnes
	sta DecOnes
	lda HexDigit41Table,x
	adc DecTens
	sta DecTens
	lda HexDigit42Table,x
	adc DecHundreds
	sta DecHundreds
	lda HexDigit43Table,x
	adc DecThousands
	sta DecThousands
	lda HexDigit44Table,x
	adc DecTenThousands
	sta DecTenThousands
	lda HexDigit45Table,x
	sta DecHundredThousands

	lda Hex2
	lsr a
	lsr a
	lsr a
	lsr a
	tax
	clc
	lda HexDigit50Table,x
	adc DecOnes
	sta DecOnes
	lda HexDigit51Table,x
	adc DecTens
	sta DecTens
	lda HexDigit52Table,x
	adc DecHundreds
	sta DecHundreds
	lda HexDigit53Table,x
	adc DecThousands
	sta DecThousands
	lda HexDigit54Table,x
	adc DecTenThousands
	sta DecTenThousands
	lda HexDigit55Table,x
	adc DecHundredThousands
	sta DecHundredThousands
	lda HexDigit56Table,x
	sta DecMillions
	lda HexDigit57Table,x
	sta DecTenMillions

	clc
	ldx DecOnes
	lda DecimalSumsLow,x
	sta DecOnes
	

	lda DecimalSumsHigh,x
	adc DecTens
	tax
	lda DecimalSumsLow,x
	sta DecTens

	lda DecimalSumsHigh,x
	adc DecHundreds
	tax
	lda DecimalSumsLow,x
	sta DecHundreds

	lda DecimalSumsHigh,x
	adc DecThousands
	tax
	lda DecimalSumsLow,x
	sta DecThousands

	lda DecimalSumsHigh,x
	adc DecTenThousands
	tax
	lda DecimalSumsLow,x
	sta DecTenThousands

	lda DecimalSumsHigh,x
	adc DecHundredThousands
	tax
	lda DecimalSumsLow,x
	sta DecHundredThousands

	lda DecimalSumsHigh,x
	adc DecMillions
	tax
	lda DecimalSumsLow,x
	sta DecMillions

	lda DecimalSumsHigh,x
	adc DecTenMillions
	tax
	lda DecimalSumsLow,x
	sta DecTenMillions

								;475

	rts

;************ Pre-Converted Hex to Decimal Tables *************

;******

;1 byte
HexDigit32Table:
	.db $0

HexDigit00Table:
HexDigit56Table:
DecimalSumsLow:
;55 bytes
	.db $0,$1,$2,$3,$4,$5,$6,$7,$8,$9,$0,$1,$2,$3,$4,$5
	.db $6,$7,$8,$9,$0,$1,$2,$3,$4,$5,$6,$7,$8,$9,$0,$1
	.db $2,$3,$4,$5,$6,$7,$8,$9,$0,$1,$2,$3,$4,$5,$6,$7
	.db $8,$9,$0,$1,$2,$3,$4

HexDigit01Table:
HexDigit57Table:
DecimalSumsHigh:
;55 bytes
	.db $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$1,$1,$1,$1,$1,$1
	.db $1,$1,$1,$1,$2,$2,$2,$2,$2,$2,$2,$2,$2,$2,$3,$3
	.db $3,$3,$3,$3,$3,$3,$3,$3,$4,$4,$4,$4,$4,$4,$4,$4
	.db $4,$4,$5,$5,$5,$5,$5

;111 bytes
;******
HexDigit50Table:
HexDigit40Table:
HexDigit30Table:
HexDigit20Table:
HexDigit10Table:
	.db $0,$6,$2,$8,$4,$0,$6,$2,$8,$4,$0,$6,$2,$8,$4,$0

HexDigit11Table:
	.db $0,$1,$3,$4,$6,$8,$9,$1,$2,$4,$6,$7,$9,$0,$2,$4

HexDigit12Table:
	.db $0,$0,$0,$0,$0,$0,$0,$1,$1,$1,$1,$1,$1,$2,$2,$2
;******
HexDigit21Table:
	.db $0,$5,$1,$6,$2,$8,$3,$9,$4,$0,$6,$1,$7,$2,$8,$4

HexDigit22Table:
	.db $0,$2,$5,$7,$0,$2,$5,$7,$0,$3,$5,$8,$0,$3,$5,$8

HexDigit23Table:
	.db $0,$0,$0,$0,$1,$1,$1,$1,$2,$2,$2,$2,$3,$3,$3,$3
;******
HexDigit31Table:
	.db $0,$9,$9,$8,$8,$8,$7,$7,$6,$6,$6,$5,$5,$4,$4,$4

HexDigit33Table:
	.db $0,$4,$8,$2,$6,$0,$4,$8,$2,$6,$0,$5,$9,$3,$7,$1

HexDigit34Table:
	.db $0,$0,$0,$1,$1,$2,$2,$2,$3,$3,$4,$4,$4,$5,$5,$6

;******
HexDigit41Table:
	.db $0,$3,$7,$0,$4,$8,$1,$5,$8,$2,$6,$9,$3,$6,$0,$4

HexDigit42Table:
	.db $0,$5,$0,$6,$1,$6,$2,$7,$2,$8,$3,$8,$4,$9,$5,$0

HexDigit43Table:
	.db $0,$5,$1,$6,$2,$7,$3,$8,$4,$9,$5,$0,$6,$1,$7,$3

HexDigit44Table:
	.db $0,$6,$3,$9,$6,$2,$9,$5,$2,$8,$5,$2,$8,$5,$1,$8

HexDigit45Table:
	.db $0,$0,$1,$1,$2,$3,$3,$4,$5,$5,$6,$7,$7,$8,$9,$9
;******
HexDigit51Table:
	.db $0,$7,$5,$2,$0,$8,$5,$3,$0,$8,$6,$3,$1,$8,$6,$4

HexDigit52Table:
	.db $0,$5,$1,$7,$3,$8,$4,$0,$6,$1,$7,$3,$9,$4,$0,$6

HexDigit53Table:
	.db $0,$8,$7,$5,$4,$2,$1,$0,$8,$7,$5,$4,$2,$1,$0,$8

HexDigit54Table:
	.db $0,$4,$9,$4,$9,$4,$9,$4,$8,$3,$8,$3,$8,$3,$8,$2

HexDigit55Table:
	.db $0,$0,$0,$1,$1,$2,$2,$3,$3,$4,$4,$5,$5,$6,$6,$7