"file",
"ovl",
"id",
+ "autodump_file",
+ "autodump_mem",
};
int get_config_item_type(char *cmd) {
}
}
-void add_mapping(struct emulator_config *cfg, unsigned int type, unsigned int addr, unsigned int size, int mirr_addr, char *filename, char *map_id) {
+void add_mapping(struct emulator_config *cfg, unsigned int type, unsigned int addr, unsigned int size, int mirr_addr, char *filename, char *map_id, unsigned int autodump) {
unsigned int index = 0, file_size = 0;
FILE *in = NULL;
case MAPTYPE_ROM:
in = fopen(filename, "rb");
if (!in) {
- printf("[CFG] Failed to open file %s for ROM mapping. Using onboard ROM instead, if available.\n", filename);
- goto mapping_failed;
+ if (!autodump) {
+ printf("[CFG] Failed to open file %s for ROM mapping. Using onboard ROM instead, if available.\n", filename);
+ goto mapping_failed;
+ } else if (autodump == MAPCMD_AUTODUMP_FILE) {
+ printf("[CFG] Could not open file %s for ROM mapping. Autodump flag is set, dumping to file.\n", filename);
+ dump_range_to_file(cfg->map_offset[index], cfg->map_size[index], filename);
+ in = fopen(filename, "rb");
+ if (in == NULL) {
+ printf("[CFG] Could not open dumped file for reading. Using onboard ROM instead, if available.\n");
+ goto mapping_failed;
+ }
+ } else if (autodump == MAPCMD_AUTODUMP_MEM) {
+ printf("[CFG] Could not open file %s for ROM mapping. Autodump flag is set, dumping to memory.\n", filename);
+ cfg->map_data[index] = dump_range_to_memory(cfg->map_offset[index], cfg->map_size[index]);
+ cfg->rom_size[index] = cfg->map_size[index];
+ if (cfg->map_data[index] == NULL) {
+ printf("[CFG] Could not dump range to memory. Using onboard ROM instead, if available.\n");
+ goto mapping_failed;
+ }
+ goto skip_file_ops;
+ }
}
fseek(in, 0, SEEK_END);
file_size = (int)ftell(in);
}
memset(cfg->map_data[index], 0x00, cfg->map_size[index]);
fread(cfg->map_data[index], cfg->rom_size[index], 1, in);
- fclose(in);
+ if (in)
+ fclose(in);
+skip_file_ops:
displayRomInfo(cfg->map_data[index], cfg->rom_size[index]);
if (cfg->map_size[index] == cfg->rom_size[index])
m68k_add_rom_range(cfg->map_offset[index], cfg->map_high[index], cfg->map_data[index]);
for (int i = 0; i < MAX_NUM_MAPPED_ITEMS; i++) {
if (cfg->map_data[i]) {
- free(cfg->map_data[i]);
+ if (cfg->map_type[i] != MAPTYPE_RAM_NOALLOC) {
+ free(cfg->map_data[i]);
+ }
cfg->map_data[i] = NULL;
}
if (cfg->map_id[i]) {
cfg->map_id[i] = NULL;
}
}
+
if (cfg->mouse_file) {
free(cfg->mouse_file);
cfg->mouse_file = NULL;
cfg->cpu_type = get_m68k_cpu_type(parse_line + str_pos);
break;
case CONFITEM_MAP: {
- unsigned int maptype = 0, mapsize = 0, mapaddr = 0;
+ unsigned int maptype = 0, mapsize = 0, mapaddr = 0, autodump = 0;
unsigned int mirraddr = ((unsigned int)-1);
char mapfile[128], mapid[128];
memset(mapfile, 0x00, 128);
get_next_string(parse_line, cur_cmd, &str_pos, ' ');
mirraddr = get_int(cur_cmd);
break;
+ case MAPCMD_AUTODUMP_FILE:
+ case MAPCMD_AUTODUMP_MEM:
+ autodump = get_map_cmd(cur_cmd);
+ break;
default:
printf("[CFG] Unknown/unhandled map argument %s on line %d.\n", cur_cmd, cur_line);
break;
}
}
- add_mapping(cfg, maptype, mapaddr, mapsize, mirraddr, mapfile, mapid);
+ add_mapping(cfg, maptype, mapaddr, mapsize, mirraddr, mapfile, mapid, autodump);
break;
}
for (int i = 0; i < MAX_NUM_MAPPED_ITEMS; i++) {
if (cfg->map_type[i] == MAPTYPE_NONE || !cfg->map_data[i])
continue;
- if (address >= cfg->map_offset[i] && address < cfg->map_high[i])
- return i;
+ else if (address >= cfg->map_offset[i] && address < cfg->map_high[i]) {
+ if (cfg->map_type[i] == MAPTYPE_RAM || cfg->map_type[i] == MAPTYPE_RAM_NOALLOC || cfg->map_type[i] == MAPTYPE_ROM)
+ return i;
+ }
}
return -1;
}
+
+uint8_t *get_mapped_data_pointer_by_address(struct emulator_config *cfg, uint32_t address) {
+ for (int i = 0; i < MAX_NUM_MAPPED_ITEMS; i++) {
+ if (cfg->map_type[i] == MAPTYPE_NONE || !cfg->map_data[i])
+ continue;
+ else if (address >= cfg->map_offset[i] && address < cfg->map_high[i]) {
+ if (cfg->map_type[i] == MAPTYPE_RAM || cfg->map_type[i] == MAPTYPE_RAM_NOALLOC || cfg->map_type[i] == MAPTYPE_ROM)
+ return cfg->map_data[i] + (address - cfg->map_offset[i]);
+ }
+ }
+
+ return NULL;
+}