@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@ @@@@@@@ @@@@@@ @@@@@@ @@@@@@@ @@@ @@@@@@@@ @@@@@@@@@ @@@@@@@@ @@@@@@@@ @@@@@@@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@@@@@@ @@@ @@@ @@@@@@@@ @@@ @@@ @@@ @@@ @@@@@@@ @@@@@@@@@ @@@@@@@@ @@@ @@@@@@@@@ @@@ @@@ @@@@@@@@@ @@@ @@@ @@@ @@@@@@@@@ @@@ @@@ @@@ @@@ @@@@@@@@ @@@@@@@@ @@@ @@@ @@@@@@@@ @@@ @@@ @@@ @@@@@@ @@@@@@ @@@ @@@ @@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ESI PASCAL SUPPLEMENT TO THE USER MANUAL & REPORT CONTENTS: DIFFERENCES RESERVED WORDS, PREDEFINED WORDS AND SPECIAL SYMBOLS STATEMENTS BUILT-IN PROCEDURES AND FUNCTIONS RUN-TIME ORGANIZATION STORAGE OF VARIABLES CALLING PASCAL PROCEDURES FROM MACRO CODE SECTIONS RUN-TIME ERROR MESSAGES COMPILER SWITCHES COMPILER ERROR MESSAGES HINTS ON OPTIMIZING PROGRAMS NON-RT SUPPORT FORTRAN COMPATABILITY INTERRUPTS OVERLAYS RANDOM ACCESS FILES CROSS-REFERENCE GENERATOR IMP (OPTIMIZER) PROGRAM EXAMPLES COPYRIGHT (C) 1976,1977 ELECTRO-SCIENTIFIC INDUSTRIES. OCT 3, 1977 THE STANDARD PACKAGE SHIPPED TO RT11 PASCAL CUSTOMERS WILL INCLUDE: PAS.SAV COMPILER FOR 40 STYLE FP CODE OUTPUT PAS45.SAV COMPILER FOR 45 STYLE FP CODE BOTH WILL RUN ON ANY 11 SUPPER.OBJ SUPPORT PACKAGE FOR 03,05,10,34,35,40 SUPP45.OBJ SUPPORT PACKAGE FOR 45 AND UP SUPPORT PACKAGE SOURCES K45.MAC CONDITIONAL FOR ASSEMBLING SUPPORT PACKAGE FOR 45 K03.MAC CONDITIONAL FOR 03 (& 34) SUPPORT NOSUP.MAC CONDITIONAL FOR NON-RT SUPPORT PACKAGE SS.MAC CONDITIONALS AND MACROS S1.MAC START CODE, NOSUP, EIS-FIS SIMULATOR S2.MAC SWPSTK, SVREG S3.MAC FILE OPEN, CLOSE S4.MAC READ SUPPORT S5.MAC READ MISCELLANEOUS S6.MAC READ INTEGER S7.MAC READ STRING (ALFA) S8.MAC READ REAL S9.MAC WRITE SUPPORT S10.MAC WRITE MISCELLANEOUS S11.MAC WRITE INTEGER S12.MAC WRITE REAL S13.MAC GET, PUT S14.MAC NEW, DISPOSE S15.MAC SETS S16.MAC TIME S17.MAC SQUARE ROOT S18.MAC LOG, LN S19.MAC ARCTANGENT (ATAN) S20.MAC SINE, COSINE S21.MAC EXP, EXP10 S22.MAC TRUNC, ROUND, FLOAT S23.MAC FLOATING COMPARE S24.MAC FORTRAN CALL CLEANUP S25.MAC INTEGER ARITH CALLS S26.MAC DEBUGGER END.MAC ENDST.MAC SUPPER.BAT BATCH FILE FOR ASSEMBLING STANDARD SUPPORT SUPP45.BAT BATCH FILE FOR 45 SUPPORT SUPP03.BAT BATCH FILE FOR 03 SUPPORT NOSUP.BAT BATCH FILE FOR NON-RT SUPPORT CONCAT.BAT BATCH FILE TO CONCATENATE SUPPORT SOURCES CROSS.PAS SOURCE OF CROSS REF & FORMAT PROGRAM CROSS.SAV CROSS REF TO RUN WITH OVERLAYS IMP.PAS SOURCE OF POST-COMPILATION OPTIMIZER IMP.SAV IMP TO RUN WITH OVERLAYS SUPP.DOC DETAILS OF ESI'S IMPLEMENTATION OF PASCAL ( HERE IS RENAMED: ESIPAS.MNL ) THE ESI PASCAL COMPILER COMPILES FULL PASCAL AS DESCRIBED IN THE REVISED REPORT WITH THE FOLLOWING RESTRICTIONS AND EXTENSIONS: RESTRICTIONS: 1.PACK AND UNPACK PROCEDURES ARE NOT IMPLEMENTED. 2.THE 'PROGRAM' HEADING PARAMETERS ARE IGNORED EXCEPT THAT THE PROGRAM NAME IS USED AS A HEADER ON THE LISTING FILE. 3.NEW AND DISPOSE PROCEDURES DO NOT USE VARIANT TAG FIELDS. 4.STANDARD FUNCTIONS AND PROCEDURES CAN NOT BE USED AS FUNCTION OR PROCEDURE PARAMETERS TO PROCEDURES OR FUNCTIONS. 5.FILE OF FILES IS NOT ALLOWED. 6.SETS CAN CONTAIN A MAXIMUM OF 64 ELEMENTS (SUBRANGES ARE SUPPORTED E.G. 64..127) 7.INPUT AND OUTPUT ARE NOT PRE-DEFINED AS THE DEFAULT INPUT AND OUTPUT FILES. THE DEFAULTS ARE TO AND FROM THE CONSOLE TERMINAL. 8.READ(CH) DOES NOT BRING BACK A BLANK (ASCII 40) FOR LINE FEED RATHER, IT BRINGS BACK THE ACTUAL LINE FEED (ASCII 12). EXTENSIONS: 1.THE CASE STATEMENT HAS AN ELSE CLAUSE. IT MUST BE THE LAST CLAUSE IN THE LIST. 2.EXTERNAL PROCEDURES CAN BE PRE-COMPILED AND LINKED AT LINK TIME. 3. RESET AND REWRITE PROCEDURES HAVE OPTIONAL SECOND, THIRD AND FOURTH ARGUMENTS. THE SECOND IS A CHARACTER ARRAY AND IS THE NAME OF THE FILE TO BE OPENED. THE THIRD IS A CHARACTER ARRAY AND IS THE DEFAULT EXTENSION TO BE USED IF NONE IS GIVEN IN THE NAME. THE FOURTH IS AN INTEGER VARIABLE WHICH IS USED TO SPECIFY THE LENGTH OF THE FILE. 4.FOR HARDWARE USE, 'OR' AND 'AND' OPERATORS HAVE BEEN EXTENDED TO OPERATE ON INTEGERS AS WELL AS BOOLEANS. THERE IS ALSO A KEYWORD 'ORIGIN' THAT IS USED TO LOCATE A VARIABLE AT A FIXED CORE LOCATION (FOR INTERROGATING HARDWARE DEVICE REGISTERS). 5.MACRO ASSEMBLER CODE CAN BE INSERTED IN LINE WITH PASCAL CODE. 6.THERE IS A STANDARD FUNCTION 'TIME' THAT RETURNS THE TIME OF DAY FROM THE MONITOR IN A REAL NUMBER OF HOURS PAST MIDNIGHT (1:30 PM => 13.5) 7.THE 'PROGRAM' HEADING TO A PASCAL PROGRAM IS OPTIONAL. 8.IF AN INTEGER CONSTANT IS SUFFIXED WITH THE LETTER 'B' IT IS TAKEN TO BE AN OCTAL NUMBER (E.G. 40B = 32 DECIMAL). 9.AN 'EXIT' STATEMENT HAS BEEN ADDED TO EXIT FROM THE INNERMOST FOR, REPEAT OR WHILE LOOP. 10.A PREDEFINED PROCEDURE 'BREAK' HAS BEEN ADDED TO ALLOW THE USER TO FORCE THE 256 WORD BUFFER FOR EACH FILE IN CORE OUT TO THE DEVICE (USEFUL FOR INTERACTIVELY OUTPUTING TO NON FILE STRUCTURED DEVICES) 11.A 'CLOSE' PROCEDURE EXISTS FOR CLOSING A FILE. 12. THERE IS A READ PROCEDURE FOR ALFAS (CHARACTER ARRAYS). 13. THE FLOAT FUNCTION (CONVERT INTEGER TO REAL) IS AVAILABLE EXPLICITLY. COMPILING SEQUENCE THE BASIC SEQUENCE OF COMMANDS TO COMPILE AND EXECUTE A PASCAL PROGRAM IS: .R PAS *MACFIL(.MAC),LSTFIL(.LST) = # <> <= >= + - * / & ! . , ; : ( ) [ ] .. := _ ^ /* */ @ AND LEFT AND RIGHT BRACES STATEMENTS. BEGIN ... END (COMPOUND STATEMENT) BEGIN AND END GENERATE NO CODE AND COST NO EXECUTION TIME. THEY SERVE TO BRACKET THE STATEMENTS BETWEEN THEM AS A SYNTACTIC SINGLE STATEMENT, EXACTLY AS LEFT AND RIGHT PARENTHESES ENCLOSE WHAT IS BETWEEN, HOWEVER COMPLICATED, AS A SINGLE EXPRESSION. THE STATEMENTS ARE EXECUTED IN SEQUENCE FROM FIRST TO LAST. IF STATEMENT. THE IF STATEMENT IS EXECUTED BY FIRST EVALUATING THE EXPRESSION, WHICH MUST BE OF TYPE BOOLEAN. IF IT IS TRUE, THE STATEMENT FOLLOWING "THEN" IS EXECUTED, IF FALSE, THE STATEMENT FOLLOWING "ELSE" IS EXECUTED. IF FALSE AND THERE IS NO ELSE CLAUSE, NOTHING IS DONE AND CONTROL PASSES TO THE NEXT STATEMENT. REPEAT STATEMENT. THE CONTAINED STATEMENTS ARE EXECUTED IN ORDER ONCE. THEN THE EXPRESSION, WHICH MUST BE BOOLEAN, IS EVALUATED. IF TRUE, CONTROL PASSES TO THE NEXT STATEMENT. IF FALSE, CONTROL PASSES TO THE BEGINNING OF THE REPEAT AND THE STATEMENTS ARE EXECUTED AGAIN. THIS CONTINUES UNTIL THE EXPRESSION BECOMES TRUE. WHILE STATEMENT. THE WHILE STATEMENT IS ALMOST IDENTICAL IN EXECUTION TO THE REPEAT. THE DIFFERENCE IS THAT THE BOOLEAN EXPRESSION IS EVALUATED BEFORE THE CONTAINED STATEMENT IS EXECUTED, RATHER THAN AFTER. IF FALSE, THE STATEMENT IS SKIPPED AND CONTROL PASSES TO THE NEXT STATEMENT. IF TRUE, IT IS EXECUTED ONCE, AND THE BOOLEAN EXPRESSION IS EVALUATED AGAIN. THIS LOOP CONTINUES UNTIL THE EXPRESSION BECOMES FALSE. CASE STATEMENT. WHEN THE CASE STATEMENT IS EXECUTED, THE EXPRESSION IS EVALUATED. ONE AND ONLY ONE OF THE STATEMENTS IN THE CASE LIST IS EXECUTED, THE ONE PRECEDED BY THE CONSTANT WHOSE VALUE IS THE VALUE OF THE EXPRESSION. THE EXPRESSION MUST BE INTEGER, CHAR, BOOLEAN, OR SCALAR TYPE. THE CONSTANTS IN THE CASE LIST ARE NOT DECLARED LABELS AND MAY NOT BE THE DESTINATION OF A "GOTO". EX. CASE I OF 0:WRITELN('SUNDAY'); 1:WRITELN('MONDAY'); 2:WRITELN('TUESDAY'); 3:WRITELN('WEDNESDAY'); 4:WRITELN('THURSDAY'); 5:WRITELN('FRIDAY'); 6:WRITELN('SATURDAY') END; THE FOLLOWING COMMENTS APPLY TO ESI PASCAL AND ARE NOT PART OF THE DEFINITION OF STANDARD PASCAL. EXECUTION TIME IS BASICALLY ONLY THAT REQUIRED TO EVALUATE THE EXPRESSION. SELECTION OF THE CASE CLAUSE TAKES THE SAME TIME REGARDLESS OF WHICH CLAUSE IS CHOSEN. IF THE VALUE OF THE EXPRESSION IS NOT IN THE LIST, NOTHING IS DONE AND THE NEXT STATEMENT IS EXECUTED. THE CASE LIST MAY INCLUDE AN ELSE CLAUSE. IT MUST BE THE LAST CLAUSE IN THE LIST. ITS STATEMENT IS EXECUTED IF THE VALUE OF THE EXPRESSION DOES NOT EQUAL ANY CONSTANT IN THE LIST. IF THERE IS NO ELSE CLAUSE AND THE EXPRESSION DOES NOT MATCH ANY CONSTANT, THEN NOTHING IS DONE AND CONTROL PASSES TO THE NEXT STATEMENT AFTER THE CASE STATEMENT. THE CONSTANTS DO NOT NEED TO BE IN ANY ORDER. THE COMPILER GENERATES A TABLE OF DISPATCH ADDRESSES. THE TABLE CONTAINS ONE WORD FOR EACH CONSTANT IN THE LIST, FROM THE LEAST TO THE GREATEST, AND A WORD FOR EACH VALUE WITHIN THAT RANGE, WHETHER LISTED OR NOT. EX. CASE I OF 1:....... 1000: ...... END WOULD BUILD A TABLE OF 1000 ENTRIES BUT ONLY TWO USEFUL ONES. THEREFORE, AVOID EXTENSIVE AND SPARSE CASE LISTS. FOR STATEMENT EXECUTED IN THIS ORDER: 1) THE FIRST EXPRESSION IS EVALUATED. 2) THE SECOND EXPRESSION IS EVALUATED. 3) THE VALUE OF THE FIRST EXPRESSION IS GIVEN TO THE CONTROL VARIABLE. 4) THE VARIABLE IS CHECKED AGAINST THE VALUE OF THE SECOND EXPRESSION. 5) IF IT IS LESS OR EQUAL (GREATER OR EQUAL WHEN "DOWNTO" IS USED) THEN THE CONTAINED STATEMENT IS EXECUTED. IF THE CHECK FAILS, THEN CONTROL PASSES TO THE NEXT STATEMENT. 6) THE VALUE OF THE CONTROL VARIABLE IS INCREASED (DECREASED) BY ONE AND THE PROCESS CONTINUES AT STEP 4. ONLY UNIT STEPS ARE ALLOWED. THE TERMINATING LIMIT SHOULD NOT BE EQUAL TO MAXINT (32767, -32767 FOR "DOWNTO") BECAUSE THE TERMINATING CONDITION (5) CAN NEVER BE MET, AND THE LOOP WILL CONTINUE FOREVER. THE CONTROL VARIABLE AND EXPRESSIONS MAY BE ANY DISCRETE TYPE; INTEGER, CHARACTER, BOOLEAN OR USER-DEFINED. THEY MUST BE THE SAME TYPE. THE CONTAINED STATEMENT CANNOT CHANGE THE VALUES OF THE TWO CONTROL EXPRESSIONS, FOR THEY ARE EVALUATED ONCE ONLY UPON ENTRY TO THE STATEMENT. FOR I:=A TO B DO ... IS EQUIVALENT TO: R:=A; S:=B; /*S AND R ARE AUXILIARY VARIABLES*/ I:=R; WHILE I<=S DO BEGIN . . I:=I+1 END; WITH STATEMENT. IN EXECUTION, THE WITH STATEMENT CAUSES THE CALCULATION OF THE ADDRESS OF THE VARIABLE AND PUTS THAT VALUE IN A REGISTER. ANY COMPONENT OF THAT VARIABLE USED IN THE STATEMENT WILL BE ADDRESSED USING THIS REGISTER, THUS AVOIDING THE RECALCULATION OF THE ADDRESS OF THE VARIABLE EACH TIME A PORTION OF IT IS REFERRED TO. SINCE A REGISTER IS NEEDED FOR EACH "WITH" VARIABLE, THERE CANNOT BE MORE THAN FOUR OF THEM NESTED, FEWER IF THE EXPRESSIONS WITHIN ARE COMPLEX ENOUGH TO CALL UPON REGISTERS FOR THEIR CALCULATION. PROCEDURE CALL STATEMENT. A PROCEDURE IS A SUBROUTINE. WHEN THE PROCEDURE CALL IS EXECUTED, THE PARAMETERS ARE PUSHED ONTO THE R6 STACK, AND CONTROL IS GIVEN TO THE PROCEDURE. THE PROCEDURE IS EXECUTED, AND CONTROL IS PASSED BACK TO THE STATEMENT FOLLOWING THE PROCEDURE CALL. GOTO STATEMENT. THE GOTO IS AN UNCONDITIONAL JUMP TO ANOTHER STATEMENT IN THE PROGRAM. EXECUTION CONTINUES NORMALLY FROM THERE. THE DESTINATION STATEMENT MUST BEAR A LABEL (AN UNSIGNED INTEGER DECLARED AS A LABEL AND PREFIXED TO THE DESTINATION STATEMENT). EX. LABEL 57; .... 57: A:=B+C; .... GOTO 57; GOTOS MAY CAUSE A JUMP UP IN LEVEL, FROM A PROCEDURE INTO A PROCEDURE WHICH CONTAINS IT, BUT NEVER DOWN. IN OTHER WORDS, ENTRY TO A PROCEDURE IS ALWAYS BY A PROCEDURE CALL. EXIT MAY BE BY GOTO. JUMPS INTO "WITH" AND "FOR" STATEMENTS ARE ALLOWED, BUT THEY ARE CERTAIN TO CAUSE TROUBLE BECAUSE THESE TWO STATEMENTS DEPEND ON CERTAIN INITIAL CONDITIONS WHICH ARE ONLY ESTABLISHED BY AN ORTHODOX ENTRY. JUMPS WITHIN OR OUT OF THESE STATEMENTS ARE ALLOWED. NULL STATEMENT. A STATEMENT WHICH IS INDICATED BY THE SYNTAX BUT DOES NOT EXIST IS CALLED A NULL STATEMENT. THE COMPILER GENERATES NO CODE FOR IT AND SIMPLY PASSES ON. FOR EXAMPLE, THE SEMICOLON IS USED, AMONG OTHER THINGS, TO SEPARATE ADJACENT STATEMENTS. THE SEMICOLON TELLS THE COMPILER THAT ONE STATEMENT IS ENDED AND ANOTHER IS ABOUT TO BEGIN. BEGIN A:=3; B:=5 END NO SEMICOLON IS NEEDED AFTER "5" BECAUSE "END" IS NOT A STATEMENT BUT THE FINAL DELIMITER OF THE "BEGIN .. END" BRACKETING. A SEMICOLON MIGHT BE PLACED AFTER "5" FOR CONVENIENCE IN EDITING. A NULL STATEMENT WOULD THEN EXIST, AND THE COMPILER WOULD ACCEPT IT. NULL STATEMENTS HAVE SEVERAL USES; WHILE TIME < 3.15 DO; /*LOOP HERE UNTIL THE RIGHT TIME*/ GOTO 99; . . 99:END. /*UNCONDITIONAL EXIT FROM A PROGRAM*/ PROCEDURE DITHER; BEGIN END; /*STUB FOR USE IN THE INTERMEDIATE STAGES OF PROGRAM DEVELOPMENT*/ BUILT-IN FUNCTIONS AND PROCEDURES THIS SECTION DESCRIBES THOSE FUNCTIONS AND PROCEDURES WHICH ARE BUILT INTO PASCAL AND MAY BE USED IN ANY PROGRAM WITHOUT FURTHER DEFINITION. THE REAL-VALUED FUNCTIONS SIN, COS, ARCTAN, LN, LOG, EXP, EXP10, SQRT, SQR, *, /, +, - HAVE A WORST CASE RELATIVE ACCURACY OF 0.000001, OR PLUS OR MINUS ONE UNIT IN THE LAST DECIMAL PLACE. ALL OTHER FUNCTIONS ARE EXACT. THE ERRORS ARE THOSE WHICH CAN OCCUR AT RUN-TIME. THEY ARE LISTED ALPHABETICALLY IN ANOTHER SECTION OF THE APPENDIX. THE TIMES GIVEN HAVE BEEN MEASURED ON A PDP-11/05 WITHOUT EIS OR FIS HARDWARE. THEY ARE THUS THE SLOWEST POSSIBLE. A PDP 11/04 IS ABOUT 10 PERCENT FASTER. PRESENCE OF THE EIS AND FIS HARDWARE WILL SPEED THESE UP CONSIDERABLY. "SHORT" MEANS THAT THE OPERATION ONLY TAKES A FEW MACHINE INSTRUCTIONS. IN PASCAL, ANY PLACE WHERE THE SYNTAX ALLOWS A REAL OPERAND, AN INTEGER MAY ALSO BE USED. AN AUTOMATIC "FLOAT" WILL BE APPLIED TO IT. MATH FUNCTIONS: (PREFIX NOTATION) SIN, COS, ARCTAN, LOG, LN, EXP, EXP10, TRUNC, ROUND, ORD, CHR, FLOAT, SUCC, PRED, SQRT, SQR, ODD, ABS, (INFIX NOTATION) AND, OR, NOT, IN, DIV, MOD, +, -, *, /, >, <, =, #, >=, <= INPUT/OUTPUT PROCEDURES: READ, READLN, WRITE, WRITELN, PUT, GET, RESET, REWRITE, CLOSE INPUT/OUTPUT FUNCTIONS: EOF, EOLN OTHER PROCEDURES: NEW, DISPOSE OTHER FUNCTIONS: TIME SIN THE ARGUMENT IS A REAL NUMBER REPRESENTING AN ANGLE IN RADIANS. THE RESULT IS A REAL NUMBER REPRESENTING THE SINE OF THAT ANGLE. TIME: ABOUT 12 MSEC. ALGORITHM: FUNCTION SIN(X:REAL):REAL; CONST C1=1.5707963; C3=-0.645963711; C5=0.079689679; C7=-0.0046737655; C9=0.00015148419; VAR B,S,C:REAL; I:INTEGER; BEGIN IF ABS(X)>32767.0 THEN SIN:=0.0 ELSE IF ABS(X)<0.000244 THEN SIN:=X ELSE BEGIN B:=X/C1; I:=ABS(TRUNC(B)); IF ODD(I) THEN I:=I+1; C:=ABS(B)-I; IF B<0.0 THEN C:=-C; IF(I MOD 4)=2 THEN C:=-C; S:=C*C; SIN:=C*(C1+S*(C3+S*(C5+S*(C7+S*C9)))) END END; COS TAKES A REAL ARGUMENT REPRESENTING AN ANGLE IN RADIANS. RETURNS THE COSINE OF THAT ANGLE. TIME, ABOUT 12 MSEC. ALGORITHM: COS(X) = SIN(PI/2 + X) ARCTAN THE ARGUMENT IS A REAL. THE RESULT IS A REAL NUMBER REPRESENTING THE ANGLE BETWEEN -PI/2 AND PI/2 HAVING THAT TANGENT. TIME, 11.5 TO 14.6 MSEC. ALGORITHM: FUNCTION ARCTAN(X:REAL):REAL; CONST HALFPI=1.5707963; B0=0.17465544; B1=6.762139; B2=3.3163354; B3=1.44863154; A1=3.7092563; A2=-7.10676; A3=-0.26476862; VAR S:REAL; MINUS,CONV:BOOLEAN; BEGIN IF ABS(X)>1.0 THEN BEGIN CONV:=TRUE; X:=1/X; END ELSE CONV:=FALSE; IF X<0.0 THEN BEGIN MINUS:=TRUE;X:=-X END ELSE MINUS :=FALSE; S:=X*X; S:=X*(B0+A1/(S+B1+A2/(S+B2+A3/(S+B3)))); IF CONV THEN S:=HALFPI-S; IF MINUS THEN S:=-S; ARCTAN:=S END; LOG AND LN THE ARGUMENT IS A REAL. THE RESULT IS A REAL EQUAL TO THE NATURAL (BASE E) LOGARITHM FOR THE "LN" FUNCTION, OR THE COMMON (BASE 10) LOGARITHM FOR THE "LOG" FUNCTION. THE "LOG" FUNCTION IS NOT DEFINED IN THE PASCAL REPORT. TIME, ABOUT 14.5 MSEC ALGORITHM: FUNCTION LOG2(X:REAL):REAL; CONST C1=2.88539129; C3=0.961470632; C5=0.598978649; HALFSQRT2=0.707106781; VAR S,Z:REAL; VAR I:INTEGER; VAR H:RECORD CASE INTEGER OF 1:(HI,LO:INTEGER); 2:(RE:REAL) END; BEGIN H.RE:=X; I:=(H.HI-40000B)*2 DIV 256; H.HI:=(H.HI AND 100177B)+40000B; X:=H.RE; Z:=(X-HALFSQRT2)/(X+HALFSQRT2); S:=Z*Z; LOG2:=-0.5+Z*(C1 + S*(C3 + S*C5))+I END; FUNCTION LN(X:REAL):REAL; CONST LN2=0.693147181; BEGIN IF X<=0.0 THEN BEGIN WRITELN('LOG OF 0 OR -'); /*TERMINATE THE PROGRAM*/ END ELSE LN:=LN2*LOG2(X) END; FUNCTION LOG(X:REAL):REAL; CONST LOG10OF2=0.30102999; BEGIN IF X<=0.0 THEN BEGIN WRITELN('LOG OF 0 OR -'); /* TERMINATE THE PROGRAM*/ END ELSE LOG:=LOG10OF2*LOG2(X) END; EXP THE ARGUMENT IS A REAL. THE RESULT IS E (2.718281828) RAISED TO THAT POWER. TIME, ABOUT 12.5 MSEC. ALGORITHM: FUNCTION EXP(X:REAL):REAL; CONST LOG2E=1.442695041; LN2DV2=0.34657359; A0=12.015016; A1=-601.80427; B1=60.090191; VAR H:RECORD CASE INTEGER OF 1:(HI,LO:INTEGER); 2:(RE:REAL) END; Z,R,Y:REAL; W:INTEGER; BEGIN IF X>=88.0 THEN BEGIN WRITELN('EXP OFL'); /*TERMINATE THE PROGRAM*/ END; IF X<=-88.0 THEN EXP:=0.0 ELSE BEGIN Z:=X*LOG2E; W:=TRUNC(Z); R:=Z-W; Y:=R*LN2DV2; H.RE:=SQR(1.0+2.0*Y/(A0-Y+A1/(B1+Y*Y))); H.HI:=H.HI+W*128; EXP:=H.RE END END; EXP10 THE ARGUMENT IS A REAL. THE RESULT IS 10.0 RAISED TO THAT POWER. THIS FUNCTION IS NOT DEFINED IN STANDARD PASCAL. TIME, ABOUT 15 MSEC. ALGORITHM: EXP10(X) = EXP(X * LN(10)) SQR THE ARGUMENT IS A REAL OR INTEGER. THE RESULT IS A NUMBER OF THE SAME TYPE EQUAL TO THE SQUARE OF THE ARGUMENT. TIME, .53 TO .66 MSEC FOR INTEGERS 1.25 TO 1.65 MSEC FOR REALS ALGORITHM FUNCTION SQR(X:REAL):REAL; BEGIN SQR:=X*X END; OR, FOR INTEGER ARGUMENTS; FUNCTION SQR(X:INTEGER):INTEGER; BEGIN SQR:=X*X END; SQRT THE ARGUMENT IS REAL. THE RESULT IS A REAL EQUAL TO THE SQUARE ROOT OF THE ARGUMENT. TIME, ABOUT 5 MSEC ALGORITHM: FUNCTION SQRT(X:REAL):REAL; VAR H:RECORD CASE INTEGER OF 1:(HI,LO:INTEGER); 2:(RE:REAL) END; I:INTEGER; BEGIN IF X<0.0 THEN BEGIN WRITELN('SQRT OF -'); /*TERMINATE THE PROGRAM*/ END ELSE BEGIN H.RE:=X; H.HI:=(H.HI DIV 2)+20100B; /*INITIAL APPROXIMATION*/ FOR I:=1 TO 3 DO H.RE:=(X/H.RE+H.RE)/2.0; SQRT:=H.RE END END; FLOAT THE ARGUMENT IS AN INTEGER. THE RESULT IS A REAL NUMBER REPRESENTING THE SAME VALUE. "FLOAT" IS IMPLICIT IN STANDARD PASCAL BUT NOT AVAILABLE EXPLICITLY. TIME, .33 TO .71 MSEC TRUNC THE ARGUMENT IS A REAL NUMBER. THE RESULT IS AN INTEGER REPRESENTING THE SAME VALUE. THE FRACTIONAL PART IS DISCARDED. TIME, .25 TO .41 MSEC ALGORITHM: IF ABS(X) >= 2^15 THEN PRINT "TRUNC OFL" AND EXIT TO THE MONITOR. IF X >= 0.0 THEN TRUNC(X) := [X] IF X < 0.0 THEN TRUNC(X) := -[ABS(X)] EX. EXPRESSION VALUE TRUNC(3.5) 3 TRUNC(-3.5) -3 ROUND THE ARGUMENT IS REAL. THE RESULT IS AN INTEGER EQUAL TO THE REAL ROUNDED TO THE NEAREST WHOLE NUMBER. TIME, .25 TO .41 MSEC ALGORITHM: IF X >= 0.0 THEN ROUND(X) := TRUNC(X + 0.5) IF X < 0.0 THEN ROUND(X) := TRUNC(X - 0.5) ABS THE ARGUMENT IS REAL OR INTEGER. THE RESULT IS OF THE SAME TYPE AND IS EQUAL TO THE MAGNITUDE OF THE NUMBER. THAT IS, THE SIGN IS MADE POSITIVE. TIME, SHORT EX. EXPRESSION VALUE ABS(3.2) 3.2 ABS(-3.2) 3.2 ABS(-4) 4 ODD THE ARGUMENT IS AN INTEGER. THE RESULT IS A BOOLEAN VALUE; TRUE IF X IS ODD , FALSE IF X IS EVEN (EVENLY DIVISIBLE BY 2). TIME, SHORT EX. EXPRESSION VALUE ODD(3) TRUE ODD(0) FALSE ODD(-5) TRUE ORD THE ARGUMENT IS ANY SCALAR TYPE (I.E. NOT REAL). THE RESULT IS AN INTEGER EQUAL TO THE ORDINAL OF THE ARGUMENT IN THE NATURAL ORDERING OF THAT TYPE. TIME, 0 EX. EXPRESSION VALUE ORD('A') 65 (THE DECIMAL ASCII VALUE OF A) ORD(FALSE) 0 (TYPE BOOLEAN IS (FALSE,TRUE)) ORD(5) 5 ORD(MONDAY) 1 WHERE "MONDAY" IS PART OF THE DEFINED SCALAR (SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY) CHR THE ARGUMENT IS AN INTEGER. THE RESULT IS THE CHARACTER HAVING THAT ASCII VALUE. THIS IS THE INVERSE OF THE ORD FUNCTION FOR CHARACTERS. TIME, 0 SUCC THE ARGUMENT IS ANY SCALAR TYPE (NOT REAL). THE RESULT IS OF THE SAME TYPE AND IS THE SUCCESSOR OF THE ARGUMENT IN THE NATURAL ORDERING OF THE TYPE. THERE ARE NO ERRORS, AND OVERFLOW IS NOT CHECKED. TIME, SHORT EX. EXPRESSION VALUE SUCC(3) 4 SUCC(-5) -4 SUCC('A') 'B' SUCC(FALSE) TRUE SUCC(5 DIV 2) 3 SUCC(TRUE) IS NOT DEFINED PRED THE INVERSE OF SUCC. EX. EXPRESSION VALUE PRED(1) 0 PRED('Z') 'Y' + (ADDITION) - (SUBTRACTION) + AND - MAY BE USED BETWEEN INTEGERS, REALS AND SETS. INTEGER + INTEGER. (INTEGER - INTEGER). THE RESULT IS AN INTEGER WHICH IS THE SUM (DIFFERENCE) OF THE TWO VALUES. TIME, SHORT. NO ERRORS ARE REPORTED, BUT IF THE MAGNITUDE OF THE RESULT IS GREATER THAN 32767 OR LESS THAN -32767, THE RESULT WILL OVERFLOW. REAL + REAL. (REAL - REAL). THE RESULT IS A REAL WHICH IS THE SUM (DIFFERENCE) OF THE TWO VALUES. TIME, .61 TO .95 MSEC. IF THE MAGNITUDE OF THE RESULT IS GREATER THAN 1.7014117E+38 IT IS AN OVERFLOW. IF LESS THAN 2.9387359E-39 IT IS AN UNDERFLOW. IN EITHER CASE THE SYSTEM WILL PRINT "?M-FP TRAP" AND EXIT TO THE MONITOR. SET + SET. (SET - SET). THE TWO SETS MUST BE DEFINED OVER THE SAME BASE. THE RESULT OF THE SUM IS A SET WHICH IS THE UNION OF THE TWO ARGUMENTS. THE RESULT OF THE DIFFERENCE IS A SET CONTAINING THOSE ELEMENTS WHICH ARE IN THE FIRST SET BUT NOT THE SECOND. TIME, .27 MSEC. * (MULTIPLICATION) THIS OPERATOR MAY BE USED BETWEEN INTEGERS, REALS OR SETS. INTEGER * INTEGER THE RESULT IS AN INTEGER WHICH IS THE PRODUCT OF THE TWO ARGUMENTS. TIME, .53 TO .66 MSEC IF THE MAGNITUDE OF THE RESULT IS GREATER THAN 32767 THE SYSTEM WILL PRINT "EIS OFL" AND EXIT TO THE MONITOR. IF ONE OF THE FACTORS IS A CONSTANT WHICH IS A POWER OF 2, THE COMPILER WILL NOT CAUSE AN ACTUAL MULTIPLY BUT WILL GENERATE LEFT SHIFTS TO SPEED UP THE OPERATION. REAL * REAL. THE RESULT IS A REAL WHICH IS THE PRODUCT OF THE TWO ARGUMENTS. TIME 1.25 TO 1.65 MSEC. OVERFLOW AND UNDERFLOW ARE HANDLED AS FOR REAL ADDITION. SET * SET. THE SETS MUST BE DEFINED OVER THE SAME BASE. THE RESULT IS A SET WHICH IS THE INTERSECTION OF THE TWO ARGUMENTS. TIME, .29 MSEC. / (DIVISION) THE RESULT OF THIS OPERATION IS ALWAYS A REAL. (FOR INTEGER DIVISION SEE "DIV"). IT MAY BE APPLIED BETWEEN INTEGERS OR REALS. INTEGER / INTEGER. THE RESULT IS A REAL NUMBER EQUAL TO THE QUOTIENT OF THE ARGUMENTS. THE TWO INTEGERS ARE FIRST "FLOAT"ED AND THEN DIVIDED AS REALS. TIME, 2.38 TO 2.80 MSEC. IF THE SECOND ARGUMENT IS 0, THE SYSTEM WILL PRINT "?M-FP TRAP" AND EXIT TO THE MONITOR. REAL / REAL. THE RESULT IS A REAL EQUAL TO THE QUOTIENT OF THE ARGUMENTS. TIME, 1.38 TO 1.80 MSEC IF THE SECOND ARGUMENT IS 0.0 OR IF THE RESULT OVERFLOWS OR UNDERFLOWS, THE SYSTEM WILL PRINT "?M-FP TRAP" AND EXIT TO THE MONITOR. DIV (INTEGER DIVISION) THIS OPERATION IS APPLIED ONLY BETWEEN INTEGERS. THE RESULT IS AN INTEGER EQUAL TO THE QUOTIENT OF THE ARGUMENTS WITH THE FRACTIONAL PART DISCARDED. THE RESULT IS COMPUTED SO THAT THE REMAINDER IS THE SAME SIGN AS THE DIVIDEND. TIME, 1.15 MSEC. IF THE DIVISOR IS 0, THE SYSTEM WILL PRINT "EIS OFL" AND EXIT TO THE MONITOR. EX. EXPRESSION VALUE 5 DIV 3 1 5 DIV -3 -1 -5 DIV 3 -1 -5 DIV -3 1 DIVISION BY A CONSTANT WHICH IS A POWER OF 2 WILL BE CHANGED BY THE COMPILER INTO A RIGHT SHIFT TO SPEED UP EXECUTION. MOD (MODULO) THIS OPERATION IS APPLIED BETWEEN INTEGERS. THE RESULT IS AN INTEGER EQUAL TO THE REMAINDER AFTER DIVIDING THE ARGUMENTS. THE REMAINDER IS THE SAME SIGN AS THE DIVIDEND. NOTE THAT THIS IS A REMAINDER FUNCTION, NOT A TRUE MODULUS FUNCTION, WHICH WOULD RETURN ONLY POSITIVE VALUES. BE CAREFUL WHEN WRITING CASE A MOD N OF ..... TIME, 1.15 MSEC IF THE SECOND ARGUMENT IS 0, THE SYSTEM WILL PRINT "EIS OFL" AND EXIT TO THE MONITOR. EX. EXPRESSION VALUE 5 MOD 3 2 5 MOD -3 2 -5 MOD 3 -2 -5 MOD -3 -2 "....MOD 0" IS AN ATTEMPT TO DIVIDE BY 0 AND WILL CAUSE THE SAME SYSTEM ACTION AS DESCRIBED ABOVE. MOD BY A CONSTANT WHICH IS A POWER OF 2 WILL BE CHANGED BY THE COMPILER INTO A BIT CLEAR TO SPEED UP EXECUTION. AND THIS MAY BE USED BETWEEN BOOLEANS OR INTEGERS. THE USE WITH INTEGERS IS NOT DEFINED IN STANDARD PASCAL. THE SYMBOL "&" MAY BE USED IN PLACE OF THE WORD "AND". BOOLEAN AND BOOLEAN. THE RESULT IS A BOOLEAN VALUE EQUAL TO THE LOGICAL AND OF THE ARGUMENTS. TIME, SHORT EX. EXPRESSION VALUE TRUE AND TRUE TRUE TRUE AND FALSE FALSE FALSE AND TRUE FALSE FALSE AND FALSE FALSE (3>5) AND ('A'<'B') FALSE INTEGER AND INTEGER. THE RESULT IS AN INTEGER GOTTEN BY TAKING THE ARGUMENTS AS 16 BIT WORDS AND "AND"ING THEM BIT BY BIT. TIME, SHORT EX. EXPRESSION VALUE 1 AND 1 1 0 AND 1 0 16 AND 24 16 (SAME AS 20B AND 30B = 20B) OR MAY BE USED BETWEEN BOOLEANS OR INTEGERS. THE USE WITH INTEGERS IS NOT DEFINED IN STANDARD PASCAL. THE SYMBOL "!" MAY BE USED IN PLACE OF THE WORD "OR". BOOLEAN OR BOOLEAN THE RESULT IS THE LOGICAL OR OF THE ARGUMENTS. EX. EXPRESSION VALUE TRUE OR TRUE TRUE TRUE OR FALSE TRUE FALSE OR TRUE TRUE FALSE OR FALSE FALSE (3>5) OR ('A'<'B') TRUE INTEGER OR INTEGER THE RESULT IS AN INTEGER. THE ARGUMENTS ARE TAKEN AS 16 BIT WORDS AND "OR"ED BIT BY BIT. EX. EXPRESSION VALUE 1 OR 0 1 16 OR 24 24 -1 OR 13 -1 (SAME AS 177777B OR 15B = 177777B) NOT THIS MAY BE USED WITH BOOLEANS OR WITH INTEGERS. THE USE WITH INTEGERS IS NOT DEFINED IN STANDARD PASCAL. FOR BOOLEANS, THE RESULT IS A BOOLEAN WHICH IS THE LOGICAL NEGATION OF THE ARGUMENT. FOR INTEGERS, THE RESULT IS AN INTEGER WHICH IS THE BIT-BY-BIT COMPLEMENT OF THE ARGUMENT. EX. EXPRESSION VALUE NOT TRUE FALSE NOT FALSE TRUE NOT (3>5) TRUE NOT 1 -2 IN THE ARGUMENT ON THE RIGHT IS A SET. THE ARGUMENT ON THE LEFT IS A MEMBER OF THE BASE TYPE OF THAT SET. THE RESULT IS A BOOLEAN INDICATING BY "TRUE" THAT THE ELEMENT IS IN THE SET, AND BY "FALSE" THAT IT IS NOT IN THE SET. TIME, .26 TO .31 MSEC. EX. EXPRESSION VALUE 1 IN [1..5,10,20] TRUE 5 IN [] FALSE COMPARISONS = EQUALITY # INEQUALITY (THIS SYMBOL NOT DEFINED IN STANDARD PASCAL) <> INEQUALITY > GREATER THAN < LESS THAN <= GREATER THAN OR EQUAL >= LESS THAN OR EQUAL THESE OPERATORS MAY BE USED BETWEEN INTEGERS, REALS, BOOLEANS, CHARACTERS, SETS OR ARRAYS OF CHARACTERS. THE RESULT IS ALWAYS BOOLEAN AND INDICATES THE RELATION OF THE ARGUMENTS IN THE ORDERING OF THEIR TYPE. INTEGER COMPARISON THE ARGUMENTS ARE TAKEN AS SIGNED, TWO'S COMPLEMENT NUMBERS AND COMPARED. TIME, SHORT EX. EXPRESSION VALUE 1 > 2 FALSE -50 <= 100 TRUE 0 # 0 FALSE REAL COMPARISON TIME, .11 TO .15 MSEC EX. EXPRESSION VALUE 1.0 =1.000001 FALSE 50.3 > -17.43 TRUE SET COMPARISONS THE CONTENTS OF THE TWO SETS ARE COMPARED AND A BOOLEAN RESULT RETURNED. < AND > (STRICT INCLUSION) ARE NOT ALLOWED WITH SETS. TIME, .21 MSEC ALGORITHM, SET = SET TRUE IF AND ONLY IF THE SETS ARE IDENTICAL SET # SET TRUE IFF THE SETS ARE NOT IDENTICAL SET <= SET TRUE IFF EVERY MEMBER OF THE SET ON THE LEFT IS ALSO A MEMBER OF THE SET ON THE RIGHT SET >= SET SAME AS <= BUT WITH THE SENSE REVERSED. EX. EXPRESSION VALUE [3,5] = [5,3] TRUE [] <= [1,2,3] TRUE [1,2] <= [1,3,5] FALSE BOOLEAN COMPARISONS THE TWO BOOLEAN VALUES ARE TAKEN TO BE IN THIS ORDER, (FALSE,TRUE). TIME, SHORT EX. EXPRESSION VALUE FALSE = FALSE TRUE TRUE <= FALSE FALSE (3>5) < ('A'<'B') TRUE CHARACTER ARRAY COMPARISONS THE TWO ARRAYS MUST HAVE THE SAME LENGTH. THE COMPARISON BEGINS WITH THE LEFTMOST MEMBER OF EACH ARRAY AND CONTINUES UNTIL THE FIRST MISMATCH IS FOUND. THE SENSE OF THE COMPARISON IS SET ACCORDING TO THE ASCII ORDERING OF THE CHARACTERS. TIME, .033 TO .200 MSEC FOR ARRAYS OF LENGTH 10, DEPENDING ON HOW MANY CHARACTERS MUST BE SCANNED TO FIND THE FIRST MISMATCH. EX. EXPRESSION VALUE 'AND ' < 'ANDY ' TRUE 'AND ' < 'BUT ' TRUE '97 ' < 'AND ' TRUE '97 ' < '973 ' TRUE '893 ' < '97 ' TRUE INPUT/OUTPUT PROCEDURES AND FUNCTIONS. "READ", "READLN", "WRITE", AND "WRITELN" ARE THE ONLY PROCEDURES IN PASCAL FOR WHICH THE NUMBER OF ARGUMENTS IS NOT FIXED. THESE (WOCEDURES PLUS "RESET", "REWRITE" AND "CLOSE" ARE DIFFERENT FROM THOSE IN STANDARD PASCAL. WRITE. "WRITE" CONVERTS THE VALUE OF EACH OF ITS PARAMETERS TO A STRING OF CHARACTERS AND WRITES THAT STRING AT THE SYSTEM TERMINAL. THE ACTION TAKEN FOR EACH PARAMETER DEPENDS ON THE DATA TYPE OF THAT PARAMETER. "WRITE" PARAMETERS MAY BE EXPRESSIONS OF TYPE INTEGER, REAL, BOOLEAN, CHARACTER OR CHARACTER ARRAY. WRITE(A,B,C,D) IS EQUIVALENT TO; WRITE(A); WRITE(B); WRITE(C); WRITE(D) WRITE INTEGER WRITE(I) WRITE(I:J) I IS AN INTEGER EXPRESSION WHOSE VALUE WILL BE WRITTEN. J IS AN OPTIONAL INTEGER EXPRESSION WHOSE VALUE SETS THE FORMAT FOR I. AT LEAST J CHARACTERS WILL BE WRITTEN. IF J IS NOT GIVEN, OR IS 0, A VALUE OF 13 IS ASSUMED. LEADING SPACES WILL BE INSERTED IF THE NUMBER OF CHARACTERS IN I IS LESS THEN THE VALUE OF J. I WILL ALWAYS BE WRITTEN IN FULL, EVEN IF IT TAKES MORE THAN J CHARACTERS. IF J IS NEGATIVE, I WILL BE WRITTEN AS AN UNSIGNED OCTAL NUMBER, RATHER THAN A DECIMAL NUMBER. THE ABSOLUTE VALUE OF J SETS THE FORMAT, AS ABOVE. A LETTER "B" FOLLOWS THE NUMBER TO INDICATE THAT IT IS OCTAL. THIS FEATURE IS NOT DEFINED IN STANDARD PASCAL. EX. STATEMENT RESULT WRITE(3,5) 3 5 WRITE(-238) -238 WRITE(1537:1) 1537 WRITE(27:4,53:1) 2753 WRITE(TRUNC(2*3.14159):3+2) 6 WRITE(-3:-20) 177775B WRITE(ORD('A'):-5) 101B WRITE REAL WRITE(R) WRITE(R:J) WRITE(R:J:K) R IS A REAL EXPRESSION WHOSE VALUE WILL BE CONVERTED TO A STRING OF CHARACTERS AND WRITTEN. J IS AN OPTIONAL INTEGER EXPRESSION WHICH SETS THE FORMAT FOR R. AS FOR WRITE(INTEGER), J IS THE MINIMUM FIELD WIDTH. IF NOT SPECIFIED, A VALUE OF 13 IS ASSUMED. AT LEAST ONE LEADING SPACE OR MINUS SIGN IS ALWAYS WRITTEN. K IS AN OPTIONAL INTEGER EXPRESSION. IF GIVEN, R IS WRITTEN IN FIXED POINT FORM, WITH K DIGITS TO THE RIGHT OF THE DECIMAL POINT. R IS ROUNDED OFF TO THE LAST PLACE SHOWN. IF K IS NOT SPECIFIED, OR IS MINUS, R IS SHOWN IN FLOATING POINT FORM. EX. STATEMENT RESULT WRITE(1.5) 1.500000E+00 WRITE(1.5:6:2) 1.50 WRITE(1.55:6:1) 1.6 WRITE(1.537:15,2.5:1:1) 1.537000E+00 2.5 WRITE BOOLEAN WRITE(B) WRITE(B:I) B IS A BOOLEAN EXPRESSION. DEPENDING ON ITS VALUE, ONE OF THE CHARACTER STRINGS " TRUE" OR " FALSE" WILL BE WRITTEN. I IS AN OPTIONAL INTEGER EXPRESSION THAT SETS THE MINIMUM FIELD WIDTH. IF I IS NOT GIVEN, A VALUE OF 6 IS ASSUMED. EX. EXPRESSION RESULT WRITE(TRUE) TRUE WRITE(3>5) FALSE WRITE(A=B:10) FALSE WRITE CHARACTER WRITE(CH) WRITE(CH:J) CH IS AN EXPRESSION OF TYPE CHARACTER. ITS VALUE AS A CHARACTER WILL BE WRITTEN. J IS AN OPTIONAL INTEGER EXPRESSION WHOSE VALUE SETS THE FORMAT FOR CH. AT LEAST ONE CHARACTER (CH) WILL BE WRITTEN PRECEDED BY BLANKS TO MAKE A TOTAL OF J CHARACTERS. IF J IS NOT GIVEN OR IS MINUS, A VALUE OF 1 IS ASSUMED. EX. STATEMENT RESULT WRITE('A') A WRITE(CHR(100B):6) @ CCC:='NOW IS THE TIME'; WRITE(CCC[3]) W WRITE CHARACTER ARRAY WRITE(CC) WRITE(CC:J) CC IS A CHARACTER ARRAY WHICH IS TO BE WRITTEN. IT MAY BE AN ARRAY OF ANY SIZE. J IS AN OPTIONAL INTEGER EXPRESSION WHOSE VALUE SETS THE FORMAT. THE ENTIRE ARRAY WILL ALWAYS BE WRITTEN, WITH LEADING BLANKS INSERTED TO COMPLETE THE FIELD IF J IS GREATER THAN THE LENGTH OF CC. IF J IS NOT GIVEN OR IS MINUS, A VALUE OF 0 IS ASSUMED. EX. STATEMENT RESULT POSITION: 1234567890 WRITE('HELLO') HELLO WRITE('HELLO':10) HELLO CC:='TREPADATION'; CC[5]:='I'; WRITE(CC) TREPIDATION WRITELN WRITELN CALLS THE SAME SET OF PROCEDURES AS WRITE, BUT ALSO APPENDS A CARRIAGE RETURN AND LINE FEED AFTER ALL THE ARGUMENTS HAVE BEEN WRITTEN. WRITELN(A,B,C) IS EQUIVALENT TO; WRITE(A); WRITE(B); WRITE(C); WRITELN AND WRITELN IS EQUIVALENT TO; WRITE(CHR(15B),CHR(12B)) EX. STATEMENT RESULT WRITE(3:3,4:3); WRITE(5:3,6:3) 3 4 5 6 WRITELN(3:3,4:3); WRITELN(5:3,6:3) 3 4 5 6 READ. READ(A,B,C,D) IS EQUIVALENT TO; READ(A); READ(B); READ(C); READ(D) READ TAKES IN CHARACTERS IN SUCCESSION (AUTOMATICALLY SKIPPING NULLS (CHR(0)), INTERPRETS THEM ACCORDING TO THE TYPE OF THE PARAMETER AND ASSIGNS A VALUE TO THE PARAMETER. PARAMETERS IN ALL READ PROCEDURES MUST BE SIMPLE VARIABLES OF TYPE INTEGER, REAL, CHARACTER OR CHARACTER ARRAY. THEY MAY NOT BE CONSTANTS OR COMPLEX EXPRESSIONS. READ INTEGER. READ(I) THIS PROCEDURE WILL SKIP OVER CERTAIN CHARACTERS UNTIL IT SEES A NUMERIC DIGIT, BUILD A VALUE, STOP ON THE FIRST NON-DIGIT, AND ASSIGN THE VALUE TO I. THE CHARACTERS SKIPPED INCLUDE ALL CHARACTERS WITH AN ASCII VALUE OF 40B OR LESS (SPACE, CARRIAGE RET., LINE FEED, TAB ETC) PLUS THE COMMA AND PLUS AND MINUS SIGNS. PRESENCE OF ONE OR MORE MINUS SIGNS WILL MAKE THE VALUE OF I NEGATIVE. IF SOME OTHER CHARACTER, NOT A DIGIT AND NOT ONE OF THOSE ABOVE IS SEEN, A VALUE OF 0 WILL BE GIVEN TO I AND THE MESSAGE "BAD INTEGER" WILL BE WRITTEN AT THE TERMINAL. THE VALUE GIVEN TO I WILL BE THE VALUE OF THE DIGIT STRING TAKEN AS A DECIMAL NUMBER (MODULO 65536). NO OCTAL INPUT EXISTS. VALUES BETWEEN 32768 AND 65536 WILL BE REVERSED IN SIGN BECAUSE INTEGERS ARE REPRESENTED INTERNALLY AS 16-BIT TWOS COMPLEMENT NUMBERS. READ(I) WILL STOP WHEN THE FIRST NON-DIGIT IS ENCOUNTERED. THIS WILL BE THE FIRST CHARACTER SEEN BY THE NEXT READ PROCEDURE. EX. READ(I) INPUT STRING VALUE OF I FIRST CHAR FOR NEXT READ ,+3 3 (SPACE) -,56B -56 B -,AND 0 (BAD INTEGER) A 32769, -32767 , READ REAL READ(R) READ REAL SKIPS THE SAME LEADING CHARACTERS AS READ INTEGER, EXCEPT THAT A DECIMAL POINT IS TAKEN AS A LEGAL FIRST CHARACTER FOR A REAL NUMBER. NOTE THAT A REAL CONSTANT IN THE SOURCE OF A PASCAL PROGRAM MAY NOT START WITH A DECIMAL POINT. IF A CHARACTER IS ENCOUNTERED WHICH IS NOT TO BE SKIPPED, IS NOT A DIGIT OR A DECIMAL POINT THEN THE MESSAGE "BAD REAL" IS WRITTEN AT LO BITS AND OD ARGS JMP NORM FLZER1: TST (SP)+ FLZERO: CLR R2 CLR R3 BR FPUEX ;DIVIDEND OR ONE FACTOR WAS 0 .SBTTL FLOATING ADD & SUBTRACT ;.61 - .95 MILLISECONDS $FSUB: TST R2 BEQ $FADD ADD #100000,R2 $FADD: JSR R1,FSV TST R2 ;IS IT 0? BNE 1$ MOV R4,R2 ;IF # IS 0, QUICK EXIT MOV R5,R3 BR FPUEX 1$: TST R4 ;IS IT 0? BEQ FPUEX MOV R2,R0 ;COPY AND TEST BIC #177600,R2 ;CLEAR EXP & SIGN BIS #200,R2 ;SET HIDDEN BIT TST R0 ;SEE IF IT IS NEGATIVE BPL 2$ NEG R3 ;SPACE) 45000000000000000.2 4.5E+16 (SPACE) IF THE CHARACTERS READ REPRESENT A NUMBER THAT IS TOO LARGE (>1.7014117E+38) OR TOO SMALL (<2.9387359E-39) IN MAGNITUDE, THEN A VALUE OF 0.0 WILL BE RETURNED, AND THE SYSTEM WILL PRINT "BAD REAL" AT THE TERMINAL. READ CHARACTER READ(CH) READ CHAR SIMPLY TAKES IN THE NEXT CHARACTER AND ASSIGNS IT TO CH. THE ONLY EXCEPTIONS ARE THAT NULLS AND CARRIAGE RETURNS ARE SKIPPED. IN STANDARD PASCAL A LINE FEED IS CHANGED TO A BLANK, BUT IN THIS VERSION IT IS NOT CHANGED. READ CHARACTER ARRAY READ(CC) THIS PROCEDURE IS NOT DEFINED IN STANDARD PASCAL. READ CHARACTER ARRAY SKIPS OVER LEADING COMMAS AND ALL CHARACTERS WITH AN ASCII VALUE OF 40B OR LESS. THE FIRST CHARACTER NOT TO BE SKIPPED IS ASSIGNED TO THE FIRST (SMALLEST INDEXED) ELEMENT OF THE ARRAY CC. THE NEXT CHARACTER IS ASSIGNED TO THE NEXT ELEMENT AND SO FORTH. THIS FILLING STOPS WHEN EITHER THE ARRAY IS FILLED OR A COMMA OR ASCII VALUE OF 40B OR LESS IS READ. IF THE ARRAY IS FILLED FIRST, THEN THE PROCEDURE CONTINUES TO READ AND DISCARD CHARACTERS UNTIL FINDING ONE WHICH IS A COMMA OR HAS AN ASCII VALUE <= 40B. IF SUCH A TERMINATOR IS HIT BEFORE THE ARRAY IS FILLED, THEN THE PROCEDURE FILLS THE REMAINDER OF THE ARRAY WITH SPACES. EX. ASSUME VAR CC:ARRAY[1..5] OF CHAR; READ(CC) INPUT STRING VALUE OF CC NEXT CHAR READ 12345678 12345 (SPACE) ,HELLO, HELLO , ,, TWO TWO (SPACE) READLN. READLN IS IDENTICAL TO READ EXCEPT THAT AFTER READING THE INPUT CHARACTERS AND ASSIGNING VALUES TO ALL THE PARAMETERS, IT CONTINUES TO READ AND DISCARD CHARACTERS UNTIL IT FINDS A LINE FEED. IT THEN STOPS. THE FIRST CHARACTER SEEN BY THE NEXT READ WILL BE THE CHARACTER FOLLOWING THE LINE FEED. EX. ASSUME READLN(R,S) INPUT VALUES OF R S NEXT CHAR READ 3.0(CR)(LF)2.0(CR)(LF)1.0 3.0 2.0 1 3.0 2.0 1.0(CR)(LF)7.5 3.0 2.0 7 ..PART II.. IN THE PREVIOUS EXAMPLES ALL INPUT CAME FROM THE SYSTEM TERMINAL AND ALL OUTPUT WENT THERE. IT IS POSSIBLE TO DIRECT I/O TO OR FROM ANY DEVICE OR FILE RECOGNIZED BY THE OPERATING SYSTEM, FOR EXAMPLE A FILE ON A DISC, A LINE PRINTER, OR A PAPER TAPE READER-PUNCH. THIS IS DONE USING THE SAME READ AND WRITE PROCEDURES DESCRIBED ABOVE, BUT CALLING THEM WITH A FILE VARIABLE AS THE FIRST PARAMETER IN THE LIST. A FILE VARIABLE, LIKE ANY OTHER NAME, MUST BE DECLARED. EXAMPLE: VAR F:FILE OF CHAR; OR EQUIVALENTLY, VAR F:TEXT; THE PURPOSE OF THE FILE VARIABLE IS TO POINT INTO AN ACTUAL PHYSICAL FILE AT THE PLACE WHERE THE NEXT CHARACTER WILL BE READ OR WRITTEN, (OR THE NEXT ELEMENT, FOR GET AND PUT). THUS, BEFORE ANY INFORMATION CAN BE TRANSFERRED, THE FILE VARIABLE MUST BE ASSOCIATED WITH AN ACTUAL FILE. THIS IS DONE BY THE "RESET" AND "REWRITE" PROCEDURES. THIS IS COMMONLY CALLED "OPENING" THE FILE. A TOTAL OF 15 FILES MAY BE OPEN AT ONE TIME FOR INPUT AND OUTPUT. EACH SUCCESSFUL EXECUTION OF RESET OR REWRITE CAUSES A 512 BYTE BUFFER TO BE ALLOCATED. THIS SPACE IS FREED WHEN THE FILE IS CLOSED. RESET. RESET(F,FNAME,FEXT,I) RESET(F,FNAME,FEXT) RESET(F,FNAME,,I) RESET(F,FNAME) RESET(F) RESET OPENS A FILE FOR INPUT, SO THAT ONE CAN READ INFORMATION. F IS A FILE VARIABLE, FNAME AND FEXT ARE CHARACTER ARRAY VARIABLES OR CONSTANTS. I IS A SIMPLE INTEGER VARIABLE. THE OPERATING SYSTEM SEEKS THE ACTUAL FILE GIVEN IN FNAME AND ASSOCIATES F WITH IT SO THAT THE FIRST CHARACTER IN THE FILE IS AVAILABLE FOR A READ, OR A GET. FNAME MUST BE IN THE STANDARD OPERATING SYSTEM FORMAT, AN OPTIONAL DEVICE NAME, THE FILE NAME, AND AN OPTIONAL EXTENSION. IF THE DEVICE NAME IS NOT GIVEN, "DK:" IS ASSUMED. IF THE EXTENSION IS NOT GIVEN ".DAT" IS ASSUMED. THE OPTIONAL THIRD ARGUMENT, FEXT, IS THE DEFAULT EXTENSION, WHICH, IF SPECIFIED, WILL BE USED IN PLACE OF ".DAT". I IS AN OPTIONAL ARGUMENT WHOSE VALUE WILL BE SET TO THE LENGTH OF THE FILE IN BLOCKS, IF IT IS CONTAINED ON A DIRECTORY DEVICE. EX. RESET(F,'FT') SEEKS FILE FT.DAT RESET(F,'FT.PAS') SEEKS FILE FT.PAS NAME:='Q'; RESET(F,NAME,'PAS') SEEKS FILE Q.PAS NAME:='Q.TOK'; RESET(F,NAME,'PAS') SEEKS FILE Q.TOK IF THE FILE IS NOT FOUND, I WILL BE GIVEN A VALUE OF -1. IF A READ IS ATTEMPTED WITH A FILE VARIABLE THAT HAS NOT BEEN ASSOCIATED WITH AN ACTUAL FILE, "INPUT CHANNEL NOT OPEN" WILL BE WRITTEN AT THE TERMINAL,AND THE PROGRAM WILL TERMINATE. IF THE FILE VARIABLE IS ALREADY ASSOCIATED WITH AN ACTUAL FILE, THAT ASSOCIATION WILL BE BROKEN AND THE NEW ONE ESTABLISHED. THE FORM "RESET(F)" IS USED WHEN A FILE HAS ALREADY BEEN OPENED WITH F AND IT IS DESIRED TO SET F TO POINT BACK AT THE BEGINNING OF THE SAME FILE. IF THE FILE VARIABLE HAS MOVED TO THE END OF THE FILE, THAT IS, ALL THE INFORMATION HAS BEEN READ, THE NEXT READ WILL CAUSE THE MESSAGE "END OF FILE" TO BE WRITTEN TO THE TERMINAL. THIS IS NOT A FATAL ERROR, BUT A SPACE (ASCII 40B) WILL BE RETURNED TO THE READ ROUTINE THAT CAUSED THE MESSAGE. REWRITE. REWRITE(F,FNAME,FEXT,I) REWRITE(F,FNAME,FEXT) REWRITE(F,FNAME,,I) REWRITE(F,FNAME) REWRITE(F) REWRITE OPENS A FILE FOR OUTPUT. "F","FNAME" AND "FEXT" ARE AS DESCRIBED FOR RESET. IF THE FILE IS ON A FILE STRUCTURED DEVICE , LIKE THE SYSTEM DISC, REWRITE CAUSES THE OPERATING SYSTEM TO SET ASIDE SPACE ON THIS DEVICE AND SET F TO POINT AT THE BEGINNING OF THIS SPACE. I IS AN INTEGER VARIABLE WHICH SETS THE MAXIMUM FILE SIZE IN BLOCKS. IF I IS NOT GIVEN, OR IS 0 THE AMOUNT OF SPACE SET ASIDE IS EITHER HALF THE LARGEST CONTIGUOUS BLOCK OR ALL OF THE SECOND LARGEST CONTIGUOUS BLOCK, WHICHEVER IS GREATER. IF I IS -1, THE LARGEST AVAILABLE BLOCK WILL BE ALLOCATED. IF THERE IS NO SPACE AT ALL "NO SPACE FOR FILE" WILL BE WRITTEN TO THE TERMINAL AND THE PROGRAM WILL END. IF THERE IS SOME SPACE BUT NOT ENOUGH, THIS WILL NOT BE KNOWN UNTIL LATER WHEN A WRITE STATEMENT WILL FAIL AND "OUTPUT FILE TOO LONG" WILL BE WRITTEN. NON-FILE STRUCTURED DEVICES LIKE THE SYSTEM TERMINAL OR A LINE PRINTER CAN NEVER CAUSE THIS ERROR. IF A WRITE IS ATTEMPTED WITH A FILE VARIABLE THAT HAS NOT BEEN ASSOCIATED WITH AN ACTUAL FILE, "OUTPUT CHANNEL NOT OPEN" WILL BE WRITTEN AND THE PROGRAM WILL END. THE FORM REWRITE(F) IS USED WITH AN ALREADY OPEN OUTPUT FILE. IT RESETS THE POINTER TO THE BEGINNING, THUS EFFECTIVELY ERASING ALL THAT HAS PREVIOUSLY BEEN WRITTEN INTO THE FILE. WHEN THE REWRITE IS EXECUTED THE OPERATING SYSTEM CREATES A SO-CALLED TENTATIVE FILE, WHICH WILL CEASE TO EXIST WHEN THE PROGRAM ENDS. THE ONLY WAY TO PRESERVE THE FILE AND ITS CONTENTS IS TO CALL THE CLOSE PROCEDURE. CLOSE CLOSE(F) CLOSE ENDS THE ASSOCIATION BETWEEN A FILE VARIABLE AND AND ACTUAL FILE. THE FILE VARIABLE IS FREE TO BE USED IN ANOTHER RESET OR REWRITE. IT ALSO FREES THE BUFFER SPACE IT IS ABSOLUTELY NECESSARY TO CLOSE AN OUTPUT FILE. THIS FORCES THE CONTENTS OF THE INTERNAL BUFFER TO BE WRITTEN OUT TO THE PHYSICAL FILE, AND IT CAUSES THE INCLUSION, IN THE DEVICE DIRECTORY (IF A FILE STRUCTURED DEVICE) OF THE NAME AND SIZE OF THE NEW FILE. ANY FILE WITH THE SAME NAME IS DELETED FROM THE DEVICE. CLOSE IS NOT DEFINED IN STANDARD PASCAL. EOF. EOF(F) F IS A FILE VARIABLE. EOF IS A BOOLEAN FUNCTION WHOSE VALUE IS FALSE WHEN THE FILE IS OPENED AND BECOMES TRUE ONLY WHEN THE LAST CHARACTER HAS BEEN READ. IT IS USUALLY USED TO STOP THE PROCESSING OF DATA WHEN INPUT IS TAKEN FROM A FILE OF UNKNOWN LENGTH. EX. RESET(F,'TTT'); WHILE NOT EOF(F) DO BEGIN READ(F,I); ..... END; THE VALUE OF EOF(F) IS NOT DEFINED IF F HAS NOT BEEN ASSOCIATED WITH A FILE BY A RESET.WHEN F HAS BEEN ASSOCIATED WITH TT:, EOF WILL BE SET TRUE WHEN A CONTROL-Z IS TYPED. EOF TRUE IMPLIES EOLN IS ALSO TRUE. EOLN. EOLN(F) EOLN(F) IS A BOOLEAN FUNCTION WHOSE VALUE IS SET TRUE IF THE CHARACTER JUST READ IS THE LAST IN THE LINE, AND FALSE IF THE CHARACTER IS NOT. IT IS ALSO SET TRUE IF EOF(F) IS TRUE. EOLN (NO ARGUMENT) REFERS TO INPUT FROM THE SYSTEM TERMINAL. WHEN INPUT IS TAKEN FROM THE TERMINAL DIRECTLY A READLN, OR ANY ACTION THAT DOES THE SAME THING WILL LEAVE EOLN SET FALSE, EVEN WHEN THE NEXT LINE IS EMPTY AND IT SHOULD BE SET TRUE. THE REASON IS THAT SINCE THE TERMINAL IS AN INTERACTIVE DEVICE, THE NEXT LINE MAY NOT EXIST YET, THUS THE NECESSARY LOOKAHEAD CANNOT BE DONE. EMPTY LINES MAY BE DETECTED BY READING A SINGLE CHARACTER TO SEE WHETHER IT IS A LINE FEED. EX. I:=1; WHILE (NOT EOLN(F)) AND (I<=72) DO BEGIN READ(F,CC[I]); I:=I+1 END; READLN THIS PROGRAM SEGMENT WILL READ IN ONE LINE, CHARACTER BY CHARACTER, AND STORE IT IN CHARACTER ARRAY CC. PAGE. PAGE(F) PAGE IS A PROCEDURE WHICH OUTPUTS A FORM FEED TO THE FILE. PAGE(F) IS EQUIVALENT TO WRITE(F,CHR(14B)). PUT/GET READ AND WRITE ALWAYS CONVERT FROM AND TO CHARACTER STRINGS, RESPECTIVELY, AND THEY ONLY ACCEPT PARAMETERS OF THE FOUR BASIC TYPES. THE CONVERSION TAKES TIME. IT MAY BE DESIRABLE IN SOME CASES TO MOVE DATA TO OR FROM A FILE WITHOUT CHANGING ITS REPRESENTATION. PUT AND GET ACCOMPLISH THIS SORT OF I/O. THE FILE VARIABLE MUST BE DECLARED, NAMING THE DATA TYPE,AS: TYPE DATA:ARRAY[1..10] OF REAL; VAR F:FILE OF DATA; VAR D:DATA; THE DATA TYPE MUST BE LESS THAN 512 BYTES LONG. THE FILE IS OPENED BY RESET OR REWRITE AS USUAL. REWRITE(F,'NAME') RESET(F,'NAME') THE ACTUAL I/O OPERATION IS DONE IN TWO STEPS: FOR OUTPUT, F^ := D; PUT(F); THE FILE VARIABLE F POINTS TO A FILE LOCATION. THE VALUE OF D IS MOVED TO THAT LOCATION BY THE ASSIGNMENT. PUT THEN ADVANCES THE POINTER TO THE NEXT LOCATION. FOR INPUT, D:=F^; GET(F); /* COPY A FILE AND COUNT THE NUMBER OF "A"S IN IT*/ VAR I:INTEGER; CH:CHAR; F,G:TEXT; NAME:ALFA; BEGIN WRITE('INPUT? ');READ(NAME);RESET(F,NAME); WRITE('OUTPUT? ');READ(NAME);REWRITE(G,NAME); I:=0; WHILE NOT EOF(F) DO BEGIN WHILE NOT EOLN(F) DO BEGIN READ(F,CH); IF CH='A' THEN I:=I+1; WRITE(G,CH); END; READLN(F); WRITELN(G); END; CLOSE(G); WRITELN(I); END. NEW, DISPOSE AND POINTERS. IN PASCAL, ALL THE SPACE NEEDED FOR VARIABLES IS FIXED IN THE DECLARATION OF VARIABLES. NONE OF THESE DECLARATIONS CAN BE MODIFIED AS THE PROGRAM IS EXECUTED. THERE ARE CASES WHERE AN UNPREDICTABLE AMOUNT OF SPACE MAY BE REQUIRED OR WHERE A LINKED LIST IS A NATURAL STRUCTURE FOR THE DATA. NEW AND DISPOSE ARE USEFUL IN THESE CASES. POINTER. A POINTER IS A VARIABLE WHICH POINTS TO ANOTHER VARIABLE. INTERNALLY, IT IS A WORD WHICH CONTAINS THE ADDRESS OF THE VARIABLE. VAR P:^INTEGER; DECLARES THAT P IS A POINTER WHICH IS ASSUMED ALWAYS TO POINT TO AN INTEGER VARIABLE. WITHIN THE BODY OF THE PROGRAM "P" IS THE POINTER AND "P^" IS THE THING POINTED AT. EX. P^:=3 GIVES THE VALUE 3 TO THE WORD AT WHICH P POINTS. THE VALUE OF P IS NOT CHANGED. THE VALUE OF P MAY BE CHANGED BY ASSIGNMENT P:=NIL P POINTS NOWHERE (ACTUALLY TO 0) P:=Q P POINTS WHERE Q POINTS OR BY THE PROCEDURE "NEW"; NEW NEW(P) NEW ALLOCATES SPACE FOR ONE VARIABLE OF THE TYPE DECLARED FOR P AND SETS P TO POINT AT IT. ALLOCATION IS DESCRIBED IN THE APPENDIX. THE PREVIOUS VALUE OF P IS DISCARDED. POINTERS, LIKE ALL OTHER VARIABLES, ARE NOT GIVEN AN INITIAL VALUE. BEFORE DOING ANYTHING WITH A POINTER, BE SURE THAT IT HAS BEEN ASSIGNED A MEANINGFUL VALUE. THE ABOVE EXAMPLE, OF A POINTER TO AN INTEGER, IS OF LITTLE PRACTICAL VALUE. USUALLY, THE THING POINTED AT IS A RECORD WHICH HAS WITHIN ITSELF A POINTER TO ANOTHER ITEM OF THE SAME TYPE. IN THIS WAY ONE CAN BUILD LINKED LISTS AND MORE COMPLICATED DATA STRUCTURES. DISPOSE. DISPOSE(P) DISPOSE FREES THE SPACE POINTED AT BY P AND MAKES IT AVAILABLE FOR LATER USE BY "NEW". THE VALUE OF P IS NOT CHANGED, BUT NO USE SHOULD BE MADE OF P UNTIL IT IS RESET TO A USEFUL VALUE. P MUST BE POINTING AT AN ALREADY ALLOCATED (BY "NEW") VARIABLE. ESI HAS ADDED TWO FEATURES TO PASCAL WHICH ARE USEFUL IN PROCESS CONTROL PROGRAMMING. ORIGIN. THE KEYWORD "ORIGIN" IS USED WHEN DECLARING VARIABLES WHEN THE PROGRAMMER WANTS TO CHOOSE THEIR MEMORY LOCATION AND NOT LEAVE THAT ASSIGNMENT TO THE COMPILER. VAR X ORIGIN 177760B:INTEGER; DECLARES X TO BE AN INTEGER VARIABLE AND ASSIGNS IT TO MEMORY ADDRESS 177760B. THE ADDRESS MUST BE AN INTEGER CONSTANT. IT MAY BE AN OCTAL OR DECIMAL LITERAL OR A NAMED CONSTANT. EVERY USE OF X BECOMES A REFERENCE TO THE CHOSEN ADDRESS. IF THE USE IS ON THE LEFT SIDE OF AN ASSIGNMENT OR IN A READ STATEMENT, THE RESULT WILL BE A PDP-11 MOV INSTRUCTION INTO THE ADDRESS. IF THE USE IS ON THE RIGHT SIDE OF AN ASSIGNMENT OR IN A PARAMETER LIST, THE RESULT WILL BE A MOV INSTRUCTION OUT OF THE ADDRESS. SINCE ALL I/O IN THE PDP-11 IS ACCOMPLISHED THROUGH "EXTERNAL PAGE" REGISTERS WHICH ARE ADDRESSED LIKE MEMORY, "ORIGIN" CAN BE USED TO WRITE ALMOST ANY KIND OF I/O PROCEDURE WITHOUT THE USE OF ASSEMBLER CODE. @. THE SYMBOL @ IS USED TO FIND THE ADDRESS OF A VARIABLE, RATHER THAN THE VALUE OF THE VARIABLE. P:= @XYZ; THE RIGHT SIDE IS THE ADDRESS OF VARIABLE XYZ. THE LEFT SIDE MUST BE A POINTER TO A VARIABLE OF THE TYPE OF XYZ. THIS MAY BE USED TO FIND THE LOCATION OF ITEMS IN THE OPERATING SYSTEM AND SET POINTERS TO THEM. TIME. THE CURRENT TIME OF DAY IS AVAILABLE THROUGH THE PREDEFINED FUNCTION "TIME". THIS FUNCTION IS NOT DEFINED IN STANDARD PASCAL. "TIME" IS A FUNCTION OF TYPE REAL, WHOSE VALUE IS THE NUMBER OF HOURS PAST LOCAL MIDNIGHT AT THE INSTANT IT IS CALLED. THE INFORMATION IS TAKEN FROM THE OPERATING SYSTEM WHICH UPDATES ITS CLOCK AT THE LINE FREQUENCY. THE OPERATOR MUST HAVE SET THE CLOCK WITH THE "TIM" COMMAND. IF NOT, THE VALUE IS THE NUMBER OF HOURS SINCE THE SYSTEM WAS BOOTSTRAPPED. EX. TO REPEAT A PROCESS FOR 15 MINUTES (.25 HOURS) R:=TIME+.25; REPEAT ..... UNTIL TIME >= R TO TIME THE LENGTH OF A PROCESS R:=TIME; ...... S:=TIME; WRITELN((S-R)*3600.0,' SECONDS') IF THE DURATION OF THE PROCESS BEING TIMED IS LESS THAN .1 SECONDS, THE LIMITED RESOLUTION OF THE CLOCK MAY NOT ALLOW ACCURATE TIMING. TO IMPROVE THIS, THE PROCESS CAN BE REPEATED MANY TIMES AND THE TOTAL TIME DIVIDED BY THE NUMBER OF ITERATIONS. VAR R,S,T:REAL; I:INTEGER; BEGIN R:=TIME; /*GET THE CURRENT TIME*/ FOR I:=1 TO 1000 DO; /*AN EMPTY LOOP*/ S:=TIME; R:=(S-R)*3600.0; /*COMPUTE THE TIME FOR AN EMPTY LOOP*/ T:=TIME; FOR I:=1 TO 1000 DO ........... /*PROCESS TO BE TIMED*/ S:=TIME; T:=(S-T)*3600; /*COMPUTE THE EXECUTION TIME OF THE PROCESS*/ T:=T-R; /*SUBTRACT THE TIME FOR THE LOOP BY ITSELF*/ WRITELN(T:8:3,' MILLISECONDS') END. RUNTIME PROGRAM ORGANIZATION THE OVERALL ORGANIZATION OF A PASCAL PROGRAM IS: THE INITIALIZING CODE--SETS UP R5 --> GLOBAL DATA AREA SP --> TOP OF USER CORE AREA $KORE --> TOP OF HEAP AREA MAIN PROGRAM AND PROCEDURES EXIT TO MONITOR ALL GLOBAL LEVEL VARIABLES ARE ACCESSED AS OFFSETS RELATIVE TO R5 ALL LOCAL VARIABLES ARE ACCESSED AS OFFSETS RELATIVE TO SP (STACK POINTER) ALL INTERMEDIATE LEVEL VARIABLE ACCESS MUST BE CONSTRUCTED BY LOADING THE STATIC POINTER INTO A REGISTER,GOING INDIRECT THROUGH IT UNTIL IT POINTS TO THE CORRECT LEVEL AND THEN DOING AN OFFSET ACCESS FROM IT. TOP OF ----------------- MEMORY=>! MONITOR ! ! ! ----------------- ! USER STACK ! ! AND LOCAL ! ! VARIABLES ! ! \/ ! ! \/ ! SP => ! \/ ! ----------------- ! FREE CORE ! ! ! ----------------- $KORE=> ! ^ ! ! ^ ! ! ^ ! ! HEAP ! ----------------- ! GLOBAL ! R5 => ! VARIABLES ! ----------------- ! USER PROGRAM ! ! AND SUPPORT ! ! PACKAGE ! ----------------- ! INTERRUPT ! ! VECTORS ! 0 => ----------------- PROCEDURE FRAME AND STATIC LINK STRUCTURE ------------------ !RETURN VALUE IF ! !FUNCTION ! ------------------ !PARAMETER LIST ! ------------------ !RETURN ADDRESS ! ------------------ !LOCAL VARIABLES ! ------------------ !STATIC POINTER ! !TO PREV. LEVEL ! !IF NON-GLOBAL ! SP-> !PROCEDURE ! ------------------ TOP OF STACK CALLING SEQUENCE: MOV SP,R4 ;R4 IS USED AS A POINTER TO PREVIOUS STATIC ;LEVEL--NOT REQ'D FOR GLOBAL PROCEDURES SUB #FUNCTION VALUE SIZE,SP ;IF A FUNCTION CALL MOV FIRST ARG,-(SP) MOV NEXT ARG,-(SP) MOV LAST ARG,-(SP) JSR PC,PROC ENTRY-(LEVEL DIFFERENCE + 1)*2 CALLEE SEQUENCE: MOV (R4),R4 MOV (R4),R4 MOV (R4),R4 ;HEIGHT=MAXDEPTH-CURRENT LEVEL+1 MOV (R4),R4 PROCENTRY: SUB #LOCAL VARIABLE AREA SIZE,SP ;SAVE SPACE FOR LOCALS MOV R4,-(SP) ;SAVE STATIC POINTER ON TOP OF STACK ;IF NOT A GLOBAL PROCEDURE JSR R0,SAVREG ;FUNCTIONS AT THIS POINT SAVE R0-R3 NOW PUT IN ACTUAL BODY OF CODE. WHEN CALLING RUNTIME SUPPORT, DOING REAL ARITHMETIC ON ANYTHING OTHER THAN 11/45'S OR SET EXPRESSIONS, THE PROGRAM WILL KEEP INTERMEDIATE RESULTS ON THE STACK. SINCE ALL LOCAL VARIABLES ARE ACCESSED RELATIVE TO THE LOCATION OF THE STACK POINTER, THE COMPILER KEEPS A COUNTER OF HOW MUCH GARBAGE HAS BEEN PUSHED ON THE STACK SO THAT THE ACCESSING OFFSETS ARE ADJUSTED TO THEIR CORRECT VALUES AT COMPILE TIME. JSR R0,UNSAVREG ;FUNCTIONS AT THIS POINT RESTORE REGS EXIT CODE: LET ARGSIZE = NUMBER OF WORDS OCCUPIED BY PROCEDURE PARAMETERS AND FRAMESIZE = NUMBER OF WORDS OCCUPIED BY LOCAL VARIABLES THEN IF NON-GLOBAL PROCEDURE: MOV FRAMESIZE+2(SP),FRAMESIZE+2+ARGSIZE(SP) ;MOVE RETURN ADDRESS ADD #FRAMESIZE+ARGSIZE+2,SP RTS PC --OR-- IF GLOBAL: MOV FRAMESIZE(SP),FRAMESIZE+ARGSIZE(SP) ADD #FRAMESIZE+ARGSIZE,SP ;GET RID OF FRAME SPACE RTS PC STORAGE OF VARIABLES VARIABLES ARE STORED, AS NOTED ABOVE, IN AREAS INDEXED BY REGISTERS 5 AND 6. VARIABLES HAVE THE FOLLOWING FORMATS: INTEGER. AN INTEGER OCCUPIES ONE WORD. IT IS TREATED AS A BINARY, TWO'S COMPLEMENT NUMBER. REAL. A REAL OCCUPIES TWO ADJACENT WORDS. ITS FORMAT IS DESCRIBED IN THE PDP-11 PROCESSOR HANDBOOK. ADDRESS SEEEEEEEEMMMMMMM ADDRESS+2 MMMMMMMMMMMMMMMM WHERE EACH LETTER REPRESENTS A BIT. S IS THE SIGN (+ OR -) OF THE VALUE. THE E'S REPRESENT THE BINARY EXPONENT IN EXCESS 200 NOTATION (EEEEEEEE := EXPONENT + 200B). THE M'S REPRESENT THE BINARY MANTISSA OF THE NUMBER. THE MANTISSA IS PRESUMED TO BE ALWAYS NORMALIZED SO THAT THE MOST SIGNIFICANT BIT (THE FIRST BIT AFTER THE BINARY POINT) IS 1. THIS BIT IS THEREFORE NOT INCLUDED IN THE REPRESENTATION. THE MOST SIGNIFICANT BIT OF THE MANTISSA IS ACTUALLY THE SECOND BIT AFTER THE BINARY POINT. 0 IS REPRESENTED BY A NUMBER WHOSE EXPONENT IS 0. EX. 1 IS 0100000010000000 0000000000000000 1/2 IS 0100000000000000 0000000000000000 -3 IS 1100000101000000 0000000000000000 CHARACTER. EACH CHARACTER TAKES ONE BYTE. THE LOWER 7 BITS ARE USED TO CONTAIN THE ASCII CODE FOR A CHARACTER. BOOLEAN. A BOOLEAN VALUE TAKES ONE BYTE. A 0 BYTE REPRESENTS A "FALSE" VALUE, A 1 REPRESENTS "TRUE". OTHER VALUES HAVE NO DEFINED MEANING. FILE VARIABLES. A FILE VARIABLE REQUIRES 7 WORDS. ITS STRUCTURE IS DESCRIBED IN THE NOTE ON RANDOM ACCESS FILES AND IN MORE DETAIL IN THE RT-11 SYSTEM REFERENCE MANUAL. WHEN A FILE IS OPENED WITH THE RESET OR REWRITE PROCEDURE, A BLOCK OF 256 WORDS IS NEEDED FOR THE BUFFER. THIS SPACE IS TAKEN BY IMPLICIT USE OF THE NEW PROCEDURE AND COMES OUT OF THE HEAP. SETS. A SET REQUIRES 4 WORDS AND CAN REPRESENT A SET WITH UP TO 64 POSSIBLE MEMBERS. WHEN A BIT IS 1, THE ELEMENT IT STANDS FOR IS CONSIDERED TO BE IN THE SET, WHEN 0 THAT ELEMENT IS NOT IN THE SET. EX. A:SET OF 20..80; A:= [20,24,60] A 0000000000010001 A+2 0000000000000000 A+4 0000000100000000 A+6 0000000000000000 STRUCTURED DATA TYPES. ARRAY. AN ARRAY IS DECLARED WITH CONSTANT LOWER AND UPPER BOUNDS FOR ITS INDEX. THE SPACE REQUIRED IS SIMPLY THE PRODUCT OF THE NUMBER OF ELEMENTS (UPPER - LOWER +1) AND THE SIZE OF A SINGLE ARRAY ELEMENT. EX. ARRAY['A'..'Z'] OF REAL WILL REQUIRE 26 * 2 WORDS. THE ELEMENTS ARE STORED IN SEQUENCE IN MEMORY. THE ADDRESS OF AN ELEMENT IS HIGHER IF ITS INDEX IS HIGHER. ARRAY[1..10] OF ARRAY[1..20] OF REAL IS EQUIVALENT TO ARRAY[1..10,1..20] OF REAL IN MEMORY THE SEQUENCE IS; A[1,1] A[1,2] ... A[1,20] A[2,1] ... A[10,20] RECORDS. A RECORD IS A COLLECTION OF VARIABLES OF POSSIBLY DIFFERENT TYPES. A RECORD TAKES SPACE EQUAL TO THE SUM OF THE SPACES REQUIRED BY THE COMPONENTS. A VARIANT RECORD TAKES THE SPACE NEEDED TO HOLD THE LARGEST VARIANT. THE ELEMENTS ARE STORED IN SEQUENCE IN MEMORY. THE HIGHEST ELEMENT IS THE LAST ONE LISTED. THE OFFSET OF EACH ELEMENT IS THE SUM OF THE SIZES OF THE ELEMENTS LISTED BEFORE IT. ALL STRUCTURED TYPES ARE STORED WITH THEIR LOWEST (FIRST) ELEMENT ON A WORD (EVEN ADDRESS) BOUNDARY. THUS, THERE WILL BE A ONE BYTE "GAP" AT THE TOP OF EACH STRUCTURED TYPE OF ODD SIZE. CALLING PASCAL PROCEDURES FROM MACRO CODE THIS CONTAINS INSTRUCTIONS ON HOW TO CALL PASCAL PROCEDURES AND FUNCTIONS FROM A USER'S PRE-EXISTING MACRO CODE. EXAMPLE: YOU WISH TO CALL A PROCEDURE DEFINED BY: 'PROCEDURE TYLE (I:INTEGER;F:REAL;VAR G:REAL);' TO CALL THIS GUY FROM MACRO CODE, YOU WOULD: 1.PUSH THE VALUE YOU WISH TO USE FOR I ONTO THE STACK (E.G. MOV #14,-(SP) OR MOV THISVAL,-(SP) ) 2.PUSH THE TWO WORD VALUE FOR THE REAL VARIABLE F (FIRST PUSH THE FIRST WORD,THEN PUSH THE SECOND E.G. MOV REALVAR,-(SP) MOV REALVAR+2,-(SP) ) 3.THEN PUSH THE ADDRESS FOR THE VARIABLE USED FOR THE FORMAL PARAMETER G. (E.G. MOV #REALVAR,-(SP) ) 4.THEN JSR TO THE FIRST LABEL IN THE PROCEDURE (WILL HAVE THE FORM 'LXXX:' UNLESS YOU WERE SMART ENOUGH TO HAVE COMPILED THE PASCAL PROCEDURES USING A '/E' IN WHICH CASE A LABEL 'TYLE:' WILL BE GENERATED BY THE COMPILER AND YOU CAN JSR TO IT. 5.THE PASCAL PROCEDURE WILL CLEAN UP THE STACK AND REMOVE THE PARAMETERS PASSED TO IT AND RETURN WITH AN ' RTS PC' TO THE CALLING PROGRAM. EXAMPLE: 'TYPE POSITION = RECORD X,Y:INTEGER END; PROCEDURE YUKKO (I:POSITION,R:REAL);' TO CALL THIS GUY: 1.FIRST PUSH THE INTEGER I.X 2.THEN PUSH THE INTEGER I.Y 3.THEN PUSH THE REAL R 4.LASTLY JSR TO THE ROUTINE EXAMPLE: 'FUNCTION K(A,B:INTEGER):INTEGER;' TO CALL: 1.FIRST SAVE A SPACE ON THE STACK THE SIZE OF THE RETURN RESULT (THIS WILL BE WHERE THE FUNCTION VALUE WILL BE RETURNED) 2.PUSH A 3.PUSH B 4.JSR TO THE PASCAL FUNCTION (E.G. JSR PC,K OR JSR PC,LXXXX ) 5.UPON RETURN FROM THE FUNCTION R0 THROUGH R3 WILL HAVE BEEN PRESERVED, AND THE FUNCTION RESULT WILL BE SITTING ON TOP OF THE STACK. THE PASCAL FUNCTION WILL HAVE CLEANED OFF THE ARGUMENTS TO THE FUNCTION FROM THE STACK. NOTE: PLEASE ONLY ATTEMPT TO CALL GLOBAL LEVEL PASCAL PROCEDURES SINCE IF YOU CALL NESTED PROCEDURES THEY WILL BE ASSUMING THAT A POINTER TO THE PREVIOUS NESTING LEVEL HAS BEEN SET UP AND IT COULD BE NOT GOOD IF THE CALLED PROCEDURE TYIES TO REFERENCE ANY INTERMEDIATE LEVEL VARIABLES USING THIS POINTER. FOR MORE INFORMATION ON THE STRUCTURE OF THE RUNTIME STACK, PLEASE REFER TO THE SECTION OF THIS MANUAL ON 'RUNTIME PROGRAM ORGANIZATION' ALSO, R5 MUST BE SET UP POINTING TO THE GLOBAL DATA AREA AS DESCRIBED IN 'RUNTIME PROGRAM ORGANIZATION' IF THE MACRO CODE USER SECTION DESTROYS IT. RUN-TIME ERROR MESSAGES BAD DEVICE IN FILE LOOKUP GENERATED BY A RESET OR REWRITE STATEMENT. THE OPERATING SYSTEM DOES NOT RECOGNIZE THE DEVICE PORTION OF THE FILE NAME. AN EXIT IS MADE TO THE MONITOR. BAD REAL GENERATED BY READ(REAL) WHEN IT ATTEMPTS TO READ A REAL VALUE FROM A TEXT FILE AND DOES NOT FIND A LEGAL REPRESENTATION OF A REAL NUMBER IN THE FILE. A VALUE OF 0.0 IS RETURNED AND THE PROGRAM CONTINUES. BAD INTEGER GENERATED BY READ(INTEGER) WHEN IT ATTEMPTS TO READ AN INTEGER FROM A TEXT FILE AND DOES NOT FIND A LEGAL REPRESENTATION OF ONE. A VALUE OF 0 IS RETURNED AND THE PROGRAM CONTINUES. BAD SET EXPRESSION AN ATTEMPT WAS MADE IN A SET EXPRESSION TO ADD OR SUBTRACT AN ELEMENT WHICH WAS OUTSIDE THE BASE TYPE OF THE SET. EXIT TO THE MONITOR. EIS OFL DIV OR MOD CAUSED AN ATTEMPT TO DIVIDE BY 0, OR THE RESULT OF AN INTEGER MULTIPLY WAS GREATER THAN 32767 OR LESS THAN -32767. EXIT TO MONITOR. END OF FILE A READ ATTEMPTED TO READ PAST THE END OF THE FILE. A NULL CHARACTER IS RETURNED AND THE PROGRAM CONTINUES. EXP OFL THE FUNCTION EXP WAS APPLIED TO AN ARGUMENT GREATER THAN 88.0 OR THE FUNCTION EXP10 WAS APPLIED TO AN ARGUMENT GREATER THAN 38.22. THE RESULT WOULD OVERFLOW THE REAL NUMBER REPRESENTATION. EXIT TO THE MONITOR. GET/PUT END OF FILE A "GET" ATTEMPTED TO READ PAST THE END OF THE FILE, OR A "PUT" ATTEMPTED TO WRITE PAST THE SPACE AVAILABLE FOR THE FILE. EXIT TO THE MONITOR. ILL INSTR XXXXB XXXX WILL BE THE CORE ADDRESS IN OCTAL OF THE INSTRUCTION FOLLOWING AN INSTRUCTION WHICH IS ILLEGAL FOR THE PROCESSOR. THE PASCAL SUPPORT PACKAGE WAS UNABLE TO SIMULATE THE INSTRUCTION. INCOMPATIBLE SUPPORT PACKAGE THE PASCAL COMPILER AND THE SUPPORT PACKAGE "SUPPER" ARE MATCHED TO EACH OTHER. THIS MESSAGE IS PRINTED WHEN A PROGRAM WAS RUN WHICH WAS COMPILED WITH ONE VERSION OF PASCAL AND LINKED WITH AN INCOMPATIBLE VERSION OF "SUPPER". INPUT CHANNEL NOT OPEN AN ATTEMPT WAS MADE TO READ FROM A FILE THAT WAS NEVER OPENED, FROM A FILE WHICH WAS OPENED AND THEN CLOSED, OR FROM A FILE WHICH IS OPEN FOR OUTPUT. OR A RESET(F) WAS DONE ON A FILE VARIABLE WHICH HAD NEVER BEEN OPENED. INPUT CHANNEL ERROR A HARDWARE ERROR OCCURRED DURING A READ. LOG OF 0 OR - XXXXB THE LOG OR LN FUNCTION WAS APPLIED TO AN ARGUMENT THAT WAS ZERO OR NEGATIVE. XXXX IS THE ADDRESS FOLLOWING THE ADDRESS OF THE CALL TO THE LOG FUNCTION. EXIT TO THE MONITOR. 'NEW' OF LENGTH 0 THE PROCEDURE "NEW" WAS CALLED TO ALLOCATE SPACE FOR A VARIABLE WHICH DEMANDS NO STORAGE AT ALL. SUCH A NONSENSE VARIABLE IS THE RESULT OF A SYNTACTICALLY CORRECT BUT ERRONEOUS DECLARATION IN THE PROGRAM. NO SPACE FOR FILE A REWRITE FAILED TO FIND ENOUGH SPACE FOR THE FILE. EXIT TO MONITOR. OUT OF MEMORY THE "NEW" PROCEDURE ATTEMPTED TO CREATE A NEW VARIABLE BUT NOT ENOUGH SPACE WAS AVAILABLE. EXIT TO MONITOR. OUTPUT CHANNEL NOT OPEN A WRITE ATTEMPTED TO WRITE TO A FILE WHICH HAD NOT BEEN OPENED FOR OUTPUT, WHICH HAD BEEN OPENED AND THEN CLOSED, OR WHICH WAS OPEN FOR INPUT. EXIT TO MONITOR. OUTPUT CHANNEL ERROR A HARDWARE ERROR OCCURRED DURING A WRITE. OUTPUT FILE TOO LONG A WRITE ATTEMPTED TO WRITE BEYOND THE SPACE AVAILABLE FOR THE FILE. EXIT TO THE MONITOR. SQRT OF NEGATIVE XXXXB THE SQRT FUNCTION WAS APPLIED TO A NEGATIVE ARGUMENT. XXXX IS THE ADDRESS FOLLOWING THE CALL TO THE SQRT FUNCTION. EXIT TO THE MONITOR. TOO MANY FILES OPEN ONLY 15 FILES MAY BE OPEN SIMULTANEOUSLY. THIS MESSAGE CAN ALSO OCCUR IN SOME CIRCUMSTANCES IF VERY MANY (256) RESET, REWRITE AND CLOSE OPERATIONS HAVE BEEN DONE. TRUNC OFL TRUNC OR ROUND WAS APPLIED TO A REAL NUMBER WITH A MAGNITUDE GREATER THAN 32767. A VALUE OF 0 IS RETURNED AND THE PROGRAM CONTINUES. UNSUPPORTED FEATURE USED THE STAND-ALONE (NON-RT11) SUPPORT PACKAGE HAS BEEN CALLED TO EXECUTE A FILE OPERATION (READ, RESET, ETC.). ?M FP TRAP XXXX THIS MESSAGE IS ISSUED BY THE OPERATING SYSTEM, NOT THE SUPPORT PACKAGE. IT INDICATES THAT EITHER A REAL NUMBER DIVIDE BY 0.0 WAS TRIED OR THE RESULT OF A REAL ARITHMETIC OPERATION WOULD OVERFLOW THE REAL NUMBER REPRESENTATION. EXIT TO THE MONITOR. COMPILER SWITCHES COMPILE TIME OPTIONS ARE SPECIFIED IN THE SAME FORMAT AS IN THE CDC 6000 PASCAL COMPILER--AS /*$OPTION,OPTION,OPTION*/ L TURNS THE LIST ON AND OFF NOTE: THE LISTING CONTROL IS OVERRIDDEN WHEN A LINE CONTAINING AN ERROR IS ENCOUNTERED AND THAT LINE AND ITS ERROR MESSAGES ARE FORCED TO APPEAR IN THE LISTING + => ON (DEFAULT) - => OFF D OUTPUTS THE SOURCE CODE LINES IN THE MACRO FILE AS COMMENTS TO AID DEBUGGING + => ON - => OFF (DEFAULT) E EXTERNAL PROCEDURE DEFINITION IS USED TO OUTPUT: " .GLOBAL PROCNAME PROCNAME: " THIS CAUSES THE PROCEDURE ENTRY POINT TO APPEAR IN THE .OBJ FILE FOR USE AT LINK TIME. NOTICE THAT ALTHOUGH ALL CHARACTERS ARE PUT IN THE MACRO FILE, ONLY THE FIRST SIX CHARACTERS OF THE NAME ARE USED BY RT-11, HENCE ALL EXTERNAL IDENTIFIERS MUST BE UNIQUE WITHIN THOSE CHARACTERS. IF THIS OPTION IS LEFT ON AT THE END OF THE FILE, IT DOES NOT LOOK FOR OR PROCESS THE MAIN LINE PROGRAM, SO THAT A FILE CONTAINING JUST EXTERNAL PROCEDURES CAN BE PROCESSED. THE OPTION CAN BE TURNED ON AND OFF AROUND SELECTED PROCEDURES SO THAT ONLY SPECIFIED ONES WILL APPEAR AT LINK TIME. ONCE THE EXTERNAL PROCEDURE FILE HAS BEEN CREATED, THE PROCEDURES CAN BE REFERENCED BY PLACING AN EXTERNAL PROCEDURE DEFINITION IN THE MAIN LINE PROGRAM WHERE THEY ARE TO BE CALLED AS FOLLOWS: "PROCEDURE PROCNAME (PARAMETER LIST);EXTERNAL; OR FUNCTION FUNCNAME (PARAMETER LIST):RETURN TYPE;EXTERNAL;" NOTICE THAT SINCE THE COMPILER HANDLES THE ACTUAL PROCEDURE FILE AND THIS EXTERNAL REFERENCE FILE AT DIFFERENT TIMES, IT CANNOT VERIFY THAT THE TWO PARAMETER LISTS MATCH, THE USER MUST BE SURE HE/SHE DOES NOT MAKE A MISTAKE IN THE ORDER AND TYPE OF PARAMETERS. IF AN EXTERNAL PROCEDURE WISHES TO HAVE ACCESS TO GLOBAL VARIABLES, THESE MUST BE DEFINED BOTH IN THE EXTERNAL PROCEDURE FILE AND THE VERY BEGINNING OF THE MAIN PROGRAM. THE GLOBAL DATA AREA IS SIMILAR TO A FORTRAN "COMMON" AREA AND SPACE MUST BE RESERVED FOR THOSE VARIABLES. + => ON - => OFF (DEFAULT) T TRACE OPTION CAUSES STATEMENT NUMBERS AND PROCEDURE NAMES TO BE PRINTED ON THE TERMINAL AS THE STATEMENTS ARE EXECUTED AND THE PROCEDURES ARE ENTERED + => ON - => OFF (DEFAULT) C ALLOWS INSERTION OF MACRO ASSEMBLER CODE IN LINE WITH PASCAL SOURCE.USE THE FORMAT: /*$C MOV MACROVARIABLE,%0 ADD PASCALLOCALVARIABLE(%6),%0 MOV %0,PASCALGLOBALVARIABLE(%5) ;COMMENTS AS YOU WISH */ ALL PASCAL VARIABLE NAMES WILL BE REPLACED WITH THEIR OFFSETS FROM R5 (FOR GLOBALS) OR R6 (FOR LOCALS). NOTE: DEFINING A PASCAL VARIABLE CALLED "MOV" WILL ALMOST CERTAINLY CAUSE UNWANTED RESULTS. IF YOU DECIDE TO USE THE REGISTER SYMBOLS R0-PC, YOU MUST DEFINE THEM YOURSELF AS THE ASSEMBLER RECOGNIZES %0-%7. DO NOT PUT THE TERMINATING "*/" IN A ";" STYLE MACRO COMMENT AS IT WILL BE TAKEN AS PART OF THE COMMENT AND IGNORED. B BREAKPOINT INSERTION THIS OPTION ALLOWS THE USER TO MAKE AVAILABLE AT RUNTIME VARIABLE NAMES,PROCEDURE AND FUNCTION NAMES AND STATEMENT NUMBERS FOR USE WITH THE RUNTIME DEBUGGER. THE 'B' OPTION CAN BE TURNED ON AND OFF AROUND THE VARIABLE DEFINITIONS THAT THE USER WISHES TO USE WITH THE DEBUGGER AS WELL AS AROUND PROCEDURES AND FUNCTIONS. THIS OPTION MUST BE ON AROUND THE ACTUAL START OF THE MAIN PROGRAM AND AT THE START OF ANY PROCEDURE THAT THE USER WISHES TO USE FOR TRACING OR SETTING BREAKPOINTS. WHEN THE PROGRAM IS ACTUALLY RUN,IT WILL START IN THE DEBUGGER TO ALLOW THE USER TO SET A BREAKPOINT IF HE WISHES (OR EXAMINE OR MODIFY VARIABLES). + => ON - => OFF (DEFAULT) WHILE IN THE DEBUGGER THE FOLLOWING COMMANDS ARE ALLOWED: PROCNAME,STMTNUMBER;B --SETS A BREAKPOINT IN PROCEDURE PROCNAME AT STATEMENT NUMBER STMTNO OR STMTNUMBER;B --SETS A BREAKPOINT IN MAIN BODY OF PROGRAM AT STATEMENT NUMBER STMTNO. VARIABLENAME/ --PRINTS OUT THE CONTENTS OF THE USER VARIABLE IN OCTAL AND ALLOWS IT TO BE MODIFIED. TO MODIFY,SIMPLY TYPE THE NEW NUMBER IN OCTAL. WHEN DONE,EITHER HIT 'RETURN' TO CLOSE THE LOCATION OR 'LINE FEED' TO CLOSE AND OPEN THE NEXT. VARIABLENAME% --OPEN THE VARIABLE AS A REAL AND ACCEPT NEW VALUES. VARIABLENAME$ --OPEN THE VARIABLE AS A DECIMAL INTEGER. AND ACCEPT NEW VALUES VARIABLENAME\ --OPEN THE VARIABLE AS A BYTE,PRINT THE CONTENTS AS AN OCTAL VALUE AND AS A CHARACTER. ALLOW A NEW OCTAL VALUE TO BE ASSIGNED. $ OR % OR \ OR / --REOPEN THE LAST OPENED LOCATION @ --USE THE VALUE OF THE CURRENT LOCATION AS A POINTER AND OPEN THAT LOCATION. ^ --OPEN THE PREVIOUS LOCATION IN MEMORY. 'NUMBER';P --PROCEED FROM THE BREAKPOINT NUMBER TIMES (DEFAULT FOR NUMBER IS 1). IF NUMBER>1 THEN THE BREAKPOINT LOCATION WILL BE PASSED THROUGH NUMBER TIMES BEFORE CAUSING ANOTHER BREAKPOINT TRAP. ;'NUMBER'S --IF NUMBER IS NON-ZERO, ENABLE SINGLE STEP MODE,WHICH WILL CAUSE ANOTHER BREAKPOINT TRAP TO OCCUR ON THE NEXT STATEMENT TO BE EXECUTED. THE DEBUGGER WILL STAY IN THIS STATE UNTIL EXPLICITLY DISABLED WITH EITHER ';0S' OR ';S' COMMAND. ;G --START THE PROGRAM AT THE BEGINING ;'NUMBER'T --TURN ON THE TRACE OPTION (PRINT ALL PROCEDURE NAMES AND STATEMENT NUMBERS DURING PROGRAM EXECUTION). NUMBER#0 TURNS IT ON, NUMBER =0 TURNS IT OFF. NOTE: 'NUMBER' ABOVE STANDS FOR ANY NUMBER THAT THE USER TYPES IN, IT NEED NOT HAVE QUOTE MARKS AROUND IT. COMMAND STRING INTERPRETER SWITCHES COMPILER OPTIONS CAN ALSO BE SPECIFIED IN THE COMMAND STRING. THESE ARE TAKEN BY THE COMPILER TO BE THE SAME AS PREFIXING THE FILE WITH THEIR EQUIVALENTS AS LISTED BELOW: /L IS THE SAME AS /*$L+*/ /D /*$D+*/ /T /*$T+*/ /E /*$E+*/ /N /*$L-*/ /B /*$B+*/ IN ADDITION, THE NUMBER OF LINES PER PAGE IN THE LISTING FILE CAN BE ADJUSTED BY USING THE /L SWITCH AND FOLLOWING THE L WITH AN EXCLAMATION MARK, THEN THE NUMBER OF LINES DESIRED. FOR EXAMPLE, .R PASCAL *T40000) IS TRUE, WHILE (J>40000) IS FALSE. THE OPERATIONS *, /, DIV, MOD ARE CHANGED FOR THIS KIND OF SUBRANGE TO PRODUCE THE CORRECT RESULTS. ***SAVING SPACE DURING COMPILATION. THE SPACE NEEDED TO COMPILE A PROGRAM IS ALMOST INDEPENDENT OF THE LENGTH OF THE PROGRAM. OF SEVERAL FACTORS, THE MOST SIGNIFICANT IS THE SPACE TAKEN BY THE SYMBOL TABLE. THE SYMBOL TABLE CONTAINS A RECORD OF EACH IDENTIFIER DECLARED IN THE PROGRAM - NAMES OF VARIABLES, TYPES, CONSTANTS, PROCEDURES AND FUNCTIONS. IDENTIFIERS WITH GLOBAL SCOPE ARE KEPT IN THE SYMBOL TABLE DURING THE ENTIRE COMPILATION. IDENTIFIERS DECLARED WITHIN PROCEDURES OR FUNCTIONS ARE KEPT IN THE SYMBOL TABLE ONLY WHILE THE PROCEDURE OR FUNCTION IS BEING COMPILED. TO SAVE COMPILE-TIME SPACE ONE CAN; 1) USE SHORTER IDENTIFIERS 2) USE ARRAYS TO CONTAIN RELATED ITEMS UNDER A SINGLE NAME. 3) MAKE IDENTIFIERS LOCAL, WHERE POSSIBLE, THUS ALLOWING THE SAME SYMBOL TABLE SPACE TO CONTAIN DIFFERENT ENTRIES AT DIFFERENT POINTS IN THE COMPILATION, REDUCING THE MAXIMUM SPACE REQUIRED. ***SAVING SPACE DURING EXECUTION. RUN-TIME SPACE DEPENDS ON THE LENGTH OF THE PROGRAM AND ON THE SIZE OF THE DECLARED VARIABLES. NO EXTRA RUNTIME SPACE IS TAKEN BY CONSTANTS, TYPES OR LABELS. GLOBAL VARIABLES EXIST DURING THE ENTIRE EXECUTION OF THE PROGRAM. LOCAL VARIABLES REQUIRE SPACE ONLY WHILE THEIR PROCEDURE IS EXECUTED. WHEN IT IS DONE THE SPACE IS RELEASED. IN PASCAL, THE RESERVED WORDS "PACK" AND "PACKED" ARE INTENDED TO HELP REDUCE THE SPACE TAKEN BY VARIABLES BY CALLING SPECIAL ROUTINES TO PACK THEM MORE EFFICIENTLY. THESE RESERVED WORDS ARE RECOGNIZED BY ESI-PASCAL, BUT NO ACTION IS TAKEN. THEY ARE EFFECTIVELY NULL OPERATORS. TO SAVE SPACE AT RUNTIME; 1) MAKE VARIABLES GLOBAL ONLY WHEN THEY MUST EXIST DURING THE ENTIRE EXECUTION. OTHERWISE, BREAK THE PROGRAM INTO PROCEDURES SUCH THAT THE SPACE NEEDED FOR THE VARIABLES OF ONE PROCEDURE CAN BE MADE AVAILABLE LATER TO THOSE OF ANOTHER. 2) USE REFERENCE (VAR) PARAMETERS FOR LARGE DATA STRUCTURES IN PROCEDURE CALLS. WHEN A PARAMETER IS CALLED BY VALUE (THE ORDINARY CASE) SPACE IS SET ASIDE AND THE VALUE IS COPIED INTO THAT SPACE. WHEN CALLED BY REFERENCE (VAR) NO EXTRA SPACE IS SET ASIDE. RATHER, A POINTER IS ESTABLISHED, DIRECTING ALL REFERENCES BACK TO THE ACTUAL PARAMETER. 3) RUNTIME SPACE IS TAKEN TO HOLD EVERY CHARACTER ARRAY CONSTANT (E.G. 'HELLO' ). NO CHECK IS MADE TO SEE WHETHER ANY OF THESE IS IDENTICAL TO ANY OTHERS. WHEN THE SAME CHARACTER ARRAY CONSTANT IS USED AT SEVERAL PLACES, IT MAY BE BETTER TO DECLARE A CHARACTER ARRAY VARIABLE OF THE PROPER SIZE, SET ITS VALUE EQUAL TO THE CONSTANT AT THE BEGINNING OF THE PROGRAM AND USE THE VARIABLE IN PLACE OF THE CONSTANT THROUGHOUT THE REST OF THE PROGRAM. 4) THE WITH STATEMENT CAN SAVE SPACE SINCE IT COMPUTES THE OFFSET FOR PART OF A RECORD ONCE ONLY, ALLOWING REPEATED ACCESSED TO THE SUBPART WITHOUT RECOMPUTING THE GROSS OFFSET EACH TIME. 5) THE COMPILER GENERATES A TABLE OF DISPATCH ADDRESSES FOR THE CASE STATEMENT. THE TABLE CONTAINS ONE WORD FOR EACH CONSTANT IN THE LIST, FROM THE LEAST TO THE GREATEST, AND A WORD FOR EACH VALUE WITHIN THAT RANGE, WHETHER LISTED OR NOT. EX. CASE I OF 1:....... 1000: ...... END WOULD BUILD A TABLE OF 1000 ENTRIES BUT ONLY TWO USEFUL ONES. THEREFORE, AVOID EXTENSIVE AND SPARSE CASE LISTS. ***COMPILE TIME ERRORS (SYNTAX ERRORS) THE LISTING FILE OUTPUT BY THE COMPILER CONTAINS THE PROGRAM SOURCE PLUS FOUR COLUMNS OF NUMBERS AT THE LEFT (LINE STMT LEVEL NEST) AND ERROR MESSAGES INSERTED WHERE THE ERRORS ARE FOUND. AN ERROR MESSAGE CONSISTS OF A LINE CONTAINING ONE OR MORE UP-ARROWS (^) AND THE SAME NUMBER OF LINES OF TEXT, EACH BEGINNING WITH ASTERISKS AND CONTAINING AN ERROR INDICATION. THE UP-ARROW IS PLACED TO POINT AT THE BEGINNING OF THE TOKEN WHICH WAS BEING COMPILED WHEN THE ERROR WAS FOUND. THE ERROR INDICATIONS ARE FAIRLY PRECISE, BUT THEY CANNOT BE EXACT. MISSPELLINGS, FOR EXAMPLE, CANNOT BE CORRECTED, ONLY NOTED. WHEN AN ERROR IS FOUND, THE COMPILER NOTES IT AND ATTEMPTS TO CONTINUE SCANNING THE PROGRAM. OFTEN IT DOES THIS BY SKIPPING AHEAD TO SOME MEANINGFUL SYMBOL LIKE A SEMICOLON OR RIGHT PARENTHESIS. IN DOING SO, IT MAY SKIP INFORMATION AND CAUSE MORE ERRORS LATER. BECAUSE OF THIS, THE FIRST ERROR FOUND IS THE MOST IMPORTANT. CORRECTING IT WILL OFTEN CORRECT OTHERS AS WELL. THE COLUMNS OF NUMBERS ON THE LEFT ARE ALSO USEFUL IN FINDING ERRORS: LINE. THIS GIVES THE PHYSICAL POSITION OF THE LINE IN THE SOURCE. STMT. EACH STATEMENT WITHIN A BLOCK IS SUCCESSIVELY NUMBERED, STARTING AT 1. LEVEL EACH BLOCK IS AT A LEVEL ONE GREATER THAN THE BLOCK WHICH CONTAINS IT. THE MAIN BODY OF THE PROGRAM IS AT LEVEL 1. A PROCEDURE DEFINED IN THE PROGRAM IS AT LEVEL 2. A PROCEDURE DEFINED WITHIN THAT PROCEDURE IS AT LEVEL 3, AND SO ON. ONE COMMON MISTAKE IN PASCAL IS FAILING TO MATCH BEGINS AND ENDS. THE LEVEL NUMBERS CAN HELP FIND THE MISTAKE. IF THE MAIN BODY OF THE PROGRAM IS NOT AT LEVEL 1, SOME SUCH ERROR HAS OCCURED. NEST. EACH STATEMENT IS ONE NESTING LEVEL HIGHER THAN THE STATEMENT WHICH CONTAINS IT. FOR EXAMPLE, IF A REPEAT STATEMENT IS AT NEST LEVEL 3, THE STATEMENTS WITHIN IT (BETWEEN REPEAT AND UNTIL) WILL BE AT NEST LEVEL 4 OR HIGHER. AT THE END OF COMPILATION THE NUMBER OF ERRORS IS PRINTED AT THE TERMINAL. IF ZERO, NO ERRORS HAVE BEEN DETECTED AND THE PROGRAM MAY BE ASSEMBLED AND LINKED. NO ERRORS SHOULD BE REPORTED BY THE ASSEMBLER OR LINKER. THE /N SWITCH SUPPRESSES THE LISTING OUTPUT, BUT ERRONEOUS LINES AND THEIR ERROR MESSAGES ARE STILL PRINTED. FOR A SUMMARY OF ERRORS ONLY, RUN THE COMPILER AND INDICATE THE FILES LIKE THIS; *,TT:<(PROGRAM)/N THE LISTING FILE WILL GO TO THE SYSTEM TERMINAL. THE /N SUPPRESSES ALL OUTPUT BUT ERROR MESSAGES. *** EXECUTION ERRORS A) NO INITIALIZATION NO VARIABLE, OF ANY TYPE, WHETHER LOCAL OR GLOBAL, IS GIVEN AN INITIAL VALUE. THE VALUE OF A VARIABLE IS SET OR CHANGED IN ONLY THE FOLLOWING WAYS: 1) DIRECT ASSIGNMENT A:=B+C OR BY A FOR STATEMENT, FOR I:=1 TO 100 DO ..... 2) POINTER VARIABLES ARE GIVEN A VALUE BY THE NEW PROCEDURE 3) READ STATEMENTS ASSIGN A VALUE TO THEIR PARAMETERS. 4) FILE VARIABLES ARE ALTERED BY THE PROCEDURES RESET, REWRITE, READ AND WRITE. THE INITIAL VALUE OF A VARIABLE IS ALWAYS UNPREDICTABLE. B) TRANSIENT LOCALS. LOCAL VARIABLES AND VALUE PARAMETERS ARE GIVEN MEMORY SPACE ONLY DURING THE EXECUTION OF THE PROCEDURE IN WHICH THEY ARE DEFINED. THE VALUES THEY HAVE ARE NOT PRESERVED BETWEEN ONE CALL TO THAT PROCEDURE AND THE NEXT. IF DATA MUST BE PRESERVED THIS WAY, IT MUST BE HELD IN A VARIABLE DECLARED AT A MORE GLOBAL LEVEL. C) BOUND CHECKS. SEE ALSO THE SECTION ON RUNTIME SPACE ALLOCATION. ALTHOUGH AN ARRAY'S BOUNDS ARE FIXED AT COMPILE TIME, IT IS POSSIBLE TO ADDRESS NON-EXISTENT ELEMENTS OF THE ARRAY, THOSE OUTSIDE THE DECLARED BOUNDS. EX. VAR A:ARRAY[1..10] OF INTEGER; ....... B:=A[20] A[20] IS COMPUTED TO BE AT THE CORRECT OFFSET FROM A,BUT SINCE A IS NOT THAT BIG, IT WILL BE A RANDOM FREE LOCATION OR THE ADDRESS OF ANOTHER VARIABLE. THE PROGRAMMER SHOULD VERIFY THAT ARRAY BOUNDS WILL NOT BE EXCEEDED, ESPECIALLY WHEN INDEXING IS DONE BY COMPLEX EXPRESSIONS: EX. A[(I+J) DIV 2] D) FILE VARIABLES AS PARAMETERS. READ(F,....) AND WRITE(F,....) CHANGE THE VALUES IN THE FILE VARIABLE F. A FILE VARIABLE CAN BE PASSED AS A PARAMETER TO A PROCEDURE. SINCE ITS VALUE CAN BE CHANGED BY A READ OR WRITE WITHIN THE PROCEDURE, IT MUST BE PASSED AS A REFERENCE (VAR) PARAMETER. E) STACK OVERFLOW. EACH TIME A PROCEDURE IS CALLED, MEMORY SPACE IS TAKEN FOR ITS LOCAL VARIABLES AND PARAMETERS. NO CHECK IS MADE TO SEE WHETHER SUCH SPACE IS ALREADY USED BY "NEW" VARIABLES OR THE OPERATING SYSTEM. THIS SITUATION, CALLED STACK OVERFLOW, CAN RESULT IN UNPREDICTABLE ERRORS. STACK OVERFLOW IS A GREATER RISK WHEN THE PROGRAM INCLUDES RECURSIVE PROCEDURES BECAUSE THE MAXIMUM STACK SPACE REQUIRED IS THEORETICALLY UNLIMITED. A CATASTROPHIC RESULT, SUCH AS A PROCESSOR HALT OR TRAP IS LIKELY TO BE THE RESULT OF STACK OVERFLOW OR EXCEEDING THE BOUNDS OF AN ARRAY. F) REAL PRECISION PROBLEMS. REAL NUMBERS ARE STORED IN MEMORY IN 2 16-BIT WORDS, 24 BITS FOR THE BINARY MANTISSA AND 8 BITS FOR THE BINARY EXPONENT. THE 24 BITS OF BINARY PRECISION ARE EQUIVALENT TO ABOUT 7 1/4 DECIMAL DIGITS OF PRECISION. IN CONVERTING A REAL NUMBER TO A CHARACTER STRING FOR OUTPUT, ONLY 7 DECIMAL DIGITS ARE GIVEN, THE EXTRA BITS ARE USED TO ROUND OFF THE LAST DIGIT OF THE 7. THE PRACTICAL RESULT IS THAT A COMPARISON OF TWO REAL NUMBERS WILL SOMETIMES SHOW THEM TO BE UNEQUAL WHEREAS THEIR WRITTEN REPRESENTATIONS AT THE TERMINAL ARE IDENTICAL. EX. THE PASCAL EXPRESSION, (8388608.0/8388607.0 = 1.0) IS FALSE, BUT WRITELN(8388608.0/8388607.0) WILL OUTPUT 1.000000E+00 TO USE THE NON-RT11 SUPPORT PACKAGE AND CASSETTE INTERFACE 1.IF YOU ARE TRYING TO RUN A PASCAL PROGRAM, LINK YOUR .OBJ FILE OUT OF THE ASSEMBLER WITH A COPY OF THE SUPPORT PACKAGE THAT HAS 'NOSUP=0' DEFINED. 2.WHEN YOU RUN THE LINKER, SPECIFY THE '/L' SWITCH TO PRODUCE A LOADER TYPE .LDA FILE 3.RUN LOAD.SAV ON THE TRANSMITTER AND ENTER THE FULL FILENAME 4.RUN LOADER.SAV ON THE RECEIVER. IT WILL CLEAR OUT THE VECTOR ADDRESSES AND LOAD THE BOOTSTRAP INTO THE TOP OF A 16K MACHINE. IT WILL HALT BEFORE THE BOOTSTRAP. CHANGE SWITCH ON TTY TO 'EXTERNAL INPUT' AND PRESS 'CONTINUE'. 5.HIT 'RETURN' ON THE TRANSMITTER TTY. THIS WILL INITIATE THE TRANSFER. 6.THE BOOTSTRAP LOADER WILL LOAD THE ABSOLUTE LOADER OFF OF THE TTY LINE WHICH WILL THEN LOAD THE LDA FORMAT FILE THAT FOLLOWS IT. 7.THE PROGRAM WILL SELF START ON THE RECEIVER. 8.CHANGE THE TTY SWITCH BACK TO 'NORMAL' FROM 'EXTERNAL INPUT'. 9.HIT TWO ^C 'S ON THE TRANSMITTER TO RETURN PROGRAM CONTROL TO THE MONITOR. FORTRAN SUBROUTINES AND LIBRARY ROUTINES MAY BE USED BY PASCAL PROGRAMS. TO DO THIS IT IS NECESSARY TO SET UP THE PARAMETERS, IF ANY, AND LINK THE ROUTINE INTO THE FINAL MODULE. FOLLOW THESE RULES; AT THE BEGINNING OF THE PROGRAM, DECLARE THE PROCEDURE AND ITS PARAMETERS, THEN PUT THE WORD "FORTRAN" FOLLOWED BY A SEMICOLON. THIS IS EXACTLY THE SAME AS DECLARING A PROCEDURE "EXTERNAL". ALL THE PARAMETERS MUST BE "VAR" PARAMETERS. PROCEDURE NNN(VAR X,Y:INTEGER;VAR Z:REAL);FORTRAN; CALL THE PROCEDURE IN THE PASCAL PROGRAM JUST AS YOU WOULD ANY OTHER PROCEDURE. COMPILE AND ASSEMBLE AS USUAL. LINK AS USUAL, BUT INCLUDE THE FORTRAN PROCEDURE AS WELL. R LINK PROG=PASPROG,FORPROC,SUPPER THE COMPILER WILL CREATE A GLOBAL REFERENCE FOR THE NAME "NNN" AND WILL GENERATE THE JUMP TO IT WHEREVER IT IS CALLED. THE PARAMETERS WILL BE PUT ON THE STACK AS USUAL, HOWEVER, WHEN THE PROCEDURE IS CALLED A SPECIAL SUBROUTINES WILL REVERSE THEIR ORDER, FOR FORTRAN EXPECTS THEM THAT WAY. SERVICING INTERRUPTS ON THE PDP-11 REQUIRES THAT EACH VECTOR BE LOADED WITH THE ADDRESS AND PRIORITY FOR THE CORRESPONDING SERVICE ROUTINE. THIS IS DONE BY USING A SHORT SECTION OF MACRO CODE IN AN INITIALIZATION PROCEDURE WHICH IS CALLED ONCE AT THE BEGINNING OF THE PROGRAM. THE ADDRESS LOADED IS NOT THAT OF THE SERVICE PROCEDURE BUT THAT OF A LOCATION IN THE MACRO SECTION FROM WHICH THE PROCEDURE IS CALLED. THIS ALLOWS ONE TO SAVE AND RESTORE REGISTERS AND COMMUNICATE WITH THE OPERATING SYSTEM WHEN NECESSARY. THE SERVICE PROCEDURE MAY ACCESS GLOBAL VARIABLES AND VARIABLES LOCAL TO ITSELF, BUT NO OTHERS. IT MAY CALL OTHER PROCEDURES WHICH MUST OBEY THE SAME RESTRICTION. FIRST IS AN EXAMPLE IN WHICH TWO VECTORS ARE SET UP. NOTE THAT THE ^O NOTATION IS NECESSARY BECAUSE PASCAL SETS THE RADIX TO 10. THIS CODE CANNOT BE OVERLAID. INTERRUPTS MAY OCCUR AT ANY TIME, AND THE SERVICE CODE MUST BE PRESENT TO HANDLE THEM. PROCEDURE SERVICEA; /*SERVICE FOR VECTOR 400*/ BEGIN END; PROCEDURE SERVICEB; /*SERVICE FOR VECTOR 100*/ BEGIN END; PROCEDURE INIT; BEGIN /*$C CLR @#^O402 ;SET PRIORITY AT 0 MOV #ALINK,@#^O400 ;LOAD ADDRESS MOV #^O200,@#^O102 ;PRIORITY 4 MOV #BLINK,@#^O100 BR OVER ;LEAVE INIT AFTER THIS SETUP .GLOBL SVR50$,RSR50$ ;EXISTING ROUTINES IN SUPPER ALINK: JSR %5,SVR50$ ;COME HERE BY INTERRUPT THROUGH 400 MOV $RESR5,%5 ;TO REACH PASCAL GLOBALS */ SERVICEA; /*CALL A PROCEDURE FOR SERVICE*/ /*$C JSR %5,RSR50$ RTI BLINK: JSR %5,SVR50$ MOV $RESR5,%5 */ SERVICEB; /*$C JSR %5,RSR50$ RTI OVER: */ /*FURTHER INITIALIZATION, ENABLE INTERRUPTS, ETC*/ END; IF THE SERVICE PROCEDURES ARE GOING TO ISSUE ANY RT11 SYSTEM EMT'S, WHICH WILL HAPPEN FOR READ, WRITE, RESET, AND REWRITE, THEN THE OPERATING SYSTEM MACROS .SYNCH, .INTEN AND .PROTECT MUST BE USED. HERE IS THE SAME EXAMPLE FOR USE WITH RT 11. PROCEDURE SERVICEA; /*SERVICE FOR VECTOR 400*/ BEGIN END; PROCEDURE SERVICEB; /*SERVICE FOR VECTOR 100*/ BEGIN END; PROCEDURE INIT; BEGIN /*$C .MCALL .INTEN,.SYNCH,.PROTECT MOV #^O340,@#^O402 ;SET AT 7, .INTEN WILL RESET MOV #ALINK,@#^O400 ;LOAD ADDRESS MOV #^O340,@#^O102 MOV #BLINK,@#^O100 .PROTECT #AREA,#^O400 ;TELL RT11 YOU CLAIM THESE .PROTECT #AREA,#^O100 BR OVER ;LEAVE INIT AFTER THIS SETUP .GLOBL SVR50$,RSR50$ AREA: .BLKW 2 AAREA: .WORD 0,0,0,0,0,-1,0 ALINK: .INTEN 0 ;YOUR CHOICE OF PRIORITY .SYNCH #AAREA BR SYNERR ;ERROR EXIT JSR %5,SVR50$ ;COME HERE BY INTERRUPT THROUGH 400 MOV RESR5$,%5 */ SERVICEA; /*CALL A PROCEDURE FOR SERVICE*/ /*$C JSR %5,RSR50$ RTS %7 ;NOT RTI, RT11 NOW HANDLES IT. BAREA: .WORD 0,0,0,0,0,-1,0 BLINK: .INTEN 4 .SYNCH #BAREA BR SYNERR JSR %5,SVR50$ MOV RESR5$,%5 */ SERVICEB; /*$C JSR %5,RSR50$ RTS %7 SYNERR: .PRINT #M1 .EXIT M1: .ASCIZ /SYNCH ERROR/ OVER: */ /*FURTHER INITIALIZATION, ENABLE INTERRUPTS, ETC*/ END; OVERLAYS OVERLAYS CAN BE USED IN A PROGRAM TO SAVE SPACE BY ALLOWING TWO OR MORE PROGRAM SECTIONS THAT NEVER CALL EACH OTHER AND ARE NEVER REQUIRED TO BE IN MEMORY AT THE SAME TIME TO SHARE THE SAME SPACE IN MEMORY. A MORE COMPLETE DESCRIPTION OF THE OVERLAY FACILITY OF THE LINKER WILL BE FOUND IN THE RT-11 SYSTEM REFERENCE MANUAL (DEC-11-ORUGA-C-D) IN SECTION 6.6 . PLEASE NOTE THAT SINCE THE OVERLAYS ARE STORED ON THE DISK WHENEVER THEY ARE NOT IN MEMORY, FREQUENT CHANGES BETWEEN PROCEDURES WILL CAUSE A LOT OF DISK ACCESSES (PROBABLY NOT GOOD FOR FLOPPYS) AND WILL BE QUITE SLOW. EXAMPLE: SUPPOSE YOU HAVE A PROGRAM AS FOLLOWS: PROCEDURE A; BEGIN END PROCEDURE B; BEGIN END; PROCEDURE C; BEGIN END; BEGIN END. AND YOU WISH PROCEDURES A AND B TO OCCUPY THE SAME REGION OF MEMORY SINCE THEY NEVER CALL EACH OTHER. FURTHER ASSUME THAT YOU WISH PROCEDURE C TO BE IN MEMORY ALL THE TIME (AS IN A STANDARD PASCAL PROGRAM). YOU WOULD THEN DO THE FOLLOWING: 1.PUT PROCEDURE A IN A SEPARATE FILE (LET'S CALL IT PROCA.PAS) 2.PUT PROCEDURE B IN A SEPARATE FILE (CALL IT PROCB.PAS) 3.PUT ALL GLOBAL VARIABLES AND TYPE DEFINITIONS THAT ARE NEEDED BY PROCEDURES A AND B IN A FILE (CALL IT GLOBL.PAS) 4.NOW COMPILE PROCEDURE A AS AN EXTERNAL PROCEDURE AS FOLLOWS: .R PASCAL *T MID DO M:=M-1; IF L<= M THEN BEGIN TEMP:=Z[M]; Z[M]:=Z[L]; Z[L]:=TEMP; L:=L+1; M:=M-1 END UNTIL L>M; IF ISIZE) OR EOF(F); CLOSE(F); /* SORT THEM */ QSORT(A,1,X-1); /* WRITE THEM OUT */ WRITE('OUTPUT? '); READLN(NAME); REWRITE(G,NAME); Y:=1; WHILE Y=SIZE) OR NOT SINGULAR; IF NOT SINGULAR THEN FOR J:= 1 TO SIZE DO BEGIN /*SWAP COLUMNS*/ B:=X[J,I];X[J,I]:=X[J,K];X[J,K]:=B; B:=Y[J,I];Y[J,I]:=Y[J,K];Y[J,K]:=B; END END; IF NOT SINGULAR THEN BEGIN B:=X[I,I]; FOR J:=1 TO SIZE DO BEGIN X[I,J]:=X[I,J]/B; Y[I,J]:=Y[I,J]/B END; FOR J:=1 TO SIZE DO BEGIN IF J#I THEN BEGIN B:=X[J,I]; FOR K:=1 TO SIZE DO BEGIN X[J,K]:=X[J,K]-B*X[I,K]; Y[J,K]:=Y[J,K]-B*Y[I,K] END END END; END; I:=I+1 END END; BEGIN READMATRIX(A); INVERT(A,B); IF NOT SINGULAR THEN BEGIN MATRIXMULTIPLY(A,B,C); PRINTMATRIX(A); PRINTMATRIX(B); PRINTMATRIX(C) END ELSE WRITELN('SINGULAR MATRIX') END.