some support for vdp debug reg
[picodrive.git] / platform / common / menu_pico.c
index 1427490..cc11638 100644 (file)
@@ -14,7 +14,7 @@
 #include "input_pico.h"
 #include "version.h"
 
-#include <pico/pico.h>
+#include <pico/pico_int.h>
 #include <pico/patch.h>
 
 #ifdef PANDORA
@@ -119,11 +119,14 @@ static void menu_enter(int is_rom_loaded)
        }
        else
        {
+               int pos;
                char buff[256];
+               pos = plat_get_skin_dir(buff, 256);
+               strcpy(buff + pos, "background.png");
 
                // should really only happen once, on startup..
-               emu_make_path(buff, "skin/background.png", sizeof(buff));
-               if (readpng(g_menubg_ptr, buff, READPNG_BG, g_menuscreen_w, g_menuscreen_h) < 0)
+               if (readpng(g_menubg_ptr, buff, READPNG_BG,
+                                               g_menuscreen_w, g_menuscreen_h) < 0)
                        memset(g_menubg_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2);
        }
 
@@ -135,7 +138,7 @@ static void draw_savestate_bg(int slot)
        const char *fname;
        void *tmp_state;
 
-       fname = emu_get_save_fname(1, 0, slot);
+       fname = emu_get_save_fname(1, 0, slot, NULL);
        if (!fname)
                return;
 
@@ -395,31 +398,6 @@ static int menu_loop_keyconfig(int id, int keys)
 
 // ------------ SCD options menu ------------
 
-static const char *mgn_cdopt_ra(int id, int *offs)
-{
-       *offs = -5;
-       if (PicoCDBuffers <= 0)
-               return "     OFF";
-       sprintf(static_buff, "%5iK", PicoCDBuffers * 2);
-       return static_buff;
-}
-
-static int mh_cdopt_ra(int id, int keys)
-{
-       if (keys & PBTN_LEFT) {
-               PicoCDBuffers >>= 1;
-               if (PicoCDBuffers < 2)
-                       PicoCDBuffers = 0;
-       } else {
-               if (PicoCDBuffers <= 0)
-                       PicoCDBuffers = 1;
-               PicoCDBuffers <<= 1;
-               if (PicoCDBuffers > 8*1024)
-                       PicoCDBuffers = 8*1024; // 16M
-       }
-       return 0;
-}
-
 static const char h_cdleds[] = "Show power/CD LEDs of emulated console";
 static const char h_cdda[]   = "Play audio tracks from mp3s/wavs/bins";
 static const char h_cdpcm[]  = "Emulate PCM audio chip for effects/voices/music";
@@ -435,10 +413,8 @@ static menu_entry e_menu_cd_options[] =
        mee_onoff_h("CD LEDs",              MA_CDOPT_LEDS,          currentConfig.EmuOpt, EOPT_EN_CD_LEDS, h_cdleds),
        mee_onoff_h("CDDA audio",           MA_CDOPT_CDDA,          PicoOpt, POPT_EN_MCD_CDDA, h_cdda),
        mee_onoff_h("PCM audio",            MA_CDOPT_PCM,           PicoOpt, POPT_EN_MCD_PCM, h_cdpcm),
-       mee_cust   ("ReadAhead buffer",     MA_CDOPT_READAHEAD,     mh_cdopt_ra, mgn_cdopt_ra),
        mee_onoff_h("SaveRAM cart",         MA_CDOPT_SAVERAM,       PicoOpt, POPT_EN_MCD_RAMCART, h_srcart),
-       mee_onoff_h("Scale/Rot. fx (slow)", MA_CDOPT_SCALEROT_CHIP, PicoOpt, POPT_EN_MCD_GFX, h_scfx),
-       mee_onoff_h("Better sync (slow)",   MA_CDOPT_BETTER_SYNC,   PicoOpt, POPT_EN_MCD_PSYNC, h_bsync),
+       mee_onoff_h("Scale/Rot. fx",        MA_CDOPT_SCALEROT_CHIP, PicoOpt, POPT_EN_MCD_GFX, h_scfx),
        mee_end,
 };
 
@@ -524,7 +500,7 @@ static menu_entry e_menu_adv_options[] =
        mee_onoff     ("Don't save last used ROM", MA_OPT2_NO_LAST_ROM,   currentConfig.EmuOpt, EOPT_NO_AUTOSVCFG),
        mee_onoff     ("Disable idle loop patching",MA_OPT2_NO_IDLE_LOOPS,PicoOpt, POPT_DIS_IDLE_DET),
        mee_onoff     ("Disable frame limiter",    MA_OPT2_NO_FRAME_LIMIT,currentConfig.EmuOpt, EOPT_NO_FRMLIMIT),
-       mee_onoff     ("Enable dynarecs",          MA_OPT2_SVP_DYNAREC,   PicoOpt, POPT_EN_SVP_DRC),
+       mee_onoff     ("Enable dynarecs",          MA_OPT2_DYNARECS,      PicoOpt, POPT_EN_DRC),
        mee_onoff     ("Status line in main menu", MA_OPT2_STATUS_LINE,   currentConfig.EmuOpt, EOPT_SHOW_RTC),
        MENU_OPTIONS_ADV
        mee_end,
@@ -744,7 +720,7 @@ static menu_entry e_menu_options[] =
        mee_onoff     ("Enable sound",             MA_OPT_ENABLE_SOUND,  currentConfig.EmuOpt, EOPT_EN_SOUND),
        mee_cust      ("Sound Quality",            MA_OPT_SOUND_QUALITY, mh_opt_misc, mgn_opt_sound),
        mee_enum_h    ("Confirm savestate",        MA_OPT_CONFIRM_STATES,currentConfig.confirm_save, men_confirm_save, h_confirm_save),
-       mee_range     ("",                         MA_OPT_CPU_CLOCKS,    currentConfig.CPUclock, 20, 1200),
+       mee_range     ("",                         MA_OPT_CPU_CLOCKS,    currentConfig.CPUclock, 20, 3200),
        mee_handler   ("[Display options]",        menu_loop_gfx_options),
        mee_handler   ("[Sega/Mega CD options]",   menu_loop_cd_options),
 #ifndef NO_32X
@@ -827,11 +803,13 @@ static void draw_text_debug(const char *str, int skip, int from)
 static void draw_frame_debug(void)
 {
        char layer_str[48] = "layers:                   ";
-       if (PicoDrawMask & PDRAW_LAYERB_ON)      memcpy(layer_str +  8, "B", 1);
-       if (PicoDrawMask & PDRAW_LAYERA_ON)      memcpy(layer_str + 10, "A", 1);
-       if (PicoDrawMask & PDRAW_SPRITES_LOW_ON) memcpy(layer_str + 12, "spr_lo", 6);
-       if (PicoDrawMask & PDRAW_SPRITES_HI_ON)  memcpy(layer_str + 19, "spr_hi", 6);
-       if (PicoDrawMask & PDRAW_32X_ON)         memcpy(layer_str + 26, "32x", 4);
+       struct PicoVideo *pv = &Pico.video;
+
+       if (!(pv->debug_p & PVD_KILL_B))    memcpy(layer_str +  8, "B", 1);
+       if (!(pv->debug_p & PVD_KILL_A))    memcpy(layer_str + 10, "A", 1);
+       if (!(pv->debug_p & PVD_KILL_S_LO)) memcpy(layer_str + 12, "spr_lo", 6);
+       if (!(pv->debug_p & PVD_KILL_S_HI)) memcpy(layer_str + 19, "spr_hi", 6);
+       if (!(pv->debug_p & PVD_KILL_32X))  memcpy(layer_str + 26, "32x", 4);
 
        pemu_forced_frame(1, 0);
        make_bg(1);
@@ -842,6 +820,7 @@ static void draw_frame_debug(void)
 
 static void debug_menu_loop(void)
 {
+       struct PicoVideo *pv = &Pico.video;
        int inp, mode = 0;
        int spr_offs = 0, dumped = 0;
        char *tmp;
@@ -902,11 +881,11 @@ static void debug_menu_loop(void)
                                }
                                break;
                        case 1:
-                               if (inp & PBTN_LEFT)  PicoDrawMask ^= PDRAW_LAYERB_ON;
-                               if (inp & PBTN_RIGHT) PicoDrawMask ^= PDRAW_LAYERA_ON;
-                               if (inp & PBTN_DOWN)  PicoDrawMask ^= PDRAW_SPRITES_LOW_ON;
-                               if (inp & PBTN_UP)    PicoDrawMask ^= PDRAW_SPRITES_HI_ON;
-                               if (inp & PBTN_MA2)   PicoDrawMask ^= PDRAW_32X_ON;
+                               if (inp & PBTN_LEFT)  pv->debug_p ^= PVD_KILL_B;
+                               if (inp & PBTN_RIGHT) pv->debug_p ^= PVD_KILL_A;
+                               if (inp & PBTN_DOWN)  pv->debug_p ^= PVD_KILL_S_LO;
+                               if (inp & PBTN_UP)    pv->debug_p ^= PVD_KILL_S_HI;
+                               if (inp & PBTN_MA2)   pv->debug_p ^= PVD_KILL_32X;
                                if (inp & PBTN_MOK) {
                                        PsndOut = NULL; // just in case
                                        PicoSkipFrame = 1;
@@ -926,16 +905,29 @@ static void debug_menu_loop(void)
 
 // ------------ main menu ------------
 
+static void draw_frame_credits(void)
+{
+       smalltext_out16(4, 1, "build: " __DATE__ " " __TIME__, 0xe7fc);
+}
+
 static const char credits[] =
-       "PicoDrive v" VERSION " (c) notaz, 2006-2011\n\n\n"
+       "PicoDrive v" VERSION " (c) notaz, 2006-2013\n\n\n"
        "Credits:\n"
-       "fDave: Cyclone 68000 core,\n"
-       "      base code of PicoDrive\n"
+       "fDave: initial code\n"
+#ifdef EMU_C68K
+       "      Cyclone 68000 core\n"
+#else
+       "Stef, Chui: FAME/C 68k core\n"
+#endif
+#ifdef _USE_DRZ80
        "Reesy & FluBBa: DrZ80 core\n"
-       "MAME devs: YM2612 and SN76496 cores\n"
+#else
+       "Stef, NJ: CZ80 core\n"
+#endif
+       "MAME devs: SH2, YM2612 and SN76496 cores\n"
+       "Eke, Stef: some Sega CD code\n"
        "Inder, ketchupgun: graphics\n"
 #ifdef __GP2X__
-       "rlyeh and others: minimal SDK\n"
        "Squidge: mmuhack\n"
        "Dzz: ARM940 sample\n"
 #endif
@@ -944,7 +936,7 @@ static const char credits[] =
        " Charles MacDonald, Haze,\n"
        " Stephane Dallongeville,\n"
        " Lordus, Exophase, Rokas,\n"
-       " Nemesis, Tasco Deluxe";
+       " Eke, Nemesis, Tasco Deluxe";
 
 static void menu_main_draw_status(void)
 {
@@ -1031,8 +1023,17 @@ static int main_menu_handler(int id, int keys)
                        return 1;
                }
                break;
+       case MA_MAIN_CHANGE_CD:
+               if (PicoAHW & PAHW_MCD) {
+                       // if cd is loaded, cdd_unload() triggers eject and
+                       // returns 1, else we'll select and load new CD here
+                       if (!cdd_unload())
+                               menu_loop_tray();
+                       return 1;
+               }
+               break;
        case MA_MAIN_CREDITS:
-               draw_menu_message(credits, NULL);
+               draw_menu_message(credits, draw_frame_credits);
                in_menu_wait(PBTN_MOK|PBTN_MBACK, NULL, 70);
                break;
        case MA_MAIN_EXIT:
@@ -1064,6 +1065,7 @@ static menu_entry e_menu_main[] =
        mee_handler_id("Load State",         MA_MAIN_LOAD_STATE,  main_menu_handler),
        mee_handler_id("Reset game",         MA_MAIN_RESET_GAME,  main_menu_handler),
        mee_handler_id("Load new ROM/ISO",   MA_MAIN_LOAD_ROM,    main_menu_handler),
+       mee_handler_id("Change CD/ISO",      MA_MAIN_CHANGE_CD,   main_menu_handler),
        mee_handler   ("Change options",                          menu_loop_options),
        mee_handler   ("Configure controls",                      menu_loop_keyconfig),
        mee_handler_id("Credits",            MA_MAIN_CREDITS,     main_menu_handler),
@@ -1080,6 +1082,7 @@ void menu_loop(void)
        me_enable(e_menu_main, MA_MAIN_SAVE_STATE,  PicoGameLoaded);
        me_enable(e_menu_main, MA_MAIN_LOAD_STATE,  PicoGameLoaded);
        me_enable(e_menu_main, MA_MAIN_RESET_GAME,  PicoGameLoaded);
+       me_enable(e_menu_main, MA_MAIN_CHANGE_CD,   PicoAHW & PAHW_MCD);
        me_enable(e_menu_main, MA_MAIN_PATCHES, PicoPatches != NULL);
 
        menu_enter(PicoGameLoaded);
@@ -1167,6 +1170,7 @@ void menu_update_msg(const char *msg)
 static menu_entry e_menu_hidden[] =
 {
        mee_onoff("Accurate sprites", MA_OPT_ACC_SPRITES, PicoOpt, 0x080),
+       mee_onoff("autoload savestates", MA_OPT_AUTOLOAD_SAVE, g_autostateld_opt, 1),
        mee_end,
 };
 
@@ -1222,7 +1226,7 @@ void menu_init(void)
 #if defined(_SVP_DRC) || defined(DRC_SH2)
        i = 1;
 #endif
-       me_enable(e_menu_adv_options, MA_OPT2_SVP_DYNAREC, i);
+       me_enable(e_menu_adv_options, MA_OPT2_DYNARECS, i);
 
        i = me_id2offset(e_menu_gfx_options, MA_OPT_VOUT_MODE);
        e_menu_gfx_options[i].data = plat_target.vout_methods;