e71680d5 |
1 | ; for sjasm 0.42 |
ffd4b35c |
2 | ORG $0 |
3 | |
4 | init |
e71680d5 |
5 | di ; 4 |
6 | im $1 ; 8 |
7 | |
8 | loop_prep |
9 | ld sp, $1002 ; 10 |
10 | ld hl, $1000 ; 10 |
11 | ld b, jtable ; 7 |
12 | ld d, $0 ; 7 |
13 | xor a ; 4 (50) |
ffd4b35c |
14 | |
15 | loop |
e71680d5 |
16 | add a, (hl) ; 7 |
17 | jp z, loop ; 10 17 (27 worst) |
ffd4b35c |
18 | |
e71680d5 |
19 | add a ; 4 a *= 2 |
20 | add b ; 4 a += table |
21 | ld e, a ; 4 |
22 | ld a, (de) ; 7 |
23 | inc e ; 4 |
24 | ld ixl, a ; 9 |
25 | ld a, (de) ; 7 |
26 | ld ixh, a ; 9 |
27 | |
28 | pop hl ; src 10 ld hl, ($1002) |
29 | pop de ; dst 10 ld de, ($1004) |
30 | pop bc ; len 10 ld bc, ($1006) |
31 | jp ix ; 8 (86+27) |
32 | |
33 | end |
34 | xor a ; 4 |
35 | ld ($1000), a ; 13 (17) |
36 | jp loop_prep |
37 | |
38 | ; --- |
39 | |
40 | BLOCK $38-$ |
a385208c |
41 | |
e71680d5 |
42 | irq |
43 | ret |
a385208c |
44 | |
e71680d5 |
45 | ; --- |
46 | |
47 | jtable |
48 | dw end |
49 | dw t_copy |
50 | dw t_rd_timing |
51 | dw t_idle_loop |
52 | dw t_timer_a |
53 | dw t_timer_b |
54 | jtable_end |
55 | ld b, jtable_end ; ensure < $100 |
56 | |
57 | ; - 1 - |
58 | t_copy |
59 | ldir ; 21/16 ((de) <- (hl)) bc times |
a385208c |
60 | jp end ; 10 |
61 | |
e71680d5 |
62 | ; - 2 - |
63 | t_rd_timing |
a385208c |
64 | ld d, h ; 4 |
65 | ld e, l ; 4 |
66 | inc de ; 6 14 (132) |
67 | loop_read |
68 | ld a, (hl) ; 7 |
69 | ld a, (de) ; 7 |
70 | dec bc ; 6 |
71 | ld a, b ; 4 |
72 | or a, c ; 4 |
73 | jp nz,loop_read ; 10 38 |
74 | |
e71680d5 |
75 | end_vcnt |
a385208c |
76 | ld a, ($7f08) ; vcnt 13 |
77 | ld de, ($1004) ; dst 20 |
ffd4b35c |
78 | ld (de), a ; 7 |
a385208c |
79 | jp end ; 10 50 |
ffd4b35c |
80 | |
e71680d5 |
81 | ; - 3 - |
82 | t_idle_loop |
83 | exx ; 4 (waste cycles) |
84 | ld b, $4 ; 7 |
85 | 1 djnz 1b ; 13 13*3+8=47 |
86 | exx ; 4 |
87 | nop ; 4 (66) |
ffd4b35c |
88 | |
e71680d5 |
89 | dec bc ; 6 |
90 | ld a, b ; 4 |
91 | or a, c ; 4 |
92 | jp z,end_vcnt ; 10 |
93 | jp t_idle_loop ; 10 (66+34) |
ffd4b35c |
94 | |
e71680d5 |
95 | ; helper for tests 5 and 6 |
96 | macro ld_a 2 |
97 | ld a, @2 ; 7 |
98 | ld @1, a ; 7 |
99 | endmacro |
100 | macro save_hvcount_unstable dst |
101 | 0 |
102 | ld bc, ($7f08) ; hvc 20 |
103 | ld hl, ($7f08) ; hvc 16 |
104 | ld a, b ; 4 |
105 | xor a, h ; 4 |
106 | and a, $c0 ; 7 hcnt bad sample? |
107 | jp nz,0b ; 10 (61 loop) |
108 | ld a, c ; 4 |
109 | xor a, l ; 4 vcnt changed while sampling? |
110 | jp nz,0b ; 10 (79 loop) |
111 | ld (dst), hl ; 20 (99) |
112 | endmacro |
113 | macro save_hvcount dst |
114 | ld hl, $7f08 ; vcnt 10 |
115 | 0 |
116 | ld a, (hl) ; 7 |
117 | cp a, (hl) ; 7 |
118 | jp nz,0b ; 10 |
119 | ld (dst), a |
120 | endmacro |
121 | t_timer_prepare |
122 | ld d, $2 ; 7 |
123 | ld hl, $4000 ; addr 10 |
124 | ld bc, $4001 ; data 14 |
125 | ld (hl), $26 ; 10 |
126 | ld_a (bc), $ff ; 14 |
127 | ld (hl), $27 ; 10 |
128 | ld_a (bc), $3a ; 14 enable timer+flag,clear |
129 | 0 |
130 | ld a, (hl) ; 7 |
131 | and d ; 4 |
132 | jp z,0b ; 10 |
133 | xor a ; 4 |
134 | ld (bc), a ; 7 stop (timer tick in (16*72*2)*7/15) |
135 | ld a, ($7f08) ; vcnt 13 |
136 | exx ; 4 |
137 | save_hvcount $1102 ; 99+ |
138 | exx ; 4 |
139 | ret ; 10 |
ffd4b35c |
140 | |
e71680d5 |
141 | ; - 4 - |
142 | t_timer_a |
143 | ld sp, $2000 ; 10 |
144 | call t_timer_prepare ; 17++ |
145 | ld d, $1 ; 7 |
146 | xor a ; 4 |
147 | ld (hl), $24 ; 10 |
148 | ld (bc), a ; 7 |
149 | ld (hl), $25 ; 10 |
150 | ld (bc), a ; 7 |
151 | ld (hl), $27 ; 10 |
152 | ld_a (bc), $35 ; 14 enable timer+flag,clear ( max 67 |
153 | nop ; 4 flag clear delay |
154 | tim_a_loop |
155 | ld a, (hl) ; 7 |
156 | and d ; 4 |
157 | jp z,tim_a_loop ; 10 |
158 | save_hvcount $1100 ; 99+ |
159 | jp end ; 10 |
a385208c |
160 | |
e71680d5 |
161 | ; - 5 - |
162 | t_timer_b |
163 | ld sp, $2000 ; 10 copy-pasta from t_timer_a because I'm lazy |
164 | call t_timer_prepare ; 17++ |
165 | ld d, $2 ; 7 |
a385208c |
166 | xor a ; 4 |
e71680d5 |
167 | ld (hl), $26 ; 10 |
168 | ld (hl), $26 ; 10 dup for timing |
169 | ld_a (bc), $c0 ; 14 |
170 | ld (hl), $27 ; 10 |
171 | ld_a (bc), $3a ; 14 enable timer+flag,clear |
172 | nop ; 4 flag clear delay |
173 | tim_b_loop |
174 | ld a, (hl) ; 7 |
175 | and d ; 4 |
176 | jp z,tim_b_loop ; 10 |
177 | save_hvcount $1100 ; 99+ |
178 | jp end ; 10 |
a385208c |
179 | |