From 6259a813b18523d2ee907cc7ae2a333c02d2e0b4 Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Sun, 17 Nov 2019 14:14:00 -0800 Subject: [PATCH 1/6] Fix title screen delay (bass version) --- hooks.asm | 2 +- msu.asm | 12 ----- music.asm | 19 ------- spc.asm | 151 +++++++++++++++++++++++++++++++++++++---------------- tables.asm | 42 --------------- 5 files changed, 106 insertions(+), 120 deletions(-) diff --git a/hooks.asm b/hooks.asm index 149352d..7613817 100755 --- a/hooks.asm +++ b/hooks.asm @@ -1482,7 +1482,7 @@ org $09F2A7 ; <- 8F27C27E - module_death.asm:56 (STA $7EC227) JSL.l StoreMusicOnDeath org $0CC100 ; <- A511 C904 - Bank0C.asm:07 (LDA $11 : CMP.b #$04) -JSL.l startup_wait +;JSL.l startup_wait org $0EE6EC ; <- E220 A922 - Bank0E.asm:2892 (SEP #$20 : LDA.b #$22 : STA $012C) JSL.l ending_wait diff --git a/msu.asm b/msu.asm index a043ddd..98eb812 100644 --- a/msu.asm +++ b/msu.asm @@ -383,18 +383,6 @@ StoreMusicOnDeath: msu_init: PHP - STZ $4200 - - LDA.b #$FF : STA $2140 - - LDA.b #SPCEngineNewCode : STA.b $00 - LDA.b #SPCEngineNewCode>>8 : STA.b $01 - LDA.b #SPCEngineNewCode>>16 - - JSL Sound_LoadLightWorldSongBank_do_load - - LDA.b #$81 : STA $4200 - LDA NoBGM : BNE .done REP #$20 diff --git a/music.asm b/music.asm index 9269a90..72a1d2f 100644 --- a/music.asm +++ b/music.asm @@ -279,22 +279,3 @@ Overworld_MosaicDarkWorldChecks: .done RTL ;-------------------------------------------------------------------------------- - -;-------------------------------------------------------------------------------- -!SPCFreeSpace = $0700 - -SPCEngineNewCode: -dw .end-.start -dw !SPCFreeSpace -.start -incsrc spc.asm -.end - -dw $0004 -dw $0A73 ; $0A73: CMP A,#$F0 -db $5F ; JMP SPCFreeSpace -dw !SPCFreeSpace -db $00 ; NOP - -dw $0000, $0000 -;-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/spc.asm b/spc.asm index 58865ed..1a14d62 100644 --- a/spc.asm +++ b/spc.asm @@ -1,47 +1,106 @@ -;======================================= -; SPC engine changes -; -; Free space at $040F-07FF (probably) -; -; If we ever switch to ASAR we can rewrite -; this as actual SPC asm instead of this -; db jank. +// Build with bass v15 +// This code apparently triggers a pathalogical edge case +// which breaks forward labels, necessitating db-style branches +// but the code is really only for documentation anyway, we're +// using a compiled .bps patch for actual patch generation. -; seek($0700) -db $68, $F0 ; CMP A,#$F0 ; the thing we overwrote -db $D0, $03 ; BNE + -db $5F, $81, $0A ; JMP SilenceSong ; ($0A81) -db $68, $FA ; + : CMP A,#$FA ; new mute command $FA -db $D0, $1C ; BNE + -db $C4, $F4 ; MOV $F4,A -db $E8, $00 ; MOV A,#$00 -db $C5, $4A, $0A ; MOV $0A4A,A ; $0A49: MOV A,#$70 -> MOV A,#$00 -db $C5, $F3, $0A ; MOV $0AF3,A ; $0AF2: MOV $059,#$C0 -> MOV $059,#$00 -db $C5, $32, $0C ; MOV $0C32,A ; $0C32: MOVW $058,YA -> NOP #2 -db $C5, $33, $0C ; MOV $0C33,A -db $E8, $C4 ; MOV A,#$C4 ; $0D19: MOVW $058,YA -> MOV $058,A -db $C5, $19, $0D ; MOV $0D19,A -db $E8, $58 ; MOV A,#$58 -db $C5, $1A, $0D ; MOV $0D1A,A -db $2F, $23 ; BRA ++ -db $68, $FB ; + : CMP A,#$FB ; new unmute command $FB -db $F0, $03 ; BEQ + -db $5F, $9D, $0A ; JMP NewSongInput ; ($0A9D) -db $C4, $F4 ; + : MOV $F4,A -db $E8, $70 ; MOV A,#$70 -db $C5, $4A, $0A ; MOV $0A4A,A ; $0A49: MOV A,#$70 -db $E8, $C0 ; MOV A,#$C0 -db $C5, $F3, $0A ; MOV $0AF3,A ; $0AF2: MOV $059,#$C0 -db $E8, $DA ; MOV A,#$DA -db $C5, $32, $0C ; MOV $0C32,A ; $0C32: MOVW $058,YA -db $C5, $19, $0D ; MOV $0D19,A ; $0D19: MOVW $058,YA -db $E8, $58 ; MOV A,#$58 -db $C5, $33, $0C ; MOV $0C33,A -db $C5, $1A, $0D ; MOV $0D1A,A -db $3F, $81, $0A ; ++ : CALL SilenceSong ; ($0A81) -db $E4, $F4 ; - : MOV A,$F4 -db $D0, $FC ; BNE - -db $64, $F4 ; CMP A,$F4 -db $D0, $F8 ; BNE - -db $FA, $00, $F4 ; MOV $F4,#$00 -db $6F ; RET +architecture wdc65816 + +macro rom_seek(variable address) { + origin ((address & $7F0000) >> 1) | (address & $7FFF) + base address +} + +rom_seek($400000) // Pad ROM to 0x200000 + +rom_seek($008901) +lda.b #(SPC.IntroSongBank & 0xFF); sta $00 +lda.b #((SPC.IntroSongBank >> 8) & 0xFF); sta $01 +lda.b #((SPC.IntroSongBank >> 16) & 0xFF); sta $02 + +rom_seek($348000) // Seek to ROM offset 0x1A0000 + +architecture spc700 + +namespace SPC { +constant ENGINE_ENTRYPOINT = $0800 +constant NEW_CODE_LENGTH = (EngineStart - NewCodeSection) +constant CODE_START = (ENGINE_ENTRYPOINT - NEW_CODE_LENGTH) + +macro spc_seek(variable address) { + origin (address & $FFFF) + (((START & $7F0000) >> 1) | (START & $7FFF)) - CODE_START + base address +} + +// Insert the original SPC transfer blocks up to the main engine code +insert IntroSongBank, "alttp.sfc", 0x0C8000, 0x7BCA +dw NEW_CODE_LENGTH + $0F9E // New code is prepended to the original upload +dw CODE_START // of length $0F9E to destination $0800 + + +START: +spc_seek(CODE_START) +if pc() < $0700 { + error "SPC code out of bounds (PC < $0700)" +} + +// Any new code goes here. DON'T DELETE THIS LABEL +// Labels not forward-declared (e.g. '+/++') don't work here +NewCodeSection: + +SpecialCommand_Mute: +cmp #$F0 // The thing we overwrote +// bne + +db $D0, $03 + jmp $0A81 // SilenceSong ++; cmp #$FA // New mute command $FA +// bne + +db $D0, $1C + sta $F4 + lda #$00 + sta $0A4A // $0A49: lda #$70 -> lda #$00 + sta $0AF3 // $0AF2: MOV $059,#$C0 -> MOV $059,#$00 + sta $0C32 // $0C32: MOVW $058,YA -> NOP #2 + sta $0C33 + lda #$C4 // $0D19: MOVW $058,YA -> lda $058 + sta $0D19 + lda #$58 + sta $0D1A + // bra ++ + db $2F, $23 ++; cmp #$FB // New unmute command $FB +// beq + +db $F0, $03 + jmp $0A9D // NewSongInput ++; sta $F4 +lda #$70 +sta $0A4A // $0A49: lda #$70 +lda #$C0 +sta $0AF3 // $0AF2: MOV $059,#$C0 +lda #$DA +sta $0C32 // $0C32: MOVW $058,YA +sta $0D19 // $0D19: MOVW $058,YA +lda #$58 +sta $0C33 +sta $0D1A ++; jsr $0A81 // SilenceSong +-; lda $F4 + bne - + cmp $F4 + bne - +str $F4=$00 // ACK the CPU +rts + +EngineStart: +// Upload the main engine, along with the rest of the original transfer block +insert "alttp.sfc", 0x0CFBCE, 0x57B2 + +// Hook to check for new special mute commands FA, FB +spc_seek($0A73) // $0A73: CMP A,#$F0 +jmp SpecialCommand_Mute +nop + +rom_seek($0C8000) +fill 0xD380 + +} // namespace SPC \ No newline at end of file diff --git a/tables.asm b/tables.asm index a0b6c59..0f8dfd2 100644 --- a/tables.asm +++ b/tables.asm @@ -1634,48 +1634,6 @@ db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF ;================================================================================ org $30D800 ; PC 0x185800 - 0x18591F -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 - MSUTrackList: db $01,$03,$03,$03,$03,$03,$03,$01 db $03,$01,$03,$03,$03,$03,$03,$03 From 605a344368948781ecc7e5e1aa86ef225072be6f Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Sun, 17 Nov 2019 19:26:03 -0800 Subject: [PATCH 2/6] Port SPC engine patches to ASAR --- LTTP_RND_GeneralBugfixes.asm | 3 + spc.asm | 208 +++++++++++++++++------------------ tables.asm | 4 - 3 files changed, 105 insertions(+), 110 deletions(-) diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index c15b20c..11ed661 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -207,6 +207,9 @@ incsrc stats/main.asm org $308000 ; bank #$30 incsrc tables.asm +org $348000 +incsrc spc.asm + ; uncomment for inverted adjustments ;incsrc sandbox.asm diff --git a/spc.asm b/spc.asm index 1a14d62..51a40f3 100644 --- a/spc.asm +++ b/spc.asm @@ -1,106 +1,102 @@ -// Build with bass v15 -// This code apparently triggers a pathalogical edge case -// which breaks forward labels, necessitating db-style branches -// but the code is really only for documentation anyway, we're -// using a compiled .bps patch for actual patch generation. - -architecture wdc65816 - -macro rom_seek(variable address) { - origin ((address & $7F0000) >> 1) | (address & $7FFF) - base address -} - -rom_seek($400000) // Pad ROM to 0x200000 - -rom_seek($008901) -lda.b #(SPC.IntroSongBank & 0xFF); sta $00 -lda.b #((SPC.IntroSongBank >> 8) & 0xFF); sta $01 -lda.b #((SPC.IntroSongBank >> 16) & 0xFF); sta $02 - -rom_seek($348000) // Seek to ROM offset 0x1A0000 - -architecture spc700 - -namespace SPC { -constant ENGINE_ENTRYPOINT = $0800 -constant NEW_CODE_LENGTH = (EngineStart - NewCodeSection) -constant CODE_START = (ENGINE_ENTRYPOINT - NEW_CODE_LENGTH) - -macro spc_seek(variable address) { - origin (address & $FFFF) + (((START & $7F0000) >> 1) | (START & $7FFF)) - CODE_START - base address -} - -// Insert the original SPC transfer blocks up to the main engine code -insert IntroSongBank, "alttp.sfc", 0x0C8000, 0x7BCA -dw NEW_CODE_LENGTH + $0F9E // New code is prepended to the original upload -dw CODE_START // of length $0F9E to destination $0800 - - -START: -spc_seek(CODE_START) -if pc() < $0700 { - error "SPC code out of bounds (PC < $0700)" -} - -// Any new code goes here. DON'T DELETE THIS LABEL -// Labels not forward-declared (e.g. '+/++') don't work here -NewCodeSection: - -SpecialCommand_Mute: -cmp #$F0 // The thing we overwrote -// bne + -db $D0, $03 - jmp $0A81 // SilenceSong -+; cmp #$FA // New mute command $FA -// bne + -db $D0, $1C - sta $F4 - lda #$00 - sta $0A4A // $0A49: lda #$70 -> lda #$00 - sta $0AF3 // $0AF2: MOV $059,#$C0 -> MOV $059,#$00 - sta $0C32 // $0C32: MOVW $058,YA -> NOP #2 - sta $0C33 - lda #$C4 // $0D19: MOVW $058,YA -> lda $058 - sta $0D19 - lda #$58 - sta $0D1A - // bra ++ - db $2F, $23 -+; cmp #$FB // New unmute command $FB -// beq + -db $F0, $03 - jmp $0A9D // NewSongInput -+; sta $F4 -lda #$70 -sta $0A4A // $0A49: lda #$70 -lda #$C0 -sta $0AF3 // $0AF2: MOV $059,#$C0 -lda #$DA -sta $0C32 // $0C32: MOVW $058,YA -sta $0D19 // $0D19: MOVW $058,YA -lda #$58 -sta $0C33 -sta $0D1A -+; jsr $0A81 // SilenceSong --; lda $F4 - bne - - cmp $F4 - bne - -str $F4=$00 // ACK the CPU -rts - -EngineStart: -// Upload the main engine, along with the rest of the original transfer block -insert "alttp.sfc", 0x0CFBCE, 0x57B2 - -// Hook to check for new special mute commands FA, FB -spc_seek($0A73) // $0A73: CMP A,#$F0 -jmp SpecialCommand_Mute -nop - -rom_seek($0C8000) -fill 0xD380 - -} // namespace SPC \ No newline at end of file +; WARNING: THIS CODE IS EXTREMELY FRAGILE + +macro copybin(source, length) + !copycount #= 0 + while !copycount+3 < + dd read4(pctosnes(+!copycount)) + !copycount #= !copycount+4 + endif + + while !copycount < + db read1(pctosnes(+!copycount)) + !copycount #= !copycount+1 + endif +endmacro + +;@ pushpc +org $008901 +LDA.b #SPCData : STA $00 +LDA.b #SPCData>>8 : STA $01 +LDA.b #SPCData>>16 : STA $02 +;@ pullpc + +SPCData: +;@ check bankcross off +%copybin($0C8000, $7BCA) + +!SPCEngineStart = $0800 +!SPCCodeStart = $07A7 + +dw ($0F9E+(!SPCEngineStart-!SPCCodeStart)) +dw !SPCCodeStart + +;@ pushpc +;@ pushbase + +arch spc700 +base !SPCCodeStart +org $34FBCE;-(!SPCEngineStart-!SPCCodeStart) +NewSPCCode: + +SpecialCommand_Mute: +CMP A,#$F0 ; The thing we overwrote +BNE + + JMP $0A81 ; SilenceSong ++ +CMP A,#$FA ; New mute command $FA +BNE + + MOV $F4,A + MOV A,#$00 + MOV $0A4A,A ; $0A49: MOV A,#$70 -> MOV A,#$00 + MOV $0AF3,A ; $0AF2: MOV $059,#$C0 -> MOV $059,#$00 + MOV $0C32,A ; $0C32: MOVW $058,YA -> NOP #2 + MOV $0C33,A + MOV A,#$C4 ; $0D19: MOVW $058,YA -> MOV A,$058 + MOV $0D19,A + MOV A,#$58 + MOV $0D1A,A + BRA +++ ++ +CMP A,#$FB ; New unmute command $FB +BEQ + + JMP $0A9D ; NewSongInput ++ +MOV $F4,A +MOV A,#$70 +MOV $0A49,A ; $0A49: MOV A,#$70 +MOV A,#$C0 +MOV $0AF3,A ; $0AF2: MOV $059,#$C0 +MOV A,#$DA +MOV $0C32,A ; $0C32: MOVW $058,YA +MOV $0D19,A ; $0D19: MOVW $058,YA +MOV A,#$58 +MOV $0C33,A +MOV $0D1A,A ++++ +CALL $0A81 ; SilenceSong +- : MOV A,$F4 + BNE - + CMP A,$F4 + BNE - +MOV $F4,$00 +RET + +org !SPCEngineStart + +arch 65816 +SPCEngineStart: +;@ pullbase +;@ pullpc +skip !SPCEngineStart-!SPCCodeStart +%copybin($0CFBCE, $57B2) +SPCEngineEnd: +;@ check bankcross on + +; Change track 15 (unused) to point to 13 (Death Mountain) so dark woods can be track 15 +org $359F6E ; PC 0x1A9F6E ; SPC $D01C + dw #$2B00 ; Set track 15 pointer to track 13's data + +arch spc700 +org $34FE9A ; PC 0x1A7E9A ; SPC $0A73 + JMP !SPCCodeStart : NOP +arch 65816 diff --git a/tables.asm b/tables.asm index 0f8dfd2..d0e5086 100644 --- a/tables.asm +++ b/tables.asm @@ -731,10 +731,6 @@ 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 d9481fe346451b932b254c7d9cd78e8ae0cdddb3 Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Thu, 19 Dec 2019 11:42:44 -0800 Subject: [PATCH 3/6] MSU coding style cleanup --- hooks.asm | 22 ++++----- init.asm | 2 +- msu.asm | 132 +++++++++++++++++++++++++++++++++++------------------- 3 files changed, 99 insertions(+), 57 deletions(-) diff --git a/hooks.asm b/hooks.asm index 7613817..3682fee 100755 --- a/hooks.asm +++ b/hooks.asm @@ -1449,8 +1449,8 @@ JSL.l GetMagicBatItem ; MSU Music ;-------------------------------------------------------------------------------- org $0080D7 ; <- D7 - Bank00.asm:172 (SEP #$30) -JML msu_main : NOP -spc_continue: +JML MSUMain : NOP +SPCContinue: org $028B7A ; <- C220 A5A0 - Bank02.asm:2225 (REP #$20 : LDA $A0) JSL SpiralStairsPreCheck @@ -1462,30 +1462,30 @@ org $02D6E8 ; <- 9C0A01 - Bank02.asm:10811 (STZ $010A) NOP #3 org $08C421 ; <- AD4021 F005 - ancilla_receive_item.asm:108 (LDA $2140 : BEQ .wait_for_music) -JML pendant_fanfare : NOP -pendant_continue: +JML PendantFanfareWait : NOP +PendantFanfareContinue: org $08C42B -pendant_done: +PendantFanfareDone: org $08C62A ; <- AD4021 D008 - ancilla_receive_item.asm:442 (LDA $2140 : BNE .waitForSilence) -JML crystal_fanfare : NOP -crystal_done: +JML CrystalFanfareWait : NOP +CrystalFanfareDone: org $08C637 -crystal_continue: +CrystalFanfareContinue: org $0988A0 ; <- 8D2C01 8009 - ancilla_init.asm:1179 (STA $012C : BRA .doneWithSoundEffects) -JML fanfare_preload : NOP +JML FanfarePreload : NOP org $09F2A7 ; <- 8F27C27E - module_death.asm:56 (STA $7EC227) JSL.l StoreMusicOnDeath org $0CC100 ; <- A511 C904 - Bank0C.asm:07 (LDA $11 : CMP.b #$04) -;JSL.l startup_wait +;JSL.l StartupWait org $0EE6EC ; <- E220 A922 - Bank0E.asm:2892 (SEP #$20 : LDA.b #$22 : STA $012C) -JSL.l ending_wait +JSL.l EndingMusicWait ; Process music commands in NMI from new location after muting is processed org $0080DD diff --git a/init.asm b/init.asm index 726d39e..8da91a0 100644 --- a/init.asm +++ b/init.asm @@ -55,6 +55,6 @@ RTL ;-------------------------------------------------------------------------------- Init_PostRAMClear: - JSL msu_init + JSL MSUInit 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 98eb812..6865ce9 100644 --- a/msu.asm +++ b/msu.asm @@ -145,6 +145,9 @@ !VAL_VOLUME_HALF = #$80 !VAL_VOLUME_FULL = #$FF +;================================================================================ +; Extended OST/SPC fallback, decide which track to actually play +;-------------------------------------------------------------------------------- CheckMusicLoadRequest: PHP : REP #$10 : PHA : PHX : PHY LDA !REG_MUSIC_CONTROL_REQUEST : BEQ .skip+3 : BMI .skip+3 @@ -176,7 +179,7 @@ CheckMusicLoadRequest: BRA +++ + : LDA !REG_MSU_PACK_CURRENT : STA !REG_MSU_PACK_REQUEST ++ : STA !REG_MSU_PACK_CURRENT - JSL msu_init_check_fallback + JSL MSUInit_check_fallback +++ LDA !REG_MUSIC_CONTROL_REQUEST : CMP #$08 : BEQ ++ ; Mirror SFX is not affected by NoBGM or pack $FE @@ -325,7 +328,11 @@ CheckMusicLoadRequest: PLY : PLX : PLA : PLP LDA.b #$05 : STA $012D 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 @@ -351,7 +358,11 @@ SpiralStairsPreCheck: .done LDA $A0 ; thing we wrote over RTL +;-------------------------------------------------------------------------------- +;================================================================================ +; Change music on stair transition (ToH/GT) +;-------------------------------------------------------------------------------- SpiralStairsPostCheck: LDA $A0 CMP.w #$000C : BNE + @@ -372,15 +383,23 @@ SpiralStairsPostCheck: .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 +;-------------------------------------------------------------------------------- -msu_init: +;================================================================================ +; Check if MSU-1 is enabled and scan for missing tracks +;-------------------------------------------------------------------------------- +MSUInit: PHP LDA NoBGM : BNE .done @@ -444,29 +463,34 @@ msu_init: PLA : DEC BRA .check_track -msu_main: +;-------------------------------------------------------------------------------- + +;================================================================================ +; 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 spc_continue + 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 + - BRL command_ff + BRL .command_ff + - LDA !REG_MSU_DELAYED_COMMAND : BEQ do_fade + LDA !REG_MSU_DELAYED_COMMAND : BEQ .do_fade -msu_check_busy: +.check_busy LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_BUSY : BEQ .ready - JML spc_continue + JML SPCContinue .ready LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BEQ .start - JML spc_continue + JML SPCContinue .start LDA !VAL_VOLUME_FULL STA !REG_TARGET_VOLUME @@ -486,13 +510,12 @@ msu_check_busy: +++ : STA !REG_MSU_CONTROL LDA.b #$00 STA !REG_MSU_DELAYED_COMMAND - JML spc_continue + JML SPCContinue -do_fade: - LDA !REG_CURRENT_VOLUME : CMP !REG_TARGET_VOLUME : BNE .continue - JML spc_continue -.continue - BCC .increment +.do_fade: + LDA !REG_CURRENT_VOLUME : CMP !REG_TARGET_VOLUME : BNE + + JML SPCContinue + + : BCC .increment .decrement SBC !VAL_VOLUME_DECREMENT : BCS .set .mute @@ -505,41 +528,41 @@ do_fade: .set STA !REG_CURRENT_VOLUME STA !REG_MSU_VOLUME - JML spc_continue + JML SPCContinue -command_ff: - CPX !VAL_COMMAND_LOAD_NEW_BANK : BNE command_f3 - JML spc_continue +.command_ff: + CPX !VAL_COMMAND_LOAD_NEW_BANK : BNE .command_f3 + JML SPCContinue -command_f3: - CPX !VAL_COMMAND_FULL_VOLUME : BNE command_f2 +.command_f3: + CPX !VAL_COMMAND_FULL_VOLUME : BNE .command_f2 STX !REG_SPC_CONTROL LDA !VAL_VOLUME_FULL STA !REG_TARGET_VOLUME - JML spc_continue + JML SPCContinue -command_f2: - CPX !VAL_COMMAND_FADE_HALF : BNE command_f1 +.command_f2: + CPX !VAL_COMMAND_FADE_HALF : BNE .command_f1 STX !REG_SPC_CONTROL LDA !VAL_VOLUME_HALF STA !REG_TARGET_VOLUME - JML spc_continue + JML SPCContinue -command_f1: - CPX !VAL_COMMAND_FADE_OUT : BNE command_f0 +.command_f1: + CPX !VAL_COMMAND_FADE_OUT : BNE .command_f0 STX !REG_SPC_CONTROL STZ !REG_TARGET_VOLUME STZ !REG_CURRENT_MSU_TRACK - JML spc_continue + JML SPCContinue -command_f0: - CPX !VAL_COMMAND_STOP_PLAYBACK : !BLT load_track +.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 spc_continue + ++ : JML SPCContinue -load_track: +.load_track: CPX !REG_CURRENT_MSU_TRACK : BNE + - : CPX #27 : BEQ + TXA @@ -590,9 +613,14 @@ load_track: LDA MSUExtendedFallbackList-1,X : BRA - + STA !REG_MUSIC_CONTROL - JML spc_continue + JML SPCContinue -fanfare_preload: +;-------------------------------------------------------------------------------- + +;================================================================================ +; Wait for the fanfare music to start, or else it can get skipped entirely +;-------------------------------------------------------------------------------- +FanfarePreload: STA !REG_MUSIC_CONTROL_REQUEST ; thing we wrote over PHA JSL CheckMusicLoadRequest @@ -600,8 +628,12 @@ fanfare_preload: PLA - : CMP !REG_SPC_CONTROL : BNE - JML AddReceivedItem_doneWithSoundEffects +;-------------------------------------------------------------------------------- -pendant_fanfare: +;================================================================================ +; Wait for pendant fanfare to finish +;-------------------------------------------------------------------------------- +PendantFanfareWait: LDA TournamentSeed : BNE .spc LDA FastFanfare : BNE .done REP #$20 @@ -614,15 +646,18 @@ pendant_fanfare: LDA !REG_MSU_DELAYED_COMMAND : BNE .continue LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_PLAYING : BEQ .done .continue - jml pendant_continue + jml PendantFanfareContinue .spc SEP #$20 LDA !REG_SPC_CONTROL : BNE .continue .done - jml pendant_done + jml PendantFanfareDone +;-------------------------------------------------------------------------------- - -crystal_fanfare: +;================================================================================ +; Wait for crystal fanfare to finish +;-------------------------------------------------------------------------------- +CrystalFanfareWait: LDA TournamentSeed : BNE .spc LDA FastFanfare : BNE .done REP #$20 @@ -635,24 +670,30 @@ crystal_fanfare: LDA !REG_MSU_DELAYED_COMMAND : BNE .continue LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_PLAYING : BEQ .done .continue - jml crystal_continue + jml CrystalFanfareContinue .spc SEP #$20 LDA !REG_SPC_CONTROL : BNE .continue .done - jml crystal_done + jml CrystalFanfareDone +;-------------------------------------------------------------------------------- - -startup_wait: +;================================================================================ +; 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 +;-------------------------------------------------------------------------------- - -ending_wait: +;================================================================================ +; 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 @@ -664,3 +705,4 @@ ending_wait: SEP #$20 LDA.b #$22 RTL +;-------------------------------------------------------------------------------- From aa30da01f9e709fa6c63f2b47d4f1bbde612fea2 Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Sat, 6 Jun 2020 17:57:32 -0700 Subject: [PATCH 4/6] Fix dark woods and mountain music w/7 crystals --- music.asm | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/music.asm b/music.asm index 72a1d2f..7973a49 100644 --- a/music.asm +++ b/music.asm @@ -179,7 +179,8 @@ Overworld_FinishMirrorWarp: ;-------------------------------------------------------------------------------- BirdTravel_LoadTargetAreaMusic: ; Skip village and lost woods checks if entering dark world or a special area - LDA $8A : CMP.b #$40 : !BGE .notVillageOrWoods + LDA $8A : CMP.b #$43 : BEQ .endOfLightWorldChecks + CMP.b #$40 : !BGE .notVillageOrWoods LDX.b #$07 ; Default village theme @@ -192,12 +193,12 @@ BirdTravel_LoadTargetAreaMusic: 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 + ;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 - + + ;LDA $7EF300 : AND.b #$40 : BEQ + + ; LDX.b #$02 ; Default light world theme + ;+ ; check if we are entering lost woods LDA $8A : BEQ .endOfLightWorldChecks @@ -228,13 +229,16 @@ BirdTravel_LoadTargetAreaMusic: ++ ; This music is used in dark death mountain - CMP.b #$43 : BEQ + : CMP.b #$45 : BEQ + : CMP.b #$47 : BEQ + + CMP.b #$43 : BEQ .darkMountain + ; CMP.b #$45 : BEQ .darkMountain + ; CMP.b #$47 : BEQ .darkMountain LDA.b #$05 : STA $012D BRA .checkInverted - + - LDX.b #$0D ; dark death mountain theme - LDA.b #$09 : STA $012D +.darkMountain + LDA $7EF37A : CMP.b #$7F : BEQ + + LDX.b #$0D ; dark death mountain theme + + : LDA.b #$09 : STA $012D ; if not inverted and light world, or inverted and dark world, skip moon pearl check .checkInverted From a87af78d1c5e5302f8dfeedd9970033c1359513a Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Sat, 6 Jun 2020 17:57:59 -0700 Subject: [PATCH 5/6] Fix MSU-1 fade overshoot --- msu.asm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/msu.asm b/msu.asm index 6865ce9..8e6d95e 100644 --- a/msu.asm +++ b/msu.asm @@ -517,13 +517,18 @@ MSUMain: JML SPCContinue + : BCC .increment .decrement - SBC !VAL_VOLUME_DECREMENT : BCS .set + SBC !VAL_VOLUME_DECREMENT : BCC .mute + CMP !REG_TARGET_VOLUME : !BGE .set + LDA !REG_TARGET_VOLUME : BRA .set .mute STZ !REG_CURRENT_VOLUME STZ !REG_MSU_CONTROL BRA .set .increment - ADC !VAL_VOLUME_INCREMENT : BCC .set + 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 From 114ef57fec1dffa162698db585730e8d3680c834 Mon Sep 17 00:00:00 2001 From: qwertymodo Date: Sat, 6 Jun 2020 18:00:03 -0700 Subject: [PATCH 6/6] Don't send fade commands to the SPC twice --- msu.asm | 3 --- 1 file changed, 3 deletions(-) diff --git a/msu.asm b/msu.asm index 8e6d95e..0333c20 100644 --- a/msu.asm +++ b/msu.asm @@ -541,21 +541,18 @@ MSUMain: .command_f3: CPX !VAL_COMMAND_FULL_VOLUME : BNE .command_f2 - STX !REG_SPC_CONTROL LDA !VAL_VOLUME_FULL STA !REG_TARGET_VOLUME JML SPCContinue .command_f2: CPX !VAL_COMMAND_FADE_HALF : BNE .command_f1 - STX !REG_SPC_CONTROL LDA !VAL_VOLUME_HALF STA !REG_TARGET_VOLUME JML SPCContinue .command_f1: CPX !VAL_COMMAND_FADE_OUT : BNE .command_f0 - STX !REG_SPC_CONTROL STZ !REG_TARGET_VOLUME STZ !REG_CURRENT_MSU_TRACK JML SPCContinue