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 >
Wrap
Text File
|
2000-06-30
|
3KB
|
180 lines
;*** TIMER DRIVER
;
;** INITIALIZATION
;
INTIM:
PUSHF
CLI
; MAKE SURE ALL COUNTER READ CYCLES ARE COMPLETED
IN AL,ZTIMER+PITC0
IN AL,ZTIMER+PITC0
IN AL,ZTIMER+PITC1
IN AL,ZTIMER+PITC1
IN AL,ZTIMER+PITC2
IN AL,ZTIMER+PITC2
; INIT COUNTER MODES
MOV AL,PITSC0+PITRLW+PITMSW
OUT ZTIMER+PITCW,AL ;COUNTER 0 - SQUARE WAVE GENERATOR
MOV AL,PITSC1+PITRLW+PITMITC
OUT ZTIMER+PITCW,AL ;COUNTER 1 - EVENT COUNTER
MOV AL,PITSC2+PITRLW+PITMITC
OUT ZTIMER+PITCW,AL ;COUNTER 2 - INT ON TERMINAL COUNT
; INIT COUNTER VALUES
XOR AL,AL ;TIMER 1
OUT ZTIMER+PITC1,AL
OUT ZTIMER+PITC1,AL
MOV AX,TIMEVAL ;TIMER 0
OUT ZTIMER+PITC0,AL
MOV AL,AH
OUT ZTIMER+PITC0,AL
; WAIT FOR FIRST RISING CLOCK FROM COUNTER 0
MOV AL,NOT TIMERS0
OUT ZTSTAT,AL
XOR CX,CX
INTIM1:
IN AL,ZTSTAT
TEST AL,TIMERS0
LOOPZ INTIM1
JCXZ TIMERR
; CLEAR ANY PENDING INTERRUPTS
MOV AL,NOT (TIMERS0+TIMERS2)
OUT ZTSTAT,AL
; INIT WORK VARIABLES
MOV TIMEFLG,0
MOV PTICCNT,0
MOV TICCNT,0
MOV TICCNT+2,0
POPF
RET
;* TIMER NOT RUNNING
TIMERR:
LEA SI,TIMERRM
CALL PMSG
HLT
;** TIMER INTERRUPT HANDLER
;
INTTIM:
PUSHA ;SAVE ALL REGS
MOV AX,CS ;GET DS VALUE
MOV DS,AX
MOV ES,BANK1 ;GET ES VALUE
; CHECK CAUSE OF INTERRUPT
IN AL,ZTSTAT ;GET CAUSE OF TIMER INTERRUPT
TEST AL,TIMERS0 ;Q. IS IT TIMER 0
JNZ TIM0INT ; BR IF YES
TEST AL,TIMERS2 ;Q. IS IT TIMER 2
JNZ TIM2INT ; BR IF YES
;* TIMER INTERRUPT HANDLER EXIT
TIMINTX:
POPA
JMP INTX2
;* HANDLE TIMER 0 INTERRUPTS
TIM0INT:
MOV AL,PITSC1+PITRLCL
OUT ZTIMER+PITCW,AL ;LATCH COUNTER 1 VALUE
IN AL,ZTIMER+PITC1 ;GET COUNTER 1 VALUE
MOV AH,AL
IN AL,ZTIMER+PITC1
XCHG AH,AL
XCHG PTICCNT,AX ;(AX)=PREVIOUS COUNTER VALUE
;'PTICCNT'=CURRENT COUNTER VALUE
SUB AX,PTICCNT ;(AX)=# TIC'S
ADD TICCNT,AX ;ADD # TIC'S TO 32 BIT TIC COUNTER
ADC TICCNT+2,0
MOV AL,NOT TIMERS0 ;CLEAR INTERRUPT
OUT ZTSTAT,AL
JMPS TIMINTX
;* HANDLE TIMER 2 INTERRUPTS
TIM2INT:
MOV TIMEFLG,1 ;SET FLAG
MOV AL,NOT TIMERS2 ;CLEAR INTERRUPT
OUT ZTSTAT,AL
JMPS TIMINTX
;** DELAY ROUTINES USING TIMER 2
;
; MAXIMUM DELAY IS 65536*4 uS (~262 mS)
;
; COUNTER VALUE FOR N mS = N*250
; COUNTER VALUE FOR N uS = (N+3)/4
;* WDLY - SET TIMER AND WAIT
;
; ENTRY: (AX)=COUNTER VALUE
; EXIT: NONE
; USES: NONE
;
WDLY:
CALL NWDLY ;SET TIMER
WDLY1:
CMP TIMEFLG,0 ;Q. TIME UP
JE WDLY1 ; BR IF NOT
RET
;* NWDLY - SET TIMER RUNNING AND DO NOT WAIT
;
; ENTRY: (AX)=COUNTER VALUE
; EXIT: NONE
; USES: NONE
;
NWDLY:
PUSH AX
MOV AL,PITSC2+PITRLW+PITMITC
OUT ZTIMER+PITCW,AL ;SET MODE (ALSO STOPS TIMER 2)
POP AX
PUSHF ;DISABLE INTERRUPTS
CLI
MOV TIMEFLG,0 ;CLEAR TIMER 2 FLAG
OUT ZTIMER+PITC2,AL ;INSERT TIMER COUNTER VALUE
XCHG AL,AH
OUT ZTIMER+PITC2,AL
XCHG AL,AH
POPF ;RESTORE INTERRUPT STATUS
RET