mirror of
https://github.com/retro-software/B5500-software.git
synced 2026-03-04 02:04:53 +00:00
1. Commit library tape images, directories, and extracted text files. 2. Commit additional utilities under Unisys-Emode-Tools.
1183 lines
94 KiB
Plaintext
1183 lines
94 KiB
Plaintext
BEGIN SYMBOL PLEX; 00000100
|
|
% 00000200
|
|
% THIS A IS REMOTE TERMINAL PLOTTER PROGRAM. 00000300
|
|
% ------------------------------------------ 00000400
|
|
% 00000500
|
|
% 00000600
|
|
% IT ACCEPTS ALGOL-LIKE FUNCTION DEFINITIONS FROM A REMOTE 00000700
|
|
% TERMINAL AND COMPILES THEM INTO A SIMPLE INTERPRETER 00000800
|
|
% LANGUAGE. AFTER COMPILATION, A FUNCTION MAY THEN BE 00000900
|
|
% EVALUATED TO PRODUCE IT"S GRAPH ON THE REMOTE TERMINAL. 00001000
|
|
% COMPILATION TAKES PLACE WHILE THE FUNCTION IS TYPED IN 00001100
|
|
% (LINE BY LINE); IF A SYNTAX ERROR IS DETECTED, THE 00001200
|
|
% COMPILER ATTEMPTS TO RECOVER SO THAT COMPILATION CAN 00001300
|
|
% CONTINUE. THE SYNATX OF THE INTERPRETER LANGUAGE IS GIVEN 00001400
|
|
% IN BACKUS NORMAL FORM OR BNF, FOLLOWED BY AN OPTIONAL 00001500
|
|
% SEMANTIC DESCRIPTION. 00001600
|
|
% 00001700
|
|
% IT IS ASSUMED THAT THE PERSON ATTEMPTING TO USE THIS 00001800
|
|
% PROGRAM KNOWS ALGOL WELL ENOUGH TO HAVE WRITTEN TWO OR 00001900
|
|
% THREE PROGRAMS ALREADY, THERFORE THE DESCRIPTION IS FOR 00002000
|
|
% RELATING THE SYNTAX OF THE PROGRAM TO THE USER. A TOP-TO- 00002100
|
|
% BOTTOM APPROACH OF THE SYNTAX WAS CHOOSEN, SINCE THE 00002200
|
|
% INTERPRETER ITSELF IS WRITTEN TOP-TO-BOTTOM. 00002300
|
|
% 00002500
|
|
%PLOTTER COMMAND LANGUAGE. 00002600
|
|
% SYNTAX. 00002700
|
|
% <PLOTTER COMMAND LANGUAGE> ::= FUNCTION <FUNCTIONDEC> 00002800
|
|
% / LIST / PLOT <PLOTTER> / DELETE / STOP 00002900
|
|
% SEMANTICS. 00003000
|
|
% "FUNCTION" ALLOWS THE DECLARATION OF AN ALGOL-LIKE 00003100
|
|
% PROCEDURE DECLARATION, WHICH, WHEN PASSED PARAMETERS 00003200
|
|
% WILL RETURN VALUES TO BE PLOTTED. 00003300
|
|
% THE DESCRIPTION OF THE FUNCTION IS THEN TYPED IN 00003400
|
|
% LINE BY LINE. THE COMPILER WILL TYPE LINE NUMBERS 00003500
|
|
% AS COMPILATION PROCEDES. 00003600
|
|
% NOTE THAT FUNCTIONS MAY RECURSE, CALL EACH OTHER, 00003700
|
|
% ETC.... 00003800
|
|
% 00003900
|
|
% "LIST" WILL LIST ALL FUNCTIONS DECLARED. 00004000
|
|
% 00004100
|
|
% "PLOT" PLOTS THE GIVEN FUNCTION, WHICH MAY INVOLVE 00004200
|
|
% CALLS ON OTHER FUNCTIONS. SEE THE INFORMATION UNDER 00004300
|
|
% PLOTTER. 00004400
|
|
% 00004500
|
|
% "DELETE" DELETES THE FIRST PROCEDURE THAT THE "LIST" 00004600
|
|
% COMMAND LISTS. THUS IF TWO OR MORE FUNCTIONS ARE TO 00004700
|
|
% BE DELETED, "DELETE" WILL HAVE TO ENTERED SEVERAL 00004800
|
|
% TIMES. THE LIST IS STRUCTURED SO THAT THE MOST 00004900
|
|
% RECENT DECLARATION IS FIRST, WITH THE END OF THE 00005000
|
|
% LIST BEING THE FIRST FUNCTION ENTERED. 00005100
|
|
% "STOP" CAUSES THE PROGRAM TO GO TO END-OF-JOB. 00005300
|
|
% 00005400
|
|
% AFTER COMPLETING A COMMAND, EXCEPT THE "STOP" COMMAND, 00005500
|
|
% THE PROGRAM TYPES "GO AHEAD" TO SIGNIFY THAT IT IS 00005600
|
|
% READY FOR ANOTHER COMMAND. 00005700
|
|
% 00005800
|
|
% 00005900
|
|
%FUNCTION DECLARATION. 00006000
|
|
% SYNTAX. 00006100
|
|
% <FUNCTIONDEC> ::= <FUNCTION HEADING> <FUNCTION BODY> 00006200
|
|
% <FUNCTION HEADING> ::= <FUNCTION IDENTIFIER> 00006300
|
|
% <FORMAL PARAMTER PART> 00006400
|
|
% <FORMAL PARAMETER PART> ::= <EMPTY> / ( <FORMAL 00006500
|
|
% PARAMTER LIST> ) 00006600
|
|
% <FORMAL PARAMETER LIST> ::= <IDENTIFIER> / 00006700
|
|
% <FORMAL PARAMETER LIST> , <IDENTIFIER> 00006800
|
|
% <PROCEDURE BODY> ::= BEGIN <DECLARATIONS> 00006900
|
|
% <COMPOUNDTAIL> / <STATEMENT> 00007000
|
|
% SEMANTICS. 00007100
|
|
% THE FUNCTION DECLARATION ALLOWS A "REAL" FUNCTION 00007200
|
|
% TO BE DECLARED WITH OPTIONAL FORMAL PARAMETERS, WHICH 00007300
|
|
% ARE BY DEFAULT OF TYPE "REAL", FOLLOWED BY EITHER A 00007400
|
|
% BLOCK OR A STATEMENT. 00007500
|
|
% 00007600
|
|
%DECLARATIONS. 00007700
|
|
% SYNTAX. 00007800
|
|
% <DECLARATION> ::= <TYPE DECLARATION> / 00007900
|
|
% <DECLARATION> ; <TYPE DECLARATION> 00008000
|
|
% <TYPE DECLARATION> ::= <TYPE> <TYPE LIST> 00008100
|
|
% <TYPE> ::= LABEL / REAL / INTEGER / BOOLEAN 00008200
|
|
% <TYPE LIST> ::= <IDENTIFIER> / <TYPE LIST> , <IDENTIFIER> 00008300
|
|
% SEMANTICS. 00008400
|
|
% DECLARATIONS ALLOW LOCAL VARIABLES TO BE DECLARED FOR 00008500
|
|
% USE IN THE CURRENT FUNCTION DECLARATION. ONLY 00008600
|
|
% PREVIOUSLY DECLARED FUNCTIONS ARE ALLOWED AS 00008700
|
|
% GLOBAL QUANITIES. 00008800
|
|
% 00008900
|
|
%STATEMENT. 00009000
|
|
% SYNTAX. 00009100
|
|
% <STATEMENT> ::= LABEL : <STATEMENT> / 00009200
|
|
% <ASSIGNMENT STATEMENT> / GO TO LABEL / <EMPTY> / 00009300
|
|
% <CONDITIONAL STATEMENT> / <WHILE STATEMENT> / 00009400
|
|
% <DO STATEMENT> / RETURN <AEXP> / BEGIN 00009500
|
|
% <COMPOUNDTAIL> 00009600
|
|
% <COMPOUNDTAIL> ::= <STATEMENT> END / 00009700
|
|
% <STATEMENT> ; <COMPOUNDTAIL> 00009800
|
|
% SEMANTICS. 00009900
|
|
% THE BASIC CONSTITUENTS OF THE INTERPRETER 00010000
|
|
% LANGUAGE ARE STATEMENTS. THESE STATEMENTS ARE VERY 00010100
|
|
% SIMILAR TO ALGOL STATEMENTS. 00010200
|
|
% 00010300
|
|
%ASSIGNMENT STATEMENT. 00010400
|
|
% SYNTAX. 00010500
|
|
% <ASSIGNMENT STATEMENT> ::= <LEFT PART LIST> <AEXP> 00010600
|
|
% <LEFT PART LIST> ::= <VARIABLE> := / <VARIABLE> := 00010700
|
|
% <LEFT PART LIST> 00010800
|
|
% SEMANTICS. 00010900
|
|
% THE ASSIGNMENT STATEMENT CAUSES THE VAULE 00011000
|
|
% REPRESENTED BY THE ARITHMETIC EXPRESSION (AEXP) 00011100
|
|
% TO BE ASSIGNED TO THE VARIABLES APPEARING ON THE 00011200
|
|
% LEFT OF EACH ASSIGNMENT SYMBOL. 00011300
|
|
% 00011400
|
|
%CONDITIONAL STATEMENT. 00011500
|
|
% SYNTAX. 00011600
|
|
% <CONDITIONAL STATEMENT> ::= <IF CLAUSE> <STATEMENT> / 00011700
|
|
% <IF CLAUSE> <STATEMENT> ELSE <STATEMENT> 00011800
|
|
% <IF CLAUSE> ::= IF <BEXP> THEN <STATEMENT> 00011900
|
|
% SEMANTICS. 00012000
|
|
% CONDITIONAL STATEMENTS PROVIDE A MEANS WHEREBY THE 00012100
|
|
% THE EXECTUTION OF A STATEMENT, OR A SERIES OF 00012200
|
|
% STATEMENTS, IS DEPENDENT UPON THE LOGICAL VALUE 00012300
|
|
% PRODUCED BY A "BOOLEAN" EXPRESSION (BEXP). 00012400
|
|
% 00012500
|
|
%WHILE STATEMENT. 00012600
|
|
% SYNTAX. 00012700
|
|
% <WHILE STATEMENT> ::= WHILE <BEXP> DO <STATEMENT> 00012800
|
|
% SEMANTICS. 00012900
|
|
% THE "WHILE" STATEMENT PROVIDES A METHOD OF CONTROLLING 00013000
|
|
% AN ITERATIVE PROCESS IN WHICH EXIT FROM THE LOOP 00013100
|
|
% DEPENDS ON EXCEEDING A LIMIT. THE "BOOLEAN" EXPRESSION 00013200
|
|
% IS FIRST TESTED; THE FOLLOWING STATEMENT IS THEN 00013300
|
|
% EXECUTED AS LONG AS THE BOOLEAN EXPRESSION IS "TRUE". 00013400
|
|
% 00013500
|
|
%DO STATEMENT. 00013600
|
|
% SYNTAX. 00013700
|
|
% <DO STATEMENT> ::= DO <STATEMENT> UNTIL <BEXP> 00013800
|
|
% SEMANTICS. 00013900
|
|
% THE "DO" STATEMENT PROVIDES A METHOD OF CONTROLLING 00014000
|
|
% AN ITERATIVE PROCESS IN WHICH EXIT FROM THE LOOP 00014100
|
|
% DEPENDS ON REACHING A LIMIT. THE STATEMENT IS 00014200
|
|
% FIRST EXECUTED THEN THE TEST IS MADE, AND THE 00014300
|
|
% EXECUTION OF THE STATEMENT IS REPEATED AS LONG AS THE 00014400
|
|
% "BOOLEAN" EXPRESSION IS "FALSE". THIS IS VERY 00014500
|
|
% SIMILAR TO A FORTRAN "DO" LOOP. 00014600
|
|
% 00014700
|
|
%ARITHEMTIC EXPRESSIONS (AEXP) AND BOOLEAN EXPREXSIONS (BEXP). 00014800
|
|
% SEMANTICS. 00014900
|
|
% THESE EXPRESSIONS ARE IDENTICAL TO THEIR ALGOL 00015000
|
|
% COUNTERPARTS, WITH THE RESTRICTION THAT STRINGS 00015100
|
|
% AREN"T ALLOWED. CONSULT THE ALGOL MANUAL. 00015200
|
|
% 00015300
|
|
%STANDARD FUNCTIONS. 00015400
|
|
% THE STANDARD OR INTRINSIC FUNCTIONS ARE LISTED BELOW 00015500
|
|
% WITH APPROPRIATE DEFINITIONS. GIVEN THAT AE IS AN <AEXP>, THEN: 00015600
|
|
% 00015700
|
|
% ABS(AE) PRODUCES ABSOLUTE VALUE OF AE 00015800
|
|
% SIN(AE) PRODUCES SINE OF AE 00015900
|
|
% COS(AE) PRODUCES THE COSINE OF AE 00016000
|
|
% EXP(AE) PRODUCES THE EXPONENTIAL FUNCTION OF AE 00016100
|
|
% LN(AE) PRODUCES THE NATURAL LOGARITHM OF AE 00016300
|
|
% SQRT(AE) PRODUCES THE SQUARE ROOT OF AE 00016400
|
|
% 00016500
|
|
%TYPE TRANSFER FUNCTIONS. 00016600
|
|
% THE TYPE TRANSFER FUNCTIONS ARE LISTED BELOW: 00016700
|
|
% 00016800
|
|
% REAL. 00016900
|
|
% THE FUNCTION "REAL(BE)" YIELDS A VALUE OF TYPE 00017000
|
|
% "REAL" FROM A BOOLEAN EXPRESSION. THIS ALLOWS 00017100
|
|
% ARITHMETIC OPERATIONS TO BE CARRIED OUT ON 00017200
|
|
% BOOLEAN QUANITITES BUT DOES NOT ALTER THEIR 00017300
|
|
% INTERNAL SYSTEM REPRESENTATION. 00017400
|
|
% BOOLEAN. 00017500
|
|
% THE FUNCTION "BOOLEAN(AE)" YIELDS A VALUE OF TYPE 00017600
|
|
% "BOOLEAN" FROM AN ARITHMETIC EXPRESSION. THIS ALLOWS 00017700
|
|
% BOOLEAN OPERATIONS TO BE CARRIED OUT ON ARITHMETIC 00017800
|
|
% QUANTITES BUT DOES NOT ALTER THEIR INTERNAL SYSTEM 00017900
|
|
% REPRESENTATION. 00018000
|
|
% 00018100
|
|
% 00018101
|
|
% 00018102
|
|
% 00018103
|
|
%PLOTTER SECTION 00018200
|
|
% 00018300
|
|
% SEMANTICS. 00018400
|
|
% THE "PLOT" COMMAND IS FOLLOWED BY THE FUNCTION 00018500
|
|
% IDENTIFIER TO BE PLOTTED. IT MUST HAVE BEEN DECLARED 00018600
|
|
% WITH AT LEAST ONE PARAMETER WHICH WILL BE USED IN THE 00018700
|
|
% PLOTTING. IF THE FUNCTION HAS MORE THAN ONE PARAMETER THE 00018800
|
|
% PROGRAM WILL REQUEST THEIR VALUES. 00018900
|
|
% 00019300
|
|
% THE PROGRAM WILL THEN ASK FOR THE 00019400
|
|
% BEGINNING POSITION, INCREMENT, AND FINAL VALUE FOR THE 00019500
|
|
% RANGE OF THE PLOT. 00019600
|
|
% 00019700
|
|
% THE PLOT OF THE FUNCTION WILL BE TYPED ON THE 00019800
|
|
% TERMINAL AND THEN THE PROGRAM WILL RETURN 00019900
|
|
% TO COMMAND MODE. 00020000
|
|
% 00020100
|
|
% 00020200
|
|
% 00020300
|
|
% OUTLINE OF REMOTE PLOTTER PROGRAM 00020400
|
|
% ALL OF THE PROCEDURES USED AND THEIR FUNCTIONS ARE 00020500
|
|
% DESCRIBED BELOW 00020600
|
|
% 00020601
|
|
% THE GETNEXT AND ERROR PROCEDURES 00020700
|
|
% GETNEXT THE "GETNEXT" PROCEDURE 00020800
|
|
% ERROR THE "ERROR" PROCEDURE 00020900
|
|
% MISC. ROUTINES FOR ACCESSING CODE STRING 00021000
|
|
% PUT PLACES CHARACTER IN CODE STRING 00021100
|
|
% PUTADR PUTS ADDRESS IN CODE STRING 00021200
|
|
% GET GETS CHARACTER FROM CODE STRING 00021300
|
|
% GETADR GETS ADDRESS FROM CODE STRING 00021400
|
|
% EMIT EMITS ONE INSTRUCTION 00021500
|
|
% EMITADR EMITS ADDRESS OF INSTRUCTION 00021600
|
|
% EMITNUM EMITS NUMBERS 00021700
|
|
% EXPRESSION SCANNERS 00021800
|
|
% IFEXP HANDLES CONDITIONAL EXPRESSIONS 00021900
|
|
% VARIABLE COMPILES VARIABLES & ASSIGNMENTS 00022000
|
|
% PANA PARENTHESIS AND ARITHMETIC EXPRES 00022100
|
|
% PRIMARY COMPILES ARITHMETIC PRIMARIES 00022200
|
|
% FACTOR COMPILES ARITHMETIC FACTORS 00022300
|
|
% TERM COMPILES ARITHMETIC TERMS 00022400
|
|
% AEXP COMPILES ARITHMETIC EXPRESSIONS 00022500
|
|
% BOOPRIM COMPILES BOOLEAN PRIMARIES 00022600
|
|
% BOOSEC COMPILES BOOLEAN TERMS 00022700
|
|
% EXPRESS COMPILES BOTH ARITHMETIC AND 00022800
|
|
% BOOLEAN EXPRESSIONS 00022900
|
|
% BEXP COMPILES BOOLEAN EXPRESSIONS 00023000
|
|
% STATEMENT SCANNERS 00023100
|
|
% COMPOUNDTAIL TAIL END OF COMPOUND STATEMENT 00023200
|
|
% STMT SCANS SOME STATEMENT BEGINNERS 00023300
|
|
% RESETLABELS RESETS FORWARD LABEL REFERENCES 00023400
|
|
% WHEN "UNCOMPILING" (RECOVERING 00023500
|
|
% FROM ERRORS) 00023600
|
|
% STATEMENT COMPILES ALL STATEMENTS & HANDLES 00023700
|
|
% RECOVERY FROM ERRORS IN STATEMENTS 00023800
|
|
% DECLARATION SCANNERS 00023900
|
|
% ENTRY RUN TIME SYNTAX CLASS ASSIGNMENT 00024000
|
|
% ENTER APPLIES ENTRY TO LIST OF 00024100
|
|
% IDENTIFIERS 00024200
|
|
% DECLARATION HANDLES DECLARATIONS 00024300
|
|
% PURGE REMOVES ATOMIC SYMBOLS FROM 00024400
|
|
% OBJECT LIST WHEN LEAVING THE 00024500
|
|
% BLOCK AND CHECKS FOR MISSING 00024600
|
|
% LABELS 00024700
|
|
% DECLARE HANDLES SERIES OF DECLARATIONS 00024800
|
|
% AND PROVIDES FOR RECOVERY FROM 00024900
|
|
% SYNTAX ERRORS 00025000
|
|
% 00025001
|
|
% 00025002
|
|
% DUMPCODE TRANSFERS CODE FROM CODE STRING 00025100
|
|
% TO THE LISP "STACK" AT A POINT 00025200
|
|
% IMMEDIATELY FOLLOWING THE INFO 00025300
|
|
% WORD OF THE ATOMIC SYMBOL 00025400
|
|
% REPRESENTING THE FUNCTION 00025500
|
|
% PROCEDUREDEC HANDLES DECLARATIONS OF FUNCTIONS 00025600
|
|
% TO BE PLOTTED 00025700
|
|
% INTERPRETER SECTION 00025800
|
|
% MKADR REMOVES 2 CHARACTERS FROM CODE 00025900
|
|
% STRING TO BE USED AS AN ADDRESS 00026000
|
|
% INTERPRET INTERPRETS THE CODE STRING 00026100
|
|
% EXECUTE MAKES CALLS ON FUNCTIONS; USES 00026200
|
|
% INTERPRET 00026300
|
|
% PLOTTER PLOTS FUNCTION EXECUTED BY 00026400
|
|
% INTERPRETER 00026500
|
|
% REMOTE TERMINAL FILE DECLARATION 00026600
|
|
FILE REMOTE; 00026700
|
|
BOOLEAN 00026800
|
|
NEWLINE, % TELLS GETNEXT TO GET NEW LINE 00026900
|
|
% WHEN TRUE 00027000
|
|
COMPILING, % TELLS GETNEXT TO PRINT LINE 00027100
|
|
% NUMBERS 00027200
|
|
FORMTOG, % SET TO TRUE WHEN ASSIGNING 00027300
|
|
% CLASSES TO FORMAL PARAMETERS OF 00027400
|
|
% A FUNCTION 00027500
|
|
NOLABEL, % IS SET TO TRUE BY PURGE IF A 00027600
|
|
% DECLARED LABEL IS NOT USED 00027700
|
|
INTERPRETING; % TELLS GETNEXT THAT NEXT "SYMBOL" 00027800
|
|
% IS TO COME FROM PRECOMPILED 00027900
|
|
% CODE AND "CLASS" IS TO BE THE 00028000
|
|
% NEXT INSTRUCTION 00028100
|
|
REAL 00028200
|
|
CMAX, % IS THE NUMBER OF NON-INTEGER 00028300
|
|
% CONSTANTS OCCURING IN A FUNCTION 00028400
|
|
% DECLARATION 00028500
|
|
COUNT, % COUNTS NUMBER OF IDENTIFIERS 00028600
|
|
% ENTERED BY ENTRY 00028700
|
|
CLASS, % THE SYNTAX CLASS VARIABLE 00028800
|
|
DL, % TEMP VARIABLE USED AT END OF 00028900
|
|
% PROGRAM 00029000
|
|
FR, % USED LIKE B5500 "F" REGISTER 00029100
|
|
SAVEI, % SAVES LOCATION IN "STACK" OF 00029200
|
|
% POINT WHERE FUNCTION VALUE IS 00029300
|
|
% TO BE RETURNED 00029400
|
|
I, % INDEX TO "STACK" 00029500
|
|
WHL, % THE WHOLE INFORMATION WORD 00029600
|
|
% ASSOCIATED WITH EACH DECLARED 00029700
|
|
% IDENTIFIER - SET BY GETNEXT 00029800
|
|
ADDRESS; % ADDRESS OF DECLARED IDENTIFIER - 00029900
|
|
% SET BY GETNEXT 00030000
|
|
INTEGER 00030100
|
|
LINENO, % LINE NUMBER PRINTED BEFORE EACH 00030200
|
|
% LINE OF FUNCTION DECLARATION 00030300
|
|
L, % RELATIVE LOCATION OF CHARACTER 00030400
|
|
% IN CODE STRING 00030500
|
|
J; % TEMP VARIABLE 00030600
|
|
SYMBOL 00030700
|
|
BASE, % POINTER TO FIRST WORD FOLLOWING INFO WORD 00030800
|
|
% ASSOCIATED WITH A FUNCTION IDENTIFIER 00030900
|
|
% START OF FUNCTION CODE STRING 00031000
|
|
PLIST, % LIST OF IDENTIFIERS CREATED BY 00031200
|
|
% ENTRY 00031300
|
|
INF, % POINTER TO INFO WORD CREATED BY 00031400
|
|
% ENTRY 00031500
|
|
INFO; % POINTER TO INFO WORD - SET BY 00031600
|
|
% GETNEXT 00031700
|
|
ARRAY 00031800
|
|
STACK[0:99], % THE "STACK" USED BY THE 00031900
|
|
% INTERPRETER 00032000
|
|
CONSTANT, % TABLE OF NON-INTEGER CONSTANTS 00032100
|
|
% APPEARING IN FUNCTION DECLARATION 00032200
|
|
CONSTADR[0:127];% LINKS TO ADDRESS PART OF OF 00032400
|
|
% "RCN" INSTRUCTION 00032500
|
|
STRING ARRAY STR[0:99](8); % CODE STRING USED DURING COMPILATION 00032600
|
|
LABEL START, RESTART, EXIT; 00032800
|
|
DEFINE 00032900
|
|
BUMPL = L := L + 2#, 00033000
|
|
CLSS =[33:15]#, 00033100
|
|
ADRS = [18:15]#, 00033200
|
|
LINK = [3:15]#, 00033300
|
|
LINKF = NPAR#, 00033400
|
|
CLASSF = CDRF#, 00033500
|
|
NPARAM = LINK#, 00033600
|
|
ATYPE = 1#, 00033700
|
|
BTYPE = 2#; 00033800
|
|
STRING FIELD STRF [0:8]; 00033900
|
|
REAL FIELD CDRF [33:15], 00034000
|
|
ADDRESSF [18:15], 00034100
|
|
NPAR [3:15], 00034200
|
|
WH; 00034300
|
|
SYMBOL FORMAT % THE FOLLOWING ARE SYNTACTIC CLASS ASSIGNMENTS 00034400
|
|
* "RANDOM" * "ABS" * "SIN" * "COS" 00034600
|
|
* "EXP" * "LN" * "SQRT" * "MAX" 00034700
|
|
* "MIN" * REALPROCID * REALID * INTID 00034800
|
|
* BOOID * LABELID 00034900
|
|
= IDMAX * "IF" * "GO" * "WHILE" 00035000
|
|
* "DO" * "RETURN" * "BEGIN" 00035100
|
|
* "END" * "ELSE" * ";" * "UNTIL" 00035200
|
|
* "LABEL" * "REAL" * "INTEGER" * "BOOLEAN" 00035300
|
|
* "FALSE" * "TRUE" * FCONSTANT * RCONSTANT 00035400
|
|
* "FUNCTION" * "LIST" * "PLOT" * "DELETE" 00035500
|
|
* "STOP" = "QUIT" * "RESET" 00035600
|
|
* "TO" * "THEN" * "AND" * "OR" 00035700
|
|
* "NOT" * "=" = "EQL" * "NEQ" 00035800
|
|
* "LSS" * "LEQ" * "GEQ" * "GTR" 00035900
|
|
* "(" * ")" * "," * ":" 00036000
|
|
* "+" * "-" * "|" * "/" 00036100
|
|
* "*" * "." = """ = "&" 00036200
|
|
= "%" = "$" = "#" = "@" 00036300
|
|
= "[" = "]" = EOF = NUMERR 00036400
|
|
= CLASSMAX; 00036500
|
|
SYMBOL FORMAT * % INTERPRETER INSTRUCTIONS 00036600
|
|
1 = BOF % BRANCH ON FALSE 00036700
|
|
* BUN % BRANCH UNCONDITIONAL 00036800
|
|
* CHS % CHANGE SIGN 00036900
|
|
* ADOP % ADD 00037000
|
|
* SBOP % SUBTRACT 00037100
|
|
* MULOP % MULTIPLY 00037200
|
|
* DVDOP % DIVIDE 00037300
|
|
* FACTOP % RAISE TO POWER 00037400
|
|
* LNG % LOGICAL NEGATE 00037500
|
|
* OROP % LOGICAL OR 00037600
|
|
* ANDOP % LOGICAL AND 00037700
|
|
* EQLF % = 00037800
|
|
* NEQF % ! 00037900
|
|
* LSSF % < 00038000
|
|
* LEQF % { 00038100
|
|
* GEQF % } 00038200
|
|
* GTRF % > 00038300
|
|
* MKS % MARK THE STACK FOR RETURN 00038400
|
|
* SBR % CALL FUNCTION 00038500
|
|
* RTN % RETURN FROM FUNCTION 00038600
|
|
* ZRN % MAKE SPACE FOR VARIABLES IN STACK 00038700
|
|
* LITC % USE ADDRESS AS CONSTANT 00038800
|
|
* OPDC % "OPERAND CALL" 00038900
|
|
* STD % STORE DESTRUCTIVE 00039000
|
|
* ISD % INTEGER STORE DESTRUCTIVE 00039100
|
|
* SND % STORE NONDESTRUCTIVE 00039200
|
|
* ISN % INTEGER STORE NONDESTRUCTIVE 00039300
|
|
* BLN % BOOLEAN VALUE 00039400
|
|
* MAXF % FIND MAX OF TWO NUMBERS 00039500
|
|
* MINF % FIND MIN OF TWO NUMBERS 00039600
|
|
* RAND % RANDOM NUMBER 00039700
|
|
* ABSF % ABSOLUTE VALUE 00039800
|
|
* SINF % SINE FUNCTION 00039900
|
|
* COSF % COSINE FUNCTION 00040000
|
|
* EXPF % EXP FUNCTION 00040100
|
|
* LNF % NATURAL LOG FUNCTION 00040200
|
|
* SQRTF % SQUARE ROOT FUNCTION 00040300
|
|
* RCN ; % NON INTEGER NUMBER 00040400
|
|
% THE GETNEXT AND ERROR PROCEDURES 00040500
|
|
PROCEDURE GETNEXT; 00040600
|
|
BEGIN 00040700
|
|
LABEL LS; 00040800
|
|
IF INTERPRETING THEN 00040900
|
|
BEGIN 00041000
|
|
J := L DIV 8; 00041100
|
|
CLASS := REAL(STRF(ATSM(J,BASE))(L.[45:3],1)); 00041200
|
|
L := L + 1 00041300
|
|
END 00041400
|
|
ELSE 00041500
|
|
BEGIN 00041600
|
|
IF CLASS = EOF OR NEWLINE THEN 00041700
|
|
BEGIN 00041800
|
|
NEWLINE := FALSE; 00041900
|
|
IF COMPILING THEN 00042000
|
|
BEGIN 00042100
|
|
LS: TWXS2 := FILL(LINENO,3) & ":"; 00042200
|
|
TAB := 4; TERPRI; 00042300
|
|
LINENO := LINENO + 1 00042400
|
|
END; 00042500
|
|
READ TWX; 00042600
|
|
END; 00042700
|
|
CASE READCON(FALSE) OF 00042800
|
|
BEGIN 00042900
|
|
IF COMPILING THEN GO TO LS 00043000
|
|
ELSE CLASS := EOF; 00043100
|
|
CLASS := NUMERR; % ILLEGAL NUMBER 00043200
|
|
BEGIN % NUMBER 00043300
|
|
CLASS := RCONSTANT; 00043400
|
|
IF INREAL < 4096 THEN 00043500
|
|
IF INREAL = J := INREAL THEN 00043600
|
|
BEGIN 00043700
|
|
INREAL := J; 00043800
|
|
CLASS := FCONSTANT; 00043900
|
|
END; 00044000
|
|
END; 00044100
|
|
IF CLASS := CDRF(INSYM) { CLASSMAX 00044200
|
|
THEN INFO := NIL 00044300
|
|
ELSE 00044400
|
|
BEGIN 00044500
|
|
WHL := WH(INFO:=ATSM(CLASS)); 00044600
|
|
CLASS := WHL.CLSS; 00044700
|
|
ADDRESS := WHL.ADRS; 00044800
|
|
END; 00044900
|
|
CLASS := 0; 00045000
|
|
END OF CASE STATEMENT; 00045100
|
|
END 00045200
|
|
END OF GETNEXT; 00045300
|
|
00045350
|
|
PROCEDURE ERROR(X); VALUE X; REAL X; 00045400
|
|
BEGIN 00045500
|
|
IF COL < 68 THEN PRINT SPACE(COL + 3) #*#; 00045600
|
|
PRIN #ERROR: MISSING #; 00045700
|
|
CASE X - 1 OF 00045800
|
|
BEGIN 00045900
|
|
PRINT #OR ILLEGAL IDENTIFIER IN DECLARATION#; 00046000
|
|
PRINT #; OR END#; 00046100
|
|
PRINT #LEFT PARENTHESIS#; 00046200
|
|
PRINT #RIGHT PARENTHESIS#; 00046300
|
|
PRINT #OR ILLEGAL STATEMENT#; 00046400
|
|
PRINT #"UNTIL" IN DO STATEMENT#; 00046500
|
|
PRINT #OR ILLEGAL USE OF LABEL#; 00046600
|
|
PRINT #"THEN" IN CONDITIONAL EXPRESSION OR 00046700
|
|
STATEMENT#; 00046800
|
|
PRINT #"ELSE" IN CONDITIONAL EXPRESSION#; 00046900
|
|
PRINT #COLON FOLLOWING LABEL#; 00047000
|
|
PRINT #LABEL IN GO TO STATEMENT#; 00047100
|
|
PRINT #"DO" IN WHILE STATEMENT#; 00047200
|
|
PRINT #"=" FOLLOWING ":" IN ASSIGNMENT 00047300
|
|
STATEMENT#; 00047400
|
|
PRINT #,#; 00047500
|
|
PRINT #OR ILLEGAL BOOLEAN EXPRESSION#; 00047600
|
|
END 00047700
|
|
END OF ERR; 00047800
|
|
SYMBOL FORMAT *CLASS,GETNEXT,ERROR; 00047900
|
|
% MISC. ROUTINES FOR ACCESSING CODE STRING 00048000
|
|
% PUT PLACES CHARACTER IN CODE STRING 00048100
|
|
PROCEDURE PUT(T,A); VALUE T,A; REAL T,A; 00048200
|
|
STR[A DIV 8](A MOD 8,1) := STRING(T.[42:6],1); 00048300
|
|
% PUTADR PUTS ADDRESS IN CODE STRING 00048400
|
|
PROCEDURE PUTADR(T,A); VALUE T,A; REAL T,A; 00048500
|
|
BEGIN 00048600
|
|
PUT(T.[36:6],A); 00048700
|
|
PUT(T, A + 1) 00048800
|
|
END; 00048900
|
|
% GET GETS CHARACTER FROM CODE STRING 00049000
|
|
REAL PROCEDURE GET(A); VALUE A; REAL A; 00049100
|
|
GET := REAL(STR[A DIV 8](A.[45:3],1)); 00049200
|
|
% GETADR GETS ADDRESS FROM CODE STRING 00049300
|
|
REAL PROCEDURE GETADR(A); VALUE A; REAL A; 00049400
|
|
GETADR := GET(A) | 64 + GET(A + 1); 00049500
|
|
% EMIT EMITS ONE INSTRUCTION 00049600
|
|
PROCEDURE EMIT(X); VALUE X; REAL X; 00049700
|
|
BEGIN 00049800
|
|
PUT(X,L); 00049900
|
|
IF L } 798 THEN 00050000
|
|
BEGIN 00050100
|
|
PRINT #CODE OVERFLOW#; 00050200
|
|
LINENO := 0 00050300
|
|
END 00050400
|
|
ELSE 00050500
|
|
L := L + 1; 00050600
|
|
END; 00050700
|
|
% EMITADR EMITS ADDRESS OF INSTRUCTION 00050800
|
|
PROCEDURE EMITADR(A); VALUE A; REAL A; 00050900
|
|
BEGIN 00051000
|
|
EMIT(A.[36:6]); 00051100
|
|
EMIT(A) 00051200
|
|
END; 00051300
|
|
% EMITNUM EMITS NUMBERS 00051400
|
|
PROCEDURE EMITNUM(C); VALUE C; REAL C; 00051500
|
|
BEGIN 00051600
|
|
LABEL FOUND; 00051700
|
|
FOR J := 0 STEP 1 UNTIL CMAX DO 00051800
|
|
IF CONSTANT[J] = C THEN GO TO FOUND; 00051900
|
|
CONSTANT[J := CMAX := CMAX + 1] := C; 00052000
|
|
FOUND: EMIT(RCN); 00052100
|
|
EMITADR(CONSTADR[J]); 00052200
|
|
CONSTADR[J] := L - 2 00052300
|
|
END OF EMITNUM; 00052400
|
|
% FORWARD DECLARATIONS 00052500
|
|
SYMBOL FORMAT AEXP; FORWARD; 00052600
|
|
SYMBOL FORMAT BEXP; FORWARD; 00052700
|
|
REAL PROCEDURE EXPRESS; FORWARD; 00052800
|
|
BOOLEAN PROCEDURE STATEMENT; FORWARD; 00052900
|
|
PROCEDURE EXECUTE(CODE); VALUE CODE; SYMBOL CODE; FORWARD; 00053000
|
|
% EXPRESSION SCANNERS 00053100
|
|
% IFEXP HANDLES CONDITIONAL EXPRESSIONS 00053200
|
|
SYMBOL FORMAT IFEXP(X); SYMBOL FORMAT X; 00053300
|
|
BEGIN 00053400
|
|
REAL T, F; 00053500
|
|
[*BEXP, "THEN":8; EMIT(BOF); F := BUMPL; *X, "ELSE":9; 00053600
|
|
EMIT(BUN); PUTADR(T := BUMPL,F-2); 00053700
|
|
*X, PUTADR(L,T - 2);] 00053800
|
|
END OF IFEXP; 00053900
|
|
% VARIABLE COMPILES VARIABLES & ASSIGNMENTS 00054000
|
|
SYMBOL FORMAT VARIABLE(TYPE,ADDRESS,FROM); 00054100
|
|
VALUE TYPE,ADDRESS,FROM; 00054200
|
|
REAL TYPE, ADDRESS, FROM; 00054300
|
|
[[":", "=":13; [*TYPE = BOOID, *BEXP ELSE *AEXP], 00054400
|
|
EMIT(REAL(TYPE = INTID) + FROM + STD) ELSE 00054500
|
|
*FROM = 2, EMIT(OPDC);], 00054600
|
|
EMITADR(ADDRESS);]; 00054700
|
|
% PANA PARENTHESIS AND ARITHMETIC EXPRES 00054800
|
|
SYMBOL FORMAT PANA ; ["(":3; *AEXP, ")":4]; 00054900
|
|
% PRIMARY COMPILES ARITHMETIC PRIMARIES 00055000
|
|
SYMBOL FORMAT PRIMARY; 00055100
|
|
BEGIN 00055200
|
|
REAL T, N; 00055300
|
|
[REALID * INTID: T := CLASS; J := ADDRESS; 00055400
|
|
*VARIABLE(T,J,2) ELSE 00055500
|
|
REALPROCID: EMIT(MKS); N := (T := WHL).NPARAM; 00055600
|
|
[*N = 0 ELSE 00055700
|
|
"(":3; *AEXP, 00055800
|
|
[*N := N - 1 ! 0, ",":14; *AEXP, 00055900
|
|
RETURN ELSE 00056000
|
|
")":4]], 00056100
|
|
EMIT(SBR); EMITADR(T.[18:9]); EMIT(T.[27:6]) 00056200
|
|
ELSE 00056300
|
|
FCONSTANT: EMIT(LITC); EMITADR(INREAL) ELSE 00056400
|
|
RCONSTANT: EMITNUM(INREAL) ELSE 00056500
|
|
"ABS" * "SQRT": T := CLASS - (="ABS"); *PANA, 00056600
|
|
EMIT(ABSF + T) ELSE 00056700
|
|
"MAX" * "MIN": T := CLASS - (="MAX"); 00056800
|
|
"(":3; *AEXP, ",":14; *AEXP, ")":4; 00056900
|
|
EMIT(MAXF + T) ELSE 00057000
|
|
"REAL", "(":3; *BEXP, ")":4 ELSE 00057100
|
|
"RANDOM", EMIT(RAND) ELSE 00057200
|
|
*PANA] 00057300
|
|
END OF PRIMARY; 00057400
|
|
% FACTOR COMPILES ARITHMETIC FACTORS 00057500
|
|
SYMBOL FORMAT FACTOR; 00057600
|
|
[*PRIMARY, ["*", *PRIMARY, EMIT(FACTOP); RETURN 00057700
|
|
ELSE NIL]]; 00057800
|
|
% TERM COMPILES ARITHMETIC TERMS 00057900
|
|
SYMBOL FORMAT TERM; 00058000
|
|
BEGIN 00058100
|
|
REAL T; 00058200
|
|
[*FACTOR,["|" * "/": T := CLASS - (="|"); *FACTOR, 00058300
|
|
EMIT(MULOP + T); RETURN ELSE NIL]] 00058400
|
|
END OF TERM; 00058500
|
|
% AEXP COMPILES ARITHMETIC EXPRESSIONS 00058600
|
|
SYMBOL FORMAT AEXP; 00058700
|
|
BEGIN 00058800
|
|
REAL T; 00058900
|
|
["IF", *IFEXP(AEXP) ELSE 00059000
|
|
["+" * "-": T := CLASS ELSE NIL], 00059100
|
|
*TERM, IF T = (="-") THEN EMIT(CHS); 00059200
|
|
["+" * "-": T := CLASS - (="+"); 00059300
|
|
*TERM, 00059400
|
|
EMIT(ADOP + T); RETURN ELSE 00059500
|
|
NIL]] 00059600
|
|
END OF AEXP; 00059700
|
|
% BOOPRIM COMPILES BOOLEAN PRIMARIES 00059800
|
|
REAL PROCEDURE BOOPRIM; 00059900
|
|
BEGIN 00060000
|
|
REAL T; 00060100
|
|
BOOLEAN NOTFLAG; 00060200
|
|
LABEL LF, EXIT; 00060300
|
|
[["NOT", NOTFLAG := TRUE ELSE NIL], 00060400
|
|
[[BOOID: T := ADDRESS; *VARIABLE(BOOID,T,2) ELSE 00060500
|
|
"FALSE" * "TRUE": EMIT(BLN); 00060600
|
|
EMIT(CLASS - (="FALSE")) ELSE 00060700
|
|
"BOOLEAN", *PANA], T := BTYPE ELSE 00060800
|
|
"(", T := EXPRESS; ")":4 ELSE 00060900
|
|
*AEXP, T := ATYPE;], 00061000
|
|
[*T = ATYPE, 00061100
|
|
["EQL" * "GTR": T := CLASS-(="EQL"); 00061200
|
|
*AEXP, EMIT(EQLF+T); 00061300
|
|
T := BTYPE ELSE 00061400
|
|
NIL] ELSE 00061500
|
|
NIL], 00061600
|
|
[*T = BTYPE, 00061700
|
|
[*NOTFLAG, EMIT(LNG) ELSE NIL] ELSE 00061800
|
|
*T = ATYPE AND NOT NOTFLAG]]: LF; 00061900
|
|
RETURN T; 00062000
|
|
LF: BOOPRIM := 0 00062100
|
|
END OF BOOPRIM; 00062200
|
|
% BOOSEC COMPILES BOOLEAN TERMS 00062300
|
|
REAL PROCEDURE BOOSEC; 00062400
|
|
BEGIN 00062500
|
|
REAL T; 00062600
|
|
LABEL LF; 00062700
|
|
[*T := BOOPRIM = BTYPE, 00062800
|
|
["AND", *BOOPRIM = BTYPE, EMIT(ANDOP); RETURN 00062900
|
|
ELSE NIL] ELSE 00063000
|
|
*T = ATYPE] : LF; 00063100
|
|
RETURN T; 00063200
|
|
LF: BOOSEC := 0 00063300
|
|
END OF BOOSEC; 00063400
|
|
% EXPRESS COMPILES BOTH ARITHMETIC AND 00063500
|
|
% BOOLEAN EXPRESSIONS 00063600
|
|
REAL PROCEDURE EXPRESS; 00063700
|
|
BEGIN 00063800
|
|
REAL T, R, S; 00063900
|
|
LABEL LF, EXIT; 00064000
|
|
["IF",*BEXP, "THEN":8; EMIT(BOF); R := BUMPL; 00064100
|
|
T := EXPRESS; "ELSE":9; EMIT(BUN); 00064200
|
|
PUTADR(S := BUMPL, R - 2); 00064300
|
|
[*T = ATYPE, *AEXP ELSE *T = BTYPE, *BEXP], 00064400
|
|
PUTADR(L,S-2) ELSE 00064500
|
|
*T := BOOSEC = BTYPE, ["OR", *BOOSEC = BTYPE, 00064600
|
|
EMIT(OROP); RETURN ELSE NIL] ELSE 00064700
|
|
*T = ATYPE] : LF; 00064800
|
|
RETURN T; 00064900
|
|
LF: EXPRESS := 0; 00065000
|
|
END OF EXPRESS; 00065100
|
|
% BEXP COMPILES BOOLEAN EXPRESSIONS 00065200
|
|
SYMBOL FORMAT BEXP; 00065300
|
|
["IF", *IFEXP(BEXP) ELSE *EXPRESS = BTYPE ELSE 00065400
|
|
ERROR(15); *FALSE]; 00065500
|
|
% STATEMENT SCANNERS 00065600
|
|
% COMPOUNDTAIL TAIL END OF COMPOUND STATEMENT 00065700
|
|
SYMBOL FORMAT COMPOUNDTAIL; 00065800
|
|
[*STATEMENT, [";", RETURN START ELSE "END":2]]; 00065900
|
|
% STMT SCANS SOME STATEMENT BEGINNERS 00066000
|
|
SYMBOL FORMAT STMT; 00066100
|
|
BEGIN 00066200
|
|
REAL T,A; 00066300
|
|
[SWITCH 00066400
|
|
REALID * INTID * BOOID: T := CLASS; A := ADDRESS; 00066500
|
|
*VARIABLE(T,A,0) ELSE 00066600
|
|
LABELID: T := WHL; WHL.ADRS := L; 00066700
|
|
WH(INFO) := ABS(WHL); *T < 0, 00066800
|
|
":":10; RETURN ELSE 00066900
|
|
"IF", *BEXP, "THEN":8; EMIT(BOF); A := BUMPL; 00067000
|
|
*STATEMENT, 00067100
|
|
["ELSE", EMIT(BUN); T := BUMPL; 00067200
|
|
PUTADR(L,A-2); 00067300
|
|
*STATEMENT, PUTADR(L,T-2) ELSE 00067400
|
|
PUTADR(L,A-2);] ELSE 00067500
|
|
"GO", ["TO" ELSE NIL], LABELID:11; EMIT(BUN); 00067600
|
|
EMITADR(WHL.LINK); LINKF(INFO) := L - 2 ELSE 00067700
|
|
"WHILE", A := L; *BEXP, "DO":12; EMIT(BOF); T := BUMPL; 00067800
|
|
*STATEMENT, EMIT(BUN); EMITADR(A); 00067900
|
|
PUTADR(L,T - 2) ELSE 00068000
|
|
"DO", T := L; *STATEMENT, "UNTIL":6; *BEXP, 00068100
|
|
EMIT(BOF); EMITADR(T) ELSE 00068200
|
|
"RETURN", *AEXP, EMIT(RTN) ELSE 00068300
|
|
"BEGIN", *COMPOUNDTAIL] 00068400
|
|
END OF STMT; 00068500
|
|
% RESETLABELS RESETS FORWARD LABEL REFERENCES 00068600
|
|
% WHEN "UNCOMPILING" (RECOVERING 00068700
|
|
% FROM ERRORS) 00068800
|
|
PROCEDURE RESETLABELS; 00068900
|
|
BEGIN 00069000
|
|
REAL T, A; 00069100
|
|
SYMBOL S; 00069200
|
|
NEWLINE := TRUE; 00069300
|
|
GETNEXT; 00069400
|
|
FOR S IN PLIST DO 00069500
|
|
IF (T := WH(CDR S)).CLSS = LABELID THEN 00069600
|
|
BEGIN 00069700
|
|
A := T.LINK; 00069800
|
|
WHILE A ! 4095 AND A > L DO A := GETADR(A); 00069900
|
|
T.LINK := A; 00070000
|
|
IF T > 0 THEN 00070100
|
|
IF T.ADRS > L THEN 00070200
|
|
BEGIN 00070300
|
|
T := - T; 00070400
|
|
T.ADRS := 0; 00070500
|
|
END; 00070600
|
|
WH(CDR S) := T; 00070700
|
|
END; 00070800
|
|
FOR J := 0 STEP 1 UNTIL CMAX DO 00070900
|
|
BEGIN 00071000
|
|
A := CONSTADR[J]; 00071100
|
|
WHILE A ! 0 AND A } L DO A := GETADR(A); 00071200
|
|
CONSTADR[J] := A 00071300
|
|
END; 00071400
|
|
END OF RESETLABELS; 00071500
|
|
% STATEMENT COMPILES ALL STATEMENTS & HANDLES 00071600
|
|
% RECOVERY FROM ERRORS IN STATEMENTS 00071700
|
|
BOOLEAN PROCEDURE STATEMENT; 00071800
|
|
BEGIN 00071900
|
|
LABEL RECOV, START; 00072000
|
|
REAL LNR, LO; 00072100
|
|
LNR := LINENO - 1; 00072200
|
|
LO := L; 00072300
|
|
START: [*STMT ELSE 00072400
|
|
*CLASS } (="END") AND CLASS { (="UNTIL") ELSE 00072500
|
|
"RESET":5; LINENO := INTEGER(READN(TWX)); 00072600
|
|
GO TO RECOV;] : RECOV; 00072700
|
|
RETURN TRUE; 00072800
|
|
RECOV:IF LINENO } LNR THEN 00072900
|
|
BEGIN 00073000
|
|
L := LO; 00073100
|
|
PRINT #RETYPE STARTING AT LINE # LINENO := LNR; 00073200
|
|
RESETLABELS; 00073300
|
|
GO TO START 00073400
|
|
END; 00073500
|
|
STATEMENT := BOOLEAN(2); 00073600
|
|
END OF STATEMENT; 00073700
|
|
% DECLARATION SCANNERS 00073800
|
|
% ENTRY RUN TIME SYNTAX CLASS ASSIGNMENT 00073900
|
|
BOOLEAN PROCEDURE ENTRY(TYPE); VALUE TYPE; REAL TYPE; 00074000
|
|
BEGIN 00074100
|
|
IF CLASS > 0 THEN 00074200
|
|
BEGIN 00074300
|
|
ERROR(1); 00074400
|
|
RETURN FALSE 00074500
|
|
END; 00074600
|
|
PLIST := (INSYM := MKATOM) . PLIST; 00074700
|
|
CDR(INSYM) := INF := CONS[CLASSF: TYPE, 00074800
|
|
ADDRESSF: IF TYPE = LABELID OR FORMTOG THEN 0 00074900
|
|
ELSE 00075000
|
|
IF TYPE = REALPROCID THEN 00075100
|
|
NEXTAVL(SYMBOL) + 2 ELSE 00075200
|
|
COUNT := COUNT + 1]; 00075300
|
|
IF TYPE = LABELID THEN 00075400
|
|
BEGIN 00075500
|
|
WH(INF) := -WH(INF); 00075600
|
|
LINKF(INF) := 4095; 00075700
|
|
END 00075800
|
|
ELSE 00075900
|
|
IF FORMTOG THEN COUNT := COUNT + 1; 00076000
|
|
GETNEXT; 00076100
|
|
ENTRY := TRUE; 00076200
|
|
END OF ENTRY; 00076300
|
|
% ENTER APPLIES ENTRY TO LIST OF 00076400
|
|
% IDENTIFIERS 00076500
|
|
SYMBOL FORMAT ENTER(X); VALUE X; REAL X; 00076600
|
|
[*ENTRY(X), [",", RETURN START ELSE NIL]]; 00076700
|
|
% DECLARATION HANDLES DECLARATIONS 00076800
|
|
SYMBOL FORMAT DECLARATION; 00076900
|
|
[SWITCH 00077000
|
|
"LABEL", *ENTER(LABELID) ELSE 00077100
|
|
"REAL", *ENTER(REALID) ELSE 00077200
|
|
"INTEGER", *ENTER(INTID) ELSE 00077300
|
|
"BOOLEAN", *ENTER(BOOID) ]; 00077400
|
|
% PURGE REMOVES ATOMIC SYMBOLS FROM 00077500
|
|
% OBJECT LIST WHEN LEAVING THE 00077600
|
|
% BLOCK AND CHECKS FOR MISSING 00077700
|
|
% LABELS 00077800
|
|
PROCEDURE PURGE(L); VALUE L; SYMBOL L; 00077900
|
|
BEGIN 00078000
|
|
SYMBOL R; 00078100
|
|
REAL T,A; 00078200
|
|
COUNT := 0; 00078300
|
|
NOLABEL := FALSE; 00078400
|
|
FOR R IN L DO 00078500
|
|
BEGIN 00078600
|
|
IF (T := WH(CDR R)).CLSS = LABELID THEN 00078700
|
|
IF T < 0 THEN NOLABEL := TRUE 00078800
|
|
ELSE 00078900
|
|
BEGIN 00079000
|
|
A := T.LINK; 00079100
|
|
T := T.ADRS; 00079200
|
|
WHILE A ! 4095 DO 00079300
|
|
BEGIN 00079400
|
|
J := GETADR(A); 00079500
|
|
PUTADR(T,A); 00079600
|
|
A := J 00079700
|
|
END; 00079800
|
|
END; 00079900
|
|
IF SMTA(R) > 64 THEN 00080000
|
|
REMOB(R) 00080100
|
|
ELSE CDR R := NIL; 00080200
|
|
COUNT := COUNT + 1 00080300
|
|
END; 00080400
|
|
END OF PURGE; 00080500
|
|
% DECLARE HANDLES SERIES OF DECLARATIONS 00080600
|
|
% AND PROVIDES FOR RECOVERY FROM 00080700
|
|
% SYNTAX ERRORS 00080800
|
|
BOOLEAN PROCEDURE DECLARE; 00080900
|
|
BEGIN 00081000
|
|
LABEL START,RECOV; 00081100
|
|
REAL T, LNR, CO; 00081200
|
|
SYMBOL PLISTO; 00081300
|
|
START: CO := COUNT; 00081400
|
|
T := NEXTAVL(SYMBOL); 00081500
|
|
PLIST := NIL; 00081600
|
|
LNR := LINENO; 00081700
|
|
[*DECLARATION, ";", 00081800
|
|
PLISTO := NCONC(PLIST,PLISTO); GO TO START ELSE 00081900
|
|
"RESET": LINENO := INTEGER(READN(TWX)); 00082000
|
|
GO TO RECOV ELSE 00082100
|
|
NIL] : RECOV; 00082200
|
|
PLIST := PLISTO; 00082300
|
|
RETURN TRUE; 00082400
|
|
RECOV:PURGE(PLIST); NEXTAVL(SYMBOL) := T; 00082500
|
|
IF LINENO } LNR THEN 00082600
|
|
BEGIN 00082700
|
|
COUNT := CO; 00082800
|
|
PRINT #RETYPE STARTING AT LINE # LINENO := LNR; 00082900
|
|
GO TO START 00083000
|
|
END; 00083100
|
|
DECLARE := BOOLEAN(2); 00083200
|
|
PLIST := PLISTO; 00083300
|
|
END OF DECLARE; 00083400
|
|
% DUMPCODE TRANSFERS CODE FROM CODE STRING 00083500
|
|
% TO THE LISP "STACK" AT A POINT 00083600
|
|
% WORD OF THE ATOMIC SYMBOL 00083700
|
|
% REPRESENTING THE FUNCTION 00083800
|
|
PROCEDURE DUMPCODE; 00083900
|
|
BEGIN 00084000
|
|
INTEGER LMAX; 00084100
|
|
REAL T; 00084200
|
|
LMAX := (L + 7) DIV 8; 00084300
|
|
FOR J := 0 STEP 1 UNTIL CMAX DO 00084400
|
|
WHILE T := CONSTADR[J] ! 0 DO 00084500
|
|
BEGIN 00084600
|
|
CONSTADR[J] := GETADR(T); 00084700
|
|
PUTADR(J + LMAX, T); 00084800
|
|
END; 00084900
|
|
FOR J := 0 STEP 1 UNTIL LMAX - 1 DO 00085000
|
|
STRF(CONS) := STR[J]; 00085100
|
|
FOR J := 0 STEP 1 UNTIL CMAX DO 00085200
|
|
WH(CONS) := CONSTANT[J]; 00085300
|
|
END OF DUMPCODE; 00085400
|
|
% PROCEDUREDEC HANDLES DECLARATIONS OF FUNCTIONS 00085500
|
|
% TO BE PLOTTED 00085600
|
|
PROCEDURE PROCEDUREDEC; 00085700
|
|
BEGIN 00085800
|
|
REAL R, T, P, FA, LNR; 00085900
|
|
LABEL START, NOGO, RECOV, EXIT; 00086000
|
|
SYMBOL PLISTO, FN, S, PINFO, PARAM; 00086100
|
|
LINENO := 1; 00086200
|
|
CMAX := -1; 00086300
|
|
PLISTO := PLIST; 00086400
|
|
R := NEXTAVL(SYMBOL); 00086500
|
|
PLIST := NIL; 00086600
|
|
[*ENTRY(REALPROCID), FN := PLIST; PLIST := NIL; 00086700
|
|
CTR FN := ATSM(R); 00086800
|
|
PINFO := INF; P := NEXTAVL(SYMBOL); 00086900
|
|
COUNT := 0; FORMTOG := TRUE; 00087000
|
|
["(", *ENTER(REALID), ")":4; FA := 2048; 00087100
|
|
FOR S IN PLIST DO 00087200
|
|
ADDRESSF(CDR S) := FA := FA + 1 ELSE 00087300
|
|
NIL]]:NOGO; 00087400
|
|
NPAR(PINFO) := COUNT; 00087500
|
|
PARAM := PLIST; 00087600
|
|
PLIST := NIL; 00087700
|
|
T := NEXTAVL(SYMBOL); 00087800
|
|
FORMTOG := FALSE; 00087900
|
|
INPUT(TWXF1,TWXS1,136,/FALSE); 00088000
|
|
COMPILING := TRUE; 00088100
|
|
GETNEXT; 00088200
|
|
LNR := LINENO - 1; 00088300
|
|
START:COUNT := L := 0; 00088400
|
|
["BEGIN", *DECLARE, 00088500
|
|
IF COUNT ! 0 THEN 00088600
|
|
BEGIN 00088700
|
|
EMIT(ZRN); EMIT(COUNT) 00088800
|
|
END; 00088900
|
|
*COMPOUNDTAIL ELSE 00089000
|
|
*STATEMENT] : RECOV; 00089100
|
|
EMIT(BLN); EMIT(0); EMIT(RTN); 00089200
|
|
PURGE(PLIST); 00089300
|
|
IF NOLABEL THEN 00089400
|
|
BEGIN 00089500
|
|
PRINT #DECLARED LABELS DID NOT OCCUR#; 00089600
|
|
GO TO NOGO 00089700
|
|
END; 00089800
|
|
PURGE(PARAM); 00089900
|
|
NEXTAVL(SYMBOL) := P; 00090000
|
|
DUMPCODE; 00090100
|
|
PLISTO := NCONC(FN, PLISTO); 00090200
|
|
GO EXIT; 00090300
|
|
RECOV:IF LINENO } LNR THEN 00090400
|
|
BEGIN 00090500
|
|
PURGE(PLIST); 00090600
|
|
NEXTAVL(SYMBOL) := T; 00090700
|
|
PRINT #RETYPE STARTING AT LINE # LINENO := LNR; 00090800
|
|
NEWLINE := TRUE; 00090900
|
|
GETNEXT; 00091000
|
|
GO TO START 00091100
|
|
END; 00091200
|
|
NOGO: PURGE(PARAM); 00091300
|
|
PURGE(PLIST); 00091400
|
|
FORMTOG := FALSE; 00091500
|
|
PURGE(FN); 00091600
|
|
NEXTAVL(SYMBOL) := R; 00091700
|
|
EXIT: COMPILING := FALSE; PLIST := PLISTO; 00091800
|
|
INPUT(TWXF1,TWXS1,136,/TRUE); 00091900
|
|
END OF PROCEDUREDEC; 00092000
|
|
% INTERPRETER SECTION 00092100
|
|
% MKADR REMOVES 2 CHARACTERS FROM CODE 00092200
|
|
% STRING TO BE USED AS AN ADDRESS 00092300
|
|
INTEGER PROCEDURE MKADR(A); VALUE A; BOOLEAN A; 00092400
|
|
BEGIN 00092500
|
|
REAL T; 00092600
|
|
T := CLASS; 00092700
|
|
GETNEXT; 00092800
|
|
T := T | 64 + CLASS; 00092900
|
|
GETNEXT; 00093000
|
|
MKADR := IF A THEN 00093100
|
|
IF T > 2048 THEN FR + 2048 - T 00093200
|
|
ELSE FR + T 00093300
|
|
ELSE T; 00093400
|
|
END OF MKADR; 00093500
|
|
% INTERPRET INTERPRETS THE CODE STRING 00093600
|
|
SYMBOL FORMAT INTERPRET; 00093700
|
|
BEGIN 00093800
|
|
DEFINE 00093900
|
|
SA = STACK[I := I - 1]#, 00094000
|
|
SB = STACK[I]#, 00094100
|
|
SC = STACK[I + 1]#, 00094200
|
|
SD = STACK[I := I + 1]#; 00094300
|
|
ALPHA W; 00094400
|
|
REAL T; 00094500
|
|
[SWITCH 00094600
|
|
BOF, I := I - 1; 00094700
|
|
IF BOOLEAN(SC) THEN 00094800
|
|
BEGIN 00094900
|
|
L := L + 1; 00095000
|
|
GETNEXT 00095100
|
|
END 00095200
|
|
ELSE 00095300
|
|
BEGIN 00095400
|
|
L := MKADR(FALSE); 00095500
|
|
GETNEXT 00095600
|
|
END ELSE 00095700
|
|
BUN, L := MKADR(FALSE); GETNEXT ELSE 00095800
|
|
CHS, SB := - SB ELSE 00095900
|
|
ADOP, SA := SB + SC ELSE 00096000
|
|
SBOP, SA := SB - SC ELSE 00096100
|
|
MULOP, SA := SB | SC ELSE 00096200
|
|
DVDOP, SA := SB / SC ELSE 00096300
|
|
FACTOP, SA := SB * SC ELSE 00096400
|
|
LNG, SB := REAL(NOT BOOLEAN(SB)) ELSE 00096500
|
|
OROP, SA := REAL(BOOLEAN(SB) OR BOOLEAN(SC))ELSE 00096600
|
|
ANDOP, SA := REAL(BOOLEAN(SB) AND BOOLEAN(SC)) 00096700
|
|
ELSE 00096800
|
|
EQLF, SA := REAL(SB = SC) ELSE 00096900
|
|
NEQF, SA := REAL(SB ! SC) ELSE 00097000
|
|
LSSF, SA := REAL(SB < SC) ELSE 00097100
|
|
LEQF, SA := REAL(SB { SC) ELSE 00097200
|
|
GEQF, SA := REAL(SB } SC) ELSE 00097300
|
|
GTRF, SA := REAL(SB > SC) ELSE 00097400
|
|
MKS, SD := SAVEI; SAVEI := I ELSE 00097500
|
|
SBR, SD := FR; FR := I; 00097600
|
|
EXECUTE(ATSM(MKADR(FALSE)|64 + CLASS)); 00097700
|
|
GETNEXT ELSE 00097800
|
|
RTN, T := SB; FR := STACK[FR]; 00097900
|
|
SAVEI := STACK[I := SAVEI]; SB := T; 00098000
|
|
*FALSE ELSE 00098100
|
|
ZRN, FOR CLASS DO SD := 0; GETNEXT ELSE 00098200
|
|
LITC, SD := MKADR(FALSE) ELSE 00098300
|
|
OPDC, SD := STACK[MKADR(TRUE)] ELSE 00098400
|
|
STD * ISD * SND * ISN: 00098500
|
|
IF BOOLEAN(T := CLASS - STD) THEN 00098600
|
|
SB := INTEGER(SB); 00098700
|
|
NIL, STACK[MKADR(TRUE)] := SB; 00098800
|
|
IF T < 2 THEN I := I - 1; ELSE 00098900
|
|
BLN, SD := CLASS; GETNEXT ELSE 00099000
|
|
MAXF, SA := MAX(SB,SC) ELSE 00099100
|
|
MINF, SA := MIN(SB,SC) ELSE 00099200
|
|
RAND, SD := CONVAL(0) ELSE 00099300
|
|
ABSF, SB := ABS(SB) ELSE 00099400
|
|
SINF, SB := SIN(SB) ELSE 00099500
|
|
COSF, SB := COS(SB) ELSE 00099600
|
|
EXPF, SB := EXP(SB) ELSE 00099700
|
|
LNF, SB := LN(SB) ELSE 00099800
|
|
SQRTF, SB := SQRT(SB) ELSE 00099900
|
|
RCN, SD := WH(ATSM(MKADR(FALSE),BASE));] 00100000
|
|
END OF INTERPRET; 00100100
|
|
% EXECUTE MAKES CALLS ON FUNCTIONS; USES 00100200
|
|
% INTERPRET 00100300
|
|
PROCEDURE EXECUTE(CODE); VALUE CODE; SYMBOL CODE; 00100400
|
|
BEGIN 00100500
|
|
SYMBOL OLDCODE; 00100600
|
|
REAL OLDL; 00100700
|
|
OLDCODE := BASE; 00100800
|
|
BASE := CODE; 00100900
|
|
OLDL := L; 00101000
|
|
L := 0; 00101100
|
|
GETNEXT; 00101200
|
|
WHILE INTERPRET DO; 00101300
|
|
BASE := OLDCODE; 00101400
|
|
L := OLDL; 00101500
|
|
END OF EXECUTE; 00101600
|
|
% PLOTTER PLOTS FUNCTION EXECUTED BY 00101700
|
|
% INTERPRETER 00101800
|
|
PROCEDURE PLOTTER; 00101900
|
|
BEGIN 00102000
|
|
REAL X, Y, Z, N, V, TMAX, TMIN, T, J, K; 00102100
|
|
SYMBOL CODE, SYM; 00102200
|
|
LABEL EXIT; 00102300
|
|
IF CLASS ! REALPROCID OR K := WHL.NPARAM = 0 THEN 00102400
|
|
BEGIN PRINT #MISSING OR ILLEGAL FUNCTION#; 00102500
|
|
GO TO EXIT END; 00102600
|
|
SYM := INSYM; 00102700
|
|
CODE := ATSM(1,INFO); 00102800
|
|
IF K ! 1 THEN 00102900
|
|
BEGIN 00103000
|
|
PRINT #TYPE # K-1 # PARAMETER# 00103100
|
|
IF K = 2 THEN # # ELSE #S#; 00103200
|
|
J := 1; 00103300
|
|
DO STACK[J := J + 1] := READN(TWX) 00103400
|
|
UNTIL J = K; 00103500
|
|
END; 00103600
|
|
K := K + 1; 00103700
|
|
PRINT #ENTER BEGINNING VALUE, INCREMENT, AND FINAL VALUE FOR#, 00103800
|
|
#THE PLOT#; 00103900
|
|
X := READN(TWX); Y := READN(TWX); Z := READN(TWX); 00104000
|
|
N := (Z - X) / Y + 1; 00104100
|
|
J := -1; INTERPRETING := TRUE; 00104200
|
|
BEGIN 00104300
|
|
ARRAY VALUES[0:N]; 00104400
|
|
TMAX := -(TMIN := TEN[68]); 00104500
|
|
FOR V := X STEP Y UNTIL Z DO 00104600
|
|
BEGIN 00104700
|
|
SAVEI := 0; 00104800
|
|
FR := I := K; 00104900
|
|
STACK[1] := V; 00105000
|
|
EXECUTE(CODE); 00105100
|
|
VALUES[J := J + 1] := T := STACK[0]; 00105200
|
|
TMAX := MAX(TMAX,T); 00105300
|
|
TMIN := MIN(TMIN,T); 00105400
|
|
END; 00105500
|
|
PRINT ,/,/,/,/,/ SPACE(8) #PLOT OF # SYM 00105600
|
|
#(X), X = # X # TO # Z # IN STEPS OF # 00105700
|
|
Y,/SPACE(16) #RANGE OF # SYM # IS # 00105800
|
|
TMIN # TO # TMAX ,/,/,/; 00105900
|
|
IF TMAX ! TMIN THEN 00106000
|
|
TMAX := 50/(TMAX - TMIN); 00106100
|
|
J := -1; 00106200
|
|
FOR V := X STEP Y UNTIL Z DO 00106300
|
|
BEGIN 00106400
|
|
TWXS2 := SPACE; 00106500
|
|
PRIN V; 00106600
|
|
T := (VALUES[J:=J+1] - TMIN) | TMAX + 8; 00106700
|
|
IF J MOD 10 = 0 THEN 00106800
|
|
TWXS2(8) := [2:"...."] & TWXS2(8,42) 00106900
|
|
ELSE TWXS2(8) := "."; 00107000
|
|
TWXS2(T,1) := "*"; 00107100
|
|
WRITE TWX; 00107200
|
|
END; 00107300
|
|
END; 00107400
|
|
PRIN ,/,/,/,/,/; 00107500
|
|
EXIT: NEWLINE := TRUE; 00107600
|
|
INTERPRETING := FALSE; 00107700
|
|
END OF PLOTTER; 00107800
|
|
% MAIN PROGRAM SECTION 00107900
|
|
PRINT #RECC FUNCTION PLOTTER#; 00108000
|
|
START: 00108100
|
|
PRINT #GO AHEAD.#,/; 00108200
|
|
NEWLINE := TRUE; GETNEXT; 00108300
|
|
[SWITCH 00108400
|
|
"FUNCTION", PROCEDUREDEC ELSE 00108500
|
|
"LIST", PRINT PLIST ELSE 00108600
|
|
"PLOT", PLOTTER ELSE 00108700
|
|
"DELETE", IF NULL PLIST THEN 00108800
|
|
PRINT #FUNCTION LIST EMPTY# 00108900
|
|
ELSE 00109000
|
|
BEGIN 00109100
|
|
DL := SMTA(CTR(INF := PLIST)); 00109200
|
|
PLIST := CDR PLIST; CDR INF := NIL; 00109300
|
|
PRINT CAR INF, #DELETED#; 00109400
|
|
PURGE(INF); 00109500
|
|
NEXTAVL(SYMBOL) := DL; 00109600
|
|
END ELSE 00109700
|
|
"STOP", GO TO EXIT;] : RESTART; 00109800
|
|
GO TO START; 00109900
|
|
RESTART: PRINT #PLEASE RETYPE#; GO TO START; 00110000
|
|
EXIT: PRINT #END OF PROGRAM.# ,/,/,/; 00110100
|
|
END. 00110200
|
|
00110300
|
|
00110400
|
|
00110500
|
|
00110501
|
|
CALL REMPLOT 00110502
|
|
00110503
|
|
RECC FUNCTION PLOTTER 00110504
|
|
GO AHEAD. 00110505
|
|
FUNCTION F(X); 00110506
|
|
1:RETURN SIN(X)|COS(X)/(X+1); 00110507
|
|
GO AHEAD. 00110508
|
|
PLOT F 00110509
|
|
ENTER BEGINNING, INCREMENT, AND LAST VALUES FOR PLOT 00110510
|
|
?0,.2 10 00110511
|
|
00110512
|
|
00110513
|
|
00110514
|
|
00110515
|
|
00110516
|
|
PLOT OF F(X), X = 0 TO 10 IN STEPS OF .2 00110517
|
|
RANGE OF F IS -.14869 TO .29126 00110518
|
|
00110519
|
|
00110520
|
|
00110521
|
|
0 ................*............................... 00110522
|
|
.2 . * 00110523
|
|
.4 . * 00110524
|
|
.6 . * 00110525
|
|
.8 . * 00110526
|
|
1 . * 00110527
|
|
1.2 . * 00110528
|
|
1.4 . * 00110529
|
|
1.6 . * 00110530
|
|
1.8 . * 00110531
|
|
2 ..*............................................. 00110532
|
|
2.2 * 00110533
|
|
2.4 * 00110534
|
|
2.6 . * 00110535
|
|
2.8 . * 00110536
|
|
3 . * 00110537
|
|
3.2 . * 00110538
|
|
3.4 . * 00110539
|
|
3.6 . * 00110540
|
|
3.8 . * 00110541
|
|
4 ...........................*.................... 00110542
|
|
4.2 . * 00110543
|
|
4.4 . * 00110544
|
|
4.6 . * 00110545
|
|
4.8 . * 00110546
|
|
5 . * 00110547
|
|
5.2 . * 00110548
|
|
5.4 . * 00110549
|
|
5.6 . * 00110550
|
|
5.8 . * 00110551
|
|
6 ............*................................... 00110552
|
|
6.2 . * 00110553
|
|
6.4 . * 00110554
|
|
6.6 . * 00110555
|
|
6.8 . * 00110556
|
|
7 . * 00110557
|
|
7.2 . * 00110558
|
|
7.4 . * 00110559
|
|
7.6 . * 00110560
|
|
7.8 . * 00110561
|
|
8 ..............*................................. 00110562
|
|
8.2 . * 00110563
|
|
8.4 . * 00110564
|
|
8.6 . * 00110565
|
|
8.8 . * 00110566
|
|
9 . * 00110567
|
|
9.2 . * 00110568
|
|
9.4 . * 00110569
|
|
9.6 . * 00110570
|
|
9.8 . * 00110571
|
|
10 .....................*.......................... 00110572
|
|
00110573
|
|
00110574
|
|
00110575
|
|
00110576
|
|
00110577
|
|
GO AHEAD. 00110578
|
|
STOP 00110579
|
|
END OF PROGRAM. 00110580
|