X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2Fdraw.c;h=83010a498b08fd535bc63d5f618490ebf8e3bc45;hb=24aab4da7352b5cecad4e09b0dcc0807b14786f2;hp=e2e4fb498b27b5570f66e2bee04b5547ba4a66c1;hpb=e42a47e2086e6512519dd86af420363498302f49;p=picodrive.git diff --git a/pico/draw.c b/pico/draw.c index e2e4fb4..83010a4 100644 --- a/pico/draw.c +++ b/pico/draw.c @@ -129,19 +129,12 @@ static void funcname(int sx, unsigned int pack, int pal) \ } -#ifdef _ASM_DRAW_C_AMIPS -int TileNorm(int sx, unsigned int pack, int pal); -int TileFlip(int sx, unsigned int pack, int pal); -#else - #define pix_just_write(x) \ if (t) pd[x]=pal|t TileNormMaker(TileNorm,pix_just_write) TileFlipMaker(TileFlip,pix_just_write) -#endif - #ifndef _ASM_DRAW_C // draw a sprite pixel, process operator colors @@ -222,7 +215,7 @@ static void DrawStrip(struct TileStrip *ts, int lflags, int cellskip) { unsigned int pack; - code = Pico.vram[ts->nametab + (tilex & ts->xmask)]; + code = PicoMem.vram[ts->nametab + (tilex & ts->xmask)]; if (code == blank) continue; if ((code >> 15) | (lflags & LF_FORCE)) { // high priority tile @@ -242,7 +235,7 @@ static void DrawStrip(struct TileStrip *ts, int lflags, int cellskip) pal=((code>>9)&0x30)|sh; } - pack = *(unsigned int *)(Pico.vram + addr); + pack = *(unsigned int *)(PicoMem.vram + addr); if (!pack) { blank = code; continue; @@ -268,7 +261,11 @@ static void DrawStripVSRam(struct TileStrip *ts, int plane_sh, int cellskip) // Draw tiles across screen: tilex=(-ts->hscroll)>>3; dx=((ts->hscroll-1)&7)+1; - if(dx != 8) cell--; // have hscroll, start with negative cell + if (ts->hscroll & 0x0f) { + int adj = ((ts->hscroll ^ dx) >> 3) & 1; + cell -= adj + 1; + ts->cells -= adj; + } cell+=cellskip; tilex+=cellskip; dx+=cellskip<<3; @@ -281,7 +278,7 @@ static void DrawStripVSRam(struct TileStrip *ts, int plane_sh, int cellskip) //if((cell&1)==0) { int line,vscroll; - vscroll=Pico.vsram[(plane_sh&1)+(cell&~1)]; + vscroll=PicoMem.vsram[(plane_sh&1)+(cell&~1)]; // Find the line in the name table line=(vscroll+scan)&ts->line&0xffff; // ts->line is really ymask .. @@ -289,7 +286,7 @@ static void DrawStripVSRam(struct TileStrip *ts, int plane_sh, int cellskip) ty=(line&7)<<1; // Y-Offset into tile } - code=Pico.vram[ts->nametab+nametabadd+(tilex&ts->xmask)]; + code=PicoMem.vram[ts->nametab+nametabadd+(tilex&ts->xmask)]; if (code==blank) continue; if (code>>15) { // high priority tile int cval = code | (dx<<16) | (ty<<25); @@ -307,7 +304,7 @@ static void DrawStripVSRam(struct TileStrip *ts, int plane_sh, int cellskip) pal=((code>>9)&0x30)|((plane_sh<<5)&0x40); } - pack = *(unsigned int *)(Pico.vram + addr); + pack = *(unsigned int *)(PicoMem.vram + addr); if (!pack) { blank = code; continue; @@ -343,7 +340,7 @@ void DrawStripInterlace(struct TileStrip *ts) { unsigned int pack; - code=Pico.vram[ts->nametab+(tilex&ts->xmask)]; + code = PicoMem.vram[ts->nametab + (tilex & ts->xmask)]; if (code==blank) continue; if (code>>15) { // high priority tile int cval = (code&0xfc00) | (dx<<16) | (ty<<25); @@ -363,7 +360,7 @@ void DrawStripInterlace(struct TileStrip *ts) pal=((code>>9)&0x30); } - pack = *(unsigned int *)(Pico.vram + addr); + pack = *(unsigned int *)(PicoMem.vram + addr); if (!pack) { blank = code; continue; @@ -416,11 +413,11 @@ static void DrawLayer(int plane_sh, int *hcache, int cellskip, int maxcells, htab+=plane_sh&1; // A or B // Get horizontal scroll value, will be masked later - ts.hscroll=Pico.vram[htab&0x7fff]; + ts.hscroll = PicoMem.vram[htab & 0x7fff]; if((pvid->reg[12]&6) == 6) { // interlace mode 2 - vscroll=Pico.vsram[plane_sh&1]; // Get vertical scroll value + vscroll = PicoMem.vsram[plane_sh & 1]; // Get vertical scroll value // Find the line in the name table ts.line=(vscroll+(est->DrawScanline<<1))&((ymask<<1)|1); @@ -433,7 +430,7 @@ static void DrawLayer(int plane_sh, int *hcache, int cellskip, int maxcells, ts.line=ymask|(shift[width]<<24); // save some stuff instead of line DrawStripVSRam(&ts, plane_sh, cellskip); } else { - vscroll=Pico.vsram[plane_sh&1]; // Get vertical scroll value + vscroll = PicoMem.vsram[plane_sh & 1]; // Get vertical scroll value // Find the line in the name table ts.line=(vscroll+est->DrawScanline)&ymask; @@ -470,7 +467,7 @@ static void DrawWindow(int tstart, int tend, int prio, int sh, if (!(est->rendstatus & PDRAW_WND_DIFF_PRIO)) { // check the first tile code - code=Pico.vram[nametab+tilex]; + code = PicoMem.vram[nametab + tilex]; // if the whole window uses same priority (what is often the case), we may be able to skip this field if ((code>>15) != prio) return; } @@ -487,7 +484,7 @@ static void DrawWindow(int tstart, int tend, int prio, int sh, int dx, addr; int pal; - code=Pico.vram[nametab+tilex]; + code = PicoMem.vram[nametab + tilex]; if (code==blank) continue; if ((code>>15) != prio) { est->rendstatus |= PDRAW_WND_DIFF_PRIO; @@ -498,7 +495,7 @@ static void DrawWindow(int tstart, int tend, int prio, int sh, addr=(code&0x7ff)<<4; if (code&0x1000) addr+=14-ty; else addr+=ty; // Y-flip - pack = *(unsigned int *)(Pico.vram + addr); + pack = *(unsigned int *)(PicoMem.vram + addr); if (!pack) { blank = code; continue; @@ -519,7 +516,7 @@ static void DrawWindow(int tstart, int tend, int prio, int sh, int dx, addr; int pal; - code=Pico.vram[nametab+tilex]; + code = PicoMem.vram[nametab + tilex]; if(code==blank) continue; if((code>>15) != prio) { est->rendstatus |= PDRAW_WND_DIFF_PRIO; @@ -540,7 +537,7 @@ static void DrawWindow(int tstart, int tend, int prio, int sh, addr=(code&0x7ff)<<4; if (code&0x1000) addr+=14-ty; else addr+=ty; // Y-flip - pack = *(unsigned int *)(Pico.vram + addr); + pack = *(unsigned int *)(PicoMem.vram + addr); if (!pack) { blank = code; continue; @@ -594,7 +591,7 @@ static void DrawTilesFromCache(int *hc, int sh, int rlim, struct PicoEState *est addr = (code & 0x7ff) << 4; addr += code >> 25; // y offset into tile - pack = *(unsigned int *)(Pico.vram + addr); + pack = *(unsigned int *)(PicoMem.vram + addr); if (!pack) { blank = (short)code; continue; @@ -622,7 +619,7 @@ static void DrawTilesFromCache(int *hc, int sh, int rlim, struct PicoEState *est *zb++ &= 0xbf; *zb++ &= 0xbf; *zb++ &= 0xbf; *zb++ &= 0xbf; *zb++ &= 0xbf; *zb++ &= 0xbf; *zb++ &= 0xbf; *zb++ &= 0xbf; - pack = *(unsigned int *)(Pico.vram + addr); + pack = *(unsigned int *)(PicoMem.vram + addr); if (!pack) continue; @@ -724,7 +721,7 @@ static void DrawSprite(int *sprite, int sh) if(sx<=0) continue; if(sx>=328) break; // Offscreen - pack = *(unsigned int *)(Pico.vram + (tile & 0x7fff)); + pack = *(unsigned int *)(PicoMem.vram + (tile & 0x7fff)); fTileFunc(sx, pack, pal); } } @@ -744,7 +741,7 @@ static NOINLINE void DrawTilesFromCacheForced(const int *hc) dx = (code >> 16) & 0x1ff; pal = ((code >> 9) & 0x30); - pack = *(unsigned int *)(Pico.vram + addr); + pack = *(unsigned int *)(PicoMem.vram + addr); if (code & 0x0800) TileFlip_and(dx, pack, pal); else TileNorm_and(dx, pack, pal); @@ -790,7 +787,7 @@ static void DrawSpriteInterlace(unsigned int *sprite) if(sx<=0) continue; if(sx>=328) break; // Offscreen - pack = *(unsigned int *)(Pico.vram + (tile & 0x7fff)); + pack = *(unsigned int *)(PicoMem.vram + (tile & 0x7fff)); if (code & 0x0800) TileFlip(sx, pack, pal); else TileNorm(sx, pack, pal); } @@ -812,7 +809,7 @@ static NOINLINE void DrawAllSpritesInterlace(int pri, int sh) unsigned int *sprite; int code, sx, sy, height; - sprite=(unsigned int *)(Pico.vram+((table+(link<<2))&0x7ffc)); // Find sprite + sprite=(unsigned int *)(PicoMem.vram+((table+(link<<2))&0x7ffc)); // Find sprite // get sprite info code = sprite[0]; @@ -915,7 +912,7 @@ static void DrawSpritesSHi(unsigned char *sprited, const struct PicoEState *est) if(sx<=0) continue; if(sx>=328) break; // Offscreen - pack = *(unsigned int *)(Pico.vram + (tile & 0x7fff)); + pack = *(unsigned int *)(PicoMem.vram + (tile & 0x7fff)); fTileFunc(sx, pack, pal); } } @@ -989,7 +986,7 @@ static void DrawSpritesHiAS(unsigned char *sprited, int sh) if(sx<=0) continue; if(sx>=328) break; // Offscreen - pack = *(unsigned int *)(Pico.vram + (tile & 0x7fff)); + pack = *(unsigned int *)(PicoMem.vram + (tile & 0x7fff)); fTileFunc(sx, pack, pal); } } @@ -1049,7 +1046,7 @@ static NOINLINE void PrepareSprites(int full) unsigned int *sprite; int code2, sx, sy, height; - sprite=(unsigned int *)(Pico.vram+((table+(link<<2))&0x7ffc)); // Find sprite + sprite=(unsigned int *)(PicoMem.vram+((table+(link<<2))&0x7ffc)); // Find sprite // parse sprite info code2 = sprite[1]; @@ -1102,7 +1099,7 @@ found:; unsigned int *sprite; int code, code2, sx, sy, hv, height, width; - sprite=(unsigned int *)(Pico.vram+((table+(link<<2))&0x7ffc)); // Find sprite + sprite=(unsigned int *)(PicoMem.vram+((table+(link<<2))&0x7ffc)); // Find sprite // parse sprite info code = sprite[0]; @@ -1226,7 +1223,7 @@ void PicoDoHighPal555(int sh, int line, struct PicoEState *est) Pico.m.dirtyPal = 0; - spal = (void *)Pico.cram; + spal = (void *)PicoMem.cram; dpal = (void *)est->HighPal; for (i = 0; i < 0x40 / 2; i++) { @@ -1308,9 +1305,9 @@ static void FinalizeLine8bit(int sh, int line, struct PicoEState *est) rs |= PDRAW_SONIC_MODE; est->rendstatus = rs; if (dirty_count == 3) { - blockcpy(est->HighPal, Pico.cram, 0x40*2); + blockcpy(est->HighPal, PicoMem.cram, 0x40*2); } else if (dirty_count == 11) { - blockcpy(est->HighPal+0x40, Pico.cram, 0x40*2); + blockcpy(est->HighPal+0x40, PicoMem.cram, 0x40*2); } } @@ -1620,7 +1617,7 @@ void PicoDrawSetOutBuf(void *dest, int increment) { DrawLineDestBase = dest; DrawLineDestIncrement = increment; - Pico.est.DrawLineDest = DrawLineDestBase + Pico.est.DrawScanline * increment; + Pico.est.DrawLineDest = (char *)DrawLineDestBase + Pico.est.DrawScanline * increment; } void PicoDrawSetInternalBuf(void *dest, int increment)