SPC-700 instruction set: Difference between revisions

From SNESdev Wiki
Jump to navigationJump to search
(→‎Addressing Modes: fix the "indirect" description)
(→‎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>
| Loads from (P * $100) + X
|
|-
|-
| <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 is incremented after the read
| 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.

SPC-700 Instruction Set
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