// 8bit accurate renderer\r
if (Pico.m.dirtyPal)\r
{\r
+ int pallen = 0x40;\r
Pico.m.dirtyPal = 0;\r
- if(Pico.video.reg[0xC]&8) { // shadow/hilight mode\r
+ if (Pico.video.reg[0xC]&8) // shadow/hilight mode\r
+ {\r
vidConvCpyRGB32(localPal, Pico.cram, 0x40);\r
vidConvCpyRGB32sh(localPal+0x40, Pico.cram, 0x40);\r
vidConvCpyRGB32hi(localPal+0x80, Pico.cram, 0x40);\r
memcpy32(localPal+0xc0, localPal+0x40, 0x40);\r
- localPal[0xc0] = 0x0000c000;\r
- localPal[0xd0] = 0x00c00000;\r
- localPal[0xe0] = 0x00000000; // reserved pixels for OSD\r
- localPal[0xf0] = 0x00ffffff;\r
- gp2x_video_setpalette(localPal, 0x100);\r
- } else if (rendstatus & PDRAW_SONIC_MODE) { // mid-frame palette changes\r
+ pallen = 0x100;\r
+ }\r
+ else if (rendstatus & PDRAW_ACC_SPRITES) {\r
+ vidConvCpyRGB32(localPal, Pico.cram, 0x40);\r
+ memcpy32(localPal+0x40, localPal, 0x40);\r
+ memcpy32(localPal+0x80, localPal, 0x40);\r
+ memcpy32(localPal+0xc0, localPal, 0x40);\r
+ pallen = 0x100;\r
+ }\r
+ else if (rendstatus & PDRAW_SONIC_MODE) { // mid-frame palette changes\r
vidConvCpyRGB32(localPal, Pico.cram, 0x40);\r
vidConvCpyRGB32(localPal+0x40, HighPal, 0x40);\r
vidConvCpyRGB32(localPal+0x80, HighPal+0x40, 0x40);\r
- gp2x_video_setpalette(localPal, 0xc0);\r
- } else {\r
+ pallen = 0xc0;\r
+ }\r
+ else {\r
vidConvCpyRGB32(localPal, Pico.cram, 0x40);\r
- gp2x_video_setpalette(localPal, 0x40);\r
}\r
+ if (pallen > 0xc0) {\r
+ localPal[0xc0] = 0x0000c000;\r
+ localPal[0xd0] = 0x00c00000;\r
+ localPal[0xe0] = 0x00000000; // reserved pixels for OSD\r
+ localPal[0xf0] = 0x00ffffff;\r
+ }\r
+ gp2x_video_setpalette(localPal, pallen);\r
}\r
}\r
\r
extern void amips_clut(unsigned short *dst, unsigned char *src, unsigned short *pal, int count);
+extern void amips_clut_6bit(unsigned short *dst, unsigned char *src, unsigned short *pal, int count);
+
+extern void (*amips_clut_f)(unsigned short *dst, unsigned char *src, unsigned short *pal, int count) = NULL;
struct Vertex
{
*/
}
-static void do_pal_update(int allow_sh)
+static void do_pal_update(int allow_sh, int allow_as)
{
unsigned int *dpal=(void *)localPal;
int i;
// dpal[i] = ((spal[i]&0x000f000f)<< 1)|((spal[i]&0x00f000f0)<<3)|((spal[i]&0x0f000f00)<<4);
do_pal_convert(localPal, Pico.cram, currentConfig.gamma, currentConfig.gamma2);
+ Pico.m.dirtyPal = 0;
+ need_pal_upload = 1;
+
if (allow_sh && (Pico.video.reg[0xC]&8)) // shadow/hilight?
{
// shadowed pixels
}
localPal[0xe0] = 0;
}
- Pico.m.dirtyPal = 0;
- need_pal_upload = 1;
+ else if (allow_as && (rendstatus & PDRAW_ACC_SPRITES))
+ {
+ memcpy32(localPal+0x40, localPal, 0x40);
+ memcpy32(localPal+0x80, localPal, 0x40);
+ memcpy32(localPal+0xc0, localPal, 0x40);
+ }
}
static void do_slowmode_lines(int line_to)
if (!(Pico.video.reg[1]&8)) { line = 8; dst += 512*8; src += 512*8; }
for (; line < line_to; line++, dst+=512, src+=512)
- amips_clut(dst, src, localPal, line_len);
+ amips_clut_f(dst, src, localPal, line_len);
}
static void EmuScanPrepare(void)
dynamic_palette = 0;
if (Pico.m.dirtyPal)
- do_pal_update(1);
+ do_pal_update(1, 1);
+ if ((rendstatus & PDRAW_ACC_SPRITES) && !(Pico.video.reg[0xC]&8))
+ amips_clut_f = amips_clut_6bit;
+ else amips_clut_f = amips_clut;
}
static int EmuScanSlowBegin(unsigned int num)
do_slowmode_lines(num);
dynamic_palette = 1;
}
- do_pal_update(1);
+ do_pal_update(1, 0);
}
if (dynamic_palette) {
int line_len = (Pico.video.reg[12]&1) ? 320 : 256;
void *dst = (char *)VRAM_STUFF + 512*240 + 512*2*num;
- amips_clut(dst, HighCol + 8, localPal, line_len);
+ amips_clut_f(dst, HighCol + 8, localPal, line_len);
}
return 0;
}
if ((PicoOpt&0x10) && Pico.m.dirtyPal)
- do_pal_update(0);
+ do_pal_update(0, 0);
sceKernelDcacheWritebackAll();