7d12fa8ebe1fd97b4384a6520a08119baade8d43
[megadrive.git] / testpico / asmtools.s
1 # Assemble with gas
2 #   --register-prefix-optional --bitwise-or
3
4 .macro ldarg  arg, stacksz, reg
5     move.l (4 + \arg * 4 + \stacksz)(%sp), \reg
6 .endm
7
8 .global burn10 /* u16 val */
9 burn10:
10     ldarg       0, 0, d0
11     subq.l      #1, d0
12 0:
13     dbra        d0, 0b
14     rts
15
16 .global write16_x16 /* u32 a, u16 count, u16 d */
17 write16_x16:
18     ldarg       0, 0, a0
19     ldarg       2, 0, d0
20     move.w      d0, d1
21     swap        d0
22     move.w      d1, d0
23     ldarg       1, 0, d1
24     subq.l      #1, d1
25 0:
26     move.l      d0, (a0)
27     move.l      d0, (a0)
28     move.l      d0, (a0)
29     move.l      d0, (a0)
30     move.l      d0, (a0)
31     move.l      d0, (a0)
32     move.l      d0, (a0)
33     move.l      d0, (a0)
34     dbra        d1, 0b
35     rts
36
37 # read single phase from controller
38 #  d0 - result
39 #  destroys d1,d2
40 .global get_input
41 get_input:
42         move.b          #0x40,(0xa10003)
43         moveq.l         #0,d0
44         nop
45         nop
46         move.b          (0xa10003),d1
47         move.b          #0x00,(0xa10003)
48         andi.w          #0x3f,d1        /* 00CB RLDU */
49         nop
50         move.b          (0xa10003),d0
51         lsl.b           #2,d0
52         andi.w          #0xc0,d0        /* SA00 0000 */
53         or.b            d1,d0
54         eor.b           #0xff,d0
55 .if 0
56         swap            d7
57         move.w          d7,d1
58         eor.w           d0,d1           /* changed btns */
59         move.w          d0,d7           /* old val */
60         swap            d7
61         and.w           d0,d1           /* what changed now */
62 .endif
63         rts
64
65 .global do_vcnt_vb
66 do_vcnt_vb:
67     movem.l     d2-d7/a2, -(sp)
68     movea.l     #0xc00007, a0
69     movea.l     #0xc00008, a1
70     movea.l     #0xff0000, a2
71     moveq.l     #0, d4          /* d4 = count */
72     moveq.l     #0, d5          /* d5 = vcnt_expect */
73                                 /* d6 = old */
74     move.l      #1<<(3+16), d7  /* d7 = SR_VB */
75 0:
76     btst        #3, (a0)
77     beq         0b          /* not blanking */
78 0:
79     btst        #3, (a0)
80     bne         0b          /* blanking */
81
82     addq.l      #1, a0
83 0:
84     tst.b       (a0)
85     bne         0b          /* not line 0 */
86
87     subq.l      #2, a0
88     move.l      (a0), d6
89     move.l      d6, (a2)+   /* d0 = old */
90 ###
91 0:
92     move.b      (a1), d2    /*  8 d2 = vcnt */
93     cmp.b       (a1), d2    /*  8 reread for corruption */
94     bne 0b                  /* 10 on changing vcounter? */
95     cmp.b       d2, d5      /*  4 vcnt == vcnt_expect? */
96     beq         0b          /* 10 */
97     move.l      (a0), d0    /* 12 */
98     tst.b       d2          /*  4 */
99     beq         3f
100 1:
101     addq.l      #1, d4      /* count++ */
102     addq.l      #1, d5
103     cmp.b       d2, d5
104     bne         2f          /* vcnt == vcnt_expect + 1 */
105     move.l      d0, d1
106     eor.l       d6, d1
107     and.l       d7, d1      /* (old ^ val) & vb */
108     bne         2f
109     move.l      d0, d6      /* old = val */
110     bra         0b
111
112 2: /* vcnt jump or vb change */
113     move.l      d6, (a2)+   /* *ram++ = old */
114     move.l      d0, (a2)+   /* *ram++ = val */
115     move.b      d2, d5      /* vcnt_expect = vcnt */
116     move.l      d0, d6      /* old = val */
117     bra         0b
118
119 3: /* vcnt == 0 */
120     move.l      d0, d1
121     and.l       d7, d1
122     bne         1b          /* still in VB */
123
124     move.l      d0, (a2)+   /* *ram++ = val */
125     move.l      d4, (a2)+   /* *ram++ = count */
126
127     movem.l     (sp)+, d2-d7/a2
128         rts
129
130 # vim:filetype=asmM68k:ts=4:sw=4:expandtab