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.
Binary/Decimal mode
If the d flag is clear then binary subtraction is performed. If the d flag set then Binary Coded Decimal (BCD) subtraction is performed.
Data size
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.
Multi-precision arithmetic
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
Flags Affected
Flags |
| ||||||||
---|---|---|---|---|---|---|---|---|---|
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 |
Instructions
Syntax | Opcode | Available on: | # of | # of | Addressing Mode | ||
---|---|---|---|---|---|---|---|
(hex) | 6502 | 65C02 | 65816 | bytes | cycles | ||
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 |
Notes:
- 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