X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=config_file%2Fconfig_file.c;h=960d30930501c4c3d8f690746960cfae25332e4a;hb=4d2a00807d77830b3ecfdf064279b574d90ff65b;hp=1d41335bf350c6288e93a00c7aa8bc25533b4aa4;hpb=99c9b76b2d60edaaf4c33f73db59bc61efc2ea5a;p=pistorm diff --git a/config_file/config_file.c b/config_file/config_file.c index 1d41335..960d309 100644 --- a/config_file/config_file.c +++ b/config_file/config_file.c @@ -1,4 +1,4 @@ -#include "../platforms/platforms.h" +#include "platforms/platforms.h" #include #include #include @@ -34,6 +34,7 @@ const char *config_item_names[CONFITEM_NUM] = { "keyboard", "platform", "setvar", + "kbfile", }; const char *mapcmd_names[MAPCMD_NUM] = { @@ -60,12 +61,12 @@ int get_config_item_type(char *cmd) { unsigned int get_m68k_cpu_type(char *name) { for (int i = 0; i < M68K_CPU_TYPES; i++) { if (strcmp(name, cpu_types[i]) == 0) { - printf("Set CPU type to %s.\n", cpu_types[i]); + printf("[CFG] Set CPU type to %s.\n", cpu_types[i]); return i + 1; } } - printf ("Invalid CPU type %s specified, defaulting to 68000.\n", name); + printf("[CFG] Invalid CPU type %s specified, defaulting to 68000.\n", name); return M68K_CPU_TYPE_68000; } @@ -118,7 +119,7 @@ unsigned int get_int(char *str) { case 'M': ret_int = ret_int * SIZE_MEGA; break; case 'G': ret_int = ret_int * SIZE_GIGA; break; default: - printf("Unknown character %c in hex value.\n", str[i]); + printf("[CFG] Unknown character %c in hex value.\n", str[i]); break; } } @@ -178,13 +179,14 @@ void add_mapping(struct emulator_config *cfg, unsigned int type, unsigned int ad index++; } if (index == MAX_NUM_MAPPED_ITEMS) { - printf("Unable to map item, only %d items can be mapped with current binary.\n", MAX_NUM_MAPPED_ITEMS); + printf("[CFG] Unable to map item, only %d items can be mapped with current binary.\n", MAX_NUM_MAPPED_ITEMS); return; } cfg->map_type[index] = type; cfg->map_offset[index] = addr; cfg->map_size[index] = size; + cfg->map_high[index] = addr + size; cfg->map_mirror[index] = mirr_addr; if (strlen(map_id)) { cfg->map_id[index] = (char *)malloc(strlen(map_id) + 1); @@ -193,10 +195,10 @@ void add_mapping(struct emulator_config *cfg, unsigned int type, unsigned int ad switch(type) { case MAPTYPE_RAM: - printf("Allocating %d bytes for RAM mapping (%d MB)...\n", size, size / 1024 / 1024); + printf("[CFG] Allocating %d bytes for RAM mapping (%d MB)...\n", size, size / 1024 / 1024); cfg->map_data[index] = (unsigned char *)malloc(size); if (!cfg->map_data[index]) { - printf("ERROR: Unable to allocate memory for mapped RAM!\n"); + printf("[CFG] ERROR: Unable to allocate memory for mapped RAM!\n"); goto mapping_failed; } memset(cfg->map_data[index], 0x00, size); @@ -204,19 +206,20 @@ void add_mapping(struct emulator_config *cfg, unsigned int type, unsigned int ad case MAPTYPE_ROM: in = fopen(filename, "rb"); if (!in) { - printf("Failed to open file %s for ROM mapping.\n", filename); + printf("[CFG] Failed to open file %s for ROM mapping.\n", filename); goto mapping_failed; } fseek(in, 0, SEEK_END); file_size = (int)ftell(in); if (size == 0) { cfg->map_size[index] = file_size; + cfg->map_high[index] = addr + cfg->map_size[index]; } fseek(in, 0, SEEK_SET); cfg->map_data[index] = (unsigned char *)calloc(1, cfg->map_size[index]); cfg->rom_size[index] = (cfg->map_size[index] <= file_size) ? cfg->map_size[index] : file_size; if (!cfg->map_data[index]) { - printf("ERROR: Unable to allocate memory for mapped ROM!\n"); + printf("[CFG] ERROR: Unable to allocate memory for mapped ROM!\n"); goto mapping_failed; } memset(cfg->map_data[index], 0x00, cfg->map_size[index]); @@ -226,10 +229,11 @@ void add_mapping(struct emulator_config *cfg, unsigned int type, unsigned int ad case MAPTYPE_REGISTER: default: break; - break; } - printf("[MAP %d] Added %s mapping for range %.8lX-%.8lX ID: %s\n", index, map_type_names[type], cfg->map_offset[index], cfg->map_offset[index] + cfg->map_size[index] - 1, cfg->map_id[index] ? cfg->map_id[index] : "None"); + 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; @@ -242,7 +246,7 @@ void add_mapping(struct emulator_config *cfg, unsigned int type, unsigned int ad struct emulator_config *load_config_file(char *filename) { FILE *in = fopen(filename, "rb"); if (in == NULL) { - printf("Failed to open config file %s for reading.\n", filename); + printf("[CFG] Failed to open config file %s for reading.\n", filename); return NULL; } @@ -253,12 +257,12 @@ struct emulator_config *load_config_file(char *filename) { parse_line = (char *)calloc(1, 512); if (!parse_line) { - printf("Failed to allocate memory for config file line buffer.\n"); + printf("[CFG] Failed to allocate memory for config file line buffer.\n"); return NULL; } cfg = (struct emulator_config *)calloc(1, sizeof(struct emulator_config)); if (!cfg) { - printf("Failed to allocate memory for temporary emulator config.\n"); + printf("[CFG] Failed to allocate memory for temporary emulator config.\n"); goto load_failed; } @@ -274,7 +278,7 @@ struct emulator_config *load_config_file(char *filename) { goto skip_line; trim_whitespace(parse_line); - + get_next_string(parse_line, cur_cmd, &str_pos, ' '); switch (get_config_item_type(cur_cmd)) { @@ -283,7 +287,7 @@ struct emulator_config *load_config_file(char *filename) { break; case CONFITEM_MAP: { unsigned int maptype = 0, mapsize = 0, mapaddr = 0; - int mirraddr = -1; + unsigned int mirraddr = ((unsigned int)-1); char mapfile[128], mapid[128]; memset(mapfile, 0x00, 128); memset(mapid, 0x00, 128); @@ -328,7 +332,7 @@ struct emulator_config *load_config_file(char *filename) { mirraddr = get_int(cur_cmd); break; default: - printf("Unknown/unhandled map argument %s on line %d.\n", cur_cmd, cur_line); + printf("[CFG] Unknown/unhandled map argument %s on line %d.\n", cur_cmd, cur_line); break; } } @@ -338,7 +342,7 @@ struct emulator_config *load_config_file(char *filename) { } case CONFITEM_LOOPCYCLES: cfg->loop_cycles = get_int(parse_line + str_pos); - printf("Set CPU loop cycles to %d.\n", cfg->loop_cycles); + printf("[CFG] Set CPU loop cycles to %d.\n", cfg->loop_cycles); break; case CONFITEM_MOUSE: get_next_string(parse_line, cur_cmd, &str_pos, ' '); @@ -347,19 +351,28 @@ struct emulator_config *load_config_file(char *filename) { get_next_string(parse_line, cur_cmd, &str_pos, ' '); cfg->mouse_toggle_key = cur_cmd[0]; cfg->mouse_enabled = 1; - printf("Enabled mouse event forwarding from file %s, toggle key %c.\n", cfg->mouse_file, cfg->mouse_toggle_key); + printf("[CFG] Enabled mouse event forwarding from file %s, toggle key %c.\n", cfg->mouse_file, cfg->mouse_toggle_key); break; case CONFITEM_KEYBOARD: get_next_string(parse_line, cur_cmd, &str_pos, ' '); cfg->keyboard_toggle_key = cur_cmd[0]; - printf("Enabled keyboard event forwarding, toggle key %c.\n", cfg->keyboard_toggle_key); + get_next_string(parse_line, cur_cmd, &str_pos, ' '); + cfg->keyboard_grab = (strcmp(cur_cmd, "grab") == 0) ? 1 : 0; + printf("[CFG] Enabled keyboard event forwarding, toggle key %c, %slocking from host.\n", + cfg->keyboard_toggle_key, cfg->keyboard_grab ? "" : "not "); + break; + case CONFITEM_KBFILE: + get_next_string(parse_line, cur_cmd, &str_pos, ' '); + cfg->keyboard_file = (char *)calloc(1, strlen(cur_cmd) + 1); + strcpy(cfg->keyboard_file, cur_cmd); + printf("[CFG] Set keyboard event source file to %s.\n", cfg->keyboard_file); break; case CONFITEM_PLATFORM: { char platform_name[128], platform_sub[128]; memset(platform_name, 0x00, 128); memset(platform_sub, 0x00, 128); get_next_string(parse_line, platform_name, &str_pos, ' '); - printf("Setting platform to %s", platform_name); + printf("[CFG] Setting platform to %s", platform_name); get_next_string(parse_line, platform_sub, &str_pos, ' '); if (strlen(platform_sub)) printf(" (sub: %s)", platform_sub); @@ -369,7 +382,7 @@ struct emulator_config *load_config_file(char *filename) { } case CONFITEM_SETVAR: { if (!cfg->platform) { - printf("Warning: esetvar used in config file with no platform specified.\n"); + printf("[CFG] Warning: setvar used in config file with no platform specified.\n"); break; } @@ -378,17 +391,17 @@ struct emulator_config *load_config_file(char *filename) { memset(var_value, 0x00, 128); get_next_string(parse_line, var_name, &str_pos, ' '); get_next_string(parse_line, var_value, &str_pos, ' '); - cfg->platform->setvar(var_name, var_value); + cfg->platform->setvar(cfg, var_name, var_value); break; } case CONFITEM_NONE: default: - printf("Unknown config item %s on line %d.\n", cur_cmd, cur_line); + printf("[CFG] Unknown config item %s on line %d.\n", cur_cmd, cur_line); break; } - - skip_line:; + + skip_line: cur_line++; } goto load_successful; @@ -423,3 +436,14 @@ int get_named_mapped_item(struct emulator_config *cfg, char *name) { return -1; } + +int get_mapped_item_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; + if (address >= cfg->map_offset[i] && address < cfg->map_high[i]) + return i; + } + + return -1; +}