more tests
[megadrive.git] / testpico / asmtools.s
index 47259b5..7d12fa8 100644 (file)
@@ -13,4 +13,118 @@ burn10:
     dbra        d0, 0b
     rts
 
+.global write16_x16 /* u32 a, u16 count, u16 d */
+write16_x16:
+    ldarg       0, 0, a0
+    ldarg       2, 0, d0
+    move.w      d0, d1
+    swap        d0
+    move.w      d1, d0
+    ldarg       1, 0, d1
+    subq.l      #1, d1
+0:
+    move.l      d0, (a0)
+    move.l      d0, (a0)
+    move.l      d0, (a0)
+    move.l      d0, (a0)
+    move.l      d0, (a0)
+    move.l      d0, (a0)
+    move.l      d0, (a0)
+    move.l      d0, (a0)
+    dbra        d1, 0b
+    rts
+
+# read single phase from controller
+#  d0 - result
+#  destroys d1,d2
+.global get_input
+get_input:
+       move.b          #0x40,(0xa10003)
+       moveq.l         #0,d0
+       nop
+       nop
+       move.b          (0xa10003),d1
+       move.b          #0x00,(0xa10003)
+       andi.w          #0x3f,d1        /* 00CB RLDU */
+       nop
+       move.b          (0xa10003),d0
+       lsl.b           #2,d0
+       andi.w          #0xc0,d0        /* SA00 0000 */
+       or.b            d1,d0
+       eor.b           #0xff,d0
+.if 0
+       swap            d7
+       move.w          d7,d1
+       eor.w           d0,d1           /* changed btns */
+       move.w          d0,d7           /* old val */
+       swap            d7
+       and.w           d0,d1           /* what changed now */
+.endif
+       rts
+
+.global do_vcnt_vb
+do_vcnt_vb:
+    movem.l     d2-d7/a2, -(sp)
+    movea.l     #0xc00007, a0
+    movea.l     #0xc00008, a1
+    movea.l     #0xff0000, a2
+    moveq.l     #0, d4          /* d4 = count */
+    moveq.l     #0, d5          /* d5 = vcnt_expect */
+                                /* d6 = old */
+    move.l      #1<<(3+16), d7  /* d7 = SR_VB */
+0:
+    btst        #3, (a0)
+    beq         0b          /* not blanking */
+0:
+    btst        #3, (a0)
+    bne         0b          /* blanking */
+
+    addq.l      #1, a0
+0:
+    tst.b       (a0)
+    bne         0b          /* not line 0 */
+
+    subq.l      #2, a0
+    move.l      (a0), d6
+    move.l      d6, (a2)+   /* d0 = old */
+###
+0:
+    move.b      (a1), d2    /*  8 d2 = vcnt */
+    cmp.b       (a1), d2    /*  8 reread for corruption */
+    bne 0b                  /* 10 on changing vcounter? */
+    cmp.b       d2, d5      /*  4 vcnt == vcnt_expect? */
+    beq         0b          /* 10 */
+    move.l      (a0), d0    /* 12 */
+    tst.b       d2          /*  4 */
+    beq         3f
+1:
+    addq.l      #1, d4      /* count++ */
+    addq.l      #1, d5
+    cmp.b       d2, d5
+    bne         2f          /* vcnt == vcnt_expect + 1 */
+    move.l      d0, d1
+    eor.l       d6, d1
+    and.l       d7, d1      /* (old ^ val) & vb */
+    bne         2f
+    move.l      d0, d6      /* old = val */
+    bra         0b
+
+2: /* vcnt jump or vb change */
+    move.l      d6, (a2)+   /* *ram++ = old */
+    move.l      d0, (a2)+   /* *ram++ = val */
+    move.b      d2, d5      /* vcnt_expect = vcnt */
+    move.l      d0, d6      /* old = val */
+    bra         0b
+
+3: /* vcnt == 0 */
+    move.l      d0, d1
+    and.l       d7, d1
+    bne         1b          /* still in VB */
+
+    move.l      d0, (a2)+   /* *ram++ = val */
+    move.l      d4, (a2)+   /* *ram++ = count */
+
+    movem.l     (sp)+, d2-d7/a2
+       rts
+
 # vim:filetype=asmM68k:ts=4:sw=4:expandtab