+; ---
+
+jtable
+ dw end
+ dw t_copy
+ dw t_rd_timing
+ dw t_idle_loop
+ dw t_timer_a
+ dw t_timer_b
+jtable_end
+ ld b, jtable_end ; ensure < $100
+
+; - 1 -
+t_copy
+ ldir ; 21/16 ((de) <- (hl)) bc times
+ jp end ; 10
+
+; - 2 -
+t_rd_timing
+ ld d, h ; 4
+ ld e, l ; 4
+ inc de ; 6 14 (132)
+loop_read
+ ld a, (hl) ; 7
+ ld a, (de) ; 7
+ dec bc ; 6
+ ld a, b ; 4
+ or a, c ; 4
+ jp nz,loop_read ; 10 38
+
+end_vcnt
+ ld a, ($7f08) ; vcnt 13
+ ld de, ($1004) ; dst 20
+ ld (de), a ; 7
+ jp end ; 10 50
+
+; - 3 -
+t_idle_loop
+ exx ; 4 (waste cycles)
+ ld b, $4 ; 7
+1 djnz 1b ; 13 13*3+8=47
+ exx ; 4
+ nop ; 4 (66)
+
+ dec bc ; 6
+ ld a, b ; 4
+ or a, c ; 4
+ jp z,end_vcnt ; 10
+ jp t_idle_loop ; 10 (66+34)
+
+; helper for tests 5 and 6
+macro ld_a 2
+ ld a, @2 ; 7
+ ld @1, a ; 7
+endmacro
+macro save_hvcount_unstable dst
+0
+ ld bc, ($7f08) ; hvc 20
+ ld hl, ($7f08) ; hvc 16
+ ld a, b ; 4
+ xor a, h ; 4
+ and a, $c0 ; 7 hcnt bad sample?
+ jp nz,0b ; 10 (61 loop)
+ ld a, c ; 4
+ xor a, l ; 4 vcnt changed while sampling?
+ jp nz,0b ; 10 (79 loop)
+ ld (dst), hl ; 20 (99)
+endmacro
+macro save_hvcount dst
+ ld hl, $7f08 ; vcnt 10
+0
+ ld a, (hl) ; 7
+ cp a, (hl) ; 7
+ jp nz,0b ; 10
+ ld (dst), a
+endmacro
+t_timer_prepare
+ ld d, $2 ; 7
+ ld hl, $4000 ; addr 10
+ ld bc, $4001 ; data 14
+ ld (hl), $26 ; 10
+ ld_a (bc), $ff ; 14
+ ld (hl), $27 ; 10
+ ld_a (bc), $3a ; 14 enable timer+flag,clear
+0
+ ld a, (hl) ; 7
+ and d ; 4
+ jp z,0b ; 10
+ xor a ; 4
+ ld (bc), a ; 7 stop (timer tick in (16*72*2)*7/15)
+ ld a, ($7f08) ; vcnt 13
+ exx ; 4
+ save_hvcount $1102 ; 99+
+ exx ; 4
+ ret ; 10
+
+; - 4 -
+t_timer_a
+ ld sp, $2000 ; 10
+ call t_timer_prepare ; 17++
+ ld d, $1 ; 7
+ xor a ; 4
+ ld (hl), $24 ; 10
+ ld (bc), a ; 7
+ ld (hl), $25 ; 10
+ ld (bc), a ; 7
+ ld (hl), $27 ; 10
+ ld_a (bc), $35 ; 14 enable timer+flag,clear
+ nop ; 4 flag clear delay
+tim_a_loop
+ ld a, (hl) ; 7
+ and d ; 4
+ jp z,tim_a_loop ; 10
+ save_hvcount $1100 ; 99+
+ jp end ; 10
+
+; - 5 -
+t_timer_b
+ ld sp, $2000 ; 10 copy-pasta from t_timer_a because I'm lazy
+ call t_timer_prepare ; 17++
+ ld d, $2 ; 7
+ xor a ; 4
+ ld (hl), $26 ; 10
+ ld (hl), $26 ; 10 dup for timing
+ ld_a (bc), $c0 ; 14
+ ld (hl), $27 ; 10
+ ld_a (bc), $3a ; 14 enable timer+flag,clear
+ nop ; 4 flag clear delay
+tim_b_loop
+ ld a, (hl) ; 7
+ and d ; 4
+ jp z,tim_b_loop ; 10
+ save_hvcount $1100 ; 99+
+ jp end ; 10
+