| 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 ; 8 |
| 25 | ld a, (de) ; 7 |
| 26 | ld ixh, a ; 8 |
| 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 |
| 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 | |