From 34bb99b7d0235bef8b4605ecf6e3c734be81c954 Mon Sep 17 00:00:00 2001 From: Bonta <40473493+Bonta0@users.noreply.github.com> Date: Sat, 12 Jun 2021 15:22:27 +0200 Subject: [PATCH 1/6] MSU1: Resume overworld tracks --- LTTP_RND_GeneralBugfixes.asm | 7 ++- msu.asm | 89 ++++++++++++++++++++++++++++++++++-- tables.asm | 8 +++- 3 files changed, 98 insertions(+), 6 deletions(-) diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index 6c3cb05..f2a6e53 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -81,7 +81,12 @@ db #$20, #$19, #$08, #$31 ; year/month/day !REG_MSU_PACK_COUNT = $7F50AA !REG_MSU_PACK_CURRENT = $7F50AB !REG_MSU_PACK_REQUEST = $7F50AC -!REG_SPC_LOADING = $7F50AD +!REG_MSU_LOADED_TRACK = $7F50AD ; 2 bytes +!REG_SPC_LOADING = $7F50AF +!MSU_LOADED_TRACK = $7F5400 +!MSU_RESUME_TRACK = $7F5401 +!MSU_RESUME_TIME = $7F5402 ; 4 bytes +!MSU_RESUME_CANCEL = $7F5406 !REG_MUSIC_CONTROL = $012B ;!REG_MUSIC_CONTROL = $012C !REG_MUSIC_CONTROL_REQUEST = $012C diff --git a/msu.asm b/msu.asm index cd21a0a..a0853b9 100644 --- a/msu.asm +++ b/msu.asm @@ -116,6 +116,7 @@ !FLAG_MSU_PLAY = #$01 !FLAG_MSU_REPEAT = #$02 +!FLAG_MSU_RESUME = #$04 !FLAG_MSU_STATUS_TRACK_MISSING = #$08 !FLAG_MSU_STATUS_AUDIO_PLAYING = #$10 !FLAG_MSU_STATUS_AUDIO_REPEATING = #$20 @@ -145,6 +146,25 @@ !VAL_VOLUME_HALF = #$80 !VAL_VOLUME_FULL = #$FF +;================================================================================ +; Check if A has an overworld track +;-------------------------------------------------------------------------------- +IsOverworldTrack: + CMP #02 : BEQ .yes ; 2 - Hyrule Field + CMP #03 : BEQ .yes ; 3 - Time of Falling Rain + CMP #04 : BEQ .yes ; 4 - The Silly Pink Rabbit + CMP #05 : BEQ .yes ; 5 - Forest of Mystery + CMP #07 : BEQ .yes ; 7 - Kakariko Village + CMP #09 : BEQ .yes ; 9 - Dark Golden Land + CMP #15 : BEQ .yes ; 15 - Dark Woods + CMP #60 : BEQ .yes ; 60 - Light World OW (after ped pull) + CMP #61 : BEQ .yes ; 61 - Dark World OW (with all crystals) + .no + CLC : RTS +.yes +SEC : RTS +;-------------------------------------------------------------------------------- + ;================================================================================ ; Extended OST/SPC fallback, decide which track to actually play ;-------------------------------------------------------------------------------- @@ -402,6 +422,12 @@ StoreMusicOnDeath: MSUInit: PHP + LDA #$00 + STA !MSU_LOADED_TRACK + STA !MSU_RESUME_TRACK + STA !MSU_RESUME_TIME : STA !MSU_RESUME_TIME+1 : STA !MSU_RESUME_TIME+2 : STA !MSU_RESUME_TIME+3 + STA !MSU_RESUME_CANCEL + LDA NoBGM : BNE .done REP #$20 @@ -465,6 +491,41 @@ MSUInit: ;-------------------------------------------------------------------------------- +;================================================================================ +; Stop MSU-1 audio track and save the current position when approriate +;-------------------------------------------------------------------------------- +MSUStopPlaying: +PHA : XBA : PHA + LDA !MSU_LOADED_TRACK + JSR IsOverworldTrack : BCC + ; dont save if this isnt an overworld track + ; dont save if we already saved recently + REP #$20 + LDA !MSU_RESUME_TRACK : AND #$00FF : BEQ ++ + LDA !NMI_COUNTER : !SUB !MSU_RESUME_TIME : PHA + LDA !NMI_COUNTER+2 : SBC !MSU_RESUME_TIME+2 : BNE +++ + PLA : CMP MSUResumeDelay : !BLT .too_early + BRA ++ + +++ + PLA + ++ + ; saving + LDA !NMI_COUNTER : STA !MSU_RESUME_TIME + LDA !NMI_COUNTER+2 : STA !MSU_RESUME_TIME+2 + SEP #$20 + + LDA !MSU_LOADED_TRACK : STA !MSU_RESUME_TRACK + LDA #$00 : STA !MSU_LOADED_TRACK ; dont take this path if we're calling again + LDA !FLAG_MSU_RESUME : STA !REG_MSU_CONTROL ; save this track's position + PLA : XBA : PLA + RTS + .too_early + SEP #$20 + + + LDA #$00 : STA !REG_MSU_CONTROL +PLA : XBA : PLA +RTS +;-------------------------------------------------------------------------------- + ;================================================================================ ; Play MSU-1 audio track ;-------------------------------------------------------------------------------- @@ -492,6 +553,11 @@ MSUMain: LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BEQ .start JML SPCContinue .start + LDA !MSU_RESUME_CANCEL : BEQ + + REP #$20 : LDA !REG_MSU_LOADED_TRACK : STA !REG_MSU_TRACK : SEP #$20 + LDA #$00 : STA !MSU_RESUME_CANCEL + JML SPCContinue + + LDA !VAL_VOLUME_FULL STA !REG_TARGET_VOLUME STA !REG_CURRENT_VOLUME @@ -522,7 +588,7 @@ MSUMain: LDA !REG_TARGET_VOLUME : BRA .set .mute STZ !REG_CURRENT_VOLUME - STZ !REG_MSU_CONTROL + JSR MSUStopPlaying BRA .set .increment ADC !VAL_VOLUME_INCREMENT : BCS .max @@ -568,7 +634,7 @@ MSUMain: CPX !REG_CURRENT_MSU_TRACK : BNE + - : CPX #27 : BEQ + TXA - BRA .done+1 + JMP .done+1 + CPX !REG_CURRENT_COMMAND : BEQ - LDA.b #$00 : XBA @@ -577,6 +643,8 @@ MSUMain: !SUB !REG_MSU_PACK_COUNT : BRA - + + JSR MSUStopPlaying + PHX : PHA : TXA : PLX REP #$20 BEQ + @@ -585,10 +653,25 @@ MSUMain: DEX : BNE - + STA !REG_MSU_TRACK + STA !REG_MSU_LOADED_TRACK SEP #$20 - STZ !REG_MSU_CONTROL PLX + TXA : CMP !MSU_RESUME_TRACK : BNE + ; dont resume if too late + REP #$20 + LDA !NMI_COUNTER : !SUB !MSU_RESUME_TIME : PHA + LDA !NMI_COUNTER+2 : SBC !MSU_RESUME_TIME+2 : BNE ++ + PLA : CMP MSUResumeDelay : !BGE +++ + SEP #$20 : BRA .done_resume + ++ + PLA + +++ + SEP #$20 + LDA #$01 : STA !MSU_RESUME_CANCEL + .done_resume: + LDA #$00 : STA !MSU_RESUME_TRACK + + + TXA : STA !MSU_LOADED_TRACK STX !REG_CURRENT_MSU_TRACK LDA !REG_MSU_PACK_CURRENT : CMP #$FE : !BLT + LDA #$00 : BRA ++ diff --git a/tables.asm b/tables.asm index 386cc6c..26f3c75 100644 --- a/tables.asm +++ b/tables.asm @@ -992,8 +992,11 @@ db $00 ; $00 = BGM enabled (default) $01 = BGM disabled org $30821B ; PC 0x18021B FastFanfare: db $00 ; $00 = Normal fanfare (default) $01 = Fast fanfare +org $30821C ; PC 0x18021C +MSUResumeDelay: +dw $0708 ; Number of frames on a different track until we no longer resume (0x708 = 1800 = ~30s) ;-------------------------------------------------------------------------------- -; 0x18021C - 0x18021F (unused) +; 0x18021E - 0x18021F (unused) ;================================================================================ ; $308220 (0x180220) - $30823F (0x18023F) ; Plandomizer Author Name (ASCII) - Leave unused chars as 0 @@ -1522,8 +1525,9 @@ dw #9999 ; Rupee Limit ; $7F5100 - $7F51FF - Block Cypher Buffer ; $7F5200 - $7F52FF - RNG Pointer Block ; $7F5300 - $7F53FF - Multiworld Block +; $7F5400 - $7F540F - MSU Block -; $7F5400 - $7F56FF - Unused +; $7F5410 - $7F56FF - Unused ; $7F5700 - $7F57FF - Dialog Buffer ; From ce7396ae350049404b53e051fe5ca522b68018f6 Mon Sep 17 00:00:00 2001 From: Bonta <40473493+Bonta0@users.noreply.github.com> Date: Sat, 12 Jun 2021 19:09:24 +0200 Subject: [PATCH 2/6] MSU1: Allow resuming any track --- msu.asm | 21 ++++++++++++++++++--- tables.asm | 7 +++++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/msu.asm b/msu.asm index a0853b9..f7fc19c 100644 --- a/msu.asm +++ b/msu.asm @@ -165,6 +165,21 @@ IsOverworldTrack: SEC : RTS ;-------------------------------------------------------------------------------- +;================================================================================ +; Check if the track in A should be resumed +;-------------------------------------------------------------------------------- +IsResumableTrack: + PHA + LDA MSUResumeType : BEQ + + PLA + JSR IsOverworldTrack + RTS + + + PLA + SEC +RTS +;-------------------------------------------------------------------------------- + ;================================================================================ ; Extended OST/SPC fallback, decide which track to actually play ;-------------------------------------------------------------------------------- @@ -497,13 +512,13 @@ MSUInit: MSUStopPlaying: PHA : XBA : PHA LDA !MSU_LOADED_TRACK - JSR IsOverworldTrack : BCC + ; dont save if this isnt an overworld track + JSR IsResumableTrack : BCC + ; dont save if we already saved recently REP #$20 LDA !MSU_RESUME_TRACK : AND #$00FF : BEQ ++ LDA !NMI_COUNTER : !SUB !MSU_RESUME_TIME : PHA LDA !NMI_COUNTER+2 : SBC !MSU_RESUME_TIME+2 : BNE +++ - PLA : CMP MSUResumeDelay : !BLT .too_early + PLA : CMP MSUResumeTimer : !BLT .too_early BRA ++ +++ PLA @@ -661,7 +676,7 @@ MSUMain: REP #$20 LDA !NMI_COUNTER : !SUB !MSU_RESUME_TIME : PHA LDA !NMI_COUNTER+2 : SBC !MSU_RESUME_TIME+2 : BNE ++ - PLA : CMP MSUResumeDelay : !BGE +++ + PLA : CMP MSUResumeTimer : !BGE +++ SEP #$20 : BRA .done_resume ++ PLA diff --git a/tables.asm b/tables.asm index 26f3c75..8095852 100644 --- a/tables.asm +++ b/tables.asm @@ -993,10 +993,13 @@ org $30821B ; PC 0x18021B FastFanfare: db $00 ; $00 = Normal fanfare (default) $01 = Fast fanfare org $30821C ; PC 0x18021C -MSUResumeDelay: +MSUResumeType: +db $01 ; Type of tracks to resume #$00 = Everything - #$01 = Overworld (default) +org $30821D ; PC 0x18021D +MSUResumeTimer: dw $0708 ; Number of frames on a different track until we no longer resume (0x708 = 1800 = ~30s) ;-------------------------------------------------------------------------------- -; 0x18021E - 0x18021F (unused) +; 0x18021F - 0x18021F (unused) ;================================================================================ ; $308220 (0x180220) - $30823F (0x18023F) ; Plandomizer Author Name (ASCII) - Leave unused chars as 0 From 3f86caf08356b3a196285d0a9081cebafbefaf2f Mon Sep 17 00:00:00 2001 From: Bonta <40473493+Bonta0@users.noreply.github.com> Date: Sat, 12 Jun 2021 21:16:30 +0200 Subject: [PATCH 3/6] MSU1: Move msu.asm to bank A4 --- LTTP_RND_GeneralBugfixes.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index f2a6e53..695604c 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -135,7 +135,6 @@ incsrc swordswap.asm incsrc stats.asm incsrc scratchpad.asm incsrc map.asm -incsrc msu.asm incsrc dialog.asm incsrc entrances.asm incsrc clock.asm @@ -203,6 +202,7 @@ incsrc elder.asm incsrc toast.asm incsrc darkroomitems.asm incsrc fastcredits.asm +incsrc msu.asm warnpc $A58000 ;org $228000 ; contrib area From a9a929c6f4fb99e99d2cd635dfb71e5d7c5c5926 Mon Sep 17 00:00:00 2001 From: Bonta <40473493+Bonta0@users.noreply.github.com> Date: Sat, 12 Jun 2021 22:35:07 +0200 Subject: [PATCH 4/6] MSU1: Dont resume track from Link's house --- msu.asm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/msu.asm b/msu.asm index f7fc19c..51e05cb 100644 --- a/msu.asm +++ b/msu.asm @@ -686,7 +686,15 @@ MSUMain: .done_resume: LDA #$00 : STA !MSU_RESUME_TRACK + - TXA : STA !MSU_LOADED_TRACK + CPX #07 : BNE + ; Kakariko Village + LDA $10 : CMP #$07 : BNE + + ; we're in link's house -> ignore + LDA #$00 + BRA ++ + + + TXA + ++ + STA !MSU_LOADED_TRACK STX !REG_CURRENT_MSU_TRACK LDA !REG_MSU_PACK_CURRENT : CMP #$FE : !BLT + LDA #$00 : BRA ++ From 183d439ff7710c8f629102d13a8390814e2727cf Mon Sep 17 00:00:00 2001 From: Bonta <40473493+Bonta0@users.noreply.github.com> Date: Sat, 12 Jun 2021 23:47:46 +0200 Subject: [PATCH 5/6] MSU1: Fade in on resume --- LTTP_RND_GeneralBugfixes.asm | 2 +- msu.asm | 25 +++++++++++++++++++------ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index 695604c..ff6eac4 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -86,7 +86,7 @@ db #$20, #$19, #$08, #$31 ; year/month/day !MSU_LOADED_TRACK = $7F5400 !MSU_RESUME_TRACK = $7F5401 !MSU_RESUME_TIME = $7F5402 ; 4 bytes -!MSU_RESUME_CANCEL = $7F5406 +!MSU_RESUME_CONTROL = $7F5406 !REG_MUSIC_CONTROL = $012B ;!REG_MUSIC_CONTROL = $012C !REG_MUSIC_CONTROL_REQUEST = $012C diff --git a/msu.asm b/msu.asm index 51e05cb..f004751 100644 --- a/msu.asm +++ b/msu.asm @@ -123,6 +123,8 @@ !FLAG_MSU_STATUS_AUDIO_BUSY = #$40 !FLAG_MSU_STATUS_DATA_BUSY = #$80 +!FLAG_RESUME_CANCEL = #$01 +!FLAG_RESUME_FADEIN = #$02 !REG_CURRENT_MSU_TRACK = $010B !REG_CURRENT_VOLUME = $0127 @@ -441,7 +443,7 @@ MSUInit: STA !MSU_LOADED_TRACK STA !MSU_RESUME_TRACK STA !MSU_RESUME_TIME : STA !MSU_RESUME_TIME+1 : STA !MSU_RESUME_TIME+2 : STA !MSU_RESUME_TIME+3 - STA !MSU_RESUME_CANCEL + STA !MSU_RESUME_CONTROL LDA NoBGM : BNE .done @@ -559,7 +561,7 @@ MSUMain: LDX !REG_MUSIC_CONTROL : BEQ + JMP .command_ff + - LDA !REG_MSU_DELAYED_COMMAND : BEQ .do_fade + LDA !REG_MSU_DELAYED_COMMAND : BNE + : JMP .do_fade : + .check_busy LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_BUSY : BEQ .ready @@ -568,15 +570,24 @@ MSUMain: LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BEQ .start JML SPCContinue .start - LDA !MSU_RESUME_CANCEL : BEQ + + LDA !MSU_RESUME_CONTROL : AND !FLAG_RESUME_CANCEL : BEQ + REP #$20 : LDA !REG_MSU_LOADED_TRACK : STA !REG_MSU_TRACK : SEP #$20 - LDA #$00 : STA !MSU_RESUME_CANCEL + LDA !MSU_RESUME_CONTROL : EOR !FLAG_RESUME_CANCEL : STA !MSU_RESUME_CONTROL JML SPCContinue + LDA !VAL_VOLUME_FULL STA !REG_TARGET_VOLUME + + LDA !MSU_RESUME_CONTROL : AND !FLAG_RESUME_FADEIN : BEQ + + LDA !MSU_RESUME_CONTROL : EOR !FLAG_RESUME_FADEIN : STA !MSU_RESUME_CONTROL + LDA #$00 + BRA ++ + + + LDA !VAL_VOLUME_FULL + ++ STA !REG_CURRENT_VOLUME STA !REG_MSU_VOLUME + LDA !REG_CURRENT_MSU_TRACK : DEC : PHA AND.b #$07 : TAY PLA : LSR #3 : TAX @@ -677,13 +688,15 @@ MSUMain: LDA !NMI_COUNTER : !SUB !MSU_RESUME_TIME : PHA LDA !NMI_COUNTER+2 : SBC !MSU_RESUME_TIME+2 : BNE ++ PLA : CMP MSUResumeTimer : !BGE +++ - SEP #$20 : BRA .done_resume + SEP #$20 + LDA !FLAG_RESUME_FADEIN : BRA .done_resume ++ PLA +++ SEP #$20 - LDA #$01 : STA !MSU_RESUME_CANCEL + LDA !FLAG_RESUME_CANCEL .done_resume: + STA !MSU_RESUME_CONTROL LDA #$00 : STA !MSU_RESUME_TRACK + CPX #07 : BNE + ; Kakariko Village From 14844400b3738b4fa28d125d44573e8aff1434c4 Mon Sep 17 00:00:00 2001 From: Bonta <40473493+Bonta0@users.noreply.github.com> Date: Sun, 13 Jun 2021 00:38:00 +0200 Subject: [PATCH 6/6] MSU1: Minor tweaks to avoid a long jump in main path --- msu.asm | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/msu.asm b/msu.asm index f004751..e239b52 100644 --- a/msu.asm +++ b/msu.asm @@ -553,6 +553,7 @@ MSUMain: LDA !REG_MSU_ID_01 : CMP !VAL_MSU_ID_01 : BEQ .continue .nomsu SEP #$30 + - JML SPCContinue .continue LDA !REG_MSU_ID_23 : CMP !VAL_MSU_ID_23 : BNE .nomsu @@ -561,25 +562,23 @@ MSUMain: LDX !REG_MUSIC_CONTROL : BEQ + JMP .command_ff + - LDA !REG_MSU_DELAYED_COMMAND : BNE + : JMP .do_fade : + + LDA !REG_MSU_DELAYED_COMMAND : BEQ .do_fade .check_busy - LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_BUSY : BEQ .ready - JML SPCContinue + LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_BUSY : BNE - .ready - LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BEQ .start - JML SPCContinue + LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BNE - .start - LDA !MSU_RESUME_CONTROL : AND !FLAG_RESUME_CANCEL : BEQ + + LDA !MSU_RESUME_CONTROL : BIT !FLAG_RESUME_CANCEL : BEQ + + EOR !FLAG_RESUME_CANCEL : STA !MSU_RESUME_CONTROL REP #$20 : LDA !REG_MSU_LOADED_TRACK : STA !REG_MSU_TRACK : SEP #$20 - LDA !MSU_RESUME_CONTROL : EOR !FLAG_RESUME_CANCEL : STA !MSU_RESUME_CONTROL - JML SPCContinue + BRA - + LDA !VAL_VOLUME_FULL STA !REG_TARGET_VOLUME - LDA !MSU_RESUME_CONTROL : AND !FLAG_RESUME_FADEIN : BEQ + - LDA !MSU_RESUME_CONTROL : EOR !FLAG_RESUME_FADEIN : STA !MSU_RESUME_CONTROL + LDA !MSU_RESUME_CONTROL : BIT !FLAG_RESUME_FADEIN : BEQ + + EOR !FLAG_RESUME_FADEIN : STA !MSU_RESUME_CONTROL LDA #$00 BRA ++ +