*
* Playing with BCD
*
* (c) 2018, Brutal Deluxe Software
*

            xc
            xc
            mx    %00
            org   $1000
            lst   off

*---

            clc
            xce
            rep   #$30

            lda   #$1000
            jsr   BCD2HEX

            lda   #$9999
            jsr   BCD2HEX

            lda   #$270f
            jsr   HEX2BCD

            sec
            xce
            sep   #$30
            rts

*---

            mx    %00

BCD2HEX     pha

* milliers

            and   #$f000
            lsr
            lsr
            lsr
            xba
            tax
            lda   tblBM,x
            sta   result

* centaines

            lda   1,s
            and   #$0f00
            asl
            xba
            tax
            lda   tblBC,x
            clc
            adc   result
            sta   result

* dizaines

            lda   1,s
            and   #$00f0
            lsr
            lsr
            lsr
            tax
            lda   tblBD,x
            clc
            adc   result
            sta   result

* unites

            lda   1,s
            and   #$000f
            asl
            tax
            lda   tblBU,x
            clc
            adc   result
            sta   result

            plx
            jmp   printME

*--- BCD 2 HEX table

tblBM       dw    0000,1000,2000,3000,4000,5000,6000,7000,8000,9000
tblBC       dw    0000,0100,0200,0300,0400,0500,0600,0700,0800,0900
tblBD       dw    0000,0010,0020,0030,0040,0050,0060,0070,0080,0090
tblBU       dw    0000,0001,0002,0003,0004,0005,0006,0007,0008,0009

*---

HEX2BCD     pha

* Step 1

            and   #$f000
            lsr
            lsr
            lsr
            xba
            tax
            lda   tblH1,x
            sta   result

* Step 2

            lda   1,s
            and   #$0f00
            asl
            xba
            tax
            sed
            lda   tblH2,x
            clc
            adc   result
            sta   result
            cld

* Step 3

            lda   1,s
            and   #$00f0
            lsr
            lsr
            lsr
            tax
            sed
            lda   tblH3,x
            clc
            adc   result
            sta   result
            cld

* Step 4

            lda   1,s
            and   #$000f
            asl
            tax
            sed
            lda   tblH4,x
            clc
            adc   result
            sta   result
            cld

exit        plx
            jmp   printME

*--- HEX 2 BCD table

tblH1       dw    $0000,$4096,$8192
tblH2       dw    $0000,$0256,$0512,$0768,$1024,$1280,$1536,$1792
            dw    $2048,$2304,$2560,$2816,$3072,$3328,$3584,$3840
tblH3       dw    $0000,$0016,$0032,$0048,$0064,$0080,$0096,$0112
            dw    $0128,$0144,$0160,$0176,$0192,$0208,$0224,$0240
tblH4       dw    $0000,$0001,$0002,$0003,$0004,$0005,$0006,$0007
            dw    $0008,$0009,$0010,$0011,$0012,$0013,$0014,$0015


*---

printME     sta   result

            sec
            xce
            sep   #$30

            lda   result+1
            jsr   $fdda
            lda   result
            jsr   $fdda

            lda   #$8d
            jsr   $fded

            clc
            xce
            rep   #$30
            rts

*---

result      ds    2