SPC-700 instruction set: Difference between revisions
From SNESdev Wiki
Jump to navigationJump to search
Rainwarrior (talk | contribs) (→Addressing Modes: fix the "indirect" description) |
Rainwarrior (talk | contribs) (→Instructions: second instruction group) |
||
Line 56: | Line 56: | ||
! Notes | ! Notes | ||
|- | |- | ||
| colspan=7 | 8-bit move to register | | colspan=7 | 8-bit move memory to register | ||
|- | |- | ||
| <tt>MOV A, #imm</tt> | | <tt>MOV A, #imm</tt> | ||
Line 72: | Line 72: | ||
| 3 | | 3 | ||
| <tt>N......Z</tt> | | <tt>N......Z</tt> | ||
| | | | ||
|- | |- | ||
| <tt>MOV A, (X)+</tt> | | <tt>MOV A, (X)+</tt> | ||
Line 80: | Line 80: | ||
| 4 | | 4 | ||
| <tt>N......Z</tt> | | <tt>N......Z</tt> | ||
| X | | X++ after read | ||
|- | |- | ||
| <tt>MOV A, dp</tt> | | <tt>MOV A, dp</tt> | ||
Line 203: | Line 203: | ||
| | | | ||
|- | |- | ||
| colspan=7 | 8-bit move to memory | | colspan=7 | 8-bit move register to memory | ||
|- | |||
| <tt>MOV (X), A</tt> | |||
| <tt>?</tt> | |||
| <tt>C6</tt> | |||
| 1 | |||
| 4 | |||
| <tt>........</tt> | |||
| | |||
|- | |||
| <tt>MOV (X)+, A</tt> | |||
| <tt>?</tt> | |||
| <tt>AF</tt> | |||
| 1 | |||
| 4 | |||
| <tt>........</tt> | |||
| X++ after read | |||
|- | |||
| <tt>MOV dp, A</tt> | |||
| <tt>STA zp</tt> | |||
| <tt>C4</tt> | |||
| 2 | |||
| 4 | |||
| <tt>........</tt> | |||
| | |||
|- | |||
| <tt>MOV dp+X, A</tt> | |||
| <tt>STA zp, X</tt> | |||
| <tt>D4</tt> | |||
| 2 | |||
| 5 | |||
| <tt>........</tt> | |||
| | |||
|- | |||
| <tt>MOV !abs, A</tt> | |||
| <tt>STA abs</tt> | |||
| <tt>C5</tt> | |||
| 3 | |||
| 5 | |||
| <tt>........</tt> | |||
| | |||
|- | |||
| <tt>MOV !abs+X, A</tt> | |||
| <tt>STA abs, X</tt> | |||
| <tt>D5</tt> | |||
| 3 | |||
| 6 | |||
| <tt>........</tt> | |||
| | |||
|- | |||
| <tt>MOV !abs+Y, A</tt> | |||
| <tt>STA abs, Y</tt> | |||
| <tt>D6</tt> | |||
| 3 | |||
| 6 | |||
| <tt>........</tt> | |||
| | |||
|- | |||
| <tt>MOV [dp+X], A</tt> | |||
| <tt>STA (zp, X)</tt> | |||
| <tt>C7</tt> | |||
| 2 | |||
| 7 | |||
| <tt>........</tt> | |||
| | |||
|- | |||
| <tt>MOV [dp]+Y, A</tt> | |||
| <tt>STA (zp), Y</tt> | |||
| <tt>D7</tt> | |||
| 2 | |||
| 7 | |||
| <tt>........</tt> | |||
| | |||
|- | |||
| <tt>MOV dp, X</tt> | |||
| <tt>STX zp</tt> | |||
| <tt>D8</tt> | |||
| 2 | |||
| 4 | |||
| <tt>........</tt> | |||
| | |||
|- | |||
| <tt>MOV dp+Y, X</tt> | |||
| <tt>STX zp, Y</tt> | |||
| <tt>D9</tt> | |||
| 2 | |||
| 5 | |||
| <tt>........</tt> | |||
| | |||
|- | |||
| <tt>MOV !abs, X</tt> | |||
| <tt>STX abs</tt> | |||
| <tt>C9</tt> | |||
| 3 | |||
| 5 | |||
| <tt>........</tt> | |||
| | |||
|- | |||
| <tt>MOV dp, Y</tt> | |||
| <tt>STY zp</tt> | |||
| <tt>CB</tt> | |||
| 2 | |||
| 4 | |||
| <tt>........</tt> | |||
| | |||
|- | |||
| <tt>MOV dp+X, Y</tt> | |||
| <tt>STY zp, X</tt> | |||
| <tt>DB</tt> | |||
| 2 | |||
| 5 | |||
| <tt>........</tt> | |||
| | |||
|- | |||
| <tt>MOV !abs, Y</tt> | |||
| <tt>STY abs</tt> | |||
| <tt>CC</tt> | |||
| 3 | |||
| 5 | |||
| <tt>........</tt> | |||
| | |||
|- | |- | ||
| colspan=7 | TODO | | colspan=7 | TODO |
Revision as of 04:36, 7 October 2022
The Sony SPC-700 CPU is part of the S-SMP sound processor of the SNES. It runs at 2.048 MHz, and behaves similarly to a 6502 at 1.024 MHz with some extensions.
Architecture
The SPC-700 has a 16-bit address space, and a similar set of registers to the 6502.
Registers
- A - 8-bit accumulator
- X - 8-bit index
- Y - 8-bit index
- YA - 16-bit pair of A (lsb) and Y (msb).
- PC - program counter
- SP - stack pointer
- PSW - program status word: NVPBHIZC
- N - negative flag (high bit of result was set)
- V - overflow flag (signed overflow indication)
- P - direct page flag (moves the direct page to $0100 if set)
- H - half carry flag (carry between low and high nibble)
- I - interrupt disable (unused: the S-SMP has no attached interrupts)
- Z - zero flag (set if last result was zero)
- C - carry flag
Differences from the 6502:
- A 16-bit combined YA register is available for some operations.
- The direct page can be moved to $0100. (Rarely used.)
- A half carry flag that is useful for nibble operations.
- No decimal mode.
Addressing Modes
- imm - 8-bit immediate value
- dp - 8-bit direct page offset ($0000+dp or $01000+dp)
- !abs - 16-bit absolute address
- rel - relative offset in two's complement
- (i) - direct-page relative index (P * $100 + i)
- (i)+ - direct-page relative index with post-increment (i is incremented after read)
- [addr]+i - indirect indexed (add index after lookup)
- [addr+i] - indexed indirect (add index before lookup)
Instructions
Official instruction names and syntax for SPC-700 instruction were provided by Sony. However, because of its architectural similarity to 6502, some prefer to rename and remap them using a 6502 style syntax. Both are provided here.
Cycles in this table are 1.024 MHz CPU cycles. Each one is equal to 2 clocks of the 2.048 Mhz S-SMP.
Instruction | 6502-Style | Opcode | Bytes | Cycles | Flags | Notes |
---|---|---|---|---|---|---|
8-bit move memory to register | ||||||
MOV A, #imm | LDA #imm | E8 | 2 | 2 | N......Z | |
MOV A, (X) | ? | E6 | 1 | 3 | N......Z | |
MOV A, (X)+ | ? | BF | 1 | 4 | N......Z | X++ after read |
MOV A, dp | LDA zp | E4 | 2 | 3 | N......Z | |
MOV A, dp+X | LDA zp, X | F4 | 2 | 4 | N......Z | |
MOV A, !abs | LDA abs | E5 | 3 | 4 | N......Z | |
MOV A, !abs+X | LDA abs, X | F5 | 3 | 5 | N......Z | |
MOV A, !abs+Y | LDA abs, Y | F6 | 3 | 5 | N......Z | |
MOV A, [dp+X] | LDA (zp, X) | E7 | 2 | 6 | N......Z | |
MOV A, [dp]+Y | LDA (dp), Y | F7 | 2 | 6 | N......Z | |
MOV X, #imm | LDX #imm | CD | 2 | 2 | N......Z | |
MOV X, dp | LDX zp | F8 | 2 | 3 | N......Z | |
MOV X, dp+Y | LDX zp, Y | F9 | 2 | 4 | N......Z | |
MOV X, !abs | LDX abs | E9 | 3 | 4 | N......Z | |
MOV Y, #imm | LDY #imm | 8D | 2 | 2 | N......Z | |
MOV Y, dp | LDY zp | EB | 2 | 3 | N......Z | |
MOV Y, dp+X | LDY zp, X | FB | 2 | 4 | N......Z | |
MOV Y, !abs | LDY abs | EC | 3 | 4 | N......Z | |
8-bit move register to memory | ||||||
MOV (X), A | ? | C6 | 1 | 4 | ........ | |
MOV (X)+, A | ? | AF | 1 | 4 | ........ | X++ after read |
MOV dp, A | STA zp | C4 | 2 | 4 | ........ | |
MOV dp+X, A | STA zp, X | D4 | 2 | 5 | ........ | |
MOV !abs, A | STA abs | C5 | 3 | 5 | ........ | |
MOV !abs+X, A | STA abs, X | D5 | 3 | 6 | ........ | |
MOV !abs+Y, A | STA abs, Y | D6 | 3 | 6 | ........ | |
MOV [dp+X], A | STA (zp, X) | C7 | 2 | 7 | ........ | |
MOV [dp]+Y, A | STA (zp), Y | D7 | 2 | 7 | ........ | |
MOV dp, X | STX zp | D8 | 2 | 4 | ........ | |
MOV dp+Y, X | STX zp, Y | D9 | 2 | 5 | ........ | |
MOV !abs, X | STX abs | C9 | 3 | 5 | ........ | |
MOV dp, Y | STY zp | CB | 2 | 4 | ........ | |
MOV dp+X, Y | STY zp, X | DB | 2 | 5 | ........ | |
MOV !abs, Y | STY abs | CC | 3 | 5 | ........ | |
TODO |
Links
- SPC700 Reference - CPU Instruction Set at superfamicom.org wiki