Fix Debug Mode Crash
From Sonic Retro
(Method #1 by Esrael, Method #2 by Shadow05)
In Sonic 2, there's a very annoying revolving around Debug Mode. Simply, if you place an object after dying the game will crash. This guide will show you how to fix this.
At Debug_SpawnObject: you'll see this
btst #button_C,(Ctrl_1_Press).w beq.s Debug_ExitDebugMode ; Spawn object jsr (SingleObjLoad).l
In between beq.s Debug_ExitDebugMode and ; Spawn object add this,
cmpi.b #6,(MainCharacter+status).w ; is Sonic dead? bne.s + ; if not, branch rts ; return to prevent Sonic from placing objects. +
At BuildSprites_ObjLoop: you'll see this.
if gameRevision=0 ; the additional check prevents a crash triggered by placing an object in debug mode while dead ; unfortunately, the code it branches *to* causes a crash of its own tst.b id(a0) ; is this object slot occupied? beq.w BuildSprites_Unknown ; if not, branch tst.l mappings(a0) ; does this object have any mappings? beq.w BuildSprites_Unknown ; if not, branch else ; REV01 uses a better branch, but removed the useful check tst.b id(a0) ; is this object slot occupied? beq.w BuildSprites_NextObj ; if not, check next one endif
Replace it with this.
tst.b id(a0) ; is this object slot occupied? beq.w BuildSprites_NextObj ; if not, check next one tst.l mappings(a0) ; does this object have any mappings? beq.w BuildSprites_NextObj ; if not, check next one
The crash occurs because of this line.
This was a simple "JmpTo" command in the Simon Wai Prototype, but for some reason, this mystery line was added. This causes the Genesis to try to read off an odd-address, as the Genesis can't the game crashes immediately. REV01 tried to fix this by changing the branch to something better, however it removes a useful check still causing the game to crash. Esrael's fix makes Debug Mode check if the player has died while Shadow05's checks if the object has any mappings.
|Fix Debug Mode Crash]]