BCD to Binary Conversion (32-bit) from 6502 Software Design, Expanded by Greg
[Up to Source Code Repository]
BCD to Binary Conversion (32-bit)
These are routines that I expanded from the 6502 Software Design book by Leo J. Scanlon. Anyone may contact me for questions or comments at greg@ntown.com.
;This routine converts a packed 8 digit BCD value in memory loactions
;BINARY to BINARY+3 to a binary value with the dp value in location
;EXP and stores it in locations BCD to BCD+3. It Then packs the dp value
;in the MSBY high nibble location BCD+3.
BCD_BIN: stz BINARY+3 ;Reset MSBY
jsr NXT_BCD ;Get next BCD value
sta BINARY ;Store in LSBY
ldx #$07
GET_NXT: jsr NXT_BCD ;Get next BCD value
jsr MPY10
dex
bne GET_NXT
asl EXP ;Move dp nibble left
asl EXP
asl EXP
asl EXP
lda BINARY+3 ;Get MSBY and filter it
and #$0f
ora EXP ;Pack dp
sta BINARY+3
rts
NXT_BCD: ldy #$04
lda #$00
MV_BITS: asl BCD
rol BCD+1
rol BCD+2
rol BCD+3
rol a
dey
bne MV_BITS
rts
;Conversion subroutine for BCD_BIN
MPY10: sta TEMP2 ;Save digit just entered
lda BINARY+3 ;Save partial result on
pha ;stack
lda BINARY+2
pha
lda BINARY+1
pha
lda BINARY
pha
asl BINARY ;Multiply partial
rol BINARY+1 ;result by 2
rol BINARY+2
rol BINARY+3
asl BINARY ;Multiply by 2 again
rol BINARY+1
rol BINARY+2
rol BINARY+3
pla ;Add original result
adc BINARY
sta BINARY
pla
adc BINARY+1
sta BINARY+1
pla
adc BINARY+2
sta BINARY+2
pla
adc BINARY+3
sta BINARY+3
asl BINARY ;Multiply result by 2
rol BINARY+1
rol BINARY+2
rol BINARY+3
lda TEMP2 ;Add digit just entered
adc BINARY
sta BINARY
lda #$00
adc BINARY+1
sta BINARY+1
lda #$00
adc BINARY+2
sta BINARY+2
lda #$00
adc BINARY+3
sta BINARY+3
rts
;This program takes a 4 byte binary value from locations BINARY to
;BINARY+3, converts it to packed BCD and stores it in locations BCD
;to BCD+3 and puts the dp value in location EXP.
BIN_BCD: lda BINARY+3 ;Get MSBY
and #$f0 ;Filter out low nibble
lsr a ;Move hi nibble right (dp)
lsr a
lsr a
lsr a
sta EXP ;store dp
lda BINARY+3
and #$0f ;Filter out high nibble
sta BINARY+3
BCD_DP: ldy #$00 ;Clear table pointer
NXTDIG: ldx #$00 ;Clear digit count
SUB_MEM: lda BINARY ;Get LSBY of binary value
sec
sbc SUBTBL,y ;Subtract LSBY + y of table value
sta BINARY ;Return result
lda BINARY+1 ;Get next byte of binary value
iny
sbc SUBTBL,y ;Subtract next byte of table value
sta BINARY+1
lda BINARY+2 ;Get next byte
iny
sbc SUBTBL,y ;Subtract next byte of table
sta BINARY+2
lda BINARY+3 ;Get MSBY of binary value
iny
sbc SUBTBL,y ;Subtract MSBY of table
bcc ADBACK ;If result is neg go add back
sta BINARY+3 ;Store MSBY then point back to LSBY of table
dey
dey
dey
inx
bra SUB_MEM ;Go subtract again
ADBACK: dey ;Point back to LSBY of table
dey
dey
lda BINARY ;Get LSBY of binary value and add LSBY
adc SUBTBL,y ;of table value
sta BINARY
lda BINARY+1 ;Get next byte
iny
adc SUBTBL,y ;Add next byte of table
sta BINARY+1
lda BINARY+2 ;Next byte
iny
adc SUBTBL,y ;Add next byte of table
sta BINARY+2
txa ;Put dec count in acc
jsr BCDREG ;Put in BCD reg
iny
iny
cpy #$20 ;End of table?
bcc NXTDIG ;No? go back with next dec weight
lda BINARY ;Yes? put remainder in acc and put in BCD reg
BCDREG: asl a
asl a
asl a
asl a
ldx #$04
SHFT_L asl a
rol BCD
rol BCD+1
rol BCD+2
rol BCD+3
dex
bne SHFT_L
rts
SUBTBL: DB $00,$e1,$f5,$05
DB $80,$96,$98,$00
DB $40,$42,$0f,$00
DB $a0,$86,$01,$00
DB $10,$27,$00,$00
DB $e8,$03,$00,$00
DB $64,$00,$00,$00
DB $0a,$00,$00,$00
Last page update: August 12, 1999.