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"
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);
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;
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;
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;
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);
};
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];
#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);
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);
{
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;
}
return 1;
case MA_OPT_SCALING:
+#ifdef __GP2X__
if (strcasecmp(var, "Scaling") != 0) return 0;
if (strcasecmp(val, "OFF") == 0) {
currentConfig.scaling = 0;
} else
return 0;
return 1;
+#else
+ return 0;
+#endif
case MA_OPT_FRAMESKIP:
if (strcasecmp(var, "Frameskip") != 0) return 0;
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;
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;
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;
#include "mp3.h"
#include "asm_utils.h"
#include "../common/emu.h"
+#include "../common/config.h"
#include "../common/lprintf.h"
#include "../../Pico/PicoInt.h"
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(¤tConfig, 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(¤tConfig, &defaultConfig, sizeof(currentConfig));
+ PicoOpt = currentConfig.s_PicoOpt;
+ PsndRate = currentConfig.s_PsndRate;
+ PicoRegionOverride = currentConfig.s_PicoRegion;
+ PicoAutoRgnOrder = currentConfig.s_PicoAutoRgnOrder;
+ PicoCDBuffers = currentConfig.s_PicoCDBuffers;
}
//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?
{
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;
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;
}
// slow rend.
PicoDrawSetColorFormat(-1);
- PicoScanEnd = EmuScanSlow;
+ PicoScanBegin = EmuScanSlowBegin;
+ PicoScanEnd = EmuScanSlowEnd;
localPal[0xe0] = 0;
Pico.m.dirtyPal = 1;
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();
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();
{
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");
}
sceDisplayWaitVblankStart();
+ pframes_shown = pframes_done =
+ frames_shown = frames_done = 0;
+
+ tval_fpsc = sceKernelGetSystemTimeLow();
// loop?
while (engineState == PGS_Running)
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?
}
// 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();
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)) {
continue;
}
updateKeys();
- SkipFrame(); frames_done++;
+ SkipFrame(); pframes_done++; frames_done++;
continue;
}
}
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
}
}
- frames_done++; frames_shown++;
+ pframes_done++; pframes_shown++;
+ frames_done++; frames_shown++;
}
#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",
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]);
}
}
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;
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;
{
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)
{
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, ¤tConfig.EmuOpt, 0x0400, 0, 0, 1 },
- { "CDDA audio (using mp3s)", MB_ONOFF, MA_CDOPT_CDDA, ¤tConfig.PicoOpt, 0x0800, 0, 0, 1 },
- { "PCM audio", MB_ONOFF, MA_CDOPT_PCM, ¤tConfig.PicoOpt, 0x0400, 0, 0, 1 },
- { NULL, MB_NONE, MA_CDOPT_READAHEAD, NULL, 0, 0, 0, 1 },
- { "SaveRAM cart", MB_ONOFF, MA_CDOPT_SAVERAM, ¤tConfig.PicoOpt, 0x8000, 0, 0, 1 },
- { "Scale/Rot. fx (slow)", MB_ONOFF, MA_CDOPT_SCALEROT_CHIP,¤tConfig.PicoOpt, 0x1000, 0, 0, 1 },
- { "Better sync (slow)", MB_ONOFF, MA_CDOPT_BETTER_SYNC, ¤tConfig.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, ¤tConfig.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
menu_entry opt3_entries[] =
{
- { NULL, MB_NONE, MA_OPT3_SCALE, NULL, 0, 0, 0, 1 },
- { NULL, MB_NONE, MA_OPT3_HSCALE32, NULL, 0, 0, 0, 1 },
- { NULL, MB_NONE, MA_OPT3_HSCALE40, NULL, 0, 0, 0, 1 },
- { NULL, MB_ONOFF, MA_OPT3_FILTERING, ¤tConfig.scaling, 1, 0, 0, 1 },
- { NULL, MB_RANGE, MA_OPT3_GAMMAA, ¤tConfig.gamma, 0, -4, 16, 1 },
- { NULL, MB_NONE, MA_OPT3_VSYNC, NULL, 0, 0, 0, 1 },
- { "Set to unscaled centered", MB_NONE, MA_OPT3_PRES_NOSCALE, NULL, 0, 0, 0, 1 },
- { "Set to 4:3 scaled", MB_NONE, MA_OPT3_PRES_SCALE43, NULL, 0, 0, 0, 1 },
- { "Set to fullscreen", MB_NONE, MA_OPT3_PRES_FULLSCR, NULL, 0, 0, 0, 1 },
- { "done", MB_NONE, MA_OPT3_DONE, NULL, 0, 0, 0, 1 },
+ { 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, ¤tConfig.scaling, 1, 0, 0, 1, 1 },
+ { NULL, MB_RANGE, MA_OPT3_GAMMAA, ¤tConfig.gamma, 0, -4, 16, 1, 1 },
+ { NULL, MB_RANGE, MA_OPT3_BLACKLVL, ¤tConfig.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)
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)
case MA_OPT3_HSCALE40: setting = ¤tConfig.hscale40; is_32col = 0; break;
case MA_OPT3_HSCALE32: setting = ¤tConfig.hscale32; is_32col = 1; break;
case MA_OPT3_FILTERING:
- case MA_OPT3_GAMMAA: menu_opt3_preview(is_32col); break;
- case MA_OPT3_VSYNC: tmp = ((currentConfig.EmuOpt>>13)&1) | ((currentConfig.EmuOpt>>15)&2);
+ 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;
menu_entry opt2_entries[] =
{
- { "Emulate Z80", MB_ONOFF, MA_OPT2_ENABLE_Z80, ¤tConfig.PicoOpt,0x00004, 0, 0, 1 },
- { "Emulate YM2612 (FM)", MB_ONOFF, MA_OPT2_ENABLE_YM2612, ¤tConfig.PicoOpt,0x00001, 0, 0, 1 },
- { "Emulate SN76496 (PSG)", MB_ONOFF, MA_OPT2_ENABLE_SN76496, ¤tConfig.PicoOpt,0x00002, 0, 0, 1 },
- { "gzip savestates", MB_ONOFF, MA_OPT2_GZIP_STATES, ¤tConfig.EmuOpt, 0x00008, 0, 0, 1 },
- { "Don't save last used ROM", MB_ONOFF, MA_OPT2_NO_LAST_ROM, ¤tConfig.EmuOpt, 0x00020, 0, 0, 1 },
- { "Status line in main menu", MB_ONOFF, MA_OPT2_STATUS_LINE, ¤tConfig.EmuOpt, 0x20000, 0, 0, 1 },
- { "Disable frame limitter", MB_ONOFF, MA_OPT2_NO_FRAME_LIMIT, ¤tConfig.EmuOpt, 0x40000, 0, 0, 1 },
- { "done", MB_NONE, MA_OPT2_DONE, NULL, 0, 0, 0, 1 },
+ { "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, ¤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 },
+ { "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)
menu_entry opt_entries[] =
{
- { NULL, MB_NONE, MA_OPT_RENDERER, NULL, 0, 0, 0, 1 },
- { "Accurate timing (slower)", MB_ONOFF, MA_OPT_ACC_TIMING, ¤tConfig.PicoOpt, 0x0040, 0, 0, 1 },
- { "Accurate sprites (slower)", MB_ONOFF, MA_OPT_ACC_SPRITES, ¤tConfig.PicoOpt, 0x0080, 0, 0, 1 },
- { "Show FPS", MB_ONOFF, MA_OPT_SHOW_FPS, ¤tConfig.EmuOpt, 0x0002, 0, 0, 1 },
- { NULL, MB_RANGE, MA_OPT_FRAMESKIP, ¤tConfig.Frameskip, 0, -1, 16, 1 },
- { "Enable sound", MB_ONOFF, MA_OPT_ENABLE_SOUND, ¤tConfig.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, ¤tConfig.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, ¤tConfig.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, ¤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 },
+ { "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)
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
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));
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);
}
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;
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);
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:");
{
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);
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
{