      HED UTILITY ROUTINES*                     * **  GET SELECT CODE  ** *                     * * *  ENTER WITH A CHARACTER IN (A).  FIND A TWO-DIGIT OCTAL *  INTEGER IN [(77 OCT - SELCD,I),76 OCT].  IF THIS CANNOT BE DONE, *  PRINT AN ERROR AND EXIT TO (P+2), ELSE EXIT TO (P+3) WITH THE*  INTEGER IN (B) AND THE FOLLOWING CHARACTER IN (A). * SELCD NOP       JSB DIGCK     DIGIT?      JMP SELC2     NO      ADB LM8       YES, OCTAL      SSB,RSS         DIGIT?      JMP SELC2     NO      ALF,RAR       YES       STA LTMP1     SAVE IT * 8       JSB GETCR     NEXT      JMP SELC2       JSB DIGCK       CHARACTER AN      JMP SELC2       ADB LM8           OCTAL DIGIT?      SSB,RSS       JMP SELC2     NO      ADA LTMP1     YES, SAVE       STA LTMP1       SELECT CODE       JSB GETCR       NOP       LDB LTMP1     SELECT CODE       ADB LD77      SSB,RSS         WITHIN      JMP SELC2       ADB SELCD,I       LEGAL RANGE?      SSB       JMP SELC2     NO      LDB LTMP1     YES       ISZ SELCD SELC1 ISZ SELCD       JMP SELCD,I SELC2 LDA L.21      REPORT      LDB ILSCL       JSB ASRDA,I     ERROR       JMP SELC1 *                     * **  GET DISC NUMBER  ** *                     * *  SEARCH THE INPUT RECORD FOR A '-' FOLLOWED BY AN INTEGER IN*  [0,3] FOLLOWED BY A COMMA.  IF (A) = -1 UPON ENTRY, CHECK THAT *  THE REFERENCED DISC EXISTS.  EXIT TO (P+2) WITH THE INTEGER IN *  (A) IF ABOVE CONDITIONS ARE MET; OTHERWISE, PRINT AN ERROR AND *  EXIT TO (P+1). * GTDNO NOP       STA LTMP0     SAVE FLAG GTDN1 JSB GETCR       JMP GTDN2       CPA DASH      '-' ?       RSS           YES       JMP GTDN1     NO      JSB INTGR     GET DISC #      CPA LB54      FOLLOWED BY A COMMA?      JMP GTDN3     YES GTDN2 LDA L.15      NO      LDB BDDLA     PRINT       JSB ASRDA,I     ERROR       JMP GTDNO,I GTDN3 LDA 1         DISC #      ADB LM4       SSB             < 4 ?       JMP GTDN5     YES GTDN4 LDA L.17      NO      LDB BADDA     PRINT       JSB ASRDA,I     ERROR       JMP GTDNO,I GTDN5 ISZ LTMP0     CHECK DISC TABLE?       JMP GTDN6     NO      STA LTMP0     YES, SAVE DISC #      ADA LDTBL     DOES      CLB             DISC      CPB 0,I           EXIST?      JMP GTDN4     NO      LDA LTMP0     YES, LOAD DISC #GTDN6 ISZ GTDNO       JMP GTDNO,I *                          ***  SET DISC TABLE ENTRY  ***                          ** *  UPON ENTRY TEMP1 HOLDS THE DISC # AND TEMP2 HOLDS THE DISC'S *  SELECT CODE.  IF TEMP2 > 0 UPON ENTRY, SEARCH THE INPUT*  BUFFER FOR AN INTEGER IN [90,128] FOLLOWED BY A CARRIAGE RETURN. *  IF FOUND, RESET THE DISC TABLE ENTRY APPROPRIATELY AND UNLOCK THE*  TRACKS ON THE DISC, EXITING TO (P+2).  IF NO PROPER*  INTEGER IS FOUND, PRINT AN ERROR AND EXIT TO (P+1).  IF TEMP2 = 0*  UPON ENTRY, ZERO THE DISC'S TABLE ENTRY AND LOCK ITS TRACKS, *  EXITING TO (P+2).* SETDS NOP       LDB TMP1A,I   COMPUTE ADDRESS OF PROPER       ADB LDTBL       DISC TABLE ENTRY      LDA TMP2A,I   DISC      SZA             REMOVAL?      JMP SETD3     NO      STA 1,I       YES, REMOVE DISCSETD1 LDB LM4       SET       STB LTMP1       COUNTER       LDB TMP1A,I   COMPUTE       BLS,BLS         TRACK TABLE       ADB LTRAX         ADDRESS       CMA           SET DISC AVAILABLESETD2 STA 1,I       INB               OR NOT AS       ISZ LTMP1       JMP SETD2           APPROPRIATE       ISZ SETDS       JMP SETDS,I SETD3 STB LTMP2     SAVE DTBL ADDRESS       JSB INTGR     GET # OF SECTORS      CPA LB15      END-OF-LINE?      JMP SETD5     YES SETD4 LDA L.23      NO      LDB ILTRA     PRINT       JSB ASRDA,I     ERROR       JMP SETDS,I SETD5 LDA 1       ADB LM129     VERIFY RESULT       SSB,RSS       JMP SETD4       TO BE WITHIN      ADB L.39      SSB               [90,128]      JMP SETD4       ALF,ALF       POSITION AND      STA LTMP1       SAVE LENGTH       CLB           DELETE      STB LTMP2,I     PRIOR ENTRY       LDB TMP2A,I   COMPUTE       RSS             TRIAL SETD6 ADB LB100         SELECT CODE PART      LDA LDTBL     SET       STA LTMP3       FOR       LDA LM4           TABLE       STA LTMP4           SEARCHSETD7 LDA LTMP3,I   SELECT CODE PART      AND LB377       ALREADY       CPA 1             USED?       JMP SETD6     YES       ISZ LTMP3     NO, MORE      ISZ LTMP4       TABLE ENTRIES?      JMP SETD7     YES       ADB LTMP1     NO, CREATE      STB LTMP2,I     NEW ENTRY       CCA           UNLOCK      JMP SETD1       TRACKS*                          ***  GET A COMPLETE TRACK  ***                          ** *  SEARCH ADT FOR A FULL TRACK.  IF NONE FOUND, TERMINATE *  LOADING.  IF FOUND, RETURN WITH DISC ADDRESS IN (A).  IF *  (A) = -1 UPON ENTRY, DELETE TRACK'S ADT ENTRY, ELSE SET*  ITS SECTOR COUNT TO ZERO.* GTTRK NOP       STA LTMP1     SAVE FLAG       LDB L.2       SET                          [E]      ADB ADLEN       ENTRY COUNTER,             [E]      BRS               SKIPPING LAST            [E]      STB LTMP2           PSUEDO-ENTRY           [E]      LDB ADTBF     (B) WILL HOLD ENTRY ADDRESSES GTTR1 LDA 1,I       LOAD ENTRY'S DISC ADDRESS       JSB ISOTL     GET TRACK LENGTH      INB             IN SECTORS      CPA 1,I       ALL OF TRACK AVAILABLE?       JMP GTTR2     YES       INB           NO      ISZ LTMP2     MORE ADT ENTRIES?       JMP GTTR1     YES       JMP ERR5A,I   NOGTTR2 CLA           CLAIM       STA 1,I         TRACK       ADB LM1       LOAD      LDA 1,I         DISC ADDRESS      ISZ LTMP1     REMOVE ENTRY?       JMP GTTRK,I   NO      STA LTMP2     YES       ADB L.2       ELIMINATE       LDA 1       JSB MOVUP       ENTRY       LDA LTMP2     RETRIEVE      JMP GTTRK,I     DISC ADDRESS*                          ***  ISOLATE TRACK LENGTH  ***                          ** *  ENTER WITH A DISC ADDRESS IN (A).  RETURN WITH THE LENGTH IN *  SECTORS OF THE REFERENCED TRACK IN (A).* ISOTL NOP       RAL,RAL       GET       AND L.3         DISC #      ADA LDTBL     LOAD WORD FROM      LDA 0,I         DISC TABLE      ALF,ALF       EXTRACT TRACK LENGTH      AND LB377       IN SECTORS      JMP ISOTL,I *                      ***  BUILD AN INTEGER  ***                      ** *  SEARCH THE INPUT STRING FOR AN INTEGER.  IF FOUND, RETURN WITH *  IT IN (B).  IF NO DIGITS ARE FOUND OR THE INTEGER OVERFLOWS*  16 BITS, RETURN WITH 32767 IN (B). * INTGR NOP       CCA           SET 'NO DIGITS'       STA LTMP5       FLAG      CLA           INITIALIZE TO ZEROINTG1 STA LTMP6     STORE PARTIAL RESULT      JSB GETCR     MORE CHARACTERS?      JMP INTG2     NO      JSB DIGCK     YES, DIGIT?       JMP INTG2     NO      STA LTMP5     YES, SAVE IT      LDA LTMP6     MULITPLY PARTIAL      MPY L.10        RESULT BY 10      CLE           ADD IN      ADA LTMP5       NEW DIGIT       SEZ,SZB,RSS       SSA           OVERFLOW?       RSS           YES       JMP INTG1     NO      LDB INF       REPLACE WITH      JMP INTGR,I     MAXIMUM INTEGER INTG2 LDB LTMP6     LOAD INTEGER      ISZ LTMP5     ANY DIGITS FOUND?       JMP INTGR,I   YES       LDB INF       NO, LOAD ILLEGAL INTEGER      JMP INTGR,I *                               * **  CONVERT TWO-DIGIT INTEGER  ** *                               * * *  SEARCH THE INPUT RECORD FOR A TWO-DIGIT INTEGER NOT TO EXCEED*  -(TWODG,I UPON ENTRY).  IF FOUND, RETURN TO (P+2) WITH INTEGER *  IN (B), ELSE EXIT TO ERROR ROUTINE.* TWODG NOP       JSB GETCR     FETCH       JMP ERR7A,I     AND       JSB DIGCK         VERIFY      JMP ERR7A,I         DIGIT       CLB           MULTIPLY      MPY L.10        BY 10       STA LTMP1         AND SAVE      JSB GETCR     FETCH       JMP ERR7A,I     AND       JSB DIGCK         VERIFY      JMP ERR7A,I         DIGIT       ADB LTMP1     COMBINE WITH PRIOR RESULT       LDA 1       ADA TWODG,I   INTEGER       ISZ TWODG       TOO       SSA               LARGE?      JMP TWODG,I   NO      JMP ERR7A,I   YES *                          ***  READ FROM PAPER TAPE  ***                          ** *  RETURN WITH A WORD FROM PAPER TAPE IN (B).  IF (E) = 1 UPON*  ENTRY, READ ONLY THE NEXT FRAME.  IF (E) = 0 UPON ENTRY, *  COMBINE THE NEXT TWO FRAMES INTO A 16-BIT RESULT.* READ  NOP       CLB,CME READ1 STC 13B,C     READ      SFS 13B         A       JMP *-1           CHARACTER       CLC 13B       INCLUSIVE OR      MIB 13B         INTO (B)      SEZ,RSS       SECOND CHARACTER TO BE READ?      JMP READ,I    NO      BLF,CLE,BLF   YES, MOVE FIRST CHARACTER       JMP READ1       TO HIGH PART OF (B)       SKP *                      ***  VALIDATE ADDRESS  ***                      ** *  ENTER WITH AN ADDRESS IN (B).  VERIFY THAT THIS!ADDRESS LIES *  WITHIN AN AREA OF CORE CONTAINING TSB SYSTEM CODE.  IF THIS IS *  NOT THE CASE, HLT 55 OCT WITH THE OFFENDING ADDRESS IN (A).* ADVAL NOP       STB LTMP1     SAVE ADDRESS      CLE           BELOW       ADB MAXAD       PROTECTED       SEZ               LOADER?       JMP ADVA1     NO      ADB SYSTA     YES, IN MAIN PART       SSB,RSS         OF SYSTEM?      JMP ADVAL,I   YES       ADB MAXBA     NO, BELOW       SSB,RSS         UNUSED SWAP AREA?       JMP ADVA1     NO      ADB BPAGA     YES, IN BASE PART       SSB,RSS         OF SYSTEM?      JMP ADVAL,I   YES       ADB INRPA     NO, WITHIN LEGAL      SSB,RSS         INTERRUPT AREA?       JMP ADVA1     NO      ADB LB11      YES,      SSB,RSS         (A) OR (B) ?      JMP ADVAL,I   NOADVA1 LDA L.17      YES       LDB BDADA     PRINT       JSB ASRDA,I     ERROR       LDA LTMP1     DISPLAY ADDRESS       HLT 55B       WAIT FOR REREAD ATTEMPT       JMP L46A,I*                           * **  VALIDATE TRACK NUMBER  ** *                           * * *  ENTER WITH AN INTEGER IN (B).  IF IT IS LESS THAN 64, EXIT WITH*  (B) UNCHANGED; OTHERWISE, PRINT AN ERROR AND RETURN TO LOADER*  SEQUENCE.* PARCK NOP       LDA 1       ADA LM64      TRACK #       SSA             < 64 ?      JMP PARCK,I   YES PARC1 LDA L.13      NO      LDB BADPA     PRINT 'BAD      JSB ASRDA,I     TRACK #'      JMP L22A,I      SKP *                       * **  FIND ADT POSITION  ** *                       * * *  SEARCH THE ADT FOR THE FIRST ENTRY WHOSE DISC ADDRESS IS EQUAL *  TO OR EXCEEDS THE DISC ADDRESS IN LTMP4.  RETURN WITH A POINTER*  TO THIS ENTRY IN (B).* FADTP NOP       LDA LTMP4     2'S COMPLEMENT      CMA,CLE,INA     DISC ADDRESS      STA LTMP0     SAVE IT       LDB ADTBF     INITIAL ADT POINTER FADT1 ADA 1,I       FIRST ADT ENTRY >=      SEZ             TRACK DISC ADDRESS?       JMP FADTP,I   YES       LDA LTMP0     NO, TRY       ADB L.2         NEXT ENTRY      JMP FADT1 *                         * **  ELIMINATE ADT ENTRY  ** *                         * * *  ENTER WITH THE ADDRESS OF THE SCRATCHED ADT ENTRY IN (A) AND (B).*  MOVE THE TABLE BELOW IT OVER IT AND DECREMENT THE ADT LENGTH *  BY 2.* MOVUP NOP       STA SOURC     SAVE SOURCE ADDRESS       ADB LM2       SAVE      STB DEST        DESTINATION ADDRESS       ADA ADLEN     COMPUTE       CMA,INA         NUMBER OF       ADA ADTBF         ENTRIES       CMA,INA             TO BE       ARS                   MOVED       STA MCNTMOVU1 DLD SOURC,I   MOVE      DST DEST,I      ENTRY       LDA SOURC     UPDATE      STA DEST      ADA L.2         ADDRESSES       STA SOURC       ISZ MCNT      DONE?       JMP MOVU1     NO      ISZ ADLEN     YES, REDUCE TABLE LENGTH      ISZ ADLEN       BY ONE ENTRY      JMP MOVUP,I       SKP *                       * **  CHECK FOR A DIGIT  ** *                       * * *  ENTER WITH A CHARACTER IN (A).  IF IT IS A DIGIT, RETURN TO*  (P+2) WITH THE BINARY DIGIT IN (A) AND (B).  OTHERWISE, RETURN *  TO (P+1) WITH THE CHARACTER IN (A).* DIGCK NOP       LDB 0         ASCII       ADB LD72        72 OCT OR       SSB,RSS           GREATER?      JMP DIGCK,I   YES       ADB LB12      NO, ASCII 57 OCT      SSB             OR LESS?      JMP DIGCK,I   YES       LDA 1         NO      ISZ DIGCK       JMP DIGCK,I *                           * **  FETCH INPUT CHARACTER  ** *                           * * *  RETURN TO (P+2) WITH THE NEXT NON-BLANK CHARACTER FROM THE INPUT *  RECORD IN (A).  IF A CARRIAGE RETURN IS FOUND, RETURN TO (P+1) *  WITH IT IN (A).* GETCR NOP       LDB BADDR     LOAD CHARACTER POINTER      ISZ BADDR     ADVANCE IT      CLE,ERB       LOAD      LDA 1,I         WORD      SEZ,RSS       ADJUST AS       ALF,ALF         NECESSARY       AND LB377     MASK OFF CHARACTER      CPA BLANK     BLANK?      JMP GETCR+1   YES, IGNORE IT      CPA LB15      NO, CARRIAGE RETURN?      JMP GETCR,I   YES, EXIT TO (P+1)      ISZ GETCR     NO, EXIT      JMP GETCR,I     TO (P+2)*                              *                                 [F]**  GET MAG TAPE SELECT CODE  **                                 [F]*                              *                                 [F]*                                                                [F]*  REQUEST MAG TAPE SELECT CODE.  IF THE ANSWER IS A CARRIAGE    [F]*  RETURN, INDICATING PAPER TAPE RELOAD, RETURN TO (P+1).        [F]*  OTHERWISE, LOOK FOR A SELECT CODE IN [16 OCT, 76 OCT]. A "*"  [F]*  FOLLOWING THE SELECT CODE DESIGNATES THE MAG TAPE CONTROLLER  [F]*  AS A 7970 TYPE. EXIT TO (P+2) AFTER FINDING A VALID SELECT    [F]*  CODE.                                                         [F]*                                                                [F]GETMT NOP                                        [F]      LDA L.24      ASK                          [F]      LDB MTSCA       FOR       JSB ASRDA,I       MAG TAPE                 [F]      CLA                 SELECT      JSB ASRDA,I           CODE                 [F]      JSB GETCR     EMPTY INPUT RECORD?          [F]      JMP GETMT,I   YES, PAPER TAPE RELOAD       [F]      JSB SELCD     GET SELECT CODE              [F]      OCT 61          IN [16 OCT, 76 OCT]       JMP GETMT+1   NOT FOUND                    [F]      STB MTFLA,I   FOUND, SET FLAG TO 'MAG TAPE'[F]      CPA LB15      CARRIAGE RETURN FOLLOWS?     [F]      JMP GTMT3     YES                          [F]      CPA STAR      NO, ASTERISK?                [F]      JMP GTMT2     YES                          [F]GTMT1 LDA L.21      NO, OUTPUT                   [F]      LDB ILSCL       ERROR                      [F]      JSB ASRDA,I       MESSAGE                  [F]      JMP GETMT+1   REQUEST AGAIN                [F]GTMT2 JSB GETCR     CARRIAGE RETURN FOLLOWS?     [F]      RSS           YES                          [F]      JMP GTMT1     NO                           [F]      LDA MTFLA,I   FLAG                         [F]      IOR SGNBT       AS                         [F]      STA MTFLA,I       7970                     [F]GTMT3 ISZ GETMT                                  [F]      JMP GETMT,I                                [F]      HED CONSTANTS, TEMPORARIES, ETC.LM129 DEC -129LM64  DEC -64 LD77  OCT -77 LD72  OCT -72 LM8   DEC -8LM4   DEC -4LM2   DEC -2LM1   DEC -1L.2   DEC 2 L.3   DEC 3 LB11  OCT 11L.10  DEC 10LB12  EQU L.10L.13  DEC 13LB15  EQU L.13L.15  DEC 15L.17  DEC 17L.20  DEC 20L.21  DEC 21L.23  DEC 23L.24 DEC 24                                      [F]L.39  DEC 39LB54  OCT 54LB60  OCT 60LB100 OCT 100 LB377 OCT 377 LB400 OCT 400 INF   OCT 77777 SGNBT OCT 100000                                 [F]MXADT DEC -5440 BLANK OCT 40STAR  OCT 52        '*'                          [F]DASH  OCT 55        '-' B6400 OCT 6400      CARRIAGE RETURN - NULLBMASK OCT 1,2,4,10,20,40,100,200,400,1000       OCT 2000,4000,10000,20000,40000,100000* MAXAD OCT 140100SYSTA ABS 37700B-14000B MAXBA ABS 14000B-2000BBPAGA ABS 2000B-200BINRPA ABS 200B-13B* ADTBF DEF ADTBL     ADT BUFFER ADDRESSLTRAX DEF TRAX      ADDRESS OF AVAILABLE TRACK TABLELDTBL DEF DTBL      DISC SELECT CODE TABLE ADDRESSBMSKA DEF BMASK     ADDRESS OF BIT MASK TABLE EBUFA DEF EBUF      ADDRESS OF ERROR BUFFER ASRDA DEF TTY35     ADDRESS OF TTY DRIVER MTSCA DEF MTSC                                   [F]MTFLA DEF MTFLG                                  [F]L22A  DEF LDR22 L46A  DEF LDR46 ERR5A DEF ERR5ERR7A DEF ERR7TMP1A DEF TEMP1 TMP2A DEF TEMP2       SKP LTMP0 BSS 1 LTMP1 BSS 1 LTMP2 BSS 1 LTMP3 BSS 1 LTMP4 BSS 1 LTMP5 BSS 1 LTMP6 BSS 1 MFLAG BSS 1         LOCK/UNLOCK MODE FLAG DEST  BSS 1 SOURC BSS 1 MCNT  BSS 1 BADDR BSS 1         POINTER TO NEXT INPUT CHARACTER * BDDLA DEF BDDLILSCL DEF ILSCD ILTRA DEF ILTRL BDADA DEF BADAD BADDA DEF BADDBADPA DEF BADPTRKNA DEF TRKNL * ILTRL OCT 5111      ASC 10,LLEGAL TRACK LENGTH      OCT 6400BADAD OCT 5111      ASC 7,LLEGAL ADDRESS      OCT 6400BADD  OCT 5102      ASC 7,AD DISC NUMBER      OCT 6400BADP  OCT 5102      ASC 5,AD TRACK #      OCT 6400TRKNL OCT 5103      ASC 9,ANNOT LOCK TRACK #      SPC 5 *                                                [F]