      HED LIBRARY SUBROUTINES * DLOOK SEARCHES THE DISC DIRECTORY FOR A PARTICULAR ENTRY. THE * DESIRED ENTRY IS DEFINED BY LTEMP(0:3). * * IF THE ENTRY IS FOUND, DLOOK RETURNS TO P+1. THE FOLLOWING VARIA- * BLES ARE SET: *     (LTEMP+4)=POINTER TO DIREC ENTRY. *     (LTEMP+5)=MEMORY ADDRESS OF ENTRY.* THE APPROPRIATE DIRECTORY TRACK IS IN CORE. * * IF THE ENTRY IS NOT FOUND, DLOOK RETURNS TO P+2. THE POINTERS * ARE SET TO POINT AT THE LAST ENTRY LESS THAN THE GIVEN ENTRY.       SPC 1 DLOOK NOP           ENTRY POINT.      LDB DIRD3     SET LTEMP+4 TO POINT AT FIRST DLOK3 STB LTEMP+4    DIRECTORY TRACK.       LDA LTEMP+4,I TEST FOR EMPTY TRACK.       SZA       JMP DLOK1     NOT EMPTY.DLOK2 LDB LTEMP+4   BUMP BACK TO      ADB .-7        NEXT TRACK.      JMP DLOK3 DLOK1 INB           COMPARE FIRST TRACK ENTRY       LDA DLTEM      TO DESIRED ENTRY.      JSB DIRCM       JMP DLOK2     NOT ON THIS TRACK.       NOP          FOUND THE RIGHT TRACK.      LDA LTEMP+4,I       STA WORD      SET UP DISC TRANSFER LENGTH.      CMA,INA       SET UP INITIAL POINTER FOR      ADA LIBD       TRACK SCAN.      ADA .-8       STA LTEMP+5       LDA LTEMP+4   GET DIRECTORY       ADA .+6        DISC ADDRESS.      LDA 0,I       LDB LIBDI       JSB DISCL     READ DIRECTORY. * * NOW SEARCH DIRECTORY FOR DESIRED ENTRY. A BINARY SEARCH IS USED,* WITH LTEMP(14:15) USED AS POINTERS TO THE FIRST AND LAST OF ALL * UNTESTED ENTRIES. * DLOK4 LDA LIBD      SET POINTER TO BEGINNING OF       STA LTEMP+14   DIRECTORY.       LDA DLTEM     TEST LAST ENTRY IN TRACK.       LDB LTEMP+5       JSB DIRCM       JMP DLOK5     LAST ENTRY TOO BIG--START CHOP.       ISZ DLOOK     TOO SMALL--IT'S THE ONE.      JMP DLOOK,I   LAST ENTRY IS IT. * DLOK5 LDA LTEMP+5   SET END POINTER.      STA LTEMP+15      LDA LTEMP+14  COMPUTE DIFFERENCE BETWEEN FIRSTDLOK6 CMA,INA        AND LAST ENTRIES.      ADA LTEMP+15      ARS           DIVIDE BY TWO.      AND .-8       ROUND TO A VALID MULTIPLE OF 8.       ADA LTEMP+14  GET ADDRESS OF MIDDLE ENTRY.      STA LTEMP+5   SET INTO RESULT LOCATION.       LDB DLTEM     SETUP FOR JSB DIRCM.      CPA LTEMP+14  TEST FOR ONLY 2 ENTRIES LEFT.       JMP DLOK8     THERE ARE--WE'VE GOT THE RESULT.*       JSB DIRCM     TEST MIDWAY ENTRY.      JMP DLOK7     TOO SMALL--GO RESET LTEMP(14).      JMP DLOK5     TOO BIG--GO RESET LTEMP(15).      JMP DLOOK,I   EQUAL--RETURN.* DLOK7 LDA LTEMP+5   RESET LTEMP(14).      STA LTEMP+14      JMP DLOK6 * DLOK8 CPA LIBD      IF LTEMP(14)<>LTEMP, WE KNOW      JSB DIRCM      IT'S LESS, SO WE SKIP TEST.      ISZ DLOOK     LESS THAN ENTRY.      NOP       JMP DLOOK,I   EQUAL TO ENTRY. * T35CQ IS USED BY LIBRARY PROGRAMS TO SCAN THE TTY35 INPUT BUFFER. * EACH TIME IT IS CALLED, IT FETCHES THE NEXT CHARACTER, BUT SKIPS* BLANKS. THE CHARACTER IS LEFT IN T35LC, AND IN A. WHEN A RETURN IS* ENCOUNTERED, T35CQ RETURNS TO P+1; OTHERWISE TO P+2. IT IS INITI- * ALIZED BY THE MONITOR BEFORE THE LIBRARY ROUTINE IS CALLED. * T35CQ NOP           ENTRY POINT.      LDA T35LC     GET LAST CHARACTER.       CPA .+15B     IF CR,      JMP T35CQ,I    RETURN IMMEDIATELY.      LDB T35CP     GET CHARACTER POINTER IN B+       CLE,ERB        ADJUST.      LDA 1,I       FETCH       SEZ,RSS        CHAR.      ALF,ALF       AND B177      STA T35LC     SAVE IT.      ISZ T35CP     BUMP POINTER.       CPA .+15B     IF CR.      JMP T35CQ,I    RETURN IMMEDIATELY.      CPA .+40B     IF BLANK, T35C1 JMP T35CQ+4    IGNORE.      ISZ T35CQ     OTHERWISE       JMP T35CQ,I    RETURN NORMAL. MOVEW NOP           MOVES -B WORDS FROM MOVES,I TO      SSB,INB,RSS    MOVED,I      JMP MOVEW,I       LDA MOVES,I   GET A WORD      STA MOVED,I   STORE IT.       ISZ MOVES     BUMP      ISZ MOVED      POINTERS.      JMP MOVEW+1   NO. * * RDPRG READS THE CURRENT USER INTO CORE. * RDPRG NOP       LDB MLINK+1   GET PROGRAM BOUND POINTER.      ADB .+?PROG-?LINK       LDA 1,I       GET PROGRAM BOUND       STA PBPTR       CMA           COMPUTE LENGTH.       ADA USE       STA WORD      ADB .+?DISC-?PROG       LDA 1,I       GET DISC ADDRESS.       CLB           BLOCK       STB DCLC1,I    SCHEDULER.       LDB USEI      PERFORM       JSB DISCL      TRANSFER.      LDA DCLC2,I   UNBLOCK SCHEDULER.      STA DCLC1,I       JMP RDPRG,I   RETURN* * DATE COMPUTES A WORD CONTAINING THE YEAR IN ITS 7 HIGH ORDER BITS * AND THE DAY IN ITS 9 LOW ORDER BITS.* DATE  NOP       LDA DATIM     GET HOUR OF YEAR.       CLB           DIVIDE BY 24 TO       DIV .+24       GET THE DAY.       LSL 7         POSITION ON LEFT.       LDB YEAR      POSITION THE YEAR       LSR 7       JMP DATE,I* * RDIAT READS THE ADT AND IDT INTO CORE. IT THEN SEARCHES THE IDT * FOR THE ID OF THE CURRENT USER AND RETURNS WITH B POINTING TO IT. * THE CORE LOCN OF THE ADT IS PLACED INTO ADTAD.* RDIAT NOP       LDA IDLEN     COMPUTE IDT LENGTH IN       AND M64        EVEN SECTORS.      ADA ADLEN     ADD IN ADT LENGTH TO OBTAIN       STA WORD       TOTAL TRANSFER LENGTH      LDA IDLOC     NOW READ FROM DISC.       LDB LIBDI       JSB DISCL *       LDA IDLEN     COMPUTE LOCATION      AND M64       OF ADT AND      CMA,INA       STORE IN ADTAD      ADA LIBD      STA ADTAD *       LDB LIBD      SEARCH IDT.       LDA MLINK+1   GET USER ID       ADA .+?ID-?LINK       LDA 0,I       CPA 1,I       SEARCH FOR ENTRY.       JMP RDIAT,I       ADB .+8       JMP *-3 ADTAD BSS 1 * * DIRCM COMPARES THE 4 WORD ENTRIES POINTED TO BY A AND B.* BIT 15 IS NOT USED. IT RETURNS AS FOLLOWS:*     P+1: A<B*     P+2: A>B*     P+3 A=B DIRCM NOP       STA DIRC2       LDA .-4       SET COUNTER.      STA DIRC1       STB DIRC5 DIRC3 LDA DIRC5,I   SUBTRACT WORD FROM B      ELA,CLE,ERA       CMA,INA       FROM WORD FROM A.       LDB DIRC2,I       ELB,CLE,ERB       ADA 1       SZA           TEST FOR EQUAL.       JMP DIRC4     NOT EQUAL-GO RETURN.      ISZ DIRC5     BUMP      ISZ DIRC2      POINTERS.      ISZ DIRC1     TEST FOR FINISHED.      JMP DIRC3       ISZ DIRCM     DOUBLE ISZ FOR EQUAL. DIRC4 SSA,RSS       ISZ DIRCM     ONE ISZ IF A>B      JMP DIRCM,I    NONE IF A<B. DIRC5 EQU T35CQ DIRC1 EQU RDIAT DIRC2 EQU DATELOUT  NOP      OUTPUT CHAR. IN A TO USERS TELETYPE.       LDB MLINK+1       ADB .-?LINK       JSB OUTCH,I       JMP LOUT,I* LTYPR NOP           OUTPUT -A CHARS TO USER'S TTY;      STA LTYP1  B POINTS TO BUFFER.      STB LTYP2 LTYP3 LDA LTYP2,I   GET FIRST       ALF,ALF        CHARACTER OF WORD      JSB LOUT        OUT.      ISZ LTYP1     ANY MORE?       RSS            YES      JMP LTYPR,I   NO.       LDA LTYP2,I   SEND 2ND      JSB LOUT       CHAR.      ISZ LTYP2     BUMP POINTER.       ISZ LTYP1     ANY MORE?       JMP LTYP3     YES       JMP LTYPR,I LTYPE NOP           SAME AS LTYPR BUT WITH CRLF.      JSB LTYPR       LDA .-2       LDB ?ABP2       JSB LTYPR       JMP LTYPE,I LTYP1 EQU DIRCM LTYP2 EQU RDIAT * LCHAR NOP      GET NEXT INPUT CHAR.--SKIP RETURN      LDB MLINK+1   UNLESS CR, SKIP BLANKS.       ADB .+?BHED-?LINK       STB LTYP1       ADB .+?BEND-?BHED  SET UP ENDOFBUFFER POINTER       STB LTYP2 LCHR1 LDB LTYP1,I   GET BUFFER POINTER      CLE,ERB       LDA 1,I       GET WORD.       SEZ,RSS       ROTATE IF       ALF,ALF        NECESSARY      AND B177      MASK IT.      CPA .+15B     RETURN IF       JMP LCHAR,I    CR       LDB LTYP1,I   GET BUFFER POINTER      INB           BUMP TO NEXT CHAR.      CPB LTYP2,I   IF END OF BUFFER,       ADB MBLEN       MOVE TO START.      STB LTYP1,I       CPA .+40B     SKIP      JMP LCHR1       ISZ LCHAR       JMP LCHAR,I T35SP NOP           OUTPUT TO TT35 AND WAIT.      JSB TTY35,I   FIRST OUTPUT.       CLF 0       LDA T35SP     MOVE RETURN ADDRESS       STA T35RS     INTO TABLE.       LDA T35ST     MOVE STATUS INTO PRIORITY       STA T35PR       LDA %OUTW     SET STATUS TO OUTWAIT.      STA T35ST       JMP *+1,I     GO HANG       DEF SUSPLLEND LDA .+12B       JSB LOUT      JMP SCHEN,I DISCL NOP       JSB DISC,I      LDA ENDSK       SZA       JMP *-2       JMP DISCL,I MOVEB NOP           MOVE BACKWARD -B WORDS FROM       SSB,INB,RSS    MOVES TO MOVED.      JMP MOVEB,I       LDA MOVES,I       STA MOVED,I       CCA           UPDATE POINTERS.      ADA MOVED       STA MOVED       CCA       ADA MOVES       STA MOVES       JMP MOVEB+1 * LEND OUTPUTS A LINE FEED ON THE SYSTEM TELETYPE * AND THEN TERMINATES THE PROGRAM.LEND  LDA ONEI      OUTPUT THE      LDB DEH        LINE FEED.       JSB TTY35,I LENDR CLA       STA T35F2       JMP SCHEN,I * * LFRER PRINTS AN ILLEGAL FORMAT MESSAGE ON THE SYSTEM* TELETYPE AND THEN TERMINATES THE PROGRAM. LFRER LDA .+15      LDB *+2       JMP LEND+2LFRDF DEF *+1       OCT 5111      ASC 7,LLEGAL FORMAT * * GETID SCANS THE INPUT BUFFER FOR AN ID NUMBER. IF NOT FOUND, IT * OUTPUTS A MESSAGE AND TERMINATES. * IF FOUND, THE RESULT IS PLACED IN ID, -RESULT * IN MID. IF THE FOLLOWING CHARACTER IS A CR, GETID SKIPS ON THE* WAY BACK. IN ANY CASE, THE NEXT CHARACTER IS IN A.* GETID USES LTEMP+12,13,14,15. * GETCH EQU LTEMP+12GETI1 EQU LTEMP+13GETI2 EQU LTEMP+14GETI3 EQU LTEMP+15GETID NOP       LDA MLINK+1   DETERMINE WHICH SCANNER TO USE      LDB DLCHR     USE LCHAR IF USER TELETYPE,       CPA T35LN       T35CH IF SYSTEM.      LDB T35CH       STB GETCH       JSB GETCH,I   SCAN INPUT BUFFER FOR FIRST       JMP GTFER      CHARACTER.       ADA M133B     TEST FOR LETTER.      SSA,RSS       JMP GTFER       ADA .+32B       SSA,INA       JMP GTFER       ASL 10      STA GETI1     SAVE FOR LATER.       LDA .-3       SET DIGIT       STA GETI2      COUNTER.       CLB           SET NUMBERGETI4 STB GETI3      TO 0.      JSB GETCH,I   GET NEXT CHAR.      JMP GTFER     FAIL.       ADA M72B      TEST FOR DIGIT      SSA,RSS       JMP GTFER     FAIL.       ADA .+10      SSA       JMP GTFER     FAIL.       LDB GETI3     GET PARTIAL VALUE.      RBL,RBL       MULTIPLY BY 10.       ADB GETI3       RBL       ADB 0         ADD IN NEW DIGIT.       ISZ GETI2     TEST FOR DONE.      JMP GETI4       ADB GETI1     MERGE IN LETTER.      STB ID      CMB,INB       STB MID       JSB GETCH,I   GET NEXT CHARACTER.       ISZ GETID     SKIP RETURN IF CR.      JMP GETID,I * GTFER LDA GETCH     IF SYSTEM TELETYPE, PRINT       CPA T35CH     ERROR MESSAGE THERE.      JMP LFRER ILFER LDA .-15      OTHERWISE PRINT IT ON       LDB LFRDF     USER TELETYPE.LIBER JSB LTYPE       JMP SCHEN,I   TERMINATE.DLCHR DEF LCHAR * THIS ROUTINE IS CALLED BY THE COMPILER WHEN IT WANTS TO EXECUTE * A DISC ROUTINE. THE DISC TOUTINE IS ALWAYS EXECUTED WITH A PRIOTI-* TY OF 0, AS ALL DISC ROUTINES ARE. THE CALLING SEQUENCE IS*     JSB SCHLB,I *     DEF <DISC ADDRESS OF ROUTINE> *     <PARAMETERS IF DESIRED> *     <RETURN>* SCHLQ NOP       CLF 0       CLA       STA TIMEF     NO TIMING.      LDB MLINK+1       INB       STA 1,I       SET PRIORITY TO 0       ADB .+?STAT-?PLEV SET STATUS TO SYNTAX      LDA %SYNT      SO SCHEDULER DOESN'T KNOW      STA 1,I        WHAT WE'RE DOING.      ADB .+?PROG-?STAT       LDA PBPTR     SET PBPTR IN TABLE.       STA 1,I       CMA           SET UP DISC       ADA USE        PARAMETERS.      STA WORD      ADB .+?DISC-?PROG       LDA 1,I       AND M128      FORCE BACK TO TRACK ORIGIN.  [E]      STA 1,I                                    [E]      LDB USE       OUTPUT USER TO      JSB DISCL      DISC.      LDA SCHLQ,I   GET DISC ADDRESS.       ISZ SCHLQ       CPA LIB       IF IN CORE, TRANSFER DIRECT.      JMP LIBRA       STA LIB       SET LIB.      LDA 0,I       LDB M256      SET UP DISC TRANSFER.       STB WORD      LDB #LIBI       JSB DISCL       JMP LIBRA * * PROGRAM ALWAYS RETURNS HERE.* SCHBL CLF 0       LDB MLINK+1   SET PRIORITY AND STATUS       INB           AGAIN.      ISZ 1,I       PRIORITY=1.       ISZ TIMEF     SET FLAG FOR TIMING.      ADB .-2       ISZ 1,I       TRUE STATUS IS RUN.       STF 0       JMP SCHLQ,I HELK  DEF *+1       OCT 5111      ASC 7,LLEGAL ACCESS HELH  DEF *+1       OCT 5116      ASC 6,O TIME LEFT STABF BSS 1         USED BY STATUS      HED LIBRARY SIZES * THIS TABLE IS USED BY THE TSB PAPER TAPE LOADER, THE SLEEP* ROUTINE, AND THE MAG TAPE LOADER. IT CONTAINS THE LENGTHS OF* ALL THE REMAINING LIBRARY ROUTINES, AND ENABLES THE LOADER TO * ALLOCATE THE MINIMUM NUMBER OF DISC SECTORS FOR EACH OF THEM. * THE TABLE IS WRITTEN ON THE DISC AS THE FIRST LIBRARY ROUTINE.      SPC 1       ORG LIBRA       ABS LIBRA-$SLPL       DEC -128      FUSS TABLE.       ABS LIBRA-$FLB      ABS LIBRA-$SAV      ABS LIBRA-$$SAV    SAVE OVERLAY.      ABS LIBRA-$GET      ABS LIBRA-$APP      ABS LIBRA-$HEL      ABS LIBRA-$BYE      ABS LIBRA-$KIL      ABS LIBRA-$REN      ABS LIBRA-$NAM      ABS LIBRA-$CAT      ABS LIBRA-$CAT      ABS LIBRA-$DEL      ABS LIBRA-$TIM      ABS LIBRA-$PRO      ABS LIBRA-$PRO      ABS LIBRA-$OPE      ABS LIBRA-$LEN      ABS LIBRA-$ECH      ABS LIBRA-$REP      ABS LIBRA-$RES      ABS LIBRA-$CHA      ABS LIBRA-$DIR      ABS LIBRA-$STA      ABS LIBRA-$SLE      ABS LIBRA-$$SLE       ABS LIBRA-$NEW      ABS LIBRA-$KID      ABS LIBRA-$$KID       ABS LIBRA-$UNL      ABS LIBRA-$LOC      ABS LIBRA-$$LOC       ABS LIBRA-$PUR      ABS LIBRA-$$PUR       ABS LIBRA-$ROS      ABS LIBRA-$DIS      ABS LIBRA-$MAG      ABS LIBRA-$PHO      REP 5       DEC -256$SLPL EQU *       HED FUSS* THE FUSS TABLE CONTAINS AN 8 WORD ENTRY FOR EACH PORT. THESE* WORDS ARE THE DISC ADDRESSES OF THE FILES HE IS CURRENTY USING. * A ZERO INDICATES NO FILE.       ORG LIBRA       REP 16      OCT 0,0,0,0,0,0,0,0       HED FILES * THE FILES ROUTINE IS USED BY THE BASIC COMPILER TO PROCESS A FILES* STATEMENT DURING PHASE II.  THE PURPOSE OF THE ROUTINE IS TO PRO- * VIDE THE COMPILER WITH INFORMATION ABOUT THE REQUESTED FILES. THIS* INFORMATION CONSISTS OF THE FILE DISC ADDRESS AND THE FILE LENGTH.* THE COMPILER PASSES PARAMETERS TO THE FILES ROUTINE AS FOLLOWS: * *     VALTB=>LENGTH WORD OF FILES STATEMENT.*     FILTB=>BEGINNING OF TABLE AREA FOR FILE INFO. *     SCHLB,I=>FIRST POSSIBLE RETURN ADDRESS. * * THE CALLING SEQUENCE TO THE FILES ROUTINE IS AS FOLLOWS:* *     JSB SCHLB,I *     DEF FILIB *     <ERROR EXIT FOR BAD FORMAT IN FILES STATEMENT>*     <ERROR EXIT IF A FILE IS UNACCESSIBLE>*     <ERROR EXIT IF PROGRAM OVERFLOW>*     <NORMAL EXIT>       SPC 2       ORG LIBRA *       LDA PRBFA,I   GET POINTER TO PHYSICAL BUFFER.       RAR       STA FLBUF     SAVE BUFFER POINTER.      STA FLBFP       LDA .-9       SET COUNTER FOR MAXIMUM NUMBER      STA FLBC1      OF FILES ALLOWED.      CCA           SET POINTER TO      ADA VALTB,I    LAST CHAR +1 OF      ADA VALTB       FILES STATEMENT.      RAL       STA FLBP      LDA VALTB     INITIALIZE POINTER TO       INA       ALS       STA FLBCP      FILES STATEMENT. * FLB1  LDA .-3       SET FILC2 TO SAY 3 WORDS      STA FLBC2      ALLOWED.       CLA       STA FLBCM     CLEAR COMMA FLAG.       STA FLB$      JSB FLBCH     GET FIRST CHAR.       CPA .+44B     TEST FOR DOLLAR SIGN.       JMP FLB2FLB5  CPA .+40B     BETTER NOT BE A BLANK.      JMP FLB8+1    FAIL IF IT IS.      ADA FLB$      PLACE $ FLAG ON FIRST CHAR. FLB3  ALF,ALF       POSITION ON LEFT      STA FLBUF,I    AND STORE IN BUFFER.       JSB FLBCH     GET RIGHT CHARACTER       IOR FLBUF,I    AND PACK IN.       STA FLBUF,I       ISZ FLBUF     BUMP BUFFER POINTER.      JSB FLBCH     GET NEXT CHARACTER.       ISZ FLBC2     TEST FOR END OF FILE NAME.      JMP FLB3*       CPA .+40B     IF END OF FILE NAME, CHAR MUST      JMP FLB4       BE A BLANK.      JMP FLB8+1    FAIL IF NOT.* FLB2  LDA B200      IF 1ST CHAR IS $, SET FIL$ TO       STA FLB$       INDICATE LIBRARY FILE.       JSB FLBCH     GET NEXT CHAR.      JMP FLB5* FLB4  ISZ FLBC1     TEST FOR TOO MANY FILES.      RSS       JMP FLB8+1      LDA FLBCM     TEST FOR ANY MORE REQUESTED.      SZA       JMP FLB1      YES IF COMMA WAS SEEN.*       LDA FLBC1     SET FILC1 TO EQUAL      ADA .+9       -# OF FILES REQUESTED       CMA,INA       STA FLBC1       STA FLBC2 *       ISZ SCHLQ     BUMP RETURN ADDRESS SINCE WE'VE       LDA FLBFP      NOW CHECKED FOR TYPE I ERRORS.       STA FLBUF     SET POINTER TO BUFFER AGAIN.*       LDA MLINK+1   GET USER ID AND SAVE IT.      ADA .+?ID-?LINK       LDA 0,I       STA FLBID * FLB6  LDB FLBUF,I   GET FIRST WORD OF FILE NAME.      LDA FLBID       SSB           IF BIT 15 OF FIRST WORD IS SET,       LDA A000       PERFORM SEARCH USING A000.       DST LTEMP       ISZ FLBUF     GET NEXT 2 WORDS ALSO.      DLD FLBUF,I       DST LTEMP+2 *       JSB DLOOK     SEARCH FOR FILE.      JMP FLB7      FOUND IT. * FLB8  JSB RDPRG     IF NOT FOUND, RETURN TO       JSB DCMPL       JMP SCHBL      PROGRAM. * FLB7  LDB LTEMP+5   TEST TO SEE       ADB .+2        IF THIS IS       LDA 1,I         REALLY A      SSA,RSS          FILE.      JMP FLB8      FAIL IF NOT.      ADB .-1       TEST FOR PROTECTED.       LDA 1,I       SSA,RSS       JMP FLB9      NOT PROTECTED.      LDA A000      IF PROTECTED, TEST FOR A000.      CPA FLBID       RSS       JMP FLB8      PROTECTED FILE ACCESS--FAIL.* FLB9  ADB .+5       NOW GET DISC ADDRESS AND LENGTH.      DLD 1,I       STORE DISC ADDRESS      STA FLBUF,I    IN BUFFER.       ASR 6         CONVERT LENGTH TO       CMB,INB        POSITIVE SECTORS.      LDA FLBID     TEST FOR USER REFERENCE TO      CPA LTEMP      PUBLIC FILE.       RSS       ADB BIT15     SET BIT15 OF LENGTH IF IT IS.       ISZ FLBUF     STORE IN      STB FLBUF,I    BUFFER.      ISZ FLBUF     BUMP BUFFER POINTER TO NEXT ENTRY.      JSB DATE      GET DATE AND SET IN       LDB LTEMP+5    PURGE LOCATION.      ADB .+5       STA 1,I       LDB LTEMP+4   WRITE DIRECTORY TO DISC.      ADB .+6       LDA 1,I       LDB LIBD      JSB DISCL *       ISZ FLBC1     TEST FOR ANY MORE FILES.      JMP FLB6* * WE HAVE FOUND ALL THE FILES. WE NOW HAVE TO UPDATE THE FUSS TABLE.* FIRST CHECK TO SEE IF THE PROGRAM HAS ROOM ENOUGH FOR THE TABLE.*       ISZ SCHLQ     BUMP TO NEXT ERROR EXIT.      LDA FLBC2     GET # OF FILES.       STA FLBC1       CMA,INA       MPY .+7       COMPUTE NEW VALUE OF PBPTR.       ADA PBPTR       CMA       ADA LWAUS     TEST FOR OVERFLOW.      SSA       JMP FLB8      FAIL--PROGRAM TOO LARGE.*       ISZ SCHLQ     BUMP TO NORMAL RETURN ADDRESS.      LDA FLB28     INPUT FUSS TABLE.       STA WORD      LDA FUSS,I      LDB LIBDI       JSB DISCL *       LDA MLINK+1   DETERMINE USER #.       ADA FLBSP       CLB       DIV .+TTY01-TTY00       ALF,RAR       MULTIPLY USER# BY 8 AND       ADA LIBD       ADD LIBD TO POINT AT USER'S      STA FLBFS       SECTION OF FUSS.      STA LTEMP       LDB .-8       ZERO OUT USER'S SECTION.      CLA       STA LTEMP,I       ISZ LTEMP       INB,SZB       JMP *-3 * * NOW CHECK TO SEE IF ANY OF THE REQUESTED FILES ARE BEING USED BY* ANOTHER USER. IF THEY ARE, WE ALLOW ONLY FILE READS BUT NO WRITES.* IF THE USER IS A000, WE SKIP THE TEST.*       ISZ FLBFP       LDA FLBID       CPA A000      JMP FLB10 *       LDA FLBFP     SET BUFFER POINTER.       STA FLBUF * FLB11 LDA FLBUF,I   GET DISC ADDRESS.       ISZ FLBUF       LDB LIBD      SET INITIAL POINTER TO FUSS.FLB14 CPA 1,I       TEST FOR THERE.       JMP FLB12     IT IS.      INB           BUMP FUSS POINTER       CPB L128       AND TEST FOR DONE.       JMP FLB13     NOT THERE.      JMP FLB14 * FLB12 LDA FLBUF,I   SET DISC LENGTH TO SAY      IOR BIT15      READ ONLY.       STA FLBUF,I * FLB13 ISZ FLBUF     BUMP BUFFER POINTER FOR       ISZ FLBUF      NEXT FILE.       ISZ FLBC1     TEST FOR ANY MORE       JMP FLB11 * * NOW UPDATE FUSS BY PLACING THE DISC ADDRESSES JUST REQUESTED* INTO THE USER'S FUSS AREA.* FLB10 LDA FLBC2     SET COUNTER.      STA FLBC1       LDA FLBFP     GET POINTER TO FIRST ONE. FLB15 INA           GET WORD COUNT.       LDB 0,I       ADA .-1       SSB,RSS       IF NOT READ ONLY,       CLB,RSS       LEAVE BIT 7 0.      LDB B200        ELSE SET IT.      ADB 0,I       STB FLBFS,I    AND PUT IN TALBE.      ISZ FLBFS     BUMP      ADA .+3        POINTERS.      ISZ FLBC1     TEST FOR DONE.      JMP FLB15 *       LDA FUSS,I    WRITE FUSS TABLE BACK TO      LDB LIBD       DISC.      JSB DISCL *       JSB RDPRG     READ IN USER'S PROGRAM AGAIN.       LDA FILTB       STA VALTB FLB16 DLD FLBFP,I   GET DISC INFO FOR ONE FILE.       STB VALTB,I   STORE PHYSICAL LENGTH.      ISZ VALTB       SWP           GET PHYSICAL LENGTH IN A.       ELA,CLE,ERA   REMOVE BIT 15.      ADA .-2       COMPUTE RELATIVE LAST       SLA,INA,SZA    LOGICAL SECTOR ADDRESS.      ADA .-1       ADA 1         COMPUTE ABSOLUTE ADDRESS      STA VALTB,I   STORE IN TABLE.       ISZ VALTB       ISZ VALTB       STB VALTB,I   STORE DISC ADDRESS      LDA VALTB     BUMP POINTERS.      ADA .+4       STA VALTB       STA PBPTR       LDA FLBFP       ADA .+3       STA FLBFP       ISZ FLBC2     TEST FOR ANY MORE.      JMP FLB16 *       JMP SCHBL     NOW WE'RE ALL DONE. * * FLBCH GETS THE NEXT CHARACTER OUT OF THE FILES* STATEMENT. IF FLBCM=1, IT ASSUMES A COMMA HAS BEEN* SEEN AND RETURNS A BLANK. OTHERWISE IF THE CHARAC-* TER IS A COMMA, IT SETS FLBCM AND RETURNS A BLANK.* IT ALSO RETURNS BLANKS AT THE END OF THE CODE.* FLBCH NOP       LDA .+40B     RETURN BLANK IF       LDB FLBCM     FLBCM IS SET.       SZB       JMP FLBCH,I       LDB FLBCP     GET CHAR. POINTER.      INB           OTHERWISE BUMP      CPB FLBP       IF END OF STATEMENT,       JMP FLBCH,I   RETURN A BLANK.       STB FLBCP      POINTER.       CLE,ERB       GET NEXT CHAR.      LDA 1,I       SEZ,RSS       ALF,ALF       ROTATE IF NECESSARY.      AND B177      MASK.       SZA,RSS       SKIP 0'S.       JMP FLBCH+1       CPA .+54B     TEST FOR COMMA.       RSS       JMP FLBCH,I   NOT A COMMA.      ISZ FLBCM     IF COMMA, SET FLAG AND GO       JMP FLBCH+1    RETURN A BLANK.* FLB$  EQU LTEMP FLBCM EQU LTEMP+1 FLBUF EQU LTEMP+6 FLBFP EQU LTEMP+7 FLBC1 EQU LTEMP+8 FLBC2 EQU LTEMP+9 FLBP  EQU LTEMP+10FLBCP EQU LTEMP+11FLBID EQU LTEMP+12FLBFS EQU LTEMP+13FLBSP ABS -TTY00-?LINKFLB28 DEC -128$FLB  EQU * 