! 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