Files
alttpr-baserom/quickswap.asm
cassidoxa 788cceaab9 Continue labeling and documentation in ram.asm, main rando block
Deleted several unused modules and some commented code
Reorganized some routines to clean up modules
Moved some memory into mirrored WRAM
Refactored NMI hook aux routine
Removed old fake flipper fix
2022-11-16 21:38:28 -05:00

93 lines
2.2 KiB
NASM

; Thanks to Kazuto for developing the original QS code that inspired this one
QuickSwap:
; We perform all other checks only if we are pushing L or R in order to have minimal
; perf impact, since this runs every frame
LDA.b $F6 : AND.b #$30 : BEQ .done
XBA ; stash away the value for after the checks.
LDA.l QuickSwapFlag : BEQ .done
LDA.w $0202 : BEQ .done ; Skip everything if we don't have any items
LDY.b #$14
PHX
XBA ; restore the stashed value
CMP.b #$30 : BNE +
; If prossing both L and R this frame, then go directly to the special swap code
LDX.w $0202 : BRA .special_swap
+
BIT.b #$10 : BEQ + ; Only pressed R
JSR.w RCode
LDA.b $F2 : BIT.b #$20 : BNE .special_swap ; Still holding L from a previous frame
BRA .store
+
; Only pressed L
JSR.w LCode
LDA.b $F2 : BIT #$10 : BNE .special_swap ; Still holding R from a previous frame
BRA .store
.special_swap
LDA.l InventoryTracking+1 : ORA.b #$01 : STA.l InventoryTracking+1
CPX.b #$02 : BEQ + ; boomerang
CPX.b #$01 : BEQ + ; bow
CPX.b #$05 : BEQ + ; powder
CPX.b #$0D : BEQ + ; flute
CPX.b #$10 : BEQ + ; bottle
BRA .store
+ STX.w $0202 : JSL ProcessMenuButtons_y_pressed
.store
LDA.b #$20 : STA.w $012F
STX.w $0202
JSL HUD_RefreshIconLong
PLX
.done
LDA.b $F6 : AND.b #$40 ;what we wrote over
RTL
RCode:
LDX.w $0202
LDA.b $F2 : BIT.b #$20 : BNE ++ ; Still holding L from a previous frame
LDA.l InventoryTracking+1 : AND.b #$FE : STA.l InventoryTracking+1
BRA +
++
LDA.l InventoryTracking+1 : BIT.b #$01 : BEQ +
RTS
-
+ CPX.b #$14 : BNE + : LDX.b #$00 ;will wrap around to 1
+ INX
DEY : BEQ +
.nextItem
JSL.l IsItemAvailable : BEQ -
+
RTS
LCode:
LDX.w $0202
LDA.b $F2 : BIT #$10 : BNE ++ ; Still holding R from a previous frame
LDA.l InventoryTracking+1 : AND.b #$FE : STA.l InventoryTracking+1
BRA +
++
LDA.l InventoryTracking+1 : BIT.b #$01 : BEQ +
RTS
-
+ CPX.b #$01 : BNE + : LDX.b #$15 ; will wrap around to $14
+ DEX
DEY : BEQ +
.nextItem
JSL.l IsItemAvailable : BEQ -
+
RTS
IsItemAvailable:
LDA.l InfiniteBombs : BEQ .finite
.infinite
CPX.b #$04 : BNE .finite
LDA.b #$01 : RTL
.finite
LDA.l EquipmentWRAM-1, X
RTL