sms, add vdp midframe cram change handling for 8bit renderer

This commit is contained in:
kub 2021-10-17 22:50:07 +02:00
parent e4da4fe8b9
commit 646be42e9d
2 changed files with 43 additions and 22 deletions

View file

@ -1688,13 +1688,13 @@ void FinalizeLine8bit(int sh, int line, struct PicoEState *est)
int len; int len;
static int dirty_line; static int dirty_line;
// a hack for mid-frame palette changes
if (Pico.m.dirtyPal == 1) if (Pico.m.dirtyPal == 1)
{ {
// a hack for mid-frame palette changes // store a maximum of 2 additional palettes in SonicPal
if (!(est->rendstatus & PDRAW_SONIC_MODE) | (line - dirty_line > 4)) { if (est->SonicPalCount < 2 &&
// store a maximum of 3 additional palettes in SonicPal (!(est->rendstatus & PDRAW_SONIC_MODE) || (line - dirty_line > 4))) {
if (est->SonicPalCount < 3) est->SonicPalCount ++;
est->SonicPalCount ++;
dirty_line = line; dirty_line = line;
est->rendstatus |= PDRAW_SONIC_MODE; est->rendstatus |= PDRAW_SONIC_MODE;
} }
@ -1854,7 +1854,6 @@ static int DrawDisplay(int sh)
PICO_INTERNAL void PicoFrameStart(void) PICO_INTERNAL void PicoFrameStart(void)
{ {
int loffs = 8, lines = 224, coffs = 0, columns = 320; int loffs = 8, lines = 224, coffs = 0, columns = 320;
int dirty = ((Pico.est.rendstatus & PDRAW_SONIC_MODE) || Pico.m.dirtyPal);
int sprep = Pico.est.rendstatus & (PDRAW_SPRITES_MOVED|PDRAW_DIRTY_SPRITES); int sprep = Pico.est.rendstatus & (PDRAW_SPRITES_MOVED|PDRAW_DIRTY_SPRITES);
int skipped = Pico.est.rendstatus & PDRAW_SKIP_FRAME; int skipped = Pico.est.rendstatus & PDRAW_SKIP_FRAME;
@ -1896,7 +1895,7 @@ PICO_INTERNAL void PicoFrameStart(void)
if (FinalizeLine == FinalizeLine8bit) { if (FinalizeLine == FinalizeLine8bit) {
// make a backup of the current palette in case Sonic mode is detected later // make a backup of the current palette in case Sonic mode is detected later
Pico.est.SonicPalCount = 0; Pico.est.SonicPalCount = 0;
Pico.m.dirtyPal = (dirty ? 2 : 0); // mark as dirty but already copied Pico.m.dirtyPal = (Pico.m.dirtyPal ? 2 : 0); // mark as dirty but copied
blockcpy(Pico.est.SonicPal, PicoMem.cram, 0x40*2); blockcpy(Pico.est.SonicPal, PicoMem.cram, 0x40*2);
} }
} }
@ -2011,6 +2010,8 @@ void PicoDrawUpdateHighPal(void)
blockcpy(est->HighPal+0x40, est->HighPal, 0x40*2); blockcpy(est->HighPal+0x40, est->HighPal, 0x40*2);
blockcpy(est->HighPal+0x80, est->HighPal, 0x80*2); blockcpy(est->HighPal+0x80, est->HighPal, 0x80*2);
} }
Pico.est.HighPal[0xe0] = 0x0000; // black and white, reserved for OSD
Pico.est.HighPal[0xf0] = 0xffff;
} }
} }

View file

@ -465,6 +465,7 @@ static void DrawDisplayM2(int scanline)
/*===============*/ /*===============*/
static void FinalizeLineRGB555SMS(int line); static void FinalizeLineRGB555SMS(int line);
static void FinalizeLine8bitSMS(int line);
void PicoFrameStartSMS(void) void PicoFrameStartSMS(void)
{ {
@ -513,6 +514,12 @@ void PicoFrameStartSMS(void)
Pico.est.HighCol = HighColBase + screen_offset * HighColIncrement; Pico.est.HighCol = HighColBase + screen_offset * HighColIncrement;
Pico.est.DrawLineDest = (char *)DrawLineDestBase + screen_offset * DrawLineDestIncrement; Pico.est.DrawLineDest = (char *)DrawLineDestBase + screen_offset * DrawLineDestIncrement;
if (FinalizeLineSMS == FinalizeLine8bitSMS) {
Pico.est.SonicPalCount = 0;
Pico.m.dirtyPal = (Pico.m.dirtyPal ? 2 : 0);
memcpy(Pico.est.SonicPal, PicoMem.cram, 0x20*2);
}
} }
void PicoLineSMS(int line) void PicoLineSMS(int line)
@ -557,32 +564,45 @@ static u16 tmspal[32] = {
void PicoDoHighPal555SMS(void) void PicoDoHighPal555SMS(void)
{ {
u32 *spal=(void *)PicoMem.cram; u32 *spal = (void *)Pico.est.SonicPal;
u32 *dpal=(void *)Pico.est.HighPal; u32 *dpal = (void *)Pico.est.HighPal;
unsigned int cnt = Pico.est.SonicPalCount+1;
unsigned int t; unsigned int t;
int i; int i, j;
if (FinalizeLineSMS != FinalizeLine8bitSMS || Pico.m.dirtyPal == 2)
Pico.m.dirtyPal = 0;
Pico.m.dirtyPal = 0; // use hardware palette for 16bit accurate mode
if (!(Pico.video.reg[0] & 0x4)) if (FinalizeLineSMS == FinalizeLineRGB555SMS)
spal = (void *)PicoMem.cram;
// fixed palette in TMS modes
if (!(Pico.video.reg[0] & 0x4)) {
spal = (u32 *)tmspal; spal = (u32 *)tmspal;
cnt = 1;
}
/* SMS 6 bit cram data was already converted to MD/GG format by vdp write, /* SMS 6 bit cram data was already converted to MD/GG format by vdp write,
* hence GG/SMS/TMS can all be handled the same here */ * hence GG/SMS/TMS can all be handled the same here */
for (i = 0x20/2; i > 0; i--, spal++, dpal++) { for (j = cnt; j > 0; j--) {
t = *spal; for (i = 0x20/2; i > 0; i--, spal++, dpal++) {
t = *spal;
#if defined(USE_BGR555) #if defined(USE_BGR555)
t = ((t & 0x000f000f)<< 1) | ((t & 0x00f000f0)<<2) | ((t & 0x0f000f00)<<3); t = ((t & 0x000f000f)<< 1) | ((t & 0x00f000f0)<<2) | ((t & 0x0f000f00)<<3);
t |= (t >> 4) & 0x04210421; t |= (t >> 4) & 0x04210421;
#elif defined(USE_BGR565) #elif defined(USE_BGR565)
t = ((t & 0x000f000f)<< 1) | ((t & 0x00f000f0)<<3) | ((t & 0x0f000f00)<<4); t = ((t & 0x000f000f)<< 1) | ((t & 0x00f000f0)<<3) | ((t & 0x0f000f00)<<4);
t |= (t >> 4) & 0x08610861; t |= (t >> 4) & 0x08610861;
#else #else
t = ((t & 0x000f000f)<<12) | ((t & 0x00f000f0)<<3) | ((t & 0x0f000f00)>>7); t = ((t & 0x000f000f)<<12) | ((t & 0x00f000f0)<<3) | ((t & 0x0f000f00)>>7);
t |= (t >> 4) & 0x08610861; t |= (t >> 4) & 0x08610861;
#endif #endif
*dpal = t; *dpal = t;
}
memcpy(dpal, dpal-0x20/2, 0x20*2); // for prio bit
spal += 0x20/2, dpal += 0x20/2;
} }
memcpy(&Pico.est.HighPal[0x20], Pico.est.HighPal, 0x20*2); // for prio bit
Pico.est.HighPal[0xe0] = 0; Pico.est.HighPal[0xe0] = 0;
} }