ASMB,L,C,R,Q ** RTE-IV INPUT/OUTPUT CONTROL MODULE ** 
      HED ** RTE-IV INPUT/OUTPUT CONTROL MODULE **
*     DATE:   1/07/77 
*     NAME:   RTIO4 
*     SOURCE: 92067-18107 
*     RELOC:  PART OF 92067-16102 
*     PGMR:   G.A.A.,L.W.A.,D.L.S.,E.J.W.,G.L.M.,A.D.,B.D.
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978.  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 RTIO4,0 92067-16102 REV.2040 800731 
* 
***** AMD-DAS ***** FEB,72 ***** REV.LWH *****
***** AMD-DAS ***** AUG,72 ***** REV.GAA *****
***** AMD-DAS ***** APR,75 ***** REV.LWA *****
*****   DSD   ***** FEB,77 ***** REV.EJW *****
* 
* 
      ENT $CIC0,$XSIO,$SYMG,$IORQ,$IOUP,$IODN 
      ENT $ETEQ,$IRT,$DEVT,$CXC,$CYC,$BFOT,$YMG 
      ENT $GTIO,$UP,$CVEQ,$DMS,$BLLO,$BLUP
      ENT $BITB,$UNLK,$XXUP,$DLAY,$DMEQ,$CKLO 
      ENT $CON1,$CON2,$CON3,$DRVM,$RSM,$PSTE,$LU??
      ENT $DVC,$CJMP,$LIA4
      ENT $EQCL 
* 
      EXT $RQST,$CLCK,$XEQ,$TYPE,$LIST,$ALC,$RTN,$CIC 
      EXT $LUSW,$SCD3,$RNTB,$CNV3,$ERMG,$CALL 
      EXT $CNV1,$CLAS,$REIO,$ABRT,$INER,$ZZZZ 
      EXT $PDSK,$UCON,$UIN,$PERR,$SMER
      EXT $ERAB,$IDNO,$SMAP,$MATA 
      EXT $MRMP,$MVBF 
      EXT $DVPT,$DLTH,$DVMP,$SDA
      EXT $ELTB 
* 
* 
* 
*  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 < $CIC0>.
*  < $CIC0> 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 $CIC0. 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 < $CIC0>. 
* 
      SKP 
*    <$CIC0> 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
*           6 - TIME BASE GENERATOR(TBG)INTERRUPT 
* 
*          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. $CIC0 TRANS-
*                              FERS DIRECTLY TO THE 
*                              IOC COMPLETION SECTION 
*                              AT  < IOCOM >. CONTROL 
*                              IS NOT RETURNED TO 
*                              < $CIC0>.
* 
*          B. RETURN AT (P+2): CONTINUATION OF THE
*                              OPERATION. $CIC0 RETURNS 
*                              TO THE INTERRUPTED 
*                              SEQUENCE AS DESCRIBED
*                              IN STEP 8 FOLLOWING. 
* 
*          C. RETURN AT (P+3): CONTINUATION REQUESTING A DMA
*                              CHANNEL.  IF ASSIGNED NOW OR 
*                              LATER, THEN ENTRY WILL BE MADE 
*                              INTO INTIATION SECTION OF DRIVER 
*                              FROM SUBROUTINE *DRIVR*.  RETURN 
*                              FROM THIS INITIATION WILL ACT AS 
*                              A CONTINUATION RETURN.  THE DRIVER 
*                              IS RESPONSIBLE FOR KEEPING A FLAG
*                              INDICATING WHETHER THE NEXT ENTRY
*                              INTO THE INITIATOR FOR THIS CHANNEL
*                              IS A RESULT OF A NORMAL INITIATION 
*                              OR A CONTINUATION REQUEST FOR DMA. 
*                              THIS FEATURE IS AN UNADVERTISED
*                              ABILITY FOR THE USE OF DVR07 (MULTIPOINT)
* 
*       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. $CIC0 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 
$CIC0 EQU * 
      OCT 103300    INTERRUPT SYSTEM ALREADY OFF? 
      ISZ $INT       YES, FLAG IT FOR $PERR4
*                   TURN IT OFF IN ANY CASE !!
* 
* PRESERVE CURRENT STATUS OF MACHINE
* 
      SSM $DMS      SAVE DMS STATUS AT INTERRUPT FOR P.E. 
      STA TEMPA     SAVE A-REG IN CASE OF PARITY ERROR
      LIA 4         GET INTERRUPT SOURCE
      STA INTCD      AND SAVE IT
      CPA .5        IS IT MP, DMS, OR PE? 
      JMP PE? MAYBE.
* 
      IOR CLF        NO, CONSTRUCT CLF XX INSTRUCTION 
      STA *+1 
* 
$DVC  NOP           CLEAR DEVICE FLAG 
* 
CIC1  STB XB,I      SAVE REGISTERS
      ERA,ALS        A,B
      SOC            E AND
      INA            OVERFLOW 
      STA XEO,I 
      LDA TEMPA 
      STA XA,I
CIC2  ISZ MPTFL     SET 'MPTFL' = 1 TO MEAN MP IS OFF.
* 
SW1   JMP CIC.0     (STC DUMMY IF PRIVILEDGED OPTION) 
* 
* PROVIDE FOR SPECIAL  (PRIVILEGED) INTERRUPTS
* 
* 
      CLC 6         CLEAR DMA CHANNELS
      CLC 7          CONTROL FF.
* 
      STF 0         RE-ENABLE INTERRUPTS
* 
* 
CIC.0 EQU * 
      LDA XI        SAVE INDEX REGISTERS
      CXB 
      XSB A,I       STORE X THROUGH USER MAP
      INA 
      CYB 
      XSB A,I       STORE Y THROUGH USER MAP
      LDA INTCD     RESTORE THE INT CODE
      LDB $CIC      SAVE P-REGISTER SOON AS POSSIBLE
      STB XSUSP,I    POINT OF SUSPENSION. 
* 
* CHECK FOR TRANSFER TO NON-I/O SYSTEM PROCESSOR
* 
      CPA .5       IF MEMORY PROTECT VIOLATION, 
      JMP $RQST     GO TO EXAMINE MP VIOLATION. 
* 
      CPA TBG      IF TIME BASE GENERATOR,
$CJMP JMP $CLCK     GO TO TBG PROCESSOR ROUTINE.
* 
* CHECK LEGALITY OF INTERRUPT 
* 
      ADA N6        CODE - 6. 
      STA B         (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       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 DRIVER 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>. 
* 
      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 
CLF   CLF 0 
N6    DEC -6
TEMPA NOP 
$DMS  NOP           DMS STATUS AT INTERRUPT 
$INT  NOP   ($DMS+1)INTERRUPT SYSTEM: 0 ON, 1 OFF 
* 
* 
PE?   LIA 5         GET VIOLATION REGISTER
      SSA,RSS       IS IT PARITY ERROR? 
      JMP CIC1       NO, SAVE REGISTERS FOR REAL
* 
      LDA TEMPA     RESTORE A-REG 
      JMP $PERR     CALL PARITY ERROR ROUTINE 
* 
* 
$CXC  LIA 4         *** SPECIAL ENTRY TO SKIP CLF *** 
$CYC  STA INTCD     SAVE INTERRUPT SOURCE CODE
      SSM $DMS      SAVE DMS STATUS 
      JMP CIC2
      SKP 
* 
* 
* 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. 
* 
CIC.6 JSB $DRVM     GO SET RIGHT MAP
* 
      LDA INTCD      (A) = INTERRUPT SOURCE CODE
* 
      LDB EQT14,I   SET DEVICE
      SZB            TIME-OUT CLOCK      DLS 780217 
      STB EQT15,I     IF USER SPECIFIED A TIMEOUT.
* 
* CALL I/O PROCESSOR, COMPLETION SECTION
* 
      LDB EQT3,I   CALL  DRIVER CONTINUATION SECTION
      ELB,CLE,ERB  (GET RID OF FLAG BIT USED ELSEWHERE.)
      SEZ            IN THE 
      JMP $UCON       USER MAP, 
* 
      JSB B,I          OR SYSTEM MAP, AS THE CASE MAY BE. 
       JMP $CON1  (P+1): *COMPLETION RETURN*
       JMP $CON2  (P+2): *CONTINUATION RETURN*
$CON3  CPA .6     (P+3): *NEED/GIVE-UP DMA RETURN*
       JMP $CON4   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. 
       JSB $RSM     RESTORE USER MAP. 
       ISZ CONFL    FAKE *DRIVR* CALL, FLAG=1 IN CASE WE GET
       LDA DIOCR     TO *REXIT* VIA SUBROUTINE *DRIVR*
       STA DRIVR     DUMMY UP RETURN ADDR IN *DRIVR*
       JMP DVR0      JUMP INTO MIDDLE OF *DRIVR*
IOCRT  JMP IOCO1  (P+1) TO ALLOC DMA CHAN, REENTER INITIATOR
       JMP NOTRD  (P+2) 
* 
$CON4  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. 
      JSB $RSM      RESTORE USER MAP IF NECESSARY.
      JMP IOCX      ALLOCATE DMA FREED-UP, & EXIT TO DISP.
* 
$CON2  JSB $RSM    RESTORE USER MAP.
IOCO1 CLA 
      LDB OPATN    CHECK FOR OPERATOR ATTENTION.
      STA OPATN     -CLEAR OPERATOR FLAG- 
      SZB          IF FLAG SET, 
      JMP $TYPE     ACKNOWLEDGE.
* 
      LDA $LIST     IF $LIST ENTERED
      SZA,RSS       SKIP TO ENTER $XEQ
      JMP $IRT      RETURN TO POINT OF INTERRUPT
* 
      JMP $XEQ      GO DISPATCH POSSIBLE NEW PROGRAM
* 
*  ILLEGAL OR UNDEFINED INTERRUPT 
* 
CIC.4 LDA INTCD     GET THE INTERRUPT CODE. 
      JSB $CNV1     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 $YMG     MESSAGE GOES TO LU 1 ONLY -780221 GLM- 
* 
*     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  LDA XSUSP,I   GET THE EXECUTE ADDRESS 
* 
      STA RTN       SAVE THE RETURN ADDRESS 
      LDB XI        RESTORE INDEX REGISTERS 
      XLA B,I 
      INB 
      XLB B,I 
      CAX 
      CBY 
      LDA XEO,I     RESTORE E AND 
      CLO           O REGS. 
      SLA,ELA       PRIOR TO INTERRUPT TURN OFF 
      STF 1         TO KEEP TIME DOWN 
      CLA           CLEAR 'MPTFL' TO MEAN 
      CLF 0         TURN OFF THE INTERRUPT SYSTEM 
      STA MPTFL      MEMORY PROTECT IS ON.
* 
SW2   JMP IRT2      RETURN IF NOT PRIV. (ELSE CLC)
* 
STF1  STF 12B      BUFFER ON DUMMY I/O CARD 
* 
      DLD INTBA,I  CHECK CONDITION OF DMA CHANNELS
      SSA           IF BIT = 1 FOR DMA #1 (ACTIVE)
      STC 6          THEN SET CONTROL TO ENABLE 
      SSB          INTERRUPTS.  SAME FOR
      STC 7           DMA CHANNEL #2. 
* 
IRT2  LDA XA,I      RESTORE THE A AND B REGS
      LDB XB,I
      STF 0         TURN ON THE INTERRUPT SYSTEM
      STC 5         AND MEMORY PROTECT
      UJP *         ENABLE USER MAP AND RETURN
RTN   EQU *-1 
      SPC 4 
CICM1 DEF *+1 
      DEC -10 
      ASC 5,ILL INT XX
* 
CICM2 DEF *+1 
      DEC -15 
      ASC 8,SC03 INT  XXXXX 
* 
INTCD NOP           HOLDS INTERRUPT SOURCE CODE 
$LIA4 EQU INTCD 
D$LUT DEF $LUSW+0   DIRECT ADDRESS OF BATCH LU TABLE
DIOCR DEF IOCRT 
* 
$BLLO DEC -100
$BLUP DEC -300
B100K OCT 100000
MSK14 OCT 137777    AN "AND MSK14" WILL MASK OUT BIT 14.
      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 
* <$CIC0> 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 <$CIC0> 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 HANDLE POWER FAIL RECOVERY. 
*  O: =1 IF DRIVER TO HANDLE TIME OUT.
*  T: DEVICE TIME-OUT BIT - CLEARED BEFORE EACH 
*              IO INITIATION; SET IF DEVICE TIMES-OUT.
*  UNIT#: LAST SUBCHANNEL REFERENCED ON THIS EQT. 
*  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.
* 
*  CERTAIN LOGICAL UNIT #S ARE PERMANENTLY
* ASSIGNED TO FACILITATE SYSTEM, USER AND 
* SYSTEM SUPPORT I/O OPERATIONS. THESE ARE: 
* 
*     0  -   BIT BUCKET(DUMMY LU)(NO ENTRY IN DRT)
*     1  -   SYSTEM  TELETYPEWRITER 
*     2  -   SYSTEM  DISC 
*     3  -   AUXILIARY DISC 
*     4  -   'STANDARD' PUNCH UNIT
*     5  -   'STANDARD' INPUT UNIT
*     6  -   'STANDARD' LIST  UNIT
*     7  - ASSIGNED 
*     .     BY
*     .      USER 
*     63 -
      SKP 
* 
* III.  INPUT/OUTPUT REQUESTS 
* 
*    I/O REQUESTS INCLUDE COMMANDS FOR
*   READ, WRITE, CONTROL(FUNCTIONS) AND STATUS. 
*   THE FORMAT OF THESE REQUESTS CONFORM TO 
*   THE GENERAL SYSTEM REQUEST FORMAT. THE
*   NUMBER OF PARAMETERS VARIES DEPENDING 
*   ON THE TYPE OF REQUEST AND THE CHARAC-
*   TERISTICS OF THE REFERENCED DEVICE. 
* 
*    A USER I/O REQUEST IS DIRECTED TO <IOC>
*   AT -$IORQ- BY THE EXECUTIVE REQUEST 
*   PROCESSOR <$RQST>. SYSTEM I/O REQUESTS
*   ARE IN A DIFFERENT FORMAT AND ARE PROCESSED 
*   AT THE SECTION -$XSIO- IN <IOC>. REFER TO 
*   THAT SECTION FOR DETAILED DESCRIPTION.
* 
*    A *STATUS* REQUEST IS PROVIDED 
*   FOR USER AND SYSTEM SUPPORT PROGRAMS
*   WHICH REQUIRE KNOWLEDGE OF DEVICE 
*   CONDITIONS OR TYPE BEFORE A READ/WRITE/ 
*   CONTROL REQUEST IS MADE. THE PROGRAM
*   IS NOT SUSPENDED ON THIS CALL.
*   A PARAMETER WORD IS INCLUDED IN THE 
*   REQUEST TO CONTAIN THE DEVICE STATUS ON 
*   RETURN TO THE USER. THIS STATUS IS FROM WORD
*   5 OF THE EQT ENTRY FOR THE DEVICE.
*   ALSO, AN ADDITIONAL PARAMETER WORD CAN BE 
*   INCLUDED IN THE REQUEST- WORD 4 OF THE
*   EQT ENTRY IS RETURNED IF THE ADDITIONAL 
*   PARAMETER WORD IS INCLUDED. 
* 
*    A DYNAMIC STATUS REQUEST CAN BE MADE BY
*   MEANS OF A CONTROL REQUEST, THE FORMAT
*   OF WHICH IS DEFINED BELOW.  IN THIS CASE, 
*   THE REQUEST IS QUEUED, THE DRIVER IS ENTERED, 
*   AND THE STATUS IS RETURNED TO THE CALLING 
*   PROGRAM IN THE A REGISTER.
* 
      SKP 
* 
*   EXEC I/O REQUEST "NO SUSPEND" BIT 
* 
*   THE "NO SUSPEND" BIT (BIT 14) IN EXEC I/O REQUESTS (CODES = 
*   1,2,3,17,18,19,20) PROVIDES NO SUSPEND I/O PROCESSING. IF AN
*   I/O EXEC REQUEST CAN'T BE PROCESSED IMMEDIATELY BECAUSE OF A
*   DOWNED DEVICE OR A LOCKED EQT OR LU, THE CALLING PROGRAM IS 
*   SUSPENDED. BY SETTING THE NO SUSPEND BIT, THE CALLING PROGRAM 
*   IS NOT SUSPENDED UNDER THESE CONDITIONS. INSTEAD THE PROGRAM
*   RESUMES EXECUTION AT THE FIRST LINE OF CODE FOLLOWING THE EXEC
*   CALL WITH AN "IO" ERROR CODE RETURNED IN THE A,B REGISTERS. IF
*   THERE ARE NO EXCEPTIONS IN THE I/O REQUEST, THE PROGRAM'S SECOND
*   LINE OF CODE FOLLOWING THE EXEC CALL IS EXECUTED. 
* 
*   IF AN EXEC I/O REQUEST IS MADE TO A DEVICE WHOSE EQT OR LU IS 
*   LOCKED TO ANOTHER LOCKER AND THE NO SUSPEND BIT IS SET, THE 
*   PROGRAM IS CONTINUED AT THE FIRST LINE OF CODE FOLLOWING THE EXEC 
*   CALL WITH THE A,B REGISTER SET TO IO13. IF THE NO SUSPEND BIT 
*   IS NOT SET IN THE ABOVE CASE, THE PROGRAM IS SUSPENDED ON THE EQT 
*   OR LU LOCK. IO13 INDICATES THAT THE I/O REQUEST CANNOT CURRENTLY
*   BE SATISFIED DUE TO A LOCKED LU OR EQT. 
* 
*   IF AN EXEC I/O REQUEST IS MADE TO A DEVICE WHICH IS DOWN AND
*   THE NO SUSPEND BIT IS SET, THE PROGRAM IS CONTINUED AT THE FIRST
*   LINE OF CODE FOLLOWING THE EXEC CALL WITH THE A,B REGISTERS SET 
*   TO IO14. IF THE NO SUSPEND BIT IS NOT SET IN THE ABOVE CASE,
*   THE PROGRAM IS SUSPENDED ON THE DOWNED DEVICE. IO14 INDICATES 
*   THAT THE I/O REQUEST CANNOT CURRENTLY BE SATISFIED DUE TO A 
*   DOWNED DEVICE.
* 
*   IF A DEVICE GOES DOWN (EITHER BY AN OPERATOR DN REQUEST OR
*   AN EQUIPMENT MALFUNCTION) WHILE REQUESTS ARE PENDING ON THE EQT,
*   THE REQUESTS LINKED ON THE EQT FOR THE DOWNED DEVICE ARE
*   UNLINKED FROM THE EQT AND HANDLED IN THE FOLLOWING WAY: 
*   UNBUFFERED REQUESTS MADE WITH THE NO SUSPEND BIT SET ARE UNLINKED 
*   AND THE CALLING PROGRAM IS RESCHEDULED AT THE FIRST LINE OF CODE
*   FOLLOWING THE EXEC CALL WITH THE A,B REGISTERS SET TO IO14; 
*   UNBUFFERED REQUESTS MADE WITH THE NO SUSPEND BIT CLEAR ARE
*   UNLINKED AND SUSPENDED IN STATE 3; BUFFERED REQUESTS REGARDLESS 
*   OF THE NO SUSPEND BIT ARE UNLINKED AND RELINKED ON THE MAJOR
*   LU'S DRT WORD 2 QUEUE.
* 
*   IF AN EXEC I/O REQUEST (CODES = 1,2,3) IS BUFFERED AND NO MEMORY
*   IS AVAILABLE NOW AND THE NO SUSPEND BIT IS SET, THE REQUEST 
*   CONTINUES TO BE PROCESSED UNBUFFERED. ON COMPLETION OF THE I/O
*   REQUEST, THE PROGRAM IS RESCHEDULED AT THE SECOND LINE OF CODE
*   FOLLOWING THE EXEC REQUEST. IF THE NO SUSPEND BIT IS NOT SET
*   IN THE ABOVE CASE, THE PROGRAM IS SUSPENDED IN THE MEMORY 
*   SUSPEND LIST. 
* 
      SKP 
* 
*  A.   READ/WRITE REQUEST FORMAT 
* 
*         EXT  EXEC 
*         JSB  EXEC 
*         DEF  EXIT     (DEFINE EXIT POINT) 
*         DEF  RCODE    (DEFINE READ (1) OR WRITE(2)) 
*         DEF  CONWD    (DEFINE CONTROL WORD) 
*         DEF  BUFFR    (DEFINE BUFFER LOCATION)
*         DEF  BUFFL    (DEFINE BUFFER LENGTH)
*         DEF  DTRAK   (OPTIONAL - DISC TRACK #)
*         DEF  DSECT   (OPTIONAL - DISC SECTOR #) 
*    EXIT --- 
*          .
*          .
*   RCODE DEC  1 OR 2 
*   CONWD OCT  NNNNN   CONTROL INFO/LOGICAL UNIT #
*   BUFFL DEC  N OR -N  WORD OR CHARACTER LENGTH
*   DTRAK DEC  N       DISC TRACK # 
*   DSECT DEC  N       STARTING SECTOR #
* 
*   BIT 12 OF THE CONTROL WORD SET ON NON-DISC REQUESTS 
*   INDICATES A DOUBLE BUFFER FOR THIS OPERATION. 
*   IN THIS CASE THE CONTROL BUFFER IS AT "DTRAK" AND IT'S
*   LENGTH IN WORDS IS AT "DSECT".
* 
* 
*  B.   CONTROL   REQUEST FORMAT
* 
*         EXT  EXEC 
*         JSB  EXEC 
*         DEF  EXIT     (DEFINE EXIT POINT) 
*         DEF  RCODE    (DEFINE REQUEST CODE) 
*         DEF  CONWD    (DEFINE CONTROL WORD) 
*         DEF  PARAM    (DEFINE OPTIONAL PARAMETER) 
*    EXIT --- 
*          .
*          .
*   RCODE DEC  3
*   CONWD OCT  NNNNN   CONTROL CODE/LOGICAL UNIT #
*   PARAM DEC  N      PARAMETER REQUIRED BY TYPE OF CODE
* 
*    CONTROL CODES (FIELD 10-06 OF CONTROL WORD): 
* 
*      01 -   WRITE END-OF-FILE    --/  PRIMARILY 
*      02 -   BACKSPACE 1 RECORD     /    FOR 
*      03 -   FORWARD SPACE 1 RECORD /  MAGNETIC
*      04 -   REWIND                 /    TAPE
*      05 -   REWIND STANDBY         /    UNITS 
*      06 -   DYNAMIC STATUS       --/
*      07 -   SET EOT STATUS (FOR PAPER TAPE INPUT) 
*      10 -   GENERATE LEADER FOR PAPER TAPE
*      11 -   LIST OUTPUT LINE SPACING
*      12 -   WRITE FILE GAP  --/ PRIMARILY 
*      13 -   FORWARD SPACE FILE/ FOR MAGNETIC
*      14 -   BACKWARD SPACE FILE/ TAPE UNITS 
      SKP 
*  C.  DEVICE   STATUS  REQUEST FORMAT
* 
*         EXT  EXEC 
*         JSB  EXEC 
*         DEF  EXIT     (DEFINE EXIT POINT) 
*         DEF  RCODE    (DEFINE REQUEST CODE) 
*         DEF  CONWD    (DEFINE CONTROL WORD) 
*         DEF  STAT1    (DEFINE STATUS WORD 1)
*         DEF  STAT2    (DEFINE STATUS WORD 2  -- OPTIONAL) 
*         DEF  STAT3    (DEFINE STATUS WORD 3  -- OPTIONAL) 
*    EXIT --- 
*          .
*          .
*   RCODE DEC  13      STATUS REQUEST CODE = 13 
*   CONWD OCT  NN      LOGICAL UNIT # 
*   STAT1 NOP         WORD 5 OF EQT ENTRY FOR 
*                      DEVICE STORED IN THIS WORD.
*   STAT2 NOP         WORD 4 OF EQT ENTRY FOR 
*                      DEVICE STORED IN THIS WORD 
*                      IF PRESENT IN REQUEST. 
*   STAT3 NOP         IF PRESENT, THEN BIT 15 INDICATES 
*                      THE LU IS UP(0) OR DOWN(1) AND BITS
*                      0-4 GIVE THE LU'S SUBCHANNEL.
* 
* 
* IV. GENERAL OPERATION 
* 
*    ALL INPUT/OUTPUT OPERATIONS ARE PERFORMED
*   CONCURRENTLY WITH PROGRAM COMPUTATION IN THE
*    OVERALL SYSTEM. AN I/O OPERATION IS CONSIDERED 
*    TO BE NON-BUFFERED TO THE REQUESTING USER
*   PROGRAM AS THE PROGRAM IS SUSPENDED UNTIL 
*   THE TRANSMISSION OR OPERATION IS COMPLETED. 
*   THE EXCEPTION TO THIS IS IN PROVIDING FOR 
*   AUTOMATIC BUFFERING OF OUTPUT TO USER-
*   DESIGNATED DEVICES. IN THIS CASE, THE USER
*   BUFFER IS MOVED TO SYSTEM AVAILABLE MEMORY
*   AND THE USER PROGRAM IS NOT SUSPENDED.
* 
* V.  CLASS I/O OPERATIONS
* 
*     CLASS I/O REFERS TO NO-WAIT I/O IN WHICH THE USER 
*     DIRECTS THE COMPLETION INFORMATION TO A 'CLASS' BY
*     NUMBER.  LEGAL CLASSES ARE DEFINED AT GENERATION TIME 
*     AND QUEUES ARE KEPT FOR EACH CLASS IN A TABLE CALLED
*     THE CLASS TABLE.  THIS TABLE IS LOCATED AT $CLAS
*     AND CONSISTS OF A LENGTH WORD (DEFINING THE NUMBER
*     OF WORDS (CLASSES) IN THE TABLE (SYSTEM)) FOLLOWED
*     BY ONE WORD FOR EACH DEFINED CLASS. 
* 
*     IN OPERATION THE USER REQUESTS I/O ON A CLASS,
*                  RTIOC REQUESTS BUFFER MEMORY FOR THE REQUEST 
*                  MOVES THE REQUEST TO THE BUFFER MEMORY 
*                  QUEUES THE REQUEST ON THE SPECIFIED EQT AND
*                  NOTES IN THE CLASS QUEUE THAT A REQUEST IS 
*                  PENDING. 
* 
*     ON COMPLETION THE COMPLETED REQUEST IS QUEUED IN THE CLASS
*                   QUEUE AND ANY PROGRAM WAITING FOR THE CLASS 
*                   IS RESTARTED. 
* 
*  A.   READ/WRITE AND WRITE-READ REQUEST FORMAT
* 
*         EXT EXEC
*         JSB EXEC
*         DEF EXIT
*         DEF RCODE    (DEFINE READ (17) WRITE (18) WRITE-READ (20) 
*         DEF CONWD    (SAME AS STANDARD READ/WRITE)
*         DEF IBUFR    (SAME AS STANDARD (NOT USED ON READ) 
*         DEF BUFFL    (SAME AS STANDARD) 
*         DEF OPT1     (SAME AS STANDARD (TRACK)) 
*         DEF OPT2     (SAME AS STANDARD (SECTOR))
*         DEF CLASS    (CLASS TO QUEUE REQUEST ON ) 
*   EXIT  --- 
*          .
*          .
*  RCODE  DEC 17 OR 18 OR 20 (SEE NOTE BELOW) 
*  CONWD  OCT  NNNNN     CONTROL INFO/LOGICAL UNIT #
*  BUFFL  DEC N OR -N    WORD OR CHARACTER LENGTH 
*  OPT1   DEC N           (SEE GET CALL BELOW)
*  OPT2   DEC N           (SEE GET CALL BELOW)
*  CLASS  DEC N          DEFINES CLASS TO BE USED IN GET CALL.
*  IBUFR  BSS N          DATA BUFFER
* 
* 
*  NOTES: 
*         THE WRITE-READ CALL IS FOR DEVICES WHICH EXPECT DATA IN 
*         THE READ BUFFER. THIS CAUSES THE SYSTEM TO MOVE THE BUFFER
*         TO SYSTEM MEMORY AND ALSO TO SAVE AND PASS TO THE USER
*         THE BUFFER ON THE GET CALL.  THE REQUEST CODES RECEIVED 
*         BY THE DRIVER ARE:
*         1 FOR REQUEST 17 OR 20
*         2 FOR REQUEST 18
*         3 FOR REQUEST 19
* 
*         THE CLASS WORD HAS THE FOLLOWING FORMAT 
*         BITS 0-7 DEFINE THE CLASS. IF ZERO OR NOT SUPPLIED
*                  THE SYSTEM WILL ASSIGN A CLASS FOR THE REQUEST.
*         BITS 8-12 CONTAIN THE SECURITY CODE ASSIGNED BY THE 
*                   SYSTEM UPON CLASS ALLOCATION. 
*         BITS 13-14 ARE NOT USED BY READ/WRITE OR WRITE-READ 
*                    BUT WILL BE RETURNED TO CALLER IF A CLASS
*                    IS ALLOCATED.
*         BIT 15  SHOULD BE SET TO INDICATE THAT THE PROGRAM IS TO
*                 BE CONTINUED WITHOUT MAKING THE REQUEST IF THERE
*                 IS NOT ENOUGH SYSTEM MEMORY AT THE CURRENT TIME.
* 
*         ON RETURN TO THE PROGRAM THE A REGISTER WILL BE SET AS
*         FOLLOWS (IF BIT 15 WAS SET):
* 
*         A = -1  DYNAMIC CLASS ASSIGNMENT FAILED (NO FREE CLASS NOW) 
*             -2  NO MEMORY AVAILABLE FOR BUFFERING.
*           = >0  THE NEWLY ALLOCATED CLASS NUMBER AND SECURITY CODE. 
* 
*  B. CLASS CONTROL REQUEST FORMAT
* 
*         EXT EXEC
*         JSB EXEC
*         DEF EXIT
*         DEF RCODE (DEFINES REQUEST CODE)
*         DEF CONWD (DEFINES CONTROL WORD)
*         DEF PRAMD (DEFINES  PRAMETER WORD)
*         DEF CLASS (CLASS TO QUEUE REQUEST ON) 
*   EXIT  --- 
*          .
*          .
*  RCODE  DEC 19    CLASS CONTROL REQUEST CODE
*  CONWD  OCT NNNN  CONTROL INFO/LOGICAL UNIT # 
*  PRAM   DEC N     PRAMETER AS REQUIRED BY TYPE OF CODE
*  CLASS  DEC N     DEFINES CLASS TO USED IN GET CALL.
* 
*     THE CLASS CONTROL IS THE SAME AS THE STANDARD CONTROL EXCEPT
*     COMPLETION INFORMATION IS QUEUED ON THE DESIGNATED CLASS QUEUE. 
* 
*  C.    CLASS GET REQUEST FORMAT.
* 
*         EXT EXEC
*         JSB EXEC
*         DEF EXIT  (DEFINE RETURN ADDRESS) 
*         DEF RCODE (DEFINE REQUEST CODE ADDRESS) 
*         DEF CLASS (DEFINE CLASS ADDRESS)
*         DEF IBUFR (DEFINE BUFFER ADDRESS) 
*         DEF IBUFL (DEFINE BUFFER LENGTH)
*         DEF IRP1  ((RETURN PRAMETER 1 (OPTIONAL)) 
*         DEF IRP2  ((RETURN PRAMETER 2 (OPTIONAL)) 
*         DEF RCLAS (RETURN CLASS WORD ADDRESS)(OPTIONAL) 
*  EXIT   --- 
*          .
*          .
*  RCODE  DEC 21    REQUEST CODE FOR GET REQUEST
*  CLASS  OCT NNN   CLASS THE GET IS TO GET FROM. 
*  IBUFR  BSS N     BUFFER TO HOLD THE READ DATA
*  IBUFL  DEC N OR -N WORD OR CHARACTER LENGTH OF BUFFER
*  IRP1   BSS 1     OPTIONAL PRAMETER ONE RETURNED HERE 
*  IRP2   BSS 1     OPTIONAL PRAMETER TWO RETURNED HERE 
*  RCLAS  BSS 1     CLASS RETURN WORD.
* 
*  NOTES: 
*     THE CLASS WORD HAS THE FOLLOWING OPTIONS: 
*         BITS 0 - 7  CLASS TO BE USED
*         BITS 8 -12  CLASS SECURITY CODE 
*         BIT  13     DO NOT DEALLOCATE THE CLASS.  IF THIS BIT 
*                     IS NOT SET AND THE CLASS IS EMPTY (NO 
*                     COMPLETED OR PENDING REQUESTS) IT IS
*                     DEALLOCATED.
*         BIT  14     RETURN THE INFORMATION BUT DO NOT DEQUEUE 
*                     THE REQUEST (MUST MAKE ANOTHER REQUEST TO 
*                     DEQUEUE THE REQUEST). 
*         BIT  15     IF NO ENTRIES IN QUEUE RETURN TO PROGRAM
*                     (NORMAL ACTION IS TO SUSPEND UNTIL A
*                      REQUEST IS PUT ON THE QUEUE).
* 
*     THE RETURNED CLASS WORD (RCLAS) IS AS FOLLOWS:
*         BITS 0 - 7  SET TO THE REQUEST CODE SENT TO THE DRIVER I.E. 
*                     17 IS SET TO 1
*                     18 IS SET TO 2
*                     19 IS SET TO 3
*                     20 IS SET TO 1
* 
*     THE PARAMETERS IRP1/IRP2 ARE SET TO THE ORIGINAL REQUEST
*         PARAMETERS OPT1/OPT2.  THEY ARE PROTECTED FROM DRIVER 
*         MODIFICATION AND SO SHOULD BE AS SUPPLIED, EXCEPT IF
*         BIT 12 IN THE CONWORD IS SET "IRP1" POINTS TO 
*         THE BUFFER AREA THE SYSTEM USED (I.E. IT IS NONSENSE).
* 
*     THE A REGISTER ON RETURN IS SET AS FOLLOWS: 
*         A = -N    N IS THE NUMBER OF REQUESTS PENDING ON THE CLASS
*                   IN ONE'S COMPLEMENT [-(N+1)] = [-N-1] 
*                   (NO REQUEST HAS COMPLETED YET)
*         A = 10XXXX (WHERE 1 IS BIT 15, 0 IS BIT 14, 
*                     AND XXXX IS THE REST OF EQT5 WHEN THE 
*                     REQUEST EITHER WAS REJECTED BY THE DRIVER 
*                     OR WAS IMMEDIATELY COMPLETED BY THE DRIVER. 
*                     ON REJECT B = -1,ON IMMEDIATE COMPLETION
*                               B = TLOG. 
*         A = > 0   A IS THE STATUS (EQT5) OF THE DEVICE AT 
*                   COMPLETION OF THE REQUEST. (IF BIT 14 IS SET
*                    THE REQUEST CAUSED THE DEVICE TO GO DOWN). 
*                   B = TLOG IN THIS CASE.
* 
*     ON COMPLETION OF AN 18 REQUEST THE DATA BUFFER IS RETURNED
*     TO SYSTEM MEMORY. 
*     THE GET REQUEST WILL ALWAYS  GET A BUFFER WHICH IS THE
*     MINIMUM OF THE ALLOTTED SIZE ON THE GET AND THE BUFFER
*     IN THE QUEUE. THE CONTROL BUFFER (BIT 12 OPTION) IS AT THE
*     END OF THE ALLOTED BUFFER AND MAY BE RETURNED ON A GET IF 
*     THE BUFFER SUPPLIED WILL HOLD IT AND THE REQUEST WAS NOT A
*     CLASS WRITE (18) REQUEST. 
      SKP 
* CLASS I/O QUEUE FORMAT AND ITS USE
* 
*   THE CLASS QUEUE CAN BE IN FOUR DIFFERENT STATES.
*     15  14 13 12  11 10 09  08 07 06  05 04 03  02 01 00
*    ------------------------------------------------------ 
*    ! 0   0  0  0   0  0  0   0  0  0   0  0  0   0  0  0! 
*    ------------------------------------------------------ 
*    STATE 1:  CLASS DEALLOCATED, AVAILABLE 
* 
*     15  14 13 12  11 10 09  08 07 06  05 04 03  02 01  00 
*    -------------------------------------------------------
*    ! 0 !    A D D R E S S   O F  F I R S T   E N T R Y   !
*    -------------------------------------------------------
*    STATE 2:  POINTER TO FIRST ENTRY IN CLASS QUEUE
* 
*     15  14 13 12  11 10 09  08 07 06  05 04 03  02 01 00
*    ------------------------------------------------------ 
*    ! 1   0  X! SECURITY CODE  ! NUMBER OF PENDING REQS. ! 
*    ------------------------------------------------------ 
*    STATE 3:  CLASS ALLOCATED, NO ONE WAITING ON CLASS 
*              NUMBER OF PENDING REQUESTS COUNTER MAY BE 0-255
* 
*     15  14 13 12  11 10 09  08 07 06  05 04 03  02 01 00
*    ------------------------------------------------------ 
*    ! 1   1  X! SECURITY CODE  ! NUMBER OF PENDING REQS. ! 
*    ------------------------------------------------------ 
*    STATE 4:  CLASS ALLOCATED, SOMEONE WAITING (SUSPENDED) 
*              NUMBER OF PENDING REQUESTS COUNTER MAY BE 0-255
* 
*  ACTIONS TO BE TAKEN WHEN HANDLING A CLASS I/O OR GET REQUEST 
*  DEPEND ON THE CURRENT STATE OF THE CLASS QUEUE HEAD
*  GET REQUESTS:
*   STATE 1.  ABORT THE PROGRAM IO00, NO CLASS. 
*   STATE 2.  RETURN THE DATA FROM CLASS BUFFER 
*   STATE 3.  SET THE SOMEONE WAITING BIT(BIT14), SUSPEND PROGRAM 
*   STATE 4.  ABORT THE PROGRAM IO00, ONLY ONE PROGRAM MAY BE 
*             SUSPENDED PER CLASS.
*  CLASS I/O REQUESTS:
*   STATE 1.  STATE 3 IS SET UP, SECURITY CODE IS LOW 5 BITS OF 
*             PROGRAM ID NUMBER, COUNTER IS SET TO 1. 
*   STATE 2.  THE COUNTER AT END OF QUEUE IS INCREMENTED BY 1 
*   STATE 3.  THE COUNTER IS INCREMENTED BY 1.
*   STATE 4.  THE COUNTER IS INCREMENTED BY 1.
*  ON COMPLETION OF CLASS I/O REQUESTS: 
*   STATE 1.  ILLEGAL--SHOULD NEVER HAPPEN--BUFFER IS RETURNED
*             AND THE COMPLETION IS IGNORED.
*   STATE 2.  THE NEW DATA IS ADDED AT THE END OF THE LIST (FIFO) 
*             AND THE COUNTER IS DECREMENTED BY 1.
*   STATE 3.  THE NEW DATA IS ADDED AT THE END OF THE LIST (FIFO) 
*             AND THE COUNTER IS DECREMENTED BY 1.
*   STATE 4.  THE WAITING PROGRAM IS SCHEDULED AND THE COUNTER
*             IS DECREMENTED BY 1 AND THE SOMEONE WAITING BIT(BIT14)
*             IS CLEARED. 
      SKP 
.254  DEC 254 
$IORQ EQU * 
      CLA           SET CONTROL FLAG=0 TO MEAN
      STA CONFL     *REQUEST* SECTION ENTERED 
      STA TEMPL     AND 'DISC R/W USER REQ' FLAG
      STA CLASS     CLEAR THE CLASS WORD
      STA TEMP5     CLEAR LU FLAG FOR LU 0
* 
      CPA RQCNT     INSURE AT LEAST ONE PRAMETER
      JMP ERR01     - NO, ISSUE DIAGNOSTIC. 
* 
* 
* 
* 
      LDA DRQ2I     GET ADDR OF EXEC'S PRAMS
      STA TEMP1 
      LDA DPARM     GET ADDR OF DIRECT PARMS
      STA TEMP2 
      LDB N8        GET 8 PARMS DIRECT
GTPAR CLA           CLEAR (A) IN CASE 
      XLA TEMP1,I    NO PARM WAS PASSED 
      STA TEMP2,I 
      ISZ TEMP1 
      ISZ TEMP2 
      INB,SZB       DONE YET? 
      JMP GTPAR      NO 
* 
* CHECK FOR XLUEX (EXTENDED LU EXEC) REQUEST
* 
*       IF YES, FETCH THE SECOND WORD OF THE CON WORD 
*       AND SAVE IT AS PARM2 (FUNCTION CODE). NOTE THAT 
*       THE LU IS SAVED IN "REQLU". 
* 
*       NOTE ALSO THAT IF BIT 15, OF THE FIRST WORD OF THE CON
*       WORD (XLUEX ONLY), IS SET, NO SWITCHING OF THE LU TAKES PLACE.
* 
* 
* 
* 
      LDA PARM2     PRE-FETCH THE LU PARAMETER
      LDB $CALL     FETCH ENTRY FLAG FROM EXEC
      CLE,SSB,RSS  <0 = XLUEX ENTRY, >0 = EXEC ENTRY
      JMP OLD       EXEC ENTRY,LU IS SIX BITS WIDE
* 
      LDB RQP2      XLUEX ENTRY SO RQP2 IS A 2 WD PARM
      INB           ADVANCE TO 2ND WD (FUNCT CODE)
      SSB           CHECK FOR MEMORY WRAP 
      JMP RQERR     YEP--BAD PARAMETER. 
* 
      XLB B,I       FETCH FUNCTION CODE (2ND WORD OF RQP2)
      STB PARM2      AND SAVE IT FOR FUTURE USE 
* 
      LDB A         MOVE NO SWITCH OPTION TO (B)
      RSS           XLUEX LU IS 8 BITS WIDE-- SKIP EXEC WORK
* 
* 
* LOGICAL UNIT REFERENCE VALIDITY CHECK 
* 
***780221 GLM***
* 
* 
** NOTE: IF SIGN OF (B) IS SET, NO LU SWITCHING IS PERFORMED. 
* 
OLD   AND B77       ISOLATE LU TO 6 BITS FOR EXEC 
      ADA N1        TRANSLATE BY -1(XLUEX CONTINUES HERE) 
      AND B377      ISOLATE LU-1(NOTE LU 0=B377)
      STA REQLU     SAVE LU-1 FOR LATER USE 
      CPA B377      IF LU IS ZERO 
      JMP L.00X       DO IMMEDIATE COMPLETION THING 
* 
      SSB           IF NO SWITCH OPTION SET 
      JMP L.0       CONTINUE WITH SPECIFIED LU. 
* 
* 
*     CHECK FOR LU SWITCH REQUIRMENT
*     -BATCH FLAG=BIT 15 ID WORD 21 
*     -SESSION WORD=ID WORD 33
* 
      LDB XSUSP     FETCH POINTER INTO ID SEG 
      ADB .12       ADVANCE TO BATCH FLAG 
      LDA B,I       FETCH IT
      ADB .12       ADVANCE TO SESSION WORD 
      LDB B,I       FETCH IT
* 
      SZB           IF SESSION WORD =0
      SSB             OR IS < 0 THEN
      JMP NSESS         PROG IS NOT IN SESSION
* 
*     THE PROGRAM IS A SESSION PROGRAM. 
*     -BATCH SESSIONS USE THE SESSION SWITCH TABLE ONLY 
*     -THE REQUESTED LOGICAL UNIT MUST BE DEFINED FOR 
*      THIS SESSION'S USE (MUST BE IN IT'S SST) 
* 
*     JSB MPTAB     GO MAP IN TABLE PTN( IF DEFINED). RETURNS LOGICAL 
*                              ADDR IN (B). 
      LDA B,I       FETCH LENGTH OF SWITCH TABLE
      JSB SWTCK     GO SEE IF THIS LU IS SWITCHED 
       JMP ERR12    P+1 LU NOT DEFINED FOR SESSION USE
       JMP L.0.1    P+2 SWITCH FOUND, (A) AND TEMP1 ARE 
*                              SET TO THE SWITCHED LU BY SWTCK
* 
* 
*     THE PROGRAM IS NOT IN SESSION 
*       CHECK FOR BATCH SWITCH REQUIRMENT 
*       -(A)=ID WORD 21 (BATCH FLAG = BIT 15) 
* 
NSESS SSA,RSS       IS THIS A BATCH REQUEST?
      JMP L.0          NOPE-- USE PASSED LU 
* 
      LDA $LUSW     FETCH LENGTH OF BST 
      CMA,INA       SET IT NEGATIVE 
      LDB D$LUT     FETCH ADDR OF BST 
      JSB SWTCK     GO SEE IF LU SWITCHED 
L.0    LDA REQLU    P+1 NO SWITCH,USE SUPPLIED LU 
L.0.1  LDB A        P+2 SWITCH FOUND [IN (A) & REQLU] 
      CPB B377      IF 0 SPECIFIED
      JMP L.00X         DO IMMEDIATE COMPLETION THING 
**
      CPB .254      IF MAX LU, THEN SPOOL FILE HAS BEEN KILLED
       JMP ERR26     RETURN IO26 ERROR
* 
      CMA,CLE         CHECK FOR ZERO AND
      ADA LUMAX     FOR A VALUE GT THE LARGEST
      SEZ,RSS        DEFINED #. 
      JMP ERR02     - ERROR, OUTSIDE OF RANGE.
      ADB DRT       INDEX INTO THE DRT. 
      LDA B,I      GET EQT ASSIGNMENT.
      STA TEMP5     SAVE FOR 'WORD2' ROUTINE. 
      AND B77 
      CCE,SZA,RSS   IF ZERO 
      JMP L.00X      THEN DO IMMEADIATE COMPLETION THING
* 
      JSB $CVEQ    CONVERT TO ABS.EQT ADD(WILL MASK SUBCH.).
* 
      LDA EQT4,I
      AND B77       GET I/O SELECT CODE 
      SZA,RSS       IF SELECT CODE = 0
      JMP ERR03      GIVE IO03 ERROR
* 
* 
      SKP 
* 
* REQUEST CODE ANALYSIS 
* 
L.000 LDA RQP1     GET REQUEST CODE (PARAMETER 1).
      AND .15       KEEP LOW PART 
      STA RQPX      SAVE IT 
      CPA .13      TRANSFER IF
      JMP L.15      * STATUS * REQUEST. 
* 
      LDA REQLU     GET LU-1 AND DETERMINE
      JSB STADV      IF THE LU OR EQT ARE DOWN. 
      JMP L.014     IF DOWN, SUSPEND THE PROGRAM. 
* 
      LDA RQPX      UP, SO CONTINUE.
      LDB XPRIO,I   SET THE PRIORITY
      STB TEMP2     FOR LINK AND
      STB TEMP6     FOR BUFFERING 
      CPA .3        IF REQUEST IS <CONTROL> 
      JMP L.01      SKIP FURTHER ANALYSIS.
* 
      LDB RQCNT     CHECK # OF
      ADB  N3        PARAMETERS SUPPLIED
      SSB            FOR READ OR WRITE. 
      JMP  ERR01    -ERROR, LT 3. 
      LDA RQP1      GET THE RQ CODE 
* 
* BUFFER LEGALITY CHECK. VERIFY THAT BUFFER RESIDES WITHIN THE
* USER'S ADDRESS SPACE. 
* 
BFCK  LDB PARM4     GET THE LENGTH
      CLE,SSB,RSS    CONVERT TO 
      JMP BFCK1       WORDS IF
      BRS              CHARACTERS 
      CMB,INB           SET POSITIVE
BFCK1 STB TMP8           AND SAVE.
      CPA B21           IF CLASS READ 
      JMP L.01           SKIP BUFFER CHECK
      SPC 1 
      ADB N1        CALCULATE ADDR OF LAST WORD 
      CLO            IN BUFFER
      ADB RQP3       AND IN CASE IT'S PAST 32K
      SOC            ADDRESS SPACE, 
      JMP ERR04      GIVE ERROR MESSAGE 
* 
      STB LWABF      SAVE THE LAST WORD BUFFER ADDR.
      LDA RQP3       GET THE 1ST WORD ADDRESS.
      LDB XEQT       AND ID SEG ADDRESS 
      JSB COMN       IS THE 1ST WORD OF BUFFER IN COMMON ?
      JMP CHKWR      NO, SO JUST GO DO THE WRITE PROTECT CHECK. 
* 
      LDA LWABF      YES, IF 1ST WORD IN COMMON, THEN THE LAST
      LDB XEQT       WORD BETTER BE IN COMMON ALSO. 
      JSB COMN       IS IT ?? 
      JMP ERR04      NO !!!  WHEW !  THAT WAS A CLOSE ONE ! 
      JMP ALCOM      YES, THE WHOLE BUFFER IS IN COMMON.
* 
CHKWR LDB LWABF     BUFFER NOT IN COMM, NOW INSURE
      CLA            THAT THE LAST WORD IS IN MAPPED MEM. 
      RRL 6         SO SHIFT PAGE # TO (A), 
      ADA B40        ADD IN OFFSET FOR USER MAP *1940DLS* 
      CCB 
      CBX           SET X=-1 FOR READ 1 REG TO MEMORY 
      LDB DCURU     READ IT INTO 'CURUS'
      XMM 
      LDA CURUS 
      RAL           TEST BIT 14 
      SSA           WRITE PROTECTED?
      JMP ERR04      YES, ERROR 
* 
ALCOM LDA RQPX       NO ERROR 
      CLE,SZA,RSS   IF GET REQUEST
      JMP G.01      GO FINISH GET OPERATION 
* 
* CHECK FOR EQT LOCK
* 
L.01  LDA $ELTB,I   GET EQT. LOCK TABLE HEADER. 
      SSA,RSS       IF NOT_EMPTY BIT IS CLEAR,
      JMP L.019     SKIP EQT. LOCK CHECK. 
* 
      RAL,ARS       GET RID OF NOT_EMPTY BIT. 
      STA TEMP3     STORE TABLE LENGTH. 
      CMA,INA       COMPUTE 2'S COMPLE OF LENGTH
      STA LTEMP      AND SAVE IT. 
      LDB $ELTB     GET TABLE ADDR. 
      ADB .1        GET 1ST ENTRY ADDR. 
      LDA TEMP5     GET DRT ENTRY 1ST WORD. 
      AND B77       ISOLATE THE EQT. #. 
      SZA,RSS       IF IT'S THE DUMMY EQT. (VIZ., #0),
      JMP L.019      SKIP EQT. LOCK CHECK.
* 
L.016 CPA B,I       COMPARE WITH $ELTB ENTRY 1ST WORD.
      JMP L.017     JIF THIS EQT. IS LOCKED.
* 
      INB           NEXT ENTRY IN $ELTB.
      ISZ LTEMP     IF MORE ENTRIES EXIST IN $ELTB, 
      JMP L.016      GO LOOP. 
* 
      JMP L.019     SKIP LOCKED_TO_HIM CHECK IF UNLOCKED. 
* 
LTEMP NOP           2'S COMPLE OF #-OF-COMPARES YET UNDONE
* 
L.017 LDA B         GET ADDR OF $ELTB ENTRY WHICH MATCHED.
      ADA TEMP3     GET ADDR OF ENTRY'S 2ND WORD. 
      LDA A,I       GET THE WORD. 
      ELA,CLE,ERA   GET RID OF UPPERMOST BIT. 
      CPA XEQT      IF IT MATCHES CALLER'S ID SEG ADDR, 
      JMP L.018      GO CHANGE PRIOR. FOR FIFO PURPOSES.
* 
      JMP L.001     ELSE SUSPEND HIM ON $ELTB ENTRY.
* 
L.018 LDB C100K     SET 77777 
      STB TEMP2      FOR LINK PRIORITY
      CLB,INB         AND 1 
      STB TEMP6        FOR BUFFERING PRIORITY.
      JMP L.01A     SKIP LU LOCK CHECK SINCE EQT LOCK IS BOSS 
      SKP 
* 
* CHECK FOR LU LOCK 
* 
L.019 LDA TEMP5     GET DRT ENTRY WORD 1
      RRR 6         GET LOCK BITS TO LOW A. 
      AND B37       ISOLATE LOCK BITS.
      SZA,RSS       IF NO LOCK ON THIS LU,
      JMP L.01A      SKIP LOCKED_TO_HIM? CHECK. 
* 
      STA TEMP3     SAVE RN FOR PASS TEST.
      LDB C100K     SET 77777 
      STB TEMP2      AS LINK PRIORITY 
      CLB,INB         AND 1 
      STB TEMP6        AS BUFFERING PRIORITY
      ADA D$RN      INDEX INTO
      STA XTEMP,I    RN TABLE 
      LDA A,I       GET ENTRY 
      AND B377      ISOLATE OWNER'S OFFSET
      STA TEMPW     (STASH IT AWAY) 
      ADA KEYWD     PICK UP ID SEG ADDR OF
      ADA N1         OWNER FROM KEYWD 
      LDA A,I         TABLE ENTRY.
      CPA XEQT      IS THIS THE LOCK OWNER'S REQUEST ?
      JMP L.01A      YES, SO CONTINUE.
* 
      LDA PARM9     NO, SO SEE IF HE'S GOT
      XOR TEMP3      THE KEY (I.E., RN #) 
      ALF,ALF         IN PARAMETER LIST.
      XOR TEMPW     MILLION DOLLAR QUESTION 
      SZA            DOES SUPPLIED RN MATCH OWNER'S RN ?
      JMP L.002     NO, SO SUSPEND CALLER 
* 
L.01A LDA RQPX      GET LOW BITS OF REQUEST CODE SAVED BEFORE 
      CPA .3        IS THE REQUEST OF THE CONTROL ILK?
      JMP L.020     -YES, SO SKIP SOME FURTHER ANALYSIS.
* 
      LDB RQCNT     GET REQUEST COUNT 
      ADB N5        AND SET 'E' FOR FIVE PRAM TEST
      LDA EQT5,I    CHECK REFERENCED DEVICE 
      AND B36K      FOR BEING A 
      CPA B14K       DISC FILE (DVR30,31,32,33) 
      RSS 
      JMP L.02     NO, UNIT IS NOT DISC.
      STA TEMPL     SET 'DISC R/W USER REQ' FLAG
      SKP 
* 
* DISC ACCESS VALIDITY CHECK. 
* 
      LDA RQP1      CLASS REQUESTS
      ALF,ALF       TO THE DISC 
      ALF,SLA       ARE NOT 
      JMP ERR02     ALLOWED.
* 
      SSB           DISC REQUEST MUST HAVE 5 PRAMS. 
      JMP ERR01     -ERROR-.
* 
      LDB REQLU     GET (LU-1)
      CPB .1        IF LU # 2 OR 3, 
      RSS            SET INTO LOW 
      CPB .2         BITS OF 'DISC
      INB,RSS        R/W USER REQ'
      JMP DPOPT,I   FLAG.  IF USER DISC JUMP ON PROTECT OP. 
*                                   L.10 IF NOT PROTECTED ELSE L.012
      ADB TEMPL 
      STB TEMPL 
* 
      LDA PARM5    GET TRACK ADDRESS FROM 
      AND B377
      STA TEMP0      REQUEST  -  SAVE.
      LDA TATLG    COMPUTE POSITIVE 
      ADA TATSD     LENGTH OF 
      CMA,INA        AUXILIARY DISC IN *TAT*. 
      SLB,RSS       IF REF TO SYSTEM DISC (LU #2),
      LDA TATSD      USE SYS DISC SIZE. 
      CMA,INA      SUBTRACT MAX SIZE
      ADA TEMP0     FROM USER TRACK #.
      SSA,RSS 
      JMP ERR05     -ERROR, ILLEGAL TRACK #.
* 
      LDA SECT2     (A)= # SECTORS/TRACK FOR LU #2
      SLB           IF LU FOR REQUEST = 3,
      LDA SECT3      SET (A) = # SECTORS FOR LU #3
      CMA,CLE,INA   SET VALUE NEG.
      LDB PARM6    GET SECTOR ADDRESS 
      ADB A          ERROR
      CCB,SEZ        IF STARTING SECTOR LESS THAN 0 
      JMP ERR05     OR GREATER THAN TRACK SIZE. 
* 
      ADB TMP8      CHECK FOR TRACK OVERFLOW
      BRS,BRS      DIVIDE BUFFER LENGTH 
      BRS,BRS       (IN WORDS)
      BRS,CLE,BRS       BY 64(10) 
      ADB PARM6     ADD STARTING SECTOR # 
      STB TMP8      SAVE FOR L.G. UPDATE
      ADB A         ERROR IF LAST SECTOR
      CLA,SEZ,INA    GT=
      JMP ERR08      LIMIT (EXCEEDS TRACK BOUNDARY) 
* 
      CPA RQP1      INPUT IS ALLOWED TO REFERENCE ANY 
      JMP L.10       TRACK. 
* 
      LDA TEMP0    (A) = TRACK #. 
      LDB REQLU     (LU-1) TO (B).
      SLB,RSS       IF REF TO LU #3 ADD 
      ADA TATSD       SYS DISC SIZE TO TRACK #. 
      ADA TAT      INDEX TO TRACK ASSIGNMENT TABLE. 
      LDA A,I      GET REFERENCED TRACK ASSIGNMENT. 
      CPA XEQT      (ID SEGMENT ADDRESS). IF SAME AS
      JMP L.10      REQUESTOR, ALLOW ACCESS.
* 
      CPA C100K     ALLOW ACCESS IF TRACK IS
      JMP L.10       GLOBALLY ASSIGNED. 
* 
      INA           IF FMP TRACK THEN 
      CPA C100K     GO CHECK
      JMP L.012     FOR LEGAL CALL. 
* 
* CHECK FOR LOAD-AND-GO ACCESS
* 
      ERB,ERB       CONSTRUCT 
      LDB TEMP0     L.G. WORD 
      BLF,BLF       FOR CURRENT RQ. 
      ERB           SET SIGN IF LU 3. 
      ADB PARM6     SET SECTOR IN LOW BITS
      CPB LGOC      IF NOT = TO CURRENT LGO 
      CLA,RSS        ADDRESS, THEN
      JMP L.011      GO TO CHECK FOR "LOADR". 
* 
* UPDATE FOR NEXT LGO ACCESS - THIS ACCESS ALLOWED
* 
      ISZ TMP8      SAVE THE NEXT SECTOR ADDRESS IN TMP8
      CPA LGOTK     IS LGO AREA IS ASSIGNED.
      JMP L.011     -NO, CHECK LOADR. 
* 
      LDA SECT2     SET (A) TO APPROPRIATE
      RBL,SLB,ERB    # SECTORS (SET E IF LU 3)
      LDA SECT3      PER TRACK FOR LU #.
      CPA TMP8      IF NEW SECTOR EXCEEDS TRACK,
      CLA,RSS        GO TO UPDATE TRACK #.
      JMP L.010     -NO OVERFLOW. 
* 
      STA TMP8      SET SECTOR # TO 0.
      ISZ TEMP0     ADD 1 TO TRACK #. 
      LDA LGOTK     GET LGO TRACK ASSIGNMENT WORD.
      AND B177      -ADD #
      STA B          OF TRACKS
      XOR LGOTK      ASSIGNED 
      CLE,ELA       LU BIT TO E.
      ALF,ALF        TO STARTING
      ADA B          CHECK
      CPA TEMP0      FOR OVERFLOW.
      JMP ERR09     ---YES, '09' ERROR AND ABORT. 
* 
L.010 LDA TEMP0     RECONSTRUCT TRACK 
      ALF,ALF        THE CURRENT
      ERA            LGO AREA 
      IOR TMP8       DISC 
      STA LGOC       RESET. 
      JMP L.10
      SPC 1 
* 
*   I\O REQUEST ON A DOWN LU OR EQT 
* 
*   ISSUE IONR MESSAGE TO USER TERM AND THE SUSPEND PROG
* 
* 
L.014 LDA XEQT      GET POINTER TO THE ID SEGMENT 
      JSB NSBIT     IS THE "NO SUSPEND" BIT SET ? 
      JMP ERR14     YES, DON'T SUSPEND. PASS BACK IO14 ERROR. 
*                   DON'T PRINT IO MESSAGE, THE PROGRAM HANDLES IT
* 
      LDA REQLU     SAVE REQUEST LU 
      CCE,INA          (ADJUST FOR INTERNAL STRUCTURE--LU-1)
      STA XTEMP+1,I    BEFORE TEMP (REQLU) IS MODIFIED
* 
      LDA EQT1      FETCH ADDRESS OF EQT1 
      STA HEAD      SET UP FOR LUERR CALL 
      LDA A,I       SAVE ADDRESS OF CURRENT REQUEST 
      STA STMP3      FOR POSSIBLE ERROR ECHO WORK.
      LDA TEMP5     FETCH DRT WD2 OF DOWN DEVICE
      AND C3700     REMOVE LOCK INFO
      STA TEMP8     SET UP FOR LUERR CALL 
      AND B77       ISOLATE EQT#
      STA XTEMP+2,I  *1940* SAVE IT IN ID TEMP WD 3 
      JSB $CNV1       AND CONVERT IT TO ASCII (DECIMAL) 
      STA IOMSG+6       AND SET INTO MESSAGE
      LDA TEMP8     FETCH EQT SC WORD 
      ALF,RAL         ISOLATE SUBCHANNEL
      AND B37         CONVERT IT
      JSB $CNV1          TO ASCII THEN
      STA IOMSG+8        SET IT INTO THE ERROR MESSAGE
      LDA ASNR      FETCH ASCII "NR"
      STA IOMSG+1      AND SET IT INTO ERROR MESSAGE
* 
      DLD ASTER     DEVICE STATUS COULD BE INVALID
      DST IOMSG+9     SO REPLACE IT WITH "***"
* 
      CCA           PRINT ONLY ON SESION(MTM) TERMINALS 
      JSB LUERR     GO ISSUE THE ERROR
      LDB .4        4 TO B
L.013 STB XTEMP,I   SET 4 IN FIRST WORD OF TEMP AREA. 
L.015 JSB $LIST     PUT PGM IN WAIT LIST
      OCT 503       UNTIL DEVICE COMES UP.
      JMP $XEQ      EXIT TO DISPATCHER
* 
L.001 STB XTEMP,I  IF WE SUSPEND, DO IT ON EQT LOCK TABLE 
L.002 LDA XEQT     GET POINTER TO ID SEGMENT
      JSB NSBIT    IS THE "NO SUSPEND" BIT SET ?
      JMP ERR13     YES, DON'T SUSPEND. PASS BACK IO13 ERROR
      JMP L.015     NO, GO SUSPEND PROGRAM
* 
ICOMX NOP           DUMMY EQT FOR LU=0
B36K  OCT 36000 
.12   DEC 12
B14K  OCT 14000     EQT4 OF DUMMY(BITS 0-5 = 0).
.13   DEC 13
TEMP1 NOP           EQT6 OF DUMMY 
N3    DEC -3
N5    DEC -5
C100K OCT 77777 
$DMEQ DEF ICOMX     ADDRESS OF DUMMY EQT
DPOPT DEF L.10      DISC PROTECT OPTION (L.012 IF PROTECTED)
B40   OCT 40
DRQ2I DEF RQP2,I
DPARM DEF PARM2     ADDRESS OF ACTUAL PARAMETERS
PARM2 NOP           ACTUAL USER PARAMETER #2
PARM3 NOP           ACTUAL USER PARAMETER #3
PARM4 NOP           ACTUAL USER PARAMETER #4
PARM5 NOP           ACTUAL USER PARAMETER #5
PARM6 NOP           ACTUAL USER PARAMETER #6
PARM7 NOP           ACTUAL USER PARAMETER #7
PARM8 NOP           ACTUAL USER PARAMETER #8
PARM9 NOP           ACTUAL USER PARAMETER #9
ASTER ASC 2, ***
REQLU NOP 
      SPC 2 
L.00X LDA $DMEQ     SET UP DUMMY EQT FOR LU=0 
      JSB $ETEQ     ON BASE PAGE
      JMP L.000     CONTINUE PROCESSING 
      SPC 2 
      SKP 
* 
* 
*     SWTCK       (SWITCH TABLE CHECK)
* 
*  SCAN THE SPECIFIED TABLE (LOW BYTE OF SESSION OR BATCH SWITCH TABLE) 
*  FOR A MATCH  WITH THE VALUE IN TEMP1.
* 
*  CALLING SEQUENCE:LDA -LENGTH 
*                   LDB ADDRESS OF TABLE(POINTS AT LENGTH)
*                   REQLU  = ISOLATED SEARCH LU (LU-1)
*                   JSB SWTCK 
*      RETURN P+1    NO SWITCH FOUND
*             P+2    SWITCH FOUND,(A) AND REQLU = SWITCHED LU 
* 
* 
* 
SWTCK NOP 
      STA STMP1    SAVE NEG LENGTH
SWT.0 INB           ADVANCE TABLE ADDRESS 
      LDA B,I       FETCH ENTRY 
      AND B377      IF SAME 
      CPA REQLU       AS CURRENT LU 
      JMP SWT.1          GO SWITCH IT 
* 
      ISZ STMP1     STEP COUNT
      JMP SWT.0    AND LOOP 
      JMP SWTCK,I   UNTIL DONE--NO MATCH FOUND,RTN P+1
* 
SWT.1 LDA B,I       FETCH SWITCH TABLE WORD 
      ALF,ALF       USE HIGH HALF OF TABLE
      AND B377      ISOLATE "NEW" LU
      STA REQLU     SET THE NEW LU (LU-1) 
      ISZ SWTCK     MATCH FOUND, RTN P+2
      JMP SWTCK,I   CONTINUE AT P+2, (A) ALSO = NEW LU
* 
* 
STMP1 BSS 2         NEED 2 WORDS FOR $PSTE
      SPC 5 
RQERR DLD ASRQ      FETCH ASCII "RQ  "
      JSB $ERMG     GO ISSUE ERROR AND ABORT
      JMP $XEQ      CONTINUE
* 
ASRQ  ASC 2,RQ
      SKP 
* ALLOW PRIVILEGED ACCESS TO "LOADR" TO PERMIT
*  UPDATING OF ID SEGMENTS AND PROGRAMS ON THE
*  SYSTEM AREA OF THE DISC. 
* 
L.011 LDB XEQT      COMPARE 
      ADB .12        NAME 
      LDA B,I        3
      CPA LDRNM      WORD 
      INB,RSS        AREA 
      JMP ERR06      IN 
* 
      LDA B,I        CURRENT
      CPA LDRNM+1    ID 
      INB,RSS        SEGMENT
      JMP ERR06      WITH 
* 
      LDA B,I        'LOADR'
      AND C377      -IF 
      CPA LDRNM+2    SO,
      JMP L.10       ALLOW FULL ACCESS
* 
      JMP ERR06     - ERROR - 
* 
LDRNM ASC 2,LOAD    L O A D 
      OCT 51000      R  -ZERO-
      SPC 1 
B177  OCT 177 
B74K  OCT 74000 
B160K OCT 160000     KEEP BITS 13-15
LWABF NOP 
      SPC 2 
L.012 LDA PARM2     FMP TRACK 
      LDB RQP1
      AND B74K      IF FLAG SET 
      SLB,RSS       OR IF READ
      CPA B74K      THEN ALLOW
      JMP L.10      ACCESS. 
* 
      JMP ERR06     ELSE ILLEGAL DISC WRITE.
      SKP 
L.02  CLA,SEZ,RSS   IF BIT 12 OF CONWORD
      LDA PARM2     SET AND 
      ALF,SLA       NOT FIVE PRAMS
      JMP ERR01     TAKE GAS! 
* 
L.020 LDB RQPX      GET THE MASKED REQUEST
      CPB RQP1      IF STANDARD I/O 
      JMP L.027     SKIP THE CLASS CODE 
      SKP 
* 
* 
*     CLASS I/O  ALLOCATE CLASS FROM HIGH END OF TABLE
*                IF HE DID NOT SPECIFY A CLASS. 
* 
      CLA,CLE       E=0 IF USE OLD CLASS NUMBER 
      STA XA,I      A=0 FOR INIT.GOOD RETURN
      LDA RQP7       ADDR FROM THE REQUEST
      CPB .3        IF CONTROL REQUEST (19) 
      LDA RQP4       USE THE CONTROL CLASS WORD 
      SZA,RSS       IF CLASS WORD ADDR = 0
      JMP ERR01      FLUSH IT OUT.
* 
      STA TEMP3     SAVE ADDR OF CLASS WORD 
      XLA TEMP3,I     USER'S CLASS WORD 
      AND B160K      GET BITS 15,14, AND 13 
      STA SECCD 
L.025 XLA TEMP3,I   GET CLASS WORD
      STA CLASS     SET THE CLASS WORD
      AND B377      MASK TO THE CLASS DEF.
      STA B          SAVE CLASS NUMBER IN B 
      CMA,INA,SZA   IF SUPPLIED 
      JMP L.021     SKIP ALLOCATION CODE
* 
* 
*     ALLOCATE A CLASS FROM THE HIGH END OF THE TABLE 
* 
      LDB XEQT      GET ID SEG ADDR 
      JSB $IDNO      CONVERT TO ID #
      LDA B37        FOR USE AS SECURITY CODE 
      AND B 
      ALF,ALF 
      IOR SECCD     FILL IN USER'S BIT15,14,13
      XSA TEMP3,I    FOR RETURN AS CLASS NUMBER 
* 
      LDA $CLAS     GET THE LENGTH OF THE TABLE 
      ADA DCLAS     ADD THE TABLE ADDRESS 
* 
L.022 LDB A,I       GET THE ENTRY TO B
      CCE,SZB,RSS   IF FREE (0) 
      JMP L.023     GO USE IT 
* 
      ADA N1        NO STEP TO NEXT ONE 
      CPA DCLAS     END OF TABLE? 
      CCA,RSS       YES SKIP (A = -1) 
      JMP L.022     NO - GO TEST NEXT ONE.
* 
L.026 STA XA,I      SET REASON FOR REJECT IN A REG. 
      LDB DCLAS     SET B=CLASS TABLE ADDR
      LDA CLASS      FOR L.013 IN CASE OF SUSPEND 
      SSA           NO-WAIT REQUESTED?
      JMP L.16       NO, GIVE NO CLASS STATUS 
* 
      JMP L.013      YES, SUSPEND UNTIL CLASS AVAILABLE 
* 
L.023 STA PTR       SAVE CLASS QUEUE WORD ADDR
      XLB TEMP3,I   GET SECURITY CODE AND USER BIT
      ADA MCLAS     SUBTRACT THE CLASS TABLE ADDRESS
      IOR B         ADD SECURITY CODE AND USER BIT
      XSA TEMP3,I   RETURN NEW CLASS WORD TO USER 
      AND B174C     GET SECURITY CODE FOR CLASS QUEUE-HEAD
      RAL,ERA        SET THE ALLOCATED BIT
      STA PTR,I     PUT INTO CLASS QUEUE
      CCE           SET E=1 AGAIN FOR NEW ALLOC 
      JMP L.025     GO SET UP 
* 
L.021 ADB DCLAS     USE CLASS# (IN B) TO INDEX AND
      STB PTR       SET POINTER TO TABLE
      STA B 
      LDA CLASS     GET CLASS WORD
      AND B174C      SAVE REAL SECURITY CODE
      STA SECCD 
      LDA PTR,I     GET CONTENTS
      SEZ,CLE,RSS   IF NOT NEW ALLOCATION 
      SZA            AND NOT ALLOCATED, FORCE ERROR 
      ADB $CLAS     IF OUTSIDE OF TABLE 
      CLB,SEZ,RSS    THEN 
      JMP ERR00     SEND ERROR 'IO00' 
* 
      LDA PTR 
L.13A STA B         SET B TO ADDR OF QUEUE ENTRY
      LDA B,I       GET CONTENTS
      SSA,RSS       A POINTER?
      JMP L.13A      YES, TRACE IT MORE 
* 
      AND B174C     GET SECURITY CODE FROM QUEUE
      CPA SECCD     COMPARE IT WITH USER'S
      RSS           DOES IT MATCH?
      JMP ERR00      NO, ERROR 'IO00' 
* 
      STB SECCD     SAVE QUEUE ENTRY ADDR IN SECCD
      LDB RQPX      GET THE MASKED REQUEST CODE 
      JMP L.028     AND GO DO THE BUFFER THING
      SKP 
* 
* CHECK FOR AUTOMATIC BUFFERING REQUIREMENT 
* 
L.027 CPB .1        SKIP CHECK IF REQUEST 
      JMP L.10       IS INPUT.
* 
      LDA EQT4,I   CHECK THE UNIT DESCRIPTOR
      RAL           WORD IN ITS EQT ENTRY,BIT 14, 
      SSA,RSS        FOR BUFFERING. 
      JMP L.10      -NO 
* 
      LDA PARM2     DYNAMIC STATUS
      AND B3700     REQUESTS
      ADA B         ARE NEVER 
      CPA B603      BUFFERED
      JMP L.10      DYNAMIC STATUS DO STD. USER RQ. 
* 
* 
* AUTOMATIC BUFFERING SECTION 
* 
L.028 CLA 
      STA TMP6
      CPB RQP1      IF NOT CLASS, USE 5 WORDS FOR CONTROL 
      LDA N2        USE 5 WORDS FOR CONTROL REQUEST 
      CPB .3       IF REQUEST IS FOR -CONTROL-, 
      JMP L.03      SKIP BUFFER SIZE CHECK. 
* 
      LDA TMP8      GET THE XFER LENGTH 
      STA TEMP3     -SET AS MOVE INDEX- 
      LDB PARM2     IF DOUBLE BUFFER REQUEST
      BLF,SLB       THEN
      RSS 
      JMP L.03
* 
      LDB PARM6     GET SECOND BUFFER SIZE
      SSB,RSS       NEGATIVE CHARACTER COUNT? 
      JMP L.029      NO, USE WORD COUNT 
* 
      BRS            YES, CONVERT TO WORDS
      CMB,INB 
L.029 LDA B         GET SECOND BUFFER SIZE
      ADA TMP8       ADD TO FIRST BUFFER
      STB TMP6      SAVE SECOND BUFFER SIZE 
L.03  ADA .8        ADD 8 FOR BLOCK CONTROL WORDS.
      LDB RQPX      GET MASKED REQ. CODE
      CPB RQP1      IF NOT CLASS REQUEST
      ADA N1         THEN SUBTRACT 1
      STA L.04       AND SET UP IN CALL 
* 
      SSA           IF BUFFER SIZE IS NEGATIVE (TOOOOOO BIG)
       JMP ERR04    REJECT THE REQUEST WITH IO04. 
* 
      LDA N41       IF PRIORITY 
      ADA XPRIO,I   LT 41 THEN
      SSA           DO NOT DO BUFFER LIMIT
      JMP L.031     TEST
* 
      LDB $BLUP     CHECK IF BEYOND THE LIMIT IN WORDS
      JSB QCHK      ON THIS DEVICE
      JMP L.040     YES GO CHECK FOR CLASS RQ 
* 
* ALLOCATE BLOCK IN TEMPORARY STORAGE 
* 
L.031 JSB $ALC     CALL AT SYSTEM ENTRY POINT 
L.04  NOP           - REQUESTED LENGTH OF BLOCK - 
       JMP L.041    NEVER ANY MEMORY, TRY NO BUFFER.
       JMP L.042    NO MEMORY NOW, SUSPEND. 
      JMP L.06       ALLOCATION OK. 
* 
L.040 LDA CLASS     IF CLASS AND NO SUSP. 
      SSA,RSS       ON BUFFER LIMIT SKIP TO EXIT
      JMP L.013     ELSE GO SUSPEND 
* 
* NO MEMORY AVAILABLE FOR BLOCK - CALLING USER
*  PROGRAM IS TO BE LINKED INTO MEMORY SUSPENSION 
*  $LIST AND RE-SCHEDULED AT POINT OF REQUEST 
*  WHEN A PREVIOUSLY ALLOCATED BLOCK IS RELEASED. 
* 
L.042 LDA N2        IF CLASS I/O CHECK
      LDB CLASS     FOR NO SUSP OPTION
      SSB            IF SET 
      JMP L.026     GO SET FLAG AND EXIT
* 
      SZB           IS THIS A CLASS REQUEST ? 
      JMP L.043     YES, GO MEMORY SUSPEND. 
      LDA XEQT      POINT AT THE ID SEGMENT.
      JSB NSBIT     IS "NO SUSPEND" BIT SET ? 
      JMP L.10      YES, PROCESS THE REQUEST UNBUFFERED.
* 
L.043 JSB $LIST    NO, CALL TO LINK PROGRAM INTO
      OCT 504       MEMORY SUSPENSION LIST. 
      JMP $XEQ
* 
L.041 LDA CLASS     NEVER ENOUGH MEMORY 
      SZA             IF CLASS REQUEST
      JMP ERR04      ABORT PROGRAM IO04 
* 
      JMP L.10      ELSE GO UNBUFFERED. 
* 
SECCD NOP 
B603  OCT 603 
N41   DEC -41 
      SKP 
* 
* 
*  SET REQUEST PARAMETERS, PROGRAM PRIORITY AND 
*   USER BUFFER INTO TEMPORARY BLOCK. 
* 
L.06  STB L.04     SET ACTUAL BLOCK LENGTH. 
      STA TEMP1    SAVE BLOCK 
      CLE,INA 
      STA TEMPW      SAVE ADDRESS 
      JSB WORD2     ASSEMBLE CONTROL WORD 
      LDB RQP1      IF A CLASS
      CPB RQPX      REQUEST 
      CLE            THEN 
      RAL,ERA       SET THE <T> FIELD TO 3
      IOR B40K     SET <T> = 1 FOR BUFFERING. 
      LDB TEMPW 
      STA B,I       AND SET IN WORD 2 OF BLOCK. 
      INB 
      LDA TEMP6    SET REQUESTING PROGRAM PRIORITY
      STA B,I       IN WORD 3.
      INB 
      LDA L.04     SET BLOCK LENGTH IN
      STA B,I       WORD 4. 
      INB 
      LDA TEMPW,I   GET THE CONWORD 
      SSA,RSS       IF STANDARD REQUEST 
      JMP L.061     SKIP
* 
      LDA CLASS     ELSE SET THE CLASS
      STA B,I       WORD IN 
      INB            THE BUFFER 
L.061 LDA .3       IF REQUEST 
      CPA RQP1      IS STANDARD CONTROL, SKIP 
      JMP  L.08      BUFFER MOVE
* 
      LDA PARM4    SET USER BUFFER LENGTH 
      STA B,I       IN WORD 5.
      CMA,CLE,INA  SET E IF ZERO LENGTH BUFFER (SAVE A CYCLE IF SO) 
      LDA PARM5     GET FIRST OPTIONAL WORD 
      INB           STEP TO STORE LOCATION
      STB TEMPW     SAVE THE ADDRESS OF THE LOCATION
      STA B,I       SET IT
      INB           SET FOR NEXT WORD 
      LDA PARM6     GET SECOND OPTIONAL WORD
      STA B,I       SET IT IN THE BUFFER
      LDA RQP1      IF CLASS READ OR
      CPA B23       IF CLASS CONTROL, 
      JMP L.078      GO FINISH ITS SET UP 
* 
      CPA B21       IF CLASS READ 
      ADB TMP8      ADJUST BUFFER ADDRESS FOR DOUBLE BUF. 
      SEZ,CLE,INB,RSS  IF LENGTH = 0, 
      CPA B21       OR CLASS READ 
      JMP L.075     SKIP BUFFER MOVE. 
* 
* MOVE USER BUFFER TO TEMPORARY BLOCK.
* 
      LDA RQP3     SET USER BUFFER
L.065 EQU *         ADDRESS FOR MOVE. 
      LDX TEMP3     GET # WORDS TO MOVE 
      MWF           MOVE INTO SYSTEM MAP FROM USER MAP
* 
L.075 LDA TMP6      GET LENGTH OF SECOND BUFFER 
      STA TEMP3     SET FOR MOVE
      LDA PARM2     GET THE REQUEST CONTROL WORD
      ALF,SLA       IF FIRST TIME AND DOUBLE BUFFER 
      SEZ,CCE       SKIP
      JMP L.13      ELSE CONTINUE 
* 
      STB TEMPW,I   SET BUFFER ADDRESS IN REQUEST 
      LDA RQP5      GET USER BUFFER ADDRESS 
      JMP L.065     GO MOVE THE BUFFER
* 
L.078 ADB N2        CORRECT (B) FOR CLASS CONTROL 
L.08  LDA PARM3    FOR CONTROL REQUEST, SET WORD 3
      STA B,I       (PARAM) IN PLACE OF RECORD
      JMP  L.13      LENGTH.
      SPC 2 
B21   OCT 21
B23   OCT 23
D$RN  DEF $RNTB+0   DIRECT ADDRESS OF RN TABLE
      SKP 
      SPC 2 
* 
* REQUEST IS A NORMAL WRITE, CONTROL OR READ. 
*  THE PARAMETERS OF THE REQUEST ARE MOVED
*  INTO THE ID SEGMENT OF THE REQUESTING
*  PROGRAM. THE ID SEGMENT IS THEN LINKED 
*  INTO THE I/O LIST FOR THE REFERENCED DEVICE. 
*  THE -SCHEDULER- IS THEN CALLED TO REMOVE 
*  THE PROGRAM FROM THE SCHEDULED LIST AND TO 
*  CHANGE THE PROGRAM STATUS TO I/O SUSPENSION. 
* 
* 
L.10  CLE           CLEAR (E) FOR WORD2 CALL LATER
      LDB PARM3     GET CONTROL WORD
      LDA RQP1      (A) = REQUEST CODE. 
      CPA .3        IF CONTROL GO 
      JMP L.101     SET IT UP 
* 
      LDB XTEMP+4   GET THE ADDRESS OF THE RENT 
      ADB .15       BIT IN THE ID-SEG.
      LDA B,I       GET THE WORD TO A 
      ALF,RAL       PUT THE BIT IN SIGN OF A
      LDB RQP3      BUFFER ADDRESS TO B 
      CLE,SSA       IF BIT SET
      JSB $REIO     GO MOVE THE TDB (IF NEEDED) 
* 
      CLA,SEZ       DID WE CALL $REIO?
      CPA $MVBF     -YES, BUT DID $REIO MOVE THE BUFFER?
      CLE,RSS        -NO. $REIO NOT CALLED OR BUFFER NOT MOVED. 
      ADB MSIGN     E-REG IS SET. $REIO CALLED & BUFFER MOVED.
      STB XTEMP+1,I SET BUFFER ADDRESS OR CONTROL WORD
      LDA PARM4      BUFFER 
      STA XTEMP+2,I   LENGTH AND
      LDA PARM2     GET THE CON WORD
      CMA,CME       SET COMPLEMENT
      IOR TEMPL     MIRGE WITH DISC FLAG
      LDB RQP5      GET SECOND BUFFER ADDRESS 
      ALF,SLA       IF NONE 
      SZB,RSS       IF NONE USE 
      JMP L.102     ZERO
      XLB B,I       GET THE OPTION WORD 
L.102 SEZ,SLA,RSS   IF RENT AND DOUBLE BUFFER 
      JSB $REIO     GO CHECK OUT THE BUFFER ADDRESS 
      STB XTEMP+3,I SET THE PRAMETER IN THE ID-SEGMENT
* 
      LDA PARM6     SET THE FINAL OPTIONAL WORD 
      STA XTEMP+4,I IN THE ID-SEGMENT 
* 
      CLE,RSS        SKIP CONTROL SET UP
L.101 STB XTEMP+1,I SET CONTROL WORD
      JSB WORD2     ASSEMBLE CONTROL WORD (E)=0 ALREADY 
      STA XTEMP,I    SAVE IN TEMPORARY #1 
      LDB XEQT      SET ADDRESS OF LINK WORD
      STB TEMP1      IN TEMP1.
* 
      JSB $LIST     CALL SCHEDULER TO SUSPEND PROG. 
      OCT 402       - ID SEG. ADDR./I/O SUSPEND - 
* 
* CALL -LINK- TO PERFORM THE LINKING OF THE NEW 
*             BLOCK INTO THE DEVICE QUEUE OF
*             WAITING OPERATIONS. 
* 
L.13  LDA RQP1      IF STANDARD I/O 
      CPA RQPX      THEN
      JMP L.131     GO UP DATE AND EXIT 
* 
*     CLASS I/O SO SET THE CLASS QUEUE TO SHOW
*     ANOTHER REQUEST IS PENDING. 
* 
      LDA SECCD,I 
      INA           INCREMENT CLASS QUEUE COUNT BY 1
      STA SECCD,I 
      JMP L.132     SKIP XSUSP SET UP 
* 
* 
L.131 LDB XSUSP,I   SET THE SUSP POINT
      STB XA,I      IN XA FOR THE ABORT ROUTINE 
L.132 LDA RQRTN     AND SET THE RETURN ADDRESS
      STA XSUSP,I   IN THE ID-SEG.
      JSB LINK       LINK SETS E=0 IF EMPTY QUEUE 
      LDB EQT1      IF DUMMY EQT FOR LU=0 
      CPB $DMEQ     THEN
      JMP L.135     GO TO COMPLETE
* 
* 
      SEZ,RSS       IF QUEUE WAS EMPTY CALL DRIVR.
* 
* EMPTY LIST, CALL TO INITIATE CURRENT REQUEST. 
* 
      JSB DRIVR 
      JMP $XEQ      - OPERATION INITIATED - 
      JMP NOTRD     - OPERATION REJECTED OR COMPLETED - 
* 
L.135 LDB PARM4     GET THE REQUEST LENGTH
L.136 SSB           AND SET UP
      CMB,INB       THE TLOG
      LDA .2        SET A FOR IMMEDIATE COMPLETION
      JMP R00       AND GO TO COMPLETION SECTION
* 
      SKP 
*  STATUS REQUEST SECTION 
* 
L.15  LDA RQCNT     INSURE THAT AT LEAST 2
      ADA N2         PARAMETERS PROVIDED - ONE
      SSA            TO STORE STATUS WORD.
      JMP ERR01     -NO, ERROR '01'.
* 
      LDB EQT5,I    STORE WORD 5 OF EQT ENTRY 
      XSB RQP3,I     IN 'STAT1'.
      LDA EQT4,I    STORE WORD 4 OF EQT ENTRY 
      XSA RQP4,I     IN 'STAT2'.
* 
      LDB REQLU     GET SUBCHANNEL
      ADB DRT        FROM DRT 
      LDA B,I         WORD 1. 
      AND B174K 
      ALF,RAL       PUT SUBCHANNEL IN 
      ADB LUMAX      LOWER 5 BITS.
      LDB B,I       GET UP/DOWN BIT FROM
      CLE,ELB        DRT WORD 2 AND OR
      RAL,ERA         WITH SUBCHANNEL.
      XSA RQP5,I    STORE IN 'STAT3'. 
L.16  LDA RQRTN     UPDATE THE
      STA XSUSP,I   RETURN ADDRESS
      JMP $XEQ      AND EXIT
      SPC 3 
RQPX  NOP 
CLASS NOP 
DCLAS DEF $CLAS+0   DIRECT ADDR OF CLASS TABLE
MCLAS NOP           CONFIGURED TO BE NEGATIVE OF ABOVE. 
B174C OCT 17400     BITS 8-12 
B37   OCT 37
N2    DEC -2
.22   DEC 22
      SKP 
*     $GTIO IS THE ENTRY POINT THE EXEC CALLS FOR A 'GET' EXEC
*           CALL. 
* 
$GTIO XLA RQP2,I    GET REAL PARAM
      STA PARM2 
      XLA RQP4,I     FOR BFCK 
      STA PARM4 
      LDA PARM2     GET THE CLASS 
      AND B377      MASK
      STA B         SAVE AND
      CMA,CLE,INA,SZA,RSS     IF CLASS=0
      CLE,RSS                 SEND "IO00" 
* 
      ADA $CLAS     IF GREATER THAN MAX THEN
      CLA,SEZ,RSS   SEND
      JMP ERR00     'IO00' ERROR
* 
      STA RQPX      CLEAR REQ CODE
      ADB DCLAS     SET THE 
      STB CLASS     CLASS TABLE ADDRESS 
      JMP BFCK      GO CHECK THE BUFFER ADDRESS.
* 
*     BFCK RETURNS TO G.01
* 
G.01  LDA PARM2     GET SECURITY CODE 
      AND B174C      BITS FROM CLASS WORD 
      STA SECCD 
      LDB CLASS,I   GET QUEUE HEAD
      SSB           IF A COUNTER
      JMP G.06      GO SUSPEND THE PROGRAM
* 
      SZB,RSS       IF QUEUE-HEAD = 0 
      JMP ERR00        ERROR "IO00" 
* 
      STB PTR       SAVE THE ADDRESS
      INB           GET THE CON WORD
      LDA B,I       AND 
      AND .3        ISOLATE THE REQUEST CODE
      XSA RQP7,I     RETURN IT TO USER'S IRCLS
      INB           STEP TO STATUS WORD 
      LDA B,I       GET COMPLETION STATUS.
      STA XA,I      AND SET IT IN THE A REG.
      INB           GET THE BUFFER LENGTH 
      LDA B,I       AND SET IT
      STA CLTMP     FOR RETURN
      INB           STEP TO USER CLASS WORD 
      LDA B,I       GET IT
      AND B174C     KEEP SECURITY CODE
      CPA SECCD     MATCHES CALLER'S? 
      RSS 
      JMP ERR00      NO, ERROR IO00 
* 
      INB           INDEX TO THE
      LDA B,I       TLOG AND
      STA XB,I      SET IT IN THE 'B' REG 
      INB           INDEX TO THE
      LDA B,I       FIRST OPTIONAL WORD AND 
      XSA RQP5,I    SET IT IN THE USERS BUFFER
      INB           NOW DO THE SECOND OPTIONAL WORD 
      LDA B,I 
      XSA RQP6,I
* 
      STB TEMP4     SAVE THE BUFFER ADDRESS 
      LDA .8        GET THE BUFFER LENGTH 
      CMA,INA       SET NEGATIVE
      ADA CLTMP     LOP OFF THE HEAD WORDS
      STA TEMP3     SET THE MOVE COUNT
      LDB TMP8      GET THE SUPPLIED LENGTH 
      CMA,INA       SET MOVE COUNT NEG
      ADA TMP8      SUBTRACT FROM USER BUFFER SIZE
      SSA,RSS       IF QUEUE COUNT IS SMALLER,
      LDB TEMP3     USE QUEUE SIZE, MAY BE 1 BIGGER!! 
      SSB           IF COUNT LESS THAN ZERO THEN
      JMP G.05      THEN SKIP MOVE
* 
      LDA TEMP4     GET  THE BUFFER ADDRESS.
      INA           STEP TO THE PROPER WORD 
      CBX           GET MOVE COUNT
      LDB RQP3      GET DESTINATION 
      MWI           MOVE FROM SYSTEM TO USER
G.05  LDA PARM2     IF SAVE 
      RAL,RAL        QUEUE OPTION 
      SLA,ELA        THEN 
      JMP L.16       EXIT 
* 
      LDA PTR,I     ELSE
      STA CLASS,I    UPDATE THE LIST
      SSA           IF POINTER, SKIP COUNT CHECK
      AND B37       GET # PENDING REQUESTS LEFT 
      SEZ,SZA,RSS    NO REQUESTS LEFT 
      STA CLASS,I    AND IF DEALLOCATE WANTED, DO IT. 
      JSB $RTN      RETURN THE MEMORY 
PTR   NOP           AND 
CLTMP NOP           THEN
      JMP G.08      SCHEDULE WAITERS AND EXIT 
* 
G.06  LDA B174C     GET SECURITY CODE 
      AND B          FROM QUEUE 
      CPA SECCD     MATCH?
      RSS 
      JMP ERR00      NO, ERROR IO00 
* 
      RBL,CLE,ELB   MOVE BIT14 (SOMEONE WAITING) TO E 
G.065 LDA CLASS,I   GET CLASS WORD
      AND B377
      CMA,SEZ       ANYONE WAITING? (SET ONES COMP) 
      JMP SCEDT      YES,SORRY SOMEBODY BEAT YOU TO IT
* 
      STA XA,I      SET A FOR POSSIBLE RETURN 
      INA           GET CORRECT 2'S COMPLEMENT
      STA B 
      LDA PARM2     GET THE OPTION FLAG 
      ELA,RAL       SET E=BIT15 NO-WAIT OPT.
      SZB,RSS       IF QUEUE-HEAD = 0 
      SSA             AND BIT14 SET,
      JMP G.07        DON'T DEQUEUE 
* 
      STB CLASS,I   IF Q-H=0 AND BIT14=0 DEQUEUE! 
G.08  LDA DCLAS     NOW SCHEDULE ALL THOSE WAITING
      JSB $SCD3      FOR AN AVAILABLE CLASS NUMBER. 
      JMP L.16      RETURN
* 
G.07  SEZ,CCE 
      JMP L.16      BIT15=1 FOR NO-WAIT. RETURN.
* 
      LDB CLASS     GET CLASS ADDR IN B FOR L.013 
      LDA B,I       SET "SOMEONE IS WAITING" FLAG 
      RAL,RAL 
      ERA,RAR 
      STA B,I         AND 
      JMP L.013     PUT IT BACK INTO WAIT LIST
      SPC 1 
C377  OCT 177400    COMPLEMENT OF 377 
      SKP 
* 
* 
* 
*        THE COMN ROUTINE IS USED TO DETERMINE IF THE BUFFER
*        SPECIFIED IS IN COMMON.  TO BE IN COMMON THE BUFFER
*        MUST BE BELOW THE LOAD POINT OF THE PROGRAM SPECIFIED. 
*        AND ALSO BE BELOW  $SDA, THE START OF THE SYSTEM DRIVER
*        AREA.  IT IS NOT ENOUGH TO JUST SEE IF THE BUFFER IS BELOW 
*        THE LOAD POINT AS THE BUFFER COULD BE IN THE MEMORY RESIDENT 
*        LIBRARY.  WE ALSO DON'T HAVE TO CHECK IF THE ADDRESS IS BELOW
*        $CMST AS EXEC DOES THIS FOR ALL I/O REQUESTS IN THE
*        MEMORY PROTECT CHECK PROCESSOR.
* 
* 
* 
*         CALLING SEQUENCE:     LDA BUFFER ADDRESS
*                               LDB ID SEG ADDRESS
*                               JSB COMN
*                                 - HERE IF BUFFER NOT IN COMMON
*                                 - HERE IF BUFFER IS IN COMMON 
* 
* 
* 
COMN  NOP 
      CMA           MAKE BUF ADDR NEG +1 &
      STA BUFAD       SAVE FOR NEXT CHECK.
* 
      ADB .22        INDEX TO LOAD POINT
      ADA B,I             OF PROGRAM. 
      SSA            BUFFER BELOW LOAD POINT ?
      JMP COMN,I     NO, SO IT CAN'T BE IN COMMON.
* 
      LDA $SDA       GET PAGE # OF SDA & CONVERT
      ALF,ALF             TO
      RAL,RAL                AN ADDRESS 
      ADA BUFAD       NOW IS THE BUFER ALSO 
      SSA,RSS            BELOW THE SYSTEM DRIVER AREA ? 
      ISZ COMN        YES,  BUFFER MUST BE IN COMMON. 
      JMP COMN,I      NO, SO RETURN.
* 
* 
BUFAD NOP 
****************************************************************
* 
*WORD2              ASSEMBLE CONTROL WORD 
* 
*     CONTROL WORD IS BUILT AS FOLLOWS: 
* 
********************************************************
*  T   * S * X * U * S FUN  * SUB CHAN *  REQUEST CODE *
* 15/14*13 *12 *11 * 10----6* 5------2 *  1/0          *
********************************************************
* 
*     WHERE:
* T= 0 FOR STD USER       REQUEST CODE = 1  FOR READ (CLASS OR NORMAL)
*  = 1 FOR BUFFERED RQ.                = 2  FOR WRITE      "
*  = 2 FOR SYSTEM                      = 3  FOR  CONTROL   "
*  = 3 FOR CLASS RQ.
* 
*       'SUB CHAN' IS THE  LOW 4 BITS AND 'S' IS THE 5'TH BIT OF THE
*             SUB CHANNEL.
*       'X' IS THE DOUBLE BUFFER BIT
*       'U' IS CURRENTLY UNUSED 
*       'S FUN' IS THE USER SUB FUNCTION
*       IF THE DEVICE IS A DISC THEN THE 'X' BIT IS CLEARED AND BITS
*            8,9 IN 'S FUN'  ARE SET TO THE LU IF 2 OR 3 ,ELSE THEY ARE 
*            ZEROED.
*       THIS ROUTINE DOES NOT BUILD THE 'T' FIELD. *** CALL WITH E=0 ***
* 
***************************************************************** 
WORD2 NOP 
      LDB RQPX      IF CLASS WRITE-READ 
      CPB .4        THEN CHANGE 
      CLB,CLE,INB   CHANGE TO READ REQUEST
      LDA PARM2     COMBINE REQUEST CODE WITH 
      AND B137C      CONTROL INFORMATION
      ADB A          TEMPORARILY STORE IT-
      LDA TEMP5     GET DRT ENTRY FOR THIS LU 
      AND B174K     GET SUBCHANNEL
      ELA,RAL       SAVE HIGH BIT AND 
      ALF,RAL       POSITON REST
      ADA B         ADD IT TO THE WORD
      SEZ           IF HIGH BIT SET 
      ADA B20K      SET IT IN THE WORD
      LDB TEMPL     IF NOT DISC 
      CCE,SZB,RSS    REQUEST, 
      JMP WORD2,I    EXIT - 
* 
      AND C114C     OTHERWISE,
      SWP            SET BITS (9,8) 
      AND .3         TO INDICATE
      ALF,ALF        SYSTEM, AUXILIARY, 
      IOR B          OR PERIPHERAL TYPE 
      JMP WORD2,I   EXIT -
* 
B137C OCT 13700 
B3700 OCT 3700
C114C OCT 166377
* 
* 
SCEDT ERB,RBR       CLEAR THE BIT AND 
      STB CLASS,I   RESET THE CLASS HEAD
      LDB $LIST     SAVE STATUS OF
      STB STADV      $LIST ENTRY POINT. 
      LDA CLASS     GET HEAD ADDRESS TO A AND 
      JSB $SCD3     RESCHEDULE THE WAITER IF ANY
      CLE           E=0 FOR G.065.  IF $LIST ENTRY POINT
      LDA $LIST      IS UNCHANGED, THEN THERE WAS 
      CPA STADV       NO WAITER.
      JMP G.065     NO, SO MUST HAVE BEEN ABORTED. CONTINUE.
      JMP ERR10     YES.  ERROR, SO GO ABORT. 
* 
* 
****************************************************************
* 
*     SUBROUTINE STADV: 
* 
*     STADV WILL RETURN AT THE UP EXIT IF LU=0.  IT NEXT
*     CHECKS TO DETERMINE IF THE CURRENT EQT IS DOWN(BIT
*     14 EQT WORD 5)OR IF THE LU IS DOWN(BIT 15 DRT WORD 2).  IF
*     DOWN, RETURN IS MADE AT P+1.  IF UP, RETURN IS MADE AT P+2. 
* 
*     CALLING SEQUENCE: 
*          <EQT5>:=ADDRESS OF STATUS WORD FOR THIS EQT. 
*          <A>:=LU#-1.
*          JSB STADV
* 
*     RETURN: 
*          (P+1)  EQT OR LU DOWN. 
*          (P+2)  EQT AND LU UP.
*                 ALL REGISTERS ARE VIOLATED. 
* 
******************************************************************
* 
STADV NOP 
      CPA B377      IF LU=0(IE, 377B), THEN 
      JMP STAD9      GOTO UP EXIT.
* 
      ADA DRT       GET DRT WORD
      ADA LUMAX      2 AND CHECK
      LDA A,I         IF THE LU IS
      SSA              UP OR DOWN.
      JMP STADV,I   LU IS DOWN. 
* 
      LDB EQT5,I    LU IS UP, SO
      RBL,SLB        CHECK IF THE 
      JMP STAD9       EQT IS UP OR
      SSB              DOWN.
      JMP STADV,I   EQT IS DOWN.
* 
STAD9 ISZ STADV     LU AND EQT
      JMP STADV,I    ARE UP.
      SKP 
*     SUBROUTINE NSBIT
* 
*     "NO SUSPEND" BIT CHECK SUBROUTINE 
* 
*     THIS SUBROUTINE EXAMS THE "NO SUSPEND" BIT (BIT 14) OF
*     WORD 15 OF THE ID SEGMENT POINTED TO BY THE AREG ON 
*     ENTRY. RETURN AT P+1 IF BIT SET. RETURN AT P+2 IF BIT 
*     IS NOT SET. 
* 
*     CALLING SEQUENCE: 
* 
*     LDA ID SEGMENT ADDRESS
*     JSB NSBIT 
*     (P+1) "NO SUSPEND" BIT SET
*     (P+2) "NO SUSPEND" BIT NOT SET
* 
*     AREG IS DESTROYED.
* 
NSBIT NOP 
      ADA .15       POINT AT WORD 15 OF ID SEGMENT. 
      LDA A,I       PICK UP THE ACTUAL WORD AND 
      RAL            ROTATE BIT 14 TO MSB.
      SSA,RSS       IS "NO SUSPEND" BIT (BIT 14) SET ?
      ISZ NSBIT     NO, RETURN AT P+2.
      JMP NSBIT,I   YES,RETURN AT P+1.
      SKP 
*     THE QUEUE CHECK ROUTINE CHECKS TO SEE IF THE QUEUE ON 
*     THE CURRENT EQT HAS MORE THEN THE 'LIMIT' NUMBER OF WORDS 
*     OF BUFFER MEMORY ON IT AT THE CURRENT TIME. 
*     THE LIMIT IS PASSED IN THE B REG. SO THE ROUTINE CAN
*     CAN BE USED FOR BOTH UPPER AND LOWER LIMIT CHECKS.
* 
*     CALLING SEQUENCE: 
* 
*     LDB NEGATIVE OF LIMIT 
*     JSB QCHK
*     --- MORE THAN LIMIT WORDS ON QUEUE
*     --- LESS THAN LIMIT WORDS ON QUEUE
*     EQT1 ADDRESS IS IN B ON EXIT
* 
QCHK  NOP 
      STB TEMP1     SET LIMIT 
      LDA EQT1,I    START AT EQT HEAD 
      RAL,CLE,ERA   CLEAR POSSIBLE SIGN AND E 
      CLE,SZB       SET E FOR NOT EXCEEDED
QCHK1 SZA,RSS       END OF QUEUE? 
      JMP QCHK3     YES GO EXIT 
* 
      STA TEMPW     SET CURRENT ELEMEMT 
      INA           GET THE CON WORD
      LDB A,I       TO B
      RBL           CHECK IF A BUFFERED 
      SSB,RSS       REQUEST?
      JMP QCHK2     NO TRY NEXT ONE 
* 
      ADA .2        YES STEP TO THE COUNT 
      LDB A,I       GET COUNT TO B
      ADB TEMP1     ADD TO LIMIT
      STB TEMP1     AND RESET 
QCHK2 LDA TEMPW,I   GET NEXT ELEMENT
      JMP QCHK1     GO CHECK THIS ELEMENT 
* 
QCHK3 LDB EQT1      GET SUSPEND POINTER 
      SEZ,RSS       OVERFLOW? 
      ISZ QCHK      NO  STEP RETURN 
      JMP QCHK,I    RETURN
* 
      SKP 
*  SUBROUTINE:  -LINK-
* 
* PURPOSE: THIS ROUTINE PROVIDES FOR ADDING 
*         AN I/O REQUEST INTO THE SUSPENDED 
*         LIST (QUEUE) CORRESPONDING TO THE 
*         REFERENCED DEVICE. THE PROCEDURE
*         OF ADDING AN ENTRY INTO THE LIST
*         INVOLVES ONLY THE ALTERATION OF 
*         THE LINKAGE VALUE IN THE NEW ENTRY
*         AND IN THE ENTRY PRECEDING THE
*         NEW ONE IN THE PRIORITY CHAIN.
*         FOR ALL REQUESTS WITH PRIORITIES
*         ABOVE 40 (LARGER NUMBER), THE REQUEST 
*         IS LINKED ON A FIFO BASIS. FOR ALL
*         OTHER PRIORITIES (0 - 40) THE 
*         NEW ENTRY IS LINKED ACCORDING 
*         TO ITS PRIORITY AND ON A FIFO 
*         BASIS WITHIN THE SAME PRIORITY
*         LEVEL. THE END OF A LIST IS MARKED
*         BY A LINKAGE VALUE OF ZERO. THE 
*         FIRST ENTRY IN A LIST IS SKIPPED
*         BECAUSE IT IS ASSUMED TO BE THE 
*         REQUESTOR FOR THE CURRENT I/O 
*         OPERATION. IF THE LIST IS EMPTY,
*         THE LINK WORD IN THE EQT ENTRY
*         IS SET TO POINT TO THE NEW ENTRY
*         AND AN INDICATION IS GIVEN TO 
*         THE CALLER OF -LINK- THAT THE 
*         NEW REQUEST MAY BE INITIATED. 
* 
* CALL:   THE FOLLOWING LOCATIONS MUST BE 
*          SET TO THE INDICATED VALUES
*          BEFORE THE CALL IS MADE: 
* 
*          TEMP1 = LOCATION OF NEW REQUEST
*                  TO BE LINKED INTO THE
*                  I/O LIST DEFINED BY THE
*                  CURRENT EQT ENTRY. THE 
*                  ADDRESS OF THE LINKAGE 
*                  WORD IN THE EQT ENTRY
*                  IS IN -EQT1-.
* 
*          TEMP2 = PRIORITY OF THE NEW
*                  REQUEST. 
* 
*          TEMPL = DISC QUEUE FLAG (# 0 MEANS DISC) 
* 
*         -  JSB  LINK
*         -  (RETURN)  (E) = 0 IF THE NEW 
*                 REQUEST IS THE ONLY ENTRY 
*                 IN THE I/O LIST, I.E. THE 
*                 DRIVER MAY BE CALLED TO 
*                 INITIATE THE NEW OPERATION. 
* 
*            THERE ARE NO ERROR CONDITIONS
*             DETECTED OR DIAGNOSED BY THIS 
*             ROUTINE.
* 
* 
*  NOTE: TEMP2 IS SET = 77777B IF REQUEST PRIORITY
*        IS > 40. 
      SKP 
LINK  NOP 
      LDB C100K     FETCH MAX POS NUMBER
      LDA TEMP2     FETCH PRIORITY OF REQUEST 
      ADA N41       IF PROORITY LESS THAN 40
      SSA,RSS         USE FIFO
      STB TEMP2       BY SETTING REQUEST PRIORITY NEGATIVE
* 
      LDB EQT1      GET THE HEAD OF THE LIST
      CLE,RSS       SET FIRST FLAG AND SKIP 
* 
* FIRST ENTRY IN LIST IS SKIPPED BECAUSE IT 
*  IS THE CALLER FOR THE CURRENT OPERATION
*  ACTIVE ON THE I/O DEVICE.
* 
************************************************* 
**WILL ENTER IN EITHER MAP,BUT THIS IS OK BECAUSE 
**THE LINK WORD WILL BE IN THE ENABLED MAP AREA** 
************************************************* 
LINK1 SEZ,CCE,RSS   IF NOT FIRST SKIP 
      JMP LINK7     GO START THE SCAN 
* 
      STB TEMP3    TEMP3 = ADDRESS OF CURRENT ENTRY.
      CCE,INB      EXAMINE THE
      LDA B,I       TYPE FIELD IN WORD 2 OF BLOCK 
      INB           TO DETERMINE LOCATION 
      RAL            OF PRIORITY. 
      SSA            IF BUFFERED REQUEST
      JMP LINK8     B POINTS AT PRIORITY
* 
      SLA,RSS       IF USER REQUEST 
      JMP LINK5     GO BUMP BY 4
* 
      LDA TEMPL     SYSTEM  IS IT A DISC
      SZA,RSS       REQUEST ? 
      JMP LINK2     NO USE ZERO PRIORITY
* 
      INB,RSS       YES USE THE PROVIDED WORD 
LINK5 ADB .4        IS IN WORD 7 OF ID SEGMENT. 
LINK8 LDA B,I      GET PRIORITY OF CURRENT ENTRY. 
LINK2 LDB TEMP3 
      CMA,INA      SUBTRACT CURRENT PRIORITY FROM 
      ADA TEMP2     PRIORITY OF NEW REQUEST.
      SSA          IF CURRENT IS LOWER PRIORITY 
      JMP LINK3     (HIGHER #), GO TO LINK NEW. 
* 
LINK7 STB TEMP5     SAVE PREVIOUS ENTRY POINTER 
      LDB B,I        GET NEXT ENTRY 
      ELB,CLE,ERB   CLEAR POSSIBLE SIGN (SAVES E) 
      SZB          IF END-OF-LIST, SKIP.
      JMP LINK1    -CONTINUE SCAN.
* 
* PROPER POSITION (BY PRIORITY) IS FOUND IN LIST, 
*  OR ELSE THE SCAN OF THE LIST IS FINISHED AND 
*  THE NEW REQUEST IS ADDED AS THE LAST ENTRY.
* 
LINK3 LDA TEMP1    SET ADDRESS OF NEW ENTRY IN
      STB TEMP1,I  SET ADDRESS OF NEXT OR 0 IF LAST 
      XOR TEMP5,I   KEEP SIGN OF OLD WORD 
      AND C100K     IF IT WAS SET 
      XOR TEMP5,I 
      STA TEMP5,I   SET THE POINTER TO THE NEW REQUEST
* 
* RETURN A BUSY STATUS (E=1) IF THE ONLY REQUEST ON THE 
* EQT IS A SYSTEM CLEAR REQUEST.
* 
      SEZ,RSS       IF SOMETHING ELSE IS IN THE QUEUE, SKIP NEXT LINE 
      ELA           IF ONLY REQUEST IS SYSTEM CLEAR, RETURN (E)=1 
* 
      JMP LINK,I    RETURN
* 
      SPC 1 
.1    DEC 1 
.2    DEC 2 
.4    DEC 4 
.6    DEC 6 
.7    DEC 7 
.15   DEC 15
      SKP 
***************************************************** 
*     JSB DRVMP     SET UP DRIVER MAP FROM ORIGINAL CALL
*      <RETURN> 
*     (E)=0         ENTER DRIVER IN SYSTEM MAP
*     (E)=1         ENTER DRIVER IN USER MAP
*     (B)=0         SET PORT MAP WITH SYSTEM MAP
*     (B)=100000    SET PORT MAP WITH USER MAP
***************************************************** 
DRVMP NOP 
      CLA 
      STA DVMPS     INIT USER MAP SAVE FLAG TO 0
      STA MATAD     INIT USER MAT ADDR TO 0 
      STA FLAG      INIT DEFAULT MAP AS SYS MAP 
      STA MAP?      INIT DEFAULT REBUILD USER MAP 
      JSB CPEQT     GET EQT # INTO (A)
      CCB 
      ADB A          CALCULATE INDEX TO 
      ADB $DVMP      THE DRIVER MAP TABLE 
      STB DVMP1 
      ADB EQT#      INDEX TO SECOND WORD
      STB DVMP2 
      LDB EQT1,I    GET DRIVER LINK WORD
*     **A790220*
      STB TID       SAVE IT AWAY MIGHT BE ID SEG ADDRESS
      CLE,SSB,RSS   BIT15=1 FOR TIME-OUT ON CLEAR REQUEST 
      CLE,SZB,RSS   CLEAR (E) FOR SYSTEM MAP
      JMP DVUSY     MAP DRIVER IF IN PTTN 
* 
      LDA B 
      INA 
      LDA A,I       CHECK T FIELD IN CONTROL WORD 
      STA TWORD     (SAVE FOR LATER TOO)
      RAL 
      CLE,SSA       T=1 0R 3 IF S=1 
      JMP DVUSY     (E) CLEARED FOR SYSTEM MAP
* 
      SLA,RSS 
      JMP DVUSE     T=0,GO SET USER MAP 
* 
      ADB .4        T=2,GET ID WORD IN SYS CALL 
      LDB B,I 
      STB TID       SAVE IT AWAY IT IS AN ID SEG ADDRESS. 
      CLE,SZB,RSS   IS IT 0 ? 
      JMP DVUSY     YES,USE SYSTEM MAP (E)=0
* 
      SSB           IS IT SPECIAL $XSIO CALL? 
      JMP DVCUR      YES, USE CURRENT USER MAP
* 
*                   THIS IS AN $XSIO CALL. IF IT IS A LOAD IN,
*                   SWAP IN, OR SWAP OUT THEN THE MAP TO SET
*                   UP IS THE ORIGIONAL VIRGIN MAP. IF THIS 
*                   IS A SEGMENT LOAD, THEN WE WANT TO USE THE
*                   MAP AS IS.
* 
* 
      LDA EQT1,I    GET THE ADDRESS OF THE $XSIO LINK WORD
      ADA N2        INDEX TO THE LU WORD. IF THE SIGN BIT 
      LDA A,I       IS SET, THEN IT IS A SEGMENT LOAD CALL
      RAL           (LSB=1 MEANS USE CURRENT MAP) ELSE IT 
      STA MAP?      IS A LOAD OR SWAP(LSB=0 MEANS VIRGIN MAP) 
      JMP DVUSR     NOW GO SEE IF HE IS STILL MAPPED IN.
* 
* 
DVUSE CCA 
      STA FLAG      SET FLAG FOR USER MAP NEEDED
      STA MAP?      SET USER MAP NEW/OLD FLAG 
* 
      LDA EQT1,I    NO, OK GET BUFFER ADDRESS 
      ADA .2
      LDA A,I       GET USER BUFFER ADR FROM ID TMP WORDS 
      CLE,SSA       WAS BUFFER MOVED TO SAM?
      JMP DVUSY     YES,NEED SYSTEM MAP (E)=0 
* 
      LDB TWORD     GET THE T FIELD WORD
      RBR            GET THE REQUESTR CODE TO MSB & LSB 
      SSB,SLB         IF THIS IS A CONTROL RQ THEN GO 
      JMP DVUSR        UNBUFFERED & IN USER MAP (THIS STINKS) 
* 
      LDB TID       GET BACK THE ID SEG ADDR. 
      JSB COMN       IS THE BUFFER IN COMMON? 
      RSS            -NO. 
      JMP DVUSY      -YES. ENTER DRIVER UNDER SYSTEM MAP. 
* 
DVUSR LDA .32       (A) = REG# OF USER BASE PAGE
*     **A790220* ^^^
      CCB 
      CBX           (X) = READ 1 REGISTER 
      LDB DCURU     (B) = ADDR OF CURR USER BP SAVE 
      XMM           READ REGISTER 
* 
      LDB TID 
      ADB .14       IS CURRENT USER 
      LDA B,I       CORE RESIDENT?
      AND .15 
      STA TYP 
      CPA .1        WELL? 
      JMP MEMRS     YES GO SET MEM RES MAP
* 
      ADB .7        STEP TO THE MAP ADDRESS 
      LDA B,I       GET MAPID WORD
      AND B77       GET PARTITION NUMBER
      MPY .7        MULTIPLY BY 7 
      ADA $MATA     GET MAT ENTRY ADDR
      STA MATAD     SAVE ADDR FOR $SMAP CALL LATER
* 
      ADA .3        IT IS DISC RESIDENT USER
      LDA A,I       GET PAGE# FROM MATA ENTRY 
      AND B1777 
      STA DVMP2,I   SAVE SECOND WORD
* 
      LDB MAP?      DO WE NEED TO FORCE BUILD MAP?
      ERB            (E)=0 FORCE BUILD  (E)=1 REUSE 
      CPA CURUS     IS USER ALREADY MAPPED? 
      JMP SAMUS      YES, SEE IF WE CAN JUST REUSE IT 
* 
      ISZ DVMPS     NEED TO SET UP USER MAP 
      LDA ASVUI     FIRST, SAVE CURRENT USER MAP
      USA 
NEWUS LDB MATAD     SET UP NEW USER MAP 
      JSB $SMAP     SET UP USER MAP (B)=MATA ADDR 
* 
DVUDV LDA FLAG      USER MAP IS NOW SET UP
      SLA,RSS        WAS IT NEEDED BY $XSIO CALL? 
      JMP DVSYS      YES, ENTER IN SYSTEM MAP 
* 
      LDA DVMP1,I   SDA?
      SSA,RSS 
      JMP MAPDV      NO, MAP DRIVER INTO DRIVER PTTN
* 
      CLE,SLA       SDA DRIVER DOES OWN MAPPING?
      JMP DVDON      YES, OK  (E)=0 
* 
      CCE           (E) = 1  MAY BE JUST BIG DRIVER FOR USER
      LDA TYP       SDA + USER MAP
      CPA .4        BIG BG TYPE?
      JMP ERR11      YES, NO SDA IN USER MAP
      JMP DVDON      NO, OK FOR SDA IN USER MAP 
* 
SAMUS SEZ           SAME USER BP, BUT NEED TO REBUILD MAP?
      JMP DVUDV      NO, REUSE MAP
      JMP NEWUS      YES, DON'T SAVE OLD COPY, REBUILD
* 
* 
*     DRIVER SET UP NEEDING MEMORY RESIDENT MAP 
* 
MEMRS LDA $MRMP 
      CPA CURUS     MEM.RES.MAP ALREADY SET UP? 
      JMP MEMR2      YES
* 
      ISZ DVMPS      NO, SO SAVE CURRENT USER MAP 
      LDB ASVUI       BEFORE SET UP MEM.RES.MAP 
      USB 
      USA           SET UP MEM.RES. IN USER MAP 
MEMR2 LDA FLAG
      SLA,RSS       WAS IT $XSIO CALL?
      JMP DVSYS      YES, ENTER IN SYS MAP
* 
      LDB MSIGN 
      STB DVMP2,I   SET WORD 2 = 100000 
      LDA DVMP1,I 
      SSA,RSS       SDA?
      JMP MAPDV      NO, MAP DRIVER INTO DRIVER PTTN
* 
      CLE,SLA       SDA + SELF-MAPPING? 
      JMP DVDON      YES, (E)=0 FOR SDA IN SYS
* 
      CCE           (E) = 1  BIG DRIVER NEED USER MAP 
      LDA $MRMP     MEM.RES. MAP INCLUDE
      ADA $SDA       SDA AND TABLE AREA II? 
      LDA A,I 
      AND B1777     MASK OUT PROTECT BITS 
      CPA $SDA
      JMP DVDON      YES, (E)=1 FOR SDA IN USER MAP 
* 
ERR11 JSB $RSM      RESTORE USER MAP
      LDA .11       NEED USER MAP AND SDA DRIVER DOESN'T MAP
      JMP ILLCD      SO GIVE ERROR IO11 
* 
* 
* 
*     DRIVER SET UP NEEDING SYSTEM MAP
* 
DVCUR CLA,INA       $XSIO CALL IN SYS MAP 
      STA MAP?       NEEDS USER IN PORT MAP 
      RBL,CLE,ERB   (B)= ID SEG ADDR
      SZB,RSS       $CNFG CALLING?
      JMP DVSYS      YES, THERE IS NO ID SEG
* 
      ADB .21 
      LDA B,I       GET MAP WORD
      AND B77 
      MPY .7        GET MAT ADDR
      ADA $MATA 
      ADA .3
      LDA A,I 
      AND B1777 
      STA B         (B)= PAGE # OF USER BASE PAGE 
      JSB MPUBP     MAP IN USER BASE PAGE 
      ADA N32       SET ADDR TO SECOND COPY IN BP 
      ISZ DVMPS 
      LDB ASVUI 
      USB           SAVE CURRENT USER MAP 
      USA           SET UP MAP FROM SECOND COPY IN BP 
      JMP DVSYS     ENTER UNDER SYS MAP 
* 
DVUSY CLA           USER SWITCHING TO SYS MAP 
      STA FLAG
      STA MAP?
* 
DVSYS CLA,CLE 
      STA DVMP2,I   SET WORD 2 = 0
      LDA DVMP1,I 
      SSA           SDA?
      JMP DVDON      YES, ENTER IN SYS (E)=0
* 
MAPDV LDA FLAG      MAP DRIVER INTO DRIVER PTTN 
      ERA            OF THE APPROPRIATE MAP 
      JSB MPDRV 
      LDB DVMP2,I 
      SEZ           ENTER IN SYS MAP? 
      SSB           OR USING MEM.RES MAP? 
      JMP DVDON      YES, DON'T SAVE USER MAP IN BP 
* 
      JSB MPUBP     MAP IN USER BP
      IOR MSIGN      NO, NEED TO SAVE USER MAP
      USA            IN DISC RES MAP COPY IN BP 
* 
DVDON LDB MAP?
      SZB           ANY USER MAP SET UP?
      LDB MSIGN      SET PORT MAP WORD UP 
      JMP DRVMP,I   RETURN (E)=0 SYS  (E)=1 USER
* 
* 
*     MAP DRIVER INTO THE DRIVER PARTITION AREA 
*     USING CURRENT DRIVER MAP TABLE ENTRY @DVMP1 
*  CALLING SEQUENCE:
*     (E) = 0  USE SYSTEM MAP 
*     (E) = 1  USE USER MAP 
*     JSB MPDRV 
*     <RETURN>
*     (E) = PRESERVED 
*     ALL OTHER REGISTERS MEANINGLESS 
* 
MPDRV NOP 
      LDA DVMP1,I   GET PAGE # OF DRIVER
      AND B1777 
      STA B 
      LDA $DLTH 
      CAX           (X) = # PAGES TO MAP
      LDA $DVPT     (A) = PAGE # OF DRIVER PTTN 
      SEZ           ARE WE MAPPING FOR USER ? 
      ADA .32        YES, ADD 32 FOR USER REGISTERS 
      XMS           MAP IT
      JMP MPDRV,I   RETURN
* 
* 
*     MAP USER'S PHYSICAL BASE PAGE 
*  CALLING SEQUENCE:
*     (B) = USER BASE PAGE #
*     JSB MPUBP 
*     <RETURN>
*     (A) = LOGICAL ADDR OF SAVE AREA IN USER BP IN SYS MAP 
*     (E) = PRESERVED 
*     ALL OTHER REGISTERS MEANINGLESS 
* 
MPUBP NOP 
      CLA,INA       (B) = PAGE# OF USER BP
      CAX           (X) = 1 REGISTER TO SET UP
      LDA $DVPT     (A) = PAGE # OF DRIVER PTTN 
      XMS           MAP USER BP AT DRIVER PTTN AREA 
      LDA DVPTA     (A) = LOG ADDR OF USER MAP COPY 
      JMP MPUBP,I   RETURN
* 
* 
* 
TWORD NOP           TFIELD WORD 
.14   DEC 14
.21   DEC 21
N32   DEC -32 
DVPTA NOP           LOG ADDR OF USER MAP COPY (INIT SET UP) 
DVMP1 NOP 
DVMP2 NOP 
MATAD NOP 
FLAG  NOP 
DCURU DEF CURUS 
CURUS NOP 
B1777 OCT 1777
*** 
* 
TID   NOP 
TYP   NOP 
ASVUI DEF SVUSR,I   ADDRESS WITH SIGN SET FOR SAVE
ASVUS DEF SVUSR 
SVUSR BSS 32
DVMPS BSS 1         DRIVER MAP FLAG 
* 
********RESTORE USER MAP TO PRE-******
********DRIVER STATE******************
* 
* 
$RSM  NOP 
      CLA 
      CPA DVMPS     WAS USER MAP CHANGED
      JMP $RSM,I    NO,RETURN 
* 
      STA DVMPS     YES,CLEAR CHANGE MAP FLAG 
      LDA ASVUS 
      USA           RESTORE ORIGINAL USER MAP 
RSEX  JMP $RSM,I    ENABLE SYSTEM MAP 
* 
* 
* **************************************
*   $DRVM  DRIVER MAP SET-UP FOR CONTINUATION 
*     CALLING SEQUENCE: 
* 
*     SET UP EQT ADDRESSES
*     JSB $DRVM 
*     ---           RETURN WITH (E) INDICATING WHICH MAP
*     (E)=0  NEEDS SYSTEM MAP 
*     (E)=1  NEEDS USER MAP 
*     ALL OTHER REGISTERS MEANINGLESS 
* 
************************************************
***********NO EXTERNAL ROUTINE SHOULD CALL
***********$DRVM OR $RSM EXCEPT SPOOL AND POWER-FAIL
**************************************************
* 
* 
$DRVM NOP 
      JSB CPEQT     GET EQT # INTO (A)
      CCB 
      ADB A 
      ADB $DVMP 
      STB DVMP1     SAVE ADDR DRIVER MAP TABLE WORD 1 
      ADB EQT#
      LDA B,I 
      CLE,SZA,RSS   IS SECOND WORD = 0? 
      JMP SDDRV     YES, SYSTEM MAP NEEDED
* 
      STB DVMP2     SAVE ADDR DRIVER MAP TABLE WORD 2 
      LDA .32       (A) = REG# OF USER BASE PAGE
      CCB 
      CBX           (X) = READ 1 REGISTER 
      LDB DCURU     READ INTO 'CURUS' 
      XMM           READ MAP REGISTER 
      LDB DVMP2,I   GET SECOND WORD 
      CCE,SSB       MEM RES PROG?  (E)=1
      JMP MRPUS      YES
* 
      CPB CURUS     SAME USER ALREADY MAPPED? 
      JMP SDUSE      YES, RETURN  (E)=1 
* 
      ISZ DVMPS      NO, DIFFERENT USER 
      LDA ASVUI     SAVE CURRENT USER MAP 
      USA 
      JSB MPUBP     AND MAP IN USER BASE PAGE 
      USA            TO MAP USER WITH COPY OF MAP 
SDUSE LDA DVMP1,I 
      SSA,RSS       SDA?
      JMP $DRVM,I    NO, RETURN 
* 
SDADV SLA            YES, BUT IS IT SDA+MAPPING?
      CLE            YES, ENTER IN SYS MAP (E)=0
      JMP $DRVM,I   RETURN (E)=0 SYS  (E)=1 USER
* 
* 
MRPUS LDA CURUS 
      CPA $MRMP,I   WAS MEM RES MAP IN USER MAP?
      JMP SDDRV      YES, JUST MAP IN DRIVER
* 
      ISZ DVMPS      NO, DIFFERENT USER 
      LDB ASVUI     SAVE CURRENT USER MAP 
      USB 
* 
MRDRV LDA $MRMP     SET UP MEM.RES. MAP 
      USA 
* 
SDDRV LDA DVMP1,I   (E)=0 SYS  (E)=1 USER 
      SSA           IS DRIVER IN SDA? 
      JMP SDADV      YES, SEE IF SELF-MAPPING 
* 
      JSB MPDRV      NO, NEED TO MAP DRIVER IN CORRECT MAP
      JMP $DRVM,I   RETURN (E IS STILL SAME)
* 
      SKP 
* SUBROUTINE:  -DRIVR-
* 
*  PURPOSE: THIS ROUTINE PROVIDES A CENTRAL POINT 
*            FOR CALLING AN I/O DRIVER TO INITIATE
*            A NEW OPERATION. THIS ROUTINE, BEFORE
*            CALLING A DRIVER, SETS THE REQUEST 
*            PARAMETERS INTO THE APPROPRIATE WORDS
*            IN THE EQT ENTRY CORRESPONDING TO THE
*            REFERENCED DEVICE AND ASSIGNS A DMA
*            CHANNEL IF REQUIRED. 
*            IT ALSO SETS THE DEVICE TIME-OUT CLOCK.
* 
*  REQUIREMENTS: THE ADDRESSES OF THE EQUIPMENT 
*            TABLE ENTRY (15 WORDS) MUST BE SET 
*            IN EQT1 TO EQT15 BEFORE THE ROUTINE
*            IS CALLED. 
* 
*  CALLING SEQUENCE:   - PARAMETER SET UP AS ABOVE- 
*                      - (REGISTERS  MEANINGLESS) - 
* 
*                   (R)   JSB DRIVR 
*                   (P+1) -OPERATION INITIATED OR STACKED 
*                   (P+2) -OPERATION REJECTED OR COMPLETED- 
* 
*  ERRORS/DIAGNOSTICS: A DRIVER IS CALLED ONLY
*                      IF THE UNIT IS AVAILABLE 
*                      AND NOT BUSY; OTHERWISE, 
*                      RETURN IS MADE TO THE
*                      CALLER.  IF THE DRIVER 
*                      FINDS THE UNIT UNAVAILABLE 
*                      OR THE REQUEST ILLEGAL FOR 
*                      THE UNIT, THE INDICATION IS
*                      RETURNED TO THE CALLER FOR 
*                      FURTHER ACTION.
* 
DRIVR NOP 
      LDA EQT5,I   CHECK AVAILABILITY 
      RAL           OF DEVICE 
      SSA,SLA       IF DMA WAIT 
      JMP DVR00     GO DO DMA WAIT THING. 
* 
      CMA,SSA,SLA,RSS IF DOWN OR BUSY 
      JMP DRIVR,I   EXIT
* 
* 
* DEVICE IS AVAILABLE - CHECK FOR DMA REQUIREMENT 
* 
      LDA EQT4,I   SKIP DMA CHANNEL ASSIGNMENT IF 
      SSA,RSS       NOT REQUIRED ( D FIELD = 0 )
      JMP DRV02     IN WORD 4 OF EQT ENTRY. 
      SPC 1 
* 
* DMA CHANNEL REQUIRED - ATTEMPT TO ASSIGN CHANNEL
* 
DVR0  LDA DMACF      IF DMA QUEUE IS NOT EMPTY
B2002 SZA 
      JMP DVR1       THEN JUST ADD THIS EQT TO QUE. 
* 
DVR00 LDA .6       INITIALIZE FOR 
      STA  CHAN     CHANNEL 6 (DMA # 1 )
      LDB INTBA    ADDR. OF DMA 1 IN INTERRUPT TABLE
      CLA          IF DMA CHANNEL # 1 
      CPA B,I       AVAILABLE   (INTBL ENTRY = 0),
      JMP DRV01    GO TO ASSIGN IT TO THIS UNIT.
* 
      INB          SET FOR CHANNEL 7, 
      ISZ  CHAN     DMA CHANNEL # 2.
      CPA B,I      IF THIS CHANNEL AVAILABLE, 
      JMP DRV01     GO TO ASSIGN IT.
* 
* NO CHANNEL AVAILABLE - SET FLAGS AND RETURN 
* 
DVR1  LDA EQT5,I   IF DEVICE
      RAL 
      SSA,SLA       IS ALREADY WAITING FOR DMA, 
      JMP DRIVR,I   EXIT. 
* 
      RAR 
      IOR B140K    SET AVAIL TO SAY WAITING FOR 
      STA EQT5,I    DMA, ADD 1 TO 
      ISZ DMACF     # DEVICES WAITING.
      JMP DRIVR,I   - EXIT TO CALLER -
* 
DRV03 SEZ,CLE,INB   STEP OVER PRIORITY AND
      INB           IF CLASS REQUEST OVER CLASS WORD
      AND .6        ISOLATE REQUEST (A IS SHIFTED REMEMBER) 
      CPA .6        IF CONTROL REQUEST
      JMP DRV2      GO SET IT UP
* 
      LDA B         SET BUFFER ADDRESS
      ADA .4        IN A (SKIP LENGTH AND TWO OPTION WDS) 
      JMP DRV3      GO FINISH SET UP. 
* 
* ASSIGN AVAILABLE CHANNEL
* 
DRV01 LDA EQT1     SET EQT ENTRY ADDRESS IN INTER-
      STA B,I       RUPT TABLE ENTRY FOR CHANNEL. 
      LDB DMACF    IF UNIT WAS
      LDA EQT5,I    PREVIOUS WAITING
      RAL 
      SSA,SLA       FOR A DMA 
      ADB N1        CHANNEL, SUBTRACT 1 FROM # OF 
      STB DMACF     UNITS WAITING.
      RAR 
      ALR,RAR       CLEAR <AVAIL> 
      STA EQT5,I     FIELD. 
* 
      JSB DRVMP     GO SET MAP INITIALLY
      ADB CHAN      (B) HAS MAP INDICATOR FOR PORT
      XMB 
      JMP DV02C     CONTINUE
* 
* 
* TRANSFER REQUEST PARAMETERS TO EQT ENTRY
* 
DRV02 EQU * 
      JSB DRVMP     GO SET MAP INITIALLY
DV02C ELA           SAVE (E)
      STA MAP?
      LDA EQT3,I    IF HERE ONLY TO GET DMA 
      SSA            AT THE REQUEST OF DRIVER,
      JMP DRV4        SKIP SETTING UP EQT.
* 
      LDB EQT1,I   GET CURRENT REQUEST ADDRESS
      INB           FROM LINK WORD OF EQT ENTRY.
      LDA B,I      GET REQUEST CONTROL WORD,
      AND NTSUB     SET SUBCHANNEL BITS TO ZERO 
      STA EQT6,I    SET IN EQT 6. 
      XOR B,I       SET SUBCHANNEL
      RAL,RAL        NUMBER INTO
      RAL,SLA,RAL   BITS 10-6 OF WORD 
      XOR B2002     SET HIGH BIT,CLEAR LOW. 
      STA TEMPL     SAVE FOR EQT4 
      LDA B,I 
      CLE,ELA      IF REQUEST IS
DRV2  INB 
      SSA           HELD AS A TEMPORARY BLOCK FOR 
      JMP DRV03      BUFFERING, JUMP. 
* 
      AND .6
      CPA .6
      CCA,RSS       THIS IS A CONTROL CALL
      LDA C100K     NOT CONTROL SET TO MASK OUT SIGN
* 
      AND B,I 
* 
DRV3  STA EQT7,I     ADDRESS. 
      INB 
      LDA B,I      SET BUFFER 
      STA EQT8,I     LENGTH.
      INB 
      DLD B,I       SET ADDITIONAL 2
      DST EQT9,I     PARAMETERS IF SUPPLIED.
* 
* CALL DRIVER -INITIATION- SECTION
* 
      LDA EQT14,I   SET DEVICE
      LDB EQT15,I    TIME OUT CLOCK ONLY
      SZB,RSS       IF NOT CURRENTLY RUNNING
      STA EQT15,I 
      LDA EQT4,I    ZERO TIME-OUT 
      AND C7700      BIT AND SET
      IOR TEMPL      IN SUBCHANNEL
      STA EQT4,I    EQT4 IS THUS FULLY CONFIGURED.
DRV4  LDA EQT4,I    GET THE CHANNEL # 
      AND B77        (I.E., SELECT CODE) IN A.
      LDB MAP?
      ERB 
      LDB EQT2,I   CALL DRIVER *INITIATION* 
      ELB,CLE,ERB  CLEAR SIGN OF I.ENTRY_POINT
*                             (DON'T ALTER E).
      SEZ           ENTER DRIVER IN USER MAP? 
      JMP INUS       YES
* 
      JSB B,I        NO, ENTER IN SYSTEM MAP
      JMP DRVRT 
* 
MAP?  NOP 
* 
INUS  JSB $UIN      ENTER IN USER MAP, RETURN TO DRVRT
      SKP 
* 
* DRIVER RETURNS AN INDICATION OF THE ACCEPTANCE
*  OR REJECTION OF THE REQUESTED OPERATION: 
*   (A) = 0, OPERATION SUCCESSFULLY INITIATED 
*   (A) NOT = 0, OPERATION REJECTED AND (A) 
*                CONTAINS A NUMERIC CODE
*                IDENTIFYING THE CAUSE OF 
*                THE REJECT, WITH (B)=TRANSMISSION LOG. 
* 
*        = 1    READ OR WRITE REQUEST ILLEGAL FOR DEVICE
*        = 2    CONTROL REQUEST ILLEGAL OR NOT DEFINED
*        = 3    EQUIPMENT MALFUNCTION OR NOT READY
*        = 4    IMMEDIATE COMPLETION OF OPERATION 
*        = 5    DRIVER REQUIRES DMA BUT FLAG IS NOT SET IN EQT
*        = 6    INITIATION OK, BUT DRIVER WANTS TO GIVE UP DMA
* 
DRVRT STA TEMP6    SAVE DRIVER CODE.
      JSB $RSM      GO RESTORE USER MAP 
      LDA EQT3,I   CLEAR THE
      ELA,CLE,ERA   DRIVER-EXITED-FROM-CONTINUATION-
      STA EQT3,I     SECTION-TO-GET-DMA FLAG. 
      LDA TEMP6     RESTORE DRIVER CODE 
      SZA,RSS      IF SUCCESSFULLY INITIATED, 
      JMP DRV00       CONTINUE
* 
      CPA .6       ELSE IF THIS WAS NOT A 
      RSS                  GIVE-UP-DMA RETURN,
      JMP DRVRJ            INVESTIGATE REJECTION
* 
      JSB CLDMA         ELSE GIVE UP DMA. 
* 
* OPERATION INITIATED 
* 
DRV00 EQU * 
      CCE          SET (E) FOR WHAT FOLLOWS.
      LDB EQT5,I   SET
      RBL,ERB       <AVAIL> = 2 TO SAY DEVICE 
      LDA EQT1,I    IF NO QUE 
      SZA           SKIP BUSY SET 
      STB EQT5,I     IN OPERATION.
      JMP DRIVR,I   EXIT. 
* 
*  OPERATION REJECTED 
* 
DRVRJ STB TLOG      SAVE (B)
      CLA           CLEAR DEVICE
      STA EQT15,I    TIME-OUT CLOCK 
      JSB CLDMA     CLEAR DMA IF ALLOCATED
      LDA TEMP6    (A) = REJECT CODE. 
      CPA .5        IF DMA REQUIRED 
      JMP DVR0       GO ATTEMPT ASSIGNMENT
      ISZ DRIVR    SET RETURN TO (P+2). 
      CPA .3        IF NOT READY THEN 
      JMP DRIVR,I   -EXIT.
      JMP ILLCD     ELSE GO TO SEND THE MESSAGE 
      SPC 1 
C7700 OCT 170077
NTSUB OCT 153703
B174K OCT 174000
B20K  OCT 20000 
      HED < I/O MODULE SUBSECTION - SYSTEM REQUEST PROCESSOR >
* SYSTEM I/O REQUEST PROCESSOR  - $XSIO-
* 
*  A PRIVATE ENTRY IS PROVIDED AT ENTRY POINT 
* < $XSIO> TO ALLOW MODULES OF THE REAL TIME
* EXECUTIVE TO CALL FOR I/O OPERATIONS WITHOUT
* INCURRING THE OVERHEAD AND PROCEDURES 
* INVOLVED WITH USER I/O REQUESTS. NO ERROR 
* CHECKING IS PERFORMED, THE REQUEST IS LINKED
* INTO THE APPROPRIATE I/O LIST AT A PRIORITY 
* LEVEL OF ZERO (HIGHEST PRIORITY), AND CONTROL 
* IS RETURNED TO THE FIRST WORD FOLLOWING THE 
* REQUEST CALL. 
* REQUEST FORMAT: A SYSTEM I/O REQUEST DIFFERS
*                 FROM THE USER I/O REQUEST IN
*                 FORMAT AND POWER. SPECIFICALLY, 
*                 A SYSTEM DISC CALL CAN SPECIFY A
*                 SERIES OF TRANSFERS TO BE 
*                 PERFORMED BEFORE THE NEXT 
*                 OPERATION IS INITIATED. A 
*                 COMPLETION ADDRESS CAN BE 
*                 SPECIFIED FOR OPERATION OF
*                 AN OPEN SUBROUTINE AT THE 
*                 END OF THE OPERATION. THIS
*                 FACILITY IS ONLY AVAILABLE
*                 TO SYSTEM ROUTINES AND IS 
*                 USED TO RESET FLAGS, ETC. 
*                 BECAUSE AN OPERATION IS 
*                 ALWAYS BUFFERED TO THE
*                 SYSTEM. A ZERO COMPLETION 
*                 ADDRESS INDICATES ABSENCE 
*                 OF A COMPLETION ROUTINE.
*      WORD 
*      ----   EXT   $XSIO 
*        1    JSB   $XSIO 
*        2    OCT   <LOGICAL UNIT #>
*        3    DEF   <COMPLETION ROUTINE ADDRESS>
*        4    NOP   <LIST POINTER WORD SET BY SYSTEM> 
*        5    OCT   <CONTROL INFO, REQUEST CODE>
*        6    DEF   <BUFFER ADDRESS OR DISC CONTROL WORDS>
*        7    DEC   <BUFFER LENGTH> OR <PRIORITY IF DISC REQUEST> 
*        8    OCT   <0> OR <ID SEG. ADD. IF DISC> 
*                       OR <100000 IF USE USER MAP UNCHANGED> 
* 
*       DISC VERSION OF REQUEST:
*         WORD 6 OF REQUEST POINTS TO AN ARRAY
*        CONTAINING -N- SETS OF TRIPLETS
*        DECLARING BUFFER ADDRESS, LENGTH AND 
*        TRACK/SECTOR ADDRESS FOR EACH TRANSFER.
*        THE SET OF TRIPLETS IS OPEN-ENDED AND
*        TERMINATED BY A ZERO WORD: 
* 
*        1    DEF   < BUFFER ADDRESS> 
*        2    DEC   < BUFFER LENGTH > 
*        3    OCT   < TRACK/SECTOR #> 
*        .    ETC 
*        .     .
*        N    DEC   0    (END OF TRIPLETS)
*        FOR DISC REQUEST THE 7'TH WORD IS THE REQUEST PRIORITY.
* 
* 
$XSIO NOP 
      CCB 
      ADB $XSIO,I   GET LOGICAL UNIT #. 
*     **A790220*
      RBL,CLE,ERB    STRIP SIGN BIT IF SPECIAL SEG LOAD CALL
      STB $CKLO     SAVE FOR *STADV*. 
      ADB DRT         INDEX INTO THE DRT. 
      LDA B,I       GET ASSIGNED EQT ENTRY #. 
      STA TEMPL       AND SAVE IT 
      JSB $CVEQ    CONVERT TO ABSOLUTE EQT ADDRESSES
* 
      CLA          XSEQ1 IS USED TO SAFEKEEP (EQT1) IF
      STA XSEQ1     CALLING "LINK" FOR LOCKED EQT LINKING.
* 
      LDB $ELTB,I  GET EQT. LOCK TABLE HEADER.
      SSB,RSS      IF TABLE IS EMPTY, 
      JMP XSIO3     SKIP CHECK FOR LOCK ON THIS EQT.
* 
      ELB,CLE,ERB  GET RID OF NOT_EMPTY BIT.
      STB TEMP1    STORE TABLE LENGTH.
      CMB,INB      THEN STORE 2'S COMPLE
      STB TEMP3     OF TABLE LENGTH.
      LDA TEMPL    GET SUBCHANNEL/EQT.# WORD. 
      AND B77      ISOLATE EQT.#. 
      STA TEMP5    KEEP IT TO COMPARE AGAINST.
      LDA $ELTB    GET $ELTB TABLE ADDR.
      ADA .1       GET ADDR OF 1ST EQT. # IN TABLE. 
XSIO1 LDB A,I      GET AN EQT. # FROM TABLE.
      CPB TEMP5    IF IT MATCHES THIS REQUEST'S EQT. #, 
      JMP XSIO2     SET UP TO HANG REQUEST ON $ELTB ENTRY.
* 
      INA          BUMP ENTRY ADDR IN $ELTB.
      ISZ TEMP3    IF TABLE NOT ALL DONE, 
      JMP XSIO1     LOOP BACK.
* 
      JMP XSIO3    SKIP: THIS EQT. IS NOT LOCKED. 
* 
XSIO2 LDB EQT1     FIRST PRESERVE (EQT1)
      STB XSEQ1     BEFORE FOOLING "LINK".
* 
      ADA TEMP1    COMPUTE ADDR OF LIST OF HUNG $XSIO 
      ADA TEMP1     REQUESTS (WORD 3 OF THIS EQT. #'S 
      STA EQT1       ENTRY) AND PASS IT TO "LINK" IN "EQT1".
* 
XSIO3 LDB $XSIO     SET ADDRESS 
      ADB .2        OF LIST POINTER WORD IN 
      STB TEMP1     REQUEST FOR <LINK>. 
* 
      LDA TEMPL     GET THE SUBCHANNEL WORD 
      AND B174K     ISOLATE THE SUB CHANNEL 
      CLE,INB       SET ADDRESS OF HIS CON WORD 
      ELA,ALF       MOST BIT TO 'E', REST AROUND
      ELA,SLA,RAL   TO BITS 2-5, SKIP IF MOST IS ZERO 
      ADA B20K      SET MOST IN BIT 13 IF REQUIRED
      ADA MSIGN     ADD THE 'SYSTEM REQUEST' BIT
      XOR B,I       ADD HIS INFORMATION 
      AND SUBCH     =B120074 THROW OUT THE EXCESS 
      XOR B,I       SET HIS BITS AGAIN
      STA B,I       PUT THE RESULT BACK IN THE QUE
      CLA           SET PRIORITY OF REQUEST = 0 
      STA TEMP2      FOR <LINK>,
      STA CONFL      SET CONTROL FLAG = 0 (REQUEST).
      STA TEMPL      SET DISC FLAG TO ZERO (NON-DISC) 
      LDA EQT5,I     GET THE DRIVER TYPE
      AND B36K       MASK TO TEST FOR DISC
      ADB .4        SET B TO THE RETURN ADDRESS 
      STB $XSIO      AND SAVE IT
      ADB N2         SET B TO DISC PRIORITY WORD
      LDB B,I        GET PRIORITY WORD
      CPA B14K      IF DISC 
      STB TEMP2      SET PRIORITY 
      CPA B14K       AND
      STA TEMPL      THE DISC FLAG FOR <LINK> 
* 
      JSB LINK     CALL TO LINK REQUEST IN I/O LIST.
      LDA XSEQ1    IF WE MODIFIED (EQT1) FOR
      SZA           EQT. LOCKING, THIS IS THE 
      STA EQT1       TIME TO RESTORE IT.
      SZA          ALSO, IF EQT. IS LOCKED, 
      JMP $XSIO,I   DON'T INITIATE THIS $XSIO CALL. 
* 
      SEZ            IF DEVICE IS BUSY
      JMP $XSIO,I      THEN EXIT. 
* 
      LDA $CKLO      ELSE, IF DEVICE IS 
      JSB STADV       DOWN, THEN RETURN 
      RSS              TO CALLER. 
* 
      JSB DRIVR    CALL DRIVER TO INITIATE OPERATION
      JMP $XSIO,I      -GOOD REQUEST,EXIT 
* 
      LDB $XSIO     BAD NEWS SO TRANSFER THE
      STB XSIOE     RETURN ADDRESS FOR NR ROUTINE 
* 
      JMP NOTRD     PRINT DIAGNOSTIC. 
      SPC 1 
XSIOE NOP 
SUBCH OCT 120074     SUBCHANNEL MASK, (PLUS SYSTEM RQ CODE) 
XSEQ1 NOP            TEMP. STORAGE FOR (EQT1) 
      HED < I/O CONTROL MODULE - COMPLETION SUBSECTION >
* 
* I/O COMPLETION SUBSECTION 
* 
*  THIS SECTION IS RESPONSIBLE FOR THE INITIATION 
*   OF STACKED I/O OPERATIONS, PLACING A USER 
*   PROGRAM BACK IN A SCHEDULED STATE WHEN ITS
*   I/O OPERATION IS COMPLETED, DYNAMIC ALLOCATION
*   OF THE TWO DMA CHANNELS AMONG SYNCHRONOUS 
*   DEVICES, AND CALLING FOR OPERATOR NOTIFICATION
*   OF EQUIPMENT MALFUNCTION. 
* 
*  <$CON1> IS ENTERED DIRECTLY FROM INTERRUPT CONTROL 
*   WHEN AN I/O OPERATION IS TERMINATED AND ALL 
*   ERROR RECOVERY PROCEDURES HAVE BEEN ATTEMPTED.
*   ON ENTRY TO THIS SECTION, (B) CONTAINS THE
*   NUMBER OF WORDS TRANSFERRED. THE ADDRESSES OF 
*   THE EQUIPMENT TABLE ENTRY ARE SET IN -EQT1- TO
*   - EQT 15-.
* 
*  REQUESTS ARE STACKED IN LISTS FOR EACH DEVICE
*   ACCORDING TO PRIORITY. THE REQUESTS ARE EITHER
*   USER (NORMAL), USER (AUTOMATIC OUTPUT BUFFERING)
*   OR SYSTEM - IDENTIFICATION OF REQUEST TYPE
*   THE CODE IN BITS 15-14 OF THE <CONTROL WORD>
*   IN EACH REQUEST CALL. THE FORMATS OF THE THREE
*   TYPES OF REQUESTS AS THEY APPEAR IN THE I/O 
*   LISTS ARE:
* 
*     1)  USER (NORMAL OPERATION) 
* 
*        THE PARAMETERS FROM THE REQUEST ARE STORED 
*       IN THE TEMPORARY AREA OF THE PROGRAM ID 
*       SEGMENT. THE LINK WORD OF THE SEGMENT IS
*       USED TO LINK INTO THE I/O LIST. 
* 
*        WORD         CONTENTS
*        ----         --------
*         1   < LINKAGE WORD           >
*         2   <T, CONTROL INFO, CODE   >
*         3   <BUFFER ADDRESS          >
*         4   <BUFFER LENGTH           >
*         5   <DISC TRACK ADDR OR ZERO >
*         6   <DISC SECTOR ADDR OR ZERO>
*         7   <PROGRAM PRIORITY        >
*         .   -REMAINDER OF ID SEGMENT .
* 
* 
      SKP 
* 
*     2)  USER OR SYSTEM (AUTOMATIC OUTPUT BUFFERING)                 RT
* 
*        REQUESTS OF THIS TYPE ARE CONSTRUCTED
*       IN THE SECTION OF SYSTEM AVAILABLE MEMORY.
* 
*        WORD         CONTENTS
*        ----         --------
*         1   < LINKAGE WORD           >
*         2   <T, CONTROL INFO, CODE   >
*         3   <PRIORITY OF REQUESTOR   > =0 IF SYSTEM 
*         4   <TOTAL BLOCK LENGTH WORDS>
*         5   <USER BUFFER LENGTH      >
*         6   <TRACK OPTION WORD       >
*         7   <SECTOR OPTION WORD      >
*         8   <WORD 1 OF USER BUFFER   >
*         .      .       .        . 
*         .      .       .        . 
*         N+7 <WORD N OF USER BUFFER   >
* 
*     3)  USER (CLASS INPUT/OUTPUT) 
* 
*        REQUESTS OF THIS TYPE ARE CONSTRUCTED
*       IN THE SECTION OF SYSTEM AVAILABLE MEMORY.
* 
*        WORD         CONTENTS
*        ----         --------
*         1   < LINKAGE WORD           >
*         2   <T, CONTROL INFO, CODE   >
*         3   <PRIORITY OF REQUESTOR   > (CHANGED TO STATUS AT COMP.) 
*         4   <TOTAL BLOCK LENGTH WORDS>
*         5   <CLASS ID WORD           >
*         6   <USER BUFFER LENGTH      > (CHANGED TO TLOG AT COMP.) 
*         7   <TRACK OPTION WORD       >
*         8   <SECTOR OPTION WORD      >
*         9   <WORD 1 OF USER BUFFER   >
*         .      .       .        . 
*         .      .       .        . 
*         N+8 <WORD N OF USER BUFFER   >
* 
       SKP
* 
*     4)  SYSTEM REQUEST
* 
*        THE SYSTEM REQUEST IS LINKED INTO
*       THE I/O LIST BY USING WORD 4 OF THE 
*       CALL AS A LINK WORD. A SYSTEM 
*       REQUEST ASSUMES THE PRIORITY LEVEL
*       OF ZERO (HIGHEST PRIORITY). 
* 
*        WORD         CONTENTS
*        ----         --------
*         1   <       JSB  $XSIO       >
*         2   <     LOGICAL UNIT #     >
*         3   <COMPLETION ROUTINE ADDR >
*         4   <   LINKAGE WORD         >
*         5   <T, CONTROL INFO, CODE   >
*         6   <BUFFER ADDR OR DISC CNTL>
*         7   <BUFFER LENGTH OR PRIORITY> 
*         8   <ID SEG FOR DISK CALLS, 0 
*              FOR "ALL BUFFERS IN SYSTEM>
* 
*  THE <T> FIELD (BITS 15-14 IN CONTROL WORD) 
*   IDENTIFIES THE REQUEST TYPE AS: 
* 
*      00   USER (NORMAL OPERATION) 
*      01   USER OR SYSTEM (AUTOMATIC BUFFERING)                      RT
*      10   SYSTEM
*      11   CLASS I/O 
* 
* 
      SKP 
$CON1 RAL,CLE,ERA   CLEAR THE SIGN BIT AND SAVE IN E
      STA TEMP3     SAVE STATUS FROM DRIVER AND 
      STB TLOG      TRANSMISSION LOG
      STB XLOG      SAVE TRANSMISSION LOG FOR RETRRN. 
* 
      JSB $RSM      GO RESTORE USER MAP IF NECESSARY
* 
      CLA           CLEAR 
      STA EQT15,I    TIME-OUT CLOCK.
* 
      LDA EQT4,I    SET THE COMPLETION SECTION FLAG 
      STA CONFL     AND TEST FOR DMA RETURN 
      SEZ,RSS        SIGN OF A IS EXPLICID RETURN OF
      SSA            DMA CHANNEL, CALL TO 
      JSB CLDMA       RELEASE ITS ASSIGNMENT. 
      LDA EQT3,I    CLEAR THE 
      ELA,CLE,ERA    DRIVER-EXITED-FROM-CONTINUATION- 
      STA EQT3,I      SECTION-TO-GET-DMA FLAG.
* 
L.49  LDB EQT1,I    GET CONTROL WORD FROM 
      CLE,SZB,RSS   IF ILLEGAL ENTRY
      JMP CIC.4      SEND ERROR MESSAGE 
* 
      SSB,INB        REQUEST BLOCK TO 
      JMP L.502     IF CLEAR COMPLETION GO CLEAN IT UP. 
      STB IOE11     SAVE CONWD FOR *IOERR* USE. 
* 
      LDA B,I         EXTRACT  <T> FIELD. 
      STA TEMP0     SAVE CONTROL WORD.
      LDB EQT1,I
      STB STMP3     SAVE REQUEST ADDR. FOR ERROR ECHO WORK. 
      LDA TEMP3     IF ERROR, 
      CPA .1         GO PROCESS.
      JMP NOTRD 
* 
      LDA B,I       UNLINK
      STA EQT1,I     CURRENT I/O
      LDA TEMP0       REQUEST.
      RAL,SLA,ELA  IF BIT 15 = 1  (<T> = 2 OR 3)
      JMP L.53       PROCESS AS SYSTEM REQUEST. 
* 
      SEZ,RSS       IF <T> = 0, PROCESS 
      JMP L.51       AS NORMAL USER REQUEST.
* 
* RELEASE AUTOMATIC BUFFERING BLOCK 
* 
      LDA TEMP3     IF MALFUNCTION OCCURRED,
      SZA            THEN UNDO THE RELINKING
      STB EQT1,I      AND BY PASS RELEASE OF
      SZA              BUFFER.
      JMP L.70
      STB L.50
* 
      ADB .3        GET TOTAL 
      LDB B,I        BLOCK LENGTH AND 
      STB L.50+1      SET IN RELEASE CALL.
* 
      JSB $RTN     RELEASE BLOCK TO AVAILABLE MEM.
L.50  NOP            - BLOCK ADDRESS -
      NOP            - BLOCK LENGTH - 
L.501 JSB $CKLO     CHECK IF BELOW THE LIMIT. IF SO,
      JMP L.54       SCHED ANY WAITERS. START NEXT REQUEST. 
* 
L.502 ADB C100K     SUBTRACT ONE AND SIGN BIT 
      STB EQT1,I    RESET IN THE EQT AND
      JMP L.55      GO START THE NEXT RQ. 
      SKP 
* 
* NORMAL USER OPERATION COMPLETION
* 
L.51  STB L.52      SET CURRENT ADDR. FOR SCHEDULER.
      ADB .9        SET (B) = ADDR. OF XA IN ID SEG.
      LDA TEMP3      GET COMPLETION STATUS
      CLE,SZA         SET BIT 14
      CCE             IN STATUS WORD
      LDA EQT5,I      IF THE STATUS 
      RAL,RAL       IS NON-ZERO 
      ERA,CLE,ERA   AND SAVE IN USER A-REG. 
      STA B,I        CONTENTS OF PROGRAM. 
      INB 
      STB TEMP9      SAVE TRANSMISSION LOG ADDRESS
      LDA TLOG     SET TRANSMISSION LOG AS
      STA B,I        SAVED B-REGISTER.
      ADB .5        INDEX TO THE STATUS WORD
      LDA B,I       AND SAVE FOR
      STA TEMPX     DISC ERROR ROUTINE
* 
      JSB $LIST     CALL SCHEDULER MODULE TO PLACE
      OCT 101        USER PROGRAM INTO <SCHEDULE> 
L.52  NOP             LIST. 
      JMP L.54
* 
* SYSTEM REQUEST COMPLETION 
* 
L.53  STB PTR       SAVE THE QUEUE ADDRESS
      SEZ           IF CLASS REQUEST
      JMP C.01      GO REQUEUE THE REQUEST
* 
      ADB N1        GET WORD 3 OF REQUEST 
      LDA B,I         <COMPLETION ROUTINE ADDRESS>. 
      STA COMPL    SAVE COMPLETION ADDR. OR ZERO. 
      SKP 
* 
* < L.54 >  : AT THIS POINT:
*        1) A TEMPORARY BUFFER HAS BEEN RELEASED, 
*        2) A NORMAL OPERATION HAS CAUSED THE 
*            REQUESTING PROGRAM TO BE LINKED
*            BACK INTO THE <SCHEDULE> LIST, OR
*         3) A SYSTEM REQUEST COMPLETION ADDRESS
*            HAS BEEN SAVED.
* 
L.54  LDA TEMP3     BY PASS INITIATING THE NEXT 
      CMA,SSA,INA,SZA OPERATION IF A MALFUNCTION HAS
      JMP L.70       OCCURRED ON THIS DEVICE. 
* 
* 
L.55  LDA EQT5,I   CHECK <AVAIL> FIELD. 
      RAL 
      SSA            IF AV SAYS DOWN
      JMP IOCX      GO EXIT 
* 
* SECTION  <60> PROVIDES FOR INITIATING THE NEXT
*  OPERATION WAITING FOR THE COMPLETED DEVICE.
* 
L.60  LDA EQT5,I   SET <AVAIL>
      ALR,RAR       FIELD 
      STA EQT5,I     = 0 TO SAY AVAILABLE.
      JSB CLDVM     CLEAR DRVR MAP TABLE WORD 2 
      JMP L.68      GO START THE NEXT REQUEST 
* 
.11   DEC 11
N8    DEC -8
* 
*     CHECK IF BELOW THE BUFFER LIMIT ON THE CURRENT EQT. 
* 
$CKLO NOP 
      LDB $BLLO      CHECK IF BELOW THE LIMIT.
      JSB QCHK
      JMP $CKLO,I     NO, SO RETURN.
* 
      LDA B          YES, SO SCHEDULE ANY WAITERS 
      JSB $SCD3       AND 
      JMP $CKLO,I       RETURN. 
* 
* 
*     CLEAR WORD 2 OF DRIVER MAP TABLE
*     SO THAT SPURIOUS INTERRUPTS ENTER DRIVER IN SYTEM MAP.
*     IF THE LAST DRIVER REQUEST HAPPEN TO HAVE BEEN A NORMAL USER
*     REQUEST, THAT PROGRAM MIGHT NOT BE IN MEMORY ANY LONGER.
*     A PARTITION RESIDENT PROGRAM MAY HAVE BEEN REPLACED BY ANOTHER. 
* 
CLDVM NOP 
      LDA EQT1
      CPA $DMEQ      IS THIS COMPLETION OF BIT BUCKET?
      JMP CLDVM,I    YES, IGNORE DRIVER MAP TABLE CLEAR 
* 
      JSB CPEQT     CONVERT EQT1 ADDR TO EQT# 
      CCB           SUBTRACT 1 FROM EQT#
      ADB A          WHICH IS IN (A)
      ADB $DVMP     GET ADDR OF WORD 1
      ADB EQT#      GET ADDR OF WORD 2
      CLA            OF DRIVER'S MAP TABLE ENTRY
      STA B,I       CLEAR WORD TO FORCE SYS MAP 
      JMP CLDVM,I   RETURN
      SKP 
*     CLASS REQUEST COMPLETION
* 
*     CLASS COMPLETION IS HANDLED AS FOLLOWS: 
* 
*     1.  THE EXCESS BUFFER IS RETURNED ON WRITE COMPLETION 
*     2.  IF THE CLASS QUEUE IS NOT EXPECTING A REQUEST 
*         THE WHOLE BUFFER IS RELEASED AND WE EXIT. 
*     3.  IF A PROGRAM IS WAITING FOR THE REQUEST IT IS 
*         RESCHEDULED.
*     4.  THE REQUEST IS MODIFIED TO PUT THE STATUS WORD
*         AND THE TRANSMISSION LOG (TLOG) IN WORDS
*         3 (PRIORITY) AND 6 (USER LENGTH WORD) 
*     5.  THE CLASS QUEUE IS UPDATED AND WE EXIT. 
* 
*     SEE DESCRIPTION OF CLASS QUEUE IN COMMENTS AT BEGINNING 
*     OF SECTION ON USER REQUESTS.
* 
* 
C.01  LDB PTR       GET THE QUEUE ADDRESS 
      INB 
      LDA B,I       GET THE CON WORD
      ADB .2        STEP TO LENGTH WORD 
      STB CLTMP     SET LENGTH ADDRESS
      SLA           IF READ 
      JMP C.03      SKIP RETURN 
* 
      LDA B,I       GET BLOCK SIZE TO A.
      ADB .5        STEP TO RETURN BUFFER ADDRESS 
      ADA N8        SUBTRACT SIZE OF OVERHEAD 
      STA CLRTN     SET RETURN SIZE 
      ADA N2        IF LESS THAN TWO WORDS
      SSA           THEN SKIP 
      JMP C.03      THE RETURN
* 
      STB CARTN     SET THE BUFFER ADDRESS
      JSB $RTN      RETURN THE WRITE BUFFER 
CARTN NOP           BUFFER ADDRESS
CLRTN NOP           BUFFER LENGTH 
* 
      LDA CLRTN     SET THE 
      CMA,INA       NEW BLOCK SIZE
      ADA CLTMP,I   IN THE BLOCK
      STA CLTMP,I   SET THE NEW SIZE
* 
C.03  ISZ CLTMP     STEP TO CLASS WORD
      LDA CLTMP,I   GET THE CLASS 
      AND B377      COMPUTE THE 
      ADA DCLAS     CLASS HEAD ADDRESS
* 
C.04  LDB A,I       GET THE CONTENTS OF CLASS HEAD. 
* 
      CLE,SSB,RSS   IF POSITIVE 
      JMP C.08      GO TRACK DOWN THE QUE.
* 
      STA CLASS     SAVE THE CLASS QUEUE ADDRESS
      RBL,CLE,ELB   IF PROGRAM WAITING
      SEZ,CLE,RSS 
      JMP C.05      SKIP,ELSE GO LINK IN THE RQ.
* 
*     PROGRAM IS WAITING, CLEAR THE WAIT FLAG 
*     AND RESCHEDULE THE PROGRAM
* 
      ERB,RBR       CLEAR THE WAIT FLAG 
      STB A,I       AND RESET IN THE QUEUE. 
* 
      JSB $SCD3     SCHEDULE ANY PROGRAMS WAITING 
C.05  LDB CLASS,I   GET CURRENT END OF LIST 
      ADB N1        SUBTRACT ONE PENDING REQUEST
      STB PTR,I     SET IN NEW END OF LIST
      LDB PTR       SET NEW ELEMENT IN
      STB CLASS,I   THE LIST. 
* 
      ISZ PTR       STEP TO 
      ISZ PTR       PRIORITY ADDRESS
      ISZ CLTMP     STEP TO BUFFER LENGTH WORD
      LDA EQT5,I    GET CURRENT STATUS
      ALR,RAL       CLEAR DOWN/BUSY BITS. 
      LDB TEMP3     GET COMPLETION STATUS 
      CMB,CLE,INB   IF FROM ILCODD
* 
      CME           IF BAD COM CODE 
      ERA,CLE,RAR   SET BIT 14
      LDB TLOG      GET THE TRANSMISSION LOG. 
      STA PTR,I     SET THE STATUS WORD 
      STB CLTMP,I   AND THE TLOG
* 
      JMP L.501     ELSE STANDARD COM EXIT
* 
C.08  LDA B         TRACK DOWN
      JMP C.04      THE END OF THE LIST 
      SPC 1 
* 
* THIS DEVICE IS COMPETING WITH OTHER DEVICES FOR 
*  THE USE OF THE AVAILABLE DMA CHANNEL. THE <A>
*  FIELD IN THE CURRENT ENTRY IS SET = 3 TO MEAN
*  WAITING FOR DMA. THE EQT IS THEN SCANNED FROM
*  FIRST TO LAST ORDER (#1 TO N) TO FIND THE FIRST
*  UNIT WAITING FOR DMA. THEREFORE, THE ORDER OF
*  THE EQT DETERMINES PRIORITY FOR DYNAMIC ASSIGN-
*  MENT OF DMA CHANNELS - THE SYSTEM DISC SHOULD
*  BE THE FIRST ENTRY IN THE EQT. 
* 
L.63  LDA EQT#      SET # OF
      CMA,INA        EQT ENTRIES
      STA TEMP1       AS AN INDEX VALUE.
      LDB EQTA      INITIALIZE TO FIRST EQT ENTRY.
* 
L.64  STB TEMP2     SAVE CURRENT ENTRY ADDR.
      ADB .4        EXTRACT 
      LDA B,I        <A> FIELD FROM 
      RAL             WORD 5. 
      SSA,SLA       IF A = 3, GO TO 
      JMP L.66       ASSIGN DMA.
* 
L.65  ADB .11      SET (B) FOR NEXT ENTRY.
      ISZ TEMP1     END OF EQT? 
      JMP L.64       - NO, CONTINUE SCAN
* 
      CCA           DECREMENT THE DMA COUNT 
      ADA DMACF     (MUST HAVE ABORTED A DMA
      STA DMACF      WAIT WITH 'OF,XXX,1' REQUEST)
      JMP IOCX      EXIT
* 
L.66  CLA,INA       IF ONLY 1 DEVICE WAITING
      CPA DMACF      FOR  DMA, GO TO
      JMP L.67        ASSIGN TO THIS DEVICE.
* 
      LDA TEMP2     IF CURRENT UNIT IS
      CPA EQTA       FIRST IN EQT (I.E SYSTEM DISC) 
      JMP L.67       ASSIGN ANYWAY. 
* 
      CPA EQT1      IF SAME DEVICE JUST COMPLETED,
      JMP L.65       ALLOW OTHER DEVICES DMA TIME.
* 
L.67  LDA TEMP2     IF DEVICE TO BE INITIATED IS
      CPA EQT1       SAME AS INTERRUPTING DEVICE, 
      RSS            SKIP SETTING EQT ADDRESSES.
      JSB $ETEQ     SET EQT ADDRESSES.
* 
      LDA EQT1,I    IF NO I/O QUEUED ON THIS
      SZA,RSS        DEVICE, THEN GO CLEAN OUT
      JMP L.60        ITS 'WAITING ON DMA ALLOC.' FLAG. 
* 
* CALL <DRIVR> IF A REQUEST IS STACKED OR A 
*  WAITING UNIT IS ASSIGNED A DMA CHANNEL.
* 
L.68  LDA EQT1      GO CLEAN OUT ANY
      CPA $DMEQ      I-O REQUESTS IF THIS 
      JMP IOCX7       IS THE BIT BUCKET.
* 
      LDB EQT1,I    IF NO REQUEST 
      SZB,RSS        IS WAITING, THEN 
      JMP IOCX        GO EXIT.
* 
      JSB DRIVR     CALL  <DRIVR> 
      RSS            IF GOOD REQUEST THEN SKIP
      JMP NOTRD     DIAGNOSTIC IF NOT AVAILABLE.
      SKP 
* 
****************************************************************
* 
* I/O COMPLETION  - EXIT SECTION. 
* 
* THIS ROUTINE FIRST CHECKS FOR A DMA QUEUE AND IF ANY AND IF A 
*      CHANNEL IS AVAILABLE, THEN THE CHANNEL ASSIGNMENT ROUTINE
*      IS ENTERED.  IF THIS CONDITION DOES NOT EXIST, THEN
*      IF THE "BIT BUCKET FLAG" IS SET, THEN THE BIT BUCKET 
*      I/O REQUEST ARE CLEANED OUT.  IF THE FLAG IS NOT SET, THEN 
*      IF THE REQUEST IS A SYSTEM REQUEST WITH A COMPLETION ADDRESS,
*      THEN CONTROL IS TRANSFERED TO THE COMPLETION ADDRESS.  IF
*      NEITHER OF THESE CONDITIONS EXITS, THEN THE OPERATOR ATTENTION 
*      FLAG IS CHECKED.  IF SET, THEN THE OPERATOR ACKNOWLEDGEMENT
*      ROUTINE IS ENTERED.  IF NOT SET, THEN CONTROL IS RETURNED
*      TO THE SYSTEM. 
* 
***************************************************************** 
* 
IOCX  LDA DMACF      GET THE DMA QUEUE FLAG 
      SZA,RSS         IF EMPTY QUE THEN 
      JMP IOCX1       GO EXIT 
* 
      DLD INTBA,I     ELSE GET THE DMA FLAGS
      SZA             IF ANY
      SZB,RSS          AVAILABLE
      JMP L.63      GO ALLOCATE IT. 
* 
IOCX1 LDB $BITB     CHECK THE "BIT BUCKET FLAG" TO SEE
      SZB            TO SEE IF THE BIT BUCKET MUST BE 
      JMP IOCX0       CLEANED OUT.
* 
      LDA  COMPL     IF SYSTEM REQUEST
      STB COMPL      CLEAR COMPLETION SPECIFICATION.
      LDB XLOG
      SZA           COMPLETION ROUTINE SPECIFIED, 
      JMP  A,I      OPERATE IT. 
* 
      LDB OPATN    GET OPERATOR ATTENTION FLAG
      STA OPATN     - CLEAR FLAG -
      SZB          IF OPERATOR DESIRES CONTROL, 
      JMP $TYPE     ACKNOWLEDGE.
      JMP $XEQ     OTHERWIZE, RETURN TO THE DISPATCHER. 
* 
XLOG  NOP 
      SKP 
* 
* 
*     CLEAN OUT BIT BUCKET REQUESTS.
* 
* 
IOCX0 LDA $DMEQ     SET UP THE BIT
      JSB $ETEQ      BUCKET EQT ADDRESSES.
IOCX7 LDB EQT1,I    CHECK IF THERE IS ANY 
      SZB,RSS        I/O REQUEST TO BE
      JMP IOCX9       INITIATED ON THE BIT BUCKET.
* 
      LDB EQT1,I    YES, SO GET THE REQUEST'S 
      ADB .3         SIZE AND DO AN IMMEDIATE 
      LDB B,I         COMPLETION. 
      JMP L.136 
* 
IOCX9 STB $BITB     NO, SO CLEAR BIT BUCKET FLAG AND
      JSB $CKLO      CHECK BUFFER LIMITS AND SCHED.WAITERS. 
      JMP IOCX1 
* 
$BITB NOP           BIT BUCKET FLAG.  DO NOT TOUCH. 
      SKP 
* 
* 
* I/O DEVICE COMPLETION ERROR FROM DRIVER 
*  (A) = ERROR CODE 
* 
L.70  LDA TEMP3 
      CPA .3       IF PARITY ERROR, 
      CCE,RSS       CHECK FOR DISC. 
      JMP IOERR     - OTHER ERROR CONDITION - 
* 
      LDA EQT5,I   IF 
      AND B36K      DEVICE
      CPA B14K      IS DISC, PUT
      JMP DISCE     OUT SPECIAL MESSAGE.
* 
      LDA .3       PARITY ERROR ON
      JMP IOERR     OTHER DEVICE, PRINT DIAG. 
* 
* DISC ERROR PROCESSING (SYSTEM/USER) 
* 
DISCE LDA TLOG     (A) = ERROR TRACK ADDRESS. 
      JSB $CNV3    CONVERT TO DECIMAL ASCII.
      LDB A,I       FETCH 1ST WORD OF RESULT **780221 GLM** 
      STB DMSG+1    AND SET IT INTO MESSAGE 
      INA           ADVANCE TO FINAL TWO WORDS
      DLD A,I       FETCH THEM
      DST DMSG+2    AND SAVE IN ERROR MESSAGE.
      JSB CPEQT    COMPUTE EQT ENTRY # (SETS E).
      JSB $CNV1 
      STA DMSG+6    SET IN ERROR MESSAGE. 
* 
      LDA EQT4,I     GET SUBCHANNEL 
      ALF,ALF         AND CONVERT 
      RAL,RAL         TO ASCII
      AND B37 
      JSB $CNV1 
      STA DMSG+8
* 
      LDB TEMP0    (B)= REQUEST TYPE
      LDA BLS      (A)= " S"
      SSB,RSS       IF USER TYPE REQUEST, 
      LDA BLU       (A)= " U" 
      STA DMSG+9   SET "S" OR "U" IN MESSAGE
* 
      LDA EQT1     SAVE DISC
      STA TEMP7     -EQT- ADDRESS 
      LDA COMPL    SAVE REQUEST (SYSTEM)
      STA TEMP8     COMPLETION ADDRESS
      LDA DMSGA    PRINT DIAGNOSTIC 
      SSB           IF SYSTEM REQUEST 
      JMP SYSE          WRITE ON LU 1 ONLY
* 
      LDB L.52      FETCH THE LOSER'S ID ADDRESS
      JSB $PSTE     POST ERROR TO SCB (IF IN SESSION) 
      JSB $BFOT     ECHO ERROR TO SESSION TERMINAL <(A) IS SAVED> 
* 
SYSE  JSB $YMG      SEND "TRNNNN EQTXX,UYY S(OR U)" TO LU 1 
* 
      CCB 
      LDA TEMP0    IF DISC ERROR
      SSA           FROM SYSTEM REQUEST,
      JMP L.71      CONTINUE. 
* 
      STB TEMP9,I   SET TLOG IN ID-SEGMENT FOR ABORT
      ALF,ALF        IF LU # 2 OR 3,
      AND .3          SET TRACK DOWN
      SZA,RSS         IN TAT- 
      JMP L.71       OTHERWISE, CONTINUE
* 
      SLA,RSS 
      CLB,RSS 
      LDB TATSD 
      ADB TLOG     INDEX TO 
      ADB TAT       TAT, SET ERROR
      LDA MSIGN     TRACK 
      STA B,I        "DOWN" (ASSIGNED TO SYSTEM). 
* 
      LDA L.52     (A)= ID SEGMENT ADDRESS
      LDB TEMPX     GET THE SAVED STATUS AND IF NO-ABORT SET
      SSB,RSS       SKIP THE ABORT
      JSB $ABRT     -- ABORT  PROGRAM --
* 
L.71  STB TLOG      SET TLOG FOR SYSTEM EXIT
      LDA TEMP8    RESET "COMPLETION" 
      STA COMPL     ADDRESS.
      LDA TEMP7     RESET EQT 
      STA CONFL     SET FLAG FOR COMPLETION.
      JSB $ETEQ     ADDRESSES 
      JMP L.60
* 
DMSGA DEF *+1 
      DEC -20 
DMSG  ASC 10,TR NNNNN EQTXX UYY S 
BLS   ASC 1, S
BLU   ASC 1, U
      HED < I/O CONTROL MODULE - ERROR SECTION >
* 
* I/O  REQUEST ERROR SECTION
* 
*  PART 1: ERRORS ENCOUNTED IN ANALYSING A
*          USER REQUEST CAUSE A DIAGNOSTIC
*          TO BE PRINTED ON THE SYSTEM
*          TELETYPEWRITER AND THE USER
*          PROGRAM ABORTED. THE FORMAT OF 
*          THE DIAGNOSTIC IS: 
* 
*           'IONN  PNAME  RADDR'
* 
*           AS CONSTRUCTED AND SET
*           BY THE ROUTINE -$ERMG- IN 
*           THE PROGRAM <$RQST>. -NN- IS A
*           CODE IDENTIFYING THE ERROR TYPE.
* 
ERR00 CLB,RSS      ILLEGAL CLASS NUMBER OR SECURITY CODE
ERR01 CLB,INB      INSUFFICIENT # OF PARAMETERS 
      RSS 
ERR02 LDB .2       ILLEGAL LOGICAL UNIT REFERENCE,
      RSS            = 0  OR UNDEFINED. 
ERR03 LDB .3       ILLEGAL EQT REFERENCE.  SELECT CODE = 0
      RSS 
ERR04 LDB .4       USER BUFFER VIOLATES SYSTEM
      RSS           OR OTHER BOUNDARIES.
ERR05 LDB .5       ILLEGAL DISC TRACK OR SECTOR 
      RSS           ADDRESS IN DISC REQUEST.
ERR06 LDB .6       REFERENCE TO PROTECTED DISC TRACK
      RSS 
ERR08 LDB .8       DISC TRANSFER EXCEEDS TRACK BOUND
      RSS 
ERR09 LDB .9        LOAD-N-GO AREA OVERFLOW 
      RSS 
ERR10 LDB B400      DOUBLE REQUEST ON SAME CLASS
      RSS 
ERR12 LDB B402      REQUESTED LU NOT DEFINED FOR THIS SESSION 
      RSS 
ERR13 LDB B403      EQT/LU LOCKED AND "NO SUSPEND" BIT SET
      RSS 
ERR14 LDB B404      DEVICE DOWN AND "NO SUSPEND" BIT SET
      RSS 
ERR26 LDB B1006     REFERENCE TO A SPOOL LU THAT HAS BEEN KILLED
* 
      LDA ERIO     (A) = ASCII * IO *.
      JMP $ERAB     WRITE DIAGONISTIC AND EXIT TO DISPATCHER
* 
*  NOTE: $ERAB ADDS AN ASCII "00" TO THE (A) REG UPON ENTRY.
* 
* 
ERIO  ASC 1,IO
B400  OCT 400 
B402  OCT 402 
B403  OCT 403 
B404  OCT 404 
B1006 OCT 1006
      SKP 
*  PART 2:  ILLEGAL REQUEST DETECTED BY 
*          I/O DRIVER. THE REASON IS A READ OR
*          WRITE OPERATION IS ILLEGAL FOR THE 
*          DEVICE OR A CONTROL REQUEST IS 
*          MEANINGLESS FOR THE DEVICE.
*           AN ADDITIONAL REASON FOR TRANSFER TO THIS 
*          SECTION IS AN "IMMEDIATE COMPLETION" (CODE 4)
*          RETURN FROM THE DRIVER; PROCESSED AS A 
*          CONTROL REJECT.
* 
* 
*          ERROR PROCEDURE IS:
*          1. IF THE REQUEST IS PROCESSED AS
*             BUFFERED OUTPUT, THE TEMPORARY
*             BLOCK IS RELEASED TO AVAILABLE
*             MEMORY. 
* 
*          2. THE REJECT IS IGNORED IF A SYSTEM 
*             PROGRAM GENERATED THE REQUEST - 
*             HOWEVER, A COMPLETION ROUTINE,
*             IF SPECIFIED IN THE REQUEST, IS 
*             OPERATED. (NOTE: THIS PHILOSOPHY
*             IS BASED ON THE ASSUMPTION THAT 
*             THIS CONDITION SHOULD NEVER OCCUR.) 
* 
*          3. A USER CONTROL REQUEST WHICH IS 
*             REJECTED IS TREATED AS IF IT
*             WAS PERFORMED. THE PROGRAM IS 
*             LINKED BACK INTO THE SCHEDULE LIST. 
* 
*          4. A USER READ OR WRITE REQUEST REJECT 
*             CAUSES A DIAGNOSTIC TO BE ISSUED
*             AND THE PROGRAM ABORTED.
      SKP 
ILLCD CLB 
      CPA .4        IF CODE =4 FOR IMMEDIATE
      RAR,SLA        COMPLETION, TREAT AS CONTROL 
R00   STB TLOG      ELSE SET TLOG TO 0. 
      STA TEMP4      REJECT,  SAVE CODE.
      CPA .2        SET ERROR FLAG FOR
      CLA            CLASS COMPLETION.
      CMA,INA       NEGATE TO AVOID 
      STA TEMP3      REPORT AT L.54.
      LDB EQT1,I   GET LOCATION OF
      LDA B,I       ILLEGAL REQUEST (LINK ADDR.)
      STA TEMP0    SAVE NEXT REQUEST ADDRESS. 
      INB          GET CONTROL WORD 
      LDA B,I       OF REQUEST BLOCK
      STA EQT6,I     SAVE FOR REXIT 
      RAL          CHECK <T> FIELD
      SSA,RSS       FOR TYPE OF REQUEST BLOCK.
      JMP R02       -USER OR SYSTEM-
* 
      CCE,SLA       IF CLASS REQUEST
      JMP L.49      GO DO CLASS COMPLETION. 
      ADB .2       BUFFERED BLOCK.
      LDB B,I      GET TOTAL BLOCK LENGTH.
      STB R01B     SET IN RELEASE CALL. 
      LDA EQT1,I   SET FWA OF BLOCK 
      STA R01A      IN RELEASE CALL.
      JSB $RTN     RELEASE BLOCK. 
R01A  NOP           - FWA - 
R01B  NOP           - # WORDS - 
      JMP REXIT 
* 
R02   SLA,RSS      CHECK <T> FIELD AGAIN. 
      JMP R03       -USER PROGRAM REQUEST-
* 
      ADB N2       GET WORD IN SYSTEM REQUEST 
      LDA B,I       CONTAINING -COMPLETION ROUTINE- 
      STA  COMPL    ADDRESS OR 0 AND SAVE IT. 
      JMP REXIT 
* 
R03   LDA TEMP4    USER REQUEST-
      CPA .2        CONTINUE IF CONTROL REQUEST 
      JMP R04        REJECTED.
      LDA EQT1,I   SET ID SEGMENT ADDRESS OF PROGRAM
      STA XEQT      CONTAINING ERROR. 
      ADA .8       GET POINT OF SUSPENSION ADDRESS
      LDB A,I       GET RETURN ADDRESS
      STB RQRTN     AND SAVE ON BASE PAGE 
      CCE,INA       SET XSUSP(SET E FOR $CNV1 
      STA XSUSP     TO POINT TO SAVED INITIAL CALL ADDRESS
      LDA EQT1     SAVE CURRENT 
      STA TEMP9     EQT ENTRY ADDRESS.
      LDA CONFL    SAVE CURRENT 
      STA SCONF     *CONTROL FLAG*
      LDA TEMP4 
      CPA .1       CHANGE ANY NOT READY REJECT
      LDA .7        CODE TO 7.
      JSB $CNV1    CONVERT TO ASCII AND 
      IOR AS00       FILL LEADING ZEROES
      LDB A         STORE IN B REG. 
      LDA ERIO     (A) = ASCII  * IO *
      JSB $ERMG    PRINT DIAGNOSTIC AND ABORT PROG
      CLA           SET XEQT
      STA XEQT      TO ZERO TO FOURCE RELOAD
      LDA SCONF    RESTORE
      STA CONFL     *CONTROL FLAG*
      LDA TEMP9    RESTORE UNIT 
      JSB $ETEQ     EQT ENTRY ADDRESSES.
      JMP REXIT 
* 
R04   LDA EQT1,I   SET PROGRAM ID SEGMENT 
      STA R05A      ADDR. IN LIST CALL. 
      ADA .9       (A) = ADDR. OF XA IN ID SEGMENT. 
      LDB EQT5,I   SET DEVICE STATUS
      STB A,I       WORD IN XA. 
      LDB TLOG      STORE 
      INA           TRANSMISSION LOG
      STB A,I       IN XB.
      JSB $LIST    CALL SCHEDULER 
      OCT 101       TO LINK PROGRAM BACK
R05A  NOP           INTO SCHEDULE LIST. 
* 
REXIT LDA TEMP0    SET NEXT LIST
      STA EQT1,I    ENTRY ADDRESS.
      LDA EQT6,I    GET CONWORD 
      CLB          CLEAR ERROR
      STB TEMP3     FLAG. 
      CPB CONFL     IF $XSIO CALL 
      SSA,RSS        THEN SKIP, 
      JMP L.501     ELSE DO NEXT REQUEST. 
      JMP $XSIO,I   $XSIO ERROR RETURN (REQUEST SKIPPED)
* 
* 
AS00  ASC 1,00
      SKP 
* 
**********************************************************************
* 
*          I/O DEVICE ERROR SECTION 
* 
*     THIS SECTION IS ENTERED WHEN A DEVICE IS UNAVAILABLE FOR
*     INITIATION OF AN OPERATION OR WHEN AN ERROR IS DETECTED AT THE
*     END OF AN OPERATION.  A DIAGNOSTIC MESSAGE IS PRINTED ON THE
*     SYSTEM CONSOLE IN THE FOLLOWING FORMAT: 
* 
*                    IONM L XXX EYY SZZ QQQ 
* 
*     WHERE: XXX = THE LOGICAL UNIT NUMBER OF THE DEVICE
*             YY = THE EQT NUMBER OF THE DEVICE 
*             ZZ = THE SUBCHANNEL NUMBER OF THE DEVICE
*            QQQ = THE DEVICE STATUS AT THE TIME OF FAILURE 
*             MN = A MNEMONIC DESCRIBING ONE OF THE FOLLOWING CONDITIONS
*                  1. NR - DEVICE IS NOT READY
*                  2. ET - END-OF-TAPE OR TAPE SUPPLY LOW ON THE DEVICE 
*                  3. PE - TRANSMISSION PARITY ERROR TO/FROM THE DEVICE 
*                  4. TO - THE DEVICE TIMED OUT 
*                     -- NEW CODES MAY BE ADDED HERE -- 
* 
*     GIVEN A BAD I/O REQUEST, IOERR WILL DOWN ALL LU'S ASSOCIATED WITH 
*     THE DEVICE(DEFINED BY THE EQT AND SUBCHANNEL).  ALL I/O CHANNELS
*     ASSOCIATED WITH THE EQT ARE CLEARED.  ALL I/O REQUESTS ASSOCIATED 
*     WITH THE DEVICE ARE UNSTACKED FROM THE EQT'S I/O REQUEST QUEUE AND
*     RELINKED IN THE LOWEST LU'S(MAJOR LU) I-O REQUEST QUEUE(DRT ENTRY 
*     WORD 2)BY THE SUBROUTINE UNLNK.  DRT ENTRY WORD 2 OF OTHER DOWNED 
*     LU'S ARE SET TO THE LU NUMBER OF THE MAJOR LU.  THE LU DOWN BIT(BI
*     15 OF DRT ENTRY WORD 2)FOR EACH DOWNED LU IS SET.  THE EQT ENTRY I
*     NOT SET DOWN.  I/O ERROR MESSAGES ARE ISSUED FOR ALL LU'S SET DOWN
* 
*     ON ENTRY, <A> CONTAINS A NUMBER CORRESPONDING TO THE ASSOCIATED 
*     MNEMONIC AND EQT1 CONTAINS THE ADDRESS OF WORD ONE OF THE ASSOCIAT
*     DEVICE'S EQT ENTRY. 
* 
*     THE FOLLOWING TEMPORARY LOCATIONS ARE USED FOR TEMPORARY STORAGE B
*     IOERR:
*     <TEMP8>:=SUBCHANNEL-EQT WORD FOR THE BAD I-O REQUEST GIVING THE 
*              SUBCHANNEL IN BITS 11-15 AND THE EQT IN BITS 0-5(USED BY 
*              LUERR).
*     <TEMP9>:=WORD 2 OF THE BAD I-O REQUEST. 
* 
**********************************************************************
* 
      SKP 
NOTRD LDB EQT1,I    LU NOT READY ENTRY. 
      INB           GET BAD I-O REQUEST CONWD 
      STB IOE11      AND SAVE FOR LATER.
      CLA,INA       SET A=1 FOR NOT READY.
* 
      LDB EQT1,I    SAVE CURRENT REQUEST ADDRESS
      STB STMP3      FOR POSSIBLE ERROR ECHO WORK.
IOERR LDB EQT1      REMOVE ALL ENTRIES IN THE QUEUE 
      STB HEAD       RELATED TO THE BAD I-O REQUEST.
      ADA ERTBL     INDEX TO ERROR CODE TABLE.
      LDA A,I       GET MNEMONIC AND SET
      STA IOMSG+1    IN DIAGNOSTIC MESSAGE. 
      JSB CLDVM     CLEAR DRIVER MAP TABLE WORD 2 
* 
      JSB CPEQT     GET EQT NUMBER(SETS E=1). 
      STA TEMP8     SAVE EQT NUMBER.
      JSB $CNV1     CONVERT TO ASCII
      STA IOMSG+6    AND SAVE(E MUST = 1).
* 
      LDA EQT4,I    GET LAST USED SUBCHANNEL
      ALF,RAL        FORM EQT4 AND POSITION 
      AND B174K       TO HIGH 5 BITS. 
      IOR TEMP8     ADD IN EQT NUMBER 
      STA TEMP8      AND SAVE AS SUBCHANNEL-EQT WORD. 
* 
      ALF,RAL       GET SUBCHANNEL
      AND B37        NUMBER.
      JSB $CNV1     CONVERT TO ASCII(ON ENTRY,E MUST=1) 
      STA IOMSG+8    AND SAVE.
* 
***780221 GLM***
* 
      LDA EQT5,I    FETCH DEVICE STATUS 
      AND B377      ISOLATE IT
      CLE           AND CONVERT IT
      JSB $CNV3          TO OCTAL 
      INA 
      DLD A,I       FETCH RESULT
      DST IOMSG+9   AND SAVE IN MESSAGE BUFFER
* 
* 
      JSB LUERR     DOWN THE LOGICAL UNITS(ENTRY A#0).WAIT UNTIL
      LDA EQT5,I     AFTER LUERR CALL TO SET AVAIL FIELD TO 0 SO
      ALR,RAR         WE WON'T ENTER DRIVER(VIA $XSIO)TO PRINT
      STA EQT5,I       ERROR MESSAGE ON SAME EQT WE'RE DOWNING. 
* 
      SEZ           CHECK IF WE TRIED TO
      JMP IOER9      DOWN LU 1.  IGNORE ATTEMPT.
* 
      LDA EQT1
      LDB A,I       CHECK IF WE MUST
      SZB            INITIATE AN
      JSB $DLAY       I/O REQUEST OF THIS EQT.
* 
      LDB IOE11,I   GET SAVED WORD 2(CONWORD) 
      LDA CONFL      FOR THE BAD I/O REQUEST. 
      SZA           IF COMPLETION SECTION IS IN 
      JMP IOCX       CONTROL, THEN EXIT IOC.
* 
      RBL,SLB       IF REQUEST SECTION IN CONTROL,
      SSB            CHECK IF USER OR SYSTEM I/O REQUEST. 
      JMP IOCX      IF USER, GO TO EXECUTION SECTION. 
      JMP XSIOE,I   IF SYSTEM, RETURN TO SYSTEM CALLER. 
* 
IOER9 LDA CONFL     SAVE CONTROL
      STA SCONF      FLAG.
      CLA,INA       SET 
      JSB $CNV1      ASC11 1
      STA IOMSG+4     INTO MESSAGE. 
      LDA BLKS      FETCH 2 BLANKS
      STA IOMSG+3    AND PAD BUFFER 
      LDA IOMSA     FETCH MESSAGE ADDR
      JSB $YMG      ISSUE MESSAGE TO LU 1.
      LDA SCONF     RESTORE FLAG. 
      STA CONFL 
      JMP L.60
* 
HEAD  NOP 
IOE11 NOP 
BLKS  ASC 1,
* 
* 
IOMSA DEF *+1 
      DEC -22 
IOMSG ASC 11,IONM L XXX EYY SZZ QQQ 
* 
* 
* 
*     I/O DEVICE ERROR MNEMONIC TABLE--ORDERED BY 
*         ERROR CODE DESCRIBING CONDITION.
* 
ERTBL DEF * 
ASNR  ASC 1,NR          - NOT READY - 
      ASC 1,ET          - END OF TAPE (INFORMATION) - 
      ASC 1,PE          - TRANSMISSION PARITY ERROR - 
      ASC 1,TO          - TIMED-OUT - 
* 
*     NEW CODES MAY BE ADDED AT THIS POINT
* 
SBMSK OCT 20074 
* 
      SKP 
* 
***************************************************************** 
* 
*     SUBROUTINE LUERR
* 
*     THIS SUBROUTINE IS USED TO DOWN ALL LU'S CORRESPONDING TO A 
*     SPECIFIC EQT AND SUBCHANNEL.  IT WILL OPTIONALLY PRINT AN 
*     ERROR MESSAGE FOR EACH DOWNED LU. 
* 
*     CALLING SEQUENCE: 
*          <A>:=0  DO NOT PRINT I/O ERROR MESSAGES
*             :>0  PRINT I/O ERROR MESSAGES(ASSUMES ASCII EQT AND 
*                  SUBCHANNEL ALREADY SET)
*             :<0  PRINT I/O ERROR MESSAGE ON SESSION (MTM) 
*                  TERMINAL ONLY (THE DEVICE HAS ALREADY BEEN SET DOWN) 
*          <HEAD>:= POINTER TO I-O REQUEST LIST TO SCAN.
*          <TEMP8>:=SUBCHANNEL-EQT WORD FROM THE BAD I-O REQUEST. 
*          JSB LUERR
* 
*     RETURN: 
*          <E REG>:=1  TRIED TO DOWN LU 1 
*                 :=0  DID NOT TRY TO DOWN LU 1 
*          NO REGISTERS ARE SAVED.
*          SUBROUTINE UNLNK USES TEMP0 AND OTHERS.
*          USES THE FOLLOWING REGISTERS:
*            <TMP1>:=FLAG AS TO WHETHER TO PRINT(#0) OR NOT PRINT(=0) 
*                    I/O ERROR MESSAGES.
*            <TMP2>:=USED TO STORE THE MAJOR LU.
*            <TMP3>:=COUNTER FOR SCAN THROUGH DRT.
*            <TMP4>:=USED TO SAVE POINTER INTO DRT. 
*            <TMP6>:=USED TO SAVE EQT1. 
*            <TMP8>:=USED TO STORE LU TEMPORARILY.
* 
******
******  UPDATE NEW TEMPS USED  780223 GLM ***** 
******
******************************************************************
* 
STMP2 NOP 
STMP3 NOP 
STMP4 NOP 
STMP5 NOP 
* 
* 
LUERR NOP 
      STA TMP1
* 
      LDA CONFL     SAVE CURRENT
      STA SCONF      CONTROL FLAG.
* 
      CLA           SET MAJOR LU
      STA TMP2       TO ZERO. 
* 
      LDA LUMAX     SET 
      CMA,INA        UP 
      STA TMP3        COUNTER.
      LDB DRT       GET FIRST DRT ENTRY.
* 
      SKP 
D.00  LDA B,I       GET DRT WORD 1
      STB TMP4      SAVE POINTER IN DRT.
      AND C3700     COMPARE DRT WORD 1 TO THE SUBCHANNEL- 
      CPA TEMP8      EQT WORD(LESS THE LOCK FLAG).
      RSS           IF EQUAL,FOUND A LU,SO GO PROCESS.
      JMP D.04      OTHERWIZE,GO CONTINUE SCAN OF DRT.
* 
      LDA LUMAX     FOUND A LU MATCH SO PROCESS IT. 
      CCE,INA       COMPUTE THE(SET E=1 FOR POSSIBLE LU=1)
      ADA TMP3       LU NUMBER. 
      STA TMP8     SAVE LU NUMBER FOR LATER.
      CPA .1        CHECK TO SEE IF SYSTEM CONSOLE.  IF SO, 
      JMP D.06       DO NOT SET THE DEVICE DOWN.
      ADB LUMAX     POSITION POINTER TO DRT WORD 2. 
      LDA TMP2      CHECK TO SEE IF A MAJOR 
      SZA            LU HAS BEEN FOUND
      JMP D.02      IF SO,THEN STORE THE MAJOR LU # IN WORD 
*                                     2,SET THIS LU BUZY,ISSUE MESSAGE. 
* 
      STB A         SAVE DRT WORD 2 ADDRESS.
      LDB EQT1      SAVE EQT1 ADDRESS 
      STB TMP6       FOR RESTORATION. 
      LDB TMP1      FETCH CALL FLAG 
      SSB           IF DEVICE HAS ALREADY BEEN PUT DOWN 
*                                    (THIS WAS A REQUEST AGAINST A DOWN 
*                                     DEVICE) 
      JMP D.001     SKIP THE UNLINK WORK (ALREADY DONE).
* 
      LDB HEAD      GO UNLINK ANY I-O REQUESTS FROM 
      JSB $UNLK      THE GIVEN I-O QUEUE. (A&B PASS PARMS)
      DEF TEMP8 
D.001 LDA TMP8      SAVE THIS LU
      STA TMP2       AS MAJOR LU. 
      LDB TMP4      RESTORE POINTER TO DRT WORD 2.
      ADB LUMAX 
      LDA B,I 
D.02  CCE 
      RAL,ERA       SET THE(E MUST=1) 
      STA B,I        LU DOWN. 
      LDB TMP1      CHECK IF WE ARE TO PRINT ERROR
      CCE,SZB,RSS    MESSAGES(SET E=1 FOR $CNV1). 
      JMP D.025     NO, SO SKIP.
* 
*  PRINT ON BOTH SYSTEM AND SESSION TERMINALS 
* 
      LDA TMP8
*** 
***780223 GLM***
*** 
      JSB $CNV3     CONVERT LU TO 
      INA            ASCII, ADVANCE TO LAST TWO DIGITS
      DLD A,I       FETCH THEM
      DST IOMSG+3     AND SAVE IN ERROR MESSAGE.
      LDA TMP1      PRINT ONLY ON SESSION TERM? (CALL FROM L.014) 
      SSA           YES--CURRENT PROG IS REQUESTOR
      JMP D.021     SO GO DO IT 
* 
      LDA IOMSA     GET LU I/O ERROR MESSAGE
      JSB $YMG       AND ISSUE TO SYS CON.
      LDA TMP6      RESTORE 
      JSB $ETEQ      EQT POINTERS FOR ECHO WORK 
* 
* 
* 
* ECHO ERROR TO SESSION TERMINAL
* 
*  1ST DETERMINE REQUEST TYPE AND WHO IS IN 
*  CONTROL (INITIATION OR COMPLETION SECTION).
* 
* 
* 
* 
      LDA STMP3     FETCH CONTROL 
      INA              WORD OF THE
      LDA A,I              BAD REQUEST AND
      AND B140K     (B140000)         ISOLATE <T> FIELD.
      LDB SCONF     FETCH SAVED CONTROL FLAG
      SZB           INITIATION OR COMPLETION SECTION????? 
      JMP COMP1     --COMPLETION SECTION IS IN CONTROL
* 
* 
*   REQUEST SECTION IS IN CONTROL 
*   ECHO ALL BUT SYSTEM REQUESTS ( <T> FIELD = 10 ) 
* 
      CPA MSIGN     SYSTEM REQUEST? 
      JMP D.025        YES -- CONTINUE
* 
D.021 LDB XEQT        USER REQUEST AND THE CURRENT PROG IS THE LOSER
      STB STMP3     SAVE IN LOCAL TEMP
      JMP SCAN        GO CHECK FOR SESSION
* 
* 
*   COMPLETION SECTION IS IN CONTROL
* 
*   ONLY ECHO IF REQUEST WAS NORMAL USER REQUEST ( <T> FIELD =0 ) 
* 
COMP1 SZA           NORMAL REQUEST ?
      JMP D.025       NOPE -- SKIP ECHO 
* 
      LDB STMP3       NORMAL USER REQUEST-- FETCH ID ADDRESS
* 
* 
* 
*  OK TO ECHO -- NOW GO FIND OUT WHERE THE ECHO IS TO GO. 
* 
*  (GO FIND SYSTEM LU FOR SESSION LU 1, OR MTM LU)
* 
SCAN  JSB $LU??     NOTE: (B) = PROG ID ADDRESS 
       JMP D.025    NOT SESSION OR MTM\ OR LU 1 NOT DEFINED FOR SESSION 
       ADA DRT      SAVE RTN STATUS IN ENT (B<0=-MTM LU) A=SYSTEM LU (LU
      LDA A,I       ADVANCE TO DRT ENTRY AND FETCH IT 
      AND C3700     COMPARE EQT & SC (LESS LOCK FLAG) 
      CPA TEMP8     WITH CURRENT LU TO BE PUT DOWN
      JMP D.025       IF SAME , REJECT ECHO.
* 
* 
*   IF MTM, JUST ECHO (UNLESS MTM LU = 1)  (B)=TYPE 
* 
      SSB,RSS       SEE IF PROG IS SESSION OR MTM 
      JMP ITSES     IT'S SESSION--GO CHECK FOR POSSIBLE LU SWITCH 
* 
      CPB N1        DON'T ECHO IF MTM LU = 1
      JMP D.025     IT'S A ONE SO CONTINUE
* 
      LDB STMP3     FETCH PROG'S ID ADDRESS 
      LDA IOMSA     FETCH MESSAGE BUFFER ADDR 
      JSB $BFOT     GO ECHO 
      JMP D.024         AND THEN CONTINUE ERROR PROCESSING
* 
* 
*  (A) = SESSION WORD. LU?? MAPPED IN THE TABLE PARTITION (IF DEFINED). 
* 
*  FOR EVERY MATCH (SYS LU IN SST WITH LU BEING PUT DOWN), PLACE THE
*  ASSOIATED SESSION LU INTO THE ERROR MESSAGE AND ECHO TO SESSION
*  TERMINAL.
* 
*  NOTE THAT AN * (ASTERISK) IS INSERTED BEFORE THE LU TO INDICATE
*  THAT THE LU IS THE SESSION RELATED LU. 
* 
* 
ITSES LDA B,I       FETCH SST LENGTH
      STA STMP4     SAVE FOR SCAN 
      INB           ADVANCE TO FIRST ENTRY ADDRESS
      STB STMP5      SAVE FOR SCAN
* 
SSTLK LDA STMP5,I   FETCH SST ENTRY 
      ALF,ALF       SHIFT AND 
      AND B377          ISOLATE SYSTEM LU 
      INA           ADJUST FOR INTERNAL STRUCTURE (LU-1)
      CPA TMP8      SAME AS CURRENT DOWNER??
      CCE,RSS       YEP -- GO MODIFY ERROR MESSAGE
      JMP SSNXT     NOPE -- CONTINUE SCAN 
* 
      LDA STMP5,I   FETCH SESSION LU
      AND B377      ISOLATE AND ADJUST
      INA               FOR INTERNAL DATA STRUCTURE 
      JSB $CNV3     CONVERT TO ASCII ( E SET ABOVE FOR DECIMAL) 
      INA           ADVANCE TO LAST TWO DIGITS
      DLD A,I       FETCH ASCII LU
      IOR B25K      (B25000) INCLUDE SESSION INDICATOR "*"
      DST IOMSG+3   SAVE IN ERROR DIAGNOSTIC
      LDB STMP3     FETCH PROG'S ID ADDRESS 
      LDA IOMSA     FETCH MESSAGE BUFFER ADDRESS
      JSB $PSTE     POST ERROR TO SCB <A&B ARE SAVED> 
      JSB $BFOT     ECHO MESSAGE TO SESSION TERMINAL
      SEZ           IF REQUEST REJECTED (DOWN, NO SAM ,OR WHATEVER) 
      JMP D.024     ABORT ECHO REQUEST
* 
SSNXT ISZ STMP5     BUMP SST ADDRESS
      ISZ STMP4     BUMP COUNT, DONE? 
      JMP SSTLK     NOPE, CONTINUE SCAN OF SST
* 
D.024 LDA TMP6      SET EQT BACK UP 
      JSB $ETEQ         IN CASE ECHO WAS PERFORMED
* 
D.025 LDB TMP4
* 
D.04  INB           INCREMENT POINTER TO NEXT DRT ENTRY.
      ISZ TMP3
      JMP D.00      GO SCAN NEXT ENTRY. 
* 
      JSB $CKLO     CHECK BUFFER LIMITS AND SCHED WAITERS.
      CLE 
D.06  LDA SCONF     RESTORE CONTROL 
      STA CONFL      FLAG.
      JMP LUERR,I   IF NO MORE LU ENTRIES, RETURN.
* 
B25K  OCT 25000 
* 
      SKP 
* 
*********************************************************************** 
* 
*     SUBROUTINE $UNLK
* 
*     THIS SUBROUTINE IS USED TO UNLINK I/O REQUESTS FROM THE EQT I/O 
*     REQUEST QUEUE POINTED TO BY EQT1.  IT MAY BE USED IN ONE OF TWO 
*     MODES:
*     MODE I.   IF ON ENTRY THE A REGISTER EQUALS ZERO, NORMAL USER 
*               (UNBUFFERED)I-O REQUESTS ARE UNLINKED WITH THE CALLING
*               PROGRAMS SUSPENDED IN THE GENERAL WAIT LIST.  IT IS 
*               ASSUMED THAT THE EQT WILL BE SET DOWN BY THE CALLER.
*     MODE II.  IF ON ENTRY THE A REGISTER IS NONZERO, THEN ONLY I/O
*               REQUESTS MATCHING THE SUBCHANNEL GIVEN IN SUEQT ARE 
*               UNLINKED.  UNBUFFERED I/O REQUESTS ON THIS SUBCHANNEL AR
*               HANDLED AS IN MODE I.  BUFFERED, CLASS AND SYSTEM 
*               I/O REQUESTS ARE STACKED UPON AN LU I/O REQUEST QUEUE AF
*               THE I/O REQUEST POINTED TO BY THE A REGISTER IN THE ORDE
*               THAT THEY APPEARED IN THE EQT QUEUE.
* 
*     CALLING SEQUENCE: 
*          <SUEQT>:=THE SUBCHANNEL-EQT WORD DEFINING THE DEVICE(MODE II 
*                   ONLY, UNUSED WITH MODE I).
*          <B>:=EQT1(HEAD OF THE I-O REQUEST QUEUE)OF THE DEVICE'S
*               EQT(USED WITH MODE I AND II). 
*          <A>:=0  INDICATES MODE I PROCESSING. 
*             :#0  INDICATES MODE II PROCESSING.  POSITION IN LU I/O REQ
*                  QUEUE AFTER WHICH ALL UNLINKED I-O REQUESTS ARE
*                  TO BE RELINKED.
*          JSB $UNLK
*          DEF SUEQT
* 
*     RETURN: 
*          NO REGISTERS ARE SAVED.
*          USES UNLK3,UNLK8,TEMPX,TEMP0 
* 
************************************************************************
      SKP 
$UNLK NOP 
      STB TMP5      SAVE EQT ADDRESS
      STA UNLK8     SET UP POINTER TO THIS I/O REQUEST QUEUE. 
      LDA $UNLK,I 
      LDA A,I 
      AND B174K     GET SUBCHANNEL
      CLE,ELA         AND SHIFT 
      RAL,RAL          UPPER BIT
      ALF               TO BIT 13 
      SEZ                ADD IN LOWER 4 BITS
      ADA B20K            AT BITS 2-5 
      STA TEMP0            AND SAVE.
      RSS 
* 
UNLK0 LDB TEMPX,I   GET NEXT ENTRY. 
UNLK1 STB TEMPX     SAVE POINTER TO PREVIOUS REQUEST. 
UNLK2 LDB TEMPX,I   GET POINTER TO THIS REQUEST.
      RBL,CLE,ERB   STRIP OFF POSSIBLE SIGN BIT.
      SZB,RSS       IF END, 
      JMP UNLK6      THEN GO EXIT.
* 
      STB UNLK3     SAVE POINTER TO THIS REQUEST. 
      INB           STEP TO CONTROL WORD OF THIS REQUEST. 
      LDA UNLK8     CHECK IF MODE I OR II PROCESSING. 
      SZA,RSS 
      JMP UNL25     MODE I SO SKIP SUBCHANNEL CHECK.
      LDA B,I       GET CONTROL WORD OF THIS REQUEST. 
      AND SBMSK     PICK OFF SUBCHANNEL INFORMATION AND 
      CPA TEMP0      COMPARE TO THE SUBCHANNEL INFO OF
      RSS             THE BAD I/O REQUEST.  IF NOT EQUAL, 
      JMP UNLK0     GO CHECK THE NEXT I/O REQUEST.
* 
UNL25 LDA B,I       GET CONTROL WORD OF THIS I/O
      RAL            REQUEST AND ROTATE IT. 
      CMA,SSA,SLA,RSS  IF NOT STANDARD USER REQUEST,
      JMP UNLK4         GO PROCESS AS OTHER TYPES.
* 
*                   STANDARD USER REQUEST 
      LDA UNLK3,I   UNLINK THIS 
      STA TEMPX,I    I/O REQUEST
      LDA UNLK3     POINT A AT THE REQUEST'S ID SEGMENT 
      JSB NSBIT     IS THE "NO SUSPEND" BIT SET ? 
      JMP UNLK5     YES, SCHEDULE WITH IO14 ERROR 
      LDA .4        NO, SO SUSPEND THE PROGRAM
      STA B,I        IN GENERAL WAIT LIST.
      LDA TMP5      SET ID TMP WD #1 TO 4.
      CMA,INA       NEGATE EQT ADDR 
      INB           TO SAVE IN TEMP WD #2 OF ID SEGEMENT
      STA B,I        BECAUSE WE DON'T KNOW LU# 2
      ADB .7        ADVANCE TO SAVE A REG LOCATION. 
      LDA B,I       FETCH SAVED 
      ADB N1             POINT OF SUSPENSION, AND STORE 
      STA B,I         IT IN XSUSP FOR THIS PROGRAM. 
      JSB $LIST     LINK THIS PROGRAM INTO THE
      OCT 103        GENERAL WAIT LIST. 
UNLK3 NOP 
      JMP UNLK2     GO TRY NEXT ENTRY.
* 
UNLK5 ADB .7        POINT AT POINT OF SUSPENSION. 
      CCA           BACK IT UP -1 FOR 
      ADA B,I        THE ERROR RETURN POINT 
      STA B,I        FOR IO14 ERROR MESSAGE.
      INB           POINT AT SAVED AREG 
      LDA ERIO       TO INSERT THE
      STA B,I        ASCII "IO".
      INB           POINT AT SAVED BREG 
      LDA A14        TO INSERT THE
      STA B,I        ASCII "14".
      LDB UNLK3     POINT AT THE ID SEGMENT 
      JSB $LIST      AND GO SCHEDULE THE PROGRAM. 
      OCT 401 
      JMP UNLK2     GO LOOK AT NEXT ENTRY.
* 
UNLK4 LDA UNLK8     CHECK IF MODE I OR II.
      SZA,RSS       IF MODE I, DO NOT UNLINK
      JMP UNLK0      THIS REQUEST.  GO TRY NEXT ONE.
      LDB UNLK8,I   IF MODE II, CLEAR 
      RBL,CLE,ERB    POSSIBLE SIGN BIT
      LDA UNLK3,I    AND LINK THIS I-O
      STA TEMPX,I 
      STB UNLK3,I    REQUEST TO THE 
      LDB UNLK3       END OF THE DOWN 
      STB UNLK8,I      I/O REQUEST QUEUE. 
      STB UNLK8    SET UNLK8 TO POINT TO THE LAST REQUEST.
      JMP UNLK2     GO TRY NEXT ENTRY.
* 
UNLK6 ISZ $UNLK 
      JMP $UNLK,I   RETURN
* 
* 
UNLK8 NOP 
TEMPX NOP 
* 
TMP1  NOP 
TMP2  NOP 
TMP3  NOP 
TMP4  NOP 
TMP5  NOP 
TMP6  NOP 
* 
TMP8  NOP 
A14   ASC 1,14
      SKP 
* 
******************************************************************
* 
*     SUBROUTINE $DLAY: 
* 
*     $DLAY IS USED TO SET UP A SHORT TIMEOUT(10 MSEC)WHICH, WHEN IT
*     OCCURS, SIGNALS THAT AN I/O OPERATION MUST BE INITIATED ON THE
*     TIMED-OUT EQT(SEE $DEVT). 
* 
*     CALLING SEQUENCE: 
*          LDA <EQT1> 
*          JSB $DLAY
* 
*     RETURN: 
*          ALL REGISTERS ARE MODIFIED.
* 
***************************************************************** 
* 
$DLAY NOP 
      CCE,INA       SET THE SIGN BIT
      LDB A,I        ON <EQT2> TO INDICATE
      RBL,ERB         WE MUST INITIATE AN 
      STB A,I          OPERATION. 
      ADA .3
      CCE 
      LDB A,I       SET THE 
      RBL,ERB        EQT
      STB A,I         BUZY. 
      ADA .10 
      LDB N1        SET A 
      STB A,I        TIMEOUT
      JMP $DLAY,I     OF 10 MSEC. 
      HED   < IO-DEVICE TIME-OUT PROCESSOR >
* 
* 
*  AFTER A DEVICE IS DISCOVERED TO HAVE TIMED-OUT 
*        BY RTIME'S $CLCK PROCESSOR,THIS
*        ROUTINE IS ENTERED.  ITS PURPOSE IS TO 
*        CLEAR THE PENDING IO TRANSFER AND ENTER
*        $CON1 IN SUCH A WAY AS TO SIMULATE AN IO 
*        COMPLETION RETURN FROM THE DRIVER ITSELF.
* 
*  IF THE TIMEOUT WAS DUE TO THE NEED TO INITIATE AN
*        I/O OPERATION(BIT 15 EQT2 SET)THEN THIS BIT
*        IS CLEARED AND $CON1 IS ENTERED(AT L.60) TO
*        INITIATE THE I/O OPERATION.
* 
* 
*  ENTER FROM  SCHEDULER MODULE:
* 
*        (A) <ADDRESS OF EQT15 OF TIMED-OUT DEVICE> 
* 
* 
$DEVT ADA N14       POINT TO EQT
      JSB $ETEQ     SET EQT ADDRESSES 
      LDA EQT1,I    GET THE CLEAR BIT 
      SSA           IF CLEAR TIME OUT 
      JMP CLTIM     JUST CLEAR
* 
      LDA EQT2,I    CHECK IF THE TIMEOUT
      SSA            IS FOR INITIATING I/O
      JMP INTDL       ON THIS EQT.
* 
      LDA EQT4,I
      IOR B4K       SET TIME-OUT BIT
      STA EQT4,I
      STA B         SAVE WORD IN B FOR TEST 
      AND B77        SELECT CODE TO A 
      STA INTCD 
      BLF,SLB         IF DRIVER TO HANDLE TIME
      JMP CIC.6        OUT GO CALL THE DRIVER.
* 
CLTIM JSB CLCHS     CLEAR ALL CHANNELS
      LDA .4        SERVICED BY THIS ENTRY
      CLB           SIMULATE COMPLETION 
      JMP $CON1      RETURN FROM DRIVER 
* 
INTDL RAL,CLE,ERA   CLEAR INITIATION
      STA EQT2,I     BIT. 
      ISZ CONFL     SET CONTROL FLAG TO NONZERO.
      JMP L.60      GO INITIATE.
* 
N14   DEC -14 
      HED < I/O CONTROL MODULE - DATA SECTION > 
* 
***************************************************************** 
* 
* CONSTANT AND VARIABLE STORAGE AREA
* 
******************************************************************* 
* 
A     EQU 0        DEFINE SYMBOLIC REFERENCES 
B     EQU 1         FOR A AND B REGISTERS.
.3    DEC 3 
.5    DEC 5 
.8    DEC 8 
.9    DEC 9 
.10   DEC 10
N1    DEC -1
* 
B77   OCT 77
B377  OCT 377 
B140K OCT 140000
B40K  OCT 40000 
B4K   OCT 4000
MSIGN OCT 100000
* 
TEMP2 NOP 
TEMP3 NOP 
TEMP4 NOP 
TEMP5 NOP 
TEMP6 NOP 
TEMP7 NOP 
TEMP8 NOP 
TEMP9 NOP 
TEMP0 NOP 
TEMPL NOP 
TEMPW NOP 
* 
CONFL NOP 
SCONF NOP 
TLOG  NOP 
COMPL NOP           DO NOT USE FOR INIT CODE(MUST=0 BEGIN). 
DMACF NOP           FLAGS USED IN ALLOCATING
      HED ** I/O CONTROL - OPERATOR COMMUNICATION **
* 
***************************************************************** 
* 
*  I/O MODULE // OPERATOR COMMUNICATION 
* 
* 
*  THE SYSTEM USES COMMANDS FROM THE
* OPERATOR TO CONTROL THE OVERALL STATUS OF 
* I/O EQUIPMENT, CHANGE ASSIGNMENT OF LOGICAL 
* UNITS AND TO INTERROGATE THE STATUS AND 
* PROPERITES OF THE DEVICES IN THE EQUIPMENT
* TABLE.
* 
*  OPERATOR STATEMENTS ARE PROCESSED ONLY 
* FROM THE DESIGNATED SYSTEM TELETYPE. THE
* ROUTINE <MESSAGE> IN THE SCHEDULING MODULE
* IS RESPONSIBLE FOR STATEMENT DECODE AND 
* PARAMETER SEPARATION AND CONVERSION. THE
* ASSOCIATED STATEMENT PROCESSOR IS CALLED
* TO PERFORM THE REQUESTED ACTION. THE
* STATEMENT PROCESSING IS ALL TABLE-DRIVEN
* AS DESCRIBED IN THE LISTING AND DOCUMENTATION 
* OF THE SCHEDULING MODULE. 
* 
* 
*  TWO OF THE I-O CONTROL STATEMENT PROCESSORS
* MUST BE INCLUDED IN THE BASIC SYSTEM PACKAGE
* AND ARE INCLUDED IN RTIOC.
* THESE ARE THE 'UP' AND 'DOWN' STATEMENTS
* CONCERNING THE OVERALL STATUS OF I/O DEVICES. 
* THE OTHER THREE STATEMENT PROCESSORS ( LOGICAL
* UNIT ASSIGNMENT, TIME-OUT, AND EQT STATUS)
* ARE OPTIONAL AND ARE CONTAINED IN THE USER PROGRAM
* $$$CMD WHICH IS SCHEDULED BY SCHED.  THESE COMMANDS 
* MAY BE REMOVED BY DELETING $$CMD. 
* 
******************************************************************
* 
      SKP 
* 
****************************************************************
* 
*  'DOWN'  STATEMENT      (REQUIRED)
* 
* FORMAT:  DN,N1 OR DN,,N2
*          WHERE N1 IS THE EQT # OF THE I/O SLOT TO BE SET DOWN 
*             OR N2 IS THE LU # OF THE I/O DEVICE TO BE SET DOWN. 
* 
* ACTION:  WHEN SETTING THE EQT DOWN, THE AVAILABILITY FIELD OF THE 
*               REFERENCED SLOT IS SET = 1(SLOT DISABLED).
*          WHEN SETTING THE LU DOWN, BIT 15 OF DRT WORD 2 IS SET AND
*                ANY I/O FOR THIS DEVICE IS REMOVED FROM THE EQT I/O
*                QUEUE AND ADDED TO THE LU I/O QUEUE HEADED AT DRT
*                WORD 2.
* 
* CALL (FROM MESSAGE PROCESSOR):
* 
*      <A>:= N1 (EQT #) IN BINARY OR 0
*      <B>:=-1 OR N2 (LU #) IN BINARY 
*      JMP  $IODN 
* 
*      RETURN IS TO <$XEQ> IF ACTION TAKEN OR TO -MESS.I- TO PRINT
*       * INPUT ERROR * IF N1 OR N2 ARE ILLEGAL OR IF BOTH ARE PRESENT. 
* 
****************************************************************
* 
$IODN SZA,RSS       CHECK IF DOWN LU OR 
      JMP DNLU       DOWN EQT COMMAND.
* 
      INB,SZB       DOWN EQT COMMAND. IF BOTH LU AND EQT ARE
      JMP $INER      GIVEN, ISSUE INPUT ERROR MESSAGE.
* 
      JSB IODNS     CHECK LEGALITY OF EQT & SET EQT ADDRESSES.
      LDA EQT1      IF ATTEMPT TO DOWN EQT OF SYSTEM
      CPA SYSTY      CONSOLE, ISSUE INPUT ERROR MESSAGE.
      JMP $INER 
      LDA EQT5,I     SET AVAILABITY FIELD 
      ALR,RAR         TO 1
      IOR B40K         TO SET 
      STA EQT5,I        DOWN. 
* 
      JSB XUPIO     SET ANY DOWNED LU'S UP. 
* 
      LDB EQT1,I    GO PUT ALL WAITERS(UNBUFFERED 
      RBL,CLE,ERB    I/O)INTO THE BENERAL WAIT
      SZB,RSS 
      LDB EQT1
      CLA             LIST. SKIP FIRST REQUEST. 
      JSB $UNLK 
      DEF A         (DUMMY DEF FOR THIS MODE).
      JMP $XEQ      RETURN. 
* 
DNLU  STB A         SAVE LU NUMBER. 
      CMB,CLE,INB,SZB,RSS  ISSUE AN ERROR MESAGE
      JMP $INER       IF THE LU IS LESS THEN
      ADB LUMAX        1 OR IS GREATER THEN 
      CCB,SEZ,RSS       LUMAX.
      JMP $INER 
* 
      ADB A         USE LU NUMBER 
      ADB DRT        TO POSITION TO 
      LDA B,I         WORD 1 OF THE 
      AND C3700        DRT ENTRY. 
      STA TEMP8     SET UP SUBCHANNEL-EQT WORD. 
      AND B77       INPUT 
      SZA,RSS        ERROR IF 
      JMP $INER       DOWNING BIT BUCKET DEVICE.
* 
      STB TEMP9     SAVE ADDRESS OF DRT WORD 1. 
      JSB $CVEQ     SET EQT ENTRY ADD(WILL MASK SUBCH.).
* 
      LDB EQT5,I    CHECK IF
      RBL,SLB        EQT IS 
      JMP DNLU5       UP OR IS
      SSB              DOWN.
      JMP DNLU9     EQT IS DOWN.
* 
DNLU5 LDB EQT1,I    SKIP FIRST EQT I-O REQUEST QUEUE
      SZB,RSS        ENTRY UNLESS THE QUEUE IS EMPTY. 
      LDB EQT1
      STB HEAD      SAVE THIS POINTER.
      CLA           SET FOR NO ERROR MESSAGES.
      JSB LUERR     GO DOWN ALL LU'S POINTING TO DEVICE.
      SEZ           ERROR IF ATTEMPT
      JMP $INER      TO DOWN LU 1.
      JMP $XEQ      NO, RETURN TO SYSTEM. 
* 
DNLU9 LDB TEMP9     IF EQT IS DOWN, THEN
      ADB LUMAX      GET DRT WORD 2 
      LDA B,I         AND SET THE LU
      IOR MSIGN        DOWN.
      STA B,I 
      JMP $XEQ      RETURN. 
* 
C3700 OCT 174077
* 
* *IODNS*  SUBROUTINE TO CHECK LEGALITY OF AN 
*          EQT # (IN A-REGISTER) AND TO CALL
*          A SUBROUTINE TO CONSTRUCT THE EQT
*          ENTRY ADDRESSES. 
* 
IODNS HLT 2         HLT FOR INIT CODE 
      STA B        ERROR
      CMB,INB,SZB  IF EQT NO. IS ZERO 
      SSA           OR NEGATIVE 
      CCB,RSS       SKIP
      ADB EQT#     CHECK FOR LIMITS 
      SSB          IF ANY ERROR,
      JMP $INER     GO TO $MESS ERROR EXIT. 
      JSB $CVEQ    SET EQT ENTRY ADDRESSES. 
      STB CONFL     SET ALL THE FLAGS TO ZERO.
      JMP IODNS,I 
      SKP 
* 
****************************************************************
* 
*  ' UP '  STATEMENT     (REQUIRED) 
* 
* FORMAT:  UP,NN    WHERE NN IS THE EQT # 
*                   OF THE I/O DEVICE 
* 
* ACTION:  THE AVAILABILITY FIELD OF THE REFERENCED SLOT(EQT ENTRY
*          #)IS SET = 0 (UNIT AVAILABLE).  THE AVAILABILITY FIELD OF
*          ANY DEVICES(BIT 15 DRT WORD 2) REFERENCING THIS EQT ARE
*          SET = 0 AND THE LU'S' I/O QUEUES ARE ADDED TO THE EQT'S
*          I/O QUEUE.  IF THE EQT WAS AVAILABLE OR DOWN, THEN THE 
*          *$CON1* SECTION(AT *L.68*)IS ENTERED TO INITIATE ANY 
*          WAITING I/O REQUESTS.
* 
* CALL (FROM MESSAGE PROCESSOR):
* 
*      <A>:= NN (EQT #) IN BINARY 
*      JMP  $IOUP 
* 
*      RETURN IS MADE TO *$CON1* OR TO *$XEQ* IF ANY ACTION 
*           IS TAKEN.  IF NN IS ILLEGAL, THEN RETURN IS MADE TO 
*           *MESS,I* TO PRINT  'INPUT ERROR'. 
* 
******************************************************************
* 
$IOUP JSB IODNS    CHECK 'NN' AND SET EQT QDDRESSES.
$UP   EQU * 
      JSB $RSM      GO RESTORE USER MAP IN CASE DRIVER CALL 
       JSB CPEQT     GET EQT #
       STA TMP1       FROM EQT1.
      LDA .4        RESCHEDULE ALL WAITING PGMS.
      JSB $SCD3      (RETURN B=0).
      LDA EQT5,I    GET AVAILABILITY. 
      SSA,RSS       IF DOWN OR AVAILABLE, 
      JSB CLDMA      HELP OUT POWER FAIL WITH DMA.
* 
      JSB XUPIO     SET ANY ASSOCIATED LU'S UP. 
* 
      LDA EQT5,I    GET AVAILABILITY
      ISZ CONFL     SET THE CONTROL FLAG
      SSA,RSS       IF DOWN OR AVAIL. 
      JMP L.60      GO TRY TO OPERATE 
      JMP $XEQ      ELSE JUST FORGIT IT.
      SKP 
* 
************************************************************************
* 
*     SUBROUTINE XUPIO: 
* 
*     XUPIO IS USED TO UP ANY LU'S ASSOCIATED WITH THIS EQT.
* 
*     CALLING SEQUENCE: 
*          <EQT1>:=THE ADDRESS OF THE FIRST WORD OF THIS EQT. 
*          <TMP1>:=THE EQT NUMBER.
*          JSB XUPIO
* 
*     RETURN: 
*          ALL REGISTERS ARE DISTROYED. 
*          USES TMP2,TMP4,TMP6. 
*          CALLS SUBROUTINE XXUP. 
* 
************************************************************************
* 
XUPIO NOP 
      LDA LUMAX     SET 
      CMA,INA        UP 
      STA TMP2        COUNTER.
      LDB DRT       POSITION TO FIRST 
      STB TMP6       DRT ENTRY. 
* 
UPIO1 LDA TMP6,I    CHECK IF THIS 
      AND B77        DRT ENTRY POINTS 
      CPA TMP1        TO THE EQT. 
      JMP UPIO5     YES.
UPIO3 ISZ TMP6      NO. SO
      ISZ TMP2       GO CHECK 
      JMP UPIO1       NEXT DRT ENTRY. 
      JMP XUPIO,I   RETURN. 
* 
UPIO5 LDB TMP6      POSITION TO DRT 
      ADB LUMAX      WORD2. 
      STB TMP4      GO PLACE
      LDB B,I        ENTRIES
      LDA EQT1        INTO EQT
      JSB $XXUP        I/O QUEUE(RETURN B=0). 
      STB TMP4,I    SET THE LU 'UP'.
      JMP UPIO3     GO CHECK NEXT DRT ENTRY.
      SKP 
****************************************************************
* 
*     SUBROUTINE $XXUP: 
* 
*     $XXUP TAKES AN I/O QUEUE AND(USING LINK)POSITIONS THE I/O 
*     REQUESTS IN THE CURRENT EQT QUEUE ACCORDING TO THEIR PRIORITY.
*     IT RETURNS A FLAG IF AN I/O OPERATION SHOULD BE INITIATED.
* 
*     CALLING SEQUENCE: 
*          <A>:= EQT1 OF OLD DEVICE.
*          <B>:=ADDRESS OF FIRST STACKED I/O REQUESTS TO BE LINKED ON 
*               THE CURRENT EQT(SIGN BIT WILL BE STRIPPED). 
*          JSB $XXUP
* 
*     RETURN: 
*          <B>:=0 
*          <A>:#0      A NEW I/O OPERATION IS AT THE HEAD OF THE CURRENT
*                     EQT I/O QUEUE SO IT MUST BE INITIATED.  <A> = 
*                     THE ADDRESS OF THE FIRST WORD OF THE EQT. 
*          USES TEMP1,TEMP2,UNLK8,TEMP4,XXUP7 
* 
***************************************************************** 
* 
$XXUP NOP 
      STA TEMP4     SAVE OLD DEVICE EQT1. 
      CLA           CLEAR 
      STA XXUP7      INITIATION FLAG. 
      RBL,CLE,ERB   STRIP OFF POSSIBLE SIGN BIT.
XXUP9 SZB,RSS       RETURN WHEN END OF I/O
      JMP XXUP2      REQUEST QUEUE IS FOUND.
* 
      STB TEMP1     SET UP POINTER FOR LINK.
      ADB B176K     IF POINTER IS < 2000, 
      SSB            THEN NO I-O STACKED ON 
      JMP XXUP2       THIS LU SO EXIT B=0.
* 
      LDB TEMP1     OTHERWIZE, GET I-O REQUEST ADDRESS. 
      LDA B,I       UNLINK THIS 
      STA UNLK8      I/O REQUEST. 
      INB 
      LDA B,I       GET 
      INB            PRIORITY 
      RAL             OF THE
      SSA              I-O REQUEST
      JMP XXUP8 
      SLA,RSS       BUFFERED AND CLASS I-O REQUESTS.
      JMP XXUP5     NORMAL USER REQUEST.
      LDA TEMP4     SYSTEM REQUEST. 
      ADA .4
      LDA A,I 
      AND B36K       CHECK IF THE OLD DEVICE
      CPA B14K        IS A DISK OR NOT. 
      JMP XXUP1 
      CLA            IF OLD DEVICE IS NOT A DISK, 
      STA TEMPL       SET TEMPL=0 AND USE 
      JMP XXUP3        ZERO PRIORITY. 
XXUP1 STA TEMPL      IF OLD DEVICE IS A DISK, THEN
      INB,RSS         SET TEMPL#0 AND USE PRIORITY. 
XXUP5 ADB .4
XXUP8 LDA B,I 
XXUP3 STA TEMP2     SAVE PRIORITY FOR LINK. 
      JSB LINK      LINK THIS REQUEST ONTO THE EQT. 
      LDA EQT1
      SEZ,RSS       IF ONLY REQUEST ON THE EQT, THEN
      STA XXUP7      STORE <EQT1> INTO THE INITIATION FLAG. 
      LDB UNLK8     LOOP FOR NEXT 
      JMP XXUP9      I/O REQUEST. 
* 
XXUP2 CLB           SET B=0.
      LDA XXUP7     GET INITIATION FLAG 
      JMP $XXUP,I   RETURN
* 
XXUP7 NOP 
B176K OCT 176000
      HED < I/O CONTROL MODULE - SUBROUTINE SECTION > 
* 
* SUBROUTINE:  < $YMG  >  (SYSTEM MESSAGE)
* 
*  PURPOSE: THIS ROUTINE PROVIDES FOR THE 
*           OUTPUT OF SYSTEM MESSAGES AND 
*           ERROR DIAGNOSTICS ON THE SYSTEM 
*           TELETYPEWRITER.  THE ROUTINE
*           MAINTAINS A 'ROTATING' BUFFER 
*           AREA CONSISTING OF 15 12-WORD 
*           BLOCKS - I.E., THE MAXIMUM
*           LENGTH OF A MESSAGE IS 22 
*           CHARACTERS (11-WORDS) PLUS 1
*           WORD PRECEDING THE MESSAGE
*           WHICH CONTAINS THE CHARACTER
*           COUNT.
* 
*  CALL:    (A) = ADDRESS OF FIRST WORD OF
*                 MESSAGE BLOCK - THIS WORD 
*                 CONTAINS THE CHARACTER
*                 LENGTH OF THE MESSAGE AS
*                 A NEGATIVE VALUE. 
* 
*           (P)      JSB  $YMG
*           (P+1)    -RETURN- 
* 
*                ON RETURN: 
*               (A) = 0 - MESSAGE ACCEPTED AND
*                        MOVED TO BUFFER. 
*               (A) NOT = 0 - BUFFER FILLED,
*                        MESSAGE REJECTED 
*               (E) = 0 
* 
* 
$YMG  NOP 
      JMP SBUF      CHANGED TO CLE ON FIRST ENTRY 
* 
      LDB SY#      IF BUFFER
      CPB .15       IS FILLED (15 MESSAGES),
      JMP $YMG,I     REJECT EXIT. 
* 
      LDB SYC      SET CURRENT
      STB SYT1      ENTRY ADDRESS FOR MOVE
      MVW .12      MOVE THE WORDS.
* 
      ISZ SY#       INCREMENT COUNT ENTRY.
      LDB SYC      (B) = CURRENT ENTRY ADDRESS. 
      LDA SYT1
      ADA .12      (A) = NEXT ENTRY ADDRESS.
      CPA SBL      IF NEXT EXCEEDS BUFFER,
      LDA SBF       RESET TO FWA BUFFER 
      STA SYC       AND SAVE. 
* 
      LDA SY#      IF ENTRY.
      CPA .1        COUNT = 1,
      JSB SYSCL     INITIATE OUTPUT.
* 
      CLA,CLE      (A) = 0 FOR EXIT WITH
      JMP $YMG,I    MESSAGE ACCEPTED. 
* 
* CALL <$XSIO> TO INITIATE OUTPUT 
* 
SYSCL NOP 
      LDA B,I       GET THE MESSAGE LENGTH
      STA SYS7      SET IN THE CALL 
      INB           STEP TO BUFFER ADDRESS
      STB SYS6      SET IN THE CALL 
      JSB $XSIO 
      OCT 1         - LOGICAL UNIT 1 - SYS TTY
      DEF SYS8      - COMPLETION ROUTINE ADDRESS
      NOP 
      OCT 2         - ASCII WRITE - 
SYS6  NOP            MESSAGE ADDRESS
SYS7  NOP           MESSAGE LENGTH
      NOP           SAYS DO NOT NEED USER MAP 
      JMP SYSCL,I 
* 
* COMPLETION ROUTINE FROM I/O CALL
* 
SYS8  CCA          SUBTRACT 1 FROM
      ADA SY#       ENTRY COUNT FOR 
      STA SY#       MESSAGE JUST OUTPUT.
      SZA,RSS      IF NO MORE IN BUFFER,
      JMP $XEQ      EXIT. 
* 
      LDB SYS6     SET
      ADB .11       NEXT ENTRY
      CPB SBL       ADDRESS 
      LDB SBF 
      JSB SYSCL    INITIATE OUTPUT
      JMP $XEQ      -EXIT.
* 
SY#   NOP 
SYT1  NOP 
SYC   DEF SBUF
SBF   DEF SBUF
      SKP 
* 
* SUBROUTINE:  < $SYMG >   (SYSTEM MESSAGE) 
* 
* PURPOSE:  THIS ROUTINE ROUTES ERROR DIAGNOSTICS TO THE
*           SYSTEM CONSOLE (LU 1) VIA THE $YMG SUBROUTINE.
*           ALSO, ERRORS WILL BE ECHOED ON THE SESSION TERMINAL 
*           OF THE CURRENTLY EXECUTING PROGRAM VIA THE $BFOT
*           SUBROUTINE.   NOTE :
*           IF THE SESSION (MTM) TERMINAL = SYSTEM CONSOLE, 
*           THE ERROR HAS ALREADY BEEN ISSUED SO THE ECHO IS NOT
*           PERFORMED.
* 
* 
* CALL:     (A) = ADDRESS OF FIRST WORD OF MESSAGE BLOCK. 
*                 THIS WORD CONTAINS THE CHARACTER LENGTH 
*                 OF THE MESSAGE AS A NEGATIVE VALUE. 
* 
* 
*           (P)       JSB $SYMG 
*           (P+1)     -RETURN-
* 
* 
*           ON RETURN:
* 
*           <NOTE: THE RETURN STATUS REFERS TO THE $YMG 
*                  CALL ONLY. ALSO NOTE THAT THIS ROUTINE 
*                  IS CALLED, AND RETURNS THE SAME AS THE 
*                  $YMG SUBROUTINE.>
* 
*           (A) = 0 -MESSAGE ACCEPTED AND 
*                    MOVED TO BUFFER. 
*           (A) NOT 0 = - BUFFER FILLED,
*                   MESSAGE REJECTED. 
* 
*           (E) = 0 
* 
* 
SYTMP NOP           LOCAL TEMP USED TO SAVE $YMG RTN STATUS 
* 
$SYMG NOP 
      STA STMP4     SAVE MESSAGE BLOCK ADDRESS
      JSB $YMG      ISSUE ERROR DIAGNOSTIC TO LU 1
      STA SYTMP     SAVE CALL STATUS
      LDB XEQT      FETCH CURRENT PROGRAMS ID ADDRESS 
      JSB $LU??     GO LOOK FOR SESSION TERM LU 
       JMP SYM.2    NOT SES OR MTM\ OR LU 1 NOT DEFINED FOR SES 
       SZA,RSS      (A)= SYS LU(LU-1) OF SES TERM 
      JMP SYM.2     IF LU 1, ALL DONE!
* 
      LDB XEQT      FETCH CURRENT PROG'S ID ADDR AGAIN
      LDA STMP4     FETCH BUFFER ADDRESS
      JSB $BFOT     GO ECHO DIAGNOSTIC TO USER
* 
SYM.2 LDA SYTMP     FETCH STATUS OF CALL
      CLE           AND CLEAR "E" TO MATCH $YMG.
      JMP $SYMG,I 
* 
* 
      SKP 
* 
* 
* 
* SUBROUTINE: <$BFOT>  (BUFFERED SYSTEM OUTPUT) 
* 
* PURPOSE:    THIS ROUTINE DETERMINES THE SESSION (MTM) TERMINAL
*             AND SETS UP A BUFFERED OUTPUT REQUEST (T FIELD=01)
*             IF ALL THE FOLLOWING CONDITIONS ARE TRUE: 
* 
*             1) LU IS NOT ZERO (LU-1=B377) 
*             2) LU IS DEFINED  (NOT GREATER THAN MAX)
*             3) EQT IS NOT EQT 0 
*             4) ENOUGH SAM IS AVAILABLE FOR THE REQUEST
*             5) LU IS UP 
* 
* 
*             THIS ROUTINE WILL NEVER CAUSE A REQUEST TO BE 
*             INITIATED (CALL DRIVER) AS ANY PROBLEMS WILL
*             CAUSE THE NOTRD ROUTINE TO BE ENTERED. THATS A
*             NO NO AS NOTRD CALLS THIS ROUTINE.
* 
* 
*               IF NO OTHER REQUESTS ARE PENDING, $DLAY IS CALLED 
*               TO CAUSE INITIATION OF THE REQUEST ON THE NEXT
*               TBG TICK. 
* 
* 
* CALLING SEQUENCE: LDA BUF (1ST WORD IS -LEN, BUFFER FOLLOWS)
*                   LDB ID SEG ADDR OF PROG FOR ECHO
*                   JSB $BFOT 
* 
*          RETURN   (A) IS NOT CHANGED
*                   ALL OTHER REGISTERS MODIFIED
* 
* 
*             THE REQUEST HEADER IS DEFINED AS FOLLOWS: 
* 
*             NOTE: DON'T MESS WITH THE ORDER.
* 
******************************************************
BF.HD DEF BF.CN     DEFINES START OF THE HEADER 
* 
*              LINK WORD IS ADDED IN SAM
* 
BF.CN NOP           *CONTROL WORD IS PLACED HERE
      NOP           PRIORITY OF REQUEST=0 
BF.TL NOP           *TOTAL BLOCK LENGTH IS PLACED HERE
BF.UL NOP           *MESSAGE LENGTH PLACED HERE 
      NOP           TRACK 
      NOP              AND SECTOR INFO
* 
******************************************************
*      OUTPUT BUFFER FOLLOWS IN SAM 
* 
BFCON OCT 40002     BUFFERED WRITE/SFUN=0 
BFTM1 NOP 
BFTM2 NOP 
BFTM3 NOP 
* 
* 
* 
$BFOT NOP 
      STA BFTM2     SAVE BUF LOCATION 
      LDA XTEMP,I   SAVE CONTENTS OF XTEMP AS 
      STA BFTM3     $ALC WILL ALTER IT IF CALLED. 
      JSB $LU??     FIND SES TERM LU 1 (B=ID ADDRESS) 
       JMP BFEX     NOT SES OR MTM\ OR SES LU 1 NOT DEFINED 
       CPA B377     IF LU =0
      JMP BFEX      WERE ALL DONE.
      STA STMP2     SAVE SYS LU (LU-1)
* 
* 
*   SESSION LU 1 (OR MTM TERMINAL) IS DEFINED AND IS NOT
*   LU 0. NOW CHECK FOR :  LU > LUMAX AND  EQT=0
* 
* 
      CMA,CLE       CHECK FOR AN LU 
      ADA LUMAX       GREATER THAN THE
      SEZ,RSS            LARGEST DEFINED LU.
      JMP BFEX              TOO BAD, REJECT REQUEST.
* 
      LDB STMP2     RESTORE LU
      ADB DRT       INDEX INTO DRT
      LDA B,I       GET EQT ASSIGNMENT
      STA BFTM1     SAVE DRT WORD 1 FOR CON WORD WORK 
* 
      AND B77       CHECK FOR EQT 
      SZA,RSS          = ZERO 
      JMP BFEX        YEP-- REJECT REQUEST
* 
* 
*   LU IS OK - SET UP BP EQT POINTERS,CHECK FOR DOWN EQT\LU 
*              AND GRAB SOME SAM
* 
* 
* 
      JSB $CVEQ     CONVERT EQT# (IN A) AND SET UP ADDRS
      LDA STMP2     FETCH LU (LU-1) 
      JSB STADV     IS EQT OR LU DOWN?
       JMP BFEX     YES-GO EXIT 
* 
*   CHECK THE BUFFER LIMIT OF THIS EQT
* 
      LDB $BLUP       FETCH UPPER LIMIT 
      JSB QCHK        AND GO CHECK UPPER LIMIT
       JMP CKQUE      BUFFER LIMIT REACHED-SEE IF ANY SYS REQUESTS PENDI
* 
* 
ECHO  LDA BFTM2,I   FETCH LENGTH WORD 
      STA BF.UL     SET FOR CALL (INTO HEADER--NOTE: NEG CHAR COUNT)
      ARS           CALCULATE POSITIVE # OF WORDS 
      CMA,INA       REQURIED FROM NEG CHAR COUNT
      STA $LU??     SAVE TRANSFER LENGTH FOR MOVE TO SAM
      ADA .7        ADD IN REQUEST HEADER 
      STA BF.01     SAVE FOR $ALC CALL
      JSB $ALC
BF.01 NOP           REQUEST LENGTH
       JMP BFEX     EXIT- NEVER ENOUGH MEM
       JMP BFEX     EXIT- NO MEMORY NOW 
       STB BF.TL    GOT IT- SAVE ACTUAL LENGTH
      STA TEMP1     SAVE ADDR OF BLOCK(FOR LINK ROUTINE)
* 
* 
*   INITIALIZE TEMP2 AND TEMP3 FOR  "LINK" CALL AND 
*   CLEAR E FOR CON WORD WORK.
* 
* 
      CLA,CLE 
      STA TEMP2     PRIORITY OF REQUEST 
      STA TEMP3     THIS IS NOT A DISC REQUEST
* 
* 
*  BUILD THE CONTROL WORD-- ALL THE FIELDS ARE FIXED, EXCEPT
*  FOR THE SUB CHANNEL (SEE BFCON AND WORD2 ROUTINE). 
* 
* 
      LDA BFTM1     FETCH DRT ENTRY FOR THIS LU 
      AND B174K     GET SUB CHANNEL 
      ELA,RAL       SAVE HIGH BIT ("E" CLEARED ABOVE) 
      ALF,RAL           AND POSITION THE REST 
      ADA BFCON     ADD STANDARD CONTROL WORD FOR BUF OUTPUT
      SEZ           IF HIGH BIT SET 
      ADA B20K         SET IT IN CONTROL WORD 
      STA BF.CN     AND SAVE IN REQUEST HEADER
* 
* 
*   MOVE REQUEST HEADER TO SAM
* 
* 
      LDA BF.HD     FETCH REQUEST HEADER ADDRESS
      LDB TEMP1     FETCH SAM BLOCK ADDRESS 
      INB           1ST WORD IS DEFINED BY "LINK" 
      MVW .6        MOVE HEADER OUT 
* 
* 
*  MOVE MESSAGE BUFFER TO SAM 
* 
      LDA BFTM2     FETCH BUFFER LOCATION 
      INA            ADVANCE PAST LENGTH
      MVW $LU??     MOVE HER OUT
* 
* 
*   LINK THE REQUEST TO THE EQT AND SET UP FOR
*   DELAYED INITIATION IF REQUIRED. 
* 
* 
      JSB LINK      TEMPS 1-3 AND EQT ADDRS ALREADY SET UP
      SEZ,CLE       IF DEVICE IS BUSY-
      JMP BFOK         WERE ALL DONE
* 
      LDA EQT1      ELSE, SET UP FOR INITIATION OF REQUEST
      JSB $DLAY       ON NEXT TICK. 
      CLE,RSS       SET UP FOR GOOD EXIT
* 
BFEX  CCE           ERROR EXIT
BFOK  LDA BFTM2     RESTORE BUFFER ADDR 
      LDB BFTM3     RESTORE SAVED CONTENTS OF XTEMP,I 
      STB XTEMP,I     IN CASE $ALC WAS CALLED 
      JMP $BFOT,I       AND EXIT
* 
* 
*  THE BUFFER LIMIT HAS BEEN REACHED ON THE SESSION TERMINAL. 
*  TO AVOID THE POSSIBILITY OF EATING UP SAM, ONLY ONE ERROR
*  ECHO WILL BE STACKED WHILE IN THIS STATE.
*  IF THE SECOND REQUEST ON THE EQT IS PRIORITY 0 (ZERO), THEN
*  SKIP THE ECHO AS ONE ERROR HAS BEEN STACKED. THE SECOND
*  REQUEST IS CHECKED AS THE FIRST ONE IS ASSUMED TO BE THE CURRENT 
*  REQUEST. 
* 
* 
CKQUE LDA EQT1,I    FETCH CURRENT ENTRY 
      RAL,CLE,ERA   REMOVE POSSIBLE SIGN BIT
      LDA A,I       FETCH SECOND ENTRY
      RAL,CLE,ERA     AND CLEAR POSSIBLE SIGN BIT AGAIN 
* 
      SZA,RSS       IF ONLY ONE REQUEST PENDING- GO ECHO
      JMP ECHO
* 
      ADA .2        ADVANCE TO PRIORITY 
      LDB A,I        AND FETCH IT 
      SZB           IF NOT ZERO 
      JMP ECHO       GO ECHO AS NO SYS ERRORS PENDING 
      JMP BFEX        ELSE ABORT ECHO AS ANOTHER ECHO IS STILL PENDING. 
      SKP 
* 
* 
*SUBROUTINE : < $LU?? >   (FIND SESSION TERMINAL LU IN SYSTEM LU TERMS) 
* 
* PURPOSE *   THIS ROUTINE INTERPERTS THE PASSED PROGRAMS ID SEGMENT
*             LOOKING FOR THE SESSION OR MTM TERMINAL LU IT IS ASSOIATED
*             WITH. 
* 
* 
* CALLING SEQUENCE: LDB ID SEG ADDR 
*                   JSB $LU?? 
* 
*     RETURN P+1    NOT IN SESSION OR MTM\ OR LU 1 NOT DEFINED (SESSION)
*            P+2    A=SYS LU (LU-1) OF ASSOIATED TERMINAL 
*                   B=LOGICAL ADDRESS OF SST IF SESSION PROG
*                 OR
*                   B=- TERMINAL LU IF MTM PROG 
* 
* 
* 
* 
$LU?? NOP 
      SZB,RSS       IF ID NOT PASSED  ( IF XEQT=0)
      JMP $LU??,I       GET OUT 
* 
      ADB .32       ADVANCE TO SESSION WORD 
      LDB B,I         AND FETCH IT
      SSB           MTM ?      (NEG VALUE=MTM PROGRAM)
      JMP LU3       YES-- PREPARE FOR RETURN
* 
      SZB,RSS       SESSION PROG (POS NON-ZERO=SESSION) 
      JMP $LU??,I    NOPE SO JUST EXIT
* 
*   THIS IS A SESSION PROGRAM 
* 
* 
*     JSB MPTAB     MAP IN TABLE PTN(IF DEFINED) AND
      STB STMP2     SAVE LOGICAL ADDRESS IN TMP FOR RTN 
      CLA           DEFINE SEARCH FOR LU 1 (LU-1) 
      STA REQLU     SET FOR SWTCK CALL
      LDA B,I       FETCH LENGTH OF SST 
      JSB SWTCK     GO FIND ASSOIATED SYSTEM LU 
       JMP $LU??,I   NOT DEFINED
GOUT   ISZ $LU??     BUMP RTN ADDR
      LDB STMP2     FETCH LOGICAL ADDR IF SESSION\ NEG LU IF MTM
      JMP $LU??,I    EXIT 
* 
* 
LU3   STB STMP2     SAVE NEG LU FOR RTN 
      CMB           SET IT POS - 1
      LDA B         PREPARE FOR EXIT
      JMP GOUT
* 
* 
.32   DEC 32
* 
* 
* 
*   DUMMY PARTITION MAP ROUTINE ***780224 GLM***
* 
*MPTAB NOP
*     JMP MPTAB,I 
**
* 
* 
      SKP 
* 
* 
* 
* 
* SUBROUTINE : <$PSTE>  (POST ERROR TO SESSION CONTROL BLOCK) 
* 
* PURPOSE *    THIS ROUTINE DETERMINES IF THE SPECIFIED PROGRAM 
*              IS UNDER SESSION AND IF SO, PLACES THE 1ST FOUR
*              WORDS OF THE SPECIFIED ERROR MESSAGE INTO THE
*              ERROR BUFFER IN THE SCB. 
* 
* 
* CALLING SEQUENCE: LDA BUFFER ADDRESS
*                   LDB PROG'S ID ADDRESS 
*                   JSB $PSTE 
* 
*                   (A) AND (B) ARE RETURNED UNCHANGED
* 
* 
$PSTE NOP 
      SZB,RSS       IF NO ID ADDR SUPPLIED
      JMP $PSTE,I   RETURN
* 
      DST STMP1     SAVE BUF AND ID ADDR'S
      ADB .32       ADVANCE TO SESSION WORD 
      LDB B,I         AND FETCH IT
      SSB,RSS       IF NEGATIVE OR
      SZB,RSS       OR ZERO (NOT SESSION) 
      JMP PSTEX           RESTORE REGS AND EXIT 
* 
*     JSB MPTAB     MAP IN TABLE PTN IF DEFINED (B= SESSION WORD) 
      ADB $SMER     ADD OFFSET TO ERROR PARAMETER (EXTERNAL)
* 
* 
*  MOVE ERROR INTO SCB
* 
* 
      LDA STMP1     FETCH MESSAGE BUFF ADDR 
      INA             ADVANCE PAST LENGTH 
      MVW .4            AND MOVE 1ST FOUR WORDS 
* 
* 
PSTEX DLD STMP1     RESTORE REGISTERS 
      JMP $PSTE,I 
* 
* 
      SKP 
* 
* 
* 
* 
* SUBROUTINE:  <$CVEQ>
* 
*  PURPOSE: THIS ROUTINE CONVERTS AN EQT
*           ENTRY # TO AN EQT DISPLACEMENT
*           AND CALLS  <$ETEQ> TO SET THE 
*           ENTRY ADDRESSES.
* 
*  CALLING SEQUENCE:
* 
*       (A) = EQT ENTRY # IN LOWER 6 BITS.
* 
*     (P)     JSB $CVEQ 
*     (P+1)   -RETURN-  REGISTERS MEANINGLESS 
* 
* 
$CVEQ NOP 
      AND B77       MASK TO LOW BITS
      ADA N1       SUBTRACT 1 AND 
      MPY .15       MULTIPLY BY 15
      ADA EQTA       ABSOLUTE ADDRESS.
* 
      JSB $ETEQ     SET ALL 15 ADDRESSES. 
* 
      JMP $CVEQ,I    -RETURN- 
* 
* SUBROUTINE: <CPEQT> 
* 
*  PURPOSE: THIS ROUTINE COMPUTES THE ENTRY # 
*           OF THE ENTRY DESCRIBED BY -EQT1-. 
* 
*  CALLING SEQUENCE:  (P)    JSB CPEQT
*                     (P+1)  - RETURN - 
*                          ON RETURN, (A) = EQT # 
*                                     (E) = 1 
* 
* 
CPEQT NOP 
      LDA EQTA     SUBTRACT DEVICE
      CMA,INA       EQT ENTRY ADDRESS 
      ADA EQT1      FROM FWA OF EQT.
      CLB           CLEAR B FOR DIVIDE
      DIV .15       DIVIDE BY 15
      CCE,INA       SET E FOR CONVERSION/ADJUST COUNT.
      JMP CPEQT,I 
      SKP 
* SUBROUTINE: < $ETEQ > 
* 
*  PURPOSE: THIS ROUTINE SETS THE ADDRESSES 
*           OF THE 15 WORDS OF AN 
*           EQUIPMENT TABLE ENTRY IN THE
*           15  WORDS IN BASE PAGE COMMUNICATION
*           AREA LABELLED -EQT1- TO -EQT15-.
* 
*   CALLING SEQUENCE: 
* 
*           (A) - STARTING ADDRESS OF THE EQT 
*                 ENTRY FOR THE REFERENCED
*                 I/O UNIT. 
* 
*        (P)     JSB  $ETEQ 
*        (P+1)  - RETURN - (A),(B) MEANINGLESS
* 
*          THERE ARE NO ERROR RETURNS OR
*           ERROR CONDITIONS DETECTED.
* 
* 
$ETEQ NOP 
      STA EQT1
      INA 
      STA EQT2
      INA 
      STA EQT3
      INA 
      STA EQT4
      INA 
      STA EQT5
      INA 
      STA EQT6
      INA 
      STA EQT7
      INA 
      STA EQT8
      INA 
      STA EQT9
      INA 
      STA EQT10 
      INA 
      STA EQT11 
      INA 
      STA EQT12 
      INA 
      STA EQT13 
      INA 
      STA EQT14 
      INA 
      STA EQT15 
      JMP $ETEQ,I 
* 
* 
      SKP 
* 
* SPECIAL SECTION "I/O CLEAR "
*   ENTRY POINT IS "$IOCL"
* 
*  PURPOSE: THE FUNCTION OF THIS ROUTINE
*          IS TO REMOVE A PROGRAM FROM AN 
*          I/O HANG-UP CONDITION RESULTING
*          FROM AN INPUT REQUEST NOT BEING
*          COMPLETED BY THE DEVICE. 
* 
*          THIS "CLEARING" PROCEDURE IS 
*          INITIATED BY THE OPERATOR IN 
*          USING THE I/O ABORT VERSION OF THE 
*          "OF,XXXXX,1" COMMAND. THE "OF" 
*          STATEMENT PROCESSOR IN 'SCHED' 
*          CALLS THIS SECTION IF THE REF- 
*          ERENCED PROGRAM IS SUSPENDED 
*          FOR AN I/O INPUT REQUEST.
* 
*  PROCESS: THE LIST OF EACH EQT ENTRY
*          IS SEARCHED TO FIND THE QUEUED 
*          REQUEST CORRESPONDING TO THE 
*          ID SEGMENT OF THE REFERENCED 
*          PROGRAM.  THE ENTRY IS REMOVED 
*          FROM THE LIST AND THE LIST IS
*          APPROPRIATELY LINKED TO REFLECT
*          THE CHANGE.
* 
*          IF THE ENTRY WAS THE FIRST ONE 
*          IN THE LIST (I.E. THE ACTIVE 
*          REQUEST), THE DEVICE'S DRIVER IS 
*          CALLED WITH A CLEAR REQUEST (CONTROL 
*          WITH ZERO SUBFUNCTION. IF THE DRIVER 
*          ACCEPTS THE REQUEST (A=0 ON RETURN) THEN 
*          EQT1 SIGN BIT IS SET AND A 1 SEC. TIME OUT 
*          IS SET UP. (THIS TIME OUT IS TRAPED BY THE 
*          SYSTEM AND IS NEVER GIVEN TO THE DRIVER).
*          $ABRT IS CALLED TO ABORT THE PROGRAM AND 
*          CONTROL IS TRANSFERRED TO "$XEQ" 
*          IF THE DEVICE WAS NOT CLEARED
*          OR TO "$CON1" TO INITIATE THE NEXT STACKED 
*          REQUEST (OR TO ALLOCATE THE DMA CANNEL)
* 
*  CALLING SEQUENCE:
* 
*          (A)= ID SEGMENT ADDRESS OF PROGRAM 
* 
*         (P) JMP  $IOCL
* 
*            -NO RETURN - 
* 
* 
      SKP 
      ENT $IOCL 
* 
$IOCL STA TEMP1     SAVE ID SEGMENT ADDRESS.
      LDA EQT#      SET TEMP2 = NEGATIVE
      CMA,INA        NUMBER OF EQT
      STA TEMP2       ENTRIES.
      LDA EQTA      INITIALIZE FOR
* 
IOCL  STA IOCL5      EQT ENTRY WORD 
IOCL0 STA IOCL6       1 ADDRESS.
* 
      LDA A,I       GET LINK ADDR 
      RAL,CLE,ERA   CLEAR SIGN ,SET E IF SIGN WAS SET 
      CPA TEMP1     JUMP IF A 
      JMP IOCL2      MATCH TO PROGRAM. (TEMP2 = -EQT -1 ON EXIT)
* 
      SZA           IF NOT END OF LIST, 
      JMP IOCL0      CONTINUE SCAN. 
* 
      LDA IOCL5     SET (A) = ADDRESS OF
      ADA .15        NEXT EQT ENTRY.
      ISZ TEMP2     IF NOT END OF EQT, GO (TEMP2 = -EQT -1 ON EXIT) 
      JMP IOCL       TO SCAN NEXT ENTRY LIST. 
* 
*     SCAN ALL DRT WORD 2 I/O QUEUES
* 
      LDA LUMAX     SET TEMP2 = NEGATIVE
      CMA,INA        NUMBER OF DRT
      STA TEMP2       ENTRIES.
      LDA DRT       INITIALIZE
      ADA LUMAX      FOR FIRST
      STA IOC50       DRT WORD
IOC41 STA IOC51        TWO. 
      LDA A,I       GET LINK
      RAL,CLE,ERA   CLEAR SIGN, SET E IF SIGN SET.
      CPA TEMP1     JUMP IF A MATCH 
      JMP IOC62      TO A PROGRAM.
* 
      SZA           IF NOT END OF LIST, 
      JMP IOC41      CONTINUE SCAN. 
* 
      ISZ IOC50     SET <A> = NEXT
      LDA IOC50      ADDRESS OF NEXT
      ISZ TEMP2       DRT WORD 2. 
      JMP IOC41     IF NOT END OF DRT, CONTINUE SCAN. 
* 
*     SCAN $ELTB ENTRY WORD 3  I/O QUEUES 
* 
      LDB $ELTB,I   GET $ELTB HEADER WORD.
      SSB,RSS       IF NOT_EMPTY BIT NOT SET, 
      JMP IOC6X      NOT HUNG ON ANY LIST, OK TO ABORT. (GLM.2013)
* 
      RBL,BRS       GET RID OF NOT_EMPTY BIT. 
      LDA $ELTB     GET TABLE ADDR. 
      ADA .1        GET ADDR OF 
      ADA B          1ST $ELTB ENTRY WORD 3 
      ADA B           IN A. 
      STA IOC50     THEN STORE IT.
      CMB,INB       STORE 2'S COMPLE
      STB TEMP2      OF TABLE LENGTH. 
IOC45 STA IOC51     STORE POTENTIALLY RIGHT LINK. 
      LDA A,I       GET LINK WORD.
      RAL,CLE,ERA   CLEAR SIGN, SET (E) = SIGN. 
      CPA TEMP1     COMPARE AGAINST ID SEG IN QUESTION. 
      JMP IOC62     JIF MATCH FOUND.
* 
      SZA           IF NOT END OF CHAIN,
      JMP IOC45      GO LOOP. 
* 
      ISZ IOC50     SET (A) = ADDR OF 
      LDA IOC50      NEXT $ELTB ENTRY WORD 3. 
      ISZ TEMP2     IF NOT ALL WORD 3 POINTERS CHECKED, 
      JMP IOC45      GO LOOP. 
* 
IOC6X LDA TEMP1      FETCH ID SEGMENT ADDRESS  (GLM.2013) 
      JMP IOC63     NOT HUNG ON ANY LIST, OK
      SKP 
* 
*     PROGRAM REQUEST FOUND IN DRT OR $ELTB.  NOW TO UNLINK IT. 
* 
IOC62 LDB A,I       GET NEXT LINK, PROPOGATE
      RBL,ERB        SIGN IF SIGN WAS SET AND 
      STB IOC51,I     STORE IN PREVIOUS LINK. 
* 
      LDA TEMP1     CHECK IF THIS 
      ISZ TEMP1      IS A SYSTEM
      LDB TEMP1,I     REQUEST.
      SSB,RSS       IF SO SKIP ABORT. 
IOC63 JSB $ABRT     'ABORT PROGRAM'   (GLM.2013)
      JMP $XEQ      RETURN. 
* 
* PROGRAM REQUEST ENTRY FOUND IN EQT, UNLINK REQUEST. 
* 
* EQT#-TEMP2+1 = EQT OF I/O RQ TO ABORT 
* 
IOCL2 LDB A,I       GET NEXT LINK AND SET 
      RBL,ERB       PROPOGATE SIGN IF SIGN SET
      STB IOCL6,I    IN PREVIOUS LINK.
* 
      LDA TEMP2      GET THE EQT INVOLVED 
      STA NEQT        AND SAVE BECAUSE $ABRT MODIFIES IT(VIA $SYMG) 
* 
      LDA TEMP1     "ABORT
      ISZ TEMP1     CHECK IF THIS IS A
      LDB TEMP1,I     SYSTEM REQUEST
      SSB,RSS          IF SO SKIP ABORT 
      JSB $ABRT       PROGRAM"
* 
      LDA IOCL5     IF PROGRAM REQUEST
      LDB IOCL6,I 
      CPA IOCL6      WAS CURRENT ENTRY, 
      SSB           AND NOT NOW CLEARING SKIP TO CLEAR DEVICE.
      JMP $XEQ      -EXIT TO $XEQ.
      SKP 
      JSB $ETEQ 
      JSB CLDMA     CLEAR ANY DMA CHANNEL ASSIGNED
      LDA B3.I      GET CLEAR REQUEST (100003B) 
      STA EQT6,I    SET IN EQT
* WHAT'S HAPPENING BELOW 'TIL THE NEXT LABEL IS THIS: 
* IF THE EQT IS DOWN OR FREE,  I/O WAS NOT ONGOING,  SO THERE IS NO NEED TO 
* ISSUE  THE CLEAR REQUEST.   IF  THE DRIVER IS BUSY,  WE CERTAINLY NEED TO 
* ISSUE  THE CLEAR REQUEST.   IF NEITHER,  THEN THE DRIVER  IS IN  DMA-WAIT 
* STATE.   IN THIS CASE,  IF THE "D" BIT IS SET IN EQT4,  THIS DRIVER AUTO- 
* MATICALLY  GETS  DMA  AT  INITIAL ENTRY:  IT  DOESN'T  SCREW AROUND  WITH 
* DYNAMIC ALLOCATION  OF  DMA.   HOWEVER,  IOC  NEVER CALLED THE DRIVER FOR 
* THIS CALL,  BECAUSE DMA WAS UNAVAILABLE.   HENCE, AGAIN, THERE IS NO NEED 
* TO ISSUE  THE CLEAR REQUEST.   IF THE  "D"  BIT IS  NOT SET,  IT IS STILL 
* POSSIBLE  THAT THE DRIVER ASKED FOR  DMA ALLOCATION FROM ITS CONTINUATION 
* SECTION  (IF SO, THE "DRIVER-EXITED-FROM-CONTINUATION-SECTION-TO-GET-DMA" 
* FLAG, EQT3 BIT 15, WILL BE SET),  AND, IN THAT CASE,  WE DO NEED TO ISSUE 
* THE CLEAR REQUEST.   IF NEITHER "D" (IN EQT4) NOR "D-E-C-S-G-D" (IN EQT3) 
* IS SET,  THEN THE REASON  FOR  THE DMA-WAIT STATE OF THE EQT  CAN ONLY BE 
* THAT THE DRIVER REQUESTED DMA FROM THE INITIATION SECTION.  IN THIS CASE, 
* NOTHING WAS STARTED (HOPEFULLY)  BY THE DRIVER  FOR THIS CALL,  AND AGAIN 
* WE DO NOT ISSUE THE CLEAR REQUEST.
      LDA EQT5,I    GET CURRENT STATUS
      RAL           GET AV BITS IN BITS 15 & 1
      SLA,RSS       IF DOWN (OR FREE),
      JMP $XEQ         LEAVE THE EQT BE,
* 
      SSA,RSS       ELSE IF BUSY
      JMP IOC65             GO ISSUE THE CLEAR, 
* 
      LDB EQT4,I         ELSE IF THE D BIT
      SSB                        IS SET,
      JMP $XEQ                   LEAVE THE EQT BE,
* 
      LDB EQT3,I              ELSE IF THE DECSGD
      SSB,RSS                         BIT IS CLEAR, 
      JMP $XEQ                        LEAVE THE EQT BE. 
* 
IOC65 LDA EQT5,I    MAKE
      AND MASK       THE EQT
      STA EQT5,I      NOT BUSY. 
* 
      LDB NEQT        GET EQT# OF INTEREST
      ADB EQT#        B=EQT#
      ADB $DVMP       NOW INDEX INTO
      ADB EQT#        PART 2 OF DVR MAP TABLE 
      CLA             AND CLEAR IT SO THAT THE DVR
      STA B,I         IS ENTERED IN THE SYS MAP ON
*                                                        FUTURE INTERRUPTS
      JSB $DRVM     SET UP FOR MAPPING
      LDA EQT4,I    GET THE SELECT CODE 
      LDB EQT2,I    AND THE I.XX ADDRESS
      ELB,CLE,ERB   CLEAR POSSIBLE SIGN (SET BY $DLAY),SAVE E 
      STB EQT2,I    RESTORE I.XX ADDRESS
      AND B77       ISOLATE THE SELECT CODE AND 
      SEZ           ENTER DRIVER IN USER MAP? 
      JMP IOCUS      YES
* 
      JSB B,I       ENTER DRIVER IN SYSTEM MAP
      JMP IOCWT 
* 
IOCUS JSB $UIN      ENTER DRIVER IN USER MAP, RETURN TO IOCWT 
* 
*     IF REQUEST ACCEPTED THEN WE MUST SET UP FOR AN INTERRUPT BY 
* 
*     A) SETTING THE DEVICE BUSY
*     B) SETTING A TIME OUT (1 SEC. IS ARBITRARILY USED)
* 
*     IF REQUEST IS NOT ACCEPTED OR IS COMPLETED THEN:
* 
*     A) ZAP TIME OUT AND 
*     B) GO TO $CON1 TO GET THE NEXT REQUEST
* 
IOCWT CLB,CCE       FIRST ZAP TIME OUT
      STB EQT15,I 
      LDB EQT1,I    SET THE SIGN BIT IN EQT1
      RBL,ERB       FOR $CON1 (NOW OR LATER)
      STB EQT1,I
      CCE,SZA       INTERRUPT EXPECTED? 
      JMP $CON1     NO SO JUST GO TO $CON1
* 
      LDA EQT5,I    YES SO SET
      RAL,ERA       BUSY
      STA EQT5,I    AND 
      LDA N100      SET UP
      STA EQT15,I   A REASONABLE TIME OUT 
      LDA EQT3,I    CLEAR THE 
      ELA,CLE,ERA    DRIVER-EXITED-FROM-CONTINUATION- 
      STA EQT3,I      SECTION-TO-GET-DMA FLAG.
      JSB $RSM      *RESTORE USER MAP TO PRE-DRIVER STATA 
      JMP $XEQ      GO TO THE DISPATCHER
* 
      SPC 1 
IOCL5 NOP 
IOCL6 NOP 
IOC50 NOP 
IOC51 NOP 
MASK  OCT 37777 
NEQT  NOP 
      SKP 
* 
*  ROUTINE TO CLEAR DMA CHANNEL IF ASSIGNED TO DEVICE 
* 
CLDMA NOP 
      LDB INTBA      GET THE INTERRUPLE ADDRESS TO B
      LDA B,I         AND DMA 6 ENTRY TO A
      RAL,CLE,ERA      CLEAR THE SIGN BIT 
      CPA EQT1       THIS CHANNEL ASSIGNED? 
      CLA,RSS         YES- SKIP 
      JMP IOCL3       NO TRY NEXT CHANNEL 
* 
      CLC 6          CLEAR CHANNEL
      STF 6            6. 
      STA B,I        SET IT AVAILABLE IN INTBA
      SPC 1 
IOCL3 INB            STEP TO DMA 7 ENTRY
      LDA B,I         GET TO A  AND 
      RAL,CLE,ERA      CLEAR THE SIGN BIT 
      CPA EQT1       THIS CHANNEL ASSIGNED? 
      CLA,RSS         YES - SKIP
      JMP CLDMA,I     NO - EXIT CHANNELS CLEARED
* 
      CLC 7           CLEAR CHANNEL 7 
      STF 7           AND 
      STA B,I         MAKE IT AVAILABLE.
      JMP CLDMA,I 
* 
*  ROUTINE TO CLEAR ALL CHANNELS SERVICED BY EQT ENTRY
* 
CLCHS NOP 
      JSB CLDMA       CLEAR DMA CHANNEL IF ASSIGNED 
      LDA INTLG     STORE INTERRUPT 
      CMA,INA        TABLE LENGTH-
      ADA .2         RELATED INDEX
      STA TEMPW 
      LDA CLR10     STORE INITIAL 
      STA CLCSC      CLC S.C. 
      LDA INTBA      INSTRUCTION
      ADA .2
CLRNX LDB A,I       GET NEXT TABLE ENTRY- 
      CPB EQT1      DOES IT REFERENCE THIS EQT? 
CLCSC CLC 00B        YES-GO CLEAR IT
      ISZ TEMPW     THRU TABLE? 
      INA,RSS        NO-INDEX TO NEXT ENTRY 
      JMP CLCHS,I    YES-EXIT 
* 
      ISZ CLCSC 
      JMP CLRNX 
* 
CLR10 CLC 10B 
B3.I  DEF 3,I 
N100  DEC -100
      HED * $SYMG BUFFER AND PRIVLEDGE I/O CONFIGURE SECTION *
* 
SBUF  BSS 180       15 * 12 
SBL   DEF * 
* 
      ORG SBUF      PUT IOC CONFIGURING ROUTINE IN BUFFER 
      STA SBUF      SAVE THE A REG. 
      CLA 
      STA $ZZZZ     ZERO THE ABORT LIST 
      STA DUMMY,I   ZAP THE PRIV. TRAP CELL.
      LDA DUMMY     GET THE DUMMY I/O ADDRESS 
      SZA,RSS       IF NONE 
      JMP NOPRV     GO EXIT 
* 
      ADA CLCP      CONFIGURE THE DUMMY ADDRESSES 
      STA CLC2,I    USE INDIRECTS TO AVOID LINKS
      XOR STCP      MAKE STC
      STA STC2,I    STC 
      STA STCP      SET IN LINE TOO 
      XOR STFP      STF 
      STA STF2,I    AND STF 
      STA STFP      NEED THIS IN  LINE ALSO 
STCP  OCT 4000      SET UP THE PRIV. CARD 
STFP  OCT 600       NOW FOR DISC DRIVERS ETC. 
NOPRV LDA CLE       REPLACE CALL TO HERE
      STA $YMG+1     WITH A CLE 
      LDB DL.12     GET DEF TO L.012 FOR
      LDA PDSK      DISC PROTECT  OPTION
      SZA           PROTECT?? 
      STB DPOPI,I   YES, SET IT UP
      LDB HLT2      PUT HALT 2 IN LOCATION 2
      STB 2          AND HALT 3 IN LOCATION 3 
      CCE,INB        OF SYSTEM MAP FOR TRAPPING 
      STB 3          ERRORS 
      LDA $DVPT     GET PAGE OF DRIVER PTTN 
      ALF,ALF        CONVERT TO LOGICAL ADDR
      RAL,RAL 
      IOR B1740      FORM ADDR OF USER MAP COPY AREA
      STA DDVPT,I   SAVE LOG ADDR 
      LDA ACLAS 
      CMA,INA 
      STA DDMCL,I 
SBUF3 LDA SBUF      RESTORE A 
      JMP $YMG+1    EXIT INITIALIZATION CODE
* 
* 
CLE   CLE 
PDSK  DEF $PDSK 
DL.12 DEF L.012 
CLCP  CLC 0 
DPOPI DEF DPOPT 
STC2  DEF SW1 
STF2  DEF STF1
CLC2  DEF SW2       LOCAL DEFS TO AVOID LINKS 
DDVPT DEF DVPTA 
DDMCL DEF MCLAS 
ACLAS DEF $CLAS+0 
HLT2  HLT 2 
B1740 OCT 1740
* 
L     EQU 165+SBUF-*  ERROR HERE MEANS WE RAN OUT OF BUFFER 
      ORR           LEAVE THE BUFFER
      SKP 
      HED ** RTE IV B  EQT LOCK CLEARING ROUTINE ** 
******************************************************************
* 
*           EQUIPMENT LOCK CLEARING ROUTINE 
* 
*  $EQCL IS THE EQUIPMENT UNLOCKING ROUTINE.
*  IT IS CALLED BY THE ABORT PROCESSOR (IN THE DISPATCHER) ON 
*  FINDING ONE OR MORE EQTS. IN THE SYSTEM LOCKED.
* 
*  ON NORMAL TERMINATION, THIS ROUTINE
*     CLEARS THE $ELTB ENTRY FOR THE SPECIFIED EQUIPMENT, 
*     UPDATES THE NOT_EMPTY BIT (IF NEED BE) IN THE TABLE HEADER, 
*     ELEVATES THE PRIORITY OF THE I/O CALLS AT THE LOCKED EQT
*               (ALL OF WHICH BELONG TO THE LOCKER) TO ZERO,
*     CALLS THE SCHEDULER TO SCHEDULE ANY PROGRAMS WAITING FOR THIS 
*               EQUIPMENT OR FOR A SLOT IN THE TABLE, 
*     TRANSFERS THE LINKED LIST OF $XSIO REQUESTS HUNG ON THE ENTRY 
*               JUST CLEARED BACK ON THE EQT FOR THAT EQUIPMENT,
*               RIGHT BEHIND THE ERSTWHILE LOCKER'S ZERO-PRIORITY 
*               CALLS,
*     CALLS "DRIVR" TO INITIATE THE FIRST $XSIO CALL REHUNG ON THE
*               EQT, IF THE EQT. WAS IDLE AT THE TIME OF REHANGING, 
*     CALLS "NOTRD" FOR DIAGNOSTIC PROCESSING, IF "DRIVR" MAKES AN
*               ERROR RETURN, 
*     AND RETURNS TO THE CALLER.
* 
*  CALLING SEQUENCE:
*     LDA ID_SEGMENT_ADDR_OF_TERMINATING_PROGRAM
*     LDB $ELTB,I 
*     JSB $EQCL 
* 
******************************************************************* 
* 
* 
$EQCL NOP 
      STA TMP       STORE ID SEG ADDR OF ABORTING PROG. 
      ELB,CLE,ERB   OMIT NOT EMPTY BIT FROM TABLE HEADER. 
      STB T4        STORE TABLE LENGTH. 
      LDA $ELTB     GET TABLE ADDR. 
      ADA .1        GET ADDR OF 1ST EQT.# IN TABLE. 
      STA TB        STORE IT. 
      ADA B         GET ADDR OF 2ND WORDS OF TABLE ENTRIES. 
      STA T1        STORE IT. 
      CMB,INB       COMPUTE 2'S COMPLE OF #_OF_ENTRIES, 
      STB T2         AND STORE IT HERE. 
      CLA           INITIALIZE
      STA T6         #_OF_EMPTIES.
EQC10 LDB T1,I      GET ID SEG ADDR FROM TABLE. 
      RBL,CLE,ERB   (E)= LOCK_ON_ABORT, (B)= ID SEG ADDR. 
      LDA TB,I      LOAD NEXT EQT. # IN TABLE.
      SZA,RSS       IF A BLANK ENTRY IS ENCOUNTERED,
      ISZ T6         BUMP #_OF_EMPTIES. 
      CPB TMP       IF THIS EQT. IS LOCKED TO OUR MAN,
      JMP EQC30      GO LOOK INTO THE SITUATION.
* 
EQC20 ISZ TB        INCREMENT TO NEXT ENTRY'S 1ST WORD. 
      ISZ T1        INCREMENT TO NEXT ENTRY'S 2ND WORD. 
      ISZ T2        IF NOT ALL ENTRIES COMPARED YET,
      JMP EQC10      LOOP BACK. 
* 
      LDA T6         GET TOTAL #_OF_EMPTIES IN TABLE. 
      CPA T4         COMPARE WITH TABLE LENGTH. 
      RSS            IF TABLE NOT EMPTY,
      JMP $EQCL,I     RETURN W/O CLEARING NOT_EMPTY BIT.
* 
      LDA $ELTB,I    GET TABLE HEADER WORD. 
      ALR,RAR        CLEAR NOT_EMPTY BIT, 
      STA $ELTB,I     AND RESTORE.
      JMP $EQCL,I    THEN RETURN. 
* 
EQC30 ADB .20       GET ADDR OF FLAG WORD IN ID SEG.
      LDA B,I       ISOLATE THE NORMAL_TERM. FLAG 
      AND .2         THAT WAS SET IN "MPT1".
      SZA           IF NORMAL TERMINATION,
      JMP EQC40      GO DO THE FULL UNLOCK. 
* 
      SEZ,RSS        ELSE, IF LOCK_ON_ABORT NOT SET,
      JMP EQC40       GO DO THE FULL UNLOCK.
* 
      STA T1,I        ELSE, CLEAR ONLY WORD 2 (ID SEG ADDR).
      JMP EQC20       THEN LOOK FOR MORE LOCKS. 
* 
EQC40 LDA TB,I      FIRST PRESERVE
      STA T3         EQT. # TO BE UNLOCKED. 
      LDA TB        THEN PRESERVE ADDR OF 
      STA T7         ENTRY FOR SEMAPHORING. 
      CLB           CLEAR THE 
      STB A,I        1ST WORD.
      ADA T4        COMPUTE ADDR OF ENTRY'S 2ND WORD. 
      STB A,I       CLEAR 2ND WORD. 
      ADA T4        COMPUTE ADDR OF ENTRY'S 3RD WORD. 
      LDB A,I       GET THE 3RD WORD (LIST POINTER),
      STB T8         AND PRESERVE IT. 
      CLB           THEN CLEAR
      STB A,I        THE 3RD WORD ALSO. 
* 
      ISZ T6        BUMP #_OF_EMPTIES FOR BLANK CREATED.
* 
      CCA           GET ADDR OF LOCKED EQUIPMENT'S EQT
      ADA T3         ENTRY'S "PENDING I/O CALLS POINTER"
      MPY .15         WORD (VIZ., WORD ZERO IN THE
      ADA EQTA         EQT ENTRY).
      STA TA        STORE POINTER WORD ADDR HERE, 
      STA TC         AND HERE.
EQC75 LDA TA,I      GET ADDR OF NEXT ENTRY IN CHAIN.
      SZA,RSS       IF END OF LIST, 
      JMP EQC80      THAT'S WHERE TO HANG $XSIO PENDING.
* 
      ELA,CLE,ERA   GET RID OF "I/O CLEARED" FLAG.
      STA TA        STORE CURRENT ENTRY ADDR. 
      INA           2ND WORD HAS "REQUEST TYPE
      LDB A,I        IDENTIFIER" IN BITS 14-15. 
      INA           3RD WORD POTENTIALLY HAS PRIORITY.
      RBL           GET BUFFERED/UNBUFFERED (1/0) IN 15.
      SSB,RSS       IF UNBUFFERED,
      JMP EQC75      IT'S SOMEONE ELSE'S PRE-LOCK REQ.
      CLB           CHANGE REQUEST PRIORITY TO ZERO 
      STB A,I        TO FLUSH IT OUT BEFORE ANYTHING ELSE.
      JMP EQC75     LOOP TO DO LIKEWISE TO ALL HIS CALLS. 
* 
EQC80 LDA T7        GET $ELTB ENTRY ADDR. 
      JSB $SCD3      SCHEDULE ANY WAITERS_FOR_THIS_EQT. 
      LDA $ELTB     GET TABLE HEADER ADDR.
      JSB $SCD3      SCHEDULE WAITERS_FOR_A_PLACE_IN_TABLE. 
      LDA T8        GET POINTER TO $XSIO LINKED LIST. 
      STA TA,I      REHANG IT ON THE EQT. 
      SZA,RSS       IF THERE WERE NO $XSIO CALLS, 
      JMP EQC20      SKIP POTENTIAL "DRIVR" CALL. 
* 
      LDB TA        IF THERE IS (ARE) USER CALL(S)
      CPB TC         ALREADY QUEUED AHEAD OF
      RSS             THE $XSIO CALL(S) 
      JMP EQC20        AGAIN NO NEED TO CALL "DRIVR". 
* 
      LDA T3        GET EQT.# TO INITIATE I/O FOR,
      JSB $CVEQ      AND GO SET UP EQT1-15. 
      JSB DRIVR     GO INITIATE I/O.
      JMP EQC20     THEN LOOK FOR MORE LOCKS. 
* 
      LDA EQC20     ERROR, SO PASS RETURN ADDR
      STA XSIOE      TO DIGNOSTIC PROCESSOR,
      JMP NOTRD       AND JUMP TO HIM.
* 
* 
.20   DEC 20
TMP   NOP           ID SEG ADDR OF TERMINATING PROGRAM
T1    NOP           ADDR OF CURRENT ID SEG ADDR IN $ELTB
T2    NOP           2'S COMPLE OF #_OF_COMPARES_YET_UNDONE
T3    NOP           EQT. # CURRENTLY BEING UNLOCKED 
T4    NOP           TABLE LENGTH
T6    NOP           CURRENT # OF EMPTIES IN TABLE 
T7    NOP           ADDR OF CURRENT LOCKED EQT.'S ENTRY 
T8    NOP           POINTER TO $XSIO LINKED LIST
TA    NOP           ADDR OF CURRENT EQT LINK
TB    NOP           ADDR OF CURRENT EQT.# IN $ELTB
TC    NOP           ADDR OF 1ST EQT LINK (I.E., EQT1) 
      HED ** SYSTEM BASE PAGE COMMUNICATION AREA ** 
XI    EQU 1647B 
.     EQU 1650B     ESTABLISH ORIGIN OF AREA
* 
* SYSTEM TABLE DEFINITION * 
* 
EQTA  EQU .+0      FWA  OF  EQUIPMENT TABLE 
EQT#  EQU .+1       # OF EQT ENTRIES
DRT   EQU .+2      FWA  OF  DEVICE REFERENCE TABLE
LUMAX EQU .+3       # OF LOGICAL UNITS (IN DRT) 
INTBA EQU .+4      FWA  OF  INTERRUPT TABLE 
INTLG EQU .+5       # OF INTERRUPT TABLE ENTRIES
TAT   EQU .+6      FWA  OF  TRACK ASSIGNMENT TABLE
KEYWD EQU .+7      FWA  OF  KEYWORD BLOCK 
* 
* I/O MODULE/DRIVER COMMUNICATION 
* 
EQT1  EQU .+8      ADDRESSES
EQT2  EQU .+9 
EQT3  EQU .+10      OF
EQT4  EQU .+11
EQT5  EQU .+12      CURRENT 
EQT6  EQU .+13
EQT7  EQU .+14      15-WORD 
EQT8  EQU .+15
EQT9  EQU .+16      EQT 
EQT10 EQU .+17
EQT11 EQU .+18      ENTRY 
EQT12 EQU .+81
EQT13 EQU .+82
EQT14 EQU .+83
EQT15 EQU .+84
* 
CHAN  EQU .+19     CURRENT DMA CHANNEL #
TBG   EQU .+20     I/O ADDRESS OF TIME-BASE CARD
SYSTY EQU .+21     EQT ENTRY ADDRESS OF SYSTEM TTY
* 
* SYSTEM REQUEST PROCESSOR /'EXEC' COMMUNICATION *
* 
RQCNT EQU .+22     # OF REQUEST PARAMETERS -1 
RQRTN EQU .+23      RETURN POINT ADDRESS
RQP1  EQU .+24      ADDRESSES 
RQP2  EQU .+25
RQP3  EQU .+26       OF REQUEST 
RQP4  EQU .+27
RQP5  EQU .+28       PARAMETERS 
RQP6  EQU .+29
RQP7  EQU .+30       (SET FOR MAXIMUM OF
RQP8  EQU .+31
RQP9  EQU .+32        9 PARAMETERS) 
* 
* DEFINITION OF SYSTEM LISTS (QUEUES) * 
* 
* 
* DEFINITION OF EXECUTING PROGRAM  ID SEGMENT' *
* 
XEQT  EQU .+39     ID SEGMENT ADDR. OF CURRENT PROG.
XTEMP EQU .+41       'TEMPORARY (5-WORDS) 
XPRIO EQU .+46       'PRIORITY' WORD
XSUSP EQU .+48       'POINT OF SUSPENSION'
XA    EQU .+49       'A REGISTER' AT SUSPENSION 
XB    EQU .+50       'B REGISTER' 
XEO   EQU .+51       'E AND OVERFLOW
* 
* SYSTEM MODULE COMMUNICATION FLAGS * 
* 
OPATN EQU .+52     OPERATOR/KEYBOARD ATTENTION FLAG 
DUMMY EQU .+55     I/O ADDRESS OF DUMMY INT. CARD 
* 
* UTILITY PARAMETERS
* 
TATLG EQU .+69     LENGTH OF TRACK ASSIGNMENT TABLE 
TATSD EQU .+70      # OF TRACKS ON SYSTEM DISC
SECT2 EQU .+71      # SECTORS/TRACK ON LU 2 (SYSTEM)
SECT3 EQU .+72      # SECTORS/TRACK ON LU 3 (AUX.)
LGOTK EQU .+77     LOAD-N-GO: LU,STG TRACK,# OF TRKS
LGOC  EQU .+78      CURRENT LGO TRACK/SECTOR ADDRESS
MPTFL EQU .+80      MEMORY PROTECT ON/OFF FLAG (0/1)
* 
      ORG *         LENGTH OF RTIOC 
      END $CIC0 
                                                                                                                                    