fix cell scroll drawing
[picodrive.git] / pico / draw_arm.S
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