1
0
mirror of https://github.com/KarolS/millfork.git synced 2024-11-12 15:05:20 +00:00
millfork/include/bcd_6502.mfk
2018-08-03 13:06:23 +02:00

81 lines
1.5 KiB
Plaintext

#if not(ARCH_6502)
#warn bcd_6502 module should be only used on 6502-compatible targets
#endif
// subtracts __reg+3 from __reg+2 in a decimal way respecting carry
// returns the result in A and C
asm byte __sbc_decimal() {
LDA #$99
ADC #0
SEC
SBC __reg+3
STA __reg+3
CLC
? JMP __adc_decimal
}
// subtracts __reg+3 from __reg+2 in a decimal way ignoring carry
// returns the result in A and C
asm byte __sub_decimal() {
LDA #$9A
SEC
SBC __reg+3
STA __reg+3
CLC
? JMP __adc_decimal
}
// adds __reg+2 and __reg+3 in a decimal way
// returns the result in A and C
asm byte __adc_decimal() {
LDA __reg+2
TAX
AND #$F
STA __reg+2
LDA __reg+3
AND #$F
ADC __reg+2
STX __reg+2
CMP #$A
BCC __adc_decimal_lo_no_carry
// not needed: SEC
ADC #5
AND #$F
TAX // X contains the sum of low digits
LDA #$10
CLC
ADC __reg+2
STA __reg+2 // halfcarry pushed into R2
? JMP __adc_decimal_after_hi
__adc_decimal_lo_no_carry:
TAX
__adc_decimal_after_hi:
CLC
LDA __reg+2
AND #$F0
ADC __reg+3
AND #$F0
BCS __adc_decimal_hi_carry
STA __reg+2 // R2 contains the sum of high digits
TXA
CLC
ADC __reg+2
CMP #$A0
BCC __adc_decimal_hi_no_carry
// ; not needed: SEC
SBC #$A0
SEC
__adc_decimal_hi_no_carry:
RTS
__adc_decimal_hi_carry:
// ; not needed: SEC
SBC #$A0
STA __reg+2 // R2 contains the sum of high digits
TXA
CLC
ADC __reg+2
SEC
RTS
}