X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=psp%2Fmenu.c;h=20c34601f85feabbb12166949ef0ff54b163a6b9;hb=6589c840ca686751d15ebb127367af1378dd7de2;hp=4cb0b4ba6b7e613f9bd57a6981e68c43465518cc;hpb=6850f9ec3b7c97084f1f0567824c65aa56e7fabb;p=libpicofe.git diff --git a/psp/menu.c b/psp/menu.c index 4cb0b4b..20c3460 100644 --- a/psp/menu.c +++ b/psp/menu.c @@ -43,16 +43,16 @@ const char * const keyNames[] = { static unsigned short bg_buffer[480*272] __attribute__((aligned(16))); #define menu_screen psp_screen -static void menu_darken_bg(void *dst, const void *src, int pixels, int darker); +void menu_darken_bg(void *dst, const void *src, int pixels, int darker); static void menu_prepare_bg(int use_game_bg, int use_fg); static unsigned int inp_prev = 0; -static unsigned long wait_for_input(unsigned int interesting, int is_key_config) +unsigned long wait_for_input(unsigned int interesting, int is_key_config) { unsigned int ret; - static int repeats = 0, wait = 6; + static int repeats = 0, wait = 20; int release = 0, count, i; if (!is_key_config) @@ -62,8 +62,6 @@ static unsigned long wait_for_input(unsigned int interesting, int is_key_config) else if (repeats == 4) wait = 2; else if (repeats == 6) wait = 1; - for (i = 0; i < wait && inp_prev == gp2x_joystick_read(1); i++) { - for (i = 0; i < wait && inp_prev == psp_pad_read(1); i++) { if (i == 0) repeats++; psp_msleep(30); @@ -76,12 +74,14 @@ static unsigned long wait_for_input(unsigned int interesting, int is_key_config) if (release || ret != inp_prev) { repeats = 0; - wait = 6; + wait = 20; } inp_prev = ret; if (!is_key_config) ret |= (ret & 0xf0000000) >> 24; // use analog as d-pad + if (wait > 6 && (ret&(BTN_UP|BTN_LEFT|BTN_DOWN|BTN_RIGHT|BTN_L|BTN_R))) + wait = 6; // we don't need diagonals in menus if ((ret&BTN_UP) && (ret&BTN_LEFT)) ret &= ~BTN_LEFT; @@ -92,7 +92,7 @@ static unsigned long wait_for_input(unsigned int interesting, int is_key_config) return ret; } -static void menu_draw_begin(void) +void menu_draw_begin(void) { // short *src = (short *)bg_buffer, *dst = (short *)menu_screen; // int i; @@ -108,7 +108,7 @@ static void menu_draw_begin(void) } -static void menu_draw_end(void) +void menu_draw_end(void) { psp_video_flip(1); } @@ -434,38 +434,6 @@ static char *romsel_loop(char *curr_path) return ret; } -// ------------ debug menu ------------ - -char *debugString(void); - -static void draw_debug(void) -{ - char *p, *str = debugString(); - int len, line; - - menu_draw_begin(); - - p = str; - for (line = 0; line < 24; line++) - { - while (*p && *p != '\n') p++; - len = p - str; - if (len > 55) len = 55; - smalltext_out16_lim(1, line*10, str, 0xffff, len); - if (*p == 0) break; - p++; str = p; - } - menu_draw_end(); -} - -static void debug_menu_loop(void) -{ - int ret = 0; - draw_debug(); - while (!(ret & (BTN_X|BTN_CIRCLE))) - ret = wait_for_input(BTN_X|BTN_CIRCLE, 0); -} - // ------------ patch/gg menu ------------ static void draw_patchlist(int sel) @@ -590,7 +558,7 @@ static void draw_savestate_bg(int slot) areaClose(file); } - emu_forcedFrame(); + emu_forcedFrame(0); menu_prepare_bg(1, 0); restore_oldstate(oldstate); @@ -704,14 +672,14 @@ static int count_bound_keys(int action, int pl_idx) static void draw_key_config(const me_bind_action *opts, int opt_cnt, int player_idx, int sel) { - int x, y, tl_y = 16+40, i; + int x, y, tl_y = 16+20, i; menu_draw_begin(); if (player_idx >= 0) { - text_out16(80+80, 16+20, "Player %i controls", player_idx + 1); + text_out16(80+80, 16, "Player %i controls", player_idx + 1); x = 80+80; } else { - text_out16(80+80, 16+20, "Emulator controls"); + text_out16(80+80, 16, "Emulator controls"); x = 80+40; } @@ -724,14 +692,14 @@ static void draw_key_config(const me_bind_action *opts, int opt_cnt, int player_ text_out16(x, y, "Done"); if (sel < opt_cnt) { - text_out16(80+30, 220, "Press a button to bind/unbind"); - text_out16(80+30, 230, "Use SELECT to clear"); - text_out16(80+30, 240, "To bind UP/DOWN, hold SELECT"); - text_out16(80+30, 250, "Select \"Done\" to exit"); + text_out16(80+30, 225, "Press a button to bind/unbind"); + text_out16(80+30, 235, "Use SELECT to clear"); + text_out16(80+30, 245, "To bind UP/DOWN, hold SELECT"); + text_out16(80+30, 255, "Select \"Done\" to exit"); } else { - text_out16(80+30, 230, "Use Options -> Save cfg"); - text_out16(80+30, 240, "to save controls"); - text_out16(80+30, 250, "Press X or O to exit"); + text_out16(80+30, 235, "Use Options -> Save cfg"); + text_out16(80+30, 245, "to save controls"); + text_out16(80+30, 255, "Press X or O to exit"); } menu_draw_end(); } @@ -773,6 +741,19 @@ static void key_config_loop(const me_bind_action *opts, int opt_cnt, int player_ } } +menu_entry ctrlopt_entries[] = +{ + { "Player 1", MB_NONE, MA_CTRL_PLAYER1, NULL, 0, 0, 0, 1, 0 }, + { "Player 2", MB_NONE, MA_CTRL_PLAYER2, NULL, 0, 0, 0, 1, 0 }, + { "Emulator controls", MB_NONE, MA_CTRL_EMU, NULL, 0, 0, 0, 1, 0 }, + { "6 button pad", MB_ONOFF, MA_OPT_6BUTTON_PAD, &PicoOpt, 0x020, 0, 0, 1, 1 }, + { "Turbo rate", MB_RANGE, MA_CTRL_TURBO_RATE, ¤tConfig.turbo_rate, 0, 1, 30, 1, 1 }, + { "Done", MB_NONE, MA_CTRL_DONE, NULL, 0, 0, 0, 1, 0 }, +}; + +#define CTRLOPT_ENTRY_COUNT (sizeof(ctrlopt_entries) / sizeof(ctrlopt_entries[0])) +const int ctrlopt_entry_count = CTRLOPT_ENTRY_COUNT; + static void draw_kc_sel(int menu_sel) { int tl_x = 80+25+40, tl_y = 16+60, y; @@ -781,10 +762,7 @@ static void draw_kc_sel(int menu_sel) menu_draw_begin(); menu_draw_selection(tl_x - 16, tl_y + menu_sel*10, 138); - text_out16(tl_x, y, "Player 1"); - text_out16(tl_x, (y+=10), "Player 2"); - text_out16(tl_x, (y+=10), "Emulator controls"); - text_out16(tl_x, (y+=10), "Done"); + me_draw(ctrlopt_entries, ctrlopt_entry_count, tl_x, tl_y, NULL, NULL); menu_draw_end(); } @@ -795,33 +773,41 @@ static void draw_kc_sel(int menu_sel) // "LOAD STATE", "VOLUME UP", "VOLUME DOWN", "DONE" me_bind_action emuctrl_actions[] = { - { "Load State ", 1<<28 }, - { "Save State ", 1<<27 }, - { "Prev Save Slot ", 1<<25 }, - { "Next Save Slot ", 1<<24 }, - { "Switch Renderer", 1<<26 }, - { NULL, 0 } + { "Load State ", 1<<28 }, + { "Save State ", 1<<27 }, + { "Prev Save Slot ", 1<<25 }, + { "Next Save Slot ", 1<<24 }, + { "Switch Renderer ", 1<<26 }, + { "Fast forward ", 1<<22 }, + { "Pico Next page ", 1<<21 }, + { "Pico Prev page ", 1<<20 }, + { "Pico Switch input", 1<<19 }, + { NULL, 0 } }; static void kc_sel_loop(void) { int menu_sel = 3, menu_sel_max = 3; unsigned long inp = 0; - int is_6button = PicoOpt & POPT_6BTN_PAD; + menu_id selected_id; while (1) { draw_kc_sel(menu_sel); - inp = wait_for_input(BTN_UP|BTN_DOWN|BTN_X|BTN_CIRCLE, 0); + inp = wait_for_input(BTN_UP|BTN_DOWN|BTN_LEFT|BTN_RIGHT|BTN_X|BTN_CIRCLE, 0); + selected_id = me_index2id(ctrlopt_entries, CTRLOPT_ENTRY_COUNT, menu_sel); + if (inp & (BTN_LEFT|BTN_RIGHT)) // multi choise + me_process(ctrlopt_entries, CTRLOPT_ENTRY_COUNT, selected_id, (inp&BTN_RIGHT) ? 1 : 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) { - switch (menu_sel) { - case 0: key_config_loop(me_ctrl_actions, is_6button ? 12 : 8, 0); return; - case 1: key_config_loop(me_ctrl_actions, is_6button ? 12 : 8, 1); return; - case 2: key_config_loop(emuctrl_actions, - sizeof(emuctrl_actions)/sizeof(emuctrl_actions[0]) - 1, -1); return; - case 3: if (!rom_loaded) emu_WriteConfig(0); return; + int is_6button = PicoOpt & POPT_6BTN_PAD; + switch (selected_id) { + case MA_CTRL_PLAYER1: key_config_loop(me_ctrl_actions, is_6button ? 15 : 11, 0); return; + case MA_CTRL_PLAYER2: key_config_loop(me_ctrl_actions, is_6button ? 15 : 11, 1); return; + case MA_CTRL_EMU: key_config_loop(emuctrl_actions, + sizeof(emuctrl_actions)/sizeof(emuctrl_actions[0]) - 1, -1); return; + case MA_CTRL_DONE: if (!rom_loaded) emu_WriteConfig(0); return; default: return; } } @@ -1063,7 +1049,7 @@ static void menu_opt3_preview(int is_32col) } memset32_uncached(psp_screen, 0, 512*272*2/4); - emu_forcedFrame(); + emu_forcedFrame(0); menu_prepare_bg(1, 0); if (oldstate) restore_oldstate(oldstate); @@ -1174,7 +1160,7 @@ menu_entry opt2_entries[] = { "gzip savestates", MB_ONOFF, MA_OPT2_GZIP_STATES, ¤tConfig.EmuOpt, 0x00008, 0, 0, 1, 1 }, { "Don't save last used ROM", MB_ONOFF, MA_OPT2_NO_LAST_ROM, ¤tConfig.EmuOpt, 0x00020, 0, 0, 1, 1 }, { "Status line in main menu", MB_ONOFF, MA_OPT2_STATUS_LINE, ¤tConfig.EmuOpt, 0x20000, 0, 0, 1, 1 }, - { "Disable frame limitter", MB_ONOFF, MA_OPT2_NO_FRAME_LIMIT, ¤tConfig.EmuOpt, 0x40000, 0, 0, 1, 1 }, + { "Disable frame limiter", MB_ONOFF, MA_OPT2_NO_FRAME_LIMIT, ¤tConfig.EmuOpt, 0x40000, 0, 0, 1, 1 }, { "done", MB_NONE, MA_OPT2_DONE, NULL, 0, 0, 0, 1, 0 }, }; @@ -1233,13 +1219,11 @@ static void amenu_loop_options(void) menu_entry opt_entries[] = { { NULL, MB_NONE, MA_OPT_RENDERER, NULL, 0, 0, 0, 1, 1 }, - { "Accurate timing (slower)", MB_ONOFF, MA_OPT_ACC_TIMING, &PicoOpt, 0x0040, 0, 0, 1, 1 }, - { "Accurate sprites (slower)", MB_ONOFF, MA_OPT_ACC_SPRITES, &PicoOpt, 0x0080, 0, 0, 1, 1 }, + { "Accurate sprites", MB_ONOFF, MA_OPT_ACC_SPRITES, &PicoOpt, 0x080, 0, 0, 0, 1 }, { "Show FPS", MB_ONOFF, MA_OPT_SHOW_FPS, ¤tConfig.EmuOpt, 0x0002, 0, 0, 1, 1 }, { NULL, MB_RANGE, MA_OPT_FRAMESKIP, ¤tConfig.Frameskip, 0, -1, 16, 1, 1 }, { "Enable sound", MB_ONOFF, MA_OPT_ENABLE_SOUND, ¤tConfig.EmuOpt, 0x0004, 0, 0, 1, 1 }, { NULL, MB_NONE, MA_OPT_SOUND_QUALITY, NULL, 0, 0, 0, 1, 1 }, - { "6 button pad", MB_ONOFF, MA_OPT_6BUTTON_PAD, &PicoOpt, 0x0020, 0, 0, 1, 1 }, { NULL, MB_NONE, MA_OPT_REGION, NULL, 0, 0, 0, 1, 1 }, { "Use SRAM/BRAM savestates", MB_ONOFF, MA_OPT_SRAM_STATES, ¤tConfig.EmuOpt, 0x0001, 0, 0, 1, 1 }, { NULL, MB_NONE, MA_OPT_CONFIRM_STATES,NULL, 0, 0, 0, 1, 1 }, @@ -1510,13 +1494,15 @@ static void draw_menu_credits(void) text_out16(tl_x, (y+=10), "Chui: Fame/C"); text_out16(tl_x, (y+=10), "NJ: CZ80"); text_out16(tl_x, (y+=10), "MAME devs: YM2612 and SN76496 cores"); - text_out16(tl_x, (y+=10), "Stephane Dallongeville:"); - text_out16(tl_x, (y+=10), " Gens code, base of Fame/C, CZ80"); - text_out16(tl_x, (y+=10), "Charles MacDonald: Genesis hw docs"); - text_out16(tl_x, (y+=10), "Haze: Genesis hw info"); text_out16(tl_x, (y+=10), "ps2dev.org people: PSP SDK/code"); text_out16(tl_x, (y+=10), "ketchupgun: skin design"); + text_out16(tl_x, (y+=20), "special thanks (for docs, ideas):"); + text_out16(tl_x, (y+=10), " Charles MacDonald, Haze,"); + text_out16(tl_x, (y+=10), " Stephane Dallongeville,"); + text_out16(tl_x, (y+=10), " Lordus, Exophase, Rokas,"); + text_out16(tl_x, (y+=10), " Nemesis, Tasco Deluxe"); + menu_draw_end(); } @@ -1627,6 +1613,7 @@ static void menu_loop_root(void) if (rom_loaded) { if(savestate_menu_loop(1)) continue; + while (psp_pad_read(1) & BTN_CIRCLE) psp_msleep(50); engineState = PGS_Running; return; } @@ -1634,6 +1621,7 @@ static void menu_loop_root(void) case MA_MAIN_RESET_GAME: if (rom_loaded) { emu_ResetGame(); + while (psp_pad_read(1) & BTN_CIRCLE) psp_msleep(50); engineState = PGS_Running; return; } @@ -1692,8 +1680,7 @@ static void menu_loop_root(void) } } -// warning: alignment -static void menu_darken_bg(void *dst, const void *src, int pixels, int darker) +void menu_darken_bg(void *dst, const void *src, int pixels, int darker) { unsigned int *dest = dst; const unsigned int *srce = src;