mov al, 0x45 ; BCD 45 add al, 0x27 ; BCD 27 → binary result 0x6C daa ; adjusts to 0x72 (BCD 72)
| Command | Effect in Decimal Mode | |---------|------------------------| | | Set Decimal Mode (D=1) | | CLD | Clear Decimal Mode (D=0, back to binary) | | ADC | Adds with carry in BCD | | SBC | Subtracts with borrow in BCD | bcd commands
seconds = rtc_read(0x00); // BCD 0x45 = 45 sec // Convert to binary for computation: bin_sec = ((seconds >> 4) * 10) + (seconds & 0x0F); Multiplexed displays often receive BCD directly from a 74LS47 decoder. Processor outputs BCD values to port. 5.3 Financial/Cash Registers Currency amounts must be exact to the cent. BCD arithmetic prevents floating-point errors: mov al, 0x45 ; BCD 45 add al,
uint8_t bcd_add(uint8_t a, uint8_t b) uint16_t sum = (a & 0x0F) + (b & 0x0F) + (((a >> 4) + (b >> 4)) << 4); if ((sum & 0x0F) >= 10) sum += 6; if ((sum >> 4) >= 10) sum += 0x60; return (uint8_t)sum; 4) + (b >