mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
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:
parent
9bb5d91c48
commit
5a68108691
35 changed files with 925 additions and 307 deletions
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue