home *** CD-ROM | disk | FTP | other *** search
- ;put into the public domain by Russell Nelson, nelson@crynwr.com
-
- ;we read the timer chip's counter zero. It runs freely, counting down
- ;from 65535 to zero. We sample the count coming in and subract the previous
- ;count. Then we double it and add it to our timeout_counter. When it overflows,
- ;then we've waited a tick of 27.5 ms.
-
- timeout dw ? ;number of ticks to wait.
- timeout_counter dw ? ;old counter zero value.
- timeout_value dw ?
-
- set_timeout:
- ;enter with ax = number of ticks (36.4 ticks per second).
- inc ax ;the first times out immediately.
- mov cs:timeout,ax
- mov cs:timeout_counter,0
- call latch_timer
- mov cs:timeout_value,ax
- ret
-
- latch_timer:
- mov al,0 ;latch counter zero.
- out 43h,al
- in al,40h ;read counter zero.
- mov ah,al
- in al,40h
- xchg ah,al
- ret
-
-
- do_timeout:
- ;call at *least* every 27.5ms when checking for timeout. Returns nz
- ;if we haven't timed out yet.
- call latch_timer
- xchg ax,cs:timeout_value
- sub ax,cs:timeout_value
- shl ax,1 ;keep timeout in increments of 27.5 ms.
- add cs:timeout_counter,ax ;has the counter overflowed yet?
- jnc do_timeout_1 ;no.
- dec cs:timeout ;Did we hit the timeout value yet?
- ret
- do_timeout_1:
- or sp,sp ;ensure nz.
- ret
-