summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--default.cfg1
-rw-r--r--genesis.c22
-rw-r--r--genesis.h1
-rw-r--r--io.c6
-rw-r--r--system.h1
-rw-r--r--todo.txt2
6 files changed, 33 insertions, 0 deletions
diff --git a/default.cfg b/default.cfg
index b562445..b5f44d8 100644
--- a/default.cfg
+++ b/default.cfg
@@ -31,6 +31,7 @@ bindings {
= ui.next_speed
- ui.prev_speed
f11 ui.toggle_fullscreen
+ tab ui.soft_reset
}
pads {
0 {
diff --git a/genesis.c b/genesis.c
index 3c9a976..09993bc 100644
--- a/genesis.c
+++ b/genesis.c
@@ -790,6 +790,18 @@ void set_region(genesis_context *gen, rom_info *info, uint8_t region)
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 @@ static void start_genesis(system_header *system, char *statefile)
}
m68k_reset(gen->m68k);
}
+ handle_reset_requests(gen);
}
static void resume_genesis(system_header *system)
@@ -823,6 +836,7 @@ static void resume_genesis(system_header *system)
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 load_save(system_header *system)
}
}
+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 @@ genesis_context *alloc_init_genesis(rom_info *rom, void *main_rom, void *lock_on
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;
diff --git a/genesis.h b/genesis.h
index 2e99e38..d2200c6 100644
--- a/genesis.h
+++ b/genesis.h
@@ -46,6 +46,7 @@ struct genesis_context {
sega_io io;
uint8_t version_reg;
uint8_t bus_busy;
+ uint8_t reset_requested;
eeprom_state eeprom;
};
diff --git a/io.c b/io.c
index ef19349..109b50f 100644
--- a/io.c
+++ b/io.c
@@ -71,6 +71,7 @@ typedef enum {
UI_PREV_SPEED,
UI_RELEASE_MOUSE,
UI_TOGGLE_FULLSCREEN,
+ UI_SOFT_RESET,
UI_EXIT
} ui_action;
@@ -467,6 +468,9 @@ void handle_binding_up(keybinding * binding)
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 @@ int parse_binding_target(char * target, tern_node * padbuttons, tern_node *mouse
*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 {
diff --git a/system.h b/system.h
index 065ecbf..2bfe5b1 100644
--- a/system.h
+++ b/system.h
@@ -33,6 +33,7 @@ struct system_header {
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;
diff --git a/todo.txt b/todo.txt
index f858c2f..be706d9 100644
--- a/todo.txt
+++ b/todo.txt
@@ -12,7 +12,9 @@ Update README
- Overscan
- Full screen toggle
- Aspect ratio control
+ - Soft Reset
Update Changelog
+SMS Pause NMI
0.5.0 Nice to Haves
-------------------