! UINF record for Director 17
!
!
!<FEP stuff
%CONSTINTEGER TOPLOG=5
%CONSTINTEGER TOP FE NO = 7
%CONSTINTEGER FEP IO BUFF SIZE = 4096;  !NUMBER OF BYTES IN THE CONTROL BUFFERS FOR EACH FEP
      %RECORDFORMAT %C
FEPF(%INTEGER AVAILABLE, INPUT STREAM,  %C
      OUTPUT STREAM, IN BUFF DISC ADDR, OUT BUFF DISC ADDR,  %C
      IN BUFF DISC BLK LIM, OUT BUFF DISC BLK LIM,  %C
      IN BUFF CON ADDR, OUT BUFF CON ADDR, IN BUFF OFFSET,  %C
      OUT BUFF OFFSET, IN BUFF LENGTH, OUT BUFF LENGTH,  %C
      INPUT CURSOR, OUTPUT CURSOR)
      %RECORDFORMAT %C
LF(%STRING(11) NAME,%INTEGER FSYS,DISC ADDR,STATE)
      %RECORDFORMAT %C
PROCDATF(%STRING(6)USER, %BYTEINTEGER INVOC,  %C
      %BYTEINTEGER SP1, SP2, NODENO, FSYS,    %C
      %INTEGER REASON,ID,PROCESS,PREV WARN,SESSEND,  %C
      %BYTEINTEGER GETMODE,PREEMPT,BLNK,LINK)
      %RECORDFORMAT %C
LOGF HDF(%INTEGER LOGMAPST,SPARE0,  %C
      %BYTEINTEGER FREEHD,LIVEHD,BACKHD,SPARE, %C
      %INTEGER FES FOUND, %C
      %BYTEINTEGERARRAY FE USECOUNT(0:TOP FE NO), %C
      %RECORD(LF)%ARRAY LOGS(0:TOPLOG), %C
      %RECORD(FEPF)%ARRAY FEPS(0:TOP FE NO), %C
      %RECORD(PROCDATF)%ARRAY PROCLIST(0:255),  %C
      %INTEGER LEND)
      %RECORDFORMAT %C
TMODEF (%HALFINTEGER FLAGS, %BYTEINTEGER PADS,SPARE, LINELIM, PAGE, %C
      %BYTEINTEGERARRAY TABS(1:8), %BYTEINTEGER CR, ESC, DEL, CAN,  %C
      PROMPT, END, %HALFINTEGER FLAGS2, SPARE2, SPARE3,             %C
      %BYTEINTEGER SCREED1, SCREED2, SCREED3, SCREED4, SCREED5, SCREED6)
!>
!<UINFF
      %RECORDFORMAT %C
UINFF (%STRING(6) USER, %STRING(31) JOBDOCFILE, %C
      %INTEGER MARK, FSYS, PROCNO, ISUFF, REASON, BATCHID, SESSICLIM, %C
      SCIDENSAD, SCIDENS, STARTCNSL, AIOSTAT, SCT DATE, %C
      SYNC1 DEST, SYNC2 DEST, ASYNC DEST, AACCT REC, AIC REVS, %C
      %STRING(15)JOBNAME, %STRING(31)BASEFILE, %INTEGER PREVIC, %C
      %INTEGER ITADDR0, ITADDR1, ITADDR2, ITADDR3, ITADDR4, %C
      STREAM ID, DIDENT, SCARCITY, PREEMPTAT, %STRING(11)SPOOLRFILE, %C
      %INTEGER FUNDS, SESSLEN, PRIORITY, DECKS, DRIVES, PART CLOSE,%C
      %RECORD(TMODEF) TMODES,  %C
      %INTEGER PSLOT, %STRING(63) ITADDR, %C
      %INTEGERARRAY FCLOSING(0:3), %INTEGER CLO FES, UEND)
%ENDOFLIST
!
!
!
!   USER            The six-character name of the process owner.
!
!   JOBDOCFILE      For a batch process (see REASON) the name of a file
!                   containing commands to be executed.
!
!   MARK            Currently 1, to be used in achieving forward
!                   compatibility if this record format is to be
!                   drastically changed.
!
!   FSYS            The file system (disc number) on which the user's
!                   file index and files reside.
!
!   PROCNO          The process number.
!
!   ISUFF           A single digit, held as an ISO character, which
!                   serves as an "invocation number" for the process. 
!                   If more processes than one belonging to a single
!                   user are to be concurrent, a subsystem may wish to
!                   create work files having distinct identifiers by
!                   concatenating this character to a standard file name
!
!   REASON          This gives the reason for the creation of the
!                   process:
!
!                   0 = interactive log-on
!                   1 = started from an OPER console
!                   2 = started as a batch (non-interactive) process by
!                       SPOOLR.
!                   3 = test process
!                   4 = D/NEWSTART from OPER console
!
!   BATCH ID        A unique integer identifier associated with the
!                   batch job (for REASON=2).
!
!   SESS IC LIM     The maximum number of thousands of machine
!                   instructions which may be executed during the
!                   current session by the process.  For interactive
!                   sessions this is currently a very large number.  For
!                   batch sessions it is a number given when a job is
!                   submitted to the SPOOLR process for queuing and
!                   subsequent execution.  If this limit is reached by
!                   the process, it is terminated with a message at the
!                   main Oper console:
!
!                           SIGNAL FAIL 4
!
!                   A subsystem should preferably guard against this
!                   occurrence by keeping an eye on the number of
!                   instructions executed in the current session, using
!                   Director procedure DSFI (TYPE=21).
!
!   SC IDENS AD,    These are used to acquire access to the Director
!   SC IDENS        procedures, as described in Chapter 4.
!
!   STARTCNSL       Gives the logical number of the Oper console from
!                   which the process was started (for REASON=1).
!
!   AIOSTAT         The address of a record describing interactive I/O
!                   status.  The format of the record is:
!
!                    (integer IAD, string(15) INTMESS,
!                     integer INBUFLEN, OUTBUFLEN, INSTREAM, OUTSTREAM)
!
!   SCT DATE        This may be used in conjunction with SC IDENS AD and
!                   SC IDENS.
!
!   SYNC1 DEST      The three service numbers allocated by the
!   SYNC2 DEST      Supervisor to the local process (see Ref. 10).
!   ASYNC DEST
!
!   AACCTREC        The address of a record, visible at ACR 15, of
!                   format:
!
!                       (longinteger MICROSECS, integer PTURNS, KINSTRS)
!
!                   The MICROSECS field holds the number of microseconds
!                   of OCP time used by the process.
!  
!                   The KINSTRS field of this record contains the number
!                   of K instructions (1K=1024) executed during the
!                   current session, it is updated only at calls of
!                   certain Director functions.
!
!                   The PTURNS field contains the total number of page
!                   turns performed on behalf of the process.
!
!   AICREVS         The address of a word containing the number of
!                   "revolutions" of the IC machine register (or
!                   "IC-register-fulls") to be expended (in addition to
!                   the current value of the IC register) before an
!                   instruction-counter interrupt is given to the user
!                   process.
!
!   The fields above may be used to determine a number of K instructions
!   executed during the current session using the formula:
!
!           AACCTREC_KINSTRS + (UINF_PREVIC - GETIC)
!
!   where GETIC is
!
!           (Image store 6)>>10 + INTEGER(UINF-AICREVS)<<14
!
!   (with certain modifications depending on the state of the IC carry
!    bit).
!   JOBNAME         A character string identifier associated with the
!                   batch job when it was submitted to the SPOOLR
!                   process (for REASON=2).
!
!   BASEFILE NAME   The name of the basefile in use by the process.
!
!   PREVIC          The value of the current instruction-execution limit
!                   (in K instructions) at the time the KINSTRS field in
!                   the ACCT REC field was last updated.
!
!
!
!   ITADDR0-4       Reserved for a full network address of the process's
!                   interactive terminal.
!   STREAM ID
!
!   D IDENT
!
!
!   SCARCITY        The number of users on the System at and above
!                   which the machine resource is deemed to be scarce
!                   (the funds field of the process owner's index header
!                   is decremented according to the local charging
!                   formula for interactive sessions while the number of
!                   System users is greater than or equal to this value)
!                   This value is kept in the RATION field of the COM
!                   record (in public segment 48), see below.
!
!   PREEMPT AT      The number of users on the System at and above which
!                   an interactive user currently having no funds
!                   is eligible for pre-emption (i.e. automatic
!                   logging-off) by interactive users with positive
!                   funds.  This value is also kept in
!                   the RATION field in the COM record (in public
!                   segment 48).
!
!
!   The four bytes of the integer COM_RATION hold the following data
!   (most significant byte = byte zero):
!
!           0       number of interactive users at and above which
!                   resources for interaction are deemed to be scarce
!                   (SCARCITY)
!
!           1       number of interactive users at and above which a
!                   user having no scarce resource units may be pre
!                   -empted (logged off with 5 minutes' warning)
!                   because a new user with some scarce-resource units
!                   has logged on (PREEMPT A)
!
!           2       spare (zero)
!
!           3       current number of interactive processes
!
!   These values should be used in preference to those in the UINF
!   record, the fields in UINF are to be withdrawn.
!
!
!   SPOOLR FILE     is used by Director during batch process
!                   start up and has no subsequent relevance
!
!   FUNDS           the current number of funds
!                   held by the process owner (or his group-holder)
!                   This field is relevant only when resources are
!                   deemed to be scarce.
!   SESSLEN         is the limit in minutes of the session, i.e. the
!                   maximum duration of the process in elapsed minutes.
!                   A value of zero implies no limit. Relevant only for
!                   interactive sessions.
!
!   PRIORITY        For a batch job, the priority as specified by the
!                   user:
!                       1 = very low
!                       2 = low
!                       3 = standard
!                       4 = high
!                       5 = very high
!
!   DECKS           The number of tape decks to be available to this
!                   (batch) job.
!
!   DRIVES          The number of disc drives to be available to this
!                   (batch) job.
!
!   PARTCLOSE       Set -1 at process startup if a partial close is in force
!                   otherwise zero.
!
!   TMODES          Describes the terminal characteristics. This record is zero
!                   until a DGETMODE has been issued. Subsequently it contains
!                   data from the TCP.
!
!   UEND            marks the end of the record.
!>
%LIST
!>
!
%OWN %RECORD (UINFF) %NAME UINF
!
!-----------------------------------------------------------------------
!
%CONST %INTEGER MONOP = 1
!
%SYSTEMROUTINESPEC SETPAR(%STRING (255) S)
%SYSTEMSTRINGFNSPEC SPAR(%INTEGER N)
%SYSTEMINTEGERFNSPEC PSTOI(%STRING (63) S)
%SYSTEMROUTINESPEC PSYSMES(%INTEGER ROOT, MESS)
%SYSTEMROUTINESPEC SETFNAME(%STRING (40) NAME)
%SYSTEM %ROUTINE %SPEC CONSOLE (%INTEGER EP, %INTEGER %NAME I, J)
%EXTERNAL %INTEGER %FN %SPEC UINFI (%INTEGER N)
%EXTERNAL %STRING %FN %SPEC UINFS (%INTEGER N)
%EXTERNAL %INTEGER %FN %SPEC DMODE (%INTEGER SET, ADR, CMD)
%SYSTEMINTEGERMAPSPEC COMREG(%INTEGER I)
!!
!!

%EXTERNALROUTINE SETMODE(%STRING (255) S)
!!SET TCP OPTIONS
%CONSTSTRING (9) %ARRAY FNAME(65 : 87) =         %C
"APPEND","BINARY","CANCEL","DELETE","ECHO","FLOW","GRAPH","HEIGHT",
"INT","","","LOWER","MODES","NEWRECORD","","PADS","","RETURN",
"STOPINPUT","TABS","UPPER","VIDEO","WIDTH"
!!ACTION = (TYPE<<8) ! FUNCTION NO
!!TYPES 0-8 REQUIRE DIFFERENT PARAMS  -  WE SWITCH TO ANALYSE THEM
!!FUNCTIONS 1-19 DEFINE ACTION REQUIRED
%CONSTHALFINTEGERARRAY ACTION(65 : 87) =      %C
  X'410',  X'209',  X'308',  X'307',  X'201',  X'211',  X'20B',  X'402', 
  X'306',   X'00',   X'00',  X'10C',  X'000',  X'713',   X'00',  X'50E',
   X'00',  X'305',  X'412',  X'80A',  X'10D',  X'20F',  X'603'
!      A        B        C        D        E        F        G        H
!      I        J        K        L        M        N        O        P
!      Q        R        S        T        U        V        W
%CONSTBYTEINTEGERARRAY TABDEFAULTS(0 : 8) =        %C
 1,6,9,12,15,18,40,80,160
%CONSTBYTEINTEGERARRAY LOWER(3 : 7) =   %C
      2,0,0,15,0
%CONSTBYTEINTEGERARRAY UPPER(3 : 7) =     %C
    127,255,100,160,31
%OWN %INTEGER NEW STREAM MODE = 1; ! Default is "circular ISO".
%INTEGER FLAG, TYPE, LETTER, J, I, PAR, FNO, BINMARK, ASTART, PT, TCPT
%STRING (31) TERMAD
%BYTEINTEGERARRAY AREA(0 : 63)
%BYTEINTEGERARRAYNAME PARLIST
%BYTEINTEGERARRAYFORMAT PARF(0 : 7)
%STRING (63) NEXT, PARAM, FUNCTION, TAB
%SWITCH SW(0 : 8)
   TERMAD = UINFS (14)
   %IF LENGTH(TERMAD)>3 %THEN TCPT = 1 %ELSE TCPT = 0
   ! TCPT is 1 for a 'new' TCP and 0 for an 'old' one.
   ! No parameter means "take defaults":
   %IF S="" %THEN %START
      %IF TCPT#0 %THEN S = "W=80" %ELSE S = "W=72"
      S = S. %C
",A=0,C=24,D=127,E,F=OFF,G=OFF,H=0,I=27,P=0,R=13,U,V=OFF,T=6:9:12:15:18:40:80"
   %FINISH
   SETPAR(S)
   BINMARK = 0
   FLAG = 0
   ASTART = ADDR(AREA(0))
   PT = 1
   %CYCLE
      %IF PT > 53 %THEN %START
         FLAG = 215;                          !TOO MANY PARAMS
         PSYSMES(76,FLAG)
         %EXIT
      %FINISH
      NEXT = SPAR(0);                         !GET NEXT PARAMETER
      %IF NEXT = "" %THEN %EXIT;              !END OF LIST
      FLAG = 0
      LETTER = CHARNO(NEXT,1)
      %IF LETTER='-' %THEN %START
         %IF   LENGTH(NEXT)=1                                %C
         %THEN -> ERR                                        %C
         %ELSE NEXT = SUBSTRING(NEXT,2,LENGTH(NEXT))."=OFF"
         LETTER = CHARNO (NEXT,1)
      %FINISH
      %UNLESS 65 <= LETTER <= 87 %AND ACTION(LETTER) # 0 %THEN -> ERR
      TYPE = ACTION(LETTER)>>8
      FNO = ACTION(LETTER)&X'FF'
      %IF TYPE<=1 %THEN %START
         FUNCTION = NEXT
         PAR = 0
      %FINISH %ELSE %START
         %UNLESS NEXT->FUNCTION.("=").PARAM %THEN %START
            %IF TYPE=2 %THEN %START
               PARAM = "ON"
               FUNCTION = NEXT
            %FINISH %ELSE -> ERR
         %FINISH
      %FINISH
      %IF LENGTH(FUNCTION) > 1 %AND FUNCTION # FNAME(LETTER) %THEN -> ERR
                                              !CHECK FULL NAME
      AREA(PT) = FNO
      -> SW(TYPE)
SW(1):                                        !FOR LOWER,UPPER
      PAR = 0;                                !NO PARAMETERS
      %IF LETTER='U' %AND TCPT=0 %THEN %START
         NEW STREAM MODE = 1
         BINMARK = 1
      %FINISH
      -> NOTE PARAMS
SW(2):                                        !FOR ECHO,BINARY,VIDEO,FLOW,GRAPH
                                              !PARAM=ON,OFF
      %IF PARAM = "ON" %THEN PAR = 1 %ELSE %START
         %IF PARAM = "OFF" %THEN PAR = 0 %ELSE -> ERR
      %FINISH
      %IF LETTER='G' %THEN %START
         %IF       PAR=1  %THEN NEW STREAM MODE = X'21'  %C
         %ELSE %IF TCPT#0 %THEN NEW STREAM MODE = 1
      %FINISH
      %IF LETTER='B' %AND LENGTH(FUNCTION)=1 %THEN -> ERR
      %IF LETTER='B' %OR LETTER='G' %THEN BINMARK = PAR + 1
                                              !ONLY ALLOW FULL NAME
      -> NOTE PARAMS
SW(3):                                        !FOR CANCEL,DELETE,INT,RETURN(2-127)
SW(4):                                        !HEIGHT,APPEND,STOPINPUT(0-255)
SW(5):                                        !PADS(0-100)
SW(6):                                        !WIDTH(15-160)
SW(7):                                        !NEWRECORD(0:31)
      %IF PARAM="OFF" %THEN PAR = 0 %ELSE PAR = PSTOI(PARAM); ! PARAM = NUMBER
      %IF LOWER(TYPE) <= PAR <= UPPER(TYPE) %THEN -> NOTE PARAMS
                                              !CHECK RANGE
      -> ERR
SW(8):                                        !TABS
                                              !PARAM=NUMERIC LIST
      PARLIST == ARRAY(ADDR(AREA(PT+1)),PARF)
      PARLIST(0) = 1
      I = 0
      %IF PARAM # "*" %THEN %START
         %WHILE PARAM # "*" %CYCLE;           !LOOK OUT FOR TERMINATOR
            %UNLESS PARAM -> TAB.(":").PARAM %THEN TAB = PARAM %AND PARAM = ""
            I = I+1
            PARLIST(I) <- PSTOI(TAB)
            %IF I = 7 %THEN %START;           !SHOULD BE EMPTY NOW
               %IF PARAM = "" %THEN %EXIT %ELSE -> ERR
            %FINISH
            %IF PARAM = "" %THEN -> ERR;      !INCOMPLETE LIST
         %REPEAT
         %CYCLE J = 1,1,I;                    !CHECK RANGE AND SEQUENCE
            %UNLESS PARLIST(J-1) < PARLIST(J) <= 160 %THEN -> ERR
         %REPEAT
      %FINISH
      %IF I < 7 %THEN %START;                 !FILL REST OF TAB VECTOR
         J = 0
         %WHILE TABDEFAULTS(J)<=PARLIST(I) %AND J<8 %CYCLE
            J = J+1
         %REPEAT
         %CYCLE I = I+1,1,7
            PARLIST(I) = TABDEFAULTS(J)
            J = J+1 %UNLESS J = 8
         %REPEAT
      %FINISH
      PT = PT+9
      -> REP
NOTE PARAMS:                                  !DONT DO THIS FOR TABS
      AREA(PT+1) = PAR;                       !INSERT SINGLE PARAMETER
      PT = PT+2
      -> REP
ERR:                                          !INDICATE INVALID PARAMETER
      FLAG = 202
      SETFNAME(NEXT)
      PSYSMES(76,FLAG)
REP:
   %REPEAT
   %IF MONOP#0 %THEN %START
     %IF FLAG#0 %THEN %START
        PRINT STRING ("Flag:")
        WRITE (FLAG,3)
        NEWLINE
     %FINISH
     PRINT STRING ("Bytes to send:")
     WRITE (PT-1,3)
     NEWLINE
   %FINISH
   %IF PT>1 %AND FLAG=0 %THEN %START;                   !SOMETHING TO SEND
      %IF MONOP#0 %THEN %START
        %CYCLE I=1,1,PT-1
           WRITE (AREA(I),2)
        %REPEAT
        NEWLINE
      %FINISH
      AREA(0) = PT - 1
!
! **** **** TEMPORARY BODGE **** ****
!
!     UINF == RECORD (9<<18)
!     %IF UINFI(24)=-2 %AND (UINF_STREAMID>>16)&255=2 %THEN %START
!
! **** **** TO REPLACE
!
      %IF UINFI(24)=-2 %THEN %START
!
! **** **** END OF TEMPORARY BODGE **** ****
!
         ! New FEP interface:
         %IF BINMARK#0 %THEN CONSOLE (18, BINMARK, I); ! Tell FEP.
         FLAG = DMODE (1, ASTART, 0); ! Tell TCP.
         %IF MONOP#0 %THEN PRINT STRING ("New")
      %FINISH %ELSE %START
         ! Old FEP interface:
         CONSOLE (17,ASTART,NEW STREAM MODE)
         %IF MONOP#0 %THEN PRINT STRING ("Old")
      %FINISH
      %IF MONOP#0 %THEN %START
         PRINT STRING (" FEP software")
         NEWLINE
      %FINISH
   %FINISH
   %IF MONOP#0 %THEN %START
      %IF TCPT=0 %THEN PRINT STRING ("Old") %ELSE PRINT STRING ("New")
      PRINT STRING (" TCP software")
      NEWLINE
     PRINT STRING ("Flag:")
     WRITE (FLAG,3)
     NEWLINE
   %FINISH
   COMREG(24) = FLAG;                         !SET RETURN CODE
%END;                                         !OF NEWMODE
%ENDOFFILE