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