mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 23:37:46 -04:00
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:
parent
602c28cac1
commit
ae87bffa06
6 changed files with 59 additions and 39 deletions
17
pico/cart.c
17
pico/cart.c
|
@ -21,7 +21,7 @@ void (*PicoCartMemSetup)(void);
|
|||
void (*PicoCartLoadProgressCB)(int percent) = NULL;
|
||||
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 */
|
||||
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:
|
||||
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.
|
||||
// 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;
|
||||
|
||||
if (!(PicoAHW & (PAHW_MCD|PAHW_SMS)))
|
||||
PicoCartDetect();
|
||||
PicoCartDetect(carthw_cfg);
|
||||
|
||||
// setup correct memory map for loaded ROM
|
||||
switch (PicoAHW) {
|
||||
|
@ -695,16 +695,16 @@ static int is_expr(const char *expr, char **pr)
|
|||
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 tmp, rom_crc = 0;
|
||||
char buff[256], *p, *r;
|
||||
FILE *f;
|
||||
|
||||
f = fopen("carthw.cfg", "r");
|
||||
f = fopen(carthw_cfg, "r");
|
||||
if (f == NULL) {
|
||||
elprintf(EL_STATUS, "couldn't open carthw.txt!");
|
||||
elprintf(EL_STATUS, "couldn't open carthw.cfg!");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -924,7 +924,7 @@ no_checks:
|
|||
/*
|
||||
* 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;
|
||||
|
||||
|
@ -954,7 +954,8 @@ static void PicoCartDetect(void)
|
|||
SRam.eeprom_bit_in = 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)
|
||||
{
|
||||
|
|
28
pico/draw.c
28
pico/draw.c
|
@ -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]...
|
||||
|
||||
int rendstatus, rendstatus_old;
|
||||
int rendlines;
|
||||
int DrawScanline;
|
||||
int PicoDrawMask = -1;
|
||||
|
||||
|
@ -1404,21 +1405,25 @@ static int DrawDisplay(int sh)
|
|||
// MUST be called every frame
|
||||
PICO_INTERNAL void PicoFrameStart(void)
|
||||
{
|
||||
int lines = 224;
|
||||
|
||||
// prepare to do this frame
|
||||
rendstatus = 0;
|
||||
if ((Pico.video.reg[12]&6) == 6)
|
||||
if ((Pico.video.reg[12] & 6) == 6)
|
||||
rendstatus |= PDRAW_INTERLACE; // interlace mode
|
||||
if (!(Pico.video.reg[12] & 1))
|
||||
rendstatus |= PDRAW_32_COLS;
|
||||
if (Pico.video.reg[1] & 8)
|
||||
rendstatus |= PDRAW_240LINES;
|
||||
lines = 240;
|
||||
|
||||
DrawScanline = 0;
|
||||
skip_next_line = 0;
|
||||
|
||||
if (rendstatus != rendstatus_old) {
|
||||
if (rendstatus != rendstatus_old || lines != rendlines) {
|
||||
rendlines = lines;
|
||||
rendstatus_old = rendstatus;
|
||||
emu_video_mode_change((rendstatus & PDRAW_240LINES) ? 0 : 8,
|
||||
(rendstatus & PDRAW_240LINES) ? 240 : 224,
|
||||
(Pico.video.reg[12] & 1) ? 0 : 1);
|
||||
emu_video_mode_change((lines == 240) ? 0 : 8,
|
||||
lines, (Pico.video.reg[12] & 1) ? 0 : 1);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
int skip = 0;
|
||||
|
||||
if (skip_next_line > 0) {
|
||||
skip_next_line--;
|
||||
return;
|
||||
|
@ -1452,7 +1459,12 @@ static void PicoLine(int line, int offs, int sh, int bgc)
|
|||
|
||||
DrawScanline = line;
|
||||
if (PicoScanBegin != NULL)
|
||||
skip_next_line = PicoScanBegin(line + offs);
|
||||
skip = PicoScanBegin(line + offs);
|
||||
|
||||
if (skip) {
|
||||
skip_next_line = skip - 1;
|
||||
return;
|
||||
}
|
||||
|
||||
// Draw screen:
|
||||
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 bgc = Pico.video.reg[7];
|
||||
|
||||
if (!(rendstatus & PDRAW_240LINES))
|
||||
if (rendlines != 240)
|
||||
offs = 8;
|
||||
|
||||
// need to know which pixels are bg for 32x
|
||||
|
|
|
@ -193,11 +193,10 @@ void PicoFrameStartMode4(void)
|
|||
int lines = 192;
|
||||
skip_next_line = 0;
|
||||
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[1] & 0x08) {
|
||||
rendstatus |= PDRAW_240LINES;
|
||||
screen_offset = 0;
|
||||
lines = 240;
|
||||
}
|
||||
|
@ -207,8 +206,9 @@ void PicoFrameStartMode4(void)
|
|||
}
|
||||
}
|
||||
|
||||
if (rendstatus != rendstatus_old) {
|
||||
if (rendstatus != rendstatus_old || lines != rendlines) {
|
||||
rendstatus_old = rendstatus;
|
||||
rendlines = lines;
|
||||
emu_video_mode_change(screen_offset, lines, 1);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
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);
|
||||
|
||||
// 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_close(pm_file *fp);
|
||||
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);
|
||||
extern void (*PicoCartLoadProgressCB)(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_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_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 rendlines;
|
||||
extern unsigned short HighPal[0x100];
|
||||
|
||||
// Draw2.c
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue