Mercurial > repos > blastem
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; |