changeset 1208:95f5253e75c7

Implement soft reset in Genesis mode
author Michael Pavone <pavone@retrodev.com>
date Fri, 27 Jan 2017 21:27:37 -0800
parents 9d6f155732ed
children 5ee6b6345ea9
files default.cfg genesis.c genesis.h io.c system.h todo.txt
diffstat 6 files changed, 33 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/default.cfg	Thu Jan 26 23:49:13 2017 -0800
+++ b/default.cfg	Fri Jan 27 21:27:37 2017 -0800
@@ -31,6 +31,7 @@
 		= ui.next_speed
 		- ui.prev_speed
 		f11 ui.toggle_fullscreen
+		tab ui.soft_reset
 	}
 	pads {
 		0 {
--- a/genesis.c	Thu Jan 26 23:49:13 2017 -0800
+++ b/genesis.c	Fri Jan 27 21:27:37 2017 -0800
@@ -790,6 +790,18 @@
 	gen->master_clock = gen->normal_clock;
 }
 
+static void handle_reset_requests(genesis_context *gen)
+{
+	while (gen->reset_requested)
+	{
+		gen->reset_requested = 0;
+		z80_assert_reset(gen->z80, gen->m68k->current_cycle);
+		z80_clear_busreq(gen->z80, gen->m68k->current_cycle);
+		//Is there any sort of VDP reset?
+		m68k_reset(gen->m68k);
+	}
+}
+
 static void start_genesis(system_header *system, char *statefile)
 {
 	genesis_context *gen = (genesis_context *)system;
@@ -815,6 +827,7 @@
 		}
 		m68k_reset(gen->m68k);
 	}
+	handle_reset_requests(gen);
 }
 
 static void resume_genesis(system_header *system)
@@ -823,6 +836,7 @@
 	map_all_bindings(&gen->io);
 	render_set_video_standard((gen->version_reg & HZ50) ? VID_PAL : VID_NTSC);
 	resume_68k(gen->m68k);
+	handle_reset_requests(gen);
 }
 
 static void inc_debug_mode(system_header *system)
@@ -878,6 +892,13 @@
 	}
 }
 
+static void soft_reset(system_header *system)
+{
+	genesis_context *gen = (genesis_context *)system;
+	gen->m68k->should_return = 1;
+	gen->reset_requested = 1;
+}
+
 static void free_genesis(system_header *system)
 {
 	genesis_context *gen = (genesis_context *)system;
@@ -912,6 +933,7 @@
 	gen->header.resume_context = resume_genesis;
 	gen->header.load_save = load_save;
 	gen->header.persist_save = persist_save;
+	gen->header.soft_reset = soft_reset;
 	gen->header.free_context = free_genesis;
 	gen->header.get_open_bus_value = get_open_bus_value;
 	gen->header.request_exit = request_exit;
--- a/genesis.h	Thu Jan 26 23:49:13 2017 -0800
+++ b/genesis.h	Fri Jan 27 21:27:37 2017 -0800
@@ -46,6 +46,7 @@
 	sega_io         io;
 	uint8_t         version_reg;
 	uint8_t         bus_busy;
+	uint8_t         reset_requested;
 	eeprom_state    eeprom;
 };
 
--- a/io.c	Thu Jan 26 23:49:13 2017 -0800
+++ b/io.c	Fri Jan 27 21:27:37 2017 -0800
@@ -71,6 +71,7 @@
 	UI_PREV_SPEED,
 	UI_RELEASE_MOUSE,
 	UI_TOGGLE_FULLSCREEN,
+	UI_SOFT_RESET,
 	UI_EXIT
 } ui_action;
 
@@ -467,6 +468,9 @@
 		case UI_TOGGLE_FULLSCREEN:
 			render_toggle_fullscreen();
 			break;
+		case UI_SOFT_RESET:
+			current_system->soft_reset(current_system);
+			break;
 		case UI_EXIT:
 			current_system->request_exit(current_system);
 			break;
@@ -637,6 +641,8 @@
 			*ui_out = UI_RELEASE_MOUSE;
 		} else if (!strcmp(target + 3, "toggle_fullscreen")) {
 			*ui_out = UI_TOGGLE_FULLSCREEN;
+		} else if (!strcmp(target + 3, "soft_reset")) {
+			*ui_out = UI_SOFT_RESET;
 		} else if(!strcmp(target + 3, "exit")) {
 			*ui_out = UI_EXIT;
 		} else {
--- a/system.h	Thu Jan 26 23:49:13 2017 -0800
+++ b/system.h	Fri Jan 27 21:27:37 2017 -0800
@@ -33,6 +33,7 @@
 	system_fun        load_save;
 	system_fun        persist_save;
 	system_fun        request_exit;
+	system_fun        soft_reset;
 	system_fun        free_context;
 	system_fun_r16    get_open_bus_value;
 	speed_system_fun  set_speed_percent;
--- a/todo.txt	Thu Jan 26 23:49:13 2017 -0800
+++ b/todo.txt	Fri Jan 27 21:27:37 2017 -0800
@@ -12,7 +12,9 @@
 	- Overscan
 	- Full screen toggle
 	- Aspect ratio control
+	- Soft Reset
 Update Changelog
+SMS Pause NMI
 
 0.5.0 Nice to Haves
 -------------------