Browse Source

vdp rendering fixes

kub 4 years ago
parent
commit
29d99d6bb8
3 changed files with 23 additions and 14 deletions
  1. 12 8
      pico/draw.c
  2. 1 1
      pico/draw2.c
  3. 10 5
      pico/draw_arm.S

+ 12 - 8
pico/draw.c

@@ -339,12 +339,13 @@ static void DrawStripVSRam(struct TileStrip *ts, int plane_sh, int cellskip)
       oldcode = code;
       // Get tile address/2:
       addr=(code&0x7ff)<<4;
-      if (code&0x1000) addr+=14-ty; else addr+=ty; // Y-flip
 
       pal=((code>>9)&0x30)|((plane_sh<<5)&0x40);
     }
 
-    pack = *(unsigned int *)(PicoMem.vram + addr);
+    if (code & 0x1000) ty ^= 0xe; // Y-flip
+    pack = *(unsigned int *)(PicoMem.vram + addr+ty);
+
     if (!pack) {
       blank = code;
       continue;
@@ -394,7 +395,7 @@ void DrawStripInterlace(struct TileStrip *ts)
     if (code!=oldcode) {
       oldcode = code;
       // Get tile address/2:
-      addr=(code&0x7ff)<<5;
+      addr=(code&0x3ff)<<5;
       if (code&0x1000) addr+=30-ty; else addr+=ty; // Y-flip
 
 //      pal=Pico.cram+((code>>9)&0x30);
@@ -449,8 +450,11 @@ static void DrawLayer(int plane_sh, int *hcache, int cellskip, int maxcells,
   else            ts.nametab=(pvid->reg[2]&0x38)<< 9; // A
 
   htab=pvid->reg[13]<<9; // Horizontal scroll table address
-  if ( pvid->reg[11]&2)     htab+=est->DrawScanline<<1; // Offset by line
-  if ((pvid->reg[11]&1)==0) htab&=~0xf; // Offset by tile
+  switch (pvid->reg[11]&3) {
+    case 1: htab += (est->DrawScanline<<1) &  0x0f; break;
+    case 2: htab += (est->DrawScanline<<1) & ~0x0f; break; // Offset by tile
+    case 3: htab += (est->DrawScanline<<1);         break; // Offset by line
+  }
   htab+=plane_sh&1; // A or B
 
   // Get horizontal scroll value, will be masked later
@@ -626,9 +630,9 @@ static void DrawTilesFromCache(int *hc, int sh, int rlim, struct PicoEState *est
 
   if (!sh)
   {
-    short blank=-1; // The tile we know is blank
+    int blank=-1; // The tile we know is blank
     while ((code=*hc++)) {
-      if (!(code & 0x8000) || (short)code == blank)
+      if (!(code & 0x8000) || (unsigned short)code == blank)
         continue;
       // Get tile address/2:
       addr = (code & 0x7ff) << 4;
@@ -636,7 +640,7 @@ static void DrawTilesFromCache(int *hc, int sh, int rlim, struct PicoEState *est
 
       pack = *(unsigned int *)(PicoMem.vram + addr);
       if (!pack) {
-        blank = (short)code;
+        blank = (unsigned short)code;
         continue;
       }
 

+ 1 - 1
pico/draw2.c

@@ -20,7 +20,7 @@
 #define LINE_WIDTH 328
 #endif
 
-static unsigned char PicoDraw2FB_[(8+320) * (8+240+8)];
+static unsigned char PicoDraw2FB_[(8+320) * (8+240+8) + 8];
 
 static int HighCache2A[41*(TILE_ROWS+1)+1+1]; // caches for high layers
 static int HighCache2B[41*(TILE_ROWS+1)+1+1];

+ 10 - 5
pico/draw_arm.S

@@ -342,11 +342,15 @@ DrawLayer:
 
     mov     r4, r8, lsr #8        @ pvid->reg[13]
     mov     r4, r4, lsl #10       @ htab=pvid->reg[13]<<9; (halfwords)
-    tst     r7, #2
-    addne   r4, r4, r2, lsl #2    @ htab+=DrawScanline<<1; // Offset by line
-    tst     r7, #1
-    biceq   r4, r4, #0x1f         @ htab&=~0xf; // Offset by tile
-    add     r4, r4, r0, lsl #1    @ htab+=plane
+
+    ands    r3, r7, #0x03
+    beq     0f
+    cmp     r3, #2
+    mov     r3, r2, lsl #2        @ htab+=DrawScanline<<1; // Offset by line
+    biceq   r3, #0x1f             @ htab&=~0xf; // Offset by tile
+    andlt   r3, #0x1f
+    add     r4, r4, r3
+0:  add     r4, r4, r0, lsl #1    @ htab+=plane
     bic     r4, r4, #0x00ff0000   @ just in case
     ldrh    r3, [lr, r4]          @ r3=hscroll
 
@@ -599,6 +603,7 @@ DrawLayer:
     tst     r7, #0x8000
     bne     .DrawStrip_vs_hiprio
 
+    orr     r7, r7, r10, lsl #24  @ code | (ty << 24)
     cmp     r7, r9
     beq     .DrawStrip_vs_samecode @ we know stuff about this tile already