ASMB,R
*USE 'ASMB,R,N' (RTE-M II) OR 'ASMB,R,Z' (RTE-M III)
* 
*     IFN OPTION
*     NAME:   $MIO2 
*     SOURCE: 92064-18008 
*     RELOC:  PART OF 92064-16002 
*     PROGMR: E.J.W.,J.U.F. 
*             BASED ON RTE-III VERSIONS G.A.A.,L.W.A.,D.L.S.
* 
*     IFZ OPTION
*     NAME  : $MIO3 
*     SOURCE: 92064-18008 
*     RELOC:  PART OF 92064-16003 
*     PROGMR: E.J.W.,J.U.F. 
*             BASED ON RTE-III VERSIONS G.A.A.,L.W.A.,D.L.S.
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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.        * 
*  **************************************************************** 
* 
* 
      IFN 
* BEGIN NON-DMS CODE ***************
      NAM $MIO2  92064-16002  REV.2001  791022
*** END NON-DMS CODE ***************
      XIF 
      IFZ 
***** BEGIN DMS CODE ***************
      NAM $MIO3  92064-16003  REV.2001  791022
******* END DMS CODE ***************
      XIF 
* 
* 
* 
* 
      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 
      SPC 1 
      IFZ 
***** BEGIN DMS CODE ************** 
      ENT $DVM,$RSM,$MEU
      EXT $MRMP,$MVBF,$SMAP,$MATA 
******* END DMS CODE ************** 
      XIF 
      SPC 1 
* 
      EXT $RQST,$CLCK,$XEQ,$TYPE,$LIST,$ALC,$RTN
      EXT $SCD3,$RNTB,$ERMG 
      EXT $CVT1,$REIO,$ABRT,$INER,$ZZZZ 
      EXT $ERAB,$CVT3,$QCHK,$MIC
      SPC 1 
      IFN 
* BEGIN NON-DMS CODE ***************
      EXT .MVW
*** END NON-DMS CODE ***************
      XIF 
      SPC 1 
      EXT $S.CL,$I.CL,$C.CL 
* 
      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       SAVE REGISTERS IN USER MAP
******* 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  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 INT.SYS, LET DUMMY INTERRUPT
* 
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 TBG       IF TIME BASE GENERATOR, 
      JMP $CLCK      GO TO TIME PROCESSOR 
      SPC 1 
      IFZ 
***** BEGIN DMS CODE **************** 
      UJP *+2       USER MAP FOR PRAMS, DUMMY SET SYS MAP 
******* END DMS CODE **************** 
      XIF 
      SPC 1 
      CPB .5       IF MEMORY PROTECT VIOLATION, 
      JMP $RQST     GO TO EXAMINE MP VIOLATION. 
* 
* 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/O 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
      SZB            TIME-OUT CLOCK 
      STB EQT15,I     IF USER SPECIFIED A TIME-OUT
* 
* 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:  NEED/GIVE-UP DMA RETURN: 
*                     A-REG=5 TO GET DMA
*                     A-REG=6 TO GIVE-UP DMA
* 
* 
      LDB EQT3,I   CALL  DRIVER 
      ELB,CLE,ERB   CLEAR FLAG BIT
      JSB B,I        *COMPLETION* SECTION.
* 
      JMP IOCOM  (P+1): *COMPLETION RETURN* 
      JMP IOCON  (P+2): *CONTINUATION RETURN* 
      CPA .6     (P+3): *NEED/GIVE-UP DMA RETURN* 
      JMP IODMA   IF (A) .NE. 6 (SHOULD BE 5), IT'S A 
      LDA EQT3,I   NEED-DMA RETURN.  SO FIRST SET THE 
      IOR B100K    DRIVER-EXITED-FROM-CONTINUATION- 
      STA EQT3,I   SECTION-TO-GET-DMA FLAG. 
      IFZ 
***** BEGIN DMS CODE ***************
      JSB $RSM   RESTORE USER MAP.
***** END DMS CODE   ***************
      XIF 
      ISZ CONFL    FAKE *DRIVR* CALL, FLAG=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
      JMP NOTRD (P+2)  AT INITIATION. OK, RETURN TO (P+1).
* 
IODMA JSB CLDMA   IT WAS A GIVE-UP-DMA RETURN, SO DO IT.
      LDA EQT5,I   CHANGE EQT STATE 
      AND MSK14     FROM "WAITING-FOR-DMA" (BIN. 11)
      STA EQT5,I     TO "BUSY" (BIN. 10). 
      LDA EQT3,I   THEN CLEAR THE DRIVER-EXITED-FROM- 
      ELA,CLE,ERA   CONTINUATION-SECTION- 
      STA EQT3,I     TO-GET-DMA FLAG. 
      IFZ 
***** BEGIN DMS CODE ***************
      JSB $RSM   RESTORE USER MAP.
***** END DMS CODE   ***************
      XIF 
      JMP IOCX     GO CHECK THE DMA QUEUE 
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
      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
      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 1 
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
B100K OCT 100000
MSK14 OCT 137777
DIOCR DEF IOCRT 
N2    DEC -2
* 
$OPSY EQU *         SYSTEM ID 
      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: 
* 
                  