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:
@@ -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
279
save.asm
@@ -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
|
||||||
|
|||||||
10
sram.asm
10
sram.asm
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user