; ============================================================================= ; 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 ; } ; ============================================================================== ; *$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: { REP #$20 JSR TileDetect_ResetState STZ $59 LDA $22 : CLC : ADC $CDA3, Y : AND $EC : LSR #3 : STA $02 LDA $20 : CLC : ADC $CDAB, Y : AND $EC : STA $00 LDA $20 : CLC : ADC $CDB3, Y : AND $EC : STA $04 REP #$10 LDA.w #$0001 : STA $0A JSR TileDetect_Execute LDA $04 : STA $00 LDA.w #$0002 : STA $0A JSR TileDetect_Execute SEP #$30 RTS } ; ============================================================================= ; *$3B9B3-$3B9F6 LOCAL Collision_Uncategorized: { LDA $046C : CMP.b #$01 : BEQ .BRANCH_ALPHA REP #$20 LDA $20 : SEC : SBC $0318 : STA $00 LDA $22 : SEC : SBC $031A : STA $02 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 : CLC : ADC $00 : STA $30 LDA $31 : CLC : ADC $02 : STA $31 .BRANCH_ALPHA: STZ $EE RTS } ; ============================================================================= Collision_Settings: { ; Collision settings LDA $046C : BEQ .oneBg CMP.b #$04 : BEQ .oneBg ; moving water collision setting CMP.b #$02 : BCC .twoBgs CMP.b #$03 : BNE .uselessBranch ; No code here, just us mice! .uselessBranch REP #$20 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 .twoBgs LDA.b #$01 : STA $EE SEC RTS .oneBg CLC RTS } ; ============================================================================= Link_HandleDiagonalCollision: { ; $3B97C IN ROM JSR Collision_Settings : BCC .onlyOneBg JSR .alt_entry ; $3B660 IN ROM JSR Collision_Uncategorized ; $3B9B3 IN ROM .onlyOneBg LDA $67 : AND.b #$0F : STA $67 ; *$3B660 ALTERNATE ENTRY POINT .alt_entry LDA.b #$0F : STA $42 : STA $43 STZ $6A ; Checking to see if either up or down was pressed. ; Yeah, one of them was. LDA $67 : AND.b #$0C : BNE .verticalWalking ; Neither up nor down was pressed. BRL .BRANCH_ULTIMA .verticalWalking INC $6A LDY.b #$00 ; Walking in the up direction? AND.b #$08 : BNE .walkingUp ; Walking in the down direction LDY.b #$02 .walkingUp ; $66 = #$0 or #$1. #$1 if the down button, #$0 if the up button was pushed. TYA : LSR A : STA $66 JSR Collision_Uncategorized ; $3CE85 IN ROM LDA $0E : AND.b #$30 : BEQ .BRANCH_DELTA LDA $62 : AND.b #$02 : BNE .BRANCH_DELTA LDA $0E : AND.b #$30 : LSR #4 : AND $67 : BNE .BRANCH_DELTA LDY.b #$02 LDA $67 AND.b #$03 : BEQ .BRANCH_DELTA AND.b #$02 : BNE .BRANCH_EPSILON LDY.b #$03 BRA .BRANCH_EPSILON .BRANCH_DELTA: LDA $046C : BEQ .BRANCH_ZETA LDA $0E : AND.b #$03 : BNE .BRANCH_THETA BRA .BRANCH_IOTA .BRANCH_ZETA: ; If Link is in the ground state, then branch. LDA $4D : BEQ .BRANCH_THETA LDA $0C : AND.b #$03 : BEQ .BRANCH_THETA BRA .BRANCH_MU .BRANCH_THETA: LDA $0E : AND.b #$03 : BEQ .BRANCH_IOTA STZ $6B LDA $034A : BEQ .BRANCH_MU LDA $02E8 : AND.b #$03 : BNE .BRANCH_MU LDA $67 : AND.b #$03 : BEQ .BRANCH_MU STZ $033C STZ $033D STZ $032F STZ $0330 STZ $032B STZ $032C STZ $0334 STZ $0335 .BRANCH_MU: LDA.b #$01 : STA $0302 LDY $66 .BRANCH_EPSILON: LDA $B64B, Y : STA $42 .BRANCH_IOTA: LDA $67 : AND.b #$03 : BNE .BRANCH_LAMBDA BRL .BRANCH_ULTIMA .BRANCH_LAMBDA: INC $6A LDY.b #$04 AND.b #$02 : BNE .BRANCH_NU LDY.b #$06 .BRANCH_NU: TYA : LSR A : STA $66 JSR Collision_Detection ; $3CEC9 IN ROM LDA $0E : AND.b #$30 : BEQ .BRANCH_XI LDA $62 : AND.b #$02 : BEQ .BRANCH_XI LDA $0E : AND.b #$30 : LSR #2 : AND $67 : BNE .BRANCH_XI LDY.b #$00 LDA $67 AND.b #$0C : BEQ .BRANCH_XI AND.b #$08 : BNE .BRANCH_OMICRON LDY.b #$01 BRA .BRANCH_OMICRON .BRANCH_XI: ; One BG collision LDA $046C : BEQ .BRANCH_PI LDA $0E : AND.b #$03 : BNE .BRANCH_RHO BRA .BRANCH_SIGMA .BRANCH_PI: LDA $4D : BEQ .BRANCH_RHO LDA $0C : AND.b #$03 : BEQ .BRANCH_RHO BRA .BRANCH_UPSILON .BRANCH_RHO: LDA $0E : AND.b #$03 : BEQ .BRANCH_SIGMA STZ $6B LDA $034A : BEQ .BRANCH_UPSILON LDA $02E8 : AND.b #$03 : BNE .BRANCH_UPSILON ; Check if Link is walking in an vertical direction LDA $67 : AND.b #$0C : BEQ .BRANCH_UPSILON STZ $033E STZ $033F STZ $0331 STZ $0332 STZ $032D STZ $032E STZ $0336 STZ $0337 .BRANCH_UPSILON: LDA.b #$01 : STA $0302 LDY $66 .BRANCH_OMICRON: LDA $B64B, Y : STA $43 .BRANCH_SIGMA: LDA $67 : AND $42 : AND $43 : STA $67 .BRANCH_ULTIMA: LDA $67 : AND.b #$0F : BEQ .BRANCH_PHI LDA $6B : AND.b #$0F : BEQ .BRANCH_PHI STA $67 .BRANCH_PHI: ; Is this checking if Link is moving diagonally? LDA $6A : STZ $6A : CMP.b #$02 : BNE .BRANCH_OMEGA LDY.b #$01 LDA $2F : AND.b #$04 : BEQ .BRANCH_ALIF LDY.b #$02 .BRANCH_ALIF: STY $6A .BRANCH_OMEGA: 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 }