comparison sms.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 6ce36c3f250b
children 360d5bab199f
comparison
equal deleted inserted replaced
1582:a74db49fa6b1 1583:430dd12e4010
5 #include "blastem.h" 5 #include "blastem.h"
6 #include "render.h" 6 #include "render.h"
7 #include "util.h" 7 #include "util.h"
8 #include "debug.h" 8 #include "debug.h"
9 #include "saves.h" 9 #include "saves.h"
10 #include "bindings.h"
10 11
11 static void *memory_io_write(uint32_t location, void *vcontext, uint8_t value) 12 static void *memory_io_write(uint32_t location, void *vcontext, uint8_t value)
12 { 13 {
13 z80_context *z80 = vcontext; 14 z80_context *z80 = vcontext;
14 sms_context *sms = z80->system; 15 sms_context *sms = z80->system;
383 vdp_adjust_cycles(sms->vdp, adjust); 384 vdp_adjust_cycles(sms->vdp, adjust);
384 sms->psg->cycles -= adjust; 385 sms->psg->cycles -= adjust;
385 target_cycle -= adjust; 386 target_cycle -= adjust;
386 } 387 }
387 } 388 }
389 bindings_release_capture();
388 vdp_release_framebuffer(sms->vdp); 390 vdp_release_framebuffer(sms->vdp);
389 render_pause_source(sms->psg->audio); 391 render_pause_source(sms->psg->audio);
390 sms->should_return = 0; 392 sms->should_return = 0;
391 } 393 }
392 394
393 static void resume_sms(system_header *system) 395 static void resume_sms(system_header *system)
394 { 396 {
395 sms_context *sms = (sms_context *)system; 397 sms_context *sms = (sms_context *)system;
398 bindings_reacquire_capture();
396 vdp_reacquire_framebuffer(sms->vdp); 399 vdp_reacquire_framebuffer(sms->vdp);
397 render_resume_source(sms->psg->audio); 400 render_resume_source(sms->psg->audio);
398 run_sms(system); 401 run_sms(system);
399 } 402 }
400 403
401 static void start_sms(system_header *system, char *statefile) 404 static void start_sms(system_header *system, char *statefile)
402 { 405 {
403 sms_context *sms = (sms_context *)system; 406 sms_context *sms = (sms_context *)system;
404 set_keybindings(&sms->io);
405 407
406 z80_assert_reset(sms->z80, 0); 408 z80_assert_reset(sms->z80, 0);
407 z80_clear_reset(sms->z80, 128*15); 409 z80_clear_reset(sms->z80, 128*15);
408 410
409 if (statefile) { 411 if (statefile) {
470 } 472 }
471 473
472 static void persist_save(system_header *system) 474 static void persist_save(system_header *system)
473 { 475 {
474 //TODO: Implement me 476 //TODO: Implement me
477 }
478
479 static void gamepad_down(system_header *system, uint8_t gamepad_num, uint8_t button)
480 {
481 sms_context *sms = (sms_context *)system;
482 if (gamepad_num == GAMEPAD_MAIN_UNIT) {
483 if (button == MAIN_UNIT_PAUSE) {
484 vdp_pbc_pause(sms->vdp);
485 }
486 } else {
487 io_gamepad_down(&sms->io, gamepad_num, button);
488 }
489 }
490
491 static void gamepad_up(system_header *system, uint8_t gamepad_num, uint8_t button)
492 {
493 sms_context *sms = (sms_context *)system;
494 io_gamepad_up(&sms->io, gamepad_num, button);
495 }
496
497 static void mouse_down(system_header *system, uint8_t mouse_num, uint8_t button)
498 {
499 sms_context *sms = (sms_context *)system;
500 io_mouse_down(&sms->io, mouse_num, button);
501 }
502
503 static void mouse_up(system_header *system, uint8_t mouse_num, uint8_t button)
504 {
505 sms_context *sms = (sms_context *)system;
506 io_mouse_up(&sms->io, mouse_num, button);
507 }
508
509 static void mouse_motion_absolute(system_header *system, uint8_t mouse_num, uint16_t x, uint16_t y)
510 {
511 sms_context *sms = (sms_context *)system;
512 io_mouse_motion_absolute(&sms->io, mouse_num, x, y);
513 }
514
515 static void mouse_motion_relative(system_header *system, uint8_t mouse_num, int32_t x, int32_t y)
516 {
517 sms_context *sms = (sms_context *)system;
518 io_mouse_motion_relative(&sms->io, mouse_num, x, y);
519 }
520
521 static void keyboard_down(system_header *system, uint8_t scancode)
522 {
523 sms_context *sms = (sms_context *)system;
524 io_keyboard_down(&sms->io, scancode);
525 }
526
527 static void keyboard_up(system_header *system, uint8_t scancode)
528 {
529 sms_context *sms = (sms_context *)system;
530 io_keyboard_up(&sms->io, scancode);
475 } 531 }
476 532
477 sms_context *alloc_configure_sms(system_media *media, uint32_t opts, uint8_t force_region, rom_info *info_out) 533 sms_context *alloc_configure_sms(system_media *media, uint32_t opts, uint8_t force_region, rom_info *info_out)
478 { 534 {
479 memset(info_out, 0, sizeof(*info_out)); 535 memset(info_out, 0, sizeof(*info_out));
525 581
526 info_out->save_type = SAVE_NONE; 582 info_out->save_type = SAVE_NONE;
527 info_out->name = strdup(media->name); 583 info_out->name = strdup(media->name);
528 584
529 setup_io_devices(config, info_out, &sms->io); 585 setup_io_devices(config, info_out, &sms->io);
586 sms->header.has_keyboard = io_has_keyboard(&sms->io);
530 587
531 sms->header.set_speed_percent = set_speed_percent; 588 sms->header.set_speed_percent = set_speed_percent;
532 sms->header.start_context = start_sms; 589 sms->header.start_context = start_sms;
533 sms->header.resume_context = resume_sms; 590 sms->header.resume_context = resume_sms;
534 sms->header.load_save = load_save; 591 sms->header.load_save = load_save;
538 sms->header.get_open_bus_value = get_open_bus_value; 595 sms->header.get_open_bus_value = get_open_bus_value;
539 sms->header.request_exit = request_exit; 596 sms->header.request_exit = request_exit;
540 sms->header.soft_reset = soft_reset; 597 sms->header.soft_reset = soft_reset;
541 sms->header.inc_debug_mode = inc_debug_mode; 598 sms->header.inc_debug_mode = inc_debug_mode;
542 sms->header.inc_debug_pal = inc_debug_pal; 599 sms->header.inc_debug_pal = inc_debug_pal;
600 sms->header.gamepad_down = gamepad_down;
601 sms->header.gamepad_up = gamepad_up;
602 sms->header.mouse_down = mouse_down;
603 sms->header.mouse_up = mouse_up;
604 sms->header.mouse_motion_absolute = mouse_motion_absolute;
605 sms->header.mouse_motion_relative = mouse_motion_relative;
606 sms->header.keyboard_down = keyboard_down;
607 sms->header.keyboard_up = keyboard_up;
543 sms->header.type = SYSTEM_SMS; 608 sms->header.type = SYSTEM_SMS;
544 609
545 return sms; 610 return sms;
546 } 611 }