6510 / 6502 Complete Opcode Reference
Source: The Machine Language Book for the C64; The Advanced Machine Language Book for the C64
Flags: Negative · oVerflow · Break · Decimal · Interrupt · Zero · Carry
Column order: Opcode | Hex | Bytes | Cycles | Flags affected
Addressing Mode Key
| Symbol |
Mode |
Example |
| imm |
Immediate |
LDA #$0A |
| zp |
Zero Page |
LDA $10 |
| zp,X |
Zero Page,X |
LDA $10,X |
| zp,Y |
Zero Page,Y |
LDA $10,Y |
| abs |
Absolute |
LDA $1234 |
| abs,X |
Absolute,X |
LDA $1234,X |
| abs,Y |
Absolute,Y |
LDA $1234,Y |
| ind |
Indirect |
JMP ($1234) |
| (zp,X) |
Indexed Indirect |
LDA ($10,X) |
| (zp),Y |
Indirect Indexed |
LDA ($10),Y |
| rel |
Relative (branch) |
BNE label |
| impl |
Implied |
CLC |
| A |
Accumulator |
LSR A |
+1 cycle if page boundary crossed; +2 cycles for branch taken + page cross.
Load / Store
LDA — Load Accumulator N Z
| Mode |
Hex |
Bytes |
Cycles |
| imm |
$A9 |
2 |
2 |
| zp |
$A5 |
2 |
3 |
| zp,X |
$B5 |
2 |
4 |
| abs |
$AD |
3 |
4 |
| abs,X |
$BD |
3 |
4+1 |
| abs,Y |
$B9 |
3 |
4+1 |
| (zp,X) |
$A1 |
2 |
6 |
| (zp),Y |
$B1 |
2 |
5+1 |
LDX — Load X Register N Z
| Mode |
Hex |
Bytes |
Cycles |
| imm |
$A2 |
2 |
2 |
| zp |
$A6 |
2 |
3 |
| zp,Y |
$B6 |
2 |
4 |
| abs |
$AE |
3 |
4 |
| abs,Y |
$BE |
3 |
4+1 |
LDY — Load Y Register N Z
| Mode |
Hex |
Bytes |
Cycles |
| imm |
$A0 |
2 |
2 |
| zp |
$A4 |
2 |
3 |
| zp,X |
$B4 |
2 |
4 |
| abs |
$AC |
3 |
4 |
| abs,X |
$BC |
3 |
4+1 |
STA — Store Accumulator (no flags)
| Mode |
Hex |
Bytes |
Cycles |
| zp |
$85 |
2 |
3 |
| zp,X |
$95 |
2 |
4 |
| abs |
$8D |
3 |
4 |
| abs,X |
$9D |
3 |
5 |
| abs,Y |
$99 |
3 |
5 |
| (zp,X) |
$81 |
2 |
6 |
| (zp),Y |
$91 |
2 |
6 |
STX — Store X (no flags)
| Mode |
Hex |
Bytes |
Cycles |
| zp |
$86 |
2 |
3 |
| zp,Y |
$96 |
2 |
4 |
| abs |
$8E |
3 |
4 |
STY — Store Y (no flags)
| Mode |
Hex |
Bytes |
Cycles |
| zp |
$84 |
2 |
3 |
| zp,X |
$94 |
2 |
4 |
| abs |
$8C |
3 |
4 |
Register Transfers N Z
| Mnemonic |
Hex |
Bytes |
Cycles |
Operation |
| TAX |
$AA |
1 |
2 |
A → X |
| TAY |
$A8 |
1 |
2 |
A → Y |
| TXA |
$8A |
1 |
2 |
X → A |
| TYA |
$98 |
1 |
2 |
Y → A |
| TSX |
$BA |
1 |
2 |
SP → X (N Z) |
| TXS |
$9A |
1 |
2 |
X → SP (none) |
Stack Operations
| Mnemonic |
Hex |
Bytes |
Cycles |
Flags |
Operation |
| PHA |
$48 |
1 |
3 |
— |
Push A to stack |
| PLA |
$68 |
1 |
4 |
N Z |
Pull A from stack |
| PHP |
$08 |
1 |
3 |
— |
Push SR to stack |
| PLP |
$28 |
1 |
4 |
all |
Pull SR from stack |
Arithmetic
ADC — Add with Carry N V Z C
| Mode |
Hex |
Bytes |
Cycles |
| imm |
$69 |
2 |
2 |
| zp |
$65 |
2 |
3 |
| zp,X |
$75 |
2 |
4 |
| abs |
$6D |
3 |
4 |
| abs,X |
$7D |
3 |
4+1 |
| abs,Y |
$79 |
3 |
4+1 |
| (zp,X) |
$61 |
2 |
6 |
| (zp),Y |
$71 |
2 |
5+1 |
SBC — Subtract with Borrow N V Z C
| Mode |
Hex |
Bytes |
Cycles |
| imm |
$E9 |
2 |
2 |
| zp |
$E5 |
2 |
3 |
| zp,X |
$F5 |
2 |
4 |
| abs |
$ED |
3 |
4 |
| abs,X |
$FD |
3 |
4+1 |
| abs,Y |
$F9 |
3 |
4+1 |
| (zp,X) |
$E1 |
2 |
6 |
| (zp),Y |
$F1 |
2 |
5+1 |
Increment / Decrement
| Mnemonic |
Hex |
Mode |
Bytes |
Cycles |
Flags |
| INC |
$E6 |
zp |
2 |
5 |
N Z |
| INC |
$F6 |
zp,X |
2 |
6 |
N Z |
| INC |
$EE |
abs |
3 |
6 |
N Z |
| INC |
$FE |
abs,X |
3 |
7 |
N Z |
| DEC |
$C6 |
zp |
2 |
5 |
N Z |
| DEC |
$D6 |
zp,X |
2 |
6 |
N Z |
| DEC |
$CE |
abs |
3 |
6 |
N Z |
| DEC |
$DE |
abs,X |
3 |
7 |
N Z |
| INX |
$E8 |
impl |
1 |
2 |
N Z |
| INY |
$C8 |
impl |
1 |
2 |
N Z |
| DEX |
$CA |
impl |
1 |
2 |
N Z |
| DEY |
$88 |
impl |
1 |
2 |
N Z |
Logical Operations N Z
AND
| Mode |
Hex |
Bytes |
Cycles |
| imm |
$29 |
2 |
2 |
| zp |
$25 |
2 |
3 |
| zp,X |
$35 |
2 |
4 |
| abs |
$2D |
3 |
4 |
| abs,X |
$3D |
3 |
4+1 |
| abs,Y |
$39 |
3 |
4+1 |
| (zp,X) |
$21 |
2 |
6 |
| (zp),Y |
$31 |
2 |
5+1 |
ORA
| Mode |
Hex |
Bytes |
Cycles |
| imm |
$09 |
2 |
2 |
| zp |
$05 |
2 |
3 |
| zp,X |
$15 |
2 |
4 |
| abs |
$0D |
3 |
4 |
| abs,X |
$1D |
3 |
4+1 |
| abs,Y |
$19 |
3 |
4+1 |
| (zp,X) |
$01 |
2 |
6 |
| (zp),Y |
$11 |
2 |
5+1 |
EOR
| Mode |
Hex |
Bytes |
Cycles |
| imm |
$49 |
2 |
2 |
| zp |
$45 |
2 |
3 |
| zp,X |
$55 |
2 |
4 |
| abs |
$4D |
3 |
4 |
| abs,X |
$5D |
3 |
4+1 |
| abs,Y |
$59 |
3 |
4+1 |
| (zp,X) |
$41 |
2 |
6 |
| (zp),Y |
$51 |
2 |
5+1 |
Shift & Rotate N Z C
| Mnemonic |
Hex |
Mode |
Bytes |
Cycles |
Operation |
| ASL |
$0A |
A |
1 |
2 |
Left shift, 0→bit0 |
| ASL |
$06 |
zp |
2 |
5 |
|
| ASL |
$16 |
zp,X |
2 |
6 |
|
| ASL |
$0E |
abs |
3 |
6 |
|
| ASL |
$1E |
abs,X |
3 |
7 |
|
| LSR |
$4A |
A |
1 |
2 |
Right shift, 0→bit7 |
| LSR |
$46 |
zp |
2 |
5 |
|
| LSR |
$56 |
zp,X |
2 |
6 |
|
| LSR |
$4E |
abs |
3 |
6 |
|
| LSR |
$5E |
abs,X |
3 |
7 |
|
| ROL |
$2A |
A |
1 |
2 |
Left rotate thru C |
| ROL |
$26 |
zp |
2 |
5 |
|
| ROL |
$36 |
zp,X |
2 |
6 |
|
| ROL |
$2E |
abs |
3 |
6 |
|
| ROL |
$3E |
abs,X |
3 |
7 |
|
| ROR |
$6A |
A |
1 |
2 |
Right rotate thru C |
| ROR |
$66 |
zp |
2 |
5 |
|
| ROR |
$76 |
zp,X |
2 |
6 |
|
| ROR |
$6E |
abs |
3 |
6 |
|
| ROR |
$7E |
abs,X |
3 |
7 |
|
Compare N Z C
CMP — Compare Accumulator
| Mode |
Hex |
Bytes |
Cycles |
| imm |
$C9 |
2 |
2 |
| zp |
$C5 |
2 |
3 |
| zp,X |
$D5 |
2 |
4 |
| abs |
$CD |
3 |
4 |
| abs,X |
$DD |
3 |
4+1 |
| abs,Y |
$D9 |
3 |
4+1 |
| (zp,X) |
$C1 |
2 |
6 |
| (zp),Y |
$D1 |
2 |
5+1 |
CPX — Compare X N Z C
| Mode |
Hex |
Bytes |
Cycles |
| imm |
$E0 |
2 |
2 |
| zp |
$E4 |
2 |
3 |
| abs |
$EC |
3 |
4 |
CPY — Compare Y N Z C
| Mode |
Hex |
Bytes |
Cycles |
| imm |
$C0 |
2 |
2 |
| zp |
$C4 |
2 |
3 |
| abs |
$CC |
3 |
4 |
BIT — Bit Test N V Z
| Mode |
Hex |
Bytes |
Cycles |
Notes |
| zp |
$24 |
2 |
3 |
N←bit7, V←bit6, Z←A AND mem |
| abs |
$2C |
3 |
4 |
|
Branch Instructions (2 bytes, rel offset, +1 cycle taken, +2 if page cross)
| Mnemonic |
Hex |
Condition |
| BCC |
$90 |
C = 0 (no carry) |
| BCS |
$B0 |
C = 1 (carry set) |
| BEQ |
$F0 |
Z = 1 (equal/zero) |
| BNE |
$D0 |
Z = 0 (not equal) |
| BMI |
$30 |
N = 1 (minus) |
| BPL |
$10 |
N = 0 (plus) |
| BVC |
$50 |
V = 0 (no overflow) |
| BVS |
$70 |
V = 1 (overflow) |
Branch offset range: -128 to +127 bytes from instruction after branch.
Jump & Subroutine
| Mnemonic |
Hex |
Mode |
Bytes |
Cycles |
Notes |
| JMP |
$4C |
abs |
3 |
3 |
Unconditional jump |
| JMP |
$6C |
ind |
3 |
5 |
Indirect; 6502 page bug! |
| JSR |
$20 |
abs |
3 |
6 |
Push PC-1, jump |
| RTS |
$60 |
impl |
1 |
6 |
Pull PC+1, return |
| RTI |
$40 |
impl |
1 |
6 |
Pull SR then PC (for IRQ/NMI) |
| BRK |
$00 |
impl |
1 |
7 |
Software IRQ; pushes PC+2 + SR |
6502 JMP indirect bug: JMP ($10FF) fetches low byte from $10FF, high byte from $1000 (not $1100). Never use indirect JMP across page boundary.
Flag Instructions
| Mnemonic |
Hex |
Bytes |
Cycles |
Effect |
| CLC |
$18 |
1 |
2 |
Clear carry |
| SEC |
$38 |
1 |
2 |
Set carry |
| CLD |
$D8 |
1 |
2 |
Clear decimal |
| SED |
$F8 |
1 |
2 |
Set decimal |
| CLI |
$58 |
1 |
2 |
Clear IRQ disable |
| SEI |
$78 |
1 |
2 |
Set IRQ disable |
| CLV |
$B8 |
1 |
2 |
Clear overflow |
No-Operation
| Mnemonic |
Hex |
Bytes |
Cycles |
Notes |
| NOP |
$EA |
1 |
2 |
Do nothing; timing |
Common Idioms & Patterns
16-bit Add
CLC
LDA low1
ADC low2
STA result_lo
LDA high1
ADC high2
STA result_hi
16-bit Subtract
SEC
LDA low1
SBC low2
STA result_lo
LDA high1
SBC high2
STA result_hi
Multiply by 2 (16-bit)
ASL low_byte
ROL high_byte
Test specific bit (bit 3)
LDA value
AND #%00001000
BEQ bit_was_clear
Set specific bit
LDA value
ORA #%00001000
STA value
Clear specific bit
LDA value
AND #%11110111
STA value
Toggle bit
LDA value
EOR #%00001000
STA value
Efficient loop (downward)
LDX #100
loop:
; ... body ...
DEX
BNE loop
Indirect indexed store (table write)
LDA #<table ; store table address
STA ptr
LDA #>table
STA ptr+1
LDY #offset
LDA value
STA (ptr),Y
Cycle Counting Notes
- 1 cycle = ~1.02 µs (PAL) or ~0.98 µs (NTSC)
- 1 scan line = 63 cycles (NTSC) / 63 cycles (PAL, slightly different)
- 1 frame = 262 lines NTSC / 312 lines PAL
- VIC-II steals cycles during sprite DMA and bad lines — account for this in cycle-critical raster code
- Bad lines occur when (raster & 7) = (YSCROLL & 7) — VIC takes 40 extra cycles