home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / SOURCE.ZIP / TIMER.ASM < prev    next >
Assembly Source File  |  1988-05-29  |  3KB  |  141 lines

  1. PAGE ,132
  2.     title    \asm_sour\timer.asm  HIGH ACCURACY TIMER
  3.     subttl    michael e. walraven
  4. .MODEL MEDIUM
  5.  
  6. name timer
  7. .cref
  8. .lall
  9.  
  10. ;
  11. ;    High resolution timer, returns a 32 bit high resolution
  12. ;    value which is the amount of elapsed time since the function
  13. ;    was last called.  The counts are 838.2ns each (1.19318 MHz)
  14. ;    time_int() must be called first to set the timer chip to
  15. ;    the proper mode.
  16. ;    Counter 0 is changed in time_int() and the data from this
  17. ;    counter is used in elaptime() so it must not be changed
  18. ;    between calls.
  19. ;    There should not be any interference in system timing 
  20. ;    max of 55 msec error introduced by time_int() into absolute
  21. ;    system time.
  22.  
  23. ;    MEDIUM memory model/microsoft 5.00
  24. ;    FAR PROGRAM, NEAR DATA
  25. ;    cs: is code segment
  26. ;    es: and ds: are data segment
  27. ;    ss: within data segment
  28. ;    ax: for integer return
  29. ;    dx:ax: for long return
  30.  
  31. .DATA
  32. ;    these data items located in the DSEG and can be accessed
  33. ;    as near by C programs
  34.  
  35.     PUBLIC    SYS_HI
  36.     PUBLIC    SYS_LOW
  37.     PUBLIC    TIMER_COUNT
  38.  
  39. SYS_HI        DW    ?    ;TIMER_HI VALUE FOR PREVIOUS CALL
  40. SYS_LOW        DW    ?    ;TIMER_LOW VALUE FOR PREVIOUS CALL
  41. TIMER_COUNT    DW    ?    ;8253 TIMER COUNT FOR PREVIOUS CALL
  42.  
  43.  
  44. ;    NO ARGUMENTS PASSED to either function
  45.  
  46. TIMER_MODE    EQU    043H
  47. TIMER0        EQU    040H
  48.  
  49. BIOS    SEGMENT    AT 040H
  50.     ORG    06CH
  51. TIMER_LOW    DW    ?
  52. TIMER_HI    DW    ?
  53. BIOS    ENDS
  54.  
  55. PAGE
  56. .CODE
  57.  
  58.     PUBLIC    _time_int
  59. _time_int    PROC
  60.  
  61. ;    void far time_int(void);
  62. ;
  63. ;    SET THE TIMER MODE FOR PULSE OUTPUT, RATHER THAN SQUARE
  64. ;        MODE AS SET BY DOS
  65.  
  66.     MOV    AL,00110100B    ;CTR 0, LSB THEN MSB
  67.                 ;MODE 2, BINARY
  68.     OUT    TIMER_MODE,AL    ;MODE REGISTER FOR 8253
  69.     SUB    AX,AX        ;SET 0, RESULT IN MAX COUNT
  70.     OUT    TIMER0,AL
  71.     OUT    TIMER0,AL
  72.     RET
  73. _time_int    ENDP
  74.  
  75.  
  76.     PUBLIC    _elaptime
  77. _elaptime    PROC
  78.  
  79. ;    long int far elaptime(void);
  80. ;
  81. ;    DETERMINE ELAPSED TIME SINCE LAST CALL
  82. ;    RETURNS 32 BIT (LONG) VALUE WHICH IS
  83. ;    NEW  - TIMER_HI:TIMER_LO:TIMER_COUNT   MINUS
  84. ;    OLD  - TIMER_HI:TIMER_LO:TIMER_COUNT
  85.  
  86. ;    ASSUMPTION MADE THAT 32 BITS WILL NOT OVERFLOW!!!!
  87.  
  88.     PUSH    ES
  89.     MOV    AX,BIOS
  90.     MOV    ES,AX
  91.     ASSUME    ES:BIOS
  92.  
  93.     MOV    AL,0        ;PREPARE TO LATCH COUNTER
  94.     OUT    TIMER_MODE,AL    ;LATCH 8253
  95.  
  96.     PUSHF        ;SAVE INTERRUPT STATE
  97.     CLI        ;TURN INTERRUPT OFF WHILE READING CODE
  98.     IN    AL,TIMER0
  99.     MOV    DL,AL
  100.     IN    AL,TIMER0
  101.     MOV    DH,AL        ;DX HAS NEW CHIP COUNT(count down value)
  102.  
  103.     MOV    BX,ES:TIMER_LOW    ;BX HAS SYSTEM TIME LOW WORD
  104.     MOV    AX,ES:TIMER_HI    ;AX HAS SYSTEM TIME HIGH WORD
  105.  
  106. ;    NOW HAVE A 48 BIT WORD AX:BX:DX FOR THE PRESENT TIME
  107.     MOV    CX,TIMER_COUNT    ;SWAP AND SUBTRACT
  108.     MOV    TIMER_COUNT,DX
  109.     SUB    CX,DX
  110.  
  111. ;    CX: HAS LOW 16 BITS OF DIFFERENCE
  112.  
  113.     MOV    DX,SYS_LOW    ;SWAP AND SUBTRACT
  114.     MOV    SYS_LOW,BX
  115.     SBB    BX,DX
  116.  
  117. ;    BX: HAS MID 16 BITS OF DIFFERENCE
  118.  
  119.     MOV    DX,SYS_HI    ;SWAP AND SUBTRACT
  120.     MOV    SYS_HI,AX
  121.     SBB    AX,DX
  122.  
  123. ;    AX: HAS HIGH 16 BITS OF DIFFERENCE
  124.  
  125. ;    NOW HAVE A 48 BIT WORD THAT IS DIFFERENCE
  126. ;    ONLY PASS BACK 32 BITS AT PRESENT
  127. ;    AS DX:AX
  128.  
  129.     MOV    AX,CX    ;LOW 16 BITS
  130.     MOV    DX,BX    ;MID 16 BITS
  131.  
  132.  
  133.     POPF
  134.     POP    ES
  135.     RET
  136. _elaptime    ENDP
  137.  
  138.  
  139.     END
  140.         
  141.