static int HighColIncrement;\r
\r
static unsigned int DefOutBuff[320*2/2];\r
-void *DrawLineDest = DefOutBuff; // pointer to dest buffer where to draw this line to\r
void *DrawLineDestBase = DefOutBuff;\r
int DrawLineDestIncrement;\r
\r
static int HighCacheA[41+1]; // caches for high layers\r
static int HighCacheB[41+1];\r
-int HighPreSpr[80*2+1]; // slightly preprocessed sprites\r
+static int HighPreSpr[80*2+1]; // slightly preprocessed sprites\r
\r
#define SPRL_HAVE_HI 0x80 // have hi priority sprites\r
#define SPRL_HAVE_LO 0x40 // *lo*\r
#define TileNormMaker(funcname,pix_func) \\r
static int funcname(int sx,int addr,int pal) \\r
{ \\r
- unsigned char *pd = HighCol+sx; \\r
+ unsigned char *pd = Pico.est.HighCol+sx; \\r
unsigned int pack=0; unsigned int t=0; \\r
\\r
pack=*(unsigned int *)(Pico.vram+addr); /* Get 8 pixels */ \\r
#define TileFlipMaker(funcname,pix_func) \\r
static int funcname(int sx,int addr,int pal) \\r
{ \\r
- unsigned char *pd = HighCol+sx; \\r
+ unsigned char *pd = Pico.est.HighCol+sx; \\r
unsigned int pack=0; unsigned int t=0; \\r
\\r
pack=*(unsigned int *)(Pico.vram+addr); /* Get 8 pixels */ \\r
pal=((code>>9)&0x30);\r
\r
if (prio) {\r
- int *zb = (int *)(HighCol+8+(tilex<<3));\r
+ int *zb = (int *)(est->HighCol+8+(tilex<<3));\r
*zb++ &= 0xbfbfbfbf;\r
*zb &= 0xbfbfbfbf;\r
} else {\r
// as some layer has covered whole line with hi priority tiles,\r
// we can process whole line and then act as if sh/hi mode was off,\r
// but leave lo pri op sprite markers alone\r
- int c = 320/4, *zb = (int *)(HighCol+8);\r
+ int c = 320/4, *zb = (int *)(Pico.est.HighCol+8);\r
Pico.est.rendstatus |= PDRAW_SHHI_DONE;\r
while (c--)\r
{\r
addr=(code&0x7ff)<<4;\r
addr+=(unsigned int)code>>25; // y offset into tile\r
dx=(code>>16)&0x1ff;\r
- zb = HighCol+dx;\r
+ zb = est->HighCol+dx;\r
*zb++ &= 0xbf; *zb++ &= 0xbf; *zb++ &= 0xbf; *zb++ &= 0xbf;\r
*zb++ &= 0xbf; *zb++ &= 0xbf; *zb++ &= 0xbf; *zb++ &= 0xbf;\r
\r
last_cut_tile:\r
{\r
unsigned int t, pack=*(unsigned int *)(Pico.vram+addr); // Get 8 pixels\r
- unsigned char *pd = HighCol+dx;\r
+ unsigned char *pd = est->HighCol+dx;\r
if (!pack) return;\r
if (code&0x0800)\r
{\r
int offs, delta, width, height, row;\r
\r
offs = (p[cnt] & 0x7f) * 2;\r
- sprite = HighPreSpr + offs;\r
+ sprite = est->HighPreSpr + offs;\r
code = sprite[1];\r
pal = (code>>9)&0x30;\r
\r
\r
/* nasty 1: remove 'sprite' flags */\r
{\r
- int c = 320/4/4, *zb = (int *)(HighCol+8);\r
+ int c = 320/4/4, *zb = (int *)(Pico.est.HighCol+8);\r
while (c--)\r
{\r
*zb++ &= 0x7f7f7f7f; *zb++ &= 0x7f7f7f7f;\r
\r
// --------------------------------------------\r
\r
-void BackFill(int reg7, int sh)\r
+void BackFill(int reg7, int sh, struct PicoEState *est)\r
{\r
unsigned int back;\r
\r
back|=back<<8;\r
back|=back<<16;\r
\r
- memset32((int *)(HighCol+8), back, 320/4);\r
+ memset32((int *)(est->HighCol+8), back, 320/4);\r
}\r
#endif\r
\r
// --------------------------------------------\r
\r
-unsigned short HighPal[0x100];\r
-\r
#ifndef _ASM_DRAW_C\r
void PicoDoHighPal555(int sh, int line, struct PicoEState *est)\r
{\r
Pico.m.dirtyPal = 0;\r
\r
spal = (void *)Pico.cram;\r
- dpal = (void *)HighPal;\r
+ dpal = (void *)est->HighPal;\r
\r
for (i = 0; i < 0x40 / 2; i++) {\r
t = spal[i];\r
}\r
}\r
\r
-void FinalizeLine555(int sh, int line)\r
+void FinalizeLine555(int sh, int line, struct PicoEState *est)\r
{\r
- unsigned short *pd=DrawLineDest;\r
- unsigned char *ps=HighCol+8;\r
- unsigned short *pal=HighPal;\r
+ unsigned short *pd=est->DrawLineDest;\r
+ unsigned char *ps=est->HighCol+8;\r
+ unsigned short *pal=est->HighPal;\r
int len;\r
\r
if (Pico.m.dirtyPal)\r
\r
static void FinalizeLine8bit(int sh, int line, struct PicoEState *est)\r
{\r
- unsigned char *pd = DrawLineDest;\r
+ unsigned char *pd = est->DrawLineDest;\r
int len, rs = est->rendstatus;\r
static int dirty_count;\r
\r
rs |= PDRAW_SONIC_MODE;\r
est->rendstatus = rs;\r
if (dirty_count == 3) {\r
- blockcpy(HighPal, Pico.cram, 0x40*2);\r
+ blockcpy(est->HighPal, Pico.cram, 0x40*2);\r
} else if (dirty_count == 11) {\r
- blockcpy(HighPal+0x40, Pico.cram, 0x40*2);\r
+ blockcpy(est->HighPal+0x40, Pico.cram, 0x40*2);\r
}\r
}\r
\r
\r
if (!sh && (rs & PDRAW_SONIC_MODE)) {\r
if (dirty_count >= 11) {\r
- blockcpy_or(pd, HighCol+8, len, 0x80);\r
+ blockcpy_or(pd, est->HighCol+8, len, 0x80);\r
} else {\r
- blockcpy_or(pd, HighCol+8, len, 0x40);\r
+ blockcpy_or(pd, est->HighCol+8, len, 0x40);\r
}\r
} else {\r
- blockcpy(pd, HighCol+8, len);\r
+ blockcpy(pd, est->HighCol+8, len);\r
}\r
}\r
\r
rendstatus_old = Pico.est.rendstatus;\r
}\r
\r
- HighCol = HighColBase + offs * HighColIncrement;\r
- DrawLineDest = (char *)DrawLineDestBase + offs * DrawLineDestIncrement;\r
+ Pico.est.HighCol = HighColBase + offs * HighColIncrement;\r
+ Pico.est.DrawLineDest = (char *)DrawLineDestBase + offs * DrawLineDestIncrement;\r
Pico.est.DrawScanline = 0;\r
skip_next_line = 0;\r
\r
if (PicoScanBegin != NULL)\r
PicoScanBegin(line + offs);\r
\r
- BackFill(bgc, sh);\r
+ BackFill(bgc, sh, &Pico.est);\r
\r
if (FinalizeLine != NULL)\r
FinalizeLine(sh, line, &Pico.est);\r
if (PicoScanEnd != NULL)\r
PicoScanEnd(line + offs);\r
\r
- HighCol += HighColIncrement;\r
- DrawLineDest = (char *)DrawLineDest + DrawLineDestIncrement;\r
+ Pico.est.HighCol += HighColIncrement;\r
+ Pico.est.DrawLineDest = (char *)Pico.est.DrawLineDest + DrawLineDestIncrement;\r
}\r
\r
static void PicoLine(int line, int offs, int sh, int bgc)\r
}\r
\r
// Draw screen:\r
- BackFill(bgc, sh);\r
+ BackFill(bgc, sh, &Pico.est);\r
if (Pico.video.reg[1]&0x40)\r
DrawDisplay(sh);\r
\r
if (PicoScanEnd != NULL)\r
skip_next_line = PicoScanEnd(line + offs);\r
\r
- HighCol += HighColIncrement;\r
- DrawLineDest = (char *)DrawLineDest + DrawLineDestIncrement;\r
+ Pico.est.HighCol += HighColIncrement;\r
+ Pico.est.DrawLineDest = (char *)Pico.est.DrawLineDest + DrawLineDestIncrement;\r
}\r
\r
void PicoDrawSync(int to, int blank_last_line)\r
// also works for fast renderer\r
void PicoDrawUpdateHighPal(void)\r
{\r
+ struct PicoEState *est = &Pico.est;\r
int sh = (Pico.video.reg[0xC] & 8) >> 3; // shadow/hilight?\r
if (PicoOpt & POPT_ALT_RENDERER)\r
sh = 0; // no s/h support\r
\r
PicoDoHighPal555(sh, 0, &Pico.est);\r
- if (Pico.est.rendstatus & PDRAW_SONIC_MODE) {\r
+ if (est->rendstatus & PDRAW_SONIC_MODE) {\r
// FIXME?\r
- memcpy(HighPal + 0x40, HighPal, 0x40*2);\r
- memcpy(HighPal + 0x80, HighPal, 0x40*2);\r
+ memcpy(est->HighPal + 0x40, est->HighPal, 0x40*2);\r
+ memcpy(est->HighPal + 0x80, est->HighPal, 0x40*2);\r
}\r
}\r
\r
{\r
DrawLineDestBase = dest;\r
DrawLineDestIncrement = increment;\r
- DrawLineDest = (unsigned char*)DrawLineDestBase + Pico.est.DrawScanline * increment;\r
+ Pico.est.DrawLineDest = (unsigned char*)DrawLineDestBase + Pico.est.DrawScanline * increment;\r
}\r
\r
void PicoDrawSetInternalBuf(void *dest, int increment)\r
if (dest != NULL) {\r
HighColBase = dest;\r
HighColIncrement = increment;\r
- HighCol = HighColBase + Pico.est.DrawScanline * increment;\r
+ Pico.est.HighCol = HighColBase + Pico.est.DrawScanline * increment;\r
}\r
else {\r
HighColBase = DefHighCol;\r
}\r
}\r
\r
-// vim:ts=4:sw=4:expandtab\r
+void PicoDrawInit(void)\r
+{\r
+ Pico.est.DrawLineDest = DefOutBuff;\r
+ Pico.est.HighCol = HighColBase;\r
+ Pico.est.HighPreSpr = HighPreSpr;\r
+ rendstatus_old = -1;\r
+}\r
+\r
+// vim:ts=2:sw=2:expandtab\r