From a1e34c280a19a38bf8a1925caf417c1cbb4676e5 Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Wed, 28 Nov 2018 16:20:26 -0800 Subject: [PATCH 01/10] Add dungeon-specific music --- msu.asm | 129 ++++++++++++++++++++++++++++++++++++++++++++++++----- tables.asm | 26 +++++++++-- 2 files changed, 140 insertions(+), 15 deletions(-) diff --git a/msu.asm b/msu.asm index a25e112..96bf6b4 100644 --- a/msu.asm +++ b/msu.asm @@ -6,7 +6,72 @@ ; ; Author: qwertymodo ; -; Free space used: 0x77DDD-0x77F8A +; Track List: +; +; 1 - Title ~ Link to the Past +; 2 - Hyrule Field +; 3 - Time of Falling Rain +; 4 - The Silly Pink Rabbit +; 5 - Forest of Mystery +; 6 - Seal of Seven Maidens +; 7 - Kakariko Village +; 8 - Dimensional Shift (Mirror) +; 9 - Dark Golden Land +; 10 - Unsealing the Master Sword +; 11 - Beginning of th Journey +; 12 - Soldiers of Kakariko Village +; 13 - Black Mist +; 14 - Guessing Game House +; 15 - (Unused) +; 16 - Majestic Castle +; 17 - Lost Ancient Ruins +; 18 - Dank Dungeons +; 19 - Great Victory! +; 20 - Safety in the Sanctuary +; 21 - Anger of the Guardians +; 22 - Dungeon of Shadows +; 23 - Fortune Teller +; 24 - Dank Dungeons (Copy) +; 25 - Princess Zelda's Rescue +; 26 - Meeting the Maidens +; 27 - The Goddess Appears +; 28 - Priest of the Dark Order +; 29 - Release of Ganon +; 30 - Ganon's Message +; 31 - The Prince of Darkness +; 32 - Power of the Gods +; 33 - Epilogue ~ Beautiful Hyrule +; 34 - Staff Roll +; +; Dungeon-specific tracks +; +; 35 - Eastern Palace +; 36 - Desert Palace +; 37 - Agahnim's Tower +; 38 - Swamp Palace +; 39 - Palace of Darkness +; 40 - Misery Mire +; 41 - Skull Woods +; 42 - Ice Palace +; 43 - Tower of Hera +; 44 - Thieves' Town +; 45 - Turtle Rock +; 46 - Ganon's Tower +; +; Bosses +; +; 47 - Eastern Palace +; 48 - Desert Palace +; 49 - Agahnim's Tower +; 50 - Swamp Palace +; 51 - Palace of Darkness +; 52 - Misery Mire +; 53 - Skull Woods +; 54 - Ice Palace +; 55 - Tower of Hera +; 56 - Thieves' Town +; 57 - Turtle Rock +; 58 - Ganon's Tower ; ;======================================= @@ -93,7 +158,9 @@ msu_check_busy: LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_BUSY : BEQ .ready JML spc_continue .ready - LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BNE spc_fallback + LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BEQ .start + BRL dungeon_fallback +.start LDA !VAL_VOLUME_FULL STA !REG_TARGET_VOLUME STA !REG_CURRENT_VOLUME @@ -104,14 +171,6 @@ msu_check_busy: STA !REG_MSU_LOAD_FLAG JML spc_continue -spc_fallback: - STZ !REG_MSU_CONTROL - STZ !REG_CURRENT_MSU_TRACK - STZ !REG_TARGET_VOLUME - STZ !REG_CURRENT_VOLUME - STZ !REG_MSU_VOLUME - JML spc_continue - do_fade: LDA !REG_CURRENT_VOLUME : CMP !REG_TARGET_VOLUME : BNE .continue JML spc_continue @@ -157,9 +216,19 @@ command_f1: JML spc_continue load_track: - CPX !REG_CURRENT_MSU_TRACK : BNE .continue + CPX !REG_CURRENT_MSU_TRACK : BNE .check_dungeon CPX #$1B : BEQ .continue JML spc_continue +.check_dungeon + CPX #$11 : BEQ .dungeon + CPX #$16 : BEQ .dungeon + CPX #$15 : BNE .continue +; boss + LDA $040C : LSR : !ADD #$2D + BRA .continue-1 + +.dungeon + LDA $040C : LSR : !ADD #$21 : TAX .continue STX !REG_MSU_TRACK_LO STZ !REG_MSU_TRACK_HI @@ -169,6 +238,44 @@ load_track: STX !REG_CURRENT_MSU_TRACK JML spc_continue +dungeon_fallback: + LDA !REG_CURRENT_MSU_TRACK : AND #$3F + 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 + +.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) + PLY : STY $00 : PLB + +.fallback + STA !REG_CURRENT_MSU_TRACK + STA !REG_MSU_TRACK_LO + STZ !REG_MSU_TRACK_HI + JML spc_continue + +spc_fallback: + 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 diff --git a/tables.asm b/tables.asm index b8f1f65..de4e254 100644 --- a/tables.asm +++ b/tables.asm @@ -1586,18 +1586,36 @@ LowHeartFix: db $08, $08, $10 ;================================================================================ -org $30D000 ; PC 0x185000 - 0x18503F +org $30D000 ; PC 0x185000 - 0x18505F MSUTrackList: db $00,$01,$03,$03,$03,$03,$03,$03 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,$FF,$FF,$FF,$FF,$FF -db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +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 + +MSUDungeonFallbackList: +dw $0000 ; Sewer Escape +dw $0000 ; Hyrule Castle +dw Music_Eastern +dw Music_Desert +dw $0000 ; Agahnim's Tower +dw Music_Swamp +dw Music_Darkness +dw Music_Mire +dw Music_Skull +dw Music_Ice +dw Music_Hera +dw Music_Thieves +dw Music_TRock +dw Music_GTower +dw $0000 +dw $0000 ;-------------------------------------------------------------------------------- -; 0x185040 - 1850FF (unused) +; 0x185060 - 1850FF (unused) ;-------------------------------------------------------------------------------- org $30D100 ; PC 0x185100 - 0x18513F UnusedTable: ; please do not move this - kkat From 80bc5692796cbd290df70c58414517b248c48442 Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Wed, 28 Nov 2018 16:37:27 -0800 Subject: [PATCH 02/10] Fix inverted bunny music --- hooks.asm | 3 ++ music.asm | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 88 insertions(+), 1 deletion(-) diff --git a/hooks.asm b/hooks.asm index 31885a4..ac7149f 100755 --- a/hooks.asm +++ b/hooks.asm @@ -2213,6 +2213,9 @@ PreOverworld_LoadProperties_SetSong: org $05CC58 ; <- Bank05.asm:1307 (LDA $040A : CMP.b #$18) JSL PsychoSolder_MusicCheck NOP #1 +;-------------------------------------------------------------------------------- +org $02B13A ; <- Bank02.asm:7647 +dl Overworld_FinishMirrorWarp ;================================================================================ ;================================================================================ diff --git a/music.asm b/music.asm index 0727996..3194d78 100644 --- a/music.asm +++ b/music.asm @@ -52,7 +52,7 @@ PreOverworld_LoadProperties_ChooseMusic: .endOfLightWorldChecks ; if we are in the light world go ahead and set chosen selection - LDA $7EF3CA : BEQ .lastCheck + LDA $7EF3CA : BEQ .checkInverted+4 LDX.b #$0D ; dark woods theme @@ -62,6 +62,10 @@ PreOverworld_LoadProperties_ChooseMusic: LDX.b #$09 ; dark overworld theme + + ; if not inverted and light world, or inverted and dark world, skip moon pearl check + .checkInverted + LDA $7EF3CA : CLC : ROL #$03 : CMP InvertedMode : BEQ .lastCheck + ; Does Link have a moon pearl? LDA $7EF357 : BNE + LDX.b #$04 ; bunny theme @@ -79,6 +83,86 @@ PreOverworld_LoadProperties_ChooseMusic: JML.l PreOverworld_LoadProperties_SetSong ;-------------------------------------------------------------------------------- +;-------------------------------------------------------------------------------- +Overworld_FinishMirrorWarp: + REP #$20 + + LDA.w #$2641 : STA $4370 + + LDX.b #$3E + + LDA.w #$FF00 + +.clear_hdma_table + + STA $1B00, X : STA $1B40, X + STA $1B80, X : STA $1BC0, X + STA $1C00, X : STA $1C40, X + STA $1C80, X + + DEX #2 : BPL .clear_hdma_table + + LDA.w #$0000 : STA $7EC007 : STA $7EC009 + + SEP #$20 + + JSL $00D7C8 ; $57C8 IN ROM + + LDA.b #$80 : STA $9B + + LDX.b #$04 ; bunny theme + + ; if not inverted and light world, or inverted and dark world, skip moon pearl check + LDA $7EF3CA : CLC : ROL #$03 : CMP InvertedMode : BEQ + + LDA $7EF357 : BEQ .endOfLightWorldChecks + + + + LDX.b #$09 ; default dark world theme + + LDA $8A : CMP.b #$40 : !BGE .endOfLightWorldChecks + + LDX.b #$02 ; hyrule field theme + + ; Check if we're entering the village + CMP.b #$18 : BNE .endOfLightWorldChecks + + ; Check what phase we're in + LDA $7EF3C5 : CMP.b #$03 : !BGE .endOfLightWorldChecks + LDX.b #$07 ; Default village theme (phase <3) + +.endOfLightWorldChecks + STX $012C + + LDA $8A : CMP.b #$40 : BEQ .darkWoods + + CMP.b #$43 : BEQ .darkMountain + CMP.b #$45 : BEQ .darkMountain + CMP.b #$47 : BNE .notDarkMountain + +.darkMountain + LDA #$09 : STA $012D ; set storm ambient SFX + +.darkWoods + LDX.b #$0D ; dark mountain/woods theme + + LDA $7EF357 : ORA InvertedMode : BNE + + LDA #$04 ; bunny theme + + + + STX $012C + +.notDarkMountain + + LDA $11 : STA $010C + + STZ $11 + STZ $B0 + STZ $0200 + STZ $0710 + + RTL +;-------------------------------------------------------------------------------- + ;-------------------------------------------------------------------------------- ;0 = Is Kakariko Overworld ;1 = Not Kakariko Overworld From bf49cde0eaed6110b963180112f86a4ad5e2fc5f Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Wed, 28 Nov 2018 16:41:48 -0800 Subject: [PATCH 03/10] Change dark woods to track 15 --- msu.asm | 8 +++++--- music.asm | 22 ++++++++++++++-------- tables.asm | 4 ++++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/msu.asm b/msu.asm index 96bf6b4..4cc8947 100644 --- a/msu.asm +++ b/msu.asm @@ -159,7 +159,7 @@ msu_check_busy: JML spc_continue .ready LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BEQ .start - BRL dungeon_fallback + BRL alternate_fallback .start LDA !VAL_VOLUME_FULL STA !REG_TARGET_VOLUME @@ -238,16 +238,18 @@ load_track: STX !REG_CURRENT_MSU_TRACK JML spc_continue -dungeon_fallback: +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 diff --git a/music.asm b/music.asm index 3194d78..1e1290d 100644 --- a/music.asm +++ b/music.asm @@ -54,11 +54,15 @@ PreOverworld_LoadProperties_ChooseMusic: ; if we are in the light world go ahead and set chosen selection LDA $7EF3CA : BEQ .checkInverted+4 - LDX.b #$0D ; dark woods theme + LDX.b #$0F ; dark woods theme - ; This music is used in dark woods, and dark death mountain + ; This music is used in dark woods LDA $8A - CMP.b #$40 : BEQ + : CMP.b #$43 : BEQ + : CMP.b #$45 : BEQ + : CMP.b #$47 : BEQ + + CMP.b #$40 : BEQ + + LDX.b #$0D ; dark death mountain theme + + ; This music is used in dark death mountain + CMP.b #$43 : BEQ + : CMP.b #$45 : BEQ + : CMP.b #$47 : BEQ + LDX.b #$09 ; dark overworld theme + @@ -133,18 +137,20 @@ Overworld_FinishMirrorWarp: .endOfLightWorldChecks STX $012C - LDA $8A : CMP.b #$40 : BEQ .darkWoods + LDA $8A : CMP.b #$40 : BNE + + LDX #$0F ; dark woods theme + BRA .bunny + + CMP.b #$43 : BEQ .darkMountain CMP.b #$45 : BEQ .darkMountain CMP.b #$47 : BNE .notDarkMountain .darkMountain - LDA #$09 : STA $012D ; set storm ambient SFX - -.darkWoods - LDX.b #$0D ; dark mountain/woods theme + LDA.b #$09 : STA $012D ; set storm ambient SFX + LDX.b #$0D ; dark mountain theme +.bunny LDA $7EF357 : ORA InvertedMode : BNE + LDA #$04 ; bunny theme + diff --git a/tables.asm b/tables.asm index de4e254..5514d05 100644 --- a/tables.asm +++ b/tables.asm @@ -713,6 +713,10 @@ org $06C93B ; PC 0x3493B PyramidPotion: db #$2C ; #$2C = Green Potion ;-------------------------------------------------------------------------------- +; Change track 15 (unused) to point to 13 (Death Mountain) so dark woods can be track 15 +org $1A9F15 ; PC 0xD1F15 + dw #$2B00 ; Set track 15 pointer to track 13's data +;-------------------------------------------------------------------------------- org $308140 ; PC 0x180140 - 0x18014A [encrypted] HeartPieceOutdoorValues: HeartPiece_Spectacle: From a75926b9e6a350943334b85ec3a751a8e5fb8214 Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Wed, 28 Nov 2018 18:17:49 -0800 Subject: [PATCH 04/10] Fix inverted mode flute loading light world music --- hooks.asm | 4 ++++ music.asm | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/hooks.asm b/hooks.asm index ac7149f..ba46f1b 100755 --- a/hooks.asm +++ b/hooks.asm @@ -2216,6 +2216,10 @@ NOP #1 ;-------------------------------------------------------------------------------- org $02B13A ; <- Bank02.asm:7647 dl Overworld_FinishMirrorWarp +;-------------------------------------------------------------------------------- +org $0AB949 ; <- Bank0A.asm:270 (Different from US ROM) +JSL BirdTravel_LoadTargetAreaMusic +NOP #16 ;================================================================================ ;================================================================================ diff --git a/music.asm b/music.asm index 1e1290d..23554ff 100644 --- a/music.asm +++ b/music.asm @@ -169,6 +169,71 @@ Overworld_FinishMirrorWarp: RTL ;-------------------------------------------------------------------------------- +;-------------------------------------------------------------------------------- +BirdTravel_LoadTargetAreaMusic: + ; Skip village and lost woods checks if entering dark world or a special area + LDA $8A : CMP.b #$40 : !BGE .notVillageOrWoods + + LDX.b #$07 ; Default village theme + + ; Check what phase we're in + LDA $7EF3C5 : CMP.b #$03 : !BLT + + LDX.b #$02 ; Default light world theme (phase >=3) + + + + ; Check if we're entering the village + LDA $8A : CMP.b #$18 : BEQ .endOfLightWorldChecks + ; For NA release would we also branch on indexes #$22 #$28 #$29 + + LDX.b #$05 ; Lost woods theme + + ; check if we've pulled from the master sword pedestal + LDA $7EF300 : AND.b #$40 : BEQ + + LDX.b #$02 ; Default light world theme + + + + ; check if we are entering lost woods + LDA $8A : BEQ .endOfLightWorldChecks + + .notVillageOrWoods + ; Use the normal overworld (light world) music + LDX.b #$02 + + ; Check phase ; In phase >= 2 + LDA $7EF3C5 : CMP.b #$02 : !BGE + + ; If phase < 2, play the legend music + LDX.b #$03 + + + + .endOfLightWorldChecks + ; if we are in the light world go ahead and set chosen selection + LDA $7EF3CA : BEQ .checkInverted+4 + + LDX.b #$0F ; dark woods theme + + ; This music is used in dark woods + LDA $8A + CMP.b #$40 : BEQ + + LDX.b #$0D ; dark death mountain theme + + ; This music is used in dark death mountain + CMP.b #$43 : BEQ + : CMP.b #$45 : BEQ + : CMP.b #$47 : BEQ + + LDX.b #$09 ; dark overworld theme + + + + ; if not inverted and light world, or inverted and dark world, skip moon pearl check + .checkInverted + LDA $7EF3CA : CLC : ROL #$03 : CMP InvertedMode : BEQ .lastCheck + + ; Does Link have a moon pearl? + LDA $7EF357 : BNE + + LDX.b #$04 ; bunny theme + + + + .lastCheck + RTL +;-------------------------------------------------------------------------------- + ;-------------------------------------------------------------------------------- ;0 = Is Kakariko Overworld ;1 = Not Kakariko Overworld From 022c12ac73143eff00305badf0f68ef80c5e95dc Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Sat, 1 Dec 2018 01:17:34 -0800 Subject: [PATCH 05/10] Enable multiple MSU-1 packs, selected via F5049 --- hooks.asm | 2 ++ init.asm | 12 ++++++- msu.asm | 91 +++++++++++++++++++++++++++++++++++++++++++++++------- tables.asm | 5 ++- 4 files changed, 96 insertions(+), 14 deletions(-) diff --git a/hooks.asm b/hooks.asm index ba46f1b..0084bb7 100755 --- a/hooks.asm +++ b/hooks.asm @@ -4,6 +4,8 @@ org $00802F ; <- 2F - Bank00.asm : 45 JSL.l Init_Primary NOP +org $0CC1AC ; <- 63 D4 00 - Bank0C.asm:8 (dl Tagalong_LoadGfx) +dl Init_PostRAMClear ;-------------------------------------------------------------------------------- ;================================================================================ diff --git a/init.asm b/init.asm index ee48530..726d39e 100644 --- a/init.asm +++ b/init.asm @@ -47,4 +47,14 @@ Init_Primary: LDA.b #$81 : STA $4200 ; thing we wrote over, turn on NMI & gamepad RTL -;-------------------------------------------------------------------------------- \ No newline at end of file +;-------------------------------------------------------------------------------- +; Init_PostRAMClear +;-------------------------------------------------------------------------------- +; This gets called after banks $7E and $7F get cleared, so if we need to +; initialize RAM in those banks, do it here +;-------------------------------------------------------------------------------- +Init_PostRAMClear: + + JSL msu_init + +JML $00D463 ; The original target of the jump table that we hijacked \ No newline at end of file diff --git a/msu.asm b/msu.asm index 4cc8947..6d155af 100644 --- a/msu.asm +++ b/msu.asm @@ -123,11 +123,13 @@ !REG_MUSIC_CONTROL = $012C !REG_CURRENT_TRACK = $0130 !REG_CURRENT_COMMAND = $0133 -!REG_MSU_LOAD_FLAG = $7F509B !REG_SPC_CONTROL = $2140 !REG_NMI_FLAGS = $4210 +!REG_MSU_DELAYED_COMMAND = $7F5047 +!REG_MSU_PACK_COUNT = $7F5048 +!REG_MSU_PACK_CURRENT = $7F5049 !VAL_COMMAND_FADE_OUT = #$F1 !VAL_COMMAND_FADE_HALF = #$F2 @@ -139,6 +141,35 @@ !VAL_VOLUME_HALF = #$80 !VAL_VOLUME_FULL = #$FF +msu_init: + REP #$20 : SEP #$10 + LDA #$0000 + STA !REG_MSU_VOLUME + STA !REG_MSU_PACK_COUNT + + LDA !REG_MSU_ID_01 : CMP !VAL_MSU_ID_01 : BNE .done + LDA !REG_MSU_ID_23 : CMP !VAL_MSU_ID_23 : BNE .done + LDA !REG_MSU_ID_45 : CMP !VAL_MSU_ID_45 : BNE .done + + LDA.w #$0000 + LDX.b #$FF + LDY.b #$01 + SEP #$20 +.check + TYA + REP #$20 + STA !REG_MSU_TRACK + !ADD.w #100 + 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 + TXA : STA !REG_MSU_PACK_COUNT +.done + RTL + msu_main: SEP #$20 ; set 8-BIT accumulator LDA $4210 ; thing we wrote over @@ -152,7 +183,7 @@ msu_main: LDA !REG_MSU_ID_45 : CMP !VAL_MSU_ID_45 : BNE .nomsu SEP #$30 LDX !REG_MUSIC_CONTROL : BNE command_ff - LDA !REG_MSU_LOAD_FLAG : BEQ do_fade + LDA !REG_MSU_DELAYED_COMMAND : BEQ do_fade msu_check_busy: LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_BUSY : BEQ .ready @@ -165,10 +196,10 @@ msu_check_busy: STA !REG_TARGET_VOLUME STA !REG_CURRENT_VOLUME STA !REG_MSU_VOLUME - LDA !REG_MSU_LOAD_FLAG + LDA !REG_MSU_DELAYED_COMMAND STA !REG_MSU_CONTROL LDA #$00 - STA !REG_MSU_LOAD_FLAG + STA !REG_MSU_DELAYED_COMMAND JML spc_continue do_fade: @@ -230,11 +261,28 @@ load_track: .dungeon LDA $040C : LSR : !ADD #$21 : TAX .continue - STX !REG_MSU_TRACK_LO - STZ !REG_MSU_TRACK_HI + LDA #$00 : XBA + LDA !REG_MSU_PACK_CURRENT : BEQ + + + - + CMP !REG_MSU_PACK_COUNT : !BLT + + !SUB !REG_MSU_PACK_COUNT : BRA - + + + + PHX : PHA : TXA : PLX + REP #$20 + BEQ + + - + !ADD.w #100 + DEX : BNE - + + + STA !REG_MSU_TRACK + SEP #$20 + STZ !REG_MSU_CONTROL + PLX LDA.l MSUTrackList,x - STA !REG_MSU_LOAD_FLAG + STA !REG_MSU_DELAYED_COMMAND STX !REG_CURRENT_MSU_TRACK JML spc_continue @@ -262,15 +310,34 @@ alternate_fallback: LDA MSUDungeonFallbackList,X : STA $00 SEP #$20 LDA ($00) - PLY : STY $00 : PLB + PLY : STY $00 : SEP #$10 : PLB .fallback STA !REG_CURRENT_MSU_TRACK - STA !REG_MSU_TRACK_LO - STZ !REG_MSU_TRACK_HI + TAX + + LDA #$00 : XBA + LDA !REG_MSU_PACK_CURRENT : BEQ + + + - + CMP !REG_MSU_PACK_COUNT : !BLT + + !SUB !REG_MSU_PACK_COUNT : BRA - + + + + PHA : TXA : PLX + REP #$20 + BEQ + + - + !ADD.w #100 + DEX : BNE - + + + STA !REG_MSU_TRACK + 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 @@ -286,7 +353,7 @@ pendant_fanfare: LDA !REG_MSU_ID_45 : CMP !VAL_MSU_ID_45 : BNE .spc SEP #$20 LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BNE .spc - LDA !REG_MSU_LOAD_FLAG : BNE .continue + LDA !REG_MSU_DELAYED_COMMAND : BNE .continue LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_PLAYING : BEQ .done .continue jml pendant_continue @@ -305,7 +372,7 @@ crystal_fanfare: LDA !REG_MSU_ID_45 : CMP !VAL_MSU_ID_45 : BNE .spc SEP #$20 LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BNE .spc - LDA !REG_MSU_LOAD_FLAG : BNE .continue + LDA !REG_MSU_DELAYED_COMMAND : BNE .continue LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_PLAYING : BEQ .done .continue jml crystal_continue diff --git a/tables.asm b/tables.asm index 5514d05..dfb51e7 100644 --- a/tables.asm +++ b/tables.asm @@ -1438,6 +1438,9 @@ 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 @@ -1460,7 +1463,7 @@ dw #9999 ; Rupee Limit ; $7F5098 - Water Entry Index ; $7F5099 - Last Entered Overworld Door ID ; $7F509A - (Reserved) -; $7F509B - MSU Flag +; $7F509B - Unused ; $7F509C - Inverted Mode Duck Map Temporary ; $7F509D - Stalfos Bomb Damage Value ; $7F509E - Valid Key Loaded From 9d9fb8a56352bd8f438a1c184b42f8f390c9cae4 Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Wed, 21 Aug 2019 20:56:08 -0700 Subject: [PATCH 06/10] 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) ;-------------------------------------------------------------------------------- From d7ce5ca5bdd8799c139b563d791557c8bebc0892 Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Thu, 22 Aug 2019 12:42:57 -0700 Subject: [PATCH 07/10] Don't attempt to mute/unmute when the same song is reloaded --- msu.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msu.asm b/msu.asm index ecab94f..5c7091f 100644 --- a/msu.asm +++ b/msu.asm @@ -147,7 +147,7 @@ CheckMusicLoadRequest: PHP : REP #$10 : PHA : PHX - LDA !REG_MUSIC_CONTROL_REQUEST : BEQ .done : BMI .done + LDA !REG_MUSIC_CONTROL_REQUEST : BEQ .done : BMI .done : CMP $0133 : BEQ .done +; ; Shut down NMI until music loads STZ $4200 From 16af34eb916eba34f814156181e792426311f64c Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Thu, 22 Aug 2019 16:18:13 -0700 Subject: [PATCH 08/10] Implement SPC fallback for missing MSU-1 tracks --- msu.asm | 88 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 23 deletions(-) diff --git a/msu.asm b/msu.asm index 5c7091f..a5df703 100644 --- a/msu.asm +++ b/msu.asm @@ -146,10 +146,15 @@ !VAL_VOLUME_FULL = #$FF CheckMusicLoadRequest: - PHP : REP #$10 : PHA : PHX - LDA !REG_MUSIC_CONTROL_REQUEST : BEQ .done : BMI .done : CMP $0133 : BEQ .done + PHP : REP #$10 : PHA : PHX : PHY + LDA !REG_MUSIC_CONTROL_REQUEST : BEQ .skip : BMI .skip : CMP $0133 : BNE .continue +.skip + STA !REG_MUSIC_CONTROL : STZ !REG_MUSIC_CONTROL_REQUEST + PLY : PLX : PLA : PLP + RTL - +; ; Shut down NMI until music loads +.continue + ; Shut down NMI until music loads STZ $4200 ; Set SPC into loader mode @@ -161,20 +166,30 @@ CheckMusicLoadRequest: 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 + SEP #$10 + LDA !REG_MUSIC_CONTROL_REQUEST : DEC : PHA + AND #$07 : TAY + PLA : LSR #3 : TAX + LDA !REG_MSU_FALLBACK_TABLE,X : BEQ .unmute : CMP #$FF : BEQ .mute + + - : CPY #$00 : BEQ + + LSR : DEY : BRA - : + + + AND #$01 : BEQ .unmute .mute - LDA.b #SPCMutePayload : STA $00 - LDA.b #SPCMutePayload>>8 : STA $01 - LDA.b #SPCMutePayload>>16 - BRA .load + 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 + LDA.b #SPCUnmutePayload : STA $00 + LDA.b #SPCUnmutePayload>>8 : STA $01 + LDA.b #SPCUnmutePayload>>16 .load + REP #$10 JSL Sound_LoadLightWorldSongBank_do_load ; Re-enable NMI and joypad @@ -195,12 +210,12 @@ CheckMusicLoadRequest: .done LDA !REG_MUSIC_CONTROL_REQUEST : STA !REG_MUSIC_CONTROL : STZ !REG_MUSIC_CONTROL_REQUEST - PLX : PLA : PLP + PLY : PLX : PLA : PLP RTL .sfx_indoors LDA !REG_MUSIC_CONTROL_REQUEST : STA !REG_MUSIC_CONTROL : STZ !REG_MUSIC_CONTROL_REQUEST - PLX : PLA : PLP + PLY : PLX : PLA : PLP JML Module_PreDungeon_setAmbientSfx msu_init: @@ -213,25 +228,52 @@ msu_init: LDA !REG_MSU_ID_23 : CMP !VAL_MSU_ID_23 : BNE .done LDA !REG_MSU_ID_45 : CMP !VAL_MSU_ID_45 : BNE .done +; Count the number of available MSU-1 packs LDA.w #$0000 LDX.b #$FF LDY.b #$01 - SEP #$20 + SEP #$20 + .check_pack - TYA - REP #$20 + TYA + REP #$20 STA !REG_MSU_TRACK !ADD.w #100 INX - SEP #$20 - TAY + SEP #$20 + TAY .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 + 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 + +; Check the current MSU-1 pack for tracks that require SPC fallback + LDA.b #64 + LDX.b #7 + LDY.b #7 + +.check_track + STA !REG_MSU_TRACK_LO + STZ !REG_MSU_TRACK_HI + PHA + CLC + +.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 : + + LDA !REG_MSU_FALLBACK_TABLE,X : ROL : STA !REG_MSU_FALLBACK_TABLE,X + + DEY : BPL .next_track + DEX : BPL + + PLA .done - PLP - RTL + PLP + RTL : + + LDY.b #7 +.next_track + PLA : DEC + BRA .check_track msu_main: SEP #$20 ; set 8-BIT accumulator From 9cf065271c843f1706bdcbe1283f63d515f438c7 Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Wed, 28 Aug 2019 10:25:05 -0700 Subject: [PATCH 09/10] Fix bunny music for non-inverted DM --- music.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/music.asm b/music.asm index 23554ff..48782d6 100644 --- a/music.asm +++ b/music.asm @@ -152,7 +152,7 @@ Overworld_FinishMirrorWarp: .bunny LDA $7EF357 : ORA InvertedMode : BNE + - LDA #$04 ; bunny theme + LDX #$04 ; bunny theme + STX $012C From fd7d2bba3a6409dc4d94e1d35fac1a2b622549af Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Wed, 28 Aug 2019 10:26:00 -0700 Subject: [PATCH 10/10] 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