# 6510 / 6502 Complete Opcode Reference > Source: The Machine Language Book for the C64; The Advanced Machine Language Book for the C64 Flags: **N**egative · o**V**erflow · **B**reak · **D**ecimal · **I**nterrupt · **Z**ero · **C**arry 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 ```asm CLC LDA low1 ADC low2 STA result_lo LDA high1 ADC high2 STA result_hi ``` ### 16-bit Subtract ```asm SEC LDA low1 SBC low2 STA result_lo LDA high1 SBC high2 STA result_hi ``` ### Multiply by 2 (16-bit) ```asm ASL low_byte ROL high_byte ``` ### Test specific bit (bit 3) ```asm LDA value AND #%00001000 BEQ bit_was_clear ``` ### Set specific bit ```asm LDA value ORA #%00001000 STA value ``` ### Clear specific bit ```asm LDA value AND #%11110111 STA value ``` ### Toggle bit ```asm LDA value EOR #%00001000 STA value ``` ### Efficient loop (downward) ```asm LDX #100 loop: ; ... body ... DEX BNE loop ``` ### Indirect indexed store (table write) ```asm LDA #