-
Notifications
You must be signed in to change notification settings - Fork 1
/
bcd16.s
42 lines (38 loc) · 1.18 KB
/
bcd16.s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
; Convert an 16 bit binary value to BCD
;
; This function converts a 16 bit binary value into a 24 bit BCD. It
; works by transferring one bit a time from the source and adding it
; into a BCD value that is being doubled on each iteration. As all the
; arithmetic is being done in BCD the result is a binary to decimal
; conversion. All conversions take 915 clock cycles.
;
; See BINBCD8 for more details of its operation.
;
; Andrew Jacobs, 28-Feb-2004
* = $300
jmp BINBCD16
; 12345 -> BCD: $01 $23 $45
BIN .word 12345
BCD .fill 3
BINBCD16:
sed ; Switch to decimal mode
lda #0 ; Ensure the result is clear
sta BCD+0
sta BCD+1
sta BCD+2
ldx #16 ; The number of source bits
CNVBIT: asl BIN ; Shift out one bit
rol BIN+1
lda BCD+2 ; And add into result
adc BCD+2
sta BCD+2
lda BCD+1 ; propagating any carry
adc BCD+1
sta BCD+1
lda BCD ; ... thru whole result
adc BCD
sta BCD
dex ; And repeat for next bit
bne CNVBIT
cld ; Back to binary
rts