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

操作系统开发

开发平台:

Visual C++

  1. ;***
  2. ;* $Workfile:   readtick.asm  $
  3. ;* $Revision:   1.2  $
  4. ;*   $Author:   Dave Sewell  $
  5. ;*     $Date:   10 Sep 1990 13:34:30  $
  6. ;*
  7. ;* "read_ticks" routine to read the 16-bit timer.
  8. ;***
  9. % .MODEL memmodel, language
  10. TIMER_0  EQU 40H     ;8253 counter 0 port
  11. TIMER_CTL EQU 43H     ;8253 control port
  12. TIMER_SET EQU 00110100B   ;8253 Counter 0, set LOB/HOB, mode 2, binary
  13. TIMER_0_LATCH EQU 00H     ;8253 cmd to save channel 0 current count
  14.     EXTRN   NULL_PROC:FAR
  15.                 IF @CodeSize
  16.             .CODE PARAGON_TEXT
  17.                 ELSE
  18.             .CODE
  19.                 ENDIF
  20. loc_null_proc PROC NEAR
  21. ret
  22. loc_null_proc ENDP
  23. fread_ticks PROC    FAR
  24. ;* extern unsigned int far pascal fread_ticks(void);
  25.     call    read_ticks
  26.     ret
  27. fread_ticks ENDP
  28. read_ticks  PROC    NEAR
  29. ;* NAME
  30. ;* read_ticks -- Return high resolution timer information.
  31. ;*
  32. ;* SYNOPSIS
  33. ;* time = read_ticks();
  34. ;*
  35. ;* unsigned int time; Current number of ticks (0.838 microseconds).
  36. ;*
  37. ;* DESCRIPTION
  38. ;* Routine current value in 8253 timer.
  39. ;*
  40. ;* NOTE:  values count DOWN instead of up, as they do in "ticks()".
  41. ;*
  42. ;* extern unsigned int near read_ticks(void);
  43.     PUSHF
  44.     CLI
  45.     MOV     AL, TIMER_0_LATCH
  46.     OUT     TIMER_CTL, AL ;Latch current count in 8253
  47.     CALL    NULL_PROC
  48.     IN     AL, TIMER_0  ;Get low order byte
  49.     MOV     AH, AL ;Save it in AH
  50.     CALL    NULL_PROC     ;Insure 5 clocks for 8253 recovery time
  51.     IN     AL, TIMER_0  ;Get high order byte
  52.     POPF
  53.     XCHG    AH, AL ;Get high, low bytes in right order
  54.     RET  ;Return value in AX
  55. read_ticks  ENDP
  56.     END