Mercurial > repos > blastem
comparison sms.c @ 1595:360d5bab199f
Update controller config when changed in UI without restart
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 06 Jul 2018 17:39:59 -0700 |
parents | 430dd12e4010 |
children | 3602f3b20072 |
comparison
equal
deleted
inserted
replaced
1594:137dbd05ceab | 1595:360d5bab199f |
---|---|
528 { | 528 { |
529 sms_context *sms = (sms_context *)system; | 529 sms_context *sms = (sms_context *)system; |
530 io_keyboard_up(&sms->io, scancode); | 530 io_keyboard_up(&sms->io, scancode); |
531 } | 531 } |
532 | 532 |
533 sms_context *alloc_configure_sms(system_media *media, uint32_t opts, uint8_t force_region, rom_info *info_out) | 533 static void config_updated(system_header *system) |
534 { | 534 { |
535 memset(info_out, 0, sizeof(*info_out)); | 535 sms_context *sms = (sms_context *)system; |
536 setup_io_devices(config, &system->info, &sms->io); | |
537 } | |
538 | |
539 | |
540 sms_context *alloc_configure_sms(system_media *media, uint32_t opts, uint8_t force_region) | |
541 { | |
536 sms_context *sms = calloc(1, sizeof(sms_context)); | 542 sms_context *sms = calloc(1, sizeof(sms_context)); |
537 uint32_t rom_size = nearest_pow2(media->size); | 543 uint32_t rom_size = nearest_pow2(media->size); |
538 memmap_chunk memory_map[6]; | 544 memmap_chunk memory_map[6]; |
539 if (media->size > 0xC000) { | 545 if (media->size > 0xC000) { |
540 info_out->map_chunks = 6; | 546 sms->header.info.map_chunks = 6; |
541 uint8_t *ram_reg_overlap = sms->ram + sizeof(sms->ram) - 4; | 547 uint8_t *ram_reg_overlap = sms->ram + sizeof(sms->ram) - 4; |
542 memory_map[0] = (memmap_chunk){0x0000, 0x0400, 0xFFFF, 0, 0, MMAP_READ, media->buffer, NULL, NULL, NULL, NULL}; | 548 memory_map[0] = (memmap_chunk){0x0000, 0x0400, 0xFFFF, 0, 0, MMAP_READ, media->buffer, NULL, NULL, NULL, NULL}; |
543 memory_map[1] = (memmap_chunk){0x0400, 0x4000, 0xFFFF, 0, 0, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL}; | 549 memory_map[1] = (memmap_chunk){0x0400, 0x4000, 0xFFFF, 0, 0, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL}; |
544 memory_map[2] = (memmap_chunk){0x4000, 0x8000, 0x3FFF, 0, 1, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL}; | 550 memory_map[2] = (memmap_chunk){0x4000, 0x8000, 0x3FFF, 0, 1, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL}; |
545 memory_map[3] = (memmap_chunk){0x8000, 0xC000, 0x3FFF, 0, 2, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, cart_ram_write}; | 551 memory_map[3] = (memmap_chunk){0x8000, 0xC000, 0x3FFF, 0, 2, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, cart_ram_write}; |
546 memory_map[4] = (memmap_chunk){0xC000, 0xFFFC, sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE, sms->ram, NULL, NULL, NULL, NULL}; | 552 memory_map[4] = (memmap_chunk){0xC000, 0xFFFC, sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE, sms->ram, NULL, NULL, NULL, NULL}; |
547 memory_map[5] = (memmap_chunk){0xFFFC, 0x10000, 0x0003, 0, 0, MMAP_READ, ram_reg_overlap, NULL, NULL, NULL, mapper_write}; | 553 memory_map[5] = (memmap_chunk){0xFFFC, 0x10000, 0x0003, 0, 0, MMAP_READ, ram_reg_overlap, NULL, NULL, NULL, mapper_write}; |
548 } else { | 554 } else { |
549 info_out->map_chunks = 2; | 555 sms->header.info.map_chunks = 2; |
550 memory_map[0] = (memmap_chunk){0x0000, 0xC000, rom_size-1, 0, 0, MMAP_READ, media->buffer, NULL, NULL, NULL, NULL}; | 556 memory_map[0] = (memmap_chunk){0x0000, 0xC000, rom_size-1, 0, 0, MMAP_READ, media->buffer, NULL, NULL, NULL, NULL}; |
551 memory_map[1] = (memmap_chunk){0xC000, 0x10000, sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE, sms->ram, NULL, NULL, NULL, NULL}; | 557 memory_map[1] = (memmap_chunk){0xC000, 0x10000, sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE, sms->ram, NULL, NULL, NULL, NULL}; |
552 }; | 558 }; |
553 info_out->map = malloc(sizeof(memmap_chunk) * info_out->map_chunks); | 559 sms->header.info.map = malloc(sizeof(memmap_chunk) * sms->header.info.map_chunks); |
554 memcpy(info_out->map, memory_map, sizeof(memmap_chunk) * info_out->map_chunks); | 560 memcpy(sms->header.info.map, memory_map, sizeof(memmap_chunk) * sms->header.info.map_chunks); |
555 z80_options *zopts = malloc(sizeof(z80_options)); | 561 z80_options *zopts = malloc(sizeof(z80_options)); |
556 init_z80_opts(zopts, info_out->map, info_out->map_chunks, io_map, 4, 15, 0xFF); | 562 init_z80_opts(zopts, sms->header.info.map, sms->header.info.map_chunks, io_map, 4, 15, 0xFF); |
557 sms->z80 = init_z80_context(zopts); | 563 sms->z80 = init_z80_context(zopts); |
558 sms->z80->system = sms; | 564 sms->z80->system = sms; |
559 sms->z80->options->gen.debug_cmd_handler = debug_commands; | 565 sms->z80->options->gen.debug_cmd_handler = debug_commands; |
560 | 566 |
561 sms->rom = media->buffer; | 567 sms->rom = media->buffer; |
562 sms->rom_size = rom_size; | 568 sms->rom_size = rom_size; |
563 if (info_out->map_chunks > 2) { | 569 if (sms->header.info.map_chunks > 2) { |
564 sms->z80->mem_pointers[0] = sms->rom; | 570 sms->z80->mem_pointers[0] = sms->rom; |
565 sms->z80->mem_pointers[1] = sms->rom + 0x4000; | 571 sms->z80->mem_pointers[1] = sms->rom + 0x4000; |
566 sms->z80->mem_pointers[2] = sms->rom + 0x8000; | 572 sms->z80->mem_pointers[2] = sms->rom + 0x8000; |
567 sms->bank_regs[1] = 0; | 573 sms->bank_regs[1] = 0; |
568 sms->bank_regs[2] = 0x4000 >> 14; | 574 sms->bank_regs[2] = 0x4000 >> 14; |
577 | 583 |
578 sms->vdp = malloc(sizeof(vdp_context)); | 584 sms->vdp = malloc(sizeof(vdp_context)); |
579 init_vdp_context(sms->vdp, 0); | 585 init_vdp_context(sms->vdp, 0); |
580 sms->vdp->system = &sms->header; | 586 sms->vdp->system = &sms->header; |
581 | 587 |
582 info_out->save_type = SAVE_NONE; | 588 sms->header.info.save_type = SAVE_NONE; |
583 info_out->name = strdup(media->name); | 589 sms->header.info.name = strdup(media->name); |
584 | 590 |
585 setup_io_devices(config, info_out, &sms->io); | 591 setup_io_devices(config, &sms->header.info, &sms->io); |
586 sms->header.has_keyboard = io_has_keyboard(&sms->io); | 592 sms->header.has_keyboard = io_has_keyboard(&sms->io); |
587 | 593 |
588 sms->header.set_speed_percent = set_speed_percent; | 594 sms->header.set_speed_percent = set_speed_percent; |
589 sms->header.start_context = start_sms; | 595 sms->header.start_context = start_sms; |
590 sms->header.resume_context = resume_sms; | 596 sms->header.resume_context = resume_sms; |
603 sms->header.mouse_up = mouse_up; | 609 sms->header.mouse_up = mouse_up; |
604 sms->header.mouse_motion_absolute = mouse_motion_absolute; | 610 sms->header.mouse_motion_absolute = mouse_motion_absolute; |
605 sms->header.mouse_motion_relative = mouse_motion_relative; | 611 sms->header.mouse_motion_relative = mouse_motion_relative; |
606 sms->header.keyboard_down = keyboard_down; | 612 sms->header.keyboard_down = keyboard_down; |
607 sms->header.keyboard_up = keyboard_up; | 613 sms->header.keyboard_up = keyboard_up; |
614 sms->header.config_updated = config_updated; | |
608 sms->header.type = SYSTEM_SMS; | 615 sms->header.type = SYSTEM_SMS; |
609 | 616 |
610 return sms; | 617 return sms; |
611 } | 618 } |