X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=platform%2Fcommon%2Fmenu_pico.c;h=90d058ac20d20b36fd3452f68b6c78bdae61c09a;hb=d4d626658a7a999f48009f408b4a22d280ab80ea;hp=da820ea5ddee3896fca87abc35797ef7e149f788;hpb=40a39dd7fd689103e39861daeb81f904f454a7ed;p=picodrive.git diff --git a/platform/common/menu_pico.c b/platform/common/menu_pico.c index da820ea..90d058a 100644 --- a/platform/common/menu_pico.c +++ b/platform/common/menu_pico.c @@ -1,28 +1,58 @@ +/* + * PicoDrive + * (C) notaz, 2010,2011 + * + * This work is licensed under the terms of MAME license. + * See COPYING file in the top-level directory. + */ +#include +#include + #include "emu.h" +#include "menu_pico.h" +#include "input_pico.h" #include -#include #include #include +#ifdef PANDORA +#define MENU_X2 1 +#else +#define MENU_X2 0 +#endif + +// FIXME +#define REVISION "0" + +static const char *rom_exts[] = { + "zip", + "bin", "smd", "gen", + "iso", "cso", "cue", + "32x", + "sms", + NULL +}; + // rrrr rggg gggb bbbb static unsigned short fname2color(const char *fname) { const char *ext = fname + strlen(fname) - 3; - static const char *rom_exts[] = { "zip", "bin", "smd", "gen", "iso", "cso", "cue" }; static const char *other_exts[] = { "gmv", "pat" }; int i; if (ext < fname) ext = fname; - for (i = 0; i < array_size(rom_exts); i++) + for (i = 0; rom_exts[i] != NULL; i++) if (strcasecmp(ext, rom_exts[i]) == 0) return 0xbdff; // FIXME: mk defines for (i = 0; i < array_size(other_exts); i++) if (strcasecmp(ext, other_exts[i]) == 0) return 0xaff5; return 0xffff; } -#include "menu.c" +#include "../libpicofe/menu.c" + +static const char *men_dummy[] = { NULL }; /* platform specific options and handlers */ #if defined(__GP2X__) @@ -35,12 +65,48 @@ static unsigned short fname2color(const char *fname) #define menu_main_plat_draw NULL #endif +static void make_bg(int no_scale) +{ + unsigned short *src = (void *)g_menubg_src_ptr; + int w = g_screen_width, h = g_screen_height; + short *dst; + int x, y; + + if (!no_scale && g_menuscreen_w / w >= 2 && g_menuscreen_h / h >= 2) + { + unsigned int t, *d = g_menubg_ptr; + d += (g_menuscreen_h / 2 - h * 2 / 2) + * g_menuscreen_w / 2; + d += (g_menuscreen_w / 2 - w * 2 / 2) / 2; + for (y = 0; y < h; y++, src += w, d += g_menuscreen_w*2/2) { + for (x = 0; x < w; x++) { + t = src[x]; + t = ((t & 0xf79e)>>1) - ((t & 0xc618)>>3); + t |= t << 16; + d[x] = d[x + g_menuscreen_w / 2] = t; + } + } + return; + } + + if (w > g_menuscreen_w) + w = g_menuscreen_w; + if (h > g_menuscreen_h) + h = g_menuscreen_h; + dst = (short *)g_menubg_ptr + + (g_menuscreen_h / 2 - h / 2) * g_menuscreen_w + + (g_menuscreen_w / 2 - w / 2); + + // darken the active framebuffer + for (; h > 0; dst += g_menuscreen_w, src += g_screen_width, h--) + menu_darken_bg(dst, src, w, 1); +} + static void menu_enter(int is_rom_loaded) { if (is_rom_loaded) { - // darken the active framebuffer - menu_darken_bg(g_menubg_ptr, g_menubg_src_ptr, g_menuscreen_w * g_menuscreen_h, 1); + make_bg(0); } else { @@ -71,7 +137,7 @@ static void draw_savestate_bg(int slot) /* do a frame and fetch menu bg */ pemu_forced_frame(0, 0); - menu_darken_bg(g_menubg_ptr, g_menubg_src_ptr, g_menuscreen_w * g_menuscreen_h, 1); + make_bg(0); PicoTmpStateRestore(tmp_state); } @@ -88,7 +154,7 @@ static void load_progress_cb(int percent) if (len > g_menuscreen_w) len = g_menuscreen_w; - menu_draw_begin(0); + menu_draw_begin(0, 1); dst = (unsigned short *)g_menuscreen_ptr + g_menuscreen_w * me_sfont_h * 2; for (ln = me_sfont_h - 2; ln > 0; ln--, dst += g_menuscreen_w) memset(dst, 0xff, len * 2); @@ -100,7 +166,7 @@ static void cdload_progress_cb(const char *fname, int percent) int ln, len = percent * g_menuscreen_w / 100; unsigned short *dst; - menu_draw_begin(0); + menu_draw_begin(0, 1); dst = (unsigned short *)g_menuscreen_ptr + g_menuscreen_w * me_sfont_h * 2; memset(dst, 0xff, g_menuscreen_w * (me_sfont_h - 2) * 2); @@ -128,7 +194,7 @@ void menu_romload_prepare(const char *rom_name) /* fill all buffers, callbacks won't update in full */ for (i = 0; i < 3; i++) { - menu_draw_begin(1); + menu_draw_begin(1, 1); smalltext_out16(1, 1, "Loading", 0xffff); smalltext_out16(1, me_sfont_h, p, 0xffff); menu_draw_end(); @@ -144,7 +210,7 @@ void menu_romload_end(void) PicoCartLoadProgressCB = NULL; PicoCDLoadProgressCB = NULL; - menu_draw_begin(0); + menu_draw_begin(0, 1); smalltext_out16(1, (cdload_called ? 6 : 3) * me_sfont_h, "Starting emulation...", 0xffff); menu_draw_end(); @@ -159,7 +225,7 @@ static void draw_patchlist(int sel) max_cnt = g_menuscreen_h / me_sfont_h; start = max_cnt / 2 - sel; - menu_draw_begin(1); + menu_draw_begin(1, 0); for (i = 0; i < PicoPatchCount; i++) { pos = start + i; @@ -185,7 +251,8 @@ static void menu_loop_patches(void) for (;;) { draw_patchlist(menu_sel); - inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT|PBTN_L|PBTN_R|PBTN_MOK|PBTN_MBACK, 33); + inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT|PBTN_L|PBTN_R + |PBTN_MOK|PBTN_MBACK, NULL, 33); if (inp & PBTN_UP ) { menu_sel--; if (menu_sel < 0) menu_sel = PicoPatchCount; } if (inp & PBTN_DOWN) { menu_sel++; if (menu_sel > PicoPatchCount) menu_sel = 0; } if (inp &(PBTN_LEFT|PBTN_L)) { menu_sel-=10; if (menu_sel < 0) menu_sel = 0; } @@ -306,7 +373,7 @@ static int menu_loop_keyconfig(int id, int keys) static int sel = 0; me_enable(e_menu_keyconfig, MA_OPT_SAVECFG_GAME, rom_loaded); - me_loop(e_menu_keyconfig, &sel, NULL); + me_loop(e_menu_keyconfig, &sel); return 0; } @@ -362,7 +429,7 @@ static menu_entry e_menu_cd_options[] = static int menu_loop_cd_options(int id, int keys) { static int sel = 0; - me_loop(e_menu_cd_options, &sel, NULL); + me_loop(e_menu_cd_options, &sel); return 0; } @@ -399,8 +466,8 @@ static const char *mgn_opt_sh2cycles(int id, int *offs) static const char h_32x_enable[] = "Enable emulation of the 32X addon"; static const char h_pwm[] = "Disabling may improve performance, but break sound"; static const char h_sh2cycles[] = "Cycles/millisecond (similar to DOSBox)\n" - "lower values speed up emulation but break games\n" - "at least 11000 recommended for compatibility"; + "lower values speed up emulation but break games\n" + "at least 11000 recommended for compatibility"; static menu_entry e_menu_32x_options[] = { @@ -417,7 +484,7 @@ static int menu_loop_32x_options(int id, int keys) static int sel = 0; me_enable(e_menu_32x_options, MA_32XOPT_RENDERER, renderer_names32x[0] != NULL); - me_loop(e_menu_32x_options, &sel, NULL); + me_loop(e_menu_32x_options, &sel); return 0; } @@ -444,15 +511,20 @@ static menu_entry e_menu_adv_options[] = static int menu_loop_adv_options(int id, int keys) { static int sel = 0; - me_loop(e_menu_adv_options, &sel, NULL); + me_loop(e_menu_adv_options, &sel); return 0; } // ------------ gfx options menu ------------ +static const char h_gamma[] = "Gamma/brightness adjustment (default 100)"; + static menu_entry e_menu_gfx_options[] = { - mee_enum("Renderer", MA_OPT_RENDERER, currentConfig.renderer, renderer_names), + mee_enum ("Video output mode", MA_OPT_VOUT_MODE, plat_target.vout_method, men_dummy), + mee_enum ("Renderer", MA_OPT_RENDERER, currentConfig.renderer, renderer_names), + mee_enum ("Filter", MA_OPT3_FILTERING, currentConfig.filter, men_dummy), + mee_range_h("Gamma adjustment", MA_OPT3_GAMMA, currentConfig.gamma, 1, 200, h_gamma), MENU_OPTIONS_GFX mee_end, }; @@ -462,7 +534,7 @@ static int menu_loop_gfx_options(int id, int keys) static int sel = 0; me_enable(e_menu_gfx_options, MA_OPT_RENDERER, renderer_names[0] != NULL); - me_loop(e_menu_gfx_options, &sel, NULL); + me_loop(e_menu_gfx_options, &sel); return 0; } @@ -556,15 +628,15 @@ static int mh_saveloadcfg(int id, int keys) case MA_OPT_SAVECFG: case MA_OPT_SAVECFG_GAME: if (emu_write_config(id == MA_OPT_SAVECFG_GAME ? 1 : 0)) - me_update_msg("config saved"); + menu_update_msg("config saved"); else - me_update_msg("failed to write config"); + menu_update_msg("failed to write config"); break; case MA_OPT_LOADCFG: ret = emu_read_config(rom_fname_loaded, 1); if (!ret) ret = emu_read_config(NULL, 1); - if (ret) me_update_msg("config loaded"); - else me_update_msg("failed to load config"); + if (ret) menu_update_msg("config loaded"); + else menu_update_msg("failed to load config"); break; default: return 0; @@ -576,7 +648,7 @@ static int mh_saveloadcfg(int id, int keys) static int mh_restore_defaults(int id, int keys) { emu_set_defconfig(); - me_update_msg("defaults restored"); + menu_update_msg("defaults restored"); return 1; } @@ -668,7 +740,7 @@ static int menu_loop_options(int id, int keys) me_enable(e_menu_options, MA_OPT_SAVECFG_GAME, rom_loaded); me_enable(e_menu_options, MA_OPT_LOADCFG, config_slot != config_slot_current); - me_loop(e_menu_options, &sel, NULL); + me_loop(e_menu_options, &sel); return 0; } @@ -686,12 +758,12 @@ static void mplayer_loop(void) while (1) { PDebugZ80Frame(); - if (in_menu_wait_any(0) & PBTN_MA3) + if (in_menu_wait_any(NULL, 0) & PBTN_MA3) break; - pemu_sound_wait(); + emu_sound_wait(); } - pemu_sound_stop(); + emu_sound_stop(); } static void draw_text_debug(const char *str, int skip, int from) @@ -737,7 +809,8 @@ static void draw_frame_debug(void) if (PicoDrawMask & PDRAW_32X_ON) memcpy(layer_str + 26, "32x", 4); pemu_forced_frame(1, 0); - memcpy(g_menuscreen_ptr, g_menubg_src_ptr, g_menuscreen_w * g_menuscreen_h * 2); + make_bg(1); + smalltext_out16(4, 1, "build: r" REVISION " "__DATE__ " " __TIME__ " " COMPILER, 0xffff); smalltext_out16(4, g_menuscreen_h - me_sfont_h, layer_str, 0xffff); } @@ -750,7 +823,7 @@ static void debug_menu_loop(void) while (1) { - menu_draw_begin(1); + menu_draw_begin(1, 0); switch (mode) { case 0: tmp = PDebugMain(); @@ -765,7 +838,7 @@ static void debug_menu_loop(void) case 1: draw_frame_debug(); break; case 2: pemu_forced_frame(1, 0); - menu_darken_bg(g_menuscreen_ptr, g_menubg_src_ptr, g_menuscreen_w * g_menuscreen_h, 0); + make_bg(1); PDebugShowSpriteStats((unsigned short *)g_menuscreen_ptr + (g_menuscreen_h/2 - 240/2)*g_menuscreen_w + g_menuscreen_w/2 - 320/2, g_menuscreen_w); break; @@ -782,7 +855,7 @@ static void debug_menu_loop(void) menu_draw_end(); inp = in_menu_wait(PBTN_MOK|PBTN_MBACK|PBTN_MA2|PBTN_MA3|PBTN_L|PBTN_R | - PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT, 70); + PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT, NULL, 70); if (inp & PBTN_MBACK) return; if (inp & PBTN_L) { mode--; if (mode < 0) mode = 4; } if (inp & PBTN_R) { mode++; if (mode > 4) mode = 0; } @@ -793,13 +866,13 @@ static void debug_menu_loop(void) PDebugCPUStep(); if (inp & PBTN_MA3) { while (inp & PBTN_MA3) - inp = in_menu_wait_any(-1); + inp = in_menu_wait_any(NULL, -1); mplayer_loop(); } if ((inp & (PBTN_MA2|PBTN_LEFT)) == (PBTN_MA2|PBTN_LEFT)) { mkdir("dumps", 0777); PDebugDumpMem(); - while (inp & PBTN_MA2) inp = in_menu_wait_any(-1); + while (inp & PBTN_MA2) inp = in_menu_wait_any(NULL, -1); dumped = 1; } break; @@ -814,7 +887,7 @@ static void debug_menu_loop(void) PicoSkipFrame = 1; PicoFrame(); PicoSkipFrame = 0; - while (inp & PBTN_MOK) inp = in_menu_wait_any(-1); + while (inp & PBTN_MOK) inp = in_menu_wait_any(NULL, -1); } break; case 3: @@ -828,23 +901,29 @@ static void debug_menu_loop(void) // ------------ main menu ------------ -static char *romsel_run(void) -{ - char *ret, *sel_name; - - sel_name = malloc(sizeof(rom_fname_loaded)); - if (sel_name == NULL) - return NULL; - strcpy(sel_name, rom_fname_loaded); - - ret = menu_loop_romsel(sel_name, sizeof(rom_fname_loaded)); - free(sel_name); - return ret; -} +static const char credits[] = + "PicoDrive v" VERSION " (c) notaz, 2006-2011\n\n\n" + "Credits:\n" + "fDave: Cyclone 68000 core,\n" + " base code of PicoDrive\n" + "Reesy & FluBBa: DrZ80 core\n" + "MAME devs: YM2612 and SN76496 cores\n" + "Inder, ketchupgun: graphics\n" +#ifdef __GP2X__ + "rlyeh and others: minimal SDK\n" + "Squidge: mmuhack\n" + "Dzz: ARM940 sample\n" +#endif + "\n" + "special thanks (for docs, ideas):\n" + " Charles MacDonald, Haze,\n" + " Stephane Dallongeville,\n" + " Lordus, Exophase, Rokas,\n" + " Nemesis, Tasco Deluxe"; static int main_menu_handler(int id, int keys) { - char *ret_name; + const char *ret_name; switch (id) { @@ -867,16 +946,19 @@ static int main_menu_handler(int id, int keys) } break; case MA_MAIN_LOAD_ROM: - ret_name = romsel_run(); + rom_fname_reload = NULL; + ret_name = menu_loop_romsel(rom_fname_loaded, + sizeof(rom_fname_loaded), rom_exts, NULL); if (ret_name != NULL) { lprintf("selected file: %s\n", ret_name); + rom_fname_reload = ret_name; engineState = PGS_ReloadRom; return 1; } break; case MA_MAIN_CREDITS: - draw_menu_message(, NULL); - in_menu_wait(PBTN_MOK|PBTN_MBACK, 70); + draw_menu_message(credits, NULL); + in_menu_wait(PBTN_MOK|PBTN_MBACK, NULL, 70); break; case MA_MAIN_EXIT: engineState = PGS_Quit; @@ -885,7 +967,7 @@ static int main_menu_handler(int id, int keys) if (rom_loaded && PicoPatches) { menu_loop_patches(); PicoPatchApply(); - me_update_msg("Patches applied"); + menu_update_msg("Patches applied"); } break; default: @@ -927,29 +1009,33 @@ void menu_loop(void) menu_enter(rom_loaded); in_set_config_int(0, IN_CFG_BLOCKING, 1); - me_loop(e_menu_main, &sel, menu_main_plat_draw); + me_loop_d(e_menu_main, &sel, NULL, menu_main_plat_draw); if (rom_loaded) { if (engineState == PGS_Menu) engineState = PGS_Running; /* wait until menu, ok, back is released */ - while (in_menu_wait_any(50) & (PBTN_MENU|PBTN_MOK|PBTN_MBACK)) + while (in_menu_wait_any(NULL, 50) & (PBTN_MENU|PBTN_MOK|PBTN_MBACK)) ; } in_set_config_int(0, IN_CFG_BLOCKING, 0); + plat_video_menu_leave(); } // --------- CD tray close menu ---------- static int mh_tray_load_cd(int id, int keys) { - char *ret_name; + const char *ret_name; - ret_name = romsel_run(); + rom_fname_reload = NULL; + ret_name = menu_loop_romsel(rom_fname_loaded, + sizeof(rom_fname_loaded), rom_exts, NULL); if (ret_name == NULL) return 0; + rom_fname_reload = ret_name; engineState = PGS_RestartRun; return emu_swap_cd(ret_name); } @@ -976,20 +1062,21 @@ int menu_loop_tray(void) menu_enter(rom_loaded); in_set_config_int(0, IN_CFG_BLOCKING, 1); - me_loop(e_menu_tray, &sel, NULL); + me_loop(e_menu_tray, &sel); if (engineState != PGS_RestartRun) { engineState = PGS_RestartRun; ret = 0; /* no CD inserted */ } - while (in_menu_wait_any(50) & (PBTN_MENU|PBTN_MOK|PBTN_MBACK)); + while (in_menu_wait_any(NULL, 50) & (PBTN_MENU|PBTN_MOK|PBTN_MBACK)); in_set_config_int(0, IN_CFG_BLOCKING, 0); + plat_video_menu_leave(); return ret; } -void me_update_msg(const char *msg) +void menu_update_msg(const char *msg) { strncpy(menu_error_msg, msg, sizeof(menu_error_msg)); menu_error_msg[sizeof(menu_error_msg) - 1] = 0; @@ -1049,3 +1136,22 @@ menu_entry *me_list_get_next(void) return me_list_i; } +void menu_init(void) +{ + int i; + + menu_init_base(); + + i = me_id2offset(e_menu_gfx_options, MA_OPT_VOUT_MODE); + e_menu_gfx_options[i].data = plat_target.vout_methods; + me_enable(e_menu_gfx_options, MA_OPT_VOUT_MODE, + plat_target.vout_methods != NULL); + + i = me_id2offset(e_menu_gfx_options, MA_OPT3_FILTERING); + e_menu_gfx_options[i].data = plat_target.hwfilters; + me_enable(e_menu_gfx_options, MA_OPT3_FILTERING, + plat_target.hwfilters != NULL); + + me_enable(e_menu_gfx_options, MA_OPT3_GAMMA, + plat_target.gamma_set != NULL); +}