1237 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
		
		
			
		
	
	
			1237 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
|   | fullsa1rom | ||
|  | 
 | ||
|  | !GAME_STATUS = $36D0 | ||
|  | 
 | ||
|  | ; SNES hardware registers | ||
|  | !VMADDL = $002116 | ||
|  | !VMDATAL = $002118 | ||
|  | !MDMAEN = $00420B | ||
|  | !DMAP0 = $004300 | ||
|  | !BBAD0 = $004301 | ||
|  | !A1T0L = $004302 | ||
|  | !A1B0 = $004304 | ||
|  | !DAS0L = $004305 | ||
|  | 
 | ||
|  | org $008033 | ||
|  |     JSL WriteBWRAM | ||
|  |     NOP #5 | ||
|  | 
 | ||
|  | org $00A245 | ||
|  | HSVPatch: | ||
|  |   BRA .Jump | ||
|  |   PHX | ||
|  |   LDA $6CA0,X | ||
|  |   TAX | ||
|  |   LDA $6E22,X | ||
|  |   JSR $A25B | ||
|  |   PLX | ||
|  |   INX | ||
|  |   .Jump: | ||
|  |   JSL HeartStarVisual | ||
|  | 
 | ||
|  | 
 | ||
|  | org $00A3FC | ||
|  |     JSL NintenHalken | ||
|  |     NOP | ||
|  | 
 | ||
|  | org $00EAE4 | ||
|  |     JSL MainLoopHook | ||
|  |     NOP | ||
|  | 
 | ||
|  | org $00F85E | ||
|  |     JSL SpeedTrap | ||
|  |     NOP #2 | ||
|  | 
 | ||
|  | org $00FFC0 | ||
|  |     db "KDL3_BASEPATCH_ARCHI" | ||
|  | 
 | ||
|  | org $00FFD8 | ||
|  |     db $06 | ||
|  | 
 | ||
|  | org $018405 | ||
|  |     JSL PauseMenu | ||
|  | 
 | ||
|  | org $01AFC8 | ||
|  |     JSL HeartStarCheck | ||
|  |     NOP #13 | ||
|  | 
 | ||
|  | org $01B013 | ||
|  |     SEC ; Remove Dedede Bad Ending | ||
|  | 
 | ||
|  | org $02B7B0 ; Zero unlock | ||
|  |     LDA $80A0 | ||
|  |     CMP #$0001 | ||
|  | 
 | ||
|  | org $02C238 | ||
|  |     LDA #$0006 | ||
|  |     JSL OpenWorldUnlock | ||
|  |     NOP #5 | ||
|  | 
 | ||
|  | org $02C27C | ||
|  |     JSL HeartStarSelectFix | ||
|  |     NOP #2 | ||
|  | 
 | ||
|  | org $02C317 | ||
|  |     JSL LoadFont | ||
|  | 
 | ||
|  | org $02C39D | ||
|  |     JSL StageCompleteSet | ||
|  |     NOP #2 | ||
|  | 
 | ||
|  | org $02C3D9 | ||
|  |     JSL StrictBosses | ||
|  |     NOP #2 | ||
|  | 
 | ||
|  | org $02C3F0 | ||
|  |     JSL OpenWorldBossUnlock | ||
|  |     NOP #6 | ||
|  | 
 | ||
|  | org $02C463 | ||
|  |     JSL NormalGoalSet | ||
|  |     NOP #2 | ||
|  | 
 | ||
|  | org $049CD7 | ||
|  |     JSL AnimalFriendSpawn | ||
|  | 
 | ||
|  | org $06801E | ||
|  |     JSL ConsumableSet | ||
|  | 
 | ||
|  | org $068518 | ||
|  |     JSL CopyAbilityOverride | ||
|  |     NOP #2 | ||
|  | 
 | ||
|  | org $099F35 | ||
|  |     JSL HeartStarCutsceneFix | ||
|  | 
 | ||
|  | org $09A01F | ||
|  |     JSL HeartStarGraphicFix | ||
|  |     NOP #2 | ||
|  |     db $B0 | ||
|  | 
 | ||
|  | org $09A0AE | ||
|  |     JSL HeartStarGraphicFix | ||
|  |     NOP #2 | ||
|  |     db $90 | ||
|  | 
 | ||
|  | org $0A87E8 | ||
|  |     JSL CopyAbilityAnimalOverride | ||
|  |     NOP #2 | ||
|  | 
 | ||
|  | org $12B238 | ||
|  |     JSL FinalIcebergFix | ||
|  |     NOP #10 | ||
|  |     db $B0 | ||
|  | 
 | ||
|  | org $14A3EB | ||
|  |     LDA $07A2, Y | ||
|  |     JSL StarsSet | ||
|  |     NOP #3 | ||
|  | 
 | ||
|  | org $15BC13 | ||
|  |     JML GiftGiving | ||
|  |     NOP | ||
|  | 
 | ||
|  | org $0799A0 | ||
|  | CopyAbilityOverride: | ||
|  |     LDA $54F3, Y | ||
|  |     PHA | ||
|  |     ASL | ||
|  |     TAX | ||
|  |     PLA | ||
|  |     CMP $8020, X | ||
|  |     NOP #2 | ||
|  |     BEQ .StoreAbilityK | ||
|  |     LDA #$0000 | ||
|  |     .StoreAbilityK: | ||
|  |     STA $54A9, Y | ||
|  |     RTL | ||
|  |     NOP #4 | ||
|  | CopyAbilityAnimalOverride: | ||
|  |     PHA | ||
|  |     ASL | ||
|  |     TAY | ||
|  |     PLA | ||
|  |     CMP $8020, Y | ||
|  |     NOP | ||
|  |     BEQ .StoreAbilityA | ||
|  |     LDA #$0000 | ||
|  |     .StoreAbilityA: | ||
|  |     STA $54A9, X | ||
|  |     STA $39DF, X | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $079A00 | ||
|  | HeartStarCheck: | ||
|  |     TXA | ||
|  |     CMP #$0000 ; is this level 1 | ||
|  |     BEQ .PassToX | ||
|  |     LSR | ||
|  |     LSR | ||
|  |     INC | ||
|  |     .PassToX: | ||
|  |     TAX | ||
|  |     LDA $8070 ; heart stars | ||
|  |     CLC | ||
|  |     CMP $07D00A ;Compare to goal heart stars | ||
|  |     BCC .CompareWorldHS ; we don't have enough | ||
|  |     PHX | ||
|  |     LDA #$0014 | ||
|  |     STA $7F62 ; play sound fx 0x14 | ||
|  |     LDA $07D012 ; goal | ||
|  |     CMP #$0000 ; are we on zero goal? | ||
|  |     BEQ .ZeroGoal ; we are | ||
|  |     LDA #$0001 | ||
|  |     LDX $3617 ; current save | ||
|  |     STA $53DD, X ; boss butch | ||
|  |     STA $53DF, X ; MG5 | ||
|  |     STA $53E1, X ; Jumping | ||
|  |     BRA .PullX | ||
|  |     .ZeroGoal: | ||
|  |     LDA #$0001 | ||
|  |     STA $80A0 ; zero unlock address | ||
|  |     .PullX: | ||
|  |     PLX | ||
|  |     .CompareWorldHS: | ||
|  |     LDA $8070 ; current heart stars | ||
|  |     CMP $07D000, X ; compare to world heart stars | ||
|  |     BCS .ReturnTrue | ||
|  |     CLC | ||
|  |     RTL | ||
|  |     .ReturnTrue: | ||
|  |     SEC | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $079A80 | ||
|  | OpenWorldUnlock: | ||
|  |     PHX | ||
|  |     LDX $900E ; Are we on open world? | ||
|  |     BNE .Open ; Branch if we are | ||
|  |     LDA #$0001 | ||
|  |     .Open: | ||
|  |     STA $5AC1 ;(cutscene) | ||
|  |     STA $53CD ;(unlocked stages) | ||
|  |     INC | ||
|  |     STA $5AB9 ;(currently selectable stages) | ||
|  |     CPX #$0001 | ||
|  |     BNE .Return ; Return if we aren't on open world | ||
|  |     LDA #$0001 | ||
|  |     STA $5A9D | ||
|  |     STA $5A9F | ||
|  |     STA $5AA1 | ||
|  |     STA $5AA3 | ||
|  |     STA $5AA5 | ||
|  |     .Return: | ||
|  |     PLX | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $079B00 | ||
|  | MainLoopHook: | ||
|  |     STA $D4 | ||
|  |     INC $3524 | ||
|  |     JSL ParseItemQueue | ||
|  |     LDA $7F62 ; sfx to be played | ||
|  |     BEQ .Traps ; skip if 0 | ||
|  |     JSL $00D927 ; play sfx | ||
|  |     STZ $7F62 | ||
|  |     .Traps: | ||
|  |     LDA $36D0 | ||
|  |     CMP #$FFFF ; are we in menus? | ||
|  |     BEQ .Return ; return if we are | ||
|  |     LDA $5541 ; gooey status | ||
|  |     BPL .Slowness ; gooey is already spawned | ||
|  |     LDA $8080 | ||
|  |     CMP #$0000 ; did we get a gooey trap | ||
|  |     BEQ .Slowness ; branch if we did not | ||
|  |     JSL GooeySpawn | ||
|  |     STZ $8080 | ||
|  |     .Slowness: | ||
|  |     LDA $8082 ; slowness | ||
|  |     BEQ .Eject ; are we under the effects of a slowness trap | ||
|  |     DEC | ||
|  |     STA $8082 ; dec by 1 each frame | ||
|  |     .Eject: | ||
|  |     PHX | ||
|  |     PHY | ||
|  |     LDA $54A9 ; copy ability | ||
|  |     BEQ .PullVars ; branch if we do not have a copy ability | ||
|  |     LDA $8084 ; eject ability | ||
|  |     BEQ .PullVars ; branch if we haven't received eject | ||
|  |     LDA #$2000 ; select button press | ||
|  |     STA $60C1 ; write to controller mirror | ||
|  |     STZ $8084 | ||
|  |     .PullVars: | ||
|  |     PLY | ||
|  |     PLX | ||
|  |     .Return: | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $079B80 | ||
|  | HeartStarGraphicFix: | ||
|  |     LDA #$0000 | ||
|  |     PHX | ||
|  |     PHY | ||
|  |     LDX $363F ; current level | ||
|  |     LDY $3641 ; current stage | ||
|  |     .LoopLevel: | ||
|  |     CPX #$0000 | ||
|  |     BEQ .LoopStage | ||
|  |     INC #6 | ||
|  |     DEX | ||
|  |     BRA .LoopLevel ; return to loop head | ||
|  |     .LoopStage: | ||
|  |     CPY #$0000 | ||
|  |     BEQ .EndLoop | ||
|  |     INC | ||
|  |     DEY | ||
|  |     BRA .LoopStage ; return to loop head | ||
|  |     .EndLoop | ||
|  |     ASL | ||
|  |     TAX | ||
|  |     LDA $07D080, X ; table of original stage number | ||
|  |     CMP #$0003 ; is the current stage a minigame stage? | ||
|  |     BEQ .ReturnTrue ; branch if so | ||
|  |     CLC | ||
|  |     BRA .Return | ||
|  |     .ReturnTrue: | ||
|  |     SEC | ||
|  |     .Return: | ||
|  |     PLY | ||
|  |     PLX | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $079BF0 | ||
|  | ParseItemQueue: | ||
|  | ; Local item queue parsing | ||
|  |     NOP | ||
|  |     LDX #$0000 | ||
|  |     .LoopHead: | ||
|  |     LDA $C000,X | ||
|  |     BIT #$0010 | ||
|  |     BNE .Ability | ||
|  |     BIT #$0020 | ||
|  |     BNE .Animal | ||
|  |     BIT #$0040 | ||
|  |     BNE .Positive | ||
|  |     BIT #$0080 | ||
|  |     BNE .Negative | ||
|  |     .LoopCheck: | ||
|  |     INX | ||
|  |     INX | ||
|  |     CPX #$000F | ||
|  |     BCC .LoopHead | ||
|  |     RTL | ||
|  |     .Ability: | ||
|  |     JSL .ApplyAbility | ||
|  |     RTL | ||
|  |     .Animal: | ||
|  |     JSL .ApplyAnimal | ||
|  |     RTL | ||
|  |     .Positive: | ||
|  |     LDY $36D0 | ||
|  |     CPY #$FFFF | ||
|  |     BEQ .LoopCheck | ||
|  |     JSL .ApplyPositive | ||
|  |     RTL | ||
|  |     .Negative: | ||
|  |     AND #$000F | ||
|  |     ASL | ||
|  |     TAY | ||
|  |     LDA $8080,Y | ||
|  |     BNE .LoopCheck | ||
|  |     JSL .ApplyNegative | ||
|  |     RTL | ||
|  |     .ApplyAbility: | ||
|  |     AND #$000F | ||
|  |     PHA | ||
|  |     ASL | ||
|  |     TAY | ||
|  |     PLA | ||
|  |     STA $8020,Y | ||
|  |     LDA #$0032 | ||
|  |     BRA .PlaySFX | ||
|  |     .ApplyAnimal: | ||
|  |     AND #$000F | ||
|  |     PHA | ||
|  |     ASL | ||
|  |     TAY | ||
|  |     PLA | ||
|  |     INC | ||
|  |     STA $8000,Y | ||
|  |     LDA #$0032 | ||
|  |     BRA .PlaySFX | ||
|  |     .PlaySFX: | ||
|  |     STA $7F62 | ||
|  |     STZ $C000,X | ||
|  |     .Return: | ||
|  |     RTL | ||
|  |     .ApplyPositive: | ||
|  |     LDY $36D0 | ||
|  |     CPY #$FFFF | ||
|  |     BEQ .Return | ||
|  |     AND #$000F | ||
|  |     BEQ .HeartStar | ||
|  |     CMP #$0004 | ||
|  |     BCS .StarBit | ||
|  |     CMP #$0002 | ||
|  |     BCS .Not1UP | ||
|  |     LDA $39CF | ||
|  |     INC | ||
|  |     STA $39CF | ||
|  |     STA $39E3 | ||
|  |     LDA #$0033 | ||
|  |     BRA .PlaySFX | ||
|  |     .Not1UP: | ||
|  |     CMP #$0003 | ||
|  |     BEQ .Invincibility | ||
|  |     LDA $39D3 | ||
|  |     BEQ .JustKirby | ||
|  |     LDA #$0008 | ||
|  |     STA $39D1 | ||
|  |     STA $39D3 | ||
|  |     BRA .PlayPositive | ||
|  |     .JustKirby: | ||
|  |     LDA #$000A | ||
|  |     STA $39D1 | ||
|  |     BRA .PlayPositive | ||
|  |     .Invincibility: | ||
|  |     LDA #$0384 | ||
|  |     STA $54B1 | ||
|  |     BRA .PlayPositive | ||
|  |     .HeartStar: | ||
|  |     INC $8070 | ||
|  |     LDA #$0016 | ||
|  |     BRA .PlaySFX | ||
|  |     .StarBit: | ||
|  |     SEC | ||
|  |     SBC #$0004 | ||
|  |     ASL | ||
|  |     INC | ||
|  |     CLC | ||
|  |     ADC $39D7 | ||
|  |     ORA #$8000 | ||
|  |     STA $39D7 | ||
|  |     .PlayPositive: | ||
|  |     LDA #$0026 | ||
|  |     .PlaySFXLong | ||
|  |     BRA .PlaySFX | ||
|  |     .ApplyNegative: | ||
|  |     CPY #$0005 | ||
|  |     BCS .PlayNone | ||
|  |     LDA $8080,Y | ||
|  |     BNE .Return | ||
|  |     LDA #$0384 | ||
|  |     STA $8080,Y | ||
|  |     LDA #$00A7 | ||
|  |     BRA .PlaySFXLong | ||
|  |     .PlayNone: | ||
|  |     LDA #$0000 | ||
|  |     BRA .PlaySFXLong | ||
|  | 
 | ||
|  | org $079D00 | ||
|  | AnimalFriendSpawn: | ||
|  |     PHA | ||
|  |     CPX #$0002  ; is this an animal friend? | ||
|  |     BNE .Return | ||
|  |     XBA | ||
|  |     PHA | ||
|  |     ASL | ||
|  |     TAY | ||
|  |     PLA | ||
|  |     INC | ||
|  |     CMP $8000, Y ; do we have this animal friend | ||
|  |     BEQ .Return ; we have this animal friend | ||
|  |     INX | ||
|  |     .Return: | ||
|  |     PLY | ||
|  |     LDA #$9999 | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $079E00 | ||
|  | WriteBWRAM: | ||
|  |     LDY #$6001 ;starting addr | ||
|  |     LDA #$1FFE ;bytes to write | ||
|  |     MVN $40, $40 ;copy $406000 from 406001 to 407FFE | ||
|  |     LDX #$0000 | ||
|  |     LDY #$0014 | ||
|  |     .LoopHead: | ||
|  |     LDA $8100, X ; rom header | ||
|  |     CMP $07C000, X ; compare to real rom name | ||
|  |     BNE .InitializeRAM ; area is uninitialized or corrupt, reset | ||
|  |     INX | ||
|  |     DEY | ||
|  |     BMI .Return ; if Y is negative, rom header matches, valid bwram | ||
|  |     BRA .LoopHead ; else continue loop | ||
|  |     .InitializeRAM: | ||
|  |     LDA #$0000 | ||
|  |     STA $8000 ; initialize first byte that gets copied | ||
|  |     LDX #$8000 | ||
|  |     LDY #$8001 | ||
|  |     LDA #$7FFD | ||
|  |     MVN $40, $40 ; initialize 0x8000 onward | ||
|  |     LDX #$D000 ; seed info 0x3D000 | ||
|  |     LDY #$9000 ; target location | ||
|  |     LDA #$1000 | ||
|  |     MVN $40, $07 | ||
|  |     LDX #$C000 ; ROM name | ||
|  |     LDY #$8100 ; target | ||
|  |     LDA #$0015 | ||
|  |     MVN $40, $07 | ||
|  |     .Return: | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $079E80 | ||
|  | ConsumableSet: | ||
|  |     PHA | ||
|  |     PHX | ||
|  |     PHY | ||
|  |     AND #$00FF | ||
|  |     PHA | ||
|  |     LDX $53CF | ||
|  |     LDY $53D3 | ||
|  |     LDA #$0000 | ||
|  |     DEY | ||
|  |     .LoopLevel: | ||
|  |     CPX #$0000 | ||
|  |     BEQ .LoopStage | ||
|  |     CLC | ||
|  |     ADC #$0007 | ||
|  |     DEX | ||
|  |     BRA .LoopLevel ; return to loop head | ||
|  |     .LoopStage: | ||
|  |     CPY #$0000 | ||
|  |     BEQ .EndLoop | ||
|  |     INC | ||
|  |     DEY | ||
|  |     BRA .LoopStage ; return to loop head | ||
|  |     .EndLoop: | ||
|  |     ASL | ||
|  |     TAX | ||
|  |     LDA $07D020, X ; current stage | ||
|  |     DEC | ||
|  |     ASL #6 | ||
|  |     TAX | ||
|  |     PLA | ||
|  |     .LoopHead: | ||
|  |     CMP #$0000 | ||
|  |     BEQ .ApplyCheck | ||
|  |     INX | ||
|  |     DEC | ||
|  |     BRA .LoopHead ; return to loop head | ||
|  |     .ApplyCheck: | ||
|  |     LDA $A000, X ; consumables index | ||
|  |     ORA #$0001 | ||
|  |     STA $A000, X | ||
|  |     PLY | ||
|  |     PLX | ||
|  |     PLA | ||
|  |     XBA | ||
|  |     AND #$00FF | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $079F00 | ||
|  | NormalGoalSet: | ||
|  |     PHX | ||
|  |     LDA $07D012 | ||
|  |     CMP #$0000 | ||
|  |     BEQ .ZeroGoal | ||
|  |     LDA #$0001 | ||
|  |     LDX $3617 ; current save | ||
|  |     STA $53DD, X ; Boss butch | ||
|  |     STA $53DF, X ; MG5 | ||
|  |     STA $53D1, X ; Jumping | ||
|  |     BRA .Return | ||
|  |     .ZeroGoal: | ||
|  |     LDA #$0001 | ||
|  |     STA $80A0 | ||
|  |     .Return: | ||
|  |     PLX | ||
|  |     LDA #$0006 | ||
|  |     STA $5AC1 ; cutscene | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $079F80 | ||
|  | FinalIcebergFix: | ||
|  |     PHX | ||
|  |     PHY | ||
|  |     LDA #$0000 | ||
|  |     LDX $363F | ||
|  |     LDY $3641 | ||
|  |     .LoopLevel: | ||
|  |     CPX #$0000 | ||
|  |     BEQ .LoopStage | ||
|  |     INC #7 | ||
|  |     DEX | ||
|  |     BRA .LoopLevel ; return to loop head | ||
|  |     .LoopStage: | ||
|  |     CPY #$0000 | ||
|  |     BEQ .CheckStage | ||
|  |     INC | ||
|  |     DEY | ||
|  |     BRA .LoopStage ; return to loop head | ||
|  |     .CheckStage: | ||
|  |     ASL | ||
|  |     TAX | ||
|  |     LDA $07D020, X | ||
|  |     CMP #$001E | ||
|  |     BEQ .ReturnTrue | ||
|  |     CLC | ||
|  |     BRA .Return | ||
|  |     .ReturnTrue: | ||
|  |     SEC | ||
|  |     .Return: | ||
|  |     PLY | ||
|  |     PLX | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $07A000 | ||
|  | StrictBosses: | ||
|  |     PHX | ||
|  |     LDA $901E ; Do we have strict bosses enabled? | ||
|  |     BEQ .ReturnTrue ; Return True if we don't, always unlock the boss in this case | ||
|  |     LDA $53CB ; unlocked level | ||
|  |     CMP #$0005 ; have we unlocked level 5? | ||
|  |     BCS .ReturnFalse ; we don't need to do anything if so | ||
|  |     NOP #5 ;unsure when these got here | ||
|  |     LDX $53CB | ||
|  |     DEX | ||
|  |     TXA | ||
|  |     ASL | ||
|  |     TAX | ||
|  |     LDA $8070 ; current heart stars | ||
|  |     CMP $07D000, X ; do we have enough HS to purify? | ||
|  |     BCS .ReturnTrue ; branch if we do | ||
|  |     .ReturnFalse: | ||
|  |     SEC | ||
|  |     BRA .Return | ||
|  |     .ReturnTrue: | ||
|  |     CLC | ||
|  |     .Return: | ||
|  |     PLX | ||
|  |     LDA $53CD | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $07A030 | ||
|  | NintenHalken: | ||
|  |     LDX #$0005 | ||
|  |     .Halken: | ||
|  |     LDA $00A405, X ; loop head (halken) | ||
|  |     STA $4080F0, X | ||
|  |     DEX | ||
|  |     BPL .Halken ; branch if more letters to copy | ||
|  |     LDX #$0005 | ||
|  |     .Ninten: | ||
|  |     LDA $00A40B, X ; loop head (ninten) | ||
|  |     STA $408FF0, X | ||
|  |     DEX | ||
|  |     BPL .Ninten ; branch if more letters to copy | ||
|  |     REP #$20 | ||
|  |     LDA #$0001 | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $07A080 | ||
|  | StageCompleteSet: | ||
|  |     PHX | ||
|  |     LDA $5AC1 ; completed stage cutscene | ||
|  |     BEQ .Return ; we have not completed a stage | ||
|  |     LDA #$0000 | ||
|  |     LDX $53CF ; current level | ||
|  |     .LoopLevel: | ||
|  |     CPX #$0000 | ||
|  |     BEQ .StageStart | ||
|  |     DEX | ||
|  |     INC #7 | ||
|  |     BRA .LoopLevel ; return to loop head | ||
|  |     .StageStart: | ||
|  |     LDX $53D3 ; current stage | ||
|  |     CPX #$0007 ; is this a boss stage | ||
|  |     BEQ .Return ; return if so | ||
|  |     DEX | ||
|  |     .LoopStage: | ||
|  |     CPX #$0000 | ||
|  |     BEQ .LoopEnd | ||
|  |     INC | ||
|  |     DEX | ||
|  |     BRA .LoopStage ; return to loop head | ||
|  |     .LoopEnd: | ||
|  |     ASL | ||
|  |     TAX | ||
|  |     LDA $9020, X ; load the stage we completed | ||
|  |     DEC | ||
|  |     ASL | ||
|  |     TAX | ||
|  |     LDA #$0001 | ||
|  |     ORA $8200, X | ||
|  |     STA $8200, X | ||
|  |     .Return: | ||
|  |     PLX | ||
|  |     LDA $53CF | ||
|  |     CMP $53CB | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $07A100 | ||
|  | OpenWorldBossUnlock: | ||
|  |     PHX | ||
|  |     PHY | ||
|  |     LDA $900E ; Are we on open world? | ||
|  |     BEQ .ReturnTrue ; Return true if we aren't, always unlock boss | ||
|  |     LDA $53CD | ||
|  |     CMP #$0006 | ||
|  |     BNE .ReturnFalse ; return if we aren't on stage 6 | ||
|  |     LDA $53CF | ||
|  |     INC | ||
|  |     CMP $53CB ; are we on the most unlocked level? | ||
|  |     BNE .ReturnFalse ; return if we aren't | ||
|  |     LDA #$0000 | ||
|  |     LDX $53CF | ||
|  |     .LoopLevel: | ||
|  |     CPX #$0000 | ||
|  |     BEQ .LoopStages | ||
|  |     ADC #$0006 | ||
|  |     DEX | ||
|  |     BRA .LoopLevel ; return to loop head | ||
|  |     .LoopStages: | ||
|  |     ASL | ||
|  |     TAX | ||
|  |     LDA #$0000 | ||
|  |     LDY #$0006 | ||
|  |     PHY | ||
|  |     PHX | ||
|  |     .LoopStage: | ||
|  |     PLX | ||
|  |     LDY $9020, X ; get stage id | ||
|  |     DEY | ||
|  |     INX | ||
|  |     INX | ||
|  |     PHA | ||
|  |     TYA | ||
|  |     ASL | ||
|  |     TAY | ||
|  |     PLA | ||
|  |     ADC $8200, Y ; add current stage value to total | ||
|  |     PLY | ||
|  |     DEY | ||
|  |     PHY | ||
|  |     PHX | ||
|  |     CPY #$0000 | ||
|  |     BNE .LoopStage ; return to loop head | ||
|  |     PLX | ||
|  |     PLY | ||
|  |     SEC | ||
|  |     SBC $9016 | ||
|  |     BCC .ReturnFalse | ||
|  |     .ReturnTrue | ||
|  |     LDA $53CD | ||
|  |     INC | ||
|  |     STA $53CD | ||
|  |     STA $5AC1 | ||
|  |     BRA .Return | ||
|  |     .ReturnFalse: | ||
|  |     STZ $5AC1 | ||
|  |     .Return: | ||
|  |     PLY | ||
|  |     PLX | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $07A180 | ||
|  | GooeySpawn: | ||
|  |     PHY  | ||
|  |     PHX  | ||
|  |     LDX #$0000 | ||
|  |     LDY #$0000 | ||
|  |     STA $5543 | ||
|  |     LDA $1922,Y | ||
|  |     STA $C0 | ||
|  |     LDA $19A2,Y | ||
|  |     STA $C2 | ||
|  |     LDA #$0008 | ||
|  |     STA $C4 | ||
|  |     LDA #$0002 | ||
|  |     STA $352A | ||
|  |     LDA #$0003 | ||
|  |     JSL $00F54F | ||
|  |     STX $5541 | ||
|  |     LDA #$FFFF | ||
|  |     STA $0622,X | ||
|  |     JSL $00BAEF | ||
|  |     JSL $C4883C | ||
|  |     LDX $39D1 | ||
|  |     CPX #$0001 | ||
|  |     BEQ .Return | ||
|  |     LDA #$FFFF | ||
|  |     CPX #$0002 | ||
|  |     BEQ .Call | ||
|  |     DEC  | ||
|  |     .Call: | ||
|  |     JSL $C43C22 | ||
|  |     .Return: | ||
|  |     PLX  | ||
|  |     PLY  | ||
|  |     RTL  | ||
|  | 
 | ||
|  | org $07A200 | ||
|  | SpeedTrap: | ||
|  |     PHX | ||
|  |     LDX $8082 ; do we have slowness | ||
|  |     BEQ .Apply ; branch if we do not | ||
|  |     LSR | ||
|  |     .Apply: | ||
|  |     PLX | ||
|  |     STA $1F22, Y ; player max speed | ||
|  |     EOR #$FFFF | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $07A280 | ||
|  | HeartStarVisual: | ||
|  |     CPX #$0000 | ||
|  |     BEQ .SkipInx | ||
|  |     INX | ||
|  |     .SkipInx | ||
|  |     CPX $651E | ||
|  |     BCC .Return | ||
|  |     CPX #$0000 | ||
|  |     BEQ .Return | ||
|  |     LDA $4036D0 | ||
|  |     AND #$00FF | ||
|  |     BEQ .ReturnTrue | ||
|  |     LDA $3000 | ||
|  |     AND #$0200 | ||
|  |     CMP #$0000 | ||
|  |     BNE .ReturnTrue | ||
|  |     PHY | ||
|  |     LDA $3000 | ||
|  |     TAY | ||
|  |     CLC | ||
|  |     ADC #$0020 | ||
|  |     STA $3000 | ||
|  |     LDA $408070 | ||
|  |     LDX #$0000 | ||
|  |     .LoopHead: | ||
|  |     CMP #$000A | ||
|  |     BCC .LoopEnd | ||
|  |     SEC | ||
|  |     SBC #$000A | ||
|  |     INX | ||
|  |     BRA .LoopHead | ||
|  |     .LoopEnd: | ||
|  |     PHX | ||
|  |     TAX | ||
|  |     PLA | ||
|  |     ORA #$2500 | ||
|  |     PHA | ||
|  |     LDA #$2C70 | ||
|  |     STA $0000, Y | ||
|  |     PLA | ||
|  |     INY | ||
|  |     INY | ||
|  |     STA $0000, Y | ||
|  |     INY | ||
|  |     INY | ||
|  |     TXA | ||
|  |     ORA #$2500 | ||
|  |     PHA | ||
|  |     LDA #$2C78 | ||
|  |     STA $0000, Y | ||
|  |     INY | ||
|  |     INY | ||
|  |     PLA | ||
|  |     STA $0000, Y | ||
|  |     INY | ||
|  |     INY | ||
|  |     JSL HeartStarVisual2 ; we ran out of room | ||
|  |     PLY | ||
|  |     .ReturnTrue: | ||
|  |     SEC | ||
|  |     .Return: | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $07A300 | ||
|  | LoadFont: | ||
|  |     JSL $00D29F ; play sfx | ||
|  |     PHX | ||
|  |     PHB | ||
|  |     LDA #$0000 | ||
|  |     PHA | ||
|  |     PLB | ||
|  |     PLB | ||
|  |     LDA #$7000 | ||
|  |     STA $2116 | ||
|  |     LDX #$0000 | ||
|  |     .LoopHead: | ||
|  |     CPX #$0140 | ||
|  |     BEQ .LoopEnd | ||
|  |     LDA $D92F50, X | ||
|  |     STA $2118 | ||
|  |     INX | ||
|  |     INX | ||
|  |     BRA .LoopHead | ||
|  |     .LoopEnd: | ||
|  |     LDX #$0000 | ||
|  |     .2LoopHead: | ||
|  |     CPX #$0020 | ||
|  |     BEQ .2LoopEnd | ||
|  |     LDA $D92E10, X | ||
|  |     STA $2118 | ||
|  |     INX | ||
|  |     INX | ||
|  |     BRA .2LoopHead | ||
|  |     .2LoopEnd: | ||
|  |     PHY | ||
|  |     LDA $07D012 | ||
|  |     ASL | ||
|  |     TAX | ||
|  |     LDA $07E000, X | ||
|  |     TAX | ||
|  |     LDY #$0000 | ||
|  |     .3LoopHead: | ||
|  |     CPY #$0020 | ||
|  |     BEQ .3LoopEnd | ||
|  |     LDA $D93170, X | ||
|  |     STA $2118 | ||
|  |     INX | ||
|  |     INX | ||
|  |     INY | ||
|  |     INY | ||
|  |     BRA .3LoopHead | ||
|  |     .3LoopEnd: | ||
|  |     LDA $07D00C | ||
|  |     ASL | ||
|  |     TAX | ||
|  |     LDA $07E010, X | ||
|  |     TAX | ||
|  |     LDY #$0000 | ||
|  |     .4LoopHead: | ||
|  |     CPY #$0020 | ||
|  |     BEQ .4LoopEnd | ||
|  |     LDA $D93170, X | ||
|  |     STA $2118 | ||
|  |     INX | ||
|  |     INX | ||
|  |     INY | ||
|  |     INY | ||
|  |     BRA .4LoopHead | ||
|  |     .4LoopEnd: | ||
|  |     PLY | ||
|  |     PLB | ||
|  |     PLX | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $07A380 | ||
|  | HeartStarVisual2: | ||
|  |     LDA #$2C80 | ||
|  |     STA $0000, Y | ||
|  |     INY | ||
|  |     INY | ||
|  |     LDA #$250A | ||
|  |     STA $0000, Y | ||
|  |     INY | ||
|  |     INY | ||
|  |     LDA $4053CF | ||
|  |     ASL | ||
|  |     TAX | ||
|  |     .LoopHead: | ||
|  |     LDA $409000, X | ||
|  |     CMP #$FFFF | ||
|  |     BNE .LoopEnd | ||
|  |     DEX | ||
|  |     DEX | ||
|  |     BRA .LoopHead | ||
|  |     .LoopEnd: | ||
|  |     LDX #$0000 | ||
|  |     .2LoopHead: | ||
|  |     CMP #$000A | ||
|  |     BCC .2LoopEnd | ||
|  |     SEC | ||
|  |     SBC #$000A | ||
|  |     INX | ||
|  |     BRA .2LoopHead ; return to loop head | ||
|  |     .2LoopEnd: | ||
|  |     PHX | ||
|  |     TAX | ||
|  |     PLA | ||
|  |     ORA #$2500 | ||
|  |     PHA | ||
|  |     LDA #$2C88 | ||
|  |     STA $0000, Y | ||
|  |     PLA | ||
|  |     INY | ||
|  |     INY | ||
|  |     STA $0000, Y | ||
|  |     INY | ||
|  |     INY | ||
|  |     TXA | ||
|  |     ORA #$2500 | ||
|  |     PHA | ||
|  |     LDA #$2C90 | ||
|  |     STA $0000, Y | ||
|  |     INY | ||
|  |     INY | ||
|  |     PLA | ||
|  |     STA $0000, Y | ||
|  |     INY | ||
|  |     INY | ||
|  |     LDA #$14D8 | ||
|  |     STA $0000, Y | ||
|  |     INY | ||
|  |     INY | ||
|  |     LDA #$250B | ||
|  |     STA $0000, Y | ||
|  |     INY | ||
|  |     INY | ||
|  |     LDA #$14E0 | ||
|  |     STA $0000, Y | ||
|  |     INY | ||
|  |     INY | ||
|  |     LDA #$250A | ||
|  |     STA $0000, Y | ||
|  |     INY | ||
|  |     INY | ||
|  |     LDA #$14E8 | ||
|  |     STA $0000, Y | ||
|  |     INY | ||
|  |     INY | ||
|  |     LDA #$250C | ||
|  |     STA $0000, Y | ||
|  |     INY | ||
|  |     INY | ||
|  |     LDA $3000 | ||
|  |     SEC | ||
|  |     SBC #$3040 | ||
|  |     LSR | ||
|  |     LSR | ||
|  |     .3LoopHead: | ||
|  |     CMP #$0004 | ||
|  |     BCC .3LoopEnd | ||
|  |     DEC #4 | ||
|  |     BRA .3LoopHead ; return to loop head | ||
|  |     .3LoopEnd: | ||
|  |     STA $3240 | ||
|  |     LDA #$0004 | ||
|  |     SEC | ||
|  |     SBC $3240 | ||
|  |     TAX | ||
|  |     LDA #$00FF | ||
|  |     .4LoopHead: | ||
|  |     CPX #$0000 | ||
|  |     BEQ .4LoopEnd | ||
|  |     LSR | ||
|  |     LSR | ||
|  |     DEX | ||
|  |     BRA .4LoopHead | ||
|  |     .4LoopEnd: | ||
|  |     LDY $3002 | ||
|  |     AND $0000, Y | ||
|  |     STA $0000, Y | ||
|  |     INY | ||
|  |     LDA #$0000 | ||
|  |     STA $0000, Y | ||
|  |     INY | ||
|  |     INY | ||
|  |     STA $0000, Y | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $07A480 | ||
|  | HeartStarSelectFix: | ||
|  |     PHX | ||
|  |     TXA | ||
|  |     ASL | ||
|  |     TAX | ||
|  |     LDA $9020, X | ||
|  |     DEC | ||
|  |     TAX | ||
|  |     .LoopHead: | ||
|  |     CMP #$0006 | ||
|  |     BMI .LoopEnd | ||
|  |     INX | ||
|  |     SEC | ||
|  |     SBC #$0006 | ||
|  |     BRA .LoopHead | ||
|  |     .LoopEnd: | ||
|  |     LDA $53A7, X | ||
|  |     PLX | ||
|  |     AND #$00FF | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $07A500 | ||
|  | HeartStarCutsceneFix: | ||
|  |     TAX | ||
|  |     LDA $53D3 | ||
|  |     DEC | ||
|  |     STA $5AC3 | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $07A510 | ||
|  | GiftGiving: | ||
|  |     CMP #$0008 | ||
|  |     .This: | ||
|  |     BCS .This  ; this intentionally safe-crashes the game if hit | ||
|  |     PHX | ||
|  |     LDX $901C | ||
|  |     BEQ .Return | ||
|  |     PLX | ||
|  |     STA $8086 | ||
|  |     LDA #$0026 | ||
|  |     JML $CABC99 | ||
|  |     .Return: | ||
|  |     PLX | ||
|  |     JML $CABC18 | ||
|  | 
 | ||
|  | org $07A550 | ||
|  | PauseMenu: | ||
|  |     JSL $00D29F | ||
|  |     PHX | ||
|  |     PHY | ||
|  |     LDA #$3300 | ||
|  |     STA !VMADDL | ||
|  |     LDA #$0007 | ||
|  |     STA !A1B0 | ||
|  |     LDA #$F000 | ||
|  |     STA !A1T0L | ||
|  |     LDA #$01C0 | ||
|  |     STA !DAS0L | ||
|  |     SEP #$20 | ||
|  |     LDA #$01 | ||
|  |     STA !DMAP0 | ||
|  |     LDA #$18 | ||
|  |     STA !BBAD0 | ||
|  |     LDA #$01 | ||
|  |     STA !MDMAEN | ||
|  |     REP #$20 | ||
|  |     LDY #$0000 | ||
|  |     .LoopHead: | ||
|  |     INY ; loop head | ||
|  |     CPY #$0009 | ||
|  |     BPL .LoopEnd | ||
|  |     TYA | ||
|  |     ASL | ||
|  |     TAX | ||
|  |     LDA $8020, X | ||
|  |     BEQ .LoopHead ; return to loop head | ||
|  |     TYA | ||
|  |     CLC | ||
|  |     ADC #$31E2 | ||
|  |     STA !VMADDL | ||
|  |     LDA $07E020, X | ||
|  |     STA !VMDATAL | ||
|  |     BRA .LoopHead ; return to loop head | ||
|  |     .LoopEnd: | ||
|  |     LDY #$FFFF | ||
|  |     .2LoopHead: | ||
|  |     INY ; loop head | ||
|  |     CPY #$0007 | ||
|  |     BPL .2LoopEnd | ||
|  |     TYA | ||
|  |     ASL | ||
|  |     TAX | ||
|  |     LDA $8000, X | ||
|  |     BEQ .2LoopHead ; return to loop head | ||
|  |     TYA | ||
|  |     CLC | ||
|  |     ADC #$3203 | ||
|  |     STA !VMADDL | ||
|  |     LDA $07E040, X | ||
|  |     STA !VMDATAL | ||
|  |     BRA .2LoopHead ; return to loop head | ||
|  |     .2LoopEnd: | ||
|  |     PLY | ||
|  |     PLX | ||
|  |     RTL | ||
|  | 
 | ||
|  | org $07A600 | ||
|  | StarsSet: | ||
|  |     PHA | ||
|  |     PHX | ||
|  |     PHY | ||
|  |     LDX $901A | ||
|  |     BEQ .ApplyStar | ||
|  |     AND #$00FF | ||
|  |     PHA | ||
|  |     LDX $53CF | ||
|  |     LDY $53D3 | ||
|  |     LDA #$0000 | ||
|  |     DEY | ||
|  |     .LoopLevel: | ||
|  |     CPX #$0000 | ||
|  |     BEQ .LoopStage | ||
|  |     CLC | ||
|  |     ADC #$0007 | ||
|  |     DEX | ||
|  |     BRA .LoopLevel | ||
|  |     .LoopStage: | ||
|  |     CPY #$0000 | ||
|  |     BEQ .LoopEnd | ||
|  |     INC | ||
|  |     DEY | ||
|  |     BRA .LoopStage | ||
|  |     .LoopEnd: | ||
|  |     ASL | ||
|  |     TAX | ||
|  |     LDA $07D020, X | ||
|  |     DEC | ||
|  |     ASL | ||
|  |     ASL | ||
|  |     ASL | ||
|  |     ASL | ||
|  |     ASL | ||
|  |     ASL | ||
|  |     TAX | ||
|  |     PLA | ||
|  |     .2LoopHead: | ||
|  |     CMP #$0000 | ||
|  |     BEQ .2LoopEnd | ||
|  |     INX | ||
|  |     DEC | ||
|  |     BRA .2LoopHead | ||
|  |     .2LoopEnd: | ||
|  |     LDA $B000, X | ||
|  |     ORA #$0001 | ||
|  |     STA $B000, X | ||
|  |     .Return: | ||
|  |     PLY | ||
|  |     PLX | ||
|  |     PLA | ||
|  |     XBA | ||
|  |     AND #$00FF | ||
|  |     RTL | ||
|  |     .ApplyStar: | ||
|  |     LDA $39D7 | ||
|  |     INC | ||
|  |     ORA #$8000 | ||
|  |     STA $39D7 | ||
|  |     BRA .Return | ||
|  | 
 | ||
|  | 
 | ||
|  | org $07C000 | ||
|  |     db "KDL3_BASEPATCH_ARCHI" | ||
|  | 
 | ||
|  | org $07E000 | ||
|  |     db $20, $03 | ||
|  |     db $20, $00 | ||
|  |     db $80, $01 | ||
|  |     db $20, $01 | ||
|  |     db $00, $00 | ||
|  |     db $00, $00 | ||
|  |     db $00, $00 | ||
|  |     db $00, $00 | ||
|  |     db $A0, $01 | ||
|  |     db $A0, $00 | ||
|  | 
 | ||
|  | ; Pause Icons | ||
|  | 
 | ||
|  | org $07E020 | ||
|  |     db $00, $0C | ||
|  |     db $30, $09 | ||
|  |     db $31, $09 | ||
|  |     db $32, $09 | ||
|  |     db $33, $09 | ||
|  |     db $34, $09 | ||
|  |     db $35, $09 | ||
|  |     db $36, $09 | ||
|  |     db $37, $09 | ||
|  | 
 | ||
|  | org $07E040 | ||
|  |     db $38, $05 | ||
|  |     db $39, $05 | ||
|  |     db $3A, $01 | ||
|  |     db $3B, $05 | ||
|  |     db $3C, $05 | ||
|  |     db $3D, $05 |