Compute checksum for extended SRAM

Validate SRAM on file screen load and delete if checksum incorrect
This commit is contained in:
cassidoxa
2022-07-25 22:19:06 -04:00
parent 0e6e5d5b45
commit 10079a539b
3 changed files with 56 additions and 18 deletions

View File

@@ -188,7 +188,7 @@ JSL.l AltBufferTable : NOP #8 ; Delete screen
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $0CCCCC ;<- 64CCC - Bank0C.asm : 1628 (JSL Intro_ValidateSram) / Bank02.asm : 75 (REP #$30) org $0CCCCC ;<- 64CCC - Bank0C.asm : 1628 (JSL Intro_ValidateSram) / Bank02.asm : 75 (REP #$30)
; Explanation: In JP 1.0 the code for Intro_ValidateSram was inline in Bank 0C ; Explanation: In JP 1.0 the code for Intro_ValidateSram was inline in Bank 0C
JML.l Validate_SRAM ;(Return via RTL. Original code JML'd to Intro_LoadSpriteStats which returns with RTL, but we want to skip that) JML.l ValidateSRAM ;(Return via RTL. Original code JML'd to Intro_LoadSpriteStats which returns with RTL, but we want to skip that)
org $0CCD57 ;<- 64D57 - Bank0C.asm : org $0CCD57 ;<- 64D57 - Bank0C.asm :
RTL ;Just in case anybody ever removes the previous hook RTL ;Just in case anybody ever removes the previous hook
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -299,12 +299,17 @@ BRA +
;================================================================================ ;================================================================================
; Extended SRAM Save file ; Extended SRAM Save file
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $0ccf08 ; <- Bank0C.asm : 2036 (LDA.w #$0007 : STA $7EC00D : STA $7EC013) org $0CCF08 ; <- Bank0C.asm : 2036 (LDA.w #$0007 : STA $7EC00D : STA $7EC013)
JSL CopyExtendedSaveFileToWRAM JSL CopyExtendedSaveFileToWRAM
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $008998 ; <- Bank00.asm : 1296 (LDX.w #$0000) org $008998 ; <- Bank00.asm : 1296 (LDX.w #$0000)
JSL CopyExtendedWRAMSaveFileToSRAM JSL CopyExtendedWRAMSaveFileToSRAM
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $00899C ; <- bank_00.asm : #_00899C (CLC)
JSL WriteSaveChecksum
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
;--------------------------------------------------------------------------------
org $0CD7AB ; <- Bank0C.asm : 3342 (STA $700400, X) org $0CD7AB ; <- Bank0C.asm : 3342 (STA $700400, X)
JSL.l ClearExtendedSaveFile JSL.l ClearExtendedSaveFile
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -2807,4 +2812,4 @@ if !FEATURE_NEW_TEXT
JSL RenderCharSetColorExtended_init JSL RenderCharSetColorExtended_init
org $0EF285 org $0EF285
JSL RenderCharSetColorExtended_close : NOP JSL RenderCharSetColorExtended_close : NOP
endif endif

View File

@@ -1,12 +1,40 @@
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
Validate_SRAM: WriteSaveChecksum:
REP #$30 ; vanilla behavior from $0CCD45, includes prize pack reset after save and quit LDX.w #$0000 : TXA : - ; Checksum first $04FE bytes
LDX #$00FE : - CLC : ADC.l SaveDataWRAM, X
STZ $0D00, X INX #2
STZ $0E00, X CPX #$04FE : BNE -
STZ $0F00, X LDX.w #$0000 : - ; Checksum extended save data
DEX #2 CLC : ADC.l ExtendedFileNameWRAM, X
BPL - INX #2
CPX #$0FFE : BNE -
STA.b $00
LDA.w #$5A5A
SEC : SBC.b $00
STA.l $7004FE
RTL
;--------------------------------------------------------------------------------
ValidateSRAM:
REP #$30
LDX.w #$0000 : TXA : - ; Checksum first $04FE bytes
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 -
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
LDX.w #$00FE : - ; includes prize pack reset after save and quit
STZ $0D00, X
STZ $0E00, X
STZ $0F00, X
DEX #2
BPL -
SEP #$30 SEP #$30
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -23,6 +51,11 @@ ClearExtendedSaveFile:
STA $700D00, X STA $700D00, X
STA $700E00, X STA $700E00, X
STA $700F00, X STA $700F00, X
STA $701000, X
STA $701100, X
STA $701200, X
STA $701300, X
STA $701400, X
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
ClearExtendedWRAMSaveFile: ClearExtendedWRAMSaveFile:
@@ -125,5 +158,4 @@ CopyExtendedWRAMSaveFileToSRAM:
REP #$30 REP #$30
PLB PLB
PLA PLA
LDX.w #$0000 : TXA ; what we wrote over
RTL RTL

View File

@@ -10,6 +10,7 @@
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
pushpc pushpc
org 0 ; This module writes no bytes. Asar gives bank cross errors without this. org 0 ; This module writes no bytes. Asar gives bank cross errors without this.
SaveDataWRAM = $7EF000
;================================================================================ ;================================================================================
; Room Data ($7EF000 - $7EF27F ; Room Data ($7EF000 - $7EF27F
@@ -366,7 +367,7 @@ GTCollectedKeys: skip 1 ; / Ganon's Tower
skip 2 ; Reserved for previous table skip 2 ; Reserved for previous table
FileMarker: skip 1 ; $FF = Active save file | $00 = Inactive save file FileMarker: skip 1 ; $FF = Active save file | $00 = Inactive save file
skip 13 ; Unused skip 13 ; Unused
InverseChecksum: skip 2 ; Vanilla Inverse Checksum. Don't write unless computing checksum. InverseChecksumWRAM: skip 2 ; Vanilla Inverse Checksum. Don't write unless computing checksum.
;================================================================================ ;================================================================================
; Expanded SRAM ($7F6000 - $7F6FFF) ; Expanded SRAM ($7F6000 - $7F6FFF)
@@ -379,8 +380,7 @@ ExtendedFileNameWRAM: skip 24 ; File name, 12 word-length characters.
RoomPotData: skip 592 ; Table for expanded pot shuffle. One word per room. RoomPotData: skip 592 ; Table for expanded pot shuffle. One word per room.
SpritePotData: skip 592 ; Table for expanded pot shuffle. One word per room. SpritePotData: skip 592 ; Table for expanded pot shuffle. One word per room.
PurchaseCounts: skip 96 ; Keeps track of shop purchases PurchaseCounts: skip 96 ; Keeps track of shop purchases
PrivateBlock: skip 512 ; Reserved for 3rd party developers PrivateBlock: skip 513 ; Reserved for 3rd party developers
DummyValue: skip 1 ; $01 if you're a real dummy
;================================================================================ ;================================================================================
; Direct SRAM Assignments ($700000 - $7080000) ; Direct SRAM Assignments ($700000 - $7080000)
@@ -403,7 +403,8 @@ ProgressIndicatorSRAM: skip 1 ;
skip 19 ; skip 19 ;
FileNameVanillaSRAM: skip 8 ; First four characters of file name FileNameVanillaSRAM: skip 8 ; First four characters of file name
FileValiditySRAM: skip 2 ; FileValiditySRAM: skip 2 ;
skip 285 ; skip 283 ;
InverseChecksumSRAM: skip 2 ;
ExtendedFileNameSRAM: skip 24 ; We read and write the file name directly from and to SRAM (24 bytes) ExtendedFileNameSRAM: skip 24 ; We read and write the file name directly from and to SRAM (24 bytes)
skip $1AE4 ; skip $1AE4 ;
RomVersionSRAM: skip 4 ; ALTTPR ROM version. Low byte is the version, high byte writes RomVersionSRAM: skip 4 ; ALTTPR ROM version. Low byte is the version, high byte writes
@@ -515,7 +516,7 @@ endmacro
%assertSRAM(FollowerDropped, $7EF3D3) %assertSRAM(FollowerDropped, $7EF3D3)
%assertSRAM(FileNameVanillaWRAM, $7EF3D9) %assertSRAM(FileNameVanillaWRAM, $7EF3D9)
%assertSRAM(FileValidity, $7EF3E1) %assertSRAM(FileValidity, $7EF3E1)
%assertSRAM(InverseChecksum, $7EF4FE) %assertSRAM(InverseChecksumWRAM, $7EF4FE)
;================================================================================ ;================================================================================
; Randomizer Assertions ; Randomizer Assertions
@@ -640,7 +641,6 @@ endmacro
%assertSRAM(SpritePotData, $7F6268) %assertSRAM(SpritePotData, $7F6268)
%assertSRAM(PurchaseCounts, $7F64B8) %assertSRAM(PurchaseCounts, $7F64B8)
%assertSRAM(PrivateBlock, $7F6518) %assertSRAM(PrivateBlock, $7F6518)
%assertSRAM(DummyValue, $7F6718)
;================================================================================ ;================================================================================
; Direct SRAM Assertions ; Direct SRAM Assertions
@@ -654,6 +654,7 @@ endmacro
%assertSRAM(ProgressIndicatorSRAM, $7003C5) %assertSRAM(ProgressIndicatorSRAM, $7003C5)
%assertSRAM(FileNameVanillaSRAM, $7003D9) %assertSRAM(FileNameVanillaSRAM, $7003D9)
%assertSRAM(FileValiditySRAM, $7003E1) %assertSRAM(FileValiditySRAM, $7003E1)
%assertSRAM(InverseChecksumSRAM, $7004FE)
%assertSRAM(ExtendedFileNameSRAM, $700500) %assertSRAM(ExtendedFileNameSRAM, $700500)
%assertSRAM(RomNameSRAM, $702000) %assertSRAM(RomNameSRAM, $702000)
%assertSRAM(RomVersionSRAM, $701FFC) %assertSRAM(RomVersionSRAM, $701FFC)