ASMB,Q,C
* 
      HED SMP ROUTINE 
*     NAME:   SMP 
*     SOURCE: 92067-18351 
*     RELOC:  92067-16350 
*     PGMR:   A.M.G.,S.K. 
* 
*  ***************************************************************
*  * (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 SMP,130,30 92067-16350 REV.1940 790802
* 
* 
* 
*  SSTAT STATES 
* 
*     0 NORMAL
*     1 SPOUT IS WORKING ON A MENU
* 
* 
* 
      IFN 
      EXT DBUGR 
      XIF 
      EXT .DFER     THREE WORD MOVE ROUTINE 
      EXT REIO      I-O ROUTINE 
      EXT .MVW      MOVE WORDS ROUTINE
      EXT $CVT3     CONVERT NUMBER TO ASCII 
      EXT RMPAR     RETRIEVE PARAMETERS 
      EXT $SPCL     SPOUT CLASS ID
      EXT $SPCR     JOBFIL, SPLCON DISC CR
      EXT $LUAV     SPOOL LU TABLE
      EXT $IS43     IN $SPCL HAS ADDR OF IS43 IN DVS43
      EXT .DRCT     PICK UP DIRECT ADDRESS
      EXT $LIBR     GO PRIVILEGED 
      EXT $LIBX     SUSPEND PRIVILEGED OPERATION
      EXT READF     FMGR READ 
      EXT WRITF     FMGR WRITE
      EXT EXEC      SYSTEM CALLS
      EXT XLUEX     EXTENDED SYSTEM CALLS 
      EXT PRTN      PASS PARAMETERS TO CALLER 
      EXT RNRQ      RESOURCE NUMBER CONTROL 
      EXT POST      POST FILE BUFFERS 
* 
      EXT SESSN     CHECK IF UNDER SESSION
      EXT $SMVE     MOVE SESSION SWITCH TABLE 
      EXT LUTRU     FIND CORRESP LU IN BATCH OR SESS SW TABLE 
      EXT .CACT     GET DIRECTORY # OF CURRENT SESSION
      EXT DTACH     DETACH PROGRAM FROM SESSION 
A     EQU 0 
B     EQU 1 
XEQT  EQU 1717B 
DRT   EQU 1652B 
      SUP 
      HED              SMP CALL PRAMS 
* PRAMS P1 THRU P5 DESCRIBE THE FUNCTION TO PREFORM 
* AS FOLLOWS: 
* 
*     P1 =0         SET UP CALL REQUIRES A 16 WORD CLASS BUFFER 
*     P2 =CLASS NUMBER
*     P3 =BATCH CHECK FLAG (ID ADDRESS OF PRIV. PROGRAM OR ZERO)
* 
*     P1 =1         CHANGE PURGE TO SAVE ON AN EXISTING FILE
*     P2 =LU        ASSIGNED LU OR IF BATCH THE SWITCHED LU MAY BE USED 
* 
*     P1 =2         CHANGE SAVE TO PURGE
*     P2 =LU        ASSIGNED LU OR IF BATCH THE SWITCHED LU 
* 
* 
*     P1 =3         PASS THE FILE TO OUT SPOOL
*     P2 =LU        ASSIGNED OR SWITCH IF IN BATCH
* 
* 
*     P1 =4         CLOSE AND PASS THE FILE 
*     P2 =LU        ASSIGNED OR SWITCH IF IN BATCH
* 
* 
*     P1 =5         CHANGE LU AND OR PRIORITY OF OUT SPOOL
*     P2 =LU        ASSIGNED OR SWITCHED IF IN BATCH
*     P3 =NEW OUT LU
*     P4 =NEW PRIORITY
* 
* 
*     P1 =6         SET BUFFERED FLAG 
*     P2 =LU        ASSIGNED OR SWITCHED
* 
* 
*     P1 =7         CLEAR BUFFERRED FLAG
*     P2 =LU        ASSIGNED OR SWITCHED
* 
* 
*     P1 =8         GET CURRENT POSITION OF FILE
*     P2 =LU        ASSIGNED OR SWITCHED
* 
* 
*     P1 =9         CHANGE POSITION OF FILE 
*     P2 =LU        ASSIGNED OR SWITCHED
*     P3 =POSITION PRAMETER 1 
*     P4 =POSITION PRAMETER 2 
*     P5 =POSITION PRAMETER 3 
* 
* 
*     P1 =10        SPOUT CAN NOT OUT SPOOL BECAUSE OF FAILURE
*                    OF LULOCK REQUEST
* 
* 
* 
*     P1 =11        SPOUT CAN BEGIN OUT SPOOL 
*     P2 =LU SELECTED FOR OUT PUT 
* 
* 
*     P1 =12        DEQUEUE OUT SPOOL (SPOUT IS DONE) 
*     P2 =LU        ASSIGNED LU OF FILE 
*     P3 = #0       IF A BAD EOF FOUND ELSE 0 
* 
* 
*     P1 =13        KILL SPOOL
*     P2 =SPLCON RECORD NUMBER OF FILE TO KILL
*     P3 =LU        ASSIGNED FROM WORD 1 OF RECORD
*     P4 =0 
*     P5 =CURRENT STATUS OF FILE
* 
* 
*     P1 =14        HOLD A OUTSPOOL FILE
*     P2 =SPLCON RECORD NUMBER OF FILE
*     P3 =OUTSPOOL LU (CURRENT) 
*     P4 =0 
*     P5 =CURRENT STATUS  SPLCON RECORD WILL SHOW 'H' 
* 
* 
*     P1 =15        RELEASE A HOLD
*     P2 =SPLCON RECORD NUMBER OF FILE
*     P3 =CURRENT OUT SPOOL LU
*     P4 =NEW LU OR 0 CAN CHANGE LU ON RELEASE
*     P5 =CURRENT STATUS OF FILE
* 
* 
*     P1 =16        SHUT DOWN OUTSPOOLING 
* 
* 
*     P1 =17        START UP OUT SPOOLING 
* 
* 
*     P1 =18        CALL FROM SPOUT  A LU IS DOWN 
*     P2 =LU        CURRENT ASSIGNED LU 
* 
* 
*     P1 =19        CLOSE ALL SPOOL FILES FOR A SESSION 
*     P2 =DIRECTORY # OF SESSION
*     P3 =ADDRESS OF SESSION SWITCH TABLE 
*     P4 =# WORDS IN SESSION SWITCH TABLE 
* 
* 
*     P1 =20        OUTSPOOL RECORD LENGTH TOO LONG 
*     P2 =LU        CURRENT ASSIGNED LU 
      HED              SMP COMMANDS 
      SKP 
DTAB  DEF CPTS      1  CHANGE PURGE TO SAVE.
      DEF CSTP      2  CHANGE SAVE TO PURGE.
      DEF PASS      3  PASS NOW 
      DEF CSAP      4  CLOSE SPOOL AND PASS 
      DEF MPI       5  MODIFY PASS INFORMATION
      DEF SBF       6  SET BUFFER FLAG
      DEF CBF       7  CLEAR BUFFER FLAG
      DEF GCDP      8  GET CURRENT DISK POSITION
      DEF CSRP      9  CHANGE STARTING RECORD POSITION
      DEF LULOK     10 LU LOCK CONDITION IN SPOUT 
      DEF SPSEL     11 SPOOL SELECTION BY SPOUT 
      DEF DEQUX     12 DEQUEUE OUTSPOOL.
      DEF KILL      13 KILL SPOOL 
      DEF HOLD      14 HOLD A SPOOL FILE
      DEF RELSE     15 RELEASE A HOLD.
      DEF SHUT      16 SHUT DOWN OUTSPOOLING. 
      DEF STUP      17 START UP OUTSPOOLING.
      DEF DVCDN     18 I/O DEVICE DOWN  SET HOLD
      DEF CSPAL     19 CLOSE & PASS ALL SPOOLS FOR SESSION
      DEF LONG      20 OUTSPOOL RECORD TOO LONG 
* 
* 
JOBFL BSS 2         HOLDS FIRST 16 WORDS OF JOBFIL DCB
      OCT 2 
      BSS 3 
      DEC 16
      OCT 100210
      BSS 5 
      OCT 0,200,0 
SPLFL BSS 2         HOLDS FIRST 16 WORDS OF SPLCON DCB
      OCT 2 
      BSS 3 
      DEC 16
      OCT 100210    UP DATE WRITE OK 128 WORD DCB 
      BSS 5 
      OCT 0,200,0 
* 
DCB1  BSS 144 
BUF21 BSS 16        HOLDS SPLCON #1 MOSTLY
BUF22 BSS 16        HOLDS SPLCON #2 AND #3 MOSTLY 
BUF23 BSS 16        HOLDS CURRENT SPLCON FILE RECORD MOSTLY 
BUF24 BSS 16        HOLDS JOB RECORD #17  AND USED TO CHECK Q BLOCKS
BUF25 BSS 62        HOLDS JOB RECORD FROM JOBFIL ALSO MENU MOSTLY 
LIMIT BSS 2 
* 
*                   ALL BUFFERS ARE USED TO HOLD THE LU Q AT TIMES
* 
* 
      ORG DCB1      INITIALIZE CODE IS IN THE BUFFERS 
      HED              SMP INITIALIZE (IN BUFFER CODE)
* 
SMP   JSB RMPAR 
      DEF *+2 
      DEF PARM1 
      LDA $SPCR     GET DISC CR FOR JOBFIL & SPLCON 
      SZA,RSS       SPOOL INITIALIZED?
      JMP NOSPL     NO, EXIT
* 
      STA SPCR
      LDA MSIGN     SET OVERRIDE BIT TO SEARCH
      LDA XEQT      GET MY ID ADDRESS 
      STA JOBFL+9   SET THE OPEN FLAGS
      STA SPLFL+9   IN THE DCB SAVE AREAS 
      CCE           SET THE SIGN BIT
      RAL,ERA       AND 
      STA IID,I     AND SAVE FOR NOW AND LATER
      JSB EXEC      CALL D.RTR TO OPEN UP JOB FILE
      DEF *+10
      DEF D23 
      DEF D.RTR 
IID   DEF ID
      DEF MSIGN     OVERRIDE OPTION -- SEARCH ALL DISCS 
      DEF SPCR      CARTRIDGE # FOR JOBFIL
      DEF SECCD     SECURITY CODE 
      DEF ZERO
      DEF JOBNA     FILE NAME (NON-EXCLUSIVE) 
      DEF D3        LENGTH OF FILE NAME BUFFER
      LDA B,I       IF ERROR
      SSA           THEN
      JMP BAIL      GO BAIL OUT 
* 
      INB           STEP TO THE DIRECTORY ADDRESS WORDS 
      LDA B,I       AND SET THEM
      STA JOBFL 
      INB 
      LDA B,I       IN
      STA JOBFL+1   IN THE DCB IMAGE
      INB           NOW THE TRACK ADDRESS 
      LDA B,I 
      STA JOBFL+3 
      INB           NOW THE 
      LDA B,I       SECTOR
      AND X377
      STA JOBFL+4 
      XOR B,I 
      ALF,ALF 
      STA JOBFL+8   SET THE SEC/TRACK WORD
      JSB EXEC      GET STRING PASSED BY D.RTR
      DEF *+5 
      DEF D14       REQUEST CODE
      DEF D1        RETRIEVE STRING 
      DEF SST       USE AS TEMPORARY BUFFER 
      DEF D4        LENGTH OF BUFFER NEEDED 
      LDA SST+3     FILE SIZE 
      STA JOBFL+5   SAVE IN DCB IMAGE 
* 
      JSB EXEC      CALL D.RTR TO OPEN UP SPOL FILE 
      DEF *+10
      DEF D23 
      DEF D.RTR 
      DEF ID
      DEF MSIGN     OVERRIDE OPTION -- SEARCH ALL DISCS 
      DEF SPCR      CARTRIDGE # FOR SPLCON
      DEF SECCD 
      DEF ZERO
      DEF SPLNA     FILE NAME (NON-EXCLUSIVE) 
      DEF D3        LENGTH OF FILE NAME BUFFER
      LDA B,I       IF ERROR
      SSA           THEN
      JMP BAIL      GO BAIL OUT 
* 
      INB           STEP TO THE DIRECTORY ADDRESS WORDS 
      LDA B,I       AND SET THEM
      STA SPLFL 
      INB 
      LDA B,I       IN
      STA SPLFL+1   IN THE DCB IMAGE
      INB           NOW THE TRACK ADDRESS 
      LDA B,I 
      STA SPLFL+3 
      INB           NOW THE 
      LDA B,I       SECTOR
      AND X377
      STA SPLFL+4 
      XOR B,I 
      ALF,ALF 
      STA SPLFL+8   SET THE SEC/TRACK WORD
      JSB EXEC      GET STRING PASSED BY D.RTR
      DEF *+5 
      DEF D14       REQ. CODE 
      DEF D1        RETRIEVE STRING 
      DEF SST       USE AS TEMPORARY BUFFER 
      DEF D4        # WORDS TO RETRIEVE 
      LDA SST+3     FILE SIZE 
      STA SPLFL+5   SET IN DCB IMAGE FOR SPOOL FILE 
      JMP SMP0      GO CONTINUE THE SET UP
* 
BAIL  JSB FILER     REPORT THE ERROR AND
      JMP RETN4     EXIT
* 
NOSPL LDA M48       SPOOL SYSTEM NOT INITIALIZED
      STA TEMP1     SAVE FOR PARAMETER RETURN 
      JMP RETN5 
* 
X377  OCT 377 
M48   DEC -48 
* 
TS    EQU BUF21-*   IF ERROR WE RAN OUT OF THE DCB
* 
      ORG BUF21     GET OUT OF THE DCB SO IT CAN BE USED
* 
* 
SMP0  LDB DDCB1 
      LDA PTRJ      SET UP TO ACCESS THE JOB FILE 
      JSB .MVW
      DEF D16 
      NOP 
      LDB X17       GET THE JOB FILE RN 
      LDA PTX21 
      JMP SMP00     BAIL OUT OF THIS BUFFER 
* 
      ORG BUF22     SAFE GROUND 
* 
SMP00 JSB RDREC     READ JOBFILE RECORD 17
      JMP RETN4     IF ERROR GET OUT
* 
      LDA BUF21     GET THE RN
      STA DJRN,I    SAVE IT 
      JSB .DRCT     GET IS43 ADDRESS FOR
      DEF $IS43     FOR FUTURE EQT CHECKING.
      LDA A,I 
      STA IS43A     SAVE THE ADDRESS. 
      JSB .DRCT     GET ADDRESS OF
      DEF $LUAV     $LUAV TABLE AND SAVE. 
      STA LUAVA 
      LDB DDCB1     SET UP TO ACCESS THE SPOOL CONTROL FILE 
      LDA PTRS
      JSB .MVW
      DEF D16 
      NOP 
* 
      LDA PTX21     GET FIRST SPLCON RECORD.
      CLB,INB 
TS1   EQU *-BUF21-16 IF ERROR THEN CODE WILL BE OVERLAYED 
      JSB RDREC 
      JMP RETN4     ERROR EXIT
* 
      LDA PTX23 
      LDB X3
      JMP SMP01     GET TO HIGH GROUND
* 
      ORG BUF24     GET OUT OF THE BUFFER 
* 
SMP01 JSB RDREC     READ SHUT DOWN WORD.
      JMP RETN4     EXIT IF ERROR 
* 
      LDA BUF21 
      STA SRN       SAVE SPLCON RESOURCE #. 
      LDA BUF23     SAVE CURRENT SHUT DOWN CONDITION. 
      STA SHUTX,I 
      LDA BUF23+1   SAVE HOLD RN. 
      STA WRN 
      JSB .DRCT     INITIALIZE THE MENU.
      DEF BUF21+6   POINTER TO LU AREA
      STA TEMX1 
      LDA MPTRX     POINTER TO MENU 
      STA TEMX2     CONTAINS LU-#FILES ON QUE 
      LDA X9
SMP2  STA TEMX3 
      LDA TEMX2,I 
      SZA,RSS       MUST GO THROUGH ALL THE OUTSPOOL
      JMP SMP4      QUEUES PICKING UP THE NUMBER
* 
      LDB TEMX1,I   OF OUTSPOOLS WAITING ON EACH
      STB TEMX2,I   ONE.  THIS WILL ENABLE A
      SZB,RSS       START-UP TO PICK THEM UP
      JMP SMP5      OUTSPOOL LU IS 0
* 
      LDA PTX23 
      LDB TEMX3     READ IN THE BEGINNING 
      JSB RDREC     OF A QUEUE BLOCK. 
      JMP RETN4 
* 
      LDB BUF23+1   GET COUNT OF OUTSPOOLS. 
      SZB,RSS       ANY IN QUEUE? 
      JMP SMP5      NO
* 
      LDA BUF23+3   GET PRIORITY OF FIRST SPOOL IN QUEUE
      SZA           IF 0 SPOUT MAY BE WORKING ON IT 
      JMP SMP5      SPOUT NOT WORKING ON THIS SPOOL FILE
* 
      STB TEMP1     SAVE THE # OF OUTSPOOLS IN QUEUE
      LDB BUF23+2   GET THE SPLCON REC # OF FIRST FILE IN QUEUE 
      LDA PTX23     ADDRESS OF BUFFER 
      JSB RDREC     READ SPLCON RECORD
      JMP RETN4     ERROR 
* 
      CLE 
      LDA BUF23+10  GET THE STATUS OF SPOOL FILE
      CPA "A"       ACTIVE? 
      CCE           YES 
      CPA "AH"
      CCE 
      LDB TEMP1     GET THE SAVE # OF OUTSPOOLS IN QUEUE
      RBL,ERB       SET SIGN BIT IF SPOUT ALREADY WORKING ON IT 
SMP5  ISZ TEMX2 
      STB TEMX2,I 
      ISZ TEMX2     STEP MENU ADDRESS 
      ISZ TEMX1     STEP LU LIST ADDRESS
      LDA TEMX3     STEP RECORD ADDRESS 
      ADA X8        BY 8
      JMP SMP2      AROUND WE GO
* 
SMP4  LDA $SPCL     CHECK IF CLASS HAS BEEN 
      AND B377
      SZA           ALLOCATED FOR SPOUT.  IF SO,
      JMP SETCL     DON'T DO IT AGAIN.
* 
      JSB EXEC      ALLOCATE CLASS FOR
      DEF *+5       SPOUT REQUESTS. 
      DEF X19 
      DEF ZERO
      DEF ZERO
      DEF SP.CL 
      LDA SP.CL     GET THE CLASS AND 
      IOR B20K      SET THE DON'T RELEASE 
      JSB $LIBR 
      NOP 
      STA $SPCL     BIT 
      JSB $LIBX 
      DEF *+1 
      DEF *+1 
SETCL LDA $SPCL     GET THE SPOOL CLASS # 
      STA SP.CL     AND SAVE IT LOCALLY 
      JMP SMP1
* 
X3    DEC 3 
DDCB1 DEF DCB1
B20K  OCT 20000 
SHUTX DEF SHUTD 
X8    DEC 8 
X19   DEC 19
X17   DEC 17
X9    DEC 9 
JOBNA ASC 3,JOBFIL
SPLNA ASC 3,SPLCON
PTRJ  DEF JOBFL 
PTRS  DEF SPLFL 
PTX21 DEF BUF21 
PTX23 DEF BUF23 
MPTRX DEF .MENU 
TEMX1 NOP 
TEMX2 NOP 
TEMX3 NOP 
DJRN  DEF JRN 
      HED              SMP COMMAND DECODE 
SMP1  JSB POST      MAKE SURE WE'RE SET 
      DEF *+2       FOR NEW RECORDS TO BE 
      DEF DCB1      READ CLEAN FROM DISK. 
      JSB LOCK      LOCK THE SPLCON RN. 
      DEF SRN 
      LDA PTR21 
      CLB,INB 
      JSB RDREC 
      NOP           **********************************************
      LDA BUF21+3   GET START OF SPOOL CONTROL RECORDS
      STA SPREC     SAVE IT 
      JSB SESSN     UNDER SESSION?
      DEF *+2 
      DEF XEQT      PROGRAM ID SEGMENT ADDRESS
      CLA 
      ERA 
      STA SESNF     SESSION FLAG--UNDER SESSN IF BIT15 ZERO 
      STB SESID     SESSION ID
      LDA PARM1     WHAT TYPE OF REQUEST? 
      SZA,RSS 
      JMP SETUP     NEW SETUP.
* 
      CPA D18       IF DOWN DEVICE
      JMP USEOR     GO GET THE RECORD 
* 
      CPA D20       IF OUTSPOOL RECORD TOO LONG 
      JMP USEOR     GO GET THE SPLCON RECORD
* 
      CPA D12 
      JMP USEOR     DEQUEUE.
* 
      ADA M10 
      SSA,RSS 
      JMP CJUMP     REQ.PARM. >=10 -- GASP OR SPOUT REQUEST.
* 
      JSB LUTRU     TRANSLATE SPOOL LU THRU 
      DEF *+3       BATCH SWITCH TABLE
      DEF PARM2        OR  THRU SESSION SWITCH TABLE
      DEF TEMP2 
      LDA TEMP2     IF SESSION INSTALLED, 
      SSA,RSS       LU IN SESSION SWITCH TABLE? 
      JMP USERL     YES 
ERM40 LDA M40       NO, SEND ERROR BACK 
      STA TEMP1 
      JMP MENU      LU NOT DEFINED
* 
USERL LDB PARM2     SAVE ORIGINAL LU# 
      ADB M1
      STB SESLU     SESSION LU - 1 FOR SST SCAN 
      STA PARM2 
USEOR JSB FLU       SEARCH LU AVAILABILITY
      JMP ERM22 
* 
* 
      LDB TEMP1,I   SAVE CORRESPONDING RECORD 
      SZB 
      JMP STREC     RECORD ASSIGNED, SET REC #
      LDA SESLU     SESSION SPOOL LU - 1
      JSB FSELU     NO RECORD, FREE SPOOL LU FROM SST 
      JMP MENU      SKIP OUT
* 
STREC STB RECNO     # OF SPLCON RECORD. 
      LDA PTR23 
      JSB RDREC     READ THE APPROPRIATE RECORD.
      JMP RETRN     READ ERROR. 
* 
CJUMP CCA           IS THE REQUEST
      ADA PARM1     PARAMETER VALID?
      SSA 
      JMP MENU      ILLEGAL REQUEST PARAMETER.
* 
      STA B 
      ADB M20 
      SSB,RSS 
      JMP MENU      ILLEGAL REQUEST PARAMETER.
* 
      ADA RTAB      BRANCH TO APPROPRIATE 
      JMP A,I       SERVICE ROUTINE 
* 
FLU   NOP           ROUTINE TO FIND LU IN LUAV
      LDB LUAVA     SEARCH LU AVAILABILITY
      LDA B,I 
      SZA,RSS 
      JMP FLU,I     CAN'T FIND. 
* 
      STA TEMP2 
LOOP5 INB 
      LDA B,I 
      AND B377
      INB 
      CPA PARM2     DOES THE LU MATCH 
      JMP FOUND     THE ONE GIVEN?
* 
      ISZ TEMP2 
      JMP LOOP5 
* 
      JMP FLU,I     NOT FOUND 
* 
FOUND ISZ FLU       FOUND STEP ADDRESS
      STB TEMP1     SET ADDRESS FOR LATER 
      JMP FLU,I     AND EXIT
* 
SP.CL NOP 
SPCR  NOP 
SESNF NOP 
SESID NOP 
SESLU NOP 
M40   DEC -40 
RTAB  DEF DTAB,I    REQUEST TABLE.
LUAVA BSS 1 
D14   DEC 14
D20   DEC 20
M10   DEC -10 
D18   DEC 18
D70   DEC 70
D71   DEC 71
M70   DEC -70 
S24   OCT 100030
      HED              SMP SA TO PU TO SA & PASS
CSTP  CLE,RSS       CHANGE SAVE TO PURGE. 
* 
CPTS  CCE           CHANGE PURGE TO SAVE. 
      LDA BUF23+8 
      ERA,RAL 
      STA BUF23+8 
WRTRC JSB WRT23     WRITE OUT SPOOL CONTROL 
      JMP MENU
* 
* 
PASS  LDB BUF23+8   BATCH INPUT?
      RBL 
      SSB 
      JMP MENU      YES - ILLEGAL REQUEST.
* 
      LDA BUF23+15  IF NO LU
      SZA,RSS       THEN
      JMP MENU      IGNOR 
* 
      LDB BUF23+8   WAS THE FILE BEING
      RBR,SLB       HELD UNTIL CLOSE. 
      RSS 
      JMP MENU      NO - FILE WILL HAVE BEEN PASSED.
* 
      LDA BUF23+8   REMOVE HOLD BIT 
      IOR D2        SET JUST IN CASE
      XOR D2
      STA BUF23+8 
      JSB QUEUE     QUEUE THE FILE
      JMP MENU
* 
      HED              SMP CLOSE AND PASS ALL 
CSPAL LDA PARM2     CLOSE ALL SPOOL FILES FOR 
      STA TEMPC       GIVEN ACCOUNT # 
      LDA PARM3     SESSION ID
      STA SESID 
      JSB $SMVE     GET SESSION SWITCH TABLE
      DEF *+6 
      DEF D1        READ SST
      DEF SESID     ADDRESS OF SST
      DEF D1        ONE WORD OFFSET INTO SST
      DEF SST 
      DEF D70       MAX SIZE OF SST 
* 
      LDA M70 
      STA TEMPD 
      LDA ASST      ADDRESS OF SST
      STA TEMPE 
CLSLP LDA TEMPE,I   GET SST ENTRY 
      AND B377      MASK SESSION LU 
      CPA ZERO      SESSION TERMINAL LU?
      JMP MENU      YES, THEN NO MORE FILES LEFT
      LDA TEMPE,I   GET SST ENTRY 
      ALF,ALF 
      INA 
      AND B377      GET SYSTEM LU 
      STA PARM2     SAVE IT 
      JSB FLU       FIND LU IN $LUAV TABLE? 
      JMP CLSEN     CANNOT FIND -- SHOULD NOT HAPPEN
      JMP SPLLU     YES 
CLSEN ISZ TEMPE 
      ISZ TEMPD     INCREMENT COUNTER 
      JMP CLSLP     NOT DONE YET
      JMP MENU       NO MORE SPOOL FILES LEFT TO CLOSE
* 
SPLLU LDA TEMPE,I   GET SST ENTRY 
      AND B377      GET SESSION LU# 
      STA SESLU     SAVE IT 
      LDB TEMP1,I   GET RECORD #
      SZB,RSS       IF NOT ASSIGNED SKIP
      JMP CLSEN 
      STB RECNO     SAVE RECORD # 
      LDA PTR23 
      JSB RDREC     READ SPLCON RECORD
      JMP RETRN     FILE NOT FOUND
      LDA BUF23+11  CLOSE THE FILE
      SSA           IN BATCH? 
      JMP CLSPS     YES, SKIP CHECK 
      ELA,CLE,ERA   CLEAR SIGN BIT
      CPA TEMPC     DIRECTORY # MATCHING? 
CLSPS JSB CSPAS     YES, THEN CLOSE AND PASS FILE 
      JMP CLSEN     NO, LOOK AT NEXT SST ENTRY
      HED              SMP CLOSE AND PASS GIVEN FILE
* 
*  CLOSE AND PASS THE SPOOL FILE
* 
CSAP  JSB CSPAS 
      JMP MENU
* 
* 
* 
CSPAS NOP 
      LDA BUF23+12
      SZA,RSS 
      JMP CKSES     WORD 12 NOT SPECIFIED 
      JSB EXEC      SCHEDULE PROG IN WORDS 12-14 OF BUFFER
      DEF *+10
      DEF S24       =100030B
      DEF BUF23+12
      DEF ZERO
      DEF ZERO
      DEF ZERO
      DEF ZERO
      DEF ZERO
      DEF BUF23 
      DEF D16 
      JMP CKSES 
      LDA BUF23+8 
      CCE 
      RAR,ELA       SET BIT TO SAVE FILE
      STA BUF23+8     AFTER OUTSPOOL
* 
CKSES LDB SESNF     GET SESSION FLAG
      LDA SESLU     SESSION LU - 1
      SSB,RSS       IN SESSION? 
      JSB FSELU     YES, FREE SPOOL LU FROM SST 
* 
      LDA BUF23+15  IS FILE TO BE PASSED??
      SZA           WELL? 
      JMP PCHK      YES GO PASS IT
* 
      JSB PRGEX     CLOSE THE FILE
      JMP CSPAS,I   RETURN
* 
* 
PCHK  LDB TEMP1     GET LUAV ADDRESS
      JSB FRELU     FREE THE LU AND EQT 
      LDA BUF23+8   WAS IT PASSED BEFORE? 
      RAR,SLA       IS HOLD BIT SET?
      RSS 
      JMP CSPAS,I   NO, DO NOT PASS NOW (DONE ALREADY)
* 
      LDA BUF23+8   REMOVE HOLD BIT.
      IOR D2        SET JUST IN CASE
      XOR D2        NOW CLEAR IT
      STA BUF23+8 
      JSB QUEUE     GO SET IT UP
      JMP CSPAS,I 
* 
* 
* 
"W"   OCT 127 
      HED              SMP MODIFY PASS INFO 
MPI   LDA PARM4     SAVE NEW PRIORITY IF
      SZA,RSS       IF GIVEN. 
      JMP MPI1
* 
      SSA,RSS 
      STA BUF23+9 
MPI1  LDA BUF23+15  SAVE OLD LU.
      STA TEMP2 
      LDA PARM3     GET NEW LU
      STA PARM4     IF GIVEN. 
      SZA,RSS       SKIP IF NOT GIVEN 
      JMP CKVAL 
      STA BUF23+15
      AND B77       ISOLATE NEW LU# 
      STA TEMP6 
      LDB SESNF     GET SESSION FLAG
      SSB,RSS       IN SESSION? 
      JSB TROLU     YES,GET THE TRUE OUTSPOOL LU
      JSB STOLU     SET OUTSPOOL LU IN BUF23+15 
      STA PARM4     SAVE FOR USE LATER
      LDB "W"       SET STATUS TO WAIT
      LDA BUF23+10     IF NONE WAS DEFINED
      SZA,RSS           PREVIOUSLY
      STB BUF23+10
CKVAL JSB SMENU     CHECK VALIDITY. 
      JMP MPIER     NEW LU NOT GOOD.
* 
      LDB BUF23+10  IF SPOOL IS ACTIVE, 
      CPB "A"       WE CAN PERFORM
      JMP MPIER     THIS OPERATION. 
* 
      CLB 
      STB TEMP1 
      LDA TEMP2     IF NO OLD LU, 
      SZA,RSS       WRITE RECORD AND
      JMP MI4       QUEUE IF NEEDED NOW.
* 
      LDB BUF23+8   REQUEUE UNLESS THE
      RBR,SLB       FILE IS BEING HELD
      JMP MI4       FROM THE QUEUE
* 
      STA BUF23+15
      JSB WRT23     WRITE THE CURRENT RECORD
      CCE           SET TO SHOW NOT ACTIVE
      JMP DEQ18     UNTIL IT IS CLOSED. 
* 
MI4   JSB QUEUE     WRITE RECORD AND Q IF NEEDED
      JMP MENU      GO OUT THE STANDARD WAY 
* 
MPIER LDA TEMP2 
      STA BUF23+15
      LDA M21 
      STA TEMP1 
      JMP WRTRC 
* 
SBF   JSB FEQT      SET BUFFERED FLAG IN EQT. 
      ADB D3
      LDA BUFRD 
      JSB PUTM
      JMP MENU
* 
PTR21 DEF BUF21 
PTR23 DEF BUF23 
D3    DEC 3 
D12   DEC 12
BUFRD OCT 40000 
* 
CBF   JSB FEQT      CLEAR BUFFERED FLAG IN EQT. 
      ADB D3
      LDA BUFRD     SET BIT TO BE CLEARED 
      CLE           SET THE CLEAR FLAG
      JSB PUTM      CLEAR THE BIT 
      JMP MENU
* 
SETEQ NOP           SUB TO SET EQT ADDRESSES
      JSB FEQT      GET CURRENT DISK POSITION.
      ADA D2        ADDRESS OF EQT18 (CURRENT TRACK)
      STA TEMP5     SAVE IT 
      ADA D2        STEP TO EQT20 (EXTENSION NUMBER)
      STA TEMP2     AND SAVE IT 
      INA           NOW EQT21 (CURRENT SECTOR)
      STA TEMP1     SAVE IT 
      ADA D3        EQT24 (FIRST TRACK OF EXTENT) 
      STA TEMP3     SAVE IT 
      INA           EQT25 (FIRST SECTOR OF EXTENT)
      STA TEMP4     SAVE IT 
      INA           EQT26 (FILE SIZE) 
      STA DFSIZ     SAVE ADDRESS OF FILE SIZE 
      ADA D4        EQT30 (# SECTORS/TRACK) 
      STA D#PTR     SAVE IT 
      JMP SETEQ,I   RETURN
      HED              SMP GET CURRENT DISC POSITION
GCDP  JSB SETEQ     SET THE EQT ADDRESSES 
      LDA TEMP3,I   GET THE BASE TRACK
      CMA,INA       SUBTRACT FROM 
      ADA TEMP5,I   CURRENT TRACK 
      MPY D#PTR,I   TIMES #/TRACK 
D#PTR EQU *-1 
      LDB TEMP4,I   GET BASE SECTOR 
      CMB,INB       AND SUBTRACT
      ADA B         IT THEN 
      ADA TEMP1,I   ADD CURRENT SECTOR A=SECTOR OFFSET
      STA TEMP1     IN CURRENT EXTENT 
      LDA TEMP2,I   GET EXTENT
      MPY DFSIZ,I   TIMES EXTENT SIZE = SECTOR OFFSET OF
DFSIZ EQU *-1       THIS EXTENT 
      CLE           NOW ADD THE TWO 
      ADA TEMP1     DO DOUBLE WORD
      SEZ,CLE 
      INB           ADD 
      STA TEMP1     SET FOR 
      STB TEMP2     RETURN
      ISZ TEMP5     GET THE OFFSET
      LDA TEMP5,I   AND 
      STA TEMP3     SET IT FOR RETURN 
      JMP SRSEX     EXIT SMP   (SST #4236)
* 
CSRP  JSB SETEQ     SET UP THE EQT ADDRESSES
      ADB D10       ADDRESS OF EQT11
      STB SETEQ     SAVE IT FOR LATER 
      LDA DFSIZ     SET ADDRESSES 
      INA           SET UP TO GET THE EXTENT
      STA DIRCT     IN ALL CASES
      INA 
      STA DIRCT+1 
      LDA PARM3     GET THE DOUBLE WORD 
      LDB PARM4     SECTOR OFFSET 
      DIV DFSIZ,I   DIVIDE BY FILE SIZE 
      STA PARM1     SET EXTENT NUMBER FOR D.RTR CALL
      STB PARM2     SAVE THE REST 
* 
      JSB EXEC      SCHEDULE D.RTR TO OPEN
      DEF *+8       THE EXTENT. 
      DEF D23 
      DEF D.RTR 
      DEF XEQT      ID SEGMENT ADDRESS. 
      DEF D6        READ
DIRCT BSS 2 
      DEF PARM1     EXTENSION # 
      JSB RMPAR 
      DEF *+2 
      DEF D.1 
      LDA D.1 
      SSA 
      JMP RETRN 
* 
      LDA D.5 
      AND B377
      JSB $LIBR     GO PRIV TO SET THE EQT
      NOP 
      STA TEMP4,I   STORE BEGINNING SECTOR (EQT25). 
      CLB,CLE       SET UP THE
      ADA PARM2     OFFSET
      SEZ 
      INB           NOW 
      DIV D#PTR,I   GET TRACK OFFSET AND SECTOR ADDRESS 
      STB TEMP1,I   SET CURRENT SECTOR
      ADA D.4       SET CURRENT TRACK 
      STA TEMP5,I   IN EQT 18 
      LDA D.4 
      STA TEMP3,I   STORE BEGINNING TRACK (EQT24).
      LDA PARM5 
      IOR DM128     MAKE SURE RANGE IS RIGHT
      ISZ TEMP5     STEP TO EQT19 
      STA TEMP5,I   STORE CURRENT OFFSET (EQT19). 
      LDA PARM1 
      STA TEMP2,I   STORE CURRENT EXTENT (EQT20). 
      LDA SETEQ,I   GET EQT11 AND 
      AND NTEOF     CLEAR THE EOF FLAGS 
      STA SETEQ,I   RESTORE IT
      JSB $LIBX     GO TEST MENU
      DEF *+1 
      DEF MENU
* 
"A"   OCT 101 
C377  OCT 177400
NTEOF OCT 117777    MASK TO CLEAR EOF FLAGS 
M26   DEC -26 
M22   DEC -22 
D4    DEC 4 
B3700 OCT 3700
B377  OCT 377 
B77   OCT 77
BMASK OCT 137777
BPAT  NOP 
ADDR1 NOP 
RECNO NOP 
D2    DEC 2 
M1    DEC -1
M2    DEC -2
M4    DEC -4
M16   DEC -16 
PARM1 BSS 1 
PARM2 BSS 1 
PARM3 BSS 1 
PARM4 BSS 1 
PARM5 BSS 1 
SECCD OCT 123456
RRR   OCT 101100    ROTATE RIGHT INSTRUCTION
RRL   OCT 100100    ROTATE LEFT INSTRUCTION 
* 
ERM26 LDA M26 
      JMP NOGO1 
      HED              SMP SET UP INITIAL FILE
SETUP CLA           SET FLAG TO INDICATE FIRST TIME 
      STA TEMPC       THRU CLASS READ FOR SETUP BUFFER
STUP1 LDA PTR22     HAVE RECORD 1.
      STA ADDR1     SAVE FOR LATER
      LDB D2        GET RECORD 2. 
      JSB RDREC 
      JMP NOGO1     READ ERROR. 
* 
*  FIND IF THERE IS AN AVAILABLE SPLCON RECORD. 
* 
      LDA M16       SET UP
      STA TEMP1     COUNTER 
      LDA BUF21+3   GET REC. # OF FIRST REC 
      STA RECNO     SAVE IT 
      LDA BUF21+1   GET NUMBER OF RECORDS 
      CMA,INA       SET FOR COUNTER 
      STA TEMP3     IN TEMP3
LOOP1 LDA M16       SET UP
      STA TEMP2     COUNTER TWO 
      CLB,INB       SET INITIAL BIT MASK
LOOP2 LDA ADDR1,I   TRY 
      AND B         ONE 
      SZA,RSS       AVAILABLE?? 
      JMP HAVIT     YES  USE IT 
* 
      ISZ TEMP3     ANY RECORDS LEFT? 
      RSS           YES SKIP
      JMP NOGO      NO SO SORRY!
* 
      RBL           NO  ADVANCE BIT MASK
      ISZ RECNO     SEP RECORD NUMBER 
      ISZ TEMP2     AND COUNT  WORD EXHAUSTED?? 
      JMP LOOP2     NO TRY NEXT BIT 
* 
      ISZ ADDR1     YES TRY NEXT WORD 
      ISZ TEMP1     IS THERE A NEXT WORD??
      JMP LOOP1     YES TRY IT. 
* 
      JMP NOGO      NO AVAILABLE RECORD.
* 
HAVIT LDA ADDR1,I   SAVE NEW BIT PATTERN
      XOR B         IN A TEMPORARY. 
      STA BPAT
      LDA BUF21+4 
      CMA,INA       SET NEGATIVE
      STA PARM5     SAVE MAX. # PENDING OUTSPOOLS.
* 
*  FIND OUT WHETHER ANY OUTPUT QUEUES ARE FULL
*  OR TOTAL PENDING OUTSPOOLS MATCH THE MAXIMUM.
* 
      LDB MPTR      GET THE MENU ADDRESS
LOOP3 LDA B,I       GET ENTRY 
      SZA,RSS       END OF LIST?
      JMP SMP3      YES 
* 
      INB           NO STEP TO COUNT
      LDA B,I       GET COUNT 
      RAL,CLE,ERA   CLEAR THE SIGN
      CPA D63       FULL??
      JMP ERM26     YES SENT BACK ERROR 
* 
      ADA PARM5     ADD TO TOTAL
      STA PARM5     RESET TOTAL 
      SSA,RSS       IF NEG. THEN
      JMP ERM26     TOO MANY
* 
      INB           NEXT
      JMP LOOP3     AROUND AGAIN
* 
* 
*  FIND AN AVAILABLE LU #.
* 
* 
SMP3  CLA,RSS       CLEAR TEMP1 FOR NOW 
NOGO  LDA M22 
* 
NOGO1 STA TEMP1 
      LDA PARM2     SET OPTION TO NOT RELEASE 
      JSB EXEC      DO A CLASS GET TO RETRIEVE
      DEF *+5       THE SETUP BUFFER. 
      DEF D21 
      DEF PARM2 
      DEF BUF23 
      DEF D16 
CHKER LDA TEMP1 
      SSA           ERROR SET?
      JMP SRSEX     YES,THEN DON'T LOOK FOR SPOOL LU
* 
*   LOOK FOR SPOOL LU 
* 
      LDA BUF23+15  GET OUTSPOOL LU 
      AND B77       ISOLATE LU #
      LDB SESNF     GET SESSION FLAG
      SSB           IN SESSION? 
      JMP NOSES     NO
      STA TEMP5 
      SZA 
      JSB TROLU     GET TRUE OUTSPOOL LU
      JSB STOLU     SET OUTSPOOL LU IN SETUP BUFFER 
* 
      LDA BUF23+1   GET WORD ONE OF SETUP BUFFER
      CPA M1        DIRECT MAPPING REQUESTED? 
      JMP SMP7      YES 
* 
      SZA,RSS       LU GIVEN? 
      JMP NOLU      SESSION LU FOR SPOOL FILE NOT GIVEN 
* 
      CPA D1        LU SPECIFIED IS LU 1? 
      JMP ERM20     YES, THEN ERROR 
* 
      ADA M64       GREATER THAN 63?
      SSA,RSS 
      JMP ERM20     YES, ERROR
* 
      JSB EXEC      GET STATUS WORD OF LU 
      DEF *+4 
      DEF S13       =100015B  NO ABORT RETURN 
      DEF BUF23+1   LU SPECIFIED IN SETUP BUFFER
      DEF TEMP4     GET EQT WORD 5
      JMP LUOK      LU NOT IN SST, THEN OK
* 
      LDA TEMP4     EQT WORD 5
      AND B36K      =36000B 
      CPA B14K      EQUIPMENT TYPE CODE > 30B?
      JMP ERM20     YES, DISC LU --  ERROR
* 
LUOK  LDA BUF23+1   LU IS OK, SET IT UP IN SST
      JMP SETLU 
* 
* 
ERM20 LDA M20       NO, THEN ERROR
      STA TEMP1     ILLEGAL ACCESS LU 
      JMP SRSEX     EXIT
* 
NOLU  CLA           CLEAR THE LU TABLE USED TO
      LDB LUTBL       REMEMBER THE SESSION LU #'S 
CLRLU STA B,I          ENCOUNTERED IN THE SST 
      CPB LUTBE     DONE? 
      JMP SCNST     YES 
      INB           NEXT WORD IN LU TABLE 
      JMP CLRLU 
* 
SCNST JSB $SMVE     READ THE SST
      DEF *+6 
      DEF D1
      DEF SESID     SESSION WORD
      DEF ZERO
      DEF SST 
      DEF D71 
      LDA SST       GET THE NEGATIVE LENGTH WORD FOR SST
      STA TEMP3     SAVE FOR COUNTER
      LDA ASST
      INA 
      STA TEMP4     POINTER FOR THE SST 
SRCHL LDA TEMP4,I   GET AN ENTRY FROM SST 
      AND B377      ISOLATE SESSION LU
      INA 
      STA TEMP6     SAVE FOR NOW
      ADA M64       > 63? 
      SSA,RSS 
      JMP NXTLU     YES,THEN IGNORE THIS ENTRY
* 
      LDA TEMP6     SESSION LU FROM SST ENTRY 
      CLB 
      RRR 4         DIVIDE LU # BY 16 
      ADA LUTBL     QUOTIENT GIVES THE WORD INDEX IN LUTBL
      STA TEMP6     SAVE THIS ADDRESS 
      BLF           GET THE REMAINDER 
      STB TEMP5     REMAINDER INDICATES BIT POSITION TO SET 
      ADB RRR       CONFIGURE THE RRR INSTRUCTION WITH
      STB RRRIN       THE NUMBER OF ROTATES TO PERFORM
      LDB RRL       CONFIGURE ROTATE LEFT INSTR 
      ADB TEMP5     TO RESTORE THE LUTBL WORD 
      STB RRLIN 
      LDA A,I       GET CONTENTS OF LUTBL WORD
RRRIN NOP           RRR INSTRUCTION SETUP ONLINE
      IOR D1        SET THE BIT 
RRLIN NOP           RRL INSTRUCTION SETUP ONLINE
      STA TEMP6,I   RESTORE THE WORD IN LUTBL 
NXTLU ISZ TEMP4     POINT TO NEXT ENTRY IN SST
      ISZ TEMP3     INCREMENT NEGATIVE COUNT
      JMP SRCHL     SET THE BITS FOR THE NEXT SESSION LU
* 
* 
      LDB LUTBE     GET THE ADDR OF LAST WORD IN LUTBL
      STB TEMP3     SAVE ADDRESS
      LDB D63       LARGEST POSSIBLE SESSION LU#
WRDLP LDA M16       COUNTER FOR # OF BITS IN ONE WORD 
      STA TEMP4 
      LDA TEMP3,I   GET A WORD FROM LUTBL 
BITLP SSA,RSS       HIGH BIT SET? 
      JMP SESPL     NO, SESSION LU # FOR SPOOL IS FOUND 
* 
      RAL           MOVE THE NEXT BIT IN HIGH POSITION
      ADB M1        NEXT LU#
      SZB,RSS       ALL LU #'S USED UP? 
      JMP ERM47     NO AVAILABLE SESSION LU FOR SPOOL FILE
* 
      ISZ TEMP4     INCREMENT BIT COUNTER 
      JMP BITLP     CHECK NEXT BIT
* 
      LDA TEMP3     POINT TO NEXT WORD
      ADA M1
      STA TEMP3 
      JMP WRDLP 
* 
SESPL SWP           SESSION LU # FOR SPOOL
SETLU STA TEMP4     SESSION LU
      JSB HIGHL     FIND AVAIL LU FROM BOTTOM OF $LUAV
      JMP ERM22     NO AVAILABLE LU - ERROR 
      STA TEMP3     SYSTEM SPOOL LU 
* 
      LDA TEMP4     SET TEMP1 FOR RETURNING SPOOL LU
      JMP SMP11 
* 
SMP7  JSB FINDU     FIND AVAIL LU TO AVOID CONFLICT IN SST
      JMP ERM22     NO LU FOUND 
      STA TEMP3     SET SYSTEM LU 
SMP11 STA TEMP1     USE THIS LU AS SESSION LU 
      LDA BUF23+11
      SSA,RSS       IN BATCH? 
      JSB .CACT     NO, FIND DIRECTORY ENTRY # OF SESSION 
      STA BUF23+11
      JMP SMP9
* 
* 
NOSES STA TEMP6     SAVE LU # IF NOT IN SESSION 
      JSB STOLU     SET OTSPOOL LU IN SETUP BUFFER
      JSB FINDL     FIND AVAILABLE LU IN $LUAV
      JMP ERM22     LU NOT FOUND, SEND ERROR
      STA TEMP3     SAVE LU 
      STA TEMP1     SPOOL LU TO PASS BACK 
      ADA M64       LU > 63(10)?
      SSA,RSS 
      JMP ERM22     YES, ERROR
* 
SMP9  JSB SMENU 
      JMP ERM21 
* 
      LDA TEMP3 
      STA BUF23+1   SAVE LU# IN SETUP BUFFER. 
      SSA           IF NO LU THEN TAKE GAS! 
      JMP ERMES 
* 
      LDA BUF23+5   GET THE SECURITY CODE 
      CPA SECCD     123456B?
      JMP SETOV     YES, COMING FROM JOB, SET OVVERRIDE BIT 
* 
      LDB BUF23+8   IS THIS A SPOOL POOL FILE?
      LSR 3 
      CLA           DO NOT USE ANY OVERRIDE OPTIONS IF NOT
      SLB              A SPOOL POOL FILE
SETOV LDA MSIGN     SPOOL POOL FILE - SEARCH ALL CARTRIDGES 
      JSB OPNSP     TRY TO OPEN THE SPOOL FILE. 
      SSA 
      JMP ERMES     COULDN'T OPEN THE FILE? 
      LDA S.1       GET THE FILE TYPE 
      ELA,CLE,ERA   CLEAR SIGN BIT
      SZA,RSS       TYPE 0 FILE?
      JMP ERM16     TYPE 0 FILE ILLEGAL 
* 
      LDA D.2       GET DISC CARTRIDGE OF FILE
      AND B77 
      CMA,INA 
      STA BUF23+6   NEGATIVE LU#
* 
*********** CHECK SECURITY FLAG AGAINST W/R FLAGS ************
      LDA SESNF     UNDER SESSION?
      SSA 
      JMP SMP8      NO
* 
*  INSERT LU IN SESSION SWITCH TABLE
* 
      CLA 
      STA TEMP5     INITIALIZE SST OFFSET WORD
      CCA 
      ADA TEMP3     LU'S IN SST ARE LU#-1 
      STA TEMP3 
      CCB 
      ADB TEMP1 
      STB TEMP1 
      ALF,ALF       SYSTEM LU IN UPPER BYTE 
      IOR B         SESSION LU IN LOWER BYTE
      STA TEMP      SAVE FOR NOW
      JSB $LIBR     TURN OFF INTERRUPTS TO
      NOP           MODIFY SESSION SWITCH TABLE 
      JSB $SMVE     READ SPARE ENTRIES IN SST 
      DEF *+6 
      DEF D1        READ
      DEF SESID     SESSION ID
      DEF D1        OFFSET FROM SST LENGTH WORD 
      DEF SST       BUFFER TO HOLD THESE SST ENTRIES
      DEF D70       MAX SIZE OF SST IS 70 WORDS 
      LDB ASST      ADDRESS OF BUFFER 
#SPRS LDA B,I       FIND THE ADDRESS OF LAST SPARE ENTRY
      AND B377      MASK SESSION LU 
      CPA ZERO      SESSION TERMINAL? 
      JMP PKSST     YES, THEN PACK SST
* 
      CPA TEMP1     SESSION SPOOL LU? 
      RSS           YES 
      JMP INC#S     NO, INCREMENT COUNTER 
* 
      LDA B,I       GET THE SST ENTRY 
      ALF,ALF 
      AND B377      SYSTEM SPOOL LU 
      CPA D254      IS IT 254?
      CCA,RSS       YES, SPOOL FILE USING THIS LU WAS KILLED
      JMP INC#S     NO
* 
      STA B,I       RELEASE ENTRY FROM SST
INC#S ISZ TEMP5     INCREMENT COUNTER FOR # OF SPARES 
      INB           NO, LOOK MORE 
      JMP #SPRS 
* 
PKSST CPB ASST      ARE THERE ANY SPARE ENTRIES?
      JMP NOSPC     NO, THEN ERROR
* 
      ADB M1        YES, THEN ADDRESS OF LAST SPARE ENTRY 
      STB TEMP4     POINTER POINTS TO FIRST AVAILABLE SPARE ENTRY 
PCKLP LDA B,I       GET CONTENTS OF SPARE ENTRY IN SST
      CPA M1        IS IT EMPTY?
      JMP EMPTY     YES 
* 
      CPB TEMP4     NO, ALL SPARE ENTRIES PACKED SO FAR?
      JMP NOMV      YES 
      LDA B,I       NO, MOVE CURRENT SPARE ENTRY
      STA TEMP4,I     TO THE FIRST AVAILABLE EMPTY SLOT 
      CCA           MAKE CURRENT SPARE ENTRY EMPTY
      STA B,I 
NOMV  LDA TEMP4     POINT TO NEXT SPARE ENTRY IN THE PACKED LIST
      ADA M1
      STA TEMP4 
EMPTY CPB ASST      REACHED THE TOP OF SPARE ENTRY LIST?
      JMP SSTDN     YES 
* 
      ADB M1        NO, POINT TO NEXT ENTRY 
      JMP PCKLP 
* 
SSTDN CMB,INB       IF CURRENT SPARE POINTER IS 
      ADB TEMP4     LOWER THAN START OF SST THEN NO MORES SPARES
      SSB           ARE AVAILABLE 
      JMP NOSPC     NO EMPTY SLOTS LEFT IN SST, ERROR 
      LDA TEMP      SET UP THE NEW SST ENTRY
      STA TEMP4,I   FOR SPOOL LU
      JSB $SMVE     INSERT SYS & SESS LU WORD IN SST
      DEF *+6 
      DEF D2        WRITE 
      DEF SESID     SESSION ID
      DEF D1        START OF SST
      DEF SST       WRITE ALL SPARE ENTRIES 
      DEF TEMP5     # OF SPARE ENTRIES
      ISZ TEMP1 
      JSB $LIBX     TURN ON INTERRUPTS
      DEF *+1 
      DEF *+1 
* 
SMP8  LDA BUF23+8   IF BATCH INPUT
      RAL,ELA       THEN
      CLA,SEZ       CLEAR 
      STA BUF23+15  OUTSPOOL LU.
      LDA BUF23+9   IF PRIORITY IS NEG
      SSA           THEN
      CLA           SET ZERO
      STA BUF23+9   TO AVOID Q PROBLEMS 
* 
      LDB BUF23+15  GET OUTSPOOL LU 
      SZB,RSS       DEFINED?
      JMP SETST     NO, THEN SET STATUS TO 0
* 
      LDB BUF23+10  GET STATUS
      CPB "H"       IF NOT HOLD 
      JMP SSEQ
* 
      LDB "W"       SET TO WAIT 
SETST STB BUF23+10
SSEQ  JSB SSEQT     SET UP THE EQT
      LDA BUF23+8   IF A WRITE ONLY 
      ALF,ALF       ACCESS
      CCE,SLA,RSS 
      JMP SS5       NOT WRIT ONLY 
* 
      LDA BUF23+1   GET THE LU
      RAL,ERA       SET SIGN BIT TO USE TRUE LU.
      STA TEMP5 
      LDA B100      SET UP A EOF REQUEST
      STA TEMP6 
      JSB XLUEX     DO EOF
      DEF *+3 
      DEF D3
      DEF TEMP5 
      LDA B200
      STA TEMP6 
      JSB XLUEX     NOW BACKSPACE 
      DEF *+3 
      DEF D3
      DEF TEMP5 
* 
SS5   LDA BUF23+8   FIX THE STD. FLAG 
      CMA           AS REQUIRED 
      AND D16       ISOLATE THE BIT 
      XOR CLSPT,I   CLEAR IT IF NEED BE 
      LDB CLSPT 
      JSB PUT       SET THE WORD BACK IN EQT11
      JSB QUEUE     QUEUE THE FILE IF NEEDED
      JMP MENU
* 
S13   OCT 100015
B36K  OCT 36000 
B14K  OCT 14000 
M20   DEC -20 
      HED              SMP SET UP EQT ROUTINE 
*  SET UP SPOOL EQT ENTRY.
* 
SSEQT NOP           EQT SET UP SUB ROUTINE
      JSB FEQT      FIND ADDRESS OF EQT.
      INB           MAKE SURE THAT THIS IS
      LDA B,I       REALLY A SPOOL EQT. 
      CPA IS43A     DO THIS BY CHECKING 
      JMP SS3       EQT2 AGAINST THE INIT.
* 
      JMP ERM39     ENTRY POINT OF DVS43. 
* 
SS3   ADB D2        HAVE EQT ADDRESS. 
      STB TEMP3     GET EQT4 ADDRESS. 
      JSB $LIBR     GO PRIVILEGED TO BE ABLE
      NOP           TO STUFF THE EQT. 
      LDA TEMP3,I   SET OR CLEAR BUFFERING
      AND BMASK     FLAG. 
      LDB BUF23+8 
      SSB 
      XOR BUFRD 
      STA TEMP3,I 
      ISZ TEMP3 
      LDA BUF23+7   GET DRIVER TYPE AND PUT 
      ALF,ALF       AND POSITION CORRECTLY
      STA TEMP3,I   IN EQT5.
      LDB TEMP3 
      ADB D6        SET UP REMAINDER OF 
      STB CLSPT     SAVE ADDRESS OF EQT 11
      LDA PARM1     IF THIS 
      CMA,CLE,INA   IS A SET UP FOR SPOUT CLEAR E 
      LDA D16       SET THE STANDARD BIT AT ALL TIMES 
      SEZ           IF SPOUT USE ONLY THE STD. BIT
      IOR BUF23+8   DISPOSITION FLAGS.
      AND DMASK     EQT11.
      STA B,I 
      ADB D2        INDEX TO EQT EXTENSION. 
      LDB B,I 
      ADB D2        SAVE ADDRESS OF CURRENT 
      STB TEMP3     TRACK/SECTOR. 
      ADB D8
      LDA S.4       SAVE FILE SIZE IN EQT26.
      STA B,I       SAVE MASTER DIRECTORY ENTRY 
      INB           IN EQT27 AND EQT28. 
      LDA D.2 
      STA B,I 
      INB 
      LDA D.3 
      STA B,I 
      ADB M4
      LDA D.4 
      STA B,I       SAVE BEGINNING TRACK (EQT24). 
      STA TEMP3,I   SAVE CURRENT TRACK (EQT18). 
      ISZ TEMP3 
      LDA DM128     SET 
      STA TEMP3,I   OFFSET
      ISZ TEMP3 
      CLA           CLEAR THE 
      STA TEMP3,I   EXTENT #. 
      ISZ TEMP3 
      LDA D.5       SAVE CURRENT SECTOR.
      AND B377
      STA TEMP3,I 
      INB 
      STA B,I       SAVE BEGINNING SECTOR.
      ADB D4
      LDA BUF23+8   SET BATCH CHECK FLAG
      RAL,ELA       IN E
      LDA PARM1     SETUP FOR SPOUT?
      SEZ           IF NOT BATCH IN CHECK USE ZERO
      SZA           ALSO FOR SPOUT
      CLA,RSS       BATCH CHECKING DOESN'T APPLY. 
      LDA PARM3     PUT BATCH CHECKING INFO.
      STA B,I       INTO EQT29. 
      INB 
      LDA D.5 
      ALF,ALF 
      AND B377
      STA B,I       SAVE # SECTORS TRACK. 
      INB 
      CLA           INITIALIZE RECORD COUNT.
      STA B,I 
      INB 
      STA B,I       INITIALIZE CLASS PARAMETER
      INB           WORDS.
      STA B,I 
      JSB $LIBX 
      DEF SSEQT     RETURN
* 
NOSPC JSB $LIBX     TURN ON INTERRUPTS
      DEF *+1 
      DEF *+1 
      LDA M41       NO FREE SPACE IN SST
      JMP CLNUP 
* 
ERM39 LDA TEMP1     SESSION SPOOL LU
      ADA M1          MINUS 1 
      JSB FSELU     FREE LU FROM SST
      LDA M39       SPOOL LU NOT MAPPED TO DVS43
      JMP CLNUP     CLOSE SPOOL FILE
* 
ERM16 LDA M16       TYPE 0 FILE ILLEGAL 
      RSS 
ERM47 LDA M47       NO AVAILABLE SESSION LU FOR SPOOL FILE
CLNUP STA TEMP1 
      JSB CLSFL     CLOSE THE SPOOL POOL FILE 
      JMP MENU
* 
MSIGN OCT 100000
M41   DEC -41 
M47   DEC -47 
M39   DEC -39 
IS43A BSS 1         DVS43 ENTRY POINT SAVE. 
DM128 DEC -128
M64   DEC -64 
D6    DEC 6 
D63   DEC 63
D8    DEC 8 
D254  DEC 254 
D.1   NOP 
D.2   NOP 
D.3   NOP 
D.4   NOP 
D.5   NOP 
S.1   NOP 
S.2   NOP 
S.3   NOP 
S.4   NOP 
S.5   NOP 
PTR22 DEF BUF22 
PTR24 DEF BUF24 
RECRD NOP 
DMASK OCT 630 
"H"   OCT 110 
B200  OCT 200 
LUTBL DEF *+1 
      BSS 4 
LUTBE DEF *-1 
* 
      HED              SMP QUEUE FILE FOR OUTSPOOL
*  THE FOLLOWING QUEUES A FILE FOR OUTSPOOLING. 
* 
QUEUE NOP 
      JSB WRT23     WRITE OUT THE CONTROL RECORD
      LDA BUF23+15  IS THIS FILE TO 
      SZA,RSS       OUTSPOOLED? 
      JMP SET10     NO. 
* 
      AND B377
      STA TEMP6     SAVE OUTSPOOL LU #. 
      LDA BUF23+9   SAVE SPOOL PRIORITY.
      STA TEMP5 
      JSB SMENU     GET SET TO PASS THIS
      JMP QUE1      SPOOL FOR OUTSPOOLING.
* 
      INB           SAVE THE ADDRESS OF THE COUNT WORD
      STB SMENU     FOR LATER 
      LDB BUF23+8   CHECK IF THERE IS 
      RBR,SLB       A HOLD ON THIS FILE.
      JMP SET10     YES.
* 
      LDB BUF23+10  MUST ALSO BE IN "W" STATUS
      CPB "W"       WELL
      RSS           YES CONTINUE
      JMP SET10     NO DO NOT QUEUE 
* 
      JSB RDLUQ     GET THE LU QUEUE TO CORE
      JSB .DRCT     SETTING UP HERE TO SEARCH 
      DEF BUF21+3   THE QUEUE AND FIND OUT
      STA TEMP4     WHERE THE NEW ENTRY 
      ADA M1        SET A FOR SCAN
SET2  LDB A,I       CAN BE PUT. 
      INA           STEP TO PRIORITY
      SZB,RSS       END OF QUEUE? 
      JMP SET1      YES.
* 
      LDB A,I       GET PRIORITY
      CMB,INB       WE HAVE A PRIORITY. 
      ADB TEMP5     COMPARE WITH PRIORITY 
      SSB            OF NEW ENTRY.
      JMP SET1      NEW ENTRY IS LESS.
* 
      INA           KEEP LOOKING FOR A
      JMP SET2      SPOT TO PUT NEW ENTRY.
* 
SET1  ADA M1        HAVE A PLACE. 
      STA TEMP3     SAVE A POINTER. 
      LDA BUF21+1   FIND THE END OF 
      ALS           THE LIST.  THE LIST FROM
      ADA TEMP4     POINT OF NEW ENTRY
      INA           WILL BE SHIFTED TO MAKE 
SET4  STA TEMP6     ROOM FOR NEW ENTRY. 
      ADA M2        SET UP SHIFT POINTERS.
      STA TEMP4 
      DLD TEMP4,I   DO A SHIFT ON A 
      DST TEMP6,I   TWO-WORD ENTRY. 
      LDA TEMP4     DECREMENT POINTERS. 
      CPA TEMP3     JUST MOVED LAST ONE?
      RSS           YES SKIP
      JMP SET4      NO - BACK THROUGH LOOP. 
* 
      LDA RECNO     PUT THE NEW ENTRY 
      LDB TEMP5     IN THE VACATED SPACE. 
      DST TEMP4,I 
      ISZ BUF21+1   INCREMENT THE ENTRY COUNT.
      JSB WRLUQ     WRITE OUT THE LU QUEUE
      LDA SMENU,I   UPDATE THE MENU.
      ELA           SAVE THE SIGN BIT 
      LDA BUF21+1   GET THE NEW COUNT 
      RAL,ERA       SET SIGN IF NEEDED
      STA SMENU,I   RESET THE COUNT 
SET10 LDA PARM1     SETUP PROCESSING? 
      SZA           IF NOT, BYPASS BIT SETTING. 
      JMP QUEUE,I 
* 
      LDA PTR22     READ AVAILABILITY BITS. 
      LDB D2
      JSB RDREC 
      NOP           *********************************************** 
      LDB BPAT      RESET AVAILABILITY BITS.
      STB ADDR1,I 
      LDA PTR22     WRITE OUT AVAILABILITY RECORD.
      LDB D2
      JSB WTREC 
      LDB TEMP2 
      LDA B,I       FIX UP $LUAV. 
      CCE           MAKE THE LU UNAVAILABLE.
      ELA,RAR 
      JSB PUT 
      INB 
      LDA RECNO 
      JSB PUT 
      JMP QUEUE,I   RETURN
      HED              SMP MENU SET UP AND PASS TO SPOUT
MENU  LDA SHUTD     IS THERE A SHUT DOWN
      SZA           IN EFFECT?
      JMP RETRN 
* 
      LDA SSTAT     IS SPOUT ALREADY WORKING
      CPA D1        ON A MENU?
      JMP SRSEX     YES - RETURN. 
* 
      JSB HIGHL     IS THERE AN AVAILABLE LU
      JMP SRSEX     NO LU FOUND  ---  FOR SPOUT?
* 
      STA RESLU 
MENU1 LDA PTR25     MAKE UP A NEW MENU TO SEND
      STA TEMP3     TO SPOUT.  PUT ONLY LU'S
      CLB           SET TO CLEAR THE BUFFER 
      STB A,I       SET SEED
      LDB A 
      INB 
      JSB .MVW      MAKE IT GROW
      DEF D15 
      NOP 
      LDA MPTR      IN THE MENU THAT ARE NOT
      STA TEMP4     IN USE AND ALSO HAVE A QUEUE
MENU2 LDB TEMP4,I   OF FILES TO BE OUTSPOOLED.
      STB TEMP3,I 
      SZB,RSS       END OF .MENU? 
      JMP MENU3     YES.
* 
      ISZ TEMP4     NO - GO AHEAD AND CHECK IF
      LDB TEMP4,I   IF THE LU IS IN USE BY
      ISZ TEMP4     SPOUT.
      SSB 
      JMP MENU2     SPOUT IS ALREADY USING THE LU.
* 
      SZB           IS ANYTHING ON THIS QUEUE.
      ISZ TEMP3     YES - SAVE THE ENTRY JUST MADE. 
      JMP MENU2 
* 
MENU3 LDA BUF25 
      SZA,RSS       IS THERE ANYTHING TO SEND SPOUT?
      JMP SRSEX     NO. 
* 
      CLB,INB       SET STATUS TO SHOW
      STB SSTAT     SPOUT WORKING ON MENU 
      LDA D2        SEND CLASS REQUEST
      STA TEMP5     TO SPOUT WITH A MENU. 
      CLA,CCE 
      STA TEMP6 
      LDA RESLU     RESERVE THE LU
      ELA,RAR       FOR SPOUT 
      LDB TEMP2 
      JSB PUT 
MENU4 JSB CLSPT 
      JMP MENU      GIVE SPOUT ALL IT CAN TAKE. 
* 
CLSPT NOP 
      JSB EXEC
      DEF *+8 
      DEF D20       WRITE-READ REQUEST
      DEF ZERO      LU #. 
PTR25 DEF BUF25     MENU BUFFER.
      DEF D12 
      DEF TEMP5     CLASS PARAMETER 1.
      DEF TEMP6     CLASS PARAMETER 2.
      DEF SP.CL     CLASS ID. 
      JMP CLSPT,I 
* 
* 
D1    DEC 1 
D11   DEC 11
M21   DEC -21 
SST   BSS 71
TEMP  BSS 1 
TEMP1 BSS 1 
TEMP2 BSS 1 
TEMP3 BSS 1 
TEMP4 BSS 1 
TEMP5 BSS 1 
TEMP6 BSS 1 
MPTR  DEF .MENU 
SHUTD NOP 
RESLU NOP 
SSTAT NOP 
      HED              SMP ERROR AND EXIT ROUTINES
NTRDY CLA 
ERMES STA TEMP1 
      JMP MENU
* 
QUE1  CCA           OUTSPOOL LU NOT LEGAL.
      STA BUF23 
      JSB PTR23     CLEAR THE RECORD
ERM21 LDA M21 
      JMP ERMES 
* 
ERM22 LDA M22 
      JMP ERMES 
* 
RETRN LDA MPTR      THEN DO A COMPLETE
RETN3 LDB A,I       TERMINATION SO AS TO
      SZB,RSS       ALLOW ACCESS TO THE 
      JMP RETN2     SPLCON FILE FOR A 
* 
      INA           USER PACK, ETC. 
      LDB A,I       IF SPOUT IS NOT ACTIVE
      SSB           AND THERE IS A SHUTDOWN 
      JMP SRSEX     IN EFFECT.
* 
      INA 
      JMP RETN3 
* 
RETN2 CLA,RSS       OK TO SHUT DOWN 
SRSEX CLA,INA       SAVE RESOURCES SHUT DOWN
      STA EXIT,I    SAVE FOR EXIT 
* 
      JSB POST      MAKE SURE SPLCON BUFFERS
      DEF *+2       ARE POSTED. 
      DEF DCB1
      JSB UNLOK     CLEAR SPLCON RN #.
      DEF SRN 
      JSB DTACH     IF UNDER SESSION - DETACH 
      DEF *+2 
      NOP           ****** DUMMY PARAMETER *********
      JSB EXEC      SCHEDULE SPOUT WITH QUEUE 
      DEF *+3 
      DEF D10 
      DEF SPOUT 
RETN5 JSB PRTN      PASS BACK PARAMETERS
      DEF *+2       TO THE CALLER.
      DEF TEMP1 
      CCB            SET B AS INDICATOR 
RETN4 JSB EXEC      COMPLETION RETURN.
      DEF *+4 
      DEF D6
      DEF ZERO      INDICATE CALLER.
EXIT  DEF WRLUQ     SAVE RESOURCES TERMINATION. 
      SSB            IF TIME ENTRY
      JMP TRYAG     GO TRY THE MENU AGAIN 
* 
      JSB RMPAR     THIS ENABLES US TO SAVE 
      DEF *+2       INDICATORS AND KEEP SPLCON
      DEF PARM1     OPEN ALL THE TIME.
      JMP SMP1
* 
LULOK CLB           SPOUT HAS LU LOCK CONDITION.
      STB SSTAT 
      JSB SPS       RELEASE THE RESERVED LU 
      SWP 
      JSB PUT 
      JSB EXEC      SCHEDULE SMP WITH OFFSET
      DEF *+6       AND CHECK THE HOW WE GOT TO THIS
      DEF D12       POINT OF SUSPENSION WHEN WE 
      DEF SMPNA     ARRIVE.  IF ORDINARY SCHEDULE 
      DEF D2
      DEF ZERO
      DEF M8        REQUEST, PROCESS NORMALLY.
      JMP SRSEX     GO EXIT 
      HED              SMP SUBS (RDLUQ,WRLUQ,UNLOK,LOCK,BITFX,FEQT) 
RDLUQ NOP           ROUTINE TO READ THE LU QUEUE
      LDA PTR21     SET UP TO READ 8 RECORDS. 
      LDB M8        THIS IS ONE LU QUEUE. 
      STB TEMP3 
      LDB LUREC     READ THE APPROPRIATE
SET6  JSB RDREC     BLOCK.
      JMP ERMES     READ ERROR. 
* 
      LDB RECRD 
      CLB           SET FOR AUTO REC. INCREMENT 
      LDA BUFSP     FOR NEXT RECORD.
      ADA D16 
      ISZ TEMP3     FINISHED READING BLOCK? 
      JMP SET6
* 
      JMP RDLUQ,I   YES  RETURN 
* 
LUREC NOP 
M8    DEC -8
* 
WRLUQ NOP           WRITE OUT THE LU Q
      LDA PTR21     SET UP TO WRITE 
      LDB M8        OUT THE LU QUEUE. 
      STB TEMP3     8 - 16 WORD RECORDS.
      LDB LUREC 
SET7  JSB WTREC     WRITE A 16 WORD RECORD. 
      LDA BFSP1     UPDATE BUFFER POINTER 
      ADA D16       TO NEXT RECORD. 
      CLB 
      ISZ TEMP3 
      JMP SET7
* 
      JMP WRLUQ,I   DONE SO EXIT
* 
* 
TRYAG JSB LOCK
      DEF SRN 
      JMP MENU      GO TRY THE MENU 
* 
UNLOK NOP 
      LDA UNLOK,I 
      STA RESNO 
      ISZ UNLOK 
      JSB RNRQ
      DEF *+4 
      DEF D4
RESNO BSS 1 
      DEF IERR
      JMP UNLOK,I 
* 
LOCK  NOP 
      LDA LOCK,I
      STA RESNU 
      ISZ LOCK
      JSB RNRQ
      DEF *+4 
      DEF D1
RESNU BSS 1 
      DEF IERR
      JMP LOCK,I
* 
* 
BITFX NOP 
      STB A 
      AND D15 
      CMA 
      STA FEQT
      CLA,INA 
      ISZ FEQT
      JMP *+4 
* 
      BRS,BRS 
      BRS,BRS 
      JMP BITFX,I 
* 
      RAL 
      JMP *-6 
* 
* 
*  SUBROUTINE TO FIND EQT ADDRESS CORRESPONDING 
*  TO A GIVEN LU #. 
* 
FEQT  NOP 
      CCA,CCE       FIND ADDRESS OF EQT CORRESPONDING 
      ADA DRT       TO THE AVAILABLE LU #.
      ADA BUF23+1 
      LDA A,I 
      AND B77       GET EQT NUMBER AND INDEX
      ADA M1        TO THE PROPER ENTRY.
      MPY D15 
      ADA EQTA
      STA B 
      ADA D12       SET EXTENSION 
      LDA A,I       ADDRESS IN A
      JMP FEQT,I
      HED              SMP SUBS (CLSFL,FINDU,HIGHL,TROLU,STOLU,SPS) 
* CLSFL - ROUTINE TO CLOSE THE SPOOL FILE DUE TO ERROR IN SETUP PROCESS 
* CALLING SEQUENCE:  JSB CLSFL
* 
CLSFL NOP 
      CLA 
      CLB 
      DST WTREB     SIMPLE CLOSE
      JSB EXEC      SCHEDULE D.RTR TO CLOSE SPOOL FILE
      DEF *+10
      DEF D23 
      DEF D.RTR 
      DEF XEQT
      DEF ZERO
      DEF D.2 
      DEF D.3 
      DEF ZERO
      DEF WTREB 
      DEF D2
* 
      JMP CLSFL,I   RETURN
* 
* 
*  FINDU - ROUTINE FINDS AN AVAILABLE LU IN $LUAV TABLE 
*          SUCH THAT LU < 64, LU IN NOT DEFINED ON THE SESSION
*          SIDE IN SST
* 
*  FINDL - FINDS AN AVAILABLE LU IN $LUAV TABLE STARTING FROM TOP 
*          END OF THE TABLE 
* 
FINDU NOP 
      LDA FINDU 
      STA FINDL     SET UP RETURN ADDRESS 
      CCA           SET FLAG TO INDICATE COMING FROM FINDU
      JMP FIND0 
* 
FINDL NOP           FIND AVAILABLE LU.
      CLA 
FIND0 STA TEMPA 
      LDA LUAVA 
      STA TEMP2 
      LDA TEMP2,I 
      STA FEQT
FIND1 ISZ TEMP2 
      LDA TEMP2,I 
      SSA,RSS 
      JMP FIND2 
* 
      ISZ TEMP2 
      ISZ FEQT
      JMP FIND1 
* 
      JMP FINDL,I   RETURN TO P 
* 
FIND2 LDB TEMPA     COMING FROM FINDU?
      SSB,RSS 
      JMP FIND3     NO, RETURN TO P+1 
      STA TEMP3     YES 
      ADA M64       >63?
      SSA,RSS 
      JMP FIND1     YES, THEN TRY NEXT ONE
* 
      JSB LUTRU 
      DEF *+3 
      DEF TEMP3     IS THIS LU DEFINED
      DEF TEMP1        ON SESSION SIDE IN SST?
      LDA TEMP1 
      SSA,RSS 
      JMP FIND1     LU IS DEFINED, LOOK FOR ANOTHER LU
      LDA TEMP3     LU# 
FIND3 ISZ FINDL     LU NOT DEFINED
      JMP FINDL,I 
* 
* HIGHL - ROUTINE FINDS AN AVAILABLE LU IN $LUAV STARTING 
*         FROM THE BOTTOM END OF THE TABLE
* 
HIGHL NOP 
      LDB LUAVA,I   -VE LENGTH OF $LUAV 
      STB FEQT      SAVE
      CMB 
      BLS           GET (#WORDS-2) IN TABLE 
      INB 
      ADB LUAVA     ADDRESS OF LAST LU # IN $LUAV 
HIGH1 LDA B,I       GET CONTENTS OF ENTRY IN $LUAV
      SSA,RSS       BUSY BIT SET? 
      JMP HIGH2     NO, THEN FOUND IT 
      ADB M2        POINT TO LOWER ADDRESS IN $LUAV 
      ISZ FEQT
      JMP HIGH1 
* 
      JMP HIGHL,I   NO LU IS AVAILABLE
HIGH2 STB TEMP2 
      ISZ HIGHL 
      JMP HIGHL,I   RETURN
* 
* 
* TROLU - ROUTINE TO FIND TRUE SYSTEM LU CORRESPONDING
*         TO SESSION OUTSPOOL LU
*         CALLING SEQUENCE:  A REG = SESSION OUTSPOOL LU
*                            JSB TROLU
*         RETURNS:  JMPS TO ERM40 IF NO LU FOUND
*                   TEMP5 IS SESSION LU 
*                   TEMP6 IS SYSTEM LU
* 
* 
TROLU NOP 
      ADA M1        DECREASE BY 1 TO MATCH LU IN SST
      STA TEMP5     SAVE SESSION LU#
      JSB $SMVE     GET SST 
      DEF *+6 
      DEF D1
      DEF SESID 
      DEF ZERO      NO OFFSET 
      DEF SST 
      DEF D71       71 WORDS MAX IN SST 
      LDA SST       GET -VE LENGTH WORD 
      STA TEMP
      LDA ASST
      INA           POINT TO FIRST ENTRY IN SST 
      STA TEMPA 
SPLLP LDA TEMPA,I   GET CONTENTS OF ENTRY IN SST
      AND B377      IS IT THE SAME AS SESSION 
      CPA TEMP5        OUTSPOOL LU? 
      JMP FNDLU     YES,CHECK IF CORRESP SYS LU IS A SPOOL LU 
ENLP  ISZ TEMPA 
      ISZ TEMP      INCREMENT -VE LENGTH
      JMP SPLLP 
      JMP ERM40     ERROR 
* 
FNDLU LDA TEMPA,I   GET SST ENTRY 
      ALF,ALF       GET UPPER BYTE
      INA 
      AND B377      SYSTEM LU 
      CPA B377      IS IT 255?
      RSS 
      JMP CKSPL     NO, CHECK IF SPOOL LU 
      LDA TEMP5     GET SESSION OUTSPOOL LU - 1 
      JSB FSELU     FREE LU FROM SST
      JMP ENLP      LOOK FOR ANOTHER ENTRY OF OUTSPOOL LU 
* 
CKSPL LDB PARM2     SAVE PARM2
      STB TEMPB 
      STA PARM2     SYSTEM LU IS SPOOL LU?
      JSB FLU 
      RSS           LU NOT SPOOL LU, THEN TRUE LU FOR OUTSPOOL
      JMP ENLP      SPOOL LU, LOOK FOR NEXT ONE 
      ISZ TEMP5 
      LDA PARM2 
      STA TEMP6     SYSTEM LU 
      LDA TEMPB 
      STA PARM2 
      JMP TROLU,I   RETURN
* 
* 
*  STOLU - SET TRUE OUTSPOOL LU IN BITS 0-7 OF BUF23+15 
* 
STOLU NOP 
      LDA BUF23+15
      SZA,RSS       OUTSPOOL LU SPECIFIED?
      JMP STOLU,I   NO, RETURN
      AND B3700     ISOLATE FUNCTION CODE 
      ALS,ALS       MOVE TO BITS 8-12 
      IOR TEMP6     MERGE WITH OUTSPOOL LU
      STA BUF23+15  SAVE
      JMP STOLU,I   RETURN
* 
* 
* 
SPS   NOP 
      LDA LUAVA     GET ADDRESS OF $LUAV. 
SPS0  INA           STEP TO FIRST ENTRY 
      LDB A,I       GET THE LU
      INA           STEP TO THE RECORD NUMBER 
      SSB           IF BUSY,
      LDB A,I       GET THE RECORD NUMBER 
      SZB           IF ZERO THEN THIS IS IT 
      JMP SPS0      ELSE TRY NEXT ONE 
* 
      STA TEMP2     SAVE THE RECORD NO. ADDRESS 
      ADA M1        AND THE LU ADDRESS
      LDB A,I       GET THE LU
      RBL,CLE,ERB   CLEAR THE BUSY BIT
      STB RESLU     AND SAVE THE LU 
      JMP SPS,I 
      HED              SMP SPOUT SELECT A FILE ROUTINE
SPSEL CLA           CLEAR WORK (SPOUT HAS SELECTED) 
      STA SSTAT     IN PROGRESS FLAG
      LDA PARM2     GET THE LU AND SET IN CASE WE NEED TO 
      STA BUF23+15  CALL OFF SPOUT
      JSB SPS       SEARCH $LUAV FOR A RESERVED LU. 
      JSB SMENU     GET THE MENU ENTRY
      JMP KILL3     CAN'T FIND?? SHOULD NEVER HAPPEN
* 
      INB 
      STB TEMP6     SAVE THE POINTER
      LDB A         RECORD NUMBER TO B
      LDA PTR24     READ THE TOP OF THE 
      JSB RDREC     LU QUEUE AND PICK 
      NOP           ******************************************* 
      CLA           SET THE Q ENTRY PRIORITY TO 
      STA BUF24+3   TO ZERO TO INDICATE 
      LDA PTR24     IT AS ACTIVE (PREVENTS
      LDB LUREC     INSERTS AHEAD OF IT)
      JSB WTREC     WRITE IT BACK OUT 
      LDB BUF24+2   UP THE FIRST ENTRY. 
      STB RECNO     SAVE SPLCON RECORD # OF FILE. 
      LDA PTR23     READ SPLCON RECORD. 
      JSB RDREC 
      NOP           **********************************************
      LDA RECNO     SET THE RECORD NUMBER 
      LDB TEMP2     IN THE LUAV TABLE 
      JSB PUT 
      LDA RESLU     AND THE LU
      STA BUF23+1   IN THE RECORD 
      LDA MSIGN     OVERRIDE OPTION TO SEARCH ALL CARTRIDGES
      JSB OPNSP     TRY TO OPEN THE FILE. 
      SSA,RSS 
      JMP SPS1      NO. 
      JSB FILER     YES - SEND ERROR MESSAGE
      JMP KILL3     KILL SPOOL
* 
SPS1  LDB "A"       SET FILE TO ACTIVE -
      STB BUF23+10  IT WILL BE OUTSPOOLED.
      JSB WRT23     UPDATE THE FILE 
      JSB SSEQT     SET UP EQT ENTRY. 
      CLA,CCE,INA   COME HERE AFTER SETTING 
      STA TEMP5     UP SPOOL EQT. 
      LDA TEMP6,I   GET POSITION OF LU IN 
      ELA,RAR       MENU AND MARK IT TO 
      STA TEMP6,I   SHOW THAT SPOUT IS
SPS7  LDB BUF23+8   IS BUSY WITH THAT LU. 
      CCE           POTENTIAL OVERLAP PROBLEM?
      RBR,SLB       IF SO, SET SIGN BIT IN
      CME           CLASS PARAMETER TO BE PASSED
      LDA BUF23+15  TO SPOUT. 
      ELA,RAR 
      STA TEMP6 
      RBR,CLE,RBR 
      RBR,SLB 
      CCE 
      LDA BUF24     GET # QUEUED LINES. 
      AND C377      ISOLATE 
      IOR RESLU     INDICATE LU AND FILE TYPE.
      ELA,RAR 
      STA BUF25 
      JMP MENU4 
      HED              SMP SUBS (SMENU) 
* 
SMENU NOP 
      LDA BUF23+15  IF NO LU
      AND B377
      SZA,RSS       THEN
      JMP SM2       JUST EXIT 
* 
      STA FINDL     SAVE THE REQUESTED LU 
      LDB MPTR      SEARCH MENU FOR 
DEQ4  LDA B,I       OUTSPOOL LU.
      CPA FINDL     THIS IT?? 
      JMP SM1       YES GO EXIT FOUND 
* 
      SZA,RSS       IF END OF TABLE 
      JMP SMENU,I   TAKE NOT FOUND EXIT 
* 
      ADB D2
      JMP DEQ4
* 
SM1   LDA MPTR      COMPUTE THE LU QUEUE
      CMA,INA       RECORD NUMBER 
      ADA B         FOR THIS LU 
      ALS,ALS 
      ADA D9
      STA LUREC     AND SAVE IT FOR RDLUQ 
SM2   ISZ SMENU     STEP TO FOUND EXIT
      JMP SMENU,I   AND RETURN
* 
D9    DEC 9 
P21.2 DEF BUF21+2 
      HED              SMP DEQUEUE ROUTINES (SUP DQ)
DEQUX LDA PARM3     IF NO ERROR 
      CMA,INA,SZA,RSS JUST D Q
      JMP DEQUE 
* 
      JSB MSFIX     FIX UP THE MESSAGE
      ASC 3,EOF ER  STRING FOR MESSAGE
      DEC 13
* 
DEQUE JSB PRGEX     RELEASE THE SPLCON RECORD 
      JSB DQ        DEQUE THE FILE
      JMP NTRDY     EXIT
* 
DQ    NOP           DEQUE SUBROUTINE  ENTER WITH E=0 IF 
      JSB SMENU     FIND THE LU FOR THIS FILE 
      JMP ERM21     DIDN'T FIND - ERROR.
* 
      INB           SAVE THE ADDRESS FOR UPDATE 
      STB PRGEX 
      JSB RDLUQ     GET THE LU QUEUE TO CORE
      LDA PTR21 
DEQ11 ADA D2        FIND THE POSITION IN
      LDB A,I       THE QUEUE.
      CPB RECNO 
      JMP DEQ10     FOUND IT
* 
      CPA LIM       END OF QUEUE? 
      JMP DQ,I      YES - LEAVE.
* 
      JMP DEQ11     KEEP LOOKING
* 
DEQ10 LDB PRGEX,I   GET THE # OF ENTRIES FLAG 
      ADB M1        DECREMENT IT
      CPA P21.2     IF FIRST ENTRY
      RBL,CLE,ERB   CLEAR THE BUSY FLAG 
      STB PRGEX,I   SET IT BACK 
DEQ12 STA TEMP2     HAVE IT.
      ADA D2
      STA TEMP3 
      CMA,INA 
      ADA PTR21 
      ADA D127
      SSA           END OF BLOCK? 
      JMP DEQ13     YES.
* 
      DLD TEMP3,I   NO  - MOVE UP NEXT ENTRY. 
      DST TEMP2,I 
      LDA TEMP3 
      JMP DEQ12 
* 
DEQ13 CLA 
      CLB 
      DST TEMP2,I 
      CCA 
      ADA BUF21+1   DECREASE # OF ENTRIES.
      STA BUF21+1 
      JSB WRLUQ     WRITE OUT THE LU QUEUE
      JMP DQ,I      ELEMENT DEQUED SO EXIT
* 
* 
CLRAV NOP           CLEAR THE LUAVA ENTRY USING RECNO 
      LDB LUAVA     FIND THE SPOOL LU 
      LDA B,I       SET THE COUNT 
      STA PUT       INCASE NOT FOUND
DEQ16 ADB D2        INDEX TO THE NEXT RECORD ENTRY
      LDA B,I 
      CPA RECNO     THIS THE ONE??
      JMP DEQ15     YES GO DO IT
* 
      ISZ PUT       MORE??
      JMP DEQ16     YES TRY NEXT ONE
* 
      CCE           INDICATE NOT FOUND
      JMP CLRAV,I   RETURN
* 
DEQ15 JSB FRELU     FREE THE LU 
      JMP CLRAV,I   RETURN
      HED              SMP SUBS (FRELU,FSELU) 
*  FRELU - CALLING SEQUENCE: B REG = ENTRY # IN $LUAV 
*                            JSB FRELU
* 
FRELU NOP           FREE LU AND ITS EQT IF ONE
      CLA           CLEAR THE RECORD # SLOT 
      JSB PUT       IN THE LUAV 
      ADB M1        BACK TO THE LU NUMBER 
      LDA B,I       GET THE NUMBER
      STA TEMPA 
      RAL,CLE,ERA   CLEAR THE SIGN
      STA BUF23+1   SET FOR POSSIBLE FURTURE USE
      JSB PUT       RESET WORD
      SEZ,CME,RSS   IF NOT BUSY OR NOT FOUND
      JMP FRELU,I   EXIT WITH E = 1 
* 
      LDA B3700 
      STA TEMPB 
      JSB XLUEX     CALL SMD TO POST ANY REMAINING BUFFERS
      DEF *+5 
      DEF S1        =100001B
      DEF TEMPA 
      DEF BUF21 
      DEF D16 
      NOP           IGNORE ERROR RETURN 
* 
      JSB FEQT      GET THE EQT ADDRESS 
      STA B         SET TO
      ADB D11       CLEAR EQT27 TO STOP 
      LDA B,I       SAVE IT FOR CLOSE 
      STA D.2       FIRST 
      CLA,CLE       ANY ACCESSES
      JSB PUT       DO IT 
      JSB UNLOK     CLEAR THE HOLD RN 
      DEF WRN 
      CLE           CLEAR E TO INDICATE FOUND 
      JMP FRELU,I   RETURN
* 
S1    OCT 100001
TEMPA NOP 
TEMPB NOP 
TEMPC NOP 
TEMPD NOP 
TEMPE NOP 
* 
* 
*  FSELU - ROUTINE TO FREE SPOOL LU FROM THE SST
*    CALLING SEQUENCE:  A REG = SESSION SPOOL LU - 1
*                             = -(SYSTEM SPOOL LU -1) 
* 
* 
FSELU NOP 
      STA FSTMP     SAVE FOR NOW
      SSA           IS IT A SYSTEM SPOOL LU?
      CMA,INA       YES, MAKE IT POSITIVE 
      STA FSTM1 
      CLA,INA 
      STA TEMP4     OFFSET TO POINT TO LU IN SST
      JSB $LIBR     TURN OFF INTERRUPTS TO MODIFY SST 
      NOP 
      JSB $SMVE     MOVE SST INTO SMP'S BUFFER
      DEF *+6 
      DEF D1        READ
      DEF SESID     SESSION WORD
      DEF ZERO
ASST  DEF SST       BUFFER TO READ IN SST 
      DEF D71       MAX SIZE OF SST 
* 
      LDB FSTMP     SESSION LU OR -(SYSTEM LU)
      LDA M70       USE AS COUNTER
      STA FSTMP 
      LDA ASST      ADDRESS OF SESSION SWITCH TABLE 
      STA SST       SAVE SST ADDRESS
LULP  ISZ SST       POINT TO NEXT SST ENTRY 
      LDA SST,I     GET SST ENTRY 
      SSB           SYSTEM SPOOL LU?
      ALF,ALF       YES, MOVE SYSTEM LU IN SST TO LOW BYTE
      AND B377      MASK SPOOL LU 
      CPA FSTM1     MATCHES SPOOL LU? 
      JMP LUFND     YES 
* 
      LDA SST,I     GET SST ENTRY 
      AND B377      GET SESSION LU
      CPA ZERO      LU 1? 
      JMP LUEX      YES, LU NOT IN SST
* 
      ISZ TEMP4     INCREMENT OFFSET
      ISZ FSTMP     INCREMENT COUNTER 
      JMP LULP      NOT DONE YET, GET NEXT SST ENTRY
      JMP LUEX      LU NOT DEFINED IN SST - ERROR 
* 
LUFND JSB $SMVE     WRITE BACK MODIFIED SST 
      DEF *+6 
      DEF D2        WRITE 
      DEF SESID     SESSION ID
      DEF TEMP4     OFFSET INTO SST 
      DEF M1        BUFFER ADDRESS
      DEF D1        MODIFY ONE WORD IN SST
* 
LUEX  JSB $LIBX     TURN ON INTERRUPTS
      DEF FSELU     RETURN
* 
FSTMP NOP 
FSTM1 NOP 
      HED              SMP RELEASE A HOLD ROUTINE 
* 
RELSE LDA PTR23 
      LDB PARM2 
      STB RECNO 
      JSB RDREC 
      NOP           **********************************************
      LDA BUF23+1   NEED TO SAVE IN CASE
      STA PARM2     OF RESTART. 
      LDB PARM4     LOOK AT REL/RES FLAG. 
      LDA PARM5 
      CPA "AH"      ACTIVE FILE?
      JMP RELS1     YES.
* 
      SSB           RELEASE?
      JMP REQUE     YES - REQUEUE.
* 
      SZB           POSSIBLE LU CHANGE. 
      STB BUF23+15  SAVE NEW LU.
REQUE JSB QUEUE 
      JMP MENU
* 
RELS1 SSB,RSS       A RELEASE?
      JMP RELS2     NO MUST RESTART.
* 
      JSB FEQT
      ADB D10 
      CLE           SET TO CLEAR THE BIT
      LDA HMASK     SET THE BIT TO BE CLEARED 
      JSB PUTM      GO CLEAR IT 
      LDA BUF23+1 
      STA RESLU 
      JSB SMENU 
      JMP KILL3 
      INB 
      STB TEMP6     SAVE SPLCON REC# FOR LU 
      LDB A 
      LDA PTR24 
      JSB RDREC 
      NOP 
      LDA PARM3 
      STA PARM2 
      CLA,INA 
      STA TEMP5 
      JMP SPS7
* 
RELS2 JSB SPTUN 
      JSB FLU       FIND THE LU 
      RSS           IF NONE SKIP
      JSB FRELU     FREE IT 
DEQ18 JSB DQ        DEQUE THE FILE
      LDA PTR23     RELEASING AN ACTIVE 
      LDB RECNO     FILE AND RESTARTING IT -
      JSB RDREC     MUST QUEUE IT UP. 
      NOP           **********************************************
      LDA PARM4     NEW LU? 
      SZA           WELL??
      STA BUF23+15  YES - SAVE IT.
      LDA PTR21     READ IN 1ST RECORD
      CLB,INB       FOR QUEUE.
      JSB RDREC 
      NOP           **********************************************
      JMP REQUE 
* 
LIM   DEF LIMIT 
D127  DEC 127 
D15   DEC 15
      HED              SMP KILL SPOOL ROUTINE 
KILL  LDB PARM2 
      STB RECNO     SAVE SPLCON RECORD #. 
      LDA PTR23     READ THE SPLCON RECORD
      JSB RDREC     FOR THIS FILE.
      NOP           *********************************************** 
      LDA PARM5     IS THIS AN ACTIVE 
      CPA "A"       FILE (BEING OUTSPOOLED)?
      RSS           YES TREAT AS IF ACTIVE HOLD 
* 
      CPA "AH"      ACTIVE HOLD?
KILL3 JSB SPTUN     YES.
      JSB DTACH     DETACH FROM SESSION SO THAT A SPOOL 
      DEF *+2         FILE OUTSIDE YOUR SESSION CAN BE CLOSED 
      NOP           *****DUMMY PARAMETER********
      JMP DEQUE     GO DO IT. 
* 
B100  OCT 100 
"AH"  ASC 1,AH
      HED              SMP SUBS (PUTM,SPUTN) SHUT DOWN/ START UP
      HED              SMP SUBS (PUT,OPNSP,PRGEX) 
PUTM  NOP           ROUTINE TO SET OR CLEAR BIT SET IN A
      JSB $LIBR     AND ADDRESSED BY 'B' 'E'=1 TO SET 
      NOP           'E'=0 TO CLEAR THE BIT
      STA FEQT      SAVE THE BIT(S) 
      IOR B,I       SET THE BIT IN ANY CASE 
      SEZ,RSS       IF CLEAR REQUEST
      XOR FEQT      CLEAR THE BIT 
      STA B,I       RESET AND 
      JSB $LIBX 
      DEF PUTM      EXIT
* 
* 
SPTUN NOP 
      JSB FEQT      SET HOLD BIT TO STOP SPOUT
      ADB D10 
      LDA HMASK     HOLD BIT TO EQT11 
      JSB PUTM      GO SET IT 
      CLA           MAKE SURE AND CALL
      STA BUF25     SPOUT SO THAT IT
      LDA D3        WILL UNLOCK THE LU
      STA TEMP5     BEING USED TO 
      LDA BUF23+15  DUMP THIS FILE
      AND B377
      STA TEMP6 
      JSB CLSPT 
      JMP SPTUN,I 
* 
"D"   OCT 104 
* 
SHUT  LDA "D" 
      STA SHUTD 
      JMP RETRN 
* 
STUP  EQU * 
      IFN 
      JSB DBUGR 
      DEF *+1 
      XIF 
      CLA 
      STA SHUTD 
      JSB UNLOK     RELEASE JOB HOLD JUST IN CASE 
      DEF WRN 
      JMP MENU
      HED              SMP DEVICE DOWN & HOLD ROUTINES
DVCDN JSB MSFIX     DEVICE WENT DOWN WHILE
      ASC 3,DOWN    OUT SPOOLING
D16   DEC 16        LENGTH OF MESSAGE (WORDS) 
      JMP HOLD1     GO HOLD THE FILE
* 
HOLD  LDB PARM2     PICK UP AND SAVE RECORD 
      STB RECNO     NUMBER OF FILE IN SPLCON. 
      LDA PTR23     READ IN APPROPRIATE FILE
      JSB RDREC     RECORD IN SPLCON. 
      NOP           *********************************************** 
      LDA PARM5     HOLDING AN ACTIVE FILE? 
      CPA "A" 
      JMP HOLD1 
* 
      JSB DQ        NO - DEQUEUE THE FILE.
      JMP NTRDY     AND EXIT
* 
HOLD1 JSB FEQT      SET A BIT IN SPOOL EQT
      ADB D10       FOR SMD.
      LDA HMASK 
      JSB PUTM      GO SET THE HOLD BIT 
      LDA "AH"      SET HOLD FLAG 
      STA BUF23+10
      JSB WRT23     WRITE THE RECORD
      JMP NTRDY 
* 
WRT23 NOP           WRITE REC RECNO FROM BUF23
      LDA PTR23     SET BUFFER ADDRESS
      LDB RECNO     AND RECORD NUMBER 
      JSB WTREC     WRITE THE RECORD
      JMP WRT23,I   AND RETURN
* 
D10   DEC 10
HMASK OCT 10000 
OPTN  NOP 
      HED              SMP OUTSPOOL RECORD TOO LONG ROUTINE 
LONG  LDA BUF23+15  GET OUSPOOL LU
      AND B377
      CCE 
      JSB $CVT3     CONVERT TO ASCII DECIMAL
      INA           GET THE LAST 3 DIGITS 
      DLD A,I 
      DST LUNO      SET UP THE MESSAGE
      JSB .DFER     MOVE FILE NAME INTO MESSAGE 
      DEF FILNM 
      DEF BUF23+2   SOURCE BUFFER WITH FILE NAME
      JSB PRINT     PRINT MESSAGE 
      DEF RECMS     ADDRESS OF BUFFER 
      DEF D26 
      JMP MENU      RETURN
* 
RECMS ASC 3,SMP:LU
LUNO  ASC 3,       3 DIGIT LU PLUS 2 BLANKS 
FILNM ASC 3,       OUTSPOOL FILE NAME 
      ASC 17,  RECORD(S) TRUNCATED TO 128 WORDS 
D26   DEC 26
      HED              SMP SUBS (PUT,OPNSP,PRGEX) 
PUT   NOP 
      JSB $LIBR 
      NOP 
      STA B,I 
      JSB $LIBX 
      DEF PUT 
* 
* 
OPNSP NOP 
      STA OPTN      SET OPEN OPTION 
      LDA BUF23+2   SET SIGN BIT ON 1ST 
      CCE           WORD OF FILE NAME.
      ELA,RAR 
      STA BUF23+2   SAVE IT.
      JSB EXEC      TRY TO OPEN THE FILE. 
      DEF *+10
      DEF D23       SCHEDULE WITH WAIT. 
      DEF D.RTR     D.RTR.
      DEF ID        ID SEGMENT ADDRESS. 
      DEF OPTN      OPEN OPTION 
      DEF BUF23+6   CARTRIDGE ID. 
      DEF BUF23+5   SECURITY CODE 
      DEF ZERO
      DEF BUF23+2 
      DEF D3        NAME STRING LENGTH
      JSB RMPAR 
      DEF *+2       GET PARAMETERS BACK 
DD.1  DEF D.1       FROM D.RTR. 
      JSB EXEC      GET STRING PASSED BY D.RTR
      DEF *+5 
      DEF D14 
      DEF D1
      DEF S.1 
      DEF D5        GET ALL 5 WORDS PASSED
      LDA BUF23+2   CLEAR SIGN BIT
      ELA,CLE,ERA 
      STA BUF23+2 
      LDA D.1       SUCCESSFUL OPEN?
      JMP OPNSP,I 
* 
D5    DEC 5 
* 
SPREC NOP 
* 
PRGEX NOP 
      LDA PTR22 
      LDB D2        READ SPLCON AVAILABILITY BITS.
      JSB RDREC 
      NOP           ************************************************
      LDB SPREC     GET SPLCON RECORD # 
      CMB,INB       RELATIVE TO THE BEGINNING 
      ADB RECNO     OF THE FILE DESCRIPTOR
      JSB BITFX     RECORDS.
      ADB PTR22 
      STA BITFX 
      IOR B,I       CLEAR THE BIT.
      XOR BITFX 
      STA B,I 
      LDA PTR22 
      LDB D2
      JSB WTREC     WRITE AVAILABILITY RECORD.
      CCA 
      STA BUF23 
      JSB WRT23     WRITE FILE DESCRIPTOR RECORD. 
      JSB CLRAV     CLEAR ANY LU ASSOCIATED WITH THIS FILE
      SEZ           WAS THERE A CURRENT ONE?
      JMP PRNLU     NO, MUST OPEN TO CLOSE
* 
      JSB FEQT      YES LU WAS SET FOR FEQT 
      ADA D10       GET ADDRESS OF FILE PRAMS 
PRPU  LDB A,I       GET THE FILE SIZE 
PRPU1 CMB,INB       SET NEGATIVE FOR PURGE
      ADA D2        STEP TO THE DIR. ADDRESS WORD 
      STA TEMP4 
      LDA BUF23+8   GET THE OPTION WORD 
      SLA           IF SAVE IN EFFECT 
      CLB           CHANGE TO SIMPLE CLOSE
      AND D8        ISOLATE SPOOL POOL FILE BIT 
      SZA           IF POOL FILE
      LDB A         CHANGE TO PURGE EXTENTS 
      STB WTREC     SET THE PRAMETER
      CLA           SET HIGH BITS OF DOUBLE WORD
      SSB 
      CCA 
      STA WTREB 
      JSB EXEC      SCHEDULE D.RTR
      DEF *+10
      DEF D23       WITH WAIT TO
      DEF D.RTR     CLOSE A FILE
      DEF XEQT      AND PURGE EXTENTS.
      DEF ZERO
      DEF D.2 
      DEF TEMP4,I 
      DEF ZERO
      DEF WTREB 
      DEF D2
PRNFL LDA BUF23+8   GET SPOOL POOL FLAG 
      AND D8
      CPA D8        IF SPOOL POOL 
      JMP PRG0      GO SET UP 
* 
      JMP PREX      ELSE JUST RETURN
* 
PRNLU LDA MSIGN     OVERRIDE OPTION TO SEARCH ALL DISCS 
      JSB OPNSP     OPEN THE FILE SO CAN PURGE
      SSA           WAS IT FOUND??
      JMP PRNFL     NO
* 
      LDA DD.1      YES SET THE ADDRESSES 
      LDB S.4       FILE SIZE 
      JMP PRPU1     AND GO PURGE THE FILE 
* 
PRG0  JSB POST      MUST ACCESS JOB FILE
      DEF *+2 
DDCB  DEF DCB1
      LDA PTRJF     SET UP THE JOB FILE 
      LDB DDCB
      JSB .MVW
      DEF D16       BY MOVING IN THE DCB
      NOP 
      JSB LOCK
      DEF JRN 
      LDA PTR24     READ IN SPOOL POOL FILE 
      LDB D17       AVAILABILITY BITS.
      JSB RDREC 
      NOP           ********************************************* 
      LDA BUF23+4   CONVERT POOL FILE # 
      AND D15 
      STA TEMP4 
      LDA BUF23+4 
      ALF,ALF 
      AND D15 
      MPY D10 
      ADA TEMP4 
      CCB           SET NUMBER LESS 1 
      ADB A         IN B
      JSB BITFX     FIND AVAILABILITY BIT.
      STB TEMP4     SET OFFSET ADDRESS
      ADB PTR24 
      ADB D4
      CMA           MAKE AN ANDING MASK 
      STA TEMP5     AND SAVE IT IN CASE A JOB 
      AND B,I       CLEAR THE BIT AND STORE.
      STA B,I 
      LDA PTR24     WRITE OUT JOBFIL RECORD 17. 
      LDB D17 
      JSB WTREC     SPOOL FILE IS RETURNED TO POOL
      LDA PTR25 
      LDB BUF23+11  IF SPOOL NOT CONNECTED
      SSB,RSS       WITH A JOB, FORGET THIS STUFF.
      JMP DEQ7
      ELB,CLE,ERB   REMOVE SIGN BIT 
* 
      JSB RDREC     ELSE READ IN THE JOB RECORD 
      NOP            ***************************************
      LDB P2511     GET ADDRESS OF POOL BITS
      STB TEMP6     SAVE FOR RELEASE CHECK
      ADB TEMP4     INDEX INTO AND
      LDA TEMP5     CLEAR 
      AND B,I       THE FREEDED BIT 
      STA B,I       FIX OWNED SPOOL BITS OF THE JOB.
      LDA BUF25+2   GET THE JOB STATUS
      CPA "CS"      IF NOT CS 
      RSS           THEN
      JMP DEQ6      DO NOT CLEAR THE ENTRY
* 
      LDB M5        CHECK IF ALL OWNED FILES ARE CLOSED?
DEQ8  LDA TEMP6,I 
      SZA           ANY HERE? 
      JMP DEQ6      YES DO NOT FREE THE RECORD
* 
      ISZ TEMP6     STEP THE COUNT
      INB,SZB       ALL TESTED? 
      JMP DEQ8      NO TRY NEXT ONE 
* 
      CCA           ALL OWNED SPOOLS ARE CLEAR. 
      STA BUF25     DEALLOCATE THE RECORD.
DEQ6  LDA PTR25 
      LDB BUF23+11  WRITE OUT THE RECORD. 
      ELB,CLE,ERB   REMOVE SIGN BIT 
      JSB WTREC 
DEQ7  JSB POST
      DEF *+2 
PDCB  DEF DCB1
      JSB UNLOK 
      DEF JRN 
      JSB UNLOK 
      DEF WRN 
      LDA PTRSF     RESET UP THE SPOLCON FILE 
      LDB PDCB
      JSB .MVW
      DEF D16 
      NOP 
PREX  JSB CLRAV     CLEAR ANY ADDITIONAL
      SEZ,RSS       LU'S ASSIGNED TO THIS 
      JMP PREX      FILE
* 
      JMP PRGEX,I   EXIT TO CALLER
* 
JRN   NOP 
SRN   NOP 
WRN   NOP 
D17   DEC 17
M5    DEC -5
P2511 DEF BUF25+11
"CS"  ASC 1,CS
      HED              SMP SUBS (WTREC,RDRED,FILER,CVTNO,PRINT,MSFIX) 
WTREB NOP           THESE TWO WORDS 
WTREC NOP              MUST BE SEQUENTIAL 
      STA BFSP1 
      STB RECRD 
      JSB WRITF 
      DEF *+6 
      DEF DCB1
      DEF IERR
BFSP1 BSS 1 
      DEF D16 
      DEF RECRD 
      JSB FILER     REPORT FILE ERROR IF ANY
      JMP WTREC,I 
* 
RDREC NOP 
      STA BUFSP 
      STB RECRD 
      JSB READF 
      DEF *+7 
      DEF DCB1
      DEF IERR
BUFSP BSS 1 
      DEF D16 
      DEF FILER     DUMMY PLACE HOLDER
      DEF RECRD 
      SSA,RSS       IF NO ERROR 
      ISZ RDREC     TAKE OK EXIT ELSE P+1 
      JSB FILER     REPORT FILE ERROR IF ANY
      JMP RDREC,I 
* 
FILER NOP           TEST FOR ERROR AND PRINT IF ONE 
      CMA,SSA,INA   SET NEGATIVE ERROR +
      JMP FILER,I   IF NONE JUST EXIT 
* 
      JSB CVTNO     CONVERT THE NUMBER
      STA MESS      SET IN THE MESSAGE
      JSB PRINT     PRINT IT
      DEF SMPER 
      DEF D6
      JMP FILER,I   RETURN TO CALLER
* 
CVTNO NOP           TWO DIGIT NUMBER CONVERTER
      CLB           SET FOR DIVIDE
      DIV D10       A HAS HIGH DIGIT, B LOW 
      ALF,ALF       ROTATE TO HIGH
      ADA B         PUT TOGETHER
      ADA "00"      ADD THE ASCII OFFSETS 
      JMP CVTNO,I   RETURN  NUMBER IN A 
* 
"00"  ASC 1,00
* 
PRINT NOP           PRINT TO LU 1 
      DLD PRINT,I   GET THE BUFFER AND COUNT ADDRESSES
      DST BUFAD     SET IN CALL 
      ISZ PRINT     ADVANCE THE RETURN ADDRESS
      ISZ PRINT     ADVANCE THE RETURN ADDRESS
      JSB REIO      SENT THE WORD TO THE SYSTEM TTY 
      DEF RTN 
      DEF D2
      DEF D1
BUFAD NOP           SET TO THE BUFFER ADDRESSES 
      NOP           ALSO SET
RTN   JMP PRINT,I   EXIT BACK TO CALLER 
* 
MSFIX NOP           FIX UP THE MESSAGE
      LDA BUF23+15  FIRST GET THE 
      AND B377
      CCE           LU AND CONVERT TO ASCII DECIMAL 
      JSB $CVT3 
      INA           POINT TO LAST 3 DIGITS
      DLD A,I 
      DST LUXX      SET IN THE MESSAGE
      JSB .DFER     NOW MOVE IN THE STRING
      DEF DNEOF 
      DEF MSFIX,I   RETURNS A POINTS TO NEXT SOURCE SO
      STA MSFIX     SAVE AS LENGTH ADDRESS
      JSB .DFER     MOVE IN THE 
      DEF FILEN     FILE
      DEF BUF23+2   NAME
      JSB PRINT     NOW PRINT THE MESSAGE 
      DEF SVERF 
      DEF MSFIX,I   POINT TO LENGTH 
      ISZ MSFIX     STEP TO RETURN ADDRESS
      JMP MSFIX,I   AND RETURN
* 
PTRSF DEF SPLFL 
PTRJF DEF JOBFL 
SMPER ASC 5,SMP: FMP -XX ERORR MESSAGE
MESS  NOP           HOLDS XX FROM MESSAGE 
SVERF ASC 3,SMP:LU        LU DOWN AND BAD EOF TEMPLATE
LUXX  ASC 3,        LU PLUS 2 BLANKS
DNEOF ASC  4,EOR ER        OR DOWN PLUS 2 BLANKS
FILEN ASC  6,XXXXXX HELD. 
SMPNA ASC 3,SMP 
.MENU DEC 1 
      SUP 
      REP 19
      DEC 1 
      DEC 0 
D21   DEC 21
D23   DEC 23
SPOUT ASC 3,SPOUT 
D.RTR ASC 3,D.RTR 
IERR  NOP 
EQTA  EQU 1650B 
ZERO  DEC 0 
ID    NOP 
* 
      END SMP 
                                                          