comparison genesis.c @ 1583:430dd12e4010

Refactor to split device bindings from IO emulation code
author Michael Pavone <pavone@retrodev.com>
date Sat, 05 May 2018 23:30:40 -0700
parents 2b132d894d76
children 31effaadf877
comparison
equal deleted inserted replaced
1582:a74db49fa6b1 1583:430dd12e4010
14 #include "gst.h" 14 #include "gst.h"
15 #include "util.h" 15 #include "util.h"
16 #include "debug.h" 16 #include "debug.h"
17 #include "gdb_remote.h" 17 #include "gdb_remote.h"
18 #include "saves.h" 18 #include "saves.h"
19 #include "bindings.h"
19 #define MCLKS_NTSC 53693175 20 #define MCLKS_NTSC 53693175
20 #define MCLKS_PAL 53203395 21 #define MCLKS_PAL 53203395
21 22
22 uint32_t MCLKS_PER_68K; 23 uint32_t MCLKS_PER_68K;
23 #define MCLKS_PER_YM 7 24 #define MCLKS_PER_YM 7
1061 load_state(&gen->header, gen->header.delayed_load_slot - 1); 1062 load_state(&gen->header, gen->header.delayed_load_slot - 1);
1062 gen->header.delayed_load_slot = 0; 1063 gen->header.delayed_load_slot = 0;
1063 resume_68k(gen->m68k); 1064 resume_68k(gen->m68k);
1064 } 1065 }
1065 } 1066 }
1066 io_release_capture(&gen->io); 1067 bindings_release_capture();
1067 vdp_release_framebuffer(gen->vdp); 1068 vdp_release_framebuffer(gen->vdp);
1068 render_pause_source(gen->ym->audio); 1069 render_pause_source(gen->ym->audio);
1069 render_pause_source(gen->psg->audio); 1070 render_pause_source(gen->psg->audio);
1070 } 1071 }
1071 1072
1072 static void start_genesis(system_header *system, char *statefile) 1073 static void start_genesis(system_header *system, char *statefile)
1073 { 1074 {
1074 genesis_context *gen = (genesis_context *)system; 1075 genesis_context *gen = (genesis_context *)system;
1075 set_keybindings(&gen->io);
1076 if (statefile) { 1076 if (statefile) {
1077 //first try loading as a native format savestate 1077 //first try loading as a native format savestate
1078 deserialize_buffer state; 1078 deserialize_buffer state;
1079 uint32_t pc; 1079 uint32_t pc;
1080 if (load_from_file(&state, statefile)) { 1080 if (load_from_file(&state, statefile)) {
1108 } 1108 }
1109 1109
1110 static void resume_genesis(system_header *system) 1110 static void resume_genesis(system_header *system)
1111 { 1111 {
1112 genesis_context *gen = (genesis_context *)system; 1112 genesis_context *gen = (genesis_context *)system;
1113 map_all_bindings(&gen->io);
1114 render_set_video_standard((gen->version_reg & HZ50) ? VID_PAL : VID_NTSC); 1113 render_set_video_standard((gen->version_reg & HZ50) ? VID_PAL : VID_NTSC);
1115 io_reacquire_capture(&gen->io); 1114 bindings_reacquire_capture();
1116 vdp_reacquire_framebuffer(gen->vdp); 1115 vdp_reacquire_framebuffer(gen->vdp);
1117 render_resume_source(gen->ym->audio); 1116 render_resume_source(gen->ym->audio);
1118 render_resume_source(gen->psg->audio); 1117 render_resume_source(gen->psg->audio);
1119 resume_68k(gen->m68k); 1118 resume_68k(gen->m68k);
1120 handle_reset_requests(gen); 1119 handle_reset_requests(gen);
1200 psg_free(gen->psg); 1199 psg_free(gen->psg);
1201 free(gen->save_storage); 1200 free(gen->save_storage);
1202 free(gen->header.save_dir); 1201 free(gen->header.save_dir);
1203 free(gen->lock_on); 1202 free(gen->lock_on);
1204 free(gen); 1203 free(gen);
1204 }
1205
1206 static void gamepad_down(system_header *system, uint8_t gamepad_num, uint8_t button)
1207 {
1208 genesis_context *gen = (genesis_context *)system;
1209 io_gamepad_down(&gen->io, gamepad_num, button);
1210 }
1211
1212 static void gamepad_up(system_header *system, uint8_t gamepad_num, uint8_t button)
1213 {
1214 genesis_context *gen = (genesis_context *)system;
1215 io_gamepad_up(&gen->io, gamepad_num, button);
1216 }
1217
1218 static void mouse_down(system_header *system, uint8_t mouse_num, uint8_t button)
1219 {
1220 genesis_context *gen = (genesis_context *)system;
1221 io_mouse_down(&gen->io, mouse_num, button);
1222 }
1223
1224 static void mouse_up(system_header *system, uint8_t mouse_num, uint8_t button)
1225 {
1226 genesis_context *gen = (genesis_context *)system;
1227 io_mouse_up(&gen->io, mouse_num, button);
1228 }
1229
1230 static void mouse_motion_absolute(system_header *system, uint8_t mouse_num, uint16_t x, uint16_t y)
1231 {
1232 genesis_context *gen = (genesis_context *)system;
1233 io_mouse_motion_absolute(&gen->io, mouse_num, x, y);
1234 }
1235
1236 static void mouse_motion_relative(system_header *system, uint8_t mouse_num, int32_t x, int32_t y)
1237 {
1238 genesis_context *gen = (genesis_context *)system;
1239 io_mouse_motion_relative(&gen->io, mouse_num, x, y);
1240 }
1241
1242 static void keyboard_down(system_header *system, uint8_t scancode)
1243 {
1244 genesis_context *gen = (genesis_context *)system;
1245 io_keyboard_down(&gen->io, scancode);
1246 }
1247
1248 static void keyboard_up(system_header *system, uint8_t scancode)
1249 {
1250 genesis_context *gen = (genesis_context *)system;
1251 io_keyboard_up(&gen->io, scancode);
1205 } 1252 }
1206 1253
1207 genesis_context *alloc_init_genesis(rom_info *rom, void *main_rom, void *lock_on, uint32_t system_opts, uint8_t force_region) 1254 genesis_context *alloc_init_genesis(rom_info *rom, void *main_rom, void *lock_on, uint32_t system_opts, uint8_t force_region)
1208 { 1255 {
1209 static memmap_chunk z80_map[] = { 1256 static memmap_chunk z80_map[] = {
1224 gen->header.free_context = free_genesis; 1271 gen->header.free_context = free_genesis;
1225 gen->header.get_open_bus_value = get_open_bus_value; 1272 gen->header.get_open_bus_value = get_open_bus_value;
1226 gen->header.request_exit = request_exit; 1273 gen->header.request_exit = request_exit;
1227 gen->header.inc_debug_mode = inc_debug_mode; 1274 gen->header.inc_debug_mode = inc_debug_mode;
1228 gen->header.inc_debug_pal = inc_debug_pal; 1275 gen->header.inc_debug_pal = inc_debug_pal;
1276 gen->header.gamepad_down = gamepad_down;
1277 gen->header.gamepad_up = gamepad_up;
1278 gen->header.mouse_down = mouse_down;
1279 gen->header.mouse_up = mouse_up;
1280 gen->header.mouse_motion_absolute = mouse_motion_absolute;
1281 gen->header.mouse_motion_relative = mouse_motion_relative;
1282 gen->header.keyboard_down = keyboard_down;
1283 gen->header.keyboard_up = keyboard_up;
1229 gen->header.type = SYSTEM_GENESIS; 1284 gen->header.type = SYSTEM_GENESIS;
1230 set_region(gen, rom, force_region); 1285 set_region(gen, rom, force_region);
1231 1286
1232 gen->vdp = malloc(sizeof(vdp_context)); 1287 gen->vdp = malloc(sizeof(vdp_context));
1233 init_vdp_context(gen->vdp, gen->version_reg & 0x40); 1288 init_vdp_context(gen->vdp, gen->version_reg & 0x40);
1292 { 1347 {
1293 gen->vdp->vsram[i] = rand(); 1348 gen->vdp->vsram[i] = rand();
1294 } 1349 }
1295 } 1350 }
1296 setup_io_devices(config, rom, &gen->io); 1351 setup_io_devices(config, rom, &gen->io);
1352 gen->header.has_keyboard = io_has_keyboard(&gen->io);
1297 1353
1298 gen->mapper_type = rom->mapper_type; 1354 gen->mapper_type = rom->mapper_type;
1299 gen->save_type = rom->save_type; 1355 gen->save_type = rom->save_type;
1300 if (gen->save_type != SAVE_NONE) { 1356 if (gen->save_type != SAVE_NONE) {
1301 gen->save_ram_mask = rom->save_mask; 1357 gen->save_ram_mask = rom->save_mask;