testpico: show that vres clear is separate
[megadrive.git] / testpico / z80_test.s80
1 ; for sjasm 0.42
2   ORG $0
3
4 init
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)
14
15 loop
16   add a, (hl)      ;       7
17   jp  z, loop      ;      10  17 (27 worst)
18
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-$
41
42 irq
43   ret
44
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
60   jp  end          ;      10
61
62 ; - 2 -
63 t_rd_timing
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
75 end_vcnt
76   ld  a, ($7f08)   ; vcnt 13
77   ld  de, ($1004)  ; dst  20
78   ld  (de), a      ;       7
79   jp  end          ;      10  50
80
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)
88
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)
94
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
140
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
160
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
166   xor a            ;       4
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
179