Files
alttpr-baserom/msu.asm
cassidoxa 3e2362b7ca Implement initial SRAM table
Data in initialsramtable.asm gets copied to SRAM on save file init
Frontend will be responsible for setting this, requires frontend changes
Changed some label names to disambiguate WRAM and SRAM labels
Deleted open mode
2022-02-03 20:25:32 -05:00

829 lines
24 KiB
NASM

;=======================================
;
; 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
;--------------------------------------------------------------------------------