From d8846a4ba9888c1ba31c32873e95bc8dec60763d Mon Sep 17 00:00:00 2001 From: cassidoxa Date: Fri, 29 Jul 2022 20:57:54 -0400 Subject: [PATCH] Add backup save that gets checked and loaded if main save is corrupt Add suffixes to instructions in save.asm Disable HDMA, NMI, and joypad during extended save DMA --- hooks.asm | 2 +- save.asm | 279 ++++++++++++++++++++++++++++++++---------------------- sram.asm | 10 +- 3 files changed, 175 insertions(+), 116 deletions(-) diff --git a/hooks.asm b/hooks.asm index 250201f..ede0106 100755 --- a/hooks.asm +++ b/hooks.asm @@ -306,7 +306,7 @@ org $008998 ; <- Bank00.asm : 1296 (LDX.w #$0000) JSL CopyExtendedWRAMSaveFileToSRAM ;-------------------------------------------------------------------------------- org $00899C ; <- bank_00.asm : #_00899C (CLC) -JSL WriteSaveChecksum +JSL WriteSaveChecksumAndBackup LDA.w #$01F3 : TCS : SEP #$30 : PLB : RTL ; Get the stack and data bank correct padbyte $FF : pad $0089C2 ; Fill adjacent free rom forward. See bank_00.asm: #_0089C2 ;-------------------------------------------------------------------------------- diff --git a/save.asm b/save.asm index 8c6f049..f2723be 100644 --- a/save.asm +++ b/save.asm @@ -1,161 +1,218 @@ ;-------------------------------------------------------------------------------- -WriteSaveChecksum: +WriteSaveChecksumAndBackup: LDX.w #$0000 : TXA : - ; Checksum first $04FE bytes CLC : ADC.l SaveDataWRAM, X INX #2 - CPX #$04FE : BNE - + CPX.w #$04FE : BNE - LDX.w #$0000 : - ; Checksum extended save data CLC : ADC.l ExtendedFileNameWRAM, X INX #2 - CPX #$0FFE : BNE - + CPX.w #$0FFE : BNE - STA.b $00 LDA.w #$5A5A SEC : SBC.b $00 - STA.l $7004FE + STA.l InverseChecksumSRAM + + PHB + LDA.w #$14FF ; \ + LDX.w #$0000 ; | Copies $1500 bytes from beginning of cart SRAM to + LDY.w #$4000 ; | $704000 + MVN $70, $70 ; / + PLB + RTL ;-------------------------------------------------------------------------------- ValidateSRAM: REP #$30 LDX.w #$0000 : TXA : - ; Checksum first $04FE bytes - CLC : ADC.l CartridgeSRAM,X + CLC : ADC.l CartridgeSRAM, X INX #2 CPX.w #$04FE : BNE - LDX.w #$0000 : - ; Checksum extended save data CLC : ADC.l ExtendedFileNameSRAM, X INX #2 - CPX #$0FFE : BNE - + CPX.w #$0FFE : BNE - STA.b $00 LDA.w #$5A5A SEC : SBC.b $00 - CMP.l InverseChecksumSRAM : BEQ + - TDC : STA.l FileValiditySRAM : + ; Delete save by way of zeroing validity marker + CMP.l InverseChecksumSRAM : BEQ .goodchecksum + LDX.w #$0000 : TXA : - ; Do the same for the backup save + CLC : ADC.l SaveBackupSRAM, X + INX #2 + CPX.w #$04FE : BNE - + LDX.w #$0000 : - + CLC : ADC.l SaveBackupSRAM+$500, X + INX #2 + CPX.w #$0FFE : BNE - + STA.b $00 + LDA.w #$5A5A + SEC : SBC.b $00 + CMP.l SaveBackupSRAM+$4FE : BEQ + + TDC : STA.l FileValiditySRAM ; Delete save by way of zeroing validity marker + BRA .goodchecksum : + + PHB + LDA.w #$14FF ; \ + LDX.w #$4000 ; | Copies $1500 bytes from backup on cart SRAM to + LDY.w #$0000 ; | main save location at $700000 + MVN $70, $70 ; / + PLB + + .goodchecksum LDX.w #$00FE : - ; includes prize pack reset after save and quit - STZ $0D00, X - STZ $0E00, X - STZ $0F00, X + STZ.w $0D00, X + STZ.w $0E00, X + STZ.w $0F00, X DEX #2 BPL - SEP #$30 RTL ;-------------------------------------------------------------------------------- ClearExtendedSaveFile: - STA $700400, X ; what we wrote over - STA $700500, X - STA $700600, X - STA $700700, X - STA $700800, X - STA $700900, X - STA $700A00, X - STA $700B00, X - STA $700C00, X - STA $700D00, X - STA $700E00, X - STA $700F00, X - STA $701000, X - STA $701100, X - STA $701200, X - STA $701300, X - STA $701400, X + STA.l $700400, X ; what we wrote over + STA.l $700500, X + STA.l $700600, X + STA.l $700700, X + STA.l $700800, X + STA.l $700900, X + STA.l $700A00, X + STA.l $700B00, X + STA.l $700C00, X + STA.l $700D00, X + STA.l $700E00, X + STA.l $700F00, X + STA.l $701000, X + STA.l $701100, X + STA.l $701200, X + STA.l $701300, X + STA.l $701400, X + ; Clear backup save + STA.l $704000, X + STA.l $704100, X + STA.l $704200, X + STA.l $704300, X + STA.l $704400, X + STA.l $704500, X + STA.l $704600, X + STA.l $704700, X + STA.l $704800, X + STA.l $704900, X + STA.l $704A00, X + STA.l $704B00, X + STA.l $704C00, X + STA.l $704D00, X + STA.l $704E00, X + STA.l $704F00, X + STA.l $705000, X + STA.l $705100, X + STA.l $705200, X + STA.l $705300, X + STA.l $705400, X RTL ;-------------------------------------------------------------------------------- ClearExtendedWRAMSaveFile: - STA $7EF400, X ; what we wrote over - STA $7F6000, X - STA $7F6100, X - STA $7F6200, X - STA $7F6300, X - STA $7F6400, X - STA $7F6500, X - STA $7F6600, X - STA $7F6700, X - STA $7F6800, X - STA $7F6900, X - STA $7F6A00, X - STA $7F6B00, X - STA $7F6C00, X - STA $7F6D00, X - STA $7F6E00, X - STA $7F6F00, X + STA.l $7EF400, X ; what we wrote over + STA.l $7F6000, X + STA.l $7F6100, X + STA.l $7F6200, X + STA.l $7F6300, X + STA.l $7F6400, X + STA.l $7F6500, X + STA.l $7F6600, X + STA.l $7F6700, X + STA.l $7F6800, X + STA.l $7F6900, X + STA.l $7F6A00, X + STA.l $7F6B00, X + STA.l $7F6C00, X + STA.l $7F6D00, X + STA.l $7F6E00, X + STA.l $7F6F00, X RTL ;-------------------------------------------------------------------------------- CopyExtendedSaveFileToWRAM: - PHA - SEP #$30 - LDA $4300 : PHA ; preserve DMA parameters - LDA $4301 : PHA ; preserve DMA parameters - LDA $4302 : PHA ; preserve DMA parameters - LDA $4303 : PHA ; preserve DMA parameters - LDA $4304 : PHA ; preserve DMA parameters - LDA $4305 : PHA ; preserve DMA parameters - LDA $4306 : PHA ; preserve DMA parameters - ;-------------------------------------------------------------------------------- - LDA #$00 : STA $4300 ; set DMA transfer direction A -> B, bus A auto increment, single-byte mode + PHA + SEP #$30 + LDA.w $4300 : PHA ; preserve DMA parameters + LDA.w $4301 : PHA ; preserve DMA parameters + LDA.w $4302 : PHA ; preserve DMA parameters + LDA.w $4303 : PHA ; preserve DMA parameters + LDA.w $4304 : PHA ; preserve DMA parameters + LDA.w $4305 : PHA ; preserve DMA parameters + LDA.w $4306 : PHA ; preserve DMA parameters + ;-------------------------------------------------------------------------------- + STZ.w $4200 ; Disable NMI, V/H, joypad + STZ.w $420C ; Disable HDMA + LDA.b #$00 : STA.w $4300 ; set DMA transfer direction A -> B, bus A auto increment, single-byte mode - LDA #$80 : STA $4301 ; set bus B source to WRAM register + LDA.b #$80 : STA.w $4301 ; set bus B source to WRAM register - LDA #$00 : STA $2181 ; set WRAM register source address - LDA #$60 : STA $2182 - LDA #$7F : STA $2183 + LDA.b #$00 : STA.w $2181 ; set WRAM register source address + LDA.b #$60 : STA.w $2182 + LDA.b #$7F : STA.w $2183 - STZ $4302 ; set bus A destination address to SRAM - LDA #$05 : STA $4303 - LDA #$70 : STA $4304 + STZ.w $4302 ; set bus A destination address to SRAM + LDA.b #$05 : STA.w $4303 + LDA.b #$70 : STA.w $4304 - LDA #$00 : STA $4305 ; set transfer size to 0x1000 - LDA #$10 : STA $4306 ; STZ $4307 + LDA.b #$00 : STA.w $4305 ; set transfer size to 0x1000 + LDA.b #$10 : STA.w $4306 ; STZ $4307 - LDA #$01 : STA $420B ; begin DMA transfer - ;-------------------------------------------------------------------------------- - PLA : STA $4306 ; restore DMA parameters - PLA : STA $4305 ; restore DMA parameters - PLA : STA $4304 ; restore DMA parameters - PLA : STA $4303 ; restore DMA parameters - PLA : STA $4302 ; restore DMA parameters - PLA : STA $4301 ; restore DMA parameters - PLA : STA $4300 ; restore DMA parameters - REP #$30 - PLA - STA $7EC00D ; what we wrote over + LDA.b #$01 : STA.w $420B ; begin DMA transfer + LDA.b #$81 : STA.w $4200 ; Re-enable NMI and joypad + ;-------------------------------------------------------------------------------- + PLA : STA.w $4306 ; restore DMA parameters + PLA : STA.w $4305 ; restore DMA parameters + PLA : STA.w $4304 ; restore DMA parameters + PLA : STA.w $4303 ; restore DMA parameters + PLA : STA.w $4302 ; restore DMA parameters + PLA : STA.w $4301 ; restore DMA parameters + PLA : STA.w $4300 ; restore DMA parameters + REP #$30 + PLA + STA $7EC00D ; what we wrote over RTL ;-------------------------------------------------------------------------------- CopyExtendedWRAMSaveFileToSRAM: - PHA - PHB - SEP #$30 - LDA #$00 : PHA : PLB - LDA $4300 : PHA ; preserve DMA parameters - LDA $4301 : PHA ; preserve DMA parameters - LDA $4302 : PHA ; preserve DMA parameters - LDA $4303 : PHA ; preserve DMA parameters - LDA $4304 : PHA ; preserve DMA parameters - LDA $4305 : PHA ; preserve DMA parameters - LDA $4306 : PHA ; preserve DMA parameters - ;-------------------------------------------------------------------------------- - LDA #$80 : STA $4300 ; set DMA transfer direction B -> A, bus A auto increment, single-byte mode + PHA + PHB + SEP #$30 + LDA #$00 : PHA : PLB + LDA.w $4300 : PHA ; preserve DMA parameters + LDA.w $4301 : PHA ; preserve DMA parameters + LDA.w $4302 : PHA ; preserve DMA parameters + LDA.w $4303 : PHA ; preserve DMA parameters + LDA.w $4304 : PHA ; preserve DMA parameters + LDA.w $4305 : PHA ; preserve DMA parameters + LDA.w $4306 : PHA ; preserve DMA parameters + ;-------------------------------------------------------------------------------- + STZ.w $4200 ; Disable NMI, V/H, joypad + STZ.w $420C ; Disable HDMA + LDA.b #$80 : STA.w $4300 ; set DMA transfer direction B -> A, bus A auto increment, single-byte mode - STA $4301 ; set bus B source to WRAM register + STA.w $4301 ; set bus B source to WRAM register - LDA #$00 : STA $2181 ; set WRAM register source address - LDA #$60 : STA $2182 - LDA #$7F : STA $2183 + LDA.b #$00 : STA.w $2181 ; set WRAM register source address + LDA.b #$60 : STA.w $2182 + LDA.b #$7F : STA.w $2183 - STZ $4302 ; set bus A destination address to SRAM - LDA #$05 : STA $4303 - LDA #$70 : STA $4304 + STZ.w $4302 ; set bus A destination address to SRAM + LDA.b #$05 : STA.w $4303 + LDA.b #$70 : STA.w $4304 - LDA #$10 : STA $4305 ; set transfer size to 0xB00 - LDA #$0B : STA $4306 ; STZ $4307 + LDA.b #$10 : STA.w $4305 ; set transfer size to 0xB00 + LDA.b #$0B : STA.w $4306 ; STZ $4307 - LDA #$01 : STA $420B ; begin DMA transfer - ;-------------------------------------------------------------------------------- - PLA : STA $4306 ; restore DMA parameters - PLA : STA $4305 ; restore DMA parameters - PLA : STA $4304 ; restore DMA parameters - PLA : STA $4303 ; restore DMA parameters - PLA : STA $4302 ; restore DMA parameters - PLA : STA $4301 ; restore DMA parameters - PLA : STA $4300 ; restore DMA parameters - REP #$30 - PLB - PLA + LDA.b #$01 : STA.w $420B ; begin DMA transfer + LDA.b #$81 : STA.w $4200 ; Re-enable NMI and joypad + ;-------------------------------------------------------------------------------- + PLA : STA.w $4306 ; restore DMA parameters + PLA : STA.w $4305 ; restore DMA parameters + PLA : STA.w $4304 ; restore DMA parameters + PLA : STA.w $4303 ; restore DMA parameters + PLA : STA.w $4302 ; restore DMA parameters + PLA : STA.w $4301 ; restore DMA parameters + PLA : STA.w $4300 ; restore DMA parameters + REP #$30 + PLB + PLA RTL diff --git a/sram.asm b/sram.asm index 687e6ba..54ec69f 100644 --- a/sram.asm +++ b/sram.asm @@ -411,9 +411,10 @@ RomVersionSRAM: skip 4 ; ALTTPR ROM version. Low byte is the version, h ; $01 for now (32-bits total) RomNameSRAM: skip 21 ; ROM name from $FFC0, burned in during init (21 bytes) ; If value in the ROM doesn't match SRAM, save is cleared. -skip 4075 ; PasswordSRAM: skip 16 ; Password value (16 bytes) - +skip 8155 ; +SaveBackupSRAM: ; Backup copy of save ram. Game will attempt to use this if + ; checksum on file select screen load fails. base off ;================================================================================ @@ -656,8 +657,9 @@ endmacro %assertSRAM(FileValiditySRAM, $7003E1) %assertSRAM(InverseChecksumSRAM, $7004FE) %assertSRAM(ExtendedFileNameSRAM, $700500) -%assertSRAM(RomNameSRAM, $702000) %assertSRAM(RomVersionSRAM, $701FFC) -%assertSRAM(PasswordSRAM, $703000) +%assertSRAM(RomNameSRAM, $702000) +%assertSRAM(PasswordSRAM, $702015) +%assertSRAM(SaveBackupSRAM, $704000) pullpc