Identify save data structure

TODO: label save functions
This commit is contained in:
earthoul 2026-01-11 00:36:56 +09:00
parent b49d2e2b06
commit 6907dcbc08
No known key found for this signature in database
GPG Key ID: 9049439C902677E4
5 changed files with 933 additions and 776 deletions

76
src/data/save.asm Normal file
View File

@ -0,0 +1,76 @@
MACRO wram_sram_map
dw \1 ; WRAM address
dw \2 ; number of bytes
db \3 ; min allowed value
db \4 ; max allowed value
ENDM
; maps WRAM addresses to SRAM addresses in order
; to save and subsequently retrieve them on game load
; in tcg1, it used to check if the values saved in SRAM
; were valid within the given range,
; but the valid range is now $00$ff (anything) for all values
; 441 bytes
WRAMToSRAMMapper_GeneralSave::
wram_sram_map wPlayTimeCounter + 0, 1, $00, $ff
wram_sram_map wPlayTimeCounter + 1, 1, $00, $ff
wram_sram_map wPlayTimeCounter + 2, 1, $00, $ff
wram_sram_map wPlayTimeCounter + 3, 2, $00, $ff
wram_sram_map wCurMusic, 1, $00, $ff
wram_sram_map wNextGameEvent, 1, $00, $ff
wram_sram_map wNextWarpMap, 1, $00, $ff
wram_sram_map wd54e, 2, $00, $ff
wram_sram_map wPlayerOWObject, 1, $00, $ff
wram_sram_map wCurMapScriptsBank, 1, $00, $ff
wram_sram_map wCurMapScriptsPointer, 2, $00, $ff
wram_sram_map wOverworldMode, 1, $00, $ff
wram_sram_map wOverworldTransition, 1, $00, $ff
wram_sram_map wPrevMap, 1, $00, $ff
wram_sram_map wTempPrevMap, 1, $00, $ff
wram_sram_map wCurMap, 1, $00, $ff
wram_sram_map wCurOWLocation, 1, $00, $ff
wram_sram_map wCurIsland, 1, $00, $ff
wram_sram_map wPlayerOWLocation, 1, $00, $ff
wram_sram_map wNextMapHeaderData, MAPHEADERSTRUCT_LENGTH, $00, $ff
wram_sram_map wNextWarpPlayerData, 3, $00, $ff
wram_sram_map wScriptNPC, 1, $00, $ff
wram_sram_map wScriptNPCName, 2, $00, $ff
wram_sram_map wSentMailBitfield, 4, $00, $ff
wram_sram_map wTempCardDungeonBet, 1, $00, $ff
wram_sram_map wEventVars, EVENT_VAR_BYTES - 2, $00, $ff
wram_sram_map wGeneralVars, GENERAL_VAR_BYTES - 2, $00, $ff
wram_sram_map wOWData, 177, $00, $ff
wram_sram_map wd98b, 5 * MAX_NUM_OW_OBJECTS, $00, $ff
wram_sram_map wScrollTargetObject, 1, $00, $ff
wram_sram_map wSelectedCoin, 1, $00, $ff
wram_sram_map wCoinPage, 1, $00, $ff
wram_sram_map wPauseMenuCursorPosition, 1, $00, $ff
wram_sram_map wMinicomMenuCursorPosition, 1, $00, $ff
wram_sram_map wdc06, 1, $00, $ff
wram_sram_map wNumMailInQueue, 1, $00, $ff
wram_sram_map wMailQueue, MAIL_QUEUE_BUFFER_SIZE, $00, $ff
wram_sram_map wMailCount, 1, $00, $ff
wram_sram_map wMailList, MAIL_BUFFER_SIZE, $00, $ff
wram_sram_map wNewMail, 1, $00, $ff
wram_sram_map wTempNumMailInQueue, 1, $00, $ff
wram_sram_map wMailboxPage, 1, $00, $ff
wram_sram_map wSelectedMailCursorPosition, 1, $00, $ff
wram_sram_map wMailOptionSelected, 1, $00, $ff
wram_sram_map wBlackBoxCardReceived, BLACK_BOX_OUTPUT_BYTES, $00, $ff
wram_sram_map wBillsPCCardReceived, 2, $00, $ff
wram_sram_map wPCMenuCursorPosition, 1, $00, $ff
wram_sram_map wGameCenterChips, 2, $00, $ff
wram_sram_map wGameCenterBankedChips, 2, $00, $ff
wram_sram_map wdb1f, 1, $00, $ff
wram_sram_map wOWObj1Flags, 1, $00, $ff
dw NULL
; 64 bytes
WRAMToSRAMMapper_ChallengeMachineSave::
wram_sram_map wddf9, 20, $00, $ff
wram_sram_map wde0d, 4, $00, $ff
wram_sram_map wde11, 4, $00, $ff
wram_sram_map wde15, 4, $00, $ff
wram_sram_map wde19, 32, $00, $ff
dw NULL

View File

@ -337,8 +337,8 @@ Func_c24d:
xor a
ld [wNextGameEvent], a
ld [wNextWarpMap], a
ld [wd54e], a
ld [wd54f], a
ld [wd54e + 0], a
ld [wd54e + 1], a
ld [wCurMapScriptsBank], a
ld [wCurMapScriptsPointer + 0], a
ld [wCurMapScriptsPointer + 1], a
@ -4486,764 +4486,8 @@ ScriptCommand_WaitInput:
call WaitForWideTextBoxInput
jp IncreaseScriptPointerBy1
; returns carry if no save data
Func_e883:
ldh a, [hBankSRAM]
push af
ld a, BANK("SRAM2")
call BankswitchSRAM
call EnableSRAM
ld a, [$baa3]
ld b, a
pop af
call BankswitchSRAM
call DisableSRAM
ld a, b
bit 0, a
jr z, .set_carry
; no carry
scf
ccf
ret
.set_carry
scf
ret
Func_e8a3:
call EnableSRAM
ld a, [$baa3]
ld b, a
call DisableSRAM
ld a, b
bit 1, a
jr z, .asm_e8b5
scf
ccf
ret
.asm_e8b5
scf
ret
Func_e8b7:
ld a, BANK("SRAM2")
ld [wd668], a
ldh a, [hBankSRAM]
push af
ld a, BANK("SRAM2")
call BankswitchSRAM
ld a, [$b800]
ld b, a
pop af
call BankswitchSRAM
call DisableSRAM
ld a, b
cp $16
jr nz, .asm_e918
ld a, LOW($6dec)
ld [wd66f], a
ld a, HIGH($6dec)
ld [wd66f + 1], a
ld a, LOW($b801)
ld [wd671], a
ld a, HIGH($b801)
ld [wd671 + 1], a
call Func_ea19
call Func_ed7c
ld a, [wd66d]
ld d, a
ld a, [wd66c]
ld e, a
ldh a, [hBankSRAM]
push af
ld a, BANK("SRAM2")
call BankswitchSRAM
ld a, [$baa0]
ld b, a
ld a, [$baa1]
ld c, a
pop af
call BankswitchSRAM
call DisableSRAM
ld a, b
cp d
jr nz, .asm_e918
ld a, c
cp e
jr nz, .asm_e918
scf
ccf
ret
.asm_e918
scf
ret
Func_e91a:
xor a ; BANK("SRAM0")
ld [wd668], a
ldh a, [hBankSRAM]
push af
xor a ; BANK("SRAM0")
call BankswitchSRAM
ld a, [$b800]
ld b, a
pop af
call BankswitchSRAM
call DisableSRAM
ld a, b
cp $16
jr nz, .asm_e978
ld a, LOW($6dec)
ld [wd66f], a
ld a, HIGH($6dec)
ld [wd66f + 1], a
ld a, LOW($b801)
ld [wd671], a
ld a, HIGH($b801)
ld [wd671 + 1], a
call Func_ea19
call Func_ed7c
ld a, [wd66d]
ld d, a
ld a, [wd66c]
ld e, a
ldh a, [hBankSRAM]
push af
xor a
call BankswitchSRAM
ld a, [$baa0]
ld b, a
ld a, [$baa1]
ld c, a
pop af
call BankswitchSRAM
call DisableSRAM
ld a, b
cp d
jr nz, .asm_e978
ld a, c
cp e
jr nz, .asm_e978
scf
ccf
ret
.asm_e978
scf
ret
Func_e97a:
ldh a, [hBankSRAM]
push af
ld a, BANK("SRAM2")
call BankswitchSRAM
ld hl, $baa3
xor a
ld [hl], a
ld [$b800], a
pop af
call BankswitchSRAM
call DisableSRAM
call EnableSRAM
ld hl, $baa3
xor a
ld [hl], a
ld [$b800], a
call DisableSRAM
farcall ClearSavedDuel
call DisableSRAM
ret
Func_e9a7:
call EnableSRAM
ld hl, $baa3
xor a
ld [hl], a
call DisableSRAM
farcall ClearSavedDuel
ret
Func_e9b7:
ld a, 2
call BulkCopySRAM
ldh a, [hBankSRAM]
push af
ld a, BANK("SRAM2")
call BankswitchSRAM
ld a, $16
ld [$b800], a
ld hl, $baa3
set 0, [hl]
pop af
call BankswitchSRAM
call DisableSRAM
ret
; sram copy
; a = 0: sCardAndDeckSaveData onwards, from SRAM2 to SRAM0
; a = 1: sCardAndDeckSaveData onwards, from SRAM0 to SRAM2
; a = 2: all, from SRAM0 to SRAM2
BulkCopySRAM:
cp 1
jr z, .from_sram0_to_sram2
jr nc, .all_from_sram0_to_sram2
; from sram2 to sram0
ld e, BANK("SRAM2")
ld d, BANK("SRAM0")
jr .card_deck_onwards
.from_sram0_to_sram2
ld e, BANK("SRAM0")
ld d, BANK("SRAM2")
jr .card_deck_onwards
.all_from_sram0_to_sram2
ld e, BANK("SRAM0")
ld d, BANK("SRAM2")
ldh a, [hBankSRAM]
push af
ld bc, SIZEOF(SRAM)
ld hl, STARTOF(SRAM)
jr .loop_copy
.card_deck_onwards
ldh a, [hBankSRAM]
push af
ld bc, SIZEOF(SRAM) - (sCardAndDeckSaveData - STARTOF(SRAM))
ld hl, sCardAndDeckSaveData
.loop_copy
ld a, e
call BankswitchSRAM
ld a, [hl]
push af
ld a, d
call BankswitchSRAM
pop af
ld [hli], a
dec bc
ld a, b
or c
jr nz, .loop_copy
pop af
call BankswitchSRAM
call DisableSRAM
ret
Func_ea19:
ldh a, [hBankSRAM]
push af
ld a, [wd668]
call BankswitchSRAM
ld a, [$baa2]
ld [wd673], a
pop af
call BankswitchSRAM
call DisableSRAM
ret
Func_ea30::
ld a, OWMODE_SAVE_PRELOAD
call ExecuteOWModeScript
farcall Func_10f32
xor a ; BANK("SRAM0")
ld [wd668], a
.asm_ea3d
ld a, LOW($6dec)
ld [wd66f], a
ld a, HIGH($6dec)
ld [wd66f + 1], a
ld a, LOW($b801)
ld [wd671], a
ld a, HIGH($b801)
ld [wd671 + 1], a
call Func_ec94
call EnableSRAM
ld a, $16
ld [$b800], a
ld a, [wd66d]
ld [$baa0], a
ld a, [wd66c]
ld [$baa1], a
ld a, [wd673]
ld [$baa2], a
ld hl, $baa3
set 0, [hl]
call DisableSRAM
call Func_ea19
call Func_ed7c
ld a, [wd66d]
ld d, a
ld a, [wd66c]
ld e, a
call EnableSRAM
ld a, [$baa0]
ld b, a
ld a, [$baa1]
ld c, a
call DisableSRAM
ld a, b
cp d
jr nz, .error
ld a, c
cp e
jr nz, .error
ld a, 1
call BulkCopySRAM
ld a, OWMODE_SAVE_POSTLOAD
call ExecuteOWModeScript
ret
.error
debug_nop
jr .asm_ea3d
Func_eaa8:
farcall Func_10f32
xor a ; BANK("SRAM0")
ld [wd668], a
ld a, LOW($6dec)
ld [wd66f], a
ld a, HIGH($6dec)
ld [wd66f + 1], a
ld a, LOW($b801)
ld [wd671], a
ld a, HIGH($b801)
ld [wd671 + 1], a
call Func_ec94
call EnableSRAM
ld a, $16
ld [$b800], a
ld a, [wd66d]
ld [$baa0], a
ld a, [wd66c]
ld [$baa1], a
ld a, [wd673]
ld [$baa2], a
ld hl, $baa3
set 1, [hl]
call DisableSRAM
ret
Func_eaea:
call Func_eaf6
xor a
call BulkCopySRAM
farcall Func_10f78
ret
Func_eaf6:
ld a, BANK("SRAM2")
ld [wd668], a
ld a, LOW($6dec)
ld [wd66f], a
ld a, HIGH($6dec)
ld [wd66f + 1], a
ld a, LOW($b801)
ld [wd671], a
ld a, HIGH($b801)
ld [wd671 + 1], a
call Func_ea19
call Func_ed0b
ret
Func_eb16:
xor a ; BANK("SRAM0")
ld [wd668], a
ld a, LOW($6dec)
ld [wd66f], a
ld a, HIGH($6dec)
ld [wd66f + 1], a
ld a, LOW($b801)
ld [wd671], a
ld a, HIGH($b801)
ld [wd671 + 1], a
call Func_ea19
call Func_ed0b
farcall Func_10f78
ret
Func_eb39:
ld hl, wddf9
xor a
ld c, $14
.loop_init
ld [hli], a
dec c
jr nz, .loop_init
; init verbosely from wde0d to wde17
ld hl, wde0d
xor a
REPT 4
ld [hli], a
ENDR
ld hl, wde11
xor a
REPT 4
ld [hli], a
ENDR
ld hl, wde15
xor a
REPT 4
ld [hli], a
ENDR
ld a, $01
ld [wde15], a
ld a, $05
ld [wde17], a
ld hl, .data
ld de, wde19
ld c, $20
.loop_copy
ld a, [hli]
ld [de], a
inc de
dec c
jr nz, .loop_copy
call Func_ec38
ret
.data
db $04, $13, $79, $15, $0f, $6b, $0f, $34, $0f, $2f, $0f, $00, $00, $00, $00, $00, $4e, $0f, $39, $0f, $38, $0f, $5f, $0f, $21, $0f, $00, $00, $00, $00, $00, $00
SECTION "Bank 3@6b97", ROMX[$6b97], BANK[$3]
Func_eb97:
call Func_ebc6
jr nc, .asm_eb9f
call Func_eb39
.asm_eb9f
call Func_ec6c
; init verbosely from wde0d to wde13
ld hl, wde0d
xor a
REPT 4
ld [hli], a
ENDR
ld hl, wde11
xor a
REPT 4
ld [hli], a
ENDR
call Func_ec38
ret
Func_ebb6:
call EnableSRAM
xor a
ld [$bae5], a
ld a, $ff
ld [$bae4], a
call DisableSRAM
ret
Func_ebc6:
xor a ; BANK("SRAM0")
ld [wd668], a
ld a, LOW($6f20)
ld [wd66f], a
ld a, HIGH($6f20)
ld [wd66f + 1], a
ld a, LOW($baa4)
ld [wd671], a
ld a, HIGH($baa4)
ld [wd671 + 1], a
call EnableSRAM
ld a, [$bae6]
ld [wd673], a
call DisableSRAM
call Func_ed0b
ld a, [wd66d]
ld d, a
ld a, [wd66c]
ld e, a
call EnableSRAM
ld a, [$bae4]
ld b, a
ld a, [$bae5]
ld c, a
call DisableSRAM
ld a, b
cp d
jr nz, .asm_ec36
ld a, c
cp e
jr nz, .asm_ec36
ld a, [wde15 + 0]
ld e, a
ld a, [wde15 + 1]
ld d, a
cp16_long 0
jr z, .asm_ec36
ld a, [wde17 + 0]
ld e, a
ld a, [wde17 + 1]
ld d, a
cp16_long 0
jr z, .asm_ec36
scf
ccf
ret
.asm_ec36
scf
ret
Func_ec38:
xor a ; BANK("SRAM0")
ld [wd668], a
ld a, LOW($6f20)
ld [wd66f], a
ld a, HIGH($6f20)
ld [wd66f + 1], a
ld a, LOW($baa4)
ld [wd671], a
ld a, HIGH($baa4)
ld [wd671 + 1], a
call Func_ec94
call EnableSRAM
ld a, [wd66d]
ld [$bae4], a
ld a, [wd66c]
ld [$bae5], a
ld a, [wd673]
ld [$bae6], a
call DisableSRAM
ret
Func_ec6c:
xor a ; BANK("SRAM0")
ld [wd668], a
ld a, LOW($6f20)
ld [wd66f], a
ld a, HIGH($6f20)
ld [wd66f + 1], a
ld a, LOW($baa4)
ld [wd671], a
ld a, HIGH($baa4)
ld [wd671 + 1], a
call EnableSRAM
ld a, [$bae6]
ld [wd673], a
call DisableSRAM
call Func_ed0b
ret
Func_ec94:
ldh a, [hBankSRAM]
push af
ld a, [wd668]
call BankswitchSRAM
xor a
ld [wd66c], a
ld [wd66d], a
call UpdateRNGSources
or $01
ld [wd673], a
ld [wd66e], a
ld a, [wd66f]
ld l, a
ld a, [wd66f + 1]
ld h, a
ld a, [wd671]
ld e, a
ld a, [wd671 + 1]
ld d, a
.asm_ecbf
ld a, [hli]
ld c, a
ld a, [hli]
ld b, a
or c
jr z, .asm_ed03
push hl
push bc
ld a, [hli]
ld c, a
ld a, [hli]
ld b, a
ld a, [hli]
ld [wd66a], a
ld a, [hli]
ld [wd66b], a
pop hl
.asm_ecd5
push bc
ld a, [hli]
ld c, a
ld a, [wd66d]
xor c
ld [wd66d], a
ld a, [wd66c]
add c
ld [wd66c], a
ld a, [wd66e]
ld b, a
sla a
add b
ld b, a
ld a, c
add b
ld [de], a
inc de
ld a, b
ld [wd66e], a
pop bc
dec bc
ld a, b
or c
jr nz, .asm_ecd5
pop hl
REPT 4
inc hl
ENDR
jr .asm_ecbf
.asm_ed03
pop af
call BankswitchSRAM
call DisableSRAM
ret
Func_ed0b:
ldh a, [hBankSRAM]
push af
ld a, [wd668]
call BankswitchSRAM
xor a
ld [wd66c], a
ld [wd66d], a
ld a, [wd673]
ld [wd66e], a
ld a, [wd66f]
ld l, a
ld a, [wd66f + 1]
ld h, a
ld a, [wd671]
ld e, a
ld a, [wd671 + 1]
ld d, a
.asm_ed31
ld a, [hli]
ld c, a
ld a, [hli]
ld b, a
or c
jr z, .asm_ed74
push hl
push bc
ld a, [hli]
ld c, a
ld a, [hli]
ld b, a
ld a, [hli]
ld [wd66a], a
ld a, [hli]
ld [wd66b], a
pop hl
.asm_ed47
push bc
ld a, [wd66e]
ld b, a
sla a
add b
ld b, a
ld a, [de]
sub b
ld [hli], a
inc de
ld c, a
ld a, b
ld [wd66e], a
ld a, [wd66d]
xor c
ld [wd66d], a
ld a, [wd66c]
add c
ld [wd66c], a
pop bc
dec bc
ld a, b
or c
jr nz, .asm_ed47
pop hl
REPT 4
inc hl
ENDR
jr .asm_ed31
.asm_ed74
pop af
call BankswitchSRAM
call DisableSRAM
ret
Func_ed7c:
ldh a, [hBankSRAM]
push af
ld a, [wd668]
call BankswitchSRAM
xor a
ld [wd66c], a
ld [wd66d], a
ld a, [wd673]
ld [wd66e], a
ld a, [wd66f]
ld l, a
ld a, [wd66f + 1]
ld h, a
ld a, [wd671]
ld e, a
ld a, [wd671 + 1]
ld d, a
.asm_eda2
ld a, [hli]
ld c, a
ld a, [hli]
ld b, a
or c
jr z, .asm_ede4
push hl
push bc
ld a, [hli]
ld c, a
ld a, [hli]
ld b, a
ld a, [hli]
ld [wd66a], a
ld a, [hli]
ld [wd66b], a
pop hl
.asm_edb8
push bc
ld a, [wd66e]
ld b, a
sla a
add b
ld b, a
ld a, [de]
sub b
inc de
ld c, a
ld a, b
ld [wd66e], a
ld a, [wd66d]
xor c
ld [wd66d], a
ld a, [wd66c]
add c
ld [wd66c], a
pop bc
dec bc
ld a, b
or c
jr nz, .asm_edb8
pop hl
REPT 4
inc hl
ENDR
jr .asm_eda2
.asm_ede4
pop af
call BankswitchSRAM
call DisableSRAM
ret
; 0xedec
SECTION "Bank 3@6f40", ROMX[$6f40], BANK[$3]
INCLUDE "engine/save.asm"
INCLUDE "data/save.asm"
Func_ef40:
or a

753
src/engine/save.asm Normal file
View File

@ -0,0 +1,753 @@
; returns carry if no save data
Func_e883:
ldh a, [hBankSRAM]
push af
ld a, BANK("SRAM2")
call BankswitchSRAM
call EnableSRAM
ld a, [sBackup_baa3]
ld b, a
pop af
call BankswitchSRAM
call DisableSRAM
ld a, b
bit 0, a
jr z, .set_carry
; no carry
scf
ccf
ret
.set_carry
scf
ret
Func_e8a3:
call EnableSRAM
ld a, [s0baa3]
ld b, a
call DisableSRAM
ld a, b
bit 1, a
jr z, .asm_e8b5
scf
ccf
ret
.asm_e8b5
scf
ret
Func_e8b7:
ld a, BANK("SRAM2")
ld [wSaveDataSRAMBank], a
ldh a, [hBankSRAM]
push af
ld a, BANK("SRAM2")
call BankswitchSRAM
ld a, [sBackupGeneralSaveDataHeader]
ld b, a
pop af
call BankswitchSRAM
call DisableSRAM
ld a, b
cp $16
jr nz, .asm_e918
ld a, LOW(WRAMToSRAMMapper_GeneralSave)
ld [wWRAMToSRAMMapperPointer], a
ld a, HIGH(WRAMToSRAMMapper_GeneralSave)
ld [wWRAMToSRAMMapperPointer + 1], a
ld a, LOW(sBackupGeneralSaveDataMain)
ld [wSaveDataSRAMOffset], a
ld a, HIGH(sBackupGeneralSaveDataMain)
ld [wSaveDataSRAMOffset + 1], a
call Func_ea19
call Func_ed7c
ld a, [wSaveDataChecksum1]
ld d, a
ld a, [wSaveDataChecksum0]
ld e, a
ldh a, [hBankSRAM]
push af
ld a, BANK("SRAM2")
call BankswitchSRAM
ld a, [sBackup_baa0]
ld b, a
ld a, [sBackup_baa1]
ld c, a
pop af
call BankswitchSRAM
call DisableSRAM
ld a, b
cp d
jr nz, .asm_e918
ld a, c
cp e
jr nz, .asm_e918
scf
ccf
ret
.asm_e918
scf
ret
Func_e91a:
xor a ; BANK("SRAM0")
ld [wSaveDataSRAMBank], a
ldh a, [hBankSRAM]
push af
xor a ; BANK("SRAM0")
call BankswitchSRAM
ld a, [sGeneralSaveDataHeader]
ld b, a
pop af
call BankswitchSRAM
call DisableSRAM
ld a, b
cp $16
jr nz, .asm_e978
ld a, LOW(WRAMToSRAMMapper_GeneralSave)
ld [wWRAMToSRAMMapperPointer], a
ld a, HIGH(WRAMToSRAMMapper_GeneralSave)
ld [wWRAMToSRAMMapperPointer + 1], a
ld a, LOW(sGeneralSaveDataMain)
ld [wSaveDataSRAMOffset], a
ld a, HIGH(sGeneralSaveDataMain)
ld [wSaveDataSRAMOffset + 1], a
call Func_ea19
call Func_ed7c
ld a, [wSaveDataChecksum1]
ld d, a
ld a, [wSaveDataChecksum0]
ld e, a
ldh a, [hBankSRAM]
push af
xor a
call BankswitchSRAM
ld a, [s0baa0]
ld b, a
ld a, [s0baa1]
ld c, a
pop af
call BankswitchSRAM
call DisableSRAM
ld a, b
cp d
jr nz, .asm_e978
ld a, c
cp e
jr nz, .asm_e978
scf
ccf
ret
.asm_e978
scf
ret
Func_e97a:
ldh a, [hBankSRAM]
push af
ld a, BANK("SRAM2")
call BankswitchSRAM
ld hl, sBackup_baa3
xor a
ld [hl], a
ld [sBackupGeneralSaveDataHeader], a
pop af
call BankswitchSRAM
call DisableSRAM
call EnableSRAM
ld hl, s0baa3
xor a
ld [hl], a
ld [sGeneralSaveDataHeader], a
call DisableSRAM
farcall ClearSavedDuel
call DisableSRAM
ret
Func_e9a7:
call EnableSRAM
ld hl, s0baa3
xor a
ld [hl], a
call DisableSRAM
farcall ClearSavedDuel
ret
Func_e9b7:
ld a, 2
call BulkCopySRAM
ldh a, [hBankSRAM]
push af
ld a, BANK("SRAM2")
call BankswitchSRAM
ld a, $16
ld [sBackupGeneralSaveDataHeader], a
ld hl, sBackup_baa3
set 0, [hl]
pop af
call BankswitchSRAM
call DisableSRAM
ret
; sram copy
; a = 0: sCardAndDeckSaveData onwards, from SRAM2 to SRAM0
; a = 1: sCardAndDeckSaveData onwards, from SRAM0 to SRAM2
; a = 2: all, from SRAM0 to SRAM2
BulkCopySRAM:
cp 1
jr z, .from_sram0_to_sram2
jr nc, .all_from_sram0_to_sram2
; from sram2 to sram0
ld e, BANK("SRAM2")
ld d, BANK("SRAM0")
jr .card_deck_onwards
.from_sram0_to_sram2
ld e, BANK("SRAM0")
ld d, BANK("SRAM2")
jr .card_deck_onwards
.all_from_sram0_to_sram2
ld e, BANK("SRAM0")
ld d, BANK("SRAM2")
ldh a, [hBankSRAM]
push af
ld bc, SIZEOF(SRAM)
ld hl, STARTOF(SRAM)
jr .loop_copy
.card_deck_onwards
ldh a, [hBankSRAM]
push af
ld bc, SIZEOF(SRAM) - (sCardAndDeckSaveData - STARTOF(SRAM))
ld hl, sCardAndDeckSaveData
.loop_copy
ld a, e
call BankswitchSRAM
ld a, [hl]
push af
ld a, d
call BankswitchSRAM
pop af
ld [hli], a
dec bc
ld a, b
or c
jr nz, .loop_copy
pop af
call BankswitchSRAM
call DisableSRAM
ret
Func_ea19:
ldh a, [hBankSRAM]
push af
ld a, [wSaveDataSRAMBank]
call BankswitchSRAM
ld a, [s0baa2]
ld [wd673], a
pop af
call BankswitchSRAM
call DisableSRAM
ret
Func_ea30::
ld a, OWMODE_SAVE_PRELOAD
call ExecuteOWModeScript
farcall Func_10f32
xor a ; BANK("SRAM0")
ld [wSaveDataSRAMBank], a
.asm_ea3d
ld a, LOW(WRAMToSRAMMapper_GeneralSave)
ld [wWRAMToSRAMMapperPointer], a
ld a, HIGH(WRAMToSRAMMapper_GeneralSave)
ld [wWRAMToSRAMMapperPointer + 1], a
ld a, LOW(sGeneralSaveDataMain)
ld [wSaveDataSRAMOffset], a
ld a, HIGH(sGeneralSaveDataMain)
ld [wSaveDataSRAMOffset + 1], a
call Func_ec94
call EnableSRAM
ld a, $16
ld [sGeneralSaveDataHeader], a
ld a, [wSaveDataChecksum1]
ld [s0baa0], a
ld a, [wSaveDataChecksum0]
ld [s0baa1], a
ld a, [wd673]
ld [s0baa2], a
ld hl, s0baa3
set 0, [hl]
call DisableSRAM
call Func_ea19
call Func_ed7c
ld a, [wSaveDataChecksum1]
ld d, a
ld a, [wSaveDataChecksum0]
ld e, a
call EnableSRAM
ld a, [s0baa0]
ld b, a
ld a, [s0baa1]
ld c, a
call DisableSRAM
ld a, b
cp d
jr nz, .error
ld a, c
cp e
jr nz, .error
ld a, 1
call BulkCopySRAM
ld a, OWMODE_SAVE_POSTLOAD
call ExecuteOWModeScript
ret
.error
debug_nop
jr .asm_ea3d
Func_eaa8:
farcall Func_10f32
xor a ; BANK("SRAM0")
ld [wSaveDataSRAMBank], a
ld a, LOW(WRAMToSRAMMapper_GeneralSave)
ld [wWRAMToSRAMMapperPointer], a
ld a, HIGH(WRAMToSRAMMapper_GeneralSave)
ld [wWRAMToSRAMMapperPointer + 1], a
ld a, LOW(sGeneralSaveDataMain)
ld [wSaveDataSRAMOffset], a
ld a, HIGH(sGeneralSaveDataMain)
ld [wSaveDataSRAMOffset + 1], a
call Func_ec94
call EnableSRAM
ld a, $16
ld [sGeneralSaveDataHeader], a
ld a, [wSaveDataChecksum1]
ld [s0baa0], a
ld a, [wSaveDataChecksum0]
ld [s0baa1], a
ld a, [wd673]
ld [s0baa2], a
ld hl, s0baa3
set 1, [hl]
call DisableSRAM
ret
Func_eaea:
call Func_eaf6
xor a
call BulkCopySRAM
farcall Func_10f78
ret
Func_eaf6:
ld a, BANK("SRAM2")
ld [wSaveDataSRAMBank], a
ld a, LOW(WRAMToSRAMMapper_GeneralSave)
ld [wWRAMToSRAMMapperPointer], a
ld a, HIGH(WRAMToSRAMMapper_GeneralSave)
ld [wWRAMToSRAMMapperPointer + 1], a
ld a, LOW(sBackupGeneralSaveDataMain)
ld [wSaveDataSRAMOffset], a
ld a, HIGH(sBackupGeneralSaveDataMain)
ld [wSaveDataSRAMOffset + 1], a
call Func_ea19
call Func_ed0b
ret
Func_eb16:
xor a ; BANK("SRAM0")
ld [wSaveDataSRAMBank], a
ld a, LOW(WRAMToSRAMMapper_GeneralSave)
ld [wWRAMToSRAMMapperPointer], a
ld a, HIGH(WRAMToSRAMMapper_GeneralSave)
ld [wWRAMToSRAMMapperPointer + 1], a
ld a, LOW(sGeneralSaveDataMain)
ld [wSaveDataSRAMOffset], a
ld a, HIGH(sGeneralSaveDataMain)
ld [wSaveDataSRAMOffset + 1], a
call Func_ea19
call Func_ed0b
farcall Func_10f78
ret
Func_eb39:
ld hl, wddf9
xor a
ld c, $14
.loop_init
ld [hli], a
dec c
jr nz, .loop_init
; init verbosely from wde0d to wde17
ld hl, wde0d
xor a
REPT 4
ld [hli], a
ENDR
ld hl, wde11
xor a
REPT 4
ld [hli], a
ENDR
ld hl, wde15
xor a
REPT 4
ld [hli], a
ENDR
ld a, $01
ld [wde15], a
ld a, $05
ld [wde17], a
ld hl, .data
ld de, wde19
ld c, $20
.loop_copy
ld a, [hli]
ld [de], a
inc de
dec c
jr nz, .loop_copy
call Func_ec38
ret
.data
db $04, $13, $79, $15, $0f, $6b, $0f, $34, $0f, $2f, $0f, $00, $00, $00, $00, $00, $4e, $0f, $39, $0f, $38, $0f, $5f, $0f, $21, $0f, $00, $00, $00, $00, $00, $00
Func_eb97:
call Func_ebc6
jr nc, .asm_eb9f
call Func_eb39
.asm_eb9f
call Func_ec6c
; init verbosely from wde0d to wde13
ld hl, wde0d
xor a
REPT 4
ld [hli], a
ENDR
ld hl, wde11
xor a
REPT 4
ld [hli], a
ENDR
call Func_ec38
ret
Func_ebb6:
call EnableSRAM
xor a
ld [s0bae5], a
ld a, $ff
ld [s0bae4], a
call DisableSRAM
ret
Func_ebc6:
xor a ; BANK("SRAM0")
ld [wSaveDataSRAMBank], a
ld a, LOW(WRAMToSRAMMapper_ChallengeMachineSave)
ld [wWRAMToSRAMMapperPointer], a
ld a, HIGH(WRAMToSRAMMapper_ChallengeMachineSave)
ld [wWRAMToSRAMMapperPointer + 1], a
ld a, LOW(sChallengeMachineSaveData)
ld [wSaveDataSRAMOffset], a
ld a, HIGH(sChallengeMachineSaveData)
ld [wSaveDataSRAMOffset + 1], a
call EnableSRAM
ld a, [s0bae6]
ld [wd673], a
call DisableSRAM
call Func_ed0b
ld a, [wSaveDataChecksum1]
ld d, a
ld a, [wSaveDataChecksum0]
ld e, a
call EnableSRAM
ld a, [s0bae4]
ld b, a
ld a, [s0bae5]
ld c, a
call DisableSRAM
ld a, b
cp d
jr nz, .asm_ec36
ld a, c
cp e
jr nz, .asm_ec36
ld a, [wde15 + 0]
ld e, a
ld a, [wde15 + 1]
ld d, a
cp16_long 0
jr z, .asm_ec36
ld a, [wde17 + 0]
ld e, a
ld a, [wde17 + 1]
ld d, a
cp16_long 0
jr z, .asm_ec36
scf
ccf
ret
.asm_ec36
scf
ret
Func_ec38:
xor a ; BANK("SRAM0")
ld [wSaveDataSRAMBank], a
ld a, LOW(WRAMToSRAMMapper_ChallengeMachineSave)
ld [wWRAMToSRAMMapperPointer], a
ld a, HIGH(WRAMToSRAMMapper_ChallengeMachineSave)
ld [wWRAMToSRAMMapperPointer + 1], a
ld a, LOW(sChallengeMachineSaveData)
ld [wSaveDataSRAMOffset], a
ld a, HIGH(sChallengeMachineSaveData)
ld [wSaveDataSRAMOffset + 1], a
call Func_ec94
call EnableSRAM
ld a, [wSaveDataChecksum1]
ld [s0bae4], a
ld a, [wSaveDataChecksum0]
ld [s0bae5], a
ld a, [wd673]
ld [s0bae6], a
call DisableSRAM
ret
Func_ec6c:
xor a ; BANK("SRAM0")
ld [wSaveDataSRAMBank], a
ld a, LOW(WRAMToSRAMMapper_ChallengeMachineSave)
ld [wWRAMToSRAMMapperPointer], a
ld a, HIGH(WRAMToSRAMMapper_ChallengeMachineSave)
ld [wWRAMToSRAMMapperPointer + 1], a
ld a, LOW(sChallengeMachineSaveData)
ld [wSaveDataSRAMOffset], a
ld a, HIGH(sChallengeMachineSaveData)
ld [wSaveDataSRAMOffset + 1], a
call EnableSRAM
ld a, [s0bae6]
ld [wd673], a
call DisableSRAM
call Func_ed0b
ret
Func_ec94:
ldh a, [hBankSRAM]
push af
ld a, [wSaveDataSRAMBank]
call BankswitchSRAM
xor a
ld [wSaveDataChecksum0], a
ld [wSaveDataChecksum1], a
call UpdateRNGSources
or $01
ld [wd673], a
ld [wSaveDataChecksum2], a
ld a, [wWRAMToSRAMMapperPointer]
ld l, a
ld a, [wWRAMToSRAMMapperPointer + 1]
ld h, a
ld a, [wSaveDataSRAMOffset]
ld e, a
ld a, [wSaveDataSRAMOffset + 1]
ld d, a
.asm_ecbf
ld a, [hli]
ld c, a
ld a, [hli]
ld b, a
or c
jr z, .asm_ed03
push hl
push bc
ld a, [hli]
ld c, a
ld a, [hli]
ld b, a
ld a, [hli]
ld [wSaveDataItemMinValidValue], a
ld a, [hli]
ld [wSaveDataItemMaxValidValue], a
pop hl
.asm_ecd5
push bc
ld a, [hli]
ld c, a
ld a, [wSaveDataChecksum1]
xor c
ld [wSaveDataChecksum1], a
ld a, [wSaveDataChecksum0]
add c
ld [wSaveDataChecksum0], a
ld a, [wSaveDataChecksum2]
ld b, a
sla a
add b
ld b, a
ld a, c
add b
ld [de], a
inc de
ld a, b
ld [wSaveDataChecksum2], a
pop bc
dec bc
ld a, b
or c
jr nz, .asm_ecd5
pop hl
REPT 4
inc hl
ENDR
jr .asm_ecbf
.asm_ed03
pop af
call BankswitchSRAM
call DisableSRAM
ret
Func_ed0b:
ldh a, [hBankSRAM]
push af
ld a, [wSaveDataSRAMBank]
call BankswitchSRAM
xor a
ld [wSaveDataChecksum0], a
ld [wSaveDataChecksum1], a
ld a, [wd673]
ld [wSaveDataChecksum2], a
ld a, [wWRAMToSRAMMapperPointer]
ld l, a
ld a, [wWRAMToSRAMMapperPointer + 1]
ld h, a
ld a, [wSaveDataSRAMOffset]
ld e, a
ld a, [wSaveDataSRAMOffset + 1]
ld d, a
.asm_ed31
ld a, [hli]
ld c, a
ld a, [hli]
ld b, a
or c
jr z, .asm_ed74
push hl
push bc
ld a, [hli]
ld c, a
ld a, [hli]
ld b, a
ld a, [hli]
ld [wSaveDataItemMinValidValue], a
ld a, [hli]
ld [wSaveDataItemMaxValidValue], a
pop hl
.asm_ed47
push bc
ld a, [wSaveDataChecksum2]
ld b, a
sla a
add b
ld b, a
ld a, [de]
sub b
ld [hli], a
inc de
ld c, a
ld a, b
ld [wSaveDataChecksum2], a
ld a, [wSaveDataChecksum1]
xor c
ld [wSaveDataChecksum1], a
ld a, [wSaveDataChecksum0]
add c
ld [wSaveDataChecksum0], a
pop bc
dec bc
ld a, b
or c
jr nz, .asm_ed47
pop hl
REPT 4
inc hl
ENDR
jr .asm_ed31
.asm_ed74
pop af
call BankswitchSRAM
call DisableSRAM
ret
Func_ed7c:
ldh a, [hBankSRAM]
push af
ld a, [wSaveDataSRAMBank]
call BankswitchSRAM
xor a
ld [wSaveDataChecksum0], a
ld [wSaveDataChecksum1], a
ld a, [wd673]
ld [wSaveDataChecksum2], a
ld a, [wWRAMToSRAMMapperPointer]
ld l, a
ld a, [wWRAMToSRAMMapperPointer + 1]
ld h, a
ld a, [wSaveDataSRAMOffset]
ld e, a
ld a, [wSaveDataSRAMOffset + 1]
ld d, a
.asm_eda2
ld a, [hli]
ld c, a
ld a, [hli]
ld b, a
or c
jr z, .asm_ede4
push hl
push bc
ld a, [hli]
ld c, a
ld a, [hli]
ld b, a
ld a, [hli]
ld [wSaveDataItemMinValidValue], a
ld a, [hli]
ld [wSaveDataItemMaxValidValue], a
pop hl
.asm_edb8
push bc
ld a, [wSaveDataChecksum2]
ld b, a
sla a
add b
ld b, a
ld a, [de]
sub b
inc de
ld c, a
ld a, b
ld [wSaveDataChecksum2], a
ld a, [wSaveDataChecksum1]
xor c
ld [wSaveDataChecksum1], a
ld a, [wSaveDataChecksum0]
add c
ld [wSaveDataChecksum0], a
pop bc
dec bc
ld a, b
or c
jr nz, .asm_edb8
pop hl
REPT 4
inc hl
ENDR
jr .asm_eda2
.asm_ede4
pop af
call BankswitchSRAM
call DisableSRAM
ret

View File

@ -86,7 +86,54 @@ sBoosterPacksObtained:: ; b7a3
sCardAndDeckSaveDataEnd::
ds $359
ds $59
sGeneralSaveData:: ; b800
sGeneralSaveDataHeader:: ; b800
ds $1
; see WRAMToSRAMMapper_GeneralSave
; TODO: break down into each segment (after fully labelling wram?)
sGeneralSaveDataMain:: ; b801
ds $1b9
sGeneralSaveDataEnd::
ds $e6
s0baa0:: ; baa0
ds $1
s0baa1:: ; baa1
ds $1
s0baa2:: ; baa2
ds $1
s0baa3:: ; baa3
ds $1
sChallengeMachineSaveData:: ; baa4
; see WRAMToSRAMMapper_ChallengeMachineSave
; TODO: break down into each segment (after fully labelling wram?)
sChallengeMachineSaveDataMain:: ; baa4
ds $40
sChallengeMachineSaveDataMainEnd::
s0bae4:: ; bae4
ds $1
s0bae5:: ; bae5
ds $1
s0bae6:: ; bae6
ds $1
sChallengeMachineSaveDataEnd::
ds $19
; saved data of the current duel, including a two-byte checksum
; see SaveDuelDataToDE
@ -110,8 +157,40 @@ sCardPopRecords:: ; a100
SECTION "SRAM2", SRAM
; the same structure as SRAM0
; mainly as a backup, much like tcg1
; see BulkCopySRAM
ds $1800
sBackupGeneralSaveData:: ; b800
sBackupGeneralSaveDataHeader:: ; b800
ds $1
sBackupGeneralSaveDataMain:: ; b801
ds $1b9
sBackupGeneralSaveDataEnd::
ds $e6
sBackup_baa0:: ; baa0
ds $1
sBackup_baa1:: ; baa1
ds $1
sBackup_baa2:: ; baa2
ds $1
sBackup_baa3:: ; baa3
ds $1
sBackupChallengeMachineSaveData:: ; baa4
ds $43
sBackupChallengeMachineSaveDataEnd::
SECTION "SRAM3", SRAM
; buffers used to temporary store gfx related data

View File

@ -2261,10 +2261,7 @@ wNextWarpMap:: ; d54d
ds $1
wd54e:: ; d54e
ds $1
wd54f:: ; d54f
ds $1
ds $2
wPlayerOWObject:: ; d550
ds $1
@ -2419,6 +2416,8 @@ wNextMusic:: ; d58e
wNextMapHeaderDataEnd::
wNextWarpPlayerData:: ; d58f
wNextWarpPlayerXCoord:: ; d58f
ds $1
@ -2428,6 +2427,8 @@ wNextWarpPlayerYCoord:: ; d590
wNextWarpPlayerDirection:: ; d591
ds $1
wNextWarpPlayerDataEnd::
wOverworldScriptBank:: ; d592
ds $1
@ -2542,33 +2543,31 @@ wBoosterPacksToGive:: ; d65f
wNumBoosterPacksToGive:: ; d667
ds $1
; sram bank
wd668:: ; d668
; SRAM0 or SRAM2
wSaveDataSRAMBank:: ; d668
ds $1
ds $1
wd66a:: ; d66a
wSaveDataItemMinValidValue:: ; d66a
ds $1
wd66b:: ; d66b
wSaveDataItemMaxValidValue:: ; d66b
ds $1
wd66c:: ; d66c
wSaveDataChecksum0:: ; d66c
ds $1
wd66d:: ; d66d
wSaveDataChecksum1:: ; d66d
ds $1
wd66e:: ; d66e
wSaveDataChecksum2:: ; d66e
ds $1
; data ptr
wd66f:: ; d66f
wWRAMToSRAMMapperPointer:: ; d66f
ds $2
; sram ptr
wd671:: ; d671
wSaveDataSRAMOffset:: ; d671
ds $2
wd673:: ; d673
@ -2691,6 +2690,9 @@ wd7e9:: ; d7e9
ds $2
; 177 bytes
wOWData:: ; d7ec
; OW map constant
wOWMap:: ; d7ec
ds $2
@ -2728,6 +2730,8 @@ wOWScrollX:: ; d89b
wOWScrollY:: ; d89c
ds $1
wOWDataEnd::
wd89d:: ; d89d
ds $1
@ -3478,6 +3482,7 @@ wddf7:: ; ddf7
wddf8:: ; ddf8
ds $1
; challenge machine
wddf9:: ; ddf9
ds $14