new 32x renderers, auto fskip change, massive refactoring

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@855 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2010-01-10 17:07:28 +00:00
parent 9bb5d91c48
commit 5a68108691
35 changed files with 925 additions and 307 deletions

View file

@ -24,6 +24,10 @@ ifeq "$(asm_cdmemory)" "1"
DEFINES += _ASM_CD_MEMORY_C
OBJS += pico/cd/memory_arm.o
endif
ifeq "$(asm_32xdraw)" "1"
DEFINES += _ASM_32X_DRAW
OBJS += pico/32x/draw_arm.o
endif
DIRS += cpu/Cyclone cpu/Cyclone/proj cpu/Cyclone/tools cpu/DrZ80

View file

@ -10,6 +10,7 @@
#include <unistd.h>
#endif
#include "config.h"
#include "plat.h"
#include "input.h"
#include "lprintf.h"
@ -197,6 +198,7 @@ static int default_var(const menu_entry *me)
case MA_OPT2_GAMMA: return defaultConfig.gamma;
case MA_OPT_FRAMESKIP: return defaultConfig.Frameskip;
case MA_OPT_CPU_CLOCKS: return defaultConfig.CPUclock;
case MA_OPT_RENDERER: return defaultConfig.renderer;
case MA_OPT_SAVE_SLOT:
default:
@ -217,9 +219,6 @@ static int is_cust_val_default(const menu_entry *me)
case MA_OPT_CONFIRM_STATES:
return !((defaultConfig.EmuOpt ^ currentConfig.EmuOpt) &
(EOPT_CONFIRM_LOAD|EOPT_CONFIRM_SAVE)) == 0;
case MA_OPT_RENDERER:
return ((defaultConfig.s_PicoOpt ^ PicoOpt) & POPT_ALT_RENDERER) == 0 &&
((defaultConfig.EmuOpt ^ currentConfig.EmuOpt) & EOPT_16BPP) == 0;
case MA_CDOPT_READAHEAD:
return defaultConfig.s_PicoCDBuffers == PicoCDBuffers;
default:break;
@ -468,26 +467,21 @@ int config_readlrom(const char *fname)
static int custom_read(menu_entry *me, const char *var, const char *val)
{
char *tmp;
int tmpi;
int i;
switch (me->id)
{
case MA_OPT_RENDERER:
if (strcasecmp(var, "Renderer") != 0) return 0;
if (strcasecmp(val, "8bit fast") == 0 || strcasecmp(val, "fast") == 0) {
PicoOpt |= POPT_ALT_RENDERER;
}
else if (strcasecmp(val, "16bit accurate") == 0 || strcasecmp(val, "accurate") == 0) {
PicoOpt &= ~POPT_ALT_RENDERER;
currentConfig.EmuOpt |= 0x80;
}
else if (strcasecmp(val, "8bit accurate") == 0) {
PicoOpt &= ~POPT_ALT_RENDERER;
currentConfig.EmuOpt &= ~0x80;
}
else
if (strcasecmp(var, "Renderer") != 0 || renderer_names == NULL)
return 0;
return 1;
for (i = 0; renderer_names[i] != NULL; i++) {
if (strcasecmp(val, renderer_names[i]) == 0) {
currentConfig.renderer = i;
return 1;
}
}
return 0;
case MA_OPT_SCALING:
#ifdef __GP2X__
@ -589,9 +583,9 @@ static int custom_read(menu_entry *me, const char *var, const char *val)
case MA_OPT2_SQUIDGEHACK:
if (strcasecmp(var, "Squidgehack") != 0) return 0;
tmpi = atoi(val);
if (tmpi) *(int *)me->var |= me->mask;
else *(int *)me->var &= ~me->mask;
i = atoi(val);
if (i) *(int *)me->var |= me->mask;
else *(int *)me->var &= ~me->mask;
return 1;
case MA_CDOPT_READAHEAD:

View file

@ -1116,7 +1116,7 @@ static void emu_tray_close(void)
void emu_32x_startup(void)
{
plat_video_toggle_renderer(0, 1, 0);
plat_video_toggle_renderer(0, 0);
system_announce();
}
@ -1247,9 +1247,9 @@ static void run_events_ui(unsigned int which)
PicoStateProgressCB = NULL;
}
}
if ((which & PEV_SWITCH_RND) && !(PicoAHW & PAHW_32X))
if (which & PEV_SWITCH_RND)
{
plat_video_toggle_renderer(1, 0, 0);
plat_video_toggle_renderer(1, 0);
}
if (which & (PEV_SSLOT_PREV|PEV_SSLOT_NEXT))
{
@ -1493,17 +1493,15 @@ void emu_loop(void)
{
if ((currentConfig.EmuOpt & EOPT_NO_FRMLIMIT) && currentConfig.Frameskip >= 0)
pframes_done = 0;
else {
else
pframes_done -= target_fps;
/* don't allow it to drift during heavy slowdowns */
if (pframes_done < -5) {
reset_timing = 1;
continue;
}
if (pframes_done < -2)
pframes_done = -2;
if (pframes_done < -2) {
/* don't drag more than 2 frames behind */
pframes_done = -2;
timestamp_base = timestamp - 2 * target_frametime;
}
timestamp_base += ms_to_ticks(1000);
else
timestamp_base += ms_to_ticks(1000);
}
diff = timestamp - timestamp_base;
@ -1528,15 +1526,13 @@ void emu_loop(void)
else if (diff > diff_lim)
{
/* no time left for this frame - skip */
if (diff - diff_lim >= ms_to_ticks(200)) {
/* if too much behind, reset instead */
reset_timing = 1;
/* limit auto frameskip to 8 */
if (frames_done / 8 <= frames_shown) {
emu_update_input();
skip_frame(diff < diff_lim + target_frametime * 16);
pframes_done++; frames_done++;
continue;
}
emu_update_input();
skip_frame(diff < diff_lim + target_frametime * 2);
pframes_done++; frames_done++;
continue;
}
emu_update_input();

View file

@ -28,7 +28,7 @@ extern int g_screen_height;
#define EOPT_GZIP_SAVES (1<<3)
#define EOPT_MMUHACK (1<<4)
#define EOPT_NO_AUTOSVCFG (1<<5)
#define EOPT_16BPP (1<<7)
#define EOPT_16BPP (1<<7) // depreceted for .renderer
#define EOPT_RAM_TIMINGS (1<<8)
#define EOPT_CONFIRM_SAVE (1<<9)
#define EOPT_EN_CD_LEDS (1<<10)
@ -67,6 +67,8 @@ typedef struct _currentConfig_t {
float hscale32, hscale40; // psp: horizontal scale
int gamma2; // psp: black level
int turbo_rate;
int renderer;
int renderer32x;
} currentConfig_t;
extern currentConfig_t currentConfig, defaultConfig;

View file

@ -603,7 +603,6 @@ static void me_loop(menu_entry *menu, int *menu_sel, void (*draw_more)(void))
#else
#define MENU_OPTIONS_GFX
#define MENU_OPTIONS_ADV
#define mgn_opt_renderer NULL /* TODO */
#define menu_main_plat_draw NULL
#endif
@ -1494,16 +1493,47 @@ static int menu_loop_cd_options(menu_id id, int keys)
// ------------ 32X options menu ------------
static const char *get_rname(const char **rn, int val, int *offs)
{
int i, len, found = -1, maxlen = 0;
for (i = 0; rn[i] != NULL; i++) {
len = strlen(rn[i]);
if (len > maxlen)
maxlen = len;
if (i == val)
found = i;
}
*offs = 3 - maxlen;
if (found >= 0)
return rn[found];
return "???";
}
static const char *mgn_opt_renderer32x(menu_id id, int *offs)
{
return get_rname(renderer_names32x, currentConfig.renderer32x, offs);
}
static menu_entry e_menu_32x_options[] =
{
mee_onoff("32X enabled", MA_32XOPT_ENABLE_32X, PicoOpt, POPT_EN_32X),
mee_onoff("PWM sound", MA_32XOPT_PWM, PicoOpt, POPT_EN_PWM),
mee_onoff ("32X enabled", MA_32XOPT_ENABLE_32X, PicoOpt, POPT_EN_32X),
mee_range_cust("32X renderer", MA_32XOPT_RENDERER, currentConfig.renderer32x, 0, 0, mgn_opt_renderer32x),
mee_onoff ("PWM sound", MA_32XOPT_PWM, PicoOpt, POPT_EN_PWM),
mee_end,
};
static int menu_loop_32x_options(menu_id id, int keys)
{
static int sel = 0;
int i, c;
for (c = 0; renderer_names32x != NULL && renderer_names32x[c] != NULL; )
c++;
i = me_id2offset(e_menu_32x_options, MA_32XOPT_RENDERER);
e_menu_32x_options[i].max = c > 0 ? (c - 1) : 0;
me_loop(e_menu_32x_options, &sel, NULL);
return 0;
}
@ -1534,15 +1564,14 @@ static int menu_loop_adv_options(menu_id id, int keys)
// ------------ gfx options menu ------------
static int mh_opt_render(menu_id id, int keys)
static const char *mgn_opt_renderer(menu_id id, int *offs)
{
plat_video_toggle_renderer((keys & PBTN_RIGHT) ? 1 : 0, 0, 1);
return 0;
return get_rname(renderer_names, currentConfig.renderer, offs);
}
static menu_entry e_menu_gfx_options[] =
{
mee_cust ("Renderer", MA_OPT_RENDERER, mh_opt_render, mgn_opt_renderer),
mee_range_cust("Renderer", MA_OPT_RENDERER, currentConfig.renderer, 0, 0, mgn_opt_renderer),
MENU_OPTIONS_GFX
mee_end,
};
@ -1550,6 +1579,14 @@ static menu_entry e_menu_gfx_options[] =
static int menu_loop_gfx_options(menu_id id, int keys)
{
static int sel = 0;
int i, c;
for (c = 0; renderer_names != NULL && renderer_names[c] != NULL; )
c++;
i = me_id2offset(e_menu_gfx_options, MA_OPT_RENDERER);
e_menu_gfx_options[i].max = c > 0 ? (c - 1) : 0;
me_enable(e_menu_gfx_options, MA_OPT_RENDERER, renderer_names != NULL);
me_loop(e_menu_gfx_options, &sel, NULL);
return 0;
}

View file

@ -86,6 +86,7 @@ typedef enum
MA_CDOPT_BETTER_SYNC,
MA_CDOPT_DONE,
MA_32XOPT_ENABLE_32X,
MA_32XOPT_RENDERER,
MA_32XOPT_PWM,
MA_CTRL_PLAYER1,
MA_CTRL_PLAYER2,

View file

@ -4,6 +4,8 @@ extern "C" {
/* stuff to be implemented by platform code */
extern char cpu_clk_name[];
extern const char **renderer_names;
extern const char **renderer_names32x;
void pemu_prep_defconfig(void);
void pemu_validate_config(void);
@ -35,7 +37,7 @@ void plat_video_menu_end(void);
void plat_video_flip(void);
void plat_video_wait_vsync(void);
void plat_video_toggle_renderer(int is_next, int force_16bpp, int is_menu);
void plat_video_toggle_renderer(int change, int menu_call);
void plat_update_volume(int has_changed, int is_up);