home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / S / ZEN2.LBR / TIMEDRVR.LIB < prev    next >
Text File  |  2000-06-30  |  3KB  |  180 lines

  1. ;***    TIMER DRIVER
  2. ;
  3.  
  4. ;**    INITIALIZATION
  5. ;
  6.  
  7. INTIM:
  8.  
  9.     PUSHF
  10.     CLI
  11.  
  12. ;    MAKE SURE ALL COUNTER READ CYCLES ARE COMPLETED
  13.  
  14.     IN    AL,ZTIMER+PITC0
  15.     IN    AL,ZTIMER+PITC0
  16.     IN    AL,ZTIMER+PITC1
  17.     IN    AL,ZTIMER+PITC1
  18.     IN    AL,ZTIMER+PITC2
  19.     IN    AL,ZTIMER+PITC2
  20.  
  21. ;    INIT COUNTER MODES
  22.  
  23.     MOV    AL,PITSC0+PITRLW+PITMSW
  24.     OUT    ZTIMER+PITCW,AL        ;COUNTER 0 - SQUARE WAVE GENERATOR
  25.     MOV    AL,PITSC1+PITRLW+PITMITC
  26.     OUT    ZTIMER+PITCW,AL        ;COUNTER 1 - EVENT COUNTER
  27.     MOV    AL,PITSC2+PITRLW+PITMITC
  28.     OUT    ZTIMER+PITCW,AL        ;COUNTER 2 - INT ON TERMINAL COUNT
  29.  
  30. ;    INIT COUNTER VALUES
  31.  
  32.     XOR    AL,AL            ;TIMER 1
  33.     OUT    ZTIMER+PITC1,AL
  34.     OUT    ZTIMER+PITC1,AL
  35.     MOV    AX,TIMEVAL        ;TIMER 0
  36.     OUT    ZTIMER+PITC0,AL
  37.     MOV    AL,AH
  38.     OUT    ZTIMER+PITC0,AL
  39.  
  40. ;    WAIT FOR FIRST RISING CLOCK FROM COUNTER 0
  41.  
  42.     MOV    AL,NOT TIMERS0
  43.     OUT    ZTSTAT,AL
  44.     XOR    CX,CX
  45. INTIM1:
  46.     IN    AL,ZTSTAT
  47.     TEST    AL,TIMERS0
  48.     LOOPZ    INTIM1
  49.     JCXZ    TIMERR
  50.  
  51. ;    CLEAR ANY PENDING INTERRUPTS
  52.     MOV    AL,NOT (TIMERS0+TIMERS2)
  53.     OUT    ZTSTAT,AL
  54.  
  55. ;    INIT WORK VARIABLES
  56.  
  57.     MOV    TIMEFLG,0
  58.     MOV    PTICCNT,0
  59.     MOV    TICCNT,0
  60.     MOV    TICCNT+2,0
  61.  
  62.     POPF
  63.  
  64.     RET
  65.  
  66. ;*    TIMER NOT RUNNING
  67.  
  68. TIMERR:
  69.     LEA    SI,TIMERRM
  70.     CALL    PMSG
  71.     HLT
  72.  
  73.  
  74.  
  75.  
  76. ;**    TIMER INTERRUPT HANDLER
  77. ;
  78.  
  79. INTTIM:
  80.     PUSHA                ;SAVE ALL REGS
  81.     MOV    AX,CS            ;GET DS VALUE
  82.     MOV    DS,AX
  83.     MOV    ES,BANK1        ;GET ES VALUE
  84.  
  85. ;    CHECK CAUSE OF INTERRUPT
  86.  
  87.     IN    AL,ZTSTAT        ;GET CAUSE OF TIMER INTERRUPT
  88.     TEST    AL,TIMERS0        ;Q. IS IT TIMER 0
  89.     JNZ    TIM0INT            ; BR IF YES
  90.     TEST    AL,TIMERS2        ;Q. IS IT TIMER 2
  91.     JNZ    TIM2INT            ; BR IF YES
  92.  
  93. ;*    TIMER INTERRUPT HANDLER EXIT
  94.  
  95. TIMINTX:
  96.     POPA
  97.     JMP    INTX2
  98.  
  99. ;*    HANDLE TIMER 0 INTERRUPTS
  100.  
  101. TIM0INT:
  102.     MOV    AL,PITSC1+PITRLCL
  103.     OUT    ZTIMER+PITCW,AL        ;LATCH COUNTER 1 VALUE
  104.     IN    AL,ZTIMER+PITC1        ;GET COUNTER 1 VALUE
  105.     MOV    AH,AL
  106.     IN    AL,ZTIMER+PITC1
  107.     XCHG    AH,AL
  108.  
  109.     XCHG    PTICCNT,AX        ;(AX)=PREVIOUS COUNTER VALUE
  110.                     ;'PTICCNT'=CURRENT COUNTER VALUE
  111.     SUB    AX,PTICCNT        ;(AX)=# TIC'S
  112.     ADD    TICCNT,AX        ;ADD # TIC'S TO 32 BIT TIC COUNTER
  113.     ADC    TICCNT+2,0
  114.  
  115.     MOV    AL,NOT TIMERS0        ;CLEAR INTERRUPT
  116.     OUT    ZTSTAT,AL
  117.     JMPS    TIMINTX
  118.  
  119. ;*    HANDLE TIMER 2 INTERRUPTS
  120.  
  121. TIM2INT:
  122.     MOV    TIMEFLG,1        ;SET FLAG
  123.     MOV    AL,NOT TIMERS2        ;CLEAR INTERRUPT
  124.     OUT    ZTSTAT,AL
  125.     JMPS    TIMINTX
  126.  
  127.  
  128.  
  129.  
  130. ;**    DELAY ROUTINES USING TIMER 2
  131. ;
  132. ;    MAXIMUM DELAY IS 65536*4 uS (~262 mS)
  133. ;
  134. ;    COUNTER VALUE FOR N mS = N*250
  135. ;    COUNTER VALUE FOR N uS = (N+3)/4
  136.  
  137. ;*    WDLY - SET TIMER AND WAIT
  138. ;
  139. ;    ENTRY:    (AX)=COUNTER VALUE
  140. ;    EXIT:    NONE
  141. ;    USES:    NONE
  142. ;
  143.  
  144. WDLY:
  145.     CALL    NWDLY            ;SET TIMER
  146. WDLY1:
  147.     CMP    TIMEFLG,0        ;Q. TIME UP
  148.     JE    WDLY1            ; BR IF NOT
  149.     RET
  150.  
  151. ;*    NWDLY - SET TIMER RUNNING AND DO NOT WAIT
  152. ;
  153. ;    ENTRY:    (AX)=COUNTER VALUE
  154. ;    EXIT:    NONE
  155. ;    USES:    NONE
  156. ;
  157.  
  158. NWDLY:
  159.     PUSH    AX
  160.  
  161.     MOV    AL,PITSC2+PITRLW+PITMITC
  162.     OUT    ZTIMER+PITCW,AL        ;SET MODE (ALSO STOPS TIMER 2)
  163.  
  164.     POP    AX
  165.  
  166.     PUSHF                ;DISABLE INTERRUPTS
  167.     CLI
  168.  
  169.     MOV    TIMEFLG,0        ;CLEAR TIMER 2 FLAG
  170.  
  171.     OUT    ZTIMER+PITC2,AL        ;INSERT TIMER COUNTER VALUE
  172.     XCHG    AL,AH
  173.     OUT    ZTIMER+PITC2,AL
  174.     XCHG    AL,AH
  175.  
  176.     POPF                ;RESTORE INTERRUPT STATUS
  177.  
  178.     RET
  179.  
  180.