From 9d9fb8a56352bd8f438a1c184b42f8f390c9cae4 Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Wed, 21 Aug 2019 20:56:08 -0700 Subject: [PATCH] Add runtime muting --- LTTP_RND_GeneralBugfixes.asm | 10 ++++ framehook.asm | 1 + hooks.asm | 8 +++ msu.asm | 96 +++++++++++++++++++++++++++++++----- tables.asm | 52 +++++++++++++++++-- 5 files changed, 150 insertions(+), 17 deletions(-) diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index e3a5337..fb83f9f 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -385,6 +385,11 @@ UseImplicitRegIndexedLongJumpTable: org $008333 Vram_EraseTilemaps_triforce: +org $008913 +Sound_LoadLightWorldSongBank: +org $00891D + .do_load + org $00893D EnableForceBlank: @@ -418,6 +423,11 @@ Mirror_InitHdmaSettings: org $01873A Dungeon_LoadRoom: +org $02821E +Module_PreDungeon: +org $028296 + .setAmbientSfx + org $02A0A8 Dungeon_SaveRoomData: diff --git a/framehook.asm b/framehook.asm index 1c1fd10..581b988 100644 --- a/framehook.asm +++ b/framehook.asm @@ -22,6 +22,7 @@ !LOCK_STATS = "$7EF443" FrameHookAction: JSL $0080B5 ; Module_MainRouting + JSL CheckMusicLoadRequest PHA : PHP ;LDA EnableSRAMTrace : AND.l TournamentSeedInverse : BEQ + ; LDA $1A : BNE ++ : JSL.l WriteStatusPreview : ++ ; write every 256 frames diff --git a/hooks.asm b/hooks.asm index 0084bb7..7e94098 100755 --- a/hooks.asm +++ b/hooks.asm @@ -1445,6 +1445,14 @@ crystal_continue: 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 + +org $008101 +dw !REG_MUSIC_CONTROL ;-------------------------------------------------------------------------------- ;================================================================================ diff --git a/msu.asm b/msu.asm index 6d155af..ecab94f 100644 --- a/msu.asm +++ b/msu.asm @@ -18,11 +18,11 @@ ; 8 - Dimensional Shift (Mirror) ; 9 - Dark Golden Land ; 10 - Unsealing the Master Sword -; 11 - Beginning of th Journey +; 11 - Beginning of the Journey ; 12 - Soldiers of Kakariko Village ; 13 - Black Mist ; 14 - Guessing Game House -; 15 - (Unused) +; 15 - Dark Woods ; 16 - Majestic Castle ; 17 - Lost Ancient Ruins ; 18 - Dank Dungeons @@ -117,19 +117,23 @@ !FLAG_MSU_STATUS_DATA_BUSY = #$80 +!REG_CURRENT_MSU_TRACK = $010B !REG_CURRENT_VOLUME = $0127 !REG_TARGET_VOLUME = $0129 -!REG_CURRENT_MSU_TRACK = $012B -!REG_MUSIC_CONTROL = $012C +!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 -!REG_MSU_DELAYED_COMMAND = $7F5047 -!REG_MSU_PACK_COUNT = $7F5048 -!REG_MSU_PACK_CURRENT = $7F5049 +; $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 @@ -141,8 +145,66 @@ !VAL_VOLUME_HALF = #$80 !VAL_VOLUME_FULL = #$FF +CheckMusicLoadRequest: + PHP : REP #$10 : PHA : PHX + LDA !REG_MUSIC_CONTROL_REQUEST : BEQ .done : BMI .done + + +; ; 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 + + ; TODO: actually look up the current track in the table + LDA !REG_MSU_FALLBACK_TABLE : BEQ .unmute + +.mute + LDA.b #SPCMutePayload : STA $00 + LDA.b #SPCMutePayload>>8 : STA $01 + LDA.b #SPCMutePayload>>16 + BRA .load + +.unmute + LDA.b #SPCUnmutePayload : STA $00 + LDA.b #SPCUnmutePayload>>8 : STA $01 + LDA.b #SPCUnmutePayload>>16 + +.load + JSL Sound_LoadLightWorldSongBank_do_load + + ; Re-enable NMI and joypad + LDA.b #$81 : STA $4200 + + LDA $10 + CMP #$07 : BEQ .sfx_indoors : CMP #$0E : BEQ .sfx_indoors + CMP #$09 : BNE .done + +.sfx_outdoors + SEP #$10 + ; PreOverworld_LoadProperties.noWarpVortex ; Bank02.asm:820 + LDX.b #$05 + LDA $7EF3C5 : CMP.b #$02 : BCS + + LDX.b #$01 : + + STX $012D + REP #$10 + +.done + LDA !REG_MUSIC_CONTROL_REQUEST : STA !REG_MUSIC_CONTROL : STZ !REG_MUSIC_CONTROL_REQUEST + PLX : PLA : PLP + RTL + +.sfx_indoors + LDA !REG_MUSIC_CONTROL_REQUEST : STA !REG_MUSIC_CONTROL : STZ !REG_MUSIC_CONTROL_REQUEST + PLX : PLA : PLP + JML Module_PreDungeon_setAmbientSfx + msu_init: - REP #$20 : SEP #$10 + PHP : REP #$20 LDA #$0000 STA !REG_MSU_VOLUME STA !REG_MSU_PACK_COUNT @@ -155,7 +217,7 @@ msu_init: LDX.b #$FF LDY.b #$01 SEP #$20 -.check +.check_pack TYA REP #$20 STA !REG_MSU_TRACK @@ -163,11 +225,12 @@ msu_init: INX SEP #$20 TAY -.wait - LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_BUSY : BNE .wait - LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BEQ .check +.wait_pack + LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_BUSY : BNE .wait_pack + LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BEQ .check_pack TXA : STA !REG_MSU_PACK_COUNT .done + PLP RTL msu_main: @@ -250,17 +313,24 @@ 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 + + JML spc_continue + + LDA #$00 : XBA LDA !REG_MSU_PACK_CURRENT : BEQ + diff --git a/tables.asm b/tables.asm index dfb51e7..c0d29dc 100644 --- a/tables.asm +++ b/tables.asm @@ -960,7 +960,11 @@ org $308215 ; PC 0x180215 SeedHash: db $00, $01, $02, $03, $04 ;-------------------------------------------------------------------------------- -; 0x18021A - 0x18021F (unused) +org $30821A ; PC 0x18021A +NoBGM: +db $00 ; $00 = BGM enabled (default) $01 = BGM disabled +;-------------------------------------------------------------------------------- +; 0x18021B - 0x18021F (unused) ;================================================================================ ; $308220 (0x180220) - $30823F (0x18023F) ; Plandomizer Author Name (ASCII) - Leave unused chars as 0 @@ -1438,9 +1442,6 @@ dw #9999 ; Rupee Limit ; $7F5042 - Tile Upload Offset Override (Low) ; $7F5043 - Tile Upload Offset Override (High) ; $7F5044 - $7F5046 - NMI Auxiliary Function -; $7F5047 - MSU-1 Delayed Load Command -; $7F5048 - MSU-1 Pack Count -; $7F5049 - MSU-1 Current Pack ; $7F5047 - $7F504F - Unused ; $7F5050 - $7F506F - Shop Block ; $7F5070 - Reserved for OneMind @@ -1621,6 +1622,49 @@ dw Music_TRock dw Music_GTower dw $0000 dw $0000 + +SPCMutePayload: +dw $0001 ; Transfer size +dw $0A4A ; Transfer destination +db $00 ; mov a,#$70 -> mov a,#$00 + +dw $0001 ; Transfer size +dw $0AF3 ; Transfer destination +db $00 ; mov $059,#$c0 -> mov $059,#$00 + +dw $0002 ; Transfer size +dw $0C32 ; Transfer destination +db $00, $00 ; movw $058,ya -> nop #2 + +dw $0001 ; Transfer size +dw $0D19 ; Transfer destination +db $34 ; movw $058,ya -> mov $058,a + +dw $0000 ; Transfer size (end of transfer) +dw $FFFF ; Dummy destination +db $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Padding + +SPCUnmutePayload: +dw $0001 ; Transfer size +dw $0A4A ; Transfer destination +db $70 ; mov a,#$70 + +dw $0001 ; Transfer size +dw $0AF3 ; Transfer destination +db $C0 ; mov $059,#$c0 + +dw $0002 ; Transfer size +dw $0C32 ; Transfer destination +db $da, $58 ; movw $058,ya + +dw $0001 ; Transfer size +dw $0D19 ; Transfer destination +db $34 ; movw $058,ya + +dw $0000 ; Transfer size (end of transfer) +dw $FFFF ; Dummy destination +db $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Padding + ;-------------------------------------------------------------------------------- ; 0x185060 - 1850FF (unused) ;--------------------------------------------------------------------------------