Actions

SCHG How-to

Difference between revisions of "Have a functional Eggman monitor in Sonic 1"

From Sonic Retro

m (forgot one)
m
Line 19: Line 19:
 
         move.l    a0,-(sp) ; push a0 on the stack, and decrement stack pointer
 
         move.l    a0,-(sp) ; push a0 on the stack, and decrement stack pointer
 
         lea    ($FFFFD000).w,a0 ; put Sonic's ram address in a0, because Touch_ChkHurt wants the damaged object to be in a0
 
         lea    ($FFFFD000).w,a0 ; put Sonic's ram address in a0, because Touch_ChkHurt wants the damaged object to be in a0
         jsr    Touch_ChkHurt ; runs the Touch_ChkHurt routine
+
         jsr    Touch_ChkHurt ; run the Touch_ChkHurt routine
         move.l    (sp)+,a0 ; pops the previous value of a0 from the stack, and increment stack pointer
+
         move.l    (sp)+,a0 ; pop the previous value of a0 from the stack, and increment stack pointer
         rts</pre>Simple, isn't it? And it's set up in a way to use the regular "Touch_ChkHurt" routine, so shields and invincibilities are already taken in account by existing code, and the Eggman monitor will damage you like every other hazard would.[[Category:SCHG How-tos|Have_a_functional_Eggman_monitor_in_Sonic_1]]
+
         rts ; The Eggman monitor now does something!</pre>Simple, isn't it? And it's set up in a way to use the regular "Touch_ChkHurt" routine, so shields and invincibilities are already taken in account by existing code, and the Eggman monitor will damage you like every other hazard would.[[Category:SCHG How-tos|Have_a_functional_Eggman_monitor_in_Sonic_1]]

Revision as of 17:30, 1 September 2010

(Original guide by nineko) This very simple guide will tell you how to get a functional Eggman monitor in Sonic 1. It targets the Hivebrain 2005 Disassembly.

Find this code:

Obj2E_ChkEggman:    ; XREF: Obj2E_Move
        addq.b    #2,$24(a0)
        move.w    #29,$1E(a0)
        move.b    $1C(a0),d0
        cmpi.b    #1,d0; does monitor contain Eggman?
        bne.s    Obj2E_ChkSonic
        rts    ; Eggman monitor does nothing
And replace it with this:
Obj2E_ChkEggman:    ; XREF: Obj2E_Move
        addq.b    #2,$24(a0)
        move.w    #29,$1E(a0)
        move.b    $1C(a0),d0
        cmpi.b    #1,d0; does monitor contain Eggman?
        bne.s    Obj2E_ChkSonic ; if not, go and check for the next monitor type (1-up icon)
        move.l    a0,a1 ; move a0 to a1, because Touch_ChkHurt wants the damaging object to be in a1
        move.l    a0,-(sp) ; push a0 on the stack, and decrement stack pointer
        lea    ($FFFFD000).w,a0 ; put Sonic's ram address in a0, because Touch_ChkHurt wants the damaged object to be in a0
        jsr    Touch_ChkHurt ; run the Touch_ChkHurt routine
        move.l    (sp)+,a0 ; pop the previous value of a0 from the stack, and increment stack pointer
        rts ; The Eggman monitor now does something!
Simple, isn't it? And it's set up in a way to use the regular "Touch_ChkHurt" routine, so shields and invincibilities are already taken in account by existing code, and the Eggman monitor will damage you like every other hazard would.