diff options
Diffstat (limited to 'source/hardware.txt')
-rw-r--r-- | source/hardware.txt | 502 |
1 files changed, 0 insertions, 502 deletions
diff --git a/source/hardware.txt b/source/hardware.txt deleted file mode 100644 index ec6f2e5..0000000 --- a/source/hardware.txt +++ /dev/null @@ -1,502 +0,0 @@ -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. |