ASMB,R,N,L,C
* 
*     USE ASSEMBLY OPTION 'N' 
* 
*     NAME  : $MIO1 
*     SOURCE: 92064-18003 
*     RELOC:  PART OF 92064-16001 
*     PROGMR: E.J.W.  BASED ON RTE-III VERSIONS G.A.A.,L.W.A.,D.L.S.
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  ALL RIGHTS      * 
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       * 
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * 
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.        * 
*  **************************************************************** 
* 
* 
      NAM $MIO1  92064-16001  REV.1901  780721
* 
      ENT $CIC,$XSIO,$SYMG,$IORQ,$IOUP,$IODN
      ENT $ETEQ,$IRT,$XCIC,$DEVT,$EQCK
      ENT $UPIO,$CVEQ,$YCIC 
      ENT $BLLO,$BLUP,$OPSY 
      ENT $CLCH,$DLFL 
      ENT $BITB,$DMEQ,$UNLK,$XXUP,$DLAY,$CKLO 
* 
      EXT $RQST,$CLCK,$XEQ,$TYPE,$LIST,$ALC,$RTN
      EXT $SCD3,$ERMG 
      EXT $CVT1,$REIO,$ABRT,$INER,$ZZZZ 
      EXT $ERAB,$CVT3,$QCHK,$MIC
*M1      EXT $RNTB,$S.CL,$I.CL,$C.CL
      EXT .MVW
* 
      MIC SVR,105360B,2     SAVE REGISTERS
      MIC RSR,105361B,2     RESTORE REGISTERS 
      MIC STR,105363B,1     SEQUENTIAL STORE VALUE
      MIC INT,105364B,1     INTERRUPT TABLE SEARCH
      MIC LNK,105365B,2     I/O REQUEST LINK
* 
* 
      ORB 
$BLLO DEC -100
$BLUP DEC -300
      ORR 
      SPC 1 
* 
*  MODULE  OF THE  R E A L - T I M E  E X E C U T I V E 
* 
* 
*  THIS INCLUDES THE FOLLOWING MAJOR SECTIONS:
* 
*    1)  CENTRAL  INTERRUPT  CONTROL
* 
*    2)  INPUT  /  OUTPUT  CONTROL
*         - I/O REQUEST PROCESSING
*         - I/O COMPLETION PROCESSING 
*         - GENERAL I/O ERROR PROCESSING
* 
*    3)  SYSTEM ERROR DIAGNOSTIC PRINT ROUITNE
* 
*    4)  PROCESSOR FOR OPERATOR I/O STATEMENTS
* 
      HED <  CENTRAL  INTERRUPT  CONTROL  > 
* 
*** C E N T R A L   I N T E R R U P T   C O N T R O L  ***
* 
*   THE PROCESSING OF SYSTEM INTERRUPTS IS CONTROLLED 
*  BY DIRECTING ALL SOURCES TO THE ENTRY POINT < $CIC>. 
*  < $CIC> IS RESPONSIBLE FOR SAVING AND RESTORING
*  THE CURRENT STATE OF THE MACHINE, ANALYSING THE
*  SOURCE OF THE INTERRUPT, AND ACTIVATING THE
*  APPROPRIATE PROCESSOR. THIS ROUTINE IS TABLE-DRIVEN
*  BY THE *INTERRUPT TABLE*.
* 
*   SPECIAL PROCESSING FOR A "PRIVILEGED" CLASS OF
*  INTERRUPTS IS PROVIDED BY $CIC. THIS IS DESCRIBED
*  FULLY IN SECTION III BELOW. BRIEFLY, A SPECIAL 
*  I/O CARD CAN BE USED TO SEPARATE SPECIAL INTERRUPTS
*  FROM NORMAL SYSTEM CONTROLLED INTERRUPTS. THE
*  PRESENCE AND LOCATION OF THE SPECIAL CARD IS 
*  NOTED AT SYSTEM CONFIGURATION TIME. IF IT IS 
*  PRESENT, THE EXEC OPERATIONS ARE NOT PERFORMED 
*  WITH THE INTERRUPT SYSTEM DISABLED BUT RATHER
*  WITH THE CONTROL SET ON THE SPECIAL CARD TO
*  HOLD OFF SYSTEM I/O INTERRUPTS.
* 
* I. INTERRUPT TABLE (INTBL)
* 
*     A TABLE, ORDERED BY HARDWARE INTERRUPT PRIORITY,
*    DESIGNATES THE ASSOCIATED SOFTWARE PROCESSOR AND 
*    THE PROCEDURE FOR INITIATING THE PROCESSOR. THIS 
*    TABLE IS CONSTRUCTED BY  *RTGEN* ON INFORMATION
*    SUPPLIED BY THE USER IN CONFIGURING THE SYSTEM.
*    THE TABLE CONSISTS OF ONE ENTRY PER INTERRUPT
*    SOURCE: EACH ENTRY CONTAINS ONLY ONE WORD. THE 
*    CONTENTS OF EACH VALID ENTRY IS THE IDENTIFIER 
*    OF THE PROCESSOR. SYSTEM PROCESSORS ARE NOTED
*    BY POSITIVE VALUES, USER PROCESSORS BY NEGATIVE
*    VALUES:
* 
*      1. SYSTEM -  THE IDENTIFIER IS THE ADDRESS OF
*            THE EQT ENTRY IDENTIFYING THE I/O DEVICE.
* 
*      2. USER   -  THE ADDRESS OF THE PROGRAM
*            IDENTIFICATION SEGMENT IS IN 2-S COMPLEMENT
*            FORM IN THE ENTRY. 
* 
*      3. ILLEGAL  -  AN ENTRY CORRESPONDING TO AN
*            ILLEGAL INTERRUPT SOURCE CONTAINS ZERO.
* 
*     A PROCESSOR IS CALLED DIRECTLY IF IT RESPONDS 
*    TO STANDARD SYSTEM INTERRUPT (E.G., $CLCK, 
*    MEMORY PROTECT, I/O DEVICE CONTROLLED BY A 
*    SYSTEM DRIVER) OR IS SCHEDULED IN THE NORMAL 
*    PRIORITY ORDER IF IT RESPONDS TO A USER
*    CONTROLLED DEVICE OR INTERRUPT SOURCE. 
      SKP 
* II.   INTERRUPT PROCESSING
* 
*     INTERRUPT ACKNOWLEDGEMENT BY THE CPU CAUSES 
*    THE INSTRUCTION IN THE WORD CORRESPONDING
*    TO THE I/O CHANNEL ADDRESS TO BE EXECUTED. 
*    FOR ALL ACTIVE I/O CHANNELS ( PLUS LOCATIONS 
*    5-7 ) CONTROLLED BY THE SYSTEM, THE INSTRUCTION
*    SET IN EACH INTERRUPT LOCATION IS A JUMP 
*    SUBROUTINE INDIRECTLY TO < $CIC>.
* 
      SKP 
*    <$CIC> PERFORMS THE FOLLOWING: 
* 
*       1. DISABLES THE INTERRUPT SYSTEM. 
* 
*       2. SAVES ALL REGISTERS PLUS THE INTERRUPT 
*          RETURN POINT IN THE EXECUTING
*          ID SEGMENT.
* 
*       3. CLEARS THE FLAG OF THE INTERRUPT SOURCE. 
* 
*       4. SETS 'MPTFL' = 1 TO MEAN MEMORY PROTECT
*          IS OFF - FLAG FOR PRIVILEGED PROCESSORS. 
* 
*       5. CHECKS FOR SPECIAL INTERRUPT PROCESSING. 
*          IF 'DUMMY' IN BASE PAGE COMMUNICATION
*          AREA = 0, THEN LEAVE THE INTERRUPT SYSTEM
*          DISABLED AND GO TO STEP 6. 
* 
*           'DUMMY' > 0  - PRIVILEGED INTERRUPTS: 
*           -THE CONTENTS OF 'DUMMY' IS THE I/O 
*            ADDRESS OF THE CARD; THIS IS USED TO 
*            SET THE CONTROL FF ON THE CARD (FLAG 
*            IS ALREADY SET) TO HOLD OFF LOWER
*            PRIORITY INTERRUPTS (SYSTEM INTERRUPTS)
*           -CLEARS THE CONTROL FLIP-FLOP OF
*            EACH DMA CHANNEL TO PROHIBIT POSSIBLE
*            INTERRUPTS FROM OCCURRING. 
*           -ENABLE THE INTERRUPT SYSTEM. 
* 
*       6. TRANSFERS DIRECTLY TO THE INTERRUPT
*          PROCESSOR FOR SOURCES OF:
* 
*           5 - MEMORY PROTECT VIOLATION
*          (TBG) - TIME BASE GENERATOR
* 
*          FOR OTHER SOURCES, THE INTERRUPT SOURCE
*          CODE IS USED TO INDEX THE INTERRUPT TABLE. 
*          THE CONTENTS OF THE INTBL ENTRY DETERMINES 
*          THE MANNER IN INITIATING THE PROCESSOR:
* 
*         A. +, THE CONTENTS OF THE ENTRY IS
*            ASSUMED TO BE THE FWA OF AN EQT ENTRY. 
*            THE ADDRESSES OF THE 15-WORD ENTRY 
*            ARE SET IN <EQT1 - EQT15> AND CONTROL
*            TRANSFERRED DIRECTLY TO THE COMPLETION 
*            SECTION ADDRESS (WORD 3 OF EQT ENTRY). 
* 
*          B. -, THE VALUE IS SET POSITIVE AND IS 
*            SET IN A CALL TO <$LIST> IN THE
*            SCHEDULING MODULE- THE CALL IS MADE IF 
*            THE USER PROGRAM IS DORMANT- CONTROL IS
*            TRANSFERRED TO $XEQ. IF THE PROGRAM IS 
*            NOT DORMANT, IT IS NOT SCHEDULED AND THE 
*            DIAGNOSTIC "SC03 INT XXXXX" IS OUTPUT
*            TO THE SYSTEM TTY- XXXXX IS THE PROGRAM
*            NAME. CONTROL IS RETURNED TO THE INTER-
*            RUPTED SEQUENCE. 
* 
*          C. 0, ILLEGAL OR UNDEFINED INTERRUPTS ARE
*               NOT PROCESSED BUT THE DIAGNOSTIC
*               "ILL INT XX" IS OUTPUT TO THE SYSTEM
*               TTY. XX IS THE INTERRUPT CODE.
* 
*       7. I/O DRIVER RETURNS INDICATE CONTINUATION 
*         OR COMPLETION OF THE OPERATION BY THE 
*         DRIVER OR DEVICE: 
* 
*          A. RETURN AT (P+1): COMPLETION OF THE
*                              OPERATION. $CIC TRANS- 
*                              FERS DIRECTLY TO THE 
*                              IOC COMPLETION SECTION 
*                              AT  < IOCOM >. CONTROL 
*                              IS NOT RETURNED TO 
*                              < $CIC>. 
* 
*          B. RETURN AT (P+2): CONTINUATION OF THE
*                              OPERATION. $CIC RETURNS
*                              TO THE INTERRUPTED 
*                              SEQUENCE AS DESCRIBED
*                              IN STEP 8 FOLLOWING. 
* 
*       8. RESTORING INTERRUPT CONDITIONS AND RETURN
*           TO POINT OF INTERRUPTION. AN ENTRY POINT
*           CALLED '$IRT' IS PROVIDED FOR USE BY
*           OTHER MODULES OF THE R/T EXEC TO RESET
*           FLAGS AND THE DMA CHANNELS AND RETURN TO
*           THE USER PROGRAM. 
* 
*           THE CALLING SEQUENCE IS JUST: 
* 
*              - JMP $IRT          -
* 
*          $IRT PERFORMS THE FOLLOWING: 
*        1  - DISABLES THE INTERRUPT SYSTEM 
*        2  - SETS 'MPTFL' = 0 TO MEAN THAT MEMORY
*              PROTECT IS ON (ENABLED). 
*        3  - SKIP TO 6 IF NOT A PRIVILEGED SYSTEM
*        4  - ISSUES A CLC TO CLEAR THE CONTROL 
*             FF ON THE SPECIAL CARD. 
*        5  - SETS THE CONTROL FF ON EITHER DMA 
*              CHANNEL IF BIT 15 OF THE INTBL WORD
*              =1 TO MEAN IT IS ACTIVE. THIS
*              ENABLES DMA INTERRUPTS ONLY. 
*        6  - RESTORES THE REGISTERS AND
*        7  - EXECUTES THE CURRENT PROGRAM AT XSUSP.
* 
* 
* 
      SKP 
* III.  SPECIAL  (PRIVILEGED) INTERRUPTS
* 
*       THIS PROVISION ALLOWS INTERRUPTS FROM SPECIAL 
*      DEVICES TO BE RECOGNIZED WITHIN 100 MICRO SECONDS
*      AND TO BE PROCESSED BY SPECIAL, COMPLETELY 
*      INDEPENDENT ROUTINES CLASSIFIED AS SYSTEM TYPE 
*      PROGRAMS. INTERRUPTS ARE CHANNELED DIRECTLY
*      TO THE ENTRY POINT OF A ROUTINE BY A JSB INDIRECT
*      IN THE CORRESPONDING CORE LOCATION. $CIC IS
*      NOT AWARE OF THESE SPECIAL INTERRUPTS OCCURRING; 
*      IT ONLY ALLOWS THE INTERRUPT SYSTEM TO BE
*      ENABLED AND A SOFTWARE FLAG SET TO INDICATE
*      THE STATUS OF MEMORY PROTECT. THE JSB TO THE 
*      ENTRY POINT FOR A ROUTINE IS SET BY USING THE
*      "ENT,XXXXX" STATEMENT IN RTGEN WHEN CONFIGURING
*      A REAL-TIME SYSTEM.
*       THE SPECIAL PROCESSING ROUTINES CANNOT USE
*      ANY FEATURES OR REQUESTS OF THE STANDARD 
*      R/T EXEC. THESE ARE INDEPENDENT ROUTINES.
*      COMMUNICATION BETWEEN A NORMAL PROGRAM UNDER 
*      THE CONTROL OF THE R/T EXEC AND A SPECIAL
*      INTERRUPT PROCESSOR CAN BE DONE THROUGH
*      THE APPROPRIATE COMMON REGION: I.E. FLAGS OR 
*      INDICATORS CAN BE SET IN PRE-DEFINED WORDS 
*      IN COMMON TO INITIATE PROCESSING.  THE NORMAL
*      USER PROGRAM CAN BE SCHEDULED TO RUN AT A
*      PERIODIC TIME INTERVAL TO SCAN THE INDICATORS. 
*      THIS FACILITY IS PROVIDED TO ACCOMODATE HIGH-
*      SPEED PROGRAM CONTROLED DATA TRANSMISSION
*      WHICH REQUIRES QUICK RESPONSE. 
*       THE SPECIAL INTERRUPT PROCESSORS ARE
*      RESPONSIBLE FOR SAVING AND RESTORING ALL 
*      REGISTERS USED AND FOR RESTORING MEMORY
*      PROTECT TO ITS STATE BEFORE THE SPECIAL
*      INTERRUPT OCCURRED. MEMORY PROTECT IS
*      AUTOMATICALLY DISABLED AT THE OCCURRENCE 
*      OF ANY INTERRUPT. THE WORD 'MPTFL' IN THE
*      BASE PAGE COMMUNICATION AREA IS SET BY THE 
*      R/T EXEC TO INDICATE THE STATUS OF THE 
*      MEMORY PROTECT:
* 
*       'MPTFL' = 0  MEANS MEMORY PROTECT IS 'ON'.
*                    THE SPECIAL ROUTINE MUST ISSUE 
*                    A STC 5  IMMEDIATELY BEFORE
*                    RETURNING TO THE INTERRUPTED 
*                    SEQUENCE BY A  JMP -,I 
* 
*               = 1  MEANS THAT THE R/T EXEC ITSELF 
*                    WAS EXECUTING WHEN THE INTERRUPT 
*                    OCCURRED AND THAT MEMORY 
*                    PROTECT IS 'OFF'.  THE ROUTINE 
*                    MUST NOT ISSUE THE STC 5 IN
*                    THIS CASE. 
* 
*       IF  A SPECIAL INTERRUPT ROUTINE MUST EXECUTE
*      WITH THE INTERRUPT SYSTEM DISABLED, THE
*      STC 0 TO RE-ENABLE INTERRUPTS JUST PRIOR TO
*      EXITING MUST BE IN THE FOLLOWING SEQUENCE IF 
*      MEMORY PROTECT IS ALSO TO BE TURNED ON:
* 
*          - STF 0    - 
*          - STC 5    - 
*          - JMP -,I  - 
      SKP 
$CIC  NOP 
* 
CLF   CLF 0        DISABLE  INTERRUPT SYSTEM
* 
* PRESERVE CURRENT STATUS OF MACHINE
* 
      SPC 1 
      IFZ 
***** BEGIN DMS CODE ************** 
      SSM $MEU      SAVE MEU STATUS AT INTERRUPT FOR $MESS
      UJP *+2       DO ASAP TO PREVENT PFR FROM STEALING
******* END DMS CODE ************** 
      XIF 
      SPC 1 
MIC   JMP MIC1   STA XA,I  IF NO MICRO TO SAVE REGS 
      STB XB,I      SAVE REGISTERS
      ERA,ALS        A,B
      SOC            E AND
      INA            OVERFLOW 
      STA XEO,I 
MX1   JMP LIA4      CXA IF MX 
      CYB 
      DST XI,I      SAVE X AND Y
* 
LIA4  LIA 4         GET INTERRUPT CODE
      STA INTCD     SAVE INTERRUPT CODE 
      CPA .5        MP? 
      JMP ZCIC       YES, AVOID CLF.
      IOR CLF 
      STA CLFXX     CONFIGURE CLEAR FLAG
CLFXX NOP             LET PRIVILEGED I-O INTERRUPT
* 
ZCIC  EQU *         MTFL=1 IN M1, MP IS ALWAYS OFF
*M1      ISZ MPTFL     MPTFL=1 (WE'RE IN SYSTEM) MP IS OFF
SW1   JMP CIC.0     (STC DUMMY IF PRIVILEDGED OPTION) 
* 
      CLC 6         STOP DMA FROM INTERRUPTING, 
      CLC 7          SO THAT ONLY PRIVILEGED DRIVERS CAN. 
      STF 0         RE-ENABLE INTERRUPTS
* 
CIC.0 EQU * 
      LDB $CIC      SAVE P-REGISTER A POSSIBLE
      STB XSUSP,I    POINT OF SUSPENSION. 
      LDB INTCD     RESTORE INT CODE
* 
* CHECK FOR TRANSFER TO NON-I/O SYSTEM PROCESSOR
* 
      CPB .5       IF MEMORY PROTECT VIOLATION, 
      JMP $RQST     GO TO EXAMINE MP VIOLATION. 
* 
      CPB TBG      IF TIME BASE GENERATOR,
      JMP $CLCK        GO TIME PROCESSOR. 
* 
* CHECK LEGALITY OF INTERRUPT 
* 
MIC2  JMP MIC3     OR NOP IF NO MICRO 
      ADB N6        CODE - 6. 
      STB A         (SAVE FOR TABLE INDEX)
      ADB INTBA     INDEX TO PROPER ENTRY 
      CMA,CLE,SSA  - ERROR IF CODE
      ADA INTLG     LESS THAN 6 OR BEYOND 
* 
* GET PROCESSOR IDENT FROM INTERRUPT TABLE
* 
      LDA B,I       CODE. GET CONTENTS OF ENTRY 
      SEZ            SKIP IF OUT OF INTBL RANGE.
      CLE,SZA,RSS  UNDEFINED INTERRUPT
      JMP CIC.4       IF VALUE = 0, ISSUE DIAG. 
* 
* 
      LDB INTCD     REMOVE
      ERB            BIT 15 OF INTBL WORD 
      CPB .3        IF DMA CHANNEL
      RAL,CLE,ERA    INTERRUPT. 
* 
      SSA,RSS      SYSTEM PROCESSOR IS TO BE CALLED 
      JMP CIC.2     IF VALUE IS POSITIVE. 
* 
** INTERRUPT PROCESSOR IS USER ROUTINE TO BE
**  SCHEDULED FOR PRIORITY EXECUTION
* 
      CMA,INA      SET POSITIVE TO GET ID SEGMENT 
      STA B         ADDRESS, SET IN B TO <$LIST>. 
* 
CIC.3 ADA .15      CHECK STATUS OF PROGRAM. 
      LDA A,I      IF STATUS IS ZERO (DORMANT), 
      SZA           SCHEDULE PROGRAM, OTHERWISE 
      JMP CIC.5      ISSUE DIAGNOSTIC.
* 
      JSB $LIST    CALL SCHEDULER TO LINK PROGRAM 
       OCT 401       INTO SCHEDULE LIST.
      JMP $XEQ
      SPC 1 
N6    DEC -6
* 
* 
* ASSUME PROCESSOR FOR CODE GT= 6 IS A
*  SYSTEM I/0 DRIVER. VALUE OF INTERRUPT
*  TABLE ENTRY IS THE STARTING ADDRESS
*  OF THE EQUIPMENT TABLE ENTRY CORRESPONDING 
*  TO THE INTERRUPTING DEVICE.
* 
CIC.2 JSB $ETEQ    SET EQT ENTRY ADDRESSES. 
      SPC 1 
      IFZ 
***** BEGIN DMS CODE ************** 
CIC.6 JSB $DVM      GO SET RIGHT MAP
******* END DMS CODE ***************
      XIF 
      SPC 1 
      LDA INTCD     (A) INTERRUPT I-O SELECT CODE 
CIC.8 LDB EQT14,I   SET DEVICE
      STB EQT15,I    TIME-OUT CLOCK 
* 
* CALL I/O PROCESSOR, COMPLETION SECTION
* 
*     P+1 RETURN:  INDICATES COMPLETION OF THE REQUEST. 
*     P+2 RETURN:  INDICATES CONTINUATION OF THE REQUEST. 
*     P+3 RETURN:  INDICATES THAT THE DRIVER NEEDS A DMA
*                  CHANNEL BEFORE IT CAN CONTINUE.  REENTRY 
*                  TO THE DRIVER WILL BE THROUGH THE
*                  INITIATION POINT OF THE DRIVER WHEN A
*                  DMA CHANNEL IS AVAILABLE.  THE DRIVER MUST 
*                  KEEP A FLAG INDICATING HE WAS ENTERED AT 
*                  THE INITIATION POINT FOR A DMA REQUEST FROM
*                  THE CONTINUATOR.  ON EXIT FROM THE INITIATOR 
*                  THE A-REG MUST EQUAL ZERO.  RETURN WILL THEN 
*                  WILL BE MADE HERE FOR NORMAL CONTINUATION
*                  PROCESSING.
* 
      LDB EQT3,I   CALL  DRIVER  AT 
      JSB B,I       *COMPLETION* SECTION. 
* 
      JMP IOCOM  (P+1): *COMPLETION RETURN* 
      JMP IOCON  (P+2): *CONTINUATION RETURN* 
      IFZ 
***** BEGIN DMS CODE ***************
      JSB $RSM   (P+3): RESTORE USER MAP. 
***** END DMS CODE   ***************
      XIF 
       ISZ CONFL (P+3): *REQ.DMA RETURN*SET=1 INCASE WE GET 
       LDA DIOCR     TO *REXIT* VIA SUBROUTINE *DRIVR*. 
       STA DRIVR      SETUP RETURN ADDRESS FOR SUBROUTINE 
       JMP DVR0        *DRIVR* AND JUMP INTO IT TO ALLOCATE 
IOCRT   JMP IOCO1 (P+1) A DMA CHANNEL. WILL REENTER DRIVER AT 
        JMP NOTRD (P+2)  INITIATION. OK, RETURN TO (P+1). 
* 
IOCON EQU * 
      IFZ 
***** BEGIN DMS CODE ***************
      JSB $RSM      GO RESTORE USER MAP.
***** END DMS CODE   ***************
      XIF 
IOCO1 CLA 
      LDB OPATN    CHECK FOR OPERATOR ATTENTION.
      STA OPATN     -CLEAR OPERATOR FLAG- 
      SZB          IF FLAG SET, 
      JMP $TYPE     ACKNOWLEDGE.
* 
      LDA $LIST     ANY SCHEDULE ACTIVITY?
      SZA,RSS        YES, SKIP
      JMP $IRT       NO, RETURN TO POINT OF INTERRUPT 
* 
      JMP $XEQ      SCHEDULE NOW, NOT 10MS LATER!!
* 
* 
* 
$XCIC LIA 4         ### SPECIAL CLUDGE TO SKIP CLF ###
$YCIC STA INTCD 
      SPC 1 
      IFZ 
***** BEGIN DMS CODE ***************
      UJP *+2 
******* END DMS CODE ***************
      XIF 
      SPC 1 
MIC4  JMP MIC5      OR NOP IF NO MICRO, CXA IF MX 
MX4   JMP ZCIC       CYB IF MX
      DST XI,I      SAVE X,Y IF MX
      JMP ZCIC      SNEAK TO FRONT DOOR FROM REAR ENTRANCE
      SPC 2 
MIC1  SVR XA,I XI,I   MICRO FOR SAVE REGS 
      JMP LIA4
* 
MIC5  SVR DUM XI,I    MICRO SAVE X,Y ONLY 
      JMP ZCIC
* 
MIC3  INT INTBA     SEARCH INTERRUPT TABLE
       JMP CIC.4     ERROR RETURN 
       JMP CIC.2     CALL DRIVER
       JMP CIC.3     CALL PROGRAM 
* 
* 
* 
*  ILLEGAL OR UNDEFINED INTERRUPT 
* 
CIC.4 LDA INTCD     GET THE INTERRUPT CODE. 
      JSB $CVT1     CONVERT.
      STA CICM1+6   STUFF IN THE MESSAGE
      LDA CICM1    PRINT
      JMP CIC.7     "ILL INT XX"
* 
* ISSUE DIAGNOSTIC FOR BEING UNABLE TO
*  SCHEDULE USER PROGRAM ON INTERRUPT.
* 
CIC.5 ADB .12       SET (B) TO ADDRESS OF NAME IN 
      LDA B,I        PROGRAM ID SEGMENT.
      STA CICM2+7  STORE
      INB           PROGRAM 
      DLD B,I      NAME IN
      DST CICM2+8   DIAGNOSTIC AND PRINT
      LDA CICM2     "SC03 INT XXXXX"
CIC.7 JSB $SYMG 
* 
*     ***** NOTE FALL THROUGH TO $IRT ***** 
      SKP 
* 
*     RESET INTERRUPT CONDITIONS - RETURN TO SEQUENCE 
* 
* 
*     ROUTINE: '$IRT' 
* 
*     THIS ROUTINE RETURNS TO THE CURRENT USER PROGRAM. 
*     IT DOES THE PRIV. INTERRUPT SYSTEM EXIT THING AND 
*     RESTORES THE PROGRAMS REGISTERS AND THE INTERRUPT 
*     AND MEMORY PROTECT SYSTEM.
* 
*     CALLING SEQUENCE: 
* 
*     SET UP XEQT AREA ON THE BASE PAGE FOR THE PROGRAM 
* 
*     JMP $IRT
* 
$IRT  JSB $CLCK  OR -CLA- IF TBG INCLUDED 
      LDB XSUSP,I   (A) = 0  AT THIS POINT
      STB INTCD     (B) = RETURN ADDR.  SAVE IT 
      SPC 1 
      IFZ 
***** BEGIN DMS CODE ************** 
      UJP *+2 
******* END DMS CODE ************** 
      XIF 
      SPC 1 
      CLF 0         TURN OFF INT.SYS
*M1      STA MPTFL     SET 'MPTFL' = 0 TO MEAN INT.SYS IS OFF 
SW2   JMP MIC6      CLC IF PRIV. ELSE RETURN
STF1  STF 12B 
      DLD INTBA,I   CHECK CONDITION OF DMA CHANNELS 
      SSA           IF BIT=1, DMA #1 IS ACTIVE SO 
      STC 6          STC TO ENABLE DMA INTERRUPT
      SSB            IF USER WANTED IT
      STC 7         SAME FOR DMA #2 
MIC6  JMP MIC7      NOP IF NO MICRO, DLD IF MX
* 
MX6   JMP NMIC6     DEF XI,I IF MX
      CAX 
      CBY 
* 
NMIC6 LDA XEO,I     RESTORE E AND 
      CLO           O REGS. 
      SLA,ELA       PRIOR TO INTERRUPT TURN OFF 
      STF 1         TO KEEP TIME DOWN 
* 
      DLD XA,I      RESTORE THE A AND B REGS
IRT3  STF 0         TURN ON THE INTERRUPT SYSTEM
*M1      STC 5         AND MEMORY PROTECT 
      JMP INTCD,I   RETURN
* 
      SPC 1 
      IFZ 
***** BEGIN DMS CODE ***************
$MEU  NOP           MEU STATUS (DMS) AT INTERRUPT 
******* END DMS CODE ************** 
      XIF 
      SPC 1 
MIC7  RSR XA,I XI,I  MICRO FOR RESTORE REGS 
      JMP IRT3
      SPC 4 
CICM1 DEF *+1 
N10   DEC -10 
      ASC 5,ILL INT XX
* 
CICM2 DEF *+1 
N15   DEC -15 
      ASC 8,SC03 INT  XXXXX 
DUM   EQU *-3       DUMMY BUFFER (3 WORDS)
* 
INTCD NOP           HOLDS INTERRUPT SOURCE CODE 
B37   OCT 37
DIOCR DEF IOCRT 
N2    DEC -2
* 
$OPSY EQU *         SYSTEM ID 
      DEC -7
*     IFN 
* BEGIN NON-DMS CODE ***************
*     DEC -15 
*** END NON-DMS CODE ***************
*     XIF 
*     SPC 1 
*     IFZ 
***** BEGIN DMS CODE ***************
*     DEC -5
******* END DMS CODE ***************
*     XIF 
*     SPC 1 
      HED <  RT EXECUTIVE  INPUT/OUTPUT CONTROL  >
***  I N P U T  /  O U T P U T  C O N T R O L  ***
* 
*  THE I/O SCHEDULING AND CONTROL MODULE  < IOC > 
* IS RESPONSIBLE FOR ALLOCATING THE USE OF ALL
* STANDARD I/O DEVICES AND THE TWO DMA CHANNELS.
*  I/O DRIVERS OPERATE UNDER CONTROL OF <IOC> AND 
* <$CIC> FOR INITIATION AND COMPLETION OF SYSTEM
* AND USER DIRECTED I/O OPERATIONS. I/O DRIVERS 
* ARE INDEPENDENT PROGRAMS IDENTIFIED TO <IOC>
* BY THE DEVICE ASSOCIATED EQUIPMENT TABLE. DRIVERS 
* ARE COMPOSED TO TWO SECTIONS: *INITIATION* AND
* *COMPLETION*.  THE *INITIATION* SECTION IS
* CALLED BY <IOC> TO EXAMINE AND INITIATE AN I/O
* OPERATION. THE *COMPLETION* SECTION IS CALLED 
* BY <$CIC> TO CONTINUE OR COMPLETE THE OPERATION.
* DRIVERS PROVIDE FOR SIMULTANEOUS MULTI-DEVICE 
* CONTROL BY USING THE DEVICE EQT ENTRY FOR 
* VARIABLE STORAGE. 
* 
* I.   * EQUIPMENT TABLE * (EQT)
* 
*   EACH I/O DEVICE CONTROLLED BY THE IOC/DRIVER
*  RELATIONSHIP IS DEFINED BY STATIC AND DYNAMIC
*  INFORMATION IN THE EQUIPMENT TABLE. THE EQT
*  IS A SYSTEM RESIDENT TABLE WHICH IS CONSTRUCTED
*  FROM USER DIRECTIVES BY <RTGEN>.  EACH EQT 
*  ENTRY IS COMPOSED OF 15-WORDS IN THE FOLLOWING FORMAT: 
* 
      SKP 
* 
*  WORD            CONTENTS 
*  ----  ---------------------------- 
*    1   * I/O LIST . LINK POINTER  * 
*    2   *DRIVER *INITIATION ADDRESS* 
*    3   *DRIVER *COMPLETION ADDRESS* 
*    4   *DBPOT/----UNIT#--CHANNEL #* 
*    5   *AV-TYPE CODE- UNIT  STATUS* 
*    6   *REQUEST   CONTROL    WORD * 
*    7   *REQUEST  BUFFER   ADDRESS * 
*    8   *REQUEST  BUFFER   LENGTH  * 
*    9   *TEMPORARY OR DISC TRACK # * 
*   10   *TEMPORARY OR DISC SECTOR #* 
*   11   *DRIVER   TEMPORARY STORAGE* 
*   12   *  "          "        "   * 
*   13   *  "          "        "   * 
*   14   * DEVICE CLOCK RESET VALUE * 
*   15   *   "      "  WORKING  "   * 
* 
*  D: =1 IF A DMA CHANNEL REQUIRED FOR TRANSFER 
*  B: =1 IF AUTOMATIC OUPUT BUFFERING DESIRED 
*  P: =1 IF DRIVER TO HANDEL POWER FAIL RECOVERY. 
*  O: =1 IF DRIVER TO HANDEL TIME OUT.
*  T: DEVICE TIME-OUT BIT - CLEARED BEFORE EACH 
*              IO INITIATION; SET IF DEVICE TIMES-OUT.
*  UNIT#: OPTIONAL FOR DEVICES REQUIRING
*          SUB-CHANNEL DESIGNATION
*  CHANNEL#: I/O SELECT CODE (LOWER # IF
*             MULTI-BOARD INTERFACE)
*  AV (AVAILABILITY INDICATOR): 
*     =0, UNIT AVAILABLE FOR OPERATION
*     =1, UNIT DISABLED 
*     =2, UNIT CURRENTLY IN OPERATION 
*     =3, UNIT WAITING FOR DMA CHANNEL
*  TYPE CODE: CODE IDENTIFYING TYPE OF I/O DEVICE 
*  UNIT STATUS: ACTUAL OR SIMULATED UNIT STATUS 
*              AT END OF OPERATION
* 
* II. * DEVICE REFERENCE TABLE * (DRT)
* 
*  THE DEVICE REFERENCE TABLE PROVIDES FOR
* LOGICAL DEVICE ADDRESSING OF PHYSICAL I-O 
* SLOTS DEFINED IN THE *EQT*.  THE *DRT* CONSISTS 
* OF TWO SEQUENTIAL TABLES EACH TABLE CONSISTING
* OF 1-WORD ENTRIES CORRESPONDING TO THE RANGE
* OF USER-SPECIFIED "LOGICAL" UNITS, 1 TO N 
* WHERE N IS LT OR = TO 63(10). THE CONTENTS OF 
* EACH LOGICAL UNIT'S WORD ONE IS AS FOLLOWS: 
*     BITS 5-0  DEVICE'S EQT NUMBER 
*     BITS 6-10 THE LOCKING RESOURCE NUMBER 
*     BITS 11-15  THE DEVICE'S SUBCHANNEL ON THE EQT. 
*  THE CONTENTS OF EACH LOGICAL UNIT'S DEVICE 
* REFERENCE TABLE WORD TWO CONTAINS A 
* POINTER TO THE I/O QUEUE OF THE I/O REQUESTS
* FOR THIS DEVICE WHEN THE DEVICE IS DOWN:
*     BIT 15=0 FOR AN UP LU.
*           =1 FOR A DOWN LU. 
*     BITS 14-0=0 FOR AN UP LU. 
*              #0 FOR A DOWN LU WHERE 
*                 = ADDRESS OF THE I/O QUEUE IF THIS
*                   IS THE FIRST LU(MAJOR LU)POINTING 
*                   TO THE DEVICE.
*                 = 1 TO 1777(8).  THE LU NUMBER OF 
*                   DEVICE(MAJOR LU)ON WHICH THE I/O
*                   IS QUEUED.
* 
                                                                                                                                                                                                                                          