From: notaz Date: Sun, 9 Sep 2007 20:27:44 +0000 (+0000) Subject: don't draw layer where window is (for World Championship Soccer II) X-Git-Tag: v1.85~673 X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=83c093a48ab58670ea82d0ec81658daa9f9b950a;p=picodrive.git don't draw layer where window is (for World Championship Soccer II) git-svn-id: file:///home/notaz/opt/svn/PicoDrive@243 be3aeb3a-fb24-0410-a615-afba39da0efa --- diff --git a/Pico/Draw.c b/Pico/Draw.c index dec7abd..9d7e9bc 100644 --- a/Pico/Draw.c +++ b/Pico/Draw.c @@ -48,7 +48,7 @@ void BackFill(int reg7, int sh); void DrawSprite(int *sprite, int **hc, int sh); void DrawTilesFromCache(int *hc, int sh, int rlim); void DrawSpritesFromCache(int *hc, int sh); -void DrawLayer(int plane, int *hcache, int maxcells, int sh); +void DrawLayer(int plane_sh, int *hcache, int cellskip, int maxcells); void FinalizeLineBGR444(int sh); void FinalizeLineRGB555(int sh); void blockcpy_or(void *dst, void *src, size_t n, int pat); @@ -271,20 +271,22 @@ static int TileFlipZSH(int sx,int addr,int pal,int zval) // -------------------------------------------- #ifndef _ASM_DRAW_C -static void DrawStrip(struct TileStrip *ts, int sh) +static void DrawStrip(struct TileStrip *ts, int plane_sh, int cellskip) { - int tilex=0,dx=0,ty=0,code=0,addr=0,cells; + int tilex,dx,ty,code=0,addr=0,cells; int oldcode=-1,blank=-1; // The tile we know is blank - int pal=0; + int pal=0,sh; // Draw tiles across screen: - tilex=(-ts->hscroll)>>3; + sh=(plane_sh<<5)&0x40; + tilex=((-ts->hscroll)>>3)+cellskip; ty=(ts->line&7)<<1; // Y-Offset into tile dx=((ts->hscroll-1)&7)+1; - cells = ts->cells; + cells = ts->cells - cellskip; if(dx != 8) cells++; // have hscroll, need to draw 1 cell more + dx+=cellskip<<3; - for (; cells; dx+=8,tilex++,cells--) + for (; cells > 0; dx+=8,tilex++,cells--) { int zero=0; @@ -304,8 +306,7 @@ static void DrawStrip(struct TileStrip *ts, int sh) addr+=ty; if (code&0x1000) addr^=0xe; // Y-flip -// pal=Pico.cram+((code>>9)&0x30); - pal=((code>>9)&0x30)|(sh<<6); + pal=((code>>9)&0x30)|sh; } if (code&0x0800) zero=TileFlip(dx,addr,pal); @@ -321,34 +322,28 @@ static void DrawStrip(struct TileStrip *ts, int sh) } // this is messy -void DrawStripVSRam(struct TileStrip *ts, int plane) +void DrawStripVSRam(struct TileStrip *ts, int plane_sh, int cellskip) { - int tilex=0,dx=0,ty=0,code=0,addr=0,cell=0,nametabadd=0; + int tilex,dx,code=0,addr=0,cell=0; int oldcode=-1,blank=-1; // The tile we know is blank int pal=0,scan=Scanline; // Draw tiles across screen: tilex=(-ts->hscroll)>>3; dx=((ts->hscroll-1)&7)+1; - if(dx != 8) { - int vscroll, line; - cell--; // have hscroll, start with negative cell - // also calculate intial VS stuff - vscroll=Pico.vsram[plane]; - - // Find the line in the name table - line=(vscroll+scan)&ts->line&0xffff; // ts->line is really ymask .. - nametabadd=(line>>3)<<(ts->line>>24); // .. and shift[width] - ty=(line&7)<<1; // Y-Offset into tile - } + if(dx != 8) cell--; // have hscroll, start with negative cell + cell+=cellskip; + tilex+=cellskip; + dx+=cellskip<<3; for (; cell < ts->cells; dx+=8,tilex++,cell++) { - int zero=0; + int zero=0,nametabadd,ty; - if((cell&1)==0) { + //if((cell&1)==0) + { int line,vscroll; - vscroll=Pico.vsram[plane+(cell&~1)]; + vscroll=Pico.vsram[(plane_sh&1)+(cell&~1)]; // Find the line in the name table line=(vscroll+scan)&ts->line&0xffff; // ts->line is really ymask .. @@ -371,8 +366,7 @@ void DrawStripVSRam(struct TileStrip *ts, int plane) addr=(code&0x7ff)<<4; if (code&0x1000) addr+=14-ty; else addr+=ty; // Y-flip -// pal=Pico.cram+((code>>9)&0x30); - pal=((code>>9)&0x30); + pal=((code>>9)&0x30)|((plane_sh<<5)&0x40); } if (code&0x0800) zero=TileFlip(dx,addr,pal); @@ -440,7 +434,7 @@ void DrawStripInterlace(struct TileStrip *ts) // -------------------------------------------- #ifndef _ASM_DRAW_C -static void DrawLayer(int plane, int *hcache, int maxcells, int sh) +static void DrawLayer(int plane_sh, int *hcache, int cellskip, int maxcells) { struct PicoVideo *pvid=&Pico.video; const char shift[4]={5,6,5,7}; // 32,64 or 128 sized tilemaps (2 is invalid) @@ -463,20 +457,20 @@ static void DrawLayer(int plane, int *hcache, int maxcells, int sh) else if(width>1) ymask =0x0ff; // Find name table: - if (plane==0) ts.nametab=(pvid->reg[2]&0x38)<< 9; // A - else ts.nametab=(pvid->reg[4]&0x07)<<12; // B + if (plane_sh&1) ts.nametab=(pvid->reg[4]&0x07)<<12; // B + else ts.nametab=(pvid->reg[2]&0x38)<< 9; // A htab=pvid->reg[13]<<9; // Horizontal scroll table address if ( pvid->reg[11]&2) htab+=Scanline<<1; // Offset by line if ((pvid->reg[11]&1)==0) htab&=~0xf; // Offset by tile - htab+=plane; // A or B + htab+=plane_sh&1; // A or B // Get horizontal scroll value, will be masked later ts.hscroll=Pico.vram[htab&0x7fff]; if((pvid->reg[12]&6) == 6) { // interlace mode 2 - vscroll=Pico.vsram[plane]; // Get vertical scroll value + vscroll=Pico.vsram[plane_sh&1]; // Get vertical scroll value // Find the line in the name table ts.line=(vscroll+(Scanline<<1))&((ymask<<1)|1); @@ -487,15 +481,15 @@ static void DrawLayer(int plane, int *hcache, int maxcells, int sh) // shit, we have 2-cell column based vscroll // luckily this doesn't happen too often ts.line=ymask|(shift[width]<<24); // save some stuff instead of line - DrawStripVSRam(&ts, plane); + DrawStripVSRam(&ts, plane_sh, cellskip); } else { - vscroll=Pico.vsram[plane]; // Get vertical scroll value + vscroll=Pico.vsram[plane_sh&1]; // Get vertical scroll value // Find the line in the name table ts.line=(vscroll+Scanline)&ymask; ts.nametab+=(ts.line>>3)<>1, 0, sh); // HighCacheAW + DrawWindow(0, maxcells>>1, 0, sh); else if (hvwind == 2) { // ahh, we have vertical window - DrawLayer(0, HighCacheA, (win&0x80) ? edge<<1 : maxcells, sh); - DrawWindow((win&0x80) ? edge : 0, (win&0x80) ? maxcells>>1 : edge, 0, sh); // HighCacheW + DrawLayer(0|(sh<<1), HighCacheA, (win&0x80) ? 0 : edge<<1, (win&0x80) ? edge<<1 : maxcells); + DrawWindow( (win&0x80) ? edge : 0, (win&0x80) ? maxcells>>1 : edge, 0, sh); } else - DrawLayer(0, HighCacheA, maxcells, sh); + DrawLayer(0|(sh<<1), HighCacheA, 0, maxcells); DrawAllSprites(HighCacheS, maxw, 0, sh); if (HighCacheB[0]) DrawTilesFromCache(HighCacheB, sh, 328); if (hvwind == 1) DrawWindow(0, maxcells>>1, 1, sh); else if (hvwind == 2) { - if(HighCacheA[0]) DrawTilesFromCache(HighCacheA, sh, (win&0x80) ? edge<<4 : 0); + if(HighCacheA[0]) DrawTilesFromCache(HighCacheA, sh, (win&0x80) ? edge<<4 : 328); DrawWindow((win&0x80) ? edge : 0, (win&0x80) ? maxcells>>1 : edge, 1, sh); } else if (HighCacheA[0]) DrawTilesFromCache(HighCacheA, sh, 328); diff --git a/Pico/Draw.s b/Pico/Draw.s index 5032f15..e31ba0b 100644 --- a/Pico/Draw.s +++ b/Pico/Draw.s @@ -211,9 +211,9 @@ @ int cells; // 0x14 @ }; -@ int DrawLayer(int plane, int *hcache, int maxcells, int sh) +@ void DrawLayer(int plane_sh, int *hcache, int cellskip, int maxcells); -.global DrawLayer @ int plane, int *hcache, int maxcells, int sh +.global DrawLayer DrawLayer: stmfd sp!, {r4-r11,lr} @@ -221,10 +221,11 @@ DrawLayer: ldr r11, =(Pico+0x22228) @ Pico.video mov r8, #1 - ldrb r7, [r11, #16] @ ??hh??ww + ldrb r7, [r11, #16] @ ??vv??hh mov r6, r1 @ hcache - orr r9, r2, r3, lsl #31 @ r9=maxcells|(sh<<31) + orr r9, r3, r0, lsl #30 + orr r9, r9, r2, lsl #8 @ r9=sh[31]|cellskip[15:8]|maxcells[7:0] (tmp) mov r1, r7, lsl #4 orr r1, r1, #0x00ff @@ -244,7 +245,7 @@ DrawLayer: sub r5, r5, #1 @ r5=xmask @ Find name table: - tst r0, r0 + ands r0, r0, #1 ldreqb r12, [r11, #2] ldrneb r12, [r11, #4] @@ -309,11 +310,15 @@ DrawLayer: orrne r10,r10, #1<<23 @ r10=(cells<<24|sh<<23|hi_not_empty<<22|had_output<<21|ty) movne r3, #0x40 @ default to shadowed pal on sh mode - mvn r9, #0 @ r9=prevcode=-1 - cmp r7, #8 addne r10,r10, #0x01000000 @ we will loop cells+1 times if there is scroll + and r9, r9, #0xff00 + add r8, r8, r9, lsr #8 @ tilex+=cellskip + add r7, r7, r9, lsr #5 @ dx+=cellskip<<3; + sub r10,r10,r9, lsl #16 @ cells-=cellskip + mvn r9, #0 @ r9=prevcode=-1 + @ cache some stuff to avoid mem access ldr r11,=HighCol mov r0, #0xf @@ -432,7 +437,7 @@ DrawLayer: rsb r8, r3, #0 mov r8, r8, lsr #3 @ r8=tilex=(-ts->hscroll)>>3 bic r8, r8, #0xff000000 - orr r8, r8, r5, lsl #25 @ r8=(xmask[31:25]|had_output[24]|tilex[15:0]) + orr r8, r8, r5, lsl #25 @ r8=(xmask[31:25]|had_output[24]|tilex[23:0]) ldr r4, =Scanline orr r5, r1, r10, lsl #24 @@ -443,24 +448,28 @@ DrawLayer: add r7, r1, #1 @ r7=dx=((ts->hscroll-1)&7)+1 mov r10,r9, lsl #16 - tst r0, r0 + tst r0, #1 orrne r10,r10, #0x8000 tst r9, #1<<31 mov r3, #0 orr r10,r10, #0xff000000 @ will be adjusted on entering loop - orrne r10,r10, #1<<23 @ r10=(cells[31:24]|sh[23]|hi_not_empty[22]|cells_max[21:16]|plane[15]|ty[14:0]) + orrne r10,r10, #1<<23 @ r10=(cell[31:24]|sh[23]|hi_not_empty[22]|cells_max[21:16]|plane[15]|ty[14:0]) movne r3, #0x40 @ default to shadowed pal on sh mode - mvn r9, #0 @ r9=prevcode=-1 + cmp r7, #8 + subne r10,r10, #0x01000000 @ have hscroll, start with negative cell + + and r9, r9, #0xff00 + add r8, r8, r9, lsr #8 @ tilex+=cellskip + add r7, r7, r9, lsr #5 @ dx+=cellskip<<3; + add r10,r10,r9, lsl #16 @ cell+=cellskip + mvn r9, #0 @ r9=prevcode=-1 @ cache some stuff to avoid mem access ldr r11,=HighCol mov r0, #0xf add r1, r11, r7 @ r1=pdest - cmp r7, #8 - subne r10,r10, #0x01000000 @ have hscroll, start with negative cell - @ r4 & r7 are scratch in this loop .dsloop_vs_subr1: