changeset 1896:c157a535ceeb

Reset 68K supervisor state and interrupt mask on soft reset
author Michael Pavone <pavone@retrodev.com>
date Tue, 07 Jan 2020 22:52:27 -0800
parents 33c0c4579c1f
children 59a83c21d9d2
files m68k_core.c
diffstat 1 files changed, 7 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/m68k_core.c	Mon Jan 06 22:02:57 2020 -0800
+++ b/m68k_core.c	Tue Jan 07 22:52:27 2020 -0800
@@ -1188,8 +1188,15 @@
 {
 	//TODO: Actually execute the M68K reset vector rather than simulating some of its behavior
 	uint16_t *reset_vec = get_native_pointer(0, (void **)context->mem_pointers, &context->options->gen);
+	if (!(context->status & 0x20)) {
+		//switching from user to system mode so swap stack pointers
+		context->aregs[8] = context->aregs[7];
+	}
+	context->status = 0x27;
 	context->aregs[7] = reset_vec[0] << 16 | reset_vec[1];
 	uint32_t address = reset_vec[2] << 16 | reset_vec[3];
+	//interrupt mask may have changed so force a sync
+	sync_components(context, address);
 	start_68k_context(context, address);
 }