A few things on this game. (All of these are based on the Japanese release. I did most of this stuff with the help of Exodus and IDA Pro) 1.) Art This game uses lots of Nemesis compression. The only thing that isn't compressed as far as I can tell is Mickey's player sprite (cutscene Mickey tiles are compressed). The game also uses Enigma compression too, but I'm not entirely sure what it could be using it for. It doesn't seem to be using it for any graphics, maybe related to tile mapping. It isn't used very often. Nemesis is usually used for graphics, but I've seen archives for tile/stage mappings too. I played through the entire game and documented every used Nemesis archive in the game. I compiled a list of the location ranges of each archive (note, names are kinda ambiguous and are kinda wrong, but it'll give you a good idea of what they might be). There are a few interesting things I noticed. For some reason, the first Toyland stage loads the ghosts from the third Forest stage even though they aren't used (could be wrong though). Also, every tea cup stage in the game loads those swedish fish enemies, even though there's no way they can jump out of the water. There are only two unused Nemesis archives in the entire ROM. The first is located at $49900, and appears to be "Mickey Mouse" in big multi colored text: The second at $4AD52 appears to be maybe some kind of mapping data (perhaps for this art): 2.) Level Select and No Clip remnants One thing that always made me curious about this game was it's lack of in game cheat codes. I investigated all the rumored cheat codes that were floating around for the game, and while all of them are false, there is evidence that they exist or used to exist in the game. The first thing was a level select. The only instance of a level select code existing was in an issue of Hobby Consolas detailing a cheat if you press all the buttons on the title screen. This implies that upon pressing start at the title screen, you should see the results immediately after. There are no special game screens for a stage select nor were there any subroutines around the title screen routines that were unused. However, upon looking at the sound test I found unused code at $A02C that directly manipulated the current stage variable in RAM: Code (ASM): ROM:0000A02C GM_SoundTest_StageSelect: ; Unused! Seems to be loaded within the sound test? ROM:0000A02C move.b (RAM_CurrentPressedButton+1).w,d5 ROM:0000A030 move.w (RAM_CurrentStageID).w,d0 ; Move Data from Source to Destination ROM:0000A034 btst #6,d5 ; Test a Bit ROM:0000A038 beq.s loc_A044 ; Branch if Equal ROM:0000A03A subq.w #1,d0 ; Subtract Quick ROM:0000A03C bpl.s loc_A054 ; Branch if Plus ROM:0000A03E move.w #$1B,d0 ; Move Data from Source to Destination ROM:0000A042 bra.s loc_A054 ; Branch Always ROM:0000A044 ; --------------------------------------------------------------------------- ROM:0000A044 ROM:0000A044 loc_A044: ; CODE XREF: GM_SoundTestLoop+42j ROM:0000A044 btst #4,d5 ; Test a Bit ROM:0000A048 beq.s loc_A054 ; Branch if Equal ROM:0000A04A addq.w #1,d0 ; Add Quick ROM:0000A04C cmpi.w #$1B,d0 ; Compare Immediate ROM:0000A050 ble.s loc_A054 ; Branch if Less or Equal ROM:0000A052 moveq #0,d0 ; Move Quick ROM:0000A054 ROM:0000A054 loc_A054: ; CODE XREF: GM_SoundTestLoop+46j ROM:0000A054 ; GM_SoundTestLoop+4Cj ... ROM:0000A054 move.w d0,(RAM_CurrentStageID).w ; Move Data from Source to Destination ROM:0000A058 lea (vdp_data_port).l,a2 ; Load Effective Address ROM:0000A05E move.l #$4B0C0003,(vdp_control_port).l ; Move Data from Source to Destination ROM:0000A068 mulu.w #3,d0 ; Unsigned Multiply ROM:0000A06C lea Array_StageSelectValues,a1 ; Load Effective Address ROM:0000A070 adda.w d0,a1 ; Add Address ROM:0000A072 moveq #0,d1 ; Move Quick ROM:0000A074 move.b (a1)+,d1 ; Move Data from Source to Destination ROM:0000A076 move.w d1,(a2) ; Move Data from Source to Destination ROM:0000A078 move.w #$3A,(a2) ; ':' ; Move Data from Source to Destination ROM:0000A07C move.b (a1)+,d1 ; Move Data from Source to Destination ROM:0000A07E move.w d1,(a2) ; Move Data from Source to Destination ROM:0000A080 move.w #$3A,(a2) ; ':' ; Move Data from Source to Destination ROM:0000A084 move.b (a1)+,d1 ; Move Data from Source to Destination ROM:0000A086 move.w d1,(a2) ; Move Data from Source to Destination ROM:0000A088 rts ; Return from Subroutine ROM:0000A08A ; --------------------------------------------------------------------------- The only thing preventing this code from running is a single ret before the first line. NOP it out and the code runs fine: You can access it yourself with the following Game Genie codes: Game Genie codes: RGST-A6XN (UE) RGTA-A6VL (J) The "No Clip" cheat wasn't so lucky. Traditionally, the code was always rumored to work when the game is paused. So I found the subroutine for pausing the game, and noticed a bunch of NOPs where calls for button checks and such would probably be: Code (ASM): ROM:00009808 ; =============== S U B R O U T I N E ======================================= ROM:00009808 ROM:00009808 ROM:00009808 PauseGame: ; CODE XREF: GM_StageLoop+34p ROM:00009808 move.w #$100,(z80_bus_request).l ; Move Data from Source to Destination ROM:00009810 nop ; No Operation ROM:00009812 nop ; No Operation ROM:00009814 nop ; No Operation ROM:00009816 nop ; No Operation ROM:00009818 tst.b (RAM_EnablePauseFlag).w ; 1 = true, 0 = false ROM:0000981C bne.s loc_9834 ; Branch if Not Equal ROM:0000981E move.b #$80,(byte_A01C12).l ; Move Data from Source to Destination ROM:00009826 nop ; No Operation ROM:00009828 nop ; No Operation ROM:0000982A move.b #0,(byte_A01C13).l ; Move Data from Source to Destination ROM:00009832 bra.s end ; Branch Always ROM:00009834 ; --------------------------------------------------------------------------- ROM:00009834 ROM:00009834 loc_9834: ; CODE XREF: PauseGame+14j ROM:00009834 move.b #$C1,(byte_A01C0A).l ; Move Data from Source to Destination ROM:0000983C nop ; No Operation ROM:0000983E nop ; No Operation ROM:00009840 move.b #1,(byte_A01C13).l ; Move Data from Source to Destination ROM:00009848 ROM:00009848 end: ; CODE XREF: PauseGame+2Aj ROM:00009848 move.w #0,(z80_bus_request).l ; Move Data from Source to Destination ROM:00009850 rts ; Return from Subroutine ROM:00009850 ; End of function PauseGame ROM:00009850 I looked everywhere for code that might enable No Clip but I haven't found anything yet. I would suspect it would be common with the player code, but I can't seem to find any unused branches or sections of code that do anything close to what the mode is supposed to do. I'll have to keep searching for it. 3.) Objects This game keeps the main subroutine code for each object (including the player) in a huge table of pointers. The main subroutine, depending on what the object is, will first load the address of a "move" table filled with offsets to functions for certain object actions and then jump to it depending on the object's current condition in game. If it's an enemy, it'll include an additional branch that will check if the enemy has been hit by Mickey's butt, a projectile, or by a rainbow gem. There are some pointers that are never touched which seems to hint at unused objects. Here are a list of pointers for the objects that seem to be unused (excluding duplicates and null'd subroutines); I haven't bothered to load all of them yet, but I found some odd ones. The last two objects in this list are kinda interesting: The object itself can't be destroyed, has no collision, and does literally nothing. The second unused object in the list is a 1:1 copy of the first object. The object uses the first few tiles from VRAM to build the object (which in a stage the tiles are always the same because the tiles being used are always loaded in the same place). 4.) Other odds and ends Some other neat things I've noticed while digging through this game. I'll arrange it in a small sublist to make it kinda easier to read: Much like how Labyrinth Zone in Sonic 1 was originally meant to be the second Zone but was changed because it was deemed a bit too difficult for a second stage, Castle of Illusion had a similar dilemma. The second substage in the Forest level (the one with the big rolling Apple) was originally supposed to be the third substage. The original second substage was actually supposed to be what is now the forth substage (the one with the ghosts). The decision to swap the stages is made evident in the level order in the level select, pointers for the stage in various tables, and even the first few seconds of the song of the stage (boost the tempo of the beginning of the song and you'll notice it's actually the normal Forest theme but with different sounding instruments). This was probably changed due to the platform difficulty presented. I'd imagine it was probably too difficult to balance Mickey's butt stomps on ghosts without having played a traditional platforming challenge that can be found in the third substage first. Speaking of stages, there were originally supposed to be three tea cup stages for the Library stage but got dropped down to two. I can't seem to find data for that missing stage, but in the level select, the level actually points to 4-1-t1. What's odd, however, is that upon completing the tea cup stage - you get sent back to the Library in mid air a little after where the second tea cup warp is supposed to be. The unused exit can be found in the stage select under 4-1-4. Here's a silly oversight that I saw while disassembling the game. Some backstory first - the game features a 100% z80 sound driver. The game passes off the sound id of the music/sfx it wants to play to $F40E and calls a 68k function to play the sound (79F86). The code itself works as intended, but there's a small catch. Music usually takes precedent over sound effects in game, so sound effects will really only play all the way out unless you don't change the music right away. This becomes a problem in one instance in the game where one sound goes completely unheard even though it's used. When you collect the key in the first substage in the Toyland world (that changes all the platforms to slopes), there's actually supposed to be a sound that plays. They have the code to play the sound, and it get's executed as it should. But after returning from the function that initiates the playback for the sound, the game will pass and call ANOTHER instance for playback for the song that plays when Mickey runs down the slope. Because music takes precedence over sound effects, this accidentally cancels out the sound that's supposed to play. Here's the code that does it: Code (ASM): ROM:0000083E move.b #$C3,(RAM_CurrentSoundID).w ; play "key got" sfx ROM:00000844 jsr PlaySound ; Jump to Subroutine ROM:0000084A move.b #$93,(RAM_CurrentSoundID).w ; play "mickey runs down slope" music ROM:00000850 jsr PlaySound ; Jump to Subroutine At first maybe switching the ID's around would fix the problem, but you can't play both at the same time like this. The second call to PlaySound has to occur later somehow for the sound to play all the way out. It looks like the developers had a major issue with the ROM size restrictions for this game. Besides the fact that this game has a lot of compressed data, it also has a lot of the programming for certain game modes/screens toward the end of the rom. It seems that they had planned ahead to dedicate certain ROM regions for code and art (with liberal use of padding data), but when they had to add screens that were obviously programmed late, like the game over/ending screens, they probably couldn't fit what they wanted in the area of the rom they had already dedicated for code. From the looks of things, they used whatever free space they had in that artificial code segment they made and made certain "game mode" subroutines in their game mode/screen table dedicated to simply jumping to the actual function code that starts at the end of the rom. To illustrate my point, look at the game mode table here and notice how many of them are _j, or "jumping" subroutines: Code (ASM): ROM:000003D8 GM_Array: dc.w GM_Init ; 00 ROM:000003DA dc.w GM_SegaLoop_j ; 02 ROM:000003DC dc.w GM_OpeningInit ; 04 ROM:000003DE dc.w GM_OpeningLoop ; 06 ROM:000003E0 dc.w GM_InitSoundTest ; 08 ROM:000003E2 dc.w GM_SoundTestLoop ; 0A ROM:000003E4 dc.w GM_StageInit ; 0C ROM:000003E6 dc.w GM_StageLoop ; 0E ROM:000003E8 dc.w GM_StageInverter ; 10 ROM:000003EA dc.w GM_TitleLoop ; 12 ROM:000003EC dc.w GM_EndingInit ; 14 ROM:000003EE dc.w GM_Ending ; 16 ROM:000003F0 dc.w GM_GameOverInit_j ; 18 ROM:000003F2 dc.w GM_GameOverLoop_j ; 1A ROM:000003F4 dc.w GM_CopyrightInit_j ; 1C ROM:000003F6 dc.w GM_CopyrightLoop_j ; 1E ROM:000003F8 dc.w GM_InitCastleLoop_j ; 20 ROM:000003FA dc.w GM_CastleLoop_j ; 22 ROM:000003FC dc.w GM_StageClearInit_j ; 24 ROM:000003FE dc.w GM_StageClearLoop_j ; 26 ROM:00000400 dc.w GM_OutsideCastle ; 28 ROM:00000402 dc.w sub_A286 ; 2A ROM:00000404 dc.w GM_CastleEscapeInit ; 2C ROM:00000406 dc.w GM_CastleEscapeLoop ; 2E 5.) Some RAM locations: Just a few locations I found, not nearly all of them though... 6.) Disassembly I started to label a disassembly of the game which you can download here. It's no where near complete, but I got a lot of the data down at least. It's the first one I made that's this involved, so excuse the bad mistakes I made. You can open the Ida Pro database in 6.1 or later.