#TITLE "Real-Time-Clock driver for the NEC-APC" #SUBTTL "Copyright (C) Multi-Micro Computer Corp." ; ; RTCAPC.A ; Written by: John E. Lauber ; ; Version: 8/12/84 ; ; Edit History: ; 8/12/84 jl - Module created. ; MODULE "RTCAPC" ; #INCLUDE "DREQUATE" ; common driver equivalences #INCLUDE "APCEQU" ; common APC equivalences ; ; Some local equates. ; RTCIREQ == 3 ; Interrupt request level RTCCNT == 49152 ; interval count value TICSEC == 50 ; number of ticks per second ; LOC Data# ; locate in data segment ; TICCNT: BYTE 0 ; tick counter ; LOC Code# ; locate in code segment ; RTCNIT:: MOV AL,=0X30 ; mode 0, intrp on count end OUT IT_MODE,AL ; set counter channel MOV AL,=1<<2 ; get timer intrp reset bit OUT CRT_IRST,AL ; clear possible interrupt MOV DX,=IT_CNT0 ; get counter port MOV AX,=RTCCNT ; get count value OUT DX,AL ; send LSB first MOV AL,AH OUT DX,AL ; and MSB second ; MOV AL,=RTCIREQ ; get interrupt request level MOV DX,&RTCISR ; get interrupt service address JMP INTENA# ; enable interrupt controller and exit ; ; RTC interrupt service routine. ; RTCISR: PUSH AX PUSH BX PUSH CX PUSH DX PUSH DS ; save environment CALL GETSDS# ; get system data segment ; MOV AL,=1<<2 ; get timer intrp reset bit OUT CRT_IRST,AL ; and clear condition MOV DX,=IT_CNT0 ; get counter port MOV AX,=RTCCNT ; get count value OUT DX,AL ; send LSB first MOV AL,AH OUT DX,AL ; and MSB second ; INC TICCNT ; bump tick counter CMP TICCNT,=TICSEC ; second reached JB __NOT1S ; if not, continue MOV TICCNT,=0 ; reset tick counter CALL RTCSEC# ; call for one second count __NOT1S: CALL DLYTIC# ; call for tick service CALL KBDREP# ; call for keyboard repeat check CALL CSRCHK# ; call for cursor enable check ; MOV AL,=RTCIREQ ; get RTC interrupt request level CALL SIGEOI# ; and signal end-of-interrupt POP DS POP DX POP CX POP BX POP AX ; restore environment JMP ISRXIT# ; exit interrupt service routine ; END