more 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
8.global burn10 /* u16 val */
9burn10:
10 ldarg 0, 0, d0
11 subq.l #1, d0
120:
13 dbra d0, 0b
14 rts
15
a385208c 16.global write16_x16 /* u32 a, u16 count, u16 d */
17write16_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
250:
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
41get_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
66do_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 */
750:
76 btst #3, (a0)
77 beq 0b /* not blanking */
780:
79 btst #3, (a0)
80 bne 0b /* blanking */
81
82 addq.l #1, a0
830:
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###
910:
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
1001:
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
1122: /* 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
1193: /* 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
ffd4b35c 130# vim:filetype=asmM68k:ts=4:sw=4:expandtab