;======================================= ; ; MSU-1 Enhanced Audio Patch ; Zelda no Densetsu - Kamigami no Triforce ; Modified for VT Randomizer ; ; Author: qwertymodo ; ; 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) ; ;======================================= !REG_MSU_STATUS = $2000 !REG_MSU_ID_0 = $2002 !REG_MSU_ID_1 = $2003 !REG_MSU_ID_2 = $2004 !REG_MSU_ID_3 = $2005 !REG_MSU_ID_4 = $2006 !REG_MSU_ID_5 = $2007 !REG_MSU_ID_01 = $2002 !REG_MSU_ID_23 = $2004 !REG_MSU_ID_45 = $2006 !VAL_MSU_ID_0 = #$53 ; 'S' !VAL_MSU_ID_1 = #$2D ; '-' !VAL_MSU_ID_2 = #$4D ; 'M' !VAL_MSU_ID_3 = #$53 ; 'S' !VAL_MSU_ID_4 = #$55 ; 'U' !VAL_MSU_ID_5 = #$31 ; '1' !VAL_MSU_ID_01 = #$2D53 ; 'S-' !VAL_MSU_ID_23 = #$534D ; 'MS' !VAL_MSU_ID_45 = #$3155 ; 'U1' !REG_MSU_TRACK = $2004 !REG_MSU_TRACK_LO = $2004 !REG_MSU_TRACK_HI = $2005 !REG_MSU_VOLUME = $2006 !REG_MSU_CONTROL = $2007 !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 !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 !REG_TARGET_VOLUME = $0129 !REG_CURRENT_TRACK = $0130 !REG_CURRENT_COMMAND = $0133 !REG_SPC_CONTROL = $2140 !REG_NMI_FLAGS = $4210 !VAL_COMMAND_STOP_PLAYBACK = #$F0 !VAL_COMMAND_FADE_OUT = #$F1 !VAL_COMMAND_FADE_HALF = #$F2 !VAL_COMMAND_FULL_VOLUME = #$F3 !VAL_COMMAND_MUTE_SPC = #$FA !VAL_COMMAND_UNMUTE_SPC = #$FB !VAL_COMMAND_LOAD_NEW_BANK = #$FF !VAL_VOLUME_INCREMENT = #$10 !VAL_VOLUME_DECREMENT = #$02 !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 ;-------------------------------------------------------------------------------- ;================================================================================ ; 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 ;-------------------------------------------------------------------------------- CheckMusicLoadRequest: PHP : PHB : PHD : REP #$30 : PHA : PHX : PHY LDA #$0000 : TCD : SEP #$20 : PHA : PLB LDA !REG_MUSIC_CONTROL_REQUEST : BEQ .skip+3 : BMI .skip+3 CMP !REG_CURRENT_COMMAND : BNE .continue CMP.b #22 : BNE .skip ; Check GT when mirroring from upstairs LDA !REG_CURRENT_MSU_TRACK : CMP.b #59 : BNE .skip LDA.b #$00 : STA !REG_CURRENT_COMMAND BRA .continue .skip LDA !REG_MUSIC_CONTROL_REQUEST STA !REG_MUSIC_CONTROL : STZ !REG_MUSIC_CONTROL_REQUEST REP #$30 : PLY : PLX : PLA : PLD : PLB : PLP RTL .continue LDA TournamentSeed : BNE +++ LDA !REG_MSU_PACK_REQUEST CMP !REG_MSU_PACK_CURRENT : BEQ +++ CMP !REG_MSU_PACK_COUNT : !BLT ++ CMP #$FE : !BLT + STA !REG_MSU_PACK_CURRENT SEP #$10 LDA #$00 LDX #$07 - STA !REG_MSU_FALLBACK_TABLE,X DEX : BPL - REP #$10 BRA +++ + : LDA !REG_MSU_PACK_CURRENT : STA !REG_MSU_PACK_REQUEST ++ : STA !REG_MSU_PACK_CURRENT JSL MSUInit_check_fallback +++ LDA !REG_MUSIC_CONTROL_REQUEST : CMP #$08 : BEQ ++ ; Mirror SFX is not affected by NoBGM or pack $FE LDA NoBGM : BNE + LDA !REG_MSU_PACK_CURRENT : CMP #$FE : BNE ++ + : JMP .mute ++ LDX !REG_MSU_ID_01 : CPX !VAL_MSU_ID_01 : BEQ + - : JMP .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 #15 : 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 OverworldEventDataWRAM+$80 : AND.b #$40 : BEQ + PLA LDA.b #60 : BRA .check_fallback-3 + -- : PLA : BRA .check_fallback-3 .darkworld PHA LDA CrystalsField : CMP.b #$7F : BNE -- - : PLA LDA.b #61 : BRA .check_fallback-3 .darkwoods PHA LDA CrystalsField : CMP.b #$7F : BEQ - LDA CurrentWorld : 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 .check_fallback LDX !REG_MUSIC_CONTROL_REQUEST LDA MusicShuffleTable-1,X : 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 !VAL_COMMAND_MUTE_SPC BRA .load .secondary_fallback LDX !REG_MUSIC_CONTROL_REQUEST : LDA MSUExtendedFallbackList-1,X PHX TAX : LDA MusicShuffleTable-1,X PLX 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 TAX : LDA MusicShuffleTable-1,X STA !REG_MUSIC_CONTROL_REQUEST JMP .check_fallback .unmute LDA.b !VAL_COMMAND_UNMUTE_SPC .load REP #$10 STZ $4200 - : STA !REG_SPC_CONTROL : CMP !REG_SPC_CONTROL : BNE - ; Wait until mute/unmute command is ACK'ed - : STZ !REG_SPC_CONTROL : LDA !REG_SPC_CONTROL : BNE - ; Wait until mute/unmute command is completed 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 #$09 LDA $8A ; Dark Death Mountain CMP.b #$43 : BEQ + : CMP.b #$45 : BEQ + : CMP.b #$47 : BEQ + LDX.b #$05 + CMP.b #$70 : BNE + ; Misery Mire LDA OverworldEventDataWRAM+$70 : AND.b #$20 : BEQ .rain + LDA ProgressIndicator : 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 REP #$30 : PLY : PLX : PLA : PLD : PLB : PLP RTL .sfx_indoors LDA !REG_MUSIC_CONTROL_REQUEST : STA !REG_MUSIC_CONTROL : STZ !REG_MUSIC_CONTROL_REQUEST SEP #$20 : LDA.b #$05 : STA $012D REP #$30 : PLY : PLX : PLA : PLD : PLB : PLP JML Module_PreDungeon_setAmbientSfx ;-------------------------------------------------------------------------------- ;================================================================================ ; Fade out music if we're changing tracks on a stair transition ;-------------------------------------------------------------------------------- SpiralStairsPreCheck: REP #$20 ; thing we wrote over LDA $A0 CMP.w #$000C : BNE + LDA !REG_CURRENT_MSU_TRACK : AND.w #$00FF : CMP.w #59 : BNE .done BRA .fade + CMP.w #$006B : BNE .done+2 LDA TournamentSeed : CMP.w #$0001 : BEQ + 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 BigKeyField : AND.w #$0004 : BEQ .done ; Check that we have the GT big key LDA !REG_MSU_FALLBACK_TABLE+7 : AND.w #$0004 : BEQ .done ; Check that we have the extended track .fade LDX.b #$F1 : STX !REG_MUSIC_CONTROL_REQUEST .done LDA $A0 ; thing we wrote over RTL ;-------------------------------------------------------------------------------- ;================================================================================ ; Change music on stair transition (ToH/GT) ;-------------------------------------------------------------------------------- SpiralStairsPostCheck: LDA $A0 CMP.w #$000C : BNE + ; Ganon's tower entrance LDX $0130 : CPX.b #$F1 : BNE .done ; Check that we were fading out LDX #22 : STX !REG_MUSIC_CONTROL_REQUEST BRA .done + CMP.w #$006B : BNE .done ; Ganon's tower upstairs (with big key) LDX $0130 : CPX.b #$F1 : BNE .done ; Check that we were fading out LDX #59 : STX !REG_MUSIC_CONTROL_REQUEST .done LDX.b #$1C : LDA $A0 ; thing we wrote over RTL ;-------------------------------------------------------------------------------- ;================================================================================ ; Make sure expanded OST tracks load properly after death/fairy revival ;-------------------------------------------------------------------------------- StoreMusicOnDeath: STA.l $7EC227 ; thing we wrote over LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_PLAYING : BEQ .done LDA !REG_CURRENT_MSU_TRACK : STA.l $7EC227 .done RTL ;-------------------------------------------------------------------------------- ;================================================================================ ; Check if MSU-1 is enabled and scan for missing tracks ;-------------------------------------------------------------------------------- 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_CONTROL LDA NoBGM : BNE .done REP #$20 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 BRA + ; Check the current MSU-1 pack for tracks that require SPC fallback .check_fallback PHP : SEP #$10 LDA NoBGM : BNE .done + : 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 ;-------------------------------------------------------------------------------- ;================================================================================ ; Stop MSU-1 audio track and save the current position when approriate ;-------------------------------------------------------------------------------- MSUStopPlaying: PHA : XBA : PHA LDA !MSU_LOADED_TRACK JSR IsResumableTrack : BCC + ; dont save if we already saved recently REP #$20 LDA !MSU_RESUME_TRACK : AND #$00FF : BEQ ++ LDA NMIFrames : !SUB !MSU_RESUME_TIME : PHA LDA NMIFrames+2 : SBC !MSU_RESUME_TIME+2 : BNE +++ PLA : CMP MSUResumeTimer : !BLT .too_early BRA ++ +++ PLA ++ ; saving LDA NMIFrames : STA !MSU_RESUME_TIME LDA NMIFrames+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 ;-------------------------------------------------------------------------------- MSUMain: SEP #$20 ; set 8-BIT accumulator LDA $4210 ; thing we wrote over REP #$20 ; set 16-BIT accumulator 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 LDA !REG_MSU_ID_45 : CMP !VAL_MSU_ID_45 : BNE .nomsu SEP #$30 LDX !REG_MUSIC_CONTROL : BEQ + JMP .command_ff + LDA !REG_MSU_DELAYED_COMMAND : BEQ .do_fade .check_busy LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_BUSY : BNE - .ready LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BNE - .start 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 BRA - + LDA !VAL_VOLUME_FULL STA !REG_TARGET_VOLUME LDA !MSU_RESUME_CONTROL : BIT !FLAG_RESUME_FADEIN : BEQ + 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 LDA !REG_MSU_FALLBACK_TABLE,X : BEQ +++ : CMP.b #$FF : BEQ ++ - : CPY #$00 : BEQ + LSR : DEY : BRA - + AND.b #$01 : BEQ +++ ++ : LDA !REG_MSU_DELAYED_COMMAND +++ : STA !REG_MSU_CONTROL LDA.b #$00 STA !REG_MSU_DELAYED_COMMAND JML SPCContinue .do_fade: LDA !REG_CURRENT_VOLUME : CMP !REG_TARGET_VOLUME : BNE + JML SPCContinue + : BCC .increment .decrement SBC !VAL_VOLUME_DECREMENT : BCC .mute CMP !REG_TARGET_VOLUME : !BGE .set LDA !REG_TARGET_VOLUME : BRA .set .mute STZ !REG_CURRENT_VOLUME JSR MSUStopPlaying BRA .set .increment ADC !VAL_VOLUME_INCREMENT : BCS .max CMP !REG_TARGET_VOLUME : !BLT .set LDA !REG_TARGET_VOLUME : BRA .set .max LDA !VAL_VOLUME_FULL .set STA !REG_CURRENT_VOLUME STA !REG_MSU_VOLUME JML SPCContinue .command_ff: CPX !VAL_COMMAND_LOAD_NEW_BANK : BNE .command_f3 JML SPCContinue .command_f3: CPX !VAL_COMMAND_FULL_VOLUME : BNE .command_f2 LDA !VAL_VOLUME_FULL STA !REG_TARGET_VOLUME JML SPCContinue .command_f2: CPX !VAL_COMMAND_FADE_HALF : BNE .command_f1 LDA !VAL_VOLUME_HALF STA !REG_TARGET_VOLUME JML SPCContinue .command_f1: CPX !VAL_COMMAND_FADE_OUT : BNE .command_f0 STZ !REG_TARGET_VOLUME STZ !REG_CURRENT_MSU_TRACK JML SPCContinue .command_f0: CPX !VAL_COMMAND_STOP_PLAYBACK : !BLT .load_track CPX !VAL_COMMAND_MUTE_SPC : BEQ + ; Don't allow executing the mute/umute CPX !VAL_COMMAND_UNMUTE_SPC : BNE ++ ; commands during NMI like this + : LDA.b #$00 : STA !REG_MUSIC_CONTROL ++ : JML SPCContinue .load_track: CPX !REG_CURRENT_MSU_TRACK : BNE + - : CPX #27 : BEQ + TXA JMP .done+1 + 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 - + JSR MSUStopPlaying PHX : PHA : TXA : PLX REP #$20 BEQ + - !ADD.w #100 DEX : BNE - + STA !REG_MSU_TRACK STA !REG_MSU_LOADED_TRACK SEP #$20 PLX TXA : CMP !MSU_RESUME_TRACK : BNE + ; dont resume if too late REP #$20 LDA NMIFrames : !SUB !MSU_RESUME_TIME : PHA LDA NMIFrames+2 : SBC !MSU_RESUME_TIME+2 : BNE ++ PLA : CMP MSUResumeTimer : !BGE +++ SEP #$20 LDA !FLAG_RESUME_FADEIN : BRA .done_resume ++ PLA +++ SEP #$20 LDA !FLAG_RESUME_CANCEL .done_resume: STA !MSU_RESUME_CONTROL LDA #$00 : STA !MSU_RESUME_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 ++ + : LDA MSUTrackList-1,X ++ : STA !REG_MSU_DELAYED_COMMAND LDA MSUExtendedFallbackList-1,X CMP.b #17 : BEQ + CMP.b #22 : BEQ + 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 - : TAX : CMP MSUExtendedFallbackList-1,X : BEQ + LDA MSUExtendedFallbackList-1,X : BRA - + STA !REG_MUSIC_CONTROL JML SPCContinue ;-------------------------------------------------------------------------------- ;================================================================================ ; Wait for the fanfare music to start, or else it can get skipped entirely ;-------------------------------------------------------------------------------- FanfarePreload: STA.l !REG_MUSIC_CONTROL_REQUEST ; thing we wrote over PHA JSL CheckMusicLoadRequest WAI PLA - : CMP.l !REG_SPC_CONTROL : BNE - JML AddReceivedItem_doneWithSoundEffects ;-------------------------------------------------------------------------------- ;================================================================================ ; Wait for pendant fanfare to finish ;-------------------------------------------------------------------------------- PendantFanfareWait: LDA TournamentSeed : BNE .spc LDA FastFanfare : BNE .done REP #$20 LDA !REG_MSU_ID_01 : CMP !VAL_MSU_ID_01 : BNE .spc LDA !REG_MSU_ID_23 : CMP !VAL_MSU_ID_23 : BNE .spc LDA !REG_MSU_ID_45 : CMP !VAL_MSU_ID_45 : BNE .spc SEP #$20 LDA !REG_MSU_PACK_CURRENT : CMP #$FE : !BGE .spc LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BNE .spc LDA !REG_MSU_DELAYED_COMMAND : BNE .continue LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_PLAYING : BEQ .done .continue jml PendantFanfareContinue .spc SEP #$20 LDA.l !REG_SPC_CONTROL : BNE .continue .done jml PendantFanfareDone ;-------------------------------------------------------------------------------- ;================================================================================ ; Wait for crystal fanfare to finish ;-------------------------------------------------------------------------------- CrystalFanfareWait: LDA TournamentSeed : BNE .spc LDA FastFanfare : BNE .done REP #$20 LDA !REG_MSU_ID_01 : CMP !VAL_MSU_ID_01 : BNE .spc LDA !REG_MSU_ID_23 : CMP !VAL_MSU_ID_23 : BNE .spc LDA !REG_MSU_ID_45 : CMP !VAL_MSU_ID_45 : BNE .spc SEP #$20 LDA !REG_MSU_PACK_CURRENT : CMP #$FE : !BGE .spc LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BNE .spc LDA !REG_MSU_DELAYED_COMMAND : BNE .continue LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_PLAYING : BEQ .done .continue jml CrystalFanfareContinue .spc SEP #$20 LDA.l !REG_SPC_CONTROL : BNE .continue .done jml CrystalFanfareDone ;-------------------------------------------------------------------------------- ;================================================================================ ; Delay input scanning on startup/S&Q to avoid hard-lock from button mashing ;-------------------------------------------------------------------------------- StartupWait: LDA $11 : CMP.b #$04 : BCC .done ; thing we wrote over LDA !REG_SPC_CONTROL : BEQ .done-1 CMP.b #$01 : BEQ .done CLC .done RTL ;-------------------------------------------------------------------------------- ;================================================================================ ; Wait for ending credits music to finish ;-------------------------------------------------------------------------------- EndingMusicWait: REP #$20 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 SEP #$20 .wait LDA.b $50 : BNE .done LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_PLAYING : BNE .wait .done SEP #$20 LDA.b #$22 RTL ;--------------------------------------------------------------------------------