diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index 5c1f0ec..920214f 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -75,6 +75,15 @@ db #$20, #$19, #$08, #$31 ; 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 @@ -390,6 +399,11 @@ UseImplicitRegIndexedLongJumpTable: org $008333 Vram_EraseTilemaps_triforce: +org $008913 +Sound_LoadLightWorldSongBank: +org $00891D + .do_load + org $00893D EnableForceBlank: @@ -423,6 +437,11 @@ Mirror_InitHdmaSettings: org $01873A Dungeon_LoadRoom: +org $02821E +Module_PreDungeon: +org $028296 + .setAmbientSfx + org $02A0A8 Dungeon_SaveRoomData: diff --git a/events.asm b/events.asm index 072d347..bac0fbc 100644 --- a/events.asm +++ b/events.asm @@ -207,6 +207,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/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 4ac0437..f56c8cb 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 ;-------------------------------------------------------------------------------- ;================================================================================ @@ -1455,6 +1457,13 @@ 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 +org $0080DD +dw !REG_MUSIC_CONTROL + +org $008101 +dw !REG_MUSIC_CONTROL ;-------------------------------------------------------------------------------- ;================================================================================ @@ -2225,6 +2234,13 @@ 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 +;-------------------------------------------------------------------------------- +org $0AB949 ; <- Bank0A.asm:270 (Different from US ROM) +JSL BirdTravel_LoadTargetAreaMusic +NOP #16 ;================================================================================ ;================================================================================ 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 a25e112..1b9689c 100644 --- a/msu.asm +++ b/msu.asm @@ -6,7 +6,78 @@ ; ; 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 the Journey +; 12 - Soldiers of Kakariko Village +; 13 - Black Mist +; 14 - Guessing Game House +; 15 - Dark Woods +; 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 +; 59 - Ganon's Tower (Upstairs) +; +; 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 +; +; Additional tracks +; +; 60 - Light World OW (after ped pull) +; 61 - Dark World OW (with all crystals) ; ;======================================= @@ -52,18 +123,15 @@ !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_CURRENT_TRACK = $0130 !REG_CURRENT_COMMAND = $0133 -!REG_MSU_LOAD_FLAG = $7F509B !REG_SPC_CONTROL = $2140 !REG_NMI_FLAGS = $4210 - !VAL_COMMAND_FADE_OUT = #$F1 !VAL_COMMAND_FADE_HALF = #$F2 !VAL_COMMAND_FULL_VOLUME = #$F3 @@ -74,6 +142,218 @@ !VAL_VOLUME_HALF = #$80 !VAL_VOLUME_FULL = #$FF +CheckMusicLoadRequest: + PHP : REP #$10 : PHA : PHX : PHY + 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 + RTL + +.continue + ; Shut down NMI until music loads + STZ $4200 + + 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 - + + 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.b #$07 : TAY + PLA : LSR #3 : TAX + LDA !REG_MSU_FALLBACK_TABLE,X : BEQ .secondary_fallback : CMP.b #$FF : BEQ .mute + + - : CPY #$00 : BEQ + + LSR : DEY : BRA - + + + + 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 + +.load + REP #$10 + JSL Sound_LoadLightWorldSongBank_do_load + + ; 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.b #$07 : BEQ .sfx_indoors + CMP.b #$0E : BEQ .sfx_indoors + CMP.b #$09 : BNE .done + +.sfx_outdoors + SEP #$10 + LDX.b #$05 + LDA $8A : CMP.b #$70 : BNE + ; Misery Mire + LDA $7EF2F0 : AND.b #$20 : BEQ .rain + + + + LDA $7EF3C5 : CMP.b #$02 : BCS + +.rain + LDX.b #$01 + + + STX $012D + REP #$10 + +.done + LDA !REG_MUSIC_CONTROL_REQUEST : STA !REG_MUSIC_CONTROL : STZ !REG_MUSIC_CONTROL_REQUEST + PLY : PLX : PLA : PLP + RTL + +.sfx_indoors + LDA !REG_MUSIC_CONTROL_REQUEST : STA !REG_MUSIC_CONTROL : STZ !REG_MUSIC_CONTROL_REQUEST + PLY : PLX : PLA : PLP + JML Module_PreDungeon_setAmbientSfx + +msu_init: + PHP : REP #$20 + LDA.w #$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 + +; Count the number of available MSU-1 packs + LDA.w #$0000 + LDX.b #$FF + LDY.b #$01 + SEP #$20 + +.check_pack + TYA + REP #$20 + STA !REG_MSU_TRACK + !ADD.w #100 + INX + 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 + +; 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 + + + LDY.b #7 +.next_track + PLA : DEC + BRA .check_track + msu_main: SEP #$20 ; set 8-BIT accumulator LDA $4210 ; thing we wrote over @@ -87,29 +367,23 @@ 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 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 + JML spc_continue +.start LDA !VAL_VOLUME_FULL 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 - 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 + LDA.b #$00 + STA !REG_MSU_DELAYED_COMMAND JML spc_continue do_fade: @@ -157,16 +431,73 @@ command_f1: JML spc_continue load_track: - CPX !REG_CURRENT_MSU_TRACK : BNE .continue - CPX #$1B : BEQ .continue - JML spc_continue -.continue - STX !REG_MSU_TRACK_LO - STZ !REG_MSU_TRACK_HI + CPX !REG_CURRENT_MSU_TRACK : BNE + + - : CPX #27 : BEQ + + JML spc_continue + + + CPX !REG_CURRENT_COMMAND : BEQ - + LDA.b #$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 - LDA.l MSUTrackList,x - STA !REG_MSU_LOAD_FLAG + PLX STX !REG_CURRENT_MSU_TRACK + LDA MSUTrackList,X + STA !REG_MSU_DELAYED_COMMAND + LDA MSUExtendedFallbackList-1,X : CMP.b #35 : !BLT .done : CMP.b #47 : !BGE .done + + 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 + +.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.b #$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 pendant_fanfare: @@ -177,12 +508,13 @@ 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 .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 @@ -196,12 +528,13 @@ 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 .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 @@ -217,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/music.asm b/music.asm index 0727996..48782d6 100644 --- a/music.asm +++ b/music.asm @@ -52,16 +52,24 @@ 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 + 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 + + ; 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 +87,153 @@ 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 : 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.b #$09 : STA $012D ; set storm ambient SFX + LDX.b #$0D ; dark mountain theme + +.bunny + LDA $7EF357 : ORA InvertedMode : BNE + + LDX #$04 ; bunny theme + + + + STX $012C + +.notDarkMountain + + LDA $11 : STA $010C + + STZ $11 + STZ $B0 + STZ $0200 + STZ $0710 + + 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 diff --git a/tables.asm b/tables.asm index 9b022d8..e308114 100644 --- a/tables.asm +++ b/tables.asm @@ -721,6 +721,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: @@ -968,7 +972,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 @@ -1468,7 +1476,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 @@ -1598,18 +1606,89 @@ 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 $FF,$FF,$FF,$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,$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 +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 + +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 + ;-------------------------------------------------------------------------------- -; 0x185040 - 1850FF (unused) +; 0x185060 - 1850FF (unused) ;-------------------------------------------------------------------------------- org $30D100 ; PC 0x185100 - 0x18513F UnusedTable: ; please do not move this - kkat