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
This commit is contained in:
cassidoxa
2022-07-29 20:57:54 -04:00
parent 10079a539b
commit d8846a4ba9
3 changed files with 175 additions and 116 deletions

View File

@@ -306,7 +306,7 @@ org $008998 ; <- Bank00.asm : 1296 (LDX.w #$0000)
JSL CopyExtendedWRAMSaveFileToSRAM JSL CopyExtendedWRAMSaveFileToSRAM
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $00899C ; <- bank_00.asm : #_00899C (CLC) 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 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 padbyte $FF : pad $0089C2 ; Fill adjacent free rom forward. See bank_00.asm: #_0089C2
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------

279
save.asm
View File

@@ -1,161 +1,218 @@
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
WriteSaveChecksum: WriteSaveChecksumAndBackup:
LDX.w #$0000 : TXA : - ; Checksum first $04FE bytes LDX.w #$0000 : TXA : - ; Checksum first $04FE bytes
CLC : ADC.l SaveDataWRAM, X CLC : ADC.l SaveDataWRAM, X
INX #2 INX #2
CPX #$04FE : BNE - CPX.w #$04FE : BNE -
LDX.w #$0000 : - ; Checksum extended save data LDX.w #$0000 : - ; Checksum extended save data
CLC : ADC.l ExtendedFileNameWRAM, X CLC : ADC.l ExtendedFileNameWRAM, X
INX #2 INX #2
CPX #$0FFE : BNE - CPX.w #$0FFE : BNE -
STA.b $00 STA.b $00
LDA.w #$5A5A LDA.w #$5A5A
SEC : SBC.b $00 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 RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
ValidateSRAM: ValidateSRAM:
REP #$30 REP #$30
LDX.w #$0000 : TXA : - ; Checksum first $04FE bytes LDX.w #$0000 : TXA : - ; Checksum first $04FE bytes
CLC : ADC.l CartridgeSRAM,X CLC : ADC.l CartridgeSRAM, X
INX #2 INX #2
CPX.w #$04FE : BNE - CPX.w #$04FE : BNE -
LDX.w #$0000 : - ; Checksum extended save data LDX.w #$0000 : - ; Checksum extended save data
CLC : ADC.l ExtendedFileNameSRAM, X CLC : ADC.l ExtendedFileNameSRAM, X
INX #2 INX #2
CPX #$0FFE : BNE - CPX.w #$0FFE : BNE -
STA.b $00 STA.b $00
LDA.w #$5A5A LDA.w #$5A5A
SEC : SBC.b $00 SEC : SBC.b $00
CMP.l InverseChecksumSRAM : BEQ + CMP.l InverseChecksumSRAM : BEQ .goodchecksum
TDC : STA.l FileValiditySRAM : + ; Delete save by way of zeroing validity marker 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 LDX.w #$00FE : - ; includes prize pack reset after save and quit
STZ $0D00, X STZ.w $0D00, X
STZ $0E00, X STZ.w $0E00, X
STZ $0F00, X STZ.w $0F00, X
DEX #2 DEX #2
BPL - BPL -
SEP #$30 SEP #$30
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
ClearExtendedSaveFile: ClearExtendedSaveFile:
STA $700400, X ; what we wrote over STA.l $700400, X ; what we wrote over
STA $700500, X STA.l $700500, X
STA $700600, X STA.l $700600, X
STA $700700, X STA.l $700700, X
STA $700800, X STA.l $700800, X
STA $700900, X STA.l $700900, X
STA $700A00, X STA.l $700A00, X
STA $700B00, X STA.l $700B00, X
STA $700C00, X STA.l $700C00, X
STA $700D00, X STA.l $700D00, X
STA $700E00, X STA.l $700E00, X
STA $700F00, X STA.l $700F00, X
STA $701000, X STA.l $701000, X
STA $701100, X STA.l $701100, X
STA $701200, X STA.l $701200, X
STA $701300, X STA.l $701300, X
STA $701400, 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 RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
ClearExtendedWRAMSaveFile: ClearExtendedWRAMSaveFile:
STA $7EF400, X ; what we wrote over STA.l $7EF400, X ; what we wrote over
STA $7F6000, X STA.l $7F6000, X
STA $7F6100, X STA.l $7F6100, X
STA $7F6200, X STA.l $7F6200, X
STA $7F6300, X STA.l $7F6300, X
STA $7F6400, X STA.l $7F6400, X
STA $7F6500, X STA.l $7F6500, X
STA $7F6600, X STA.l $7F6600, X
STA $7F6700, X STA.l $7F6700, X
STA $7F6800, X STA.l $7F6800, X
STA $7F6900, X STA.l $7F6900, X
STA $7F6A00, X STA.l $7F6A00, X
STA $7F6B00, X STA.l $7F6B00, X
STA $7F6C00, X STA.l $7F6C00, X
STA $7F6D00, X STA.l $7F6D00, X
STA $7F6E00, X STA.l $7F6E00, X
STA $7F6F00, X STA.l $7F6F00, X
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
CopyExtendedSaveFileToWRAM: CopyExtendedSaveFileToWRAM:
PHA PHA
SEP #$30 SEP #$30
LDA $4300 : PHA ; preserve DMA parameters LDA.w $4300 : PHA ; preserve DMA parameters
LDA $4301 : PHA ; preserve DMA parameters LDA.w $4301 : PHA ; preserve DMA parameters
LDA $4302 : PHA ; preserve DMA parameters LDA.w $4302 : PHA ; preserve DMA parameters
LDA $4303 : PHA ; preserve DMA parameters LDA.w $4303 : PHA ; preserve DMA parameters
LDA $4304 : PHA ; preserve DMA parameters LDA.w $4304 : PHA ; preserve DMA parameters
LDA $4305 : PHA ; preserve DMA parameters LDA.w $4305 : PHA ; preserve DMA parameters
LDA $4306 : PHA ; preserve DMA parameters LDA.w $4306 : PHA ; preserve DMA parameters
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
LDA #$00 : STA $4300 ; set DMA transfer direction A -> B, bus A auto increment, single-byte mode 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.b #$00 : STA.w $2181 ; set WRAM register source address
LDA #$60 : STA $2182 LDA.b #$60 : STA.w $2182
LDA #$7F : STA $2183 LDA.b #$7F : STA.w $2183
STZ $4302 ; set bus A destination address to SRAM STZ.w $4302 ; set bus A destination address to SRAM
LDA #$05 : STA $4303 LDA.b #$05 : STA.w $4303
LDA #$70 : STA $4304 LDA.b #$70 : STA.w $4304
LDA #$00 : STA $4305 ; set transfer size to 0x1000 LDA.b #$00 : STA.w $4305 ; set transfer size to 0x1000
LDA #$10 : STA $4306 ; STZ $4307 LDA.b #$10 : STA.w $4306 ; STZ $4307
LDA #$01 : STA $420B ; begin DMA transfer LDA.b #$01 : STA.w $420B ; begin DMA transfer
;-------------------------------------------------------------------------------- LDA.b #$81 : STA.w $4200 ; Re-enable NMI and joypad
PLA : STA $4306 ; restore DMA parameters ;--------------------------------------------------------------------------------
PLA : STA $4305 ; restore DMA parameters PLA : STA.w $4306 ; restore DMA parameters
PLA : STA $4304 ; restore DMA parameters PLA : STA.w $4305 ; restore DMA parameters
PLA : STA $4303 ; restore DMA parameters PLA : STA.w $4304 ; restore DMA parameters
PLA : STA $4302 ; restore DMA parameters PLA : STA.w $4303 ; restore DMA parameters
PLA : STA $4301 ; restore DMA parameters PLA : STA.w $4302 ; restore DMA parameters
PLA : STA $4300 ; restore DMA parameters PLA : STA.w $4301 ; restore DMA parameters
REP #$30 PLA : STA.w $4300 ; restore DMA parameters
PLA REP #$30
STA $7EC00D ; what we wrote over PLA
STA $7EC00D ; what we wrote over
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
CopyExtendedWRAMSaveFileToSRAM: CopyExtendedWRAMSaveFileToSRAM:
PHA PHA
PHB PHB
SEP #$30 SEP #$30
LDA #$00 : PHA : PLB LDA #$00 : PHA : PLB
LDA $4300 : PHA ; preserve DMA parameters LDA.w $4300 : PHA ; preserve DMA parameters
LDA $4301 : PHA ; preserve DMA parameters LDA.w $4301 : PHA ; preserve DMA parameters
LDA $4302 : PHA ; preserve DMA parameters LDA.w $4302 : PHA ; preserve DMA parameters
LDA $4303 : PHA ; preserve DMA parameters LDA.w $4303 : PHA ; preserve DMA parameters
LDA $4304 : PHA ; preserve DMA parameters LDA.w $4304 : PHA ; preserve DMA parameters
LDA $4305 : PHA ; preserve DMA parameters LDA.w $4305 : PHA ; preserve DMA parameters
LDA $4306 : PHA ; preserve DMA parameters LDA.w $4306 : PHA ; preserve DMA parameters
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
LDA #$80 : STA $4300 ; set DMA transfer direction B -> A, bus A auto increment, single-byte mode 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.b #$00 : STA.w $2181 ; set WRAM register source address
LDA #$60 : STA $2182 LDA.b #$60 : STA.w $2182
LDA #$7F : STA $2183 LDA.b #$7F : STA.w $2183
STZ $4302 ; set bus A destination address to SRAM STZ.w $4302 ; set bus A destination address to SRAM
LDA #$05 : STA $4303 LDA.b #$05 : STA.w $4303
LDA #$70 : STA $4304 LDA.b #$70 : STA.w $4304
LDA #$10 : STA $4305 ; set transfer size to 0xB00 LDA.b #$10 : STA.w $4305 ; set transfer size to 0xB00
LDA #$0B : STA $4306 ; STZ $4307 LDA.b #$0B : STA.w $4306 ; STZ $4307
LDA #$01 : STA $420B ; begin DMA transfer LDA.b #$01 : STA.w $420B ; begin DMA transfer
;-------------------------------------------------------------------------------- LDA.b #$81 : STA.w $4200 ; Re-enable NMI and joypad
PLA : STA $4306 ; restore DMA parameters ;--------------------------------------------------------------------------------
PLA : STA $4305 ; restore DMA parameters PLA : STA.w $4306 ; restore DMA parameters
PLA : STA $4304 ; restore DMA parameters PLA : STA.w $4305 ; restore DMA parameters
PLA : STA $4303 ; restore DMA parameters PLA : STA.w $4304 ; restore DMA parameters
PLA : STA $4302 ; restore DMA parameters PLA : STA.w $4303 ; restore DMA parameters
PLA : STA $4301 ; restore DMA parameters PLA : STA.w $4302 ; restore DMA parameters
PLA : STA $4300 ; restore DMA parameters PLA : STA.w $4301 ; restore DMA parameters
REP #$30 PLA : STA.w $4300 ; restore DMA parameters
PLB REP #$30
PLA PLB
PLA
RTL RTL

View File

@@ -411,9 +411,10 @@ RomVersionSRAM: skip 4 ; ALTTPR ROM version. Low byte is the version, h
; $01 for now (32-bits total) ; $01 for now (32-bits total)
RomNameSRAM: skip 21 ; ROM name from $FFC0, burned in during init (21 bytes) 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. ; If value in the ROM doesn't match SRAM, save is cleared.
skip 4075 ;
PasswordSRAM: skip 16 ; Password value (16 bytes) 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 base off
;================================================================================ ;================================================================================
@@ -656,8 +657,9 @@ endmacro
%assertSRAM(FileValiditySRAM, $7003E1) %assertSRAM(FileValiditySRAM, $7003E1)
%assertSRAM(InverseChecksumSRAM, $7004FE) %assertSRAM(InverseChecksumSRAM, $7004FE)
%assertSRAM(ExtendedFileNameSRAM, $700500) %assertSRAM(ExtendedFileNameSRAM, $700500)
%assertSRAM(RomNameSRAM, $702000)
%assertSRAM(RomVersionSRAM, $701FFC) %assertSRAM(RomVersionSRAM, $701FFC)
%assertSRAM(PasswordSRAM, $703000) %assertSRAM(RomNameSRAM, $702000)
%assertSRAM(PasswordSRAM, $702015)
%assertSRAM(SaveBackupSRAM, $704000)
pullpc pullpc