SBC Subtract with Borrow from Accumulator
Subtracts the data in the operand with the contents of the accumulator. Subtract 1 from the result if the carry flag is clear. Store the final result in the accumulator.
If the d flag is clear then binary subtraction is performed. If the d flag set then Binary Coded Decimal (BCD) subtraction is performed.
On all processors, the data subtracted from memory is 8-bit. However, for 16-bit processors with the m flag is clear then the data subtracted is 16-bit with the low-order 8-bits at the effective address and the high-order 8-bits at the effective address plus one.
In multi-precision (multi-word) arithmetic, the carry flag should be set before the low-order words are subtracted. The subtraction will generate a new carry flag value based on that subtraction which will then be passed on to the next word.
For example, to subtract 1 from a 16-bit value at &70 on 8-bit processors:
1 SEC ; Set carry before first subtraction 2 LDA &70 ; Subtract 1 from low-order byte 3 SBC #1 4 STA &70 5 LDA &71 ; Subtract 0 to high order byte 6 SBC #0 ; This will subtract 1 if carry was clear 7 STA &71 ; from the low-order byte
|n||Set if most-significant bit of result is set|
|v||Set if signed overflow|
|z||Set if result is zero|
|c||Set if unsigned borrow not required, clear if required|
|Syntax||Opcode||Available on:||# of||# of||Addressing Mode|
|SBC #const||E9||x||x||x||21||22, 5||Immediate|
|SBC addr||ED||x||x||x||3||42, 5||Absolute|
|SBC long||EF||x||4||52, 5||Absolute Long|
|SBC dp||E5||x||x||x||2||32, 3, 5||Direct Page|
|SBC (dp)||F2||x||x||2||52, 3, 5||Direct Page Indirect|
|SBC [dp]||E7||x||2||62, 3, 5||Direct Page Indirect Long|
|SBC addr,X||FD||x||x||x||3||42, 4, 5||Absolute Indexed X|
|SBC long,X||FF||x||4||52, 5||Absolute Long Indexed X|
|SBC addr,Y||F9||x||x||x||3||42, 4, 5||Absolute Indexed Y|
|SBC dp,X||F5||x||x||x||2||42, 3, 5||Direct Page Indexed X|
|SBC (dp,X)||E1||x||x||x||2||62, 3, 5||Direct Page Indexed Indirect X|
|SBC (dp),Y||F1||x||x||x||2||52, 3, 4, 5||Direct Page Indirect Indexed Y|
|SBC [dp],Y||F7||x||2||62, 3, 5||Direct Page Indirect Long Indexed Y|
|SBC sr,S||E3||x||2||42, 5||Stack Relative|
|SBC (sr,S),Y||F3||x||2||72, 5||Stack Relative Indirect Indexed Y|
- 65816: Add 1 byte if m=0 (16-bit memory/accumulator)
- 65816: Add 1 cycle if m=0 (16-bit memory/accumulator)
- 65816: Add 1 cycle if low byte of Direct Page register is not 0
- Add 1 cycle if adding index crosses a page boundary
- 65C02: Add 1 cycle if d=1