Lines Matching refs:timer
75 x86emu_i8254_counter(struct x86emu_i8254_timer *timer, uint64_t curtick) in x86emu_i8254_counter() argument
80 if (timer->gate_high || timer->start_tick > curtick) in x86emu_i8254_counter()
81 return timer->active_counter; in x86emu_i8254_counter()
84 if (timer->active_is_bcd) in x86emu_i8254_counter()
89 curtick -= timer->start_tick; in x86emu_i8254_counter()
92 if (curtick <= timer->active_counter) in x86emu_i8254_counter()
93 return timer->active_counter - curtick; in x86emu_i8254_counter()
97 if (timer->active_counter == 0 && curtick - 1 <= maxtick) in x86emu_i8254_counter()
101 if (timer->active_mode & 2) in x86emu_i8254_counter()
102 return timer->active_counter - curtick % timer->active_counter; in x86emu_i8254_counter()
110 x86emu_i8254_out(struct x86emu_i8254_timer *timer, uint64_t curtick) in x86emu_i8254_out() argument
123 if (timer->gate_high || timer->start_tick > curtick) in x86emu_i8254_out()
124 return (timer->active_mode != 0); in x86emu_i8254_out()
126 curtick -= timer->start_tick; in x86emu_i8254_out()
129 if (timer->active_mode == 0 || timer->active_mode == 1) in x86emu_i8254_out()
130 return curtick >= timer->start_tick; in x86emu_i8254_out()
133 if (timer->active_mode == 5 || timer->active_mode == 7) in x86emu_i8254_out()
134 return curtick != timer->start_tick; in x86emu_i8254_out()
140 if (timer->active_mode == 2 || timer->active_mode == 3) { in x86emu_i8254_out()
141 curtick %= timer->active_counter; in x86emu_i8254_out()
142 return curtick + 1 != timer->active_counter; in x86emu_i8254_out()
149 curtick %= timer->active_counter; in x86emu_i8254_out()
150 return curtick < (timer->active_counter + 1) / 2; in x86emu_i8254_out()
154 x86emu_i8254_latch_status(struct x86emu_i8254_timer *timer, uint64_t curtick) in x86emu_i8254_latch_status() argument
156 if (timer->status_is_latched) in x86emu_i8254_latch_status()
158 timer->latched_status = timer->active_is_bcd ? 1 : 0; in x86emu_i8254_latch_status()
159 timer->latched_status |= timer->active_mode << 1; in x86emu_i8254_latch_status()
160 timer->latched_status |= timer->rw_status; in x86emu_i8254_latch_status()
161 timer->latched_status |= timer->null_count ? 0x40 : 0; in x86emu_i8254_latch_status()
165 x86emu_i8254_latch_counter(struct x86emu_i8254_timer *timer, uint64_t curtick) in x86emu_i8254_latch_counter() argument
167 if (!timer->counter_is_latched) in x86emu_i8254_latch_counter()
169 timer->latched_counter = x86emu_i8254_counter(timer, curtick); in x86emu_i8254_latch_counter()
170 timer->counter_is_latched = true; in x86emu_i8254_latch_counter()
176 struct x86emu_i8254_timer *timer; in x86emu_i8254_write_command() local
185 timer = &sc->timer[i]; in x86emu_i8254_write_command()
190 x86emu_i8254_latch_status(timer, curtick); in x86emu_i8254_write_command()
192 x86emu_i8254_latch_counter(timer, curtick); in x86emu_i8254_write_command()
197 timer = &sc->timer[val >> 6]; in x86emu_i8254_write_command()
201 x86emu_i8254_latch_counter(timer, x86emu_i8254_gettick(sc)); in x86emu_i8254_write_command()
204 timer->write_lsb = timer->read_lsb = true; in x86emu_i8254_write_command()
205 timer->write_msb = timer->read_msb = false; in x86emu_i8254_write_command()
208 timer->write_lsb = timer->read_lsb = false; in x86emu_i8254_write_command()
209 timer->write_msb = timer->read_msb = true; in x86emu_i8254_write_command()
212 timer->write_lsb = timer->read_lsb = true; in x86emu_i8254_write_command()
213 timer->write_msb = timer->read_msb = true; in x86emu_i8254_write_command()
216 timer->rw_status = val & 0x30; in x86emu_i8254_write_command()
217 timer->null_count = true; in x86emu_i8254_write_command()
218 timer->new_mode = (val >> 1) & 0x7; in x86emu_i8254_write_command()
219 timer->new_is_bcd = (val & 1) == 1; in x86emu_i8254_write_command()
224 struct x86emu_i8254_timer *timer) in x86emu_i8254_read_counter() argument
230 if (timer->status_is_latched) { in x86emu_i8254_read_counter()
231 timer->status_is_latched = false; in x86emu_i8254_read_counter()
232 return timer->latched_status; in x86emu_i8254_read_counter()
239 if (timer->counter_is_latched) in x86emu_i8254_read_counter()
240 val = timer->latched_counter; in x86emu_i8254_read_counter()
242 val = x86emu_i8254_counter(&sc->timer[2], in x86emu_i8254_read_counter()
245 if (timer->active_is_bcd) in x86emu_i8254_read_counter()
249 if (timer->read_lsb) { in x86emu_i8254_read_counter()
251 timer->read_lsb = false; in x86emu_i8254_read_counter()
252 } else if (timer->read_msb) { in x86emu_i8254_read_counter()
254 timer->read_msb = false; in x86emu_i8254_read_counter()
259 if (!timer->read_lsb && !timer->read_msb) in x86emu_i8254_read_counter()
260 timer->counter_is_latched = false; in x86emu_i8254_read_counter()
267 struct x86emu_i8254_timer *timer, uint8_t val) in x86emu_i8254_write_counter() argument
270 if (!timer->write_lsb && !timer->write_msb) in x86emu_i8254_write_counter()
274 if (timer->write_lsb) { in x86emu_i8254_write_counter()
275 timer->new_counter &= ~0xff; in x86emu_i8254_write_counter()
276 timer->new_counter |= val; in x86emu_i8254_write_counter()
277 timer->write_lsb = false; in x86emu_i8254_write_counter()
279 KASSERT(timer->write_msb); in x86emu_i8254_write_counter()
280 timer->new_counter &= ~0xff00; in x86emu_i8254_write_counter()
281 timer->new_counter |= val << 8; in x86emu_i8254_write_counter()
282 timer->write_msb = false; in x86emu_i8254_write_counter()
286 if (!timer->write_lsb && !timer->write_msb) { in x86emu_i8254_write_counter()
287 timer->null_count = false; in x86emu_i8254_write_counter()
288 timer->counter_is_latched = false; in x86emu_i8254_write_counter()
289 timer->status_is_latched = false; in x86emu_i8254_write_counter()
290 timer->active_is_bcd = timer->new_is_bcd; in x86emu_i8254_write_counter()
291 timer->active_mode = timer->new_mode; in x86emu_i8254_write_counter()
292 timer->start_tick = x86emu_i8254_gettick(sc) + 1; in x86emu_i8254_write_counter()
293 if (timer->new_is_bcd) in x86emu_i8254_write_counter()
294 timer->active_counter = bcd2bin(timer->new_counter); in x86emu_i8254_write_counter()
303 val = (sc->timer[2].gate_high) ? 1 : 0; in x86emu_i8254_read_nmi()
304 if (x86emu_i8254_out(&sc->timer[2], x86emu_i8254_gettick(sc))) in x86emu_i8254_read_nmi()
315 old_gate = sc->timer[2].gate_high; in x86emu_i8254_write_nmi()
316 sc->timer[2].gate_high = (val & 1) == 1; in x86emu_i8254_write_nmi()
317 if (!old_gate && sc->timer[2].gate_high) in x86emu_i8254_write_nmi()
318 sc->timer[2].start_tick = x86emu_i8254_gettick(sc) + 1; in x86emu_i8254_write_nmi()
324 struct x86emu_i8254_timer *timer; in x86emu_i8254_init() local
331 timer = &sc->timer[i]; in x86emu_i8254_init()
332 timer->gate_high = false; in x86emu_i8254_init()
333 timer->start_tick = 0; in x86emu_i8254_init()
334 timer->active_counter = 0; in x86emu_i8254_init()
335 timer->active_mode = 0; in x86emu_i8254_init()
336 timer->active_is_bcd = false; in x86emu_i8254_init()
337 timer->counter_is_latched = false; in x86emu_i8254_init()
338 timer->read_lsb = false; in x86emu_i8254_init()
339 timer->read_msb = false; in x86emu_i8254_init()
340 timer->status_is_latched = false; in x86emu_i8254_init()
341 timer->null_count = false; in x86emu_i8254_init()
350 return x86emu_i8254_read_counter(sc, &sc->timer[0]); in x86emu_i8254_inb()
352 return x86emu_i8254_read_counter(sc, &sc->timer[1]); in x86emu_i8254_inb()
354 return x86emu_i8254_read_counter(sc, &sc->timer[2]); in x86emu_i8254_inb()
365 x86emu_i8254_write_counter(sc, &sc->timer[0], val); in x86emu_i8254_outb()
367 x86emu_i8254_write_counter(sc, &sc->timer[1], val); in x86emu_i8254_outb()
369 x86emu_i8254_write_counter(sc, &sc->timer[2], val); in x86emu_i8254_outb()