X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2FDraw2.c;h=ec82e44e768de69a634fd8a52adcf52322ebceff;hb=d95259bdaaf911218656d8a74b096ff7306034f6;hp=5037e2f921c81ec8dec6673c5a8a0f0440c0ba2e;hpb=eff55556cff77fd64cff4be32e449e0a58aed6fe;p=picodrive.git diff --git a/Pico/Draw2.c b/Pico/Draw2.c index 5037e2f..ec82e44 100644 --- a/Pico/Draw2.c +++ b/Pico/Draw2.c @@ -20,8 +20,13 @@ #define USE_CACHE +// note: this is not implemented in ARM asm +#if defined(DRAW2_OVERRIDE_LINE_WIDTH) +#define LINE_WIDTH DRAW2_OVERRIDE_LINE_WIDTH +#else +#define LINE_WIDTH 328 +#endif -extern unsigned char *framebuff; // in format (8+320)x(8+224+8) (eights for borders) int currpri = 0; static int HighCache2A[41*(TILE_ROWS+1)+1+1]; // caches for high layers @@ -46,7 +51,7 @@ static int TileXnormYnorm(unsigned char *pd,int addr,unsigned char pal) unsigned int pack=0; unsigned int t=0, blank = 1; int i; - for(i=8; i; i--, addr+=2, pd += 320+8) { + for(i=8; i; i--, addr+=2, pd += LINE_WIDTH) { pack=*(unsigned int *)(Pico.vram+addr); // Get 8 pixels if(!pack) continue; @@ -69,7 +74,7 @@ static int TileXflipYnorm(unsigned char *pd,int addr,unsigned char pal) unsigned int pack=0; unsigned int t=0, blank = 1; int i; - for(i=8; i; i--, addr+=2, pd += 320+8) { + for(i=8; i; i--, addr+=2, pd += LINE_WIDTH) { pack=*(unsigned int *)(Pico.vram+addr); // Get 8 pixels if(!pack) continue; @@ -92,7 +97,7 @@ static int TileXnormYflip(unsigned char *pd,int addr,unsigned char pal) int i; addr+=14; - for(i=8; i; i--, addr-=2, pd += 320+8) { + for(i=8; i; i--, addr-=2, pd += LINE_WIDTH) { pack=*(unsigned int *)(Pico.vram+addr); // Get 8 pixels if(!pack) continue; @@ -116,7 +121,7 @@ static int TileXflipYflip(unsigned char *pd,int addr,unsigned char pal) int i; addr+=14; - for(i=8; i; i--, addr-=2, pd += 320+8) { + for(i=8; i; i--, addr-=2, pd += LINE_WIDTH) { pack=*(unsigned int *)(Pico.vram+addr); // Get 8 pixels if(!pack) continue; @@ -139,7 +144,7 @@ static void DrawWindowFull(int start, int end, int prio) { struct PicoVideo *pvid=&Pico.video; int nametab, nametab_step, trow, tilex, blank=-1, code; - unsigned char *scrpos = framebuff; + unsigned char *scrpos = PicoDraw2FB; int tile_start, tile_end; // in cells // parse ranges @@ -165,8 +170,8 @@ static void DrawWindowFull(int start, int end, int prio) code=Pico.vram[nametab+tile_start]; if ((code>>15) != prio) return; // hack: just assume that whole window uses same priority - scrpos+=8*328+8; - scrpos+=8*328*(start-START_ROW); + scrpos+=8*LINE_WIDTH+8; + scrpos+=8*LINE_WIDTH*(start-START_ROW); // do a window until we reach planestart row for(trow = start; trow < end; trow++, nametab+=nametab_step) { // current tile row @@ -194,7 +199,7 @@ static void DrawWindowFull(int start, int end, int prio) if(zero) blank=code; // We know this tile is blank now } - scrpos += 328*8; + scrpos += LINE_WIDTH*8; } } @@ -239,12 +244,12 @@ static void DrawLayerFull(int plane, int *hcache, int planestart, int planeend) if (plane==0) nametab=(pvid->reg[2]&0x38)<< 9; // A else nametab=(pvid->reg[4]&0x07)<<12; // B - scrpos = framebuff; - scrpos+=8*328*(planestart-START_ROW); + scrpos = PicoDraw2FB; + scrpos+=8*LINE_WIDTH*(planestart-START_ROW); // Get vertical scroll value: vscroll=Pico.vsram[plane]&0x1ff; - scrpos+=(8-(vscroll&7))*328; + scrpos+=(8-(vscroll&7))*LINE_WIDTH; if(vscroll&7) planeend++; // we have vertically clipped tiles due to vscroll, so we need 1 more row *hcache++ = 8-(vscroll&7); // push y-offset to tilecache @@ -303,7 +308,7 @@ static void DrawLayerFull(int plane, int *hcache, int planestart, int planeend) if(zero) blank=code; // We know this tile is blank now } - scrpos += 328*8; + scrpos += LINE_WIDTH*8; } *hcache = 0; // terminate cache @@ -317,10 +322,10 @@ static void DrawTilesFromCacheF(int *hc) // unsigned short *pal; unsigned char pal; short blank=-1; // The tile we know is blank - unsigned char *scrpos = framebuff, *pd = 0; + unsigned char *scrpos = PicoDraw2FB, *pd = 0; // *hcache++ = code|(dx<<16)|(trow<<27); // cache it - scrpos+=(*hc++)*328 - START_ROW*328*8; + scrpos+=(*hc++)*LINE_WIDTH - START_ROW*LINE_WIDTH*8; while((code=*hc++)) { if((short)code == blank) continue; @@ -328,7 +333,7 @@ static void DrawTilesFromCacheF(int *hc) // y pos if(((unsigned)code>>27) != prevy) { prevy = (unsigned)code>>27; - pd = scrpos + prevy*328*8; + pd = scrpos + prevy*LINE_WIDTH*8; } // Get tile address/2: @@ -380,8 +385,8 @@ static void DrawSpriteFull(unsigned int *sprite) // goto first vertically visible tile while(sy <= START_ROW*8) { sy+=8; tile+=tdeltay; height--; } - scrpos = framebuff; - scrpos+=(sy-START_ROW*8)*328; + scrpos = PicoDraw2FB; + scrpos+=(sy-START_ROW*8)*LINE_WIDTH; for (; height > 0; height--, sy+=8, tile+=tdeltay) { @@ -403,7 +408,7 @@ static void DrawSpriteFull(unsigned int *sprite) } } - scrpos+=8*328; + scrpos+=8*LINE_WIDTH; } } #endif @@ -480,8 +485,7 @@ static void DrawAllSpritesFull(int prio, int maxwidth) #ifndef _ASM_DRAW_C static void BackFillFull(int reg7) { - unsigned int back, i; - unsigned int *p=(unsigned int *)framebuff; + unsigned int back; // Start with a background color: // back=PicoCramHigh[reg7&0x3f]; @@ -489,12 +493,7 @@ static void BackFillFull(int reg7) back|=back<<8; back|=back<<16; - for(i = (8+320)*(8+(END_ROW-START_ROW)*8)/16; i; i--) { - *p++ = back; // do 16 pixels per iteration - *p++ = back; - *p++ = back; - *p++ = back; - } + memset32((int *)PicoDraw2FB, back, LINE_WIDTH*(8+(END_ROW-START_ROW)*8)/4); } #endif