Star Fox
This page is rather empty. More notes can be found at Data Crystal and the source for StelVulpo (a translation of the game into Esperanto).
Hacks
Star Fox: New Trainees (very WIP)
IPS for unheadered USA release, revision 0
A very simple hack that replaces Fox and Falco with Fay and Miyu from Star Fox 2. Right now it's just dialog and character portrait edits, nothing too fancy. In the future I'd like to update the title screen graphics and the sound effects, as well as make a variant where you play as Miyu instead of Fay.
Utilities
ROM Editor
Currently edits text used in the in-game dialog windows and the character portraits. Support for other graphics, text, level data, sound effects, etc. may or may not be implemented in the future.
Misc. Notes
Function locations
- $02/F147 - Clears $7F00 bytes of VRAM
- $02/FC4A - animates portrait mouths
- $03/E993 - reads text from ROM and displays it
- $03/EB0D - Moves text one line up for high 3-line text
- $03/EB4A - displays portrait (A=sprite ID)
- $03/B7E5 - adds SFX to queue (A=SFX ID)
- $1F/BE88 - Clear DMA buffer
- $7E/3303 - DMA transfer routine for character graphics on title
- $7E/40F9 - sound driver?
Graphics
Most, if not all, graphics are loaded via DMA. The RAM buffer used by DMA is located at $70/2800 (in low WRAM).
Some of the graphics data (pretty much everything not used in-game as a texture) is compressed. The compression format is a unique one that runs on the SuperFX chip. Lunar Compress can decompress this data using mode 14 (LC_LZ15).
Incomplete list of known graphics locations (taken in part from the source for StelVulpo)
ROM Offset | Compressed? | Format | Description |
---|---|---|---|
00D996 | No | 2BPP GB, VERTICAL | font for in-game text |
0A3EDA | No | 2BPP NGP, FC/NES x 16 | font for credits |
0A45A6 (or so?) | Yes | 8BPP Linear? | Various in-game textures |
0A60FE | Yes | 4BPP SNES | HUD, “STAGE” letters |
0A6272 | Yes | 4BPP SNES | font for enemy details |
0A728E | Yes | 4BPP SNES | continue? yes/no |
0A7456 | Yes | -- | continue tilemap |
0AD8C0 | Yes | 4BPP SNES | level map |
0B3334 | Yes | -- | level map tilemap |
0B8260 | Yes | -- | start screen tilemap |
0B93FC | Yes | 4BPP SNES | controller settings |
0B96A8 | Yes | -- | controller settings tilemap |
0B9AD8 | Yes | 4BPP SNES | star fox logo |
0B9C38 | Yes | -- | star fox logo tilemap |
0BB7A4 | Yes | 4BPP SNES | start screen |
0BC640 | No | 4BPP SNES | In-game character portraits |
0FB999 | Yes | 4BPP SNES | select training/game |
The Sound Queue
Located at $1F55 is a 16-byte sound queue. When a sound effect is played (voice chatter, Arwing collision, etc.) the sound ID is added to this. The easiest place to play around with this is on the control select screen, where pressing Select will play a sound. The function $03/B7E5, after checking the mute flag at $1FD1 and some other flags, fetches the last position used in the queue (X) from $1F4F, places the new SFX id in $1F55+X, and then increments the queue position. If the queue position is ever greater than $F, it wraps back around to 0. The sound driver compares this queue to a copy of the queue stored elsewhere. If the queue positions differ, it pulls the sound effect from the queue and plays it.
Text Rendering
A text pointer is loaded from ROM location $01FBB8+X, where X is the argument given to the function at $03/E993. The pointer points to text located at $010000+X. Text is word-wrapped at spaces. The longest a line can be before wrapping is 15 characters. There is technically no limit to how many lines a piece of text can be, but only 3 can be displayed. 3-line text is displayed a line higher than two-line text. This distinction is dictated by the first nybble of the first byte. Text is rendered twice, once in black and once in white, to give a drop-shadow effect. When text is displayed, a portrait of the speaker appears and their sound effect plays. This is dependent on the value of the second nybble of the first byte of the text data. For some period of time, the character's mouth will animate. After this, the mouth will remain closed. If the animation function call is removed, their mouth will remain open while they're speaking and then close afterwards. The sound effect to be played is stored at $03/EB32 + X. (I'm not sure offhand what valid values for X are.)