ostimer.asm
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:3k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. TITLE OSTIMER - MS-DOS TIMER support
  2. ;***
  3. ; OSTIMER - MS-DOS TIMER Support
  4. ;
  5. ; Copyright <C> 1988, Microsoft Corporation
  6. ;
  7. ;Purpose:
  8. ;
  9. ; BASIC Syntax mapping to included runtime entry points:
  10. ;
  11. ;
  12. ; - TIMER Function:
  13. ;
  14. ;      var = TIMER
  15. ;        |
  16. ;      B$TIMR
  17. ;
  18. ;******************************************************************************
  19. INCLUDE switch.inc
  20. INCLUDE rmacros.inc
  21. USESEG OS_TEXT
  22. USESEG MT_TEXT
  23. USESEG _BSS
  24. USESEG _DATA
  25. INCLUDE seg.inc
  26. INCLUDE oscalls.inc
  27. INCLUDE files.inc
  28. C_GETTIM EQU 44 ;Get Time Function (for CALLOS)
  29. sBegin _BSS
  30. externB b$Buf1 ;Floating point temporary storage
  31. sEnd _BSS
  32. sBegin MT_TEXT
  33. externNP B$fmldw
  34. sEnd MT_TEXT
  35. sBegin OS_TEXT
  36. assumes CS,OS_TEXT
  37. SUBTTL B$TIMR - elapsed time since midnight
  38. PAGE
  39. ;***
  40. ; B$TIMR - returns number of seconds past midnight of current day.
  41. ;
  42. ; Input:
  43. ; NONE
  44. ; Output:
  45. ; AX = ptr to s.p. number of seconds since midnight
  46. ; Modifies:
  47. ; NONE
  48. ; Exceptions:
  49. ;****
  50. cProc B$TIMR,<PUBLIC,FAR,FORCEFRAME>,<SI,ES>
  51. cBegin
  52. CALLOS GETTIM ;CH=hour, CL=min, DH=sec, DL=Hundreths of sec
  53. MOV AL,60 ;convert hours to minutes, stay int as long as
  54. MUL CH ;as possible, result in ax
  55. XOR CH,CH ;cx = minutes
  56. ADD AX,CX ;ax = number of minutes past midnight
  57. MOV BX,AX ;bx = number of minutes past midnight
  58. PUSH DX
  59. CALL B$fmldw  ;ST0 = number of minutes past midnight
  60. POP DX
  61. MOV AX,60 ;ah = 0 so "op" will be "*" in ST0 = ST0 op AL
  62. CALL ST0OpAl  ;  (convert minutes to seconds)
  63. MOV AL,DH ;al = number of seconds
  64. MOV AH,1 ;ah is 1 so "op" will be "+" in
  65. CALL ST0OpAl  ;   ST0 = ST0 op AL
  66. MOV AX,100 ;[ah] = 0 so "op" will be "*" in ST0OpAl
  67. CALL ST0OpAl  ;convert ST0 to hundreths of seconds
  68. MOV AL,DL ;[al] = hundreths of seconds
  69. MOV AH,1 ;[ah] is 1 so "op" will be "+"
  70. CALL ST0OpAl  ;in ST0 = ST0 op AL
  71. MOV AX,0200H + 100d ;[ah] = 2 so "op" will be "/" in ST0OpAl
  72. CALL ST0OpAl  ;convert ST0 to seconds from hundreths
  73. MOV BX,OFFSET DGROUP:b$Buf1 ; BX = ptr to s.p. temp store loc.
  74. ;of seconds
  75. FSTP DWORD PTR [BX] ;put s.p. equivalent into FAC
  76. XCHG AX,BX ;restore pointer to result (retval)
  77. FWAIT ;ensure result in RAM prior to return
  78. cEnd
  79. PAGE
  80. ;***
  81. ;ST0OpAl - Add or multiply contents of AL and the ST0, returning result in ST0
  82. ;Purpose:
  83. ; Either adds or mulitplies the contents of ST0 by the value in AL.
  84. ; The result is returned in the ST0.
  85. ;Entry:
  86. ; AH  - 0 then multiply
  87. ; 1 then add
  88. ; else divide ST0 by AL
  89. ; AL  - value to multiply/add to or divide into ST0
  90. ;Exit:
  91. ; ST0 - contains result
  92. ;Preserves:
  93. ; SI, DI, DX
  94. ;Exceptions:
  95. ; None.
  96. ;****
  97. cProc ST0OpAl,<NEAR>,<DX>
  98. cBegin
  99. PUSH AX
  100. MOV BL,AL
  101. XOR BH,BH
  102. CALL B$fmldw  ; ST0 = input value
  103. POP AX
  104. OR AH,AH
  105. JZ ST0MUL ; brif we're to multiply ST1 by ST0
  106. DEC AH
  107. JZ ST0ADD ; brif we're to add ST0 to ST1
  108. FDIV ; ST0 = ST1/ST0
  109. JMP SHORT ST0Ret
  110. ST0MUL:
  111. FMUL ; ST0 = ST1 * ST0
  112. JMP SHORT ST0Ret
  113. ST0ADD:
  114. FADD ; ST0 = ST1 + ST0
  115. ST0Ret:
  116. cEnd ST0OpAl
  117. sEnd OS_TEXT
  118. END