ASMB,L,C
      HED RTE-II  SYSTEM COMMAND MODULE 
* 
*     NAME:  $$CMD
*     SOURCE: 92001-18029 
*     RELOC:  92001-16029 
*     PGMR:   D.L.S.
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
*  ***************************************************************
* 
      NAM $$CMD,2,1 92001-16029 REV.1710 770216 
      ENT $$CMD 
      EXT EXEC,$LIBR,$LIBX,RMPAR,$CVEQ,$CVT1
      EXT $CVT3,$UNLK,$XXUP,$DLAY,$DMEQ,$SCD3,$ETEQ 
      EXT $CKLO,$BITB 
      SUP 
* 
***************************************************************** 
* 
*     RTE SYSTEM PROGRAM $$CMD: 
* 
*     $$CMD 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.
* 
*     THIS PROGRAM IS SCHEDULED FROM THE SYSTEM MESSAGE PROCESSOR OR
*     FROM THE SYSTEM LIBRARY ROUTINE *MESSS*.
* 
*     BEFORE SCHEDULING, THE SCHEDULER MUST PLACE IN THE PROGRAM'S
*     FIVE WORD TEMPORARY SECTION OF $$CMD'S ID SEGMENT THE FOLLOWING 
*     FIVE PARAMETERS.
* 
*          <PRAM1>:=2 CHARACTER ASCII COMMAND.
*          <PRAM2>:=P1
*          <PRAM3>:=P2
*          <PRAM4>:=P3
*          <PRAM5>:=FLAG AS TO WHAT TO DO WITH MESSAGES.
*                    0 = PRINT MESSAGES ON LU 1(CAME FROM SYSTEM) 
*                    NONZERO = RETURN MESS.TO USER(CAME FROM *MESSS*) 
* 
******************************************************************* 
* 
      SKP 
CMD   NOP 
P1    NOP 
P2    NOP 
P3    NOP 
CONLU NOP 
* 
$$CMD NOP 
      JSB RMPAR     GET THE PROGRAM'S 
      DEF *+2        PARAMETERS.
      DEF CMD 
* 
      JSB $LIBR 
      NOP 
* 
      CLA           SET PRIORITY OF $$CMD 
      STA XPRIO,I    TO ZERO(HIGHEST).
      LDA OPCDA 
      STA TEMP1     SET UP COMMAND POINTER. 
      LDA OPCDJ 
      STA TEMP2      SSET UP COMMAND SUBROUTINE POINTER.
      LDB CMD 
      STB STOP      SET UP ILLEGAL COMMAND STOP.
* 
M0030 CPB TEMP1,I   GO SCAN 
      JMP M0040      FOR THE
      ISZ TEMP1       COMMAND 
      ISZ TEMP2        PROCESSOR
      JMP M0030         SUBROUTINE. 
* 
OPCDA DEF *+1 
      ASC 3,LUEQTO
STOP  NOP 
OPCDJ DEF *+1,I 
      DEF LUPR
      DEF EQ.ST 
      DEF CH.TO 
      DEF OPER
      SKP 
* 
* 
M0040 JSB TEMP2,I   GO PROCESS COMMAND. 
* 
      JSB $LIBX     GO UNPRIVILEGED.
      DEF *+1 
      DEF *+1 
* 
      SZA,RSS       IF NO MESSAGE,
      JMP LL9        THEN END PROGRAM.
* 
      STA IBUFL     IF MESSAGE, 
      STA BUFL       THEN 
      INA             SAVE
      STA IBUFA        MESSAGE
      STA BUFA          POINTERS. 
* 
      LDB CONLU     CHECK IF TERMINAL 
      SZB            IS THE SYSTEM
      JMP LL8         CONSOLE.
* 
      JSB EXEC      IF TERMINAL IS SYSTEM CONSOLE,
      DEF *+5        THEN SEND MESSAGES TO LU 1.
      DEF .2
      DEF .1
IBUFA NOP 
IBUFL NOP 
      JMP LL9 
* 
LL8   JSB EXEC      IF TERMINAL IS NOT SYSTEM CONSOLE,
      DEF *+5        THEN RETURN MESSAGE TO USER. 
      DEF .14 
      DEF .2
BUFA  NOP 
BUFL  NOP 
* 
LL9   JSB EXEC      RETURN TO CALLER
      DEF *+4        OR TO SYSTEM.
      DEF .6
      DEF ZERO
      DEF .1
      JMP $$CMD 
* 
ZERO  NOP 
      SKP 
* 
EQ.ST NOP 
      LDA P1
      JSB IODNS     CHECK P2 AND SET EQT ADDRESSES. 
      JMP EQER
      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 $CVT1    OUTPUT THE EQT STATUS. 
      STA EQMS1    CONVERT THE CHANNEL NUMBER.
* 
      LDA EQT4,I   CONVERT
      ASR 6           UNIT #. 
      AND B37 
      JSB $CVT1 
      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 $CVT1     FOOL LEADING BLANK GENERATOR) 
      STA EQMS2      DVRNN. 
      LDA EQMSA    (A) = ADDRESS OF REPLY 
      JMP EQ.ST,I  RETURN.
* 
EQST1 ERB             ROTATE BIT 1 TO E 
      RAL,RAL         AND PUT IN
      ERA,RAR         14 OF EQT4
      STA EQT4,I    AND RESTORE 
      CLA           <A>=0 NO RETURN MESSAGE 
      JMP EQ.ST,I 
* 
EQER  LDA $ERIN      'INPUT ERROR'
      JMP EQ.ST,I    RETURN.
* 
EQMSA DEF *+1 
      DEC -20 
      ASC 1,
EQMS1 NOP            I/O CHANNEL #
EQBD  ASC 2, DVR
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 
.6    DEC 6 
.14   DEC 14
B37   OCT 37
* 
TEMP1 NOP 
TEMP2 NOP 
      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  NOP 
      LDA P1        SET A=LU. 
      LDB P2        IF P2 = -1, THEN GO 
      CPB M1         PRINT CURRENT ASSIGNMENT.
      JMP LUPR0 
* 
      LDA B 
      AND B377      SAVE LOWER 8 BITS 
      STA P2         OF P2 AS EQT 
      LDA P3          ADD IN LOWER
      AND B37          5 BITS OF P3 
      LSL 11            AC SUBCHANNEL 
      ADA P2             AND SAVE AS NEW
      STA P2              SUBCHANNEL-EQT WORD.
* 
      LDA P1
      CPA .2        PREVENT 
      JMP LUER       REASSIGNMENT 
      CPA .3          OF LU 2 
      JMP LUER         OR LU 3. 
* 
LUPR0 CMA,CLE,INA,SZA,RSS  ILLEGAL LU NUMBER
      JMP LUER         IF THE LU IS LESS
      ADA LUMAX         THEN 1 OR GREATER 
      CCA,SEZ,RSS        THEN LUMAX.
      JMP LUER
* 
      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 LUER            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. 
      JMP LUER
* 
*     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 LUER            CONSOLE.
      LDA WORD2 
      SZA 
      JMP LUER
* 
UPLU2 LDA TTEMP     MAKE SURE NEW DEVICE'S
      SZA            EQT IS NOT DOWN. 
      JMP LUER
      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 LUER        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 LUER        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.
* 
                                                                                                                                                                                                                          