fix cell scroll drawing
authornotaz <notasas@gmail.com>
Sun, 8 Oct 2017 19:33:04 +0000 (22:33 +0300)
committernotaz <notasas@gmail.com>
Fri, 13 Oct 2017 21:53:08 +0000 (00:53 +0300)
pico/draw.c
pico/draw2_arm.S
pico/draw_arm.S
pico/pico_int.h
pico/pico_int_o32.h
tools/mkoffsets.c

index 6408f20..bb051b6 100644 (file)
@@ -261,7 +261,11 @@ static void DrawStripVSRam(struct TileStrip *ts, int plane_sh, int cellskip)
   // Draw tiles across screen:\r
   tilex=(-ts->hscroll)>>3;\r
   dx=((ts->hscroll-1)&7)+1;\r
-  if(dx != 8) cell--; // have hscroll, start with negative cell\r
+  if (ts->hscroll & 0x0f) {\r
+    int adj = ((ts->hscroll ^ dx) >> 3) & 1;\r
+    cell -= adj + 1;\r
+    ts->cells -= adj;\r
+  }\r
   cell+=cellskip;\r
   tilex+=cellskip;\r
   dx+=cellskip<<3;\r
index 1575653..6b110b3 100644 (file)
@@ -73,8 +73,17 @@ BackFillFull:
 \r
 @ -------- some macros --------\r
 \r
+@ helpers\r
+.macro add_c24 d s c\r
+    add     \d, \s, #(\c & 0x00ff00)\r
+.if \c & 0x0000ff\r
+    add     \d, \d, #(\c & 0x0000ff)\r
+.endif\r
+.if \c & 0xff0000\r
+    add     \d, \d, #(\c & 0xff0000)\r
+.endif\r
+.endm\r
 \r
-@ helper\r
 @ TileLineSinglecol (r1=pdest, r2=pixels8, r3=pal) r4: scratch, r0: pixels8_old\r
 .macro TileLineSinglecol notsinglecol=0\r
     and     r2, r2, #0xf        @ #0x0000000f\r
@@ -411,8 +420,7 @@ DrawLayerFull:
     mla     r11, r4, r7, r11      @ scrpos+=8*328*(planestart-START_ROW);\r
 \r
     @ Get vertical scroll value:\r
-    add     r7, r10, #0x012000\r
-    add     r7, r7,  #0x000180    @ r7=Pico.vsram (Pico+0x22180)\r
+    add_c24 r7, r10, (OFS_PMEM_vsram-OFS_PMEM_vram)\r
     ldr     r7, [r7]\r
     tst     r0, r0\r
     moveq   r7, r7, lsl #22\r
index d53e04b..29af1c1 100644 (file)
 .equ PDRAW_PLANE_HI_PRIO, (1<<6)\r
 .equ PDRAW_SHHI_DONE,     (1<<7)\r
 \r
-@ helper\r
+@ helpers\r
+.macro add_c24 d s c\r
+    add     \d, \s, #(\c & 0x00ff00)\r
+.if \c & 0x0000ff\r
+    add     \d, \d, #(\c & 0x0000ff)\r
+.endif\r
+.if \c & 0xff0000\r
+    add     \d, \d, #(\c & 0xff0000)\r
+.endif\r
+.endm\r
+\r
 .macro TilePixel pat lsrr offs\r
 .if !\lsrr\r
     ands    r4, \pat, r2\r
@@ -344,8 +354,7 @@ DrawLayer:
     bne     .DrawStrip_vsscroll\r
 \r
     @ Get vertical scroll value:\r
-    add     r7, lr,  #0x012000\r
-    add     r7, r7,  #0x000180    @ r7=PicoMem.vsram (PicoMem+0x22180)\r
+    add_c24 r7, lr, (OFS_PMEM_vsram-OFS_PMEM_vram)\r
     ldr     r7, [r7]\r
 \r
     tst     r8, #2\r
@@ -522,17 +531,22 @@ DrawLayer:
     add     r7, r1, #1            @ r7=dx=((ts->hscroll-1)&7)+1\r
 \r
     mov     r10,r9, lsl #16\r
+    orr     r10,r10, #0xff000000  @ will be adjusted on entering loop\r
     tst     r0, #1\r
     orrne   r10,r10, #0x8000\r
+    tst     r3, #0x0f             @ hscroll & 0x0f?\r
+    beq     0f\r
+    eor     r3, r3, r7\r
+    sub     r10,r10, #1<<24       @ cell--  // start from negative for hscroll\r
+    tst     r3, #0x08\r
+    subne   r10,r10, #1<<16       @ cells--\r
+    subne   r10,r10, #1<<24       @ cell--  // even more negative\r
+0:\r
     tst     r9, #1<<31\r
     mov     r3, #0\r
-    orr     r10,r10, #0xff000000 @ will be adjusted on entering loop\r
     orrne   r10,r10, #1<<23 @ r10=(cell[31:24]|sh[23]|hi_not_empty[22]|cells_max[21:16]|plane[15]|ty[14:0])\r
     movne   r3, #0x40       @ default to shadowed pal on sh mode\r
 \r
-    cmp     r7, #8\r
-    subne   r10,r10, #0x01000000 @ have hscroll, start with negative cell\r
-\r
     and     r9, r9, #0xff00\r
     add     r8, r8, r9, lsr #8   @ tilex+=cellskip\r
     add     r7, r7, r9, lsr #5   @ dx+=cellskip<<3;\r
@@ -556,8 +570,7 @@ DrawLayer:
     ble     .dsloop_vs_exit\r
 \r
     @ calc offset and read tileline code to r7, also calc ty\r
-    add     r7, lr, #0x012000\r
-    add     r7, r7, #0x000180     @ r7=PicoMem.vsram (PicoMem+0x22180)\r
+    add_c24 r7, lr, (OFS_PMEM_vsram-OFS_PMEM_vram)\r
     add     r7, r7, r10,asr #23   @ vsram + ((cell&~1)<<1)\r
     bic     r7, r7, #3\r
     tst     r10,#0x8000           @ plane1?\r
index 848da5d..369bb5d 100644 (file)
@@ -356,7 +356,6 @@ struct PicoEState
   unsigned short HighPal[0x100];\r
 };\r
 \r
-// some assembly stuff still depends on these, do not touch!\r
 struct PicoMem\r
 {\r
   unsigned char ram[0x10000];  // 0x00000 scratch ram\r
@@ -366,9 +365,9 @@ struct PicoMem
   };\r
   unsigned char zram[0x2000];  // 0x20000 Z80 ram\r
   unsigned char ioports[0x10]; // XXX: fix asm and mv\r
-  unsigned char pad[0xf0];     // unused\r
-  unsigned short cram[0x40];   // 0x22100\r
-  unsigned short vsram[0x40];  // 0x22180\r
+  unsigned short cram[0x40];   // 0x22010\r
+  unsigned char pad[0x70];     // 0x22050 DrawStripVSRam reads 0 from here\r
+  unsigned short vsram[0x40];  // 0x22100\r
 };\r
 \r
 // sram\r
index 720a5ee..ca3004f 100644 (file)
@@ -24,3 +24,5 @@
 #define OFS_EST_PicoOpt      0x20
 #define OFS_EST_Draw2FB      0x24
 #define OFS_EST_HighPal      0x28
+#define OFS_PMEM_vram        0x10000
+#define OFS_PMEM_vsram       0x22100
index b371cf4..7e57383 100644 (file)
@@ -18,6 +18,9 @@
 #define DUMP_EST(f, field) \
        DUMP(f, "OFS_EST_", struct PicoEState, field)
 
+#define DUMP_PMEM(f, field) \
+       DUMP(f, "OFS_PMEM_", struct PicoMem, field)
+
 extern struct Pico p;
 
 int main(int argc, char *argv[])
@@ -58,6 +61,8 @@ int main(int argc, char *argv[])
   DUMP_EST(f, PicoOpt);
   DUMP_EST(f, Draw2FB);
   DUMP_EST(f, HighPal);
+  DUMP_PMEM(f, vram);
+  DUMP_PMEM(f, vsram);
   fclose(f);
 
   return 0;