some irq tests
[megadrive.git] / testpico / asmtools.s
CommitLineData
ffd4b35c 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
6c839579 8.macro ldargw arg, stacksz, reg
9 move.w (4 + \arg * 4 + 2 + \stacksz)(%sp), \reg
10.endm
11
ffd4b35c 12.global burn10 /* u16 val */
13burn10:
14 ldarg 0, 0, d0
15 subq.l #1, d0
160:
17 dbra d0, 0b
18 rts
19
a385208c 20.global write16_x16 /* u32 a, u16 count, u16 d */
21write16_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
290:
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
45get_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
6c839579 69.global write_and_read1 /* u32 a, u16 d, void *dst */
70write_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 */
82move_sr:
83 ldargw 0, 0, d0
84 move.w d0, sr
85 rts
86
87.global move_sr_and_read /* u16 sr, u32 a */
88move_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 */
96memcpy_:
97 ldarg 0, 0, a0
98 ldarg 1, 0, a1
99 ldargw 2, 0, d0
100 subq.w #1, d0
1010:
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 */
107memset_:
108 ldarg 0, 0, a0
109 ldargw 1, 0, d1
110 ldargw 2, 0, d0
111 subq.w #1, d0
1120:
113 move.b d1, (a0)+ /* not in a hurry */
114 dbra d0, 0b
115 rts
116
117# tests
118
a385208c 119.global do_vcnt_vb
120do_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 */
1290:
130 btst #3, (a0)
131 beq 0b /* not blanking */
1320:
133 btst #3, (a0)
134 bne 0b /* blanking */
135
136 addq.l #1, a0
1370:
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###
1450:
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
1541:
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
1662: /* 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
1733: /* 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
6c839579 184.global test_hint
185test_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 */
1920:
193 move.w d0, (0xf004).w /* 12 */
194 move.w (sp)+, d0 /* 8 */
195 rte /* 20 114 */
196.global test_hint_end
197test_hint_end:
198
199.global test_vint
200test_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 */
2070:
208 move.w d0, (0xf00c).w /* 12 */
209 move.w (sp)+, d0 /* 8 */
210 rte /* 20 114 */
211.global test_vint_end
212test_vint_end:
213
214
ffd4b35c 215# vim:filetype=asmM68k:ts=4:sw=4:expandtab