SPC-700 instruction set: Difference between revisions

From SNESdev Wiki
Jump to navigationJump to search
(→‎Instructions: second instruction group)
(→‎Instructions: group 3)
Line 320: Line 320:
| <tt>STY abs</tt>
| <tt>STY abs</tt>
| <tt>CC</tt>
| <tt>CC</tt>
| 3
| 5
| <tt>........</tt>
|
|-
| colspan=7 | 8-bit move register to register / special direct page moves
|-
| <tt>MOV A, X</tt>
| <tt>TXA</tt>
| <tt>7D</tt>
| 1
| 2
| <tt>N......Z</tt>
|
|-
| <tt>MOV A, Y</tt>
| <tt>TYA</tt>
| <tt>DD</tt>
| 1
| 2
| <tt>N......Z</tt>
|
|-
| <tt>MOV X, A</tt>
| <tt>TAX</tt>
| <tt>5D</tt>
| 1
| 2
| <tt>N......Z</tt>
|
|-
| <tt>MOV Y, A</tt>
| <tt>TAY</tt>
| <tt>FD</tt>
| 1
| 2
| <tt>N......Z</tt>
|
|-
| <tt>MOV X, SP</tt>
| <tt>TSX</tt>
| <tt>9D</tt>
| 1
| 2
| <tt>N......Z</tt>
|
|-
| <tt>MOV SP, X</tt>
| <tt>TXS</tt>
| <tt>BD</tt>
| 1
| 2
| <tt>........</tt>
|
|-
| <tt>MOV dp, dp</tt>
| <tt>?</tt>
| <tt>FA</tt>
| 3
| 5
| <tt>........</tt>
|
|-
| <tt>MOV dp, #imm</tt>
| <tt>?</tt>
| <tt>8F</tt>
| 3
| 3
| 5
| 5

Revision as of 04:45, 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 ........
8-bit move register to register / special direct page moves
MOV A, X TXA 7D 1 2 N......Z
MOV A, Y TYA DD 1 2 N......Z
MOV X, A TAX 5D 1 2 N......Z
MOV Y, A TAY FD 1 2 N......Z
MOV X, SP TSX 9D 1 2 N......Z
MOV SP, X TXS BD 1 2 ........
MOV dp, dp ? FA 3 5 ........
MOV dp, #imm ? 8F 3 5 ........
TODO

Links