home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / CEREBRUM / WAT9609.ZIP / ELIB / TIMEOUT.ASM < prev   
Assembly Source File  |  1994-11-28  |  3KB  |  115 lines

  1. ;
  2. ;  Timer routines - use set_*timeout to receive a clock value which
  3. ;                   can later be tested by calling chk_timeout with
  4. ;                   that clock value to determine if a timeout has
  5. ;                   occurred.  chk_timeout returns 0 if NOT timed out.
  6. ;
  7. ;
  8. ;  Usage :
  9. ;           long set_timeout( int seconds );
  10. ;           long set_ttimeout( int pc_ticks );
  11. ;           int chk_timeout( long value );
  12. ;
  13. ;  (c) 1990 University of Waterloo,
  14. ;           Faculty of Engineering,
  15. ;           Engineering Microcomputer Network Development Office
  16. ;
  17. ;  version
  18. ;
  19. ;    0.1    7-Nov -1990   E. P. Engelke
  20. ;
  21. ;
  22.         include masmdefs.hsm
  23.         include model.hsm
  24.  
  25. BIOSCLK    equ    046ch
  26. HI_MAX    equ    018h
  27. LO_MAX    equ     0b0h
  28.  
  29. codedef TIMEOUT
  30. datadef
  31.  
  32. cstart  TIMEOUT
  33.  
  34.         ; code segment variables
  35.  
  36. date    dw 0,0
  37. oldhour db 0
  38.  
  39. cpublic set_ttimeout
  40.         xor     DX, DX
  41.         mov     ES, DX
  42.         mov     AX, +@AB [BP]
  43.         pushf
  44.         cli
  45.         add     AX, ES:[ BIOSCLK ];
  46.         adc     DX, ES:[ BIOSCLK+2];
  47.         add     AX, CS: date            ; date extend
  48.         adc     DX, CS: date + 2
  49.         popf
  50. creturn set_ttimeout
  51.  
  52. cpublic set_timeout
  53.     xor    AX, AX            ; reference low memory
  54.     mov    ES, AX
  55.  
  56.         mov     AX, +@AB [BP]           ; seconds
  57.  
  58.     mov    DX, 1165
  59.     mul    DX            ; 1165/64 = 18.203...
  60.  
  61.     mov    CX, 6
  62. tmp:
  63.     shr    DX, 1
  64.     rcr    AX, 1
  65.     loop    tmp
  66.  
  67.         pushf
  68.         cli
  69.         add     AX, ES:[ BIOSCLK ]
  70.     adc    DX, ES:[ BIOSCLK + 2 ]
  71.         add     AX, CS: date            ; date extend
  72.         adc     DX, CS: date + 2
  73.         popf
  74. creturn set_timeout
  75. cpublic    chk_timeout
  76.     xor    AX, AX
  77.     mov    ES, AX
  78.         pushf
  79.         cli
  80.     mov    CX, ES:[BIOSCLK]
  81.     mov    BX, ES:[BIOSCLK+2]
  82.         popf
  83.  
  84.         ; see if new date
  85.         cmp     BL, CS:oldhour          ; is it earlier modulo one day
  86.         je      samehr
  87.         jge     sameday
  88.  
  89.         ; update the new date stuff
  90.         add     CS:date, LO_MAX
  91.         adc     CS:date+2, HI_MAX
  92.  
  93. sameday:mov     CS:oldhour, BL          ; save new hour for next time
  94.  
  95. samehr :add     CX, CS: date            ; date extend current time
  96.         adc     BX, CS: date + 2
  97.  
  98.         mov     AX, +@AB + 0 [BP]       ; get supplied timeout value
  99.     mov    DX, +@AB + 2 [BP]
  100.         
  101.         cmp     DX, BX                  ; if timeout < clock has expired
  102.         jb      ret_tru
  103.         ja      ret_fal
  104.         cmp     AX, CX                  ; still checking timeout < clock
  105.         jb      ret_tru
  106.  
  107. ret_fal:xor     AX, AX                  ; false
  108.         jmp     retern
  109.  
  110. ret_tru:mov     AX, 1
  111. retern:
  112. creturn chk_timeout
  113. cend    TIMEOUT
  114.         end
  115.