bool GBLoadROM(struct GB* gb, struct VFile* vf) { GBUnloadROM(gb); gb->romVf = vf; gb->pristineRomSize = vf->size(vf); vf->seek(vf, 0, SEEK_SET); #ifdef _3DS gb->pristineRom = 0; if (gb->pristineRomSize <= romBufferSize) { gb->pristineRom = romBuffer; vf->read(vf, romBuffer, gb->pristineRomSize); } #else gb->pristineRom = vf->map(vf, gb->pristineRomSize, MAP_READ); #endif if (!gb->pristineRom) { return false; } gb->yankedRomSize = 0; gb->memory.rom = gb->pristineRom; gb->memory.romSize = gb->pristineRomSize; gb->romCrc32 = doCrc32(gb->memory.rom, gb->memory.romSize); // TODO: error check return true; }
static uint32_t _GBBiosCRC32(struct VFile* vf) { ssize_t size = vf->size(vf); if (size <= 0 || size > GB_SIZE_CART_BANK0) { return 0; } void* bios = vf->map(vf, size, MAP_READ); uint32_t biosCrc = doCrc32(bios, size); vf->unmap(vf, bios, size); return biosCrc; }
void GBApplyPatch(struct GB* gb, struct Patch* patch) { size_t patchedSize = patch->outputSize(patch, gb->memory.romSize); if (!patchedSize) { return; } if (patchedSize > GB_SIZE_CART_MAX) { patchedSize = GB_SIZE_CART_MAX; } gb->memory.rom = anonymousMemoryMap(GB_SIZE_CART_MAX); if (!patch->applyPatch(patch, gb->pristineRom, gb->pristineRomSize, gb->memory.rom, patchedSize)) { mappedMemoryFree(gb->memory.rom, patchedSize); gb->memory.rom = gb->pristineRom; return; } gb->memory.romSize = patchedSize; gb->romCrc32 = doCrc32(gb->memory.rom, gb->memory.romSize); }