mirror of
https://github.com/KarolS/millfork.git
synced 2024-11-01 05:05:32 +00:00
81 lines
1.5 KiB
Plaintext
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
|
|
|
|
} |