Super Game Boy
|Super Game Boy|
This game has unused code.
This game has a notes page
The Super Game Boy is a peripheral that's basically the internal components of a Game Boy shoved into a Super NES cartridge, which provides some enhancements like limited color support.
Four years later, Nintendo released the Super Game Boy 2 with some further improvements, such as link cable support. However, this version stayed in Japan.
- 1 Unfinished Speed Setting and Useful Features
- 2 Initial Border Setting
- 3 Super Game Boy 2 Changes
- 4 Music
- 5 Unfinished Sound Function
- 6 Unused Palettes
- 7 Unused Region Incompatibility Message
- 8 Unused Drawing Tools
- 9 Unused and Undocumented Commands
- 10 Debug Commands
- 11 Unused Graphics
- 12 Developer Credits
Unfinished Speed Setting and Useful Features
By setting the RAM address 7E0022?? to any non-zero value, or the ROM address 00BF4A85, menus and screensaver animations will play at double speed. Hold A to speed up the cursor, and hold B to enable a turbo function on the A button. Depending on how late in startup the code was enabled, graphical glitches may ensue. 7E0022?? is written to twice during startup and constantly when in-game to check if the bit is set. Either this was used for debugging purposes or it was a legitimate in-game feature that was left unfinished due to button mapping issues, though using L and R would have been fine for the menus. This only affects menus; gameplay is unaffected.
It might also have been intended for a command that would allow proper menu navigation for games that rely heavily on palettes, or even a separate command altogether.
Initial Border Setting
If RAM variable 7E0022 is set to a non-zero value, only the default Super Game Boy will load; neither the other preset borders nor custom ones for individual games will load. This may have been used to test the PCT_TRN command.
Super Game Boy 2 Changes
|This needs some investigation.|
Discuss ideas and findings on the talk page.
Specifically: I think I've heard these tunes before... but not in the SGB1/2. Find out what songs these are clones of, please.
The original Super Game Boy uses a swing-esque song for its credits theme, while the Super Game Boy 2 uses a rock-and-roll theme.
|Super Game Boy||Super Game Boy 2|
Some added features:
- Link Cable support.
- Some new borders were added.
- LED indicator lights.
- The clock speed is slowed down to match that of an actual Game Boy; the first Super Game Boy's clock speed (and consequentially any games being played on it) ran slightly faster than a Game Boy's due to the clock speed being based on the SNES master clock.
The credits theme is padded from 02-0F, but only 02 is used. This is necessary to allow games with Super Game Boy soundtracks to store more than two songs in ARAM (temporarily overwriting data in the Super Game Boy sound bank), preventing the APU from crashing when more than two are stored. Pressing X to switch palette settings in-game sets the song to address 00FA39?? 00FA2F00 00FA3B44 (where "??" is 00-0F, varying per game and bank). Setting the music byte to either FE or FF will stop all Super Game Boy audio.
The GB Memory cartridge sets FF right before making the JUMP to the selected game, so these settings are likely used to prepare the APU for the new SNES program code.
Unfinished Sound Function
Pressing X to swap between custom and default palettes plays a glass shattering sound effect. An unfinished function exists that assigns each of the 34 palette settings one of the 48 Super Game Boy sound effects. These sound effect effects can all be heard in sound tests for a handful of games, like Real Bout Special (Fatal Fury) and Nettoh Beast Wars.
SNES PAR code 00FA2EF0 00FA2C?? re-enables this feature. Setting the bit to 03 will play the first 34 sounds, while setting the bit to 01 will play the rest of the sounds starting from palette column 1.
Unused Balloon Kid Palette Table Entry
As documented over on the Notes page, the Super Game Boy applies a predetermined palette to a number of pre-SGB, monochrome Game Boy games. These aren't truly unique palettes, but rather chosen from the standard palettes available for selection by the user. However, unlike the many other Nintendo-published games, Balloon Kid does not have a quasi-unique palette applied automatically, because its entry in the palette table is for the Game Boy ROM with internal name BALLôôN KID instead of BALLOON KID. Even if the palette assignment were to be active, this entry simply assigns the default palette. Perhaps a suitable palette could not be found, or the default palette was felt to look best, and so manually assigning one was unnecessary. Regardless, Balloon Kid looks the same with or without this palette table entry.
Custom Palette Test Palette
Leaving the custom palette at default will cause a test palette to appear. SNES PAR code 0081A705 00D04721 will cause any game that uses the default 1-A palette to display this unused palette instead. Creating a custom palette will replace the default setting for the duration of the game.
Unused Region Incompatibility Message
This message appears in the first Japanese revision of the Super Game Boy BIOS when attempting to play the cartridge on a PAL SNES. The text for this screen can be found at 0x3F98A.
SNES PAR code 0081D806 or Game Genie code D162-04DD will start up all later Super Game Boy 1 and 2 BIOS revisions at this screen. Since the Game Boy isn't region-locked, Nintendo probably felt this screen was unnecessary, so it was scrapped. The screen was also never updated to use the Super Game Boy 2's rainbow font.
Unused Drawing Tools
Pro Action Replay code 7E01820D enables an otherwise-unused blue-green crayon that comes in miniature and huge sizes! An icon fitting the palette scheme also exists.
Unused and Undocumented Commands
Several Super Game Boy command packets were never used by any commercially-released game, or never seem to have an actual effect on gameplay. Interestingly enough, roughly 60% of all Super Game Boy enhanced games have all of the commands in some form in their code at least, likely remnants of a tech demo or an SDK devkit. Wario Land II is notable for having a completely unused sound table listing.
Super Game Boy 2
Alternate enhancements can be given to games when played using a Super Game Boy 2 adapter, done by examining the internal value of the CPU's A register on start-up: 01 is for normal Game Boy or Super Game Boy and FF denotes Super Game Boy 2. Tetris DX is the only known example, displaying an alternate border.
Unused ICON_EN File Register Disable Function
A feature to disable files from being sent to the SGB BIOS with the *_TRN command exists, but is never used by any game. It can be accessed by setting bit 01 to 04, or using SNES PAR code 7E0F0704. Attract-specific attributes will not work, so only four palettes will be shown on the screen.
TEST_EN (Test Enable)
Code 0D, command 69. It speeds up the inserted game to twice normal, resulting in graphical glitches and potentially game crashes. The TEST_EN packet is disabled by default (bit set to 00). Mini 4 Boy II calls TEST_EN during startup, though the bit 01 is never set, so nothing actually happens. World Jet Heroes 2 has been said to enable TEST_EN through using the Turbo Mode cheat, though the game merely speeds up.
The official Super Game Boy NOA/NOE programming document actually defines TEST_EN as "Use prohibited"; its actual function is not explained anywhere except in the Japanese documents. This is likely the case because a programming glitch in the first revision of the Super Game Boy BIOS is present where the command points to a RET instruction.
This command's handler is a stub in at least the SGBv2 ROM, therefore it does absolutely nothing.
OBJ_TRN (Object Transfer)
Code 18, command C1. Displays up to 24 entries of scrollable 8×8 or 16×16 SNES objects on the screen using a palette of up to 256 colors.
Real Bout Special Fatal Fury and Bomberman Quest both call OBJ_TRN, even though neither game loads data into the SNES VRAM. Pokonyan! Yume no Daibouken and Pocket Love 2 had the initial idea to use objects for the title screen during development, but aside from a few traces of data, this feature was dropped. CHR for the completed title screen in Monster Rancher Battle Card GB exists.)
When SNES object mode is enabled, screensavers are disabled, giving the same effect as the command ATRC_EN with bit 01 set to 01. This is likely because the SNES's CPU speed would be heavily invested in drawing and reading the objects from the game.
Like TEST_EN, the official NOA/NOE Super Game Boy programming document defines this feature as "use prohibited". Understandable, since it would task both the SNES and Game Boy CPUs. Practically speaking it would be most useful for title screens and cutscenes, since the bottom part of the Game Boy screen would be used to transfer object data as well.
The command's handler is stubbed on SGBv2 and SGB2, therefore it does nothing on both of these versions. A lot of games using Nintendo's SDK (for example, Pokémon Red/Blue) transfer a patch to disable the functionality.
Here are the unused OBJ_TRN caveats.
Byte: Setting: 0 Command*8+Length (fixed length=1) 1 Control Bits Bit 0 - SNES OBJ Mode enable (0=Cancel, 1=Enable) Bit 1 - Change OBJ Colour (0=No, 1=Use definitions below) Bit 2-7 - Not used (zero) 2-3 System Colour Palette Number for OBJ Palette 4 (0-511) 4-5 System Colour Palette Number for OBJ Palette 5 (0-511) 6-7 System Colour Palette Number for OBJ Palette 6 (0-511) 8-9 System Colour Palette Number for OBJ Palette 7 (0-511) Palette entries are ignored if control bits above 1 are set to 0. Because each OBJ palette consists of 16 colours, four system palette entries (of 4 colours each) are transferred into each OBJ palette. Specific system palette numbers are not required to be a multiple of 4 and will wrap to palette number 0 when above 511. For example, a value of 511 would copy system palettes 511, 0, 1, and 2 to the SNES OBJ palette. A-F Not used (zero)
The recommended method is to "display" Game Boy BG tiles from F9h-FFh left to right as the first 7 characters of the Game Boy's bottom character line. As for normal 4KByte VRAM transfers, this area should not be scrolled, should not be overlapped by Game Boy OBJs, and the Game Boy GBP palette register should be set up to avoid conflicting with the normal in-game palettes. SNES OAM data can be defined in the 70h bytes of the Game Boy BG tile memory at following addresses:
8F90-8FEF SNES OAM, 24 Entries of 4 bytes each (96 bytes) 8FF0-8FF5 SNES OAM MSBs, 24 Entries of 2 bits each (6 bytes) 8FF6-8FFF Not used, don't care (10 bytes)
The format of SNES OAM entries are:
Byte 0 OBJ X-Position (0-511; MSB is separately stored, see below) Byte 1 OBJ Y-Position (0-255) Byte 2-3 Attributes (16bit) Bit 0-8 Tile Number (use only 00h-FFh, upper bit zero) Bit 9-11 Palette Number (use only 4-7) Bit 12-13 OBJ Priority (use only 3) Bit 14 X-Flip (0=Normal, 1=Mirror horizontally) Bit 15 Y-Flip (0=Normal, 1=Mirror vertically)
The format used for SNES OAM MSB entries is unknown. However, 2 bits are used per entry: one bit is the most significant bit of the OBJ X-Position, and the other specifies the OBJ size (8×8 or 16×16 pixels).
19 Undocumented Command
But what does it do? Also, investigate other undocumented commands on other SGB revisions.
Donkey Kong '94 sends the SGB a command with ID 19. This command appears to be the only undocumented command whose handler is not stubbed (at least on SGBv2).
Fx Command Group Used by The SGB Boot ROM
The undocumented, odd-numbered Fx commands F1, F3, F5, F7, F9 and FB are used by the internal boot ROM in the Game Boy CPU for transferring the cartridge header data to the SGB BIOS on startup. The SGB BIOS then validates the cartridge header to determine whether the cartridge is allowed to run, and whether the SGB functionality will be enabled.
These commands seem to depart from the usual command structure of specifying the command code in the upper 5 bits of the first byte, and the length of the transfer in the lower 3 bits. Instead, as used by the boot ROM, they are sent sequentially as individual 16 byte packets and the lower 3 bits do not indicate the number of packets to be sent. Perhaps for these particular commands, the top 7 bits denote the command code, and the lowest bit denotes the length? Each packet has the following structure:
Byte 0 Command number. Byte 1 Checksum of the packet. (lower 8 bits of the sum of bytes 2-F) Byte 2-F 14 data bytes to be transferred.
The SGB boot ROM transfers bytes 0104-014F, which is 76 bytes. The SGB boot ROM transfers 14*6=84 bytes, and the last 8 bytes in the transfer are zero-padded.
Here is example output from the SGB boot ROM, when starting Tetris DX. Captured using BGB's SGB packet monitor.
1 1E unknown F1.70.CE.ED 66.66.CC.0D 00.0B.03.73 00.83.00.0C 1 1E unknown F3.60.00.0D 00.08.11.1F 88.89.00.0E DC.CC.6E.E6 1 1E unknown F5.59.DD.DD D9.99.BB.BB 67.63.6E.0E EC.CC.DD.DC 1 1E unknown F7.5C.99.9F BB.B9.33.3E 220.127.116.11 18.104.22.168 1 1F unknown F9.45.58.00 00.00.00.00 00.80.30.31 03.03.04.02 1 1F unknown FB.2B.00.33 00.30.C8.00 00.00.00.00 00.00.00.00
If a game sends the F5 after it has been booted, it makes the palettes and sounds start cycling. The video at right shows an example of this effect using Pro Mahjong Kiwame GB and Game Genie code F6F-C8C-E6F. Try entering VS mode to trigger the command.
Investigate other SGB revisions: SGBv0, SGBv1, and SGB2.
The SGBv2 firmware, after booting, explicitly discards these commands (commands with ID greater than $1D are ignored, so both $1E and $1F), and all commands with IDs greater than $19 have stub handlers and thus do nothing.
A few debug commands remain, presumably intentionally since the Super Game Boy Commander controller makes use of them. It is impossible to enter these codes by hand, as button presses are read at precisely 25ms.
Speed Setting 1
During gameplay, press L, R, R, L, L, R to set the DMG CPU speed to Slower (~2.37mhz per cycle), Slow (~3.05mhz per cycle), and finally Normal ( ~4.3mhz per cycle).
Speed Setting 2
Hold Up on the D-PAD during startup, and then press L, R, R, L, L, R during gameplay to set the speed to Faster (~5.35Mhz per cycle; will result in graphical glitches), Slower (~2.37mhz per cycle), Slow (~3.05mhz per cycle), and Normal (~4.3mhz per cycle).
Press R, L, L, R, R, L to mute all sound from the BIOS and game. Press R, L, L, R, R, L again to restore sound. Muting and unmuting while an enhanced song plays will turn it off until a new song is played or the current song is reset. Programs running directly off the Super Game Boy, like Space Invaders, won't be muted. This also affects the credits screen if the volume is muted.
Loaded with the main in-game menu. Could have been used for anything.
Loaded with the main in-game menu. Might have been an "undo" or "return to default settings" icon.
Loaded along with the custom palette and graffiti tiles is what looks like an early background for the easel.
A staff roll can be seen by pressing L x3 R x3, L x3, R x7 when the Super Game Boy logo appears. This works best when there's no cartridge inserted. The SGB 2 ROM contains both staff rolls, but only uses the one for the SGB 2.However, after the texts for the staff rolls, there's a small compile date that goes used. The SGB has
94!03!06 17:30, while the SGB 2 has