2580 lines
38 KiB
NASM
2580 lines
38 KiB
NASM
; =============================================================================
|
|
; 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:
|
|
|
|
org $079873
|
|
Player_ResetSwimCollision:
|
|
|
|
org $0ED6C0
|
|
LoadActualGearPalettes:
|
|
|
|
org $07E245
|
|
Link_HandleVelocity:
|
|
|
|
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:
|
|
{
|
|
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
|
|
} |