The current URL is datacrystal.tcrf.net.
User:HatZen08/draft
Introduction
This is a list of the opcodes used in the 65816 processor. It is used by the Super Nintendo System (SNES) console.
For the registers, the following convention will be used:
Convention Description A the low byte of the accumulator, always 8-bit B the high byte of the accumulator, always 8-bit C the low and high bytes of the accumulator, always 16-bit X the X register, 8-bit or 16-bit Y the Y register, 8-bit or 16-bit P the processor register, always 8-bit
For the opcode arguments, the following convention will be used:
Argument Example Relative to addr LDA $1234 memory address, short, 16-bit const LDA #$80 constant, 8-bit or 16-bit dp LDA $10 direct page, relative, 8-bit long LDA $C21234 memory address, long, 24-bit near BRA $1234 branch, relative, 8-bit sr LDA $01,S stack, relative, 8-bit
LDA, LDX, LDY
Reads a value from the memory and stores it in the specified register. LDA will store in the A or C register, LDX will store in the X register and LDY will store in the Y register.
flags n highest bit of value loaded. z set if data loaded is zero.
Opcode Syntax Bytes Notes A9 LDA const 2 One extra byte if in 16-bit mode AD LDA addr 3 AF LDA long 4 A5 LDA dp 2 B2 LDA (dp) 2 A7 LDA [dp] 2 BD LDA addr,X 3 BF LDA long,X 4 B9 LDA addr,Y 3 B5 LDA dp,X 2 A1 LDA (dp,X) 2 B1 LDA (dp),Y 2 B7 LDA [dp],Y 2 A3 LDA sr,S 2 B3 LDA (sr,S),Y 2
Opcode Syntax Bytes Notes A2 LDX const 2 One extra byte if in 16-bit mode AE LDX addr 3 A6 LDX dp 2 BE LDX addr,Y 3 B6 LDX dp,Y 2
Opcode Syntax Bytes Notes A0 LDY const 2 One extra byte if in 16-bit mode AC LDY addr 3 A4 LDY dp 2 BC LDY addr,X 3 B4 LDY dp,X 2
STA, STX, STY
Reads a value from the specified register and stores it in the memory. STA will read the A or C register, STX will read the X register and STY will read the Y register. All opcodes will store the retrieved value in the specified address.
The STZ opcode will always store the value of zero in the designed memory address. Unlike the STA, STX and STY opcodes, the STZ opcode doesn't affect flags. It also doesn't affect the A or C register.
flags ?? Opcode Syntax Bytes Notes 8D STA addr 3 8F STA long 4 85 STA dp 2 92 STA (dp) 2 87 STA [dp] 2 9D STA addr,X 3 9F STA long,X 4 99 STA addr,Y 3 95 STA dp,X 2 81 STA (dp,X) 2 91 STA (dp),Y 2 97 STA [dp],Y 2 83 STA sr,S 2 93 STA (sr,S),Y 2
Opcode Syntax Bytes Notes 8E STX addr 3 86 STX dp 2 96 STX dp,Y 2
Opcode Syntax Bytes Notes 8C STY addr 3 84 STY dp 2 94 STY dp,X 2
Opcode Syntax Bytes Notes 9C STZ addr 3 64 STZ dp 2 9E STZ addr,X 3 74 STZ dp,X 2
TRB, TSB
Test all bits in the A or C register. For all bits set in the A or C register, the correspondent bits will be set or unset in the designed memory address. TSB will set the correspondent bits and TRB will reset the correspondent bits. All clear bits in the A or C register will be ignored and their correspondent bits in the designed address will not be altered.
flags ??
Opcode Syntax Bytes Notes 1C TRB addr 3 14 TRB dp 2
Opcode Syntax Bytes Notes 0C TSB addr 3 04 TSB dp 2
ADC, SBC
Add or subtract the value in the A or C register with the value in the designed memory address. ADC will add the value and SBC will subtract the value.
When the carry flag is set, a value of one will be added in the addition or subtraction operation.
The operation can overflow or underflow. It is the coder responsibility to check these cases and adjust the resulting value. A common method is to check the carry flag for overflow or underflow and cap the value to a prefixed setting.
flags: n set if highest bit of result was set v set if signed overflow? z set if result is zero c set if overflow or underflow
Opcode Syntax Bytes Notes 61 ADC (dp,X) 2 63 ADC sr,S 2 65 ADC dp 2 67 ADC [dp] 2 69 ADC const 2 One extra byte if in 16-bit mode 6D ADC addr 3 6F ADC long 4 71 ADC (dp),Y 2 72 ADC (dp) 2 73 ADC (sr,S),Y 2 75 ADC dp,X 2 77 ADC [dp],Y 2 79 ADC addr,Y 3 7D ADC addr,X 3 7F ADC long,X 4
Opcode Syntax Bytes Notes E9 SBC const 2 One extra byte if in 16-bit mode ED SBC addr 3 EF SBC long 4 E5 SBC dp 2 F2 SBC (dp) 2 E7 SBC [dp] 2 FD SBC addr,X 3 FF SBC long,X 4 F9 SBC addr,Y 3 F5 SBC dp,X 2 E1 SBC (dp,X) 2 F1 SBC (dp),Y 2 F7 SBC [dp],Y 2 E3 SBC sr,S 2 F3 SBC (sr,S),Y 2
INC, INX, INY, DEC, DEX, DEY
Increment or decrement the specified register by one. It is equivalent to the ADC or SBC opcodes with the value of one without the carry flag set.
INC will increment the A or C register. INX will increment the X register. INY will increment the Y register. DEC will decrement the A or C register. DEX will decrement the X register. DEY will decrement the Y register. The operation can underflow or overflow.
flags: n set if most significant bit of result is set. z set if result is zero.
Opcode Syntax Bytes Notes 1A INC 1 increment the A register EE INC addr 3 E6 INC dp 2 FE INC addr,X 3 F6 INC dp,X 2 E8 INX 1 increment the X register C8 INY 1 increment the Y register
Opcode Syntax Bytes Notes 3A DEC 1 decrement register A CE DEC addr 3 C6 DEC dp 2 DE DEC addr,X 3 D6 DEC dp,X 2 CA DEX 1 decrement register X 88 DEY 1 decrement register Y
AND, ORA, EOR
A binary operation is done between the register A or C and the memory. The AND opcode will do a binary AND, the ORA opcode will do a binary OR and the EOR opcode will do a binary XOR. The result will be stored in the A or C register.
Flags: n set if highest bit is set z set if result is zero
Opcode Syntax Bytes Notes 21 AND (dp,X) 2 23 AND sr,S 2 25 AND dp 2 27 AND [dp] 2 29 AND const 2 One extra bit if in 16-bit mode 2D AND addr 3 2F AND long 4 31 AND (dp),Y 2 32 AND (dp) 2 33 AND (sr,S),Y 2 35 AND dp,X 2 37 AND [dp],Y 2 39 AND addr,Y 3 3D AND addr,X 3 3F AND long,X 4
Opcode Syntax Bytes Notes 09 ORA const 2 One extra byte if in 16-bit mode 0D ORA addr 3 0F ORA long 4 05 ORA dp 2 12 ORA (dp) 2 07 ORA [dp] 2 1D ORA addr,X 3 1F ORA long,X 4 19 ORA addr,Y 3 15 ORA dp,X 2 01 ORA (dp,X) 2 11 ORA (dp),Y 2 17 ORA [dp],Y 2 03 ORA sr,S 2 13 ORA (sr,S),Y 2
Opcode Syntax Bytes Notes 49 EOR const 2 One extra byte if in 16-bit mode 4D EOR addr 3 4F EOR long 4 45 EOR dp 2 52 EOR (dp) 2 47 EOR [dp] 2 5D EOR addr,X 3 5F EOR long,X 4 59 EOR addr,Y 3 55 EOR dp,X 2 41 EOR (dp,X) 2 51 EOR (dp),Y 2 57 EOR [dp],Y 2 43 EOR sr,S 2 53 EOR (sr,S),Y 2
BIT
Does a binary AND between the A or C register and the memory. Unlike the AND opcode, the binary AND operation only is done for the bits sets in the A or C register. All clear bits in the A or C register will be left clear after the operation.
flags: n Takes value of most significant bit of memory data. v Takes value from bit 6 or 14 of memory data. z Set if logical AND of mem and acc is zero.
Opcode Syntax Bytes Notes 89 BIT const 2 Add one extra bit if in 16-bit mode 2C BIT addr 3 24 BIT dp 2 3C BIT addr,X 3 34 BIT dp,X 2
CMP, CPX, CPY
Compare the designed register with the memory and sets flags based on the comparison. CMP will compare the A or C register, CPX will compare the X register and CPY will compare the Y register. Generally, a conditional branch opcode, based on a flag status, is used after these opcodes.
flags: n set if most significant bit of result is set z set if result is zero c set if register is equal or greater than memory Opcode Syntax Bytes Notes C9 CMP const 2 One extra byte if in 16-bit mode CD CMP addr 3 CF CMP long 4 C5 CMP dp 2 D2 CMP (dp) 2 C7 CMP [dp] 2 DD CMP addr,X 3 DF CMP long,X 2 D9 CMP addr,Y 3 D5 CMP dp,X 2 C1 CMP (dp,X) 2 D1 CMP (dp),Y 2 D7 CMP [dp],Y 2 C3 CMP sr,S 2 D3 CMP (sr,S),Y 2
Opcode Syntax Bytes Notes E0 CPX const 2 One extra byte if in 16-bit mode EC CPX addr 3 E4 CPX dp 2 Opcode Syntax Bytes Notes C0 CPY const 2 One extra byte if in 16-bit mode CC CPY addr 3 C4 CPY dp 2
LSR, ASL
Shift bits in the designed register or memory address left or right. The LSR opcode will shift the bits right and the ASL opcode will shift the bits left.
LSR is equivalent to divide the number by two and ASL is equivalent to multiply the number by two. The operation can underflow or overflow. The bit shifted out will become the new carry. The bit shifted in is zero.
flags: LSR n cleared. z set if result is zero. c bit zero becomes new carry.
flags: ASL n set if most significant bit of result is set. z set if result is zero. c set if highest bit is moved into carry
Opcode Syntax Bytes Notes 4A LSR 1 shift A register 4E LSR addr 3 46 LSR dp 2 5E LSR addr,X 3 56 LSR dp,X 2
Opcode Syntax Bytes Notes 06 ASL dp 2 0A ASL 1 The operand is the register A 0E ASL addr 3 16 ASL dp,X 2 1E ASL addr,X 3
ROL, ROR
Shift bits in the designed register or memory address left or right. The ROL opcode will shift the bits left and the ROR opcode will shift the bits right.
The bit shifted in is the old carry. The bit shifted out will be the new carry.
flags: ROL n set if most significant bit of result is set. z set if result is zero. c the high bit (7 or 15) becomes the new carry.
flags: ROR n set if most significant bit of result is set. z set if result is zero. c low bit becomes the new carry.
Opcode Syntax Bytes Notes 2A ROL 1 affects register A 2E ROL addr 3 26 ROL dp 2 3E ROL addr,X 3 36 ROL dp,X 2
Opcode Syntax Bytes Notes 6A ROR 1 affects A register 6E ROR addr 3 66 ROR dp 2 7E ROR addr,X 3 76 ROR dp,X 2
BPL, BMI, BRA, BCC, BCS, BNE, BEQ, BVC, BVS, BRL
Change the execution flow based on a conditional branch. If the condition is meet, the execution flow will be changed for the designed address. Otherwise, it continues normally.
The majority of the conditional branches are based in flag status. The flags were setup by anterior opcodes.
flags: none
Opcode Syntax Bytes Notes 10 BPL near 2 BPL - branch if minus flag is clear, branch if plus 30 BMI near 2 BMI - branch if minus flag set, branch if minus 80 BRA near 2 BRA - always branch 90 BCC near 2 BCC - branch if carry flag clear B0 BCS near 2 BCS - branch if carry flag set D0 BNE near 2 BNE - branch if zero flag clear, branch if not equal F0 BEQ near 2 BEQ - branch if zero flag set, branch if equal 50 BVC near 2 BVC - branch if overflow clear 70 BVS near 2 BVS - branch if overflow set 82 BRL addr 3 similar to BRA, but with longer range
JMP
Change the execution flow to the designed address.
flags: none
Opcode Syntax Bytes Notes 4C JMP addr 3 6C JMP (addr) 3 7C JMP (addr,X) 3 5C JMP long 4 DC JMP [addr] 3
JSR, JSL
Calls a sub routine which will be executed.
The JSR opcode will put two bytes in the stack, relative to the return address. It is expected that they will be retrieved by an RTS opcode in the sub routine.
The JSL opcode will put three bytes in the stack, relative to the return address. It is expected that they will be retrieved by an RTL opcode in the sub routine.
Opcode Syntax Bytes Notes 22 JSL long 4 20 JSR addr 3 FC JSR (addr,X) 3
RTS, RTL
RTS will pull two bytes from the stack and RTL will pull three bytes from the stack. They will be setup as the new control flow address.
It is expected that the bytes in the stack were pushed from a JSR opcode for the RTS opcode and from a JSL opcode for the RTL opcode.
flags: none
Opcode Syntax Bytes Notes 6B RTL 1 pull three bytes from the stack as the return address 60 RTS 1 pull two bytes from the stack as the return address
CLC, CLD, CLI, CLV, SEC, SED, SEI
Set or reset flags.
Opcode Syntax Bytes Notes 18 CLC 1 clear carry flag D8 CLD 1 clear decimal flag 58 CLI 1 clear interrupt flag B8 CLV 1 clear overflow flag 38 SEC 1 set carry flag F8 SED 1 set decimal flag 78 SEI 1 set interrupt flag
TAX, TAY, TXA, TYA, TSX, TXS, TXY, TYX, TCD, TDC, TCS, TSC
Transfer bytes between the specified registers or special addresses.
If the setting of the registers have different settings of 8-bit or 16-bit, the copy of B can be truncated based on the opcode behavior. It is possible that a leftover value of B will be left untouched in the B register.
flags: all except TCS n set if most significant bit of transfer value is set. z set if transferred value is zero.
Opcode Syntax Bytes Notes AA TAX 1 from A or C to X register A8 TAY 1 from A or C to Y register 8A TXA 1 from X register to A or C 98 TYA 1 from Y register to A or C BA TSX 1 from stack pointer to X register 9A TXS 1 from X register to stack pointer 9B TXY 1 from X register to Y register BB TYX 1 from Y register to X register 5B TCD 1 from C to direct page 7B TDC 1 from direct page to C 1B TCS 1 from C to stack pointer 3B TSC 1 from stack pointer to C
MVP, MVN
Move a block of bytes from a specified address to another address. The X register will be the start address to copy from. The Y register will be start address to copy to. The C register will be the number of bytes to copy minus one.
The opcode arguments are the source bank and the destination bank, in this order.
MVP must be used if the Y register is greater than the X register. Otherwise, MVN must be used instead.
Opcode Syntax Bytes Notes 54 MVN src,dest 3 44 MVP src,dest 3
PEA, PEI, PER
Push bytes in the stack, based on the opcodes arguments. They always work in 16-bit mode.
Opcode Syntax Bytes Notes F4 PEA const 3 the argument is always 16-bit D4 PEI (dp) 2 62 PER label 3
PHA, PHP, PHX, PHY, PHB, PHD, PHK, PLA, PLP, PLX, PLY, PLB, PLD
Push or pull bytes from the stack. The setting of the register or special address as 8-bit or 16-bit will set the number of bytes pushed/pulled from the stack.
flags: PHA/PHP/PHX/PHY/PHB/PHD/PHK none
flags: PLA/PLX/PLY/PLB/PLD n set if most significant bit of result is set. z set if result is zero.
Opcode Syntax Bytes Notes 48 PHA 1 push A or C register 08 PHP 1 push flag register (8-bit) DA PHX 1 push X register (8-bit or 16-bit) 5A PHY 1 push Y register (8-bit or 16-bit) 8B PHB 1 push data bank register (8-bit) 0B PHD 1 push direct page register (16-bit) 4B PHK 1 push program bank register (8-bit)
Opcode Syntax Bytes Notes 68 PLA 1 pull A or C register 28 PLP 1 pull flag register (8-bit)(sets all flags) FA PLX 1 pull X register (8-bit or 16-bit) 7A PLY 1 pull Y register (8-bit or 16-bit) AB PLB 1 pull pull data bank register (8-bit) 2B PLD 1 pull direct page register (16-bit)
NOP
Does absolutely nothing. It is mostly used to waste cycles. A few special registers or addresses can't be fetch until a minimum number of cycles has passed.
If the coder needs to erase a code segment, a conditional branch or jump is recommended instead of a long line of NOP opcodes.
Opcode Syntax Bytes Notes EA NOP 1
REP, SEP
Setups the processor flags with the opcode arguments. For each bit set in the argument, the correspondent flag is set or reset. REP will reset the flags and SEP will set the flags.
arguments: #$01 carry flag #$02 zero flag #$04 irq flag? #$08 decimal mode #$10 X and Y register: 0 = 16-bit, 1 = 8-bit #$20 accumulator: 0 = 16-bit, 1 = 8-bit #$40 overflow flag #$80 negative flag
flags: all
Opcode Syntax Bytes Notes C2 REP const 2 const is always 8-bit E2 SEP const 2 const is always 8-bit
XBA
Exchanges the A and B registers.
flags: n Set if the most significant bit of the new value in the low order 8 bits (A) of the accumulator is set. (former bit 15) z Set if new value of the lower order 8 bit accumulator (A) is zero.
Opcode Syntax Bytes Notes EB XBA 1
XCE
Exchanges the carry flag and the emulation flag.
flags: e from previous carry flag. c from previous emulation flag. m native mode flag only. switching to native 65816 mode sets to one. x x is a native mode flag only. b brk is an emulation 6502 flag only. it is set to 1 to become the x flag in native mode
Opcode Syntax Bytes Notes FB XCE 1
Miscellaneous
Opcode Syntax Bytes Notes 00 BRK ?? software break 02 COP const ?? coprocessor empowerment 40 RTI 1 return from interrupt DB STP 1 stop processor CB WAI 1 wait for interrupt