mirror of https://github.com/microsoft/MS-DOS.git
102 lines
3.1 KiB
NASM
102 lines
3.1 KiB
NASM
|
TITLE CLOCK - Enable/disable clock interrupts
|
|||
|
|
|||
|
; "CLOCK" module for MS-DOS profile program. This implements the
|
|||
|
; PROFIL program on the Seattle Computer Products 8086 system
|
|||
|
|
|||
|
INTSEG SEGMENT AT 0
|
|||
|
ORG 60H+7*4
|
|||
|
INTVECTOR LABEL WORD
|
|||
|
INTSEG ENDS
|
|||
|
|
|||
|
CODE SEGMENT BYTE PUBLIC
|
|||
|
|
|||
|
PUBLIC CLOCKON,CLOCKOFF,LEAVE_INT
|
|||
|
|
|||
|
EXTRN CLK_INTER:NEAR
|
|||
|
|
|||
|
ASSUME CS:CODE, DS:CODE, ES:CODE
|
|||
|
|
|||
|
BASE= 0F0H
|
|||
|
STCSTAT= BASE+5
|
|||
|
STCDATA= BASE+4
|
|||
|
STCCOMND= BASE+5
|
|||
|
SLAVECOM= BASE+2
|
|||
|
MASTCOM= BASE+0
|
|||
|
SLAVEMASK= BASE+3
|
|||
|
|
|||
|
;The following mode selects F2 as counter source (400 KHz), reload from
|
|||
|
;load, count up once in binary with TC toggle.
|
|||
|
MODE= 0C02H
|
|||
|
|
|||
|
;************************************************
|
|||
|
;Enable clock and start generating clock interrupt.
|
|||
|
; Clock interval in micro seconds passed in DX
|
|||
|
CLOCKON PROC NEAR
|
|||
|
MOV AL,4 ;Set pointer to mode register 4
|
|||
|
OUT STCCOMND,AL
|
|||
|
MOV AL,MODE AND 0FFH ;Low byte of mode
|
|||
|
OUT STCDATA,AL
|
|||
|
MOV AL,MODE/100H ;High byte of mode
|
|||
|
OUT STCDATA,AL
|
|||
|
MOV AL,0CH ;Counter 4 load register
|
|||
|
OUT STCCOMND,AL
|
|||
|
XCHG AX,DX ;Count in microseconds
|
|||
|
XOR DX,DX
|
|||
|
SHL AX,1
|
|||
|
RCL DX,1 ;Count in DX:AX times 2
|
|||
|
MOV BX,5
|
|||
|
DIV BX ;AX=Count/2.5
|
|||
|
OUT STCDATA,AL
|
|||
|
MOV AL,AH
|
|||
|
OUT STCDATA,AL ;Set the load register
|
|||
|
MOV AL,0E4H ;Clear output 4
|
|||
|
OUT STCCOMND,AL
|
|||
|
|
|||
|
ASSUME DS:INTSEG
|
|||
|
|
|||
|
PUSH DS
|
|||
|
XOR AX,AX
|
|||
|
MOV DS,AX
|
|||
|
;Set the clock interrupt
|
|||
|
MOV INTVECTOR,OFFSET CLK_INTER
|
|||
|
MOV INTVECTOR+2,CS
|
|||
|
POP DS
|
|||
|
|
|||
|
ASSUME DS:CODE
|
|||
|
|
|||
|
IN AL,SLAVEMASK
|
|||
|
AND AL,7FH ;Enable counter 4 interrupt
|
|||
|
OUT SLAVEMASK,AL
|
|||
|
MOV AL,68H ;Load and arm counter 4
|
|||
|
OUT STCCOMND,AL ;Let her rip!
|
|||
|
RET
|
|||
|
CLOCKON ENDP
|
|||
|
|
|||
|
;************************************************
|
|||
|
;Disable clock and clock interrupt
|
|||
|
CLOCKOFF PROC NEAR
|
|||
|
IN AL,SLAVEMASK
|
|||
|
OR AL,80H ;Turn off counter 4 interrupt
|
|||
|
OUT SLAVEMASK,AL
|
|||
|
RET
|
|||
|
CLOCKOFF ENDP
|
|||
|
|
|||
|
|
|||
|
;************************************************
|
|||
|
;This routine is jumped to from the CLK_INTER
|
|||
|
; routine to perform and steps to reset the interrupt
|
|||
|
LEAVE_INT:
|
|||
|
PUSH AX
|
|||
|
MOV AL,0E4H ;Clear output 4
|
|||
|
OUT STCCOMND,AL
|
|||
|
MOV AL,20H ;End-of-interrupt command
|
|||
|
OUT SLAVECOM,AL
|
|||
|
OUT MASTCOM,AL
|
|||
|
MOV AL,68H ;Load and arm counter 4
|
|||
|
OUT STCCOMND,AL
|
|||
|
POP AX
|
|||
|
IRET
|
|||
|
|
|||
|
CODE ENDS
|
|||
|
END
|
|||
|
|