diff m68k_core.c @ 2053:3414a4423de1 segacd

Merge from default
author Michael Pavone <pavone@retrodev.com>
date Sat, 15 Jan 2022 13:15:21 -0800
parents c157a535ceeb
children 374a5ae694e8 8ee7ecbf3f21
line wrap: on
line diff
--- a/m68k_core.c	Sat Jan 05 00:58:08 2019 -0800
+++ b/m68k_core.c	Sat Jan 15 13:15:21 2022 -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);
 }
 
@@ -1216,9 +1223,7 @@
 
 m68k_context * init_68k_context(m68k_options * opts, m68k_reset_handler reset_handler)
 {
-	size_t ctx_size = sizeof(m68k_context) + ram_size(&opts->gen) / (1 << opts->gen.ram_flags_shift) / 8;
-	m68k_context * context = malloc(ctx_size);
-	memset(context, 0, ctx_size);
+	m68k_context * context = calloc(1, sizeof(m68k_context) + ram_size(&opts->gen) / (1 << opts->gen.ram_flags_shift) / 8);
 	context->options = opts;
 	context->int_cycle = CYCLE_NEVER;
 	context->status = 0x27;