Super NES Programming/SNES memory map
Memory map
| Bank | offset | mapped here | comment |
|---|---|---|---|
| $00-$3F | $0000-$1FFF | LowRAM | each bank is shadowed from bank $7E |
| $2000-$2FFF | PPU1, APU | hardware registers | |
| $3000-$3FFF | DSP, SuperFX | hardware registers | |
| $4000-$41FF | controller | hardware registers | |
| $4200-$4FFF | DMA, PPU2? | hardware registers | |
| $6000-$7FFF | Chips | enhancement chips memory | |
| $8000-$FFFF | ROM | Data that is mapped here depends on the cartridge. | |
| $40-$7D | $0000-$FFFF | ROM | Data that is mapped here depends on the cartridge. |
| $7E | $0000-$1FFF | LowRAM | |
| $2000-$7FFF | HighRAM | ||
| $8000-$FFFF | Extended RAM | ||
| $7F | $0000-$FFFF | Extended RAM |
Banks $80 to $FF are mostly a mirror of the above. ROM mapped to banks $80 to $FF may be accessed at 3.58 Mhz rather than 2.68 Mhz depending on how register $420D is set.
There are two main models for memory that are used: LoROM and HiROM. LoROM means that the address line A15 is ignored by the cartridge, so the cartridge doesn't distinguish between $0000-$7FFF and $8000-$FFFF in any bank. Smaller ROMs use this model to prevent wasted space in banks $00-$3F.
Misc locations
At the end of bank 0, 64 bytes of cartridge information are stored. This section includes info such as interrupt vectors, title, version, etc.
| location | name | description |
|---|---|---|
| $FFC0 | Game title. | 21 bytes, usually uppercase. |
| $FFD5 | ROM makeup byte. | xxAAxxxB; AA==11 means FastROM, B is HiROM |
| $FFD6 | ROM type. | ROM/RAM/SRAM/DSP1/FX |
| $FFD7 | ROM size. | |
| $FFD8 | SRAM size. | |
| $FFD9 | Creator license ID code. | |
| $FFDB | Version #. | |
| $FFDC | Checksum complement. | |
| $FFDE | Checksum. |
Interrupt vectors
Vectors are all 2 bytes. Program execution begins in emulation mode at the reset vector ($FFFC-D).
native mode vectors
| name | location | description |
|---|---|---|
| COP | $FFE4, 5 | Co-processor enable. Not used for the Super NES. |
| BRK | $FFE6, 7 | |
| ABORT | $FFE8, 9 | |
| NMI | $FFEA, B | Non-maskable interrupt. Called when vertical refresh (vblank) begins. |
| RESET | $FFEC, D | unused |
| IRQ | $FFEE, F | Interrupt request. Can be set to be called at a certain spot in the horizontal refresh cycle. |
emulation mode vectors
| name | location | description |
|---|---|---|
| COP | $FFF4,5 | Co-processor enable. Not normally used for the Super NES. |
| ABORT | $FFF8,9 | |
| NMI | $FFFA,B | Non-maskable interrupt. Called when vertical refresh (vblank) begins. |
| RES | $FFFC,D | Reset vector, execution begins via this vector. |
| BRK | $FFFE,F | |
| IRQ | $FFFE,F | Interrupt request. Can be set to be called at a certain spot in the horizontal refresh cycle. |