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