bool GBASavedataLoad(struct GBASavedata* savedata, struct VFile* in) { if (savedata->data) { if (!in && savedata->type != SAVEDATA_FORCE_NONE) { return false; } ssize_t size = GBASavedataSize(savedata); in->seek(in, 0, SEEK_SET); return in->read(in, savedata->data, size) == size; } else if (savedata->vf) { off_t read = 0; uint8_t buffer[2048]; savedata->vf->seek(savedata->vf, 0, SEEK_SET); if (in) { in->seek(in, 0, SEEK_SET); do { read = in->read(in, buffer, sizeof(buffer)); read = savedata->vf->write(savedata->vf, buffer, read); } while (read == sizeof(buffer)); } memset(buffer, 0xFF, sizeof(buffer)); ssize_t fsize = savedata->vf->size(savedata->vf); ssize_t pos = savedata->vf->seek(savedata->vf, 0, SEEK_CUR); while (fsize - pos >= (ssize_t) sizeof(buffer)) { savedata->vf->write(savedata->vf, buffer, sizeof(buffer)); pos = savedata->vf->seek(savedata->vf, 0, SEEK_CUR); } if (fsize - pos > 0) { savedata->vf->write(savedata->vf, buffer, fsize - pos); } return read >= 0; } return true; }
void GBASavedataDeinit(struct GBASavedata* savedata) { if (savedata->vf) { size_t size = GBASavedataSize(savedata); if (savedata->data) { savedata->vf->unmap(savedata->vf, savedata->data, size); } savedata->vf = NULL; } else { switch (savedata->type) { case SAVEDATA_SRAM: mappedMemoryFree(savedata->data, SIZE_CART_SRAM); break; case SAVEDATA_FLASH512: mappedMemoryFree(savedata->data, SIZE_CART_FLASH512); break; case SAVEDATA_FLASH1M: mappedMemoryFree(savedata->data, SIZE_CART_FLASH1M); break; case SAVEDATA_EEPROM: mappedMemoryFree(savedata->data, SIZE_CART_EEPROM); break; case SAVEDATA_EEPROM512: mappedMemoryFree(savedata->data, SIZE_CART_EEPROM512); break; case SAVEDATA_FORCE_NONE: case SAVEDATA_AUTODETECT: break; } } savedata->data = 0; savedata->type = SAVEDATA_AUTODETECT; }
size_t retro_get_memory_size(unsigned id) { if (id != RETRO_MEMORY_SAVE_RAM) { return 0; } #ifdef M_CORE_GBA if (core->platform(core) == PLATFORM_GBA) { switch (((struct GBA*) core->board)->memory.savedata.type) { case SAVEDATA_AUTODETECT: return SIZE_CART_FLASH1M; default: return GBASavedataSize(&((struct GBA*) core->board)->memory.savedata); } } #endif #ifdef M_CORE_GB if (core->platform(core) == PLATFORM_GB) { return ((struct GB*) core->board)->sramSize; } #endif return 0; }