SNES Development
SA-1 Registers

SA-1 Write Registers

RegisterAddressNameNotes
SA-1 CPU Control$2200CCNT
Super Nintendo CPU INT Enable$2201SIE
Super Nintendo CPU INT Clear$2202SIC
SA-1 CPU Reset Vector$2203CRVL\ Bits 0-7
SA-1 CPU Reset Vector$2204CRVH/ Bits 8-15
SA-1 CPU NMI Vector$2205CNVL\ Bits 0-7
SA-1 CPU NMI Vector$2206CNVH/ Bits 8-15
SA-1 CPU IRQ Vector$2207CIVL\ Bits 0-7
SA-1 CPU IRQ Vector$2208CIVH/ Bits 8-15
Super Nintendo CPU Control$2209SCNT
SA-1 CPU INT Enable$220ACIE
SA-1 CPU INT Clear$220BCIC
Super Nintendo CPU NMI Vector$220CSNVL\ Bits 0-7
Super Nintendo CPU NMI Vector$220DSNVH/ Bits 8-15
Super Nintendo CPU IRQ Vector$220ESIVL\ Bits 0-7
Super Nintendo CPU IRQ Vector$220FSIVH/ Bits 8-15
H/V Timer Control$2210TMC
SA-1 CPU Timer Restart$2211CTR
Set H-Count$2212HCNTL\ Bits 0-7
Set H-Count$2213HCNTH/ Bits 8-15 (Only Bit 8 used)
Set V-Count$2214VCNTL\ Bits 0-7
Set V-Count$2215VCNTH/ Bits 8-15 (Only Bit 8 used)
Set Super MMC Bank C$2220CXB
Set Super MMC Bank D$2221DXB
Set Super MMC Bank E$2222EXB
Set Super MMC Bank F$2223FXB
Super Nintendo CPU BW-RAM Address Mapping$2224BMAPS
SA-1 CPU BW-RAM Address Mapping$2225BMAP
Super Nintendo CPU BW-RAM Write Enable$2226SBWE
SA-1 CPU BW-RAM Write Enable$2227CBWE
BW-RAM Write-Protected Area$2228BWPA
SA-1 I-RAM Write Protection$2229SIWP\ S-CPU Controlled
SA-1 I-RAM Write Protection$222ACIWP/ SA-1 Controlled
DMA Control$2230DCNT
Character Conversion DMA Parameters$2231CDMA
DMA Source Device Start Address$2232SDAL\ Bits 0-7
DMA Source Device Start Address$2233SDAH! Bits 8-15
DMA Source Device Start Address$2234SDAB/ Bits 16-23
DMA Destination Start Address$2235DDAL\ Bits 0-7
DMA Destination Start Address$2236DDAH! Bits 8-15
DMA Destination Start Address$2237DDAB/ Bits 16-23
DMA Terminal Counter$2238DTCL\ Bits 0-7
DMA Terminal Counter$2239DTCH/ Bits 8-15
BW-RAM BIT MAP Format$223FBBF
BIT MAP Register File$2240BRF0\ File 0
BIT MAP Register File$2241BRF1! File 1
BIT MAP Register File$2242BRF2! File 2
BIT MAP Register File$2243BRF3! File 3
BIT MAP Register File$2244BRF4! File 4
BIT MAP Register File$2245BRF5! File 5
BIT MAP Register File$2246BRF6! File 6
BIT MAP Register File$2247BRF7! File 7
BIT MAP Register File$2248BRF8! File 8
BIT MAP Register File$2249BRF9! File 9
BIT MAP Register File$224ABRFA! File A
BIT MAP Register File$224BBRFB! File B
BIT MAP Register File$224CBRFC! File C
BIT MAP Register File$224DBRFD! File D
BIT MAP Register File$224EBRFE! File E
BIT MAP Register File$224FBRFF/ File F
Arithmetic Control$2250MCNT
Arithmetic Parameters: Multiplicand / Dividend$2251MAL\ Bits 0-7
Arithmetic Parameters: Multiplicand / Dividend$2252MAH/ Bits 8-15
Arithmetic Parameters: Multiplier / Divisor$2253MBL\ Bits 0-7
Arithmetic Parameters: Multiplier / Divisor$2254MBH/ Bits 8-15
Variable-Length BIT Processing$2258VBD
Variable-Length BIT Game Pack ROM Start Address$2259VDAL\ Bits 0-7
Variable-Length BIT Game Pack ROM Start Address$225AVDAH! Bits 8-15
Variable-Length BIT Game Pack ROM Start Address$225BVDAB/ Bits 16-23

SA-1 Read Registers

RegisterAddressNameNotes
Super Nintendo CPU Flag Read$2300SFR
SA-1 CPU Flag Read$2301CFR
H-Count Read$2302HCRL
H-Count Read$2303HCRH
V-Count Read$2304VCRL
V-Count Read$2305VCRH
Arithmetic Result Product / Quotient / Accumulative Sum$2306MR1\ Bits 0-7
Arithmetic Result Product / Quotient / Accumulative Sum$2307MR2! Bits 8-15
Arithmetic Result Product / Quotient / Accumulative Sum$2308MR3! Bits 16-23
Arithmetic Result Product / Quotient / Accumulative Sum$2309MR4! Bits 24-31
Arithmetic Result Product / Quotient / Accumulative Sum$230AMR5/ Bits 32-39
Arithmetic Overflow Flag$230BOF
Variable-Length Data Read Port$230CVDPL\ Bits 0-7
Variable-Length Data Read Port$230DVDPH/ Bits 8-15
Version Code Register$230EVC

SA-1 Register Explanations

Register format(#$xx, write, read) xx = initial value (or xx for not specified)

W = SA-1 write
w = SNES write
X = Both
x = Neither

R = SA-1 Read
r = SNES Read
X = Both
x = Neither

SA-1 Write Registers

SA-1 CPU Control

$2200 (#$20, w, x)
        IRrNmmmm
        I = SA-1 IRQ
            0 = No Interrupt
            1 = Interrupt
        R = SA-1 Ready
            0 = Ready
            1 = Wait
        r = SA-1 reset
            0 = Cancel
            1 = Reset
        N = SA-1 NMI
            0 = No Interrupt
            1 = Interrupt
        mmmm = Messages from SNES CPU

Super Nintendo CPU INT Enable

$2201 (#$00, w, x)
        I-C----
        I = Enable/Disable IRQ from SA-1
            0 = Disable
            1 = Enable
        C = Enable/Disable character conversion DMA IRQ
            0 = Disable
            1 = Enable

Super Nintendo CPU INT Clear

$2202 (#$00, w, x)
        I-C----
        I = clear IRQ from SA-1
            0 = No change
            1 = Change
        C = clear character conversion DMA IRQ
            0 = No change
            1 = Clear

SA-1 CPU Reset Vector

$2203
$2204 (#$xxxx, w, x)
        aaaaaaaa aaaaaaaa
        a = SA-1 reset vector address(in bank $00)

SA-1 CPU NMI Vector

$2205
$2206 (#$xxxx, w, x)
        aaaaaaaa aaaaaaaa
        a = SA-1 NMI vector address(in bank $00)

SA-1 CPU IRQ Vector

$2207
$2208 (#$xxxx, w, x)
        aaaaaaaa aaaaaaaa
        a = SA-1 IRQ vector address(in bank $00)

Super Nintendo CPU Control

$2209 (#$00, W, x)
        IS-Nmmmm
        I = SNES IRQ
            0 = No interrupt
            1 = Interrupt
        S = IRQ vector select
            0 = ROM
            1 = SNES IRQ register($220E)
        N = NMI vector select
            0 = ROM
            1 = SNES NMI register($220C)
        mmmm = Message from SA-1

SA-1 CPU INT Enable

$220A (#$00, W, x)
        ITDN----
        I = Switch IRQ control from SNES to SA-1
            0 = Disable
            1 = Enable
        T = Switch IRQ control from timer to SA-1
            0 = Disable
            1 = Enable
        D = Switch IRQ control to SA-1 after SA-1 DMA
            0 = Disable
            1 = Enable
        N = Switch NMI control from SNES to SA-1
            0 = Disable
            1 = Enable

SA-1 CPU INT Clear

$220B (#$00, W, x)
    ITDN----
        I = Switch IRQ clear from SNES to SA-1
            0 = Disable
            1 = Enable
        T = Switch IRQ clear from timer to SA-1
            0 = Disable
            1 = Enable
        D = Switch IRQ clear to SA-1 after SA-1 DMA
            0 = Disable
            1 = Enable
        N = Switch NMI clear from SNES to SA-1
            0 = Disable
            1 = Enable

Super Nintendo CPU NMI Vector

$220C
$220D (#$xxxx, w, x)
        aaaaaaaa aaaaaaaa
        a = SNES NMI vector address(in bank $00)

Super Nintendo CPU IRQ Vector

$220E
$220F (#$xxxx, w, x)
        aaaaaaaa aaaaaaaa
        a = SNES IRQ vector address(in bank $00)

H/V Timer Control

$2210 (#$00, W, x)
        T-----VH
        T = Timer type
            0 = HV Timer
            1 = Linear timer
        V = Vertical count enable
            0 = Disable
            1 = Enable
        H = Horizontal count enable
            0 = Disable
            1 = Enable

SA-1 CPU Timer Restart

$2211 (#$xx, W, x)
        --------
        Simply writing to this register restarts the timer to zero.

Set H-Count

$2212 (#$xxxx, W, x)
$2213
        HHHHHHHH -------H
        In HV mode values are 0 to 340
        In linear mode values are 0 to 511(lower 9 bits)

Set V-Count

$2212 (#$xxxx, W, x)
$2213
        VVVVVVVV -------V
        In HV mode values are 0 to 261(NTSC) or 0 to 311(PAL)
        In linear mode values are 0 to 511(upper 9 bits)

Set Super MMC Bank C

$2220 (#$00, w, x)
        B----AAA
        B = Bank CX projection
            1 = Bank data
            0 = Game pak ROM area
        AAA = ROM area select
When B is set, accessing an address in $00-1F:8000-FFFF will return (AAA << 20) | (addr & 0x0F7FFF).
If B is not set accessing an address in $00-1F:8000-FFFF will return  (addr & 0x0f7fff)
$C0-$CF:0000-FFFF will always return (AAA << 20) | (addr & 0x0FFFFF)
NOTE: I need to research this further, but this seems to prove accurate thus far.

Set Super MMC Bank D

$2221 (#$01, w, x)
        B----AAA
        B = Bank DX projection
            1 = Bank data
            0 = Game pak ROM area
        AAA = ROM area select
When B is set, accessing an address in $20-3F:8000-FFFF will return (AAA << 20) | (addr & 0x0F7FFF).
If B is not set accessing an address in $20-3F:8000-FFFF will return  (addr & 0x2f7fff)
$D0-$DF:0000-FFFF will always return (AAA << 20) | (addr & 0x0FFFFF)
NOTE: I need to research this further, but this seems to prove accurate thus far.

Set Super MMC Bank E

$2222 (#$02, w, x)
        B----AAA
        B = Bank EX projection
            1 = Bank data
            0 = Game pak ROM area
        AAA = ROM area select
When B is set, accessing an address in $80-9F:8000-FFFF will return (AAA << 20) | (addr & 0x0F7FFF).
If B is not set accessing an address in $80-9F:8000-FFFF will return  (addr & 0x4f7fff)
$E0-$EF:0000-FFFF will always return (AAA << 20) | (addr & 0x0FFFFF)
NOTE: I need to research this further, but this seems to prove accurate thus far.

Set Super MMC Bank F

$2223 (#$03, w, x)
        B----AAA
        B = Bank FX projection
            1 = Bank data
            0 = Game pak ROM area
        AAA = ROM area select
When B is set, accessing an address in $A0-BF:8000-FFFF will return (AAA << 20) | (addr & 0x0F7FFF).
If B is not set accessing an address in $A0-BF:8000-FFFF will return  (addr & 0x6f7fff)
$F0-$FF:0000-FFFF will always return (AAA << 20) | (addr & 0x0FFFFF)
NOTE: I need to research this further, but this seems to prove accurate thus far.

Super Nintendo CPU BW-RAM Address Mapping

$2224 (#$00, w, x)
        ---BBBBB
        B = Which portion of BW-RAM to map to $00-3F:$6000-$7FFF and $80-BF:$6000-$7FFF

SA-1 CPU BW-RAM Address Mapping

$2225 (#$00, W, x)
        SBBBBBBB
        S = BW-RAM source to be projected
            0 = $40-43 in 32 blocks(uses B0 to B4)
            1 = $60-6F in 128 blocks(uses B0 to B6)
        B = BW-RAM mapping for the SA-1(much like $2224)

Super Nintendo CPU BW-RAM Write Enable

$2226 (#$00, w, x)
        P-------
        P = Protect BW-RAM from writes from the SNES
            0 = Protect
            1 = Write enabled

SA-1 CPU BW-RAM Write Enable

$2227 (#$00, w, x)
        P-------
        P = Protect BW-RAM from writes from the SA-1
            0 = Protect
            1 = Write enabled

BW-RAM Write-Protected Area

$2228 (#$FF, w, x)
        ----AAAA
        AAAA = Area to protect
            0000 = Size of 400000 - 4000FF to protect, 1024*2^(AAAA+1)

SA-1 I-RAM Write Protection

$2229 (#$00, w, x)
        76543210
        0 = Protects 3000 to 30FF
            0 = Disable protection
            1 = Enable protection
        1 = Protects 3100 to 31FF
            0 = Disable protection
            1 = Enable protection
        2 = Protects 3200 to 32FF
            0 = Disable protection
            1 = Enable protection
        3 = Protects 3300 to 33FF
            0 = Disable protection
            1 = Enable protection
        4 = Protects 3400 to 34FF
            0 = Disable protection
            1 = Enable protection
        5 = Protects 3500 to 35FF
            0 = Disable protection
            1 = Enable protection
        6 = Protects 3600 to 36FF
            0 = Disable protection
            1 = Enable protection
        7 = Protects 3700 to 37FF
            0 = Disable protection
            1 = Enable protection

SA-1 I-RAM Write Protection

$222A (#$00, W, x)
        76543210
        0 = Protects 3000 to 30FF and 0000 to 00FF
            0 = Disable protection
            1 = Enable protection
        1 = Protects 3100 to 31FF and 0100 to 01FF
            0 = Disable protection
            1 = Enable protection
        2 = Protects 3200 to 32FF and 0200 to 02FF
            0 = Disable protection
            1 = Enable protection
        3 = Protects 3300 to 33FF and 0300 to 03FF
            0 = Disable protection
            1 = Enable protection
        4 = Protects 3400 to 34FF and 0400 to 04FF
            0 = Disable protection
            1 = Enable protection
        5 = Protects 3500 to 35FF and 0500 to 05FF
            0 = Disable protection
            1 = Enable protection
        6 = Protects 3600 to 36FF and 0600 to 06FF
            0 = Disable protection
            1 = Enable protection
        7 = Protects 3700 to 37FF and 0700 to 07FF
            0 = Disable protection
            1 = Enable protection

DMA Control

$2230 (#$00, W, x)
        CPMT-DSS
        C = DMA control
            0 = DMA disabled
            1 = DMA enabled
        P = Priority
            0 = SA-1 CPU
            1 = DMA
        M DMA mode
            0 = Normal DMA
            1 = Character conversion DMA
        T = Character conversion type
            0 = SA-1 CPU to I-RAM
            1 = BW-RAM to I-RAM
        D = Destination
            0 = I-RAM
            1 = BW-RAM
        SS = Source
            00 = ROM
            01 = BW-RAM
            10 = I-RAM

Character Conversion DMA Parameters

$2231 (#$00, X, x)
        E--SSSCC
        E = End of conversion 1, set by SNES
        SSS = VRAM horizontal character size 2^SSS
        CC = color mode
            00 = 8 Bit/Dot
            01 = 4 Bit/Dot
            10 = 2 Bit/Dot

DMA Source Device Start Address

$2232
$2233
$2234 (#$xx, X, x)
        AAAAAAAA AAAAAAAA AAAAAAAA
        A = Source start address
Write in order low, middle, then high

DMA Destination Start Address

$2235
$2236
$2237 (#$xx, X, x)
        AAAAAAAA AAAAAAAA AAAAAAAA
        A = Destination start address
Writing to $2236 will initalize I-RAM DMA
Writing to $2237 will initalize BW-RAM DMA
Write in order low, middle, then high

DMA Terminal Counter

$2238
$2239 (#$xx, W, x)
        CCCCCCCC CCCCCCCC
        C = Counter for number of bytes to transmit (0 to 65535)

BW-RAM BIT MAP Format

$223F (#$00, W, x)
        C-------
        C = color mode
            0 = 16 color mode
            1 = 4 color mode

BIT MAP Register File

$2240
$2241
$2242
$2243
$2244
$2245
$2246
$2247
$2248
$2249
$224A
$224B
$224C
$224D
$224E
$224F (#$xx, W, x)
        $2240-2247 = Buffer 1
        $2248-224F = Buffer 2

Arithmetic Control

$2250 (#$00, W, x)
    ------OO
    O = operation
        00 = Multiplication
        01 = Division
        10 = Cumulative sum

Arithmetic Parameters: Multiplicand / Dividend

$2251
$2252 (#$xx, W, x)
    NNNNNNNN NNNNNNNN
    N = Signed 16 bit data

Arithmetic Parameters: Multiplier / Divisor

$2253
$2254 (#$xx, W, x)
    NNNNNNNN NNNNNNNN
    N = 16 bit data
        N = Signed if multiplication
        N = Unsigned if division

Variable-Length BIT Processing

$2258 (#$xx, W, x)
        H---VVVV
        H = Read mode
            1 = Auto increment
            0 = Fixed
        VVVV = Length of previously stored data
            0000 = 16
            other values = Literal

Variable-Length BIT Game Pack ROM Start Address

$2259
$225A
$225B (#$xx, W, x)
        AAAAAAAA AAAAAAAA AAAAAAAA
        A = ROM start address
Execution begins on write to $225B

SA-1 Read Registers

Super Nintendo CPU Flag Read

$2300 (#$xx, x, r)
        IVDNmmmm
        I = SA-1 IRQ
            0 = No Interrupt
            1 = Interrupt
        V = SNES IRQ vector setting
            0 = ROM
            1 = SIV register
        D = Character conversion DMA IRQ flag
            0 = No Interrupt
            1 = Interrupt
        N = SNES NMI vector setting
            0 = ROM
            1 = SNV register
        mmmm = Messages from SA-1 CPU

SA-1 CPU Flag Read

$2301 (#$xx, x, R)
        ITDNmmmm
        I = SNES IRQ flag
            0 = No Interrupt
            1 = Interrupt
        T = IRQ from timer
            0 = No Interrupt
            1 = Interrupt
        D = DMA IRQ flag
            0 = No Interrupt
            1 = Interrupt at end of DMA
        N = SNES NMI vector setting
            0 = No NMI
            1 = NMI
        mmmm = Messages from SNES CPU

H-Count Read

$2302
$2303 (#$xx, x, R)
        HHHHHHHH -------H
        In HV mode values are 0 to 340
        In linear mode values are 0 to 511(lower 9 bits)

V-Count Read

$2304
$2305 (#$xx, x, R)
        HHHHHHHH -------H
        In HV mode values are 0 to 261(NTSC) or 0 to 311(PAL)
        In linear mode values are 0 to 511(upper 9 bits)

Arithmetic Result Product / Quotient / Accumulative Sum

$2306
$2307
$2308
$2309
$230A (#$xx, x, R)
        Multiplication = $2306-2309 signed
        Division = $2306-2307 signed
        Division remainder = $2308-2309 unsigned
        Cumulative sum = $2306-230A signed

Arithmetic Overflow Flag

$230B (#$xx, x, R)
        O-------
        O = Overflow
            1 = Overflow
            0 = No Overflow

Variable-Length Data Read Port

$230C
$230D (#$xx, x, R)
        16 bit results from $2258

Version Code Register

$230E
        SA-1 Version.