* 
* GET INITIAL ADDR(DEST) IN B REG 
* 
      LDB ENTR
      INB                                                                  2003 
* 
* NOW MOVE PARAMS 
* 
E5    LDA TEMP3,I        GET PARAM                                      6002,I
IND1  RAL,CLE,SLA,ERA    CHECK FOR INDIRECT 
      JMP INDIR          GO DO IT 
      STA 1,I            STORE PARAM                                    2003,I
      ISZ TEMP3          MOVE ADDR
      CPB TEMP2          ALL DONE 
      JMP E4             YES GOTO EXIT
      INB                MOVE ADDR
      JMP E5             GO DO NEXT 
* 
* SORT OUT INDIRECT PARAMS
* 
INDIR LDA 0,I 
      JMP IND1
* 
* NOW  ALL IS DONE SO EXIT
* 
E4    LDA ENTR,I    GET RETURN ADDR 
      LDB ENUM
      JMP 0,I       GO AWAY 
* 
TEMP  NOP 
EPAR  NOP 
ENUM  NOP 
TEMP2 NOP 
TEMP3 NOP 
      HED **** ROUTINE B , THE SEG. LOADER **** 
*****                                                *****
*                                                        *
* ROUTINE B IS USED TO PROCESS USER REQUESTS FOR SEGMENT *
*                                                        *
* LOADS. IT CONTAINS A ROUTINE (B3) WHICH IS USED BY     *
*                                                        *
* OTHER ROUTINES WITHIN TCS.                             *
*                                                        *
*****                                                *****
      SPC 3 
BCOD  NOP            ENTRY POINT. 
      LDA CREQ      GET REQUEST CODE
      CPA P08$        IS SEGMENT LOAD (=8) ?  
      JMP BA        YES 
* 
* REQ. IS NOT VALID SO MAKE REJECT RETURN 
* 
BT    CLA,INA,RSS    NOT-DONE EXIT. 
BB    CLA            DONE     EXIT. 
      JMP BCOD,I     EXIT.
* 
* REQUEST IS VALID CHECK WHETHER SEG IS ALREADY IN CORE 
* 
BA    LDA SEG       GET SEG#
* 
* UPDATE DEBUG TABLE
* 
      ISZ TB4 
      NOP 
      CPA ARG2,I    IS THIS SEG ALREADY IN
      JMP BD        YES 
* 
* TEST FOR VALID SEG. NUMBER. 
* 
      LDA ARG2,I       GET SEG #
      SSA,RSS             <0? 
      CPA P00$            =0? 
      JMP BF              YES, REJECT.
      CMA,INA         MAKE REQ.SEG. -VE 
      ADA NSEG        ADD # OF SEGS 
      SSA,RSS         IS OK?
      JMP BE          YES 
* 
* INVALID SEG # SO SET ERROR RETURN 
* 
BF    LDB ERR4             GET ERROR CODE.
      STB RST      PUT IN RETURN STATUS 
* 
* 
* NOW SET UP EXIT 
* 
      LDA TCS     GET RETURN ADDR.
      STA FRET
      JMP BB
* 
* CHECK WHETHER DISC IS BUSY
* 
BE    LDB P02$  
      JSB SCHK      WAIT TILL LU2 IS FREE 
      SSA 
      JMP BE
      LDA ARG3,I    *PREP FOR PRIORITY PARAM
      STA ARG3      *SAVE POSS. NEW PRIORITY
* 
* 
* GET REQUIRED SEGMENT DIRECTORY ADDR 
      LDA ARG2,I
      ADA N01$       SUBTRACT 1 
      MPY =LSDL      LENGTH OF SEG DIR ENTRYS.
      ADA .SD       ADDR OF SEG TABLE 
      SPC 2 
* 
* NOW HAVE SEG DIREC ADDR IN A REG SO LOAD SEG
* 
      JSB B3
* 
* 
* SET UP FINAL RETURN ADDR. 
* 
BD    LDA B3F,I    SEG. ENTRY ADDR. 
      STA FRET      STORE AS FINAL RETURN 
      LDA MORS       SET THE
      LDB CMR          SEGMENT-TO-MAIN
      SZA                RETURN ADDRESS.
      LDB TCS 
      STB CMR 
      CLA            SET EXECUTING FLAG 
      STA MORS         TO SEGMENT.
* 
* NOW SET PRIORITY IF PRESENT 
* 
      LDB ENUM     GET # OF PARAMS
      CLA 
      CPB P03$    WRER THERE THREE? 
      LDA ARG3      *YES, SO GET PRIORITY 
      AND M17$     ENSURE CORRECT RANGE 
      STA PRIOR   SET PRIORITY
* 
* 
      JMP BB        GO TO RETURN
      HED ***ROUTINE B3***
* 
* 
* ROUTINE B3 IS USED TO LOAD SEGMENTS 
* 
* FIRST GET USER DISC SUBCHAN SO WE 
* CAN RESTORE IT LATER
B3    NOP 
* 
* UPDATE DEBUG TABLE
* 
      ISZ TB5 
      NOP 
      LDB CUDSC 
      STB B3A 
* 
* SAVE DIRECTORY ADDRESS
      STA B3C 
      STA B3B 
      ADA P02$       ADD 2  
      STA B3D       SAVE SUBCHAN ADDR 
      LDB A         SAVE IN B 
      LDA A,I 
      AND M37$      MASK SUBCHANNEL    (7905) 
      STA F4H 
      ADB P02$      ADD TWO 
      STB B3X       SAVE ADDR OF LENGTH 
      ADB P05$      ADD 5 
      STB B3F       SAVE ADDR OF SEG START
* 
* NOW CHANGE USER DISC
* 
* IF REQUIRED 
* 
      CPA CUDSC      IS SAME AS CURRENT?  
      RSS           YES SO SKIP 
      JSB F5        GO DO IT
* 
*NOW MOVE PARAMS ONTO BASE PAGE 
* 
      LDA =D-11 
      STA B3G       COUNT 
* 
      LDB B3L 
      STB B3M 
* 
B3K   LDB B3C 
      LDA B,I 
      CPB B3D       IS SUBCHAN PARAM
      JMP B3KK         YES. 
      JMP B3HH         NO.
B3KK  AND =B177740  CLEAR TYPE CODE     (7905)
      IOR P05$        (5) 
B3HH  CPB B3F        IS STARTING ADDRESS ?
      LDA .B3H      SET TO RETURN TO THIS ROUTINE 
      CPB B3X       IS FILE LENGTH
      AND =B7777    YES, MASK OUT PRIORITY
* 
* NOW MOVE TO BASE PAGE 
      LDB B3M 
      JSB FMOV      PUT ON BASE PAGE
      ISZ B3C 
      ISZ B3M 
      ISZ B3G       ALL DONE
      JMP B3K       NO
* 
* 
* 
      JSB EXEC
      DEF *+2 
      DEF B3N 
* 
* SHOULD RETURN HERE WHEN SEG IS LOADED 
* 
*CHANGE USER DISC BACK
* 
B3H   LDA B3A 
      STA F4H       PUT UD IN EXEC CALL 
      CPA CUDSC     IS SAME AS CURRENT? 
      RSS          YES SO SKIP
      JSB F5
* 
* NOW SET UP PARAMS 
* 
      LDA B3B 
      STA CSEG      SAVE DIREC ADDR 
* 
* NOW GET SEG # +SAVE 
* 
      LDB .SD 
      CMB,INB 
      ADA B 
      CLB 
      DIV =LSDL 
      INA 
      STA SEG 
      LDA B3F,I      RESTORE SEGMENT
      LDB =B137        ENTRY POINT TO 
      JSB EXEC           BASE PAGE DIRECTORY. 
      DEF *+2 
      DEF BEJ 
      JMP B3,I
* 
* 
B3A   DEC -1        FOR CURRENT USER DISC 
B3B   NOP           FOR DIREC ADDR
B3C   NOP            FOR SEG DIRECTORY ADDRESS. 
B3D   NOP            FOR SUBCHANNEL ADDRESS.
B3F   NOP 
B3G   NOP 
.B3H  DEF B3H 
BEJ   DEC -19 
B3L   OCT 141 
B3M   NOP 
B3N   DEC -20 
B3X   NOP 
      HED *** ROUTINE C ,THIS CONTAINS E + F  *** 
*****                                              *****
*                                                      *
*  THIS ROUTINE CHECKS FOR I/O CALLS AND PROCESSES     *
*                                                      *
*  VALID ONES. ON EXIT A IS NON-ZERO IF CALL WAS       *
*                                                      *
*  NOT VALID. IF VALID A=0 AND FRET HOLDS RETURN ADDR  *
*****                                              *****
      SPC 3 
CCOD  NOP 
      CLA            INITIALIZE RETURN PARAMETERS.
      STA RFLG
* 
* CHECK IF WE HAVE BEEN INITIALISED 
* 
      LDA .PQ     GET PENDING Q ADDR. 
      LDB ERR6
      SZA 
      CLB 
      STB RST       SET STATUS
      SZA,RSS 
      JMP CGA      GO TO RETURN 
* 
      LDA CREQ      GET USER REQ CODE 
      CPA =D53      IS SUSPEND CALL 
      JMP CN           YES. 
      SPC 1 
* SEE IF IT IS AN I/O REQUEST 
* 
      LDB .CB       GET TABLE ADDR
      STB CC        STORE IT
* 
CF    LDB CC,I      GET A REQ CODE
      SZB,RSS       ALL VALID REQ CODES CHECKED?
      JMP CD        YES SO SET FOR AN INVALID CALL
* 
      CPA B         IS IT THIS CODE 
      JMP CY      YES ITS VALID 
      ISZ CC        INCR ADDR 
      JMP CF        TRY NEXT ONE
* 
* HAVEN'T BEEN INITIALISED SO SET RETURN ADDR.
* 
CGA   LDB TCS 
      STB FRET
      JMP CM
      SPC 1 
* INVALID RETURN POINT
* 
CD    CCA,RSS       SET A=-1
      SPC 1 
* VALID RETURN POINT
* 
CM    CLA 
      JMP CCOD,I     EXIT.
* 
* FIRST SEE IF ITS A FILE REQUEST 
* 
CY    CLA 
      STA CTT       CLEAR FILE FLAG 
* 
* UPDATE DEBUG TABLE
* 
      ISZ TB1 
      NOP 
      LDA CREQ      GET REQUEST CODE
      ADA =D-13     SUBTRACT 13 
      AND =B177774   MASK LAST 2 BITS 
      SZA,RSS       WAS IT A FILE REQUEST?
* 
* IF IT WAS THEN CALL F4 TO CONVERT TO TRACK AND SECTOR 
* 
      JSB F4
* 
* WAS A VALID FILE REQUEST? 
* 
      LDA RST       GET STATUS
      SZA           IS IT STILL CLAER 
      JMP CM         NO IT ISNT 
* PUT REQUEST IN PENDING QUEUE
* 
CE    LDA PQC,I      CHECK FOR PQ OVERFLOW. 
      CPA MAXPQ      OVERFLOW ? 
      JMP CERR
      INA 
      STA PQC,I        NO.  UPDATE PQ ENTRY COUNT.
      LDB CPQE
      ADB =LPQL 
      STB CPQE
* 
* NOW CHECK PRIORITY
* 
      LDA PRIOR 
      SZA          IS IT 0? 
      JSB MU       NO SO SHUFFLE PEND Q.
* 
      LDA CREQ     GET REQ. CODE
      AND =B7777    MAKE ROOM FOR PRIORITY
      ALF 
      IOR PRIOR     PUT IN PRIORITY 
      ALF 
      ALF,ALF       MOVE PRIORITY TO TOP 4 BITS 
      STA B,I       HAVE SET REQ CODE 
      LDA CTT       WAS IT A FILE REQ.
      SZA 
      JMP CTY      YES SO GO ON 
      LDA CREQ      GET REQ CODE AGAIN
* 
* 
      CPA N01$       IF ITS A -1  
      JMP CXX       OR -2 CALL THEN-
      CPA N02$       SAVE A FLAG, IT- 
      JMP CXX       MAY BE WORK AREA. 
* 
CTY   CLA           IT WASN^T SO
CXR   STA CWY       UPDATE FLAG 
* 
CTS   INB 
      LDA CMR       HAVE NOW SET MAIN RETURN ADDR 
      STA B,I 
* 
      INB 
      LDA ARG2,I
      STA ARG2        SAVE
      STA B,I       HAVE NOW STORED CONTROL WORD
* 
      INB 
      STB C9A        SAVE PQ POINTER. 
* 
*   NOW STORE RETURN ADDRESS. 
* 
      LDB TCS     GET RTRN ADDR.
      LDA ARG2      GET CONWD 
      AND =B20000 
      STA C9H 
      SZA,RSS        W/O WAIT ? 
      JMP C9D          YES.  RETURN IN-LINE.
C9B   LDB ENUM
      ADB .ARG1 
      ADB N01$        GET RETURN  
      LDB B,I            ADDRESS FROM IRET. 
      LDB B,I 
C9D   STB C9A,I      STORE RETURN ADDRESS.
* 
C9C   ISZ C9A 
      LDB ENUM
      CLA 
      CPB P03$         ONLY 3 PARAMS? 
      JMP C9W         YES 
* 
      CPB P04$        WERE THERE 4? 
      RSS            YES SO SKIP
      JMP C9X        MUST BE 5 OR MORE
* 
      LDB C9H        WAS IRET ONE OF -
      SZB,RSS        THEM?
* 
C9X   LDA ARG3      GET BUFFER ADDR 
      LDB CREQ      IS AN I/O CONTROL REQ?
      CPB P03$      IF SO GET THE 
      LDA A,I       ACTUAL PARAM
C9W   STA C9A,I     PUT A REG IN PQ.
* 
* 
      ISZ C9A 
      CLA 
      LDB CREQ
      CPB P03$        IS I/O CONTROL ?  
      JMP C9E       YES SO GO ON
      LDA ARG4,I     GET BUFFER LENGTH. 
C9J   STA C9A,I 
* 
      ISZ C9A       MOVE POINTER
* 
      LDA ENUM
      CMA,INA 
      ADA P06$        TEST FOR GREATER THAN 6 PARAMETERS
      SSA,RSS 
      JMP C9T 
* 
      LDB CTT     GET FILE FLAG 
      LDA ARG5
      SZB,RSS     IS THAT THE TRACK ? 
      LDA ARG5,I      STORE TRACK AND SECTOR
      STA C9A,I 
* 
      ISZ C9A 
* 
      LDA ARG6
      SZB,RSS 
      LDA ARG6,I
      LDB CWY         IF IT WAS-
      SZB,RSS         A -1 OR -2 -
      JMP C9G        CALL THEN PUT SYSTEM DISC- 
      LDB SYSSC         IN
      BLF,BLF         REQUEST 
      AND M377$     *STRIP SUBCHAN
      IOR B         *MERGE SYS. SUBCHAN 
* 
C9G   STA C9A,I 
      JMP C9F 
* 
C9T   CLA 
      STA C9A,I 
      ISZ C9A 
      JMP C9G 
* 
C9E   LDA ENUM      GET # OF PARAMS 
      LDB C9H 
      SZB           IS W/O WAIT 
      ADA N01$      SUB 1 IF IRET PRESENT 
      ADA N03$      SUB 3 FOR RC,CW,IPAR
      CLB 
      CPA P02$      WERE THERE 2 PARAMS 
      LDB ARG4      YES SO GET ADDR 
      LDA B         PUT IN A REG
      JMP C9J       GO BACK 
C9F   LDA ENUM
      ADA .ARG1      GET ADDRESS OF 
      ADA N01$          THE PARAMETER 
      LDB C9H            IN THE A REG.
      SZB 
      ADA N01$  
      LDA A,I        GET PARAMETER
      LDA A,I 
      AND M377$         (377 OCTAL) 
      ALF,ALF 
      LDB MORS       GET EXECUTING FLAG 
      SZB,RSS        SKIP IF ITS MAIN 
      IOR SEG        ADD SEGMENT #. 
      ISZ C9A 
      STA C9A,I 
* 
* NOW SEE IF REQUEST WAS W/O WAIT 
* 
      LDA C9H         IS REQ WITH-
      SZA             WAIT? 
      JMP CJ          NO
* 
* 
*   THIS THE MAJOR I/O CHECKING AND INITIATION LOOP.
*   IT IS ALSO THE SUSPEND LOOP.
* 
CN    JSB ECOD       CHECK CQ FOR A COMPLETE I/O. 
CP    JSB FCOD       INITIATE ALL POSSIBLE I/O. 
CZ    LDA RFLG      IS THERE ANY
      SZA              RETURN YET ? 
      JMP CM             YES.  EXIT THRU CM.
      JMP CN             NO.   STAY IN THE LOOP.
* 
* FIND CORRECT PLACE IN PENDING QUEUE 
* 
MU    NOP        ENTRY POINT
      LDA .PQ     GET PENDING Q ADDR. 
      LDB A 
      STA C9A       SAVE
* 
MV2   CPB CPQE      ALL DONE? 
MV    JMP MU,I      YES SO EXIT 
      LDA C9A,I    GET RCODE & PRIORITY 
      ALF           MOVE PRIORITY TO LSD BITS 
      AND M17$       MASK PRIORITY  
      CMA           NEGATE AND ADD ONE
      ADA PRIOR     ADD THIS PRIORITY 
* 
      SSA,RSS      IS A LOWER PRIORITY? 
      JMP MV1      YES
* 
      LDB C9A     NOW CHECK NEXT ONE
      ADB =LPQL 
      STB C9A 
      JMP MV2     GO CHECK IT 
* 
* NOW MOVE LOW PRIORITY ENTRIES IN PENDING
* QUEUE DOWN ONE, TO MAKE ROOM FOR THIS ONE 
* 
MV1   STB C9A     SAVE ADDR OF CURRENT ENTRY
      LDA CPQE    GET ADDR OF FREE ENTRY
      STA CMF     SAVE
      STA C9R     AND AGAIN 
* 
CMT   ADA PQLM         -VE LENGTH OF PENDING Q
CMG   LDB A,I 
      STB C9R,I      MOVE-
      INA             ONE - 
      ISZ C9R          ENTRY- 
      CPA CMF           IS DONE?
      RSS           YES 
      JMP CMG       NOT YET MOVE NEXT WORD
* 
      ADA PQLM      MOVE POINTER BACK 
      STA CMF 
      STA C9R 
      LDB C9A      GET REQ'D ENTRY
      CPA C9A      ALL MOVED? 
      JMP MV       YES SO EXIT
      JMP CMT       NOW MOVE NEXT ENTRY 
* 
      SKP 
* 
*   SET UP I/O-WITHOUT-WAIT RETURN PARAMETERS.
* 
CJ    LDA TCS     GET ADDR OF USER DEF *+N
      STA FRET       STORE AS FINAL RETURN. 
      CLA,INA 
      STA RFLG       SET RETURN FLAG. 
      JMP CP         GO INITIATE ALL POSSIBLE I/O.
* 
* 
* 
.CB   DEF CB
CB    DEC 3 
      DEC 1 
      DEC 2 
      DEC -1
      DEC -2
      DEC 14
      DEC 15
      DEC 0 
CC    NOP           TEMP
* 
* COME HERE IF PENDING QUEUE IS FULL
* 
CERR  LDA ERR2
      STA RST 
      LDA TCS      SET UP RETURN- 
      STA FRET     ADDRESS. 
      JMP CM
* 
* 
CWY   NOP 
CTT   NOP 
* 
CXX   CCA 
      JMP CXR 
* 
* 
CMF   NOP 
      HED *** ROUTINE F (INITIATE ALL POSSIBLE I/O ) ***
* 
* 
* 
FCOD  NOP            ENTRY POINT. 
      SPC 1 
* SET UP ADDRESSES FOR PQ EXAMINATION 
      SPC 1 
      LDA .PQ       GET ADDR OF PQ
FB    STA FCPQ      PUT IN TEMPORARY STORAGE
      ADA =D-9
      CPA CPQE
      JMP FW
* 
* CHECK WHETHER LU IS FREE FOR THIS ENTRY 
* 
      JSB F1
      SZB,RSS       IS LU FREE ?
      JMP FA        YES 
      SPC 1 
* THAT LU WASNT FREE SO CHECK NEXT PQ ENTRY 
* 
* FIRST SEE IF ALL ARE DONE 
* 
FDT   LDA FCPQ
      CPA CPQE       LAST ENTRY ? 
FW    JMP FCOD,I       YES. EXIT. 
      ADA =LPQL       NO.  ADD PQ ENTRY LENGTH. 
      JMP FB
      SPC 2 
* COME HERE IF LU IS FREE FOR CURRENT PQ ENTRY
* 
* HAVE PARAMS IN PEND. QUEUE
* MUST NOW PUT THEM IN DUMMY CALL 
* AND UPDATE LU TABLE 
* 
* FIRST USE THE USER REQUEST CODE 
* 
FA    LDA FCPQ
      STA C9R 
      LDB A,I       GET RECODE + PRIORITY 
      CLA 
      RRL 4         MOVE PRIORITY TO A REG
      STA C9A       SAVE IT 
      ASR 4         MAKE RCODE 16 BITS
      STB CEC       SAVE RCODE
* 
      ISZ C9R 
      LDA C9R,I 
      LDB .CLU
      ADB P02$       SET MAIN RET. ADDR. IN LU. 
      STA B,I 
* 
      ISZ C9R 
      LDA C9R,I 
      LDB LULM       GET LOCKED FLAG. 
      SSA,RSS       IS ALSO A LOCK REQUEST
      CLB           NO SO CLEAR 
      STB FH        STORE FLAG
      IOR =B20000   MAKE WITHOUT WAIT 
      ELA,CLE,ERA   CLEAR BIT 15
      STA F3A 
* 
* 
* NOW TRANSFER BUFFR ADDRESS OR PARAM FOR I/O CONTROL IS USED 
* 
      ISZ C9R 
      LDA C9R,I      SET RETURN ADDRESS IN LU.
      STA .CLU,I
* 
      ISZ C9R    POINT TO PQ WORD 5 
      LDA C9R,I  GET WORD 5 
      LDB CEC    GET RCODE
      CPB P03$    CONTROL OR I/O REQ? 
      LDA C9R     CNTL - SET ADDR OF PARM1
      STA F3B     SET IN EXEC CALL
* 
      ISZ C9R 
      LDA C9R,I     GET BUFF LENGTH-
      STA C9V       IF PRESENT
      SZA           WAS IT THERE? 
      LDA .C9V      YES SO GET ADDR 
      LDB CEC      GET REQ CODE 
      CPB P03$     IS IT I/O CONTROL? 
      LDA C9V      YES SO GET ACTUAL ADDR 
      STA F3C 
      ISZ C9R 
      LDA C9R,I     GET TRACK 
      STA C9Z           SAVE IT 
      SZA 
                                                                            