diff m68k_core.c @ 1427:4e5797b3935a

WIP - New savestate format
author Michael Pavone <pavone@retrodev.com>
date Sun, 06 Aug 2017 00:06:36 -0700
parents df6af7187b36
children aa945f1bdd71
line wrap: on
line diff
--- a/m68k_core.c	Fri Jul 07 21:44:49 2017 -0700
+++ b/m68k_core.c	Sun Aug 06 00:06:36 2017 -0700
@@ -9,6 +9,7 @@
 #include "backend.h"
 #include "gen.h"
 #include "util.h"
+#include "serialize.h"
 #include <stdio.h>
 #include <stddef.h>
 #include <stdlib.h>
@@ -1202,3 +1203,54 @@
 	context->reset_handler = (code_ptr)reset_handler;
 	return context;
 }
+
+void m68k_serialize(m68k_context *context, uint32_t pc, serialize_buffer *buf)
+{
+	for (int i = 0; i < 8; i++)
+	{
+		save_int32(buf, context->dregs[i]);
+	}
+	for (int i = 0; i < 9; i++)
+	{
+		save_int32(buf, context->aregs[i]);
+	}
+	save_int32(buf, pc);
+	uint16_t sr = context->status << 3;
+	for (int flag = 4; flag >= 0; flag--) {
+		sr <<= 1;
+		sr |= context->flags[flag] != 0;
+	}
+	save_int16(buf, sr);
+	save_int32(buf, context->current_cycle);
+	save_int32(buf, context->int_cycle);
+	save_int8(buf, context->int_num);
+	save_int8(buf, context->int_pending);
+	save_int8(buf, context->trace_pending);
+}
+
+void m68k_deserialize(deserialize_buffer *buf, void *vcontext)
+{
+	m68k_context *context = vcontext;
+	for (int i = 0; i < 8; i++)
+	{
+		context->dregs[i] = load_int32(buf);
+	}
+	for (int i = 0; i < 9; i++)
+	{
+		context->aregs[i] = load_int32(buf);
+	}
+	//hack until both PC and IR registers are represented properly
+	context->last_prefetch_address = load_int32(buf);
+	uint16_t sr = load_int16(buf);
+	context->status = sr >> 8;
+	for (int flag = 0; flag < 5; flag++)
+	{
+		context->flags[flag] = sr & 1;
+		sr >>= 1;
+	}
+	context->current_cycle = load_int32(buf);
+	context->int_cycle = load_int32(buf);
+	context->int_num = load_int8(buf);
+	context->int_pending = load_int8(buf);
+	context->trace_pending = load_int8(buf);
+}