EXTERNALROUTINESPEC  DPRINTSTRING(STRING  (255) S)
SYSTEMROUTINESPEC  PHEX(INTEGER  N)
OWNINTEGER  PFLAG
!*
!*
EXTERNALINTEGER  SSARRAYDIAG = 40
EXTERNALINTEGER  OPEHMODE = 0
EXTERNALINTEGER  BATCH OPTIONS
EXTERNALINTEGER  JDEFADDR
EXTRINSICSTRING  (6) SSOWNER;           ! PROCESS NAME
!!
!****** SYSTEM ROUTINE REFERENCES TO SUBSYSTEM 
!*
SYSTEMROUTINESPEC  ONTRAPE(INTEGER  CLASS, SUBCLASS)
EXTERNALROUTINESPEC  DRESUME(INTEGER  A, B, C)
SYSTEMINTEGERFNSPEC  PRIME CONTINGENCY(ROUTINE  ONPROC)
EXTERNALSTRING  (32) FNSPEC  INTTOSTRING(INTEGER  INT, MAXL)
SYSTEMSTRING  (6) FNSPEC  RELEASE
ROUTINESPEC  STOP BASE
 CONSTSTRING (8) NAME  DATE = X'80C0003F'
 CONSTSTRING (8) NAME  TIME = X'80C0004B'
EXTERNALINTEGERFNSPEC  DPON2(STRING  (6) USER,  C 
   RECORDNAME  P, INTEGER  MSGTYPE, OUTNO)
SYSTEMROUTINESPEC  SENDFILE(STRING  (32) FILE,  C 
   STRING  (8) DEVICE, INTEGER  COPIES, FORMS,  C 
   INTEGERNAME  FLAG)
EXTERNALINTEGERFNSPEC  DFINFO(STRING (6) USER, STRING (11) FILE C 
INTEGER  FSYS,ADR)
SYSTEMROUTINESPEC  FINFO(STRING  (31) FILE, INTEGER  MODE,  C 
   RECORDNAME  R, INTEGERNAME  FLAG)
SYSTEMINTEGERMAPSPEC  FDMAP(INTEGER  STREAM)
SYSTEMINTEGERMAPSPEC  COMREG(INTEGER  N)
SYSTEMROUTINESPEC  MOVE(INTEGER  L, F, T)
SYSTEMROUTINESPEC  PERMIT(STRING  (31) FILE,  C 
   STRING  (6) USER, INTEGER  MODE, INTEGERNAME  FLAG)
EXTERNALINTEGERFNSPEC  DCONNECT(STRING  (6) USER,  C 
   STRING  (11) FILE, INTEGER  FSYS, MODE, APF,  C 
   INTEGERNAME  SEQ, GAP)
EXTERNALINTEGERFNSPEC  DPERMISSION( C 
   STRING  (6) OWNER, USER, STRING  (8) DATE,  C 
   STRING  (11) FILE, INTEGER  FSYS, TYPE, ADPRM)
EXTERNALINTEGERFNSPEC  DCREATE(STRING  (6) USER,  C 
   STRING  (11) FILE, INTEGER  FSYS, TYPE, NKB)
SYSTEMROUTINESPEC  CONNECT(STRING  (31) FILE,  C 
   INTEGER  MODE, HOLE, PROTECT, RECORDNAME  R,  C 
   INTEGERNAME  FLAG)
SYSTEMROUTINESPEC  SDISCONNECT(STRING  (31) FILE,  C 
   INTEGER  FSYS, INTEGERNAME  FLAG)
SYSTEMROUTINESPEC  DISCONNECT(STRING  (31) FILE, INTEGERNAME  FLAG)
SYSTEMROUTINESPEC  CHANGEFILESIZE(STRING  (31) S,  C 
   INTEGER  NEW SIZE, INTEGERNAME  FLAG)
SYSTEMROUTINESPEC  DESTROY(STRING  (31) FILE, INTEGERNAME  FLAG)
SYSTEMROUTINESPEC  OUTFILE(STRING  (31) FILE,  C 
   INTEGER  SIZE, HOLE, PROTECTION, INTEGERNAME  CONAD, FLAG)
SYSTEMROUTINESPEC  SSMESS(INTEGER  N)
! %SYSTEMROUTINESPEC CHANGE ACCESS(%STRING (31) S,  %C
!    %INTEGER NEW ACCESS, %INTEGERNAME FLAG)
!*
!****** MAIN
!*
EXTERNALINTEGERFNSPEC  ICL9CESUBS(INTEGER  ENTRY)
!*
!*
OWNINTEGER  ENDLESS = 0;                ! GIVE INFINITE LOOP WHEN REQD.
OWNINTEGER  SENSITIVE = 0
OWNINTEGER  KEEPLNB;                    ! RETURN LNB FOR SUBSYSTEM CONTROL
OWNINTEGER  KEEP2LNB;                   ! RETURN LNB FOR JBR CONTROL RT.
OWNINTEGER  FLAG
OWNSTRING  (10) INPUTF
OWNSTRING  (31) INPUT = "", OUTPUT;     !PRIMARY INPUT AND OUTPUT FILE NAMES
OWNSTRING  (6) SPOOLER = "SPOOLR"
OWNSTRING  (15) OUTPUTQ = "LPJBR"
OWNINTEGER  INPUTFSYS
OWNINTEGER  BCPUTIME;                   ! JCL BATCH TIME
!!
CONSTINTEGER  TEMPORARY = X'40000000'
CONSTINTEGER  EIGHTSEGMENTS = X'200000'
CONSTINTEGER  FIXED = 1, VARIABLE = 2
CONSTINTEGER  DATAFILE = 4, SERIAL = 0, DA = 2
EXTRINSICINTEGER  DEFAULT FMAX
OWNSTRING  (8) SJVERSION = ' E.15 '
!*
ROUTINESPEC  SUPERSTOP
!*
RECORDFORMAT  NRFDFMT(INTEGER  LINK, DSNUM,  C 
   BYTEINTEGER  STATUS, ACCESS ROUTE, VALID ACTION, CUR STATE,  C 
   BYTEINTEGER  MODE OF USE, MODE, FILE ORG, DEV CLASS,  C 
   BYTEINTEGER  RECTYPE, FLAGS, LM, RM,  C 
   INTEGER  ASVAR, AREC, RECSIZE, MINREC, MAXREC, MAXSIZE,  C 
   ROUTECCY, INTEGER  C0, C1, C2, C3,  C 
   INTEGER  TRANSFERS, DARECNUM, LASTREC, RECORDS,  C 
   STRING  (31) IDEN)
RECORDFORMAT  RF(INTEGER  CONAD, FILETYPE, DATASTART, DATAEND,  C 
   SIZE, RUP, EEP, MODE, USERS, ARCH,  C 
   STRING  (6) TRAN, STRING  (8) DATE, TIME,  C 
   INTEGER  COUNT1, SPARE1, SPARE2)
RECORDFORMAT  FRECFMT(INTEGER  NKB, RUP, EEP, APF, USE, ARCH,  C 
   FSYS, CONSEG, CCT, CODES, CODES2, SSBYTE, STRING  (6) OFFER)
RECORDFORMAT  HEADFMT(INTEGER  DATAEND, DATASTART, SIZE, FILETYPE,  C 
   DATE, TIME, FORMAT, RECORDS)
RECORDFORMAT  PF(INTEGER  DEST, SRCE, STRING  (23) MESS)
RECORDFORMAT  REQF(INTEGER  DEST, SRCE, FLAG,  C 
   STRING  (6) USER, FILE, INTEGER  P6)
RECORDFORMAT  REPF(INTEGER  DEST, SRCE, FLAG,  C 
   STRING  (6) FILE, STRING  (11) OUTPUTQ)
RECORDFORMAT  REP2F(INTEGER  DEST, SRCE,  C 
   BYTEINTEGER  FLAG, STRING  (6) FILE, STRING  (15) OUTPUTQ)
!*
!*
!* BASE ROUTINES FOR JOBBER ON EMAS
!*
!*
!* RESULT=0 MEANS OK
!!
CONSTBYTEINTEGERARRAY  H(0 : 15) =             C 
'0','1','2','3','4','5','6','7','8','9',
  'A','B','C','D','E','F'
!!
EXTERNALINTEGER  RLEVEL = 4

SYSTEMROUTINE  REPORT(STRING  (48) S)
INTEGER  OUTPUTSTREAM
   IF  RLEVEL < 3 THEN  RETURN 
   OUTPUT STREAM = COMREG(23)
   SELECT OUTPUT(100) UNLESS  OUTPUT STREAM = 100
   PRINTSTRING(" >> EMAS BASE <<  ".S)
   NEWLINE
   SELECTOUTPUT(OUTPUTSTREAM) UNLESS  COMREG(23) = 100
END 
!!

SYSTEMROUTINE  POST REPORT(STRING  (48) S, INTEGER  N)
   PRINTSTRING(" >>EMAS BASE<<  HAVE CALLED ".S." VALUE ")
   WRITE(N,1)
   NEWLINE
END 
! %STRING (32) %FN UNIQUE NAME
! !! FILE NAMES GENERATED BY THE JOBBER MUST BE UNIQUE SO USE
! !! DATE, TIME AND AN INCREMENTING SUFFIX.
! %STRING (32) S
! %OWNBYTEINTEGER SUFFIX = '@'
!    SUFFIX = SUFFIX+1
!    %IF SUFFIX > 'Z' %THEN SUFFIX = 'A'
!    S = DATE.TIME." "
!    BYTEINTEGER(ADDR(S)+LENGTH(S)) = SUFFIX
!    %RESULT = S
!  %END
                                        ! OF UNIQUE NAME
                                        !!
! !!**********************************************************
!!
!!                   LOG 
!!
!!*************************************************************
!*

SYSTEMROUTINE  LOG(INTEGER  MSG ADDR, MSG LENGTH)
!!
!!
STRING  (255) S
   IF  MSG LENGTH <= 0 THEN  RETURN 
   IF  MSG LENGTH > 254 THEN  MSG LENGTH = 254
   MOVE(MSG LENGTH,MSG ADDR,ADDR(S)+1)
    LENGTH(S)=MSG LENGTH
   S = S."
"
   DPRINTSTRING(S)
!!
END ;                                   ! OF LOG
! !*

SYSTEMROUTINE  DATE AND TIME(STRINGNAME  D, T)
   D = DATE
   T = TIME
END 
!*

SYSTEMINTEGERFN  WRITE JS VAR(STRING  (31) NAME,  C 
   INTEGER  OPTION, AD)
! DUMMY NO JOB SPACE VARIABLES ON EMAS
   RESULT  = 1
END ;                                   !WRITE JS VAR
!*
!*
! %SYSTEMINTEGERFN INITBASE(%INTEGER MODE, %STRING (63) S)
! %INTEGER I
!     LOG(ADDR(S)+1,LENGTH(S))
!    %RESULT = 0
! %END
                                        !INITBASE
!*

ROUTINE  EMASJBR
INTEGER  I
   *STLN_KEEP2LNB
! REMEMBER WAY BACK TO JBRCONTROL
   I = ICL9CESUBS(0)
! NOTE: JBR ENTRY CALLED DIRECT, COMPILERS LOADED WHEN NEEDED
END ;                                   !EMASJBR
!*
!*

SYSTEMROUTINE  OPEHUSERERROR
END 

SYSTEMROUTINE  REMOVE AREA(STRINGNAME  S)
INTEGER  FLAG
   DESTROY(S,FLAG)
END 
!*
OWNSTRING  (8) START TIME
!*NE %OWNSTRING(10) DATE,TIMEDATE,TIME
!*
                                        ! HEAD
!*
!*
!*
!**************************************************
!*
!*            JOBBER ACCOUNTING PROCEDURE
!*
!***************************************************
!*

SYSTEMROUTINE  JBR ACNT(INTEGER  EP, STRING  (8) TIME,  C 
   STRING  (255) TEXT)
END 
!*
!*
!*
!!
!!******************************************************
!! 
!!                      WORK FILE
!!
!!*******************************************************
!!

SYSTEMINTEGERFN  WORK FILE(STRING  (32) DESC,  C 
   INTEGER  INIT, MAX, EXT,  C 
   INTEGERNAME  CURRENCY, FILE ORG, DEVCLASS, RECTYPE, FE,  C 
   MINREC, MAXREC)
RECORDNAME  F(NRFDFMT)
INTEGER  CONAD
STRING  (6) S
STRING  (2) A, B, C
RECORDNAME  HEADER(HEADFMT)
!* 
   F == RECORD(MAXREC);                 ! FUDGE
   IF  MAX = -1 THEN  MAX = DEFAULT FMAX ELSE  MAX = MAX*1024
   TIME -> A.(".").B.(".").C
   S = A.B.C
   F_IDEN = "W".S
   OUTFILE(F_IDEN,MAX//1024,0,X'40000000',CONAD,FLAG)
   IF  FLAG # 0 THEN  RESULT  = FLAG
   HEADER == RECORD(CONAD)
   HEADER_DATASTART = 32
   HEADER_DATAEND = 32
   RECTYPE = VARIABLE UNLESS  0 <= RECTYPE <= 3
   MAXREC = X'1000' UNLESS  MAXREC > 0
   HEADER_FORMAT = (MAXREC<<16)!RECTYPE
   HEADER_FILETYPE = DATAFILE;          ! DATA UNTIL  PROVEN OTHERWISE
   FILEORG = 0
   MINREC = 0
   MAXREC = 0
   DEVCLASS = 1
   RESULT  = FLAG
END ;                                   !WORK FILE
!*
!*
!****************************************************
!*
!*    CHECK USER INDEX IS WRITE PERMITTED

!*
!**************************************************
!*

INTEGERFN  CHECK INDEX(STRING  (32) NAME)
!!
RECORDFORMAT  USERPERMFM(STRING  (6) USER, BYTEINTEGER  UPRM)
RECORDFORMAT  INDEX LIST FM( C 
      INTEGER  BYTES RETURNED, OWNP, EEP, SPARE,  C 
      RECORDARRAY  INDIV PRM(0 : 15)(USER PERM FM))
RECORD  INDEX LIST(INDEX LIST FM)
INTEGER  I
STRING  (32) OWNER, FILE
STRING  (6) S, T
   IF  NAME -> OWNER.(".").FILE THEN  START 
      INDEXLIST = 0
      FLAG = DPERMISSION(OWNER,SSOWNER,DATE,FILE,-1,8,ADDR( C 
         INDEX LIST))
      IF  FLAG # 0 THEN  RESULT  = FLAG
      CYCLE  I = 0,1,15
         RESULT  = 303 IF  ADDR(INDEX LIST_INDIV PRM(I))-ADDR( C 
            INDEX LIST) > INDEXLIST_BYTES RETURNED
         S = SSOWNER
         T = INDEXLIST_INDIV PRM(I)_USER
         WHILE  T -> T.("?") THEN  LENGTH(S) = LENGTH(S)-1
         LENGTH(S) = LENGTH(T)
         IF  S = T START 
            RESULT  = 303 UNLESS  INDEXLIST_INDIV PRM(I)_UPRM&2 #  C 
               0
            -> OK TO CREATE
         FINISH 
      REPEAT 
      RESULT  = 303
   FINISH 
OK TO CREATE:

   RESULT  = 0
END 
!*
!*
!*******************************************************
!*
!*     DESTROY FILE
!*
!*******************************************************
!*

SYSTEMROUTINE  DESTROY FILE(STRING  (31) FILE,  C 
   INTEGERNAME  FLAG)
SYSTEMROUTINESPEC  DESTROY(STRING  (31) FILE, INTEGERNAME  FLAG)
   FLAG = CHECK INDEX(FILE)
   IF  FLAG = 0 THEN  DESTROY(FILE,FLAG)
END 
!*
!**********************************************************
!*
!*              CREATE FILE
!*
!****************************************************
!*

SYSTEMINTEGERFN  CREATE FILE(STRING  (32) NAME, DESC,  C 
   INTEGER  INIT, MAX, EXT, RECSIZE, BLKSIZE, RTYPE, FE)
RECORDNAME  HEADER(HEADFMT)
INTEGER  CONAD, FSYS, GAP
INTEGER  FLAG
!*
   IF  MAX = -1 THEN  MAX = DEFAULT FMAX ELSE  MAX = MAX*1024
   FLAG = CHECK INDEX(NAME)
   RESULT  = FLAG UNLESS  FLAG = 0
   OUTFILE(NAME,MAX//1024,0,0,CONAD,FLAG)
   IF  FLAG = 218 THEN  FLAG = 0
   RESULT  = FLAG IF  FLAG # 0 AND  FLAG # 219
! SET UP HEADER IF DATA  FILE
   HEADER == RECORD(CONAD)
   HEADER_DATASTART = 32
   HEADER_DATAEND = 32
   HEADER_SIZE = MAX
! SET BLKSIZE IF PARAMS LOOK OK
   RTYPE = VARIABLE UNLESS  0 <= RTYPE <= 3
   BLKSIZE = X'1000' UNLESS  BLKSIZE > 0
   HEADER_FORMAT = (BLKSIZE<<16)!RTYPE
   HEADER_FILETYPE = 4;                 ! DATA UNTIL PROVEN OTHERWISE
   RESULT  = FLAG
END ;                                   !CREATE FILE
!*
!!
!!***************************************************************
!!
!!                     DEFINE FILE
!!
!!*******************************************************
!!

SYSTEMINTEGERFN  DEFINE FILE( C 
   INTEGER  DEFINETYPE, PERMISSION, STRING  (42) IDEN,  C 
   INTEGERNAME  AFD, FILE ORG, DEVCLASS, RECTYPE,  C 
   FORMAT EFFECTORS, MINREC, MAXREC)
RECORDNAME  FD(NRFDFMT)
RECORDNAME  HEADER(HEADFMT)
RECORD  FREC(FRECFMT)
RECORD  R(RF)
STRING  (42) FILE, USER
INTEGER  FSYS, ADR
CONSTINTEGER  NONE = 1, NLINE = 0, READWRITE = 2, MAGNETIC = 1
SWITCH  TYPE(0 : 3)
INTEGER  CONAD, I
!*
   UNLESS  0 <= DEFINE TYPE <= 3 THEN  RESULT  = 1
   FD == RECORD(AFD);                   ! AFD SHOULD BE INTEGER NOT INTEGERNAME
   DEVCLASS = MAGNETIC;                 ! ALL EMAS FILES MAGNETIC
   -> TYPE(DEFINE TYPE)
!!
TYPE(1):

! JOB CONTROL STREAM - 108
   IDEN = INPUT;                        ! NAME SET OUTSIDE JOBBER
   FD_IDEN = INPUT;                     ! AND REMEMBER IT
   -> SETDTLS
!!
!!
TYPE(2):

! %IF PRIMARY OUTPUT THEN FILE NAME SET OUTSIDE JOBBER
   IF  FD_DSNUM = 99 START 
      IDEN = OUTPUT
      FD_IDEN = OUTPUT
!! CHECK FIRST TO SEE IF THERE IS A PRINT FILE LEFT AROUND FROM
!! A PREVIOUS RUN.
PREV:
      FINFO(IDEN,1,R,FLAG)
      IF  FLAG = 0 START 
         CHANGEFILESIZE(IDEN,INTEGER(R_CONAD),FLAG)
         IF  FLAG # 0 THEN  START 
            PRINTSTRING("
         CHANGEFILESIZE ON ".IDEN. C 
               "  FAILS, FLAG = ")
            WRITE(FLAG,1)
            NEWLINE
         FINISH 
         SENDFILE(IDEN,".".OUTPUTQ,0,0,FLAG)
      FINISH 
   FINISH 
SETDTLS:

   FILEORG = SERIAL
   RECTYPE = FIXED
   MINREC = 0;                          ! SET BY OPEN
   MAXREC = 0;                          ! SET BY OPEN
   FD_MODE = 1;                         ! TEMPORARY
   -> FE
!!
TYPE(0):

! A REAL FILE IS REQUIRED  - FIND OUT ABOUT IT
   FINFO(IDEN,1,R,FLAG)
   RESULT  = FLAG IF  FLAG # 0
   HEADER == RECORD(R_CONAD)
   FILEORG = SERIAL
   RECTYPE = HEADER_FORMAT&7
   IF  RECTYPE = 0 THEN  RECTYPE = FIXED
   MAXREC = HEADER_FORMAT>>16
   IF  RECTYPE = FIXED THEN  MINREC = MAXREC ELSE  MINREC = 3
!!
!! CHECK ACCESS PERMISSIONS
! WE KNOW THERE IS READ PERMISSION BECAUSE THE FINFO WORKED
   IF  PERMISSION = READWRITE AND  FLAG = 0 AND  FD_MODE # 2 START 
      ! CHECK WRITE PERMISSION
      RESULT  = 162 UNLESS  R_RUP&2 # 0;! NO WRITE PERM.
   FINISH 
!!
FE: IF  DEFINE TYPE = 2 THEN  FORMAT EFFECTORS = NONE C 
      ELSE  FORMAT EFFECTORS = NLINE
! NLINE MEANS A NL CHARACTER
! EVERY FILE OP.
   RESULT  = 0
TYPE(3):

! JOURNAL - NO LONGER USED
END ;                                   !DEFINE FILE
!*
!*
!***************************************************
!*
!*        EXPAND PRIMARY OUTPUT FILE
!*
!************************************************
!*

SYSTEMROUTINE  EXPAND PRIMARY OUTPUT FILE(RECORDNAME  F)
RECORDSPEC  F(NRFDFMT)
INTEGER  NEWSIZE, FLAG
!*
   NEWSIZE = F_C3-F_C0+X'10000';        ! ADD 64K
   CHANGEFILESIZE(OUTPUT,NEWSIZE,FLAG)
   IF  FLAG # 0 THEN  START 
      SSMESS(FLAG)
      REPORT("FAILED TO EXPAND P. OUTPUT")
      STOPBASE
   FINISH 
   F_C3 = F_C0+NEWSIZE
END 
!*
!*
!*************************************************
!*
!*            FAST FILE OP
!*
!*************************************************
!*

SYSTEMINTEGERFN  FASTFILEOP(INTEGER  ADA)
   RESULT  = 1
END 
! SHOULD ONLY BA CALLED FOR DA - NOT IMPLEMENTED
!*
!*
!!
!!**********************************************************
!!
!!                       CLOSE FILE
!!
!!*******************************************************
!!

SYSTEMINTEGERFN  CLOSE FILE(INTEGER  AFD, ACCESS CUR AD)
RECORDNAME  FD(NRFDFMT)
INTEGER  FLAG
   IF  COMREG(25)&1 = 1 START 
      PRINTSTRING("
*** CLOSE FILE ENTERED ***
")
      PHEX(AFD)
   FINISH 
   RESULT  = 0 IF  AFD = 0;             ! CANT DISC. IF NO PTR TO FD
   FD == RECORD(AFD)
   RESULT  = 0 IF  FD_ACCESS ROUTE = 3
   IF  COMREG(25) = 1 THEN  RESULT  = 0;! KEEP IF DIAGNOSE
   DISCONNECT(FD_IDEN,FLAG)
   IF  FD_DSNUM = 99 THEN  START 
      IF  ENDLESS = 1 THEN  DESTROY(OUTPUT,FLAG) C 
         ELSE  SENDFILE(OUTPUT,".".OUTPUTQ,0,0,FLAG)
   FINISH 
   RESULT  = FLAG
END ;                                   !CLOSE FILE
!*
!*
!!
!!**********************************************************
!!
!!                         OPEN FILE
!!
!!***********************************************************
!!

SYSTEMINTEGERFN  OPEN FILE( C 
   INTEGER  AFD, AT, ABUFF, LBUFF, ARS, ARC)
RECORDNAME  FD(NRFDFMT)
RECORD  R(RF)
OWNBYTEINTEGERARRAY  TRANS(0 : 13) =        C 
     C 
1,1,1,0,2,2,2,0,1,1,3,3,1,3
STRING  (32) USER, FILE
INTEGER  CONAD, PROTECT, I
!*
   FD == RECORD(AFD)
   UNLESS  FD_IDEN -> USER.(".").FILE THEN  AT = 3 ELSE  START 
      IF  COMREG(25)&1 = 1 START 
         PRINTSTRING("
*** OPEN FILE - ")
         PRINTSTRING(FD_IDEN)
         WRITE(AT,1)
         WRITE(FD_DSNUM,1)
      FINISH 
      AT = TRANS(AT)
   FINISH 
   PROTECT = 0
! PRIMARY INPUT -> EMAS PRIMARY INPUT
   IF  FD_ACCESS ROUTE = 1 START 
      FD_ACCESS ROUTE = 9
      AT = 1
INPUTFSYS=((BYTEINTEGER(ADDR C 
(INPUTF)+1)-'0')*10)+ C  
(BYTEINTEGER(ADDR(INPUTF)+2)-'0')
      PROTECT = (INPUTFSYS<<8)!X'80'
   FINISH 
! STANDARD FILE -> EMAS MAPPED FILE
   IF  FD_ACCESS ROUTE = 4 THEN  FD_ACCESS ROUTE = 8
   IF  FD_DSNUM = 99 START 
      OUTFILE(FD_IDEN,X'10000',EIGHTSEGMENTS,0,CONAD,FLAG)
      RESULT  = FLAG UNLESS  FLAG = 0
   FINISH 
   CONNECT(FD_IDEN,AT,0,PROTECT,R,FLAG)
   IF  FLAG # 0 START 
      IF  FD_DSNUM = 100 START 
         OUTFILE(FD_IDEN,X'10000',0,0,R_CONAD,FLAG)
         PERMIT(FD_IDEN,"",1,PFLAG)
         IF  FLAG = 0 THEN  -> OUT
         FD_ACCESS ROUTE = 9
      FINISH 
      REPORT("CONNECT FAILS")
      RESULT  = FLAG
   FINISH 
OUT:

   FD_C0 = R_CONAD
   FD_C1 = R_CONAD+INTEGER(R_CONAD+4);  ! START
   FD_C2 = FD_C1;                       ! CURPOINTER
   IF  FD_DSNUM = 100 THEN  FD_C2 = FD_C0+INTEGER(R_CONAD)
   FD_C3 = R_CONAD+INTEGER(R_CONAD+8)-1
                                        !  PHYSICAL END
!        USE F_C3 CHECKING FOR EOF ON WRITES,
!       USE F_C0+FIRST WORD OF FILE FOR DATA END ON READS.
   FD_MAXREC = FD_C3-FD_C1
   IF  FD_DSNUM = 99 THEN  FD_MAXREC = 133
   RESULT  = 0
END ;                                   !OPEN FILE
!*
!!
!!****************************************************************
!!
!!                  POSITION SQ FILE
!!
!!****************************************************************
!!

SYSTEMINTEGERFN  POSITION SQ FILE( C 
   INTEGER  AD REC CCY, POSITION)
!!
!! THIS ROUTINE MAY ONLY BE USED ON FILES WHICH HAVE BEEN OPENED ACCESS
!! TYPE =10 OR 11.
!! POSITION - INDICATES THE TYPE OF POSITIONING REQUIRED AND HAS VALUES
!!        = -1    BACKSPACE A RECORD
!!        = 0     REWIND TO START OF FILE
!!        = 1     SKIP TO END OF FILE (AFTER THE LAST RECORD)
!!        = 2     SKIP ONE RECORD
!!
SWITCH  ACT(-1 : 2)
INTEGER  I, J, SPACE LEFT, L, END
RECORDNAME  FD(NRFDFMT)
INTEGER  TYPE
!*
   RESULT  = 1 UNLESS  -1 <= POSITION <= 2
   FD == RECORD(AD REC CCY-48)
   TYPE = INTEGER(FD_C0+12)
   TYPE=3 IF  FD_ACCESS ROUTE=3
   TYPE = FD_RECTYPE UNLESS  TYPE = 3
   -> ACT(POSITION)
!!
ACT(-1):          ;                     ! BACKSPACE
   IF  TYPE = 3 START ;                 ! CHARACTER FILE
      FD_C2 = FD_C2-1
      CYCLE 
         FD_C2=FD_C1 AND  EXIT   IF  FD_C2 <= FD_C1
         FD_C2 = FD_C2-1
         EXIT  IF  BYTEINTEGER(FD_C2) = NL
      REPEAT 
       FD_C2=FD_C2+1 UNLESS  FD_C2=FD_C1
      FD_RECORDS=0
   FINISH  ELSE  START 
      IF  FD_RECTYPE = VARIABLE START 
         IF  0 <= FD_LASTREC <= 1 THEN  -> END
                                        ! NO ACTION AT FRONT ALREADY
         IF  FD_LASTREC > 1 START ;     ! HAVE BACK POINTER
            FD_C2 = FD_LASTREC
            FD_LASTREC = -1
            FD_RECORDS = FD_RECORDS-1
         FINISH 
         -> END
! NO POINTER - MUST LABORIOUSLY GO BACK TO THE BEGINNING AND COUNT
! FORWARDS TO CURRENT POSITION.
      I = FD_C1+2
      UNTIL  I >= FD_C2 THEN  CYCLE 
         J = I
         L = (BYTEINTEGER(I-2)<<8)!BYTEINTEGER(I-1)
         RESULT  = 161 IF  L = 0;       ! INVALID RECORD LENGTH
         I = I+L
      REPEAT 
      FD_C2 = J-2
   FINISH  ELSE  START 
      -> END IF  FD_C1 <= FD_C2;        ! AT FRONT ALREADY
      FD_C2 = FD_C2-FD_RECSIZE
   FINISH 
   FD_RECORDS = FD_RECORDS-1
   IF  FD_C2 = FD_C1 THEN  FD_LASTREC = 0 ELSE  FD_LASTREC = -1
    FINISH 
   -> END
!!
ACT(0):

! REWIND
   FD_C2 = FD_C1
   FD_LASTREC = 0
   FD_RECORDS = 0
   -> END
!!
ACT(1):

! ENDFILE
   IF  TYPE = 3 START 
      FD_RECORDS = 0
    IF  FD_ACCESS ROUTE=3 THEN  FD_C2=FD_C3 ELSEC 
       FD_C2=FD_C0+INTEGER(FD_C0)
   FINISH  ELSE  START 
      I = FD_C1
      FD_RECORDS = 0
      IF  FD_RECTYPE = VARIABLE START 
         END = FD_C0+INTEGER(FD_C0)
         UNTIL  I >= END THEN  CYCLE 
            L = (BYTEINTEGER(I)<<8)!BYTEINTEGER(I+1)
            I = I+L
            FD_RECORDS = FD_RECORDS+1
         REPEAT 
         FD_LASTREC = I-L
      FINISH 
      FD_C2 = I
   FINISH 
   -> END
!!
ACT(2):

! SKIP
   IF  TYPE = 3 START 
      RESULT  = 153 IF  FD_C2 > FD_C1
      CYCLE  I = FD_C2,1,FD_C0+INTEGER(FD_C0)
         RESULT  = 153 IF  FD_C2 > FD_C0+INTEGER(FD_C0)
         EXIT  IF  BYTEINTEGER(I) = NL
      REPEAT 
      FD_C2 = I+1
      FD_RECORDS =0
   FINISH  ELSE  START 
      IF  FD_RECTYPE = VARIABLE START 
         I = 0
         MOVE(2,FD_C2,ADDR(I)+2)
         IF  FD_C2+1+I > FD_C0+INTEGER(FD_C0) THEN  RESULT  = 153
                                        ! EOF
         FD_RECSIZE = I
         FD_LASTREC = FD_C2
      FINISH  ELSE  START 
         RESULT  = 153 IF  FD_C2+FD_RECSIZE > FD_C0+INTEGER(FD_ C 
            C0)
         FD_C2 = FD_C2+FD_RECSIZE
      FINISH 
      FD_C2 = FD_C2+FD_RECSIZE
      FD_RECORDS = FD_RECORDS+1
   FINISH 
   -> END
!!          
END:

! RESET MAXREC WHICH MAY HAVE BEEN REDUCED IF NEAR EOF
   IF  TYPE = 3 THEN  FD_MAXREC = FD_C3-FD_C2 C 
      ELSE  FD_MAXREC = FD_C3-FD_AREC
   IF  TYPE = 3 THEN  FD_AREC = FD_C2 ELSE  FD_AREC = FD_C2+2
    RESULT =0 IF  TYPE=3
   IF  FD_MAXREC > INTEGER(FD_C0+24)>>16 C 
      THEN  FD_MAXREC = INTEGER(FD_C0+24)>>16
   RESULT  = 0
END ;                                   !POSITION SQ FILE
!*
!*
!!
!*
!*
!!
!!***********************************************************
!!
!!                      CHANGE USE
!!
!!*********************************************************
!!
! %SYSTEMROUTINE CHANGE USE(%STRING (31) S,  %C
!    %INTEGER NEW USE, %INTEGERNAME FLAG)
!    %IF NEW USE = 0 %THEN %START
                                        !READ/WRITE
!       NEW USE = 3
!    %FINISH %ELSE NEW USE = 5
                                        !READ/EXECUTE
!    CHANGE ACCESS(S,NEW USE,FLAG)
! %END
                                        !CHANGE USE
!*
!!***************************************************************
!!
!!                     SET CONTENT LIMIT
!!
!!*****************************************************************
!!

SYSTEMINTEGERFN  SET CONTENT LIMIT(STRING  (31) S, INTEGER  NL)
INTEGER  FLAG
!!
   RESULT  = 0 IF  NL = 0
   CHANGEFILESIZE(S,NL,FLAG)
   RESULT  = FLAG
END ;                                   !SET CONTENT LIMIT
!**************************************************************************
!!
!!            CALL SPOOLER VIA DIRECTOR
!!
!!
!!

ROUTINE  CALL SPOOLER(INTEGER  DEST, STRING  (21) MESS,  C 
   RECORDNAME  REQ)
!!
RECORDSPEC  REQ(REQF)
INTEGER  FLAG
!!
   REQ = 0
   REQ_DEST = X'FFFF0000'!DEST
   REQ_USER = SSOWNER
   REQ_FILE = INPUTF
! WAIT IF NEED BE
   IF  MESS = "REQUEUE FILE " THEN  REQ_FLAG = 1
!!
   FLAG = DPON2(SPOOLER,REQ,1,7)
   IF  FLAG # 0 START 
      PRINTSTRING("
  DPON2 ".MESS." FAILS, FLAG= ")
      WRITE(FLAG,8)
      NEWLINES(2)
      STOP BASE
   FINISH 
!BCPUTIME=REQ_FLAG>>16
   FLAG = REQ_FLAG>>24
   IF  FLAG # 0 START 
      PRINTSTRING("
DPON2 ".MESS." FAILS, FLAG = ")
      WRITE(FLAG,1)
      IF  FLAG = 206 THEN  PRINTSTRING("
USER NOT KNOWN")
      IF  FLAG = 207 THEN  PRINTSTRING(" NO FILES ")
      IF  FLAG = 208 THEN  PRINTSTRING(" FILE NOT VALID ")
      NEWLINES(2)
      STOP BASE
   FINISH 
END ;                                   ! OF CALL SPOOLER
!!
!*
!!
!!*********************************************************
!!
!!                   JBR CONTROL  ***** ENTRY POINT *****
!!
!!*********************************************************
!!
!*
!* TRANSFER CONTROL HERE AFTER SUBSYSTEM ENTRY
!*

SYSTEMROUTINE  JBRCONTROL
RECORD  R(RF)
RECORD  P(PF)
RECORDNAME  REP2(REP2F)
RECORDNAME  REP(REPF)
STRING  (31) S
STRING  (6) FILE
INTEGER  I, A, B, C, D, E, F, G, FLAG
!!
!*
! STORE LNB TO RECOVER FROM HASTY EXITS
!*
   *STLN_KEEPLNB
!! 
   COMREG(36) = KEEPLNB&X'FFFC0000';    ! BASE OF STACK SEGMENT
   INTEGER(COMREG(36)) = 0;             ! STOP DIAGNOSTICS AT BOTTOM
!!
   INPUT = "IDLE"
   SENSITIVE = 1
!!
!! SET UP CONT. TRAP TO ENABLE ASYNCHRONOUS INTERRUPTS.
!! NOTE THIS SHOULD REALLY BE DONE LATER IN INITFILE,
!! BUT ON EMAS IT HAS TO BE EARLIER TO ALLOW S/ABORT
!!
   I = PRIME CONTINGENCY(ONTRAPE)
   DRESUME(-2,0,0)
!!
   CONNECT("JDEFAULTS",0,0,0,R,I)
   IF  I # 0 THEN  JDEFADDR = 0 C 
      AND  BATCH OPTIONS = X'81000001' C 
      ELSE  JDEFADDR = R_CONAD C 
      AND  BATCHOPTIONS = INTEGER(R_CONAD+60)
!!
   CYCLE 
      SELECT OUTPUT(100)
      SJVERSION = RELEASE
!      PRINTSTRING("***JOBBER JOURNAL*** (VERSION -".SJVERSION. %C
         ") FOR EXECUTION OF ")
      CALL SPOOLER(60,"REQUEST INPUT FILE",P)
      REP2 == P
      REP == P
      IF  1 <= LENGTH(REP2_FILE) <= 6 C 
         AND  1 <= LENGTH(REP2_OUTPUTQ) <= 15 C 
         THEN  FILE = REP2_FILE C 
         ELSE  FILE = REP_FILE
      OUTPUT = "JO#1"
      INPUTF = FILE
      INPUT = SPOOLER.".".FILE
      !PRINTSTRING(INPUT." AT ".DATE." ".TIME)
!      NEWLINES(2)
      SENSITIVE = 0
      EMASJBR
      SENSITIVE = 1
!!
!!     KEEPLNB2 RETURNS HERE
!!
      SELECT OUTPUT(100)
      SDISCONNECT(INPUT,INPUTFSYS,FLAG)
      IF  FLAG # 0 THEN  START 
         PRINTSTRING("
SDISCONNECT ".INPUT." FAILS, FLAG = ")
         WRITE(FLAG,1)
         STOP BASE
      FINISH 
      CALL SPOOLER(61,"DELETE FILE ",P)
      INPUT = "IDLE"
   REPEAT 
!!
END ;                                   ! OF CONTROL
!!
!!*********************************************************
!!
!!                       STOP BASE
!!
!!**********************************************************
!!

SYSTEMROUTINE  STOP BASE
INTEGER  I
RECORDNAME  F(NRFDFMT)
SYSTEMINTEGERMAPSPEC  FDMAP(INTEGER  N)
!!
   IF  SENSITIVE = 1 THEN  START 
!      STRAIGHT BACK TO SUBSYSTEM TO STOP PROCESS.
      *LLN_KEEPLNB
      *EXIT_-64
   FINISH 
   I = FDMAP(99)
   IF  I # 0 START 
      F == RECORD(I)
      CHANGEFILESIZE(F_IDEN,INTEGER(F_C0),FLAG)
      IF  ENDLESS = 1 THEN  DISCONNECT(F_IDEN,I) C 
         AND  DESTROY(F_IDEN,I) C 
         ELSE  SENDFILE(F_IDEN,".".OUTPUTQ,0,0,FLAG)
! PUT BACK LNB AND EXIT BACK TO JBRCONTROL
   FINISH 
   *LLN_KEEP2LNB
   *EXIT_-64
END ;                                   ! OF STOP BASE
!!
!! ODDS AND ENDS
!!

SYSTEMROUTINE  GENOMF
END 

SYSTEMROUTINE  DATIME(STRINGNAME  D, T)
   D = DATE
   T = TIME
END 

SYSTEMROUTINE  LD
END 

SYSTEMROUTINE  READERRORDATA(STRINGNAME  S, INTEGERNAME  I)
END 
!!
!!***********************************************************
!!
!!                       SUPER STOP
!!
!!************************************************************
!!

SYSTEMROUTINE  SUPERSTOP
RECORD  P(PF)
!!
!! COME HERE ON RECEIPT OF AN INTERRUPT CLASS=65.
!! AS GENERATED BY AN INT : A
!! OUTPUT FILE IS NOT PRINTED , BUT LEFT AROUND.
!!
   CALL SPOOLER(61,"REQUEUE FILE ",P) UNLESS  INPUT = "IDLE"
   *LLN_KEEPLNB
   *EXIT_-64
END ;                                   ! OF SUPERSTOP
!*********************************************
!*                                           *
!* THIS ROUTINE RECODES FROM HEX INTO NEW    *
!* RANGE ASSEMBLY CODE.                      *
!*                                           *
!*********************************************


EXTERNALROUTINE  NCODE(INTEGER  START, FINISH, CA)
SYSTEMROUTINESPEC  NCODE(INTEGER  START, FINISH, CA)
   NCODE(START,FINISH,CA)
END 
ENDOFFILE