mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 07:17:45 -04:00
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:
parent
d5715559cf
commit
83c093a48a
2 changed files with 58 additions and 55 deletions
76
Pico/Draw.c
76
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)<<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);
|
||||
|
|
37
Pico/Draw.s
37
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:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue