mirror of
https://github.com/risingPhil/libpokemegb.git
synced 2026-03-22 01:54:19 -05:00
The gen 2 saves contain 2 markers per section (main/backup) to serve as canary values to see whether an actual save is stored. Because after all: checksum 0 is a valid checksum in some cases. So to distinguish between a valid and a corrupted save, these markers are used. And now we use it too! This will be necessary to detect that there's no save file in case the save was wiped (or a reproduction cart is used)
73 lines
2.0 KiB
C++
73 lines
2.0 KiB
C++
#include "gen1/Gen1GameReader.h"
|
|
#include "gen2/Gen2GameReader.h"
|
|
#include "RomReader.h"
|
|
#include "SaveManager.h"
|
|
#include "utils.h"
|
|
|
|
#include <cstdio>
|
|
#include <cstdint>
|
|
#include <cstdlib>
|
|
|
|
static void print_usage()
|
|
{
|
|
printf("Usage: checkSave <path/to/rom.gbc> <path/to/file.sav>\n");
|
|
}
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
if(argc != 3)
|
|
{
|
|
print_usage();
|
|
return 1;
|
|
}
|
|
uint8_t* romBuffer;
|
|
uint8_t* savBuffer;
|
|
uint32_t romFileSize;
|
|
uint32_t savFileSize;
|
|
|
|
printf("rom: %s, save: %s\n", argv[1], argv[2]);
|
|
|
|
romBuffer = readFileIntoBuffer(argv[1], romFileSize);
|
|
if(!romBuffer)
|
|
{
|
|
fprintf(stderr, "ERROR: Couldn't read file %s\n", argv[1]);
|
|
return 1;
|
|
}
|
|
savBuffer = readFileIntoBuffer(argv[2], savFileSize);
|
|
if(!savBuffer)
|
|
{
|
|
fprintf(stderr, "ERROR: Couldn't read file %s\n", argv[2]);
|
|
free(romBuffer);
|
|
romBuffer = nullptr;
|
|
return 1;
|
|
}
|
|
|
|
GameboyCartridgeHeader cartridgeHeader;
|
|
BufferBasedRomReader romReader(romBuffer, romFileSize);
|
|
BufferBasedSaveManager saveManager(savBuffer, savFileSize);
|
|
|
|
readGameboyCartridgeHeader(romReader, cartridgeHeader);
|
|
|
|
// check if we're dealing with gen 1
|
|
const Gen1GameType gen1Type = gen1_determineGameType(cartridgeHeader);
|
|
const Gen2GameType gen2Type = gen2_determineGameType(cartridgeHeader);
|
|
if (gen1Type != Gen1GameType::INVALID)
|
|
{
|
|
Gen1GameReader gameReader(romReader, saveManager, gen1Type);
|
|
printf("%s", (gameReader.isMainChecksumValid()) ? "Game save valid!\n" : "Game save NOT valid!\n");
|
|
}
|
|
else if (gen2Type != Gen2GameType::INVALID)
|
|
{
|
|
Gen2GameReader gameReader(romReader, saveManager, gen2Type);
|
|
printf("%s", (gameReader.isMainChecksumValid()) ? "Main save valid!\n" : "Main save NOT valid!\n");
|
|
printf("%s", (gameReader.isBackupChecksumValid()) ? "Backup save valid!\n" : "Backup save NOT valid!\n");
|
|
}
|
|
|
|
free(romBuffer);
|
|
romBuffer = 0;
|
|
|
|
free(savBuffer);
|
|
savBuffer = 0;
|
|
|
|
return 0;
|
|
} |