home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / ins_msb / 9202 / qtimer.bas < prev    next >
BASIC Source File  |  1991-06-03  |  3KB  |  119 lines

  1. ' QTimer.Bas
  2. ' $INCLUDE: 'QB.BI'
  3.  
  4. ' QTimer - Fine resolution timer functions
  5.  
  6. DECLARE FUNCTION tStart& ()
  7. DECLARE FUNCTION tFormat$ (T1 AS LONG, T2 AS LONG)
  8. DECLARE FUNCTION tDiff! (StartTime AS LONG, EndTime AS LONG)
  9. DECLARE FUNCTION tGet& ()
  10. DECLARE FUNCTION LZPad$ (A AS DOUBLE, N AS INTEGER)
  11. DECLARE FUNCTION STRa$ (A AS DOUBLE)
  12. DECLARE SUB BlockMove ALIAS "B$ASSN" _
  13.            (BYVAL FromSeg%, BYVAL FromOffset%, BYVAL SrcBytes%, _
  14.             BYVAL ToSeg%, BYVAL ToOffset%, BYVAL DestBytes%)
  15.  
  16. CONST TixSec = 18.20648193#
  17. CONST TixMin = TixSec * 60!
  18. CONST TixHour = TixMin * 60!
  19. CONST TixDay = TixHour * 24!
  20.  
  21. FUNCTION tGet&
  22.  
  23. ' tGet& - Use the undocumented B$ASSN (QB assignment operator)
  24. '         subroutine to move the BIOS tick counter into a
  25. '         long integer variable.
  26.  
  27. DIM Temp AS LONG
  28.   CALL BlockMove (&H40, &H6C, 4, VARSEG(Temp), VARPTR(Temp), 4)
  29.   tGet& = Temp
  30. END FUNCTION
  31.  
  32. FUNCTION tStart&
  33.  
  34. ' tStart& - wait for a new tick, and return the
  35. ' tick number to the caller. The wait allows
  36. ' us to be sure the user gets a start at the
  37. ' beginning of the second
  38.  
  39. DIM StartTime AS LONG
  40.   StartTime = tGet
  41.   DO WHILE StartTime = tGet
  42.     tStart& = tGet
  43.   LOOP
  44. END FUNCTION
  45.  
  46.  
  47. FUNCTION tDiff! (StartTime AS LONG, EndTime AS LONG)
  48.  
  49. ' tDiff! - compute the difference between two
  50. '          timepoints (in seconds).
  51.  
  52.   tDiff! = (EndTime - StartTime) / TixSec
  53. END FUNCTION
  54.  
  55. SUB GetTime (H AS INTEGER, M AS INTEGER, S AS INTEGER, S100 AS INTEGER)
  56.  
  57. ' GetTime - Invoke the INT 21 function 2C to get the system time
  58.  
  59. DIM Regs AS RegType
  60.   Regs.AX = &H2C00
  61.   Interrupt &H21, Regs, Regs
  62.   H = (Regs.CX \ 256) AND &HFF
  63.   M = Regs.CX AND &HFF
  64.   S = (Regs.DX \ 256) AND &HFF
  65.   S100 = Regs.DX AND &HFF
  66. END SUB
  67.  
  68. FUNCTION tFormat$ (T1 AS LONG, T2 AS LONG)
  69.  
  70. ' tFormat$ - given two times, return a string that
  71. '            is the difference in the times, formatted HH:MM:SS.ZZZ
  72. '            (where ZZZ is hundredths of seconds)
  73.  
  74. DIM Temp AS SINGLE
  75. DIM tStr AS STRING
  76. DIM TempStr AS STRING
  77. DIM TimeValue(1 TO 4) AS LONG
  78. DIM I AS INTEGER
  79.   Temp = T2 - T1           ' time difference
  80.   IF Temp < 0 THEN
  81.     Temp = Temp + TixDay   ' adjust midnight crossover
  82.   END IF
  83.   TimeValue(1) = INT(Temp / TixHour)
  84.   Temp = Temp MOD TixHour
  85.   TimeValue(2) = INT(Temp / TixMin)
  86.   Temp = Temp MOD TixMin
  87.   TimeValue(3) = INT(Temp / TixSec)
  88.   Temp = Temp MOD TixSec
  89.   TimeValue(4) = INT(Temp * 100! / TixSec + .5)
  90.   tStr = LZPad$((TimeValue(1)), 2)
  91.   TempStr = ""
  92.   FOR I = 2 TO 3
  93.      TempStr = LZPad$((TimeValue(I)), 2)
  94.      tStr = tStr + ":" + TempStr
  95.   NEXT I
  96.   TempStr = LZPad$((TimeValue(4)), 3)
  97.   tStr = tStr + "." + TempStr
  98.   tFormat$ = tStr
  99. END FUNCTION
  100.  
  101. '
  102. '  Functions to pad a numeric variable
  103. '  on the left with zeroes and return it as a string.
  104. '  Use () to coerce the variable if not double-precision.
  105. '
  106. FUNCTION LZPad$ (N#, pLen%) STATIC
  107. LZPad$ = STRING$((pLen% - LEN(STR$(N#))) + 1, "0") + STRa$(N#)
  108. END FUNCTION
  109.  
  110. '
  111. '  Function which is like STR$() but does not
  112. '  stick a leading blank on the string it returns.
  113. '  Use () to coerce the variable if not double-precision.
  114. '
  115. FUNCTION STRa$ (N#) STATIC
  116. STRa$ = RIGHT$(STR$(N#), LEN(STR$(N#)) - 1)
  117. END FUNCTION
  118.  
  119.