some irq tests
[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 .macro ldargw arg, stacksz, reg
9     move.w (4 + \arg * 4 + 2 + \stacksz)(%sp), \reg
10 .endm
11
12 .global burn10 /* u16 val */
13 burn10:
14     ldarg       0, 0, d0
15     subq.l      #1, d0
16 0:
17     dbra        d0, 0b
18     rts
19
20 .global write16_x16 /* u32 a, u16 count, u16 d */
21 write16_x16:
22     ldarg       0, 0, a0
23     ldarg       2, 0, d0
24     move.w      d0, d1
25     swap        d0
26     move.w      d1, d0
27     ldarg       1, 0, d1
28     subq.l      #1, d1
29 0:
30     move.l      d0, (a0)
31     move.l      d0, (a0)
32     move.l      d0, (a0)
33     move.l      d0, (a0)
34     move.l      d0, (a0)
35     move.l      d0, (a0)
36     move.l      d0, (a0)
37     move.l      d0, (a0)
38     dbra        d1, 0b
39     rts
40
41 # read single phase from controller
42 #  d0 - result
43 #  destroys d1,d2
44 .global get_input
45 get_input:
46         move.b          #0x40,(0xa10003)
47         moveq.l         #0,d0
48         nop
49         nop
50         move.b          (0xa10003),d1
51         move.b          #0x00,(0xa10003)
52         andi.w          #0x3f,d1        /* 00CB RLDU */
53         nop
54         move.b          (0xa10003),d0
55         lsl.b           #2,d0
56         andi.w          #0xc0,d0        /* SA00 0000 */
57         or.b            d1,d0
58         eor.b           #0xff,d0
59 .if 0
60         swap            d7
61         move.w          d7,d1
62         eor.w           d0,d1           /* changed btns */
63         move.w          d0,d7           /* old val */
64         swap            d7
65         and.w           d0,d1           /* what changed now */
66 .endif
67         rts
68
69 .global write_and_read1 /* u32 a, u16 d, void *dst */
70 write_and_read1:
71     ldarg       0, 0, a0
72     ldargw      1, 0, d0
73     ldarg       2, 0, a1
74     move.w      d0, (a0)
75     move.l      (a0), d0
76     move.l      (a0), d1
77     move.l      d0, (a1)+
78     move.l      d1, (a1)+
79     rts
80
81 .global move_sr /* u16 sr */
82 move_sr:
83     ldargw      0, 0, d0
84     move.w      d0, sr
85     rts
86
87 .global move_sr_and_read /* u16 sr, u32 a */
88 move_sr_and_read:
89     ldargw      0, 0, d0
90     ldarg       1, 0, a0
91     move.w      d0, sr
92     move.w      (a0), d0
93     rts
94
95 .global memcpy_ /* void *dst, const void *src, u16 size */
96 memcpy_:
97     ldarg       0, 0, a0
98     ldarg       1, 0, a1
99     ldargw      2, 0, d0
100     subq.w      #1, d0
101 0:
102     move.b      (a1)+, (a0)+      /* not in a hurry */
103     dbra        d0, 0b
104     rts
105
106 .global memset_ /* void *dst, int d, u16 size */
107 memset_:
108     ldarg       0, 0, a0
109     ldargw      1, 0, d1
110     ldargw      2, 0, d0
111     subq.w      #1, d0
112 0:
113     move.b      d1, (a0)+         /* not in a hurry */
114     dbra        d0, 0b
115     rts
116
117 # tests
118
119 .global do_vcnt_vb
120 do_vcnt_vb:
121     movem.l     d2-d7/a2, -(sp)
122     movea.l     #0xc00007, a0
123     movea.l     #0xc00008, a1
124     movea.l     #0xff0000, a2
125     moveq.l     #0, d4          /* d4 = count */
126     moveq.l     #0, d5          /* d5 = vcnt_expect */
127                                 /* d6 = old */
128     move.l      #1<<(3+16), d7  /* d7 = SR_VB */
129 0:
130     btst        #3, (a0)
131     beq         0b          /* not blanking */
132 0:
133     btst        #3, (a0)
134     bne         0b          /* blanking */
135
136     addq.l      #1, a0
137 0:
138     tst.b       (a0)
139     bne         0b          /* not line 0 */
140
141     subq.l      #2, a0
142     move.l      (a0), d6
143     move.l      d6, (a2)+   /* d0 = old */
144 ###
145 0:
146     move.b      (a1), d2    /*  8 d2 = vcnt */
147     cmp.b       (a1), d2    /*  8 reread for corruption */
148     bne 0b                  /* 10 on changing vcounter? */
149     cmp.b       d2, d5      /*  4 vcnt == vcnt_expect? */
150     beq         0b          /* 10 */
151     move.l      (a0), d0    /* 12 */
152     tst.b       d2          /*  4 */
153     beq         3f
154 1:
155     addq.l      #1, d4      /* count++ */
156     addq.l      #1, d5
157     cmp.b       d2, d5
158     bne         2f          /* vcnt == vcnt_expect + 1 */
159     move.l      d0, d1
160     eor.l       d6, d1
161     and.l       d7, d1      /* (old ^ val) & vb */
162     bne         2f
163     move.l      d0, d6      /* old = val */
164     bra         0b
165
166 2: /* vcnt jump or vb change */
167     move.l      d6, (a2)+   /* *ram++ = old */
168     move.l      d0, (a2)+   /* *ram++ = val */
169     move.b      d2, d5      /* vcnt_expect = vcnt */
170     move.l      d0, d6      /* old = val */
171     bra         0b
172
173 3: /* vcnt == 0 */
174     move.l      d0, d1
175     and.l       d7, d1
176     bne         1b          /* still in VB */
177
178     move.l      d0, (a2)+   /* *ram++ = val */
179     move.l      d4, (a2)+   /* *ram++ = count */
180
181     movem.l     (sp)+, d2-d7/a2
182         rts
183
184 .global test_hint
185 test_hint:
186     move.w      d0, -(sp)         /*  8 */
187     move.w      (0xc00008).l, d0  /* 16 */
188     addq.w      #1, (0xf000).w    /* 16 */
189     tst.w       (0xf002).w        /* 12 */
190     bne         0f                /* 10 */
191     move.w      d0, (0xf002).w    /* 12 */
192 0:
193     move.w      d0, (0xf004).w    /* 12 */
194     move.w      (sp)+, d0         /*  8 */
195     rte                           /* 20 114 */
196 .global test_hint_end
197 test_hint_end:
198
199 .global test_vint
200 test_vint:
201     move.w      d0, -(sp)         /*  8 */
202     move.w      (0xc00008).l, d0  /* 16 */
203     addq.w      #1, (0xf008).w    /* 16 */
204     tst.w       (0xf00a).w        /* 12 */
205     bne         0f                /* 10 */
206     move.w      d0, (0xf00a).w    /* 12 */
207 0:
208     move.w      d0, (0xf00c).w    /* 12 */
209     move.w      (sp)+, d0         /*  8 */
210     rte                           /* 20 114 */
211 .global test_vint_end
212 test_vint_end:
213
214
215 # vim:filetype=asmM68k:ts=4:sw=4:expandtab