Converting Binary Coded Decimal

Binary Coded Decimal (BCD) is a method of representing a decimal number as a hexadecimal value using the hex digits 0-9 and ignoring A-F. For example, the number 21 (hex &15) would be represented as &21 (decimal 33). It can be a convenient internal representation of decimal numbers as each hexadecimal digit can be displayed without any further processing. See Wikipedia. BCD values can be decoded with:

number% = VALSTR\$~bcd%

Numbers can be encoded in BCD using:

bcd% = EVAL("&"+STR\$number%)

A 7-bit binary number can be converted to BCD so it can be printed in hex with the following 6502 code:

\ Convert binary number to BCD
\ ----------------------------
\ On entry, A=value 0-99
\ On exit,  A=BCD value &00-&99
\           X corrupted
.BINtoBCD
TAX             :\ Transfer number to X
LDA #&99        :\ Start with -1 in BCD form
SED             :\ Switch to Decimal arithmetic
.BINtoBCDlp
CLC:ADC #1      :\ Add 1 with BCD arithmetic
DEX             :\ Decrement input value in X
BPL BINtoBCDlp  :\ Loop until input value < 0
CLD:RTS         :\ Switch back to Binary arithmetic

See also Discussion for an enhanced implementation.

A BCD number can be converted to binary with the following 6502 code:

\ Convert BCD to Binary
\ --------------------------------------------
\ On entry, A=BCD value &00-&99
\ On exit,  X=binary value 0-99
\           A=corrupted
.BCDtoBIN