comparison genesis.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 24508cb54f87
children c206a422d466
comparison
equal deleted inserted replaced
1594:137dbd05ceab 1595:360d5bab199f
1188 { 1188 {
1189 genesis_context *gen = (genesis_context *)system; 1189 genesis_context *gen = (genesis_context *)system;
1190 vdp_free(gen->vdp); 1190 vdp_free(gen->vdp);
1191 memmap_chunk *map = (memmap_chunk *)gen->m68k->options->gen.memmap; 1191 memmap_chunk *map = (memmap_chunk *)gen->m68k->options->gen.memmap;
1192 m68k_options_free(gen->m68k->options); 1192 m68k_options_free(gen->m68k->options);
1193 free(map);//needs to happen after m68k_options_free as that function uses the memory map
1194 free(gen->cart); 1193 free(gen->cart);
1195 free(gen->m68k); 1194 free(gen->m68k);
1196 free(gen->work_ram); 1195 free(gen->work_ram);
1197 z80_options_free(gen->z80->options); 1196 z80_options_free(gen->z80->options);
1198 free(gen->z80); 1197 free(gen->z80);
1199 free(gen->zram); 1198 free(gen->zram);
1200 ym_free(gen->ym); 1199 ym_free(gen->ym);
1201 psg_free(gen->psg); 1200 psg_free(gen->psg);
1202 free(gen->save_storage);
1203 free(gen->header.save_dir); 1201 free(gen->header.save_dir);
1202 free_rom_info(&gen->header.info);
1204 free(gen->lock_on); 1203 free(gen->lock_on);
1205 free(gen); 1204 free(gen);
1206 } 1205 }
1207 1206
1208 static void gamepad_down(system_header *system, uint8_t gamepad_num, uint8_t button) 1207 static void gamepad_down(system_header *system, uint8_t gamepad_num, uint8_t button)
1249 1248
1250 static void keyboard_up(system_header *system, uint8_t scancode) 1249 static void keyboard_up(system_header *system, uint8_t scancode)
1251 { 1250 {
1252 genesis_context *gen = (genesis_context *)system; 1251 genesis_context *gen = (genesis_context *)system;
1253 io_keyboard_up(&gen->io, scancode); 1252 io_keyboard_up(&gen->io, scancode);
1253 }
1254
1255 static void config_updated(system_header *system)
1256 {
1257 genesis_context *gen = (genesis_context *)system;
1258 setup_io_devices(config, &system->info, &gen->io);
1254 } 1259 }
1255 1260
1256 genesis_context *alloc_init_genesis(rom_info *rom, void *main_rom, void *lock_on, uint32_t system_opts, uint8_t force_region) 1261 genesis_context *alloc_init_genesis(rom_info *rom, void *main_rom, void *lock_on, uint32_t system_opts, uint8_t force_region)
1257 { 1262 {
1258 static memmap_chunk z80_map[] = { 1263 static memmap_chunk z80_map[] = {
1281 gen->header.mouse_up = mouse_up; 1286 gen->header.mouse_up = mouse_up;
1282 gen->header.mouse_motion_absolute = mouse_motion_absolute; 1287 gen->header.mouse_motion_absolute = mouse_motion_absolute;
1283 gen->header.mouse_motion_relative = mouse_motion_relative; 1288 gen->header.mouse_motion_relative = mouse_motion_relative;
1284 gen->header.keyboard_down = keyboard_down; 1289 gen->header.keyboard_down = keyboard_down;
1285 gen->header.keyboard_up = keyboard_up; 1290 gen->header.keyboard_up = keyboard_up;
1291 gen->header.config_updated = config_updated;
1286 gen->header.type = SYSTEM_GENESIS; 1292 gen->header.type = SYSTEM_GENESIS;
1293 gen->header.info = *rom;
1287 set_region(gen, rom, force_region); 1294 set_region(gen, rom, force_region);
1288 1295
1289 gen->vdp = malloc(sizeof(vdp_context)); 1296 gen->vdp = malloc(sizeof(vdp_context));
1290 init_vdp_context(gen->vdp, gen->version_reg & 0x40); 1297 init_vdp_context(gen->vdp, gen->version_reg & 0x40);
1291 gen->vdp->system = &gen->header; 1298 gen->vdp->system = &gen->header;
1404 } 1411 }
1405 1412
1406 return gen; 1413 return gen;
1407 } 1414 }
1408 1415
1409 genesis_context *alloc_config_genesis(void *rom, uint32_t rom_size, void *lock_on, uint32_t lock_on_size, uint32_t ym_opts, uint8_t force_region, rom_info *info_out) 1416 genesis_context *alloc_config_genesis(void *rom, uint32_t rom_size, void *lock_on, uint32_t lock_on_size, uint32_t ym_opts, uint8_t force_region)
1410 { 1417 {
1411 static memmap_chunk base_map[] = { 1418 static memmap_chunk base_map[] = {
1412 {0xE00000, 0x1000000, 0xFFFF, 0, 0, MMAP_READ | MMAP_WRITE | MMAP_CODE, NULL, 1419 {0xE00000, 0x1000000, 0xFFFF, 0, 0, MMAP_READ | MMAP_WRITE | MMAP_CODE, NULL,
1413 NULL, NULL, NULL, NULL}, 1420 NULL, NULL, NULL, NULL},
1414 {0xC00000, 0xE00000, 0x1FFFFF, 0, 0, 0, NULL, 1421 {0xC00000, 0xE00000, 0x1FFFFF, 0, 0, 0, NULL,
1420 }; 1427 };
1421 static tern_node *rom_db; 1428 static tern_node *rom_db;
1422 if (!rom_db) { 1429 if (!rom_db) {
1423 rom_db = load_rom_db(); 1430 rom_db = load_rom_db();
1424 } 1431 }
1425 *info_out = configure_rom(rom_db, rom, rom_size, lock_on, lock_on_size, base_map, sizeof(base_map)/sizeof(base_map[0])); 1432 rom_info info = configure_rom(rom_db, rom, rom_size, lock_on, lock_on_size, base_map, sizeof(base_map)/sizeof(base_map[0]));
1426 rom = info_out->rom; 1433 rom = info.rom;
1427 rom_size = info_out->rom_size; 1434 rom_size = info.rom_size;
1428 #ifndef BLASTEM_BIG_ENDIAN 1435 #ifndef BLASTEM_BIG_ENDIAN
1429 byteswap_rom(rom_size, rom); 1436 byteswap_rom(rom_size, rom);
1430 if (lock_on) { 1437 if (lock_on) {
1431 byteswap_rom(lock_on_size, lock_on); 1438 byteswap_rom(lock_on_size, lock_on);
1432 } 1439 }
1437 } 1444 }
1438 MCLKS_PER_68K = atoi(m68k_divider); 1445 MCLKS_PER_68K = atoi(m68k_divider);
1439 if (!MCLKS_PER_68K) { 1446 if (!MCLKS_PER_68K) {
1440 MCLKS_PER_68K = 7; 1447 MCLKS_PER_68K = 7;
1441 } 1448 }
1442 return alloc_init_genesis(info_out, rom, lock_on, ym_opts, force_region); 1449 return alloc_init_genesis(&info, rom, lock_on, ym_opts, force_region);
1443 } 1450 }