X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=config_file%2Fconfig_file.c;h=0d736c546a0b0acc95c603c16dac38bbef217176;hb=47c3c3a059c5c7c9e22110961d3b40edd5c92df4;hp=dab35087dfb4b484808223f7f9ac0fc9104e5a40;hpb=10d5229b689aa1c7c86a6afe307cd4fbba7c3620;p=pistorm diff --git a/config_file/config_file.c b/config_file/config_file.c index dab3508..0d736c5 100644 --- a/config_file/config_file.c +++ b/config_file/config_file.c @@ -5,6 +5,8 @@ #include #include +#include "rominfo.h" + #define M68K_CPU_TYPES M68K_CPU_TYPE_SCC68070 const char *cpu_types[M68K_CPU_TYPES] = { @@ -25,6 +27,7 @@ const char *map_type_names[MAPTYPE_NUM] = { "rom", "ram", "register", + "ram (no alloc)", }; const char *config_item_names[CONFITEM_NUM] = { @@ -142,7 +145,7 @@ unsigned int get_int(char *str) { } void get_next_string(char *str, char *str_out, int *strpos, char separator) { - int str_pos = 0, out_pos = 0; + int str_pos = 0, out_pos = 0, startquote = 0, endstring = 0; if (!str_out) return; @@ -150,19 +153,36 @@ void get_next_string(char *str, char *str_out, int *strpos, char separator) { if (strpos) str_pos = *strpos; - while (str[str_pos] == ' ' && str[str_pos] == '\t' && str_pos < (int)strlen(str)) { + while ((str[str_pos] == ' ' || str[str_pos] == '\t') && str_pos < (int)strlen(str)) { + str_pos++; + } + + if (str[str_pos] == '\"') { str_pos++; + startquote = 1; } + for (int i = str_pos; i < (int)strlen(str); i++) { str_out[out_pos] = str[i]; - if ((separator == ' ' && (str[i] == ' ' || str[i] == '\t')) || str[i] == separator) { + + if (startquote) { + if (str[i] == '\"') + endstring = 1; + } else { + if ((separator == ' ' && (str[i] == ' ' || str[i] == '\t')) || str[i] == separator) { + endstring = 1; + } + } + + if (endstring) { str_out[out_pos] = '\0'; if (strpos) { *strpos = i + 1; } break; } + out_pos++; if (i + 1 == (int)strlen(str) && strpos) { *strpos = i + 1; @@ -196,6 +216,10 @@ void add_mapping(struct emulator_config *cfg, unsigned int type, unsigned int ad } switch(type) { + case MAPTYPE_RAM_NOALLOC: + printf("[CFG] Adding %d byte (%d MB) RAM mapping %s...\n", size, size / 1024 / 1024, map_id); + cfg->map_data[index] = (unsigned char *)filename; + break; case MAPTYPE_RAM: printf("[CFG] Allocating %d bytes for RAM mapping (%d MB)...\n", size, size / 1024 / 1024); cfg->map_data[index] = (unsigned char *)malloc(size); @@ -208,7 +232,7 @@ void add_mapping(struct emulator_config *cfg, unsigned int type, unsigned int ad case MAPTYPE_ROM: in = fopen(filename, "rb"); if (!in) { - printf("[CFG] Failed to open file %s for ROM mapping.\n", filename); + printf("[CFG] Failed to open file %s for ROM mapping. Using onboard ROM instead, if available.\n", filename); goto mapping_failed; } fseek(in, 0, SEEK_END); @@ -227,6 +251,9 @@ void add_mapping(struct emulator_config *cfg, unsigned int type, unsigned int ad memset(cfg->map_data[index], 0x00, cfg->map_size[index]); fread(cfg->map_data[index], cfg->rom_size[index], 1, in); fclose(in); + displayRomInfo(cfg->map_data[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]); break; case MAPTYPE_REGISTER: default: @@ -234,8 +261,6 @@ void add_mapping(struct emulator_config *cfg, unsigned int type, unsigned int ad } printf("[CFG] [MAP %d] Added %s mapping for range %.8lX-%.8lX ID: %s\n", index, map_type_names[type], cfg->map_offset[index], cfg->map_high[index] - 1, cfg->map_id[index] ? cfg->map_id[index] : "None"); - 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]); return; @@ -245,6 +270,41 @@ void add_mapping(struct emulator_config *cfg, unsigned int type, unsigned int ad fclose(in); } +void free_config_file(struct emulator_config *cfg) { + if (!cfg) { + printf("[CFG] Tried to free NULL config, aborting.\n"); + } + + if (cfg->platform) { + cfg->platform->shutdown(cfg); + free(cfg->platform); + cfg->platform = NULL; + } + + for (int i = 0; i < MAX_NUM_MAPPED_ITEMS; i++) { + if (cfg->map_data[i]) { + free(cfg->map_data[i]); + cfg->map_data[i] = NULL; + } + if (cfg->map_id[i]) { + free(cfg->map_id[i]); + cfg->map_id[i] = NULL; + } + } + if (cfg->mouse_file) { + free(cfg->mouse_file); + cfg->mouse_file = NULL; + } + if (cfg->keyboard_file) { + free(cfg->keyboard_file); + cfg->keyboard_file = NULL; + } + + m68k_clear_ranges(); + + printf("[CFG] Config file freed. Maybe.\n"); +} + struct emulator_config *load_config_file(char *filename) { FILE *in = fopen(filename, "rb"); if (in == NULL) {