X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=common%2Femu.c;h=02640bbbe4fce6e9945b13c3dd63844d7c1b7c08;hb=8e708f920ffd20b026aed616e58c8c8e94c8fb8d;hp=b7832bbb2302bbca1390751bf44783c961bca285;hpb=144a28a0684881e9bf431ec7785efd30e6de64c3;p=libpicofe.git diff --git a/common/emu.c b/common/emu.c index b7832bb..02640bb 100644 --- a/common/emu.c +++ b/common/emu.c @@ -14,6 +14,7 @@ #include "menu.h" #include "fonts.h" #include "lprintf.h" +#include "config.h" #include #include @@ -33,12 +34,14 @@ #define SCREEN_BUFFER psp_screen #endif -char *PicoConfigFile = "picoconfig.bin"; -currentConfig_t currentConfig; +char *PicoConfigFile = "config.cfg"; +currentConfig_t currentConfig, defaultConfig; 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; @@ -138,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; @@ -149,6 +153,9 @@ static int emu_isBios(const char *name) if (strstr(name, biosfiles_jp[i]) != NULL) return 1; return 0; } +*/ + +static unsigned char id_header[0x100]; /* checks if romFileName points to valid MegaCD image * if so, checks for suitable BIOS */ @@ -173,6 +180,9 @@ int emu_cdCheck(int *pregion) return 0; } + pm_seek(cd_f, (type == 1) ? 0x100 : 0x110, SEEK_SET); + 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); pm_read(buf, 1, cd_f); @@ -189,6 +199,59 @@ int emu_cdCheck(int *pregion) return type; } +static int extract_text(char *dest, unsigned char *src, int len, int swab) +{ + char *p = dest; + int i; + + if (swab) swab = 1; + + for (i = len - 1; i >= 0; i--) + { + if (src[i^swab] != ' ') break; + } + len = i + 1; + + for (i = 0; i < len; i++) + { + unsigned char s = src[i^swab]; + if (s >= 0x20 && s < 0x7f && s != '#' && s != '|' && + s != '[' && s != ']' && s != '\\') + { + *p++ = s; + } + else + { + sprintf(p, "\\%02x", s); + p += 3; + } + } + + return p - dest; +} + +char *emu_makeRomId(void) +{ + static char id_string[3+0x11+0x11+0x30+16]; + int pos, swab = 1; + + if (PicoMCD & 1) { + strcpy(id_string, "CD|"); + swab = 0; + } + else strcpy(id_string, "MD|"); + pos = 3; + + 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, swab); // region + id_string[pos] = '|'; pos++; + pos += extract_text(id_string + pos, id_header + 0x50, 0x30, swab); // overseas name + id_string[pos] = 0; + + return id_string; +} + int emu_ReloadRom(void) { unsigned int rom_size = 0; @@ -268,6 +331,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 @@ -281,10 +345,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 @@ -323,6 +387,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); @@ -350,13 +416,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(); @@ -395,6 +454,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; } @@ -421,49 +482,75 @@ static void romfname_ext(char *dst, const char *prefix, const char *ext) int emu_ReadConfig(int game, int no_defaults) { + char cfg[512]; FILE *f; - char cfg[512], extbuf[16]; - int bread = 0; + int ret; if (!game) { 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(extbuf, ".%i.pbcfg", config_slot); - strncpy(p, extbuf, 511 - (p - cfg)); + sprintf(p, ".%i.cfg", config_slot); } cfg[511] = 0; - } else { - if (config_slot != 0) - sprintf(extbuf, ".%i.pbcfg", config_slot); - else strcpy(extbuf, ".pbcfg"); - romfname_ext(cfg, "cfg/", extbuf); - f = fopen(cfg, "rb"); - if (!f) romfname_ext(cfg, NULL, ".pbcfg"); - else fclose(f); + ret = config_readsect(cfg, NULL); } + else + { + char *sect = emu_makeRomId(); - lprintf("emu_ReadConfig: %s ", cfg); - f = fopen(cfg, "rb"); - if (f) { - bread = fread(¤tConfig, 1, sizeof(currentConfig), f); - fclose(f); + // try new .cfg way + if (config_slot != 0) + sprintf(cfg, "game.%i.cfg", config_slot); + else strcpy(cfg, "game.cfg"); + + ret = -1; + if (config_havesect(cfg, sect)) { + emu_setDefaultConfig(); + ret = config_readsect(cfg, sect); + } + + if (ret != 0) + { + // fall back to old + char extbuf[16]; + if (config_slot != 0) + sprintf(extbuf, ".%i.pbcfg", config_slot); + else strcpy(extbuf, ".pbcfg"); + romfname_ext(cfg, "cfg/", extbuf); + f = fopen(cfg, "rb"); + if (!f) { + romfname_ext(cfg, NULL, ".pbcfg"); + f = fopen(cfg, "rb"); + } + if (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; + } + + if (ret == 0) { + PicoOpt = currentConfig.s_PicoOpt; + PsndRate = currentConfig.s_PsndRate; + PicoRegionOverride = currentConfig.s_PicoRegion; + PicoAutoRgnOrder = currentConfig.s_PicoAutoRgnOrder; + PicoCDBuffers = currentConfig.s_PicoCDBuffers; + } + } + else + { + lprintf("loaded cfg from sect \"%s\"\n", sect); + } } - lprintf(bread > 0 ? "(ok)\n" : "(failed)\n"); - PicoOpt = currentConfig.PicoOpt; - PsndRate = currentConfig.PsndRate; - PicoRegionOverride = currentConfig.PicoRegion; - PicoAutoRgnOrder = currentConfig.PicoAutoRgnOrder; - PicoCDBuffers = currentConfig.PicoCDBuffers; - //scaling_update(); // some sanity checks if (currentConfig.CPUclock < 10 || currentConfig.CPUclock > 4096) currentConfig.CPUclock = 200; #ifdef PSP @@ -479,54 +566,45 @@ int emu_ReadConfig(int game, int no_defaults) currentConfig.KeyBinds[22] = 1<<30; // vol down } #endif - if (bread > 0) config_slot_current = config_slot; - return (bread > 0); // == sizeof(currentConfig)); + if (ret == 0) config_slot_current = config_slot; + return (ret == 0); } -int emu_WriteConfig(int game) +int emu_WriteConfig(int is_game) { - FILE *f; - char cfg[512], extbuf[16]; - int bwrite = 0; + char cfg[512], *game_sect = NULL; + int ret, write_lrom = 0; - if (!game) + if (!is_game) { strncpy(cfg, PicoConfigFile, 511); if (config_slot != 0) { char *p = strrchr(cfg, '.'); if (p == NULL) p = cfg + strlen(cfg); - sprintf(extbuf, ".%i.pbcfg", config_slot); - strncpy(p, extbuf, 511 - (p - cfg)); + sprintf(p, ".%i.cfg", config_slot); } cfg[511] = 0; + write_lrom = 1; } else { if (config_slot != 0) - sprintf(extbuf, ".%i.pbcfg", config_slot); - else strcpy(extbuf, ".pbcfg"); - romfname_ext(cfg, "cfg/", extbuf); + 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); - f = fopen(cfg, "wb"); - if (f) { - currentConfig.PicoOpt = PicoOpt; - currentConfig.PsndRate = PsndRate; - currentConfig.PicoRegion = PicoRegionOverride; - currentConfig.PicoAutoRgnOrder = PicoAutoRgnOrder; - currentConfig.PicoCDBuffers = PicoCDBuffers; - bwrite = fwrite(¤tConfig, 1, sizeof(currentConfig), f); - fflush(f); - fclose(f); + ret = config_writesect(cfg, game_sect); + if (write_lrom) config_writelrom(cfg); #ifndef NO_SYNC - sync(); + sync(); #endif - } - lprintf((bwrite == sizeof(currentConfig)) ? "(ok)\n" : "(failed)\n"); + lprintf((ret == 0) ? "(ok)\n" : "(failed)\n"); - if (bwrite == sizeof(currentConfig)) config_slot_current = config_slot; - return (bwrite == sizeof(currentConfig)); + if (ret == 0) config_slot_current = config_slot; + return ret == 0; } @@ -577,6 +655,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) { @@ -802,3 +921,4 @@ int emu_SaveLoadGame(int load, int sram) return ret; } } +