+ @ cache some stuff to avoid mem access\r
+ ldr r11,=HighCol\r
+ mov r0, #0xf\r
+ add r1, r11, r7 @ r1=pdest\r
+\r
+ cmp r7, #8\r
+ subne r10,r10, #0x01000000 @ have hscroll, start with negative cell\r
+\r
+\r
+ @ r4 & r7 are scratch in this loop\r
+.dsloop_vs_subr1:\r
+ sub r1, r1, #8\r
+.dsloop_vs: @ 40-41 times\r
+ add r10,r10, #0x01000000\r
+ and r4, r10, #0x003f0000\r
+ cmp r4, r10, asr #8\r
+ ble .dsloop_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=Pico.vsram (Pico+0x22180)\r
+ add r7, r7, r10,asr #23 @ vsram + ((cell&~1)<<1)\r
+ bic r7, r7, #3\r
+ tst r10,#0x8000 @ plane1?\r
+ addne r7, r7, #2\r
+ ldrh r7, [r7] @ r7=vscroll\r
+\r
+ bic r10,r10,#0xff @ clear old ty\r
+ and r4, r5, #0xff0000\r
+ add r4, r4, r7, lsl #16\r
+ and r4, r4, r5, lsl #16 @ r4=line<<16\r
+ and r7, r4, #0x70000\r
+ orr r10,r10,r7, lsr #15 @ new ty\r
+\r
+ mov r4, r4, lsr #19\r
+ mov r7, r5, lsr #24\r
+ mov r4, r4, lsl r7 @ nametabadd\r
+\r
+ and r7, r8, r8, lsr #25\r
+ add r7, lr, r7, lsl #1 @ Pico.vram+((tilex&ts->xmask) as halfwords)\r
+ add r7, r7, r4, lsl #1\r
+ ldrh r7, [r7, r12] @ r7=code (int, but from unsigned, no sign extend)\r
+\r
+ add r1, r1, #8\r
+ add r8, r8, #1\r
+\r
+ tst r7, #0x8000\r
+ bne .DrawStrip_vs_hiprio\r
+\r
+ cmp r7, r9\r
+ beq .DrawStrip_vs_samecode @ we know stuff about this tile already\r
+\r
+ mov r9, r7 @ remember code\r
+\r
+ movs r2, r9, lsl #20 @ if (code&0x1000)\r
+ mov r2, r2, lsl #1\r
+ add r2, r2, r10, lsl #17\r
+ mov r2, r2, lsr #17\r
+ eorcs r2, r2, #0x0e @ if (code&0x1000) addr^=0xe;\r
+\r
+ ldr r2, [lr, r2, lsl #1] @ pack=*(unsigned int *)(Pico.vram+addr); // Get 8 pixels\r
+\r
+ bic r7, r3, #0x3f\r
+ and r3, r9, #0x6000\r
+ add r3, r7, r3, lsr #9 @ r3=pal=((code&0x6000)>>9);\r
+\r
+.DrawStrip_vs_samecode:\r
+ tst r2, r2\r
+ beq .dsloop_vs @ tileline blank\r
+\r
+ cmp r2, r2, ror #4\r
+ beq .DrawStrip_vs_SingleColor @ tileline singlecolor \r
+\r
+ tst r9, #0x0800\r
+ beq .DrawStrip_vs_TileNorm\r
+\r
+ @ (r1=pdest, r2=pixels8, r3=pal) r4: scratch, r0: helper pattern\r
+ TileFlip r0\r
+ b .dsloop_vs\r
+\r
+.DrawStrip_vs_TileNorm:\r
+ TileNorm r0\r
+ b .dsloop_vs\r
+\r
+.DrawStrip_vs_SingleColor:\r
+ and r4, r2, #0xf\r
+ orr r4, r3, r4\r
+ orr r4, r4, r4, lsl #8\r
+ tst r1, #1 @ not aligned?\r
+ strneb r4, [r1], #1\r
+ streqh r4, [r1], #2\r
+ strh r4, [r1], #2\r
+ strh r4, [r1], #2\r
+ strh r4, [r1], #2\r
+ strneb r4, [r1], #1 @ have a remaining unaligned pixel?\r
+ b .dsloop_vs_subr1\r
+\r
+.DrawStrip_vs_hiprio:\r
+ tst r10, #0x00c00000\r
+ beq .DrawStrip_vs_hiprio_maybempt\r
+ sub r0, r1, r11\r
+ orr r7, r7, r0, lsl #16\r
+ orr r7, r7, r10, lsl #25 @ (ty<<25)\r
+ tst r7, #0x1000\r
+ eorne r7, r7, #7<<26 @ if(code&0x1000) cval^=7<<26;\r
+ str r7, [r6], #4 @ cache hi priority tile\r
+ mov r0, #0xf\r
+ b .dsloop_vs\r
+\r
+.DrawStrip_vs_hiprio_maybempt:\r
+ cmp r7, r9\r
+ beq .dsloop_vs @ must've been empty, otherwise we wouldn't get here\r
+ movs r2, r7, lsl #20 @ if (code&0x1000)\r
+ mov r2, r2, lsl #1\r
+ add r2, r2, r10, lsl #17\r
+ mov r2, r2, lsr #17\r
+ eorcs r2, r2, #0x0e @ if (code&0x1000) addr^=0xe;\r
+ ldr r2, [lr, r2, lsl #1] @ pack=*(unsigned int *)(Pico.vram+addr); // Get 8 pixels\r
+ mov r9, r7 @ remember code\r
+ tst r2, r2\r
+ orrne r10, r10, #1<<22\r
+ bne .DrawStrip_vs_hiprio\r
+ b .dsloop_vs\r
+\r
+\r
+@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r