ASMB,L,C
      HED RTE-IV  SYSTEM COMMAND MODULE 
* 
*     NAME:  OCMD4
*     SOURCE: 92067-18112 
*     RELOC:  PART OF 92067-16103 
*     PGMR:   D.L.S.,E.J.W.,G.L.M.
* 
*  ***************************************************************
*  * (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 OCMD4,0 92067-16103 REV.1903 780304 
* 
**********************************************
* 
      ENT $LUPR,$EQST,$CHTO 
      EXT $CVEQ,$CNV1 
      EXT $CNV3,$UNLK,$XXUP,$DLAY,$DMEQ,$SCD3,$ETEQ 
      EXT $CKLO,$BITB,$INER,$XCQ,$MSEX
A     EQU 0 
B     EQU 1 
      SUP 
* 
***************************************************************** 
* 
*     RTE SYSTEM PROGRAM OCMD4: 
* 
*     OCMD4 PROVIDES EXECUTION OF THE FOLLOWING SYSTEM COMMANDS:
* 
*          LU,P1[,P2[,P3]]     LU STATUS AND LU CHANGE. 
*          EQ,P1[,P2]          EQT STATUS AND BUFFERING CHANGE. 
*          TO,P1[,P2]          SHOW TIMEOUT OR CHANGE TIMEOUT.
* 
* 
******************************************************************* 
* 
$EQST STA P1
      STB P2
      JSB IODNS     CHECK P2 AND SET EQT ADDRESSES. 
      LDB P2       CHECK PARAMETER #2.
      LDA EQT4,I   GET EQT CHANNEL WORD.
      CLE,SSB,RSS  IF P2=-1, OUTPUT EQT STATUS
      JMP EQST1    OTHERWIZE, SET BUFFERING BIT IN EQT. 
* 
      JSB $CNV1    OUTPUT THE EQT STATUS. 
      STA EQMS1    CONVERT THE CHANNEL NUMBER.
* 
      LDA EQT4,I   CONVERT
      ASR 6           UNIT #. 
      AND B37 
      JSB $CNV1 
      STA EQMS5 
      LDA EQT4,I   SET
      LDB EQBLK     D (FOR DMA CHANNEL) 
      RAL,SLA       OR
      LDB EQBD      0 
      STB EQMS3 
      LDB EQBLK    SET
      SSA           B (FOR AUTOMATIC BUFFERING) 
      LDB EQBB      OR
      STB EQMS4     0 
      LDA EQT5,I   SET
      RAL,RAL       AVAILABILITY
      AND .3         STATUS 
      ADA EQBLK     (0,1,2,OR3) 
      STA EQMS6 
      LDA EQT5,I   CONVERT
      ALF,CLE,ALF   EQUIPMENT 
      ADA B3000     TYPE (SET HIGH BITS TO
      JSB $CNV1     FOOL LEADING BLANK GENERATOR) 
      STA EQMS2      DV.NN. 
      LDA EQMSA    (A) = ADDRESS OF REPLY 
      JMP $MSEX    RETURN.
* 
EQST1 ERB             ROTATE BIT 1 TO E 
      RAL,RAL         AND PUT IN
      ERA,RAR         14 OF EQT4
      STA EQT4,I    AND RESTORE 
      JMP $XCQ      ALL DONE
* 
EQMSA DEF *+1 
      DEC -20 
      ASC 1,
EQMS1 NOP            I/O CHANNEL #
EQBD  ASC 2, DV.
EQMS2 NOP            EQUIP TYPE CODE
EQMS3 NOP            D OR 0 
EQMS4 NOP            B OR 0 
      ASC 1, U
EQMS5 NOP            UNIT # 
EQMS6 NOP            AVAILABILITY 
* 
EQBLK ASC 1, 0
EQBB  ASC 1, B
* 
.2    DEC 2 
.3    DEC 3 
B37   OCT 37
* 
      SKP 
* 
****************************************************************
* 
* 'LOGICAL UNIT' STATEMENT
* 
* FORMAT:  LU,P1(,P2(,P3))   WHERE: 
* 
*           P1 = LOGICAL UNIT # 
*           P2 = 0, EQT ENTRY #, OR NOT PRESENT 
*           P3 = SUBCHANNEL # OR NOT PRESENT IN WHICH 
*                CASE IT DEFAULTS TO ZERO 
* 
* ACTION:  1) P2 AND P3 NOT INPUT;  THE ASSIGNMENT OF 
*                LOGICAL UNIT P1 IS PRINTED AS: 
*                   ' LU #P1 = EXX SYY D '
*                     WHERE:
*                       P1=LOGICAL UNIT NUMBER
*                       XX=EQT NUMBER 
*                       YY=SUBCHANNEL NUMBER
*                        D=IF PRESENT, THE LU IS DOWN.
*          2) P2 = 0;  THE ASSIGNMENT IS RELEASED,
*                      I.E, THE CORRESPONDING 
*                          WORD IN THE DEVICE 
*                          REFERENCE TABLE (DRT)
*                          IS SET = 0.
*          3) N2 # 0   THE LU'S ASSIGNMENT IS CHANGED TO POINT
*                       TO THE NEW EQT AND SUBCHANNEL.  ANY I/O 
*                       ASSOCIATED WITH THE OLD EQT AND SUBCHANNEL
*                       (DEVICE)IS TRANSFERRED TO THE NEW DEVICE. 
* 
*     THE FOLLOWING LOCATIONS ARE USED AS TEMPORARIES BY LUPR:
*       <P1>:= LU NUMBER              <P2>:= P3,P2   NEW SUBCH-EQT WORD 
*       <DRT1A>:=DRT WORD 1 ADDRESS   <DRT2A>:=DRT WORD 2 ADDRESS 
*       <OEQT1>:=EQT1 ADDRESS OF OLD  <NEQT#>:=NEW DEVICE'S EQT NUMBER
*                DEVICE 
*       <TTEMP>:="NEW DEVICE'S EQT IS <WORD2>:=NEW DEVICE SPLIT SUB.
*                DOWN" FLAG.
*             :=NEW DEVICE'S MAJOR LU 
*       <NINTF>:#0 INITIATE REQUEST   <XLUS>:#0 MORE THAN ONE LU FOR
*                 ON NEW DEVICE                UP OLD DEVICE
*       <SDRT8>:=SEE SUB. SDRT2 
*       <OSBEQ>:=OLD SUBCH-EQT WORD   <OMJLU>:=OLD DEVICE MAJOR-LU
*       <ODML1>:=OLD DEVICE MAJOR-LU  <ODML2>:=OLD DEVICE MAJOR-LU
*                DRT WORD 1 ADDRESS            DRT WORD 2 ADDRESS 
*       <NDML1>:=NEW DEVICE MAJOR-LU  <NDML2>:=NEW DEVICE MAJOR-LU
*                DRT WORD 1 ADDRESS            DRT WORD 2 ADDRESS 
* 
****************************************************************
* 
      SKP 
$LUPR STA P1
      STB P2
      CPB M1         IF P2= -1, PRINT CURRENT ASSIGNMENT. 
      JMP LUPR0 
* 
      CPA .2        PREVENT REASSIGNMENT
      JMP $INER      OF LU 2 AND LU 3 
      CPA .3
      JMP $INER 
* 
LUPR0 CMA,CLE,INA,SZA,RSS  ILLEGAL LU NUMBER
      JMP $INER         IF THE LU IS LESS 
      ADA LUMAX         THEN 1 OR GREATER 
      CCA,SEZ,RSS        THEN LUMAX.
      JMP $INER 
* 
      ADA P1     SAVE 
      ADA DRT        DRT WORD 
      STA DRT1A       1 AND 
      ADA LUMAX        WORD 2 
      STA DRT2A         ADDRESSES.
* 
      CCE,INB,SZB,RSS IF P2=-1, THEN GO(SET E=1 FOR LUPR3)
      JMP LUPR3        PRINT CURRENT ASSIGNMENT.
* 
      LDB DRT       PREVENT 
      CLE,INB        ASSIGNMENT(CLEAR E)
      DLD B,I         OF ANY OTHER
      CPB P2        DEVICE
      SZB,RSS           TO
      CPA P2          LU 2
      JMP $INER            OR 3.
      SKP 
* 
      LDA P2     CONSTRUCT I/O
      AND B174K      SUBCHANNEL WORD
      ELA,RAL         FOR NEW DEVICE(E WAS
      ALF,RAL          CLEARED)WITH LOWER 
      CLB,SEZ           BITS IN BITS 2-5
      ADA B20K           AND UPPER BIT IN 
      STA WORD2           BIT 13(CLEAR B REG).
* 
      STB NINTF     CLEAR "NEW DEVICE I/O INITIATE" FLAG. 
      STB TTEMP     CLEAR "NEW DEVICE EQT IS DOWN" FLAG.
* 
      LDA DRT1A,I   SAVE
      AND C3700      OLD SUBCH-EQT
      STA OSBEQ       WORD AND
      AND B77          EQT1 
      SZA,RSS 
      JMP LUP25 
      ADA M1          OF
      MPY .15          OLD(CLEAR B REG.)
      ADA EQTA          DEVICE'S
LUP05 STA OEQT1          EQT. 
* 
      LDA P2     CHECK LEGALITY OF
      AND B77        N2(NEW EQT)AND 
      STA NEQT# 
      SZA,RSS         SET THE EQT 
      JMP LUPR2 
* 
      JSB IODNS        ADDRESSES. 
* 
*     SPECIAL TEST TO SEE IF MOVING I-O TO A DISK.IF SO, ERROR. 
* 
      LDA EQT1      IS NEW
      ADA .4         DEVICE A 
      LDA A,I 
      AND B36K        DISK? 
      CPA B14K
      JMP LU100     YES, SO GO DO CHECK.
* 
****************************************************************
*     DETERMINE IF THE OLD DEVICE IS UP OR DOWN.
****************************************************************
* 
LUPR1 LDA DRT2A,I   CHECK IF OLD
      SSA            DEVICE IS
      JMP DNXX        UP OR DOWN. 
      SKP 
****************************************************************
*     OLD DEVICE IS UP. IS THERE MORE THAN ONE LU FOR IT? 
****************************************************************
UPXX  LDA LUMAX     SET UP TO SCAN THE LUS
      CMA,INA 
      STA XLUS      IF COUNT GOES TO ZERO THERE IS BUT ONE. 
      LDB DRT       GET ADDRESS OF THE FIRST ONE
LUCO  LDA B,I       GET AN ENTRY
      AND C3700     DROP POSSIBLE LOCK BITS 
      CPA OSBEQ     IF NOT THE SAME 
      CPB DRT1A     OR IF SAME ENTRY
      INB,RSS       SKIP TO GO ROUND AGAIN
      JMP MLUS      ELSE THERE ARE MORE THAN ONE
* 
      ISZ XLUS      COUNT DOWN THE ENTRIES
      JMP LUCO      AROUND WE GO
*************************************************************** 
*  IF THE DEVICE IS UP AND HAS MORE THAN ONE LU THEN ITS
*  QUEUE IS NOT MOVED.  THIS PREVENTS UNWANTED LOSS OF DATA 
*  CAUSED BY UNRELATED LU CHANGES.
*************************************************************** 
* 
*     DETERMINE IF THE NEW DEVICE IS UP OR DOWN.
****************************************************************
MLUS  LDA NEQT#     CHECK IF NEW
      SZA,RSS        DEVICE IS THE
      JMP UPBIT       BIT BUCKET. 
* 
      JSB CKNLU     CHECK IF NEW DEVICE IS UP OR DOWN.
      JMP UPDN       NEW DEVICE IS DOWN.
      ISZ TTEMP      NEW DEVICE'S EQT IS DOWN.
      SKP 
****************************************************************
*     THE OLD AND NEW DEVICE ARE UP OR THE OLD DEVICE IS UP 
*         AND THE NEW DEVICE'S EQT IS DOWN. 
******************************************************************* 
UPUP  LDA P1     NEW DEVICE IS UP.
      CPA .1        CHECK IF OLD
      JMP UPLU1      DEVICE IS LU 1.
* 
UPUP5 LDA XLUS      IF ANOTHER LU EXISTS
      SZA           THEN
      JMP UPMU      DON'T MOVE THE QUEUE
* 
      LDB OEQT1,I    UNLINK I/O REQUESTS FROM THE 
      RBL,CLE,ERB    OLD DEVICE.  SKIP THE
      SZB,RSS 
      LDB OEQT1 
      LDA DRT2A       FIRST I-O REQUEST.
      JSB $UNLK 
      DEF OSBEQ 
* 
      LDB DRT2A,I   RESET WORD 2 OF THE I/O REQUESTS
      JSB FXWD2      TO THE SUBCHANNEL OF THE NEW DEVICE. 
      LDA OEQT1 
      LDB DRT2A,I   LINK THE I/O REQUESTS 
      JSB $XXUP      ON THE NEW DEVICE. 
      STB DRT2A,I   CLEAR UP THE CURRENT LU 
      STA NINTF     SET THE MUST START NEW I/O FLAG 
UPMU  LDA TTEMP     IS THE NEW DEVICE'S 
      SZA,RSS        EQT DOWN?
      JMP LUP50     NO, SO CONTINUE.
* 
      LDB EQT1,I     YES, SO
      RBL,CLE,ERB     UNSTACK 
      SZB,RSS          NORMAL USER
      LDB EQT1          I/O(SKIP FIRST
      JMP DNDE5          ENTRY)AND CONTINUE.
* 
XLUS  NOP 
      SKP 
UPLU1 LDA EQT5,I    GET DEVICE
      AND B374C      TYPE OF THE
      SZA,RSS         NEW DEVICE AND SEE
      JMP UPLU2        IF IT IS LEGAL 
      CPA B2400         (00 OR 05 SUB 0)
      RSS                FOR A SYSTEM 
      JMP $INER            CONSOLE. 
      LDA WORD2 
      SZA 
      JMP $INER 
* 
UPLU2 LDA TTEMP     MAKE SURE NEW DEVICE'S
      SZA            EQT IS NOT DOWN. 
      JMP $INER 
      LDA EQT1      SET NEW SYSTEM CONSOLE
      STA SYSTY      ADDRESS IN BASE PAGE.
      JMP UPUP5     GO TRANSFER I/O.
* 
* 
UPBIT LDA P1        CHANGING AN UP DEVICE TO
      CPA .1         THE BIT BUCKET.  ERROR 
      JMP $INER        IF THE OLD DEVICE IS 
      JMP UPUP5        THE SYSTEM CONSOLE.
      SKP 
******************************************************************
*     THE OLD DEVICE IS UP AND THE NEW DEVICE IS DOWN.
********************************************************************* 
UPDN  STB TTEMP     SAVE LU# OF FIRST LU(MAJOR LU)OF NEW DEVICE.
      STA NDML2     SAVE DRT WORD 2 ADDRESS OF NEW-MAJOR-LU.
      ADB M1        COMPUTE NEW-
      ADB DRT        MAJOR-LU 
      STB NDML1       DRT WORD 1. 
* 
      LDB P1     CHECK IF THIS
      CPB .1         WILL SET LU
      JMP $INER        1 DOWN.
* 
      LDB TTEMP     CHECK IF LU IS
      CMB,INB        LOWER THEN THE 
      ADB P1       MAJOR LU FOR 
      SSB,RSS          THE NEW DOWNED 
      JMP UPDN5         DEVICE. 
* 
      LDB A,I       LU IS BELOW NEW DEVICE'S MAJOR LU.
      STB DRT2A,I   MOVE I/O FROM MAJOR LU TO LU. 
      LDB XLUS      IF CURRENT DEVICE STILL HAS AN LU 
      SZB           THEN
      JMP DNDN6     SKIP THE MOVE 
* 
      LDB DRT2A     CHASE DOWN THIS DOWN I/O
      JSB CHASE      QUEUE TO ITS END.
      LDA B 
* 
      LDB OEQT1,I    UNLINK I/O REQUESTS FOR THE
      RBL,CLE,ERB    OLD DEVICE AND ADD TO
      SZB,RSS 
      LDB OEQT1 
      JSB $UNLK       THE I-O QUEUE. SKIP FIRST ENTRY.
      DEF OSBEQ 
      JMP DNDN6     GO MODIFY LU'S FOR THE NEW DEVICE.
      SKP 
UPDN5 LDB XLUS      IF WE STILL HAVE A LU FOR THIS DEVICE 
      SZB           THEN
      JMP UPDN6     SKIP THE MOVE 
* 
      LDB NDML2     NEW DEVICE'S MAJOR LU IS BELOW LU.
      JSB CHASE     CHASE DOWN THIS I-O QUEUE 
      LDA B          TO ITS END.
* 
      LDB OEQT1,I    UNLINK I/O REQUESTS
      RBL,CLE,ERB    FOR THE OLD DEVICE 
      SZB,RSS         (SKIP FIRST REQUEST)AND 
      LDB OEQT1        ADD TO DOWNED LU I/O 
      JSB $UNLK         QUEUE.
      DEF OSBEQ 
* 
UPDN6 LDA TTEMP     SET 
      ADA MSIGN      THE LU 
      STA DRT2A,I     DOWN. 
      JMP LUP50     GO FINISH.
      SKP 
****************************************************************
*     THE OLD DEVICE IS DOWN. 
******************************************************************* 
*     DETERMINE IF THE NEW DEVICE IS UP OR DOWN.
* 
DNXX  LDA NEQT#     CHECK IF
      SZA,RSS        NEW DEVICE 
      JMP DNUP        IS BIT BUCKET.
* 
      JSB CKNLU     CHECK IF NEW DEVICE IS UP OR DOWN.
      JMP DNDN       NEW DEVICE IS DOWN.
      JMP DNDNE      NEW DEVICE'S EQT IS DOWN.
****************************************************************
*     THE OLD DEVICE IS DOWN AND THE NEW DEVICE IS UP(OR BIT BUCKET)
**********************************************************************
DNUP  JSB DETOL     DETERMINE THE OLD-MAJOR-LU. 
      LDB ODML2,I   RESET WORD 2 OF I/O REQUESTS
      JSB FXWD2      TO THE SUBCHANNEL OF THE NEW DEVICE. 
* 
      LDA OEQT1 
      LDB ODML2,I   LINK OLD DEVICE'S I/O REQUESTS
      JSB $XXUP      ON THE NEW DEVICE. 
      STA NINTF 
* 
      JSB FOLDD     FIX ALL OLD DOWNED LU'S THAT NEED IT. 
      JMP LUP52 
******************************************************************
*     THE OLD DEVICE IS DOWN AND THE NEW DEVICE'S EQT IS DOWN.
********************************************************************* 
DNDNE JSB DETOL     DETERMINE OLD DEVICE'S MAJOR-LU 
      LDA OEQT1     LINK OLD DEVICE'S I/O REQUESTS ON THE 
      LDB ODML2,I    NEW DEVICE'S EQT.
      JSB $XXUP 
      STA NINTF 
* 
      JSB FOLDD     FIX OLD DOWNED DEVICE'S LU'S THAT NEED IT.
* 
      LDB EQT1      UNLINK ANY NORMAL USER
DNDE5 CLA            I/O FROM THE NEW DEVICE'S EQT. 
      JSB $UNLK 
      DEF P2
      JMP LUP50 
      SKP 
****************************************************************
*     THE OLD AND NEW DEVICES ARE DOWN. 
********************************************************************* 
DNDN  STB TTEMP     SAVE NEW DEVICE MAJOR-LU AND
      STA NDML2      ITS DRT WORD 2 ADDRESS.
      ADB M1        SAVE ITS
      ADB DRT        DRT WORD 
      STB NDML1       2 ADDRESS.
* 
      JSB DETOM     DETERMINE THE OLD DEVICE'S MAJOR-LU.
* 
      LDB TTEMP     CHECK IF NEW
      CMB,INB        NEW DEVICE'S MAJOR 
      ADB P1          LU IS < LU. 
      SSB,RSS       LU < NEW DEVICE'S MAJOR LU. 
      JMP DNDN5 
* 
DNDN9 LDB DRT2A     LU IS BELOW NEW DEVICE'S MAJOR LU.
      JSB CHASE     CHASE DOWN THE LU'S I/O 
      LDA NDML2,I    QUEUE TO ITS END AND 
      RAL,CLE,ERA     ADD THERE THE NEW DEVICE'S
      STA B,I          MAJOR-LU I/O QUEUE.
* 
      LDA OMJLU     IF OLD MAJOR LU EQUALS TO 
      CPA P1         LU, THEN FIX UP OLD DEVICE'S 
      RSS             LU'S TO INCLUDE THE NEW OLD-
      JMP DNDN6        MAJOR-LU.  OTHERWIZE, CONTINUE.
* 
      LDA OSBEQ     A=OLD SUBCHANNEL-EQT WORD.
      LDB DRT1A 
      INB           B=LU WORD 1 ADDRESS + 1.
      JSB FXOLD     GO FIX OLD DEVICE'S LU'S. 
* 
DNDN6 LDA P2        MODIFY ALL LU'S 
      STA SSBEQ      FOR NEW DEVICE 
      LDA P1          TO POINT TO 
      IOR MSIGN        LU.
      LDB NDML1 
      CLE 
      JSB SDRT2 
      JMP LUP50 
      SKP 
DNDN5 SZB,RSS       CASE WHERE OLD AND NEW DEVICES ARE
      JMP $XCQ       BOTH DOWN AND EQUAL. 
* 
      LDB NDML2     LU > NEW DEVICE MAJOR-LU. 
      JSB CHASE     CHASE DOWN THE NEW MAJOR-LU'S.
      CCA            I/O QUEUE TO ITS END.
* 
      ADA DRT       CALCULATE DRT 
      ADA OMJLU      WORD 2 OF
      STA ODML1       OLD MAJOR-LU. 
* 
      ADA LUMAX     LINK OLD MAJOR LU I/O 
      LDA A,I 
      RAL,CLE,ERA    QUEUE TO END OF NEW
      STA B,I         MAJOR I/O QUEUE.
* 
      LDA TTEMP     MAKE LU POINT TO
      IOR MSIGN      NEW DEVICE MAJOR-LU. 
      STA DRT2A,I 
* 
      LDA OMJLU     IF LU = OLD 
      CPA P1         MAJOR-LU,
      RSS             THEN CONTINUE,
      JMP LUP50        ELSE DONE. 
* 
      LDA OSBEQ     FIX OLD 
      LDB ODML1      DEVICE'S 
      INB             LU'S. 
      JSB FXOLD 
      SKP 
******************************************************************
*     FINISH SWITCHING LU 
******************************************************************* 
LUP50 LDA DRT1A,I   SET UP DRT
      AND B3700      WORD 1 WITH
      ADA P2       NEW DEVICE AND 
      STA DRT1A,I      OLD LOCK FLAG. 
* 
LUP52 LDA NINTF     CHECK IF AN I/O 
      SZA,RSS        OPERATION MUST BE
      JMP LUP55       INITIATED ON THE NEW EQT. 
      CPA $DMEQ     YES, IF THE NEW DEVICE IS THE BIT BUCKET, 
      JMP LUP80      THEN SET A FLAG FOR IOCX.
      JSB $DLAY     IF NOT,SET A TIMEOUT FOR INITIATION.
* 
LUP55 LDA .4        SCHEDULE ANY WAITERS ON 
      JSB $SCD3      DOWNED DEVICES.
      LDA OEQT1     SET UP THE OLD DEVICE'S 
      JSB $ETEQ      EQT ADDRESSES, CHECK BUFFER
      JSB $CKLO       LIMITS AND SCHED WAITERS. 
* 
      LDA P1     IF LU CHANGED WAS
      CPA .1         SYSTEM CONSOLE THEN
      JMP LUP70       ISSUE A MESSAGE.
      JMP $XCQ
* 
LUP70 LDA NSYSM     ISSUE '**' MESSAGE TO 
      JMP $MSEX        CONSOLE. 
* 
LUP80 ISZ $BITB     SET A FLAG FOR IOCX SO THAT 
      JMP LUP55      IT WILL CLEAN OUT THE BIT BUCKET.
* 
LUPR2 LDA $DMEQ     SET UP DUMMY
      JSB $ETEQ      EQT ADDRESES FOR 
      JMP LUPR1       THE BIT BUCKET. 
* 
LUP25 LDA $DMEQ 
      JMP LUP05 
* 
      SKP 
*     SPECIAL TEST TO DISALLOW SWTCHING AN LU TO A DISK IF THE
*       LU HAS I/O STACKED ON IT(OR IT'S EQT).
* 
LU100 LDA DRT2A,I   DOES THE LU 
      RAL,CLE,ERA    HAVE ANY I/O 
      SZA             HUNG ON IT? 
      JMP $INER      YES, ISSUE ERROR MESSAGE.
* 
      SEZ           IF NO I/O AND LU IS DOWN, 
      JMP LUPR1      THEN ALLOW SWTCH.
      LDA OEQT1,I   OTHERWIZE, IF UP AND NO I/O IS
      SZA,RSS        HUNG ON THE OLD EQT, THEN
      JMP LUPR1       ALLOW SWTCH.
* 
      JMP $INER      IF I-O HUNG ON OLD EQT,ISSUE ERROR MESS. 
* 
******************************************************************
*     DISPLAY LU AND IT'S STATUS
******************************************************************
* 
LUPR3 LDA P1     GET AND
      JSB $CNV3      SAVE THE 
      INA           THE LAST TWO WORDS
      DLD A,I                OF THE ASCII 
      ADA B1.4K      (ADD THE #)
      DST LUMSG+2              LU # IN MESSAGE
      LDA DRT1A,I   GET AND 
      AND B77        SAVE 
      JSB $CNV1       THE ASCII 
      STA LUMSG+6      EQT #. 
      LDA DRT1A,I   CHECK IF
      AND B174K      A SUBCHANNEL 
      CCE,SZA         IS SPECIFIED. 
      JMP LUP14 
      LDA DBLBK     IF SUBCHANNEL=0,
      STA LUMSG+7    THEN DO NOT DISPLAY
      JMP LUP15       THE SUBCHANNEL. 
* 
LUP14 LDB BLS       IF SUBCHANNEL#0,
      STB LUMSG+7    THEN DISPLAY 
      ALF,RAL         THE ASCII 
      JSB $CNV1        SUBCHANNEL.
LUP15 STA LUMSG+8 
      LDB DBLBK     CHECK IF
      LDA DRT2A,I    THE DEVICE 
      SSA             IS UP OR
      LDB EQBD         DOWN. IF 
      STB LUMSG+9       DOWN, 
      LDA LUMGA          PRINT A "D". 
      JMP $MSEX     RETURN. 
      SKP 
* 
*     VARIABLES, CONSTANTS AND BUFFERS FOR LUPR 
* 
NSYSM DEF *+1 
      DEC -2
      ASC 1,**
* 
LUMGA DEF *+1 
      DEC -20 
LUMSG ASC 10,LU  #MN1 = EXX SYY 
* 
B174K OCT 174000
B176K OCT 176000
B20K  OCT 20000 
B14K  OCT 14000 
B1.4K OCT 1400      HIGH BYTE = "#" 
B36K  OCT 36000 
B77   OCT 77
B3700 OCT 3700
C3700 OCT 174077
MSIGN OCT 100000
.1    DEC 1 
.4    DEC 4 
.15   DEC 15
M1    DEC -1
* 
DBLBK ASC 1,
BLS   ASC 1, S
* 
P1    NOP 
P2    NOP 
DRT1A NOP 
DRT2A NOP 
NINTF NOP 
TTEMP NOP 
OEQT1 NOP 
NEQT# NOP 
WORD2 NOP 
OSBEQ NOP 
OMJLU NOP           OLD DEVICE MAJOR LU.
ODML1 NOP           OLD DEVICE MAJOR-LU DRT WORD 1 ADDRESS. 
ODML2 NOP           OLD DEVICE MAJOR-LU DRT WORD 2 ADDRESS. 
NDML1 NOP           NEW DEVICE MAJOR-LU DRT WORD 1 ADDRESS. 
NDML2 NOP           NEW DEVICE MAJOR-LU DRT WORD 2 ADDRESS. 
      SKP 
***************************************************************** 
* 
*     SUBROUTINE CKNLU: 
* 
*     CKNLU DETERMINES IF THE DEVICE(LU) OR THE EQT POINTED TO BY 
*     THE SUBCHANNEL-EQT WORD IS UP OR DOWN.
* 
*     CALLING SEQUENCE: 
*          <P2>  := SUBCHANNEL IN BITS 11-15, EQT IN BITS 0-5.
*          <EQT5> :=ADDRESS OF FIFTH EQT WORD.
*          JSB CKNLU
* 
*     RETURN: 
*          (P+1) DEVICE IS DOWN.
*          (P+2) EQT IS DOWN. 
*          (P+3) DEVICE IS UP OR NO DEVICE FOUND. 
*          ALL REGISTERS ARE VIOLATED.
*               AT (P+1): <B>:=MAJOR LU # OF DOWNED DEVICE. 
*                         <A>:=MAJOR LU DRT WORD 2 ADDRESS. 
*          USES SDRT2 AS A TEMPORARY. 
* 
****************************************************************
* 
CKNLU NOP 
      LDA EQT5,I    CHECK IF
      RAL,SLA        THE EQT
      JMP CKNL0       IS UP OR
      SSB              DOWN.
      JMP CKNL2     THE EQT IS DOWN.
* 
CKNL0 LDB LUMAX 
      CMB,INB 
      STB SDRT2 
      LDB DRT 
CKNL1 LDA B,I       DETERMINE 
      AND C3700      IF THE 
      CPA P2       NEW
      JMP CKNL7        DEVICE 
      INB               EXISTS. 
      ISZ SDRT2 
      JMP CKNL1 
      JMP CKNL9      THE DEVICE DOES NOT EXIST. 
* 
CKNL7 ADB LUMAX     DETERMINE IF THE DEVICE 
      LDA B,I        IS UP OR DOWN. 
      SSA 
      JMP CKNL8 
CKNL9 ISZ CKNLU     THE DEVICE IS UP, RETURN TO P+3.
CKNL2 ISZ CKNLU     THE EQT IS DOWN, RETURN TO P+2. 
      JMP CKNLU,I   RETURN. 
* 
CKNL8 STB A         THE DEVICE IS DOWN. 
      LDB LUMAX     SET <A>=DRT WORD 2 ADDRESS. 
      ADB SDRT2     SET <B>=LU #. 
      INB 
      JMP CKNLU,I   RETURN TO P+1.
      SKP 
****************************************************************
*     SUBROUTINE SDRT2: 
* 
*     SDRT2 WILL STORE THE A REG IN DRT WORD 2 FOR ANY DRT ENTRIES
*     WHICH CORRESPOND TO THE SUBCHANNEL AND EQT GIVEN IN P2.  IF 
*     ON ENTRY E=1, THEN SDRT2 WILL SCAN ONLY TO THE FIRST ENTRY
*     CORRESPONDING TO P2.  IF E=0, THEN SDRT2 WILL SCAN THE ENTIRE 
*     DRT FROM THE GIVEN ENTRY TO ITS END.
* 
*     CALLING SEQUENCE: 
*          <SSBEQ>:=SUBCHANNEL-EQT WORD FOR THE LU'S TO SCAN FOR: 
*               BITS 5-0=EQT
*               BITS 15-11=SUBCHANNEL 
*          <B>:=DRT WORD 1 ADDRESS FROM WHICH TO BEGIN SCAN.
*          <A>:=CONTENTS TO STORE INTO DRT WORD 2.
*          <E>:=0  SCAN TO END OF DRT.
*             :=1  SCAN ONLY FOR FIRST ENTRY. 
*          JSB SDRT2
*               USES TEMPORARY LOCATIONS CKNLU,SDRT8,SDRT9
*     RETURN: 
*          NO REGISTERS ARE SAVED ON EXIT.
*          ON EXIT: 
*               <SDRT8>:=NEXT DRT WORD 1 ADDRESS TO BE SCANNED. 
*               <A>    := LUMAX - LAST LU# SCANNED. 
***************************************************************** 
* 
SDRT2 NOP 
      STA CKNLU     SAVE CONTENTS TO STORE INTO DRT WORD 2. 
      LDA LUMAX     SET 
      ADA DRT 
      CMA,INA        UP 
      ADA B 
      STA SDRT9       COUNTER.
      STB SDRT8     SAVE ADDRESS OF FIRST DRT ENTRY TO SCAN.
      SZA,RSS 
      JMP SDRT2,I 
* 
SDR29 LDA SDRT8,I    SET CONTENTS 
      AND C3700      OF DRT WORD 2
      CPA SSBEQ       AND COMPARE TO
      JMP SDR22        SUBCHANNEL-EQT WORD. 
SDR25 ISZ SDRT8      INCREMENT DRT ADDRESS. 
      ISZ SDRT9      INCREMENT COUNT. 
      JMP SDR29 
      CLA 
      JMP SDRT2,I   NO MORE ENTRIES, SO RETURN. 
* 
SDR22 LDB CKNLU     FOUND AN ENTRY, 
      LDA SDRT8      POSITION TO
      ADA LUMAX       WORD 2 AND
      STB A,I          STORE NEW CONTENTS.
      SEZ,RSS       IF E=1, 
      JMP SDR25      THEN CONTINUE SCAN.
      ISZ SDRT8      OTHERWIZE, INCREMENT DRT 
      LDA SDRT9       ADDRESSES AND RETURN. 
      INA 
      JMP SDRT2,I 
* 
SDRT8 NOP 
SDRT9 NOP 
SSBEQ NOP 
* 
********************************************************************* 
* 
*     SUBROUTINE CHASE: 
* 
*     CHASE WILL FIND THE END OF AN I/O QUEUE GIVEN IT'S HEAD.
* 
*     CALLING SEQUENCE: 
*          <B>:=ADDRESS OF HEAD OF I/O QUEUE. 
*          JSB CHASE
* 
*     RETURN: 
*          ALL REGISTERS ARE MODIFIED.
*          <B>:=ADDRESS OF LINK WORD OF LAST I/O REQUEST. 
*          <A>:=0 
* 
********************************************************************
* 
CHASE NOP           CHASE 
CHAS1 LDA B,I        DOWN 
      RAL,CLE,ERA     THE LU'S
      SZA,RSS          I/O QUEUE
      JMP CHASE,I       TO ITS
      LDB A              END. 
      JMP CHAS1 
      SKP 
* 
***************************************************************** 
* 
*     SUBROUTINE FXWD2: 
* 
*     FXWD2 CHANGES THE SUBCHANNEL IN WORD 2 OF EACH I/O REQUEST
*     IN THE GIVEN I/O QUEUE. 
* 
*     CALLING SEQUENCE: 
*          <WORD2>:=NEW SUBCHANNEL:  BITS 2-5=LOWER 4 BITS
*                                    BIT 13  =UPPER BIT.
*          <B>:=POINTER TO FIRST I-O REQUEST  =0 IF NO REQUESTS.
*          JSB FXWD2
* 
*     RETURN: 
*          ALL REGISTERS ARE VIOLATED.
* 
******************************************************************
* 
FXWD2 NOP 
      RBL,CLE,ERB STRIP POSSIBLE SIGN BIT.
FWD21 SZB,RSS       IF END OF I/O QUEUE,
      JMP FXWD2,I    THEN EXIT. 
      STB SDRT2 
      INB           POSITION TO I/O 
      LDA B,I        CONTROL WORD.
      AND WD2SB     STRIP OFF OLD SUBCHANNEL
      IOR WORD2      AND ADD IN NEW SUBCHANNEL. 
      STA B,I 
      LDB SDRT2,I   FIX NEXT I/O REQUEST. 
      JMP FWD21 
* 
WD2SB OCT 157703
      SKP 
* 
****************************************************************
* 
*     SUBROUTINE DETOL
* 
*     DETOL DETERMINES WHAT THE OLD DEVICE'S MAJOR-LU IS AND SETS 
*          UP LOCATIONS OMJLU, ODML1 AND ODML2. 
* 
*     CALLING SEQUENCE: 
*          JSB DETOL
* 
*     RETURN: 
*          ALL REGISTERS ARE MODIFIED.
*          <OMJLU>:=OLD DEVICE'S MAJOR-LU.
*          <ODML1>:=OLD DEVICE'S MAJOR-LU DRT WORD 1 ADDRESS. 
*          <ODML2>:=OLD DEVICE'S MAJOR-LU DRT WORD 2 ADDRESS. 
****************************************************************
* 
DETOL NOP 
      JSB DETOM     DETERMINE THE OLD MAJOR-LU. 
      ADA M1        COMPUTE THE 
      ADA DRT        OLD DEVICE'S 
      STA ODML1       MAJOR-LU'S
      ADA LUMAX        DRT WORD 1 
      STA ODML2         AND 2 ADDRESSES.
      JMP DETOL,I   RETURN. 
* 
* 
************************************************************************
* 
*     SUBROUTINE DETOM: 
* 
*     DETOM RETURNS THE OLD DEVICE'S MAJOR-LU.
* 
*     CALLING SEQUENCE: 
*          JSB DETOM
* 
*     RETURN: 
*          <OMJLU>:=OLD DEVICE'S MAJOR-LU.
* 
*********************************************************************** 
* 
DETOM NOP 
      LDA DRT2A,I   DETERMINE IF LU IS
      RAL,CLE,ERA    THE OLD MAJOR-LU.
      CLE,SZA,RSS   IF NO QUEUE, THEN LU
      CCE            IS THE OLD MAJOR-LU. 
      STA B         IF QUEUE ELEMENT IS < 2000, 
      ADB B176K      THEN QUEUE ELEMENT IS
      SEZ             OLD MAJOR-LU. 
      LDA P1        IF 2000 >= QUEUE ELEMENT, THEN ELEMENT
      STA OMJLU      IS ADDRESS AND LU IS OLD MAJOR-LU. 
      JMP DETOM,I   RETURN. 
      SKP 
* 
***************************************************************** 
* 
*     SUBROUTINE FOLDD: 
* 
*     FOLDD WILL FIX THE DRT WORD 2'S OF THE OLD DEVICE'S LU'S. 
* 
*     CALLING SEQUENCE: 
*          <OMJLU>:=THE OLD DEVICE'S MAJOR-LU.
*          <ODML1>:=THE OLD DEVICE'S MAJOR-LU DRT WORD 1 ADDRESS. 
*          JSB FOLDD
* 
*     RETURN: 
*          ALL REGISTERS ARE MODIFIED.
***************************************************************** 
* 
FOLDD NOP 
      LDA DRT1A,I   SET UP DRT WORD 1 
      AND B3700      OF LU WITH THE NEW 
      ADA P2          DEVICE AND OLD
      STA DRT1A,I      LOCK FLAG. 
* 
      CLA           SET DRT WORD 2 OF 
      STA DRT2A,I    LU TO UP STATE.
* 
      LDA OMJLU     IF LU=OLD DEVICE MAJOR-LU 
      CPA P1         THEN FIX LU'S FOR THE
      RSS             OLD DEVICE. 
      JMP FOLDD,I   OTHERWIZE, RETURN.
      LDA OSBEQ      OLD MAJOR LU.
      LDB ODML1 
      INB 
      JSB FXOLD     FIX LU'S FOR THE OLD DEVICE.
      JMP FOLDD,I   RETURN. 
      SKP 
* 
***************************************************************** 
* 
*      SUBROUTINE FXOLD:
* 
*      FXOLD WILL CREATE A NEW MAJOR-LU FOR THE OLD DEVICE, POINT 
*      ANY OTHER LU'S FOR THIS DEVICE TO THE MAJOR-LU, AND SET ALL
*      THESE LU'S DOWN. 
* 
*      CALLING SEQUENCE:
*           <A>:=SUBCHANNEL-EQT WORD OF THE LU TO SCAN FOR. 
*           <B>:=DRT WORD 1 ADDRESS TO BEGIN SCAN.
*           JSB FXOLD 
*           CALLS SUBROUTINE SDRT2
* 
*      REUTRN:
*           NO REGISTERS ARE SAVED. 
* 
***************************************************************** 
* 
FXOLD NOP 
      STA SSBEQ 
      LDA MSIGN     CREATE A NEW
      CCE            OLD-MAJOR- 
      JSB SDRT2       LU. 
      SZA,RSS       IF A=0, THEN NO OTHER 
      JMP FXOLD,I    LU'S ON OLD DEVICE.
* 
      ADA LUMAX     OTHERWIZE, POINT
      IOR MSIGN      ALL OTHER LU'S 
      LDB SDRT8       FOR OLD DEVICE
      CLE              TO THE NEW 
      JSB SDRT2         OLD-MAJOR-LU. 
      JMP FXOLD,I   RETURN. 
      SKP 
* 
****************************************************************
* 
*  ' DEVICE TIME-OUT PARAMETER ' STATEMENT
* 
* FORMAT:   TO,P1,P2  WHERE 
* 
*            P1 = EQT # 
*            P2 = TIME-OUT PARAMETER OR -1
* 
* ACTION:   IF P2 = -1, A SECOND PARAMETER WAS NOT
*            RECEIVED FROM THE MESSAGE PROCESSOR; 
*            THEREFORE, PRINT THE CURRENT TIME-OUT
*            PARAMETER OF DEVICE P1.
* 
*           BOTH P1 AND P2 PRESENT, ASSIGN P2 AS THE
*            NEW TIME-OUT PARAMETER FOR DEVICE P1.
* 
***************************************************************** 
* 
$CHTO STA P1
      STB P2
      JSB IODNS       CHECK VALIDITY OF EQT # 
      LDB P2         LOOK AT P2 
      SZB,RSS        IF N2 ZERO, DISABLE
      JMP CHTO2       TIME-OUT FOR DEVICE 
* 
      INB,SZB        IF N2 = -1, OUTPUT T-O PARAMETER 
      JMP CHTO1      OTHERWISE, ENTER NEW T-O VALUE 
* 
      LDA EQT14,I    CONVERT T-O PARAMETER
      CCE,SZA         TO DECIMAL ASCII
B3000 CMA 
      JSB $CNV3 
      LDB A,I       GET THE HIGH WORD 
      ADB B164C     ADD '=' - 'BLANK' 
      STB TOMS+3
      CCE,INA 
      DLD A,I         STORE IN MESSAGE
      DST TOMS+4
* 
      LDA P1         CONVERT EQT #
      JSB $CNV1       TO DECIMAL ASCII
      STA TOMS+2     STORE INTO MESSAGE 
      LDA TOMSA 
      JMP $MSEX      RETURN.
      SKP 
CHTO1 CMB,INB        ERROR IF ATTEMPT 
      LDA EQT5,I      TO SET TYPE 0 OR 5
      AND B374C       DEVICE TIME-OUT 
      SZA             VALUE TO LESS THAN
      CPA B2400       FIVE SECONDS. 
      RSS 
      JMP CHTO2      OTHERWISE, STORE 
* 
      LDA .500        NEW TIME-OUT
      ADA B           VALUE.
      SSA,RSS 
      JMP $INER 
* 
CHTO2 STB EQT14,I 
      JMP $XCQ        RETURN WITHOUT MESSAGE. 
* 
TOMSA DEF *+1 
      DEC -12 
TOMS  ASC 2,TO# 
      NOP 
      ASC 1, =
      NOP 
      NOP 
* 
.500  DEC 500 
B164C OCT 16400 
B2400 OCT 2400
B374C OCT 37400 
      SKP 
IODNS NOP 
      STA B         IF
      CMB,INB,SZB    EQT
      SSA             NUMBER
      CCB,RSS          IS ZERO
      ADB EQT#
      SSB                THEN TAKEE,
      JMP $INER           ERROR EXIT. 
      JSB $CVEQ      OTHERWIZE, SET EQT ENTRY ADDRESSES.
      JMP IODNS,I    RETURN.
* 
      HED ** SYSTEM BASE PAGE COMMUNICATION AREA ** 
.     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) 
* 
* I/O MODULE/DRIVER COMMUNICATION 
* 
EQT1  EQU .+8      ADDRESSES
EQT4  EQU .+11
EQT5  EQU .+12      CURRENT 
EQT14 EQU .+83
* 
SYSTY EQU .+21     EQT ENTRY ADDRESS OF SYSTEM TTY
* 
      ORG *         LENGTH OF SYSTEM COMMAND MODULE.
      END $EQST 
                                                                                                                                                                                        