Esempio n. 1
0
bool retro_unserialize(const void* data, size_t size) {
	if (size != retro_serialize_size()) {
		return false;
	}
	GBADeserialize(core->board, data);
	return true;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}