psp code updated for latest base, black level
authornotaz <notasas@gmail.com>
Sat, 5 Apr 2008 19:51:49 +0000 (19:51 +0000)
committernotaz <notasas@gmail.com>
Sat, 5 Apr 2008 19:51:49 +0000 (19:51 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@415 be3aeb3a-fb24-0410-a615-afba39da0efa

14 files changed:
Pico/carthw/svp/svp.c
platform/base_readme.txt
platform/common/config.c
platform/common/emu.c
platform/common/emu.h
platform/common/menu.h
platform/gizmondo/menu.c
platform/psp/Makefile
platform/psp/asm_utils.h
platform/psp/asm_utils.s
platform/psp/emu.c
platform/psp/main.c
platform/psp/menu.c
platform/psp/version.h

index 8d09f49..0c7585a 100644 (file)
@@ -38,16 +38,21 @@ static void PicoSVPReset(void)
 
        memcpy(svp->iram_rom + 0x800, Pico.rom + 0x800, 0x20000 - 0x800);
        ssp1601_reset(&svp->ssp1601);
+#ifndef PSP
        if ((PicoOpt&POPT_EN_SVP_DRC) && svp_dyn_ready)
                ssp1601_dyn_reset(&svp->ssp1601);
+#endif
 }
 
 
 static void PicoSVPLine(int count)
 {
+#ifndef PSP
        if ((PicoOpt&POPT_EN_SVP_DRC) && svp_dyn_ready)
                ssp1601_dyn_run(PicoSVPCycles * count);
-       else {
+       else
+#endif
+       {
                ssp1601_run(PicoSVPCycles * count);
                svp_dyn_ready = 0; // just in case
        }
@@ -126,10 +131,12 @@ void PicoSVPStartup(void)
 
        // init SVP compiler
        svp_dyn_ready = 0;
+#ifndef PSP
        if (PicoOpt&POPT_EN_SVP_DRC) {
                if (ssp1601_dyn_startup()) return;
                svp_dyn_ready = 1;
        }
+#endif
 
        // init ok, setup hooks..
        PicoRead16Hook = PicoSVPRead16;
index 3e6e48d..7d0dcc3 100644 (file)
@@ -636,8 +636,16 @@ Additional thanks
 \r
 Changelog\r
 ---------\r
+1.40b\r
+  * Fixed sprite masking code. Thanks to Lordus for explaining how it works.\r
+  + Added "disable sprite limit" option.\r
+  + PSP: added black level adjustment to display options.\r
+  * Changed reset to act as 'soft' reset.\r
+  + Added detection for Puggsy (it doesn't really have sram).\r
+  * Some small timing adjustments.\r
+\r
 1.40a\r
-  * Fixed a binding problem with up and down keys.\r
+  * GP2X: Fixed a binding problem with up and down keys.\r
   * Default game config no longer overrides global user config.\r
 \r
 1.40\r
@@ -648,16 +656,17 @@ Changelog
     configs are now held in single file (but old game config files are still\r
     read when new one is missing).\r
   * Fixed a bug where some key combos didn't work as expected.\r
-  * Fixed a regression in renderer (some graphic glitches in rare cases).\r
+  * Fixed a regression in renderer (ARM ports only, some graphic glitches in\r
+    rare cases).\r
   * Adjusted fast renderer to work with more games, including VR.\r
   * Fixed a problem where SegaCD RAM cart data was getting lost on reset.\r
-  * Greatly reduced SegaCD FMV game slowdowns by disabling read-ahead in the\r
-    Linux kernel and C library (thanks to Rokas and Exophase for ideas again).\r
-    Be sure to keep "ReadAhead buffer" OFF to avoid slowdowns.\r
+  * GP2X: Greatly reduced SegaCD FMV game slowdowns by disabling read-ahead\r
+    in the Linux kernel and C library (thanks to Rokas and Exophase for ideas\r
+    again). Be sure to keep "ReadAhead buffer" OFF to avoid slowdowns.\r
   + PicoDrive now comes with a game config file for some games which need\r
     special settings, so they should now work out-of-the-box. More games will\r
     be added with later updates.\r
-  + Files now can be deleted by pressing A+SELECT in the file browser.\r
+  + GP2X: Files now can be deleted by pressing A+SELECT in the file browser.\r
 \r
 1.35b\r
   * PSP: mp3 code should no longer fail on 1.5 firmware.\r
index f4d2546..d4833f6 100644 (file)
@@ -17,9 +17,30 @@ extern menu_entry cdopt_entries[];
 extern const int opt_entry_count;
 extern const int opt2_entry_count;
 extern const int cdopt_entry_count;
+#ifdef PSP
+extern menu_entry opt3_entries[];
+extern const int opt3_entry_count;
+#endif
 
-static menu_entry *cfg_opts[] = { opt_entries, opt2_entries, cdopt_entries };
-static const int *cfg_opt_counts[] = { &opt_entry_count, &opt2_entry_count, &cdopt_entry_count };
+static menu_entry *cfg_opts[] =
+{
+       opt_entries,
+       opt2_entries,
+       cdopt_entries,
+#ifdef PSP
+       opt3_entries,
+#endif
+};
+
+static const int *cfg_opt_counts[] =
+{
+       &opt_entry_count,
+       &opt2_entry_count,
+       &cdopt_entry_count,
+#ifdef PSP
+       &opt3_entry_count,
+#endif
+};
 
 #define NL "\r\n"
 
@@ -73,9 +94,17 @@ static void custom_write(FILE *f, const menu_entry *me, int no_def)
                        if (no_def && !((defaultConfig.s_PicoOpt^PicoOpt)&POPT_ALT_RENDERER) &&
                                !((defaultConfig.EmuOpt^currentConfig.EmuOpt)&0x80)) return;
                        if (PicoOpt&POPT_ALT_RENDERER)
-                               str = "8bit fast";
+                               str =
+#ifndef PSP
+                               "8bit "
+#endif
+                               "fast";
                        else if (currentConfig.EmuOpt&0x80)
-                               str = "16bit accurate";
+                               str =
+#ifndef PSP
+                               "16bit "
+#endif
+                               "accurate";
                        else
                                str = "8bit accurate";
                        fprintf(f, "Renderer = %s", str);
@@ -83,13 +112,16 @@ static void custom_write(FILE *f, const menu_entry *me, int no_def)
 
                case MA_OPT_SCALING:
                        if (no_def && defaultConfig.scaling == currentConfig.scaling) return;
+#ifdef __GP2X__
                        switch (currentConfig.scaling) {
                                default: str = "OFF"; break;
                                case 1:  str = "hw horizontal";     break;
                                case 2:  str = "hw horiz. + vert."; break;
                                case 3:  str = "sw horizontal";     break;
+                               case 1:  str = "ON";  break;
                        }
                        fprintf(f, "Scaling = %s", str);
+#endif
                        break;
                case MA_OPT_FRAMESKIP:
                        if (no_def && defaultConfig.Frameskip == currentConfig.Frameskip) return;
@@ -107,7 +139,8 @@ static void custom_write(FILE *f, const menu_entry *me, int no_def)
                case MA_OPT_REGION:
                        if (no_def && defaultConfig.s_PicoRegion == PicoRegionOverride &&
                                defaultConfig.s_PicoAutoRgnOrder == PicoAutoRgnOrder) return;
-                       fprintf(f, "Region = %s", me_region_name(PicoRegionOverride, PicoAutoRgnOrder));
+                       strncpy(str24, me_region_name(PicoRegionOverride, PicoAutoRgnOrder), 23); str24[23] = 0;
+                       fprintf(f, "Region = %s", mystrip(str24));
                        break;
                case MA_OPT_CONFIRM_STATES:
                        if (no_def && !((defaultConfig.EmuOpt^currentConfig.EmuOpt)&(5<<9))) return;
@@ -121,7 +154,11 @@ static void custom_write(FILE *f, const menu_entry *me, int no_def)
                        break;
                case MA_OPT_CPU_CLOCKS:
                        if (no_def && defaultConfig.CPUclock == currentConfig.CPUclock) return;
+#ifdef __GP2X__
                        fprintf(f, "GP2X CPU clocks = %i", currentConfig.CPUclock);
+#elif defined(PSP)
+                       fprintf(f, "PSP CPU clock = %i", currentConfig.CPUclock);
+#endif
                        break;
                case MA_OPT2_GAMMA:
                        if (no_def && defaultConfig.gamma == currentConfig.gamma) return;
@@ -136,6 +173,38 @@ static void custom_write(FILE *f, const menu_entry *me, int no_def)
                        sprintf(str24, "%i", PicoCDBuffers * 2);
                        fprintf(f, "ReadAhead buffer = %s", str24);
                        break;
+               /* PSP */
+               case MA_OPT3_SCALE:
+                       if (no_def && defaultConfig.scale == currentConfig.scale) return;
+                       fprintf(f, "Scale factor = %.2f", currentConfig.scale);
+                       break;
+               case MA_OPT3_HSCALE32:
+                       if (no_def && defaultConfig.hscale32 == currentConfig.hscale32) return;
+                       fprintf(f, "Hor. scale (for low res. games) = %.2f", currentConfig.hscale32);
+                       break;
+               case MA_OPT3_HSCALE40:
+                       if (no_def && defaultConfig.hscale40 == currentConfig.hscale40) return;
+                       fprintf(f, "Hor. scale (for hi res. games) = %.2f", currentConfig.hscale40);
+                       break;
+               case MA_OPT3_FILTERING:
+                       if (no_def && defaultConfig.scaling == currentConfig.scaling) return;
+                       fprintf(f, "Bilinear filtering = %i", currentConfig.scaling);
+                       break;
+               case MA_OPT3_GAMMAA:
+                       if (no_def && defaultConfig.gamma == currentConfig.gamma) return;
+                       fprintf(f, "Gamma adjustment = %i", currentConfig.gamma);
+                       break;
+               case MA_OPT3_BLACKLVL:
+                       if (no_def && defaultConfig.gamma2 == currentConfig.gamma2) return;
+                       fprintf(f, "Black level = %i", currentConfig.gamma2);
+                       break;
+               case MA_OPT3_VSYNC:
+                       if (no_def && (defaultConfig.EmuOpt&0x12000) == (currentConfig.gamma2&0x12000)) return;
+                       strcpy(str24, "never");
+                       if (currentConfig.EmuOpt & 0x2000)
+                               strcpy(str24, (currentConfig.EmuOpt & 0x10000) ? "sometimes" : "always");
+                       fprintf(f, "Wait for vsync = %s", str24);
+                       break;
 
                default:
                        lprintf("unhandled custom_write: %i\n", me->id);
@@ -154,7 +223,7 @@ static const char *joyKeyNames[32] =
 };
 
 static void keys_write(FILE *fn, const char *bind_str, const int binds[32],
-               const int def_binds[32], const char *names[32], int no_defaults)
+               const int def_binds[32], const char * const names[32], int no_defaults)
 {
        int t, i;
        char act[48];
@@ -168,6 +237,11 @@ static void keys_write(FILE *fn, const char *bind_str, const int binds[32],
 #ifdef __GP2X__
                if (strcmp(names[t], "SELECT") == 0) continue;
 #endif
+               if (binds[t] == 0 && def_binds[t] != 0) {
+                       fprintf(fn, "%s %s =" NL, bind_str, names[t]); // no binds
+                       continue;
+               }
+
                for (i = 0; i < sizeof(me_ctrl_actions) / sizeof(me_ctrl_actions[0]); i++) {
                        if (me_ctrl_actions[i].mask & binds[t]) {
                                strncpy(act, me_ctrl_actions[i].name, 31);
@@ -322,8 +396,10 @@ write:
        keys_write(fn, "bind_joy2", currentConfig.JoyBinds[2], defaultConfig.JoyBinds[2], joyKeyNames, 1);
        keys_write(fn, "bind_joy3", currentConfig.JoyBinds[3], defaultConfig.JoyBinds[3], joyKeyNames, 1);
 
+#ifndef PSP
        if (section == NULL)
                fprintf(fn, "Sound Volume = %i" NL, currentConfig.volume);
+#endif
 
        fprintf(fn, NL);
 
@@ -437,10 +513,10 @@ static int custom_read(menu_entry *me, const char *var, const char *val)
        {
                case MA_OPT_RENDERER:
                        if (strcasecmp(var, "Renderer") != 0) return 0;
-                       if      (strcasecmp(val, "8bit fast") == 0) {
+                       if      (strcasecmp(val, "8bit fast") == 0 || strcasecmp(val, "fast") == 0) {
                                PicoOpt |=  POPT_ALT_RENDERER;
                        }
-                       else if (strcasecmp(val, "16bit accurate") == 0) {
+                       else if (strcasecmp(val, "16bit accurate") == 0 || strcasecmp(val, "accurate") == 0) {
                                PicoOpt &= ~POPT_ALT_RENDERER;
                                currentConfig.EmuOpt |=  0x80;
                        }
@@ -453,6 +529,7 @@ static int custom_read(menu_entry *me, const char *var, const char *val)
                        return 1;
 
                case MA_OPT_SCALING:
+#ifdef __GP2X__
                        if (strcasecmp(var, "Scaling") != 0) return 0;
                        if        (strcasecmp(val, "OFF") == 0) {
                                currentConfig.scaling = 0;
@@ -465,6 +542,9 @@ static int custom_read(menu_entry *me, const char *var, const char *val)
                        } else
                                return 0;
                        return 1;
+#else
+                       return 0;
+#endif
 
                case MA_OPT_FRAMESKIP:
                        if (strcasecmp(var, "Frameskip") != 0) return 0;
@@ -540,7 +620,11 @@ static int custom_read(menu_entry *me, const char *var, const char *val)
                        return 1;
 
                case MA_OPT_CPU_CLOCKS:
+#ifdef __GP2X__
                        if (strcasecmp(var, "GP2X CPU clocks") != 0) return 0;
+#elif defined(PSP)
+                       if (strcasecmp(var, "PSP CPU clock") != 0) return 0;
+#endif
                        currentConfig.CPUclock = atoi(val);
                        return 1;
 
@@ -561,6 +645,44 @@ static int custom_read(menu_entry *me, const char *var, const char *val)
                        PicoCDBuffers = atoi(val) / 2;
                        return 1;
 
+               /* PSP */
+               case MA_OPT3_SCALE:
+                       if (strcasecmp(var, "Scale factor") != 0) return 0;
+                       currentConfig.scale = atof(val);
+                       return 1;
+               case MA_OPT3_HSCALE32:
+                       if (strcasecmp(var, "Hor. scale (for low res. games)") != 0) return 0;
+                       currentConfig.hscale32 = atof(val);
+                       return 1;
+               case MA_OPT3_HSCALE40:
+                       if (strcasecmp(var, "Hor. scale (for hi res. games)") != 0) return 0;
+                       currentConfig.hscale40 = atof(val);
+                       return 1;
+               case MA_OPT3_FILTERING:
+                       if (strcasecmp(var, "Bilinear filtering") != 0) return 0;
+                       currentConfig.scaling = atoi(val);
+                       return 1;
+               case MA_OPT3_GAMMAA:
+                       if (strcasecmp(var, "Gamma adjustment") != 0) return 0;
+                       currentConfig.gamma = atoi(val);
+                       return 1;
+               case MA_OPT3_BLACKLVL:
+                       if (strcasecmp(var, "Black level") != 0) return 0;
+                       currentConfig.gamma2 = atoi(val);
+                       return 1;
+               case MA_OPT3_VSYNC:
+                       if (strcasecmp(var, "Wait for vsync") != 0) return 0;
+                       if        (strcasecmp(val, "never") == 0) {
+                               currentConfig.EmuOpt &= ~0x12000;
+                       } else if (strcasecmp(val, "sometimes") == 0) {
+                               currentConfig.EmuOpt |=  0x12000;
+                       } else if (strcasecmp(val, "always") == 0) {
+                               currentConfig.EmuOpt &= ~0x12000;
+                               currentConfig.EmuOpt |=  0x02000;
+                       } else
+                               return 0;
+                       return 1;
+
                default:
                        lprintf("unhandled custom_read: %i\n", me->id);
                        return 0;
@@ -570,7 +692,7 @@ static int custom_read(menu_entry *me, const char *var, const char *val)
 
 static unsigned int keys_encountered = 0;
 
-static void keys_parse(const char *var, const char *val, int binds[32], const char *names[32])
+static void keys_parse(const char *var, const char *val, int binds[32], const char * const names[32])
 {
        int t, i;
        unsigned int player;
index e4cce67..feb3167 100644 (file)
@@ -572,6 +572,7 @@ int emu_ReadConfig(int game, int no_defaults)
        if (currentConfig.CPUclock < 10 || currentConfig.CPUclock > 4096) currentConfig.CPUclock = 200;\r
 #ifdef PSP\r
        if (currentConfig.gamma < -4 || currentConfig.gamma >  16) currentConfig.gamma = 0;\r
+       if (currentConfig.gamma2 < 0 || currentConfig.gamma2 > 2)  currentConfig.gamma2 = 0;\r
 #else\r
        if (currentConfig.gamma < 10 || currentConfig.gamma > 300) currentConfig.gamma = 100;\r
 #endif\r
@@ -672,6 +673,12 @@ void emu_textOut16(int x, int y, const char *text)
        }\r
 }\r
 \r
+#ifdef PSP\r
+#define MAX_COMBO_KEY 23\r
+#else\r
+#define MAX_COMBO_KEY 31\r
+#endif\r
+\r
 void emu_findKeyBindCombos(void)\r
 {\r
        int act, u;\r
@@ -684,15 +691,15 @@ void emu_findKeyBindCombos(void)
                if (act == 16 || act == 17) continue; // player2 flag\r
                if (act > 17)\r
                {\r
-                       for (u = 0; u < 32; u++)\r
+                       for (u = 0; u <= MAX_COMBO_KEY; u++)\r
                                if (currentConfig.KeyBinds[u] & (1 << act)) keyc++;\r
                }\r
                else\r
                {\r
-                       for (u = 0; u < 32; u++)\r
+                       for (u = 0; u <= MAX_COMBO_KEY; u++)\r
                                if ((currentConfig.KeyBinds[u] & 0x30000) == 0 && // pl. 1\r
                                        (currentConfig.KeyBinds[u] & (1 << act))) keyc++;\r
-                       for (u = 0; u < 32; u++)\r
+                       for (u = 0; u <= MAX_COMBO_KEY; u++)\r
                                if ((currentConfig.KeyBinds[u] & 0x30000) == 1 && // pl. 2\r
                                        (currentConfig.KeyBinds[u] & (1 << act))) keyc2++;\r
                        if (keyc2 > keyc) keyc = keyc2;\r
@@ -700,7 +707,7 @@ void emu_findKeyBindCombos(void)
                if (keyc > 1)\r
                {\r
                        // loop again and mark those keys and actions as combo\r
-                       for (u = 0; u < 32; u++)\r
+                       for (u = 0; u <= MAX_COMBO_KEY; u++)\r
                        {\r
                                if (currentConfig.KeyBinds[u] & (1 << act)) {\r
                                        kb_combo_keys |= 1 << u;\r
index 90c9350..d118e5b 100644 (file)
@@ -24,6 +24,7 @@ typedef struct {
        int scaling; // gp2x: 0=center, 1=hscale, 2=hvscale, 3=hsoftscale; psp: bilinear filtering
        float scale; // psp: screen scale
        float hscale32, hscale40; // psp: horizontal scale
+       int gamma2;  // psp: black level
 } currentConfig_t;
 
 extern currentConfig_t currentConfig, defaultConfig;
@@ -52,5 +53,5 @@ void  emu_textOut16(int x, int y, const char *text);
 char *emu_makeRomId(void);
 void  emu_findKeyBindCombos(void);
 
-extern const char *keyNames[];
+extern const char * const keyNames[];
 void  emu_prepareDefaultConfig(void);
index 432a31e..6ecc191 100644 (file)
@@ -76,6 +76,7 @@ typedef enum
        MA_OPT3_FILTERING,
        MA_OPT3_VSYNC,
        MA_OPT3_GAMMAA,
+       MA_OPT3_BLACKLVL,
        MA_OPT3_DONE,
        MA_CDOPT_TESTBIOS_USA,
        MA_CDOPT_TESTBIOS_EUR,
index 3445aaf..4f156b4 100644 (file)
@@ -969,6 +969,7 @@ static void cd_menu_loop_options(void)
 \r
 menu_entry opt2_entries[] =\r
 {\r
+       { "Disable sprite limit",      MB_ONOFF, MA_OPT2_NO_SPRITE_LIM, &PicoOpt, 0x40000, 0, 0, 1, 1 },\r
        { "Emulate Z80",               MB_ONOFF, MA_OPT2_ENABLE_Z80,    &currentConfig.PicoOpt,0x0004, 0, 0, 1 },\r
        { "Emulate YM2612 (FM)",       MB_ONOFF, MA_OPT2_ENABLE_YM2612, &currentConfig.PicoOpt,0x0001, 0, 0, 1 },\r
        { "Emulate SN76496 (PSG)",     MB_ONOFF, MA_OPT2_ENABLE_SN76496,&currentConfig.PicoOpt,0x0002, 0, 0, 1 },\r
@@ -1314,7 +1315,7 @@ static void draw_menu_credits(void)
        int tl_x = 15, tl_y = 64, y;\r
        menu_draw_begin(1);\r
 \r
-       text_out16(tl_x, 20, "PicoDrive v" VERSION " (c) notaz, 2006,2007");\r
+       text_out16(tl_x, 20, "PicoDrive v" VERSION " (c) notaz, 2006-2008");\r
 \r
        y = tl_y;\r
        text_out16(tl_x, y, "Credits:");\r
index c287054..25a0a01 100644 (file)
@@ -27,7 +27,7 @@ endif
 OBJS += main.o emu.o mp3.o menu.o psp.o asm_utils.o\r
 \r
 # common\r
-OBJS += ../common/emu.o ../common/menu.o ../common/fonts.o ../common/readpng.o\r
+OBJS += ../common/emu.o ../common/menu.o ../common/fonts.o ../common/config.o ../common/readpng.o\r
 \r
 # Pico\r
 ifeq "$(amalgamate)" "1"\r
@@ -40,6 +40,9 @@ OBJS += ../../Pico/Area.o ../../Pico/Cart.o ../../Pico/Memory.o ../../Pico/Misc.
 OBJS += ../../Pico/cd/Pico.o ../../Pico/cd/Memory.o ../../Pico/cd/Sek.o ../../Pico/cd/LC89510.o \\r
                ../../Pico/cd/cd_sys.o ../../Pico/cd/cd_file.o ../../Pico/cd/gfx_cd.o \\r
                ../../Pico/cd/Area.o ../../Pico/cd/Misc.o ../../Pico/cd/pcm.o ../../Pico/cd/buffering.o\r
+# Pico - carthw\r
+OBJS += ../../Pico/carthw/carthw.o ../../Pico/carthw/svp/svp.o ../../Pico/carthw/svp/Memory.o \\r
+               ../../Pico/carthw/svp/ssp16.o\r
 endif\r
 \r
 # Pico - sound\r
@@ -170,14 +173,14 @@ endif
 endif\r
 \r
 # ?\r
-rel: EBOOT.PBP readme.txt\r
+rel: EBOOT.PBP readme.txt ../game_def.cfg\r
        mkdir -p PicoDrive/skin/\r
        cp $^ PicoDrive/\r
        cp skin/* PicoDrive/skin/\r
        zip -9 -r ../../PicoDrive_psp_$(VER).zip PicoDrive\r
        rm -rf PicoDrive\r
 \r
-rel_kxploit: readme.txt\r
+rel_kxploit: readme.txt ../game_def.cfg\r
        mkdir -p PicoDrive/skin/\r
        cp $^ PicoDrive/\r
        cp skin/* PicoDrive/skin/\r
index ead5064..acddac5 100644 (file)
@@ -1,2 +1,2 @@
-// pointers must be word aligned
-void do_pal_convert(unsigned short *dest, unsigned short *src, int gammaa_val);
+// pointers must be word aligned, gammaa_val = -4..16, black_lvl = {0,1,2}
+void do_pal_convert(unsigned short *dest, unsigned short *src, int gammaa_val, int black_lvl);
index 11e3a17..30ef7cd 100644 (file)
@@ -14,7 +14,7 @@
 .byte  0,  2,  7, 12, 16, 21, 26, 31 # -3
 .byte  0,  3,  7, 12, 17, 22, 26, 31 # -2
 .byte  0,  4,  8, 13, 17, 22, 26, 31 # -1
-gmtab:
+pal_gmtab:
 .byte  0,  5, 10, 15, 16, 21, 26, 31 #  0
 .byte  0,  6, 10, 15, 19, 23, 27, 31
 .byte  0,  7, 11, 15, 19, 23, 27, 31
@@ -38,11 +38,13 @@ gmtab:
 
 # bbbb bggg gggr rrrr
 
-.global do_pal_convert # dest, src, gammaa_val
+#.global pal_gmtab
+.global do_pal_convert # dest, src, gammaa_val, black_lvl
 
 do_pal_convert:
     bnez    $a2, dpc_gma
     li      $t0, 64/2
+    bnez    $a3, dpc_gma
     lui     $t2, 0x00e
     ori     $t2, 0x00e
     lui     $t3, 0x006
@@ -80,11 +82,22 @@ dpc_loop:
     jr      $ra
     nop
 
+# non-zero gamma
 dpc_gma:
+    slt     $t2, $a2, $0
     sll     $a2, 3
-    lui     $t1, %hi(gmtab)
-    addiu   $t1, %lo(gmtab)
+    lui     $t1, %hi(pal_gmtab)
+    addiu   $t1, %lo(pal_gmtab)
     addu    $a2, $t1
+    beqz    $a3, dpc_gma_loop
+    sb      $0,  0($a2)        # black level 0
+    bnez    $t2, dpc_gma_loop  # gamma < 0, keep black at 0
+    addiu   $a3, -2
+    slt     $t2, $a3, $0       # t2 = a3_orig == 1 ? 1 : 0
+    lb      $t1, 1($a2)
+    addiu   $t1, -2
+    srlv    $t1, $t1, $t2
+    sb      $t1, 0($a2)
 
 dpc_gma_loop:
     lw      $v0, 0($a1)
index d721e20..46de80c 100644 (file)
@@ -19,6 +19,7 @@
 #include "mp3.h"
 #include "asm_utils.h"
 #include "../common/emu.h"
+#include "../common/config.h"
 #include "../common/lprintf.h"
 #include "../../Pico/PicoInt.h"
 
@@ -117,38 +118,46 @@ void emu_Deinit(void)
        sound_deinit();
 }
 
+void emu_prepareDefaultConfig(void)
+{
+       memset(&defaultConfig, 0, sizeof(defaultConfig));
+       defaultConfig.EmuOpt    = 0x1d | 0x680; // | <- confirm_save, cd_leds, acc rend
+       defaultConfig.s_PicoOpt = 0x0f | POPT_EN_MCD_PCM|POPT_EN_MCD_CDDA|POPT_EN_MCD_GFX;
+       defaultConfig.s_PsndRate = 22050;
+       defaultConfig.s_PicoRegion = 0; // auto
+       defaultConfig.s_PicoAutoRgnOrder = 0x184; // US, EU, JP
+       defaultConfig.s_PicoCDBuffers = 64;
+       defaultConfig.Frameskip = -1; // auto
+       defaultConfig.CPUclock = 333;
+       defaultConfig.KeyBinds[ 4] = 1<<0; // SACB RLDU
+       defaultConfig.KeyBinds[ 6] = 1<<1;
+       defaultConfig.KeyBinds[ 7] = 1<<2;
+       defaultConfig.KeyBinds[ 5] = 1<<3;
+       defaultConfig.KeyBinds[14] = 1<<4;
+       defaultConfig.KeyBinds[13] = 1<<5;
+       defaultConfig.KeyBinds[15] = 1<<6;
+       defaultConfig.KeyBinds[ 3] = 1<<7;
+       defaultConfig.KeyBinds[12] = 1<<26; // switch rnd
+       defaultConfig.KeyBinds[ 8] = 1<<27; // save state
+       defaultConfig.KeyBinds[ 9] = 1<<28; // load state
+       defaultConfig.KeyBinds[28] = 1<<0; // num "buttons"
+       defaultConfig.KeyBinds[30] = 1<<1;
+       defaultConfig.KeyBinds[31] = 1<<2;
+       defaultConfig.KeyBinds[29] = 1<<3;
+       defaultConfig.scaling = 1;     // bilinear filtering for psp
+       defaultConfig.scale = 1.20;    // fullscreen
+       defaultConfig.hscale40 = 1.25;
+       defaultConfig.hscale32 = 1.56;
+}
+
 void emu_setDefaultConfig(void)
 {
-       memset(&currentConfig, 0, sizeof(currentConfig));
-       currentConfig.lastRomFile[0] = 0;
-       currentConfig.EmuOpt  = 0x1d | 0x680;  // | confirm_save, cd_leds, acc rend
-       currentConfig.PicoOpt = 0x0f | 0x1c00; // | gfx_cd, cd_pcm, cd_cdda
-       currentConfig.PsndRate = 22050;
-       currentConfig.PicoRegion = 0; // auto
-       currentConfig.PicoAutoRgnOrder = 0x184; // US, EU, JP
-       currentConfig.Frameskip = -1; // auto
-       currentConfig.volume = 50;
-       currentConfig.CPUclock = 333;
-       currentConfig.KeyBinds[ 4] = 1<<0; // SACB RLDU
-       currentConfig.KeyBinds[ 6] = 1<<1;
-       currentConfig.KeyBinds[ 7] = 1<<2;
-       currentConfig.KeyBinds[ 5] = 1<<3;
-       currentConfig.KeyBinds[14] = 1<<4;
-       currentConfig.KeyBinds[13] = 1<<5;
-       currentConfig.KeyBinds[15] = 1<<6;
-       currentConfig.KeyBinds[ 3] = 1<<7;
-       currentConfig.KeyBinds[12] = 1<<26; // switch rnd
-       currentConfig.KeyBinds[ 8] = 1<<27; // save state
-       currentConfig.KeyBinds[ 9] = 1<<28; // load state
-       currentConfig.KeyBinds[28] = 1<<0; // num "buttons"
-       currentConfig.KeyBinds[30] = 1<<1;
-       currentConfig.KeyBinds[31] = 1<<2;
-       currentConfig.KeyBinds[29] = 1<<3;
-       currentConfig.PicoCDBuffers = 64;
-       currentConfig.scaling = 1;     // bilinear filtering for psp
-       currentConfig.scale = 1.20;    // fullscreen
-       currentConfig.hscale40 = 1.25;
-       currentConfig.hscale32 = 1.56;
+       memcpy(&currentConfig, &defaultConfig, sizeof(currentConfig));
+       PicoOpt = currentConfig.s_PicoOpt;
+       PsndRate = currentConfig.s_PsndRate;
+       PicoRegionOverride = currentConfig.s_PicoRegion;
+       PicoAutoRgnOrder = currentConfig.s_PicoAutoRgnOrder;
+       PicoCDBuffers = currentConfig.s_PicoCDBuffers;
 }
 
 
@@ -233,7 +242,7 @@ static void do_pal_update(int allow_sh)
 
        //for (i = 0x3f/2; i >= 0; i--)
        //      dpal[i] = ((spal[i]&0x000f000f)<< 1)|((spal[i]&0x00f000f0)<<3)|((spal[i]&0x0f000f00)<<4);
-       do_pal_convert(localPal, Pico.cram, currentConfig.gamma);
+       do_pal_convert(localPal, Pico.cram, currentConfig.gamma, currentConfig.gamma2);
 
        if (allow_sh && (Pico.video.reg[0xC]&8)) // shadow/hilight?
        {
@@ -276,7 +285,17 @@ static void EmuScanPrepare(void)
                do_pal_update(1);
 }
 
-static int EmuScanSlow(unsigned int num)
+static int EmuScanSlowBegin(unsigned int num)
+{
+       if (!(Pico.video.reg[1]&8)) num += 8;
+
+       if (!dynamic_palette)
+               HighCol = (unsigned char *)VRAM_CACHED_STUFF + num * 512 + 8;
+
+       return 0;
+}
+
+static int EmuScanSlowEnd(unsigned int num)
 {
        if (!(Pico.video.reg[1]&8)) num += 8;
 
@@ -292,8 +311,7 @@ static int EmuScanSlow(unsigned int num)
                int line_len = (Pico.video.reg[12]&1) ? 320 : 256;
                void *dst = (char *)VRAM_STUFF + 512*240 + 512*2*num;
                amips_clut(dst, HighCol + 8, localPal, line_len);
-       } else
-               HighCol = (unsigned char *)VRAM_CACHED_STUFF + (num+1)*512 + 8;
+       }
 
        return 0;
 }
@@ -467,7 +485,8 @@ static void vidResetMode(void)
 
        // slow rend.
        PicoDrawSetColorFormat(-1);
-       PicoScanEnd = EmuScanSlow;
+       PicoScanBegin = EmuScanSlowBegin;
+       PicoScanEnd = EmuScanSlowEnd;
 
        localPal[0xe0] = 0;
        Pico.m.dirtyPal = 1;
@@ -670,7 +689,8 @@ void emu_forcedFrame(void)
        memset32_uncached((int *)psp_screen + 512*264*2/4, 0, 512*8*2/4);
 
        PicoDrawSetColorFormat(-1);
-       PicoScanEnd = EmuScanSlow;
+       PicoScanBegin = EmuScanSlowBegin;
+       PicoScanEnd = EmuScanSlowEnd;
        EmuScanPrepare();
        PicoFrameDrawOnly();
        blit1();
@@ -789,21 +809,6 @@ static void updateKeys(void)
 
        events = (allActions[0] | allActions[1]) >> 16;
 
-       // volume is treated in special way and triggered every frame
-       if ((events & 0x6000) && PsndOut != NULL)
-       {
-               int vol = currentConfig.volume;
-               if (events & 0x2000) {
-                       if (vol < 100) vol++;
-               } else {
-                       if (vol >   0) vol--;
-               }
-               // FrameworkAudio_SetVolume(vol, vol); // TODO
-               sprintf(noticeMsg, "VOL: %02i ", vol);
-               noticeMsgTime = sceKernelGetSystemTimeLow();
-               currentConfig.volume = vol;
-       }
-
        events &= ~prevEvents;
        if (events) RunEvents(events);
        if (movie_data) emu_updateMovie();
@@ -827,9 +832,10 @@ void emu_Loop(void)
 {
        static int mp3_init_done = 0;
        char fpsbuff[24]; // fps count c string
-       unsigned int tval, tval_prev = 0, tval_thissec = 0; // timing
-       int frames_done = 0, frames_shown = 0, oldmodes = 0;
-       int target_fps, target_frametime, lim_time, tval_diff, i;
+       unsigned int tval, tval_thissec = 0; // timing
+       int target_fps, target_frametime, lim_time, tval_diff, i, oldmodes = 0;
+       int pframes_done, pframes_shown; // "period" frames, used for sync
+       int  frames_done,  frames_shown, tval_fpsc = 0; // actual frames
        char *notice = NULL;
 
        lprintf("entered emu_Loop()\n");
@@ -874,6 +880,10 @@ void emu_Loop(void)
        }
 
        sceDisplayWaitVblankStart();
+       pframes_shown = pframes_done =
+        frames_shown =  frames_done = 0;
+
+       tval_fpsc = sceKernelGetSystemTimeLow();
 
        // loop?
        while (engineState == PGS_Running)
@@ -881,11 +891,11 @@ void emu_Loop(void)
                int modes;
 
                tval = sceKernelGetSystemTimeLow();
-               if (reset_timing || tval < tval_prev) {
+               if (reset_timing || tval < tval_fpsc) {
                        //stdbg("timing reset");
                        reset_timing = 0;
                        tval_thissec = tval;
-                       frames_shown = frames_done = 0;
+                       pframes_shown = pframes_done = 0;
                }
 
                // show notice message?
@@ -911,37 +921,41 @@ void emu_Loop(void)
                }
 
                // second passed?
+               if (tval - tval_fpsc >= 1000000)
+               {
+                       if (currentConfig.EmuOpt & 2)
+                               sprintf(fpsbuff, "%02i/%02i  ", frames_shown, frames_done);
+                       frames_done = frames_shown = 0;
+                       tval_fpsc += 1000000;
+               }
+
                if (tval - tval_thissec >= 1000000)
                {
                        // missing 1 frame?
-                       if (currentConfig.Frameskip < 0 && frames_done < target_fps) {
-                               SkipFrame(); frames_done++;
+                       if (currentConfig.Frameskip < 0 && pframes_done < target_fps) {
+                               SkipFrame(); pframes_done++; frames_done++;
                        }
 
-                       if (currentConfig.EmuOpt & 2)
-                               sprintf(fpsbuff, "%02i/%02i  ", frames_shown, frames_done);
-
                        tval_thissec += 1000000;
 
                        if (currentConfig.Frameskip < 0) {
-                               frames_done  -= target_fps; if (frames_done  < 0) frames_done  = 0;
-                               frames_shown -= target_fps; if (frames_shown < 0) frames_shown = 0;
-                               if (frames_shown > frames_done) frames_shown = frames_done;
+                               pframes_done  -= target_fps; if (pframes_done  < 0) pframes_done  = 0;
+                               pframes_shown -= target_fps; if (pframes_shown < 0) pframes_shown = 0;
+                               if (pframes_shown > pframes_done) pframes_shown = pframes_done;
                        } else {
-                               frames_done = frames_shown = 0;
+                               pframes_done = pframes_shown = 0;
                        }
                }
 #ifdef PFRAMES
                sprintf(fpsbuff, "%i", Pico.m.frame_count);
 #endif
 
-               tval_prev = tval;
-               lim_time = (frames_done+1) * target_frametime;
+               lim_time = (pframes_done+1) * target_frametime;
                if (currentConfig.Frameskip >= 0) // frameskip enabled
                {
                        for (i = 0; i < currentConfig.Frameskip; i++) {
                                updateKeys();
-                               SkipFrame(); frames_done++;
+                               SkipFrame(); pframes_done++; frames_done++;
                                if (!(currentConfig.EmuOpt&0x40000)) { // do framelimitting if needed
                                        int tval_diff;
                                        tval = sceKernelGetSystemTimeLow();
@@ -957,7 +971,7 @@ void emu_Loop(void)
                        int tval_diff;
                        tval = sceKernelGetSystemTimeLow();
                        tval_diff = (int)(tval - tval_thissec) << 8;
-                       if (tval_diff > lim_time && (frames_done/16 < frames_shown))
+                       if (tval_diff > lim_time && (pframes_done/16 < pframes_shown))
                        {
                                // no time left for this frame - skip
                                if (tval_diff - lim_time >= (300000<<8)) {
@@ -965,7 +979,7 @@ void emu_Loop(void)
                                        continue;
                                }
                                updateKeys();
-                               SkipFrame(); frames_done++;
+                               SkipFrame(); pframes_done++; frames_done++;
                                continue;
                        }
                }
@@ -985,8 +999,9 @@ void emu_Loop(void)
 
                blit2(fpsbuff, notice, tval_diff > lim_time);
 
-               if (currentConfig.Frameskip < 0 && tval_diff - lim_time >= (300000<<8)) // slowdown detection
+               if (currentConfig.Frameskip < 0 && tval_diff - lim_time >= (300000<<8)) // slowdown detection
                        reset_timing = 1;
+               }
                else if (!(currentConfig.EmuOpt&0x40000) || currentConfig.Frameskip < 0)
                {
                        // sleep if we are still too fast
@@ -997,7 +1012,8 @@ void emu_Loop(void)
                        }
                }
 
-               frames_done++; frames_shown++;
+               pframes_done++; pframes_shown++;
+                frames_done++;  frames_shown++;
        }
 
 
index bf3069c..e947b43 100644 (file)
@@ -33,6 +33,7 @@ int pico_main(void)
 {
        lprintf("\nPicoDrive v" VERSION " " __DATE__ " " __TIME__ "\n");
        psp_init();
+       emu_prepareDefaultConfig();
        emu_ReadConfig(0, 0);
        emu_Init();
        menu_init();
@@ -49,7 +50,7 @@ int pico_main(void)
 #ifndef GPROF
                                menu_loop();
 #else
-                               strcpy(romFileName, currentConfig.lastRomFile);
+                               strcpy(romFileName, lastRomFile);
                                engineState = PGS_ReloadRom;
 #endif
                                break;
index fda3ead..1613cfb 100644 (file)
@@ -33,7 +33,7 @@
 
 
 #define pspKeyUnkn "???"
-static const char * const pspKeyNames[] = {
+const char * const keyNames[] = {
        "SELECT",   pspKeyUnkn, pspKeyUnkn, "START",    "UP",       "RIGHT",     "DOWN",     "LEFT",
        "L",        "R",        pspKeyUnkn, pspKeyUnkn, "TRIANGLE", "CIRCLE",    "X",        "SQUARE",
        "HOME",     "HOLD",     "WLAN_UP",  "REMOTE",   "VOLUP",    "VOLDOWN",   "SCREEN",   "NOTE",
@@ -668,10 +668,10 @@ static char *action_binds(int player_idx, int action_mask)
                        if (player_idx >= 0 && ((currentConfig.KeyBinds[i] >> 16) & 3) != player_idx) continue;
                        if (strkeys[0]) {
                                strcat(strkeys, i >= 28 ? ", " : " + "); // nub "buttons" don't create combos
-                               strcat(strkeys, pspKeyNames[i]);
+                               strcat(strkeys, keyNames[i]);
                                break;
                        }
-                       else strcpy(strkeys, pspKeyNames[i]);
+                       else strcpy(strkeys, keyNames[i]);
                }
        }
 
@@ -699,7 +699,7 @@ static int count_bound_keys(int action, int pl_idx)
        return keys;
 }
 
-static void draw_key_config(const bind_action_t *opts, int opt_cnt, int player_idx, int sel)
+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;
 
@@ -733,7 +733,7 @@ static void draw_key_config(const bind_action_t *opts, int opt_cnt, int player_i
        menu_draw_end();
 }
 
-static void key_config_loop(const bind_action_t *opts, int opt_cnt, int player_idx)
+static void key_config_loop(const me_bind_action *opts, int opt_cnt, int player_idx)
 {
        int sel = 0, menu_sel_max = opt_cnt, prev_select = 0, i;
        unsigned long inp = 0;
@@ -804,7 +804,7 @@ static void kc_sel_loop(void)
 {
        int menu_sel = 3, menu_sel_max = 3;
        unsigned long inp = 0;
-       int is_6button = currentConfig.PicoOpt & 0x020;
+       int is_6button = PicoOpt & POPT_6BTN_PAD;
 
        while (1)
        {
@@ -831,20 +831,21 @@ static void kc_sel_loop(void)
 
 menu_entry cdopt_entries[] =
 {
-       { NULL,                        MB_NONE,  MA_CDOPT_TESTBIOS_USA, NULL, 0, 0, 0, 1 },
-       { NULL,                        MB_NONE,  MA_CDOPT_TESTBIOS_EUR, NULL, 0, 0, 0, 1 },
-       { NULL,                        MB_NONE,  MA_CDOPT_TESTBIOS_JAP, NULL, 0, 0, 0, 1 },
-       { "CD LEDs",                   MB_ONOFF, MA_CDOPT_LEDS,         &currentConfig.EmuOpt,  0x0400, 0, 0, 1 },
-       { "CDDA audio (using mp3s)",   MB_ONOFF, MA_CDOPT_CDDA,         &currentConfig.PicoOpt, 0x0800, 0, 0, 1 },
-       { "PCM audio",                 MB_ONOFF, MA_CDOPT_PCM,          &currentConfig.PicoOpt, 0x0400, 0, 0, 1 },
-       { NULL,                        MB_NONE,  MA_CDOPT_READAHEAD,    NULL, 0, 0, 0, 1 },
-       { "SaveRAM cart",              MB_ONOFF, MA_CDOPT_SAVERAM,      &currentConfig.PicoOpt, 0x8000, 0, 0, 1 },
-       { "Scale/Rot. fx (slow)",      MB_ONOFF, MA_CDOPT_SCALEROT_CHIP,&currentConfig.PicoOpt, 0x1000, 0, 0, 1 },
-       { "Better sync (slow)",        MB_ONOFF, MA_CDOPT_BETTER_SYNC,  &currentConfig.PicoOpt, 0x2000, 0, 0, 1 },
-       { "done",                      MB_NONE,  MA_CDOPT_DONE,         NULL, 0, 0, 0, 1 },
+       { NULL,                        MB_NONE,  MA_CDOPT_TESTBIOS_USA, NULL, 0, 0, 0, 1, 0 },
+       { NULL,                        MB_NONE,  MA_CDOPT_TESTBIOS_EUR, NULL, 0, 0, 0, 1, 0 },
+       { NULL,                        MB_NONE,  MA_CDOPT_TESTBIOS_JAP, NULL, 0, 0, 0, 1, 0 },
+       { "CD LEDs",                   MB_ONOFF, MA_CDOPT_LEDS,         &currentConfig.EmuOpt,  0x0400, 0, 0, 1, 1 },
+       { "CDDA audio (using mp3s)",   MB_ONOFF, MA_CDOPT_CDDA,         &PicoOpt, 0x0800, 0, 0, 1, 1 },
+       { "PCM audio",                 MB_ONOFF, MA_CDOPT_PCM,          &PicoOpt, 0x0400, 0, 0, 1, 1 },
+       { NULL,                        MB_NONE,  MA_CDOPT_READAHEAD,    NULL, 0, 0, 0, 1, 1 },
+       { "SaveRAM cart",              MB_ONOFF, MA_CDOPT_SAVERAM,      &PicoOpt, 0x8000, 0, 0, 1, 1 },
+       { "Scale/Rot. fx (slow)",      MB_ONOFF, MA_CDOPT_SCALEROT_CHIP,&PicoOpt, 0x1000, 0, 0, 1, 1 },
+       { "Better sync (slow)",        MB_ONOFF, MA_CDOPT_BETTER_SYNC,  &PicoOpt, 0x2000, 0, 0, 1, 1 },
+       { "done",                      MB_NONE,  MA_CDOPT_DONE,         NULL, 0, 0, 0, 1, 0 },
 };
 
 #define CDOPT_ENTRY_COUNT (sizeof(cdopt_entries) / sizeof(cdopt_entries[0]))
+const int cdopt_entry_count = CDOPT_ENTRY_COUNT;
 
 
 struct bios_names_t
@@ -984,19 +985,21 @@ static void cd_menu_loop_options(void)
 
 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,     &currentConfig.scaling, 1,  0,  0, 1 },
-       { NULL,                        MB_RANGE, MA_OPT3_GAMMAA,        &currentConfig.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 },
+       { NULL,                        MB_NONE,  MA_OPT3_SCALE,         NULL, 0, 0, 0, 1, 1 },
+       { NULL,                        MB_NONE,  MA_OPT3_HSCALE32,      NULL, 0, 0, 0, 1, 1 },
+       { NULL,                        MB_NONE,  MA_OPT3_HSCALE40,      NULL, 0, 0, 0, 1, 1 },
+       { NULL,                        MB_ONOFF, MA_OPT3_FILTERING,     &currentConfig.scaling, 1,  0,  0, 1, 1 },
+       { NULL,                        MB_RANGE, MA_OPT3_GAMMAA,        &currentConfig.gamma,   0, -4, 16, 1, 1 },
+       { NULL,                        MB_RANGE, MA_OPT3_BLACKLVL,      &currentConfig.gamma2,  0,  0,  2, 1, 1 },
+       { NULL,                        MB_NONE,  MA_OPT3_VSYNC,         NULL, 0, 0, 0, 1, 1 },
+       { "Set to unscaled centered",  MB_NONE,  MA_OPT3_PRES_NOSCALE,  NULL, 0, 0, 0, 1, 0 },
+       { "Set to 4:3 scaled",         MB_NONE,  MA_OPT3_PRES_SCALE43,  NULL, 0, 0, 0, 1, 0 },
+       { "Set to fullscreen",         MB_NONE,  MA_OPT3_PRES_FULLSCR,  NULL, 0, 0, 0, 1, 0 },
+       { "done",                      MB_NONE,  MA_OPT3_DONE,          NULL, 0, 0, 0, 1, 0 },
 };
 
 #define OPT3_ENTRY_COUNT (sizeof(opt3_entries) / sizeof(opt3_entries[0]))
+const int opt3_entry_count = OPT3_ENTRY_COUNT;
 
 
 static void menu_opt3_cust_draw(const menu_entry *entry, int x, int y, void *param)
@@ -1018,6 +1021,9 @@ static void menu_opt3_cust_draw(const menu_entry *entry, int x, int y, void *par
                case MA_OPT3_GAMMAA:
                        text_out16(x, y, "Gamma adjustment                  %2i", currentConfig.gamma);
                        break;
+               case MA_OPT3_BLACKLVL:
+                       text_out16(x, y, "Black level                       %2i", currentConfig.gamma2);
+                       break;
                case MA_OPT3_VSYNC: {
                        char *val = "    never";
                        if (currentConfig.EmuOpt & 0x2000)
@@ -1102,8 +1108,10 @@ static void dispmenu_loop_options(void)
                                case MA_OPT3_HSCALE40:  setting = &currentConfig.hscale40; is_32col = 0; break;
                                case MA_OPT3_HSCALE32:  setting = &currentConfig.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);
+                               case MA_OPT3_GAMMAA:
+                               case MA_OPT3_BLACKLVL:  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;
                                        currentConfig.EmuOpt &= ~0x12000;
@@ -1156,17 +1164,19 @@ static void dispmenu_loop_options(void)
 
 menu_entry opt2_entries[] =
 {
-       { "Emulate Z80",               MB_ONOFF, MA_OPT2_ENABLE_Z80,     &currentConfig.PicoOpt,0x00004, 0, 0, 1 },
-       { "Emulate YM2612 (FM)",       MB_ONOFF, MA_OPT2_ENABLE_YM2612,  &currentConfig.PicoOpt,0x00001, 0, 0, 1 },
-       { "Emulate SN76496 (PSG)",     MB_ONOFF, MA_OPT2_ENABLE_SN76496, &currentConfig.PicoOpt,0x00002, 0, 0, 1 },
-       { "gzip savestates",           MB_ONOFF, MA_OPT2_GZIP_STATES,    &currentConfig.EmuOpt, 0x00008, 0, 0, 1 },
-       { "Don't save last used ROM",  MB_ONOFF, MA_OPT2_NO_LAST_ROM,    &currentConfig.EmuOpt, 0x00020, 0, 0, 1 },
-       { "Status line in main menu",  MB_ONOFF, MA_OPT2_STATUS_LINE,    &currentConfig.EmuOpt, 0x20000, 0, 0, 1 },
-       { "Disable frame limitter",    MB_ONOFF, MA_OPT2_NO_FRAME_LIMIT, &currentConfig.EmuOpt, 0x40000, 0, 0, 1 },
-       { "done",                      MB_NONE,  MA_OPT2_DONE,           NULL, 0, 0, 0, 1 },
+       { "Disable sprite limit",      MB_ONOFF, MA_OPT2_NO_SPRITE_LIM,  &PicoOpt, 0x40000, 0, 0, 1, 1 },
+       { "Emulate Z80",               MB_ONOFF, MA_OPT2_ENABLE_Z80,     &PicoOpt, 0x00004, 0, 0, 1, 1 },
+       { "Emulate YM2612 (FM)",       MB_ONOFF, MA_OPT2_ENABLE_YM2612,  &PicoOpt, 0x00001, 0, 0, 1, 1 },
+       { "Emulate SN76496 (PSG)",     MB_ONOFF, MA_OPT2_ENABLE_SN76496, &PicoOpt, 0x00002, 0, 0, 1, 1 },
+       { "gzip savestates",           MB_ONOFF, MA_OPT2_GZIP_STATES,    &currentConfig.EmuOpt, 0x00008, 0, 0, 1, 1 },
+       { "Don't save last used ROM",  MB_ONOFF, MA_OPT2_NO_LAST_ROM,    &currentConfig.EmuOpt, 0x00020, 0, 0, 1, 1 },
+       { "Status line in main menu",  MB_ONOFF, MA_OPT2_STATUS_LINE,    &currentConfig.EmuOpt, 0x20000, 0, 0, 1, 1 },
+       { "Disable frame limitter",    MB_ONOFF, MA_OPT2_NO_FRAME_LIMIT, &currentConfig.EmuOpt, 0x40000, 0, 0, 1, 1 },
+       { "done",                      MB_NONE,  MA_OPT2_DONE,           NULL, 0, 0, 0, 1, 0 },
 };
 
 #define OPT2_ENTRY_COUNT (sizeof(opt2_entries) / sizeof(opt2_entries[0]))
+const int opt2_entry_count = OPT2_ENTRY_COUNT;
 
 
 static void draw_amenu_options(int menu_sel)
@@ -1219,28 +1229,29 @@ static void amenu_loop_options(void)
 
 menu_entry opt_entries[] =
 {
-       { NULL,                        MB_NONE,  MA_OPT_RENDERER,      NULL, 0, 0, 0, 1 },
-       { "Accurate timing (slower)",  MB_ONOFF, MA_OPT_ACC_TIMING,    &currentConfig.PicoOpt, 0x0040, 0, 0, 1 },
-       { "Accurate sprites (slower)", MB_ONOFF, MA_OPT_ACC_SPRITES,   &currentConfig.PicoOpt, 0x0080, 0, 0, 1 },
-       { "Show FPS",                  MB_ONOFF, MA_OPT_SHOW_FPS,      &currentConfig.EmuOpt,  0x0002, 0, 0, 1 },
-       { NULL,                        MB_RANGE, MA_OPT_FRAMESKIP,     &currentConfig.Frameskip, 0, -1, 16, 1 },
-       { "Enable sound",              MB_ONOFF, MA_OPT_ENABLE_SOUND,  &currentConfig.EmuOpt,  0x0004, 0, 0, 1 },
-       { NULL,                        MB_NONE,  MA_OPT_SOUND_QUALITY, NULL, 0, 0, 0, 1 },
-       { "6 button pad",              MB_ONOFF, MA_OPT_6BUTTON_PAD,   &currentConfig.PicoOpt, 0x0020, 0, 0, 1 },
-       { NULL,                        MB_NONE,  MA_OPT_REGION,        NULL, 0, 0, 0, 1 },
-       { "Use SRAM/BRAM savestates",  MB_ONOFF, MA_OPT_SRAM_STATES,   &currentConfig.EmuOpt,  0x0001, 0, 0, 1 },
-       { NULL,                        MB_NONE,  MA_OPT_CONFIRM_STATES,NULL, 0, 0, 0, 1 },
-       { "Save slot",                 MB_RANGE, MA_OPT_SAVE_SLOT,     &state_slot, 0, 0, 9, 1 },
-       { NULL,                        MB_NONE,  MA_OPT_CPU_CLOCKS,    NULL, 0, 0, 0, 1 },
-       { "[Display options]",         MB_NONE,  MA_OPT_DISP_OPTS,     NULL, 0, 0, 0, 1 },
-       { "[Sega/Mega CD options]",    MB_NONE,  MA_OPT_SCD_OPTS,      NULL, 0, 0, 0, 1 },
-       { "[Advanced options]",        MB_NONE,  MA_OPT_ADV_OPTS,      NULL, 0, 0, 0, 1 },
-       { NULL,                        MB_NONE,  MA_OPT_SAVECFG,       NULL, 0, 0, 0, 1 },
-       { "Save cfg for current game only",MB_NONE,MA_OPT_SAVECFG_GAME,NULL, 0, 0, 0, 1 },
-       { NULL,                        MB_NONE,  MA_OPT_LOADCFG,       NULL, 0, 0, 0, 1 },
+       { 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 },
+       { "Show FPS",                  MB_ONOFF, MA_OPT_SHOW_FPS,      &currentConfig.EmuOpt,  0x0002,  0,  0, 1, 1 },
+       { NULL,                        MB_RANGE, MA_OPT_FRAMESKIP,     &currentConfig.Frameskip,    0, -1, 16, 1, 1 },
+       { "Enable sound",              MB_ONOFF, MA_OPT_ENABLE_SOUND,  &currentConfig.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,   &currentConfig.EmuOpt,  0x0001, 0, 0, 1, 1 },
+       { NULL,                        MB_NONE,  MA_OPT_CONFIRM_STATES,NULL, 0, 0, 0, 1, 1 },
+       { "Save slot",                 MB_RANGE, MA_OPT_SAVE_SLOT,     &state_slot, 0, 0, 9, 1, 1 },
+       { NULL,                        MB_NONE,  MA_OPT_CPU_CLOCKS,    NULL, 0, 0, 0, 1, 1 },
+       { "[Display options]",         MB_NONE,  MA_OPT_DISP_OPTS,     NULL, 0, 0, 0, 1, 0 },
+       { "[Sega/Mega CD options]",    MB_NONE,  MA_OPT_SCD_OPTS,      NULL, 0, 0, 0, 1, 0 },
+       { "[Advanced options]",        MB_NONE,  MA_OPT_ADV_OPTS,      NULL, 0, 0, 0, 1, 0 },
+       { NULL,                        MB_NONE,  MA_OPT_SAVECFG,       NULL, 0, 0, 0, 1, 0 },
+       { "Save cfg for current game only",MB_NONE,MA_OPT_SAVECFG_GAME,NULL, 0, 0, 0, 1, 0 },
+       { NULL,                        MB_NONE,  MA_OPT_LOADCFG,       NULL, 0, 0, 0, 1, 0 },
 };
 
 #define OPT_ENTRY_COUNT (sizeof(opt_entries) / sizeof(opt_entries[0]))
+const int opt_entry_count = OPT_ENTRY_COUNT;
 
 
 static void menu_opt_cust_draw(const menu_entry *entry, int x, int y, void *param)
@@ -1250,9 +1261,9 @@ static void menu_opt_cust_draw(const menu_entry *entry, int x, int y, void *para
        switch (entry->id)
        {
                case MA_OPT_RENDERER:
-                       if (currentConfig.PicoOpt&0x10)
+                       if (PicoOpt & 0x10)
                                str = "fast";
-                       else if (currentConfig.EmuOpt&0x80)
+                       else if (currentConfig.EmuOpt & 0x80)
                                str = "accurate";
                        else
                                str = " 8bit accurate"; // n/a
@@ -1265,8 +1276,8 @@ static void menu_opt_cust_draw(const menu_entry *entry, int x, int y, void *para
                        text_out16(x, y, "Frameskip                  %s", str24);
                        break;
                case MA_OPT_SOUND_QUALITY:
-                       str = (currentConfig.PicoOpt&0x08)?"stereo":"mono";
-                       text_out16(x, y, "Sound Quality:     %5iHz %s", currentConfig.PsndRate, str);
+                       str = (PicoOpt&0x08)?"stereo":"mono";
+                       text_out16(x, y, "Sound Quality:     %5iHz %s", PsndRate, str);
                        break;
                case MA_OPT_REGION:
                        text_out16(x, y, "Region:              %s", me_region_name(PicoRegionOverride, PicoAutoRgnOrder));
@@ -1350,13 +1361,11 @@ static void region_prevnext(int right)
 
 static void menu_options_save(void)
 {
-       PicoOpt = currentConfig.PicoOpt;
-       PsndRate = currentConfig.PsndRate;
        if (PicoRegionOverride) {
                // force setting possibly changed..
                Pico.m.pal = (PicoRegionOverride == 2 || PicoRegionOverride == 8) ? 1 : 0;
        }
-       if (!(PicoOpt & 0x20)) {
+       if (!(PicoOpt & POPT_6BTN_PAD)) {
                // unbind XYZ MODE, just in case
                unbind_action(0xf00);
        }
@@ -1369,9 +1378,6 @@ static int menu_loop_options(void)
        unsigned long inp = 0;
        menu_id selected_id;
 
-       currentConfig.PicoOpt = PicoOpt;
-       currentConfig.PsndRate = PsndRate;
-
        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;
@@ -1388,16 +1394,16 @@ static int menu_loop_options(void)
                        if (!me_process(opt_entries, OPT_ENTRY_COUNT, selected_id, (inp&BTN_RIGHT) ? 1 : 0)) {
                                switch (selected_id) {
                                        case MA_OPT_RENDERER:
-                                               if ((currentConfig.PicoOpt&0x10) || !(currentConfig.EmuOpt &0x80)) {
-                                                       currentConfig.PicoOpt&= ~0x10;
+                                               if ((PicoOpt & 0x10) || !(currentConfig.EmuOpt & 0x80)) {
+                                                       PicoOpt &= ~0x10;
                                                        currentConfig.EmuOpt |=  0x80;
                                                } else {
-                                                       currentConfig.PicoOpt|=  0x10;
+                                                       PicoOpt |=  0x10;
                                                        currentConfig.EmuOpt &= ~0x80;
                                                }
                                                break;
                                        case MA_OPT_SOUND_QUALITY:
-                                               currentConfig.PsndRate = sndrate_prevnext(currentConfig.PsndRate, inp & BTN_RIGHT);
+                                               PsndRate = sndrate_prevnext(PsndRate, inp & BTN_RIGHT);
                                                break;
                                        case MA_OPT_REGION:
                                                region_prevnext(inp & BTN_RIGHT);
@@ -1493,7 +1499,7 @@ static void draw_menu_credits(void)
        int tl_x = 80+15, tl_y = 16+64, y;
        menu_draw_begin();
 
-       text_out16(tl_x, 16+20, "PicoDrive v" VERSION " (c) notaz, 2006,2007");
+       text_out16(tl_x, 16+20, "PicoDrive v" VERSION " (c) notaz, 2006-2008");
 
        y = tl_y;
        text_out16(tl_x, y, "Credits:");
@@ -1633,10 +1639,10 @@ static void menu_loop_root(void)
                                {
                                        char curr_path[PATH_MAX], *selfname;
                                        FILE *tstf;
-                                       if ( (tstf = fopen(currentConfig.lastRomFile, "rb")) )
+                                       if ( (tstf = fopen(lastRomFile, "rb")) )
                                        {
                                                fclose(tstf);
-                                               strcpy(curr_path, currentConfig.lastRomFile);
+                                               strcpy(curr_path, lastRomFile);
                                        }
                                        else
                                                getcwd(curr_path, PATH_MAX);
@@ -1779,10 +1785,10 @@ int menu_loop_tray(void)
 
        menu_gfx_prepare();
 
-       if ( (tstf = fopen(currentConfig.lastRomFile, "rb")) )
+       if ( (tstf = fopen(lastRomFile, "rb")) )
        {
                fclose(tstf);
-               strcpy(curr_path, currentConfig.lastRomFile);
+               strcpy(curr_path, lastRomFile);
        }
        else
        {
index 95717b1..9b9d909 100644 (file)
@@ -1,2 +1,2 @@
-#define VERSION "1.40"\r
+#define VERSION "1.40b"\r
 \r