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
This commit is contained in:
notaz 2007-09-09 20:27:44 +00:00
parent d5715559cf
commit 83c093a48a
2 changed files with 58 additions and 55 deletions

View file

@ -48,7 +48,7 @@ void BackFill(int reg7, int sh);
void DrawSprite(int *sprite, int **hc, int sh); void DrawSprite(int *sprite, int **hc, int sh);
void DrawTilesFromCache(int *hc, int sh, int rlim); void DrawTilesFromCache(int *hc, int sh, int rlim);
void DrawSpritesFromCache(int *hc, int sh); 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 FinalizeLineBGR444(int sh);
void FinalizeLineRGB555(int sh); void FinalizeLineRGB555(int sh);
void blockcpy_or(void *dst, void *src, size_t n, int pat); 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 #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 oldcode=-1,blank=-1; // The tile we know is blank
int pal=0; int pal=0,sh;
// Draw tiles across screen: // 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 ty=(ts->line&7)<<1; // Y-Offset into tile
dx=((ts->hscroll-1)&7)+1; 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 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; int zero=0;
@ -304,8 +306,7 @@ static void DrawStrip(struct TileStrip *ts, int sh)
addr+=ty; addr+=ty;
if (code&0x1000) addr^=0xe; // Y-flip if (code&0x1000) addr^=0xe; // Y-flip
// pal=Pico.cram+((code>>9)&0x30); pal=((code>>9)&0x30)|sh;
pal=((code>>9)&0x30)|(sh<<6);
} }
if (code&0x0800) zero=TileFlip(dx,addr,pal); if (code&0x0800) zero=TileFlip(dx,addr,pal);
@ -321,34 +322,28 @@ static void DrawStrip(struct TileStrip *ts, int sh)
} }
// this is messy // 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 oldcode=-1,blank=-1; // The tile we know is blank
int pal=0,scan=Scanline; int pal=0,scan=Scanline;
// Draw tiles across screen: // Draw tiles across screen:
tilex=(-ts->hscroll)>>3; tilex=(-ts->hscroll)>>3;
dx=((ts->hscroll-1)&7)+1; dx=((ts->hscroll-1)&7)+1;
if(dx != 8) { if(dx != 8) cell--; // have hscroll, start with negative cell
int vscroll, line; cell+=cellskip;
cell--; // have hscroll, start with negative cell tilex+=cellskip;
// also calculate intial VS stuff dx+=cellskip<<3;
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
}
for (; cell < ts->cells; dx+=8,tilex++,cell++) 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; int line,vscroll;
vscroll=Pico.vsram[plane+(cell&~1)]; vscroll=Pico.vsram[(plane_sh&1)+(cell&~1)];
// Find the line in the name table // Find the line in the name table
line=(vscroll+scan)&ts->line&0xffff; // ts->line is really ymask .. 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; addr=(code&0x7ff)<<4;
if (code&0x1000) addr+=14-ty; else addr+=ty; // Y-flip if (code&0x1000) addr+=14-ty; else addr+=ty; // Y-flip
// pal=Pico.cram+((code>>9)&0x30); pal=((code>>9)&0x30)|((plane_sh<<5)&0x40);
pal=((code>>9)&0x30);
} }
if (code&0x0800) zero=TileFlip(dx,addr,pal); if (code&0x0800) zero=TileFlip(dx,addr,pal);
@ -440,7 +434,7 @@ void DrawStripInterlace(struct TileStrip *ts)
// -------------------------------------------- // --------------------------------------------
#ifndef _ASM_DRAW_C #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; struct PicoVideo *pvid=&Pico.video;
const char shift[4]={5,6,5,7}; // 32,64 or 128 sized tilemaps (2 is invalid) 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; else if(width>1) ymask =0x0ff;
// Find name table: // Find name table:
if (plane==0) ts.nametab=(pvid->reg[2]&0x38)<< 9; // A if (plane_sh&1) ts.nametab=(pvid->reg[4]&0x07)<<12; // B
else 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 htab=pvid->reg[13]<<9; // Horizontal scroll table address
if ( pvid->reg[11]&2) htab+=Scanline<<1; // Offset by line if ( pvid->reg[11]&2) htab+=Scanline<<1; // Offset by line
if ((pvid->reg[11]&1)==0) htab&=~0xf; // Offset by tile 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 // Get horizontal scroll value, will be masked later
ts.hscroll=Pico.vram[htab&0x7fff]; ts.hscroll=Pico.vram[htab&0x7fff];
if((pvid->reg[12]&6) == 6) { if((pvid->reg[12]&6) == 6) {
// interlace mode 2 // 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 // Find the line in the name table
ts.line=(vscroll+(Scanline<<1))&((ymask<<1)|1); 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 // shit, we have 2-cell column based vscroll
// luckily this doesn't happen too often // luckily this doesn't happen too often
ts.line=ymask|(shift[width]<<24); // save some stuff instead of line ts.line=ymask|(shift[width]<<24); // save some stuff instead of line
DrawStripVSRam(&ts, plane); DrawStripVSRam(&ts, plane_sh, cellskip);
} else { } 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 // Find the line in the name table
ts.line=(vscroll+Scanline)&ymask; ts.line=(vscroll+Scanline)&ymask;
ts.nametab+=(ts.line>>3)<<shift[width]; ts.nametab+=(ts.line>>3)<<shift[width];
DrawStrip(&ts, sh); DrawStrip(&ts, plane_sh, cellskip);
} }
} }
@ -1297,22 +1291,22 @@ static int DrawDisplay(int sh)
} }
} }
DrawLayer(1, HighCacheB, maxcells, sh); DrawLayer(1|(sh<<1), HighCacheB, 0, maxcells);
if (hvwind == 1) if (hvwind == 1)
DrawWindow(0, maxcells>>1, 0, sh); // HighCacheAW DrawWindow(0, maxcells>>1, 0, sh);
else if (hvwind == 2) { else if (hvwind == 2) {
// ahh, we have vertical window // ahh, we have vertical window
DrawLayer(0, HighCacheA, (win&0x80) ? edge<<1 : maxcells, sh); 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); // HighCacheW DrawWindow( (win&0x80) ? edge : 0, (win&0x80) ? maxcells>>1 : edge, 0, sh);
} else } else
DrawLayer(0, HighCacheA, maxcells, sh); DrawLayer(0|(sh<<1), HighCacheA, 0, maxcells);
DrawAllSprites(HighCacheS, maxw, 0, sh); DrawAllSprites(HighCacheS, maxw, 0, sh);
if (HighCacheB[0]) DrawTilesFromCache(HighCacheB, sh, 328); if (HighCacheB[0]) DrawTilesFromCache(HighCacheB, sh, 328);
if (hvwind == 1) if (hvwind == 1)
DrawWindow(0, maxcells>>1, 1, sh); DrawWindow(0, maxcells>>1, 1, sh);
else if (hvwind == 2) { 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); DrawWindow((win&0x80) ? edge : 0, (win&0x80) ? maxcells>>1 : edge, 1, sh);
} else } else
if (HighCacheA[0]) DrawTilesFromCache(HighCacheA, sh, 328); if (HighCacheA[0]) DrawTilesFromCache(HighCacheA, sh, 328);

View file

@ -211,9 +211,9 @@
@ int cells; // 0x14 @ 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: DrawLayer:
stmfd sp!, {r4-r11,lr} stmfd sp!, {r4-r11,lr}
@ -221,10 +221,11 @@ DrawLayer:
ldr r11, =(Pico+0x22228) @ Pico.video ldr r11, =(Pico+0x22228) @ Pico.video
mov r8, #1 mov r8, #1
ldrb r7, [r11, #16] @ ??hh??ww ldrb r7, [r11, #16] @ ??vv??hh
mov r6, r1 @ hcache 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 mov r1, r7, lsl #4
orr r1, r1, #0x00ff orr r1, r1, #0x00ff
@ -244,7 +245,7 @@ DrawLayer:
sub r5, r5, #1 @ r5=xmask sub r5, r5, #1 @ r5=xmask
@ Find name table: @ Find name table:
tst r0, r0 ands r0, r0, #1
ldreqb r12, [r11, #2] ldreqb r12, [r11, #2]
ldrneb r12, [r11, #4] 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) 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 movne r3, #0x40 @ default to shadowed pal on sh mode
mvn r9, #0 @ r9=prevcode=-1
cmp r7, #8 cmp r7, #8
addne r10,r10, #0x01000000 @ we will loop cells+1 times if there is scroll 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 @ cache some stuff to avoid mem access
ldr r11,=HighCol ldr r11,=HighCol
mov r0, #0xf mov r0, #0xf
@ -432,7 +437,7 @@ DrawLayer:
rsb r8, r3, #0 rsb r8, r3, #0
mov r8, r8, lsr #3 @ r8=tilex=(-ts->hscroll)>>3 mov r8, r8, lsr #3 @ r8=tilex=(-ts->hscroll)>>3
bic r8, r8, #0xff000000 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 ldr r4, =Scanline
orr r5, r1, r10, lsl #24 orr r5, r1, r10, lsl #24
@ -443,24 +448,28 @@ DrawLayer:
add r7, r1, #1 @ r7=dx=((ts->hscroll-1)&7)+1 add r7, r1, #1 @ r7=dx=((ts->hscroll-1)&7)+1
mov r10,r9, lsl #16 mov r10,r9, lsl #16
tst r0, r0 tst r0, #1
orrne r10,r10, #0x8000 orrne r10,r10, #0x8000
tst r9, #1<<31 tst r9, #1<<31
mov r3, #0 mov r3, #0
orr r10,r10, #0xff000000 @ will be adjusted on entering loop 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 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 @ cache some stuff to avoid mem access
ldr r11,=HighCol ldr r11,=HighCol
mov r0, #0xf mov r0, #0xf
add r1, r11, r7 @ r1=pdest 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 @ r4 & r7 are scratch in this loop
.dsloop_vs_subr1: .dsloop_vs_subr1: