Snes9x: The Portable Super Nintendo Entertainment System Emulator ================================================================= v1.37 28-FEB-2001 ================= Home page: http://www.snes9x.com Contents ======== Changes Since Last Release Introduction What's Emulated What's Not What You Will Need Getting Started/Command Line Options Keyboard Controls Joystick Support Game Saving Netplay Support Super FX SA-1 C4 3Dfx Support Problems With ROMs Sound Problems Converting ROM Images Speeding up the Emulation Credits Changes Since Last Release ========================== Check the CHANGES file for a complete history of Snes9x changes between versions. Introduction ============ Snes9x is a portable, freeware Super Nintendo Entertainment System (SNES) emulator. It basically allows you to play most games designed for the SNES and Super Famicom Nintendo game systems on your PC or Workstation. The games include some real gems that were only ever released in Japan. Snes9x is the result of over four years worth of part-time hacking, coding, recoding, debugging, etc. Snes9x is coded in C++, with three assembler CPU emulation cores on the i386 Linux, DOS and Windows ports. Snes9x is better than a real SNES: o Freeze a game at any position, then restore the game to that exact spot at a later date - ideal for saving a game just before a difficult bit. o Built-in cheat cartridge. o Built-in peripheral emulation. The SNES mouse, Multi-player 5 and SuperScope external add-ons are all emulated, they cost extra money with a real SNES. o Stereo sound - yes I know the SNES produced stereo sound, but who actually paid the inflated price for the special lead just so you could hear it? o No more cartridge contact cleaning! o Some SNES hardware features that can be turned on and off during game play, games might be using one of these features to deliberately make a section of the game more difficult. Easy, just turn the feature off! o Networked game play on some ports. o Speed up or slow down SNES games. o Save screen shots to impress(?!) your friends. Snes9x is worse than a real SNES: o Unless your computer is very fast (Pentium II+), some games just can't hit every frame being rendered and the emulator starts to skip the drawing of some frames to keep the emulator running at a constant speed - to you it appears as if the graphics aren't moving as smoothly as they could. o Not all games work; bugs and missing features cause some games to fail to work or renders them un-playable. o You have to wait for your computer to boot before you can play games, no waiting on the real SNES! o The SNES has an analogue low-pass sound filter that give a nice bass to all the sounds and music - Snes9x doesn't emulate this. If you have a posh sound card, you could try fiddling with it mixer controls to produce a similar effect. Turning on interpolated sound helps a lot. What's Emulated =============== - The 65c816 main CPU. - The Sony SPC700 sound CPU. - SNES variable length machine cycles. - 8 channel DMA and H-DMA (raster effects). - All background modes, 0 to 7. - Sound DSP, with eight 16-bit, stereo channels, compressed samples, hardware attack-decay-sustain-release volume processing, echo, pitch modulation and digital FIR sound filter. - 8x8, 16x8 and 16x16 tile sizes, flipped in either direction. - 32x32, 32x64, 64x32 and 64x64 screen tile sizes. - H-IRQ, V-IRQ and NMI. - Mode 7 screen rotation, scaling and screen flipping. - Vertical offset-per-tile in modes 2, and 4. - Horizontal offset-per-tile in modes 2, 4 and 6. - 256x224, 256x239, 512x224, 512x239, 512x448 and 512x478 SNES screen resolutions. - Sub-screen and fixed colour blending effects. - Mosaic effect. - Single and dual graphic clip windows, with all four logic combination modes. - Colour blending effects only inside or outside a window. - 128 8x8, 16x16, 32x32 or 64x64 sprites, flipped in either direction. - SNES palette changes during frame (15/16-bit internal rendering only). - Direct colour mode - uses tile and palette-group data directly as RGB value. - Super FX, a 21/10MHz RISC CPU found in the cartridge of several games. - SA-1, a faster version of CPU found in the main SNES unit together with some custom game-accelerator hardware. - C4, a custom Capcom chip used only in Megaman X2 and X3. Its a sprite scaler/ rotator/line drawer/simple maths co-processor chip used to enhance some in-game effects. - Partial DSP-1 support, enough to play Mario Kart. - SNES mouse. - SuperScope (light gun) emulated using computer mouse. - Multi-player 5 - allowing up to five people to play games simultaneously on games that support that many players. - Game-Genie and Action Replay cheat codes. - Multiple ROM image formats, with or without a 512 byte copier header. - Single or split images, compressed using gzip, and interleaved in one of two ways. - Auto S-RAM (battery backed RAM) loading and saving. - Freeze-game support, now portable between different Snes9x ports. - Interpolated sound. What's Not ========== - Only partial DSP-1 support, enough to play Mario Kart but no more. The DSP1 is a math co-processor chip that was inside the cartridge of some games, notably Mario Kart and Pilot Wings. - Any other odd chips that manufactures sometimes placed inside the cartridge to enhance games and as a nice side-effect, also act as an anti-piracy measure, e.g. S-DD1. - Pseudo hi-res. mode - SNES hardware uses interpolation to give apparent increase in horizontal resolution, use one of the output image processing options to get the same effect. - Mosaic effect on mode 7. - A couple of SPC700 instructions that I can't work exactly out what they should do. - Fixed colour and mosaic effects in SNES hi-res. (512x448) modes. - Offset-per-tile in mode 6. Luckily I haven't found a game that uses it, yet. What You Will Need ================== CPU ---- Faster the better, but 486DX4 100 minimum when using 8-bit graphics and minimal or no sound, Pentium 166 or higher for transparency effects and Pentium 200 or higher for Super FX and SA-1 games. Memory ------ 16Mb or more for Linux. Sun workstations shouldn't have a problem. Screen ------ X Window System ports need an 8, 15, 16, 24 or 32 bit X server running; transparency effects are available at all depths, but don't look good with only an 8-bit display. For maximum emulation speed, have the X server switched to 8-bit and don't enable transparency effects, or 15 or 16-bit with transparency effects enabled. The Linux SVGA port is very limited at the moment due to no 16-bit screen modes being supported on my main development machine. However, the Linux X Window System version now has a full-screen mode, so there's hopefully no need to use the SVGA version. If you want to use the 3dfx bi-linear and scaling features of Snes9x, you will need a Voodoo 1, 2 or 3 graphics card and the glide library installing; glide comes with most Linux distributions or you can download it from http://glide.xxedgexx.com/3DfxRPMS.html Disk Space ---------- 1Mb for the emulator. Software -------- Access to SNES ROM images in *.smc, *.sfc, *.fig or *.1, *.2, or sf32xxxa, sf32xxxb, etc., format otherwise you will have nothing to run! Some home-brewed ROM images can be downloaded from http://www.snes9x.com. To find commercial games, you could try a web search engine and some imaginative use of search strings, alternatively, I've heard http://www.cherryroms.com, http://www.edgeemu.com or http://www.emuinfinity.com are good places to try. Please note, it is illegal in most countries to have commercial ROM images without also owning the actual SNES ROM cartridge. Getting Started =============== From a shell just type: snes9x <ROM filename> to start the X Window System port or gsnes9x <ROM filename> to start the X Windows System/Voodoo port. ROM images are normally loaded from the directory ./roms. This can be changed by specifying a pathname with the image name or setting the environment variable SNES96_ROM_DIR to point to a different directory. Freeze game files and S-RAM save files are normally read from and written to the directory $HOME/.snes96_snapshots. This can be changed by setting the environment variable SNES96_SNAPSHOT_DIR to point to a different directory. To enable full-screen mode on the Linux X Window System and SVGA ports, or to use the Voodoo 3D card without the 3dfx Linux kernel driver installed, Snes9x needs special system access permissions to allow it to write directly to video RAM and alter video chipset register values. In the directory where Snes9x is located, typing: su root chown root snes9x gsnes9x chmod 4755 snes9x gsnes9x will give the binaries the required access. As an alternative for the voodoo port, rather than making the binary set-uid root, download and install the 3dfx kernel driver, again available with most Linux distributions or download from http://glide.xxedgexx.com/3DfxRPMS.html Lots of command line flags are available: Graphics options: -------------- -tr or transparency (default: off) Enable transparency effects, also enables 16-bit screen mode selection. Transparency effects are automatically enabled if the depth of your X server is 15-bit or greater. -16 or -sixteen (default: off) Enable 16-bit internal screen rendering, allows palette changes but no transparency effects. -hires or -hi (default: lo-res.) Enable support for SNES hi-res. and interlace modes. USE ONLY IF GAME REQUIRES IT (FEW DO) BECAUSE IT REALLY SLOWS DOWN THE EMULATOR. -y or -interpolate (default: off) Enables 'TV mode', hires support, 16-bit internal rendering and transparency effects. TV mode scales the SNES image by x2 by inserting an extra blended pixel between each SNES pixel and 80% brightness 'scan-lines' between each horizontal line. The result looks very nice but needs a fast machine. Use with the full-screen X mode and a 15 or 16 depth X server, or the SVGA port for fastest operation. -y2 or -interpolate2 Enable Kreed's Super 2xSaI image processing mode. -y3 or -interpolate3 Enable Kreed's Super Eagle image processing mode. -y4 or -interpolate4 Enable Kreed's 2xSaI image processing mode. -y5 or -interpolate5 Enable Kreed's software bi-linear filtering and image scaling mode. -nms or -nomodeswitch (default: switch modes) The Linux X Windows System port can change the screen resolution when switching to full-screen mode so the SNES display fills the whole screen. Specify this option to stop it if causes you problems. -fullscreen or -fs Start the emulator in full screen mode, rather than a window on the X11 port if supported by your X server, a suitable screen mode is defined in your XF86Config file and the snes9x binary has root permissions (see above). -scale or -sc (default: off) Stretch the SNES display to fit the whole of the computer display. Linux X Window System full-screen mode or SVGA port only. Use only if you have a very fast machine. -displayframerate or -dfr Display a frame rate counter superimposed over the bottom, left-hand corner of the SNES display. The value before the slash (/) indicates how many frames per second are being rendered compared to a real SNES, the value of which is displayed after the slash. Sound options: ------------ -ns or -nosound Disable sound CPU emulation and sound output, useful for the Starfox 2 beta floating around that has corrupt sound CPU code, causing the game to hang with sound emulation turned on. Disabling sound also speeds up emulation speed, at the expense of no music or sound effects during the game and reduced game compatibility. -sk 0-3 or -soundskip 0-3 (default: 0) ONLY USED IF SOUND IS DISABLED. The algorithm to use when trying to fool a ROM into thinking that the SPC700 sound CPU is there when actual emulation of it is turned off (for speed reasons). -stereo or -st (default: stereo) Enable stereo sound output. -mono (default: stereo) Enable mono sound output. Slightly faster, but doesn't sound as nice. -r 0-7 or -soundquality or -sq 0-7 (default: 4) Sound playback rate/quality: 0 - disable sound, 1 - 8192, 2 - 11025, 3 - 16500, 4 - 22050 (default), 5 - 29300, 6 - 36600, 7 - 44000. -envx or -ex (default: off) Enable volume envelope height reading by the sound CPU. Can cure sound repeat problems with some games (e.g. Mortal Kombat series), while causing others to lock if enabled (eg. Bomberman series). Use with -sy option below to fix the problems this option can otherwise create. -ts or -threadsound Starts to feed data to the sound card using a separate thread rather than using timers, signals and polling. Use to work around a bug in the beat Sound Blaster Live Linux driver that keeps telling Snes9x that the sound card can accept more sound data, when it actually cannot and Snes9x slows down or locks up. A multi-CPU system could benifit from using this option - sound processing could take place on another CPU for speed. -sy or -soundsync Turns on sound-sync code where sound data is generated in sync with the emulation of the SNES sound CPU instructions. Slightly slower emulation speed but helps reduce note and sound effects timing problems and one or two games actually require this mode, notably Williams Arcade Classics. Also turns on interpolated sound and envelope height reading. Pressing the ']' key during gameplay toggles sound-sync only on and off. Not very effective/useless when thread sound is enabled due to mutex data locking timing problems. -is or -interpolatedsound (default: off) Turns on interpolated sound. Any samples played at a lower frequency than the current playback rate (-r option) have additional sample points computed and played where previously the same sample data was played repeatedly. Lower frequency sounds have improved bass and sound much less harsh - I suspect the real SNES does this. Pressing '[' during gameplay toggles the feature on and off. -b size or -buffersize size or -bs size (default: auto-select) Sound playback buffer size in bytes 128-4096. -nosamplecaching or -nsc or -nc (default: on) Disable decompressed sound sample caching. Decompressing samples takes time, slowing down the emulator. Normally the decompressed samples are saved just in case they need to be played again, but the way samples are stored and played on the SNES, it can result in a click sound or distortion when caching samples with loops in them. -alt or -altsampledecode (defalt: off) Switch to using Anti Resonance's sample decoding method. Some games, notably Squaresoft RPG games, make use of a SNES hardare sample decoding bug/ feature to generate wind and swish-type sound effects; selecting this option enables code that tries to simulate the feature. The disadvantage is that it can decode some 'normal' samples incorrectly. -noecho or -ne (default: on) Turn off sound echo and FIR filter effects. Processing these effects can really slow down a non-MMX Pentium machine due to the number of calculations required to implement these features. -ratio 1+ or -ra 1+ (default: 2) (OBSOLETE) Ratio of 65c816 to SPC700 instructions. The value is no longer used because SPC700 cycle counting is now implemented giving much more accurate timing. -nomastervolume or -nmv (default: on) Disable emulation of the sound DSP master volume control. Some ROMs set the volume level very low requiring you to turn up the volume level of your speakers introducing more background noise. Use this option to always have the master volume set on full and to by-pass a bug which prevents the music and sound effects being heard on Turrican. Cheat options: ----------- -gg <code> or -gamegenie <code> Supply a Game Genie code for the current ROM. Up to 10 codes can be in affect at once. Game Genie codes for many SNES games are available from: http://vgstrategies.miningco.com/games/vgstrategies/library/ggn/bl_ggnsnes.htm -ar <code> or -actionreplay <code> Supply a Pro-Action Reply code for the current ROM. Up to 10 codes can be in affect at once. At the moment, codes which alter RAM do not work. -gf <code> or -goldfinger <code> Supply a Gold Finger code for the current ROM. Up to 10 codes can be active at once. Speed up/slow down options: (See "Speeding Up The Emulation") -f <frame skip count> or -frameskip <frame skip count> (default: auto-adjust) Set this value to deliberately fix the frame skip rate and disable auto- speed regulation. Use a larger value faster emulation but more jerky movement and a smaller value for smooth but slower screen updates. Use '+' and '-' keys to modify the value during a game. Ideal for some Super FX games that confuse the auto-adjust code or for games that deliberately flash the screen every alternate frame. -frametime <time in milliseconds> or -ft <time in milliseconds> (default: 16.6ms NTSC games and 20ms for PAL games) If auto-adjust frame skip option is in effect, then the emulator will try to maintain a constant game and music speed locked to this value by skipping the rendering of some frames or waiting until the required time is reached. Increase the value to slow down games, decrease it to speed up games. During a game the value can be adjusted in millisecond steps by pressing Shift '-' or Shift '+'. -h <0-200> or -cycles <0-200>(default: 100) Percentage of CPU cycles to execute per scan line, decrease value to increase emulation frame rate. Most ROMs work with a value of 85 or above. -j or -nojoy Turn off joystick, SideWinder and GrIP detection (joystick polling on the PC slows the emulator down). ROM image format options: --------------------- -i or -interleaved (default: auto-detect) Force interleaved ROM image format. -i2 or -interleaved (default: can't be auto-detected) Force alternate interleaved format (i.e. most Super FX games). -hirom or -fh or -hr (default: auto-detect) Force Hi-ROM memory map for ROMs where the Hi-ROM header test fails. -lorom or -fl or -lr (default: auto-detect) Force Lo-ROM memory map for ROMs where the Hi-ROM header test fails) -header or -hd (default: auto-detect) Force the detection of a ROM image header. Some ROM images have been hand-edited to remove unused space from the end of the file; if the resultant image size is not a multiple of 32k then Snes9x can't auto-detect the presence of a 512 byte ROM image header. -noheader or -nhd (default: auto-detect) Force Snes9x into thinking no ROM image header is present. See -header above. -p or -pal (default: auto-detect) Fool ROM into thinking this is a PAL SNES system and adjust frame time to 20ms (50 frames per second) -n or -ntsc (default: auto-detect) Fool ROM into thinking this is a NTSC SNES system and adjust frame time to 16.7ms (60 frames per second) -l or -layering (default: off) Swap background layer priorities from background involved in sub-screen addition/subtraction. Can improve some games play-ability - no need to constantly toggle background layers on and off to read text/see maps, etc. Toggle feature on and off during game by pressing '8'. Not used if transparency effects are enabled. -l <freeze game file name> or -loadsnapshot <freeze game file name> Load snapshot file and restart game from saved position. -nh or -nohdma (default: H-DMA enabled) Turn off the H-DMA emulation. Pressing '0' during a game toggles H-DMA on and off. -n or -nospeedhacks (default: speed hacks) Turn off a couple of speed hacks. The hacks boost the speed of many ROMs but cause problems a few ROMs. -nw or -nowindows (default: graphics windows emulated) Disable graphics windows emulation. Use 'backspace' key during a game to toggle the emulation on and off. Joystick options: ------------- -joymap[1|2|3|4] followed by 8 numbers Specify the SNES joypad buttons to Linux joystick driver buttons mapping for each of the four supported joypads. Specify the Linux joystick button number for the corresponding SNES button in the following order: A, B, X, Y, TL, TR, Start and Select The default map is: 1 0 4 3 6 7 8 9 which is suitable for Sidewinder gamepads. -s or -swap Swap emulated joy-pad 1 and 2 around, pressing '6' during a game does the same thing. -j or -nojoy Turn off joystick, SideWinder and GrIP detection (joystick polling on the PC slows the emulator down). For example, to start a game called "mario", with sound, and transparency effects, type: snes9x -tr mario.smc Keyboard Controls ================= While the emulator is running: 'Escape' Quit the emulator 'Pause' or 'Scroll Lock' Pause the emulator Alt+'f' or PrtSc Toggle the Linux X11 port full-screen mode on and off. Joy-pad 1: 'up' or 'u' Up direction 'down', 'j' or 'n' Down direction 'left' or 'h' Left direction 'right' or 'k' Right direction 'a', 'v' or 'q' TL button 'z', 'b' or 'w' TR button 's', 'm' or 'e' X button 'x', ',' or 'r' Y button 'd', '.' or 't' A button 'c', or 'y' B button 'return' Start button 'space' Select button 'Mouse left' Mouse left button or SuperScope fire button. 'Mouse right' Mouse right button or SuperScope cursor button. 'tab' Emulation turbo speed button for skipping past long ROM intros. '`', '~' or '#' SuperScope turbo toggle switch. '/' SuperScope pause button. '0' Toggle H-DMA emulation on/off. '1' Toggle background 1 on/off. '2' Toggle background 2 on/off. '3' Toggle background 3 on/off. '4' Toggle background 4 on/off. '5' Toggle sprites (sprites) on/off '6' Toggle swapping of joy-pad one and two around '7' Rotate between Multi-player 5, mouse on port 1, mouse on port 2 and SuperScope emulation. '8' Toggle background layer priorities for backgrounds involved in sub-screen addition/subtraction. '9' Toggle transparency effects on and off - only if 16-bit screen mode selected. 'Backspace' Toggle emulation of graphics window effects on/off. '-' Decrease frame redraw skip rate '+' Increase frame redraw skip rate The sequence is auto-frame rate adjust, render every frame, render 1 frame in two, render 1 frame in three, render 1 frame in four, etc. Shift+'-' Decrease frame time in 1ms steps. Shift+'+' Increase frame time in 1ms steps. The frame time value is the average length of time a single frame should take to emulate - works only if the auto-frame rate adjust is operational. The code will skip the rendering of some frames in order to try and reach the required value. Shift+'F1-F10' Quick save a freeze game file. 'F1-F10' Quick load a freeze game file, restoring a game to an exact position. Alt or Ctrl+'F1' Save the state of the SPC700 sound CPU into a file called <romname>.spc. Separate programs are available that can load and then 'play' these state files. Ideal for 'ripping' music from a game and playing it at a later date. Alt/Ctrl+'F2' or 'F11' Load a game's saved position. Alt/Ctrl+'F3' or 'F12' Save a game's position. Alt/Ctrl+'F4' -> 'F11' Toggle sound channels on/off. Alt/Ctrl+'F12' Turn on all sound channels. Joystick Support ================ The Linux port makes use of the v1.x joystick kernel drivers written by Vojtech Pavlik (vojtech@ucw.cz) to allow the use of a wide varity of different joystick/joypad types to control SNES games. If you are still using the older versions of the drivers, you can download the latest driver version from http://atrey.karlin.mff.cuni.cz/~vojtech/joystick/ Refer to the documentation that comes with the drivers to enable support for your type of joystick/pad in Snes9x. Game Saving =========== Many SNES games could take a very long time to complete from start to finish so they allowed your progressed to be saved into RAM fitted inside the game pack; the RAM contents were backed up by a battery when the SNES was switched off or the game removed. Snes9x simulates this by saving the contents of the emulated battery-backed RAM into a file when you load a new game or exit Snes9x. The file is then automatically re-loaded the next time you play the game. Snes9x also provides freeze-files; these are files that saves a game's position at any point in the game, not just at predefined places chosen by the game's designers - ideal for saving your game just before a tricky bit! Snes9x provides 9 save slots; during a game, press Shift + F1 to F9 to save a game, and just F1 to F9 to load it again later. Freeze game files and Save-RAM (S-RAM) save files are normally read from and written to the directory $HOME/.snes96_snapshots. This can be changed by setting the environment variable SNES96_SNAPSHOT_DIR to point to a different directory. Snes9x uses its own unique format for freeze-files, as does ZSNES, but Snes9x can also load ZSNES format freeze-files. Just copy the ZSNES freeze files into your save directory and, if the native format Snes9x freeze file doesn't exist (<rom image name>.00X where X is a digit), Snes9x will try to load the corresponding ZSNES freeze file instead (<rom image name>.zsX where X is a 't' or a digit). Note the filename extension must be in lower-case. When you freeze a game position after loading a ZSNES format freeze file, Snes9x will save it in native Snes9x format. Netplay Support =============== Netplay support is currently disabled in this release of Snes9x. The code will be changed soon to match the newer netplay protocols used by the Windows port and released in a later version. Super FX ======== The Super FX is a 10/21MHz RISC CPU developed by Argonaut Software used as a game enhancer by several game tiles. Support is still a little buggy but most games work very well, if a little slowly. Released SNES Super FX games included Yoshi's Island (best single-player game on SNES, if you like platform games), Doom, Winter Gold, Dirt Trax FX, StarFox, Stunt Race FX and Vortex. If you're lucky, you might find a copy of the unreleased Starfox 2 image floating around, but its sound code is corrupt and you'll need to disable sound CPU emulation to play it. Lots of Super FX ROM images available are in an odd, interleaved format that I haven't worked out an easy way to auto-detect. If Snes9x detects that a Super FX game crashes (by executing a BRK instruction), it automatically assumes the ROM is in this odd format and de-mangles the ROM and tries to run it again. If your ROM image isn't working, you could try using the -i2 command line option. 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 and several real-time timers. Snes9X includes emulation of most features of the SA-1, enough to play all SA-1 games I've located so far, these include Mario RPG, Kirby Superstar and Paradius 3. C4 == The C4 is custom Capcom chip used only in the Megaman X2 and Megaman X3 games. It can scale and rotate images, draw line-vector objects and do some simple maths to rotate them. Snes9x's C4 emulation is a direct copy of the ZSNES C4 emulation; Intel-based ports even make use of ZSNES code. Without zsKnight's hard work, Snes9x would not have C4 emulation. Many thanks go to him. 3Dfx Support ============ Included in this release of Snes9x is stage 1 Voodoo 3d graphics card support. If you run gsnes9x and, it either has root permission or you install the 3dfx kernel driver module, snes9x will use the 3dfx card to scale and interpolate the SNES image to fill your whole monitor screen - the results look very nice. Downloading textures to Voodoo cards isn't particularly fast, and snes9x has to download each software rendered SNES image as a new texture every frame, so using the 3dfx in this way isn't as fast as you might expect or as fast as I'd hoped. However, there is hope. Stage 2 support in future Snes9x versions will dispense with the software rendering stage altogether, and get the 3dfx card to render each frame directly, removing the need to download a large texture each frame and speeding the whole process up; expect a large speed increase, especially when SNES translucency effects are also being used in a game. Stage 2 is now looking very unlikely that it will ever happen - my Voodoo 2 card is broken and my Voodoo 3 card causes my desktop machine to hang when another graphics card is in the AGP slot, so the Voodoo card is unplugged, gathering dust at the moment. Without access to a Voodoo card I can't develop any Glide software. Problems With ROMs ================== If the emulator just displays a black screen for over 10 seconds, then one of the following could be true: 1) Someone has edited the Nintendo ROM information area inside the ROM image and Snes9x can't work out what format ROM image is in. Try playing around with the ROM options: -i, -fl, -fh, -hd, -nhd. 2) The ROM image is corrupt. If you're loading from CD, I know it might sound silly, but is the CD dirty? 3) The original SNES ROM cartridge had additional hardware inside that is not emulated yet and might never be - e.g. Street Fighter Alpha 2 (S-DD1). 4) The game is Starfox 2 beta; the only available ROM image is correct and it downloads junk code onto the SNES CPU, crashing it. Disable sound emulation to get the ROM to work. The following ROMs are known not to work with any version of Snes9x: o All DSP-1 games except Mario Kart, e.g. Pilotwings, Ballz 3d, Topgear 3000 (incomplete DSP-1 emulation) o Street Fighter Alpha 2, Star Ocean (missing S-DD1 emulation) o Exhaust Heat2 (custom co-processor) o Metal Combat (OBC1) Sound Problems ============== No sound coming from any SNES game using Snes9x? Could be any or all of these: - Snes9x couldn't open the sound device (/dev/dsp) when it started (Snes9x should display an error message), a permissions problem, the device doesn't exist or some other process already has the sound device open. - The kernel doesn't support your sound hardware (Linux barely supports the sound card in my new laptop, I'm stuck with 8-bit sound only at the moment). - You haven't got the volume control on your speakers turned down, have you? General sound problems: - Sound samples keep repeating or don't switch off, especially ones that play lots of speech samples, try -envx (e.g. Mortal Kombat series) or -sy. - Sound quality is poor on all games. You have a noisy sound card (usually cheap cards) or one that Linux only supports at 8-bit; turning on interpolated sound (-is), sound-sync (-sy) and/or increasing the playback rate (-r 1-7]) will help. Note that sound-sync does not work very well with the thread sound option enabled due to real-time inter-thread timing problems with mutex locking. - Snes9x runs really slowly or locks up with sound enabled on all games. If you have a Sound Blaster Live card, enable thread sound (-ts): the sound card's beta Linux driver is broken and keeps reporting it can accept more sound data when in actual fact it cannot. Snes9x creates another thread to feed data to the sound card which doesn't lock up the SNES emulation when it is blocked trying to write more data to the card. - Sound in a few games sounds crackly. Try turning off sync-sound and/or interpolated sound - both seem to have problems with a few games. The following games have sound problems in all versions of Snes9x - they spool sound data between two CPU in real-time as the sound is playing: o Earth Worm Jim 2 o Primal Rage o Madden 94, 95, 96, ... o NHL 94, 95, ... o Weaponlord o Clay Fighter o Clay Fighter 2 Converting ROM Images ===================== If you have a ROM image in several pieces, simply rename them so their filename extensions are numbered: e.g. game.1, game.2, etc. Then, when loading the ROM image, just specify the name of the first part; the remaining parts will be loaded automatically. If they are already in the form sf32xxxa, sf32xxxb, etc., you don't even have to rename them; just specify the name of the first part, as above. Emulation speed =============== Emulating an SNES is very compute intensive, with its two or three CPUs, an 8 channel digital sound processor with real-time sound sample decompression and stereo sound, two custom graphics processors, etc. If you only have a 486 machine, you will need to stick to using only 8-bit graphics and minimal or no sound: With sound: snes9x -ne -r 1 -mono <rom filename> Without sound: snes9x -ns <ROM filename>. Disabling the joystick support will also help (-j). For maximum speed, if you're using the X Window System port, make sure your X server is set to depth 8 and transparency effects are not enabled, or your X server is set to depth 15 or 16 if you want transparency effects. If you want to use the TV mode (-y), switching to a full-screen display is usually fastest with the X server set to depth 15 or 16. Don't enable the scale option and don't resize the window on the X Windows port. Users with slower Pentium machines might want to turn off echo and digital FIR filter effects, due to the number of multiply operations needed to implement them. Use -ne option. Got a big throbbing beast of a CPU under the cover of your computer? These options will sort out the men from the boys: snes9x -y -sc -r 7 -sy <ROM filename> Credits ------- - Jerremy Koot for all his hard work on current and previous versions of Snes96, Snes97 and Snes9x. - Ivar for the original Super FX C emulation, DSP1 emulation work and information on both chips. - zsKnight and _Demo_ for the Intel Super FX assembler code. - zsKnight and _Demo_ for all the other ideas I've nicked off them; they've nicked lots of my ideas and information too! - DiskDude's SNES Kart v1.6 document for the Game Genie(TM), Gold Finger and Pro Action Replay cheat system information. - Lord ESNES for some nice chats and generally useful stuff. - Lee Hyde (lee@jlp1.demon.co.uk) for his quest for sound information and the Windows 95 icon. - Shawn Hargreaves for the rather good Allegro 3.0 DOS library. - Robert Grubbs for the SideWinder information - although I didn't use his actual driver in the end. - Steve Snake for his insights into SNES sound sample decompression. - Vojtech Pavlik for the Linux joystick driver patches. - Maciej Babinski for the basics of Linux's DGA X server extensions. - Alexander Larsson for the GGI Linux port code. - Harald Fielker for some sound interpolation code (not included in this release due to problems). - Takehiro TOMINAGA for many speed up suggestions and bug fixes. Nintendo is a trademark. Super NES, SuperScope and Super FX are a trademarks of Nintendo. Sun, Solaris and Sparc are all trademarks of Sun Microsystems, Inc. Game Genie is a trademark of Lewis Galoob Toys, Inc. MS-DOS and Windows 95 are trademarks of Microsoft Corp. Intel, Pentium and MMX are all trademarks of Intel Corp. Sony is a trademark of Sony Corp. UNIX is a registered trademark of X/Open. Glide is a trademark of 3Dfx Interactive, inc. ------------------------------------------------------------------------------ Gary Henderson gary@snes9x.com