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 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)<<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)
DrawWindow(0, maxcells>>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);

View file

@ -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,14 +448,21 @@ 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
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
@ -458,9 +470,6 @@ DrawLayer:
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: