diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index b33e6c5..f99f924 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -157,6 +157,7 @@ incsrc init.asm org $A48000 ; code bank - PUT NEW CODE HERE incsrc openmode.asm +incsrc quickswap.asm incsrc endingsequence.asm ;org $228000 ; contrib area diff --git a/hooks.asm b/hooks.asm index 05705dc..b56925c 100644 --- a/hooks.asm +++ b/hooks.asm @@ -2085,3 +2085,13 @@ JSL.l ArrowGame : NOP #14 org $07A06C ; <- Bank07.asm:5215 (LDA $7EF377 : BEQ BRANCH_EPSILON) JSL.l DecrementArrows : SKIP #2 : NOP #5 ;================================================================================ + +;================================================================================ +; Quick Swap +;-------------------------------------------------------------------------------- +org $0287FB ; <- 107FB - Bank02.asm:1526 (LDA $F6 : AND.b #$40 : BEQ .dontActivateMap) +JSL.l QuickSwap + +org $02A451 ; <- 12451 - Bank02.asm:6283 (LDA $F6 : AND.b #$40 : BEQ .xButtonNotDown) +JSL.l QuickSwap +;================================================================================ diff --git a/inventory.asm b/inventory.asm index 23692dc..8a9d5ab 100644 --- a/inventory.asm +++ b/inventory.asm @@ -53,7 +53,7 @@ RTL LDA.b #$20 : STA $012F ; menu select sound JSL.l ResetEquipment RTL - .y_pressed + .y_pressed ; Note: used as entry point by quickswap code. Must preserve X. LDA.b #$10 : STA $0207 LDA $0202 ; check selected item CMP #$02 : BNE + ; boomerang diff --git a/quickswap.asm b/quickswap.asm new file mode 100644 index 0000000..59adbf0 --- /dev/null +++ b/quickswap.asm @@ -0,0 +1,93 @@ +; 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 #$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 + + ;TODO add romtype and race rom checks here + + 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 #$10 : BEQ + ; Only pressed R + JSR.w RCode + LDA.b $F2 : BIT #$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 + CPX.b #$02 : BEQ + ; boomerang + CPX.b #$01 : BEQ + ; bow + CPX.b #$05 : BEQ + ; powder + CPX.b #$0D : BEQ + ; flute + BRA .store + + STX $0202 : JSL ProcessMenuButtons_y_pressed + + .store + LDA.b #$20 : STA.w $012F + STX $0202 + + JSL HUD_RefreshIconLong + PLX + + .done + LDA.b $F6 : AND.b #$40 ;what we wrote over +RTL +RCode: + LDA.w $0202 : TAX + - + CPX.b #$0F : BNE + ; incrementing into bottle + LDX.b #$00 : BRA ++ + + CPX.b #$10 : BNE + ; incrementing bottle + LDA.l $7EF34F : TAX + -- : ++ + CPX.b #$04 : BEQ .noMoreBottles + INX + LDA.l $7EF35B,X : BEQ -- + TXA : STA.l $7EF34F + LDX #$10 + RTS + .noMoreBottles + LDX #$11 + BRA .nextItem + + CPX.b #$14 : BNE + : LDX.b #$00 ;will wrap around to 1 + + INX + .nextItem + JSL.l IsItemAvailable : BEQ - +RTS + +LCode: + LDA.w $0202 : TAX + - + CPX.b #$11 : BNE + ; decrementing into bottle + LDX.b #$05 : BRA ++ + + CPX.b #$10 : BNE + ; decrementing bottle + LDA.l $7EF34F : TAX + -- : ++ + CPX.b #$01 : BEQ .noMoreBottles + DEX + LDA.l $7EF35B,X : BEQ -- + TXA : STA.l $7EF34F + LDX.b #$10 + RTS + .noMoreBottles + LDX.b #$0F : BRA .nextItem + + CPX.b #$01 : BNE + : LDX.b #$15 ; will wrap around to $14 + + DEX + .nextItem + JSL.l IsItemAvailable : BEQ - +RTS diff --git a/tables.asm b/tables.asm index da5be16..ce348ae 100644 --- a/tables.asm +++ b/tables.asm @@ -197,6 +197,10 @@ org $30804A ; PC 0x18004A InvertedMode: db #$00 ; #$00 = Normal (default) - #$01 = Inverted ;-------------------------------------------------------------------------------- +org $30804B ; PC 0x18004B +QuickSwapFlag: +db #$00 ; #$00 = Off (default) - #$01 = On +;-------------------------------------------------------------------------------- org $308080 ; PC 0x180080 Upgrade5BombsRefill: db #$00