TIMEOUT.ASM
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:3k
源码类别:

操作系统开发

开发平台:

DOS

  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) Erick Engelke
  14. ;
  15. ;  version
  16. ;
  17. ;    0.1    7-Nov -1990   E. P. Engelke
  18. ;
  19. ;
  20.         include masmdefs.hsm
  21.         include model.hsm
  22. BIOSCLK equ 046ch
  23. HI_MAX equ 018h
  24. LO_MAX equ     0b0h
  25. codedef TIMEOUT
  26. datadef
  27. cstart  TIMEOUT
  28.         ; code segment variables
  29. date    dw 0,0
  30. oldhour db 0
  31. cpublic set_ttimeout
  32.         xor     DX, DX
  33.         mov     ES, DX
  34.         mov     AX, +@AB [BP]
  35.         pushf
  36.         cli
  37.         add     AX, ES:[ BIOSCLK ];
  38.         adc     DX, ES:[ BIOSCLK+2];
  39.         add     AX, CS: date            ; date extend
  40.         adc     DX, CS: date + 2
  41.         popf
  42. creturn set_ttimeout
  43. cpublic set_timeout
  44. xor AX, AX ; reference low memory
  45. mov ES, AX
  46.         mov     AX, +@AB [BP]           ; seconds
  47. mov DX, 1165
  48. mul DX ; 1165/64 = 18.203...
  49. mov CX, 6
  50. tmp:
  51. shr DX, 1
  52. rcr AX, 1
  53. loop tmp
  54.         pushf
  55.         cli
  56.         add     AX, ES:[ BIOSCLK ]
  57. adc DX, ES:[ BIOSCLK + 2 ]
  58.         add     AX, CS: date            ; date extend
  59.         adc     DX, CS: date + 2
  60.         popf
  61. creturn set_timeout
  62. cpublic chk_timeout
  63. xor AX, AX
  64. mov ES, AX
  65.         pushf
  66.         cli
  67. mov CX, ES:[BIOSCLK]
  68. mov BX, ES:[BIOSCLK+2]
  69.         popf
  70.         ; see if new date
  71.         cmp     BL, CS:oldhour          ; is it earlier modulo one day
  72.         je      samehr
  73.         jge     sameday
  74.         ; update the new date stuff
  75.         add     CS:date, LO_MAX
  76.         adc     CS:date+2, HI_MAX
  77. sameday:mov     CS:oldhour, BL          ; save new hour for next time
  78. samehr :add     CX, CS: date            ; date extend current time
  79.         adc     BX, CS: date + 2
  80.         mov     AX, +@AB + 0 [BP]       ; get supplied timeout value
  81. mov DX, +@AB + 2 [BP]
  82.         
  83.         cmp     DX, BX                  ; if timeout < clock has expired
  84.         jb      ret_tru
  85.         ja      ret_fal
  86.         cmp     AX, CX                  ; still checking timeout < clock
  87.         jb      ret_tru
  88. ret_fal:xor     AX, AX                  ; false
  89.         jmp     retern
  90. ret_tru:mov     AX, 1
  91. retern:
  92. creturn chk_timeout
  93. cend    TIMEOUT
  94.         end