;
;  TO RUN THE ONE SECOND INTERRUPT A LINK IS NEEDED
;  ON THE SYSTEM SUPPORT BOARD.
;       BACKGROUND:-
;       WHEN THE FOLLOWING STATES ARE PRESENTED TO THE
;       'OKI CLOCK CHIP',
;        HOLD='0'
;        READ='1'
;        CS='1'
;        A0-A3='1'
;       THEN D0 = 1024HZ (50% DUTY)
;            D1 = 1HZ   122.1 USEC
;            D2 = 1/60 HZ   "
;            D3 = 1/3600 HZ  "
;
;       THE 1 SEC PULSE IS CONNECTED TO J7 PIN 7.
;       FOR AN INTERRUPT 1.


************************************************
*                                               *
*  ROUTINE FOR INITIALISING MASTER AND SLAVE    *
*       8259A'S ON THE SYSTEM SUPPORT 1         *
*                                               *
************************************************


; THIS PROGRAM IS SET TO I/O ADDRESS BASE 50H
;  (COMPUPRO STANDARD), FOR DIFFERENT ADDRESSES
;  CHANGE "BASE" IN EQUATES.


       MACLIB  MACRO

INTJMP  EQU     200H    ;START OF INTERRUPT JUMPS
SINTJMP EQU     INTJMP+20H


BASE    EQU     50H     ;STARTING ADDR OF BOARD
MPRT0   EQU     BASE    ;LOWER MASTER PORT A0=0
MPRT1   EQU     BASE+1  ;UPPER MASTER PORT (A0=1)
SPRT0   EQU     BASE+2  ;LOWER SLAVE PORT (A0=0)
SPRT1   EQU     BASE+3  ;UPPER SLAVE PORT (A0=1)
CLKCMD  EQU     BASE+10 ;CLOCK COMMAND PORT
CLKDAT  EQU     BASE+11 ;CLOCK DATA PORT
SURTD   EQU     BASE+12 ;SS UART DATA PORT
SURTS   EQU     BASE+13 ;SS UART STATUS PORT
SURTM   EQU     BASE+14 ;UART MODE PORT
SURTC   EQU     BASE+15 ;UART COMMAND PORT

CLKDATA EQU     BASE+11 ;CLOCK DATA PORT



       ORG     100H

; THIS ROUTINE INITIALISES THE MASTER 8259A

INIT:
       DI              ;DISABLE INTERRUPTS
       MVI     A,(INTJMP AND 0E0H) OR 00011101B        ;ICW1
       OUT     MPRT0   ;SEND IT
       MVI     A,HIGH INTJMP   ;UPPER BYTE OF ADDR INTERVAL
       OUT     MPRT1   ;SEND IT
       MVI     A,10000000B     ;IR7 HAS A SLAVE
       OUT     MPRT1   ;SEND IT
       MVI     A,00010000B     ;ICW4
       OUT     MPRT1   ;SEND IT
       MVI     A,0FFH  ;CLEAR ALL MASK BITS (OCW1)
       OUT     MPRT1   ;SEND IT
       MVI     A,10100000B     ;ROTATE ON NON-SPEC EOI
       OUT     MPRT0   ;SEND IT
       MVI     A,00001000B     ;OCW3
       OUT     MPRT0   ;SEND IT


;  THIS ROUTINE INITIALISES THE SLAVE 8259A


       MVI     A,(SINTJMP AND 0E0H) OR 00011101B       ;ICW1
       OUT     SPRT0   ;SEND IT
       MVI     A,HIGH SINTJMP  ;UPPER BYTE OF ADDR INTERVAL
       OUT     SPRT1   ;SEND IT
       MVI     A,07H   ;IR7 HAS A SLAVE
       OUT     SPRT1   ;SEND IT
       MVI     A,00010000B     ;ICW4
       OUT     SPRT1   ;SEND IT
       MVI     A,0FFH  ;CLEAR ALL MASK BITS (OCW1)
       OUT     SPRT1   ;SEND IT
       MVI     A,10100000B     ;ROTATE ON NON-SPEC EOI
       OUT     SPRT0   ;SEND IT
       MVI     A,00001000B     ;OCW3
       OUT     SPRT0   ;SEND IT


;       SET UP OKI RTC FOR 1 SEC INTERRUPT
;         SET A0 - A3 = 1 (ADDRESS 15)
;         SET READ    = 1
;         SET WRITE   = 0
;         SET HOLD    = 0
;        BY OUTPUTING 1FH TO CLKCMD PORT


       MVI     A,1FH   ;SET FOR TIME INTERRUPTS
       OUT     CLKCMD  ;AND OUTPUT

;       ENABLE INT15 ONLY

       MVI     A,07DH  ;ENABLE INT15 ONLY
       OUT     MPRT1
       MVI     A,07FH
       OUT     SPRT1
       EI              ;ENABLE
LOOP    JMP     LOOP    ;LOOP FOREVER


************************************************
*  STANDARD CONFIGURATION OF INTERRUPTS *
*   ON THE SYSTEM SUPPORT 1 BOARD               *
*                                               *
************************************************


;  MASTER CONTROLLER :-
; INTERRUPT             NO. SOURCE      OPTION
;       IRQ0            VI0             RINT
;       IRQ1            VI1             TINT
;       IRQ2            VI2             TIMER0
;       IRQ3            VI3             TIMER1
;       IRQ4            VI4             TIMER2
;       IRQ5            VI5             SVRQ(9511)
;       IRQ6            VI6             END(9511)
;       IRQ7            VI7             INT(SLAVE)


;  SLAVE CONTROLLER
; INTERRUPT     STANDARD SOURCE         OPTION
;       IRQ0            VI7
;       IRQ1            TIMER0
;       IRQ2            TIMER1
;       IRQ3            TIMER2
;       IRQ4            SVRQ(9511)
;       IRQ5            END(9511)
;       IRQ6            TINT
;       IRQ7            RINT

;FOR THE INTERFACER 2 BOARD THE STANDARD INTERRUPTS
;

;       VI0             INT J0 (PARALLEL CH 0)
;       VI1             INT J2 (PARALLEL CH 1)
;       VI2             INT J3 (PARALLEL (CH 2)
;       VI3             N.C.
;       VI4             TMRI (TIMER INTERRUPT)
;       VI5             N.C.
;       VI6             TXINT
;       VI7             RXINT


;       DISK 1 INTERRUPT OPTIONS
;         THE INTERRUPT ON THE DISK CONTROLLER
;         CAN BE STRAPPED TO VI0 TO VI7
;         NORMALLY VI0 (THE HIGHEST PRIORITY
;         WOULD BE USED.


       ORG     INTJMP

************************************************
*                                               *
*       INTERRUPT JUMP BLOCK                    *
*                                               *
************************************************

INT0    JMP     INT0
       NOP

;       1 SEC INTERRUPT FROM RTC

INT1    DI              ;DISABLE INTERRUPTS
       JMP     ONESEC  ;EXEC ONE SECOND INTERRUPT
INT2    JMP     INT2
       NOP
INT3    JMP     INT3
       NOP
INT4    JMP     INT4
       NOP
INT5    JMP     INT5
       NOP
INT6    JMP     INT6
       NOP
INT7    JMP     INT7
       NOP
INT8    JMP     INT8
       NOP


;       TIMER 0 INTERRUPT

INT9    JMP     INT9
       NOP

;       TIMER 1 INTERRUPT

INT10   JMP     INT10
       NOP

;       TIMER 2 INTERRUPT

INT11   JMP     INT11
       NOP

;       APU (9511) SVRQ INTERRUPT

INT12   JMP     INT12
       NOP

;       APU (9511) END INTERRUPT

INT13   JMP     INT13
       NOP

;       SYSTEM SUPPORT TINT INTERRUPT

INT14:
       DI
       JMP     STINT   ;UART TX INTERRUPT

;       SYSTEM SUPPORT RINT INTERRUPT

INT15:
       DI
       JMP     SRINT


;       ONESEC INTERRUPT ROUTINE

ONESEC:
       SAVE            ;SAVE B,D,AND H
       PUSH    PSW     ;AND PSW
       PRINT   <'ONE SECOND INTERRUPT ',CR,LF>
       MVI     A,61H   ;SET SEOI
       OUT     MPRT0   ;AND SEND
       POP     PSW     ;RESTORE PSW
       RESTORE         ;RESTORE B,D,AND H
       EI              ;ENABLE INTERRUPTS
       RET



************************************************
*                                               *
*       SYSTEM SUPPORT 1 UART I/P               *
*       INTERRUPT ROUTINE                       *
*                                               *
************************************************

;       THIS ROUTINE CHECKS THE UART FOR DATA
;       READY, PRINT AN ERROR MESSAGE IF NOT
;       AVAILABLE. THEN TESTS TO SEE IF THE BUFFER
;       IS FULL, AGAIN OUTPUTS AN ERROR MESSAGE IF
;       FULL, AND THEN BUMPS THE COUNT,AND POINTER
;       BEFORE SENDING THE SEOI'S AND RESTORING THE
;       REGISTERS, ENABLING INTERRUPTS.

SSDAV   EQU     00000001B       ;SYSTEM SUPPORT DATA AVAIL

SRINT:
       SAVE            ;PUSH B,D,H
       PUSH    PSW     ;AND PSW
       IN      SURTS   ;GET STATUS FROM UART
       ANI     SSDAV   ;MASK DATA AVAIL.
       JZ      RINTE   ;EXIT IF NOT READY
       IN      SURTD   ;GET THE DATA
       ANI     7FH     ;MASK PARITY
       MOV     C,A     ;SAVE CHAR
       LDA     SIBUFC  ;GET COUNT IN BUFFER
       CPI     SIBUFL  ;AND SEE IF FULL
       JZ      SIFUL   ;BRIF FULL
       LHLD    SIBUFP  ;GET POINTER
       MOV     M,C     ;AND STORE
       INX     H       ;AND INDEX
       SHLD    SIBUFP  ;AND SAVE
       INR     A       ;THEN INDEX NO OF CHAR
       STA     SIBUFC  ;AND SAVE
SRINTEX:

;       SEND SPECIFIC END OF INTERRUPT TO
;       BOTH MASTER AND SLAVE CONTROLLERS.

       MVI     A,67H   ;LOAD SEOI FOR MASTER
       OUT     MPRT0   ;SEND IT
       MVI     A,67H   ;LOAD SEOI FOR SLAVE
       OUT     SPRT0   ;AND SEND IT


       POP     PSW     ;RESTORE ALL REGISTERS
       RESTORE
       EI              ;ENABLE INTERRUPTS
       RET

RINTE:
       PRINT   <'SS UART INPUT ERROR',CR,LF>
       CALL    SERROR  ;RESET USART ERRORS
       JMP     SRINTEX ;AND EXIT

SIFUL:
       PRINT   <'SS UART INPUT BUFFER FULL',CR,LF>
       JMP     SRINTEX ;AND EXIT


;
;       THIS ROUTINE PERFORMS THE INITIALISATION
;       REQUIRED BY THE SYSTEM SUPPORT USART.
;
STINIT:
       MVI     A,11101110B     ;ASYNC,8BITS,EV,2STOP
       OUT     SURTM   ;SET UP MODE REG. 1
       MVI     A,01111110B     ;9600 BAUD
       OUT     SURTM   ;SET UP MODE REG. 2
       MVI     A,00100111B     ;TX ON,DTR LOW,REC ON,
                       ;NO BREAK,NO RESET,RTS LOW
       OUT     SURTC   ;SET UP COMMAND PORT
       RET



;       SERROR - ROUTINE TO RESET ERROR FLAGS
;               ON THE SYSTEM SOPPORT UART.
;

SERROR:
       MVI     A,00010000B     ;RESET UART
       OUT     SURTC   ;TO COMMAND REG.
       MVI     A,00100111B     ;RESUME
       OUT     SURTC
       RET



************************************************
*                                               *
*       SYSTEM SUPPORT 1 UART O/P               *
*       INTERRUPT ROUTINE                       *
*                                               *
************************************************


STINT:
       SAVE    ;PUSH B,D,H
       PUSH    PSW





















SIBUFC  DB      0H      ;SS UART CHAR COUNT
SIBUFP  DW      $+2     ;SS UART BUFFER POINTER
SIBUF   DS      125     ;SI BUFFER
SIBUFL  EQU     $-SIBUF ;LENGTH OF SIBUFFER



       END