ASMB,Q,C
* 
*    >>>>>>>>>>>>>>>>> MULTIPLEXER PRE-DRIVER <<<<<<<<<<<<<<<<<<<<< 
* 
*   SOURCE:  12792-18001  &PVM00
*   RELOC :  12792-16001  %PVM00
*   PRGMR :  GDD
* 
***************************************************************** 
* (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS        * 
* RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,         * 
* REPRODUCED OR TRANSALATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * 
* THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.         * 
***************************************************************** 
* 
      NAM PVM00,0 12792-16001 REV.2032 800605 V.03  
      EXT $CIC,$YCIC
      ENT PM00
* 
*   THIS PRE-DRIVER IS TO BE USED TO INTERFACE THE 8 CHANNEL ASYNC
*   MULTIPLEXER CARD TO RTE'S INTERRUPT SYSTEM.  SINCE RTE EXPECTS
*   EACH I/O CARD TO HAVE A UNIQUE EQT ASSOCIATED WITH IT, A MULTIPLE 
*   EQT CARD SUCH AS THE MUX WILL NOT WORK.  (CIC HAS NO WAY OF KNOWING 
*   WHICH EQT TO SET UP BEFORE CALLING THE DRIVER.)  THIS MODULE SOLVES 
*   BY PATCHING THE INTERRUPT TABLE FOR THE CORRECT EQT BEFORE RTE
*   LOOKS AT IT.  THE MODULE OPERATES AS FOLLOWS: 
* 
* 1.  EVERY CARD INTERRUPT IS DIRECTED TO THIS MODULE INSTEAD OF $CIC.
*     ON FIRST ENTRY, THE DRIVER SETS UP A LINK FROM THE TRAP CELL TO 
*     THIS MODULE, AND SAVES THE ADDRESS OF THE PROGRAM ID SEGMENT TO 
*     SCHEDULE (FROM THE INTERRUPT TABLE), IF PRESENT, IN THE EQT.
*     THE REST OF THE EQT IS INITIALIZED, ALONG WITH ALL OTHER EQT'S
*     USING THIS CARD.
* 
* 2.  ON ENTRY THE PRE-DRIVER TURNS OFF INTERRUPTS AND SAVES THE STATE
*     OF THE MACHINE.  IF THE SYSTEM BEING RUN UNDER IS PRIVILEGED, THE 
*     DMA CHANNELS ARE DISABLED, THE PI CARD IS SET, AND THE INTERRUPT
*     SYSTEM IS RESTORED. 
* 
* 3.  THE SELECT CODE OF THE CARD INTERRUPTING IS READ (LIA 4) AND
*     SAVED, THE CARD'S ENTRY IN THE INTERRUPT TABLE IS FETCHED.
* 
* 4.  THE VALUE OF THE INTERRUPT TABLE ENTRY IS USED TO INDICATE THE
*     EQT POSSIBLY USING THE CARD.  BIT 15 OF EQT WORD 11 IS SET IF IT
*     IS, RESET IF NOT.  IF THE BIT IS SET, THE VALUE IN THE INTERRUPT
*     TABLE ALREADY POINTS TO THE CORRECT EQT TO BE SET UP. 
*     THIS IS THE NORMAL WAY CIC WORKS, AND NO ACTION IS NEEDED.
*     A ZERO VALUE MEANS THAT THE INTERRUPT IS UNSOLICITED, AND BITS
*     0-7 OF THE WORD PLACED IN THE BACKPLANE LATCH HAVE BEEN SET TO
*     THE EQT# OF THE CHANNEL GENERATING THE INTERRUPT.  THE EQT# WAS 
*     PASSED TO THE CARD WHEN THE CHANNEL WAS INITIALIZED, AND IS USED
*     TO PATCH THE INTERRUPT TABLE WITH THE CORRECT EQT ADDRESS BEFORE
*     ENTERING CIC. 
* 
* 5. THE SUSPEND POINT OF THE PROGRAM RUNNING WHEN THE INTERRUPT OCCURRED 
*    IS MOVED TO $CIC.  THE A REGISTER IS SET TO THE SELECT CODE OF THE 
*    CARD AND THE SYSTEM ENTERED AT $YCIC.
* 
*   SYSTEM EQUATES
* 
A     EQU 0 
B     EQU 1 
EQTA  EQU 1650B 
INTBA EQU 1654B 
MPTFL EQU 1770B 
XA    EQU 1731B 
XB    EQU 1732B 
XEO   EQU 1733B 
DUMMY EQU 1737B     SC OF PRIV CARD IF PRIV SYSTEM
* 
PM00  NOP 
      CLF 0         TURN INTS OFF!
      STA XA,I      SAVE REGISTERS
      STB XB,I
      ERA,ALS       SAVE E/O
      SOC 
      INA 
      STA XEO,I 
      LIA 4         GET CARD'S SELECT CODE
      STA SCODE     ..SAVE
      ISZ MPTFL     INDICATE MP IS OFF
PATCH JMP SETUP     IF FIRST CALL GO CHECK FOR PRIV SYS.  NOP'D AFTER CALL
SWTCH JMP NOTP      STC DUMMY IF PRIV SYS 
      CLC 6         KILL DMA INTS 
      CLC 7 
      STF 0         TURN ON INTS
NOTP  LDA SCODE     CREATE CLF INST 
      IOR #CLF
      STA *+1 
      NOP           CLF SC
      LDB SCODE 
      ADB INTBA     FIND INTERRUPT TABLE ENTRY
      ADB DM6 
      LDA B,I       FETCH.. 
      ADA #PSW      BUMP TO PORT STATUS WORD IN EQT 
      LDA A,I       FETCH.. 
      SSA           IF BUSY BIT NOT SET, SKIP TO UNSOLICITED PROCESSING 
      JMP EXIT      BIT SET, INT WAS SOLICITED, EXIT
* 
      LDA SCODE     UNSOLICITED INTERRUPT: FETCH CARD DATA
      IOR #LIA      MAKE LIA SC 
      STA *+1 
      NOP 
      AND B377      MASK TO GET PORT KEY (EQT#-1) 
      STA TMP 
      ALF           PORT KEY * 16 
      CMA,INA 
      ADA TMP 
      CMA,INA       PORT KEY * 15 
      ADA EQTA      ADD ON EQT TABLE BASE = ADDR OF THIS GUY'S EQT
      STA TMP       SAVE FOR LATER
* 
      ADA B3        BUMP POINTER TO EQT WORD 4..
      LDA A,I       ..TO VERIFY VALID MUX EQT 
      AND B77       GET SELECT CODE 
      CPA SCODE     OK? 
      JMP SCOK      YES 
      JMP EXIT      NO, LEAVE INTERRUPT TABLE AS IS..DRIVER SHOULD HANDLE IT
* 
SCOK  LDA TMP       NEW EQT ADDRESS...
      STA B,I       PATCH INT TBL FOR CIC 
* 
EXIT  LDA PM00      MOVE PGM SUSPEND POINT..
      STA $CIC      ..WHERE RTE CAN FIND IT 
      CLA 
      CLF 0         LIGHTS OUT! 
      STA MPTFL     CLEAR SO THAT CIC WON'T SET TO 2
      LDA SCODE     SET CARD SC FOR RTE 
      JMP *+1,I     ENTER SYSTEM
      DEF $YCIC+0 
* 
SETUP LDA DUMMY     FIRST CALL: CHECK FOR PRIVILEGED SYSTEM 
      SZA,RSS       
      JMP SWTC1     NOT PRIV
      IOR #STC      PRIV: MAKE STC DUMMY
      STA SWTCH     TO SET P.I. CARD BEFORE RE-ENABLING INTS
SWTC1 CLA           NOP JUMP TO THIS ROUTINE
      STA PATCH     ..SINCE WE DON'T NEED TO DO IT AGAIN
      JMP SWTCH     RETURN TO MAIN LINE CODE
* 
*   PRE-DRIVER TEMPORARIES
* 
TMP   NOP 
SCODE NOP 
* 
*   CONSTANTS 
* 
#LIA  LIA 0 
#CLF  CLF 0 
#STC  STC 0 
#PSW  DEC 10        OFSET TO PSW IN EQT FROM EQT1 
B377  OCT 377 
DM6   DEC -6
B3    OCT 3 
B77   OCT 77
* 
      END 
END$
                                                                                                                                                                                                                              