From da839988af1edcd153ea74a907e5b68bf5ba03fd Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 21 Jul 2018 19:24:09 -0700 Subject: [PATCH] Simplify RBY checksum calc utilize unchecked byte overflow remove unnecessary zeroing -- t's immediately after the checksummed region. even if it was included, chk += 0 is still 0. --- PKHeX.Core/Saves/SAV1.cs | 41 ++++++++++++++-------------------------- 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/PKHeX.Core/Saves/SAV1.cs b/PKHeX.Core/Saves/SAV1.cs index 11e6fffab..5c82a11d2 100644 --- a/PKHeX.Core/Saves/SAV1.cs +++ b/PKHeX.Core/Saves/SAV1.cs @@ -205,35 +205,22 @@ protected override byte[] Write(bool DSV) public override bool IsPKMPresent(int Offset) => PKX.IsPKMPresentGB(Data, Offset); // Checksums - protected override void SetChecksums() - { - int CHECKSUM_OFS = Japanese ? 0x3594 : 0x3523; - Data[CHECKSUM_OFS] = 0; - uint chksum = 0; - for (int i = 0x2598; i < CHECKSUM_OFS; i++) - { - chksum += Data[i]; - } - - chksum = ~chksum; - chksum &= 0xFF; - - Data[CHECKSUM_OFS] = (byte)chksum; - } - public override bool ChecksumsValid - { - get - { - int CHECKSUM_OFS = Japanese ? 0x3594 : 0x3523; - byte temp = Data[CHECKSUM_OFS]; // cache current chk - SetChecksums(); // chksum is recalculated (after being set to 0 to perform check) - byte chk = Data[CHECKSUM_OFS]; // correct checksum - Data[CHECKSUM_OFS] = temp; // restore old chk - return temp == chk; - } - } + protected override void SetChecksums() => Data[CHECKSUM_OFS] = GetRBYChecksum(CHECKSUM_OFS); + public override bool ChecksumsValid => Data[CHECKSUM_OFS] == GetRBYChecksum(CHECKSUM_OFS); public override string ChecksumInfo => ChecksumsValid ? "Checksum valid." : "Checksum invalid"; + private const int CHECKSUM_START = 0x2598; + private int CHECKSUM_OFS => Japanese ? 0x3594 : 0x3523; + + private byte GetRBYChecksum(int end) + { + byte chksum = 0; + for (int i = CHECKSUM_START; i < end; i++) + chksum += Data[i]; + chksum ^= 0xFF; + return chksum; + } + // Trainer Info public override GameVersion Version { get; protected set; }