improved game vidmode change detection; some iface changes

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@803 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2009-10-05 15:59:08 +00:00
parent 602c28cac1
commit ae87bffa06
6 changed files with 59 additions and 39 deletions

View file

@ -21,7 +21,7 @@ void (*PicoCartMemSetup)(void);
void (*PicoCartLoadProgressCB)(int percent) = NULL; void (*PicoCartLoadProgressCB)(int percent) = NULL;
void (*PicoCDLoadProgressCB)(const char *fname, int percent) = NULL; // handled in Pico/cd/cd_file.c void (*PicoCDLoadProgressCB)(const char *fname, int percent) = NULL; // handled in Pico/cd/cd_file.c
static void PicoCartDetect(void); static void PicoCartDetect(const char *carthw_cfg);
/* cso struct */ /* cso struct */
typedef struct _cso_struct typedef struct _cso_struct
@ -541,7 +541,7 @@ int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize,int is_sms)
} }
// Insert a cartridge: // Insert a cartridge:
int PicoCartInsert(unsigned char *rom,unsigned int romsize) int PicoCartInsert(unsigned char *rom, unsigned int romsize, const char *carthw_cfg)
{ {
// notaz: add a 68k "jump one op back" opcode to the end of ROM. // notaz: add a 68k "jump one op back" opcode to the end of ROM.
// This will hang the emu, but will prevent nasty crashes. // This will hang the emu, but will prevent nasty crashes.
@ -572,7 +572,7 @@ int PicoCartInsert(unsigned char *rom,unsigned int romsize)
carthw_chunks = NULL; carthw_chunks = NULL;
if (!(PicoAHW & (PAHW_MCD|PAHW_SMS))) if (!(PicoAHW & (PAHW_MCD|PAHW_SMS)))
PicoCartDetect(); PicoCartDetect(carthw_cfg);
// setup correct memory map for loaded ROM // setup correct memory map for loaded ROM
switch (PicoAHW) { switch (PicoAHW) {
@ -695,16 +695,16 @@ static int is_expr(const char *expr, char **pr)
return 1; return 1;
} }
static void parse_carthw(int *fill_sram) static void parse_carthw(const char *carthw_cfg, int *fill_sram)
{ {
int line = 0, any_checks_passed = 0, skip_sect = 0; int line = 0, any_checks_passed = 0, skip_sect = 0;
int tmp, rom_crc = 0; int tmp, rom_crc = 0;
char buff[256], *p, *r; char buff[256], *p, *r;
FILE *f; FILE *f;
f = fopen("carthw.cfg", "r"); f = fopen(carthw_cfg, "r");
if (f == NULL) { if (f == NULL) {
elprintf(EL_STATUS, "couldn't open carthw.txt!"); elprintf(EL_STATUS, "couldn't open carthw.cfg!");
return; return;
} }
@ -924,7 +924,7 @@ no_checks:
/* /*
* various cart-specific things, which can't be handled by generic code * various cart-specific things, which can't be handled by generic code
*/ */
static void PicoCartDetect(void) static void PicoCartDetect(const char *carthw_cfg)
{ {
int fill_sram = 0; int fill_sram = 0;
@ -954,7 +954,8 @@ static void PicoCartDetect(void)
SRam.eeprom_bit_in = 0; SRam.eeprom_bit_in = 0;
SRam.eeprom_bit_out= 0; SRam.eeprom_bit_out= 0;
parse_carthw(&fill_sram); if (carthw_cfg != NULL)
parse_carthw(carthw_cfg, &fill_sram);
if (SRam.flags & SRF_ENABLED) if (SRam.flags & SRF_ENABLED)
{ {

View file

@ -54,6 +54,7 @@ int HighPreSpr[80*2+1]; // slightly preprocessed sprites
unsigned char HighLnSpr[240][3 + MAX_LINE_SPRITES]; // sprite_count, ^flags, tile_count, [spritep]... unsigned char HighLnSpr[240][3 + MAX_LINE_SPRITES]; // sprite_count, ^flags, tile_count, [spritep]...
int rendstatus, rendstatus_old; int rendstatus, rendstatus_old;
int rendlines;
int DrawScanline; int DrawScanline;
int PicoDrawMask = -1; int PicoDrawMask = -1;
@ -1404,21 +1405,25 @@ static int DrawDisplay(int sh)
// MUST be called every frame // MUST be called every frame
PICO_INTERNAL void PicoFrameStart(void) PICO_INTERNAL void PicoFrameStart(void)
{ {
int lines = 224;
// prepare to do this frame // prepare to do this frame
rendstatus = 0; rendstatus = 0;
if ((Pico.video.reg[12] & 6) == 6) if ((Pico.video.reg[12] & 6) == 6)
rendstatus |= PDRAW_INTERLACE; // interlace mode rendstatus |= PDRAW_INTERLACE; // interlace mode
if (!(Pico.video.reg[12] & 1))
rendstatus |= PDRAW_32_COLS;
if (Pico.video.reg[1] & 8) if (Pico.video.reg[1] & 8)
rendstatus |= PDRAW_240LINES; lines = 240;
DrawScanline = 0; DrawScanline = 0;
skip_next_line = 0; skip_next_line = 0;
if (rendstatus != rendstatus_old) { if (rendstatus != rendstatus_old || lines != rendlines) {
rendlines = lines;
rendstatus_old = rendstatus; rendstatus_old = rendstatus;
emu_video_mode_change((rendstatus & PDRAW_240LINES) ? 0 : 8, emu_video_mode_change((lines == 240) ? 0 : 8,
(rendstatus & PDRAW_240LINES) ? 240 : 224, lines, (Pico.video.reg[12] & 1) ? 0 : 1);
(Pico.video.reg[12] & 1) ? 0 : 1);
} }
if (PicoOpt & POPT_ALT_RENDERER) if (PicoOpt & POPT_ALT_RENDERER)
@ -1445,6 +1450,8 @@ static void DrawBlankedLine(int line, int offs, int sh, int bgc)
static void PicoLine(int line, int offs, int sh, int bgc) static void PicoLine(int line, int offs, int sh, int bgc)
{ {
int skip = 0;
if (skip_next_line > 0) { if (skip_next_line > 0) {
skip_next_line--; skip_next_line--;
return; return;
@ -1452,7 +1459,12 @@ static void PicoLine(int line, int offs, int sh, int bgc)
DrawScanline = line; DrawScanline = line;
if (PicoScanBegin != NULL) if (PicoScanBegin != NULL)
skip_next_line = PicoScanBegin(line + offs); skip = PicoScanBegin(line + offs);
if (skip) {
skip_next_line = skip - 1;
return;
}
// Draw screen: // Draw screen:
BackFill(bgc, sh); BackFill(bgc, sh);
@ -1472,7 +1484,7 @@ void PicoDrawSync(int to, int blank_last_line)
int sh = (Pico.video.reg[0xC] & 8) >> 3; // shadow/hilight? int sh = (Pico.video.reg[0xC] & 8) >> 3; // shadow/hilight?
int bgc = Pico.video.reg[7]; int bgc = Pico.video.reg[7];
if (!(rendstatus & PDRAW_240LINES)) if (rendlines != 240)
offs = 8; offs = 8;
// need to know which pixels are bg for 32x // need to know which pixels are bg for 32x

View file

@ -193,11 +193,10 @@ void PicoFrameStartMode4(void)
int lines = 192; int lines = 192;
skip_next_line = 0; skip_next_line = 0;
screen_offset = 24; screen_offset = 24;
rendstatus = 0; rendstatus = PDRAW_32_COLS;
if ((Pico.video.reg[0] & 6) == 6 && (Pico.video.reg[1] & 0x18)) { if ((Pico.video.reg[0] & 6) == 6 && (Pico.video.reg[1] & 0x18)) {
if (Pico.video.reg[1] & 0x08) { if (Pico.video.reg[1] & 0x08) {
rendstatus |= PDRAW_240LINES;
screen_offset = 0; screen_offset = 0;
lines = 240; lines = 240;
} }
@ -207,8 +206,9 @@ void PicoFrameStartMode4(void)
} }
} }
if (rendstatus != rendstatus_old) { if (rendstatus != rendstatus_old || lines != rendlines) {
rendstatus_old = rendstatus; rendstatus_old = rendstatus;
rendlines = lines;
emu_video_mode_change(screen_offset, lines, 1); emu_video_mode_change(screen_offset, lines, 1);
} }
} }

View file

@ -34,7 +34,7 @@ extern void cache_flush_d_inval_i(const void *start_addr, const void *end_addr);
// this one should handle display mode changes // this one should handle display mode changes
extern void emu_video_mode_change(int start_line, int line_count, int is_32cols); extern void emu_video_mode_change(int start_line, int line_count, int is_32cols);
// this must switch to 32bpp mode // this must switch to 16bpp mode
extern void emu_32x_startup(void); extern void emu_32x_startup(void);
// optional 32X BIOS, should be left NULL if not used // optional 32X BIOS, should be left NULL if not used
@ -149,7 +149,7 @@ size_t pm_read(void *ptr, size_t bytes, pm_file *stream);
int pm_seek(pm_file *stream, long offset, int whence); int pm_seek(pm_file *stream, long offset, int whence);
int pm_close(pm_file *fp); int pm_close(pm_file *fp);
int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize,int is_sms); int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize,int is_sms);
int PicoCartInsert(unsigned char *rom,unsigned int romsize); int PicoCartInsert(unsigned char *rom, unsigned int romsize, const char *carthw_cfg);
void PicoCartUnload(void); void PicoCartUnload(void);
extern void (*PicoCartLoadProgressCB)(int percent); extern void (*PicoCartLoadProgressCB)(int percent);
extern void (*PicoCDLoadProgressCB)(const char *fname, int percent); extern void (*PicoCDLoadProgressCB)(const char *fname, int percent);
@ -184,8 +184,9 @@ extern int PicoDrawMask;
#define PDRAW_SONIC_MODE (1<<5) // mid-frame palette changes for 8bit renderer #define PDRAW_SONIC_MODE (1<<5) // mid-frame palette changes for 8bit renderer
#define PDRAW_PLANE_HI_PRIO (1<<6) // have layer with all hi prio tiles (mk3) #define PDRAW_PLANE_HI_PRIO (1<<6) // have layer with all hi prio tiles (mk3)
#define PDRAW_SHHI_DONE (1<<7) // layer sh/hi already processed #define PDRAW_SHHI_DONE (1<<7) // layer sh/hi already processed
#define PDRAW_240LINES (1<<8) // 240 line display (224 if not set) #define PDRAW_32_COLS (1<<8) // 32 column mode
extern int rendstatus, rendstatus_old; extern int rendstatus, rendstatus_old;
extern int rendlines;
extern unsigned short HighPal[0x100]; extern unsigned short HighPal[0x100];
// Draw2.c // Draw2.c

View file

@ -41,9 +41,11 @@ int pico_pen_x = 320/2, pico_pen_y = 240/2;
int pico_inp_mode = 0; int pico_inp_mode = 0;
int engineState = PGS_Menu; int engineState = PGS_Menu;
/* tmp buff to reduce stack usage for plats with small stack */
static char static_buff[512];
/* TODO: len checking */ /* TODO: len checking */
char rom_fname_reload[512] = { 0, }; char rom_fname_reload[512];
char rom_fname_loaded[512] = { 0, }; char rom_fname_loaded[512];
int rom_loaded = 0; int rom_loaded = 0;
int reset_timing = 0; int reset_timing = 0;
static unsigned int notice_msg_time; /* when started showing */ static unsigned int notice_msg_time; /* when started showing */
@ -113,7 +115,6 @@ static const char * const biosfiles_jp[] = { "jp_mcd1_9112", "jp_mcd1_9111" };
static int find_bios(int region, char **bios_file) static int find_bios(int region, char **bios_file)
{ {
static char bios_path[1024];
int i, count; int i, count;
const char * const *files; const char * const *files;
FILE *f = NULL; FILE *f = NULL;
@ -133,26 +134,27 @@ static int find_bios(int region, char **bios_file)
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
emu_make_path(bios_path, files[i], sizeof(bios_path) - 4); emu_make_path(static_buff, files[i], sizeof(static_buff) - 4);
strcat(bios_path, ".bin"); strcat(static_buff, ".bin");
f = fopen(bios_path, "rb"); f = fopen(static_buff, "rb");
if (f) break; if (f) break;
bios_path[strlen(bios_path) - 4] = 0; static_buff[strlen(static_buff) - 4] = 0;
strcat(bios_path, ".zip"); strcat(static_buff, ".zip");
f = fopen(bios_path, "rb"); f = fopen(static_buff, "rb");
if (f) break; if (f) break;
} }
if (f) { if (f) {
lprintf("using bios: %s\n", bios_path); lprintf("using bios: %s\n", static_buff);
fclose(f); fclose(f);
if (bios_file) *bios_file = bios_path; if (bios_file)
*bios_file = static_buff;
return 1; return 1;
} else { } else {
sprintf(bios_path, "no %s BIOS files found, read docs", sprintf(static_buff, "no %s BIOS files found, read docs",
region != 4 ? (region == 8 ? "EU" : "JAP") : "USA"); region != 4 ? (region == 8 ? "EU" : "JAP") : "USA");
me_update_msg(bios_path); me_update_msg(static_buff);
return 0; return 0;
} }
} }
@ -560,6 +562,7 @@ int emu_reload_rom(char *rom_fname)
} }
menu_romload_prepare(used_rom_name); // also CD load menu_romload_prepare(used_rom_name); // also CD load
used_rom_name = NULL; // uses static_buff
ret = PicoCartLoad(rom, &rom_data, &rom_size, (PicoAHW & PAHW_SMS) ? 1 : 0); ret = PicoCartLoad(rom, &rom_data, &rom_size, (PicoAHW & PAHW_SMS) ? 1 : 0);
pm_close(rom); pm_close(rom);
@ -594,7 +597,8 @@ int emu_reload_rom(char *rom_fname)
if (!ret) emu_read_config(0, 0); if (!ret) emu_read_config(0, 0);
} }
if (PicoCartInsert(rom_data, rom_size)) { emu_make_path(static_buff, "carthw.cfg", sizeof(static_buff));
if (PicoCartInsert(rom_data, rom_size, static_buff)) {
me_update_msg("Failed to load ROM."); me_update_msg("Failed to load ROM.");
goto fail; goto fail;
} }
@ -700,6 +704,7 @@ static void romfname_ext(char *dst, const char *prefix, const char *ext)
if (ext) strcat(dst, ext); if (ext) strcat(dst, ext);
} }
// <base dir><end>
void emu_make_path(char *buff, const char *end, int size) void emu_make_path(char *buff, const char *end, int size)
{ {
int pos, end_len; int pos, end_len;
@ -907,7 +912,7 @@ static int try_ropen_file(const char *fname)
char *emu_get_save_fname(int load, int is_sram, int slot) char *emu_get_save_fname(int load, int is_sram, int slot)
{ {
static char saveFname[512]; char *saveFname = static_buff;
char ext[16]; char ext[16];
if (is_sram) if (is_sram)
@ -1482,7 +1487,7 @@ void emu_loop(void)
pframes_done++; frames_done++; pframes_done++; frames_done++;
diff_lim += target_frametime; diff_lim += target_frametime;
if (!(currentConfig.EmuOpt & EOPT_NO_FRMLIMIT)) { if (!(currentConfig.EmuOpt & (EOPT_NO_FRMLIMIT|EOPT_EXT_FRMLIMIT))) {
timestamp = get_ticks(); timestamp = get_ticks();
diff = timestamp - timestamp_base; diff = timestamp - timestamp_base;
if (!reset_timing && diff < diff_lim) // we are too fast if (!reset_timing && diff < diff_lim) // we are too fast
@ -1508,7 +1513,7 @@ void emu_loop(void)
PicoFrame(); PicoFrame();
/* frame limiter */ /* frame limiter */
if (!reset_timing && !(currentConfig.EmuOpt & EOPT_NO_FRMLIMIT)) if (!reset_timing && !(currentConfig.EmuOpt & (EOPT_NO_FRMLIMIT|EOPT_EXT_FRMLIMIT)))
{ {
timestamp = get_ticks(); timestamp = get_ticks();
diff = timestamp - timestamp_base; diff = timestamp - timestamp_base;

View file

@ -41,6 +41,7 @@ extern int g_screen_height;
#define EOPT_SHOW_RTC (1<<17) #define EOPT_SHOW_RTC (1<<17)
#define EOPT_NO_FRMLIMIT (1<<18) #define EOPT_NO_FRMLIMIT (1<<18)
#define EOPT_WIZ_TEAR_FIX (1<<19) #define EOPT_WIZ_TEAR_FIX (1<<19)
#define EOPT_EXT_FRMLIMIT (1<<20) // no internal frame limiter (limited by snd, etc)
enum { enum {
EOPT_SCALE_NONE = 0, EOPT_SCALE_NONE = 0,