Actions

Difference between revisions of "Sandbox"

From Sonic Retro

 
(67 intermediate revisions by 13 users not shown)
Line 1: Line 1:
The following guide was made by Tailsguy24, and is not yet complete. DO NOT edit/delete it for any reason.
+
This is the page where you can test out stuff on the Wiki.
==How to Port Knuckles into Sonic 2==
 
It surprises me that nobody else took up responsibility for making this guide, considering I, as a major fan of hacks, have seen Knuckles implemented in Sonic 2 on more than one occasion. Today, I'll be explaining how you, too, can implement Knuckles in your Sonic 2 hack.
 
===What You'll Need===
 
*This guide (no duh, really)
 
*The Hg disassembly of Sonic 2
 
*The one known disassembly of Knuckles in Sonic 2, found on the long list of disassemblies. [http://info.sonicretro.org/Disassemblies/]
 
*The ConTEXT text editor (because Notepad will take WAY too long to process anything)
 
*Your favorite Genesis emulator (I recommend Kega Fusion but you can use any Genesis emulator you'd like)
 
  
===IMPORTANT NOTE===
+
This page is NOT for drafting new articles. If you want to write up a new article and save it on the Wiki, but don't want to publish it in a main article, create a new article using your User namespace, e.g. User:JoeSchmoe/My_New_Article .
'''DO NOT''' try to rebuild the ROM once you've started this guide or you will get build errors.
+
___________________________________________________________________________________________________
 
 
Also, there is quite a lot of code added in this tutorial and it '''will''' make the ASM file's size (and to an extent, the ROM's size) a lot bigger than they were before. You may want to consider porting Sonic 1's sound driver to Sonic 2 first, as it can take the amount of data shifting caused by extending the level index past $10 in Sonic 2 and still work properly.
 
==Step 1: Creating the Knuckles object==
 
First, open up s2.asm in ConTEXT and search for "dc.l ObjNull." This should come up:
 
<asm>
 
                dc.l ObjNull ; Obj4C
 
                dc.l ObjNull ; Obj4D
 
                dc.l ObjNull ; Obj4E
 
                dc.l ObjNull ; Obj4F
 
</asm>
 
Change this line:
 
<asm>
 
                dc.l ObjNull ; Obj4C
 
</asm>
 
 
 
To this:
 
<asm>
 
                dc.l Obj4C  ; Knuckles
 
</asm>
 
 
 
We've created our Knuckles object. Now let's get started.
 
 
 
==Step 2: Creating the offset table==
 
Now that you have created your Knuckles object, go to whatever folder you saved the Knuckles in Sonic 2 disassembly to, open s2k.asm in ConTEXT, and scroll down or search until you find the following code:
 
<asm>
 
Obj01_Index: dc.w Obj01_Init-Obj01_Index   ; 0 ; ...
 
dc.w Obj01_Control-Obj01_Index   ; 1
 
dc.w Obj01_Hurt-Obj01_Index   ; 2
 
dc.w Obj01_Dead-Obj01_Index   ; 3
 
dc.w Obj01_Gone-Obj01_Index   ; 4
 
dc.w Obj01_Respawning-Obj01_Index ; 5
 
</asm>
 
Back in s2.asm, copy and paste the following piece of code above the description of the Masher object:
 
<asm>
 
; ----------------------------------------------------------------------------
 
; Object 01 - Knuckles
 
; ----------------------------------------------------------------------------
 
 
 
Obj01:
 
; a0=character
 
tst.w (Debug_placement_mode).w ; is debug mode being used?
 
beq.s Obj01_Normal ; if not, branch
 
jmp (DebugMode).l
 
; ---------------------------------------------------------------------------
 
; loc_19F5C:
 
Obj01_Normal:
 
moveq #0,d0
 
move.b routine(a0),d0
 
move.w Obj01_Index(pc,d0.w),d1
 
jmp Obj01_Index(pc,d1.w)
 
; End of function Obj01
 
 
 
; ----------------------------------------------------------------------------
 
</asm>
 
Now copy the code I mentioned earlier in this step, and paste it below the code displayed above. Then, replace all of the "dc.w"'s with "offsetTableEntry.w"'s, delete the "-Obj01_Index" on the end of each line, move all of the entries down one line, add "offsetTable" to the top, and change all of the 01's in the whole section of code to 4C's. If you're following this guide correctly, your code should look like this:
 
<asm>
 
; ----------------------------------------------------------------------------
 
; Object 4C - Knuckles
 
; ----------------------------------------------------------------------------
 
 
 
Obj4C:
 
; a0=character
 
tst.w (Debug_placement_mode).w ; is debug mode being used?
 
beq.s Obj4C_Normal ; if not, branch
 
jmp (DebugMode).l
 
; ---------------------------------------------------------------------------
 
; loc_19F5C:
 
Obj4C_Normal:
 
moveq #0,d0
 
move.b routine(a0),d0
 
move.w Obj4C_Index(pc,d0.w),d1
 
jmp Obj4C_Index(pc,d1.w)
 
; End of function Obj4C
 
 
 
; ----------------------------------------------------------------------------
 
Obj4C_Index:    offsetTable
 
        offsetTableEntry.w Obj4C_Init            ; 0
 
offsetTableEntry.w Obj4C_Control          ; 2
 
offsetTableEntry.w Obj4C_Hurt              ; 4
 
offsetTableEntry.w Obj4C_Dead            ; 6
 
offsetTableEntry.w Obj4C_Gone            ; 8
 
offsetTableEntry.w Obj4C_Respawning              ; $A
 
...
 
</asm>
 
Now that '''THAT''' is done and over with, let's continue to importing Knuckles' many modes (or whatever you people call them).
 
==Step 3: Obj4C_Init==
 
Going back to s2k.asm , you should see this piece of code right below the code I mentioned earlier in Step 2:
 
<asm>
 
; ---------------------------------------------------------------------------
 
 
 
Obj01_Init:   ; ...
 
addq.b #2,$24(a0)
 
move.b #$13,$16(a0)
 
move.b #9,$17(a0)
 
move.l #SK_Map_Knuckles,4(a0)   ; SK_Map_Knuckles
 
move.b #2,$18(a0)
 
move.b #$18,$19(a0)
 
move.b #4,1(a0)
 
move.w #$600,($FFFFF760).w
 
move.w #$C,($FFFFF762).w
 
move.w #$80,($FFFFF764).w
 
tst.b ($FFFFFE30).w
 
bne.s Obj01_Init_Continued
 
move.w #$780,2(a0)
 
bsr.w Adjust2PArtPointer2_Useless
 
move.b #$C,$3E(a0)
 
move.b #$D,$3F(a0)
 
move.w 8(a0),($FFFFFE32).w
 
move.w $C(a0),($FFFFFE34).w
 
move.w 2(a0),($FFFFFE3C).w
 
move.w $3E(a0),($FFFFFE3E).w
 
 
 
Obj01_Init_Continued:   ; ...
 
move.b #0,$2C(a0)
 
move.b #4,$2D(a0)
 
move.b #0,($FFFFFE19).w
 
move.b #$1E,$28(a0)
 
sub.w #$20,8(a0)
 
add.w #4,$C(a0)
 
move.w #0,($FFFFEED2).w
 
move.w #$3F,d2
 
 
 
loc_3153EC:   ; ...
 
bsr.w Knuckles_RecordPositions
 
subq.w #4,a1
 
move.l #0,(a1)
 
dbf d2,loc_3153EC
 
add.w #$20,8(a0)
 
sub.w #4,$C(a0)
 
</asm>
 
All we need to do is copy this, paste it below our already ported code, and change all of the 01's to 4C's. Now you should have this below the offset table:
 
<asm>
 
; ---------------------------------------------------------------------------
 
 
 
Obj4C_Init:   ; ...
 
addq.b #2,$24(a0)
 
move.b #$13,$16(a0)
 
move.b #9,$17(a0)
 
move.l #SK_Map_Knuckles,4(a0)   ; SK_Map_Knuckles
 
move.b #2,$18(a0)
 
move.b #$18,$19(a0)
 
move.b #4,1(a0)
 
move.w #$600,($FFFFF760).w
 
move.w #$C,($FFFFF762).w
 
move.w #$80,($FFFFF764).w
 
tst.b ($FFFFFE30).w
 
bne.s Obj4C_Init_Continued
 
move.w #$780,2(a0)
 
bsr.w Adjust2PArtPointer2_Useless
 
move.b #$C,$3E(a0)
 
move.b #$D,$3F(a0)
 
move.w 8(a0),($FFFFFE32).w
 
move.w $C(a0),($FFFFFE34).w
 
move.w 2(a0),($FFFFFE3C).w
 
move.w $3E(a0),($FFFFFE3E).w
 
 
 
Obj4C_Init_Continued:   ; ...
 
move.b #0,$2C(a0)
 
move.b #4,$2D(a0)
 
move.b #0,($FFFFFE19).w
 
move.b #$1E,$28(a0)
 
sub.w #$20,8(a0)
 
add.w #4,$C(a0)
 
move.w #0,($FFFFEED2).w
 
move.w #$3F,d2
 
 
 
loc_3153EC:   ; ...
 
bsr.w Knuckles_RecordPositions
 
subq.w #4,a1
 
move.l #0,(a1)
 
dbf d2,loc_3153EC
 
add.w #$20,8(a0)
 
sub.w #4,$C(a0)
 
</asm>
 
==Step 4: Obj4C_Control==
 
This one is the most important. It actually makes up approximately 90% of the code for Knuckles. Therefore, we definitely need to port this.
 
===Step 4: Part 1: Starting off===
 
First, we have to modify the Obj01_Modes offset table from s2k.asm so we can use it for our Knuckles. Below the code mentioned above, you should see this:
 
<asm>
 
Obj01_Control:   ; ...
 
tst.w ($FFFFFFDA).w
 
beq.s loc_315422
 
btst #4,($FFFFF605).w
 
beq.s loc_315422
 
move.w #1,($FFFFFE08).w
 
clr.b ($FFFFF7CC).w
 
rts
 
; ---------------------------------------------------------------------------
 
 
 
loc_315422:   ; ...
 
tst.b ($FFFFF7CC).w
 
bne.s loc_31542E
 
move.w ($FFFFF604).w,($FFFFF602).w
 
 
 
loc_31542E:   ; ...
 
btst #0,$2A(a0)
 
beq.s loc_31543E
 
move.b #0,$21(a0)
 
bra.s loc_315450
 
; ---------------------------------------------------------------------------
 
 
 
loc_31543E:   ; ...
 
moveq #0,d0
 
move.b $22(a0),d0
 
 
 
and.w #6,d0
 
move.w Obj01_Modes(pc,d0.w),d1
 
jsr Obj01_Modes(pc,d1.w)
 
 
 
loc_315450:   ; ...
 
cmp.w #$FF00,($FFFFEECC).w
 
bne.s loc_31545E
 
and.w #$7FF,$C(a0)
 
 
 
loc_31545E:   ; ...
 
bsr.s Knuckles_Display
 
bsr.w Knuckles_Super
 
bsr.w Knuckles_RecordPositions
 
bsr.w Knuckles_Water
 
move.b ($FFFFF768).w,$36(a0)
 
move.b ($FFFFF76A).w,$37(a0)
 
tst.b ($FFFFF7C7).w
 
beq.s loc_31548A
 
tst.b $1C(a0)
 
bne.s loc_31548A
 
move.b $1D(a0),$1C(a0)
 
 
 
loc_31548A:   ; ...
 
bsr.w Knuckles_Animate
 
tst.b $2A(a0)
 
bmi.s loc_31549A
 
jsr TouchResponse
 
 
 
loc_31549A:   ; ...
 
bra.w LoadKnucklesDynPLC
 
; ---------------------------------------------------------------------------
 
Obj01_Modes: dc.w Obj01_MdNormal-Obj01_Modes   ; 0 ; ...
 
dc.w Obj01_MdAir-Obj01_Modes   ; 1
 
dc.w Obj01_MdRoll-Obj01_Modes   ; 2
 
dc.w Obj01_MdJump-Obj01_Modes   ; 3
 
</asm>
 
Do the same thing that was done with the code in Step 1. It should now look like this:
 
<asm>
 
Obj4C_Control:   ; ...
 
tst.w ($FFFFFFDA).w
 
beq.s loc_315422
 
btst #4,($FFFFF605).w
 
beq.s loc_315422
 
move.w #1,($FFFFFE08).w
 
clr.b ($FFFFF7CC).w
 
rts
 
; ---------------------------------------------------------------------------
 
 
 
loc_315422:   ; ...
 
tst.b ($FFFFF7CC).w
 
bne.s loc_31542E
 
move.w ($FFFFF604).w,($FFFFF602).w
 
 
 
loc_31542E:   ; ...
 
btst #0,$2A(a0)
 
beq.s loc_31543E
 
move.b #0,$21(a0)
 
bra.s loc_315450
 
; ---------------------------------------------------------------------------
 
 
 
loc_31543E:   ; ...
 
moveq #0,d0
 
move.b $22(a0),d0
 
and.w #6,d0
 
move.w Obj4C_Modes(pc,d0.w),d1
 
jsr Obj4C_Modes(pc,d1.w)
 
 
 
loc_315450:   ; ...
 
cmp.w #$FF00,($FFFFEECC).w
 
bne.s loc_31545E
 
and.w #$7FF,$C(a0)
 
 
 
loc_31545E:   ; ...
 
bsr.s Knuckles_Display
 
bsr.w Knuckles_Super
 
bsr.w Knuckles_RecordPositions
 
bsr.w Knuckles_Water
 
move.b ($FFFFF768).w,$36(a0)
 
move.b ($FFFFF76A).w,$37(a0)
 
tst.b ($FFFFF7C7).w
 
beq.s loc_31548A
 
tst.b $1C(a0)
 
bne.s loc_31548A
 
move.b $1D(a0),$1C(a0)
 
 
 
loc_31548A:   ; ...
 
bsr.w Knuckles_Animate
 
tst.b $2A(a0)
 
bmi.s loc_31549A
 
jsr TouchResponse
 
 
 
loc_31549A:   ; ...
 
bra.w LoadKnucklesDynPLC
 
; ---------------------------------------------------------------------------
 
Obj4C_Modes: offsetTable
 
                offsetTableEntry.w Obj4C_MdNormal_Checks  ; 0 ; not airborne or rolling
 
offsetTableEntry.w Obj4C_MdAir          ; 2 ; airborne
 
offsetTableEntry.w Obj4C_MdRoll        ; 4 ; rolling
 
offsetTableEntry.w Obj4C_MdJump        ; 6 ; jumping
 
</asm>
 
===Step 4: Part 2: Obj4C_MdNormal===
 
Back to s2k.asm! The next bit of code you'll want to find is this:
 
<asm>
 
 
 
; =============== S U B R O U T I N E =======================================
 
 
 
 
 
Knuckles_Display:   ; ...
 
move.w $30(a0),d0
 
beq.s Obj01_Display
 
subq.w #1,$30(a0)
 
lsr.w #3,d0
 
bcc.s Obj01_CheckInvincibility
 
 
 
Obj01_Display:   ; ...
 
jsr DisplaySprite
 
 
 
Obj01_CheckInvincibility:   ; ...
 
btst #1,$2B(a0)
 
beq.s Obj01_CheckSpeedShoes
 
tst.w $32(a0)
 
beq.s Obj01_CheckSpeedShoes
 
subq.w #1,$32(a0)
 
bne.s Obj01_CheckSpeedShoes
 
tst.b ($FFFFF7AA).w
 
bne.s Obj01_RemoveInvincibility
 
cmp.b #$C,$28(a0)
 
bcs.s Obj01_RemoveInvincibility
 
move.w ($FFFFFF90).w,d0
 
jsr PlayMusic
 
 
 
Obj01_RemoveInvincibility:   ; ...
 
bclr #1,$2B(a0)
 
 
 
Obj01_CheckSpeedShoes:   ; ...
 
btst #2,$2B(a0)
 
beq.s Obj01_ExitCheck
 
tst.w $34(a0)
 
beq.s Obj01_ExitCheck
 
subq.w #1,$34(a0)
 
bne.s Obj01_ExitCheck
 
move.w #$600,($FFFFF760).w
 
move.w #$C,($FFFFF762).w
 
move.w #$80,($FFFFF764).w
 
tst.b ($FFFFFE19).w
 
beq.s Obj01_RemoveSpeedShoes
 
move.w #$800,($FFFFF760).w
 
move.w #$18,($FFFFF762).w
 
move.w #$C0,($FFFFF764).w
 
 
 
Obj01_RemoveSpeedShoes:   ; ...
 
bclr #2,$2B(a0)
 
move.w #$FC,d0
 
jmp PlayMusic
 
; ---------------------------------------------------------------------------
 
 
 
Obj01_ExitCheck:   ; ...
 
rts
 
; End of function Knuckles_Display
 
 
 
 
 
; =============== S U B R O U T I N E =======================================
 
 
 
 
 
Knuckles_RecordPositions:   ; ...
 
move.w ($FFFFEED2).w,d0
 
lea ($FFFFE500).w,a1
 
lea (a1,d0.w),a1
 
move.w 8(a0),(a1)+
 
move.w $C(a0),(a1)+
 
addq.b #4,($FFFFEED3).w
 
lea ($FFFFE400).w,a1
 
lea (a1,d0.w),a1
 
move.w ($FFFFF602).w,(a1)+
 
move.w $22(a0),(a1)+
 
rts
 
; End of function Knuckles_RecordPositions
 
 
 
 
 
; =============== S U B R O U T I N E =======================================
 
 
 
 
 
Knuckles_Water:   ; ...
 
tst.b ($FFFFF730).w
 
bne.s Obj01_InWater
 
 
 
return_31556C:   ; ...
 
rts
 
; ---------------------------------------------------------------------------
 
 
 
Obj01_InWater:   ; ...
 
move.w ($FFFFF646).w,d0
 
cmp.w $C(a0),d0
 
bge.s Obj01_OutWater
 
bset #6,$22(a0)
 
bne.s return_31556C
 
move.l a0,a1
 
bsr.w ResumeMusic
 
move.b #$A,($FFFFD080).w
 
move.b #$81,($FFFFD0A8).w
 
move.l a0,($FFFFD0BC).w
 
move.w #$300,($FFFFF760).w
 
move.w #6,($FFFFF762).w
 
move.w #$40,($FFFFF764).w
 
tst.b ($FFFFFE19).w
 
beq.s loc_3155C0
 
move.w #$400,($FFFFF760).w
 
move.w #$C,($FFFFF762).w
 
move.w #$60,($FFFFF764).w
 
 
 
loc_3155C0:   ; ...
 
asr $10(a0)
 
asr $12(a0)
 
asr $12(a0)
 
beq.s return_31556C
 
move.w #$100,($FFFFD11C).w
 
move.w #$AA,d0
 
jmp PlaySound
 
; ---------------------------------------------------------------------------
 
 
 
Obj01_OutWater:   ; ...
 
bclr #6,$22(a0)
 
beq.s return_31556C
 
move.l a0,a1
 
bsr.w ResumeMusic
 
move.w #$600,($FFFFF760).w
 
move.w #$C,($FFFFF762).w
 
move.w #$80,($FFFFF764).w
 
tst.b ($FFFFFE19).w
 
beq.s loc_315616
 
move.w #$800,($FFFFF760).w
 
move.w #$18,($FFFFF762).w
 
move.w #$C0,($FFFFF764).w
 
 
 
loc_315616:   ; ...
 
cmp.b #4,$24(a0)
 
beq.s loc_315622
 
asl $12(a0)
 
 
 
loc_315622:   ; ...
 
tst.w $12(a0)
 
beq.w return_31556C
 
move.w #$100,($FFFFD11C).w
 
move.l a0,a1
 
bsr.w ResumeMusic
 
cmp.w #$F000,$12(a0)
 
bgt.s loc_315644
 
move.w #$F000,$12(a0)
 
 
 
loc_315644:   ; ...
 
move.w #$AA,d0
 
jmp PlaySound
 
; End of function Knuckles_Water
 
 
 
 
 
; =============== S U B R O U T I N E =======================================
 
 
 
 
 
Obj01_MdNormal:   ; ...
 
bsr.w Knuckles_Spindash
 
bsr.w Knuckles_Jump
 
bsr.w Knuckles_SlopeResist
 
bsr.w Knuckles_Move
 
bsr.w Knuckles_Roll
 
bsr.w Knuckles_LevelBoundaries
 
jsr ObjectMove   ; AKA SpeedToPos in Sonic 1
 
bsr.w AnglePos
 
bsr.w Knuckles_SlopeRepel
 
rts
 
; End of function Obj01_MdNormal
 
Put that below the code we've already ported, then go through it and replace each and every "Obj01" with "Obj4C." You should get this:
 
<asm>
 
 
 
; =============== S U B R O U T I N E =======================================
 
 
 
 
 
Knuckles_Display:   ; ...
 
move.w $30(a0),d0
 
beq.s Obj4C_Display
 
subq.w #1,$30(a0)
 
lsr.w #3,d0
 
bcc.s Obj4C_CheckInvincibility
 
 
 
Obj4C_Display:   ; ...
 
jsr DisplaySprite
 
 
 
Obj4C_CheckInvincibility:   ; ...
 
btst #1,$2B(a0)
 
beq.s Obj4C_CheckSpeedShoes
 
tst.w $32(a0)
 
beq.s Obj4C_CheckSpeedShoes
 
subq.w #1,$32(a0)
 
bne.s Obj4C_CheckSpeedShoes
 
tst.b ($FFFFF7AA).w
 
bne.s Obj4C_RemoveInvincibility
 
cmp.b #$C,$28(a0)
 
bcs.s Obj4C_RemoveInvincibility
 
move.w ($FFFFFF90).w,d0
 
jsr PlayMusic
 
 
 
Obj4C_RemoveInvincibility:   ; ...
 
bclr #1,$2B(a0)
 
 
 
Obj4C_CheckSpeedShoes:   ; ...
 
btst #2,$2B(a0)
 
beq.s Obj4C_ExitCheck
 
tst.w $34(a0)
 
beq.s Obj4C_ExitCheck
 
subq.w #1,$34(a0)
 
bne.s Obj4C_ExitCheck
 
move.w #$600,($FFFFF760).w
 
move.w #$C,($FFFFF762).w
 
move.w #$80,($FFFFF764).w
 
tst.b ($FFFFFE19).w
 
beq.s Obj4C_RemoveSpeedShoes
 
move.w #$800,($FFFFF760).w
 
move.w #$18,($FFFFF762).w
 
move.w #$C0,($FFFFF764).w
 
 
 
Obj4C_RemoveSpeedShoes:   ; ...
 
bclr #2,$2B(a0)
 
move.w #$FC,d0
 
jmp PlayMusic
 
; ---------------------------------------------------------------------------
 
 
 
Obj4C_ExitCheck:   ; ...
 
rts
 
; End of function Knuckles_Display
 
 
 
 
 
; =============== S U B R O U T I N E =======================================
 
 
 
 
 
Knuckles_RecordPositions:   ; ...
 
move.w ($FFFFEED2).w,d0
 
lea ($FFFFE500).w,a1
 
lea (a1,d0.w),a1
 
move.w 8(a0),(a1)+
 
move.w $C(a0),(a1)+
 
addq.b #4,($FFFFEED3).w
 
lea ($FFFFE400).w,a1
 
lea (a1,d0.w),a1
 
move.w ($FFFFF602).w,(a1)+
 
move.w $22(a0),(a1)+
 
rts
 
; End of function Knuckles_RecordPositions
 
 
 
 
 
; =============== S U B R O U T I N E =======================================
 
 
 
 
 
Knuckles_Water:   ; ...
 
tst.b ($FFFFF730).w
 
bne.s Obj4C_InWater
 
 
 
return_31556C:   ; ...
 
rts
 
; ---------------------------------------------------------------------------
 
 
 
Obj4C_InWater:   ; ...
 
move.w ($FFFFF646).w,d0
 
cmp.w $C(a0),d0
 
bge.s Obj4C_OutWater
 
bset #6,$22(a0)
 
bne.s return_31556C
 
move.l a0,a1
 
bsr.w ResumeMusic
 
move.b #$A,($FFFFD080).w
 
move.b #$81,($FFFFD0A8).w
 
move.l a0,($FFFFD0BC).w
 
move.w #$300,($FFFFF760).w
 
move.w #6,($FFFFF762).w
 
move.w #$40,($FFFFF764).w
 
tst.b ($FFFFFE19).w
 
beq.s loc_3155C0
 
move.w #$400,($FFFFF760).w
 
move.w #$C,($FFFFF762).w
 
move.w #$60,($FFFFF764).w
 
 
 
loc_3155C0:   ; ...
 
asr $10(a0)
 
asr $12(a0)
 
asr $12(a0)
 
beq.s return_31556C
 
move.w #$100,($FFFFD11C).w
 
move.w #$AA,d0
 
jmp PlaySound
 
; ---------------------------------------------------------------------------
 
 
 
Obj4C_OutWater:   ; ...
 
bclr #6,$22(a0)
 
beq.s return_31556C
 
move.l a0,a1
 
bsr.w ResumeMusic
 
move.w #$600,($FFFFF760).w
 
move.w #$C,($FFFFF762).w
 
move.w #$80,($FFFFF764).w
 
tst.b ($FFFFFE19).w
 
beq.s loc_315616
 
move.w #$800,($FFFFF760).w
 
move.w #$18,($FFFFF762).w
 
move.w #$C0,($FFFFF764).w
 
 
 
loc_315616:   ; ...
 
cmp.b #4,$24(a0)
 
beq.s loc_315622
 
asl $12(a0)
 
 
 
loc_315622:   ; ...
 
tst.w $12(a0)
 
beq.w return_31556C
 
                move.w #$100,($FFFFD11C).w
 
move.l a0,a1
 
bsr.w ResumeMusic
 
cmp.w #$F000,$12(a0)
 
bgt.s loc_315644
 
move.w #$F000,$12(a0)
 
 
 
loc_315644:   ; ...
 
move.w #$AA,d0
 
jmp PlaySound
 
; End of function Knuckles_Water
 
 
 
 
 
; =============== S U B R O U T I N E =======================================
 
 
 
 
 
Obj4C_MdNormal:   ; ...
 
bsr.w Knuckles_Spindash
 
bsr.w Knuckles_Jump
 
bsr.w Knuckles_SlopeResist
 
bsr.w Knuckles_Move
 
bsr.w Knuckles_Roll
 
bsr.w Knuckles_LevelBoundaries
 
jsr ObjectMove   ; AKA SpeedToPos in Sonic 1
 
bsr.w AnglePos
 
bsr.w Knuckles_SlopeRepel
 
rts
 
; End of function Obj4C_MdNormal
 
</asm>
 
And we're done with the Obj4C_MdNormal_Checks subroutine! Now we can get the rest of the code in without worrying about errors, provided you're following this guide correctly.
 
====Step 4: Part 3: Obj4C_MdAir====
 
Not very complicated, just find this, place it below the ported code and replace each "Obj01" with a "Obj4C."
 
<asm>
 
 
 
 
 
; =============== S U B R O U T I N E =======================================
 
 
 
 
 
Obj01_MdAir:   ; ...
 
tst.b $21(a0)
 
bne.s Obj01_MdAir_Gliding
 
bsr.w Knuckles_JumpHeight
 
bsr.w Knuckles_ChgJumpDir
 
bsr.w Knuckles_LevelBoundaries
 
jsr ObjectMoveAndFall
 
btst #6,$22(a0)
 
beq.s loc_31569C
 
sub.w #$28,$12(a0)
 
 
 
loc_31569C:   ; ...
 
bsr.w Knuckles_JumpAngle
 
bsr.w Knuckles_DoLevelCollision
 
rts
 
; ---------------------------------------------------------------------------
 
 
 
Obj01_MdAir_Gliding:   ; ...
 
bsr.w Knuckles_GlideSpeedControl
 
bsr.w Knuckles_LevelBoundaries
 
jsr ObjectMove   ; AKA SpeedToPos in Sonic 1
 
bsr.w Knuckles_GlideControl
 
 
 
return_3156B8:   ; ...
 
rts
 
; End of function Obj01_MdAir
 
 
 
</asm>
 
You should end up with this:
 
<asm>
 
 
 
 
 
; =============== S U B R O U T I N E =======================================
 
 
 
 
 
Obj4C_MdAir:   ; ...
 
tst.b $21(a0)
 
bne.s Obj4C_MdAir_Gliding
 
bsr.w Knuckles_JumpHeight
 
bsr.w Knuckles_ChgJumpDir
 
bsr.w Knuckles_LevelBoundaries
 
jsr ObjectMoveAndFall
 
btst #6,$22(a0)
 
beq.s loc_31569C
 
sub.w #$28,$12(a0)
 
 
 
loc_31569C:   ; ...
 
bsr.w Knuckles_JumpAngle
 
bsr.w Knuckles_DoLevelCollision
 
rts
 
; ---------------------------------------------------------------------------
 
 
 
Obj4C_MdAir_Gliding:   ; ...
 
bsr.w Knuckles_GlideSpeedControl
 
bsr.w Knuckles_LevelBoundaries
 
jsr ObjectMove   ; AKA SpeedToPos in Sonic 1
 
bsr.w Knuckles_GlideControl
 
 
 
return_3156B8:   ; ...
 
rts
 
; End of function Obj4C_MdAir
 
</asm>
 
I told you it wasn't complicated.
 
 
 
===Step 4: Part 4: Everything having to do with Knuckles' gliding===
 
And we don't even need to change anything. WOOHOO!
 
<asm>
 
; =============== S U B R O U T I N E =======================================
 
 
 
 
 
Knuckles_GlideControl:   ; ...
 
 
 
; FUNCTION CHUNK AT 00315C40 SIZE 0000003C BYTES
 
 
 
move.b $21(a0),d0
 
beq.s return_3156B8
 
cmp.b #2,d0
 
beq.w Knuckles_FallingFromGlide
 
cmp.b #3,d0
 
beq.w Knuckles_Sliding
 
cmp.b #4,d0
 
beq.w Knuckles_Climbing_Wall
 
cmp.b #5,d0
 
beq.w Knuckles_Climbing_Up
 
 
 
Knuckles_NormalGlide:
 
move.b #$A,$16(a0)
 
move.b #$A,$17(a0)
 
bsr.w Knuckles_DoLevelCollision2
 
btst #5,($FFFFF7AC).w
 
bne.w Knuckles_BeginClimb
 
move.b #$13,$16(a0)
 
move.b #9,$17(a0)
 
btst #1,($FFFFF7AC).w
 
beq.s Knuckles_BeginSlide
 
move.b ($FFFFF602).w,d0
 
and.b #$70,d0
 
bne.s loc_31574C
 
move.b #2,$21(a0)
 
move.b #$21,$1C(a0)
 
bclr #0,$22(a0)
 
tst.w $10(a0)
 
bpl.s loc_315736
 
bset #0,$22(a0)
 
 
 
loc_315736:   ; ...
 
asr $10(a0)
 
asr $10(a0)
 
move.b #$13,$16(a0)
 
move.b #9,$17(a0)
 
rts
 
; ---------------------------------------------------------------------------
 
 
 
loc_31574C:   ; ...
 
bra.w sub_315C7C
 
; ---------------------------------------------------------------------------
 
 
 
Knuckles_BeginSlide:   ; ...
 
bclr #0,$22(a0)
 
tst.w $10(a0)
 
bpl.s loc_315762
 
bset #0,$22(a0)
 
 
 
loc_315762:   ; ...
 
move.b $26(a0),d0
 
add.b #$20,d0
 
and.b #$C0,d0
 
beq.s loc_315780
 
move.w $14(a0),$10(a0)
 
move.w #0,$12(a0)
 
bra.w Knuckles_ResetOnFloor_Part2
 
; ---------------------------------------------------------------------------
 
 
 
loc_315780:   ; ...
 
move.b #3,$21(a0)
 
move.b #$CC,$1A(a0)
 
move.b #$7F,$1E(a0)
 
move.b #0,$1B(a0)
 
cmp.b #$C,$28(a0)
 
bcs.s return_3157AC
 
move.b #6,($FFFFD124).w
 
move.b #$15,($FFFFD11A).w
 
 
 
return_3157AC:   ; ...
 
rts
 
; ---------------------------------------------------------------------------
 
 
 
Knuckles_BeginClimb:   ; ...
 
tst.b ($FFFFF7AD).w
 
bmi.w loc_31587A
 
move.b $3F(a0),d5
 
move.b $1F(a0),d0
 
add.b #$40,d0
 
bpl.s loc_3157D8
 
bset #0,$22(a0)
 
bsr.w CheckLeftCeilingDist
 
or.w d0,d1
 
bne.s Knuckles_FallFromGlide
 
addq.w #1,8(a0)
 
bra.s loc_3157E8
 
; ---------------------------------------------------------------------------
 
 
 
loc_3157D8:   ; ...
 
bclr #0,$22(a0)
 
bsr.w CheckRightCeilingDist
 
or.w d0,d1
 
bne.w loc_31586A
 
 
 
loc_3157E8:   ; ...
 
move.b #$13,$16(a0)
 
move.b #9,$17(a0)
 
tst.b ($FFFFFE19).w
 
beq.s loc_315804
 
cmp.w #$480,$14(a0)
 
bcs.s loc_315804
 
nop
 
 
 
loc_315804:   ; ...
 
move.w #0,$14(a0)
 
move.w #0,$10(a0)
 
move.w #0,$12(a0)
 
move.b #4,$21(a0)
 
move.b #$B7,$1A(a0)
 
move.b #$7F,$1E(a0)
 
move.b #0,$1B(a0)
 
move.b #3,$1F(a0)
 
move.w 8(a0),$A(a0)
 
rts
 
; ---------------------------------------------------------------------------
 
 
 
Knuckles_FallFromGlide:   ; ...
 
move.w 8(a0),d3
 
move.b $16(a0),d0
 
ext.w d0
 
sub.w d0,d3
 
subq.w #1,d3
 
 
 
loc_31584A:   ; ...
 
move.w $C(a0),d2
 
sub.w #$B,d2
 
jsr ChkFloorEdge_Part2
 
tst.w d1
 
bmi.s loc_31587A
 
cmp.w #$C,d1
 
bcc.s loc_31587A
 
add.w d1,$C(a0)
 
bra.w loc_3157E8
 
; ---------------------------------------------------------------------------
 
 
 
loc_31586A:   ; ...
 
move.w 8(a0),d3
 
move.b $16(a0),d0
 
ext.w d0
 
add.w d0,d3
 
addq.w #1,d3
 
bra.s loc_31584A
 
; ---------------------------------------------------------------------------
 
 
 
loc_31587A:   ; ...
 
move.b #2,$21(a0)
 
move.b #$21,$1C(a0)
 
move.b #$13,$16(a0)
 
move.b #9,$17(a0)
 
bset #1,($FFFFF7AC).w
 
rts
 
; ---------------------------------------------------------------------------
 
 
 
Knuckles_FallingFromGlide:   ; ...
 
bsr.w Knuckles_ChgJumpDir
 
add.w #$38,$12(a0)
 
btst #6,$22(a0)
 
beq.s loc_3158B2
 
sub.w #$28,$12(a0)
 
 
 
loc_3158B2:   ; ...
 
bsr.w Knuckles_DoLevelCollision2
 
btst #1,($FFFFF7AC).w
 
bne.s return_315900
 
move.w #0,$14(a0)
 
move.w #0,$10(a0)
 
move.w #0,$12(a0)
 
move.b $16(a0),d0
 
sub.b #$13,d0
 
ext.w d0
 
add.w d0,$C(a0)
 
move.b $26(a0),d0
 
add.b #$20,d0
 
and.b #$C0,d0
 
beq.s loc_3158F0
 
bra.w Knuckles_ResetOnFloor_Part2
 
; ---------------------------------------------------------------------------
 
 
 
loc_3158F0:   ; ...
 
bsr.w Knuckles_ResetOnFloor_Part2
 
move.w #$F,$2E(a0)
 
move.b #$23,$1C(a0)
 
 
 
return_315900:   ; ...
 
rts
 
; ---------------------------------------------------------------------------
 
 
 
Knuckles_Sliding:   ; ...
 
move.b ($FFFFF602).w,d0
 
and.b #$70,d0
 
beq.s loc_315926
 
tst.w $10(a0)
 
bpl.s loc_31591E
 
add.w #$20,$10(a0)
 
bmi.s loc_31591C
 
bra.s loc_315926
 
; ---------------------------------------------------------------------------
 
 
 
loc_31591C:   ; ...
 
bra.s loc_315958
 
; ---------------------------------------------------------------------------
 
 
 
loc_31591E:   ; ...
 
sub.w #$20,$10(a0)
 
bpl.s loc_315958
 
 
 
loc_315926:   ; ...
 
move.w #0,$14(a0)
 
move.w #0,$10(a0)
 
move.w #0,$12(a0)
 
move.b $16(a0),d0
 
sub.b #$13,d0
 
ext.w d0
 
add.w d0,$C(a0)
 
bsr.w Knuckles_ResetOnFloor_Part2
 
move.w #$F,$2E(a0)
 
move.b #$22,$1C(a0)
 
rts
 
; ---------------------------------------------------------------------------
 
 
 
loc_315958:   ; ...
 
move.b #$A,$16(a0)
 
move.b #$A,$17(a0)
 
bsr.w Knuckles_DoLevelCollision2
 
bsr.w Player_CheckFloor
 
cmp.w #$E,d1
 
bge.s loc_315988
 
add.w d1,$C(a0)
 
move.b d3,$26(a0)
 
move.b #$13,$16(a0)
 
move.b #9,$17(a0)
 
rts
 
; ---------------------------------------------------------------------------
 
 
 
loc_315988:   ; ...
 
move.b #2,$21(a0)
 
move.b #$21,$1C(a0)
 
move.b #$13,$16(a0)
 
move.b #9,$17(a0)
 
bset #1,($FFFFF7AC).w
 
rts
 
; ---------------------------------------------------------------------------
 
 
 
Knuckles_Climbing_Wall:   ; ...
 
tst.b ($FFFFF7AD).w
 
bmi.w loc_315BAE
 
move.w 8(a0),d0
 
cmp.w $A(a0),d0
 
bne.w loc_315BAE
 
btst #3,$22(a0)
 
bne.w loc_315BAE
 
move.w #0,$14(a0)
 
move.w #0,$10(a0)
 
move.w #0,$12(a0)
 
move.l #$FFFFD600,($FFFFF796).w
 
cmp.b #$D,$3F(a0)
 
beq.s loc_3159F0
 
move.l #$FFFFD900,($FFFFF796).w
 
 
 
loc_3159F0:   ; ...
 
move.b $3F(a0),d5
 
move.b #$A,$16(a0)
 
move.b #$A,$17(a0)
 
moveq #0,d1
 
btst #0,($FFFFF602).w
 
beq.w loc_315A76
 
move.w $C(a0),d2
 
sub.w #$B,d2
 
bsr.w sub_315C22
 
cmp.w #4,d1
 
bge.w Knuckles_ClimbUp   ; Climb onto the floor above you
 
tst.w d1
 
bne.w loc_315B30
 
move.b $3F(a0),d5
 
move.w $C(a0),d2
 
subq.w #8,d2
 
move.w 8(a0),d3
 
bsr.w sub_3192E6   ; Doesn't exist in S2
 
tst.w d1
 
bpl.s loc_315A46
 
sub.w d1,$C(a0)
 
moveq #1,d1
 
bra.w loc_315B04
 
; ---------------------------------------------------------------------------
 
 
 
loc_315A46:   ; ...
 
subq.w #1,$C(a0)
 
tst.b ($FFFFFE19).w
 
beq.s loc_315A54
 
subq.w #1,$C(a0)
 
 
 
loc_315A54:   ; ...
 
moveq #1,d1
 
move.w ($FFFFEECC).w,d0
 
cmp.w #-$100,d0
 
beq.w loc_315B04
 
add.w #$10,d0
 
cmp.w $C(a0),d0
 
ble.w loc_315B04
 
move.w d0,$C(a0)
 
bra.w loc_315B04
 
; ---------------------------------------------------------------------------
 
 
 
loc_315A76:   ; ...
 
btst #1,($FFFFF602).w
 
beq.w loc_315B04
 
cmp.b #$BD,$1A(a0)
 
bne.s loc_315AA2
 
move.b #$B7,$1A(a0)
 
addq.w #3,$C(a0)
 
subq.w #3,8(a0)
 
btst #0,$22(a0)
 
beq.s loc_315AA2
 
addq.w #6,8(a0)
 
 
 
loc_315AA2:   ; ...
 
move.w $C(a0),d2
 
add.w #$B,d2
 
bsr.w sub_315C22
 
tst.w d1
 
bne.w loc_315BAE
 
move.b $3E(a0),d5
 
move.w $C(a0),d2
 
add.w #9,d2
 
move.w 8(a0),d3
 
bsr.w sub_318FF6
 
tst.w d1
 
bpl.s loc_315AF4
 
add.w d1,$C(a0)
 
move.b ($FFFFF768).w,$26(a0)
 
move.w #0,$14(a0)
 
move.w #0,$10(a0)
 
move.w #0,$12(a0)
 
bsr.w Knuckles_ResetOnFloor_Part2
 
move.b #5,$1C(a0)
 
rts
 
; ---------------------------------------------------------------------------
 
 
 
loc_315AF4:   ; ...
 
addq.w #1,$C(a0)
 
tst.b ($FFFFFE19).w
 
beq.s loc_315B02
 
addq.w #1,$C(a0)
 
 
 
loc_315B02:   ; ...
 
moveq #-1,d1
 
 
 
loc_315B04:   ; ...
 
tst.w d1
 
beq.s loc_315B30
 
subq.b #1,$1F(a0)
 
bpl.s loc_315B30
 
move.b #3,$1F(a0)
 
add.b $1A(a0),d1
 
cmp.b #$B7,d1
 
bcc.s loc_315B22
 
move.b #$BC,d1
 
 
 
loc_315B22:   ; ...
 
cmp.b #$BC,d1
 
bls.s loc_315B2C
 
move.b #$B7,d1
 
 
 
loc_315B2C:   ; ...
 
move.b d1,$1A(a0)
 
 
 
loc_315B30:   ; ...
 
move.b #$20,$1E(a0)
 
move.b #0,$1B(a0)
 
move.b #$13,$16(a0)
 
move.b #9,$17(a0)
 
move.w ($FFFFF602).w,d0
 
and.w #$70,d0
 
beq.s return_315B94
 
move.w #$FC80,$12(a0)
 
move.w #$400,$10(a0)
 
bchg #0,$22(a0)
 
bne.s loc_315B6A
 
neg.w $10(a0)
 
 
 
loc_315B6A:   ; ...
 
bset #1,$22(a0)
 
move.b #1,$3C(a0)
 
move.b #$E,$16(a0)
 
move.b #7,$17(a0)
 
move.b #2,$1C(a0)
 
bset #2,$22(a0)
 
move.b #0,$21(a0)
 
 
 
return_315B94:   ; ...
 
rts
 
; ---------------------------------------------------------------------------
 
 
 
Knuckles_ClimbUp:   ; ...
 
move.b #5,$21(a0)   ; Climb up to the floor above you
 
cmp.b #$BD,$1A(a0)
 
beq.s return_315BAC
 
move.b #0,$1F(a0)
 
bsr.s sub_315BDA
 
 
 
return_315BAC:   ; ...
 
rts
 
; ---------------------------------------------------------------------------
 
 
 
loc_315BAE:   ; ...
 
move.b #2,$21(a0)
 
move.w #$2121,$1C(a0)
 
move.b #$CB,$1A(a0)
 
move.b #7,$1E(a0)
 
move.b #1,$1B(a0)
 
move.b #$13,$16(a0)
 
move.b #9,$17(a0)
 
rts
 
; End of function Knuckles_GlideControl
 
 
 
 
 
; =============== S U B R O U T I N E =======================================
 
 
 
 
 
sub_315BDA:   ; ...
 
moveq #0,d0
 
move.b $1F(a0),d0
 
lea word_315C12(pc,d0.w),a1
 
move.b (a1)+,$1A(a0)
 
move.b (a1)+,d0
 
ext.w d0
 
btst #0,$22(a0)
 
beq.s loc_315BF6
 
neg.w d0
 
 
 
loc_315BF6:   ; ...
 
add.w d0,8(a0)
 
move.b (a1)+,d1
 
ext.w d1
 
add.w d1,$C(a0)
 
move.b (a1)+,$1E(a0)
 
addq.b #4,$1F(a0)
 
move.b #0,$1B(a0)
 
rts
 
; End of function sub_315BDA
 
 
 
; ---------------------------------------------------------------------------
 
word_315C12: dc.w $BD03,$FD06,$BE08,$F606,$BFF8,$F406,$D208,$FB06; 0 ; ...
 
 
 
; =============== S U B R O U T I N E =======================================
 
 
 
 
 
sub_315C22:   ; ...
 
 
 
; FUNCTION CHUNK AT 00319208 SIZE 00000020 BYTES
 
; FUNCTION CHUNK AT 003193D2 SIZE 00000024 BYTES
 
 
 
move.b $3F(a0),d5
 
btst #0,$22(a0)
 
bne.s loc_315C36
 
move.w 8(a0),d3
 
bra.w loc_319208
 
; ---------------------------------------------------------------------------
 
 
 
loc_315C36:   ; ...
 
move.w 8(a0),d3
 
subq.w #1,d3
 
bra.w loc_3193D2
 
; End of function sub_315C22
 
 
 
; ---------------------------------------------------------------------------
 
; START OF FUNCTION CHUNK FOR Knuckles_GlideControl
 
 
 
Knuckles_Climbing_Up:   ; ...
 
tst.b $1E(a0)
 
bne.s return_315C7A
 
bsr.w sub_315BDA
 
cmp.b #$10,$1F(a0)
 
bne.s return_315C7A
 
move.w #0,$14(a0)
 
move.w #0,$10(a0)
 
move.w #0,$12(a0)
 
btst #0,$22(a0)
 
beq.s loc_315C70
 
subq.w #1,8(a0)
 
 
 
loc_315C70:   ; ...
 
bsr.w Knuckles_ResetOnFloor_Part2
 
move.b #5,$1C(a0)
 
 
 
return_315C7A:   ; ...
 
rts
 
; END OF FUNCTION CHUNK FOR Knuckles_GlideControl
 
 
 
; =============== S U B R O U T I N E =======================================
 
 
 
 
 
sub_315C7C:   ; ...
 
move.b #$20,$1E(a0)
 
move.b #0,$1B(a0)
 
move.w #$2020,$1C(a0)
 
bclr #5,$22(a0)
 
bclr #0,$22(a0)
 
moveq #0,d0
 
move.b $1F(a0),d0
 
add.b #$10,d0
 
lsr.w #5,d0
 
move.b byte_315CC2(pc,d0.w),d1
 
move.b d1,$1A(a0)
 
cmp.b #$C4,d1
 
bne.s return_315CC0
 
bset #0,$22(a0)
 
move.b #$C0,$1A(a0)
 
 
 
return_315CC0:   ; ...
 
rts
 
; End of function sub_315C7C
 
 
 
; ---------------------------------------------------------------------------
 
byte_315CC2: dc.b $C0,$C1,$C2,$C3,$C4,$C3,$C2,$C1; 0 ; ...
 
 
 
; =============== S U B R O U T I N E =======================================
 
 
 
 
 
Knuckles_GlideSpeedControl:   ; ...
 
cmp.b #1,$21(a0)
 
bne.w loc_315D88
 
move.w $14(a0),d0
 
cmp.w #$400,d0
 
bcc.s loc_315CE2
 
addq.w #8,d0
 
bra.s loc_315CFC
 
; ---------------------------------------------------------------------------
 
 
 
loc_315CE2:   ; ...
 
cmp.w #$1800,d0
 
bcc.s loc_315CFC
 
move.b $1F(a0),d1
 
and.b #$7F,d1
 
bne.s loc_315CFC
 
addq.w #4,d0
 
tst.b ($FFFFFE19).w
 
beq.s loc_315CFC
 
addq.w #8,d0
 
 
 
loc_315CFC:   ; ...
 
move.w d0,$14(a0)
 
move.b $1F(a0),d0
 
btst #2,($FFFFF602).w
 
beq.s loc_315D1C
 
cmp.b #$80,d0
 
beq.s loc_315D1C
 
tst.b d0
 
bpl.s loc_315D18
 
neg.b d0
 
 
 
loc_315D18:   ; ...
 
addq.b #2,d0
 
bra.s loc_315D3A
 
; ---------------------------------------------------------------------------
 
 
 
loc_315D1C:   ; ...
 
btst #3,($FFFFF602).w
 
beq.s loc_315D30
 
tst.b d0
 
beq.s loc_315D30
 
bmi.s loc_315D2C
 
neg.b d0
 
 
 
loc_315D2C:   ; ...
 
addq.b #2,d0
 
bra.s loc_315D3A
 
; ---------------------------------------------------------------------------
 
 
 
loc_315D30:   ; ...
 
move.b d0,d1
 
and.b #$7F,d1
 
beq.s loc_315D3A
 
addq.b #2,d0
 
 
 
loc_315D3A:   ; ...
 
move.b d0,$1F(a0)
 
move.b $1F(a0),d0
 
jsr CalcSine
 
muls.w $14(a0),d1
 
asr.l #8,d1
 
move.w d1,$10(a0)
 
cmp.w #$80,$12(a0)
 
blt.s loc_315D62
 
sub.w #$20,$12(a0)
 
bra.s loc_315D68
 
; ---------------------------------------------------------------------------
 
 
 
loc_315D62:   ; ...
 
add.w #$20,$12(a0)
 
 
 
loc_315D68:   ; ...
 
move.w ($FFFFEECC).w,d0
 
cmp.w #$FF00,d0
 
beq.w loc_315D88
 
add.w #$10,d0
 
cmp.w $C(a0),d0
 
ble.w loc_315D88
 
asr $10(a0)
 
asr $14(a0)
 
 
 
loc_315D88:   ; ...
 
cmp.w #$60,($FFFFEED8).w
 
beq.s return_315D9A
 
bcc.s loc_315D96
 
addq.w #4,($FFFFEED8).w
 
 
 
loc_315D96:   ; ...
 
subq.w #2,($FFFFEED8).w
 
 
 
return_315D9A:   ; ...
 
rts
 
; End of function Knuckles_GlideSpeedControl
 
 
 
; ---------------------------------------------------------------------------
 
</asm>
 

Latest revision as of 21:56, 31 May 2022

This is the page where you can test out stuff on the Wiki.

This page is NOT for drafting new articles. If you want to write up a new article and save it on the Wiki, but don't want to publish it in a main article, create a new article using your User namespace, e.g. User:JoeSchmoe/My_New_Article . ___________________________________________________________________________________________________