# Converting Binary Coded Decimal

**B**inary **C**oded **D**ecimal (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 LDX #&FF :\ Start with result=-1 SED :\ Switch to Decimal arithmetic SEC :\ Prepare for subtraction .BCDtoBINlp INX :\ Add 1 to result SBC #1 :\ Subtract 1 with BCD arithmetic BCS BCDtoBINlp :\ Loop until BCD value < 0 CLD:RTS :\ Switch back to Binary arithmetic

See also Discussion for an enhanced implementation.

Jgharston 21:11, 23 June 2007 (BST)
Jgharston (talk) 00:19, 3 October 2016 (UTC)