From fd7d2bba3a6409dc4d94e1d35fac1a2b622549af Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Wed, 28 Aug 2019 10:26:00 -0700 Subject: [PATCH] MSU-1 fixes and updates --- LTTP_RND_GeneralBugfixes.asm | 9 ++ events.asm | 7 ++ hooks.asm | 1 - msu.asm | 221 +++++++++++++++++++++-------------- tables.asm | 16 ++- 5 files changed, 162 insertions(+), 92 deletions(-) diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index fb83f9f..a5e9dcd 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -75,6 +75,15 @@ db #$20, #$19, #$06, #$17 ; year/month/day !FORCE_HEART_SPAWN = "$7F5033"; !SKIP_HEART_SAVE = "$7F5034"; +; MSU-1 +!REG_MSU_FALLBACK_TABLE = $7F50A0 ; 8 bytes +!REG_MSU_DELAYED_COMMAND = $7F50A9 +!REG_MSU_PACK_COUNT = $7F50AA +!REG_MSU_PACK_CURRENT = $7F50AB +!REG_MUSIC_CONTROL = $012B +;!REG_MUSIC_CONTROL = $012C +!REG_MUSIC_CONTROL_REQUEST = $012C + ;================================================================================ incsrc hooks.asm diff --git a/events.asm b/events.asm index d0e179f..6194b9d 100644 --- a/events.asm +++ b/events.asm @@ -203,6 +203,13 @@ RTL PostItemAnimation: LDA.b #$00 : STA !ITEM_BUSY ; mark item as finished + LDA $02D8 : CMP #$32 : BNE + ; Big Key + LDA $1B : BEQ + ; Check that we're indoors + LDA $040C : CMP #$1A : BNE + ; Check that we're in Ganon's Tower + LDA !REG_MSU_FALLBACK_TABLE+7 : AND #$04 : BEQ + + LDA.b #59 : STA !REG_MUSIC_CONTROL_REQUEST + + + LDA $7F509F : BEQ + STZ $1CF0 : STZ $1CF1 ; reset decompression buffer JSL.l Main_ShowTextMessage_Alt diff --git a/hooks.asm b/hooks.asm index 7e94098..af1a35c 100755 --- a/hooks.asm +++ b/hooks.asm @@ -1447,7 +1447,6 @@ org $0EE6EC ; <- E220 A922 - Bank0E.asm:2892 (SEP #$20 : LDA.b #$22 : STA $012C) JSL.l ending_wait ; Process music commands in NMI from new location after muting is processed -!REG_MUSIC_CONTROL = "$012B" org $0080DD dw !REG_MUSIC_CONTROL diff --git a/msu.asm b/msu.asm index a5df703..1b9689c 100644 --- a/msu.asm +++ b/msu.asm @@ -57,6 +57,7 @@ ; 44 - Thieves' Town ; 45 - Turtle Rock ; 46 - Ganon's Tower +; 59 - Ganon's Tower (Upstairs) ; ; Bosses ; @@ -73,6 +74,11 @@ ; 57 - Turtle Rock ; 58 - Ganon's Tower ; +; Additional tracks +; +; 60 - Light World OW (after ped pull) +; 61 - Dark World OW (with all crystals) +; ;======================================= !REG_MSU_STATUS = $2000 @@ -120,21 +126,12 @@ !REG_CURRENT_MSU_TRACK = $010B !REG_CURRENT_VOLUME = $0127 !REG_TARGET_VOLUME = $0129 -!REG_MUSIC_CONTROL = $012B -;!REG_MUSIC_CONTROL = $012C -!REG_MUSIC_CONTROL_REQUEST = $012C !REG_CURRENT_TRACK = $0130 !REG_CURRENT_COMMAND = $0133 !REG_SPC_CONTROL = $2140 !REG_NMI_FLAGS = $4210 -; $7EF50A0 - $7EF50AF Reserved block in main RAM -!REG_MSU_FALLBACK_TABLE = $7F50A0 ; 8 bytes -!REG_MSU_DELAYED_COMMAND = $7F50A9 -!REG_MSU_PACK_COUNT = $7F50AA -!REG_MSU_PACK_CURRENT = $7F50AB - !VAL_COMMAND_FADE_OUT = #$F1 !VAL_COMMAND_FADE_HALF = #$F2 !VAL_COMMAND_FULL_VOLUME = #$F3 @@ -147,7 +144,7 @@ CheckMusicLoadRequest: PHP : REP #$10 : PHA : PHX : PHY - LDA !REG_MUSIC_CONTROL_REQUEST : BEQ .skip : BMI .skip : CMP $0133 : BNE .continue + LDA !REG_MUSIC_CONTROL_REQUEST : BEQ .skip : BMI .skip : CMP !REG_CURRENT_COMMAND : BNE .continue .skip STA !REG_MUSIC_CONTROL : STZ !REG_MUSIC_CONTROL_REQUEST PLY : PLX : PLA : PLP @@ -156,34 +153,106 @@ CheckMusicLoadRequest: .continue ; Shut down NMI until music loads STZ $4200 - - ; Set SPC into loader mode - LDA.b #$FF : STA $2140 - LDA NoBGM : BNE .mute - LDX !REG_MSU_ID_01 : CPX !VAL_MSU_ID_01 : BNE .unmute - LDX !REG_MSU_ID_23 : CPX !VAL_MSU_ID_23 : BNE .unmute - LDX !REG_MSU_ID_45 : CPX !VAL_MSU_ID_45 : BNE .unmute + LDA NoBGM : BEQ + + BRL .mute + + + + LDX !REG_MSU_ID_01 : CPX !VAL_MSU_ID_01 : BEQ + + - : BRL .unmute + + + LDX !REG_MSU_ID_23 : CPX !VAL_MSU_ID_23 : BNE - + LDX !REG_MSU_ID_45 : CPX !VAL_MSU_ID_45 : BNE - - ; TODO: actually look up the current track in the table SEP #$10 + ; Load alternate or dungeon-specific tracks + LDA !REG_MUSIC_CONTROL_REQUEST + + CMP.b #02 : BEQ .lightworld + CMP.b #09 : BEQ .darkworld + CMP.b #13 : BEQ .darkwoods + CMP.b #16 : BEQ .castle + CMP.b #17 : BEQ .dungeon + CMP.b #22 : BEQ .dungeon + CMP.b #21 : BNE .check_fallback + +;.boss + LDA $040C : LSR : !ADD.b #45 + BRA .check_fallback-3 +.lightworld + PHA + LDA $7EF300 : AND.b #$40 : BEQ + + LDA.b #60 : BRA .check_fallback-3 + + + - : PLA : BRA .check_fallback-3 +.darkworld + PHA + LDA $7EF371 : CMP.b #$7F : BNE - + PLA + LDA.b #61 : BRA .check_fallback-3 +.darkwoods + PHA + LDA $7EF3CA : BEQ - + LDA $8A : CMP #$40 : BNE - + PLA + LDA.b #15 : BRA .check_fallback-3 +.castle + LDA $040C + CMP.b #$08 : BNE .check_fallback ; Hyrule Castle 2 +.dungeon + LDA $040C : LSR : !ADD.b #33 : STA !REG_MUSIC_CONTROL_REQUEST + CMP.b #46 : BNE .check_fallback + + ; Ganon's Tower + LDA $7EF366 : AND.b #$04 : BEQ .check_fallback ; Check if we have the GT big key + LDA !REG_MSU_FALLBACK_TABLE+7 : AND.b #$04 : BEQ .check_fallback ; Check if the 2nd GT track exists + LDA.b #59 + STA !REG_MUSIC_CONTROL_REQUEST + +.check_fallback LDA !REG_MUSIC_CONTROL_REQUEST : DEC : PHA - AND #$07 : TAY + AND.b #$07 : TAY PLA : LSR #3 : TAX - LDA !REG_MSU_FALLBACK_TABLE,X : BEQ .unmute : CMP #$FF : BEQ .mute + LDA !REG_MSU_FALLBACK_TABLE,X : BEQ .secondary_fallback : CMP.b #$FF : BEQ .mute - : CPY #$00 : BEQ + - LSR : DEY : BRA - : + + LSR : DEY : BRA - + + - AND #$01 : BEQ .unmute + AND.b #$01 : BEQ .secondary_fallback .mute + LDA.b #$FF : STA $2140 LDA.b #SPCMutePayload : STA $00 LDA.b #SPCMutePayload>>8 : STA $01 LDA.b #SPCMutePayload>>16 BRA .load +.secondary_fallback + LDX !REG_MUSIC_CONTROL_REQUEST : LDA MSUExtendedFallbackList-1,X + CMP !REG_MUSIC_CONTROL_REQUEST : BEQ .unmute + CPX #35 : !BLT + + CPX #47 : !BLT .dungeon_fallback + + + + STA !REG_MUSIC_CONTROL_REQUEST + BRA .check_fallback + +.dungeon_fallback + PHB : REP #$10 + LDX $040C + LDA.b #Music_Eastern>>16 : PHA : PLB ; Set bank to music pointers + LDY $00 : PHY + REP #$20 + LDA MSUDungeonFallbackList,X : STA $00 + SEP #$20 + LDA ($00) + PLY : STY $00 : SEP #$10 : PLB + STA !REG_MUSIC_CONTROL_REQUEST + BRA .check_fallback + .unmute + LDA.b #$FF : STA $2140 LDA.b #SPCUnmutePayload : STA $00 LDA.b #SPCUnmutePayload>>8 : STA $01 LDA.b #SPCUnmutePayload>>16 @@ -195,16 +264,24 @@ CheckMusicLoadRequest: ; Re-enable NMI and joypad LDA.b #$81 : STA $4200 + LDA !REG_MUSIC_CONTROL_REQUEST : CMP.b #08 : BEQ .done+3 ; No SFX during warp track + LDA $10 - CMP #$07 : BEQ .sfx_indoors : CMP #$0E : BEQ .sfx_indoors - CMP #$09 : BNE .done + CMP.b #$07 : BEQ .sfx_indoors + CMP.b #$0E : BEQ .sfx_indoors + CMP.b #$09 : BNE .done .sfx_outdoors SEP #$10 - ; PreOverworld_LoadProperties.noWarpVortex ; Bank02.asm:820 LDX.b #$05 + LDA $8A : CMP.b #$70 : BNE + ; Misery Mire + LDA $7EF2F0 : AND.b #$20 : BEQ .rain + + + LDA $7EF3C5 : CMP.b #$02 : BCS + - LDX.b #$01 : + +.rain + LDX.b #$01 + + STX $012D REP #$10 @@ -220,7 +297,7 @@ CheckMusicLoadRequest: msu_init: PHP : REP #$20 - LDA #$0000 + LDA.w #$0000 STA !REG_MSU_VOLUME STA !REG_MSU_PACK_COUNT @@ -261,7 +338,8 @@ msu_init: .wait_track LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_BUSY : BNE .wait_track LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BNE + - SEC : + + SEC + + LDA !REG_MSU_FALLBACK_TABLE,X : ROL : STA !REG_MSU_FALLBACK_TABLE,X DEY : BPL .next_track @@ -269,7 +347,8 @@ msu_init: PLA .done PLP - RTL : + + RTL + + LDY.b #7 .next_track PLA : DEC @@ -295,7 +374,7 @@ msu_check_busy: JML spc_continue .ready LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BEQ .start - BRL alternate_fallback + JML spc_continue .start LDA !VAL_VOLUME_FULL STA !REG_TARGET_VOLUME @@ -303,7 +382,7 @@ msu_check_busy: STA !REG_MSU_VOLUME LDA !REG_MSU_DELAYED_COMMAND STA !REG_MSU_CONTROL - LDA #$00 + LDA.b #$00 STA !REG_MSU_DELAYED_COMMAND JML spc_continue @@ -352,32 +431,14 @@ command_f1: JML spc_continue load_track: - CPX !REG_CURRENT_MSU_TRACK : BNE .check_dungeon - CPX #$1B : BEQ .continue - JML spc_continue - -.check_dungeon - ; Convert dungeon tracks to dungeon-specific ones - CPX #$10 : BEQ .castle - CPX #$11 : BEQ .dungeon - CPX #$16 : BEQ .dungeon - CPX #$15 : BNE .continue -; boss - LDA $040C : LSR : !ADD #$2D - BRA .continue-1 -.castle - LDA $040C : CMP #$08 : BEQ .dungeon+3 : BRA .continue -.dungeon - LDA $040C : LSR : !ADD #$21 : TAX -.continue CPX !REG_CURRENT_MSU_TRACK : BNE + + - : CPX #27 : BEQ + JML spc_continue + - LDA #$00 : XBA + CPX !REG_CURRENT_COMMAND : BEQ - + LDA.b #$00 : XBA LDA !REG_MSU_PACK_CURRENT : BEQ + - - - - CMP !REG_MSU_PACK_COUNT : !BLT + + - : CMP !REG_MSU_PACK_COUNT : !BLT + !SUB !REG_MSU_PACK_COUNT : BRA - + @@ -393,42 +454,34 @@ load_track: STZ !REG_MSU_CONTROL PLX - LDA.l MSUTrackList,x - STA !REG_MSU_DELAYED_COMMAND STX !REG_CURRENT_MSU_TRACK - JML spc_continue + LDA MSUTrackList,X + STA !REG_MSU_DELAYED_COMMAND + LDA MSUExtendedFallbackList-1,X : CMP.b #35 : !BLT .done : CMP.b #47 : !BGE .done -alternate_fallback: - LDA !REG_CURRENT_MSU_TRACK : AND #$3F - CMP #$0F : BEQ .woods ; 15: dark woods - CMP #$23 : !BLT spc_fallback ; < 35: normal tracks - CMP #$2F : !BGE .boss ; > 46: boss-specific tracks - CMP #$25 : BEQ .castle ; 37: aga tower, fall back to hyrule castle - BRA .dungeon ; 35-46: dungeon-specific tracks - -.woods - LDA #$0D : BRA .fallback -.boss - LDA #$15 : BRA .fallback -.castle - LDA #$10 : BRA .fallback - -.dungeon PHB : REP #$10 LDX $040C LDA.b #Music_Eastern>>16 : PHA : PLB ; Set bank to music pointers LDY $00 : PHY - REP #$20 - LDA MSUDungeonFallbackList,X : STA $00 - SEP #$20 - LDA ($00) + REP #$20 + LDA MSUDungeonFallbackList,X : STA $00 + SEP #$20 + LDA ($00) PLY : STY $00 : SEP #$10 : PLB +.done + STA !REG_MUSIC_CONTROL + JML spc_continue + + +; No longer used, keeping as a reference for +; multi-pack fallback with the new lookup table +; Delete this once lookup fallback supports multi-pack .fallback STA !REG_CURRENT_MSU_TRACK TAX - LDA #$00 : XBA + LDA.b #$00 : XBA LDA !REG_MSU_PACK_CURRENT : BEQ + - @@ -447,16 +500,6 @@ alternate_fallback: SEP #$20 JML spc_continue -spc_fallback: - LDA #$00 - STA !REG_MSU_DELAYED_COMMAND - STZ !REG_MSU_CONTROL - STZ !REG_CURRENT_MSU_TRACK - STZ !REG_TARGET_VOLUME - STZ !REG_CURRENT_VOLUME - STZ !REG_MSU_VOLUME - JML spc_continue - pendant_fanfare: LDA TournamentSeed : BNE .spc REP #$20 @@ -471,6 +514,7 @@ pendant_fanfare: jml pendant_continue .spc SEP #$20 + - : LDA !REG_SPC_CONTROL : BEQ - ; Wait for the track to finish loading LDA !REG_SPC_CONTROL : BNE .continue .done jml pendant_done @@ -490,6 +534,7 @@ crystal_fanfare: jml crystal_continue .spc SEP #$20 + - : LDA !REG_SPC_CONTROL : BEQ - ; Wait for the track to finish loading LDA !REG_SPC_CONTROL : BNE .continue .done jml crystal_done @@ -505,5 +550,5 @@ ending_wait: LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_PLAYING : BNE .wait .done SEP #$20 - LDA #$22 + LDA.b #$22 RTL diff --git a/tables.asm b/tables.asm index c0d29dc..88dbec7 100644 --- a/tables.asm +++ b/tables.asm @@ -1601,9 +1601,19 @@ db $01,$03,$01,$03,$03,$03,$03,$03 db $03,$03,$03,$01,$03,$03,$03,$03 db $03,$03,$03,$03,$03,$01,$03,$03 db $03,$01,$01,$03,$03,$03,$03,$03 -db $03,$03,$03,$03,$03,$03,$03,$FF -db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +db $03,$03,$03,$03,$03,$03,$03,$03 +db $03,$03,$03,$03,$03,$03,$03,$03 +db $03,$03,$03,$03,$03,$00,$00,$00 + +MSUExtendedFallbackList: +db $01,$02,$03,$04,$05,$06,$07,$08 +db $09,$0A,$0B,$0C,$0D,$0E,$0F,$0D +db $11,$12,$13,$14,$15,$16,$17,$18 +db $19,$1A,$1B,$1C,$1D,$1E,$1F,$20 +db $21,$22,$11,$11,$10,$16,$16,$16 +db $16,$16,$11,$16,$16,$16,$15,$15 +db $15,$15,$15,$15,$15,$15,$15,$15 +db $15,$15,$16,$02,$09,$00,$00,$00 MSUDungeonFallbackList: dw $0000 ; Sewer Escape