Mercurial > repos > blastem
diff romdb.c @ 866:69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 06 Nov 2015 12:19:39 -0800 |
parents | 46bb673eed4e |
children | 54ffba3768d6 |
line wrap: on
line diff
--- a/romdb.c Fri Nov 06 11:44:51 2015 -0800 +++ b/romdb.c Fri Nov 06 12:19:39 2015 -0800 @@ -4,6 +4,7 @@ #include "romdb.h" #include "util.h" #include "blastem.h" +#include "menu.h" #define TITLE_START 0x150 #define TITLE_END (TITLE_START+48) @@ -335,7 +336,7 @@ if (!map) { fatal_error("Could not find EEPROM map for address %X\n", address); } - + uint16_t expanded, mask; if (address & 1) { expanded = value; @@ -405,7 +406,7 @@ { uint8_t *last = rom + TITLE_END - 1; uint8_t *src = rom + TITLE_START; - + while (last > src && (*last <= 0x20 || *last >= 0x80)) { last--; @@ -490,24 +491,24 @@ } info->save_size = save_size; info->save_buffer = malloc(save_size); - + info->map_chunks = base_chunks + (ram_start >= rom_end ? 2 : 3); info->map = malloc(sizeof(memmap_chunk) * info->map_chunks); memset(info->map, 0, sizeof(memmap_chunk)*2); memcpy(info->map+2, base_map, sizeof(memmap_chunk) * base_chunks); - + if (ram_start >= rom_end) { info->map[0].end = rom_end < 0x400000 ? nearest_pow2(rom_end) - 1 : 0xFFFFFF; //TODO: ROM mirroring info->map[0].mask = 0xFFFFFF; info->map[0].flags = MMAP_READ; info->map[0].buffer = rom; - + info->map[1].start = ram_start; info->map[1].mask = info->save_mask; info->map[1].end = ram_end + 1; info->map[1].flags = MMAP_READ | MMAP_WRITE; - + if (ram_flags == RAM_FLAG_ODD) { info->map[1].flags |= MMAP_ONLY_ODD; } else if (ram_flags == RAM_FLAG_EVEN) { @@ -520,7 +521,7 @@ info->map[0].mask = 0xFFFFFF; info->map[0].flags = MMAP_READ; info->map[0].buffer = rom; - + info->map[1].start = 0x200000; info->map[1].end = 0x400000; info->map[1].mask = 0x1FFFFF; @@ -531,7 +532,7 @@ info->map[1].write_16 = (write_16_fun)write_sram_area_w;//these will be called all writes to the area info->map[1].write_8 = (write_8_fun)write_sram_area_b; info->map[1].buffer = cart + 0x200000; - + memmap_chunk *last = info->map + info->map_chunks - 1; memset(last, 0, sizeof(memmap_chunk)); last->start = 0xA13000; @@ -545,7 +546,7 @@ info->map = malloc(sizeof(memmap_chunk) * info->map_chunks); memset(info->map, 0, sizeof(memmap_chunk)); memcpy(info->map+1, base_map, sizeof(memmap_chunk) * base_chunks); - + info->map[0].end = rom_end > 0x400000 ? rom_end : 0x400000; info->map[0].mask = rom_end < 0x400000 ? nearest_pow2(rom_end) - 1 : 0xFFFFFF; info->map[0].flags = MMAP_READ; @@ -703,7 +704,7 @@ } else if (!strcmp(dtype, "EEPROM")) { process_eeprom_def(key, state); add_eeprom_map(node, start, end, state); - + map->write_16 = write_eeprom_i2c_w; map->write_8 = write_eeprom_i2c_b; map->read_16 = read_eeprom_i2c_w; @@ -719,6 +720,22 @@ map->flags |= MMAP_ONLY_EVEN; } map->mask = calc_mask(state->info->save_size, start, end); + } else if (!strcmp(dtype, "RAM")) { + uint32_t size = strtol(tern_find_ptr_default(node, "size", "0"), NULL, 16); + if (!size || size > map->end - map->start) { + size = map->end - map->start; + } + map->buffer = malloc(size); + map->mask = calc_mask(size, start, end); + map->flags = MMAP_READ | MMAP_WRITE; + char *bus = tern_find_ptr_default(node, "bus", "both"); + if (!strcmp(dtype, "odd")) { + map->flags |= MMAP_ONLY_ODD; + } else if (!strcmp(dtype, "even")) { + map->flags |= MMAP_ONLY_EVEN; + } else { + map->flags |= MMAP_CODE; + } } else if (!strcmp(dtype, "Sega mapper")) { state->info->mapper_start_index = state->ptr_index++; state->info->map_chunks+=7; @@ -760,6 +777,12 @@ map->mask = 0xFF; map->write_16 = (write_16_fun)write_bank_reg_w; map->write_8 = (write_8_fun)write_bank_reg_b; + } else if (!strcmp(dtype, "MENU")) { + //fake hardware for supporting menu + map->buffer = NULL; + map->mask = 0xFF; + map->write_16 = menu_write_w; + map->read_16 = menu_read_w; } else { fatal_error("Invalid device type for ROM DB map entry %d with address %s\n", state->index, key); } @@ -778,7 +801,7 @@ break; } product_id[i] = rom[GAME_ID_OFF + i]; - + } printf("Product ID: %s\n", product_id); tern_node * entry = tern_find_ptr(rom_db, product_id); @@ -794,7 +817,7 @@ } else { info.name = get_header_name(rom); } - + char *dbreg = tern_find_ptr(entry, "regions"); info.regions = 0; if (dbreg) { @@ -806,7 +829,7 @@ if (!info.regions) { info.regions = get_header_regions(rom); } - + tern_node *map = tern_find_ptr(entry, "map"); if (map) { info.save_type = SAVE_NONE; @@ -828,6 +851,6 @@ } else { add_memmap_header(&info, rom, rom_size, base_map, base_chunks); } - + return info; }