diff options
-rw-r--r-- | constants/misc_constants.asm | 5 | ||||
-rw-r--r-- | engine/save.asm | 669 | ||||
-rw-r--r-- | main.asm | 144 | ||||
-rw-r--r-- | misc/mobile_40.asm | 4 | ||||
-rw-r--r-- | misc/mobile_45.asm | 6 | ||||
-rw-r--r-- | misc/mobile_5f.asm | 4 | ||||
-rw-r--r-- | wram.asm | 149 |
7 files changed, 563 insertions, 418 deletions
diff --git a/constants/misc_constants.asm b/constants/misc_constants.asm index 3e44a2d2f..48471c5f8 100644 --- a/constants/misc_constants.asm +++ b/constants/misc_constants.asm @@ -33,6 +33,11 @@ HP_RED EQU 2 MONS_PER_BOX EQU 20 NUM_BOXES EQU 14 +; hall of fame +HOF_MON_LENGTH = 1 + 2 + 2 + 1 + (PKMN_NAME_LENGTH +- 1) ; species, id, dvs, level, nick +HOF_LENGTH = 1 + HOF_MON_LENGTH * PARTY_LENGTH + 1 ; win count, party, terminator +NUM_HOF_TEAMS = 30 + ; flag manipulation RESET_FLAG EQU 0 diff --git a/engine/save.asm b/engine/save.asm index c1d0c01bd..5a9c445bd 100644 --- a/engine/save.asm +++ b/engine/save.asm @@ -26,10 +26,10 @@ Function14a58: ; 14a58 call SetWRAMStateForSave callba Function14056 callba Function1050d9 - call SavePartyData + call SavePokemonData call Function14e13 - call LoadSavedPartyData - call Function14e8b + call SaveBackupPokemonData + call SaveBackupChecksum callba Function44725 callba Function1406a call ClearWRAMStateAfterSave @@ -48,11 +48,11 @@ Function14a83: ; 14a83 (5:4a83) jr c, .refused call SetWRAMStateForSave call SavingDontTurnOffThePower - call Function14e0c + call SaveBox pop de ld a, e ld [wCurBox], a - call Function15021 + call LoadBox call SavedTheGame call ClearWRAMStateAfterSave and a @@ -76,11 +76,11 @@ Function14ab2: ; 14ab2 Function14ac2: ; 14ac2 call SetWRAMStateForSave push de - call Function14e0c + call SaveBox pop de ld a, e ld [wCurBox], a - call Function15021 + call LoadBox call ClearWRAMStateAfterSave ret ; 14ad5 @@ -88,7 +88,7 @@ Function14ac2: ; 14ac2 Function14ad5: ; 14ad5 call SetWRAMStateForSave push de - call Function14e0c + call SaveBox pop de ld a, e ld [wCurBox], a @@ -96,20 +96,20 @@ Function14ad5: ; 14ad5 ld [wcfcd], a callba Function14056 callba Function1050d9 - call Function14da9 - call SaveOptionsSelection + call ValidateSave + call SaveOptions call SavePlayerData - call SavePartyData + call SavePokemonData call Function14e13 - call Function14e2d - call LoadSavedOptions - call LoadSavedPlayerData - call LoadSavedPartyData - call Function14e8b + call ValidateBackupSave + call SaveBackupOptions + call SaveBackupPlayerData + call SaveBackupPokemonData + call SaveBackupChecksum callba Function44725 callba Function106187 callba Function1406a - call Function15021 + call LoadBox call ClearWRAMStateAfterSave ld de, SFX_SAVE call PlaySFX @@ -150,12 +150,12 @@ ClearWRAMStateAfterSave: ; 14b5a ; 14b5f -Function14b5f: ; 14b5f - ld a, $1 +AddHallOfFameEntry: ; 14b5f + ld a, BANK(sHallOfFame) call GetSRAMBank - ld hl, $bdd9 - ld de, $be3b - ld bc, $0b1a + 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 @@ -165,28 +165,28 @@ Function14b5f: ; 14b5f or b jr nz, .loop ld hl, OverworldMap - ld de, $b2c0 - ld bc, 7 * 14 + ld de, sHallOfFame + ld bc, HOF_LENGTH call CopyBytes call CloseSRAM ret ; 14b85 -Function14b85: ; 14b85 - call Function14c10 +SaveGameData: ; 14b85 + call SaveGameData_ ret ; 14b89 CheckForExistingSaveFile: ; 14b89 ld a, [wcfcd] and a - jr z, .getridofpreviousplayersave + jr z, .erase call Function14bcb jr z, .yoursavefile ld hl, UnknownText_0x15297 call SaveTheGame_yesorno jr nz, .refused - jr .getridofpreviousplayersave + jr .erase .yoursavefile ld hl, UnknownText_0x15292 @@ -194,8 +194,8 @@ CheckForExistingSaveFile: ; 14b89 jr nz, .refused jr .ok -.getridofpreviousplayersave - call GetRidOfPreviousPlayersSave +.erase + call ErasePreviousSave .ok and a @@ -223,9 +223,9 @@ SaveTheGame_yesorno: ; 14baf ; 14bcb Function14bcb: ; 14bcb - ld a, $1 + ld a, BANK(sPlayerData) call GetSRAMBank - ld hl, $a009 + ld hl, sPlayerData + (PlayerID - wPlayerData) ld a, [hli] ld c, [hl] ld b, a @@ -241,7 +241,7 @@ Function14bcb: ; 14bcb _SavingDontTurnOffThePower: ; 14be3 call SavingDontTurnOffThePower SavedTheGame: ; 14be6 - call Function14c10 + call SaveGameData_ ; wait 32 frames ld c, $20 call DelayFrames @@ -267,74 +267,77 @@ SavedTheGame: ; 14be6 ; 14c10 -Function14c10: ; 14c10 +SaveGameData_: ; 14c10 ld a, 1 ld [wcfcd], a callba Function14056 callba Function1050d9 - call Function14da9 - call SaveOptionsSelection + call ValidateSave + call SaveOptions call SavePlayerData - call SavePartyData - call Function14e0c + call SavePokemonData + call SaveBox call Function14e13 - call Function14e2d - call LoadSavedOptions - call LoadSavedPlayerData - call LoadSavedPartyData - call Function14e8b - call Function14c6b + call ValidateBackupSave + call SaveBackupOptions + call SaveBackupPlayerData + call SaveBackupPokemonData + call SaveBackupChecksum + call UpdateStackTop callba Function44725 callba Function106187 callba Function1406a - ld a, $1 + ld a, BANK(s1_be45) call GetSRAMBank - ld a, [$be45] + ld a, [s1_be45] cp $4 - jr nz, .asm_14c67 + jr nz, .ok xor a - ld [$be45], a - -.asm_14c67 + ld [s1_be45], a +.ok call CloseSRAM ret ; 14c6b -Function14c6b: ; 14c6b - call Function14c90 - ld a, $0 +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, [$bf10] + ld a, [sStackTop + 0] ld e, a - ld a, [$bf11] + ld a, [sStackTop + 1] ld d, a or e - jr z, .asm_14c84 + jr z, .update ld a, e sub l ld a, d sbc h - jr c, .asm_14c8c + jr c, .done -.asm_14c84 +.update ld a, l - ld [$bf10], a + ld [sStackTop + 0], a ld a, h - ld [$bf11], a + ld [sStackTop + 1], a -.asm_14c8c +.done call CloseSRAM ret ; 14c90 -Function14c90: ; 14c90 - ld hl, wc000 -.asm_14c93 +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 .asm_14c93 + jr .loop ; 14c99 SavingDontTurnOffThePower: ; 14c99 @@ -363,49 +366,49 @@ SavingDontTurnOffThePower: ; 14c99 ; 14cbb -GetRidOfPreviousPlayersSave: ; 14cbb - call Function151fb - call Function14d06 - call Function14ce2 - call Function14cf4 +ErasePreviousSave: ; 14cbb + call EraseBoxes + call EraseHallOfFame + call EraseLinkBattleStats + call EraseMysteryGift call Function14d68 call Function14d5c - ld a, $0 + ld a, BANK(sStackTop) call GetSRAMBank xor a - ld [$bf10], a - ld [$bf11], a + ld [sStackTop + 0], a + ld [sStackTop + 1], a call CloseSRAM ld a, $1 ld [wd4b4], a ret ; 14ce2 -Function14ce2: ; 14ce2 - ld a, $1 +EraseLinkBattleStats: ; 14ce2 + ld a, BANK(sLinkBattleStats) call GetSRAMBank - ld hl, $b260 - ld bc, $0060 + ld hl, sLinkBattleStats + ld bc, sLinkBattleStatsEnd - sLinkBattleStats xor a call ByteFill jp CloseSRAM ; 14cf4 -Function14cf4: ; 14cf4 - ld a, $0 +EraseMysteryGift: ; 14cf4 + ld a, BANK(s0_abe4) call GetSRAMBank - ld hl, $abe4 - ld bc, $004c + ld hl, s0_abe4 + ld bc, s0_abe4End - s0_abe4 xor a call ByteFill jp CloseSRAM ; 14d06 -Function14d06: ; 14d06 - ld a, $1 +EraseHallOfFame: ; 14d06 + ld a, BANK(sHallOfFame) call GetSRAMBank - ld hl, $b2c0 - ld bc, $0b7c + ld hl, sHallOfFame + ld bc, sHallOfFameEnd - sHallOfFame xor a call ByteFill jp CloseSRAM @@ -434,10 +437,10 @@ Unknown_14d2c: ; 14d2c ; 14d5c Function14d5c: ; 14d5c - ld a, $1 + ld a, BANK(s1_be45) call GetSRAMBank xor a - ld [$be45], a + ld [s1_be45], a jp CloseSRAM ; 14d68 @@ -486,176 +489,175 @@ Function14da0: ; 14da0 ld a, [wd4b4] and a ret nz - call GetRidOfPreviousPlayersSave + call ErasePreviousSave ret ; 14da9 -Function14da9: ; 14da9 - ld a, $1 +ValidateSave: ; 14da9 + ld a, BANK(s1_a008) call GetSRAMBank - ld a, 99 - ld [$a008], a - ld a, " " - ld [$ad0f], a + ld a, $63 + ld [s1_a008], a + ld a, $7f + ld [s1_ad0f], a jp CloseSRAM ; 14dbb -SaveOptionsSelection: ; 14dbb -; Copy Options to SRA1:a000 - ld a, $1 +SaveOptions: ; 14dbb + ld a, BANK(sOptions) call GetSRAMBank ld hl, Options - ld de, $a000 + ld de, sOptions ld bc, OptionsEnd - Options call CopyBytes ld a, [Options] and $ef - ld [$a000], a + ld [sOptions], a jp CloseSRAM ; 14dd7 SavePlayerData: ; 14dd7 -; Copy 2122 bytes starting at PlayerID to SRA1:a009 - ld a, $1 + ld a, BANK(sPlayerData) call GetSRAMBank - ld hl, PlayerID - ld de, $a009 - ld bc, VisitedSpawns - PlayerID + ld hl, wPlayerData + ld de, sPlayerData + ld bc, wPlayerDataEnd - wPlayerData call CopyBytes - ld hl, VisitedSpawns - ld de, $a833 - ld bc, PartyCount - VisitedSpawns + ld hl, wMapData + ld de, sMapData + ld bc, wMapDataEnd - wMapData call CopyBytes jp CloseSRAM ; 14df7 -SavePartyData: ; 14df7 -; Copy your party to SRA1:a865. - ld a, $1 +SavePokemonData: ; 14df7 + ld a, BANK(sPokemonData) call GetSRAMBank - ld hl, PartyCount - ld de, $a865 - ld bc, wdff5 - PartyCount + ld hl, wPokemonData + ld de, sPokemonData + ld bc, wPokemonDataEnd - wPokemonData call CopyBytes call CloseSRAM ret ; 14e0c -Function14e0c: ; 14e0c - call Function150d8 - call Function150f9 +SaveBox: ; 14e0c + call GetBoxAddress + call SaveBoxAddress ret ; 14e13 Function14e13: ; 14e13 - ld hl, $a009 - ld bc, $0b7a - ld a, $1 + ld hl, sGameData + ld bc, sGameDataEnd - sGameData + ld a, BANK(sGameData) call GetSRAMBank - call Function15273 + call Checksum ld a, e - ld [$ad0d], a + ld [sChecksum + 0], a ld a, d - ld [$ad0e], a + ld [sChecksum + 1], a call CloseSRAM ret ; 14e2d -Function14e2d: ; 14e2d - ld a, $0 +ValidateBackupSave: ; 14e2d + ld a, BANK(s0_b208) call GetSRAMBank - ld a, 99 - ld [$b208], a - ld a, " " - ld [$bf0f], a + ld a, $63 + ld [s0_b208], a + ld a, $7f + ld [s0_bf0f], a call CloseSRAM ret ; 14e40 -LoadSavedOptions: ; 14e40 - ld a, $0 +SaveBackupOptions: ; 14e40 + ld a, BANK(sBackupOptions) call GetSRAMBank ld hl, Options - ld de, $b200 + ld de, sBackupOptions ld bc, OptionsEnd - Options call CopyBytes call CloseSRAM ret ; 14e55 -LoadSavedPlayerData: ; 14e55 - ld a, $0 +SaveBackupPlayerData: ; 14e55 + ld a, BANK(sBackupPlayerData) call GetSRAMBank - ld hl, PlayerID - ld de, $b209 - ld bc, VisitedSpawns - PlayerID + ld hl, wPlayerData + ld de, sBackupPlayerData + ld bc, wPlayerDataEnd - wPlayerData call CopyBytes - ld hl, VisitedSpawns - ld de, $ba33 - ld bc, PartyCount - VisitedSpawns + ld hl, wMapData + ld de, sBackupMapData + ld bc, wMapDataEnd - wMapData call CopyBytes call CloseSRAM ret ; 14e76 -LoadSavedPartyData: ; 14e76 - ld a, $0 +SaveBackupPokemonData: ; 14e76 + ld a, BANK(sBackupPokemonData) call GetSRAMBank - ld hl, PartyCount - ld de, $ba65 - ld bc, wdff5 - PartyCount + ld hl, wPokemonData + ld de, sBackupPokemonData + ld bc, wPokemonDataEnd - wPokemonData call CopyBytes call CloseSRAM ret ; 14e8b -Function14e8b: ; 14e8b - ld hl, $b209 - ld bc, $0b7a - ld a, $0 +SaveBackupChecksum: ; 14e8b + ld hl, sBackupGameData + ld bc, sBackupGameDataEnd - sBackupGameData + ld a, BANK(sBackupGameData) call GetSRAMBank - call Function15273 + call Checksum ld a, e - ld [$bf0d], a + ld [sBackupChecksum + 0], a ld a, d - ld [$bf0e], a + ld [sBackupChecksum + 1], a call CloseSRAM ret ; 14ea5 TryLoadSaveFile: ; 14ea5 (5:4ea5) - call Function15028 - jr nz, .trytowrite - call Function14fd7 - call Function1500c - call Function15021 + call VerifyChecksum + jr nz, .backup + call LoadPlayerData + call LoadPokemonData + call LoadBox callba Function44745 callba Function10619d callba Function1050ea - call Function14e2d - call LoadSavedOptions - call LoadSavedPlayerData - call LoadSavedPartyData - call Function14e8b + call ValidateBackupSave + call SaveBackupOptions + call SaveBackupPlayerData + call SaveBackupPokemonData + call SaveBackupChecksum and a ret -.trytowrite - call Function1507c + +.backup + call VerifyBackupChecksum jr nz, .corrupt - call Function15046 - call Function15067 - call Function15021 + call LoadBackupPlayerData + call LoadBackupPokemonData + call LoadBox callba Function44745 callba Function10619d callba Function1050ea - call Function14da9 - call SaveOptionsSelection + call ValidateSave + call SaveOptions call SavePlayerData - call SavePartyData + call SavePokemonData call Function14e13 and a ret + .corrupt ld a, [Options] push af @@ -675,39 +677,41 @@ Function14f1c: ; 14f1c call Function14f84 ld a, [wcfcd] and a - jr z, .asm_14f46 - ld a, $1 + jr z, .backup + + ld a, BANK(sPlayerData) call GetSRAMBank - ld hl, $a044 + ld hl, sPlayerData + StartDay - wPlayerData ld de, StartDay - ld bc, $0008 + ld bc, 8 call CopyBytes - ld hl, $a3da + ld hl, sPlayerData + StatusFlags - wPlayerData ld de, StatusFlags ld a, [hl] ld [de], a call CloseSRAM ret -.asm_14f46 +.backup call Function14faf ld a, [wcfcd] and a - jr z, .asm_14f6c - ld a, $0 + jr z, .corrupt + + ld a, BANK(sBackupPlayerData) call GetSRAMBank - ld hl, $b244 + ld hl, sBackupPlayerData + StartDay - wPlayerData ld de, StartDay ld bc, 8 call CopyBytes - ld hl, $b5da + ld hl, sBackupPlayerData + StatusFlags - wPlayerData ld de, StatusFlags ld a, [hl] ld [de], a call CloseSRAM ret -.asm_14f6c +.corrupt ld hl, DefaultOptions ld de, Options ld bc, OptionsEnd - Options @@ -728,15 +732,15 @@ DefaultOptions: ; 14f7c ; 14f84 Function14f84: ; 14f84 - ld a, $1 + ld a, BANK(s1_a008) call GetSRAMBank - ld a, [$a008] - cp 99 + ld a, [s1_a008] + cp $63 jr nz, .nope - ld a, [$ad0f] - cp " " + ld a, [s1_ad0f] + cp $7f jr nz, .nope - ld hl, $a000 + ld hl, sOptions ld de, Options ld bc, OptionsEnd - Options call CopyBytes @@ -750,15 +754,15 @@ Function14f84: ; 14f84 ; 14faf Function14faf: ; 14faf - ld a, $0 + ld a, BANK(s0_b208) call GetSRAMBank - ld a, [$b208] - cp 99 + ld a, [s0_b208] + cp $63 jr nz, .nope - ld a, [$bf0f] - cp " " + ld a, [s0_bf0f] + cp $7f jr nz, .nope - ld hl, $b200 + ld hl, sBackupOptions ld de, Options ld bc, OptionsEnd - Options call CopyBytes @@ -771,56 +775,55 @@ Function14faf: ; 14faf ; 14fd7 -Function14fd7: ; 14fd7 (5:4fd7) - ld a, $1 +LoadPlayerData: ; 14fd7 (5:4fd7) + ld a, BANK(sPlayerData) call GetSRAMBank - ld hl, $a009 - ld de, PlayerID - ld bc, VisitedSpawns - PlayerID + ld hl, sPlayerData + ld de, wPlayerData + ld bc, wPlayerDataEnd - wPlayerData call CopyBytes - ld hl, $a833 - ld de, VisitedSpawns - ld bc, PartyCount - VisitedSpawns + ld hl, sMapData + ld de, wMapData + ld bc, wMapDataEnd - wMapData call CopyBytes call CloseSRAM - ld a, $1 + ld a, BANK(s1_be45) call GetSRAMBank - ld a, [$be45] + ld a, [s1_be45] cp $4 jr nz, .asm_15008 ld a, $3 - ld [$be45], a + ld [s1_be45], a .asm_15008 call CloseSRAM ret -Function1500c: ; 1500c - ld a, $1 +LoadPokemonData: ; 1500c + ld a, BANK(sPokemonData) call GetSRAMBank - ld hl, $a865 - ld de, PartyCount - ld bc, wdff5 - PartyCount + ld hl, sPokemonData + ld de, wPokemonData + ld bc, wPokemonDataEnd - wPokemonData call CopyBytes call CloseSRAM ret ; 15021 - -Function15021: ; 15021 (5:5021) - call Function150d8 - call Function1517d +LoadBox: ; 15021 (5:5021) + call GetBoxAddress + call LoadBoxAddress ret -Function15028: ; 15028 (5:5028) - ld hl, $a009 - ld bc, $b7a - ld a, $1 +VerifyChecksum: ; 15028 (5:5028) + ld hl, sGameData + ld bc, sGameDataEnd - sGameData + ld a, BANK(sGameData) call GetSRAMBank - call Function15273 - ld a, [$ad0d] + call Checksum + ld a, [sChecksum + 0] cp e jr nz, .asm_15040 - ld a, [$ad0e] + ld a, [sChecksum + 1] cp d .asm_15040 push af @@ -828,40 +831,40 @@ Function15028: ; 15028 (5:5028) pop af ret -Function15046: ; 15046 (5:5046) - ld a, $0 +LoadBackupPlayerData: ; 15046 (5:5046) + ld a, BANK(sBackupPlayerData) call GetSRAMBank - ld hl, $b209 - ld de, PlayerID - ld bc, VisitedSpawns - PlayerID + ld hl, sBackupPlayerData + ld de, wPlayerData + ld bc, wPlayerDataEnd - wPlayerData call CopyBytes - ld hl, $ba33 - ld de, VisitedSpawns - ld bc, PartyCount - VisitedSpawns + ld hl, sBackupMapData + ld de, wMapData + ld bc, wMapDataEnd - wMapData call CopyBytes call CloseSRAM ret -Function15067: ; 15067 (5:5067) - ld a, $0 +LoadBackupPokemonData: ; 15067 (5:5067) + ld a, BANK(sBackupPokemonData) call GetSRAMBank - ld hl, $ba65 - ld de, PartyCount - ld bc, wdff5 - PartyCount + ld hl, sBackupPokemonData + ld de, wPokemonData + ld bc, wPokemonDataEnd - wPokemonData call CopyBytes call CloseSRAM ret -Function1507c: ; 1507c (5:507c) - ld hl, $b209 - ld bc, $b7a - ld a, $0 +VerifyBackupChecksum: ; 1507c (5:507c) + ld hl, sBackupGameData + ld bc, sBackupGameDataEnd - sBackupGameData + ld a, BANK(sBackupGameData) call GetSRAMBank - call Function15273 - ld a, [$bf0d] + call Checksum + ld a, [sBackupChecksum + 0] cp e jr nz, .asm_15094 - ld a, [$bf0e] + ld a, [sBackupChecksum + 1] cp d .asm_15094 push af @@ -871,47 +874,54 @@ Function1507c: ; 1507c (5:507c) Function1509a: ; 1509a - ld a, $1 + ld a, BANK(sCrystalData) call GetSRAMBank - ld hl, PlayerGender - ld de, $be3d - ld bc, wd479 - PlayerGender + ld hl, wCrystalData + ld de, sCrystalData + ld bc, wCrystalDataEnd - wCrystalData call CopyBytes + + ; XXX $a60e-f is a static address left over from JP Crystal. + ; It appears to correspond to event flags 0x160-0x16f in that version. ld hl, wd479 ld a, [hli] - ld [$a60e], a + ld [$a60e + 0], a ld a, [hli] - ld [$a60f], a + ld [$a60e + 1], a + jp CloseSRAM -; 150b9 -Function150b9: ; 150b9 (5:50b9) - ld a, $1 +Function150b9: ; 150b9 + ld a, BANK(sCrystalData) call GetSRAMBank - ld hl, $be3d - ld de, PlayerGender - ld bc, wd479 - PlayerGender + ld hl, sCrystalData + ld de, wCrystalData + ld bc, wCrystalDataEnd - wCrystalData call CopyBytes + + ; XXX $a60e-f is a static address left over from JP Crystal. + ; It appears to correspond to event flags 0x160-0x16f in that version. ld hl, wd479 - ld a, [$a60e] + ld a, [$a60e + 0] ld [hli], a - ld a, [$a60f] + ld a, [$a60e + 1] ld [hli], a + jp CloseSRAM -Function150d8: ; 150d8 +GetBoxAddress: ; 150d8 ld a, [wCurBox] cp NUM_BOXES - jr c, .asm_150e3 + jr c, .ok xor a ld [wCurBox], a -.asm_150e3 +.ok ld e, a ld d, 0 - ld hl, Unknown_1522d + ld hl, BoxAddresses rept 5 add hl, de endr @@ -928,129 +938,141 @@ endr ret ; 150f9 -Function150f9: ; 150f9 +SaveBoxAddress: ; 150f9 push hl + push af push de - ld a, $1 + ld a, BANK(sBox) call GetSRAMBank - ld hl, sBoxCount - ld de, wc608 - ld bc, $01e0 + ld hl, sBox + ld de, wMisc + ld bc, (wMiscEnd - wMisc) call CopyBytes call CloseSRAM pop de pop af + push af push de call GetSRAMBank - ld hl, wc608 - ld bc, $01e0 + ld hl, wMisc + ld bc, (wMiscEnd - wMisc) call CopyBytes call CloseSRAM - ld a, $1 + ld a, BANK(sBox) call GetSRAMBank - ld hl, $aef0 - ld de, wc608 - ld bc, $01e0 + ld hl, sBox + (wMiscEnd - wMisc) + ld de, wMisc + ld bc, (wMiscEnd - wMisc) call CopyBytes call CloseSRAM pop de pop af - ld hl, $01e0 + + ld hl, (wMiscEnd - wMisc) add hl, de ld e, l ld d, h + push af push de call GetSRAMBank - ld hl, wc608 - ld bc, $01e0 + ld hl, wMisc + ld bc, (wMiscEnd - wMisc) call CopyBytes call CloseSRAM - ld a, $1 + ld a, BANK(sBox) call GetSRAMBank - ld hl, $b0d0 - ld de, wc608 - ld bc, $008e + 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, $01e0 + + ld hl, (wMiscEnd - wMisc) add hl, de ld e, l ld d, h + call GetSRAMBank - ld hl, wc608 - ld bc, $008e + ld hl, wMisc + ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e call CopyBytes call CloseSRAM + pop hl ret ; 1517d -Function1517d: ; 1517d (5:517d) +LoadBoxAddress: ; 1517d (5:517d) push hl ld l, e ld h, d + push af push hl call GetSRAMBank - ld de, wc608 - ld bc, $1e0 + ld de, wMisc + ld bc, (wMiscEnd - wMisc) call CopyBytes call CloseSRAM - ld a, $1 + ld a, BANK(sBox) call GetSRAMBank - ld hl, wc608 - ld de, $ad10 - ld bc, $1e0 + ld hl, wMisc + ld de, sBox + ld bc, (wMiscEnd - wMisc) call CopyBytes call CloseSRAM pop hl pop af - ld de, $1e0 + + ld de, (wMiscEnd - wMisc) add hl, de + push af push hl call GetSRAMBank - ld de, wc608 - ld bc, $1e0 + ld de, wMisc + ld bc, (wMiscEnd - wMisc) call CopyBytes call CloseSRAM - ld a, $1 + ld a, BANK(sBox) call GetSRAMBank - ld hl, wc608 - ld de, $aef0 - ld bc, $1e0 + ld hl, wMisc + ld de, sBox + (wMiscEnd - wMisc) + ld bc, (wMiscEnd - wMisc) call CopyBytes call CloseSRAM pop hl pop af - ld de, $1e0 + + ld de, (wMiscEnd - wMisc) add hl, de call GetSRAMBank - ld de, wc608 - ld bc, $8e + ld de, wMisc + ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e call CopyBytes call CloseSRAM - ld a, $1 + ld a, BANK(sBox) call GetSRAMBank - ld hl, wc608 - ld de, $b0d0 - ld bc, $8e + ld hl, wMisc + ld de, sBox + (wMiscEnd - wMisc) * 2 + ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e call CopyBytes call CloseSRAM + pop hl ret -Function151fb: ; 151fb - ld hl, Unknown_1522d - ld c, $e -.outerloop +EraseBoxes: ; 151fb + ld hl, BoxAddresses + ld c, NUM_BOXES +.next push bc ld a, [hli] call GetSRAMBank @@ -1064,15 +1086,15 @@ Function151fb: ; 151fb ld a, -1 ld [de], a inc de - ld bc, $044c -.loop + ld bc, sBoxEnd - (sBox + 2) +.clear xor a ld [de], a inc de dec bc ld a, b or c - jr nz, .loop + jr nz, .clear ld a, [hli] ld e, a ld a, [hli] @@ -1085,31 +1107,30 @@ Function151fb: ; 151fb call CloseSRAM pop bc dec c - jr nz, .outerloop + jr nz, .next ret ; 1522d -Unknown_1522d: ; 1522d +BoxAddresses: ; 1522d ; dbww bank, address, address - dbww $02, $a000, $a44e ; 2, $a000, $a44e - dbww $02, $a450, $a89e ; 2, $a450, $a89e - dbww $02, $a8a0, $acee ; 2, $a8a0, $acee - dbww $02, $acf0, $b13e ; 2, $acf0, $b13e - dbww $02, $b140, $b58e ; 2, $b140, $b5de - dbww $02, $b590, $b9de ; 2, $b590, $b9de - dbww $02, $b9e0, $be2e ; 2, $b9e0, $be2e - - dbww $03, $a000, $a44e ; 3, $a000, $a44e - dbww $03, $a450, $a89e ; 3, $a450, $a89e - dbww $03, $a8a0, $acee ; 3, $a8a0, $acee - dbww $03, $acf0, $b13e ; 3, $acf0, $b13e - dbww $03, $b140, $b58e ; 3, $b140, $b58e - dbww $03, $b590, $b9de ; 3, $b590, $b9de - dbww $03, $b9e0, $be2e ; 3, $b9e0, $be2e + 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 -Function15273: ; 15273 +Checksum: ; 15273 ld de, 0 .loop ld a, [hli] @@ -209,7 +209,7 @@ _ResetWRAM: ; 5bae call SetDefaultBoxNames - ld a, 1 + ld a, BANK(sBoxCount) call GetSRAMBank ld hl, sBoxCount call InitList @@ -239,9 +239,9 @@ _ResetWRAM: ; 5bae ld [wRoamMon2MapNumber], a ld [wRoamMon3MapNumber], a - ld a, 0 + ld a, BANK(s0_abe2) call GetSRAMBank - ld hl, $abe2 + ld hl, s0_abe2 xor a ld [hli], a dec a @@ -28832,7 +28832,7 @@ Function28177: ; 28177 ld [wc2d7], a pop af ld [Options], a - callba Function1500c + callba LoadPokemonData jp Function28b22 .asm_283a9 @@ -34330,12 +34330,12 @@ Function2c642: ; 2c642 (b:4642) call Function2c6ac ld [de], a inc de - ld a, $0 + ld a, BANK(s0_abe4) call GetSRAMBank - ld a, [$abe4] + ld a, [s0_abe4] ld [de], a inc de - ld a, [$abe5] + ld a, [s0_abe4 + 1] ld [de], a ld a, $14 ld [wca00], a @@ -35637,9 +35637,9 @@ endr jp Function3991b .cal2 - ld a, $0 + ld a, BANK(sMysteryGiftTrainer) call GetSRAMBank - ld de, $ac0a + ld de, sMysteryGiftTrainer call TrainerType2 call CloseSRAM jr .done @@ -37488,48 +37488,49 @@ GivePokeItem:: ; 446cc jp CloseSRAM ; 44725 + Function44725: ; 44725 - ld a, $0 + ld a, BANK(s0_a600) call GetSRAMBank - ld hl, $a600 - ld de, $a71a - ld bc, $011a + ld hl, s0_a600 + ld de, s0_a71a + ld bc, $11a call CopyBytes - ld hl, $a834 - ld de, $aa0b - ld bc, $01d7 + ld hl, s0_a834 + ld de, s0_aa0b + ld bc, $1d7 call CopyBytes jp CloseSRAM ; 44745 - Function44745: ; 44745 (11:4745) - ld a, $0 + ld a, BANK(s0_a600) call GetSRAMBank - ld hl, $a71a - ld de, $a600 + ld hl, s0_a71a + ld de, s0_a600 ld bc, $11a call CopyBytes - ld hl, $aa0b - ld de, $a834 + ld hl, s0_aa0b + ld de, s0_a834 ld bc, $1d7 call CopyBytes jp CloseSRAM Function44765: ; 44765 (11:4765) - ld a, $0 + ld a, BANK(s0_a600) call GetSRAMBank xor a - ld hl, $a600 + ld hl, s0_a600 ld bc, $11a call ByteFill xor a - ld hl, $a834 + ld hl, s0_a834 ld bc, $1d7 call ByteFill jp CloseSRAM ; 44781 (11:4781) + Function44781: ; 44781 ld a, [PartyCount] and a @@ -54451,15 +54452,17 @@ HallOfFame:: ; 0x8640e set 6, [hl] ; hall of fame callba Function14da0 + ld hl, wd95e ld a, [hl] cp 200 - jr nc, .ok ; 0x86433 $1 + jr nc, .ok inc [hl] .ok - callba Function14b85 - call Function8653f - callba Function14b5f + callba SaveGameData + call GetHallOfFameParty + callba AddHallOfFameEntry + xor a ld [wc2cd], a call Function864c3 @@ -54565,7 +54568,7 @@ Function8650c: ; 8650c decoord 6, 5 ld c, $6 predef Functiond066e - ld c, $3c + ld c, 60 call DelayFrames and a ret @@ -54576,9 +54579,9 @@ String_8652c: ; 8653f -Function8653f: ; 8653f +GetHallOfFameParty: ; 8653f ld hl, OverworldMap - ld bc, $0062 + ld bc, HOF_LENGTH xor a call ByteFill ld a, [wd95e] @@ -54587,31 +54590,34 @@ Function8653f: ; 8653f inc de ld hl, PartySpecies ld c, 0 -.asm_86556 +.next ld a, [hli] cp $ff - jr z, .asm_865b1 + jr z, .done cp EGG - jr nz, .asm_86562 + jr nz, .mon inc c - jr .asm_86556 + jr .next -.asm_86562 +.mon push hl push de push bc + ld a, c - ld hl, PartyMon1Species + ld hl, PartyMons ld bc, PartyMon2 - PartyMon1 call AddNTimes ld c, l ld b, h - ld hl, $0000 + + ld hl, PartyMon1Species - PartyMon1 add hl, bc ld a, [hl] ld [de], a inc de - ld hl, $0006 + + ld hl, PartyMon1ID - PartyMon1 add hl, bc ld a, [hli] ld [de], a @@ -54619,7 +54625,8 @@ Function8653f: ; 8653f ld a, [hl] ld [de], a inc de - ld hl, $0015 + + ld hl, PartyMon1DVs - PartyMon1 add hl, bc ld a, [hli] ld [de], a @@ -54627,30 +54634,33 @@ Function8653f: ; 8653f ld a, [hl] ld [de], a inc de - ld hl, $001f + + ld hl, PartyMon1Level - PartyMon1 add hl, bc ld a, [hl] ld [de], a inc de + pop bc push bc ld a, c ld hl, PartyMonNicknames - ld bc, $000b + ld bc, PKMN_NAME_LENGTH call AddNTimes - ld bc, $000a + ld bc, PKMN_NAME_LENGTH - 1 call CopyBytes + pop bc inc c pop de - ld hl, $0010 + ld hl, HOF_MON_LENGTH add hl, de ld e, l ld d, h pop hl - jr .asm_86556 + jr .next -.asm_865b1 +.done ld a, $ff ld [de], a ret @@ -82434,7 +82444,7 @@ Functione3267: ; e3267 call Functione3316 ld a, $1 ld [wc2cd], a - callba Function14b85 + callba SaveGameData xor a ld [wc2cd], a call Functione32fa @@ -89618,7 +89628,7 @@ UnknownText_0x104a20: ; 104a20 Function104a25: ; 104a25 (41:4a25) call Function105106 - ld a, [$abe5] + ld a, [s0_abe5] cp $5 jp CloseSRAM @@ -89628,9 +89638,9 @@ Function104a30: ; 104a30 (41:4a30) ld b, a ld a, [wc902] ld c, a - ld a, [$abe5] + ld a, [s0_abe5] ld d, a - ld hl, $abe6 + ld hl, s0_abe6 .asm_104a42 ld a, d and a @@ -89652,10 +89662,10 @@ Function104a30: ; 104a30 (41:4a30) Function104a56: ; 104a56 (41:4a56) call Function105106 - ld hl, $abe5 + ld hl, s0_abe5 ld a, [hl] inc [hl] - ld hl, $abe6 + ld hl, s0_abe6 ld e, a ld d, $0 rept 2 @@ -89670,9 +89680,9 @@ endr Function104a71: ; 104a71 (41:4a71) call Function105106 ld a, $1 - ld [$abfd], a + ld [s0_abfd], a ld hl, wc903 - ld de, $abfe + ld de, s0_abfe ld bc, $b call CopyBytes ld a, $1 @@ -90538,7 +90548,7 @@ Function105069: ; 105069 (41:5069) call Function105106 ld d, $0 ld b, $2 - ld hl, $abf0 + ld hl, s0_abf0 predef_id FlagPredef push hl push bc @@ -90563,7 +90573,7 @@ Function105091: ; 105091 (41:5091) push bc ld d, $0 ld b, $2 - ld hl, $abf0 + ld hl, s0_abf0 predef FlagPredef ld a, c and a @@ -90575,31 +90585,29 @@ Function105091: ; 105091 (41:5091) .asm_1050b0 inc c ld a, c - cp $2b + cp $2a + 1 jr c, .asm_105096 jp CloseSRAM Special_UnlockMysteryGift: ; 1050b9 call Function105106 - ld hl, $abe3 + ld hl, s0_abe3 ld a, [hl] inc a jr nz, .ok ld [hld], a ld [hl], a - .ok jp CloseSRAM ; 1050c8 Function1050c8: ; 1050c8 call Function105106 - ld a, [$abe5] + ld a, [s0_abe5] cp $ff jr z, .asm_1050d6 xor a - ld [$abe5], a - + ld [s0_abe5], a .asm_1050d6 jp CloseSRAM ; 1050d9 @@ -90607,8 +90615,8 @@ Function1050c8: ; 1050c8 Function1050d9: ; 1050d9 call Function105106 - ld hl, $abe2 - ld de, $abe4 + ld hl, s0_abe2 + ld de, s0_abe4 ld a, [hli] ld [de], a inc de @@ -90620,8 +90628,8 @@ Function1050d9: ; 1050d9 Function1050ea: ; 1050ea (41:50ea) call Function105106 - ld hl, $abe4 - ld de, $abe2 + ld hl, s0_abe4 + ld de, s0_abe2 ld a, [hli] ld [de], a inc de @@ -90641,7 +90649,7 @@ Function1050fb: ; 1050fb (41:50fb) Function105106: ; 105106 - ld a, $0 + ld a, BANK(s0_abe4) jp GetSRAMBank ; 10510b diff --git a/misc/mobile_40.asm b/misc/mobile_40.asm index ae62b5622..fa3490f82 100644 --- a/misc/mobile_40.asm +++ b/misc/mobile_40.asm @@ -401,7 +401,7 @@ Function1002c9: ; 1002c9 bit 0, [hl] ret z callba Function3f6d0 - callba Function1500c + callba LoadPokemonData ret ; 1002dc @@ -4036,7 +4036,7 @@ Function101a4f: ; 101a4f xor a ld [wc2d7], a callba Function3f6d0 - callba Function1500c + callba LoadPokemonData call Function1013c0 ld a, [wcd25] inc a diff --git a/misc/mobile_45.asm b/misc/mobile_45.asm index 331935802..fe4729b9c 100644 --- a/misc/mobile_45.asm +++ b/misc/mobile_45.asm @@ -16886,7 +16886,7 @@ Function11c1ca: ; 11c1ca call EnableLCD callba Function104061 callba Function8cf53 - callba Function1500c + callba LoadPokemonData callba Function40c30 ld a, [rSVBK] push af @@ -22846,7 +22846,7 @@ Function17024d: ; 17024d call Function1702b7 call Function170bf7 predef StartBattle - callba Function1500c + callba LoadPokemonData callba HealParty ld a, [wd0ee] ld [ScriptVar], a @@ -23591,7 +23591,7 @@ Function170729: ; 170729 (5c:4729) ret Function170737: ; 170737 (5c:4737) - callba SaveOptionsSelection + callba SaveOptions ret Function17073e: ; 17073e (5c:473e) diff --git a/misc/mobile_5f.asm b/misc/mobile_5f.asm index acf5ede40..8e675e0d3 100644 --- a/misc/mobile_5f.asm +++ b/misc/mobile_5f.asm @@ -3060,7 +3060,7 @@ Function17e367: ; 17e367 push af ld a, $1 ld [rSVBK], a - callba Function14c10 + callba SaveGameData_ pop af ld [rSVBK], a ret @@ -3086,7 +3086,7 @@ Function17e395: ; 17e395 push af ld a, $1 ld [rSVBK], a - callba Function14e0c + callba SaveBox pop af ld [rSVBK], a ret @@ -69,6 +69,19 @@ battle_struct: MACRO \1Type2:: db ENDM +box: MACRO +\1:: +\1Count:: ds 1 +\1Species:: ds MONS_PER_BOX + 1 +\1Mons:: +\1Mon1:: box_struct \1Mon1 +\1Mon2:: ds box_struct_length * (MONS_PER_BOX +- 1) +\1MonOT:: ds NAME_LENGTH * MONS_PER_BOX +\1MonNicknames:: ds PKMN_NAME_LENGTH * MONS_PER_BOX +\1MonNicknamesEnd:: +\1End:: ds 2 ; padding +ENDM + channel_struct: MACRO ; Addreses are Channel1 (c101). @@ -428,6 +441,7 @@ TileMapEnd:: SECTION "Battle", WRAM0 +wMisc:: wBattle:: wc608:: @@ -864,6 +878,9 @@ IF DEF(CRYSTAL11) wPokedexStatus:: ENDC ds 3 + +wMiscEnd:: + wc7e8:: ds 24 @@ -1295,6 +1312,7 @@ Options2:: ; cfd1 ds 2 OptionsEnd:: + wcfd4:: ds 1 wcfd5:: ds 1 wcfd6:: ds 1 @@ -1885,6 +1903,7 @@ wd466:: ds 6 wd46c:: ds 1 wd46d:: ds 5 +wCrystalData:: PlayerGender:: ; d472 ; bit 0: ; 0 male @@ -1896,8 +1915,12 @@ wd475:: ds 1 wd476:: ds 1 wd477:: ds 1 wd478:: ds 1 +wCrystalDataEnd:: + wd479:: ds 2 +wPlayerData:: + PlayerID:: ; d47b ds 2 @@ -2124,7 +2147,7 @@ FarfetchdPosition:: ; d964 ds 13 -SECTION "Map Triggers", WRAMX, BANK [1] +;SECTION "Map Triggers", WRAMX, BANK [1] wPokecenter2FTrigger:: ds 1 ; d972 wTradeCenterTrigger:: ds 1 ; d973 @@ -2209,7 +2232,7 @@ wMobileBattleRoomTrigger:: ds 1 ; d9c0 ds 49 -SECTION "Events", WRAMX, BANK [1] +;SECTION "Events", WRAMX, BANK [1] wJackFightCount:: ds 1 ds 1 @@ -2374,6 +2397,11 @@ wdca0:: ds 1 wdca1:: ds 3 wdca4:: ds 1 +wPlayerDataEnd:: + + +wMapData:: + VisitedSpawns:: ; dca5 flag_array 27 @@ -2409,9 +2437,13 @@ XCoord:: ; dcb8 wdcbf:: ds 1 ds 23 +wMapDataEnd:: + SECTION "Party", WRAMX, BANK [1] +wPokemonData:: + PartyCount:: ; dcd7 ds 1 ; number of Pokémon in party PartySpecies:: ; dcd8 @@ -2436,8 +2468,6 @@ PartyMonNicknamesEnd:: ds 22 -SECTION "Pokedex", WRAMX, BANK [1] - PokedexCaught:: ; de99 flag_array NUM_POKEMON EndPokedexCaught:: @@ -2454,8 +2484,6 @@ UnlockedUnowns:: ; def3 wdef4:: ds 1 -SECTION "Daycare", WRAMX, BANK [1] - wDaycareMan:: ; def5 ; bit 7: active ; bit 6: monsters are compatible @@ -2492,8 +2520,6 @@ wEggMon:: box_struct wEggMon ; df7b wdf9b:: ds 1 -SECTION "Misc Pokemon", WRAMX, BANK [1] - wdf9c:: wContestMon:: party_struct wContestMon ; df9c @@ -2528,6 +2554,8 @@ wdfec:: ds 1 ds 5 wdff5:: +wPokemonDataEnd:: + SECTION "Pic Animations", WRAMX, BANK [2] @@ -2647,21 +2675,104 @@ w6_d600:: ds $600 SECTION "Scratch", SRAM, BANK [0] +SECTION "SRAM Bank 0", SRAM [$a600], BANK [0] + +s0_a600:: ds $11a +s0_a71a:: ds $11a +s0_a834:: ds $1d7 +s0_aa0b:: ds $1d7 + +s0_abe2:: ds 1 +s0_abe3:: ds 1 +s0_abe4:: ds 1 +s0_abe5:: ds 1 +s0_abe6:: ds 10 +s0_abf0:: ds $d +s0_abfd:: ds 1 +s0_abfe:: ds 12 +sMysteryGiftTrainer:: ds (1 + 1 + NUM_MOVES) * PARTY_LENGTH + 1 + ds 1 +s0_abe4End:: + + ds $b200 - $ac30 + +sBackupOptions:: ds OptionsEnd - Options + +s0_b208:: ds 1 + +sBackupGameData:: +sBackupPlayerData:: ds wPlayerDataEnd - wPlayerData +sBackupMapData:: ds wMapDataEnd - wMapData +sBackupPokemonData:: ds wPokemonDataEnd - wPokemonData +sBackupGameDataEnd:: + +; bd83 + ds $18a +; bf0d + +sBackupChecksum:: ds 2 +s0_bf0f:: ds 1 +sStackTop:: ds 2 + + SECTION "SRAM Bank 1", SRAM, BANK [1] -SECTION "BoxMons", SRAM [$ad10], BANK [1] +sOptions:: ds OptionsEnd - Options -sBoxCount:: ds 1 ; ad10 -sBoxSpecies:: ds MONS_PER_BOX ; ad11 +s1_a008:: ds 1 + +sGameData:: +sPlayerData:: ds wPlayerDataEnd - wPlayerData +sMapData:: ds wMapDataEnd - wMapData +sPokemonData:: ds wPokemonDataEnd - wPokemonData +sGameDataEnd:: + +; ab83 + ds $18a +; ad0d + +sChecksum:: ds 2 +s1_ad0f:: ds 1 + +; ad10 + box sBox +; b160 + + ds $100 + +sLinkBattleStats:: ; b260 +sLinkBattleWins:: ds 2 +sLinkBattleLosses:: ds 2 +sLinkBattleDraws:: ds 2 + ds $5a +sLinkBattleStatsEnd:: + +sHallOfFame:: ; b2c0 + ds HOF_LENGTH * NUM_HOF_TEAMS +sHallOfFameEnd:: + +; be3c + ds 1 +sCrystalData:: + ds wCrystalDataEnd - wCrystalData ds 1 +s1_be45:: ds 1 -sBoxMons:: ; ad26 -sBoxMon1:: box_struct sBoxMon1 -sBoxMon2:: - ds box_struct_length * (MONS_PER_BOX +- 1) -sBoxMonOT:: ds NAME_LENGTH * MONS_PER_BOX ; afa6 +SECTION "Boxes 1-7", SRAM, BANK [2] + box sBox1 + box sBox2 + box sBox3 + box sBox4 + box sBox5 + box sBox6 + box sBox7 -sBoxMonNicknames:: ds PKMN_NAME_LENGTH * MONS_PER_BOX ; b082 -sBoxMonNicknamesEnd:: -; b15e +SECTION "Boxes 8-14", SRAM, BANK [3] + box sBox8 + box sBox9 + box sBox10 + box sBox11 + box sBox12 + box sBox13 + box sBox14 |