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