mirror of
https://github.com/retro-software/B5500-software.git
synced 2026-03-07 02:59:55 +00:00
1. Commit library tape images, directories, and extracted text files. 2. Commit additional utilities under Unisys-Emode-Tools.
7790 lines
616 KiB
Plaintext
7790 lines
616 KiB
Plaintext
% 00010000
|
|
% B5500 SNOBOL3 SYSTEM. 00020000
|
|
% 00030000
|
|
% WRITTEN BY: 00040000
|
|
% JOHN M. CHAMBERS 00050000
|
|
% DEPT. OF COMPUTER SCIENCES 00060000
|
|
% UNIVERSITY OF WISCONSIN 00070000
|
|
% 1210 W. DAYTON ST. 00080000
|
|
% MADISON, WISCONSIN 53706 00090000
|
|
% 00100000
|
|
% USERS MANUAL AVAILABLE FROM ABOVE ADDRESS. 00110000
|
|
% 00120000
|
|
% 00130000
|
|
% DATA REPRESENTATION: 00140000
|
|
% 00150000
|
|
% TO TAKE ADVANTAGE OF THE CHARACTER MODE STRING COMPARE AND MOVE 00160000
|
|
% INSTRUCTIONS, STRINGS ARE STORED AS CONSECUTIVE CHARS, PRECEDED BY A 00170000
|
|
% 3-CHAR BACK-POINTER TO THE SYMBOL TABLE. THIS POINTER CONSISTS OF AN00180000
|
|
% "ILLEGAL CHARACTER" FOLLOWED BY 2 CHARS (12 BITS) GIVING A SYMBOL 00190000
|
|
% TABLE LOCATION (SEE DESCRIPTION OF SYMBTABL). STRINGS ARE STORED IN 00200000
|
|
% ROWS OF THE ARRAY DATA[*,*]. 00210000
|
|
% 00220000
|
|
% 00230000
|
|
% DUE TO THE SIZE LIMITATION ON ALGOL ARRAYS, AND THE FACT THAT IT 00240000
|
|
% WAS FELT UNDESIRABLE TO BREAK UP A STRING, THERE IS A LIMITATION TO 00250000
|
|
% THE SIZE OF A STRING--8181 CHARS, TO BE EXACT. IF THIS LIMIT IS 00260000
|
|
% EXCEEDED, THE PROCEDURE STRING WILL PRINT A DIAGNOSTIC AND SET THE 00270000
|
|
% FLAG DEATH TO TRUE, TERMINATING THE PROGRAM. 00280000
|
|
% A STRING IS IDENTIFIED BY A 31-BIT "DESCRIPTOR"; IF D IS SUCH A 00290000
|
|
% DESCRIPTOR, THE FOLLOWING FIELDS LOCATE THE STRING (SEE DEFINE 00300000
|
|
% DECLARATIONS): 00310000
|
|
% D.S: SIZE OF STRING 00320000
|
|
% D.R: STRING IS IN DATA[D.R,*] 00330000
|
|
% D.CH: FIRST CHAR OF STRING, RELATIVE TO DATA[D.R,0] 00340000
|
|
% IN OTHER WORDS, THE STRING CONSISTS OF D.S CHARACTERS, STARTING D.C 00350000
|
|
% CHARS AFTER DATA[D.R,D.W]. 00360000
|
|
% NOTE THAT, SINCE ALL STRINGS ARE PRECEDED BY A 3-CHAR POINTER 00370000
|
|
% TO SYMBTABL, THE VALUE OF THE CH FIELD MUST BE } 3. THIS FACT 00380000
|
|
% IS USED TO DISTINGUISH CELLS WHICH HAVE "MISSING" VALUES (SUCH 00390000
|
|
% AS THE VALUE PARTS FOR STRINGS WHICH HAVE NOT BEEN ASSIGNED A 00400000
|
|
% VALUE). THUS, IF THE CH FIELD IS < 3, THERE IS NO STRING ATTACHED, 00410000
|
|
% AND THE VALUE IS CONSIDERED TO BE NULL. THE S FIELD SHOULD BE 0 00420000
|
|
% IN SUCH CASES. 00430000
|
|
% SEVERAL "BUGS" HAVE BEEN FOUND TO BE CAUSED BY NOT RECOGNIZING 00440000
|
|
% THAT A STRING DESCRIPTOR MAY NOT POINT TO A STRING--THIS CAN BE 00450000
|
|
% AVOIDED BY TESTING TO SEE IF THE CH FIELD IS } 3. IF SO, THE 00460000
|
|
% STRING EXISTS; IF NOT, THERE IS NO STRING, AND THE VALUE IS NULL. 00470000
|
|
% 00480000
|
|
% 00490000
|
|
% 00500000
|
|
% 00510000
|
|
%***********************************************************************00520000
|
|
BEGIN 00530000
|
|
INTEGER COMMON; % THESE BITS ARE CURRENTLY RELEVANT: 00540000
|
|
% [47:1] = 1 TURNS ON TRACING FOR ALL VARIABLES. 00550000
|
|
% [46:1] = 1 CAUSES A COMPLETE DUMP AT THE END OF RUN. 00560000
|
|
% [45:1] = 1 SAYS THAT MODE("INFORM") OR -INFORM IS TO TURN ON 00570000
|
|
% SYSTEM DEBUGGING AIDS. 00580000
|
|
DEFINE 00590000
|
|
C=[45:3]#, % CHAR WITH IN WORD OF STRING DESCRIPTOR 00600000
|
|
C1=[6:6]#, 00610000
|
|
C2=[12:6]#, 00620000
|
|
C3=[18:6]#, 00630000
|
|
C4=[24:6]#, 00640000
|
|
C5=[30:6]#, 00650000
|
|
C6=[36:6]#, 00660000
|
|
C7=[42:6]#, 00670000
|
|
CH=[35:13]#, % CHAR OF DATA[*,*] ROW OF STRING DESCRIPTOR 00680000
|
|
CQUOTE4="""[24:42:6]#, % MOVE QUOTE TO CHAR 4 00690000
|
|
CQUOTE5="""[30:42:6]#, % MOVE QUOTE TO CHAR 5 00700000
|
|
CONCR=[30:43:5]#, % MOVE TO R FIELD 00710000
|
|
CONCS=[17:35:13]#, % MOVE TO S FIELD 00720000
|
|
CONCW=[35:38:10]#, % MOVE TO W FIELD 00730000
|
|
CONTROLPOINT=INST[INSTRUCT],NEARPOINT#, 00740000
|
|
DATASIZE=31#, % UPPER BOUND ON FIRST SUBSCRIPT OF DATA[*,*] 00750000
|
|
DISKRECORD=RECORD#, 00760000
|
|
F= FALSE #, 00770000
|
|
FIRSTCHAR(FIRSTCHAR1)=DATA[(FIRSTCHAR1).R,(FIRSTCHAR1).W], 00780000
|
|
(FIRSTCHAR1).C#, 00790000
|
|
INTRINSMAX=17#, % MAX # INTRINSIC FCTS OF SAME SIZE 00800000
|
|
MAXLABELLIMIT=15#, % MAX NUMBER OF LABEL LIMITS FOR DEBUGGING 00810000
|
|
MAXLEVEL=100#, % MAXIMUM ALLOWED DEPTH OF FUNCTION CALLS 00820000
|
|
MAXSUSPENDREASON=3#, % NUMBER DIFFERENT REASONS FOR SUSPENDING. 00830000
|
|
MNEMMAX=20#, 00840000
|
|
NUMCONTROLCARDS=21#, % NUMBER OF CONTROL CARDS IMPLEMENTED; 00850000
|
|
% MUST BE CHANGED IF NEW CONTROL CARDS ARE 00860000
|
|
% TO BE IMPLEMENTED 00870000
|
|
R=[30:5]#, % DATA[*,*] ROW OF STRING DESCRIPTOR 00880000
|
|
RCH=[30:18]#, % R, W, AND C FIELDS 00890000
|
|
S=[17:13]#, % SIZE OF STRING 00900000
|
|
SEGMENT = LABEL DUMMY;#, % FOR FORCING NEW SEGMENT. 00910000
|
|
STACKSIZE=50#, % SIZE OF INTERPRETER STACK ARRAYS 00920000
|
|
STRINGLOC(STRINGLOC1)=(STRINGLOC1).S,FIRSTCHAR(STRINGLOC1)#, 00930000
|
|
T= TRUE #, 00940000
|
|
TEMP=AA#, % 00950000
|
|
TEMP1=AB#, % 00960000
|
|
TEMP2=AC#, % 00970000
|
|
TEMPCEL(TEMPCEL1) = TEMPCELL#, % PARAMETER NO LONGER IN USE 00980000
|
|
VERSION = 3.0#, % VERSION NUMBER: 00990000
|
|
% 2.0 IS THE REWRITTEN COMPILER. 01000000
|
|
% 2.1 INCLUDES FATAL ERROR SUSPENSIONS WHEN DEBUGGING. 01010000
|
|
% 2.2 HAS MOST SYSTEM DEBUGGING AIDS CHANGED TO COMMENTS. 01020000
|
|
% 3.0 HAS THE ARRAY USEDCELL[*] DELETED (CHANGES LIBRARY FILES). 01030000
|
|
W=[35:10]#; % WORD WITHIN DATA[*,*] ROW OF STRING DESCRIPTOR 01040000
|
|
DEFINE 01050000
|
|
ABORT = GO TO ABORTION;#, % FATAL SYSTEM ERROR. 01060000
|
|
SETLIMITFLAG = ALIMITEXISTS ~ 01070000
|
|
CPULIMITEXISTS OR 01080000
|
|
IOLIMITEXISTS OR 01090000
|
|
RULELIMITEXISTS OR 01100000
|
|
(DEBUGGING AND 01110000
|
|
(DEBUGRULELIMITEXISTS OR 01120000
|
|
NLABELLIMIT } 0 01130000
|
|
) 01140000
|
|
) 01150000
|
|
#; 01160000
|
|
BOOLEAN 01170000
|
|
ALIMITEXISTS, % THERE IS A LIMIT TO CHECK AT START OF INSTS. 01180000
|
|
B1, % TEMPORARY BOOLEAN "REGISTER" 01190000
|
|
CONVERTF, % DECK IS 026 CHAR SET 01200000
|
|
CONVERTSTRINGS, % CONVERT 3600 I/O STRINGS 01210000
|
|
CPULIMITEXISTS, % 01220000
|
|
DATACOMF, % DATA COM UNIT IN USE 01230000
|
|
DEATH, % FATAL ERROR HAS OCCURRED 01240000
|
|
DEBUGGING, % DEBUG MODE IN USE 01250000
|
|
DEBUGRULELIMITEXISTS, 01260000
|
|
DMPDATA, % EXECUTE WRITEDATA AT END OF RUN 01270000
|
|
DMPST, % EXECUTE WRITEST (DUMP SYMB TABLE) AT END OF RUN 01280000
|
|
DMPSTR, % EXECUTE STRINGDUMP AT END OF RUN 01290000
|
|
DUMPALL, % TRUE IF COMPLETE DUMP TO BE DONE AT EOJ 01300000
|
|
ERRDUMP, % DUMP IF FATAL PROGRAM ERROR 01310000
|
|
EXECUTE, % SET FALSE IF FATAL ERROR DURING COMPILATION 01320000
|
|
INFORM, % PRINT SYSTEM DEBUGGING MESSAGES 01330000
|
|
IOLIMITEXISTS, % 01340000
|
|
LOADF, % LOADER IS BEING EXECUTED 01350000
|
|
PRINTMESSAGES, % PRINT DIAGNOSTIC (WARNING) MESSAGES. 01360000
|
|
RESULT, % SUCCESS/FAIL FLAG FOR INTERPRETER 01370000
|
|
RULELIMITEXISTS,% 01380000
|
|
SYSTEMDEBUGGING,% TRUE IF COMMON.[45:1] = 1 01390000
|
|
SYSTEMERROR, % FATAL ERROR BY SNOBOL SYSTEM, NOT PROGRAM 01400000
|
|
TRACEALL; % TRACE EVERY VARIABLE WITHOUT I/O USE 01410000
|
|
BOOLEAN ARRAY 01420000
|
|
SUSPENDREASON[0:MAXSUSPENDREASON], % REASONS FOR SUSPENDING PROGRAM: 01430000
|
|
% 0: SUSPEND() WAS EXECUTED 01440000
|
|
% 1: RULE LIMIT WAS HIT 01450000
|
|
% 2: LABEL LIMIT WAS HIT 01460000
|
|
% 3: FATAL ERROR IN PROGRAM 01470000
|
|
USEDROW[0:DATASIZE]; % DATA[I,*] IS IN USE 01480000
|
|
INTEGER 01490000
|
|
ANCHORMODE, % 2: UNANCHORED, 3: ANCHORED 01500000
|
|
ANCHORSIZE, % FOR ANCHORED MODE, SIZE OF INITIAL SEGMENT 01510000
|
|
DCSIZE, % SIZE OF LAST INPUT FROM DCREAD 01520000
|
|
DEBUGRULELIMIT, 01530000
|
|
DIVIDEMODE, % 0: ROUND; 1: TRUNCATION; 2: INTEGER 01540000
|
|
GCS, % NUMBER OF GARBAGE COLLECTOR CALLS 01550000
|
|
I, 01560000
|
|
I1, I2, % TEMPORARY INTEGER "REGISTERS". 01570000
|
|
J, 01580000
|
|
LEVEL, % LEVEL (OR DEPTH) OF RECURSION OF THE INTERPRETER 01590000
|
|
LISTSPACES, % NUMBER OF BLANK LINES BETWEEN LINES OF LISTING 01600000
|
|
LOADERLEVEL, % LEVEL OF RECURSION IN LOADER 01610000
|
|
MAXINSTSIZE, % SIZE OF LARGEST PROGRAM SEGMENT (IN CHARS) 01620000
|
|
NLABELLIMIT, % NUMBER OF LABEL LIMITS SET AT LAST SUSPENSION 01630000
|
|
PARENCOUNT, % DEPTH IN PARENTHESIS NESTING (COMPILE AND SCAN) 01640000
|
|
RW, % NEW STRINGS COME FROM DATA[RW,*] (SEE STRING) 01650000
|
|
TEMPROW, % ROW OF SYMB TABLE GIVING TEMP CELLS 01660000
|
|
UNIT; % USED BY I/O ROUTINES--FILE NUMBER 01670000
|
|
INTEGER ARRAY 01680000
|
|
CONVERTVAL, % FOR CHAR SET CONVERSIONS 01690000
|
|
DOTTYPE, % PARTITIONS CHARS IN INTERNAL REP. OF ARITH, 01700000
|
|
OPLEVEL[0:63], % PRECEDENCE LEVEL OF ARITH OPS 01710000
|
|
DPNTR, % POINTER TO NEXT AVAILABLE CHAR IN DATA[I,*] 01720000
|
|
NOTMOVED[0:DATASIZE], % POINTS TO FIRST CHAR MOVED BY LAST CALL 01730000
|
|
% OF GARBAGE COLLECTOR. 01740000
|
|
MONTHS[1:12], % NUMBER OF DAYS IN EACH MONTH 01750000
|
|
RULES[0:MAXLEVEL]; % # RULES EXECUTED AT VARIOUS LEVELS 01760000
|
|
REAL 01770000
|
|
CPULIMIT, % LIMIT TO CPU TIME IN SECONDS. 01780000
|
|
GCTIMECP, % CPU TIME SPENT COLLECTING GARBAGE 01790000
|
|
GCTIMEIO, % I/O TIME SPENT COLLECTING GARBAGE 01800000
|
|
IOLIMIT, % LIMIT TO I/O TIME IN SECONDS. 01810000
|
|
RANDNO, % NUMBER FOR .RANF FUNCTION 01820000
|
|
RULELIMIT, % LIMIT TO NUMBER OF RULES EXECUTED. 01830000
|
|
TEENYNEG; % = OCT3777777777777777 01840000
|
|
ALPHA 01850000
|
|
AA,AB,AC, % TEMPORARY ALPHA "REGISTERS" 01860000
|
|
ARROW, % = "~" 01870000
|
|
BLANK, % = " " 01880000
|
|
BLANKS, % = " " (8 BLANKS) 01890000
|
|
COLON, % = ":" 01900000
|
|
COMMA, % = "," 01910000
|
|
CRLF, % = "{!~" 01920000
|
|
EQSIGN, % = "=" 01930000
|
|
QMARK, % ILLEGAL CHAR 01940000
|
|
QUOTE, % = """ 01950000
|
|
PRINTLOC, % SYMBOL TABLE LOCATION OF PRINT (SEE CODE 01960000
|
|
% FOR SYSPOT IN SNBLOUT.) 01970000
|
|
SLASH, % = "/" 01980000
|
|
STAR, % = "*" 01990000
|
|
STOPPER; % = BLANK & QUOTE & QMARK (FOR ENDING SCANS.) 02000000
|
|
ALPHA ARRAY 02010000
|
|
BUFFER[0:14], % USED BY COMPILER TO HOLD NEXT INPUT CARD 02020000
|
|
BUFOUT[0:16], % FOR BUILDING PRINTER OUTPUT MESSAGES. 02030000
|
|
CODE[0:1022], 02040000
|
|
CONTROLCARD[0:NUMCONTROLCARDS], % NAMES OF CONTROL CARDS 02050000
|
|
DATA[0:DATASIZE,0:1022], % STRING AND PROGRAM STORAGE AREA 02060000
|
|
INTRINSFCT[3:7,0:INTRINSMAX], % NAMES OF INTRINSIC FUNCTION. 02070000
|
|
INTRINSNDX[3:7,1:INTRINSMAX], % INDICES OF INTRINSIC FUNCTIONS. 02080000
|
|
LABELLIMIT[0:MAXLABELLIMIT], % SYMBOL TABLE LOCATIONS OF 02090000
|
|
% LABEL LIMITS DURING DEBUGGING 02100000
|
|
MNEMONIC[0:1,0:MNEMMAX], % VARIOUS MNEMONIC COMMANDS AND WORDS 02110000
|
|
NEXTRECORD[0:15,0:17], % HOLDS RECORDS FOR LOOK-TYPE STRINGS 02120000
|
|
SCRATCH[0:1022], % TEMPORARY STRING ARRAY 02130000
|
|
WORDS[0:30]; % VARIOUS ALPHANUMERIC STRINGS 02140000
|
|
MONITOR INTOVR, EXPOVR, INDEX, FLAG; 02150000
|
|
%********SYMBOL TABLE***************************************************02160000
|
|
% 02170000
|
|
% THE SYMBOL TABLE: 02180000
|
|
% 02190000
|
|
% 02200000
|
|
% EVERY DATA OBJECT (STRINGS, LITERAL, FUNCTION, LABEL) REQUIRES 02210000
|
|
% AN ENTRY IN THE SYMBOL TABLE. THIS TABLE CONSISTS OF THE FOLLOWING 02220000
|
|
% THREE ARRAYS AND ASSOCIATED MACROS: 02230000
|
|
% 02240000
|
|
DEFINE 02250000
|
|
NAME[NAME1] = NAMTABL[(NAME1).STR,(NAME1).STW] #, 02260000
|
|
VALU[VALU1] = VALTABL[(VALU1).STR,(VALU1).STW] #, 02270000
|
|
IO[IO1] = IOTABL[(IO1).STR,(IO1).STW] #, 02280000
|
|
STRMAX = 15 #, % MAX FIRST SUBSCRIPT TO SYMB TABLE. 02290000
|
|
STWMAX = 255 #; % MAX SECOND SUBSCRIPT TO SYMB TABLE. 02300000
|
|
ALPHA ARRAY 02310000
|
|
NAMTABL, 02320000
|
|
VALTABL, 02330000
|
|
IOTABL[0:STRMAX,0:STWMAX]; 02340000
|
|
% 02350000
|
|
% SOME MORE VARIABLES ASSOCIATED WITH THE SYMBOL TABLE ARE: 02360000
|
|
% 02370000
|
|
DEFINE 02380000
|
|
CCYCLE=[9:44:4]#, % MOVE TO CYCLE FIELD 02390000
|
|
CFILNO=[5:44:4]#, % MOVE TO FILNO FIELD 02400000
|
|
CINUSE=[3:47:1]#, % 02410000
|
|
CIOTYPE=[14:45:3]#, % MOVE TO IOTYPE FIELD 02420000
|
|
CIOUSE=[3:46:2]#, 02430000
|
|
CLINK=[5:36:12]#, % MOVE TO LINK FIELD 02440000
|
|
CONCSTR = [36:44:4] #, 02450000
|
|
COUTUSE=[4:47:1]#, % 02460000
|
|
CYCLE=[9:4]#, % NUMBER TIMES FILE LOCATION USED 02470000
|
|
FILNO=[5:4]#, % INDEX OF ASSOCIATED FILE 02480000
|
|
INUSE=[3:1]#, % = 1 IF INPUT STRING 02490000
|
|
IOTYPE=[14:3]#, % TYPE OF I/O USAGE: 02500000
|
|
% VALUE INPUT OUTPUT 02510000
|
|
% 0 ILLEGAL ILLEGAL 02520000
|
|
% 1 I/O I/O 02530000
|
|
% 2 LOOK TRACE 02540000
|
|
% 3 TELETYPE TELETYPE 02550000
|
|
% 4 ILLEGAL ILLEGAL 02560000
|
|
% 5 ILLEGAL SYSPOT 02570000
|
|
% 02580000
|
|
IOUSE=[3:2]#, % INUSE AND OUTUSE FIELDS COMBINED. 02590000
|
|
LINK=[5:12]#, % LIST LINKS IN SYMBOL TABLE. 02600000
|
|
LOC=[17:31]#, % S, R, W, AND C FIELDS (STRING LOC IN DATA[*,*]) 02610000
|
|
OUTUSE=[4:1]#, % = 1 IF OUTPUT STRING 02620000
|
|
OVFL=[13:1]#, % = 1 IF OVERFLOW ALLOWED ON OUTPUT 02630000
|
|
SCATTERSIZE=75#,% SIZE OF SCATTER AREAS IN SYMB TABLE. 02640000
|
|
STR = [36:4] #, 02650000
|
|
STW = [40:8] #, 02660000
|
|
TCYCLE=[9:9:4]#,% TRANSFER TO CYCLE FIELD 02670000
|
|
TFILNO=[5:5:4]#,% TRANSFER TO FILNO FIELD 02680000
|
|
TYPE=[1:2]#; % TYPE OF ENTRY: 02690000
|
|
% 0 = STRING 2 = FUNCTION 02700000
|
|
% 1 = LITERAL 3 = LABEL 02710000
|
|
BOOLEAN 02720000
|
|
SYMBTABLSETUP; % AVSLS SET UP IN SCATTER ROWS. 02730000
|
|
BOOLEAN ARRAY 02740000
|
|
USEDST[0:STRMAX]; % TRUE IF SYMB TABLE ROW IN USE. 02750000
|
|
INTEGER 02760000
|
|
SCATTERNO; % MAX ROW INDEX OF SCATTER AREAS. 02770000
|
|
ALPHA ARRAY 02780000
|
|
TEMPLIST[0:STRMAX]; % TEMP S.T. LOCS FOR INTERPRETER. 02790000
|
|
INTEGER ARRAY 02800000
|
|
NEXTCELL[0:STRMAX]; % HEADS OF AVAILABLE SPACE LISTS. 02810000
|
|
% 02820000
|
|
% 02830000
|
|
% A SYMBOL TABLE ENTRY CONSISTS OF THREE WORDS--ONE WORD 02840000
|
|
% FROM EACH OF THE THREE ARRAYS. A "SYMBOL TABLE ADDRESS" IS A 02850000
|
|
% 12-BIT INTEGER CONSISTING OF TWO FIELDS CALLED STR AND STW. 02860000
|
|
% THE THREE WORDS ASSOCIATED WITH AN ADDRESS P CAN BE REFERRED 02870000
|
|
% TO IN THE FOLLOWING WAYS: 02880000
|
|
% 02890000
|
|
% NAME[P] = NAMTABL[P.STR,P.STW] IS THE NAME OF THE OBJECT 02900000
|
|
% VALU[P] = VALTABL[P.STR,P.STW] IS THE VALUE OF THE OBJECT. 02910000
|
|
% IO[P] = IOTABL[P.STR,P.STW] IS THE I/O USE OF THE OBJECT 02920000
|
|
% 02930000
|
|
% NORMALLY, THE FIRST FORM GIVEN (SINGLY SUBSCRIPTED) IS USED; THE 02940000
|
|
% DOUBLY-SUBSCRIPTED FORMS ARE USED ONLY WHEN THE TWO SUBSCRIPTS 02950000
|
|
% HAVE BEEN CALCULATED SEPARATELY. 02960000
|
|
% 02970000
|
|
% THE SYMBOL TABLE IS A SCATTERED-ENTRY, LINKED-LIST TYPE OF TABLE. 02980000
|
|
% ENTRIES ARE SCATTERED INTO THE "SCATTER AREAS", WHICH ARE WORDS 0 TO 02990000
|
|
% SCATTERSIZE+15 OF ROWS 0 TO SCATTERNO. THAT IS, THE I,J WORDS 03000000
|
|
% OF THE SYMBOL TABLE (NAMTABL[I,J], VALTABL[I,J], IOTABLE[I,J]) 03010000
|
|
% ARE IN THE SCATTER AREA IF: 03020000
|
|
% 0 { I { SCATTERNO 03030000
|
|
% 0 { J { SCATTERSIZE+15 03040000
|
|
% WORD 0,0 IS NOT INCLUDED; IT IS A "NON-CELL" WHICH SHOULD ALWAYS 03050000
|
|
% BE FILLED WITH ZEROES. THE REASON FOR THE "+15" IS THAT THERE 03060000
|
|
% ARE REALLY TWO SCATTER AREAS--ONE FOR LITERALS AND ONE FOR ALL 03070000
|
|
% OTHER TYPES OF DATA OBJECTS. THIS IS TO KEEP THE LENGTH OF 03080000
|
|
% LISTS THAT MUST BE SCANNED AT RUN TIME (FOR INDIRECTION, CREATING 03090000
|
|
% NEW FUNCTIONS, ETC.) AS SMALL AS POSSIBLE. LITERALS ARE SCATTERED 03100000
|
|
% INTO THE [SCATTERSIZE,SCATTERSIZE+15] PART OF EACH ROW, AND THE 03110000
|
|
% [0,SCATTERSIZE) PART IS FOR OTHER TYPES OF OBJECTS. THE PART 03120000
|
|
% OF THE SYMBOL TABLE OUTSIDE OF THE SCATTER AREAS IS INITIALIZED 03130000
|
|
% AS AVAILABLE SPACE LISTS (ONE PER ROW, THE TOP ADDRESS GIVEN BY 03140000
|
|
% NEXTCELL[ROW]). WHEN SEVERAL ENTRIES SCATTER INTO THE SAME 03150000
|
|
% LOCATION, A LINKED LIST IS FORMED INTO THE PART OF THE ROW THAT 03160000
|
|
% IS OUTSIDE THE SCATTER AREA. LINKS THROUGH THESE LISTS ARE IN 03170000
|
|
% THE LINK FIELD OF THE NAME PART (NAME[P]). 03180000
|
|
% 03190000
|
|
% THE FOLLOWING FIELDS ARE USED IN A SYMBOL TABLE ENTRY: 03200000
|
|
% NAME[P].TYPE IS THE TYPE OF THE ENTRY: 03210000
|
|
% 0 = NAMED STRING OR TEMPORARY CELL. 03220000
|
|
% 1 = LITERAL 03230000
|
|
% 2 = FUNCTION 03240000
|
|
% 3 = LABEL (CODE SEGMENT) 03250000
|
|
% NAME[P] AND GARBAGE COLLECTOR.[3:1] IS USED BY CHECKSYMBTABL. 03260000
|
|
% NAME[P].[4:1] IS UNUSED. 03270000
|
|
% NAME[P].LINK IS THE LINK TO THE NEXT ENTRY THAT HAD THE SAME 03280000
|
|
% LOCATION IN THE SCATTER AREA. A ZERO LINK IS END-OF-LIST. 03290000
|
|
% FOR TEMPORARY CELLS, THE LINK SHOULD BE ZERO. 03300000
|
|
% NAME[P].LOC POINTS TO THE NAME OF THE OBJECT (IN DATA[*,*]). 03310000
|
|
% FOR LITERALS, THIS FIELD IS ZERO. 03320000
|
|
% VALU[P].[1:1] = 1 FOR PROGRAM-DEFINED FUNCTIONS, OTHERWISE 03330000
|
|
% IT SHOULD BE ZERO. 03340000
|
|
% VALU[P].[2:1] IS UNUSED. 03350000
|
|
% VALU[P].IOUSE INDICATES THE I/O USE, AND HAS TWO SUBFIELDS: 03360000
|
|
% VALU[P].INUSE = 1 FOR INPUT STRINGS AND FUNCTIONS WITH 03370000
|
|
% THE CALLS BEING TRACED. 03380000
|
|
% VALU[P].OUTUSE = 1 FOR OUTPUT STRINGS, LABELS BEING TRACED, 03390000
|
|
% AND FUNCTIONS WITH RETURNS BEING TRACED. 03400000
|
|
% VALU[P].LINK HAS SEVERAL USES, DEPENDING ON THE TYPE OF THE OBJECT: 03410000
|
|
% STRINGS: THE LINK FIELD GIVES THE NEXT CELL ON THE PUSH-DOWN 03420000
|
|
% STACK. IF ZERO, THERE IS NO PUSH-DOWN STACK. 03430000
|
|
% INTRINSIC FUNCTIONS: THE INDEX FOR THE CASE STATEMENT IN 03440000
|
|
% THE INTERPRETER THAT BRANCHES TO THE FUNCTION CODE. 03450000
|
|
% PROGRAM-DEFINED FUNCTIONS: THE SYMBOL TABLE LOCATION OF 03460000
|
|
% THE ENTRY POINT. 03470000
|
|
% LABELS: THE REFERENCE COUNT. IT IS BUMPED BY ONE EACH TIME 03480000
|
|
% THE LABEL IS ENCOUNTERED. 03490000
|
|
% VALU[P].LOC IS THE LOCATIONS OF: 03500000
|
|
% STRINGS: THE VALUE. 03510000
|
|
% LITERALS: DITTO. 03520000
|
|
% FUNCTIONS: (PROGRAM-DEFINED) A STRING OF 2-CHAR POINTERS TO 03530000
|
|
% THE SYMB TABLE LOCATIONS OF THE FORMAL PARAMETERS AND 03540000
|
|
% LOCAL VARIABLES. FOR INTRINSIC FUNCTIONS, THIS FIELD 03550000
|
|
% IS IGNORED. 03560000
|
|
% IO[P].[1:2] IS UNUSED. 03570000
|
|
% IO[P].IOUSE = VALU[P].IOUSE (REDUNDANT). 03580000
|
|
% IO[P].FILNO IS THE INDEX TO THE FILE ARRAYS FOR FILE I/O STRINGS. 03590000
|
|
% IO[P].CYCLE IS CURRENTLY NOT IN USE. 03600000
|
|
% IO[P].OVFL = 1 FOR OUTPUT STRINGS WHEN THE TAILS OF OUTPUT STRINGS 03610000
|
|
% TOO LONG FOR A RECORD ARE TO BE WRITTEN ON THE NEXT RECORD. 03620000
|
|
% NORMALLY = 0, WHICH CAUSES TRUNCATION OF LONG OUTPUT STRINGS. 03630000
|
|
% IO[P].IOTYPE IS THE TYPE OF I/O OPERATION, AS FOLLOWS: 03640000
|
|
% VALUE INPUT OUTPUT 03650000
|
|
% 0 ILLEGAL ILLEGAL 03660000
|
|
% 1 I/O I/O 03670000
|
|
% 2 LOOK TRACE 03680000
|
|
% 3 TELETYPE TELETYPE 03690000
|
|
% 4 ILLEGAL ILLEGAL 03700000
|
|
% 5 ILLEGAL SYSPOT 03710000
|
|
% IO[P].[17:31] IS UNUSED. 03720000
|
|
%********LOCAL VARIABLES FOR COMPILER***********************************03730000
|
|
BOOLEAN 03740000
|
|
BUFFERFULL, % BUFFER[*] CONTAINS A CARD. 03750000
|
|
DCLIST, % LIST PROG ON TELETYPE. 03760000
|
|
GT, % FALSE AT START OF COMPILE; TRUE WHEN GO-TO PART REACHED03770000
|
|
GTLAST, % LAST INST HAD A GO-TO PART 03780000
|
|
GTF, % FAILURE EXIT HAS BEEN FOUND 03790000
|
|
GTS, % SUCCESS EXIT HAS BEEN FOUND 03800000
|
|
LSTF, % LIST PROGRAM ON LINE PRINTER FILE PRINT 03810000
|
|
PCC, % LIST CONTROL CARDS, EVEN IF NOT LSTF 03820000
|
|
PROGRAMFROMREMOTE, % PROGRAM FROM TELETYPE, NOT FILE PROGRAM 03830000
|
|
PUNCHF; % PUNCH NEW PROGRAM DECK 03840000
|
|
INTEGER 03850000
|
|
ERRORS, % NUMBER OF SYNTAX ERRORS FOUND 03860000
|
|
FIELDSIZE, % NUMBER OF CHARS PER CARD THAT ARE INSTRUCTION 03870000
|
|
INSTNUM, % NUMBER OF INST BEING COMPILED 03880000
|
|
INSTSIZE, % SIZE OF INST BEING COMPILED 03890000
|
|
MARKER, % FIRST CHAR (QMARK) OF INST IN CODE[*] 03900000
|
|
MESSAGES, % NUMBER OF INFORMATIVE MESSAGES PRINTED 03910000
|
|
P, % POINT IN INST[*] BEING COMPILED 03920000
|
|
PTR; % NEXT CHAR IN CODE[*] 03930000
|
|
INTEGER ARRAY 03940000
|
|
BACKTRACK[0:50,0:5], 03950000
|
|
CHARTYPE[0:63]; 03960000
|
|
ALPHA 03970000
|
|
NEXTSEGMENT,% SYMBTABL LOC OF NEXT LABELED INSTRUCTION 03980000
|
|
SLASTLABEL; % SYMBTABL LOC OF LAST LABELED INSTRUCTION 03990000
|
|
%********LOCAL VARIABLES FOR COMPILER***********************************04000000
|
|
%********STACK ARRAYS***************************************************04010000
|
|
% THE FOLLOWING ARRAYS CONSTITUTE THE "STACK" USED BY THE 04020000
|
|
% COMPILER AND INTERPRETER. THE INDEX OF THE NEXT WORD AVAILABLE 04030000
|
|
% IS THE GLOBAL INTEGER SP. 04040000
|
|
BOOLEAN ARRAY 04050000
|
|
PNAME[0:STACKSIZE]; % TRUE FOR NAMED QUANTITIES 04060000
|
|
INTEGER ARRAY 04070000
|
|
PBACK, % LINK FOR BACK REFERENCE 04080000
|
|
PMINLEFT, % MIN SIZE OF REST OF PATTERN 04090000
|
|
PPOINT, % POINTER TO MATCHED SUBSTRING 04100000
|
|
PSIZE, % SIZE OF PATTERN ELEMENT 04110000
|
|
PTYPE[0:STACKSIZE]; % TYPE OF ELEMENT, AS FOLLOWS; 04120000
|
|
% 0: UNDEFINED 04130000
|
|
% 1: CONSTANT PATTERN ELEMENT 04140000
|
|
% 2: ARBITRARY STRING VARIABLE 04150000
|
|
% 3: FIXED-LENGTH VARIABLE 04160000
|
|
% 4: BALANCED VARIABLE 04170000
|
|
% 5: BACK REFERENCE 04180000
|
|
% 6: UNDEFINED 04190000
|
|
% 7: NUMERIC VALUE--IN PST[I] 04200000
|
|
ALPHA ARRAY 04210000
|
|
PLOC, % SCANNER ONLY: LOC OF VALUE OF ELEMENT 04220000
|
|
PST[0:STACKSIZE]; % SYMBOL TABLE ADDRESS OF ELEMENT 04230000
|
|
%********STACK ARRAYS***************************************************04240000
|
|
%********LOCAL VARIABLES FOR INTERPRETER********************************04250000
|
|
% WARNING: THE NUMBER OF VARIABLES IN THIS SECTION MUST BE THE SAME 04260000
|
|
% AS THE NUMBER OF VARIABLES COPIED IN THE DEFINED SECTION OF FUNCTION. 04270000
|
|
BOOLEAN % 04280000
|
|
BACKREFLAG, % 04290000
|
|
NOREPLACEMENT, % 04300000
|
|
NOBACKORBAL, 04310000
|
|
SELFREFLAG, % 04320000
|
|
SUCCESS, % 04330000
|
|
VARFLAG; % 04340000
|
|
INTEGER % 04350000
|
|
COUNT, 04360000
|
|
ENTRY, % ENTRY POINT & LAST LABEL TRANSFERED TO 04370000
|
|
FLOC, % POINTER TO FAILURE EXIT. 04380000
|
|
FRONTEND, 04390000
|
|
INCREASE, 04400000
|
|
INSTNO, 04410000
|
|
INSTRUCT, 04420000
|
|
MKS, % "MARK STACK" POINTER 04430000
|
|
NEARPOINT, 04440000
|
|
NEXTSOURCERECORD, % DISK ADDR OF NEXT AVAILABLE RECORD OF SOURCE. 04450000
|
|
NOPATTERNS, 04460000
|
|
NOREPLACES, 04470000
|
|
REAREND, 04480000
|
|
REFI, 04490000
|
|
REFJ, 04500000
|
|
REFLOC, 04510000
|
|
REFPT, 04520000
|
|
REFSTEP, 04530000
|
|
RELATIVEPOINTER, 04540000
|
|
RPR, 04550000
|
|
RSIZE, 04560000
|
|
SIZE, 04570000
|
|
SLOC, % POINTER TO SUCCESS EXIT. 04580000
|
|
SP; 04590000
|
|
ALPHA 04600000
|
|
TEMPREF; 04610000
|
|
%********LOCAL VARIABLES FOR INTERPRETER********************************04620000
|
|
%********FILE-HANDLING DECLARATIONS*************************************04630000
|
|
DEFINE FILMAX = 5 #; % MAX NUMBER OF FILES 04640000
|
|
BOOLEAN ARRAY 04650000
|
|
IOEOF, % EOF ON LAST I/O OPERATION. 04660000
|
|
IOFILEOPEN, % TRUE FOR OPEN FILES. 04670000
|
|
LOOKF[1:FILMAX];% NEXT RECORD IS IN NEXTRECORD[I,*]. 04680000
|
|
% USED WITH LOOK-TYPE INPUT STRINGS. 04690000
|
|
INTEGER ARRAY 04700000
|
|
IOSIZE, 04710000
|
|
IOSPACE, 04720000
|
|
RECORD[1:FILMAX]; 04730000
|
|
ALPHA ARRAY 04740000
|
|
IOUSAGE[1:FILMAX]; 04750000
|
|
FILE 04760000
|
|
CARD (1,10,30); 04770000
|
|
FILE IN 04780000
|
|
PROGRAM (1,10,30); 04790000
|
|
FILE OUT 04800000
|
|
PRINT 16 (1,17), 04810000
|
|
PUNCH 0 (1,10); 04820000
|
|
SAVE FILE OUT 04830000
|
|
NEWDISK DISK SERIAL [20:600] (1,10,30,SAVE 15); 04840000
|
|
SWITCH FILE IOFILE ~ 04850000
|
|
CARD, % 0--DUMMY ENTRY 04860000
|
|
CARD, % CARD-IMAGE INPUT AND OUTPUT FILE 04870000
|
|
PROGRAM, % PROGRAM FILE FOR BATCH JOBS; READ FILE 04880000
|
|
PRINT, % LINE PRINTER FILE 04890000
|
|
PUNCH, % CARD PUNCH FILE 04900000
|
|
NEWDISK; % FILE FOR CREATING NEW DISK FILES 04910000
|
|
%********FILE-HANDLING DECLARATIONS*************************************04920000
|
|
%********SWITCH FORMAT MESSAGE******************************************04930000
|
|
SWITCH FORMAT MESSAGE ~ ("**MISSING QUOTE."), %0004940000
|
|
(//"**IGNORE ANY OUTPUT AFTER THIS--IT MAY BE INCORRECT."//), %0104950000
|
|
("**UNRECOGNIZED CONSTRUCT IN STRING REFERENCE."), %0204960000
|
|
("**UNIDENTIFIABLE PUNCHED OBJECT."), %0304970000
|
|
("**DOUBLY DEFINED EXIT."), %0404980000
|
|
("**CHARACTER AFTER S OR F IN GO-TO NOT (."), %0504990000
|
|
("**STRING REFERENCE MISSING."), %0605000000
|
|
("**UNRECOGNIZED GO-TO CONSTRUCT."), %0705010000
|
|
("**ILLEGAL LABEL IN GO-TO PART."), %0805020000
|
|
("**ILLEGAL COMMA."), %0905030000
|
|
("**PARENTHESIS COUNT NON-ZERO AT START OF GO-TO PART."), %1005040000
|
|
("**THE ONLY UNARY OPERATOR IS ",""","-",""","."), %1105050000
|
|
("**EXTRA RIGHT PARENTHESIS."), %1205060000
|
|
("**EXTRA ARROW OR EQUAL SIGN."), %1305070000
|
|
("**STRANGE USE OF ",""","/",""","."), %1405080000
|
|
("**ATTEMPTED REPLACEMENT IN VALUE EXPRESSION."), %1505090000
|
|
("**IMPROPER ARITHMETIC OPERAND."), %1605100000
|
|
("**ERROR IN USE OF ARITHMETIC OPERATOR."), %1705110000
|
|
("**PARENTHESIS COUNT AT END OF INSTRUCTION NON-ZERO."), %1805120000
|
|
("**CONTROL PARAMETER NON-NUMERIC OR OUTSIDE ALLOWED RANGE."), %1905130000
|
|
(/"**DUMMY FMT--MESSAGE[20]"), %2005140000
|
|
("**TOO MANY ELEMENTS IN INSTRUCTION"), %2105150000
|
|
("**UNRECOGNIZED INSTRUCTION TYPE."), %2205160000
|
|
(/"**DUMMY FMT--MESSAGE[23]"), %2305170000
|
|
("**THIS LABEL HAS ALREADY BEEN USED; FORMER VALUE LOST."), %2405180000
|
|
(/"**NO END CARD."/), %2505190000
|
|
("**ENTRY POINT UNDEFINED."), %2605200000
|
|
("**MISSING RIGHT PARENTHESIS."), %2705210000
|
|
("**ILLEGAL USE OF LITERAL."), %2805220000
|
|
("**MISSING OPERAND TO ARITHMETIC"), %2905230000
|
|
(/"**DUMMY FMT--MESSAGE[30]"), %3005240000
|
|
(/"**DUMMY FMT--MESSAGE[31]"), %3105250000
|
|
("**DEFINE FAILURE--UNKNOWN ERROR IN FIRST ARGUMENT."), %3205260000
|
|
("**DEFINE FAILURE--UNKNOWN ERROR IN LOCAL VARIABLE LIST."), %3305270000
|
|
("**INVALID ARGUMENT FOR INDIRECTION."), %3405280000
|
|
("USEDROW[",I2,"] IS ",L5,"; DPNTR[",I2,"] = ",I5), %3505290000
|
|
(X16,"*",10(X4,"+",X4,"*")), %3605300000
|
|
("DATA[",I2,"] = "), %3705310000
|
|
("**MISSING STRING VARIABLE ASTERISK."), %3805320000
|
|
("**MISSING PARAMETER."), %3905330000
|
|
(///"**COMPILER SCREWED UP."///), %4005340000
|
|
(/"**DATA COMMUNICATIONS FILE IN USE**"/), %4105350000
|
|
("**PROGRAM SEGMENT TOO LONG--INSERT EXTRA LABEL ON PRECEDING" 05360000
|
|
" INSTRUCTION."), %4205370000
|
|
("**END OF FILE."), %4305380000
|
|
("**PARITY ERROR IN "), %4405390000
|
|
(/"**OUT OF SPACE IN STRING STORAGE AREA."), %4505400000
|
|
(/"**OUT OF SPACE IN SYMBOL TABLE."), %4605410000
|
|
("**ILLEGAL USE OF ARROW OR EQUAL SIGN."), %4705420000
|
|
("**NON-NUMERIC LITERAL IN ARITHMETIC."), %4805430000
|
|
("**THIS STATEMENT CAN NOT BE REACHED."), %4905440000
|
|
("**UNDEFINED LABEL: "), %5005450000
|
|
(//"**RETURN FROM FUNCTION NOT PRECEDED BY CALL; STATEMENT ", 05460000
|
|
"NUMBER ",I6), %5105470000
|
|
("**ILLEGAL NAME FOR STRING VARIABLE."), %5205480000
|
|
("**END FORMAT--MESSAGE."); 05490000
|
|
%********SWITCH FORMAT MESSAGE******************************************05500000
|
|
%********SWITCH FORMAT FTIME********************************************05510000
|
|
SWITCH FORMAT FTIME ~ 05520000
|
|
(/"CPU TIME = ",F10.1," SEC."/"I/O TIME = ",F10.1," SEC."), %0005530000
|
|
(X25,"B 5 5 0 0 S N O B O L 3 S Y S T E M"// 05540000
|
|
"VERSION ",F3.1/ 05550000
|
|
"THE DATE IS ",I*," ",A3," 19",A2,/ 05560000
|
|
"COMPILATION STARTED AT ",2(I2,":"),I2), %0105570000
|
|
(/"COMPILATION COMPLETED AT ",2(I2,":"),I2), %0205580000
|
|
(/"EXECUTION STARTED AT ",2(I2,":"),I2), %0305590000
|
|
(/"NORMAL EXIT AT ",2(I2,":"),I2,", AT LEVEL ",I*," IN STATEMENT ", 05600000
|
|
I*), %0405610000
|
|
(/"ABNORMAL EXIT AT ",2(I2,":"),I2,", AT LEVEL ",I*," IN STATEMENT ", 05620000
|
|
I*), %0505630000
|
|
(//"**END FORMAT--FTIME."//); 05640000
|
|
%********SWITCH FORMAT FTIME********************************************05650000
|
|
%***********************************************************************05660000
|
|
%********VARIOUS FORMATS************************************************05670000
|
|
FORMAT % NOT GENERALLY USED BY MOST PROGRAMS: 05680000
|
|
F80A1 (80A1), 05690000
|
|
FCLOSEDR ("**ATTEMPT TO READ FROM CLOSED FILE:"), 05700000
|
|
FCLOSEDW ("**ATTEMPT TO WRITE ON CLOSED FILE:"), 05710000
|
|
FCRLF ("{!~"), 05720000
|
|
FENDPROG ("**END OF PROGRAM FILE "), 05730000
|
|
FFIXVARSIZE ("**ILLEGAL SIZE ",""",X*,"""," FOR FIXED-LENGTH ", 05740000
|
|
"VARIABLE IN STATEMENT ",I6), 05750000
|
|
FGC (//"**GARBAGE COLLECTOR ",10("********")), 05760000
|
|
FGCRES (/"**GARBAGE COLLECTOR RESULTS:"/ 05770000
|
|
I5," ROWS COLLECTED"/ 05780000
|
|
I5," CHARS IN LONGEST ROW"/ 05790000
|
|
I5," CHARS TOTAL"/), 05800000
|
|
FGCS (/"GARBAGE COLLECTOR CALLED ",I*," TIMES; USED ",F*.1, 05810000
|
|
" SEC CPU TIME, ",F*.1," SEC I/O TIME."), 05820000
|
|
FNOFILE ("**FILE NOT AVAILABLE."), 05830000
|
|
FO (O), 05840000
|
|
FPARITY ("**IRRECOVERABLE PARITY ERROR ON"), 05850000
|
|
FRULES ("**NUMBER OF RULES EXECUTED = ",I8), 05860000
|
|
FSENDCOPY ("**SEND COPY OF PROGRAM TO SYSTEM AUTHORS."), 05870000
|
|
FTRACE ("*S",I5,X1,X*," = ","""), 05880000
|
|
FTRACEFCTCALL ("*C",I5,X1,X*,"("), 05890000
|
|
FTRACEFCTRET ("*R",I5,X1,X*,"() = ","""), 05900000
|
|
FTRACEL ("*L ",X*,I*,*(" FROM ",I*)), 05910000
|
|
FUNDEFFCT ("**UNDEFINED FUNCTION CALLED:"), 05920000
|
|
FUNDEFLABEL ("**ATTEMPTED TRANSFER TO UNDEFINED LABEL "); 05930000
|
|
FORMAT % FOR USE WITH CREATELIBRARY AND LOADLIBRARY. 05940000
|
|
FLIB0("SNOBOL LIBRARY FILE ",I1), 05950000
|
|
FLIB1 (I1,I4,3(L1,O)), 05960000
|
|
FLIB2 (A2,16L1,I6), 05970000
|
|
FLIB3 (16A2), 05980000
|
|
FLIB4 (6O), 05990000
|
|
FLIB5 (32L1), 06000000
|
|
FLIB6 (12I4), 06010000
|
|
FLIBOLDLP("**LIBRARY FILE INCOMPATIBLE WITH THIS VERSION OF SNOBOL"),06020000
|
|
FLIBOLDTT("{!LIBRARY FILE INCOMPATIBLE WITH THIS VERSION OF SNOBOL", 06030000
|
|
"{!~"); 06040000
|
|
FORMAT % USED DURING MOST RUNS: 06050000
|
|
FASTERISKS (/1023("********")), 06060000
|
|
FBL ((X8)), 06070000
|
|
FDBL (*(/)), 06080000
|
|
FERRS (I*," SYNTAX ERRORS DETECTED"), 06090000
|
|
FI7 (I7), 06100000
|
|
FI16 (I16), 06110000
|
|
FINT (*D,X*,I*), 06120000
|
|
FNUM (X*,I*); 06130000
|
|
FORMAT % USED WITH TELETYPES 06140000
|
|
FAGAIN ("{!TRY AGAIN{!~"), 06150000
|
|
FDKSEARCH (X*,"/",X*,":",3I1,4(":",I*)), 06160000
|
|
FEH ("{!EH",A1,"{!~"), 06170000
|
|
FFROMREMOTE ("{!DO YOU WANT TO TYPE A PROGRAM",A1,"{!~"), 06180000
|
|
FNOINPUT ("{!!WAITING TIME UP--DO YOU WISH TO CONTINUE",A1,"{!~"), 06190000
|
|
FSTAT (*("(",2(I*,"/",I*,":"),8I1,")")), 06200000
|
|
FTTADDR (I*,"/",I*), 06210000
|
|
FTTHELLO ("{!SNOBOL VERSION ",F3.1,"{!~"), 06220000
|
|
FYESORNO ("{!TYPE YES OR NO.{!~"), 06230000
|
|
FVCRLF (X*,"{!~"); 06240000
|
|
FORMAT % USED WITH DUMP PROCEDURES 06250000
|
|
FSTACKHEAD (/"**THE STACK IS:"/ 06260000
|
|
" WORD TYPE ST NAME ....LOC.... SIZE POINT MINLEFT BACK"), 06270000
|
|
FSTACKENTRY (I6,I4,X2,A2,X3,L1,X1,I4,X1,I2,X1,I4,I5,I6,I8,I5); 06280000
|
|
%***********************************************************************06290000
|
|
% **********************************************************************06300000
|
|
%========== BEGIN DATA COM GLOBAL DECLARATIONS =========================06310000
|
|
DEFINE 06320000
|
|
DCINCHAR =28#, 06330000
|
|
NBUFIN =4#, 06340000
|
|
BUFINSIZE =5#, 06350000
|
|
DCOUTCHAR =28#, 06360000
|
|
NBUFOUT =5#, 06370000
|
|
BUFOUTSIZE =5#, 06380000
|
|
MSGSIZE = 250 #, 06390000
|
|
ANSSIZE = 250 #, % MAX # OF CHARS IN OUTPUT STRING. 06400000
|
|
TTMAX = 15 #; % MAX # OF TELETYPES ALLOWED. 06410000
|
|
ALPHA ARRAY 06420000
|
|
DCREAD[0:(MSGSIZE-1).W], 06430000
|
|
DCWRITE[0:(ANSSIZE-1).W], 06440000
|
|
ID, % I. D. OF USER OF TELETYPE 06450000
|
|
STAT[0:TTMAX]; % STATUS OF TELETYPE 06460000
|
|
ALPHA FILE IN DCIN 14 ( NBUFIN, BUFINSIZE); 06470000
|
|
ALPHA FILE OUT DCOUT 14 (NBUFOUT,BUFOUTSIZE); 06480000
|
|
INTEGER 06490000
|
|
MAINUSER, % TELETYPE CURRENTLY IN CHARGE 06500000
|
|
NUMUSERS, % NUMBER OF TELETYPES ATTACHED. 06510000
|
|
USER; % TELETYPE CURRENTLY BEING TALKED TO 06520000
|
|
REAL 06530000
|
|
WAITTIME; 06540000
|
|
BOOLEAN BREAK; 06550000
|
|
%========== END DATA COM GLOBAL DECLARATIONS ===========================06560000
|
|
BEGIN % GLOBAL STREAM PROCEDURES 06570000
|
|
%********ABSADDR********************************************************06580000
|
|
INTEGER STREAM PROCEDURE ABSADDR(A); 06590000
|
|
BEGIN SI ~ A; ABSADDR ~ SI; END; 06600000
|
|
%********ABSADDR********************************************************06610000
|
|
%***********************************************************************06620000
|
|
COMMENT CHAR RETURNS THE PTH CHARACTER OF NAME, RIGHT JUSTIFIED; 06630000
|
|
INTEGER STREAM PROCEDURE CHAR(NAME,P); 06640000
|
|
VALUE P; 06650000
|
|
% 06660000
|
|
% 06670000
|
|
BEGIN SI ~ NAME; 06680000
|
|
SI ~ SI + P; 06690000
|
|
DI ~ LOC CHAR; DI ~ DI + 7; 06700000
|
|
DS ~ 1 CHR; 06710000
|
|
END; 06720000
|
|
%********************************************************************** 06730000
|
|
%********EQ*************************************************************06740000
|
|
BOOLEAN STREAM PROCEDURE EQ(N,L1,I1,L2,I2); 06750000
|
|
VALUE N, I1, I2; 06760000
|
|
BEGIN SI ~ L1; SI ~ SI + I1; 06770000
|
|
DI ~ L2; DI ~ DI + I2; 06780000
|
|
N(IF 1 SC ! DC THEN JUMP OUT); 06790000
|
|
IF TOGGLE THEN TALLY ~ 0 ELSE TALLY ~ 1; 06800000
|
|
EQ ~ TALLY; 06810000
|
|
END EQ; 06820000
|
|
%********EQ*************************************************************06830000
|
|
%********EQUAL**********************************************************06840000
|
|
% EQUAL RETURNS TRUE IF THE N CHARS STARTING AT THE I1TH CHAR AFTER L1 06850000
|
|
% ARE THE SAME AS THE N CHARS STARTING AT THE L2TH CHAR AFTER L2. I1 06860000
|
|
% AND I2 MUST BE } 0 AND { 63. 06870000
|
|
BOOLEAN STREAM PROCEDURE EQUAL(N,L1,I1,L2,I2); 06880000
|
|
VALUE N, I1, I2; 06890000
|
|
% 06900000
|
|
% 06910000
|
|
BEGIN LOCAL NA, NB; 06920000
|
|
LABEL L; 06930000
|
|
SI ~ LOC N; SI ~ SI + 5; 06940000
|
|
DI ~ LOC NA; DI ~ DI + 7; DS ~ 1 CHR; 06950000
|
|
DI ~ LOC NB; DI ~ DI + 7; DS ~ 1 CHR; 06960000
|
|
SI ~ L1; 06970000
|
|
SI ~ SI + I1; 06980000
|
|
DI ~ L2; 06990000
|
|
DI ~ DI + I2; 07000000
|
|
NA(16(32(IF 8 SC ! DC THEN JUMP OUT 3 TO L))); 07010000
|
|
NB(8(IF 8 SC ! DC THEN JUMP OUT 2 TO L)); 07020000
|
|
N(IF 1 SC ! DC THEN JUMP OUT); 07030000
|
|
L: IF TOGGLE THEN TALLY ~ 0 ELSE TALLY ~ 1; 07040000
|
|
EQUAL ~ TALLY; 07050000
|
|
END; 07060000
|
|
%********EQUAL**********************************************************07070000
|
|
BEGIN % MOVE STREAM PROCEDURES 07080000
|
|
%********MV*************************************************************07090000
|
|
STREAM PROCEDURE MV(N,L1,I1,L2,I2); 07100000
|
|
VALUE N, I1, I2; 07110000
|
|
BEGIN SI ~ L1; SI ~ SI + I1; 07120000
|
|
DI ~ L2; DI ~ DI + I2; 07130000
|
|
DS ~ N CHR; 07140000
|
|
END MV; 07150000
|
|
%********MV*************************************************************07160000
|
|
%********MOVE***********************************************************07170000
|
|
STREAM PROCEDURE MOVE(N,SOURCE,I1,DEST,I2); 07180000
|
|
% 07190000
|
|
VALUE N, I1, I2; 07200000
|
|
BEGIN LOCAL NA, NB; 07210000
|
|
SI ~ LOC N; SI ~ SI + 5; 07220000
|
|
DI ~ LOC NA; DI ~ DI + 7; DS ~ 1 CHR; 07230000
|
|
DI ~ LOC NB; DI ~ DI + 7; DS ~ 1 CHR; 07240000
|
|
SI ~ SOURCE; 07250000
|
|
SI ~ SI + I1; 07260000
|
|
DI ~ DEST; 07270000
|
|
DI ~ DI + I2; 07280000
|
|
NA(4(32(DS ~ 32 CHR))); 07290000
|
|
NB(2(DS ~ 32 CHR)); 07300000
|
|
DS ~ N CHR; 07310000
|
|
END MOVE; 07320000
|
|
%********MOVE***********************************************************07330000
|
|
%********MOVEWDS********************************************************07340000
|
|
STREAM PROCEDURE MOVEWDS(N,L1,L2); VALUE N; 07350000
|
|
BEGIN LOCAL NA; 07360000
|
|
SI ~ LOC N; SI ~ SI + 6; 07370000
|
|
DI ~ LOC NA; DI ~ DI + 7; DS ~ 1 CHR; 07380000
|
|
SI ~ L1; DI ~ L2; 07390000
|
|
NA(2(DS ~ 32 WDS)); N(DS ~ 1 WDS); 07400000
|
|
END MOVEWDS; 07410000
|
|
%********MOVEWDS********************************************************07420000
|
|
%********MOVEWORD*******************************************************07430000
|
|
STREAM PROCEDURE MOVEWORD(A,B); VALUE A, B; 07440000
|
|
BEGIN SI ~ A; DI ~ B; DS ~ 1 WDS; END; 07450000
|
|
%********MOVEWORD*******************************************************07460000
|
|
BEGIN % SCAN STREAM PROCEDURES 07470000
|
|
%********SCANCHAR*******************************************************07480000
|
|
% SCANCHAR RETURNS THE NUMBER OF CHARS FROM THE ITH CHAR AFTER L 07490000
|
|
% (0 { I { 63) TO THE FIRST OCCURRENCE OF EITHER C1 OR C2. 07500000
|
|
INTEGER STREAM PROCEDURE SCANCHAR(C1,C2,L,I); VALUE C1,C2,I; 07510000
|
|
BEGIN LOCAL P1, P2, P3, TEMP; 07520000
|
|
LABEL CHERCHE,TROUVE; 07530000
|
|
SI ~ L; SI ~ SI + I; 07540000
|
|
DI ~ LOC C1; DI ~ DI + 7; 07550000
|
|
CHERCHE: IF 1 SC = DC THEN GO TO TROUVE; 07560000
|
|
TEMP ~ DI; DI ~ LOC C2; 07570000
|
|
DI ~ DI + 7; SI ~ SI - 1; 07580000
|
|
IF 1 SC = DC THEN GO TO TROUVE; 07590000
|
|
DI ~ TEMP; 07600000
|
|
DI ~ DI - 1; 07610000
|
|
TALLY ~ TALLY + 1; 07620000
|
|
TEMP ~ SI; 07630000
|
|
P3 ~ TALLY; SI ~ LOC P3; SI ~ SI + 7; 07640000
|
|
IF SC ! "0" THEN 07650000
|
|
BEGIN SI ~ TEMP; GO TO CHERCHE; END; 07660000
|
|
TALLY ~ P2; TALLY ~ TALLY + 1; 07670000
|
|
P2 ~ TALLY; SI ~ LOC P2; SI ~ SI + 7; 07680000
|
|
IF SC ! "0" THEN 07690000
|
|
BEGIN TALLY ~ 0; 07700000
|
|
SI ~ TEMP; GO TO CHERCHE; 07710000
|
|
END; 07720000
|
|
TALLY ~ P1; TALLY ~ TALLY + 1; 07730000
|
|
P1 ~ TALLY; TALLY ~ 0; 07740000
|
|
SI ~ TEMP; 07750000
|
|
GO TO CHERCHE; 07760000
|
|
TROUVE: 07770000
|
|
DI ~ LOC SCANCHAR; DI ~ DI + 5; 07780000
|
|
SI ~ LOC P1; SI ~ SI + 7; DS ~ 1 CHR; 07790000
|
|
SI ~ LOC P2; SI ~ SI + 7; DS ~ 1 CHR; 07800000
|
|
SI ~ LOC P3; SI ~ SI + 7; DS ~ 1 CHR; 07810000
|
|
END SCANCHAR; 07820000
|
|
%********SCANCHAR*******************************************************07830000
|
|
%********SKIPCHAR*******************************************************07840000
|
|
INTEGER STREAM PROCEDURE SKIPCHAR(C,L,I); VALUE C,I; 07850000
|
|
% 07860000
|
|
BEGIN LOCAL P1, P2, P3, TEMP; 07870000
|
|
LABEL CHERCHE,TROUVE; 07880000
|
|
SI ~ L; SI ~ SI + I; 07890000
|
|
DI ~ LOC C; DI ~ DI + 7; 07900000
|
|
CHERCHE: IF 1 SC ! DC THEN GO TO TROUVE; 07910000
|
|
DI ~ DI - 1; 07920000
|
|
TALLY ~ TALLY + 1; 07930000
|
|
TEMP ~ SI; 07940000
|
|
P3 ~ TALLY; SI ~ LOC P3; SI ~ SI + 7; 07950000
|
|
IF SC ! "0" THEN 07960000
|
|
BEGIN SI ~ TEMP; GO TO CHERCHE; END; 07970000
|
|
TALLY ~ P2; TALLY ~ TALLY + 1; 07980000
|
|
P2 ~ TALLY; SI ~ LOC P2; SI ~ SI + 7; 07990000
|
|
IF SC ! "0" THEN 08000000
|
|
BEGIN TALLY ~ 0; 08010000
|
|
SI ~ TEMP; GO TO CHERCHE; 08020000
|
|
END; 08030000
|
|
TALLY ~ P1; TALLY ~ TALLY + 1; 08040000
|
|
P1 ~ TALLY; TALLY ~ 0; 08050000
|
|
SI ~ TEMP; 08060000
|
|
GO TO CHERCHE; 08070000
|
|
TROUVE: 08080000
|
|
DI ~ LOC SKIPCHAR; DI ~ DI + 5; 08090000
|
|
SI ~ LOC P1; SI ~ SI + 7; DS ~ 1 CHR; 08100000
|
|
SI ~ LOC P2; SI ~ SI + 7; DS ~ 1 CHR; 08110000
|
|
SI ~ LOC P3; SI ~ SI + 7; DS ~ 1 CHR; 08120000
|
|
END SKIPCHAR; 08130000
|
|
%********SKIPCHAR*******************************************************08140000
|
|
%***********************************************************************08150000
|
|
% CARDTYPE RETURNS A NUMBER IDENTIFYING THE TYPE OF INSTRUCTION 08160000
|
|
% BEING COMPILED--THE TYPES ARE: 08170000
|
|
% 1 COMMENT 08180000
|
|
% 2 CONTINUATION 08190000
|
|
% 3 CONTROL CARD 08200000
|
|
% 4 END 08210000
|
|
% 5 UNLABELED 08220000
|
|
% 6 LABELED 08230000
|
|
INTEGER STREAM PROCEDURE CARDTYPE(CARD); 08240000
|
|
BEGIN SI ~ CARD; 08250000
|
|
IF SC = "*" THEN TALLY ~ 1 ELSE 08260000
|
|
IF SC = "%" THEN TALLY ~ 1 ELSE 08270000
|
|
IF SC = "." THEN TALLY ~ 2 ELSE 08280000
|
|
IF SC = "-" THEN TALLY ~ 3 ELSE 08290000
|
|
IF SC = "E" THEN 08300000
|
|
BEGIN SI ~ SI + 1; 08310000
|
|
IF SC = "N" THEN 08320000
|
|
BEGIN SI ~ SI + 1; 08330000
|
|
IF SC = "D" THEN 08340000
|
|
BEGIN SI ~ SI + 1; 08350000
|
|
IF SC = " " THEN TALLY ~ 4 ELSE TALLY ~ 6; 08360000
|
|
END ELSE TALLY ~ 6; 08370000
|
|
END ELSE TALLY ~ 6; 08380000
|
|
END ELSE 08390000
|
|
IF SC = " " THEN TALLY ~ 5 ELSE TALLY ~ 6; 08400000
|
|
CARDTYPE ~ TALLY; 08410000
|
|
END TYPE; 08420000
|
|
%********CARDTYPE*******************************************************08430000
|
|
BEGIN % ALGOL PROCEDURES 08440000
|
|
%********FORWARD DECLARATIONS*******************************************08450000
|
|
PROCEDURE CLEAR(AR,N); 08460000
|
|
VALUE N; INTEGER N; 08470000
|
|
ALPHA ARRAY AR[0]; 08480000
|
|
FORWARD; 08490000
|
|
BOOLEAN PROCEDURE COMBINEARITHMETIC(I); 08500000
|
|
VALUE I; 08510000
|
|
INTEGER I; 08520000
|
|
FORWARD; 08530000
|
|
PROCEDURE COMBINEFUNCTION(MKS); 08540000
|
|
VALUE MKS; 08550000
|
|
INTEGER MKS; 08560000
|
|
FORWARD; 08570000
|
|
BOOLEAN PROCEDURE COMBINEGOTOPART(MKS); 08580000
|
|
VALUE MKS; 08590000
|
|
INTEGER MKS; 08600000
|
|
FORWARD; 08610000
|
|
BOOLEAN PROCEDURE COMBINEGROUP(MKS,CON); 08620000
|
|
VALUE MKS, CON; 08630000
|
|
INTEGER MKS; 08640000
|
|
BOOLEAN CON; 08650000
|
|
FORWARD; 08660000
|
|
BOOLEAN PROCEDURE COMBINEINDIRECTION(MKS); 08670000
|
|
VALUE MKS; 08680000
|
|
INTEGER MKS; 08690000
|
|
FORWARD; 08700000
|
|
BOOLEAN PROCEDURE COMBINESTRVARNAME(MKS); 08710000
|
|
VALUE MKS; 08720000
|
|
INTEGER MKS; 08730000
|
|
FORWARD; 08740000
|
|
PROCEDURE COMPILE(INST); 08750000
|
|
ALPHA ARRAY INST[0]; 08760000
|
|
FORWARD; 08770000
|
|
INTEGER PROCEDURE CONTROLPARAMETER(A,P); 08780000
|
|
ALPHA ARRAY A[0]; 08790000
|
|
INTEGER P; 08800000
|
|
FORWARD; 08810000
|
|
PROCEDURE CONVERT(A); 08820000
|
|
ALPHA ARRAY A[0]; 08830000
|
|
FORWARD; 08840000
|
|
ALPHA PROCEDURE DATE; 08850000
|
|
FORWARD; 08860000
|
|
PROCEDURE DEBUG(L); 08870000
|
|
VALUE L; 08880000
|
|
LABEL L; 08890000
|
|
FORWARD; 08900000
|
|
INTEGER PROCEDURE DIGITS(N); 08910000
|
|
VALUE N; 08920000
|
|
REAL N; 08930000
|
|
FORWARD; 08940000
|
|
ALPHA PROCEDURE ENTERST(N,L,P,X); 08950000
|
|
VALUE N, P, X; 08960000
|
|
INTEGER N, P; 08970000
|
|
ALPHA ARRAY L[0]; 08980000
|
|
ALPHA X; 08990000
|
|
FORWARD; 09000000
|
|
PROCEDURE FINDUSERS; 09010000
|
|
FORWARD; 09020000
|
|
PROCEDURE GARBAGECOLLECTOR; 09030000
|
|
FORWARD; 09040000
|
|
PROCEDURE INDIRECT(SP); 09050000
|
|
VALUE SP; 09060000
|
|
INTEGER SP; 09070000
|
|
FORWARD; 09080000
|
|
PROCEDURE INFORM0(I); 09090000
|
|
VALUE I; 09100000
|
|
INTEGER I; 09110000
|
|
FORWARD; 09120000
|
|
PROCEDURE INFORMA(I,P); 09130000
|
|
VALUE I, P; 09140000
|
|
INTEGER I; ALPHA P; 09150000
|
|
FORWARD; 09160000
|
|
PROCEDURE INFORMI(I,P); 09170000
|
|
VALUE I, P; 09180000
|
|
INTEGER I, P; 09190000
|
|
FORWARD; 09200000
|
|
PROCEDURE INFORMIA(I,P1,P2); 09210000
|
|
VALUE I, P1, P2; 09220000
|
|
INTEGER I, P1; 09230000
|
|
ALPHA P2; 09240000
|
|
FORWARD; 09250000
|
|
PROCEDURE INFORMII(I,P1,P2); 09260000
|
|
VALUE I, P1, P2; 09270000
|
|
INTEGER I, P1, P2; 09280000
|
|
FORWARD; 09290000
|
|
PROCEDURE INITIALIZESYMBTABL; 09300000
|
|
FORWARD; 09310000
|
|
BOOLEAN PROCEDURE INPUT; 09320000
|
|
FORWARD; 09330000
|
|
PROCEDURE INSERTSTRINGCONVERT(SP); 09340000
|
|
VALUE SP; 09350000
|
|
INTEGER SP; 09360000
|
|
FORWARD; 09370000
|
|
PROCEDURE INTERPRETER; 09380000
|
|
FORWARD; 09390000
|
|
INTEGER PROCEDURE INTRINSIC(L,P,S); 09400000
|
|
VALUE P, S; 09410000
|
|
ALPHA ARRAY L[0]; 09420000
|
|
INTEGER P, S; 09430000
|
|
FORWARD; 09440000
|
|
PROCEDURE LOADER(F); 09450000
|
|
FILE F; 09460000
|
|
FORWARD; 09470000
|
|
PROCEDURE LST(A); 09480000
|
|
ALPHA ARRAY A[0]; 09490000
|
|
FORWARD; 09500000
|
|
PROCEDURE MESSAGE0(I); 09510000
|
|
VALUE I; 09520000
|
|
INTEGER I; 09530000
|
|
FORWARD; 09540000
|
|
PROCEDURE MESSAGEAI(I,P1,P2); 09550000
|
|
VALUE I, P1, P2; 09560000
|
|
INTEGER I, P2; 09570000
|
|
ALPHA P1; 09580000
|
|
FORWARD; 09590000
|
|
PROCEDURE MESSAGEI(I,P); 09600000
|
|
VALUE I, P; 09610000
|
|
INTEGER I, P; 09620000
|
|
FORWARD; 09630000
|
|
PROCEDURE MESSAGETT0(I); 09640000
|
|
VALUE I; 09650000
|
|
INTEGER I; 09660000
|
|
FORWARD; 09670000
|
|
PROCEDURE MESSAGETTA(I,P1); 09680000
|
|
VALUE I, P1; 09690000
|
|
INTEGER I; 09700000
|
|
ALPHA P1; 09710000
|
|
FORWARD; 09720000
|
|
PROCEDURE MESSAGETTAI(I,P1,P2); 09730000
|
|
VALUE I, P1, P2; 09740000
|
|
INTEGER I, P2; 09750000
|
|
ALPHA P1; 09760000
|
|
FORWARD; 09770000
|
|
PROCEDURE MESSAGETTI(I,P); 09780000
|
|
VALUE I, P; 09790000
|
|
INTEGER I, P; 09800000
|
|
FORWARD; 09810000
|
|
INTEGER PROCEDURE MNEMNO(N,A,P); 09820000
|
|
VALUE N; 09830000
|
|
INTEGER N, P; 09840000
|
|
ARRAY A[0]; 09850000
|
|
FORWARD; 09860000
|
|
ALPHA PROCEDURE NEWCELL(I); 09870000
|
|
VALUE I; 09880000
|
|
INTEGER I; 09890000
|
|
FORWARD; 09900000
|
|
PROCEDURE NEWSTROW(I); 09910000
|
|
VALUE I; 09920000
|
|
INTEGER I; 09930000
|
|
FORWARD; 09940000
|
|
BOOLEAN PROCEDURE NULLARGS(N); 09950000
|
|
VALUE N; 09960000
|
|
INTEGER N; 09970000
|
|
FORWARD; 09980000
|
|
BOOLEAN PROCEDURE NUMVAL(ST,VAL); 09990000
|
|
VALUE ST; 10000000
|
|
ALPHA ST; 10010000
|
|
INTEGER VAL; 10020000
|
|
FORWARD; 10030000
|
|
BOOLEAN PROCEDURE OUTPUT; 10040000
|
|
FORWARD; 10050000
|
|
BOOLEAN PROCEDURE POP(STLOC); 10060000
|
|
VALUE STLOC; 10070000
|
|
ALPHA STLOC; 10080000
|
|
FORWARD; 10090000
|
|
PROCEDURE PROCESSCONTROLCARD(A); 10100000
|
|
ALPHA ARRAY A[0]; 10110000
|
|
FORWARD; 10120000
|
|
BOOLEAN PROCEDURE PUSH(S,T); 10130000
|
|
VALUE S, T; ALPHA S, T; 10140000
|
|
FORWARD; 10150000
|
|
PROCEDURE RETURNCELL(L); 10160000
|
|
VALUE L; ALPHA L; 10170000
|
|
FORWARD; 10180000
|
|
PROCEDURE RETURNTEMPS; 10190000
|
|
FORWARD; 10200000
|
|
ALPHA PROCEDURE SCATTER(SIZE,LOC,P,X); 10210000
|
|
VALUE SIZE, P, X; 10220000
|
|
INTEGER SIZE, P; 10230000
|
|
ALPHA ARRAY LOC[0]; 10240000
|
|
ALPHA X; 10250000
|
|
FORWARD; 10260000
|
|
ALPHA PROCEDURE SEARCHST(N,L,P,X); 10270000
|
|
VALUE N, P, X; 10280000
|
|
INTEGER N, P; 10290000
|
|
ALPHA ARRAY L[0]; 10300000
|
|
ALPHA X; 10310000
|
|
FORWARD; 10320000
|
|
BOOLEAN PROCEDURE SNBLDEFINE(ST1,ST2,ST3); 10330000
|
|
VALUE ST1, ST2, ST3; 10340000
|
|
ALPHA ST1, ST2, ST3; 10350000
|
|
FORWARD; 10360000
|
|
BOOLEAN PROCEDURE SNBLIN(ST); 10370000
|
|
VALUE ST; 10380000
|
|
ALPHA ST; 10390000
|
|
FORWARD; 10400000
|
|
BOOLEAN PROCEDURE SNBLOUT(ST); 10410000
|
|
VALUE ST; 10420000
|
|
ALPHA ST; 10430000
|
|
FORWARD; 10440000
|
|
PROCEDURE STORECHARS(N,L,I); 10450000
|
|
VALUE N, I; 10460000
|
|
INTEGER N, I; 10470000
|
|
ALPHA L; 10480000
|
|
FORWARD; 10490000
|
|
ALPHA PROCEDURE STRING(N,STLOC); 10500000
|
|
VALUE N, STLOC; 10510000
|
|
INTEGER N; ALPHA STLOC; 10520000
|
|
FORWARD; 10530000
|
|
PROCEDURE STRINGDUMP(N); 10540000
|
|
VALUE N; 10550000
|
|
INTEGER N; 10560000
|
|
FORWARD; 10570000
|
|
PROCEDURE SYNTAXERR(N,P); 10580000
|
|
VALUE N, P; 10590000
|
|
INTEGER N, P; 10600000
|
|
FORWARD; 10610000
|
|
ALPHA PROCEDURE TEMPCELL; 10620000
|
|
FORWARD; 10630000
|
|
ALPHA PROCEDURE TEMPVAL(I); 10640000
|
|
VALUE I; 10650000
|
|
INTEGER I; 10660000
|
|
FORWARD; 10670000
|
|
BOOLEAN PROCEDURE TRACEFCTCALL(F); 10680000
|
|
VALUE F; 10690000
|
|
INTEGER F; 10700000
|
|
FORWARD; 10710000
|
|
BOOLEAN PROCEDURE TRACEFCTRETURN(F,SUC); 10720000
|
|
VALUE F, SUC; 10730000
|
|
INTEGER F; 10740000
|
|
BOOLEAN SUC; 10750000
|
|
FORWARD; 10760000
|
|
INTEGER PROCEDURE TTINDEX(ST); 10770000
|
|
VALUE ST; 10780000
|
|
ALPHA ST; 10790000
|
|
FORWARD; 10800000
|
|
BOOLEAN PROCEDURE WRITEBUFF(BUFOUT,P,SIZE); 10810000
|
|
VALUE SIZE; 10820000
|
|
INTEGER P, SIZE; 10830000
|
|
ARRAY BUFOUT[0]; 10840000
|
|
FORWARD; 10850000
|
|
PROCEDURE WRITEDATA; 10860000
|
|
FORWARD; 10870000
|
|
PROCEDURE WRITEINST; 10880000
|
|
FORWARD; 10890000
|
|
PROCEDURE WRITEST; 10900000
|
|
FORWARD; 10910000
|
|
PROCEDURE WRITESTACK(N); 10920000
|
|
VALUE N; 10930000
|
|
INTEGER N; 10940000
|
|
FORWARD; 10950000
|
|
PROCEDURE WRITETIME(F,N); 10960000
|
|
VALUE F, N; 10970000
|
|
INTEGER F, N; 10980000
|
|
FORWARD; 10990000
|
|
LABEL 11000000
|
|
ABORTION, % FATAL SYSTEM ERROR 11010000
|
|
ENDOFRUN, % FINAL DUMPS, IF ANY 11020000
|
|
ENDTERPRET; % TRANSFERRED TO AT END OR FATAL ERROR 11030000
|
|
%********CHECKOUTUSE****************************************************11040000
|
|
BOOLEAN PROCEDURE CHECKOUTUSE(ST); 11050000
|
|
VALUE ST; ALPHA ST; 11060000
|
|
CHECKOUTUSE ~ IF BOOLEAN(VALTABL[ST.STR,ST.STW].OUTUSE) 11070000
|
|
THEN SNBLOUT(ST) ELSE TRUE; 11080000
|
|
%********CHECKOUTUSE****************************************************11090000
|
|
%********CHECKSYMBTABL**************************************************11100000
|
|
% CHECKSYMBTABL LOOKS FOR SYMBOL TABLE ENTRIES WHICH POINT TO STRINGS 11110000
|
|
% NOT PRECEDED BY A POINTER BACK TO THE SAME SYMBTABL LOCATION. IF 11120000
|
|
% ANY SUCH ENTRIES ARE FOUND, AN ERROR MESSAGE IS PRINTED AND 11130000
|
|
% THE JOB IS TERMINATED ABNORMALLY (WITH A COMPLETE DUMP). 11140000
|
|
PROCEDURE CHECKSYMBTABL; 11150000
|
|
BEGIN INTEGER I, J, K, RW, CHR, P; 11160000
|
|
BOOLEAN URK; 11170000
|
|
ALPHA AA; 11180000
|
|
FORMAT FF(/"**SYMBTABL LOCATION ",A2," IS NOT POINTED TO BY ITS STRING" 11190000
|
|
" AT DATA[",I2,",*] + ",I4," CHARS."), 11200000
|
|
FPUSH (//"**PUSH-DOWN STACK INTO AVAILABLE SPACE LIST AT ",A2), 11210000
|
|
FG (/"**SYMBTABL LOCATION ZERO HAS BEEN ALTERED."); 11220000
|
|
URK ~ FALSE; 11230000
|
|
IF NAMTABL[0,0]!0 OR VALTABL[0,0]!0 THEN 11240000
|
|
BEGIN WRITE(PRINT,FG); 11250000
|
|
URK ~ TRUE; 11260000
|
|
END; 11270000
|
|
FOR I ~ 0 STEP 1 WHILE I { STRMAX AND USEDST[I] DO 11280000
|
|
BEGIN J ~ NEXTCELL[I].STW; 11290000
|
|
IF J ! 0 THEN DO 11300000
|
|
BEGIN NAMTABL [I,J].[3:1] ~ 1; 11310000
|
|
J ~ (NAMTABL[I,J].LINK).STW; 11320000
|
|
END UNTIL J = 0 OR J } STWMAX; 11330000
|
|
FOR J ~ 0 STEP 1 UNTIL STWMAX DO 11340000
|
|
BEGIN 11350000
|
|
FOR AA ~ NAMTABL[I,J],VALTABL[I,J] DO IF AA.CH > 3 THEN 11360000
|
|
% CHECK STRINGS FOR BACK-POINTERS 11370000
|
|
BEGIN RW ~ TEMP.R; 11380000
|
|
CHR ~ TEMP.CH - 2; 11390000
|
|
MV(2,DATA[RW,CHR.W],CHR.C,P,6); 11400000
|
|
IF I ! P.STR OR J ! P.STW THEN 11410000
|
|
BEGIN WRITE(PRINT,FF,J&I CONCSTR,RW,CHR+2); 11420000
|
|
URK ~ TRUE; 11430000
|
|
END; 11440000
|
|
END; 11450000
|
|
IF NAMTABL[I,J].[1:2]=0 THEN % STRING--CHECK PUSH-DOWN STACK 11460000
|
|
BEGIN 11470000
|
|
AA ~ VALTABL[I,J].LINK; 11480000
|
|
WHILE AA ! 0 DO 11490000
|
|
BEGIN IF BOOLEAN(NAME[AA].[3:1]) THEN 11500000
|
|
BEGIN WRITE(PRINT,FPUSH,AA); 11510000
|
|
URK ~ TRUE; 11520000
|
|
END; 11530000
|
|
AA ~ VALU[AA].LINK; 11540000
|
|
END; 11550000
|
|
END; 11560000
|
|
END; 11570000
|
|
END; 11580000
|
|
IF URK THEN ABORT; 11590000
|
|
END CHECKSYMBTABL; 11600000
|
|
%********CHECKSYMBTABL**************************************************11610000
|
|
%********CLEAR**********************************************************11620000
|
|
PROCEDURE CLEAR(AR,N); VALUE N; ALPHA ARRAY AR[0]; INTEGER N; 11630000
|
|
FOR N ~ N - 1 WHILE N } 0 DO MOVE(8,BLANKS,0,AR[N],0); 11640000
|
|
%********CLEAR**********************************************************11650000
|
|
%********COMBINEARITHMETIC**********************************************11660000
|
|
BOOLEAN PROCEDURE COMBINEARITHMETIC(I); 11670000
|
|
VALUE I; 11680000
|
|
INTEGER I; 11690000
|
|
BEGIN 11700000
|
|
LABEL FAUT, FIN, UNARY; 11710000
|
|
INTEGER J, K, LEVOP, N; 11720000
|
|
% IF INFORM THEN INFORM0(20); 11730000
|
|
COMBINEARITHMETIC ~ FALSE; 11740000
|
|
IF I+1 } SP THEN 11750000
|
|
BEGIN SYNTAXERR(29,PLOC[I]); 11760000
|
|
GO TO FIN; 11770000
|
|
END; 11780000
|
|
IF I + 2 < SP THEN IF PTYPE[I+2] = 7 THEN 11790000
|
|
IF OPLEVEL[PST[I+2]] > LEVOP~OPLEVEL[PST[I]] THEN 11800000
|
|
IF NOT COMBINEARITHMETIC(I+2) THEN GO TO FIN; 11810000
|
|
J ~ I; 11820000
|
|
DO J ~ J-1 UNTIL IF J<PBACK[I] THEN TRUE ELSE PTYPE[J]!0; 11830000
|
|
IF J < PBACK[I] THEN GO TO UNARY; 11840000
|
|
FOR K ~ J, I+1 DO 11850000
|
|
CASE PTYPE[K] OF 11860000
|
|
BEGIN GO TO FAUT; 11870000
|
|
% 1: STRING NAME 11880000
|
|
; 11890000
|
|
% 2: FUNCTION NAME: 11900000
|
|
GO TO IF K=J THEN UNARY ELSE FAUT; 11910000
|
|
% 3: LITERAL 11920000
|
|
; 11930000
|
|
% 4: "(" OF GROUP 11940000
|
|
GO TO IF K=J THEN UNARY ELSE FAUT; 11950000
|
|
% 5: STRING VARIABLE 11960000
|
|
BEGIN SYNTAXERR(16,PLOC[K]); 11970000
|
|
GO TO FIN; 11980000
|
|
END; 11990000
|
|
% 6: INDIRECTION, UNCOMBINED 12000000
|
|
IF NOT COMBINEINDIRECTION(K) THEN GO TO FIN; 12010000
|
|
% 7: CONSECUTIVE ARITHMETIC OPERATORS 12020000
|
|
BEGIN SYNTAXERR(16,PLOC[K]); 12030000
|
|
GO TO FIN; 12040000
|
|
END; 12050000
|
|
% 8: "/" OF FIXED-LENGTH VAR 12060000
|
|
GO TO IF K=J THEN UNARY ELSE FAUT; 12070000
|
|
% 9: STR REF, PATTERN & REPLACEMENT 12080000
|
|
GO TO FAUT; 12090000
|
|
% 10: INDIRECTION COMBINED 12100000
|
|
; 12110000
|
|
% 11: NOT IN USE 12120000
|
|
GO TO FAUT; 12130000
|
|
% 12: NOT IN USE 12140000
|
|
GO TO FAUT; 12150000
|
|
% 13: "*" OF STR VAR 12160000
|
|
BEGIN SYNTAXERR(16,PLOC[K]); 12170000
|
|
GO TO FIN; 12180000
|
|
END; 12190000
|
|
% 14: LABEL IN GO-TO PART 12200000
|
|
GO TO FAUT; 12210000
|
|
% 15: EXPRESSION 12220000
|
|
; 12230000
|
|
% 16: ARITH EXPR 12240000
|
|
; 12250000
|
|
% 17: "*(" OF BAL VAR 12260000
|
|
GO TO FAUT; 12270000
|
|
% 18: STR REF & PATTERN 12280000
|
|
GO TO FAUT; 12290000
|
|
% 19: COMPLETE ARITH EXPR--REMOVE STRING CONVERT 12300000
|
|
PSIZE[K] ~ PSIZE[K] - 2; 12310000
|
|
% 20: "S(", "F(", OR "(" OF GO-TO PART 12320000
|
|
GO TO FAUT; 12330000
|
|
% 21: COMBINED GO-TO PART 12340000
|
|
GO TO FAUT; 12350000
|
|
END CASES; 12360000
|
|
N ~ 0; 12370000
|
|
FOR K ~ J, I+1, I DO 12380000
|
|
BEGIN MOVE(PSIZE[K],CODE[PPOINT[K].W],PPOINT[K].C,SCRATCH[N.W],N.C); 12390000
|
|
N ~ N + PSIZE[K]; 12400000
|
|
PTYPE[K] ~ 0; 12410000
|
|
END; 12420000
|
|
MOVE(N,SCRATCH[*],0,CODE[PPOINT[J].W],PPOINT[J].C); 12430000
|
|
PSIZE[J] ~ N; 12440000
|
|
PTYPE[J] ~ 16; % INCOMPLETE ARITH EXPR 12450000
|
|
COMBINEARITHMETIC ~ TRUE; 12460000
|
|
GO TO FIN; 12470000
|
|
FAUT: 12480000
|
|
WRITEINST; 12490000
|
|
SYNTAXERR(40,0); 12500000
|
|
WRITE(PRINT,17,CODE[*]); 12510000
|
|
WRITESTACK(SP); 12520000
|
|
SYSTEMERROR ~ TRUE; 12530000
|
|
GO TO FIN; 12540000
|
|
UNARY: 12550000
|
|
IF PST[I] = "-" THEN 12560000
|
|
BEGIN MOVE(K~PSIZE[I+1],CODE[(J~PPOINT[I+1]).W],J.C,SCRATCH[*],0);12570000
|
|
AA ~ ".N"; 12580000
|
|
MV(2,AA,6,SCRATCH[K.W],K.C); 12590000
|
|
MOVE(K+2,SCRATCH[*],0,CODE[(J~PPOINT[I]).W],J.C); 12600000
|
|
PTYPE[I+1] ~ 0; 12610000
|
|
PTYPE[I] ~ 16; % ARITH EXPR--NO STRING CONVERT 12620000
|
|
PSIZE[I] ~ K+2; 12630000
|
|
COMBINEARITHMETIC ~ TRUE; 12640000
|
|
GO TO FIN; 12650000
|
|
END ELSE 12660000
|
|
% CANT BE USED AS UNARY: 12670000
|
|
BEGIN SYNTAXERR(11,PLOC[I]); 12680000
|
|
GO TO FIN; 12690000
|
|
END; 12700000
|
|
FIN: 12710000
|
|
IF SYSTEMERROR THEN INFORM0(20); 12720000
|
|
% IF INFORM THEN WRITEINST; 12730000
|
|
END COMBINEARITHMETIC; 12740000
|
|
%********COMBINEARITHMETIC**********************************************12750000
|
|
%********COMBINEFUNCTION************************************************12760000
|
|
PROCEDURE COMBINEFUNCTION(MKS); 12770000
|
|
VALUE MKS; 12780000
|
|
INTEGER MKS; 12790000
|
|
BEGIN INTEGER I, J, N; 12800000
|
|
% IF INFORM THEN INFORM0(25); 12810000
|
|
N ~ J ~ 0; 12820000
|
|
FOR I ~ MKS+1 STEP 1 UNTIL SP-1 DO IF PTYPE[I] ! 0 THEN 12830000
|
|
BEGIN MOVE(PSIZE[I],CODE[PPOINT[I].W],PPOINT[I].C,SCRATCH[J.W],J.C); 12840000
|
|
I ~ I; 12850000
|
|
J ~ J + PSIZE[I]; 12860000
|
|
PTYPE[I] ~ 0; % WIPE OUT ELEMENT 12870000
|
|
N ~ N + 1; 12880000
|
|
END; 12890000
|
|
MV(3,CODE[(I~PPOINT[MKS]).W],I.C,SCRATCH[J.W],J.C); 12900000
|
|
MV(1,N,7,SCRATCH[J.W],J.C+3); 12910000
|
|
MOVE(J+4,SCRATCH[*],0,CODE[I.W],I.C); 12920000
|
|
PTYPE[MKS] ~ 15; % EXPRESSION 12930000
|
|
PNAME[MKS] ~ FALSE; 12940000
|
|
PTR ~ I + (PSIZE[MKS]~J+4); 12950000
|
|
% IF INFORM THEN WRITEINST; 12960000
|
|
END COMBINEFUNCTION; 12970000
|
|
%********COMBINEFUNCTION************************************************12980000
|
|
%********COMBINEGOTOPART************************************************12990000
|
|
BOOLEAN PROCEDURE COMBINEGOTOPART(MKS); 13000000
|
|
VALUE MKS; 13010000
|
|
INTEGER MKS; 13020000
|
|
BEGIN 13030000
|
|
LABEL FAIL, FAUT, FIN; 13040000
|
|
INTEGER I, M; 13050000
|
|
% IF INFORM THEN INFORM0(24); 13060000
|
|
IF PTYPE[MKS] ! 20 THEN GO TO FAUT; 13070000
|
|
M ~ MKS + 1; 13080000
|
|
IF PTYPE[M] = 6 THEN % INDIRECTION 13090000
|
|
BEGIN 13100000
|
|
% GET NUMBER OF INDIRECTIONS: 13110000
|
|
I ~ CHAR(CODE[PPOINT[M].W],PPOINT[M].C+1); 13120000
|
|
IF I > 1 THEN 13130000
|
|
BEGIN I ~ I - 1; 13140000
|
|
MV(1,I,7,CODE[PPOINT[M].W],PPOINT[M].C+1); % DECREASE BY 1 13150000
|
|
IF NOT COMBINEINDIRECTION(M) THEN GO TO FAIL; 13160000
|
|
END ELSE % MOVE BACK TO M: 13170000
|
|
BEGIN PTYPE[M+1] ~ 0; 13180000
|
|
PPOINT[M] ~ PPOINT[M+1]; 13190000
|
|
PLOC[M] ~ PLOC[M+1]; 13200000
|
|
PSIZE[M] ~ PSIZE[M+1]; 13210000
|
|
END; 13220000
|
|
PTR ~ PPOINT[M] + PSIZE[M]; 13230000
|
|
STORECHARS(1,"L",7); % LABEL INDIRECTION CODE 13240000
|
|
PSIZE[M] ~ PSIZE[M] + 1; 13250000
|
|
PTYPE[M] ~ 14; % LABEL EXPRESSION 13260000
|
|
END; 13270000
|
|
IF PTYPE[M] ! 14 THEN 13280000
|
|
BEGIN SYNTAXERR(8,PLOC[M]); % ILLEGAL LABEL 13290000
|
|
GO TO FAIL; 13300000
|
|
END; 13310000
|
|
FOR I ~ M+1 STEP 1 UNTIL SP-1 DO IF PTYPE[I] ! 0 THEN 13320000
|
|
BEGIN SYNTAXERR(8,PLOC[I]); % ILLEGAL LABEL 13330000
|
|
GO TO FAIL; 13340000
|
|
END; 13350000
|
|
PTR ~ PPOINT[M] + PSIZE[M]; 13360000
|
|
PSIZE[MKS] ~ PSIZE[M]; 13370000
|
|
PTYPE[MKS] ~ 21; % GO-TO PART COMBINED 13380000
|
|
PPOINT[MKS] ~ PPOINT[M]; 13390000
|
|
PLOC[MKS] ~ PLOC[M]; 13400000
|
|
COMBINEGOTOPART ~ TRUE; 13410000
|
|
GO TO FIN; 13420000
|
|
% 13430000
|
|
FAUT: 13440000
|
|
WRITEINST; 13450000
|
|
SYNTAXERR(40,0); 13460000
|
|
WRITESTACK(SP); 13470000
|
|
SYSTEMERROR ~ TRUE; 13480000
|
|
FAIL: 13490000
|
|
IF SYSTEMERROR THEN INFORM0(24); 13500000
|
|
COMBINEGOTOPART ~ FALSE; 13510000
|
|
FIN: 13520000
|
|
% IF INFORM THEN WRITEINST; 13530000
|
|
END COMBINEGOTOPART; 13540000
|
|
%********COMBINEGOTOPART************************************************13550000
|
|
%********COMBINEGROUP***************************************************13560000
|
|
BOOLEAN PROCEDURE COMBINEGROUP(MKS,CON); 13570000
|
|
VALUE MKS, CON; 13580000
|
|
INTEGER MKS; 13590000
|
|
BOOLEAN CON; 13600000
|
|
BEGIN 13610000
|
|
LABEL FAUT, FAIL, FIN; 13620000
|
|
BOOLEAN ARITH; % FOR DELETING PARENS AROUND ARITH EXPRS 13630000
|
|
INTEGER ERRNO, ERRPOINT, I, J, K, N; 13640000
|
|
% 13650000
|
|
% IF INFORM THEN INFORM0(21); 13660000
|
|
COMBINEGROUP ~ ARITH ~ FALSE; 13670000
|
|
FOR I ~ MKS STEP 1 UNTIL SP-1 DO IF PTYPE[I] ! 0 THEN 13680000
|
|
CASE PTYPE[I] OF 13690000
|
|
BEGIN; 13700000
|
|
% 1: STRING NAME 13710000
|
|
; 13720000
|
|
% 2: FUNCTION (INCOMPLETE) 13730000
|
|
GO TO FAUT; 13740000
|
|
% 3: LITERAL 13750000
|
|
; 13760000
|
|
% 4: START OF GROUP 13770000
|
|
GO TO FAUT; 13780000
|
|
% 5: NOT USED 13790000
|
|
GO TO FAUT; 13800000
|
|
% 6: $N--INDIRECTION, UNCOMBINED 13810000
|
|
IF NOT COMBINEINDIRECTION(I) THEN GO TO FIN; 13820000
|
|
% 7: ARITH OPERATOR: 13830000
|
|
BEGIN 13840000
|
|
IF NOT COMBINEARITHMETIC(I) THEN GO TO FIN; 13850000
|
|
WHILE I > 0 AND PTYPE[I]!16 DO I ~ I - 1; % FIND RESULT 13860000
|
|
IF PTYPE[I] ! 16 THEN GO TO FAUT; 13870000
|
|
INSERTSTRINGCONVERT(I); 13880000
|
|
ARITH ~ TRUE; 13890000
|
|
END; 13900000
|
|
% 8: FIXED-LENGTH "/" 13910000
|
|
GO TO FAUT; 13920000
|
|
% 9: STR REF, PATTERN & REPLACEMENT 13930000
|
|
GO TO FAUT; 13940000
|
|
% 10: INDIRECTION COMBINED 13950000
|
|
; 13960000
|
|
% 11: NOT USED 13970000
|
|
GO TO FAUT; 13980000
|
|
% 12: QMARK--ERROR 13990000
|
|
GO TO FAUT; 14000000
|
|
% 13: "*" STR VAR--ERROR 14010000
|
|
GO TO FAUT; 14020000
|
|
% 14: LABEL IN GO-TO PART 14030000
|
|
GO TO FAUT; 14040000
|
|
% 15: EXPRESSION 14050000
|
|
; 14060000
|
|
% 16: ARITH EXPR--NO STRING CONVERT 14070000
|
|
BEGIN 14080000
|
|
INSERTSTRINGCONVERT(I); 14090000
|
|
ARITH ~ TRUE; % MIGHT BE ARITH EXPR 14100000
|
|
END; 14110000
|
|
% 17: "*(" OF BAL VAR 14120000
|
|
GO TO FAUT; 14130000
|
|
% 18: STR REF & PATTERN 14140000
|
|
GO TO FAUT; 14150000
|
|
% 19: COMPLETE ARITH EXPR 14160000
|
|
ARITH ~ TRUE; 14170000
|
|
% 20: "S(", "F(", OR "(" OF GO-TO PART 14180000
|
|
GO TO FAUT; 14190000
|
|
% 21: COMBINED GO-TO PART 14200000
|
|
GO TO FAUT; 14210000
|
|
END CASES; 14220000
|
|
N ~ J ~ 0; 14230000
|
|
FOR I ~ MKS STEP 1 UNTIL SP-1 DO IF PTYPE[I] ! 0 THEN 14240000
|
|
BEGIN 14250000
|
|
N ~ N + 1; 14260000
|
|
MOVE(PSIZE[I],CODE[PPOINT[I].W],PPOINT[I].C,SCRATCH[J.W],J.C); 14270000
|
|
IF N { 1 AND NOT CON THEN 14280000
|
|
BEGIN PNAME[MKS] ~ PNAME[I]; 14290000
|
|
PTYPE[MKS] ~ PTYPE[I]; 14300000
|
|
END ELSE PTYPE[I] ~ 0; 14310000
|
|
J ~ J + PSIZE[I]; 14320000
|
|
END; 14330000
|
|
IF J = 0 THEN 14340000
|
|
BEGIN AA ~ "%00"; 14350000
|
|
MV(J~3,AA,5,SCRATCH[*],0); 14360000
|
|
PTYPE[MKS] ~ 1; % STRING NAME 14370000
|
|
PNAME[MKS] ~ TRUE; 14380000
|
|
END; 14390000
|
|
IF N > 1 THEN ARITH ~ FALSE; % NOT A SIMPLE ARITH EXPR. 14400000
|
|
IF ARITH THEN 14410000
|
|
BEGIN PTYPE[MKS] ~ 19; % COMPLETE ARITH EXPR 14420000
|
|
PNAME[MKS] ~ FALSE; 14430000
|
|
END ELSE 14440000
|
|
IF N > 1 OR CON THEN 14450000
|
|
BEGIN AA ~ N & "("[36:42:6]; 14460000
|
|
MV(2,AA,6,SCRATCH[J.W],J.C); 14470000
|
|
J ~ J + 2; 14480000
|
|
PNAME[MKS] ~ FALSE; 14490000
|
|
PTYPE[MKS] ~ 15; % EXPRESSION 14500000
|
|
END; 14510000
|
|
MOVE(J,SCRATCH[*],0,CODE[(I~PPOINT[MKS]).W],I.C); 14520000
|
|
PTR ~ I + (PSIZE[MKS]~J); 14530000
|
|
COMBINEGROUP ~ TRUE; 14540000
|
|
GO TO FIN; 14550000
|
|
% 14560000
|
|
FAUT: 14570000
|
|
WRITEINST; 14580000
|
|
SYNTAXERR(40,0); 14590000
|
|
WRITE(PRINT,17,CODE[*]); 14600000
|
|
WRITESTACK(SP); 14610000
|
|
SYSTEMERROR ~ TRUE; 14620000
|
|
GO TO FIN; 14630000
|
|
FAIL: 14640000
|
|
SYNTAXERR(ERRNO,ERRPOINT); 14650000
|
|
FIN: 14660000
|
|
IF SYSTEMERROR THEN INFORM0(21); 14670000
|
|
% IF INFORM THEN WRITEINST; 14680000
|
|
END COMBINEGROUP; 14690000
|
|
%********COMBINEGROUP***************************************************14700000
|
|
%********COMBINEINDIRECTION*********************************************14710000
|
|
BOOLEAN PROCEDURE COMBINEINDIRECTION(MKS); 14720000
|
|
VALUE MKS; 14730000
|
|
INTEGER MKS; 14740000
|
|
BEGIN INTEGER I, ERRNO, J, K; 14750000
|
|
LABEL FIN, FAIL, FAUT; 14760000
|
|
% 14770000
|
|
% IF INFORM THEN INFORM0(22); 14780000
|
|
FOR I ~ MKS STEP 1 UNTIL SP-2 DO IF PTYPE[I] = 6 THEN 14790000
|
|
BEGIN 14800000
|
|
CASE PTYPE[I+1] OF % CHECK FOR SYNTAX ERRORS 14810000
|
|
BEGIN GO TO FAUT; 14820000
|
|
% 1: STRING NAME 14830000
|
|
BEGIN J ~ "%"; % TO MARK AS NON-INPUT STRING NAME 14840000
|
|
MV(1,J,7,CODE[PPOINT[I+1].W],PPOINT[I+1].C); 14850000
|
|
END; 14860000
|
|
% 2: FUNCTION--INCOMPLETE 14870000
|
|
; % TO BECOME AN ERROR EVENTUALLY 14880000
|
|
% 3: LITERAL 14890000
|
|
; 14900000
|
|
% 4: GROUPING--INCOMPLETE 14910000
|
|
BEGIN ERRNO ~ 27; 14920000
|
|
GO TO FAIL; 14930000
|
|
END; 14940000
|
|
% 5: NOT USED 14950000
|
|
GO TO FAUT; 14960000
|
|
% 6: INDIRECTION--SHOULD NOT OCCUR 14970000
|
|
GO TO FAUT; 14980000
|
|
% 7: ARITHMETIC OPERATOR 14990000
|
|
BEGIN ERRNO ~ 34; 15000000
|
|
GO TO FAIL; 15010000
|
|
END; 15020000
|
|
% 8: FIXED-LENGTH "/" 15030000
|
|
BEGIN ERRNO ~ 34; 15040000
|
|
GO TO FAIL; 15050000
|
|
END; 15060000
|
|
% STR REF, PATTERN & REPLACEMENT 15070000
|
|
GO TO FAUT; 15080000
|
|
% 10: INDIRECTION COMBINED 15090000
|
|
GO TO FAUT; 15100000
|
|
% 11: "," 15110000
|
|
BEGIN ERRNO ~ 34; 15120000
|
|
GO TO FAIL; 15130000
|
|
END; 15140000
|
|
% 12: QMARK--ERROR 15150000
|
|
GO TO FAUT; 15160000
|
|
% 13: "*" STR VAR 15170000
|
|
BEGIN ERRNO ~ 34; 15180000
|
|
GO TO FAIL; 15190000
|
|
END; 15200000
|
|
% 14: LABEL IN GO-TO PART 15210000
|
|
GO TO FAUT; 15220000
|
|
% 15: EXPRESSION 15230000
|
|
; 15240000
|
|
% 16: INCOMPLETE ARITH EXPRESSION 15250000
|
|
INSERTSTRINGCONVERT(I); 15260000
|
|
% 17: "*(" OF BAL VAR 15270000
|
|
GO TO FAUT; 15280000
|
|
% 18: STR REF & PATTERN 15290000
|
|
GO TO FAUT; 15300000
|
|
% 19: COMPLETE ARITH EXPR 15310000
|
|
; 15320000
|
|
% 20: "S(", "F(", OR "(" OF GO-TO PART 15330000
|
|
GO TO FAUT; 15340000
|
|
% 21: COMBINED GO-TO PART 15350000
|
|
GO TO FAUT; 15360000
|
|
END CASES; 15370000
|
|
% INTERCHANGE ELEMENTS: 15380000
|
|
MOVE(K~PSIZE[I+1],CODE[(J~PPOINT[I+1]).W],J.C,SCRATCH[*],0); 15390000
|
|
MV(3,CODE[PPOINT[I].W],PPOINT[I].C,SCRATCH[K.W],K.C); 15400000
|
|
MOVE(K+3,SCRATCH[*],0,CODE[PPOINT[I].W],PPOINT[I].C); 15410000
|
|
PSIZE[I] ~ K + 3; 15420000
|
|
PTYPE[I] ~ 10; % INDIRECTION, COMBINED 15430000
|
|
PNAME[I] ~ TRUE; 15440000
|
|
PTYPE[I+1] ~ 0; % WIPE OUT NEXT ELEMENT 15450000
|
|
COMBINEINDIRECTION ~ TRUE; 15460000
|
|
GO TO FIN; 15470000
|
|
END; 15480000
|
|
% IF FALL THRU, NO ARGUMENT TO $: 15490000
|
|
ERRNO ~ 34; 15500000
|
|
GO TO FAIL; 15510000
|
|
FAUT: 15520000
|
|
WRITEINST; 15530000
|
|
SYNTAXERR(40,0); 15540000
|
|
WRITE(PRINT,17,CODE[*]); 15550000
|
|
WRITESTACK(SP); 15560000
|
|
SYSTEMERROR ~ TRUE; 15570000
|
|
GO TO FIN; 15580000
|
|
FAIL: 15590000
|
|
SYNTAXERR(ERRNO,PLOC[I+1]); 15600000
|
|
FIN: 15610000
|
|
IF SYSTEMERROR THEN INFORM0(22); 15620000
|
|
% IF INFORM THEN WRITEINST; 15630000
|
|
END COMBINEINDIRECTION; 15640000
|
|
%********COMBINEINDIRECTION*********************************************15650000
|
|
%********COMBINESTRVARNAME**********************************************15660000
|
|
BOOLEAN PROCEDURE COMBINESTRVARNAME(MKS); 15670000
|
|
VALUE MKS; 15680000
|
|
INTEGER MKS; 15690000
|
|
BEGIN LABEL FIN, SUCCEED; 15700000
|
|
INTEGER I; 15710000
|
|
% IF INFORM THEN INFORM0(23); 15720000
|
|
COMBINESTRVARNAME ~ FALSE; 15730000
|
|
IF I~PTYPE[MKS] ! 13 AND I ! 17 THEN 15740000
|
|
BEGIN WRITEINST; 15750000
|
|
SYNTAXERR(40,0); 15760000
|
|
WRITE(PRINT,17,CODE[*]); 15770000
|
|
WRITESTACK(SP); 15780000
|
|
SYSTEMERROR ~ TRUE; 15790000
|
|
GO TO FIN; 15800000
|
|
END; 15810000
|
|
PTYPE[MKS] ~ 0; 15820000
|
|
IF NOT COMBINEGROUP(MKS,FALSE) THEN GO TO FIN; 15830000
|
|
IF NOT PNAME[MKS] THEN 15840000
|
|
BEGIN SYNTAXERR(52,PLOC[MKS+1]); % INVALID NAME 15850000
|
|
GO TO SUCCEED; 15860000
|
|
END; 15870000
|
|
% MARK AS NON-INPUT 15880000
|
|
IF PTYPE[MKS] = 1 THEN % IDENTIFIER--CHANGE TO "%" TYPE 15890000
|
|
BEGIN I ~ "%"; 15900000
|
|
MV(1,I,7,CODE[PPOINT[MKS].W],PPOINT[MKS].C); 15910000
|
|
END ELSE 15920000
|
|
IF PTYPE[MKS] = 10 THEN % INDIRECTION--REMOVE "I" 15930000
|
|
BEGIN PTYPE[MKS] ~ 15; % EXPRESSION 15940000
|
|
PSIZE[MKS] ~ PSIZE[MKS] - 1; 15950000
|
|
END; 15960000
|
|
SUCCEED: 15970000
|
|
COMBINESTRVARNAME ~ TRUE; 15980000
|
|
FIN: 15990000
|
|
IF SYSTEMERROR THEN INFORM0(23); 16000000
|
|
% IF INFORM THEN WRITEINST; 16010000
|
|
END COMBINESTRVARNAME; 16020000
|
|
%********COMBINESTRVARNAME**********************************************16030000
|
|
%********COMPILE********************************************************16040000
|
|
% 16050000
|
|
% THE INTERNAL FORM OF A SNOBOL PROGRAM IS DESCRIBED HERE: 16060000
|
|
% THE PROGRAM IS "SEGMENTED", WITH A LABELED INSTRUCTION STARTING A 16070000
|
|
% SEGMENT, AND THE UNLABELED INSTRUCTIONS FOLLOWING IT ARE IN THE 16080000
|
|
% SAME SEGMENT. A SEGMENT IS A STRING, WHOSE "NAME" IS THE LABEL OF 16090000
|
|
% ITS FIRST INSTRUCTION, AND WHOSE "VALUE" IS THE INTERNAL CODED 16100000
|
|
% FORM OF THE INSTRUCTIONS IN THE SEGMENT. 16110000
|
|
% EACH SEGMENT STARTS WITH 2 CHARS GIVING THE LOC OF THE NEXT 16120000
|
|
% SEGMENT, FOR PATCHING PURPOSES. 16130000
|
|
% EACH INSTRUCTION STARTS WITH A 7-CHAR "INTRODUCTION" GIVING: 16140000
|
|
% 1 CHAR: THE ILLEGAL CHAR 16150000
|
|
% 2 CHARS: THE NUMBER OF THE INSTRUCTION, AS GIVEN IN THE LISTING16160000
|
|
% 2 CHARS: THE LOCATION OF THE SUCCESS EXIT, RELATIVE TO THE 16170000
|
|
% FIRST CHAR OF THE SEGMENT. 16180000
|
|
% 2 CHARS: THE SAME FOR THE FAILURE EXIT. 16190000
|
|
% IF EITHER EXIT ISNT SPECIFIED, AND THE NEXT INSTRUCTION IS 16200000
|
|
% UNLABELED, THE POINTER IS TO THE ILLEGAL CHAR AT THE START OF THE 16210000
|
|
% NEXT INSTRUCTION; IF THE NEXT INST IS LABELED, THE GO-TO PART IS 16220000
|
|
% "FILLED OUT" WITH A TRANSFER TO THIS LABEL. 16230000
|
|
% 16240000
|
|
% THE INTERNAL CODE IS: 16250000
|
|
% STRING NAMES AND LABELS IN THE GO-TO PARTS ARE REPRESENTED BY 16260000
|
|
% A QUOTE FOLLOWED BY A 12-BIT (2-CHARS) POINTER TO SYMBTABL. 16270000
|
|
% LITERALS ARE REPRESENTED BY "@" FOLLOWED BY A 2-CHAR POINTER 16280000
|
|
% TO SYMBTABL. 16290000
|
|
% PATTERN MATCHES ARE INDICATED BY "=" FOLLOWING THE CODE FOR 16300000
|
|
% THE PATTERN; REPLACEMENTS ARE INDICATED BY "~" FOLLOWING THE CODE 16310000
|
|
% FOR THE REPLACEMENT. (BOTH ARE POSTFIX OPERATORS.) 16320000
|
|
% THE RESERVED LABELS ARE REPRESENTED AS FOLLOWS: 16330000
|
|
% END: "-E" 16340000
|
|
% RETURN: "-R" 16350000
|
|
% FRETURN: "-F" 16360000
|
|
% SYNTAX ERRORS CAUSE THE CHARACTER "X" WHERE THE STRING REFERENCE 16370000
|
|
% SHOULD BE. 16380000
|
|
% FUNCTIONS ARE POSTFIX OPERATORS, WHICH USE 4 CHARACTERS: "#" 16390000
|
|
% TO INDICATE THE FUNCTION CALL, 2 CHARS FOR A POINTER TO THE 16400000
|
|
% SYMBOL TABLE ENTRY FOR THE FUNCTION, AND 1 CHAR TO GIVE THE NUMBER 16410000
|
|
% OF PARAMETERS. 16420000
|
|
% INDIRECTION IS A POSTFIX OPERATOR CONSISTING OF A "$" AND ONE 16430000
|
|
% CHARACTER GIVING THE NUMBER OF INDIRECTIONS. NOTE THAT THIS MEANS 16440000
|
|
% THAT THE SYSTEM CANT HANDLE MORE THAN 63 CONSECUTIVE DOLLAR SIGNS 16450000
|
|
% WITHOUT USING PARENTHESES TO CAUSE A GROUPING. THIS IS NOT 16460000
|
|
% EXPECTED TO CREATE ANY HARDSHIPS WITH ANY USERS. 16470000
|
|
% 16480000
|
|
% THE FOLLOWING STACK ARRAYS ARE USED BY THE COMPILER: 16490000
|
|
% 16500000
|
|
% PLOC[*] HOLDS POINTERS INTO INST[*], TO THE START OF THE ORIGINAL 16510000
|
|
% CODE FOR THE ELEMENT, FOR DIAGNOSTIC PURPOSES 16520000
|
|
% PPOINT[*] HOLDS POINTERS INTO CODE[*], TO THE START OF THE 16530000
|
|
% COMPILED CODE FOR THE ELEMENTS 16540000
|
|
% PSIZE[*] HOLDS THE SIZE OF THE COMPILED PIECE OF CODE 16550000
|
|
% PBACK[*] LINKS BACK TO THE START OF NEXTINGS OF GROUPINGS OR 16560000
|
|
% OF FUNCTION CALLS 16570000
|
|
% PST[*] HOLDS THE OPERATOR FOR ARITHMETIC OPERATORS 16580000
|
|
% PTYPE[*] IS THE TYPE OF ELEMENT, AS FOLLOWS: 16590000
|
|
% 0: IGNORE--COMBINED WITH EARLIER ELEMENTS 16600000
|
|
% 1: STRING NAME 16610000
|
|
% 2: START OF FUNCTION CALL (#---) 16620000
|
|
% 3: LITERAL 16630000
|
|
% 4: "(" AT START OF GROUPING 16640000
|
|
% 5: STRING VARIABLE--COMBINED INTO ONE ELEMENT 16650000
|
|
% 6: INDIRECTION, UNCOMBINED ($N) 16660000
|
|
% 7: ARITHMETIC OPERATOR 16670000
|
|
% 8: "/" OF FIXED-LENGTH VARIABLE 16680000
|
|
% 9: STR REF, PATTERN, & REPLACEMENT COMBINED 16690000
|
|
% 10: INDIRECTION, COMBINED (INCLUDES "I" FOR INPUT CHECK) 16700000
|
|
% 11: NOT IN USE 16710000
|
|
% 12: NOT IN USE 16720000
|
|
% 13: "*" AT START OF STRING VARIABLE 16730000
|
|
% 14: LABEL IN GO-TO PART 16740000
|
|
% 15: EXPRESSION (COMBINED) 16750000
|
|
% 16: ARITHMETIC EXPRESSION--NO STRING CONVERT ADDED 16760000
|
|
% 17: "*(" OF BALANCED STRING VARIABLE 16770000
|
|
% 18: STR REF & PATTERN TOGETHER. 16780000
|
|
% 19: COMPLETE ARITH EXPR (WITH STRING CONVERT) 16790000
|
|
% 20: "S(", "F(", OR "(" OF GO-TO PART 16800000
|
|
% 21: COMBINED GO-TO PART 16810000
|
|
% 16820000
|
|
% 16830000
|
|
PROCEDURE COMPILE(INST); ALPHA ARRAY INST[0]; 16840000
|
|
BEGIN LABEL 16850000
|
|
NEXT, ILLEGAL, 16860000
|
|
BL, LIT, STR, 16870000
|
|
NAME, NAME1, CMA, GOTO, GTPART, 16880000
|
|
CONDENSEPATTERN, 16890000
|
|
CONDENSEREPLACEMENT, 16900000
|
|
DLR, 16910000
|
|
ENDSTRVAR, 16920000
|
|
ERROR, 16930000
|
|
NOP, 16940000
|
|
OP, 16950000
|
|
PARENERR, 16960000
|
|
QMRK, RETURN, 16970000
|
|
MESFIL, 16980000
|
|
SEMICOLON, START, L1 16990000
|
|
; 17000000
|
|
%******** 17010000
|
|
BOOLEAN 17020000
|
|
ARITH, 17030000
|
|
ARF, 17040000
|
|
FIXEDLENGTH, 17050000
|
|
NF, 17060000
|
|
PATTERN, 17070000
|
|
REPLACEMENT, 17080000
|
|
SVF; 17090000
|
|
BOOLEAN ARRAY COMPILINGFCT[0:50]; 17100000
|
|
INTEGER 17110000
|
|
FIRSTCHAR, % FLAGS FOR FIRST OF INST. 17120000
|
|
I, 17130000
|
|
J, 17140000
|
|
T, 17150000
|
|
TEMP; 17160000
|
|
% 17170000
|
|
P ~ SCANCHAR(" "," ",INST[*],0); 17180000
|
|
START: 17190000
|
|
FOR I ~ 0 STEP 1 UNTIL 5 DO BACKTRACK[0,I] ~ 0; 17200000
|
|
FIRSTCHAR ~ MKS ~ PARENCOUNT ~ 0; 17210000
|
|
GTLAST ~ GT; 17220000
|
|
PATTERN ~ REPLACEMENT ~ GT ~ GTS ~ GTF ~ SYSTEMERROR ~ SVF ~ ARF ~ 17230000
|
|
FIXEDLENGTH ~ FALSE; 17240000
|
|
P ~ P + 1; 17250000
|
|
P ~ P + SKIPCHAR(" ",INST[P.W],P.C); 17260000
|
|
IF P } INSTSIZE THEN GO TO RETURN; 17270000
|
|
SP ~ -1; 17280000
|
|
IF DATACOMF THEN IF INSTNUM MOD 10 = 0 THEN 17290000
|
|
IF INSTNUM = 0 THEN % RETURN, LINE FEED. 17300000
|
|
BEGIN MV(3,CRLF,5,DCWRITE[*],0); 17310000
|
|
IF OUTPUT THEN; 17320000
|
|
END ELSE 17330000
|
|
% WRITE INST #: 17340000
|
|
MESSAGETTI(15,INSTNUM); % TYPE # ON TELETYPE. 17350000
|
|
NEXT: 17360000
|
|
IF (SP~SP+1) } STACKSIZE THEN 17370000
|
|
BEGIN SYNTAXERR(21,P); 17380000
|
|
GO TO RETURN; 17390000
|
|
END; 17400000
|
|
% IF INFORM THEN 17410000
|
|
% BEGIN MV(6,INST[P.W],P.C,AA,2); 17420000
|
|
% INFORMIA(2,SP,AA); 17430000
|
|
% END; 17440000
|
|
PPOINT[SP] ~ PTR; 17450000
|
|
PLOC[SP] ~ P; % SAVE FOR SYNTAX ERRORS 17460000
|
|
IF P } INSTSIZE THEN GO TO QMRK; 17470000
|
|
CASE CHARTYPE[CHAR(INST[P.W],P.C)] OF 17480000
|
|
BEGIN 17490000
|
|
% 0: ERROR 17500000
|
|
BEGIN SYNTAXERR(3,P); 17510000
|
|
GO TO RETURN; 17520000
|
|
END; 17530000
|
|
% 1: BLANK 17540000
|
|
BEGIN P ~ P + SKIPCHAR(" ",INST[P.W],P.C); 17550000
|
|
SP ~ SP - 1; 17560000
|
|
GO TO NEXT; 17570000
|
|
END; 17580000
|
|
% 2: "~" OR "=" 17590000
|
|
BEGIN 17600000
|
|
IF SP < 1 THEN 17610000
|
|
BEGIN SYNTAXERR(6,P); 17620000
|
|
GO TO RETURN; 17630000
|
|
END; 17640000
|
|
IF NOT (PNAME[0] OR PTYPE[0]=6) THEN 17650000
|
|
BEGIN SYNTAXERR(15,P); % REPLACEMENT IN VALUE EXPR 17660000
|
|
GO TO RETURN; 17670000
|
|
END; 17680000
|
|
IF ARF THEN 17690000
|
|
BEGIN SYNTAXERR(13,P); % EXTRA "~" OR "=" 17700000
|
|
GO TO RETURN; 17710000
|
|
END; 17720000
|
|
IF PARENCOUNT ! 0 THEN 17730000
|
|
BEGIN SYNTAXERR(27,P); % MISSING ")" 17740000
|
|
GO TO RETURN; 17750000
|
|
END; 17760000
|
|
IF SVF THEN 17770000
|
|
BEGIN SYNTAXERR(38,P); % MISSING "*" 17780000
|
|
GO TO RETURN; 17790000
|
|
END; 17800000
|
|
IF GT THEN 17810000
|
|
BEGIN SYNTAXERR(7,P); % UNRECOGNIZED GO-TO CONSTRUCT 17820000
|
|
GO TO RETURN; 17830000
|
|
END; 17840000
|
|
ARF ~ TRUE; 17850000
|
|
P ~ P + 1; 17860000
|
|
CONDENSEPATTERN: 17870000
|
|
% IF INFORM THEN INFORM0(27); 17880000
|
|
FOR I ~ 0 STEP 1 UNTIL SP-1 DO 17890000
|
|
CASE PTYPE[I] OF 17900000
|
|
BEGIN; % IF 0, IGNORE 17910000
|
|
%1: STRING NAME: 17920000
|
|
; 17930000
|
|
% 2: START OF FUNCTION CALL 17940000
|
|
GO TO ERROR; 17950000
|
|
% 3: LITERAL 17960000
|
|
; 17970000
|
|
% 4: "(" OF GROUPING 17980000
|
|
GO TO ERROR; 17990000
|
|
% 5: STR VAR 18000000
|
|
; 18010000
|
|
% 6: INDIRECTION 18020000
|
|
IF NOT COMBINEINDIRECTION(I) THEN GO TO RETURN; 18030000
|
|
% 7: ARITH OPERATOR 18040000
|
|
BEGIN IF NOT COMBINEARITHMETIC(I) THEN GO TO RETURN; 18050000
|
|
WHILE I > 0 AND PTYPE[I]!16 DO I ~ I - 1; % FIND RESULT 18060000
|
|
IF PTYPE[I] ! 16 THEN GO TO ERROR; 18070000
|
|
INSERTSTRINGCONVERT(I); 18080000
|
|
END; 18090000
|
|
% 8: "/" OF FIXED-LENGTH VAR 18100000
|
|
GO TO ERROR; 18110000
|
|
% 9: STR REF, PATTERN & REPL 18120000
|
|
GO TO ERROR; 18130000
|
|
% 10: INDIRECTION COMBINED 18140000
|
|
; 18150000
|
|
% 11: UNUSED 18160000
|
|
GO TO ERROR; 18170000
|
|
% 12: UNUSED 18180000
|
|
GO TO ERROR; 18190000
|
|
% 13: "*" OF STR VAR 18200000
|
|
GO TO ERROR; 18210000
|
|
% 14: LABEL IN GO-TO PART 18220000
|
|
GO TO ERROR; 18230000
|
|
% 15: EXPRESSION 18240000
|
|
; 18250000
|
|
% 16: ARITH EXPR--NO STRING CONVERT 18260000
|
|
INSERTSTRINGCONVERT(I); 18270000
|
|
% 17: "*(" OF BAL VAR 18280000
|
|
GO TO ERROR; 18290000
|
|
% 18: STR REF & PATTERN 18300000
|
|
GO TO ERROR; 18310000
|
|
% 19: COMPLETE ARITH EXPR 18320000
|
|
; 18330000
|
|
% 20: "S(", "F(", OR "(" OF GO-TO PART 18340000
|
|
GO TO ERROR; 18350000
|
|
% 21: COMBINED GO-TO PART 18360000
|
|
GO TO ERROR; 18370000
|
|
END CASES; 18380000
|
|
I1 ~ I2 ~ 0; 18390000
|
|
FOR I ~ 1 STEP 1 UNTIL SP-1 DO IF PTYPE[I] ! 0 THEN 18400000
|
|
BEGIN 18410000
|
|
MOVE(PSIZE[I],CODE[PPOINT[I].W],PPOINT[I].C,SCRATCH[I2.W],I2.C); 18420000
|
|
I2 ~ I2 + PSIZE[I]; 18430000
|
|
I1 ~ I1 + 1; 18440000
|
|
PTYPE[I] ~ 0; 18450000
|
|
END; 18460000
|
|
IF I1 } 1 THEN 18470000
|
|
BEGIN 18480000
|
|
IF PTYPE[0] = 1 THEN 18490000
|
|
BEGIN AA ~ "%"; 18500000
|
|
MV(1,AA,7,CODE[PPOINT[0].W],PPOINT[0].C); 18510000
|
|
END ELSE 18520000
|
|
IF PTYPE[0] = 10 THEN 18530000
|
|
BEGIN PTYPE[0] ~ 15; % EXPRESSION 18540000
|
|
PSIZE[0] ~ PSIZE[0] - 1; % DROP "I" 18550000
|
|
END; 18560000
|
|
PTR ~ PPOINT[0] + PSIZE[0]; 18570000
|
|
STORECHARS(1,"S",7); 18580000
|
|
STORECHARS(I2,SCRATCH[0],0); 18590000
|
|
STORECHARS(1,"=",7); 18600000
|
|
PSIZE[0] ~ PSIZE[0] + I2 + 2; 18610000
|
|
FIRSTCHAR.[43:2] ~ 3; % STR REF, PATTERN EXIST 18620000
|
|
PTYPE[0] ~ 18; % STR REF & PATTERN 18630000
|
|
END ELSE 18640000
|
|
FIRSTCHAR.[43:2] ~ 2; % STR REF, NO PATTERN 18650000
|
|
IF GT THEN % PUT IN "/" AS GO-TO DELIMITER 18660000
|
|
BEGIN STORECHARS(1,"/",7); 18670000
|
|
PSIZE[0] ~ PSIZE[0] + 1; 18680000
|
|
END; 18690000
|
|
PATTERN ~ TRUE; 18700000
|
|
SP ~ 0; 18710000
|
|
PBACK[MKS~1] ~ 0; 18720000
|
|
% IF INFORM THEN WRITEINST; 18730000
|
|
GO TO NEXT; 18740000
|
|
END; % CASE FOR "=" OR "~". 18750000
|
|
% 3: LETTER, DIGIT, OR PERIOD 18760000
|
|
GO TO NAME; 18770000
|
|
% 4: """ 18780000
|
|
GO TO LIT; 18790000
|
|
% 5: "(" 18800000
|
|
BEGIN 18810000
|
|
IF GT THEN IF PARENCOUNT = 0 THEN GO TO GTPART; 18820000
|
|
COMPILINGFCT[PARENCOUNT~PARENCOUNT+1] ~ FALSE; 18830000
|
|
P ~ P + 1; 18840000
|
|
PBACK[SP] ~ MKS; 18850000
|
|
MKS ~ SP; 18860000
|
|
PTYPE[SP] ~ 4; % "("--BEGIN GROUPING 18870000
|
|
PSIZE[SP] ~ 0; % NOTHING TO STORE IN CODE HERE 18880000
|
|
GO TO NEXT; 18890000
|
|
END; 18900000
|
|
% 6: ")" 18910000
|
|
BEGIN 18920000
|
|
IF PARENCOUNT { 0 THEN 18930000
|
|
BEGIN SYNTAXERR(12,P); % EXTRA RIGHT PAREN 18940000
|
|
GO TO RETURN; 18950000
|
|
END; 18960000
|
|
IF SVF AND NOT FIXEDLENGTH THEN IF PARENCOUNT = 1 THEN 18970000
|
|
IF PTYPE[MKS] = 17 THEN 18980000
|
|
BEGIN 18990000
|
|
IF CHAR(INST[P.W],P.C+1) ! "*" THEN 19000000
|
|
BEGIN SYNTAXERR(38,P+1); 19010000
|
|
GO TO RETURN; 19020000
|
|
END; 19030000
|
|
P ~ P + 1; % SKIP ")" 19040000
|
|
PARENCOUNT ~ 0; 19050000
|
|
GO TO ENDSTRVAR; 19060000
|
|
END BALANCED VARIABLE ELEMENT; 19070000
|
|
IF GT AND PARENCOUNT=1 THEN % END OF A PIECE OF THE GO-TO PART 19080000
|
|
BEGIN 19090000
|
|
IF NOT COMBINEGOTOPART(MKS) THEN GO TO RETURN; 19100000
|
|
END ELSE 19110000
|
|
IF COMPILINGFCT[PARENCOUNT] THEN 19120000
|
|
BEGIN 19130000
|
|
IF NOT COMBINEGROUP(MKS+1,FALSE) THEN GO TO RETURN; 19140000
|
|
COMBINEFUNCTION(IF PTYPE[MKS]=2 THEN MKS ELSE (MKS~PBACK[MKS])); 19150000
|
|
END ELSE 19160000
|
|
BEGIN PTYPE[MKS] ~ 0; % WIPE OUT "(" ENTRY 19170000
|
|
IF NOT COMBINEGROUP(MKS,TRUE) THEN GO TO RETURN; 19180000
|
|
END; 19190000
|
|
PARENCOUNT ~ PARENCOUNT - 1; 19200000
|
|
P ~ P + 1; 19210000
|
|
IF PTYPE[SP~MKS]!2 THEN MKS ~ PBACK[MKS]; 19220000
|
|
GO TO NEXT; 19230000
|
|
END; 19240000
|
|
% 7: "*" 19250000
|
|
GO TO STR; 19260000
|
|
% 8: "$" 19270000
|
|
GO TO DLR; 19280000
|
|
% 9: ":" GO-TO PART 19290000
|
|
GOTO: 19300000
|
|
BEGIN 19310000
|
|
IF SVF THEN % UNMATCHED STR VAR * BEFORE GO-TO. 19320000
|
|
BEGIN SYNTAXERR(38,PPOINT[SP-1]); 19330000
|
|
GO TO RETURN; 19340000
|
|
END; 19350000
|
|
IF GT THEN 19360000
|
|
BEGIN SYNTAXERR(7,P); % UNRECOGNIZED CONSTRUCT 19370000
|
|
GO TO RETURN; 19380000
|
|
END; 19390000
|
|
IF PARENCOUNT ! 0 THEN 19400000
|
|
BEGIN SYNTAXERR(10,P); % PAREN COUNT NON-ZERO 19410000
|
|
GO TO RETURN; 19420000
|
|
END; 19430000
|
|
GT ~ TRUE; 19440000
|
|
P ~ P + 1; 19450000
|
|
PSIZE[SP] ~ PTYPE[SP] ~ 0; 19460000
|
|
IF NOT ARF THEN 19470000
|
|
BEGIN FIRSTCHAR.[45:1] ~ 0; % NO REPLACEMENT 19480000
|
|
GO TO CONDENSEPATTERN; 19490000
|
|
END; 19500000
|
|
% REPLACEMENT TO BE CONDENSED 19510000
|
|
CONDENSEREPLACEMENT: 19520000
|
|
% IF INFORM THEN INFORM0(28); 19530000
|
|
FOR I ~ 0 STEP 1 UNTIL SP-1 DO 19540000
|
|
CASE PTYPE[I] OF 19550000
|
|
BEGIN 19560000
|
|
% 0: IGNORE 19570000
|
|
; 19580000
|
|
% 1: STRING NAME 19590000
|
|
; 19600000
|
|
% 2: FUNCTION CALL 19610000
|
|
GO TO ERROR; 19620000
|
|
% 3: LITERAL 19630000
|
|
; 19640000
|
|
% 4: "(" OF GROUPING 19650000
|
|
GO TO ERROR; 19660000
|
|
% 5: STR VAR COMBINED 19670000
|
|
GO TO ERROR; 19680000
|
|
% 6: INDIRECTION 19690000
|
|
IF NOT COMBINEINDIRECTION(I) THEN GO TO RETURN; 19700000
|
|
% 7: ARITH OPERATOR 19710000
|
|
BEGIN 19720000
|
|
IF NOT COMBINEARITHMETIC(I) THEN GO TO RETURN; 19730000
|
|
WHILE I > 0 AND PTYPE[I]!16 DO I ~ I-1; % FIND RESULT 19740000
|
|
IF PTYPE[I] ! 16 THEN GO TO ERROR; 19750000
|
|
INSERTSTRINGCONVERT(I); 19760000
|
|
END; 19770000
|
|
% 8: "/" OF FIXED-LENGTH VAR 19780000
|
|
GO TO ERROR; 19790000
|
|
% 9: STR REF, PATTERN & REPLACEMENT 19800000
|
|
GO TO ERROR; 19810000
|
|
% 10: INDIRECTION COMBINED 19820000
|
|
; 19830000
|
|
% 11: UNUSED 19840000
|
|
GO TO ERROR; 19850000
|
|
% 12: UNUSED 19860000
|
|
GO TO ERROR; 19870000
|
|
% 13: "*" OF STR VAR 19880000
|
|
GO TO ERROR; 19890000
|
|
% 14: GO-TO LABEL 19900000
|
|
GO TO ERROR; 19910000
|
|
% 15: EXPRESSION 19920000
|
|
; 19930000
|
|
% 16: ARITH EXPR--NO STR CONVERT 19940000
|
|
INSERTSTRINGCONVERT(I); 19950000
|
|
% 17: "*(" OF BAL VAR 19960000
|
|
GO TO ERROR; 19970000
|
|
% 18: STR REF & PATTERN 19980000
|
|
IF I ! 0 THEN GO TO ERROR; 19990000
|
|
% 19: COMPLETE ARITH EXPR 20000000
|
|
; 20010000
|
|
% 20: "S(", "F(", OR "(" OF GO-TO PART 20020000
|
|
GO TO ERROR; 20030000
|
|
% 21: COMBINED GO-TO PART 20040000
|
|
GO TO ERROR; 20050000
|
|
END CASES; 20060000
|
|
IF PTYPE[0] = 1 THEN % MARK AS NON-INPUT 20070000
|
|
BEGIN AA ~ "%"; 20080000
|
|
MV(1,AA,7,CODE[PPOINT[0].W],PPOINT[0].C); 20090000
|
|
END ELSE 20100000
|
|
IF PTYPE[0] = 10 THEN 20110000
|
|
BEGIN PTYPE[0] ~ 15; % EXPRESSION 20120000
|
|
PSIZE[0] ~ PSIZE[0] - 1; % DROP "I" 20130000
|
|
END; 20140000
|
|
I1 ~ I2 ~ 0; 20150000
|
|
FOR I ~ 1 STEP 1 UNTIL SP-1 DO IF PTYPE[I]!0 THEN 20160000
|
|
BEGIN 20170000
|
|
MOVE(PSIZE[I],CODE[PPOINT[I].W],PPOINT[I].C,SCRATCH[I2.W],I2.C); 20180000
|
|
I2 ~ I2 + PSIZE[I]; 20190000
|
|
I1 ~ I1 + 1; 20200000
|
|
PTYPE[I] ~ 0; 20210000
|
|
END; 20220000
|
|
PTR ~ PPOINT[0] + PSIZE[0]; 20230000
|
|
FIRSTCHAR.[45:1] ~ 1; % REPLACEMENT EXISTS 20240000
|
|
STORECHARS(I2,SCRATCH[0],0); 20250000
|
|
STORECHARS(1,"~",7); 20260000
|
|
PSIZE[0] ~ PSIZE[0] + I2 + 1; 20270000
|
|
PTYPE[0] ~ 9; % STR REF, PATTERN & REPLACEMENT 20280000
|
|
REPLACEMENT ~ TRUE; 20290000
|
|
SP ~ 0; 20300000
|
|
PBACK[MKS~1] ~ 0; 20310000
|
|
% IF INFORM THEN WRITEINST; 20320000
|
|
GO TO NEXT; 20330000
|
|
END; % CASE FOR GO-TO ":" OR " /" 20340000
|
|
% 10: "-","+",OR "|" 20350000
|
|
GO TO OP; 20360000
|
|
% 11: "," 20370000
|
|
BEGIN 20380000
|
|
IF NOT COMPILINGFCT[PARENCOUNT] THEN 20390000
|
|
BEGIN SYNTAXERR(9,P); % ILLEGAL COMMA 20400000
|
|
GO TO RETURN; 20410000
|
|
END; 20420000
|
|
IF NOT COMBINEGROUP(MKS+1,FALSE) THEN GO TO RETURN; 20430000
|
|
PBACK[MKS+1] ~ (IF PTYPE[MKS]=2 THEN MKS ELSE PBACK[MKS]); 20440000
|
|
MKS ~ SP ~ MKS+1; 20450000
|
|
P ~ P + 1; 20460000
|
|
GO TO NEXT; 20470000
|
|
END; 20480000
|
|
% 12: "/" 20490000
|
|
BEGIN IF SVF AND PARENCOUNT = 0 AND NOT FIXEDLENGTH THEN 20500000
|
|
BEGIN % FIXED-LENGTH VARIABLE SLASH 20510000
|
|
IF PTYPE[MKS] ! 13 THEN 20520000
|
|
BEGIN SYNTAXERR(14,P); 20530000
|
|
GO TO RETURN; 20540000
|
|
END; 20550000
|
|
IF NOT COMBINESTRVARNAME(MKS) THEN GO TO RETURN; 20560000
|
|
PTYPE[SP~MKS+1] ~ 8; % FIXED-LENGTH "/" 20570000
|
|
PPOINT[SP] ~ PTR; 20580000
|
|
PSIZE[SP] ~ 0; 20590000
|
|
P ~ P + 1; 20600000
|
|
FIXEDLENGTH ~ TRUE; 20610000
|
|
PBACK[SP] ~ PBACK[MKS]; 20620000
|
|
MKS ~ SP; 20630000
|
|
GO TO NEXT; 20640000
|
|
END; 20650000
|
|
IF PARENCOUNT = 0 THEN 20660000
|
|
IF CHAR(INST[(P-1).W],(P-1).C) = " " THEN 20670000
|
|
IF I~CHAR(INST[P.W],P.C+1) = "S" OR I = "F" OR I = "(" 20680000
|
|
THEN GO TO GOTO; 20690000
|
|
GO TO OP; 20700000
|
|
END; % CASE FOR "/" 20710000
|
|
% 13: QMARK 20720000
|
|
IF P } INSTSIZE THEN GO TO QMRK; 20730000
|
|
% 14: ";" 20740000
|
|
GO TO SEMICOLON; 20750000
|
|
END CASES; 20760000
|
|
ILLEGAL: 20770000
|
|
SYNTAXERR(3,P); 20780000
|
|
GO TO RETURN; 20790000
|
|
LIT: 20800000
|
|
IF GT THEN IF PARENCOUNT { 1 THEN 20810000
|
|
BEGIN SYNTAXERR(28,P); GO TO RETURN; END; 20820000
|
|
BEGIN 20830000
|
|
PSIZE[SP] ~ 3; PTYPE[SP] ~ 3; % LITERAL 20840000
|
|
T ~ P; 20850000
|
|
P ~ P + SCANCHAR(""",""",INST[P.W],P.C+1) + 1; 20860000
|
|
IF P } INSTSIZE THEN 20870000
|
|
BEGIN SYNTAXERR(0,T); 20880000
|
|
GO TO RETURN; 20890000
|
|
END; 20900000
|
|
T ~ ENTERST(P-T-1,INST[*],T+1,"LIT") & "@"[30:42:6]; 20910000
|
|
STORECHARS(3,T,5); 20920000
|
|
P ~ P + 1; 20930000
|
|
GO TO NEXT; 20940000
|
|
END; 20950000
|
|
NAME: 20960000
|
|
IF GT THEN IF PARENCOUNT = 0 OR PTYPE[SP-1] = 20 THEN GO TO GTPART; 20970000
|
|
PSIZE[SP] ~ 3; 20980000
|
|
T ~ P; 20990000
|
|
DO P ~ P + 1 UNTIL CHARTYPE[CHAR(INST[P.W],P.C)] ! 3; 21000000
|
|
T ~ IF CHAR(INST[P.W],P.C) = "(" 21010000
|
|
THEN ENTERST(P-T,INST[*],T,"FCT") & "#"[30:42:6] 21020000
|
|
ELSE ENTERST(P-T,INST[*],T,"SYMB") & """[30:42:6]; 21030000
|
|
STORECHARS(3,T,5); 21040000
|
|
IF CHAR(INST[P.W],P.C) = "(" THEN 21050000
|
|
BEGIN 21060000
|
|
COMPILINGFCT[PARENCOUNT~PARENCOUNT+1] ~ TRUE; 21070000
|
|
PTR ~ PTR + 1; % MAKE ROOM FOR CHAR GIVING # OF PARAMS 21080000
|
|
P ~ P + 1; 21090000
|
|
PBACK[SP] ~ MKS; 21100000
|
|
MKS ~ SP; 21110000
|
|
PTYPE[SP] ~ 2; % FUNCTION CALL 21120000
|
|
PSIZE[SP] ~ 3; % #-- 21130000
|
|
GO TO NEXT; 21140000
|
|
END ELSE 21150000
|
|
BEGIN PTYPE[SP] ~ 1; % STRING NAME 21160000
|
|
PNAME[SP] ~ TRUE; 21170000
|
|
END; 21180000
|
|
GO TO NEXT; 21190000
|
|
GTPART: 21200000
|
|
IF PARENCOUNT = 0 THEN 21210000
|
|
BEGIN 21220000
|
|
IF (TEMP ~ CHAR(INST[P.W],P.C)) = "S" OR TEMP = "F" THEN 21230000
|
|
IF CHAR(INST[P.W],P.C+1) = "(" THEN 21240000
|
|
BEGIN 21250000
|
|
IF (IF TEMP="S" THEN GTS ELSE GTF) THEN 21260000
|
|
BEGIN SYNTAXERR(4,P); 21270000
|
|
GO TO RETURN; 21280000
|
|
END; 21290000
|
|
P ~ P + 2; 21300000
|
|
PARENCOUNT ~ 1; COMPILINGFCT[1] ~ FALSE; 21310000
|
|
IF TEMP = "S" THEN GTS ~ TRUE ELSE GTF ~ TRUE; 21320000
|
|
PTYPE[SP] ~ 20; % "S(", "F(", OR "(" OF GO-TO PART 21330000
|
|
PBACK[SP] ~ MKS; MKS ~ SP; 21340000
|
|
PST[SP] ~ TEMP; 21350000
|
|
GO TO NEXT; 21360000
|
|
END ELSE 21370000
|
|
BEGIN SYNTAXERR(5,P+1); 21380000
|
|
COMMENT CHAR AFTER S OR F NOT "("; 21390000
|
|
GO TO RETURN; 21400000
|
|
END ELSE 21410000
|
|
IF TEMP = "(" THEN 21420000
|
|
BEGIN 21430000
|
|
IF GTS AND GTF THEN 21440000
|
|
BEGIN SYNTAXERR(4,P); 21450000
|
|
GO TO RETURN; 21460000
|
|
END; 21470000
|
|
P ~ P + 1; 21480000
|
|
PARENCOUNT ~ 1; COMPILINGFCT[1] ~ FALSE; 21490000
|
|
GTS ~ GTF ~ TRUE; 21500000
|
|
PTYPE[SP] ~ 20; % "S(", "F(", OR "(" OF GO-TO PART 21510000
|
|
PBACK[SP] ~ MKS; MKS ~ SP; 21520000
|
|
PST[SP] ~ "("; 21530000
|
|
GO TO NEXT; 21540000
|
|
END ELSE 21550000
|
|
BEGIN SYNTAXERR(7,P); 21560000
|
|
GO TO RETURN; 21570000
|
|
END; 21580000
|
|
END ELSE 21590000
|
|
IF PARENCOUNT = 1 THEN 21600000
|
|
BEGIN 21610000
|
|
T ~ P; P ~ P + 1; 21620000
|
|
P ~ P + MIN(SCANCHAR(" ","(",INST[P.W],P.C), 21630000
|
|
SCANCHAR(" ",")",INST[P.W],P.C)); 21640000
|
|
IF CHAR(INST[P.W],P.C) = "(" THEN 21650000
|
|
BEGIN SYNTAXERR(8,P); 21660000
|
|
GO TO RETURN; 21670000
|
|
END; 21680000
|
|
IF CHAR(INST[P.W],P.C) = " " THEN 21690000
|
|
BEGIN TEMP ~ P; 21700000
|
|
WHILE CHAR(INST[P.W],P.C) = " " DO P ~ P + 1; 21710000
|
|
IF P } INSTSIZE THEN 21720000
|
|
BEGIN SYNTAXERR(18,0); 21730000
|
|
GO TO RETURN; 21740000
|
|
END; 21750000
|
|
IF CHAR(INST[P.W],P.C) ! ")" THEN 21760000
|
|
BEGIN SYNTAXERR(8,P); 21770000
|
|
GO TO RETURN; 21780000
|
|
END; 21790000
|
|
END ELSE TEMP ~ P; 21800000
|
|
IF EQ(3,WORDS[6],2,INST[T.W],T.C) THEN 21810000
|
|
IF T+3 = TEMP THEN 21820000
|
|
BEGIN STORECHARS(2,"-E",6); 21830000
|
|
PSIZE[SP] ~ 2; 21840000
|
|
GO TO L1; 21850000
|
|
END ELSE 21860000
|
|
ELSE 21870000
|
|
IF EQ(6,WORDS[6],6,INST[T.W],T.C) THEN 21880000
|
|
IF T+6 = TEMP THEN 21890000
|
|
BEGIN STORECHARS(2,"-R",6); 21900000
|
|
PSIZE[SP] ~ 2; 21910000
|
|
GO TO L1; 21920000
|
|
END ELSE 21930000
|
|
ELSE 21940000
|
|
IF EQ(7,WORDS[6],5,INST[T.W],T.C) THEN 21950000
|
|
IF T+7 = TEMP THEN 21960000
|
|
BEGIN STORECHARS(2,"-F",6); 21970000
|
|
PSIZE[SP] ~ 2; 21980000
|
|
GO TO L1; 21990000
|
|
END; 22000000
|
|
T ~ ENTERST(TEMP-T,INST[*],T,"INST") & ":"[30:42:6]; 22010000
|
|
STORECHARS(3,T,5); 22020000
|
|
PSIZE[SP] ~ 3; 22030000
|
|
L1: PTYPE[SP] ~ 14; % IDENTIFIER--LABEL 22040000
|
|
GO TO NEXT; 22050000
|
|
END; 22060000
|
|
GO TO ERROR; 22070000
|
|
STR: % "*" ENCOUNTERED--TEST FOR STRING VARIABLE OR MULTIPLY. 22080000
|
|
% AN ASTERISK IS A STRING VARIABLE ASTERISK IFF IT IS IN THE 22090000
|
|
% PATTERN PART AND OUTSIDE OF PARENTHESES. 22100000
|
|
BEGIN 22110000
|
|
DEFINE DUMMY=#; 22120000
|
|
IF SP < 1 THEN 22130000
|
|
BEGIN SYNTAXERR(2,P); % UNRECOGNIZED CONSTRUCT IN STR REF 22140000
|
|
GO TO RETURN; 22150000
|
|
END; 22160000
|
|
IF PARENCOUNT > 0 THEN GO TO OP; 22170000
|
|
IF ARF AND NOT GT THEN GO TO OP; 22180000
|
|
IF SVF THEN GO TO ENDSTRVAR; 22190000
|
|
IF GT THEN 22200000
|
|
BEGIN SYNTAXERR(3,P); 22210000
|
|
GO TO RETURN; 22220000
|
|
END; 22230000
|
|
IF CHAR(INST[P.W],P.C+1) = "(" THEN 22240000
|
|
BEGIN PTYPE[SP] ~ 17; % "*(" OF BAL STR VAR 22250000
|
|
PARENCOUNT ~ 1; 22260000
|
|
P ~ P + 2; 22270000
|
|
END ELSE 22280000
|
|
BEGIN PTYPE[SP] ~ 13; % "*" OF ARB OR F/L STR VAR 22290000
|
|
P ~ P + 1; 22300000
|
|
END; 22310000
|
|
PSIZE[SP] ~ 0; 22320000
|
|
PTR ~ PTR + 2; % FOR *N 22330000
|
|
PBACK[SP] ~ MKS; 22340000
|
|
MKS ~ SP; 22350000
|
|
SVF ~ TRUE; 22360000
|
|
GO TO NEXT; 22370000
|
|
END; 22380000
|
|
ENDSTRVAR: 22390000
|
|
BEGIN 22400000
|
|
IF I~PTYPE[MKS] = 13 THEN % SIMPLE STR VAR 22410000
|
|
BEGIN 22420000
|
|
IF NOT COMBINESTRVARNAME(MKS) THEN GO TO RETURN; 22430000
|
|
AA ~ "*1"; 22440000
|
|
END ELSE 22450000
|
|
IF I = 17 THEN % BALANCED STR VAR 22460000
|
|
BEGIN 22470000
|
|
IF NOT COMBINESTRVARNAME(MKS) THEN GO TO RETURN; 22480000
|
|
AA ~ "*2"; 22490000
|
|
END ELSE 22500000
|
|
IF I = 8 THEN % FIXED-LENGTH VAR 22510000
|
|
BEGIN PTYPE[MKS] ~ 0; 22520000
|
|
IF NOT COMBINEGROUP(MKS,FALSE) THEN GO TO RETURN; 22530000
|
|
AA ~ "*3"; 22540000
|
|
END ELSE 22550000
|
|
% ERROR--MKS DOESNT POINT TO VALID ELEMENT 22560000
|
|
GO TO ERROR; 22570000
|
|
PTR ~ PPOINT[MKS] + PSIZE[MKS]; 22580000
|
|
STORECHARS(2,AA,6); 22590000
|
|
PSIZE[SP~MKS] ~ PSIZE[MKS] + 2; 22600000
|
|
PTYPE[SP] ~ 5; % STR VAR--COMBINED 22610000
|
|
P ~ P + 1; % SKIP "*" 22620000
|
|
SVF ~ FIXEDLENGTH ~ FALSE; 22630000
|
|
GO TO NEXT; 22640000
|
|
END; 22650000
|
|
OP: 22660000
|
|
I ~ CHAR(INST[P.W],P.C); 22670000
|
|
IF I = "*" THEN 22680000
|
|
IF CHAR(INST[P.W],P.C+1) = "*" 22690000
|
|
THEN P ~ P + 1 % TWO START--EXPONENTIATION 22700000
|
|
ELSE I ~ "|"; % ONE STAR--MULTIPLICATION 22710000
|
|
PST[SP] ~ I; % FOR COMBINEARITHMETIC 22720000
|
|
I.C6 ~ "."; 22730000
|
|
PTYPE[SP] ~ 7; 22740000
|
|
PBACK[SP] ~ MKS; 22750000
|
|
PSIZE[SP] ~ 2; 22760000
|
|
STORECHARS(2,I,6); 22770000
|
|
PTR ~ PTR + 2; % MAKE ROOM FOR STRING CONVERT (2 CHARS). 22780000
|
|
P ~ P + 1; 22790000
|
|
GO TO NEXT; 22800000
|
|
PARENERR: 22810000
|
|
SYNTAXERR(12,P); 22820000
|
|
GO TO RETURN; 22830000
|
|
ERROR: 22840000
|
|
WRITEINST; 22850000
|
|
SYNTAXERR(40,0); 22860000
|
|
WRITESTACK(SP); 22870000
|
|
GO TO RETURN; 22880000
|
|
DLR: 22890000
|
|
I ~ 1; 22900000
|
|
DO BEGIN P ~ P + 1; 22910000
|
|
IF J ~ CHAR(INST[P.W],P.C) = "$" THEN I ~ I + 1; 22920000
|
|
END UNTIL J ! "$" AND J ! " "; 22930000
|
|
AA ~ "$-I" & I[36:42:6]; 22940000
|
|
STORECHARS(3,AA,5); % "$", NO. OF INDIRECTIONS, "I" 22950000
|
|
PTYPE[SP] ~ 6; % INDIRECTION 22960000
|
|
PSIZE[SP] ~ 2; 22970000
|
|
GO TO NEXT; 22980000
|
|
MESFIL: 22990000
|
|
SYNTAXERR(38,0); 23000000
|
|
COMMENT MISSING STR VAR ASTERISK; 23010000
|
|
GO TO RETURN; 23020000
|
|
SEMICOLON: 23030000
|
|
BEGIN 23040000
|
|
% IF INFORM THEN INFORM0(29); 23050000
|
|
IF SP > 1 THEN GO TO QMRK; 23060000
|
|
IF ARF THEN IF NOT GT THEN IF SP=1 THEN IF PTYPE[0]!9 23070000
|
|
THEN STORECHARS(1,"~",7); % STMT OF FORM <STRREF> ~ 23080000
|
|
IF NOT GTS THEN SLOC ~ PTR; 23090000
|
|
IF NOT GTF THEN FLOC ~ PTR; 23100000
|
|
TEMP ~ FLOC & SLOC[24:36:12]; 23110000
|
|
MOVE(4,TEMP,4,CODE[MARKER.W],MARKER.C+3); 23120000
|
|
INSTNUM ~ INSTNUM + 1; 23130000
|
|
MARKER ~ PTR; 23140000
|
|
AA ~ 0 & INSTNUM[12:36:12] & QMARK[6:42:6]; 23150000
|
|
STORECHARS(7,AA,1); 23160000
|
|
PTR ~ PTR + 1; 23170000
|
|
GO TO START; 23180000
|
|
END; 23190000
|
|
QMRK: 23200000
|
|
IF PARENCOUNT ! 0 THEN 23210000
|
|
BEGIN SYNTAXERR(18,0); 23220000
|
|
COMMENT PARENCOUNT NON-ZERO AT END OF INSTRUCTION; 23230000
|
|
GO TO RETURN; 23240000
|
|
END; 23250000
|
|
IF SVF THEN GO TO MESFIL; 23260000
|
|
PTYPE[SP] ~ PSIZE[SP] ~ 0; 23270000
|
|
IF NOT GT THEN 23280000
|
|
BEGIN 23290000
|
|
IF NOT ARF THEN IF PTYPE[0]!18 THEN IF SP>1 23300000
|
|
THEN GO TO CONDENSEPATTERN; 23310000
|
|
IF ARF THEN IF NOT GT THEN IF PTYPE[0] ! 9 23320000
|
|
THEN GO TO CONDENSEREPLACEMENT; 23330000
|
|
END; 23340000
|
|
I1 ~ 0; 23350000
|
|
PTR ~ PPOINT[0]; 23360000
|
|
SLOC ~ FLOC ~ 0; 23370000
|
|
FOR I ~ 0 STEP 1 UNTIL SP DO IF PTYPE[I] ! 0 THEN 23380000
|
|
BEGIN 23390000
|
|
MOVE(PSIZE[I],CODE[PPOINT[I].W],PPOINT[I].C,SCRATCH[I1.W],I1.C); 23400000
|
|
IF PTYPE[I] = 21 THEN % GO-TO PART--CHECK LOCS 23410000
|
|
IF I2~PST[I] = "S" THEN SLOC ~ PTR+I1 ELSE 23420000
|
|
IF I2 = "F" THEN FLOC ~ PTR+I1 ELSE 23430000
|
|
IF I2 = "(" THEN 23440000
|
|
BEGIN 23450000
|
|
IF SLOC = 0 THEN SLOC ~ PTR + I1; 23460000
|
|
IF FLOC = 0 THEN FLOC ~ PTR + I1; 23470000
|
|
END ELSE GO TO ERROR; 23480000
|
|
I1 ~ I1 + PSIZE[I]; 23490000
|
|
PTYPE[I] ~ 0; 23500000
|
|
END; 23510000
|
|
STORECHARS(I1,SCRATCH[0],0); 23520000
|
|
PSIZE[0] ~ I1; 23530000
|
|
IF P < INSTSIZE THEN 23540000
|
|
BEGIN SP ~ 1; 23550000
|
|
GO TO SEMICOLON; 23560000
|
|
END; 23570000
|
|
IF NOT GTS THEN SLOC ~ PTR; 23580000
|
|
IF NOT GTF THEN FLOC ~ PTR; 23590000
|
|
RETURN: 23600000
|
|
MV(2,SLOC,6,CODE[MARKER.W],MARKER.C+3); 23610000
|
|
MV(2,FLOC,6,CODE[MARKER.W],MARKER.C+5); 23620000
|
|
MV(1,FIRSTCHAR,7,CODE[MARKER.W],MARKER.C+7); 23630000
|
|
IF INFORM THEN WRITEINST; 23640000
|
|
END COMPILE; 23650000
|
|
%********COMPILE********************************************************23660000
|
|
%********CONTROLPARAMETER***********************************************23670000
|
|
INTEGER PROCEDURE CONTROLPARAMETER(A,P); 23680000
|
|
ALPHA ARRAY A[*]; 23690000
|
|
INTEGER P; 23700000
|
|
BEGIN DEFINE DUMMY =#; 23710000
|
|
I1 ~ P; 23720000
|
|
WHILE CHAR(A[*],I1) > 9 AND I1 < 64 DO I1 ~ I1 + 1; 23730000
|
|
P ~ I1; 23740000
|
|
WHILE CHAR(A[*],P) { 9 AND P < 64 DO P ~ P + 1; 23750000
|
|
IF I1 } P THEN I1 ~ -1 ELSE 23760000
|
|
READ(A[*],FNUM,I1,P-I1,I1); 23770000
|
|
CONTROLPARAMETER ~ I1; 23780000
|
|
END CONTROLPARAMETER; 23790000
|
|
%********CONTROLPARAMETER***********************************************23800000
|
|
%********CONVERT********************************************************23810000
|
|
% THIS ROUTINE DOES A CHARACTER-SET CONVERT, AND (IF CONVERTSTRINGS 23820000
|
|
% IS TRUE) A CONVERSION OF I/O STRING NAMES. IT IS CURRENTLY SET 23830000
|
|
% TO CONVERT FROM CDC 3600 SNOBOL (AS IMPLEMENTED AT THE UNIV. OF 23840000
|
|
% WISCONSIN) TO B5500 SNOBOL. USERS AT OTHER INSTALLATIONS WILL 23850000
|
|
% PROBABLY WANT TO WRITE THEIR OWN ROUTINE, TO CONVERT FROM A 23860000
|
|
% LOCAL VERSION OF SNOBOL TO B5500 SNOBOL. 23870000
|
|
PROCEDURE CONVERT(A); 23880000
|
|
ALPHA ARRAY A[0]; 23890000
|
|
BEGIN INTEGER I; 23900000
|
|
ALPHA ARRAY C[0:79]; 23910000
|
|
DEFINE D = C[I]#, D1 = C[I+1]#, D2 = C[I+2]#, 23920000
|
|
D3 = C[I+3]#, D4 = C[I+4]#, D5 = C[I+5]#; 23930000
|
|
READ(A[*],F80A1,FOR I ~ 0 STEP 1 UNTIL 79 DO C[I]); 23940000
|
|
IF CONVERTSTRINGS THEN 23950000
|
|
FOR I ~ 1 STEP 1 UNTIL FIELDSIZE-6 DO 23960000
|
|
IF D = "S" AND D1 = "Y" AND D2 = "S" THEN 23970000
|
|
IF D3 = "L" AND D4 = "O" AND D5 = "K" THEN % SYSLOK : LOOK 23980000
|
|
BEGIN D ~ "L"; D1 ~ "O"; D2 ~ "O"; D3 ~ "K"; D4 ~ D5 ~ " "; 23990000
|
|
END ELSE IF D3 = "P" AND D5 = "T" THEN 24000000
|
|
IF D4 = "I" THEN % SYSPIT : READ 24010000
|
|
BEGIN D ~ "R"; D1 ~ "E"; D2 ~ "A"; D3 ~ "D"; D4 ~ D5 ~ " "; 24020000
|
|
END ELSE IF D4 = "P" THEN % SYSPPT : PUNCH 24030000
|
|
BEGIN D ~ "P"; D1 ~ "U"; D2 ~ "N"; D3 ~ "C"; D4 ~ "H"; D5 ~ " "; 24040000
|
|
END; 24050000
|
|
FOR I ~ 0 STEP 1 UNTIL 79 DO 24060000
|
|
C[I] ~ CONVERTVAL[C[I]]; 24070000
|
|
WRITE(A[*],F80A1,FOR I~0 STEP 1 UNTIL 79 DO C[I]); 24080000
|
|
END CONVERT; 24090000
|
|
%********CONVERT********************************************************24100000
|
|
%********CREATELIBRARY**************************************************24110000
|
|
PROCEDURE CREATELIBRARY(MFID,FID); 24120000
|
|
VALUE MFID, FID; 24130000
|
|
ALPHA MFID, FID; 24140000
|
|
BEGIN INTEGER I, J; 24150000
|
|
ALPHA ARRAY X[0:5]; 24160000
|
|
SAVE FILE LIBE DISK SERIAL [20:200] (15,6,60,SAVE 15); 24170000
|
|
% 24180000
|
|
FILL LIBE WITH MFID, FID; 24190000
|
|
WRITE(LIBE,FLIB0,ENTIER(VERSION)); 24200000
|
|
WRITE(LIBE,FLIB1,SCATTERNO,MAXINSTSIZE, 24210000
|
|
CPULIMITEXISTS,CPULIMIT, 24220000
|
|
IOLIMITEXISTS,IOLIMIT, 24230000
|
|
RULELIMITEXISTS,RULELIMIT); 24240000
|
|
WRITE(LIBE,FLIB2,ENTRY,FOR I~0 STEP 1 UNTIL 15 DO USEDST[I],INSTNUM); 24250000
|
|
WRITE(LIBE,FLIB3,FOR I~0 STEP 1 UNTIL 15 DO NEXTCELL[I]); 24260000
|
|
FOR I ~ 0 STEP 1 UNTIL 15 DO 24270000
|
|
IF USEDST[I] THEN 24280000
|
|
FOR J ~ 0 STEP 2 UNTIL 254 DO 24290000
|
|
WRITE(LIBE,FLIB4,NAMTABL[I,J],VALTABL[I,J],IOTABL[I,J], 24300000
|
|
NAMTABL[I,J+1],VALTABL[I,J+1],IOTABL[I,J+1]); 24310000
|
|
WRITE(LIBE,FLIB5,FOR I~0 STEP 1 UNTIL 31 DO USEDROW[I]); 24320000
|
|
WRITE(LIBE,FLIB6,FOR I~0 STEP 1 UNTIL 31 DO DPNTR[I]); 24330000
|
|
FOR I ~ 0 STEP 1 WHILE USEDROW[I] DO 24340000
|
|
FOR J ~ 0 STEP 6 UNTIL DPNTR[I].W DO 24350000
|
|
BEGIN MOVEWDS(6,DATA[I,J],X[*]); 24360000
|
|
WRITE(LIBE,6,X[*]); 24370000
|
|
END; 24380000
|
|
LOCK(LIBE,SAVE); 24390000
|
|
END CREATELIBRARY; 24400000
|
|
%********CREATELIBRARY**************************************************24410000
|
|
%********DATE***********************************************************24420000
|
|
ALPHA PROCEDURE DATE; 24430000
|
|
BEGIN % PRODUCES DATE IN FORM: 24440000
|
|
% MM/DD/YY 24450000
|
|
ALPHA X; 24460000
|
|
INTEGER D, M, Y; 24470000
|
|
STREAM PROCEDURE ALPHADATE(D,M,Y,W); 24480000
|
|
VALUE D, M, Y; 24490000
|
|
BEGIN DI ~ W; 24500000
|
|
SI ~ LOC M; DS ~ 2 DEC; DS ~ 1 LIT "/"; 24510000
|
|
SI ~ LOC D; DS ~ 2 DEC; DS ~ 1 LIT "/"; 24520000
|
|
SI ~ LOC Y; DS ~ 2 DEC; 24530000
|
|
END ALPHADATE; 24540000
|
|
% 24550000
|
|
X ~ TIME(0); 24560000
|
|
Y ~ 10 | X.[18:6] + X.[24:6]; 24570000
|
|
X ~ 100 | X.[30:6] + 10 | X.[36:6] + X.[42:6]; 24580000
|
|
M ~ 0; 24590000
|
|
WHILE X > 0 DO 24600000
|
|
BEGIN M ~ M + 1; 24610000
|
|
X ~ X - MONTHS[M]; 24620000
|
|
END; 24630000
|
|
D ~ X + MONTHS[M]; 24640000
|
|
ALPHADATE(D,M,Y,X); 24650000
|
|
DATE ~ X; 24660000
|
|
END DATE; 24670000
|
|
%********DATE***********************************************************24680000
|
|
%********DEBUG**********************************************************24690000
|
|
% THIS IS THE CENTRAL CONTROL ROUTINE FOR THE INTERACTIVE 24700000
|
|
% DEBUGGING TOOL. 24710000
|
|
PROCEDURE DEBUG(RETURNLABEL); 24720000
|
|
VALUE RETURNLABEL; 24730000
|
|
LABEL RETURNLABEL; 24740000
|
|
BEGIN INTEGER I, J, K, L, SAVEUSER; 24750000
|
|
BOOLEAN NEWINST; 24760000
|
|
DEFINE NUMCOMMANDS= 7 #; 24770000
|
|
ALPHA ARRAY COMMAND[0:NUMCOMMANDS]; 24780000
|
|
SWITCH FORMAT FDBUG ~ 24790000
|
|
("{!STATEMENT ",I*,"~"), %0024800000
|
|
("{!",I*," STATEMENTS EXECUTED~"), %0124810000
|
|
("{!LAST LABEL: ",X*,"~"), %0224820000
|
|
("{!AT LABEL: ",X*,"~"), %0324830000
|
|
("{!TYPE REQUESTS...{!~"), %0424840000
|
|
("{!LEVEL = ",I*,"{!~"), %0524850000
|
|
("{!",X*," NOT DEFINED{!~"), %0624860000
|
|
("{!",X*," NOT IN USE{!~"), %0724870000
|
|
("{!UNRECOGNIZED COMMAND{!~"), %0824880000
|
|
("{!OK{!~"), %0924890000
|
|
("{!",X*," EXECUTED ",I*," TIMES{!~"), %1024900000
|
|
("{!",X*," = ","""), %1124910000
|
|
("{!TOO MANY LABELS.{!~"), %1224920000
|
|
("{!SUSPENDED{!~"), %1324930000
|
|
("{!!END FORMAT--FDBUG{!!~",(O)); 24940000
|
|
SWITCH FORMAT FSUSPENDREASON ~ 24950000
|
|
("{!SUSPEND CALLED{!~"), %0024960000
|
|
("{!RULE LIMIT HIT{!~"), %0124970000
|
|
("{!LABEL LIMIT HIT{!~"), %0224980000
|
|
("{!FATAL ERROR{!~"), %0324990000
|
|
("{!END FMT--FSUSRSN{!~"); 25000000
|
|
LABEL 25010000
|
|
GETCOMMAND, 25020000
|
|
GET1, 25030000
|
|
FAIL, 25040000
|
|
ILLEGAL, 25050000
|
|
RESUME, 25060000
|
|
RUNLOOP; 25070000
|
|
% 25080000
|
|
SAVEUSER ~ USER; 25090000
|
|
USER ~ MAINUSER; 25100000
|
|
NEWINST ~ FALSE; 25110000
|
|
DEBUGGING ~ TRUE; 25120000
|
|
FILL COMMAND[*] WITH 25130000
|
|
"END", 25140000
|
|
"TYPE", 25150000
|
|
"SET", 25160000
|
|
"RUN", 25170000
|
|
"LABEL", 25180000
|
|
"ABORT", 25190000
|
|
"WHERE", 25200000
|
|
"WHY", 25210000
|
|
0; 25220000
|
|
WRITE(DCWRITE[*],FDBUG[13]); 25230000
|
|
IF OUTPUT THEN; 25240000
|
|
GETCOMMAND: 25250000
|
|
IF NOT INPUT THEN GO TO FAIL; 25260000
|
|
GET1: 25270000
|
|
MV(1,ARROW,7,DCREAD[DCSIZE.W],DCSIZE.C); 25280000
|
|
% IF INFORM THEN WRITE(PRINT,10,DCREAD[*]); 25290000
|
|
IF CHAR(DCREAD[*],0) = "-" THEN % CONTROL CARD: 25300000
|
|
BEGIN INSTSIZE ~ DCSIZE; 25310000
|
|
MV(3,STOPPER,5,DCREAD[DCSIZE.W],DCSIZE.C); 25320000
|
|
PROCESSCONTROLCARD(DCREAD[*]); 25330000
|
|
MV(3,CRLF,5,DCWRITE[*],0); 25340000
|
|
IF OUTPUT THEN; 25350000
|
|
GO TO GETCOMMAND; 25360000
|
|
END; 25370000
|
|
I ~ SKIPCHAR(" ",DCREAD[*],0); 25380000
|
|
% EDIT ROUTINES GO HERE SOMETIME... 25390000
|
|
J ~ I + SCANCHAR(" ","~",DCREAD[*],I); 25400000
|
|
AA ~ 0; 25410000
|
|
IF J-I > 5 THEN GO TO ILLEGAL; 25420000
|
|
MV(J-I,DCREAD[*],I,AA,8-J+I); 25430000
|
|
FOR I ~ NUMCOMMANDS STEP -1 UNTIL 0 DO 25440000
|
|
IF AA = COMMAND[I] THEN CASE I OF 25450000
|
|
BEGIN % CODE FOR VARIOUS COMMANDS: 25460000
|
|
%*************************************** 25470000
|
|
% 0: END~ 25480000
|
|
BEGIN RESULT ~ TRUE; 25490000
|
|
GO TO ENDTERPRET; 25500000
|
|
END; 25510000
|
|
% 1: TYPE <NAME>~ 25520000
|
|
BEGIN 25530000
|
|
IF (AA~SEARCHST(I~(DCSIZE-J-1),DCREAD[*],J+1,"SYMB")) { 0 THEN 25540000
|
|
BEGIN WRITE(DCWRITE[*],FDBUG[7],I~MIN(I,63)); 25550000
|
|
MV(I,DCREAD[*],J+1,DCWRITE[*],2); 25560000
|
|
IF OUTPUT THEN; 25570000
|
|
GO TO GETCOMMAND; 25580000
|
|
END; 25590000
|
|
AB ~ NAME[AA]; 25600000
|
|
AC ~ VALU[AA]; 25610000
|
|
WRITE(DCWRITE[*],FDBUG[11],I~MIN(I,63)); 25620000
|
|
MV(I,DCREAD[*],J+1,DCWRITE[*],2); 25630000
|
|
I ~ I + 6; K ~ AC.CH; 25640000
|
|
MV(J~MIN(70-I,L~AC.S),FIRSTCHAR(AC),DCWRITE[I.W],I.C); 25650000
|
|
MV(1,ARROW,7,DCWRITE[(I+J).W],(I+J).C); 25660000
|
|
WHILE I + J } 70 DO 25670000
|
|
BEGIN IF NOT OUTPUT THEN GO TO GETCOMMAND; 25680000
|
|
K ~ K + J; 25690000
|
|
L ~ L - J; 25700000
|
|
MV(I~2,CRLF,5,DCWRITE[*],0); 25710000
|
|
MOVE(J~MIN(70-I,L),DATA[AC.R,K.W],K.C,DCWRITE[*],2); 25720000
|
|
END; 25730000
|
|
MV(1,QUOTE,7,DCWRITE[(I~I+J).W],I.C); 25740000
|
|
MV(3,CRLF,5,DCWRITE[I.W],I.C+1); 25750000
|
|
IF OUTPUT THEN; 25760000
|
|
GO TO GETCOMMAND; 25770000
|
|
END TYPE; 25780000
|
|
% 2: SET <NAME>~ <VALUE>~ 25790000
|
|
BEGIN 25800000
|
|
AA ~ ENTERST(DCSIZE-J-1,DCREAD[*],J+1,"SYMB"); 25810000
|
|
MV(3,CRLF,5,DCWRITE[*],0); IF OUTPUT THEN; 25820000
|
|
IF NOT INPUT THEN GO TO FAIL; 25830000
|
|
AB ~ STRING(DCSIZE,AA); 25840000
|
|
IF DEATH THEN GO TO ENDTERPRET; 25850000
|
|
MOVE(DCSIZE,DCREAD[*],0,FIRSTCHAR(AB)); 25860000
|
|
VALU[AA].LOC ~ AB; 25870000
|
|
MV(3,CRLF,5,DCWRITE[*],0); IF OUTPUT THEN; 25880000
|
|
GO TO GETCOMMAND; 25890000
|
|
END SET; 25900000
|
|
% 3: RUN <LIMIT> FROM <LABEL> TO <LABEL> <LABEL> <LABEL> ...~ 25910000
|
|
BEGIN 25920000
|
|
I1 ~ NLABELLIMIT; % SAVE IN CASE OF "TO~". 25930000
|
|
NLABELLIMIT ~ -1; % -1 MEANS NO TO-PART FOUND YET. 25940000
|
|
DEBUGRULELIMITEXISTS ~ NEWINST ~ FALSE; 25950000
|
|
RUNLOOP: 25960000
|
|
J ~ J + SKIPCHAR(" ",DCREAD[J.W],J.C); 25970000
|
|
IF I2 ~ CHAR(DCREAD[J.W],J.C) = "~" THEN GO TO RESUME; 25980000
|
|
IF I2 { 9 THEN % <INTEGER> 25990000
|
|
BEGIN 26000000
|
|
IF DEBUGRULELIMITEXISTS THEN % TWO OF THEM--ERROR 26010000
|
|
BEGIN WRITE(DCWRITE[*],FEH,QMARK); 26020000
|
|
IF OUTPUT THEN; 26030000
|
|
GO TO GETCOMMAND; 26040000
|
|
END; 26050000
|
|
I ~ 0; % FOR BUILDING LIMIT 26060000
|
|
DO BEGIN I ~ I|10 + I2; 26070000
|
|
J ~ J + 1; 26080000
|
|
END UNTIL I2~CHAR(DCREAD[J.W],J.C) > 9; 26090000
|
|
DEBUGRULELIMITEXISTS ~ TRUE; 26100000
|
|
DEBUGRULELIMIT ~ RULES[0] + I; 26110000
|
|
GO TO RUNLOOP; 26120000
|
|
END; 26130000
|
|
IF (I~MNEMNO(1,DCREAD[*],J)) = 1 THEN 26140000
|
|
BEGIN % FROM <LABEL> 26150000
|
|
IF NEWINST THEN % TWO OF THEM--ERROR 26160000
|
|
BEGIN WRITE(DCWRITE[*],FEH,QMARK); 26170000
|
|
IF OUTPUT THEN; 26180000
|
|
GO TO GETCOMMAND; 26190000
|
|
END; 26200000
|
|
J ~ J + SKIPCHAR(" ",DCREAD[J.W],J.C); 26210000
|
|
I ~ SCANCHAR(" ","~",DCREAD[J.W],J.C); 26220000
|
|
IF I { 0 THEN GO TO ILLEGAL; 26230000
|
|
AA ~ SEARCHST(I,DCREAD[*],J,"INST"); 26240000
|
|
IF (AB~VALU[AA]).S { 9 THEN % NO SUCH LABEL: 26250000
|
|
BEGIN WRITE(DCWRITE[*],FDBUG[6],K~MIN(63,I)); 26260000
|
|
MV(K,DCREAD[J.W],J.C,DCWRITE[*],2); 26270000
|
|
IF OUTPUT THEN; 26280000
|
|
GO TO GETCOMMAND; 26290000
|
|
END; 26300000
|
|
NEWINST ~ TRUE; 26310000
|
|
PST[0] ~ AA; 26320000
|
|
J ~ J + I; 26330000
|
|
GO TO RUNLOOP; 26340000
|
|
END; 26350000
|
|
IF I = 2 THEN 26360000
|
|
BEGIN % TO <LABEL> <LABEL> <LABEL> ...~ 26370000
|
|
J ~ J + SKIPCHAR(" ",DCREAD[J.W],J.C); 26380000
|
|
IF CHAR(DCREAD[J.W],J.C) = "~" THEN 26390000
|
|
BEGIN % TO~ (SAME LIMITS AS LAST TIME) 26400000
|
|
NLABELLIMIT ~ I1; 26410000
|
|
GO TO RESUME; 26420000
|
|
END; 26430000
|
|
DO BEGIN % FIND LABELS: 26440000
|
|
I ~ SCANCHAR(" ","~",DCREAD[J.W],J.C); 26450000
|
|
IF I > 0 THEN % LABEL FOUND 26460000
|
|
BEGIN 26470000
|
|
IF (NLABELLIMIT~NLABELLIMIT+1) > MAXLABELLIMIT THEN 26480000
|
|
BEGIN % TOO MANY LABELS: 26490000
|
|
WRITE(DCWRITE[*],FDBUG[12]); 26500000
|
|
IF OUTPUT THEN; 26510000
|
|
GO TO GETCOMMAND; 26520000
|
|
END; 26530000
|
|
IF LABELLIMIT[NLABELLIMIT]~SEARCHST(I,DCREAD[*],J,"INST") 26540000
|
|
{ 0 THEN % NO SUCH LABEL: 26550000
|
|
BEGIN WRITE(DCWRITE[*],FDBUG[6],K~MIN(63,I)); 26560000
|
|
MV(K,DCREAD[J.W],J.C,DCWRITE[*],2); 26570000
|
|
IF OUTPUT THEN; 26580000
|
|
GO TO GETCOMMAND; 26590000
|
|
END; 26600000
|
|
J ~ J + I + SKIPCHAR(" ",DCREAD[(J+I).W],(J+I).C); 26610000
|
|
END; 26620000
|
|
END UNTIL CHAR(DCREAD[J.W],J.C) = "~"; 26630000
|
|
GO TO RESUME; 26640000
|
|
END; 26650000
|
|
% FALL THROUGH: INVALID DELIMITER: 26660000
|
|
GO TO ILLEGAL; 26670000
|
|
END RUN; 26680000
|
|
% 4: LABEL <LABEL>~ 26690000
|
|
BEGIN 26700000
|
|
IF (AA~SEARCHST(I~(DCSIZE-J-1),DCREAD[*],J+1,"INST")) { 0 26710000
|
|
THEN WRITE(DCWRITE[*],FDBUG[6],I~MIN(I,63)) 26720000
|
|
ELSE WRITE(DCWRITE[*],FDBUG[10],I~MIN(I,63), 26730000
|
|
DIGITS(K~VALU[AA].LINK),K); 26740000
|
|
MV(I,DCREAD[*],J+1,DCWRITE[*],2); 26750000
|
|
IF OUTPUT THEN; 26760000
|
|
GO TO GETCOMMAND; 26770000
|
|
END LABEL; 26780000
|
|
% 5: ABORT ~ 26790000
|
|
BEGIN RESULT ~ FALSE; 26800000
|
|
GO TO ENDTERPRET; 26810000
|
|
END ABORT; 26820000
|
|
% 6: WHERE~ GIVES PLACE OF SUSPENSION. 26830000
|
|
BEGIN 26840000
|
|
% TYPE STATEMENT NUMBER: 26850000
|
|
WRITE(DCWRITE[*],FDBUG[0],DIGITS(INSTNO),INSTNO); 26860000
|
|
IF NOT OUTPUT THEN GO TO GETCOMMAND; 26870000
|
|
% TYPE NUMBER OF RULES EXECUTED. 26880000
|
|
WRITE(DCWRITE[*],FDBUG[1],DIGITS(RULES[0]),RULES[0]); 26890000
|
|
IF NOT OUTPUT THEN GO TO GETCOMMAND; 26900000
|
|
% LAST LABEL: 26910000
|
|
AA ~ NAME[ENTRY]; 26920000
|
|
J ~ MIN(AA.S,63); 26930000
|
|
IF INSTRUCT > 0 OR NEARPOINT > 9 THEN 26940000
|
|
BEGIN WRITE(DCWRITE[*],FDBUG[2],J); 26950000
|
|
I ~ 14; 26960000
|
|
END ELSE 26970000
|
|
BEGIN WRITE(DCWRITE[*],FDBUG[3],J); 26980000
|
|
I ~ 12; 26990000
|
|
END; 27000000
|
|
MV(J,FIRSTCHAR(AA),DCWRITE[*],I); 27010000
|
|
IF NOT OUTPUT THEN GO TO GETCOMMAND; 27020000
|
|
% TYPE LEVEL: 27030000
|
|
WRITE(DCWRITE[*],FDBUG[5],DIGITS(LEVEL),LEVEL); 27040000
|
|
IF OUTPUT THEN; 27050000
|
|
GO TO GETCOMMAND; 27060000
|
|
END; 27070000
|
|
% 7: WHY~ GIVES REASONS FOR SUSPENSION. 27080000
|
|
BEGIN 27090000
|
|
FOR I ~ 0 STEP 1 UNTIL MAXSUSPENDREASON DO 27100000
|
|
IF SUSPENDREASON[I] THEN 27110000
|
|
BEGIN WRITE(DCWRITE[*],FSUSPENDREASON[I]); 27120000
|
|
IF NOT OUTPUT THEN GO TO GETCOMMAND; 27130000
|
|
END; 27140000
|
|
GO TO GETCOMMAND; 27150000
|
|
END; 27160000
|
|
%************************************** 27170000
|
|
END COMMAND CASES; 27180000
|
|
ILLEGAL: 27190000
|
|
WRITE(DCWRITE[*],FDBUG[8]); 27200000
|
|
IF OUTPUT THEN; 27210000
|
|
GO TO GETCOMMAND; 27220000
|
|
FAIL: 27230000
|
|
IF INPUT THEN GO TO GET1; 27240000
|
|
DEBUGRULELIMITEXISTS ~ FALSE; 27250000
|
|
RESUME: 27260000
|
|
WRITE(DCWRITE[*],FDBUG[9]); 27270000
|
|
IF OUTPUT THEN; 27280000
|
|
SETLIMITFLAG; 27290000
|
|
USER ~ SAVEUSER; 27300000
|
|
FOR I ~ 0 STEP 1 UNTIL MAXSUSPENDREASON DO SUSPENDREASON[I] ~ FALSE; 27310000
|
|
IF NEWINST THEN GO TO RETURNLABEL; 27320000
|
|
AA ~ PST[0]; 27330000
|
|
% AA CONTAINS THE SYMBOL TABLE ADDRESS OF THE NEXT INST. 27340000
|
|
END DEBUG; 27350000
|
|
%********DEBUG**********************************************************27360000
|
|
%********DIGITS*********************************************************27370000
|
|
INTEGER PROCEDURE DIGITS(N); 27380000
|
|
VALUE N; 27390000
|
|
REAL N; 27400000
|
|
BEGIN INTEGER D; 27410000
|
|
D ~ IF N > 0 THEN 0 ELSE 1; 27420000
|
|
N ~ ENTIER(ABS(N)); 27430000
|
|
WHILE N > 0 DO 27440000
|
|
BEGIN D ~ D + 1; 27450000
|
|
N ~ ENTIER(N DIV 10); 27460000
|
|
END; 27470000
|
|
DIGITS ~ D; 27480000
|
|
END DIGITS; 27490000
|
|
%********DIGITS*********************************************************27500000
|
|
%********ENTERST********************************************************27510000
|
|
% ENTERST(N,L,P,X) SEARCHES THE SYMBOL TABLE FOR THE OBJECT OF 27520000
|
|
% TYPE X (SEE BELOW); IF THE OBJECT IS NOT PRESENT, A NEW ENTRY 27530000
|
|
% IS CREATED FOR IT. THE RETURN VALUE IS THE SYMB TABLE ADDRESS 27540000
|
|
% OF THE OBJECT. THE NAME CONSISTS OF THE N CHARS STARTING FROM 27550000
|
|
% L[P.W],P.C--N CAN BE ANY (NON-NEGATIVE) NUMBER. 27560000
|
|
% IF THE SYMBOL TABLE IS FULL AND A NEW ENTRY MUST BE CREATED, 27570000
|
|
% MESSAGES ARE PRINTED (LP AND TT), AND -1 IS RETURNED. ALSO, 27580000
|
|
% THE PROCEDURE NEWCELL WILL HAVE SET THE DEATH FLAG TRUE. 27590000
|
|
ALPHA PROCEDURE ENTERST(N,L,P,X); 27600000
|
|
VALUE N, P, X; 27610000
|
|
INTEGER N, P; 27620000
|
|
ALPHA ARRAY L[0]; 27630000
|
|
ALPHA X; 27640000
|
|
BEGIN ALPHA J, K; 27650000
|
|
INTEGER I, Y, M, XTEST; 27660000
|
|
LABEL FOUND, FAIL, RETURN, CREATE; 27670000
|
|
DEFINE STWORD = (IF BOOLEAN(Y) THEN VALU[I] ELSE NAME[I])#; 27680000
|
|
% 27690000
|
|
XTEST ~ IF X = "SYMB" THEN 0 ELSE 27700000
|
|
IF X = "LIT" THEN 1 ELSE 27710000
|
|
IF X = "FCT" THEN 2 ELSE 27720000
|
|
IF X = "INST" THEN 3 ELSE 0; 27730000
|
|
Y ~ IF X = "LIT" THEN 1 ELSE 0; 27740000
|
|
I ~ SCATTER(N,L,P,X); 27750000
|
|
WHILE TRUE DO 27760000
|
|
% IF YOU DONT UNDERSTAND THIS, YOU ARENT NECESSARILY STUPID: 27770000
|
|
BEGIN IF (IF N ! (K ~ STWORD).S 27780000
|
|
THEN FALSE 27790000
|
|
ELSE EQUAL(N,L[P.W],P.C,FIRSTCHAR(K))) 27800000
|
|
THEN IF (IF N = 0 THEN (K.LOC ! 0) ELSE TRUE) 27810000
|
|
THEN IF (IF X = "LIT" 27820000
|
|
THEN NAME[I] 27830000
|
|
ELSE K).TYPE = XTEST 27840000
|
|
THEN GO TO FOUND; 27850000
|
|
IF X = "LIT" THEN K ~ NAME[I]; 27860000
|
|
IF K.LINK = 0 THEN GO TO CREATE; 27870000
|
|
I ~ K.LINK; 27880000
|
|
END; 27890000
|
|
CREATE: 27900000
|
|
BEGIN DEFINE DUMMY=#; 27910000
|
|
J ~ STRING(N,0); 27920000
|
|
MOVE(N,L[P.W],P.C,FIRSTCHAR(J)); 27930000
|
|
IF STWORD.LOC ! 0 THEN 27940000
|
|
BEGIN M ~ NEWCELL(I.STR); 27950000
|
|
IF DEATH THEN GO TO FAIL; 27960000
|
|
NAME[I].LINK ~ I ~ M; 27970000
|
|
END; 27980000
|
|
NAME[I] ~ IF BOOLEAN(Y) THEN 1 ELSE J; 27990000
|
|
VALU[I] ~ IF BOOLEAN(Y) THEN J ELSE 1; 28000000
|
|
M ~ J.CH - 2; 28010000
|
|
MV(2,I,6,DATA[J.R,M.W],M.C); 28020000
|
|
NAME[I].TYPE ~ XTEST; 28030000
|
|
IF X = "FCT" THEN 28040000
|
|
BEGIN 28050000
|
|
K ~ INTRINSIC(L,P,N); 28060000
|
|
IF K ! 0 THEN VALU[I] ~ 1 & K CLINK; 28070000
|
|
END; 28080000
|
|
IF TRACEALL THEN 28090000
|
|
BEGIN VALU[I].IOUSE ~ (IF X="FCT" THEN 3 ELSE 1); 28100000
|
|
IO[I] ~ 0 & 2 CIOTYPE & 3 CFILNO 28110000
|
|
& (IF X="FCT" THEN 3 ELSE 1) CIOUSE; 28120000
|
|
END; 28130000
|
|
GO TO FOUND; 28140000
|
|
END; 28150000
|
|
FAIL: 28160000
|
|
MESSAGE0(14); 28170000
|
|
MESSAGETT0(14); 28180000
|
|
I ~ -1; 28190000
|
|
FOUND: ENTERST ~ I; 28200000
|
|
RETURN: 28210000
|
|
END ENTERST; 28220000
|
|
%********ENTERST********************************************************28230000
|
|
%********FINDUSERS******************************************************28240000
|
|
PROCEDURE FINDUSERS; 28250000
|
|
BEGIN INTEGER I, J; 28260000
|
|
ALPHA ARRAY X[0:2|TTMAX]; 28270000
|
|
ALPHA ST1, ST2; 28280000
|
|
% 28290000
|
|
ST1 ~ STAT[USER].[9:9]; 28300000
|
|
ST2 ~ STAT[MAINUSER].[9:9]; 28310000
|
|
NUMUSERS ~ STATUS(X[*]) / 2; 28320000
|
|
FOR I ~ NUMUSERS-1 STEP -1 UNTIL 0 DO 28330000
|
|
BEGIN J ~ I | 2; 28340000
|
|
STAT[I] ~ X[J]; 28350000
|
|
ID[I] ~ X[J+1]; 28360000
|
|
END; 28370000
|
|
IF ST2 ! STAT[MAINUSER].[9:9] THEN 28380000
|
|
BEGIN MAINUSER ~ 0; 28390000
|
|
FOR I ~ NUMUSERS-1 STEP -1 UNTIL 0 DO 28400000
|
|
IF STAT[I].[9:9] = ST2 THEN MAINUSER ~ I; 28410000
|
|
END; 28420000
|
|
IF ST1 ! STAT[USER].[9:9] THEN 28430000
|
|
BEGIN USER ~ -1; 28440000
|
|
FOR I ~ 0 STEP 1 WHILE USER < 0 AND I < NUMUSERS DO 28450000
|
|
IF ST1 = STAT[I].[9:9] THEN USER ~ I; 28460000
|
|
IF USER < 0 THEN USER ~ MAINUSER; 28470000
|
|
END; 28480000
|
|
DATACOMF ~ NUMUSERS > 0; 28490000
|
|
END FINDUSERS; 28500000
|
|
%********FINDUSERS******************************************************28510000
|
|
%********GARBAGE COLLECTOR**********************************************28520000
|
|
PROCEDURE GARBAGECOLLECTOR; 28530000
|
|
% 28540000
|
|
BEGIN INTEGER I,K,M,MAX,P,ROWS,ST,TOTAL; 28550000
|
|
REAL TIMECP, TIMEIO; 28560000
|
|
ALPHA J; 28570000
|
|
INTEGER ARRAY NEWPNTR[0:DATASIZE]; 28580000
|
|
LABEL L; 28590000
|
|
% 28600000
|
|
TIMECP ~ TIME(2); TIMEIO ~ TIME(3); 28610000
|
|
IF INFORM THEN 28620000
|
|
BEGIN 28630000
|
|
WRITE(PRINT,FGC); 28640000
|
|
WRITETIME(0,0); 28650000
|
|
CHECKSYMBTABL; 28660000
|
|
END; 28670000
|
|
% FREE STRINGS ATTACHED TO CELLS ON AVAILABLE SPACE LISTS: 28680000
|
|
FOR I ~ 0 STEP 1 UNTIL STRMAX DO IF USEDST[I] THEN 28690000
|
|
BEGIN K ~ NEXTCELL[I]; 28700000
|
|
WHILE K ! 0 DO 28710000
|
|
BEGIN NAME[K].LOC ~ VALU[K] ~ 0; 28720000
|
|
K ~ NAME[K].LINK; 28730000
|
|
END; 28740000
|
|
END; 28750000
|
|
% CHECK FOR CELLS HELD A LONG TIME, THEN DISCARDED: 28760000
|
|
IF GCS.C = 0 THEN 28770000
|
|
FILL NOTMOVED[*] WITH 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 28780000
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; 28790000
|
|
MAX ~ TOTAL ~ ROWS ~ 0; 28800000
|
|
IF NOT DEATH THEN 28810000
|
|
FOR I ~ 0 STEP 1 UNTIL DATASIZE DO 28820000
|
|
IF USEDROW[I] THEN 28830000
|
|
BEGIN 28840000
|
|
ROWS ~ ROWS + 1; 28850000
|
|
MV(1,QMARK,7,DATA[I,DPNTR[I].W],DPNTR[I].C); 28860000
|
|
P ~ NEWPNTR[I] ~ NOTMOVED[I]; 28870000
|
|
L: P ~ P + SCANCHAR(QMARK,QMARK,DATA[I,P.W],P.C); 28880000
|
|
IF P < DPNTR[I] THEN 28890000
|
|
BEGIN MV(2,DATA[I,P.W],P.C+1,ST,6); 28900000
|
|
FOR K ~ 1,0 DO 28910000
|
|
BEGIN 28920000
|
|
J ~ IF BOOLEAN(K) THEN VALU[ST] ELSE NAME[ST]; 28930000
|
|
IF J.CH = P+3 THEN 28940000
|
|
IF J.R = I THEN IF J.CH-3 > NEWPNTR[I] THEN 28950000
|
|
BEGIN M ~ J.CH - 3; 28960000
|
|
MOVE(J.S+3,DATA[I,M.W],M.C, 28970000
|
|
DATA[I,NEWPNTR[I].W],NEWPNTR[I].C); 28980000
|
|
IF BOOLEAN(K) 28990000
|
|
THEN VALU[ST].CH ~ NEWPNTR[I] + 3 29000000
|
|
ELSE NAME[ST].CH ~ NEWPNTR[I] + 3; 29010000
|
|
NEWPNTR[I] ~ NEWPNTR[I] + J.S + 3; 29020000
|
|
P ~ P + J.S + 3; 29030000
|
|
GO TO L; 29040000
|
|
END ELSE 29050000
|
|
BEGIN P ~ P + J.S + 3; 29060000
|
|
NOTMOVED[I] ~ NEWPNTR[I] ~ P; 29070000
|
|
GO TO L; 29080000
|
|
END; 29090000
|
|
END; 29100000
|
|
P ~ P + 1; GO TO L; 29110000
|
|
END; 29120000
|
|
IF 8184 - (DPNTR[I] ~ NEWPNTR[I]) > MAX THEN 29130000
|
|
MAX ~ 8184 - DPNTR[I]; 29140000
|
|
TOTAL ~ TOTAL + 8184 - DPNTR[I]; 29150000
|
|
END; 29160000
|
|
IF MAX < 1000 OR TOTAL < 2000 THEN 29170000
|
|
BEGIN I ~ 0; 29180000
|
|
WHILE USEDROW[I] AND I < DATASIZE DO I ~ I + 1; 29190000
|
|
USEDROW[I] ~ TRUE; 29200000
|
|
END; 29210000
|
|
CHECKSYMBTABL; 29220000
|
|
IF INFORM THEN 29230000
|
|
BEGIN 29240000
|
|
WRITETIME(0,0); 29250000
|
|
WRITE(PRINT,FGCRES,ROWS,MAX,TOTAL); 29260000
|
|
END; 29270000
|
|
GCS ~ GCS + 1; 29280000
|
|
GCTIMECP ~ GCTIMECP + (TIME(2)-TIMECP)/60; 29290000
|
|
GCTIMEIO ~ GCTIMEIO + (TIME(3)-TIMEIO)/60; 29300000
|
|
END GARBAGECOLLECTOR; 29310000
|
|
%********GARBAGE COLLECTOR**********************************************29320000
|
|
%********INDIRECT*******************************************************29330000
|
|
% INDIRECT(SP) INDIRECTS ON THE STRING NAMED BY STACK[I], AND 29340000
|
|
% LEAVES THE RESULT IN THE SAME STACK LOCATION. THIS ROUTINE IS 29350000
|
|
% CALLED BY VARIOUS INTRINSIC FUNCTIONS THAT NEED TO INTERPRET 29360000
|
|
% THEIR PARAMETERS AS STRING NAMES. 29370000
|
|
PROCEDURE INDIRECT(SP); 29380000
|
|
VALUE SP; INTEGER SP; 29390000
|
|
BEGIN ALPHA AA, AB; 29400000
|
|
% IF INFORM THEN INFORM0(19); 29410000
|
|
AA ~ PST[SP]; 29420000
|
|
AB ~ VALU[AA]; 29430000
|
|
PST[SP] ~ ENTERST(AB.S,DATA[AB.R,*],AB.CH,"SYMB"); 29440000
|
|
PNAME[SP] ~ TRUE; 29450000
|
|
END INDIRECT; 29460000
|
|
%********INDIRECT*******************************************************29470000
|
|
%********INFORM*********************************************************29480000
|
|
% THE FOLLOWING PROCEDURES ARE CALLED ONLY TO OUTPUT CERTAIN 29490000
|
|
% INFORMATIVE MESSAGES. THE PROCEDURE NAMES CONSIST OF "INFORM" 29500000
|
|
% FOLLOWED BY A STRING OF "I"-S OR "A"-S, TELLING WHAT SORT OF 29510000
|
|
% FORMAT THE PARAMETERS WILL BE WRITTEN OUT AS. THE FIRST PARAMETER 29520000
|
|
% GIVES THE SUBSCRIPT TO A SWITCH FORMAT. 29530000
|
|
% 29540000
|
|
PROCEDURE INFORM0(I); 29550000
|
|
VALUE I; INTEGER I; 29560000
|
|
BEGIN SWITCH FORMAT NFRM0 ~ 29570000
|
|
(X80,"SCANSUCCESS"), %0029580000
|
|
(X80,"ASSIGNMENT OF STRING VARIABLES"), %0129590000
|
|
(X80,"DELETE PATTERN"), %0229600000
|
|
(X80,"RRETURN"), %0329610000
|
|
(X80,"INSTRUCTION FAILED"), %0429620000
|
|
(X80,"START OF DEFINE SEGMENT"), %0529630000
|
|
(X80,"END OF DEFINE SEGMENT"), %0629640000
|
|
(X80,"RETURNTEMPS"), %0729650000
|
|
(X80,"SCAN FAILED"), %0829660000
|
|
(/"**ILLEGAL ARGUMENT TO .S"), %0929670000
|
|
(//"**DUMMY FORMAT--NFRM0[10]",I10), %1029680000
|
|
(///"**SEND COPY OF PROGRAM TO SYSTEM AUTHORS."//), %1129690000
|
|
(X90,"SCAN--CONSTANT"), %1229700000
|
|
(X90,"SCAN--DROPBACK"), %1329710000
|
|
(X80,"FUNCTION"), %1429720000
|
|
(X80,"GROUP"), %1529730000
|
|
(X80,"INDIRECTION"), %1629740000
|
|
(X80,"DOTFCT"), %1729750000
|
|
(X80,"ELEMENT"), %1829760000
|
|
(X80,"INDIRECT"), %1929770000
|
|
(X80,"**COMBINEARITHMETIC."), %2029780000
|
|
(X80,"**COMBINEGROUP."), %2129790000
|
|
(X80,"**COMBINEINDIRECTION."), %2229800000
|
|
(X80,"**COMBINESTRVARNAME."), %2329810000
|
|
(X80,"**COMBINEGOTOPART."), %2429820000
|
|
(X80,"**COMBINEFUNCTION."), %2529830000
|
|
(X80,"GO-TO PART"), %2629840000
|
|
(X80,"**CONDENSEPATTERN"), %2729850000
|
|
(X80,"**CONDENSEREPLACEMENT"), %2829860000
|
|
(X80,"**SEMICOLON"), %2929870000
|
|
(X80,"**INSERT STRING CONVERT"), %3029880000
|
|
(/"**END FORMAT--NFRM0"); 29890000
|
|
WRITE(PRINT,NFRM0[I]); 29900000
|
|
END INFORM0; 29910000
|
|
PROCEDURE INFORMA(I,P); 29920000
|
|
VALUE I, P; INTEGER I; ALPHA P; 29930000
|
|
BEGIN SWITCH FORMAT NFRMA ~ 29940000
|
|
(/"**ENTRY = ",A2), %0029950000
|
|
(X80,"PUSH(",A2,")"), %0129960000
|
|
(X80,"POP(",A2,")"), %0229970000
|
|
(X80,"RETURNCELL(",A2,")"), %0329980000
|
|
(X80,"PROGRAM SEGMENT = ",A6), %0429990000
|
|
(//"**ILLEGAL I/O DESCRIPTOR AT WORD ",A2), %0530000000
|
|
(/"**END FORMAT--NFRMA",A6); 30010000
|
|
IF I > 5 OR I < 0 THEN I ~ 5; 30020000
|
|
WRITE(PRINT,NFRMA[I],P); 30030000
|
|
END INFORMA; 30040000
|
|
PROCEDURE INFORMI(I,P); 30050000
|
|
VALUE I, P; INTEGER I, P; 30060000
|
|
BEGIN SWITCH FORMAT NFRMI ~ 30070000
|
|
(X80,"FIXED LENGTH = ",I4), %0030080000
|
|
(//"INVALID TYPE ",I5," IN GROUPING."), %0130090000
|
|
(//"ERROR IN DOTFCT IN STATEMENT ",I6/), %0230100000
|
|
(//"ERROR IN GROUPING IN STATEMENT ",I6/), %0330110000
|
|
(//"INTERPRETER STACK OVERFLOW IN STATEMENT ",I6//), %0430120000
|
|
(//"**PATTERN ERROR IN STATEMENT ",I6), %0530130000
|
|
(X80,"INPUT FROM FILE ",I2), %0630140000
|
|
(X80,"TEMPCELL(",I2,") CALLED."), %0730150000
|
|
(X80,"INSTNO = ",I6), %0830160000
|
|
(X80,"INTERPRETER CALLED--LEVEL = ",I3), %0930170000
|
|
(X80,"END INTERPRETER--LEVEL ",I3), %1030180000
|
|
(X80,"INTRINSIC ",I2), %1130190000
|
|
(X80,"NUMVAL = ",I12), %1230200000
|
|
(X80,"OUTPUT TO FILE ",I2), %1330210000
|
|
(/"**END FORMAT--NFRMI",I10); 30220000
|
|
WRITE(PRINT,NFRMI[I],P); 30230000
|
|
END INFORMI; 30240000
|
|
PROCEDURE INFORMIA(I,P1,P2); 30250000
|
|
VALUE I, P1, P2; INTEGER I, P1; ALPHA P2; 30260000
|
|
BEGIN SWITCH FORMAT NFRMIA ~ 30270000
|
|
(X80,"TEMPCEL(",I2,") = ",A2), %0030280000
|
|
(X80,"NEWCELL(",I2,") = ",A2), %0130290000
|
|
(X80,"SP = ",I3,"; CODE = ",A6), %0230300000
|
|
(/"**END FORMAT--NFRMIA",I10,A6); 30310000
|
|
WRITE(PRINT,NFRMIA[I],P1,P2); 30320000
|
|
END INFORMIA; 30330000
|
|
PROCEDURE INFORMII(I,P1,P2); 30340000
|
|
VALUE I, P1, P2; 30350000
|
|
INTEGER I, P1, P2; 30360000
|
|
BEGIN SWITCH FORMAT NFRMII ~ 30370000
|
|
("DUMMY FORMAT--NFRMII[0]",2I10), %0030380000
|
|
("DUMMY FORMAT--NFRMII[1]",2I10), %0130390000
|
|
(X80,"**DUMMY FORMAT--NFRMII[2]"), %0230400000
|
|
(//"**FATAL ERROR IN SCANNER IN STATEMENT ",I6,"; SP = ",I4), %0330410000
|
|
(X80,"TT IN FROM ",I2,"/",I2), %0430420000
|
|
(X80,"TT OUT TO ",I2,"/",I2), %0530430000
|
|
(X85,"SCAN--SP = ",I3,", POINT = ",I4), %0630440000
|
|
(/"**END FORMAT--NFRMII",2I10); 30450000
|
|
WRITE(PRINT,NFRMII[I],P1,P2); 30460000
|
|
END INFORMII; 30470000
|
|
%********INFORM*********************************************************30480000
|
|
%********INITIALIZESYMBTABL*********************************************30490000
|
|
PROCEDURE INITIALIZESYMBTABL; 30500000
|
|
BEGIN DEFINE DUMMY=#; 30510000
|
|
FOR I ~ 0 STEP 1 UNTIL SCATTERNO DO 30520000
|
|
BEGIN 30530000
|
|
FOR J ~ SCATTERSIZE+16 STEP 1 WHILE J < STWMAX DO 30540000
|
|
NAMTABL[I,J].LINK ~ (J+1) & I CONCSTR; 30550000
|
|
NEXTCELL[I] ~ (SCATTERSIZE+16) & I CONCSTR; 30560000
|
|
USEDST[I] ~ TRUE; 30570000
|
|
END; 30580000
|
|
SYMBTABLSETUP ~ TRUE; 30590000
|
|
END INITIALIZESYMBTABL; 30600000
|
|
%********INITIALIZESYMBTABL*********************************************30610000
|
|
%********INPUT**********************************************************30620000
|
|
% TELETYPE INPUT PROCEDURE: 30630000
|
|
BOOLEAN PROCEDURE INPUT; 30640000
|
|
BEGIN 30650000
|
|
SWITCH FORMAT FLAGS ~ ("{!FLAGS[0]{!~"), 30660000
|
|
("!{ MESSAGE WAS TOO LONG...PLEASE REENTER!{~"), 30670000
|
|
("!{ MESSAGE WAS PARTLY LOST...PLEASE REENTER!{~"); 30680000
|
|
ARRAY SINK[0:BUFINSIZE-1]; 30690000
|
|
INTEGER SIZ, TIMEX, FL, Q, R; 30700000
|
|
LABEL LOOP, NOGO, ABNORM, CHECKIT, EXIT, FAIL; 30710000
|
|
ALPHA S; 30720000
|
|
INTEGER STREAM PROCEDURE SIZE(A); 30730000
|
|
BEGIN SI ~ A; TALLY ~ 0; 30740000
|
|
DCINCHAR(IF SC="~" THEN JUMP OUT; SI~SI+1; TALLY~TALLY+1); 30750000
|
|
SIZE ~ TALLY 30760000
|
|
END SIZE; 30770000
|
|
STREAM PROCEDURE MOVE(A,B,C,D); VALUE C, D; 30780000
|
|
BEGIN SI~A; DI~B; DI~DI+D; DS~C CHR END MOVE; 30790000
|
|
% 30800000
|
|
% IF INFORM THEN INFORMII(4,STAT[USER].[9:4],STAT[USER].[14:4]); 30810000
|
|
IF NOT DATACOMF THEN GO TO FAIL; 30820000
|
|
INPUT ~ TRUE; 30830000
|
|
BREAK ~ FALSE; 30840000
|
|
FL ~ DCSIZE ~ 0; 30850000
|
|
TIMEX ~ TIME(1); 30860000
|
|
LOOP: Q ~ DCSIZE DIV 8; R ~ DCSIZE MOD 8; 30870000
|
|
IF DATACOMF 30880000
|
|
THEN READ(DCIN(STAT[USER],0),BUFINSIZE,SINK[*]) [NOGO:ABNORM] 30890000
|
|
ELSE GO TO FAIL; 30900000
|
|
IF BOOLEAN((S~STATUS(STAT[USER],0)).[28:1]) THEN 30910000
|
|
BEGIN % BUFFER OVERFLOW 30920000
|
|
FL ~ 2; 30930000
|
|
GO TO LOOP; 30940000
|
|
END; 30950000
|
|
TIMEX ~ TIME(1); 30960000
|
|
IF BOOLEAN(SINK[0].[25:1]) 30970000
|
|
THEN SIZ ~ DCINCHAR 30980000
|
|
ELSE SIZ ~ SIZE(SINK[1]); 30990000
|
|
IF DCSIZE ~ DCSIZE + SIZ > MSGSIZE 31000000
|
|
THEN FL ~ 1 31010000
|
|
ELSE MOVE(SINK[1],DCREAD[Q],SIZ,R); 31020000
|
|
IF BOOLEAN(SINK[0].[25:1]) 31030000
|
|
THEN GO TO LOOP; 31040000
|
|
CHECKIT: % CHECK FOR OVERFLOW AND TRANSMISSION ERROR 31050000
|
|
IF FL > 0 THEN 31060000
|
|
BEGIN WRITE(DCWRITE[*],FLAGS[FL]); 31070000
|
|
IF NOT OUTPUT THEN GO TO FAIL; 31080000
|
|
IF INPUT THEN GO TO EXIT; 31090000
|
|
END ELSE GO TO EXIT; 31100000
|
|
ABNORM: S ~ STATUS(STAT[USER],0); 31110000
|
|
% [28:1] = 1 IF BUFFER OVERFLOW 31120000
|
|
IF BOOLEAN(S.[28:1]) THEN FL ~ 2; 31130000
|
|
% [23:1] = 1 IF ABNORMAL CONDITION 31140000
|
|
% [24:1] = 1 IF BUFFER IS READ READY 31150000
|
|
% [30:1] = 1 IF UNIT NOT READY 31160000
|
|
IF S.[23:2]=3 OR BOOLEAN(S.[30:1]) THEN GO TO FAIL; 31170000
|
|
READ(DCIN(STAT[USER],0),BUFINSIZE,SINK[*]) [NOGO:NOGO]; 31180000
|
|
NOGO: 31190000
|
|
IF TIME(1) - TIMEX < WAITTIME THEN 31200000
|
|
BEGIN WHEN(1); GO TO LOOP; END; 31210000
|
|
S ~ STATUS(STAT[USER],1); 31220000
|
|
IF BOOLEAN(S.[30:1]) THEN GO TO FAIL; 31230000
|
|
IF BOOLEAN(S.[28:1]) THEN 31240000
|
|
BEGIN FL ~ 2; GO TO LOOP; END; 31250000
|
|
FAIL: 31260000
|
|
INPUT ~ FALSE; 31270000
|
|
FINDUSERS; 31280000
|
|
EXIT: END INPUT; 31290000
|
|
%========== END DATA COM INPUT PROCEDURE ===============================31300000
|
|
%********INSERTSTRINGCONVERT********************************************31310000
|
|
PROCEDURE INSERTSTRINGCONVERT(SP); 31320000
|
|
VALUE SP; 31330000
|
|
INTEGER SP; 31340000
|
|
BEGIN INTEGER I; 31350000
|
|
% IF INFORM THEN INFORM0(30); 31360000
|
|
I ~ PPOINT[SP] + PSIZE[SP]; 31370000
|
|
AA ~ ".S"; 31380000
|
|
MV(2,AA,6,CODE[I.W],I.C); 31390000
|
|
PSIZE[SP] ~ PSIZE[SP] + 2; 31400000
|
|
PNAME[SP] ~ FALSE; 31410000
|
|
PTYPE[SP] ~ 19; % COMBINED ARITHMETIC EXPRESSION 31420000
|
|
END INSERTSTRINGCONVERT; 31430000
|
|
%********INSERTSTRINGCONVERT********************************************31440000
|
|
%********INTERPRETER****************************************************31450000
|
|
% THIS IS THE CENTRAL CONTROL ROUTINE FOR THE INTERPRETER. IT IS 31460000
|
|
% SEVERAL THOUSAND CARDS LONG. 31470000
|
|
PROCEDURE INTERPRETER; 31480000
|
|
BEGIN 31490000
|
|
%****************** 31500000
|
|
INTEGER STREAM PROCEDURE CHAR(L,I); 31510000
|
|
VALUE I; 31520000
|
|
BEGIN SI ~ L; SI ~ SI + I; 31530000
|
|
DI ~ LOC CHAR; DI ~ DI + 7; 31540000
|
|
DS ~ 1 CHR; 31550000
|
|
END CHAR; 31560000
|
|
%****************** 31570000
|
|
BOOLEAN STREAM PROCEDURE EQ(N,L1,I1,L2,I2); 31580000
|
|
VALUE N, I1, I2; 31590000
|
|
BEGIN SI ~ L1; SI ~ SI + I1; 31600000
|
|
DI ~ L2; DI ~ DI + I2; 31610000
|
|
N(IF SC ! DC THEN JUMP OUT); 31620000
|
|
IF TOGGLE THEN TALLY ~ 0 ELSE TALLY ~ 1; 31630000
|
|
EQ ~ TALLY; 31640000
|
|
END EQ; 31650000
|
|
%****************** 31660000
|
|
STREAM PROCEDURE MV(N,L1,I1,L2,I2); 31670000
|
|
VALUE N, I1, I2; 31680000
|
|
BEGIN SI ~ L1; SI ~ SI + I1; 31690000
|
|
DI ~ L2; DI ~ DI + I2; 31700000
|
|
DS ~ N CHR; 31710000
|
|
END MOVE; 31720000
|
|
%****************** 31730000
|
|
ALPHA 31740000
|
|
FCT, 31750000
|
|
FCTN, 31760000
|
|
FCTV, 31770000
|
|
RETURNVAL; 31780000
|
|
ALPHA ARRAY 31790000
|
|
INST[0:MAXINSTSIZE.W]; 31800000
|
|
DEFINE 31810000
|
|
DIE = GO TO DEAD #, 31820000
|
|
FAIL=GO TO FAILED#; 31830000
|
|
BOOLEAN INGOTOPART; 31840000
|
|
ALPHA FIRSTCH; 31850000
|
|
LABEL 31860000
|
|
ARITHOVFL, % INTEGER OVERFLOW IN ARITHMETIC 31870000
|
|
BRANCH, % INTRINSIC FCT CASE STMT 31880000
|
|
DEAD, % FATAL ERROR LABEL 31890000
|
|
DEFINEDFCT, % PROGRAM-DEFINED FUNCTION 31900000
|
|
FCTFAIL, % FAILURE OF FUNCTION CALLS 31910000
|
|
DVDZERO, % DIVIDE-BY-ZERO IN ARITHMETIC 31920000
|
|
FAILED, % STATEMENT FAILURE LABEL 31930000
|
|
FIXERR, 31940000
|
|
GOTO, 31950000
|
|
INTERPRET, 31960000
|
|
LIMITHIT, 31970000
|
|
MINLEF, 31980000
|
|
NONNUMERIC, % NON-NUM ARITH OPERAND 31990000
|
|
PERROR, 32000000
|
|
PFIX, 32010000
|
|
PSCAN, 32020000
|
|
REFSET, 32030000
|
|
RETURN, 32040000
|
|
SCANFAILURE, 32050000
|
|
SETGO, 32060000
|
|
SUCCEED, % FUNCTION SUCCESS LABEL 32070000
|
|
UNDEFFCT, % CALL OF UNDEFINED FUNCTION 32080000
|
|
UNDEFINED; % UNDEFINED LABEL 32090000
|
|
LABEL % LOCAL TO SCANNER: 32100000
|
|
BALANCE, 32110000
|
|
DROPBACK, 32120000
|
|
NEWPOINT, 32130000
|
|
NEXTPATTERN, 32140000
|
|
SCANERR, 32150000
|
|
SCANSUCCESS, 32160000
|
|
SIZEFAILURE; 32170000
|
|
% 32180000
|
|
NEARPOINT ~ 9; 32190000
|
|
LEVEL ~ LEVEL + 1; 32200000
|
|
AA ~ ENTRY; 32210000
|
|
ENTRY ~ RULES[LEVEL] ~ 0; 32220000
|
|
% IF INFORM THEN INFORMI(9,LEVEL); 32230000
|
|
GO TO SETGO; 32240000
|
|
% 32250000
|
|
INTERPRET: 32260000
|
|
% START OF A SINGLE INSTRUCTION 32270000
|
|
IF DEATH THEN DIE; 32280000
|
|
% IF INFORM THEN 32290000
|
|
% BEGIN WRITE(PRINT,FBL); 32300000
|
|
% WRITE(PRINT,17,INST[*]); 32310000
|
|
% INFORMI(8,INSTNO); 32320000
|
|
% WRITETIME(0,0); 32330000
|
|
% END; 32340000
|
|
IF ALIMITEXISTS THEN 32350000
|
|
BEGIN 32360000
|
|
IF RULELIMITEXISTS THEN 32370000
|
|
IF RULES[0] > RULELIMIT THEN GO TO LIMITHIT; 32380000
|
|
IF CPULIMITEXISTS THEN 32390000
|
|
IF TIME(2) > CPULIMIT THEN GO TO LIMITHIT; 32400000
|
|
IF IOLIMITEXISTS THEN 32410000
|
|
IF TIME(3) > IOLIMIT THEN GO TO LIMITHIT; 32420000
|
|
IF DEBUGGING THEN 32430000
|
|
IF DEBUGRULELIMITEXISTS THEN 32440000
|
|
IF DEBUGRULELIMIT { RULES[0] THEN 32450000
|
|
BEGIN SUSPENDREASON[1] ~ TRUE; 32460000
|
|
DEBUG(SETGO); 32470000
|
|
END; 32480000
|
|
END; 32490000
|
|
RULES[0] ~ RULES[0] + 1; % INCR GLOBAL RULE COUNT. 32500000
|
|
RULES[LEVEL] ~ RULES[LEVEL] + 1; % INCR LOCAL RULE COUNT. 32510000
|
|
SP ~ RSIZE ~ FRONTEND ~ REAREND ~ 0; 32520000
|
|
INGOTOPART ~ SELFREFLAG ~ NOREPLACEMENT ~ VARFLAG ~ FALSE; 32530000
|
|
SUCCESS ~ TRUE; 32540000
|
|
RELATIVEPOINTER ~ 1; 32550000
|
|
% CONTROLPOINT SHOULD BE AT THE 1ST CHAR OF THE INSTRUCTION. 32560000
|
|
% FIRST CHAR NO LONGER IN USE BY INTERPRETER. 32570000
|
|
PSCAN: % NEXT PATTERN ELEMENT 32580000
|
|
IF (NEARPOINT~NEARPOINT+RELATIVEPOINTER) } 63 THEN 32590000
|
|
BEGIN INSTRUCT ~ INSTRUCT + NEARPOINT.W; 32600000
|
|
NEARPOINT ~ NEARPOINT.C; 32610000
|
|
END; 32620000
|
|
RELATIVEPOINTER ~ 0; 32630000
|
|
% CONTROLPOINT SHOULD NOW POINT TO THE NEXT PATTERN ELEMENT. 32640000
|
|
MV(3,CONTROLPOINT,AA,2); % GET NEXT PIECE OF CODE. 32650000
|
|
% IF INFORM THEN INFORMA(4,AA); 32660000
|
|
CASE AA.C2 OF 32670000
|
|
BEGIN 32680000
|
|
%*************************************** 32690000
|
|
%********OP CODES*********************** 32700000
|
|
% 0-9: ERRORS 32710000
|
|
;;;;;;;;;; 32720000
|
|
%*************************************** 32730000
|
|
%********FUNCTION CALL****************** 32740000
|
|
% 10: "#" FUNCTION CALL 32750000
|
|
% 2-CHAR POINTER TO SYMB TABLE LOC OF FCT 32760000
|
|
% 1 CHAR GIVING THE NUMBER OF PARAMETERS. 32770000
|
|
BEGIN 32780000
|
|
% IF INFORM THEN INFORM0(14); 32790000
|
|
MKS ~ SP - CHAR(CONTROLPOINT+3); % FIND FIRST PARAM. 32800000
|
|
RETURNVAL ~ 0; % HOLDS ST LOC OF RETURN VALUE. 32810000
|
|
FCT ~ AA.[18:12]; 32820000
|
|
PTYPE[MKS] ~ 1; 32830000
|
|
FCTV ~ VALU[FCT]; 32840000
|
|
BRANCH: 32850000
|
|
IF BOOLEAN(FCTV.INUSE) THEN 32860000
|
|
IF NOT TRACEFCTCALL(FCT) THEN GO TO FCTFAIL; 32870000
|
|
IF BOOLEAN(FCTV.[1:1]) THEN GO TO DEFINEDFCT; 32880000
|
|
% IF INFORM THEN INFORMI(11,FCTV.LINK); 32890000
|
|
CASE FCTV.LINK OF 32900000
|
|
%*************************************** 32910000
|
|
%********INTRINSIC FUNCTIONS************ 32920000
|
|
% THE INTRINSIC FUNCTIONS ARE ARRANGED IN THE FOLLOWING ORDER: 32930000
|
|
% 1 ANCHOR 32940000
|
|
% 2 CALLF 32950000
|
|
% 3 CLOSE 32960000
|
|
% 4 DATE 32970000
|
|
% 5 DEFINE 32980000
|
|
% 6 DETACH 32990000
|
|
% 7 DUMP 33000000
|
|
% 8 EOF 33010000
|
|
% 9 .EQ 33020000
|
|
% 10 EQUALS 33030000
|
|
% 11 EXECUTE 33040000
|
|
% 12 FILE 33050000
|
|
% 13 FILL 33060000
|
|
% 14 .GE 33070000
|
|
% 15 .GT 33080000
|
|
% 16 .LE 33090000
|
|
% 17 LEVEL 33100000
|
|
% 18 LOOK 33110000
|
|
% 19 .LT 33120000
|
|
% 20 MODE 33130000
|
|
% 21 .NE 33140000
|
|
% 22 .NUM 33150000
|
|
% 23 OPSYN 33160000
|
|
% 24 PAGE 33170000
|
|
% 25 POP 33180000
|
|
% 26 PUSH 33190000
|
|
% 27 .REMDR 33200000
|
|
% 28 REWIND 33210000
|
|
% 29 RULES 33220000
|
|
% 30 SIZE 33230000
|
|
% 31 SPACE 33240000
|
|
% 32 TIME 33250000
|
|
% 33 TRACES 33260000
|
|
% 34 TRACEF 33270000
|
|
% 35 TRACEL 33280000
|
|
% 36 TRIM 33290000
|
|
% 37 UNANCH 33300000
|
|
% 38 UNEQL 33310000
|
|
% 39 WAIT 33320000
|
|
% 40 SUSPEND 33330000
|
|
% 41 STATUS 33340000
|
|
% 42 USER 33350000
|
|
% 43 SEEK 33360000
|
|
% 44 RELEASE 33370000
|
|
% 45 RECORD 33380000
|
|
% 46 TRACE 33390000
|
|
% 47 ASSIGN 33400000
|
|
% 48 COPY 33410000
|
|
% 49 SEARCH 33420000
|
|
% 50 .RANF 33430000
|
|
% 33440000
|
|
BEGIN % CODE FOR INTRINSIC FUNCTIONS FOLLOWS: 33450000
|
|
% 0: UNDEFINED 33460000
|
|
GO TO UNDEFFCT; 33470000
|
|
% 1: ANCHOR 33480000
|
|
BEGIN PTYPE[0] ~ 3; 33490000
|
|
IF SP > MKS THEN 33500000
|
|
BEGIN IF NOT NUMVAL(PST[MKS],I1) OR I1 < 0 33510000
|
|
THEN GO TO FCTFAIL; 33520000
|
|
PSIZE[0] ~ I1; 33530000
|
|
END ELSE PSIZE[0] ~ ANCHORSIZE; 33540000
|
|
GO TO SUCCEED; 33550000
|
|
END ANCHOR; 33560000
|
|
% 2: CALLF(F,P1,P2,...,PN) CALLS THE FUNCTION NAMED BY F, WITH THE 33570000
|
|
% PARAMETERS P1, P2, ..., PN. 33580000
|
|
BEGIN SEGMENT 33590000
|
|
AA ~ PST[MKS]; 33600000
|
|
AB ~ VALU[AA]; 33610000
|
|
FCT ~ ENTERST(AB.S,DATA[AB.R,*],AB.CH,"FCT"); 33620000
|
|
FCTV ~ VALU[FCT]; 33630000
|
|
SP ~ SP - 1; 33640000
|
|
FOR I ~ MKS STEP 1 UNTIL SP DO 33650000
|
|
BEGIN PST[I] ~ PST[I+1]; 33660000
|
|
PNAME[I] ~ PNAME[I+1]; 33670000
|
|
END; 33680000
|
|
GO TO BRANCH; 33690000
|
|
END CALLF; 33700000
|
|
% 3: CLOSE(F,P) 33710000
|
|
% CLOSE(F,P) CLOSES THE FILE ASSOCIATED WITH $F, IN THE MANNER 33720000
|
|
% SPECIFIED BY P. THE VALUES OF P ARE: 33730000
|
|
% "*" ONLY FOR TAPE FILES. THE TAPE IS POSITIONED JUST BEYOND 33740000
|
|
% THE END-OF-FILE FOR THE CURRENT FILE. IF LAST I/O 33750000
|
|
% OPERATION HAD EOF, NO ACTION IS TAKEN. 33760000
|
|
% "LOCK" CLOSES THE FILE AND SAVES THE UNIT FOR THE PROGRAM. 33770000
|
|
% NEW DISK FILES ARE SAVED FOR THE TIME GIVEN IN THEIR DECLAR-33780000
|
|
% ATIONS; TAPE FILES ARE REWOUND AND THE OPERATOR IS TOLD 33790000
|
|
% TO REMOVE THE TAPE AND SAVE IT. 33800000
|
|
% "RELEASE" RELEASES I/O UNIT TO THE SYSTEM. TAPE FILES ARE 33810000
|
|
% REWOUND AND DISK FILES ARE DESTROYED IF CREATED BY 33820000
|
|
% THE PROGRAM. 33830000
|
|
% "PURGE" THE FILE IS CLOSED, PURGED, AND RELEASED TO THE 33840000
|
|
% SYSTEM. 33850000
|
|
BEGIN SEGMENT 33860000
|
|
IF SP { MKS THEN GO TO FCTFAIL; 33870000
|
|
IF SP-MKS = 1 THEN IF NOT NULLARGS(1) THEN GO TO FCTFAIL; 33880000
|
|
INDIRECT(MKS); 33890000
|
|
AA ~ PST[MKS]; 33900000
|
|
AB ~ PST[MKS+1]; 33910000
|
|
AA ~ IO[AA]; 33920000
|
|
IF AA.IOUSE=0 OR I1~AA.FILNO=0 THEN GO TO FCTFAIL; 33930000
|
|
AB ~ VALU[AB]; 33940000
|
|
IF (I2~AB.S) > 7 THEN GO TO FCTFAIL; 33950000
|
|
AC ~ 0; 33960000
|
|
IF I2 = 0 33970000
|
|
THEN AC ~ 0 33980000
|
|
ELSE MV(I2,FIRSTCHAR(AB),AC,8-I2); 33990000
|
|
AC ~ AC; 34000000
|
|
IF AC = 0 THEN CLOSE(IOFILE[I1]) ELSE 34010000
|
|
IF AC = "LOCK" THEN LOCK(IOFILE[I1],SAVE) ELSE 34020000
|
|
IF AC = "SAVE" THEN CLOSE(IOFILE[I1],SAVE) ELSE 34030000
|
|
IF AC = "PURGE" THEN CLOSE(IOFILE[I1],PURGE) ELSE 34040000
|
|
IF AC = "RELEASE" THEN 34050000
|
|
BEGIN IOFILEOPEN[I1] ~ FALSE; 34060000
|
|
CLOSE(IOFILE[I1],RELEASE); 34070000
|
|
END ELSE 34080000
|
|
IF AC = "*" THEN CLOSE(IOFILE[I1],*) ELSE 34090000
|
|
BEGIN IF PRINTMESSAGES THEN 34100000
|
|
BEGIN MESSAGEI(8,INSTNO); 34110000
|
|
MESSAGETTI(8,INSTNO); 34120000
|
|
END; 34130000
|
|
GO TO FCTFAIL; 34140000
|
|
END; 34150000
|
|
GO TO SUCCEED; 34160000
|
|
END INTRINSIC FUNCTION CLOSE; 34170000
|
|
% 4: DATE() RETURNS THE CURRENT DATE IN THE FORM: 34180000
|
|
% MM/DD/YY 34190000
|
|
BEGIN SEGMENT 34200000
|
|
AA ~ DATE; 34210000
|
|
AB ~ TEMPCELL; 34220000
|
|
AC ~ STRING(8,AB); 34230000
|
|
MV(8,AA,0,FIRSTCHAR(AC)); 34240000
|
|
VALU[AB] ~ AC; 34250000
|
|
RETURNVAL ~ AB; 34260000
|
|
GO TO SUCCEED; 34270000
|
|
END LDATE; 34280000
|
|
% 5: DEFINE(A,B,C) CREATES A SNOBOL FUNCTION. THE VALUES OF THE 34290000
|
|
% PARAMETERS ARE OF THE FORMS: 34300000
|
|
% A ::= <FCT NAME> ( <PARAMS> ) 34310000
|
|
% B ::= <LABEL> 34320000
|
|
% C ::= <LOC VARS> 34330000
|
|
% <FCT NAME> IS A LEGAL SNOBOL IDENTIFIER. 34340000
|
|
% <LABEL> IS A LABEL THAT OCCURS IN THE PROGRAM, OR IS NULL. IF 34350000
|
|
% B IS NULL, THE ENTRY POINT IS TAKEN TO BE SPELLED THE SAME 34360000
|
|
% AS <FCT NAME>. 34370000
|
|
% <PARAMS> AND <LOC VARS> ARE THE FORMAL PARAMETERS AND LOCAL 34380000
|
|
% VARIABLES. THEY CAN BE NULL, OR CAN CONSIST OF A LIST OF 34390000
|
|
% IDENTIFIERS SEPARATED BY COMMAS. SEE ALSO THE PROCEDURE 34400000
|
|
% SNBLDEFINE AND THE DEFINE PART OF PROCESSCONTROLCARD. 34410000
|
|
BEGIN SEGMENT 34420000
|
|
IF SP - MKS < 3 THEN 34430000
|
|
IF NOT NULLARGS(3-SP+MKS) THEN GO TO FCTFAIL; 34440000
|
|
IF SNBLDEFINE(PST[MKS],PST[MKS+1],PST[MKS+2]) 34450000
|
|
THEN GO TO SUCCEED; 34460000
|
|
MESSAGEI(9,INSTNO); 34470000
|
|
MESSAGETTI(9,INSTNO); 34480000
|
|
GO TO FCTFAIL; 34490000
|
|
END LDEFINE; 34500000
|
|
% 6: DETACH(F,V) TERMINATES ANY I/O USE OF THE QUANTITY NAMED BY F. 34510000
|
|
% THE TYPE OF THIS QUANTITY IS DETERMINED BY THE FIRST CHARACTER 34520000
|
|
% OF V, AS FOLLOWS: 34530000
|
|
% "S" OR NULL = STRING NAME 34540000
|
|
% "F" = FUNCTION NAME 34550000
|
|
% "L" = LABEL 34560000
|
|
BEGIN SEGMENT 34570000
|
|
IF SP { MKS THEN GO TO FCTFAIL; 34580000
|
|
IF SP - MKS > 1 THEN 34590000
|
|
BEGIN AA ~ PST[MKS+1]; 34600000
|
|
AB ~ VALU[AA]; 34610000
|
|
AC ~ CHAR(FIRSTCHAR(AB)); 34620000
|
|
IF AB.S = 0 OR AC = "S" THEN AC ~ "SYMB" ELSE 34630000
|
|
IF AC = "F" THEN AC ~ "FCT" ELSE 34640000
|
|
IF AC = "L" THEN AC ~ "INST" ELSE GO TO FCTFAIL; 34650000
|
|
END ELSE AC ~ "SYMB"; 34660000
|
|
AA ~ PST[MKS]; 34670000
|
|
AB ~ VALU[AA]; 34680000
|
|
AA ~ ENTERST(AB.S,DATA[AB.R,*],AB.CH,AC); 34690000
|
|
VALU[AA].IOUSE ~ IO[AA] ~ 0; 34700000
|
|
GO TO SUCCEED; 34710000
|
|
END LDETACH; 34720000
|
|
% 7: DUMP() 34730000
|
|
BEGIN SEGMENT 34740000
|
|
MESSAGEI(10,INSTNO); % DUMP REQUESTED... 34750000
|
|
IF INFORM THEN BEGIN WRITEST; WRITEDATA; END; 34760000
|
|
STRINGDUMP(INSTNO); 34770000
|
|
GO TO SUCCEED; 34780000
|
|
END DUMP; 34790000
|
|
% 8: EOF(F) SUCCEEDS IF THE LAST I/O OPERATION ON THE FILE ASSOCIATED 34800000
|
|
% WITH $F FAILED DUE TO END-OF-FILE. IF NOT, OR IF $F IS NOT AN 34810000
|
|
% I/O STRING, THEN EOF(F) FAILS. 34820000
|
|
BEGIN SEGMENT 34830000
|
|
IF SP { MKS THEN GO TO FCTFAIL; 34840000
|
|
INDIRECT(MKS); 34850000
|
|
AA ~ VALU[PST[MKS]]; 34860000
|
|
IF AA.IOUSE = 0 THEN GO TO FCTFAIL; 34870000
|
|
GO TO IF IOEOF[AA.FILNO] THEN SUCCEED ELSE FCTFAIL; 34880000
|
|
END EOF; 34890000
|
|
% 9: .EQ(A,B) SUCCEEDS IFF BOTH A AND B ARE NUMERIC, AND A = B. 34900000
|
|
BEGIN SEGMENT 34910000
|
|
IF SP - MKS < 2 THEN 34920000
|
|
IF NOT NULLARGS(2-SP+MKS) THEN GO TO FCTFAIL; 34930000
|
|
IF NUMVAL(PST[MKS],AA) AND NUMVAL(PST[MKS+1],AB) 34940000
|
|
THEN GO TO IF AA = AB THEN SUCCEED ELSE FCTFAIL; 34950000
|
|
IF PRINTMESSAGES THEN 34960000
|
|
BEGIN MESSAGEAI(0,"EQ",INSTNO); 34970000
|
|
MESSAGETTAI(0,"EQ",INSTNO); 34980000
|
|
END; 34990000
|
|
GO TO FCTFAIL; 35000000
|
|
END; % .EQ(A,B) 35010000
|
|
% 10: EQUALS(A,B) SUCCEEDS IFF A AND B HAVE THE SAME STRINGS AS VALUES. 35020000
|
|
BEGIN 35030000
|
|
IF SP - MKS < 2 THEN 35040000
|
|
IF NOT NULLARGS(2-SP+MKS) THEN GO TO FCTFAIL; 35050000
|
|
AB ~ PST[MKS]; 35060000
|
|
AC ~ PST[MKS+1]; 35070000
|
|
AB ~ VALU[AB]; 35080000
|
|
AC ~ VALU[AC]; 35090000
|
|
GO TO IF AB.S ! AC.S 35100000
|
|
THEN FCTFAIL 35110000
|
|
ELSE IF EQUAL(AB.S,FIRSTCHAR(AB),FIRSTCHAR(AC)) 35120000
|
|
THEN SUCCEED 35130000
|
|
ELSE FCTFAIL; 35140000
|
|
END LEQUALS; 35150000
|
|
% 11: EXECUTE(S) CURRENTLY WORKS IF THE FIRST CHAR OF S IS QMARK, IN 35160000
|
|
% WHICH CASE THE ALGOL "ZIP WITH <ARRAY ROW>" IS EXECUTED ON S; 35170000
|
|
% OR IF S IS AN INPUT STRING, IN WHICH CASE THE ALGOL "ZIP WITH 35180000
|
|
% <FILE PART>" IS EXECUTED ON THE FILE BELONGING TO S, OR IF S 35190000
|
|
% STARTS WITH "-", WHICH IS A SNOBOL CONTROL CARD. 35200000
|
|
BEGIN SEGMENT 35210000
|
|
IF MKS } SP THEN GO TO FCTFAIL; 35220000
|
|
AA ~ PST[MKS]; 35230000
|
|
AB ~ VALU[AA]; 35240000
|
|
IF BOOLEAN(AB.INUSE) THEN % ZIP WITH FILE 35250000
|
|
BEGIN 35260000
|
|
IF BOOLEAN(AB.INUSE) AND AB.FILNO > 0 THEN 35270000
|
|
BEGIN 35280000
|
|
ZIP WITH IOFILE[AB.FILNO]; 35290000
|
|
GO TO SUCCEED; 35300000
|
|
END; 35310000
|
|
GO TO FCTFAIL; 35320000
|
|
END; 35330000
|
|
IF (I1~CHAR(FIRSTCHAR(AB))) = QMARK THEN % MCP CONTROL CARD 35340000
|
|
BEGIN ALPHA ARRAY Z[0:AB.[17:10]]; 35350000
|
|
MOVE(STRINGLOC(AB),Z[*],0); 35360000
|
|
ZIP WITH Z[*]; 35370000
|
|
GO TO SUCCEED; 35380000
|
|
END; 35390000
|
|
IF I1 = "-" THEN % SNOBOL CONTROL CARD 35400000
|
|
BEGIN ALPHA ARRAY SCRATCH[0:(AB.S).W]; 35410000
|
|
INSTSIZE ~ AB.S; 35420000
|
|
MOVE(INSTSIZE,FIRSTCHAR(AB),SCRATCH[0],0); 35430000
|
|
SCRATCH[INSTSIZE.W] ~ STOPPER; 35440000
|
|
PROCESSCONTROLCARD(SCRATCH); 35450000
|
|
GO TO SUCCEED; 35460000
|
|
END; 35470000
|
|
GO TO FCTFAIL; 35480000
|
|
END LEXECUTE; 35490000
|
|
%12: FILE(NAME,I.O,BUFFERS,REC.SIZE,BUFF.SIZE,SAVE.FACT,DSK.AREAS,SIZE) 35500000
|
|
% FILE(...) OPENS A FILE, AS DESCRIBED BY THE PARAMETERS: 35510000
|
|
% NAME CONTAINS THE NAME OF THE PRIMARY I/O STRING 35520000
|
|
% I.O STARTS WITH "I" FOR INPUT FILES, "O" FOR OUTPUT FILES, AND 35530000
|
|
% IS NULL FOR FILES WITH BOTH INPUT AND OUTPUT USE. 35540000
|
|
% BUFFERS IS THE NUMBER OF BUFFER AREAS TO BE USED. 35550000
|
|
% REC.SIZE IS THE SIZE (IN CHARACTERS) OF AN I/O RECORD 35560000
|
|
% BUFF.SIZE IS THE SIZE (IN CHARACTERS) OF A BUFFER (PHYSICAL RECORD)35570000
|
|
% SAVE.FACT IS THE SAVE FACTOR FOR FILES CREATED BY THE PROGRAM 35580000
|
|
% DSK.AREAS IS THE NUMBER OF DISK AREAS FOR NEW DISK FILES ({20) 35590000
|
|
% SIZE IS THE SIZE OF ONE OF THESE DISK AREAS, IN LOGICAL RECORDS. 35600000
|
|
BEGIN 35610000
|
|
INTEGER 35620000
|
|
AREAS, 35630000
|
|
ASIZE, 35640000
|
|
BLOCKCOUNT, 35650000
|
|
BUFFERS, 35660000
|
|
BUFSIZE, 35670000
|
|
CYC, 35680000
|
|
RECSIZE, 35690000
|
|
SAVEFACTOR, 35700000
|
|
TYPEA, % "ALGOL" TYPE: 9, 10, OR 11 35710000
|
|
TYPES, % "SNOBOL" TYPE: 1, 2, OR 3 35720000
|
|
UNIT; 35730000
|
|
MONITOR PRINT (AREAS,ASIZE,BLOCKCOUNT,BUFFERS,BUFSIZE,CYC,RECSIZE, 35740000
|
|
IOSIZE,VALTABL,IOUSAGE, 35750000
|
|
SAVEFACTOR,TYPEA,TYPES,UNIT,AA,AB,AC,I1,I2); 35760000
|
|
% 35770000
|
|
GO TO UNDEFFCT; % UNTIL A WAY IS FOUND TO IMPLEMENT FILE DECLARATIONS35780000
|
|
UNIT ~ 0; 35790000
|
|
CYC ~ 16; 35800000
|
|
FOR I ~ 1 STEP 1 UNTIL FILMAX DO 35810000
|
|
IF NOT IOFILEOPEN[I] THEN 35820000
|
|
IF IOUSAGE[I].CYCLE < CYC THEN 35830000
|
|
BEGIN UNIT ~ I; CYC ~ IOUSAGE[I].CYCLE; END; 35840000
|
|
IF UNIT = 0 THEN 35850000
|
|
BEGIN MESSAGEI(14,INSTNO); % NO FILE AVAILABLE 35860000
|
|
GO TO FCTFAIL; 35870000
|
|
END; 35880000
|
|
IF SP - MKS < 3 THEN GO TO FCTFAIL; 35890000
|
|
% 35900000
|
|
AA ~ PST[MKS+1]; 35910000
|
|
AB ~ VALU[AA]; 35920000
|
|
IF AB.S = 0 THEN 35930000
|
|
BEGIN TYPEA ~ 11; 35940000
|
|
TYPES ~ 3; 35950000
|
|
END ELSE 35960000
|
|
IF (I1~CHAR(DATA[AB.R,AB.W],AB.C)) = "I" THEN 35970000
|
|
BEGIN TYPEA ~ 9; 35980000
|
|
TYPES ~ 2; 35990000
|
|
END ELSE 36000000
|
|
IF I1 = "O" THEN 36010000
|
|
BEGIN TYPEA ~ 10; 36020000
|
|
TYPES ~ 1; 36030000
|
|
END ELSE 36040000
|
|
BEGIN % ERROR: INVALID I/O TYPE 36050000
|
|
MESSAGEI(15,INSTNO); 36060000
|
|
GO TO FCTFAIL; 36070000
|
|
END; 36080000
|
|
IF NOT NUMVAL(PST[MKS+2],BUFFERS) OR BUFFERS < 1 THEN 36090000
|
|
BEGIN % ERROR: INVALID BUFFER NUMBER 36100000
|
|
MESSAGEI(16,INSTNO); 36110000
|
|
GO TO FCTFAIL; 36120000
|
|
END; 36130000
|
|
IF SP - MKS { 3 THEN RECSIZE ~ 0 ELSE 36140000
|
|
IF NOT NUMVAL(PST[MKS+3],RECSIZE) OR RECSIZE < 0 36150000
|
|
OR RECSIZE > 8182 THEN 36160000
|
|
BEGIN % ERROR: INVALID RECORD SIZE 36170000
|
|
GO TO FCTFAIL; 36180000
|
|
END; 36190000
|
|
IOSIZE[UNIT] ~ RECSIZE; 36200000
|
|
RECSIZE ~ (RECSIZE+7).W; 36210000
|
|
IF SP - MKS { 4 THEN BUFSIZE ~ 0 ELSE 36220000
|
|
IF NOT NUMVAL(PST[MKS+4],BUFSIZE) OR BUFSIZE < 0 36230000
|
|
OR BUFSIZE > 8182 THEN 36240000
|
|
BEGIN % ERROR: INVALID BUFFER SIZE 36250000
|
|
GO TO FCTFAIL; 36260000
|
|
END; 36270000
|
|
BUFSIZE ~ (BUFSIZE+7).W; 36280000
|
|
IF SP - MKS { 5 THEN SAVEFACTOR ~ 0 ELSE 36290000
|
|
IF NOT NUMVAL(PST[MKS+5],SAVEFACTOR) OR SAVEFACTOR { 0 THEN 36300000
|
|
BEGIN % ERROR: INVALID SAVEFACTOR 36310000
|
|
GO TO FCTFAIL; 36320000
|
|
END; 36330000
|
|
IF SP - MKS { 6 THEN AREAS ~ 0 ELSE 36340000
|
|
IF NOT NUMVAL(PST[MKS+6],AREAS) OR AREAS < 0 36350000
|
|
OR AREAS > 20 THEN 36360000
|
|
BEGIN % ERROR: INVALID NUMBER OF DISK AREAS 36370000
|
|
GO TO FCTFAIL; 36380000
|
|
END; 36390000
|
|
IF SP - MKS { 7 THEN ASIZE ~ 0 ELSE 36400000
|
|
IF NOT NUMVAL(PST[MKS+7],ASIZE) OR ASIZE < 0 THEN 36410000
|
|
BEGIN % ERROR: INVALID DISK AREA SIZE 36420000
|
|
GO TO FCTFAIL; 36430000
|
|
END; 36440000
|
|
CYC ~ IOUSAGE[UNIT].CYCLE; 36450000
|
|
CYC ~ CYC + 1; 36460000
|
|
% CREATE NEW FILE HERE. 36470000
|
|
GO TO SUCCEED; 36480000
|
|
END INTRINSIC FILE; 36490000
|
|
% 13: FILL(NAME,MFID,FID,MEDIA,DATE,REEL,CYCLE) FILLS THE FILE 36500000
|
|
% $NAME WITH A DESCRIPTION OF AN ACTUAL FILE, AS DESCRIBED BY 36510000
|
|
% THE PARAMETERS AS FOLLOWS: 36520000
|
|
% MFID/FID IS THE EXTERNAL NAME OF THE FILE. IF EITHER 36530000
|
|
% MFID OR FID CONTAIN MORE THAN 7 CHARS, ONLY THE FIRST 7 36540000
|
|
% WILL BE USED. IF EITHER IS NULL, "0000000" WILL BE USED. 36550000
|
|
% MEDIA IS ONE OF THE MEDIA DIGITS LISTED IN THE ALGOL MANUAL. 36560000
|
|
% DATE IS THE DATE THAT SHOULD BE USED WITH OUTPUT FILES, 36570000
|
|
% USUALLY THE CURRENT DATE. IT CAN BE IN THE FORM MM/DD/YY 36580000
|
|
% OR THE FORM YYDDD (WHICH IS HOW IT IS STORED IN THE 36590000
|
|
% STANDARD FILE LABEL). 36600000
|
|
% REEL IS THE REEL NUMBER, FOR MULTI-REEL TAPES 36610000
|
|
% CYCLE IS THE CYCLE NUMBER, ALSO FOR TAPES MAINLY. 36620000
|
|
% IF ANY OF THE PARAMETERS IS MISSING, IT WILL NOT BE ASSIGNED; 36630000
|
|
% THUS, MULTIPLE CALLS OF FILL() CAN FILL IN DIFFERENT PIECES OF 36640000
|
|
% INFORMATION. IF FILE() IS TO BE EFFECTIVE, IT MUST BE USED 36650000
|
|
% BEFORE ANY I/O IS DONE ON THE FILE. 36660000
|
|
BEGIN ALPHA ST, SIO, MFID, FID, D, M, Y; 36670000
|
|
INTEGER MED, REEL, CYC; 36680000
|
|
IF SP { MKS THEN GO TO FCTFAIL; 36690000
|
|
IF SP - MKS < 3 THEN 36700000
|
|
IF NOT NULLARGS(3-SP+MKS) THEN GO TO FCTFAIL; 36710000
|
|
INDIRECT(MKS); 36720000
|
|
ST ~ PST[MKS]; 36730000
|
|
IF VALU[ST].IOUSE = 0 THEN GO TO FCTFAIL; 36740000
|
|
SIO ~ IO[ST]; 36750000
|
|
% GET MFID: 36760000
|
|
AA ~ PST[MKS+1]; 36770000
|
|
AB ~ VALU[AA]; 36780000
|
|
IF AB.S = 0 THEN MFID ~ -1 ELSE 36790000
|
|
BEGIN MV(7,BLANKS,1,MFID,1); 36800000
|
|
MV(MIN(7,AB.S),FIRSTCHAR(AB),MFID,1); 36810000
|
|
END; 36820000
|
|
MFID ~ MFID; 36830000
|
|
% GET FID: 36840000
|
|
AA ~ PST[MKS+2]; 36850000
|
|
AB ~ VALU[AA]; 36860000
|
|
IF AB.S = 0 THEN FID ~ -1 ELSE 36870000
|
|
BEGIN MV(7,BLANKS,1,FID,1); 36880000
|
|
MV(MIN(7,AB.S),FIRSTCHAR(AB),FID,1); 36890000
|
|
END; 36900000
|
|
FID ~ FID; 36910000
|
|
% GET MEDIA DIGIT: 36920000
|
|
IF SP-MKS{3 OR VALTABL[(AA~PST[MKS+3]).STR,AA.STW].S = 0 36930000
|
|
THEN MED ~ -1 ELSE 36940000
|
|
IF NOT NUMVAL(AA,MED) THEN GO TO FCTFAIL; 36950000
|
|
MED ~ MED; 36960000
|
|
% GET DATE: 36970000
|
|
IF SP-MKS { 4 OR VALTABL[(AA~PST[MKS+4]).STR,AA.STW].S = 0 36980000
|
|
THEN D ~ -1 ELSE 36990000
|
|
BEGIN AA ~ PST[MKS+4]; 37000000
|
|
AB ~ VALU[AA]; 37010000
|
|
IF AB.S = 0 THEN D ~ -1 ELSE 37020000
|
|
IF AB.S = 5 THEN 37030000
|
|
MV(5,FIRSTCHAR(AB),D,3) ELSE 37040000
|
|
IF AB.S = 8 THEN 37050000
|
|
BEGIN MV(8,FIRSTCHAR(AB),D,0); 37060000
|
|
IF CHAR(D,0) > 1 THEN GO TO FCTFAIL; 37070000
|
|
IF D.[12:8] ! "/" OR D.[30:6] ! "/" THEN GO TO FCTFAIL; 37080000
|
|
Y ~ D.[36:12]; 37090000
|
|
M ~ D.[1:5] | 10 + D.[6:6]; 37100000
|
|
IF M > 12 THEN GO TO FCTFAIL; 37110000
|
|
D ~ D.[18:6] | 10 + D.[24:6]; 37120000
|
|
IF D > 31 THEN GO TO FCTFAIL; 37130000
|
|
FOR I ~ 1 STEP 1 UNTIL M DO D ~ D + MONTHS[I]; 37140000
|
|
D ~ ENTIER(D MOD 10) & Y[18:36:12] & 37150000
|
|
ENTIER(D DIV 100)[30:42:6] & 37160000
|
|
ENTIER((D MOD 100) DIV 10)[36:42:6]; 37170000
|
|
END; 37180000
|
|
END; 37190000
|
|
% FIND REEL NUMBER: 37200000
|
|
IF (IF SP-MKS{5 THEN T ELSE VALTABL[(AA~PST[MKS+5]).STR,AA.STW].S=0) 37210000
|
|
THEN REEL ~ -1 ELSE 37220000
|
|
IF NOT NUMVAL(AA,REEL) THEN GO TO FCTFAIL; 37230000
|
|
% FIND CYCLE NUMBER: 37240000
|
|
IF (IF SP-MKS{6 THEN T ELSE VALTABL[(AA~PST[MKS+6]).STR,AA.STW].S=0) 37250000
|
|
THEN CYC ~ -1 37260000
|
|
ELSE IF NOT NUMVAL(AA,CYC) THEN GO TO FCTFAIL; 37270000
|
|
% FOUND PARAMETERS; FILL FILE: 37280000
|
|
% NOTE THAT A FILL ELEMENT OF -1 MEANS "NO CHANGE". 37290000
|
|
FILL IOFILE[SIO.FILNO] WITH MFID, FID, REEL, D, CYC, MED; 37300000
|
|
GO TO SUCCEED; 37310000
|
|
END FILL; 37320000
|
|
% 14: .GE(A,B) SUCCEEDS IFF A AND B ARE NUMERIC AND A } B. 37330000
|
|
BEGIN SEGMENT 37340000
|
|
IF SP - MKS < 2 THEN 37350000
|
|
IF NOT NULLARGS(2-SP+MKS) THEN GO TO FCTFAIL; 37360000
|
|
IF NUMVAL(PST[MKS],AA) AND NUMVAL(PST[MKS+1],AB) 37370000
|
|
THEN GO TO IF AA } AB THEN SUCCEED ELSE FCTFAIL; 37380000
|
|
IF PRINTMESSAGES THEN 37390000
|
|
BEGIN MESSAGEAI(0,"GE",INSTNO); 37400000
|
|
MESSAGETTAI(0,"GE",INSTNO); 37410000
|
|
END; 37420000
|
|
GO TO FCTFAIL; 37430000
|
|
END LGE; 37440000
|
|
% 15: .GT(A,B) 37450000
|
|
% .GT(A,B) SUCCEEDS IFF A AND B ARE BOTH NUMERIC AND A > B. 37460000
|
|
BEGIN SEGMENT 37470000
|
|
IF SP - MKS < 2 THEN 37480000
|
|
IF NOT NULLARGS(2-SP+MKS) THEN GO TO FCTFAIL; 37490000
|
|
IF NUMVAL(PST[MKS],AA) AND NUMVAL(PST[MKS+1],AB) 37500000
|
|
THEN GO TO IF AA > AB THEN SUCCEED ELSE FCTFAIL; 37510000
|
|
IF PRINTMESSAGES THEN 37520000
|
|
BEGIN MESSAGEAI(0,"GT",INSTNO); 37530000
|
|
MESSAGETTAI(0,"GT",INSTNO); 37540000
|
|
END; 37550000
|
|
GO TO FCTFAIL; 37560000
|
|
END LGT; 37570000
|
|
% 16: .LE(A,B) 37580000
|
|
% .LE(A,B) SUCCEEDS IFF A AND B ARE BOTH NUMERIC AND A { B. 37590000
|
|
BEGIN SEGMENT 37600000
|
|
IF SP - MKS < 2 THEN IF NOT NULLARGS(2-SP+MKS) THEN GO TO FCTFAIL; 37610000
|
|
IF NUMVAL(PST[MKS],AA) AND NUMVAL(PST[MKS+1],AB) 37620000
|
|
THEN GO TO IF AA { AB THEN SUCCEED ELSE FCTFAIL; 37630000
|
|
IF PRINTMESSAGES THEN 37640000
|
|
BEGIN MESSAGEAI(0,"LE",INSTNO); 37650000
|
|
MESSAGETTAI(0,"LE",INSTNO); 37660000
|
|
END; 37670000
|
|
GO TO FCTFAIL; 37680000
|
|
END LLE; 37690000
|
|
% 17: LEVEL() 37700000
|
|
% LEVEL() RETURNS THE LEVEL AT WHICH THE PROGRAM IS CURRENTLY 37710000
|
|
% OPERATING. THE LEVEL IS DEFINED AS FOLLOWS: IT IS 1 AT THE 37720000
|
|
% START OF THE PROGRAM; IT INCREASES BY 1 WITH EACH CALL ON A 37730000
|
|
% PROGRAMMER-DEFINED FUNCTION; AND IT DECREASES BY 1 AT EACH 37740000
|
|
% RETURN (OR FRETURN). 37750000
|
|
BEGIN SEGMENT 37760000
|
|
RETURNVAL ~ TEMPVAL(LEVEL); 37770000
|
|
GO TO SUCCEED; 37780000
|
|
END; % LEVEL() 37790000
|
|
% 18: LOOK(S,F) 37800000
|
|
% LOOK(S,F) TURNS THE STRING $S INTO A NON-READINT I/O STRING FOR 37810000
|
|
% THE INPUT FILE BELONGING TO THE STRING $F. IF $F IS NOT AN INPUT 37820000
|
|
% STRING (NOT DATACOMM), LOOK FCTFAILS. 37830000
|
|
BEGIN SEGMENT 37840000
|
|
IF SP - MKS < 2 THEN GO TO FCTFAIL; 37850000
|
|
INDIRECT(MKS); 37860000
|
|
AA ~ PST[MKS]; 37870000
|
|
INDIRECT(MKS+1); 37880000
|
|
AB ~ PST[MKS+1]; 37890000
|
|
AC ~ IOTABL[AB.STR,AB.STW]; 37900000
|
|
IF NOT BOOLEAN(AC.INUSE) OR AC.FILNO=0 THEN GO TO FCTFAIL; 37910000
|
|
VALU[AA].IOUSE ~ 2; 37920000
|
|
IO[AA] ~ 0 & 2 CIOUSE & 2 CIOTYPE & AC TFILNO; 37930000
|
|
GO TO SUCCEED; 37940000
|
|
END; 37950000
|
|
% 19: .LT(A,B) 37960000
|
|
% .LT(A,B) SUCCEEDS IFF A AND B ARE BOTH NUMERIC AND A < B. 37970000
|
|
BEGIN SEGMENT 37980000
|
|
IF SP-MKS < 2 THEN IF NOT NULLARGS(2-SP+MKS) THEN GO TO FCTFAIL; 37990000
|
|
IF NUMVAL(PST[MKS],AA) AND NUMVAL(PST[MKS+1],AB) 38000000
|
|
THEN GO TO IF AA < AB THEN SUCCEED ELSE FCTFAIL; 38010000
|
|
IF PRINTMESSAGES THEN 38020000
|
|
BEGIN MESSAGEAI(0,"LT",INSTNO); 38030000
|
|
MESSAGETTAI(0,"LT",INSTNO); 38040000
|
|
END; 38050000
|
|
GO TO FCTFAIL; 38060000
|
|
END LT; 38070000
|
|
% 20: MODE(V) 38080000
|
|
% MODE(V) SETS SYSTEM VARIABLE, DEPENDING ON THE CONTENTS OF V. 38090000
|
|
% THE VALUES CURRENTLY RECOGNIZED FOR V ARE: 38100000
|
|
% "DUMP" EXECUTE DUMP() AT END-OF-JOB. 38110000
|
|
% "ROUND" ROUND QUOTIENTS OF DIVISIONS (STANDARD). 38120000
|
|
% "INTEGER" DIVISION FCTFAILS IF REMAINDER ! 0. 38130000
|
|
% "TRUNCATION" TRUNCATE QUOTIENTS. 38140000
|
|
% "ANCHOR" ALL SCANS ARE ANCHORED UNLESS UNANCH() IS USED. 38150000
|
|
% "UNANCH" ALL SCANS ARE UNANCHORED, UNLESS ANCHOR() IS USED 38160000
|
|
% "UNANCHOR" SAME AS "UNANCH" (STANDARD). 38170000
|
|
% "INFORM" TURN ON SYSTEM DEBUGGING OUTPUT. 38180000
|
|
% "SILENCE" TURN OFF DEBUGGING OUTPUT (STANDARD). 38190000
|
|
BEGIN ALPHA ARRAY WORD[0:1]; 38200000
|
|
IF SP { MKS THEN GO TO FCTFAIL; 38210000
|
|
AA ~ PST[MKS]; 38220000
|
|
AB ~ VALU[AA]; 38230000
|
|
IF (I1~AB.S) < 3 OR I1 > 10 THEN GO TO FCTFAIL; 38240000
|
|
MV(I1,FIRSTCHAR(AB),WORD[*],0); 38250000
|
|
CASE I1 OF 38260000
|
|
BEGIN ;;; % NONE OF SIZE 0, 1, OR 2. 38270000
|
|
IF EQ(3,WORD[*],0,WORDS[13],5) THEN 38280000
|
|
BEGIN DEBUGGING ~ FALSE; % RUN 38290000
|
|
SETLIMITFLAG; 38300000
|
|
GO TO SUCCEED; 38310000
|
|
END; 38320000
|
|
IF EQUAL(4,WORD[*],0,WORDS[1],3) THEN 38330000
|
|
BEGIN DMPSTR ~ TRUE; % DUMP 38340000
|
|
GO TO SUCCEED; 38350000
|
|
END; 38360000
|
|
IF EQUAL(5,WORD[*],0,WORDS[0],7) THEN 38370000
|
|
BEGIN DIVIDEMODE ~ 0; % ROUND 38380000
|
|
GO TO SUCCEED; 38390000
|
|
END ELSE 38400000
|
|
IF EQ(5,WORD[*],0,WORDS[13],0) THEN 38410000
|
|
BEGIN DEBUGGING ~ TRUE; % DEBUG 38420000
|
|
SETLIMITFLAG; 38430000
|
|
GO TO SUCCEED; 38440000
|
|
END; 38450000
|
|
IF EQUAL(6,WORD[*],0,WORDS[0],2) THEN 38460000
|
|
BEGIN IF SP - MKS > 1 THEN % ANCHOR 38470000
|
|
BEGIN IF NOT NUMVAL(PST[MKS+1],I2) OR I2 < 0 OR I2 > 8191 38480000
|
|
THEN GO TO FCTFAIL; 38490000
|
|
ANCHORSIZE ~ I2; 38500000
|
|
END; 38510000
|
|
ANCHORMODE ~ 3; 38520000
|
|
GO TO SUCCEED; 38530000
|
|
END ELSE 38540000
|
|
IF EQUAL(6,WORD[*],0,WORDS[0],0) THEN 38550000
|
|
BEGIN ANCHORMODE ~ 2; % UNANCH 38560000
|
|
ANCHORSIZE ~ 0; 38570000
|
|
GO TO SUCCEED; 38580000
|
|
END ELSE 38590000
|
|
IF EQUAL(6,WORD[*],0,WORDS[4],6) THEN 38600000
|
|
BEGIN PRINTMESSAGES ~ TRUE; % INFORM 38610000
|
|
INFORM ~ SYSTEMDEBUGGING; 38620000
|
|
GO TO SUCCEED; 38630000
|
|
END; 38640000
|
|
IF EQUAL(7,WORD[*],0,WORDS[2],0) THEN 38650000
|
|
BEGIN DIVIDEMODE ~ 2; % INTEGER 38660000
|
|
GO TO SUCCEED; 38670000
|
|
END ELSE 38680000
|
|
IF EQUAL(7,WORD[*],0,WORDS[5],4) THEN 38690000
|
|
BEGIN % SILENCE 38700000
|
|
PRINTMESSAGES ~ INFORM ~ FALSE; 38710000
|
|
GO TO SUCCEED; 38720000
|
|
END ELSE 38730000
|
|
IF EQ(7,WORD[*],0,WORDS[14],0) THEN 38740000
|
|
BEGIN ERRDUMP ~ TRUE; % ERRDUMP 38750000
|
|
GO TO SUCCEED; 38760000
|
|
END; 38770000
|
|
IF EQUAL(8,WORD[*],0,WORDS[0],0) THEN 38780000
|
|
BEGIN ANCHORMODE ~ 2; % UNANCHOR 38790000
|
|
ANCHORSIZE ~ 0; 38800000
|
|
GO TO SUCCEED; 38810000
|
|
END ELSE 38820000
|
|
IF EQ(8,WORD[*],0,WORDS[14],7) THEN % TRUNCATE, FILE 38830000
|
|
BEGIN IF SP < MKS+2 THEN GO TO FCTFAIL; 38840000
|
|
INDIRECT(MKS+2); 38850000
|
|
AA ~ PST[MKS+1]; 38860000
|
|
AB ~ IO[AA]; 38870000
|
|
IF BOOLEAN(AB.OUTUSE) THEN IF AB.FILNO ! 0 THEN 38880000
|
|
BEGIN IO[AA].OVFL ~ 0; 38890000
|
|
GO TO SUCCEED; 38900000
|
|
END; 38910000
|
|
GO TO FCTFAIL; 38920000
|
|
END ELSE 38930000
|
|
IF EQ(8,WORD[*],0,WORDS[15],7) THEN % OVERFLOW, FILE 38940000
|
|
BEGIN IF SP < MKS+2 THEN GO TO FCTFAIL; 38950000
|
|
INDIRECT(MKS+1); 38960000
|
|
AA ~ PST[MKS+1]; 38970000
|
|
AB ~ IO[AA]; 38980000
|
|
IF BOOLEAN(AB.OUTUSE) THEN IF AB.FILNO ! 0 THEN 38990000
|
|
BEGIN IO[AA].OVFL ~ 1; 39000000
|
|
GO TO SUCCEED; 39010000
|
|
END; 39020000
|
|
GO TO FCTFAIL; 39030000
|
|
END; 39040000
|
|
; % NONE WITH 9 CHARS 39050000
|
|
IF EQUAL(10,WORD[*],0,WORDS[2],7) THEN 39060000
|
|
BEGIN DIVIDEMODE ~ 1; % TRUNCATION 39070000
|
|
GO TO SUCCEED; 39080000
|
|
END; 39090000
|
|
END; 39100000
|
|
GO TO FCTFAIL; 39110000
|
|
END; % MODE(V) 39120000
|
|
% 21: .NE(A,B) 39130000
|
|
% .NE(A,B) SUCCEEDS IFF A AND B ARE BOTH NUMERIC AND A ! B. 39140000
|
|
BEGIN SEGMENT 39150000
|
|
IF SP-MKS < 2 THEN IF NOT NULLARGS(2-SP+MKS) THEN GO TO FCTFAIL; 39160000
|
|
IF NUMVAL(PST[MKS],AA) AND NUMVAL(PST[MKS+1],AB) 39170000
|
|
THEN GO TO IF AA ! AB THEN SUCCEED ELSE FCTFAIL; 39180000
|
|
IF PRINTMESSAGES THEN 39190000
|
|
BEGIN MESSAGEAI(0,"NE",INSTNO); 39200000
|
|
MESSAGETTAI(0,"NE",INSTNO); 39210000
|
|
END; 39220000
|
|
GO TO FCTFAIL; 39230000
|
|
END LNE; 39240000
|
|
% 22: .NUM(A) 39250000
|
|
% .NUM(A) SUCCEEDS IF A IS NUMERIC; THAT IS, IF A IS NULL, OR 39260000
|
|
% A IS NOT NULL AND THE FIRST CHAR OF A IS "-" OR A DIGIT AND 39270000
|
|
% THE OTHER CHARS OF A ARE ALL DIGITS. 39280000
|
|
BEGIN SEGMENT 39290000
|
|
IF MKS = SP THEN GO TO SUCCEED; 39300000
|
|
GO TO IF NUMVAL(PST[MKS],AA) THEN SUCCEED ELSE FCTFAIL; 39310000
|
|
END LNUM; 39320000
|
|
% 23: OPSYN(S1,S2,T) 39330000
|
|
% OPSYN(S1,S2,T) CAUSES THE ALTERING OF THE SYMBOL TABLE ENTRY 39340000
|
|
% DESCRIBED BY S1 AND T; THE QUANTITY NAMED BY S1 IS SET TO BE 39350000
|
|
% IDENTICAL TO THE QUANTITY NAMED BY S2. THE TYPES OF THE QUANTITIES39360000
|
|
% ARE DETERMINED BY T AS FOLLOWS: 39370000
|
|
% T IS NULL: S1 AND S2 NAME FUNCTIONS. 39380000
|
|
% T STARTS WITH "F": S1 AND S2 NAME FUNCTIONS. 39390000
|
|
% T STARTS WITH "S": S1 AND S2 NAME STRINGS. 39400000
|
|
% T STARTS WITH "L": S1 AND S2 NAME LABELS. 39410000
|
|
% NOT ONLY THE VALUE OF THE QUANTITY NAMED BY S2 IS COPIED, BUT 39420000
|
|
% ALSO ANY I/O USE IT MAY HAVE. THUS, OPSYN("A","B","S") CREATES 39430000
|
|
% A STRING NAMED "A" (IF ONE DOES NOT ALREADY EXIST), AND ASSIGNS 39440000
|
|
% TO A THE VALUE AND I/O USE OF B. OPSYN("F","ARGH","F") CREATES 39450000
|
|
% A FUNCTION NAMED "F", WHICH IS IDENTICAL TO THE FUNCTION ARGH. 39460000
|
|
% ANY FORMER FUNCTION NAMED "F" IS LOST. SIMILARLY, OPSYN("L1", 39470000
|
|
% ,"L2","L") CREATES A LABEL NAMED L1, WHICH IS THE SAME STATEMENT 39480000
|
|
% AS L2. ANY TRANSFER TO L1 WILL THEN RESULT IN A TRANSFER TO 39490000
|
|
% A STATEMENT THAT IS THE SAME AS L2. 39500000
|
|
BEGIN ALPHA I, TYPE; 39510000
|
|
IF SP-MKS < 3 THEN IF NOT NULLARGS(3-SP+MKS) THEN GO TO FCTFAIL; 39520000
|
|
AA ~ PST[MKS+2]; 39530000
|
|
AA ~ VALU[AA]; 39540000
|
|
IF AA.S = 0 THEN TYPE ~ "FCT" ELSE 39550000
|
|
BEGIN AA ~ CHAR(FIRSTCHAR(AA)); 39560000
|
|
TYPE ~ IF AA = "S" THEN "SYMB" ELSE % "S" STRING NAME 39570000
|
|
IF AA = "F" THEN "FCT" ELSE % "F" FUNCTION 39580000
|
|
IF AA = "L" THEN "INST" ELSE 0; % "L" LABEL 39590000
|
|
IF TYPE = 0 THEN GO TO FCTFAIL; 39600000
|
|
END; 39610000
|
|
AA ~ PST[MKS]; 39620000
|
|
AB ~ VALU[AA]; 39630000
|
|
AB ~ ENTERST(AB.S,DATA[AB.R,*],AB.CH,TYPE); 39640000
|
|
AA ~ PST[MKS + 1]; 39650000
|
|
AC ~ VALU[AA]; 39660000
|
|
AC ~ ENTERST(AC.S,DATA[AC.R,*],AC.CH,TYPE); 39670000
|
|
AA ~ VALU[AC]; 39680000
|
|
I ~ STRING(AA.S,AB); 39690000
|
|
MOVE(I.S,FIRSTCHAR(AA),FIRSTCHAR(I)); 39700000
|
|
VALU[AB] ~ I & AA[1:1:16]; 39710000
|
|
IO[AB] ~ IO[AC]; 39720000
|
|
GO TO SUCCEED; 39730000
|
|
END LOPSYN; 39740000
|
|
% 24: PAGE(N) 39750000
|
|
% PAGE(N) EJECTS THE LINE PRINTER FILE PRINT TO CHANNEL N. IF N < 0 39760000
|
|
% OR N > 11, PAGE FAILS. IF N = 0, CHANNEL 1 ( THE TOP OF THE NEXT 39770000
|
|
% PAGE) IS USED. 39780000
|
|
BEGIN SEGMENT 39790000
|
|
IF SP > MKS+1 THEN % OUTPUT FILE AS 2ND PARAMETER 39800000
|
|
BEGIN INDIRECT(MKS+1); 39810000
|
|
AB ~ PST[MKS+1]; 39820000
|
|
IF VALU[AB].IOUSE = 0 THEN GO TO FCTFAIL ELSE 39830000
|
|
IF I2~IO[AB].FILNO=0 THEN GO TO FCTFAIL; 39840000
|
|
END ELSE I2 ~ 3; % ASSUME PRINT. 39850000
|
|
IF SP = MKS THEN I1 ~ 1 ELSE 39860000
|
|
BEGIN AA ~ PST[MKS]; 39870000
|
|
IF NOT NUMVAL(AA,I1) OR I1<0 OR I1>11 THEN GO TO FCTFAIL; 39880000
|
|
IF I1 = 0 THEN I1 ~ 1; 39890000
|
|
END; 39900000
|
|
RECORD[I2] ~ I1; 39910000
|
|
GO TO SUCCEED; 39920000
|
|
END LPAGE; 39930000
|
|
% 25: POP(S) 39940000
|
|
% POP(S) POPS THE VARIABLE S--I. E., THE TOP VALUE ON THE PUSH-DOWN 39950000
|
|
% STACK OF S IS REMOVED. IF S IN NOT A NAMED STRING OR IF S CANT 39960000
|
|
% BE POPPED (ONLY ONE VALUE IN ITS STACK), POP FAILS. IF S IS AN 39970000
|
|
% OUTPUT STRING, OUTPUT OCCURS. 39980000
|
|
BEGIN SEGMENT 39990000
|
|
IF SP { MKS THEN GO TO FCTFAIL; 40000000
|
|
IF NOT PNAME[MKS] THEN GO TO FCTFAIL; 40010000
|
|
GO TO IF POP(AA~PST[MKS]) 40020000
|
|
THEN IF BOOLEAN(VALU[AA].OUTUSE) 40030000
|
|
THEN IF SNBLOUT(AA) 40040000
|
|
THEN SUCCEED 40050000
|
|
ELSE FCTFAIL 40060000
|
|
ELSE SUCCEED 40070000
|
|
ELSE FCTFAIL; 40080000
|
|
END LPOP; 40090000
|
|
% 26: PUSH(S,V) 40100000
|
|
% PUSH(S,V) PUSHES THE VALUE OF V ONTO THE TOP OF THE PUSH-DOWN 40110000
|
|
% STACK OF THE VARIABLE S. IF POP(S) IS THEN EXECUTED, S RETURNS 40120000
|
|
% TO ITS FORMER VALUE. PUSH FAILS IF S IS NOT A NAMED STRING, OR 40130000
|
|
% IF THE SYMBOL TABLE IS FULL (A FATAL ERROR). IF S IS AN OUTPUT 40140000
|
|
% STRING, OUTPUT OCCURS. 40150000
|
|
BEGIN SEGMENT 40160000
|
|
IF SP { MKS THEN GO TO FCTFAIL; 40170000
|
|
IF NOT PNAME[MKS] THEN GO TO FCTFAIL; 40180000
|
|
GO TO IF PUSH(AA~PST[MKS],IF SP-MKS { 1 THEN 0 ELSE PST[MKS+1]) 40190000
|
|
THEN IF BOOLEAN(VALU[AA].OUTUSE) 40200000
|
|
THEN IF SNBLOUT(AA) 40210000
|
|
THEN SUCCEED 40220000
|
|
ELSE FCTFAIL 40230000
|
|
ELSE SUCCEED 40240000
|
|
ELSE FCTFAIL; 40250000
|
|
END LPUSH; 40260000
|
|
% 27: .REMDR(A,B) 40270000
|
|
% .REMDR(A,B) RETURNS THE QUOTIENT OF A / B. IF EITHER A OR B 40280000
|
|
% IS NONNUMERIC, OR B = 0, .REMDR FAILS. 40290000
|
|
BEGIN SEGMENT 40300000
|
|
IF SP-MKS < 2 THEN GO TO FCTFAIL; 40310000
|
|
AA ~ PST[MKS]; 40320000
|
|
AB ~ PST[MKS+1]; 40330000
|
|
IF NOT(NUMVAL(AA,AA) AND NUMVAL(AB,AB)) THEN GO TO FCTFAIL; 40340000
|
|
IF AB = 0 THEN GO TO FCTFAIL; 40350000
|
|
RETURNVAL ~ TEMPVAL(AA - (AA DIV AB) | AB); 40360000
|
|
GO TO SUCCEED; 40370000
|
|
END LREMDR; 40380000
|
|
% 28: REWIND(F) 40390000
|
|
% REWIND(F) CAUSES THE FILE ASSOCIATED WITH $F TO BE REWOUND. 40400000
|
|
% IF $F ISNT AN I/O STRING, REWIND FAILS. 40410000
|
|
BEGIN SEGMENT 40420000
|
|
IF SP { MKS THEN GO TO FCTFAIL; 40430000
|
|
INDIRECT(MKS); 40440000
|
|
AB ~ IO[PST[MKS]]; 40450000
|
|
IF AB.IOUSE = 0 OR AB.IOTYPE ! 1 THEN GO TO FCTFAIL; 40460000
|
|
REWIND(IOFILE[AB.FILNO]); 40470000
|
|
GO TO SUCCEED; 40480000
|
|
END INTRINSIC FUNCTION REWIND; 40490000
|
|
%29: RULES(L) 40500000
|
|
% RULES(L) RETURNS THE NUMBER OF RULES EXECUTED AT LEVEL L S1E 40510000
|
|
% THE LAST TIME LEVEL L WAS REACHED. IF L = 0 (OR IS NULL), THE 40520000
|
|
% TOTAL FOR THE PROGRAM IS RETURNED. IF L { LEVEL(), THE CURRENT 40530000
|
|
% RULE BEING EXECUTED IS INCLUDED IN THE TOTAL. RULES WILL FAIL IF 40540000
|
|
% L < 0 OR L > MAXLEVEL. NOTE THAT IF RULES(L) = "0", THEN THE 40550000
|
|
% LEVEL L HAS NEVER BEEN REACHED. 40560000
|
|
BEGIN SEGMENT 40570000
|
|
AA ~ IF SP > MKS THEN PST[MKS] ELSE 0; 40580000
|
|
IF AA = 0 40590000
|
|
THEN I1 ~ 0 40600000
|
|
ELSE IF NOT NUMVAL(AA,I1) THEN GO TO FCTFAIL; 40610000
|
|
IF I1 < 0 THEN GO TO FCTFAIL; 40620000
|
|
RETURNVAL ~ TEMPVAL(IF I1 > MAXLEVEL THEN 0 ELSE RULES[I]); 40630000
|
|
GO TO SUCCEED; 40640000
|
|
END LRULES; 40650000
|
|
% 30: SIZE(S) 40660000
|
|
% SIZE(S) RETURNS THE NUMBER OF CHARACTERS IN S. 40670000
|
|
BEGIN 40680000
|
|
RETURNVAL ~ TEMPVAL(IF SP { MKS THEN 0 ELSE VALU[PST[MKS]].S); 40690000
|
|
GO TO SUCCEED; 40700000
|
|
END LSIZE; 40710000
|
|
% 31: SPACE(F,N) SETS A COUNTER FOR THE I/O FILE BELONGING TO $F, 40720000
|
|
% SO THAT ANY FURTHER I/O OPERATIONS ON THIS FILE WILL BE 40730000
|
|
% PRECEDED BY A SKIPPING OF N RECORDS. SPACE FAILS IN THE 40740000
|
|
% FOLLOWING SITUATIONS: 40750000
|
|
% N NON-NUMERIC. 40760000
|
|
% $F NOT AN I/O STRING. 40770000
|
|
% $F A DATACOMM I/O STRING. 40780000
|
|
% NOTE THAT FOR MOST FILES, N < 0 IS MEANINGLESS. ALSO, N = 0 40790000
|
|
% FOR LINE PRINTER FILES CAUSES OVERPRINTING. 40800000
|
|
BEGIN SEGMENT 40810000
|
|
IF SP { MKS+1 THEN IF NOT NULLARGS(2) THEN GO TO FCTFAIL; 40820000
|
|
INDIRECT(MKS); 40830000
|
|
AB ~ PST[MKS]; 40840000
|
|
AB ~ IO[AB]; 40850000
|
|
IF AB.IOUSE = 0 OR AB.FILNO = 0 THEN GO TO FCTFAIL; 40860000
|
|
IF NOT NUMVAL(PST[MKS+1],I1) THEN GO TO FCTFAIL; 40870000
|
|
IOSPACE[AB.FILNO] ~ I1; 40880000
|
|
GO TO SUCCEED; 40890000
|
|
END LSPACE; 40900000
|
|
% 32: TIME(N) 40910000
|
|
BEGIN ALPHA ARRAY NUM[0:1]; 40920000
|
|
STREAM PROCEDURE TEMPS(TH,TM,TS,W); 40930000
|
|
VALUE TH,TM,TS; 40940000
|
|
BEGIN DI ~ W; DS ~ 8 LIT " "; 40950000
|
|
SI ~ LOC TH; DS ~ 2 DEC; DS ~ 1 LIT ":"; 40960000
|
|
SI ~ LOC TM; DS ~ 2 DEC; DS ~ 1 LIT ":"; 40970000
|
|
SI ~ LOC TS; DS ~ 2 DEC; 40980000
|
|
END TEMPS; 40990000
|
|
INTEGER TH,TM,TS; 41000000
|
|
IF SP = MKS THEN 41010000
|
|
IF NOT NULLARGS(1) THEN GO TO FCTFAIL; 41020000
|
|
AB ~ PST[MKS]; 41030000
|
|
IF NOT NUMVAL(AB,AA) THEN GO TO FCTFAIL; 41040000
|
|
IF AA < 0 OR AA > 4 THEN GO TO FCTFAIL; 41050000
|
|
IF AA = 0 THEN 41060000
|
|
BEGIN 41070000
|
|
AA ~ TIME(1) / 60; 41080000
|
|
TH ~ ENTIER(TEMP/3600); 41090000
|
|
TM ~ ENTIER((TEMP-TH|3600)/60); 41100000
|
|
TS ~ AA - TH|3600 - TM|60; 41110000
|
|
TEMPS(TH,TM,TS,NUM[*]); 41120000
|
|
END ELSE 41130000
|
|
IF AA = 4 THEN 41140000
|
|
BEGIN CLEAR(NUM,2); 41150000
|
|
I1 ~ TIME(4); 41160000
|
|
MV(1,I1,7,NUM[*],15); 41170000
|
|
END ELSE 41180000
|
|
BEGIN RETURNVAL ~ TEMPVAL(TIME(AA)); 41190000
|
|
GO TO SUCCEED; 41200000
|
|
END; 41210000
|
|
AA ~ 16 - SKIPCHAR(" ",NUM[*],0); 41220000
|
|
RETURNVAL ~ TEMPCELL; 41230000
|
|
AC ~ STRING(AA,RETURNVAL); 41240000
|
|
MOVE(AA,NUM[*],16-AA,FIRSTCHAR(AC)); 41250000
|
|
VALU[RETURNVAL] ~ AC; 41260000
|
|
GO TO SUCCEED; 41270000
|
|
END LTIME; 41280000
|
|
% 33: TRACES(S1,S2,S3,...) TURNS ON TRACING FOR THE STRINGS 41290000
|
|
% NAMED BY S1, S2, S3, ETC. ALL OUTPUT IS TO THE STANDARD 41300000
|
|
% OUTPUT FILE, PRINT. WHENEVER ANY OF THE STRINGS IS ALTERED, 41310000
|
|
% OUTPUT OCCURS GIVING THE STATEMENT NUMBER, THE STRING NAME, AND 41320000
|
|
% THE NEW VALUE. 41330000
|
|
BEGIN SEGMENT 41340000
|
|
FOR I ~ MKS STEP 1 UNTIL SP-1 DO 41350000
|
|
BEGIN INDIRECT(I); 41360000
|
|
AA ~ PST[I]; 41370000
|
|
VALU[AA].IOUSE ~ 1; 41380000
|
|
IO[AA] ~ 0 & 3 CFILNO & 2 CIOTYPE & 1 CIOUSE; 41390000
|
|
END; 41400000
|
|
GO TO SUCCEED; 41410000
|
|
END TRACES; 41420000
|
|
% 34: TRACEF(F1,F2,F3,...) TURNS ON TRACING FOR THE FUNCTIONS 41430000
|
|
% WHOSE NAMES ARE CONTAINED IN F1, F2, F3, ETC. AFTER THIS, 41440000
|
|
% UNLESS DETACH() IS USED, EACH CALL OF ANY OF THESE FUNCTIONS 41450000
|
|
% WILL PRODUCE OUTPUT ON THE STANDARD OUTPUT FILE, PRINT, GIVING 41460000
|
|
% THE INSTRUCTION NUMBER, THE FUNCTION NAME, AND THE VALUES OF 41470000
|
|
% ALL THE PARAMETERS. 41480000
|
|
BEGIN SEGMENT 41490000
|
|
FOR I ~ MKS STEP 1 UNTIL SP-1 DO 41500000
|
|
BEGIN AA ~ PST[I]; 41510000
|
|
AB ~ VALU[AA]; 41520000
|
|
AC ~ ENTERST(AB.S,DATA[AB.R,*],AB.CH,"FCT"); 41530000
|
|
VALU[AC].IOUSE ~ 3; 41540000
|
|
IO[AC] ~ 0 & 2 CIOTYPE & 3 CFILNO & 3 CIOUSE; 41550000
|
|
END; 41560000
|
|
GO TO IF DEATH THEN FCTFAIL ELSE SUCCEED; 41570000
|
|
END TRACEF; 41580000
|
|
% 35: TRACEL(L1,L2,L3,...) TURNS ON TRACING FOR THE LABELS WHOSE 41590000
|
|
% NAMES ARE CONTAINED IN L1, L2, L3, ETC. AFTER THIS, UNLESS 41600000
|
|
% DETACH() IS USED, EACH TIME ANY OF THESE LABELS IS ENCOUNTERED, 41610000
|
|
% OUTPUT ON THE STANDARD OUTPUT FILE, PRINT, WILL OCCUR, GIVING 41620000
|
|
% THE LABEL AND THE NUMBER OF TIMES IS HAS BEEN ENCOUNTERED SO 41630000
|
|
% FAR DURING THE PROGRAM"S EXECUTION. 41640000
|
|
BEGIN SEGMENT 41650000
|
|
FOR I ~ MKS STEP 1 UNTIL SP-1 DO 41660000
|
|
BEGIN AA ~ PST[I]; 41670000
|
|
AB ~ VALU[AA]; 41680000
|
|
AC ~ ENTERST(AB.S,DATA[AB.R,*],AB.CH,"INST"); 41690000
|
|
VALU[AC].OUTUSE ~ 1; 41700000
|
|
IO[AC] ~ 0 & 2 CIOTYPE & 3 CFILNO & 1 CIOUSE; 41710000
|
|
END; 41720000
|
|
GO TO IF DEATH THEN FCTFAIL ELSE SUCCEED; 41730000
|
|
END TRACEL; 41740000
|
|
% 36: TRIM(S) RETURNS THE VALUE OF S WITH ALL TRAILING BLANKS DELETED. 41750000
|
|
BEGIN STREAM PROCEDURE TRIM(L,INC,SIZE); VALUE INC; 41760000
|
|
BEGIN LOCAL S5, S6, S7, TEMP; 41770000
|
|
LABEL TEST, RETURN; 41780000
|
|
SI ~ SIZE; SI ~ SI + 5; 41790000
|
|
DI ~ LOC S5; DI ~ DI + 7; DS ~ 1 CHR; 41800000
|
|
DI ~ LOC S6; DI ~ DI + 7; DS ~ 1 CHR; 41810000
|
|
DI ~ LOC S7; DI ~ DI + 7; DS ~ 1 CHR; 41820000
|
|
SI ~ L; SI ~ SI + INC; 41830000
|
|
S5(4(32(SI ~ SI + 32))); 41840000
|
|
S6(2(SI ~ SI + 32)); 41850000
|
|
SI ~ SI + S7; 41860000
|
|
TEST: SI ~ SI - 1; 41870000
|
|
IF SC ! " " THEN GO TO RETURN; 41880000
|
|
TEMP ~ SI; 41890000
|
|
SI ~ LOC S7; SI ~ SI + 7; 41900000
|
|
IF SC = "0" THEN 41910000
|
|
BEGIN 41920000
|
|
SI ~ LOC S6; SI ~ SI + 7; 41930000
|
|
IF SC = "0" THEN 41940000
|
|
BEGIN 41950000
|
|
SI ~ LOC S5; SI ~ SI + 7; 41960000
|
|
IF SC = "0" THEN GO TO RETURN; 41970000
|
|
TALLY ~ S5; TALLY ~ TALLY + 63; S5 ~ TALLY; 41980000
|
|
END; 41990000
|
|
TALLY ~ S6; TALLY ~ TALLY + 63; S6 ~ TALLY; 42000000
|
|
END; 42010000
|
|
TALLY ~ S7; TALLY ~ TALLY + 63; S7 ~ TALLY; 42020000
|
|
SI ~ TEMP; GO TO TEST; 42030000
|
|
RETURN: DI ~ SIZE; DI ~ DI + 5; 42040000
|
|
SI ~ LOC S5; SI ~ SI + 7; DS ~ 1 CHR; 42050000
|
|
SI ~ LOC S6; SI ~ SI + 7; DS ~ 1 CHR; 42060000
|
|
SI ~ LOC S7; SI ~ SI + 7; DS ~ 1 CHR; 42070000
|
|
END TRIM; 42080000
|
|
IF SP { MKS THEN GO TO SUCCEED; 42090000
|
|
AC ~ PST[MKS]; 42100000
|
|
AA ~ VALU[AC]; 42110000
|
|
AB ~ AA.S; 42120000
|
|
TRIM(FIRSTCHAR(AA),AB); 42130000
|
|
AC ~ TEMPCELL; 42140000
|
|
AB ~ STRING(AB,AC); 42150000
|
|
VALU[AC] ~ AB; 42160000
|
|
MOVE(AB.S,FIRSTCHAR(AA),FIRSTCHAR(AB)); 42170000
|
|
RETURNVAL ~ AC; 42180000
|
|
GO TO SUCCEED; 42190000
|
|
END LTRIM; 42200000
|
|
% 37: UNANCH() 42210000
|
|
BEGIN PTYPE[0] ~ 2; 42220000
|
|
PSIZE[0] ~ 0; 42230000
|
|
GO TO SUCCEED; 42240000
|
|
END UNANCH; 42250000
|
|
% 38: UNEQL(A,B) 42260000
|
|
BEGIN SEGMENT 42270000
|
|
IF SP-MKS < 2 THEN IF NOT NULLARGS(2-SP+MKS) THEN GO TO FCTFAIL; 42280000
|
|
AB ~ PST[MKS]; 42290000
|
|
AC ~ PST[MKS+1]; 42300000
|
|
AB ~ VALU[AB]; 42310000
|
|
AC ~ VALU[AC]; 42320000
|
|
GO TO IF AB.S ! AC.S 42330000
|
|
THEN SUCCEED 42340000
|
|
ELSE IF EQUAL(AB.S,FIRSTCHAR(AB),FIRSTCHAR(AC)) 42350000
|
|
THEN FCTFAIL 42360000
|
|
ELSE SUCCEED; 42370000
|
|
END LUNEQL; 42380000
|
|
% 39: WAIT(T) SETS THE WAITING TIME FOR TELETYPE I/O TO T SECONDS. 42390000
|
|
% IF T IS NON-NUMERIC OR < 0, WAIT(T) FAILS. 42400000
|
|
BEGIN SEGMENT 42410000
|
|
RETURNVAL ~ TEMPVAL(WAITTIME/60); % RETURN PREVIOUS WAITTIME. 42420000
|
|
IF SP > MKS THEN IF VALU[PST[MKS]].S > 0 THEN % GET NEW WAITTIME 42430000
|
|
BEGIN IF NOT NUMVAL(PST[MKS],AB) OR AB < 0 THEN GO TO FCTFAIL; 42440000
|
|
WAITTIME ~ AB | 60; 42450000
|
|
END; 42460000
|
|
GO TO SUCCEED; 42470000
|
|
END WAIT; 42480000
|
|
% 40: SUSPEND(T) SUSPENDS THE PROGRAM FOR T SECONDS. IF T IS MISSING, 42490000
|
|
% AND THERE IS A TELETYPE ATTACHED, DEBUG IS CALLED. 42500000
|
|
BEGIN LABEL NEWINST; 42510000
|
|
IF SP > MKS THEN 42520000
|
|
BEGIN IF NOT NUMVAL(PST[MKS],AA) THEN GO TO FCTFAIL; 42530000
|
|
IF AA < 0 THEN GO TO FCTFAIL; 42540000
|
|
IF AA > 0 THEN 42550000
|
|
BEGIN WHEN(AA); 42560000
|
|
GO TO SUCCEED; 42570000
|
|
END; 42580000
|
|
END; 42590000
|
|
IF NOT DATACOMF THEN FINDUSERS; 42600000
|
|
IF DATACOMF THEN 42610000
|
|
BEGIN SUSPENDREASON[0] ~ TRUE; 42620000
|
|
DEBUG(NEWINST); 42630000
|
|
END; 42640000
|
|
GO TO IF DEATH THEN FCTFAIL ELSE SUCCEED; 42650000
|
|
NEWINST: 42660000
|
|
INST[0] ~ AA & ":"[30:42:6]; % BUILD GO-TO PART 42670000
|
|
FLOC ~ 5; 42680000
|
|
ENTRY ~ 0; % SINCE INST[*] HAS BEEN ALTERED. 42690000
|
|
GO TO FCTFAIL; % TERMINATE CURRENT INSTRUCTION 42700000
|
|
END SUSPEND; 42710000
|
|
% 41: STATUS(A,I) RETURNS THE STATUS OF ATTACHED TELETYPES, AS 42720000
|
|
% GIVEN BY A, WHICH IS EITHER NULL OR A TELETYPE ADDRESS. I IS THE 42730000
|
|
% INTEGER IN THE ALGOL STATUS(S,I) FUNCTION. IF A IS NULL, THE 42740000
|
|
% STATUS OF ALL ATTACHED TELETYPES IS RETURNED. 42750000
|
|
% THE FORM OF THE STATUS FOR ONE TELETYPE IS: 42760000
|
|
% <STATUS> ::= ( <PROJ#> / <USER#> : <TU> / <BA> : <CONDITIONS> )42770000
|
|
% WHERE <PROJ#>/<USER#> IS THE USER I. D., <TU>/<BA> IS THE ADDRESS 42780000
|
|
% OF THE TELETYPE, AND <CONDITIONS> IS A STRING OF 8 0-S OR 1-S 42790000
|
|
% WITH THE FOLLOWING MEANINGS: 42800000
|
|
% 1ST = 1 IF UNIT IS READY 42810000
|
|
% 2ND = 1 IF UNIT IS READ READY 42820000
|
|
% 3RD = 1 IF UNIT IS WRITE READY 42830000
|
|
% 4TH = 1 IF WRITE IS IN PROGRESS 42840000
|
|
% 5TH = 1 IF BREAK KEY USED DURING LAST OUTPUT 42850000
|
|
% 6TH = 1 IF ABNORMAL CONDITION SENSED 42860000
|
|
% 7TH = 1 IF UNIT IS BUSY 42870000
|
|
% 8TH = 1 IF SEEK IN EFFECT ON STATION 42880000
|
|
% WHEN THE STATUS OF ALL TELETYPES IS RETURNED, THE FORM OF 42890000
|
|
% THE VALUE IS: 42900000
|
|
% <STATUS> <STATUS> <STATUS> ... <STATUS> 42910000
|
|
% I. E., THERE IS ONE <STATUS> FOR EACH ATTACHED TELETYPE. 42920000
|
|
% STATUS() FAILS IF: 42930000
|
|
% A IS NOT NULL, AND IS NOT THE ADDRESS OF AN ATTACHED TELETYPE 42940000
|
|
% A IS NULL, AND TO TELETYPES ARE ATTACHED 42950000
|
|
BEGIN 42960000
|
|
ALPHA ARRAY STTS[0:4|TTMAX]; % FOR BUILDING STATUS STRING 42970000
|
|
INTEGER ARRAY SIZE[0:TTMAX,0:3]; % HOLDS SIZES OF STATUS NUMBERS 42980000
|
|
INTEGER HIGH, LOW, N, STYPE, U; 42990000
|
|
BOOLEAN ALL; 43000000
|
|
% 43010000
|
|
FINDUSERS; 43020000
|
|
IF SP { MKS THEN ALL ~ TRUE ELSE 43030000
|
|
BEGIN % FIND UNIT OR UNITS: 43040000
|
|
AA ~ PST[MKS]; 43050000
|
|
IF VALU[AA].S = 0 THEN ALL ~ TRUE ELSE 43060000
|
|
BEGIN ALL ~ FALSE; % ONLY ONE UNIT. 43070000
|
|
IF U~TTINDEX(AA) < 0 THEN GO TO FCTFAIL; 43080000
|
|
END; 43090000
|
|
END FINDING UNITS; 43100000
|
|
IF SP { MKS+1 THEN STYPE ~ 0 ELSE 43110000
|
|
IF NOT NUMVAL(PST[MKS+1],STYPE) OR STYPE < 0 OR STYPE > 1 43120000
|
|
THEN GO TO FCTFAIL; 43130000
|
|
IF N~NUMUSERS-1 < 0 THEN GO TO FCTFAIL; 43140000
|
|
LOW ~ -1; 43150000
|
|
IF ALL THEN 43160000
|
|
BEGIN LOW ~ 0; 43170000
|
|
HIGH ~ N; 43180000
|
|
END ELSE HIGH ~ LOW ~ U; 43190000
|
|
% UPDATE STATUS WORDS IF NECESSARY: 43200000
|
|
IF STYPE > 0 THEN 43210000
|
|
FOR I ~ LOW STEP 1 UNTIL HIGH DO 43220000
|
|
STAT[I] ~ STATUS(STAT[I],STYPE); 43230000
|
|
% 43240000
|
|
% OTHER INSTALLATIONS WILL WANT TO RE-DO THE I.D. PART OF THIS FCT 43250000
|
|
% 43260000
|
|
% WRITE STATUS STRING: 43270000
|
|
WRITE(STTS[*],FSTAT,HIGH-LOW+1,FOR I ~ LOW STEP 1 UNTIL HIGH DO 43280000
|
|
[SIZE[I,0]~DIGITS(ID[I].[12:18]), % I.D. PART 43290000
|
|
ID[I].[12:18], % PROJ # % I.D. PART 43300000
|
|
SIZE[I,1]~DIGITS(ID[I].[30:18]), % I.D. PART 43310000
|
|
ID[I].[30:18], % USER # % I.D. PART 43320000
|
|
SIZE[I,2]~DIGITS(STAT[I].[9:4]), 43330000
|
|
STAT[I].[9:4], % TERMINAL UNIT 43340000
|
|
SIZE[I,3]~DIGITS(STAT[I].[14:4]), 43350000
|
|
STAT[I].[14:4], % BUFFER ADDRESS 43360000
|
|
1-STAT[I].[30:1], % READY 43370000
|
|
STAT[I].[24:1], % READ READY 43380000
|
|
STAT[I].[27:1], % WRITE READY 43390000
|
|
STAT[I].[29:1], % WRITE IN PROGRESS 43400000
|
|
STAT[I].[26:1], % BREAK KEY ON LAST INPUT 43410000
|
|
STAT[I].[23:1], % ABNORMAL CONDITION SENSED 43420000
|
|
STAT[I].[22:1], % STATION BUSY 43430000
|
|
STAT[I].[38:1]]); % SEEK IN EFFECT 43440000
|
|
% CALCULATE SIZE OF STRING: 43450000
|
|
I1 ~ 0; 43460000
|
|
FOR I ~ LOW STEP 1 UNTIL HIGH DO % CALCULATE SIZE OF STRING 43470000
|
|
BEGIN I1 ~ I1 + 14; % FOR "(/:/:)" & CONDITIONS 43480000
|
|
FOR J ~ 0 STEP 1 UNTIL 3 DO 43490000
|
|
I1 ~ I1 + SIZE[I,J]; 43500000
|
|
END; 43510000
|
|
% SET UP STRING FOR RETURN VALUE: 43520000
|
|
RETURNVAL ~ TEMPCELL; 43530000
|
|
AA ~ STRING(I1,RETURNVAL); 43540000
|
|
IF DEATH THEN GO TO FCTFAIL; 43550000
|
|
MOVE(I1,STTS[*],0,FIRSTCHAR(AA)); 43560000
|
|
VALU[RETURNVAL] ~ AA; 43570000
|
|
GO TO SUCCEED; 43580000
|
|
END STATUS; 43590000
|
|
% 42: USER(A) OR USER() HAS TWO USES. IF USED WITHOUT PARAMETER, 43600000
|
|
% IT RETURNS THE ADDRESS OF THE TELETYPE ON WHICH THE LAST TELETYPE 43610000
|
|
% I/O TOOK PLACE. IF IT HAS A PARAMETER, IT MUST BE THE ADDRESS OF 43620000
|
|
% AN ATTACHED TELETYPE; FURTHER OUTPUT WILL BE TO THIS TELETYPE, 43630000
|
|
% AND THE VALUE RETURNED WILL BE A. 43640000
|
|
BEGIN INTEGER TU, BA; 43650000
|
|
ALPHA ARRAY ADDR[0:1]; 43660000
|
|
FINDUSERS; 43670000
|
|
IF NOT DATACOMF THEN GO TO FCTFAIL; 43680000
|
|
IF SP > MKS THEN 43690000
|
|
BEGIN I1 ~ PST[MKS]; 43700000
|
|
IF VALU[I1].S ! 0 THEN 43710000
|
|
BEGIN IF I1 ~ TTINDEX(I1) < 0 THEN GO TO FCTFAIL; 43720000
|
|
USER ~ I1; 43730000
|
|
END; 43740000
|
|
END; 43750000
|
|
I2 ~ STAT[USER].[9:9]; 43760000
|
|
WRITE(ADDR[*],FTTADDR,I~DIGITS(I2.[39:4]),I2.[39:4], 43770000
|
|
J~DIGITS(I2.[44:4]),I2.[44:4]); 43780000
|
|
I ~ I + J + 1; 43790000
|
|
RETURNVAL ~ TEMPCELL; 43800000
|
|
AB ~ STRING(I,RETURNVAL); 43810000
|
|
MV(I,ADDR[*],0,FIRSTCHAR(AB)); 43820000
|
|
VALU[RETURNVAL] ~ AB; 43830000
|
|
GO TO IF DEATH THEN FCTFAIL ELSE SUCCEED; 43840000
|
|
END USER; 43850000
|
|
% 43: SEEK(U) DOES A READ SEEK ON TERMINAL UNIT U. 43860000
|
|
BEGIN SEGMENT 43870000
|
|
IF SP { MKS THEN GO TO FCTFAIL; 43880000
|
|
FINDUSERS; 43890000
|
|
IF I~TTINDEX(PST[MKS]) < 0 THEN GO TO FCTFAIL; 43900000
|
|
AA ~ STAT[I]; 43910000
|
|
SEEK(DCIN(AA)); 43920000
|
|
GO TO SUCCEED; 43930000
|
|
END SEEK; 43940000
|
|
% 44: RELEASE(A) ELIMINATES TELETYPE A FROM THE LIST OF USERS. 43950000
|
|
BEGIN SEGMENT 43960000
|
|
IF SP { MKS THEN GO TO FCTFAIL; 43970000
|
|
IF I~TTINDEX(PST[MKS]) < 0 THEN GO TO FCTFAIL; 43980000
|
|
RELEASE(STAT[I]); 43990000
|
|
FINDUSERS; 44000000
|
|
GO TO SUCCEED; 44010000
|
|
END RELEASE; 44020000
|
|
% 45: RECORD(FILE,N) SETS THE RECORD POINTER FOR THE NEXT I/O 44030000
|
|
% OPERATION ON THE FILE $FILE. FAILURE OCCURS IF: 44040000
|
|
% N NON-NUMERIC OR < 0 44050000
|
|
% $FILE NOT AN I/O STRING (NOT TELETYPE) 44060000
|
|
BEGIN SEGMENT 44070000
|
|
IF SP < MKS+2 THEN IF NOT NULLARGS(2) THEN GO TO FCTFAIL; 44080000
|
|
IF NOT NUMVAL(PST[MKS+1],I1) OR I1 < 0 THEN GO TO FCTFAIL; 44090000
|
|
INDIRECT(MKS); 44100000
|
|
AA ~ PST[MKS]; 44110000
|
|
AB ~ IO[AA]; 44120000
|
|
IF AB.IOUSE = 0 OR AB.FILNO = 0 THEN GO TO FCTFAIL; 44130000
|
|
RECORD[AB.FILNO] ~ I1; 44140000
|
|
GO TO SUCCEED; 44150000
|
|
END RECORD; 44160000
|
|
% 46: TRACE(NAME,TYPE,FILE,FCT) 44170000
|
|
GO TO UNDEFFCT; 44180000
|
|
% 47: ASSIGN(S,V) ASSIGNS THE VALUE OF V TO S. THE VALUE OF V IS 44190000
|
|
% WIPED OUT, S1E A STRICT TRANSFER OF POINTERS IS THE METHOD 44200000
|
|
% USED. LITERALS SHOULD NEVER BE USED AS PARAMETERS TO ASSIGN(). 44210000
|
|
BEGIN 44220000
|
|
IF SP{MKS OR AA~PST[MKS]=0 THEN GO TO FCTFAIL; 44230000
|
|
IF SP = MKS+1 THEN 44240000
|
|
VALU[AA].LOC ~ 1 ELSE 44250000
|
|
BEGIN 44260000
|
|
AB ~ PST[MKS+1]; 44270000
|
|
AC ~ VALU[AB]; 44280000
|
|
I ~ AC.CH - 2; 44290000
|
|
MV(2,AA,6,DATA[AC.R,I.W],I.C); 44300000
|
|
VALU[AA].LOC ~ AC; 44310000
|
|
VALU[AB].LOC ~ 1; % NECESSARY DUE TO CHECKSYMBTABL 44320000
|
|
END; 44330000
|
|
GO TO SUCCEED; 44340000
|
|
END ASSIGN; 44350000
|
|
% 48: COPY(S,N) PRODUCES N COPIES OF S. IF N IS NOT } 0, COPY FAILS. 44360000
|
|
BEGIN SEGMENT 44370000
|
|
IF SP-MKS < 2 THEN IF NOT NULLARGS(2-SP+MKS) THEN GO TO FCTFAIL; 44380000
|
|
AA ~ VALU[PST[MKS]]; 44390000
|
|
IF NOT NUMVAL(PST[MKS+1],I1) OR I1<0 THEN GO TO FCTFAIL; 44400000
|
|
RETURNVAL ~ TEMPCELL; 44410000
|
|
AC ~ STRING(I1|(J~AA.S),RETURNVAL); 44420000
|
|
IF DEATH THEN GO TO FCTFAIL; 44430000
|
|
I2 ~ AC.CH; 44440000
|
|
FOR I ~ 1 STEP 1 UNTIL I1 DO 44450000
|
|
BEGIN MOVE(J,FIRSTCHAR(AA),DATA[AC.R,I2.W],I2.C); 44460000
|
|
I2 ~ I2 + J; 44470000
|
|
END; 44480000
|
|
VALU[RETURNVAL] ~ AC; 44490000
|
|
GO TO SUCCEED; 44500000
|
|
END COPY; 44510000
|
|
% 49: SEARCH(FILE) DOES A DISK SEARCH FOR $FILE, IF $FILE IS AN I/O 44520000
|
|
% STRING TO A FILE; OTHERWISE SEARCH FAILS. FAILURE ALSO OCCURS 44530000
|
|
% IF THE FILE IS NOT PRESENT. IF IT IS PRESENT, THE VALUE IS OF 44540000
|
|
% THE FOLLOWING FORM: 44550000
|
|
% <MFID> / <FID> : <SECURITY> : <REC SIZE> : <BLCK SIZE> : 44560000
|
|
% <EOF ADDR> : <OPEN CNT> 44570000
|
|
% WHERE THE SECURITY STATUS, <SECURITY>, IS DEFINED BY: 44580000
|
|
% <SECURITY> ::= <S> <R> <W> 44590000
|
|
% <S> ::= "1" IF USER CAN ALTER SECURITY STATUS 44600000
|
|
% <R> ::= "1" IF CAN READ 44610000
|
|
% <W> ::= "1" IF CAN WRITE 44620000
|
|
BEGIN 44630000
|
|
ALPHA ARRAY ST[0:6]; 44640000
|
|
INTEGER ARRAY SIZE[1:6]; 44650000
|
|
IF SP { MKS THEN GO TO FCTFAIL; 44660000
|
|
INDIRECT(MKS); 44670000
|
|
AA ~ PST[MKS]; 44680000
|
|
IF VALU[AA].IOUSE=0 OR I~IO[AA].FILNO=0 THEN GO TO FCTFAIL; 44690000
|
|
SEARCH(IOFILE[I],ST[*]); 44700000
|
|
IF ST[0] < 0 THEN GO TO FCTFAIL; 44710000
|
|
FOR J ~ 1,2 DO 44720000
|
|
BEGIN I1 ~ SCANCHAR(" ",0,ST[J],1); 44730000
|
|
SIZE[J] ~ IF I1 > 7 THEN 7 ELSE I1; 44740000
|
|
END; 44750000
|
|
FOR J ~ 3,4 DO ST[J] ~ ST[J] | 8; % CONVERT TO CHARACTERS 44760000
|
|
FOR J ~ 3,4,5,6 DO SIZE[J] ~ DIGITS(ST[J]); 44770000
|
|
WRITE(BUFOUT[*],FDKSEARCH, 44780000
|
|
SIZE[1], SIZE[2], 44790000
|
|
ST[0].[45:1],ST[0].[46:1],ST[0].[47:1], 44800000
|
|
FOR J ~ 3,4,5,6 DO [SIZE[J],ST[J]]); 44810000
|
|
MV(SIZE[1],ST[1],1,BUFOUT[*],0); % <MFID> 44820000
|
|
MV(SIZE[2],ST[2],1,BUFOUT[*],SIZE[1]+1); % <FID> 44830000
|
|
I1 ~ 9; 44840000
|
|
FOR J ~ 1 STEP 1 UNTIL 6 DO I1 ~ I1+SIZE[J]; 44850000
|
|
RETURNVAL ~ TEMPCELL; 44860000
|
|
AA ~ STRING(I1,RETURNVAL); 44870000
|
|
MOVE(I1,BUFOUT[*],0,FIRSTCHAR(AA)); 44880000
|
|
VALU[RETURNVAL] ~ AA; 44890000
|
|
GO TO SUCCEED; 44900000
|
|
END SEARCH; 44910000
|
|
% 50: .RANF(N) PRODUCES A "RANDOM" NUMBER; 1 { .RANF(N) { N. 44920000
|
|
BEGIN DEFINE K=7557#, C=1#; 44930000
|
|
IF SP { MKS THEN GO TO FCTFAIL; 44940000
|
|
IF NOT NUMVAL(PST[MKS],I1) OR I1 { 0 THEN GO TO FCTFAIL; 44950000
|
|
RANDNO ~ REAL(BOOLEAN(RANDNO~RANDNO|K+C) AND BOOLEAN(33554431)); 44960000
|
|
RETURNVAL ~ TEMPVAL(I1|(RANDNO/33554432)+0.5); 44970000
|
|
GO TO SUCCEED; 44980000
|
|
END RANDOM FUNCTION; 44990000
|
|
% 51: CLEAR() SETS ALL VARIABLES TO NULL, AT THEIR TOP LEVEL ONLY. 45000000
|
|
BEGIN ALPHA K; 45010000
|
|
INTEGER I, J; 45020000
|
|
FOR I ~ 0 STEP 1 UNTIL SCATTERNO DO 45030000
|
|
FOR J ~ 0 STEP 1 WHILE J < SCATTERSIZE DO 45040000
|
|
BEGIN 45050000
|
|
K ~ J & I CONCSTR; 45060000
|
|
DO IF NAME[K].TYPE = 0 THEN VALU[K].LOC ~ 0 45070000
|
|
UNTIL K~NAME[K].LINK = 0; 45080000
|
|
END; 45090000
|
|
GO TO SUCCEED; 45100000
|
|
END CLEAR; 45110000
|
|
END FUNCTION CASES; 45120000
|
|
%********INTRINSIC FUNCTIONS*********** 45130000
|
|
%************************************** 45140000
|
|
GO TO UNDEFFCT; 45150000
|
|
DEFINEDFCT: % PROGRAM-DEFINED FUNCTION 45160000
|
|
BEGIN 45170000
|
|
LABEL TOODEEP, RET; 45180000
|
|
BOOLEAN FCTFAILURE; 45190000
|
|
ALPHA ARRAY 45200000
|
|
PRESERVE[0:5,0:STACKSIZE], 45210000
|
|
LVS[0:7]; 45220000
|
|
ALPHA LV, K; 45230000
|
|
% IF INFORM THEN INFORM0(5); 45240000
|
|
FCTFAILURE ~ FALSE; 45250000
|
|
MOVEWDS(30,BACKREFLAG,PRESERVE[0,16]); % INTERPRETER VARIABLES 45260000
|
|
MOVEWDS(SP,PNAME[*],PRESERVE[1,*]); 45270000
|
|
MOVEWDS(SP,PPOINT[*],PRESERVE[2,*]); 45280000
|
|
MOVEWDS(SP,PSIZE[*],PRESERVE[3,*]); 45290000
|
|
MOVEWDS(SP,PTYPE[*],PRESERVE[4,*]); 45300000
|
|
MOVEWDS(SP,PST[*],PRESERVE[5,*]); 45310000
|
|
MV(J~FCTV.S,DATA[FCTV.R,FCTV.W],FCTV.C,LVS[*],0); 45320000
|
|
% ASSIGN TO TEMPORARY LOCS: 45330000
|
|
FOR I ~ SP - 1 STEP -1 UNTIL MKS DO IF PNAME[I] THEN 45340000
|
|
BEGIN 45350000
|
|
K ~ PST[I]; 45360000
|
|
AA ~ TEMPCELL; 45370000
|
|
AB ~ STRING(VALU[K].S,AA); 45380000
|
|
K ~ VALU[K]; 45390000
|
|
VALU[AA] ~ AB; 45400000
|
|
MOVE(STRINGLOC(K),FIRSTCHAR(AB)); 45410000
|
|
PST[I] ~ AA; 45420000
|
|
END; 45430000
|
|
% PUSH PARAMS & LOC VARS AND ASSIGN VALUES: 45440000
|
|
MV(2,LVS[*],0,LV,6); 45450000
|
|
IF NOT PUSH(LV,0) THEN GO TO FCTFAIL; 45460000
|
|
IF NOT CHECKOUTUSE(LV) THEN FCTFAILURE ~ TRUE; 45470000
|
|
K ~ 2; I ~ MKS ; 45480000
|
|
J ~ J - 2; 45490000
|
|
FOR K ~ 2 STEP 2 UNTIL J DO 45500000
|
|
BEGIN 45510000
|
|
MV(2,LVS[*],K,LV,6); 45520000
|
|
IF NOT PUSH(LV,IF I<SP THEN PST[I] ELSE 0) THEN GO TO FCTFAIL; 45530000
|
|
IF NOT CHECKOUTUSE(LV) THEN FCTFAILURE ~ TRUE; 45540000
|
|
I ~ I + 1; 45550000
|
|
END; 45560000
|
|
IF FCTFAILURE THEN GO TO RET; 45570000
|
|
IF DEATH THEN DIE; 45580000
|
|
FOR I ~ 0 STEP 1 UNTIL 15 DO IF USEDST[I] THEN 45590000
|
|
BEGIN PRESERVE[0,I] ~ TEMPLIST[I]; 45600000
|
|
TEMPLIST[I] ~ 0; 45610000
|
|
END; 45620000
|
|
ENTRY ~ FCTV.LINK; 45630000
|
|
IF ENTRY = 0 THEN GO TO UNDEFFCT; 45640000
|
|
% 45650000
|
|
INTERPRETER; % CALL FUNCTION 45660000
|
|
% 45670000
|
|
MOVEWDS(30,PRESERVE[0,16],BACKREFLAG); % INTERPRETER VARIABLES 45680000
|
|
MOVEWDS(SP,PRESERVE[1,*],PNAME[*]); 45690000
|
|
MOVEWDS(SP,PRESERVE[2,*],PPOINT[*]); 45700000
|
|
MOVEWDS(SP,PRESERVE[3,*],PSIZE[*]); 45710000
|
|
MOVEWDS(SP,PRESERVE[4,*],PTYPE[*]); 45720000
|
|
MOVEWDS(SP,PRESERVE[5,*],PST[*]); 45730000
|
|
FOR I ~ 0 STEP 1 WHILE I { 15 AND USEDST[I] DO 45740000
|
|
TEMPLIST[I] ~ PRESERVE[0,I]; 45750000
|
|
MV(2,LVS[*],0,LV,6); 45760000
|
|
RETURNVAL ~ TEMPCELL; % TO SAVE VALUE RETURNED. 45770000
|
|
IF DEATH THEN GO TO FCTFAIL; 45780000
|
|
AB ~ VALTABL[LV.STR,LV.STW]; 45790000
|
|
IF AB.CH } 3 THEN % MOVE POINTER 45800000
|
|
BEGIN I ~ AB.CH - 2; 45810000
|
|
MV(2,RETURNVAL,6,DATA[AB.R,I.W],I.C); 45820000
|
|
END; 45830000
|
|
VALU[RETURNVAL] ~ AB.LOC; 45840000
|
|
% THE VALUE IS NOW IN THE TEMPORARY LOCATION; THE SYMBTABL LOC 45850000
|
|
% LV (WITH SAME NAME AS FCT) IS INVALID, BUT WILL SOON BE WIPED 45860000
|
|
% OUT BY THE CALL OF POP(LV). 45870000
|
|
RET: J ~ FCTV.S - 2; 45880000
|
|
FOR K ~ 0 STEP 2 UNTIL J DO 45890000
|
|
BEGIN MV(2,LVS[*],K,LV,6); 45900000
|
|
IF NOT POP(LV) THEN 45910000
|
|
IF PRINTMESSAGES THEN 45920000
|
|
BEGIN MESSAGEI(20,INSTNO); 45930000
|
|
MESSAGETTI(20,INSTNO); 45940000
|
|
END; 45950000
|
|
IF NOT CHECKOUTUSE(LV) THEN FCTFAILURE ~ TRUE; 45960000
|
|
END; 45970000
|
|
% IF INFORM THEN INFORM0(6); 45980000
|
|
PTYPE[MKS] ~ 1; 45990000
|
|
GO TO IF FCTFAILURE THEN FCTFAIL ELSE 46000000
|
|
IF RESULT THEN SUCCEED ELSE FCTFAIL; 46010000
|
|
TOODEEP: % FUNCTION DEPTH > MAXLEVEL 46020000
|
|
MESSAGEI(11,INSTNO); 46030000
|
|
MESSAGETTI(11,INSTNO); 46040000
|
|
DIE; 46050000
|
|
END DEFINED; 46060000
|
|
UNDEFFCT: % UNDEFINED FUNCTION CALLED 46070000
|
|
BEGIN SEGMENT 46080000
|
|
WRITE(PRINT[DBL],FBL); 46090000
|
|
WRITE(BUFOUT[*],FUNDEFFCT); 46100000
|
|
AA ~ NAME[FCT]; 46110000
|
|
MOVE(I~MIN(AA.S,100),FIRSTCHAR(AA),BUFOUT[*],29); 46120000
|
|
WRITE(PRINT[DBL],17,BUFOUT[*]); 46130000
|
|
IF DATACOMF THEN % WRITE ON TELETYPE: 46140000
|
|
BEGIN I ~ I + 29; 46150000
|
|
MV(2,CRLF,5,DCWRITE[*],0); % "{!" 46160000
|
|
MOVE(I,BUFOUT[*],2,DCWRITE[*],2); % MESSAGE 46170000
|
|
MV(3,CRLF,5,DCWRITE[I.W],I.C+2); % "{!~" 46180000
|
|
IF OUTPUT THEN; 46190000
|
|
IF DEBUGGING THEN % SUSPEND 46200000
|
|
BEGIN SUSPENDREASON[3] ~ TRUE; 46210000
|
|
DEBUG(SETGO); 46220000
|
|
FCTV ~ VALU[FCT]; % RETREIVE NEW DEF., IF ANY. 46230000
|
|
GO TO BRANCH; % TRY TO EXECUTE. 46240000
|
|
END; 46250000
|
|
END; 46260000
|
|
DIE; 46270000
|
|
END; 46280000
|
|
FCTFAIL: % FAILURE EXIT FOR FUNCTIONS 46290000
|
|
IF BOOLEAN(VALU[FCT].OUTUSE) THEN 46300000
|
|
IF TRACEFCTRETURN(FCT,FALSE) THEN; 46310000
|
|
FAIL; 46320000
|
|
SUCCEED: 46330000
|
|
PST[MKS] ~ RETURNVAL; 46340000
|
|
IF BOOLEAN(VALU[FCT].OUTUSE) THEN 46350000
|
|
IF NOT TRACEFCTRETURN(FCT,TRUE) THEN FAIL; 46360000
|
|
PNAME[MKS] ~ FALSE; 46370000
|
|
SP ~ MKS + 1; 46380000
|
|
RELATIVEPOINTER ~ 4; 46390000
|
|
GO TO PSCAN; 46400000
|
|
END FUNCTION; 46410000
|
|
%********FUNCTION*******************************************************46420000
|
|
%********LITERAL************************ 46430000
|
|
% 11: "#" LITERAL: 46440000
|
|
% 2-CHAR POINTER TO SYMB TABLE LOC. 46450000
|
|
BEGIN PTYPE[SP] ~ 1; 46460000
|
|
PST[SP] ~ TEMP.[18:12]; 46470000
|
|
PNAME[SP] ~ FALSE; 46480000
|
|
SP ~ SP + 1; 46490000
|
|
RELATIVEPOINTER ~ 3; 46500000
|
|
GO TO PSCAN; 46510000
|
|
END; 46520000
|
|
%********LITERAL************************ 46530000
|
|
%********QMARK************************* 46540000
|
|
% 12: QMARK END INST, NO GO-TO PART 46550000
|
|
BEGIN 46560000
|
|
MV(6,CONTROLPOINT+1,AA,2); 46570000
|
|
INSTNO ~ AA.[12:12]; 46580000
|
|
SLOC ~ AA.[24:12]; 46590000
|
|
FLOC ~ AA.[36:12]; 46600000
|
|
INSTRUCT ~ (NEARPOINT~NEARPOINT+7).W + INSTRUCT; 46610000
|
|
NEARPOINT ~ NEARPOINT.C; 46620000
|
|
% IF INFORM THEN CHECKSYMBTABL; 46630000
|
|
IF RULES[LEVEL].C = 7 THEN RETURNTEMPS; 46640000
|
|
GO TO INTERPRET; 46650000
|
|
END; 46660000
|
|
%********QMARK************************** 46670000
|
|
%********GO-TO************************** 46680000
|
|
% 13: ":" GO-TO 46690000
|
|
BEGIN 46700000
|
|
AA ~ AA.[18:12]; 46710000
|
|
SETGO: 46720000
|
|
% AA MUST CONTAIN THE SYMBOL TABLE ADDRESS OF THE NEXT INST. 46730000
|
|
VALU[AA].LINK ~ (AB~VALU[AA]).LINK + 1; % BUMP REFERENCE COUNT. 46740000
|
|
IF BOOLEAN(AB.OUTUSE) THEN % LABEL IS BEING TRACED: 46750000
|
|
BEGIN SEGMENT 46760000
|
|
AC ~ NAME[AA]; 46770000
|
|
I1 ~ MIN(AC.S,63); 46780000
|
|
I2 ~ I1 + 3 - I1.[46:2]; 46790000
|
|
I ~ AB.LINK + 1; 46800000
|
|
WRITE(BUFOUT[*],FTRACEL,I2,DIGITS(I),I,1,DIGITS(INSTNO),INSTNO); 46810000
|
|
MV(I1,FIRSTCHAR(AC),BUFOUT[*],3); 46820000
|
|
WRITE(PRINT,FBL); 46830000
|
|
WRITE(PRINT[NO],17,BUFOUT[*]); 46840000
|
|
END LABEL TRACING OUTPUT; 46850000
|
|
IF ENTRY ! AA THEN 46860000
|
|
BEGIN 46870000
|
|
ENTRY ~ AA; 46880000
|
|
IF I ~ AB.S < 7 THEN GO TO UNDEFINED; 46890000
|
|
IF I { 63 THEN 46900000
|
|
MV(I,FIRSTCHAR(AB),INST[*],0) ELSE 46910000
|
|
MOVE(I,FIRSTCHAR(AB),INST[*],0); 46920000
|
|
END; 46930000
|
|
MV(6,INST[*],3,AA,2); 46940000
|
|
INSTNO ~ AA.[12:12]; 46950000
|
|
SLOC ~ AA.[24:12]; 46960000
|
|
FLOC ~ AA.[36:12]; 46970000
|
|
INSTRUCT ~ RELATIVEPOINTER ~ 0; 46980000
|
|
NEARPOINT ~ 9; 46990000
|
|
% IF INFORM THEN CHECKSYMBTABL; 47000000
|
|
IF RULES[LEVEL].C = 7 THEN RETURNTEMPS; 47010000
|
|
IF DEBUGGING THEN % CHECK LABEL LIMITS 47020000
|
|
FOR I ~ 0 STEP 1 UNTIL NLABELLIMIT DO 47030000
|
|
IF ENTRY = LABELLIMIT[I] THEN 47040000
|
|
BEGIN SUSPENDREASON[2] ~ TRUE; 47050000
|
|
DEBUG(SETGO); 47060000
|
|
GO TO INTERPRET; 47070000
|
|
END; 47080000
|
|
GO TO INTERPRET; 47090000
|
|
END; 47100000
|
|
%********GO-TO************************** 47110000
|
|
;;;;;;;;;;; 47120000
|
|
%********INPUT CHECK******************** 47130000
|
|
% 25: "I" CHECK INPUT USE OF LAST ELEMENT 47140000
|
|
BEGIN AA ~ PST[SP-1]; 47150000
|
|
IF BOOLEAN(VALU[AA].INUSE) THEN IF NOT SNBLIN(AA) THEN FAIL; 47160000
|
|
RELATIVEPOINTER ~ 1; 47170000
|
|
GO TO PSCAN; 47180000
|
|
END; 47190000
|
|
%********INPUT CHECK******************** 47200000
|
|
%********ARITHMETIC********************* 47210000
|
|
% 26: "." ARITHMETIC OPERATOR 47220000
|
|
BEGIN 47230000
|
|
INTOVR ~ ARITHOVFL; 47240000
|
|
EXPOVR ~ ARITHOVFL; 47250000
|
|
CASE DOTTYPE[AA.C3] OF 47260000
|
|
BEGIN 47270000
|
|
% 0: ERROR 47280000
|
|
GO TO PERROR; 47290000
|
|
% 1: ".N" NEGATION: 47300000
|
|
BEGIN 47310000
|
|
IF (MKS~SP-1) < 0 THEN GO TO PERROR; 47320000
|
|
IF PTYPE[MKS] = -1 47330000
|
|
THEN AB ~ PST[MKS] 47340000
|
|
ELSE IF NOT NUMVAL(PST[MKS],AB) THEN GO TO NONNUMERIC; 47350000
|
|
PST[MKS] ~ -AB; 47360000
|
|
PTYPE[MKS] ~ -1; 47370000
|
|
END; 47380000
|
|
% 2: ARITHMETIC OPERATOR: 47390000
|
|
BEGIN 47400000
|
|
IF (MKS~SP-2) < 0 THEN GO TO PERROR; 47410000
|
|
IF PTYPE[MKS] = -1 47420000
|
|
THEN AB ~ PST[MKS] 47430000
|
|
ELSE IF NOT NUMVAL(PST[MKS],AB) THEN GO TO NONNUMERIC; 47440000
|
|
IF PTYPE[MKS+1] = -1 47450000
|
|
THEN AC ~ PST[MKS+1] 47460000
|
|
ELSE IF NOT NUMVAL(PST[MKS+1],AC) THEN GO TO NONNUMERIC; 47470000
|
|
IF I~AA.C3 = "+" THEN I1 ~ AB + AC ELSE 47480000
|
|
IF I = "-" THEN I1 ~ AB - AC ELSE 47490000
|
|
IF I = "|" THEN I1 ~ AB | AC ELSE 47500000
|
|
IF I = "/" THEN IF AC=0 THEN GO TO DVDZERO ELSE 47510000
|
|
CASE DIVIDEMODE OF 47520000
|
|
BEGIN 47530000
|
|
% 0: ROUND 47540000
|
|
I1 ~ AB/AC; 47550000
|
|
% 1: TRUNCATION 47560000
|
|
I1 ~ ENTIER(AB/AC); 47570000
|
|
% 2: INTEGER 47580000
|
|
IF (I1~AA~AB/AC) ! ENTIER(AA) THEN FAIL 47590000
|
|
END DIVIDE CASES ELSE 47600000
|
|
IF I = "*" THEN 47610000
|
|
IF AC = 0 THEN I1 ~ 1 ELSE 47620000
|
|
BEGIN 47630000
|
|
IF AC < 0 THEN 47640000
|
|
BEGIN AC ~ -AC; 47650000
|
|
AA ~ 1/AB; 47660000
|
|
END ELSE AA ~ AB; 47670000
|
|
FOR I ~ 1 STEP 1 UNTIL AC DO AA ~ AA | AB; 47680000
|
|
I1 ~ AA; 47690000
|
|
END ELSE 47700000
|
|
GO TO PERROR; % INVALID CHAR AFTER "." 47710000
|
|
PST[MKS] ~ I1; 47720000
|
|
PTYPE[MKS] ~ -1; 47730000
|
|
END; 47740000
|
|
% 3: ".S" CONVERT TO STRING 47750000
|
|
BEGIN 47760000
|
|
IF MKS~SP-1 < 0 OR PTYPE[MKS] ! -1 THEN 47770000
|
|
BEGIN INFORM0(9); 47780000
|
|
GO TO PERROR; 47790000
|
|
END; 47800000
|
|
PST[MKS] ~ TEMPVAL(PST[MKS]); 47810000
|
|
PTYPE[MKS] ~ 1; 47820000
|
|
PNAME[MKS] ~ FALSE; 47830000
|
|
END 47840000
|
|
END ARITH CASES; 47850000
|
|
% 47860000
|
|
SP ~ MKS + 1; 47870000
|
|
RELATIVEPOINTER ~ 2; 47880000
|
|
INTOVR ~ 0; 47890000
|
|
GO TO PSCAN; 47900000
|
|
ARITHOVFL: % INTEGER OVERFLOW IN ARITHMETIC: 47910000
|
|
IF PRINTMESSAGES THEN 47920000
|
|
BEGIN MESSAGEI(0,INSTNO); 47930000
|
|
MESSAGETTI(0,INSTNO); 47940000
|
|
END; 47950000
|
|
FAIL; 47960000
|
|
NONNUMERIC: % NON-NUMERIC ARGUMENT TO ARITHMETIC: 47970000
|
|
IF PRINTMESSAGES THEN 47980000
|
|
BEGIN MESSAGEI(17,INSTNO); 47990000
|
|
MESSAGETTI(17,INSTNO); 48000000
|
|
END; 48010000
|
|
FAIL; 48020000
|
|
DVDZERO: % DIVIDE-BY-ZERO IN ARITHMETIC 48030000
|
|
IF PRINTMESSAGES THEN 48040000
|
|
BEGIN MESSAGEI(18,INSTNO); 48050000
|
|
MESSAGETTI(18,INSTNO); 48060000
|
|
END; 48070000
|
|
FAIL; 48080000
|
|
END ARITHMETIC; 48090000
|
|
%********ARITHMETIC********************* 48100000
|
|
;; 48110000
|
|
%********GROUPING*********************** 48120000
|
|
% 29: "(" GROUPING 48130000
|
|
BEGIN 48140000
|
|
MKS ~ SP - AA.C3; 48150000
|
|
I1 ~ 0; % TO KEEP SIZE IN 48160000
|
|
FOR I ~ MKS STEP 1 UNTIL SP-1 DO 48170000
|
|
BEGIN 48180000
|
|
I ~ I; 48190000
|
|
IF PTYPE[I] ! 1 THEN 48200000
|
|
BEGIN INFORMI(1,PTYPE[I]); 48210000
|
|
SYSTEMERROR ~ TRUE; 48220000
|
|
GO TO DEAD; 48230000
|
|
END; 48240000
|
|
AA ~ PST[I]; 48250000
|
|
I1 ~ I1 + VALU[AA].S; 48260000
|
|
END; 48270000
|
|
AC ~ TEMPCELL; 48280000
|
|
VALU[AC] ~ AB ~ STRING(I1,AC); 48290000
|
|
I1 ~ AB.CH; 48300000
|
|
I2 ~ AB.R; 48310000
|
|
FOR I ~ MKS STEP 1 WHILE I<SP DO 48320000
|
|
BEGIN 48330000
|
|
I ~ I; 48340000
|
|
AA ~ PST[I]; 48350000
|
|
AA ~ VALU[AA]; 48360000
|
|
IF J~AA.S > 0 THEN 48370000
|
|
BEGIN 48380000
|
|
IF J { 63 THEN 48390000
|
|
MV(J,FIRSTCHAR(AA),DATA[I2,I1.W],I1.C) ELSE 48400000
|
|
MOVE(J,FIRSTCHAR(AA),DATA[I2,I1.W],I1.C); 48410000
|
|
I1 ~ I1 + J; 48420000
|
|
END; 48430000
|
|
END; 48440000
|
|
PST[MKS] ~ AC; 48450000
|
|
SP ~ MKS + 1; 48460000
|
|
PNAME[MKS] ~ FALSE; 48470000
|
|
RELATIVEPOINTER ~ 2; 48480000
|
|
GO TO PSCAN; 48490000
|
|
END; % GROUPING 48500000
|
|
%********GROUPING*********************** 48510000
|
|
; 48520000
|
|
%********REPLACEMENT******************** 48530000
|
|
% 31: "~" REPLACEMENT OR ASSIGNMENT 48540000
|
|
BEGIN RELATIVEPOINTER ~ 1; 48550000
|
|
IF SELFREFLAG THEN % STR REF USED AS STR VAR 48560000
|
|
BEGIN 48570000
|
|
IF PRINTMESSAGES THEN 48580000
|
|
BEGIN MESSAGEI(3,INSTNO); 48590000
|
|
MESSAGETTI(3,INSTNO); 48600000
|
|
END; 48610000
|
|
GO TO GOTO; 48620000
|
|
END; 48630000
|
|
% IF INFORM THEN INFORM0(3); 48640000
|
|
SIZE ~ (AB~VALTABL[REFI~PST[0].STR,REFJ~PST[0].STW]).S; 48650000
|
|
NOREPLACES ~ SP - 1; 48660000
|
|
% CALCULATE SIZE OF NEW STR REF: 48670000
|
|
FOR SP ~ 1 STEP 1 UNTIL NOREPLACES DO 48680000
|
|
BEGIN AA ~ PST[SP]; 48690000
|
|
I1 ~ VALU[AA].S; 48700000
|
|
RSIZE ~ RSIZE + I1; 48710000
|
|
END; 48720000
|
|
% IF NEW STR REF IS NOT LARGER THAN THE OLD, THE SAME STRING 48730000
|
|
% CAN BE USED. AB STILL POINTS TO THE STR REF. 48740000
|
|
IF RSIZE > SIZE THEN 48750000
|
|
BEGIN B1 ~ TRUE; % STR REF IN NEW STRING 48760000
|
|
AA ~ STRING(RSIZE,PST[0]); 48770000
|
|
AB ~ VALTABL[REFI,REFJ]; 48780000
|
|
END ELSE 48790000
|
|
BEGIN B1 ~ FALSE; % USE SAME STRING FOR STR REF. 48800000
|
|
IF RSIZE < SIZE THEN VALTABL[REFI,REFJ].S ~ RSIZE; 48810000
|
|
AA ~ AB; 48820000
|
|
END; 48830000
|
|
% AA POINTS TO NEW VALUE. 48840000
|
|
% AB POINTS TO OLD VALUE. 48850000
|
|
I ~ AA.R; 48860000
|
|
J ~ AB.R; 48870000
|
|
IF B1 THEN IF FRONTEND > 0 THEN 48880000
|
|
IF FRONTEND { 63 THEN 48890000
|
|
MV(FRONTEND,DATA[J,AB.W],AB.C,DATA[I,AA.W],AA.C) ELSE 48900000
|
|
MOVE(FRONTEND,DATA[J,AB.W],AB.C,DATA[I,AA.W],AA.C); 48910000
|
|
I1 ~ FRONTEND + AA.CH; % POINTER TO NEXT CHAR TO BE OVERWRITTEN. 48920000
|
|
% REWRITE MATCHED PORTION: 48930000
|
|
FOR SP ~ 1 STEP 1 UNTIL NOREPLACES DO 48940000
|
|
BEGIN AC ~ PST[SP]; 48950000
|
|
AC ~ VALU[AC]; 48960000
|
|
IF (I2~AC.S) > 0 THEN 48970000
|
|
BEGIN IF I2 { 63 THEN 48980000
|
|
MV(I2,DATA[AC.R,AC.W],AC.C,DATA[I,I1.W],I1.C) ELSE 48990000
|
|
MOVE(I2,DATA[AC.R,AC.W],AC.C,DATA[I,I1.W],I1.C); 49000000
|
|
I1 ~ I1 + I2; 49010000
|
|
END; 49020000
|
|
END; 49030000
|
|
IF REAREND > 0 THEN IF B1 OR RSIZE ! SIZE THEN 49040000
|
|
BEGIN I2 ~ AB.CH + SIZE - REAREND; 49050000
|
|
IF REAREND > 0 THEN IF REAREND { 63 THEN 49060000
|
|
MV(REAREND,DATA[J,I2.W],I2.C,DATA[I,I1.W],I1.C) ELSE 49070000
|
|
MOVE(REAREND,DATA[J,I2.W],I2.C,DATA[I,I1.W],I1.C); 49080000
|
|
END; 49090000
|
|
IF B1 THEN VALTABL[REFI,REFJ].LOC ~ AA; 49100000
|
|
IF BOOLEAN(AB.OUTUSE) THEN 49110000
|
|
IF NOT SNBLOUT(PST[0]) THEN GO TO FAILED; 49120000
|
|
GO TO GOTO; 49130000
|
|
END; 49140000
|
|
%********REPLACEMENT******************** 49150000
|
|
;;; 49160000
|
|
%********LABEL INDIRECTION************** 49170000
|
|
% 35: "L" INDIRECT TO PRODUCE LABEL 49180000
|
|
BEGIN 49190000
|
|
IF SP ! 1 THEN GO TO PERROR; 49200000
|
|
AA ~ VALU[PST[0]]; 49210000
|
|
AA ~ ENTERST (AA.S,DATA[AA.R,*],AA.CH,"INST"); 49220000
|
|
GO TO SETGO; 49230000
|
|
END; 49240000
|
|
%********LABEL INDIRECTION************** 49250000
|
|
;;;;;; 49260000
|
|
%********INDIRECTION******************** 49270000
|
|
% 42: "$" INDIRECTION 49280000
|
|
BEGIN 49290000
|
|
% IF INFORM THEN INFORM0(16); 49300000
|
|
IF (SP~SP-1) < 0 THEN 49310000
|
|
BEGIN INFORMI(23,INSTNO); 49320000
|
|
SYSTEMERROR ~ INFORM ~ TRUE; 49330000
|
|
GO TO DEAD; 49340000
|
|
END; 49350000
|
|
AB ~ PST[SP]; 49360000
|
|
FOR I ~ AA.C3 STEP -1 UNTIL 1 DO 49370000
|
|
BEGIN 49380000
|
|
AC ~ VALU[AB]; 49390000
|
|
IF BOOLEAN(AC.INUSE) THEN 49400000
|
|
BEGIN IF NOT SNBLIN(AB) THEN GO TO FAILED; 49410000
|
|
AC ~ VALU[AB]; % INPUT MAY MOVE VALUE 49420000
|
|
END; 49430000
|
|
IF PRINTMESSAGES THEN IF AC.S = 0 THEN 49440000
|
|
BEGIN MESSAGEI(19,INSTNO); 49450000
|
|
MESSAGETTI(19,INSTNO); 49460000
|
|
END; 49470000
|
|
AB ~ ENTERST(AC.S,DATA[AC.R,*],AC.CH,"SYMB"); 49480000
|
|
IF DEATH THEN GO TO DEAD; 49490000
|
|
END; 49500000
|
|
PST[SP] ~ AB; 49510000
|
|
PNAME[SP] ~ TRUE; 49520000
|
|
SP ~ SP + 1; 49530000
|
|
RELATIVEPOINTER ~ 2; 49540000
|
|
GO TO PSCAN; 49550000
|
|
END; 49560000
|
|
%********INDIRECTION******************** 49570000
|
|
%********STR VAR************************ 49580000
|
|
% 43: "*" STRING VARIABLE 49590000
|
|
BEGIN 49600000
|
|
RELATIVEPOINTER ~ 2; 49610000
|
|
VARFLAG ~ TRUE; 49620000
|
|
SP ~ SP - 1; 49630000
|
|
CASE AA.C3 OF 49640000
|
|
BEGIN 49650000
|
|
% ERROR 49660000
|
|
GO TO PERROR; 49670000
|
|
% 1: ARB VAR 49680000
|
|
BEGIN PTYPE[SP] ~ 2; 49690000
|
|
PSIZE[SP] ~ 0; 49700000
|
|
END; 49710000
|
|
% 2: BAL VAR 49720000
|
|
BEGIN PTYPE[SP] ~ 4; 49730000
|
|
PSIZE[SP] ~ 1; 49740000
|
|
END; 49750000
|
|
% 3: FIXED-LENGTH 49760000
|
|
BEGIN 49770000
|
|
% IF SIZE < 0 THEN RULE FAILS. 49780000
|
|
IF (IF PTYPE[SP] = 7 49790000
|
|
THEN I1~PST[SP] < 0 49800000
|
|
ELSE NOT NUMVAL(PST[SP],I1) OR I1<0) 49810000
|
|
THEN GO TO FIXERR; 49820000
|
|
PSIZE[SP~SP-1] ~ I1; 49830000
|
|
PTYPE[SP] ~ 3; 49840000
|
|
END 49850000
|
|
END VAR CASES; 49860000
|
|
SP ~ SP + 1; 49870000
|
|
GO TO PSCAN; 49880000
|
|
END; 49890000
|
|
%********STR VAR************************ 49900000
|
|
%********RESERVED LABEL***************** 49910000
|
|
% 44: "-" RESERVED LABEL 49920000
|
|
IF I~AA.C3 = "R" THEN 49930000
|
|
BEGIN RESULT ~ TRUE; 49940000
|
|
GO TO RETURN; 49950000
|
|
END ELSE 49960000
|
|
IF I = "F" THEN 49970000
|
|
BEGIN RESULT ~ FALSE; 49980000
|
|
GO TO RETURN; 49990000
|
|
END ELSE 50000000
|
|
IF I = "E" THEN 50010000
|
|
BEGIN RESULT ~ TRUE; 50020000
|
|
GO TO ENDTERPRET; 50030000
|
|
END; 50040000
|
|
%********RESERVED LABEL***************** 50050000
|
|
;;;; 50060000
|
|
%********GO-TO PART********************* 50070000
|
|
% 49: "/" GO-TO PART DELIMITER AFTER PATTERN 50080000
|
|
GOTO: 50090000
|
|
BEGIN 50100000
|
|
% IF INFORM THEN INFORM0(26); 50110000
|
|
NEARPOINT ~ IF SUCCESS THEN SLOC ELSE FLOC; 50120000
|
|
INSTRUCT ~ NEARPOINT.W; 50130000
|
|
NEARPOINT ~ NEARPOINT.C; 50140000
|
|
RELATIVEPOINTER ~ SP ~ 0; 50150000
|
|
INGOTOPART ~ TRUE; 50160000
|
|
GO TO PSCAN; 50170000
|
|
END; 50180000
|
|
%********GO-TO PART********************* 50190000
|
|
%********END STR REF******************** 50200000
|
|
% 50: "S" END OF STRING REFERENCE, BEFORE PATTERN 50210000
|
|
BEGIN 50220000
|
|
IF BOOLEAN(VALU[PST[0]].INUSE) THEN 50230000
|
|
IF NOT SNBLIN(PST[0]) THEN FAIL; 50240000
|
|
PTYPE[0] ~ ANCHORMODE; 50250000
|
|
PSIZE[0] ~ ANCHORSIZE; 50260000
|
|
PPOINT[0] ~ 0; 50270000
|
|
RELATIVEPOINTER ~ 1; 50280000
|
|
GO TO PSCAN; 50290000
|
|
END; 50300000
|
|
%********END STR REF******************** 50310000
|
|
;;;; 50320000
|
|
%********SYNTAX ERROR****************** 50330000
|
|
% 55: "X" SYNTAX ERROR IN ORIGINAL CODE 50340000
|
|
BEGIN MESSAGEI(1,INSTNO); 50350000
|
|
MESSAGETTI(1,INSTNO); 50360000
|
|
GO TO DEAD; 50370000
|
|
END; 50380000
|
|
%********SYNTAX ERROR******************* 50390000
|
|
;;; 50400000
|
|
%********NON-INPUT STRING*************** 50410000
|
|
% 59: "%" NON-INPUT STRING NAME 50420000
|
|
BEGIN PTYPE[SP] ~ 1; 50430000
|
|
PST[SP] ~ AA.[18:12]; 50440000
|
|
PNAME[SP] ~ TRUE; 50450000
|
|
SP ~ SP + 1; 50460000
|
|
RELATIVEPOINTER ~ 3; 50470000
|
|
GO TO PSCAN; 50480000
|
|
END; 50490000
|
|
%********NON-INPUT STRING*************** 50500000
|
|
; 50510000
|
|
%********PATTERN MATCH***************** 50520000
|
|
% 61: "=" PATERN MATCH 50530000
|
|
BEGIN 50540000
|
|
% IF SP { 1 THEN GO TO PERROR; 50550000
|
|
RELATIVEPOINTER ~ 1; 50560000
|
|
PMINLEFT[SP] ~ PTYPE[SP] ~ 0; % TO END SCAN. 50570000
|
|
NOPATTERNS ~ SP - 1; 50580000
|
|
BACKREFLAG ~ FALSE; 50590000
|
|
FOR I ~ NOPATTERNS STEP -1 UNTIL 1 DO 50600000
|
|
BEGIN 50610000
|
|
IF I1 ~ PTYPE[I] = 1 THEN 50620000
|
|
FOR J ~ I-1 STEP -1 UNTIL 0 DO 50630000
|
|
BEGIN 50640000
|
|
IF PST[I] = PST[J] 50650000
|
|
THEN IF PTYPE[J] ! 1 50660000
|
|
THEN BEGIN 50670000
|
|
PTYPE[I] ~ I1 ~ 5; 50680000
|
|
PBACK[I] ~ J; 50690000
|
|
PSIZE[I] ~ PSIZE[J]; 50700000
|
|
BACKREFLAG ~ TRUE; 50710000
|
|
GO TO MINLEF; 50720000
|
|
END; 50730000
|
|
END ELSE IF I1 { 4 THEN 50740000
|
|
IF PST[I] = PST[0] 50750000
|
|
THEN SELFREFLAG ~ TRUE; 50760000
|
|
IF I1 = 1 THEN % SET PLENGTH & LLOC FIELDS 50770000
|
|
BEGIN AB ~ PST[I]; 50780000
|
|
PSIZE[I] ~ (PLOC[I] ~ VALU[AB]).S; 50790000
|
|
END; 50800000
|
|
MINLEF: % THE MINLEFT WORD HOLDS THE MINIMUM SIZE OF THE 50810000
|
|
% REMAINDER OF THE PATTERN. 50820000
|
|
PMINLEFT[I] ~ PMINLEFT[I+1] + PSIZE[I]; 50830000
|
|
END; 50840000
|
|
REFLOC ~ (AA~VALTABL[REFI~PST[0].STR,REFJ~PST[0].STW]).CH; 50850000
|
|
SIZE ~ AA.S; 50860000
|
|
RPR ~ AA.R; 50870000
|
|
SP ~ 0; 50880000
|
|
NOBACKORBAL ~ TRUE; 50890000
|
|
NEWPOINT: 50900000
|
|
PPOINT[SP+1] ~ PPOINT[SP] + PSIZE[SP]; 50910000
|
|
NEXTPATTERN: 50920000
|
|
SP ~ SP + 1; 50930000
|
|
IF PMINLEFT[SP] + PPOINT[SP] > SIZE THEN GO TO SIZEFAILURE; 50940000
|
|
CASE PTYPE[SP] OF 50950000
|
|
BEGIN 50960000
|
|
% 0: END OF SCAN, IF AFTER LAST PATTERN ELEMENT: 50970000
|
|
GO TO IF SP > NOPATTERNS THEN SCANSUCCESS ELSE SCANERR; 50980000
|
|
% 1: CONSTANT PATTERN ELEMENT 50990000
|
|
BEGIN 51000000
|
|
AA ~ PLOC[SP]; 51010000
|
|
REFPT ~ REFLOC + PPOINT[SP]; 51020000
|
|
GO TO IF (IF (I~AA.S) { 63 THEN 51030000
|
|
EQ(I,FIRSTCHAR(AA),DATA[RPR,REFPT.W],REFPT.C) ELSE 51040000
|
|
EQUAL(I,FIRSTCHAR(AA),DATA[RPR,REFPT.W],REFPT.C)) 51050000
|
|
THEN NEWPOINT 51060000
|
|
ELSE DROPBACK; 51070000
|
|
END; 51080000
|
|
% 2: ARBITRARY STRING VARIABLE 51090000
|
|
BEGIN PPOINT[SP+1] ~ PPOINT[SP]; 51100000
|
|
GO TO NEXTPATTERN; 51110000
|
|
END; 51120000
|
|
% 3: FIXED-LENGTH STRING VARIABLE 51130000
|
|
GO TO NEWPOINT; 51140000
|
|
% 4: BALANCED STRING VARIABLE 51150000
|
|
BEGIN NOBACKORBAL ~ FALSE; 51160000
|
|
INCREASE ~ 0; 51170000
|
|
REFPT ~ REFLOC + PPOINT[SP]; 51180000
|
|
BALANCE: 51190000
|
|
COUNT ~ 0; 51200000
|
|
DO BEGIN 51210000
|
|
IF PPOINT[SP] + INCREASE~INCREASE+1 > SIZE THEN GO TO DROPBACK;51220000
|
|
IF AA~CHAR(DATA[RPR,REFPT.W],REFPT.C) = "(" THEN 51230000
|
|
COUNT ~ COUNT + 1 ELSE 51240000
|
|
IF AA = ")" THEN 51250000
|
|
COUNT ~ COUNT - 1; 51260000
|
|
REFPT ~ REFPT + 1; 51270000
|
|
END UNTIL COUNT { 0; 51280000
|
|
IF COUNT < 0 THEN GO TO DROPBACK; 51290000
|
|
PPOINT[SP+1] ~ PPOINT[SP] + PSIZE[SP]~INCREASE; 51300000
|
|
GO TO NEXTPATTERN; 51310000
|
|
END; 51320000
|
|
% 5: BACK REFERENCE: 51330000
|
|
BEGIN NOBACKORBAL ~ FALSE; 51340000
|
|
INCREASE ~ PPOINT[PBACK[SP]+1] - I1~PPOINT[PBACK[SP]]; 51350000
|
|
IF PPOINT[SP] + INCREASE > SIZE THEN GO TO SIZEFAILURE; 51360000
|
|
I1 ~ REFLOC + I1; 51370000
|
|
REFPT ~ REFLOC + PPOINT[SP]; 51380000
|
|
IF NOT EQUAL(INCREASE,DATA[RPR,I1.W],I1.C, 51390000
|
|
DATA[RPR,REFPT.W],REFPT.C) THEN GO TO DROPBACK; 51400000
|
|
PPOINT[SP+1] ~ PPOINT[SP] + INCREASE; 51410000
|
|
GO TO NEXTPATTERN; 51420000
|
|
END 51430000
|
|
END CASES; 51440000
|
|
GO TO SCANERR; 51450000
|
|
SIZEFAILURE: 51460000
|
|
IF NOBACKORBAL THEN GO TO SCANFAILURE; 51470000
|
|
DROPBACK: 51480000
|
|
DO IF (SP~SP-1) < 0 THEN GO TO SCANFAILURE 51490000
|
|
UNTIL NOT BOOLEAN(PTYPE[SP]); 51500000
|
|
% NON-EXTENDABLE IF CONSTANT, FIXED-LENGTH OR BACK-REFERENCE 51510000
|
|
% CAN ONLY BE EXTENDED FOR SIMPLE & BALANCED VARIABLES. 51520000
|
|
IF PTYPE[SP] = 2 THEN % ARBITRARY VARIABLE: 51530000
|
|
BEGIN 51540000
|
|
GO TO IF PMINLEFT[SP+1] + PPOINT[SP+1]~PPOINT[SP+1]+1 { SIZE 51550000
|
|
THEN NEXTPATTERN 51560000
|
|
ELSE SIZEFAILURE; 51570000
|
|
END ELSE % BALANCED VARIABLE: 51580000
|
|
BEGIN 51590000
|
|
REFPT ~ REFLOC + PPOINT[SP] + INCREASE~PSIZE[SP]; 51600000
|
|
GO TO BALANCE; 51610000
|
|
END; 51620000
|
|
SCANERR: 51630000
|
|
BEGIN SEGMENT 51640000
|
|
INFORMII(3,INSTNO,SP); 51650000
|
|
WRITESTACK(NOPATTERNS+1); 51660000
|
|
ABORT; 51670000
|
|
END; 51680000
|
|
SCANSUCCESS: 51690000
|
|
% IF INFORM THEN WRITESTACK(NOPATTERNS+1); 51700000
|
|
IF PTYPE[SP-1] = 2 THEN PPOINT[SP] ~ SIZE; 51710000
|
|
% ASSIGNMENT OF STRING VARIABLES: 51720000
|
|
% IF INFORM THEN INFORM0(0); 51730000
|
|
FRONTEND ~ PPOINT[1]; 51740000
|
|
REAREND ~ SIZE - PPOINT[NOPATTERNS+1]; 51750000
|
|
RSIZE ~ FRONTEND + REAREND; 51760000
|
|
IF VARFLAG THEN 51770000
|
|
BEGIN 51780000
|
|
IF SELFREFLAG THEN 51790000
|
|
BEGIN % MAKE COPY OF STR REF VALUE: 51800000
|
|
TEMPREF ~ TEMPCELL; 51810000
|
|
AA ~ STRING(SIZE,TEMPREF); 51820000
|
|
IF DEATH THEN DIE; 51830000
|
|
AB ~ VALTABL[REFI,REFJ]; 51840000
|
|
MOVE(SIZE,FIRSTCHAR(AB),FIRSTCHAR(AA)); 51850000
|
|
VALU[TEMPREF] ~ AB ~ AA; 51860000
|
|
END ELSE 51870000
|
|
BEGIN TEMPREF ~ PST[0]; 51880000
|
|
AB ~ VALU[TEMPREF]; 51890000
|
|
END; 51900000
|
|
FOR SP ~ 1 STEP 1 UNTIL NOPATTERNS DO 51910000
|
|
IF PTYPE[SP]>1 THEN IF PTYPE[SP]<5 THEN IF AC~PST[SP]!0 THEN 51920000
|
|
BEGIN 51930000
|
|
% STRING VARIABLE ASSIGNMENT: 51940000
|
|
IF (J~PPOINT[SP+1]-PPOINT[SP]) = 0 THEN 51950000
|
|
VALU[AC].S ~ 0 ELSE 51960000
|
|
BEGIN 51970000
|
|
IF (AA~VALU[AC]).S < J THEN 51980000
|
|
% NEED NEW STRING--NEW VALUE LARGER THAN OLD. 51990000
|
|
BEGIN AA ~ STRING(J,AC); 52000000
|
|
AB ~ VALU[TEMPREF]; 52010000
|
|
VALU[AC].LOC ~ AA; 52020000
|
|
END ELSE 52030000
|
|
% CAN USE OLD VALUE--NEW VALUE SHORT ENOUGH 52040000
|
|
VALU[AC].S ~ J; 52050000
|
|
I1 ~ AB.CH + PPOINT[SP]; 52060000
|
|
IF J { 63 THEN 52070000
|
|
MV(J,DATA[AB.R,I1.W],I1.C,FIRSTCHAR(AA)) ELSE 52080000
|
|
MOVE(J,DATA[AB.R,I1.W],I1.C,FIRSTCHAR(AA)); 52090000
|
|
END; 52100000
|
|
IF BOOLEAN(VALU[AC].OUTUSE) THEN IF NOT SNBLOUT(AC) THEN FAIL; 52110000
|
|
END; 52120000
|
|
END ASSIGNMENT OF STR VARS; 52130000
|
|
SP ~ 1; 52140000
|
|
GO TO PSCAN; 52150000
|
|
END; 52160000
|
|
%********PATTERN MATCH***************** 52170000
|
|
; 52180000
|
|
%********STRING NAME******************** 52190000
|
|
% 63: """ STRING NAME, WITH INPUT CHECK 52200000
|
|
BEGIN PTYPE[SP] ~ 1; 52210000
|
|
PST[SP] ~ I ~ AA.[18:12]; 52220000
|
|
IF BOOLEAN(VALU[I].INUSE) THEN IF NOT SNBLIN(I) THEN FAIL; 52230000
|
|
PNAME[SP] ~ TRUE; 52240000
|
|
SP ~ SP + 1; 52250000
|
|
RELATIVEPOINTER ~ 3; 52260000
|
|
GO TO PSCAN; 52270000
|
|
END 52280000
|
|
%********STRING NAME******************** 52290000
|
|
END PSCAN CASES; 52300000
|
|
PERROR: 52310000
|
|
BEGIN SEGMENT 52320000
|
|
INFORMI(5,INSTNO); 52330000
|
|
WRITE(PRINT,17,INST[*]); 52340000
|
|
CLEAR(BUFOUT,17); 52350000
|
|
IF INSTRUCT | 8 + NEARPOINT < 132 THEN 52360000
|
|
MV(1,QMARK,7,BUFOUT[INSTRUCT],NEARPOINT); 52370000
|
|
WRITE(PRINT,17,BUFOUT[*]); 52380000
|
|
RESULT ~ FALSE; 52390000
|
|
ABORT; 52400000
|
|
END; 52410000
|
|
FIXERR: 52420000
|
|
IF PRINTMESSAGES THEN 52430000
|
|
BEGIN SEGMENT 52440000
|
|
WRITE(PRINT,FBL); 52450000
|
|
AA ~ VALU[PST[SP]]; 52460000
|
|
WRITE(BUFOUT[*],FFIXVARSIZE,AA.S,INSTNO); 52470000
|
|
MOVE(MIN(AA.S,116),FIRSTCHAR(AA),BUFOUT[*],16); 52480000
|
|
WRITE(PRINT,17,BUFOUT[*]); 52490000
|
|
IF INFORM THEN WRITESTACK(SP); 52500000
|
|
FAIL; 52510000
|
|
END; 52520000
|
|
SCANFAILURE: 52530000
|
|
% IF INFORM THEN 52540000
|
|
% BEGIN INFORM0(8); 52550000
|
|
% WRITESTACK(NOPATTERNS+1); 52560000
|
|
% END; 52570000
|
|
FAILED: 52580000
|
|
% IF INFORM THEN INFORM0(4); 52590000
|
|
IF INGOTOPART THEN % GO-TO PART HAS FAILED--FATAL ERROR 52600000
|
|
BEGIN 52610000
|
|
MESSAGEI(2,INSTNO); 52620000
|
|
MESSAGETTI(2,INSTNO); 52630000
|
|
DIE; 52640000
|
|
END; 52650000
|
|
IF DEATH THEN DIE; 52660000
|
|
SUCCESS ~ FALSE; 52670000
|
|
GO TO GOTO; 52680000
|
|
DEAD: % FATAL ERROR HAS OCCURRED--TERMINATE PROGRAM. 52690000
|
|
% ERROR MESSAGE SHOULD ALREADY HAVE BEEN PRINTED. 52700000
|
|
BEGIN SEGMENT 52710000
|
|
IF SYSTEMERROR THEN ABORT; 52720000
|
|
IF DEBUGGING THEN % SUSPEND: 52730000
|
|
BEGIN SUSPENDREASON[3] ~ TRUE; 52740000
|
|
DEATH ~ FALSE; 52750000
|
|
DEBUG(SETGO); 52760000
|
|
END; 52770000
|
|
MESSAGETTI(13,INSTNO); 52780000
|
|
RESULT ~ FALSE; 52790000
|
|
GO TO ENDTERPRET; 52800000
|
|
END; 52810000
|
|
LIMITHIT: % SYSTEM LIMIT OF SOME SORT PASSED--PRINT ALL LIMITS. 52820000
|
|
BEGIN SEGMENT 52830000
|
|
DMPSTR ~ TRUE; 52840000
|
|
MESSAGEI(4,INSTNO); 52850000
|
|
MESSAGETTI(4,INSTNO); 52860000
|
|
IF CPULIMITEXISTS THEN 52870000
|
|
BEGIN MESSAGEI(5,CPULIMIT/60); 52880000
|
|
MESSAGETTI(5,CPULIMIT/60); 52890000
|
|
END; 52900000
|
|
IF IOLIMITEXISTS THEN 52910000
|
|
BEGIN MESSAGEI(6,IOLIMIT/60); 52920000
|
|
MESSAGETTI(6,IOLIMIT/60); 52930000
|
|
END; 52940000
|
|
IF RULELIMITEXISTS THEN 52950000
|
|
BEGIN MESSAGEI(7,RULELIMIT); 52960000
|
|
MESSAGETTI(7,RULELIMIT); 52970000
|
|
END; 52980000
|
|
RESULT ~ FALSE; 52990000
|
|
DIE; 53000000
|
|
END LIMITHIT; 53010000
|
|
UNDEFINED: % ATTEMPTED TRANSFER TO UNDEFINED LABEL. 53020000
|
|
% AA MUST CONTAIN SYMB TABLE ADDRESS OF LABEL. 53030000
|
|
BEGIN ALPHA AC, AB; 53040000
|
|
DMPSTR ~ TRUE; 53050000
|
|
WRITE(PRINT,FBL); 53060000
|
|
AB ~ NAME[AA]; 53070000
|
|
WRITE(BUFOUT[*],FUNDEFLABEL); 53080000
|
|
MOVE(I~MIN(90,AB.S),FIRSTCHAR(AB),BUFOUT[*],40); 53090000
|
|
WRITE(PRINT,17,BUFOUT[*]); 53100000
|
|
IF DATACOMF THEN % WRITE MESSAGE ON TELETYPE: 53110000
|
|
BEGIN MV(2,CRLF,5,DCWRITE[*],0); 53120000
|
|
MOVE(I~I+38,BUFOUT[*],2,DCWRITE[*],2); 53130000
|
|
MV(3,CRLF,5,DCWRITE[I.W],I.C+2); 53140000
|
|
IF OUTPUT THEN; 53150000
|
|
IF DEBUGGING THEN % SUSPEND 53160000
|
|
BEGIN SUSPENDREASON[3] ~ TRUE; 53170000
|
|
AC ~ AA; 53180000
|
|
DEBUG(SETGO); 53190000
|
|
% SEE IF LABEL DEFINED NOW: 53200000
|
|
GO TO IF VALU[AA~AC].S } 10 THEN SETGO ELSE UNDEFINED; 53210000
|
|
END; 53220000
|
|
END; 53230000
|
|
RESULT ~ FALSE; 53240000
|
|
DIE; 53250000
|
|
END; 53260000
|
|
RETURN: 53270000
|
|
% IF INFORM THEN INFORMI(10,LEVEL); % END OF THIS LEVEL. 53280000
|
|
RETURNTEMPS; 53290000
|
|
IF LEVEL~LEVEL-1 { 0 THEN % RETURN, NO FUNCTION CALLED 53300000
|
|
BEGIN MESSAGE0(22); 53310000
|
|
MESSAGETTI(14,INSTNO); 53320000
|
|
DIE; 53330000
|
|
END; 53340000
|
|
END INTERPRETER; 53350000
|
|
%********INTERPRETER****************************************************53360000
|
|
%********INTRINSIC******************************************************53370000
|
|
% GIVEN A FUNCTION NAME (S CHARS--STARTING P CHARS PAST L[0]), 53380000
|
|
% INTRINSIC RETURNS THE INDEX FOR THE BRANCH TO INTRINSIC FCTS IN THE 53390000
|
|
% INTERPRETER. IF THE FUNCTION IS NOT AN INTRINSIC, 0 IS RETURNED. 53400000
|
|
INTEGER PROCEDURE INTRINSIC(L,P,S); 53410000
|
|
VALUE P, S; 53420000
|
|
ALPHA ARRAY L[0]; 53430000
|
|
INTEGER P, S; 53440000
|
|
BEGIN LABEL FIN, NON; 53450000
|
|
ALPHA F; 53460000
|
|
INTEGER I; 53470000
|
|
BOOLEAN FX; 53480000
|
|
% 53490000
|
|
IF S > 7 OR S < 3 THEN GO TO NON; 53500000
|
|
F ~ 0; 53510000
|
|
MV(S,L[P.W],P.C,F,8-S); 53520000
|
|
FX ~ NOT BOOLEAN(F); 53530000
|
|
FOR I ~ INTRINSFCT[S,0] STEP -1 UNTIL 1 DO 53540000
|
|
IF REAL(NOT(BOOLEAN(INTRINSFCT[S,I]) EQV FX)) = TEENYNEG THEN 53550000
|
|
BEGIN INTRINSIC ~ INTRINSNDX[S,I]; 53560000
|
|
I ~ INTRINSNDX[S,I]; % FOR TRACING 53570000
|
|
GO TO FIN; 53580000
|
|
END; 53590000
|
|
NON: INTRINSIC ~ 0; 53600000
|
|
FIN: 53610000
|
|
END INTRINSIC; 53620000
|
|
%********INTRINSIC******************************************************53630000
|
|
%********LOADER*********************************************************53640000
|
|
% LOADER READS THE PROGRAM MATERIAL IN THE FILE PROGRAM, AND 53650000
|
|
% CAUSES THE PROGRAM TO BE COMPILED. INSTRUCTIONS ARE PUT INTO A 53660000
|
|
% SINGLE ARRAY ROW AND PASSED TO COMPILE. CONTROL CARDS ARE 53670000
|
|
% SIMILARLY PASSED TO PROCESSCONTROLCARD. WHEN AN END CARD IS FOUND, 53680000
|
|
% THE WORK ON THE FILE IS TERMINATED. IF THIS WAS THE GLOBAL FILE, 53690000
|
|
% COMPILATION IS COMPLETED BY INITIALIZING VARIOUS GLOBAL ITEMS, 53700000
|
|
% AND THE LOADER RETURNS TO THE CONTROL CODE AT THE END OF THE 53710000
|
|
% DECK, CAUSING THE INTERPRETER TO BE CALLED. NOTE THAT THE HIGHEST 53720000
|
|
% LEVEL OF RECURSIVE CALLS OF LOADER MAY BE USING THE TELETYPE (IF 53730000
|
|
% PROGRAMFROMREMOTE IS TRUE), IN WHICH CASE THE PROGRAM FILE IS NOT 53740000
|
|
% USED. 53750000
|
|
PROCEDURE LOADER(PROGRAM); FILE PROGRAM; 53760000
|
|
% 53770000
|
|
% 53780000
|
|
BEGIN 53790000
|
|
INTEGER 53800000
|
|
I, 53810000
|
|
J; 53820000
|
|
ALPHA ARRAY 53830000
|
|
INST[0:1022]; 53840000
|
|
LABEL 53850000
|
|
A, 53860000
|
|
CONT, 53870000
|
|
CONTROL, 53880000
|
|
EN, 53890000
|
|
EOF, 53900000
|
|
FIN, 53910000
|
|
GOTINST, 53920000
|
|
INITIALIZE, 53930000
|
|
LABELED, 53940000
|
|
LOAD, 53950000
|
|
RD, 53960000
|
|
TTLOST, 53970000
|
|
UNLABELED; 53980000
|
|
SWITCH INSTBR ~ 53990000
|
|
RD, 54000000
|
|
CONT, 54010000
|
|
CONTROL, 54020000
|
|
EN, 54030000
|
|
UNLABELED, 54040000
|
|
LABELED; 54050000
|
|
% 54060000
|
|
RD: IF DEATH THEN GO TO FIN; 54070000
|
|
INSTSIZE ~ 0; 54080000
|
|
IF PROGRAMFROMREMOTE THEN 54090000
|
|
BEGIN WRITE(DCWRITE[*],FCRLF); IF OUTPUT THEN; 54100000
|
|
IF INPUT THEN 54110000
|
|
BEGIN CLEAR(BUFOUT,10); 54120000
|
|
WHILE CHAR(DCREAD[(I1~DCSIZE-1).W],I1.C) = "#" DO 54130000
|
|
BEGIN 54140000
|
|
WRITE(DCWRITE[*],FAGAIN); 54150000
|
|
IF NOT OUTPUT THEN GO TO EOF; 54160000
|
|
IF NOT INPUT THEN GO TO EOF; 54170000
|
|
END; 54180000
|
|
MOVE(DCSIZE,DCREAD[*],0,INST[*],0); 54190000
|
|
MOVE(80-DCSIZE,BUFOUT[*],0,INST[DCSIZE.W],DCSIZE.C); 54200000
|
|
INSTSIZE ~ DCSIZE; 54210000
|
|
I ~ MAX(80,INSTSIZE); 54220000
|
|
MV(3,STOPPER,5,INST[I.W],I.C); 54230000
|
|
LST(INST); 54240000
|
|
END ELSE GO TO EOF 54250000
|
|
END DATACOMM INPUT ELSE 54260000
|
|
BEGIN 54270000
|
|
IF NOT BUFFERFULL THEN 54280000
|
|
BEGIN READ(PROGRAM,10,BUFFER[*]) [EOF]; 54290000
|
|
BUFFERFULL ~ TRUE; 54300000
|
|
END; 54310000
|
|
IF CONVERTF THEN CONVERT(BUFFER); 54320000
|
|
LST(BUFFER); 54330000
|
|
MOVE(FIELDSIZE,BUFFER[*],0,INST[*],0); 54340000
|
|
BUFFERFULL ~ FALSE; 54350000
|
|
INSTSIZE ~ FIELDSIZE; 54360000
|
|
READ(PROGRAM,10,BUFFER[*]) [EOF]; 54370000
|
|
BUFFERFULL ~ TRUE; 54380000
|
|
WHILE CHAR(BUFFER[*],0) = "." DO 54390000
|
|
BEGIN IF CONVERTF THEN CONVERT(BUFFER); 54400000
|
|
LST(BUFFER); 54410000
|
|
MV(1,BLANK,7,BUFFER[*],0); 54420000
|
|
MOVE(FIELDSIZE,BUFFER[*],0,INST[INSTSIZE.W],INSTSIZE.C); 54430000
|
|
BUFFERFULL ~ FALSE; 54440000
|
|
INSTSIZE ~ INSTSIZE + FIELDSIZE; 54450000
|
|
READ(PROGRAM,10,BUFFER[*]) [EOF]; 54460000
|
|
BUFFERFULL ~ TRUE; 54470000
|
|
END; 54480000
|
|
MV(3,STOPPER,5,INST[INSTSIZE.W],INSTSIZE.C); 54490000
|
|
END; 54500000
|
|
GOTINST: 54510000
|
|
IF SLASTLABEL = 0 THEN IF CARDTYPE(INST[*]) } 5 THEN 54520000
|
|
BEGIN 54530000
|
|
IF NOT SYMBTABLSETUP THEN INITIALIZESYMBTABL; 54540000
|
|
SLASTLABEL ~ ENTERST(SCANCHAR(" "," ",INST[*],0), 54550000
|
|
INST[*],0,"INST"); 54560000
|
|
IF INSTNUM = 0 THEN ENTRY ~ SLASTLABEL; 54570000
|
|
PTR ~ 2; 54580000
|
|
GO TO LOAD; 54590000
|
|
END; 54600000
|
|
GO TO INSTBR[CARDTYPE(INST[*])]; 54610000
|
|
SYNTAXERR(22,0); 54620000
|
|
COMMENT UNRECOGNIZED INSTRUCTION TYPE; 54630000
|
|
GO TO RD; 54640000
|
|
CONTROL: 54650000
|
|
PROCESSCONTROLCARD(INST); 54660000
|
|
GO TO RD; 54670000
|
|
CONT: 54680000
|
|
MESSAGE0(15); 54690000
|
|
MESSAGETT0(15); 54700000
|
|
COMMENT ILLEGAL CONTINUATION--IGNORED; 54710000
|
|
GO TO RD; 54720000
|
|
LABELED: 54730000
|
|
I ~ ENTERST(SCANCHAR(" "," ",INST[*],0),INST[*],0,"INST"); 54740000
|
|
IF NEXTSEGMENT = 0 THEN NEXTSEGMENT ~ I; 54750000
|
|
IF GTF AND GTS THEN GO TO A; 54760000
|
|
AA ~ NEXTSEGMENT & "/:"[24:36:12]; 54770000
|
|
J ~ IF GT THEN 3 ELSE 4; 54780000
|
|
STORECHARS(J,AA,8-J); 54790000
|
|
IF NOT GTS THEN 54800000
|
|
BEGIN SLOC ~ PTR - 3; 54810000
|
|
MV(2,SLOC,6,CODE[MARKER.W],MARKER.C+3); 54820000
|
|
END; 54830000
|
|
IF NOT GTF THEN 54840000
|
|
BEGIN FLOC ~ PTR - 3; 54850000
|
|
MV(2,FLOC,6,CODE[MARKER.W],MARKER.C+5); 54860000
|
|
END; 54870000
|
|
GT ~ GTS ~ GTF ~ TRUE; 54880000
|
|
A: AB ~ STRING(PTR,SLASTLABEL); 54890000
|
|
MV(2,NEXTSEGMENT,6,CODE[0],0); % FILL IN LOC OF NEXT SEGMENT. 54900000
|
|
NEXTSEGMENT ~ 0; % RESET FOR NEXT SEGMENT 54910000
|
|
MOVE(PTR,CODE[*],0,FIRSTCHAR(AB)); 54920000
|
|
VALU[SLASTLABEL].LOC ~ AB; 54930000
|
|
IF PTR > MAXINSTSIZE THEN MAXINSTSIZE ~ PTR; 54940000
|
|
% CHECK WHETHER LABEL HAS OCCURRED BEFORE: 54950000
|
|
IF (AA~VALU[I]).CH } 3 THEN 54960000
|
|
BEGIN MESSAGE0(16); 54970000
|
|
MESSAGETTI(22,INSTNUM); 54980000
|
|
MV(2,FIRSTCHAR(AA),NEXTSEGMENT,6); 54990000
|
|
MV(2,NEXTSEGMENT,6,CODE[0],0); 55000000
|
|
END ELSE CODE[0] ~ NEXTSEGMENT ~ 0; 55010000
|
|
PTR ~ 2; 55020000
|
|
SLASTLABEL ~ I; 55030000
|
|
GO TO LOAD; 55040000
|
|
UNLABELED: 55050000
|
|
IF GTS AND GTF THEN 55060000
|
|
BEGIN MESSAGE0(17); 55070000
|
|
MESSAGETTI(16,INSTNUM); 55080000
|
|
MESSAGES ~ MESSAGES + 1; 55090000
|
|
END; 55100000
|
|
LOAD: 55110000
|
|
MARKER ~ PTR; 55120000
|
|
AA ~ INSTNUM & QMARK[30:42:6]; 55130000
|
|
STORECHARS(3,AA,5); 55140000
|
|
SLOC ~ FLOC ~ 0; 55150000
|
|
STORECHARS(5,0,3); 55160000
|
|
COMPILE(INST); 55170000
|
|
INSTNUM ~ INSTNUM + 1; 55180000
|
|
GO TO RD; 55190000
|
|
EOF: 55200000
|
|
% EITHER EOF ON PROGRAM FILE OR NO INPUT FROM TELETYPE: 55210000
|
|
IF PROGRAMFROMREMOTE THEN % NO INPUT FROM TELETYPE: 55220000
|
|
BEGIN 55230000
|
|
WRITE(DCWRITE[*],FNOINPUT,QMARK); 55240000
|
|
IF NOT OUTPUT THEN GO TO TTLOST; 55250000
|
|
IF NOT INPUT THEN GO TO TTLOST; 55260000
|
|
WHILE J~CHAR(DCREAD[*],SKIPCHAR(" ",DCREAD[*],0)) = "Y" 55270000
|
|
AND J ! "N" DO 55280000
|
|
BEGIN WRITE(DCWRITE[*],FYESORNO); 55290000
|
|
IF NOT OUTPUT THEN GO TO TTLOST; 55300000
|
|
IF NOT INPUT THEN GO TO TTLOST; 55310000
|
|
END; 55320000
|
|
GO TO IF J = "Y" THEN RD ELSE TTLOST; 55330000
|
|
END; 55340000
|
|
IF LOADERLEVEL > 0 THEN % EOF FOR SUB-PROGRAM FILE 55350000
|
|
BEGIN 55360000
|
|
IF INSTSIZE > 0 THEN GO TO GOTINST; 55370000
|
|
% LAST CARD HAS BEEN COMPILED: 55380000
|
|
GO TO FIN; 55390000
|
|
END; 55400000
|
|
% EOF AT LEVEL 0: 55410000
|
|
IF INSTSIZE > 0 THEN GO TO GOTINST; 55420000
|
|
% NO CARD IN INST[*]--END CARD MISSING. 55430000
|
|
WRITE(PRINT,MESSAGE[25]); 55440000
|
|
EXECUTE ~ FALSE; 55450000
|
|
GO TO FIN; 55460000
|
|
TTLOST: 55470000
|
|
MESSAGE0(9); 55480000
|
|
EXECUTE ~ FALSE; 55490000
|
|
GO TO FIN; 55500000
|
|
EN: % END CARD ENCOUNTERED: 55510000
|
|
IF SLASTLABEL ! 0 THEN % FINISH UP LAST INSTRUCTION: 55520000
|
|
BEGIN DEFINE DUMMY=#; 55530000
|
|
IF NOT (GTF AND GTS) THEN 55540000
|
|
BEGIN I ~ IF GT THEN 3 ELSE 4; 55550000
|
|
IF NEXTSEGMENT = 0 THEN 55560000
|
|
BEGIN AA ~ "/-E"; 55570000
|
|
I ~ IF GT THEN 2 ELSE 3; 55580000
|
|
J ~ 2; 55590000
|
|
END ELSE 55600000
|
|
% PATCH--TIE TO NEXT SEGMENT 55610000
|
|
BEGIN I ~ IF GT THEN 3 ELSE 4; 55620000
|
|
AA ~ NEXTSEGMENT & "/:"[24:36:12]; 55630000
|
|
J ~ 3; 55640000
|
|
END; 55650000
|
|
STORECHARS(I,AA,8-I); 55660000
|
|
IF NOT GTS THEN 55670000
|
|
BEGIN SLOC ~ PTR - J; 55680000
|
|
MOVE(2,SLOC,6,CODE[MARKER.W],MARKER.C+3); 55690000
|
|
END; 55700000
|
|
IF NOT GTF THEN 55710000
|
|
BEGIN FLOC ~ PTR - J; 55720000
|
|
MOVE(2,FLOC,6,CODE[MARKER.W],MARKER.C+5); 55730000
|
|
END; 55740000
|
|
END; 55750000
|
|
TEMP ~ STRING(PTR,SLASTLABEL); 55760000
|
|
MOVE(PTR,CODE[*],0,FIRSTCHAR(AA)); 55770000
|
|
VALU[SLASTLABEL].LOC ~ AA; 55780000
|
|
SLASTLABEL ~ 0; 55790000
|
|
IF PTR > MAXINSTSIZE THEN MAXINSTSIZE ~ PTR; 55800000
|
|
END; 55810000
|
|
% FIND ENTRY POINT, IF ANY: 55820000
|
|
P ~ 4 + SKIPCHAR(" ",INST[*],4); 55830000
|
|
IF P < INSTSIZE THEN 55840000
|
|
BEGIN TEMP ~ P; 55850000
|
|
P ~ P + SCANCHAR(" ",QMARK,INST[P.W],P.C); 55860000
|
|
IF P > INSTSIZE THEN P ~ INSTSIZE; 55870000
|
|
ENTRY ~ ENTERST(P-TEMP,INST[*],TEMP,"INST"); 55880000
|
|
END; 55890000
|
|
INITIALIZE: IF LOADERLEVEL = 0 THEN % FINISH UP LOADING: 55900000
|
|
BEGIN ALPHA ARRAY SPECIALINST[0:1]; 55910000
|
|
IF NOT(IOEOF[2] OR PROGRAMFROMREMOTE) THEN 55920000
|
|
BEGIN MOVE(80,BUFFER[*],0,NEXTRECORD[2,*],0); 55930000
|
|
LOOKF[2] ~ TRUE; 55940000
|
|
END; 55950000
|
|
% CHECK FOR NON-EXISTENT LABELS: 55960000
|
|
IF PRINTMESSAGES THEN 55970000
|
|
FOR I ~ 0 STEP 1 UNTIL STRMAX DO 55980000
|
|
FOR J ~ 0 STEP 1 UNTIL STWMAX DO 55990000
|
|
IF (AA~NAMTABL[I,J]).[1:2] = 3 THEN 56000000
|
|
IF VALTABL[I,J].S < 9 THEN 56010000
|
|
BEGIN WRITE(BUFOUT[*],MESSAGE[50]); 56020000
|
|
MOVE(MIN(AA.S,115),FIRSTCHAR(AA),BUFOUT[*],19); 56030000
|
|
WRITE(PRINT,17,BUFOUT[*]); 56040000
|
|
END; 56050000
|
|
IF INFORM THEN INFORMA(0,ENTRY); 56060000
|
|
IF VALU[ENTRY].S { 10 THEN 56070000
|
|
BEGIN MESSAGE0(18); MESSAGETT0(18); 56080000
|
|
EXECUTE ~ FALSE; 56090000
|
|
GO TO FIN; 56100000
|
|
END CHECKING ENTRY POINT; 56110000
|
|
% 56120000
|
|
% INITIALIZATION OF SPECIAL SNOBOL IDENTIFIERS: 56130000
|
|
% 56140000
|
|
% RETURN INSTRUCTION: 56150000
|
|
I ~ ENTERST(6,WORDS[*],54,"INST"); 56160000
|
|
IF VALU[I].S = 0 THEN 56170000
|
|
BEGIN FILL SPECIALINST[*] WITH OCT0000140000000000,"0.R00000"; 56180000
|
|
SPECIALINST[0].[18:12] ~ INSTNUM; 56190000
|
|
AA ~ STRING(11,I); 56200000
|
|
MV(11,SPECIALINST[*],0,FIRSTCHAR(AA)); 56210000
|
|
VALU[I].LOC ~ AA; 56220000
|
|
END; 56230000
|
|
% 56240000
|
|
% FRETURN INSTRUCTION: 56250000
|
|
% 56260000
|
|
I ~ ENTERST(7,WORDS[*],53,"INST"); 56270000
|
|
IF VALU[I].S = 0 THEN 56280000
|
|
BEGIN FILL SPECIALINST[*] WITH OCT0000140000000000,"0.F00000"; 56290000
|
|
SPECIALINST[0].[18:12] ~ INSTNUM; 56300000
|
|
AA ~ STRING(11,I); 56310000
|
|
MV(11,SPECIALINST[*],0,FIRSTCHAR(AA)); 56320000
|
|
VALU[I].LOC ~ AA; 56330000
|
|
END; 56340000
|
|
% 56350000
|
|
% INITIALIZE QUOTE TO """ 56360000
|
|
% 56370000
|
|
I ~ ENTERST(5,WORDS[*],135,"SYMB"); 56380000
|
|
VALU[I].LOC ~ AA ~ STRING(1,I); 56390000
|
|
MOVE(1,QUOTE,7,FIRSTCHAR(AA)); 56400000
|
|
% 56410000
|
|
% INITIALIZE QMARK TO ILLEGAL CHAR 56420000
|
|
% 56430000
|
|
I ~ ENTERST(5,WORDS[*],140,"SYMB"); 56440000
|
|
VALU[I].LOC ~ AA ~ STRING(1,I); 56450000
|
|
MOVE(1,QMARK,7,FIRSTCHAR(AA)); 56460000
|
|
% 56470000
|
|
% INITIALIZE ARROW TO "~" 56480000
|
|
% 56490000
|
|
I ~ ENTERST(5,WORDS[*],145,"SYMB"); 56500000
|
|
VALU[I].LOC ~ AA ~ STRING(1,I); 56510000
|
|
MOVE(1,ARROW,7,FIRSTCHAR(AA)); 56520000
|
|
% 56530000
|
|
% THE INPUT STRING READ GIVES THE REST OF THE FILE PROGRAM. 56540000
|
|
% 56550000
|
|
I ~ ENTERST(4,WORDS[*],150,"SYMB"); 56560000
|
|
VALU[I].IOUSE ~ 2; 56570000
|
|
IO[I] ~ 0 & 2 CFILNO & 1 CIOTYPE & 2 CIOUSE; 56580000
|
|
IOUSAGE[2] ~ I & 2 CIOUSE & 1 CIOTYPE; 56590000
|
|
% 56600000
|
|
% INPUT STRING CARD IS FROM THE CARD-IMAGE FILE NAMED CARD. 56610000
|
|
% 56620000
|
|
I ~ ENTERST(4,WORDS[*],174,"SYMB"); 56630000
|
|
VALU[I].IOUSE ~ 3; 56640000
|
|
IO[I] ~ 0 & 1 CFILNO & 1 CIOTYPE & 3 CIOUSE; 56650000
|
|
IOUSAGE[1] ~ I & 3 CIOUSE & 1 CIOTYPE; 56660000
|
|
% 56670000
|
|
% PRINT IS OUTPUT TO THE LINE PRINTER FILE PRINT 56680000
|
|
% 56690000
|
|
I ~ ENTERST(5,WORDS[*],154,"SYMB"); 56700000
|
|
PRINTLOC ~ I; % SAVE VALUE FOR TRACE FUNCTION 56710000
|
|
IOSPACE[3] ~ 1; 56720000
|
|
VALU[I].IOUSE ~ 1; 56730000
|
|
IO[I] ~ 0 & 3 CFILNO & 1 CIOTYPE & 1 CIOUSE; 56740000
|
|
IOUSAGE[3] ~ I & 1 CIOUSE & 1 CIOTYPE; 56750000
|
|
% 56760000
|
|
% PUNCH IS OUTPUT TO THE CARD PUNCH 56770000
|
|
% 56780000
|
|
I ~ ENTERST(5,WORDS[*],159,"SYMB"); 56790000
|
|
VALU[I].IOUSE ~ 1; 56800000
|
|
IO[I] ~ 0 & 4 CFILNO & 1 CIOTYPE & 1 CIOUSE; 56810000
|
|
IOUSAGE[4] ~ I & 1 CIOUSE & 1 CIOTYPE; 56820000
|
|
% 56830000
|
|
% LOOK IS NON-READING INPUT FROM THE REST OF PROGRAM. 56840000
|
|
% 56850000
|
|
I ~ ENTERST(4,WORDS[*],164,"SYMB"); 56860000
|
|
VALU[I].IOUSE ~ 2; 56870000
|
|
IO[I] ~ 0 & 2 CFILNO & 2 CIOTYPE & 2 CIOUSE; 56880000
|
|
% 56890000
|
|
% SYSPOT--SEE CDC 3600 SNOBOL 56900000
|
|
% 56910000
|
|
I ~ ENTERST(6,WORDS[*],168,"SYMB"); 56920000
|
|
VALU[I].IOUSE ~ 1; 56930000
|
|
IO[I] ~ 0 & 3 CFILNO & 5 CIOTYPE & 1 CIOUSE; 56940000
|
|
% 56950000
|
|
% NEWDISK IS OUTPUT TO THE NEW DISK FILE NEWDISK 56960000
|
|
I ~ ENTERST(7,WORDS[*],178,"SYMB"); 56970000
|
|
VALU[I].IOUSE ~ 3; 56980000
|
|
IO[I] ~ 0 & 5 CFILNO & 1 CIOTYPE & 3 CIOUSE; 56990000
|
|
IOUSAGE[5] ~ I & 3 CIOUSE & 1 CIOTYPE; 57000000
|
|
% 57010000
|
|
% INITIALIZE TELETYPE I/O STRING: 57020000
|
|
% I/O ON TELETYPES IS THROUGH THE STRING TELETYPE, WHICH 57030000
|
|
% FAILS ON INPUT IF THE WAITING TIME IS EXCEEDED, AND FAILS 57040000
|
|
% ON OUTPUT IF THE WAITING TIME IS EXCEEDED OR IF THE 57050000
|
|
% BREAK KEY IS USED. 57060000
|
|
I ~ ENTERST(8,WORDS[*],96,"SYMB"); 57070000
|
|
VALU[I].IOUSE ~ 3; 57080000
|
|
IO[I] ~ 0 & 0 CFILNO & 3 CIOTYPE & 3 CIOUSE; 57090000
|
|
% 57100000
|
|
FILL IOSIZE[*] WITH 80,80,132,80,80; 57110000
|
|
FILL RECORD[*] WITH -1,-1,-1,-1,-1,-1,-1,-1,-1; 57120000
|
|
END; 57130000
|
|
FIN: 57140000
|
|
IF DEATH THEN EXECUTE ~ FALSE; 57150000
|
|
END LOADER; 57160000
|
|
%********LOADER*********************************************************57170000
|
|
%********LOADLIBRARY****************************************************57180000
|
|
% THIS PROCEDURE LOADS A LIBRARY ("OBJECT") FILE CREATED BY A -LIBRARY 57190000
|
|
% CARD DURING AN EARLIER RUN. 57200000
|
|
PROCEDURE LOADLIBRARY(MFID,FID); 57210000
|
|
VALUE MFID, FID; 57220000
|
|
ALPHA MFID, FID; 57230000
|
|
BEGIN INTEGER I, J; 57240000
|
|
REAL L1, L2, L3; 57250000
|
|
BOOLEAN B1, B2, B3; 57260000
|
|
ALPHA ARRAY X[0:7]; 57270000
|
|
MONITOR INDEX; 57280000
|
|
LABEL FAIL, FIN; 57290000
|
|
FILE IN LIB DISK SERIAL (15,6,60); 57300000
|
|
% 57310000
|
|
INDEX ~ FAIL; 57320000
|
|
FILL LIB WITH MFID, FID; 57330000
|
|
SEARCH(LIB,X[*]); 57340000
|
|
IF X[0] { 0 THEN 57350000
|
|
BEGIN MESSAGE0(11); 57360000
|
|
MESSAGETT0(11); 57370000
|
|
GO TO FIN; 57380000
|
|
END; 57390000
|
|
READ(LIB,4,BUFOUT[*]) [FAIL:FAIL]; 57400000
|
|
WRITE(X[*],FLIB0,ENTIER(VERSION)); 57410000
|
|
% TEST VALIDITY OF FILE--SHOULD MATCH FLIB0: 57420000
|
|
IF NOT EQ(32,BUFOUT[*],0,X[*],0) THEN % NOT A VALID LIBE FILE 57430000
|
|
BEGIN IF EQ(20,BUFOUT[*],0,X[*],0) THEN % CREATED BY EARLIER VERSION57440000
|
|
BEGIN WRITE(PRINT,FLIBOLDLP); 57450000
|
|
WRITE(DCWRITE[*],FLIBOLDTT); 57460000
|
|
IF DATACOMF THEN IF OUTPUT THEN; 57470000
|
|
END; 57480000
|
|
GO TO FIN; 57490000
|
|
END; 57500000
|
|
READ(LIB,FLIB1,SCATTERNO,MAXINSTSIZE,B1,L1,B2,L2,B3,L3) [FAIL:FAIL]; 57510000
|
|
IF SCATTERNO > 15 OR MAXINSTSIZE > 8181 THEN GO TO FAIL; 57520000
|
|
IF B1 THEN BEGIN CPULIMITEXISTS~TRUE; CPULIMIT~L1; END; 57530000
|
|
IF B2 THEN BEGIN IOLIMITEXISTS~TRUE; IOLIMIT~L2; END; 57540000
|
|
IF B3 THEN BEGIN RULELIMITEXISTS~TRUE; RULELIMIT~L3; END; 57550000
|
|
READ(LIB,FLIB2,ENTRY,FOR I~0 STEP 1 UNTIL 15 DO USEDST[I],INSTNUM) 57560000
|
|
[FAIL:FAIL]; 57570000
|
|
IF ENTRY > 4095 THEN GO TO FAIL; 57580000
|
|
READ(LIB,FLIB3,FOR I~0 STEP 1 UNTIL 15 DO NEXTCELL[I])[FAIL:FAIL]; 57590000
|
|
FOR I ~ 0 STEP 1 UNTIL 15 DO 57600000
|
|
IF USEDST[I] THEN 57610000
|
|
FOR J ~ 0 STEP 2 UNTIL 254 DO 57620000
|
|
READ(LIB,FLIB4,NAMTABL[I,J],VALTABL[I,J],IOTABL[I,J], 57630000
|
|
NAMTABL[I,J+1],VALTABL[I,J+1],IOTABL[I,J+1])[FAIL:FAIL]; 57640000
|
|
READ(LIB,FLIB5,FOR I~0 STEP 1 UNTIL 31 DO USEDROW[I])[FAIL:FAIL]; 57650000
|
|
READ(LIB,FLIB6,FOR I~0 STEP 1 UNTIL 31 DO DPNTR[I])[FAIL:FAIL]; 57660000
|
|
FOR I ~ 0 STEP 1 UNTIL 31 DO IF DPNTR[I] > 8183 THEN GO TO FAIL; 57670000
|
|
FOR I ~ 0 STEP 1 WHILE USEDROW[I] DO 57680000
|
|
FOR J ~ 0 STEP 6 UNTIL DPNTR[I].W DO 57690000
|
|
BEGIN READ(LIB,6,X[*])[FAIL:FAIL]; 57700000
|
|
IF J < 1020 57710000
|
|
THEN MOVEWDS(6,X[*],DATA[I,J]) 57720000
|
|
ELSE MOVEWDS(3,X[*],DATA[I,J]); 57730000
|
|
END; 57740000
|
|
SYMBTABLSETUP ~ TRUE; 57750000
|
|
CHECKSYMBTABL; 57760000
|
|
GO TO FIN; 57770000
|
|
% 57780000
|
|
FAIL: MESSAGE0(5); 57790000
|
|
MESSAGETT0(5); 57800000
|
|
DEATH ~ TRUE; 57810000
|
|
FIN: 57820000
|
|
END LOADLIBRARY; 57830000
|
|
%********LOADLIBRARY****************************************************57840000
|
|
%********LST************************************************************57850000
|
|
% LST LISTS THE CARD-IMAGE IN A[*]. 57860000
|
|
PROCEDURE LST(A); 57870000
|
|
ALPHA ARRAY A[0]; 57880000
|
|
BEGIN 57890000
|
|
INTEGER I; 57900000
|
|
% 57910000
|
|
IF CARDTYPE(A[*]) } 4 57920000
|
|
THEN WRITE(BUFOUT[*],FI7,INSTNUM) 57930000
|
|
ELSE WRITE(BUFOUT[*],FBL); 57940000
|
|
FOR I ~ LISTSPACES STEP -1 UNTIL 1 DO WRITE(PRINT,FBL); 57950000
|
|
MOVE(80,A[*],0,BUFOUT[*],8); 57960000
|
|
IF LSTF THEN WRITE(PRINT,12,BUFOUT[*]); 57970000
|
|
IF PUNCHF THEN WRITE(PUNCH,10,A[*]); 57980000
|
|
IF DCLIST THEN IF DATACOMF THEN 57990000
|
|
BEGIN FOR I ~ 8 STEP -1 WHILE I } 0 AND 58000000
|
|
EQUAL(8,BLANKS,0,BUFOUT[I],0) DO; 58010000
|
|
WRITE(DCWRITE[*],FVCRLF,8|I+1); 58020000
|
|
MOVE(8|I,BUFOUT[*],0,DCWRITE[*],0); 58030000
|
|
IF OUTPUT THEN; 58040000
|
|
END; 58050000
|
|
END LST; 58060000
|
|
%********LST************************************************************58070000
|
|
%********MESSAGE PROCEDURES*********************************************58080000
|
|
PROCEDURE MESSAGE0(I); 58090000
|
|
VALUE I; INTEGER I; 58100000
|
|
BEGIN SWITCH FORMAT MSG0 ~ 58110000
|
|
("**PROGRAM SEGMENT TOO LONG--INSERT DUMMY LABEL AFTER LAST ", 58120000
|
|
"LABEL AND BEFORE THIS INSTRUCTION."), %0058130000
|
|
(//"**DEFINE FAILURE--ERROR IN LOCAL VARIABLE LIST"), %0158140000
|
|
(//"**DEFINE FAILURE--ERROR IN FIRST ARGUMENT"), %0258150000
|
|
(//"**DEFINE FAILURE--NO ( IN FIRST ARGUMENT"), %0358160000
|
|
(//"**DEFINE FAILURE--NO FIRST ARGUMENT"), %0458170000
|
|
(//"**UNABLE TO READ LIBRARY FILE"), %0558180000
|
|
(/"THE NAMES IN USE ARE:"/), %0658190000
|
|
(/"THE LABELS ARE:"/), %0758200000
|
|
(/"**DUMMY FMT--MSG0[8]"), 58210000
|
|
(//"**TELETYPE LOST--QUITTING."), %0958220000
|
|
(//"**INVALID PARAMETER."), %1058230000
|
|
("**FILE NOT AVAILABLE"), %1158240000
|
|
(/"**DUMMY FORMAT MSG0[12]"//), %1258250000
|
|
("**FUNCTION ALREADY DEFINED--FORMER VALUE LOST"), %1358260000
|
|
(//"**SYMBOL TABLE FULL"), %1458270000
|
|
("**ILLEGAL CONTINUATION CARD"), %1558280000
|
|
("**LABEL ALREADY DEFINED--FORMER VALUE LOST"), %1658290000
|
|
("**THIS STATEMENT CAN NOT BE REACHED"), %1758300000
|
|
(///"**ENTRY POINT UNDEFINED."///), %1858310000
|
|
("**MISSING QUOTE"), %1958320000
|
|
("**UNRECOGNIZED CONTROL CARD"), %2058330000
|
|
("**MISSING PARAMETER"), %2158340000
|
|
("**ATTEMPTED RETURN WITH NO FUNCTION CALLED"), %2258350000
|
|
(/"**END FORMAT--MSG0"); 58360000
|
|
WRITE(PRINT,MSG0[I]); 58370000
|
|
END MESSAGE0; 58380000
|
|
%*************************************** 58390000
|
|
PROCEDURE MESSAGEAI(I,P1,P2); 58400000
|
|
VALUE I, P1, P2; 58410000
|
|
INTEGER I, P2; 58420000
|
|
ALPHA P1; 58430000
|
|
BEGIN SWITCH FORMAT MSGAI ~ 58440000
|
|
(//"**NON-NUMERIC ARGUMENT TO .",A2,"() IN STATEMENT ",I4), 58450000
|
|
(//"**END FORMAT--MSGAI",A6,I10); 58460000
|
|
WRITE(PRINT,MSGAI[I],P1,P2); 58470000
|
|
END MESSAGEAI; 58480000
|
|
%*************************************** 58490000
|
|
PROCEDURE MESSAGEI(I,P); 58500000
|
|
VALUE I, P; 58510000
|
|
INTEGER I, P; 58520000
|
|
BEGIN SWITCH FORMAT MSGI ~ 58530000
|
|
(//"**INTEGER OVERFLOW IN STATEMENT ",I6), %0058540000
|
|
(//"**ATTEMPTED EXECUTION OF INSTRUCTION WITH SYNTAX ERROR--", 58550000
|
|
"STATEMENT ",I6), %0158560000
|
|
(//"**FAILURE OF GO-TO PART IN STATEMENT ",I6), %0258570000
|
|
(//"**ATTEMPTED REPLACEMENT WITH STRING REFERENCE USED IN STRING" 58580000
|
|
" VARIABLE--STATEMENT ",I6/X10,"REPLACEMENT NOT ATTEMPTED."//),%0358590000
|
|
(//"**PROGRAM LIMIT REACHED IN STATEMENT ",I6), %0458600000
|
|
("**CPU TIME LIMIT = ",I12," SECONDS."), %0558610000
|
|
("**I/O TIME LIMIT = ",I12," SECONDS."), %0658620000
|
|
("**RULE LIMIT = ",I12), %0758630000
|
|
(//"**ILLEGAL SECOND PARAMETER TO CLOSE IN STATEMENT ",I6), %0858640000
|
|
(//"**DEFINE FAILURE IN STATEMENT ",I6), %0958650000
|
|
(//"**DUMP REQUESTED IN STATEMENT ",I6," :"), %1058660000
|
|
(//"**FUNCTION DEPTH BEYOND SYSTEM CAPACITY IN STATEMENT ",I6), %1158670000
|
|
(//"**OUT OF SPACE IN STRING STORAGE AREA--UNABLE TO FIND ROOM FOR" 58680000
|
|
" A STRING OF ",I6," CHARACTERS."//), %1258690000
|
|
(//"**PROGRAM DIED IN STATEMENT ",I6/), %1358700000
|
|
(//"**UNABLE TO OPEN FILE IN STATEMENT ",I6,"--TOO MANY FILES ", 58710000
|
|
"ALREADY IN USE."/), %1458720000
|
|
(//"**FILE() ERROR IN STATEMENT ",I6,"--I/O TYPE (2ND PARAMETER)", 58730000
|
|
" MUST BE NULL OR START WITH ",""","I","""," OR ",""","O","""),%1558740000
|
|
(//"**FILE() ERROR IN STATEMENT ",I6,"--NUMBER OF BUFFERS (3RD ", 58750000
|
|
"PARAMETER) MUST BE NUMERIC AND } 1"), %1658760000
|
|
(//"**NON-NUMERIC ARITHMETIC OPERAND IN STATEMENT ",I6), %1758770000
|
|
(//"**DIVIDE BY ZERO IN STATEMENT ",I6), %1858780000
|
|
(//"**INDIRECT ON NULL STRING IN STATEMENT ",I6), %1958790000
|
|
(//"**PUSH-DOWN STACK OVERPOPPED AT FUNCTION RETURN IN STATEMENT ", 58800000
|
|
I6), %2058810000
|
|
(/"**FUNCTION REDEFINED IN STATEMENT ",I6), %2158820000
|
|
(/"**MAX NUMBER OF PARAMS & LOCAL VARIABLES IS ",I3), %2258830000
|
|
(//"**END FORMAT--MSGI",I10); 58840000
|
|
WRITE(PRINT,MSGI[I],P); 58850000
|
|
END MESSAGEI; 58860000
|
|
%*************************************** 58870000
|
|
PROCEDURE MESSAGETT0(I); 58880000
|
|
VALUE I; 58890000
|
|
INTEGER I; 58900000
|
|
BEGIN SWITCH FORMAT MSGT0 ~ 58910000
|
|
("{!**PROGRAM SEGMENT TOO LONG~"), %0058920000
|
|
("{!**DEFINE FAILURE--ERROR IN LOCAL VARIABLE LIST~"), %0158930000
|
|
("{!**DEFINE FAILURE--ERROR IN FIRST ARGUMENT~"), %0258940000
|
|
("{!**DEFINE FAILURE--NO ( IN FIRST ARG~"), %0358950000
|
|
("{!**DEFINE FAILURE--NO FIRST ARGUMENT~"), %0458960000
|
|
("{!BAD LIBRARY FILE{!~"), %0558970000
|
|
("{!DUMP() CALLED{!~"), %0658980000
|
|
("{!!SNOBOL WIPED OUT--SORRY{!!~"), %0758990000
|
|
("{!INTERPRETER STACK OVERFLOW--STATEMENT TOO COMPLEX{!~"), %0859000000
|
|
("{!DUMMY FMT--MSGT0[9]{!!~"), %0959010000
|
|
("{!**INVALID PARAMETER~"), %1059020000
|
|
("{!FILE NOT AVAILABLE{!~"), %1159030000
|
|
("{!DUMMY FMT MSGT0[12]--SHOW TO SYSTEM AUTHORS.{!!"), %1259040000
|
|
("{!**FUNCTION ALREADY DEFINED--FORMER VALUE LOST~"), %1359050000
|
|
("{!SYMBOL TABLE FULL{!~"), %1459060000
|
|
("{!ILLEGAL CONTINUATION CARD{!~"), %1559070000
|
|
("{!DUMMY FMT--MSGT0[16]{!!~"), %1659080000
|
|
("{!DUMMY FMT--MSGT0[17]{!!~"), %1759090000
|
|
("{!!ENTRY POINT UNDEFINED{!~"), %1859100000
|
|
("{!MISSING QUOTE{!~"), %1959110000
|
|
("{!ILLEGAL CONTROL CARD{!~"), %2059120000
|
|
("{!MISSING PARAMETER{!~"), %2159130000
|
|
("{!!END FMT MSGT0{!!~"); 59140000
|
|
IF DATACOMF THEN 59150000
|
|
BEGIN WRITE(DCWRITE[*],MSGT0[I]); 59160000
|
|
IF OUTPUT THEN; 59170000
|
|
END; 59180000
|
|
END MESSAGETT0; 59190000
|
|
%*************************************** 59200000
|
|
PROCEDURE MESSAGETTA(I,P); 59210000
|
|
VALUE I, P; 59220000
|
|
INTEGER I; 59230000
|
|
ALPHA P; 59240000
|
|
BEGIN SWITCH FORMAT MSGTA ~ 59250000
|
|
("{!EH",A1,"{!~"), %0059260000
|
|
("{!END FMT MSGTA ",A6,"{!!~"); 59270000
|
|
IF DATACOMF THEN 59280000
|
|
BEGIN WRITE(DCWRITE[*],MSGTA[I]); 59290000
|
|
IF OUTPUT THEN; 59300000
|
|
END; 59310000
|
|
END; 59320000
|
|
%*************************************** 59330000
|
|
PROCEDURE MESSAGETTAI(I,P1,P2); 59340000
|
|
VALUE I, P1, P2; 59350000
|
|
INTEGER I, P2; 59360000
|
|
ALPHA P1; 59370000
|
|
BEGIN SWITCH FORMAT MSGTAI ~ 59380000
|
|
("{!NON-NUMERIC ARGUMENT TO .",A2,"() IN STMT ",I*,"{!~"), %0059390000
|
|
("{!!END FMT MSGTAI ",I*,A6,"{!!~"); 59400000
|
|
IF DATACOMF THEN 59410000
|
|
BEGIN WRITE(DCWRITE[*],MSGTAI[I],P1,DIGITS(P2),P2); 59420000
|
|
IF OUTPUT THEN; 59430000
|
|
END; 59440000
|
|
END; 59450000
|
|
%*************************************** 59460000
|
|
PROCEDURE MESSAGETTI(I,P); 59470000
|
|
VALUE I, P; 59480000
|
|
INTEGER I, P; 59490000
|
|
BEGIN SWITCH FORMAT MSGTI ~ 59500000
|
|
("{!**INTEGER OVERFLOW IN STMT ",I*,"{!~"), %0059510000
|
|
("{!!**ATTEMPTED EXECUTION OF STMT WITH SYNTAX ERROR--", 59520000
|
|
"STMT ",I*,"{!~"), %0159530000
|
|
("{!!**GO-TO PART IN STMT ",I*," FAILED{!~"), %0259540000
|
|
("{!**ATTEMPTED REPLACEMENT WITH STRING REFERENCE USED IN STRING ", 59550000
|
|
"VARIABLE, IN STMT ",I*,"{!**REPLACEMENT NOT ATTEMPTED{!~"), %0359560000
|
|
("{!**PROGRAM LIMIT REACHED IN STATEMENT ",I*,"{!~"), %0459570000
|
|
("CPU TIME LIMIT = ",I*," SECONDS{!~"), %0559580000
|
|
("I/O TIME LIMIT = ",I*," SECONDS{!~"), %0659590000
|
|
("RULE LIMIT = ",I*,"{!~"), %0759600000
|
|
("{!ILLEGAL 2ND PARAM TO CLOSE IN STMT ",I*,"{!~"), %0859610000
|
|
("{!DEFINE FAILURE IN STATEMENT ",I*,"{!~"), %0959620000
|
|
("{!!FATAL ERROR IN STATEMENT ",I*,"{!~"), %1059630000
|
|
("{!!**FUNCTION DEPTH BEYOND SYSTEM CAPACITY IN STMT ",I*,"{!~"), %1159640000
|
|
("{!**OUT OF SPACE--UNABLE TO FIND ROOM FOR STRING OF ",I*, 59650000
|
|
" CHARACTERS{!~"), %1259660000
|
|
("{!**PROGRAM DIED IN STATEMENT ",I*,"{!!~"), %1359670000
|
|
("{!**ATTEMPTED RETURN WITH NO FUNCTION CALLED--STMT ",I*,"{!~"), %1459680000
|
|
("# ",I*,"{!~"), %1559690000
|
|
("{!STMT. ",I*," CANT BE REACHED.{!~"), %1659700000
|
|
("{!NON-NUMERIC ARITHMETIC OPERAND IN STATEMENT ",I*,"{!~"), %1759710000
|
|
("{!DIVIDE BY ZERO IN STATEMENT ",I*,"{!~"), %1859720000
|
|
("{!INDIRECT ON NULL STRING IN STMT ",I*,"{!~"), %1959730000
|
|
("{!PUSH-DOWN STACK OVERPOPPED AT FCT RETURN IN STMT ",I*,"{!~"), %2059740000
|
|
("{!**FUNCTION RE-DEFINED IN STATEMENT ",I*,"{!~"), %2159750000
|
|
("{!**LABEL RE-DEFINED IN STATEMENT ",I*,"{!~"), %2259760000
|
|
("{!!**NORMAL TERMINATION IN STATEMENT ",I*,".{!!~"), %2359770000
|
|
("{!MAX # OF PARAMS & LOC VARS IS ",I*,"{!~"), %24 59780000
|
|
("{!!END FMT MSGTI ",I*,"{!!~"); 59790000
|
|
IF DATACOMF THEN 59800000
|
|
BEGIN WRITE(DCWRITE[*],MSGTI[I],DIGITS(P),P); 59810000
|
|
IF OUTPUT THEN; 59820000
|
|
END; 59830000
|
|
END; 59840000
|
|
%********MESSAGE PROCEDURES*********************************************59850000
|
|
%********MIN************************************************************59860000
|
|
INTEGER PROCEDURE MIN(A,B); VALUE A,B; INTEGER A,B; 59870000
|
|
MIN ~ IF A { B THEN A ELSE B; 59880000
|
|
%********MIN************************************************************59890000
|
|
%********MNEMNO*********************************************************59900000
|
|
% THE STRING BETWEEN A[P.W],P.C AND THE NEXT BLANK IS SEARCHED FOR 59910000
|
|
% IN THE N-TH LIST OF MNEMONICS, AND THE APPROPRIATE INDEX IS RETURNED. 59920000
|
|
INTEGER PROCEDURE MNEMNO(N,A,P); 59930000
|
|
VALUE N; 59940000
|
|
INTEGER N, P; 59950000
|
|
ARRAY A[0]; 59960000
|
|
BEGIN LABEL FIN; 59970000
|
|
INTEGER I, J; 59980000
|
|
ALPHA AA; 59990000
|
|
IF I~SCANCHAR(" ","~",A[P.W],P.C) > 6 60000000
|
|
THEN MNEMNO ~ 0 ELSE 60010000
|
|
BEGIN AA ~ 0; 60020000
|
|
MV(I,A[P.W],P.C,AA,8-I); 60030000
|
|
AA ~ AA; 60040000
|
|
FOR J~MNEMONIC[N,0] STEP -1 UNTIL 1 DO 60050000
|
|
IF AA = MNEMONIC[N,J] THEN 60060000
|
|
BEGIN MNEMNO ~ J; 60070000
|
|
P ~ P + I; 60080000
|
|
GO TO FIN; 60090000
|
|
END; 60100000
|
|
MNEMNO ~ 0; 60110000
|
|
END; 60120000
|
|
FIN: 60130000
|
|
END MNEMNO; 60140000
|
|
%********MNEMNO*********************************************************60150000
|
|
%********NEWCELL********************************************************60160000
|
|
% NEWCELL RETURNS THE ADDRESS OF AN AVAILABLE SYMBOL TABLE CELL--USING 60170000
|
|
% ROW I IF POSSIBLE. CELLS GIVEN BY NEWCELL ARE "PERMANENT" IN THE 60180000
|
|
% SENSE THAT RETURNCELL IS NEEDED TO RETURN THEM TO AVAILABLE SPACE. 60190000
|
|
% COMPARE TEMPCELL, WHICH RETURNS A CELL THAT WILL ONLY LAST UNTIL 60200000
|
|
% THE END OF THE INSTRUCTION 60210000
|
|
ALPHA PROCEDURE NEWCELL(I); 60220000
|
|
VALUE I; INTEGER I; 60230000
|
|
BEGIN LABEL ROWFULL, RETURN; 60240000
|
|
INTEGER C; 60250000
|
|
IF NEXTCELL[I] = 0 THEN GO TO ROWFULL; 60260000
|
|
C ~ NEXTCELL[I]; 60270000
|
|
NEXTCELL[I] ~ NAME[C].LINK; 60280000
|
|
GO TO RETURN; 60290000
|
|
ROWFULL: FOR I ~ 0 STEP 1 WHILE I { 15 AND USEDST[I] DO 60300000
|
|
IF NEXTCELL[I] ! 0 THEN 60310000
|
|
BEGIN C ~ NEXTCELL[I]; 60320000
|
|
NEXTCELL[I] ~ NAME[C].LINK; 60330000
|
|
GO TO RETURN; 60340000
|
|
END; 60350000
|
|
IF I { 15 THEN 60360000
|
|
BEGIN NEWSTROW(I); 60370000
|
|
C ~ 0 & I CONCSTR; 60380000
|
|
GO TO RETURN; 60390000
|
|
END; 60400000
|
|
MESSAGE0(14); 60410000
|
|
MESSAGETT0(14); 60420000
|
|
DEATH ~ TRUE; 60430000
|
|
C ~ 0; 60440000
|
|
RETURN: 60450000
|
|
% IF NEXTCELL[I] > USEDCELL[I] THEN USEDCELL[I] ~ NEXTCELL[I]; 60460000
|
|
NAME[C] ~ 0; 60470000
|
|
VALU[C] ~ 0; 60480000
|
|
NEWCELL ~ C; 60490000
|
|
% IF INFORM THEN INFORMIA(1,I,C); 60500000
|
|
END NEWCELL; 60510000
|
|
%********NEWCELL********************************************************60520000
|
|
%********NEWSTROW*******************************************************60530000
|
|
% NEWSTROW OPENS UP ROW I OF THE SYMBOL TABLE, AND INITIALIZES AN 60540000
|
|
% AVAILABLE SPACE LIST IN THIS ROW. 60550000
|
|
PROCEDURE NEWSTROW(I); VALUE I; INTEGER I; 60560000
|
|
BEGIN INTEGER J; 60570000
|
|
NAMTABL[I,0].LINK ~ 1 & I CONCSTR; 60580000
|
|
FOR J ~ 1 STEP 1 WHILE J < STWMAX DO 60590000
|
|
NAMTABL[I,J].LINK ~ (J+1) & I CONCSTR; 60600000
|
|
USEDST[I] ~ TRUE; 60610000
|
|
NEXTCELL[I] ~ 1 & I CONCSTR; 60620000
|
|
END NEWSTROW; 60630000
|
|
%********NEWSTROW*******************************************************60640000
|
|
%********NULLARGS*******************************************************60650000
|
|
% INTERPRETER PROCEDURE: 60660000
|
|
% NULLARGS(N) PUTS N NULL STRINGS ON TOP OF THE STACK. 60670000
|
|
BOOLEAN PROCEDURE NULLARGS(N); VALUE N; INTEGER N; 60680000
|
|
BEGIN LABEL RETURN; 60690000
|
|
INTEGER I; 60700000
|
|
IF SP + N } STACKSIZE THEN 60710000
|
|
BEGIN 60720000
|
|
INFORMI(4,INSTNO); 60730000
|
|
NULLARGS ~ FALSE; 60740000
|
|
GO TO RETURN; 60750000
|
|
END; 60760000
|
|
FOR I ~ SP+N-1 STEP -1 UNTIL SP DO 60770000
|
|
PST[I] ~ PTYPE[I] ~ PSIZE[I] ~ 0; 60780000
|
|
SP ~ SP + N; 60790000
|
|
NULLARGS ~ TRUE; 60800000
|
|
RETURN: 60810000
|
|
END NULLARGS; 60820000
|
|
%********NULLARGS*******************************************************60830000
|
|
%********NUMVAL*********************************************************60840000
|
|
% INTERPRETER PROCEDURE: 60850000
|
|
% IF THE STRING VALUE OF SYMB TABLE ENTRY ST IS NON-NUMERIC, 60860000
|
|
% FALSE IS RETURNED AND VAL IS UNALTERED. IF THE STRING IS NUMERIC, 60870000
|
|
% THE VALUE OF THE STRING IS ASSIGNED TO VAL, AND TRUE IS RETURNED. 60880000
|
|
BOOLEAN PROCEDURE NUMVAL(ST,VAL); 60890000
|
|
VALUE ST; ALPHA ST; INTEGER VAL; 60900000
|
|
BEGIN BOOLEAN STREAM PROCEDURE NUMERIC(S,L,I); VALUE S,I; 60910000
|
|
BEGIN LABEL RETURN; 60920000
|
|
TALLY ~ 0; 60930000
|
|
SI ~ LOC S; SI ~ SI + 7; 60940000
|
|
IF SC = "0" THEN 60950000
|
|
BEGIN TALLY ~ 1; GO TO RETURN; END; 60960000
|
|
SI ~ L; SI ~ SI + I; 60970000
|
|
IF SC = "-" THEN 60980000
|
|
BEGIN SI ~ SI + 1; TALLY ~ S; 60990000
|
|
TALLY ~ TALLY + 63; S ~ TALLY; TALLY ~ 0; 61000000
|
|
END; 61010000
|
|
S(IF SC < "0" THEN JUMP OUT TO RETURN; 61020000
|
|
IF SC > "9" THEN JUMP OUT TO RETURN; 61030000
|
|
SI ~ SI + 1); 61040000
|
|
TALLY ~ 1; 61050000
|
|
RETURN: NUMERIC ~ TALLY; 61060000
|
|
END NUMERIC; 61070000
|
|
% 61080000
|
|
ST ~ VALU[ST]; 61090000
|
|
IF NUMERIC(STRINGLOC(ST)) THEN 61100000
|
|
BEGIN IF ST.CH < 4096 61110000
|
|
THEN READ(DATA[ST.R,*],FNUM,ST.CH,ST.S,VAL) 61120000
|
|
ELSE READ(DATA[ST.R,*],FINT,ST.W,ST.C,ST.S,VAL); 61130000
|
|
% THIS DISTINCTION IS NECESSARY BECAUSE WHEN AN "X*" FORMAT 61140000
|
|
% (AS IN FNUM) IS USED, ONLY THE LAST 12 BITS OF THE NUMBER 61150000
|
|
% ARE USED, AND A CH FIELD CONTAINS 13 BITS. ON THE OTHER 61160000
|
|
% HAND, IF "*D" IS USED (AS IN FINT), AND THE NUMBER GIVEN 61170000
|
|
% IS ZERO, AN INFINITE LOOP OCCURS, SINCE 0 IS TAKEN TO MEAN 61180000
|
|
% "REPEAT INDEFINITELY", AND THE REST OF THE FORMAT WILL NEVER 61190000
|
|
% BE REACHED. THUS, TWO CASES ARE NECESSARY. 61200000
|
|
NUMVAL ~ TRUE; 61210000
|
|
END ELSE NUMVAL ~ FALSE; 61220000
|
|
% IF INFORM THEN INFORMI(12,VAL); 61230000
|
|
END NUMVAL; 61240000
|
|
%********NUMVAL*********************************************************61250000
|
|
%********OUTPUT*********************************************************61260000
|
|
% TELETYPE OUTPUT PROCEDURE: 61270000
|
|
BOOLEAN PROCEDURE OUTPUT; 61280000
|
|
BEGIN 61290000
|
|
LABEL LOOP, NOGO, BROKE, BADNEWS, EXIT; 61300000
|
|
INTEGER CNT, Q, R, TIMEX; 61310000
|
|
BOOLEAN GPMK; 61320000
|
|
REAL S; 61330000
|
|
ARRAY TANK[0:BUFOUTSIZE-1]; 61340000
|
|
STREAM PROCEDURE STOPPER(A); 61350000
|
|
BEGIN DI~A; DI~DI+7; DS~LIT "~" END STOPPER; 61360000
|
|
BOOLEAN STREAM PROCEDURE MOVE(A,B,C); VALUE C; 61370000
|
|
BEGIN SI~A; SI~SI+C; DI~B; TALLY~0; 61380000
|
|
DCOUTCHAR(IF SC="~" THEN TALLY~1; DS~CHR); 61390000
|
|
MOVE~TALLY 61400000
|
|
END MOVE; 61410000
|
|
% IF INFORM THEN INFORMII(5,STAT[USER].[9:4],STAT[USER].[14:4]); 61420000
|
|
IF NOT DATACOMF THEN GO TO EXIT; 61430000
|
|
OUTPUT ~ TRUE; 61440000
|
|
IF BREAK THEN 61450000
|
|
BEGIN IF (BREAK~BOOLEAN(STATUS(STAT[USER],1).[26:1])) THEN 61460000
|
|
BEGIN WHEN(5); 61470000
|
|
BREAK ~ BOOLEAN(STATUS(STAT[USER],1).[26:1]); 61480000
|
|
END; 61490000
|
|
IF BREAK THEN GO TO BADNEWS; 61500000
|
|
END; 61510000
|
|
STOPPER(DCWRITE[(ANSSIZE-1).W]); 61520000
|
|
TIMEX ~ TIME(1); 61530000
|
|
LOOP: Q~CNT DIV 8; R~CNT MOD 8; 61540000
|
|
GPMK ~ MOVE(DCWRITE[Q],TANK[1],R); 61550000
|
|
MV(1,ARROW,7,TANK[4],4); 61560000
|
|
WRITE(DCOUT(STAT[USER],0),BUFOUTSIZE,TANK[*]) [NOGO:BROKE]; 61570000
|
|
IF BOOLEAN(STATUS(STAT[USER],1).[26:1]) THEN GO TO BROKE; 61580000
|
|
IF GPMK THEN GO TO EXIT; 61590000
|
|
CNT ~ CNT + DCOUTCHAR; 61600000
|
|
GO TO LOOP; 61610000
|
|
BROKE: 61620000
|
|
BREAK ~ TRUE; 61630000
|
|
OUTPUT ~ FALSE; 61640000
|
|
GO TO EXIT; 61650000
|
|
NOGO: 61660000
|
|
% SOME FIELDS IN THE STATUS WORD ARE: 61670000
|
|
% [23:1] = 1 IF ABNORMAL CONDITION SENSED BY ADAPTER. 61680000
|
|
% [24:1] = 1 IF READ READY. 61690000
|
|
% [28:1] = 1 IF BUFFER OVERFLOW (ON INPUT). 61700000
|
|
% [30:1] = 1 IF NOT READY. 61710000
|
|
S ~ STATUS(STAT[USER],0); 61720000
|
|
IF BOOLEAN(S.[30:1]) THEN GO TO BADNEWS; 61730000
|
|
IF TIME(1) - TIMEX > WAITTIME THEN GO TO BADNEWS; 61740000
|
|
IF S.[23:2]!0 OR BOOLEAN(S.[28:1]) THEN WHEN(5); 61750000
|
|
% WAIT 5 SECS IF WRITE DID NOT TIME OUT 61760000
|
|
GO TO LOOP; 61770000
|
|
BADNEWS: 61780000
|
|
OUTPUT ~ FALSE; 61790000
|
|
FINDUSERS; 61800000
|
|
EXIT: END OUTPUT; 61810000
|
|
%========== END DATA COM OUTPUT PROCEDURE ==============================61820000
|
|
%********POP************************************************************61830000
|
|
BOOLEAN PROCEDURE POP(STLOC); VALUE STLOC; ALPHA STLOC; 61840000
|
|
BEGIN ALPHA T, ST; 61850000
|
|
INTEGER I; 61860000
|
|
% IF INFORM THEN INFORMA(2,STLOC); 61870000
|
|
ST ~ VALU[STLOC].LINK; 61880000
|
|
IF ST = 0 THEN POP ~ FALSE ELSE 61890000
|
|
BEGIN VALU[STLOC] ~ T ~ VALU[ST]; 61900000
|
|
IF T.CH } 3 THEN % RESET BACK-POINTER TO SYMB TABLE. 61910000
|
|
BEGIN I ~ T.CH - 2; 61920000
|
|
MV(2,STLOC,6,DATA[T.R,I.W],I.C); 61930000
|
|
END; 61940000
|
|
VALU[STLOC].LINK ~ VALU[ST].LINK; % LINK TO NEXT CELL ON STACK. 61950000
|
|
RETURNCELL(ST); % PUT BACK ON AVSL. 61960000
|
|
POP ~ TRUE; 61970000
|
|
END; 61980000
|
|
END POP; 61990000
|
|
%********POP************************************************************62000000
|
|
%********PROCESSCONTROLCARD*********************************************62010000
|
|
% PROCESSCONTROLCARD USES CHAR, MOVECHARS, CONTROLPARAMETER. 62020000
|
|
PROCEDURE PROCESSCONTROLCARD(A); 62030000
|
|
ALPHA ARRAY A[0]; 62040000
|
|
BEGIN INTEGER I, P; 62050000
|
|
LABEL 62060000
|
|
E, % END OF PROCEDURE 62070000
|
|
ILLEGAL, % ILLEGAL CONTROL CARD 62080000
|
|
NOFILE, % FILE REFERENCED WHICH CANT BE READ 62090000
|
|
PARAMERR, % ERROR IN PARAMETER TO CONTROL CARD 62100000
|
|
PARAMMISSING; % CANT FIND A NEEDED PARAMETER TO CONTROL CARD 62110000
|
|
% 62120000
|
|
P ~ I ~ 1 + SKIPCHAR(" ",A[*],1); 62130000
|
|
DO P ~ P + 1 UNTIL P - I > 7 OR CHARTYPE[CHAR(A[*],P)] ! 3; 62140000
|
|
IF P - I > 7 THEN GO TO ILLEGAL; 62150000
|
|
AA ~ 0; 62160000
|
|
MV(P-I,A[*],I,AA,8-P+I); 62170000
|
|
FOR I ~ NUMCONTROLCARDS STEP -1 UNTIL 0 DO 62180000
|
|
IF AA = CONTROLCARD[I] THEN 62190000
|
|
BEGIN CASE I OF 62200000
|
|
%********CONTROL CARDS***************** 62210000
|
|
BEGIN GO TO ILLEGAL; 62220000
|
|
% 1: -DEBUG TURNS ON DEBUG MODE 62230000
|
|
BEGIN DEBUGGING ~ TRUE; 62240000
|
|
IF NEXTSOURCERECORD = 0 THEN NEXTSOURCERECORD ~ 1; 62250000
|
|
DEBUGRULELIMITEXISTS ~ ALIMITEXISTS ~ TRUE; 62260000
|
|
% THIS WILL CAUSE SUSPENSION AT THE FIRST INSTRUCTION. 62270000
|
|
END; 62280000
|
|
% 2: -PCC CAUSES ALL CONTROL CARDS TO BE PRINTED 62290000
|
|
PCC ~ TRUE; 62300000
|
|
% 3: -LIST CAUSES THE PROGRAM TO BE LISTED. 62310000
|
|
BEGIN IF LISTSPACES~CONTROLPARAMETER(A,P) < 0 THEN LISTSPACES ~ 0; 62320000
|
|
LSTF ~ TRUE; 62330000
|
|
END; 62340000
|
|
% 4: -UNLIST CAUSES THE LISTING TO STOP 62350000
|
|
LSTF ~ FALSE; 62360000
|
|
% 5: -PUNCH CAUSES THE PROGRAM DECK TO BE PUNCHED 62370000
|
|
PUNCHF ~ TRUE; 62380000
|
|
% 6: -EJECT EJECTS THE LINE PRINTER TO THE NEXT PAGE 62390000
|
|
BEGIN I ~ CONTROLPARAMETER(A,P); 62400000
|
|
IF I < -1 OR I > 11 THEN GO TO PARAMERR; 62410000
|
|
IF I < 1 THEN I ~ 1; 62420000
|
|
IF LSTF THEN WRITE(PRINT[I]); 62430000
|
|
END; 62440000
|
|
% 7: -SPACE <INTEGER> PRODUCES <INTEGER> BLANK LINES IN THE LISTING 62450000
|
|
BEGIN 62460000
|
|
I ~ CONTROLPARAMETER(A,P); 62470000
|
|
FOR I ~ I-1 WHILE I } 0 DO WRITE(PRINT,FBL); 62480000
|
|
END; 62490000
|
|
% 8: -WIDTH <INTEGER> SETS THE NUMBER OF CHARS IN EACH CARD IMAGE 62500000
|
|
% TO BE CONSIDERED PART OF AN INSTRUCTION; ALL CHARS AFTER THE NTH 62510000
|
|
% ARE TO BE IGNORED BY THE COMPILER. 62520000
|
|
% IF THIS CARD ISNT USED, THEN FIELDSIZE IS ASSUMED TO BE 72. 62530000
|
|
BEGIN 62540000
|
|
IF I ~ CONTROLPARAMETER(A,P) > 80 OR I < 0 62550000
|
|
THEN GO TO PARAMERR; 62560000
|
|
FIELDSIZE ~ I; 62570000
|
|
END; 62580000
|
|
% 9: -26 TURNS ON CHARACTER SET CONVERSION FROM THE 026 KEYPUNCH 62590000
|
|
BEGIN CONVERTF ~ TRUE; 62600000
|
|
CONVERTSTRINGS ~ FALSE; 62610000
|
|
END; 62620000
|
|
% 10: -3600 CAUSES CHAR SET CONVERSION AND TRANSLATION OF I/O 62630000
|
|
% STRINGS FROM CDC 3600 SNOBOL. 62640000
|
|
CONVERTF ~ CONVERTSTRINGS ~ TRUE; 62650000
|
|
% 11: -B5500 CANCELS THE EFFECT OF PREVIOUS -26 AND -3600 CARDS. 62660000
|
|
CONVERTF ~ CONVERTSTRINGS ~ FALSE; 62670000
|
|
% 12: -DEFINE A,B,C ACTS LIKE THE INTRINSIC FUNCTION DEFINE, 62680000
|
|
% BUT SETS UP THE FUNCTION AT COMPILE TIME. THIS SAVES THE SPACE 62690000
|
|
% THAT A RUN-TIME DEFINITION WOULD TAKE FOR LITERALS AND INSTRUC- 62700000
|
|
% TION CODE, PLUS THE TIME NEEDED FOR COMPILATION. 62710000
|
|
% A, B, AND C MUST BE LITERALS. 62720000
|
|
BEGIN INTEGER ARRAY ST[1:3]; 62730000
|
|
INTEGER J; 62740000
|
|
LABEL DEF1, DEFERR; 62750000
|
|
% 62760000
|
|
IF NOT SYMBTABLSETUP THEN INITIALIZESYMBTABL; 62770000
|
|
FOR J ~ 1,2,3 DO ST[J] ~ 0; 62780000
|
|
FOR J ~ 1,2,3 DO 62790000
|
|
BEGIN P ~ P + SCANCHAR(""",",",A[P.W],P.C); 62800000
|
|
IF P } INSTSIZE THEN GO TO DEF1; 62810000
|
|
IF CHAR(A[P.W],P.C) = "," THEN 62820000
|
|
BEGIN ST[J] ~ 0; 62830000
|
|
P ~ P + 1; 62840000
|
|
END ELSE 62850000
|
|
BEGIN P ~ P + 1; 62860000
|
|
I ~ P + SCANCHAR(""",QMARK,A[P.W],P.C); 62870000
|
|
IF I } INSTSIZE THEN GO TO DEFERR; 62880000
|
|
ST[J] ~ NEWCELL(0); 62890000
|
|
AA ~ STRING(I-P,ST[J]); 62900000
|
|
MOVE(I-P,A[P.W],P.C,DATA[AA.R,AA.W],AA.C); 62910000
|
|
VALU[ST[J]] ~ AA; 62920000
|
|
P ~ I + SCANCHAR(",",""",A[I.W],I.C+1) + 1; 62930000
|
|
IF CHAR(A[P.W],P.C) = "," THEN P ~ P + 1; 62940000
|
|
IF P } INSTSIZE THEN GO TO DEF1; 62950000
|
|
END; 62960000
|
|
END; 62970000
|
|
DEF1: IF NOT SNBLDEFINE(ST[1],ST[2],ST[3]) THEN GO TO PARAMERR; 62980000
|
|
FOR J ~ 1,2,3 DO IF ST[J] ! 0 THEN RETURNCELL(ST[J]); 62990000
|
|
GO TO E; 63000000
|
|
DEFERR: MESSAGE0(19); % MISSING QUOTE 63010000
|
|
MESSAGETT0(19); 63020000
|
|
END DEFINE; 63030000
|
|
% 13: -WAIT <N> SETS THE WAITING TIME FOR REMOTE I/O TO N SECONDS. 63040000
|
|
% IF N IS NOT > 0, THEN STANDARDWAITTIME IS USED. 63050000
|
|
BEGIN AA ~ CONTROLPARAMETER(A,P); 63060000
|
|
IF AA < 0 THEN GO TO PARAMERR; 63070000
|
|
WAITTIME ~ AA | 60; 63080000
|
|
END; 63090000
|
|
% 14 -LIMIT <I> LSINTEGER> PUTS A LIMIT OF <INTEGER> TO THE 63100000
|
|
% QUANTITY <I>; THIS LIMIT IS CHECKED AT THE START OF THE EXECUTION 63110000
|
|
% OF EACH INSTRUCTION. THE CURRENT VALUES OF <I> ARE: 63120000
|
|
% RULES PUTS A LIMIT TO THE NUMBER OF STATEMENTS EXECUTED. 63130000
|
|
% PROCESS PUTS A LIMIT (IN SECONDS) TO CPU TIME 63140000
|
|
% IO PUTS A LIMIT (IN SECONDS) TO I/O TIME 63150000
|
|
BEGIN LABEL LOOP; 63160000
|
|
LOOP: P ~ P + 1; 63170000
|
|
P ~ P + SKIPCHAR(" ",A[*],P); 63180000
|
|
IF P > INSTSIZE THEN GO TO PARAMERR; 63190000
|
|
I ~ SCANCHAR(" ","=",A[*],P); 63200000
|
|
IF I > INSTSIZE THEN GO TO PARAMERR; 63210000
|
|
IF I = 2 THEN 63220000
|
|
BEGIN IF EQ(2,WORDS[8],3,A[*],P) 63230000
|
|
THEN I ~ 0 ELSE GO TO LOOP; 63240000
|
|
END ELSE 63250000
|
|
IF I = 5 THEN 63260000
|
|
BEGIN IF EQ(5,WORDS[8],5,A[*],P) 63270000
|
|
THEN I ~ 1 ELSE GO TO LOOP; 63280000
|
|
END ELSE 63290000
|
|
IF I = 7 THEN 63300000
|
|
BEGIN IF EQ(7,WORDS[9],2,A[*],P) 63310000
|
|
THEN I ~ 2 ELSE GO TO LOOP; 63320000
|
|
END ELSE 63330000
|
|
GO TO LOOP; 63340000
|
|
IF (P~CONTROLPARAMETER(A,P)) < 0 THEN GO TO PARAMERR; 63350000
|
|
CASE I OF 63360000
|
|
BEGIN 63370000
|
|
BEGIN IOLIMIT ~ P | 60; 63380000
|
|
IOLIMITEXISTS ~ TRUE; 63390000
|
|
END; 63400000
|
|
BEGIN RULELIMIT ~ P; 63410000
|
|
RULELIMITEXISTS ~ TRUE; 63420000
|
|
END; 63430000
|
|
BEGIN CPULIMIT ~ P | 60; 63440000
|
|
CPULIMITEXISTS ~ TRUE; 63450000
|
|
END 63460000
|
|
END CASES; 63470000
|
|
ALIMITEXISTS ~ TRUE; 63480000
|
|
END LMT; 63490000
|
|
% 15: -SIZE <N> TELLS THE COMPILER HOW MANY SCATTER AREAS TO SET 63500000
|
|
% ASIDE IN SYMBTABL. THIS CONTROL CARD MUST APPEAR BEFORE ANY SNOBOL63510000
|
|
% INSTRUCTIONS; THE VALUE OF <N> SHOULD BE APPROXIMATELY THE NUMBER 63520000
|
|
% OF INSTRUCTIONS IN THE PROGRAM 63530000
|
|
BEGIN DEFINE DUMMY=#; 63540000
|
|
IF SYMBTABLSETUP THEN GO TO ILLEGAL; 63550000
|
|
I ~ CONTROLPARAMETER(A,P); 63560000
|
|
IF I < 0 THEN GO TO PARAMERR; 63570000
|
|
IF I < 150 THEN BEGIN SCATTERNO ~ 0; GO TO E; END; 63580000
|
|
IF I < 300 THEN BEGIN SCATTERNO ~ 1; GO TO E; END; 63590000
|
|
IF I < 475 THEN BEGIN SCATTERNO ~ 2; GO TO E; END; 63600000
|
|
IF I < 600 THEN BEGIN SCATTERNO ~ 3; GO TO E; END; 63610000
|
|
IF I < 800 THEN BEGIN SCATTERNO ~ 4; GO TO E; END; 63620000
|
|
SCATTERNO ~ 5; 63630000
|
|
END; 63640000
|
|
% 16: -SET <NAME> <LITERAL> SETS THE VARIABLE <NAME> TO 63650000
|
|
% HAVE THE INITIAL VALUE OF <LITERAL>. 63660000
|
|
BEGIN INTEGER P1, P2; 63670000
|
|
IF NOT SYMBTABLSETUP THEN INITIALIZESYMBTABL; 63680000
|
|
% FIND NAME: 63690000
|
|
I ~ P ~ P + SKIPCHAR(" ",A[*],P); 63700000
|
|
WHILE CHARTYPE[CHAR(A[P.W],P.C)] = 3 DO P ~ P + 1; 63710000
|
|
IF P } INSTSIZE OR P = I THEN GO TO PARAMMISSING; 63720000
|
|
AA ~ ENTERST(P-I,A[*],I,"SYMB"); 63730000
|
|
% FIND VALUE: 63740000
|
|
P1 ~ P + SCANCHAR(""",""",A[P.W],P.C); 63750000
|
|
IF P1 } INSTSIZE THEN GO TO PARAMMISSING; 63760000
|
|
P ~ P1 ~ P1 + 1; 63770000
|
|
WHILE P < INSTSIZE DO 63780000
|
|
BEGIN P2 ~ P + SCANCHAR(""",""",A[P.W],P.C); 63790000
|
|
IF P2 } INSTSIZE THEN % MISSING QUOTE: 63800000
|
|
BEGIN MESSAGE0(19); 63810000
|
|
MESSAGETT0(19); 63820000
|
|
GO TO E; 63830000
|
|
END; 63840000
|
|
P ~ P2 + SCANCHAR(""",""",A[P2.W],P2.C+1) + 1; 63850000
|
|
IF P < INSTSIZE THEN % SQUEEZE INSTRUCTION: 63860000
|
|
BEGIN MOVE(INSTSIZE-P-1,A[P.W],P.C+1,A[P2.W],P2.C); 63870000
|
|
INSTSIZE ~ INSTSIZE - (P - P2 + 1); 63880000
|
|
P ~ P2 + 1; 63890000
|
|
END; 63900000
|
|
END; 63910000
|
|
% P1, P2 NOW DELIMIT THE VALUE. 63920000
|
|
AB ~ STRING(P2-P1,AA); 63930000
|
|
MOVE(P2-P1,A[P1.W],P1.C,FIRSTCHAR(AB)); 63940000
|
|
VALTABL[AA.STR,AA.STW] ~ AB; 63950000
|
|
END SET; 63960000
|
|
% 17: -LIBRARY <FID>/<MFID> CREATES A LIBRARY COPY OF THE 63970000
|
|
% SNOBOL PROGRAM BEING COMPILED, WITH THE NAME <MFID>/<FID>. 63980000
|
|
% THIS LIBRARY FILE CAN BE LOADED FOR A LATER RUN WITH THE CONTROL 63990000
|
|
% CARD -LOAD <MFID>/<FID>. 64000000
|
|
BEGIN DEFINE DUMMY =#; 64010000
|
|
IF ENTRY = 0 THEN GO TO ILLEGAL; 64020000
|
|
IF LOADF THEN IF SLASTLABEL ! 0 THEN 64030000
|
|
BEGIN I ~ PTR; 64040000
|
|
IF NOT (GTS AND GTF) THEN 64050000
|
|
BEGIN 64060000
|
|
STORECHARS(IF GT THEN 2 ELSE 3,"/-E",IF GT THEN 6 ELSE 5); 64070000
|
|
IF NOT GT THEN I ~ I + 1; 64080000
|
|
IF NOT GTS THEN 64090000
|
|
BEGIN SLOC ~ I; 64100000
|
|
MV(2,SLOC,6,CODE[MARKER.W],MARKER.C+3); 64110000
|
|
END; 64120000
|
|
IF NOT GTF THEN 64130000
|
|
BEGIN FLOC ~ I; 64140000
|
|
MV(2,FLOC,6,CODE[MARKER.W],MARKER.C+5); 64150000
|
|
END; 64160000
|
|
END; 64170000
|
|
AA ~ STRING(PTR,SLASTLABEL); 64180000
|
|
MOVE(PTR,CODE[*],0,FIRSTCHAR(AA)); 64190000
|
|
VALU[SLASTLABEL].LOC ~ AA; 64200000
|
|
IF PTR > MAXINSTSIZE THEN MAXINSTSIZE ~ PTR; 64210000
|
|
PTR ~ I; 64220000
|
|
END; 64230000
|
|
P ~ P + SKIPCHAR(" ",A[*],P); 64240000
|
|
I ~ P + SCANCHAR("/"," ",A[*],P); 64250000
|
|
IF I } FIELDSIZE OR CHAR(A[I.W],I.C) ! "/" THEN GO TO PARAMERR; 64260000
|
|
AA ~ 0; 64270000
|
|
MV(7,BLANKS,1,AA,1); 64280000
|
|
AB ~ AA; 64290000
|
|
MV(MIN(7,I-P),A[P.W],P.C,AA,1); 64300000
|
|
P ~ I + 1; 64310000
|
|
I ~ P + SCANCHAR(" ",QMARK,A[P.W],P.C); 64320000
|
|
IF I { P OR I > INSTSIZE THEN GO TO PARAMERR; 64330000
|
|
MV(MIN(7,I-P),A[P.W],P.C,AB,1); 64340000
|
|
CREATELIBRARY(AA,AB); 64350000
|
|
END LIBRARY; 64360000
|
|
% 18: -LOAD <A>/<B> CAUSES THE DISK FILE <A>/<B> TO BE 64370000
|
|
% CONSIDERED A COMPILED SNOBOL PROGRAM, AND LOADED. THIS CARD 64380000
|
|
% IS ILLEGAL IF INSTRUCTIONS, -DEFINE OR -SET CARDS HAVE BEEN 64390000
|
|
% ALREADY ENCOUNTERED. IN ADDITION, ONLY ONE -LOAD CARD IS 64400000
|
|
% ACCEPTED PER JOB. 64410000
|
|
BEGIN DEFINE DUMMY=#; 64420000
|
|
IF SYMBTABLSETUP THEN GO TO ILLEGAL; 64430000
|
|
P ~ P + SKIPCHAR(" ",A[*],P); 64440000
|
|
I ~ P + SCANCHAR("/"," ",A[*],P); 64450000
|
|
IF I } INSTSIZE OR CHAR(A[I.W],I.C) ! "/" THEN GO TO PARAMERR; 64460000
|
|
AA ~ 0; 64470000
|
|
MV(7,BLANKS,1,AA,1); 64480000
|
|
AB ~ AA; 64490000
|
|
MV(MIN(7,I-P),A[P.W],P.C,AA,1); 64500000
|
|
P ~ I + 1; 64510000
|
|
I ~ P + SCANCHAR(" ",QMARK,A[P.W],P.C); 64520000
|
|
IF I { P OR I > INSTSIZE THEN GO TO PARAMERR; 64530000
|
|
MV(MIN(7,I-P),A[P.W],P.C,AB,1); 64540000
|
|
LOADLIBRARY(AA,AB); 64550000
|
|
IF DEATH THEN GO TO ENDTERPRET; 64560000
|
|
END LOAD; 64570000
|
|
% 19: -COMPILE <A>/<B> TELLS THE LOADER TO COMPILE THE DISK FILE 64580000
|
|
% <A>/<B> INTO THE PROGRAM AT THE POINT WHERE THIS CARD APPEARS. 64590000
|
|
BEGIN FILE IN PROG DISK SERIAL (1,10,30); 64600000
|
|
BOOLEAN RMT, BUFFULL; 64610000
|
|
ALPHA ARRAY BUF[0:10], X[0:6]; 64620000
|
|
INTEGER S1, S2; 64630000
|
|
ALPHA AA, AB; 64640000
|
|
% 64650000
|
|
P ~ P + SKIPCHAR(" ",A[*],P); 64660000
|
|
I ~ P + SCANCHAR("/"," ",A[*],P); 64670000
|
|
IF I } INSTSIZE OR CHAR(A[I.W],I.C) ! "/" THEN GO TO PARAMERR; 64680000
|
|
AA ~ 0; 64690000
|
|
MV(7,BLANKS,1,AA,1); 64700000
|
|
AB ~ AA; 64710000
|
|
MV(S1~MIN(7,I-P),A[P.W],P.C,AA,1); 64720000
|
|
P ~ I + 1; 64730000
|
|
I ~ P + SCANCHAR(" ",QMARK,A[P.W],P.C); 64740000
|
|
IF I { P OR I > INSTSIZE THEN GO TO PARAMERR; 64750000
|
|
MV(S2~MIN(7,I-P),A[P.W],P.C,AB,1); 64760000
|
|
FILL PROG WITH AA,AB; 64770000
|
|
SEARCH(PROG,X[*]); 64780000
|
|
IF X[0] { 0 THEN GO TO NOFILE; 64790000
|
|
IF BUFFULL~BUFFERFULL THEN MOVEWDS(10,BUFFER[0],BUF[0]); 64800000
|
|
READ(PROG,10,BUFFER[*]) [NOFILE:NOFILE]; 64810000
|
|
BUFFERFULL ~ TRUE; 64820000
|
|
LOADERLEVEL ~ LOADERLEVEL + 1; 64830000
|
|
RMT ~ PROGRAMFROMREMOTE; PROGRAMFROMREMOTE ~ FALSE; 64840000
|
|
LOADER(PROG); 64850000
|
|
WRITE(BUFOUT[*],FENDPROG); 64860000
|
|
MV(S1,AA,1,BUFOUT[*],22); 64870000
|
|
MV(1,SLASH,7,BUFOUT[*],22+S1); 64880000
|
|
MV(S2,AB,1,BUFOUT[*],23+S1); 64890000
|
|
WRITE(PRINT,5,BUFOUT[*]); 64900000
|
|
IF DATACOMF THEN 64910000
|
|
BEGIN MV(2,CRLF,5,DCWRITE[*],0); 64920000
|
|
MV(21+S1+S2,BUFOUT[*],2,DCWRITE[*],2); 64930000
|
|
MV(3,CRLF,5,DCWRITE[*],23+S1+S2); 64940000
|
|
IF OUTPUT THEN; 64950000
|
|
END; 64960000
|
|
IF BUFFERFULL~BUFFULL THEN MOVEWDS(10,BUF[0],BUFFER[0]); 64970000
|
|
LOADERLEVEL ~ LOADERLEVEL - 1; 64980000
|
|
PROGRAMFROMREMOTE ~ RMT; 64990000
|
|
END COMPILE CARD; 65000000
|
|
% 20: -INFORM TURNS ON INFORMATIVE DIAGNOSTICS. IF THE SYSTEM- 65010000
|
|
% DEBUGGING FLAG IS TRUE, THEN THE SYSTEM DEBUGGING AIDS 65020000
|
|
% ARE ENABLED. 65030000
|
|
BEGIN INFORM ~ SYSTEMDEBUGGING; 65040000
|
|
PRINTMESSAGES ~ TRUE; 65050000
|
|
END; 65060000
|
|
% 21: -SILENCE TURNS OFF DIAGNOSTIC MESSAGES TURNED ON BY -INFORM 65070000
|
|
INFORM ~ PRINTMESSAGES ~ FALSE; 65080000
|
|
END CONTROL CARDS CASE STATEMENT; 65090000
|
|
%********CONTROL CARDS***************** 65100000
|
|
GO TO E; 65110000
|
|
END; 65120000
|
|
ILLEGAL: 65130000
|
|
MESSAGE0(20); 65140000
|
|
MESSAGETT0(20); 65150000
|
|
MESSAGES ~ MESSAGES + 1; 65160000
|
|
GO TO E; 65170000
|
|
PARAMMISSING: 65180000
|
|
MESSAGE0(21); 65190000
|
|
MESSAGETT0(21); 65200000
|
|
MESSAGES ~ MESSAGES + 1; 65210000
|
|
GO TO E; 65220000
|
|
NOFILE: 65230000
|
|
MESSAGE0(11); 65240000
|
|
MESSAGETT0(11); 65250000
|
|
GO TO E; 65260000
|
|
PARAMERR: 65270000
|
|
MESSAGE0(10); 65280000
|
|
MESSAGETT0(10); 65290000
|
|
MESSAGES ~ MESSAGES + 1; 65300000
|
|
E: END PROCESSCONTROLCARD; 65310000
|
|
%********PROCESSCONTROLCARD*********************************************65320000
|
|
%********PUSH***********************************************************65330000
|
|
BOOLEAN PROCEDURE PUSH(STLOC,NEWVAL); 65340000
|
|
VALUE STLOC, NEWVAL; ALPHA STLOC, NEWVAL; 65350000
|
|
BEGIN ALPHA ST, T, T1; 65360000
|
|
INTEGER I; 65370000
|
|
LABEL RETURN; 65380000
|
|
% IF INFORM THEN INFORMA(1,STLOC); 65390000
|
|
ST ~ NEWCELL(STLOC.STR); 65400000
|
|
IF DEATH THEN 65410000
|
|
BEGIN PUSH ~ FALSE; GO TO RETURN; END; 65420000
|
|
VALU[ST] ~ T1 ~ VALU[STLOC]; 65430000
|
|
IF T1.CH } 3 THEN % IF < 3 THERE IS NO STRING BEING POINTED TO. 65440000
|
|
BEGIN I ~ T1.CH - 2; 65450000
|
|
MV(2,ST,6,DATA[T1.R,I.W],I.C); 65460000
|
|
END; 65470000
|
|
VALU[ST].LINK ~ VALU[STLOC].LINK; 65480000
|
|
VALU[STLOC] ~ 0 & T1 [1:1:4] & ST CLINK; 65490000
|
|
IF NEWVAL ! 0 THEN % ASSIGN NEW VALUE 65500000
|
|
BEGIN IF STLOC = NEWVAL % PUSH(N,N) CALLED. 65510000
|
|
THEN NEWVAL ~ ST; % RE-ASSIGN OLD VALUE. 65520000
|
|
ST ~ VALU[NEWVAL].S; 65530000
|
|
T ~ STRING(ST,STLOC); 65540000
|
|
IF DEATH THEN 65550000
|
|
BEGIN PUSH ~ FALSE; GO TO RETURN; END; 65560000
|
|
NEWVAL ~ VALU[NEWVAL]; 65570000
|
|
MOVE(ST,FIRSTCHAR(NEWVAL),FIRSTCHAR(T)); 65580000
|
|
VALU[STLOC].LOC ~ T; 65590000
|
|
END; 65600000
|
|
PUSH ~ TRUE; 65610000
|
|
RETURN: 65620000
|
|
END PUSH; 65630000
|
|
%********PUSH***********************************************************65640000
|
|
%********RETURNCELL*****************************************************65650000
|
|
PROCEDURE RETURNCELL(N); VALUE N; ALPHA N; 65660000
|
|
BEGIN DEFINE DUMMY=#; 65670000
|
|
% IF INFORM THEN INFORMA(3,N); 65680000
|
|
NAME[N] ~ 0 & NEXTCELL[N.STR] CLINK; 65690000
|
|
VALU[N] ~ 0; 65700000
|
|
NEXTCELL[N.STR] ~ N; 65710000
|
|
END RETURNCELL; 65720000
|
|
%********RETURNCELL*****************************************************65730000
|
|
%********RETURNTEMP*****************************************************65740000
|
|
PROCEDURE RETURNTEMPS; 65750000
|
|
BEGIN INTEGER I; ALPHA ST,P; 65760000
|
|
% IF INFORM THEN INFORM0(7); 65770000
|
|
FOR I ~ 0 STEP 1 UNTIL 15 DO IF USEDST[I] THEN 65780000
|
|
IF TEMPLIST[I] ! 0 THEN 65790000
|
|
BEGIN ST ~ TEMPLIST[I]; 65800000
|
|
P ~ NEXTCELL[I]; 65810000
|
|
TEMPLIST[I] ~ 0; 65820000
|
|
NEXTCELL[I] ~ NAME[ST].LINK; 65830000
|
|
NAME[ST] ~ 0 & P CLINK; 65840000
|
|
END; 65850000
|
|
END RETURNTEMPS; 65860000
|
|
%********RETURNTEMP*****************************************************65870000
|
|
%********SCATTER********************************************************65880000
|
|
ALPHA PROCEDURE SCATTER(SIZE,LOC,P,X); 65890000
|
|
VALUE SIZE, P, X; 65900000
|
|
INTEGER SIZE, P; 65910000
|
|
ALPHA ARRAY LOC[0]; 65920000
|
|
ALPHA X; 65930000
|
|
BEGIN ALPHA I, J, K; 65940000
|
|
J ~ IF SIZE = 0 THEN 1/X ELSE SIZE/X; 65950000
|
|
FOR I ~ 1 STEP 1 UNTIL SIZE DO 65960000
|
|
J ~ J + X / (I + CHAR(LOC[(K~P+I-1).W],K.C)); 65970000
|
|
K ~ J.[8:30]; 65980000
|
|
I.STR ~ ENTIER(K MOD (SCATTERNO+1)); 65990000
|
|
J.[1:9] ~ 0; 66000000
|
|
% LITERALS ARE SCATTERED INTO A DIFFERENT AREA THAN OTHER QUANTITIES: 66010000
|
|
I.STW ~ IF X = "LIT" 66020000
|
|
THEN SCATTERSIZE + ENTIER(J MOD 16) 66030000
|
|
ELSE ENTIER(J MOD SCATTERSIZE); 66040000
|
|
IF I = 0 THEN I ~ 1; 66050000
|
|
SCATTER ~ I; 66060000
|
|
END SCATTER; 66070000
|
|
%********SCATTER********************************************************66080000
|
|
%********SEARCHST*******************************************************66090000
|
|
ALPHA PROCEDURE SEARCHST(N,L,P,X); 66100000
|
|
VALUE N, P, X; 66110000
|
|
INTEGER N, P; 66120000
|
|
ALPHA ARRAY L[0]; 66130000
|
|
ALPHA X; 66140000
|
|
BEGIN ALPHA J, K; 66150000
|
|
INTEGER I, XTEST; 66160000
|
|
LABEL FOUND, FAIL; 66170000
|
|
% 66180000
|
|
XTEST ~ IF X = "SYMB" THEN 0 ELSE 66190000
|
|
IF X = "FCT" THEN 2 ELSE 66200000
|
|
IF X = "INST" THEN 3 ELSE 0; 66210000
|
|
I ~ SCATTER(N,L,P,X); 66220000
|
|
WHILE I ! 0 DO 66230000
|
|
BEGIN IF (IF N ! (K~NAME[I]).S 66240000
|
|
THEN FALSE 66250000
|
|
ELSE EQUAL(N,L,P,FIRSTCHAR(K))) 66260000
|
|
THEN IF (IF N = 0 THEN K.LOC ! 0 ELSE TRUE) 66270000
|
|
THEN IF K.TYPE = XTEST 66280000
|
|
THEN GO TO FOUND; 66290000
|
|
I ~ K.LINK; 66300000
|
|
END; 66310000
|
|
FAIL: 66320000
|
|
I ~ -1; 66330000
|
|
FOUND: 66340000
|
|
SEARCHST ~ I; 66350000
|
|
END SEARCHST; 66360000
|
|
%********SEARCHST*******************************************************66370000
|
|
%********SNBLDEFINE*****************************************************66380000
|
|
% SNBLDEFINE SETS UP PROGRAM-DEFINED FUNCTIONS. THE THREE PARAMETERS 66390000
|
|
% SHOULD BE THE SYMBOL TABLE LOCATIONS OF THE THREE PARAMETERS FOR 66400000
|
|
% THE SNOBOL DEFINE. 66410000
|
|
% SNBLDEFINE USES CHAR, SCANCHAR, ENTERST, MIN, STRING, MOVECHARS. 66420000
|
|
BOOLEAN PROCEDURE SNBLDEFINE(ST1,ST2,ST3); 66430000
|
|
VALUE ST1, ST2, ST3; 66440000
|
|
ALPHA ST1, ST2, ST3; 66450000
|
|
% 66460000
|
|
BEGIN 66470000
|
|
DEFINE PARAMMAX = 30 #; % MAX NUMBER OF PARAMS & LOC VARS ALLOWED. 66480000
|
|
INTEGER I, P1, P2, LVNO; 66490000
|
|
ALPHA PROT, ENT, LVARS, STLOC; 66500000
|
|
INTEGER ARRAY LV[0:PARAMMAX]; 66510000
|
|
LABEL PROTERR, LVERR, RENVOI, TOOMANY; 66520000
|
|
IF ST1 = 0 THEN 66530000
|
|
BEGIN % NO FIRST PARAM (PROTOTYPE). 66540000
|
|
MESSAGE0(4); 66550000
|
|
MESSAGETT0(4); 66560000
|
|
GO TO RENVOI; 66570000
|
|
END; 66580000
|
|
PROT ~ VALU[ST1]; 66590000
|
|
ENT ~ IF ST2.STW = 0 THEN 0 ELSE VALU[ST2]; 66600000
|
|
LVARS~ IF ST3.STW = 0 THEN 0 ELSE VALU[ST3]; 66610000
|
|
% 66620000
|
|
% FIND NAME: 66630000
|
|
P1 ~ PROT.CH + SKIPCHAR(" ",DATA[PROT.R,PROT.W],PROT.C); 66640000
|
|
P2 ~ P1 + SCANCHAR("(",QMARK,DATA[PROT.R,P1.W],P1.C); 66650000
|
|
IF P2 - P1 > PROT.S THEN 66660000
|
|
BEGIN MESSAGE0(3); 66670000
|
|
MESSAGETT0(3); 66680000
|
|
GO TO RENVOI; 66690000
|
|
END; 66700000
|
|
STLOC ~ ENTERST(P2-P1,DATA[PROT.R,*],P1,"FCT"); 66710000
|
|
LV[LVNO~0] ~ ENTERST(P2-P1,DATA[PROT.R,*],P1,"SYMB"); 66720000
|
|
IF PRINTMESSAGES THEN % CHECK WHETHER ALREADY DEFINED: 66730000
|
|
IF VALU[STLOC].LINK ! 0 THEN 66740000
|
|
IF LOADF THEN 66750000
|
|
BEGIN MESSAGE0(13); MESSAGETT0(13); END ELSE 66760000
|
|
BEGIN MESSAGEI(21,INSTNO); MESSAGETTI(21,INSTNO); END; 66770000
|
|
% 66780000
|
|
% FIND ENTRY POINT: 66790000
|
|
ENT ~ IF ENT.S = 0 66800000
|
|
THEN ENTERST(P2-P1,DATA[PROT.R,*],P1,"INST") 66810000
|
|
ELSE ENTERST(ENT.S,DATA[ENT.R,*],ENT.CH,"INST"); 66820000
|
|
% 66830000
|
|
% PROCESS FORMAL PARAMETERS: 66840000
|
|
I ~ PROT.CH + SCANCHAR(")",QMARK,DATA[PROT.R,PROT.W],PROT.C); 66850000
|
|
IF I < P2 - PROT.CH THEN GO TO PROTERR; 66860000
|
|
P1 ~ P2 + 1; 66870000
|
|
WHILE P1 < I DO 66880000
|
|
BEGIN P1 ~ P1 + SKIPCHAR(" ",DATA[PROT.R,P1.W],P1.C); 66890000
|
|
P2 ~ P1 + MIN( 66900000
|
|
SCANCHAR(",",")",DATA[PROT.R,P1.W],P1.C), 66910000
|
|
SCANCHAR(" ",QMARK,DATA[PROT.R,P1.W],P1.C)); 66920000
|
|
IF P2 > I THEN P2 ~ I; 66930000
|
|
IF P1 = P2 THEN GO TO PROTERR; 66940000
|
|
IF LVNO ~ LVNO+1 > PARAMMAX THEN GO TO TOOMANY; 66950000
|
|
LV[LVNO] ~ ENTERST(P2-P1,DATA[PROT.R,*],P1,"SYMB"); 66960000
|
|
P2 ~ P2 + SKIPCHAR(" ",DATA[PROT.R,P2.W],P2.C); 66970000
|
|
IF P2 < I AND CHAR(DATA[PROT.R,P2.W],P2.C) ! "," THEN GO TO PROTERR; 66980000
|
|
P1 ~ P2 + 1; 66990000
|
|
END; 67000000
|
|
% 67010000
|
|
% PROCESS LOCAL VARIABLES: 67020000
|
|
I ~ LVARS.CH + LVARS.S; 67030000
|
|
P1 ~ LVARS.CH; 67040000
|
|
I ~ P1 + LVARS.S; 67050000
|
|
WHILE P1 < I DO 67060000
|
|
BEGIN P1 ~ P1 + SKIPCHAR(" ",DATA[LVARS.R,P1.W],P1.C); 67070000
|
|
P2 ~ P1 + MIN( 67080000
|
|
SCANCHAR(",",")",DATA[LVARS.R,P1.W],P1.C), 67090000
|
|
SCANCHAR(" ",QMARK,DATA[LVARS.R,P1.W],P1.C)); 67100000
|
|
IF P2 > I THEN P2 ~ I; 67110000
|
|
IF LVNO~LVNO+1 > PARAMMAX THEN GO TO TOOMANY; 67120000
|
|
LV[LVNO] ~ ENTERST(P2-P1,DATA[LVARS.R,*],P1,"SYMB"); 67130000
|
|
P2 ~ P2 + SKIPCHAR(" ",DATA[LVARS.R,P2.W],P2.C); 67140000
|
|
IF P2 < I AND CHAR(DATA[LVARS.R,P2.W],P2.C) ! "," THEN GO TO LVERR; 67150000
|
|
P1 ~ P2 + 1; 67160000
|
|
END; 67170000
|
|
% FINISH SYMBOL TABLE ENTRY: 67180000
|
|
I ~ STRING((LVNO+1)|2,STLOC); 67190000
|
|
VALU[STLOC] ~ I & 1[1:47:1] & ENT CLINK; 67200000
|
|
FOR P1 ~ 0 STEP 1 UNTIL LVNO DO 67210000
|
|
MOVE(2,LV[P1],6,DATA[I.R,(I+2|P1).W],(I+2|P1).C); 67220000
|
|
IF TRACEALL THEN 67230000
|
|
BEGIN VALU[STLOC].IOUSE ~ 3; 67240000
|
|
IO[STLOC] ~ 0 & 3 CFILNO & 3 CIOUSE & 2 CIOTYPE; 67250000
|
|
END; 67260000
|
|
SNBLDEFINE ~ TRUE; 67270000
|
|
GO TO RENVOI; 67280000
|
|
TOOMANY: 67290000
|
|
SNBLDEFINE ~ FALSE; 67300000
|
|
MESSAGEI(22,PARAMMAX); 67310000
|
|
MESSAGETTI(24,PARAMMAX); 67320000
|
|
GO TO RENVOI; 67330000
|
|
PROTERR: 67340000
|
|
SNBLDEFINE ~ FALSE; 67350000
|
|
MESSAGETT0(2); 67360000
|
|
MESSAGE0(2); GO TO RENVOI; 67370000
|
|
LVERR: 67380000
|
|
SNBLDEFINE ~ FALSE; 67390000
|
|
MESSAGE0(1); 67400000
|
|
MESSAGETT0(1); 67410000
|
|
RENVOI: 67420000
|
|
END SNBLDEFINE; 67430000
|
|
%********SNBLDEFINE*****************************************************67440000
|
|
%********SNBLIN*********************************************************67450000
|
|
BOOLEAN PROCEDURE SNBLIN(ST); 67460000
|
|
VALUE ST; ALPHA ST; 67470000
|
|
BEGIN LABEL RETURN, FAIL, EOF, PAR, NOFILE, 67480000
|
|
DATACOMM, INREAD, LOOK, ILLEGAL; 67490000
|
|
ALPHA STN, STV, SIO; 67500000
|
|
INTEGER SIZE, TYPE, T, UNIT; 67510000
|
|
SWITCH READSW ~ 67520000
|
|
INREAD, 67530000
|
|
LOOK, 67540000
|
|
DATACOMM; 67550000
|
|
% 67560000
|
|
STV ~ VALU[ST]; 67570000
|
|
SIO ~ IO[ST]; 67580000
|
|
IF NOT BOOLEAN(STV.INUSE) THEN GO TO ILLEGAL; 67590000
|
|
TYPE ~ SIO.IOTYPE; 67600000
|
|
UNIT ~ SIO.FILNO; 67610000
|
|
% IF INFORM THEN IF UNIT > 0 THEN INFORMI(6,UNIT); 67620000
|
|
GO TO READSW[TYPE]; 67630000
|
|
GO TO ILLEGAL; 67640000
|
|
% 67650000
|
|
DATACOMM: 67660000
|
|
BEGIN % INPUT FROM TELETYPE: 67670000
|
|
IF NOT DATACOMF THEN 67680000
|
|
BEGIN FINDUSERS; 67690000
|
|
IF NOT DATACOMF THEN GO TO NOFILE; 67700000
|
|
END; 67710000
|
|
IF NOT INPUT THEN GO TO FAIL; 67720000
|
|
VALU[ST].LOC ~ T ~ IF STV.S } DCSIZE 67730000
|
|
THEN STV.LOC & DCSIZE CONCS % USE OLD STRING 67740000
|
|
ELSE STRING(DCSIZE,ST); % NEED BIGGER STRING 67750000
|
|
MOVE(DCSIZE,DCREAD[*],0,FIRSTCHAR(T)); 67760000
|
|
SNBLIN ~ TRUE; 67770000
|
|
BREAK ~ FALSE; 67780000
|
|
GO TO RETURN; 67790000
|
|
END; 67800000
|
|
INREAD: 67810000
|
|
BEGIN COMMENT INPUT FROM IO[UNIT]; 67820000
|
|
IOEOF[UNIT] ~ FALSE; 67830000
|
|
SIZE ~ IOSIZE[UNIT]; 67840000
|
|
IF LOOKF[UNIT] THEN 67850000
|
|
BEGIN LOOKF[UNIT] ~ FALSE; 67860000
|
|
MOVE(SIZE,NEXTRECORD[UNIT,*],0,BUFFER[*],0); 67870000
|
|
END ELSE 67880000
|
|
% READ NEXT RECORD: 67890000
|
|
IF RECORD[UNIT] } 0 THEN 67900000
|
|
BEGIN 67910000
|
|
READ(IOFILE[UNIT][RECORD[UNIT]],1023,BUFFER[*])[EOF:PAR]; 67920000
|
|
RECORD[UNIT] ~ -1; 67930000
|
|
END ELSE 67940000
|
|
BEGIN SPACE(IOFILE[UNIT],IOSPACE[UNIT])[EOF:PAR]; 67950000
|
|
READ(IOFILE[UNIT],1023,BUFFER[*])[EOF:PAR]; 67960000
|
|
END; 67970000
|
|
VALU[ST].LOC ~ T ~ 67980000
|
|
IF STV.S < SIZE 67990000
|
|
THEN STRING(SIZE,ST) 68000000
|
|
ELSE STV.LOC & SIZE CONCS; 68010000
|
|
MOVE(SIZE,BUFFER[*],0,FIRSTCHAR(T)); 68020000
|
|
SNBLIN ~ TRUE; 68030000
|
|
GO TO RETURN; 68040000
|
|
END; 68050000
|
|
LOOK: 68060000
|
|
BEGIN % NON-READING INPUT (LOOK) FROM IOFILE[UNIT]; 68070000
|
|
SIZE ~ IOSIZE[UNIT]; 68080000
|
|
IF NOT LOOKF[UNIT] THEN 68090000
|
|
BEGIN IF RECORD[UNIT] } 0 THEN 68100000
|
|
READ(IOFILE[UNIT][RECORD[UNIT]],1023,NEXTRECORD[UNIT,*]) 68110000
|
|
[EOF:PAR] ELSE 68120000
|
|
BEGIN SPACE(IOFILE[UNIT],IOSPACE[UNIT])[EOF:PAR]; 68130000
|
|
READ(IOFILE[UNIT],1023,NEXTRECORD[UNIT,*])[EOF:PAR]; 68140000
|
|
END; 68150000
|
|
IOEOF[UNIT] ~ FALSE; 68160000
|
|
LOOKF[UNIT] ~ TRUE; 68170000
|
|
END; 68180000
|
|
VALU[ST].LOC ~ T ~ 68190000
|
|
IF STV.S < SIZE 68200000
|
|
THEN STRING(SIZE,ST) 68210000
|
|
ELSE STV.LOC & SIZE CONCS; 68220000
|
|
MOVE(SIZE,NEXTRECORD[UNIT,*],0,FIRSTCHAR(T)); 68230000
|
|
SNBLIN ~ TRUE; 68240000
|
|
GO TO RETURN; 68250000
|
|
END; 68260000
|
|
PAR: 68270000
|
|
BEGIN DEFINE DUMMY=#; 68280000
|
|
WRITE(BUFOUT[*],FPARITY); 68290000
|
|
STN ~ NAME[ST]; 68300000
|
|
MOVE(STRINGLOC(STN),BUFOUT[*],32); 68310000
|
|
WRITE(PRINT,FBL); 68320000
|
|
WRITE(PRINT,17,BUFOUT[*]); 68330000
|
|
GO TO FAIL; 68340000
|
|
END; 68350000
|
|
ILLEGAL: 68360000
|
|
INFORMA(5,ST); 68370000
|
|
DEATH ~ SYSTEMERROR ~ INFORM ~ TRUE; 68380000
|
|
GO TO ENDTERPRET; 68390000
|
|
NOFILE: 68400000
|
|
IF PRINTMESSAGES THEN 68410000
|
|
BEGIN DEFINE DUMMY=#; 68420000
|
|
STN ~ NAME[ST]; 68430000
|
|
WRITE(BUFOUT[*],FCLOSEDR); 68440000
|
|
MOVE(STN.S,FIRSTCHAR(STN),BUFOUT[*],36); 68450000
|
|
WRITE(PRINT,FBL); 68460000
|
|
WRITE(PRINT,17,BUFOUT[*]); 68470000
|
|
END; 68480000
|
|
GO TO FAIL; 68490000
|
|
EOF: 68500000
|
|
IOEOF[UNIT] ~ TRUE; 68510000
|
|
FAIL: 68520000
|
|
SNBLIN ~ FALSE; 68530000
|
|
RETURN: 68540000
|
|
END SNBLIN; 68550000
|
|
%********SNBLIN*********************************************************68560000
|
|
%********SNBLOUT********************************************************68570000
|
|
BOOLEAN PROCEDURE SNBLOUT(ST); VALUE ST; ALPHA ST; 68580000
|
|
BEGIN 68590000
|
|
LABEL RETURN, FAIL, EOF, PAR, NOFILE, SYSPOT, 68600000
|
|
DATACOMM, IOWRITE, TRACE, ILLEGAL; 68610000
|
|
SWITCH WRITESW ~ 68620000
|
|
IOWRITE, 68630000
|
|
TRACE, 68640000
|
|
DATACOMM, 68650000
|
|
ILLEGAL, 68660000
|
|
SYSPOT; 68670000
|
|
ALPHA STN, STV, SIO, AA, AB; 68680000
|
|
INTEGER SIZE, TYPE, UNIT, IS, ICH, IR, T, I1, I2; 68690000
|
|
% 68700000
|
|
STV ~ VALU[ST]; 68710000
|
|
SIO ~ IO[ST]; 68720000
|
|
IF NOT BOOLEAN(STV.OUTUSE) THEN GO TO ILLEGAL; 68730000
|
|
TYPE ~ SIO.IOTYPE; 68740000
|
|
UNIT ~ SIO.FILNO; 68750000
|
|
IS ~ STV.S; 68760000
|
|
ICH ~ STV.CH; 68770000
|
|
IR ~ STV.R; 68780000
|
|
% IF INFORM THEN IF UNIT>0 THEN INFORMI(13,UNIT); 68790000
|
|
% 68800000
|
|
GO TO WRITESW[TYPE]; 68810000
|
|
GO TO ILLEGAL; 68820000
|
|
% 68830000
|
|
DATACOMM: 68840000
|
|
BEGIN COMMENT OUTPUT TO DATACOMM UNIT; 68850000
|
|
IF NOT DATACOMF THEN 68860000
|
|
BEGIN FINDUSERS; 68870000
|
|
IF NOT DATACOMF THEN GO TO NOFILE; 68880000
|
|
END; 68890000
|
|
WHILE IS } 100 DO 68900000
|
|
BEGIN MOVE(100,DATA[IR,ICH.W],ICH.C,DCWRITE[*],0); 68910000
|
|
MV(1,ARROW,7,DCWRITE[12],5); 68920000
|
|
IF NOT OUTPUT THEN GO TO FAIL; 68930000
|
|
IS ~ IS - 100; 68940000
|
|
ICH ~ ICH + 100; 68950000
|
|
END; 68960000
|
|
IF IS > 0 THEN 68970000
|
|
BEGIN MOVE(IS,DATA[IR,ICH.W],ICH.C,DCWRITE[*],0); 68980000
|
|
MV(1,ARROW,7,DCWRITE[IS.W],IS.C); 68990000
|
|
IF NOT OUTPUT THEN GO TO FAIL; 69000000
|
|
END; 69010000
|
|
SNBLOUT ~ TRUE; 69020000
|
|
GO TO RETURN; 69030000
|
|
END; 69040000
|
|
IOWRITE: 69050000
|
|
BEGIN % OUTPUT TO FILE # UNIT. 69060000
|
|
IOEOF[UNIT] ~ FALSE; 69070000
|
|
T ~ (IOSIZE[UNIT]-1).W + 1; 69080000
|
|
SIZE ~ IOSIZE[UNIT]; 69090000
|
|
FOR I1~IOSPACE[UNIT] STEP -1 UNTIL 1 DO WRITE(IOFILE[UNIT]); 69100000
|
|
IF IS > SIZE THEN IF BOOLEAN(SIO.OVFL) THEN 69110000
|
|
BEGIN % WRITE AS MANY FULL RECORDS AS POSSIBLE: 69120000
|
|
MOVEWDS(1,BLANKS,BUFOUT[*]); 69130000
|
|
DO BEGIN 69140000
|
|
MOVE(SIZE,DATA[IR,ICH.W],ICH.C,BUFOUT[*],0); 69150000
|
|
IF RECORD[UNIT] } 0 69160000
|
|
THEN WRITE(IOFILE[UNIT][RECORD[UNIT]],T,BUFOUT[*])[EOF:PAR] 69170000
|
|
ELSE WRITE(IOFILE[UNIT],T,BUFOUT[*])[EOF:PAR]; 69180000
|
|
RECORD[UNIT] ~ -1; 69190000
|
|
ICH ~ ICH + SIZE; 69200000
|
|
IS ~ IS - SIZE; 69210000
|
|
END UNTIL IS { SIZE; 69220000
|
|
END ELSE IS ~ SIZE; 69230000
|
|
CLEAR(BUFOUT,T); 69240000
|
|
MOVE(IS,DATA[IR,ICH.W],ICH.C,BUFOUT[*],0); 69250000
|
|
IF RECORD[UNIT] } 0 69260000
|
|
THEN WRITE(IOFILE[UNIT][RECORD[UNIT]],T,BUFOUT[*])[EOF:PAR] 69270000
|
|
ELSE WRITE(IOFILE[UNIT][NO],T,BUFOUT[*])[EOF:PAR]; 69280000
|
|
RECORD[UNIT] ~ -1; 69290000
|
|
SNBLOUT ~ TRUE; 69300000
|
|
GO TO RETURN; 69310000
|
|
END; 69320000
|
|
TRACE: 69330000
|
|
BEGIN DEFINE DUMMY=#; 69340000
|
|
T ~ (IOSIZE[UNIT]-1).W + 1; 69350000
|
|
SIZE ~ IOSIZE[UNIT]; 69360000
|
|
STN ~ NAME[ST]; 69370000
|
|
WRITE(IOFILE[UNIT],FBL); 69380000
|
|
I1 ~ MIN(STN.S,63); % SIZE OF NAME 69390000
|
|
I2 ~ I1 + 3 - I1.[46:2]; % SIZE OF FIELD FOR NAME. 69400000
|
|
WRITE(BUFOUT[*],FTRACE,INSTNO,I2); 69410000
|
|
MOVE(I1,FIRSTCHAR(STN),BUFOUT[*],8); 69420000
|
|
IF SIZE - I2 - 12 > STV.S THEN 69430000
|
|
BEGIN MOVE(STRINGLOC(STV),BUFOUT[*],I2+12); 69440000
|
|
MV(1,QUOTE,7,BUFOUT[(I1~STV.S+I2+12).W],I1.C); 69450000
|
|
WRITE(IOFILE[UNIT][NO],T,BUFOUT[*]) [EOF:PAR]; 69460000
|
|
END ELSE 69470000
|
|
BEGIN 69480000
|
|
MOVE(SIZE-I2-12,FIRSTCHAR(STV),BUFOUT[*],12+I2); 69490000
|
|
WRITE(IOFILE[UNIT][NO],T,BUFOUT[*]) [EOF:PAR]; 69500000
|
|
STV.S ~ STV.S - SIZE + I2 + 12; 69510000
|
|
STV.CH ~ STV.CH + SIZE - I2 - 12; 69520000
|
|
WHILE STV.S } SIZE DO 69530000
|
|
BEGIN MOVE(SIZE,FIRSTCHAR(STV),BUFOUT[*],0); 69540000
|
|
WRITE(IOFILE[UNIT],FBL); 69550000
|
|
WRITE(IOFILE[UNIT][NO],T,BUFOUT[*])[EOF:PAR]; 69560000
|
|
STV.S ~ STV.S - SIZE; 69570000
|
|
STV.CH ~ STV.CH + SIZE; 69580000
|
|
END; 69590000
|
|
CLEAR(BUFOUT,T); 69600000
|
|
MOVE(STV.S,FIRSTCHAR(STV),BUFOUT[*],0); 69610000
|
|
MV(1,QUOTE,7,BUFOUT[(STV.S).W],(STV.S).C); 69620000
|
|
WRITE(IOFILE[UNIT],FBL); 69630000
|
|
WRITE(IOFILE[UNIT][NO],T,BUFOUT[*]) [EOF:PAR]; 69640000
|
|
END; 69650000
|
|
SNBLOUT ~ TRUE; 69660000
|
|
GO TO RETURN; 69670000
|
|
END; 69680000
|
|
SYSPOT: 69690000
|
|
BEGIN DEFINE DUMMY =#; 69700000
|
|
IF STV.S = 0 THEN GO TO RETURN; 69710000
|
|
AA ~ CHAR(DATA[STV.R,STV.W],STV.C); 69720000
|
|
IF AA = "+" THEN IOSPACE[3] ~ 0 ELSE 69730000
|
|
IF AA = " " THEN IOSPACE[3] ~ 1 ELSE 69740000
|
|
IF AA = "0" THEN IOSPACE[3] ~ 2 ELSE 69750000
|
|
IF AA = "1" THEN 69760000
|
|
BEGIN 69770000
|
|
WRITE(PRINT[PAGE]); 69780000
|
|
IOSPACE[3] ~ 1; 69790000
|
|
END ELSE 69800000
|
|
IF AA = "*" THEN % NO SKIP AT END OF PAGE 69810000
|
|
BEGIN RECORD[3] ~ 6; 69820000
|
|
IOSPACE[3] ~ 1; 69830000
|
|
END; 69840000
|
|
STN ~ TEMPCELL; 69850000
|
|
AB ~ STRING(STV.S-1,STN); 69860000
|
|
MOVE(AB.S,FIRSTCHAR(STV)+1,FIRSTCHAR(AB)); 69870000
|
|
AA ~ VALU[PRINTLOC]; 69880000
|
|
AA.LOC ~ AB; 69890000
|
|
VALU[STN] ~ AA; 69900000
|
|
IO[STN] ~ IO[PRINTLOC]; 69910000
|
|
IF SNBLOUT(STN) THEN 69920000
|
|
BEGIN 69930000
|
|
IOSPACE[3] ~ 1; 69940000
|
|
SNBLOUT ~ TRUE; 69950000
|
|
GO TO RETURN; 69960000
|
|
END ELSE 69970000
|
|
BEGIN 69980000
|
|
IOSPACE[3] ~ 1; 69990000
|
|
GO TO FAIL; 70000000
|
|
END; 70010000
|
|
END; 70020000
|
|
ILLEGAL: 70030000
|
|
INFORMA(5,ST); 70040000
|
|
DEATH ~ SYSTEMERROR ~ INFORM ~ TRUE; 70050000
|
|
GO TO ENDTERPRET; 70060000
|
|
NOFILE: 70070000
|
|
IF PRINTMESSAGES THEN 70080000
|
|
BEGIN DEFINE DUMMY=#; 70090000
|
|
STN ~ NAME[ST]; 70100000
|
|
WRITE(BUFOUT[*],FCLOSEDW); 70110000
|
|
MOVE(STN.S,FIRSTCHAR(STN),BUFOUT[*],35); 70120000
|
|
WRITE(PRINT,FBL); 70130000
|
|
WRITE(PRINT,17,BUFOUT[*]); 70140000
|
|
END; 70150000
|
|
GO TO FAIL; 70160000
|
|
PAR: 70170000
|
|
IF PRINTMESSAGES THEN 70180000
|
|
BEGIN DEFINE DUMMY=#; 70190000
|
|
STN ~ NAME[ST]; 70200000
|
|
WRITE(BUFOUT[*],FPARITY); 70210000
|
|
MOVE(STN.S,FIRSTCHAR(STN),BUFOUT[*],32); 70220000
|
|
WRITE(PRINT,FBL); 70230000
|
|
WRITE(PRINT,17,BUFOUT[*]); 70240000
|
|
END; 70250000
|
|
GO TO FAIL; 70260000
|
|
EOF: 70270000
|
|
IOEOF[UNIT] ~ TRUE; 70280000
|
|
FAIL: 70290000
|
|
SNBLOUT ~ FALSE; 70300000
|
|
RETURN: 70310000
|
|
END SNBLOUT; 70320000
|
|
%********SNBLOUT********************************************************70330000
|
|
%********STORECHARS*****************************************************70340000
|
|
PROCEDURE STORECHARS(N,LOC,INC); 70350000
|
|
VALUE N, INC; INTEGER N, INC; ALPHA LOC; 70360000
|
|
BEGIN DEFINE DUMMY =#; 70370000
|
|
IF PTR + N > 8180 THEN 70380000
|
|
BEGIN 70390000
|
|
SYNTAXERR(42,0); 70400000
|
|
END ELSE 70410000
|
|
BEGIN 70420000
|
|
IF N { 63 70430000
|
|
THEN MV(N,LOC,INC,CODE[PTR.W],PTR.C) 70440000
|
|
ELSE MOVE(N,LOC,INC,CODE[PTR.W],PTR.C); 70450000
|
|
PTR ~ PTR + N; 70460000
|
|
END; 70470000
|
|
END STORECHARS; 70480000
|
|
%********STORECHARS*****************************************************70490000
|
|
%********STRING*********************************************************70500000
|
|
% STRING RETURNS THE LOCATION OF AN UNUSED STRING OF SIZE N. 70510000
|
|
% IF NECESSARY, THE GARBAGE COLLECTOR IS CALLED, OR NEW ROWS ARE 70520000
|
|
% MADE AVAILABLE. 70530000
|
|
ALPHA PROCEDURE STRING(N,STLOC); 70540000
|
|
VALUE N, STLOC; 70550000
|
|
INTEGER N; ALPHA STLOC; 70560000
|
|
% 70570000
|
|
BEGIN LABEL L, E, FAIL; 70580000
|
|
INTEGER I; 70590000
|
|
IF DPNTR[RW] + N } 8181 THEN 70600000
|
|
BEGIN INTEGER J; J ~ 8181 - N; 70610000
|
|
FOR I ~ 0 STEP 1 UNTIL DATASIZE DO 70620000
|
|
IF DPNTR[I] < J AND USEDROW[I] THEN 70630000
|
|
BEGIN RW ~ I; J ~ DPNTR[I] END; 70640000
|
|
IF DPNTR[RW] + N } 8181 THEN 70650000
|
|
BEGIN GARBAGECOLLECTOR; 70660000
|
|
FOR I ~ 0 STEP 1 UNTIL DATASIZE DO 70670000
|
|
IF DPNTR[I] < J AND USEDROW[I] THEN 70680000
|
|
BEGIN RW ~ I; J ~ DPNTR[I] END; 70690000
|
|
IF DPNTR[RW] + N } 8181 THEN 70700000
|
|
BEGIN 70710000
|
|
IF N } 8181 THEN GO TO FAIL ELSE 70720000
|
|
FOR I ~ 0 STEP 1 UNTIL DATASIZE DO 70730000
|
|
IF NOT USEDROW[I] THEN 70740000
|
|
BEGIN USEDROW[I] ~ TRUE; 70750000
|
|
RW ~ I; GO TO L; 70760000
|
|
END; 70770000
|
|
END ELSE GO TO L; 70780000
|
|
GO TO FAIL; 70790000
|
|
END; 70800000
|
|
END; 70810000
|
|
L: STLOC.[30:6] ~ QMARK; 70820000
|
|
MV(3,STLOC,5,DATA[RW,(I~DPNTR[RW]).W],I.C); 70830000
|
|
STRING ~ (I+3) & RW CONCR & N CONCS; 70840000
|
|
DPNTR[RW] ~ I + N + 3; 70850000
|
|
GO TO E; 70860000
|
|
FAIL: 70870000
|
|
MESSAGEI(12,N); 70880000
|
|
MESSAGETTI(12,N); 70890000
|
|
COMMENT OUT OF SPACE IN DATA[*,*]; 70900000
|
|
WRITE(PRINT,MESSAGE[1]); 70910000
|
|
DEATH ~ TRUE; 70920000
|
|
E: 70930000
|
|
END STRING; 70940000
|
|
%********STRING*********************************************************70950000
|
|
%********STRINGDUMP*****************************************************70960000
|
|
PROCEDURE STRINGDUMP(INSTNO); VALUE INSTNO; INTEGER INSTNO; 70970000
|
|
BEGIN 70980000
|
|
INTEGER I, J, T, SN; 70990000
|
|
ALPHA STN, STV; 71000000
|
|
WRITETIME(0,0); 71010000
|
|
MESSAGE0(6); 71020000
|
|
IF PRINTMESSAGES THEN MESSAGETT0(6); 71030000
|
|
FOR I ~ 0 STEP 1 WHILE I { STRMAX AND USEDST[I] DO 71040000
|
|
FOR J ~ 0 STEP 1 UNTIL STWMAX DO 71050000
|
|
IF (STN~NAMTABL[I,J]).[1:2] = 0 THEN IF STN.LOC > 1 THEN 71060000
|
|
BEGIN 71070000
|
|
SN ~ MIN(STN.S,63); 71080000
|
|
T ~ MAX(SN+3-SN.[46:2],8); 71090000
|
|
STV ~ VALTABL[I,J]; 71100000
|
|
WRITE(BUFOUT[*],FTRACE,INSTNO,T); 71110000
|
|
MOVE(SN,FIRSTCHAR(STN),BUFOUT[*],8); 71120000
|
|
IF 120 - T > STV.S THEN 71130000
|
|
BEGIN MOVE(STV.S,FIRSTCHAR(STV), 71140000
|
|
BUFOUT[T.W],12+T.C); 71150000
|
|
MV(1,QUOTE,7,BUFOUT[(I1~STV.S+T+12).W],I1.C); 71160000
|
|
WRITE(PRINT,17,BUFOUT[*]); 71170000
|
|
END ELSE 71180000
|
|
BEGIN 71190000
|
|
MOVE(120-T,FIRSTCHAR(STV), 71200000
|
|
BUFOUT[*],12+T); 71210000
|
|
WRITE(PRINT,17,BUFOUT[*]); 71220000
|
|
STV.S ~ STV.S - 120 + T; 71230000
|
|
STV.CH ~ STV.CH + 120 - T; 71240000
|
|
WHILE STV.S } 132 DO 71250000
|
|
BEGIN MOVE(132,FIRSTCHAR(STV), 71260000
|
|
BUFOUT[*],0); 71270000
|
|
WRITE(PRINT,17,BUFOUT[*]); 71280000
|
|
STV.S ~ STV.S-132; 71290000
|
|
STV.CH ~ STV.CH + 132; 71300000
|
|
END; 71310000
|
|
CLEAR(BUFOUT,17); 71320000
|
|
MOVE(STV.S,FIRSTCHAR(STV),BUFOUT[*],0); 71330000
|
|
MV(1,QUOTE,7,BUFOUT[(STV.S).W],(STV.S).C); 71340000
|
|
WRITE(PRINT,17,BUFOUT[*]); 71350000
|
|
END; 71360000
|
|
END; 71370000
|
|
MESSAGE0(7); 71380000
|
|
FOR I ~ 0 STEP 1 WHILE I { STRMAX AND USEDST[I] DO 71390000
|
|
FOR J ~ 0 STEP 1 UNTIL STWMAX DO 71400000
|
|
IF (STN ~ NAMTABL[I,J]).[1:2] = 3 THEN 71410000
|
|
BEGIN SN ~ MIN(STN.S,63); 71420000
|
|
T ~ MAX(SN+3-SN.[46:2],8); 71430000
|
|
I1 ~ VALTABL[I,J].LINK; 71440000
|
|
WRITE(BUFOUT[*],FTRACEL,T,DIGITS(I1),I1); 71450000
|
|
MV(SN,FIRSTCHAR(STN),BUFOUT[*],3); 71460000
|
|
WRITE(PRINT,17,BUFOUT[*]); 71470000
|
|
END; 71480000
|
|
WRITETIME(0,0); 71490000
|
|
END STRINGDUMP; 71500000
|
|
%********STRINGDUMP*****************************************************71510000
|
|
%********SYNTAXERR******************************************************71520000
|
|
PROCEDURE SYNTAXERR(N,P); VALUE N,P; INTEGER N,P; 71530000
|
|
BEGIN 71540000
|
|
DEFINE DUMMY = #; 71550000
|
|
P ~ P MOD FIELDSIZE; 71560000
|
|
IF P > 0 THEN 71570000
|
|
BEGIN 71580000
|
|
CLEAR(BUFOUT,17); 71590000
|
|
MOVE(1,QMARK,7,BUFOUT[P.W],P.C+8); 71600000
|
|
WRITE(PRINT,17,BUFOUT[*]); 71610000
|
|
END; 71620000
|
|
WRITE(PRINT,MESSAGE[N]); 71630000
|
|
PTR ~ MARKER + 8; 71640000
|
|
STORECHARS(1,"X",7); 71650000
|
|
MESSAGES ~ MESSAGES + 1; 71660000
|
|
ERRORS ~ ERRORS + 1; 71670000
|
|
END SYNTAXERR; 71680000
|
|
%********SYNTAXERR******************************************************71690000
|
|
%********TEMPCEL********************************************************71700000
|
|
% TEMPCELL PRODUCES A TEMPORARY CELL IN THE SYMBOL TABLE. 71710000
|
|
% THIS CELL CAN GENERALLY BE ASSUMED TO BE GONE AFTER THE END OF AN 71720000
|
|
% INSTRUCTION. (THIS IS ACTUALLY NOT ALWAYS TRUE, BUT IT IS RATHER 71730000
|
|
% DIFFICULT TO PREDICT WHEN A CELL WILL STAY AROUND LONGER.) SEE ALSO 71740000
|
|
% THE PROCEDURE NEWCELL FOR GETTING PERMANENT CELLS. 71750000
|
|
ALPHA PROCEDURE TEMPCELL; 71760000
|
|
BEGIN INTEGER ST, I, J; 71770000
|
|
LABEL FAIL, RETURN; 71780000
|
|
DEFINE ROW=TEMPROW#; 71790000
|
|
% 71800000
|
|
% IF INFORM THEN INFORMI(7,ROW); 71810000
|
|
ST ~ NEXTCELL[ROW]; 71820000
|
|
IF ST = 0 THEN 71830000
|
|
BEGIN 71840000
|
|
FOR ROW ~ 0 STEP 1 WHILE ST = 0 DO 71850000
|
|
IF ROW > 15 THEN GO TO FAIL ELSE 71860000
|
|
IF USEDST[ROW] 71870000
|
|
THEN ST ~ NEXTCELL[ROW] 71880000
|
|
ELSE BEGIN NEWSTROW(ROW); 71890000
|
|
ST ~ 0 & ROW CONCSTR; 71900000
|
|
END; 71910000
|
|
ROW ~ ROW - 1; % THE "STEP" WAS EXECUTED ONE TIME TOO MANY. 71920000
|
|
END; 71930000
|
|
NEXTCELL[ROW] ~ NAME[ST].LINK; 71940000
|
|
IF (I~TEMPLIST[ROW]) = 0 THEN 71950000
|
|
BEGIN TEMPLIST[ROW] ~ ST; 71960000
|
|
NAME[ST] ~ 0 & ST CLINK; 71970000
|
|
END ELSE 71980000
|
|
BEGIN J ~ NAME[I].LINK; 71990000
|
|
NAME[I].LINK ~ ST; 72000000
|
|
NAME[ST] ~ 0 & J CLINK; 72010000
|
|
END; 72020000
|
|
VALU[ST] ~ 0; 72030000
|
|
TEMPCELL ~ ST; 72040000
|
|
% IF USEDCELL[ROW] < ST THEN USEDCELL[ROW] ~ ST; 72050000
|
|
GO TO RETURN; 72060000
|
|
FAIL: 72070000
|
|
MESSAGE0(14); 72080000
|
|
MESSAGETT0(14); 72090000
|
|
WRITE(PRINT,MESSAGE[1]); 72100000
|
|
DEATH ~ TRUE; 72110000
|
|
RETURN: 72120000
|
|
% IF INFORM THEN INFORMIA(0,ROW,ST); 72130000
|
|
END TEMPCEL; 72140000
|
|
%********TEMPCEL********************************************************72150000
|
|
%********TEMPVAL********************************************************72160000
|
|
% TEMPVAL PRODUCES A TEMPORARY SYMB TABLE CELL WHOSE VALUE IS THE 72170000
|
|
% STRING REPRESENTATION OF THE INTEGER I. 72180000
|
|
ALPHA PROCEDURE TEMPVAL(I); 72190000
|
|
VALUE I; INTEGER I; 72200000
|
|
BEGIN ALPHA ARRAY NUM[0:1]; 72210000
|
|
ALPHA AA, AB; INTEGER J; 72220000
|
|
% 72230000
|
|
WRITE(NUM[*],FI16,I); 72240000
|
|
J ~ 16 - SKIPCHAR(" ",NUM[0],0); 72250000
|
|
TEMPVAL ~ AA ~ TEMPCELL; 72260000
|
|
AB ~ STRING(J,AA); 72270000
|
|
MV(J,NUM[0],16-J,DATA[AB.R,AB.W],AB.C); 72280000
|
|
VALTABL[AA.STR,AA.STW] ~ AB; 72290000
|
|
END TEMPVAL; 72300000
|
|
%********TEMPVAL********************************************************72310000
|
|
%********TRACEFCTCALL***************************************************72320000
|
|
BOOLEAN PROCEDURE TRACEFCTCALL(F); 72330000
|
|
VALUE F; 72340000
|
|
INTEGER F; % SYMBOL TABLE LOC OF FUNCTION 72350000
|
|
BEGIN 72360000
|
|
LABEL FAIL, FIN; 72370000
|
|
ALPHA FCTN, FIO, PV; 72380000
|
|
INTEGER I, J, SIZE, P, PS, PC, PR; 72390000
|
|
DEFINE WRITERECORD = IF WRITEBUFF(BUFOUT,P,SIZE) THEN GO TO FAIL #; 72400000
|
|
% 72410000
|
|
FCTN ~ NAME[F]; 72420000
|
|
FIO ~ IO[F]; 72430000
|
|
IF FIO.IOTYPE = 2 THEN % OUTPUT TO FILE. 72440000
|
|
BEGIN 72450000
|
|
UNIT ~ FIO.FILNO; 72460000
|
|
SIZE ~ IOSIZE[UNIT]; 72470000
|
|
I ~ MIN(63,FCTN.S); 72480000
|
|
WRITE(BUFOUT[*],FTRACEFCTCALL,INSTNO,I); 72490000
|
|
MV(I,FIRSTCHAR(FCTN),BUFOUT[*],8); 72500000
|
|
P ~ I + 8; 72510000
|
|
IF SP { MKS THEN P ~ P + 1 ELSE 72520000
|
|
FOR I ~ MKS STEP 1 WHILE I < SP DO 72530000
|
|
BEGIN % MOVE PARAM INTO BUFOUT[*]: 72540000
|
|
IF P~P+1 } SIZE THEN WRITERECORD; 72550000
|
|
MV(1,QUOTE,7,BUFOUT[P.W],P.C); 72560000
|
|
P ~ P + 1; 72570000
|
|
PV ~ VALU[PST[I]]; 72580000
|
|
PR ~ PV.R; 72590000
|
|
PS ~ PV.S; 72600000
|
|
PC ~ PV.CH; 72610000
|
|
WHILE PS+P } SIZE DO 72620000
|
|
BEGIN % MOVE IN PART OF PARAM, AND WRITE: 72630000
|
|
IF P < SIZE THEN 72640000
|
|
BEGIN 72650000
|
|
MOVE(SIZE-P,DATA[PR,PC.W],PC.C,BUFOUT[P.W],P.C); 72660000
|
|
PS ~ PS - SIZE + P; 72670000
|
|
PC ~ PC + SIZE - P; 72680000
|
|
END; 72690000
|
|
WRITERECORD; 72700000
|
|
END; 72710000
|
|
MOVE(PS,DATA[PR,PC.W],PC.C,BUFOUT[P.W],P.C); 72720000
|
|
P ~ P + PS; 72730000
|
|
IF P+1 } SIZE THEN WRITERECORD; 72740000
|
|
MV(1,QUOTE,7,BUFOUT[P.W],P.C); 72750000
|
|
IF (P~P+1)+1 } SIZE THEN WRITERECORD; 72760000
|
|
MV(1,COMMA,7,BUFOUT[P.W],P.C); 72770000
|
|
END; 72780000
|
|
% CHANGE LAST "," TO ")": 72790000
|
|
AA ~ ")"; 72800000
|
|
MV(1,AA,7,BUFOUT[P.W],P.C); 72810000
|
|
WRITERECORD; 72820000
|
|
TRACEFCTCALL ~ TRUE; 72830000
|
|
GO TO FIN; 72840000
|
|
END FILE OUTPUT ELSE 72850000
|
|
% CALL TRACING FUNCTION: 72860000
|
|
; % NOT YET IMPLEMENTED. 72870000
|
|
FAIL: 72880000
|
|
TRACEFCTCALL ~ FALSE; 72890000
|
|
FIN: 72900000
|
|
END TRACEFCTCALL; 72910000
|
|
%********TRACEFCTCALL***************************************************72920000
|
|
%********TRACEFCTRETURN*************************************************72930000
|
|
BOOLEAN PROCEDURE TRACEFCTRETURN(F,SUC); 72940000
|
|
VALUE F, SUC; 72950000
|
|
INTEGER F; % SYMBOL TABLE LOC OF FUNCTION 72960000
|
|
BOOLEAN SUC; % TRUE IF SUCCEEDED. 72970000
|
|
BEGIN 72980000
|
|
LABEL FAIL, FIN, FAUT; 72990000
|
|
INTEGER I, P, SV, CV, RV, SIZE; 73000000
|
|
ALPHA FCTN, FIO; 73010000
|
|
DEFINE WRITERECORD = IF WRITEBUFF(BUFOUT,P,SIZE) THEN GO TO FAIL #; 73020000
|
|
% 73030000
|
|
FCTN ~ NAME[F]; 73040000
|
|
FIO ~ IO[F]; 73050000
|
|
IF FIO.IOTYPE = 2 THEN % OUTPUT TO FILE 73060000
|
|
BEGIN 73070000
|
|
UNIT ~ FIO.FILNO; 73080000
|
|
SIZE ~ IOSIZE[UNIT]; 73090000
|
|
I ~ MIN(63,FCTN.S); 73100000
|
|
WRITE(BUFOUT[*],FTRACEFCTRET,INSTNO,I); 73110000
|
|
MV(I,FIRSTCHAR(FCTN),BUFOUT[*],8); 73120000
|
|
P ~ I + 8; 73130000
|
|
WRITE(IOFILE[UNIT],FBL) [FAIL:FAIL]; 73140000
|
|
IF SUC THEN 73150000
|
|
BEGIN % WRITE OUT VALUE: 73160000
|
|
P ~ P + 6; 73170000
|
|
AA ~ VALU[PST[MKS]]; % = VALUE. 73180000
|
|
SV ~ AA.S; 73190000
|
|
CV ~ AA.CH; 73200000
|
|
RV ~ AA.R; 73210000
|
|
WHILE SV+P } SIZE DO 73220000
|
|
BEGIN 73230000
|
|
MOVE(SIZE-P,DATA[RV,CV.W],CV.C,BUFOUT[P.W],P.C); 73240000
|
|
CV ~ CV + SIZE - P; 73250000
|
|
SV ~ SV - SIZE + P; 73260000
|
|
WRITERECORD; 73270000
|
|
END; 73280000
|
|
IF SV > 0 THEN 73290000
|
|
MOVE(SV,DATA[RV,CV.W],CV.C,BUFOUT[P.W],P.C); 73300000
|
|
IF P~P+SV < SIZE THEN % ROOM FOR QUOTE 73310000
|
|
BEGIN MV(1,QUOTE,7,BUFOUT[P.W],P.C); 73320000
|
|
WRITE(IOFILE[UNIT][NO],1023,BUFOUT[*]) [FAIL:FAIL]; 73330000
|
|
END ELSE 73340000
|
|
% PUT QUOTE ON NEXT LINE: 73350000
|
|
BEGIN WRITE(IOFILE[UNIT],1023,BUFOUT[*])[FAIL:FAIL]; 73360000
|
|
MV(1,QUOTE,7,BUFOUT[*],0); 73370000
|
|
MV(7,BLANKS,0,BUFOUT[*],1); 73380000
|
|
WRITE(IOFILE[UNIT][NO],1,BUFOUT[*])[FAIL:FAIL]; 73390000
|
|
END; 73400000
|
|
END SUCCESS CASE ELSE 73410000
|
|
% WRITE "FAILED.": 73420000
|
|
BEGIN AA ~ "FAILED."; 73430000
|
|
MV(7,AA,1,BUFOUT[P.W],P.C+3); 73440000
|
|
WRITE(IOFILE[UNIT][NO],1023,BUFOUT[*])[FAIL:FAIL]; 73450000
|
|
END; 73460000
|
|
TRACEFCTRETURN ~ TRUE; 73470000
|
|
GO TO FIN; 73480000
|
|
END FILE OUTPUT ELSE 73490000
|
|
% CALL TRACING FUNCTION: 73500000
|
|
; % NOT YET IMPLEMENTED. 73510000
|
|
FAUT: 73520000
|
|
FAIL: 73530000
|
|
TRACEFCTRETURN ~ FALSE; 73540000
|
|
FIN: 73550000
|
|
END TRACEFCTRETURN; 73560000
|
|
%********TRACEFCTRETURN*************************************************73570000
|
|
%********TTINDEX********************************************************73580000
|
|
% ST SHOULD BE A SYMBOL TABLE CELL POINTING TO A TELETYPE ADDRESS IN 73590000
|
|
% THE STANDARD FORM <T.U.>/<B.A.>. THE VALUE RETURNED IS THE SUBSCRIPT 73600000
|
|
% TO USE WITH ID[*] AND STAT[*] FOR THIS TELETYPE. 73610000
|
|
% IF THE TELETYPE ISNT ATTACHED, -1 IS RETURNED. 73620000
|
|
INTEGER PROCEDURE TTINDEX(ST); 73630000
|
|
VALUE ST; 73640000
|
|
ALPHA ST; 73650000
|
|
BEGIN LABEL FAIL, FIN; 73660000
|
|
INTEGER BA, TU, I, J, K, N, IR, IC; 73670000
|
|
FINDUSERS; 73680000
|
|
ST ~ VALU[ST]; 73690000
|
|
IR ~ ST.R; IC ~ ST.CH; 73700000
|
|
TU ~ BA ~ 0; 73710000
|
|
N ~ ST.S; 73720000
|
|
I ~ SCANCHAR("/",QMARK,DATA[IR,IC.W],IC.C); 73730000
|
|
IF I } N OR CHAR(DATA[IR,IC.W],IC.C+I) ! "/" THEN GO TO FAIL; 73740000
|
|
FOR J ~ 0 STEP 1 WHILE J < I DO 73750000
|
|
IF K ~ CHAR(DATA[IR,IC.W],IC.C+J) > 9 73760000
|
|
THEN GO TO FAIL 73770000
|
|
ELSE TU ~ TU|10 + K; 73780000
|
|
IF TU = 0 OR TU > 15 THEN GO TO FAIL; 73790000
|
|
FOR J ~ I+1 STEP 1 WHILE J < N DO 73800000
|
|
IF K ~ CHAR(DATA[IR,IC.W],IC.C+J) > 9 73810000
|
|
THEN GO TO FAIL 73820000
|
|
ELSE BA ~ BA|10 + K; 73830000
|
|
IF BA > 15 THEN GO TO FAIL; 73840000
|
|
BA ~ BA & TU[39:44:4]; 73850000
|
|
I ~ -1; 73860000
|
|
FOR J ~ 0 STEP 1 WHILE J < NUMUSERS AND I < 0 DO 73870000
|
|
IF BA = STAT[J].[9:9] THEN I ~ J; 73880000
|
|
IF I } 0 THEN 73890000
|
|
BEGIN TTINDEX ~ I; 73900000
|
|
GO TO FIN; 73910000
|
|
END; 73920000
|
|
FAIL: 73930000
|
|
TTINDEX ~ -1; 73940000
|
|
FIN: 73950000
|
|
END TTINDEX; 73960000
|
|
%********TTINDEX********************************************************73970000
|
|
%********WRITEBUFF******************************************************73980000
|
|
BOOLEAN PROCEDURE WRITEBUFF(BUFOUT,P,SIZE); 73990000
|
|
VALUE SIZE; 74000000
|
|
INTEGER P, SIZE; 74010000
|
|
ARRAY BUFOUT[0]; 74020000
|
|
BEGIN LABEL FAIL, FIN; 74030000
|
|
WRITE(IOFILE[UNIT],FBL); 74040000
|
|
WRITE(IOFILE[UNIT][NO],1023,BUFOUT[*]) [FAIL:FAIL]; 74050000
|
|
P ~ 0; 74060000
|
|
CLEAR(BUFOUT,SIZE.W); 74070000
|
|
WRITEBUFF ~ FALSE; 74080000
|
|
GO TO FIN; 74090000
|
|
FAIL: 74100000
|
|
WRITEBUFF ~ TRUE; % TRUE IF OUTPUT FAILS 74110000
|
|
FIN: 74120000
|
|
END WRITEBUFF; 74130000
|
|
%********WRITEBUFF******************************************************74140000
|
|
%********WRITEDATA******************************************************74150000
|
|
% DUMP OF PROGRAM/DATA AREAS: 74160000
|
|
PROCEDURE WRITEDATA; 74170000
|
|
BEGIN INTEGER I; 74180000
|
|
PROCEDURE WRITEDATAROW(I); VALUE I; INTEGER I; 74190000
|
|
BEGIN INTEGER J; INTEGER ARRAY BUFFER[0:14]; 74200000
|
|
J ~ 0; 74210000
|
|
WRITE(BUFFER[*],MESSAGE[37],I); 74220000
|
|
MOVE(100,DATA[I,*],0,BUFFER[*],16); 74230000
|
|
MOVE(4,BLANKS,0,BUFFER[14],4); 74240000
|
|
WRITE(PRINT,MESSAGE[36]); 74250000
|
|
WRITE(PRINT,15,BUFFER[*]); 74260000
|
|
FILL BUFFER[*] WITH " "," "; 74270000
|
|
FOR J ~ J + 100 WHILE J < 8084 DO 74280000
|
|
BEGIN MOVE(100,DATA[I,J.W],J.C,BUFFER[*],16); 74290000
|
|
WRITE(PRINT,15,BUFFER[*]); 74300000
|
|
END; 74310000
|
|
MOVE(84,DATA[I,1012],4,BUFFER[*],16); 74320000
|
|
FOR J ~ 100,108 DO MOVE(8,BLANKS,0,BUFFER[J.W],J.C); 74330000
|
|
WRITE(PRINT,15,BUFFER[*]); 74340000
|
|
WRITE(PRINT,MESSAGE[36]); 74350000
|
|
END WRITEDATAROW; 74360000
|
|
WRITETIME(0,0); 74370000
|
|
WRITE(PRINT [PAGE]); 74380000
|
|
FOR I ~ 0 STEP 1 UNTIL 31 DO 74390000
|
|
BEGIN WRITE(PRINT,MESSAGE[35],I,USEDROW[I],I,DPNTR[I]); 74400000
|
|
IF USEDROW[I] THEN WRITEDATAROW(I); 74410000
|
|
END; 74420000
|
|
WRITETIME(0,0); 74430000
|
|
END WRITEDATA; 74440000
|
|
%********WRITEDATA******************************************************74450000
|
|
%********WRITEINST******************************************************74460000
|
|
% WRITEINST PRINTS OUT THE CODE THAT HAS BEEN PRODUCED SO FAR 74470000
|
|
% BY THE COMPILER. 74480000
|
|
PROCEDURE WRITEINST; 74490000
|
|
BEGIN DEFINE DUMMY=#; 74500000
|
|
CLEAR(BUFOUT,17); 74510000
|
|
MOVE(MIN(PTR-MARKER,132),CODE[MARKER.W],MARKER.C,BUFOUT[*],0); 74520000
|
|
WRITE(PRINT,17,BUFOUT[*]); 74530000
|
|
END WRITEINST; 74540000
|
|
%********WRITEINST******************************************************74550000
|
|
%********WRITEST********************************************************74560000
|
|
% SYMBOL TABLE DUMP ROUTINE: 74570000
|
|
PROCEDURE WRITEST; 74580000
|
|
BEGIN 74590000
|
|
FORMAT F(X5,A2,X1,I4," * ",2(4I1,X1,I2,X1,I3,X1,I4,X1,I2,X1, 74600000
|
|
I4," "),A2,X12,I1,X4,I3,X3,I3,X4,L1,X4,I2), 74610000
|
|
F1(7("*"),X10,"NAMTABL[",I2,",*]",X16,"VALTABL[",I2,",*]",X27, 74620000
|
|
"IOUSE FILNO CYCLE OVFL IOTYPE"), 74630000
|
|
F2("NEXTCELL[",I2,"] = ",A2,"; TEMPLIST[",I2,"] = ",A2); 74640000
|
|
INTEGER I, J, K; 74650000
|
|
ALPHA L; 74660000
|
|
WRITE(PRINT[1]); 74670000
|
|
WRITETIME(0,0); 74680000
|
|
FOR I ~ 0 STEP 1 UNTIL STRMAX DO IF USEDST[I] THEN 74690000
|
|
BEGIN 74700000
|
|
WRITE(PRINT,F2,I,NEXTCELL[I],I,TEMPLIST[I]); 74710000
|
|
WRITE(PRINT,F1,I,I); 74720000
|
|
FOR K ~ 0 STEP 1 UNTIL STWMAX DO 74730000
|
|
WRITE(PRINT,F,(K&I CONCSTR),K,FOR L ~ 74740000
|
|
NAMTABL[I,K],VALTABL[I,K] DO 74750000
|
|
[L.[1:1], 74760000
|
|
L.[2:1], 74770000
|
|
L.[3:1], 74780000
|
|
L.[4:1], 74790000
|
|
L.[5:4], 74800000
|
|
L.[9:8], 74810000
|
|
L.S, 74820000
|
|
L.R, 74830000
|
|
L.CH], 74840000
|
|
(K&I CONCSTR), 74850000
|
|
FOR L ~ IOTABL[I,K] DO 74860000
|
|
[L.IOUSE, 74870000
|
|
L.FILNO, 74880000
|
|
L.CYCLE, 74890000
|
|
L.OVFL, 74900000
|
|
L.IOTYPE]); 74910000
|
|
END; 74920000
|
|
WRITETIME(0,0); 74930000
|
|
END WRITEST; 74940000
|
|
%********WRITEST********************************************************74950000
|
|
%********WRITESTACK*****************************************************74960000
|
|
% WRITESTACK(N) PRINTS OUT THE CONTENTS OF THE STACK, FROM WORD 0 74970000
|
|
% TO WORD N. N SHOULD BE { STACKSIZE. 74980000
|
|
PROCEDURE WRITESTACK(N); 74990000
|
|
VALUE N; 75000000
|
|
INTEGER N; 75010000
|
|
BEGIN INTEGER I; 75020000
|
|
WRITE(PRINT,FSTACKHEAD); 75030000
|
|
FOR I ~ 0 STEP 1 UNTIL N DO 75040000
|
|
WRITE(PRINT,FSTACKENTRY, 75050000
|
|
I, 75060000
|
|
PTYPE[I], 75070000
|
|
PST[I], 75080000
|
|
PNAME[I], 75090000
|
|
PLOC[I].S, PLOC[I].R, PLOC[I].CH, 75100000
|
|
PSIZE[I], 75110000
|
|
PPOINT[I], 75120000
|
|
PMINLEFT[I], 75130000
|
|
PBACK[I]); 75140000
|
|
END WRITESTACK; 75150000
|
|
%********WRITESTACK*****************************************************75160000
|
|
%********WRITETIME******************************************************75170000
|
|
% F IS NO LONGER IN USE HERE. 75180000
|
|
PROCEDURE WRITETIME(F,N); VALUE F,N; INTEGER F,N; 75190000
|
|
BEGIN REAL T, TS; 75200000
|
|
INTEGER TH, TM; 75210000
|
|
T ~ TIME(1) / 60; 75220000
|
|
TH ~ ENTIER(T / 3600); 75230000
|
|
TM ~ ENTIER((T - TH | 3600) / 60); 75240000
|
|
TS ~ T - TH | 3600 - TM | 60; 75250000
|
|
IF N { 0 THEN 75260000
|
|
WRITE(PRINT,FTIME[0],TIME(2)/60,TIME(3)/60) ELSE 75270000
|
|
IF N { 1 THEN 75280000
|
|
BEGIN ALPHA D, M, Y, X; ALPHA ARRAY MM[1:12]; 75290000
|
|
X ~ DATE; 75300000
|
|
M ~ X.[1:5] | 10 + X.[6:6]; 75310000
|
|
D ~ X.[18:6] | 10 + X.[24:6]; 75320000
|
|
Y ~ X.[36:12]; 75330000
|
|
FILL MM[*] WITH 75340000
|
|
"JAN","FEB","MAR","APR","MAY","JUN", 75350000
|
|
"JUL","AUG","SEP","OCT","NOV","DEC"; 75360000
|
|
WRITE(PRINT,FTIME[1],VERSION,DIGITS(D),D,MM[M],Y,TH,TM,TS); 75370000
|
|
END ELSE 75380000
|
|
IF N { 3 THEN 75390000
|
|
WRITE(PRINT,FTIME[N],TH,TM,TS) ELSE 75400000
|
|
IF N { 5 THEN 75410000
|
|
WRITE(PRINT,FTIME[N],TH,TM,TS,DIGITS(LEVEL),LEVEL, 75420000
|
|
DIGITS(INSTNO),INSTNO); 75430000
|
|
END WRITETIME; 75440000
|
|
%********WRITETIME******************************************************75450000
|
|
%***********************************************************************75460000
|
|
% END OF PROCEDURE DECLARATIONS 75470000
|
|
BEGIN COMMENT INITIALIZATION; 75480000
|
|
ALPHA ARRAY USERS[0:31]; 75490000
|
|
% 75500000
|
|
% B5500 CHARACTER SET: 75510000
|
|
% 0 1 2 3 4 5 6 7 8 9 75520000
|
|
% # @ QMARK : > } + A B C 75530000
|
|
% D E F G H I . [ & ( 75540000
|
|
% < ~ | J K L M N O P 75550000
|
|
% Q R $ * - ) ; { BLANK / 75560000
|
|
% S T U V W X Y Z , % 75570000
|
|
% ! = ] " 75580000
|
|
% 75590000
|
|
FILL CONVERTVAL[*] WITH 75600000
|
|
"0","1","2","3","4","5","6","7","8","9", 75610000
|
|
"=",""",":","{","%","[","<","A","B","C", 75620000
|
|
"D","E","F","G","H","I",".",")","+","}", 75630000
|
|
12, ";",12, "J","K","L","M","N","O","P", 75640000
|
|
"Q","R","$","*","-",12, 12, ">"," ","/", 75650000
|
|
"S","T","U","V","W","X","Y","Z",",","(", 75660000
|
|
"]",12, 12, "&"; 75670000
|
|
% 75680000
|
|
% 75690000
|
|
FILL CHARTYPE[*] WITH 75700000
|
|
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 75710000
|
|
0, 0, 13, 9, 0, 0, 10, 3, 3, 3, 75720000
|
|
3, 3, 3, 3, 3, 3, 3, 0, 0, 5, 75730000
|
|
0, 2, 10, 3, 3, 3, 3, 3, 3, 3, 75740000
|
|
3, 3, 8, 7, 10, 6, 14, 0, 1, 12, 75750000
|
|
3, 3, 3, 3, 3, 3, 3, 3, 11, 0, 75760000
|
|
0, 2, 0, 4; 75770000
|
|
% 75780000
|
|
FILL DOTTYPE[*] WITH 75790000
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75800000
|
|
0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 75810000
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75820000
|
|
0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 75830000
|
|
0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 75840000
|
|
3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75850000
|
|
0, 0, 0, 0; 75860000
|
|
% VALUES FOR DOTTYPE: 75870000
|
|
% 0 ERROR 75880000
|
|
% 1 .N 75890000
|
|
% 2 .+, .-, .|, ./, .* 75900000
|
|
% 3 .S 75910000
|
|
% 75920000
|
|
FILL OPLEVEL[*] WITH 75930000
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75940000
|
|
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 75950000
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75960000
|
|
0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 75970000
|
|
0, 0, 0, 4, 2, 0, 0, 0, 0, 3, 75980000
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75990000
|
|
0, 0, 0, 0; 76000000
|
|
FILL WORDS[*] WITH 76010000
|
|
"UNANCHOR","OUNDUMP ","INTEGERT","RUNCATIO","NDISK IN", 76020000
|
|
"FORMSILE","NCENDFRE","TURNDATA","COMIORUL","ESPROCES", 76030000
|
|
"SAVERELE","ASEPURGE","TELETYPE","DEBUGRUN","ERRDUMPT", 76040000
|
|
"RUNCATEO","VERFLOWQ","UOTEQMAR","KARROWRE","ADPRINTP", 76050000
|
|
"UNCHLOOK","SYSPOTCA","RDNEWDIS","K "; 76060000
|
|
FILL MNEMONIC[0,*] WITH 76070000
|
|
6, 76080000
|
|
"ON","TO","BY","AT","IN","OFF"; 76090000
|
|
FILL MNEMONIC[1,*] WITH 76100000
|
|
2, 76110000
|
|
"FROM","TO"; 76120000
|
|
FILL CONTROLCARD[*] WITH 0, 76130000
|
|
"DEBUG", 76140000
|
|
"PCC", 76150000
|
|
"LIST", 76160000
|
|
"UNLIST", 76170000
|
|
"PUNCH", 76180000
|
|
"EJECT", 76190000
|
|
"SPACE", 76200000
|
|
"WIDTH", 76210000
|
|
"26", 76220000
|
|
"3600", 76230000
|
|
"B5500", 76240000
|
|
"DEFINE", 76250000
|
|
"WAIT", 76260000
|
|
"LIMIT", 76270000
|
|
"SIZE", 76280000
|
|
"SET", 76290000
|
|
"LIBRARY", 76300000
|
|
"LOAD", 76310000
|
|
"COMPILE", 76320000
|
|
"INFORM", 76330000
|
|
"SILENCE"; 76340000
|
|
FILL INTRINSFCT[3,*] WITH 76350000
|
|
8,".EQ",".NE",".LT",".LE",".GT",".GE","POP","EOF"; 76360000
|
|
FILL INTRINSNDX[3,*] WITH 76370000
|
|
9, 21, 19, 16, 15, 14, 25, 8; 76380000
|
|
FILL INTRINSFCT[4,*] WITH 76390000
|
|
17, 76400000
|
|
".NUM","PUSH","PAGE","SIZE","MODE", 76410000
|
|
"DUMP","DATE","TRIM","TIME", 76420000
|
|
"FILE","LOOK","WAIT","FILL","USER", 76430000
|
|
"SEEK","COPY"; 76440000
|
|
FILL INTRINSNDX[4,*] WITH 76450000
|
|
22, 26, 24, 30, 20, 7, 4, 36, 32, 76460000
|
|
12, 18, 39, 13, 42, 43, 48; 76470000
|
|
FILL INTRINSFCT[5,*] WITH 76480000
|
|
10, 76490000
|
|
"SPACE","UNEQL","TRACE","CLOSE","RULES", 76500000
|
|
"LEVEL","OPSYN","CALLF",".RANF","CLEAR"; 76510000
|
|
FILL INTRINSNDX[5,*] WITH 76520000
|
|
31, 38, 46, 3, 29, 17, 23, 2, 50, 51; 76530000
|
|
FILL INTRINSFCT[6,*] WITH 76540000
|
|
14, 76550000
|
|
".REMDR","ANCHOR","UNANCH","EQUALS","DEFINE", 76560000
|
|
"DETACH","TRACEF","REWIND","TRACEL","STATUS", 76570000
|
|
"TRACES","RECORD","ASSIGN","SEARCH"; 76580000
|
|
FILL INTRINSNDX[6,*] WITH 76590000
|
|
27, 1, 37, 10, 5, 6, 34, 28, 35, 41, 76600000
|
|
33, 45, 47, 49; 76610000
|
|
FILL INTRINSFCT[7,*] WITH 76620000
|
|
4,"EXECUTE","COMPILE","SUSPEND","RELEASE"; 76630000
|
|
FILL INTRINSNDX[7,*] WITH 76640000
|
|
11, 0, 40, 44; 76650000
|
|
FILL MONTHS[*] WITH 31,28,31,30,31,30,31,31,30,31,30,31; 76660000
|
|
IF ((TEMP~TIME(0)).[24:6] + TEMP.[18:6] | 10) MOD 4 = 0 THEN 76670000
|
|
MONTHS[2] ~ 29; 76680000
|
|
% 76690000
|
|
% 76700000
|
|
% 76710000
|
|
RANDNO ~ 8388607; % INITIALIZE RANDOM NUMBER GENERATOR 76720000
|
|
CRLF ~ "{!~"; 76730000
|
|
ARROW ~ "~"; SLASH ~ "/"; 76740000
|
|
EQSIGN ~ "="; 76750000
|
|
QMARK ~ 12; QUOTE ~ """; BLANK ~ " "; COLON ~ ":"; 76760000
|
|
STAR ~ "*"; COMMA ~ ","; 76770000
|
|
STOPPER ~ QUOTE & QMARK[36:42:6] & BLANK[30:42:6]; 76780000
|
|
BLANKS ~ " "; MOVE(4,BLANKS,4,BLANKS,0); 76790000
|
|
TEENYNEG ~ REAL(NOT FALSE); 76800000
|
|
ANCHORMODE ~ 2; 76810000
|
|
TRACEALL ~ BOOLEAN(COMMON.[47:1]); 76820000
|
|
DUMPALL ~ BOOLEAN(COMMON.[46:1]); 76830000
|
|
SYSTEMDEBUGGING ~ BOOLEAN(COMMON.[45:1]); 76840000
|
|
USEDROW[0] ~ TRUE; 76850000
|
|
EXECUTE ~ TRUE; 76860000
|
|
FIELDSIZE ~ 72; 76870000
|
|
WAITTIME ~ 18000; % 5 MINUTES 76880000
|
|
FINDUSERS; % LOCATE ATTACHED TELETYPES 76890000
|
|
IF DATACOMF THEN 76900000
|
|
BEGIN 76910000
|
|
IF NUMUSERS = 1 THEN PROGRAMFROMREMOTE ~ TRUE; 76920000
|
|
FOR USER ~ 0 STEP 1 UNTIL NUMUSERS-1 DO 76930000
|
|
BEGIN 76940000
|
|
WRITE(DCWRITE[*],FTTHELLO,VERSION); 76950000
|
|
IF OUTPUT THEN; 76960000
|
|
IF NOT PROGRAMFROMREMOTE THEN 76970000
|
|
BEGIN WRITE(DCWRITE[*],FFROMREMOTE,12); 76980000
|
|
IF OUTPUT THEN IF INPUT THEN 76990000
|
|
BEGIN 77000000
|
|
WHILE J~CHAR(DCREAD[*],SKIPCHAR(" ",DCREAD[*],0))!"Y" 77010000
|
|
AND J ! "N" DO 77020000
|
|
BEGIN WRITE(DCWRITE[*],FYESORNO); 77030000
|
|
IF OUTPUT THEN; 77040000
|
|
IF INPUT THEN; 77050000
|
|
END; 77060000
|
|
IF J = "Y" THEN 77070000
|
|
BEGIN PROGRAMFROMREMOTE ~ TRUE; 77080000
|
|
MAINUSER ~ USER; 77090000
|
|
END ELSE 77100000
|
|
BEGIN MV(3,CRLF,5,DCWRITE[*],0); 77110000
|
|
IF OUTPUT THEN; 77120000
|
|
END; 77130000
|
|
END; 77140000
|
|
END; 77150000
|
|
END; 77160000
|
|
USER ~ MAINUSER; 77170000
|
|
END; 77180000
|
|
IF NOT PROGRAMFROMREMOTE THEN 77190000
|
|
BEGIN READ(PROGRAM,10,BUFFER[*]); 77200000
|
|
BUFFERFULL ~ TRUE; 77210000
|
|
END; 77220000
|
|
WRITETIME(0,1); 77230000
|
|
LOADF ~ TRUE; 77240000
|
|
LOADER(PROGRAM); 77250000
|
|
LOADF ~ FALSE; 77260000
|
|
IF PUNCHF THEN CLOSE(PUNCH); 77270000
|
|
% 77280000
|
|
WRITE(PRINT,FERRS,DIGITS(ERRORS),ERRORS); 77290000
|
|
WRITETIME(0,2); 77300000
|
|
WRITETIME(0,0); 77310000
|
|
IF INFORM THEN 77320000
|
|
BEGIN WRITEST; 77330000
|
|
WRITEDATA; 77340000
|
|
END; 77350000
|
|
% 77360000
|
|
% 77370000
|
|
IF EXECUTE THEN 77380000
|
|
BEGIN WRITETIME(0,3); 77390000
|
|
WRITE(PRINT,FASTERISKS); 77400000
|
|
% 77410000
|
|
INTERPRETER; 77420000
|
|
% 77430000
|
|
MESSAGE0(22); 77440000
|
|
MESSAGETTI(14,INSTNO); 77450000
|
|
RESULT ~ FALSE; 77460000
|
|
WRITE(PRINT,FASTERISKS); 77470000
|
|
WRITETIME(0,5); 77480000
|
|
END; 77490000
|
|
GO TO ENDOFRUN; 77500000
|
|
% 77510000
|
|
% 77520000
|
|
END INITIALIZATION; 77530000
|
|
% 77540000
|
|
ABORTION: % FATAL SYSTEM ERROR. 77550000
|
|
MESSAGETT0(7); 77560000
|
|
RESULT ~ FALSE; 77570000
|
|
SYSTEMERROR ~ TRUE; 77580000
|
|
% 77590000
|
|
ENDTERPRET: 77600000
|
|
WRITE(PRINT,FASTERISKS); 77610000
|
|
WRITETIME(0,IF RESULT THEN 4 ELSE 5); 77620000
|
|
IF RESULT THEN MESSAGETTI(23,INSTNO); 77630000
|
|
ENDOFRUN: 77640000
|
|
BEGIN DEFINE DUMMY=#; 77650000
|
|
IF NOT RESULT THEN MESSAGETTI(10,INSTNO); 77660000
|
|
IF TRACEALL THEN INFORM ~ TRUE; 77670000
|
|
WRITETIME(0,0); 77680000
|
|
WRITE(PRINT,FRULES,RULES[0]); 77690000
|
|
IF DUMPALL THEN DMPST ~ DMPDATA ~ DMPSTR ~ TRUE; 77700000
|
|
IF SYSTEMERROR THEN 77710000
|
|
BEGIN WRITE(PRINT[DBL],FBL); 77720000
|
|
FOR I ~ 0,1,2,3 DO WRITE(PRINT[NO],FSENDCOPY); 77730000
|
|
INFORM ~ TRUE; 77740000
|
|
WRITE(PRINT[DBL],FBL); 77750000
|
|
END; 77760000
|
|
WRITE(PRINT,FGCS,DIGITS(GCS),GCS,DIGITS(GCTIMECP)+2,GCTIMECP, 77770000
|
|
DIGITS(GCTIMEIO)+2,GCTIMEIO); 77780000
|
|
IF INFORM OR DMPST THEN WRITESTACK(STACKSIZE); 77790000
|
|
IF INFORM OR DMPST THEN WRITEST; 77800000
|
|
IF INFORM OR DMPDATA THEN WRITEDATA; 77810000
|
|
IF INFORM OR DMPSTR OR (ERRDUMP AND NOT RESULT) 77820000
|
|
THEN STRINGDUMP(INSTNO); 77830000
|
|
END ENDOFRUN SEGMENT; 77840000
|
|
END ALGOL PROCEDURES; 77850000
|
|
END END END GLOBAL STREAM PROCEDURES; 77860000
|
|
%***********************************************************************77870000
|
|
END PROGRAM. 77880000
|
|
END;END. LAST CARD ON 0CRDING TAPE 99999999
|