ASMB,R
* 
*     NAME:   LA..
*     SOURCE: 92070-18102 
*     RELOC:  92070-1X102 
*     PGMR:   C.H.W.
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  ALL RIGHTS      * 
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       * 
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * 
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.        * 
*  **************************************************************** 
* 
* 
      NAM LA..,7  92070-1X102  REV.1941  790926 
* 
* 
* 
*  ACTION SUBROUTINE TO EXECUTE THE "LA" OPERATOR COMMAND 
* 
*    COMMAND SYNTAX:
*        LA,LU(,DVT(,S.C.)) 
* 
* 
      ENT LA..
* 
      EXT EXEC,$LIBR,$LIBX,$SCHD,CAM.O,CNOPT
      EXT $LUTA,$LUT#,$DVTA,$DVT#,$IFTA,$IFT# 
      EXT $DIOC,$INIO,$DVLU,$DV2,$DV6,$DV8
* 
* 
LA..  NOP 
      LDA LA..
      INA 
      LDB 0,I 
      STB NUMBA     SAVE ADDR OF # PRAMS
      INA           2ND PARAMETER IS THE PARSE BUFFER ADDR
      LDB 0,I       GET IT
      INA 
      LDA 0,I 
      STA ERRTN     SAVE ADDR OF ERROR PARAM
      LDA LA..,I
      STA LA..      SAVE RETURN ADDR
* 
*  PROCESS LU PARAMETER 
      INB           1ST PARAM IS LU 
      LDA 1,I       GET IT
      STA M.LU
      CMA,INA       A=-LU 
      SSA,RSS       WAS LU < 1? 
      JMP ER56       YES, ERROR 
      ADA $LUT#     ADD TOTAL # OF LU'S 
      SSA           OK? 
      JMP ER56       NO, LU OUT OF RANGE
      CCA 
      ADA M.LU      GET LU AGAIN
      ADA $LUTA     ADD ADDRESS OF LUT
      STA LUTAD     SAVE ADDR OF LU ENTRY 
      LDA NUMBA,I   GET # OF PARAMS ENTERED 
      CPA .1        DISPLAY LU? 
      JMP LD.00      YES
      LDA LUTAD,I   GET LUT CONTENTS
      SZA           BIT BUCKET? 
      JSB CKDSK      NO, ENSURE IT'S NOT A DISC 
* 
*  PROCESS DVT PARAMETER
      ADB .4        ADDR OF DVT # 
      LDA 1,I       GET IT
      SSA 
      JMP ER56      ERROR IF DVT # NEGATIVE 
      CMA,INA,SZA,RSS NEGATE DVT #
      JMP LA.45     ASSIGN LU TO BIT BUCKET 
      STA TEMP      USE TO COUNT DVT'S
      ADA $DVT#     ADD # OF DVT'S IN SYSTEM
      SSA 
      JMP ER56      ERROR, DVT # TOO LARGE
      ADB .4        ADDR OF PRAM 3
      STB M.SC
      LDB $DVTA     ADDR OF 1ST DVT 
      RSS 
* 
LA.05 JSB NXDVT     GET ADDR OF NEXT DVT
      ISZ TEMP      IS THIS THE ONE?
      JMP LA.05      NO, ITERATE
* 
      STB DVTAD     SAVE DVT'S ADDRESS
      LDA 1 
      JSB CKDSK     ENSURE NOT SWITCH TO A DISK 
      LDA NUMBA,I   GET # OF PARAMS 
      CPA .2        JUST LU SWITCH? 
      JMP LA.50      YES
      HED      ******* DVT SWITCHING TO NEW IFT ******* 
      ADB .4        ADDR OF DVT5
      STB DVT5      SAVE IT 
      CPA .3        DVT SWITCH? 
      INB,RSS        YES
      JMP ER56       NO, CALLING ERROR
      JSB $LIBR     GO PRIVILEGED 
      NOP 
      LDA 1,I       GET DVT6 "AV" 
      SSA           IS DEVICE BUSY? 
      JMP ER37       YES, CAN'T SWITCH NOW
* 
*  PROCESS SELECT CODE PARAMETER
      LDA $IFT#     NUMBER OF IFT'S IN SYSTEM 
      CMA,INA       NEGATE
      STA TEMP      SAVE COUNTER
      LDB $IFTA     ADDR OF 1ST IFT 
*  FIND IFT WITH SPECIFIED SELECT CODE
LA.10 STB IFTAD     SAVE ADDR OF IFT
      ADB .5        ADDR OF THIS IFT'S WORD 6 
      LDA 1,I       GET IFT6
      AND B77       ISOLATE SELECT CODE 
      CPA M.SC,I    DOES IT MATCH PARAM #4? 
      JMP LA.15     YES 
*  FIGURE OUT STARTING ADDR OF NEXT IFT 
      INB 
      LDA 1,I       GET IFT7
      AND B777      ISOLATE EXT LENGTH
      INA 
      ADB 0         B NOW HAS NEXT IFT'S ADDR 
      ISZ TEMP      HAVE ALL IFT'S BEEN EXAMINED? 
      JMP LA.10      NO, ITERATE
      LDA .56        YES, SELECT CODE IN ERROR
      JMP ERPRV 
*  IFT FOUND,  ENSURE IT'S SAME INTERFACE TYPE ELSE ERROR 35
LA.15 LDA 1,I       GET "ITYPE" 
      LDB DVT5,I    GET ORIGINAL IFT ADDR 
      ELB,CLE,ERB   CLEAR SIGN
      ADB .5        POINT TO ITS "ITYPE"
      XOR 1,I       COMPARE THE TWO 
      AND TYFLD     ISOLATE BITS 13-8 
      SZA           DOES ITYPE MATCH? 
      JMP ER35       NO, GIVE ERROR 
* 
*  UNLINK DVT FROM IT'S OLD CIRCULAR DVT LIST 
      CCB 
      ADB DVT5      POINT TO DVT4 
      STB TEMP
LA.20 LDA 1,I       GET NEXT DVT ADDR IN LIST 
      RAL,CLE,ERA   CLEAR SIGN
      CPA DVTAD     IS IT THE REMOVED DVT?
      JMP LA.25      YES
      ADA .3
      LDB 0 
      JMP LA.20     LOOP
LA.25 LDA TEMP,I    GET LINK FROM REMOVED DVT 
      RAL,ERA       RESTORE SIGN BIT
      STA 1,I       SET UPDATED LINK WORD IN PREV. DVT
* 
*  UPDATE IFT'S DVT REFERENCE IF IT POINTS TO REMOVED DVT 
* 
      LDB DVT5,I    GET IFT ADDRESS 
      ELB,CLE,ERB   CLEAR SIGN
      ADB .4        POINT TO IFT5 
      LDA 1,I       GET DVT REFERENCE IN IFT
      CPA DVTAD     IS IT THE REMOVED DVT?
      RSS            YES
      JMP LA.30      NO, IGNORE 
      LDA TEMP,I    ADDR OF NEXT DVT IN OLD DVT LIST
      ELA,CLE,ERA   STRIP SIGN
      CPA DVTAD     THIS DVT ONLY ONE ON LIST?
      CLA            YES, THEN ZERO THE DVT REFERENCE 
      STA 1,I       STORE NEW DVT REFERENCE IN IFT5 
      SKP 
* 
*  NOW QUEUE THE DVT ON ITS NEW INTERFACE'S DVT LIST
* 
LA.30 LDA DVT5,I    GET IFT REFERENCE 
      ELA           SAVE "P"-BIT
      LDA IFTAD 
      RAL,ERA       MOVE "P" INTO NEW IFT ADDR WD 
      STA DVT5,I    UPDATE THE IFT REFERENCE
      LDB IFTAD     NEW IFT'S ADDR
      ADB .4        IFT5 ADDR 
      LDA 1,I       GET IFT'S DVT REF 
      SZA,RSS       ANY DVT REFERENCED? 
      JMP LA.40      NO 
      ADA .3        POINT TO IT'S CIRCULAR LIST 
      LDB 0,I       GET IT
      RBL,CLE,ERB   SAVE/CLEAR SIGN 
      STB TEMP      SAVE ADDR OF NEXT DVT 
      LDB DVTAD 
      RBL,ERB       RESTORE SIGN
      STB 0,I        & LET DVT REFERENCE THE NEW ONE
LA.35 CCB 
      ADB DVT5      DVT4 OF REQUEUED DVT
      LDA 1,I 
      ELA           SAVE SIGN OF REQUEUED DVT4
      LDA TEMP      REFERENCE TO NEXT DVT ON NEW LIST 
      RAL,ERA       RESTORE SIGN
      STA 1,I        & UPDATE LINK IN REQUEUE'D DVT4 WORD 
*  THE DVT IS NOW REQUEUED ON IT'S NEW IFT
      JMP LA.60 
* 
LA.40 LDA DVTAD     THE REQUEUED DVT IS ONLY ONE ON 
      STA 1,I        THE INTERFACE, SO IFT5 POINTS TO IT
      STA TEMP      SET POINTER TO LINK DVT4 TO SELF
      JMP LA.35 
      HED      ******* LU SWITCHING TO NEW DVT *******
*  HERE FOR ASSIGNMENT OF LU TO BIT BUCKET
LA.45 LDA NUMBA,I   GET # OF PARAMS 
      CPA .2        EXACTLY 2?
      CLA,RSS        YES, SWITCH TO BIT BUCKET OK 
      JMP ER56       NO, HE DOESN'T KNOW WHAT HE'S DOING
      STA DVTAD     PUT A ZERO IN LUT TABLE ENTRY 
      SPC 3 
* 
*  ENTER HERE FOR LU SWITCH 
* 
LA.50 JSB $LIBR     GO PRIVILEGED 
      NOP 
* 
LA.60 LDB LUTAD,I   GET OLD ASSIGNMENT
      LDA DVTAD 
      STA LUTAD,I   SET LU TABLE TO REFLECT NEW DVT 
      SZB,RSS       BIT BUCKET? 
      JMP LA.90      YES, DONT WORRY ABOUT LOCK OR WAITERS
*  SEE IF OLD DVT WAS LOCKED
      STB TEMP      SAVE OLD DVT ADDRESS
      ADB .6        POINT TO DVT 7
      LDA 1,I 
      AND LUMSK     ISOLATE LOCK FLAG 
      SZA,RSS       IS PREVIOUS DVT LOCKED? 
      JMP LA.75      NO 
*  CLEAR OLD DVT'S LOCK FLAG
      STA NUMBA     SAVE LOCK FLAG
      XOR 1,I       CLEAR FLAG BITS IN DVT7 
      STA 1,I        & UPDATE DVT 
      LDB DVTAD     GET NEW DVT ASSIGNMENT
      SZB,RSS       BIT BUCKET? 
      JMP LA.70      YES, FORGET ABOUT LOCK FLAG
*  MOVE LOCK FLAG TO NEW DVT UNLESS IT IS ALREADY LOCKED
      ADB .6        POINT TO DVT 7 OF NEW ASSIGNMENT
      LDA 1,I 
      AND LUMSK     ISOLATE ITS LOCK FLAG 
      SZA           ALREADY LOCKED? 
      JMP LA.70      YES! TOUGH LUCK FOR SWITCHED LOCKER
      LDA 1,I        NO, MOVE LOCK
      IOR NUMBA       FLAG FROM PREVIOUS TO NEWLY 
      STA 1,I          ASSIGNED DVT 
* 
LA.70 LDA TEMP      PREVIOUS DVT ADDR 
      JSB $SCHD     IN CASE MORE THAN 1 LU ON OLD DVT,
      OCT 50         RESCHEDULE LOCK WAITERS
* 
LA.75 LDA TEMP      PREVIOUS DVT ADDR 
      JSB $SCHD     RESCHEDULE ANY WAITERS ON DOWN LIST 
      OCT 54         FOR OLD DVT
      LDA TEMP      GET OLD DVT AGAIN 
      JSB $SCHD     RESCHEDULE ANY WAITERS FOR BUFFER LIMITS
      OCT 55         FOR OLD DVT
      SKP 
* 
*  NOW MOVE ANY NON-ACTIVE QUEUED REQUESTS TO THE NEW DVT UNLESS
*  THE OLD DVT IS REFERENCED BY ANOTHER LU.  UPDATE BUFFER
*  ACCUMULATORS FOR MOVED CLASS & BUFFERED I/O BLOCKS.  IF
*  ANY REQUESTS ARE MOVED AND THE NEW DVT IS NOT ACTIVE, THE
*  I/O SYSTEM IS CALLED TO INITIATE THE HEAD OF THE DVT 
*  INITIATION LIST. 
      LDB TEMP
      JSB $DVLU     FIND ANY LU REFERENCING OLD DVT 
      SZA           ANY LU? 
      JMP LA.90      YES, LEAVE INIT. LIST ALONE
      ADB .5        POINT TO DVT6 
      LDA 1,I       GET "AV"
      ADB .2
      STB NUMBA     SAVE ADDR OF OLD DVT BUF ACCUMULATOR
      ADB N6        POINT TO DVT2 
      SSA           IS OLD DEVICE BUSY? 
      LDB 1,I        YES, SKIP HEAD OF INIT LIST
*  B NOW HAS ADDRESS OF POINTER TO 1ST ENTRY TO BE MOVED
      ELB,CLE,ERB   CLEAR SIGN
      LDA 1,I       GET ADDR OF 1ST TO MOVE 
      RAL,CLE,ERA   CLEAR/SAVE SIGN BIT 
      STA TEMP1 
      CLA 
      ERA           MAINTAIN SIGN BIT 
      STA 1,I       STORE 0 TO MARK END OF LIST 
*  FIND END OF NEW DVTS CURRENT INITIATION LIST 
      LDB DVTAD     ADDR OF NEW DVT 
      CLA,INA 
      JSB $DIOC     SET DVT LINKS 
      LDA $DV2      POINT TO DVT2 
LA.82 LDB 0         GET ADDR OF NEXT
      LDA 1,I       GET LINK TO NEXT
      RAL,CLE,ERA   CLEAR/SAVE SIGN 
      SZA           END OF INITIATION LIST? 
      JMP LA.82      NO, KEEP GOING 
*  LINK MOVED REQUESTS AT END OF THE NEW DVT'S LIST 
      LDA TEMP1     GET ADDR OF HEAD OF CHAIN TO MOVE 
      RAL,ERA       MAINTAIN SIGN 
      STA 1,I       ADD CHAIN TO NEW INIT LIST
*  RECOMPUTE OLD & NEW DVT BUFFER ACCUMULATORS FOR BLOCKS IN SAM
LA.84 LDB TEMP1     GET ADDR OF 1ST MOVED BLOCK 
      SZB,RSS       MORE ON MOVE CHAIN? 
      JMP LA.88      NO 
      LDA 1,I       GET LINK TO NEXT
      STA TEMP1     SAVE IT 
      INB           POINT TO 2ND WORD IN BLOCK
      LDA 1,I       GET CONWD 
      RAL 
      SSA,RSS       IS THIS A CLASS OR BUFRD REQ? 
      JMP LA.84      NO, DOESN'T AFFECT ACCUMS
      ADB .6        POINT TO BLOCK SIZE (WORD 8 OF BLOCK) 
      LDA 1,I       GET BLOCK TOTAL SIZE
      ADA $DV8,I    UPDATE NEW DVT'S ACCUMULATOR
      STA $DV8,I
      LDA 1,I       GET SIZE AGAIN
      CMA,INA 
      ADA NUMBA,I   SUBTRACT SIZE FROM OLD DVT'S
      STA NUMBA,I    BUFFER ACCUMULATOR 
      JMP LA.84     ITERATE 
*  CLEAR OLD DVT'S BUFFER-LIMITED FLAG
LA.88 ISZ NUMBA     POINT TO DVT9 OF OLD DVT
      LDA NUMBA,I 
      ELA,CLE,ERA   CLEAR "BUFFER-LIMITED" FLAG (15)
      STA NUMBA,I 
*  DETERMINE IF NEW DVT IS NOT DOWN & HAS A NON-ACTIVE REQUEST
*  AT THE HEAD OF ITS DVT INITIATION LIST 
      LDA $DV6,I    GET AV
      LDB $DV2,I    GET HEAD OF INIT LIST 
      ELB,CLE,ERB   CLEAR SIGN
      RAL 
      SZB           INIT LIST EMPTY?
      CMA,SSA,SLA,RSS  IS DEVICE BUSY OR DOWN?
      JMP LA.90         YES, DON'T INITIATE 
*  INITIATE THE HEAD OF THE NEW DVTS INITIATION QUEUE NOW!
*    ( ALL IS KOSHER EVEN IF THIS IS THE BIT BUCKET)
      LDB *+2       GET RETURN ADDR FOR I/O SYS 
      JMP $INIO     JUMP INTO I/O SYS FOR LOGICAL INIT
      DEF LA.90 
* 
LA.90 JSB $LIBX     RAISE FENCE 
      DEF *+1 
      DEF *+1 
      HED      ******* DISPLAY LU ASSIGNMENT *******
* 
LD.00 LDA M.LU      GET LU #
      JSB DECIM     CONVERT TO ASCII-DECIMAL
      STA M.LU       OF LU
      LDA LUTAD,I   GET LUT ENTRY 
      SZA,RSS       BIT BUCKET? 
      JMP LD.90      YES
      STA DVTAD     SAVE DVT ADDRESS
*  NOW COMPUTE THIS DVT NUMBER
      CLA,INA 
      STA TEMP
      LDB $DVTA     ADDR OF 1ST DVT 
LD.10 CPB DVTAD     DVT ADDR MATCH? 
      JMP LD.15      YES
      JSB NXDVT     GET ADDR OF NEXT DVT
      ISZ TEMP
      JMP LD.10     ITERATE 
*  CONVERT DISPLAY VALUES TO ASCII
LD.15 LDA TEMP      GET DVT # 
      JSB DECIM     CONVERT TO 2 DIGIT DECIMAL VALUE
      STA M.DVT     STORE ASCII OF DVT #
      LDB DVTAD 
      ADB .5        ADDR OF DVT6
      LDA 1,I 
      ALF,ALF       RIGHT JUSTIFY DEVICE TYPE 
      JSB OCTAL     CONVERT TO ASCII-OCTAL
      STA M.DTY     STORE DEVICE TYPE IN MSG
      LDB DVTAD 
      ADB .4        DVT5'S ADDR 
      LDB 1,I       GET IFT REF 
      ELB,CLE,ERB   CLEAR SIGN
      ADB .5        ADDR OF IFT6
      LDA 1,I       GET INTERFACE SELECT CODE 
      STA TEMP
      JSB OCTAL     CONVERT TO ASCII-OCTAL
      STA M.SC       & STORE IN MSG 
      LDA TEMP      GET IFT6 WORD AGAIN 
      ALF,ALF       RIGHT JUSTIFY INTERFACE TYPE
      JSB OCTAL     CONVERT TO ASCII-OCTAL
      STA M.ITY      & STORE IN MSG 
      LDB MSGLN 
LD.80 STB TEMP
* 
      JSB CNOPT     WRITE RESPONSE LINE 
      DEF *+5 
      DEF .2
      DEF CAM.O 
      DEF MSGBF 
      DEF TEMP
      JMP LA..,I    RETURN
* 
LD.90 LDA ASC.0     BIT BUCKET, SO DISPLAY
      STA M.DVT      DVT # OF ZERO
      LDB .6          & SHORTEN MSG 
      JMP LD.80 
      HED      ******* ROUTINES & CONSTANTS ******* 
ER56  LDA .56       56 = BAD PARAMETER
      STA ERRTN,I   RETURN ERROR VALUE
      JMP LA..,I     AND RETURN 
* 
ER35  LDA .35       IFT SWITCH TO WRONG ITYPE 
      RSS 
* 
ER37  LDA .37       37 = DEVICE BUSY ERROR
ERPRV STA ERRTN,I   RETURN ERROR
      JSB $LIBX     GO UNPRIVILEGED & RETURN
      DEF LA..
* 
*  SUBROUTINE TO CONVERT VALUE TO ASCII-OCTAL 
* 
OCTAL NOP 
      AND B77       JUST USE BITS 5-0 
      JSB CONVT     CONVERT TO ASCII
      DEC 8         BASE 8
      JMP OCTAL,I 
* 
*  SUBROUTINE TO CONVERT VALUE TO ASCII-DECIMAL 
*  2-DIGIT VALUE, SUPPRESSING A LEADING ZERO
* 
DECIM NOP 
      JSB CONVT     CONVERT TO ASCII
      DEC 10        BASE 10 
      JMP DECIM,I 
* 
CONVT NOP 
      CLB 
      DIV CONVT,I 
      SZA           LEADING ZERO? 
      IOR B20        NO, FORM NUMERIC 
      ALF,ALF       LEFT JUSTIFY
      IOR 1         INCLUDE LSB 
      IOR ASC.0     FORM ASCII
      ISZ CONVT 
      JMP CONVT,I   RETURN
* 
*  SUBROUTINE TO COMPUTE ADDR OF NEXT DVT, CURRENT DVT ADDR IN B
* 
NXDVT NOP 
      ADB .20       POINT TO DVT21
      STB CONVT 
      LDA 1,I       GET DVTP LENGTH 
      CLB 
      RRL 7         RIGHT JUSTIFY DVTP LENGTH IN B
      ADB CONVT     COMPUTE ADDR OF NEXT
      ADB .2          SEQUENTIAL DVT
      JMP NXDVT,I   RETURN
* 
*  THIS SUBROUTINE RETURNS AN ERROR 56 IF ADDRESSED 
*  DVT IS A DISK
CKDSK NOP 
      ADA .5        POINT TO DVT6 
      LDA 0,I       GET IT
      AND .034      HI BITS OF DEVICE TYPE
      CPA .014      TYPE = 30-37? 
      JMP ER56       YES, DISC, GIVE ERROR
      JMP CKDSK,I   ELSE JUST RETURN
* 
*  DATA AREA
* 
NUMBA NOP 
ERRTN NOP 
LUTAD NOP 
DVTAD NOP 
IFTAD NOP 
DVT5  NOP 
TEMP  NOP 
TEMP1 NOP 
* 
.1    DEC 1 
.2    DEC 2 
.3    DEC 3 
.4    DEC 4 
.5    DEC 5 
.6    DEC 6 
.20   DEC 20
.35   DEC 35
.37   DEC 37
.56   DEC 56
B20   OCT 20
B77   OCT 77
B777  OCT 777 
LUMSK OCT 3770
TYFLD OCT 37400 
.034  OCT 34000 
.014  OCT 14000 
N6    DEC -6
ASC.0 ASC 1, 0
* 
* 
MSGBF EQU * 
      ASC 2, LU#
M.LU  BSS 1 
      ASC 2,,DV#
M.DVT BSS 1 
      ASC 2,,DT=
M.DTY BSS 1 
      ASC 2,,SC#
M.SC  BSS 1 
      ASC 2,,IT=
M.ITY BSS 1 
MSGLN ABS *-MSGBF 
* 
* 
      END 
                                                                                              