diff --git a/Events/intro.asm b/Events/intro.asm index ded6f79..8fbf5b2 100644 --- a/Events/intro.asm +++ b/Events/intro.asm @@ -104,3 +104,4 @@ namespace Intro ; 03 - Mirror Shield } } ; namespace Intro +namespace off \ No newline at end of file diff --git a/Masks/deku_mask.asm b/Masks/deku_mask.asm index 9dc2ed4..7863dc9 100644 --- a/Masks/deku_mask.asm +++ b/Masks/deku_mask.asm @@ -11,23 +11,60 @@ org $07983A org $079873 Player_ResetSwimCollision: -org $07E8F0 - HandleIndoorCameraAndDoors: - org $0ED6C0 LoadActualGearPalettes: -org $07B64F - Link_HandleDiagonalCollision: org $07E245 Link_HandleVelocity: -org $07B7C7 - Link_HandleCardinalCollision: + +org $07915E + LinkState_ExitingDash: + org $07E6A6 Link_HandleMovingAnimation_FullLongEntry: ; ============================================================================= +org $07B64F + Link_HandleDiagonalCollision: + +; start of free space in bank07 +org $07F89D +Link_HandleDiagonalCollision_Long: +{ + PHB : PHK : PLB + JSR Link_HandleDiagonalCollision + PLB + RTL +} + +org $07B7C7 + Link_HandleCardinalCollision: + +org $07F8A2 +Link_HandleCardinalCollision_Long: +{ + PHB : PHK : PLB + JSR Link_HandleCardinalCollision + PLB + RTL +} + +org $07E8F0 + HandleIndoorCameraAndDoors: + +org $07F8AA +HandleIndoorCameraAndDoors_Long: +{ + PHB : PHK : PLB + JSR HandleIndoorCameraAndDoors + PLB + RTL +} +print pc + +; ============================================================================= + org $07A64B ; formerly Quake LinkItem_DekuMask: { @@ -53,16 +90,20 @@ LinkItem_DekuMask: LDA #$10 : STA $BC : STZ $02B2 ; take the mask off .return - RTS } +; LinkItem_UsingQuake is 152 (base10) bytes long org $07A6D6 -JML LinkItem_UsingDekuMask + JSL LinkItem_UsingDekuMask + NOP #152 +; 07A6DB + print pc +; end of UsingQuake is at 07A773 -org $228000 -incsrc "link_handler.asm" +org $288000 +; incsrc "link_handler.asm" LinkItem_UsingDekuMask: { ; SEP #$20 @@ -132,7 +173,7 @@ LinkItem_UsingDekuMask: .not_moving JSL Player_ResetSwimCollision - JSL $9B0E ; $39B0E IN ROM + JSL $079B0E ; $39B0E IN ROM LDA $49 : AND.b #$0F : BNE .movement @@ -171,14 +212,14 @@ LinkItem_UsingDekuMask: .finish_up - JSL Link_HandleDiagonalCollision ; $3B64F IN ROM + JSL Link_HandleDiagonalCollision_Long JSL Link_HandleVelocity ; $3E245 IN ROM - JSL Link_HandleCardinalCollision ; $3B7C7 IN ROM + JSL Link_HandleCardinalCollision_Long JSL Link_HandleMovingAnimation_FullLongEntry ; $3E6A6 IN ROM STZ $0302 - JSL HandleIndoorCameraAndDoors ; $3E8F0 IN ROM + JSL HandleIndoorCameraAndDoors_Long ; $3E8F0 IN ROM .exit: diff --git a/Masks/link_handler.asm b/Masks/link_handler.asm index f0faf03..b5cae85 100644 --- a/Masks/link_handler.asm +++ b/Masks/link_handler.asm @@ -1,3 +1,17 @@ +; ============================================================================= +; Link Handler Expanded Bank Module +; Handles the routines necessary for creating "Mask Forms" +; ============================================================================= + +; Makes use of Bank07 Expanded Space +; $3F89D-$3FFFF NULL +; { +; fillbyte $FF + +; fill $763 +; } + + org $07983A Player_ResetSwimState: @@ -5,24 +19,1799 @@ org $07983A org $079873 Player_ResetSwimCollision: -org $07E8F0 - HandleIndoorCameraAndDoors: - org $0ED6C0 LoadActualGearPalettes: -org $07B64F - Link_HandleDiagonalCollision: - org $07E245 Link_HandleVelocity: -org $07B7C7 - Link_HandleCardinalCollision: +org $07915E + LinkState_ExitingDash: org $07E6A6 Link_HandleMovingAnimation_FullLongEntry: + +; ============================================================================== + +; *$3D798-$3D7D7 LOCAL +TileDetect_ResetState: +{ + STZ $0C + STZ $0E + STZ $38 + STZ $58 + + STZ $02C0 + + STZ $5F + STZ $62 + + STZ $0320 + STZ $0341 + STZ $0343 + STZ $0348 + STZ $034C + STZ $0357 + STZ $0359 + STZ $035B + STZ $0366 + STZ $036D + STZ $036F + STZ $03E5 + STZ $03E7 + STZ $02EE + STZ $02F6 + STZ $03F1 + + RTS +} + +; ============================================================================== + +; *$3D077-$3D2C5 LOCAL +UnnamedRoutine3: +{ + ; Takes Y as an input ranging from 0x00 to 0x08 + ; The different behaviors with each has not been figured out yet + + STZ $59 + + REP #$20 + + JSR TileDetect_ResetState + + STY $00 : CPY.b #$08 : BNE .alpha + + ; Checking to see if a spin attack is still executing. + LDA $031C : AND.w #$00FF : DEC #2 : BMI .stillSpinAttacking + + CMP.w #$0008 : BCS .stillSpinAttacking + + PHY + + TAY + + LDA $D06F, Y : AND.w #$00FF : CLC : ADC.w #$0040 : TAY + + BRA .delta + +.alpha + + PHY + + ; Use the direction link is facing and the action in question to form an index + LDA $00 : AND.w #$00FF : ASL #3 : CLC : ADC $2F : TAY + +.delta + + ; Find some coordinates relative to Link, but depending on + LDA $22 : CLC : ADC $D01C, Y : AND $EC : LSR #3 : STA $02 + + LDA $20 : CLC : ADC $CFCC, Y : AND $EC : STA $00 + + LDA.w #$0001 : STA $0A + + PLY + + REP #$10 + + ; 0 - nothing, just standing there, 1 - sword, others - ???? + TYA + + CMP.w #$0001 : BEQ .BRANCH_EPSILON + CMP.w #$0002 : BEQ .BRANCH_EPSILON + CMP.w #$0003 : BEQ .BRANCH_EPSILON + CMP.w #$0006 : BEQ .BRANCH_EPSILON + CMP.w #$0007 : BEQ .BRANCH_EPSILON + CMP.w #$0008 : BEQ .BRANCH_EPSILON + + ; action types 0x00, 0x05, and 0x04 end up here + PHY + + JSR TileDetect_Execute + + PLY + + BRA .BRANCH_MU + +.BRANCH_EPSILON: + + SEP #$30 + + JSR $DC4A ; $3DC4A IN ROM + +.stillSpinAttacking + + SEP #$30 + +.BRANCH_XI: + + BRL .return + +.BRANCH_MU: + + SEP #$30 + + CPY.b #$05 : BEQ .BRANCH_XI + + LDA $0357 : AND.b #$10 : BEQ .BRANCH_OMICRON + + LDA $20 : CLC : ADC.b #$08 : AND.b #$0F + + CMP.b #$04 : BCC .BRANCH_PI + CMP.b #$0B : BCC .BRANCH_RHO + +.BRANCH_PI: + + LDA $22 : AND.b #$0F + + CMP.b #$04 : BCC .BRANCH_SIGMA + CMP.b #$0C : BCC .BRANCH_RHO + +.BRANCH_SIGMA: + + LDA $031F : BNE .BRANCH_RHO + + LDA $4D : BNE .BRANCH_RHO + + LDA $1B : BEQ .BRANCH_CHI + + JSL Dungeon_SaveRoomQuadrantData + + LDA.b #$33 : JSR Player_DoSfx2 + + STZ $5E + + LDA.b #$15 : STA $11 + + LDA $A0 : STA $A2 + + LDA $7EC000 : STA $A0 + + JSR $94F1 ; $394F1 IN ROM + + BRA .BRANCH_RHO + +.BRANCH_CHI: + + LDA $02DB : BNE .BRANCH_RHO + + JSR $A95C ; $3A95C IN ROM + +.BRANCH_RHO: + + BRL .BRANCH_GAMMA + +.BRANCH_OMICRON: + + STZ $02DB + + LDA $0357 : AND.b #$01 : BEQ .BRANCH_ZETA + + LDA.b #$02 : STA $0351 + + JSR $D2C6 ; $3D2C6 IN ROM + + BCS .BRANCH_THETA + + LDA $4D : BNE .BRANCH_THETA + + LDA.b #$1A : JSR Player_DoSfx2 + +.BRANCH_THETA: + + BRL .BRANCH_KAPPA + +.BRANCH_ZETA: + + LDA $0359 : AND.b #$01 : BEQ .BRANCH_LAMBDA + + LDA.b #$01 : STA $0351 + + LDA $1B : BNE .BRANCH_IOTA + + LDA $0345 : BEQ .BRANCH_IOTA + + LDA $02E0 : BNE .BRANCH_IOTA + + LDA $7EF356 : BEQ .BRANCH_THETA + + STZ $0345 + + LDA $0340 : STA $26 + + LDA.b #$00 : STA $5D + + BRL .BRANCH_KAPPA + +.BRANCH_IOTA: + + ; $3D2C6 IN ROM + JSR $D2C6 : BCS .BRANCH_TAU + + LDA $8A : CMP.b #$70 : BNE .notEvilSwamp + +.BRANCH_LAMBDA: + + LDA.b #$1B : JSR Player_DoSfx2 + + BRA .BRANCH_TAU + +.notEvilSwamp + + LDA $4D : BNE .BRANCH_TAU + + LDA.b #$1C : JSR Player_DoSfx2 + +.BRANCH_TAU: + + BRL .BRANCH_KAPPA + + LDA $1B : BNE .BRANCH_ALEPH + + LDA $0345 : BNE .BRANCH_ALEPH + + LDA $0341 : AND.b #$01 : BEQ .BRANCH_ALEPH + + LDA.b #$01 : STA $0351 + + ; $3D2C6 IN ROM + JSR $D2C6 : BCS .BRANCH_BET + + ; Dat be sum swamp o' evil + LDA $8A : CMP.b #$70 : BNE .BRANCH_DALET + + LDA.b #$1B : JSR Player_DoSfx2 + + BRA .BRANCH_BET + +.BRANCH_DALET: + + LDA $4D : BNE .BRANCH_BET + + LDA.b #$1C : JSR Player_DoSfx2 + +.BRANCH_BET: + + BRL .return + +.BRANCH_ALEPH: + + STZ $0351 + + LDA $02EE : AND.b #$01 + + BEQ .chet + + ; Only current documentation on this relates to the Desert Palace opening + LDA.b #$01 : STA $02ED + + ; Our work is done here I guess? + BRL .return + +.chet + + STZ $02ED + + LDA $02EE : AND.b #$10 : BEQ .noSpikeFloorDamage + + STZ $0373 + + LDA $55 : BNE .noSpikeFloorDamage + + ; $3AFB5 IN ROM + JSR $AFB5 : BCS .noSpikeFloorDamage + + ; Did Link just get damaged and is still flashing? + LDA $031F : BNE .noSpikeFloorDamage + + STZ $03F7 + STZ $03F5 + STZ $03F6 + + ; moon pearl + LDA $7EF357 : BEQ .doesntHaveMoonPearl + + STZ $56 + STZ $02E0 + +.doesntHaveMoonPearl + + ; armor level + LDA $7EF35B : TAY + + ; Determine how much damage the spike floor will do to Link. + LDA $D06C, Y : STA $0373 + + BRL LinkState_ExitingDash + +.noSpikeFloorDamage + + LDA $0348 : AND.b #$11 : BEQ .notWalkingOnIce + + LDA $034A : BEQ .BRANCH_AYIN + + LDA $6A : BEQ .BRANCH_PEY + + LDA $0340 : STA $26 + + BRL .BRANCH_PEY + +.BRANCH_AYIN: + + LDA $67 : AND.b #$0C : BEQ .BRANCH_TSADIE + + LDA.b #$01 : STA $033D + LDA.b #$80 : STA $033C + +.BRANCH_TSADIE: + + LDA $67 : AND.b #$03 : BEQ .BRANCH_QOF + + LDA.b #$01 : STA $033D + LDA.b #$80 : STA $033C + +.BRANCH_QOF: + + LDY.b #$01 + + LDA $0348 : AND.b #$01 : BNE .BRANCH_RESH + + LDY.b #$02 + +.BRANCH_RESH: + + STY $034A + + LDA $26 : STA $0340 + + JSL Player_ResetSwimState + + BRL .BRANCH_PEY + +.notWalkingOnIce + + LDA $5D : CMP.b #$04 : BEQ .BRANCH_SIN + + LDA $034A : BEQ .BRANCH_TAV + + LDA $0340 : STA $26 + +.BRANCH_TAV: + + JSL Player_ResetSwimState + +.BRANCH_SIN: + + STZ $034A + +.BRANCH_PEY: + + LDA $02E8 : AND.b #$10 : BEQ .BRANCH_KAPPA + + LDA $031F : BNE .BRANCH_KAPPA + + LDA.b #$3A : STA $031F + +.BRANCH_KAPPA: +.return + + RTS +} + +; *$39D84-$39E62 LOCAL +Link_ResetSwordAndItemUsage: +{ + + .BRANCH_EPSILON: + + ; Bring Link to stop + STZ $5E + + LDA $48 : AND.b #$F6 : STA $48 + + ; Stop any animations Link is doing + STZ $3D + STZ $3C + + ; Nullify button input on the B button + LDA $3A : AND.b #$7E : STA $3A + + ; Make it so Link can change direction if need be + LDA $50 : AND.b #$FE : STA $50 + + BRL .BRANCH_ALPHA + +; *$39D9F ALTERNATE ENTRY POINT + + BIT $48 : BNE .BRANCH_BETA + + LDA $48 : AND.b #$09 : BNE .BRANCH_GAMMA + + .BRANCH_BETA: + + LDA $47 : BEQ .BRANCH_DELTA + CMP.b #$01 : BEQ .BRANCH_EPSILON + + .BRANCH_GAMMA: + + LDA $3C : CMP.b #$09 : BNE .BRANCH_ZETA + + LDX.b #$0A : STX $3C + + LDA $9CBF, X : STA $3D + + .BRANCH_ZETA: + + DEC $3D : BPL .BRANCH_THETA + + LDA $3C : INC A : CMP.b #$0D : BNE .BRANCH_KAPPA + + LDA $7EF359 : INC A : AND.b #$FE : BEQ .BRANCH_LAMBDA + + LDA $48 : AND.b #$09 : BEQ .BRANCH_LAMBDA + + LDY.b #$01 + LDA.b #$1B + + JSL AddWallTapSpark ; $49395 IN ROM + + LDA $48 : AND.b #$08 : BNE .BRANCH_MUNU + + LDA $05 : JSR Player_DoSfx2 + + BRA .BRANCH_XI + + .BRANCH_MUNU: + + LDA.b #$06 : JSR Player_DoSfx2 + + .BRANCH_XI: + + ; Do sword interaction with tiles + LDY.b #$01 + + JSR UnnamedRoutine3 ; $3D077 IN ROM + +.BRANCH_LAMBDA: + + LDA.b #$0A + +.BRANCH_KAPPA: + + STA $3C : TAX + + LDA $9CBF, X : STA $3D + +.BRANCH_THETA: + + BRA .BRANCH_RHO + +.BRANCH_DELTA: + + LDA.b #$09 : STA $3C + + LDA.b #$01 : TSB $50 + + STZ $3D + + LDA $5E + + CMP.b #$04 : BEQ .BRANCH_RHO + CMP.b #$10 : BEQ .BRANCH_RHO + + LDA.b #$0C : STA $5E + + LDA $7EF359 : INC A : AND.b #$FE : BEQ .BRANCH_ALPHA + + LDX.b #$04 + +.BRANCH_PHI: + + LDA $0C4A, X + + CMP.b #$30 : BEQ .BRANCH_ALPHA + CMP.b #$31 : BEQ .BRANCH_ALPHA + + DEX : BPL .BRANCH_PHI + + LDA $79 : CMP.b #$06 : BCC .BRANCH_CHI + + LDA $1A : AND.b #$03 : BNE .BRANCH_CHI + + JSL AncillaSpawn_SwordChargeSparkle + +.BRANCH_CHI: + + LDA $79 : CMP.b #$40 : BCS .BRANCH_ALPHA + + INC $79 : LDA $79 : CMP.b #$30 : BNE .BRANCH_ALPHA + + LDA.b #$37 : JSR Player_DoSfx2 + + JSL AddChargedSpinAttackSparkle + + BRA .BRANCH_ALPHA + +.BRANCH_RHO: + + JSR $9E63 ; $39E63 IN ROM + + .BRANCH_ALPHA: + + RTS +} + +; ============================================================================= + +; *$3C8E9-$3CB83 LONG BRANCH LOCATION +CancelStairDragWithHorizontals: +{ + LDA $6A : BNE .BRANCH_ALPHA + + STZ $57 + + LDA $5E : CMP.b #$02 : BNE .BRANCH_ALPHA + + STZ $5E + +.BRANCH_ALPHA: + + LDA $59 : AND.b #$05 : BEQ .BRANCH_BETA + + LDA $0E : AND.b #$02 : BNE .BRANCH_BETA + + LDA $5D + + CMP.b #$05 : BEQ .BRANCH_GAMMA + CMP.b #$02 : BEQ .BRANCH_GAMMA + + LDA.b #$09 : STA $5C + + STZ $5A + + LDA.b #$01 : STA $5B + + LDA.b #$01 : STA $5D + +.BRANCH_GAMMA: + + RTS + +.BRANCH_BETA: + + LDA $0366 : AND.b #$02 : BEQ .BRANCH_DELTA + + LDA $036A : ASL A : STA $0369 + + BRA .BRANCH_EPSILON + +.BRANCH_DELTA: + + STZ $0369 + +.BRANCH_EPSILON: + + LDA $0341 : AND.b #$04 : BEQ .BRANCH_ZETA + + BRA .BRANCH_THETA + + LDA $0341 : AND.b #$07 : CMP.b #$07 : BNE .BRANCH_ZETA + +.BRANCH_THETA: + + LDA $0345 : BNE .BRANCH_ZETA + + LDA $4D : BNE .BRANCH_ZETA + + JSR LinkState_ExitingDash + JSR $9D84 ; $39D84 IN ROM + + LDA.b #$01 : STA $0345 + + LDA $26 : STA $0340 + + JSL Player_ResetSwimState + + STZ $0376 + STZ $5E + + LDA $0351 : CMP.b #$01 : BNE .BRANCH_IOTA + + JSR $AE54 ; $3AE54 IN ROM + + LDA $7EF356 : BEQ .BRANCH_IOTA + + LDA $02E0 : BNE .BRANCH_ZETA + + LDA.b #$04 : STA $5D + + BRA .BRANCH_ZETA + +.BRANCH_IOTA: + + LDA $3E : STA $20 + LDA $40 : STA $21 + + LDA $3F : STA $22 + LDA $41 : STA $23 + + LDA.b #$01 : STA $037B + + JSR $CC3C ; $3CC3C IN ROM + + LDA.b #$20 : JSR Player_DoSfx2 + +.BRANCH_ZETA: + + LDA $0345 : BEQ .BRANCH_KAPPA + + LDA $036E : AND.b #$07 : CMP.b #$07 : BEQ .BRANCH_LAMBDA + + BRA .BRANCH_MU + + .BRANCH_KAPPA: + + LDA $036D : AND.b #$42 : BEQ .BRANCH_MU + +.BRANCH_LAMBDA: + + LDA.b #$07 : STA $0E + + BRL .BRANCH_$3C7FC + +.BRANCH_MU: + + LDA $0343 : AND.b #$07 : CMP.b #$07 : BNE .BRANCH_NU + + LDA $0345 : BEQ .BRANCH_NU + + JSR LinkState_ExitingDash + + LDA $4D : BNE .BRANCH_NU + + LDA $0340 : STA $26 + + STZ $0345 + + LDA.b #$15 + LDY.b #$00 + + JSL AddTransitionSplash ; $498FC IN ROM + + LDA.b #$01 : STA $037B + + BRL .BRANCH_$3CC3C + +.BRANCH_NU: + + LDA $036E : AND.b #$07 : BEQ .BRANCH_XI + + ; $3C16D IN ROM + JSR $C16D : BCC .BRANCH_XI + + LDA.b #$20 : JSR Player_DoSfx2 + + LDX.b #$10 + + LDA $66 : AND.b #$01 : BNE .BRANCH_OMICRON + + TXA : EOR.b #$FF : INC A : TAX + +.BRANCH_OMICRON: + + STX $28 + + JSR LinkState_ExitingDash + + LDA.b #$02 : STA $4D + + LDA.b #$14 : STA $0362 : STA $0363 + + LDA.b #$FF : STA $0364 + + LDA.b #$0C : STA $5D + + LDA.b #$01 : STA $037B : STA $78 + + STZ $48 + STZ $5E + + LDA $1B + + BNE .BRANCH_PI + + LDA.b #$02 : STA $EE + +.BRANCH_PI: + + LDA $66 : AND.b #$FD : ASL A : TAY + + LDA $22 : PHA + LDA $23 : PHA + + JSR $8D2B ; $38D2B IN ROM + + LDA.b #$01 : STA $66 + + CPX.b #$FF + + BEQ .BRANCH_RHO + + JSR $8B9B ; $38B9B IN ROM + + BRL .BRANCH_SIGMA + +.BRANCH_RHO: + + JSR $8AD1; $38AD1 IN ROM + +.BRANCH_SIGMA: + + PLA : STA $23 + PLA : STA $22 + + RTS + +.BRANCH_XI: + + LDA $0370 : AND.b #$77 + + BEQ .BRANCH_TAU + + JSR $C16D ; $3C16D IN ROM + + BCC .BRANCH_TAU + + LDA.b #$20 : JSR Player_DoSfx2 + + LDX.b #$0F + + AND.b #$07 + + BNE .BRANCH_UPSILON + + LDX.b #$10 + +.BRANCH_UPSILON: + + STX $5D + + LDX.b #$10 + + LDA $66 : AND.b #$01 + + BNE .BRANCH_PHI + + LDX.b #$F0 + +.BRANCH_PHI: + + STX $28 + + JSR LinkState_ExitingDash + + LDA.b #$02 : STA $4D + + LDA.b #$14 : STA $0362 : STA $0363 + + LDA.b #$FF : STA $0364 + + STZ $46 + + LDA.b #$01 : STA $037B : STA $78 + + STZ $48 + STZ $5E + + RTS + +.BRANCH_TAU: + + LDA $036E : AND.b #$70 : BEQ .BRANCH_CHI + + LDA $036E : AND.b #$07 : BNE .BRANCH_CHI + + LDA $0370 : AND.b #$77 : BNE .BRANCH_CHI + + LDA $5D : CMP.b #$0D : BEQ .BRANCH_CHI + + ; $3C16D IN ROM + JSR $C16D : BCC .BRANCH_CHI + + LDA.b #$20 : JSR Player_DoSfx2 + + JSR LinkState_ExitingDash + + LDA.b #$01 : STA $037B + + STZ $48 + STZ $5E + + BRL .BRANCH_$3C46D + +.BRANCH_CHI: + + LDA $036F : AND.b #$07 : BEQ .BRANCH_PSI + + LDA $036E : AND.b #$07 : BNE .BRANCH_PSI + + LDA $0370 : AND.b #$77 : BNE .BRANCH_PSI + + ; $3C16D IN ROM + JSR $C16D : BCC .BRANCH_PSI + + LDX.b #$10 + + LDA $66 : AND.b #$01 : BNE .BRANCH_OMEGA + + TXA : EOR.b #$FF : INC A : TAX + +.BRANCH_OMEGA: + + STX $28 + + JSR LinkState_ExitingDash + + LDA.b #$02 : STA $4D + + LDA.b #$14 : STA $0362 : STA $0363 + + LDA.b #$FF : STA $0364 + + LDA.b #$0E : STA $5D + + STZ $46 + + LDA.b #$01 : STA $037B : STA $78 + + STZ $48 + STZ $5E + + RTS + +.BRANCH_PSI: + + LDA $0E : AND.b #$02 : BNE .BRANCH_ALIF + + LDA $0C : AND.b #$05 : BEQ .BRANCH_ALIF + + LDA $0372 : BEQ .BRANCH_BET + + LDA $2F : AND.b #$04 : BEQ .BRANCH_ALIF + +.BRANCH_BET: + + JSR $E112 ; $3E112 IN ROM + + LDA $6B : AND.b #$0F : BEQ .BRANCH_ALIF + + RTS + +.BRANCH_ALIF: + + STZ $6B + + ; check for spike block interactions + LDA $02E8 : AND.b #$07 : BEQ .noSpikeBlockInteraction + + ; link is flashing or otherwise invincible + LDA $46 : ORA $031F : ORA $55 : BNE .ignoreSpikeBlocks + + LDA $22 + + LDY $66 : CPY.b #$02 : BNE .didntMoveLeft + + ; this is a tad strange, seems like more of a tweak than anything else + AND.b #$04 : BEQ .notOn4PixelGrid + + BRA .noSpikeBlockInteraction + +.didntMoveLeft + + AND.b #$04 : BEQ .noSpikeBlockInteraction + +.notOn4PixelGrid + + ; use armor value to determine damage to be doled out + LDA $7EF35B : TAY + + LDA $BA07, Y : STA $0373 + + JSR LinkState_ExitingDash + + BRL .BRANCH_$39222 + +.ignoreSpikeBlocks + + LDA $02E8 : AND.b #$07 : STA $0E + +.noSpikeBlockInteraction + + BRL .BRANCH_$3C7FC +} + +; ============================================================================= + +; *$3CDCB-$3CE29 LOCAL +TileDetect_Movement_Vertical: +{ + ; This probably the up/down movement handler analagous to $3CE2A below + REP #$20 + + JSR TileDetect_ResetState + + STZ $59 + + LDA $20 : CLC : ADC $CB7B, Y : STA $51 : AND $EC : STA $00 + LDA $22 : CLC : ADC $CD89, Y : AND $EC : LSR #3 : STA $02 + LDA $22 : CLC : ADC $CD8B, Y : AND $EC : LSR #3 : STA $04 + LDA $22 : CLC : ADC $CD93, Y : AND $EC : LSR #3 : STA $74 + + REP #$10 + + LDA.w #$0001 : STA $0A + + JSR TileDetect_Execute + + LDA $04 : STA $02 + + LDA.w #$0002 : STA $0A + + JSR TileDetect_Execute + + LDA $74 : STA $02 + + LDA.w #$0004 : STA $0A + + JSR TileDetect_Execute + + SEP #$30 + + RTS +} + +; *$3CE2A-$3CE84 LOCAL +TileDetect_Movement_Horizontal: +{ + ; Note, this routine only execute when Link is moving horizontally + ; (Yes, it will execute if he's moving in a diagonal direction since that includes horizontal) + + REP #$20 + + JSR TileDetect_ResetState + + STZ $59 + + LDA $22 : CLC : ADC $CD7B, Y : AND $EC : LSR #3 : STA $02 + + LDA $20 : CLC : ADC $CD83, Y : AND $EC : STA $00 + + LDA $20 : CLC : ADC $CD8B, Y : STA $51 : AND $EC : STA $04 + + LDA $20 : CLC : ADC $CD93, Y : STA $53 : AND $EC : STA $08 + + REP #$10 + + LDA.w #$0001 : STA $0A + + JSR TileDetect_Execute + + LDA $04 : STA $00 + + LDA.w #$0002 : STA $0A + + JSR TileDetect_Execute + + LDA $08 : STA $00 + + LDA.w #$0004 : STA $0A + + JSR TileDetect_Execute + + SEP #$30 + + RTS +} + +; *$3C4D4-$3C8E8 LOCAL +{ + LDA $31 : BNE .BRANCH_ALPHA + + RTS + +.BRANCH_ALPHA: + + LDA $6C : CMP.b #$02 : BNE .BRANCH_BETA + + LDY.b #$04 + + LDA $22 : CMP.b #$80 : BCC .BRANCH_GAMMA + + BRA .BRANCH_DELTA + +.BRANCH_BETA: + + LDY.b #$04 + + LDA $31 : BMI .BRANCH_GAMMA + +.BRANCH_DELTA: + + LDY.b #$06 + +.BRANCH_GAMMA: + + TYA : LSR A : STA $66 + + JSR $CE2A ; $3CE2A IN ROM; Has to do with detecting areas around chests. + + LDA $1B : BNE .BRANCH_EPSILON + + BRL CancelStairDragWithHorizontals + +.BRANCH_EPSILON: + + LDA $0308 : BMI .BRANCH_ZETA + + LDA $46 : BEQ .BRANCH_THETA + +.BRANCH_ZETA: + + LDA $0E : LSR #4 : TSB $0E + + BRL .BRANCH_RHO + +.BRANCH_THETA: + + LDA $6A : BNE .BRANCH_IOTA + + STZ $57 + +.BRANCH_IOTA: + + LDA $6C : CMP.b #$01 : BNE .BRANCH_KAPPA + + LDA $6A : BNE .BRANCH_KAPPA + + LDA $046C : CMP.b #$03 : BNE .BRANCH_LAMBDA + + LDA $EE : BEQ .BRANCH_LAMBDA + + BRL .BRANCH_TAU + +.BRANCH_LAMBDA: + + JSR $CB84 ; $3CB84 IN ROM + JSR $CBDD ; $3CBDD IN ROM + + BRL .BRANCH_$3D667 + +.BRANCH_KAPPA: + + LDA $0E : AND.b #$70 : BEQ .BRANCH_RHO + + STZ $05 + + LDA $0F : AND.b #$07 : BEQ .BRANCH_NU + + LDY.b #$02 + + LDA $31 : BCC .BRANCH_XI + + LDY.b #$03 + +.BRANCH_XI: + + LDA $B7C3, Y : STA $49 + +.BRANCH_NU: + + LDA.b #$02 : STA $6C + + STZ $03F3 + + LDA $0E : AND.b #$70 : CMP.b #$70 : BEQ .BRANCH_OMICRON + + LDA $0E : AND.b #$07 : BNE .BRANCH_PI + + LDA $0E : AND.b #$70 : BNE .BRANCH_OMICRON + + BRA .BRANCH_RHO + +.BRANCH_PI: + + STZ $6B + STZ $6C + + JSR $CB84 ; $3CB84 IN ROM + JML $07CB9F ; $3CB9F IN ROM + +.BRANCH_OMICRON: + + LDA $0315 : AND.b #$02 : BNE .BRANCH_SIGMA + + LDA $50 : AND.b #$FD : STA $50 + +.BRANCH_SIGMA: + + RTS + +.BRANCH_RHO: + + LDA $0315 : AND.b #$02 : BNE .BRANCH_TAU + + LDA $50 : AND.b #$FD : STA $50 + + STZ $6C + STZ $EF + STZ $49 + +.BRANCH_TAU: + + LDA $0E : AND.b #$02 : BNE .BRANCH_UPSILON + + LDA $0C : AND.b #$05 : BEQ .BRANCH_UPSILON + + STZ $03F3 + + JSR $E112 ; $3E112 IN ROM + + LDA $6B : AND.b #$0F : BEQ .BRANCH_UPSILON + + RTS + +.BRANCH_UPSILON: + + STZ $6B + + LDA $EE : BNE .BRANCH_PHI + + LDA $034C : AND.b #$07 : BEQ .BRANCH_CHI + + LDA.b #$01 : TSB $0322 + + BRA .BRANCH_PSI + +.BRANCH_CHI: + + LDA $02E8 : AND.b #$07 : BNE .BRANCH_PSI + + LDA $0E : AND.b #$02 : BNE .BRANCH_PSI + + LDA $0322 : AND.b #$FE : STA $0322 + + BRA .BRANCH_PSI + +.BRANCH_PHI: + + LDA $0320 : AND.b #$07 : BEQ .BRANCH_OMEGA + + LDA.b #$02 : TSB $0322 + + BRA .BRANCH_PSI + +.BRANCH_OMEGA: + + ; Apparently they knew how to use TSB but now how to use TRB >___> + ; LDA.b #$02 : TRB $0322 would have sooooo worked here + LDA $0322 : AND.b #$FD : STA $0322 + + .BRANCH_PSI: + + LDA $02F7 : AND.b #$22 : BEQ .no_blue_rupee_touch + + LDX.b #$00 + + AND.b #$20 : BEQ .touched_upper_rupee_half + + LDX.b #$08 + + .touched_upper_rupee_half + + STX $00 + STZ $01 + + LDA $66 : ASL A : TAY + + REP #$20 + + LDA $7EF360 : CLC : ADC.w #$0005 : STA $7EF360 + + ; Configure the CLC : ADCress where the clearing of the rupee tile will occur. + LDA $20 : CLC : ADC $B9F7, Y : SEC : SBC $00 : STA $00 + LDA $22 : CLC : ADC $B9FF, Y : STA $02 + + SEP #$20 + + JSL Dungeon_ClearRupeeTile + + LDA.b #$0A : JSR Player_DoSfx3 + + .no_blue_rupee_touch + + LDY.b #$01 + + LDA $03F1 + + AND.b #$22 : BEQ .BRANCH_DEL + AND.b #$20 : BEQ .BRANCH_THEL + + LDY.b #$02 + +.BRANCH_THEL: + + STY $03F3 + +; *$3C64D LONG BRANCH LOCATION + + BRA .BRANCH_SIN + +.BRANCH_DEL: + + LDY.b #$03 + + LDA $03F2 + + AND.b #$22 : BEQ .BRANCH_SHIN + AND.b #$20 : BEQ .BRANCH_SOD + + LDY.b #$04 + + .BRANCH_SOD: + + STY $03F3 + + BRA .BRANCH_SIN + + .BRANCH_SHIN: + + LDA $02E8 : AND.b #$07 : BNE .BRANCH_SIN + + LDA $0E : AND.b #$02 : BNE .BRANCH_SIN + + STZ $03F3 + + .BRANCH_SIN: + + LDA $036E : AND.b #$07 : CMP.b #$07 : BNE .BRANCH_DOD + + ; $3C16D IN ROM + JSR $C16D : BCC .BRANCH_DOD + + JSR LinkState_ExitingDash + + INC $047A + + LDA.b #$02 : STA $4D + + BRA .BRANCH_TOD + + .BRANCH_DOD: + + LDA $0341 : AND.b #$07 : CMP.b #$07 : BNE .BRANCH_ZOD + + LDA $0345 : BNE .BRANCH_ZOD + + LDA $5D : CMP.b #$06 : BEQ .BRANCH_ZOD + + LDA $3E : STA $20 + LDA $40 : STA $21 + LDA $3F : STA $22 + LDA $41 : STA $23 + + JSR LinkState_ExitingDash + + LDA $1D : BNE .BRANCH_HEH + + JSL Player_LedgeJumpInducedLayerChange + + BRA .BRANCH_TOD + + .BRANCH_HEH: + + LDA.b #$01 : STA $0345 + + LDA $26 : STA $0340 + + STZ $0308 + STZ $0309 + STZ $0376 + STZ $5E + + JSL Player_ResetSwimState + + .BRANCH_TOD: + + LDA.b #$01 : STA $037B + + JSR $CC3C ; $3CC3C IN ROM + + LDA.b #$20 : JSR Player_DoSfx2 + + BRA .BRANCH_JIIM + + .BRANCH_ZOD: + + LDA $0343 : AND.b #$07 : CMP.b #$07 : BNE .BRANCH_JIIM + + LDA $0345 : BEQ .BRANCH_JIIM + + LDA $4D : BEQ .BRANCH_EIN + + LDA.b #$07 : STA $0E + + BRA .BRANCH_JIIM + + .BRANCH_EIN: + + JSR LinkState_ExitingDash + + LDA $4D : BNE .BRANCH_JIIM + + LDA $0340 : STA $26 + + STZ $0345 + + LDA.b #$15 + LDY.b #$00 + + JSL SubTransitionSplash ; $498FC IN ROM + + LDA.b #$01 : STA $037B + + JSR $CC3C ; $3CC3C IN ROM + + .BRANCH_JIIM: + + LDA $59 : AND.b #$05 : BEQ .BRANCH_GHEIN + + LDA $0E : AND.b #$02 : BNE .BRANCH_GHEIN + + LDA $5D + + CMP.b #$05 : BEQ .BRANCH_FATHA + CMP.b #$02 : BEQ .BRANCH_FATHA + + LDA.b #$09 : STA $5C + + STZ $5A + + LDA.b #$01 : STA $5B + LDA.b #$01 : STA $5D + + .BRANCH_FATHA: + + RTS + + .BRANCH_GHEIN: + + STZ $5B + + LDA $02E8 : AND.b #$07 : BEQ .BRANCH_KESRA + + LDA $46 : ORA $031F : ORA $55 : BNE .BRANCH_DUMMA + + LDA $22 + + LDY $66 : CPY.b #$02 : BNE .BRANCH_YEH + + AND.b #$04 : BEQ .BRANCH_WAW + + BRA .BRANCH_KESRA + + .BRANCH_YEH: + + AND.b #$04 : BEQ .BRANCH_KESRA + + .BRANCH_WAW: + + LDA $031F : BNE .BRANCH_KESRA + + LDA $7EF35B : TAY + + LDA $BA07, Y : STA $0373 + + JSR LinkState_ExitingDash + JSR $AE54 ; $3AE54 IN ROM + + BRL .BRANCH_$39222 + + .BRANCH_DUMMA: + + LDA $02E8 : AND.b #$07 : STA $0E + + .BRANCH_KESRA: + + LDA $046C : BEQ .BRANCH_ALPHA2 + CMP.b #$04 : BEQ .BRANCH_ALPHA2 + + LDA $EE : BNE .BRANCH_BETA2 + + .BRANCH_ALPHA2: + + LDA $5F : ORA $60 : BEQ .BRANCH_GAMMA2 + + LDA $6A : BNE .BRANCH_GAMMA2 + + LDA $5F : STA $02C2 + + DEC $61 : BPL .BRANCH_BETA2 + + REP #$20 + + LDY.b #$0F + + LDA $5F + + .BRANCH_THETA2: + + ASL A : BCC .BRANCH_DELTA2 + + PHA : PHY + + SEP #$20 + + ; $3ED2C IN ROM + JSR $ED2C : BCS .BRANCH_EPSILON2 + + STX $0E + + TYA : ASL A : TAX + + ; $3ED3F IN ROM + JSR $ED3F : BCS .BRANCH_EPSILON2 + + LDA $0E : ASL A : TAY + + JSR $F0D9 ; $3F0D9 IN ROM + + TYX + + LDY $66 + + TYA : ASL A : STA $05F8, X : STA $0474 + + LDA $05E4, X : CPY.b #$02 : BEQ .BRANCH_ZETA2 + + DEC A + + .BRANCH_ZETA2: + + AND.b #$0F : STA $05E8, X + + .BRANCH_EPSILON2: + + REP #$20 + + PLY : PLA + + .BRANCH_DELTA2: + + DEY : BPL .BRANCH_THETA2 + + SEP #$20 + + .BRANCH_GAMMA2: + + LDA.b #$15 : STA $61 + + .BRANCH_BETA2: + + LDA $6A : BNE .BRANCH_IOTA2 + + STZ $57 + + LDA $5E : CMP.b #$02 : BNE .BRANCH_IOTA2 + + STZ $5E + +; *$3C7FC LONG BRANCH LOCATION + .BRANCH_IOTA2: + + LDA $0E : AND.b #$07 : BNE .BRANCH_KAPPA2 + + BRL .BRANCH_PI2 + + .BRANCH_KAPPA2: + + LDA $5D : CMP.b #$04 : BNE .BRANCH_LAMBDA2 + + LDA $0312 : BNE .BRANCH_LAMBDA2 + + JSR Player_ResetSwimCollision + + .BRANCH_LAMBDA2: + + LDA $0E : AND.b #$02 : BEQ .BRANCH_MU2 + + LDA $0E : PHA + + JSR $C1A1 ; $3C1A1 IN ROM + JSR $91F1 ; $391F1 IN ROM + + PLA : STA $0E + + .BRANCH_MU2: + + LDA.b #$01 : STA $0302 + + LDA $0E : AND.b #$07 : CMP.b #$07 : BNE .BRANCH_NU2 + + JSR $CB84 ; $3CB84 IN ROM + + BRA .BRANCH_XI2 + + .BRANCH_NU2: + + LDA $6A : CMP.b #$02 : BNE .BRANCH_OMICRON2 + + .BRANCH_PI2: + + BRL .BRANCH_ALPHA3 + + .BRANCH_OMICRON2: + + JSR $CB84 ; $3CB84 IN ROM + + LDA $6A : CMP.b #$01 : BEQ .BRANCH_PI2 + + .BRANCH_XI2: + + LDA $0E : AND.b #$05 : CMP.b #$05 : BEQ .BRANCH_RHO2 + + AND.b #$04 : BEQ .BRANCH_SIGMA2 + + LDY.b #$01 + + LDA $31 : BCC .BRANCH_TAU2 + + EOR.b #$FF : INC A + + .BRANCH_TAU2: + + BPL .BRANCH_UPSILON2 + + LDY.b #$FF + + .BRANCH_UPSILON2: + + STY $00 : STZ $01 + + LDA $0E : AND.b #$02 : BNE .BRANCH_PHI2 + + LDA $20 : AND.b #$07 : BNE .BRANCH_CHI2 + + JSR $C1A1 ; $3C1A1 IN ROM + JSR $91F1 ; $391F1 IN ROM + + BRA .BRANCH_PHI2 + + .BRANCH_SIGMA2: + + LDY.b #$01 + + LDA $31 : BPL .BRANCH_PSI2 + + EOR.b #$FF : INC A + + .BRANCH_PSI2: + + BPL .BRANCH_OMEGA2 + + LDY.b #$FF + + .BRANCH_OMEGA2: + + STY $00 : STZ $01 + + LDA $0E : AND.b #$02 : BNE .BRANCH_PHI2 + + LDA $20 : AND.b #$07 : BNE .BRANCH_CHI2 + + .BRANCH_RHO2: + + JSR $C1A1 ; $3C1A1 IN ROM + JSR $91F1 ; $391F1 IN ROM + + BRA .BRANCH_PHI2 + + .BRANCH_CHI2: + + JSR $CBC9 ; $3CBC9 IN ROM + JMP $D485 ; $3D485 IN ROM + + .BRANCH_PHI2: + + LDA $66 : ASL A : CMP $2F : BNE .BRANCH_ALPHA3 + + LDA $0315 : AND.b #$01 : ASL A : TSB $48 + + LDA $3C : BNE .BRANCH_BETA3 + + DEC $0371 : BPL .BRANCH_GAMMA3 + + .BRANCH_BETA3: + + LDY $0315 + + LDA $02F6 : AND.b #$20 : BEQ .BRANCH_DELTA3 + + LDA $0315 : ASL #3 : TAY + + .BRANCH_DELTA3: + + TYA : TSB $48 + + BRA .BRANCH_ALPHA3 + + LDA $EE : BNE .BRANCH_GAMMA3 + + LDA $48 : AND.b #$F6 : STA $48 + + .BRANCH_ALPHA3: + + LDA.b #$20 : STA $0371 + + LDA $48 : AND.b #$FD : STA $48 + + .BRANCH_GAMMA3: + + RTS +} + +; ============================================================================== + +; *$3CF12-$3CF7D LOCAL +Player_TileDetectNearby: +{ + STZ $59 + + REP #$20 + + JSR TileDetect_ResetState + + LDA $22 : CLC : ADC $CD83 : AND $EC : LSR #3 : STA $02 + + LDA $22 : CLC : ADC $CD93 : AND $EC : LSR #3 : STA $04 + + LDA $20 : CLC : ADC $CD87 : AND $EC : STA $00 : STA $74 + + LDA $20 : CLC : ADC $CD97 : AND $EC : STA $08 + +; *$3CF49 ALTERNATE ENTRY POINT + + REP #$10 + + LDA.w #$0008 : STA $0A + + JSR TileDetect_Execute + + LDA $08 : STA $00 + + LDA.w #$0002 : STA $0A + + JSR TileDetect_Execute + + LDA $74 : STA $00 + + LDA $04 : STA $02 + + LDA.w #$0004 : STA $02 + + JSR TileDetect_Execute + + LDA $08 : STA $00 + + LDA.w #$0001 : STA $0A + + JSR TileDetect_Execute + + SEP #$30 + + RTS +} + +; ============================================================================== + +; *$3D9D8-$3DA29 LOCAL +TileDetect_Execute: +{ + ; Tile attribute handler + + ; Has $0A as a hidden argument. + + SEP #$30 + + ; Are we indoors? + LDA $1B : BNE .indoors + + ; Jump to routine that handles outdoor tile behaviors + BRL $07DC2A + +.indoors + + ; Handle dungeon tile attributes + ; some quick notes: + ; $06[1] is the tile type (no, not the tile type multiplied by two) + ; $0A[2] seems to be either 1, 2, 4, or 8. This is basically the tile's position relative to Link + + REP #$20 + + ; It's Link's movement impetus (it makes him move in a given direction each frame) + LDA $49 : AND.w #$00FF : STA $49 + + LDA $00 : AND.w #$FFF8 : ASL #3 : STA $06 + + LDA $02 : AND.w #$003F : CLC : ADC $06 + + ; Which part of a two level room is Link on + LDX $EE : BEQ .lowerFloor + + ; He's on the upper floor then. + ; CLC : ADC this offset in b/c BG0's tile attributes start at $7F3000 + CLC : ADC.w #$1000 + +.lowerFloor + + REP #$10 + + TAX + + ; Are we figuring out what sort of tile this is + LDA $7F2000, X : PHA + + LDA $037F : AND.w #$00FF + + BEQ .playinByTheRules + + ; $037F being nonzero is a sort of a hidden cheat code + PLA + + LDA.w #$0000 + + BRA .walkThroughWallsCode + +.playinByTheRules + + ; Okay back to what kind of tile it was... + PLA + +.walkThroughWallsCode + + ; Store the tile type at $06 and mirror it at $0114 + AND.w #$00FF : STA $06 : STA $0114 + + ; Save the offset for the tile (i.e. its position in $7F2000) + STX $BD + + ; Multiply this tile index by two and use it to run a service routine for that kind of tile. + ASL A : TAX + + JMP ($D7D8, X) ; ($3D7D8, X) THAT IS +} + ; *$3CEC9-$3CF09 LOCAL Collision_Detection: { @@ -32,11 +1821,11 @@ Collision_Detection: STZ $59 - LDA $22 : ADD $CDA3, Y : AND $EC : LSR #3 : STA $02 + LDA $22 : CLC : ADC $CDA3, Y : AND $EC : LSR #3 : STA $02 - LDA $20 : ADD $CDAB, Y : AND $EC : STA $00 + LDA $20 : CLC : ADC $CDAB, Y : AND $EC : STA $00 - LDA $20 : ADD $CDB3, Y : AND $EC : STA $04 + LDA $20 : CLC : ADC $CDB3, Y : AND $EC : STA $04 REP #$10 @@ -55,6 +1844,8 @@ Collision_Detection: RTS } +; ============================================================================= + ; *$3B9B3-$3B9F6 LOCAL Collision_Uncategorized: { @@ -62,18 +1853,18 @@ Collision_Uncategorized: REP #$20 - LDA $20 : SUB $0318 : STA $00 - LDA $22 : SUB $031A : STA $02 + LDA $20 : SEC : SBC $0318 : STA $00 + LDA $22 : SEC : SBC $031A : STA $02 - LDA $E8 : SUB $E6 : ADD $20 : STA $20 - LDA $E2 : SUB $E0 : ADD $22 : STA $22 + LDA $E8 : SEC : SBC $E6 : CLC : ADC $20 : STA $20 + LDA $E2 : SEC : SBC $E0 : CLC : ADC $22 : STA $22 SEP #$20 LDA $67 : BEQ .BRANCH_ALPHA - LDA $30 : ADD $00 : STA $30 - LDA $31 : ADD $02 : STA $31 + LDA $30 : CLC : ADC $00 : STA $30 + LDA $31 : CLC : ADC $02 : STA $31 .BRANCH_ALPHA: @@ -82,6 +1873,7 @@ Collision_Uncategorized: RTS } +; ============================================================================= Collision_Settings: { @@ -97,8 +1889,8 @@ Collision_Settings: REP #$20 - LDA $E6 : SUB $E8 : ADD $20 : STA $20 : STA $0318 - LDA $E0 : SUB $E2 : ADD $22 : STA $22 : STA $031A + LDA $E6 : SEC : SBC $E8 : CLC : ADC $20 : STA $20 : STA $0318 + LDA $E0 : SEC : SBC $E2 : CLC : ADC $22 : STA $22 : STA $031A SEP #$20 @@ -117,6 +1909,8 @@ Collision_Settings: RTS } +; ============================================================================= + Link_HandleDiagonalCollision: { ; $3B97C IN ROM @@ -337,3 +2131,450 @@ Link_HandleDiagonalCollision: RTS } + +; *$3B956-$3B968 LOCAL +RunSlopeCollisionChecks_VerticalFirst: +{ + LDA $6B : AND.b #$20 : BNE .BRANCH_ALPHA + + JSR $BA0A ; $3BA0A IN ROM + +.BRANCH_ALPHA: + + LDA $6B : AND.b #$10 : BNE .BRANCH_BETA + + JSR $C4D4 ; $3C4D4 IN ROM + +.BRANCH_BETA: + + RTS +} + +; *$3B969-$3B97B LOCAL +RunSlopeCollisionChecks_HorizontalFirst: +{ + LDA $6B : AND.b #$10 : BNE .BRANCH_ALPHA + + JSR $C4D4 ; $3C4D4 IN ROM + + .BRANCH_ALPHA: + + LDA $6B : AND.b #$20 : BNE .BRANCH_BETA + + JSR $BA0A ; $3BA0A IN ROM + +.BRANCH_BETA: + + RTS +} + +; ============================================================================== + +; *$3CCAB-$3CD7A LOCAL +LinkTileMovementRoutine: +{ + ; Denotes how much Link will move during the frame in a vertical direction (signed) + LDA $30 : BEQ .BRANCH_ALPHA + + ; this is reached if there is vertical movement + LDA $31 : BNE .BRANCH_BETA + + .BRANCH_ALPHA: + + ; This is executed if there is no horizontal movement (vertical doesn't matter) + + BRL .BRANCH_THETA + +.BRANCH_BETA: + + ; Basically this code executes only if Link is moving diagonally + + ; $02DE[2] = mirror of Link's Y coordinate + LDA $20 : STA $02DE + LDA $21 : STA $02DF + + ; $02DC[2] = mirror of Link's X coordinate + LDA $22 : STA $02DC + LDA $23 : STA $02DD + + LDY.b #$04 + + LDA $31 : BMI .BRANCH_GAMMA ; Is Link moving to the left? If so, branch + + ; This probably sets up a different hit detection box b/c he's looking in a different direction + LDY.b #$06 + +.BRANCH_GAMMA: + + JSR $CE2A ; $3CE2A IN ROM + + LDA $0C : AND.b #$05 : BEQ .BRANCH_DELTA + + JSR $E112 ; $3E112 IN ROM + + LDA $6B : AND.b #$0F : BNE .BRANCH_EPSILON + + .BRANCH_DELTA: + + BRL .BRANCH_THETA + +.BRANCH_EPSILON: + + REP #$20 + + LDA $22 : SEC : SBC $02DC : STA $00 + + LDA $02DC : STA $22 + + SEP #$20 + + LDA $00 : STA $31 + + LDY.b #$00 + + LDA $30 : BMI .BRANCH_ZETA + + LDY.b #$02 + +.BRANCH_ZETA: + + JSR TileDetect_Movement_Vertical ; $3CDCB IN ROM + + LDA $0C : AND.b #$05 : BEQ .BRANCH_THETA + + JSR $E076 ; $3E076 IN ROM + + LDA $6B : AND.b #$0F : BEQ .BRANCH_THETA + + ; Store the diagonal movement characteristics to $6D (but why?) + LDA $6B : STA $6D + + REP #$20 + + LDA $20 : SEC : SBC $02DE : STA $00 + + SEP #$20 + + LDA $00 : STA $30 + + LDY $31 : BMI .BRANCH_IOTA + + LDA $CC83, Y + + BRA .BRANCH_KAPPA + +.BRANCH_IOTA: + + TYA : EOR.b #$FF : INC A : TAY + + LDA $CC8D, Y ; $3CC8D, Y THAT IS + +.BRANCH_KAPPA: + + REP #$20 + + AND.w #$00FF : CMP.w #$0080 : BCC .BRANCH_LAMBDA + + ORA.w #$FF00 + +.BRANCH_LAMBDA: + + CLC : ADC $22 : STA $22 + + SEP #$20 + + LDY $30 : BMI .BRANCH_MU + + LDA $CC97, Y + + BRA .BRANCH_NU + +.BRANCH_MU: + + TYA : EOR.b #$FF : INC A : TAY + + LDA $CCA1, Y + +.BRANCH_NU: + + REP #$20 + + AND.w #$00FF : CMP.w #$0080 : BCC .BRANCH_XI + + ORA.w #$FF00 + +.BRANCH_XI: + + CLC : ADC $20 : STA $20 + + SEP #$20 + + BRA .BRANCH_OMICRON + +.BRANCH_THETA: + + STZ $6D + +.BRANCH_OMICRON: + + STZ $6B + + RTS +} + +; *$3B7C7-$3B955 LOCAL +Link_HandleCardinalCollision: +{ + ; Initialize the diagonal wall state + STZ $6E + + ; ???? + STZ $38 + + ; Detects forced diagonal movement, as when walking against a diagonal wall + ; Branch if there is [forced] diagonal movement + LDA $6B : AND.b #$30 : BNE .BRANCH_ALPHA + + ; $3CCAB IN ROM; Handles left/right tiles and maybe up/down too + JSR LinkTileMovementRoutine + + LDA $6D : BEQ .BRANCH_ALPHA + + BRL .BRANCH_BETA + + .BRANCH_ALPHA: + + ; $3B97C IN ROM + JSR Collision_Settings : BCC .BRANCH_BETA + + ; "Check collision" as named in Hyrule Magic + ; Keep in mind that outdoors, collisions are always 0, i.e. "normal" + ; Why load it twice, homes? + LDA $046C : CMP.b #$02 : BCC .BRANCH_GAMMA + LDA $046C : CMP.b #$03 : BEQ .BRANCH_GAMMA + + LDA.b #$02 : STA $0315 + + REP #$20 + + JSR Player_TileDetectNearby + + SEP #$20 + + LDA $0E : STA $0316 : BEQ .BRANCH_GAMMA + + LDA $30 : STA $00 + + CLC : ADC $0310 : STA $30 + + LDA $31 : STA $01 + + CLC : ADC $0312 : STA $31 + + LDA $0E + + CMP.b #$0C : BEQ .BRANCH_GAMMA + CMP.b #$03 : BEQ .BRANCH_GAMMA + CMP.b #$0A : BEQ .BRANCH_DELTA + CMP.b #$05 : BEQ .BRANCH_DELTA + AND.b #$0C : BNE .BRANCH_EPSILON + + LDA $0E : AND.b #$03 : BNE .BRANCH_EPSILON + + BRA .BRANCH_GAMMA + +.BRANCH_EPSILON: + + LDA $00 : BNE .BRANCH_DELTA + + LDA $01 : BEQ .BRANCH_GAMMA + + LDA $0301 : BPL .BRANCH_DELTA + +.BRANCH_GAMMA: + + JSR UnnamedRoutine1 ; $3B956 IN ROM + + BRA .BRANCH_ZETA + + .BRANCH_DELTA: + + JSR UnnamedRoutine2 ; $3B969 IN ROM + +.BRANCH_ZETA: + + JSR $B9B3 ; $3B9B3 IN ROM + +.BRANCH_BETA: + + ; Check the "collision" value (as in Hyrule Magic) + LDA $046C + + CMP.b #$02 : BEQ .BRANCH_THETA + CMP.b #$03 : BEQ .BRANCH_IOTA + CMP.b #$04 : BEQ .BRANCH_KAPPA + + ; Is there horizontal or vertical scrolling happening? + LDA $30 : ORA $31 : BNE .BRANCH_KAPPA + + LDA $5D + + CMP.b #$13 : BEQ .BRANCH_LAMBDA + CMP.b #$08 : BEQ .BRANCH_LAMBDA + CMP.b #$09 : BEQ .BRANCH_LAMBDA + CMP.b #$0A : BEQ .BRANCH_LAMBDA + CMP.b #$03 : BEQ .BRANCH_LAMBDA + + JSR Player_TileDetectNearby + + LDA $59 : AND.b #$0F : BEQ .BRANCH_LAMBDA + + LDA.b #$01 : STA $5D + + LDA $0372 : BNE .BRANCH_LAMBDA + + LDA.b #$04 : STA $5E + +.BRANCH_LAMBDA: + + BRL .BRANCH_XI + +.BRANCH_THETA: + + JSR Player_TileDetectNearby + + LDA $0E : ORA $0316 : CMP.b #$0F : BNE .BRANCH_KAPPA + + LDA $031F : BNE .BRANCH_MU + + LDA.b #$3A : STA $031F + +.BRANCH_MU: + + LDA $67 : BNE .BRANCH_KAPPA + + LDA $0310 : BEQ .BRANCH_NU + + LDA $30 : EOR.b #$FF : INC A : STA $30 + +.BRANCH_NU: + + LDA $0312 : BEQ .BRANCH_KAPPA + + LDA $31 : EOR.b #$FF : INC A : STA $31 + +.BRANCH_KAPPA: + + LDA.b #$01 : STA $0315 + + JSR UnnamedRoutine1 ; $3B956 IN ROM + + BRA .BRANCH_XI + +.BRANCH_IOTA: + + LDA.b #$01 : STA $0315 + + JSR UnnamedRoutine2 ; $3B969 IN ROM + +.BRANCH_XI: + + LDY.b #$00 + + JSR UnnamedRoutine3 ; $3D077 IN ROM + + LDA $6A : BEQ .BRANCH_OMICRON + + STZ $6B + +.BRANCH_OMICRON: + + LDA $5D : CMP.b #$0B : BEQ .BRANCH_PI + + LDY.b #$08 + + LDA $20 : SEC : SBC $3E : STA $30 : BEQ .BRANCH_PI : BMI .BRANCH_RHO + + LDY.b #$04 + +.BRANCH_RHO: + + LDA $67 : AND.b #$03 : STA $67 + + TYA : TSB $67 + +.BRANCH_PI: + + ; Two LDA's in a row? + LDA.b #$02 + + LDA $22 : SEC : SBC $3F : STA $31 : BEQ .BRANCH_SIGMA : BMI .BRANCH_TAU + + LDY.b #$01 + +.BRANCH_TAU: + + LDA $67 : AND.b #$0C : STA $67 + + TYA : TSB $67 + +.BRANCH_SIGMA: + + LDA $1B : BEQ .BRANCH_UPSILON + + LDA $046C : CMP.b #$04 : BNE .BRANCH_UPSILON + + LDA $5D : CMP.b #$04 : BNE .BRANCH_UPSILON + + LDY.b #$F7 + + LDA $0310 : BEQ .BRANCH_PHI : BMI .BRANCH_CHI + + LDY.b #$FB + +.BRANCH_CHI: + + EOR.b #$FF : INC A : CLC : ADC $30 : BNE .BRANCH_PHI + + TYA : AND $67 : STA $67 + +.BRANCH_PHI: + + LDY.b #$FD + + LDA $0312 : BEQ .BRANCH_UPSILON : BMI .BRANCH_PSI + + LDY.b #$FE + +.BRANCH_PSI: + + EOR.b #$FF : INC A : CLC : ADC $31 : BNE .BRANCH_UPSILON + + TYA : AND $67 : STA $67 + +.BRANCH_UPSILON: + + RTS +} + +; ============================================================================== + +; *$3E8F0-$3E900 LOCAL +HandleIndoorCameraAndDoors: +{ + ; If outdoors, ignore + LDA $1B : BEQ .return + + ; I'll deal with this routine later >:( + LDA $6C : BEQ .notInDoorway + + JML $07E901 ; $3E901 IN ROM + +.notInDoorway + + JSL $07E9D3 ; $3E9D3 IN ROM + +.return + + RTS +} \ No newline at end of file