X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=psp%2Fmenu.c;h=15c01c90188919ebf06703cf78a5fd90e953fcd7;hb=0ae25549b5066ea8b42216ec875f5c3c5d5bd8d6;hp=86628ca08338a8d22977324b93f929802c42f097;hpb=60a10527f24efc63bdca6815914a240d706236db;p=libpicofe.git diff --git a/psp/menu.c b/psp/menu.c index 86628ca..15c01c9 100644 --- a/psp/menu.c +++ b/psp/menu.c @@ -1,4 +1,4 @@ -// (c) Copyright 2006,2007 notaz, All rights reserved. +// (c) Copyright 2007 notaz, All rights reserved. // Free for non-commercial use. // For commercial use, separate licencing terms must be obtained. @@ -153,8 +153,8 @@ void menu_romload_prepare(const char *rom_name) while (p > rom_name && *p != '/') p--; psp_video_switch_to_single(); - if (rom_data) menu_draw_begin(); - else memset32(psp_screen, 0, 512*272*2/4); + if (rom_loaded) menu_draw_begin(); + else memset32_uncached(psp_screen, 0, 512*272*2/4); smalltext_out16(1, 1, "Loading", 0xffff); smalltext_out16_lim(1, 10, p, 0xffff, 80); @@ -185,7 +185,7 @@ struct my_dirent static unsigned short file2color(const char *fname) { const char *ext = fname + strlen(fname) - 3; - static const char *rom_exts[] = { "zip", "bin", "smd", "gen", "iso" }; + static const char *rom_exts[] = { "zip", "bin", "smd", "gen", "iso", "cso" }; static const char *other_exts[] = { "gmv", "pat" }; int i; @@ -206,7 +206,7 @@ static void draw_dirlist(char *curdir, struct my_dirent **namelist, int n, int s menu_draw_begin(); - if (rom_data == NULL) { + if (!rom_loaded) { // menu_darken_bg(menu_screen, menu_screen, 321*240, 0); } @@ -335,13 +335,14 @@ end: } +static SceIoStat cpstat; + static char *romsel_loop(char *curr_path) { struct my_dirent **namelist; int n, iret, sel = 0; unsigned long inp = 0; char *ret = NULL, *fname = NULL; - SceIoStat cpstat; // is this a dir or a full path? memset(&cpstat, 0, sizeof(cpstat)); @@ -349,8 +350,11 @@ static char *romsel_loop(char *curr_path) if (iret >= 0 && (cpstat.st_attr & FIO_SO_IFREG)) { // file char *p; for (p = curr_path + strlen(curr_path) - 1; p > curr_path && *p != '/'; p--); - *p = 0; - fname = p+1; + if (p > curr_path) { + *p = 0; + fname = p+1; + } + else strcpy(curr_path, "ms0:/"); } else if (iret >= 0 && (cpstat.st_attr & FIO_SO_IFDIR)); // dir else strcpy(curr_path, "ms0:/"); // something else @@ -402,7 +406,7 @@ static char *romsel_loop(char *curr_path) p = start + strlen(start) - 1; while (*p == '/' && p > start) p--; while (*p != '/' && *p != ':' && p > start) p--; - if (p <= start || *p == ':' || p[-1] == ':') strcpy(newdir, "ms0:/"); + if (p <= start || *p == ':') strcpy(newdir, "ms0:/"); else { strncpy(newdir, start, p-start); newdir[p-start] = 0; } } else { strcpy(newdir, curr_path); @@ -453,8 +457,10 @@ static void draw_debug(void) static void debug_menu_loop(void) { + int ret = 0; draw_debug(); - wait_for_input(BTN_X|BTN_CIRCLE, 0); + while (!(ret & (BTN_X|BTN_CIRCLE))) + ret = wait_for_input(BTN_X|BTN_CIRCLE, 0); } // ------------ patch/gg menu ------------ @@ -830,7 +836,7 @@ static void kc_sel_loop(void) case 1: key_config_loop(ctrl_actions, is_6button ? 12 : 8, 1); return; case 2: key_config_loop(emuctrl_actions, sizeof(emuctrl_actions)/sizeof(emuctrl_actions[0]), -1); return; - case 3: if (rom_data == NULL) emu_WriteConfig(0); return; + case 3: if (!rom_loaded) emu_WriteConfig(0); return; default: return; } } @@ -939,7 +945,7 @@ static void cd_menu_loop_options(void) for (;;) { draw_cd_menu_options(menu_sel, &bios_names); - inp = wait_for_input(BTN_UP|BTN_DOWN|BTN_LEFT|BTN_RIGHT|BTN_X|BTN_CIRCLE, 0); + inp = wait_for_input(BTN_UP|BTN_DOWN|BTN_LEFT|BTN_RIGHT|BTN_X|BTN_CIRCLE|BTN_START, 0); if (inp & BTN_UP ) { menu_sel--; if (menu_sel < 0) menu_sel = menu_sel_max; } if (inp & BTN_DOWN) { menu_sel++; if (menu_sel > menu_sel_max) menu_sel = 0; } selected_id = me_index2id(cdopt_entries, CDOPT_ENTRY_COUNT, menu_sel); @@ -956,11 +962,12 @@ static void cd_menu_loop_options(void) } } } - if (inp & BTN_CIRCLE) { // toggleable options + if (inp & BTN_CIRCLE) // toggleable options if (!me_process(cdopt_entries, CDOPT_ENTRY_COUNT, selected_id, 1) && selected_id == MA_CDOPT_DONE) { return; } + if (inp & BTN_START) { switch (selected_id) { // BIOS testers case MA_CDOPT_TESTBIOS_USA: if (emu_findBios(4, &bios)) { // test US @@ -998,9 +1005,11 @@ menu_entry opt3_entries[] = { NULL, MB_NONE, MA_OPT3_SCALE, NULL, 0, 0, 0, 1 }, { NULL, MB_NONE, MA_OPT3_HSCALE32, NULL, 0, 0, 0, 1 }, { NULL, MB_NONE, MA_OPT3_HSCALE40, NULL, 0, 0, 0, 1 }, - { NULL, MB_ONOFF, MA_OPT3_FILTERING, ¤tConfig.scaling, 1, 0, 0, 1 }, + { NULL, MB_ONOFF, MA_OPT3_FILTERING, ¤tConfig.scaling, 1, 0, 0, 1 }, + { NULL, MB_RANGE, MA_OPT3_GAMMAA, ¤tConfig.gamma, 0, -4, 16, 1 }, { NULL, MB_NONE, MA_OPT3_VSYNC, NULL, 0, 0, 0, 1 }, { "Set to unscaled centered", MB_NONE, MA_OPT3_PRES_NOSCALE, NULL, 0, 0, 0, 1 }, + { "Set to 4:3 scaled", MB_NONE, MA_OPT3_PRES_SCALE43, NULL, 0, 0, 0, 1 }, { "Set to fullscreen", MB_NONE, MA_OPT3_PRES_FULLSCR, NULL, 0, 0, 0, 1 }, { "done", MB_NONE, MA_OPT3_DONE, NULL, 0, 0, 0, 1 }, }; @@ -1024,6 +1033,9 @@ static void menu_opt3_cust_draw(const menu_entry *entry, int x, int y, void *par case MA_OPT3_FILTERING: text_out16(x, y, "Bilinear filtering %s", currentConfig.scaling?"ON":"OFF"); break; + case MA_OPT3_GAMMAA: + text_out16(x, y, "Gamma adjustment %2i", currentConfig.gamma); + break; case MA_OPT3_VSYNC: { char *val = " never"; if (currentConfig.EmuOpt & 0x2000) @@ -1039,7 +1051,7 @@ static void menu_opt3_preview(int is_32col) { void *oldstate = NULL; - if (rom_data == NULL || ((Pico.video.reg[12]&1)^1) != is_32col) + if (!rom_loaded || ((Pico.video.reg[12]&1)^1) != is_32col) { extern char bgdatac32_start[], bgdatac40_start[]; extern int bgdatac32_size, bgdatac40_size; @@ -1049,7 +1061,7 @@ static void menu_opt3_preview(int is_32col) ret = uncompress((Bytef *)bg_buffer, &outsize, bgdata, insize); if (ret == 0) { - if (rom_data != NULL) oldstate = get_oldstate_for_preview(); + if (rom_loaded) oldstate = get_oldstate_for_preview(); memcpy(Pico.vram, bg_buffer, sizeof(Pico.vram)); memcpy(Pico.cram, (char *)bg_buffer + 0x10000, 0x40*2); memcpy(Pico.vsram, (char *)bg_buffer + 0x10080, 0x40*2); @@ -1059,7 +1071,7 @@ static void menu_opt3_preview(int is_32col) lprintf("uncompress returned %i\n", ret); } - memset32(psp_screen, 0, 512*272*2/4); + memset32_uncached(psp_screen, 0, 512*272*2/4); emu_forcedFrame(); menu_prepare_bg(1, 0); @@ -1104,10 +1116,11 @@ static void dispmenu_loop_options(void) int tmp; me_process(opt3_entries, OPT3_ENTRY_COUNT, selected_id, (inp&BTN_RIGHT) ? 1 : 0); switch (selected_id) { - case MA_OPT3_SCALE: setting = ¤tConfig.scale; break; - case MA_OPT3_HSCALE40: setting = ¤tConfig.hscale40; is_32col = 0; break; - case MA_OPT3_HSCALE32: setting = ¤tConfig.hscale32; is_32col = 1; break; - case MA_OPT3_FILTERING:menu_opt3_preview(is_32col); break; + case MA_OPT3_SCALE: setting = ¤tConfig.scale; break; + case MA_OPT3_HSCALE40: setting = ¤tConfig.hscale40; is_32col = 0; break; + case MA_OPT3_HSCALE32: setting = ¤tConfig.hscale32; is_32col = 1; break; + case MA_OPT3_FILTERING: + case MA_OPT3_GAMMAA: menu_opt3_preview(is_32col); break; case MA_OPT3_VSYNC: tmp = ((currentConfig.EmuOpt>>13)&1) | ((currentConfig.EmuOpt>>15)&2); tmp = (inp & BTN_LEFT) ? (tmp>>1) : ((tmp<<1)|1); if (tmp > 3) tmp = 3; @@ -1119,6 +1132,7 @@ static void dispmenu_loop_options(void) if (setting != NULL) { while ((inp = psp_pad_read(0)) & (BTN_LEFT|BTN_RIGHT)) { *setting += (inp & BTN_LEFT) ? -0.01 : 0.01; + if (*setting <= 0) *setting = 0.01; menu_opt3_preview(is_32col); draw_dispmenu_options(menu_sel); // will wait vsync } @@ -1133,6 +1147,12 @@ static void dispmenu_loop_options(void) currentConfig.scale = currentConfig.hscale40 = currentConfig.hscale32 = 1.0; menu_opt3_preview(is_32col); break; + case MA_OPT3_PRES_SCALE43: + currentConfig.scale = 1.20; + currentConfig.hscale40 = 1.00; + currentConfig.hscale32 = 1.25; + menu_opt3_preview(is_32col); + break; case MA_OPT3_PRES_FULLSCR: currentConfig.scale = 1.20; currentConfig.hscale40 = 1.25; @@ -1154,13 +1174,14 @@ static void dispmenu_loop_options(void) menu_entry opt2_entries[] = { - { "Emulate Z80", MB_ONOFF, MA_OPT2_ENABLE_Z80, ¤tConfig.PicoOpt,0x00004, 0, 0, 1 }, - { "Emulate YM2612 (FM)", MB_ONOFF, MA_OPT2_ENABLE_YM2612, ¤tConfig.PicoOpt,0x00001, 0, 0, 1 }, - { "Emulate SN76496 (PSG)", MB_ONOFF, MA_OPT2_ENABLE_SN76496,¤tConfig.PicoOpt,0x00002, 0, 0, 1 }, - { "gzip savestates", MB_ONOFF, MA_OPT2_GZIP_STATES, ¤tConfig.EmuOpt, 0x00008, 0, 0, 1 }, - { "Don't save last used ROM", MB_ONOFF, MA_OPT2_NO_LAST_ROM, ¤tConfig.EmuOpt, 0x00020, 0, 0, 1 }, - { "Status line in main menu", MB_ONOFF, MA_OPT2_STATUS_LINE, ¤tConfig.EmuOpt, 0x20000, 0, 0, 1 }, - { "done", MB_NONE, MA_OPT2_DONE, NULL, 0, 0, 0, 1 }, + { "Emulate Z80", MB_ONOFF, MA_OPT2_ENABLE_Z80, ¤tConfig.PicoOpt,0x00004, 0, 0, 1 }, + { "Emulate YM2612 (FM)", MB_ONOFF, MA_OPT2_ENABLE_YM2612, ¤tConfig.PicoOpt,0x00001, 0, 0, 1 }, + { "Emulate SN76496 (PSG)", MB_ONOFF, MA_OPT2_ENABLE_SN76496, ¤tConfig.PicoOpt,0x00002, 0, 0, 1 }, + { "gzip savestates", MB_ONOFF, MA_OPT2_GZIP_STATES, ¤tConfig.EmuOpt, 0x00008, 0, 0, 1 }, + { "Don't save last used ROM", MB_ONOFF, MA_OPT2_NO_LAST_ROM, ¤tConfig.EmuOpt, 0x00020, 0, 0, 1 }, + { "Status line in main menu", MB_ONOFF, MA_OPT2_STATUS_LINE, ¤tConfig.EmuOpt, 0x20000, 0, 0, 1 }, + { "Disable frame limitter", MB_ONOFF, MA_OPT2_NO_FRAME_LIMIT, ¤tConfig.EmuOpt, 0x40000, 0, 0, 1 }, + { "done", MB_NONE, MA_OPT2_DONE, NULL, 0, 0, 0, 1 }, }; #define OPT2_ENTRY_COUNT (sizeof(opt2_entries) / sizeof(opt2_entries[0])) @@ -1240,29 +1261,6 @@ menu_entry opt_entries[] = #define OPT_ENTRY_COUNT (sizeof(opt_entries) / sizeof(opt_entries[0])) -static const char *region_name(unsigned int code) -{ - static const char *names[] = { "Auto", " Japan NTSC", " Japan PAL", " USA", " Europe" }; - static const char *names_short[] = { "", " JP", " JP", " US", " EU" }; - int u, i = 0; - if (code) { - code <<= 1; - while((code >>= 1)) i++; - if (i > 4) return "unknown"; - return names[i]; - } else { - static char name[24]; - strcpy(name, "Auto:"); - for (u = 0; u < 3; u++) { - i = 0; code = ((PicoAutoRgnOrder >> u*4) & 0xf) << 1; - while((code >>= 1)) i++; - strcat(name, names_short[i]); - } - return name; - } -} - - static void menu_opt_cust_draw(const menu_entry *entry, int x, int y, void *param) { char *str, str24[24]; @@ -1289,7 +1287,7 @@ static void menu_opt_cust_draw(const menu_entry *entry, int x, int y, void *para text_out16(x, y, "Sound Quality: %5iHz %s", currentConfig.PsndRate, str); break; case MA_OPT_REGION: - text_out16(x, y, "Region: %s", region_name(currentConfig.PicoRegion)); + text_out16(x, y, "Region: %s", me_region_name(PicoRegionOverride, PicoAutoRgnOrder)); break; case MA_OPT_CONFIRM_STATES: switch ((currentConfig.EmuOpt >> 9) & 5) { @@ -1350,21 +1348,21 @@ static void region_prevnext(int right) static int rgn_orders[] = { 0x148, 0x184, 0x814, 0x418, 0x841, 0x481 }; int i; if (right) { - if (!currentConfig.PicoRegion) { + if (!PicoRegionOverride) { for (i = 0; i < 6; i++) if (rgn_orders[i] == PicoAutoRgnOrder) break; if (i < 5) PicoAutoRgnOrder = rgn_orders[i+1]; - else currentConfig.PicoRegion=1; + else PicoRegionOverride=1; } - else currentConfig.PicoRegion<<=1; - if (currentConfig.PicoRegion > 8) currentConfig.PicoRegion = 8; + else PicoRegionOverride<<=1; + if (PicoRegionOverride > 8) PicoRegionOverride = 8; } else { - if (!currentConfig.PicoRegion) { + if (!PicoRegionOverride) { for (i = 0; i < 6; i++) if (rgn_orders[i] == PicoAutoRgnOrder) break; if (i > 0) PicoAutoRgnOrder = rgn_orders[i-1]; } - else currentConfig.PicoRegion>>=1; + else PicoRegionOverride>>=1; } } @@ -1372,7 +1370,10 @@ static void menu_options_save(void) { PicoOpt = currentConfig.PicoOpt; PsndRate = currentConfig.PsndRate; - PicoRegionOverride = currentConfig.PicoRegion; + if (PicoRegionOverride) { + // force setting possibly changed.. + Pico.m.pal = (PicoRegionOverride == 2 || PicoRegionOverride == 8) ? 1 : 0; + } if (!(PicoOpt & 0x20)) { // unbind XYZ MODE, just in case unbind_action(0xf00); @@ -1388,9 +1389,8 @@ static int menu_loop_options(void) currentConfig.PicoOpt = PicoOpt; currentConfig.PsndRate = PsndRate; - currentConfig.PicoRegion = PicoRegionOverride; - me_enable(opt_entries, OPT_ENTRY_COUNT, MA_OPT_SAVECFG_GAME, rom_data != NULL); + me_enable(opt_entries, OPT_ENTRY_COUNT, MA_OPT_SAVECFG_GAME, rom_loaded); me_enable(opt_entries, OPT_ENTRY_COUNT, MA_OPT_LOADCFG, config_slot != config_slot_current); menu_sel_max = me_count_enabled(opt_entries, OPT_ENTRY_COUNT) - 1; if (menu_sel > menu_sel_max) menu_sel = menu_sel_max; @@ -1577,10 +1577,10 @@ static void menu_loop_root(void) int ret, menu_sel_max; unsigned long inp = 0; - me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_RESUME_GAME, rom_data != NULL); - me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_SAVE_STATE, rom_data != NULL); - me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_LOAD_STATE, rom_data != NULL); - me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_RESET_GAME, rom_data != NULL); + me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_RESUME_GAME, rom_loaded); + me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_SAVE_STATE, rom_loaded); + me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_LOAD_STATE, rom_loaded); + me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_RESET_GAME, rom_loaded); me_enable(main_entries, MAIN_ENTRY_COUNT, MA_MAIN_PATCHES, PicoPatches != NULL); menu_sel_max = me_count_enabled(main_entries, MAIN_ENTRY_COUNT) - 1; @@ -1607,7 +1607,7 @@ static void menu_loop_root(void) if(inp & BTN_DOWN) { menu_sel++; if (menu_sel > menu_sel_max) menu_sel = 0; } if((inp & (BTN_L|BTN_R)) == (BTN_L|BTN_R)) debug_menu_loop(); if( inp & (BTN_SELECT|BTN_X)) { - if (rom_data) { + if (rom_loaded) { while (psp_pad_read(1) & (BTN_SELECT|BTN_X)) psp_msleep(50); // wait until released engineState = PGS_Running; break; @@ -1618,14 +1618,14 @@ static void menu_loop_root(void) switch (me_index2id(main_entries, MAIN_ENTRY_COUNT, menu_sel)) { case MA_MAIN_RESUME_GAME: - if (rom_data) { + if (rom_loaded) { while (psp_pad_read(1) & BTN_CIRCLE) psp_msleep(50); engineState = PGS_Running; return; } break; case MA_MAIN_SAVE_STATE: - if (rom_data) { + if (rom_loaded) { if(savestate_menu_loop(0)) continue; engineState = PGS_Running; @@ -1633,7 +1633,7 @@ static void menu_loop_root(void) } break; case MA_MAIN_LOAD_STATE: - if (rom_data) { + if (rom_loaded) { if(savestate_menu_loop(1)) continue; engineState = PGS_Running; @@ -1641,7 +1641,7 @@ static void menu_loop_root(void) } break; case MA_MAIN_RESET_GAME: - if (rom_data) { + if (rom_loaded) { emu_ResetGame(); engineState = PGS_Running; return; @@ -1686,7 +1686,7 @@ static void menu_loop_root(void) engineState = PGS_Quit; return; case MA_MAIN_PATCHES: - if (rom_data && PicoPatches) { + if (rom_loaded && PicoPatches) { patches_menu_loop(); PicoPatchApply(); strcpy(menuErrorMsg, "Patches applied"); @@ -1735,12 +1735,12 @@ static void menu_prepare_bg(int use_game_bg, int use_fg) int i; for (i = 272; i > 0; i--, dst += 480, src += 512) menu_darken_bg(dst, src, 480, 1); - //memset32((int *)(bg_buffer + 480*264), 0, 480*8*2/4); + //memset32_uncached((int *)(bg_buffer + 480*264), 0, 480*8*2/4); } else { // should really only happen once, on startup.. - memset32((int *)(void *)bg_buffer, 0, sizeof(bg_buffer)/4); + memset32_uncached((int *)(void *)bg_buffer, 0, sizeof(bg_buffer)/4); readpng(bg_buffer, "skin/background.png", READPNG_BG); } sceKernelDcacheWritebackAll(); @@ -1748,7 +1748,7 @@ static void menu_prepare_bg(int use_game_bg, int use_fg) static void menu_gfx_prepare(void) { - menu_prepare_bg(rom_data != NULL, 1); + menu_prepare_bg(rom_loaded, 1); menu_draw_begin(); menu_draw_end(); @@ -1814,7 +1814,7 @@ int menu_loop_tray(void) for (;;) { draw_menu_tray(menu_sel); - inp = wait_for_input(BTN_UP|BTN_DOWN|BTN_X, 0); + inp = wait_for_input(BTN_UP|BTN_DOWN|BTN_CIRCLE, 0); if(inp & BTN_UP ) { menu_sel--; if (menu_sel < 0) menu_sel = menu_sel_max; } if(inp & BTN_DOWN) { menu_sel++; if (menu_sel > menu_sel_max) menu_sel = 0; } if(inp & BTN_CIRCLE) {