; ; ;COPYRIGHT (C) 1975,1981,1982 BY ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ;TRANSFERRED. ; ;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ;CORPORATION. ; ;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. ; ; ; WRITTEN BY J. THOMAS, A. N. HABERMANN, T. TEITELBAUM, L. SNYDER, C.M.U. ; EDITED BY R. M. DE MORGAN. SALL SEARCH ALGPRM ; MAIN PARAMETER FILE %UNIVERSAL(ALGMAC,ALGOL COMPILER PSEUDO-ALGOL MACROS) REPEAT 0, < SYNTACTIC DESCRIPTION OF SYNTAX AND CODE GENERATION ROUTINES MODULE: MDEC FILE: ALGDEC TITLE: ROUTINES FOR PROCESSING DECLARATION/SPECIFICATION CONSTRUCTS PROCEDURE SPRODEC: PROCEDURE (,) ; ; ; CODE GPRO1-----------------^ CODE GPRO2------------------^ CODE GPRO3-----------------------^----^ CODE GPRO4------------------------------^ CODE GPRO5--------------------------------------------^ CODE GPRO6-----------------------------------------------------^ PROCEDURE SIMP: , ; ! , ; CODE GSMP1-----------^-----------------------^ CODE SPEC1-----------------------------------------^-----^ CODE GSMP2-----------------^-----^ PROCEDURE SARYDEC: ARRAY , [ : , : ] CODE GARY1-----^ CODE GARY2--------^ CODE GARY3-------------^------^ CODE GBP1------------------------------^-------^-------^------^ CODE GARY4-----------------------------------------------------^ PROCEDURE SSWDEC: SWITCH := , ; CODE GSW1DEC-----------------^ CODE GSW2DEC-------------------------------^------------^ CODE GSW3DEC---------------------------------------------^ SUPPORT ROUTINES: PROCEDURE COMPOSEDEC: COMBINE MULTIPLE WORD DECLARATION DELIMITERS PROCEDURE SPCHECK: PROHIBIT SPECIFICATIONS AS DECLARATIONS PROCEDURE XANL0: POSTPROCESS FORWARD DECLARATION PROCEDURE XANL1: POSTPROCESS OWN DECLARATION PROCEDURE XANL2: POSTPROCESS SIMPLE DECLARATIONS PROCEDURE XANL3: POSTPROCESS VALUE AND LABEL SPECIFICATION PROCEDURE XANL4: POSTPROCESS ARRAY DECLARATIONS PROCEDURE XANL5: POSTPROCESS PROCEDURE DECLARATIONS PROCEDURE XANL6: POSTPROCESS SWITCH DECLARATIONS PROCEDURE XANL7: POSTPROCESS FORWARD LABEL DECLARATIONS PROCEDURE DSEL: SELECT DECLAR/SPECIF PROCESSING ROUTINE PROCEDURE DUBDEC: PROHIBIT MULTIPLE DECLARATIONS MODULE: MSTM FILE: ALGSTM TITLE: ROUTINES F0R PROCESSING ALGOL STATEMENT CONSTRUCTS PROCEDURE SWHILE: WHILE DO CODE GWHL1---------^ CODE GWHL2--------------^ CODE GWHL3------------------------^ CODE GWHL4-------------------------^ PROCEDURE SSIF: IF THEN ELSE CODE GSIF1------------^ CODE GSIF2------------------------^ CODE GSIF3---------------------------^ CODE GSIF4----------------------------------^ CODE GSIF5------------------------------------^ PROCEDURE SBEGIN: BEGIN END ! BEGIN ; END CODE GBEG0-----^------------------^ CODE GBEG1--------^ CODE GBEG2---------------------------^ CODE GBEG3----------------------------------------^ CODE GBEG4-------------^---------------------------------^ CODE GBEG5-------------------------------------------------^ CODE GBEG6------------------^---------------------------------^ PROCEDURE SGOTO: GOTO CODE GGO-----------------------^ PROCEDURE SCOL: : CODE GCOL1---------^ CODE GCOL2----------^ PROCEDURE SONOFF: CHECKON 1 CODE GSONOFF----------^ MODULE: MEXP FILE: ALGEXP TITLE: ROUTINES FOR PROCESSING ALGOL EXPRESSION CONSTRUCTS PROCEDURE SASS: := CODE GASS1----------^ CODE GASS2-----------------^ PROCEDURE SOP: CODE GOP1---------------^ CODE GOP2---------------------------^ PROCEDURE EXPARN: ( ) ! ( _ ) CODE GPAR1---------------------------^ CODE GPAREN------------^---------------------^ PROCEDURE SEIF: IF THEN ELSE CODE GEIF1------------^ CODE GEIF2-------------------------^ CODE GEIF3--------------------------------------^ PROCEDURE SARY: [ , ] CODE GSS1--------^ CODE GSS2-----------------^-------^ CODE GSS3--------------------------^ PROCEDURE SSW: [ ] CODE GSW1-----------^ CODE GSW2-------------------^ CODE GSW3----------------------^ PROCEDURE SDOT: . [ ] CODE GDOT1------------^ CODE GDOT2---------------------^ CODE GDOT3-----------------------^ PROCEDURE STRIG: ( ) CODE GTRG1----------------^ CODE GTRG2------------------------^ CODE GTRG3--------------------------^ PROCEDURE SFPARN: ( , ) CODE GFUN1-----------^ CODE GFUN2--------------^-------^ CODE GFUN3--------------------^-------^ CODE GFUN4------------------------------^ MODULE: MFOR FILE: ALGFOR TITLE: ROUTINES FOR PROCESSING THE FOR STATEMENT PROCEDURE SFOR: FOR := , DO ; CODE GFOR1-----------^ CODE GFOR2---------------^-----------^ CODE GFOR3------------------------^-----------^ CODE GFOR4-------------------------------------^ CODE GFOR5--------------------------------------------^ CODE GFOR6---------------------------------------------^ PROCEDURE SSTEP: STEP UNTIL CODE GSTP1---------^ CODE GSTP2--------------------^ CODE GSTP3--------------------------------^ PROCEDURE SUNTIL: UNTIL CODE GUNT1---------^ CODE GUNT2--------------------^ PROCEDURE SFWHIL: WHILE CODE GFWH1--------^ CODE GFWH2-------------------^ SUPPORT ROUTINES: PROCEDURE VRESTORE: RECOVER CONTROL VARIABLE ASSIGNMENT CODE PROCEDURE VGETS: MAKE CONTROL VARIABLE ASSIGNMENT PROCEDURE BODY: GENERATE TRANSFER TO FOR BODY MODULE: MUTL FILE: ALGUTL TITLE: SUPPORT ROUTINES FOR SYNTAX AND CODE GENERATION ROUTINES SUPPORT ROUTINES: PROCEDURE LOOK: SCAN SYMBOL TABLE FOR SYMBOL IN NSYM PROCEDURE SCINSERT: FIXUP WINDOW IN CASE OF A MISSING SEMICOLON PROCEDURE RUND2: SHIFT WINDOW PAST BEGIN AND ;CATCH MISSING SEMI PROCEDURE RUND3: SHIFT WINDOW PAST ) AND ] AND CATCH MISSING SEMI PROCEDURE RUND5: SHIFT WINDOW AND CATCH MISSING SEMI BEFORE STATEMENTS PROCEDURE PSUEDO: PROCESS SEQUENCES OF CHECKON/OFF,LISTON/OFF,LINE PROCEDURE ERREAD: SHIFT WINDOW AFTER ERROR, TRY TO RESTORE CONTEXT PROCEDURE COBBLE: PROCESS BRACKET PAIRS WHILE ERREADING IN DECLARATIONS PROCEDURE DESCEND: PROCESS TEXT BETWEEN (),[] AND BEGIN-END PROCEDURE FAIL: PRINT DIAGNOSTIC AND SET ERROR FLAGS PROCEDURE ERRLEX: SET SYM TO AN ALWAYS INCORRECT LEXEME PROCEDURE SEMERR: GIVE SEMANTICS ERROR DIAGNOSTIC PROCEDURE F1: PRINT DIAGNOSTIC FOR ILLEGAL STATEMENT SELECT PROCEDURE F2: PRINT DIAGNOSTIC FOR DECLARATION OUT OF ORDER PROCEDURE F3: PRINT DIAGNOSTIC FOR ILLEGAL EXPRESSION SELECT PROCEDURE F4: PRINT DIAGNOSTIC FOR ILLEGAL DESIG. EXP SELECT PROCEDURE F5: PRINT DIAGNOSTIC FOR ILLEGAL USE OF ASSINGMENT PROCEDURE BENTRY: BLOCK ENTRY ROUTINE PROCEDURE PCALL: GENERATE JSP TO SYSTEM ROUTINES PROCEDURE MJRST0: GENERATE JRST WITH ZERO ADDRESS TO BE FIXED LATER PROCEDURE TOSTACK: GENERATE CODE TO PUSH A VALUE ONTO THE STACK PROCEDURE LABREF: PROCESS LABEL REFERENCES PROCEDURE FATRUND: SHIFT WINDOW AND GOBBLE FATCOMMA IF PRESENT PROCEDURE GCOND: PROCESS EXPRESSION FOLLOWING THEN AND ELSE PROCEDURE GDOUBLE: DOUBLE LAST SUBSCRIPT VALUE FOR LONG ARRAYS PROCEDURE GSTAT: COMPLETE STATEMENT PROCESSING PROCEDURE GBOOL: PROCESS A BOOLEAN EXPRESSION ERROR MESSAGE LIST 0. PROBABLY SEMICOLON OMITTED 1. UNDECLARED IDENTIFIER 2. INCORRECT STATEMENT 3. INCORRECT EXPRESSION 4. PROBABLY OPERATOR OMITTED 5. IDENTIFIER OR CONSTANT MISSING 6. INCORRECT DESIGNATIONAL EXPRESSION 7. INCORRECT OR UNPARENTHESIZED ASSIGNMENT 8. SYMBOL NOT PERMITTED HERE 9. AMBIGUOUS USE OF COLON 10. SEMICOLON PROBABLY SUPERFLUOUS 11. ONLY LETTER STRING ALLOWED 12. THIS DELIMITER IS NOT PERMITTED BEFORE DO 13. WHILE STATEMENT IS NOT ALLOWED BETWEEN THEN AND ELSE 14. THEN MUST NOT BE FOLLOWED BY IF 15. THEN STATEMENT NOT FOUND 16. DECLARATIONS MUST BE TERMINATED BY SEMICOLON 17. THIS IS NOT ALLOWED AFTER END 18. CANNOT BE USED AS ARGUMENT 19. ARGUMENT TOO LARGE 20. PROBABLY END OMITTED 21. COMPLEX ARITHMETIC NOT IMPLEMENTED 22. DECLARATOR LONG MUST BE FOLLOWED BY REAL 23. NOT PERMITTED AS SPECIFIER 24. NOT PERMITTED AS SPECIFIER 25. INCORRECT DECLARATION OR SPECIFICATION 26. NO DECLARATION SHOULD FOLLOW PROCEDURE DECLARATION 27. IMPROPER ARRAY DELARATION OR SPECIFICATION 28. DELIMITER MUST NOT BE DECLARED OR SPECIFIED 29. PROBABLY LIST ELEMENT MISSING 30. IMPROPER DECLARATION 31. VALUE WAS ALREADY SPECIFIED 32. IMPROPER TYPE OF FORMAL IN VALUELIST 33. NON-FORMALS MUST NOT BE SPECIFIED 34. BOUND PAIR NOT FOUND 35. INCORRECT BOUND PAIR 36. PROBABLY RIGHT BRACKET OMITTED 37. TYPE DOES NOT MATCH FORWARD DECLARATION 38. :=MISSING IN SWITCH DECLARATION 39. PROCEDURE NESTING TOO DEEP 40. NOT SIMPLE IDENTIFIER IN FORMAL LIST 41. FORMAL LIST NOT PROPERLY TERMINATED 42. PROBABLY ; MISSING IN PROCEDURE HEADING 43. NOT ALL FORMALS HAVE BEEN SPECIFIED 44. INCORRECT STRUCTURED FORMAL LIST 45. UNTIL EXPRESSION NOT FOUND 46. BYTE SELECTOR NOT PERMITTED AS CONTROLLED VARIABLE 47. ASSIGNMENT DELIMITER NOT FOUND 48. DELIMITER "DO" NOT FOUND 49. ASSIGNMENT HAS NON-MATCHING TYPES 50. PROBABLY DELIMITER OMITTED 51. CANNOT BE USED AS UNARY OPERATOR 52. CANNOT BE USED AS BINARY OPERATOR 53. THEN EXPRESSION NOT FOUND 54. CONDITIONAL EXPRESSION MUST HAVE ELSE PART 55. CONDITIONAL EXPRESSION MUST BE PARENTESIZED 56. IMPROPER SEQUENCE OF DELIMITERS 57. WRONG NUMBER OF DIMENSIONS 58. TOO MANY PARAMETERS FOR STANDARD FUNCTION 59. NON-TYPE PROCEDURE AS EXPRESSION 60. MATCHING CLOSE PARENTHESIS NOT FOUND 61. INCORRECT NUMBER OF ACTUAL PARAMETERS 62. FORWARD HAS NO MATCHING DECLARATION IN SAME BLOCK 63. FORWARD DECLARATION NOT ALLOWED FOR THIS TYPE 64. FORWARD DECLARATION WAS REQUIRED 65. ASSIGNMENT HAS NON-MATCHING TYPES 66. STACK ADDRESS OVERFLOW 67. NON-INTEGER OPERAND FOR DELIMITER REM OR DIV 68. COMPLEX ARITHMETIC NOT IMPLEMENTED 69. NON-ARITHMETIC OPERAND FOR ARITHMETIC OPERATOR 70. NON-ARITHMETIC OPERAND FOR RELATIONAL OPERATOR 71. NON-BOOLEAN OPERAND FOR BOOLEAN OPERATOR 72. DELIMITER NOT REQUIRES BOOLEAN OPERAND 73. UNARY + AND - REQUIRE ARITHMETIC OPERAND 74. OVERFLOW WHILE COMBINING CONSTANTS 75. OVERFLOW IN LONG REAL OPERATION ON CONSTANTS 76. UNDEFINED RESULT FOR POWER OPERATION ON CONSTANTS 77. PARAMETER FOR STANDARD FUNCTION MUST BE ARITHMETIC 78. STANDARD FUNCTION "INT" REQUIRES BOOLEAN PARAMETER 79. STANDARD FUNCTION "BOOL" REQUIRES ARITHMETIC PARAMETER 80. PARAMETER MUST BE OF ARITHMETIC TYPE 81. FOR STATEMENT NOT ALLOWED BETWEEN THEN AND ELSE 82. SWITCH IDENTIFIER NOT ALLOWED HERE 83. EXPRESSION TOO LONG 84. IDENTIFIER DECLARED IN THIS BLOCK NOT PERMITTED 85. INCORRECT FILE OR BLOCK STRUCTURE 86. INCORRECT BLOCK STRUCTURE;TOO MANY ENDS 87. PROCEDURE INCORRECTLY TERMINATED 88. INCORRECT FILE STRUCTURE 89. EMPTY SOURCE FILE 90. INVALID CONSTANT 91. IDENTIFIER EXCEEDS 64 CHARACTERS 92. IMPROPER WORD DELIMITER 93. CHARACTER NOT LEGAL IN ALGOL 94. EXPONENT TOO SMALL 95. EXPONENT TOO LARGE 96. DECLARATION FOLLOWS STATEMENT 97. IMPROPER USE OF PERIOD 98. INTEGER CONSTANT CONVERTED TO TYPE REAL 100. EXPECTED WAS AN EXPRESSION 101. EXPECTED WAS A STATEMENT 102. EXPECTED WAS A BOOLEAN EXPRESSION 103. EXPECTED WAS A DESIGNATIONAL EXPRESSION 104. EXPECTED WAS A LABEL IDENTIFIER 105. EXPECTED WAS A LABEL IDENTIFIER 106. IDENTIFIER MUST NOT BE DECLARED OR SPECIFIED TWICE 107. BOUND PAIR EXPRESSION MUST BE ARITHMETIC 108. IDENTIFIER USED TWICE IN FORMAL LIST 109. STEP EXPRESSION MUST BE ARITHMETIC 110. UNTIL EXPRESSION MUST BE ARITHMETIC 111. INITIALIZING EXPRESSION MUST BE ARITHMETIC 112. CANNOT BE USED AS CONTROLLED VARIABLE 113. IMPROPER LEFT PART OF ASSIGNMENT 114. EXPECTED WAS A STRING EXPRESSION 115. EXPRESSION OF IMPROPER TYPE 116. EXPRESSION OF IMPROPER TYPE 117. EXPECTED WAS AN ARRAY IDENTIFIER 118. SUBSCRIPT MUST BE ARITHMETIC EXPRESSION 119. EXPECTED WAS A SWITCH IDENTIFIER 120. IMPROPER ACTUAL PARAMETER 121. EXPECTED WAS A PROCEDURE IDENTIFIER 122. SUBSCRIPT OF SWITCH DESIGNATOR MUST BE ARITHMETIC 123. VARIABLE OF IMPROPER TYPE 124. EXPECTED WAS A STRING VARIABLE 125. PARAMETER IN STANDARD FUNCTION HAS INCORRECT TYPE> REPEAT 0, < THE MACRO MODULE: 1/ GIVES THIS COMPILATION LISTING THE TITLE #, WHICH ALSO NAMES THIS MODULE'S SYMBOL TABLE FOR DDT. 2/ DECLARES AN EXTERNAL NAME B.# WHICH MUST BE DECLARED AS AN INTERN IN THE LOW SEG DATA MODULE. ALL OWN SPACE IS ALLOCATED AS AN OFFSET RELATIVE TO B.# . THE TOTAL SPACE ALLOCATED IN THE LOW SEG DATA MODULE FOR THIS MODULE IS PRINTED AT THE END OF THE ASSEMBLY. FOR THE TEST (IE DEBUG==1) VERSION LOCALS ARE ALSO ALLOCATED AS FOR OWNS INSTEAD OF BEING OFFSETS IN THE COMPILE TIME STACK. 3/ PLACES A LABEL C.# AT THE HEAD OF THE CODE FOR USE IN REFERENCING BY DDT. 4/ INITIALISES ALL THE ASSEMBLY TIME VARIABLES USED BY THE VARIOUS MACROS. > DEFINE $BASE REPEAT 0, < NOW SOME UTILITY MACROS FOR PRINTING MESSAGES AND ERRORS. ALLOWING MULTIPLE PARAMETERS TO OUR MACROS. HANDLING THE ASSEMBLY TIME STACK. > ; MACROS FOR MANIPULATING THE ASSEMBLY TIME STACK. DEFINE $PUT(SUBI) < $S'SUBI== $ITEM > DEFINE $GET(SUBI) < $ITEM==$S'SUBI > DEFINE $EXAMINE(LH,RH); EXAMINE TOP WORD OF STACK < $GET(\$$SP) LH==$ITEM_-^D18 RH==$ITEM&777777 > DEFINE $PUSH(LH,RH) <; PUSH TWO HALF WORDS ONTO THE STACK $$SP==$$SP+1 IFG $$SP-$$SPMAX,<$$SPMAX==$$SP > $ITEM== XWD LH,RH $PUT(\$$SP) > DEFINE $POP(LH,RH) <; UNSTACK TWO HALF WORDS IFE $$SP,<$ERROR()> IFN $$SP,< $GET(\$$SP) LH==$ITEM_-^D18 RH==$ITEM&777777 $$SP==$$SP-1 >> DEFINE $DEF(NAME,OFFSET) > DEFINE $DEFST(NAME,OFFSET,REG) > DEFINE $DEFLC(NAME,OFFSET,REG) > ; MACROS FOR PRINTING MESSAGES DEFINE $PRINT(A,B) < PRINTX A B > DEFINE $ERROR(A) < IF1,< PRINTX ******ERROR A ****** > $ECNT==$ECNT+1 > DEFINE $MULTP(NAME) < DEFINE NAME(A,B,C,D,E,F,G,H,I,J,K,L,A1,A2,A3,A4,A5,A6,A7,A8,A9,B1,B2,B3,B4) < %'NAME() >> $MULTP(EXPROC) $MULTP(FORWARD) $MULTP(REGISTER) $MULTP(FAKE) $MULTP(LOCAL) DEFINE $CHECK(TYPE) < $EXAMINE($TYPES,$T) IFE $TYPES&TYPE,< $ERROR() >> ; MACRO TO CHECK USER HAS DEFINED ALL WE NEED TO KNOW DEFINE $CHKDEF(L) < IF1,< IRP L,< IFB , IFNB ,< IFNDEF L,< $ERROR(< L HAS NOT BEEN GIVEN A VALUE >,) > IFDEF L,< $T== L&777777777760 IFN $T,< $ERROR(< L HAS AN INVALID VALUE >,) >>>>>> REPEAT 0, < NOW WE DEFINE A MACRO TO ALLOCATE VALUES TO OUR ASSEMBLY TIME CONSTANTS. WE USE THEM TO RECORD WHAT CONSTRUCTS WE EXPECT TO SEE. > DEFINE $SETCON(I) < $T==1 IRP I,< IFB , IFNB ,< $'I==$T $T==$T_1 >>> $SETCON() $STMSTART==$BEGIN+$REGIS+$LOC+$THEN+$ELSE+$LOOP+$DO+$NEW ; NOW SOME MACROS WHICH ARE USED TO PURGE THE SYMBOL TABLE ; OF ALL THE ASSEMBLY TIME RUBBISH WE GENERATED AT THE END OF PASS 2 DEFINE $DELSTACK(INDEX) DEFINE $ENDALL < $Q==$MCNT; IF2,< $T==0 REPEAT $$SPMAX,<$DELSTACK(\$T) $T==$T+1> > XLIST LIT LIST > DEFINE %EXPROC(A) < IRP A,< IFB , IFNB ,< IFNDEF A,< DEFINE A < PUSHJ SP,.'A;* >> EXTERNAL .'A; >>> DEFINE %FORWARD(A) < IRP A,< IFB , IFNB ,< DEFINE A < PUSHJ SP,.'A;* >>>> DEFINE $OWNN(I) < IRP I,< IFB , IFNB ,< I==$MCNT+$BASE $MCNT==$MCNT+1 >>> DEFINE OWN(A,B,C,D,E,F,G,H,I,J,K,L) < $OWNN() > DEFINE %REGISTER(R) < IRP R,< IFB , IFNB ,< R==RBASE-$RCNT $PUSH($REGIS,$RCNT) PUSH SP,R;* $RCNT==$RCNT+1 $LRCNT==$LRCNT+1 >> ; END OF IRP IFG $RCNT-RMAX,< $ERROR()> > DEFINE NEWLOP < PUSH SP,LLEXEX;* PUSH SP,LCOMPNAME;* $NEWCT==2 $PUSH($NEW,0) > DEFINE PROCEDURE(A) < $PLEVEL==$PLEVEL+1 IFG $PLEVEL-PMAX,< $ERROR() > $PUSH($NEWCT,$NEWCT) $PUSH($LCNT,$LRCNT) $PUSH($PROC,$RCNT) $LRCNT==0 $LCNT==0 $RCNT==0 $NEWCT==0 IFNDEF A,< DEFINE A < PUSHJ SP,.'A;* >> .'A:;* INTERN .'A;* > DEFINE BEGIN < $PUSH($BEGIN,0) > EXTERN .STOVERFLOW; DEFINE %FAKE(I) <$T==0 IRP I,< IFB , IFNB ,< $DEFLC (I,\$T,\DBASE) $T==$T+1 >>> DEFINE %LOCAL(I) < IFN $PLEVEL-PMAX,< $T==DBASE+$PLEVEL-1 > IFE $PLEVEL-PMAX,< ;ACCESS LOCALS BY STACK POINTER $T==SP > IRP I,< IFB , IFNB ,< $DEFLC(I,\$LCNT,\$T) $LCNT==$LCNT+1 >> ; END OF IRP IFG $LCNT,< $PUSH($LOC,0) IFN $PLEVEL-PMAX,< ; SAVE OLD DISPLAY PUSH SP,$T;* HRLI $T,(SP);* > $.==$LCNT ADD SP,[XWD $.,$.];* JUMPL SP,.+2;* JSR .STOVERFLOW;* IFN $PLEVEL-PMAX,< ; SET UP NEW DISPLAY HRR $T,SP;* >>> DEFINE FORMAL(F) < $T==$LCNT+$LRCNT+$NEWCT IFN <$PLEVEL-PMAX>*$LCNT,< ; ACCOUNT FOR PUSHED DISPLAY REG $T==$T+1 > $DEFST(F,\$T,\SP); > DEFINE ENDD < $POP($TYPES,$T) IFE $TYPES-$LOC,< $.==$LCNT SUB SP,[XWD $.,$.];* IFN $PLEVEL-PMAX,<; UPDATE DISPLAY $T==DBASE+$PLEVEL-1 POP SP,$T;* > $POP($TYPES,$T) > IFE $TYPES-$REGIS,< REPEAT $LRCNT,< $T==RBASE-$T POP SP,$T;* $POP($TYPES,$T)>> IFE $TYPES-$NEW,< POP SP,LCOMPNAME;* POP SP,LLEXEX;* $POP($TYPES,$T) > IFN $$SP,< $EXAMINE($TYPES,$T) IFE $TYPES-$PROC,< POPJ SP,0;* $POP($TYPES,$RCNT) $POP($LCNT,$LRCNT) $POP($NEWCT,$NEWCT) $PLEVEL==$PLEVEL-1 >> IFE $$SP,< $ENDALL >> ; MACROS FOR HANDLING CREATED LABELS DEFINE $PLAB(A,B) < ; PLACE A CREATED LABEL FORMED BY CONCATENATING A AND BLAL $'B'A: ;* XALL > DEFINE $JLAB(A,B) < ; GENERATE A JUMP TO THE CREATED LABEL JRST $'B'A;* > DEFINE $UNDEFTF(TYPE) < ; REMOVE TRUE AND FALSE DEFS. IFE TYPE,<$ERROR()> DEFINE TRUE< ERROR;* $ERROR() > DEFINE FALSE< ERROR;* $ERROR() >> DEFINE $DEFTF(TT) < ; MACRO TO DEFINE THE TRUE AND FALSE LABELS $TCNT==0 $FCNT==0 DEFINE TRUE < $'TT'T;* $TCNT==$TCNT+1 > DEFINE FALSE < $'TT'F;* $FCNT==$FCNT+1 >> REPEAT 0, < MACROS FOR THE "IF THEN FI" AND "IF THEN ELSE FI" STATEMENTS "IF"DEFINE TRUE==T.N,FALSE==F.N .BE. "THEN"T.N: .STRUE. "FI"F.N: OR FOR IF THEN ELSE FI :- "IF"DEFINE TRUE==T.N,FALSE==F.N .BE. "THEN"T.N: .STRUE. "ELSE"JRST S.N F.N: .SFALSE. "FI"S.N: > DEFINE IF(TEXT) < $BTYPE==$IF $LABCNT==$LABCNT+1 $PUSH($IF,$LABCNT) $DEFTF(\$LABCNT)> DEFINE THEN < $UNDEFTF($FCNT) $POP($TYPES,$T); UNSTACK LAST ITEM $PLAB(,\$T); AND PLACE IT HERE $PUSH($THEN,$T); AND CHANGE TYPE TO THEN. > DEFINE ELSE < $POP($TYPES,$T); UNSTACK LAST ITEM $JLAB(,\$T); GENERATE THE JUMP PAST THE ELSE PART $PUSH($ELSE,$T); STACK AWAY THE ELSE LABEL. $PLAB(,\$T); PLACE LABEL FOR ELSE DESTINATION. > DEFINE FI < $POP($TYPES,$T); UNSTACK LAST ITEM IFE $TYPES-$ELSE<; WE HAD AN ELSE PART $PLAB(,\$T); PALE THE SKIP LABEL > IFE $TYPES-$THEN,<; WE ONLY HAD A THEN PART $PLAB(,\$T); PLACE THE FALSE LABEL. >> REPEAT 0, < MACROS FOR WHILE ... DO ... OD CONSTRUCT "WHILE"DEFINE TRUE==T.N,FALSE==F.N W.N: .BE. "DO"T.N: .STAT. "OD"JRST W.N F.N: > DEFINE WHILE(TEXT) < $BTYPE==$WHILE $LABCNT==$LABCNT+1 $PLAB(,\$LABCNT) $PUSH($WHILE,$LABCNT) $DEFTF(\$LABCNT)> DEFINE DO < $POP($TYPES,$T) $UNDEFTF($FCNT) $PLAB(,\$T) $PUSH($DO,$T)> DEFINE OD < $POP($TYPES,$T) $JLAB(,\$T) $PLAB(,\$T)> REPEAT 0,< MACROS FOR THE LOOP AS SA CONSTRUCT "LOOP"T.N: .STAT. "AS"DEFINE TRUE==T.N,FALSE==F.N .BE. "SA"F.N: > DEFINE LOOP < $LABCNT==$LABCNT+1 $PLAB(,\$LABCNT) $PUSH($LOOP,$LABCNT)> DEFINE AS(TEXT) < $BTYPE==$AS $POP($TYPES,$T) $DEFTF(\$T) $PUSH($AS,$T)> DEFINE SA < $POP($TYPES,$T) $PLAB(,\$T) $UNDEFTF($TCNT)> OPDEF GOTO [JRST 0,0] OPDEF NOOP [JFCL 0,0] DEFINE INCR(LOCN) < AOS LOCN;* > DEFINE DECR(LOCN) < SOS LOCN;* > DEFINE SETT(LOCN) < SETOM LOCN;* > DEFINE SETF(LOCN) < SETZM LOCN;* > DEFINE ZERO(LOCN) < SETZM LOCN;* > DEFINE MODULE(N) < Q.'N==$Q; EXTERNAL B.'N; INTERNAL C.'N,Q.'N; C.'N: DEFINE $BASE %TITLE(N,ALGOL COMPILER MODULE N) ; SET UP SOME CHECKS: $CHKDEF() ; SET UP ASSEMBLY TIME VARIABLES: $ECNT==0 ; NUMBER OF MACRO ERRORS FOUND $LABCNT==0 ; UNIQUE LABEL COUNTER $$SP==0 ; ASSEMBLY TIME STACK POINTER $$SPMAX==0 ; RECORD OF MAX OF $$SP $PLEVEL==0 ; DEPTH OF PROCEDURE NESTING $ALLOW==0 ; RECORD OF WHICH CONSTRUCTS ARE ALLOWED ; COUNTERS USED FOR SPACE ALLOCATION: $NEWCT==0 ; LEFTOP REGISTER $LCNT==0 ; LOCALS $LRCNT==0 ; REGISTERS LOCAL TO PROCEDURES $RCNT==0 ; REGISTERS LOCAL TO CURRENT PROCEDURE $MCNT==0 ; LOW SEGMENT AREA FOR OWNS AND NON STACK ; VERSION LOCALS > ; END OF MODULE MACRO EXTERN NSYM; ;NEXT SYMBOL EXTERN NDEL; ;NEXT DELIMITER EXTERN BLOCKLEVEL; ;CURRENT BLOCKLEVEL EXTERN FNLEVEL; ;CURRENT FUNCTION LEVEL EXTERN STBB; ;SYMBOL TABLE BASE FOR THIS BLOCK EXTERN NASTE; ;NEXT AVAIL. SYMBOL TABLE ENTRY EXTERN NACTE; ;NEXT AVAIL. CONSTANTS TABLE ENTRY EXTERN NAFTE; ;NEXT AVAILABLE FIXUP TABLE ENTRY; EXTERN FIXUP; ;BASE OF FIXUP TABLE; EXTERN CONTAB; ;CONSTANT TABLE BASE; EXTERN CAX; ;PROCEDURE LEVEL OF LAST ACCESSED NON-LOCAL EXTERN RA; ;RELATIVE ADDRESS OF NEXT INSTRUCTION PLACED IN OBCODE EXTERN LEXBLOCK; ;MONOTONICALLY INCREASING COUNT OF BLOCKS EXTERN CURBLOCK; ;LEXBLOCK OF CURRENT BLOCK EXTERN ARDEC; ;ARRAY DECLARED IN BLOCK: TRUE; ELSD FALSE EXTERN PROSKIP; ;PROCEDURE FOUND SWITCH (-1 NONE FOUND) OR ADDR OF FIRST ONE EXTERN LINENO; ;LINE NUMBER SPECIFIED BY LINE PSEUDO-STATEMENT EXTERN INDEX; ;FIRST AVAILABLE FREE WORD IN TEMPCODE EXTERN HANDLE; ;PORTION POINTER FOR CURRENTLY OPEN PORTION EXTERN LEXEX; ;BLOCKLEVEL & HANDLE FOR SYM * THESE EXTERN COMPNAME; ;COMPOSIT NAME FOR SYM * MUST EXTERN LLEXEX; ;BLOCKLEVEL & HANDLE FOR LEFT OP* APPEAR EXTERN LCOMPNAME; ;COMPOSIT NAME FOR LEFT OP * TOGETHER EXTERN LAC; ;LAST ALLOCATED ACCUMULATOR EXTERN TCBASE; ;THE FIRST LOCATION OF TEMPCODE BUFFER. EXTERN TCMAX; ;THE LAST LOCATION OF TEMPCODE BUFFER. EXTERN THUNK; ;ADDRESS OF JRST OVER THUNKS (0 IF NONE YET.); EXTERN OP; ;CONTAINS THE OPERATOR DURING CODE GENERATION; EXTERN KA; ;COMUNICATIONS CELL FOR GLOAD AND LOAD; EXTERN FBSYMSAVE; ;SAVED STEP ELEMENT LEXEME EXTERN FBLEXSAVE; EXTERN FBCOMPSAVE; EXTERN PREFACC; ;PREFERED REGISTER FOR CGINCR SUBTTL GLOBAL BOOLEANS ;THIS MACRO DEFINES THE BIT POSITIONS OF VARIOUS BOOLEAN VARIABLES ;WHICH OCCUPY A GLOBAL FLAG WORD. THESE VARIABLES ARE TESTED BY ;MACROS NAMED "TGB" AND "TNGB". DEFINE GB(BVAR) BVBIT==1 GB ERRL; ;SCANNING IN ERROR LEVEL GB ERRF; ;FATAL ERROR FOUND. NO CODE GENERATED GB BPAIR; ;SCANNING TEXT WITHIN ARRAY DECLARATION BOUND PAIR GB DECLAR; ;SCANNING DECLARATIONS. LSCAN ONLY SEARCHES TOP LEVEL GB LISTOO; ;LIST ON/LIST OFF FLAG GB LNOO; ;LINE NUMBERS ON/ LINE NUMBERS OFF FLAG GB ACOO; ;ARRAY SUBSCRIPT CHECKING ON/OFF FLAG GB NOENTRY; ;SEARCH ROUTINE BEING USED ONLY FOR LOOKUP GB OBOO; ;OBJECT CODE LISTING ON/OFF FLAG GB ACON; ;ARRAY SUBSCRIPT-CHECKING FORCED ON BY SWITCH GB ACOFF; ;ARRAY SUBSCRIPT-CHECKING FORCED OFF BY SWITCH GB CREF; ;OUTPUT CREF DATA GB TRPOFF; ;DON'T TRACE PROCEDURES GB TRLOFF; ;DON'T TRACE LABELS GB TRON; ; PLANT P-M BLOCKS FOR PROCEDURES ONLY GB TRLB; ; PLANT P-M BLOCKS FOR LABELS AND PROCS SUBTTL REGISTER ASSIGNMENTS ;COMPILE-TIME REGISTERS FL==0; ;GLOBAL BOOLEAN REGISTER T==A1; ;TEMPORARY REGISTER T1==A2; ;TEMPORARY REGISTER T2==A3; ;TEMPORARY REGISTER T3==A4; ;TEMPORARY REGISTER T4==A5; ;TEMPORARY REGISTER T5==A6; ;TEMPORARY REGISTER REV==A6; ;PORTION REVERSAL DISPLACEMENT REGISTER STOPS==A7; ;FLAG REGISTER INDICATING PENDING STOPPERS (DELIMS) DBASE==A10; ;FIRST DISPLAY REGISTER - STACK VERSION ;DBASE+1 ;SECOND DISPLAY REGISTER - STACK VERSION ;A12-A14 ;LOCAL REGISTERS LOP==14; ;LEXEME OF LEFT OPERAND DEL==15; ;DEL FRAME OF WINDOW SYM==16; ;SYM FRAME OF WINDOW PMAX==3; ;LIMIT ON PROCEDURE LEVELS RMAX==3; ;LIMIT ON LOCAL REGISTERS RBASE==14; ;FIRST LOCAL REGISTER - ALLOC. DOWNWARD ANYAC==15; ;ANYAC PASSED TO LOAD MEANS CHOOSE ANY ACC SUBTTL DEFINITION OF SUPPORT ROUTINES DISPATCH OFFSETS ; ***** THESE MUST AGREE WITH DEFINITION OF IN ALGSYS ***** PARAM==1 GOLAB==3 ARRAY==4 OARRAY==5 CHKARR==6 COMPAR==7 PBYTE==10 BLKBEG==11 BLKEND==12 STRASS==47 TRLAB==52 ; TRACE LABELS STRDEC==54 ; DEFINE STRING SUBTTL DELIMITER LEXEME DEFINITIONS ;THIS MACRO DEFINES THE CONFIGURATIONS OF THE DELIMITER LEXEMES. ;THE ARGUMENTS HAVE THE FOLLOWING MEANING: ;ROOT THE SUFFIX TO BE USED WHEN REFERING TO THIS DELIMITER ;PRIORITY PRIORITY OF OPERATORS AND OTHER DELIMITERS FOR PARSING ; IN THE OPERATOR SYNTAX ROUTINE (SOP). ;DISPATCH VALUE OF INDEX INTO TRANSFER VECTORS USED BY THE 'SEL ; ROUTINES. NOTE: SOME VALUES ARE SHARED BY DIS- ; JOINT CLASSES. ;DISCRIMINATION A FIELD USED TO UNIQUELY DISCRIMINATE DELIMITERS WHICH ; WOULD OTHERWISE BE THE SAME (E.G. RELATIONALS) ;OTHER FIELD ACCEPTING ANY 36-BIT VALUE, USED TO SET OTHER ; FLAGS DEFINE DD(ROOT,PRIORITY,DISPATCH,DISCRIMINATION,OTHER) < $ITEM==0 IFN $STOPPER, $ITEM==$ITEM!$SBIT .'ROOT==$SBIT $SBIT==$SBIT_1> IFN $KWSTST,<$ITEM==$ITEM!KWSTST> IFN $SYMSTST,<$ITEM==$ITEM!SYMSTST> IFN $DECSPEC,<$ITEM==$ITEM!DECSPEC> IFN $EXPCONT,<$ITEM==$ITEM!EXPCONT> RADIX 10 IFNB ,<$PRIOR==PRIORITY> IFNB ,<$DC==DISPATCH> IFNB ,<$DISC==DISCRIMINATION> RADIX 8 IFNB ,<$ITEM==$ITEM!OTHER> $ITEM==$ITEM!$DC!<$PRIOR_4>!<$DISC_^D8> EXTERN Z'ROOT INTERN L$'ROOT,R$'ROOT L$'ROOT==$ITEM_-^D18 R$'ROOT==$ITEM&777777> ;MACRO TO YIELD DISCRIMINATION VALUE OF GIVEN ROOT DELIMITER. DEFINE DESC(ROOT) $STOPPER==0 $EXPCONT==0 $KWSTST==0 $SYMSTST==0 $DECSPEC==0 $SBIT==1B12 ERRST==1B13 ;==1 IF DELIM. MAY RESTART SYNTAX PROCESSING DURING ERROR READ EXPCONT==1B14 ;==1 IF DELIM. MAY FOLLOW EXPRESSION (WHILE TREATED SEPARATELY) KWSTST==1B15 ;==1 IF DELIM. IS KEY WORD STATEMENT START SYMSTST==1B16 ;==1 IF DELIM IS SYMBOL STATEMENT START DECSPEC==1B17 ;==1 IF DELIM. IS A DECLARATION OR SPECIFICATION WORD ;THE NULL DELIMITER ;WARNING: THE NULL DELIMITER MUST BE ALL ZEROS. DD PHID,0,0,0; DELIMITER: THE NULL DELIMITER ;SYMBOL STATEMENT STARTS (EXCEPT COLON) $SYMSTST==1 $EXPCONT==1 DD ASS,2,8; DELIMITER: "_" DD LBRA,12,1,,ERRST; DELIMITER: "[" DD LPAR,12,2,,ERRST; DELIMITER: "(" DD DOT,13,9; DELIMITER: "." ;KEY WORD STATEMENT STARTS (EXCEPT WHILE) $SYMSTST==0 $EXPCONT==0 $KWSTST==1 DD IF,0,3; DELIMITER: "IF" DD BEGIN,,10,,ERRST; DELIMITER: "BEGIN" DD FOR,,11; DELIMITER: "FOR" DD GOTO,,12; DELIMITER: "GOTO" ;PSEUDO-STATEMENT. ALLOWED AS BOTH DECL/SPECS AND STATEMENTS $DECSPEC==1 DD LON,,14,0; DELIMITER: "LISTON" DD LOFF,,,3; DELIMITER: "LISTOFF" DD CON,,,7; DELIMITER: "CHECKON" DD COFF,,,10; DELIMITER: "CHECKOFF" DD LINE,,,12; DELIMITER: "LINE" ;WHILE IS BOTH A KEYWORD STATEMENT START AND EXPRESSION STOPPER $DECSPEC==0 $STOPPER==1 DD WHILE,0,7,0; DELIMITER: "WHILE" ;COLON IS BOTH A SYMBOL STATEMENT START AND EXPRESSION STOPPER $KWSTST==0 $SYMSTST==1 $EXPCONT==1 DD COLON,0,13; DELIMITER: ":" ;THE REST OF THE EXPRESSION STOPPERS $SYMSTST==0 DD THEN,0,0; DELIMITER: "THEN" DD DO,,,,ERRST; DELIMITER: "DO" DD RBRA; DELIMITER: "]" DD RPAR; DELIMITER: ")" DD COM; DELIMITER: "," DD ELSE; DELIMITER: "ELSE" DD SC; DELIMITER: ";" DD END; DELIMITER: "END" DD EOF; DELIMITER: END OF FILE DD STEP,,5; DELIMITER: "STEP" DD UNTIL,,6; DELIMITER: "UNTIL" ;THE FOLLOWING VARIABLE DESCRIBES THE CLASS OF STOPPERS WHICH ;CANNOT BE "ACTIVE" AT THE TOP LEVEL OF THE PROGRAM (STMT LEVEL) NOTTOP==.THEN!.DO!.RBRA!.RPAR!.STEP!.UNTIL!.WHILE ;THE FOLLOWING VARIABLE DESCRIBES THE CLASS OF STOPPERS WHICH ;ARE EXPUNGED FROM STOPS WHEN NONSENSE DELIMITER ;IS FOUND DURING EXPRESSION SELECTION...(SEE F3 & F4). EXPUNGE==.WHILE!.COLON!.COM!.STEP!.UNTIL ;DECLARATION DELIMITERS $STOPPER==0 $EXPCONT==0 $DECSPEC==1 DD EXTERNAL,0,15,0,0; DELIMITER: "EXTERNAL" DD OWN,,,1,1_15; DELIMITER: "OWN" DD FORWARD,,,2,2_15; DELIMITER: "FORWARD" DD LABEL,,,3,3_15; DELIMITER: "LABEL" DD VALUE,,,4,3_15; DELIMITER: "VALUE" DD ARRAY,,,5,4_15; DELIMITER: "ARRAY" DD PROCEDURE,,,6,5_15!ERRST; DELIMITER: "PROCEDURE" DD SWITCH,,,7,6_15; DELIMITER: "SWITCH" DD LONG,,,8,7_15; DELIMITER: "LONG" DD REAL,,,9,10_15; DELIMITER: "REAL" DD INTEGER,,,10,10_15; DELIMITER: "INTEGER" DD BOOLEAN,,,11,10_15; DELIMITER: "BOOLEAN" DD STRING,,,12,10_15; DELIMITER: "STRING" DD COMPLEX,,,13,10_15; DELIMITER: "COMPLEX" ;NAMES OF CALL SITES AND TEST PATTERNS OTHEN==1 OACTUAL==2 ;OPERATOR DELIMITER LEXEMES $DECSPEC==0 $EXPCONT==1 $ODROP==100000; BIT FOR REVERSIBLE OPERATOR $ODCOP==200000; BIT FOR COMMUTATIVE OPERATOR DD POW,11,4,00; DELIMITER: "^" DD TIMES,10,,11,$ODCOP!$ODROP; DELIMITER: "*" DD DIV,10,,15; DELIMITER: "DIV" DD SLASH,10,,16; DELIMITER: "/" DD REM,10,,17; DELIMITER: "REM" DD UMINUS,10,,21; DELIMITER: UNARY "-" DD UPLUS,10,,22; DELIMITER: UNARY "+" DD PLUS,9,,24,$ODCOP!$ODROP; DELIMITER: "+" DD MINUS,9,,28; DELIMITER: "-" DD LSS,8,,33,$ODROP; DELIMITER: "<" DD GTR,8,,35,$ODROP; DELIMITER: ">" DD LEQ,8,,39,$ODROP; DELIMITER: "<==" DD GTE,8,,41,$ODROP; DELIMITER: ">==" DD EQ,8,,45,$ODCOP!$ODROP; DELIMITER: "==" DD NE,8,,47,$ODCOP!$ODROP; DELIMITER: "#" DD NOT,7,,49; DELIMITER: "NOT" DD AND,6,,50,$ODCOP!$ODROP; DELIMITER: "AND" DD OR,5,,51,$ODCOP!$ODROP; DELIMITER: "OR" DD IMP,4,,52,$ODROP; DELIMITER: "IMP" DD EQV,3,,53,$ODCOP!$ODROP; DELIMITER: "EQV" ;OPERATOR DELIMITER FIELDS $OPDSP==000017; ; DISPATCH FIELD $RELPR==000200; ; VALUE OF PRIORITY FIELD FOR RELATIONS (8) $OPPRI==000360; ; PRIORITY FIELD $OPDSC==077400; ; DISCRIMINATION FIELD (INDEX INTO OPCODE TABLE) SUBTTL SYMBOL LEXEME MASKS AND VALUES ;SYMBOL TABLE EXTENDED BIT (BIT 0) $X==400000 ;MESSAGE GIVEN FOR UNDECLARED SYMBOL (BIT 1) $MSG==200000 ;BLOCK LEVEL (BITS 3-11) $BL==077700 ;PROCEDURE LEVEL (BITS 12-17) $PL==000077 ;DYNAMIC BIT (FOR PARAM. DESCRIP. WORD) (BIT 0) $DYN==400000 ;SERRL FIELD (BIT 0) $SERRL==400000 $IDI==006000 $PHI==077000 ;COMPOUND TYPE BITS $TRANK==030000 ; TYPE RANK -- INDEX FOR INTEGER, REAL, LONG REAL ;DECLARE FIELD (BIT 12) $DECL==000040 ;ADDRESS MODES (BITS 13-17) $AM==000037 $FIX==000000 ; FIXED -- NO PROCESSING NEEDED $IMM==000001 ; IMMEDIATE CONSTANT $CT==000003 ; CONSTANT IN CONSTANT TABLE $PVAL==000006 $ST==000007 ; SIMPLE VARIABLE IN SYMBOL TABLE $ACC==000014 ; EXPRESSION IN ACC $SP==000022 ; EXPRESSION IN STACK $AMPRV==000026 ; INDEXED BY ACC PREVIOUS TO ACC FIELD $PRV==000026 ; INDEXED BY ACC PREVIOUS TO ACC FIELD $SELF==000027 ; INDEXED BY ACC IN ACC FIELD $ISP==000032 ; INDIRECT STACK POINTER FOR PTR IN STACK $NEXT==000033 ; INDEXED BY ACC NEXT TO ACC FIELD $PTR==000034 ; POINTER TO SUBSC. VAR. IN ACC $REL==000035 ; RELOCATABLE ADDRESS $RA==000036 $AX==000037 ; INDEXED BY AX $PCT==000037 ;COMPOUND ADDRESS MODE BITS $AMAC==000003 ; NOT IN ACC $STACK==000005 ; NOT ON STACK $INDC==000020 $ABS==000022 ; NON-RELOCATABLE (IMM OR ACC) $SINGL==000030 ; CONSTANT OR SIMPLE VARIABLE $CONST==000034 ; IMMEDIATE OR TABLED CONSTANT ;LEXEX FIELDS $LEXSA==000777 ; STACK ADDRESS $LEXBL==777000 ; BLOCK LEVEL ;LONG BIT - USED IN DECSPEC FOR ASSEMBLING LEXEMES $LONGBIT==000001 SUBTTL OPDEFS FOR PSEUDOS ;LONG REAL MOVE PSEUDOS OPDEF LMOVE [700_33] OPDEF LMOVEM [702_33] OPDEF LMOVN [710_33] OPDEF LMOVNM [712_33] OPDEF LPUSH [701_33] OPDEF DPUSH [701_33] OPDEF LMOVM [714_33] ;TEMPCODE MACRO INSTRUCTIONS OPDEF TCTHEN [703_33] OPDEF TCELSE [704_33] OPDEF TCFI [705_33] OPDEF TCTO [706_33] OPDEF TCOT [707_33] OPDEF TCTYDES [711_33] OPDEF TCSF [713_33] OPDEF TCADDFIX [740_33] ;LONG REAL OPERATION PSEUDOS OPDEF LFAD [716_33] OPDEF LFSB [717_33] OPDEF LFMP [720_33] OPDEF LFDV [721_33] OPDEF RLFSB [722_33] OPDEF RLFDV [723_33] ;POWER PSEUDOS OPDEF POWR1 [724_33] OPDEF POWR2 [725_33] OPDEF POWR3 [726_33] OPDEF POWR4 [727_33] OPDEF POWR5 [730_33] ;CONVERSION PSEUDOS OPDEF CIR [731_33] OPDEF CIL [732_33] OPDEF CRI [733_33] OPDEF CRL [734_33] OPDEF CLI [735_33] OPDEF CLR [736_33] OPDEF ELI [737_33] SUBTTL UTILITY TEST MACROS: $HALVE,TEST,SETONE,SETZERO ;THE FOLLOWING MACROS ARE USED AS UTILITY MACROS IN THE SENSE ;THAT THEY ARE USED BY OTHER MACROS. ; THESE MACROS TAKE A 36-BIT MASK AS ARGUMENT: ; ONE HALF OF MASK MUST BE ZERO ; THE OTHER HALF IS USED AS IMMEDIATE DATA ;MACRO TO SPLIT 36-BIT MASK INTO LEFT HALF AND RIGHT HALF. DEFINE $HALVE(BITS) < LH==_-^D18 RH==&777777 IFN LH*RH,<$ERROR(BOTH HALVES OF IMMEDIATE ARE NON-ZERO) >> ;TEST FOR COND(BLANK,E,A,N) IN REG AGAINST NON-ZERO HALF OF BITS DEFINE TEST(COND,REG,BITS) < $HALVE(BITS) IFN LH,< TLN'COND REG,LH;* >IFN RH,< TRN'COND REG,RH;* >> ; SET CELLS OF REG MASKED BY NON-ZERO HALF OF BITS TO ONES DEFINE SETONE(REG,BITS) < $HALVE(BITS); IFN LH,< TLO REG,LH;* >IFN RH,< IORI REG,RH;* >> ;SET CELLS OF REG MASKED BY NON-ZERO HALF OF BITS TO ZEROS DEFINE SETZERO(REG,BITS) < $HALVE(BITS); IFN LH,< TLZ REG,LH;* >IFN RH,< ANDCMI REG,RH;* >> SUBTTL MACROS FOR DEFINING MACRO PREDICATES USED IN BOOLEAN EXP'S ;THE FOLLOWING TWO MACROS ARE USED TO DEFINE MACRO PREDICATES ;DEFBOOL(NAME,T) DEFINES A MACRO NAMED "NAME" WHICH HAS ; ONE ARGUMENT (A BIT PATTARN). "NAME" WILL TEST ; REGISTER T AND SKIP IF ANY SELECTED BITS ON ; OTHERWISE, IT WILL GOTO FALSE (OR TRUE) DE- ; PENDING ON THE TYPE OF STATEMENT IN WHICH THE ; BOOLEAN OCCURS (AS IS DIFFERENT FROM WHILE & IF) ;DEFNBOOL(NAME,T) SAME AS DEFBOOL EXCEPT THE TEST IS MADE ON ; THE OPPOSITE CONDITION DEFINE DEFBOOL(NAME,REG) < DEFINE NAME(BITS) < IFN $BTYPE-$AS,IFE $BTYPE-$AS,>> DEFINE DEFNBOOL(NAME,REG) < DEFINE NAME(BITS) < IFN $BTYPE-$AS,IFE $BTYPE-$AS,>> SUBTTL DEFINITION OF MACRO PREDICATES: TEL,TNEL,DELEL,DELNEL,NDELEL,NDELNEL,TGB,TNGB ;BOOLEAN..."T IS AN ELEMENT OF BIT.ENCODED.SET" DEFBOOL(TEL,T); ;BOOLEAN..."T IS NOT AN ELEMENT OF BIT.ENCODED.SET" DEFNBOOL(TNEL,T); ;BOOLEAN..."DEL IS AN ELEMENT OF BIT.ENCODED.SET" DEFBOOL(DELEL,DEL); ;BOOLEAN..."DEL IS NOT AN ELEMENT OF BIT.ENCODED.SET" DEFNBOOL(DELNEL,DEL); ;BOOLEAN..."NDEL IS A MEMBER OF A BIT ENCODED SET" DEFINE NDELEL(BITS) < MOVE T,NDEL;* TEL(BITS) > ;BOOLEAN..."NDEL IS NOT AN ELEMENT OF A BIT ENCODED SET" DEFINE NDELNEL(BITS) < MOVE T,NDEL;* TNEL(BITS) > ;BOOLEAN..."ONE OF A SET OF GLOBAL BOOLEANS IS TRUE" DEFBOOL(TGB,FL) ;BOOLEAN..."ALL OF A SET OF GLOBAL BOOLEANS ARE FALSE" DEFNBOOL(TNGB,FL) ;SET GLOBAL BOOLEANS (GB) TRUE DEFINE STRUE(BITS) < SETONE(FL,BITS) > ;SET GLOBAL BOOLEANS FALSE DEFINE SFALSE(BITS) < SETZERO(FL,BITS) > SUBTTL DEFINITION OF SSEL,ESEL AND LSEL ;THE FOLLOWING MACROS DEFINE THREE MACROS CALLED SSEL,ESEL AMD LSEL ;THE FOUR SELECTION MACROS ARE DEFINED AS FOLLOWS ;ESEL PROCESSES THE SYNTACTIC CONSTRUCTIONS: ; AND ;SSEL PROCESSES THE SYNTACTIC CONSTRUCTION: ; ;LSEL PROCESSES THE SYNTACTIC CONSTRUCTION: ; ;SINCE THESE SYNTACTIC CONSTRUCTIONS CAN APPEAR IN MANY CONTEXTS IN ;AN ALGOL PROGRAM, IT IS HELPFUL FOR THE 'SEL ROUTINE TO KNOW WHERE ;IT IS BEING CALLED FROM. THE FORMAL PARAMETER "SITE" SUPPLIES THIS ;INFORMATION. (THE SITE IS USELESS FOR FSEL, BUT IS PROVIDED FOR ;REASONS OF CONSISTENCY.) EACH MACRO HAS THE SAME STRUCTURE. THE ;WHILE TESTS EACH DELIMITER ENCOUNTERED TO DETERMINE WHETHER OR NOT ;IT IS A CLOSING DELIMITER FOR SOME OUTER ENCLOSING (DYNAMICALLY) ;PROCEDURE IF SO, THE 'SEL RETURNS TO ITS CALLER. OTHERWISE, IF ;ERROR LEVEL IS ON (INDICATING THAT A SYNTACTICALLY MALFORMED CON- ;STRUCTION HAS BEEN FOUND), THEN THE CONSTRUCTION IS PROCESSED BY ;ERREAD, UNTIL A TERMINATING DELIMITER IS FOUND. IF EVERYTHING IS OK, ;THEN THE PROPER SYNTAX ROUTINE FOR HANDLING THE DELIMITER CURRENTLY ;IN "DEL" IS CALLED USING A TRANSFER VECTOR. EACH 'SEL ;HAS ITS OWN TRANSFER VECTOR WHICH GUARANTEES THAT ONLY LEGAL ;ROUTINES ARE CALLED. ;IF SITE IS AN UNDEFINED SYMBOL (EG. IN CASE NO ROUTINE EVER ;TESTS AGAINST IT) THEN THE SELECT ROUTINE WILL IGNORE IT. DEFINE SSELECT(SITE) < TRNN FL,TRPOFF;* PUSHJ SP,.ESBLK##;* LDB T,DCBYTE;* PUSHJ SP,@STABLE(T);* NOOP .SSEL!SITE;* > DEFINE ESELECT(SITE) < LDB T,DCBYTE;* PUSHJ SP,@ETABLE(T);* NOOP .ESEL!SITE;* > DEFINE LSELECT(SITE) < LDB T,DCBYTE;* PUSHJ SP,@LTABLE(T);* NOOP .LSEL!SITE;* > DEFINE FSELECT(SITE) < LDB T,DCBYTE;* PUSHJ SP,@FTABLE(T);* > ;IDENTIFICATION BITS FOR SELECT SITES. .SSEL==1B18 .ESEL==1B19 .LSEL==1B20 .DECSEL==1B21 .SPSEL==1B22 .ERSEL==1B23 SSELTH==5 ESELTH==3; LSELTH==3; ;MACRO TO GENERATE 'SEL MACROS ;..THIS MACHINE CODE IS EQUIVALENT TO... ;.. WHILE DEL NOT ELEMENT OF STOPS ;.. DO IF ERRL THEN ERREAD ELSE STYPE'SEL(SITE) FI OD; DEFINE DEFSEL(STYPE) < DEFINE STYPE'SEL(SITE) < SELTH==STYPE'SELTH TDNE DEL,STOPS;* GOTO .+4+SELTH;* TEST(E,FL,ERRL);* PUSHJ SP,.ERR;* STYPE'SELECT(SITE);* GOTO .-4-SELTH;* > > ;BOOLEAN..."DEL NOT AN ELEMENT OF DYNAMIC SET OF STOPS" DEFINE NOTSTOP < IFN $BTYPE-$AS,< TDNE DEL,STOPS;* GOTO FALSE;* >IFE $BTYPE-$AS,< TDNN DEL,STOPS;* GOTO TRUE;* >> DEFSEL(S) DEFSEL(E) DEFSEL(L) ;MACRO SELECT LEFT HAND SIDE DEFINE SLHS < IF DEL EQ LEFT BRACKET CAME DEL,ZLBRA;* GOTO FALSE;* THEN BEGIN SBRACK; NOOP .SSEL; ENDD; FI; IF DEL EQ DOT CAME DEL,ZDOT;* GOTO FALSE;* THEN BEGIN SDOT; NOOP .SSEL; ENDD; FI; > SUBTTL DEF. OF FAIL AND STOPPER TEST MACROS ;FAIL ROUTINE MACRO ;THIS MACRO GENERATES A CALL ON THE FAIL ROUTINE ;ARGUMENTS HAVE THE FOLLOWING MEANING: ;N IS THE GODEL NUMBER FOR THE ERROR IN THE STANDARD ; ENUMERATION. ;ARG1 IS EITHER "HARD" OR "SOFT" INDICATING, RESPECTIVELY, ; WHETHER THE SCAN OF THIS CONSTRUCTION IS TO BE TERMIN- ; ATED OR CONTINUED. ;ARG2 IS EITHER "SYM", "DEL", "NSYM", OR "NDEL" DEPENDING ; ON WHICH ELEMENT OF THE WINDOW IS IN ERROR. ;TEXT IS AN IGNORED PARAMETER WHICH IS USED TO REMIND ; THE DESIGNERS OF THE CIRCUMSTANCES UNDER WHICH THIS ; ERROR CAN OCCUR. (IT IS USED FOR TRACING TOO.) ; [THAT WAS AN AMBIGUOUS COMMENT!] SUSPSYN==20; SUSPEND SYNTAX PROCESSING SUSPCOD==40; SUSPEND CODE GENERATION SUSPSEM==1000; SUSPEND SEMANTICS CHECKING ..HARD==SUSPSYN!SUSPCOD ..SOFT==0 ..FRIED==SUSPCOD!SUSPSEM ..IUO==100!SUSPCOD!SUSPSEM ..FATAL==200 ..FVARY==400 ..SYM==10 ..DEL==4 ..NSYM==2 ..NDEL==1 DEFINE FAIL(N,ARG1,ARG2,TEXT) < PUSHJ SP,.FAIL;* RADIX 10;* XLIST XWD <..'ARG1>!<..'ARG2>,N;* LIST RADIX 8;* > SUBTTL DEF. OF SEMERR MACRO ;SEMERR ROUTINE MACRO ;THE MACRO GENERATES A CALL TO .SER ;ARGUMENTS HAVE THE FOLLOWING MEANING: ;LEX THE LEXEME EXPECTED, IF THE IDENTIFIER HAPPENS TO BE UNDEFINED ;N THE INTEGER INDICATING THE KIND OF CONSTRUCTION EXPECTED ;TEXT IGNORED (AS IN FAIL ABOVE) DEFINE SEMERR(N,LEX,TEXT) < PUSHJ SP,.SEMERR;* XLIST RADIX 10;* XWD LEX,N;* RADIX 8;* LIST > ;MACRO..."STX_STOPS" DEFINE SAVESTOPS(X) < MOVEM STOPS,X;* > ;MACRO..."STOPS_STOPS OR SET" DEFINE ADDSTOPS(X) < SETONE(STOPS,X);* > ;MACRO..."STX_STOPS" DEFINE RESTOPS(X) < MOVE STOPS,X;* > ;MACRO..."STX_STOPS;STOPS_STOPS OR SET" DEFINE SETSTOPS(ARG1,ARG2) < SAVESTOPS(ARG1);* ADDSTOPS(ARG2);* > ;MACRO TO DELIMIT SEMANTICS AND CODE GENERATION DEFINE CODE(C) < > DEFINE ENDCODE < > SUBTTL MACROS TO TEST SYMBOL LEXEMES. DEFINE T.INIT(S) < IFIDN <$BTYPE><$AS>,<$ERROR TEST CANT BE USED IN AS> IFB , IFNB , > DEFINE DEFTEST(NAME,BITS) < DEFINE NAME(REG) < T.INIT(REG) TLNE T.REGZ,BITS;* GOTO FALSE;* > > DEFTEST(T.VAR,$KIND-$VAR) DEFTEST(T.I,$TYPE-$I) DEFTEST(T.R,$TYPE-$R) DEFTEST(T.LR,$TYPE-$LR) DEFTEST(T.C,$TYPE-$C) DEFTEST(T.B,$TYPE-$B) DEFTEST(T.S,$TYPE-$S) DEFTEST(T.L,$TYPE-$L) DEFTEST(T.N,$TYPE-$N) DEFTEST(T.PHI,$PHI) DEFTEST(T.ARITH,$ARC) DEFTEST(T.ONE,$VAR1) DEFTEST(T.TWO,$VAR2) DEFTEST(T.SIM,$STATUS-$SIM) DEFTEST(T.IMM,$AM-$IMM) DEFTEST(T.SINGLE,$SINGLE) DEFTEST(T.ACC,$AMAC) DEFTEST(T.CONST,$CONST) SUBTTL TEST ("T.") MACROS FOR LEXEMES DEFINE T.EXP(REG) < T.INIT(REG) TLNE T.REGZ,$KIND;* TLNE T.REGZ,$KIND-$EXP;* GOTO FALSE;* > DEFINE T.ARR(REG) < T.INIT(REG) TLNE T.REGZ,$KIND;* TLNE T.REGZ,$KIND-$ARR;* GOTO FALSE;* > DEFINE T.PRO(REG) < T.INIT(REG) TLNE T.REGZ,200000;* TLNN T.REGZ,100000;* GOTO FALSE;* > DEFINE T.IRLR(REG) < TLNN REG,$IRLR;* GOTO FALSE;* > DEFINE T.REG(REG) < T.INIT(REG) TLNE T.REGZ,$STATUS;* TLNE T.REGZ,$STATUS-$REG;* GOTO FALSE;* > DEFINE T.OWN(REG) < T.INIT(REG) TLNE T.REGZ,$STATUS;* TLNE T.REGZ,$STATUS-$OWN;* GOTO FALSE;* > DEFINE T.FOW(REG) < T.INIT(REG) TLNE T.REGZ,$STATUS;* TLNE T.REGZ,$STATUS-$FOW;* GOTO FALSE;* > DEFINE T.FON(REG) < T.INIT(REG) TLNE T.REGZ,000400;* TLNN T.REGZ,000100;* GOTO FALSE;* TLNE T.REGZ,000200;* GOTO FALSE;* > DEFINE T.FOV(REG) < T.INIT(REG) TLNE T.REGZ,000400;* TLNN T.REGZ,000200;* GOTO FALSE;* TLNE T.REGZ,000100;* GOTO FALSE;* > DEFINE T.FORM(REG) < T.INIT(REG) TLNE T.REGZ,000300 TLNN T.REGZ,000400 GOTO FALSE > DEFINE T.DECL(REG) < T.INIT(REG) TLNN T.REGZ,$DECL;$ GOTO FALSE;$ > DEFINE T.AE(REG) < T.INIT(REG) TLNN T.REGZ,$ARR!$ARC;* TLNN T.REGZ,$DECL;* GOTO FALSE;* > DEFINE T.COGE(REG) < T.INIT(REG) TLNN T.REGZ,$SINGLE GOTO FALSE > DEFINE T.PTR(REG) < T.INIT(REG) TLNN T.REGZ,$AMAC;* TLNN T.REGZ,$INDC GOTO FALSE > DEFINE T.STK(REG) < TLNE REG,$STACK;* GOTO FALSE;* > DEFINE T.VIRGIN(REG) < T.INIT(REG) TLNN T.REGZ,777770;* TRNN T.REGZ,777777;* GOTO FALSE;* > DEFINE T.OPER(OPCOD) < MOVE T,OP;* CAME T,OPCOD;* GOTO FALSE;* > DEFINE T.RELATION(REG) < MOVE REG,OP;* TRNE REG,$OPPRI-$RELPRI;* GOTO FALSE;* > DEFINE T.REV < TRNE REV,SYM-LOP;* GOTO FALSE;* > DEFINE T.TOPLEV < TEST(E,STOPS,NOTTOP);* GOTO FALSE;* > SUBTTL TEST-NOT ("TN.") MACROS FOR LEXEMES DEFINE TN.I(REG) < TLNN REG,$TYPE-$I;* GOTO FALSE;* > DEFINE TN.R(REG) < TLNN REG,$TYPE-$R;* GOTO FALSE;* > DEFINE TN.LR(REG) < TLNN REG,$TYPE-$LR;* GOTO FALSE;* > DEFINE TN.B(REG) < TLNN REG,$TYPE-$B;* GOTO FALSE;* > DEFINE TN.L(REG) < T.INIT(REG) TLNN T.REGZ,$TYPE-$L;* GOTO FALSE;* > DEFINE TN.ARITH(REG) < TLNN REG,$ARC;* GOTO FALSE;* > DEFINE TN.AC0(REG) < TLNE REG,$AM-$ACC;* GOTO TRUE;* TRNN REG,777777;* GOTO FALSE;* > DEFINE TN.ACC(REG) < TLNN REG,$AM-$ACC;* GOTO FALSE;* > DEFINE TN.SINGLE(REG) < TLNN REG,$SINGLE;* GOTO FALSE;* > DEFINE TN.VIRGIN(REG) < T.INIT(REG) TLNN T.REGZ,777770;* JUMPN T.REGZ,FALSE;* > DEFINE TN.OPER(OPCOD) < MOVE T,OP;* CAMN T,OPCOD;* GOTO FALSE;* > DEFINE TN.TOPLEV < TEST(N,STOPS,NOTTOP);* GOTO FALSE;* > SUBTTL STORE ("S.") MACROS FOR LEXEXES DEFINE S.BL(NEWBL) < MOVE T,LEXEX;* TLZ T,$LEXBL;* OR T,NEWBL;* MOVEM T,LEXEX;* > DEFINE S.CN(NEWCN) < MOVEM NEWCN,LEXEX+1;* > DEFINE S.SA(NEWSA) < MOVE T,LEXEX;* TLZ T,$LEXSA;* OR T,NEWSA;* MOVEM T,LEXEX;* > SUBTTL FETCH ("F.") MACROS FOR LEXEMES DEFINE F.TYPE(TMP,REG) < HLRZ TMP,REG;* ANDI TMP,$TYPE;* > DEFINE F.TRANK(REG,LEX) < HLRZ REG,LEX;* ANDI REG,$TRANK;* LSH REG,-14;* > DEFINE F.LOCN(REG,LEX) < HRRZ REG,LEX;* > DEFINE F.DISC(REG) < MOVE REG,OP;* ANDI REG,$OPDSC;* LSH REG,-10;* > DEFINE F.BL(TMP,REG) < HLLZ TMP,LEXEX-REG+SYM;* TLZ TMP,$LEXSA;* > DEFINE F.CN(TMP,REG) < MOVE TMP,LEXEX+1-REG+SYM;* > DEFINE F.SA(TMP,REG) < HLLZ TMP,LEXEX-REG+SYM;* TLZ TMP,$LEXBL;* > SUBTTL MISCELLANEOUS MACROS DEFINE MCALL(NAME) < PUSHJ SP,.PCALL;* NOOP NAME;* > DEFINE MABSI(ARG) < MOVE T,[ARG];* PUSHJ SP,.MABS;* > DEFINE FIXREL(LOC,VAL) < IFNB ,< MOVE T,LOC;* > IFB ,< PUSHJ SP,.RAFIX;* > IFNB ,< MOVE T1,VAL;* PUSHJ SP,.ADRFIX;* >> DEFINE FIXABS(LOC,VAL) < IFNB ,< MOVE T,LOC;* > IFNB ,< MOVE T1,VAL;* > PUSHJ SP,.ABSFIX;* > DEFINE FIXADD(LOC,VAL) < IFNB ,< MOVE T,LOC;* > IFNB ,< MOVE T1,VAL;* > PUSHJ SP,.ADDFIX;* > DEFINE SYMSAVE < MOVEM SYM,LOP;* MOVE T,LEXEX;* MOVEM T,LLEXEX;* MOVE T,COMPNAME;* MOVEM T,LCOMPNAME;* > DEFINE SYMRESTORE < MOVEM LOP,SYM;* MOVE T,LLEXEX;* MOVEM T,LEXEX;* MOVE T,LCOMPNAME;* MOVEM T,COMPNAME;* > ;..SPLIT PLACES A JRST 0 IN OBCODE AND SAVES STATE INFORMATION ;..(IE. CAX AND RA) IN ITS ARGUMENT LOCATION; ;..JOIN PUTS OUT THE FIXUP FOR THAT JRST TO RA AND RESTORES ;..CAX TO ITS VALUE AT THE SPLIT. THE USE OF JOIN IMPLIES THAT ;..CONTROL MAY NEVER "FALL THROUGH" FROM THE PREVIOUS INSTRUCTION ;..BUT MUST ALWAYS COME FROM THE MATCHING SPLIT; DEFINE SPLIT(ARG) < HRRZ T,RA;* HRL T,CAX;* MOVEM T,ARG;* HRLZI T,_-22;* PUSHJ SP,.MABS;* > DEFINE JOIN(ARG) < IFNB ,< MOVE T,ARG;* > HLRZM T,CAX;* PUSHJ SP,.RAFIX;* > DEFINE STATEMENT(TYPE) < HRLZI SYM,$STMT!TYPE;* > DEFINE KILLAX < SETOM CAX;* > ;..REGISTER ALLOCATION SCHEME. ;..INITIALIZATION, PRESERVATION, AND RESTORATION OF "LAC". DEFINE LACINIT < MOVEI T,A13+1;* MOVEM T,LAC;* > DEFINE LACSAVE(X) < MOVE T,LAC;* MOVEM T,X;* > DEFINE LACRESTORE(X) < MOVE T,X;* MOVEM T,LAC;* > ;..SET REV TO MEAN THAT SYM IS SYM AND LOP IS LOP. DEFINE REVER < MOVNI REV,SYM;* > SUBTTL MACROS FOR TEMPCODE MANIPULATIONS ;REOPEN AND CLOSE USE REGS T,T1, T2,T3;T4 IS NOT TOUCHED ;DIRECTION FOR USE: SEE MEMO ALGOL10-9,8 DEFINE REOPEN(REG) < IFB ,< SETZ T, > IFNB ,< MOVEI T,REG(REV) > PUSHJ SP,.REOPEN > DEFINE CLOSE(REG) < IFB ,< SETZ T, > IFNB ,< MOVEI T,REG(REV) > PUSHJ SP,.CLOSE > ;EMITCODE USES T,T1,T2,T3; ONLY T4 IS NOT TOUCHED ;T CONTAINS OPCODE,T1 THE PAIR #,ACC,AND T2 CONTAINS TAD (TEMPADDRESS) DEFINE EMITCODE(REG) < IFB ,< SETZI T2, > IFNB ,< MOVE T2,REG > PUSHJ SP,.EMITCODE > ;PLUNK USES T,T1,T2;T3 AND T4 ARE UNDISTURBED ;T CONTAINS THE OPCODE,T1 THE ACC TO BE USED, AND ;T2 IS USED TO TRANSMIT THE TAD (WHICH IS TAKEN FROM ;REG IF IT IS NOT BLANK DEFINE PLUNK(REG) < IFB ,< SETZI T2, > IFNB ,< MOVE T2,REG > PUSHJ SP,.PLUNK > ;PLUNKI USES T,T1,T2; T3 AND T4 ARE UNDISTURBED ;T CONTAINS THE PREPARED INSTRUCTION ;IF REG IS NOT BLANK, TAD IS TAKEN FROM REG AND TRANSMITTED ;VIA T2 DEFINE PLUNKI(REG) < IFB ,< SETZI T2, > IFNB ,< MOVE T2,REG > PUSHJ SP,.IPLUNK > ; LOAD MUST BE USED CAREFULLY ;IT EXISTS IN THREE VERSIONS: ;LOAD ;LOADN (LOAD NEGATIVE) ;LOADC (LOAD COMPLEMENT) ;REG BLANK MEANS SYM AND!!! OFFSET FROM LEXEX IS ZERO!!! ;BECAUSE REG NON-BLANK ASSUMES THAT REV HAS A SIGNIFICANT VALUE ;ACC BLANK MEANS TAD IS ALREADY IN T1 ;ACC==13 MEANS:"USE FIRST AVAILABLE ACC" ;LOAD ASSUMES EITHER A CLOSED PORTION IN TEMPCODE OR ;A VAR. FOR WHICH NO CODE HAS BEEN GENERATED YET ;THE RESULT OF LOAD IS A COMPLETE PORTION (CLOSED) IN ;TEMPCODE WITH A MODIFIED LEXEME ;REG MUST BE EITHER SYM OR LOP (LEFT OPERAND(A REGISTER)) ;IT IS ESSENTIAL THAT SYM - LOP == 2 FOR THE COMPUTATION OF ;THE OFFSET FROM LEXEX, WHICH DEPENDS ON THIS DIFFERENCE ;AND ON THE VARIABLE REV; ;REV==-SYM MEANS ORDER NOT REVERSED ;REV==-LOP MEANS ORDER HAS BEEN REVERSED ;THE REASON FOR THIS IS THAT IT IS THEN NOT NECESSARY TO ;EXCHANGE THE LEXEME EXTENSIONS WHEN THE LEXEMES ARE EXCHANGED DEFINE LOAD(REG,ACC) < IFNB ,< MOVEI T1,ACC > IFB ,< HRLI T1,_-22 > IFNB ,< HRLI T1,_-22 > PUSHJ SP,.LOAD > DEFINE LOADN(REG,ACC) < IFNB ,< MOVEI T1,ACC > IFB ,< HRLI T1,_-22 > IFNB ,< HRLI T1,_-22 > PUSHJ SP,.LOAD > DEFINE LOADC(REG,ACC) < IFNB ,< MOVEI T1,ACC > IFB ,< HRLI T1,_-22 > IFNB ,< HRLI T1,_-22 > PUSHJ SP,.LOAD > ;..W==1 MEANS ONE WORD OPERAND,W==2 MEANS TWO WORD OPERAND; ;..RESULT 23-BIT TAD IN T2; IF REG NB:REG_T2; DEFINE TOCT(W,REG) < IFE W-1, < PUSHJ SP,.TOCT1 > IFE W-2, < PUSHJ SP,.TOCT2 > IFNB ,< TLZ REG,$AM TLO REG,$CT HRR REG,T2 > > DEFINE FETCH(REG) ; REG MUST BE EITHER SYM OR LOP DEFINE MOB(X) < PUSHJ SP,.MOB;* NOOP X;* > ;MACRO TO ADDRESS FIRST WORD OF SYMBOL TABLE ENTRY DEFINE STW0 <0(SYM)> ; MACRO TO ADDRESS SECOND WORD OF A SYMBOL TABLE ENTRY DEFINE STW1 <1(SYM)> LIT END