      LDA .C9Z
      STA F3D      PUT ADDR IN CALL 
* 
      ISZ C9R 
* 
      LDA C9R,I 
      STA C9Y          STORE IT IN C9Y. 
      LDA C9Z     GET TRACK # 
      SZA 
      LDA .C9Y
      STA F3E 
* 
* MUST PUT SYSTEM TO CORRECT USER DISC
* 
      LDA C9Y 
      LDB C9Z     GET TRACK # 
      SZB,RSS     DONT SKIP UNLES ITS THERE 
      JMP FP        NO SO IGNORE
* 
      LDB A 
      AND M377$       (377 OCTAL) 
      STA C9Y     SET SECTOR
* 
      LDA B 
      ALF,ALF 
      AND M377$      (377 OCTAL)
      STA F4H      STORE USER SUBCHAN 
* 
      CPA CUDSC     IS SAME AS CURRENT? 
      RSS          YES SO SKIP
      JSB F5      CHANGE USER DISC
* 
* 
* 
* 
* ALL PARAMS NOW STORED SO SET RETURN ADDR
* 
FP    LDA .F3B
FN    LDB A,I       GET PARAM 
      SZB,RSS       IS PRESENT
      JMP FM        NO
      INA           YES  SO INCR
      JMP FN        GO VACK 
* 
* PUT RETURN ADDR IN EXEC CALL
* 
FM    STA F3G 
* 
* CALL NOW COMPLETE SO SET LU TABLE 
      ISZ C9R 
      LDA C9R,I 
      IOR FH         SET PARAM LOCK BIT 
      IOR F1B          & SEG # IN LU TABLE. 
      LDB .CLU
      INB 
      STA B,I 
* 
* 
* LU TABLE NOW UP TO DATE SO INITIATE CALL
      JSB F3
* 
* NOW UPDATE PQ 
* 
* THE POINTER FCPQ MUST BE UPDATED
* 
      LDA =LPQL     LENGTH OF PQ ENTRY
      CMA,INA       MAKE -VE
      LDB FCPQ      GET ADDR
      STB FL        SAVE IT 
      ADA B         GET NEW CURRENT ADDR
      STA FCPQ      SAVE
* 
* MOVE NEXT ENTRY 
      LDA FL
      ADA =LPQL     ADD PQ ENTRY LENGTH 
      LDB CPQE       GET LAST FULL ENTRY POINTER. 
      ADB =LPQL 
      STB FS        SAVE
* 
* NOW MOVE THE QUEUE
* 
FT    CPA FS        ALL DONE
      JMP FU        YES 
      LDB A,I       GET WORD
      STB FL,I
      INA 
      ISZ FL        ALL MOVED 
      JMP FT        NO
* 
*   UPDATE PQ POINTER 
* 
FU    LDA PQC,I      DECREMENT PQ ENTRY COUNT 
      ADA N01$          BY 1. 
      STA PQC,I 
      LDA CPQE       DECREMENT ADDRESS BY 9.
      ADA =D-9
      STA CPQE
* 
* 
      JMP FDT 
* 
C9A   NOP 
C9H   NOP 
C9R   NOP 
C9Y   NOP 
.C9Y  DEF C9Y 
C9Z   NOP 
.C9Z  DEF C9Z 
      HED ***ROUTINE F1 - CHECK FOR FREE LU - 10/74***
************************************************                   C
*                                              *                   C
* CHECK LU TABLE ENTRY FOR NON-BUSY            *                   C
*  IF DEVICE IS FREE, CHECK FOR A LOCK         *                   C
*   IF DEVICE IS LOCKED, CHECK FOR TASK        *                   C
*   ID MATCH (USER PARAM)                      *                   C
*                                              *                   C
* EXIT:  (B) = 0 IF REQUEST IN PENDING         *                   C
*                QUEUE CAN BE PERFORMED -      *                   C
*                DEVICE IS FREE & UNLOCKED OR  *                   C
*                DEVICE IS FREE & LOCKED FOR   *                   C
*                THIS TASK                     *                   C
*        (B) # 0 IF REQUEST CANNOT BE PERFORMED*                   C
*                DEVICE IS BUSY OR             *                   C
*                DEVICE IS FREE BUT LOCKED FOR *                   C
*                ANOTHER TASK                  *                   C
*                                              *                   C
************************************************                   C
*                                                                  C
F1    NOP                                          C
      CLA                                          C
      STA F1B       CLEAR LOCK BIT                 C
      LDA FCPQ      GET ADDR CURRENT PQ ENTRY      C
      ADA P02$      GET ADDR OF CONTROL WORD       C               C
      LDA A,I                                      C               C
      AND M77$      GET LOGICAL UNIT               C               C
      CPA P03$                                     C
      LDA P02$                                     C
      LDB A                                        C
      JSB LAD       GET LU TABLE ENTRY FOR THIS LU C               C
*                                                                  C
      LDB .CLU,I    GET LUT ENTRY WORD 1           C               C
      SZB,RSS       FREE & UNLOCKED?               C               C
F1A   JMP F1,I      YES, RETURN - CALL IS OK       C               C
*                                                                  C
      INB,SZB       THIS LU BUSY?                  C
      JMP F1A       YES, RETURN - SKIP THIS LU     C               C
*                                                                  C
* THIS DEVICE FREE BUT LOCKED -                                    C
*  CHECK THE USER PARAM (TASK ID)                                  C
*                                                                  C
      LDA LULM                                     C               C
      STA F1B       SET LOCK BIT                   C               C
      LDA FCPQ                                     C               C
      ADA P08$      GET ADDRESS OF PQ ENTRY WORD 9 C               C
      LDA A,I       USER ID/SEG#                   C
      ALF,ALF                                      C
      AND M377$     GET USER(TASK) ID (0-255)      C
      STA F1C       SAVE THE PARAM                 C
*                                                                  C
      LDA .CLU                                     C
      ADA =LLUSN    GET ADDR OF LUT WORD 2         C
      LDA A,I       USER ID/LOCK/SEG#              C
      ALF,ALF                                      C
      AND M377$     GET TASK ID (0-255)            C
      CCB                                          C
      CPA F1C       THIS TASK?                     C
      CLB           YES, CALL IS OK                C
      JMP F1A       RETURN                         C
      HED *** ROUTINE F3, INITIATE TRANSFER AND UPDATE CQ *** 
* 
* 
* 
* THE PARAMETERS USED MUST BE SET UP BEFORE THIS
* 
* ROUTINE IS CALLED 
* 
F3    NOP         ENTRY POINT 
* DO IT UNLESS ITS FOR PHANTOM LU    LU=3 
      LDA F3A      GET CONWD
      AND M77$        MASK LU 
      CPA M77$       IS IT 77B  
      JMP F3F        YES SO SKIP EXEC CALL
      JSB EXEC
F3G   NOP 
.CEC  DEF CEC        ADDRESS OF CURRENT EXEC CALL.
.F3A  DEF F3A 
F3B   NOP           BUFF ADDR 
F3C   NOP           BUFF LENGTH 
F3D   NOP 
F3E   NOP 
F3F   NOP         FOR DUMMY 
* 
* UPDATE DEBUG TABLE
* 
      ISZ TB7       # OF I/O STARTED
      NOP 
      LDA F3A 
      AND M77$
      CPA P02$     IS FOR DISK (LU=2) 
      ISZ TB2       INCR.COUNT
      NOP 
      CPA P03$     IS FOR DISK (LU=3) 
      ISZ TB2       INCR. COUNT 
      NOP 
* 
* NOW UPDATE CURRENT QUEUE (CQ) 
      LDB C9A      GET PRIORITY 
      BLF,BLF      ROTATE 
      LDA F3A      GET CONWD
      AND M377$      MASK LU
      IOR B        OR IN PRIORITY 
      STA F3A      SAVE CQ ENTRY
* 
* NOW PUT IN CORRECT PLACE IN CQ
* 
      LDA .CQ 
      STA C9R     SAVE START OF CQ
F3WA  LDA C9R,I   GET ENTRY 
      LDB C9R         IS IT LAST ENTRY
      CPB CCQE       IF SO ENTER IT 
      JMP F3W        GO DO IT 
      ALF,ALF 
      AND M377$      MASK PRIORITY
      CMA         NEGATE AND ADD ONE
      ADA C9A 
      SSA,RSS         IS A LOWER PRIORITY 
      JMP F3Y     YES 
* 
      ISZ C9R        MOVE POINTER 
      JMP F3WA   GO CHECK NEXT ENTRY
* 
* NOW MOVE THE LOW PRIORITY ENTRIES DOWN ONE
* 
F3Y   LDA CCQE    ADDR OF LAST ENTRY
      STA F3B 
      ADA N01$    SUB TRACT ONE 
F3CR  LDB A,I    GET ENTRY
      STB F3B,I  MOVE IT
      LDB C9R 
      CPB A      ALL DONE?
      JMP F3W   YES 
      LDB F3B 
      ADB N01$     MOVE POINTER 
      STB F3B 
      ADA N01$     MOVE POINTER 
      JMP F3CR    MOVE NEXT ENTRY 
* 
* 
F3W   LDA F3A   GET ENTRY 
      STA B,I 
      ISZ CCQE   MOVE Q POINTER 
      JMP F3,I         RETURN 
* 
* CONSTANTS FOR F (EXCEPT F4) 
* 
.F3B  DEF F3B 
F3A   NOP           FOR CONWD 
FCPQ  NOP           FOR CURRENT PQ ENTRY
F1B   NOP           FOR LOCKED FLAG FROM F1 
F1C   NOP           FOR SEG # FROM F1 
FH    NOP           FOR LOCK FLAG 
FL    NOP           FOR COUNT FOR LOOP
FS    NOP           TEMP
      HED ***ROUTINE F4***
* THIS SECTION CONVERTS REQ CODES 14 AND 15 TO -1 AND -2
* 
F4    NOP     ENTRY POINT 
* 
* UPDATE DEBUG TABLE
* 
      ISZ TB3 
      NOP 
      LDA CREQ     CHANGE REQ CODE- 
      ADA =D-13       TO -1 
      CMA,INA          OR-
      STA CREQ          -2
      STB F4Y     SAVE POINTER
      STA CTT     SAY ITS A FILE REQ. 
* 
* 
* FIND USER PARAMS (FILE #  + REL SECTOR) 
* 
F4B   LDB ARG5,I    GET FILE #
      LDA ARG6,I    GET SECTOR #
      STA F4D       STORE SECTOR #
* 
* SEE IF SECTOR IS -VE
* 
      SSA           IS -VE
      JMP F4L       YES SO ERROR
* 
* NOW GET FILE INFORMATION
* 
      LDA B 
      ADA N01$       SUB 1  
      MPY =LUFDS    USER FILE DIREC LENGTH
      SSA        FILE # ZERO OR NEG?
      JMP F4L    YES, REJECT. 
      ADA .FD       ADD ADDRESS OF FILE DIREC 
      STA F4E 
* 
* CHECK FOR OPENED FILE 
* 
      LDB A,I    GET TRACK/SECTOR 
      SZB,RSS    IS OPENED? 
      JMP F4L     NO SO ERROR 
* 
* CHECK REQUEST IS WITHIN FILE
* 
      LDA ARG4,I    GET BUFFER LENGTH 
      CLB 
      DIV =D128     CONVERT TO SECTORS
      SZB,RSS       TAKE CARE OF PARTIAL- 
      ADA N01$       SECTORS  
      STA B         SAVE # OF SECTORS 
* 
      LDA F4E 
      ADA P02$     ADD 2 TO ADDR  
      LDA A,I      GET FILE LENGTH
      CMA,INA 
      ADA ARG6,I   ADD REQUESTED SECTOR 
      ADA B         # OF SECTORS TO ACCESS
      SSA          IS WITHIN FILE?
      JMP F4R      YES
* 
F4L   LDA ERR5
      STA RST     SET ERROR STATUS
      LDA TCS   NOW SET RETURN- 
      STA FRET  POINT 
F4ZZ  JMP F4,I       EXIT 
* 
* NOW GET STARTING SECTOR OF FILE 
* 
F4R   LDA F4E,I 
      AND M377$ 
* 
* ADD REQ SECTOR
* 
      ADA F4D 
* 
* CHANGE TO TRACK AND SECTOR
* 
      CLB 
      DIV SECTR       #OF SECTORS PER TRACK.  
* 
* A CONTAINS TRACK OFFSET, B CONTAIN SEC #
* 
      STA F4F     TRACK OFFSET
      LDA F4E,I     GET TRACK SECTOR
      ALF,ALF 
      AND M377$       MASK TRACK
      ADA F4F       ADD OFFSET
      STA ARG5    STORE 
* 
      ISZ F4E 
      LDA F4E,I    GET SUBCHAN
      ALF,ALF       ROTATE
      IOR B     OR IN SECTOR
      STA ARG6     STORE
* 
      LDB F4Y 
      JMP F4ZZ      GO TO EXIT
      HED *** ROUTINE F5, CHANGE USER DISC*** 
* 
* NOW MAKE EXEC CALL TO CHANGE USER DISC
* 
F5    NOP   ENTRY POINT 
* 
* SAVE INFO SO NEXT TIME WE CAN DO IT QUICKLY 
* 
      LDB .FBUF    GET BUFFER ADDR. 
      ADB CUDSC      ADD CURRENT UD 
      LDA UDNTS   GET NEXT UD TRK/SECT  
      STA B,I       SAVE IT 
      ADB P32$      GET TO 2ND HALF OF TABLE(7905)
      LDA DISCL    GET TRK/SECT OF DISC LABEL 
      STA B,I      SAVE IT
* 
      LDA F4H       GET REQ'D UD
      ADA .FBUF     ADD BUFFER ADDR.
      STA FBUD      SAVE ADDR 
      LDA A,I      IF WE CAN DO THIS IN CORE- 
      INA,SZA      THEN DO SO. CAN ONLY DO IT-
      JMP FHA     IF WE'VE DONE THIS DISC BEFORE
* 
* MUST CHANGE USER DISC VIA EXEC CALL 
* 
      JSB EXEC
      DEF *+5 
      DEF .23 
      DEF F4D 
      DEF F4H 
      DEF .1
F5E   JMP F5,I       EXIT 
* 
* 
* COME HERE IF WE CAN CHANGE USER DISC WITHOUT GOING TO THE DISC
* 
FHA   LDB FBUD
      LDA B,I    GET USER DISC TRK/SECT 
      ADB P32$      RESET TABLE POINTER   (7905)
      STB FBUD
      LDB F5A1
      JSB FMOV     PUT ON BASE PAGE 
* 
      LDA FBUD,I  PUT NEW TRK/SECT- 
      LDB F5A2     FOR LABEL ON BASE PAGE 
      JSB FMOV
* 
      LDA M377$      SET "CUDLA"
      LDB F5A4    TO 377B 
      JSB FMOV
* 
      LDA F4H      GET UD # 
      LDB F5A5
      JSB FMOV
* 
      JMP F5E      GO TO EXIT 
* 
* 
FBUD   NOP
.FBUF DEF FBUF
FBUF  REP 64        32 SUBCHANNELS MAX   (7905) 
      DEC -1
* 
F5A1  OCT 157 
F5A2  OCT 200 
F5A4  OCT 163 
F5A5  OCT 161 
* 
* PUT A WORD ON BASE PAGE 
* 
FMOV  NOP          ENTRY POINT
      JSB EXEC
      DEF *+2 
      DEF BEJ 
      JMP FMOV,I
* 
* 
F4D   NOP           FOR REL SECT #
F4E   NOP           FOR USER FILE DIREC ADDR
* 
F4Y   NOP 
F4F   NOP 
F4H   DEC -1        FOR UD
.23   DEC 23
P32$  DEC 32                           (7905) 
.1    EQU 54B 
C9V   NOP 
.C9V  DEF C9V 
      HED ***ROUTINE LAD*** 
* 
*   ENTER  -  BREG = LU #.
* 
*   EXIT   -  BREG = LU#. 
*             AREG = LU ENTRY ADDRESS.
*             .CLU = LU ENTRY ADDRESS.
* 
LAD   BSS 1          ENTRY POINT. 
      STB LAD1
      LDA B 
      CPA M77$       IS IT PHANTOM LU?  
      LDA P03$      YES SO USE LU 3 TABLE 
      ADA N01$          (-1). 
      MPY =LLUL 
      ADA .LU 
      STA .CLU
      LDB LAD1
      JMP LAD,I 
* 
LAD1  BSS 1 
      SPC 5 
* 
*   ENTER  -  BREG  = LU #. 
* 
*   EXIT   -  BREG  = LU #. 
*             AREG  = STATUS. 
*             SC3   = STATUS. 
*             SC4   = TLOG. 
* 
SCHK  BSS 1          ENTRY POINT. 
      STB SC2 
      JSB EXEC       EXEC CALL FOR STATUS.
      DEF *+5 
      DEF SC1 
      DEF SC2 
      DEF SC3 
      DEF SC4 
      LDB SC2 
      JMP SCHK,I     EXIT.
* 
SC1   DEC 13         REQUEST CODE FOR STATUS. 
SC2   BSS 1          BUFFER FOR LU #. 
SC3   BSS 1          BUFFER FOR STATUS. 
SC4   BSS 1          BUFFER FOR TLOG. 
      HED ***ROUTINE A*** 
ACOD  BSS 1          ENTRY POINT
*   CHECK FOR UNLOCK REQUEST. 
      LDA ARG1,I     UNLOCK (CODE = 52)?
      CPA =D52
      RSS 
      JMP A15          NO. GO TO A15. 
      LDA TCS        YES SET UP-
      STA FRET          RETURN ADDRESS
      LDB ARG2,I     GET LU #.
      CPB P03$     IS LU# 3?
      LDB P02$     YES SO CHANGE TO 2 
* 
      JSB LAD        GET LU TABLE ENTRY ADDRESS.
      ADA =LLUSN
      LDA A,I 
      ALF,ALF       GET LUT TASK ID                C
      AND M377$                                    C
      CPA RPAR      CORRECT TASK?                  C
      JMP A10          YES. 
      LDA ERR7      GET ERROR 7 CODE
      JMP A12 
A10   LDB .CLU       CLEAR LOCKED CONDITION.
      INB 
      LDA B,I 
      AND LULC         CLEAR BIT 7 OF 2ND 
      STA B,I            WORD OF LU ENTRY.
      LDA .CLU,I       IF 1ST WORD = -1,
      INA,SZA,RSS        THEN SET IT TO 0.
      STA .CLU,I
      CLA 
A12   STA RST      STORE USER STATUS
      JMP A24 
* 
*   CHECK FOR IN-LINE RETURN TO MAIN REQUEST. 
A15   CPA =D54       RETURN TO MAIN (CODE = 54)?
      JMP A20          YES. 
      JMP A25          NO. SET ERROR STATUS, EXIT.
A20   LDA CMR        SET UP RETURN ADDRESS
      LDB MORS         AND FLAG.
      SZB 
      LDA TCS 
      STA FRET
      CCA            SET CURRENT SEGMENT ADDRESS
      STA MORS         TO -1 TO INDICATE THE MAIN.
      CLA 
      STA RST    CLEAR STATUS 
      STA CMR 
      STA PRIOR 
* 
*   ALL EXITS COME THRU A24 (REQUEST DONE) AND A25 (REQ. NOT DONE). 
*   AREG = 0 (DONE, GOOD OR BAD), AREG = -1 (NOT DONE). 
A24   CLA,RSS 
A25   CCA 
      JMP ACOD,I
      HED ***ROUTINE E*** 
      SPC 4 
* 
* 
*   ECOD SEARCHES THE CQ BUFFER FROM THE TOP FOR
*   A FINISHED TRANSFER.   THIS WILL BE THE OLDEST
*   FINISHED TRANSFER.  THE ENTRY IS DELETED & THE
*   REMAINING ENTRIES IN CQ ARE MOVED UP BY ONE.
* 
      SPC 2 
ECOD  BSS 1          ENTRY POINT. 
      LDA .CQ        .CCQ := CQ POINTER.
      STA .CCQ
      RSS 
      SPC 1 
EC1   ISZ .CCQ       ADVANCE THE CQ POINTER.
      LDB .CCQ,I     IS TESTING CQ
      SZB,RSS          DONE (ENTRY = 0) ? 
      JMP EC25           YES.  EXIT.
      SPC 1 
* GET LU# 
* 
      LDA B 
      AND M77$      MASK LU#
      LDB A 
      CLA           CLEAR STATUS
      CPB M77$      IS IT PHANTOM LU? 
      RSS          YES SO OMIT STATUS CHECK 
      JSB SCHK       NOT DONE.  DO STATUS CHECK.
      STA RST 
      AND =B100000
      SZA     IS DEVICE BUSY
      JMP EC1          YES.  CHECK NEXT ENTRY.
      LDA SC4        SET UP RETURN LOG IN CASE
      STA RLOG         A RETURN IS POSSIBLE.
* 
* 
      SPC 1 
*   FOUND A FINISHED TRANSFER.  BREG = LU #.
*   MUST CHECK TO SEE IF RETURN TO ORIGINAL CALLING 
*   SEGMENT IS POSSIBLE.  SET UP SOME OF THE RETURN 
*   PARAMETERS IN CASE A RETURN IS POSSIBLE.
* 
      STB RLU 
      CPB P03$        IS IT LU 3? 
      LDB P02$        YES SO CHANGE TO 2  
* 
      JSB LAD        GET LU ENTRY ADDRESS.
      STA RSDA
      ADA =LLUSN     ISOLATE THE
      LDA A,I          SEGMENT #. 
      STA RPAR
      AND M177$            (177B).
      STA RS# 
      SZA    SKIP IF MAIN 
      CPA SEG       SEGMENT IN CORE?
      JMP EC10         YES.  SET UP RETURN. 
      LDB P02$          (+2). 
      JSB SCHK       CHECK DISC STATUS. 
      SSA            DISC FREE ?
      JMP EC1          NO.  CHECK NEXT ENTRY. 
      SPC 2 
*   TRANSFER FINISHED AND RETURN POSSIBLE.
*   SET UP RETURN PARAMETERS. 
* 
EC10  CCA            SET RETURN FLAG TO -1
      STA RFLG         TO INDICATE RETURN NECESSARY.
* 
* UPDATE DEBUG TABLE
* 
      ISZ TB8 
      NOP 
      LDA RSDA,I     SET UP FINAL 
      STA FRET         RETURN ADDRESS.
* 
*   FREE THE LU DEVICE. 
* 
      LDA RPAR       CHECK LOCKED CONDITION,
      ALF,ALF          AND SET APPROPRIATE
      STA B              (KEEP PARAM IN AREG) 
      SSB,RSS            "FREE" CONDITION CODE
      CLB,RSS              IN LU TABLE. 
      CCB 
      STB RSDA,I
*   CONTINUE SETTING UP RETURN PARAMETERS.
* 
      AND M377$        ISOLATE PASSED PARAMETER AND 
      STA RPAR         STORE IT IN RPAR.
      LDB RSDA       SET UP RETURN
      ADB =LLUMR       TO MAIN ADDRESS. 
      LDA B,I 
      STA CMR 
      LDA RS#        GENERATE SEGMENT 
      SZA,RSS     IS REQ FOR MAIN?
      JMP ER2      YES SO DONT LOAD SEGMENT 
      ADA N01$          DIRECTORY ADDRESS 
      MPY =LSDL   AND STORE IT IN RSDA
      ADA .SD 
      STA RSDA
* 
      CPA CSEG       SEG ALREADY IN?
      JMP ER2       IF SO JUMP
      JSB B3         NO SO LOAD IT
* 
*   DELETE ENTRY FROM CQ. 
* 
* 
ER2   CCB          SET MAIN FLAG
      LDA RS#      GET SEG #
      SZA          IS RETURN TO MAIN? 
      CLB          NO SET SEG FLAG
      STB MORS     SET FLAG 
* 
* RESTORE PRIORITY TO WHAT IT WAS WHEN THIS I/O CALL WAS MADE 
* 
      LDA .CCQ,I    GET CQ ENTRY
      ALF,ALF       ROTATE
      AND M377$     MASK PRIORITY 
      STA PRIOR     RESTORE IT
      LDA CCQE     SUB 1 FROM CQ- 
      ADA N01$          POINTER BY 1. 
      STA CCQE
      LDB .CCQ
EC12  LDA B          MOVE THE CQ TABLE
      INA              UP, ONE BY ONE.
      LDA A,I 
      STA B,I 
      CPB CCQE
      JMP EC18
      INB 
      JMP EC12
EC18  CLA            ZERO LAST USED ENTRY.
      STA B,I 
* 
*   ALL EXITS COME THROUGH EC25.
* 
EC25  JMP ECOD,I     EXIT.
* 
RLU  NOP
      END TCS 
::
:CO MOUNT TAPE #5, TYPE :GO 
:PA 
              