Mario Kart 64
|Mario Kart 64|
This game has unused code.
This game has a notes page
This game has a bugs page
This game has a prerelease article
prototype and partial source code from 2020-07-25 Nintendo leak
Mario Kart 64 basically takes all the wishes and feature requests from Super Mario Kart and makes them come true. Four players! Tunnels! No Koopa Troopa! All good stuff. Except that last one, clearly.
- 1 Debug Menu
- 2 Crash Debug Screen
- 3 Unused Code
- 4 Unused Graphics
- 5 Misplaced Item Boxes
- 6 Hidden Music Loop
- 7 Debugging Text
- 8 Version Differences
This game contains a debug menu; to enable it, use one of these GameShark codes and press L+Z at the title screen.
|Japan V1.0||D10F73C4 2020|
|Japan V1.1||D10F61B4 2020|
|Europe V1.0||D10F6A54 2020|
|Europe V1.1||D10F6974 2020|
- DEBUG_MODE activates key combinations during play:
- L+R+A+B: Reset game.
- R+B: Toggle CPU meter.
- Left: Advance player 1 and everyone behind them to final lap.
- Down: Advance everyone to final lap.
- Up: Advance player 1 and one other to final lap.
- Z or C-Down can be pressed during the race start sequence to start early. This will glitch the game if done too soon.
- MAP_NUMBER selects the track. Available are the 16 single-player tracks plus the four tracks from battle mode.
|0 M CIRCUIT||Mario Raceway|
|1 MOUNTAIN||Choco Mountain|
|2 CASTLE||Bowser's Castle|
|3 GHOST||Banshee Boardwalk|
|4 MAZE||Yoshi Valley|
|5 SNOW||Frappe Snowland|
|6 BEACH||Koopa Troopa Beach|
|7 P CIRCUIT||Royal Raceway|
|8 L CIRCUIT||Luigi Raceway|
|9 FARM||Moo Moo Farm|
|10 HIGHWAY||Toad's Turnpike|
|11 DESERT||Kalimari Desert|
|12 SHERBET||Sherbet Land|
|13 RAINBOW||Rainbow Road|
|14 STADIUM||Wario Stadium|
|15 BLOCK||Block Fort|
|17 DECK||Double Deck|
|18 JUNGLE||D.K.'s Jungle Parkway|
|19 DOUGHNUT||Big Donut|
- SCREEN_MODE selects the screen mode, and thus the players that participate. Available values are 1 player, 2 player up/down, 2 player left/right, 3 players and 4 players. The two player left-right view is never used in the final game, and is somewhat glitchy.
- PLAYER selects the first player. If you have more than one player, the game assumes Luigi for player 2, Yoshi for player 3 and Toad for player 4.
- SOUND MODE simply selects the sound mode (mono, headphones, stereo).
- PUSH B TO GET ALL GOLDCUP is fairly self-descriptive. This option only appears when the cursor is moved all the way to the bottom.
Note that if you try to start a one-player game on a battle map, the game will automatically add a second player.
XXX Sound Mode
GameShark code switches the sound mode to "XXX" on the debug menu and blank in the Options menu. Its purpose is not known.
|Japan V1.0||8018C812 0002|
|Japan V1.1||8018B5C2 0002|
|Europe V1.0||8018EF33 0002|
|Europe V1.1||8018EE52 0002|
|Debug Menu||Options Menu|
CPU and Graphic Display
When Debug Mode is enabled, the following GameShark codes can be used:
- Debug Mode Enabled.
|Japan V1.0||800DCDF1 0001|
|Japan V1.1||800DBD31 0001|
|Europe V1.0||800DC5B1 0001|
|Europe V1.1||800DC541 0001|
- Shows which master display list is currently in use.
|Japan V1.0||800DCDE5 0001|
|Japan V1.1||800DBD25 0001|
|Europe V1.0||800DC5A5 0001|
|Europe V1.1||800DC535 0001|
- Shows bars at the bottom measuring CPU usage of the video (red), audio (yellow) and game logic (orange) threads.
|Japan V1.0||800DCF31 0001|
|Japan V1.1||800DBE71 0001|
|Europe V1.0||800DC6F1 0001|
|Europe V1.1||800DC683 0001|
While the CPU meter is enabled, pressing L+R toggles a flag at 800DC664, but this flag doesn't seem to be accessed anywhere else. (This is done at 80004098.)
The following code activates a frame-by-frame advance mode if Debug Mode is enabled:
When the game is paused, player 1 can hold A and B and press L to advance a frame. This unfortunately conflicts with using A to unpause the game; you must hold A before pausing. Alternatively, adding the code 81001784 2400 makes it require only holding B and pressing L while paused.
Crash Debug Screen
If the game crashes, it will draw a small white square with red border near the upper left corner of the screen. At that point, entering the code L, Up, Left, Down, Right, R, L, B, A will display some information about the cause of the crash.
The first line displays three numbers - first is unknown (usually 5, probably thread ID), second is the address of the faulty instruction, third is the exception code (as defined in the R4300i manual). The second line displays the $RA register. The third line is the opcode of the faulty instruction.
The GameShark code 810DC6FE FFFF will shorten this code to simply "press L".
This display cannot be seen on most emulators, as most plugins don't seem to continue redrawing the screen after the game crashes.
Supposedly there's some coding that allows A.I. racers to drift.
Track Scaling Function
Next to the mirror mode flag in memory (address 800DC608 in USA version) is a floating-point value that appears to always be set to 1.0. When a track is loaded, its height is scaled by this amount. (All polygon vertices are multiplied by this value.) Use one of the below GameShark codes to activate this feature. (default value 3F80)
|Japan V1.0||810DCED8 ????|
|Japan V1.1||810DBE18 ????|
|Europe V1.0||810DC698 ????|
|Europe V1.1||810DC628 ????|
This value only affects track polygons, and hit detection is not altered to compensate for the steeper hills and/or shorter vertical walls, so changing it often produces unplayable tracks and strange effects such as floating trees, low areas being considered underwater/out of bounds, and walls that are no longer solid.
No similar scaling functions exist for the X and Z axes. This may have been intended as a debugging function to test slopes, or a bonus mode that would scale tracks to various sizes.
This unused vertical splitscreen display for 2-player mode is only accessible via the Debug Menu or by using the following GameShark code below that forces the horizontal splitscreen mode to the vertical splitscreen mode when selecting a 2-player game:
|Japan 1.0||D00DCE03 0001|
|Japan 1.1||D00DBD43 0001|
|Europe 1.0||D00DC5C3 0001|
|Europe 1.1||D00DC553 0001|
It's pretty clear why this isn't accessible normally: it's unfinished. The lap counter still displays in Battle Mode, the map goes over the second player's lap counter, and the V's and E's only appear when you're close to the camera.
This feature can be seen in some very early footage of the game from when it was known as Super Mario Kart R.
Lightning in Battle Mode
When used in Battle Mode, the Lightning Bolt makes all other players lose one balloon; however, it isn't normally possible to obtain this item, likely because it would have made battles horribly unbalanced. Code that specifically handles the Lightning Bolt's effects in Battle Mode can be found around 8008E0FC in RAM.
An unused multiplayer feature that warns players when they approach the moving bombs on the track. This can be seen in an early screenshot but was disabled in the final game. It can be re-enabled by using the GameShark codes:
Start up a 3 or 4 player versus race then once in game, press C-Left once and drive near a bomb and then press C-Right until you see the bomb icon.
Feather Jump State
The player-state code contains flags indicating whether "large feather jump state" and "small feather jump state" are active. This can be activated by setting the state at 0x0F699E (NTSC-U) to 0x10 to trigger a small feather jump or by setting the state at 0x0F699D (NTSC-U) to 0x02 for a large feather jump with a slower floating animation. The feather item from Super Mario Kart wasn't included in the final game, though it can be seen in certain prerelease material.
CPU Shell Code
The game contains six tables that determine the item probabilities when hitting an item box. The first two tables are both for GP mode and determine item probabilities for a human player and a CPU player, respectively. According to the latter, CPU players have a certain chance to get Green Shells, both the single and the triple variety, but the CPU never uses shells at all, so this isn't actually ever seen in gameplay.
Among the menu graphics are two unused options, untranslated from Japanese:
Bomb Warning Icon
The bomb warning icon that shows when you're close to the moving bombs.
Early Traffic Light
An early version of the traffic light.
4 Player HUDs for the multiplayer modes.
While these two sprites are technically used while Monty is preparing to spring out of its hole, the player never sees the lower body while Monty is standing still.
The bottom part of this texture cannot be seen, as the sign is too small to have the full texture. The full sign can be seen in some prerelease material.
Misplaced Item Boxes
Hidden underneath the Big Donut arena are two misplaced item boxes. These item boxes can be seen by getting the camera behind the green bars and waiting, eventually the two item boxes will float up into view.
Hidden Music Loop
The "Winning Results" track was likely intended to alternate between two ~100 second sections of music, each composed of a 50-second segment repeated twice. Due to a binary counter bug, the first segment repeats, incidentally, 64 times (for 54 minutes and 39 seconds!) before the second segment ever has a chance to play—at which point it repeats twice and correctly returns to the first segment.
Most of this text probably would have been spat out to a debug console on development systems, but goes unused in the final game.
Terminate-Canceled Channel %d,Phase %d Copy %d %d->%d pitch %x: delaybytes %d : olddelay %d cont %x: delaybytes %d : olddelay %d Warning:Kill Note %x Kill Voice %d (ID %d) %d Warning: Running Sequence's data disappear! Audio:Memory:Heap OverFlow : Not Allocate %d! Audio:Memory:DataHeap Not Allocate StayHeap Not Allocate %d AutoHeap Not Allocate %d Status ID0 : %d ID1 : %d id 0 is Stopping id 0 is Stop id 1 is Stopping id 1 is Stop WARNING: NO FREE AUTOSEQ AREA. WARNING: NO STOP AUTO AREA. AND TRY FORCE TO STOP SIDE Check ID0 (seq ID %d) Useing ... Check ID1 (seq ID %d) Useing ... No Free Seq area. CH %d: ID %d TWO SIDES ARE LOADING... ALLOC CANCELED. WARNING: Before Area Overlaid After. WARNING: After Area Overlaid Before. MEMORY:SzHeapAlloc ERROR: sza->side %d Audio:MEMORY:SzHeap Overflow error. (%d bytes) Auto Heap Unhit for ID %d Heap Reconstruct Start %x AHPBASE %x AHPCUR %x HeapTop %x SynoutRate %d / %d FXSIZE %d FXCOMP %d FXDOWN %d WaveCacheLen: %d SpecChange Finished Fbank Seq %x Already Load Type %d,ID %d Warning:Emem Over,not alloc %d Write %d Romcopy %x -> %x ,size %x Romcopyend CAUTION:WAVE CACHE FULL %d LOAD Rom :%x -> Ram :%x Len:%x BASE %x %x LOAD %x %x %x INSTTOP %x INSTMAP %x already flags %d ERR:SLOW BANK DMA BUSY ERR:SLOW DMA BUSY Check %d bank %d Cache Check NO BANK ERROR BANK %d LOADING START BANK %d LOAD MISS (NO MEMORY)! BANK %d ALREADY CACHED BANK LOAD MISS! FOR %d Seq %d Loading Start Heap Overflow Error SEQ %d ALREADY CACHED Ok,one bank slow load Start Sorry,too many %d bank is none.fast load Start Seq %d:Default Load Id is %d Seq Loading Start Error:Before Sequence-SlowDma remain. Cancel Seq Start. SEQ %d ALREADY CACHED Clear Workarea %x -%x size %x AudioHeap is %x Heap reset.Synth Change %x Heap %x %x %x Main Heap Initialize. ---------- Init Completed. ------------ Syndrv :[%6d] Seqdrv :[%6d] audiodata :[%6d] --------------------------------------- Audio: setvol: volume minus %f Audio: setvol: volume overflow %f Audio: setpitch: pitch minus %f Audio: voiceman: No bank error %d Audio: voiceman: progNo. overflow %d,%d Audio: voiceman: progNo. undefined %d,%d Audio: voiceman: No bank error %d Audio: voiceman: Percussion Overflow %d,%d Audio: voiceman: Percussion table pointer (bank %d) is irregular. Audio: voiceman: Percpointer NULL %d,%d --4 %x Stoped Voice CAUTION:SUB IS SEPARATED FROM GROUP Error:Wait Track disappear Slow Release Batting Audio:Wavemem: Bad voiceno (%d) Audio: C-Alloc : Dealloc voice is NULL Alloc Error:Dim voice-Alloc %d Error:Same List Add Already Cut Audio: C-Alloc : lowerPrio is NULL Sub Limited Warning: Drop Voice Warning: Drop Voice Env-Clear 0 Audio:Envp: overflow %f Audio:Track:Warning: No Free Notetrack SUBTRACK DIM Audio:Track: Warning :SUBTRACK had been stolen by other Group. SEQID %d,BANKID %d ERR:SUBTRACK %d NOT ALLOCATED Error:Same List Add Macro Level Over Error! WARNING: NPRG: cannot change %d Audio:Track:NOTE:UNDEFINED NOTE COM. %x Audio: Note:Velocity Error %d Error: Subtrack no prg. ERR %x Error: Your assignchannel is stolen. Audio:Track :Call Macro Level Over Error! Audio:Track :Loops Macro Level Over Error! SUB:ERR:BANK %d NOT CACHED. Audio:Track: CTBLCALL Macro Level Over Error! [%2x] Err :Sub %x ,address %x:Undefined SubTrack Function %x Disappear Sequence or Bank %d Group:Undefine upper C0h command (%x) Group:Undefined Command Error : Queue is not empty ( %x ) specchg error ***** CAM MAX %d ***** entryout !!! %d AFTER GOAL VOICE FLAME %d *** Pause On *** *** Pause Off *** CALLED!! Na_ChangeSoundMode player %d CALLED!! Na_ChangeSoundMode spec %d Interfaced Spec Change player %d Interfaced Spec Change spec %d FX MIX %d ************** Seq Fadeout *************** SEQ FADE OUT TIME %d DAC:Lost 1 Frame. DMA: Request queue over.( %d ) DMA [ %d lines] TIMEOUT Warning: WaveDmaQ contains %d msgs. Audio:now-max tasklen is %d / %d Audio:Warning:ABI Tasklist length over (%d) AudioSend: %d -> %d (%d) Undefined Port Command %d (num %d) (rank %d) (e_rank %d) (num %d org_bipas %d bipas %d) (%d) rap %3d rate_count_F %10.2f rap_count_F %10.2f area %5d enemy %d (%d --> %d) enemy voice set (%d slip_flag %x weapon %x) (%d , name %d) ===== ENEMY DRIVE SUB (%d) ===== ENEMY END (1)enemy stick angle over!! (%d) (2)enemy stick angle over!! (%d) ENEMY END AREA ERR!!! %d AREA ERR!!! SOUTH EAST NORTH WEST get_oga_area_sub_BP() ... (b_num = %d) (%d, %d, %d) <%d> (%d, %d, %d) [%d] lng %f (area %d, y %7.2f) (num %d: area %d ) (%d,%d,%d) (num %d: area %d ==>%d) (group %d) (%d,%d,%d) BOM(%d) (%7.2f, %7.2f, %7.2f) BOM HIT CHECK BOM HIT !!!!! (%d) RESULT BOM area(%d) BOM SET (TABLE IS FULL) (category %d) MAP NUMBER %d center_EX ptr = %x %x (%x) center_BP[%d] ptr = %x %x (%x) side_point_L_BP[%d] ptr = %x %x (%x) side_point_R_BP[%d] ptr = %x %x (%x) curve_BP[%d] ptr = %x %x (%x) angle_BP[%d] ptr = %x %x (%x) short_cut_data_BP[%d] ptr = %x %x (%x) CENTER LINE (map:%d) ROM center (BP%d) line adr. = %x (%x) center (BP%d) line adr. = %x (%x) BP center_point_number : %d (%d -> %d) extern POINT rom_center_KT area read from ROM (%d) (num %d, act %d) (num %d, act %d, old_act_num %d) SL: center_point_number : %d SL: CENTER LINE SHIP: center_point_number : %d SHIP: CENTER LINE (num %d, permit %d, %d) OGA CAMERA INIT (%d) OGA CAMERA INIT END ERR !!! (ncx = %f) ERR !!! (ncz = %f) ERR !!! (ecx = %f) ERR !!! (ecz = %f) OGA DRIVERS POINT CAMERA MODE OGA WINNER CAMERA MODE OGA TIMEATTACK QUICK CAMERA INIT OGA BATTLE CAMERA INIT win(%d) GOAL! <<rank 1>> camera %d rank %d GOAL! <<rank 2,3,4>> camera %d rank %d GOAL! <<rank 5,6,7,8>> camera %d rank %d <<< ITEM OBJ NUMBER ERR !! >>> item %d obj_num %d <<< BANANA SET >>> obj_num %d zure %f BANANA EXISTOBJ category sparam num BANANA HOLD (num %d time %d hold_time %d) <<< BANANA NAGE SET >>> obj_num %d BANANA NAGE MOVE BANANA NAGE END G_SHELL HOLD (num %d time %d hold_time %d) <<< G_SHELL SET >>> obj_num %d <<< G_SHELL SET >>> object_count %d G_SHELL R_SHELL HOLD (num %d time %d hold_time %d obj_num %d) <<< R_SHELL SET >>> obj_num %d <<< R_SHELL SET >>> object_count %d R_SHELL R_SHELL SHOOT (num %d time %d hold_time %d obj_num %d) S_BANANA HOLD (num %d time %d hold_time %d) <<< SUPER_BANANA SET >>> obj_num %d <<< SUPER_BANANA SET >>> object_count %d S_BANANA S_BANANA RELEASE (num %d time %d ) <<< FAKE IBOX SET >>> obj_num %d IBOX FBOX HOLD (num %d time %d hold_time %d) START (%d) END (%d) map_number = %d - > 20 OGA Move OGAWA DEBUG DRAW S_MARIO S_LUIZI S_YOSSY S_KINOP S_DONKY S_WARIO S_PEACH S_KUPPA J_MARIO J_LUIZI J_YOSSY J_KINOP J_DONKY J_WARIO J_PEACH J_KUPPA debug_mode on off map_number screen_mode player sound mode push b to get all goldcup effectcount < 0 !!!!!!(kawano) MAX effectcount(760) over!!!!(kawano)
| Audio Differences|
LOTS of audio was changed from the Japanese version.
It'd help if someone could rip the graphics that aren't here yet.
The billboards in the Japanese version are all clever parodies of real-life companies. They were (mostly) changed during localization because this would have gotten Nintendo of America in hot water.
The iQue version's billboards are based on the international designs, with the exception of the "Shot!" billboard, which was replaced with the iQue logo.
Marioro (a pun on Marlboro) was changed to Mario Star.
Luigip (a pun on Agip) was changed to Luigi's, itself appearing to be a parody of the now-defunct Bradlees chain of discount stores.
Yoshi1 (a pun on Mobil1) was changed to Yoshi, with a pawprint similar to the one added to English versions of Super Mario World.
The Koopa Air sign is colored yellow and blue in the Japanese version (a pun on Goodyear). It's white and violet in international versions.
The Nintendo logo billboard is blue in the Japanese version and red internationally, reflecting its most common depictions in each region.
The orange 64 ball in Luigi's Raceway (a parody of the 76 gas station) was changed to blue and the 64 was given a different design.
Since none of the track preview icons were updated, the orange ball can however still be seen on the track preview even in international versions. In Mario Kart 7's version of the track, the ball was changed to yellow, but is otherwise based on its Japanese design.
The Luigip and Yoshi1 billboards can still be seen in the icon for Mario Raceway and the Yoshi1 billboard in Royal Raceway's icon.
The Japanese version has collision on the grass above the tunnel on Luigi's Raceway, which can be reached by bouncing off another racer and flying over the wall. The collision was removed in international versions so trying the same there just leads to you falling into the tunnel (or out of bounds, if unlucky).
Moo Moo Farm
The course "Moo Moo Farm" is called "Moh Moh Farm" in Japan. This is because mooing in Japanese is pronounced with a long "O" sound, which sounds like "moh moh".
The trophy ceremony in the Japanese version displays the text "You are in (position)". The international versions change this to "You placed (position)". The punctuation was also removed, and the position itself is made purple.
The course ghost text is different depending on the region.
Courses have different names depending on the region.
|Luigi Circuit||Luigi Raceway|
|Moh Moh Farm||Moo Moo Farm|
|Noko Noko Beach||Koopa Troopa Beach|
|Kara Kara Desert||Kalamari Desert|
|Kinopio Highway||Toad's Turnpike|
|Mario Circuit||Mario Raceway|
|Peach Circuit||Royal Raceway|
|Koopa Castle||Bowser's Castle|
|Donkey Jungle Park||DK's Jungle Parkway|
|Hyūdoro Lake||Banshee Boardwalk|
|Big Donuts||Big Donut|
|Block Toride||Block Fort|
In the Japanese version, completing the Special Cup on 150cc will display a Japanese-language version of the credits. This was removed from the English version for obvious reasons.
Additionally, the Japanese version has six voice actors, while the English version only has three. Charles Martinet (the voice of Mario) is the only one to be credited in both versions. Additionally, his name is misspelled as "Charles Martinee" in the Japanese version. Thomas Spindler (the voice of Wario) and John Hulaton (the announcer) also have their names misspelled.
Wii Virtual Console Differences
Although the Wii Virtual Console releases use the exact same ROMs as the cartridges, some minor visual differences exist due to emulation errors and in-memory patches. These changes are not present in the Wii U Virtual Console release.
|Nintendo 64||Wii Virtual Console|
- The color scheme for the train in Kalimari Desert was changed.
|Nintendo 64||Wii Virtual Console|
- The waterfall on Koopa Troopa Beach is a brighter blue instead of grey.
- The characters/numbers of the timer are spaced out by 1 pixel.
- The flash from using lightning was toned down to avoid risk of seizures.
iQue Player Differences
The game was released in China for the iQue Player in December 2003. Like most games for the system, it is based on the international version.
- The game's title was changed from Mario Kart 64 to just Mario Kart.
- The Special Cup was renamed to "iQue Cup".
- The 64 ball now has a square instead of "64" on it.
- The "Shot!" billboard was replaced with an iQue billboard.
- The billboards have been translated.
- Most references to the Nintendo 64 were replaced with ones to the iQue Player. The only exception being the train in Kalamari Desert which still has the number 64 on the front.
- The Controller Pak manager is inaccessible since the iQue Player handles Controller Paks differently to the Nintendo 64, as each game that requires a Controller Pak has its own .pak file on the iQue Player's NAND.
- An audio glitch occurs when entering a race, going back to the main menu, going to the data screen, and then backing out to the main menu again that causes the menu music to play in a slow and low pitched tone.
- When improving your best lap in time trials, instead of the usual flashing lap time, the time is not visible during the race at all.