bool retro_unserialize(const void* data, size_t size) { if (size != retro_serialize_size()) { return false; } GBADeserialize(core->board, data); return true; }
static int _loadPNGChunkHandler(png_structp png, png_unknown_chunkp chunk) { if (strcmp((const char*) chunk->name, "gbAs") != 0) { return 0; } struct GBASerializedState state; uLongf len = sizeof(state); uncompress((Bytef*) &state, &len, chunk->data, chunk->size); if (!GBADeserialize(png_get_user_chunk_ptr(png), &state)) { longjmp(png_jmpbuf(png), 1); } return 1; }
bool GBALoadStateNamed(struct GBA* gba, struct VFile* vf) { #ifdef USE_PNG if (isPNG(vf)) { return _loadPNGState(gba, vf); } #endif if (vf->size(vf) < (ssize_t) sizeof(struct GBASerializedState)) { return false; } struct GBASerializedState* state = vf->map(vf, sizeof(struct GBASerializedState), MAP_READ); if (!state) { return false; } bool success = GBADeserialize(gba, state); vf->unmap(vf, state, sizeof(struct GBASerializedState)); return success; }
int GBARewind(struct GBAThread* thread, int nStates) { if (nStates > thread->rewindBufferSize || nStates < 0) { nStates = thread->rewindBufferSize; } if (nStates == 0) { return 0; } int offset = thread->rewindBufferWriteOffset - nStates; if (offset < 0) { offset += thread->rewindBufferCapacity; } struct GBASerializedState* state = thread->rewindBuffer[offset]; if (!state) { return 0; } thread->rewindBufferSize -= nStates; thread->rewindBufferWriteOffset = offset; GBADeserialize(thread->gba, state); if (thread->rewindScreenBuffer) { thread->gba->video.renderer->putPixels(thread->gba->video.renderer, VIDEO_HORIZONTAL_PIXELS, &thread->rewindScreenBuffer[offset * VIDEO_HORIZONTAL_PIXELS * VIDEO_VERTICAL_PIXELS * BYTES_PER_PIXEL]); } return nStates; }