mirror of
https://github.com/ShadauxCat/CATSFC.git
synced 2024-05-31 18:47:23 -04:00
503 lines
22 KiB
Plaintext
503 lines
22 KiB
Plaintext
This document gives a brief description of the known hardware features of the
|
|
SNES giving you some idea what SNES emulation authors are up against.
|
|
|
|
Quick Overview
|
|
--------------
|
|
|
|
o 65c816 CPU running at up to 3.58MHz.
|
|
|
|
o SPC700 CPU core running at 2.48MHz with built-in custom sound digital
|
|
signal processor.
|
|
|
|
o Two custom graphics processors used to produce displays of up to 512x478
|
|
pixels with up to 32768 colours, 128 sprites, scaling, rotation, and mosaic
|
|
effects, scrolling over a virtual screen, transparency, coloured lens and
|
|
window effects and raster effects.
|
|
|
|
o 128k work RAM, 64k sound CPU RAM and 64k video RAM.
|
|
|
|
Game packs can include:
|
|
|
|
o Up to 6MBytes (or more) of ROM containing the game code, graphics and sound
|
|
data.
|
|
|
|
o Additional, battery-backed RAM (S-RAM) used to save game positions.
|
|
|
|
o 10.5/21MHz RISC CPU (Super FX) used to implement some 3D games and add
|
|
special effects to games.
|
|
|
|
o A maths co-processor (DSP1) used by some games with lots of physics
|
|
calculations involved (Pilot Wings) or mainly as a protection device
|
|
(Mario Kart).
|
|
|
|
o Other custom chips produced by some software companies to help speed up
|
|
games, fit more graphics into a given sized ROM or act as a protection
|
|
device.
|
|
|
|
Users could buy:
|
|
|
|
o A five player adapter, allowing up to five people to play at once on games
|
|
that supported it.
|
|
|
|
o A 2-button mouse, originally supplied with a paint program.
|
|
|
|
o A light-gun that looked like riffle; it used infra-red to provide wire-less
|
|
communication between the gun and the console unit. About 10 games
|
|
supported it.
|
|
|
|
o A GameBoy adapter that allowed the owners to play GameBoy games on their
|
|
SNES, some in colour.
|
|
|
|
o Copier units that plugged into the cartridge slot on the SNES and allowed
|
|
game pak ROMs to be downloaded into RAM on the copier and saved onto
|
|
disk. The game could then be played without the original ROM being present
|
|
- unless the game pack contained additional hardware, or the game ROM code
|
|
tried to detect the copier being present and deliberately crashed the game.
|
|
|
|
More Detail
|
|
-----------
|
|
|
|
65c816
|
|
------
|
|
|
|
The 65c816 is an 8/16-bit CPU that is basically an enhanced 6502: it even
|
|
has an emulation mode to make it behave almost exactly like a real 6502. No
|
|
doubt Nintendo were hoping to provide a compatibility mode for old NES
|
|
games, but failed.
|
|
|
|
The CPU features a 24-bit address bus and 8-bit data bus allowing a 16Mb
|
|
address space. It has an accumulator and two index registers, all can be
|
|
switch to either 8 or 16-bit mode.
|
|
|
|
The address space is broken up into 256 banks, each bank being 64k in size,
|
|
although there are addressing modes to treat the entire address space as one
|
|
continuous block. Bank 0 is special in that the stack, a few addressing
|
|
modes and the interrupt and reset vectors all reside there. The stack
|
|
pointer is 16-bits wide.
|
|
|
|
The 6502 has an addressing mode called zero-page, where the 1-byte address
|
|
specified in the instruction refers to a location in the first 256 bytes of
|
|
memory, allowing for 2-byte instructions and increased execution speed. The
|
|
65c816 extends this idea by allowing the 'zero-page' to be moved anywhere
|
|
inside bank 0 by use of the 16-bit direct page register.
|
|
|
|
There are other addressing modes available that use the bank specified in
|
|
the data bank register, again to help reduce code size and speed up
|
|
execution.
|
|
|
|
Code normally executes in single bank at a time, the current bank number
|
|
being specified by the 8-bit program bank register. There are instructions
|
|
available to call subroutines in other banks or just jump to code in other
|
|
banks.
|
|
|
|
The 65c816 internally runs at 3.58MHz, but other SNES hardware can temporarily
|
|
slow it down to 2.58MHz or even 1.56MHz when the CPU attempts read from them
|
|
or write to them. In particular, there are a mixture of fast and slow ROMs
|
|
inside game packs, slow ROMs can only be accessed at 2.58MHz.
|
|
|
|
The 65c816 has direct access to 128k of work RAM plus any additional RAM that
|
|
might be in the game pack. Video RAM and sound RAM cannot be accessed
|
|
directly.
|
|
|
|
SPC700
|
|
------
|
|
|
|
The SPC700 is an 8-bit CPU core, similar to a 6502, but with a different
|
|
instruction set, some new addressing modes and multiple and divide
|
|
instructions, together with a custom sound digital signal processor, all
|
|
contained inside one module.
|
|
|
|
The SPC700 and the 65c816 communicate via 4 bi-directional, 8-bit I/O ports.
|
|
The SPC700 has its own 64k RAM used to store a program downloaded from 65c816
|
|
and sound sample data.
|
|
|
|
The CPU has a built-in, small, 64 byte ROM used as boot-strap code to
|
|
download a more complex program and sample data from the game ROM via the
|
|
65c816. The ROM can be switched off and replaced with 64 bytes of RAM once
|
|
the boot-strap code has done its work.
|
|
|
|
The sound DSP can only play compresses sound samples, compressed using a
|
|
custom fixed-ratio compression algorithm that compresses 16 16-bit samples
|
|
into 8 bytes plus a one byte header. The minimum unit of a sample is one
|
|
block. The block header byte contains a shift and filter value (algorithm
|
|
decompression information) plus a last block flag and a loop flag; the loop
|
|
flag is only used if the last block flag is also set.
|
|
|
|
There are 8 separate sound channels allowing up to 8 samples to be played
|
|
simultaneously. Each sound channel has a left and right volume setting and
|
|
frequency setting. A hardware volume envelope can be defined for each
|
|
channel, and echo effects can be turned on and off individually for each
|
|
channel. The combined echo waveform can be subjected to an 8-tap FIR
|
|
digital filter. The wave output of a channel can be used to modulate the
|
|
frequency of the next sound channel, in numerical order.
|
|
|
|
The DSP also has a white noise source that can played on a sound channel
|
|
instead of sample data. All 8 channels, and any echo sound data, are mixed
|
|
together and subjected to a left and right master volume control.
|
|
|
|
The DSP also provides 3 interval timers, the first two running at 8kHz and
|
|
the last at 64kHz; games normally only use one of them to provide a constant
|
|
music playback rate.
|
|
|
|
Interrupts
|
|
----------
|
|
|
|
The 65c816 provides two external interrupt sources: IRQ, which can be masked,
|
|
and NMI, which cannot.
|
|
|
|
The IRQ line is connected to an output on one of the graphics chips, that,
|
|
it turn can be programmed to generate an IRQ at the start of a scanline, at
|
|
a particular position on a scanline or at a particular position of every
|
|
scanline. The IRQ line also is connected to one of the pins on the ROM
|
|
connector, so additional hardware inside the ROM game pak, such as the Super FX
|
|
and SA-1 chips, can also generate interrupts.
|
|
|
|
The NMI line is connected to another output of one of the graphics chips and
|
|
it can be programmed to generate an interrupt when the vertical blank period
|
|
starts.
|
|
|
|
The SPC700 chip can also generate interrupts, but they are not used on the
|
|
SNES and probably physically not connected.
|
|
|
|
Joypad Reading
|
|
--------------
|
|
|
|
Data from the SNES joy-pads is sent serially between the pad and the console.
|
|
Games can choose to read each bit in, one at a time or allow hardware inside
|
|
one of the custom chips to automatically read the joy-pad values once every
|
|
frame. The game can then read the values from registers.
|
|
|
|
SNES joy-pads themselves have direction controls and 8 other buttons named
|
|
A, B, X, Y, Left, Right, Start and Select.
|
|
|
|
Colour Palette
|
|
--------------
|
|
|
|
The SNES has a 256 entry 15-bit colour palette, allowing for 256 colours on
|
|
screen out of a total palette of 32768. However, games can and do change
|
|
colour entries during a frame, this combined with hardware colour value
|
|
addition and subtraction and an overall brightness setting, can easily boost
|
|
the number of colours on screen to several thousand!
|
|
|
|
Tiles
|
|
-----
|
|
|
|
All SNES graphics data is made up of tiles, a tile being an 8x8 block of
|
|
pixels, with each pixel made up of 2, 4 or 8 bits, allowing for 4, 16 or 256
|
|
colours per pixel.
|
|
|
|
To complicate matters, the SNES hardware stores tile data in planar format,
|
|
that is all the bit 1's of all the pixels of a tile are stored together,
|
|
then all the bit 2's and so on. Its like a sequence of 1-bit deep 8x8 pixel
|
|
blocks.
|
|
|
|
When a tile is used as background data, a 3-bit palette start address is
|
|
associated with each tile, allowing the programmer to choose a different
|
|
block of colours for each tile from the larger SNES colour palette. Sprites
|
|
can only use tiles of depth 4 (16 colours), but each sprite has a palette
|
|
start address.
|
|
|
|
Background Graphic Modes
|
|
------------------------
|
|
|
|
The SNES has eight background graphics modes, each mode varies the number of
|
|
individual background layers available, the depth of each layer and what
|
|
other features are available. Programmers can change the background mode
|
|
during a frame.
|
|
|
|
The two most commonly used modes are mode 1, which allows two 16-colour
|
|
background layers and one 4-colour layer and mode 7, which allows one 256-
|
|
colour layer, but the layer can be rotated, stretched, squashed, sheared and
|
|
generally messed around with.
|
|
|
|
Each background is made up 32x32 8x8 tiles. However, the number of tiles in
|
|
each direction can be double as can the individual tile size. This allows for
|
|
a virtual background size of 256x256 up to 1024x1024. Switching to 16x16 tile
|
|
size actually just groups four 8x8 tiles together, there is no true 16x16 tile
|
|
on the SNES.
|
|
|
|
Backgrounds have a pre-defined priority order - when pixels from one
|
|
background layer overlap on the screen pixels from another background layer,
|
|
the pixels from the lower numbered background are displayed.
|
|
|
|
Each tile can be flipped horizontally or vertically, has a 3-bit "palette
|
|
number" and a priority bit. The priority bit is used to make all the pixels
|
|
in the tile appear in front of pixels from another background layer or
|
|
sprite that would otherwise normally appear in front of them. Colour 0 from
|
|
each tile is special and means "transparent", allowing non-transparent
|
|
pixels from background layers or sprites "underneath" to be visible.
|
|
|
|
Normally only 256x224 or 256x239 pixels are visible on screen and backgrounds
|
|
have a scroll setting that allows the screen to act as a window onto any
|
|
portion of their virtual size.
|
|
|
|
Two background modes are available that can display up to 512x478 pixels,
|
|
but they're not used by many games because the flicker, caused by the
|
|
interlace used display the image on a standard television, would give game
|
|
players headaches.
|
|
|
|
Sprites
|
|
-------
|
|
|
|
The SNES has 128 hardware sprites, each sprite can be made up of one or
|
|
several 16-colour, 8x8 tiles. Each sprite is assigned a number which defines
|
|
its pixel priority when two sprites overlap on screen, it also has a separate
|
|
sprite-to-background priority value which defines whether the sprite should
|
|
appear in front or behind of the various background layers. Each sprite also
|
|
has a 3-bit palette number, horizontal and vertical flip flags, a start tile
|
|
number and, of course, an X and Y position.
|
|
|
|
There's no way to turn off a sprite - if you don't want it to be visible you
|
|
have to place the sprite at off-screen position.
|
|
|
|
The SNES hardware seems to impose limits on the number of sprites that can
|
|
appear on each scanline; there are one or two games out there that rely on
|
|
this 'feature' to hide sprites they don't want visible.
|
|
|
|
Mosaic
|
|
------
|
|
|
|
The SNES has a hardware mosaic effect. The upper left-hand pixel from a block
|
|
of pixels up to 16 pixels wide can be made to cover the area of the other
|
|
15; the pixel appears up to 16 times its original size. The effect can only
|
|
be used on the background layers, not sprites. All backgrounds share the
|
|
same size setting but the effect can be turned on and off per background
|
|
layer.
|
|
|
|
Many ROMs combine the mosaic effect with a brightness fade to zoom out of one
|
|
game screen then zoom on to the next.
|
|
|
|
Offset Per Tile
|
|
---------------
|
|
|
|
Three of the background screen modes reduce the number of visible background
|
|
layers by one, and use its screen data as per-tile background scroll data
|
|
for the remaining visible layers.
|
|
|
|
The background modes vary as to whether the vertical and horizontal scroll
|
|
values can both be altered, or just one of them. Tetris Attack uses the
|
|
effect to allow different parts of the screen to scroll vertically at
|
|
different rates.
|
|
|
|
The horizontal per-tile offset feature is very limited and only allows
|
|
adjustment in steps of 8 pixels.
|
|
|
|
Mode 7
|
|
------
|
|
|
|
Nintendo use this background screen mode to really show off the SNES compared
|
|
to the Sega's Mega Drive.
|
|
|
|
By specifying a centre of rotation and a 2 by 2 transformation matrix, the
|
|
mode 7 screen can be rotated, scaled, stretched, squashed, etc. just by
|
|
writing to a few PPU registers. By varying the values on each scanline, some
|
|
very interesting effects can be produced, these include a perspective
|
|
effect, shears, split-screen zooms, etc.
|
|
|
|
Each pixel is 8-bit (256 colours per pixel) and the screen itself has a
|
|
virtual screen size of 1024x1024.
|
|
|
|
Mode 7 has another feature where the number of colours are reduced to 128
|
|
and the spare bit is used to swap a pixel between background layer 0 and 1,
|
|
thus altering the sprite to background priority. This allows some pixels to
|
|
be appear in front of sprites and others appear behind.
|
|
|
|
Colour Addition / Subtraction
|
|
-----------------------------
|
|
|
|
The pixels of background layers and sprites can be directed to one of two
|
|
places, the main-screen or the sub-screen. The sub-screen is like a virtual
|
|
screen that cannot normally be seen, but the SNES has hardware that can add
|
|
or subtract the RGB colour palette values of each pixel on the sub-screen to
|
|
or from RGB values of pixels on the main-screen. The effect is that
|
|
background layers on the on the main-screen appear translucent, allowing the
|
|
sub-screen partly to show through. Examples are cloud, mist and water effects.
|
|
|
|
The effect can be turned on and off for each background layer on the
|
|
main-screen. There's a master switch for sprites as well, but when turned
|
|
on, only sprites with certain colour palette numbers actually have their
|
|
pixel values added to or subtracted from.
|
|
|
|
The SNES also has a separate fixed colour value; if colour addition or
|
|
subtraction is enabled and there's nothing on the sub-screen, the fixed
|
|
colour is added or subtracted instead. I've seen it used by games to darken
|
|
an area of the screen then overlay a menu on top, to implement a
|
|
fade-to-white effect and to tint an area of the screen a particular colour.
|
|
|
|
Windows
|
|
-------
|
|
|
|
The SNES provides two "clip windows". Each window is just an area defined by
|
|
a left and right position. A background layer or all sprites can be selected
|
|
to appear only inside or outside the window.
|
|
|
|
If both windows are enabled on the same background layer or for all sprites,
|
|
the areas they define are combined using one of four logical combination
|
|
modes: OR, AND, XOR and N-XOR.
|
|
|
|
If the left and/or right values are altered on each scanline (normally using
|
|
H-DMA), many different shaped windows can be created; I've seen circles,
|
|
pentagons, wavy lines, doughnuts, G's, etc.
|
|
|
|
There's also the colour window. Each window or both windows can be used to
|
|
define the area of the colour window. When the colour window is enabled for
|
|
the sub-screen, transparency effects occur only inside or outside the colour
|
|
window. When the colour window is enabled for the main-screen, it acts like
|
|
a master clip window, clipping all background layers and sprites and even
|
|
the back-drop colour to the area either inside or outside the colour window;
|
|
in the clipped areas, the sub-screen is displayed or just black.
|
|
|
|
Direct Colour Mode
|
|
------------------
|
|
|
|
On the 256 colour background modes, the otherwise unused 3-bit per-tile
|
|
colour palette number can be used in combination with the 8-bit tile pixel
|
|
data to form an 11-bit colour value (2048 colours) without using the SNES
|
|
colour palette registers.
|
|
|
|
Mode 7 has the same feature, but since mode 7 uses a different tile layout
|
|
with no 3-bit colour palette number, a fixed 256 colours are available
|
|
instead, again without using the SNES colour palette registers.
|
|
|
|
Interlace
|
|
---------
|
|
|
|
The SNES normally generates a non-interlaced picture. Interlace can turned
|
|
on and the only thing that happens is that the screen appears to flicker
|
|
slightly due to the way a television works. However, in the two hi-res.
|
|
background screen modes, if interlace is turned on the vertical resolution
|
|
doubles from 512x224 to 512x448 (or 512x478 if the expand vertical flag is
|
|
also set).
|
|
|
|
Not many games use the feature due to the flicker introduced by the
|
|
interlace, so its use is normally limited to title screens. However, one
|
|
game I know of, RPM Racing, uses the effect during the game.
|
|
|
|
DMA
|
|
---
|
|
|
|
The SNES provides 8 DMA (direct-memory-access) channels, although only one can
|
|
be active at once. Without any intervention of the 65c816 CPU, up to 64K of
|
|
data can be transferred from RAM or ROM to any PPU (picture processing unit)
|
|
register. Since V-RAM, colour palette and sprite position and display data can
|
|
only be written to via PPU registers, DMA provides a very convenient method of
|
|
transferring data faster than the CPU alone could provide. There are PPU
|
|
registers to read or write to the 128k work RAM, so DMA could be used to copy
|
|
data from ROM to RAM as well.
|
|
|
|
There is also a DMA read mode, where data is transferred from PPU registers
|
|
to RAM.
|
|
|
|
There are various limitations on DMA - if multiple DMA channels are started
|
|
at once, they execute in order, the numerically lowest one first, then the
|
|
next highest and so on. The 65c816 is stopped while DMA takes place. Each
|
|
DMA operation can only access one 64k bank at once. However, the biggest
|
|
limitation is that DMA can only take place when the graphics chips aren't
|
|
also performing graphics data DMA, i.e. DMA can only be used during the
|
|
v-blank period or when the screen is forcible blanked.
|
|
|
|
H-DMA
|
|
-----
|
|
|
|
H-DMA is like DMA in that data is transferred from ROM or RAM to PPU
|
|
registers without the intervention of the CPU. However, instead of all the
|
|
data being transferred in one block, a few bytes are transferred at a time,
|
|
just before the start of the each scanline.
|
|
|
|
H-DMA shares the same channels as normal DMA, so each channel can be set up
|
|
for DMA or H-DMA, but since normal DMA only occurs during v-blank and H-DMA
|
|
is disabled during this time, its actually easy to reuse a channel for both
|
|
types of DMA.
|
|
|
|
There are various H-DMA modes that define how many bytes should be
|
|
transferred each scanline, whether the destination PPU register is 8-bit or
|
|
16-bit, should new data be transferred each scanline, or can the same data
|
|
be reused if a count value hasn't reached zero, etc.
|
|
|
|
H-DMA gives a very powerful weapon to programmers, it allows PPU register
|
|
values to be easily changed each scanline, so many games can and do use it
|
|
to change screen colours, background scroll values, window shape values,
|
|
mode 7 matrix values, transparency effects, etc. during the frame.
|
|
|
|
Extra Chips Used by the SNES Inside Some Game Paks
|
|
==================================================
|
|
|
|
Super FX
|
|
--------
|
|
|
|
The Super FX is just a fast integer RISC-type processor but with a built-in
|
|
plot instruction that can draw a single pixel in the SNES' planar format into
|
|
a virtual screen very quickly, very handy for 3d polygon rendering. Its a
|
|
strange chip though - no stack, a 512 byte cache and a one stage pipe-line
|
|
that causes the instruction following a branch instruction to be executed.
|
|
Instructions fetched from the cache often execute in a single cycle.
|
|
|
|
Super FX games came with additional RAM inside the game pak that is used as
|
|
work RAM for the 'FX chip and as save-game positions, if the ROM supports it.
|
|
|
|
The 'FX chip has 16 16-bit registers and built-in fast integer multiply.
|
|
Although the Super FX and the 65c816 can run in parallel, the 'FX chip can't
|
|
access the game pack ROM or RAM at the same time as the main SNES CPU, so most
|
|
games just get the SNES CPU to execute a wait loop in the SNES work RAM.
|
|
|
|
The 'FX can't access the SNES custom hardware chips, so if the 'FX has
|
|
rendered a screen image in its work RAM, it has to go to sleep while the SNES
|
|
CPU copies the screen to video RAM, usually using DMA. The SNES CPU can pass
|
|
parameters to 'FX routines either by writing them into the 'FX work RAM or
|
|
writing directly into the 'FX registers, which it can be accessed by the CPU
|
|
only when the 'FX chip is sleeping.
|
|
|
|
There are two versions of the 'FX chip, the original 10MHz chip used in Star
|
|
Fox and limited to 1Mb of ROM access and 64K RAM and a newer version used in
|
|
Yoshi's Island, Doom, Vortex, Winter Gold, Star Fox 2, etc. which can be
|
|
clocked at 21MHz and can access twice as much ROM and RAM.
|
|
|
|
DSP1
|
|
----
|
|
|
|
The DSP1 is an early digital signal processor with an on-board ROM,
|
|
manufactured by NEC. The on-board ROM was loaded with a program developed
|
|
by Nintendo to turn the chip into a 3d maths co-processor, able to perform
|
|
most primitive, but time-consuming, calculations required when manipulating
|
|
objects in a 3d coordinate system relatively quickly, compared to the
|
|
speed of the 65c816 CPU alone, that is.
|
|
|
|
Most of the calculations supported seemed to be those required by a simple
|
|
flight simulator, i.e. the calculations available were choosen with Pilot
|
|
Wings in mind.
|
|
|
|
The DSP1 has been used in several other games, may be as many as 20, though
|
|
most ignore a lot of the available features. The games include Mario Kart, Top
|
|
Gear 3000, Battle Racers, Super Air Diver and Bases Loaded 2.
|
|
|
|
SA-1
|
|
----
|
|
|
|
The SA-1 is a fast, custom 65c816 8/16-bit processor, the same as inside the
|
|
SNES itself, but clocked at 10MHz compared to a maximum of 3.58MHz for the CPU
|
|
inside the SNES.
|
|
|
|
The SA-1 isn't just a CPU, it also contains some extra circuits developed by
|
|
Nintendo which includes some very fast RAM, a memory mapper, DMA, several
|
|
real-time timers, and the region lock-out chip.
|
|
|
|
The SNES (or ROM copiers) can only access the ROM inside the game pak via the
|
|
SA-1; and the SA-1 only enables access to the ROM once its internal region
|
|
lock-out chip has verified it has successfully communicated with a lock-out
|
|
chip inside the SNES. This very effectively prevents SNES ROM copiers from
|
|
being able to copy the ROM.
|
|
|
|
The SA-1 is used in Mario RPG and seems to be used in several other games
|
|
that Nintendo released in 1996 and beyond.
|
|
|
|
S-DD1
|
|
-----
|
|
|
|
Very little is known about this chip. It seems to be another digital signal
|
|
processor, possibly made by Texas Instruments, dedicated to decompressing
|
|
graphics data. Only two games I know of use the chip, Street Fighter Alpha 2
|
|
and Star Ocean.
|
|
|
|
Like the SA-1, the SNES and ROM copiers can only access the ROM via the S-DD1,
|
|
again preventing ROM copiers from dumping the ROM image.
|