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
�����������������������������������������������������������������������������������������