mirror of
https://github.com/retro-software/B5500-software.git
synced 2026-03-02 17:44:40 +00:00
1. Commit library tape images, directories, and extracted text files. 2. Commit additional utilities under Unisys-Emode-Tools.
5049 lines
399 KiB
Plaintext
5049 lines
399 KiB
Plaintext
BEGIN COMMENT WIPL - WISCONSIN INTERACTIVE PROBLEM-SOLVING LANGUAGE 10001000
|
|
BY ED HARRIS AND BOB JANOSKI 10003000
|
|
UNIV. OF WISCONSIN CUMPUTING CENTER (MADISON) 10005000
|
|
VERSION 1.50 (9/1/70) 10007000
|
|
THE DIAGRAM BELOW SKETCHES THE PATHS OF CONTROL (SHOWN BY = AND H) 10009000
|
|
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10011000
|
|
.10013000
|
|
OUTER BLOCK BLOCK DIAGRAM 10015000
|
|
* * * * * * * * * * ----------- SCANNER 10017000
|
|
* INITIALIZATION * # = =* * * * * * * * * * 10019000
|
|
* * H * PRODUCE SYNTAX * 10021000
|
|
* CREATE SAVFILE * H * ARRAYS * 10023000
|
|
* OR RESTART OR * H * * * * * * * * * * 10025000
|
|
* H/L RECOVERY * H 10027000
|
|
* * SCHEDULER H ACCEPT 10029000
|
|
* CALL SCHEDULER =====* * * * * * * * H # = * * * * * * * * * 10031000
|
|
* * *---D.C.I.O.----* H H * READ UNDEFINED* 10033000
|
|
* CLEANUP * *---------------* H H * VALUES * 10035000
|
|
* * * * * * * * * * * CALL SCANNER ====# H * * * * * * * * * 10037000
|
|
* * H 10039000
|
|
* CALL ACCEPT = = = = # TRANSLATOR 10041000
|
|
* OR TRANSLATOR = = = = = * * * * * * * * * * *10043000
|
|
* * *--STMT PROCEDURES--*10045000
|
|
* CALL RUNNERS * *--VERB PROCEDURES--*10047000
|
|
RUNNERS * * * * H * * * * *--CLEANUPCODE------*10049000
|
|
------- H *--LINKUP-----------*10051000
|
|
S:EXECUTE CODE = = = = = = = # *-------------------*10053000
|
|
E:WRITE MESSAGE= = = = = = = # *PRODUCE CODE ARRAY *10055000
|
|
I:INPUT FROM DISK = = = = = # * * * * * * * * * * *10057000
|
|
D:SAVE ON DISK = = = = = = = # 10059000
|
|
B:BEGIN NEW USER = = = = = = # 10061000
|
|
P:WRITE ONE LINE = = = = = = # 10063000
|
|
L:LIST A LINE = = = = = = = # 10065000
|
|
H:LIST HELP CARD = = = = = = # 10067000
|
|
K:LIST KEYWORD CARD = = = = # 10069000
|
|
R:RESTART USER = = = = = = = # 10071000
|
|
Q:QUIT = = = = = = = = = = = # 10073000
|
|
EL:(E&L) = = = = = = = = = = # 10075000
|
|
RL:(R&L) = = = = = = = = = = # 10077000
|
|
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10079000
|
|
SEQUENCE OF OPERATION: 10081000
|
|
1. INITIALIZATION (IN OUTER BLOCK) 10083000
|
|
2. A CALL TO SCHEDULER. 10085000
|
|
3. CALLS ON DCIO TO LOAD ONE CARD IMAGE INTO 10087000
|
|
SYNTAX[0] ARRAY. 10089000
|
|
3A A CALL ON SCANNER TO PRODUCE THREE ARRAYS: 10091000
|
|
SCANCODE, WHICH HAS A 6 BIT CLASS AND A 6 BIT 10093000
|
|
KEY FOR EACH SYMBOL ON THE CARD 10095000
|
|
IDENT, WHICH CONTAINS THE ALPHA CHARACTERS 10097000
|
|
OF THE IDENTIFIERS, AN ARRAY FLAG, AND 10099000
|
|
AND THE VALUE OF THE IDENTIFIER. 10101000
|
|
THE VALUE OF THE IDENTIFIER IS SET 10103000
|
|
TO "UNDEFINED". 10105000
|
|
SCANCON, WHICH IS AN INTERMEDIATE LIST OF 10107000
|
|
CONSTANTS AND STRINGS TO BE USED LATER. 10109000
|
|
4. A CALL ON ONE OF THE ANALYSIS PROCEDURES, DETERMINDD10111000
|
|
BY SCAN (WHICH PRODUCES CODE IN THE TEMPCODE 10113000
|
|
ARRAY). 10115000
|
|
5. A CALL ON THE CLEANUP ROUTINE WHICH MOVES CODE 10117000
|
|
AND CONSTANTS AND STRINGS INTO THE CODE ARRAY. 10119000
|
|
6. A CALL ON STORE IF PROGRAM MODE ELSE A CALL ON 10121000
|
|
EXECUTE IF CALCULATOR MODE. 10123000
|
|
7. IF EXECUTE IS SUSPENDED (AWAITING I/O) AN ENTRY 10125000
|
|
IS MADE IN THE RUNNERS ARRAY FOR SCHEDULING LATER9 10127000
|
|
8. IF NO RUNNERS ARE ACTIVE, IT SLEEPS ON INPUT. 10129000
|
|
9. IF ANY REALLOCATION IS REQUIRED, THEN SCHEDULER EXITS 10131000
|
|
TO THE OUTER BLOCK AND IS RECALLED AGAIN WITH NEW ARRAY 10133000
|
|
DIMENSIONS. 10135000
|
|
; 10137000
|
|
DEFINE MAX = 6#; COMMENT SPECIFIES 7 POSSIBLE USERS OF WIPL; 10139000
|
|
COMMENT SEE FILE DECLARATIONS IN SCHEDULER; 10141000
|
|
DEFINE MAXINPUTBUFFERSIZE = 5#; 10143000
|
|
COMMENT USE "5" IF ALL INPUT BUFFERS ARE 28 CHARACTERS, 10145000
|
|
USE "8" IF ANY INPUT BUFFERS ARE 56 CHARACTERS; 10147000
|
|
DEFINE TIMEOUT = 240#; COMMENT 4 MINUTE IDLE TIMEOUT; 10149000
|
|
DEFINE SYNTAXERRSTART = 75#; 10151000
|
|
DEFINE MAXERRNUMBER = 106#; COMMENT SYNTAXERRSTART+LAST SYNTAX ERROR; 10151100
|
|
COMMENT 10153000
|
|
LAST SYNTAX ERROR USED IS 31. 10153100
|
|
LAST EXECUTION ERROR USED IS 49; 10153200
|
|
BOOLEAN DEBUG; COMMENT COMMON=1 TURNS ON DEBUG OPTION; 10155000
|
|
COMMENT COMMON>1 SPECIFIES ALTERNATE SAVFILE; 10157000
|
|
INTEGER MAXUSER; COMMENT THE INDEX IF THE MAXIMUM LOGGED-IN USER; 10159000
|
|
DEFINE SAVEOPTION = SAVE #; COMMENT EXCHANGE OVERLAYABLE CORE FOR 10161000
|
|
BETTER RESPONSE IN A HEAVY MIX; 10163000
|
|
SAVEOPTION 10165000
|
|
ARRAY USERID[0:MAX]; COMMENT THIS ARRAY DETERMINES LOGGED-IN USERS; 10167000
|
|
DEFINE INFMAX = 36#; 10169000
|
|
ARRAY INFO[0:MAX, 0:INFMAX]; 10171000
|
|
COMMENT THE FOLLOWING DEFINES REFER TO INDEX VALUES INTO THE INFO 10173000
|
|
ARRAY; 10175000
|
|
DEFINE IOBUF=0#; 10177000
|
|
DEFINE DICTMAX=10#; COMMENT POINTER TO LAST IDENTIFIER IN IDENTIFIERS 10179000
|
|
ARRAY; 10181000
|
|
DEFINE CODEMAX=11#; COMMENT POINTER TO LAST ELEMENT IN CODE ARRAY; 10183000
|
|
DEFINE CMAX = CODEMAX#; 10185000
|
|
DEFINE LASTRAND=12#; 10187000
|
|
DEFINE FILEID=13#; 10189000
|
|
DEFINE CINDX=14#, LINDX=15#, SINDX=16#; 10191000
|
|
COMMENT C,S AND L REGISTERS FOR EXECUTE PROCEDURE; 10193000
|
|
DEFINE CBASEINDX=17#; 10195000
|
|
DEFINE MODE =18#; COMMENT IF NON-ZERO, THEN IT IS ACCEPT INDEX; 10197000
|
|
DEFINE FILELIMITS = 19#; 10199000
|
|
DEFINE FILENAME = 19#; 10201000
|
|
DEFINE LOADLINK = 20#; 10203000
|
|
DEFINE HELPLINK = 20#; 10205000
|
|
DEFINE ALPHACCEPT = 21].[46:1#; 10207000
|
|
DEFINE LOADLIST = 21].[45:1#; 10209000
|
|
DEFINE ACCEPTFLAG=21].[44:1#; 10211000
|
|
DEFINE ARRAYFLAG=21].[43:1#; 10213000
|
|
DEFINE MODEFLAG=21].[42:1#; 10215000
|
|
DEFINE PUBLICFLAG = 21].[41:1#; 10217000
|
|
DEFINE FORMFLAG = 21].[40:1#; 10219000
|
|
DEFINE FORMINDEX = 21].[33:7#; 10221000
|
|
DEFINE FORMPOINTER = 21].[20:13#; 10223000
|
|
DEFINE SIGNIFICANCE = 21].[19:1#; 10225000
|
|
DEFINE DATAST = 21].[18:1#; 10227000
|
|
DEFINE DATAINDEX = 21].[11:7#; 10229000
|
|
DEFINE DATASTART = 21].[1:10#; 10231000
|
|
DEFINE RUNLIMIT=22#,RUNCOUNT=23#; 10233000
|
|
DEFINE LASTUSERARRAY=24#; 10235000
|
|
DEFINE BUFINDEX = 25#; 10237000
|
|
DEFINE DATAPOINTER = 26#; 10239000
|
|
DEFINE ALTBUF = 27#; 10241000
|
|
COMMENT 10243000
|
|
INFO[USER,*] CONTAINS ALL THE FLAGS AND COUNTERS FOR EACH USER10245000
|
|
FORMAT: 10247000
|
|
0-8 72 CHARACTER I/O BUFFER. 10249000
|
|
9 SCRATCH. 10251000
|
|
10-26 AS NOTED ABOVE BY DEFINES 10253000
|
|
26-36 BUFFER FOR FORMATTED OUTPUT; 10255000
|
|
DEFINE HELPSIZE = 900#, 10257000
|
|
HELPARRAYSTART = 301#, 10259000
|
|
ERRORSTART = 331#, 10261000
|
|
DIRSPACE = 381#, 10263000
|
|
FILESTART = 427#; 10265000
|
|
COMMENT 10267000
|
|
IF IT IS NECESSARY TO INCREASE THE SIZE OF THE HELPFILE, HELPSIZE 10269000
|
|
IS THE NUMBER OF CARDS IN THE HELPFILE, HELPARRAYSTART IS HELPSIZE 10271000
|
|
/3+1, ERRORSTART IS HELPARRAYSTART+HELPSIZE/30, DIRSPACE IS 10273000
|
|
ERRORSTART+50, FILESTART IS DIRSPACE+46; 10275000
|
|
ARRAY HELPTABLE[0:HELPSIZE]; 10277000
|
|
BOOLEAN RESTART; 10279000
|
|
BOOLEAN READDATA; 10281000
|
|
DEFINE ADD1TOP = SI1~SI; DI1~DI; DI~LOC T; SI~P; DS~WDS; SI~T; SI~SI+8; 10283000
|
|
T~SI; SI~LOC T; DI~P; DS~WDS; SI~SI1; DI~DI1#; 10285000
|
|
INTEGER USER; COMMENT THE GLOBAL SUBSCRIPT OF USER; 10287000
|
|
DEFINE IDENTIFIERSARRAYSIZE = 128#; 10289000
|
|
ARRAY IDENTIFIERS[0:MAX,0:IDENTIFIERSARRAYSIZE]; 10291000
|
|
COMMENT 10293000
|
|
IDENTIFIERS[USER,*] CONTAINS TWO WORDS FOR EACH VARIABLE: 10295000
|
|
FIRST WORD [1:1] 1 IF ARRAY IDENTIFIER. 10297000
|
|
[2:4] # CHARACTERS IN NAME. 10299000
|
|
[6:42] FIRST 7 CHARACTERS. 10301000
|
|
SECOND WORD VALUE, IF SIMPLE VARIABLE, ELSE: 10303000
|
|
[1:2] # OF DIMENSIONS. 10305000
|
|
[3:8],[11:8],[19:8],[27:8] SIZES OF DIM10307000
|
|
[38:10] USERARRAY[USER,*] BASEADDR.10309000
|
|
; 10311000
|
|
DEFINE STACKARRAYSIZE = 50#; 10313000
|
|
INTEGER MAXCODESIZE; 10315000
|
|
INTEGER MAXUSERARRAY; 10317000
|
|
ARRAY DICT[0:110]; COMMENT DICTIONARY OF RESERVED WORDS; 10319000
|
|
COMMENT USED BY SCAN AND HELPLOADER ONLY; 10321000
|
|
DEFINE DICTSIZEMINUS63=47#; 10323000
|
|
SAVEOPTION 10325000
|
|
REAL ARRAY RUNNER[0:MAX]; COMMENT THE SCHEDULE BY USER; 10327000
|
|
ARRAY SYNTAX[0:215]; 10329000
|
|
DEFINE TEMPCODE=11#, SCANCODE=79#, SCANCON=147#; 10331000
|
|
COMMENT 10333000
|
|
SYNTAX IS THE ARRAY THAT INTERFACES BETWEEN DCIO, SCANNER, 10335000
|
|
AND TRANSLATOR. 10337000
|
|
0-9 IS INPUT IMAGE. 10339000
|
|
TEMPCODE IS TRANSLATOR PRODUCED CODE CONTAINING AN OP CODE 10341000
|
|
AND MODIFIER FOR EACH PSEUDO INSTRUCTION GENERATED. 10343000
|
|
SCANCODE IS SCANNER PRODUCED CODE CONTAINING A CLASS AND A 10345000
|
|
KEY FIELD FOR EACH SYMBOL ON THE INPUT CARD. 10347000
|
|
(SEE INITIALIZE COMMENTS). 10349000
|
|
SCANCON IS AN INTERMEDIATE ALPHA REPRESENTATION OF CONSTANTS10351000
|
|
AND STRINGS. FOR NUMBERS, CHARACTER 1 IS THE # OF 10353000
|
|
CHARACTERS IN THE MANTISSA, CHARACTERS 2-N ARE THE 10355000
|
|
ALPHA CHARACTERS OF THE DIGITS AND DEC. POINT, AND 10357000
|
|
A FULL WORD (BEGINNING WITH "E" ) IS ADDED FOR 10359000
|
|
EXPONENTS. ; 10361000
|
|
DEFINE CLASSFIELD = [36:6]#; 10363000
|
|
DEFINE SBIT = [1:1]#; 10365000
|
|
DEFINE KEYFIELD = [42:6]#; 10367000
|
|
DEFINE CDISKADDR = [2:13]#, CSNUMB = [15:17]#, CLINK = [32:10]#, 10369000
|
|
CSIZE = [42:6]#; 10371000
|
|
DEFINE CPARTNUMB = [15:7]#, CSTEPNUMB = [22:10]#; 10373000
|
|
COMMENT 10375000
|
|
THE FORMAT OF THE CODE ARRAY (DECLARED OWN IN SCHEDULER) IS: 10377000
|
|
0 INITIAL LINK WORD TO FIRST EXECUTABLE STMNT. 10379000
|
|
1 LINK WORD FOR FIRST CARD. 10381000
|
|
2-N CODE SYLLABLES FOR FIRST CARD. 10383000
|
|
N+1 TO M IN-LINE CONSTANTS AND STRINGS. 10385000
|
|
M+1 LINK WORD FOR SECOND CARD, ETC. 10387000
|
|
LINK FORMAT: 10389000
|
|
SBIT 1 = ERASED CARD. 10391000
|
|
CDISKADDR:CARD IMAGE # IN SAVEFILE ON DISK. 10393000
|
|
CSNUMB BINARY PART AND STEP NUMBER. 10395000
|
|
CLINK SUBSCRIPT IN CODE[USER,*] OF NEXT LOGICAL PROG.10397000
|
|
STATEMENT. "0" IS THE STOPPER. 10399000
|
|
CSIZE 1 = REMARK CARD (WITH NO CODE SYLLABLES) ELSE 10401000
|
|
CSIZE # OF CODE WORDS FOR THE CARD. ; 10403000
|
|
BOOLEAN ERRFLAG; 10405000
|
|
LABEL FINISH; 10407000
|
|
LABEL FINISH1; 10409000
|
|
LABEL ENDEND; 10411000
|
|
BOOLEAN FLAG; 10413000
|
|
BOOLEAN OK; 10415000
|
|
BOOLEAN ENTERDICT; COMMENT TRUE IF NEW VARIABLES SHOULD BE ENTERED ; 10417000
|
|
BOOLEAN ACTIVE; COMMENT FLAG FOR ANY ACTIVE RUNNERS; 10419000
|
|
BOOLEAN PROGMODE; COMMENT PROGRAM/CALCULATOR MODE FLAG; 10421000
|
|
BOOLEAN REALLOCATE; COMMENT FLAG TO RE-ALLOCATE USER ARRAYS; 10423000
|
|
BOOLEAN PFLAG; 10425000
|
|
REAL T, T1, T2; 10427000
|
|
REAL T3; 10429000
|
|
REAL T4; 10431000
|
|
REAL T5; 10433000
|
|
REAL T6,T7; 10435000
|
|
REAL S1,S2; 10437000
|
|
INTEGER I; 10439000
|
|
INTEGER ERRNUMBER; 10441000
|
|
REAL INTG, FRACTION, TENS; 10443000
|
|
INTEGER NC,C; 10445000
|
|
INTEGER CBASE; 10447000
|
|
INTEGER EVENTS; 10449000
|
|
REAL STNOMASK; 10451000
|
|
REAL UNDEFINED; 10453000
|
|
FILE DSK DISK RANDOM "WIPLS" "SAVFILE" (1,30,30); 10455000
|
|
COMMENT 10457000
|
|
SAVE FILE FORMAT: 10459000
|
|
SEG. 0 FIRST DIRECTORY SEG. AND RESTART FLAGS. 10461000
|
|
SEG. 1, ETC. HELP CARD IMAGES. 10463000
|
|
SEG. HELPARRAYSTART, ETC. COPY OF HELPARRAY[*]. 10465000
|
|
SEG. ERRORSTART, ETC. ERROR MESSAGES. 10467000
|
|
SEG. DIRSPACE, ETC. SPACE FOR MORE DIRECTORY SEGMENTS. 10469000
|
|
SEG. FILESTART, ETC. USER CARD IMAGES AND DIRECTORY SEGS.;10471000
|
|
COMMENT 10473000
|
|
THE SAVE FILE IS CREATED BY READING THE FILES ERRORS/CARDS 10475000
|
|
AND HELPFIL/CARDS FROM USER DISK. THESE FILES MAY BE MODIFIED10477000
|
|
IN TEXT EDITOR-STYLE USING WIPL SINCE THEY CONSIST OF 10479000
|
|
REMARK CARDS. EXECUTING "CC REMOVE WIPLS/SAVFILE." FORCES 10481000
|
|
AN UPDATE OF THE LOCAL FILE; 10483000
|
|
INTEGER PTMASK; 10485000
|
|
SAVEOPTION 10487000
|
|
ARRAY DISKBUF[0:29]; COMMENT CORE COPY OF DISK-WRITE BUFFER; 10489000
|
|
INTEGER DISKPOINTER; COMMENT CARD NUMBER BEING WRITTEN; 10491000
|
|
ARRAY DIRBUF[0:29]; COMMENT CORE COPY OF CURRENT DIRECTORY SEG.; 10493000
|
|
INTEGER DLOC; COMMENT LOCATION OF CURRENT DIRECTORY SEGMENT; 10495000
|
|
INTEGER DENTRY; COMMENT ENTRY # WITHIN DIRECTORY SEGMENT; 10497000
|
|
SAVEOPTION 10499000
|
|
ARRAY LISTBUF[0:29]; COMMENT CORE COPY OF COMMON READ-BACK BUFFER; 10501000
|
|
INTEGER LISTPOINTER; 10503000
|
|
ARRAY SAVEBUF[0:29]; 10505000
|
|
FILE SAVER DISK SERIAL [20:45] "X" "CARDS" (1,10,30, SAVE 5); 10507000
|
|
FILE IN LOADFILE DISK SERIAL "X" "CARDS" (2,10,30); 10509000
|
|
COMMENT DE BUG CODE; 10511000
|
|
FILE OUT PR 15 (2,17); 10513000
|
|
FORMAT E (" SCANCODE: ", 15(A6,X1)), 10515000
|
|
EE (" SCANCON: ",10(O,X1)), 10517000
|
|
DMPCODE (" TEMPCODE: ", 15(A6,X1)), 10519000
|
|
DMPIDS (" IDENTIFIERS AND VALUES "), 10521000
|
|
FMTC(" CODE: ",14(O,X1)), 10523000
|
|
H1(14(O,X1)), 10525000
|
|
XFMT ("EXECUTE: ", "C = ", I4, " L = ", I1, " OP = ", 10527000
|
|
A2, " MODIFIER = " , A2, " S = ", I4, " STACK = "); 10529000
|
|
COMMENT THE FOLLOWING STEPS COULD BE TAKEN TO OPTIMIZE WIPL: 10531000
|
|
1. CHANGE THE DATA COMM READ SO THAT IT CHECKS FOR INPUT 10533000
|
|
MORE THAN ONCE EVERY SECOND. 10535000
|
|
2. CHANGE THE DICTIONARY SEARCH IN SCANNER TO KEY ITS 10537000
|
|
SEARCH ON THE CHARACTER COUNT, RATHER THAN SERIALLY 10539000
|
|
SEARCH THE ENTIRE TABLE. 10541000
|
|
3. IMPROVE LOAD-ING SPEED BY ELIMINATING UNNECESSARY DISK 10543000
|
|
REFERENCES. 10545000
|
|
4. MODIFY THE DYNAMIC OWN ARRAYS FOR EACH USER TO BE OF 10547000
|
|
VARIABLE ROW SIZE; 10549000
|
|
COMMENT COMPILE BY: 10551000
|
|
CC USER = <USERID> 10553000
|
|
CC COMPILE WIPL/WIPL ALGOL LIBRARY 10555000
|
|
CC ALGOL FILE TAPE = WIPL/SOURCE [SERIAL] 10557000
|
|
CC PRIORITY=4 10559000
|
|
CC CORE=5500 10561000
|
|
CC STACK=400 10563000
|
|
CC DATA CARD 10565000
|
|
$TAPE LIST CHECK 10567000
|
|
99999999 10569000
|
|
CC PUBLIC WIPL/WIPL 10571000
|
|
CC END 10573000
|
|
; 10575000
|
|
COMMENT TO ADD VERBS: 10577000
|
|
1. MAKE AN ENTRY IN DICT[*]. (EXTEND ITS SIZE IF NEC.) 10579000
|
|
2. CHANGE THE DEFINES "EITHERINDX" AND "PROGINDX" IF NEC. 10581000
|
|
3. ADD AN ENTRY IN THE CASE STATEMENT IN TRANSLATOR; 10583000
|
|
COMMENT TO ADD FUNCTIONS: 10585000
|
|
1. REPEAT 1. ABOVE. 10587000
|
|
2. MAKE AN ENTRY IN THE FUNCTION CASE STATEMENT IN EXECUTE; 10589000
|
|
% ******************************************************************** 20001000
|
|
% ******************************************************************** 20003000
|
|
% *************** S C A N N E R *************************************** 20005000
|
|
% ******************************************************************** 20007000
|
|
% ******************************************************************** 20009000
|
|
COMMENT 20011000
|
|
SCANNER PRODUCES THREE ARRAYS: 20013000
|
|
SCANCODE ARRAY WHICH CONTAINS A CLASS AND KEY FOR 20015000
|
|
EACH SYMBOL ON THE CARD, 20017000
|
|
SCANCON ARRAY WHICH CONTAINS THE INTERMEDIATE BREAKDOWN20019000
|
|
OF CONSTANTS AND STRINGS, 20021000
|
|
IDLIST ARRAY WHICH IS THE LIST OF IDENTIFIERS 20023000
|
|
AND THEIR VALUES; 20025000
|
|
COMMENT 20027000
|
|
SCANNER ENTERS VARIABLE NAMES INTO THE IDENTIFIERS ARRAY. 20029000
|
|
SCANNER ALSO DOES CONSIDERABLE ERROR CHECKING. 20031000
|
|
; 20033000
|
|
COMMENT THE FOLLOWING DEFINES ARE ENTRYS IN THE DICT ARRAY; 20035000
|
|
DEFINE CONV = 1#; 20037000
|
|
DEFINE EITHER = 2#; 20039000
|
|
DEFINE PROG = 3#; 20041000
|
|
DEFINE CONVINDX = 0#; 20043000
|
|
DEFINE EITHERINDX = 9#; 20045000
|
|
DEFINE PROGINDX = 15#; 20047000
|
|
DEFINE REMARKINDX = 12#; 20047100
|
|
DEFINE DATAINDX = 23#; 20049000
|
|
DEFINE RESTOREINDX = 24#; 20051000
|
|
DEFINE REPLINDX = 9#; 20053000
|
|
DEFINE ARRAYID = 6#; 20055000
|
|
DEFINE REMLETR1="2"#, REMLETR2="3"#; 20057000
|
|
DEFINE FORMLETR1 = "3"#, FORMLETR2 = "7"#; 20059000
|
|
DEFINE IDLETTER = "5"#; 20061000
|
|
DEFINE ARRAYIDLETTER="6"#; 20063000
|
|
DEFINE FUNCTLETR1 = "@"#; 20065000
|
|
DEFINE OPR = 10#; 20067000
|
|
DEFINE ENDR = 00#; 20069000
|
|
DEFINE DRBRK = "91"#; 20071000
|
|
DEFINE DLPAREN = "40"#; 20073000
|
|
DEFINE STRNG = 15#; 20075000
|
|
DEFINE DRPAREN = "90"#; 20077000
|
|
DEFINE CON = 7#; 20079000
|
|
DEFINE ADSUBOP = 8#; 20081000
|
|
DEFINE LISTLETRS = "16"#; 20083000
|
|
INTEGER PROCEDURE SCANNER (INFO, IDLIST); ARRAY INFO[0], IDLIST[0]; 20085000
|
|
BEGIN 20087000
|
|
COMMENT SCANNER RETURNS AN INDEX FOR THE CASE STATEMENT 20089000
|
|
IN TRANSLATOR; 20091000
|
|
LABEL XIT, TWOOPS; 20093000
|
|
LABEL BRKERR, PARENERR, CLASSERR; 20095000
|
|
LABEL CLASSERR1,CLASSERR2; 20097000
|
|
INTEGER STREAM PROCEDURE STRNGLENGTH(STR); 20099000
|
|
BEGIN LABEL EXIT; TALLY ~1; SI~STR;8(8(IF SC=""" THEN JUMP OUT 2 TO EXIT20101000
|
|
;SI~SI+1); TALLY~TALLY+1); EXIT:STRNGLENGTH~TALLY; END STRNGLENGTH;20103000
|
|
BOOLEAN STREAM PROCEDURE SCAN(ERRLIST, CLEAROUT, IDLIST, CONLIST, 20105000
|
|
DICT, CODELIST, BUF); 20107000
|
|
BEGIN 20109000
|
|
LOCAL T, T1, T2, ERRBUF; 20111000
|
|
LABEL NEXT, DEBLANK, ERR, NUMB, NUMBR, STRING, SERCH, 20113000
|
|
DFOUND, ERRL, XIT, EXPO, EXP, E1, E2, A, SLBRK, 20115000
|
|
IDSERCH, ERRQ, ERRQM; 20117000
|
|
DI ~ CLEAROUT; DS ~ 8 LIT "00"; SI ~ CLEAROUT; 20119000
|
|
3(DS~63 WDS); DS~14 WDS; %CLEAR SYNTAX ARRAY 20121000
|
|
DS ~ 1 LIT "E"; DI ~ ERRLIST; 20123000
|
|
DS ~ 40 LIT " "; COMMENT BLANK OUT ERROR BUFFER; 20125000
|
|
TALLY ~ 1; SCAN ~ TALLY; COMMENT SET PROCEDURE TRUE; 20127000
|
|
DI ~ BUF; DI ~ DI + 32; DI ~ DI + 40; DS ~ LIT "~"; 20129000
|
|
DS ~ LIT """; DS ~ 2 LIT " ~"; COMMENT SET END OF CARD;20131000
|
|
SI ~ BUF; 2(36(IF SC > "9" THEN JUMP OUT 2 TO ERRQM ELSE 20133000
|
|
IF SC ="~" THEN ELSE SI ~ SI+1)); 20135000
|
|
NEXT: SI ~ CONLIST; IF SC ! "0" THEN GO TO ERRL; 20137000
|
|
SI ~ CODELIST; IF SC ! "0" THEN GO TO ERRL; 20139000
|
|
DI ~ LOC T; DS ~ 8 LIT "0"; COMMENT CLEAR NEW SYMBOL; 20141000
|
|
SI ~ BUF; COMMENT LOOK AT NEXT SYMBOL; 20143000
|
|
DEBLANK: IF SC = " " THEN BEGIN SI ~ SI + 1; GO TO DEBLANK; END; 20145000
|
|
IF SC = "~" THEN GO TO XIT; 20147000
|
|
COMMENT ~ TERMINATES CARD IMAGE; 20149000
|
|
BUF ~ SI; COMMENT MARK START OF NEW SYMBOL; 20151000
|
|
ERRBUF ~ SI; 20153000
|
|
IF SC = "." THEN GO TO NUMB; 20155000
|
|
IF SC = ALPHA THEN IF SC } "0" THEN BEGIN 20157000
|
|
COMMENT PROCESSOR FOR A NUMBER STRING; 20159000
|
|
NUMB: SI ~ SI + 1; TALLY ~ 1; 20161000
|
|
15( IF SC = "." THEN GO TO NUMBR; 20163000
|
|
IF SC } "0" THEN BEGIN 20165000
|
|
NUMBR: SI ~ SI + 1; TALLY ~ TALLY + 1; 20167000
|
|
END ELSE BEGIN 20169000
|
|
T2 ~ TALLY; SI ~ LOC T2; SI ~ SI + 7; 20171000
|
|
DI ~ CONLIST; DS ~ 1 CHR; SI ~ BUF; 20173000
|
|
DS ~ T2 CHR;COMMENT CHARACTER COUNT AND STRING PKD;20175000
|
|
BUF ~ SI; COMMENT UPDATE SCAN POINTER; 20177000
|
|
SI ~ CONLIST; SI ~ SI + 16; CONLIST ~ SI; 20179000
|
|
DI ~ CODELIST; DI ~ DI + 6; DS ~ 2 LIT "NO"; 20181000
|
|
CODELIST ~ DI; COMMENT UPDATE CODE POINTER; 20183000
|
|
SI ~ BUF; 20185000
|
|
JUMP OUT 1 TO EXPO; END ); GO TO ERR; 20187000
|
|
20189000
|
|
EXPO: IF SC = "@" THEN GO TO EXP; 20191000
|
|
IF SC = "E" THEN BEGIN 20193000
|
|
EXP: SI ~ SI +1; 20195000
|
|
E1: IF SC = " " THEN BEGIN SI ~ SI + 1; 20197000
|
|
GO TO E1; END; 20199000
|
|
IF SC = "+" THEN GO TO E2; 20201000
|
|
IF SC } "0" THEN GO TO E2; 20203000
|
|
IF SC = "-" THEN BEGIN 20205000
|
|
E2: DI ~ CONLIST; DS ~ 1 LIT "E"; 20207000
|
|
DS ~ 1 CHR; 20209000
|
|
DI ~ DI + 6; CONLIST ~ DI; DI ~ DI 20211000
|
|
- 6; 3(IF SC } "0" THEN DS ~ CHR); 20213000
|
|
DS ~ 1 LIT "."; BUF ~ SI; 20215000
|
|
END; 20217000
|
|
END PACKING EXPONENTIAL; GO TO NEXT; 20219000
|
|
END NUMBER STRING ELSE BEGIN 20221000
|
|
COMMENT ALPHA STRING; 20223000
|
|
TALLY ~ 1; SI ~ SI + 1; 20225000
|
|
7( IF SC = ALPHA THEN BEGIN SI ~ SI + 1; TALLY ~ TALLY20227000
|
|
+ 1; END ELSE BEGIN 20229000
|
|
A: T2 ~ TALLY; SI ~ LOC T2; SI ~ SI + 7; 20231000
|
|
DI ~ LOC T; DS ~ 1 CHR; SI ~ BUF; DS ~ T2 CHR; 20233000
|
|
BUF ~ SI; JUMP OUT 1 TO SERCH; END); 20235000
|
|
8( IF SC = ALPHA THEN BEGIN SI ~ SI +1; TALLY~TALLY 20237000
|
|
+ 1; END ELSE GO TO A); GO TO ERR; 20239000
|
|
END PROCESSING NUMBER OR ALPHA STRING; 20241000
|
|
IF SC = """ THEN BEGIN SI ~ SI + 1; 20243000
|
|
DI ~ CODELIST; DI ~ DI + 6; DS ~ 2 LIT "ST"; 20245000
|
|
CODELIST ~ DI; COMMENT ENTER STRING CONTROL WORD; 20247000
|
|
STRING: DI ~ CONLIST; DS ~ 1 LIT "H"; DI ~ DI + 7; 20249000
|
|
CONLIST ~ DI; DI ~ DI - 7; 20251000
|
|
7( IF SC = "~" THEN JUMP OUT 1 TO ERRQ; 20253000
|
|
IF SC = """ THEN BEGIN DS ~ 1 CHR; BUF ~ SI; 20255000
|
|
JUMP OUT 1 TO NEXT; END ELSE DS ~ 1 CHR); 20257000
|
|
GO TO STRING; COMMENT MANY 7 CHARACTER ENTRIES ; 20259000
|
|
END STRING; 20261000
|
|
COMMENT FOUND A NON-ALPHA CHARACTER; 20263000
|
|
DI ~ LOC T; DS ~ 1 LIT "1"; DS ~ 1 CHR; 20265000
|
|
SI~SI-1; IF SC="*" THEN BEGIN SI~SI+1; IF SC="*" THEN DS~1CHR;20267000
|
|
END ELSE SI~SI+1; 20269000
|
|
SI~SI-1; IF SC=":" THEN BEGIN SI~SI+1; IF SC="=" THEN 20271000
|
|
DS~1 CHR; END ELSE SI~SI+1; 20273000
|
|
BUF~SI; 20275000
|
|
SERCH: SI ~ BUF; COMMENT SEARCH DICT AND ID LIST FOR SYMBOL; 20277000
|
|
SLBRK: IF SC = " " THEN BEGIN SI ~ SI + 1; GO TO SLBRK; END; 20279000
|
|
IF SC = "[" THEN BEGIN 20281000
|
|
DI ~ LOC T; SKIP 1 DB; DS ~ 1 SET; 20283000
|
|
COMMENT MARK ARRAY IDENTIFIER; 20285000
|
|
SI ~ SI + 1; BUF ~ SI; END LEFT BRACKET; 20287000
|
|
SI ~ DICT; 20289000
|
|
63( DI ~ LOC T; IF 6 SC = DC THEN JUMP OUT TO DFOUND 20291000
|
|
ELSE SI ~ SI + 2); 20293000
|
|
COMMENT LENGTH OF DICT IS NEEDED HERE; 20295000
|
|
DICTSIZEMINUS63 20297000
|
|
(DI~LOC T; IF 6 SC = DC THEN JUMP OUT TO DFOUND 20299000
|
|
ELSE SI ~ SI + 2); GO TO IDSERCH; 20301000
|
|
DFOUND: DI ~ CODELIST; DI ~ DI + 6; DS ~ 2 CHR; CODELIST ~ DI; 20303000
|
|
SI ~ SI - 2; IF SC = REMLETR1 THEN BEGIN SI ~ SI + 1; 20305000
|
|
IF SC = REMLETR2 THEN GO TO XIT; END; 20307000
|
|
COMMENT CHECK FOR COMMENT CODE; 20309000
|
|
IF SC = FORMLETR1 THEN BEGIN SI~SI+1; 20311000
|
|
IF SC = FORMLETR2 THEN BEGIN 20313000
|
|
SI~CODELIST; SI~SI-10; IF SC="N" THEN GO TO XIT; 20315000
|
|
END SKIPPING FORM STATEMENT; 20317000
|
|
END; 20319000
|
|
IF SC = FUNCTLETR1 THEN BEGIN 20321000
|
|
COMMENT CHECK FOR <FCN NAME> ( FOR A FUNCT NAME; 20323000
|
|
SI ~ BUF; 20325000
|
|
63(IF SC ! " " THEN IF SC = "(" THEN JUMP OUT 1 TO NEXT 20327000
|
|
ELSE JUMP OUT ELSE SI ~ SI +1); 20329000
|
|
DI ~ CODELIST; DI ~ DI - 8; CODELIST ~ DI; 20331000
|
|
END FUNCTION ELSE GO TO NEXT; 20333000
|
|
IDSERCH: SI ~ LOC T; SI ~ SI + 1; IF SC = ALPHA THEN ELSE GO TO ERR; 20335000
|
|
COMMENT IDENTIFIER MUST START WITH ALPHA; 20337000
|
|
TALLY ~ 0; SI ~ IDLIST; 20339000
|
|
63( IF SC = "0" THEN BEGIN 20341000
|
|
T1 ~ SI; DI ~ T1; SI ~ LOC T; DS ~ 8 CHR; 20343000
|
|
DS ~ 8 LIT "E"; SI ~ SI - 8; END ENTERING ID; 20345000
|
|
DI ~ LOC T; IF 8 SC = DC THEN BEGIN 20347000
|
|
T2 ~ TALLY; DI ~ CODELIST; DI ~ DI + 6; 20349000
|
|
SI~BUF; SI~SI-1; IF SC="[" THEN DS~1 LIT 20351000
|
|
ARRAYIDLETTER ELSE DS~1 LIT IDLETTER; SI~LOC T2; 20353000
|
|
SI~SI+7; 20355000
|
|
DS ~ 1 CHR; CODELIST ~ DI; JUMP OUT 1 TO NEXT; 20357000
|
|
END ELSE BEGIN TALLY ~ TALLY + 1; SI ~ SI + 8; END); 20359000
|
|
DI ~ ERRLIST; 20361000
|
|
DS ~ 36 LIT "MORE THAN 63 IDENTIFIERS, ERASE SOME"; 20363000
|
|
DS ~ 1 LIT "~"; 20365000
|
|
TALLY ~ 0; SCAN ~ TALLY; GO TO XIT; 20367000
|
|
ERRQ: DI ~ ERRLIST; DS ~ 20 LIT "QUOTES DO NOT MATCH~"; 20369000
|
|
TALLY ~ 0; SCAN ~ TALLY; GO TO XIT; 20371000
|
|
ERRQM: DI ~ ERRLIST; DS ~ 29 LIT "QUESTION MARK IS NOT ALLOWED~"; 20373000
|
|
TALLY ~ 0; SCAN ~ TALLY; GO TO XIT; 20375000
|
|
ERRL: DI ~ ERRLIST; DS ~ 17 LIT "TOO MANY SYMBOLS~"; 20377000
|
|
TALLY ~ 0; SCAN ~ TALLY; GO TO XIT; 20379000
|
|
ERR: DI ~ ERRLIST; DI ~ DI+8; DS ~ 15 LIT" "; DI ~ ERRLIST; 20381000
|
|
DS~8 LIT " ERROR: "; T2~TALLY; SI~LOC T2; SI~SI+7; 20383000
|
|
IF SC="0" THEN BEGIN SI~ERRBUF; DS~CHR; END ELSE BEGIN 20385000
|
|
SI~ERRBUF; DS~T2 CHR; END; 20387000
|
|
TALLY ~ 0; DS ~ 1 LIT"~"; SCAN ~ TALLY; 20389000
|
|
XIT: 20391000
|
|
END SCAN; %------------------------------------- ---------------------- 20393000
|
|
IF SCAN(INFO[IOBUF],SYNTAX[TEMPCODE],IDLIST[0], 20395000
|
|
SYNTAX[SCANCON], DICT[0], SYNTAX[SCANCODE], SYNTAX[0]) 20397000
|
|
THEN BEGIN 20399000
|
|
I ~ SCANCODE - 1; T1 ~ 0; T2 ~ 0; T3 ~ 0; 20401000
|
|
FLAG ~ FALSE; 20403000
|
|
WHILE T ~ SYNTAX[I ~ I + 1] ! ENDR DO BEGIN 20405000
|
|
COMMENT LOOK AT EACH SYMBOL FROM SCAN; 20407000
|
|
IF T.CLASSFIELD = ARRAYID THEN T1 ~ T1 + 1; 20409000
|
|
COMMENT COUNT LEFT BRACKETS; 20411000
|
|
IF T = DRBRK THEN IF T1 ~ T1 - 1 < 0 THEN GO TO 20413000
|
|
BRKERR; COMMENT BRACKETS DONT MATCH; 20415000
|
|
IF T = DLPAREN THEN T2 ~ T2 + 1; 20417000
|
|
IF T=DRPAREN THEN IF T2~T2-1<0 THEN GO TO PARENERR; 20419000
|
|
IF T = "NO" THEN BEGIN COMMENT SET # REL. ADDR. ; 20421000
|
|
SYNTAX[I] ~ CON | 64 + T3; 20423000
|
|
IF SYNTAX[SCANCON + (T3~T3+2)].[1:5] = "E" 20425000
|
|
THEN T3 ~ T3 + 1; END NUMBER; 20427000
|
|
IF T="ST" THEN BEGIN SYNTAX[I]~STRNG|64+T3; 20429000
|
|
T3~T3+STRNGLENGTH(SYNTAX[SCANCON+T3]); END STRING; 20431000
|
|
IF T.CLASSFIELD = OPR OR T.CLASSFIELD = ADSUBOP 20433000
|
|
THEN IF FLAG THEN GO TO TWOOPS 20435000
|
|
ELSE FLAG ~ TRUE ELSE FLAG ~ FALSE; 20437000
|
|
END WHILE; 20439000
|
|
IF T1 ! 0 THEN GO TO BRKERR; 20441000
|
|
IF T2 ! 0 THEN GO TO PARENERR; 20443000
|
|
PROGMODE ~ FALSE; 20445000
|
|
IF INFO[MODE] = 0 THEN BEGIN COMMENT OK TO TRANSLATE; 20447000
|
|
IF T1 ~ ( T ~ SYNTAX[I ~ SCANCODE]).CLASSFIELD = CON 20449000
|
|
THEN BEGIN PROGMODE ~ TRUE; 20451000
|
|
IF T1 ~ (T ~ SYNTAX[I ~ I + 1]). CLASSFIELD = CONV 20453000
|
|
THEN GO TO CLASSERR1; END PROGRAM MODE SETUP 20455000
|
|
ELSE IF T1 ~ T.CLASSFIELD = PROG THEN GO TO CLASSERR2; 20457000
|
|
T2 ~ -100; 20459000
|
|
IF T1 = PROG THEN T2 ~ PROGINDX; 20461000
|
|
IF T1 = CONV THEN T2 ~ CONVINDX; 20463000
|
|
IF T1 = EITHER THEN T2 ~ EITHERINDX; 20465000
|
|
COMMENT CHECK FOR DATA AND RESTORE. 20467000
|
|
":0" IS THE CODE FOR = ; 20469000
|
|
IF T2 < 0 THEN IF T1 = IDLETTER THEN 20471000
|
|
BEGIN 20473000
|
|
IF (T4 ~ IDLIST[(T3 ~ T.KEYFIELD)+T3]).[1:29] = 20475000
|
|
"4DATA" THEN IF SYNTAX[I+1] ! ":0" THEN 20477000
|
|
BEGIN 20479000
|
|
SCANNER ~ DATAINDX; 20481000
|
|
GO TO XIT; 20483000
|
|
END; 20485000
|
|
IF T4.[1:29] = "4GOTO" THEN IF SYNTAX[I+1]!":0" THEN20485100
|
|
BEGIN 20485200
|
|
SCANNER ~ PROGINDX; COMMENT GO TO IS PROG,0; 20485300
|
|
GO TO XIT; 20485400
|
|
END; 20485500
|
|
IF T4.[1:35] = "8CONTI" THEN IF SYNTAX[I+1]=0 THEN 20485600
|
|
BEGIN 20485700
|
|
SCANNER ~ REMARKINDX; 20485800
|
|
GO TO XIT; 20485900
|
|
END; 20486000
|
|
IF T4.[1:35] = "7RESTO" THEN IF SYNTAX[I+1] = 0 THEN20487000
|
|
BEGIN 20489000
|
|
SCANNER ~ RESTOREINDX; 20491000
|
|
GO TO XIT; 20493000
|
|
END; 20495000
|
|
END; 20497000
|
|
IF T2 < 0 THEN IF T1 = IDLETTER OR T1 = ARRAYID 20499000
|
|
THEN SCANNER ~ REPLINDX ELSE 20501000
|
|
IF SYNTAX[SCANCODE] = ENDR THEN SCANNER ~ 1 20501100
|
|
ELSE GO TO CLASSERR; 20501200
|
|
COMMENT SCANNER = 1 DENOTES NULL STMT; 20501300
|
|
IF T2}0 THEN SCANNER~T2+T.KEYFIELD; 20503000
|
|
IF T1=IDLETTER OR T1=ARRAYID THEN SCANNER~REPLINDX; 20505000
|
|
END ELSE SCANNER ~ -1; COMMENT ACCEPT STATEMENT INPUT; 20507000
|
|
END SCAN RETURNED TRUE; 20509000
|
|
GO TO XIT; 20511000
|
|
BRKERR: ERRNUMBER~1; GO TO XIT; 20513000
|
|
COMMENT BRACKETS DO NOT MATCH; 20515000
|
|
PARENERR: ERRNUMBER~2; GO TO XIT; 20517000
|
|
COMMENT PARENTHESES DO NOT MATCH; 20519000
|
|
CLASSERR: ERRNUMBER~3; GO TO XIT; 20521000
|
|
COMMENT UNRECOGNIZABLE STATEMENT TYPE; 20523000
|
|
CLASSERR1:ERRNUMBER~4; GO TO XIT; 20525000
|
|
COMMENT STATEMENT IS ILLEGAL IN PROGRAM MODE; 20527000
|
|
CLASSERR2:ERRNUMBER~5; GO TO XIT; 20529000
|
|
COMMENT STATEMENT IS ILLEGAL IN CALCULATOR MODE; 20531000
|
|
TWOOPS: ERRNUMBER~6; 20533000
|
|
COMMENT ADJACENT OPERATORS; 20535000
|
|
XIT: 20537000
|
|
IF DEBUG THEN BEGIN 20539000
|
|
WRITE (PR[DBL], 10, SYNTAX[*]); 20541000
|
|
WRITE (PR[DBL], E, FOR T ~ SCANCODE STEP 1 UNTIL SCANCODE +9 20543000
|
|
DO SYNTAX[T]); 20545000
|
|
WRITE(PR[DBL],EE,FOR T~SCANCON STEP 1 UNTIL SCANCON+9 DO SYNTAX[T]); 20547000
|
|
WRITE (PR, DMPIDS); 20549000
|
|
WRITE (PR[DBL], 17, IDLIST[*]); 20551000
|
|
END DEBUG; 20553000
|
|
END SCANNER; 20555000
|
|
% ******************************************************************** 30001000
|
|
% ******************************************************************** 30003000
|
|
% ************* E N T E R D I R E C T O R Y ************************* 30005000
|
|
% ******************************************************************** 30007000
|
|
% ******************************************************************** 30009000
|
|
COMMENT 30011000
|
|
ENTER DIRECTORY INSERTS THREE CONTROL WORDS INTO THE FILE 30013000
|
|
DIRECTORY FOR EACH FILE; 30015000
|
|
COMMENT 30017000
|
|
DIRECTORY SEGMENTS ARE IDENTIFIED BY WORD 0 AND ARE CHAINED 30019000
|
|
BY WORD 1. THUS THERE ARE 9 ENTRIES PER SEGMENT. (THE 30021000
|
|
SECOND WORD IS UNUSED); 30023000
|
|
COMMENT 30025000
|
|
DIRECTORY FORMAT: 30027000
|
|
WORD 0: FILE SECURITY USER ID IF > 0, OR IF -1 THEN THE 30029000
|
|
FILE HAS BEEN PURGED AFTER A RESTART OR A QUIT. 30031000
|
|
WORD 1: DISK POINTER TO BEGINNING OF FILE. 30033000
|
|
WORD 2: CREATION TIME AND DATE. 30035000
|
|
[22:17] TIME OF DAY / 3600 30037000
|
|
[39:9] DATE (1 - 366); 30039000
|
|
COMMENT 30041000
|
|
WORDS 3-5 OF RECORD 0 ARE RESERVED, SEE INITIALIZE; 30043000
|
|
PROCEDURE ENTERDIRECTORY(INFO); ARRAY INFO[0]; 30045000
|
|
BEGIN DEFINE SEGMENT=#; COMMENT NEW SEGMENT HERE; 30047000
|
|
IF DENTRY~DENTRY+3=30 THEN 30049000
|
|
BEGIN 30051000
|
|
T~DLOC; 30053000
|
|
DLOC~(IF DLOC=0 THEN DIRSPACE ELSE DLOC+1); DENTRY~3; 30055000
|
|
DIRBUF[1]~DLOC; 30057000
|
|
WRITE(DSK[T],30,DIRBUF[*]); 30059000
|
|
FOR T~1 STEP 1 UNTIL 29 DO DIRBUF[T]~0; 30061000
|
|
END STARTING A NEW DIRECTORY SEGMENT; 30063000
|
|
DIRBUF[DENTRY]~USERID[USER]; COMMENT WORD 0 = USERID; 30065000
|
|
DIRBUF[DENTRY+1]~DISKPOINTER; COMMENT STARTING CARD LOCATION; 30067000
|
|
T7~TIME(0); 30069000
|
|
DIRBUF[DENTRY+2]~ENTIER(T7.[30:6]|100+T7.[36:6]|10+T7.[42:6])& 30071000
|
|
(TIME(1) DIV 3600) [22:31:17]; 30073000
|
|
COMMENT CREATION TIME AND DATE; 30075000
|
|
IF DLOC=0 AND DENTRY=6 THEN DIRBUF[3]~-1; 30077000
|
|
WRITE (DSK[DLOC],30,DIRBUF[*]); 30079000
|
|
COMMENT SAVE DIRECTORY ON DISK ALSO; 30081000
|
|
IF RESTART THEN IF REAL(RESTART)=1 THEN 30083000
|
|
BEGIN 30085000
|
|
READ(DSK[0],30,DIRBUF[*]); 30087000
|
|
DIRBUF[3]~-1; 30089000
|
|
WRITE(DSK[0],30,DIRBUF[*]); 30091000
|
|
READ(DSK[DLOC],30,DIRBUF[*]); 30093000
|
|
RESTART~BOOLEAN(3); 30095000
|
|
END; 30097000
|
|
INFO[FILEID]~DISKPOINTER&(DLOC|32+DENTRY)[3:18:30]; 30099000
|
|
END ENTERDIRECTORY; 30101000
|
|
% ******************************************************************** 30103000
|
|
% ******************************************************************** 30105000
|
|
% *************************** D I R E C T O R Y ********************** 30107000
|
|
% ******************************************************************** 30109000
|
|
% ******************************************************************** 30111000
|
|
COMMENT 30113000
|
|
DIRECTORY SEARCH ROUTINE. THIS ROUTINE SEARCHES THE DIRECTORY30115000
|
|
FOR AN ENTRY WITH A MATCHING USER ID. IF AN ENTRY IS FOUND, 30117000
|
|
THE PROCEDURE IS SET TO TRUE AND D1 AND D2 ARE SET TO WORDS 30119000
|
|
1 AND 2 OF THE CORRESPONDING DIRECTORY ENTRY; 30121000
|
|
BOOLEAN PROCEDURE DIRECTORY(UID,D1,D2); VALUE UID; REAL UID,D1,D2; 30123000
|
|
BEGIN ARRAY DBUF[0:29]; LABEL XIT; 30125000
|
|
T6~0; 30127000
|
|
T7~6; 30129000
|
|
DO BEGIN 30131000
|
|
READ(DSK[T6],30,DBUF[*]); 30133000
|
|
DO BEGIN 30135000
|
|
IF DBUF[T7]=UID THEN 30137000
|
|
BEGIN 30139000
|
|
DIRECTORY~TRUE; 30141000
|
|
D1~DBUF[T7+1]; 30143000
|
|
D2~DBUF[T7+2]; 30145000
|
|
GO TO XIT; 30147000
|
|
END A SUCCESSFUL DIRECTORY SEARCH; 30149000
|
|
END UNTIL T7~T7+3=30; 30151000
|
|
T7~3; 30153000
|
|
END UNTIL T6~DBUF[1]=0; 30155000
|
|
XIT: 30157000
|
|
END DIRECTORY; 30159000
|
|
% ******************************************************************** 40001000
|
|
% ******************************************************************** 40003000
|
|
% ************************** L O A D E R *****************************40005000
|
|
% ******************************************************************** 40007000
|
|
% ******************************************************************** 40009000
|
|
COMMENT 40011000
|
|
LOADER READS CARDS FROM THE SYSTEM DISK. IT PUTS CARD IMAGES 40013000
|
|
INTO THE SYNTAX[0] ARRAY. LOADLINK IS THE FILE NAME; 40015000
|
|
BOOLEAN PROCEDURE LOADER(INFO); ARRAY INFO[0]; 40017000
|
|
BEGIN 40019000
|
|
LABEL XIT; 40021000
|
|
STREAM PROCEDURE MOVEG(D); 40023000
|
|
BEGIN LOCAL T; 40025000
|
|
SI~D; SI~SI-1; 40027000
|
|
63(IF SC ! " " THEN JUMP OUT ELSE SI~SI-1); 40029000
|
|
SI~SI+1; T~SI; DI~T; DS~LIT "~"; 40031000
|
|
END MOVEG; 40033000
|
|
LOADER~TRUE; 40035000
|
|
IF T~INFO[FILELIMITS].[33:15]=0 THEN 40037000
|
|
BEGIN 40039000
|
|
COMMENT ABOUT TO LOAD FIRST CARD; 40041000
|
|
FILL LOADFILE WITH INFO[LOADLINK]; 40043000
|
|
SEARCH(LOADFILE,SYNTAX[*]); 40045000
|
|
IF SYNTAX[0] { 0 THEN 40047000
|
|
BEGIN 40049000
|
|
LOADER~FALSE; 40051000
|
|
GO TO XIT; 40053000
|
|
END NO FILE PRESENT; 40055000
|
|
INFO[FILELIMITS].[18:15]~SYNTAX[5]; COMMENT EOF POINTER; 40057000
|
|
END SEARCH AND INITIALIZE; 40059000
|
|
IF T>INFO[FILELIMITS].[18:15] THEN 40061000
|
|
BEGIN 40063000
|
|
LOADER~FALSE; 40065000
|
|
CLOSE(LOADFILE); 40067000
|
|
END ELSE 40069000
|
|
BEGIN 40071000
|
|
READ(LOADFILE,10,SYNTAX[*]); 40073000
|
|
MOVEG(SYNTAX[9]); 40075000
|
|
END LOADING CARD IMAGE; 40077000
|
|
INFO[FILELIMITS].[33:15]~T+1; 40079000
|
|
COMMENT BUMP RECORD POINTER; 40081000
|
|
XIT: 40083000
|
|
END LOADER; 40085000
|
|
% ******************************************************************** 40087000
|
|
% ******************************************************************** 40089000
|
|
% *********************** H E L P L O A D E R ********************** 40091000
|
|
% ******************************************************************** 40093000
|
|
% ******************************************************************** 40095000
|
|
COMMENT HELPLOADER IS CALLED BY INITIALIZE IF NO SAVFILE IS PRESENT. 40097000
|
|
IT READS THE DISK FILE HELPFIL/CARDS AND RE-FORMATS IT; 40099000
|
|
COMMENT CARD FORMAT: 40101000
|
|
A. LEFT JUSTIFIED STATEMENT NUMBER. 40103000
|
|
B. ONE TO FIVE BLANKS. 40105000
|
|
C. "REM" OPTIONAL (OR "REM "). 40107000
|
|
D. *<KEYWORD> OPTIONAL (<KEYWORD> = DO, IF, ETC.). 40109000
|
|
E. INFORMATION; 40111000
|
|
PROCEDURE HELPLOADER; 40113000
|
|
BEGIN 40115000
|
|
LABEL XIT; ARRAY LOADBUF[0:9]; 40117000
|
|
DEFINE HELP = LOADFILE#, TEMPDISKBUF = DISKBUF#; 40119000
|
|
DEFINE INFO = SYNTAX#; 40121000
|
|
LABEL LOOP; 40123000
|
|
STREAM PROCEDURE SETCOL73(D); 40125000
|
|
BEGIN LOCAL T; 40127000
|
|
SI ~ D; SI ~ SI+32; SI ~ SI+40; 40129000
|
|
63(SI ~ SI-1; IF SC ! " " THEN JUMP OUT); 40131000
|
|
SI ~ SI+1; T ~ SI; DI ~ T; 40133000
|
|
DS ~ LIT "~"; END SET COL 73; 40135000
|
|
REAL STREAM PROCEDURE FORMATHELP(S, D, PART, STP); 40137000
|
|
BEGIN LOCAL T, REM, T2; 40139000
|
|
DI ~ D; DS ~ 8 LIT " "; 8(DS ~ 8 LIT "~"); 40141000
|
|
SI ~ S; DI ~ PART; SI ~ SI+1; 40143000
|
|
IF SC = "." THEN BEGIN SI ~ S; DS ~ 1 OCT; END ELSE 40145000
|
|
BEGIN SI ~ S; DS ~ 2 OCT; END; 40147000
|
|
T ~ SI; SI ~ PART; DI ~ D; DS ~ 2 DEC; DS ~ 1 LIT "."; 40149000
|
|
DI ~ D; DS ~ 2 FILL; 40151000
|
|
SI ~ T; SI ~ SI+1;DI ~ D; DI ~ DI+3; 40153000
|
|
3(IF SC = " " THEN DS ~ LIT "0" ELSE DS ~ CHR); 40155000
|
|
T ~ SI; 40157000
|
|
SI ~ D; SI ~ SI+3; DI ~ STP; DS ~ 3 OCT; 40159000
|
|
SI ~ D; SI ~ SI+4; 2(IF SC = "0" THEN SI ~ SI+1 ELSE 40161000
|
|
BEGIN DI ~ D; DS ~ 6 LIT " "; JUMP OUT; END); 40163000
|
|
SI ~ T; SI ~ SI+1; 5(IF SC = " " THEN SI ~ SI+1); 40165000
|
|
DI ~ LOC REM; DS ~ 3 LIT "REM"; 40167000
|
|
DI ~ DI - 3; 40169000
|
|
IF 3 SC = DC THEN ELSE SI ~ SI-3; 40171000
|
|
T ~ SI; 40173000
|
|
2(IF SC = "*" THEN BEGIN 40175000
|
|
TALLY ~ 0; SI ~ SI+1; 40177000
|
|
DI ~ LOC FORMATHELP; DI ~ DI+1; 40179000
|
|
6( IF SC = ALPHA THEN BEGIN DS ~ CHR; TALLY ~ TALLY+1;END); 40181000
|
|
9(IF SC = ALPHA THEN BEGIN TALLY ~ TALLY+1; SI~SI+1; 40183000
|
|
END); 40185000
|
|
T2 ~ TALLY; T~SI; 40187000
|
|
SI ~ LOC T2; SI ~ SI+7; DI ~ LOC FORMATHELP; DS ~ CHR; 40189000
|
|
JUMP OUT; END ELSE SI ~ SI+1); 40191000
|
|
SI ~ T; DI ~ D; DI ~ DI+5; 40193000
|
|
63 (IF SC ! "~" THEN DS ~ CHR ELSE JUMP OUT); 40195000
|
|
END FORMATHELP; 40197000
|
|
% ----- 40199000
|
|
FILL HELP WITH "HELPFIL"; 40201000
|
|
SEARCH(HELP, LOADBUF[*]); 40203000
|
|
IF LOADBUF[0] < 0 THEN GO TO XIT; COMMENT NO FILE; 40205000
|
|
INFO[FILELIMITS] ~ 0&LOADBUF[5] [18:33:15]; 40207000
|
|
INFO[FILELIMITS].[3:15] ~ 3; 40209000
|
|
LOOP: 40211000
|
|
I~INFO[FILELIMITS].[33:15]; 40213000
|
|
READ(HELP,10,LOADBUF[*]); 40215000
|
|
SETCOL73(LOADBUF[0]); 40217000
|
|
HELPTABLE[I] ~ HELPTABLE[I+1] ~ 0; 40219000
|
|
HELPTABLE[I+1].CPARTNUMB ~ 99; 40221000
|
|
IF T4 ~ FORMATHELP(LOADBUF[0], TEMPDISKBUF[T6~(T5~INFO 40223000
|
|
[FILELIMITS].[3:15]) MOD 3 | 10], 40225000
|
|
T1, T2) ! 0 THEN BEGIN COMMENT FOUND A KEYWORD; 40227000
|
|
T ~ 1; 40229000
|
|
T4 ~ T4.[1:35]; 40231000
|
|
WHILE (T3~DICT[T].[1:35]) ! 0 AND T3 ! T4 DO T~T+1; 40233000
|
|
IF T3=T4 THEN HELPTABLE[I] ~ DICT[T].[36:12]; 40235000
|
|
IF T4 = "4DATA0" THEN HELPTABLE[I] ~ "38"; 40237000
|
|
END KEYWORD SEARCH; 40239000
|
|
HELPTABLE[I].CDISKADDR ~ T5; 40241000
|
|
HELPTABLE[I].CPARTNUMB ~ T1; 40243000
|
|
HELPTABLE[I].CSTEPNUMB ~ T2; 40245000
|
|
IF DEBUG THEN WRITE (PR[DBL],17,TEMPDISKBUF[*]); 40247000
|
|
IF T6=20 THEN WRITE(DSK[T5 DIV 3], 30, TEMPDISKBUF[*]); 40249000
|
|
INFO[FILELIMITS].[3:15] ~ T5+1; 40251000
|
|
IF (I~I+1) > INFO[FILELIMITS].[18:15] THEN BEGIN 40253000
|
|
CLOSE(HELP); 40255000
|
|
WRITE (DSK[ T5 DIV 3 ], 30, TEMPDISKBUF[*]); 40257000
|
|
FOR I ~ 0 STEP 1 UNTIL (HELPSIZE-29) DIV 30 DO 40259000
|
|
BEGIN FOR T2 ~ 0 STEP 1 UNTIL 29 DO 40261000
|
|
SYNTAX[T2] ~ HELPTABLE[I|30+T2] ; 40263000
|
|
WRITE(DSK[I+HELPARRAYSTART],30,SYNTAX[*]); END; 40265000
|
|
END ELSE BEGIN INFO[FILELIMITS].[33:15] ~ I; 40267000
|
|
GO TO LOOP; END; 40269000
|
|
XIT: 40271000
|
|
IF DEBUG THEN WRITE(PR[DBL],H1,FOR I~0 STEP 1 UNTIL HELPSIZE 40273000
|
|
DO HELPTABLE[I]); 40275000
|
|
END HELPLOADER; 40277000
|
|
COMMENT 40279000
|
|
HELP: TYPES ALL THE STATEMENTS IN PART 1 AND ALL LINES 40281000
|
|
WITH STEP NUMBER = 0. 40283000
|
|
HELP 5: TYPES ALL OF THE STATEMENTS IN PART 5. 40285000
|
|
HELP <KEYWORD> TYPES ALL THE STATEMENTS CONTAINING *<KEYWORD> ; 40287000
|
|
% ******************* TRANSLATOR DECLARATIONS ********************* 50001000
|
|
COMMENT THE FOLLOWING LIST DEFINES THE OP-CODES FOR EXECUTE; 50003000
|
|
DEFINE LITERAL = 1#; 50005000
|
|
DEFINE IDFETCH = 2#; 50007000
|
|
DEFINE CONSTANT = 3#; 50009000
|
|
DEFINE ARRAYFETCH = 4#; 50011000
|
|
DEFINE ARITHOPR=5#; 50013000
|
|
DEFINE RELTEST=6#; 50015000
|
|
DEFINE FUNCTCALL=7#; 50017000
|
|
DEFINE NDSTORE=8#; 50019000
|
|
DEFINE DSTORE=9#; 50021000
|
|
DEFINE NDSTOREA=10#; 50023000
|
|
DEFINE DSTOREA=11#; 50025000
|
|
DEFINE DOPART=12#; 50027000
|
|
DEFINE GOTO=13#; 50029000
|
|
DEFINE BRANCHBACK=14#; 50031000
|
|
DEFINE DECRSTACKANDSKIP=15#; 50033000
|
|
DEFINE INTRINSIC=16#; 50035000
|
|
DEFINE NEXTLINE=17#; 50037000
|
|
DEFINE IFNOTRUSKIP=18#; 50039000
|
|
DEFINE PRINTSTRING=19#; 50041000
|
|
DEFINE PRINTEXP=20#; 50043000
|
|
DEFINE STOP=21#; 50045000
|
|
DEFINE IDACCEPT=22#; 50047000
|
|
DEFINE ARRAYACCEPT=23#; 50049000
|
|
DEFINE FORTRANIF = 24#; 50051000
|
|
DEFINE FORM = 25#; 50053000
|
|
DEFINE STRINGFETCH = 26#; 50055000
|
|
DEFINE IDREADDATA = 27#; 50057000
|
|
DEFINE ARRAYREADDATA = 28#; 50059000
|
|
COMMENT END EXECUTE DEFINES; 50061000
|
|
BOOLEAN INHIBITCODE; 50063000
|
|
INTEGER SAV; 50065000
|
|
INTEGER INDEX; 50067000
|
|
DEFINE PDS=22#; 50069000
|
|
DEFINE HOLD=47#; 50071000
|
|
DEFINE OPSTACK=72#; 50073000
|
|
INTEGER PDSINDEX,HOLDINDEX,OSINDEX; 50075000
|
|
DEFINE NEXT=I~I+1#; 50077000
|
|
DEFINE BACKUP=I~I-1#; 50079000
|
|
INTEGER TEMPCODEINDEX; 50081000
|
|
DEFINE UNSIGNNUM=SYNTAX[I].[36:6]="7"#; 50083000
|
|
DEFINE ARITHOP=SYNTAX[I].[36:6]=10 OR SYNTAX[I].[36:6]="8"#; 50085000
|
|
DEFINE RELOP=SYNTAX[I].[36:6]=":"#; 50087000
|
|
DEFINE IDEN=SYNTAX[I].[36:6]="5"#; 50089000
|
|
DEFINE ARRAYIDEN=SYNTAX[I].[36:6]="6"#; 50091000
|
|
DEFINE FNCIDEN=SYNTAX[I].[36:6]="@"#; 50093000
|
|
DEFINE STRING=SYNTAX[I].[36:6]=15#; 50095000
|
|
DEFINE STMTNR=SYNTAX[I].[36:6]="7"#; 50097000
|
|
DEFINE QRIGHTBRACKET=SYNTAX[I]="91"#, 50099000
|
|
ENDCODE =SYNTAX[I]="00"#, 50101000
|
|
QTHEN =SYNTAX[I]=">5"#, 50103000
|
|
QPLUS =SYNTAX[I]="80"#, 50105000
|
|
QMINUS =SYNTAX[I]="81"#, 50107000
|
|
QLEFTPAREN =SYNTAX[I]="40"#, 50109000
|
|
QGO =SYNTAX[I]="30"#, 50111000
|
|
QREAD =SYNTAX[I]="21"#, 50113000
|
|
QPRINT =SYNTAX[I]="22"#, 50115000
|
|
QIF =SYNTAX[I]="36"#, 50117000
|
|
QDO =SYNTAX[I]="32"#, 50119000
|
|
QWHILE =SYNTAX[I]="33"#, 50121000
|
|
QUNTIL =SYNTAX[I]="34"#, 50123000
|
|
QDECLARE =SYNTAX[I]="35"#, 50125000
|
|
QCOMMA =SYNTAX[I]=">0"#, 50127000
|
|
QEQUAL =SYNTAX[I]=":0"#, 50129000
|
|
QELSE =SYNTAX[I]=">2"#, 50131000
|
|
QTO =SYNTAX[I]=">4"#, 50133000
|
|
QPART =SYNTAX[I]=">#"#, 50135000
|
|
QTIMES =SYNTAX[I]=">@"#, 50137000
|
|
QFOR =SYNTAX[I]=">:"#, 50139000
|
|
QBY =SYNTAX[I]=">1"#, 50141000
|
|
QSTOP =SYNTAX[I]="31"#, 50143000
|
|
QSET =SYNTAX[I]="20"#, 50145000
|
|
QSTEP =SYNTAX[I]=">6"#, 50147000
|
|
QYES =SYNTAX[I]=">7"#, 50149000
|
|
QNO =SYNTAX[I]=">}"#, 50151000
|
|
QFORM = SYNTAX[I]="37"#, 50153000
|
|
QRIGHTPAREN =SYNTAX[I]="90"#; 50155000
|
|
DEFINE PART=">#"#; 50157000
|
|
DEFINE QPLOT=IDEN AND IDENTIFIERS[USER,(T1~SYNTAX[I]. 50157100
|
|
[42:6])+T1].[1:29]="4PLOT"#; 50157200
|
|
DEFINE QTAB=IDEN AND IDENTIFIERS[USER,(T1~SYNTAX[I]. 50157300
|
|
[42:6])+T1].[1:23]="3TAB"#; 50157400
|
|
DEFINE QREPEAT = IDEN AND IDENTIFIERS[USER,(T1~SYNTAX[I].[42:6])+T1]. 50157500
|
|
[1:35] = "6REPEA"#; 50157600
|
|
DEFINE ELSECODE=">2"#; 50159000
|
|
ARRAY STACK[0:110]; 50161000
|
|
COMMENT THIS IS THE TRANSLATOR STACK, NOT STACK[USER,*]; 50163000
|
|
% ******************************************************************** 50165000
|
|
% ******************************************************************** 50167000
|
|
% ********************* T R A N S L A T O R ***************************50169000
|
|
% ******************************************************************** 50171000
|
|
% ******************************************************************** 50173000
|
|
PROCEDURE TRANSLATOR(INFO, IDENT, CODE, USERARRAY); 50175000
|
|
ARRAY INFO[0], IDENT[0], CODE[0], USERARRAY[0]; 50177000
|
|
COMMENT THIS PROCEDURE PRODUCES CODE IN THE CODE ARRAY; 50179000
|
|
COMMENT THE TRANSLATION ALGORITHM IS BASICLY RECURSIVE 50181000
|
|
DESCENT; 50183000
|
|
BEGIN 50185000
|
|
LABEL XIT; 50187000
|
|
LABEL EXPERR; MONITOR EXPOVR; 50189000
|
|
50191000
|
|
DEFINE LASTLINK = T4#; 50193000
|
|
PROCEDURE STORE(INFO, CODECELL); ARRAY INFO[0]; REAL CODECELL; 50195000
|
|
FORWARD; 50197000
|
|
% ------------ HIERARCHY ------------------------ 50199000
|
|
INTEGER PROCEDURE HIERARCHY(N); 50201000
|
|
INTEGER N; 50203000
|
|
BEGIN 50205000
|
|
FOR INDEX~0 STEP 2 UNTIL 20 DO IF STACK[INDEX] = N 50207000
|
|
THEN HIERARCHY~STACK[INDEX+1]; 50209000
|
|
END HIERARCHY; 50211000
|
|
%------------- PUSHDOWNI ------------------------ 50213000
|
|
PROCEDURE PUSHDOWNI; 50215000
|
|
BEGIN STACK[(PDSINDEX~PDSINDEX+1)-1]~I END; 50217000
|
|
%------------- POPUPI --------------------------- 50219000
|
|
INTEGER PROCEDURE POPUPI; 50221000
|
|
BEGIN POPUPI~STACK[PDSINDEX~PDSINDEX-1] END; 50223000
|
|
%------------- SAVEI ---------------------------- 50225000
|
|
PROCEDURE SAVEI; 50227000
|
|
BEGIN STACK[(HOLDINDEX~HOLDINDEX+1)-1]~I END; 50229000
|
|
%------------- RESTORE -------------------------- 50231000
|
|
INTEGER PROCEDURE RESTORE; 50233000
|
|
BEGIN RESTORE~STACK[HOLDINDEX~HOLDINDEX-1] END; 50235000
|
|
%------------- GENCODE -------------------------- 50237000
|
|
PROCEDURE GENCODE(TYPE,CODEWORD); 50239000
|
|
VALUE CODEWORD; 50241000
|
|
INTEGER TYPE,CODEWORD; 50243000
|
|
BEGIN 50245000
|
|
IF NOT INHIBITCODE THEN 50247000
|
|
IF TYPE!5 THEN SYNTAX[(TEMPCODEINDEX~TEMPCODEINDEX+1)-1]~0& 50249000
|
|
TYPE[36:42:6]&CODEWORD[42:42:6] ELSE 50251000
|
|
BEGIN 50253000
|
|
IF CODEWORD.[36:6]=10 THEN CODEWORD.[42:6]~CODEWORD.[42:6]+2; 50255000
|
|
SYNTAX[(TEMPCODEINDEX~TEMPCODEINDEX+1)-1]~0&TYPE[36:42:6]& 50257000
|
|
CODEWORD[42:42:6]; 50259000
|
|
END; 50261000
|
|
END GENCODE; 50263000
|
|
%------------- NCR ------------------------------ 50265000
|
|
INTEGER STREAM PROCEDURE NCR(S,N); VALUE N; 50267000
|
|
BEGIN SI~S; SI~SI+N; DI~LOC NCR; DI~DI+7; DS~1 CHR; END; 50269000
|
|
COMMENT RETURNS 1 CHARACTER; 50271000
|
|
%------------- SYNTAXERR ------------------------ 50273000
|
|
PROCEDURE SYNTAXERR(KEY); VALUE KEY; INTEGER KEY; 50275000
|
|
IF NOT ERRFLAG THEN BEGIN ERRFLAG~TRUE; ERRNUMBER~SYNTAXERRSTART+ 50277000
|
|
KEY; END; 50279000
|
|
%------------- GETDIM, SETDIM, OLDSIZE, SETTOUNDEFINED, MOVEARRAY ----- 50281000
|
|
INTEGER PROCEDURE GETDIM(L); VALUE L; INTEGER L; 50283000
|
|
COMMENT 50285000
|
|
THIS PROCEDURE IS USED BY ARRAYDECL TO RETURN AN 8-BIT 50287000
|
|
INTEGER USING AN INDEX INTO THE SCANCON TABLE; 50289000
|
|
BEGIN 50291000
|
|
INTG~0; 50293000
|
|
FOR C~1 STEP 1 UNTIL NCR(SYNTAX[SCANCON+L],0) DO 50295000
|
|
INTG~INTG|10+NCR(SYNTAX[SCANCON+L],C); 50297000
|
|
GETDIM~INTG; 50299000
|
|
% **** ADD A CHECK FOR INTEGERS 50301000
|
|
END GETDIM; 50303000
|
|
PROCEDURE SETDIM(ARRAYWORD,SIZE); 50305000
|
|
VALUE SIZE; REAL ARRAYWORD,SIZE; 50307000
|
|
IF NOT ERRFLAG THEN 50309000
|
|
BEGIN 50311000
|
|
IF T1=4 THEN COMMENT MORE THAN 4 DIMENSIONS; SYNTAXERR(2) ELSE 50313000
|
|
BEGIN 50315000
|
|
IF T1=0 THEN ARRAYWORD.[3:8]~SIZE ELSE 50317000
|
|
IF T1=1 THEN ARRAYWORD.[11:8]~SIZE ELSE 50319000
|
|
IF T1=2 THEN ARRAYWORD.[19:8]~SIZE ELSE 50321000
|
|
ARRAYWORD.[27:8]~SIZE; 50323000
|
|
T3~T3|SIZE; 50325000
|
|
T1~T1+1; 50327000
|
|
END; 50329000
|
|
END SETDIM; 50331000
|
|
INTEGER PROCEDURE OLDSIZE(WORD); VALUE WORD; INTEGER WORD; 50333000
|
|
OLDSIZE~(IF T5~WORD.[1:2]=0 THEN WORD.[3:8] ELSE IF T5=1 THEN WORD.[3:8]50335000
|
|
|WORD.[11:8] ELSE IF T5=2 THEN WORD.[3:8]|WORD.[11:8]|WORD.[19:8] 50337000
|
|
ELSE WORD.[3:8]|WORD.[11:8]|WORD.[19:8]|WORD.[27:8]); 50339000
|
|
STREAM PROCEDURE SETTOUNDEFINED(M,N,D); VALUE M,N; 50341000
|
|
BEGIN DI~D; M(32(DS~8 LIT "E")); N(DS~8 LIT "E"); END; 50343000
|
|
STREAM PROCEDURE MOVEARRAY(M,N,S,D); VALUE M,N; 50345000
|
|
BEGIN SI~S; DI~D; M(DS~ 32 WDS); N(DS~WDS); END; 50347000
|
|
BOOLEAN PROCEDURE EXPRESSION ; FORWARD; 50349000
|
|
% 50351000
|
|
%***********************************************************************50353000
|
|
% 50355000
|
|
COMMENT 50357000
|
|
<VARIABLE> ::= <IDEN> 50359000
|
|
<SUBSVAR> 50361000
|
|
<STRING> %%%50363000
|
|
<SUBSVAR> ::= <ARRAYIDEN> <SUBSLIST> ] 50365000
|
|
<SUBSLIST> ::= <EXPRESSION> 50367000
|
|
<EXPRESSION> , <SUBSLIST> 50369000
|
|
; 50371000
|
|
BOOLEAN PROCEDURE VARIABLE; 50373000
|
|
BEGIN REAL T,T1; 50375000
|
|
BOOLEAN PROCEDURE SUBSLIST(T,T1); REAL T,T1; 50377000
|
|
BEGIN 50379000
|
|
IF EXPRESSION THEN 50381000
|
|
BEGIN 50383000
|
|
T1~T1+1; 50385000
|
|
NEXT; 50387000
|
|
IF QCOMMA THEN 50389000
|
|
BEGIN 50391000
|
|
NEXT; 50393000
|
|
IF SUBSLIST(T,T1) THEN SUBSLIST~TRUE ELSE SUBSLIST~FALSE;50395000
|
|
END ELSE 50397000
|
|
BEGIN 50399000
|
|
BACKUP; 50401000
|
|
SUBSLIST~TRUE; 50403000
|
|
END; 50405000
|
|
END ELSE SUBSLIST~FALSE; 50407000
|
|
END SUBSLIST; 50409000
|
|
BOOLEAN PROCEDURE SUBSVAR(T,T1); REAL T,T1; 50411000
|
|
BEGIN 50413000
|
|
IF ARRAYIDEN THEN 50415000
|
|
BEGIN 50417000
|
|
SAVEI; 50419000
|
|
IF T~IDENTIFIERS[USER,SYNTAX[I].KEYFIELD|2+1]=UNDEFINED THEN 50421000
|
|
SYNTAXERR(0); COMMENT ARRAY NOT DECLARED; 50423000
|
|
T1~-1; 50425000
|
|
STACK[(OSINDEX~OSINDEX+1)-1]~"99"; 50427000
|
|
COMMENT MARK OPERATOR STACK; 50429000
|
|
NEXT; 50431000
|
|
IF SUBSLIST(T,T1) THEN 50433000
|
|
BEGIN 50435000
|
|
NEXT; 50437000
|
|
IF NOT ERRFLAG THEN IF T.[1:2]!T1 THEN SYNTAXERR(1); 50439000
|
|
COMMENT NR. OF DIMENSIONS DOES NOT AGREE WITH DECL; 50441000
|
|
IF QRIGHTBRACKET THEN 50443000
|
|
BEGIN 50445000
|
|
GENCODE(ARRAYFETCH,SYNTAX[RESTORE]); 50447000
|
|
OSINDEX~OSINDEX-1; 50449000
|
|
SUBSVAR~TRUE; 50451000
|
|
END ELSE SUBSVAR~FALSE; 50453000
|
|
END ELSE SUBSVAR~FALSE; 50455000
|
|
END ELSE SUBSVAR~FALSE; 50457000
|
|
END SUBSVAR; 50459000
|
|
IF IDEN THEN 50461000
|
|
BEGIN 50463000
|
|
GENCODE(IDFETCH,SYNTAX[I]); 50465000
|
|
VARIABLE~TRUE; 50467000
|
|
END ELSE IF STRING THEN 50469000
|
|
BEGIN 50471000
|
|
GENCODE(STRINGFETCH, SYNTAX[I]); 50473000
|
|
VARIABLE~TRUE; 50475000
|
|
END ELSE IF SUBSVAR(T,T1) THEN VARIABLE~TRUE ELSE VARIABLE~FALSE; 50477000
|
|
END VARIABLE; 50479000
|
|
% 50481000
|
|
%***********************************************************************50483000
|
|
% 50485000
|
|
COMMENT 50487000
|
|
<EXPRESSION> ::= <UNARYOP> <EXPR BODY> 50489000
|
|
<EXPR BODY> 50491000
|
|
<EXPR BODY> ::= <PRIMARY> 50493000
|
|
<PRIMARY> <ARITHOP> <EXPR BODY> 50495000
|
|
<PRIMARY> ::= <UNSIGNNUM> 50497000
|
|
( <EXPRESSION> ) 50499000
|
|
<FNCDESIG> 50501000
|
|
<VARIABLE> 50503000
|
|
<FNCDESIG> ::= <FNCIDEN> ( <EXPRESSION> ) 50505000
|
|
; 50507000
|
|
BOOLEAN PROCEDURE EXPRESSION; 50509000
|
|
BEGIN BOOLEAN OPERATORFLAG,PRIMARYFLAG; LABEL LOOP; 50511000
|
|
BOOLEAN PROCEDURE FNCDESIG; 50513000
|
|
BEGIN 50515000
|
|
IF FNCIDEN THEN 50517000
|
|
BEGIN 50519000
|
|
SAVEI; 50521000
|
|
NEXT; 50523000
|
|
COMMENT SKIP (; 50525000
|
|
50527000
|
|
STACK[(OSINDEX~OSINDEX+1)-1]~"99"; COMMENT MARK OPERATOR 50529000
|
|
STACK; 50531000
|
|
NEXT; 50533000
|
|
IF EXPRESSION THEN 50535000
|
|
BEGIN 50537000
|
|
NEXT; 50539000
|
|
IF QRIGHTPAREN THEN 50541000
|
|
BEGIN 50543000
|
|
GENCODE(FUNCTCALL,SYNTAX[RESTORE]); 50545000
|
|
OSINDEX~OSINDEX-1; 50547000
|
|
FNCDESIG~TRUE; 50549000
|
|
END ELSE 50551000
|
|
BEGIN 50553000
|
|
SYNTAXERR(9); 50555000
|
|
COMMENT MISSING ) IN FUNCTION CALL; 50557000
|
|
FNCDESIG~FALSE; 50559000
|
|
END; 50561000
|
|
END ELSE FNCDESIG~FALSE; 50563000
|
|
END ELSE FNCDESIG~FALSE; 50577000
|
|
END FNCDESIG; 50579000
|
|
BOOLEAN PROCEDURE PRIMARY; 50581000
|
|
BEGIN 50583000
|
|
IF UNSIGNNUM THEN 50585000
|
|
BEGIN 50587000
|
|
PRIMARY~TRUE; 50589000
|
|
GENCODE(CONSTANT,SYNTAX[I]); 50591000
|
|
END ELSE 50593000
|
|
IF QLEFTPAREN THEN 50595000
|
|
BEGIN 50597000
|
|
NEXT; 50599000
|
|
STACK[(OSINDEX~OSINDEX+1)-1]~"99";COMMENT MARK OPERATOR STACK;50601000
|
|
IF EXPRESSION THEN 50603000
|
|
BEGIN 50605000
|
|
NEXT; 50607000
|
|
IF QRIGHTPAREN THEN 50609000
|
|
BEGIN 50611000
|
|
PRIMARY~TRUE; 50613000
|
|
WHILE STACK[OSINDEX-1]!"99" DO GENCODE(ARITHOPR, 50615000
|
|
STACK[OSINDEX~OSINDEX-1]); 50617000
|
|
OSINDEX~OSINDEX-1;COMMENT ELIMINATE MARK STACK; 50619000
|
|
END ELSE 50621000
|
|
BEGIN 50623000
|
|
SYNTAXERR(8); 50625000
|
|
COMMENT MISSING ); 50627000
|
|
PRIMARY~FALSE; 50629000
|
|
END; 50631000
|
|
END ELSE PRIMARY~FALSE; 50633000
|
|
END ELSE 50635000
|
|
IF FNCDESIG OR VARIABLE THEN PRIMARY~TRUE ELSE PRIMARY~FALSE; 50637000
|
|
END PRIMARY; 50639000
|
|
IF QMINUS THEN STACK[(OSINDEX~OSINDEX+1)-1]~"#5"; COMMENT PLACE 50641000
|
|
UNARY MINUS SIGN IN OPERATOR STACK; 50643000
|
|
IF NOT(QPLUS OR QMINUS) THEN 50645000
|
|
IF ARITHOP THEN 50647000
|
|
BEGIN 50649000
|
|
SYNTAXERR(6); 50651000
|
|
COMMENT DANGLING OPERATOR; 50653000
|
|
EXPRESSION~FALSE; 50655000
|
|
END ELSE BACKUP; 50657000
|
|
OPERATORFLAG~TRUE; 50659000
|
|
LOOP:NEXT; 50661000
|
|
IF ARITHOP THEN 50663000
|
|
BEGIN 50665000
|
|
OPERATORFLAG~PRIMARYFLAG~TRUE; 50667000
|
|
WHILE OSINDEX!OPSTACK AND STACK[OSINDEX-1]!"99" AND HIERARCHY(50669000
|
|
SYNTAX[I]){HIERARCHY(STACK[OSINDEX-1]) DO GENCODE( 50671000
|
|
ARITHOPR,STACK[ OSINDEX~OSINDEX-1]); 50673000
|
|
STACK[(OSINDEX~OSINDEX+1)-1]~SYNTAX[I]; 50675000
|
|
COMMENT PLACE THE CURRENT OPERATOR ON THE STACK AFTER FIRST 50677000
|
|
REMOVING ALL OPERATORS WITH EQUAL OR GREATER HIERARCHY; 50679000
|
|
GO TO LOOP; 50681000
|
|
END HANDLING AN OPERATOR; 50683000
|
|
IF OPERATORFLAG THEN IF PRIMARY THEN 50693000
|
|
BEGIN 50695000
|
|
PRIMARYFLAG~TRUE; 50697000
|
|
OPERATORFLAG~FALSE; 50699000
|
|
GO TO LOOP; 50701000
|
|
END HANDLING A VALID PRIMARY; 50703000
|
|
WHILE OSINDEX!OPSTACK AND STACK[OSINDEX-1]!"99" DO GENCODE(ARITHOPR50705000
|
|
,STACK[OSINDEX~OSINDEX-1]); 50707000
|
|
IF NOT PRIMARYFLAG THEN EXPRESSION~FALSE ELSE 50709000
|
|
IF OPERATORFLAG THEN 50711000
|
|
BEGIN 50713000
|
|
SYNTAXERR(6); 50715000
|
|
COMMENT DANGLING OPERATOR; 50717000
|
|
EXPRESSION~FALSE; 50719000
|
|
END ELSE 50721000
|
|
BEGIN 50723000
|
|
EXPRESSION~TRUE; 50725000
|
|
BACKUP; 50727000
|
|
END; 50729000
|
|
END EXPRESSION; 50731000
|
|
% 50733000
|
|
%***********************************************************************50735000
|
|
% 50737000
|
|
COMMENT 50739000
|
|
<GOSTMT> ::= GO <STMTNR> 50741000
|
|
GO TO <STMTNR> 50743000
|
|
GO TO STEP <STMTNR> 50745000
|
|
; 50747000
|
|
BOOLEAN PROCEDURE GOSTMT; 50749000
|
|
BEGIN 50751000
|
|
INHIBITCODE~FALSE; 50753000
|
|
IF QGO OR (IDEN AND IDENTIFIERS[USER,(T1~SYNTAX[I].[42:6])+T1]. 50755000
|
|
[1:29] = "4GOTO") THEN 5075510
|
|
BEGIN 50757000
|
|
NEXT; 50759000
|
|
IF QTO THEN NEXT; 50761000
|
|
IF QSTEP THEN NEXT; 50763000
|
|
IF STMTNR THEN 50765000
|
|
BEGIN 50767000
|
|
GENCODE(GOTO,SYNTAX[I]); 50769000
|
|
GENCODE(1,1); 50771000
|
|
GENCODE(NEXTLINE,0); 50773000
|
|
GOSTMT~TRUE; 50775000
|
|
END ELSE 50777000
|
|
BEGIN 50779000
|
|
SYNTAXERR(11); COMMENT MISSING STATEMENT NUMBER; 50781000
|
|
GOSTMT~FALSE; 50783000
|
|
END; 50785000
|
|
END ELSE GOSTMT~FALSE; 50787000
|
|
END GOSTMT; 50789000
|
|
% 50791000
|
|
%***********************************************************************50793000
|
|
% 50795000
|
|
BOOLEAN PROCEDURE REPLSTMT; 50797000
|
|
BEGIN 50799000
|
|
BOOLEAN PROCEDURE LEFTPARTLIST; 50801000
|
|
BEGIN 50803000
|
|
PUSHDOWNI; 50805000
|
|
IF VARIABLE THEN 50807000
|
|
BEGIN 50809000
|
|
NEXT; 50811000
|
|
IF QCOMMA THEN 50813000
|
|
BEGIN 50815000
|
|
NEXT; 50817000
|
|
IF LEFTPARTLIST THEN LEFTPARTLIST~TRUE 50819000
|
|
ELSE LEFTPARTLIST~FALSE; 50821000
|
|
END ELSE 50823000
|
|
BEGIN 50825000
|
|
BACKUP; 50827000
|
|
LEFTPARTLIST~TRUE; 50829000
|
|
END; 50831000
|
|
END ELSE 50833000
|
|
BEGIN 50835000
|
|
SYNTAXERR(26); COMMENT INVALID REPLACEMENT STMT; 50837000
|
|
LEFTPARTLIST~FALSE; 50839000
|
|
END; 50841000
|
|
END LEFTPARTLIST; 50843000
|
|
IF I { SCANCODE+1 THEN 50845000
|
|
IF IDEN THEN 50847000
|
|
BEGIN 50849000
|
|
NEXT; 50851000
|
|
IF NOT (QEQUAL OR QCOMMA) THEN IF NOT ERRFLAG THEN 50853000
|
|
BEGIN 50855000
|
|
ERRNUMBER~3; 50857000
|
|
ERRFLAG~TRUE; 50859000
|
|
END ELSE ELSE BACKUP; 50861000
|
|
END CHECKING FOR POSSIBLE MISSPELLING OF A KEYWORD; 50863000
|
|
IF QSET THEN NEXT; 50865000
|
|
INHIBITCODE~TRUE; 50867000
|
|
IF LEFTPARTLIST THEN 50869000
|
|
BEGIN 50871000
|
|
NEXT; 50873000
|
|
IF QEQUAL THEN 50875000
|
|
BEGIN 50877000
|
|
INHIBITCODE~FALSE; 50879000
|
|
NEXT; 50881000
|
|
IF EXPRESSION THEN 50883000
|
|
BEGIN 50885000
|
|
SAVEI; 50887000
|
|
REPLSTMT~TRUE; 50889000
|
|
WHILE PDSINDEX!PDS DO BEGIN 50891000
|
|
I~POPUPI; 50893000
|
|
OK~VARIABLE; 50895000
|
|
SYNTAX[TEMPCODEINDEX-1].[36:6]~ 50897000
|
|
(IF SYNTAX[TEMPCODEINDEX-1].[36:6]=IDFETCH 50899000
|
|
THEN NDSTORE ELSE NDSTOREA); 50901000
|
|
COMMENT GENERATE THE ID AND ARRAY STORES IN 50903000
|
|
REVERSE ORDER BY GENERATING FETCHES AND 50905000
|
|
CHANGING TO STORES; 50907000
|
|
END; 50909000
|
|
SYNTAX[TEMPCODEINDEX-1].[36:6]~SYNTAX[TEMPCODEINDEX-1]. 50911000
|
|
[36:6]+1; 50913000
|
|
GENCODE(NEXTLINE,0); 50915000
|
|
I~RESTORE; 50917000
|
|
END ELSE 50919000
|
|
BEGIN 50921000
|
|
REPLSTMT~FALSE; 50923000
|
|
SYNTAXERR(26); 50925000
|
|
END; 50927000
|
|
END ELSE 50929000
|
|
BEGIN 50931000
|
|
REPLSTMT~FALSE; 50933000
|
|
ERRFLAG ~ TRUE; ERRNUMBER ~ 3; COMMENT UNRECOGNIZABLE STMT; 50935000
|
|
END; 50937000
|
|
END ELSE REPLSTMT~FALSE; 50939000
|
|
END REPLSTMT; 50941000
|
|
% 50943000
|
|
%***********************************************************************50945000
|
|
% 50947000
|
|
COMMENT 50949000
|
|
<DOSTMT> ::= <DOPART> 50951000
|
|
<DOPART> <TIMESCLAUSE> 50953000
|
|
<DOPART> <FORCLAUSE> 50955000
|
|
<DOPART> <WHILECLAUSE> 50957000
|
|
<DOPART> <UNTILCLAUSE> 50959000
|
|
<DOPART> ::= DO PART <STMTNR> 50961000
|
|
DO PART <STMTNR> , 50963000
|
|
<TIMESCLAUSE> ::= <EXPRESSION> TIMES 50965000
|
|
<FORCLAUSE> ::= FOR <FORBODY> 50967000
|
|
<FORBODY> 50969000
|
|
<FORBODY> ::= <REPLSTMT> <TO> <EXPRESSION> 50971000
|
|
<REPLSTMT> <TO> <EXPRESSION> <BY> <EXPR.> 50973000
|
|
<TO> ::= , 50975000
|
|
TO 50977000
|
|
UNTIL 50979000
|
|
<BY> ::= , 50981000
|
|
BY 50983000
|
|
STEP 50985000
|
|
<WHILECLAUSE> ::= WHILE <RELATION> 50987000
|
|
<RELATION> ::= <EXPRESSION> <RELOP> <EXPRESSION> 50989000
|
|
<UNTILCLAUSE> ::= UNTIL <RELATION> 50991000
|
|
; 50993000
|
|
BOOLEAN PROCEDURE DOSTMT; 50995000
|
|
BEGIN 50997000
|
|
BOOLEAN PROCEDURE DOPRT; 50999000
|
|
BEGIN 51001000
|
|
IF QDO THEN 51003000
|
|
BEGIN 51005000
|
|
NEXT; 51007000
|
|
IF QPART THEN 51009000
|
|
BEGIN 51011000
|
|
NEXT; 51013000
|
|
IF STMTNR THEN 51015000
|
|
BEGIN 51017000
|
|
SAVEI; 51019000
|
|
NEXT; 51021000
|
|
IF NOT QCOMMA THEN BACKUP; 51023000
|
|
DOPRT~TRUE; 51025000
|
|
END ELSE 51027000
|
|
BEGIN 51029000
|
|
SYNTAXERR(14); COMMENT MISSING PART NUMBER; 51031000
|
|
DOPRT~FALSE; 51033000
|
|
END; 51035000
|
|
END ELSE 51037000
|
|
BEGIN 51039000
|
|
SYNTAXERR(15); COMMENT "PART" MISSING; 51041000
|
|
DOPRT~FALSE; 51043000
|
|
END; 51045000
|
|
END ELSE DOPRT~FALSE; 51047000
|
|
END DOPRT; 51049000
|
|
BOOLEAN PROCEDURE RELATION; 51051000
|
|
BEGIN 51053000
|
|
INHIBITCODE~FALSE; 51055000
|
|
IF EXPRESSION THEN 51057000
|
|
BEGIN 51059000
|
|
NEXT; 51061000
|
|
IF RELOP THEN 51063000
|
|
BEGIN 51065000
|
|
SAVEI; 51067000
|
|
NEXT; 51069000
|
|
IF EXPRESSION THEN 51071000
|
|
BEGIN 51073000
|
|
RELATION~TRUE; 51075000
|
|
GENCODE(RELTEST,SYNTAX[RESTORE]); 51077000
|
|
END ELSE RELATION~FALSE; 51079000
|
|
END ELSE 51081000
|
|
BEGIN 51083000
|
|
SYNTAXERR(16); COMMENT RELATIONAL OPERATOR IS MISSING; 51085000
|
|
RELATION~FALSE; 51087000
|
|
END; 51089000
|
|
END ELSE RELATION~FALSE; 51091000
|
|
END RELATION; 51093000
|
|
BOOLEAN PROCEDURE TIMESCLAUSE; 51095000
|
|
BEGIN 51097000
|
|
IF EXPRESSION THEN 51099000
|
|
BEGIN 51101000
|
|
NEXT; 51103000
|
|
IF QTIMES THEN TIMESCLAUSE~TRUE ELSE TIMESCLAUSE~FALSE; 51105000
|
|
END ELSE TIMESCLAUSE~FALSE; 51107000
|
|
END TIMESCLAUSE; 51109000
|
|
BOOLEAN PROCEDURE WHILECLAUSE; 51111000
|
|
BEGIN 51113000
|
|
IF QWHILE THEN 51115000
|
|
BEGIN 51117000
|
|
NEXT; 51119000
|
|
IF RELATION THEN WHILECLAUSE~TRUE ELSE WHILECLAUSE~FALSE; 51121000
|
|
END ELSE WHILECLAUSE~FALSE; 51123000
|
|
END WHILECLAUSE; 51125000
|
|
BOOLEAN PROCEDURE UNTILCLAUSE; 51127000
|
|
BEGIN 51129000
|
|
IF QUNTIL THEN 51131000
|
|
BEGIN 51133000
|
|
NEXT; 51135000
|
|
IF RELATION THEN UNTILCLAUSE~TRUE ELSE UNTILCLAUSE~FALSE; 51137000
|
|
END ELSE UNTILCLAUSE~FALSE; 51139000
|
|
END UNTILCLAUSE; 51141000
|
|
BOOLEAN PROCEDURE FORCLAUSE; 51143000
|
|
BEGIN 51145000
|
|
IF QFOR THEN 51147000
|
|
NEXT; 51149000
|
|
T1~I; 51151000
|
|
IF REPLSTMT THEN 51153000
|
|
BEGIN 51155000
|
|
SAV~TEMPCODEINDEX~TEMPCODEINDEX-1; 51157000
|
|
T~I; 51159000
|
|
I~T1; 51161000
|
|
OK~VARIABLE; 51163000
|
|
I~T; 51165000
|
|
NEXT; 51167000
|
|
IF QCOMMA OR QTO OR QUNTIL THEN NEXT; 51169000
|
|
IF EXPRESSION THEN 51171000
|
|
BEGIN 51173000
|
|
NEXT; 51175000
|
|
IF QCOMMA OR QBY OR QSTEP THEN NEXT; 51177000
|
|
T~I; 51179000
|
|
IF T7~SYNTAX[I]=ENDR OR T7=ELSECODE OR EXPRESSION 51181000
|
|
THEN 51183000
|
|
BEGIN 51185000
|
|
IF T7~SYNTAX[T]=ENDR OR T7=ELSECODE THEN 51187000
|
|
GENCODE(LITERAL,1); 51189000
|
|
GENCODE(LITERAL,0); 51191000
|
|
GENCODE(RELTEST,4); 51193000
|
|
GENCODE(IFNOTRUSKIP,4); 51195000
|
|
GENCODE(RELTEST,2); 51197000
|
|
GENCODE(IFNOTRUSKIP,5); 51199000
|
|
GENCODE(NEXTLINE,0); 51201000
|
|
GENCODE(RELTEST,3); 51203000
|
|
GENCODE(IFNOTRUSKIP,2); 51205000
|
|
GENCODE(NEXTLINE,0); 51207000
|
|
GENCODE(DOPART,SYNTAX[RESTORE]); 51209000
|
|
GENCODE(1,1); 51211000
|
|
I~T1; 51213000
|
|
OK~VARIABLE; 51215000
|
|
I~T; 51217000
|
|
IF T7~SYNTAX[I]=ENDR OR T7=ELSECODE THEN 51219000
|
|
GENCODE(LITERAL,1) ELSE OK~EXPRESSION; 51221000
|
|
GENCODE(ARITHOPR,0); 51223000
|
|
I~T1; 51225000
|
|
OK~VARIABLE; 51227000
|
|
SYNTAX[TEMPCODEINDEX-1].[36:6]~(IF SYNTAX[ 51229000
|
|
TEMPCODEINDEX-1].[36:6]=IDFETCH THEN 51231000
|
|
DSTORE ELSE DSTOREA); 51233000
|
|
GENCODE(BRANCHBACK,TEMPCODEINDEX-SAV); 51235000
|
|
I~T; 51237000
|
|
IF T7~SYNTAX[I]=ENDR OR T7=ELSECODE THEN I~I-1 51239000
|
|
ELSE BEGIN 51241000
|
|
INHIBITCODE~TRUE; 51243000
|
|
OK~EXPRESSION; 51245000
|
|
END; 51247000
|
|
FORCLAUSE~TRUE; 51249000
|
|
END ELSE 51251000
|
|
BEGIN 51253000
|
|
SYNTAXERR(17); COMMENT INVALID FOR CLAUSE; 51255000
|
|
FORCLAUSE~FALSE; 51257000
|
|
END; 51259000
|
|
END ELSE 51261000
|
|
BEGIN 51263000
|
|
SYNTAXERR(17); COMMENT INVALID FOR CLAUSE; 51265000
|
|
FORCLAUSE~FALSE; 51267000
|
|
END; 51269000
|
|
END ELSE FORCLAUSE~FALSE; 51271000
|
|
END FORCLAUSE; 51273000
|
|
IF DOPRT THEN 51275000
|
|
BEGIN 51277000
|
|
NEXT; 51279000
|
|
T2~I; 51281000
|
|
T4~TEMPCODEINDEX; 51283000
|
|
INHIBITCODE~FALSE; 51285000
|
|
IF T7~SYNTAX[I]=ENDR OR T7=ELSECODE THEN 51287000
|
|
BEGIN 51289000
|
|
GENCODE(DOPART,SYNTAX[RESTORE]); 51291000
|
|
GENCODE(1,1); 51293000
|
|
GENCODE(NEXTLINE,0); 51295000
|
|
BACKUP; 51297000
|
|
DOSTMT~TRUE; 51299000
|
|
END ELSE 51301000
|
|
IF TIMESCLAUSE THEN 51303000
|
|
BEGIN 51305000
|
|
GENCODE(INTRINSIC,1); 51307000
|
|
GENCODE(DECRSTACKANDSKIP,0); 51309000
|
|
GENCODE(NEXTLINE,0); 51311000
|
|
GENCODE(DOPART,SYNTAX[RESTORE]); 51313000
|
|
GENCODE(1,1); 51315000
|
|
GENCODE(BRANCHBACK,4); 51317000
|
|
DOSTMT~TRUE; 51319000
|
|
END ELSE 51321000
|
|
BEGIN 51323000
|
|
I~T2; 51325000
|
|
TEMPCODEINDEX~T4; 51327000
|
|
IF FORCLAUSE THEN DOSTMT~TRUE ELSE 51329000
|
|
BEGIN 51331000
|
|
I~T2; 51333000
|
|
IF ERRNUMBER = SYNTAXERRSTART+26 THEN 51335000
|
|
BEGIN 51337000
|
|
ERRNUMBER~0; ERRFLAG~FALSE; COMMENT 51339000
|
|
FORCLAUSE CALL TO REPLSTMT CAUSES ERRFLAG; 51341000
|
|
END; 51343000
|
|
SAV~TEMPCODEINDEX; 51345000
|
|
INHIBITCODE~FALSE; 51347000
|
|
GENCODE(DOPART,SYNTAX[RESTORE]); 51349000
|
|
GENCODE(1,1); 51351000
|
|
IF WHILECLAUSE THEN 51353000
|
|
BEGIN 51355000
|
|
GENCODE(IFNOTRUSKIP,2); 51357000
|
|
GENCODE(BRANCHBACK,TEMPCODEINDEX-SAV); 51359000
|
|
GENCODE(NEXTLINE,0); 51361000
|
|
DOSTMT~TRUE; 51363000
|
|
END ELSE 51365000
|
|
BEGIN 51367000
|
|
I~T2; 51369000
|
|
IF UNTILCLAUSE THEN 51371000
|
|
BEGIN 51373000
|
|
GENCODE(IFNOTRUSKIP,2); 51375000
|
|
GENCODE(NEXTLINE,0); 51377000
|
|
GENCODE(BRANCHBACK,TEMPCODEINDEX-SAV); 51379000
|
|
DOSTMT~TRUE; 51381000
|
|
END ELSE 51383000
|
|
BEGIN 51385000
|
|
SYNTAXERR(18); COMMENT ILLEGAL FORM OF THE51387000
|
|
DO STATEMENT HAS BEEN USED; 51389000
|
|
DOSTMT~FALSE; 51391000
|
|
END; 51393000
|
|
END; 51395000
|
|
END; 51397000
|
|
END; 51399000
|
|
END ELSE DOSTMT~FALSE; 51401000
|
|
END DOSTMT; 51403000
|
|
% 51405000
|
|
%***********************************************************************51407000
|
|
% 51409000
|
|
COMMENT 51411000
|
|
<INPUTSTMT> ::= READ <VARLIST> 51413000
|
|
READ DATA <VARLIST> 51415000
|
|
READ 51417000
|
|
<VARLIST> ::= <VARIABLE> 51419000
|
|
<VARIABLE> , <VARLIST> 51421000
|
|
; 51423000
|
|
BOOLEAN PROCEDURE INPUTSTMT(INFO); ARRAY INFO[0]; 51425000
|
|
BEGIN 51427000
|
|
BOOLEAN PROCEDURE VARLIST; 51429000
|
|
BEGIN 51431000
|
|
IF VARIABLE THEN 51433000
|
|
BEGIN 51435000
|
|
SYNTAX[TEMPCODEINDEX-1].[36:6]~IF READDATA THEN(IF SYNTAX[ 51437000
|
|
TEMPCODEINDEX-1].[36:6] = IDFETCH THEN IDREADDATA ELSE 51439000
|
|
ARRAYREADDATA) ELSE (IF SYNTAX[TEMPCODEINDEX-1].[36:6] = 51441000
|
|
IDFETCH THEN IDACCEPT ELSE ARRAYACCEPT); 51443000
|
|
COMMENT CHANGE ID FETCH GENERATED BY VARIABLE TO AN ID ACCEPT;51445000
|
|
NEXT; 51447000
|
|
IF QCOMMA THEN 51449000
|
|
BEGIN 51451000
|
|
NEXT; 51453000
|
|
IF VARLIST THEN VARLIST~TRUE ELSE VARLIST~FALSE; 51455000
|
|
END ELSE 51457000
|
|
BEGIN 51459000
|
|
BACKUP; 51461000
|
|
VARLIST~TRUE; 51463000
|
|
END; 51465000
|
|
END ELSE VARLIST~FALSE; 51467000
|
|
END VARLIST; 51469000
|
|
INHIBITCODE~FALSE; 51471000
|
|
READDATA~FALSE; 51473000
|
|
IF QREAD THEN 51475000
|
|
BEGIN 51477000
|
|
NEXT; 51479000
|
|
IF ENDCODE OR QELSE THEN 51481000
|
|
BEGIN 51483000
|
|
INPUTSTMT~TRUE; 51485000
|
|
GENCODE(INTRINSIC,2); 51487000
|
|
GENCODE(NEXTLINE,0); 51489000
|
|
END READALPHA ELSE 51491000
|
|
BEGIN 51493000
|
|
COMMENT CHECK FOR READ DATA <VARIABLE>; 51495000
|
|
IF IDEN AND IDENTIFIERS[USER,(T~SYNTAX[I].[42:6])+T].[ 51497000
|
|
1:29] = "4DATA" AND (T~SYNTAX[I+1].[36:6]="5" OR 51499000
|
|
T="6") THEN 51501000
|
|
BEGIN 51503000
|
|
NEXT; 51505000
|
|
INFO[DATAST]~1; 51507000
|
|
READDATA~TRUE; 51509000
|
|
END; 51511000
|
|
IF VARLIST THEN 51513000
|
|
BEGIN 51515000
|
|
GENCODE(NEXTLINE,0); 51517000
|
|
INPUTSTMT~TRUE; 51519000
|
|
END ELSE INPUTSTMT~FALSE; 51521000
|
|
END; 51523000
|
|
END ELSE INPUTSTMT~FALSE; 51525000
|
|
END INPUTSTMT; 51527000
|
|
% 51529000
|
|
%***********************************************************************51531000
|
|
% 51533000
|
|
COMMENT 51535000
|
|
<UNTILSTMT> ::= UNTIL <RELATION> <DOCLAUSE> 51537000
|
|
<DOCLAUSE> ::= , DO PART <STMTNR> 51539000
|
|
DO PART <STMTNR> 51541000
|
|
<WHILESTMT> ::= WHILE <RELATION> <DOCLAUSE> 51543000
|
|
; 51545000
|
|
BOOLEAN PROCEDURE RELATION; 51547000
|
|
BEGIN 51549000
|
|
INHIBITCODE~FALSE; 51551000
|
|
IF EXPRESSION THEN 51553000
|
|
BEGIN 51555000
|
|
NEXT; 51557000
|
|
IF RELOP THEN 51559000
|
|
BEGIN 51561000
|
|
SAVEI; 51563000
|
|
NEXT; 51565000
|
|
IF EXPRESSION THEN 51567000
|
|
BEGIN 51569000
|
|
RELATION~TRUE; 51571000
|
|
GENCODE(RELTEST,SYNTAX[RESTORE]); 51573000
|
|
END ELSE RELATION~FALSE; 51575000
|
|
END ELSE 51577000
|
|
BEGIN 51579000
|
|
SYNTAXERR(16); COMMENT MISSING RELATIONAL OPERATOR; 51581000
|
|
RELATION~FALSE; 51583000
|
|
END; 51585000
|
|
END ELSE RELATION~FALSE; 51587000
|
|
END RELATION; 51589000
|
|
BOOLEAN PROCEDURE DOCLAUSE; 51591000
|
|
BEGIN 51593000
|
|
IF QCOMMA THEN NEXT; 51595000
|
|
IF QDO THEN 51597000
|
|
BEGIN 51599000
|
|
NEXT; 51601000
|
|
IF QPART THEN 51603000
|
|
BEGIN 51605000
|
|
NEXT; 51607000
|
|
IF STMTNR THEN 51609000
|
|
BEGIN 51611000
|
|
GENCODE(DOPART,SYNTAX[I]); 51613000
|
|
GENCODE(1,1); 51615000
|
|
GENCODE(BRANCHBACK,TEMPCODEINDEX-SAV); 51617000
|
|
DOCLAUSE~TRUE; 51619000
|
|
END ELSE 51621000
|
|
BEGIN 51623000
|
|
SYNTAXERR(14); COMMENT MISSING PART NUMBER; 51625000
|
|
DOCLAUSE~FALSE; 51627000
|
|
END; 51629000
|
|
END ELSE 51631000
|
|
BEGIN 51633000
|
|
SYNTAXERR(15); COMMENT "PART" MISSING; 51635000
|
|
DOCLAUSE~FALSE; 51637000
|
|
END; 51639000
|
|
END ELSE 51641000
|
|
BEGIN 51643000
|
|
SYNTAXERR(19); COMMENT "DO" MISSING; 51645000
|
|
DOCLAUSE~FALSE; 51647000
|
|
END; 51649000
|
|
END DOCLAUSE; 51651000
|
|
BOOLEAN PROCEDURE UNTILSTMT; 51653000
|
|
BEGIN 51655000
|
|
SAV~TEMPCODEINDEX; 51657000
|
|
IF QUNTIL THEN 51659000
|
|
BEGIN 51661000
|
|
NEXT; 51663000
|
|
IF RELATION THEN 51665000
|
|
BEGIN 51667000
|
|
NEXT; 51669000
|
|
GENCODE(IFNOTRUSKIP,2); 51671000
|
|
GENCODE(NEXTLINE,0); 51673000
|
|
IF DOCLAUSE THEN UNTILSTMT~TRUE ELSE UNTILSTMT~FALSE; 51675000
|
|
END ELSE UNTILSTMT~FALSE; 51677000
|
|
END ELSE UNTILSTMT~FALSE; 51679000
|
|
END UNTILSTMT; 51681000
|
|
BOOLEAN PROCEDURE WHILESTMT; 51683000
|
|
BEGIN 51685000
|
|
SAV~TEMPCODEINDEX; 51687000
|
|
IF QWHILE THEN 51689000
|
|
BEGIN 51691000
|
|
NEXT; 51693000
|
|
IF RELATION THEN 51695000
|
|
BEGIN 51697000
|
|
NEXT; 51699000
|
|
GENCODE(IFNOTRUSKIP,4); 51701000
|
|
IF DOCLAUSE THEN 51703000
|
|
BEGIN 51705000
|
|
GENCODE(NEXTLINE,0); 51707000
|
|
WHILESTMT~TRUE; 51709000
|
|
END ELSE WHILESTMT~FALSE; 51711000
|
|
END ELSE WHILESTMT~FALSE; 51713000
|
|
END ELSE WHILESTMT~FALSE; 51715000
|
|
END WHILESTMT; 51717000
|
|
% 51719000
|
|
%***********************************************************************51721000
|
|
% 51723000
|
|
COMMENT 51725000
|
|
<PRINTSTMT> ::= PRINT FORM <STMTNR> <EXPRLIST> 51727000
|
|
PRINT FORM <STMTNR> , <EXPRLIST> 51727100
|
|
PRINT <PRINTLIST> 51729000
|
|
<EXPRLIST> ::= <EXPRESSION> 51731000
|
|
<EXPRESSION> , <EXPRLIST> 51733000
|
|
<PRINTLIST> ::= <PRINTELEM> 51735000
|
|
<PRINTELEM> , <PRINTLIST> 51737000
|
|
<PRINTELEM> ::= <EXPRESSION> 51739000
|
|
<STRING> 51741000
|
|
PLOT ( <EXPRESSION> , <STRING> ) 51741100
|
|
PLOT ( <STRING> , <EXPRESSION> ) 51741200
|
|
TAB ( <EXPRESSION> ) 51741300
|
|
REPEAT ( <EXPRESSION> , <STRING> ) 51741400
|
|
REPEAT ( <STRING> , <EXPRESSION> ) 51741500
|
|
; 51743000
|
|
BOOLEAN PROCEDURE PRINTSTMT; 51745000
|
|
BEGIN 51747000
|
|
BOOLEAN PROCEDURE PRINTELEM; 51749000
|
|
BEGIN 51751000
|
|
IF STRING THEN 51753000
|
|
BEGIN 51755000
|
|
GENCODE(PRINTSTRING,SYNTAX[I]); 51757000
|
|
PRINTELEM~TRUE; 51759000
|
|
END ELSE IF QTAB AND SYNTAX[I+1]="40" THEN 51759020
|
|
BEGIN 51759040
|
|
NEXT; NEXT; 51759060
|
|
IF EXPRESSION THEN 51759080
|
|
BEGIN 51759100
|
|
NEXT; 51759120
|
|
IF QRIGHTPAREN THEN 51759140
|
|
BEGIN 51759160
|
|
GENCODE(FUNCTCALL,19); 51759180
|
|
PRINTELEM ~ TRUE; 51759200
|
|
END ELSE PRINTELEM ~ FALSE; 51759220
|
|
END ELSE PRINTELEM ~ FALSE; 51759240
|
|
END ELSE IF QPLOT OR QREPEAT AND SYNTAX[I+1] = "40" THEN 51759260
|
|
BEGIN 51759280
|
|
T4~IF QPLOT THEN 18 ELSE 20; 51759300
|
|
NEXT; NEXT; 51759320
|
|
IF STRING THEN 51759340
|
|
BEGIN 51759360
|
|
GENCODE(STRINGFETCH,SYNTAX[I]); 51759380
|
|
NEXT; 51759400
|
|
IF QCOMMA THEN 51759420
|
|
BEGIN 51759440
|
|
NEXT; 51759460
|
|
IF EXPRESSION THEN 51759480
|
|
BEGIN 51759500
|
|
NEXT; 51759520
|
|
IF QRIGHTPAREN THEN 51759540
|
|
BEGIN 51759560
|
|
GENCODE(FUNCTCALL,T4); 51759580
|
|
PRINTELEM ~ TRUE; 51759600
|
|
END ELSE PRINTELEM~FALSE; 51759620
|
|
END ELSE PRINTELEM ~ FALSE; 51759640
|
|
END ELSE PRINTELEM~FALSE; 51759660
|
|
END ELSE 51759680
|
|
BEGIN 51759700
|
|
INHIBITCODE ~ TRUE; 51759720
|
|
T1 ~ I; 51759740
|
|
IF EXPRESSION THEN 51759760
|
|
BEGIN 51759780
|
|
NEXT; 51759800
|
|
IF QCOMMA THEN 51759820
|
|
BEGIN 51759840
|
|
NEXT; 51759860
|
|
IF STRING THEN 51759880
|
|
BEGIN 51759900
|
|
INHIBITCODE ~ FALSE; 51759920
|
|
GENCODE(STRINGFETCH,SYNTAX[I]); 51759940
|
|
T~I; 51759960
|
|
I ~ T1; 51759980
|
|
OK ~ EXPRESSION; 51760000
|
|
I ~ T; 51760020
|
|
NEXT; 51760040
|
|
IF QRIGHTPAREN THEN 51760060
|
|
BEGIN 51760080
|
|
GENCODE(FUNCTCALL,T4); 51760100
|
|
PRINTELEM ~ TRUE; 51760120
|
|
END ELSE PRINTELEM ~ FALSE; 51760140
|
|
END ELSE PRINTELEM ~ FALSE; 51760160
|
|
END ELSE PRINTELEM ~ FALSE; 51760180
|
|
END ELSE PRINTELEM ~ FALSE; 51760200
|
|
END; 51760220
|
|
END ELSE IF EXPRESSION THEN 51761000
|
|
BEGIN 51763000
|
|
GENCODE(PRINTEXP,0); 51765000
|
|
PRINTELEM~TRUE; 51767000
|
|
END ELSE 51769000
|
|
BEGIN 51771000
|
|
SYNTAXERR(20); COMMENT INVALID PRINT STATEMENT; 51773000
|
|
PRINTELEM~FALSE; 51775000
|
|
END; 51777000
|
|
END PRINTELEM; 51779000
|
|
BOOLEAN PROCEDURE EXPRLIST; 51781000
|
|
BEGIN 51783000
|
|
IF EXPRESSION THEN 51785000
|
|
BEGIN 51787000
|
|
GENCODE(PRINTEXP,0); 51789000
|
|
NEXT; 51791000
|
|
IF QCOMMA THEN 51793000
|
|
BEGIN 51795000
|
|
NEXT; 51797000
|
|
IF EXPRLIST THEN EXPRLIST ~ TRUE 51799000
|
|
ELSE EXPRLIST ~ FALSE; 51801000
|
|
END ELSE 51803000
|
|
BEGIN 51805000
|
|
BACKUP; 51807000
|
|
EXPRLIST ~ TRUE; 51809000
|
|
END; 51811000
|
|
END ELSE 51813000
|
|
BEGIN 51815000
|
|
SYNTAXERR(20); COMMENT INVALID PRINT STMT; 51817000
|
|
EXPRLIST ~ FALSE; 51819000
|
|
END; 51821000
|
|
END EXPRLIST; 51823000
|
|
BOOLEAN PROCEDURE PRINTLIST; 51825000
|
|
BEGIN 51827000
|
|
IF PRINTELEM THEN 51829000
|
|
BEGIN 51831000
|
|
NEXT; 51833000
|
|
IF QCOMMA THEN 51835000
|
|
BEGIN 51837000
|
|
NEXT; 51839000
|
|
IF PRINTLIST THEN PRINTLIST~TRUE ELSE PRINTLIST~FALSE; 51841000
|
|
END ELSE 51843000
|
|
BEGIN 51845000
|
|
BACKUP; 51847000
|
|
PRINTLIST~TRUE; 51849000
|
|
END; 51851000
|
|
END ELSE PRINTLIST~FALSE; 51853000
|
|
END PRINTLIST; 51855000
|
|
INHIBITCODE~FALSE; 51857000
|
|
IF QPRINT THEN 51859000
|
|
BEGIN 51861000
|
|
NEXT; 51863000
|
|
IF QFORM THEN IF NOT PROGMODE THEN 51865000
|
|
BEGIN 51867000
|
|
SYNTAXERR(25); COMMENT FORM CANNOT BE USED IN CALC. MODE;51869000
|
|
PRINTSTMT~FALSE; 51871000
|
|
END ELSE BEGIN 51873000
|
|
NEXT; 51875000
|
|
GENCODE(FORM, SYNTAX[I]); GENCODE(1,1); 51877000
|
|
IF STMTNR THEN 51879000
|
|
BEGIN 51881000
|
|
NEXT; 51883000
|
|
IF QCOMMA THEN NEXT; 51883100
|
|
IF ENDCODE OR QELSE THEN 51883200
|
|
BEGIN 51883300
|
|
GENCODE(INTRINSIC,0); 51883400
|
|
GENCODE(NEXTLINE,0); 51883500
|
|
PRINTSTMT~TRUE; 51883600
|
|
BACKUP; 51883700
|
|
END NULL LIST ELSE 51883800
|
|
IF EXPRLIST THEN 51885000
|
|
BEGIN 51887000
|
|
GENCODE(INTRINSIC,0); 51889000
|
|
GENCODE(NEXTLINE,0); 51891000
|
|
PRINTSTMT~TRUE; 51893000
|
|
END ELSE PRINTSTMT~FALSE; 51895000
|
|
END ELSE 51897000
|
|
BEGIN 51899000
|
|
SYNTAXERR(24); COMMENT MISSING OR INVALID FORM #; 51901000
|
|
PRINTSTMT~FALSE; 51903000
|
|
END; 51905000
|
|
END ELSE 51907000
|
|
IF ENDCODE OR QELSE THEN 51909000
|
|
BEGIN 51911000
|
|
GENCODE(INTRINSIC,0); 51913000
|
|
GENCODE(NEXTLINE,0); 51915000
|
|
PRINTSTMT~TRUE; 51917000
|
|
END NULL LIST ELSE 51919000
|
|
IF STRING AND PROGMODE AND SYNTAX[I+1]=ENDR AND I<4 THEN 51921000
|
|
BEGIN 51923000
|
|
COMMENT TREAT TYPE "XX" AS SPECIAL CASE TO REDUCE CODE SIZE;51925000
|
|
GENCODE(INTRINSIC,3); 51927000
|
|
GENCODE(NEXTLINE,0); 51929000
|
|
PRINTSTMT~TRUE; 51931000
|
|
END ELSE 51933000
|
|
IF PRINTLIST THEN 51935000
|
|
BEGIN 51937000
|
|
GENCODE(INTRINSIC,0); 51939000
|
|
GENCODE(NEXTLINE,0); 51941000
|
|
PRINTSTMT~TRUE; 51943000
|
|
END ELSE PRINTSTMT~FALSE; 51945000
|
|
END ELSE PRINTSTMT~FALSE; 51947000
|
|
END PRINTSTMT; 51949000
|
|
% 51951000
|
|
%***********************************************************************51953000
|
|
% 51955000
|
|
COMMENT 51957000
|
|
<DATASTMT> ::= DATA <DATALIST> 51959000
|
|
<DATALIST> ::= <DATAITEM> 51961000
|
|
<DATAITEM> , <DATALIST> 51963000
|
|
<DATAITEM> ::= <UNSIGNNUM> 51965000
|
|
+ <UNSIGNNUM> 51967000
|
|
- <UNSIGNNUM> 51969000
|
|
<STRING> 51971000
|
|
; 51973000
|
|
BOOLEAN PROCEDURE DATASTMT(INFO); ARRAY INFO[0]; 51975000
|
|
BEGIN 51977000
|
|
BOOLEAN PROCEDURE DATAITEM; 51979000
|
|
BEGIN 51981000
|
|
IF QPLUS OR QMINUS THEN NEXT; 51983000
|
|
IF UNSIGNNUM OR STRING THEN DATAITEM~TRUE ELSE 51985000
|
|
BEGIN 51987000
|
|
SYNTAXERR(28); COMMENT INVALID DATA ITEM; 51989000
|
|
DATAITEM~FALSE; 51991000
|
|
END; 51993000
|
|
END DATAITEM; 51995000
|
|
BOOLEAN PROCEDURE DATALIST; 51997000
|
|
BEGIN 51999000
|
|
IF DATAITEM THEN 52001000
|
|
BEGIN 52003000
|
|
NEXT; 52005000
|
|
IF QCOMMA THEN 52007000
|
|
BEGIN 52009000
|
|
NEXT; 52011000
|
|
IF SYNTAX[I] = ENDR THEN DATALIST ~ TRUE ELSE 52011100
|
|
IF DATALIST THEN DATALIST~TRUE ELSE DATALIST~FALSE; 52013000
|
|
END ELSE IF NOT ENDCODE THEN 52015000
|
|
BEGIN 52017000
|
|
SYNTAXERR(29); COMMENT INVALID DATA LIST; 52019000
|
|
DATALIST~FALSE; 52021000
|
|
END ELSE 52023000
|
|
BEGIN 52025000
|
|
BACKUP; 52027000
|
|
DATALIST~TRUE; 52029000
|
|
END; 52031000
|
|
END ELSE DATALIST~FALSE; 52033000
|
|
END DATALIST; 52035000
|
|
INHIBITCODE~FALSE; 52037000
|
|
NEXT; 52039000
|
|
IF DATALIST THEN 52041000
|
|
BEGIN 52043000
|
|
GENCODE(INTRINSIC,4); COMMENT THIS WILL BE USED IN LINKUP TO 52045000
|
|
LINK TOGETHER DATA STATEMENTS; 52047000
|
|
GENCODE(NEXTLINE,0); 52049000
|
|
DATASTMT~TRUE; 52051000
|
|
INFO[DATAST]~1; 52053000
|
|
END ELSE DATASTMT~FALSE; 52055000
|
|
END DATASTMT; 52057000
|
|
% 52059000
|
|
%***********************************************************************52061000
|
|
% 52063000
|
|
COMMENT 52065000
|
|
<RESTORESTMT>::= RESTORE 52067000
|
|
; 52069000
|
|
BOOLEAN PROCEDURE RESTORESTMT; 52071000
|
|
BEGIN 52073000
|
|
IF IDEN AND IDENTIFIERS[USER,(T1~SYNTAX[I].[42:6])+T1].[1:35] = 52075000
|
|
"7RESTO" AND (T1~SYNTAX[I+1] = 0 % END OF CARD 52077000
|
|
OR T1 = ">2") % ELSE 52079000
|
|
THEN 52081000
|
|
BEGIN 52083000
|
|
GENCODE(INTRINSIC,5); 52085000
|
|
GENCODE(NEXTLINE,0); 52087000
|
|
RESTORESTMT~TRUE; 52089000
|
|
END ELSE RESTORESTMT~FALSE; 52091000
|
|
END RESTORESTMT; 52093000
|
|
% 52095000
|
|
%***********************************************************************52097000
|
|
% 52099000
|
|
COMMENT 52101000
|
|
<CONDSTMT> ::= IF ( <EXPRESSION> ) <STMTNRLIST> 52103000
|
|
<IFSTMT> 52105000
|
|
<IFSTMNT> ELSE <NONIFSTMT> 52107000
|
|
<STMTNRLIST> ::= <STMTNR> 52109000
|
|
<STMTNR> , <STMTNR> 52111000
|
|
<STMTNR> , <STMTNR> , <STMTNR> 52113000
|
|
<IFSTMT> ::= <IFCLAUSE> <NONIFSTMT> 52115000
|
|
<IFCLAUSE> ::= IF <RELATION> THEN 52117000
|
|
IF <RELATION> , 52117100
|
|
IF <RELATION> 52117200
|
|
<NONIFSTMT> ::= <GOSTMT> 52119000
|
|
<PRINTSTMT> 52121000
|
|
<DOSTMT> 52123000
|
|
<INPUTSTMT> 52125000
|
|
<UNTILSTMT> 52127000
|
|
<WHILESTMT> 52129000
|
|
STOP 52131000
|
|
<REPLSTMT> 52133000
|
|
; 52135000
|
|
BOOLEAN PROCEDURE CONDSTMT(INFO); ARRAY INFO[0]; 52137000
|
|
BEGIN OWN INTEGER SAV; 52139000
|
|
LABEL XIT; 52141000
|
|
BOOLEAN PROCEDURE NONIFSTMT(INFO); ARRAY INFO[0]; 52143000
|
|
BEGIN 52145000
|
|
IF GOSTMT OR PRINTSTMT OR DOSTMT OR INPUTSTMT(INFO) OR UNTILSTMT 52147000
|
|
OR WHILESTMT OR RESTORESTMT THEN NONIFSTMT~TRUE ELSE 52149000
|
|
IF QSTOP THEN 52151000
|
|
BEGIN 52153000
|
|
GENCODE(STOP,0); 52155000
|
|
NONIFSTMT~TRUE; 52157000
|
|
END ELSE 52159000
|
|
IF REPLSTMT THEN NONIFSTMT~TRUE ELSE 52161000
|
|
BEGIN 52163000
|
|
ERRNUMBER ~ SYNTAXERRSTART+21; COMMENT INVALID STATEMENT TYPE 52165000
|
|
FOLLOWING "THEN" OR "ELSE". CANNOT USE SYNTAXERR PROC. 52167000
|
|
HERE SINCE REPLSTMT WILL HAVE ALREADY GENERATED A 52167100
|
|
DIAGNOSTIC; 52167200
|
|
NONIFSTMT~FALSE; 52169000
|
|
END; 52171000
|
|
END NONIFSTMT; 52173000
|
|
BOOLEAN PROCEDURE IFCLAUSE; 52175000
|
|
BEGIN 52177000
|
|
IF QIF THEN 52179000
|
|
BEGIN 52181000
|
|
NEXT; 52183000
|
|
IF RELATION THEN 52185000
|
|
BEGIN 52187000
|
|
NEXT; 52189000
|
|
IFCLAUSE ~ TRUE; 52191000
|
|
IF NOT (QCOMMA OR QTHEN) THEN BACKUP; 52193000
|
|
END ELSE IFCLAUSE~FALSE; 52201000
|
|
END ELSE IFCLAUSE~FALSE; 52203000
|
|
END IFCLAUSE; 52205000
|
|
BOOLEAN PROCEDURE IFSTMT(INFO); ARRAY INFO[0]; 52207000
|
|
BEGIN 52209000
|
|
IF IFCLAUSE THEN 52211000
|
|
BEGIN 52213000
|
|
SAV~TEMPCODEINDEX; 52215000
|
|
GENCODE(IFNOTRUSKIP,0); 52217000
|
|
COMMENT GENERATE SKIP INSTRUCTION WITH SYLLABLE COUNT TO 52219000
|
|
BE FILLED IN AFTER FURTHER ANALYSIS; 52221000
|
|
NEXT; 52223000
|
|
IF NONIFSTMT(INFO) THEN 52225000
|
|
BEGIN 52227000
|
|
IFSTMT~TRUE; 52229000
|
|
SYNTAX[SAV].[42:6]~TEMPCODEINDEX-SAV; 52231000
|
|
END ELSE IFSTMT~FALSE; 52233000
|
|
END ELSE IFSTMT~FALSE; 52235000
|
|
END IFSTMT; 52237000
|
|
SAVEI; 52239000
|
|
IF QIF THEN BEGIN 52241000
|
|
NEXT; 52243000
|
|
IF QLEFTPAREN THEN BEGIN 52245000
|
|
NEXT; 52247000
|
|
INHIBITCODE~TRUE; 52249000
|
|
IF EXPRESSION THEN BEGIN 52251000
|
|
NEXT; 52253000
|
|
IF QRIGHTPAREN THEN BEGIN 52255000
|
|
NEXT; 52257000
|
|
IF STMTNR THEN BEGIN 52259000
|
|
COMMENT IT IS A FORTRAN TYPE IF; 52261000
|
|
I~RESTORE+2; 52263000
|
|
INHIBITCODE~FALSE; 52265000
|
|
CONDSTMT~EXPRESSION; 52267000
|
|
NEXT; NEXT; 52269000
|
|
SAV~TEMPCODEINDEX; 52271000
|
|
GENCODE(FORTRANIF,0); 52273000
|
|
T~0; 52275000
|
|
DO BEGIN 52277000
|
|
IF STMTNR THEN BEGIN 52279000
|
|
GENCODE(GOTO,SYNTAX[I]); 52281000
|
|
GENCODE(1,1); 52283000
|
|
T~T+1; COMMENT COUNT BRANCHES; 52285000
|
|
END ELSE IF NOT QCOMMA THEN BEGIN 52287000
|
|
SYNTAXERR(23); 52289000
|
|
COMMENT IMPROPER STMT# IN IF; 52291000
|
|
CONDSTMT~FALSE; 52293000
|
|
GO TO XIT; 52295000
|
|
END INVALID STMT; 52297000
|
|
NEXT; 52299000
|
|
END UNTIL ENDCODE OR T=3; 52301000
|
|
SYNTAX[SAV].KEYFIELD ~ ENTIER(T); 52303000
|
|
COMMENT INSERT # BRANCHES IN SYLLABLE; 52305000
|
|
GENCODE(NEXTLINE,0); 52307000
|
|
GO TO XIT; 52309000
|
|
END PROCESSING FORTRAN IF 52311000
|
|
END END END END; 52313000
|
|
COMMENT ALGOL TYPE IF STMT; 52315000
|
|
I~RESTORE; 52317000
|
|
IF IFSTMT(INFO) THEN 52319000
|
|
BEGIN 52321000
|
|
NEXT; 52323000
|
|
IF QELSE THEN 52325000
|
|
BEGIN 52327000
|
|
NEXT; 52329000
|
|
IF NONIFSTMT(INFO) THEN CONDSTMT~TRUE ELSE CONDSTMT~FALSE52331000
|
|
; 52333000
|
|
END ELSE 52335000
|
|
BEGIN 52337000
|
|
BACKUP; 52339000
|
|
CONDSTMT~TRUE; 52341000
|
|
GENCODE(NEXTLINE,0); 52343000
|
|
END; 52345000
|
|
END ELSE CONDSTMT~FALSE; 52347000
|
|
XIT: 52349000
|
|
END CONDSTMT; 52351000
|
|
% 52353000
|
|
%***********************************************************************52355000
|
|
% 52357000
|
|
COMMENT 52359000
|
|
<ARRAYDECL> ::= DECLARE <ARRAYLIST> 52361000
|
|
<ARAYLIST> ::= <ARRAYELEM> 52363000
|
|
<ARRAYELEM> , <ARRAYLIST> 52365000
|
|
<ARRAYELEM> ::= <ARRAYIDEN> <BOUNDLIST> ] 52367000
|
|
<BOUNDLIST> ::= <UNSIGNNUM> 52369000
|
|
<UNSIGNNUM> , <BOUNDLIST> 52371000
|
|
; 52373000
|
|
BOOLEAN PROCEDURE ARRAYDECL(INFO,USERARRAY); ARRAY INFO,USERARRAY[0]; 52375000
|
|
BEGIN 52377000
|
|
BOOLEAN PROCEDURE BOUNDLIST; 52379000
|
|
BEGIN 52381000
|
|
IF UNSIGNNUM THEN 52383000
|
|
BEGIN 52385000
|
|
IF T2~GETDIM(SYNTAX[I].KEYFIELD)<256 THEN SETDIM(T4,T2) ELSE 52387000
|
|
SYNTAXERR(3); 52389000
|
|
NEXT; 52391000
|
|
IF QCOMMA THEN 52393000
|
|
BEGIN 52395000
|
|
NEXT; 52397000
|
|
IF BOUNDLIST THEN BOUNDLIST~TRUE ELSE BOUNDLIST~FALSE; 52399000
|
|
END ELSE 52401000
|
|
BEGIN 52403000
|
|
BACKUP; 52405000
|
|
BOUNDLIST~TRUE; 52407000
|
|
END; 52409000
|
|
END ELSE 52411000
|
|
BEGIN 52413000
|
|
SYNTAXERR(13); COMMENT DIMENSION MUST BE A NUMBER; 52415000
|
|
BOUNDLIST~FALSE; 52417000
|
|
END; 52419000
|
|
COMMENT DIMENSION EXCEEDS 256; 52421000
|
|
END BOUNDLIST; 52423000
|
|
BOOLEAN PROCEDURE ARRAYELEM(INFO,USERARRAY); ARRAY INFO,USERARRAY[0]; 52425000
|
|
BEGIN 52427000
|
|
IF ARRAYIDEN THEN 52429000
|
|
BEGIN 52431000
|
|
T4~0; COMMENT THE ARRAY DESCRIPTOR IS BUILT IN T4; 52433000
|
|
T3~1; COMMENT TOTAL ARRAY SIZE; 52435000
|
|
T1~0; COMMENT NUMBER OF DIMENSIONS; 52437000
|
|
T~SYNTAX[I].KEYFIELD; 52439000
|
|
T~T+T+1; COMMENT INDEX INTO IDENTIFIERS ARRAY; 52441000
|
|
NEXT; 52443000
|
|
IF BOUNDLIST THEN 52445000
|
|
BEGIN 52447000
|
|
NEXT; 52449000
|
|
IF QRIGHTBRACKET THEN 52451000
|
|
BEGIN 52453000
|
|
IF T3=0 THEN T1~IDENTIFIERS[USER,T].[1:2]+1; 52455000
|
|
IF NOT ERRFLAG THEN IF T2~IDENTIFIERS[USER,T]= 52457000
|
|
UNDEFINED THEN 52459000
|
|
BEGIN 52461000
|
|
IF (T5~INFO[LASTUSERARRAY])+T3{MAXUSERARRAY 52463000
|
|
THEN 52465000
|
|
BEGIN 52467000
|
|
IDENTIFIERS[USER,T]~0&(T1-1)[1:46:2]& 52469000
|
|
T4[3:3:32]&T5[38:38:10]; 52471000
|
|
USERARRAY[T5+T3-1]~USERARRAY[T5+T3-1]; %%%52473000
|
|
SETTOUNDEFINED(T3 DIV 32,ENTIER(T3 MOD 52475000
|
|
32),USERARRAY[T5]); 52477000
|
|
INFO[LASTUSERARRAY]~T5+T3; 52479000
|
|
ARRAYELEM~TRUE; 52481000
|
|
END ELSE IF T5+T3<1023 THEN 52483000
|
|
BEGIN 52485000
|
|
MAXUSERARRAY~T5+T3; 52487000
|
|
REALLOCATE ~ TRUE; 52489000
|
|
ARRAYELEM~FALSE; 52491000
|
|
END ELSE 52493000
|
|
BEGIN 52495000
|
|
SYNTAXERR(4); 52497000
|
|
COMMENT TOTAL AREA FOR ARRAYS EXCEEDED; 52499000
|
|
ARRAYELEM~FALSE; 52501000
|
|
END; 52503000
|
|
END PROVIOUSLY UNDEFINED ARRAY ELSE 52505000
|
|
BEGIN 52507000
|
|
IF T1!T2.[1:2]+1 THEN 52509000
|
|
BEGIN 52511000
|
|
SYNTAXERR(5); 52513000
|
|
COMMENT ATTEMPT TO RE-DIMENSION WITH A 52515000
|
|
DIFFERENT NR. OF DIMENSIONS; 52517000
|
|
ARRAYELEM~FALSE; 52519000
|
|
END ELSE 52521000
|
|
BEGIN 52523000
|
|
INTEGER OLDLENG, T8; 52525000
|
|
INTEGER DIF; 52527000
|
|
DEFINE NEWSIZE=T3#,IDINDEX=T#, NEWDESC=T4#52529000
|
|
; 52531000
|
|
FORMAT F(X15, A6, X5, I1, X3, I3, X1, 52533000
|
|
I3, X1, I3, X1, I3, X5, I4, X5, A6); 52535000
|
|
NEWDESC.[1:2]~T1-1; 52537000
|
|
OLDLENG~OLDSIZE(T2); 52539000
|
|
IF NEWSIZE<OLDLENG THEN 52541000
|
|
BEGIN 52543000
|
|
COMMENT SIZE DECREASE; 52545000
|
|
DIF~OLDLENG-NEWSIZE; 52547000
|
|
FOR T6~IDINDEX+2 STEP 2 WHILE T5~ 52549000
|
|
IDENTIFIERS[USER,T6-1]!0 DO 52551000
|
|
IF T5<0 THEN IF IDENTIFIERS[USER,T6] 52553000
|
|
!UNDEFINED THEN 52555000
|
|
IDENTIFIERS[USER,T6].[3852557000
|
|
:10]~IDENTIFIERS[USER,T6].[38:10] 52559000
|
|
-DIF; 52561000
|
|
T7~IDENTIFIERS[USER,IDINDEX].[38:10];52563000
|
|
T6~T7+NEWSIZE; 52565000
|
|
T5~INFO[LASTUSERARRAY]; 52567000
|
|
FOR T7~T7+OLDLENG STEP 1 UNTIL T5-1 52569000
|
|
DO BEGIN 52571000
|
|
USERARRAY[T6]~USERARRAY[T7]; 52573000
|
|
T6~T6+1; 52575000
|
|
END CRUNCHING AN ARRAY; 52577000
|
|
INFO[LASTUSERARRAY]~ 52579000
|
|
INFO[LASTUSERARRAY]-DIF; 52581000
|
|
IDENTIFIERS[USER,IDINDEX].[1:37]~ 52583000
|
|
NEWDESC.[1:37]; 52585000
|
|
ARRAYELEM~TRUE; 52587000
|
|
END DECREASE ELSE 52589000
|
|
IF NEWSIZE>OLDLENG THEN 52591000
|
|
BEGIN 52593000
|
|
DIF~NEWSIZE-OLDLENG; 52595000
|
|
IF DIF+INFO[LASTUSERARRAY]> 52597000
|
|
MAXUSERARRAY THEN 52599000
|
|
BEGIN 52601000
|
|
IF DIF+INFO[LASTUSERARRAY] > 52603000
|
|
1022 THEN 52605000
|
|
BEGIN 52607000
|
|
SYNTAXERR(4); 52609000
|
|
COMMENT TOTAL AREA EXCEED;52611000
|
|
ARRAYELEM~FALSE; 52613000
|
|
END ELSE 52615000
|
|
BEGIN 52617000
|
|
REALLOCATE~TRUE; 52619000
|
|
MAXUSERARRAY~ DIF+ 52621000
|
|
INFO[LASTUSERARRAY]; 52623000
|
|
ARRAYELEM~FALSE; 52625000
|
|
COMMENT BEGIN BACK OUT & 52627000
|
|
REALLOCATION; 52629000
|
|
END SIZE EXTENSION; 52631000
|
|
END NOT ENOUGH SPACE ELSE 52633000
|
|
BEGIN 52635000
|
|
T6~127; 52637000
|
|
DO 52639000
|
|
BEGIN 52641000
|
|
IF IDENTIFIERS[USER,T6-1]<052643000
|
|
THEN IF IDENTIFIERS[USER, 52645000
|
|
T6]!UNDEFINED 52647000
|
|
THEN IDENTIFIERS[USER,T6]. 52649000
|
|
[38:10]~IDENTIFIERS[USER, 52651000
|
|
T6].[38:10]+DIF; 52653000
|
|
END UNTIL T6~T6-2=IDINDEX ; 52655000
|
|
T7~IDENTIFIERS[USER,IDINDEX]. 52657000
|
|
[38:10]; 52659000
|
|
T8~T6~T7+NEWSIZE; 52661000
|
|
T5~INFO[LASTUSERARRAY]; 52663000
|
|
FOR T7~T7+OLDLENG STEP 1 UNTIL 52665000
|
|
T5-1 DO 52667000
|
|
BEGIN 52669000
|
|
USERARRAY[T6]~USERARRAY[T7]52671000
|
|
; IF T7<T8 THEN 52673000
|
|
USERARRAY[T7]~UNDEFINED; 52675000
|
|
T6~T6+1; 52677000
|
|
END EXPANSION ; 52679000
|
|
INFO[LASTUSERARRAY]~ 52681000
|
|
INFO[LASTUSERARRAY]+DIF; 52683000
|
|
IDENTIFIERS[USER,IDINDEX]. 52685000
|
|
[1:37]~NEWDESC.[1:37]; 52687000
|
|
ARRAYELEM~TRUE; 52689000
|
|
END; 52691000
|
|
END INCREASE ELSE ARRAYELEM~TRUE; 52693000
|
|
IF DEBUG THEN 52695000
|
|
BEGIN 52697000
|
|
FOR T7~0 STEP 2 WHILE T6~ 52699000
|
|
IDENTIFIERS[USER,T7]!0 DO 52701000
|
|
IF T6<0 THEN IF IDENTIFIERS[USER, 52703000
|
|
T7+1]!UNDEFINED THEN 52705000
|
|
WRITE(PR,F,T6.[6:36], 52707000
|
|
(T5~IDENTIFIERS[USER,T7+1]).[1:2], 52709000
|
|
T5.[3:8], T5.[11:8], T5.[19:8], 52711000
|
|
T5.[27:8], T5~T5.[38:10], 52713000
|
|
USERARRAY[T5]); 52715000
|
|
END DEBUG; 52717000
|
|
END SIZE CHANGE BLOCK; 52719000
|
|
END PREVIOUSLY DECLARED ARRAY ELSE ARRAYELEM~FALSE; 52721000
|
|
END ELSE ARRAYELEM~FALSE; 52723000
|
|
END ELSE ARRAYELEM~FALSE; 52725000
|
|
END ELSE 52727000
|
|
BEGIN 52727100
|
|
ARRAYELEM ~ FALSE; 52727200
|
|
IF IDEN THEN 52727300
|
|
BEGIN 52727400
|
|
NEXT; 52727500
|
|
IF QLEFTPAREN THEN SYNTAXERR(10); 52727600
|
|
COMMENT USE [ ] TO ENCLOSE SUBSCRIPTS - [ = SHIFT K, ] = 52727700
|
|
SHIFT M; 52727800
|
|
END; 52727900
|
|
END CHECKING IF PAREN INSTEAD OF BRACKETS; 52728000
|
|
END ARRAYELEM; 52729000
|
|
BOOLEAN PROCEDURE ARRAYLIST(INFO,USERARRAY); ARRAY INFO,USERARRAY[0]; 52731000
|
|
BEGIN 52733000
|
|
IF ARRAYELEM(INFO,USERARRAY) THEN 52735000
|
|
BEGIN 52737000
|
|
NEXT; 52739000
|
|
IF QCOMMA THEN 52741000
|
|
BEGIN 52743000
|
|
NEXT; 52745000
|
|
IF ARRAYLIST(INFO,USERARRAY) THEN ARRAYLIST~TRUE ELSE 52747000
|
|
ARRAYLIST~FALSE; 52749000
|
|
END ELSE 52751000
|
|
BEGIN 52753000
|
|
BACKUP; 52755000
|
|
ARRAYLIST~TRUE; 52757000
|
|
END; 52759000
|
|
END ELSE ARRAYLIST~FALSE; 52761000
|
|
END ARRAYLIST; 52763000
|
|
IF QDECLARE THEN 52765000
|
|
BEGIN 52767000
|
|
NEXT; 52769000
|
|
IF ARRAYLIST(INFO,USERARRAY) THEN 52771000
|
|
BEGIN 52773000
|
|
ARRAYDECL~TRUE; 52775000
|
|
GENCODE(NEXTLINE,0); 52777000
|
|
END ELSE ARRAYDECL~FALSE; 52779000
|
|
END ELSE ARRAYDECL~FALSE; 52781000
|
|
IF DEBUG THEN WRITE (PR[DBL], 17, IDENTIFIERS[USER,*]); 52783000
|
|
END ARRAYDECL; 52785000
|
|
% ------------------------------------------------------------------- 52787000
|
|
REAL STREAM PROCEDURE BLANKFILL(A); VALUE A; 52789000
|
|
BEGIN LOCAL T; 52791000
|
|
DI ~ LOC T; SI ~ LOC A; DI ~ DI + 7; DS ~ 1 CHR; 52793000
|
|
SI ~ LOC A; SKIP 2 SB; IF SB THEN BEGIN DI~DI-1; 52795000
|
|
DS ~ LIT "7"; COMMENT TRUNCATE NAME TO 7 CHARACTERS; END; 52797000
|
|
SI ~ SI + 1; 52799000
|
|
DI ~ LOC BLANKFILL; DS ~ 8 LIT"0 "; DI ~ DI - 7; 52801000
|
|
SI ~ LOC A; SI ~ SI + 1; DS ~ T CHR; END BLANK FILL; 52803000
|
|
STREAM PROCEDURE MOVE9(S,D); BEGIN SI ~ S; DI ~ D; DS ~ 9 WDS; END; 52805000
|
|
STREAM PROCEDURE GETNUMB (INTG, FRACTION, TENS, BCL, ERR); 52807000
|
|
BEGIN LOCAL C, T2; 52809000
|
|
LABEL PERIOD; LOCAL T; 52811000
|
|
SI ~ BCL; 52813000
|
|
DI ~ LOC C; DI ~ DI + 7; DS ~ 1 CHR; T2 ~ SI; 52815000
|
|
C(IF SC="." THEN JUMP OUT TO PERIOD; SI~SI+1); T~SI; DI~T; 52817000
|
|
DS~1 LIT "."; TALLY~C; TALLY~TALLY+1; C~TALLY; 52819000
|
|
PERIOD: SI ~ T2; TALLY ~ 0; T ~ SI; 52821000
|
|
DI ~ ERR; DS ~ 8 LIT " "; 52823000
|
|
DI ~ ERR; SI ~ T2; DS ~ C CHR; SI ~ T; DS ~ LIT "~"; 52825000
|
|
C( IF SC ! "." THEN BEGIN TALLY ~ TALLY + 1; 52827000
|
|
SI ~ SI + 1; END ELSE BEGIN 52829000
|
|
T2 ~ TALLY; 52831000
|
|
SI ~ T; DI ~ INTG; 52833000
|
|
DS ~ T2 OCT; 52835000
|
|
TALLY ~ 0; SI ~ SI + 1; T ~ SI; 52837000
|
|
END); 52839000
|
|
T2 ~ TALLY; SI ~ T; DI ~ FRACTION; DS ~ T2 OCT; 52841000
|
|
SI ~ LOC T2; DI ~ TENS; DS ~ 1 WDS; 52843000
|
|
END STREAM; 52845000
|
|
INTEGER STREAM PROCEDURE STRNGLENGTH(STR); 52847000
|
|
BEGIN LABEL EXIT; TALLY ~1; SI~STR;8(8(IF SC=""" THEN JUMP OUT 2 TO EXIT52849000
|
|
;SI~SI+1); TALLY~TALLY+1); EXIT:STRNGLENGTH~TALLY; END STRNGLENGTH;52851000
|
|
ALPHA STREAM PROCEDURE JUSTIFY(S); 52853000
|
|
BEGIN LOCAL T; DI~LOC JUSTIFY; DI~DI+2; DS~6 LIT " "; 52855000
|
|
SI~S; SI~SI+1; 6(IF SC ! """ THEN BEGIN SI~SI+1; 52857000
|
|
TALLY~TALLY+1; END); DI~DI-6; T~TALLY; SI~S; 52859000
|
|
SI~SI+1; DS~T CHR; END JUSTIFY; 52861000
|
|
% ----------------------- L O A D V E R B ------------------------- 52863000
|
|
COMMENT 52865000
|
|
LOADVERB SCHEDULES THE LOADING OF DISK FILES FROM THE 52867000
|
|
SYSTEM DISK FILE; 52869000
|
|
PROCEDURE LOADVERB(XIT,INFO,IDENT); LABEL XIT; ARRAY INFO,IDENT[0]; 52871000
|
|
BEGIN 52873000
|
|
INFO[LOADLIST]~0; 52875000
|
|
T1~0; I~I-1; 52877000
|
|
WHILE T~SYNTAX[I~I+1]!ENDR DO 52879000
|
|
BEGIN 52881000
|
|
IF T=LISTLETRS THEN INFO[LOADLIST]~1; 52883000
|
|
IF T.CLASSFIELD=IDLETTER THEN T1~BLANKFILL(IDENT[T.KEYFIELD 52885000
|
|
|2]); 52887000
|
|
END; 52889000
|
|
IF T1=0 THEN 52891000
|
|
BEGIN 52893000
|
|
ERRNUMBER~7; 52895000
|
|
RUNNER[USER]~"E"; 52897000
|
|
INFO[LOADLINK]~0; 52899000
|
|
GO TO XIT; 52901000
|
|
END NO NAME GIVEN; 52903000
|
|
INFO[LOADLINK]~T1; 52905000
|
|
INFO[FILELIMITS]~0; 52907000
|
|
RUNNER[USER]~"I"; 52909000
|
|
GO TO XIT; 52911000
|
|
END LOADVERB; 52913000
|
|
% ------------------------- G E T S T N U M B ---------------------- 52915000
|
|
COMMENT 52917000
|
|
THIS PROCEDURE RETURNS AN 18 BIT STATEMENT NUMBER 52919000
|
|
USING AN INDEX INTO THE TEMPCON TABLE ; 52921000
|
|
INTEGER PROCEDURE GETSTNUMB(C,INFO); VALUE C; INTEGER C; ARRAY INFO[0]; 52923000
|
|
BEGIN 52925000
|
|
INTG ~ FRACTION ~ TENS ~ 0; 52927000
|
|
GETNUMB(INTG,FRACTION,TENS,SYNTAX[SCANCON+C],INFO[IOBUF]); 52929000
|
|
IF SYNTAX[SCANCON+C+2].[1:5] = "E" OR INTG = 0 OR 52931000
|
|
INTG > 99 OR TENS>3 THEN BEGIN OK~FALSE;GETSTNUMB~0 END ELSE 52933000
|
|
IF GETSTNUMB ~ (FRACTION ~ FRACTION | 10*(3-TENS))& 52935000
|
|
INTG[31:41:7] = 0 THEN OK ~ FALSE; 52937000
|
|
IF NOT OK THEN IF ERRNUMBER=0 THEN ERRNUMBER~8; 52939000
|
|
COMMENT INVALID STATEMENT NUMBER; 52941000
|
|
END GETSTNUMB; 52943000
|
|
% ----------------- C O N V E R T C O N ------------------------ 52945000
|
|
COMMENT 52947000
|
|
THIS PROCEDURE USES AN INDEX INTO THE SCANCON ARRAY TO 52949000
|
|
CONVERT A CONSTANT TO BINARY. THE SIGN IS NEGATIVE 52951000
|
|
IF THE RANGE IS 0-63; 52953000
|
|
INTEGER STREAM PROCEDURE EXPONENT(E); VALUE E; 52955000
|
|
BEGIN LOCAL T; 52957000
|
|
SI ~ LOC E; IF SC = "E" THEN BEGIN 52959000
|
|
TALLY ~ 0; SI ~ SI + 1; IF SC < "0" THEN SI ~ SI + 1; 52961000
|
|
3(IF SC="." THEN JUMP OUT ELSE TALLY~TALLY+1; SI~SI+1); 52963000
|
|
T ~ TALLY; SI ~ SI - T; DI ~ LOC EXPONENT; 52965000
|
|
DS ~ T OCT; DI ~ LOC EXPONENT; SKIP 1 DB; 52967000
|
|
SI ~ LOC E; SI ~ SI + 1; IF SC = "-" THEN DS ~ 1 SET; 52969000
|
|
END EXPONENT PART PRESENT; 52971000
|
|
END EXPONENT; 52973000
|
|
REAL PROCEDURE CONVERTCON(L); VALUE L; INTEGER L; 52975000
|
|
BEGIN 52977000
|
|
INTG ~ 0; 52979000
|
|
FRACTION ~ 0; 52981000
|
|
PFLAG ~ FALSE; 52983000
|
|
TENS ~ 0; 52985000
|
|
FOR C ~ 1 STEP 1 UNTIL NCR(SYNTAX[SCANCON+L], 0) 52987000
|
|
DO IF NC ~ NCR(SYNTAX[SCANCON+L], C) = "." 52989000
|
|
THEN BEGIN 52991000
|
|
PFLAG ~ TRUE; 52993000
|
|
INTG ~ FRACTION; 52995000
|
|
FRACTION ~ TENS ~ 0; 52997000
|
|
END ELSE BEGIN 52999000
|
|
TENS ~ TENS + 1; 53001000
|
|
FRACTION ~ FRACTION | 10 + NC; 53003000
|
|
END NEXT CHARACTER; 53005000
|
|
IF PFLAG THEN S1~(INTG+FRACTION/10*TENS)| 53007000
|
|
10*EXPONENT(SYNTAX[SCANCON+L+2]) ELSE S1~FRACTION 53009000
|
|
|10*EXPONENT(SYNTAX[SCANCON+L+2]); 53011000
|
|
IF S1<64 THEN IF S1 MOD 1=0 THEN CONVERTCON~-S1 ELSE 53013000
|
|
CONVERTCON~S1 ELSE CONVERTCON~S1; 53015000
|
|
END CONVERTCON; 53017000
|
|
% ------------------------ C L E A N U P C O D E ------------------- 53019000
|
|
COMMENT 53021000
|
|
THIS PROCEDURE PACKS CODE FROM THE TEMPCODE ARRAY INTO THE 53023000
|
|
CODE ARRAY. IN THE PROCESS IT FIXES CONSTANTS (OR LITERALS) 53025000
|
|
STRINGS, AND BRANCH TO STATEMENT NUMBER; 53027000
|
|
STREAM PROCEDURE CODESTORE(CODE,SYNTAX,T4); 53029000
|
|
VALUE SYNTAX,T4; BEGIN SI~LOC SYNTAX;SI~SI+6;DI~CODE;2(DI~DI+T4); 53031000
|
|
DS~2 CHR; END; 53033000
|
|
PROCEDURE CLEANUPCODE(INFO, CODE, XIT); 53035000
|
|
ARRAY INFO[0], CODE[0]; LABEL XIT; 53037000
|
|
BEGIN 53039000
|
|
CODE[INFO[CMAX]]~0; 53041000
|
|
T ~ TEMPCODE - 1; T1 ~ 0; 53043000
|
|
WHILE I ~ SYNTAX[T~T+1] ! ENDR DO 53045000
|
|
IF I ~ I.CLASSFIELD = GOTO OR I = DOPART OR I = FORM 53047000
|
|
THEN BEGIN 53049000
|
|
T ~ T+1; T1 ~ T1 + 2; END ELSE T1 ~ T1 + 1; 53051000
|
|
COMMENT COUNT NUMBER OF INSTRUCTIONS, 53053000
|
|
SKIP OVER STATEMENT NUMBERS; 53055000
|
|
T1~(T1+3) DIV 4 + 1; COMMENT FOUR INSTRUCTIONS/WORD; 53057000
|
|
T ~ TEMPCODE - 1; 53059000
|
|
T5 ~ INFO[CODEMAX] + 1; COMMENT SKIP OVER CONTROL WORD; 53061000
|
|
FLAG ~ TRUE; 53063000
|
|
T4 ~ 0; 53065000
|
|
WHILE I ~ SYNTAX[T~T+1] ! ENDR AND OK DO BEGIN 53067000
|
|
IF T5+T1 } MAXCODESIZE THEN BEGIN 53069000
|
|
IF MAXCODESIZE~MAXCODESIZE+50>1022 THEN BEGIN 53071000
|
|
MAXCODESIZE~MAXCODESIZE-50; 53073000
|
|
ERRNUMBER~36; 53075000
|
|
RUNNER[USER]~"E"; 53077000
|
|
COMMENT PROGRAM TOO LARGE, TRY SAVE, ERASE, 53079000
|
|
LOAD; 53081000
|
|
GO TO XIT; END HANDLING CODE OVERFLOW 1022; 53083000
|
|
REALLOCATE ~ TRUE; 53085000
|
|
GO TO XIT; END CODE OVERFLOW; 53087000
|
|
IF FLAG THEN BEGIN 53089000
|
|
IF T6~I.CLASSFIELD=GOTO OR T6=FORM 53091000
|
|
THEN BEGIN 53093000
|
|
OK ~ TRUE; 53095000
|
|
T2 ~ GETSTNUMB(I.KEYFIELD,INFO[*]); 53097000
|
|
IF NOT OK THEN ERRNUMBER~8; 53099000
|
|
COMMENT INVALID STATEMENT NUMBER; 53101000
|
|
SYNTAX[T].KEYFIELD ~ T2.[30:6]; 53103000
|
|
SYNTAX[T+1] ~ T2; 53105000
|
|
FLAG ~ FALSE; 53107000
|
|
END INSERTION OF 18 BIT STATEMENT NUMBER; 53109000
|
|
IF I.CLASSFIELD = DOPART THEN BEGIN 53111000
|
|
T2~ENTIER(ABS(CONVERTCON(I.KEYFIELD))); 53113000
|
|
IF T2>0 AND T2{99 THEN BEGIN 53115000
|
|
T2~T2|1024; 53117000
|
|
SYNTAX[T].KEYFIELD ~ T2.[30:6]; 53119000
|
|
SYNTAX[T+1] ~ T2; 53121000
|
|
FLAG ~ FALSE; 53123000
|
|
END ELSE BEGIN OK~FALSE; ERRNUMBER~9; END; 53125000
|
|
COMMENT INVALID PART NUMBER; 53127000
|
|
END INSERTION OF PART NUMBER; 53129000
|
|
IF I.CLASSFIELD = CONSTANT THEN BEGIN 53131000
|
|
IF T2 ~ CONVERTCON(I.KEYFIELD) >0 THEN BEGIN 53133000
|
|
CODE[INFO[CODEMAX]+(T1~T1+1)-1] ~ T2; 53135000
|
|
SYNTAX[T].KEYFIELD ~ T1 - 1; 53137000
|
|
END ELSE 53139000
|
|
SYNTAX[T] ~ LITERAL | 64 + ABS(T2); 53141000
|
|
END CONVERSION OF CONSTANT; 53143000
|
|
IF I.CLASSFIELD= PRINTSTRING THEN BEGIN 53145000
|
|
SYNTAX[T].KEYFIELD~T1; 53147000
|
|
T6~STRNGLENGTH(SYNTAX[SCANCON+I.KEYFIELD])-1; 53149000
|
|
IF T5+T1+T6{MAXCODESIZE THEN FOR T3~0 STEP 1 53151000
|
|
UNTIL T6 DO CODE[INFO[CODEMAX]+(T1~T1+1)-1] 53153000
|
|
~SYNTAX[SCANCON+I.KEYFIELD+T3] ELSE T1~T1+T6; 53155000
|
|
END INSERTION OF STRING CONSTANTS; 53157000
|
|
IF I.CLASSFIELD = STRINGFETCH THEN BEGIN 53159000
|
|
CODE[INFO[CODEMAX]+(T1~T1+1)-1]~ 53161000
|
|
JUSTIFY(SYNTAX[SCANCON+I.KEYFIELD]); 53163000
|
|
SYNTAX[T].KEYFIELD~ENTIER(T1-1); 53165000
|
|
END INSERTING 7 CHAR ARITHMETIC STRING; 53167000
|
|
END ELSE FLAG ~ TRUE; COMMENT SKIP OVER ST #; 53169000
|
|
CODESTORE(CODE[T5],SYNTAX[T],T4); 53171000
|
|
IF (T4~T4+1) = 4 THEN BEGIN T4 ~ 0; T5 ~ T5 + 1; END; 53173000
|
|
END PACKING SYLLABLES INTO CODE ARRAY; 53175000
|
|
IF SYNTAX[TEMPCODE].CLASSFIELD=NEXTLINE THEN T1~1; 53177000
|
|
COMMENT REMARKS ARE ONLY ENTERED AS A LINK WORD; 53179000
|
|
CODE[INFO[CMAX]+T1] ~ 0; COMMENT ZERO NEXT ELEMENT; 53181000
|
|
CODE[INFO[CMAX]].CSIZE ~ T1; COMMENT ENTER SIZE OF SEGMENT; 53183000
|
|
IF PROGMODE THEN BEGIN 53185000
|
|
CODE[INFO[CMAX]].CSNUMB ~ I ~ GETSTNUMB(0,INFO[*]); 53187000
|
|
COMMENT INSERT STNUMB INTO CONTROL WORD; 53189000
|
|
IF OK THEN BEGIN 53191000
|
|
STORE(INFO[*], CODE[INFO[CMAX]]); 53193000
|
|
INFO[CMAX] ~ INFO[CMAX] + T1; COMMENT UPDATE CMAX 53195000
|
|
TO MAKE IT A PERMANENT ENTRY; 53197000
|
|
END OK 53199000
|
|
END PROGRAM MODE ELSE BEGIN 53201000
|
|
INFO[CBASEINDX] ~ INFO[CMAX]; 53203000
|
|
INFO[CINDX] ~ INFO[CMAX] + 1; 53205000
|
|
INFO[BUFINDEX] ~ 0; 53205100
|
|
INFO[LINDX] ~ 0; 53207000
|
|
INFO[SINDX] ~ 0; COMMENT SET REGISTERS FOR EXECUTE; 53209000
|
|
INFO[RUNCOUNT]~0; INFO[RUNLIMIT]~1000; 53211000
|
|
RUNNER[USER] ~ "S"; 53213000
|
|
INFO[MODEFLAG]~1; 53215000
|
|
END CALC MODE; 53217000
|
|
END CLEANUP CODE; 53219000
|
|
% ------------------------ S T O R E ---------------------------- 53221000
|
|
COMMENT 53223000
|
|
STORE PACKS A CARD IMAGE AND WRITES SEGMENTS ON THE DISK. IT 53225000
|
|
ERASES DISK AREAS AHEAD OF IT BY ERASING A LARGE CHUNK AT 53227000
|
|
A TIME; 53229000
|
|
COMMENT 53231000
|
|
WORD 1-9: 72 CHARACTER IMAGE. 53233000
|
|
WORD 10: FILEID=FIRST CARD DISKPOINTER; 53235000
|
|
PROCEDURE STORE(INFO,CODECELL); ARRAY INFO[0]; REAL CODECELL; 53237000
|
|
IF RUNNER[USER].[36:12]="R" THEN CODECELL.CDISKADDR~INFO[FILELIMITS]. 53239000
|
|
[18:15] ELSE 53241000
|
|
BEGIN 53243000
|
|
IF INFO[FILEID]=0 THEN ENTERDIRECTORY(INFO[*]); 53245000
|
|
CODECELL.CDISKADDR~DISKPOINTER; 53247000
|
|
T~DISKPOINTER MOD 3 | 10; 53249000
|
|
DISKBUF[T+9]~INFO[FILEID].[33:15]; 53251000
|
|
MOVE9(SYNTAX[0],DISKBUF[T]); 53253000
|
|
IF RUNNER[USER].[36:12] ! "I" OR DISKPOINTER MOD 3 = 2 OR 53253100
|
|
(T3 ~ INFO[FILELIMITS]).[18:15] < T3.[33:15] THEN 53253200
|
|
WRITE(DSK[T~DISKPOINTER DIV 3],30,DISKBUF[*]); 53255000
|
|
IF(DISKPOINTER~DISKPOINTER+1) MOD 30 = 0 THEN 53257000
|
|
BEGIN 53259000
|
|
DISKBUF[0]~"EOF"; COMMENT ERASE NEXT SECTION OF DISK; 53261000
|
|
FOR T2~1 STEP 1 UNTIL 29 DO DISKBUF[T2]~0; 53263000
|
|
FOR T2~T+1 STEP 1 UNTIL T+10 DO WRITE(DSK[T2],30,DISKBUF[*]); 53265000
|
|
IF DISKPOINTER MOD 540 = 0 THEN 53267000
|
|
BEGIN 53269000
|
|
WRITE(DSK[(DISKPOINTER+539) DIV 3],30,DISKBUF[*]); 53271000
|
|
CLOSE(DSK); 53273000
|
|
COMMENT ON A NEW ROW, UPDATE EOF POINTER BY WRITING LAST 53275000
|
|
RECORD IN THE NEW ROW AND CLOSING THE FILE; 53277000
|
|
END; 53279000
|
|
END ERASING NEXT SECTION OF DISK; 53281000
|
|
IF DISKPOINTER MOD 3=0 THEN DISKBUF[19]~DISKBUF[29]~"NUL"; 53283000
|
|
END STORE; 53285000
|
|
% ------------------------- L I N K D A T A ----------------------------53287000
|
|
PROCEDURE LINKDATA(INFO,CODE); ARRAY INFO,CODE[0]; 53289000
|
|
BEGIN 53291000
|
|
COMMENT THIS PROCEDURE LINKS TOGETHER DATA STATEMENTS VIA THE 53293000
|
|
[38:10] FIELD OF THE WORD FOLLOWING THE LINK WORD OF THE DATA 53295000
|
|
STATEMENT. A DATA STATEMENT WILL UNIQUELY HAVE A CALL TO 53297000
|
|
INTRINSIC 4 ("+4") AS THE FIRST SYLLABLE IN THE CODE; 53299000
|
|
T~C~INFO[DATAPOINTER]~0; 53301000
|
|
INFO[DATAINDEX]~0; 53303000
|
|
INFO[DATASTART]~0; 53305000
|
|
COMMENT CHECK FOR DATA STATEMENT; 53307000
|
|
DO BEGIN 53309000
|
|
C~CODE[C].CLINK; 53311000
|
|
IF CODE[C+1].[1:11] = "+4" THEN 53313000
|
|
BEGIN 53315000
|
|
IF INFO[DATASTART] = 0 THEN INFO[DATASTART]~C; 53317000
|
|
IF T ! 0 THEN CODE[T+1].[38:10]~C; 53319000
|
|
T~C; 53321000
|
|
END END UNTIL C = 0; 53323000
|
|
IF T ! 0 THEN CODE[T+1].[38:10]~0; 53325000
|
|
END LINKDATA; 53327000
|
|
% ------------------ L I N K U P ---------------------------------- 53329000
|
|
STREAM PROCEDURE CRUNCH(S, D, N1, N32); VALUE N1, N32; 53331000
|
|
BEGIN SI~S; DI~D; DS~N1 WDS; N32(DS~32 WDS); END CRUNCH ;53333000
|
|
PROCEDURE LINKUP(FCN,INFO,CODE,XIT); 53335000
|
|
VALUE FCN; INTEGER FCN; ARRAY INFO[0], CODE[0]; 53337000
|
|
LABEL XIT; 53339000
|
|
BEGIN 53341000
|
|
DEFINE SEGMENT = #; 53343000
|
|
S1 ~ 0; COMMENT INITIAL STATEMENT # = 0; 53345000
|
|
S2 ~ 131071; COMMENT TERMINAL STATEMENT = INFINITY; 53347000
|
|
I ~ SCANCODE; 53349000
|
|
WHILE T~SYNTAX[I~I+1]!ENDR DO BEGIN 53351000
|
|
OK~TRUE; 53353000
|
|
IF T=PART THEN IF ABS(S1~CONVERTCON((T~SYNTAX[I~I+1]). 53355000
|
|
KEYFIELD)) >0 AND S1{99 THEN BEGIN 53357000
|
|
S1~0&S1[31:41:7];S2~0&S1[31:31:7]&999[38:38:10]53359000
|
|
;END ELSE BEGIN 53361000
|
|
COMMENT INVALID PART NUMBER; 53363000
|
|
ERRNUMBER~9; RUNNER[USER]~"E"; GO TO 53365000
|
|
XIT; END ELSE 53367000
|
|
IF T.CLASSFIELD=CON THEN IF S1=0 THEN S1~GETSTNUMB( 53369000
|
|
T.KEYFIELD,INFO[*]) ELSE S2~GETSTNUMB(T.KEYFIELD, 53371000
|
|
INFO[*]); 53373000
|
|
COMMENT SET UP STATEMENT NUMBER RANGE; 53375000
|
|
IF NOT OK THEN BEGIN RUNNER[USER]~"E"; GO TO XIT; END END; 53377000
|
|
IF S1!0 AND S2=131071 THEN S2~S1; 53379000
|
|
C~1; 53381000
|
|
CODE[LASTLINK~0]~0; COMMENT (LASTLINK DEFINED AS T4); 53383000
|
|
COMMENT BEGIN INITIAL PASS TO FIND STMNT NUMBERS IN RANGE 53385000
|
|
AND REMOVE ERASED CODE; 53387000
|
|
WHILE C<INFO[CMAX] DO BEGIN 53389000
|
|
WHILE T~CODE[C]<0 DO BEGIN 53391000
|
|
COMMENT CRUNCH ERASED CODE; 53393000
|
|
CRUNCH(CODE[C+(T3~T.CSIZE)], CODE[C], 53395000
|
|
ENTIER((T2~INFO[CMAX]-C) MOD 32), T2 DIV 32); 53397000
|
|
CODE[INFO[CMAX]~INFO[CMAX]-T3]~0; 53399000
|
|
END COMPRESSING CODE ARRAY; 53401000
|
|
IF T~T.CSNUMB}S1 AND T{S2 AND T!0 THEN BEGIN 53403000
|
|
COMMENT FORM LINKED LIST OF THOSE STMNTS IN RANGE; 53405000
|
|
CODE[LASTLINK].CLINK~C; 53407000
|
|
LASTLINK~C; 53409000
|
|
END STMNT IN RANGE; 53411000
|
|
IF T~CODE[C].CSIZE>0 THEN C~C+T ELSE 53413000
|
|
IF C<INFO[CMAX] THEN BEGIN 53415000
|
|
RUNNER[USER] ~ "E"; 53417000
|
|
SYNTAXERR(27); GO TO XIT; END ARRAY INVALID; 53419000
|
|
END INITIAL PASS; 53421000
|
|
COMMENT LINKED LIST IS NOW SERIAL THRU CODE ARRAY, STARTING 53423000
|
|
AT LINK WORD 0 AND LINKING FORWARD UNTIL THE CELL 53425000
|
|
CODE[LASTLINK]; 53427000
|
|
IF LASTLINK=0 THEN BEGIN 53429000
|
|
IF S1=0 THEN ERRNUMBER~10 ELSE ERRNUMBER~11; 53431000
|
|
RUNNER[USER]~"E"; 53433000
|
|
GO TO XIT; 53435000
|
|
END NO STATEMENTS PRESENT OR IN RANGE; 53437000
|
|
CODE[LASTLINK].CLINK~0; COMMENT SET STOPPER LINK; 53439000
|
|
T6~522242; COMMENT MAX POSSIBLE PAIR SWAPS; 53441000
|
|
DO BEGIN COMMENT FORM LINKED-LIST BY REPEATED PAIR SWAPS; 53443000
|
|
FLAG~TRUE; 53445000
|
|
I~T5~0; 53447000
|
|
COMMENT I IS 1 STMNT AHEAD OF C, T5 IS 1 STMNT BEHIND 53449000
|
|
C SO THE PREVIOUS FORWARD POINTER MAY BE 53451000
|
|
MODIFIED; 53453000
|
|
DO BEGIN 53455000
|
|
C~I; COMMENT STEP C AND I 1 STMNT; 53457000
|
|
I~CODE[C].CLINK; 53459000
|
|
IF (S1~CODE[C].CSNUMB) = (S2~CODE[I].CSNUMB) 53461000
|
|
THEN BEGIN 53463000
|
|
COMMENT LINK AROUND A DUPLICATE STMNT AND53465000
|
|
VOID IT; 53467000
|
|
CODE[T5].CLINK~I; 53469000
|
|
CODE[C].SBIT~1; 53471000
|
|
END DUPLICATE ELSE IF S1>S2 THEN BEGIN 53473000
|
|
COMMENT A SWAP IS NECESSARY; 53475000
|
|
T3~CODE[T5].CLINK; 53477000
|
|
CODE[T5].CLINK~CODE[C].CLINK; 53479000
|
|
CODE[C].CLINK~CODE[I].CLINK; 53481000
|
|
CODE[I].CLINK~T3; 53483000
|
|
COMMENT THREE WAY SWAP REQUIRED BECAUSE 53485000
|
|
LIST IS SPECIFIED BY FORWARD LINKAGE;53487000
|
|
T5~I; 53489000
|
|
IF I!LASTLINK THEN I~C; 53491000
|
|
COMMENT C NOW BECOMES THE HIGHER 53493000
|
|
STATEMENT NUMBER, RATHER THAN I. 53495000
|
|
(BUT DONT PASS LASTLINK.); 53497000
|
|
FLAG~FALSE; 53499000
|
|
COMMENT MUST MAKE ANOTHER PASS; 53501000
|
|
END SWAP ELSE T5~C; 53503000
|
|
IF T6~T6-1=0 THEN BEGIN SYNTAXERR(27); RUNNER[USER]~"E";53505000
|
|
GO TO XIT; END; 53507000
|
|
COMMENT INTEGRITY OF ARRAYS HAS BEEN DESTROYED; 53509000
|
|
END INNER DO LOOP UNTIL I=LASTLINK; 53511000
|
|
IF CODE[C]>0 THEN 53513000
|
|
LASTLINK~C; 53515000
|
|
COMMENT BACK UP LASTLINK UNTIL NO MORE SWAPS NEEDED; 53517000
|
|
END UNTIL FLAG; 53519000
|
|
INFO[CBASEINDX] ~ CODE[0].CLINK; 53521000
|
|
IF FCN = "L" THEN RUNNER[USER] ~ "L"; 53523000
|
|
COMMENT SET LIST OPTION; 53525000
|
|
IF FCN = "R" THEN BEGIN 53527000
|
|
IF INFO[DATAST] = 1 THEN LINKDATA(INFO,CODE); 53529000
|
|
INFO[CINDX] ~ CODE[0].CLINK + 1; 53531000
|
|
INFO[LINDX] ~ 0; INFO[SINDX] ~ 0; 53533000
|
|
COMMENT SET UP REGISTERS FOR EXECUTE; 53535000
|
|
RUNNER[USER] ~ "S"; COMMENT ENTER RUN SCHEDULE; 53537000
|
|
INFO[RUNLIMIT] ~ 1000; COMMENT LIMIT TO 1000 STMNTS; 53539000
|
|
INFO[RUNCOUNT]~0; 53541000
|
|
INFO[MODEFLAG]~0; 53543000
|
|
INFO[BUFINDEX]~0; 53545000
|
|
END RUN; 53547000
|
|
IF FCN = "E" THEN BEGIN 53549000
|
|
C ~ 0; 53551000
|
|
WHILE C ~ CODE[C].CLINK ! 0 DO CODE[C].SBIT ~ 1; 53553000
|
|
STORE(INFO[*],C); 53555000
|
|
END ERASING LINES OF CODE; 53557000
|
|
IF FCN = "D" THEN RUNNER[USER] ~ "D"; 53559000
|
|
COMMENT WRITE CARDS ON A DISK FILE FOR SAVE VERB; 53561000
|
|
IF DEBUG THEN WRITE (PR[DBL], 16,CODE[*]); 53563000
|
|
GO TO XIT; 53565000
|
|
END LINKUP; 53567000
|
|
% -------------------- H E L P V E R B ----------------------------- 53569000
|
|
PROCEDURE HELPVERB(INFO, XIT); ARRAY INFO[0]; LABEL XIT; 53571000
|
|
BEGIN 53573000
|
|
IF HELPTABLE[0] = 0 THEN BEGIN 53575000
|
|
ERRNUMBER~12; 53577000
|
|
RUNNER[USER] ~ "E"; 53579000
|
|
GO TO XIT; END NO HELP; 53581000
|
|
T2~T1~0; 53583000
|
|
OK ~ TRUE; 53585000
|
|
IF T3~(T~SYNTAX[I+1]).CLASSFIELD = CON THEN T1 ~ GETSTNUMB( 53587000
|
|
T.KEYFIELD,INFO[*]) 53589000
|
|
ELSE IF T3 ! IDLETTER AND T3 ! ARRAYIDLETTER THEN T2 ~T;53591000
|
|
IF T3 = IDLETTER THEN IF IDENTIFIERS[USER,(T4 ~ T.KEYFIELD)+ 53593000
|
|
T4].[1:29] = "4DATA" THEN T2 ~ "38"; 53595000
|
|
IF NOT OK THEN BEGIN RUNNER[USER] ~ "E" ; GO TO XIT; END; 53597000
|
|
INFO[HELPLINK] ~ 0; 53599000
|
|
IF T2 ! 0 THEN BEGIN 53601000
|
|
INFO[HELPLINK] ~ T2; 53603000
|
|
RUNNER[USER] ~ "K"; 53605000
|
|
GO TO XIT; 53607000
|
|
END KEYWORD REQUEST; 53609000
|
|
I ~ 0; 53611000
|
|
T1.[38:10] ~ 0; COMMENT STEP # = 0; 53613000
|
|
IF T1 ! 0 THEN WHILE HELPTABLE[I].CSNUMB < T1 DO I ~ I+1; 53615000
|
|
COMMENT SKIP UP TO FIRST LINE OF A PART; 53617000
|
|
INFO[HELPLINK].[38:10] ~ I; 53619000
|
|
INFO[HELPLINK].CSNUMB ~ T1; 53621000
|
|
RUNNER[USER] ~ "H"; 53623000
|
|
GO TO XIT; 53625000
|
|
END HELPVERB; 53627000
|
|
% ------------------- R E M O V E V E R B --------------------------- 53629000
|
|
PROCEDURE REMOVEVERB(IDENT,INFO,XIT); ARRAY IDENT,INFO[0]; LABEL XIT; 53631000
|
|
BEGIN 53633000
|
|
FILE SAVER DISK SERIAL "FILENAM" "CARDS" (1,10,30); 53635000
|
|
IF (T~SYNTAX[I+1]).CLASSFIELD!IDLETTER THEN BEGIN 53637000
|
|
ERRNUMBER~7; 53639000
|
|
RUNNER[USER]~"E"; 53641000
|
|
GO TO XIT; 53643000
|
|
END NO FILE NAME; 53645000
|
|
T1~BLANKFILL(IDENT[T.KEYFIELD|2]); 53647000
|
|
FILL SAVER WITH T1; 53649000
|
|
SEARCH(SAVER,INFO[*]); 53651000
|
|
IF INFO[0]<0 THEN BEGIN 53653000
|
|
ERRNUMBER~13; 53655000
|
|
RUNNER[USER]~"E"; 53657000
|
|
GO TO XIT; 53659000
|
|
END FILE NOT PRESENT; 53661000
|
|
IF INFO[0]!7 THEN BEGIN 53663000
|
|
ERRNUMBER ~ 45; 53665000
|
|
RUNNER[USER]~"E"; 53667000
|
|
GO TO XIT; 53669000
|
|
END NOT PRIMARY USER; 53671000
|
|
IF INFO[6] ! 0 THEN BEGIN 53671100
|
|
ERRNUMBER ~ 48; 53671200
|
|
RUNNER[USER] ~ "E"; 53671300
|
|
GO TO XIT; 53671400
|
|
END FILE IN USE; 53671500
|
|
READ(SAVER,10,INFO[*]); 53673000
|
|
CLOSE (SAVER,PURGE); 53675000
|
|
ERRNUMBER ~ 14; COMMENT "PURGED" MESSAGE; 53677000
|
|
RUNNER[USER] ~ "E"; 53677100
|
|
GO TO XIT; 53679000
|
|
END REMOVEVERB; 53681000
|
|
% --------------------------- S A V E V E R B --------------------- 53683000
|
|
COMMENT 53685000
|
|
SAVEVERB SCHEDULES THE CREATION OF A DISK FILE; 53687000
|
|
PROCEDURE SAVEVERB(XIT,INFO,IDENT,CODE); LABEL XIT; ARRAY INFO,IDENT, 53689000
|
|
CODE[0]; 53691000
|
|
BEGIN 53693000
|
|
IF INFO[FILEID]=0 THEN 53695000
|
|
BEGIN 53697000
|
|
ERRNUMBER~10; 53699000
|
|
RUNNER[USER]~"E"; 53701000
|
|
GO TO XIT; 53703000
|
|
END NO STATEMENTS; 53705000
|
|
INFO[PUBLICFLAG] ~ 0; 53707000
|
|
T1~0; 53709000
|
|
I~SCANCODE; 53711000
|
|
WHILE T~SYNTAX[I~I+1]!ENDR DO 53713000
|
|
IF T.CLASSFIELD = IDLETTER THEN 53715000
|
|
IF (T2~IDENT[T.KEYFIELD|2]).[1:35] = "6PUBLI" 53717000
|
|
THEN INFO[PUBLICFLAG]~1 ELSE T1~BLANKFILL(T2); 53719000
|
|
IF T1=0 THEN 53721000
|
|
BEGIN 53723000
|
|
ERRNUMBER~7; 53725000
|
|
RUNNER[USER]~"E"; 53727000
|
|
GO TO XIT; 53729000
|
|
END FILE NAME MISSING; 53731000
|
|
INFO[FILENAME]~T1; 53733000
|
|
LINKUP("D",INFO,CODE,XIT); 53735000
|
|
END SAVEVERB; 53737000
|
|
% ------------------- O P T I O N V E R B S ------------------------- 53739000
|
|
PROCEDURE OPTIONVERBS(TF,IDENT,INFO); VALUE TF; BOOLEAN TF; 53741000
|
|
ARRAY IDENT[0],INFO[0]; 53743000
|
|
BEGIN 53745000
|
|
WHILE T~SYNTAX[I~I+1].CLASSFIELD!ENDR DO 53747000
|
|
IF T=IDLETTER THEN BEGIN 53749000
|
|
IF T~IDENT[SYNTAX[I].KEYFIELD|2].[6:42]="SIGNIFI" 53751000
|
|
THEN GENCODE(INTRINSIC,13+(1-REAL(TF))|2); 53753000
|
|
COMMENT SET/CLEAR FREE FIELD TYPE PLACES; 53755000
|
|
IF T = "TRACE00" THEN 53757000
|
|
GENCODE(INTRINSIC,14+(1-REAL(TF))|2); 53757100
|
|
COMMENT SET/CLEAR DEBUG TOGGLE; 53759000
|
|
IF T = "CLOSE00" THEN GENCODE(INTRINSIC,17); 53761000
|
|
COMMENT PRINT DEBUG FILE; 53763000
|
|
COMMENT <SPACE FOR MORE OPTIONS> ; 53765000
|
|
END SETTTING AND CLEARING OPTIONS; 53767000
|
|
GENCODE(NEXTLINE,0); OK~TRUE; 53769000
|
|
END OPTIONVERBS; 53771000
|
|
% ------------------------------------------------------------------- 53773000
|
|
COMMENT CHECK FOR NULL STATEMENT; 53773100
|
|
IF SYNTAX[SCANCODE] = ENDR THEN GO TO XIT; 53773200
|
|
EXPOVR ~ EXPERR; COMMENT MONITOR EXP. FAULT; 53775000
|
|
HOLDINDEX~HOLD;PDSINDEX~PDS;OSINDEX~OPSTACK; 53777000
|
|
TEMPCODEINDEX ~ TEMPCODE; 53779000
|
|
T ~ I; 53781000
|
|
INDEX~SAV~0; INHIBITCODE~OK~ERRFLAG~FALSE; 53783000
|
|
IF PROGMODE THEN I ~ SCANCODE + 1 ELSE I ~ SCANCODE; 53785000
|
|
COMMENT THE INDEX FOR THIS CASE STATEMENT WAS OBTAINED FROM THE ENTRY 53787000
|
|
NUMBER OF DICT[*]; 53789000
|
|
CASE T OF BEGIN 53791000
|
|
BEGIN END; 53793000
|
|
SAVEVERB(XIT, INFO, IDENT, CODE); 53795000
|
|
LOADVERB(XIT,INFO,IDENT); 53797000
|
|
BEGIN RUNNER[USER]~"Q"; GO TO XIT; 53799000
|
|
END QUIT; 53801000
|
|
LINKUP("R",INFO[*],CODE[*],XIT); 53803000
|
|
BEGIN IF SYNTAX[I+1]=ENDR THEN BEGIN 53805000
|
|
FOR T~0 STEP 2 WHILE IDENT[T]!0 DO BEGIN 53807000
|
|
IDENT[T]~0; IDENT[T+1]~UNDEFINED; END; 53809000
|
|
INFO[LASTUSERARRAY]~0; 53811000
|
|
INFO[DATAST]~0; 53813000
|
|
INFO[CMAX]~1; 53815000
|
|
CODE[0]~CODE[1]~0; 53817000
|
|
IF INFO[FILEID]!0 THEN BEGIN COMMENT CLOSE FILE; 53819000
|
|
IF T1~INFO[FILEID].[3:25]=DLOC THEN BEGIN 53821000
|
|
COMMENT ENTRY IS IN CURRENT DLOC SEG.; 53823000
|
|
DIRBUF[INFO[FILEID].[28:5]].SBIT~1; 53825000
|
|
WRITE(DSK[DLOC],30,DIRBUF[*]); 53827000
|
|
END ELSE BEGIN COMMENT DIFFERENT SEGMENT; 53829000
|
|
READ(DSK[T1],30,LISTBUF[*]); 53831000
|
|
LISTBUF[INFO[FILEID].[28:5]].SBIT~1; 53833000
|
|
WRITE(DSK[T1],30,LISTBUF[*]); 53835000
|
|
LISTPOINTER~0; 53837000
|
|
END ; 53839000
|
|
INFO[FILEID]~0; 53841000
|
|
END MARKING USER FILE CLOSED; 53843000
|
|
INFO[DICTMAX]~0; 53845000
|
|
GO TO XIT; 53847000
|
|
END; 53849000
|
|
IF SYNTAX[I+1].CLASSFIELD=IDLETTER THEN BEGIN 53851000
|
|
FOR T~I+1 STEP 1 WHILE SYNTAX[T]!ENDR DO 53853000
|
|
IF SYNTAX[T].CLASSFIELD=IDLETTER THEN IDENT[ 53855000
|
|
SYNTAX[T].KEYFIELD|2+1]~UNDEFINED;GO TO XIT; 53857000
|
|
END ELSE LINKUP("E",INFO[*],CODE[*],XIT); 53859000
|
|
END ERASE; 53861000
|
|
LINKUP("L",INFO[*],CODE[*],XIT); 53863000
|
|
BEGIN HELPVERB(INFO[*], XIT); GO TO XIT; END HELP; 53865000
|
|
REMOVEVERB(IDENT[*], INFO[*], XIT); 53867000
|
|
OK~REPLSTMT; 53873000
|
|
OK ~ INPUTSTMT(INFO); 53875000
|
|
OK~PRINTSTMT; 53877000
|
|
BEGIN SYNTAX[TEMPCODE]~NEXTLINE|64; OK~TRUE; END REMARK; 53879000
|
|
OPTIONVERBS(TRUE,IDENT,INFO); COMMENT USE; 53879100
|
|
OPTIONVERBS(FALSE,IDENT,INFO); COMMENT CLEAR; 53879200
|
|
OK~GOSTMT; 53881000
|
|
BEGIN SYNTAX[TEMPCODE]~STOP|64; OK~TRUE; END STOP; 53883000
|
|
OK~DOSTMT; 53885000
|
|
OK~WHILESTMT; 53887000
|
|
OK~UNTILSTMT; 53889000
|
|
BEGIN OK~ARRAYDECL(INFO,USERARRAY); IF REALLOCATE THEN 53891000
|
|
GO TO XIT; END ARRAYDECL; 53893000
|
|
OK ~ CONDSTMT(INFO); 53895000
|
|
BEGIN SYNTAX[TEMPCODE]~NEXTLINE|64; OK~TRUE; END FORM; 53897000
|
|
OK~DATASTMT(INFO); 53899000
|
|
OK ~ RESTORESTMT; 53901000
|
|
END CASE T; 53903000
|
|
IF DEBUG THEN WRITE (PR[DBL], DMPCODE, 53905000
|
|
FOR T~TEMPCODE STEP 1 UNTIL TEMPCODE+29 DO 53907000
|
|
SYNTAX[T]); 53909000
|
|
IF OK AND NOT ERRFLAG THEN BEGIN 53911000
|
|
NEXT; IF SYNTAX[I]!ENDR THEN BEGIN 53913000
|
|
SYNTAXERR(12); COMMENT MISSING OPERATOR OR 53915000
|
|
SEPARATOR HAS CAUSED THEN SYNTAX ANALYZER TO 53917000
|
|
TERMINATE PREMATURELY; 53919000
|
|
RUNNER[USER]~"E"; GO TO XIT; END; 53921000
|
|
CLEANUPCODE(INFO[*],CODE[*],XIT); 53923000
|
|
IF DEBUG THEN WRITE(PR[DBL],15,CODE[*]); 53925000
|
|
IF OK THEN ENTERDICT~TRUE ELSE RUNNER[USER]~"E"; 53927000
|
|
END OK ELSE BEGIN 53929000
|
|
IF ERRNUMBER=0 THEN ERRNUMBER~16; 53931000
|
|
COMMENT IF NO SPECIFIC ERROR HAS BEEN GENERATED53933000
|
|
SET UP "SYNTAX ERROR" MESSAGE; 53935000
|
|
RUNNER[USER]~"E"; END; 53937000
|
|
GO TO XIT; 53939000
|
|
EXPERR: ERRNUMBER~35; RUNNER[USER]~"E"; 53941000
|
|
COMMENT EXPONENT OVERFLOW; 53943000
|
|
XIT: 53945000
|
|
END TRANSLATOR; 53947000
|
|
% ******************************************************************** 60001000
|
|
% ******************************************************************** 60003000
|
|
% *********************** A C C E P T ************************* 60005000
|
|
% ******************************************************************** 60007000
|
|
% ******************************************************************** 60009000
|
|
COMMENT 60011000
|
|
THIS PROCEDURE HANDLES CONVERSATIONAL REQUESTS . 60013000
|
|
IT WILL HANDLE REQUESTS FOR ENTRY OF VALUES FOR UNDEFINED 60015000
|
|
VARIABLES AS WELL AS OTHER FUNCTIONS; 60017000
|
|
PROCEDURE ACCEPT(INFO,IDENT,STACK,USERARRAY); 60019000
|
|
ARRAY INFO,IDENT,STACK,USERARRAY[0]; 60021000
|
|
BEGIN LABEL EXPERR,XIT; MONITOR EXPOVR; 60023000
|
|
INTEGER STREAM PROCEDURE NCR(S,N); VALUE N; 60025000
|
|
BEGIN SI ~ S; SI ~ SI + N; DI ~ LOC NCR; DI ~ DI + 7; 60027000
|
|
DS ~ 1 CHR; END; COMMENT RETURNS 1 CHARACTER ; 60029000
|
|
% ----------------- C O N V E R T C O N ------------------------ 60031000
|
|
COMMENT 60033000
|
|
THIS PROCEDURE USES AN INDEX INTO THE SCANCON ARRAY TO 60035000
|
|
CONVERT A CONSTANT TO BINARY; 60037000
|
|
INTEGER STREAM PROCEDURE EXPONENT(E); VALUE E; 60039000
|
|
BEGIN LOCAL T; 60041000
|
|
SI ~ LOC E; IF SC = "E" THEN BEGIN 60043000
|
|
TALLY ~ 0; SI ~ SI + 1; IF SC < "0" THEN SI ~ SI + 1; 60045000
|
|
3(IF SC="." THEN JUMP OUT ELSE TALLY~TALLY+1; SI~SI+1); 60047000
|
|
T ~ TALLY; SI ~ SI -T; DI ~ LOC EXPONENT; 60049000
|
|
DS ~ T OCT; DI ~ LOC EXPONENT; SKIP 1 DB; 60051000
|
|
SI ~ LOC E; SI ~ SI + 1; IF SC = "-" THEN DS ~ 1 SET; 60053000
|
|
END EXPONENT PART PRESENT; 60055000
|
|
END EXPONENT; 60057000
|
|
REAL PROCEDURE CONVERTCON(L); VALUE L; INTEGER L; 60059000
|
|
BEGIN 60061000
|
|
INTG ~ 0; 60063000
|
|
FRACTION ~ 0; 60065000
|
|
PFLAG ~ FALSE; 60067000
|
|
TENS ~ 0; 60069000
|
|
FOR C~1 STEP 1 UNTIL SYNTAX[SCANCON+L].[1:5] 60071000
|
|
DO IF NC ~ NCR(SYNTAX[SCANCON+L], C) = "." 60073000
|
|
THEN BEGIN 60075000
|
|
PFLAG ~ TRUE; 60077000
|
|
INTG ~ FRACTION; 60079000
|
|
FRACTION ~ TENS ~ 0; 60081000
|
|
END ELSE BEGIN 60083000
|
|
TENS ~ TENS + 1; 60085000
|
|
FRACTION ~ FRACTION | 10 + NC; 60087000
|
|
END NEXT CHARACTER; 60089000
|
|
IF PFLAG THEN CONVERTCON~(INTG+FRACTION/10*TENS)|10*EXPONENT( 60091000
|
|
SYNTAX[SCANCON+L+2]) ELSE CONVERTCON~FRACTION 60093000
|
|
|10*EXPONENT(SYNTAX[SCANCON+L+2]); 60095000
|
|
END CONVERTCON; 60097000
|
|
ALPHA STREAM PROCEDURE JUSTIFY(S); 60097100
|
|
BEGIN LOCAL T; DI~LOC JUSTIFY; DI~DI+2; DS~6 LIT " "; 60097200
|
|
SI~S; SI~SI+1; 6(IF SC ! """ THEN BEGIN SI~SI+1; 60097300
|
|
TALLY~TALLY+1; END); DI~DI-6; T~TALLY; SI~S; 60097400
|
|
SI~SI+1; DS~T CHR; 60097500
|
|
END JUSTIFY; 60097600
|
|
% -------------------------------------------------------------- 60099000
|
|
EXPOVR~EXPERR; 60101000
|
|
I~SCANCODE; IF QSTOP THEN BEGIN 60103000
|
|
INFO[FORMFLAG]~0; 60105000
|
|
INFO[ACCEPTFLAG]~RUNNER[USER]~INFO[MODE]~INFO[BUFINDEX] 60107000
|
|
~0; GO TO XIT; 60109000
|
|
END ELSE 60111000
|
|
IF INFO[MODE] > 0 THEN BEGIN 60113000
|
|
IF SYNTAX[I~SCANCODE].CLASSFIELD = ADSUBOP THEN I~I+1; 60115000
|
|
IF ((T1~(T~SYNTAX[I]).CLASSFIELD) = CON OR T1 = STRNG) 60117000
|
|
AND SYNTAX[I+1] = ENDR THEN BEGIN 60119000
|
|
IF T1 = CON THEN 60119100
|
|
T1~(IF I!SCANCODE THEN IF SYNTAX[I-1].KEYFIELD="1" 60121000
|
|
%CHECK FOR MINUS SIGN 60123000
|
|
THEN -CONVERTCON(T.KEYFIELD) ELSE CONVERTCON(T. 60125000
|
|
KEYFIELD) ELSE CONVERTCON(T.KEYFIELD)) ELSE 60127000
|
|
T1 ~ JUSTIFY(SYNTAX[SCANCON+T.KEYFIELD]); 60127100
|
|
IF INFO[ARRAYFLAG]=0 THEN IDENT[INFO[MODE]]~T1 60129000
|
|
ELSE BEGIN INFO[ARRAYFLAG]~0;USERARRAY[INFO[MODE]-1]60131000
|
|
~T1; END; 60133000
|
|
COMMENT PUT CONSTANT VALUE IN IDENT OR USER ARRAY; 60135000
|
|
IF STACK[INFO[SINDX]] = UNDEFINED THEN 60137000
|
|
STACK[INFO[SINDX]] ~ T1; COMMENT INSERT 60139000
|
|
IN STACK ALSO; 60141000
|
|
RUNNER[USER] ~ "S"; COMMENT RE-SCHEDULE; 60143000
|
|
INFO[MODE] ~ 0; 60145000
|
|
GO TO XIT; 60147000
|
|
END ELSE BEGIN 60149000
|
|
ERRNUMBER~17; COMMENT NOT A NUMBER OR LITERAL; 60151000
|
|
RUNNER[USER]~"E"; 60153000
|
|
GO TO XIT; 60155000
|
|
END DIAGNOSTIC FOR NO CONSTANT; 60157000
|
|
END ACCEPTING A VALUE ELSE BEGIN 60159000
|
|
INFO[RUNCOUNT]~0; 60161000
|
|
IF QYES THEN BEGIN 60163000
|
|
INFO[MODE] ~ 0; 60165000
|
|
INFO[RUNLIMIT]~INFO[RUNLIMIT]|2; 60167000
|
|
RUNNER[USER]~"S"; GO TO XIT; END ELSE 60169000
|
|
IF QNO THEN BEGIN INFO[MODE]~0; GO TO XIT; END ELSE 60171000
|
|
BEGIN 60173000
|
|
ERRNUMBER~18; COMMENT NOT YES OR NO; 60175000
|
|
RUNNER[USER] ~ "E"; 60177000
|
|
GO TO XIT; 60179000
|
|
END ; 60181000
|
|
END ACCEPTING ALPHA CONTROL; 60183000
|
|
EXPERR: ERRNUMBER~19; RUNNER[USER]~"E"; COMMENT EXPONENT OVERFLOW 60185000
|
|
IN ENTERED NUMBER; 60187000
|
|
XIT: END ACCEPT; 60189000
|
|
% ******************************************************************** 70001000
|
|
% ******************************************************************** 70003000
|
|
% **************** E X E C U T E C O D E ************************* 70005000
|
|
% ******************************************************************** 70007000
|
|
% ******************************************************************** 70009000
|
|
COMMENT 70011000
|
|
OP CODE MODIFIER MEANING FUNCTION 70013000
|
|
******* **************** ******** 70015000
|
|
LITERAL VALUE (6 BITS) NUMPER TO TOP OF STACK 70017000
|
|
IDFETCH REL. ADDR. (ID) NUMBER TO TOP OF STACK 70019000
|
|
CONSTANT REL. ADDR. (CODE) NUMBER TO TOP OF STACK 70021000
|
|
ARRAYFETCH REL. ADDR (ID) ARRAY ELEMENT FETCH 70023000
|
|
% ARITHOP OPERATOR # PERFORM ARITH. OP. 70025000
|
|
% RELTEST OPERATOR # PERFORM RELATIONAL TEST70027000
|
|
% FUNCTCALL FUNCTION # PERFORM ARITH FUNCTION 70029000
|
|
NDSTORE REL. ADDR. (ID) NON-DESTRUCTIVE STORE 70031000
|
|
DSTORE REL. ADDR. (ID) DESTRUCTIVE STORE 70033000
|
|
NDSTOREA REL. ADDR. (ID) ARRAY NDSTORE 70035000
|
|
DSTOREA REL. ADDR. (ID) ARRAY DSTORE 70037000
|
|
% DOPART PARTNUMBER DO PART 70039000
|
|
% GOTO STATEMENT # GO TO 70041000
|
|
% BRANCHBACK SYLLABLE COUNT BRANCH BACKWARD 70043000
|
|
% DECRSTACKANDSKIP DECREMENT TOS AND SKIP 70045000
|
|
% INTRINSIC INTRINSIC # CALL ON LOCAL PROCEDURE70047000
|
|
NEXTLINE GO TO NEXT CARD 70049000
|
|
IFNOTRUSKIP SYLLABLE COUNT BRANCH FWD IF FALSE 70051000
|
|
% PRINTSTRING REL. ADDR. (CODE) LITERAL TO IOBUF 70053000
|
|
% PRINTEXP TOP OF STACK TO IOBUF 70055000
|
|
% STOP STOP EXECUTION 70057000
|
|
% IDACCEPT REL. ADDR.(ID) ACCEPT IDENTIFIER VALUE70059000
|
|
% ARRAYACCEPT REL. ADDR. (ID) ACCEPT ARRAY VALUE 70061000
|
|
% FORTRANIF # OF BRANCHES 1,2,3 BRANCH IF 70063000
|
|
% FORM STATEMENT # PROCESS FORMAT 70065000
|
|
; 70067000
|
|
SAVEOPTION 70069000
|
|
ARRAY LINE[0:3]; 70071000
|
|
PROCEDURE EXECUTECODE (CODE, IDENT, INFO, USERARRAY,STACK); 70073000
|
|
ARRAY CODE[0], IDENT[0], INFO[0], USERARRAY[0],STACK[0]; 70075000
|
|
BEGIN 70077000
|
|
LABEL NEXT; 70079000
|
|
LABEL CHECKSTACK; 70081000
|
|
LABEL NEXTONE; 70083000
|
|
LABEL CASOP; 70085000
|
|
LABEL BRANCH; 70087000
|
|
LABEL CASENEXTLINE; 70089000
|
|
LABEL SLEEP, XIT; 70091000
|
|
INTEGER OP, MODIFIER; 70093000
|
|
INTEGER C,S,L; 70095000
|
|
REAL SNUMB; 70097000
|
|
INTEGER CYCLE; 70099000
|
|
FORMAT F1(F*.*), E1(E*.*), R1(R*.*); 70101000
|
|
MONITOR EXPOVR,INTOVR,ZERO,INDEX; 70103000
|
|
LABEL EXPERR,INTERR,ZEROERR,INDEXERR; 70105000
|
|
INTEGER LASTI; 70107000
|
|
DEFINE GOTOSOLVER = SYNTAX#; COMMENT USE FIRST 21 WORDS OF SYNTAX 70109000
|
|
ARRAY FOR COMPUTING AND STACKING BRANCH INDECES; 70111000
|
|
INTEGER STREAM PROCEDURE MOVELIT(S,D,N32,N1); VALUE N32, N1; 70113000
|
|
BEGIN 70115000
|
|
SI~S; SI~SI+1; DI~D; N32(DI~DI+32); DI~DI+N1; 70117000
|
|
7(IF SC = """ THEN JUMP OUT; TALLY~TALLY+1; DS~CHR); 70119000
|
|
MOVELIT~TALLY; 70121000
|
|
END MOVELIT; 70123000
|
|
STREAM PROCEDURE INSERTARROW(S,D,N32,N1); VALUE N32, N1; 70125000
|
|
BEGIN LABEL XIT; 70127000
|
|
DI~S; N32(DI~DI+32); DI~DI+N1; DS~ LIT "~"; SI~S; DI~D; 70129000
|
|
2(36(IF SC = "~" THEN JUMP OUT 2 TO XIT; DS~CHR)); 70131000
|
|
XIT: DS~ LIT "~"; 70133000
|
|
END INSERTARROW; 70135000
|
|
STREAM PROCEDURE MOVESTRINGONLY(S,D); 70137000
|
|
BEGIN LABEL LOOP; 70139000
|
|
SI~S; 63(IF SC!""" THEN SI~SI+1 ELSE JUMP OUT); SI~SI+1; 70141000
|
|
DI~D; 70143000
|
|
LOOP:IF SC =""" THEN DS~LIT "~" ELSE BEGIN DS~CHR; GO TO LOOP; 70145000
|
|
END COPY TO QUOTE; 70147000
|
|
END MOVE STRING ONLY; 70149000
|
|
STREAM PROCEDURE MOVECHARS(S,S32,S1,N,D,D32,D1); VALUE S32,S1,N,D32,D1;70151000
|
|
BEGIN 70153000
|
|
SI~S; S32(SI~SI+32); SI~SI+S1; DI~D; D32(DI~DI+32); 70155000
|
|
DI~DI+D1; DS~N CHR; 70157000
|
|
END MOVECHARS; 70159000
|
|
STREAM PROCEDURE MOVEALPHA(D,T,S); VALUE T; 70159100
|
|
BEGIN DI~D; SI~S; SI~SI+2; DS~T CHR; END; 70159200
|
|
STREAM PROCEDURE MOVEBLANKS(N32,N1,D,D32,D1); 70159300
|
|
VALUE N32,N1,D32,D1; 70159400
|
|
BEGIN DI~D; D32(DI~DI+32); DI~DI+D1; N32(DS~32 LIT " "); 70159500
|
|
N1(DS~LIT " "); 70159600
|
|
END MOVEBLANKS; 70159700
|
|
STREAM PROCEDURE REPEATCHAR(D,D32,D1,N32,N1,C); VALUE D32,D1,N32,N1,C; 70159800
|
|
BEGIN SI~LOC C; SI~SI+2; DI~D; D32(DI~DI+32); DI~DI+D1; 70159900
|
|
N32(32(DS~CHR; SI~SI-1)); N1(DS~CHR; SI~SI-1); END; 70160000
|
|
STREAM PROCEDURE MOVEBLANK(D,D32,D1); VALUE D32,D1; 70161000
|
|
BEGIN DI~D; D32(DI~DI+32); DI~DI+D1; DS~LIT " "; END; 70163000
|
|
STREAM PROCEDURE REQUEST (S,QMARK,D,STACK,N); VALUE QMARK,N; 70165000
|
|
BEGIN LOCAL T,T1,T2; 70167000
|
|
SI~S; SKIP 2 SB; DI~LOC T; DI~DI+7; SKIP 2 DB; 4(IF SB THEN 70169000
|
|
DS~1 SET ELSE DS~1 RESET; SKIP 1 SB); 70171000
|
|
SI~LOC T; SI~SI+7; SKIP 2 SB; IF SB THEN 70173000
|
|
BEGIN 70175000
|
|
DI~D; DS~15 LIT "."; SI~S; SI~SI+1; DI~D; 70177000
|
|
DS~7 CHR; DI~D; DI~DI+T; 70179000
|
|
END ELSE 70181000
|
|
BEGIN 70183000
|
|
DI~D; SI~S; SI~SI+1; DS~T CHR; 70185000
|
|
END; 70187000
|
|
SI~S; SKIP 1 SB; IF SB THEN 70189000
|
|
BEGIN 70191000
|
|
DS~1 LIT "["; SI~STACK; T2~SI; N(T1~DI; SI~T2; DI~LOC T; 70193000
|
|
DI~DI+5; DS~3 DEC; T2~SI; SI~LOC T; SI~SI+5; DI~T1; 70195000
|
|
IF SC = "0" THEN BEGIN SI~SI+1; IF SC = "0" THEN BEGIN SI~SI+170197000
|
|
; DS~1 CHR; END ELSE DS~2 CHR; END ELSE DS~3 CHR; 70199000
|
|
DS~1 LIT ","); DI~DI-1; DS~1 LIT "]"; END; 70201000
|
|
DS~1 LIT "="; SI~LOC QMARK; SI~SI+7; DS~1 CHR; DS~1 LIT "~"; 70203000
|
|
END REQUEST; 70205000
|
|
STREAM PROCEDURE INSERTQMARK(D,Q); VALUE Q; 70207000
|
|
BEGIN DI~D; SI~LOC Q; SI~SI+7; DS~CHR; DS~LIT"~"; END; 70209000
|
|
REAL PROCEDURE RAND(V,INFO); VALUE V; INTEGER V; ARRAY INFO[0]; 70211000
|
|
BEGIN 70213000
|
|
DEFINE FORCESEG = #; 70214000
|
|
IF V!0 THEN BEGIN 70215000
|
|
INFO[LASTRAND]~T1~V; 70217000
|
|
T2~25; 70219000
|
|
END ELSE BEGIN 70221000
|
|
T1~INFO[LASTRAND]; 70223000
|
|
T2~1; 70225000
|
|
END; 70227000
|
|
FOR T3~1 STEP 1 UNTIL T2 DO T1~REAL(BOOLEAN(274877906943) AND 70229000
|
|
BOOLEAN(T1+0&T1[35:10:13]&T1[10:23:25])); 70231000
|
|
INFO[LASTRAND]~T1; 70233000
|
|
RAND~T1/274877906943; 70235000
|
|
COMMENT RANDOM NUMBER GENERATOR USING THE POWER RESIDUE METHOD70237000
|
|
274877906943 IS 2*38-1. INITIALLY V IS AN ODD INTEGER, 70239000
|
|
AND AFTER THAT IT IS 0. WHENEVER A NEW STARTING VALUE FOR70241000
|
|
V IS ENTERED, 25 RANDOM NUMBERS ARE GENERATED AND 70243000
|
|
DISCARDED; 70245000
|
|
END RAND; 70247000
|
|
INTEGER PROCEDURE GETDIM(WORD,KEY); VALUE WORD,KEY; INTEGER WORD,KEY; 70249000
|
|
IF KEY=0 THEN GETDIM~WORD.[3:8] ELSE 70251000
|
|
IF KEY=1 THEN GETDIM~WORD.[11:8] ELSE 70253000
|
|
IF KEY=2 THEN GETDIM~WORD.[19:8] ELSE 70255000
|
|
GETDIM~WORD.[27:8]; 70257000
|
|
PROCEDURE ERRCARD(INFO,CODE); ARRAY INFO,CODE[0]; 70259000
|
|
IF INFO[MODEFLAG]=0 THEN BEGIN 70261000
|
|
COMMENT ERROR OCCURRED IN PROGRAM MODE; 70263000
|
|
RUNNER[USER]~"EL"; 70265000
|
|
CODE[CBASE].CLINK~0; 70267000
|
|
INFO[CBASEINDX]~CBASE; 70269000
|
|
COMMENT SET STOPPER LINKS FOR LISTING OF BAD CARD; 70271000
|
|
END ELSE RUNNER[USER]~"E"; 70273000
|
|
INTEGER PROCEDURE ARRAYLOC(L,IDENT,STACK,S,CODE,INFO);VALUE L; 70275000
|
|
REAL S,L; ARRAY IDENT,STACK,CODE,INFO[0]; 70277000
|
|
BEGIN 70279000
|
|
DEFINE FORCESEG = #; 70280000
|
|
T~IDENT[L].[38:10]; 70281000
|
|
T1~IDENT[L].[1:2]; 70283000
|
|
FOR T2~T1 STEP -1 UNTIL 0 DO 70285000
|
|
BEGIN 70287000
|
|
T3~1; 70289000
|
|
IF STACK[S]>GETDIM(IDENT[L],T2) OR STACK[S] < 1 THEN 70291000
|
|
BEGIN 70293000
|
|
ERRNUMBER~20; COMMENT SUBSCRIPT OUT OF RANGE; 70295000
|
|
ERRCARD(INFO,CODE); 70297000
|
|
T~-1; 70299000
|
|
END ELSE 70301000
|
|
BEGIN 70303000
|
|
STACK[S] ~ ENTIER(STACK[S]); 70303100
|
|
FOR T4~T2+1 STEP 1 UNTIL T1 DO T3~T3|GETDIM(IDENT[L],T4);70305000
|
|
IF T}0 THEN 70307000
|
|
T~T+(STACK[(S~S-1)+1]-1)|T3; 70309000
|
|
END; 70311000
|
|
END; 70313000
|
|
ARRAYLOC~T; 70315000
|
|
END ARRAYLOC; 70317000
|
|
INTEGER STREAM PROCEDURE COLUMN(S, O32, O1); VALUE O32, O1; 70319000
|
|
BEGIN SI~S; O32(SI~SI+32); SI~SI+O1; DI~LOC COLUMN; 70321000
|
|
DI~DI+2; DS~CHR; DS~5 LIT " "; END; 70323000
|
|
INTEGER STREAM PROCEDURE SCANR(S, ITEM); VALUE ITEM; 70325000
|
|
BEGIN LOCAL CHAR1, COUNT; LABEL XIT, ERR; 70327000
|
|
TALLY~6; SI~LOC ITEM; SI~SI+7; 5(IF SC = " " THEN BEGIN 70329000
|
|
TALLY~TALLY+63; SI~SI-1; END ELSE JUMP OUT); 70331000
|
|
COUNT~TALLY; SI~LOC ITEM; SI~SI+2; CHAR1~SI; 70333000
|
|
SI~S; TALLY~0; 70335000
|
|
2(36(DI~CHAR1; TALLY~TALLY+1; IF SC="~" THEN JUMP OUT 2 TO 70337000
|
|
ERR ELSE IF SC=DC THEN BEGIN 70339000
|
|
SI~SI-1; DI~DI-1; IF COUNT SC=DC THEN JUMP OUT 2 TO XIT 70341000
|
|
ELSE BEGIN SI~SI-COUNT; SI~SI+1; END END ONE MATCHED)); 70343000
|
|
ERR: TALLY~0; COMMENT 0 MEANS NO MATCH FOUND; 70345000
|
|
XIT: SCANR~TALLY; 70347000
|
|
END SCANR; 70349000
|
|
INTEGER STREAM PROCEDURE FINDFORM(S); 70351000
|
|
BEGIN LOCAL T; 70353000
|
|
DI~LOC T; DS~4 LIT "FORM"; 70355000
|
|
SI~S; 70357000
|
|
56(IF SC=ALPHA THEN IF SC<"0" THEN BEGIN 70359000
|
|
DI~LOC T; IF 4 SC=DC THEN TALLY~TALLY+4 ELSE TALLY~56; 70361000
|
|
JUMP OUT; END FOUND THE FIRST LETTER; 70363000
|
|
SI~SI+1; TALLY~TALLY+1); 70365000
|
|
IF SC="A" THEN BEGIN TALLY~TALLY+2; SI~SI+2; END FORMAT; 70367000
|
|
IF SC=" " THEN TALLY~TALLY+1; COMMENT SKIP A BLANK SEP. ; 70369000
|
|
FINDFORM~TALLY; COMMENT VALUE > 55 MEANS FORM NOT FOUND; 70371000
|
|
END FINDFORM; 70373000
|
|
DEFINE REALCODE = "&"#; 70375000
|
|
DEFINE SCIENTIFIC = "@"#; 70377000
|
|
DEFINE ALPHACODE = """#; 70377100
|
|
STREAM PROCEDURE FORMCRACK(S, S1, S32, FCN, SZ1, SZ2); 70379000
|
|
VALUE S1, S32; 70381000
|
|
BEGIN LOCAL T,T1; 70383000
|
|
COMMENT FORMCRACK RETURNS A FUNCTION CODE AND ONE OR TWO 70385000
|
|
FIELD SIZES. IT BEGIN SCANNING BUFFER S AT S1+32|S32, 70387000
|
|
THE SOURCE POINTER SHOULD BE STEPPED BY SZ1+SZ2 BEFORE 70389000
|
|
THEN NEXT CALL.; 70391000
|
|
LABEL SCI,REALPRE,REALSUF,ERROR,XIT; 70393000
|
|
LABEL AL1; 70393100
|
|
DI~S; DI~DI+32; DI~DI+40; DS~LIT"~"; 70395000
|
|
SI~S; SI~SI+S1; S32(SI~SI+32); 70397000
|
|
DI~SZ1; DS~8 LIT"0"; DI~SZ2; DS~8 LIT "0"; 70399000
|
|
IF SC="~" THEN BEGIN DI~FCN; DS~8 LIT "0000000~"; 70401000
|
|
GO TO XIT; END RETURN ENDFORM STATUS; 70403000
|
|
IF SC = SCIENTIFIC THEN BEGIN DI~FCN; DS~8 LIT "0000000S"; 70405000
|
|
20(TALLY~TALLY+1; SI~SI+1; IF SC!SCIENTIFIC THEN 70407000
|
|
JUMP OUT 1 TO SCI); GO TO ERROR; 70409000
|
|
SCI: T~TALLY; SI~LOC T; DI~SZ1; DS~WDS; GO TO XIT; 70411000
|
|
END HANDLING SCIENTIFIC FIELD; 70413000
|
|
IF SC = ALPHACODE THEN BEGIN DI~FCN; DS~8 LIT "0000000L"; 70413100
|
|
6(TALLY~TALLY+1; SI~SI+1; IF SC ! ALPHACODE THEN 70413200
|
|
JUMP OUT 1 TO AL1); GO TO ERROR; 70413300
|
|
AL1: T~TALLY; SI~LOC T; DI~SZ1; DS~WDS; GO TO XIT; 70413400
|
|
END HANDLING ALPHA FIELD; 70413500
|
|
IF SC=REALCODE THEN BEGIN DI~FCN; DS~8 LIT "0000000F"; 70415000
|
|
15(TALLY~TALLY+1; SI~SI+1; IF SC ! REALCODE THEN JUMP 70417000
|
|
OUT 1 TO REALPRE); GO TO ERROR; 70419000
|
|
REALPRE: T1~SI; T~TALLY; DI~SZ1; SI~ LOC T; DS~ WDS;70421000
|
|
SI~T1; IF SC="." THEN BEGIN 70423000
|
|
TALLY~0; 70425000
|
|
11(SI~SI+1; TALLY~TALLY+1; IF SC ! REALCODE THEN 70427000
|
|
JUMP OUT 1 TO REALSUF); GO TO ERROR; 70429000
|
|
REALSUF: T~TALLY; DI~SZ2; SI~LOC T; DS~ WDS; 70431000
|
|
END REAL SUFFIX; 70433000
|
|
GO TO XIT; 70435000
|
|
END REAL; 70437000
|
|
TALLY~0; DI~FCN; DS~8 LIT "0000000A"; COMMENT ALPHA DATA; 70439000
|
|
63(TALLY~TALLY+1; SI~SI+1; IF SC="~" THEN JUMP OUT; 70441000
|
|
IF SC = SCIENTIFIC THEN JUMP OUT; 70443000
|
|
IF SC = ALPHACODE THEN JUMP OUT; 70443100
|
|
IF SC = REALCODE THEN JUMP OUT); 70445000
|
|
T~TALLY; DI~SZ1; SI~LOC T; DS~1 WDS; 70447000
|
|
GO TO XIT; 70449000
|
|
ERROR: DI~FCN; DS~8 LIT "0000000E"; COMMENT RETURN ERROR CODE; 70451000
|
|
XIT: END FORMCRACK; 70453000
|
|
%-------------------------- G E T N E X T D A T A ----------------------70455000
|
|
REAL PROCEDURE GETNEXTDATA(V,INFO,CODE); REAL V; 70457000
|
|
ARRAY INFO,CODE[0]; 70459000
|
|
BEGIN 70461000
|
|
INTEGER STREAM PROCEDURE FINDDATA(S); 70463000
|
|
BEGIN 70465000
|
|
SI~S; 70467000
|
|
63(IF SC = ALPHA THEN IF SC < "0" THEN JUMP OUT; TALLY~TALLY+1; 70469000
|
|
SI~SI+1); 70471000
|
|
TALLY~TALLY+4; 70473000
|
|
FINDDATA~TALLY; 70475000
|
|
END FINDDATA; 70477000
|
|
INTEGER STREAM PROCEDURE GETDATA(S,N32,N1,D,P); VALUE N1,N32; 70479000
|
|
BEGIN 70481000
|
|
LABEL XIT,DEBLANK,DEB,STRING,LOOP,NR ,EXPO,EXP,E1,E2,ENDSTR,S1; 70483000
|
|
LOCAL T,T1,T2,SI1,DI1; 70485000
|
|
DI~P; DS~8 LIT "0"; 70487000
|
|
SI~S; N32(SI~SI+32); SI~SI+N1; 70489000
|
|
DI~D; DS~24 LIT "0"; 70491000
|
|
IF SC = "~" THEN GO TO XIT; 70493000
|
|
DEBLANK: 70495000
|
|
IF SC = " " THEN BEGIN DEB: ADD1TOP; SI~SI+1; GO TO DEBLANK END; 70497000
|
|
IF SC = "," THEN GO TO DEB; 70499000
|
|
IF SC = "~" THEN GO TO XIT; 70501000
|
|
IF SC = "+" THEN GO TO DEB; 70503000
|
|
IF SC = "-" THEN 70505000
|
|
BEGIN 70507000
|
|
DI~LOC GETDATA; DS~LIT "+"; 70509000
|
|
COMMENT SET RETURNED VALUE NEGATIVE; 70511000
|
|
GO TO DEB; 70513000
|
|
END; 70515000
|
|
IF SC = """ THEN GO TO STRING; 70517000
|
|
COMMENT NUMBER; 70519000
|
|
T2~SI; SI~SI+1; TALLY~1; ADD1TOP; 70521000
|
|
LOOP: 70523000
|
|
IF SC = "." THEN GO TO NR; 70525000
|
|
IF SC } "0" THEN 70527000
|
|
BEGIN 70529000
|
|
NR: SI~SI+1; ADD1TOP; TALLY~TALLY+1; GO TO LOOP; 70531000
|
|
END ELSE 70533000
|
|
BEGIN 70535000
|
|
T1~TALLY; SI~LOC T1; SI~SI+7; DI~D; DS~CHR; SI~T2; 70537000
|
|
DS~T1 CHR; T2~SI; GO TO EXPO; 70539000
|
|
END; 70541000
|
|
EXPO:IF SC = " " THEN BEGIN SI~SI+1; ADD1TOP; GO TO EXPO; END; 70543000
|
|
IF SC = "@" THEN GO TO EXP; 70545000
|
|
IF SC = "E" THEN 70547000
|
|
BEGIN 70549000
|
|
EXP: SI~SI+1; ADD1TOP; 70551000
|
|
E1: IF SC = " " THEN BEGIN SI~SI+1; ADD1TOP; GO TO E1; END; 70553000
|
|
IF SC = "+" THEN GO TO E2; 70555000
|
|
IF SC = "-" THEN GO TO E2; 70557000
|
|
IF SC } "0" THEN 70559000
|
|
BEGIN 70561000
|
|
E2: DI~D; DI~DI+16; DS~LIT "E"; DS~CHR; 70563000
|
|
3(IF SC } "0" THEN BEGIN DS~CHR; ADD1TOP;END);DS~LIT ".";70565000
|
|
END; 70567000
|
|
ADD1TOP; 70569000
|
|
END; 70571000
|
|
DI~LOC GETDATA; DI~DI+7; DS~LIT "2"; 70573000
|
|
GO TO XIT; 70575000
|
|
STRING: 70577000
|
|
SI~SI+1; ADD1TOP; TALLY~0; T1~SI; 70579000
|
|
6(IF SC = """ THEN JUMP OUT TO ENDSTR ELSE BEGIN SI~SI+1; 70581000
|
|
TALLY~TALLY+1; ADD1TOP; END); 70583000
|
|
S1: IF SC ! """ THEN BEGIN SI~SI+1; ADD1TOP; GO TO S1; END; 70585000
|
|
ENDSTR: 70587000
|
|
SI~SI+1; ADD1TOP; 70589000
|
|
DI~D; DI~DI+2; DS~6 LIT " "; DI~DI-6; T~TALLY; 70591000
|
|
SI~T1; DS~T CHR; 70591100
|
|
DI~LOC GETDATA; DI~DI+7; DS~LIT "1"; 70593000
|
|
XIT: 70595000
|
|
END GETDATA; 70597000
|
|
INTEGER STREAM PROCEDURE EXPONENT(E); VALUE E; 70599000
|
|
BEGIN LOCAL T; 70601000
|
|
SI~LOC E; IF SC = "E" THEN 70603000
|
|
BEGIN 70605000
|
|
TALLY~0; SI~SI+1; IF SC < "0" THEN SI~SI+1; 70607000
|
|
3(IF SC = "." THEN JUMP OUT ELSE TALLY~TALLY+1; SI~SI+1); 70609000
|
|
T~TALLY; SI~SI-T; DI~LOC EXPONENT; DS~T OCT; 70611000
|
|
DI~LOC EXPONENT; SKIP 1 DB; SI~LOC E; SI~SI+1; 70613000
|
|
IF SC = "-" THEN DS~1 SET; 70615000
|
|
END EXPONENT PART PRESENT; 70617000
|
|
END EXPONENT; 70619000
|
|
INTEGER STREAM PROCEDURE NCR(S,N); VALUE N; 70621000
|
|
BEGIN SI~S; SI~SI+N; DI~LOC NCR; DI~DI+7; DS~CHR; END; 70623000
|
|
REAL PROCEDURE CONVERTCON(INFO); ARRAY INFO[0]; 70625000
|
|
BEGIN 70627000
|
|
DEFINE FORCESEG = #; 70628000
|
|
INTG~FRACTION~TENS~0; 70629000
|
|
PFLAG~FALSE; 70631000
|
|
FOR I~1 STEP 1 UNTIL NCR(INFO[ALTBUF],0) DO 70633000
|
|
IF NC~NCR(INFO[ALTBUF],I) = "." THEN 70635000
|
|
BEGIN 70637000
|
|
PFLAG~TRUE; 70639000
|
|
INTG~FRACTION; 70641000
|
|
FRACTION~TENS~0; 70643000
|
|
END ELSE 70645000
|
|
BEGIN 70647000
|
|
TENS~TENS+1; 70649000
|
|
FRACTION~FRACTION|10+NC; 70651000
|
|
END NEXT CHARACTER; 70653000
|
|
IF PFLAG THEN CONVERTCON~(INTG+FRACTION/10*TENS)|10* 70655000
|
|
EXPONENT(INFO[ALTBUF+2]) ELSE 70657000
|
|
CONVERTCON~FRACTION|10*EXPONENT(INFO[ALTBUF+2]); 70659000
|
|
END CONVERTCON; 70661000
|
|
% 70663000
|
|
LABEL XIT,AGAIN; 70665000
|
|
BOOLEAN SLICE; 70667000
|
|
SLICE ~ FALSE; 70669000
|
|
IF INFO[DATASTART] = 0 THEN 70671000
|
|
BEGIN 70673000
|
|
GETNEXTDATA~0; 70675000
|
|
GO TO XIT; 70677000
|
|
END; 70679000
|
|
IF T1~INFO[DATAPOINTER] = 0 THEN T1~INFO[DATAPOINTER]~ 70681000
|
|
INFO[DATASTART]; 70683000
|
|
AGAIN: 70685000
|
|
T2~CODE[T1].CDISKADDR; 70687000
|
|
IF DISKPOINTER DIV 3 ! T2 DIV 3 THEN 70689000
|
|
BEGIN 70691000
|
|
IF (T1 ~ T2 DIV 3) ! LISTPOINTER THEN 70693000
|
|
BEGIN 70695000
|
|
READ(DSK[LISTPOINTER ~ T1],30,LISTBUF[*]); 70697000
|
|
SLICE ~ TRUE; 70699000
|
|
END; 70701000
|
|
IF INFO[DATAINDEX] = 0 THEN INFO[DATAINDEX] ~ FINDDATA( 70703000
|
|
LISTBUF[ T2 MOD 3|10]); 70705000
|
|
T~GETDATA(LISTBUF[T2 MOD 3|10],(T1~INFO[DATAINDEX]) DIV 32, 70707000
|
|
ENTIER(T1 MOD 32),INFO[ALTBUF],T3); 70709000
|
|
END ELSE 70711000
|
|
BEGIN 70713000
|
|
IF INFO[DATAINDEX] = 0 THEN INFO[DATAINDEX] ~ FINDDATA( 70715000
|
|
DISKBUF[ T2 MOD 3|10]); 70717000
|
|
T~GETDATA(DISKBUF[T2 MOD 3|10],(T1~INFO[DATAINDEX]) DIV 32, 70719000
|
|
ENTIER(T1 MOD 32),INFO[ALTBUF],T3); 70721000
|
|
END; 70723000
|
|
INFO[DATAINDEX]~INFO[DATAINDEX]+T3; 70725000
|
|
IF T2~ABS(T) = 0 THEN 70727000
|
|
BEGIN 70729000
|
|
COMMENT DATA STATEMENT EXHAUSTED; 70731000
|
|
IF T1~CODE[INFO[DATAPOINTER]+1].[38:10] = 0 THEN 70733000
|
|
BEGIN 70735000
|
|
GETNEXTDATA~0; 70737000
|
|
GO TO XIT; 70739000
|
|
END; 70741000
|
|
INFO[DATAPOINTER] ~ T1; 70743000
|
|
INFO[DATAINDEX] ~ 0; 70745000
|
|
GO TO AGAIN; 70747000
|
|
END; 70749000
|
|
GETNEXTDATA ~ IF SLICE THEN -1 ELSE 1; 70751000
|
|
COMMENT SET FOR TIME SLICE ON READ; 70753000
|
|
IF T2 = 1 THEN 70755000
|
|
BEGIN COMMENT STRING; 70757000
|
|
V~INFO[ALTBUF]|SIGN(T); 70759000
|
|
GO TO XIT; 70761000
|
|
END; 70763000
|
|
V~CONVERTCON(INFO)|SIGN(T); 70765000
|
|
XIT: 70767000
|
|
END GETNEXTDATA; 70769000
|
|
PROCEDURE MOVEFIELD(INFO,CODE,XIT); LABEL XIT; ARRAY INFO, CODE[0]; 70771000
|
|
DO BEGIN 70773000
|
|
DEFINE FORCESEG = #; 70774000
|
|
COMMENT THIS PROCEDURE MOVES THE NEXT ALPHA FIELD FROM A FORM70775000
|
|
STATEMENT INTO THE OUTPUT BUFFER; 70777000
|
|
FORMCRACK(LISTBUF[T~INFO[FORMPOINTER] MOD 3|10], 70779000
|
|
ENTIER((T1~INFO[FORMINDEX]) MOD 32),T1 DIV 32,T2,T3,T4); 70781000
|
|
IF T2="E" THEN 70783000
|
|
BEGIN 70785000
|
|
ERRNUMBER~40; COMMENT FIELD TOO LARGE; 70787000
|
|
ERRCARD(INFO,CODE); 70789000
|
|
GO TO XIT; 70791000
|
|
END; 70793000
|
|
IF T2="A" THEN 70795000
|
|
BEGIN 70797000
|
|
IF INFO[BUFINDEX]+T3 < 73 THEN 70799000
|
|
MOVECHARS(LISTBUF[T],T1 DIV 32,ENTIER(T1 MOD 32),T3, 70801000
|
|
INFO[ALTBUF],(T2~INFO[BUFINDEX]) DIV 32, ENTIER( 70803000
|
|
T2 MOD 32)); 70805000
|
|
INFO[BUFINDEX]~T2+T3; 70807000
|
|
INFO[FORMINDEX]~T1+T3; 70809000
|
|
END; 70811000
|
|
END UNTIL T3<63; 70813000
|
|
STREAM PROCEDURE STOPMSG(P,S,D); VALUE P,S; 70815000
|
|
BEGIN LOCAL T,T1; 70817000
|
|
DI~D; SI~LOC P; DS~18 LIT "STOP AT STATEMENT "; T1~DI; 70819000
|
|
DI~LOC T; DS~2DEC; SI~LOC T; DI~T1; IF SC="0" THEN BEGIN 70821000
|
|
SI~SI+1; DS~CHR; END ELSE DS~2 CHR; DS~LIT "."; T1~DI; 70823000
|
|
DI~LOC T; SI~LOC S; DS~3 DEC; SI~LOC T; DI~T1; DS~CHR; 70825000
|
|
IF SC!"0" THEN BEGIN DS~CHR; IF SC!"0" THEN DS~CHR; END 70827000
|
|
ELSE BEGIN SI~SI+1; IF SC!"0" THEN BEGIN SI~SI-1; DS~2 CHR; END;70829000
|
|
END; DS~LIT "~"; 70831000
|
|
END STOPMSG; 70833000
|
|
STREAM PROCEDURE OUTOFDATAMSG(P,S,D); 70835000
|
|
VALUE P,S; 70837000
|
|
BEGIN LOCAL T,T1; 70839000
|
|
DI~D; SI~LOC P; DS~23 LIT "OUT OF DATA, STATEMENT "; T1~DI; 70841000
|
|
DI~LOC T; DS~2 DEC; SI~LOC T; DI~T1; 70843000
|
|
IF SC = "0" THEN 70845000
|
|
BEGIN 70847000
|
|
SI~SI+1; DS~CHR; 70849000
|
|
END ELSE DS~2 CHR; 70851000
|
|
DS~LIT "."; T1~DI; DI~LOC T; SI~LOC S; DS~3 DEC; SI~LOC T; 70853000
|
|
DI~T1; DS~CHR; 70855000
|
|
IF SC ! "0" THEN 70857000
|
|
BEGIN 70859000
|
|
DS~CHR; IF SC ! "0" THEN DS~CHR; 70861000
|
|
END ELSE 70863000
|
|
BEGIN 70865000
|
|
SI~SI+1; IF SC ! "0" THEN 70867000
|
|
BEGIN 70869000
|
|
SI~SI-1; DS~2 CHR; 70871000
|
|
END; 70873000
|
|
END; 70875000
|
|
DS~LIT "~"; 70877000
|
|
END OUTOFDATAMSG; 70879000
|
|
STREAM PROCEDURE NXT (C,L,OP,M); VALUE L; 70881000
|
|
BEGIN 70883000
|
|
SI~C;SI~SI+L; DI~OP; DI~DI+7; 70885000
|
|
DS ~ 1 CHR; DI ~ M; DI ~ DI + 7; DS ~ 1 CHR; END NXT; 70887000
|
|
DEFINE READNEXTINSTRUCTION = 70889000
|
|
NXT(CODE[C], L+L, OP, MODIFIER); 70891000
|
|
IF L ~ L + 1 = 4 THEN BEGIN L ~ 0; C ~ C + 1; END STEPPING C; 70893000
|
|
#; 70895000
|
|
% ---------------------------------------------------------------- 70897000
|
|
INTOVR~INTERR; 70899000
|
|
EXPOVR~EXPERR; 70901000
|
|
ZERO~ZEROERR; 70903000
|
|
INDEX~INDEXERR; 70905000
|
|
CBASE ~ INFO[CBASEINDX]; 70907000
|
|
C ~ INFO[CINDX]; 70909000
|
|
L ~ INFO[LINDX]; 70911000
|
|
S ~ INFO[SINDX]; COMMENT SET UP REGISTERS FOR EXECUTE; 70913000
|
|
CYCLE ~ 100/ (MAXUSER+1); COMMENT SET TIME SLICE COUNTER; 70915000
|
|
LASTI ~ 0; 70917000
|
|
NEXT: IF (INFO[RUNCOUNT]~INFO[RUNCOUNT]+1)>INFO[RUNLIMIT] THEN BEGIN70919000
|
|
RUNNER[USER]~"E"; INFO[MODE]~-1; ERRNUMBER~21; 70921000
|
|
COMMENT TYPE "DO YOU WISH TO CONTINUE..."; 70923000
|
|
GO TO SLEEP; END TOO MUCH EXECUTE;IF CYCLE~CYCLE-1=0 70925000
|
|
THEN BEGIN RUNNER[USER]~"S";GO TO SLEEP;END FORCED 70927000
|
|
TIME SLICING; 70929000
|
|
IF CODE[CBASE].CSIZE = 1 THEN GO TO CASENEXTLINE; 70931000
|
|
NEXTONE: READNEXTINSTRUCTION; 70933000
|
|
IF DEBUG THEN WRITE (PR,XFMT, C, L, OP, MODIFIER, S); 70935000
|
|
CASOP: CASE OP OF BEGIN COMMENT SWITCH ON OP CODE ----------; 70937000
|
|
BEGIN RUNNER[USER]~"E"; GO TO XIT; END OP CODE 0; 70939000
|
|
%LITERAL 70941000
|
|
STACK[S ~ S + 1] ~ MODIFIER; COMMENT LITERAL; 70943000
|
|
%IDFETCH 70945000
|
|
BEGIN T ~ STACK[S~S+1] ~ IDENT[MODIFIER + MODIFIER+ 1]; 70947000
|
|
IF T = UNDEFINED THEN BEGIN INFO[MODE] ~ 70949000
|
|
T1 ~ MODIFIER+ MODIFIER+ 1; 70951000
|
|
IF BOOLEAN(INFO[ACCEPTFLAG])THEN S~S-1; 70953000
|
|
REQUEST(IDENT[T1-1],12,INFO[IOBUF],INFO[ 70955000
|
|
IOBUF],0); 70957000
|
|
RUNNER[USER] ~"E"; 70959000
|
|
GO TO SLEEP; 70961000
|
|
END; END HANDLING AN UNDEFINED IDENT 70963000
|
|
ON AN IDENTIFIER FETCH; 70965000
|
|
%CONSTANT 70967000
|
|
STACK[S~S+1] ~ CODE[CBASE+MODIFIER]; COMMENT CONSTANT; 70969000
|
|
%ARRAYFETCH 70971000
|
|
BEGIN IF T1~ARRAYLOC(T5~MODIFIER+MODIFIER+1,IDENT,STACK, 70973000
|
|
S,CODE,INFO)<0 THEN %INVALID SUBSCRIPT 70975000
|
|
GO TO XIT; IF T~USERARRAY[T1]= 70977000
|
|
UNDEFINED THEN BEGIN 70979000
|
|
INFO[MODE]~T1+1; 70981000
|
|
REQUEST(IDENT[T5-1],12,INFO[IOBUF],STACK[S+1], 70983000
|
|
IDENT[T5].[1:2]+1); 70985000
|
|
INFO[ARRAYFLAG]~1; 70987000
|
|
RUNNER[USER]~"E"; 70989000
|
|
STACK[(S~S+1)]~UNDEFINED; 70991000
|
|
GO TO SLEEP; 70993000
|
|
END HANDLING AN UNDEFINED ARRAY ELEMENT ELSE 70995000
|
|
STACK[S~S+1]~T; COMMENT ARRAY FETCH; END; 70997000
|
|
%ARITHOP 70999000
|
|
CASE MODIFIER OF BEGIN COMMENT ARITH OPERATION; 71001000
|
|
STACK[S~S-1]~STACK[S]+STACK[S+1]; COMMENT ADD; 71003000
|
|
STACK[S~S-1]~STACK[S]-STACK[S+1]; COMMENT SUB; 71005000
|
|
STACK[S~S-1]~STACK[S]|STACK[S+1]; COMMENT MPY; 71007000
|
|
STACK[S~S-1]~STACK[S]/STACK[S+1]; COMMENT RDV; 71009000
|
|
BEGIN COMMENT A**B; 71011000
|
|
IF STACK[S-1]<0 AND STACK[S] MOD 1 !0 THEN 71013000
|
|
BEGIN ERRNUMBER~22; ERRCARD(INFO,CODE); 71015000
|
|
GO TO XIT; END NEGATIVE A ELSE 71017000
|
|
IF STACK[S-1]=0 THEN STACK[S~S-1]~0 ELSE 71019000
|
|
IF ABS(STACK[S]|LN(ABS(STACK[S-1])))>158 THEN 71021000
|
|
BEGIN ERRNUMBER~23; ERRCARD(INFO,CODE); 71023000
|
|
COMMENT A**B OUT OF RANGE; 71025000
|
|
GO TO XIT; END ELSE 71027000
|
|
STACK[S~S-1]~STACK[S]*STACK[S+1]; 71029000
|
|
END; 71031000
|
|
STACK[S~S-1]~STACK[S] DIV STACK[S+1]; 71033000
|
|
STACK[S~S-1]~STACK[S] MOD STACK[S+1]; 71035000
|
|
STACK[S] ~ -STACK[S]; COMMENT CHANGESIGN; 71037000
|
|
END CASE ARITHOP; 71039000
|
|
%RELTEST 71041000
|
|
CASE MODIFIER OF BEGIN COMMENT RELATIONAL OP; 71043000
|
|
STACK[S~S-1] ~ REAL(STACK[S] = STACK[S+1]); 71045000
|
|
STACK[S~S-1] ~ REAL(STACK[S] ! STACK[S+1]); 71047000
|
|
STACK[S~S-1] ~ REAL(STACK[S] > STACK[S+1]); 71049000
|
|
STACK[S~S-1] ~ REAL(STACK[S] < STACK[S+1]); 71051000
|
|
STACK[S~S-1] ~ REAL(STACK[S] } STACK[S+1]); 71053000
|
|
STACK[S~S-1] ~ REAL(STACK[S] { STACK[S+1]); 71055000
|
|
END CASE OF RELATIONAL OPERATOR; 71057000
|
|
%FUNCTCALL 71059000
|
|
CASE MODIFIER OF BEGIN COMMENT FUNCTIONS; 71061000
|
|
STACK[S] ~ ENTIER (STACK[S]); 71063000
|
|
BEGIN COMMENT LN; 71065000
|
|
IF STACK[S]{0 THEN 71067000
|
|
BEGIN ERRNUMBER~24; ERRCARD(INFO,CODE); 71069000
|
|
GO TO XIT; END NEGATIVE ARGUMENT ELSE 71071000
|
|
STACK[S]~LN(STACK[S]); 71073000
|
|
END; 71075000
|
|
STACK[S] ~ SIN (STACK[S]); 71077000
|
|
STACK[S] ~ COS (STACK[S]); 71079000
|
|
STACK[S] ~ SIN (STACK[S])/COS (STACK[S]); 71081000
|
|
STACK[S] ~ ABS (STACK[S]); 71083000
|
|
BEGIN COMMENT EXP; 71085000
|
|
IF ABS(STACK[S])>158 THEN 71087000
|
|
BEGIN ERRNUMBER~25; ERRCARD(INFO,CODE); 71089000
|
|
GO TO XIT; END EXP OUT OF RANGE ELSE 71091000
|
|
STACK[S]~EXP(STACK[S]); 71093000
|
|
END; 71095000
|
|
STACK[S] ~ RAND(STACK[S],INFO[*]); 71097000
|
|
STACK[S] ~ ARCTAN (STACK[S]); 71099000
|
|
BEGIN COMMENT SQRT; 71101000
|
|
IF STACK[S]<0 THEN 71103000
|
|
BEGIN ERRNUMBER~26; ERRCARD(INFO,CODE); 71105000
|
|
GO TO XIT; END NEGATIVE ARGUMENT ELSE 71107000
|
|
STACK[S]~SQRT(STACK[S]); 71109000
|
|
END; 71111000
|
|
STACK[S] ~ SIGN (STACK[S]); 71113000
|
|
BEGIN COMMENT LOG10; 71115000
|
|
IF STACK[S]{0 THEN 71117000
|
|
BEGIN ERRNUMBER~24; ERRCARD(INFO,CODE); 71119000
|
|
GO TO XIT; END NEGATIVE ARGUMENT ELSE 71121000
|
|
STACK[S]~LN(STACK[S])/2.30258509298; 71123000
|
|
END; 71125000
|
|
BEGIN COMMENT NULL FUNCTION (12); END; 71127000
|
|
IF STACK[S]>0 THEN 71129000
|
|
STACK[S]~COLUMN(INFO[ALTBUF],(T1~ENTIER(STACK[S]-1))71131000
|
|
DIV 32, ENTIER(T1 MOD 32)); 71133000
|
|
STACK[S]~SCANR(INFO[ALTBUF],ENTIER(STACK[S])); 71135000
|
|
BEGIN COMMENT (15); END; 71135020
|
|
BEGIN COMMENT (16); END; 71135040
|
|
BEGIN COMMENT (17); END; 71135060
|
|
BEGIN COMMENT (18) PLOT FUNCTION; 71135080
|
|
IF T1~ENTIER(STACK[(S~S-1)+1])}1 AND T1{72 THEN71135100
|
|
BEGIN 71135120
|
|
IF T1>(T2~INFO[BUFINDEX]) THEN 71135140
|
|
BEGIN 71135160
|
|
MOVEBLANKS((T3~(T1-T2)) DIV 32, 71135180
|
|
ENTIER(T3 MOD 32),INFO[ALTBUF],T2 DIV71135200
|
|
32,ENTIER(T2 MOD 32)); 71135220
|
|
INFO[BUFINDEX] ~ T1; 71135240
|
|
END; 71135260
|
|
MOVECHARS(STACK[(S~S-1)+1],0,2,1,INFO[ 71135280
|
|
ALTBUF],(T1-1) DIV 32,ENTIER((T1-1) 71135300
|
|
MOD 32)); 71135320
|
|
END MOVING PLOT CHAR INTO BUFFER ELSE 71135340
|
|
BEGIN 71135360
|
|
ERRNUMBER ~ 37; ERRCARD(INFO,CODE); 71135380
|
|
GO TO XIT; 71135400
|
|
END ARGUMENT OF PLOT NOT IN RANGE 1 TO 72; 71135420
|
|
END PLOT FUNCTION; 71135440
|
|
BEGIN COMMENT (19) TAB FUNCTION; 71135460
|
|
IF T1~ENTIER(STACK[(S~S-1)+1])}1 AND T1{72 THEN71135480
|
|
IF T1~T1-1 > (T2~INFO[BUFINDEX]) THEN 71135500
|
|
BEGIN 71135520
|
|
MOVEBLANKS((T3~(T1-T2)) DIV 32,ENTIER(T3 71135540
|
|
MOD 32),INFO[ALTBUF],T2 DIV 32, 71135560
|
|
ENTIER(T2 MOD 32)); 71135580
|
|
INFO[BUFINDEX] ~ T1; 71135600
|
|
END ELSE ELSE 71135620
|
|
BEGIN 71135640
|
|
ERRNUMBER~49; ERRCARD(INFO,CODE); 71135660
|
|
GO TO XIT; 71135680
|
|
END ARGUMENT OF TAB NOT IN RANGE 1 TO 72; 71135700
|
|
END TAB FUNCTION; 71135720
|
|
BEGIN COMMENT (20) REPEAT FUNCTION; 71135740
|
|
T2 ~ INFO[BUFINDEX]; 71135760
|
|
T1 ~ MIN(72-T2,STACK[(S~S-1)+1]); 71135780
|
|
IF 0 > T1 THEN T1 ~ 0; 71135800
|
|
REPEATCHAR(INFO[ALTBUF],T2 DIV 32,ENTIER(T2 MOD71135820
|
|
32),T1 DIV 32, ENTIER(T1 MOD 32),STACK[(S~71135840
|
|
S-1)+1]); 71135860
|
|
INFO[BUFINDEX] ~ T2+T1; 71135880
|
|
END REPEAT FUNCTION; 71135900
|
|
END CASE ARITH FUNCTION CALL; 71137000
|
|
%NDSTORE 71139000
|
|
IDENT[MODIFIER + MODIFIER + 1] ~ STACK[S]; COMMENT NON- 71141000
|
|
DESTRUCTIVE STORE; 71143000
|
|
%DSTORE 71145000
|
|
IDENT[MODIFIER + MODIFIER + 1] ~ STACK[(S~S-1)+1]; 71147000
|
|
COMMENT DESTRUCTIVE STORE; 71149000
|
|
%NDSTOREA 71151000
|
|
BEGIN IF T1~ARRAYLOC(MODIFIER+MODIFIER+1,IDENT,STACK, 71153000
|
|
S,CODE,INFO)<0 THEN GO TO XIT;%INVALID SUBSCRIPT 71155000
|
|
USERARRAY[T1]~STACK[S];END; 71157000
|
|
COMMENT ARRAY NON DESTRUCTIVE STORE; 71159000
|
|
%DSTOREA 71161000
|
|
BEGIN IF T1~ARRAYLOC(MODIFIER+MODIFIER+1,IDENT,STACK, 71163000
|
|
S,CODE,INFO)<0 THEN GO TO XIT;% INVALID SUBSCRIPT 71165000
|
|
USERARRAY[T1]~STACK[(S~S-1)+1];END; 71167000
|
|
COMMENT ARRAY DESTRUCTIVE STORE; 71169000
|
|
%DOPART 71171000
|
|
BEGIN 71173000
|
|
SNUMB~MODIFIER; 71175000
|
|
READNEXTINSTRUCTION; 71177000
|
|
SNUMB~0&OP[20:42:2]&SNUMB[15:43:5]; 71179000
|
|
STACK[S+1]~0&63[3:42:6]&SNUMB[15:15:7]&CBASE[26:38: 71181000
|
|
10]&C[36:38:10]&L[46:46:2]; 71183000
|
|
COMMENT PUT RETURN CONTROL WORD IN STACK; 71185000
|
|
C~CODE[0].CLINK; 71187000
|
|
COMMENT LOOK FOR 1ST STATEMENT IN PART; 71189000
|
|
DO BEGIN 71191000
|
|
T~CODE[C]; 71193000
|
|
IF REAL(BOOLEAN(T) AND BOOLEAN(PTMASK))=SNUMB 71195000
|
|
THEN BEGIN 71197000
|
|
S~S+1; 71199000
|
|
CBASE~C; 71201000
|
|
C~C+1; 71203000
|
|
L~0; 71205000
|
|
GO TO NEXT; 71207000
|
|
END ELSE C~T.CLINK; 71209000
|
|
END UNTIL T.CLINK=0; 71211000
|
|
C~1; 71213000
|
|
WHILE C<INFO[CMAX] DO BEGIN T~CODE[C]; 71215000
|
|
IF T.SBIT!1 THEN IF REAL(BOOLEAN(T) AND 71217000
|
|
BOOLEAN(PTMASK))=SNUMB THEN BEGIN ERRNUMBER~27;71219000
|
|
ERRCARD(INFO,CODE); GO TO XIT; END 71221000
|
|
PART PRESENT BUT NOT IN RANGE; 71223000
|
|
C~T.CSIZE+C; 71225000
|
|
END ; 71227000
|
|
ERRNUMBER~28; COMMENT PART NOT PRESENT; 71229000
|
|
ERRCARD(INFO,CODE); 71231000
|
|
GO TO XIT; 71233000
|
|
END DOPART; 71235000
|
|
%GO TO 71237000
|
|
GO TO BRANCH; COMMENT UNCONDITIONAL GO TO; 71239000
|
|
%BRANCHBACK 71241000
|
|
BEGIN L~L-1-MODIFIER; WHILE L<0 DO BEGIN 71243000
|
|
L~L+4;C~C-1;END;END BRANCH BACKWARDS; 71245000
|
|
%DECRSTACKANDSKIP 71247000
|
|
IF (STACK[S]~STACK[S]-1)}0 THEN BEGIN 71249000
|
|
READNEXTINSTRUCTION; GO TO NEXT; END ELSE 71251000
|
|
BEGIN S~S-1; GO TO NEXT; END;%END DECREMENT TOP OF 71253000
|
|
%STACK AND SKIP IF NOT NEGATIVE; 71255000
|
|
%INTRINSIC 71257000
|
|
CASE MODIFIER OF BEGIN 71259000
|
|
BEGIN INSERTARROW(INFO[ALTBUF], INFO[IOBUF], 71261000
|
|
(T1~INFO[BUFINDEX]) DIV 32,ENTIER(T1 MOD 32)); 71263000
|
|
COMMENT PUT ARROW AT END OF PRINT BUFFER; 71265000
|
|
INFO[BUFINDEX]~0; RUNNER[USER]~"P"; 71267000
|
|
INFO[FORMFLAG]~0; 71269000
|
|
INFO[RUNCOUNT] ~ 0; 71269100
|
|
GO TO SLEEP; END PRINT INTRINSIC; 71271000
|
|
STACK[S]~ENTIER(STACK[S]); COMMENT TOS CONTAINS 71273000
|
|
THE NUMBER OF ITERATIONS ON A TIMES CLAUSE IN 71275000
|
|
A DO STATEMENT. THIS INTRINSIC CONVERTS IT TO 71277000
|
|
AN INTEGER TO FORCE THE [3:6] FIELD TO 0; 71279000
|
|
BEGIN COMMENT (2) READ ALPHA CONSTRUCT; 71281000
|
|
INFO[ALPHACCEPT]~1; 71283000
|
|
INSERTQMARK(INFO[IOBUF],12); 71285000
|
|
RUNNER[USER]~"E"; 71287000
|
|
GO TO SLEEP; 71289000
|
|
END ALPHAREAD; 71291000
|
|
BEGIN COMMENT (3) TYPE STRING ONLY; 71293000
|
|
IF T1~(T~CODE[CBASE].CDISKADDR) DIV 3 = 71295000
|
|
DISKPOINTER DIV 3 THEN MOVESTRINGONLY( 71297000
|
|
DISKBUF[T MOD 3 | 10], INFO[IOBUF]) 71299000
|
|
ELSE BEGIN COMMENT NOT IN DISKBUF; 71301000
|
|
IF LISTPOINTER!T1 THEN 71303000
|
|
READ(DSK[LISTPOINTER~T1],30, 71305000
|
|
LISTBUF[*]); 71307000
|
|
MOVESTRINGONLY(LISTBUF[T MOD 3 | 10], 71309000
|
|
INFO[IOBUF]); 71311000
|
|
END MOVING FROM LISTBUF; 71313000
|
|
RUNNER[USER]~"P"; 71315000
|
|
GO TO SLEEP; 71317000
|
|
END TYPESTRING; 71319000
|
|
BEGIN COMMENT(4) IDENTIFIES DATA STMT ONLY; END; 71321000
|
|
BEGIN COMMENT (5) RESTORE STATEMENT; 71323000
|
|
INFO[DATAPOINTER]~0; INFO[DATAINDEX]~0; END; 71325000
|
|
BEGIN COMMENT (6); END; 71325100
|
|
BEGIN COMMENT (7); END; 71325200
|
|
BEGIN COMMENT (8); END; 71325300
|
|
BEGIN COMMENT (9); END; 71325400
|
|
BEGIN COMMENT (10); END; 71325500
|
|
BEGIN COMMENT (11); END; 71325600
|
|
BEGIN COMMENT (12); END; 71325700
|
|
BEGIN COMMENT (13) USE SIGNIFICANCE INTRINSIC; 71325800
|
|
INFO[SIGNIFICANCE] ~ 1; END; 71325900
|
|
BEGIN COMMENT (14) USE TRACE INTRINSIC; 71326000
|
|
DEBUG ~ TRUE; END; 71326100
|
|
BEGIN COMMENT (15) CLEAR SIGNIFICANCE INTR; 71326200
|
|
INFO[SIGNIFICANCE] ~ 0; END; 71326300
|
|
BEGIN COMMENT (16) CLEAR TRACE INTRINSIC; 71326400
|
|
DEBUG ~ FALSE; END; 71326500
|
|
BEGIN COMMENT (17) CLOSE TRACE INTRINSIC; 71326600
|
|
CLOSE(PR,SAVE); COMMENT PRINT DEBUG FILE;END; 71326700
|
|
END INTRINSIC; 71327000
|
|
%NEXTLINE 71329000
|
|
BEGIN CASENEXTLINE: 71331000
|
|
INFO[ACCEPTFLAG]~0; 71333000
|
|
T1~CBASE; 71335000
|
|
CBASE~CODE[CBASE].CLINK; 71337000
|
|
IF CBASE = 0 OR CODE[CBASE].CPARTNUMB! 71339000
|
|
CODE[T1].CPARTNUMB THEN IF S!0 AND 71341000
|
|
STACK[S].[3:6]!0 THEN BEGIN 71343000
|
|
T1~STACK[(S~S-1)+1]; 71345000
|
|
CBASE~T1.[26:10]; 71347000
|
|
C~T1.[36:10]; 71349000
|
|
L~T1.[46:2]; 71351000
|
|
GO TO NEXT; END 71353000
|
|
ELSE IF CBASE=0 THEN BEGIN RUNNER[USER]~0;GO TO XIT;71355000
|
|
END; 71357000
|
|
COMMENT LINK 0 MEANS END OF STATEMENTS; 71359000
|
|
L ~ 0; 71361000
|
|
C ~ CBASE + 1; 71363000
|
|
GO TO NEXT; 71365000
|
|
END HANDLING NEXT LINE; 71367000
|
|
%IFNOTRUSKIP 71369000
|
|
IF STACK[(S~S-1)+1] = 0 THEN BEGIN 71371000
|
|
L ~ L + MODIFIER - 1; WHILE L}4 DO BEGIN 71373000
|
|
L ~ L - 4; C ~ C + 1; END; END IF NOT BFWD; 71375000
|
|
%PRINTSTRING 71377000
|
|
DO BEGIN 71379000
|
|
IF T1~INFO[BUFINDEX]<72 THEN 71381000
|
|
BEGIN 71383000
|
|
T2~MOVELIT(CODE[CBASE+MODIFIER],INFO[ALTBUF], 71385000
|
|
T1 DIV 32,ENTIER(T1 MOD 32)); 71387000
|
|
IF T1+T2<72 THEN 71389000
|
|
BEGIN 71391000
|
|
INFO[BUFINDEX]~T1+T2; 71393000
|
|
IF T2=7 THEN MODIFIER~MODIFIER+1; 71395000
|
|
END ELSE INFO[BUFINDEX]~72; 71397000
|
|
END; 71399000
|
|
END UNTIL T2!7 OR INFO[BUFINDEX]}72; 71401000
|
|
%PRINTEXP 71403000
|
|
BEGIN 71405000
|
|
DEFINE SEGMENT = #; 71407000
|
|
IF INFO[FORMFLAG]=0 THEN 71409000
|
|
BEGIN 71411000
|
|
T2~6; 71413000
|
|
T3~4; 71415000
|
|
IF ABS(T1~STACK[S]){549755813887 THEN IF T1= 71417000
|
|
ENTIER(T1) THEN 71419000
|
|
BEGIN 71421000
|
|
COMMENT INTEGER; 71423000
|
|
FOR T2~3 STEP 3 WHILE ABS(T1)}10*T2 DO ; 71425000
|
|
IF ABS(T1)}10*(T2-1)AND T1<0 THEN T2~T2+3;71427000
|
|
T3~0; 71429000
|
|
END; 71431000
|
|
IF T3!0 THEN IF BOOLEAN(INFO[SIGNIFICANCE]) 71433000
|
|
THEN BEGIN T2~12; T3~9; END MORE PLACES 71435000
|
|
ELSE IF ABS(T1)>999999.99 THEN T2~T2+6; 71437000
|
|
IF T3=0 THEN WRITE(LINE[*],F1,T2+1,0, 71439000
|
|
STACK[(S~S-1)+1]) ELSE WRITE(LINE[*],R1, 71441000
|
|
T2+T3, T3-1, 71443000
|
|
STACK[(S~S-1)+1]); 71445000
|
|
END NO FORM ELSE 71447000
|
|
BEGIN 71449000
|
|
IF T2~INFO[FORMPOINTER] DIV 3! LISTPOINTER 71451000
|
|
THEN READ(DSK[LISTPOINTER~T2],30, 71453000
|
|
LISTBUF[*]); 71455000
|
|
FORMCRACK (LISTBUF[T~INFO[FORMPOINTER] MOD 3 71457000
|
|
|10],ENTIER((T1~INFO[FORMINDEX]) MOD 32), 71459000
|
|
T1 DIV 32, T4, T2, T3); 71461000
|
|
IF T4 = "~" THEN 71463000
|
|
BEGIN 71465000
|
|
ERRNUMBER~41; COMMENT TOO FEW FIELDS 71467000
|
|
IN A FORM STATEMENT; 71469000
|
|
ERRCARD(INFO,CODE); 71471000
|
|
GO TO XIT; 71473000
|
|
END; 71475000
|
|
IF T4="E" THEN BEGIN 71477000
|
|
ERRNUMBER~40; COMMENT FIELD TOO LARGE; 71479000
|
|
ERRCARD(INFO,CODE); 71481000
|
|
GO TO XIT; 71483000
|
|
END FORMCRACK RETURNED ERROR; 71485000
|
|
INFO[FORMINDEX]~T1+T2+T3; 71487000
|
|
IF T4="F" THEN WRITE(LINE[*],F1,T2+T3+(IF T3=0 71489000
|
|
THEN 1 ELSE 0), IF T3=0 71491000
|
|
THEN 0 ELSE T3-1,STACK[(S~S-1)+1]) ELSE 71493000
|
|
IF T4 = "L" THEN MOVEALPHA(LINE[*],T2,STACK[(S~S-1) 71493100
|
|
+1]) ELSE 71493200
|
|
WRITE(LINE[*],E1,T2+T3,IF T2<8 THEN 0 ELSE71495000
|
|
T2-7,STACK[(S~S-1)+1]); 71497000
|
|
END; 71499000
|
|
IF INFO[BUFINDEX]+T2+T3<72 THEN 71501000
|
|
BEGIN 71503000
|
|
MOVECHARS(LINE[*],0,0,ENTIER(T2+T3),INFO[ALTBUF71505000
|
|
], 71507000
|
|
(T1~INFO[BUFINDEX]) DIV 32,ENTIER(T1 MOD 32)); 71509000
|
|
INFO[BUFINDEX]~T1+T2+T3; 71511000
|
|
END; 71513000
|
|
IF INFO[FORMFLAG]=1 THEN MOVEFIELD(INFO,CODE,XIT) 71515000
|
|
ELSE IF T1~INFO[BUFINDEX]<72 THEN 71517000
|
|
BEGIN 71519000
|
|
MOVEBLANK(INFO[ALTBUF],T1 DIV 32,ENTIER(T1 MOD 71521000
|
|
32)); 71523000
|
|
INFO[BUFINDEX]~T1+1; 71525000
|
|
END MOVING IN A BLANK TO SEPARATE FIELDS; 71527000
|
|
END PRINTEXP; 71529000
|
|
%STOP 71531000
|
|
BEGIN 71533000
|
|
STOPMSG((T1~CODE[CBASE]).CPARTNUMB,T1.CSTEPNUMB, 71535000
|
|
INFO[IOBUF]); 71537000
|
|
RUNNER[USER]~"E"; 71539000
|
|
GO TO XIT; 71541000
|
|
END STOP; 71543000
|
|
%IDACCEPT 71545000
|
|
BEGIN 71547000
|
|
INFO[ACCEPTFLAG]~1; 71549000
|
|
INFO[MODE]~T1~MODIFIER+MODIFIER+1; 71551000
|
|
REQUEST(IDENT[T1-1],12,INFO[IOBUF],INFO[IOBUF],0); 71553000
|
|
RUNNER[USER]~"E"; 71555000
|
|
GO TO SLEEP; 71557000
|
|
END IDACCEPT; 71559000
|
|
%ARRAYACCEPT 71561000
|
|
BEGIN 71563000
|
|
IF T1~ARRAYLOC(T5~MODIFIER+MODIFIER+1,IDENT,STACK, 71565000
|
|
S,CODE,INFO)<0 THEN GO TO XIT;%INVALID SUBSCRIPT 71567000
|
|
INFO[MODE]~T1+1; 71569000
|
|
REQUEST(IDENT[T5-1],12,INFO[IOBUF],STACK[S+1], 71571000
|
|
IDENT[T5].[1:2]+1); 71573000
|
|
INFO[ACCEPTFLAG]~1; 71575000
|
|
INFO[ARRAYFLAG]~1; 71577000
|
|
RUNNER[USER]~"E"; 71579000
|
|
GO TO SLEEP; 71581000
|
|
END ARRAYACCEPT; 71583000
|
|
%FORTRANIF 71585000
|
|
BEGIN COMMENT 1,2, OR 3 BRANCH IF; 71587000
|
|
T~STACK[(S~S-1)+1]; 71589000
|
|
IF MODIFIER<3 THEN 71591000
|
|
IF T=0 THEN L~L+2 ELSE 71593000
|
|
ELSE 71595000
|
|
IF T<0 THEN 71597000
|
|
ELSE IF T=0 THEN L~L+2 ELSE L~L+4; 71599000
|
|
IF L>3 THEN BEGIN L~L-4; C~C+1; END; 71601000
|
|
END FORTRANIF; 71603000
|
|
%FORM 71605000
|
|
BEGIN 71607000
|
|
DEFINE SEGMENT = YES#; 71609000
|
|
INFO[FORMPOINTER]~0; 71611000
|
|
INFO[FORMFLAG]~1; 71613000
|
|
SNUMB~MODIFIER; 71615000
|
|
READNEXTINSTRUCTION; 71617000
|
|
SNUMB~0&MODIFIER[26:42:6]&OP[20:42:6]&SNUMB[15:43:5]71619000
|
|
; T1 ~ CODE[0].CLINK; 71621000
|
|
DO BEGIN 71623000
|
|
T~CODE[T1]; 71625000
|
|
IF T2~REAL(BOOLEAN(T) AND BOOLEAN(STNOMASK)) 71627000
|
|
= SNUMB THEN INFO[FORMPOINTER]~T.CDISKADDR71629000
|
|
ELSE T1~T.CLINK; 71631000
|
|
END UNTIL T.CLINK = 0 OR T2 } SNUMB; 71633000
|
|
IF T1~INFO[FORMPOINTER]=0 THEN 71635000
|
|
BEGIN 71637000
|
|
ERRNUMBER~38; COMMENT MISSING FORM STMNT; 71639000
|
|
ERRCARD(INFO,CODE); 71641000
|
|
GO TO XIT; 71643000
|
|
END; 71645000
|
|
READ(DSK[LISTPOINTER~T1 DIV 3],30,LISTBUF[*]); 71647000
|
|
T2~FINDFORM(LISTBUF[T1 MOD 3|10]); 71649000
|
|
INFO[FORMINDEX]~T2; 71651000
|
|
IF T2 > 55 THEN 71653000
|
|
BEGIN 71655000
|
|
ERRNUMBER~39; COMMENT NOT A FORM; 71657000
|
|
ERRCARD(INFO,CODE); 71659000
|
|
GO TO XIT; 71661000
|
|
END; 71663000
|
|
MOVEFIELD(INFO,CODE,XIT); 71665000
|
|
COMMENT MOVE FIRST ALPHA FIELD INTO BUFFER; 71667000
|
|
END FORM INITIALIZATION; 71669000
|
|
%STRINGFETCH 71671000
|
|
STACK[S~S+1]~CODE[CBASE+MODIFIER]; COMMENT STRING; 71673000
|
|
%IDREADDATA 71675000
|
|
BEGIN 71677000
|
|
IF T5 ~ GETNEXTDATA(T1,INFO,CODE) = 0 THEN 71679000
|
|
BEGIN 71681000
|
|
OUTOFDATAMSG((T~CODE[CBASE]).CPARTNUMB,T.CSTEPNUMB, 71683000
|
|
INFO[IOBUF]); 71685000
|
|
RUNNER[USER] ~ "E"; 71687000
|
|
GO TO XIT; 71689000
|
|
END ELSE IDENT[MODIFIER+MODIFIER+1] ~ T1; 71691000
|
|
IF T5 < 0 THEN BEGIN RUNNER[USER] ~ "S"; GO TO SLEEP; 71693000
|
|
END END IDREADDATA; 71695000
|
|
%ARRAYREADDATA 71697000
|
|
BEGIN 71699000
|
|
IF T5 ~ GETNEXTDATA(T6,INFO,CODE) = 0 THEN 71701000
|
|
BEGIN 71703000
|
|
OUTOFDATAMSG((T~CODE[CBASE]).CPARTNUMB,T.CSTEPNUMB, 71705000
|
|
INFO[IOBUF]); 71707000
|
|
RUNNER[USER] ~ "E"; 71709000
|
|
GO TO XIT; 71711000
|
|
END ELSE IF T~ARRAYLOC(MODIFIER+MODIFIER+1,IDENT,STACK,S,CODE,71713000
|
|
INFO) < 0 THEN GO TO XIT % INVALID SUBSCRIPT 71715000
|
|
ELSE USERARRAY[T] ~ T6; 71717000
|
|
IF T5 < 0 THEN BEGIN RUNNER[USER] ~ "S"; GO TO SLEEP; 71719000
|
|
END END ARRAYREADDATA; 71721000
|
|
END CASE OP CODE; 71723000
|
|
IF DEBUG THEN WRITE (PR[DBL], 17, STACK[*]); 71725000
|
|
GO TO NEXTONE; 71727000
|
|
BRANCH: SNUMB~MODIFIER; 71729000
|
|
T6~CBASE; 71731000
|
|
READNEXTINSTRUCTION; 71733000
|
|
SNUMB ~ 0&MODIFIER[26:42:6]&OP[20:42:6]&SNUMB[15:43:5]; 71735000
|
|
COMMENT BUILD 18 BIT STATEMENT # FROM 2 INSTRUCTIONS; 71737000
|
|
IF LASTI ! 0 THEN 71739000
|
|
FOR I ~ LASTI-1 STEP -1 UNTIL 0 DO 71741000
|
|
IF REAL(BOOLEAN(GOTOSOLVER[I]) AND BOOLEAN(STNOMASK)71743000
|
|
) = SNUMB THEN BEGIN 71745000
|
|
C ~ GOTOSOLVER[I].[33:15]; 71747000
|
|
L ~ 0; 71749000
|
|
CBASE ~ C - 1; 71751000
|
|
GO TO CHECKSTACK; 71753000
|
|
END TABLE LOOKUP SUCCESSFUL; 71755000
|
|
C ~ CODE[0].CLINK; 71757000
|
|
DO BEGIN T~CODE[C]; 71759000
|
|
COMMENT LINK THRU STATEMENTS UNTIL FOUND; 71761000
|
|
IF REAL(BOOLEAN(T) AND BOOLEAN(STNOMASK)) = SNUMB THEN 71763000
|
|
BEGIN 71765000
|
|
CBASE~C; 71767000
|
|
GOTOSOLVER[LASTI] ~ (C~C+1)&SNUMB[15:15:17]; 71769000
|
|
COMMENT SAVE ST# AND C IN TABLE; 71771000
|
|
IF LASTI ~ LASTI + 1 = 20 THEN 71773000
|
|
FOR LASTI ~ 0 STEP 1 UNTIL 14 DO 71775000
|
|
GOTOSOLVER[LASTI] ~GOTOSOLVER[LASTI+5]; 71777000
|
|
COMMENT PUSH DOWN LOOKUP TABLE; 71779000
|
|
IF DEBUG THEN WRITE (PR[DBL], 17, GOTOSOLVER[*]71781000
|
|
); 71783000
|
|
L~0; GO TO CHECKSTACK; %BRANCH FOUND 71785000
|
|
END ELSE C ~ T.CLINK; 71787000
|
|
END UNTIL T.CLINK=0; 71789000
|
|
C~1; 71791000
|
|
WHILE C<INFO[CMAX] DO BEGIN T~CODE[C]; 71793000
|
|
IF T.SBIT!1 THEN IF REAL(BOOLEAN(T) AND BOOLEAN(STNOMASK)71795000
|
|
)=SNUMB THEN BEGIN 71797000
|
|
ERRNUMBER~29; ERRCARD(INFO,CODE); GO TO XIT; 71799000
|
|
END STATEMENT PRESENT BUT NOT IN RANGE; 71801000
|
|
C~T.CSIZE+C; 71803000
|
|
END; 71805000
|
|
ERRNUMBER~30; COMMENT ST # SEARCH FAILED; 71807000
|
|
ERRCARD(INFO,CODE); 71809000
|
|
GO TO XIT; 71811000
|
|
CHECKSTACK: 71813000
|
|
IF S!0 AND STACK[S].[1:8]=63 THEN IF CODE[CBASE].CPARTNUMB 71815000
|
|
!CODE[T6].CPARTNUMB THEN 71817000
|
|
DO IF STACK[S].CPARTNUMB ! CODE[CBASE].CPARTNUMB THEN 71829100
|
|
BEGIN 71829110
|
|
S~S-1; 71829120
|
|
IF S ! 0 THEN IF STACK[S].[1:8] ! 63 THEN S~S-1; 71829130
|
|
END ELSE GO TO NEXT 71829140
|
|
UNTIL S=0; 71829150
|
|
GO TO NEXT; 71829160
|
|
INTERR: BEGIN ERRNUMBER~31; ERRCARD(INFO,CODE); GO TO XIT; END; 71831000
|
|
COMMENT INTEGER OVERFLOW IN ENTIER FUNCTION; 71833000
|
|
EXPERR: BEGIN ERRNUMBER~32; ERRCARD(INFO,CODE); GO TO XIT; END; 71835000
|
|
COMMENT EXPONENT OVERFLOW; 71837000
|
|
ZEROERR: BEGIN ERRNUMBER~33; ERRCARD(INFO,CODE); GO TO XIT; END; 71839000
|
|
COMMENT ATTEMPTED DIVIDE BY ZERO; 71841000
|
|
INDEXERR:BEGIN IF S}STACKARRAYSIZE THEN ERRNUMBER~34 ELSE ERRNUMBER~102;71843000
|
|
ERRCARD(INFO,CODE); GO TO XIT; END INVALID INDEX; 71845000
|
|
COMMENT STACK OVERFLOW PROBABLY CAUSED BY RECURSIVE 71847000
|
|
PART CALLS; 71849000
|
|
SLEEP: INFO[CINDX] ~C; INFO[LINDX]~L; INFO[SINDX]~S; 71851000
|
|
INFO[CBASEINDX] ~ CBASE;COMMENT SAVE REGISTERS AND 71853000
|
|
SUSPEND TASK; 71855000
|
|
XIT: 71857000
|
|
IF DEBUG THEN WRITE (PR[DBL], 17, IDENT[*]); 71859000
|
|
END PROCEDURE EXECUTECODE; 71861000
|
|
% ******************************************************************** 80001000
|
|
% ******************************************************************** 80003000
|
|
% ****************** S C H E D U L E R **************************** 80005000
|
|
% ******************************************************************** 80007000
|
|
% ******************************************************************** 80009000
|
|
% ******************************************************************** 80011000
|
|
COMMENT 80013000
|
|
SCHEDULER CONTROLS ALL DATACOM I/O, SELECTION AND SCHEDULING. 80015000
|
|
IT USES THE ARRAY USERID TO DETERMINE LOGGED IN USERS AND 80017000
|
|
USES THE ARRAY RUNNER AS SCHEDULE INFORMATION. 80019000
|
|
DECLARATION OF THE ARRAYS FOR EACH USER ARE CONTROLLED BY 80021000
|
|
PASSING ARRAY SIZES INTO THIS PROCEDURE. USER ARRAYS ARE 80023000
|
|
DECLARED DOUBLY SUBSCRIPTED HERE. ROWS ARE PASSED AS SINGLY 80025000
|
|
DIMENSIONED ARRAYS TO PROCEDURES CALLED BY SCHEDULER. 80027000
|
|
THE RUNNER ARRAY SERVES AS AN INTERLOCK AS WELL AS A SCHEDULE.80029000
|
|
THE RUNNER VALUE MAY SPECIFY (1) IDLE, (2) INPUT IN PROGRESS,80031000
|
|
(3) OUTPUT IN PROGRESS, OR (4) A TASK NEEDS TO BE PERFORMED. 80033000
|
|
ITS FORMAT IS: 80035000
|
|
[1:1] IF ON, WRITE INFO[USER,IOBUF] TO TERMINAL. 80037000
|
|
[12:12] CHAR POSITION OF NEXT INPUT BUF LOAD (0,28,56).80039000
|
|
[24:12] CHAR POSITION OF NEXT OUTPUT BUF LOAD 80041000
|
|
[36:12] FUNCTION CODE FOR RUNNERS LOOP. 80043000
|
|
WHEN A RUNNER IS ACTIVE, [1:35] IS 0 AND [36:12] CONTAINS 80045000
|
|
THE FUNCTION (WHICH MAY BE MODIFIED BY A RUNNER); 80047000
|
|
DEFINE DCWDS=5#, BUFLOAD =27#; 80049000
|
|
ALPHA FILE IN DCI 14 (2|(MAX+1), MAXINPUTBUFFERSIZE); 80051000
|
|
ALPHA FILE OUT DCO1 14 (2,DCWDS); 80053000
|
|
ALPHA FILE OUT DCO2 14 (2,DCWDS); 80055000
|
|
ALPHA FILE OUT DCO3 14 (2,DCWDS); 80057000
|
|
ALPHA FILE OUT DCO4 14 (2,DCWDS); 80059000
|
|
ALPHA FILE OUT DCO5 14 (2,DCWDS); 80061000
|
|
ALPHA FILE OUT DCO6 14 (2,DCWDS); 80063000
|
|
ALPHA FILE OUT DCO7 14 (2,DCWDS); 80065000
|
|
SWITCH FILE DCO~DCO1,DCO2,DCO3,DCO4,DCO5,DCO6,DCO7; 80067000
|
|
SAVEOPTION 80069000
|
|
ARRAY DCBUF[0:(IF MAX<3 THEN 8 ELSE (MAX+1)|2+2)]; 80071000
|
|
COMMENT INPUT-OUTPUT AND STATUS BUFFER FOR DATACOM; 80073000
|
|
SAVEOPTION 80075000
|
|
ARRAY DCTUBUF[0:MAX]; COMMENT TU AND BUF # FOR USERS; 80077000
|
|
INTEGER CYCLE; 80079000
|
|
BOOLEAN IDLE; 80081000
|
|
INTEGER SAVEINTERLOCK; 80083000
|
|
INTEGER LOADINTERLOCK; 80085000
|
|
DEFINE LOADBUF=SAVEBUF#; 80087000
|
|
PROCEDURE SCHEDULER(CODEMAXSIZE,USERARRAYMAXSIZE); 80089000
|
|
VALUE CODEMAXSIZE, USERARRAYMAXSIZE; 80091000
|
|
INTEGER CODEMAXSIZE, USERARRAYMAXSIZE; 80093000
|
|
BEGIN 80095000
|
|
LABEL WRITER, WRITEANDCLEAR; 80097000
|
|
LABEL NEXT; 80099000
|
|
OWN ARRAY STACK[0:MAX, 0:STACKARRAYSIZE], 80101000
|
|
CODE[0:MAX, 0:CODEMAXSIZE], 80103000
|
|
USERARRAY[0:MAX, 0:USERARRAYMAXSIZE]; 80105000
|
|
COMMENT DYNAMIC ARRAY DECLARATION FOR USER ARRAYS; 80107000
|
|
LABEL RUNNERS; 80109000
|
|
LABEL ALLOCATE; 80111000
|
|
LABEL ENDRUN; 80113000
|
|
LABEL ENDLOOP; 80115000
|
|
% ************************** D C I O ******************************* 80117000
|
|
COMMENT 80119000
|
|
DCIO DRIVES THE REMOTE TERMINALS. IT USES : 80121000
|
|
INFO[USER,IOBUF] FOR INPUT AND OUTPUT AREAS, 80123000
|
|
RUNNER[USER] FOR FUNCTION AND OFFSET INFORMATION, 80125000
|
|
DCTUBUF[USER] FOR THE [9:9] DATACOM ADDRESS, 80127000
|
|
USERID[USER] FOR THE FILE SECURITY CODE, 80129000
|
|
DCBUF[*] FOR ACTUAL I/O. 80131000
|
|
DCIO HAS FOUR FUNCTIONS: 80133000
|
|
1. DISPENSE QUEUED WRITES. 80135000
|
|
2. ATTACH NEW USERS. 80137000
|
|
3. ATTEMPT TO READ FROM TERMINALS. 80139000
|
|
4. TIMEOUT IF IDLE TOO LONG. 80141000
|
|
DCIO CHANGES THE USER INDEX ON ATTACHMENT OR COMPLETED INPUT 80143000
|
|
LINE; 80145000
|
|
BOOLEAN PROCEDURE DCIO; 80147000
|
|
BEGIN 80149000
|
|
INTEGER TIMER; 80151000
|
|
LABEL E, WNEXT, NO, XIT; 80153000
|
|
LABEL DATACOM; 80155000
|
|
LABEL ATTACH, DETACH, RESTORE; 80157000
|
|
LABEL RNEXT; 80159000
|
|
LABEL TIMESUP; 80161000
|
|
LABEL SEEKIT; 80163000
|
|
DEFINE STATE = T4#, U = T3#; 80165000
|
|
DEFINE WRITEOFFSET = [24:12]#, READOFFSET = [12:12]#; 80167000
|
|
BOOLEAN STREAM PROCEDURE MOVETOGPMK(S,OFFSET, D); 80169000
|
|
VALUE OFFSET; 80171000
|
|
BEGIN 80173000
|
|
SI ~ S; SI ~ SI+OFFSET; DI ~ D; 80175000
|
|
27(IF SC!"~" THEN DS~CHR ELSE BEGIN DS~CHR; 80177000
|
|
TALLY ~ 1; MOVETOGPMK ~ TALLY; JUMP OUT; END); 80179000
|
|
DS~LIT"~"; COMMENT OUTPUT IN 27 CHAR RECORDS; 80181000
|
|
END MOVETOGPMK; 80183000
|
|
INTEGER STREAM PROCEDURE MOVEIN(S, D, OFFSET); VALUE OFFSET; 80185000
|
|
BEGIN LOCAL SAVSOURCE; LABEL FIFTYSIX, XIT; 80187000
|
|
SI~S; DI~D; DI~DI+OFFSET; TALLY~28; 80189000
|
|
28(IF SC!"~" THEN DS~CHR ELSE BEGIN TALLY~0; DS~CHR; 80191000
|
|
JUMP OUT TO XIT; END); COMMENT LESS THAN 28 CHAR ; 80193000
|
|
SAVSOURCE~SI; COMMENT NOW CHECK FOR 28/56 BUFFERS; 80195000
|
|
11(IF SC="0" THEN SI~SI+1 ELSE JUMP OUT TO FIFTYSIX); 80197000
|
|
IF SC>"9" THEN GO TO XIT; COMMENT WAS A 28 CHAR BUFFER; 80199000
|
|
FIFTYSIX: SI~SAVSOURCE; 80201000
|
|
TALLY~56; 28(IF SC!"~" THEN DS~CHR ELSE BEGIN DS~CHR; 80203000
|
|
TALLY~0; JUMP OUT TO XIT; END); 80205000
|
|
XIT: MOVEIN~TALLY; COMMENT EITHER OFFSET VALUE OR 0 FOR ~ ; 80207000
|
|
END MOVEIN; 80209000
|
|
BOOLEAN STREAM PROCEDURE GPMRK(S); 80211000
|
|
BEGIN 80213000
|
|
DI~LOC GPMRK; DI~DI+7; DS~ LIT "0"; SI~S; 80215000
|
|
17(IF SC = "~" THEN BEGIN DI~DI-1; DS~LIT "1"; JUMP OUT; END; 80217000
|
|
SI~SI+1); 80219000
|
|
END GPMRK; 80221000
|
|
STREAM PROCEDURE LINETOOLONG(D); 80223000
|
|
BEGIN DI ~ D; DS ~ 48 LIT 80225000
|
|
"{!AN INPUT LINE IS RESTRICTED TO 72 CHARACTERS~"; 80227000
|
|
END LINETOOLONG; 80229000
|
|
STREAM PROCEDURE TIMEOUTMSG(D); 80231000
|
|
BEGIN 80233000
|
|
DI ~ D; DS ~ 25 LIT "TIMEOUT IN 15 SECONDS{!:~"; 80235000
|
|
END STREAM; 80237000
|
|
STREAM PROCEDURE MOVEBRK(D); 80239000
|
|
BEGIN 80241000
|
|
DI ~ D; DS ~ 11 LIT "{!BREAK{!:~"; 80243000
|
|
END MOVEBRK; 80245000
|
|
STREAM PROCEDURE MOVE9(S,D); 80247000
|
|
BEGIN SI ~ S; DI ~ D; DS ~ 9WDS; END STREAM; 80249000
|
|
STREAM PROCEDURE ZEROOUT(D1, D2); 80251000
|
|
BEGIN 80253000
|
|
DI ~ D2; DS ~ 8 LIT"0"; SI ~ D2; 4(DS ~ 32 WDS); 80255000
|
|
DI ~ D1; SI ~ D2; DS ~ INFMAX WDS; END STREAM; 80257000
|
|
STREAM PROCEDURE MOVEC(S, D, D2); 80259000
|
|
BEGIN SI ~ S; DI ~ D; DS ~ 9 WDS; 80261000
|
|
DI ~ D2; DS ~ 3 LIT "{!~"; END MOVEC; 80263000
|
|
PROCEDURE TOOMANY(S); VALUE S; INTEGER S; 80265000
|
|
BEGIN 80267000
|
|
ALPHA FILE OUT DCO99 14(1,DCWDS); 80269000
|
|
COMMENT FIND THE NEW STATION BY ELIMINATION; 80271000
|
|
FOR T~0 STEP 2 UNTIL S-1 DO BEGIN 80273000
|
|
T2~1; 80275000
|
|
FOR T1~0 STEP 1 UNTIL MAX DO 80277000
|
|
IF DCBUF[T]=0 OR DCBUF[T]=DCTUBUF[T1] THEN T2~0; 80279000
|
|
IF BOOLEAN(T2) THEN BEGIN FILL SYNTAX[*] WITH 80281000
|
|
0, "SORRY, T", "OO MANY ", "USERS{!~"; 80283000
|
|
WRITE(DCO99(SYNTAX[0]~DCBUF[T],0),4,SYNTAX[*]); 80285000
|
|
RELEASE(DCBUF[T]); 80287000
|
|
END WRITE; 80289000
|
|
END LOOKING; 80291000
|
|
END TOOMANY; 80293000
|
|
% -------- 80295000
|
|
COMMENT 1. 80297000
|
|
CYCLE THRU ALL USERS LOOKING FOR A QUEUED LINE OF OUTPUT. 80299000
|
|
IF OUTPUT IS QUEUED, CHECK THE STATUS (PASSIVE) OF THE TERMNAL80301000
|
|
IF BREAK IS UP, CHANGE THE OUTPUT LINE TO READ "BREAK" 80303000
|
|
AND SHUT OFF THE RUNNER (SPEC. ACTION FOR LOADS). 80305000
|
|
MOVE A BUFFER LOAD INTO DCBUF[1] AND WRITE IT. 80307000
|
|
IF A GROUP MARK WAS WRITTEN, SHUT OFF OUTPUT QUEUE AND 80309000
|
|
RESET OFFSET. 80311000
|
|
IF THE RUNNER IS STILL ACTIVE, TURN OFF IDLE FLAG 80313000
|
|
AND INSURE THAT ACTIVE IS TURNED BACK ON. 80315000
|
|
; 80317000
|
|
DATACOM: U~USER; 80319000
|
|
DO BEGIN 80321000
|
|
IF RUNNER[U].SBIT=1 THEN 80323000
|
|
BEGIN 80325000
|
|
STATE~STATUS(DCTUBUF[U],0); 80327000
|
|
IF STATE.[26:1]=1 THEN 80329000
|
|
BEGIN COMMENT BREAK; 80331000
|
|
MOVEBRK(INFO[U,IOBUF]); 80333000
|
|
IF RUNNER[U].[36:12]="I" THEN 80335000
|
|
BEGIN 80337000
|
|
CLOSE(LOADFILE); 80339000
|
|
LOADINTERLOCK~-1; 80341000
|
|
INFO[U,LOADLIST]~0; 80343000
|
|
END BREAK ON A LOAD; 80345000
|
|
RUNNER[U].[24:24]~0; 80347000
|
|
END HANDLING BREAK; 80349000
|
|
IF STATE.[30:1]=1 THEN GO TO DETACH; 80351000
|
|
COMMENT CHECK FOR DISCONNECT; 80353000
|
|
OK~MOVETOGPMK(INFO[U,IOBUF],T1~RUNNER[U].WRITEOFFSET80355000
|
|
,DCBUF[1]); 80357000
|
|
WRITE(DCO[U](DCBUF[0]~DCTUBUF[U],0),DCWDS, 80359000
|
|
DCBUF[*])[E]; 80361000
|
|
IF OK THEN 80363000
|
|
BEGIN 80365000
|
|
RUNNER[U].WRITEOFFSET~0; 80367000
|
|
IF RUNNER[U].[36:12]!0 THEN 80369000
|
|
BEGIN 80371000
|
|
IDLE~FALSE; 80373000
|
|
ACTIVE~TRUE; 80375000
|
|
END; 80377000
|
|
RUNNER[U].SBIT~0; 80379000
|
|
EVENTS~EVENTS+1; 80381000
|
|
END ELSE RUNNER[U].WRITEOFFSET~T1+BUFLOAD; 80383000
|
|
END; 80385000
|
|
E: 80387000
|
|
WNEXT: IF U~U+1>MAXUSER THEN U~0; 80389000
|
|
END UNTIL U=USER; 80391000
|
|
COMMENT 2. 80393000
|
|
NOW LOOK FOR A NEW USER BY MATCHING THE SYSTEM LIST OF 80395000
|
|
ATTACHED TERMINALS WITH THE CURRENT LIST. 80397000
|
|
IF A NEW USER IS FOUND: 80399000
|
|
A. FIND AN INDEX SLOT FOR HIM. 80401000
|
|
B. SETUP TERMINAL AND USER ID. 80403000
|
|
C. CLEAR HIS INFO AND IDENTIFIERS. 80405000
|
|
D. SCHEDULE HIM FOR ATTACHMENT MESSAGE. 80407000
|
|
E. ADJUST MAXUSER AND FLAGS. 80409000
|
|
; 80411000
|
|
IF TIMER MOD 5 = 1 THEN GO TO ATTACH; 80413000
|
|
%VOID 80415000
|
|
EVENTS~EVENTS+1; 80417000
|
|
IF EVENTS MOD 5 ! 0 THEN GO TO RNEXT; 80419000
|
|
ATTACH: 80421000
|
|
IF STATE ~ STATUS(DCBUF[*]) { 0 THEN GO TO ENDEND; 80423000
|
|
FOR I~0 STEP 2 UNTIL STATE-2 DO BEGIN 80425000
|
|
FOR U ~ 0 STEP 1 UNTIL MAXUSER DO IF DCBUF[I]=DCTUBUF[U] 80427000
|
|
THEN IF DCBUF[I+1]=USERID[U] THEN BEGIN 80429000
|
|
COMMENT FOUND A MATCH; 80431000
|
|
DCBUF[I]~0; USERID[U]~-USERID[U]; 80433000
|
|
COMMENT USERIDS ARE MARKED NEG. TEMPORARILY; 80435000
|
|
END SCRATCHING ENTRY FROM BOTH LISTS; 80437000
|
|
IF DCBUF[I]!0 THEN BEGIN COMMENT UNIDENTIFIED USER; 80439000
|
|
FOR U~0 STEP 1 UNTIL MAXUSER DO IF I!U THEN 80441000
|
|
IF DCBUF[I]=DCTUBUF[U] THEN BEGIN 80443000
|
|
DETACH: RUNNER[U]~"Q"; 80445000
|
|
INFO[U,CMAX]~0; COMMENT DONT GIVE EOJ MSG; 80447000
|
|
IDLE~FALSE; ACTIVE~TRUE; 80449000
|
|
RESTORE: FOR U~0 STEP 1 UNTIL MAXUSER DO 80451000
|
|
USERID[U]~ABS(USERID[U]); 80453000
|
|
GO TO RNEXT; 80455000
|
|
END TERMINAL HAS DISAPPEARED; 80457000
|
|
T~0; WHILE DCTUBUF[T]!0 DO IF T~T+1>MAX THEN BEGIN 80459000
|
|
TOOMANY(STATE); GO TO RESTORE; END TOO MANY; 80461000
|
|
DCTUBUF[T]~DCBUF[I]; COMMENT SET UP TERMINAL ID; 80463000
|
|
IF USERID[T]~-DCBUF[I+1]=0 THEN GO TO DETACH; 80465000
|
|
ZEROOUT(INFO[T,1], 80467000
|
|
IDENTIFIERS[T,0]); 80469000
|
|
CODE[T,0]~CODE[T,1]~0; 80471000
|
|
RUNNER[T] ~ "B"; 80473000
|
|
CYCLE ~ T; 80475000
|
|
ACTIVE ~ TRUE; 80477000
|
|
IF INFO[0,RUNLIMIT]=0 THEN % TRUE IF FIRST USER; 80479000
|
|
READ(DCI(DCTUBUF[T],0),5,DCBUF[*])[SEEKIT:SEEKIT]; 80481000
|
|
SEEKIT: COMMENT FILEOPEN BEFORE SEEK NEEDED BY MK8 MOD21;80483000
|
|
SEEK(DCI(DCTUBUF[T])); 80485000
|
|
IDLE ~ FALSE; 80487000
|
|
MAXUSER ~ MAX; 80489000
|
|
WHILE DCTUBUF[MAXUSER] = 0 DO MAXUSER~MAXUSER-1; 80491000
|
|
END ATTACHING A NEW USER; 80493000
|
|
END LOOKING FOR NEW USERS; 80495000
|
|
FOR U~0 STEP 1 UNTIL MAXUSER DO IF USERID[U]>0 THEN GO TO 80497000
|
|
DETACH ELSE USERID[U]~-USERID[U]; 80499000
|
|
COMMENT 3. 80501000
|
|
NOW DO A GENERAL READ. IF INPUT IS READ, IDENTIFY THE USER. 80503000
|
|
IF PAST COL 73, GIVE A DIAGNOSTIC. 80505000
|
|
IF A COMPLETE INPUT LINE: 80507000
|
|
A. MOVE CARD IMAGE INTO SYNTAX[0]. 80509000
|
|
B. ADJUST FLAGS. 80511000
|
|
C. WRITE "{!". 80513000
|
|
D. EXIT DCIO=TRUE 80515000
|
|
; 80517000
|
|
RNEXT: DCBUF[5]~12; COMMENT USE QUESTMARK FOR 28/56 TEST;80519000
|
|
READ(DCI(0,0),8,DCBUF[*])[NO:NO]; 80521000
|
|
U~-1; 80523000
|
|
FOR T~0 STEP 1 UNTIL MAXUSER DO 80525000
|
|
IF DCBUF[0].[9:9]=DCTUBUF[T].[9:9] THEN U~T; 80527000
|
|
IF U<0 THEN GO TO RNEXT; 80529000
|
|
IF RUNNER[U].[36:12]!0 THEN GO TO RNEXT; 80531000
|
|
IF T2~RUNNER[U].READOFFSET = 56 THEN 80533000
|
|
IF NOT GPMRK(DCBUF[1]) THEN 80535000
|
|
BEGIN 80537000
|
|
ACTIVE~TRUE; 80539000
|
|
LINETOOLONG(INFO[U,IOBUF]); 80541000
|
|
RUNNER[U]~"E"; 80543000
|
|
USER ~ CYCLE ~ U; 80545000
|
|
GO TO XIT; 80547000
|
|
END LINE TOO LONG; 80549000
|
|
IF T1~MOVEIN(DCBUF[1], INFO[U,IOBUF], T2~RUNNER[U]. 80551000
|
|
READOFFSET)=0 THEN BEGIN 80553000
|
|
MOVEC(INFO[U,IOBUF], SYNTAX[0], DCBUF[1]); 80555000
|
|
RUNNER[U].READOFFSET ~ 0; 80557000
|
|
IDLE ~ ACTIVE ~ FALSE; 80559000
|
|
DCIO ~ TRUE; 80561000
|
|
USER ~ U; 80563000
|
|
EVENTS~EVENTS+1; 80565000
|
|
WRITE(DCO[U](DCBUF[0]~DCTUBUF[U],1),2,DCBUF[*])80567000
|
|
[XIT:XIT]; 80569000
|
|
GO TO XIT; 80571000
|
|
END COMPLETED A READ OPERATION ELSE BEGIN 80573000
|
|
RUNNER[U].READOFFSET~T2+T1; 80575000
|
|
GO TO RNEXT; END; 80577000
|
|
NO: 80579000
|
|
IF IDLE THEN BEGIN 80581000
|
|
IF TIMER~TIMER+1=(TIMEOUT+20)|2 THEN BEGIN 80583000
|
|
TIMESUP: ACTIVE~TRUE; 80585000
|
|
FOR U~0 STEP 1 UNTIL MAXUSER DO IF DCTUBUF[U]!0 THEN80587000
|
|
RUNNER[U]~"Q"; 80589000
|
|
GO TO XIT; END TIMEOUT OF ALL USERS; 80591000
|
|
IF TIMER!TIMEOUT|2 THEN T~DELAY(513,0,0.5) %HALF SEC DEL80593000
|
|
ELSE FOR I~0 STEP 1 UNTIL MAXUSER DO 80595000
|
|
IF DCTUBUF[I]!0 THEN BEGIN 80597000
|
|
RUNNER[I].SBIT~1; 80599000
|
|
RUNNER[I].WRITEOFFSET~0; 80601000
|
|
TIMEOUTMSG(INFO[I,IOBUF]); 80603000
|
|
END WARNING MESSAGE ; 80605000
|
|
GO TO DATACOM; END IDLE LOOP; 80607000
|
|
XIT: END DCIO; 80609000
|
|
% ******************************************************************* 80611000
|
|
STREAM PROCEDURE SETSEQ(D, PART, STP ); VALUE PART, STP; 80613000
|
|
BEGIN DI ~ D; DS ~ 3 LIT "0"; SI ~ LOC PART; DS ~ 2 DEC; 80615000
|
|
SI ~ LOC STP; DS ~ 3 DEC; END SETSEQ; 80617000
|
|
STREAM PROCEDURE MOVEG(S,D); 80619000
|
|
BEGIN 80621000
|
|
SI ~ S; DI ~ D; 80623000
|
|
9(8(IF SC ! "~" THEN DS ~ CHR ELSE DS ~ 1 LIT " ")); 80625000
|
|
END DELETE GROUP MARK AND BLANK FILL FOR TEXT EDITOR ; 80627000
|
|
STREAM PROCEDURE MOVE9(S,D); BEGIN SI ~ S; DI ~ D; DS ~ 9 WDS; END; 80629000
|
|
STREAM PROCEDURE MSG(V, D); VALUE V; 80631000
|
|
BEGIN DI ~ D; SI ~ LOC V; SI ~ SI + 7; 80633000
|
|
IF SC = "S" THEN DS ~ 5 LIT "SAVED"; 80635000
|
|
IF SC = "L" THEN DS ~ 6 LIT"LOADED"; 80637000
|
|
IF SC = "N" THEN DS ~ 43 LIT 80639000
|
|
"THERE IS NO FILE WITH THAT NAME ON THE DISK"; 80641000
|
|
IF SC = "F" THEN DS ~ 19 LIT "DUPLICATE FILE NAME"; 80643000
|
|
IF SC = "B" THEN DS ~ 49 LIT 80645000
|
|
"WIPL VERSION 1.5{!TYPE HELP IF YOU HAVE QUESTIONS"; 80647000
|
|
IF SC = "D" THEN DS ~ 44 LIT 80649000
|
|
"SOMEONE ELSE IS LOGGED-IN UNDER YOUR USER-ID"; 80651000
|
|
IF SC = "R" THEN DS ~ 31 LIT 80653000
|
|
"YOUR PROGRAM IS BEING RESTARTED"; 80655000
|
|
IF SC = "C" THEN DS ~ 30 LIT "YOUR LAST VALID STATEMENT WAS:";80657000
|
|
DS ~ 1 LIT "~"; 80659000
|
|
END STREAM; 80661000
|
|
STREAM PROCEDURE SIGNAL(D); BEGIN DI ~ D; DS ~ 2 LIT ":~"; END; 80663000
|
|
STREAM PROCEDURE CARRIAGE(A, B); VALUE B; 80665000
|
|
BEGIN LOCAL T; LABEL L; 80667000
|
|
SI ~ A; 9(8(IF SC = "~" THEN JUMP OUT 2 TO L ELSE SI~SI+1)); 80669000
|
|
L: T ~ SI; DI ~ T; SI ~ SI - 1; IF SC { "9" THEN 80671000
|
|
DS ~ 2 LIT "{!" ELSE DS ~ LIT "!"; 80673000
|
|
B(DS ~ LIT ":"); DS ~ LIT "~"; END CARRIAGE; 80675000
|
|
STREAM PROCEDURE SPACEONE(D); 80677000
|
|
BEGIN LOCAL T; LABEL L; 80679000
|
|
SI ~ D; 9(8(IF SC!"~" THEN SI~SI+1 ELSE JUMP OUT 2 TO L)); 80681000
|
|
L: T~SI; DI~T; DS ~ 3 LIT "{!~"; 80683000
|
|
END SPACEONE; 80685000
|
|
STREAM PROCEDURE EOJMESSAGE(D,T1,T2); VALUE T1,T2; 80687000
|
|
BEGIN DI ~ D; SI ~ LOC T1; DS ~ 7 LIT "EOJ AT "; DS ~ 2 DEC; 80689000
|
|
SI ~ LOC T2; DS ~ 2 DEC; DS ~ LIT "~"; 80691000
|
|
END EOJMESSAGE; 80693000
|
|
BOOLEAN STREAM PROCEDURE WAITMSG(D); 80695000
|
|
BEGIN LOCAL T; 80697000
|
|
DI~LOC T; DS~6 LIT "PLEASE"; DI~D; SI~LOC T; 80699000
|
|
IF 6 SC=DC THEN TALLY~1 ELSE BEGIN DI~D; 80701000
|
|
DS~15 LIT "PLEASE WAIT...~"; END; 80703000
|
|
WAITMSG~TALLY; 80705000
|
|
END WAITMSG; 80707000
|
|
STREAM PROCEDURE PUBLICSAVE(D,N); VALUE N; 80709000
|
|
BEGIN 80711000
|
|
DI~D; DS~10 LIT "CC PUBLIC "; SI~LOC N; SI~SI+1; DS~7 CHR; 80713000
|
|
DS~11 LIT "/CARDS;END."; 80715000
|
|
END PUBLICSAVE; 80717000
|
|
BOOLEAN STREAM PROCEDURE STOP(S); 80719000
|
|
BEGIN LOCAL T; 80721000
|
|
DI~LOC T; DS~5 LIT "STOP~"; SI~S; DI~LOC T; 80723000
|
|
IF 5 SC=DC THEN TALLY~1; STOP~TALLY; 80725000
|
|
END STOP; 80727000
|
|
BOOLEAN STREAM PROCEDURE FLAGBIT(S); 80729000
|
|
BEGIN SI~S; IF SB THEN BEGIN TALLY~1; FLAGBIT~TALLY; END; END; 80731000
|
|
PROCEDURE GETERRMESSAGE; 80733000
|
|
IF ERRNUMBER!0 THEN 80735000
|
|
BEGIN 80737000
|
|
T1~ERRORSTART|3+ERRNUMBER; 80739000
|
|
IF (T2~T1 DIV 3) ! LISTPOINTER THEN 80741000
|
|
READ(DSK[LISTPOINTER~T2],30,LISTBUF[*]); 80743000
|
|
COMMENT READ ERROR FROM DISK; 80745000
|
|
MOVE9(LISTBUF[T1 MOD 3 | 10],INFO[USER,IOBUF]); 80747000
|
|
ERRNUMBER~0; 80749000
|
|
END GETERRMESSAGE; 80751000
|
|
DEFINE CHARGETHEUSER = T1~STATUS(DCTUBUF[USER],0)#; 80753000
|
|
% -------------------------------------------------------------------- 80755000
|
|
% ----------------- M A I N L O O P -------------------------- 80757000
|
|
% -------------------------------------------------------------------- 80759000
|
|
COMMENT 80761000
|
|
THE MAIN LOOP FUNCTIONS AS FOLLOWS: 80763000
|
|
1. IF ARRAYS HAVE BEEN REALLOCATED, THE CARD IMAGE IS 80765000
|
|
RE-PROCESSED, OTHERWISE DCIO IS CALLED TO ATTACH THE 80767000
|
|
FIRST USER AND THE RUNNER "B" IS EXECUTED. 80769000
|
|
2. THE RUNNER LOOP MAKES A COMPLETE CYCLE THRU ALL 80771000
|
|
LOGGED-IN USERS STARTING WITH THE CURRENT VALUE OF USER, 80773000
|
|
STEPPING UP TO MAXUSER, RETURNS TO 0, THEN STOPS WHEN 80775000
|
|
USER = CYCLE. 80777000
|
|
3. FOR EACH RUNNER A CHECK IS MADE FOR READ/WRITE INTERLOCK 80779000
|
|
OR IDLE. 80781000
|
|
4. USER ACCOUNTING IS TURNED ON. 80783000
|
|
5. A FUNCTION IS PERFORMED (S, E, L ETC.). 80785000
|
|
6. IF A FUNCTION BRANCHES TO WRITER, ONE LINE OF 80787000
|
|
OUTPUT IS QUEUED UP. 80789000
|
|
7. IF A FUNCTION BRANCHES TO ENDRUN, A CHANGE TO 80791000
|
|
INACTIVE IS HANDLED BY TYPING A ":". 80793000
|
|
8. EACH RUNNER TERMINATES AT ENDLOOP, 80795000
|
|
9. A ROUND OF I/O IS DONE BY CALLING DCIO. 80797000
|
|
10. IF AN INPUT LINE IS ENCOUNTERED, A BRANCH TO NEXT IS 80799000
|
|
MADE. 80801000
|
|
11. NEXT PERFORMS THE FOLLOWING: 80803000
|
|
A. A SCANNER CALL TO PRODUCE THE SYNTAX ARRAY 80805000
|
|
B. AN ACCEPT OR TRANSLATOR CALL. 80807000
|
|
C. UPDATE IDENTIFIERS IF ALL IS WELL. 80809000
|
|
D. TAKE ACTION FOR LOAD-LIST. 80811000
|
|
E. ENTER RUNNERS LOOP. 80813000
|
|
; 80815000
|
|
IF REALLOCATE THEN BEGIN 80817000
|
|
REALLOCATE ~ FALSE; 80819000
|
|
GO TO NEXT; 80821000
|
|
END REALLOCATION AND RECOMPILATION ELSE BEGIN 80823000
|
|
DO ACTIVE ~ DCIO UNTIL RUNNER[0] ! 0; 80825000
|
|
GO TO RUNNERS; 80827000
|
|
END ATTACHING FIRST USER; 80829000
|
|
NEXT: ENTERDICT ~ FALSE; 80831000
|
|
CHARGETHEUSER; 80833000
|
|
IF INFO[USER,ALPHACCEPT]=0 THEN BEGIN 80835000
|
|
IF I ~ SCANNER(INFO[USER,*], IDENTIFIERS[USER,*]) = 0 80837000
|
|
THEN RUNNER[USER ] ~ "E" ELSE 80839000
|
|
IF I < 0 THEN ACCEPT(INFO[USER,*], IDENTIFIERS[USER,*], 80841000
|
|
STACK[USER,*],USERARRAY[USER,*]) 80843000
|
|
ELSE TRANSLATOR(INFO[USER,*], IDENTIFIERS[USER,*], 80845000
|
|
CODE[USER,*], USERARRAY[USER,*]); 80847000
|
|
END ELSE BEGIN COMMENT ALPHABETIC READ; 80849000
|
|
MOVE9(INFO[USER,IOBUF], INFO[USER,ALTBUF]); 80851000
|
|
INFO[USER,ALPHACCEPT]~0; 80853000
|
|
IF STOP(INFO[USER,IOBUF]) THEN RUNNER[USER]~0 ELSE 80855000
|
|
RUNNER[USER]~"S"; 80857000
|
|
END ALPHAREAD; 80859000
|
|
IF REALLOCATE THEN GO TO ALLOCATE; 80861000
|
|
T ~ INFO[USER,DICTMAX]; 80863000
|
|
IF ENTERDICT THEN BEGIN 80865000
|
|
WHILE IDENTIFIERS[USER,T]!0 DO T~T+2; 80867000
|
|
INFO[USER, DICTMAX] ~ T; 80869000
|
|
COMMENT IF NEW SYMBOLS CAN BE ACCEPTED, THEN UPDATEIDS; 80871000
|
|
END ELSE 80873000
|
|
WHILE IDENTIFIERS[USER,T]!0 DO 80875000
|
|
IDENTIFIERS[USER,(T~T+2)-2]~0; 80877000
|
|
COMMENT DELETE NEW SYMBOLS FROM ID ARRAY; 80879000
|
|
IF USER = LOADINTERLOCK THEN BEGIN 80881000
|
|
IF RUNNER[USER].[36:12]!"I" 80883000
|
|
THEN BEGIN 80885000
|
|
CLOSE(LOADFILE); 80887000
|
|
LOADINTERLOCK~-1; 80889000
|
|
INFO[USER,LOADLIST]~0; 80891000
|
|
MOVE9(SYNTAX[0],INFO[USER,IOBUF]); 80893000
|
|
CYCLE~USER; 80895000
|
|
GO TO WRITER; 80897000
|
|
END ERROR IN LOADING; 80899000
|
|
IF INFO[USER, LOADLIST] = 1 THEN BEGIN 80901000
|
|
MOVE9(SYNTAX[0], INFO[USER,IOBUF]); 80903000
|
|
CYCLE ~ USER; 80905000
|
|
GO TO WRITER; END LOAD AND LIST; 80907000
|
|
IF INFO[USER,FILELIMITS].[45:3]!0 THEN GO TO RUNNERS; 80909000
|
|
COMMENT TIME SLICE EVERY 8 CARDS ON A LOAD; 80911000
|
|
ACTIVE~TRUE; CYCLE~USER; GO TO ENDLOOP; 80913000
|
|
END LOAD IN PROGRESS; 80915000
|
|
IF RUNNER[USER] = 0 THEN BEGIN CYCLE ~ USER; GO TO ENDRUN; 80917000
|
|
END THE RUNNER CHANGE TO IDLE; 80919000
|
|
IF RUNNER[USER] = "R" THEN IF USER~USER+1>MAXUSER THEN USER~0;80921000
|
|
RUNNERS: CYCLE ~ USER; 80923000
|
|
ACTIVE ~ FALSE; COMMENT FLAG FOR ANY ACTIVE RUNNERS; 80925000
|
|
IF DEBUG THEN WRITE (PR[ DBL], MAX, RUNNER[*]); 80927000
|
|
DO BEGIN 80929000
|
|
IF T ~ RUNNER[USER] > 0 AND T < 9999 THEN BEGIN 80931000
|
|
CHARGETHEUSER; 80933000
|
|
IF T = "S" THEN BEGIN EXECUTECODE(CODE[USER, *], 80935000
|
|
IDENTIFIERS[USER,*], INFO[USER,*], 80937000
|
|
USERARRAY[USER,*], STACK[USER,*]); 80939000
|
|
GO TO ENDRUN; END EXECUTE; 80941000
|
|
IF T = "E" THEN BEGIN 80943000
|
|
GETERRMESSAGE; 80945000
|
|
GO TO WRITEANDCLEAR; 80947000
|
|
END LOADING AN ERROR MESSAGE FROM THE DISK; 80949000
|
|
IF T = "EL" THEN BEGIN 80951000
|
|
GETERRMESSAGE; 80953000
|
|
RUNNER[USER] ~ "L" ; 80955000
|
|
GO TO WRITER; 80957000
|
|
END ERR MSG AND CARD LIST; 80959000
|
|
IF T = "P" THEN BEGIN 80961000
|
|
RUNNER[USER] ~ "S"; 80963000
|
|
GO TO WRITER; END PRINT; 80965000
|
|
IF T = "L" THEN BEGIN 80967000
|
|
T1 ~ (T3~CODE[USER, INFO[USER,CBASEINDX]]). 80969000
|
|
CDISKADDR; 80971000
|
|
IF DISKPOINTER DIV 3! T1 DIV 3 THEN BEGIN 80973000
|
|
IF (T2 ~ T1 DIV 3) ! LISTPOINTER THEN 80975000
|
|
READ(DSK[LISTPOINTER ~ T2], 30, LISTBUF[*]80977000
|
|
); COMMENT READ ENTRY FROM DISK ; 80979000
|
|
MOVE9(LISTBUF[T1 MOD 3 | 10], 80981000
|
|
INFO[USER,IOBUF]); 80983000
|
|
END ELSE MOVE9(DISKBUF[T1 MOD 3 | 10], 80985000
|
|
INFO[USER, IOBUF]); 80987000
|
|
IF T ~ T3.CLINK = 0 THEN RUNNER[USER] ~ 0 80989000
|
|
ELSE INFO[USER,CBASEINDX] ~ T; 80991000
|
|
IF T3.CPARTNUMB!CODE[USER,T]. CPARTNUMB THEN 80993000
|
|
SPACEONE(INFO[USER,IOBUF]); 80995000
|
|
GO TO WRITER; 80997000
|
|
END LIST OPTION; 80999000
|
|
IF T = "H" THEN BEGIN 81001000
|
|
I ~ INFO[USER, HELPLINK].[38:10]; 81003000
|
|
IF T3 ~INFO[USER,HELPLINK].CPARTNUMB!0 81005000
|
|
THEN T1 ~ HELPTABLE[I] ELSE 81007000
|
|
WHILE (T1~HELPTABLE[I]).CSTEPNUMB ! 0 AND 81009000
|
|
T1.CPARTNUMB > 1 DO I~I+1; 81011000
|
|
IF T2~T1.CPARTNUMB=99 AND T3=0 THEN BEGIN 81013000
|
|
RUNNER[USER] ~ 0; 81015000
|
|
GO TO ENDRUN; END; 81017000
|
|
IF T3 ~ INFO[USER, HELPLINK].CPARTNUMB = 0 81019000
|
|
OR T3 = T2 THEN BEGIN 81021000
|
|
IF (T2~T1.CDISKADDR DIV 3) ! LISTPOINTER 81023000
|
|
THEN READ(DSK[LISTPOINTER~T2], 30, 81025000
|
|
LISTBUF[*]); 81027000
|
|
MOVE9(LISTBUF[T1.CDISKADDR MOD 3 | 10], 81029000
|
|
INFO[USER, IOBUF]); 81031000
|
|
INFO[USER, HELPLINK].[38:10] ~ I+1; 81033000
|
|
GO TO WRITER; 81035000
|
|
END ELSE RUNNER[USER] ~ 0; 81037000
|
|
GO TO ENDRUN; 81039000
|
|
END HELP; 81041000
|
|
IF T = "K" THEN BEGIN COMMENT KEYWORD FROM HELP; 81043000
|
|
T2 ~ INFO[USER, HELPLINK].[36:12]; 81045000
|
|
I ~ INFO[USER, HELPLINK].[18:15]; 81047000
|
|
WHILE (T1~HELPTABLE[I]).[36:12] ! T2 DO 81049000
|
|
IF T1.CPARTNUMB = 99 THEN BEGIN 81051000
|
|
RUNNER[USER] ~ 0; 81053000
|
|
GO TO ENDRUN; 81055000
|
|
END ELSE I ~ I+1; 81057000
|
|
IF (T2~T1.CDISKADDR DIV 3) ! LISTPOINTER 81059000
|
|
THEN READ(DSK[LISTPOINTER~T2], 30, 81061000
|
|
LISTBUF[*]); 81063000
|
|
MOVE9(LISTBUF[T1.CDISKADDR MOD 3 | 10] , 81065000
|
|
INFO[USER,IOBUF]); 81067000
|
|
INFO[USER, HELPLINK].[18:15] ~ I+1; 81069000
|
|
GO TO WRITER; 81071000
|
|
END KEY WORD HELPER; 81073000
|
|
IF T = "I" THEN BEGIN 81075000
|
|
IF LOADINTERLOCK<0 THEN LOADINTERLOCK~USER 81077000
|
|
ELSE IF USER!LOADINTERLOCK THEN BEGIN 81079000
|
|
INFO[LOADINTERLOCK,LOADLIST]~0; 81081000
|
|
IF WAITMSG(INFO[USER,IOBUF]) THEN 81083000
|
|
GO TO ENDRUN ELSE GO TO WRITER; 81085000
|
|
END LOAD FILE CONFLICT; 81087000
|
|
IF LOADER(INFO[USER,*]) THEN GO TO NEXT 81089000
|
|
ELSE BEGIN MSG("L",INFO[USER,IOBUF]); 81091000
|
|
IF INFO[USER,FILELIMITS] = 0 THEN MSG("N", 81093000
|
|
INFO[USER,IOBUF]); COMMENT NO FILE PRESENT; 81095000
|
|
LOADINTERLOCK~-1; 81097000
|
|
INFO[USER,LOADLIST]~0; 81099000
|
|
GO TO WRITEANDCLEAR; END END LOADER; 81101000
|
|
IF T = "B" THEN BEGIN 81103000
|
|
INFO[USER,CMAX]~1; COMMENT SET CODE INDEX; 81105000
|
|
FOR I ~ 0 STEP 1 UNTIL MAXUSER DO 81107000
|
|
IF USER!I THEN IF USERID[I]=USERID[USER] THEN 81109000
|
|
BEGIN RUNNER[USER]~"Q"; 81111000
|
|
MSG("D", INFO[USER,IOBUF]); 81113000
|
|
GO TO WRITER; END DUPLICATE USER ID; 81115000
|
|
IF NOT DIRECTORY(USERID[USER],T1,T2) THEN BEGIN81117000
|
|
COMMENT NOT A RESTART; 81119000
|
|
MSG("B",INFO[USER,IOBUF]); 81121000
|
|
GO TO WRITEANDCLEAR; 81123000
|
|
END HANDSHAKE; 81125000
|
|
READ(DSK[T1 DIV 3],30,LOADBUF[*]); 81127000
|
|
IF LOADBUF[(T1 MOD 3 | 10)+9]!T1 THEN BEGIN 81129000
|
|
COMMENT NO CARDS ON DISK; 81131000
|
|
MSG("B",INFO[USER,IOBUF]); 81133000
|
|
GO TO WRITEANDCLEAR; 81135000
|
|
END HANDSHAKE; 81137000
|
|
INFO[USER,LOADLINK]~INFO[USER,FILELIMITS]~T1; 81139000
|
|
INFO[USER,FILEID]~T1&(T6|32+T7)[3:18:30]; 81141000
|
|
RUNNER[USER]~"R"; 81143000
|
|
MSG("R",INFO[USER,IOBUF]); 81145000
|
|
READ(DSK[T6],30,LOADBUF[*]); 81147000
|
|
LOADBUF[T7].SBIT~1; 81149000
|
|
COMMENT CLOSE FILE DURING H/L RECOVERY; 81151000
|
|
WRITE(DSK[T6],30,LOADBUF[*]); 81153000
|
|
IF DEBUG THEN WRITE(PR[DBL],17,LOADBUF[*]); 81155000
|
|
GO TO WRITER; 81157000
|
|
END HANDSHAKE OR INITIALIZING A RESTART; 81159000
|
|
IF T = "R" THEN BEGIN LABEL NXT, NXT1; 81161000
|
|
NXT: 81163000
|
|
IF T~INFO[USER,LOADLINK]}DISKPOINTER THEN BEGIN81165000
|
|
MSG("C",INFO[USER,IOBUF]); 81167000
|
|
RUNNER[USER]~"RL"; 81169000
|
|
READ(DSK[T1~INFO[USER,FILEID].[3:25]], 81171000
|
|
30,LOADBUF[*]); 81173000
|
|
LOADBUF[INFO[USER,FILEID].[28:5]].SBIT~0; 81175000
|
|
COMMENT REOPEN FILE AFTER SUCCESS; 81177000
|
|
WRITE(DSK[T1],30,LOADBUF[*]); 81179000
|
|
GO TO WRITER; 81181000
|
|
END RESTARTING PROGRAM ELSE 81183000
|
|
BEGIN 81185000
|
|
READ(DSK[T DIV 3],30,LOADBUF[*]); 81187000
|
|
NXT1: 81189000
|
|
IF LOADBUF[(T1~T MOD 3|10)+9]=INFO[USER, 81191000
|
|
FILELIMITS].[33:15] THEN BEGIN 81193000
|
|
INFO[USER,FILELIMITS].[18:15]~T; 81195000
|
|
MOVE9(LOADBUF[T1],SYNTAX[0]); 81197000
|
|
INFO[USER,LOADLINK]~T+1; 81199000
|
|
GO TO NEXT; 81201000
|
|
END PASSING CARD IMAGE; 81203000
|
|
IF T MOD 3 ! 2 THEN BEGIN T~T+1; 81205000
|
|
GO TO NXT1; END CHECKING WHOLE SEG; 81207000
|
|
END; 81209000
|
|
INFO[USER,LOADLINK]~T+1; 81211000
|
|
GO TO NXT; END LOADING A CARD IMAGE; 81213000
|
|
IF T = "RL" THEN BEGIN 81215000
|
|
READ(DSK[(T~INFO[USER,FILELIMITS].[18:15]) 81217000
|
|
DIV 3],30,LOADBUF[*]); 81219000
|
|
MOVE9(LOADBUF[T MOD 3 | 10],INFO[USER,IOBUF]); 81221000
|
|
GO TO WRITEANDCLEAR; 81223000
|
|
END LISTING LAST CARD AFTER A RESTART; 81225000
|
|
IF T = "D" THEN BEGIN 81227000
|
|
IF SAVEINTERLOCK<0 THEN BEGIN 81229000
|
|
FILL SAVER WITH INFO[USER,FILENAME]; 81231000
|
|
SEARCH(SAVER,INFO[USER,*]); 81233000
|
|
IF INFO[USER,0] } 0 THEN BEGIN 81235000
|
|
MSG("F", INFO[USER,IOBUF]); 81237000
|
|
GO TO WRITEANDCLEAR; 81239000
|
|
END DUP FILE NAME; 81241000
|
|
SAVEINTERLOCK ~ USER; END 81243000
|
|
ELSE IF USER!SAVEINTERLOCK THEN GO TO ENDRUN; 81245000
|
|
T1 ~ (T3~CODE[USER,INFO[USER,CBASEINDX]]). 81247000
|
|
CDISKADDR; 81249000
|
|
IF DISKPOINTER DIV 3 ! T1 DIV 3 THEN BEGIN 81251000
|
|
IF (T2~T1 DIV 3) ! LISTPOINTER THEN 81253000
|
|
READ(DSK[LISTPOINTER~T2], 30, LISTBUF[*]);81255000
|
|
MOVEG(LISTBUF[T1 MOD 3 | 10], SAVEBUF[0]);81257000
|
|
END ELSE MOVEG(DISKBUF[T1 MOD 3 |10], 81259000
|
|
SAVEBUF[0]); 81261000
|
|
SETSEQ(SAVEBUF[9], T3.CPARTNUMB, T3.CSTEPNUMB);81263000
|
|
WRITE (SAVER, 10, SAVEBUF[*]); 81265000
|
|
IF T ~ T3.CLINK = 0 THEN BEGIN 81267000
|
|
LOCK(SAVER); 81269000
|
|
MSG("S", INFO[USER,IOBUF]); 81271000
|
|
SAVEINTERLOCK ~ -1; 81273000
|
|
IF INFO[USER,PUBLICFLAG]=1 THEN BEGIN 81275000
|
|
PUBLICSAVE(SAVEBUF[0],INFO[USER, 81277000
|
|
FILENAME]); 81279000
|
|
ZIP WITH SAVEBUF[*]; 81281000
|
|
END MAKING PUBLIC FILE; 81283000
|
|
GO TO WRITEANDCLEAR; 81285000
|
|
END LAST CARD ELSE INFO[USER,CBASEINDX] ~ T; 81287000
|
|
GO TO ENDRUN; 81289000
|
|
END SAVING CARDS ON DISK; 81291000
|
|
IF T = "Q" THEN BEGIN 81293000
|
|
IF INFO[USER,CMAX] ! 0 THEN 81295000
|
|
BEGIN 81297000
|
|
INFO[USER,CMAX] ~ 0; 81299000
|
|
EOJMESSAGE(INFO[USER,IOBUF],(T1~TIME(1)/ 81301000
|
|
3600) DIV 60,ENTIER(T1 MOD 60)); 81303000
|
|
GO TO WRITER; %TYPE EOJ MESSAGE 81305000
|
|
END RESPONSE TO QUIT; 81307000
|
|
READ(DSK[T1~INFO[USER,FILEID].[3:25]],30, 81309000
|
|
LISTBUF[*]); 81311000
|
|
LISTPOINTER~0; 81313000
|
|
IF T~INFO[USER,FILEID].[28:5]!0 THEN LISTBUF[ 81315000
|
|
T]~-1; 81317000
|
|
COMMENT SET USERID NEGATIVE TO INDICATE 81319000
|
|
FILE CLOSED; 81321000
|
|
WRITE(DSK[T1],30,LISTBUF[*]); 81323000
|
|
RELEASE(DCTUBUF[USER]); 81325000
|
|
RUNNER[USER]~USERID[USER]~DCTUBUF[USER]~0; 81327000
|
|
ACTIVE ~ TRUE; 81329000
|
|
MAXUSER ~ MAX; 81331000
|
|
WHILE DCTUBUF[MAXUSER] = 0 AND MAXUSER > 0 DO 81333000
|
|
MAXUSER ~ MAXUSER-1; 81335000
|
|
FOR I ~ 0 STEP 1 UNTIL MAXUSER DO 81337000
|
|
IF USERID[I]!0 THEN BEGIN CYCLE~I; 81339000
|
|
GO TO ENDLOOP; END; 81341000
|
|
GO TO FINISH; COMMENT XIT FROM SCHEDULER; 81343000
|
|
END QUIT ROUTINE; 81345000
|
|
END THE RUNNER WAS ACTIVE ELSE GO TO ENDLOOP; 81347000
|
|
ENDRUN: IF RUNNER[USER] = 0 THEN BEGIN 81349000
|
|
SIGNAL(INFO[USER,IOBUF]); 81351000
|
|
RUNNER[USER].SBIT ~ 1; 81353000
|
|
GO TO ENDLOOP; 81355000
|
|
END THE RUNNER CHANGED TO INACTIVE ELSE BEGIN 81357000
|
|
IF RUNNER[USER].SBIT = 0 THEN 81359000
|
|
ACTIVE ~ TRUE; 81361000
|
|
GO TO ENDLOOP; 81363000
|
|
END THE RUNNER IS STILL ACTIVE; 81365000
|
|
WRITEANDCLEAR: RUNNER[USER] ~ 0; 81367000
|
|
WRITER: CARRIAGE(INFO[USER, IOBUF], REAL(RUNNER[USER].[36:12] = 0)); 81369000
|
|
IF DEBUG THEN WRITE(PR[DBL],9,INFO[USER,*]); 81371000
|
|
RUNNER[USER].SBIT ~ 1; 81373000
|
|
IF RUNNER[USER].[36:12] ! 0 THEN ACTIVE ~ TRUE; 81375000
|
|
ENDLOOP: IF USER ~ USER+1 > MAXUSER THEN USER ~ 0; 81377000
|
|
END UNTIL USER = CYCLE; 81379000
|
|
COMMENT ********** END OF RUNNER SELECTION LOOP *********; 81381000
|
|
IF DCIO THEN GO TO NEXT; 81383000
|
|
IF ACTIVE THEN GO TO RUNNERS ELSE 81385000
|
|
DO IDLE ~ TRUE UNTIL DCIO OR ACTIVE; 81387000
|
|
IF ACTIVE THEN GO TO RUNNERS ELSE GO TO NEXT; 81389000
|
|
ALLOCATE: COMMENT EXIT BLOCK TO RE-ALLOCATE ARRAYS; 81391000
|
|
END SCHEDULER; 81393000
|
|
% **********************************************************************90001000
|
|
STREAM PROCEDURE STRTMSG(D, QMARKS, TF); VALUE QMARKS, TF; 90003000
|
|
BEGIN 90005000
|
|
DI~D; DS~12 LIT "PLEASE TRY{!"; SI ~ LOC QMARKS; SI~SI+6; 90007000
|
|
DS~2 CHR; DS~11 LIT "RUN WIPL{!~"; 90009000
|
|
DI~D; TF(DS~18 LIT "PLEASE WAIT....{!~" ); END STREAM; 90011000
|
|
PROCEDURE STARTUPMSG(TF); VALUE TF; BOOLEAN TF; 90013000
|
|
BEGIN 90015000
|
|
IF STATUS(DCBUF[*]) { 0 THEN GO TO ENDEND; 90017000
|
|
COMMENT IF THERE ARE NO REMOTE USERS, THEN QUIT; 90019000
|
|
STRTMSG(DCBUF[1], 12&12[36:42:6], TF); 90021000
|
|
IF DCBUF[0]!0 THEN WRITE(DCO1(DCBUF[0],0),DCWDS,DCBUF[*]); 90023000
|
|
END STARTUP MSG; 90025000
|
|
BOOLEAN STREAM PROCEDURE ENDOFILE(S); 90027000
|
|
BEGIN LOCAL T; LABEL BAD,GOOD; 90029000
|
|
COMMENT IF THE FLAGBIT IS ON IN WORD 9, OR IF WORD 0 = "EOF" OR 90031000
|
|
WORD 9="NUL", OR IF THERE IS NO "~" IN THE FIRST 9 WORDS THEN 90033000
|
|
RETURN TRUE TO INDICATE THE END OF THE LOCAL FILE; 90035000
|
|
SI ~ S; 90037000
|
|
DI~LOC T; DS~8 LIT "00000EOF"; DI~LOC T; 90039000
|
|
IF 8 SC=DC THEN GO TO BAD; 90041000
|
|
SI~SI+40; SI~SI+24; IF SB THEN GO TO BAD; 90043000
|
|
DI~LOC T; DS~8 LIT "00000NUL"; DI~LOC T; 90045000
|
|
IF 8 SC=DC THEN GO TO BAD; 90047000
|
|
GO TO GOOD; 90049000
|
|
BAD: TALLY~1; ENDOFILE~TALLY; 90051000
|
|
GOOD:END ENDOFILE; 90053000
|
|
% ******************************************************************** 90055000
|
|
% ******************************************************************** 90057000
|
|
% ********************** I N I T I A L C O D E ******************** 90059000
|
|
% ******************************************************************** 90061000
|
|
% ******************************************************************** 90063000
|
|
FILL DICT[*] WITH 90065000
|
|
COMMENT CLASSIFICATIONS PRODUCED BY SCAN 90067000
|
|
NUMB. CODE NAME MEANING 90069000
|
|
** ********* ******* 90071000
|
|
0 ENDR END OF STATEMENT 90073000
|
|
1 CONV CONVERSATIONAL-ONLY STATEMENT 90075000
|
|
2 EITHER CONVERSATIONAL OR STORED PROGRAM 90077000
|
|
3 PROG STORED PROGRAM CONTROL WORD 90079000
|
|
4 LPAREN LEFT PAREN, LEFT BRACKET 90081000
|
|
5 IDENT IDETIFIER 90083000
|
|
6 ARRAYID ARRAY IDENTIFIER 90085000
|
|
7 CON CONSTANT 90087000
|
|
8 ADSUB ADD, SUBTRACT OPERATOR 90089000
|
|
9 RPAREN RIGHT PAREN, RIGHT BRACKET 90091000
|
|
10 OPR OPERATOR 90093000
|
|
11 FUNC FUNCTION NAME 90095000
|
|
13 REL RELATIONAL OPERATOR 90097000
|
|
14 SEP SEPARATOR 90099000
|
|
% NAME CLASS KEY 90101000
|
|
% **** ***** *** 90103000
|
|
; 0, 90105000
|
|
"4SAVE011", % 4SAVE CONV 1 90107000
|
|
"4LOAD012", % 4LOAD CONV 2 90109000
|
|
"4QUIT013", % 4QUIT CONV 3 90111000
|
|
"3RUN0014", % 3RUN CONV 4 90113000
|
|
"5ERASE15", % 5ERASE CONV 5 90115000
|
|
"3ZAP0015", % 3ZAP CONV 5 90117000
|
|
"6DELET15", % 6DELET CONV 5 90119000
|
|
"4LIST016", % 4LIST CONV 6 90121000
|
|
"4HELP017", % 4HELP CONV 7 90123000
|
|
"5PURGE18", % 5PURGE CONV 8 90125000
|
|
"6REMOV18", % 6REMOV CONV 8 90127000
|
|
"3SET0020", % 3SET EITHER 0 90133000
|
|
"3LET0020", % 3LET EITHER 0 90135000
|
|
"4READ021", % 4READ EITHER 1 90137000
|
|
"5INPUT21", % 5INPUT EITHER 1 90139000
|
|
"6ACCEP21", % 6ACCEP EITHER 1 90141000
|
|
"6DEMAN21", % 6DEMAN EITHER 1 90143000
|
|
"4TYPE022", % 4TYPE EITHER 2 90145000
|
|
"5PRINT22", % 5PRINT EITHER 2 90147000
|
|
"5WRITE22", % 5WRITE EITHER 2 90149000
|
|
"3REM0023", % 3REM EITHER 3 90151000
|
|
"6REMAR23", % 6REMAR EITHER 3 90153000
|
|
"7COMME23", % 7COMME EITHER 3 90155000
|
|
"3USE0024", 90155100
|
|
"5CLEAR25", 90155200
|
|
"2GO00030", % 2GO PROG 0 90157000
|
|
"4STOP031", % 4STOP PROG 1 90159000
|
|
"2DO00032", % 2DO PROG 2 90161000
|
|
"5WHILE33", % 5WHILE PROG 3 90163000
|
|
"5UNTIL34", % 5UNTIL PROG 4 90165000
|
|
"9DIMEN35", % 9DIMEN PROG 5 90167000
|
|
"3DIM0035", % 3DIM PROG 5 90169000
|
|
"7DECLA35", % 7DECLA PROG 5 90171000
|
|
"5ARRAY35", % 5ARRAY PROG 5 90173000
|
|
"2IF00036", % 2IF PROG 6 90175000
|
|
"4FORM037", % 4FORM PROG 7 90177000
|
|
"6FORMA37", % 6FORMAT PROG 7 90179000
|
|
% "4DATA038" NOT A RESERVED WORD 90181000
|
|
% "7RESTO39" NOT A RESERVED WORD 90183000
|
|
"1(000040", % 1( LPAREN 0 90185000
|
|
"1[000041", % 1[ LPAREN 1 90187000
|
|
"1+000080", % 1+ ADSUB 0 90189000
|
|
"1-000081", % 1- ADSUB 1 90191000
|
|
"1)000090", % 1) RPAREN 0 90193000
|
|
"1]000091", % 1] RPAREN 1 90195000
|
|
"1|0000#0", % 1| OPR 0 90197000
|
|
"1*0000#0", % 1* OPR 0 90199000
|
|
"1/0000#1", % 1/ OPR 1 90201000
|
|
"1**000#2", % 1** OPR 2 90203000
|
|
"3DIV00#3", % 3DIV OPR 3 90205000
|
|
"3MOD00#4", % 3MOD OPR 4 90207000
|
|
"2IP000@0", % 2IP FUNC 0 90209000
|
|
"3INT00@0", % 3INT FUNC 0 90211000
|
|
"3LOG00@1", % 3LOG FUNC 1 90213000
|
|
"2LN000@1", % 2LN FUNC 1 90215000
|
|
"3SIN00@2", % 3SIN FUNC 2 90217000
|
|
"4SINF0@2", % 4SINF FUNC 2 90219000
|
|
"3COS00@3", % 3COS FUNC 3 90221000
|
|
"4COSF0@3", % 4COSF FUNC 3 90223000
|
|
"4TANF0@4", % 4TANF FUNC 4 90225000
|
|
"3TAN00@4", % 3TAN FUNC 4 90227000
|
|
"3ABS00@5", % 3ABS FUNC 5 90229000
|
|
"3EXP00@6", % 3EXP FUNC 6 90231000
|
|
"4EXPF0@6", % 4EXPF FUNC 6 90233000
|
|
"4RAND0@7", % 4RAND FUNC 7 90235000
|
|
"4ATAN0@8", % 4ATAN FUNC 8 90237000
|
|
"3ATN00@8", % 3ATN FUNC 8 90239000
|
|
"3SQR00@9", % 3SQR FUNC 9 90241000
|
|
"4SQRT0@9", % 4SQRT FUNC 9 90243000
|
|
"4SIGN0@#", % 4SIGN FUNC 10 90245000
|
|
"5LOG10@@", % 5LOG10 FUNC 11 90247000
|
|
"6COLUM@:", % 6COLUMN FUNC 13 90249000
|
|
"4SCAN0@>", % 4SCAN FUNC 14 90251000
|
|
% "4PLOT0@B" NOT A RESERVED WORD 90252300
|
|
% "3TAB00@C" NOT A RESERVED WORD 90252400
|
|
% "6REPEA@D" NOT A RESERVED WORD 90252500
|
|
"1=0000:0", % 1= REL 0 90253000
|
|
"1:=000:0", % 1:= REL 0 90255000
|
|
"2EQ000:0", % 2EQ REL 0 90257000
|
|
"3EQU00:0", % 3EQU REL 0 90259000
|
|
"3EQL00:0", % 3EQL REL 0 90261000
|
|
"1!0000:1", % 1! REL 1 90263000
|
|
"2NE000:1", % 2NE REL 1 90265000
|
|
"3NEQ00:1", % 3NEQ REL 1 90267000
|
|
"1>0000:2", % 1> REL 2 90269000
|
|
"2GT000:2", % 2GT REL 2 90271000
|
|
"3GTR00:2", % 3GTR REL 2 90273000
|
|
"1<0000:3", % 1< REL 3 90275000
|
|
"2LT000:3", % 2LT REL 3 90277000
|
|
"3LSS00:3", % 3LSS REL 3 90279000
|
|
"1}0000:4", % 1} REL 4 90281000
|
|
"2GE000:4", % 2GE REL 4 90283000
|
|
"3GEQ00:4", % 3GEQ REL 4 90285000
|
|
"1{0000:5", % 1{ REL 5 90287000
|
|
"2LE000:5", % 2LE REL 5 90289000
|
|
"3LEQ00:5", % 3LEQ REL 5 90291000
|
|
"1,0000>0", % 1, MISC 0 90293000
|
|
"2BY000>1", % 2BY MISC 1 90295000
|
|
"4ELSE0>2", % 4ELSE MISC 2 90297000
|
|
"4THRU0>3", % 4THRU MISC 3 90299000
|
|
"2TO000>4", % 2TO MISC 4 90301000
|
|
"4THEN0>5", % 4THEN MISC 5 90303000
|
|
"4STEP0>6", % 4STEP MISC 6 90305000
|
|
"3YES00>7", % 3YES MISC 7 90307000
|
|
"2AS000>8", % 2AS MISC 8 90309000
|
|
"4PART0>#", % 4PART MISC 10 90311000
|
|
"4TIME0>@", % 4TIME MISC 11 90313000
|
|
"5TIMES>@", % 5TIMES MISC 11 90315000
|
|
"3FOR00>:", % 3FOR MISC 13 90317000
|
|
"4FROM0>>", % 4FROM MISC 14 90319000
|
|
"2NO000>}", % 2NO MISC 15 90321000
|
|
"4DISK0>+", % 4DISK MISC 16 90323000
|
|
0; COMMENT FIRST AND LAST WORD MUST BE ZERO; 90325000
|
|
FILL STACK[*] WITH ":0",0,"99",1,"80",2,"81",2,"#5",2,"#0",3,"#1",3, 90327000
|
|
"#3",3,"#4",3,"#2",4,"90",5; 90329000
|
|
COMMENT "99" IS MARKSTACK; 90331000
|
|
IF REAL(DEBUG) > 1 THEN FILL DSK WITH "TEMP"; 90333000
|
|
SEARCH(DSK,INFO[0,*]); COMMENT LOOK AT DISK DIRECTORY; 90335000
|
|
IF INFO[0,6] } 1 THEN BEGIN 90337000
|
|
STARTUPMSG(FALSE); GO TO ENDEND; END SAVFILE IS BEING USED; 90339000
|
|
IF INFO[0,0]}0 THEN BEGIN READ (DSK[0],30,DISKBUF[*]); 90341000
|
|
IF DISKBUF[2]>TIME(1) THEN BEGIN COMMENT IF FILE IS PRESENT 90343000
|
|
AND TIME OF LAST USE GREATER THAN PRES TIME, THEN REMAKE;90345000
|
|
INFO[0,0]~-1; CLOSE(DSK,PURGE); WHEN(1); END DAILY PG;90347000
|
|
END POSSIBLY RE CREATING WIPLS SAVFILE; 90349000
|
|
IF INFO[0,0]<0 THEN 90351000
|
|
% ---------------- C R E A T E S A V E F I L E ------------ ------- 90353000
|
|
BEGIN 90355000
|
|
COMMENT FILE NOT PRESENT; 90357000
|
|
FILE MAKER DISK RANDOM[20:180]"WIPLS""SAVFILE"(1,30,30,SAVE 999); 90359000
|
|
DEFINE ERRORS = LOADFILE#; 90361000
|
|
LABEL EOF; 90363000
|
|
STREAM PROCEDURE FORMATERRORS(S,S1,D); 90365000
|
|
BEGIN LOCAL T; 90367000
|
|
SI~S1; SI~SI-1; 90369000
|
|
63(IF SC ! " " THEN JUMP OUT ELSE SI~SI-1); 90371000
|
|
SI~SI+1; T~SI; DI~T; DS~LIT "~"; 90373000
|
|
SI~S; 15(IF SC = "M" THEN JUMP OUT ELSE SI~SI+1); 90375000
|
|
SI~SI+2; DI~D; DS~63 CHR; 90377000
|
|
END FORMATTING ERRORS; 90379000
|
|
COMMENT OPEN AND CLOSE FILE IN THIS BLOCK; 90381000
|
|
IF REAL(DEBUG) > 1 THEN FILL MAKER WITH "TEMP"; 90383000
|
|
STARTUPMSG(TRUE); 90385000
|
|
COMMENT WRITE WAIT MESSAGE FOR FIRST USER; 90387000
|
|
DIRBUF[0]~"DIR"; 90389000
|
|
DENTRY~3; 90391000
|
|
DISKBUF[0]~"EOF"; 90393000
|
|
FOR I~1 STEP 1 UNTIL 10 DO WRITE(MAKER[I],30,SYNTAX[*]); 90395000
|
|
FOR I~HELPARRAYSTART STEP 1 UNTIL ERRORSTART-1 DO WRITE(MAKER[I], 90397000
|
|
30,HELPTABLE[*]); 90399000
|
|
FOR I~FILESTART STEP 1 UNTIL FILESTART+12 DO WRITE(MAKER[I],30, 90401000
|
|
DISKBUF[*]); 90403000
|
|
WRITE(MAKER[359],30,DISKBUF[*]); 90405000
|
|
COMMENT WRITE LAST RECORD IN ROW; 90407000
|
|
DISKPOINTER~FILESTART|3; 90409000
|
|
DIRBUF[3]~DISKPOINTER&DENTRY[13:43:5]; 90411000
|
|
WRITE(MAKER[0],30,DIRBUF[*]); 90413000
|
|
COMMENT INITIALIZE DISK AND RESERVE SEGMENT 0 FOR FIRST 90415000
|
|
DIRECTORY ENTRY; 90417000
|
|
LOCK(MAKER); 90419000
|
|
DO SEARCH(MAKER,INFO[0,*]) UNTIL INFO[0,0]}0; 90421000
|
|
FILL INFO[0,*] WITH "CC FREE ","WIPLS/SA","VFILE;EN","D. "; 90423000
|
|
IF REAL(DEBUG){1 THEN ZIP WITH INFO[0,*]; 90425000
|
|
WHEN(1); 90427000
|
|
HELPLOADER; 90429000
|
|
COMMENT LOAD HELPFIL FROM DISK; 90431000
|
|
FILL LOADFILE WITH "ERRORS "; 90433000
|
|
I~(ERRORSTART|3)-1; 90435000
|
|
T1~-1; 90437000
|
|
SEARCH(LOADFILE,SYNTAX[*]); 90439000
|
|
IF SYNTAX[0] < 0 THEN BEGIN COMMENT NO ERROR FILE IN DIRECTRY; 90441000
|
|
DISKBUF[0]~DISKBUF[10]~DISKBUF[20]~"R~ "&"ERRO"[1:25:23]; 90443000
|
|
FOR T~ERRORSTART STEP 1 UNTIL ERRORSTART+MAXERRNUMBER/3 DO 90445000
|
|
WRITE(DSK[T],30,DISKBUF[*]); 90447000
|
|
END NO FILE ELSE BEGIN 90449000
|
|
WHILE TRUE DO BEGIN 90451000
|
|
READ(ERRORS[T1~T1+1], 10, SYNTAX[*])[EOF]; 90453000
|
|
FORMATERRORS(SYNTAX[0],SYNTAX[9],DISKBUF[T~(I~I+1)MOD 3|10]); 90455000
|
|
IF T = 20 THEN WRITE(DSK[I DIV 3],30,DISKBUF[*]); 90457000
|
|
END LOADING ERROR FILE; 90459000
|
|
EOF: IF T ! 20 THEN WRITE(DSK[I DIV 3],30,DISKBUF[*]); 90461000
|
|
CLOSE(ERRORS); 90463000
|
|
END FILE PRESENT; 90465000
|
|
END INITIALIZING A CLEAN DISK ELSE 90467000
|
|
% -------------------- U S E O L D F I L E --------------------------90469000
|
|
BEGIN 90471000
|
|
I~HELPARRAYSTART-1; 90473000
|
|
DO BEGIN 90475000
|
|
READ(DSK[I~I+1],30,SYNTAX[*]); 90477000
|
|
T~(I-HELPARRAYSTART)|30; 90479000
|
|
T2~-1; 90481000
|
|
FOR T1~T STEP 1 UNTIL T+29 DO HELPTABLE[T1]~SYNTAX[T2~T2+1]; 90483000
|
|
END UNTIL SYNTAX[0]=0 OR I=ERRORSTART-1; 90485000
|
|
COMMENT LOAD HELPTABLE; 90487000
|
|
READ(DSK[0],30,DIRBUF[*]); 90489000
|
|
RESTART~DIRBUF[4]!0; 90491000
|
|
COMMENT SELECT NORMAL/RESTART MODE; 90493000
|
|
IF T~DIRBUF[3]>0 THEN 90495000
|
|
BEGIN 90497000
|
|
COMMENT NORMAL RESTART; 90499000
|
|
DENTRY~T.[13:5]; 90501000
|
|
DLOC~T.[18:15]; 90503000
|
|
DISKPOINTER~T.[33:15]; 90505000
|
|
READ(DSK[DLOC],30,DIRBUF[*]); 90507000
|
|
READ(DSK[DISKPOINTER DIV 3],30,DISKBUF[*]); 90509000
|
|
COMMENT POINTERS AND BUFFERS ARE READY TO GO NOW; 90511000
|
|
END HANDLING A NORMAL RESTART ELSE 90513000
|
|
% ---------------------- H A L T L O A D R E C O V E R Y --------- 90515000
|
|
BEGIN 90517000
|
|
STARTUPMSG(TRUE); 90519000
|
|
COMMENT WRITE WAIT MESSAGE; 90521000
|
|
DIRBUF[4]~-1; 90523000
|
|
DIRBUF[2]~TIME(1); COMMENT RECORD TIME OF DAY OF LAST USE; 90525000
|
|
WRITE(DSK[0],30,DIRBUF[*]); 90527000
|
|
COMMENT SET ABORT FLAG IN SAVFILE; 90529000
|
|
DLOC~0; 90531000
|
|
DO READ(DSK[DLOC],30,DIRBUF[*]) UNTIL DLOC~DIRBUF[1]=0; 90533000
|
|
COMMENT CHAIN THROUGH DIRECTORY SEGMENTS UNTIL LAST ONE; 90535000
|
|
DENTRY~3; 90537000
|
|
RESTART~TRUE; 90539000
|
|
FOR I~0 STEP 1 UNTIL 9 DO 90541000
|
|
IF DENTRY!27 THEN IF DIRBUF[DENTRY+3]!0 THEN DENTRY~DENTRY+3; 90543000
|
|
COMMENT FIND LAST DIRECTORY ENTRY; 90545000
|
|
DISKPOINTER~IF DLOC=0 AND DENTRY=3 THEN FILESTART|3 ELSE 90547000
|
|
DIRBUF[DENTRY+1]; 90549000
|
|
COMMENT PICK STARTING POINT TO SEARCH DIRECTORY; 90551000
|
|
DO BEGIN 90553000
|
|
IF T~DISKPOINTER MOD 3 = 0 THEN READ(DSK[DISKPOINTER 90555000
|
|
DIV 3],30,DISKBUF[*]); 90557000
|
|
DISKPOINTER~DISKPOINTER+1; 90559000
|
|
END UNTIL ENDOFILE(DISKBUF[T|10]); 90561000
|
|
DISKPOINTER~DISKPOINTER-1; 90563000
|
|
END SETTING POINTERS OF AN ABORT RESTART; 90565000
|
|
END RESTART; 90567000
|
|
STNOMASK.CSNUMB ~ 131071; 90569000
|
|
PTMASK.CPARTNUMB~127; 90571000
|
|
UNDEFINED ~ "EEEE" &"EEEE" [1:25:23]; 90573000
|
|
MAXCODESIZE~MAXUSERARRAY~22; COMMENT GUESS AT ARRAY SIZES; 90575000
|
|
SAVEINTERLOCK~LOADINTERLOCK~-1; 90577000
|
|
% ******************************************************************** 90579000
|
|
BEGIN LABEL NEWSEGMENT; 90581000
|
|
WHILE TRUE DO SCHEDULER(MAXCODESIZE, MAXUSERARRAY); 90583000
|
|
NEWSEGMENT: END CALLING SCHEDULER AND REALLOCATING ARRAYS; 90585000
|
|
% ******************************************************************** 90587000
|
|
FINISH: 90589000
|
|
IF RESTART THEN 90591000
|
|
BEGIN 90593000
|
|
RESTART~FALSE; 90595000
|
|
T1~0; 90597000
|
|
T2~6; 90599000
|
|
DO BEGIN 90601000
|
|
READ(DSK[T1],30,DIRBUF[*]); 90603000
|
|
DO BEGIN 90605000
|
|
IF T3~DIRBUF[T2]=0 THEN 90607000
|
|
BEGIN 90609000
|
|
WRITE(DSK[T1],30,DIRBUF[*]); 90611000
|
|
GO TO FINISH1; 90613000
|
|
END; 90615000
|
|
IF T3>0 THEN 90617000
|
|
BEGIN 90619000
|
|
T3~TIME(0); 90621000
|
|
IF (T4~T3.[30:6]|100+T3.[36:6]|10+T3.[42:6])> 90623000
|
|
(T5~DIRBUF[T2+2].[39:9])+1 OR (T4<T5 AND 90625000
|
|
T4=2) OR T4!T5 THEN DIRBUF[T2].[1:2]~-3 90627000
|
|
ELSE RESTART~TRUE; 90629000
|
|
COMMENT PURGE EXPIRED FILE THE NEXT DAY; 90631000
|
|
END; 90633000
|
|
END UNTIL T2~T2+3=30; 90635000
|
|
WRITE(DSK[T1],30,DIRBUF[*]); 90637000
|
|
T2~3; 90639000
|
|
END UNTIL T1~DIRBUF[1]=0; 90641000
|
|
END RESTART; 90643000
|
|
FINISH1: 90645000
|
|
READ(DSK[0],30,DIRBUF[*]); 90647000
|
|
IF NOT RESTART THEN 90649000
|
|
BEGIN 90651000
|
|
DIRBUF[4]~0; 90653000
|
|
DIRBUF[3]~ENTIER(FILESTART|3)&3[13:43:5]; 90655000
|
|
FOR I~5 STEP 1 UNTIL 29 DO DIRBUF[I]~0; 90657000
|
|
DISKBUF[0]~"EOF"; 90659000
|
|
FOR I~FILESTART STEP 1 UNTIL FILESTART+12 DO WRITE(DSK[I], 90661000
|
|
30,DISKBUF[*]); 90663000
|
|
COMMENT RESET POINTERS TO INDICATE A NULL FILE; 90665000
|
|
END ELSE 90667000
|
|
DIRBUF[3]~DISKPOINTER&DLOC[18:33:15]&DENTRY[13:43:5]; 90669000
|
|
DIRBUF[2]~TIME(1); COMMENT RECORD TIME OF DAY OF LAST USE; 90671000
|
|
WRITE(DSK[0],30,DIRBUF[*]); 90673000
|
|
ENDEND : 90675000
|
|
END. 90677000
|
|
END;END. LAST CARD ON 0CRDING TAPE 99999999
|