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 }