X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=platform%2Fcommon%2Femu.c;h=14cc52aeeea38a5715582d34134b6791c86dcf16;hb=1cb1584b86a5679b8d32ccfc190f6e76c920810f;hp=9d573bf36ce583f98cec4f6c29ab6b24cbe030e6;hpb=c46ffd310f86522e2557e4d19945de5a40350ffc;p=picodrive.git diff --git a/platform/common/emu.c b/platform/common/emu.c index 9d573bf..14cc52a 100644 --- a/platform/common/emu.c +++ b/platform/common/emu.c @@ -40,6 +40,8 @@ int rom_loaded = 0; char noticeMsg[64]; int state_slot = 0; int config_slot = 0, config_slot_current = 0; +char lastRomFile[512]; +int kb_combo_keys = 0, kb_combo_acts = 0; // keys and actions which need button combos unsigned char *movie_data = NULL; static int movie_size = 0; @@ -87,8 +89,8 @@ static void get_ext(char *file, char *ext) strlwr_(ext); } -char *biosfiles_us[] = { "us_scd2_9306", "SegaCDBIOS9303", "us_scd1_9210" }; -char *biosfiles_eu[] = { "eu_mcd2_9306", "eu_mcd2_9303", "eu_mcd1_9210" }; +char *biosfiles_us[] = { "us_scd1_9210", "us_scd2_9306", "SegaCDBIOS9303" }; +char *biosfiles_eu[] = { "eu_mcd1_9210", "eu_mcd2_9306", "eu_mcd2_9303" }; char *biosfiles_jp[] = { "jp_mcd1_9112", "jp_mcd1_9111" }; int emu_findBios(int region, char **bios_file) @@ -139,6 +141,7 @@ int emu_findBios(int region, char **bios_file) } /* check if the name begins with BIOS name */ +/* static int emu_isBios(const char *name) { int i; @@ -150,8 +153,9 @@ static int emu_isBios(const char *name) if (strstr(name, biosfiles_jp[i]) != NULL) return 1; return 0; } +*/ -static unsigned char scd_id_header[0x100]; +static unsigned char id_header[0x100]; /* checks if romFileName points to valid MegaCD image * if so, checks for suitable BIOS */ @@ -177,7 +181,7 @@ int emu_cdCheck(int *pregion) } pm_seek(cd_f, (type == 1) ? 0x100 : 0x110, SEEK_SET); - pm_read(scd_id_header, sizeof(scd_id_header), cd_f); + pm_read(id_header, sizeof(id_header), cd_f); /* it seems we have a CD image here. Try to detect region now.. */ pm_seek(cd_f, (type == 1) ? 0x100+0x10B : 0x110+0x10B, SEEK_SET); @@ -229,31 +233,22 @@ static int extract_text(char *dest, unsigned char *src, int len, int swab) char *emu_makeRomId(void) { static char id_string[3+0x11+0x11+0x30+16]; - unsigned char *id_header; - int pos; - - if (Pico.rom == NULL) { - id_string[0] = 0; - return id_string; - } + int pos, swab = 1; if (PicoMCD & 1) { - id_header = scd_id_header; strcpy(id_string, "CD|"); - } else { - id_header = Pico.rom + 0x100; - strcpy(id_string, "MD|"); + swab = 0; } + else strcpy(id_string, "MD|"); pos = 3; - pos += extract_text(id_string + pos, id_header + 0x80, 0x0e, 1); // serial + pos += extract_text(id_string + pos, id_header + 0x80, 0x0e, swab); // serial id_string[pos] = '|'; pos++; - pos += extract_text(id_string + pos, id_header + 0xf0, 0x03, 1); // region + pos += extract_text(id_string + pos, id_header + 0xf0, 0x03, swab); // region id_string[pos] = '|'; pos++; - pos += extract_text(id_string + pos, id_header + 0x50, 0x30, 1); // overseas name + pos += extract_text(id_string + pos, id_header + 0x50, 0x30, swab); // overseas name id_string[pos] = 0; - printf("id_string: %s\n", id_string); return id_string; } @@ -283,7 +278,8 @@ int emu_ReloadRom(void) free(movie_data); movie_data = 0; } - if (!strcmp(ext, ".gmv")) { + if (!strcmp(ext, ".gmv")) + { // check for both gmv and rom int dummy; FILE *movie_file = fopen(romFileName, "rb"); @@ -336,6 +332,7 @@ int emu_ReloadRom(void) cd_state = emu_cdCheck(&cd_region); if (cd_state > 0) { + PicoMCD |= 1; // valid CD image, check for BIOS.. // we need to have config loaded at this point @@ -349,10 +346,10 @@ int emu_ReloadRom(void) } if (!emu_findBios(cd_region, &used_rom_name)) { // bios_help() ? + PicoMCD &= ~1; return 0; } - PicoMCD |= 1; get_ext(used_rom_name, ext); } else @@ -391,6 +388,8 @@ int emu_ReloadRom(void) } // load config for this ROM (do this before insert to get correct region) + if (!(PicoMCD&1)) + memcpy(id_header, rom_data + 0x100, sizeof(id_header)); if (!cfg_loaded) { ret = emu_ReadConfig(1, 1); if (!ret) emu_ReadConfig(0, 1); @@ -418,13 +417,6 @@ int emu_ReloadRom(void) menu_romload_end(); - if (!emu_isBios(romFileName)) - { - // emu_ReadConfig() might have messed currentConfig.lastRomFile - strncpy(currentConfig.lastRomFile, romFileName, sizeof(currentConfig.lastRomFile)-1); - currentConfig.lastRomFile[sizeof(currentConfig.lastRomFile)-1] = 0; - } - if (PicoPatches) { PicoPatchPrepare(); PicoPatchApply(); @@ -442,7 +434,7 @@ int emu_ReloadRom(void) } else { PicoRegionOverride = 4; } - PicoReset(0); + PicoReset(); // TODO: bits 6 & 5 } movie_data[0x18+30] = 0; @@ -463,6 +455,8 @@ int emu_ReloadRom(void) if (currentConfig.EmuOpt & 1) emu_SaveLoadGame(1, 1); + strncpy(lastRomFile, romFileName, sizeof(lastRomFile)-1); + lastRomFile[sizeof(lastRomFile)-1] = 0; rom_loaded = 1; return 1; } @@ -487,6 +481,18 @@ static void romfname_ext(char *dst, const char *prefix, const char *ext) } +static void make_config_cfg(char *cfg) +{ + strncpy(cfg, PicoConfigFile, 511); + if (config_slot != 0) + { + char *p = strrchr(cfg, '.'); + if (p == NULL) p = cfg + strlen(cfg); + sprintf(p, ".%i.cfg", config_slot); + } + cfg[511] = 0; +} + int emu_ReadConfig(int game, int no_defaults) { char cfg[512]; @@ -497,30 +503,38 @@ int emu_ReadConfig(int game, int no_defaults) { if (!no_defaults) emu_setDefaultConfig(); - strncpy(cfg, PicoConfigFile, 511); - if (config_slot != 0) - { - char *p = strrchr(cfg, '.'); - if (p == NULL) p = cfg + strlen(cfg); - sprintf(p, ".%i.cfg", config_slot); - } - cfg[511] = 0; + make_config_cfg(cfg); ret = config_readsect(cfg, NULL); } else { - if (!no_defaults) - emu_setDefaultConfig(); + char *sect = emu_makeRomId(); // try new .cfg way if (config_slot != 0) sprintf(cfg, "game.%i.cfg", config_slot); else strcpy(cfg, "game.cfg"); - ret = config_readsect(cfg, emu_makeRomId()); + + ret = -1; + if (config_havesect(cfg, sect)) + { + // read user's config + int vol = currentConfig.volume; + emu_setDefaultConfig(); + ret = config_readsect(cfg, sect); + currentConfig.volume = vol; // make vol global (bah) + } + else + { + // read global config, and apply game_def.cfg on top + make_config_cfg(cfg); + config_readsect(cfg, NULL); + ret = config_readsect("game_def.cfg", sect); + } if (ret != 0) { - // fall back to old + // fall back to old game specific cfg char extbuf[16]; if (config_slot != 0) sprintf(extbuf, ".%i.pbcfg", config_slot); @@ -532,7 +546,9 @@ int emu_ReadConfig(int game, int no_defaults) f = fopen(cfg, "rb"); } if (f) { - int bread = fread(¤tConfig, 1, sizeof(currentConfig), f); + int bread; + fseek(f, 512, SEEK_SET); // skip unused lrom buffer + bread = fread(¤tConfig, 1, sizeof(currentConfig), f); lprintf("emu_ReadConfig: %s %s\n", cfg, bread > 0 ? "(ok)" : "(failed)"); fclose(f); ret = 0; @@ -543,12 +559,12 @@ int emu_ReadConfig(int game, int no_defaults) PsndRate = currentConfig.s_PsndRate; PicoRegionOverride = currentConfig.s_PicoRegion; PicoAutoRgnOrder = currentConfig.s_PicoAutoRgnOrder; - PicoCDBuffers = currentConfig.s_PicoCDBuffers; + // PicoCDBuffers = currentConfig.s_PicoCDBuffers; // ignore in this case } } else { - lprintf("loaded cf from game sect\n"); + lprintf("loaded cfg from sect \"%s\"\n", sect); } } @@ -593,10 +609,12 @@ int emu_WriteConfig(int is_game) sprintf(cfg, "game.%i.cfg", config_slot); else strcpy(cfg, "game.cfg"); game_sect = emu_makeRomId(); + lprintf("emu_WriteConfig: sect \"%s\"\n", game_sect); } lprintf("emu_WriteConfig: %s ", cfg); ret = config_writesect(cfg, game_sect); + if (write_lrom) config_writelrom(cfg); #ifndef NO_SYNC sync(); #endif @@ -654,6 +672,47 @@ void emu_textOut16(int x, int y, const char *text) } } +void emu_findKeyBindCombos(void) +{ + int act, u; + + // find out which keys and actions are combos + kb_combo_keys = kb_combo_acts = 0; + for (act = 0; act < 32; act++) + { + int keyc = 0, keyc2 = 0; + if (act == 16 || act == 17) continue; // player2 flag + if (act > 17) + { + for (u = 0; u < 32; u++) + if (currentConfig.KeyBinds[u] & (1 << act)) keyc++; + } + else + { + for (u = 0; u < 32; u++) + if ((currentConfig.KeyBinds[u] & 0x30000) == 0 && // pl. 1 + (currentConfig.KeyBinds[u] & (1 << act))) keyc++; + for (u = 0; u < 32; u++) + if ((currentConfig.KeyBinds[u] & 0x30000) == 1 && // pl. 2 + (currentConfig.KeyBinds[u] & (1 << act))) keyc2++; + if (keyc2 > keyc) keyc = keyc2; + } + if (keyc > 1) + { + // loop again and mark those keys and actions as combo + for (u = 0; u < 32; u++) + { + if (currentConfig.KeyBinds[u] & (1 << act)) { + kb_combo_keys |= 1 << u; + kb_combo_acts |= 1 << act; + } + } + } + } + + // printf("combo keys/acts: %08x %08x\n", kb_combo_keys, kb_combo_acts); +} + void emu_updateMovie(void) { @@ -879,3 +938,4 @@ int emu_SaveLoadGame(int load, int sram) return ret; } } +