From 6fc5714482ecd4da20c3d5189b607afafc72b248 Mon Sep 17 00:00:00 2001 From: notaz Date: Sat, 5 Apr 2008 19:51:49 +0000 Subject: [PATCH] psp code updated for latest base, black level git-svn-id: file:///home/notaz/opt/svn/PicoDrive@415 be3aeb3a-fb24-0410-a615-afba39da0efa --- Pico/carthw/svp/svp.c | 9 ++- platform/base_readme.txt | 21 +++-- platform/common/config.c | 140 +++++++++++++++++++++++++++++++--- platform/common/emu.c | 15 +++- platform/common/emu.h | 3 +- platform/common/menu.h | 1 + platform/gizmondo/menu.c | 3 +- platform/psp/Makefile | 9 ++- platform/psp/asm_utils.h | 4 +- platform/psp/asm_utils.s | 21 ++++- platform/psp/emu.c | 160 +++++++++++++++++++++------------------ platform/psp/main.c | 3 +- platform/psp/menu.c | 156 ++++++++++++++++++++------------------ platform/psp/version.h | 2 +- 14 files changed, 367 insertions(+), 180 deletions(-) diff --git a/Pico/carthw/svp/svp.c b/Pico/carthw/svp/svp.c index 8d09f494..0c7585aa 100644 --- a/Pico/carthw/svp/svp.c +++ b/Pico/carthw/svp/svp.c @@ -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; diff --git a/platform/base_readme.txt b/platform/base_readme.txt index 3e6e48de..7d0dcc3d 100644 --- a/platform/base_readme.txt +++ b/platform/base_readme.txt @@ -636,8 +636,16 @@ Additional thanks Changelog --------- +1.40b + * Fixed sprite masking code. Thanks to Lordus for explaining how it works. + + Added "disable sprite limit" option. + + PSP: added black level adjustment to display options. + * Changed reset to act as 'soft' reset. + + Added detection for Puggsy (it doesn't really have sram). + * Some small timing adjustments. + 1.40a - * Fixed a binding problem with up and down keys. + * GP2X: Fixed a binding problem with up and down keys. * Default game config no longer overrides global user config. 1.40 @@ -648,16 +656,17 @@ Changelog configs are now held in single file (but old game config files are still read when new one is missing). * Fixed a bug where some key combos didn't work as expected. - * Fixed a regression in renderer (some graphic glitches in rare cases). + * Fixed a regression in renderer (ARM ports only, some graphic glitches in + rare cases). * Adjusted fast renderer to work with more games, including VR. * Fixed a problem where SegaCD RAM cart data was getting lost on reset. - * Greatly reduced SegaCD FMV game slowdowns by disabling read-ahead in the - Linux kernel and C library (thanks to Rokas and Exophase for ideas again). - Be sure to keep "ReadAhead buffer" OFF to avoid slowdowns. + * GP2X: Greatly reduced SegaCD FMV game slowdowns by disabling read-ahead + in the Linux kernel and C library (thanks to Rokas and Exophase for ideas + again). Be sure to keep "ReadAhead buffer" OFF to avoid slowdowns. + PicoDrive now comes with a game config file for some games which need special settings, so they should now work out-of-the-box. More games will be added with later updates. - + Files now can be deleted by pressing A+SELECT in the file browser. + + GP2X: Files now can be deleted by pressing A+SELECT in the file browser. 1.35b * PSP: mp3 code should no longer fail on 1.5 firmware. diff --git a/platform/common/config.c b/platform/common/config.c index f4d25463..d4833f6f 100644 --- a/platform/common/config.c +++ b/platform/common/config.c @@ -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; diff --git a/platform/common/emu.c b/platform/common/emu.c index e4cce672..feb31676 100644 --- a/platform/common/emu.c +++ b/platform/common/emu.c @@ -572,6 +572,7 @@ int emu_ReadConfig(int game, int no_defaults) if (currentConfig.CPUclock < 10 || currentConfig.CPUclock > 4096) currentConfig.CPUclock = 200; #ifdef PSP if (currentConfig.gamma < -4 || currentConfig.gamma > 16) currentConfig.gamma = 0; + if (currentConfig.gamma2 < 0 || currentConfig.gamma2 > 2) currentConfig.gamma2 = 0; #else if (currentConfig.gamma < 10 || currentConfig.gamma > 300) currentConfig.gamma = 100; #endif @@ -672,6 +673,12 @@ void emu_textOut16(int x, int y, const char *text) } } +#ifdef PSP +#define MAX_COMBO_KEY 23 +#else +#define MAX_COMBO_KEY 31 +#endif + void emu_findKeyBindCombos(void) { int act, u; @@ -684,15 +691,15 @@ void emu_findKeyBindCombos(void) if (act == 16 || act == 17) continue; // player2 flag if (act > 17) { - for (u = 0; u < 32; u++) + for (u = 0; u <= MAX_COMBO_KEY; u++) if (currentConfig.KeyBinds[u] & (1 << act)) keyc++; } else { - for (u = 0; u < 32; u++) + for (u = 0; u <= MAX_COMBO_KEY; u++) if ((currentConfig.KeyBinds[u] & 0x30000) == 0 && // pl. 1 (currentConfig.KeyBinds[u] & (1 << act))) keyc++; - for (u = 0; u < 32; u++) + for (u = 0; u <= MAX_COMBO_KEY; u++) if ((currentConfig.KeyBinds[u] & 0x30000) == 1 && // pl. 2 (currentConfig.KeyBinds[u] & (1 << act))) keyc2++; if (keyc2 > keyc) keyc = keyc2; @@ -700,7 +707,7 @@ void emu_findKeyBindCombos(void) if (keyc > 1) { // loop again and mark those keys and actions as combo - for (u = 0; u < 32; u++) + for (u = 0; u <= MAX_COMBO_KEY; u++) { if (currentConfig.KeyBinds[u] & (1 << act)) { kb_combo_keys |= 1 << u; diff --git a/platform/common/emu.h b/platform/common/emu.h index 90c93500..d118e5bc 100644 --- a/platform/common/emu.h +++ b/platform/common/emu.h @@ -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); diff --git a/platform/common/menu.h b/platform/common/menu.h index 432a31e9..6ecc1919 100644 --- a/platform/common/menu.h +++ b/platform/common/menu.h @@ -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, diff --git a/platform/gizmondo/menu.c b/platform/gizmondo/menu.c index 3445aaff..4f156b4d 100644 --- a/platform/gizmondo/menu.c +++ b/platform/gizmondo/menu.c @@ -969,6 +969,7 @@ static void cd_menu_loop_options(void) menu_entry opt2_entries[] = { + { "Disable sprite limit", MB_ONOFF, MA_OPT2_NO_SPRITE_LIM, &PicoOpt, 0x40000, 0, 0, 1, 1 }, { "Emulate Z80", MB_ONOFF, MA_OPT2_ENABLE_Z80, ¤tConfig.PicoOpt,0x0004, 0, 0, 1 }, { "Emulate YM2612 (FM)", MB_ONOFF, MA_OPT2_ENABLE_YM2612, ¤tConfig.PicoOpt,0x0001, 0, 0, 1 }, { "Emulate SN76496 (PSG)", MB_ONOFF, MA_OPT2_ENABLE_SN76496,¤tConfig.PicoOpt,0x0002, 0, 0, 1 }, @@ -1314,7 +1315,7 @@ static void draw_menu_credits(void) int tl_x = 15, tl_y = 64, y; menu_draw_begin(1); - text_out16(tl_x, 20, "PicoDrive v" VERSION " (c) notaz, 2006,2007"); + text_out16(tl_x, 20, "PicoDrive v" VERSION " (c) notaz, 2006-2008"); y = tl_y; text_out16(tl_x, y, "Credits:"); diff --git a/platform/psp/Makefile b/platform/psp/Makefile index c2870540..25a0a015 100644 --- a/platform/psp/Makefile +++ b/platform/psp/Makefile @@ -27,7 +27,7 @@ endif OBJS += main.o emu.o mp3.o menu.o psp.o asm_utils.o # common -OBJS += ../common/emu.o ../common/menu.o ../common/fonts.o ../common/readpng.o +OBJS += ../common/emu.o ../common/menu.o ../common/fonts.o ../common/config.o ../common/readpng.o # Pico ifeq "$(amalgamate)" "1" @@ -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 \ ../../Pico/cd/cd_sys.o ../../Pico/cd/cd_file.o ../../Pico/cd/gfx_cd.o \ ../../Pico/cd/Area.o ../../Pico/cd/Misc.o ../../Pico/cd/pcm.o ../../Pico/cd/buffering.o +# Pico - carthw +OBJS += ../../Pico/carthw/carthw.o ../../Pico/carthw/svp/svp.o ../../Pico/carthw/svp/Memory.o \ + ../../Pico/carthw/svp/ssp16.o endif # Pico - sound @@ -170,14 +173,14 @@ endif endif # ? -rel: EBOOT.PBP readme.txt +rel: EBOOT.PBP readme.txt ../game_def.cfg mkdir -p PicoDrive/skin/ cp $^ PicoDrive/ cp skin/* PicoDrive/skin/ zip -9 -r ../../PicoDrive_psp_$(VER).zip PicoDrive rm -rf PicoDrive -rel_kxploit: readme.txt +rel_kxploit: readme.txt ../game_def.cfg mkdir -p PicoDrive/skin/ cp $^ PicoDrive/ cp skin/* PicoDrive/skin/ diff --git a/platform/psp/asm_utils.h b/platform/psp/asm_utils.h index ead5064d..acddac59 100644 --- a/platform/psp/asm_utils.h +++ b/platform/psp/asm_utils.h @@ -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); diff --git a/platform/psp/asm_utils.s b/platform/psp/asm_utils.s index 11e3a17b..30ef7cd3 100644 --- a/platform/psp/asm_utils.s +++ b/platform/psp/asm_utils.s @@ -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) diff --git a/platform/psp/emu.c b/platform/psp/emu.c index d721e208..46de80cd 100644 --- a/platform/psp/emu.c +++ b/platform/psp/emu.c @@ -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(¤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; } @@ -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++; } diff --git a/platform/psp/main.c b/platform/psp/main.c index bf3069c0..e947b43c 100644 --- a/platform/psp/main.c +++ b/platform/psp/main.c @@ -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; diff --git a/platform/psp/menu.c b/platform/psp/menu.c index fda3eadc..1613cfb7 100644 --- a/platform/psp/menu.c +++ b/platform/psp/menu.c @@ -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, ¤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 @@ -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, ¤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) @@ -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 = ¤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; @@ -1156,17 +1164,19 @@ static void dispmenu_loop_options(void) 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) @@ -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, ¤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) @@ -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 { diff --git a/platform/psp/version.h b/platform/psp/version.h index 95717b1c..9b9d909d 100644 --- a/platform/psp/version.h +++ b/platform/psp/version.h @@ -1,2 +1,2 @@ -#define VERSION "1.40" +#define VERSION "1.40b" -- 2.39.5