pokecrystal/engine/save.asm

1211 lines
21 KiB
NASM

SaveMenu: ; 14a1a
call LoadStandardMenuHeader
farcall DisplaySaveInfoOnSave
call SpeechTextBox
call UpdateSprites
farcall SaveMenu_CopyTilemapAtOnce
ld hl, Text_WouldYouLikeToSaveTheGame
call SaveTheGame_yesorno
jr nz, .refused
call AskOverwriteSaveFile
jr c, .refused
call PauseGameLogic
call _SavingDontTurnOffThePower
call ResumeGameLogic
call ExitMenu
and a
ret
.refused
call ExitMenu
call ret_d90
farcall SaveMenu_CopyTilemapAtOnce
scf
ret
SaveAfterLinkTrade: ; 14a58
call PauseGameLogic
farcall StageRTCTimeForSave
farcall BackupMysteryGift
call SavePokemonData
call SaveChecksum
call SaveBackupPokemonData
call SaveBackupChecksum
farcall BackupPartyMonMail
farcall SaveRTC
call ResumeGameLogic
ret
; 14a83
ChangeBoxSaveGame: ; 14a83 (5:4a83)
push de
ld hl, Text_SaveOnBoxSwitch
call MenuTextBox
call YesNoBox
call ExitMenu
jr c, .refused
call AskOverwriteSaveFile
jr c, .refused
call PauseGameLogic
call SavingDontTurnOffThePower
call SaveBox
pop de
ld a, e
ld [wCurBox], a
call LoadBox
call SavedTheGame
call ResumeGameLogic
and a
ret
.refused
pop de
ret
Link_SaveGame: ; 14ab2
call AskOverwriteSaveFile
jr c, .refused
call PauseGameLogic
call _SavingDontTurnOffThePower
call ResumeGameLogic
and a
.refused
ret
; 14ac2
MovePkmnWOMail_SaveGame: ; 14ac2
call PauseGameLogic
push de
call SaveBox
pop de
ld a, e
ld [wCurBox], a
call LoadBox
call ResumeGameLogic
ret
; 14ad5
MovePkmnWOMail_InsertMon_SaveGame: ; 14ad5
call PauseGameLogic
push de
call SaveBox
pop de
ld a, e
ld [wCurBox], a
ld a, $1
ld [wSaveFileExists], a
farcall StageRTCTimeForSave
farcall BackupMysteryGift
call ValidateSave
call SaveOptions
call SavePlayerData
call SavePokemonData
call SaveChecksum
call ValidateBackupSave
call SaveBackupOptions
call SaveBackupPlayerData
call SaveBackupPokemonData
call SaveBackupChecksum
farcall BackupPartyMonMail
farcall BackupMobileEventIndex
farcall SaveRTC
call LoadBox
call ResumeGameLogic
ld de, SFX_SAVE
call PlaySFX
ld c, 24
call DelayFrames
ret
; 14b34
StartMovePkmnWOMail_SaveGame: ; 14b34
ld hl, Text_SaveOnMovePkmnWOMail
call MenuTextBox
call YesNoBox
call ExitMenu
jr c, .refused
call AskOverwriteSaveFile
jr c, .refused
call PauseGameLogic
call _SavingDontTurnOffThePower
call ResumeGameLogic
and a
ret
.refused
scf
ret
; 14b54
PauseGameLogic: ; 14b54
ld a, $1
ld [wGameLogicPaused], a
ret
; 14b5a
ResumeGameLogic: ; 14b5a
xor a
ld [wGameLogicPaused], a
ret
; 14b5f
AddHallOfFameEntry: ; 14b5f
ld a, BANK(sHallOfFame)
call GetSRAMBank
ld hl, sHallOfFame + HOF_LENGTH * (NUM_HOF_TEAMS - 1) - 1
ld de, sHallOfFame + HOF_LENGTH * NUM_HOF_TEAMS - 1
ld bc, HOF_LENGTH * (NUM_HOF_TEAMS - 1)
.loop
ld a, [hld]
ld [de], a
dec de
dec bc
ld a, c
or b
jr nz, .loop
ld hl, OverworldMap
ld de, sHallOfFame
ld bc, HOF_LENGTH
call CopyBytes
call CloseSRAM
ret
; 14b85
SaveGameData: ; 14b85
call SaveGameData_
ret
; 14b89
AskOverwriteSaveFile: ; 14b89
ld a, [wSaveFileExists]
and a
jr z, .erase
call CompareLoadedAndSavedPlayerID
jr z, .yoursavefile
ld hl, Text_AnotherSaveFile
call SaveTheGame_yesorno
jr nz, .refused
jr .erase
.yoursavefile
ld hl, Text_AlreadyASaveFile
call SaveTheGame_yesorno
jr nz, .refused
jr .ok
.erase
call ErasePreviousSave
.ok
and a
ret
.refused
scf
ret
; 14baf
SaveTheGame_yesorno: ; 14baf
ld b, BANK(Text_WouldYouLikeToSaveTheGame)
call MapTextbox
call LoadMenuTextBox
lb bc, 0, 7
call PlaceYesNoBox
ld a, [wMenuCursorY]
dec a
call CloseWindow
push af
call ret_d90
pop af
and a
ret
; 14bcb
CompareLoadedAndSavedPlayerID: ; 14bcb
ld a, BANK(sPlayerData)
call GetSRAMBank
ld hl, sPlayerData + (PlayerID - wPlayerData)
ld a, [hli]
ld c, [hl]
ld b, a
call CloseSRAM
ld a, [PlayerID]
cp b
ret nz
ld a, [PlayerID + 1]
cp c
ret
; 14be3
_SavingDontTurnOffThePower: ; 14be3
call SavingDontTurnOffThePower
SavedTheGame: ; 14be6
call SaveGameData_
; wait 32 frames
ld c, $20
call DelayFrames
; copy the original text speed setting to the stack
ld a, [Options]
push af
; set text speed super slow
ld a, 3
ld [Options], a
; <PLAYER> saved the game!
ld hl, Text_PlayerSavedTheGame
call PrintText
; restore the original text speed setting
pop af
ld [Options], a
ld de, SFX_SAVE
call WaitPlaySFX
call WaitSFX
; wait 30 frames
ld c, $1e
call DelayFrames
ret
; 14c10
SaveGameData_: ; 14c10
ld a, 1
ld [wSaveFileExists], a
farcall StageRTCTimeForSave
farcall BackupMysteryGift
call ValidateSave
call SaveOptions
call SavePlayerData
call SavePokemonData
call SaveBox
call SaveChecksum
call ValidateBackupSave
call SaveBackupOptions
call SaveBackupPlayerData
call SaveBackupPokemonData
call SaveBackupChecksum
call UpdateStackTop
farcall BackupPartyMonMail
farcall BackupMobileEventIndex
farcall SaveRTC
ld a, BANK(sBattleTowerChallengeState)
call GetSRAMBank
ld a, [sBattleTowerChallengeState]
cp BATTLETOWER_RECEIVED_REWARD
jr nz, .ok
xor a
ld [sBattleTowerChallengeState], a
.ok
call CloseSRAM
ret
; 14c6b
UpdateStackTop: ; 14c6b
; sStackTop appears to be unused.
; It could have been used to debug stack overflow during saving.
call FindStackTop
ld a, BANK(sStackTop)
call GetSRAMBank
ld a, [sStackTop + 0]
ld e, a
ld a, [sStackTop + 1]
ld d, a
or e
jr z, .update
ld a, e
sub l
ld a, d
sbc h
jr c, .done
.update
ld a, l
ld [sStackTop + 0], a
ld a, h
ld [sStackTop + 1], a
.done
call CloseSRAM
ret
; 14c90
FindStackTop: ; 14c90
; Find the furthest point that sp has traversed to.
; This is distinct from the current value of sp.
ld hl, Stack - $ff
.loop
ld a, [hl]
or a
ret nz
inc hl
jr .loop
; 14c99
SavingDontTurnOffThePower: ; 14c99
; Prevent joypad interrupts
xor a
ld [hJoypadReleased], a
ld [hJoypadPressed], a
ld [hJoypadSum], a
ld [hJoypadDown], a
; Save the text speed setting to the stack
ld a, [Options]
push af
; Set the text speed to super slow
ld a, $3
ld [Options], a
; SAVING... DON'T TURN OFF THE POWER.
ld hl, Text_SavingDontTurnOffThePower
call PrintText
; Restore the text speed setting
pop af
ld [Options], a
; Wait for 16 frames
ld c, $10
call DelayFrames
ret
; 14cbb
ErasePreviousSave: ; 14cbb
call EraseBoxes
call EraseHallOfFame
call EraseLinkBattleStats
call EraseMysteryGift
call SaveData
call EraseBattleTowerStatus
ld a, BANK(sStackTop)
call GetSRAMBank
xor a
ld [sStackTop + 0], a
ld [sStackTop + 1], a
call CloseSRAM
ld a, $1
ld [wSavedAtLeastOnce], a
ret
; 14ce2
EraseLinkBattleStats: ; 14ce2
ld a, BANK(sLinkBattleStats)
call GetSRAMBank
ld hl, sLinkBattleStats
ld bc, sLinkBattleStatsEnd - sLinkBattleStats
xor a
call ByteFill
jp CloseSRAM
; 14cf4
EraseMysteryGift: ; 14cf4
ld a, BANK(sBackupMysteryGiftItem)
call GetSRAMBank
ld hl, sBackupMysteryGiftItem
ld bc, sBackupMysteryGiftItemEnd - sBackupMysteryGiftItem
xor a
call ByteFill
jp CloseSRAM
; 14d06
EraseHallOfFame: ; 14d06
ld a, BANK(sHallOfFame)
call GetSRAMBank
ld hl, sHallOfFame
ld bc, sHallOfFameEnd - sHallOfFame
xor a
call ByteFill
jp CloseSRAM
; 14d18
Unreferenced_Function14d18: ; 14d18
; copy .Data to SRA4:a007
ld a, 4 ; MBC30 bank used by JP Crystal; inaccessible by MBC3
call GetSRAMBank
ld hl, .Data
ld de, $a007 ; address of MBC30 bank
ld bc, .DataEnd - .Data
call CopyBytes
jp CloseSRAM
; 14d2c
.Data: ; 14d2c
db $0d, $02, $00, $05, $00, $00
db $22, $02, $01, $05, $00, $00
db $03, $04, $05, $08, $03, $05
db $0e, $06, $03, $02, $00, $00
db $39, $07, $07, $04, $00, $05
db $04, $07, $01, $05, $00, $00
db $0f, $05, $14, $07, $05, $05
db $11, $0c, $0c, $06, $06, $04
; 14d5c
.DataEnd
EraseBattleTowerStatus: ; 14d5c
ld a, BANK(sBattleTowerChallengeState)
call GetSRAMBank
xor a
ld [sBattleTowerChallengeState], a
jp CloseSRAM
; 14d68
SaveData: ; 14d68
call _SaveData
ret
; 14d6c
Unreferenced_Function14d6c: ; 14d6c
ld a, 4 ; MBC30 bank used by JP Crystal; inaccessible by MBC3
call GetSRAMBank
ld a, [$a60b] ; address of MBC30 bank
ld b, $0
and a
jr z, .ok
ld b, $2
.ok
ld a, b
ld [$a60b], a ; address of MBC30 bank
call CloseSRAM
ret
; 14d83
Unreferenced_Function14d83: ; 14d83
ld a, 4 ; MBC30 bank used by JP Crystal; inaccessible by MBC3
call GetSRAMBank
xor a
ld [$a60c], a ; address of MBC30 bank
ld [$a60d], a ; address of MBC30 bank
call CloseSRAM
ret
; 14d93
Unreferenced_Function14d93: ; 14d93
ld a, 7 ; MBC30 bank used by JP Crystal; inaccessible by MBC3
call GetSRAMBank
xor a
ld [$a000], a ; address of MBC30 bank
call CloseSRAM
ret
; 14da0
HallOfFame_InitSaveIfNeeded: ; 14da0
ld a, [wSavedAtLeastOnce]
and a
ret nz
call ErasePreviousSave
ret
; 14da9
ValidateSave: ; 14da9
ld a, BANK(sCheckValue1) ; BANK(sCheckValue2)
call GetSRAMBank
ld a, SAVE_CHECK_VALUE_1
ld [sCheckValue1], a
ld a, SAVE_CHECK_VALUE_2
ld [sCheckValue2], a
jp CloseSRAM
; 14dbb
SaveOptions: ; 14dbb
ld a, BANK(sOptions)
call GetSRAMBank
ld hl, Options
ld de, sOptions
ld bc, OptionsEnd - Options
call CopyBytes
ld a, [Options]
and $ff ^ (1 << NO_TEXT_SCROLL)
ld [sOptions], a
jp CloseSRAM
; 14dd7
SavePlayerData: ; 14dd7
ld a, BANK(sPlayerData)
call GetSRAMBank
ld hl, wPlayerData
ld de, sPlayerData
ld bc, wPlayerDataEnd - wPlayerData
call CopyBytes
ld hl, wCurrMapData
ld de, sCurrMapData
ld bc, wCurrMapDataEnd - wCurrMapData
call CopyBytes
jp CloseSRAM
; 14df7
SavePokemonData: ; 14df7
ld a, BANK(sPokemonData)
call GetSRAMBank
ld hl, wPokemonData
ld de, sPokemonData
ld bc, wPokemonDataEnd - wPokemonData
call CopyBytes
call CloseSRAM
ret
; 14e0c
SaveBox: ; 14e0c
call GetBoxAddress
call SaveBoxAddress
ret
; 14e13
SaveChecksum: ; 14e13
ld hl, sGameData
ld bc, sGameDataEnd - sGameData
ld a, BANK(sGameData)
call GetSRAMBank
call Checksum
ld a, e
ld [sChecksum + 0], a
ld a, d
ld [sChecksum + 1], a
call CloseSRAM
ret
; 14e2d
ValidateBackupSave: ; 14e2d
ld a, BANK(sBackupCheckValue1) ; BANK(sBackupCheckValue2)
call GetSRAMBank
ld a, SAVE_CHECK_VALUE_1
ld [sBackupCheckValue1], a
ld a, SAVE_CHECK_VALUE_2
ld [sBackupCheckValue2], a
call CloseSRAM
ret
; 14e40
SaveBackupOptions: ; 14e40
ld a, BANK(sBackupOptions)
call GetSRAMBank
ld hl, Options
ld de, sBackupOptions
ld bc, OptionsEnd - Options
call CopyBytes
call CloseSRAM
ret
; 14e55
SaveBackupPlayerData: ; 14e55
ld a, BANK(sBackupPlayerData)
call GetSRAMBank
ld hl, wPlayerData
ld de, sBackupPlayerData
ld bc, wPlayerDataEnd - wPlayerData
call CopyBytes
ld hl, wCurrMapData
ld de, sBackupCurrMapData
ld bc, wCurrMapDataEnd - wCurrMapData
call CopyBytes
call CloseSRAM
ret
; 14e76
SaveBackupPokemonData: ; 14e76
ld a, BANK(sBackupPokemonData)
call GetSRAMBank
ld hl, wPokemonData
ld de, sBackupPokemonData
ld bc, wPokemonDataEnd - wPokemonData
call CopyBytes
call CloseSRAM
ret
; 14e8b
SaveBackupChecksum: ; 14e8b
ld hl, sBackupGameData
ld bc, sBackupGameDataEnd - sBackupGameData
ld a, BANK(sBackupGameData)
call GetSRAMBank
call Checksum
ld a, e
ld [sBackupChecksum + 0], a
ld a, d
ld [sBackupChecksum + 1], a
call CloseSRAM
ret
; 14ea5
TryLoadSaveFile: ; 14ea5 (5:4ea5)
call VerifyChecksum
jr nz, .backup
call LoadPlayerData
call LoadPokemonData
call LoadBox
farcall RestorePartyMonMail
farcall RestoreMobileEventIndex
farcall RestoreMysteryGift
call ValidateBackupSave
call SaveBackupOptions
call SaveBackupPlayerData
call SaveBackupPokemonData
call SaveBackupChecksum
and a
ret
.backup
call VerifyBackupChecksum
jr nz, .corrupt
call LoadBackupPlayerData
call LoadBackupPokemonData
call LoadBox
farcall RestorePartyMonMail
farcall RestoreMobileEventIndex
farcall RestoreMysteryGift
call ValidateSave
call SaveOptions
call SavePlayerData
call SavePokemonData
call SaveChecksum
and a
ret
.corrupt
ld a, [Options]
push af
set NO_TEXT_SCROLL, a
ld [Options], a
ld hl, Text_SaveFileCorrupted
call PrintText
pop af
ld [Options], a
scf
ret
TryLoadSaveData: ; 14f1c
xor a
ld [wSaveFileExists], a
call CheckPrimarySaveFile
ld a, [wSaveFileExists]
and a
jr z, .backup
ld a, BANK(sPlayerData)
call GetSRAMBank
ld hl, sPlayerData + StartDay - wPlayerData
ld de, StartDay
ld bc, 8
call CopyBytes
ld hl, sPlayerData + wStatusFlags - wPlayerData
ld de, wStatusFlags
ld a, [hl]
ld [de], a
call CloseSRAM
ret
.backup
call CheckBackupSaveFile
ld a, [wSaveFileExists]
and a
jr z, .corrupt
ld a, BANK(sBackupPlayerData)
call GetSRAMBank
ld hl, sBackupPlayerData + StartDay - wPlayerData
ld de, StartDay
ld bc, 8
call CopyBytes
ld hl, sBackupPlayerData + wStatusFlags - wPlayerData
ld de, wStatusFlags
ld a, [hl]
ld [de], a
call CloseSRAM
ret
.corrupt
ld hl, DefaultOptions
ld de, Options
ld bc, OptionsEnd - Options
call CopyBytes
call PanicResetClock
ret
; 14f7c
INCLUDE "data/default_options.asm"
CheckPrimarySaveFile: ; 14f84
ld a, BANK(sCheckValue1) ; BANK(sCheckValue2)
call GetSRAMBank
ld a, [sCheckValue1]
cp SAVE_CHECK_VALUE_1
jr nz, .nope
ld a, [sCheckValue2]
cp SAVE_CHECK_VALUE_2
jr nz, .nope
ld hl, sOptions
ld de, Options
ld bc, OptionsEnd - Options
call CopyBytes
call CloseSRAM
ld a, $1
ld [wSaveFileExists], a
.nope
call CloseSRAM
ret
; 14faf
CheckBackupSaveFile: ; 14faf
ld a, BANK(sBackupCheckValue1) ; BANK(sBackupCheckValue2)
call GetSRAMBank
ld a, [sBackupCheckValue1]
cp SAVE_CHECK_VALUE_1
jr nz, .nope
ld a, [sBackupCheckValue2]
cp SAVE_CHECK_VALUE_2
jr nz, .nope
ld hl, sBackupOptions
ld de, Options
ld bc, OptionsEnd - Options
call CopyBytes
ld a, $2
ld [wSaveFileExists], a
.nope
call CloseSRAM
ret
; 14fd7
LoadPlayerData: ; 14fd7 (5:4fd7)
ld a, BANK(sPlayerData)
call GetSRAMBank
ld hl, sPlayerData
ld de, wPlayerData
ld bc, wPlayerDataEnd - wPlayerData
call CopyBytes
ld hl, sCurrMapData
ld de, wCurrMapData
ld bc, wCurrMapDataEnd - wCurrMapData
call CopyBytes
call CloseSRAM
ld a, BANK(sBattleTowerChallengeState)
call GetSRAMBank
ld a, [sBattleTowerChallengeState]
cp BATTLETOWER_RECEIVED_REWARD
jr nz, .not_4
ld a, BATTLETOWER_WON_CHALLENGE
ld [sBattleTowerChallengeState], a
.not_4
call CloseSRAM
ret
LoadPokemonData: ; 1500c
ld a, BANK(sPokemonData)
call GetSRAMBank
ld hl, sPokemonData
ld de, wPokemonData
ld bc, wPokemonDataEnd - wPokemonData
call CopyBytes
call CloseSRAM
ret
; 15021
LoadBox: ; 15021 (5:5021)
call GetBoxAddress
call LoadBoxAddress
ret
VerifyChecksum: ; 15028 (5:5028)
ld hl, sGameData
ld bc, sGameDataEnd - sGameData
ld a, BANK(sGameData)
call GetSRAMBank
call Checksum
ld a, [sChecksum + 0]
cp e
jr nz, .fail
ld a, [sChecksum + 1]
cp d
.fail
push af
call CloseSRAM
pop af
ret
LoadBackupPlayerData: ; 15046 (5:5046)
ld a, BANK(sBackupPlayerData)
call GetSRAMBank
ld hl, sBackupPlayerData
ld de, wPlayerData
ld bc, wPlayerDataEnd - wPlayerData
call CopyBytes
ld hl, sBackupCurrMapData
ld de, wCurrMapData
ld bc, wCurrMapDataEnd - wCurrMapData
call CopyBytes
call CloseSRAM
ret
LoadBackupPokemonData: ; 15067 (5:5067)
ld a, BANK(sBackupPokemonData)
call GetSRAMBank
ld hl, sBackupPokemonData
ld de, wPokemonData
ld bc, wPokemonDataEnd - wPokemonData
call CopyBytes
call CloseSRAM
ret
VerifyBackupChecksum: ; 1507c (5:507c)
ld hl, sBackupGameData
ld bc, sBackupGameDataEnd - sBackupGameData
ld a, BANK(sBackupGameData)
call GetSRAMBank
call Checksum
ld a, [sBackupChecksum + 0]
cp e
jr nz, .fail
ld a, [sBackupChecksum + 1]
cp d
.fail
push af
call CloseSRAM
pop af
ret
_SaveData: ; 1509a
; This is called within two scenarios:
; a) ErasePreviousSave (the process of erasing the save from a previous game file)
; b) unused mobile functionality
; It is not part of a regular save.
ld a, BANK(sCrystalData)
call GetSRAMBank
ld hl, wCrystalData
ld de, sCrystalData
ld bc, wCrystalDataEnd - wCrystalData
call CopyBytes
; This block originally had some mobile functionality, but since we're still in
; BANK(sCrystalData), it instead overwrites the sixteen EventFlags starting at 1:a603 with
; garbage from wd479. This isn't an issue, since ErasePreviousSave is followed by a regular
; save that unwrites the garbage.
ld hl, wd479
ld a, [hli]
ld [$a60e + 0], a
ld a, [hli]
ld [$a60e + 1], a
jp CloseSRAM
_LoadData: ; 150b9
ld a, BANK(sCrystalData)
call GetSRAMBank
ld hl, sCrystalData
ld de, wCrystalData
ld bc, wCrystalDataEnd - wCrystalData
call CopyBytes
; This block originally had some mobile functionality to mirror _SaveData above, but instead it
; (harmlessly) writes the aforementioned EventFlags to the unused wd479.
ld hl, wd479
ld a, [$a60e + 0]
ld [hli], a
ld a, [$a60e + 1]
ld [hli], a
jp CloseSRAM
GetBoxAddress: ; 150d8
ld a, [wCurBox]
cp NUM_BOXES
jr c, .ok
xor a
ld [wCurBox], a
.ok
ld e, a
ld d, 0
ld hl, BoxAddresses
rept 5
add hl, de
endr
ld a, [hli]
push af
ld a, [hli]
ld e, a
ld a, [hli]
ld d, a
ld a, [hli]
ld h, [hl]
ld l, a
pop af
ret
; 150f9
SaveBoxAddress: ; 150f9
; Save box via wMisc.
; We do this in three steps because the size of wMisc is less than
; the size of sBox.
push hl
; Load the first part of the active box.
push af
push de
ld a, BANK(sBox)
call GetSRAMBank
ld hl, sBox
ld de, wMisc
ld bc, (wMiscEnd - wMisc)
call CopyBytes
call CloseSRAM
pop de
pop af
; Save it to the target box.
push af
push de
call GetSRAMBank
ld hl, wMisc
ld bc, (wMiscEnd - wMisc)
call CopyBytes
call CloseSRAM
; Load the second part of the active box.
ld a, BANK(sBox)
call GetSRAMBank
ld hl, sBox + (wMiscEnd - wMisc)
ld de, wMisc
ld bc, (wMiscEnd - wMisc)
call CopyBytes
call CloseSRAM
pop de
pop af
ld hl, (wMiscEnd - wMisc)
add hl, de
ld e, l
ld d, h
; Save it to the next part of the target box.
push af
push de
call GetSRAMBank
ld hl, wMisc
ld bc, (wMiscEnd - wMisc)
call CopyBytes
call CloseSRAM
; Load the third and final part of the active box.
ld a, BANK(sBox)
call GetSRAMBank
ld hl, sBox + (wMiscEnd - wMisc) * 2
ld de, wMisc
ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e
call CopyBytes
call CloseSRAM
pop de
pop af
ld hl, (wMiscEnd - wMisc)
add hl, de
ld e, l
ld d, h
; Save it to the final part of the target box.
call GetSRAMBank
ld hl, wMisc
ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e
call CopyBytes
call CloseSRAM
pop hl
ret
; 1517d
LoadBoxAddress: ; 1517d (5:517d)
; Load box via wMisc.
; We do this in three steps because the size of wMisc is less than
; the size of sBox.
push hl
ld l, e
ld h, d
; Load part 1
push af
push hl
call GetSRAMBank
ld de, wMisc
ld bc, (wMiscEnd - wMisc)
call CopyBytes
call CloseSRAM
ld a, BANK(sBox)
call GetSRAMBank
ld hl, wMisc
ld de, sBox
ld bc, (wMiscEnd - wMisc)
call CopyBytes
call CloseSRAM
pop hl
pop af
ld de, (wMiscEnd - wMisc)
add hl, de
; Load part 2
push af
push hl
call GetSRAMBank
ld de, wMisc
ld bc, (wMiscEnd - wMisc)
call CopyBytes
call CloseSRAM
ld a, BANK(sBox)
call GetSRAMBank
ld hl, wMisc
ld de, sBox + (wMiscEnd - wMisc)
ld bc, (wMiscEnd - wMisc)
call CopyBytes
call CloseSRAM
pop hl
pop af
; Load part 3
ld de, (wMiscEnd - wMisc)
add hl, de
call GetSRAMBank
ld de, wMisc
ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e
call CopyBytes
call CloseSRAM
ld a, BANK(sBox)
call GetSRAMBank
ld hl, wMisc
ld de, sBox + (wMiscEnd - wMisc) * 2
ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e
call CopyBytes
call CloseSRAM
pop hl
ret
EraseBoxes: ; 151fb
ld hl, BoxAddresses
ld c, NUM_BOXES
.next
push bc
ld a, [hli]
call GetSRAMBank
ld a, [hli]
ld e, a
ld a, [hli]
ld d, a
xor a
ld [de], a
inc de
ld a, -1
ld [de], a
inc de
ld bc, sBoxEnd - (sBox + 2)
.clear
xor a
ld [de], a
inc de
dec bc
ld a, b
or c
jr nz, .clear
ld a, [hli]
ld e, a
ld a, [hli]
ld d, a
ld a, -1
ld [de], a
inc de
xor a
ld [de], a
call CloseSRAM
pop bc
dec c
jr nz, .next
ret
; 1522d
BoxAddresses: ; 1522d
; dbww bank, address, address
dbww BANK(sBox1), sBox1, sBox1End
dbww BANK(sBox2), sBox2, sBox2End
dbww BANK(sBox3), sBox3, sBox3End
dbww BANK(sBox4), sBox4, sBox4End
dbww BANK(sBox5), sBox5, sBox5End
dbww BANK(sBox6), sBox6, sBox6End
dbww BANK(sBox7), sBox7, sBox7End
dbww BANK(sBox8), sBox8, sBox8End
dbww BANK(sBox9), sBox9, sBox9End
dbww BANK(sBox10), sBox10, sBox10End
dbww BANK(sBox11), sBox11, sBox11End
dbww BANK(sBox12), sBox12, sBox12End
dbww BANK(sBox13), sBox13, sBox13End
dbww BANK(sBox14), sBox14, sBox14End
; 15273
Checksum: ; 15273
ld de, 0
.loop
ld a, [hli]
add e
ld e, a
ld a, 0
adc d
ld d, a
dec bc
ld a, b
or c
jr nz, .loop
ret
; 15283
Text_WouldYouLikeToSaveTheGame: ; 0x15283
; Would you like to save the game?
text_jump UnknownText_0x1c454b
db "@"
; 0x15288
Text_SavingDontTurnOffThePower: ; 0x15288
; SAVING… DON'T TURN OFF THE POWER.
text_jump UnknownText_0x1c456d
db "@"
; 0x1528d
Text_PlayerSavedTheGame: ; 0x1528d
; saved the game.
text_jump UnknownText_0x1c4590
db "@"
; 0x15292
Text_AlreadyASaveFile: ; 0x15292
; There is already a save file. Is it OK to overwrite?
text_jump UnknownText_0x1c45a3
db "@"
; 0x15297
Text_AnotherSaveFile: ; 0x15297
; There is another save file. Is it OK to overwrite?
text_jump UnknownText_0x1c45d9
db "@"
; 0x1529c
Text_SaveFileCorrupted: ; 0x1529c
; The save file is corrupted!
text_jump UnknownText_0x1c460d
db "@"
; 0x152a1
Text_SaveOnBoxSwitch: ; 0x152a1
; When you change a #MON BOX, data will be saved. OK?
text_jump UnknownText_0x1c462a
db "@"
; 0x152a6
Text_SaveOnMovePkmnWOMail: ; 0x152a6
; Each time you move a #MON, data will be saved. OK?
text_jump UnknownText_0x1c465f
db "@"
; 0x152ab