|
|
(63 intermediate revisions by 12 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]].
| |
− | *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
| |
− | </asm>
| |
− | 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>
| |
− | ==Just to Recap==
| |
− | At this point, you should have this code ported:
| |
− | <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
| |
− | ; ----------------------------------------------------------------------------
| |
− | | |
− | 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)
| |
− | | |
− | 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: dc.w Obj4C_MdNormal_Checks ; 0 ; not airborne or rolling
| |
− | dc.w Obj4C_MdAir ; 2 ; airborne
| |
− | dc.w Obj4C_MdRoll ; 4 ; rolling
| |
− | dc.w Obj4C_MdJump ; 6 ; jumping
| |
− | | |
− | ; =============== 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
| |
− | | |
− | | |
− | ; =============== 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
| |
− | | |
− | | |
− | ; =============== 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>
| |