|
|
1.1 ! root 1: {{TTL{S{{{P I T B O L - REVISION HISTORY ! 2: {{EJC{{{{ ! 3: * R E V I S I O N H I S T O R Y ! 4: * ------------------------------- ! 5: * ! 6: * ! 7: * VERSION 3.5B (FEB 81... - SGD PATCHES) ! 8: * ----------------------------------- ! 9: * ! 10: * SGD03 - ADDITION OF .CNCI AND SYSCI (INT->STRING ! 11: * SYSTEM ROUTINE OPTION) ! 12: * SGD04 - (06-MAY-1981) MODIFIED INILN TO 132 ! 13: * SGD05 - (13-MAY-1981) INSERTED MISSING WTB AFTER SYSMM ! 14: * CALLS ! 15: * SGD06 - (25-MAY-1981) MERGED IN PROFILER PATCHES ! 16: * (NOT MARKED) ! 17: * SGD07 - (25-MAY-1981) MUCHO PATCHES TO PROFILER (MARKED, ! 18: * BUT BEST JUST TO EXTRACT ENMASSE) ! 19: * SGD08 - (25-MAY-1981) USE STRING LENGTH IN HASHS ! 20: * SGD09 - (25-MAY-1981) FIXED SERIOUS PARSER PROBLEM ! 21: * RELATING TO (X Y) ON LINE BEING VIEWED AS PATTERN ! 22: * MATCH. FIXED BY ADDITION OF NEW CMTYP VALUE ! 23: * C$CNP (CONCATENATION - NOT PATTERN MATCH) ! 24: * SGD10 - (01-AUG-1981) FIXED EXIT(N) RESPECIFICATION CODE ! 25: * TO PROPERLY OBSERVE HEADER SEMANTICS ON RETURN. ! 26: * SGD11 - (07-AUG-1981) BYPASS PRTPG CALL AT INITIALIZATION ! 27: * FOLLOWING COMPILATION IF NO OUTPUT GENERATED. ! 28: * THIS PREVENTS OUTPUT FILES CONSISTING OF THE ! 29: * HEADERS AND A FEW BLANK LINES WHEN THERE IS NO ! 30: * SOURCE LISTING AND NO COMPILATION STATS. ! 31: * ALSO FIX TIMSX INITIALIZATION IN SAME CODE. ! 32: * SGD12 - (17-AUG-1981) B$EFC CODE DID NOT CHECK FOR ! 33: * UNCONVERTED RESULT RETURNING NULL STRING. FIXED. ! 34: * SGDBF - ( NOV-1981) ADDED BUFFER TYPE AND SYMBOL CNBF ! 35: * SGD13 - (03-MAR-1982) LOAD PFVBL FIELD IN RETRN FOR ! 36: * RETURN TRACING. THIS WAS CAUSING BUG ON RETURN ! 37: * TRACES THAT TRIED TO ACCESS THE VARIABLE NAME ! 38: * SGD14 - ADDED CHAR FUNCTION. CHAR(N) RETURNS NTH ! 39: * CHARACTER OF HOST MACHINE CHARACTER SET. ! 40: * NOT CONDITIONALIZED OR MARKED. ! 41: * SGD15 - FIXED PROBLEM RELATING TO COMPILATION OF GOTO ! 42: * FIELDS CONTAINING SMALL INTEGERS (IN CONST SEC). ! 43: * ! 44: * REG01 - (XX-AUG-82) ! 45: * ADDED CFP$U TO EASE TRANSLATION ON SMALLER ! 46: * SYSTEMS - CONDITIONAL .CUCF ! 47: * ADDED LOWER CASE SUPPORT - CONDITIONAL .CULC ! 48: * ADDED SET I/O FUNCTION - CONDITIONAL .CUST ! 49: * ! 50: * REG02 - (XX-SEP-82) ! 51: * CHANGED INILN AND AND INILS TO 258 ! 52: * ! 53: * REG03 - (XX-OCT-82) ! 54: * CONDITIONALIZED THE PAGE EJECT AFTER CALL TO SYSBX ! 55: * AND ADDED ANOTHER BEFORE CALL TO SYSBX, SO THAT, ! 56: * IF DESIRED BY THE IMPLEMENTOR, STANDARD OUTPUT ! 57: * WILL REFLECT ASSIGNMENTS MADE BY EXECUTING PROGRAM ! 58: * ONLY. CONDITIONAL .CUEJ CONTROLS - IF DEFINED ! 59: * EJECT IS BEFORE CALL TO SYSBX. ! 60: * ! 61: * REG04 - (XX-NOV-82) ! 62: * FIXED DIFFICULTIES WITH LISTINGS DURING EXECUTION ! 63: * WHEN NO LISTING GENERATED DURING COMPILATION. ! 64: * ! 65: * -LIST TO CODE() CAUSED BOMB. FIX IS TO RESET ! 66: * R$TTL AND R$STL TO NULLS NOT 0 AFTER COMPILATION. ! 67: * (LISTR AND LISTT EXPECT NULLS) ! 68: * ! 69: * WHEN LISTING AND STATISTICS ROUTED TO DIFFERENT ! 70: * FILE THAN EXECUTION OUTPUT, ERROR MESSAGE IS SENT ! 71: * TO EXECUTION OUTPUT (AND GETS SEPARATED FROM ! 72: * ... IN STATEMENT ... MSG). LABO1 CALLS SYSAX AND ! 73: * STOPR DOES NOT CALL SYSAX IF ENTERED FROM LABO1. ! 74: * ! 75: * REG05 - (XX-NOV-82) ! 76: * PREVENT CLEAR() FROM CLOBBERING PROTECTED VARIABLES ! 77: * AT LABEL SCLR5. ! 78: * ! 79: * REG06 - (XX-NOV-82) ! 80: * FIXED GTEXP FROM ACCEPTING TRAILING SEMICOLON OR ! 81: * COLON. NOT LEGAL WAY TO END AN EXPRESSION. ! 82: * ! 83: * VERSION 3.5A (OCT 79 - SGD PATCHES) ! 84: * ----------------------------------- ! 85: * ! 86: * SGD01 - PATCH IN ASIGN TO FIX MULTIPLE TRAP BLOCK PROBLEM ! 87: * (ASG10+2) ! 88: * SGD02 - PATCH IN GTARR TO FIX NULL CONVERT (GTAR9+0) ! 89: * ! 90: {{TTL{S{{{P I T B O L -- BASIC INFORMATION ! 91: {{EJC{{{{ ! 92: * ! 93: * GENERAL STRUCTURE ! 94: * ----------------- ! 95: * ! 96: * THIS PROGRAM IS A TRANSLATOR FOR A VERSION OF THE SNOBOL4 ! 97: * PROGRAMMING LANGUAGE. LANGUAGE DETAILS ARE CONTAINED IN ! 98: * THE MANUAL MACRO SPITBOL BY DEWAR AND MCCANN, TECHNICAL ! 99: * REPORT 90, UNIVERSITY OF LEEDS 1976. THE LANGUAGE ! 100: * IS IDENTICAL TO THAT IMPLEMENTED BY THE BTL TRANSLATOR ! 101: * (R. E. GRISWOLD ET AL.) WITH THE FOLLOWING EXCEPTIONS. ! 102: * ! 103: * 1) REDEFINITION OF STANDARD SYSTEM FUNCTIONS AND ! 104: * OPERATORS IS NOT PERMITTED. ! 105: * ! 106: * 2) THE VALUE FUNCTION IS NOT PROVIDED. ! 107: * ! 108: * 3) ACCESS TRACING IS PROVIDED IN ADDITION TO THE ! 109: * OTHER STANDARD TRACE MODES. ! 110: * ! 111: * 4) THE KEYWORD STFCOUNT IS NOT PROVIDED. ! 112: * ! 113: * 5) THE KEYWORD FULLSCAN IS NOT PROVIDED AND ALL PATTERN ! 114: * MATCHING TAKES PLACE IN FULLSCAN MODE (I.E. WITH NO ! 115: * HEURISTICS APPLIED). ! 116: * ! 117: * 6) A SERIES OF EXPRESSIONS SEPARATED BY COMMAS MAY ! 118: * BE GROUPED WITHIN PARENTHESES TO PROVIDE A SELECTION ! 119: * CAPABILITY. THE SEMANTICS ARE THAT THE SELECTION ! 120: * ASSUMES THE VALUE OF THE FIRST EXPRESSION WITHIN IT ! 121: * WHICH SUCCEEDS AS THEY ARE EVALUATED FROM THE LEFT. ! 122: * IF NO EXPRESSION SUCCEEDS THE ENTIRE STATEMENT FAILS ! 123: * ! 124: * 7) AN EXPLICIT PATTERN MATCHING OPERATOR IS PROVIDED. ! 125: * THIS IS THE BINARY QUERY (SEE GIMPEL SIGPLAN OCT 74) ! 126: * ! 127: * 8) THE ASSIGNMENT OPERATOR IS INTRODUCED AS IN THE ! 128: * GIMPEL REFERENCE. ! 129: * ! 130: * 9) THE EXIT FUNCTION IS PROVIDED FOR GENERATING LOAD ! 131: * MODULES - CF. GIMPELS SITBOL. ! 132: * ! 133: * ! 134: * THE METHOD USED IN THIS PROGRAM IS TO TRANSLATE THE ! 135: * SOURCE CODE INTO AN INTERNAL PSEUDO-CODE (SEE FOLLOWING ! 136: * SECTION). AN INTERPRETOR IS THEN USED TO EXECUTE THIS ! 137: * GENERATED PSEUDO-CODE. THE NATURE OF THE SNOBOL4 LANGUAGE ! 138: * IS SUCH THAT THE LATTER TASK IS MUCH MORE COMPLEX THAN ! 139: * THE ACTUAL TRANSLATION PHASE. ACCORDINGLY, NEARLY ALL THE ! 140: * CODE IN THE PROGRAM SECTION IS CONCERNED WITH THE ACTUAL ! 141: * EXECUTION OF THE SNOBOL4 PROGRAM. ! 142: {{EJC{{{{ ! 143: * ! 144: * INTERPRETIVE CODE FORMAT ! 145: * ------------------------ ! 146: * ! 147: * THE INTERPRETIVE PSEUDO-CODE CONSISTS OF A SERIES OF ! 148: * ADDRESS POINTERS. THE EXACT FORMAT OF THE CODE IS ! 149: * DESCRIBED IN CONNECTION WITH THE CDBLK FORMAT. THE ! 150: * PURPOSE OF THIS SECTION IS TO GIVE GENERAL INSIGHT INTO ! 151: * THE INTERPRETIVE APPROACH INVOLVED. ! 152: * ! 153: * THE BASIC FORM OF THE CODE IS RELATED TO REVERSE POLISH. ! 154: * IN OTHER WORDS, THE OPERANDS PRECEDE THE OPERATORS WHICH ! 155: * ARE ZERO ADDRESS OPERATORS. THERE ARE SOME EXCEPTIONS TO ! 156: * THESE RULES, NOTABLY THE UNARY NOT OPERATOR AND THE ! 157: * SELECTION CONSTRUCTION WHICH CLEARLY REQUIRE ADVANCE ! 158: * KNOWLEDGE OF THE OPERATOR INVOLVED. ! 159: * ! 160: * THE OPERANDS ARE MOVED TO THE TOP OF THE MAIN STACK AND ! 161: * THE OPERATORS ARE APPLIED TO THE TOP STACK ENTRIES. LIKE ! 162: * OTHER VERSIONS OF SPITBOL, THIS PROCESSOR DEPENDS ON ! 163: * KNOWING WHETHER OPERANDS ARE REQUIRED BY NAME OR BY VALUE ! 164: * AND MOVES THE APPROPRIATE OBJECT TO THE STACK. THUS NO ! 165: * NAME/VALUE CHECKS ARE INCLUDED IN THE OPERATOR CIRCUITS. ! 166: * ! 167: * THE ACTUAL POINTERS IN THE CODE POINT TO A BLOCK WHOSE ! 168: * FIRST WORD IS THE ADDRESS OF THE INTERPRETOR ROUTINE ! 169: * TO BE EXECUTED FOR THE CODE WORD. ! 170: * ! 171: * IN THE CASE OF OPERATORS, THE POINTER IS TO A WORD WHICH ! 172: * CONTAINS THE ADDRESS OF THE OPERATOR TO BE EXECUTED. IN ! 173: * THE CASE OF OPERANDS SUCH AS CONSTANTS, THE POINTER IS TO ! 174: * THE OPERAND ITSELF. ACCORDINGLY, ALL OPERANDS CONTAIN ! 175: * A FIELD WHICH POINTS TO THE ROUTINE TO LOAD THE VALUE OF ! 176: * THE OPERAND ONTO THE STACK. IN THE CASE OF A VARIABLE, ! 177: * THERE ARE THREE SUCH POINTERS. ONE TO LOAD THE VALUE, ! 178: * ONE TO STORE THE VALUE AND A THIRD TO JUMP TO THE LABEL. ! 179: * ! 180: * THE HANDLING OF FAILURE RETURNS DESERVES SPECIAL COMMENT. ! 181: * THE LOCATION FLPTR CONTAINS THE POINTER TO THE LOCATION ! 182: * ON THE MAIN STACK WHICH CONTAINS THE FAILURE RETURN ! 183: * WHICH IS IN THE FORM OF A BYTE OFFSET IN THE CURRENT ! 184: * CODE BLOCK (CDBLK OR EXBLK). WHEN A FAILURE OCCURS, THE ! 185: * STACK IS POPPED AS INDICATED BY THE SETTING OF FLPTR AND ! 186: * CONTROL IS PASSED TO THE APPROPRIATE LOCATION IN THE ! 187: * CURRENT CODE BLOCK WITH THE STACK POINTER POINTING TO THE ! 188: * FAILURE OFFSET ON THE STACK AND FLPTR UNCHANGED. ! 189: {{EJC{{{{ ! 190: * ! 191: * INTERNAL DATA REPRESENTATIONS ! 192: * ----------------------------- ! 193: * ! 194: * REPRESENTATION OF VALUES ! 195: * ! 196: * A VALUE IS REPRESENTED BY A POINTER TO A BLOCK WHICH ! 197: * DESCRIBES THE TYPE AND PARTICULARS OF THE DATA VALUE. ! 198: * IN GENERAL, A VARIABLE IS A LOCATION CONTAINING SUCH A ! 199: * POINTER (ALTHOUGH IN THE CASE OF TRACE ASSOCIATIONS THIS ! 200: * IS MODIFIED, SEE DESCRIPTION OF TRBLK). ! 201: * ! 202: * THE FOLLOWING IS A LIST OF POSSIBLE DATATYPES SHOWING THE ! 203: * TYPE OF BLOCK USED TO HOLD THE VALUE. THE DETAILS OF ! 204: * EACH BLOCK FORMAT ARE GIVEN LATER. ! 205: * ! 206: * DATATYPE BLOCK TYPE ! 207: * -------- ---------- ! 208: * ! 209: * ! 210: * ARRAY ARBLK OR VCBLK ! 211: * ! 212: * CODE CDBLK ! 213: * ! 214: * EXPRESSION EXBLK OR SEBLK ! 215: * ! 216: * INTEGER ICBLK ! 217: * ! 218: * NAME NMBLK ! 219: * ! 220: * PATTERN P0BLK OR P1BLK OR P2BLK ! 221: * ! 222: * REAL RCBLK ! 223: * ! 224: * STRING SCBLK ! 225: * ! 226: * TABLE TBBLK ! 227: * ! 228: * PROGRAM DATATYPE PDBLK ! 229: {{EJC{{{{ ! 230: * ! 231: * REPRESENTATION OF VARIABLES ! 232: * --------------------------- ! 233: * ! 234: * DURING THE COURSE OF EVALUATING EXPRESSIONS, IT IS ! 235: * NECESSARY TO GENERATE NAMES OF VARIABLES (FOR EXAMPLE ! 236: * ON THE LEFT SIDE OF A BINARY EQUALS OPERATOR). THESE ARE ! 237: * NOT TO BE CONFUSED WITH OBJECTS OF DATATYPE NAME WHICH ! 238: * ARE IN FACT VALUES. ! 239: * ! 240: * FROM A LOGICAL POINT OF VIEW, SUCH NAMES COULD BE SIMPLY ! 241: * REPRESENTED BY A POINTER TO THE APPROPRIATE VALUE CELL. ! 242: * HOWEVER IN THE CASE OF ARRAYS AND PROGRAM DEFINED ! 243: * DATATYPES, THIS WOULD VIOLATE THE RULE THAT THERE MUST BE ! 244: * NO POINTERS INTO THE MIDDLE OF A BLOCK IN DYNAMIC STORE. ! 245: * ACCORDINGLY, A NAME IS ALWAYS REPRESENTED BY A BASE AND ! 246: * OFFSET. THE BASE POINTS TO THE START OF THE BLOCK ! 247: * CONTAINING THE VARIABLE VALUE AND THE OFFSET IS THE ! 248: * OFFSET WITHIN THIS BLOCK IN BYTES. THUS THE ADDRESS ! 249: * OF THE ACTUAL VARIABLE IS DETERMINED BY ADDING THE BASE ! 250: * AND OFFSET VALUES. ! 251: * ! 252: * THE FOLLOWING ARE THE INSTANCES OF VARIABLES REPRESENTED ! 253: * IN THIS MANNER. ! 254: * ! 255: * 1) NATURAL VARIABLE BASE IS PTR TO VRBLK ! 256: * OFFSET IS *VRVAL ! 257: * ! 258: * 2) TABLE ELEMENT BASE IS PTR TO TEBLK ! 259: * OFFSET IS *TEVAL ! 260: * ! 261: * 3) ARRAY ELEMENT BASE IS PTR TO ARBLK ! 262: * OFFSET IS OFFSET TO ELEMENT ! 263: * ! 264: * 4) VECTOR ELEMENT BASE IS PTR TO VCBLK ! 265: * OFFSET IS OFFSET TO ELEMENT ! 266: * ! 267: * 5) PROG DEF DTP BASE IS PTR TO PDBLK ! 268: * OFFSET IS OFFSET TO FIELD VALUE ! 269: * ! 270: * IN ADDITION THERE ARE TWO CASES OF OBJECTS WHICH ARE ! 271: * LIKE VARIABLES BUT CANNOT BE HANDLED IN THIS MANNER. ! 272: * THESE ARE CALLED PSEUDO-VARIABLES AND ARE REPRESENTED ! 273: * WITH A SPECIAL BASE POINTER AS FOLLOWS= ! 274: * ! 275: * EXPRESSION VARIABLE PTR TO EVBLK (SEE EVBLK) ! 276: * ! 277: * KEYWORD VARIABLE PTR TO KVBLK (SEE KVBLK) ! 278: * ! 279: * PSEUDO-VARIABLES ARE HANDLED AS SPECIAL CASES BY THE ! 280: * ACCESS PROCEDURE (ACESS) AND THE ASSIGNMENT PROCEDURE ! 281: * (ASIGN). SEE THESE TWO PROCEDURES FOR DETAILS. ! 282: {{EJC{{{{ ! 283: * ! 284: * ORGANIZATION OF DATA AREA ! 285: * ------------------------- ! 286: * ! 287: * ! 288: * THE DATA AREA IS DIVIDED INTO TWO REGIONS. ! 289: * ! 290: * STATIC AREA ! 291: * ! 292: * THE STATIC AREA BUILDS UP FROM THE BOTTOM AND CONTAINS ! 293: * DATA AREAS WHICH ARE ALLOCATED DYNAMICALLY BUT ARE NEVER ! 294: * DELETED OR MOVED AROUND. THE MACRO-PROGRAM ITSELF ! 295: * USES THE STATIC AREA FOR THE FOLLOWING. ! 296: * ! 297: * 1) ALL VARIABLE BLOCKS (VRBLK). ! 298: * ! 299: * 2) THE HASH TABLE FOR VARIABLE BLOCKS. ! 300: * ! 301: * 3) MISCELLANEOUS BUFFERS AND WORK AREAS (SEE PROGRAM ! 302: * INITIALIZATION SECTION). ! 303: * ! 304: * IN ADDITION, THE SYSTEM PROCEDURES MAY USE THIS AREA FOR ! 305: * INPUT/OUTPUT BUFFERS, EXTERNAL FUNCTIONS ETC. SPACE IN ! 306: * THE STATIC REGION IS ALLOCATED BY CALLING PROCEDURE ALOST ! 307: * ! 308: * THE FOLLOWING GLOBAL VARIABLES DEFINE THE CURRENT ! 309: * LOCATION AND SIZE OF THE STATIC AREA. ! 310: * ! 311: * STATB ADDRESS OF START OF STATIC AREA ! 312: * STATE ADDRESS+1 OF LAST WORD IN AREA. ! 313: * ! 314: * THE MINIMUM SIZE OF STATIC IS GIVEN APPROXIMATELY BY ! 315: * 12 + *E$HNB + *E$STS + SPACE FOR ALPHABET STRING ! 316: * AND STANDARD PRINT BUFFER. ! 317: {{EJC{{{{ ! 318: * ! 319: * DYNAMIC AREA ! 320: * ! 321: * THE DYNAMIC AREA IS BUILT UPWARDS IN MEMORY AFTER THE ! 322: * STATIC REGION. DATA IN THIS AREA MUST ALL BE IN STANDARD ! 323: * BLOCK FORMATS SO THAT IT CAN BE PROCESSED BY THE GARBAGE ! 324: * COLLECTOR (PROCEDURE GBCOL). GBCOL COMPACTS BLOCKS DOWN ! 325: * IN THIS REGION AS REQUIRED BY SPACE EXHAUSTION AND CAN ! 326: * ALSO MOVE ALL BLOCKS UP TO ALLOW FOR EXPANSION OF THE ! 327: * STATIC REGION. ! 328: * WITH THE EXCEPTION OF TABLES AND ARRAYS, NO SPITBOL ! 329: * OBJECT ONCE BUILT IN DYNAMIC MEMORY IS EVER SUBSEQUENTLY ! 330: * MODIFIED. OBSERVING THIS RULE NECESSITATES A COPYING ! 331: * ACTION DURING STRING AND PATTERN CONCATENATION. ! 332: * ! 333: * GARBAGE COLLECTION IS FUNDAMENTAL TO THE ALLOCATION OF ! 334: * SPACE FOR VALUES. SPITBOL USES A VERY EFFICIENT GARBAGE ! 335: * COLLECTOR WHICH INSISTS THAT POINTERS INTO DYNAMIC STORE ! 336: * SHOULD BE IDENTIFIABLE WITHOUT USE OF BIT TABLES, ! 337: * MARKER BITS ETC. TO SATISFY THIS REQUIREMENT, DYNAMIC ! 338: * MEMORY MUST NOT START AT TOO LOW AN ADDRESS AND LENGTHS ! 339: * OF ARRAYS, TABLES, STRINGS, CODE AND EXPRESSION BLOCKS ! 340: * MAY NOT EXCEED THE NUMERICAL VALUE OF THE LOWEST DYNAMIC ! 341: * ADDRESS. TO AVOID EITHER PENALIZING USERS WITH MODEST ! 342: * REQUIREMENTS OR RESTRICTING THOSE WITH GREATER NEEDS ON ! 343: * HOST SYSTEMS WHERE DYNAMIC MEMORY IS ALLOCATED IN LOW ! 344: * ADDRESSES, THE MINIMUM DYNAMIC ADDRESS MAY BE SPECIFIED ! 345: * SUFFICIENTLY HIGH TO PERMIT ARBITRARILY LARGE SPITBOL ! 346: * OBJECTS TO BE CREATED ( WITH THE POSSIBILITY IN EXTREME ! 347: * CASES OF WASTING LARGE AMOUNTS OF MEMORY BELOW THE ! 348: * START ADDRESS). THIS MINIMUM VALUE IS MADE AVAILABLE ! 349: * IN VARIABLE MXLEN BY A SYSTEM ROUTINE, SYSMX. ! 350: * ALTERNATIVELY SYSMX MAY INDICATE THAT A ! 351: * DEFAULT MAY BE USED IN WHICH DYNAMIC IS PLACED ! 352: * AT THE LOWEST POSSIBLE ADDRESS FOLLOWING STATIC. ! 353: * ! 354: * THE FOLLOWING GLOBAL WORK CELLS DEFINE THE LOCATION AND ! 355: * LENGTH OF THE DYNAMIC AREA. ! 356: * ! 357: * DNAMB START OF DYNAMIC AREA ! 358: * DNAMP NEXT AVAILABLE LOCATION ! 359: * DNAME LAST AVAILABLE LOCATION + 1 ! 360: * ! 361: * DNAMB IS ALWAYS HIGHER THAN STATE SINCE THE ALOST ! 362: * PROCEDURE MAINTAINS SOME EXPANSION SPACE ABOVE STATE. ! 363: * *** DNAMB MUST NEVER BE PERMITTED TO HAVE A VALUE LESS ! 364: * THAN THAT IN MXLEN *** ! 365: * ! 366: * SPACE IN THE DYNAMIC REGION IS ALLOCATED BY THE ALLOC ! 367: * PROCEDURE. THE DYNAMIC REGION MAY BE USED BY SYSTEM ! 368: * PROCEDURES PROVIDED THAT ALL THE RULES ARE OBEYED. ! 369: {{EJC{{{{ ! 370: * ! 371: * REGISTER USAGE ! 372: * -------------- ! 373: * ! 374: * (CP) CODE POINTER REGISTER. USED TO ! 375: * HOLD A POINTER TO THE CURRENT ! 376: * LOCATION IN THE INTERPRETIVE PSEUDO ! 377: * CODE (I.E. PTR INTO A CDBLK). ! 378: * ! 379: * (XL,XR) GENERAL INDEX REGISTERS. USUALLY ! 380: * USED TO HOLD POINTERS TO BLOCKS IN ! 381: * DYNAMIC STORAGE. AN IMPORTANT ! 382: * RESTRICTION IS THAT THE VALUE IN ! 383: * XL MUST BE COLLECTABLE FOR ! 384: * A GARBAGE COLLECT CALL. A VALUE ! 385: * IS COLLECTABLE IF IT EITHER POINTS ! 386: * OUTSIDE THE DYNAMIC AREA, OR IF IT ! 387: * POINTS TO THE START OF A BLOCK IN ! 388: * THE DYNAMIC AREA. ! 389: * ! 390: * (XS) STACK POINTER. USED TO POINT TO ! 391: * THE STACK FRONT. THE STACK MAY ! 392: * BUILD UP OR DOWN AND IS USED ! 393: * TO STACK SUBROUTINE RETURN POINTS ! 394: * AND OTHER RECURSIVELY SAVED DATA. ! 395: * ! 396: * (XT) AN ALTERNATIVE NAME FOR XL DURING ! 397: * ITS USE IN ACCESSING STACKED ITEMS. ! 398: * ! 399: * (WA,WB,WC) GENERAL WORK REGISTERS. CANNOT BE ! 400: * USED FOR INDEXING, BUT MAY HOLD ! 401: * VARIOUS TYPES OF DATA. ! 402: * ! 403: * (IA) USED FOR ALL SIGNED INTEGER ! 404: * ARITHMETIC, BOTH THAT USED BY THE ! 405: * TRANSLATOR AND THAT ARISING FROM ! 406: * USE OF SNOBOL4 ARITHMETIC OPERATORS ! 407: * ! 408: * (RA) REAL ACCUMULATOR. USED FOR ALL ! 409: * FLOATING POINT ARITHMETIC. ! 410: {{EJC{{{{ ! 411: * ! 412: * SPITBOL CONDITIONAL ASSEMBLY SYMBOLS ! 413: * ------------------------------------ ! 414: * ! 415: * IN THE SPITBOL TRANSLATOR, THE FOLLOWING CONDITIONAL ! 416: * ASSEMBLY SYMBOLS ARE REFERRED TO. TO INCORPORATE THE ! 417: * FEATURES REFERRED TO, THE MINIMAL SOURCE SHOULD BE ! 418: * PREFACED BY SUITABLE CONDITIONAL ASSEMBLY SYMBOL ! 419: * DEFINITIONS. ! 420: * IN ALL CASES IT IS PERMISSIBLE TO DEFAULT THE DEFINITIONS ! 421: * IN WHICH CASE THE ADDITIONAL FEATURES WILL BE OMITTED ! 422: * FROM THE TARGET CODE. ! 423: * ! 424: * .CASL DEFINE TO INCLUDE 26 SHIFTED LETTRS ! 425: * .CAHT DEFINE TO INCLUDE HORIZONTAL TAB ! 426: * .CAVT DEFINE TO INCLUDE VERTICAL TAB ! 427: * .CIOD IF DEFINED, DEFAULT DELIMITER IS ! 428: * NOT USED IN PROCESSING 3RD ARG OF ! 429: * INPUT() AND OUTPUT() ! 430: * .CNBT DEFINE TO OMIT BATCH INITIALISATION ! 431: * .CNCI DEFINE TO ENABLE SYSCI ROUTINE ! 432: * .CNEX DEFINE TO OMIT EXIT() CODE. ! 433: * .CNLD DEFINE TO OMIT LOAD() CODE. ! 434: * .CNPF DEFINE TO OMIT PROFILE STUFF ! 435: * .CNRA DEFINE TO OMIT ALL REAL ARITHMETIC ! 436: * .CNSR DEFINE TO OMIT SORT, RSORT ! 437: * .CSAX DEFINE IF SYSAX IS TO BE CALLED ! 438: * .CSN6 DEFINE TO PAD STMT NOS TO 6 CHARS ! 439: * .CSN8 DEFINE TO PAD STMT NOS TO 8 CHARS ! 440: * .CUCF DEFINE TO INCLUDE CFP$U ! 441: * .CULC DEFINE TO INCLUDE &CASE (LC NAMES) ! 442: * .CUST DEFINE TO INCLUDE SET() CODE ! 443: {{TTL{S{{{P I T B O L -- PROCEDURES SECTION ! 444: * ! 445: * THIS SECTION STARTS WITH DESCRIPTIONS OF THE OPERATING ! 446: * SYSTEM DEPENDENT PROCEDURES WHICH ARE USED BY THE SPITBOL ! 447: * TRANSLATOR. ALL SUCH PROCEDURES HAVE FIVE LETTER NAMES ! 448: * BEGINNING WITH SYS. THEY ARE LISTED IN ALPHABETICAL ! 449: * ORDER. ! 450: * ALL PROCEDURES HAVE A SPECIFICATION CONSISTING OF A ! 451: * MODEL CALL, PRECEDED BY A POSSIBLY EMPTY LIST OF REGISTER ! 452: * CONTENTS GIVING PARAMETERS AVAILABLE TO THE PROCEDURE AND ! 453: * FOLLOWED BY A POSSIBLY EMPTY LIST OF REGISTER CONTENTS ! 454: * REQUIRED ON RETURN FROM THE CALL OR WHICH MAY HAVE HAD ! 455: * THEIR CONTENTS DESTROYED. ONLY THOSE REGISTERS EXPLICITLY ! 456: * MENTIONED IN THE LIST AFTER THE CALL MAY HAVE THEIR ! 457: * VALUES CHANGED. ! 458: * THE SEGMENT OF CODE PROVIDING THE EXTERNAL PROCEDURES IS ! 459: * CONVENIENTLY REFERRED TO AS OSINT (OPERATING SYSTEM ! 460: * INTERFACE). THE SYSXX PROCEDURES IT CONTAINS PROVIDE ! 461: * FACILITIES NOT USUALLY AVAILABLE AS PRIMITIVES IN ! 462: * ASSEMBLY LANGUAGES. FOR PARTICULAR TARGET MACHINES, ! 463: * IMPLEMENTORS MAY CHOOSE FOR SOME MINIMAL OPCODES WHICH ! 464: * DO NOT HAVE REASONABLY DIRECT TRANSLATIONS, TO USE CALLS ! 465: * OF ADDITIONAL PROCEDURES WHICH THEY PROVIDE IN OSINT. ! 466: * E.G. MWB OR TRC MIGHT BE TRANSLATED AS JSR SYSMB, ! 467: * JSR SYSTC IN SOME IMPLEMENTATIONS. ! 468: * ! 469: * IN THE DESCRIPTIONS, REFERENCE IS MADE TO --BLK ! 470: * FORMATS (-- = A PAIR OF LETTERS). SEE THE SPITBOL ! 471: * DEFINITIONS SECTION FOR DETAILED DESCRIPTIONS OF ALL ! 472: * SUCH BLOCK FORMATS EXCEPT FCBLK FOR WHICH SYSFC SHOULD ! 473: * BE CONSULTED. ! 474: * ! 475: * SECTION 0 CONTAINS INP,INR SPECIFICATIONS OF INTERNAL ! 476: * PROCEDURES,ROUTINES. THIS GIVES A SINGLE PASS TRANSLATOR ! 477: * INFORMATION MAKING IT EASY TO GENERATE ALTERNATIVE CALLS ! 478: * IN THE TRANSLATION OF JSR-S FOR PROCEDURES OF DIFFERENT ! 479: * TYPES IF THIS PROVES NECESSARY. ! 480: * ! 481: {{SEC{{{{START OF PROCEDURES SECTION ! 482: {{EJC{{{{ ! 483: * ! 484: * SYSAX -- AFTER EXECUTION ! 485: * ! 486: {SYSAX{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 487: * ! 488: * IF THE CONDITIONAL ASSEMBLY SYMBOL .CSAX IS DEFINED, ! 489: * THIS ROUTINE IS CALLED IMMEDIATELY AFTER EXECUTION AND ! 490: * BEFORE PRINTING OF EXECUTION STATISTICS OR DUMP OUTPUT. ! 491: * PURPOSE OF CALL IS FOR IMPLEMENTOR TO DETERMINE AND ! 492: * IF THE CALL IS NOT REQUIRED IT WILL BE OMITTED IF .CSAX ! 493: * IS UNDEFINED. IN THIS CASE SYSAX NEED NOT BE CODED. ! 494: * ! 495: * JSR SYSAX CALL AFTER EXECUTION ! 496: {{EJC{{{{ ! 497: * ! 498: * SYSBX -- BEFORE EXECUTION ! 499: * ! 500: {SYSBX{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 501: * ! 502: * CALLED AFTER INITIAL SPITBOL COMPILATION AND BEFORE ! 503: * COMMENCING EXECUTION IN CASE OSINT NEEDS ! 504: * TO ASSIGN FILES OR PERFORM OTHER NECESSARY SERVICES. ! 505: * OSINT MAY ALSO CHOOSE TO SEND A MESSAGE TO ONLINE ! 506: * TERMINAL (IF ANY) INDICATING THAT EXECUTION IS STARTING. ! 507: * ! 508: * JSR SYSBX CALL BEFORE EXECUTION STARTS ! 509: {{EJC{{{{ ! 510: * ! 511: * SYSDC -- DATE CHECK ! 512: * ! 513: {SYSDC{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 514: * ! 515: * SYSDC IS CALLED TO CHECK THAT THE EXPIRY DATE FOR A TRIAL ! 516: * VERSION OF SPITBOL IS UNEXPIRED. ! 517: * ! 518: * JSR SYSDC CALL TO CHECK DATE ! 519: * RETURN ONLY IF DATE IS OK ! 520: {{EJC{{{{ ! 521: * ! 522: * SYSDM -- DUMP CORE ! 523: * ! 524: {SYSDM{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 525: * ! 526: * SYSDM IS CALLED BY A SPITBOL PROGRAM CALL OF DUMP(N) WITH ! 527: * N GE 3. ITS PURPOSE IS TO PROVIDE A CORE DUMP. ! 528: * N COULD HOLD AN ENCODING OF THE START ADRS FOR DUMP AND ! 529: * AMOUNT TO BE DUMPED E.G. N = 256*A + S , S = START ADRS ! 530: * IN KILOWORDS, A = KILOWORDS TO DUMP ! 531: * ! 532: * (XR) PARAMETER N OF CALL DUMP(N) ! 533: * JSR SYSDM CALL TO ENTER ROUTINE ! 534: {{EJC{{{{ ! 535: * ! 536: * SYSDT -- GET CURRENT DATE ! 537: * ! 538: {SYSDT{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 539: * ! 540: * SYSDT IS USED TO OBTAIN THE CURRENT DATE. THE DATE IS ! 541: * RETURNED AS A CHARACTER STRING IN ANY FORMAT APPROPRIATE ! 542: * TO THE OPERATING SYSTEM IN USE. IT MAY ALSO CONTAIN THE ! 543: * CURRENT TIME OF DAY. SYSDT IS USED TO IMPLEMENT THE ! 544: * SNOBOL4 FUNCTION DATE. ! 545: * ! 546: * JSR SYSDT CALL TO GET DATE ! 547: * (XL) POINTER TO BLOCK CONTAINING DATE ! 548: * ! 549: * THE FORMAT OF THE BLOCK IS LIKE AN SCBLK EXCEPT THAT ! 550: * THE FIRST WORD NEED NOT BE SET. THE RESULT IS COPIED ! 551: * INTO SPITBOL DYNAMIC MEMORY ON RETURN. ! 552: {{EJC{{{{ ! 553: * ! 554: * SYSEF -- EJECT FILE ! 555: * ! 556: {SYSEF{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 557: * ! 558: * SYSEF IS USED TO WRITE A PAGE EJECT TO A NAMED FILE. IT ! 559: * MAY ONLY BE USED FOR FILES WHERE THIS CONCEPT MAKES ! 560: * SENSE. NOTE THAT SYSEF IS NOT NORMALLY USED FOR THE ! 561: * STANDARD OUTPUT FILE (SEE SYSEP). ! 562: * ! 563: * (WA) PTR TO FCBLK OR ZERO ! 564: * (XR) EJECT ARGUMENT (SCBLK PTR) ! 565: * JSR SYSEF CALL TO EJECT FILE ! 566: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST ! 567: * PPM LOC RETURN HERE IF INAPPROPRIATE FILE ! 568: * PPM LOC RETURN HERE IF I/O ERROR ! 569: {{EJC{{{{ ! 570: * ! 571: * SYSEJ -- END OF JOB ! 572: * ! 573: {SYSEJ{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 574: * ! 575: * SYSEJ IS CALLED ONCE AT THE END OF EXECUTION TO ! 576: * TERMINATE THE RUN. THE SIGNIFICANCE OF THE ABEND AND ! 577: * CODE VALUES IS SYSTEM DEPENDENT. IN GENERAL, THE CODE ! 578: * VALUE SHOULD BE MADE AVAILABLE FOR TESTING, AND THE ! 579: * ABEND VALUE SHOULD CAUSE SOME POST-MORTEM ACTION SUCH AS ! 580: * A DUMP. NOTE THAT SYSEJ DOES NOT RETURN TO ITS CALLER. ! 581: * SEE SYSXI FOR DETAILS OF FCBLK CHAIN ! 582: * ! 583: * (WA) VALUE OF ABEND KEYWORD ! 584: * (WB) VALUE OF CODE KEYWORD ! 585: * (XL) O OR PTR TO HEAD OF FCBLK CHAIN ! 586: * JSR SYSEJ CALL TO END JOB ! 587: * ! 588: * THE FOLLOWING SPECIAL VALUES ARE USED AS CODES IN (WB) ! 589: * 999 EXECUTION SUPPRESSED ! 590: * 998 STANDARD OUTPUT FILE FULL OR UNAVAILABLE IN A SYSXI ! 591: * LOAD MODULE. IN THESE CASES (WA) CONTAINS THE NUMBER ! 592: * OF THE STATEMENT CAUSING PREMATURE TERMINATION. ! 593: {{EJC{{{{ ! 594: * ! 595: * SYSEM -- GET ERROR MESSAGE TEXT ! 596: * ! 597: {SYSEM{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 598: * ! 599: * SYSEM IS USED TO OBTAIN THE TEXT OF ERR, ERB CALLS IN THE ! 600: * SOURCE PROGRAM GIVEN THE ERROR CODE NUMBER. IT IS ALLOWED ! 601: * TO RETURN A NULL STRING IF THIS FACILITY IS UNAVAILABLE. ! 602: * ! 603: * (WA) ERROR CODE NUMBER ! 604: * JSR SYSEM CALL TO GET TEXT ! 605: * (XR) TEXT OF MESSAGE ! 606: * ! 607: * THE RETURNED VALUE IS A POINTER TO A BLOCK IN SCBLK ! 608: * FORMAT EXCEPT THAT THE FIRST WORD NEED NOT BE SET. THE ! 609: * STRING IS COPIED INTO DYNAMIC MEMORY ON RETURN. ! 610: * IF THE NULL STRING IS RETURNED EITHER BECAUSE SYSEM DOES ! 611: * NOT PROVIDE ERROR MESSAGE TEXTS OR BECAUSE WA IS OUT OF ! 612: * RANGE, SPITBOL WILL PRINT THE STRING STORED IN ERRTEXT ! 613: * KEYWORD. ! 614: {{EJC{{{{ ! 615: * ! 616: * SYSEN -- ENDFILE ! 617: * ! 618: {SYSEN{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 619: * ! 620: * SYSEN IS USED TO IMPLEMENT THE SNOBOL4 FUNCTION ENDFILE. ! 621: * THE MEANING IS SYSTEM DEPENDENT. IN GENERAL, ENDFILE ! 622: * IMPLIES THAT NO FURTHER I/O OPERATIONS WILL BE PERFORMED, ! 623: * BUT DOES NOT GUARANTEE THIS TO BE THE CASE. THE FILE ! 624: * SHOULD BE CLOSED AFTER THE CALL, A SUBSEQUENT READ ! 625: * OR WRITE MAY REOPEN THE FILE AT THE START OR IT MAY BE ! 626: * NECESSARY TO REOPEN THE FILE VIA SYSIO. ! 627: * ! 628: * (WA) PTR TO FCBLK OR ZERO ! 629: * (XR) ENDFILE ARGUMENT (SCBLK PTR) ! 630: * JSR SYSEN CALL TO ENDFILE ! 631: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST ! 632: * PPM LOC RETURN HERE IF ENDFILE NOT ALLOWED ! 633: * PPM LOC RETURN HERE IF I/O ERROR ! 634: * (WA,WB) DESTROYED ! 635: * ! 636: * THE SECOND ERROR RETURN IS USED FOR FILES FOR WHICH ! 637: * ENDFILE IS NOT PERMITTED. FOR EXAMPLE, IT MAY BE EXPECTED ! 638: * THAT THE STANDARD INPUT AND OUTPUT FILES ARE IN THIS ! 639: * CATEGORY. ! 640: {{EJC{{{{ ! 641: * ! 642: * SYSEP -- EJECT PRINTER PAGE ! 643: * ! 644: {SYSEP{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 645: * ! 646: * SYSEP IS CALLED TO PERFORM A PAGE EJECT ON THE STANDARD ! 647: * PRINTER OUTPUT FILE (CORRESPONDING TO SYSPR OUTPUT). ! 648: * ! 649: * JSR SYSEP CALL TO EJECT PRINTER OUTPUT ! 650: {{EJC{{{{ ! 651: * ! 652: * SYSEX -- CALL EXTERNAL FUNCTION ! 653: * ! 654: {SYSEX{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 655: * ! 656: * SYSEX IS CALLED TO PASS CONTROL TO AN EXTERNAL FUNCTION ! 657: * PREVIOUSLY LOADED WITH A CALL TO SYSLD. ! 658: * ! 659: * (XS) POINTER TO ARGUMENTS ON STACK ! 660: * (XL) POINTER TO CONTROL BLOCK (EFBLK) ! 661: * (WA) NUMBER OF ARGUMENTS ON STACK ! 662: * JSR SYSEX CALL TO PASS CONTROL TO FUNCTION ! 663: * PPM LOC RETURN HERE IF FUNCTION CALL FAILS ! 664: * (XS) POPPED PAST ARGUMENTS ! 665: * (XR) RESULT RETURNED ! 666: * ! 667: * THE ARGUMENTS ARE STORED ON THE STACK WITH ! 668: * THE LAST ARGUMENT AT 0(XS). ON RETURN, XS ! 669: * IS POPPED PAST THE ARGUMENTS. ! 670: * ! 671: * THE FORM OF THE ARGUMENTS AS PASSED IS THAT USED IN THE ! 672: * SPITBOL TRANSLATOR (SEE DEFINITIONS AND DATA STRUCTURES ! 673: * SECTION). THE CONTROL BLOCK FORMAT IS ALSO DESCRIBED ! 674: * (UNDER EFBLK) IN THIS SECTION. ! 675: * ! 676: * THERE ARE TWO WAYS OF RETURNING A RESULT. ! 677: * ! 678: * 1) RETURN A POINTER TO A BLOCK IN DYNAMIC STORAGE. THIS ! 679: * BLOCK MUST BE IN EXACTLY CORRECT FORMAT, INCLUDING ! 680: * THE FIRST WORD. ONLY FUNCTIONS WRITTEN WITH INTIMATE ! 681: * KNOWLEDGE OF THE SYSTEM WILL RETURN IN THIS WAY. ! 682: * ! 683: * 2) STRING, INTEGER AND REAL RESULTS MAY BE RETURNED BY ! 684: * POINTING TO A PSEUDO-BLOCK OUTSIDE DYNAMIC MEMORY. ! 685: * THIS BLOCK IS IN ICBLK, RCBLK OR SCBLK FORMAT EXCEPT ! 686: * THAT THE FIRST WORD WILL BE OVERWRITTEN ! 687: * BY A TYPE WORD ON RETURN AND SO NEED NOT ! 688: * BE CORRECTLY SET. SUCH A RESULT IS ! 689: * COPIED INTO MAIN STORAGE BEFORE PROCEEDING. ! 690: * UNCONVERTED RESULTS MAY SIMILARLY BE RETURNED IN A ! 691: * PSEUDO-BLOCK WHICH IS IN CORRECT FORMAT INCLUDING ! 692: * TYPE WORD RECOGNISABLE BY GARBAGE COLLECTOR SINCE ! 693: * BLOCK IS COPIED INTO DYNAMIC MEMORY. ! 694: {{EJC{{{{ ! 695: * ! 696: * SYSFC -- FILE CONTROL BLOCK ROUTINE ! 697: * ! 698: {SYSFC{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 699: * ! 700: * SEE ALSO SYSIO ! 701: * INPUT AND OUTPUT HAVE 3 ARGUMENTS REFERRED TO AS SHOWN ! 702: * INPUT(VARIABLE NAME,FILE ARG1,FILE ARG2) ! 703: * OUTPUT(VARIABLE NAME,FILE ARG1,FILE ARG2) ! 704: * FILE ARG1 MAY BE AN INTEGER OR STRING USED TO IDENTIFY ! 705: * AN I/O CHANNEL. IT IS CONVERTED TO A STRING FOR CHECKING. ! 706: * THE EXACT SIGNIFICANCE OF FILE ARG2 ! 707: * IS NOT RIGOROUSLY PRESCRIBED BUT TO IMPROVE PORTABILITY, ! 708: * THE SCHEME DESCRIBED IN THE SPITBOL USER MANUAL ! 709: * SHOULD BE ADOPTED WHEN POSSIBLE. THE PREFERRED FORM IS ! 710: * A STRING $F$,R$R$,C$C$,I$I$,...,Z$Z$ WHERE ! 711: * $F$ IS AN OPTIONAL FILE NAME WHICH IS PLACED FIRST. ! 712: * REMAINING ITEMS MAY BE OMITTED OR INCLUDED IN ANY ORDER. ! 713: * $R$ IS MAXIMUM RECORD LENGTH ! 714: * $C$ IS A CARRIAGE CONTROL CHARACTER OR CHARACTER STRING ! 715: * $I$ IS SOME FORM OF CHANNEL IDENTIFICATION USED IN THE ! 716: * ABSENCE OF $F$ TO ASSOCIATE THE VARIABLE ! 717: * WITH A FILE ALLOCATED DYNAMICALLY BY JCL COMMANDS AT ! 718: * SPITBOL LOAD TIME. ! 719: * ,...,Z$Z$ ARE ADDITIONAL FIELDS. ! 720: * IF , (COMMA) CANNOT BE USED AS A DELIMITER, .CIOD ! 721: * SHOULD BE DEFINED TO INTRODUCE BY CONDITIONAL ASSEMBLY ! 722: * ANOTHER DELIMITER (SEE ! 723: * IODEL EQU * ! 724: * EARLY IN DEFINITIONS SECTION). ! 725: * SYSFC IS CALLED WHEN A VARIABLE IS INPUT OR OUTPUT ! 726: * ASSOCIATED TO CHECK FILE ARG1 AND FILE ARG2 AND ! 727: * TO REPORT WHETHER AN FCBLK (FILE CONTROL ! 728: * BLOCK) IS NECESSARY AND IF SO WHAT SIZE IT SHOULD BE. ! 729: * THIS MAKES IT POSSIBLE FOR SPITBOL RATHER THAN OSINT TO ! 730: * ALLOCATE SUCH A BLOCK IN DYNAMIC MEMORY IF REQUIRED ! 731: * OR ALTERNATIVELY IN STATIC MEMORY. ! 732: * THE SIGNIFICANCE OF AN FCBLK , IF ONE IS REQUESTED, IS ! 733: * ENTIRELY UP TO THE SYSTEM INTERFACE. THE ONLY RESTRICTION ! 734: * IS THAT IF THE FCBLK SHOULD APPEAR TO LIE IN DYNAMIC ! 735: * MEMORY , POINTERS TO IT SHOULD BE PROPER POINTERS TO ! 736: * THE START OF A RECOGNISABLE AND GARBAGE COLLECTABLE ! 737: * BLOCK (THIS CONDITION WILL BE MET IF SYSFC REQUESTS ! 738: * SPITBOL TO PROVIDE AN FCBLK). ! 739: * AN OPTION IS PROVIDED FOR OSINT TO RETURN A POINTER IN ! 740: * XL TO AN FCBLK WHICH IT PRIVATELY ALLOCATED. THIS PTR ! 741: * WILL BE MADE AVAILABLE WHEN I/O OCCURS LATER. ! 742: * PRIVATE FCBLKS MAY HAVE ARBITRARY CONTENTS AND SPITBOL ! 743: * STORES NOTHING IN THEM. ! 744: {{EJC{{{{ ! 745: * THE REQUESTED SIZE FOR AN FCBLK IN DYNAMIC MEMORY ! 746: * SHOULD ALLOW A 2 WORD OVERHEAD FOR BLOCK TYPE AND ! 747: * LENGTH FIELDS. INFORMATION SUBSEQUENTLY STORED IN THE ! 748: * REMAINING WORDS MAY BE ARBITRARY IF AN XNBLK (EXTERNAL ! 749: * NON-RELOCATABLE BLOCK) IS REQUESTED. IF THE REQUEST IS ! 750: * FOR AN XRBLK (EXTERNAL RELOCATABLE BLOCK) THE ! 751: * CONTENTS OF WORDS SHOULD BE COLLECTABLE (I.E. ANY ! 752: * APPARENT POINTERS INTO DYNAMIC SHOULD BE GENUINE BLOCK ! 753: * POINTERS). THESE RESTRICTIONS DO NOT APPLY IF AN FCBLK ! 754: * IS ALLOCATED OUTSIDE DYNAMIC OR IS NOT ALLOCATED AT ALL. ! 755: * IF AN FCBLK IS REQUESTED, ITS FIELDS WILL BE INITIALISED ! 756: * TO ZERO BEFORE ENTRY TO SYSIO WITH THE EXCEPTION OF ! 757: * WORDS 0 AND 1 IN WHICH THE BLOCK TYPE AND LENGTH ! 758: * FIELDS ARE PLACED FOR FCBLKS IN DYNAMIC MEMORY ONLY. ! 759: * FOR THE POSSIBLE USE OF SYSEJ AND SYSXI, IF FCBLKS ! 760: * ARE USED, A CHAIN IS BUILT SO THAT THEY MAY ALL BE ! 761: * FOUND - SEE SYSXI FOR DETAILS. ! 762: * IF BOTH FILE ARG1 AND FILE ARG2 ARE NULL, CALLS OF SYSFC ! 763: * AND SYSIO ARE OMITTED. ! 764: * IF FILE ARG1 IS NULL (STANDARD INPUT/OUTPUT FILE), SYSFC ! 765: * IS CALLED TO CHECK NON-NULL FILE ARG2 BUT ANY REQUEST ! 766: * FOR AN FCBLK WILL BE IGNORED, SINCE SPITBOL HANDLES THE ! 767: * STANDARD FILES SPECIALLY AND CANNOT READILY KEEP FCBLK ! 768: * POINTERS FOR THEM. ! 769: * FILEARG1 IS TYPE CHECKED BY SPITBOL SO FURTHER CHECKING ! 770: * MAY BE UNNECCESSARY IN MANY IMPLEMENTATIONS. ! 771: * FILE ARG2 IS PASSED SO THAT SYSFC MAY ANALYSE AND ! 772: * CHECK IT. HOWEVER TO ASSIST IN THIS, SPITBOL ALSO PASSES ! 773: * ON THE STACK THE COMPONENTS OF THIS ARGUMENT WITH ! 774: * FILE NAME, $F$ (OTHERWISE NULL) EXTRACTED AND STACKED ! 775: * FIRST. ! 776: * THE OTHER FIELDS, IF ANY, ARE EXTRACTED AS SUBSTRINGS, ! 777: * POINTERS TO THEM ARE STACKED AND A COUNT OF ALL ITEMS ! 778: * STACKED IS PLACED IN WC. IF AN FCBLK WAS EARLIER ! 779: * ALLOCATED AND POINTED TO VIA FILE ARG1, SYSFC IS ALSO ! 780: * PASSED A POINTER TO THIS FCBLK. ! 781: * ! 782: * (XL) FILE ARG1 SCBLK PTR (2ND ARG) ! 783: * (XR) FILEARG2 (3RD ARG) OR NULL ! 784: * -(XS)...-(XS) SCBLKS FOR $F$,$R$,$C$,... ! 785: * (WC) NO. OF STACKED SCBLKS ABOVE ! 786: * (WA) EXISTING FILE ARG1 FCBLK PTR OR 0 ! 787: * (WB) 0/3 FOR INPUT/OUTPUT ASSOCN ! 788: * JSR SYSFC CALL TO CHECK NEED FOR FCBLK ! 789: * PPM LOC INVALID FILE ARGUMENT ! 790: * (XS) POPPED (WC) TIMES ! 791: * (WA NON ZERO) BYTE SIZE OF REQUESTED FCBLK ! 792: * (WA=0,XL NON ZERO) PRIVATE FCBLK PTR IN XL ! 793: * (WA=XL=0) NO FCBLK WANTED, NO PRIVATE FCBLK ! 794: * (WC) 0/1/2 REQUEST ALLOC OF XRBLK/XNBLK ! 795: * /STATIC BLOCK FOR USE AS FCBLK ! 796: * (WB) DESTROYED ! 797: {{EJC{{{{ ! 798: * ! 799: * SYSHS -- GIVE ACCESS TO HOST COMPUTER FEATURES ! 800: * ! 801: {SYSHS{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 802: * ! 803: * PROVIDES MEANS FOR IMPLEMENTING SPECIAL FEATURES ! 804: * ON DIFFERENT HOST COMPUTERS. THE ONLY DEFINED ENTRY IS ! 805: * THAT WHERE ALL ARGUMENTS ARE NULL IN WHICH CASE SYSHS ! 806: * RETURNS AN SCBLK CONTAINING NAME OF COMPUTER, ! 807: * NAME OF OPERATING SYSTEM AND NAME OF SITE SEPARATED BY ! 808: * COLONS. THE SCBLK NEED NOT HAVE A CORRECT FIRST FIELD ! 809: * AS THIS IS SUPPLIED ON COPYING STRING TO DYNAMIC MEMORY. ! 810: * SPITBOL DOES NO ARGUMENT CHECKING BUT DOES PROVIDE A ! 811: * SINGLE ERROR RETURN FOR ARGUMENTS CHECKED AS ERRONEOUS ! 812: * BY OSINT. IT ALSO PROVIDES A SINGLE EXECUTION ERROR ! 813: * RETURN. IF THESE ARE INADEQUATE, USE MAY BE MADE OF THE ! 814: * MINIMAL ERROR SECTION DIRECT AS DESCRIBED IN MINIMAL ! 815: * DOCUMENTATION, SECTION 10. ! 816: * SEVERAL NON-ERROR RETURNS ARE PROVIDED. THE FIRST ! 817: * CORRESPONDS TO THE DEFINED ENTRY OR, FOR IMPLEMENTATION ! 818: * DEFINED ENTRIES, ANY STRING MAY BE RETURNED. THE OTHERS ! 819: * PERMIT RESPECTIVELY, RETURN A NULL RESULT, RETURN WITH A ! 820: * RESULT TO BE STACKED WHICH IS POINTED AT BY XR, AND A ! 821: * RETURN CAUSING SPITBOL STATEMENT FAILURE. IF A RETURNED ! 822: * RESULT IS IN DYNAMIC MEMORY IT MUST OBEY GARBAGE ! 823: * COLLECTOR RULES. THE ONLY RESULTS COPIED ON RETURN ! 824: * ARE STRINGS RETURNED VIA PPM LOC3 RETURN. ! 825: * ! 826: * (WA) ARGUMENT 1 ! 827: * (XL) ARGUMENT 2 ! 828: * (XR) ARGUMENT 3 ! 829: * JSR SYSHS CALL TO GET HOST INFORMATION ! 830: * PPM LOC1 ERRONEOUS ARG ! 831: * PPM LOC2 EXECUTION ERROR ! 832: * PPM LOC3 SCBLK PTR IN XL OR 0 IF UNAVAILABLE ! 833: * PPM LOC4 RETURN A NULL RESULT ! 834: * PPM LOC5 RETURN RESULT IN XR ! 835: * PPM LOC6 CAUSE STATEMENT FAILURE ! 836: {{EJC{{{{ ! 837: * ! 838: * SYSID -- RETURN SYSTEM IDENTIFICATION ! 839: * ! 840: {SYSID{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 841: * ! 842: * THIS ROUTINE SHOULD RETURN STRINGS TO HEAD THE STANDARD ! 843: * PRINTER OUTPUT. THE FIRST STRING WILL BE APPENDED TO ! 844: * A HEADING LINE OF THE FORM ! 845: * MACRO SPITBOL VERSION V.V ! 846: * SUPPLIED BY SPITBOL ITSELF. V.V ARE DIGITS GIVING THE ! 847: * MAJOR VERSION NUMBER AND GENERALLY AT LEAST A MINOR ! 848: * VERSION NUMBER RELATING TO OSINT SHOULD BE SUPPLIED TO ! 849: * GIVE SAY ! 850: * MACRO SPITBOL VERSION V.V(M.M) ! 851: * THE SECOND STRING SHOULD IDENTIFY AT LEAST THE MACHINE ! 852: * AND OPERATING SYSTEM. PREFERABLY IT SHOULD INCLUDE ! 853: * THE DATE AND TIME OF THE RUN. ! 854: * OPTIONALLY THE STRINGS MAY INCLUDE SITE NAME OF THE ! 855: * THE IMPLEMENTOR AND/OR MACHINE ON WHICH RUN TAKES PLACE, ! 856: * UNIQUE SITE OR COPY NUMBER AND OTHER INFORMATION AS ! 857: * APPROPRIATE WITHOUT MAKING IT SO LONG AS TO BE A ! 858: * NUISANCE TO USERS. ! 859: * THE FIRST WORDS OF THE SCBLKS POINTED AT NEED NOT BE ! 860: * CORRECTLY SET. ! 861: * ! 862: * JSR SYSID CALL FOR SYSTEM IDENTIFICATION ! 863: * (XR) SCBLK PTR FOR ADDITION TO HEADER ! 864: * (XL) PTR TO SECOND HEADER SCBLK ! 865: {{EJC{{{{ ! 866: * ! 867: * SYSIL -- GET INPUT RECORD LENGTH ! 868: * ! 869: {SYSIL{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 870: * ! 871: * SYSIL IS USED TO GET THE LENGTH OF THE NEXT INPUT RECORD ! 872: * FROM A FILE PREVIOUSLY INPUT ASSOCIATED WITH A SYSIO ! 873: * CALL. THE LENGTH RETURNED IS USED TO ESTABLISH A BUFFER ! 874: * FOR A SUBSEQUENT SYSIN CALL. ! 875: * ! 876: * (WA) PTR TO FCBLK OR ZERO ! 877: * JSR SYSIL CALL TO GET RECORD LENGTH ! 878: * (WA) LENGTH OR ZERO IF FILE CLOSED ! 879: * ! 880: * NO HARM IS DONE IF THE VALUE RETURNED IS TOO LONG SINCE ! 881: * UNUSED SPACE WILL BE RECLAIMED AFTER THE SYSIN CALL. ! 882: * ! 883: * NOTE THAT IT IS THE SYSIL CALL (NOT THE SYSIO CALL) WHICH ! 884: * CAUSES THE FILE TO BE OPENED AS REQUIRED FOR THE FIRST ! 885: * RECORD INPUT FROM THE FILE. ! 886: {{EJC{{{{ ! 887: * ! 888: * SYSIN -- READ INPUT RECORD ! 889: * ! 890: {SYSIN{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 891: * ! 892: * SYSIN IS USED TO READ A RECORD FROM THE FILE WHICH WAS ! 893: * REFERENCED IN A PRIOR CALL TO SYSIL (I.E. THESE CALLS ! 894: * ALWAYS OCCUR IN PAIRS). THE BUFFER PROVIDED IS AN ! 895: * SCBLK FOR A STRING OF LENGTH SET FROM THE SYSIL CALL. ! 896: * IF THE ACTUAL LENGTH READ IS LESS THAN THIS, THE LENGTH ! 897: * FIELD OF THE SCBLK MUST BE MODIFIED BEFORE RETURNING ! 898: * UNLESS BUFFER IS RIGHT PADDED WITH ZEROES. ! 899: * IT IS ALSO PERMISSIBLE TO TAKE ANY OF THE ALTERNATIVE ! 900: * RETURNS AFTER SCBLK LENGTH HAS BEEN MODIFIED. ! 901: * ! 902: * (WA) PTR TO FCBLK OR ZERO ! 903: * (XR) POINTER TO BUFFER (SCBLK PTR) ! 904: * JSR SYSIN CALL TO READ RECORD ! 905: * PPM LOC ENDFILE OR NO I/P FILE AFTER SYSXI ! 906: * PPM LOC RETURN HERE IF I/O ERROR ! 907: * PPM LOC RETURN HERE IF RECORD FORMAT ERROR ! 908: * (WA,WB,WC) DESTROYED ! 909: {{EJC{{{{ ! 910: * ! 911: * SYSIO -- INPUT/OUTPUT FILE ASSOCIATION ! 912: * ! 913: {SYSIO{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 914: * ! 915: * SEE ALSO SYSFC. ! 916: * SYSIO IS CALLED IN RESPONSE TO A SNOBOL4 INPUT OR OUTPUT ! 917: * FUNCTION CALL EXCEPT WHEN FILE ARG1 AND FILE ARG2 ! 918: * ARE BOTH NULL. ! 919: * ITS CALL ALWAYS FOLLOWS IMMEDIATELY AFTER A CALL ! 920: * OF SYSFC. IF SYSFC REQUESTED ALLOCATION ! 921: * OF AN FCBLK, ITS ADDRESS WILL BE IN WA. ! 922: * FOR INPUT FILES, NON-ZERO VALUES OF $R$ SHOULD BE ! 923: * COPIED TO WC FOR USE IN ALLOCATING INPUT BUFFERS. IF $R$ ! 924: * IS DEFAULTED OR NOT IMPLEMENTED, WC SHOULD BE ZEROISED. ! 925: * ONCE A FILE HAS BEEN OPENED, SUBSEQUENT INPUT(),OUTPUT() ! 926: * CALLS IN WHICH THE SECOND ARGUMENT IS IDENTICAL WITH THAT ! 927: * IN A PREVIOUS CALL, MERELY ASSOCIATE THE ADDITIONAL ! 928: * VARIABLE NAME (FIRST ARGUMENT) TO THE FILE AND DO NOT ! 929: * RESULT IN RE-OPENING THE FILE. ! 930: * IN SUBSEQUENT ASSOCIATED ACCESSES TO THE FILE A POINTER ! 931: * TO ANY FCBLK ALLOCATED WILL BE MADE AVAILABLE. ! 932: * ! 933: * (XL) FILE ARG1 SCBLK PTR (2ND ARG) ! 934: * (XR) FILE ARG2 SCBLK PTR (3RD ARG) ! 935: * (WA) FCBLK PTR (0 IF NONE) ! 936: * (WB) 0 FOR INPUT, 3 FOR OUTPUT ! 937: * JSR SYSIO CALL TO ASSOCIATE FILE ! 938: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST ! 939: * PPM LOC RETURN IF INPUT/OUTPUT NOT ALLOWED ! 940: * (XL) FCBLK POINTER (0 IF NONE) ! 941: * (WC) 0 (FOR DEFAULT) OR MAX RECORD LNGTH ! 942: * (WA,WB) DESTROYED ! 943: * ! 944: * THE SECOND ERROR RETURN IS USED IF THE FILE NAMED EXISTS ! 945: * BUT INPUT/OUTPUT FROM THE FILE IS NOT ALLOWED. FOR ! 946: * EXAMPLE, THE STANDARD OUTPUT FILE MAY BE IN THIS CATEGORY ! 947: * AS REGARDS INPUT ASSOCIATION. ! 948: {{EJC{{{{ ! 949: * ! 950: * SYSLD -- LOAD EXTERNAL FUNCTION ! 951: * ! 952: {SYSLD{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 953: * ! 954: * SYSLD IS CALLED IN RESPONSE TO THE USE OF THE SNOBOL4 ! 955: * LOAD FUNCTION. THE NAMED FUNCTION IS LOADED (WHATEVER ! 956: * THIS MEANS), AND A POINTER IS RETURNED. THE POINTER WILL ! 957: * BE USED ON SUBSEQUENT CALLS TO THE FUNCTION (SEE SYSEX). ! 958: * ! 959: * (XR) POINTER TO FUNCTION NAME (SCBLK) ! 960: * (XL) POINTER TO LIBRARY NAME (SCBLK) ! 961: * JSR SYSLD CALL TO LOAD FUNCTION ! 962: * PPM LOC RETURN HERE IF FUNC DOES NOT EXIST ! 963: * PPM LOC RETURN HERE IF I/O ERROR ! 964: * (XR) POINTER TO LOADED CODE ! 965: * ! 966: * THE SIGNIFICANCE OF THE POINTER RETURNED IS UP TO THE ! 967: * SYSTEM INTERFACE ROUTINE. THE ONLY RESTRICTION IS THAT ! 968: * IF THE POINTER IS WITHIN DYNAMIC STORAGE, IT MUST BE ! 969: * A PROPER BLOCK POINTER. ! 970: {{EJC{{{{ ! 971: * ! 972: * SYSMM -- GET MORE MEMORY ! 973: * ! 974: {SYSMM{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 975: * ! 976: * SYSMM IS CALLED IN AN ATTEMPT TO ALLOCATE MORE DYNAMIC ! 977: * MEMORY. THIS MEMORY MUST BE ALLOCATED CONTIGUOUSLY WITH ! 978: * THE CURRENT DYNAMIC DATA AREA. ! 979: * ! 980: * THE AMOUNT ALLOCATED IS UP TO THE SYSTEM TO DECIDE. ANY ! 981: * VALUE IS ACCEPTABLE INCLUDING ZERO IF ALLOCATION IS ! 982: * IMPOSSIBLE. ! 983: * ! 984: * JSR SYSMM CALL TO GET MORE MEMORY ! 985: * (XR) NUMBER OF ADDITIONAL WORDS OBTAINED ! 986: {{EJC{{{{ ! 987: * ! 988: * SYSMX -- SUPPLY MXLEN ! 989: * ! 990: {SYSMX{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 991: * ! 992: * BECAUSE OF THE METHOD OF GARBAGE COLLECTION, NO SPITBOL ! 993: * OBJECT IS ALLOWED TO OCCUPY MORE BYTES OF MEMORY THAN ! 994: * THE INTEGER GIVING THE LOWEST ADDRESS OF DYNAMIC ! 995: * (GARBAGE COLLECTABLE) MEMORY. MXLEN IS THE NAME USED TO ! 996: * REFER TO THIS MAXIMUM LENGTH OF AN OBJECT AND FOR MOST ! 997: * USERS OF MOST IMPLEMENTATIONS, PROVIDED DYNAMIC MEMORY ! 998: * STARTS AT AN ADDRESS OF AT LEAST A FEW THOUSAND WORDS, ! 999: * THERE IS NO PROBLEM. ! 1000: * IF THE DEFAULT STARTING ADDRESS IS LESS THAN SAY 10000 OR ! 1001: * 20000, THEN A LOAD TIME OPTION SHOULD BE PROVIDED WHERE A ! 1002: * USER CAN REQUEST THAT HE BE ABLE TO CREATE LARGER ! 1003: * OBJECTS. THIS ROUTINE INFORMS SPITBOL OF THIS REQUEST IF ! 1004: * ANY. THE VALUE RETURNED IS EITHER AN INTEGER ! 1005: * REPRESENTING THE DESIRED VALUE OF MXLEN (AND HENCE THE ! 1006: * MINIMUM DYNAMIC STORE ADDRESS WHICH MAY RESULT IN ! 1007: * NON-USE OF SOME STORE) OR ZERO IF A DEFAULT IS ACCEPTABLE ! 1008: * IN WHICH MXLEN IS SET TO THE LOWEST ADDRESS ALLOCATED ! 1009: * TO DYNAMIC STORE BEFORE COMPILATION STARTS. ! 1010: * IF A NON-ZERO VALUE IS RETURNED, THIS IS USED FOR KEYWORD ! 1011: * MAXLNGTH. OTHERWISE THE INITIAL LOW ADDRESS OF DYNAMIC ! 1012: * MEMORY IS USED FOR THIS KEYWORD. ! 1013: * ! 1014: * JSR SYSMX CALL TO GET MXLEN ! 1015: * (WA) EITHER MXLEN OR 0 FOR DEFAULT ! 1016: {{EJC{{{{ ! 1017: * ! 1018: * SYSOU -- OUTPUT RECORD ! 1019: * ! 1020: {SYSOU{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 1021: * ! 1022: * SYSOU IS USED TO WRITE A RECORD TO A FILE PREVIOUSLY ! 1023: * ASSOCIATED WITH A SYSIO CALL. ! 1024: * ! 1025: * (WA) PTR TO FCBLK OR ZERO ! 1026: * (XR) RECORD TO BE WRITTEN (SCBLK) ! 1027: * JSR SYSOU CALL TO OUTPUT RECORD ! 1028: * PPM LOC FILE FULL OR NO FILE AFTER SYSXI ! 1029: * PPM LOC RETURN HERE IF I/O ERROR ! 1030: * (WA,WB,WC) DESTROYED ! 1031: * ! 1032: * NOTE THAT IT IS THE SYSOU CALL (NOT THE SYSIO CALL) WHICH ! 1033: * CAUSES THE FILE TO BE OPENED AS REQUIRED FOR THE FIRST ! 1034: * RECORD OUTPUT TO THE FILE. ! 1035: {{EJC{{{{ ! 1036: * ! 1037: * SYSPI -- PRINT ON INTERACTIVE CHANNEL ! 1038: * ! 1039: {SYSPI{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 1040: * ! 1041: * IF SPITBOL IS RUN FROM AN ONLINE TERMINAL, OSINT CAN ! 1042: * REQUEST THAT MESSAGES SUCH AS COPIES OF COMPILATION ! 1043: * ERRORS BE SENT TO THE TERMINAL (SEE SYSPP). IF RELEVANT ! 1044: * REPLY WAS MADE BY SYSPP THEN SYSPI IS CALLED TO SEND SUCH ! 1045: * MESSAGES TO THE INTERACTIVE CHANNEL. ! 1046: * SYSPI IS ALSO USED FOR SENDING OUTPUT TO THE TERMINAL ! 1047: * THROUGH THE SPECIAL VARIABLE NAME, TERMINAL. ! 1048: * ! 1049: * (XR) PTR TO LINE BUFFER (SCBLK) ! 1050: * (WA) LINE LENGTH ! 1051: * JSR SYSPI CALL TO PRINT LINE ! 1052: * PPM LOC FAILURE RETURN ! 1053: * (WA,WB) DESTROYED ! 1054: {{EJC{{{{ ! 1055: * ! 1056: * SYSPP -- OBTAIN PRINT PARAMETERS ! 1057: * ! 1058: {SYSPP{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 1059: * ! 1060: * SYSPP IS CALLED ONCE DURING COMPILATION TO OBTAIN ! 1061: * PARAMETERS REQUIRED FOR CORRECT PRINTED OUTPUT FORMAT ! 1062: * AND TO SELECT OTHER OPTIONS. IT MAY ALSO BE CALLED AGAIN ! 1063: * AFTER SYSXI WHEN A LOAD MODULE IS RESUMED. IN THIS ! 1064: * CASE THE VALUE RETURNED IN WA MAY BE LESS THAN OR EQUAL ! 1065: * TO THAT RETURNED IN INITIAL CALL BUT MAY NOT BE ! 1066: * GREATER. ! 1067: * THE INFORMATION RETURNED IS - ! 1068: * 1. LINE LENGTH IN CHARS FOR STANDARD PRINT FILE ! 1069: * 2. NO OF LINES/PAGE. 0 IS PREFERABLE FOR A NON-PAGED ! 1070: * DEVICE (E.G. ONLINE TERMINAL) IN WHICH CASE LISTING ! 1071: * PAGE THROWS ARE SUPPRESSED AND PAGE HEADERS ! 1072: * RESULTING FROM -TITLE,-STITL LINES ARE KEPT SHORT. ! 1073: * 3. AN INITIAL -NOLIST OPTION TO SUPPRESS LISTING UNLESS ! 1074: * THE PROGRAM CONTAINS AN EXPLICIT -LIST. ! 1075: * 4. OPTIONS TO SUPPRESS LISTING OF COMPILATION AND/OR ! 1076: * EXECUTION STATS (USEFUL FOR ESTABLISHED PROGRAMS) - ! 1077: * COMBINED WITH 3. GIVES POSSIBILITY OF LISTING ! 1078: * FILE NEVER BEING OPENED. ! 1079: * 5. OPTION TO HAVE COPIES OF ERRORS SENT TO AN ! 1080: * INTERACTIVE CHANNEL IN ADDITION TO STANDARD PRINTER. ! 1081: * 6. OPTION TO KEEP PAGE HEADERS SHORT (E.G. IF LISTING ! 1082: * TO AN ONLINE TERMINAL). ! 1083: * 7. AN OPTION TO CHOOSE EXTENDED OR COMPACT LISTING ! 1084: * FORMAT. IN THE FORMER A PAGE EJECT AND IN THE LATTER ! 1085: * A FEW LINE FEEDS PRECEDE THE PRINTING OF EACH ! 1086: * OF-- LISTING, COMPILATION STATISTICS, EXECUTION ! 1087: * OUTPUT AND EXECUTION STATISTICS. ! 1088: * 8. AN OPTION TO SUPPRESS EXECUTION AS THOUGH A ! 1089: * -NOEXECUTE CARD WERE SUPPLIED. ! 1090: * 9. AN OPTION TO REQUEST THAT NAME /TERMINAL/ BE PRE- ! 1091: * ASSOCIATED TO AN ONLINE TERMINAL VIA SYSPI AND SYSRI ! 1092: * 10. AN INTERMEDIATE (STANDARD) LISTING OPTION REQUIRING ! 1093: * THAT PAGE EJECTS OCCUR IN SOURCE LISTINGS. REDUNDANT ! 1094: * IF EXTENDED OPTION CHOSEN BUT PARTIALLY EXTENDS ! 1095: * COMPACT OPTION. ! 1096: * 11. OPTION TO SUPPRESS SYSID IDENTIFICATION. ! 1097: * ! 1098: * JSR SYSPP CALL TO GET PRINT PARAMETERS ! 1099: * (WA) PRINT LINE LENGTH IN CHARS ! 1100: * (WB) NUMBER OF LINES/PAGE ! 1101: * (WC) BITS VALUE ...JIHGFEDCBA WHERE ! 1102: * A = 1 TO SEND ERROR COPY TO INT.CH. ! 1103: * B = 1 MEANS STD PRINTER IS INT. CH. ! 1104: * C = 1 FOR -NOLIST OPTION ! 1105: * D = 1 TO SUPPRESS COMPILN. STATS ! 1106: * E = 1 TO SUPPRESS EXECN. STATS ! 1107: * F = 1/0 FOR EXTNDED/COMPACT LISTING ! 1108: * G = 1 FOR -NOEXECUTE ! 1109: * H = 1 PRE-ASSOCIATE /TERMINAL/ ! 1110: * I = 1 FOR STANDARD LISTING OPTION. ! 1111: * J = 1 SUPPRESSES LISTING HEADER ! 1112: {{EJC{{{{ ! 1113: * ! 1114: * SYSPR -- PRINT LINE ON STANDARD OUTPUT FILE ! 1115: * ! 1116: {SYSPR{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 1117: * ! 1118: * SYSPR IS USED TO PRINT A SINGLE LINE ON THE STANDARD ! 1119: * OUTPUT FILE. ! 1120: * ! 1121: * (XR) POINTER TO LINE BUFFER (SCBLK) ! 1122: * (WA) LINE LENGTH ! 1123: * JSR SYSPR CALL TO PRINT LINE ! 1124: * PPM LOC TOO MUCH O/P OR NO FILE AFTER SYSXI ! 1125: * (WA,WB) DESTROYED ! 1126: * ! 1127: * THE BUFFER POINTED TO IS THE LENGTH OBTAINED FROM THE ! 1128: * SYSPP CALL AND IS FILLED OUT WITH TRAILING BLANKS. THE ! 1129: * VALUE IN WA IS THE ACTUAL LINE LENGTH WHICH MAY BE LESS ! 1130: * THAN THE MAXIMUM LINE LENGTH POSSIBLE. THERE IS NO SPACE ! 1131: * CONTROL ASSOCIATED WITH THE LINE, ALL LINES ARE PRINTED ! 1132: * SINGLE SPACED. NOTE THAT NULL LINES (WA=0) ARE POSSIBLE ! 1133: * IN WHICH CASE A BLANK LINE IS TO BE PRINTED. ! 1134: * ! 1135: * THE ERROR EXIT IS USED FOR SYSTEMS WHICH LIMIT THE AMOUNT ! 1136: * OF PRINTED OUTPUT. IF POSSIBLE, PRINTING SHOULD BE ! 1137: * PERMITTED AFTER THIS CONDITION HAS BEEN SIGNALLED ONCE TO ! 1138: * ALLOW FOR DUMP AND OTHER DIAGNOSTIC INFORMATION. ! 1139: * ASSUMING THIS TO BE POSSIBLE, SPITBOL MAY MAKE MORE SYSPR ! 1140: * CALLS. IF THE ERROR RETURN OCCURS ANOTHER TIME, EXECUTION ! 1141: * IS TERMINATED BY A CALL OF SYSEJ WITH ENDING CODE 998. ! 1142: {{EJC{{{{ ! 1143: * ! 1144: * SYSRD -- READ RECORD FROM STANDARD INPUT FILE ! 1145: * ! 1146: {SYSRD{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 1147: * ! 1148: * SYSRD IS USED TO READ A RECORD FROM THE STANDARD INPUT ! 1149: * FILE. THE BUFFER PROVIDED IS AN SCBLK FOR A STRING THE ! 1150: * LENGTH OF WHICH IN CHARACTERS IS GIVEN IN WC, THIS ! 1151: * CORRESPONDING TO THE MAXIMUM LENGTH OF STRING WHICH ! 1152: * SPITBOL IS PREPARED TO RECEIVE. AT COMPILE TIME IT ! 1153: * CORRESPONDS TO XXX IN THE MOST RECENT -INXXX CARD ! 1154: * (DEFAULT 72) AND AT EXECUTION TIME TO THE MOST RECENT ! 1155: * ,R$R$ (RECORD LENGTH) IN THE THIRD ARG OF AN INPUT() ! 1156: * STATEMENT FOR THE STANDARD INPUT FILE (DEFAULT 80). ! 1157: * IF FEWER THAN (WC) CHARACTERS ARE READ, THE LENGTH ! 1158: * FIELD OF THE SCBLK MUST BE ADJUSTED BEFORE RETURNING ! 1159: * UNLESS THE BUFFER IS RIGHT PADDED WITH ZEROES. ! 1160: * IT IS ALSO PERMISSIBLE TO TAKE THE ALTERNATIVE RETURN ! 1161: * AFTER SUCH AN ADJUSTMENT HAS BEEN MADE. ! 1162: * SPITBOL MAY CONTINUE TO MAKE CALLS AFTER AN ENDFILE ! 1163: * RETURN SO THIS ROUTINE SHOULD BE PREPARED TO MAKE ! 1164: * REPEATED ENDFILE RETURNS. ! 1165: * ! 1166: * (XR) POINTER TO BUFFER (SCBLK PTR) ! 1167: * (WC) LENGTH OF BUFFER IN CHARACTERS ! 1168: * JSR SYSRD CALL TO READ LINE ! 1169: * PPM LOC ENDFILE OR NO I/P FILE AFTER SYSXI ! 1170: * (WA,WB,WC) DESTROYED ! 1171: {{EJC{{{{ ! 1172: * ! 1173: * SYSRI -- READ RECORD FROM INTERACTIVE CHANNEL ! 1174: * ! 1175: {SYSRI{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 1176: * ! 1177: * READS A RECORD FROM ONLINE TERMINAL FOR SPITBOL VARIABLE, ! 1178: * TERMINAL. IF ONLINE TERMINAL IS UNAVAILABLE THEN CODE THE ! 1179: * ENDFILE RETURN ONLY. ! 1180: * THE BUFFER PROVIDED IS OF LENGTH 120 CHARACTERS. SYSRI ! 1181: * SHOULD REPLACE THE COUNT IN THE SECOND WORD OF THE SCBLK ! 1182: * BY THE ACTUAL CHARACTER COUNT UNLESS BUFFER IS RIGHT ! 1183: * PADDED WITH ZEROES. ! 1184: * IT IS ALSO PERMISSIBLE TO TAKE THE ALTERNATIVE ! 1185: * RETURN AFTER ADJUSTING THE COUNT. ! 1186: * THE END OF FILE RETURN MAY BE USED IF THIS MAKES ! 1187: * SENSE ON THE TARGET MACHINE (E.G. IF THERE IS AN ! 1188: * EOF CHARACTER.) ! 1189: * ! 1190: * (XR) PTR TO 120 CHAR BUFFER (SCBLK PTR) ! 1191: * JSR SYSRI CALL TO READ LINE FROM TERMINAL ! 1192: * PPM LOC END OF FILE RETURN ! 1193: * (WA,WB,WC) MAY BE DESTROYED ! 1194: {{EJC{{{{ ! 1195: * ! 1196: * SYSRW -- REWIND FILE ! 1197: * ! 1198: {SYSRW{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 1199: * ! 1200: * SYSRW IS USED TO REWIND A FILE I.E. REPOSITION THE FILE ! 1201: * AT THE START BEFORE THE FIRST RECORD. THE FILE SHOULD BE ! 1202: * CLOSED AND THE NEXT READ OR WRITE CALL WILL OPEN THE ! 1203: * FILE AT THE START. ! 1204: * ! 1205: * (WA) PTR TO FCBLK OR ZERO ! 1206: * (XR) REWIND ARG (SCBLK PTR) ! 1207: * JSR SYSRW CALL TO REWIND FILE ! 1208: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST ! 1209: * PPM LOC RETURN HERE IF REWIND NOT ALLOWED ! 1210: * PPM LOC RETURN HERE IF I/O ERROR ! 1211: {{EJC{{{{ ! 1212: * ! 1213: * SYSST -- SET FILE POINTER ! 1214: * ! 1215: {SYSST{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 1216: * ! 1217: * SYSST IS CALLED TO CHANGE THE POSITION OF A FILE ! 1218: * POINTER. THIS IS ACCOMPLISHED IN A SYSTEM DEPENDENT ! 1219: * MANNER, AND THUS THE 2ND AND 3RD ARGUMENTS ARE PASSED ! 1220: * UNCONVERTED. ! 1221: * ! 1222: * (WA) FCBLK POINTER ! 1223: * (WB) 2ND ARGUMENT ! 1224: * (WC) 3RD ARGUMENT ! 1225: * JSR SYSST CALL TO SET FILE POINTER ! 1226: * PPM LOC RETURN HERE IF INVALID 2ND ARG ! 1227: * PPM LOC RETURN HERE IF INVALID 3RD ARG ! 1228: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST ! 1229: * PPM LOC RETURN HERE IF SET NOT ALLOWED ! 1230: * PPM LOC RETURN HERE IF I/O ERROR ! 1231: * ! 1232: {{EJC{{{{ ! 1233: * ! 1234: * SYSTM -- GET EXECUTION TIME SO FAR ! 1235: * ! 1236: {SYSTM{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 1237: * ! 1238: * SYSTM IS USED TO OBTAIN THE AMOUNT OF EXECUTION TIME ! 1239: * USED SO FAR SINCE SPITBOL WAS GIVEN CONTROL. THE UNITS ! 1240: * ARE DESCRIBED AS MILLISECONDS IN THE SPITBOL OUTPUT, BUT ! 1241: * THE EXACT MEANING IS SYSTEM DEPENDENT. WHERE APPROPRIATE, ! 1242: * THIS VALUE SHOULD RELATE TO PROCESSOR RATHER THAN CLOCK ! 1243: * TIMING VALUES. ! 1244: * ! 1245: * JSR SYSTM CALL TO GET TIMER VALUE ! 1246: * (IA) TIME SO FAR IN MILLISECONDS ! 1247: {{EJC{{{{ ! 1248: * ! 1249: * SYSTT -- TRACE TOGGLE ! 1250: * ! 1251: {SYSTT{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 1252: * ! 1253: * CALLED BY SPITBOL FUNCTION TRACE() WITH NO ARGS TO ! 1254: * TOGGLE THE SYSTEM TRACE SWITCH. THIS PERMITS TRACING OF ! 1255: * LABELS IN SPITBOL CODE TO BE TURNED ON OR OFF. ! 1256: * ! 1257: * JSR SYSTT CALL TO TOGGLE TRACE SWITCH ! 1258: {{EJC{{{{ ! 1259: * ! 1260: * SYSUL -- UNLOAD EXTERNAL FUNCTION ! 1261: * ! 1262: {SYSUL{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 1263: * ! 1264: * SYSUL IS USED TO UNLOAD A FUNCTION PREVIOUSLY ! 1265: * LOADED WITH A CALL TO SYSLD. ! 1266: * ! 1267: * (XR) PTR TO CONTROL BLOCK (EFBLK) ! 1268: * JSR SYSUL CALL TO UNLOAD FUNCTION ! 1269: * ! 1270: * THE FUNCTION CANNOT BE CALLED FOLLOWING A SYSUL CALL ! 1271: * UNTIL ANOTHER SYSLD CALL IS MADE FOR THE SAME FUNCTION. ! 1272: * ! 1273: * THE EFBLK CONTAINS THE FUNCTION CODE POINTER AND ALSO A ! 1274: * POINTER TO THE VRBLK CONTAINING THE FUNCTION NAME (SEE ! 1275: * DEFINITIONS AND DATA STRUCTURES SECTION). ! 1276: {{EJC{{{{ ! 1277: * ! 1278: * SYSXI -- EXIT TO PRODUCE LOAD MODULE ! 1279: * ! 1280: {SYSXI{EXP{{{{DEFINE EXTERNAL ENTRY POINT ! 1281: * ! 1282: * WHEN SYSXI IS CALLED, XL CONTAINS EITHER A STRING POINTER ! 1283: * OR ZERO. IN THE FORMER CASE, THE STRING GIVES THE ! 1284: * CHARACTER NAME OF A PROGRAM. THE INTENTION IS THAT ! 1285: * SPITBOL EXECUTION SHOULD BE TERMINATED FORTHWITH AND ! 1286: * THE NAMED PROGRAM LOADED AND EXECUTED. THIS TYPE OF CHAIN ! 1287: * EXECUTION IS VERY SYSTEM DEPENDENT AND IMPLEMENTORS MAY ! 1288: * CHOOSE TO OMIT IT OR FIND IT IMPOSSIBLE TO PROVIDE. ! 1289: * IF (XL) IS ZERO,IA CONTAINS ONE OF THE FOLLOWING INTEGERS ! 1290: * ! 1291: * -1, -2, -3 ! 1292: * CREATE IF POSSIBLE A LOAD MODULE CONTAINING ONLY THE ! 1293: * IMPURE AREA OF MEMORY WHICH NEEDS TO BE LOADED WITH ! 1294: * A COMPATIBLE PURE SEGMENT FOR SUBSEQUENT EXECUTIONS. ! 1295: * VERSION NUMBERS TO CHECK COMPATIBILITY SHOULD BE ! 1296: * KEPT IN BOTH SEGMENTS AND CHECKED ON LOADING. ! 1297: * TO ASSIST WITH THIS CHECK, (XR) ON ENTRY IS A ! 1298: * POINTER TO AN SCBLK CONTAINING THE SPITBOL MAJOR ! 1299: * VERSION NUMBER V.V (SEE SYSID). ! 1300: * ! 1301: * 0 IF POSSIBLE, RETURN CONTROL TO JOB CONTROL ! 1302: * COMMAND LEVEL. THE EFFECT IF AVAILABLE WILL BE ! 1303: * SYSTEM DEPENDENT. ! 1304: * ! 1305: * +1, +2, +3 ! 1306: * CREATE IF POSSIBLE A LOAD MODULE FROM ALL OF ! 1307: * MEMORY. IT SHOULD BE POSSIBLE TO LOAD AND EXECUTE ! 1308: * THIS MODULE DIRECTLY. ! 1309: * ! 1310: * IN THE CASE OF SAVED LOAD MODULES, THE STATUS OF OPEN ! 1311: * FILES IS NOT PRESERVED AND IMPLEMENTORS MAY CHOOSE TO ! 1312: * OFFER MEANS OF ATTACHING FILES BEFORE EXECUTION OF LOAD ! 1313: * MODULES STARTS OR LEAVE IT TO THE USER TO INCLUDE ! 1314: * SUITABLE INPUT(), OUTPUT() CALLS IN HIS PROGRAM. ! 1315: * SYSXI SHOULD MAKE A NOTE THAT NO I/O CHANNELS, ! 1316: * INCLUDING STANDARD FILES, HAVE FILES ATTACHED SO THAT ! 1317: * CALLS OF SYSIN, SYSOU, SYSPR, SYSRD SHOULD FAIL UNLESS ! 1318: * NEW ASSOCIATIONS ARE MADE FOR THE LOAD MODULE. ! 1319: * AT LEAST IN THE CASE OF THE STANDARD OUTPUT FILE, IT IS ! 1320: * RECOMMENDED THAT EITHER THE USER BE REQUIRED TO ATTACH ! 1321: * A FILE OR THAT A DEFAULT FILE IS ATTACHED, SINCE THE ! 1322: * PROBLEM OF ERROR MESSAGES GENERATED BY THE LOAD MODULE ! 1323: * IS OTHERWISE SEVERE. AS A LAST RESORT, IF SPITBOL ! 1324: * ATTEMPTS TO WRITE TO THE STANDARD OUTPUT FILE AND GETS A ! 1325: * REPLY INDICATING THAT SUCH OUPUT IS UNACCEPTABLE IT STOPS ! 1326: * BY USING AN ENTRY TO SYSEJ WITH ENDING CODE 998. ! 1327: * AS DESCRIBED BELOW, PASSING OF SOME ARGUMENTS MAKES IT ! 1328: * CLEAR THAT LOAD MODULE WILL USE A STANDARD OUTPUT FILE. ! 1329: * ! 1330: * IF USE IS MADE OF FCBLKS FOR I/O ASSOCIATION, SPITBOL ! 1331: * BUILDS A CHAIN SO THAT THOSE IN USE MAY BE FOUND IN SYSXI ! 1332: * AND SYSEJ. THE NODES ARE 4 WORDS LONG. THIRD WORD ! 1333: * CONTAINS LINK TO NEXT NODE OR 0, FOURTH WORD CONTAINS ! 1334: * FCBLK POINTER. ! 1335: {{EJC{{{{ ! 1336: * ! 1337: * SYSXI (CONTINUED) ! 1338: * ! 1339: * (XL) ZERO OR SCBLK PTR ! 1340: * (XR) PTR TO V.V SCBLK ! 1341: * (IA) SIGNED INTEGER ARGUMENT ! 1342: * (WB) 0 OR PTR TO HEAD OF FCBLK CHAIN ! 1343: * JSR SYSXI CALL TO EXIT ! 1344: * PPM LOC REQUESTED ACTION NOT POSSIBLE ! 1345: * PPM LOC ACTION CAUSED IRRECOVERABLE ERROR ! 1346: * (REGISTERS) SHOULD BE PRESERVED OVER CALL ! 1347: * ! 1348: * LOADING AND RUNNING THE LOAD MODULE OR RETURNING FROM ! 1349: * JCL COMMAND LEVEL CAUSES EXECUTION TO RESUME AT THE POINT ! 1350: * AFTER THE ERROR RETURNS WHICH FOLLOW THE CALL OF SYSXI. ! 1351: * THE VALUE PASSED AS EXIT ARGUMENT IS USED TO INDICATE ! 1352: * OPTIONS REQUIRED ON RESUMPTION OF LOAD MODULE. ! 1353: * +1 OR -1 REQUIRE THAT ON RESUMPTION, SYSID AND SYSPP BE ! 1354: * CALLED AND A HEADING PRINTED ON THE STANDARD OUTPUT FILE. ! 1355: * +2 OR -2 INDICATE THAT SYSPP WILL BE CALLED BUT NOT SYSID ! 1356: * AND NO HEADING WILL BE PUT ON STANDARD OUTPUT FILE. ! 1357: * ABOVE OPTIONS HAVE THE OBVIOUS IMPLICATION THAT A ! 1358: * STANDARD O/P FILE MUST BE PROVIDED FOR THE LOAD MODULE. ! 1359: * +3 OR -3 INDICATE CALLS OF NEITHER SYSID NOR SYSPP ! 1360: * AND NO HEADING WILL BE PLACED ON STANDARD OUTPUT FILE. ! 1361: * NO RETURN FROM SYSXI IS POSSIBLE IF ANOTHER PROGRAM ! 1362: * IS LOADED AND ENTERED. ! 1363: {{EJC{{{{ ! 1364: * ! 1365: * INTRODUCE THE INTERNAL PROCEDURES. ! 1366: * ! 1367: {ACESS{INP{R{1{{ ! 1368: {ACOMP{INP{N{5{{ ! 1369: {ALLOC{INP{E{0{{ ! 1370: {ALOBF{INP{E{0{{ ! 1371: {ALOCS{INP{E{0{{ ! 1372: {ALOST{INP{E{0{{ ! 1373: {APNDB{INP{E{2{{ ! 1374: {ARITH{INP{N{3{{ ! 1375: {ASIGN{INP{R{1{{ ! 1376: {ASINP{INP{R{1{{ ! 1377: {BLKLN{INP{E{0{{ ! 1378: {CDGCG{INP{E{0{{ ! 1379: {CDGEX{INP{R{0{{ ! 1380: {CDGNM{INP{R{0{{ ! 1381: {CDGVL{INP{R{0{{ ! 1382: {CDWRD{INP{E{0{{ ! 1383: {CMGEN{INP{R{0{{ ! 1384: {CMPIL{INP{E{0{{ ! 1385: {CNCRD{INP{E{0{{ ! 1386: {COPYB{INP{N{1{{ ! 1387: {DFFNC{INP{E{0{{ ! 1388: {DTACH{INP{E{0{{ ! 1389: {DTYPE{INP{E{0{{ ! 1390: {DUMPR{INP{E{0{{ ! 1391: {ERMSG{INP{E{0{{ ! 1392: {ERTEX{INP{E{0{{ ! 1393: {EVALI{INP{R{4{{ ! 1394: {EVALP{INP{R{1{{ ! 1395: {EVALS{INP{R{3{{ ! 1396: {EVALX{INP{R{1{{ ! 1397: {EXBLD{INP{E{0{{ ! 1398: {EXPAN{INP{E{0{{ ! 1399: {EXPAP{INP{E{1{{ ! 1400: {EXPDM{INP{N{0{{ ! 1401: {EXPOP{INP{N{0{{ ! 1402: {FLSTG{INP{R{0{{ ! 1403: {GBCOL{INP{E{0{{ ! 1404: {GBCPF{INP{E{0{{ ! 1405: {GTARR{INP{E{1{{ ! 1406: {{EJC{{{{ ! 1407: {GTCOD{INP{E{1{{ ! 1408: {GTEXP{INP{E{1{{ ! 1409: {GTINT{INP{E{1{{ ! 1410: {GTNUM{INP{E{1{{ ! 1411: {GTNVR{INP{E{1{{ ! 1412: {GTPAT{INP{E{1{{ ! 1413: {GTREA{INP{E{1{{ ! 1414: {GTSMI{INP{N{2{{ ! 1415: {GTSTG{INP{N{1{{ ! 1416: {GTVAR{INP{E{1{{ ! 1417: {HASHS{INP{E{0{{ ! 1418: {ICBLD{INP{E{0{{ ! 1419: {IDENT{INP{E{1{{ ! 1420: {INOUT{INP{E{0{{ ! 1421: {INSBF{INP{E{2{{ ! 1422: {IOFCB{INP{N{2{{ ! 1423: {IOPPF{INP{N{0{{ ! 1424: {IOPUT{INP{N{6{{ ! 1425: {KTREX{INP{R{0{{ ! 1426: {KWNAM{INP{N{0{{ ! 1427: {LCOMP{INP{N{5{{ ! 1428: {LISTR{INP{E{0{{ ! 1429: {LISTT{INP{E{0{{ ! 1430: {NEXTS{INP{E{0{{ ! 1431: {PATIN{INP{N{2{{ ! 1432: {PATST{INP{N{1{{ ! 1433: {PBILD{INP{E{0{{ ! 1434: {PCONC{INP{E{0{{ ! 1435: {PCOPY{INP{N{0{{ ! 1436: {PRFLR{INP{E{0{{ ! 1437: {PRFLU{INP{E{0{{ ! 1438: {PRPAR{INP{E{0{{ ! 1439: {PRTCH{INP{E{0{{ ! 1440: {PRTIC{INP{E{0{{ ! 1441: {PRTIS{INP{E{0{{ ! 1442: {PRTIN{INP{E{0{{ ! 1443: {PRTMI{INP{E{0{{ ! 1444: {PRTMX{INP{E{0{{ ! 1445: {PRTNL{INP{R{0{{ ! 1446: {PRTNM{INP{R{0{{ ! 1447: {PRTNV{INP{E{0{{ ! 1448: {PRTPG{INP{E{0{{ ! 1449: {PRTPS{INP{E{0{{ ! 1450: {PRTSN{INP{E{0{{ ! 1451: {PRTST{INP{R{0{{ ! 1452: {{EJC{{{{ ! 1453: {PRTTR{INP{E{0{{ ! 1454: {PRTVL{INP{R{0{{ ! 1455: {PRTVN{INP{E{0{{ ! 1456: {RCBLD{INP{E{0{{ ! 1457: {READR{INP{E{0{{ ! 1458: {SBSTR{INP{E{0{{ ! 1459: {SCANE{INP{E{0{{ ! 1460: {SCNGF{INP{E{0{{ ! 1461: {SETVR{INP{E{0{{ ! 1462: {SORTA{INP{N{0{{ ! 1463: {SORTC{INP{E{1{{ ! 1464: {SORTF{INP{E{0{{ ! 1465: {SORTH{INP{E{0{{ ! 1466: {TFIND{INP{E{1{{ ! 1467: {TRACE{INP{N{2{{ ! 1468: {TRBLD{INP{E{0{{ ! 1469: {TRIMR{INP{E{0{{ ! 1470: {TRXEQ{INP{R{0{{ ! 1471: {XSCAN{INP{E{0{{ ! 1472: {XSCNI{INP{N{2{{ ! 1473: * ! 1474: * INTRODUCE THE INTERNAL ROUTINES ! 1475: * ! 1476: {ARREF{INR{{{{ ! 1477: {CFUNC{INR{{{{ ! 1478: {EXFAL{INR{{{{ ! 1479: {EXINT{INR{{{{ ! 1480: {EXITS{INR{{{{ ! 1481: {EXIXR{INR{{{{ ! 1482: {EXNAM{INR{{{{ ! 1483: {EXNUL{INR{{{{ ! 1484: {EXREA{INR{{{{ ! 1485: {EXSID{INR{{{{ ! 1486: {EXVNM{INR{{{{ ! 1487: {FAILP{INR{{{{ ! 1488: {FLPOP{INR{{{{ ! 1489: {INDIR{INR{{{{ ! 1490: {MATCH{INR{{{{ ! 1491: {RETRN{INR{{{{ ! 1492: {STCOV{INR{{{{ ! 1493: {STMGO{INR{{{{ ! 1494: {STOPR{INR{{{{ ! 1495: {SUCCP{INR{{{{ ! 1496: {SYSAB{INR{{{{ ! 1497: {SYSTU{INR{{{{ ! 1498: {{TTL{S{{{P I T B O L -- DEFINITIONS AND DATA STRUCTURES ! 1499: {{SEC{{{{START OF DEFINITIONS SECTION ! 1500: * ! 1501: * DEFINITIONS OF MACHINE PARAMETERS ! 1502: * ! 1503: * THE MINIMAL TRANSLATOR SHOULD SUPPLY APPROPRIATE VALUES ! 1504: * FOR THE PARTICULAR TARGET MACHINE FOR ALL THE ! 1505: * EQU * ! 1506: * DEFINITIONS GIVEN AT THE START OF THIS SECTION. ! 1507: * ! 1508: {CFP$A{EQU{*{{{NUMBER OF CHARACTERS IN ALPHABET ! 1509: * ! 1510: {CFP$B{EQU{*{{{BYTES/WORD ADDRESSING FACTOR ! 1511: * ! 1512: {CFP$C{EQU{*{{{NUMBER OF CHARACTERS PER WORD ! 1513: * ! 1514: {CFP$F{EQU{*{{{OFFSET IN BYTES TO CHARS IN ! 1515: * SCBLK. SEE SCBLK FORMAT. ! 1516: * ! 1517: {CFP$I{EQU{*{{{NUMBER OF WORDS IN INTEGER CONSTANT ! 1518: * ! 1519: {CFP$M{EQU{*{{{MAX POSITIVE INTEGER IN ONE WORD ! 1520: * ! 1521: {CFP$N{EQU{*{{{NUMBER OF BITS IN ONE WORD ! 1522: * ! 1523: * THE FOLLOWING DEFINITIONS REQUIRE THE SUPPLY OF EITHER ! 1524: * A SINGLE PARAMETER IF REAL ARITHMETIC IS OMITTED OR ! 1525: * THREE PARAMETERS IF REAL ARITHMETIC IS INCLUDED. ! 1526: * ! 1527: * ! 1528: {CFP$R{EQU{*{{{NUMBER OF WORDS IN REAL CONSTANT ! 1529: * ! 1530: {CFP$S{EQU{*{{{NUMBER OF SIG DIGS FOR REAL OUTPUT ! 1531: * ! 1532: {CFP$X{EQU{*{{{MAX DIGITS IN REAL EXPONENT ! 1533: * ! 1534: {MXDGS{EQU{CFP$S+CFP$X{{{MAX DIGITS IN REAL NUMBER ! 1535: * ! 1536: {NSTMX{EQU{MXDGS+5{{{MAX SPACE FOR REAL (FOR +0.E+) ! 1537: * ! 1538: * THE FOLLOWING DEFINITION FOR CFP$U SUPPLIES A REALISTIC ! 1539: * UPPER BOUND ON THE SIZE OF THE ALPHABET. CFP$U IS USED ! 1540: * TO SAVE SPACE IN THE SCANE BSW-IFF-ESW TABLE AND TO EASE ! 1541: * TRANSLATION STORAGE REQUIREMENTS. ! 1542: * ! 1543: {CFP$U{EQU{*{{{REALISTIC UPPER BOUND ON ALPHABET ! 1544: {{EJC{{{{ ! 1545: * ! 1546: * ENVIRONMENT PARAMETERS ! 1547: * ! 1548: * THE SPITBOL PROGRAM IS ESSENTIALLY INDEPENDENT OF ! 1549: * THE DEFINITIONS OF THESE PARAMETERS. HOWEVER, THE ! 1550: * EFFICIENCY OF THE SYSTEM MAY BE AFFECTED. CONSEQUENTLY, ! 1551: * THESE PARAMETERS MAY REQUIRE TUNING FOR A GIVEN VERSION ! 1552: * THE VALUES GIVEN IN COMMENTS HAVE BEEN SUCCESSFULLY USED. ! 1553: * ! 1554: * E$SRS IS THE NUMBER OF WORDS TO RESERVE AT THE END OF ! 1555: * STORAGE FOR END OF RUN PROCESSING. IT SHOULD BE ! 1556: * SET AS SMALL AS POSSIBLE WITHOUT CAUSING MEMORY OVERFLOW ! 1557: * IN CRITICAL SITUATIONS (E.G. MEMORY OVERFLOW TERMINATION) ! 1558: * AND SHOULD THUS RESERVE SUFFICIENT SPACE AT LEAST FOR ! 1559: * AN SCBLK CONTAINING SAY 30 CHARACTERS. ! 1560: * ! 1561: {E$SRS{EQU{*{{{30 WORDS ! 1562: * ! 1563: * E$STS IS THE NUMBER OF WORDS GRABBED IN A CHUNK WHEN ! 1564: * STORAGE IS ALLOCATED IN THE STATIC REGION. THE MINIMUM ! 1565: * PERMITTED VALUE IS 256/CFP$B. LARGER VALUES WILL LEAD ! 1566: * TO INCREASED EFFICIENCY AT THE COST OF WASTING MEMORY. ! 1567: * ! 1568: {E$STS{EQU{*{{{500 WORDS ! 1569: * ! 1570: * E$CBS IS THE SIZE OF CODE BLOCK ALLOCATED INITIALLY AND ! 1571: * THE EXPANSION INCREMENT IF OVERFLOW OCCURS. IF THIS VALUE ! 1572: * IS TOO SMALL OR TOO LARGE, EXCESSIVE GARBAGE COLLECTIONS ! 1573: * WILL OCCUR DURING COMPILATION AND MEMORY MAY BE LOST ! 1574: * IN THE CASE OF A TOO LARGE VALUE. ! 1575: * ! 1576: {E$CBS{EQU{*{{{500 WORDS ! 1577: * ! 1578: * E$HNB IS THE NUMBER OF BUCKET HEADERS IN THE VARIABLE ! 1579: * HASH TABLE. IT SHOULD ALWAYS BE ODD. LARGER VALUES WILL ! 1580: * SPEED UP COMPILATION AND INDIRECT REFERENCES AT THE ! 1581: * EXPENSE OF ADDITIONAL STORAGE FOR THE HASH TABLE ITSELF. ! 1582: * ! 1583: {E$HNB{EQU{*{{{127 BUCKET HEADERS ! 1584: * ! 1585: * E$HNW IS THE MAXIMUM NUMBER OF WORDS OF A STRING ! 1586: * NAME WHICH PARTICIPATE IN THE STRING HASH ALGORITHM. ! 1587: * LARGER VALUES GIVE A BETTER HASH AT THE EXPENSE OF TAKING ! 1588: * LONGER TO COMPUTE THE HASH. THERE IS SOME OPTIMAL VALUE. ! 1589: * ! 1590: {E$HNW{EQU{*{{{6 WORDS ! 1591: * ! 1592: * E$FSP . IF THE AMOUNT OF FREE SPACE LEFT AFTER A GARBAGE ! 1593: * COLLECTION IS SMALL COMPARED TO THE TOTAL AMOUNT OF SPACE ! 1594: * IN USE GARBAGE COLLECTOR THRASHING IS LIKELY TO OCCUR AS ! 1595: * THIS SPACE IS USED UP. E$FSP IS A MEASURE OF THE ! 1596: * MINIMUM PERCENTAGE OF DYNAMIC MEMORY LEFT AS FREE SPACE ! 1597: * BEFORE THE SYSTEM ROUTINE SYSMM IS CALLED TO TRY TO ! 1598: * OBTAIN MORE MEMORY. ! 1599: * ! 1600: {E$FSP{EQU{*{{{15 PERCENT ! 1601: {{EJC{{{{ ! 1602: * ! 1603: * DEFINITIONS OF CODES FOR LETTERS ! 1604: * ! 1605: {CH$LA{EQU{*{{{LETTER A ! 1606: {CH$LB{EQU{*{{{LETTER B ! 1607: {CH$LC{EQU{*{{{LETTER C ! 1608: {CH$LD{EQU{*{{{LETTER D ! 1609: {CH$LE{EQU{*{{{LETTER E ! 1610: {CH$LF{EQU{*{{{LETTER F ! 1611: {CH$LG{EQU{*{{{LETTER G ! 1612: {CH$LH{EQU{*{{{LETTER H ! 1613: {CH$LI{EQU{*{{{LETTER I ! 1614: {CH$LJ{EQU{*{{{LETTER J ! 1615: {CH$LK{EQU{*{{{LETTER K ! 1616: {CH$LL{EQU{*{{{LETTER L ! 1617: {CH$LM{EQU{*{{{LETTER M ! 1618: {CH$LN{EQU{*{{{LETTER N ! 1619: {CH$LO{EQU{*{{{LETTER O ! 1620: {CH$LP{EQU{*{{{LETTER P ! 1621: {CH$LQ{EQU{*{{{LETTER Q ! 1622: {CH$LR{EQU{*{{{LETTER R ! 1623: {CH$LS{EQU{*{{{LETTER S ! 1624: {CH$LT{EQU{*{{{LETTER T ! 1625: {CH$LU{EQU{*{{{LETTER U ! 1626: {CH$LV{EQU{*{{{LETTER V ! 1627: {CH$LW{EQU{*{{{LETTER W ! 1628: {CH$LX{EQU{*{{{LETTER X ! 1629: {CH$LY{EQU{*{{{LETTER Y ! 1630: {CH$L${EQU{*{{{LETTER Z ! 1631: * ! 1632: * DEFINITIONS OF CODES FOR DIGITS ! 1633: * ! 1634: {CH$D0{EQU{*{{{DIGIT 0 ! 1635: {CH$D1{EQU{*{{{DIGIT 1 ! 1636: {CH$D2{EQU{*{{{DIGIT 2 ! 1637: {CH$D3{EQU{*{{{DIGIT 3 ! 1638: {CH$D4{EQU{*{{{DIGIT 4 ! 1639: {CH$D5{EQU{*{{{DIGIT 5 ! 1640: {CH$D6{EQU{*{{{DIGIT 6 ! 1641: {CH$D7{EQU{*{{{DIGIT 7 ! 1642: {CH$D8{EQU{*{{{DIGIT 8 ! 1643: {CH$D9{EQU{*{{{DIGIT 9 ! 1644: {{EJC{{{{ ! 1645: * ! 1646: * DEFINITIONS OF CODES FOR SPECIAL CHARACTERS ! 1647: * ! 1648: * THE NAMES OF THESE CHARACTERS ARE RELATED TO THEIR ! 1649: * ORIGINAL REPRESENTATION IN THE EBCDIC SET CORRESPONDING ! 1650: * TO THE DESCRIPTION IN STANDARD SNOBOL4 MANUALS AND TEXTS. ! 1651: * ! 1652: {CH$AM{EQU{*{{{KEYWORD OPERATOR (AMPERSAND) ! 1653: {CH$AS{EQU{*{{{MULTIPLICATION SYMBOL (ASTERISK) ! 1654: {CH$AT{EQU{*{{{CURSOR POSITION OPERATOR (AT) ! 1655: {CH$BB{EQU{*{{{LEFT ARRAY BRACKET (LESS THAN) ! 1656: {CH$BL{EQU{*{{{BLANK ! 1657: {CH$BR{EQU{*{{{ALTERNATION OPERATOR (VERTICAL BAR) ! 1658: {CH$CL{EQU{*{{{GOTO SYMBOL (COLON) ! 1659: {CH$CM{EQU{*{{{COMMA ! 1660: {CH$DL{EQU{*{{{INDIRECTION OPERATOR (DOLLAR) ! 1661: {CH$DT{EQU{*{{{NAME OPERATOR (DOT) ! 1662: {CH$DQ{EQU{*{{{DOUBLE QUOTE ! 1663: {CH$EQ{EQU{*{{{EQUAL SIGN ! 1664: {CH$EX{EQU{*{{{EXPONENTIATION OPERATOR (EXCLM) ! 1665: {CH$MN{EQU{*{{{MINUS SIGN ! 1666: {CH$NM{EQU{*{{{NUMBER SIGN ! 1667: {CH$NT{EQU{*{{{NEGATION OPERATOR (NOT) ! 1668: {CH$PC{EQU{*{{{PERCENT ! 1669: {CH$PL{EQU{*{{{PLUS SIGN ! 1670: {CH$PP{EQU{*{{{LEFT PARENTHESIS ! 1671: {CH$RB{EQU{*{{{RIGHT ARRAY BRACKET (GRTR THAN) ! 1672: {CH$RP{EQU{*{{{RIGHT PARENTHESIS ! 1673: {CH$QU{EQU{*{{{INTERROGATION OPERATOR (QUESTION) ! 1674: {CH$SL{EQU{*{{{SLASH ! 1675: {CH$SM{EQU{*{{{SEMICOLON ! 1676: {CH$SQ{EQU{*{{{SINGLE QUOTE ! 1677: {CH$UN{EQU{*{{{SPECIAL IDENTIFIER CHAR (UNDERLINE) ! 1678: {CH$OB{EQU{*{{{OPENING BRACKET ! 1679: {CH$CB{EQU{*{{{CLOSING BRACKET ! 1680: {{EJC{{{{ ! 1681: * ! 1682: * REMAINING CHARS ARE OPTIONAL ADDITIONS TO THE STANDARDS. ! 1683: * ! 1684: * TAB CHARACTERS - SYNTACTICALLY EQUIVALENT TO BLANK ! 1685: * ! 1686: {CH$HT{EQU{*{{{HORIZONTAL TAB ! 1687: * ! 1688: * LOWER CASE OR SHIFTED CASE ALPHABETIC CHARS ! 1689: * ! 1690: {CH$$A{EQU{*{{{SHIFTED A ! 1691: {CH$$B{EQU{*{{{SHIFTED B ! 1692: {CH$$C{EQU{*{{{SHIFTED C ! 1693: {CH$$D{EQU{*{{{SHIFTED D ! 1694: {CH$$E{EQU{*{{{SHIFTED E ! 1695: {CH$$F{EQU{*{{{SHIFTED F ! 1696: {CH$$G{EQU{*{{{SHIFTED G ! 1697: {CH$$H{EQU{*{{{SHIFTED H ! 1698: {CH$$I{EQU{*{{{SHIFTED I ! 1699: {CH$$J{EQU{*{{{SHIFTED J ! 1700: {CH$$K{EQU{*{{{SHIFTED K ! 1701: {CH$$L{EQU{*{{{SHIFTED L ! 1702: {CH$$M{EQU{*{{{SHIFTED M ! 1703: {CH$$N{EQU{*{{{SHIFTED N ! 1704: {CH$$O{EQU{*{{{SHIFTED O ! 1705: {CH$$P{EQU{*{{{SHIFTED P ! 1706: {CH$$Q{EQU{*{{{SHIFTED Q ! 1707: {CH$$R{EQU{*{{{SHIFTED R ! 1708: {CH$$S{EQU{*{{{SHIFTED S ! 1709: {CH$$T{EQU{*{{{SHIFTED T ! 1710: {CH$$U{EQU{*{{{SHIFTED U ! 1711: {CH$$V{EQU{*{{{SHIFTED V ! 1712: {CH$$W{EQU{*{{{SHIFTED W ! 1713: {CH$$X{EQU{*{{{SHIFTED X ! 1714: {CH$$Y{EQU{*{{{SHIFTED Y ! 1715: {CH$$${EQU{*{{{SHIFTED Z ! 1716: * IF A DELIMITER OTHER THAN CH$CM MUST BE USED IN ! 1717: * THE THIRD ARGUMENT OF INPUT(),OUTPUT() THEN .CIOD SHOULD ! 1718: * BE DEFINED AND A PARAMETER SUPPLIED FOR IODEL. ! 1719: * ! 1720: {IODEL{EQU{*{{{ ! 1721: {{EJC{{{{ ! 1722: * ! 1723: * DATA BLOCK FORMATS AND DEFINITIONS ! 1724: * ! 1725: * THE FOLLOWING SECTIONS DESCRIBE THE DETAILED FORMAT OF ! 1726: * ALL POSSIBLE DATA BLOCKS IN STATIC AND DYNAMIC MEMORY. ! 1727: * ! 1728: * EVERY BLOCK HAS A NAME OF THE FORM XXBLK WHERE XX IS A ! 1729: * UNIQUE TWO CHARACTER IDENTIFIER. THE FIRST WORD OF EVERY ! 1730: * BLOCK MUST CONTAIN A POINTER TO A PROGRAM LOCATION IN THE ! 1731: * INTERPRETOR WHICH IS IMMEDIATELY PRECEDED BY AN ADDRESS ! 1732: * CONSTANT CONTAINING THE VALUE BL$XX WHERE XX IS THE BLOCK ! 1733: * IDENTIFIER. THIS PROVIDES A UNIFORM MECHANISM FOR ! 1734: * DISTINGUISHING BETWEEN THE VARIOUS BLOCK TYPES. ! 1735: * ! 1736: * IN SOME CASES, THE CONTENTS OF THE FIRST WORD IS CONSTANT ! 1737: * FOR A GIVEN BLOCK TYPE AND MERELY SERVES AS A POINTER ! 1738: * TO THE IDENTIFYING ADDRESS CONSTANT. HOWEVER, IN OTHER ! 1739: * CASES THERE ARE SEVERAL POSSIBILITIES FOR THE FIRST ! 1740: * WORD IN WHICH CASE EACH OF THE SEVERAL PROGRAM ENTRY ! 1741: * POINTS MUST BE PRECEDED BY THE APPROPRIATE CONSTANT. ! 1742: * ! 1743: * IN EACH BLOCK, SOME OF THE FIELDS ARE RELOCATABLE. THIS ! 1744: * MEANS THAT THEY MAY CONTAIN A POINTER TO ANOTHER BLOCK ! 1745: * IN THE DYNAMIC AREA. (TO BE MORE PRECISE, IF THEY CONTAIN ! 1746: * A POINTER WITHIN THE DYNAMIC AREA, THEN IT IS A POINTER ! 1747: * TO A BLOCK). SUCH FIELDS MUST BE MODIFIED BY THE GARBAGE ! 1748: * COLLECTOR (PROCEDURE GBCOL) WHENEVER BLOCKS ARE COMPACTED ! 1749: * IN THE DYNAMIC REGION. THE GARBAGE COLLECTOR (ACTUALLY ! 1750: * PROCEDURE GBCPF) REQUIRES THAT ALL SUCH RELOCATABLE ! 1751: * FIELDS IN A BLOCK MUST BE CONTIGUOUS. ! 1752: {{EJC{{{{ ! 1753: * ! 1754: * THE DESCRIPTION FORMAT USES THE FOLLOWING SCHEME. ! 1755: * ! 1756: * 1) BLOCK TITLE AND TWO CHARACTER IDENTIFIER ! 1757: * ! 1758: * 2) DESCRIPTION OF BASIC USE OF BLOCK AND INDICATION ! 1759: * OF CIRCUMSTANCES UNDER WHICH IT IS CONSTRUCTED. ! 1760: * ! 1761: * 3) PICTURE OF THE BLOCK FORMAT. IN THESE PICTURES LOW ! 1762: * MEMORY ADDRESSES ARE AT THE TOP OF THE PAGE. FIXED ! 1763: * LENGTH FIELDS ARE SURROUNDED BY I (LETTER I). FIELDS ! 1764: * WHICH ARE FIXED LENGTH BUT WHOSE LENGTH IS DEPENDENT ! 1765: * ON A CONFIGURATION PARAMETER ARE SURROUNDED BY * ! 1766: * (ASTERISK). VARIABLE LENGTH FIELDS ARE SURROUNDED ! 1767: * BY / (SLASH). ! 1768: * ! 1769: * 4) DEFINITION OF SYMBOLIC OFFSETS TO FIELDS IN ! 1770: * BLOCK AND OF THE SIZE OF THE BLOCK IF FIXED LENGTH ! 1771: * OR OF THE SIZE OF THE FIXED LENGTH FIELDS IF THE ! 1772: * BLOCK IS VARIABLE LENGTH. ! 1773: * NOTE THAT SOME ROUTINES SUCH AS GBCPF ASSUME ! 1774: * CERTAIN OFFSETS ARE EQUAL. THE DEFINITIONS ! 1775: * GIVEN HERE ENFORCE THIS. MAKE CHANGES TO ! 1776: * THEM ONLY WITH DUE CARE. ! 1777: * ! 1778: * DEFINITIONS OF COMMON OFFSETS ! 1779: * ! 1780: {OFFS1{EQU{1{{{ ! 1781: {OFFS2{EQU{2{{{ ! 1782: {OFFS3{EQU{3{{{ ! 1783: * ! 1784: * 5) DETAILED COMMENTS ON THE SIGNIFICANCE AND FORMATS ! 1785: * OF THE VARIOUS FIELDS. ! 1786: * ! 1787: * THE ORDER IS ALPHABETICAL BY IDENTIFICATION CODE. ! 1788: {{EJC{{{{ ! 1789: * ! 1790: * DEFINITIONS OF BLOCK CODES ! 1791: * ! 1792: * THIS TABLE PROVIDES A UNIQUE IDENTIFICATION CODE FOR ! 1793: * EACH SEPARATE BLOCK TYPE. THE FIRST WORD OF A BLOCK IN ! 1794: * THE DYNAMIC AREA ALWAYS CONTAINS THE ADDRESS OF A PROGRAM ! 1795: * ENTRY POINT. THE BLOCK CODE IS USED AS THE ENTRY POINT ID ! 1796: * THE ORDER OF THESE CODES DICTATES THE ORDER OF THE TABLE ! 1797: * USED BY THE DATATYPE FUNCTION (SCNMT IN THE CONSTANT SEC) ! 1798: * ! 1799: * BLOCK CODES FOR ACCESSIBLE DATATYPES ! 1800: * ! 1801: {BL$AR{EQU{0{{{ARBLK ARRAY ! 1802: {BL$BC{EQU{BL$AR+1{{{BCBLK BUFFER ! 1803: {BL$CD{EQU{BL$BC+1{{{CDBLK CODE ! 1804: {BL$EX{EQU{BL$CD+1{{{EXBLK EXPRESSION ! 1805: {BL$IC{EQU{BL$EX+1{{{ICBLK INTEGER ! 1806: {BL$NM{EQU{BL$IC+1{{{NMBLK NAME ! 1807: {BL$P0{EQU{BL$NM+1{{{P0BLK PATTERN ! 1808: {BL$P1{EQU{BL$P0+1{{{P1BLK PATTERN ! 1809: {BL$P2{EQU{BL$P1+1{{{P2BLK PATTERN ! 1810: {BL$RC{EQU{BL$P2+1{{{RCBLK REAL ! 1811: {BL$SC{EQU{BL$RC+1{{{SCBLK STRING ! 1812: {BL$SE{EQU{BL$SC+1{{{SEBLK EXPRESSION ! 1813: {BL$TB{EQU{BL$SE+1{{{TBBLK TABLE ! 1814: {BL$VC{EQU{BL$TB+1{{{VCBLK ARRAY ! 1815: {BL$XN{EQU{BL$VC+1{{{XNBLK EXTERNAL ! 1816: {BL$XR{EQU{BL$XN+1{{{XRBLK EXTERNAL ! 1817: {BL$PD{EQU{BL$XR+1{{{PDBLK PROGRAM DEFINED DATATYPE ! 1818: * ! 1819: {BL$$D{EQU{BL$PD+1{{{NUMBER OF BLOCK CODES FOR DATA ! 1820: * ! 1821: * OTHER BLOCK CODES ! 1822: * ! 1823: {BL$TR{EQU{BL$PD+1{{{TRBLK ! 1824: {BL$BF{EQU{BL$TR+1{{{BFBLK ! 1825: {BL$CC{EQU{BL$BF+1{{{CCBLK ! 1826: {BL$CM{EQU{BL$CC+1{{{CMBLK ! 1827: {BL$CT{EQU{BL$CM+1{{{CTBLK ! 1828: {BL$DF{EQU{BL$CT+1{{{DFBLK ! 1829: {BL$EF{EQU{BL$DF+1{{{EFBLK ! 1830: {BL$EV{EQU{BL$EF+1{{{EVBLK ! 1831: {BL$FF{EQU{BL$EV+1{{{FFBLK ! 1832: {BL$KV{EQU{BL$FF+1{{{KVBLK ! 1833: {BL$PF{EQU{BL$KV+1{{{PFBLK ! 1834: {BL$TE{EQU{BL$PF+1{{{TEBLK ! 1835: * ! 1836: {BL$$I{EQU{0{{{DEFAULT IDENTIFICATION CODE ! 1837: {BL$$T{EQU{BL$TR+1{{{CODE FOR DATA OR TRACE BLOCK ! 1838: {BL$$${EQU{BL$TE+1{{{NUMBER OF BLOCK CODES ! 1839: {{EJC{{{{ ! 1840: * ! 1841: * FIELD REFERENCES ! 1842: * ! 1843: * REFERENCES TO THE FIELDS OF DATA BLOCKS ARE SYMBOLIC ! 1844: * (I.E. USE THE SYMBOLIC OFFSETS) WITH THE FOLLOWING ! 1845: * EXCEPTIONS. ! 1846: * ! 1847: * 1) REFERENCES TO THE FIRST WORD ARE USUALLY NOT ! 1848: * SYMBOLIC SINCE THEY USE THE (X) OPERAND FORMAT. ! 1849: * ! 1850: * 2) THE CODE WHICH CONSTRUCTS A BLOCK IS OFTEN NOT ! 1851: * SYMBOLIC AND SHOULD BE CHANGED IF THE CORRESPONDING ! 1852: * BLOCK FORMAT IS MODIFIED. ! 1853: * ! 1854: * 3) THE PLC AND PSC INSTRUCTIONS IMPLY AN OFFSET ! 1855: * CORRESPONDING TO THE DEFINITION OF CFP$F. ! 1856: * ! 1857: * 4) THERE ARE NON-SYMBOLIC REFERENCES (EASILY CHANGED) ! 1858: * IN THE GARBAGE COLLECTOR (PROCEDURES GBCPF, BLKLN). ! 1859: * ! 1860: * 5) THE FIELDS IDVAL, FARGS APPEAR IN SEVERAL BLOCKS ! 1861: * AND ANY CHANGES MUST BE MADE IN PARALLEL TO ALL ! 1862: * BLOCKS CONTAINING THE FIELDS. THE ACTUAL REFERENCES ! 1863: * TO THESE FIELDS ARE SYMBOLIC WITH THE ABOVE ! 1864: * LISTED EXCEPTIONS. ! 1865: * ! 1866: * 6) SEVERAL SPOTS IN THE CODE ASSUME THAT THE ! 1867: * DEFINITIONS OF THE FIELDS VRVAL, TEVAL, TRNXT ARE ! 1868: * THE SAME (THESE ARE SECTIONS OF CODE WHICH SEARCH ! 1869: * OUT ALONG A TRBLK CHAIN FROM A VARIABLE). ! 1870: * ! 1871: * 7) REFERENCES TO THE FIELDS OF AN ARRAY BLOCK IN THE ! 1872: * ARRAY REFERENCE ROUTINE ARREF ARE NON-SYMBOLIC. ! 1873: * ! 1874: * APART FROM THE EXCEPTIONS LISTED, REFERENCES ARE SYMBOLIC ! 1875: * AS FAR AS POSSIBLE AND MODIFYING THE ORDER OR NUMBER ! 1876: * OF FIELDS WILL NOT REQUIRE CHANGES. ! 1877: {{EJC{{{{ ! 1878: * ! 1879: * COMMON FIELDS FOR FUNCTION BLOCKS ! 1880: * ! 1881: * BLOCKS WHICH REPRESENT CALLABLE FUNCTIONS HAVE TWO ! 1882: * COMMON FIELDS AT THE START OF THE BLOCK AS FOLLOWS. ! 1883: * ! 1884: * +------------------------------------+ ! 1885: * I FCODE I ! 1886: * +------------------------------------+ ! 1887: * I FARGS I ! 1888: * +------------------------------------+ ! 1889: * / / ! 1890: * / REST OF FUNCTION BLOCK / ! 1891: * / / ! 1892: * +------------------------------------+ ! 1893: * ! 1894: {FCODE{EQU{0{{{POINTER TO CODE FOR FUNCTION ! 1895: {FARGS{EQU{1{{{NUMBER OF ARGUMENTS ! 1896: * ! 1897: * FCODE IS A POINTER TO THE LOCATION IN THE INTERPRETOR ! 1898: * PROGRAM WHICH PROCESSES THIS TYPE OF FUNCTION CALL. ! 1899: * ! 1900: * FARGS IS THE EXPECTED NUMBER OF ARGUMENTS. THE ACTUAL ! 1901: * NUMBER OF ARGUMENTS IS ADJUSTED TO THIS AMOUNT BY ! 1902: * DELETING EXTRA ARGUMENTS OR SUPPLYING TRAILING NULLS ! 1903: * FOR MISSING ONES BEFORE TRANSFERRING THOUGH FCODE. ! 1904: * A VALUE OF 999 MAY BE USED IN THIS FIELD TO INDICATE A ! 1905: * VARIABLE NUMBER OF ARGUMENTS (SEE SVBLK FIELD SVNAR). ! 1906: * ! 1907: * THE BLOCK TYPES WHICH FOLLOW THIS SCHEME ARE. ! 1908: * ! 1909: * FFBLK FIELD FUNCTION ! 1910: * DFBLK DATATYPE FUNCTION ! 1911: * PFBLK PROGRAM DEFINED FUNCTION ! 1912: * EFBLK EXTERNAL LOADED FUNCTION ! 1913: {{EJC{{{{ ! 1914: * ! 1915: * IDENTIFICATION FIELD ! 1916: * ! 1917: * ! 1918: * ID FIELD ! 1919: * ! 1920: * CERTAIN PROGRAM ACCESSIBLE OBJECTS (THOSE WHICH CONTAIN ! 1921: * OTHER DATA VALUES AND CAN BE COPIED) ARE GIVEN A UNIQUE ! 1922: * IDENTIFICATION NUMBER (SEE EXSID). THIS ID VALUE IS AN ! 1923: * ADDRESS INTEGER VALUE WHICH IS ALWAYS STORED IN WORD TWO. ! 1924: * ! 1925: {IDVAL{EQU{1{{{ID VALUE FIELD ! 1926: * ! 1927: * THE BLOCKS CONTAINING AN IDVAL FIELD ARE. ! 1928: * ! 1929: * ARBLK ARRAY ! 1930: * BCBLK BUFFER CONTROL BLOCK ! 1931: * PDBLK PROGRAM DEFINED DATATYPE ! 1932: * TBBLK TABLE ! 1933: * VCBLK VECTOR BLOCK (ARRAY) ! 1934: * ! 1935: * NOTE THAT A ZERO IDVAL MEANS THAT THE BLOCK IS ONLY ! 1936: * HALF BUILT AND SHOULD NOT BE DUMPED (SEE DUMPR). ! 1937: {{EJC{{{{ ! 1938: * ! 1939: * ARRAY BLOCK (ARBLK) ! 1940: * ! 1941: * AN ARRAY BLOCK REPRESENTS AN ARRAY VALUE OTHER THAN ONE ! 1942: * WITH ONE DIMENSION WHOSE LOWER BOUND IS ONE (SEE VCBLK). ! 1943: * AN ARBLK IS BUILT WITH A CALL TO THE FUNCTIONS CONVERT ! 1944: * (S$CNV) OR ARRAY (S$ARR). ! 1945: * ! 1946: * +------------------------------------+ ! 1947: * I ARTYP I ! 1948: * +------------------------------------+ ! 1949: * I IDVAL I ! 1950: * +------------------------------------+ ! 1951: * I ARLEN I ! 1952: * +------------------------------------+ ! 1953: * I AROFS I ! 1954: * +------------------------------------+ ! 1955: * I ARNDM I ! 1956: * +------------------------------------+ ! 1957: * * ARLBD * ! 1958: * +------------------------------------+ ! 1959: * * ARDIM * ! 1960: * +------------------------------------+ ! 1961: * * * ! 1962: * * ABOVE 2 FLDS REPEATED FOR EACH DIM * ! 1963: * * * ! 1964: * +------------------------------------+ ! 1965: * I ARPRO I ! 1966: * +------------------------------------+ ! 1967: * / / ! 1968: * / ARVLS / ! 1969: * / / ! 1970: * +------------------------------------+ ! 1971: {{EJC{{{{ ! 1972: * ! 1973: * ARRAY BLOCK (CONTINUED) ! 1974: * ! 1975: {ARTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$ART ! 1976: {ARLEN{EQU{IDVAL+1{{{LENGTH OF ARBLK IN BYTES ! 1977: {AROFS{EQU{ARLEN+1{{{OFFSET IN ARBLK TO ARPRO FIELD ! 1978: {ARNDM{EQU{AROFS+1{{{NUMBER OF DIMENSIONS ! 1979: {ARLBD{EQU{ARNDM+1{{{LOW BOUND (FIRST SUBSCRIPT) ! 1980: {ARDIM{EQU{ARLBD+CFP$I{{{DIMENSION (FIRST SUBSCRIPT) ! 1981: {ARLB2{EQU{ARDIM+CFP$I{{{LOW BOUND (SECOND SUBSCRIPT) ! 1982: {ARDM2{EQU{ARLB2+CFP$I{{{DIMENSION (SECOND SUBSCRIPT) ! 1983: {ARPRO{EQU{ARDIM+CFP$I{{{ARRAY PROTOTYPE (ONE DIMENSION) ! 1984: {ARVLS{EQU{ARPRO+1{{{START OF VALUES (ONE DIMENSION) ! 1985: {ARPR2{EQU{ARDM2+CFP$I{{{ARRAY PROTOTYPE (TWO DIMENSIONS) ! 1986: {ARVL2{EQU{ARPR2+1{{{START OF VALUES (TWO DIMENSIONS) ! 1987: {ARSI${EQU{ARLBD{{{NUMBER OF STANDARD FIELDS IN BLOCK ! 1988: {ARDMS{EQU{ARLB2-ARLBD{{{SIZE OF INFO FOR ONE SET OF BOUNDS ! 1989: * ! 1990: * THE BOUNDS AND DIMENSION FIELDS ARE SIGNED INTEGER ! 1991: * VALUES AND EACH OCCUPY CFP$I WORDS IN THE ARBLK. ! 1992: * ! 1993: * THE LENGTH OF AN ARBLK IN BYTES MAY NOT EXCEED MXLEN. ! 1994: * THIS IS REQUIRED TO KEEP NAME OFFSETS GARBAGE COLLECTABLE ! 1995: * ! 1996: * THE ACTUAL VALUES ARE ARRANGED IN ROW-WISE ORDER AND ! 1997: * CAN CONTAIN A DATA POINTER OR A POINTER TO A TRBLK. ! 1998: * ! 1999: * BUFFER CONTROL BLOCK (BCBLK) ! 2000: * ! 2001: * A BCBLK IS BUILT FOR EVERY BFBLK. ! 2002: * ! 2003: * +------------------------------------+ ! 2004: * I BCTYP I ! 2005: * +------------------------------------+ ! 2006: * I IDVAL I ! 2007: * +------------------------------------+ ! 2008: * I BCLEN I ! 2009: * +------------------------------------+ ! 2010: * I BCBUF I ! 2011: * +------------------------------------+ ! 2012: * ! 2013: {BCTYP{EQU{0{{{PTR TO DUMMY ROUTINE B$BCT ! 2014: {BCLEN{EQU{IDVAL+1{{{DEFINED BUFFER LENGTH ! 2015: {BCBUF{EQU{BCLEN+1{{{PTR TO BFBLK ! 2016: {BCSI${EQU{BCBUF+1{{{SIZE OF BCBLK ! 2017: * ! 2018: * A BCBLK IS AN INDIRECT CONTROL HEADER FOR BFBLK. ! 2019: * THE REASON FOR NOT STORING THIS DATA DIRECTLY ! 2020: * IN THE RELATED BFBLK IS SO THAT THE BFBLK CAN ! 2021: * MAINTAIN THE SAME SKELETAL STRUCTURE AS AN SCBLK ! 2022: * THUS FACILITATING TRANSPARENT STRING OPERATIONS ! 2023: * (FOR THE MOST PART). SPECIFICALLY, CFP$F IS THE ! 2024: * SAME FOR A BFBLK AS FOR AN SCBLK. BY CONVENTION, ! 2025: * WHEREEVER A BUFFER VALUE IS EMPLOYED, THE BCBLK ! 2026: * IS POINTED TO. ! 2027: * ! 2028: * THE CORRESPONDING BFBLK IS POINTED TO BY THE ! 2029: * BCBUF POINTER IN THE BCBLK. ! 2030: * ! 2031: * BCLEN IS THE CURRENT DEFINED SIZE OF THE CHARACTER ! 2032: * ARRAY IN THE BFBLK. CHARACTERS FOLLOWING THE OFFSET ! 2033: * OF BCLEN ARE UNDEFINED. ! 2034: * ! 2035: {{EJC{{{{ ! 2036: * ! 2037: * STRING BUFFER BLOCK (BFBLK) ! 2038: * ! 2039: * A BFBLK IS BUILT BY A CALL TO BUFFER(...) ! 2040: * ! 2041: * +------------------------------------+ ! 2042: * I BFTYP I ! 2043: * +------------------------------------+ ! 2044: * I BFALC I ! 2045: * +------------------------------------+ ! 2046: * / / ! 2047: * / BFCHR / ! 2048: * / / ! 2049: * +------------------------------------+ ! 2050: * ! 2051: {BFTYP{EQU{0{{{PTR TO DUMMY ROUTINE B$BFT ! 2052: {BFALC{EQU{BFTYP+1{{{ALLOCATED SIZE OF BUFFER ! 2053: {BFCHR{EQU{BFALC+1{{{CHARACTERS OF STRING ! 2054: {BFSI${EQU{BFCHR{{{SIZE OF STANDARD FIELDS IN BFBLK ! 2055: * ! 2056: * THE CHARACTERS IN THE BUFFER ARE STORED LEFT JUSTIFIED. ! 2057: * THE FINAL WORD OF DEFINED CHARACTERS IS ALWAYS ZERO ! 2058: * (CHARACTER) PADDED. ANY TRAILING ALLOCATION PAST THE ! 2059: * WORD CONTAINING THE LAST CHARACTER CONTAINS ! 2060: * UNPREDICTABLE CONTENTS AND IS NEVER REFERENCED. ! 2061: * ! 2062: * NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING ! 2063: * IS GIVEN BY CFP$F, AS WITH AN SCBLK. HOWEVER, THE ! 2064: * OFFSET WHICH IS OCCUPIED BY THE LENGTH FOR AN SCBLK ! 2065: * IS THE TOTAL CHAR SPACE FOR BFBLKS, AND ROUTINES WHICH ! 2066: * DEAL WITH BOTH MUST ACCOUNT FOR THIS DIFFERENCE. ! 2067: * ! 2068: * THE VALUE OF BFALC MAY NOT EXCEED MXLEN. THE VALUE OF ! 2069: * BCLEN IS ALWAYS LESS THAN OR EQUAL TO BFALC. ! 2070: * ! 2071: {{EJC{{{{ ! 2072: * ! 2073: * CODE CONSTRUCTION BLOCK (CCBLK) ! 2074: * ! 2075: * AT ANY ONE MOMENT THERE IS AT MOST ONE CCBLK INTO ! 2076: * WHICH THE COMPILER IS CURRENTLY STORING CODE (CDWRD). ! 2077: * ! 2078: * +------------------------------------+ ! 2079: * I CCTYP I ! 2080: * +------------------------------------+ ! 2081: * I CCLEN I ! 2082: * +------------------------------------+ ! 2083: * I CCUSE I ! 2084: * +------------------------------------+ ! 2085: * / / ! 2086: * / CCCOD / ! 2087: * / / ! 2088: * +------------------------------------+ ! 2089: * ! 2090: {CCTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$CCT ! 2091: {CCLEN{EQU{CCTYP+1{{{LENGTH OF CCBLK IN BYTES ! 2092: {CCUSE{EQU{CCLEN+1{{{OFFSET PAST LAST USED WORD (BYTES) ! 2093: {CCCOD{EQU{CCUSE+1{{{START OF GENERATED CODE IN BLOCK ! 2094: * ! 2095: * THE REASON THAT THE CCBLK IS A SEPARATE BLOCK TYPE FROM ! 2096: * THE USUAL CDBLK IS THAT THE GARBAGE COLLECTOR MUST ! 2097: * ONLY PROCESS THOSE FIELDS WHICH HAVE BEEN SET (SEE GBCPF) ! 2098: {{EJC{{{{ ! 2099: * ! 2100: * CODE BLOCK (CDBLK) ! 2101: * ! 2102: * A CODE BLOCK IS BUILT FOR EACH STATEMENT COMPILED DURING ! 2103: * THE INITIAL COMPILATION OR BY SUBSEQUENT CALLS TO CODE. ! 2104: * ! 2105: * +------------------------------------+ ! 2106: * I CDJMP I ! 2107: * +------------------------------------+ ! 2108: * I CDSTM I ! 2109: * +------------------------------------+ ! 2110: * I CDLEN I ! 2111: * +------------------------------------+ ! 2112: * I CDFAL I ! 2113: * +------------------------------------+ ! 2114: * / / ! 2115: * / CDCOD / ! 2116: * / / ! 2117: * +------------------------------------+ ! 2118: * ! 2119: {CDJMP{EQU{0{{{PTR TO ROUTINE TO EXECUTE STATEMENT ! 2120: {CDSTM{EQU{CDJMP+1{{{STATEMENT NUMBER ! 2121: {CDLEN{EQU{OFFS2{{{LENGTH OF CDBLK IN BYTES ! 2122: {CDFAL{EQU{OFFS3{{{FAILURE EXIT (SEE BELOW) ! 2123: {CDCOD{EQU{CDFAL+1{{{EXECUTABLE PSEUDO-CODE ! 2124: {CDSI${EQU{CDCOD{{{NUMBER OF STANDARD FIELDS IN CDBLK ! 2125: * ! 2126: * CDSTM IS THE STATEMENT NUMBER OF THE CURRENT STATEMENT. ! 2127: * ! 2128: * CDJMP, CDFAL ARE SET AS FOLLOWS. ! 2129: * ! 2130: * 1) IF THE FAILURE EXIT IS THE NEXT STATEMENT ! 2131: * ! 2132: * CDJMP = B$CDS ! 2133: * CDFAL = PTR TO CDBLK FOR NEXT STATEMENT ! 2134: * ! 2135: * 2) IF THE FAILURE EXIT IS A SIMPLE LABEL NAME ! 2136: * ! 2137: * CDJMP = B$CDS ! 2138: * CDFAL IS A PTR TO THE VRTRA FIELD OF THE VRBLK ! 2139: * ! 2140: * 3) IF THERE IS NO FAILURE EXIT (-NOFAIL MODE) ! 2141: * ! 2142: * CDJMP = B$CDS ! 2143: * CDFAL = O$UNF ! 2144: * ! 2145: * 4) IF THE FAILURE EXIT IS COMPLEX OR DIRECT ! 2146: * ! 2147: * CDJMP = B$CDC ! 2148: * CDFAL IS THE OFFSET TO THE O$GOF WORD ! 2149: {{EJC{{{{ ! 2150: * ! 2151: * CODE BLOCK (CONTINUED) ! 2152: * ! 2153: * CDCOD IS THE START OF THE ACTUAL CODE. FIRST WE DESCRIBE ! 2154: * THE CODE GENERATED FOR AN EXPRESSION. IN AN EXPRESSION, ! 2155: * ELEMENTS ARE FETCHED BY NAME OR BY VALUE. FOR EXAMPLE, ! 2156: * THE BINARY EQUAL OPERATOR FETCHES ITS LEFT ARGUMENT ! 2157: * BY NAME AND ITS RIGHT ARGUMENT BY VALUE. THESE TWO ! 2158: * CASES GENERATE QUITE DIFFERENT CODE AND ARE DESCRIBED ! 2159: * SEPARATELY. FIRST WE CONSIDER THE CODE BY VALUE CASE. ! 2160: * ! 2161: * GENERATION OF CODE BY VALUE FOR EXPRESSIONS ELEMENTS. ! 2162: * ! 2163: * EXPRESSION POINTER TO EXBLK OR SEBLK ! 2164: * ! 2165: * INTEGER CONSTANT POINTER TO ICBLK ! 2166: * ! 2167: * NULL CONSTANT POINTER TO NULLS ! 2168: * ! 2169: * PATTERN (RESULTING FROM PREEVALUATION) ! 2170: * =O$LPT ! 2171: * POINTER TO P0BLK,P1BLK OR P2BLK ! 2172: * ! 2173: * REAL CONSTANT POINTER TO RCBLK ! 2174: * ! 2175: * STRING CONSTANT POINTER TO SCBLK ! 2176: * ! 2177: * VARIABLE POINTER TO VRGET FIELD OF VRBLK ! 2178: * ! 2179: * ADDITION VALUE CODE FOR LEFT OPERAND ! 2180: * VALUE CODE FOR RIGHT OPERAND ! 2181: * =O$ADD ! 2182: * ! 2183: * AFFIRMATION VALUE CODE FOR OPERAND ! 2184: * =O$AFF ! 2185: * ! 2186: * ALTERNATION VALUE CODE FOR LEFT OPERAND ! 2187: * VALUE CODE FOR RIGHT OPERAND ! 2188: * =O$ALT ! 2189: * ! 2190: * ARRAY REFERENCE (CASE OF ONE SUBSCRIPT) ! 2191: * VALUE CODE FOR ARRAY OPERAND ! 2192: * VALUE CODE FOR SUBSCRIPT OPERAND ! 2193: * =O$AOV ! 2194: * ! 2195: * (CASE OF MORE THAN ONE SUBSCRIPT) ! 2196: * VALUE CODE FOR ARRAY OPERAND ! 2197: * VALUE CODE FOR FIRST SUBSCRIPT ! 2198: * VALUE CODE FOR SECOND SUBSCRIPT ! 2199: * ... ! 2200: * VALUE CODE FOR LAST SUBSCRIPT ! 2201: * =O$AMV ! 2202: * NUMBER OF SUBSCRIPTS ! 2203: {{EJC{{{{ ! 2204: * ! 2205: * CODE BLOCK (CONTINUED) ! 2206: * ! 2207: * ASSIGNMENT (TO NATURAL VARIABLE) ! 2208: * VALUE CODE FOR RIGHT OPERAND ! 2209: * POINTER TO VRSTO FIELD OF VRBLK ! 2210: * ! 2211: * (TO ANY OTHER VARIABLE) ! 2212: * NAME CODE FOR LEFT OPERAND ! 2213: * VALUE CODE FOR RIGHT OPERAND ! 2214: * =O$ASS ! 2215: * ! 2216: * COMPILE ERROR =O$CER ! 2217: * ! 2218: * ! 2219: * COMPLEMENTATION VALUE CODE FOR OPERAND ! 2220: * =O$COM ! 2221: * ! 2222: * CONCATENATION (CASE OF PRED FUNC LEFT OPERAND) ! 2223: * VALUE CODE FOR LEFT OPERAND ! 2224: * =O$POP ! 2225: * VALUE CODE FOR RIGHT OPERAND ! 2226: * ! 2227: * (ALL OTHER CASES) ! 2228: * VALUE CODE FOR LEFT OPERAND ! 2229: * VALUE CODE FOR RIGHT OPERAND ! 2230: * =O$CNC ! 2231: * ! 2232: * CURSOR ASSIGNMENT NAME CODE FOR OPERAND ! 2233: * =O$CAS ! 2234: * ! 2235: * DIVISION VALUE CODE FOR LEFT OPERAND ! 2236: * VALUE CODE FOR RIGHT OPERAND ! 2237: * =O$DVD ! 2238: * ! 2239: * EXPONENTIATION VALUE CODE FOR LEFT OPERAND ! 2240: * VALUE CODE FOR RIGHT OPERAND ! 2241: * =O$EXP ! 2242: * ! 2243: * FUNCTION CALL (CASE OF CALL TO SYSTEM FUNCTION) ! 2244: * VALUE CODE FOR FIRST ARGUMENT ! 2245: * VALUE CODE FOR SECOND ARGUMENT ! 2246: * ... ! 2247: * VALUE CODE FOR LAST ARGUMENT ! 2248: * POINTER TO SVFNC FIELD OF SVBLK ! 2249: * ! 2250: {{EJC{{{{ ! 2251: * ! 2252: * CODE BLOCK (CONTINUED) ! 2253: * ! 2254: * FUNCTION CALL (CASE OF NON-SYSTEM FUNCTION 1 ARG) ! 2255: * VALUE CODE FOR ARGUMENT ! 2256: * =O$FNS ! 2257: * POINTER TO VRBLK FOR FUNCTION ! 2258: * ! 2259: * (NON-SYSTEM FUNCTION, GT 1 ARG) ! 2260: * VALUE CODE FOR FIRST ARGUMENT ! 2261: * VALUE CODE FOR SECOND ARGUMENT ! 2262: * ... ! 2263: * VALUE CODE FOR LAST ARGUMENT ! 2264: * =O$FNC ! 2265: * NUMBER OF ARGUMENTS ! 2266: * POINTER TO VRBLK FOR FUNCTION ! 2267: * ! 2268: * IMMEDIATE ASSIGNMENT VALUE CODE FOR LEFT OPERAND ! 2269: * NAME CODE FOR RIGHT OPERAND ! 2270: * =O$IMA ! 2271: * ! 2272: * INDIRECTION VALUE CODE FOR OPERAND ! 2273: * =O$INV ! 2274: * ! 2275: * INTERROGATION VALUE CODE FOR OPERAND ! 2276: * =O$INT ! 2277: * ! 2278: * KEYWORD REFERENCE NAME CODE FOR OPERAND ! 2279: * =O$KWV ! 2280: * ! 2281: * MULTIPLICATION VALUE CODE FOR LEFT OPERAND ! 2282: * VALUE CODE FOR RIGHT OPERAND ! 2283: * =O$MLT ! 2284: * ! 2285: * NAME REFERENCE (NATURAL VARIABLE CASE) ! 2286: * POINTER TO NMBLK FOR NAME ! 2287: * ! 2288: * (ALL OTHER CASES) ! 2289: * NAME CODE FOR OPERAND ! 2290: * =O$NAM ! 2291: * ! 2292: * NEGATION =O$NTA ! 2293: * CDBLK OFFSET OF O$NTC WORD ! 2294: * VALUE CODE FOR OPERAND ! 2295: * =O$NTB ! 2296: * =O$NTC ! 2297: {{EJC{{{{ ! 2298: * ! 2299: * CODE BLOCK (CONTINUED) ! 2300: * ! 2301: * PATTERN ASSIGNMENT VALUE CODE FOR LEFT OPERAND ! 2302: * NAME CODE FOR RIGHT OPERAND ! 2303: * =O$PAS ! 2304: * ! 2305: * PATTERN MATCH VALUE CODE FOR LEFT OPERAND ! 2306: * VALUE CODE FOR RIGHT OPERAND ! 2307: * =O$PMV ! 2308: * ! 2309: * PATTERN REPLACEMENT NAME CODE FOR SUBJECT ! 2310: * VALUE CODE FOR PATTERN ! 2311: * =O$PMN ! 2312: * VALUE CODE FOR REPLACEMENT ! 2313: * =O$RPL ! 2314: * ! 2315: * SELECTION (FOR FIRST ALTERNATIVE) ! 2316: * =O$SLA ! 2317: * CDBLK OFFSET TO NEXT O$SLC WORD ! 2318: * VALUE CODE FOR FIRST ALTERNATIVE ! 2319: * =O$SLB ! 2320: * CDBLK OFFSET PAST ALTERNATIVES ! 2321: * ! 2322: * (FOR SUBSEQUENT ALTERNATIVES) ! 2323: * =O$SLC ! 2324: * CDBLK OFFSET TO NEXT O$SLC,O$SLD ! 2325: * VALUE CODE FOR ALTERNATIVE ! 2326: * =O$SLB ! 2327: * OFFSET IN CDBLK PAST ALTERNATIVES ! 2328: * ! 2329: * (FOR LAST ALTERNATIVE) ! 2330: * =O$SLD ! 2331: * VALUE CODE FOR LAST ALTERNATIVE ! 2332: * ! 2333: * SUBTRACTION VALUE CODE FOR LEFT OPERAND ! 2334: * VALUE CODE FOR RIGHT OPERAND ! 2335: * =O$SUB ! 2336: {{EJC{{{{ ! 2337: * ! 2338: * CODE BLOCK (CONTINUED) ! 2339: * ! 2340: * GENERATION OF CODE BY NAME FOR EXPRESSION ELEMENTS. ! 2341: * ! 2342: * VARIABLE =O$LVN ! 2343: * POINTER TO VRBLK ! 2344: * ! 2345: * EXPRESSION (CASE OF *NATURAL VARIABLE) ! 2346: * =O$LVN ! 2347: * POINTER TO VRBLK ! 2348: * ! 2349: * (ALL OTHER CASES) ! 2350: * =O$LEX ! 2351: * POINTER TO EXBLK ! 2352: * ! 2353: * ! 2354: * ARRAY REFERENCE (CASE OF ONE SUBSCRIPT) ! 2355: * VALUE CODE FOR ARRAY OPERAND ! 2356: * VALUE CODE FOR SUBSCRIPT OPERAND ! 2357: * =O$AON ! 2358: * ! 2359: * (CASE OF MORE THAN ONE SUBSCRIPT) ! 2360: * VALUE CODE FOR ARRAY OPERAND ! 2361: * VALUE CODE FOR FIRST SUBSCRIPT ! 2362: * VALUE CODE FOR SECOND SUBSCRIPT ! 2363: * ... ! 2364: * VALUE CODE FOR LAST SUBSCRIPT ! 2365: * =O$AMN ! 2366: * NUMBER OF SUBSCRIPTS ! 2367: * ! 2368: * COMPILE ERROR =O$CER ! 2369: * ! 2370: * FUNCTION CALL (SAME CODE AS FOR VALUE CALL) ! 2371: * =O$FNE ! 2372: * ! 2373: * INDIRECTION VALUE CODE FOR OPERAND ! 2374: * =O$INN ! 2375: * ! 2376: * KEYWORD REFERENCE NAME CODE FOR OPERAND ! 2377: * =O$KWN ! 2378: * ! 2379: * ANY OTHER OPERAND IS AN ERROR IN A NAME POSITION ! 2380: * ! 2381: * NOTE THAT IN THIS DESCRIPTION, =O$XXX REFERS TO THE ! 2382: * GENERATION OF A WORD CONTAINING THE ADDRESS OF ANOTHER ! 2383: * WORD WHICH CONTAINS THE ENTRY POINT ADDRESS O$XXX. ! 2384: {{EJC{{{{ ! 2385: * ! 2386: * CODE BLOCK (CONTINUED) ! 2387: * ! 2388: * NOW WE CONSIDER THE OVERALL STRUCTURE OF THE CODE BLOCK ! 2389: * FOR A STATEMENT WITH POSSIBLE GOTO FIELDS. ! 2390: * ! 2391: * FIRST COMES THE CODE FOR THE STATEMENT BODY. ! 2392: * THE STATEMENT BODY IS AN EXPRESSION TO BE EVALUATED ! 2393: * BY VALUE ALTHOUGH THE VALUE IS NOT ACTUALLY REQUIRED. ! 2394: * NORMAL VALUE CODE IS GENERATED FOR THE BODY OF THE ! 2395: * STATEMENT EXCEPT IN THE CASE OF A PATTERN MATCH BY ! 2396: * VALUE, IN WHICH CASE THE FOLLOWING IS GENERATED. ! 2397: * ! 2398: * VALUE CODE FOR LEFT OPERAND ! 2399: * VALUE CODE FOR RIGHT OPERAND ! 2400: * =O$PMS ! 2401: * ! 2402: * NEXT WE HAVE THE CODE FOR THE SUCCESS GOTO. THERE ARE ! 2403: * SEVERAL CASES AS FOLLOWS. ! 2404: * ! 2405: * 1) NO SUCCESS GOTO PTR TO CDBLK FOR NEXT STATEMENT ! 2406: * ! 2407: * 2) SIMPLE LABEL PTR TO VRTRA FIELD OF VRBLK ! 2408: * ! 2409: * 3) COMPLEX GOTO (CODE BY NAME FOR GOTO OPERAND) ! 2410: * =O$GOC ! 2411: * ! 2412: * 4) DIRECT GOTO (CODE BY VALUE FOR GOTO OPERAND) ! 2413: * =O$GOD ! 2414: * ! 2415: * FOLLOWING THIS WE GENERATE CODE FOR THE FAILURE GOTO IF ! 2416: * IT IS DIRECT OR IF IT IS COMPLEX, SIMPLE FAILURE GOTOS ! 2417: * HAVING BEEN HANDLED BY AN APPROPRIATE SETTING OF THE ! 2418: * CDFAL FIELD OF THE CDBLK. THE GENERATED CODE IS ONE ! 2419: * OF THE FOLLOWING. ! 2420: * ! 2421: * 1) COMPLEX FGOTO =O$FIF ! 2422: * =O$GOF ! 2423: * NAME CODE FOR GOTO OPERAND ! 2424: * =O$GOC ! 2425: * ! 2426: * 2) DIRECT FGOTO =O$FIF ! 2427: * =O$GOF ! 2428: * VALUE CODE FOR GOTO OPERAND ! 2429: * =O$GOD ! 2430: * ! 2431: * AN OPTIMIZATION OCCURS IF THE SUCCESS AND FAILURE GOTOS ! 2432: * ARE IDENTICAL AND EITHER COMPLEX OR DIRECT. IN THIS CASE, ! 2433: * NO CODE IS GENERATED FOR THE SUCCESS GOTO AND CONTROL ! 2434: * IS ALLOWED TO FALL INTO THE FAILURE GOTO ON SUCCESS. ! 2435: {{EJC{{{{ ! 2436: * ! 2437: * COMPILER BLOCK (CMBLK) ! 2438: * ! 2439: * A COMPILER BLOCK (CMBLK) IS BUILT BY EXPAN TO REPRESENT ! 2440: * ONE NODE OF A TREE STRUCTURED EXPRESSION REPRESENTATION. ! 2441: * ! 2442: * +------------------------------------+ ! 2443: * I CMIDN I ! 2444: * +------------------------------------+ ! 2445: * I CMLEN I ! 2446: * +------------------------------------+ ! 2447: * I CMTYP I ! 2448: * +------------------------------------+ ! 2449: * I CMOPN I ! 2450: * +------------------------------------+ ! 2451: * / CMVLS OR CMROP / ! 2452: * / / ! 2453: * / CMLOP / ! 2454: * / / ! 2455: * +------------------------------------+ ! 2456: * ! 2457: {CMIDN{EQU{0{{{POINTER TO DUMMY ROUTINE B$CMT ! 2458: {CMLEN{EQU{CMIDN+1{{{LENGTH OF CMBLK IN BYTES ! 2459: {CMTYP{EQU{CMLEN+1{{{TYPE (C$XXX, SEE LIST BELOW) ! 2460: {CMOPN{EQU{CMTYP+1{{{OPERAND POINTER (SEE BELOW) ! 2461: {CMVLS{EQU{CMOPN+1{{{OPERAND VALUE POINTERS (SEE BELOW) ! 2462: {CMROP{EQU{CMVLS{{{RIGHT (ONLY) OPERATOR OPERAND ! 2463: {CMLOP{EQU{CMVLS+1{{{LEFT OPERATOR OPERAND ! 2464: {CMSI${EQU{CMVLS{{{NUMBER OF STANDARD FIELDS IN CMBLK ! 2465: {CMUS${EQU{CMSI$+1{{{SIZE OF UNARY OPERATOR CMBLK ! 2466: {CMBS${EQU{CMSI$+2{{{SIZE OF BINARY OPERATOR CMBLK ! 2467: {CMAR1{EQU{CMVLS+1{{{ARRAY SUBSCRIPT POINTERS ! 2468: * ! 2469: * THE CMOPN AND CMVLS FIELDS ARE SET AS FOLLOWS ! 2470: * ! 2471: * ARRAY REFERENCE CMOPN = PTR TO ARRAY OPERAND ! 2472: * CMVLS = PTRS TO SUBSCRIPT OPERANDS ! 2473: * ! 2474: * FUNCTION CALL CMOPN = PTR TO VRBLK FOR FUNCTION ! 2475: * CMVLS = PTRS TO ARGUMENT OPERANDS ! 2476: * ! 2477: * SELECTION CMOPN = ZERO ! 2478: * CMVLS = PTRS TO ALTERNATE OPERANDS ! 2479: * ! 2480: * UNARY OPERATOR CMOPN = PTR TO OPERATOR DVBLK ! 2481: * CMROP = PTR TO OPERAND ! 2482: * ! 2483: * BINARY OPERATOR CMOPN = PTR TO OPERATOR DVBLK ! 2484: * CMROP = PTR TO RIGHT OPERAND ! 2485: * CMLOP = PTR TO LEFT OPERAND ! 2486: {{EJC{{{{ ! 2487: * ! 2488: * CMTYP IS SET TO INDICATE THE TYPE OF EXPRESSION ELEMENT ! 2489: * AS SHOWN BY THE FOLLOWING TABLE OF DEFINITIONS. ! 2490: * ! 2491: {C$ARR{EQU{0{{{ARRAY REFERENCE ! 2492: {C$FNC{EQU{C$ARR+1{{{FUNCTION CALL ! 2493: {C$DEF{EQU{C$FNC+1{{{DEFERRED EXPRESSION (UNARY *) ! 2494: {C$IND{EQU{C$DEF+1{{{INDIRECTION (UNARY $) ! 2495: {C$KEY{EQU{C$IND+1{{{KEYWORD REFERENCE (UNARY AMPERSAND) ! 2496: {C$UBO{EQU{C$KEY+1{{{UNDEFINED BINARY OPERATOR ! 2497: {C$UUO{EQU{C$UBO+1{{{UNDEFINED UNARY OPERATOR ! 2498: {C$UO${EQU{C$UUO+1{{{TEST VALUE (=C$UUO+1=C$UBO+2) ! 2499: {C$$NM{EQU{C$UUO+1{{{NUMBER OF CODES FOR NAME OPERANDS ! 2500: * ! 2501: * THE REMAINING TYPES INDICATE EXPRESSION ELEMENTS WHICH ! 2502: * CAN ONLY BE EVALUATED BY VALUE (NOT BY NAME). ! 2503: * ! 2504: {C$BVL{EQU{C$UUO+1{{{BINARY OP WITH VALUE OPERANDS ! 2505: {C$UVL{EQU{C$BVL+1{{{UNARY OPERATOR WITH VALUE OPERAND ! 2506: {C$ALT{EQU{C$UVL+1{{{ALTERNATION (BINARY BAR) ! 2507: {C$CNC{EQU{C$ALT+1{{{CONCATENATION ! 2508: {C$CNP{EQU{C$CNC+1{{{CONCATENATION, NOT PATTERN MATCH ! 2509: {C$UNM{EQU{C$CNP+1{{{UNARY OP WITH NAME OPERAND ! 2510: {C$BVN{EQU{C$UNM+1{{{BINARY OP (OPERANDS BY VALUE, NAME) ! 2511: {C$ASS{EQU{C$BVN+1{{{ASSIGNMENT ! 2512: {C$INT{EQU{C$ASS+1{{{INTERROGATION ! 2513: {C$NEG{EQU{C$INT+1{{{NEGATION (UNARY NOT) ! 2514: {C$SEL{EQU{C$NEG+1{{{SELECTION ! 2515: {C$PMT{EQU{C$SEL+1{{{PATTERN MATCH ! 2516: * ! 2517: {C$PR${EQU{C$BVN{{{LAST PREEVALUABLE CODE ! 2518: {C$$NV{EQU{C$PMT+1{{{NUMBER OF DIFFERENT CMBLK TYPES ! 2519: {{EJC{{{{ ! 2520: * ! 2521: * CHARACTER TABLE BLOCK (CTBLK) ! 2522: * ! 2523: * A CHARACTER TABLE BLOCK IS USED TO HOLD LOGICAL CHARACTER ! 2524: * TABLES FOR USE WITH ANY,NOTANY,SPAN,BREAK,BREAKX ! 2525: * PATTERNS. EACH CHARACTER TABLE CAN BE USED TO STORE ! 2526: * CFP$N DISTINCT TABLES AS BIT COLUMNS. A BIT COLUMN ! 2527: * ALLOCATED FOR EACH ARGUMENT OF MORE THAN ONE CHARACTER ! 2528: * IN LENGTH TO ONE OF THE ABOVE LISTED PATTERN PRIMITIVES. ! 2529: * ! 2530: * +------------------------------------+ ! 2531: * I CTTYP I ! 2532: * +------------------------------------+ ! 2533: * * * ! 2534: * * * ! 2535: * * CTCHS * ! 2536: * * * ! 2537: * * * ! 2538: * +------------------------------------+ ! 2539: * ! 2540: {CTTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$CTT ! 2541: {CTCHS{EQU{CTTYP+1{{{START OF CHARACTER TABLE WORDS ! 2542: {CTSI${EQU{CTCHS+CFP$A{{{NUMBER OF WORDS IN CTBLK ! 2543: * ! 2544: * CTCHS IS CFP$A WORDS LONG AND CONSISTS OF A ONE WORD ! 2545: * BIT STRING VALUE FOR EACH POSSIBLE CHARACTER IN THE ! 2546: * INTERNAL ALPHABET. EACH OF THE CFP$N POSSIBLE BITS IN ! 2547: * A BITSTRING IS USED TO FORM A COLUMN OF BIT INDICATORS. ! 2548: * A BIT IS SET ON IF THE CHARACTER IS IN THE TABLE AND OFF ! 2549: * IF THE CHARACTER IS NOT PRESENT. ! 2550: {{EJC{{{{ ! 2551: * ! 2552: * DATATYPE FUNCTION BLOCK (DFBLK) ! 2553: * ! 2554: * A DATATYPE FUNCTION IS USED TO CONTROL THE CONSTRUCTION ! 2555: * OF A PROGRAM DEFINED DATATYPE OBJECT. A CALL TO THE ! 2556: * SYSTEM FUNCTION DATA BUILDS A DFBLK FOR THE DATATYPE NAME ! 2557: * ! 2558: * NOTE THAT THESE BLOCKS ARE BUILT IN STATIC BECAUSE PDBLK ! 2559: * LENGTH IS GOT FROM DFLEN FIELD. IF DFBLK WAS IN DYNAMIC ! 2560: * STORE THIS WOULD CAUSE TROUBLE DURING PASS TWO OF GARBAGE ! 2561: * COLLECTION. SCBLK REFERRED TO BY DFNAM FIELD IS ALSO PUT ! 2562: * IN STATIC SO THAT THERE ARE NO RELOC. FIELDS. THIS CUTS ! 2563: * GARBAGE COLLECTION TASK APPRECIABLY FOR PDBLKS WHICH ARE ! 2564: * LIKELY TO BE PRESENT IN LARGE NUMBERS. ! 2565: * ! 2566: * +------------------------------------+ ! 2567: * I FCODE I ! 2568: * +------------------------------------+ ! 2569: * I FARGS I ! 2570: * +------------------------------------+ ! 2571: * I DFLEN I ! 2572: * +------------------------------------+ ! 2573: * I DFPDL I ! 2574: * +------------------------------------+ ! 2575: * I DFNAM I ! 2576: * +------------------------------------+ ! 2577: * / / ! 2578: * / DFFLD / ! 2579: * / / ! 2580: * +------------------------------------+ ! 2581: * ! 2582: {DFLEN{EQU{FARGS+1{{{LENGTH OF DFBLK IN BYTES ! 2583: {DFPDL{EQU{DFLEN+1{{{LENGTH OF CORRESPONDING PDBLK ! 2584: {DFNAM{EQU{DFPDL+1{{{POINTER TO SCBLK FOR DATATYPE NAME ! 2585: {DFFLD{EQU{DFNAM+1{{{START OF VRBLK PTRS FOR FIELD NAMES ! 2586: {DFFLB{EQU{DFFLD-1{{{OFFSET BEHIND DFFLD FOR FIELD FUNC ! 2587: {DFSI${EQU{DFFLD{{{NUMBER OF STANDARD FIELDS IN DFBLK ! 2588: * ! 2589: * THE FCODE FIELD POINTS TO THE ROUTINE B$DFC ! 2590: * ! 2591: * FARGS (THE NUMBER OF ARGUMENTS) IS THE NUMBER OF FIELDS. ! 2592: {{EJC{{{{ ! 2593: * ! 2594: * DOPE VECTOR BLOCK (DVBLK) ! 2595: * ! 2596: * A DOPE VECTOR IS ASSEMBLED FOR EACH POSSIBLE OPERATOR IN ! 2597: * THE SNOBOL4 LANGUAGE AS PART OF THE CONSTANT SECTION. ! 2598: * ! 2599: * +------------------------------------+ ! 2600: * I DVOPN I ! 2601: * +------------------------------------+ ! 2602: * I DVTYP I ! 2603: * +------------------------------------+ ! 2604: * I DVLPR I ! 2605: * +------------------------------------+ ! 2606: * I DVRPR I ! 2607: * +------------------------------------+ ! 2608: * ! 2609: {DVOPN{EQU{0{{{ENTRY ADDRESS (PTR TO O$XXX) ! 2610: {DVTYP{EQU{DVOPN+1{{{TYPE CODE (C$XXX, SEE CMBLK) ! 2611: {DVLPR{EQU{DVTYP+1{{{LEFT PRECEDENCE (LLXXX, SEE BELOW) ! 2612: {DVRPR{EQU{DVLPR+1{{{RIGHT PRECEDENCE (RRXXX, SEE BELOW) ! 2613: {DVUS${EQU{DVLPR+1{{{SIZE OF UNARY OPERATOR DV ! 2614: {DVBS${EQU{DVRPR+1{{{SIZE OF BINARY OPERATOR DV ! 2615: {DVUBS{EQU{DVUS$+DVBS${{{SIZE OF UNOP + BINOP (SEE SCANE) ! 2616: * ! 2617: * THE CONTENTS OF THE DVTYP FIELD IS COPIED INTO THE CMTYP ! 2618: * FIELD OF THE CMBLK FOR THE OPERATOR IF IT IS USED. ! 2619: * ! 2620: * THE CMOPN FIELD OF AN OPERATOR CMBLK POINTS TO THE DVBLK ! 2621: * ITSELF, PROVIDING THE REQUIRED ENTRY ADDRESS POINTER PTR. ! 2622: * ! 2623: * FOR NORMALLY UNDEFINED OPERATORS, THE DVOPN (AND CMOPN) ! 2624: * FIELDS CONTAIN A WORD OFFSET FROM R$UBA OF THE FUNCTION ! 2625: * BLOCK POINTER FOR THE OPERATOR (INSTEAD OF O$XXX PTR). ! 2626: * FOR CERTAIN SPECIAL OPERATORS, THE DVOPN FIELD IS NOT ! 2627: * REQUIRED AT ALL AND IS ASSEMBLED AS ZERO. ! 2628: * ! 2629: * THE LEFT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO ! 2630: * THE LEFT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS THE ! 2631: * PRECEDENCE OF THE OPERATOR TOWARDS ITS RIGHT OPERAND. ! 2632: * ! 2633: * THE RIGHT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO ! 2634: * THE RIGHT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS ! 2635: * THE PRECEDENCE OF THE OPERATOR TOWARDS ITS LEFT OPERAND. ! 2636: * ! 2637: * HIGHER PRECEDENCE VALUES CORRESPOND TO A TIGHTER BINDING ! 2638: * CAPABILITY. THUS WE HAVE THE LEFT PRECEDENCE LOWER ! 2639: * (HIGHER) THAN THE RIGHT PRECEDENCE FOR RIGHT (LEFT) ! 2640: * ASSOCIATIVE BINARY OPERATORS. ! 2641: * ! 2642: * THE LEFT PRECEDENCE OF UNARY OPERATORS IS SET TO AN ! 2643: * ARBITRARY HIGH VALUE. THE RIGHT VALUE IS NOT REQUIRED AND ! 2644: * CONSEQUENTLY THE DVRPR FIELD IS OMITTED FOR UNARY OPS. ! 2645: {{EJC{{{{ ! 2646: * ! 2647: * TABLE OF OPERATOR PRECEDENCE VALUES ! 2648: * ! 2649: {RRASS{EQU{10{{{RIGHT EQUAL ! 2650: {LLASS{EQU{00{{{LEFT EQUAL ! 2651: {RRPMT{EQU{20{{{RIGHT QUESTION MARK ! 2652: {LLPMT{EQU{30{{{LEFT QUESTION MARK ! 2653: {RRAMP{EQU{40{{{RIGHT AMPERSAND ! 2654: {LLAMP{EQU{50{{{LEFT AMPERSAND ! 2655: {RRALT{EQU{70{{{RIGHT VERTICAL BAR ! 2656: {LLALT{EQU{60{{{LEFT VERTICAL BAR ! 2657: {RRCNC{EQU{90{{{RIGHT BLANK ! 2658: {LLCNC{EQU{80{{{LEFT BLANK ! 2659: {RRATS{EQU{110{{{RIGHT AT ! 2660: {LLATS{EQU{100{{{LEFT AT ! 2661: {RRPLM{EQU{120{{{RIGHT PLUS, MINUS ! 2662: {LLPLM{EQU{130{{{LEFT PLUS, MINUS ! 2663: {RRNUM{EQU{140{{{RIGHT NUMBER ! 2664: {LLNUM{EQU{150{{{LEFT NUMBER ! 2665: {RRDVD{EQU{160{{{RIGHT SLASH ! 2666: {LLDVD{EQU{170{{{LEFT SLASH ! 2667: {RRMLT{EQU{180{{{RIGHT ASTERISK ! 2668: {LLMLT{EQU{190{{{LEFT ASTERISK ! 2669: {RRPCT{EQU{200{{{RIGHT PERCENT ! 2670: {LLPCT{EQU{210{{{LEFT PERCENT ! 2671: {RREXP{EQU{230{{{RIGHT EXCLAMATION ! 2672: {LLEXP{EQU{220{{{LEFT EXCLAMATION ! 2673: {RRDLD{EQU{240{{{RIGHT DOLLAR, DOT ! 2674: {LLDLD{EQU{250{{{LEFT DOLLAR, DOT ! 2675: {RRNOT{EQU{270{{{RIGHT NOT ! 2676: {LLNOT{EQU{260{{{LEFT NOT ! 2677: {LLUNO{EQU{999{{{LEFT ALL UNARY OPERATORS ! 2678: * ! 2679: * PRECEDENCES ARE THE SAME AS IN BTL SNOBOL4 WITH THE ! 2680: * FOLLOWING EXCEPTIONS. ! 2681: * ! 2682: * 1) BINARY QUESTION MARK IS LOWERED AND MADE LEFT ASSOC- ! 2683: * IATIVE TO REFLECT ITS NEW USE FOR PATTERN MATCHING. ! 2684: * ! 2685: * 2) ALTERNATION AND CONCATENATION ARE MADE RIGHT ! 2686: * ASSOCIATIVE FOR GREATER EFFICIENCY IN PATTERN ! 2687: * CONSTRUCTION AND MATCHING RESPECTIVELY. THIS CHANGE ! 2688: * IS TRANSPARENT TO THE SNOBOL4 PROGRAMMER. ! 2689: * ! 2690: * 3) THE EQUAL SIGN HAS BEEN ADDED AS A LOW PRECEDENCE ! 2691: * OPERATOR WHICH IS RIGHT ASSOCIATIVE TO REFLECT ITS ! 2692: * MORE GENERAL USAGE IN THIS VERSION OF SNOBOL4. ! 2693: {{EJC{{{{ ! 2694: * ! 2695: * EXTERNAL FUNCTION BLOCK (EFBLK) ! 2696: * ! 2697: * AN EXTERNAL FUNCTION BLOCK IS USED TO CONTROL THE CALLING ! 2698: * OF AN EXTERNAL FUNCTION. IT IS BUILT BY A CALL TO LOAD. ! 2699: * ! 2700: * +------------------------------------+ ! 2701: * I FCODE I ! 2702: * +------------------------------------+ ! 2703: * I FARGS I ! 2704: * +------------------------------------+ ! 2705: * I EFLEN I ! 2706: * +------------------------------------+ ! 2707: * I EFUSE I ! 2708: * +------------------------------------+ ! 2709: * I EFCOD I ! 2710: * +------------------------------------+ ! 2711: * I EFVAR I ! 2712: * +------------------------------------+ ! 2713: * I EFRSL I ! 2714: * +------------------------------------+ ! 2715: * / / ! 2716: * / EFTAR / ! 2717: * / / ! 2718: * +------------------------------------+ ! 2719: * ! 2720: {EFLEN{EQU{FARGS+1{{{LENGTH OF EFBLK IN BYTES ! 2721: {EFUSE{EQU{EFLEN+1{{{USE COUNT (FOR OPSYN) ! 2722: {EFCOD{EQU{EFUSE+1{{{PTR TO CODE (FROM SYSLD) ! 2723: {EFVAR{EQU{EFCOD+1{{{PTR TO ASSOCIATED VRBLK ! 2724: {EFRSL{EQU{EFVAR+1{{{RESULT TYPE (SEE BELOW) ! 2725: {EFTAR{EQU{EFRSL+1{{{ARGUMENT TYPES (SEE BELOW) ! 2726: {EFSI${EQU{EFTAR{{{NUMBER OF STANDARD FIELDS IN EFBLK ! 2727: * ! 2728: * THE FCODE FIELD POINTS TO THE ROUTINE B$EFC. ! 2729: * ! 2730: * EFUSE IS USED TO KEEP TRACK OF MULTIPLE USE WHEN OPSYN ! 2731: * IS EMPLOYED. THE FUNCTION IS AUTOMATICALLY UNLOADED ! 2732: * WHEN THERE ARE NO MORE REFERENCES TO THE FUNCTION. ! 2733: * ! 2734: * EFRSL AND EFTAR ARE TYPE CODES AS FOLLOWS. ! 2735: * ! 2736: * 0 TYPE IS UNCONVERTED ! 2737: * 1 TYPE IS STRING ! 2738: * 2 TYPE IS INTEGER ! 2739: * 3 TYPE IS REAL ! 2740: {{EJC{{{{ ! 2741: * ! 2742: * EXPRESSION VARIABLE BLOCK (EVBLK) ! 2743: * ! 2744: * IN THIS VERSION OF SPITBOL, AN EXPRESSION CAN BE USED IN ! 2745: * ANY POSITION WHICH WOULD NORMALLY EXPECT A NAME (FOR ! 2746: * EXAMPLE ON THE LEFT SIDE OF EQUALS OR AS THE RIGHT ! 2747: * ARGUMENT OF BINARY DOT). THIS CORRESPONDS TO THE CREATION ! 2748: * OF A PSEUDO-VARIABLE WHICH IS REPRESENTED BY A POINTER TO ! 2749: * AN EXPRESSION VARIABLE BLOCK AS FOLLOWS. ! 2750: * ! 2751: * +------------------------------------+ ! 2752: * I EVTYP I ! 2753: * +------------------------------------+ ! 2754: * I EVEXP I ! 2755: * +------------------------------------+ ! 2756: * I EVVAR I ! 2757: * +------------------------------------+ ! 2758: * ! 2759: {EVTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$EVT ! 2760: {EVEXP{EQU{EVTYP+1{{{POINTER TO EXBLK FOR EXPRESSION ! 2761: {EVVAR{EQU{EVEXP+1{{{POINTER TO TRBEV DUMMY TRBLK ! 2762: {EVSI${EQU{EVVAR+1{{{SIZE OF EVBLK ! 2763: * ! 2764: * THE NAME OF AN EXPRESSION VARIABLE IS REPRESENTED BY A ! 2765: * BASE POINTER TO THE EVBLK AND AN OFFSET OF EVVAR. THIS ! 2766: * VALUE APPEARS TO BE TRAPPED BY THE DUMMY TRBEV BLOCK. ! 2767: * ! 2768: * NOTE THAT THERE IS NO NEED TO ALLOW FOR THE CASE OF AN ! 2769: * EXPRESSION VARIABLE WHICH REFERENCES AN SEBLK SINCE A ! 2770: * VARIABLE WHICH IS OF THE FORM *VAR IS EQUIVALENT TO VAR. ! 2771: {{EJC{{{{ ! 2772: * ! 2773: * EXPRESSION BLOCK (EXBLK) ! 2774: * ! 2775: * AN EXPRESSION BLOCK IS BUILT FOR EACH EXPRESSION ! 2776: * REFERENCED IN A PROGRAM OR CREATED BY EVAL OR CONVERT ! 2777: * DURING EXECUTION OF A PROGRAM. ! 2778: * ! 2779: * +------------------------------------+ ! 2780: * I EXTYP I ! 2781: * +------------------------------------+ ! 2782: * I EXSTM I ! 2783: * +------------------------------------+ ! 2784: * I EXLEN I ! 2785: * +------------------------------------+ ! 2786: * I EXFLC I ! 2787: * +------------------------------------+ ! 2788: * / / ! 2789: * / EXCOD / ! 2790: * / / ! 2791: * +------------------------------------+ ! 2792: * ! 2793: {EXTYP{EQU{0{{{PTR TO ROUTINE B$EXL TO LOAD EXPR ! 2794: {EXSTM{EQU{CDSTM{{{STORES STMNT NO. DURING EVALUATION ! 2795: {EXLEN{EQU{EXSTM+1{{{LENGTH OF EXBLK IN BYTES ! 2796: {EXFLC{EQU{EXLEN+1{{{FAILURE CODE (=O$FEX) ! 2797: {EXCOD{EQU{EXFLC+1{{{PSEUDO-CODE FOR EXPRESSION ! 2798: {EXSI${EQU{EXCOD{{{NUMBER OF STANDARD FIELDS IN EXBLK ! 2799: * ! 2800: * THERE ARE TWO CASES FOR EXCOD DEPENDING ON WHETHER THE ! 2801: * EXPRESSION CAN BE EVALUATED BY NAME (SEE DESCRIPTION ! 2802: * OF CDBLK FOR DETAILS OF CODE FOR EXPRESSIONS). ! 2803: * ! 2804: * IF THE EXPRESSION CAN BE EVALUATED BY NAME WE HAVE. ! 2805: * ! 2806: * (CODE FOR EXPR BY NAME) ! 2807: * =O$RNM ! 2808: * ! 2809: * IF THE EXPRESSION CAN ONLY BE EVALUATED BY VALUE. ! 2810: * ! 2811: * (CODE FOR EXPR BY VALUE) ! 2812: * =O$RVL ! 2813: {{EJC{{{{ ! 2814: * ! 2815: * FIELD FUNCTION BLOCK (FFBLK) ! 2816: * ! 2817: * A FIELD FUNCTION BLOCK IS USED TO CONTROL THE SELECTION ! 2818: * OF A FIELD FROM A PROGRAM DEFINED DATATYPE BLOCK. ! 2819: * A CALL TO DATA CREATES AN FFBLK FOR EACH FIELD. ! 2820: * ! 2821: * +------------------------------------+ ! 2822: * I FCODE I ! 2823: * +------------------------------------+ ! 2824: * I FARGS I ! 2825: * +------------------------------------+ ! 2826: * I FFDFP I ! 2827: * +------------------------------------+ ! 2828: * I FFNXT I ! 2829: * +------------------------------------+ ! 2830: * I FFOFS I ! 2831: * +------------------------------------+ ! 2832: * ! 2833: {FFDFP{EQU{FARGS+1{{{POINTER TO ASSOCIATED DFBLK ! 2834: {FFNXT{EQU{FFDFP+1{{{PTR TO NEXT FFBLK ON CHAIN OR ZERO ! 2835: {FFOFS{EQU{FFNXT+1{{{OFFSET (BYTES) TO FIELD IN PDBLK ! 2836: {FFSI${EQU{FFOFS+1{{{SIZE OF FFBLK IN WORDS ! 2837: * ! 2838: * THE FCODE FIELD POINTS TO THE ROUTINE B$FFC. ! 2839: * ! 2840: * FARGS ALWAYS CONTAINS ONE. ! 2841: * ! 2842: * FFDFP IS USED TO VERIFY THAT THE CORRECT PROGRAM DEFINED ! 2843: * DATATYPE IS BEING ACCESSED BY THIS CALL. ! 2844: * FFDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC ! 2845: * ! 2846: * FFOFS IS USED TO SELECT THE APPROPRIATE FIELD. NOTE THAT ! 2847: * IT IS AN ACTUAL OFFSET (NOT A FIELD NUMBER) ! 2848: * ! 2849: * FFNXT IS USED TO POINT TO THE NEXT FFBLK OF THE SAME NAME ! 2850: * IN THE CASE WHERE THERE ARE SEVERAL FIELDS OF THE SAME ! 2851: * NAME FOR DIFFERENT DATATYPES. ZERO MARKS THE END OF CHAIN ! 2852: {{EJC{{{{ ! 2853: * ! 2854: * INTEGER CONSTANT BLOCK (ICBLK) ! 2855: * ! 2856: * AN ICBLK IS CREATED FOR EVERY INTEGER REFERENCED OR ! 2857: * CREATED BY A PROGRAM. NOTE HOWEVER THAT CERTAIN INTERNAL ! 2858: * INTEGER VALUES ARE STORED AS ADDRESSES (E.G. THE LENGTH ! 2859: * FIELD IN A STRING CONSTANT BLOCK) ! 2860: * ! 2861: * +------------------------------------+ ! 2862: * I ICGET I ! 2863: * +------------------------------------+ ! 2864: * * ICVAL * ! 2865: * +------------------------------------+ ! 2866: * ! 2867: {ICGET{EQU{0{{{PTR TO ROUTINE B$ICL TO LOAD INT ! 2868: {ICVAL{EQU{ICGET+1{{{INTEGER VALUE ! 2869: {ICSI${EQU{ICVAL+CFP$I{{{SIZE OF ICBLK ! 2870: * ! 2871: * THE LENGTH OF THE ICVAL FIELD IS CFP$I. ! 2872: {{EJC{{{{ ! 2873: * ! 2874: * KEYWORD VARIABLE BLOCK (KVBLK) ! 2875: * ! 2876: * A KVBLK IS USED TO REPRESENT A KEYWORD PSEUDO-VARIABLE. ! 2877: * A KVBLK IS BUILT FOR EACH KEYWORD REFERENCE (KWNAM). ! 2878: * ! 2879: * +------------------------------------+ ! 2880: * I KVTYP I ! 2881: * +------------------------------------+ ! 2882: * I KVVAR I ! 2883: * +------------------------------------+ ! 2884: * I KVNUM I ! 2885: * +------------------------------------+ ! 2886: * ! 2887: {KVTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$KVT ! 2888: {KVVAR{EQU{KVTYP+1{{{POINTER TO DUMMY BLOCK TRBKV ! 2889: {KVNUM{EQU{KVVAR+1{{{KEYWORD NUMBER ! 2890: {KVSI${EQU{KVNUM+1{{{SIZE OF KVBLK ! 2891: * ! 2892: * THE NAME OF A KEYWORD VARIABLE IS REPRESENTED BY A ! 2893: * BASE POINTER TO THE KVBLK AND AN OFFSET OF KVVAR. THE ! 2894: * VALUE APPEARS TO BE TRAPPED BY THE POINTER TO TRBKV. ! 2895: {{EJC{{{{ ! 2896: * ! 2897: * NAME BLOCK (NMBLK) ! 2898: * ! 2899: * A NAME BLOCK IS USED WHEREVER A NAME MUST BE STORED AS ! 2900: * A VALUE FOLLOWING USE OF THE UNARY DOT OPERATOR. ! 2901: * ! 2902: * +------------------------------------+ ! 2903: * I NMTYP I ! 2904: * +------------------------------------+ ! 2905: * I NMBAS I ! 2906: * +------------------------------------+ ! 2907: * I NMOFS I ! 2908: * +------------------------------------+ ! 2909: * ! 2910: {NMTYP{EQU{0{{{PTR TO ROUTINE B$NML TO LOAD NAME ! 2911: {NMBAS{EQU{NMTYP+1{{{BASE POINTER FOR VARIABLE ! 2912: {NMOFS{EQU{NMBAS+1{{{OFFSET FOR VARIABLE ! 2913: {NMSI${EQU{NMOFS+1{{{SIZE OF NMBLK ! 2914: * ! 2915: * THE ACTUAL FIELD REPRESENTING THE CONTENTS OF THE NAME ! 2916: * IS FOUND NMOFS BYTES PAST THE ADDRESS IN NMBAS. ! 2917: * ! 2918: * THE NAME IS SPLIT INTO BASE AND OFFSET FORM TO AVOID ! 2919: * CREATION OF A POINTER INTO THE MIDDLE OF A BLOCK WHICH ! 2920: * COULD NOT BE HANDLED PROPERLY BY THE GARBAGE COLLECTOR. ! 2921: * ! 2922: * A NAME MAY BE BUILT FOR ANY VARIABLE (SEE SECTION ON ! 2923: * REPRESENTATIONS OF VARIABLES) THIS INCLUDES THE ! 2924: * CASES OF PSEUDO-VARIABLES. ! 2925: {{EJC{{{{ ! 2926: * ! 2927: * PATTERN BLOCK, NO PARAMETERS (P0BLK) ! 2928: * ! 2929: * A P0BLK IS USED TO REPRESENT PATTERN NODES WHICH DO ! 2930: * NOT REQUIRE THE USE OF ANY PARAMETER VALUES. ! 2931: * ! 2932: * +------------------------------------+ ! 2933: * I PCODE I ! 2934: * +------------------------------------+ ! 2935: * I PTHEN I ! 2936: * +------------------------------------+ ! 2937: * ! 2938: {PCODE{EQU{0{{{PTR TO MATCH ROUTINE (P$XXX) ! 2939: {PTHEN{EQU{PCODE+1{{{POINTER TO SUBSEQUENT NODE ! 2940: {PASI${EQU{PTHEN+1{{{SIZE OF P0BLK ! 2941: * ! 2942: * PTHEN POINTS TO THE PATTERN BLOCK FOR THE SUBSEQUENT ! 2943: * NODE TO BE MATCHED. THIS IS A POINTER TO THE PATTERN ! 2944: * BLOCK NDNTH IF THERE IS NO SUBSEQUENT (END OF PATTERN) ! 2945: * ! 2946: * PCODE IS A POINTER TO THE MATCH ROUTINE FOR THE NODE. ! 2947: {{EJC{{{{ ! 2948: * ! 2949: * PATTERN BLOCK (ONE PARAMETER) ! 2950: * ! 2951: * A P1BLK IS USED TO REPRESENT PATTERN NODES WHICH ! 2952: * REQUIRE ONE PARAMETER VALUE. ! 2953: * ! 2954: * +------------------------------------+ ! 2955: * I PCODE I ! 2956: * +------------------------------------+ ! 2957: * I PTHEN I ! 2958: * +------------------------------------+ ! 2959: * I PARM1 I ! 2960: * +------------------------------------+ ! 2961: * ! 2962: {PARM1{EQU{PTHEN+1{{{FIRST PARAMETER VALUE ! 2963: {PBSI${EQU{PARM1+1{{{SIZE OF P1BLK IN WORDS ! 2964: * ! 2965: * SEE P0BLK FOR DEFINITIONS OF PCODE, PTHEN ! 2966: * ! 2967: * PARM1 CONTAINS A PARAMETER VALUE USED IN MATCHING THE ! 2968: * NODE. FOR EXAMPLE, IN A LEN PATTERN, IT IS THE INTEGER ! 2969: * ARGUMENT TO LEN. THE DETAILS OF THE USE OF THE PARAMETER ! 2970: * FIELD ARE INCLUDED IN THE DESCRIPTION OF THE INDIVIDUAL ! 2971: * MATCH ROUTINES. PARM1 IS ALWAYS AN ADDRESS POINTER WHICH ! 2972: * IS PROCESSED BY THE GARBAGE COLLECTOR. ! 2973: {{EJC{{{{ ! 2974: * ! 2975: * PATTERN BLOCK (TWO PARAMETERS) ! 2976: * ! 2977: * A P2BLK IS USED TO REPRESENT PATTERN NODES WHICH ! 2978: * REQUIRE TWO PARAMETER VALUES. ! 2979: * ! 2980: * +------------------------------------+ ! 2981: * I PCODE I ! 2982: * +------------------------------------+ ! 2983: * I PTHEN I ! 2984: * +------------------------------------+ ! 2985: * I PARM1 I ! 2986: * +------------------------------------+ ! 2987: * I PARM2 I ! 2988: * +------------------------------------+ ! 2989: * ! 2990: {PARM2{EQU{PARM1+1{{{SECOND PARAMETER VALUE ! 2991: {PCSI${EQU{PARM2+1{{{SIZE OF P2BLK IN WORDS ! 2992: * ! 2993: * SEE P1BLK FOR DEFINITIONS OF PCODE, PTHEN, PARM1 ! 2994: * ! 2995: * PARM2 IS A PARAMETER WHICH PERFORMS THE SAME SORT OF ! 2996: * FUNCTION AS PARM1 (SEE DESCRIPTION OF P1BLK). ! 2997: * ! 2998: * PARM2 IS A NON-RELOCATABLE FIELD AND IS NOT ! 2999: * PROCESSED BY THE GARBAGE COLLECTOR. ACCORDINGLY, IT MAY ! 3000: * NOT CONTAIN A POINTER TO A BLOCK IN DYNAMIC MEMORY. ! 3001: {{EJC{{{{ ! 3002: * ! 3003: * PROGRAM-DEFINED DATATYPE BLOCK ! 3004: * ! 3005: * A PDBLK REPRESENTS THE DATA ITEM FORMED BY A CALL TO A ! 3006: * DATATYPE FUNCTION AS DEFINED BY THE SYSTEM FUNCTION DATA. ! 3007: * ! 3008: * +------------------------------------+ ! 3009: * I PDTYP I ! 3010: * +------------------------------------+ ! 3011: * I IDVAL I ! 3012: * +------------------------------------+ ! 3013: * I PDDFP I ! 3014: * +------------------------------------+ ! 3015: * / / ! 3016: * / PDFLD / ! 3017: * / / ! 3018: * +------------------------------------+ ! 3019: * ! 3020: {PDTYP{EQU{0{{{PTR TO DUMMY ROUTINE B$PDT ! 3021: {PDDFP{EQU{IDVAL+1{{{PTR TO ASSOCIATED DFBLK ! 3022: {PDFLD{EQU{PDDFP+1{{{START OF FIELD VALUE POINTERS ! 3023: {PDFOF{EQU{DFFLD-PDFLD{{{DIFFERENCE IN OFFSET TO FIELD PTRS ! 3024: {PDSI${EQU{PDFLD{{{SIZE OF STANDARD FIELDS IN PDBLK ! 3025: {PDDFS{EQU{DFSI$-PDSI${{{DIFFERENCE IN DFBLK, PDBLK SIZES ! 3026: * ! 3027: * THE PDDFP POINTER MAY BE USED TO DETERMINE THE DATATYPE ! 3028: * AND THE NAMES OF THE FIELDS IF REQUIRED. THE DFBLK ALSO ! 3029: * CONTAINS THE LENGTH OF THE PDBLK IN BYTES (FIELD DFPDL). ! 3030: * PDDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC ! 3031: * ! 3032: * PDFLD VALUES ARE STORED IN ORDER FROM LEFT TO RIGHT. ! 3033: * THEY CONTAIN VALUES OR POINTERS TO TRBLK CHAINS. ! 3034: {{EJC{{{{ ! 3035: * ! 3036: * PROGRAM DEFINED FUNCTION BLOCK (PFBLK) ! 3037: * ! 3038: * A PFBLK IS CREATED FOR EACH CALL TO THE DEFINE FUNCTION ! 3039: * AND A POINTER TO THE PFBLK PLACED IN THE PROPER VRBLK. ! 3040: * ! 3041: * +------------------------------------+ ! 3042: * I FCODE I ! 3043: * +------------------------------------+ ! 3044: * I FARGS I ! 3045: * +------------------------------------+ ! 3046: * I PFLEN I ! 3047: * +------------------------------------+ ! 3048: * I PFVBL I ! 3049: * +------------------------------------+ ! 3050: * I PFNLO I ! 3051: * +------------------------------------+ ! 3052: * I PFCOD I ! 3053: * +------------------------------------+ ! 3054: * I PFCTR I ! 3055: * +------------------------------------+ ! 3056: * I PFRTR I ! 3057: * +------------------------------------+ ! 3058: * / / ! 3059: * / PFARG / ! 3060: * / / ! 3061: * +------------------------------------+ ! 3062: * ! 3063: {PFLEN{EQU{FARGS+1{{{LENGTH OF PFBLK IN BYTES ! 3064: {PFVBL{EQU{PFLEN+1{{{POINTER TO VRBLK FOR FUNCTION NAME ! 3065: {PFNLO{EQU{PFVBL+1{{{NUMBER OF LOCALS ! 3066: {PFCOD{EQU{PFNLO+1{{{PTR TO CDBLK FOR FIRST STATEMENT ! 3067: {PFCTR{EQU{PFCOD+1{{{TRBLK PTR IF CALL TRACED ELSE 0 ! 3068: {PFRTR{EQU{PFCTR+1{{{TRBLK PTR IF RETURN TRACED ELSE 0 ! 3069: {PFARG{EQU{PFRTR+1{{{VRBLK PTRS FOR ARGUMENTS AND LOCALS ! 3070: {PFAGB{EQU{PFARG-1{{{OFFSET BEHIND PFARG FOR ARG, LOCAL ! 3071: {PFSI${EQU{PFARG{{{NUMBER OF STANDARD FIELDS IN PFBLK ! 3072: * ! 3073: * THE FCODE FIELD POINTS TO THE ROUTINE B$PFC. ! 3074: * ! 3075: * PFARG IS STORED IN THE FOLLOWING ORDER. ! 3076: * ! 3077: * ARGUMENTS (LEFT TO RIGHT) ! 3078: * LOCALS (LEFT TO RIGHT) ! 3079: {{EJC{{{{ ! 3080: * ! 3081: * REAL CONSTANT BLOCK (RCBLK) ! 3082: * ! 3083: * AN RCBLK IS CREATED FOR EVERY REAL REFERENCED OR ! 3084: * CREATED BY A PROGRAM. ! 3085: * ! 3086: * +------------------------------------+ ! 3087: * I RCGET I ! 3088: * +------------------------------------+ ! 3089: * * RCVAL * ! 3090: * +------------------------------------+ ! 3091: * ! 3092: {RCGET{EQU{0{{{PTR TO ROUTINE B$RCL TO LOAD REAL ! 3093: {RCVAL{EQU{RCGET+1{{{REAL VALUE ! 3094: {RCSI${EQU{RCVAL+CFP$R{{{SIZE OF RCBLK ! 3095: * ! 3096: * THE LENGTH OF THE RCVAL FIELD IS CFP$R. ! 3097: {{EJC{{{{ ! 3098: * ! 3099: * STRING CONSTANT BLOCK (SCBLK) ! 3100: * ! 3101: * AN SCBLK IS BUILT FOR EVERY STRING REFERENCED OR CREATED ! 3102: * BY A PROGRAM. ! 3103: * ! 3104: * +------------------------------------+ ! 3105: * I SCGET I ! 3106: * +------------------------------------+ ! 3107: * I SCLEN I ! 3108: * +------------------------------------+ ! 3109: * / / ! 3110: * / SCHAR / ! 3111: * / / ! 3112: * +------------------------------------+ ! 3113: * ! 3114: {SCGET{EQU{0{{{PTR TO ROUTINE B$SCL TO LOAD STRING ! 3115: {SCLEN{EQU{SCGET+1{{{LENGTH OF STRING IN CHARACTERS ! 3116: {SCHAR{EQU{SCLEN+1{{{CHARACTERS OF STRING ! 3117: {SCSI${EQU{SCHAR{{{SIZE OF STANDARD FIELDS IN SCBLK ! 3118: * ! 3119: * THE CHARACTERS OF THE STRING ARE STORED LEFT JUSTIFIED. ! 3120: * THE FINAL WORD IS PADDED ON THE RIGHT WITH ZEROS. ! 3121: * (I.E. THE CHARACTER WHOSE INTERNAL CODE IS ZERO). ! 3122: * ! 3123: * THE VALUE OF SCLEN MAY NOT EXCEED MXLEN. THIS ENSURES ! 3124: * THAT CHARACTER OFFSETS (E.G. THE PATTERN MATCH CURSOR) ! 3125: * CAN BE CORRECTLY PROCESSED BY THE GARBAGE COLLECTOR. ! 3126: * ! 3127: * NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING ! 3128: * IS GIVEN IN BYTES BY CFP$F AND THAT THIS VALUE IS ! 3129: * AUTOMATICALLY ALLOWED FOR IN PLC, PSC. ! 3130: * NOTE THAT FOR A SPITBOL SCBLK, THE VALUE OF CFP$F ! 3131: * IS GIVEN BY CFP$B*SCHAR. ! 3132: {{EJC{{{{ ! 3133: * ! 3134: * SIMPLE EXPRESSION BLOCK (SEBLK) ! 3135: * ! 3136: * AN SEBLK IS USED TO REPRESENT AN EXPRESSION OF THE FORM ! 3137: * *(NATURAL VARIABLE). ALL OTHER EXPRESSIONS ARE EXBLKS. ! 3138: * ! 3139: * +------------------------------------+ ! 3140: * I SETYP I ! 3141: * +------------------------------------+ ! 3142: * I SEVAR I ! 3143: * +------------------------------------+ ! 3144: * ! 3145: {SETYP{EQU{0{{{PTR TO ROUTINE B$SEL TO LOAD EXPR ! 3146: {SEVAR{EQU{SETYP+1{{{PTR TO VRBLK FOR VARIABLE ! 3147: {SESI${EQU{SEVAR+1{{{LENGTH OF SEBLK IN WORDS ! 3148: {{EJC{{{{ ! 3149: * ! 3150: * STANDARD VARIABLE BLOCK (SVBLK) ! 3151: * ! 3152: * AN SVBLK IS ASSEMBLED IN THE CONSTANT SECTION FOR EACH ! 3153: * VARIABLE WHICH SATISFIES ONE OF THE FOLLOWING CONDITIONS. ! 3154: * ! 3155: * 1) IT IS THE NAME OF A SYSTEM FUNCTION ! 3156: * 2) IT HAS AN INITIAL VALUE ! 3157: * 3) IT HAS A KEYWORD ASSOCIATION ! 3158: * 4) IT HAS A STANDARD I/O ASSOCIATION ! 3159: * 6) IT HAS A STANDARD LABEL ASSOCIATION ! 3160: * ! 3161: * IF VRBLKS ARE CONSTRUCTED FOR ANY OF THESE VARIABLES, ! 3162: * THEN THE VRSVP FIELD POINTS TO THE SVBLK (SEE VRBLK) ! 3163: * ! 3164: * +------------------------------------+ ! 3165: * I SVBIT I ! 3166: * +------------------------------------+ ! 3167: * I SVLEN I ! 3168: * +------------------------------------+ ! 3169: * I SVCHS I ! 3170: * +------------------------------------+ ! 3171: * I SVKNM I ! 3172: * +------------------------------------+ ! 3173: * I SVFNC I ! 3174: * +------------------------------------+ ! 3175: * I SVNAR I ! 3176: * +------------------------------------+ ! 3177: * I SVLBL I ! 3178: * +------------------------------------+ ! 3179: * I SVVAL I ! 3180: * +------------------------------------+ ! 3181: {{EJC{{{{ ! 3182: * ! 3183: * STANDARD VARIABLE BLOCK (CONTINUED) ! 3184: * ! 3185: {SVBIT{EQU{0{{{BIT STRING INDICATING ATTRIBUTES ! 3186: {SVLEN{EQU{1{{{(=SCLEN) LENGTH OF NAME IN CHARS ! 3187: {SVCHS{EQU{2{{{(=SCHAR) CHARACTERS OF NAME ! 3188: {SVSI${EQU{2{{{NUMBER OF STANDARD FIELDS IN SVBLK ! 3189: {SVPRE{EQU{1{{{SET IF PREEVALUATION PERMITTED ! 3190: {SVFFC{EQU{SVPRE+SVPRE{{{SET ON IF FAST CALL PERMITTED ! 3191: {SVCKW{EQU{SVFFC+SVFFC{{{SET ON IF KEYWORD VALUE CONSTANT ! 3192: {SVPRD{EQU{SVCKW+SVCKW{{{SET ON IF PREDICATE FUNCTION ! 3193: {SVNBT{EQU{4{{{NUMBER OF BITS TO RIGHT OF SVKNM ! 3194: {SVKNM{EQU{SVPRD+SVPRD{{{SET ON IF KEYWORD ASSOCIATION ! 3195: {SVFNC{EQU{SVKNM+SVKNM{{{SET ON IF SYSTEM FUNCTION ! 3196: {SVNAR{EQU{SVFNC+SVFNC{{{SET ON IF SYSTEM FUNCTION ! 3197: {SVLBL{EQU{SVNAR+SVNAR{{{SET ON IF SYSTEM LABEL ! 3198: {SVVAL{EQU{SVLBL+SVLBL{{{SET ON IF PREDEFINED VALUE ! 3199: * ! 3200: * NOTE THAT THE LAST FIVE BITS CORRESPOND IN ORDER ! 3201: * TO THE FIELDS WHICH ARE PRESENT (SEE PROCEDURE GTNVR). ! 3202: * ! 3203: * THE FOLLOWING DEFINITIONS ARE USED IN THE SVBLK TABLE ! 3204: * ! 3205: {SVFNF{EQU{SVFNC+SVNAR{{{FUNCTION WITH NO FAST CALL ! 3206: {SVFNN{EQU{SVFNF+SVFFC{{{FUNCTION WITH FAST CALL, NO PREEVAL ! 3207: {SVFNP{EQU{SVFNN+SVPRE{{{FUNCTION ALLOWING PREEVALUATION ! 3208: {SVFPR{EQU{SVFNN+SVPRD{{{PREDICATE FUNCTION ! 3209: {SVFNK{EQU{SVFNN+SVKNM{{{NO PREEVAL FUNC + KEYWORD ! 3210: {SVKWV{EQU{SVKNM+SVVAL{{{KEYWORD + VALUE ! 3211: {SVKWC{EQU{SVCKW+SVKNM{{{KEYWORD WITH CONSTANT VALUE ! 3212: {SVKVC{EQU{SVKWV+SVCKW{{{CONSTANT KEYWORD + VALUE ! 3213: {SVKVL{EQU{SVKVC+SVLBL{{{CONSTANT KEYWORD + VALUE + LABEL ! 3214: {SVFPK{EQU{SVFNP+SVKVC{{{PREEVAL FCN + CONST KEYWD + VAL ! 3215: * ! 3216: * THE SVPRE BIT ALLOWS THE COMPILER TO PREEVALUATE A CALL ! 3217: * TO THE ASSOCIATED SYSTEM FUNCTION IF ALL THE ARGUMENTS ! 3218: * ARE THEMSELVES CONSTANTS. FUNCTIONS IN THIS CATEGORY ! 3219: * MUST HAVE NO SIDE EFFECTS AND MUST NEVER CAUSE FAILURE. ! 3220: * THE CALL MAY GENERATE AN ERROR CONDITION. ! 3221: * ! 3222: * THE SVFFC BIT ALLOWS THE COMPILER TO GENERATE THE SPECIAL ! 3223: * FAST CALL AFTER ADJUSTING THE NUMBER OF ARGUMENTS. ONLY ! 3224: * THE ITEM AND APPLY FUNCTIONS FALL OUTSIDE THIS CATEGORY. ! 3225: * ! 3226: * THE SVCKW BIT IS SET IF THE ASSOCIATED KEYWORD VALUE IS ! 3227: * A CONSTANT, THUS ALLOWING PREEVALUATION FOR A VALUE CALL. ! 3228: * ! 3229: * THE SVPRD BIT IS SET ON FOR ALL PREDICATE FUNCTIONS TO ! 3230: * ENABLE THE SPECIAL CONCATENATION CODE OPTIMIZATION. ! 3231: {{EJC{{{{ ! 3232: * ! 3233: * SVBLK (CONTINUED) ! 3234: * ! 3235: * SVKNM KEYWORD NUMBER ! 3236: * ! 3237: * SVKNM IS PRESENT ONLY FOR A STANDARD KEYWORD ASSOC. ! 3238: * IT CONTAINS A KEYWORD NUMBER AS DEFINED BY THE ! 3239: * KEYWORD NUMBER TABLE GIVEN LATER ON. ! 3240: * ! 3241: * SVFNC SYSTEM FUNCTION POINTER ! 3242: * ! 3243: * SVFNC IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC. ! 3244: * IT IS A POINTER TO THE ACTUAL CODE FOR THE SYSTEM ! 3245: * FUNCTION. THE GENERATED CODE FOR A FAST CALL IS A ! 3246: * POINTER TO THE SVFNC FIELD OF THE SVBLK FOR THE ! 3247: * FUNCTION. THE VRFNC FIELD OF THE VRBLK POINTS TO ! 3248: * THIS SAME FIELD, IN WHICH CASE, IT SERVES AS THE ! 3249: * FCODE FIELD FOR THE FUNCTION CALL. ! 3250: * ! 3251: * SVNAR NUMBER OF FUNCTION ARGUMENTS ! 3252: * ! 3253: * SVNAR IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC. ! 3254: * IT IS THE NUMBER OF ARGUMENTS REQUIRED FOR A CALL ! 3255: * TO THE SYSTEM FUNCTION. THE COMPILER USES THIS ! 3256: * VALUE TO ADJUST THE NUMBER OF ARGUMENTS IN A FAST ! 3257: * CALL AND IN THE CASE OF A FUNCTION CALLED THROUGH ! 3258: * THE VRFNC FIELD OF THE VRBLK, THE SVNAR FIELD ! 3259: * SERVES AS THE FARGS FIELD FOR O$FNC. A SPECIAL ! 3260: * CASE OCCURS IF THIS VALUE IS SET TO 999. THIS IS ! 3261: * USED TO INDICATE THAT THE FUNCTION HAS A VARIABLE ! 3262: * NUMBER OF ARGUMENTS AND CAUSES O$FNC TO PASS CONTROL ! 3263: * WITHOUT ADJUSTING THE ARGUMENT COUNT. THE ONLY ! 3264: * PREDEFINED FUNCTIONS USING THIS ARE APPLY AND ITEM. ! 3265: * ! 3266: * SVLBL SYSTEM LABEL POINTER ! 3267: * ! 3268: * SVLBL IS PRESENT ONLY FOR A STANDARD LABEL ASSOC. ! 3269: * IT IS A POINTER TO A SYSTEM LABEL ROUTINE (L$XXX). ! 3270: * THE VRLBL FIELD OF THE CORRESPONDING VRBLK POINTS TO ! 3271: * THE SVLBL FIELD OF THE SVBLK. ! 3272: * ! 3273: * SVVAL SYSTEM VALUE POINTER ! 3274: * ! 3275: * SVVAL IS PRESENT ONLY FOR A STANDARD VALUE. ! 3276: * IT IS A POINTER TO THE PATTERN NODE (NDXXX) WHICH ! 3277: * IS THE STANDARD INITIAL VALUE OF THE VARIABLE. ! 3278: * THIS VALUE IS COPIED TO THE VRVAL FIELD OF THE VRBLK ! 3279: {{EJC{{{{ ! 3280: * ! 3281: * SVBLK (CONTINUED) ! 3282: * ! 3283: * KEYWORD NUMBER TABLE ! 3284: * ! 3285: * THE FOLLOWING TABLE GIVES SYMBOLIC NAMES FOR KEYWORD ! 3286: * NUMBERS. THESE VALUES ARE STORED IN THE SVKNM FIELD OF ! 3287: * SVBLKS AND IN THE KVNUM FIELD OF KVBLKS. SEE ALSO ! 3288: * PROCEDURES ASIGN, ACESS AND KWNAM. ! 3289: * ! 3290: * UNPROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES ! 3291: * ! 3292: {K$ABE{EQU{0{{{ABEND ! 3293: {K$ANC{EQU{K$ABE+CFP$B{{{ANCHOR ! 3294: {K$CAS{EQU{K$ANC+CFP$B{{{CASE ! 3295: {K$COD{EQU{K$CAS+CFP$B{{{CODE ! 3296: {K$DMP{EQU{K$COD+CFP$B{{{DUMP ! 3297: {K$ERL{EQU{K$DMP+CFP$B{{{ERRLIMIT ! 3298: {K$ERT{EQU{K$ERL+CFP$B{{{ERRTYPE ! 3299: {K$FTR{EQU{K$ERT+CFP$B{{{FTRACE ! 3300: {K$INP{EQU{K$FTR+CFP$B{{{INPUT ! 3301: {K$MXL{EQU{K$INP+CFP$B{{{MAXLENGTH ! 3302: {K$OUP{EQU{K$MXL+CFP$B{{{OUTPUT ! 3303: {K$PFL{EQU{K$OUP+CFP$B{{{PROFILE ! 3304: {K$TRA{EQU{K$PFL+CFP$B{{{TRACE ! 3305: {K$TRM{EQU{K$TRA+CFP$B{{{TRIM ! 3306: * ! 3307: * PROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES ! 3308: * ! 3309: {K$FNC{EQU{K$TRM+CFP$B{{{FNCLEVEL ! 3310: {K$LST{EQU{K$FNC+CFP$B{{{LASTNO ! 3311: {K$STN{EQU{K$LST+CFP$B{{{STNO ! 3312: * ! 3313: * KEYWORDS WITH CONSTANT PATTERN VALUES ! 3314: * ! 3315: {K$ABO{EQU{K$STN+CFP$B{{{ABORT ! 3316: {K$ARB{EQU{K$ABO+PASI${{{ARB ! 3317: {K$BAL{EQU{K$ARB+PASI${{{BAL ! 3318: {K$FAL{EQU{K$BAL+PASI${{{FAIL ! 3319: {K$FEN{EQU{K$FAL+PASI${{{FENCE ! 3320: {K$REM{EQU{K$FEN+PASI${{{REM ! 3321: {K$SUC{EQU{K$REM+PASI${{{SUCCEED ! 3322: {{EJC{{{{ ! 3323: * ! 3324: * KEYWORD NUMBER TABLE (CONTINUED) ! 3325: * ! 3326: * SPECIAL KEYWORDS ! 3327: * ! 3328: {K$ALP{EQU{K$SUC+1{{{ALPHABET ! 3329: {K$RTN{EQU{K$ALP+1{{{RTNTYPE ! 3330: {K$STC{EQU{K$RTN+1{{{STCOUNT ! 3331: {K$ETX{EQU{K$STC+1{{{ERRTEXT ! 3332: {K$STL{EQU{K$ETX+1{{{STLIMIT ! 3333: * ! 3334: * RELATIVE OFFSETS OF SPECIAL KEYWORDS ! 3335: * ! 3336: {K$$AL{EQU{K$ALP-K$ALP{{{ALPHABET ! 3337: {K$$RT{EQU{K$RTN-K$ALP{{{RTNTYPE ! 3338: {K$$SC{EQU{K$STC-K$ALP{{{STCOUNT ! 3339: {K$$ET{EQU{K$ETX-K$ALP{{{ERRTEXT ! 3340: {K$$SL{EQU{K$STL-K$ALP{{{STLIMIT ! 3341: * ! 3342: * SYMBOLS USED IN ASIGN AND ACESS PROCEDURES ! 3343: * ! 3344: {K$P$${EQU{K$FNC{{{FIRST PROTECTED KEYWORD ! 3345: {K$V$${EQU{K$ABO{{{FIRST KEYWORD WITH CONSTANT VALUE ! 3346: {K$S$${EQU{K$ALP{{{FIRST KEYWORD WITH SPECIAL ACESS ! 3347: {{EJC{{{{ ! 3348: * ! 3349: * FORMAT OF A TABLE BLOCK (TBBLK) ! 3350: * ! 3351: * A TABLE BLOCK IS USED TO REPRESENT A TABLE VALUE. ! 3352: * IT IS BUILT BY A CALL TO THE TABLE OR CONVERT FUNCTIONS. ! 3353: * ! 3354: * +------------------------------------+ ! 3355: * I TBTYP I ! 3356: * +------------------------------------+ ! 3357: * I IDVAL I ! 3358: * +------------------------------------+ ! 3359: * I TBLEN I ! 3360: * +------------------------------------+ ! 3361: * +------------------------------------+ ! 3362: * I TBINV I ! 3363: * +------------------------------------+ ! 3364: * / / ! 3365: * / TBBUK / ! 3366: * / / ! 3367: * +------------------------------------+ ! 3368: * ! 3369: {TBTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$TBT ! 3370: {TBLEN{EQU{OFFS2{{{LENGTH OF TBBLK IN BYTES ! 3371: {TBINV{EQU{OFFS3{{{DEFAULT INITIAL LOOKUP VALUE ! 3372: {TBBUK{EQU{TBINV+1{{{START OF HASH BUCKET POINTERS ! 3373: {TBSI${EQU{TBBUK{{{SIZE OF STANDARD FIELDS IN TBBLK ! 3374: {TBNBK{EQU{11{{{DEFAULT NO. OF BUCKETS ! 3375: * ! 3376: * THE TABLE BLOCK IS A HASH TABLE WHICH POINTS TO CHAINS ! 3377: * OF TABLE ELEMENT BLOCKS REPRESENTING THE ELEMENTS ! 3378: * IN THE TABLE WHICH HASH INTO THE SAME BUCKET. ! 3379: * ! 3380: * TBBUK ENTRIES EITHER POINT TO THE FIRST TEBLK ON THE ! 3381: * CHAIN OR THEY POINT TO THE TBBLK ITSELF TO INDICATE THE ! 3382: * END OF THE CHAIN. ! 3383: {{EJC{{{{ ! 3384: * ! 3385: * TABLE ELEMENT BLOCK (TEBLK) ! 3386: * ! 3387: * A TABLE ELEMENT IS USED TO REPRESENT A SINGLE ENTRY IN ! 3388: * A TABLE (SEE DESCRIPTION OF TBBLK FORMAT FOR HASH TABLE) ! 3389: * ! 3390: * +------------------------------------+ ! 3391: * I TETYP I ! 3392: * +------------------------------------+ ! 3393: * I TESUB I ! 3394: * +------------------------------------+ ! 3395: * I TEVAL I ! 3396: * +------------------------------------+ ! 3397: * I TENXT I ! 3398: * +------------------------------------+ ! 3399: * ! 3400: {TETYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$TET ! 3401: {TESUB{EQU{TETYP+1{{{SUBSCRIPT VALUE ! 3402: {TEVAL{EQU{TESUB+1{{{(=VRVAL) TABLE ELEMENT VALUE ! 3403: {TENXT{EQU{TEVAL+1{{{LINK TO NEXT TEBLK ! 3404: * SEE S$CNV WHERE RELATION IS ASSUMED WITH TENXT AND TBBUK ! 3405: {TESI${EQU{TENXT+1{{{SIZE OF TEBLK IN WORDS ! 3406: * ! 3407: * TENXT POINTS TO THE NEXT TEBLK ON THE HASH CHAIN FROM THE ! 3408: * TBBUK CHAIN FOR THIS HASH INDEX. AT THE END OF THE CHAIN, ! 3409: * TENXT POINTS BACK TO THE START OF THE TBBLK. ! 3410: * ! 3411: * TEVAL CONTAINS A DATA POINTER OR A TRBLK POINTER. ! 3412: * ! 3413: * TESUB CONTAINS A DATA POINTER. ! 3414: {{EJC{{{{ ! 3415: * ! 3416: * TRAP BLOCK (TRBLK) ! 3417: * ! 3418: * A TRAP BLOCK IS USED TO REPRESENT A TRACE OR INPUT OR ! 3419: * OUTPUT ASSOCIATION IN RESPONSE TO A CALL TO THE TRACE ! 3420: * INPUT OR OUTPUT SYSTEM FUNCTIONS. SEE BELOW FOR DETAILS ! 3421: * ! 3422: * +------------------------------------+ ! 3423: * I TRIDN I ! 3424: * +------------------------------------+ ! 3425: * I TRTYP I ! 3426: * +------------------------------------+ ! 3427: * I TRVAL OR TRLBL OR TRNXT OR TRKVR I ! 3428: * +------------------------------------+ ! 3429: * I TRTAG OR TRTER OR TRTRF I ! 3430: * +------------------------------------+ ! 3431: * I TRFNC OR TRFPT I ! 3432: * +------------------------------------+ ! 3433: * ! 3434: {TRIDN{EQU{0{{{POINTER TO DUMMY ROUTINE B$TRT ! 3435: {TRTYP{EQU{TRIDN+1{{{TRAP TYPE CODE ! 3436: {TRVAL{EQU{TRTYP+1{{{VALUE OF TRAPPED VARIABLE (=VRVAL) ! 3437: {TRNXT{EQU{TRVAL{{{PTR TO NEXT TRBLK ON TRBLK CHAIN ! 3438: {TRLBL{EQU{TRVAL{{{PTR TO ACTUAL LABEL (TRACED LABEL) ! 3439: {TRKVR{EQU{TRVAL{{{VRBLK POINTER FOR KEYWORD TRACE ! 3440: {TRTAG{EQU{TRVAL+1{{{TRACE TAG ! 3441: {TRTER{EQU{TRTAG{{{PTR TO TERMINAL VRBLK OR NULL ! 3442: {TRTRF{EQU{TRTAG{{{PTR TO TRBLK HOLDING FCBLK PTR ! 3443: {TRFNC{EQU{TRTAG+1{{{TRACE FUNCTION VRBLK (ZERO IF NONE) ! 3444: {TRFPT{EQU{TRFNC{{{FCBLK PTR FOR SYSIO ! 3445: {TRSI${EQU{TRFNC+1{{{NUMBER OF WORDS IN TRBLK ! 3446: * ! 3447: {TRTIN{EQU{0{{{TRACE TYPE FOR INPUT ASSOCIATION ! 3448: {TRTAC{EQU{TRTIN+1{{{TRACE TYPE FOR ACCESS TRACE ! 3449: {TRTVL{EQU{TRTAC+1{{{TRACE TYPE FOR VALUE TRACE ! 3450: {TRTOU{EQU{TRTVL+1{{{TRACE TYPE FOR OUTPUT ASSOCIATION ! 3451: {TRTFC{EQU{TRTOU+1{{{TRACE TYPE FOR FCBLK IDENTIFICATION ! 3452: {{EJC{{{{ ! 3453: * ! 3454: * TRAP BLOCK (CONTINUED) ! 3455: * ! 3456: * VARIABLE INPUT ASSOCIATION ! 3457: * ! 3458: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK ! 3459: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE ! 3460: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS ! 3461: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK. ! 3462: * ! 3463: * TRTYP IS SET TO TRTIN ! 3464: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL ! 3465: * TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS ! 3466: * FOR INPUT, TERMINAL, ELSE IT IS NULL. ! 3467: * TRTRF POINTS TO THE TRAP BLOCK WHICH IN TURN POINTS ! 3468: * TO AN FCBLK USED FOR I/O ASSOCIATION. ! 3469: * TRFPT IS THE FCBLK PTR RETURNED BY SYSIO. ! 3470: * ! 3471: * VARIABLE ACCESS TRACE ASSOCIATION ! 3472: * ! 3473: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK ! 3474: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE ! 3475: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS ! 3476: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK. ! 3477: * ! 3478: * TRTYP IS SET TO TRTAC ! 3479: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL ! 3480: * TRTAG IS THE TRACE TAG (0 IF NONE) ! 3481: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE) ! 3482: * ! 3483: * VARIABLE VALUE TRACE ASSOCIATION ! 3484: * ! 3485: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK ! 3486: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE ! 3487: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS ! 3488: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK. ! 3489: * ! 3490: * TRTYP IS SET TO TRTVL ! 3491: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL ! 3492: * TRTAG IS THE TRACE TAG (0 IF NONE) ! 3493: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE) ! 3494: {{EJC{{{{ ! 3495: * TRAP BLOCK (CONTINUED) ! 3496: * ! 3497: * VARIABLE OUTPUT ASSOCIATION ! 3498: * ! 3499: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK ! 3500: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE ! 3501: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS ! 3502: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK. ! 3503: * ! 3504: * TRTYP IS SET TO TRTOU ! 3505: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL ! 3506: * TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS ! 3507: * FOR OUTPUT, TERMINAL, ELSE IT IS NULL. ! 3508: * TRTRF POINTS TO THE TRAP BLOCK WHICH IN TURN POINTS ! 3509: * TO AN FCBLK USED FOR I/O ASSOCIATION. ! 3510: * TRFPT IS THE FCBLK PTR RETURNED BY SYSIO. ! 3511: * ! 3512: * FUNCTION CALL TRACE ! 3513: * ! 3514: * THE PFCTR FIELD OF THE CORRESPONDING PFBLK IS SET ! 3515: * TO POINT TO A TRBLK. ! 3516: * ! 3517: * TRTYP IS SET TO TRTIN ! 3518: * TRNXT IS ZERO ! 3519: * TRTAG IS THE TRACE TAG (0 IF NONE) ! 3520: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE) ! 3521: * ! 3522: * FUNCTION RETURN TRACE ! 3523: * ! 3524: * THE PFRTR FIELD OF THE CORRESPONDING PFBLK IS SET ! 3525: * TO POINT TO A TRBLK ! 3526: * ! 3527: * TRTYP IS SET TO TRTIN ! 3528: * TRNXT IS ZERO ! 3529: * TRTAG IS THE TRACE TAG (0 IF NONE) ! 3530: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE) ! 3531: * ! 3532: * LABEL TRACE ! 3533: * ! 3534: * THE VRLBL OF THE VRBLK FOR THE LABEL IS ! 3535: * CHANGED TO POINT TO A TRBLK AND THE VRTRA FIELD IS ! 3536: * SET TO B$VRT TO ACTIVATE THE CHECK. ! 3537: * ! 3538: * TRTYP IS SET TO TRTIN ! 3539: * TRLBL POINTS TO THE ACTUAL LABEL (CDBLK) VALUE ! 3540: * TRTAG IS THE TRACE TAG (0 IF NONE) ! 3541: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE) ! 3542: {{EJC{{{{ ! 3543: * ! 3544: * TRAP BLOCK (CONTINUED) ! 3545: * ! 3546: * KEYWORD TRACE ! 3547: * ! 3548: * KEYWORDS WHICH CAN BE TRACED POSSESS A UNIQUE ! 3549: * LOCATION WHICH IS ZERO IF THERE IS NO TRACE AND ! 3550: * POINTS TO A TRBLK IF THERE IS A TRACE. THE LOCATIONS ! 3551: * ARE AS FOLLOWS. ! 3552: * ! 3553: * R$ERT ERRTYPE ! 3554: * R$FNC FNCLEVEL ! 3555: * R$STC STCOUNT ! 3556: * ! 3557: * THE FORMAT OF THE TRBLK IS AS FOLLOWS. ! 3558: * ! 3559: * TRTYP IS SET TO TRTIN ! 3560: * TRKVR IS A POINTER TO THE VRBLK FOR THE KEYWORD ! 3561: * TRTAG IS THE TRACE TAG (0 IF NONE) ! 3562: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE) ! 3563: * ! 3564: * INPUT/OUTPUT FILE ARG1 TRAP BLOCK ! 3565: * ! 3566: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK ! 3567: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE OF ! 3568: * A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS ! 3569: * CONTAIN =B$VRA AND =B$VRV. THIS TRAP BLOCK IS USED ! 3570: * TO HOLD A POINTER TO THE FCBLK WHICH AN ! 3571: * IMPLEMENTATION MAY REQUEST TO HOLD INFORMATION ! 3572: * ABOUT A FILE. ! 3573: * ! 3574: * TRTYP IS SET TO TRTFC ! 3575: * TRNEXT POINTS TO NEXT TRBLK OR TRVAL IS VARIABLE VAL ! 3576: * TRFNM IS 0 ! 3577: * TRFPT IS THE FCBLK POINTER. ! 3578: * ! 3579: * NOTE THAT WHEN MULTIPLE TRAPS ARE SET ON A VARIABLE ! 3580: * THE ORDER IS IN ASCENDING VALUE OF TRTYP FIELD. ! 3581: * ! 3582: * INPUT ASSOCIATION (IF PRESENT) ! 3583: * ACCESS TRACE (IF PRESENT) ! 3584: * VALUE TRACE (IF PRESENT) ! 3585: * OUTPUT ASSOCIATION (IF PRESENT) ! 3586: * ! 3587: * THE ACTUAL VALUE OF THE VARIABLE IS STORED IN THE TRVAL ! 3588: * FIELD OF THE LAST TRBLK ON THE CHAIN. ! 3589: * ! 3590: * THIS IMPLEMENTATION DOES NOT PERMIT TRACE OR I/O ! 3591: * ASSOCIATIONS TO ANY OF THE PSEUDO-VARIABLES. ! 3592: {{EJC{{{{ ! 3593: * ! 3594: * VECTOR BLOCK (VCBLK) ! 3595: * ! 3596: * A VCBLK IS USED TO REPRESENT AN ARRAY VALUE WHICH HAS ! 3597: * ONE DIMENSION WHOSE LOWER BOUND IS ONE. ALL OTHER ARRAYS ! 3598: * ARE REPRESENTED BY ARBLKS. A VCBLK IS CREATED BY THE ! 3599: * SYSTEM FUNCTION ARRAY (S$ARR) WHEN PASSED AN INTEGER ARG. ! 3600: * ! 3601: * +------------------------------------+ ! 3602: * I VCTYP I ! 3603: * +------------------------------------+ ! 3604: * I IDVAL I ! 3605: * +------------------------------------+ ! 3606: * I VCLEN I ! 3607: * +------------------------------------+ ! 3608: * I VCVLS I ! 3609: * +------------------------------------+ ! 3610: * ! 3611: {VCTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$VCT ! 3612: {VCLEN{EQU{OFFS2{{{LENGTH OF VCBLK IN BYTES ! 3613: {VCVLS{EQU{OFFS3{{{START OF VECTOR VALUES ! 3614: {VCSI${EQU{VCVLS{{{SIZE OF STANDARD FIELDS IN VCBLK ! 3615: {VCVLB{EQU{VCVLS-1{{{OFFSET ONE WORD BEHIND VCVLS ! 3616: {VCTBD{EQU{TBSI$-VCSI${{{DIFFERENCE IN SIZES - SEE PRTVL ! 3617: * ! 3618: * VCVLS ARE EITHER DATA POINTERS OR TRBLK POINTERS ! 3619: * ! 3620: * THE DIMENSION CAN BE DEDUCED FROM VCLEN. ! 3621: {{EJC{{{{ ! 3622: * ! 3623: * VARIABLE BLOCK (VRBLK) ! 3624: * ! 3625: * A VARIABLE BLOCK IS BUILT IN THE STATIC MEMORY AREA ! 3626: * FOR EVERY VARIABLE REFERENCED OR CREATED BY A PROGRAM. ! 3627: * ! 3628: * NOTE THAT SINCE THESE BLOCKS ONLY OCCUR IN THE STATIC ! 3629: * REGION, IT IS PERMISSIBLE TO POINT TO ANY WORD IN ! 3630: * THE BLOCK AND THIS IS USED TO PROVIDE THREE DISTINCT ! 3631: * ACCESS POINTS FROM THE GENERATED CODE AS FOLLOWS. ! 3632: * ! 3633: * 1) POINT TO VRGET (FIRST WORD OF VRBLK) TO LOAD THE ! 3634: * VALUE OF THE VARIABLE ONTO THE MAIN STACK. ! 3635: * ! 3636: * 2) POINT TO VRSTO (SECOND WORD OF VRBLK) TO STORE THE ! 3637: * TOP STACK ELEMENT AS THE VALUE OF THE VARIABLE. ! 3638: * ! 3639: * 3) POINT TO VRTRA (FOURTH WORD OF VRBLK) TO JUMP TO ! 3640: * THE LABEL ASSOCIATED WITH THE VARIABLE NAME. ! 3641: * ! 3642: * +------------------------------------+ ! 3643: * I VRGET I ! 3644: * +------------------------------------+ ! 3645: * I VRSTO I ! 3646: * +------------------------------------+ ! 3647: * I VRVAL I ! 3648: * +------------------------------------+ ! 3649: * I VRTRA I ! 3650: * +------------------------------------+ ! 3651: * I VRLBL I ! 3652: * +------------------------------------+ ! 3653: * I VRFNC I ! 3654: * +------------------------------------+ ! 3655: * I VRNXT I ! 3656: * +------------------------------------+ ! 3657: * I VRLEN I ! 3658: * +------------------------------------+ ! 3659: * / / ! 3660: * / VRCHS = VRSVP / ! 3661: * / / ! 3662: * +------------------------------------+ ! 3663: {{EJC{{{{ ! 3664: * ! 3665: * VARIABLE BLOCK (CONTINUED) ! 3666: * ! 3667: {VRGET{EQU{0{{{POINTER TO ROUTINE TO LOAD VALUE ! 3668: {VRSTO{EQU{VRGET+1{{{POINTER TO ROUTINE TO STORE VALUE ! 3669: {VRVAL{EQU{VRSTO+1{{{VARIABLE VALUE ! 3670: {VRVLO{EQU{VRVAL-VRSTO{{{OFFSET TO VALUE FROM STORE FIELD ! 3671: {VRTRA{EQU{VRVAL+1{{{POINTER TO ROUTINE TO JUMP TO LABEL ! 3672: {VRLBL{EQU{VRTRA+1{{{POINTER TO CODE FOR LABEL ! 3673: {VRLBO{EQU{VRLBL-VRTRA{{{OFFSET TO LABEL FROM TRANSFER FIELD ! 3674: {VRFNC{EQU{VRLBL+1{{{POINTER TO FUNCTION BLOCK ! 3675: {VRNXT{EQU{VRFNC+1{{{POINTER TO NEXT VRBLK ON HASH CHAIN ! 3676: {VRLEN{EQU{VRNXT+1{{{LENGTH OF NAME (OR ZERO) ! 3677: {VRCHS{EQU{VRLEN+1{{{CHARACTERS OF NAME (VRLEN GT 0) ! 3678: {VRSVP{EQU{VRLEN+1{{{PTR TO SVBLK (VRLEN EQ 0) ! 3679: {VRSI${EQU{VRCHS+1{{{NUMBER OF STANDARD FIELDS IN VRBLK ! 3680: {VRSOF{EQU{VRLEN-SCLEN{{{OFFSET TO DUMMY SCBLK FOR NAME ! 3681: {VRSVO{EQU{VRSVP-VRSOF{{{PSEUDO-OFFSET TO VRSVP FIELD ! 3682: * ! 3683: * VRGET = B$VRL IF NOT INPUT ASSOCIATED OR ACCESS TRACED ! 3684: * VRGET = B$VRA IF INPUT ASSOCIATED OR ACCESS TRACED ! 3685: * ! 3686: * VRSTO = B$VRS IF NOT OUTPUT ASSOCIATED OR VALUE TRACED ! 3687: * VRSTO = B$VRV IF OUTPUT ASSOCIATED OR VALUE TRACED ! 3688: * VRSTO = B$VRE IF VALUE IS PROTECTED PATTERN VALUE ! 3689: * ! 3690: * VRVAL POINTS TO THE APPROPRIATE VALUE UNLESS THE ! 3691: * VARIABLE IS I/O/TRACE ASSOCIATED IN WHICH CASE, VRVAL ! 3692: * POINTS TO AN APPROPRIATE TRBLK (TRAP BLOCK) CHAIN. ! 3693: * ! 3694: * VRTRA = B$VRG IF THE LABEL IS NOT TRACED ! 3695: * VRTRA = B$VRT IF THE LABEL IS TRACED ! 3696: * ! 3697: * VRLBL POINTS TO A CDBLK IF THERE IS A LABEL ! 3698: * VRLBL POINTS TO THE SVBLK SVLBL FIELD FOR A SYSTEM LABEL ! 3699: * VRLBL POINTS TO STNDL FOR AN UNDEFINED LABEL ! 3700: * VRLBL POINTS TO A TRBLK IF THE LABEL IS TRACED ! 3701: * ! 3702: * VRFNC POINTS TO A FFBLK FOR A FIELD FUNCTION ! 3703: * VRFNC POINTS TO A DFBLK FOR A DATATYPE FUNCTION ! 3704: * VRFNC POINTS TO A PFBLK FOR A PROGRAM DEFINED FUNCTION ! 3705: * VRFNC POINTS TO A EFBLK FOR AN EXTERNAL LOADED FUNCTION ! 3706: * VRFNC POINTS TO SVFNC (SVBLK) FOR A SYSTEM FUNCTION ! 3707: * VRFNC POINTS TO STNDF IF THE FUNCTION IS UNDEFINED ! 3708: * ! 3709: * VRNXT POINTS TO THE NEXT VRBLK ON THIS CHAIN UNLESS ! 3710: * THIS IS THE END OF THE CHAIN IN WHICH CASE IT IS ZERO. ! 3711: * ! 3712: * VRLEN IS THE NAME LENGTH FOR A NON-SYSTEM VARIABLE. ! 3713: * VRLEN IS ZERO FOR A SYSTEM VARIABLE. ! 3714: * ! 3715: * VRCHS IS THE NAME (LJRZ) IF VRLEN IS NON-ZERO. ! 3716: * VRSVP IS A PTR TO THE SVBLK IF VRLEN IS ZERO. ! 3717: {{EJC{{{{ ! 3718: * ! 3719: * FORMAT OF A NON-RELOCATABLE EXTERNAL BLOCK (XNBLK) ! 3720: * ! 3721: * AN XNBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL) ! 3722: * DATA VALUE. THE BLOCK CONTAINS NO POINTERS TO OTHER ! 3723: * RELOCATABLE BLOCKS. AN XNBLK IS USED BY EXTERNAL FUNCTION ! 3724: * PROCESSING OR POSSIBLY FOR SYSTEM I/O ROUTINES ETC. ! 3725: * THE MACRO-SYSTEM ITSELF DOES NOT USE XNBLKS. ! 3726: * THIS TYPE OF BLOCK MAY BE USED AS A FILE CONTROL BLOCK. ! 3727: * SEE SYSFC,SYSIN,SYSOU,S$INP,S$OUP FOR DETAILS. ! 3728: * ! 3729: * +------------------------------------+ ! 3730: * I XNTYP I ! 3731: * +------------------------------------+ ! 3732: * I XNLEN I ! 3733: * +------------------------------------+ ! 3734: * / / ! 3735: * / XNDTA / ! 3736: * / / ! 3737: * +------------------------------------+ ! 3738: * ! 3739: {XNTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$XNT ! 3740: {XNLEN{EQU{XNTYP+1{{{LENGTH OF XNBLK IN BYTES ! 3741: {XNDTA{EQU{XNLEN+1{{{DATA WORDS ! 3742: {XNSI${EQU{XNDTA{{{SIZE OF STANDARD FIELDS IN XNBLK ! 3743: * ! 3744: * NOTE THAT THE TERM NON-RELOCATABLE REFERS TO THE CONTENTS ! 3745: * AND NOT THE BLOCK ITSELF. AN XNBLK CAN BE MOVED AROUND IF ! 3746: * IT IS BUILT IN THE DYNAMIC MEMORY AREA. ! 3747: {{EJC{{{{ ! 3748: * ! 3749: * RELOCATABLE EXTERNAL BLOCK (XRBLK) ! 3750: * ! 3751: * AN XRBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL) ! 3752: * DATA VALUE. THE DATA AREA IN THIS BLOCK CONSISTS ONLY ! 3753: * OF ADDRESS VALUES AND ANY ADDRESSES POINTING INTO THE ! 3754: * DYNAMIC MEMORY AREA MUST POINT TO THE START OF OTHER ! 3755: * DATA BLOCKS. SEE ALSO DESCRIPTION OF XNBLK. ! 3756: * THIS TYPE OF BLOCK MAY BE USED AS A FILE CONTROL BLOCK. ! 3757: * SEE SYSFC,SYSIN,SYSOU,S$INP,S$OUP FOR DETAILS. ! 3758: * ! 3759: * +------------------------------------+ ! 3760: * I XRTYP I ! 3761: * +------------------------------------+ ! 3762: * I XRLEN I ! 3763: * +------------------------------------+ ! 3764: * / / ! 3765: * / XRPTR / ! 3766: * / / ! 3767: * +------------------------------------+ ! 3768: * ! 3769: {XRTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$XRT ! 3770: {XRLEN{EQU{XRTYP+1{{{LENGTH OF XRBLK IN BYTES ! 3771: {XRPTR{EQU{XRLEN+1{{{START OF ADDRESS POINTERS ! 3772: {XRSI${EQU{XRPTR{{{SIZE OF STANDARD FIELDS IN XRBLK ! 3773: {{EJC{{{{ ! 3774: * ! 3775: * S$CNV (CONVERT) FUNCTION SWITCH CONSTANTS. THE VALUES ! 3776: * ARE TIED TO THE ORDER OF THE ENTRIES IN THE SVCTB TABLE ! 3777: * AND HENCE TO THE BRANCH TABLE IN S$CNV. ! 3778: * ! 3779: {CNVST{EQU{8{{{MAX STANDARD TYPE CODE FOR CONVERT ! 3780: {CNVRT{EQU{CNVST+1{{{CONVERT CODE FOR REALS ! 3781: {CNVBT{EQU{CNVRT+1{{{CONVERT CODE FOR BUFFER ! 3782: {CNVTT{EQU{CNVBT+1{{{BSW CODE FOR CONVERT ! 3783: * ! 3784: * INPUT IMAGE LENGTH ! 3785: * ! 3786: {INILN{EQU{132{{{DEFAULT IMAGE LENGTH FOR COMPILER ! 3787: {INILS{EQU{80{{{IMAGE LENGTH IF -SEQU IN EFFECT ! 3788: * ! 3789: {IONMB{EQU{2{{{NAME BASE USED FOR IOCHN IN SYSIO ! 3790: {IONMO{EQU{4{{{NAME OFFSET USED FOR IOCHN IN SYSIO ! 3791: * ! 3792: * IN GENERAL, MEANINGFUL MNEMONICS SHOULD BE USED FOR ! 3793: * OFFSETS. HOWEVER FOR SMALL INTEGERS USED OFTEN IN ! 3794: * LITERALS THE FOLLOWING GENERAL DEFINITIONS ARE PROVIDED. ! 3795: * ! 3796: {NUM01{EQU{1{{{ ! 3797: {NUM02{EQU{2{{{ ! 3798: {NUM03{EQU{3{{{ ! 3799: {NUM04{EQU{4{{{ ! 3800: {NUM05{EQU{5{{{ ! 3801: {NUM06{EQU{6{{{ ! 3802: {NUM07{EQU{7{{{ ! 3803: {NUM08{EQU{8{{{ ! 3804: {NUM09{EQU{9{{{ ! 3805: {NUM10{EQU{10{{{ ! 3806: {NINI8{EQU{998{{{ ! 3807: {NINI9{EQU{999{{{ ! 3808: {THSND{EQU{1000{{{ ! 3809: {{EJC{{{{ ! 3810: * ! 3811: * NUMBERS OF UNDEFINED SPITBOL OPERATORS ! 3812: * ! 3813: {OPBUN{EQU{5{{{NO. OF BINARY UNDEFINED OPS ! 3814: {OPUUN{EQU{6{{{NO OF UNARY UNDEFINED OPS ! 3815: * ! 3816: * OFFSETS USED IN PRTSN, PRTMI AND ACESS ! 3817: * ! 3818: {PRSNF{EQU{13{{{OFFSET USED IN PRTSN ! 3819: {PRTMF{EQU{15{{{OFFSET TO COL 15 (PRTMI) ! 3820: {RILEN{EQU{120{{{BUFFER LENGTH FOR SYSRI ! 3821: * ! 3822: * CODES FOR STAGES OF PROCESSING ! 3823: * ! 3824: {STGIC{EQU{0{{{INITIAL COMPILE ! 3825: {STGXC{EQU{STGIC+1{{{EXECUTION COMPILE (CODE) ! 3826: {STGEV{EQU{STGXC+1{{{EXPRESSION EVAL DURING EXECUTION ! 3827: {STGXT{EQU{STGEV+1{{{EXECUTION TIME ! 3828: {STGCE{EQU{STGXT+1{{{INITIAL COMPILE AFTER END LINE ! 3829: {STGXE{EQU{STGCE+1{{{EXEC. COMPILE AFTER END LINE ! 3830: {STGND{EQU{STGCE-STGIC{{{DIFFERENCE IN STAGE AFTER END ! 3831: {STGEE{EQU{STGXE+1{{{EVAL EVALUATING EXPRESSION ! 3832: {STGNO{EQU{STGEE+1{{{NUMBER OF CODES ! 3833: {{EJC{{{{ ! 3834: * ! 3835: * ! 3836: * STATEMENT NUMBER PAD COUNT FOR LISTR ! 3837: * ! 3838: {STNPD{EQU{8{{{STATEMENT NO. PAD COUNT ! 3839: * ! 3840: * SYNTAX TYPE CODES ! 3841: * ! 3842: * THESE CODES ARE RETURNED FROM THE SCANE PROCEDURE. ! 3843: * ! 3844: * THEY ARE SPACED 3 APART FOR THE BENEFIT OF EXPAN. ! 3845: * ! 3846: {T$UOP{EQU{0{{{UNARY OPERATOR ! 3847: {T$LPR{EQU{T$UOP+3{{{LEFT PAREN ! 3848: {T$LBR{EQU{T$LPR+3{{{LEFT BRACKET ! 3849: {T$CMA{EQU{T$LBR+3{{{COMMA ! 3850: {T$FNC{EQU{T$CMA+3{{{FUNCTION CALL ! 3851: {T$VAR{EQU{T$FNC+3{{{VARIABLE ! 3852: {T$CON{EQU{T$VAR+3{{{CONSTANT ! 3853: {T$BOP{EQU{T$CON+3{{{BINARY OPERATOR ! 3854: {T$RPR{EQU{T$BOP+3{{{RIGHT PAREN ! 3855: {T$RBR{EQU{T$RPR+3{{{RIGHT BRACKET ! 3856: {T$COL{EQU{T$RBR+3{{{COLON ! 3857: {T$SMC{EQU{T$COL+3{{{SEMI-COLON ! 3858: * ! 3859: * THE FOLLOWING DEFINITIONS ARE USED ONLY IN THE GOTO FIELD ! 3860: * ! 3861: {T$FGO{EQU{T$SMC+1{{{FAILURE GOTO ! 3862: {T$SGO{EQU{T$FGO+1{{{SUCCESS GOTO ! 3863: * ! 3864: * THE ABOVE CODES ARE GROUPED SO THAT CODES FOR ELEMENTS ! 3865: * WHICH CAN LEGITIMATELY IMMEDIATELY PRECEDE A UNARY ! 3866: * OPERATOR COME FIRST TO FACILITATE OPERATOR SYNTAX CHECK. ! 3867: * ! 3868: {T$UOK{EQU{T$FNC{{{LAST CODE OK BEFORE UNARY OPERATOR ! 3869: {{EJC{{{{ ! 3870: * ! 3871: * DEFINITIONS OF VALUES FOR EXPAN JUMP TABLE ! 3872: * ! 3873: {T$UO0{EQU{T$UOP+0{{{UNARY OPERATOR, STATE ZERO ! 3874: {T$UO1{EQU{T$UOP+1{{{UNARY OPERATOR, STATE ONE ! 3875: {T$UO2{EQU{T$UOP+2{{{UNARY OPERATOR, STATE TWO ! 3876: {T$LP0{EQU{T$LPR+0{{{LEFT PAREN, STATE ZERO ! 3877: {T$LP1{EQU{T$LPR+1{{{LEFT PAREN, STATE ONE ! 3878: {T$LP2{EQU{T$LPR+2{{{LEFT PAREN, STATE TWO ! 3879: {T$LB0{EQU{T$LBR+0{{{LEFT BRACKET, STATE ZERO ! 3880: {T$LB1{EQU{T$LBR+1{{{LEFT BRACKET, STATE ONE ! 3881: {T$LB2{EQU{T$LBR+2{{{LEFT BRACKET, STATE TWO ! 3882: {T$CM0{EQU{T$CMA+0{{{COMMA, STATE ZERO ! 3883: {T$CM1{EQU{T$CMA+1{{{COMMA, STATE ONE ! 3884: {T$CM2{EQU{T$CMA+2{{{COMMA, STATE TWO ! 3885: {T$FN0{EQU{T$FNC+0{{{FUNCTION CALL, STATE ZERO ! 3886: {T$FN1{EQU{T$FNC+1{{{FUNCTION CALL, STATE ONE ! 3887: {T$FN2{EQU{T$FNC+2{{{FUNCTION CALL, STATE TWO ! 3888: {T$VA0{EQU{T$VAR+0{{{VARIABLE, STATE ZERO ! 3889: {T$VA1{EQU{T$VAR+1{{{VARIABLE, STATE ONE ! 3890: {T$VA2{EQU{T$VAR+2{{{VARIABLE, STATE TWO ! 3891: {T$CO0{EQU{T$CON+0{{{CONSTANT, STATE ZERO ! 3892: {T$CO1{EQU{T$CON+1{{{CONSTANT, STATE ONE ! 3893: {T$CO2{EQU{T$CON+2{{{CONSTANT, STATE TWO ! 3894: {T$BO0{EQU{T$BOP+0{{{BINARY OPERATOR, STATE ZERO ! 3895: {T$BO1{EQU{T$BOP+1{{{BINARY OPERATOR, STATE ONE ! 3896: {T$BO2{EQU{T$BOP+2{{{BINARY OPERATOR, STATE TWO ! 3897: {T$RP0{EQU{T$RPR+0{{{RIGHT PAREN, STATE ZERO ! 3898: {T$RP1{EQU{T$RPR+1{{{RIGHT PAREN, STATE ONE ! 3899: {T$RP2{EQU{T$RPR+2{{{RIGHT PAREN, STATE TWO ! 3900: {T$RB0{EQU{T$RBR+0{{{RIGHT BRACKET, STATE ZERO ! 3901: {T$RB1{EQU{T$RBR+1{{{RIGHT BRACKET, STATE ONE ! 3902: {T$RB2{EQU{T$RBR+2{{{RIGHT BRACKET, STATE TWO ! 3903: {T$CL0{EQU{T$COL+0{{{COLON, STATE ZERO ! 3904: {T$CL1{EQU{T$COL+1{{{COLON, STATE ONE ! 3905: {T$CL2{EQU{T$COL+2{{{COLON, STATE TWO ! 3906: {T$SM0{EQU{T$SMC+0{{{SEMICOLON, STATE ZERO ! 3907: {T$SM1{EQU{T$SMC+1{{{SEMICOLON, STATE ONE ! 3908: {T$SM2{EQU{T$SMC+2{{{SEMICOLON, STATE TWO ! 3909: * ! 3910: {T$NES{EQU{T$SM2+1{{{NUMBER OF ENTRIES IN BRANCH TABLE ! 3911: {{EJC{{{{ ! 3912: * ! 3913: * DEFINITION OF OFFSETS USED IN CONTROL CARD PROCESSING ! 3914: * ! 3915: {CC$CA{EQU{0{{{-CASE ! 3916: {CC$DO{EQU{CC$CA+1{{{-DOUBLE ! 3917: {CC$DU{EQU{CC$DO+1{{{-DUMP ! 3918: {CC$EJ{EQU{CC$DU+1{{{-EJECT ! 3919: {CC$ER{EQU{CC$EJ+1{{{-ERRORS ! 3920: {CC$EX{EQU{CC$ER+1{{{-EXECUTE ! 3921: {CC$FA{EQU{CC$EX+1{{{-FAIL ! 3922: {CC$LI{EQU{CC$FA+1{{{-LIST ! 3923: {CC$NR{EQU{CC$LI+1{{{-NOERRORS ! 3924: {CC$NX{EQU{CC$NR+1{{{-NOEXECUTE ! 3925: {CC$NF{EQU{CC$NX+1{{{-NOFAIL ! 3926: {CC$NL{EQU{CC$NF+1{{{-NOLIST ! 3927: {CC$NO{EQU{CC$NL+1{{{-NOOPT ! 3928: {CC$NP{EQU{CC$NO+1{{{-NOPRINT ! 3929: {CC$OP{EQU{CC$NP+1{{{-OPTIMISE ! 3930: {CC$PR{EQU{CC$OP+1{{{-PRINT ! 3931: {CC$SI{EQU{CC$PR+1{{{-SINGLE ! 3932: {CC$SP{EQU{CC$SI+1{{{-SPACE ! 3933: {CC$ST{EQU{CC$SP+1{{{-STITL ! 3934: {CC$TI{EQU{CC$ST+1{{{-TITLE ! 3935: {CC$TR{EQU{CC$TI+1{{{-TRACE ! 3936: {CC$NC{EQU{CC$TR+1{{{NUMBER OF CONTROL CARDS ! 3937: {CCNOC{EQU{4{{{NO. OF CHARS INCLUDED IN MATCH ! 3938: {CCOFS{EQU{7{{{OFFSET TO START OF TITLE/SUBTITLE ! 3939: {{EJC{{{{ ! 3940: * ! 3941: * DEFINITIONS OF STACK OFFSETS USED IN CMPIL PROCEDURE ! 3942: * ! 3943: * SEE DESCRIPTION AT START OF CMPIL PROCEDURE FOR DETAILS ! 3944: * OF USE OF THESE LOCATIONS ON THE STACK. ! 3945: * ! 3946: {CMSTM{EQU{0{{{TREE FOR STATEMENT BODY ! 3947: {CMSGO{EQU{CMSTM+1{{{TREE FOR SUCCESS GOTO ! 3948: {CMFGO{EQU{CMSGO+1{{{TREE FOR FAIL GOTO ! 3949: {CMCGO{EQU{CMFGO+1{{{CONDITIONAL GOTO FLAG ! 3950: {CMPCD{EQU{CMCGO+1{{{PREVIOUS CDBLK POINTER ! 3951: {CMFFP{EQU{CMPCD+1{{{FAILURE FILL IN FLAG FOR PREVIOUS ! 3952: {CMFFC{EQU{CMFFP+1{{{FAILURE FILL IN FLAG FOR CURRENT ! 3953: {CMSOP{EQU{CMFFC+1{{{SUCCESS FILL IN OFFSET FOR PREVIOUS ! 3954: {CMSOC{EQU{CMSOP+1{{{SUCCESS FILL IN OFFSET FOR CURRENT ! 3955: {CMLBL{EQU{CMSOC+1{{{PTR TO VRBLK FOR CURRENT LABEL ! 3956: {CMTRA{EQU{CMLBL+1{{{PTR TO ENTRY CDBLK ! 3957: * ! 3958: {CMNEN{EQU{CMTRA+1{{{COUNT OF STACK ENTRIES FOR CMPIL ! 3959: * ! 3960: * A FEW CONSTANTS USED BY THE PROFILER ! 3961: {PFPD1{EQU{8{{{PAD POSITIONS ... ! 3962: {PFPD2{EQU{20{{{... FOR PROFILE ... ! 3963: {PFPD3{EQU{32{{{... PRINTOUT ! 3964: {PF$I2{EQU{CFP$I+CFP$I{{{SIZE OF TABLE ENTRY (2 INTS) ! 3965: * ! 3966: {{TTL{S{{{P I T B O L -- CONSTANT SECTION ! 3967: * ! 3968: * THIS SECTION CONSISTS ENTIRELY OF ASSEMBLED CONSTANTS. ! 3969: * ! 3970: * ALL LABEL NAMES ARE FIVE LETTERS. THE ORDER IS ! 3971: * APPROXIMATELY ALPHABETICAL, BUT IN SOME CASES (ALWAYS ! 3972: * DOCUMENTED), CONSTANTS MUST BE PLACED IN SOME SPECIAL ! 3973: * ORDER WHICH MUST NOT BE DISTURBED. ! 3974: * ! 3975: * IT MUST ALSO BE REMEMBERED THAT THERE IS A REQUIREMENT ! 3976: * FOR NO FORWARD REFERENCES WHICH ALSO DISTURBS THE ! 3977: * ALPHABETICAL ORDER IN SOME CASES. ! 3978: * ! 3979: {{SEC{{{{START OF CONSTANT SECTION ! 3980: * ! 3981: * FREE STORE PERCENTAGE (USED BY ALLOC) ! 3982: * ! 3983: {ALFSP{DAC{E$FSP{{{FREE STORE PERCENTAGE ! 3984: * ! 3985: * BIT CONSTANTS FOR GENERAL USE ! 3986: * ! 3987: {BITS0{DBC{0{{{ALL ZERO BITS ! 3988: {BITS1{DBC{1{{{ONE BIT IN LOW ORDER POSITION ! 3989: {BITS2{DBC{2{{{BIT IN POSITION 2 ! 3990: {BITS3{DBC{4{{{BIT IN POSITION 3 ! 3991: {BITS4{DBC{8{{{BIT IN POSITION 4 ! 3992: {BITS5{DBC{16{{{BIT IN POSITION 5 ! 3993: {BITS6{DBC{32{{{BIT IN POSITION 6 ! 3994: {BITS7{DBC{64{{{BIT IN POSITION 7 ! 3995: {BITS8{DBC{128{{{BIT IN POSITION 8 ! 3996: {BITS9{DBC{256{{{BIT IN POSITION 9 ! 3997: {BIT10{DBC{512{{{BIT IN POSITION 10 ! 3998: {BITSM{DBC{CFP$M{{{MASK FOR MAX INTEGER ! 3999: * ! 4000: * BIT CONSTANTS FOR SVBLK (SVBIT FIELD) TESTS ! 4001: * ! 4002: {BTFNC{DBC{SVFNC{{{BIT TO TEST FOR FUNCTION ! 4003: {BTKNM{DBC{SVKNM{{{BIT TO TEST FOR KEYWORD NUMBER ! 4004: {BTLBL{DBC{SVLBL{{{BIT TO TEST FOR LABEL ! 4005: {BTFFC{DBC{SVFFC{{{BIT TO TEST FOR FAST CALL ! 4006: {BTCKW{DBC{SVCKW{{{BIT TO TEST FOR CONSTANT KEYWORD ! 4007: {BTPRD{DBC{SVPRD{{{BIT TO TEST FOR PREDICATE FUNCTION ! 4008: {BTPRE{DBC{SVPRE{{{BIT TO TEST FOR PREEVALUATION ! 4009: {BTVAL{DBC{SVVAL{{{BIT TO TEST FOR VALUE ! 4010: {{EJC{{{{ ! 4011: * ! 4012: * LIST OF NAMES USED FOR CONTROL CARD PROCESSING ! 4013: * ! 4014: {CCNMS{DTC{/CASE/{{{ ! 4015: {{DTC{/DOUB/{{{ ! 4016: {{DTC{/DUMP/{{{ ! 4017: {{DTC{/EJEC/{{{ ! 4018: {{DTC{/ERRO/{{{ ! 4019: {{DTC{/EXEC/{{{ ! 4020: {{DTC{/FAIL/{{{ ! 4021: {{DTC{/LIST/{{{ ! 4022: {{DTC{/NOER/{{{ ! 4023: {{DTC{/NOEX/{{{ ! 4024: {{DTC{/NOFA/{{{ ! 4025: {{DTC{/NOLI/{{{ ! 4026: {{DTC{/NOOP/{{{ ! 4027: {{DTC{/NOPR/{{{ ! 4028: {{DTC{/OPTI/{{{ ! 4029: {{DTC{/PRIN/{{{ ! 4030: {{DTC{/SING/{{{ ! 4031: {{DTC{/SPAC/{{{ ! 4032: {{DTC{/STIT/{{{ ! 4033: {{DTC{/TITL/{{{ ! 4034: {{DTC{/TRAC/{{{ ! 4035: * ! 4036: * HEADER MESSAGES FOR DUMPR PROCEDURE (SCBLK FORMAT) ! 4037: * ! 4038: {DMHDK{DAC{B$SCL{{{DUMP OF KEYWORD VALUES ! 4039: {{DAC{22{{{ ! 4040: {{DTC{/DUMP OF KEYWORD VALUES/{{{ ! 4041: * ! 4042: {DMHDV{DAC{B$SCL{{{DUMP OF NATURAL VARIABLES ! 4043: {{DAC{25{{{ ! 4044: {{DTC{/DUMP OF NATURAL VARIABLES/{{{ ! 4045: {{EJC{{{{ ! 4046: * ! 4047: * MESSAGE TEXT FOR COMPILATION STATISTICS ! 4048: * ! 4049: {ENCM1{DAC{B$SCL{{{ ! 4050: {{DAC{10{{{ ! 4051: {{DTC{/STORE USED/{{{ ! 4052: * ! 4053: {ENCM2{DAC{B$SCL{{{ ! 4054: {{DAC{10{{{ ! 4055: {{DTC{/STORE LEFT/{{{ ! 4056: * ! 4057: {ENCM3{DAC{B$SCL{{{ ! 4058: {{DAC{11{{{ ! 4059: {{DTC{/COMP ERRORS/{{{ ! 4060: * ! 4061: {ENCM4{DAC{B$SCL{{{ ! 4062: {{DAC{14{{{ ! 4063: {{DTC{/COMP TIME-MSEC/{{{ ! 4064: * ! 4065: {ENCM5{DAC{B$SCL{{{EXECUTION SUPPRESSED ! 4066: {{DAC{20{{{ ! 4067: {{DTC{/EXECUTION SUPPRESSED/{{{ ! 4068: * ! 4069: * STRING CONSTANT FOR ABNORMAL END ! 4070: * ! 4071: {ENDAB{DAC{B$SCL{{{ ! 4072: {{DAC{12{{{ ! 4073: {{DTC{/ABNORMAL END/{{{ ! 4074: {{EJC{{{{ ! 4075: * ! 4076: * MEMORY OVERFLOW DURING INITIALISATION ! 4077: * ! 4078: {ENDMO{DAC{B$SCL{{{ ! 4079: {ENDML{DAC{15{{{ ! 4080: {{DTC{/MEMORY OVERFLOW/{{{ ! 4081: * ! 4082: * STRING CONSTANT FOR MESSAGE ISSUED BY L$END ! 4083: * ! 4084: {ENDMS{DAC{B$SCL{{{ ! 4085: {{DAC{10{{{ ! 4086: {{DTC{/NORMAL END/{{{ ! 4087: * ! 4088: * FAIL MESSAGE FOR STACK FAIL SECTION ! 4089: * ! 4090: {ENDSO{DAC{B$SCL{{{STACK OVERFLOW IN GARBAGE COLLECTOR ! 4091: {{DAC{36{{{ ! 4092: {{DTC{/STACK OVERFLOW IN GARBAGE COLLECTION/{{{ ! 4093: * ! 4094: * STRING CONSTANT FOR TIME UP ! 4095: * ! 4096: {ENDTU{DAC{B$SCL{{{ ! 4097: {{DAC{15{{{ ! 4098: {{DTC{/ERROR - TIME UP/{{{ ! 4099: {{EJC{{{{ ! 4100: * ! 4101: * STRING CONSTANT FOR ERROR MESSAGE (ERROR SECTION) ! 4102: * ! 4103: {ERMMS{DAC{B$SCL{{{ERROR ! 4104: {{DAC{5{{{ ! 4105: {{DTC{/ERROR/{{{ ! 4106: * ! 4107: {ERMNS{DAC{B$SCL{{{STRING / -- / ! 4108: {{DAC{4{{{ ! 4109: {{DTC{/ -- /{{{ ! 4110: * ! 4111: * STRING CONSTANT FOR PAGE NUMBERING ! 4112: * ! 4113: {LSTMS{DAC{B$SCL{{{PAGE ! 4114: {{DAC{5{{{ ! 4115: {{DTC{/PAGE /{{{ ! 4116: * ! 4117: * LISTING HEADER MESSAGE ! 4118: * ! 4119: {HEADR{DAC{B$SCL{{{ ! 4120: {{DAC{25{{{ ! 4121: {{DTC{/MACRO SPITBOL VERSION 3.5/{{{ ! 4122: * ! 4123: {HEADV{DAC{B$SCL{{{FOR EXIT() VERSION NO. CHECK ! 4124: {{DAC{3{{{ ! 4125: {{DTC{/3.5/{{{ ! 4126: * ! 4127: * INTEGER CONSTANTS FOR GENERAL USE ! 4128: * ICBLD OPTIMISATION USES THE FIRST THREE. ! 4129: * ! 4130: {INT$R{DAC{B$ICL{{{ ! 4131: {INTV0{DIC{+0{{{0 ! 4132: {INTON{DAC{B$ICL{{{ ! 4133: {INTV1{DIC{+1{{{1 ! 4134: {INTTW{DAC{B$ICL{{{ ! 4135: {INTV2{DIC{+2{{{2 ! 4136: {INTVT{DIC{+10{{{10 ! 4137: {INTVH{DIC{+100{{{100 ! 4138: {INTTH{DIC{+1000{{{1000 ! 4139: * ! 4140: * TABLE USED IN ICBLD OPTIMISATION ! 4141: * ! 4142: {INTAB{DAC{INT$R{{{POINTER TO 0 ! 4143: {{DAC{INTON{{{POINTER TO 1 ! 4144: {{DAC{INTTW{{{POINTER TO 2 ! 4145: {{EJC{{{{ ! 4146: * ! 4147: * SPECIAL PATTERN NODES. THE FOLLOWING PATTERN NODES ! 4148: * CONSIST SIMPLY OF A PCODE POINTER, SEE MATCH ROUTINES ! 4149: * (P$XXX) FOR FULL DETAILS OF THEIR USE AND FORMAT). ! 4150: * ! 4151: {NDABB{DAC{P$ABB{{{ARBNO ! 4152: {NDABD{DAC{P$ABD{{{ARBNO ! 4153: {NDARC{DAC{P$ARC{{{ARB ! 4154: {NDEXB{DAC{P$EXB{{{EXPRESSION ! 4155: {NDFNB{DAC{P$FNB{{{FENCE() ! 4156: {NDFND{DAC{P$FND{{{FENCE() ! 4157: {NDEXC{DAC{P$EXC{{{EXPRESSION ! 4158: {NDIMB{DAC{P$IMB{{{IMMEDIATE ASSIGNMENT ! 4159: {NDIMD{DAC{P$IMD{{{IMMEDIATE ASSIGNMENT ! 4160: {NDNTH{DAC{P$NTH{{{PATTERN END (NULL PATTERN) ! 4161: {NDPAB{DAC{P$PAB{{{PATTERN ASSIGNMENT ! 4162: {NDPAD{DAC{P$PAD{{{PATTERN ASSIGNMENT ! 4163: {NDUNA{DAC{P$UNA{{{ANCHOR POINT MOVEMENT ! 4164: * ! 4165: * KEYWORD CONSTANT PATTERN NODES. THE FOLLOWING NODES ARE ! 4166: * USED AS THE VALUES OF PATTERN KEYWORDS AND THE INITIAL ! 4167: * VALUES OF THE CORRESPONDING NATURAL VARIABLES. ALL ! 4168: * NODES ARE IN P0BLK FORMAT AND THE ORDER IS TIED TO THE ! 4169: * DEFINITIONS OF CORRESPONDING K$XXX SYMBOLS. ! 4170: * ! 4171: {NDABO{DAC{P$ABO{{{ABORT ! 4172: {{DAC{NDNTH{{{ ! 4173: {NDARB{DAC{P$ARB{{{ARB ! 4174: {{DAC{NDNTH{{{ ! 4175: {NDBAL{DAC{P$BAL{{{BAL ! 4176: {{DAC{NDNTH{{{ ! 4177: {NDFAL{DAC{P$FAL{{{FAIL ! 4178: {{DAC{NDNTH{{{ ! 4179: {NDFEN{DAC{P$FEN{{{FENCE ! 4180: {{DAC{NDNTH{{{ ! 4181: {NDREM{DAC{P$REM{{{REM ! 4182: {{DAC{NDNTH{{{ ! 4183: {NDSUC{DAC{P$SUC{{{SUCCEED ! 4184: {{DAC{NDNTH{{{ ! 4185: * ! 4186: * NULL STRING. ALL NULL VALUES POINT TO THIS STRING. THE ! 4187: * SVCHS FIELD CONTAINS A BLANK TO PROVIDE FOR EASY DEFAULT ! 4188: * PROCESSING IN TRACE, STOPTR, LPAD AND RPAD. ! 4189: * NULLW CONTAINS 10 BLANKS WHICH ENSURES AN ALL BLANK WORD ! 4190: * BUT FOR VERY EXCEPTIONAL MACHINES. ! 4191: * ! 4192: {NULLS{DAC{B$SCL{{{NULL STRING VALUE ! 4193: {{DAC{0{{{SCLEN = 0 ! 4194: {NULLW{DTC{/ /{{{ ! 4195: {{EJC{{{{ ! 4196: * ! 4197: * OPERATOR DOPE VECTORS (SEE DVBLK FORMAT) ! 4198: * ! 4199: {OPDVC{DAC{O$CNC{{{CONCATENATION ! 4200: {{DAC{C$CNC{{{ ! 4201: {{DAC{LLCNC{{{ ! 4202: {{DAC{RRCNC{{{ ! 4203: * ! 4204: * OPDVS IS USED WHEN SCANNING BELOW THE TOP LEVEL TO ! 4205: * INSURE THAT THE CONCATENATION WILL NOT BE LATER ! 4206: * MISTAKEN FOR PATTERN MATCHING ! 4207: * ! 4208: {OPDVP{DAC{O$CNC{{{CONCATENATION - NOT PATTERN MATCH ! 4209: {{DAC{C$CNP{{{ ! 4210: {{DAC{LLCNC{{{ ! 4211: {{DAC{RRCNC{{{ ! 4212: * ! 4213: * NOTE THAT THE ORDER OF THE REMAINING ENTRIES IS TIED TO ! 4214: * THE ORDER OF THE CODING IN THE SCANE PROCEDURE. ! 4215: * ! 4216: {OPDVS{DAC{O$ASS{{{ASSIGNMENT ! 4217: {{DAC{C$ASS{{{ ! 4218: {{DAC{LLASS{{{ ! 4219: {{DAC{RRASS{{{ ! 4220: * ! 4221: {{DAC{6{{{UNARY EQUAL ! 4222: {{DAC{C$UUO{{{ ! 4223: {{DAC{LLUNO{{{ ! 4224: * ! 4225: {{DAC{O$PMV{{{PATTERN MATCH ! 4226: {{DAC{C$PMT{{{ ! 4227: {{DAC{LLPMT{{{ ! 4228: {{DAC{RRPMT{{{ ! 4229: * ! 4230: {{DAC{O$INT{{{INTERROGATION ! 4231: {{DAC{C$UVL{{{ ! 4232: {{DAC{LLUNO{{{ ! 4233: * ! 4234: {{DAC{1{{{BINARY AMPERSAND ! 4235: {{DAC{C$UBO{{{ ! 4236: {{DAC{LLAMP{{{ ! 4237: {{DAC{RRAMP{{{ ! 4238: * ! 4239: {{DAC{O$KWV{{{KEYWORD REFERENCE ! 4240: {{DAC{C$KEY{{{ ! 4241: {{DAC{LLUNO{{{ ! 4242: * ! 4243: {{DAC{O$ALT{{{ALTERNATION ! 4244: {{DAC{C$ALT{{{ ! 4245: {{DAC{LLALT{{{ ! 4246: {{DAC{RRALT{{{ ! 4247: {{EJC{{{{ ! 4248: * ! 4249: * OPERATOR DOPE VECTORS (CONTINUED) ! 4250: * ! 4251: {{DAC{5{{{UNARY VERTICAL BAR ! 4252: {{DAC{C$UUO{{{ ! 4253: {{DAC{LLUNO{{{ ! 4254: * ! 4255: {{DAC{0{{{BINARY AT ! 4256: {{DAC{C$UBO{{{ ! 4257: {{DAC{LLATS{{{ ! 4258: {{DAC{RRATS{{{ ! 4259: * ! 4260: {{DAC{O$CAS{{{CURSOR ASSIGNMENT ! 4261: {{DAC{C$UNM{{{ ! 4262: {{DAC{LLUNO{{{ ! 4263: * ! 4264: {{DAC{2{{{BINARY NUMBER SIGN ! 4265: {{DAC{C$UBO{{{ ! 4266: {{DAC{LLNUM{{{ ! 4267: {{DAC{RRNUM{{{ ! 4268: * ! 4269: {{DAC{7{{{UNARY NUMBER SIGN ! 4270: {{DAC{C$UUO{{{ ! 4271: {{DAC{LLUNO{{{ ! 4272: * ! 4273: {{DAC{O$DVD{{{DIVISION ! 4274: {{DAC{C$BVL{{{ ! 4275: {{DAC{LLDVD{{{ ! 4276: {{DAC{RRDVD{{{ ! 4277: * ! 4278: {{DAC{9{{{UNARY SLASH ! 4279: {{DAC{C$UUO{{{ ! 4280: {{DAC{LLUNO{{{ ! 4281: * ! 4282: {{DAC{O$MLT{{{MULTIPLICATION ! 4283: {{DAC{C$BVL{{{ ! 4284: {{DAC{LLMLT{{{ ! 4285: {{DAC{RRMLT{{{ ! 4286: {{EJC{{{{ ! 4287: * ! 4288: * OPERATOR DOPE VECTORS (CONTINUED) ! 4289: * ! 4290: {{DAC{0{{{DEFERRED EXPRESSION ! 4291: {{DAC{C$DEF{{{ ! 4292: {{DAC{LLUNO{{{ ! 4293: * ! 4294: {{DAC{3{{{BINARY PERCENT ! 4295: {{DAC{C$UBO{{{ ! 4296: {{DAC{LLPCT{{{ ! 4297: {{DAC{RRPCT{{{ ! 4298: * ! 4299: {{DAC{8{{{UNARY PERCENT ! 4300: {{DAC{C$UUO{{{ ! 4301: {{DAC{LLUNO{{{ ! 4302: * ! 4303: {{DAC{O$EXP{{{EXPONENTIATION ! 4304: {{DAC{C$BVL{{{ ! 4305: {{DAC{LLEXP{{{ ! 4306: {{DAC{RREXP{{{ ! 4307: * ! 4308: {{DAC{10{{{UNARY EXCLAMATION ! 4309: {{DAC{C$UUO{{{ ! 4310: {{DAC{LLUNO{{{ ! 4311: * ! 4312: {{DAC{O$IMA{{{IMMEDIATE ASSIGNMENT ! 4313: {{DAC{C$BVN{{{ ! 4314: {{DAC{LLDLD{{{ ! 4315: {{DAC{RRDLD{{{ ! 4316: * ! 4317: {{DAC{O$INV{{{INDIRECTION ! 4318: {{DAC{C$IND{{{ ! 4319: {{DAC{LLUNO{{{ ! 4320: * ! 4321: {{DAC{4{{{BINARY NOT ! 4322: {{DAC{C$UBO{{{ ! 4323: {{DAC{LLNOT{{{ ! 4324: {{DAC{RRNOT{{{ ! 4325: * ! 4326: {{DAC{0{{{NEGATION ! 4327: {{DAC{C$NEG{{{ ! 4328: {{DAC{LLUNO{{{ ! 4329: {{EJC{{{{ ! 4330: * ! 4331: * OPERATOR DOPE VECTORS (CONTINUED) ! 4332: * ! 4333: {{DAC{O$SUB{{{SUBTRACTION ! 4334: {{DAC{C$BVL{{{ ! 4335: {{DAC{LLPLM{{{ ! 4336: {{DAC{RRPLM{{{ ! 4337: * ! 4338: {{DAC{O$COM{{{COMPLEMENTATION ! 4339: {{DAC{C$UVL{{{ ! 4340: {{DAC{LLUNO{{{ ! 4341: * ! 4342: {{DAC{O$ADD{{{ADDITION ! 4343: {{DAC{C$BVL{{{ ! 4344: {{DAC{LLPLM{{{ ! 4345: {{DAC{RRPLM{{{ ! 4346: * ! 4347: {{DAC{O$AFF{{{AFFIRMATION ! 4348: {{DAC{C$UVL{{{ ! 4349: {{DAC{LLUNO{{{ ! 4350: * ! 4351: {{DAC{O$PAS{{{PATTERN ASSIGNMENT ! 4352: {{DAC{C$BVN{{{ ! 4353: {{DAC{LLDLD{{{ ! 4354: {{DAC{RRDLD{{{ ! 4355: * ! 4356: {{DAC{O$NAM{{{NAME REFERENCE ! 4357: {{DAC{C$UNM{{{ ! 4358: {{DAC{LLUNO{{{ ! 4359: * ! 4360: * SPECIAL DVS FOR GOTO OPERATORS (SEE PROCEDURE SCNGF) ! 4361: * ! 4362: {OPDVD{DAC{O$GOD{{{DIRECT GOTO ! 4363: {{DAC{C$UVL{{{ ! 4364: {{DAC{LLUNO{{{ ! 4365: * ! 4366: {OPDVN{DAC{O$GOC{{{COMPLEX NORMAL GOTO ! 4367: {{DAC{C$UNM{{{ ! 4368: {{DAC{LLUNO{{{ ! 4369: {{EJC{{{{ ! 4370: * ! 4371: * OPERATOR ENTRY ADDRESS POINTERS, USED IN CODE ! 4372: * ! 4373: {OAMN${DAC{O$AMN{{{ARRAY REF (MULTI-SUBS BY VALUE) ! 4374: {OAMV${DAC{O$AMV{{{ARRAY REF (MULTI-SUBS BY VALUE) ! 4375: {OAON${DAC{O$AON{{{ARRAY REF (ONE SUB BY NAME) ! 4376: {OAOV${DAC{O$AOV{{{ARRAY REF (ONE SUB BY VALUE) ! 4377: {OCER${DAC{O$CER{{{COMPILATION ERROR ! 4378: {OFEX${DAC{O$FEX{{{FAILURE IN EXPRESSION EVALUATION ! 4379: {OFIF${DAC{O$FIF{{{FAILURE DURING GOTO EVALUATION ! 4380: {OFNC${DAC{O$FNC{{{FUNCTION CALL (MORE THAN ONE ARG) ! 4381: {OFNE${DAC{O$FNE{{{FUNCTION NAME ERROR ! 4382: {OFNS${DAC{O$FNS{{{FUNCTION CALL (SINGLE ARGUMENT) ! 4383: {OGOF${DAC{O$GOF{{{SET GOTO FAILURE TRAP ! 4384: {OINN${DAC{O$INN{{{INDIRECTION BY NAME ! 4385: {OKWN${DAC{O$KWN{{{KEYWORD REFERENCE BY NAME ! 4386: {OLEX${DAC{O$LEX{{{LOAD EXPRESSION BY NAME ! 4387: {OLPT${DAC{O$LPT{{{LOAD PATTERN ! 4388: {OLVN${DAC{O$LVN{{{LOAD VARIABLE NAME ! 4389: {ONTA${DAC{O$NTA{{{NEGATION, FIRST ENTRY ! 4390: {ONTB${DAC{O$NTB{{{NEGATION, SECOND ENTRY ! 4391: {ONTC${DAC{O$NTC{{{NEGATION, THIRD ENTRY ! 4392: {OPMN${DAC{O$PMN{{{PATTERN MATCH BY NAME ! 4393: {OPMS${DAC{O$PMS{{{PATTERN MATCH (STATEMENT) ! 4394: {OPOP${DAC{O$POP{{{POP TOP STACK ITEM ! 4395: {ORNM${DAC{O$RNM{{{RETURN NAME FROM EXPRESSION ! 4396: {ORPL${DAC{O$RPL{{{PATTERN REPLACEMENT ! 4397: {ORVL${DAC{O$RVL{{{RETURN VALUE FROM EXPRESSION ! 4398: {OSLA${DAC{O$SLA{{{SELECTION, FIRST ENTRY ! 4399: {OSLB${DAC{O$SLB{{{SELECTION, SECOND ENTRY ! 4400: {OSLC${DAC{O$SLC{{{SELECTION, THIRD ENTRY ! 4401: {OSLD${DAC{O$SLD{{{SELECTION, FOURTH ENTRY ! 4402: {OSTP${DAC{O$STP{{{STOP EXECUTION ! 4403: {OUNF${DAC{O$UNF{{{UNEXPECTED FAILURE ! 4404: {{EJC{{{{ ! 4405: * ! 4406: * TABLE OF NAMES OF UNDEFINED BINARY OPERATORS FOR OPSYN ! 4407: * ! 4408: {OPSNB{DAC{CH$AT{{{AT ! 4409: {{DAC{CH$AM{{{AMPERSAND ! 4410: {{DAC{CH$NM{{{NUMBER ! 4411: {{DAC{CH$PC{{{PERCENT ! 4412: {{DAC{CH$NT{{{NOT ! 4413: * ! 4414: * TABLE OF NAMES OF UNDEFINED UNARY OPERATORS FOR OPSYN ! 4415: * ! 4416: {OPNSU{DAC{CH$BR{{{VERTICAL BAR ! 4417: {{DAC{CH$EQ{{{EQUAL ! 4418: {{DAC{CH$NM{{{NUMBER ! 4419: {{DAC{CH$PC{{{PERCENT ! 4420: {{DAC{CH$SL{{{SLASH ! 4421: {{DAC{CH$EX{{{EXCLAMATION ! 4422: * ! 4423: * ADDRESS CONST CONTAINING PROFILE TABLE ENTRY SIZE ! 4424: * ! 4425: {PFI2A{DAC{PF$I2{{{ ! 4426: * ! 4427: * PROFILER MESSAGE STRINGS ! 4428: * ! 4429: {PFMS1{DAC{B$SCL{{{ ! 4430: {{DAC{15{{{ ! 4431: {{DTC{/PROGRAM PROFILE/{{{ ! 4432: {PFMS2{DAC{B$SCL{{{ ! 4433: {{DAC{42{{{ ! 4434: {{DTC{/STMT NUMBER OF -- EXECUTION TIME --/{{{ ! 4435: {PFMS3{DAC{B$SCL{{{ ! 4436: {{DAC{47{{{ ! 4437: {{DTC{/NUMBER EXECUTIONS TOTAL(MSEC) PER EXCN(MCSEC)/{{{ ! 4438: * ! 4439: * ! 4440: * REAL CONSTANTS FOR GENERAL USE. NOTE THAT THE CONSTANTS ! 4441: * STARTING AT REAV1 FORM A POWERS OF TEN TABLE (GTSTG) ! 4442: * ! 4443: {REAV0{DRC{+0.0{{{0.0 ! 4444: {REAP1{DRC{+0.1{{{0.1 ! 4445: {REAP5{DRC{+0.5{{{0.5 ! 4446: {REAV1{DRC{+1.0{{{10**0 ! 4447: {REAVT{DRC{+1.0E+1{{{10**1 ! 4448: {{DRC{+1.0E+2{{{10**2 ! 4449: {{DRC{+1.0E+3{{{10**3 ! 4450: {{DRC{+1.0E+4{{{10**4 ! 4451: {{DRC{+1.0E+5{{{10**5 ! 4452: {{DRC{+1.0E+6{{{10**6 ! 4453: {{DRC{+1.0E+7{{{10**7 ! 4454: {{DRC{+1.0E+8{{{10**8 ! 4455: {{DRC{+1.0E+9{{{10**9 ! 4456: {REATT{DRC{+1.0E+10{{{10**10 ! 4457: {{EJC{{{{ ! 4458: * ! 4459: * STRING CONSTANTS (SCBLK FORMAT) FOR DTYPE PROCEDURE ! 4460: * ! 4461: {SCARR{DAC{B$SCL{{{ARRAY ! 4462: {{DAC{5{{{ ! 4463: {{DTC{/ARRAY/{{{ ! 4464: * ! 4465: {SCBUF{DAC{B$SCL{{{BUFFER ! 4466: {{DAC{6{{{ ! 4467: {{DTC{/BUFFER/{{{ ! 4468: * ! 4469: {SCCOD{DAC{B$SCL{{{CODE ! 4470: {{DAC{4{{{ ! 4471: {{DTC{/CODE/{{{ ! 4472: * ! 4473: {SCEXP{DAC{B$SCL{{{EXPRESSION ! 4474: {{DAC{10{{{ ! 4475: {{DTC{/EXPRESSION/{{{ ! 4476: * ! 4477: {SCEXT{DAC{B$SCL{{{EXTERNAL ! 4478: {{DAC{8{{{ ! 4479: {{DTC{/EXTERNAL/{{{ ! 4480: * ! 4481: {SCINT{DAC{B$SCL{{{INTEGER ! 4482: {{DAC{7{{{ ! 4483: {{DTC{/INTEGER/{{{ ! 4484: * ! 4485: {SCNAM{DAC{B$SCL{{{NAME ! 4486: {{DAC{4{{{ ! 4487: {{DTC{/NAME/{{{ ! 4488: * ! 4489: {SCNUM{DAC{B$SCL{{{NUMERIC ! 4490: {{DAC{7{{{ ! 4491: {{DTC{/NUMERIC/{{{ ! 4492: * ! 4493: {SCPAT{DAC{B$SCL{{{PATTERN ! 4494: {{DAC{7{{{ ! 4495: {{DTC{/PATTERN/{{{ ! 4496: * ! 4497: {SCREA{DAC{B$SCL{{{REAL ! 4498: {{DAC{4{{{ ! 4499: {{DTC{/REAL/{{{ ! 4500: * ! 4501: {SCSTR{DAC{B$SCL{{{STRING ! 4502: {{DAC{6{{{ ! 4503: {{DTC{/STRING/{{{ ! 4504: * ! 4505: {SCTAB{DAC{B$SCL{{{TABLE ! 4506: {{DAC{5{{{ ! 4507: {{DTC{/TABLE/{{{ ! 4508: {{EJC{{{{ ! 4509: * ! 4510: * STRING CONSTANTS (SCBLK FORMAT) FOR KVRTN (SEE RETRN) ! 4511: * ! 4512: {SCFRT{DAC{B$SCL{{{FRETURN ! 4513: {{DAC{7{{{ ! 4514: {{DTC{/FRETURN/{{{ ! 4515: * ! 4516: {SCNRT{DAC{B$SCL{{{NRETURN ! 4517: {{DAC{7{{{ ! 4518: {{DTC{/NRETURN/{{{ ! 4519: * ! 4520: {SCRTN{DAC{B$SCL{{{RETURN ! 4521: {{DAC{6{{{ ! 4522: {{DTC{/RETURN/{{{ ! 4523: * ! 4524: * DATATYPE NAME TABLE FOR DTYPE PROCEDURE. THE ORDER OF ! 4525: * THESE ENTRIES IS TIED TO THE B$XXX DEFINITIONS FOR BLOCKS ! 4526: * ! 4527: {SCNMT{DAC{SCARR{{{ARBLK ARRAY ! 4528: {{DAC{SCBUF{{{BFBLK BUFFER ! 4529: {{DAC{SCCOD{{{CDBLK CODE ! 4530: {{DAC{SCEXP{{{EXBLK EXPRESSION ! 4531: {{DAC{SCINT{{{ICBLK INTEGER ! 4532: {{DAC{SCNAM{{{NMBLK NAME ! 4533: {{DAC{SCPAT{{{P0BLK PATTERN ! 4534: {{DAC{SCPAT{{{P1BLK PATTERN ! 4535: {{DAC{SCPAT{{{P2BLK PATTERN ! 4536: {{DAC{SCREA{{{RCBLK REAL ! 4537: {{DAC{SCSTR{{{SCBLK STRING ! 4538: {{DAC{SCEXP{{{SEBLK EXPRESSION ! 4539: {{DAC{SCTAB{{{TBBLK TABLE ! 4540: {{DAC{SCARR{{{VCBLK ARRAY ! 4541: {{DAC{SCEXT{{{XNBLK EXTERNAL ! 4542: {{DAC{SCEXT{{{XRBLK EXTERNAL ! 4543: * ! 4544: * STRING CONSTANT FOR REAL ZERO ! 4545: * ! 4546: {SCRE0{DAC{B$SCL{{{ ! 4547: {{DAC{2{{{ ! 4548: {{DTC{/0./{{{ ! 4549: {{EJC{{{{ ! 4550: * ! 4551: * USED TO RE-INITIALISE KVSTL ! 4552: * ! 4553: {STLIM{DIC{+50000{{{DEFAULT STATEMENT LIMIT ! 4554: * ! 4555: * DUMMY FUNCTION BLOCK USED FOR UNDEFINED FUNCTIONS ! 4556: * ! 4557: {STNDF{DAC{O$FUN{{{PTR TO UNDEFINED FUNCTION ERR CALL ! 4558: {{DAC{0{{{DUMMY FARGS COUNT FOR CALL CIRCUIT ! 4559: * ! 4560: * DUMMY CODE BLOCK USED FOR UNDEFINED LABELS ! 4561: * ! 4562: {STNDL{DAC{L$UND{{{CODE PTR POINTS TO UNDEFINED LBL ! 4563: * ! 4564: * DUMMY OPERATOR BLOCK USED FOR UNDEFINED OPERATORS ! 4565: * ! 4566: {STNDO{DAC{O$OUN{{{PTR TO UNDEFINED OPERATOR ERR CALL ! 4567: {{DAC{0{{{DUMMY FARGS COUNT FOR CALL CIRCUIT ! 4568: * ! 4569: * STANDARD VARIABLE BLOCK. THIS BLOCK IS USED TO INITIALIZE ! 4570: * THE FIRST SEVEN FIELDS OF A NEWLY CONSTRUCTED VRBLK. ! 4571: * ITS FORMAT IS TIED TO THE VRBLK DEFINITIONS (SEE GTNVR). ! 4572: * ! 4573: {STNVR{DAC{B$VRL{{{VRGET ! 4574: {{DAC{B$VRS{{{VRSTO ! 4575: {{DAC{NULLS{{{VRVAL ! 4576: {{DAC{B$VRG{{{VRTRA ! 4577: {{DAC{STNDL{{{VRLBL ! 4578: {{DAC{STNDF{{{VRFNC ! 4579: {{DAC{0{{{VRNXT ! 4580: {{EJC{{{{ ! 4581: * ! 4582: * MESSAGES USED IN END OF RUN PROCESSING (STOPR) ! 4583: * ! 4584: {STPM1{DAC{B$SCL{{{IN STATEMENT ! 4585: {{DAC{12{{{ ! 4586: {{DTC{/IN STATEMENT/{{{ ! 4587: * ! 4588: {STPM2{DAC{B$SCL{{{ ! 4589: {{DAC{14{{{ ! 4590: {{DTC{/STMTS EXECUTED/{{{ ! 4591: * ! 4592: {STPM3{DAC{B$SCL{{{ ! 4593: {{DAC{13{{{ ! 4594: {{DTC{/RUN TIME-MSEC/{{{ ! 4595: * ! 4596: {STPM4{DAC{B$SCL{{{ ! 4597: {{DAC{12{{{ ! 4598: {{DTC{$MCSEC / STMT${{{ ! 4599: * ! 4600: {STPM5{DAC{B$SCL{{{ ! 4601: {{DAC{13{{{ ! 4602: {{DTC{/REGENERATIONS/{{{ ! 4603: * ! 4604: * CHARS FOR /TU/ ENDING CODE ! 4605: * ! 4606: {STRTU{DTC{/TU/{{{ ! 4607: * ! 4608: * TABLE USED BY CONVERT FUNCTION TO CHECK DATATYPE NAME ! 4609: * THE ENTRIES ARE ORDERED TO CORRESPOND TO BRANCH TABLE ! 4610: * IN S$CNV ! 4611: * ! 4612: {SVCTB{DAC{SCSTR{{{STRING ! 4613: {{DAC{SCINT{{{INTEGER ! 4614: {{DAC{SCNAM{{{NAME ! 4615: {{DAC{SCPAT{{{PATTERN ! 4616: {{DAC{SCARR{{{ARRAY ! 4617: {{DAC{SCTAB{{{TABLE ! 4618: {{DAC{SCEXP{{{EXPRESSION ! 4619: {{DAC{SCCOD{{{CODE ! 4620: {{DAC{SCNUM{{{NUMERIC ! 4621: {{DAC{SCREA{{{REAL ! 4622: {{DAC{SCBUF{{{BUFFER ! 4623: {{DAC{0{{{ZERO MARKS END OF LIST ! 4624: {{EJC{{{{ ! 4625: * ! 4626: * MESSAGES (SCBLK FORMAT) USED BY TRACE PROCEDURES ! 4627: * ! 4628: * ! 4629: {TMASB{DAC{B$SCL{{{ASTERISKS FOR TRACE STATEMENT NO ! 4630: {{DAC{13{{{ ! 4631: {{DTC{/************ /{{{ ! 4632: * ! 4633: {TMBEB{DAC{B$SCL{{{BLANK-EQUAL-BLANK ! 4634: {{DAC{3{{{ ! 4635: {{DTC{/ = /{{{ ! 4636: * ! 4637: * DUMMY TRBLK FOR EXPRESSION VARIABLE ! 4638: * ! 4639: {TRBEV{DAC{B$TRT{{{DUMMY TRBLK ! 4640: * ! 4641: * DUMMY TRBLK FOR KEYWORD VARIABLE ! 4642: * ! 4643: {TRBKV{DAC{B$TRT{{{DUMMY TRBLK ! 4644: * ! 4645: * DUMMY CODE BLOCK TO RETURN CONTROL TO TRXEQ PROCEDURE ! 4646: * ! 4647: {TRXDR{DAC{O$TXR{{{BLOCK POINTS TO RETURN ROUTINE ! 4648: {TRXDC{DAC{TRXDR{{{POINTER TO BLOCK ! 4649: {{EJC{{{{ ! 4650: * ! 4651: * STANDARD VARIABLE BLOCKS ! 4652: * ! 4653: * SEE SVBLK FORMAT FOR FULL DETAILS OF THE FORMAT. THE ! 4654: * VRBLKS ARE ORDERED BY LENGTH AND WITHIN EACH LENGTH THE ! 4655: * ORDER IS ALPHABETICAL BY NAME OF THE VARIABLE. ! 4656: * ! 4657: {V$EQF{DBC{SVFPR{{{EQ ! 4658: {{DAC{2{{{ ! 4659: {{DTC{/EQ/{{{ ! 4660: {{DAC{S$EQF{{{ ! 4661: {{DAC{2{{{ ! 4662: * ! 4663: {V$GEF{DBC{SVFPR{{{GE ! 4664: {{DAC{2{{{ ! 4665: {{DTC{/GE/{{{ ! 4666: {{DAC{S$GEF{{{ ! 4667: {{DAC{2{{{ ! 4668: * ! 4669: {V$GTF{DBC{SVFPR{{{GT ! 4670: {{DAC{2{{{ ! 4671: {{DTC{/GT/{{{ ! 4672: {{DAC{S$GTF{{{ ! 4673: {{DAC{2{{{ ! 4674: * ! 4675: {V$LEF{DBC{SVFPR{{{LE ! 4676: {{DAC{2{{{ ! 4677: {{DTC{/LE/{{{ ! 4678: {{DAC{S$LEF{{{ ! 4679: {{DAC{2{{{ ! 4680: * ! 4681: {V$LTF{DBC{SVFPR{{{LT ! 4682: {{DAC{2{{{ ! 4683: {{DTC{/LT/{{{ ! 4684: {{DAC{S$LTF{{{ ! 4685: {{DAC{2{{{ ! 4686: * ! 4687: {V$NEF{DBC{SVFPR{{{NE ! 4688: {{DAC{2{{{ ! 4689: {{DTC{/NE/{{{ ! 4690: {{DAC{S$NEF{{{ ! 4691: {{DAC{2{{{ ! 4692: * ! 4693: {V$ANY{DBC{SVFNP{{{ANY ! 4694: {{DAC{3{{{ ! 4695: {{DTC{/ANY/{{{ ! 4696: {{DAC{S$ANY{{{ ! 4697: {{DAC{1{{{ ! 4698: * ! 4699: {V$ARB{DBC{SVKVC{{{ARB ! 4700: {{DAC{3{{{ ! 4701: {{DTC{/ARB/{{{ ! 4702: {{DAC{K$ARB{{{ ! 4703: {{DAC{NDARB{{{ ! 4704: {{EJC{{{{ ! 4705: * ! 4706: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 4707: * ! 4708: {V$ARG{DBC{SVFNN{{{ARG ! 4709: {{DAC{3{{{ ! 4710: {{DTC{/ARG/{{{ ! 4711: {{DAC{S$ARG{{{ ! 4712: {{DAC{2{{{ ! 4713: * ! 4714: {V$BAL{DBC{SVKVC{{{BAL ! 4715: {{DAC{3{{{ ! 4716: {{DTC{/BAL/{{{ ! 4717: {{DAC{K$BAL{{{ ! 4718: {{DAC{NDBAL{{{ ! 4719: * ! 4720: {V$END{DBC{SVLBL{{{END ! 4721: {{DAC{3{{{ ! 4722: {{DTC{/END/{{{ ! 4723: {{DAC{L$END{{{ ! 4724: * ! 4725: {V$LEN{DBC{SVFNP{{{LEN ! 4726: {{DAC{3{{{ ! 4727: {{DTC{/LEN/{{{ ! 4728: {{DAC{S$LEN{{{ ! 4729: {{DAC{1{{{ ! 4730: * ! 4731: {V$LEQ{DBC{SVFPR{{{LEQ ! 4732: {{DAC{3{{{ ! 4733: {{DTC{/LEQ/{{{ ! 4734: {{DAC{S$LEQ{{{ ! 4735: {{DAC{2{{{ ! 4736: * ! 4737: {V$LGE{DBC{SVFPR{{{LGE ! 4738: {{DAC{3{{{ ! 4739: {{DTC{/LGE/{{{ ! 4740: {{DAC{S$LGE{{{ ! 4741: {{DAC{2{{{ ! 4742: * ! 4743: {V$LGT{DBC{SVFPR{{{LGT ! 4744: {{DAC{3{{{ ! 4745: {{DTC{/LGT/{{{ ! 4746: {{DAC{S$LGT{{{ ! 4747: {{DAC{2{{{ ! 4748: * ! 4749: {V$LLE{DBC{SVFPR{{{LLE ! 4750: {{DAC{3{{{ ! 4751: {{DTC{/LLE/{{{ ! 4752: {{DAC{S$LLE{{{ ! 4753: {{DAC{2{{{ ! 4754: {{EJC{{{{ ! 4755: * ! 4756: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 4757: * ! 4758: {V$LLT{DBC{SVFPR{{{LLT ! 4759: {{DAC{3{{{ ! 4760: {{DTC{/LLT/{{{ ! 4761: {{DAC{S$LLT{{{ ! 4762: {{DAC{2{{{ ! 4763: * ! 4764: {V$LNE{DBC{SVFPR{{{LNE ! 4765: {{DAC{3{{{ ! 4766: {{DTC{/LNE/{{{ ! 4767: {{DAC{S$LNE{{{ ! 4768: {{DAC{2{{{ ! 4769: * ! 4770: {V$POS{DBC{SVFNP{{{POS ! 4771: {{DAC{3{{{ ! 4772: {{DTC{/POS/{{{ ! 4773: {{DAC{S$POS{{{ ! 4774: {{DAC{1{{{ ! 4775: * ! 4776: {V$REM{DBC{SVKVC{{{REM ! 4777: {{DAC{3{{{ ! 4778: {{DTC{/REM/{{{ ! 4779: {{DAC{K$REM{{{ ! 4780: {{DAC{NDREM{{{ ! 4781: * ! 4782: {V$SET{DBC{SVFNN{{{SET ! 4783: {{DAC{3{{{ ! 4784: {{DTC{/SET/{{{ ! 4785: {{DAC{S$SET{{{ ! 4786: {{DAC{3{{{ ! 4787: * ! 4788: {V$TAB{DBC{SVFNP{{{TAB ! 4789: {{DAC{3{{{ ! 4790: {{DTC{/TAB/{{{ ! 4791: {{DAC{S$TAB{{{ ! 4792: {{DAC{1{{{ ! 4793: * ! 4794: {V$CAS{DBC{SVKNM{{{CASE ! 4795: {{DAC{4{{{ ! 4796: {{DTC{/CASE/{{{ ! 4797: {{DAC{K$CAS{{{ ! 4798: * ! 4799: {V$CHR{DBC{SVFNP{{{CHAR ! 4800: {{DAC{4{{{ ! 4801: {{DTC{/CHAR/{{{ ! 4802: {{DAC{S$CHR{{{ ! 4803: {{DAC{1{{{ ! 4804: * ! 4805: {V$COD{DBC{SVFNK{{{CODE ! 4806: {{DAC{4{{{ ! 4807: {{DTC{/CODE/{{{ ! 4808: {{DAC{K$COD{{{ ! 4809: {{DAC{S$COD{{{ ! 4810: {{DAC{1{{{ ! 4811: * ! 4812: {V$COP{DBC{SVFNN{{{COPY ! 4813: {{DAC{4{{{ ! 4814: {{DTC{/COPY/{{{ ! 4815: {{DAC{S$COP{{{ ! 4816: {{DAC{1{{{ ! 4817: {{EJC{{{{ ! 4818: * ! 4819: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 4820: * ! 4821: {V$DAT{DBC{SVFNN{{{DATA ! 4822: {{DAC{4{{{ ! 4823: {{DTC{/DATA/{{{ ! 4824: {{DAC{S$DAT{{{ ! 4825: {{DAC{1{{{ ! 4826: * ! 4827: {V$DTE{DBC{SVFNN{{{DATE ! 4828: {{DAC{4{{{ ! 4829: {{DTC{/DATE/{{{ ! 4830: {{DAC{S$DTE{{{ ! 4831: {{DAC{0{{{ ! 4832: * ! 4833: {V$DMP{DBC{SVFNK{{{DUMP ! 4834: {{DAC{4{{{ ! 4835: {{DTC{/DUMP/{{{ ! 4836: {{DAC{K$DMP{{{ ! 4837: {{DAC{S$DMP{{{ ! 4838: {{DAC{1{{{ ! 4839: * ! 4840: {V$DUP{DBC{SVFNN{{{DUPL ! 4841: {{DAC{4{{{ ! 4842: {{DTC{/DUPL/{{{ ! 4843: {{DAC{S$DUP{{{ ! 4844: {{DAC{2{{{ ! 4845: * ! 4846: {V$EVL{DBC{SVFNN{{{EVAL ! 4847: {{DAC{4{{{ ! 4848: {{DTC{/EVAL/{{{ ! 4849: {{DAC{S$EVL{{{ ! 4850: {{DAC{1{{{ ! 4851: * ! 4852: {V$EXT{DBC{SVFNN{{{EXIT ! 4853: {{DAC{4{{{ ! 4854: {{DTC{/EXIT/{{{ ! 4855: {{DAC{S$EXT{{{ ! 4856: {{DAC{1{{{ ! 4857: * ! 4858: {V$FAL{DBC{SVKVC{{{FAIL ! 4859: {{DAC{4{{{ ! 4860: {{DTC{/FAIL/{{{ ! 4861: {{DAC{K$FAL{{{ ! 4862: {{DAC{NDFAL{{{ ! 4863: * ! 4864: {V$HST{DBC{SVFNN{{{HOST ! 4865: {{DAC{4{{{ ! 4866: {{DTC{/HOST/{{{ ! 4867: {{DAC{S$HST{{{ ! 4868: {{DAC{3{{{ ! 4869: {{EJC{{{{ ! 4870: * ! 4871: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 4872: * ! 4873: {V$ITM{DBC{SVFNF{{{ITEM ! 4874: {{DAC{4{{{ ! 4875: {{DTC{/ITEM/{{{ ! 4876: {{DAC{S$ITM{{{ ! 4877: {{DAC{999{{{ ! 4878: * ! 4879: {V$LOD{DBC{SVFNN{{{LOAD ! 4880: {{DAC{4{{{ ! 4881: {{DTC{/LOAD/{{{ ! 4882: {{DAC{S$LOD{{{ ! 4883: {{DAC{2{{{ ! 4884: * ! 4885: {V$LPD{DBC{SVFNP{{{LPAD ! 4886: {{DAC{4{{{ ! 4887: {{DTC{/LPAD/{{{ ! 4888: {{DAC{S$LPD{{{ ! 4889: {{DAC{3{{{ ! 4890: * ! 4891: {V$RPD{DBC{SVFNP{{{RPAD ! 4892: {{DAC{4{{{ ! 4893: {{DTC{/RPAD/{{{ ! 4894: {{DAC{S$RPD{{{ ! 4895: {{DAC{3{{{ ! 4896: * ! 4897: {V$RPS{DBC{SVFNP{{{RPOS ! 4898: {{DAC{4{{{ ! 4899: {{DTC{/RPOS/{{{ ! 4900: {{DAC{S$RPS{{{ ! 4901: {{DAC{1{{{ ! 4902: * ! 4903: {V$RTB{DBC{SVFNP{{{RTAB ! 4904: {{DAC{4{{{ ! 4905: {{DTC{/RTAB/{{{ ! 4906: {{DAC{S$RTB{{{ ! 4907: {{DAC{1{{{ ! 4908: * ! 4909: {V$SI${DBC{SVFNP{{{SIZE ! 4910: {{DAC{4{{{ ! 4911: {{DTC{/SIZE/{{{ ! 4912: {{DAC{S$SI${{{ ! 4913: {{DAC{1{{{ ! 4914: * ! 4915: * ! 4916: {V$SRT{DBC{SVFNN{{{SORT ! 4917: {{DAC{4{{{ ! 4918: {{DTC{/SORT/{{{ ! 4919: {{DAC{S$SRT{{{ ! 4920: {{DAC{2{{{ ! 4921: {V$SPN{DBC{SVFNP{{{SPAN ! 4922: {{DAC{4{{{ ! 4923: {{DTC{/SPAN/{{{ ! 4924: {{DAC{S$SPN{{{ ! 4925: {{DAC{1{{{ ! 4926: {{EJC{{{{ ! 4927: * ! 4928: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 4929: * ! 4930: {V$STN{DBC{SVKNM{{{STNO ! 4931: {{DAC{4{{{ ! 4932: {{DTC{/STNO/{{{ ! 4933: {{DAC{K$STN{{{ ! 4934: * ! 4935: {V$TIM{DBC{SVFNN{{{TIME ! 4936: {{DAC{4{{{ ! 4937: {{DTC{/TIME/{{{ ! 4938: {{DAC{S$TIM{{{ ! 4939: {{DAC{0{{{ ! 4940: * ! 4941: {V$TRM{DBC{SVFNK{{{TRIM ! 4942: {{DAC{4{{{ ! 4943: {{DTC{/TRIM/{{{ ! 4944: {{DAC{K$TRM{{{ ! 4945: {{DAC{S$TRM{{{ ! 4946: {{DAC{1{{{ ! 4947: * ! 4948: {V$ABE{DBC{SVKNM{{{ABEND ! 4949: {{DAC{5{{{ ! 4950: {{DTC{/ABEND/{{{ ! 4951: {{DAC{K$ABE{{{ ! 4952: * ! 4953: {V$ABO{DBC{SVKVL{{{ABORT ! 4954: {{DAC{5{{{ ! 4955: {{DTC{/ABORT/{{{ ! 4956: {{DAC{K$ABO{{{ ! 4957: {{DAC{L$ABO{{{ ! 4958: {{DAC{NDABO{{{ ! 4959: * ! 4960: {V$APP{DBC{SVFNF{{{APPLY ! 4961: {{DAC{5{{{ ! 4962: {{DTC{/APPLY/{{{ ! 4963: {{DAC{S$APP{{{ ! 4964: {{DAC{999{{{ ! 4965: * ! 4966: {V$ABN{DBC{SVFNP{{{ARBNO ! 4967: {{DAC{5{{{ ! 4968: {{DTC{/ARBNO/{{{ ! 4969: {{DAC{S$ABN{{{ ! 4970: {{DAC{1{{{ ! 4971: * ! 4972: {V$ARR{DBC{SVFNN{{{ARRAY ! 4973: {{DAC{5{{{ ! 4974: {{DTC{/ARRAY/{{{ ! 4975: {{DAC{S$ARR{{{ ! 4976: {{DAC{2{{{ ! 4977: {{EJC{{{{ ! 4978: * ! 4979: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 4980: * ! 4981: {V$BRK{DBC{SVFNP{{{BREAK ! 4982: {{DAC{5{{{ ! 4983: {{DTC{/BREAK/{{{ ! 4984: {{DAC{S$BRK{{{ ! 4985: {{DAC{1{{{ ! 4986: * ! 4987: {V$CLR{DBC{SVFNN{{{CLEAR ! 4988: {{DAC{5{{{ ! 4989: {{DTC{/CLEAR/{{{ ! 4990: {{DAC{S$CLR{{{ ! 4991: {{DAC{1{{{ ! 4992: * ! 4993: {V$EJC{DBC{SVFNN{{{EJECT ! 4994: {{DAC{5{{{ ! 4995: {{DTC{/EJECT/{{{ ! 4996: {{DAC{S$EJC{{{ ! 4997: {{DAC{1{{{ ! 4998: * ! 4999: {V$FEN{DBC{SVFPK{{{FENCE ! 5000: {{DAC{5{{{ ! 5001: {{DTC{/FENCE/{{{ ! 5002: {{DAC{K$FEN{{{ ! 5003: {{DAC{S$FNC{{{ ! 5004: {{DAC{1{{{ ! 5005: {{DAC{NDFEN{{{ ! 5006: * ! 5007: {V$FLD{DBC{SVFNN{{{FIELD ! 5008: {{DAC{5{{{ ! 5009: {{DTC{/FIELD/{{{ ! 5010: {{DAC{S$FLD{{{ ! 5011: {{DAC{2{{{ ! 5012: * ! 5013: {V$IDN{DBC{SVFPR{{{IDENT ! 5014: {{DAC{5{{{ ! 5015: {{DTC{/IDENT/{{{ ! 5016: {{DAC{S$IDN{{{ ! 5017: {{DAC{2{{{ ! 5018: * ! 5019: {V$INP{DBC{SVFNK{{{INPUT ! 5020: {{DAC{5{{{ ! 5021: {{DTC{/INPUT/{{{ ! 5022: {{DAC{K$INP{{{ ! 5023: {{DAC{S$INP{{{ ! 5024: {{DAC{3{{{ ! 5025: * ! 5026: {V$LOC{DBC{SVFNN{{{LOCAL ! 5027: {{DAC{5{{{ ! 5028: {{DTC{/LOCAL/{{{ ! 5029: {{DAC{S$LOC{{{ ! 5030: {{DAC{2{{{ ! 5031: {{EJC{{{{ ! 5032: * ! 5033: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5034: * ! 5035: {V$OPS{DBC{SVFNN{{{OPSYN ! 5036: {{DAC{5{{{ ! 5037: {{DTC{/OPSYN/{{{ ! 5038: {{DAC{S$OPS{{{ ! 5039: {{DAC{3{{{ ! 5040: * ! 5041: {V$RMD{DBC{SVFNP{{{REMDR ! 5042: {{DAC{5{{{ ! 5043: {{DTC{/REMDR/{{{ ! 5044: {{DAC{S$RMD{{{ ! 5045: {{DAC{2{{{ ! 5046: * ! 5047: {V$RSR{DBC{SVFNN{{{RSORT ! 5048: {{DAC{5{{{ ! 5049: {{DTC{/RSORT/{{{ ! 5050: {{DAC{S$RSR{{{ ! 5051: {{DAC{2{{{ ! 5052: * ! 5053: {V$TBL{DBC{SVFNN{{{TABLE ! 5054: {{DAC{5{{{ ! 5055: {{DTC{/TABLE/{{{ ! 5056: {{DAC{S$TBL{{{ ! 5057: {{DAC{3{{{ ! 5058: * ! 5059: {V$TRA{DBC{SVFNK{{{TRACE ! 5060: {{DAC{5{{{ ! 5061: {{DTC{/TRACE/{{{ ! 5062: {{DAC{K$TRA{{{ ! 5063: {{DAC{S$TRA{{{ ! 5064: {{DAC{4{{{ ! 5065: * ! 5066: {V$ANC{DBC{SVKNM{{{ANCHOR ! 5067: {{DAC{6{{{ ! 5068: {{DTC{/ANCHOR/{{{ ! 5069: {{DAC{K$ANC{{{ ! 5070: * ! 5071: {V$APN{DBC{SVFNN{{{ ! 5072: {{DAC{6{{{ ! 5073: {{DTC{/APPEND/{{{ ! 5074: {{DAC{S$APN{{{ ! 5075: {{DAC{2{{{ ! 5076: * ! 5077: {V$BKX{DBC{SVFNP{{{BREAKX ! 5078: {{DAC{6{{{ ! 5079: {{DTC{/BREAKX/{{{ ! 5080: {{DAC{S$BKX{{{ ! 5081: {{DAC{1{{{ ! 5082: * ! 5083: {V$BUF{DBC{SVFNN{{{BUFFER ! 5084: {{DAC{6{{{ ! 5085: {{DTC{/BUFFER/{{{ ! 5086: {{DAC{S$BUF{{{ ! 5087: {{DAC{2{{{ ! 5088: * ! 5089: {V$DEF{DBC{SVFNN{{{DEFINE ! 5090: {{DAC{6{{{ ! 5091: {{DTC{/DEFINE/{{{ ! 5092: {{DAC{S$DEF{{{ ! 5093: {{DAC{2{{{ ! 5094: * ! 5095: {V$DET{DBC{SVFNN{{{DETACH ! 5096: {{DAC{6{{{ ! 5097: {{DTC{/DETACH/{{{ ! 5098: {{DAC{S$DET{{{ ! 5099: {{DAC{1{{{ ! 5100: {{EJC{{{{ ! 5101: * ! 5102: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5103: * ! 5104: {V$DIF{DBC{SVFPR{{{DIFFER ! 5105: {{DAC{6{{{ ! 5106: {{DTC{/DIFFER/{{{ ! 5107: {{DAC{S$DIF{{{ ! 5108: {{DAC{2{{{ ! 5109: * ! 5110: {V$FTR{DBC{SVKNM{{{FTRACE ! 5111: {{DAC{6{{{ ! 5112: {{DTC{/FTRACE/{{{ ! 5113: {{DAC{K$FTR{{{ ! 5114: * ! 5115: {V$INS{DBC{SVFNN{{{INSERT ! 5116: {{DAC{6{{{ ! 5117: {{DTC{/INSERT/{{{ ! 5118: {{DAC{S$INS{{{ ! 5119: {{DAC{4{{{ ! 5120: * ! 5121: {V$LST{DBC{SVKNM{{{LASTNO ! 5122: {{DAC{6{{{ ! 5123: {{DTC{/LASTNO/{{{ ! 5124: {{DAC{K$LST{{{ ! 5125: * ! 5126: {V$NAY{DBC{SVFNP{{{NOTANY ! 5127: {{DAC{6{{{ ! 5128: {{DTC{/NOTANY/{{{ ! 5129: {{DAC{S$NAY{{{ ! 5130: {{DAC{1{{{ ! 5131: * ! 5132: {V$OUP{DBC{SVFNK{{{OUTPUT ! 5133: {{DAC{6{{{ ! 5134: {{DTC{/OUTPUT/{{{ ! 5135: {{DAC{K$OUP{{{ ! 5136: {{DAC{S$OUP{{{ ! 5137: {{DAC{3{{{ ! 5138: * ! 5139: {V$RET{DBC{SVLBL{{{RETURN ! 5140: {{DAC{6{{{ ! 5141: {{DTC{/RETURN/{{{ ! 5142: {{DAC{L$RTN{{{ ! 5143: * ! 5144: {V$REW{DBC{SVFNN{{{REWIND ! 5145: {{DAC{6{{{ ! 5146: {{DTC{/REWIND/{{{ ! 5147: {{DAC{S$REW{{{ ! 5148: {{DAC{1{{{ ! 5149: * ! 5150: {V$STT{DBC{SVFNN{{{STOPTR ! 5151: {{DAC{6{{{ ! 5152: {{DTC{/STOPTR/{{{ ! 5153: {{DAC{S$STT{{{ ! 5154: {{DAC{2{{{ ! 5155: {{EJC{{{{ ! 5156: * ! 5157: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5158: * ! 5159: {V$SUB{DBC{SVFNN{{{SUBSTR ! 5160: {{DAC{6{{{ ! 5161: {{DTC{/SUBSTR/{{{ ! 5162: {{DAC{S$SUB{{{ ! 5163: {{DAC{3{{{ ! 5164: * ! 5165: {V$UNL{DBC{SVFNN{{{UNLOAD ! 5166: {{DAC{6{{{ ! 5167: {{DTC{/UNLOAD/{{{ ! 5168: {{DAC{S$UNL{{{ ! 5169: {{DAC{1{{{ ! 5170: * ! 5171: {V$COL{DBC{SVFNN{{{COLLECT ! 5172: {{DAC{7{{{ ! 5173: {{DTC{/COLLECT/{{{ ! 5174: {{DAC{S$COL{{{ ! 5175: {{DAC{1{{{ ! 5176: * ! 5177: {V$CNV{DBC{SVFNN{{{CONVERT ! 5178: {{DAC{7{{{ ! 5179: {{DTC{/CONVERT/{{{ ! 5180: {{DAC{S$CNV{{{ ! 5181: {{DAC{2{{{ ! 5182: * ! 5183: {V$ENF{DBC{SVFNN{{{ENDFILE ! 5184: {{DAC{7{{{ ! 5185: {{DTC{/ENDFILE/{{{ ! 5186: {{DAC{S$ENF{{{ ! 5187: {{DAC{1{{{ ! 5188: * ! 5189: {V$ETX{DBC{SVKNM{{{ERRTEXT ! 5190: {{DAC{7{{{ ! 5191: {{DTC{/ERRTEXT/{{{ ! 5192: {{DAC{K$ETX{{{ ! 5193: * ! 5194: {V$ERT{DBC{SVKNM{{{ERRTYPE ! 5195: {{DAC{7{{{ ! 5196: {{DTC{/ERRTYPE/{{{ ! 5197: {{DAC{K$ERT{{{ ! 5198: * ! 5199: {V$FRT{DBC{SVLBL{{{FRETURN ! 5200: {{DAC{7{{{ ! 5201: {{DTC{/FRETURN/{{{ ! 5202: {{DAC{L$FRT{{{ ! 5203: * ! 5204: {V$INT{DBC{SVFPR{{{INTEGER ! 5205: {{DAC{7{{{ ! 5206: {{DTC{/INTEGER/{{{ ! 5207: {{DAC{S$INT{{{ ! 5208: {{DAC{1{{{ ! 5209: * ! 5210: {V$NRT{DBC{SVLBL{{{NRETURN ! 5211: {{DAC{7{{{ ! 5212: {{DTC{/NRETURN/{{{ ! 5213: {{DAC{L$NRT{{{ ! 5214: {{EJC{{{{ ! 5215: * ! 5216: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5217: * ! 5218: * ! 5219: {V$PFL{DBC{SVKNM{{{PROFILE ! 5220: {{DAC{7{{{ ! 5221: {{DTC{/PROFILE/{{{ ! 5222: {{DAC{K$PFL{{{ ! 5223: * ! 5224: {V$RPL{DBC{SVFNP{{{REPLACE ! 5225: {{DAC{7{{{ ! 5226: {{DTC{/REPLACE/{{{ ! 5227: {{DAC{S$RPL{{{ ! 5228: {{DAC{3{{{ ! 5229: * ! 5230: {V$RVS{DBC{SVFNP{{{REVERSE ! 5231: {{DAC{7{{{ ! 5232: {{DTC{/REVERSE/{{{ ! 5233: {{DAC{S$RVS{{{ ! 5234: {{DAC{1{{{ ! 5235: * ! 5236: {V$RTN{DBC{SVKNM{{{RTNTYPE ! 5237: {{DAC{7{{{ ! 5238: {{DTC{/RTNTYPE/{{{ ! 5239: {{DAC{K$RTN{{{ ! 5240: * ! 5241: {V$STX{DBC{SVFNN{{{SETEXIT ! 5242: {{DAC{7{{{ ! 5243: {{DTC{/SETEXIT/{{{ ! 5244: {{DAC{S$STX{{{ ! 5245: {{DAC{1{{{ ! 5246: * ! 5247: {V$STC{DBC{SVKNM{{{STCOUNT ! 5248: {{DAC{7{{{ ! 5249: {{DTC{/STCOUNT/{{{ ! 5250: {{DAC{K$STC{{{ ! 5251: * ! 5252: {V$STL{DBC{SVKNM{{{STLIMIT ! 5253: {{DAC{7{{{ ! 5254: {{DTC{/STLIMIT/{{{ ! 5255: {{DAC{K$STL{{{ ! 5256: * ! 5257: {V$SUC{DBC{SVKVC{{{SUCCEED ! 5258: {{DAC{7{{{ ! 5259: {{DTC{/SUCCEED/{{{ ! 5260: {{DAC{K$SUC{{{ ! 5261: {{DAC{NDSUC{{{ ! 5262: * ! 5263: {V$ALP{DBC{SVKWC{{{ALPHABET ! 5264: {{DAC{8{{{ ! 5265: {{DTC{/ALPHABET/{{{ ! 5266: {{DAC{K$ALP{{{ ! 5267: * ! 5268: {V$CNT{DBC{SVLBL{{{CONTINUE ! 5269: {{DAC{8{{{ ! 5270: {{DTC{/CONTINUE/{{{ ! 5271: {{DAC{L$CNT{{{ ! 5272: {{EJC{{{{ ! 5273: * ! 5274: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5275: * ! 5276: {V$DTP{DBC{SVFNP{{{DATATYPE ! 5277: {{DAC{8{{{ ! 5278: {{DTC{/DATATYPE/{{{ ! 5279: {{DAC{S$DTP{{{ ! 5280: {{DAC{1{{{ ! 5281: * ! 5282: {V$ERL{DBC{SVKNM{{{ERRLIMIT ! 5283: {{DAC{8{{{ ! 5284: {{DTC{/ERRLIMIT/{{{ ! 5285: {{DAC{K$ERL{{{ ! 5286: * ! 5287: {V$FNC{DBC{SVKNM{{{FNCLEVEL ! 5288: {{DAC{8{{{ ! 5289: {{DTC{/FNCLEVEL/{{{ ! 5290: {{DAC{K$FNC{{{ ! 5291: * ! 5292: {V$MXL{DBC{SVKNM{{{MAXLNGTH ! 5293: {{DAC{8{{{ ! 5294: {{DTC{/MAXLNGTH/{{{ ! 5295: {{DAC{K$MXL{{{ ! 5296: * ! 5297: {V$TER{DBC{0{{{TERMINAL ! 5298: {{DAC{8{{{ ! 5299: {{DTC{/TERMINAL/{{{ ! 5300: {{DAC{0{{{ ! 5301: * ! 5302: {V$PRO{DBC{SVFNN{{{PROTOTYPE ! 5303: {{DAC{9{{{ ! 5304: {{DTC{/PROTOTYPE/{{{ ! 5305: {{DAC{S$PRO{{{ ! 5306: {{DAC{1{{{ ! 5307: * ! 5308: {{DBC{0{{{DUMMY ENTRY TO END LIST ! 5309: {{DAC{10{{{LENGTH GT 9 (PROTOTYPE) ! 5310: {{EJC{{{{ ! 5311: * ! 5312: * LIST OF SVBLK POINTERS FOR KEYWORDS TO BE DUMPED. THE ! 5313: * LIST IS IN THE ORDER WHICH APPEARS ON THE DUMP OUTPUT. ! 5314: * ! 5315: {VDMKW{DAC{V$ANC{{{ANCHOR ! 5316: {{DAC{V$CAS{{{CCASE ! 5317: {{DAC{V$COD{{{CODE ! 5318: {{DAC{V$DMP{{{DUMP ! 5319: {{DAC{V$ERL{{{ERRLIMIT ! 5320: {{DAC{V$ETX{{{ERRTEXT ! 5321: {{DAC{V$ERT{{{ERRTYPE ! 5322: {{DAC{V$FNC{{{FNCLEVEL ! 5323: {{DAC{V$FTR{{{FTRACE ! 5324: {{DAC{V$INP{{{INPUT ! 5325: {{DAC{V$LST{{{LASTNO ! 5326: {{DAC{V$MXL{{{MAXLENGTH ! 5327: {{DAC{V$OUP{{{OUTPUT ! 5328: {{DAC{V$PFL{{{PROFILE ! 5329: {{DAC{V$RTN{{{RTNTYPE ! 5330: {{DAC{V$STC{{{STCOUNT ! 5331: {{DAC{V$STL{{{STLIMIT ! 5332: {{DAC{V$STN{{{STNO ! 5333: {{DAC{V$TRA{{{TRACE ! 5334: {{DAC{V$TRM{{{TRIM ! 5335: {{DAC{0{{{END OF LIST ! 5336: * ! 5337: * TABLE USED BY GTNVR TO SEARCH SVBLK LISTS ! 5338: * ! 5339: {VSRCH{DAC{0{{{DUMMY ENTRY TO GET PROPER INDEXING ! 5340: {{DAC{V$EQF{{{START OF 1 CHAR VARIABLES (NONE) ! 5341: {{DAC{V$EQF{{{START OF 2 CHAR VARIABLES ! 5342: {{DAC{V$ANY{{{START OF 3 CHAR VARIABLES ! 5343: {{DAC{V$CAS{{{START OF 4 CHAR VARIABLES ! 5344: {{DAC{V$ABE{{{START OF 5 CHAR VARIABLES ! 5345: {{DAC{V$ANC{{{START OF 6 CHAR VARIABLES ! 5346: {{DAC{V$COL{{{START OF 7 CHAR VARIABLES ! 5347: {{DAC{V$ALP{{{START OF 8 CHAR VARIABLES ! 5348: {{DAC{V$PRO{{{START OF 9 CHAR VARIABLES ! 5349: {{TTL{S{{{P I T B O L -- WORKING STORAGE SECTION ! 5350: * ! 5351: * THE WORKING STORAGE SECTION CONTAINS AREAS WHICH ARE ! 5352: * CHANGED DURING EXECUTION OF THE PROGRAM. THE VALUE ! 5353: * ASSEMBLED IS THE INITIAL VALUE BEFORE EXECUTION STARTS. ! 5354: * ! 5355: * ALL THESE AREAS ARE FIXED LENGTH AREAS. VARIABLE LENGTH ! 5356: * DATA IS STORED IN THE STATIC OR DYNAMIC REGIONS OF THE ! 5357: * ALLOCATED DATA AREAS. ! 5358: * ! 5359: * THE VALUES IN THIS AREA ARE DESCRIBED EITHER AS WORK ! 5360: * AREAS OR AS GLOBAL VALUES. A WORK AREA IS USED IN AN ! 5361: * EPHEMERAL MANNER AND THE VALUE IS NOT SAVED FROM ONE ! 5362: * ENTRY INTO A ROUTINE TO ANOTHER. A GLOBAL VALUE IS A ! 5363: * LESS TEMPORARY LOCATION WHOSE VALUE IS SAVED FROM ONE ! 5364: * CALL TO ANOTHER. ! 5365: * ! 5366: * A GENERAL PART OF THE APPROACH IN THIS PROGRAM IS NOT ! 5367: * TO OVERLAP WORK AREAS BETWEEN PROCEDURES EVEN THOUGH A ! 5368: * SMALL AMOUNT OF SPACE COULD BE SAVED. SUCH OVERLAP IS ! 5369: * CONSIDERED A SOURCE OF PROGRAM ERRORS AND DECREASES THE ! 5370: * INFORMATION LEFT BEHIND AFTER A SYSTEM CRASH OF ANY KIND. ! 5371: * ! 5372: * THE NAMES OF THESE LOCATIONS ARE LABELS WITH FIVE LETTER ! 5373: * (A-Y,$) NAMES. AS FAR AS POSSIBLE THE ORDER IS KEPT ! 5374: * ALPHABETICAL BY THESE NAMES BUT IN SOME CASES THERE ! 5375: * ARE SLIGHT DEPARTURES CAUSED BY OTHER ORDER REQUIREMENTS. ! 5376: * ! 5377: * UNLESS OTHERWISE DOCUMENTED, THE ORDER OF WORK AREAS ! 5378: * DOES NOT AFFECT THE EXECUTION OF THE SPITBOL PROGRAM. ! 5379: * ! 5380: {{SEC{{{{START OF WORKING STORAGE SECTION ! 5381: {{EJC{{{{ ! 5382: * ! 5383: * THIS AREA IS NOT CLEARED BY INITIAL CODE ! 5384: * ! 5385: {CMLAB{DAC{B$SCL{{{STRING USED TO CHECK LABEL LEGALITY ! 5386: {{DAC{2{{{ ! 5387: {{DTC{/ /{{{ ! 5388: * ! 5389: * LABEL TO MARK START OF WORK AREA ! 5390: * ! 5391: {AAAAA{DAC{0{{{ ! 5392: * ! 5393: * WORK AREAS FOR ALLOC PROCEDURE ! 5394: * ! 5395: {ALDYN{DAC{0{{{AMOUNT OF DYNAMIC STORE ! 5396: {ALFSF{DIC{+0{{{FACTOR IN FREE STORE PCNTAGE CHECK ! 5397: {ALLIA{DIC{+0{{{DUMP IA ! 5398: {ALLSV{DAC{0{{{SAVE WB IN ALLOC ! 5399: * ! 5400: * WORK AREAS FOR ALOST PROCEDURE ! 5401: * ! 5402: {ALSTA{DAC{0{{{SAVE WA IN ALOST ! 5403: * ! 5404: * SAVE AREAS FOR ARRAY FUNCTION (S$ARR) ! 5405: * ! 5406: {ARCDM{DAC{0{{{COUNT DIMENSIONS ! 5407: {ARNEL{DIC{+0{{{COUNT ELEMENTS ! 5408: {ARPTR{DAC{0{{{OFFSET PTR INTO ARBLK ! 5409: {ARSVL{DIC{+0{{{SAVE INTEGER LOW BOUND ! 5410: {{EJC{{{{ ! 5411: * WORK AREAS FOR ARREF ROUTINE ! 5412: * ! 5413: {ARFSI{DIC{+0{{{SAVE CURRENT EVOLVING SUBSCRIPT ! 5414: {ARFXS{DAC{0{{{SAVE BASE STACK POINTER ! 5415: * ! 5416: * WORK AREAS FOR B$EFC BLOCK ROUTINE ! 5417: * ! 5418: {BEFOF{DAC{0{{{SAVE OFFSET PTR INTO EFBLK ! 5419: * ! 5420: * WORK AREAS FOR B$PFC BLOCK ROUTINE ! 5421: * ! 5422: {BPFPF{DAC{0{{{SAVE PFBLK POINTER ! 5423: {BPFSV{DAC{0{{{SAVE OLD FUNCTION VALUE ! 5424: {BPFXT{DAC{0{{{POINTER TO STACKED ARGUMENTS ! 5425: * ! 5426: * SAVE AREAS FOR COLLECT FUNCTION (S$COL) ! 5427: * ! 5428: {CLSVI{DIC{+0{{{SAVE INTEGER ARGUMENT ! 5429: * ! 5430: * GLOBAL VALUES FOR CMPIL PROCEDURE ! 5431: * ! 5432: {CMERC{DAC{0{{{COUNT OF INITIAL COMPILE ERRORS ! 5433: {CMPXS{DAC{0{{{SAVE STACK PTR IN CASE OF ERRORS ! 5434: {CMPSN{DAC{1{{{NUMBER OF NEXT STATEMENT TO COMPILE ! 5435: {CMPSS{DAC{0{{{SAVE SUBROUTINE STACK PTR ! 5436: * ! 5437: * WORK AREA FOR CNCRD ! 5438: * ! 5439: {CNSCC{DAC{0{{{POINTER TO CONTROL CARD STRING ! 5440: {CNSWC{DAC{0{{{WORD COUNT ! 5441: {CNR$T{DAC{0{{{POINTER TO R$TTL OR R$STL ! 5442: {CNTTL{DAC{0{{{FLAG FOR -TITLE, -STITL ! 5443: * ! 5444: * WORK AREAS FOR CONVERT FUNCTION (S$CNV) ! 5445: * ! 5446: {CNVTP{DAC{0{{{SAVE PTR INTO SCVTB ! 5447: * ! 5448: * FLAG FOR SUPPRESSION OF COMPILATION STATISTICS. ! 5449: * ! 5450: {CPSTS{DAC{0{{{SUPPRESS COMP. STATS IF NON ZERO ! 5451: * ! 5452: * GLOBAL VALUES FOR CONTROL CARD SWITCHES ! 5453: * ! 5454: {CSWDB{DAC{0{{{0/1 FOR -SINGLE/-DOUBLE ! 5455: {CSWER{DAC{0{{{0/1 FOR -ERRORS/-NOERRORS ! 5456: {CSWEX{DAC{0{{{0/1 FOR -EXECUTE/-NOEXECUTE ! 5457: {CSWFL{DAC{1{{{0/1 FOR -NOFAIL/-FAIL ! 5458: {CSWIN{DAC{INILN{{{XXX FOR -INXXX ! 5459: {CSWLS{DAC{1{{{0/1 FOR -NOLIST/-LIST ! 5460: {CSWNO{DAC{0{{{0/1 FOR -OPTIMISE/-NOOPT ! 5461: {CSWPR{DAC{0{{{0/1 FOR -NOPRINT/-PRINT ! 5462: * ! 5463: * GLOBAL LOCATION USED BY PATST PROCEDURE ! 5464: * ! 5465: {CTMSK{DBC{0{{{LAST BIT POSITION USED IN R$CTP ! 5466: {CURID{DAC{0{{{CURRENT ID VALUE ! 5467: {{EJC{{{{ ! 5468: * ! 5469: * GLOBAL VALUE FOR CDWRD PROCEDURE ! 5470: * ! 5471: {CWCOF{DAC{0{{{NEXT WORD OFFSET IN CURRENT CCBLK ! 5472: * ! 5473: * WORK AREAS FOR DATA FUNCTION (S$DAT) ! 5474: * ! 5475: {DATDV{DAC{0{{{SAVE VRBLK PTR FOR DATATYPE NAME ! 5476: {DATXS{DAC{0{{{SAVE INITIAL STACK POINTER ! 5477: * ! 5478: * WORK AREAS FOR DEFINE FUNCTION (S$DEF) ! 5479: * ! 5480: {DEFLB{DAC{0{{{SAVE VRBLK PTR FOR LABEL ! 5481: {DEFNA{DAC{0{{{COUNT FUNCTION ARGUMENTS ! 5482: {DEFVR{DAC{0{{{SAVE VRBLK PTR FOR FUNCTION NAME ! 5483: {DEFXS{DAC{0{{{SAVE INITIAL STACK POINTER ! 5484: * ! 5485: * WORK AREAS FOR DUMPR PROCEDURE ! 5486: * ! 5487: {DMARG{DAC{0{{{DUMP ARGUMENT ! 5488: {DMPKB{DAC{B$KVT{{{DUMMY KVBLK FOR USE IN DUMPR ! 5489: {DMPKT{DAC{TRBKV{{{KVVAR TRBLK POINTER ! 5490: {DMPKN{DAC{0{{{KEYWORD NUMBER (MUST FOLLOW DMPKB) ! 5491: {DMPSA{DAC{0{{{PRESERVE WA OVER PRTVL CALL ! 5492: {DMPSV{DAC{0{{{GENERAL SCRATCH SAVE ! 5493: {DMVCH{DAC{0{{{CHAIN POINTER FOR VARIABLE BLOCKS ! 5494: {DMPCH{DAC{0{{{SAVE SORTED VRBLK CHAIN POINTER ! 5495: * ! 5496: * GLOBAL LOCATIONS FOR DYNAMIC STORAGE POINTERS ! 5497: * ! 5498: {DNAMB{DAC{0{{{START OF DYNAMIC AREA ! 5499: {DNAMP{DAC{0{{{NEXT AVAILABLE LOC IN DYNAMIC AREA ! 5500: {DNAME{DAC{0{{{END OF AVAILABLE DYNAMIC AREA ! 5501: * ! 5502: * WORK AREA FOR DTACH ! 5503: * ! 5504: {DTCNB{DAC{0{{{NAME BASE ! 5505: {DTCNM{DAC{0{{{NAME PTR ! 5506: * ! 5507: * WORK AREAS FOR DUPL FUNCTION (S$DUP) ! 5508: * ! 5509: {DUPSI{DIC{+0{{{STORE INTEGER STRING LENGTH ! 5510: * ! 5511: * WORK AREA FOR ENDFILE (S$ENF) ! 5512: * ! 5513: {ENFCH{DAC{0{{{FOR IOCHN CHAIN HEAD ! 5514: * ! 5515: * WORK AREA FOR ERROR PROCESSING. ! 5516: * ! 5517: {ERICH{DAC{0{{{COPY ERROR REPORTS TO INT.CHAN IF 1 ! 5518: {ERLST{DAC{0{{{FOR LISTR WHEN ERRORS GO TO INT.CH. ! 5519: {ERRFT{DAC{0{{{FATAL ERROR FLAG ! 5520: {ERRSP{DAC{0{{{ERROR SUPPRESSION FLAG ! 5521: {{EJC{{{{ ! 5522: * ! 5523: * DUMP AREA FOR ERTEX ! 5524: * ! 5525: {ERTWA{DAC{0{{{SAVE WA ! 5526: {ERTWB{DAC{0{{{SAVE WB ! 5527: * ! 5528: * GLOBAL VALUES FOR EVALI ! 5529: * ! 5530: {EVLIN{DAC{P$LEN{{{DUMMY PATTERN BLOCK PCODE ! 5531: {EVLIS{DAC{0{{{POINTER TO SUBSEQUENT NODE ! 5532: {EVLIV{DAC{0{{{VALUE OF PARAMETER ! 5533: * WORK AREA FOR EXPAN ! 5534: * ! 5535: {EXPSV{DAC{0{{{SAVE OP DOPE VECTOR POINTER ! 5536: * ! 5537: * FLAG FOR SUPPRESSION OF EXECUTION STATS ! 5538: * ! 5539: {EXSTS{DAC{0{{{SUPPRESS EXEC STATS IF SET ! 5540: * ! 5541: * GLOBAL VALUES FOR EXFAL AND RETURN ! 5542: * ! 5543: {FLPRT{DAC{0{{{LOCATION OF FAIL OFFSET FOR RETURN ! 5544: {FLPTR{DAC{0{{{LOCATION OF FAILURE OFFSET ON STACK ! 5545: * ! 5546: * WORK AREAS FOR GBCOL PROCEDURE ! 5547: * ! 5548: {GBCFL{DAC{0{{{GARBAGE COLLECTOR ACTIVE FLAG ! 5549: {GBCLM{DAC{0{{{POINTER TO LAST MOVE BLOCK (PASS 3) ! 5550: {GBCNM{DAC{0{{{DUMMY FIRST MOVE BLOCK ! 5551: {GBCNS{DAC{0{{{REST OF DUMMY BLOCK (FOLLOWS GBCNM) ! 5552: {GBSVA{DAC{0{{{SAVE WA ! 5553: {GBSVB{DAC{0{{{SAVE WB ! 5554: {GBSVC{DAC{0{{{SAVE WC ! 5555: * ! 5556: * GLOBAL LOCATION TO COUNT GARBAGE COLLECTIONS (GBCOL) ! 5557: * ! 5558: {GBCNT{DAC{0{{{COUNT OF GARBAGE COLLECTIONS ! 5559: * ! 5560: * WORK AREAS FOR GTNVR PROCEDURE ! 5561: * ! 5562: {GNVHE{DAC{0{{{PTR TO END OF HASH CHAIN ! 5563: {GNVNW{DAC{0{{{NUMBER OF WORDS IN STRING NAME ! 5564: {GNVSA{DAC{0{{{SAVE WA ! 5565: {GNVSB{DAC{0{{{SAVE WB ! 5566: {GNVSP{DAC{0{{{POINTER INTO VSRCH TABLE ! 5567: {GNVST{DAC{0{{{POINTER TO CHARS OF STRING ! 5568: * ! 5569: * GLOBAL VALUE FOR GTCOD AND GTEXP ! 5570: * ! 5571: {GTCEF{DAC{0{{{SAVE FAIL PTR IN CASE OF ERROR ! 5572: * ! 5573: * WORK AREAS FOR GTINT ! 5574: * ! 5575: {GTINA{DAC{0{{{SAVE WA ! 5576: {GTINB{DAC{0{{{SAVE WB ! 5577: {{EJC{{{{ ! 5578: * ! 5579: * WORK AREAS FOR GTNUM PROCEDURE ! 5580: * ! 5581: {GTNNF{DAC{0{{{ZERO/NONZERO FOR RESULT +/- ! 5582: {GTNSI{DIC{+0{{{GENERAL INTEGER SAVE ! 5583: {GTNDF{DAC{0{{{0/1 FOR DEC POINT SO FAR NO/YES ! 5584: {GTNES{DAC{0{{{ZERO/NONZERO EXPONENT +/- ! 5585: {GTNEX{DIC{+0{{{REAL EXPONENT ! 5586: {GTNSC{DAC{0{{{SCALE (PLACES AFTER POINT) ! 5587: {GTNSR{DRC{+0.0{{{GENERAL REAL SAVE ! 5588: {GTNRD{DAC{0{{{FLAG FOR OK REAL NUMBER ! 5589: * ! 5590: * WORK AREAS FOR GTPAT PROCEDURE ! 5591: * ! 5592: {GTPSB{DAC{0{{{SAVE WB ! 5593: * ! 5594: * WORK AREAS FOR GTSTG PROCEDURE ! 5595: * ! 5596: {GTSSF{DAC{0{{{0/1 FOR RESULT +/- ! 5597: {GTSVC{DAC{0{{{SAVE WC ! 5598: {GTSVB{DAC{0{{{SAVE WB ! 5599: {GTSWK{DAC{0{{{PTR TO WORK AREA FOR GTSTG ! 5600: {GTSES{DAC{0{{{CHAR + OR - FOR EXPONENT +/- ! 5601: {GTSRS{DRC{+0.0{{{GENERAL REAL SAVE ! 5602: * ! 5603: * GLOBAL LOCATIONS (CONSTANTS) FOR GTSTG PROCEDURE ! 5604: * ! 5605: {GTSRN{DRC{+0.0{{{ROUNDING FACTOR 0.5*10**-CFP$S ! 5606: {GTSSC{DRC{+0.0{{{SCALING VALUE 10**CFP$S ! 5607: * ! 5608: * WORK AREAS FOR GTVAR PROCEDURE ! 5609: * ! 5610: {GTVRC{DAC{0{{{SAVE WC ! 5611: * ! 5612: * FLAG FOR HEADER PRINTING ! 5613: * ! 5614: {HEADP{DAC{0{{{HEADER PRINTED FLAG ! 5615: * ! 5616: * GLOBAL VALUES FOR VARIABLE HASH TABLE ! 5617: * ! 5618: {HSHNB{DIC{+0{{{NUMBER OF HASH BUCKETS ! 5619: {HSHTB{DAC{0{{{POINTER TO START OF VRBLK HASH TABL ! 5620: {HSHTE{DAC{0{{{POINTER PAST END OF VRBLK HASH TABL ! 5621: * ! 5622: * WORK AREA FOR INIT ! 5623: * ! 5624: {INISS{DAC{0{{{SAVE SUBROUTINE STACK PTR ! 5625: {INITR{DAC{0{{{SAVE TERMINAL FLAG ! 5626: * ! 5627: * SAVE AREA FOR INSBF ! 5628: * ! 5629: {INSAB{DAC{0{{{ENTRY WA + ENTRY WB ! 5630: {INSSA{DAC{0{{{SAVE ENTRY WA ! 5631: {INSSB{DAC{0{{{SAVE ENTRY WB ! 5632: {INSSC{DAC{0{{{SAVE ENTRY WC ! 5633: * ! 5634: * WORK AREAS FOR IOPUT ! 5635: * ! 5636: {IOPTT{DAC{0{{{TYPE OF ASSOCIATION ! 5637: {{EJC{{{{ ! 5638: * ! 5639: * GLOBAL VALUES FOR KEYWORD VALUES WHICH ARE STORED AS ONE ! 5640: * WORD INTEGERS. THESE VALUES MUST BE ASSEMBLED IN THE ! 5641: * FOLLOWING ORDER (AS DICTATED BY K$XXX DEFINITION VALUES). ! 5642: * ! 5643: {KVABE{DAC{0{{{ABEND ! 5644: {KVANC{DAC{0{{{ANCHOR ! 5645: {KVCAS{DAC{0{{{CASE ! 5646: {KVCOD{DAC{0{{{CODE ! 5647: {KVDMP{DAC{0{{{DUMP ! 5648: {KVERL{DAC{0{{{ERRLIMIT ! 5649: {KVERT{DAC{0{{{ERRTYPE ! 5650: {KVFTR{DAC{0{{{FTRACE ! 5651: {KVINP{DAC{1{{{INPUT ! 5652: {KVMXL{DAC{5000{{{MAXLENGTH ! 5653: {KVOUP{DAC{1{{{OUTPUT ! 5654: {KVPFL{DAC{0{{{PROFILE ! 5655: {KVTRA{DAC{0{{{TRACE ! 5656: {KVTRM{DAC{0{{{TRIM ! 5657: {KVFNC{DAC{0{{{FNCLEVEL ! 5658: {KVLST{DAC{0{{{LASTNO ! 5659: {KVSTN{DAC{0{{{STNO ! 5660: * ! 5661: * GLOBAL VALUES FOR OTHER KEYWORDS ! 5662: * ! 5663: {KVALP{DAC{0{{{ALPHABET ! 5664: {KVRTN{DAC{NULLS{{{RTNTYPE (SCBLK POINTER) ! 5665: {KVSTL{DIC{+50000{{{STLIMIT ! 5666: {KVSTC{DIC{+50000{{{STCOUNT (COUNTS DOWN FROM STLIMIT) ! 5667: * ! 5668: * WORK AREAS FOR LOAD FUNCTION ! 5669: * ! 5670: {LODFN{DAC{0{{{POINTER TO VRBLK FOR FUNC NAME ! 5671: {LODNA{DAC{0{{{COUNT NUMBER OF ARGUMENTS ! 5672: * ! 5673: * GLOBAL VALUES FOR LISTR PROCEDURE ! 5674: * ! 5675: {LSTLC{DAC{0{{{COUNT LINES ON SOURCE LIST PAGE ! 5676: {LSTNP{DAC{0{{{MAX NUMBER OF LINES ON PAGE ! 5677: {LSTPF{DAC{1{{{SET NONZERO IF CURRENT IMAGE LISTED ! 5678: {LSTPG{DAC{0{{{CURRENT SOURCE LIST PAGE NUMBER ! 5679: {LSTPO{DAC{0{{{OFFSET TO PAGE NNN MESSAGE ! 5680: {LSTSN{DAC{0{{{REMEMBER LAST STMNUM LISTED ! 5681: * ! 5682: * MAXIMUM SIZE OF SPITBOL OBJECTS ! 5683: * ! 5684: {MXLEN{DAC{0{{{INITIALISED BY SYSMX CALL ! 5685: * ! 5686: * EXECUTION CONTROL VARIABLE ! 5687: * ! 5688: {NOXEQ{DAC{0{{{SET NON-ZERO TO INHIBIT EXECUTION ! 5689: * ! 5690: * PROFILER GLOBAL VALUES AND WORK LOCATIONS ! 5691: * ! 5692: {PFDMP{DAC{0{{{SET NON-0 IF &PROFILE SET NON-0 ! 5693: {PFFNC{DAC{0{{{SET NON-0 IF FUNCT JUST ENTERED ! 5694: {PFSTM{DIC{+0{{{TO STORE STARTING TIME OF STMT ! 5695: {PFETM{DIC{+0{{{TO STORE ENDING TIME OF STMT ! 5696: {PFSVW{DAC{0{{{TO SAVE A W-REG ! 5697: {PFTBL{DAC{0{{{GETS ADRS OF (IMAG) TABLE BASE ! 5698: {PFNTE{DAC{0{{{NR OF TABLE ENTRIES ! 5699: {PFSTE{DIC{+0{{{GETS INT REP OF TABLE ENTRY SIZE ! 5700: * ! 5701: {{EJC{{{{ ! 5702: * ! 5703: * GLOBAL VALUES USED IN PATTERN MATCH ROUTINES ! 5704: * ! 5705: {PMDFL{DAC{0{{{PATTERN ASSIGNMENT FLAG ! 5706: {PMHBS{DAC{0{{{HISTORY STACK BASE POINTER ! 5707: {PMSSL{DAC{0{{{LENGTH OF SUBJECT STRING IN CHARS ! 5708: * ! 5709: * FLAGS USED FOR STANDARD FILE LISTING OPTIONS ! 5710: * ! 5711: {PRICH{DAC{0{{{PRINTER ON INTERACTIVE CHANNEL ! 5712: {PRSTD{DAC{0{{{TESTED BY PRTPG ! 5713: {PRSTO{DAC{0{{{STANDARD LISTING OPTION FLAG ! 5714: * ! 5715: * GLOBAL VALUE FOR PRTNM PROCEDURE ! 5716: * ! 5717: {PRNMV{DAC{0{{{VRBLK PTR FROM LAST NAME SEARCH ! 5718: * ! 5719: * WORK AREAS FOR PRTNM PROCEDURE ! 5720: * ! 5721: {PRNSI{DIC{+0{{{SCRATCH INTEGER LOC ! 5722: * ! 5723: * WORK AREAS FOR PRTSN PROCEDURE ! 5724: * ! 5725: {PRSNA{DAC{0{{{SAVE WA ! 5726: * ! 5727: * GLOBAL VALUES FOR PRINT PROCEDURES ! 5728: * ! 5729: {PRBUF{DAC{0{{{PTR TO PRINT BFR IN STATIC ! 5730: {PRECL{DAC{0{{{EXTENDED/COMPACT LISTING FLAG ! 5731: {PRLEN{DAC{0{{{LENGTH OF PRINT BUFFER IN CHARS ! 5732: {PRLNW{DAC{0{{{LENGTH OF PRINT BUFFER IN WORDS ! 5733: {PROFS{DAC{0{{{OFFSET TO NEXT LOCATION IN PRBUF ! 5734: {PRTEF{DAC{0{{{ENDFILE FLAG ! 5735: * ! 5736: * WORK AREAS FOR PRTST PROCEDURE ! 5737: * ! 5738: {PRSVA{DAC{0{{{SAVE WA ! 5739: {PRSVB{DAC{0{{{SAVE WB ! 5740: {PRSVC{DAC{0{{{SAVE CHAR COUNTER ! 5741: * ! 5742: * WORK AREA FOR PRTNL ! 5743: * ! 5744: {PRTSA{DAC{0{{{SAVE WA ! 5745: {PRTSB{DAC{0{{{SAVE WB ! 5746: * ! 5747: * WORK AREA FOR PRTVL ! 5748: * ! 5749: {PRVSI{DAC{0{{{SAVE IDVAL ! 5750: * ! 5751: * WORK AREAS FOR PATTERN MATCH ROUTINES ! 5752: * ! 5753: {PSAVE{DAC{0{{{TEMPORARY SAVE FOR CURRENT NODE PTR ! 5754: {PSAVC{DAC{0{{{SAVE CURSOR IN P$SPN, P$STR ! 5755: {{EJC{{{{ ! 5756: * ! 5757: * AMOUNT OF MEMORY RESERVED FOR END OF EXECUTION ! 5758: * ! 5759: {RSMEM{DAC{0{{{RESERVE MEMORY ! 5760: * ! 5761: * WORK AREAS FOR RETRN ROUTINE ! 5762: * ! 5763: {RTNBP{DAC{0{{{TO SAVE A BLOCK POINTER ! 5764: {RTNFV{DAC{0{{{NEW FUNCTION VALUE (RESULT) ! 5765: {RTNSV{DAC{0{{{OLD FUNCTION VALUE (SAVED VALUE) ! 5766: * ! 5767: * RELOCATABLE GLOBAL VALUES ! 5768: * ! 5769: * ALL THE POINTERS IN THIS SECTION CAN POINT TO BLOCKS IN ! 5770: * THE DYNAMIC STORAGE AREA AND MUST BE RELOCATED BY THE ! 5771: * GARBAGE COLLECTOR. THEY ARE IDENTIFIED BY R$XXX NAMES. ! 5772: * ! 5773: {R$AAA{DAC{0{{{START OF RELOCATABLE VALUES ! 5774: {R$ARF{DAC{0{{{ARRAY BLOCK POINTER FOR ARREF ! 5775: {R$CCB{DAC{0{{{PTR TO CCBLK BEING BUILT (CDWRD) ! 5776: {R$CIM{DAC{0{{{PTR TO CURRENT COMPILER INPUT STR ! 5777: {R$CMP{DAC{0{{{COPY OF R$CIM USED IN CMPIL ! 5778: {R$CNI{DAC{0{{{PTR TO NEXT COMPILER INPUT STRING ! 5779: {R$CNT{DAC{0{{{CDBLK POINTER FOR SETEXIT CONTINUE ! 5780: {R$COD{DAC{0{{{POINTER TO CURRENT CDBLK OR EXBLK ! 5781: {R$CTP{DAC{0{{{PTR TO CURRENT CTBLK FOR PATST ! 5782: {R$ERT{DAC{0{{{TRBLK POINTER FOR ERRTYPE TRACE ! 5783: {R$ETX{DAC{NULLS{{{POINTER TO ERRTEXT STRING ! 5784: {R$EXS{DAC{0{{{= SAVE XL IN EXPDM ! 5785: {R$FCB{DAC{0{{{FCBLK CHAIN HEAD ! 5786: {R$FNC{DAC{0{{{TRBLK POINTER FOR FNCLEVEL TRACE ! 5787: {R$GTC{DAC{0{{{KEEP CODE PTR FOR GTCOD,GTEXP ! 5788: {R$IO1{DAC{0{{{FILE ARG1 FOR IOPUT ! 5789: {R$IO2{DAC{0{{{FILE ARG2 FOR IOPUT ! 5790: {R$IOF{DAC{0{{{FCBLK PTR OR 0 ! 5791: {R$ION{DAC{0{{{NAME BASE PTR ! 5792: {R$IOP{DAC{0{{{PREDECESSOR BLOCK PTR FOR IOPUT ! 5793: {R$IOT{DAC{0{{{TRBLK PTR FOR IOPUT ! 5794: {R$PMB{DAC{0{{{BUFFER PTR IN PATTERN MATCH ! 5795: {R$PMS{DAC{0{{{SUBJECT STRING PTR IN PATTERN MATCH ! 5796: {R$RA2{DAC{0{{{REPLACE SECOND ARGUMENT LAST TIME ! 5797: {R$RA3{DAC{0{{{REPLACE THIRD ARGUMENT LAST TIME ! 5798: {R$RPT{DAC{0{{{PTR TO CTBLK REPLACE TABLE LAST USD ! 5799: {R$SCP{DAC{0{{{SAVE POINTER FROM LAST SCANE CALL ! 5800: {R$SXL{DAC{0{{{PRESERVE XL IN SORTC ! 5801: {R$SXR{DAC{0{{{PRESERVE XR IN SORTA/SORTC ! 5802: {R$STC{DAC{0{{{TRBLK POINTER FOR STCOUNT TRACE ! 5803: {R$STL{DAC{0{{{SOURCE LISTING SUB-TITLE ! 5804: {R$SXC{DAC{0{{{CODE (CDBLK) PTR FOR SETEXIT TRAP ! 5805: {R$TTL{DAC{NULLS{{{SOURCE LISTING TITLE ! 5806: {R$XSC{DAC{0{{{STRING POINTER FOR XSCAN ! 5807: {{EJC{{{{ ! 5808: * ! 5809: * THE REMAINING POINTERS IN THIS LIST ARE USED TO POINT ! 5810: * TO FUNCTION BLOCKS FOR NORMALLY UNDEFINED OPERATORS. ! 5811: * ! 5812: {R$UBA{DAC{STNDO{{{BINARY AT ! 5813: {R$UBM{DAC{STNDO{{{BINARY AMPERSAND ! 5814: {R$UBN{DAC{STNDO{{{BINARY NUMBER SIGN ! 5815: {R$UBP{DAC{STNDO{{{BINARY PERCENT ! 5816: {R$UBT{DAC{STNDO{{{BINARY NOT ! 5817: {R$UUB{DAC{STNDO{{{UNARY VERTICAL BAR ! 5818: {R$UUE{DAC{STNDO{{{UNARY EQUAL ! 5819: {R$UUN{DAC{STNDO{{{UNARY NUMBER SIGN ! 5820: {R$UUP{DAC{STNDO{{{UNARY PERCENT ! 5821: {R$UUS{DAC{STNDO{{{UNARY SLASH ! 5822: {R$UUX{DAC{STNDO{{{UNARY EXCLAMATION ! 5823: {R$YYY{DAC{0{{{LAST RELOCATABLE LOCATION ! 5824: * ! 5825: * WORK AREAS FOR SUBSTR FUNCTION (S$SUB) ! 5826: * ! 5827: {SBSSV{DAC{0{{{SAVE THIRD ARGUMENT ! 5828: * ! 5829: * GLOBAL LOCATIONS USED IN SCAN PROCEDURE ! 5830: * ! 5831: {SCNBL{DAC{0{{{SET NON-ZERO IF SCANNED PAST BLANKS ! 5832: {SCNCC{DAC{0{{{NON-ZERO TO SCAN CONTROL CARD NAME ! 5833: {SCNGO{DAC{0{{{SET NON-ZERO TO SCAN GOTO FIELD ! 5834: {SCNIL{DAC{0{{{LENGTH OF CURRENT INPUT IMAGE ! 5835: {SCNPT{DAC{0{{{POINTER TO NEXT LOCATION IN R$CIM ! 5836: {SCNRS{DAC{0{{{SET NON-ZERO TO SIGNAL RESCAN ! 5837: {SCNTP{DAC{0{{{SAVE SYNTAX TYPE FROM LAST CALL ! 5838: * ! 5839: * WORK AREAS FOR SCAN PROCEDURE ! 5840: * ! 5841: {SCNSA{DAC{0{{{SAVE WA ! 5842: {SCNSB{DAC{0{{{SAVE WB ! 5843: {SCNSC{DAC{0{{{SAVE WC ! 5844: {SCNSE{DAC{0{{{START OF CURRENT ELEMENT ! 5845: {SCNOF{DAC{0{{{SAVE OFFSET ! 5846: {{EJC{{{{ ! 5847: * ! 5848: * WORK AREA USED BY SORTA, SORTC, SORTF, SORTH ! 5849: * ! 5850: {SRTDF{DAC{0{{{DATATYPE FIELD NAME ! 5851: {SRTFD{DAC{0{{{FOUND DFBLK ADDRESS ! 5852: {SRTFF{DAC{0{{{FOUND FIELD NAME ! 5853: {SRTFO{DAC{0{{{OFFSET TO FIELD NAME ! 5854: {SRTNR{DAC{0{{{NUMBER OF ROWS ! 5855: {SRTOF{DAC{0{{{OFFSET WITHIN ROW TO SORT KEY ! 5856: {SRTRT{DAC{0{{{ROOT OFFSET ! 5857: {SRTS1{DAC{0{{{SAVE OFFSET 1 ! 5858: {SRTS2{DAC{0{{{SAVE OFFSET 2 ! 5859: {SRTSC{DAC{0{{{SAVE WC ! 5860: {SRTSF{DAC{0{{{SORT ARRAY FIRST ROW OFFSET ! 5861: {SRTSN{DAC{0{{{SAVE N ! 5862: {SRTSO{DAC{0{{{OFFSET TO A(0) ! 5863: {SRTSR{DAC{0{{{0 , NON-ZERO FOR SORT, RSORT ! 5864: {SRTST{DAC{0{{{STRIDE FROM ONE ROW TO NEXT ! 5865: {SRTWC{DAC{0{{{DUMP WC ! 5866: * ! 5867: * GLOBAL VALUE FOR INDICATING STAGE (SEE ERROR SECTION) ! 5868: * ! 5869: {STAGE{DAC{0{{{INITIAL VALUE = INITIAL COMPILE ! 5870: * ! 5871: * GLOBAL VALUES DEFINING EXTENT OF STATIC AREA (ALOST) ! 5872: * ! 5873: {STATB{DAC{0{{{START OF STATIC AREA ! 5874: {STATE{DAC{0{{{END OF STATIC AREA ! 5875: {{EJC{{{{ ! 5876: * ! 5877: * GLOBAL STACK POINTER ! 5878: * ! 5879: {STBAS{DAC{0{{{POINTER PAST STACK BASE ! 5880: * ! 5881: * WORK AREAS FOR STOPR ROUTINE ! 5882: * ! 5883: {STPSI{DIC{+0{{{SAVE VALUE OF STCOUNT ! 5884: {STPTI{DIC{+0{{{SAVE TIME ELAPSED ! 5885: * ! 5886: * GLOBAL VALUES FOR SETEXIT FUNCTION (S$STX) ! 5887: * ! 5888: {STXOF{DAC{0{{{FAILURE OFFSET ! 5889: {STXVR{DAC{NULLS{{{VRBLK POINTER OR NULL ! 5890: * ! 5891: * WORK AREAS FOR TFIND PROCEDURE ! 5892: * ! 5893: {TFNSI{DIC{+0{{{NUMBER OF HEADERS ! 5894: * ! 5895: * GLOBAL VALUE FOR TIME KEEPING ! 5896: * ! 5897: {TIMSX{DIC{+0{{{TIME AT START OF EXECUTION ! 5898: {TIMUP{DAC{0{{{SET WHEN TIME UP OCCURS ! 5899: * ! 5900: * WORK AREAS FOR XSCAN PROCEDURE ! 5901: * ! 5902: {XSCRT{DAC{0{{{SAVE RETURN CODE ! 5903: {XSCWB{DAC{0{{{SAVE REGISTER WB ! 5904: * ! 5905: * GLOBAL VALUES FOR XSCAN AND XSCNI PROCEDURES ! 5906: * ! 5907: {XSOFS{DAC{0{{{OFFSET TO CURRENT LOCATION IN R$XSC ! 5908: * ! 5909: * LABEL TO MARK END OF WORK AREA ! 5910: * ! 5911: {YYYYY{DAC{0{{{ ! 5912: {{TTL{S{{{P I T B O L -- INITIALIZATION ! 5913: * ! 5914: * INITIALISATION ! 5915: * THE FOLLOWING SECTION RECEIVES CONTROL FROM THE SYSTEM ! 5916: * AT THE START OF A RUN WITH THE REGISTERS SET AS FOLLOWS. ! 5917: * ! 5918: * (XS) POINTS PAST STACK BASE ! 5919: * (XR) POINTS TO FIRST WORD OF DATA AREA ! 5920: * (XL) POINTS TO LAST WORD OF DATA AREA ! 5921: * ! 5922: {{SEC{{{{START OF PROGRAM SECTION ! 5923: {{JSR{SYSTM{{{INITIALISE TIMER ! 5924: * ! 5925: * INITIALISE WORK AREA (ESSENTIAL FOR BATCHED RUNS) ! 5926: * ! 5927: {{MOV{R9{R7{{PRESERVE XR ! 5928: {{MOV{#YYYYY{R6{{POINT TO END OF WORK AREA ! 5929: {{SUB{#AAAAA{R6{{GET LENGTH OF WORK AREA ! 5930: {{BTW{R6{{{CONVERT TO WORDS ! 5931: {{LCT{R6{R6{{COUNT FOR LOOP ! 5932: {{MOV{#AAAAA{R9{{SET UP INDEX REGISTER ! 5933: * ! 5934: * CLEAR WORK SPACE ! 5935: * ! 5936: {INI01{ZER{(R9)+{{{CLEAR A WORD ! 5937: {{BCT{R6{INI01{{LOOP TILL DONE ! 5938: {{MOV{#STNDO{R6{{UNDEFINED OPERATORS POINTER ! 5939: {{MOV{#R$YYY{R8{{POINT TO TABLE END ! 5940: {{SUB{#R$UBA{R8{{LENGTH OF UNDEF. OPERATORS TABLE ! 5941: {{BTW{R8{{{CONVERT TO WORDS ! 5942: {{LCT{R8{R8{{LOOP COUNTER ! 5943: {{MOV{#R$UBA{R9{{SET UP XR ! 5944: * ! 5945: * SET CORRECT VALUE INTO UNDEFINED OPERATORS TABLE ! 5946: * ! 5947: {INI02{MOV{R6{(R9)+{{STORE VALUE ! 5948: {{BCT{R8{INI02{{LOOP TILL ALL DONE ! 5949: {{MOV{#NUM01{R6{{GET A 1 ! 5950: {{MOV{R6{CMPSN{{STATEMENT NO ! 5951: {{MOV{R6{CSWFL{{NOFAIL ! 5952: {{MOV{R6{CSWLS{{LIST ! 5953: {{MOV{R6{KVINP{{INPUT ! 5954: {{MOV{R6{KVOUP{{OUTPUT ! 5955: {{MOV{R6{LSTPF{{NOTHING FOR LISTR YET ! 5956: {{MOV{#INILN{R6{{INPUT IMAGE LENGTH ! 5957: {{MOV{R6{CSWIN{{-IN72 ! 5958: {{MOV{#B$KVT{DMPKB{{DUMP ! 5959: {{MOV{#TRBKV{DMPKT{{DUMP ! 5960: {{MOV{#P$LEN{EVLIN{{EVAL ! 5961: {{EJC{{{{ ! 5962: {{MOV{#NULLS{R6{{GET NULLSTRING POINTER ! 5963: {{MOV{R6{KVRTN{{RETURN ! 5964: {{MOV{R6{R$ETX{{ERRTEXT ! 5965: {{MOV{R6{R$TTL{{TITLE FOR LISTING ! 5966: {{MOV{R6{STXVR{{SETEXIT ! 5967: {{STI{TIMSX{{{STORE TIME IN CORRECT PLACE ! 5968: {{LDI{STLIM{{{GET DEFAULT STLIMIT ! 5969: {{STI{KVSTL{{{STATEMENT LIMIT ! 5970: {{STI{KVSTC{{{STATEMENT COUNT ! 5971: {{MOV{R7{STATB{{STORE START ADRS OF STATIC ! 5972: {{MOV{#4*E$SRS{RSMEM{{RESERVE MEMORY ! 5973: {{MOV{SP{STBAS{{STORE STACK BASE ! 5974: {{SSS{INISS{{{SAVE S-R STACK PTR ! 5975: * ! 5976: * NOW CONVERT FREE STORE PERCENTAGE TO A SUITABLE FACTOR ! 5977: * FOR EASY TESTING IN ALLOC ROUTINE. ! 5978: * ! 5979: {{LDI{INTVH{{{GET 100 ! 5980: {{DVI{ALFSP{{{FORM 100 / ALFSP ! 5981: {{STI{ALFSF{{{STORE THE FACTOR ! 5982: * ! 5983: * INITIALIZE VALUES FOR REAL CONVERSION ROUTINE ! 5984: * ! 5985: {{LCT{R7{#CFP$S{{LOAD COUNTER FOR SIGNIFICANT DIGITS ! 5986: {{LDR{REAV1{{{LOAD 1.0 ! 5987: * ! 5988: * LOOP TO COMPUTE 10**(MAX NUMBER SIGNIFICANT DIGITS) ! 5989: * ! 5990: {INI03{MLR{REAVT{{{* 10.0 ! 5991: {{BCT{R7{INI03{{LOOP TILL DONE ! 5992: {{STR{GTSSC{{{STORE 10**(MAX SIG DIGITS) ! 5993: {{LDR{REAP5{{{LOAD 0.5 ! 5994: {{DVR{GTSSC{{{COMPUTE 0.5*10**(MAX SIG DIGITS) ! 5995: {{STR{GTSRN{{{STORE AS ROUNDING BIAS ! 5996: {{ZER{R8{{{SET TO READ PARAMETERS ! 5997: {{JSR{PRPAR{{{READ THEM ! 5998: {{EJC{{{{ ! 5999: * ! 6000: * NOW COMPUTE STARTING ADDRESS FOR DYNAMIC STORE AND IF ! 6001: * NECESSARY REQUEST MORE MEMORY. ! 6002: * ! 6003: {{SUB{#4*E$SRS{R10{{ALLOW FOR RESERVE MEMORY ! 6004: {{MOV{PRLEN{R6{{GET PRINT BUFFER LENGTH ! 6005: {{ADD{#CFP$A{R6{{ADD NO. OF CHARS IN ALPHABET ! 6006: {{ADD{#NSTMX{R6{{ADD CHARS FOR GTSTG BFR ! 6007: {{CTB{R6{8{{CONVERT TO BYTES, ALLOWING A MARGIN ! 6008: {{MOV{STATB{R9{{POINT TO STATIC BASE ! 6009: {{ADD{R6{R9{{INCREMENT FOR ABOVE BUFFERS ! 6010: {{ADD{#4*E$HNB{R9{{INCREMENT FOR HASH TABLE ! 6011: {{ADD{#4*E$STS{R9{{BUMP FOR INITIAL STATIC BLOCK ! 6012: {{JSR{SYSMX{{{GET MXLEN ! 6013: {{MOV{R6{KVMXL{{PROVISIONALLY STORE AS MAXLNGTH ! 6014: {{MOV{R6{MXLEN{{AND AS MXLEN ! 6015: {{BGT{R9{R6{INI06{SKIP IF STATIC HI EXCEEDS MXLEN ! 6016: {{MOV{R6{R9{{USE MXLEN INSTEAD ! 6017: {{ICA{R9{{{MAKE BIGGER THAN MXLEN ! 6018: * ! 6019: * HERE TO STORE VALUES WHICH MARK INITIAL DIVISION ! 6020: * OF DATA AREA INTO STATIC AND DYNAMIC ! 6021: * ! 6022: {INI06{MOV{R9{DNAMB{{DYNAMIC BASE ADRS ! 6023: {{MOV{R9{DNAMP{{DYNAMIC PTR ! 6024: {{BNZ{R6{INI07{{SKIP IF NON-ZERO MXLEN ! 6025: {{DCA{R9{{{POINT A WORD IN FRONT ! 6026: {{MOV{R9{KVMXL{{USE AS MAXLNGTH ! 6027: {{MOV{R9{MXLEN{{AND AS MXLEN ! 6028: {{EJC{{{{ ! 6029: * ! 6030: * LOOP HERE IF NECESSARY TILL ENOUGH MEMORY OBTAINED ! 6031: * SO THAT DNAME IS ABOVE DNAMB ! 6032: * ! 6033: {INI07{MOV{R10{DNAME{{STORE DYNAMIC END ADDRESS ! 6034: {{BLT{DNAMB{R10{INI09{SKIP IF HIGH ENOUGH ! 6035: {{JSR{SYSMM{{{REQUEST MORE MEMORY ! 6036: {{WTB{R9{{{GET AS BAUS (SGD05) ! 6037: {{ADD{R9{R10{{BUMP BY AMOUNT OBTAINED ! 6038: {{BNZ{R9{INI07{{TRY AGAIN ! 6039: {{MOV{#ENDMO{R9{{POINT TO FAILURE MESSAGE ! 6040: {{MOV{ENDML{R6{{MESSAGE LENGTH ! 6041: {{JSR{SYSPR{{{PRINT IT (PRTST NOT YET USABLE) ! 6042: {{PPM{{{{SHOULD NOT FAIL ! 6043: {{JSR{SYSEJ{{{PACK UP (STOPR NOT YET USABLE) ! 6044: * ! 6045: * INITIALISE PRINT BUFFER WITH BLANK WORDS ! 6046: * ! 6047: {INI09{MOV{PRLEN{R8{{NO. OF CHARS IN PRINT BFR ! 6048: {{MOV{STATB{R9{{POINT TO STATIC AGAIN ! 6049: {{MOV{R9{PRBUF{{PRINT BFR IS PUT AT STATIC START ! 6050: {{MOV{#B$SCL{(R9)+{{STORE STRING TYPE CODE ! 6051: {{MOV{R8{(R9)+{{AND STRING LENGTH ! 6052: {{CTW{R8{0{{GET NUMBER OF WORDS IN BUFFER ! 6053: {{MOV{R8{PRLNW{{STORE FOR BUFFER CLEAR ! 6054: {{LCT{R8{R8{{WORDS TO CLEAR ! 6055: * ! 6056: * LOOP TO CLEAR BUFFER ! 6057: * ! 6058: {INI10{MOV{NULLW{(R9)+{{STORE BLANK ! 6059: {{BCT{R8{INI10{{LOOP ! 6060: * ! 6061: * INITIALIZE NUMBER OF HASH HEADERS ! 6062: * ! 6063: {{MOV{#E$HNB{R6{{GET NUMBER OF HASH HEADERS ! 6064: {{MTI{R6{{{CONVERT TO INTEGER ! 6065: {{STI{HSHNB{{{STORE FOR USE BY GTNVR PROCEDURE ! 6066: {{LCT{R6{R6{{COUNTER FOR CLEARING HASH TABLE ! 6067: {{MOV{R9{HSHTB{{POINTER TO HASH TABLE ! 6068: * ! 6069: * LOOP TO CLEAR HASH TABLE ! 6070: * ! 6071: {INI11{ZER{(R9)+{{{BLANK A WORD ! 6072: {{BCT{R6{INI11{{LOOP ! 6073: {{MOV{R9{HSHTE{{END OF HASH TABLE ADRS IS KEPT ! 6074: * ! 6075: * ALLOCATE WORK AREA FOR GTSTG CONVERSION PROCEDURE ! 6076: * ! 6077: {{MOV{#NSTMX{R6{{GET MAX NUM CHARS IN OUTPUT NUMBER ! 6078: {{CTB{R6{SCSI${{NO OF BYTES NEEDED ! 6079: {{MOV{R9{GTSWK{{STORE BFR ADRS ! 6080: {{ADD{R6{R9{{BUMP FOR WORK BFR ! 6081: {{EJC{{{{ ! 6082: * ! 6083: * BUILD ALPHABET STRING FOR ALPHABET KEYWORD AND REPLACE ! 6084: * ! 6085: {{MOV{R9{KVALP{{SAVE ALPHABET POINTER ! 6086: {{MOV{#B$SCL{(R9){{STRING BLK TYPE ! 6087: {{MOV{#CFP$A{R8{{NO OF CHARS IN ALPHABET ! 6088: {{MOV{R8{4*SCLEN(R9){{STORE AS STRING LENGTH ! 6089: {{MOV{R8{R7{{COPY CHAR COUNT ! 6090: {{CTB{R7{SCSI${{NO. OF BYTES NEEDED ! 6091: {{ADD{R9{R7{{CURRENT END ADDRESS FOR STATIC ! 6092: {{MOV{R7{STATE{{STORE STATIC END ADRS ! 6093: {{LCT{R8{R8{{LOOP COUNTER ! 6094: {{PSC{R9{{{POINT TO CHARS OF STRING ! 6095: {{ZER{R7{{{SET INITIAL CHARACTER VALUE ! 6096: * ! 6097: * LOOP TO ENTER CHARACTER CODES IN ORDER ! 6098: * ! 6099: {INI12{SCH{R7{(R9)+{{STORE NEXT CODE ! 6100: {{ICV{R7{{{BUMP CODE VALUE ! 6101: {{BCT{R8{INI12{{LOOP TILL ALL STORED ! 6102: {{CSC{R9{{{COMPLETE STORE CHARACTERS ! 6103: * ! 6104: * INITIALIZE VARIABLE BLOCKS FOR INPUT AND OUTPUT ! 6105: * ! 6106: {{MOV{#V$INP{R10{{POINT TO STRING /INPUT/ ! 6107: {{MOV{#TRTIN{R7{{TRBLK TYPE FOR INPUT ! 6108: {{JSR{INOUT{{{PERFORM INPUT ASSOCIATION ! 6109: {{MOV{#V$OUP{R10{{POINT TO STRING /OUTPUT/ ! 6110: {{MOV{#TRTOU{R7{{TRBLK TYPE FOR OUTPUT ! 6111: {{JSR{INOUT{{{PERFORM OUTPUT ASSOCIATION ! 6112: {{MOV{INITR{R8{{TERMINAL FLAG ! 6113: {{BZE{R8{INI13{{SKIP IF NO TERMINAL ! 6114: {{JSR{PRPAR{{{ASSOCIATE TERMINAL ! 6115: {{EJC{{{{ ! 6116: * ! 6117: * CHECK FOR EXPIRY DATE ! 6118: * ! 6119: {INI13{JSR{SYSDC{{{CALL DATE CHECK ! 6120: {{MOV{SP{FLPTR{{IN CASE STACK OVERFLOWS IN COMPILER ! 6121: * ! 6122: * NOW COMPILE SOURCE INPUT CODE ! 6123: * ! 6124: {{JSR{CMPIL{{{CALL COMPILER ! 6125: {{MOV{R9{R$COD{{SET PTR TO FIRST CODE BLOCK ! 6126: {{MOV{#NULLS{R$TTL{{FORGET TITLE (REG04) ! 6127: {{MOV{#NULLS{R$STL{{FORGET SUB-TITLE (REG04) ! 6128: {{ZER{R$CIM{{{FORGET COMPILER INPUT IMAGE ! 6129: {{ZER{R10{{{CLEAR DUD VALUE ! 6130: {{ZER{R7{{{DONT SHIFT DYNAMIC STORE UP ! 6131: {{JSR{GBCOL{{{CLEAR GARBAGE LEFT FROM COMPILE ! 6132: {{BNZ{CPSTS{INIX0{{SKIP IF NO LISTING OF COMP STATS ! 6133: {{JSR{PRTPG{{{EJECT PAGE ! 6134: * ! 6135: * PRINT COMPILE STATISTICS ! 6136: * ! 6137: {{MOV{DNAMP{R6{{NEXT AVAILABLE LOC ! 6138: {{SUB{STATB{R6{{MINUS START ! 6139: {{BTW{R6{{{CONVERT TO WORDS ! 6140: {{MTI{R6{{{CONVERT TO INTEGER ! 6141: {{MOV{#ENCM1{R9{{POINT TO /MEMORY USED (WORDS)/ ! 6142: {{JSR{PRTMI{{{PRINT MESSAGE ! 6143: {{MOV{DNAME{R6{{END OF MEMORY ! 6144: {{SUB{DNAMP{R6{{MINUS NEXT AVAILABLE LOC ! 6145: {{BTW{R6{{{CONVERT TO WORDS ! 6146: {{MTI{R6{{{CONVERT TO INTEGER ! 6147: {{MOV{#ENCM2{R9{{POINT TO /MEMORY AVAILABLE (WORDS)/ ! 6148: {{JSR{PRTMI{{{PRINT LINE ! 6149: {{MTI{CMERC{{{GET COUNT OF ERRORS AS INTEGER ! 6150: {{MOV{#ENCM3{R9{{POINT TO /COMPILE ERRORS/ ! 6151: {{JSR{PRTMI{{{PRINT IT ! 6152: {{MTI{GBCNT{{{GARBAGE COLLECTION COUNT ! 6153: {{SBI{INTV1{{{ADJUST FOR UNAVOIDABLE COLLECT ! 6154: {{MOV{#STPM5{R9{{POINT TO /STORAGE REGENERATIONS/ ! 6155: {{JSR{PRTMI{{{PRINT GBCOL COUNT ! 6156: {{JSR{SYSTM{{{GET TIME ! 6157: {{SBI{TIMSX{{{GET COMPILATION TIME ! 6158: {{MOV{#ENCM4{R9{{POINT TO COMPILATION TIME (MSEC)/ ! 6159: {{JSR{PRTMI{{{PRINT MESSAGE ! 6160: {{ADD{#NUM05{LSTLC{{BUMP LINE COUNT ! 6161: {{BZE{HEADP{INIX0{{NO EJECT IF NOTHING PRINTED (SDG11) ! 6162: {{JSR{PRTPG{{{EJECT PRINTER ! 6163: {{EJC{{{{ ! 6164: * ! 6165: * PREPARE NOW TO START EXECUTION ! 6166: * ! 6167: * SET DEFAULT INPUT RECORD LENGTH ! 6168: * ! 6169: {INIX0{BGT{CSWIN{#INILN{INIX1{SKIP IF NOT DEFAULT -IN72 USED ! 6170: {{MOV{#INILS{CSWIN{{ELSE USE DEFAULT RECORD LENGTH ! 6171: * ! 6172: * RESET TIMER ! 6173: * ! 6174: {INIX1{JSR{SYSTM{{{GET TIME AGAIN ! 6175: {{STI{TIMSX{{{STORE FOR END RUN PROCESSING ! 6176: {{ADD{CSWEX{NOXEQ{{ADD -NOEXECUTE FLAG ! 6177: {{BNZ{NOXEQ{INIX2{{JUMP IF EXECUTION SUPPRESSED ! 6178: {{ZER{GBCNT{{{INITIALISE COLLECT COUNT ! 6179: {{JSR{SYSBX{{{CALL BEFORE STARTING EXECUTION ! 6180: * ! 6181: * MERGE WHEN LISTING FILE SET FOR EXECUTION ! 6182: * ! 6183: {INIY0{MNZ{HEADP{{{MARK HEADERS OUT REGARDLESS ! 6184: {{ZER{-(SP){{{SET FAILURE LOCATION ON STACK ! 6185: {{MOV{SP{FLPTR{{SAVE PTR TO FAILURE OFFSET WORD ! 6186: {{MOV{R$COD{R9{{LOAD PTR TO ENTRY CODE BLOCK ! 6187: {{MOV{#STGXT{STAGE{{SET STAGE FOR EXECUTE TIME ! 6188: {{MOV{CMPSN{PFNTE{{COPY STMTS COMPILED COUNT IN CASE ! 6189: {{JSR{SYSTM{{{TIME YET AGAIN ! 6190: {{STI{PFSTM{{{ ! 6191: {{BRI{(R9){{{START XEQ WITH FIRST STATEMENT ! 6192: * ! 6193: * HERE IF EXECUTION IS SUPPRESSED ! 6194: * ! 6195: {INIX2{JSR{PRTNL{{{PRINT A BLANK LINE ! 6196: {{MOV{#ENCM5{R9{{POINT TO /EXECUTION SUPPRESSED/ ! 6197: {{JSR{PRTST{{{PRINT STRING ! 6198: {{JSR{PRTNL{{{OUTPUT LINE ! 6199: {{ZER{R6{{{SET ABEND VALUE TO ZERO ! 6200: {{MOV{#NINI9{R7{{SET SPECIAL CODE VALUE ! 6201: {{JSR{SYSEJ{{{END OF JOB, EXIT TO SYSTEM ! 6202: {{TTL{S{{{P I T B O L -- SNOBOL4 OPERATOR ROUTINES ! 6203: * ! 6204: * THIS SECTION INCLUDES ALL ROUTINES WHICH CAN BE ACCESSED ! 6205: * DIRECTLY FROM THE GENERATED CODE EXCEPT SYSTEM FUNCTIONS. ! 6206: * ! 6207: * ALL ROUTINES IN THIS SECTION START WITH A LABEL OF THE ! 6208: * FORM O$XXX WHERE XXX IS THREE LETTERS. THE GENERATED CODE ! 6209: * CONTAINS A POINTER TO THE APPROPRIATE ENTRY LABEL. ! 6210: * ! 6211: * SINCE THE GENERAL FORM OF THE GENERATED CODE CONSISTS OF ! 6212: * POINTERS TO BLOCKS WHOSE FIRST WORD IS THE ADDRESS OF THE ! 6213: * ACTUAL ENTRY POINT LABEL (O$XXX). ! 6214: * ! 6215: * THESE ROUTINES ARE IN ALPHABETICAL ORDER BY THEIR ! 6216: * ENTRY LABEL NAMES (I.E. BY THE XXX OF THE O$XXX NAME) ! 6217: * ! 6218: * THESE ROUTINES RECEIVE CONTROL AS FOLLOWS ! 6219: * ! 6220: * (CP) POINTER TO NEXT CODE WORD ! 6221: * (XS) CURRENT STACK POINTER ! 6222: {{EJC{{{{ ! 6223: * ! 6224: * BINARY PLUS (ADDITION) ! 6225: * ! 6226: {O$ADD{ENT{{{{ENTRY POINT ! 6227: {{JSR{ARITH{{{FETCH ARITHMETIC OPERANDS ! 6228: {{ERR{001{ADDITION{{LEFT OPERAND IS NOT NUMERIC ! 6229: {{ERR{002{ADDITION{{RIGHT OPERAND IS NOT NUMERIC ! 6230: {{PPM{OADD1{{{JUMP IF REAL OPERANDS ! 6231: * ! 6232: * HERE TO ADD TWO INTEGERS ! 6233: * ! 6234: {{ADI{4*ICVAL(R10){{{ADD RIGHT OPERAND TO LEFT ! 6235: {{INO{EXINT{{{RETURN INTEGER IF NO OVERFLOW ! 6236: {{ERB{003{ADDITION{{CAUSED INTEGER OVERFLOW ! 6237: * ! 6238: * HERE TO ADD TWO REALS ! 6239: * ! 6240: {OADD1{ADR{4*RCVAL(R10){{{ADD RIGHT OPERAND TO LEFT ! 6241: {{RNO{EXREA{{{RETURN REAL IF NO OVERFLOW ! 6242: {{ERB{261{ADDITION{{CAUSED REAL OVERFLOW ! 6243: {{EJC{{{{ ! 6244: * ! 6245: * UNARY PLUS (AFFIRMATION) ! 6246: * ! 6247: {O$AFF{ENT{{{{ENTRY POINT ! 6248: {{MOV{(SP)+{R9{{LOAD OPERAND ! 6249: {{JSR{GTNUM{{{CONVERT TO NUMERIC ! 6250: {{ERR{004{AFFIRMATION{{OPERAND IS NOT NUMERIC ! 6251: {{BRN{EXIXR{{{RETURN IF CONVERTED TO NUMERIC ! 6252: {{EJC{{{{ ! 6253: * ! 6254: * BINARY BAR (ALTERNATION) ! 6255: * ! 6256: {O$ALT{ENT{{{{ENTRY POINT ! 6257: {{MOV{(SP)+{R9{{LOAD RIGHT OPERAND ! 6258: {{JSR{GTPAT{{{CONVERT TO PATTERN ! 6259: {{ERR{005{ALTERNATION{{RIGHT OPERAND IS NOT PATTERN ! 6260: * ! 6261: * MERGE HERE FROM SPECIAL (LEFT ALTERNATION) CASE ! 6262: * ! 6263: {OALT1{MOV{#P$ALT{R7{{SET PCODE FOR ALTERNATIVE NODE ! 6264: {{JSR{PBILD{{{BUILD ALTERNATIVE NODE ! 6265: {{MOV{R9{R10{{SAVE ADDRESS OF ALTERNATIVE NODE ! 6266: {{MOV{(SP)+{R9{{LOAD LEFT OPERAND ! 6267: {{JSR{GTPAT{{{CONVERT TO PATTERN ! 6268: {{ERR{006{ALTERNATION{{LEFT OPERAND IS NOT PATTERN ! 6269: {{BEQ{R9{#P$ALT{OALT2{JUMP IF LEFT ARG IS ALTERNATION ! 6270: {{MOV{R9{4*PTHEN(R10){{SET LEFT OPERAND AS SUCCESSOR ! 6271: {{MOV{R10{R9{{MOVE RESULT TO PROPER REGISTER ! 6272: {{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD ! 6273: * ! 6274: * COME HERE IF LEFT ARGUMENT IS ITSELF AN ALTERNATION ! 6275: * ! 6276: * THE RESULT IS MORE EFFICIENT IF WE MAKE THE REPLACEMENT ! 6277: * ! 6278: * (A / B) / C = A / (B / C) ! 6279: * ! 6280: {OALT2{MOV{4*PARM1(R9){4*PTHEN(R10){{BUILD THE (B / C) NODE ! 6281: {{MOV{4*PTHEN(R9){-(SP){{SET A AS NEW LEFT ARG ! 6282: {{MOV{R10{R9{{SET (B / C) AS NEW RIGHT ARG ! 6283: {{BRN{OALT1{{{MERGE BACK TO BUILD A / (B / C) ! 6284: {{EJC{{{{ ! 6285: * ! 6286: * ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY NAME) ! 6287: * ! 6288: {O$AMN{ENT{{{{ENTRY POINT ! 6289: {{LCW{R9{{{LOAD NUMBER OF SUBSCRIPTS ! 6290: {{MOV{R9{R7{{SET FLAG FOR BY NAME ! 6291: {{BRN{ARREF{{{JUMP TO ARRAY REFERENCE ROUTINE ! 6292: {{EJC{{{{ ! 6293: * ! 6294: * ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY VALUE) ! 6295: * ! 6296: {O$AMV{ENT{{{{ENTRY POINT ! 6297: {{LCW{R9{{{LOAD NUMBER OF SUBSCRIPTS ! 6298: {{ZER{R7{{{SET FLAG FOR BY VALUE ! 6299: {{BRN{ARREF{{{JUMP TO ARRAY REFERENCE ROUTINE ! 6300: {{EJC{{{{ ! 6301: * ! 6302: * ARRAY REFERENCE (ONE SUBSCRIPT, BY NAME) ! 6303: * ! 6304: {O$AON{ENT{{{{ENTRY POINT ! 6305: {{MOV{(SP){R9{{LOAD SUBSCRIPT VALUE ! 6306: {{MOV{4*1(SP){R10{{LOAD ARRAY VALUE ! 6307: {{MOV{(R10){R6{{LOAD FIRST WORD OF ARRAY OPERAND ! 6308: {{BEQ{R6{#B$VCT{OAON2{JUMP IF VECTOR REFERENCE ! 6309: {{BEQ{R6{#B$TBT{OAON3{JUMP IF TABLE REFERENCE ! 6310: * ! 6311: * HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE ! 6312: * ! 6313: {OAON1{MOV{#NUM01{R9{{SET NUMBER OF SUBSCRIPTS TO ONE ! 6314: {{MOV{R9{R7{{SET FLAG FOR BY NAME ! 6315: {{BRN{ARREF{{{JUMP TO ARRAY REFERENCE ROUTINE ! 6316: * ! 6317: * HERE IF WE HAVE A VECTOR REFERENCE ! 6318: * ! 6319: {OAON2{BNE{(R9){#B$ICL{OAON1{USE LONG ROUTINE IF NOT INTEGER ! 6320: {{LDI{4*ICVAL(R9){{{LOAD INTEGER SUBSCRIPT VALUE ! 6321: {{MFI{R6{EXFAL{{COPY AS ADDRESS INT, FAIL IF OVFLO ! 6322: {{BZE{R6{EXFAL{{FAIL IF ZERO ! 6323: {{ADD{#VCVLB{R6{{COMPUTE OFFSET IN WORDS ! 6324: {{WTB{R6{{{CONVERT TO BYTES ! 6325: {{MOV{R6{(SP){{COMPLETE NAME ON STACK ! 6326: {{BLT{R6{4*VCLEN(R10){EXITS{EXIT IF SUBSCRIPT NOT TOO LARGE ! 6327: {{BRN{EXFAL{{{ELSE FAIL ! 6328: * ! 6329: * HERE FOR TABLE REFERENCE ! 6330: * ! 6331: {OAON3{MNZ{R7{{{SET FLAG FOR NAME REFERENCE ! 6332: {{JSR{TFIND{{{LOCATE/CREATE TABLE ELEMENT ! 6333: {{PPM{EXFAL{{{FAIL IF ACCESS FAILS ! 6334: {{MOV{R10{4*1(SP){{STORE NAME BASE ON STACK ! 6335: {{MOV{R6{(SP){{STORE NAME OFFSET ON STACK ! 6336: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK ! 6337: {{EJC{{{{ ! 6338: * ! 6339: * ARRAY REFERENCE (ONE SUBSCRIPT, BY VALUE) ! 6340: * ! 6341: {O$AOV{ENT{{{{ENTRY POINT ! 6342: {{MOV{(SP)+{R9{{LOAD SUBSCRIPT VALUE ! 6343: {{MOV{(SP)+{R10{{LOAD ARRAY VALUE ! 6344: {{MOV{(R10){R6{{LOAD FIRST WORD OF ARRAY OPERAND ! 6345: {{BEQ{R6{#B$VCT{OAOV2{JUMP IF VECTOR REFERENCE ! 6346: {{BEQ{R6{#B$TBT{OAOV3{JUMP IF TABLE REFERENCE ! 6347: * ! 6348: * HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE ! 6349: * ! 6350: {OAOV1{MOV{R10{-(SP){{RESTACK ARRAY VALUE ! 6351: {{MOV{R9{-(SP){{RESTACK SUBSCRIPT ! 6352: {{MOV{#NUM01{R9{{SET NUMBER OF SUBSCRIPTS TO ONE ! 6353: {{ZER{R7{{{SET FLAG FOR VALUE CALL ! 6354: {{BRN{ARREF{{{JUMP TO ARRAY REFERENCE ROUTINE ! 6355: * ! 6356: * HERE IF WE HAVE A VECTOR REFERENCE ! 6357: * ! 6358: {OAOV2{BNE{(R9){#B$ICL{OAOV1{USE LONG ROUTINE IF NOT INTEGER ! 6359: {{LDI{4*ICVAL(R9){{{LOAD INTEGER SUBSCRIPT VALUE ! 6360: {{MFI{R6{EXFAL{{MOVE AS ONE WORD INT, FAIL IF OVFLO ! 6361: {{BZE{R6{EXFAL{{FAIL IF ZERO ! 6362: {{ADD{#VCVLB{R6{{COMPUTE OFFSET IN WORDS ! 6363: {{WTB{R6{{{CONVERT TO BYTES ! 6364: {{BGE{R6{4*VCLEN(R10){EXFAL{FAIL IF SUBSCRIPT TOO LARGE ! 6365: {{JSR{ACESS{{{ACCESS VALUE ! 6366: {{PPM{EXFAL{{{FAIL IF ACCESS FAILS ! 6367: {{BRN{EXIXR{{{ELSE RETURN VALUE TO CALLER ! 6368: * ! 6369: * HERE FOR TABLE REFERENCE BY VALUE ! 6370: * ! 6371: {OAOV3{ZER{R7{{{SET FLAG FOR VALUE REFERENCE ! 6372: {{JSR{TFIND{{{CALL TABLE SEARCH ROUTINE ! 6373: {{PPM{EXFAL{{{FAIL IF ACCESS FAILS ! 6374: {{BRN{EXIXR{{{EXIT WITH RESULT IN XR ! 6375: {{EJC{{{{ ! 6376: * ! 6377: * ASSIGNMENT ! 6378: * ! 6379: {O$ASS{ENT{{{{ENTRY POINT ! 6380: * ! 6381: * O$RPL (PATTERN REPLACEMENT) MERGES HERE ! 6382: * ! 6383: {OASS0{MOV{(SP)+{R7{{LOAD VALUE TO BE ASSIGNED ! 6384: {{MOV{(SP)+{R6{{LOAD NAME OFFSET ! 6385: {{MOV{(SP){R10{{LOAD NAME BASE ! 6386: {{MOV{R7{(SP){{STORE ASSIGNED VALUE AS RESULT ! 6387: {{JSR{ASIGN{{{PERFORM ASSIGNMENT ! 6388: {{PPM{EXFAL{{{FAIL IF ASSIGNMENT FAILS ! 6389: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK ! 6390: {{EJC{{{{ ! 6391: * ! 6392: * COMPILATION ERROR ! 6393: * ! 6394: {O$CER{ENT{{{{ENTRY POINT ! 6395: {{ERB{007{COMPILATION{{ERROR ENCOUNTERED DURING EXECUTION ! 6396: {{EJC{{{{ ! 6397: * ! 6398: * UNARY AT (CURSOR ASSIGNMENT) ! 6399: * ! 6400: {O$CAS{ENT{{{{ENTRY POINT ! 6401: {{MOV{(SP)+{R8{{LOAD NAME OFFSET (PARM2) ! 6402: {{MOV{(SP)+{R9{{LOAD NAME BASE (PARM1) ! 6403: {{MOV{#P$CAS{R7{{SET PCODE FOR CURSOR ASSIGNMENT ! 6404: {{JSR{PBILD{{{BUILD NODE ! 6405: {{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD ! 6406: {{EJC{{{{ ! 6407: * ! 6408: * CONCATENATION ! 6409: * ! 6410: {O$CNC{ENT{{{{ENTRY POINT ! 6411: {{MOV{(SP){R9{{LOAD RIGHT ARGUMENT ! 6412: {{BEQ{R9{#NULLS{OCNC3{JUMP IF RIGHT ARG IS NULL ! 6413: {{MOV{4*1(SP){R10{{LOAD LEFT ARGUMENT ! 6414: {{BEQ{R10{#NULLS{OCNC4{JUMP IF LEFT ARGUMENT IS NULL ! 6415: {{MOV{#B$SCL{R6{{GET CONSTANT TO TEST FOR STRING ! 6416: {{BNE{R6{(R10){OCNC2{JUMP IF LEFT ARG NOT A STRING ! 6417: {{BNE{R6{(R9){OCNC2{JUMP IF RIGHT ARG NOT A STRING ! 6418: * ! 6419: * MERGE HERE TO CONCATENATE TWO STRINGS ! 6420: * ! 6421: {OCNC1{MOV{4*SCLEN(R10){R6{{LOAD LEFT ARGUMENT LENGTH ! 6422: {{ADD{4*SCLEN(R9){R6{{COMPUTE RESULT LENGTH ! 6423: {{JSR{ALOCS{{{ALLOCATE SCBLK FOR RESULT ! 6424: {{MOV{R9{4*1(SP){{STORE RESULT PTR OVER LEFT ARGUMENT ! 6425: {{PSC{R9{{{PREPARE TO STORE CHARS OF RESULT ! 6426: {{MOV{4*SCLEN(R10){R6{{GET NUMBER OF CHARS IN LEFT ARG ! 6427: {{PLC{R10{{{PREPARE TO LOAD LEFT ARG CHARS ! 6428: {{MVC{{{{MOVE CHARACTERS OF LEFT ARGUMENT ! 6429: {{MOV{(SP)+{R10{{LOAD RIGHT ARG POINTER, POP STACK ! 6430: {{MOV{4*SCLEN(R10){R6{{LOAD NUMBER OF CHARS IN RIGHT ARG ! 6431: {{PLC{R10{{{PREPARE TO LOAD RIGHT ARG CHARS ! 6432: {{MVC{{{{MOVE CHARACTERS OF RIGHT ARGUMENT ! 6433: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK ! 6434: * ! 6435: * COME HERE IF ARGUMENTS ARE NOT BOTH STRINGS ! 6436: * ! 6437: {OCNC2{JSR{GTSTG{{{CONVERT RIGHT ARG TO STRING ! 6438: {{PPM{OCNC5{{{JUMP IF RIGHT ARG IS NOT STRING ! 6439: {{MOV{R9{R10{{SAVE RIGHT ARG PTR ! 6440: {{JSR{GTSTG{{{CONVERT LEFT ARG TO STRING ! 6441: {{PPM{OCNC6{{{JUMP IF LEFT ARG IS NOT A STRING ! 6442: {{MOV{R9{-(SP){{STACK LEFT ARGUMENT ! 6443: {{MOV{R10{-(SP){{STACK RIGHT ARGUMENT ! 6444: {{MOV{R9{R10{{MOVE LEFT ARG TO PROPER REG ! 6445: {{MOV{(SP){R9{{MOVE RIGHT ARG TO PROPER REG ! 6446: {{BRN{OCNC1{{{MERGE BACK TO CONCATENATE STRINGS ! 6447: {{EJC{{{{ ! 6448: * ! 6449: * CONCATENATION (CONTINUED) ! 6450: * ! 6451: * COME HERE FOR NULL RIGHT ARGUMENT ! 6452: * ! 6453: {OCNC3{ICA{SP{{{REMOVE RIGHT ARG FROM STACK ! 6454: {{BRN{EXITS{{{RETURN WITH LEFT ARGUMENT ON STACK ! 6455: * ! 6456: * HERE FOR NULL LEFT ARGUMENT ! 6457: * ! 6458: {OCNC4{ICA{SP{{{UNSTACK ONE ARGUMENT ! 6459: {{MOV{R9{(SP){{STORE RIGHT ARGUMENT ! 6460: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK ! 6461: * ! 6462: * HERE IF RIGHT ARGUMENT IS NOT A STRING ! 6463: * ! 6464: {OCNC5{MOV{R9{R10{{MOVE RIGHT ARGUMENT PTR ! 6465: {{MOV{(SP)+{R9{{LOAD LEFT ARG POINTER ! 6466: * ! 6467: * MERGE HERE WHEN LEFT ARGUMENT IS NOT A STRING ! 6468: * ! 6469: {OCNC6{JSR{GTPAT{{{CONVERT LEFT ARG TO PATTERN ! 6470: {{ERR{008{CONCATENATION{{LEFT OPND IS NOT STRING OR PATTERN ! 6471: {{MOV{R9{-(SP){{SAVE RESULT ON STACK ! 6472: {{MOV{R10{R9{{POINT TO RIGHT OPERAND ! 6473: {{JSR{GTPAT{{{CONVERT TO PATTERN ! 6474: {{ERR{009{CONCATENATION{{RIGHT OPD IS NOT STRING OR PATTERN ! 6475: {{MOV{R9{R10{{MOVE FOR PCONC ! 6476: {{MOV{(SP)+{R9{{RELOAD LEFT OPERAND PTR ! 6477: {{JSR{PCONC{{{CONCATENATE PATTERNS ! 6478: {{BRN{EXIXR{{{EXIT WITH RESULT IN XR ! 6479: {{EJC{{{{ ! 6480: * ! 6481: * COMPLEMENTATION ! 6482: * ! 6483: {O$COM{ENT{{{{ENTRY POINT ! 6484: {{MOV{(SP)+{R9{{LOAD OPERAND ! 6485: {{MOV{(R9){R6{{LOAD TYPE WORD ! 6486: * ! 6487: * MERGE BACK HERE AFTER CONVERSION ! 6488: * ! 6489: {OCOM1{BEQ{R6{#B$ICL{OCOM2{JUMP IF INTEGER ! 6490: {{BEQ{R6{#B$RCL{OCOM3{JUMP IF REAL ! 6491: {{JSR{GTNUM{{{ELSE CONVERT TO NUMERIC ! 6492: {{ERR{010{COMPLEMENTATION{{OPERAND IS NOT NUMERIC ! 6493: {{BRN{OCOM1{{{BACK TO CHECK CASES ! 6494: * ! 6495: * HERE TO COMPLEMENT INTEGER ! 6496: * ! 6497: {OCOM2{LDI{4*ICVAL(R9){{{LOAD INTEGER VALUE ! 6498: {{NGI{{{{NEGATE ! 6499: {{INO{EXINT{{{RETURN INTEGER IF NO OVERFLOW ! 6500: {{ERB{011{COMPLEMENTATION{{CAUSED INTEGER OVERFLOW ! 6501: * ! 6502: * HERE TO COMPLEMENT REAL ! 6503: * ! 6504: {OCOM3{LDR{4*RCVAL(R9){{{LOAD REAL VALUE ! 6505: {{NGR{{{{NEGATE ! 6506: {{BRN{EXREA{{{RETURN REAL RESULT ! 6507: {{EJC{{{{ ! 6508: * ! 6509: * BINARY SLASH (DIVISION) ! 6510: * ! 6511: {O$DVD{ENT{{{{ENTRY POINT ! 6512: {{JSR{ARITH{{{FETCH ARITHMETIC OPERANDS ! 6513: {{ERR{012{DIVISION{{LEFT OPERAND IS NOT NUMERIC ! 6514: {{ERR{013{DIVISION{{RIGHT OPERAND IS NOT NUMERIC ! 6515: {{PPM{ODVD2{{{JUMP IF REAL OPERANDS ! 6516: * ! 6517: * HERE TO DIVIDE TWO INTEGERS ! 6518: * ! 6519: {{DVI{4*ICVAL(R10){{{DIVIDE LEFT OPERAND BY RIGHT ! 6520: {{INO{EXINT{{{RESULT OK IF NO OVERFLOW ! 6521: {{ERB{014{DIVISION{{CAUSED INTEGER OVERFLOW ! 6522: * ! 6523: * HERE TO DIVIDE TWO REALS ! 6524: * ! 6525: {ODVD2{DVR{4*RCVAL(R10){{{DIVIDE LEFT OPERAND BY RIGHT ! 6526: {{RNO{EXREA{{{RETURN REAL IF NO OVERFLOW ! 6527: {{ERB{262{DIVISION{{CAUSED REAL OVERFLOW ! 6528: {{EJC{{{{ ! 6529: * ! 6530: * EXPONENTIATION ! 6531: * ! 6532: {O$EXP{ENT{{{{ENTRY POINT ! 6533: {{MOV{(SP)+{R9{{LOAD EXPONENT ! 6534: {{JSR{GTNUM{{{CONVERT TO NUMBER ! 6535: {{ERR{015{EXPONENTIATION{{RIGHT OPERAND IS NOT NUMERIC ! 6536: {{BNE{R6{#B$ICL{OEXP7{JUMP IF REAL ! 6537: {{MOV{R9{R10{{MOVE EXPONENT ! 6538: {{MOV{(SP)+{R9{{LOAD BASE ! 6539: {{JSR{GTNUM{{{CONVERT TO NUMERIC ! 6540: {{ERR{016{EXPONENTIATION{{LEFT OPERAND IS NOT NUMERIC ! 6541: {{LDI{4*ICVAL(R10){{{LOAD EXPONENT ! 6542: {{ILT{OEXP8{{{ERROR IF NEGATIVE EXPONENT ! 6543: {{BEQ{R6{#B$RCL{OEXP3{JUMP IF BASE IS REAL ! 6544: * ! 6545: * HERE TO EXPONENTIATE AN INTEGER ! 6546: * ! 6547: {{MFI{R6{OEXP2{{CONVERT EXPONENT TO 1 WORD INTEGER ! 6548: {{LCT{R6{R6{{SET LOOP COUNTER ! 6549: {{LDI{INTV1{{{LOAD INITIAL VALUE OF 1 ! 6550: {{BNZ{R6{OEXP1{{JUMP IF NON-ZERO EXPONENT ! 6551: {{INE{EXINT{{{GIVE ZERO AS RESULT FOR NONZERO**0 ! 6552: {{BRN{OEXP4{{{ELSE ERROR OF 0**0 ! 6553: * ! 6554: * LOOP TO PERFORM EXPONENTIATION ! 6555: * ! 6556: {OEXP1{MLI{4*ICVAL(R9){{{MULTIPLY BY BASE ! 6557: {{IOV{OEXP2{{{JUMP IF OVERFLOW ! 6558: {{BCT{R6{OEXP1{{LOOP BACK TILL COMPUTATION COMPLETE ! 6559: {{BRN{EXINT{{{THEN RETURN INTEGER RESULT ! 6560: * ! 6561: * HERE IF INTEGER OVERFLOW ! 6562: * ! 6563: {OEXP2{ERB{017{EXPONENTIATION{{CAUSED INTEGER OVERFLOW ! 6564: {{EJC{{{{ ! 6565: * ! 6566: * EXPONENTIATION (CONTINUED) ! 6567: * ! 6568: * HERE TO EXPONENTIATE A REAL ! 6569: * ! 6570: {OEXP3{MFI{R6{OEXP6{{CONVERT EXPONENT TO ONE WORD ! 6571: {{LCT{R6{R6{{SET LOOP COUNTER ! 6572: {{LDR{REAV1{{{LOAD 1.0 AS INITIAL VALUE ! 6573: {{BNZ{R6{OEXP5{{JUMP IF NON-ZERO EXPONENT ! 6574: {{RNE{EXREA{{{RETURN 1.0 IF NONZERO**ZERO ! 6575: * ! 6576: * HERE FOR ERROR OF 0**0 OR 0.0**0 ! 6577: * ! 6578: {OEXP4{ERB{018{EXPONENTIATION{{RESULT IS UNDEFINED ! 6579: * ! 6580: * LOOP TO PERFORM EXPONENTIATION ! 6581: * ! 6582: {OEXP5{MLR{4*RCVAL(R9){{{MULTIPLY BY BASE ! 6583: {{ROV{OEXP6{{{JUMP IF OVERFLOW ! 6584: {{BCT{R6{OEXP5{{LOOP TILL COMPUTATION COMPLETE ! 6585: {{BRN{EXREA{{{THEN RETURN REAL RESULT ! 6586: * ! 6587: * HERE IF REAL OVERFLOW ! 6588: * ! 6589: {OEXP6{ERB{266{EXPONENTIATION{{CAUSED REAL OVERFLOW ! 6590: * ! 6591: * HERE IF REAL EXPONENT ! 6592: * ! 6593: {OEXP7{ERB{267{EXPONENTIATION{{RIGHT OPERAND IS REAL NOT INTEGER ! 6594: * ! 6595: * HERE FOR NEGATIVE EXPONENT ! 6596: * ! 6597: {OEXP8{ERB{019{EXPONENTIATION{{RIGHT OPERAND IS NEGATIVE ! 6598: {{EJC{{{{ ! 6599: * ! 6600: * FAILURE IN EXPRESSION EVALUATION ! 6601: * ! 6602: * THIS ENTRY POINT IS USED IF THE EVALUATION OF AN ! 6603: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, FAILS. ! 6604: * CONTROL IS RETURNED TO AN APPROPRIATE POINT IN EVALX. ! 6605: * ! 6606: {O$FEX{ENT{{{{ENTRY POINT ! 6607: {{BRN{EVLX6{{{JUMP TO FAILURE LOC IN EVALX ! 6608: {{EJC{{{{ ! 6609: * ! 6610: * FAILURE DURING EVALUATION OF A COMPLEX OR DIRECT GOTO ! 6611: * ! 6612: {O$FIF{ENT{{{{ENTRY POINT ! 6613: {{ERB{020{GOTO{{EVALUATION FAILURE ! 6614: {{EJC{{{{ ! 6615: * ! 6616: * FUNCTION CALL (MORE THAN ONE ARGUMENT) ! 6617: * ! 6618: {O$FNC{ENT{{{{ENTRY POINT ! 6619: {{LCW{R6{{{LOAD NUMBER OF ARGUMENTS ! 6620: {{LCW{R9{{{LOAD FUNCTION VRBLK POINTER ! 6621: {{MOV{4*VRFNC(R9){R10{{LOAD FUNCTION POINTER ! 6622: {{BNE{R6{4*FARGS(R10){CFUNC{USE CENTRAL ROUTINE IF WRONG NUM ! 6623: {{BRI{(R10){{{JUMP TO FUNCTION IF ARG COUNT OK ! 6624: {{EJC{{{{ ! 6625: * ! 6626: * FUNCTION NAME ERROR ! 6627: * ! 6628: {O$FNE{ENT{{{{ENTRY POINT ! 6629: {{LCW{R6{{{GET NEXT CODE WORD ! 6630: {{BNE{R6{#ORNM${OFNE1{FAIL IF NOT EVALUATING EXPRESSION ! 6631: {{BZE{4*2(SP){EVLX3{{OK IF EXPR. WAS WANTED BY VALUE ! 6632: * ! 6633: * HERE FOR ERROR ! 6634: * ! 6635: {OFNE1{ERB{021{FUNCTION{{CALLED BY NAME RETURNED A VALUE ! 6636: {{EJC{{{{ ! 6637: * ! 6638: * FUNCTION CALL (SINGLE ARGUMENT) ! 6639: * ! 6640: {O$FNS{ENT{{{{ENTRY POINT ! 6641: {{LCW{R9{{{LOAD FUNCTION VRBLK POINTER ! 6642: {{MOV{#NUM01{R6{{SET NUMBER OF ARGUMENTS TO ONE ! 6643: {{MOV{4*VRFNC(R9){R10{{LOAD FUNCTION POINTER ! 6644: {{BNE{R6{4*FARGS(R10){CFUNC{USE CENTRAL ROUTINE IF WRONG NUM ! 6645: {{BRI{(R10){{{JUMP TO FUNCTION IF ARG COUNT OK ! 6646: {{EJC{{{{ ! 6647: * CALL TO UNDEFINED FUNCTION ! 6648: * ! 6649: {O$FUN{ENT{{{{ENTRY POINT ! 6650: {{ERB{022{UNDEFINED{{FUNCTION CALLED ! 6651: {{EJC{{{{ ! 6652: * ! 6653: * EXECUTE COMPLEX GOTO ! 6654: * ! 6655: {O$GOC{ENT{{{{ENTRY POINT ! 6656: {{MOV{4*1(SP){R9{{LOAD NAME BASE POINTER ! 6657: {{BHI{R9{STATE{OGOC1{JUMP IF NOT NATURAL VARIABLE ! 6658: {{ADD{#4*VRTRA{R9{{ELSE POINT TO VRTRA FIELD ! 6659: {{BRI{(R9){{{AND JUMP THROUGH IT ! 6660: * ! 6661: * HERE IF GOTO OPERAND IS NOT NATURAL VARIABLE ! 6662: * ! 6663: {OGOC1{ERB{023{GOTO{{OPERAND IS NOT A NATURAL VARIABLE ! 6664: {{EJC{{{{ ! 6665: * ! 6666: * EXECUTE DIRECT GOTO ! 6667: * ! 6668: {O$GOD{ENT{{{{ENTRY POINT ! 6669: {{MOV{(SP){R9{{LOAD OPERAND ! 6670: {{MOV{(R9){R6{{LOAD FIRST WORD ! 6671: {{BEQ{R6{#B$CDS{BCDS0{JUMP IF CODE BLOCK TO CODE ROUTINE ! 6672: {{BEQ{R6{#B$CDC{BCDC0{JUMP IF CODE BLOCK TO CODE ROUTINE ! 6673: {{ERB{024{GOTO{{OPERAND IN DIRECT GOTO IS NOT CODE ! 6674: {{EJC{{{{ ! 6675: * ! 6676: * SET GOTO FAILURE TRAP ! 6677: * ! 6678: * THIS ROUTINE IS EXECUTED AT THE START OF A COMPLEX OR ! 6679: * DIRECT FAILURE GOTO TO TRAP A SUBSEQUENT FAIL (SEE EXFAL) ! 6680: * ! 6681: {O$GOF{ENT{{{{ENTRY POINT ! 6682: {{MOV{FLPTR{R9{{POINT TO FAIL OFFSET ON STACK ! 6683: {{ICA{(R9){{{POINT FAILURE TO O$FIF WORD ! 6684: {{ICP{{{{POINT TO NEXT CODE WORD ! 6685: {{BRN{EXITS{{{EXIT TO CONTINUE ! 6686: {{EJC{{{{ ! 6687: * ! 6688: * BINARY DOLLAR (IMMEDIATE ASSIGNMENT) ! 6689: * ! 6690: * THE PATTERN BUILT BY BINARY DOLLAR IS A COMPOUND PATTERN. ! 6691: * SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR ! 6692: * DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED. ! 6693: * ! 6694: {O$IMA{ENT{{{{ENTRY POINT ! 6695: {{MOV{#P$IMC{R7{{SET PCODE FOR LAST NODE ! 6696: {{MOV{(SP)+{R8{{POP NAME OFFSET (PARM2) ! 6697: {{MOV{(SP)+{R9{{POP NAME BASE (PARM1) ! 6698: {{JSR{PBILD{{{BUILD P$IMC NODE ! 6699: {{MOV{R9{R10{{SAVE PTR TO NODE ! 6700: {{MOV{(SP){R9{{LOAD LEFT ARGUMENT ! 6701: {{JSR{GTPAT{{{CONVERT TO PATTERN ! 6702: {{ERR{025{IMMEDIATE{{ASSIGNMENT LEFT OPERAND IS NOT PATTERN ! 6703: {{MOV{R9{(SP){{SAVE PTR TO LEFT OPERAND PATTERN ! 6704: {{MOV{#P$IMA{R7{{SET PCODE FOR FIRST NODE ! 6705: {{JSR{PBILD{{{BUILD P$IMA NODE ! 6706: {{MOV{(SP)+{4*PTHEN(R9){{SET LEFT OPERAND AS P$IMA SUCCESSOR ! 6707: {{JSR{PCONC{{{CONCATENATE TO FORM FINAL PATTERN ! 6708: {{BRN{EXIXR{{{ALL DONE ! 6709: {{EJC{{{{ ! 6710: * ! 6711: * INDIRECTION (BY NAME) ! 6712: * ! 6713: {O$INN{ENT{{{{ENTRY POINT ! 6714: {{MNZ{R7{{{SET FLAG FOR RESULT BY NAME ! 6715: {{BRN{INDIR{{{JUMP TO COMMON ROUTINE ! 6716: {{EJC{{{{ ! 6717: * ! 6718: * INTERROGATION ! 6719: * ! 6720: {O$INT{ENT{{{{ENTRY POINT ! 6721: {{MOV{#NULLS{(SP){{REPLACE OPERAND WITH NULL ! 6722: {{BRN{EXITS{{{EXIT FOR NEXT CODE WORD ! 6723: {{EJC{{{{ ! 6724: * ! 6725: * INDIRECTION (BY VALUE) ! 6726: * ! 6727: {O$INV{ENT{{{{ENTRY POINT ! 6728: {{ZER{R7{{{SET FLAG FOR BY VALUE ! 6729: {{BRN{INDIR{{{JUMP TO COMMON ROUTINE ! 6730: {{EJC{{{{ ! 6731: * ! 6732: * KEYWORD REFERENCE (BY NAME) ! 6733: * ! 6734: {O$KWN{ENT{{{{ENTRY POINT ! 6735: {{JSR{KWNAM{{{GET KEYWORD NAME ! 6736: {{BRN{EXNAM{{{EXIT WITH RESULT NAME ! 6737: {{EJC{{{{ ! 6738: * ! 6739: * KEYWORD REFERENCE (BY VALUE) ! 6740: * ! 6741: {O$KWV{ENT{{{{ENTRY POINT ! 6742: {{JSR{KWNAM{{{GET KEYWORD NAME ! 6743: {{MOV{R9{DNAMP{{DELETE KVBLK ! 6744: {{JSR{ACESS{{{ACCESS VALUE ! 6745: {{PPM{EXNUL{{{DUMMY (UNUSED) FAILURE RETURN ! 6746: {{BRN{EXIXR{{{JUMP WITH VALUE IN XR ! 6747: {{EJC{{{{ ! 6748: * ! 6749: * LOAD EXPRESSION BY NAME ! 6750: * ! 6751: {O$LEX{ENT{{{{ENTRY POINT ! 6752: {{MOV{#4*EVSI${R6{{SET SIZE OF EVBLK ! 6753: {{JSR{ALLOC{{{ALLOCATE SPACE FOR EVBLK ! 6754: {{MOV{#B$EVT{(R9){{SET TYPE WORD ! 6755: {{MOV{#TRBEV{4*EVVAR(R9){{SET DUMMY TRBLK POINTER ! 6756: {{LCW{R6{{{LOAD EXBLK POINTER ! 6757: {{MOV{R6{4*EVEXP(R9){{SET EXBLK POINTER ! 6758: {{MOV{R9{R10{{MOVE NAME BASE TO PROPER REG ! 6759: {{MOV{#4*EVVAR{R6{{SET NAME OFFSET = ZERO ! 6760: {{BRN{EXNAM{{{EXIT WITH NAME IN (XL,WA) ! 6761: {{EJC{{{{ ! 6762: * ! 6763: * LOAD PATTERN VALUE ! 6764: * ! 6765: {O$LPT{ENT{{{{ENTRY POINT ! 6766: {{LCW{R9{{{LOAD PATTERN POINTER ! 6767: {{BRN{EXIXR{{{STACK PTR AND OBEY NEXT CODE WORD ! 6768: {{EJC{{{{ ! 6769: * ! 6770: * LOAD VARIABLE NAME ! 6771: * ! 6772: {O$LVN{ENT{{{{ENTRY POINT ! 6773: {{LCW{R6{{{LOAD VRBLK POINTER ! 6774: {{MOV{R6{-(SP){{STACK VRBLK PTR (NAME BASE) ! 6775: {{MOV{#4*VRVAL{-(SP){{STACK NAME OFFSET ! 6776: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK ! 6777: {{EJC{{{{ ! 6778: * ! 6779: * BINARY ASTERISK (MULTIPLICATION) ! 6780: * ! 6781: {O$MLT{ENT{{{{ENTRY POINT ! 6782: {{JSR{ARITH{{{FETCH ARITHMETIC OPERANDS ! 6783: {{ERR{026{MULTIPLICATION{{LEFT OPERAND IS NOT NUMERIC ! 6784: {{ERR{027{MULTIPLICATION{{RIGHT OPERAND IS NOT NUMERIC ! 6785: {{PPM{OMLT1{{{JUMP IF REAL OPERANDS ! 6786: * ! 6787: * HERE TO MULTIPLY TWO INTEGERS ! 6788: * ! 6789: {{MLI{4*ICVAL(R10){{{MULTIPLY LEFT OPERAND BY RIGHT ! 6790: {{INO{EXINT{{{RETURN INTEGER IF NO OVERFLOW ! 6791: {{ERB{028{MULTIPLICATION{{CAUSED INTEGER OVERFLOW ! 6792: * ! 6793: * HERE TO MULTIPLY TWO REALS ! 6794: * ! 6795: {OMLT1{MLR{4*RCVAL(R10){{{MULTIPLY LEFT OPERAND BY RIGHT ! 6796: {{RNO{EXREA{{{RETURN REAL IF NO OVERFLOW ! 6797: {{ERB{263{MULTIPLICATION{{CAUSED REAL OVERFLOW ! 6798: {{EJC{{{{ ! 6799: * ! 6800: * NAME REFERENCE ! 6801: * ! 6802: {O$NAM{ENT{{{{ENTRY POINT ! 6803: {{MOV{#4*NMSI${R6{{SET LENGTH OF NMBLK ! 6804: {{JSR{ALLOC{{{ALLOCATE NMBLK ! 6805: {{MOV{#B$NML{(R9){{SET NAME BLOCK CODE ! 6806: {{MOV{(SP)+{4*NMOFS(R9){{SET NAME OFFSET FROM OPERAND ! 6807: {{MOV{(SP)+{4*NMBAS(R9){{SET NAME BASE FROM OPERAND ! 6808: {{BRN{EXIXR{{{EXIT WITH RESULT IN XR ! 6809: {{EJC{{{{ ! 6810: * ! 6811: * NEGATION ! 6812: * ! 6813: * INITIAL ENTRY ! 6814: * ! 6815: {O$NTA{ENT{{{{ENTRY POINT ! 6816: {{LCW{R6{{{LOAD NEW FAILURE OFFSET ! 6817: {{MOV{FLPTR{-(SP){{STACK OLD FAILURE POINTER ! 6818: {{MOV{R6{-(SP){{STACK NEW FAILURE OFFSET ! 6819: {{MOV{SP{FLPTR{{SET NEW FAILURE POINTER ! 6820: {{BRN{EXITS{{{JUMP TO CONTINUE EXECUTION ! 6821: * ! 6822: * ENTRY AFTER SUCCESSFUL EVALUATION OF OPERAND ! 6823: * ! 6824: {O$NTB{ENT{{{{ENTRY POINT ! 6825: {{MOV{4*2(SP){FLPTR{{RESTORE OLD FAILURE POINTER ! 6826: {{BRN{EXFAL{{{AND FAIL ! 6827: * ! 6828: * ENTRY FOR FAILURE DURING OPERAND EVALUATION ! 6829: * ! 6830: {O$NTC{ENT{{{{ENTRY POINT ! 6831: {{ICA{SP{{{POP FAILURE OFFSET ! 6832: {{MOV{(SP)+{FLPTR{{RESTORE OLD FAILURE POINTER ! 6833: {{BRN{EXNUL{{{EXIT GIVING NULL RESULT ! 6834: {{EJC{{{{ ! 6835: * ! 6836: * USE OF UNDEFINED OPERATOR ! 6837: * ! 6838: {O$OUN{ENT{{{{ENTRY POINT ! 6839: {{ERB{029{UNDEFINED{{OPERATOR REFERENCED ! 6840: {{EJC{{{{ ! 6841: * ! 6842: * BINARY DOT (PATTERN ASSIGNMENT) ! 6843: * ! 6844: * THE PATTERN BUILT BY BINARY DOT IS A COMPOUND PATTERN. ! 6845: * SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR ! 6846: * DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED. ! 6847: * ! 6848: {O$PAS{ENT{{{{ENTRY POINT ! 6849: {{MOV{#P$PAC{R7{{LOAD PCODE FOR P$PAC NODE ! 6850: {{MOV{(SP)+{R8{{LOAD NAME OFFSET (PARM2) ! 6851: {{MOV{(SP)+{R9{{LOAD NAME BASE (PARM1) ! 6852: {{JSR{PBILD{{{BUILD P$PAC NODE ! 6853: {{MOV{R9{R10{{SAVE PTR TO NODE ! 6854: {{MOV{(SP){R9{{LOAD LEFT OPERAND ! 6855: {{JSR{GTPAT{{{CONVERT TO PATTERN ! 6856: {{ERR{030{PATTERN{{ASSIGNMENT LEFT OPERAND IS NOT PATTERN ! 6857: {{MOV{R9{(SP){{SAVE PTR TO LEFT OPERAND PATTERN ! 6858: {{MOV{#P$PAA{R7{{SET PCODE FOR P$PAA NODE ! 6859: {{JSR{PBILD{{{BUILD P$PAA NODE ! 6860: {{MOV{(SP)+{4*PTHEN(R9){{SET LEFT OPERAND AS P$PAA SUCCESSOR ! 6861: {{JSR{PCONC{{{CONCATENATE TO FORM FINAL PATTERN ! 6862: {{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD ! 6863: {{EJC{{{{ ! 6864: * ! 6865: * PATTERN MATCH (BY NAME, FOR REPLACEMENT) ! 6866: * ! 6867: {O$PMN{ENT{{{{ENTRY POINT ! 6868: {{ZER{R7{{{SET TYPE CODE FOR MATCH BY NAME ! 6869: {{BRN{MATCH{{{JUMP TO ROUTINE TO START MATCH ! 6870: {{EJC{{{{ ! 6871: * ! 6872: * PATTERN MATCH (STATEMENT) ! 6873: * ! 6874: * O$PMS IS USED IN PLACE OF O$PMV WHEN THE PATTERN MATCH ! 6875: * OCCURS AT THE OUTER (STATEMENT) LEVEL SINCE IN THIS ! 6876: * CASE THE SUBSTRING VALUE NEED NOT BE CONSTRUCTED. ! 6877: * ! 6878: {O$PMS{ENT{{{{ENTRY POINT ! 6879: {{MOV{#NUM02{R7{{SET FLAG FOR STATEMENT TO MATCH ! 6880: {{BRN{MATCH{{{JUMP TO ROUTINE TO START MATCH ! 6881: {{EJC{{{{ ! 6882: * ! 6883: * PATTERN MATCH (BY VALUE) ! 6884: * ! 6885: {O$PMV{ENT{{{{ENTRY POINT ! 6886: {{MOV{#NUM01{R7{{SET TYPE CODE FOR VALUE MATCH ! 6887: {{BRN{MATCH{{{JUMP TO ROUTINE TO START MATCH ! 6888: {{EJC{{{{ ! 6889: * ! 6890: * POP TOP ITEM ON STACK ! 6891: * ! 6892: {O$POP{ENT{{{{ENTRY POINT ! 6893: {{ICA{SP{{{POP TOP STACK ENTRY ! 6894: {{BRN{EXITS{{{OBEY NEXT CODE WORD ! 6895: {{EJC{{{{ ! 6896: * ! 6897: * TERMINATE EXECUTION (CODE COMPILED FOR END STATEMENT) ! 6898: * ! 6899: {O$STP{ENT{{{{ENTRY POINT ! 6900: {{BRN{LEND0{{{JUMP TO END CIRCUIT ! 6901: {{EJC{{{{ ! 6902: * ! 6903: * RETURN NAME FROM EXPRESSION ! 6904: * THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN ! 6905: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS ! 6906: * A NAME. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX. ! 6907: * ! 6908: {O$RNM{ENT{{{{ENTRY POINT ! 6909: {{BRN{EVLX4{{{RETURN TO EVALX PROCEDURE ! 6910: {{EJC{{{{ ! 6911: * ! 6912: * PATTERN REPLACEMENT ! 6913: * ! 6914: * WHEN THIS ROUTINE GETS CONTROL, THE FOLLOWING STACK ! 6915: * ENTRIES HAVE BEEN MADE (SEE END OF MATCH ROUTINE P$NTH) ! 6916: * ! 6917: * SUBJECT NAME BASE ! 6918: * SUBJECT NAME OFFSET ! 6919: * INITIAL CURSOR VALUE ! 6920: * FINAL CURSOR VALUE ! 6921: * SUBJECT POINTER ! 6922: * (XS) ---------------- REPLACEMENT VALUE ! 6923: * ! 6924: {O$RPL{ENT{{{{ENTRY POINT ! 6925: {{JSR{GTSTG{{{CONVERT REPLACEMENT VAL TO STRING ! 6926: {{ERR{031{PATTERN{{REPLACEMENT RIGHT OPERAND IS NOT STRING ! 6927: * ! 6928: * GET RESULT LENGTH AND ALLOCATE RESULT SCBLK ! 6929: * ! 6930: {{MOV{(SP){R10{{LOAD SUBJECT STRING POINTER ! 6931: {{BEQ{(R10){#B$BCT{ORPL4{BRANCH IF BUFFER ASSIGNMENT ! 6932: {{ADD{4*SCLEN(R10){R6{{ADD SUBJECT STRING LENGTH ! 6933: {{ADD{4*2(SP){R6{{ADD STARTING CURSOR ! 6934: {{SUB{4*1(SP){R6{{MINUS FINAL CURSOR = TOTAL LENGTH ! 6935: {{BZE{R6{ORPL3{{JUMP IF RESULT IS NULL ! 6936: {{MOV{R9{-(SP){{RESTACK REPLACEMENT STRING ! 6937: {{JSR{ALOCS{{{ALLOCATE SCBLK FOR RESULT ! 6938: {{MOV{4*3(SP){R6{{GET INITIAL CURSOR (PART 1 LEN) ! 6939: {{MOV{R9{4*3(SP){{STACK RESULT POINTER ! 6940: {{PSC{R9{{{POINT TO CHARACTERS OF RESULT ! 6941: * ! 6942: * MOVE PART 1 (START OF SUBJECT) TO RESULT ! 6943: * ! 6944: {{BZE{R6{ORPL1{{JUMP IF FIRST PART IS NULL ! 6945: {{MOV{4*1(SP){R10{{ELSE POINT TO SUBJECT STRING ! 6946: {{PLC{R10{{{POINT TO SUBJECT STRING CHARS ! 6947: {{MVC{{{{MOVE FIRST PART TO RESULT ! 6948: {{EJC{{{{ ! 6949: * PATTERN REPLACEMENT (CONTINUED) ! 6950: * ! 6951: * NOW MOVE IN REPLACEMENT VALUE ! 6952: * ! 6953: {ORPL1{MOV{(SP)+{R10{{LOAD REPLACEMENT STRING, POP ! 6954: {{MOV{4*SCLEN(R10){R6{{LOAD LENGTH ! 6955: {{BZE{R6{ORPL2{{JUMP IF NULL REPLACEMENT ! 6956: {{PLC{R10{{{ELSE POINT TO CHARS OF REPLACEMENT ! 6957: {{MVC{{{{MOVE IN CHARS (PART 2) ! 6958: * ! 6959: * NOW MOVE IN REMAINDER OF STRING (PART 3) ! 6960: * ! 6961: {ORPL2{MOV{(SP)+{R10{{LOAD SUBJECT STRING POINTER, POP ! 6962: {{MOV{(SP)+{R8{{LOAD FINAL CURSOR, POP ! 6963: {{MOV{4*SCLEN(R10){R6{{LOAD SUBJECT STRING LENGTH ! 6964: {{SUB{R8{R6{{MINUS FINAL CURSOR = PART 3 LENGTH ! 6965: {{BZE{R6{OASS0{{JUMP TO ASSIGN IF PART 3 IS NULL ! 6966: {{PLC{R10{R8{{ELSE POINT TO LAST PART OF STRING ! 6967: {{MVC{{{{MOVE PART 3 TO RESULT ! 6968: {{BRN{OASS0{{{JUMP TO PERFORM ASSIGNMENT ! 6969: * ! 6970: * HERE IF RESULT IS NULL ! 6971: * ! 6972: {ORPL3{ADD{#4*NUM02{SP{{POP SUBJECT STR PTR, FINAL CURSOR ! 6973: {{MOV{#NULLS{(SP){{SET NULL RESULT ! 6974: {{BRN{OASS0{{{JUMP TO ASSIGN NULL VALUE ! 6975: * ! 6976: * HERE FOR BUFFER SUBSTRING ASSIGNMENT ! 6977: * ! 6978: {ORPL4{MOV{R9{R10{{COPY SCBLK REPLACEMENT PTR ! 6979: {{MOV{(SP)+{R9{{UNSTACK BCBLK PTR ! 6980: {{MOV{(SP)+{R7{{GET FINAL CURSOR VALUE ! 6981: {{MOV{(SP)+{R6{{GET INITIAL CURSOR ! 6982: {{SUB{R6{R7{{GET LENGTH IN WB ! 6983: {{ADD{#4*NUM02{SP{{GET RID OF NAME BASE/OFFSET ! 6984: {{JSR{INSBF{{{INSERT SUBSTRING ! 6985: {{PPM{{{{CONVERT FAIL IMPOSSIBLE ! 6986: {{PPM{EXFAL{{{FAIL IF INSERT FAILS ! 6987: {{BRN{EXNUL{{{ELSE NULL RESULT ! 6988: {{EJC{{{{ ! 6989: * ! 6990: * RETURN VALUE FROM EXPRESSION ! 6991: * ! 6992: * THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN ! 6993: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS ! 6994: * A VALUE. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX ! 6995: * ! 6996: {O$RVL{ENT{{{{ENTRY POINT ! 6997: {{BRN{EVLX3{{{RETURN TO EVALX PROCEDURE ! 6998: {{EJC{{{{ ! 6999: * ! 7000: * SELECTION ! 7001: * ! 7002: * INITIAL ENTRY ! 7003: * ! 7004: {O$SLA{ENT{{{{ENTRY POINT ! 7005: {{LCW{R6{{{LOAD NEW FAILURE OFFSET ! 7006: {{MOV{FLPTR{-(SP){{STACK OLD FAILURE POINTER ! 7007: {{MOV{R6{-(SP){{STACK NEW FAILURE OFFSET ! 7008: {{MOV{SP{FLPTR{{SET NEW FAILURE POINTER ! 7009: {{BRN{EXITS{{{JUMP TO EXECUTE FIRST ALTERNATIVE ! 7010: * ! 7011: * ENTRY AFTER SUCCESSFUL EVALUATION OF ALTERNATIVE ! 7012: * ! 7013: {O$SLB{ENT{{{{ENTRY POINT ! 7014: {{MOV{(SP)+{R9{{LOAD RESULT ! 7015: {{ICA{SP{{{POP FAIL OFFSET ! 7016: {{MOV{(SP){FLPTR{{RESTORE OLD FAILURE POINTER ! 7017: {{MOV{R9{(SP){{RESTACK RESULT ! 7018: {{LCW{R6{{{LOAD NEW CODE OFFSET ! 7019: {{ADD{R$COD{R6{{POINT TO ABSOLUTE CODE LOCATION ! 7020: {{LCP{R6{{{SET NEW CODE POINTER ! 7021: {{BRN{EXITS{{{JUMP TO CONTINUE PAST SELECTION ! 7022: * ! 7023: * ENTRY AT START OF SUBSEQUENT ALTERNATIVES ! 7024: * ! 7025: {O$SLC{ENT{{{{ENTRY POINT ! 7026: {{LCW{R6{{{LOAD NEW FAIL OFFSET ! 7027: {{MOV{R6{(SP){{STORE NEW FAIL OFFSET ! 7028: {{BRN{EXITS{{{JUMP TO EXECUTE NEXT ALTERNATIVE ! 7029: * ! 7030: * ENTRY AT START OF LAST ALTERNATIVE ! 7031: * ! 7032: {O$SLD{ENT{{{{ENTRY POINT ! 7033: {{ICA{SP{{{POP FAILURE OFFSET ! 7034: {{MOV{(SP)+{FLPTR{{RESTORE OLD FAILURE POINTER ! 7035: {{BRN{EXITS{{{JUMP TO EXECUTE LAST ALTERNATIVE ! 7036: {{EJC{{{{ ! 7037: * ! 7038: * BINARY MINUS (SUBTRACTION) ! 7039: * ! 7040: {O$SUB{ENT{{{{ENTRY POINT ! 7041: {{JSR{ARITH{{{FETCH ARITHMETIC OPERANDS ! 7042: {{ERR{032{SUBTRACTION{{LEFT OPERAND IS NOT NUMERIC ! 7043: {{ERR{033{SUBTRACTION{{RIGHT OPERAND IS NOT NUMERIC ! 7044: {{PPM{OSUB1{{{JUMP IF REAL OPERANDS ! 7045: * ! 7046: * HERE TO SUBTRACT TWO INTEGERS ! 7047: * ! 7048: {{SBI{4*ICVAL(R10){{{SUBTRACT RIGHT OPERAND FROM LEFT ! 7049: {{INO{EXINT{{{RETURN INTEGER IF NO OVERFLOW ! 7050: {{ERB{034{SUBTRACTION{{CAUSED INTEGER OVERFLOW ! 7051: * ! 7052: * HERE TO SUBTRACT TWO REALS ! 7053: * ! 7054: {OSUB1{SBR{4*RCVAL(R10){{{SUBTRACT RIGHT OPERAND FROM LEFT ! 7055: {{RNO{EXREA{{{RETURN REAL IF NO OVERFLOW ! 7056: {{ERB{264{SUBTRACTION{{CAUSED REAL OVERFLOW ! 7057: {{EJC{{{{ ! 7058: * ! 7059: * DUMMY OPERATOR TO RETURN CONTROL TO TRXEQ PROCEDURE ! 7060: * ! 7061: {O$TXR{ENT{{{{ENTRY POINT ! 7062: {{BRN{TRXQ1{{{JUMP INTO TRXEQ PROCEDURE ! 7063: {{EJC{{{{ ! 7064: * ! 7065: * UNEXPECTED FAILURE ! 7066: * ! 7067: * NOTE THAT IF A SETEXIT TRAP IS OPERATING THEN ! 7068: * TRANSFER TO SYSTEM LABEL CONTINUE ! 7069: * WILL RESULT IN LOOPING HERE. DIFFICULT TO AVOID EXCEPT ! 7070: * WITH A CONSIDERABLE OVERHEAD WHICH IS NOT WORTHWHILE OR ! 7071: * ELSE BY A TECHNIQUE SUCH AS SETTING KVERL TO ZERO. ! 7072: * ! 7073: {O$UNF{ENT{{{{ENTRY POINT ! 7074: {{ERB{035{UNEXPECTED{{FAILURE IN -NOFAIL MODE ! 7075: {{TTL{S{{{P I T B O L -- SNOBOL4 BUILTIN LABEL ROUTINES ! 7076: * ! 7077: * THE FOLLOWING SECTION CONTAINS THE ROUTINES FOR LABELS ! 7078: * WHICH HAVE A PREDEFINED MEANING IN SNOBOL4. ! 7079: * ! 7080: * CONTROL IS PASSED DIRECTLY TO THE LABEL NAME ENTRY POINT. ! 7081: * ! 7082: * ENTRY NAMES ARE OF THE FORM L$XXX WHERE XXX IS THE THREE ! 7083: * LETTER VARIABLE NAME IDENTIFIER. ! 7084: * ! 7085: * ENTRIES ARE IN ALPHABETICAL ORDER ! 7086: {{EJC{{{{ ! 7087: * ! 7088: * ABORT ! 7089: * ! 7090: {L$ABO{ENT{{{{ENTRY POINT ! 7091: * ! 7092: * MERGE HERE IF EXECUTION TERMINATES IN ERROR ! 7093: * ! 7094: {LABO1{MOV{KVERT{R6{{LOAD ERROR CODE ! 7095: {{BZE{R6{LABO2{{JUMP IF NO ERROR HAS OCCURED ! 7096: {{JSR{SYSAX{{{CALL AFTER EXECUTION PROC (REG04) ! 7097: {{JSR{PRTPG{{{ELSE EJECT PRINTER ! 7098: {{JSR{ERMSG{{{PRINT ERROR MESSAGE ! 7099: {{ZER{R9{{{INDICATE NO MESSAGE TO PRINT ! 7100: {{BRN{STOPR{{{JUMP TO ROUTINE TO STOP RUN ! 7101: * ! 7102: * HERE IF NO ERROR HAD OCCURED ! 7103: * ! 7104: {LABO2{ERB{036{GOTO{{ABORT WITH NO PRECEDING ERROR ! 7105: {{EJC{{{{ ! 7106: * ! 7107: * CONTINUE ! 7108: * ! 7109: {L$CNT{ENT{{{{ENTRY POINT ! 7110: * ! 7111: * MERGE HERE AFTER EXECUTION ERROR ! 7112: * ! 7113: {LCNT1{MOV{R$CNT{R9{{LOAD CONTINUATION CODE BLOCK PTR ! 7114: {{BZE{R9{LCNT2{{JUMP IF NO PREVIOUS ERROR ! 7115: {{ZER{R$CNT{{{CLEAR FLAG ! 7116: {{MOV{R9{R$COD{{ELSE STORE AS NEW CODE BLOCK PTR ! 7117: {{ADD{STXOF{R9{{ADD FAILURE OFFSET ! 7118: {{LCP{R9{{{LOAD CODE POINTER ! 7119: {{MOV{FLPTR{SP{{RESET STACK POINTER ! 7120: {{BRN{EXITS{{{JUMP TO TAKE INDICATED FAILURE ! 7121: * ! 7122: * HERE IF NO PREVIOUS ERROR ! 7123: * ! 7124: {LCNT2{ERB{037{GOTO{{CONTINUE WITH NO PRECEDING ERROR ! 7125: {{EJC{{{{ ! 7126: * ! 7127: * END ! 7128: * ! 7129: {L$END{ENT{{{{ENTRY POINT ! 7130: * ! 7131: * MERGE HERE FROM END CODE CIRCUIT ! 7132: * ! 7133: {LEND0{MOV{#ENDMS{R9{{POINT TO MESSAGE /NORMAL TERM../ ! 7134: {{BRN{STOPR{{{JUMP TO ROUTINE TO STOP RUN ! 7135: {{EJC{{{{ ! 7136: * ! 7137: * FRETURN ! 7138: * ! 7139: {L$FRT{ENT{{{{ENTRY POINT ! 7140: {{MOV{#SCFRT{R6{{POINT TO STRING /FRETURN/ ! 7141: {{BRN{RETRN{{{JUMP TO COMMON RETURN ROUTINE ! 7142: {{EJC{{{{ ! 7143: * ! 7144: * NRETURN ! 7145: * ! 7146: {L$NRT{ENT{{{{ENTRY POINT ! 7147: {{MOV{#SCNRT{R6{{POINT TO STRING /NRETURN/ ! 7148: {{BRN{RETRN{{{JUMP TO COMMON RETURN ROUTINE ! 7149: {{EJC{{{{ ! 7150: * ! 7151: * RETURN ! 7152: * ! 7153: {L$RTN{ENT{{{{ENTRY POINT ! 7154: {{MOV{#SCRTN{R6{{POINT TO STRING /RETURN/ ! 7155: {{BRN{RETRN{{{JUMP TO COMMON RETURN ROUTINE ! 7156: {{EJC{{{{ ! 7157: * ! 7158: * UNDEFINED LABEL ! 7159: * ! 7160: {L$UND{ENT{{{{ENTRY POINT ! 7161: {{ERB{038{GOTO{{UNDEFINED LABEL ! 7162: {{TTL{S{{{P I T B O L -- BLOCK ACTION ROUTINES ! 7163: * ! 7164: * THE FIRST WORD OF EVERY BLOCK IN DYNAMIC STORAGE AND THE ! 7165: * VRGET, VRSTO AND VRTRA FIELDS OF A VRBLK CONTAIN A ! 7166: * POINTER TO AN ENTRY POINT IN THE PROGRAM. ALL SUCH ENTRY ! 7167: * POINTS ARE IN THE FOLLOWING SECTION EXCEPT THOSE FOR ! 7168: * PATTERN BLOCKS WHICH ARE IN THE PATTERN MATCHING SEGMENT ! 7169: * LATER ON (LABELS OF THE FORM P$XXX), AND DOPE VECTORS ! 7170: * (D$XXX) WHICH ARE IN THE DOPE VECTOR SECTION FOLLOWING ! 7171: * THE PATTERN ROUTINES (DOPE VECTORS ARE USED FOR CMBLKS). ! 7172: * ! 7173: * THE ENTRY POINTS IN THIS SECTION HAVE LABELS OF THE ! 7174: * FORM B$XXY WHERE XX IS THE TWO CHARACTER BLOCK TYPE FOR ! 7175: * THE CORRESPONDING BLOCK AND Y IS ANY LETTER. ! 7176: * ! 7177: * IN SOME CASES, THE POINTERS SERVE NO OTHER PURPOSE THAN ! 7178: * TO IDENTIFY THE BLOCK TYPE. IN THIS CASE THE ROUTINE ! 7179: * IS NEVER EXECUTED AND THUS NO CODE IS ASSEMBLED. ! 7180: * ! 7181: * FOR EACH OF THESE ENTRY POINTS CORRESPONDING TO A BLOCK ! 7182: * AN ENTRY POINT IDENTIFICATION IS ASSEMBLED (BL$XX). ! 7183: * ! 7184: * THE EXACT ENTRY CONDITIONS DEPEND ON THE MANNER IN ! 7185: * WHICH THE ROUTINE IS ACCESSED AND ARE DOCUMENTED WITH ! 7186: * THE INDIVIDUAL ROUTINES AS REQUIRED. ! 7187: * ! 7188: * THE ORDER OF THESE ROUTINES IS ALPHABETICAL WITH THE ! 7189: * FOLLOWING EXCEPTIONS. ! 7190: * ! 7191: * THE ROUTINES FOR SEBLK AND EXBLK ENTRIES OCCUR FIRST SO ! 7192: * THAT EXPRESSIONS CAN BE QUICKLY IDENTIFIED FROM THE FACT ! 7193: * THAT THEIR ROUTINES LIE BEFORE THE SYMBOL B$E$$. ! 7194: * ! 7195: * THESE ARE IMMEDIATELY FOLLOWED BY THE ROUTINE FOR A TRBLK ! 7196: * SO THAT THE TEST AGAINST THE SYMBOL B$T$$ CHECKS FOR ! 7197: * TRAPPED VALUES OR EXPRESSION VALUES (SEE PROCEDURE EVALP) ! 7198: * ! 7199: * THE PATTERN ROUTINES LIE AFTER THIS SECTION SO THAT ! 7200: * PATTERNS ARE IDENTIFIED WITH ROUTINES STARTING AT OR ! 7201: * AFTER THE INITIAL INSTRUCTION IN THESE ROUTINES (P$AAA). ! 7202: * ! 7203: * THE SYMBOL B$AAA DEFINES THE FIRST LOCATION FOR BLOCK ! 7204: * ROUTINES AND THE SYMBOL P$YYY (AT THE END OF THE PATTERN ! 7205: * MATCH ROUTINES SECTION) DEFINES THE LAST SUCH ENTRY POINT ! 7206: * ! 7207: {B$AAA{ENT{BL$$I{{{ENTRY POINT OF FIRST BLOCK ROUTINE ! 7208: {{EJC{{{{ ! 7209: * ! 7210: * EXBLK ! 7211: * ! 7212: * THE ROUTINE FOR AN EXBLK LOADS THE EXPRESSION ONTO ! 7213: * THE STACK AS A VALUE. ! 7214: * ! 7215: * (XR) POINTER TO EXBLK ! 7216: * ! 7217: {B$EXL{ENT{BL$EX{{{ENTRY POINT (EXBLK) ! 7218: {{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD ! 7219: {{EJC{{{{ ! 7220: * ! 7221: * SEBLK ! 7222: * ! 7223: * THE ROUTINE FOR SEBLK IS ACCESSED FROM THE GENERATED ! 7224: * CODE TO LOAD THE EXPRESSION VALUE ONTO THE STACK. ! 7225: * ! 7226: {B$SEL{ENT{BL$SE{{{ENTRY POINT (SEBLK) ! 7227: {{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD ! 7228: * ! 7229: * DEFINE SYMBOL WHICH MARKS END OF ENTRIES FOR EXPRESSIONS ! 7230: * ! 7231: {B$E$${ENT{BL$$I{{{ENTRY POINT ! 7232: {{EJC{{{{ ! 7233: * ! 7234: * TRBLK ! 7235: * ! 7236: * THE ROUTINE FOR A TRBLK IS NEVER EXECUTED ! 7237: * ! 7238: {B$TRT{ENT{BL$TR{{{ENTRY POINT (TRBLK) ! 7239: * ! 7240: * DEFINE SYMBOL MARKING END OF TRAP AND EXPRESSION BLOCKS ! 7241: * ! 7242: {B$T$${ENT{BL$$I{{{END OF TRBLK,SEBLK,EXBLK ENTRIES ! 7243: {{EJC{{{{ ! 7244: * ! 7245: * ARBLK ! 7246: * ! 7247: * THE ROUTINE FOR ARBLK IS NEVER EXECUTED ! 7248: * ! 7249: {B$ART{ENT{BL$AR{{{ENTRY POINT (ARBLK) ! 7250: {{EJC{{{{ ! 7251: * ! 7252: * BCBLK ! 7253: * ! 7254: * THE ROUTINE FOR A BCBLK IS NEVER EXECUTED ! 7255: * ! 7256: * (XR) POINTER TO BCBLK ! 7257: * ! 7258: {B$BCT{ENT{BL$BC{{{ENTRY POINT (BCBLK) ! 7259: {{EJC{{{{ ! 7260: * ! 7261: * BFBLK ! 7262: * ! 7263: * THE ROUTINE FOR A BFBLK IS NEVER EXECUTED ! 7264: * ! 7265: * (XR) POINTER TO BFBLK ! 7266: * ! 7267: {B$BFT{ENT{BL$BF{{{ENTRY POINT (BFBLK) ! 7268: {{EJC{{{{ ! 7269: * ! 7270: * CCBLK ! 7271: * ! 7272: * THE ROUTINE FOR CCBLK IS NEVER ENTERED ! 7273: * ! 7274: {B$CCT{ENT{BL$CC{{{ENTRY POINT (CCBLK) ! 7275: {{EJC{{{{ ! 7276: * ! 7277: * CDBLK ! 7278: * ! 7279: * THE CDBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE. ! 7280: * THERE ARE TWO CASES DEPENDING ON THE FORM OF CDFAL. ! 7281: * ! 7282: * ENTRY FOR COMPLEX FAILURE CODE AT CDFAL ! 7283: * ! 7284: * (XR) POINTER TO CDBLK ! 7285: * ! 7286: {B$CDC{ENT{BL$CD{{{ENTRY POINT (CDBLK) ! 7287: {BCDC0{MOV{FLPTR{SP{{POP GARBAGE OFF STACK ! 7288: {{MOV{4*CDFAL(R9){(SP){{SET FAILURE OFFSET ! 7289: {{BRN{STMGO{{{ENTER STMT ! 7290: {{EJC{{{{ ! 7291: * ! 7292: * CDBLK (CONTINUED) ! 7293: * ! 7294: * ENTRY FOR SIMPLE FAILURE CODE AT CDFAL ! 7295: * ! 7296: * (XR) POINTER TO CDBLK ! 7297: * ! 7298: {B$CDS{ENT{BL$CD{{{ENTRY POINT (CDBLK) ! 7299: {BCDS0{MOV{FLPTR{SP{{POP GARBAGE OFF STACK ! 7300: {{MOV{#4*CDFAL{(SP){{SET FAILURE OFFSET ! 7301: {{BRN{STMGO{{{ENTER STMT ! 7302: {{EJC{{{{ ! 7303: * ! 7304: * CMBLK ! 7305: * ! 7306: * THE ROUTINE FOR A CMBLK IS NEVER EXECUTED ! 7307: * ! 7308: {B$CMT{ENT{BL$CM{{{ENTRY POINT (CMBLK) ! 7309: {{EJC{{{{ ! 7310: * ! 7311: * CTBLK ! 7312: * ! 7313: * THE ROUTINE FOR A CTBLK IS NEVER EXECUTED ! 7314: * ! 7315: {B$CTT{ENT{BL$CT{{{ENTRY POINT (CTBLK) ! 7316: {{EJC{{{{ ! 7317: * ! 7318: * DFBLK ! 7319: * ! 7320: * THE ROUTINE FOR A DFBLK IS ACCESSED FROM THE O$FNC ENTRY ! 7321: * TO CALL A DATATYPE FUNCTION AND BUILD A PDBLK. ! 7322: * ! 7323: * (XL) POINTER TO DFBLK ! 7324: * ! 7325: {B$DFC{ENT{BL$DF{{{ENTRY POINT ! 7326: {{MOV{4*DFPDL(R10){R6{{LOAD LENGTH OF PDBLK ! 7327: {{JSR{ALLOC{{{ALLOCATE PDBLK ! 7328: {{MOV{#B$PDT{(R9){{STORE TYPE WORD ! 7329: {{MOV{R10{4*PDDFP(R9){{STORE DFBLK POINTER ! 7330: {{MOV{R9{R8{{SAVE POINTER TO PDBLK ! 7331: {{ADD{R6{R9{{POINT PAST PDBLK ! 7332: {{LCT{R6{4*FARGS(R10){{SET TO COUNT FIELDS ! 7333: * ! 7334: * LOOP TO ACQUIRE FIELD VALUES FROM STACK ! 7335: * ! 7336: {BDFC1{MOV{(SP)+{-(R9){{MOVE A FIELD VALUE ! 7337: {{BCT{R6{BDFC1{{LOOP TILL ALL MOVED ! 7338: {{MOV{R8{R9{{RECALL POINTER TO PDBLK ! 7339: {{BRN{EXSID{{{EXIT SETTING ID FIELD ! 7340: {{EJC{{{{ ! 7341: * ! 7342: * EFBLK ! 7343: * ! 7344: * THE ROUTINE FOR AN EFBLK IS PASSED CONTROL FORM THE O$FNC ! 7345: * ENTRY TO CALL AN EXTERNAL FUNCTION. ! 7346: * ! 7347: * (XL) POINTER TO EFBLK ! 7348: * ! 7349: {B$EFC{ENT{BL$EF{{{ENTRY POINT (EFBLK) ! 7350: {{MOV{4*FARGS(R10){R8{{LOAD NUMBER OF ARGUMENTS ! 7351: {{WTB{R8{{{CONVERT TO OFFSET ! 7352: {{MOV{R10{-(SP){{SAVE POINTER TO EFBLK ! 7353: {{MOV{SP{R10{{COPY POINTER TO ARGUMENTS ! 7354: * ! 7355: * LOOP TO CONVERT ARGUMENTS ! 7356: * ! 7357: {BEFC1{ICA{R10{{{POINT TO NEXT ENTRY ! 7358: {{MOV{(SP){R9{{LOAD POINTER TO EFBLK ! 7359: {{DCA{R8{{{DECREMENT EFTAR OFFSET ! 7360: {{ADD{R8{R9{{POINT TO NEXT EFTAR ENTRY ! 7361: {{MOV{4*EFTAR(R9){R9{{LOAD EFTAR ENTRY ! 7362: {{BSW{R9{4{{SWITCH ON TYPE ! 7363: {{IFF{0{BEFC7{{NO CONVERSION NEEDED ! 7364: {{IFF{1{BEFC2{{STRING ! 7365: {{IFF{2{BEFC3{{INTEGER ! 7366: {{IFF{3{BEFC4{{REAL ! 7367: {{ESW{{{{END OF SWITCH ON TYPE ! 7368: * ! 7369: * HERE TO CONVERT TO STRING ! 7370: * ! 7371: {BEFC2{MOV{(R10){-(SP){{STACK ARG PTR ! 7372: {{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING ! 7373: {{ERR{039{EXTERNAL{{FUNCTION ARGUMENT IS NOT STRING ! 7374: {{BRN{BEFC6{{{JUMP TO MERGE ! 7375: {{EJC{{{{ ! 7376: * ! 7377: * EFBLK (CONTINUED) ! 7378: * ! 7379: * HERE TO CONVERT AN INTEGER ! 7380: * ! 7381: {BEFC3{MOV{(R10){R9{{LOAD NEXT ARGUMENT ! 7382: {{MOV{R8{BEFOF{{SAVE OFFSET ! 7383: {{JSR{GTINT{{{CONVERT TO INTEGER ! 7384: {{ERR{040{EXTERNAL{{FUNCTION ARGUMENT IS NOT INTEGER ! 7385: {{BRN{BEFC5{{{MERGE WITH REAL CASE ! 7386: * ! 7387: * HERE TO CONVERT A REAL ! 7388: * ! 7389: {BEFC4{MOV{(R10){R9{{LOAD NEXT ARGUMENT ! 7390: {{MOV{R8{BEFOF{{SAVE OFFSET ! 7391: {{JSR{GTREA{{{CONVERT TO REAL ! 7392: {{ERR{265{EXTERNAL{{FUNCTION ARGUMENT IS NOT REAL ! 7393: * ! 7394: * INTEGER CASE MERGES HERE ! 7395: * ! 7396: {BEFC5{MOV{BEFOF{R8{{RESTORE OFFSET ! 7397: * ! 7398: * STRING MERGES HERE ! 7399: * ! 7400: {BEFC6{MOV{R9{(R10){{STORE CONVERTED RESULT ! 7401: * ! 7402: * NO CONVERSION MERGES HERE ! 7403: * ! 7404: {BEFC7{BNZ{R8{BEFC1{{LOOP BACK IF MORE TO GO ! 7405: * ! 7406: * HERE AFTER CONVERTING ALL THE ARGUMENTS ! 7407: * ! 7408: {{MOV{(SP)+{R10{{RESTORE EFBLK POINTER ! 7409: {{MOV{4*FARGS(R10){R6{{GET NUMBER OF ARGS ! 7410: {{JSR{SYSEX{{{CALL ROUTINE TO CALL EXTERNAL FNC ! 7411: {{PPM{EXFAL{{{FAIL IF FAILURE ! 7412: {{EJC{{{{ ! 7413: * ! 7414: * EFBLK (CONTINUED) ! 7415: * ! 7416: * RETURN HERE WITH RESULT IN XR ! 7417: * ! 7418: * FIRST DEFEND AGAINST NON-STANDARD NULL STRING RETURNED ! 7419: * ! 7420: {{MOV{4*EFRSL(R10){R7{{GET RESULT TYPE ID ! 7421: {{BNZ{R7{BEFA8{{BRANCH IF NOT UNCONVERTED ! 7422: {{BNE{(R9){#B$SCL{BEFC8{JUMP IF NOT A STRING ! 7423: {{BZE{4*SCLEN(R9){EXNUL{{RETURN NULL IF NULL ! 7424: * ! 7425: * HERE IF CONVERTED RESULT TO CHECK FOR NULL STRING ! 7426: * ! 7427: {BEFA8{BNE{R7{#NUM01{BEFC8{JUMP IF NOT A STRING ! 7428: {{BZE{4*SCLEN(R9){EXNUL{{RETURN NULL IF NULL ! 7429: * ! 7430: * RETURN IF RESULT IS IN DYNAMIC STORAGE ! 7431: * ! 7432: {BEFC8{BLT{R9{DNAMB{BEFC9{JUMP IF NOT IN DYNAMIC STORAGE ! 7433: {{BLE{R9{DNAMP{EXIXR{RETURN RESULT IF ALREADY DYNAMIC ! 7434: * ! 7435: * HERE WE COPY A RESULT INTO THE DYNAMIC REGION ! 7436: * ! 7437: {BEFC9{MOV{(R9){R6{{GET POSSIBLE TYPE WORD ! 7438: {{BZE{R7{BEF11{{JUMP IF UNCONVERTED RESULT ! 7439: {{MOV{#B$SCL{R6{{STRING ! 7440: {{BEQ{R7{#NUM01{BEF10{YES JUMP ! 7441: {{MOV{#B$ICL{R6{{INTEGER ! 7442: {{BEQ{R7{#NUM02{BEF10{YES JUMP ! 7443: {{MOV{#B$RCL{R6{{REAL ! 7444: * ! 7445: * STORE TYPE WORD IN RESULT ! 7446: * ! 7447: {BEF10{MOV{R6{(R9){{STORED BEFORE COPYING TO DYNAMIC ! 7448: * ! 7449: * MERGE FOR UNCONVERTED RESULT ! 7450: * ! 7451: {BEF11{JSR{BLKLN{{{GET LENGTH OF BLOCK ! 7452: {{MOV{R9{R10{{COPY ADDRESS OF OLD BLOCK ! 7453: {{JSR{ALLOC{{{ALLOCATE DYNAMIC BLOCK SAME SIZE ! 7454: {{MOV{R9{-(SP){{SET POINTER TO NEW BLOCK AS RESULT ! 7455: {{MVW{{{{COPY OLD BLOCK TO DYNAMIC BLOCK ! 7456: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK ! 7457: {{EJC{{{{ ! 7458: * ! 7459: * EVBLK ! 7460: * ! 7461: * THE ROUTINE FOR AN EVBLK IS NEVER EXECUTED ! 7462: * ! 7463: {B$EVT{ENT{BL$EV{{{ENTRY POINT (EVBLK) ! 7464: {{EJC{{{{ ! 7465: * ! 7466: * FFBLK ! 7467: * ! 7468: * THE ROUTINE FOR AN FFBLK IS EXECUTED FROM THE O$FNC ENTRY ! 7469: * TO CALL A FIELD FUNCTION AND EXTRACT A FIELD VALUE/NAME. ! 7470: * ! 7471: * (XL) POINTER TO FFBLK ! 7472: * ! 7473: {B$FFC{ENT{BL$FF{{{ENTRY POINT (FFBLK) ! 7474: {{MOV{R10{R9{{COPY FFBLK POINTER ! 7475: {{LCW{R8{{{LOAD NEXT CODE WORD ! 7476: {{MOV{(SP){R10{{LOAD PDBLK POINTER ! 7477: {{BNE{(R10){#B$PDT{BFFC2{JUMP IF NOT PDBLK AT ALL ! 7478: {{MOV{4*PDDFP(R10){R6{{LOAD DFBLK POINTER FROM PDBLK ! 7479: * ! 7480: * LOOP TO FIND CORRECT FFBLK FOR THIS PDBLK ! 7481: * ! 7482: {BFFC1{BEQ{R6{4*FFDFP(R9){BFFC3{JUMP IF THIS IS THE CORRECT FFBLK ! 7483: {{MOV{4*FFNXT(R9){R9{{ELSE LINK TO NEXT FFBLK ON CHAIN ! 7484: {{BNZ{R9{BFFC1{{LOOP BACK IF ANOTHER ENTRY TO CHECK ! 7485: * ! 7486: * HERE FOR BAD ARGUMENT ! 7487: * ! 7488: {BFFC2{ERB{041{FIELD{{FUNCTION ARGUMENT IS WRONG DATATYPE ! 7489: {{EJC{{{{ ! 7490: * ! 7491: * FFBLK (CONTINUED) ! 7492: * ! 7493: * HERE AFTER LOCATING CORRECT FFBLK ! 7494: * ! 7495: {BFFC3{MOV{4*FFOFS(R9){R6{{LOAD FIELD OFFSET ! 7496: {{BEQ{R8{#OFNE${BFFC5{JUMP IF CALLED BY NAME ! 7497: {{ADD{R6{R10{{ELSE POINT TO VALUE FIELD ! 7498: {{MOV{(R10){R9{{LOAD VALUE ! 7499: {{BNE{(R9){#B$TRT{BFFC4{JUMP IF NOT TRAPPED ! 7500: {{SUB{R6{R10{{ELSE RESTORE NAME BASE,OFFSET ! 7501: {{MOV{R8{(SP){{SAVE NEXT CODE WORD OVER PDBLK PTR ! 7502: {{JSR{ACESS{{{ACCESS VALUE ! 7503: {{PPM{EXFAL{{{FAIL IF ACCESS FAILS ! 7504: {{MOV{(SP){R8{{RESTORE NEXT CODE WORD ! 7505: * ! 7506: * HERE AFTER GETTING VALUE IN (XR) ! 7507: * ! 7508: {BFFC4{MOV{R9{(SP){{STORE VALUE ON STACK (OVER PDBLK) ! 7509: {{MOV{R8{R9{{COPY NEXT CODE WORD ! 7510: {{MOV{(R9){R10{{LOAD ENTRY ADDRESS ! 7511: {{BRI{R10{{{JUMP TO ROUTINE FOR NEXT CODE WORD ! 7512: * ! 7513: * HERE IF CALLED BY NAME ! 7514: * ! 7515: {BFFC5{MOV{R6{-(SP){{STORE NAME OFFSET (BASE IS SET) ! 7516: {{BRN{EXITS{{{EXIT WITH NAME ON STACK ! 7517: {{EJC{{{{ ! 7518: * ! 7519: * ICBLK ! 7520: * ! 7521: * THE ROUTINE FOR ICBLK IS EXECUTED FROM THE GENERATED ! 7522: * CODE TO LOAD AN INTEGER VALUE ONTO THE STACK. ! 7523: * ! 7524: * (XR) POINTER TO ICBLK ! 7525: * ! 7526: {B$ICL{ENT{BL$IC{{{ENTRY POINT (ICBLK) ! 7527: {{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD ! 7528: {{EJC{{{{ ! 7529: * ! 7530: * KVBLK ! 7531: * ! 7532: * THE ROUTINE FOR A KVBLK IS NEVER EXECUTED. ! 7533: * ! 7534: {B$KVT{ENT{BL$KV{{{ENTRY POINT (KVBLK) ! 7535: {{EJC{{{{ ! 7536: * ! 7537: * NMBLK ! 7538: * ! 7539: * THE ROUTINE FOR A NMBLK IS EXECUTED FROM THE GENERATED ! 7540: * CODE FOR THE CASE OF LOADING A NAME ONTO THE STACK ! 7541: * WHERE THE NAME IS THAT OF A NATURAL VARIABLE WHICH CAN ! 7542: * BE PREEVALUATED AT COMPILE TIME. ! 7543: * ! 7544: * (XR) POINTER TO NMBLK ! 7545: * ! 7546: {B$NML{ENT{BL$NM{{{ENTRY POINT (NMBLK) ! 7547: {{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD ! 7548: {{EJC{{{{ ! 7549: * ! 7550: * PDBLK ! 7551: * ! 7552: * THE ROUTINE FOR A PDBLK IS NEVER EXECUTED ! 7553: * ! 7554: {B$PDT{ENT{BL$PD{{{ENTRY POINT (PDBLK) ! 7555: {{EJC{{{{ ! 7556: * ! 7557: * PFBLK ! 7558: * ! 7559: * THE ROUTINE FOR A PFBLK IS EXECUTED FROM THE ENTRY O$FNC ! 7560: * TO CALL A PROGRAM DEFINED FUNCTION. ! 7561: * ! 7562: * (XL) POINTER TO PFBLK ! 7563: * ! 7564: * THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING ! 7565: * CONTROL TO THE PROGRAM DEFINED FUNCTION. ! 7566: * ! 7567: * SAVED VALUE OF FIRST ARGUMENT ! 7568: * . ! 7569: * SAVED VALUE OF LAST ARGUMENT ! 7570: * SAVED VALUE OF FIRST LOCAL ! 7571: * . ! 7572: * SAVED VALUE OF LAST LOCAL ! 7573: * SAVED VALUE OF FUNCTION NAME ! 7574: * SAVED CODE BLOCK PTR (R$COD) ! 7575: * SAVED CODE POINTER (-R$COD) ! 7576: * SAVED VALUE OF FLPRT ! 7577: * SAVED VALUE OF FLPTR ! 7578: * POINTER TO PFBLK ! 7579: * FLPTR --------------- ZERO (TO BE OVERWRITTEN WITH OFFS) ! 7580: * ! 7581: {B$PFC{ENT{BL$PF{{{ENTRY POINT (PFBLK) ! 7582: {{MOV{R10{BPFPF{{SAVE PFBLK PTR (NEED NOT BE RELOC) ! 7583: {{MOV{R10{R9{{COPY FOR THE MOMENT ! 7584: {{MOV{4*PFVBL(R9){R10{{POINT TO VRBLK FOR FUNCTION ! 7585: * ! 7586: * LOOP TO FIND OLD VALUE OF FUNCTION ! 7587: * ! 7588: {BPF01{MOV{R10{R7{{SAVE POINTER ! 7589: {{MOV{4*VRVAL(R10){R10{{LOAD VALUE ! 7590: {{BEQ{(R10){#B$TRT{BPF01{LOOP IF TRBLK ! 7591: * ! 7592: * SET VALUE TO NULL AND SAVE OLD FUNCTION VALUE ! 7593: * ! 7594: {{MOV{R10{BPFSV{{SAVE OLD VALUE ! 7595: {{MOV{R7{R10{{POINT BACK TO BLOCK WITH VALUE ! 7596: {{MOV{#NULLS{4*VRVAL(R10){{SET VALUE TO NULL ! 7597: {{MOV{4*FARGS(R9){R6{{LOAD NUMBER OF ARGUMENTS ! 7598: {{ADD{#4*PFARG{R9{{POINT TO PFARG ENTRIES ! 7599: {{BZE{R6{BPF04{{JUMP IF NO ARGUMENTS ! 7600: {{MOV{SP{R10{{PTR TO LAST ARG ! 7601: {{WTB{R6{{{CONVERT NO. OF ARGS TO BYTES OFFSET ! 7602: {{ADD{R6{R10{{POINT BEFORE FIRST ARG ! 7603: {{MOV{R10{BPFXT{{REMEMBER ARG POINTER ! 7604: {{EJC{{{{ ! 7605: * ! 7606: * PFBLK (CONTINUED) ! 7607: * ! 7608: * LOOP TO SAVE OLD ARGUMENT VALUES AND SET NEW ONES ! 7609: * ! 7610: {BPF02{MOV{(R9)+{R10{{LOAD VRBLK PTR FOR NEXT ARGUMENT ! 7611: * ! 7612: * LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE ! 7613: * ! 7614: {BPF03{MOV{R10{R8{{SAVE POINTER ! 7615: {{MOV{4*VRVAL(R10){R10{{LOAD NEXT VALUE ! 7616: {{BEQ{(R10){#B$TRT{BPF03{LOOP BACK IF TRBLK ! 7617: * ! 7618: * SAVE OLD VALUE AND GET NEW VALUE ! 7619: * ! 7620: {{MOV{R10{R6{{KEEP OLD VALUE ! 7621: {{MOV{BPFXT{R10{{POINT BEFORE NEXT STACKED ARG ! 7622: {{MOV{-(R10){R7{{LOAD ARGUMENT (NEW VALUE) ! 7623: {{MOV{R6{(R10){{SAVE OLD VALUE ! 7624: {{MOV{R10{BPFXT{{KEEP ARG PTR FOR NEXT TIME ! 7625: {{MOV{R8{R10{{POINT BACK TO BLOCK WITH VALUE ! 7626: {{MOV{R7{4*VRVAL(R10){{SET NEW VALUE ! 7627: {{BNE{SP{BPFXT{BPF02{LOOP IF NOT ALL DONE ! 7628: * ! 7629: * NOW PROCESS LOCALS ! 7630: * ! 7631: {BPF04{MOV{BPFPF{R10{{RESTORE PFBLK POINTER ! 7632: {{MOV{4*PFNLO(R10){R6{{LOAD NUMBER OF LOCALS ! 7633: {{BZE{R6{BPF07{{JUMP IF NO LOCALS ! 7634: {{MOV{#NULLS{R7{{GET NULL CONSTANT ! 7635: {{LCT{R6{R6{{SET LOCAL COUNTER ! 7636: * ! 7637: * LOOP TO PROCESS LOCALS ! 7638: * ! 7639: {BPF05{MOV{(R9)+{R10{{LOAD VRBLK PTR FOR NEXT LOCAL ! 7640: * ! 7641: * LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE ! 7642: * ! 7643: {BPF06{MOV{R10{R8{{SAVE POINTER ! 7644: {{MOV{4*VRVAL(R10){R10{{LOAD NEXT VALUE ! 7645: {{BEQ{(R10){#B$TRT{BPF06{LOOP BACK IF TRBLK ! 7646: * ! 7647: * SAVE OLD VALUE AND SET NULL AS NEW VALUE ! 7648: * ! 7649: {{MOV{R10{-(SP){{STACK OLD VALUE ! 7650: {{MOV{R8{R10{{POINT BACK TO BLOCK WITH VALUE ! 7651: {{MOV{R7{4*VRVAL(R10){{SET NULL AS NEW VALUE ! 7652: {{BCT{R6{BPF05{{LOOP TILL ALL LOCALS PROCESSED ! 7653: {{EJC{{{{ ! 7654: * ! 7655: * PFBLK (CONTINUED) ! 7656: * ! 7657: * HERE AFTER PROCESSING ARGUMENTS AND LOCALS ! 7658: * ! 7659: {BPF07{ZER{R9{{{ZERO REG XR IN CASE ! 7660: {{BZE{KVPFL{BPF7C{{SKIP IF PROFILING IS OFF ! 7661: {{BEQ{KVPFL{#NUM02{BPF7A{BRANCH ON TYPE OF PROFILE ! 7662: * ! 7663: * HERE IF &PROFILE = 1 ! 7664: * ! 7665: {{JSR{SYSTM{{{GET CURRENT TIME ! 7666: {{STI{PFETM{{{SAVE FOR A SEC ! 7667: {{SBI{PFSTM{{{FIND TIME USED BY CALLER ! 7668: {{JSR{ICBLD{{{BUILD INTO AN ICBLK ! 7669: {{LDI{PFETM{{{RELOAD CURRENT TIME ! 7670: {{BRN{BPF7B{{{MERGE ! 7671: * ! 7672: * HERE IF &PROFILE = 2 ! 7673: * ! 7674: {BPF7A{LDI{PFSTM{{{GET START TIME OF CALLING STMT ! 7675: {{JSR{ICBLD{{{ASSEMBLE AN ICBLK ROUND IT ! 7676: {{JSR{SYSTM{{{GET NOW TIME ! 7677: * ! 7678: * BOTH TYPES OF PROFILE MERGE HERE ! 7679: * ! 7680: {BPF7B{STI{PFSTM{{{SET START TIME OF 1ST FUNC STMT ! 7681: {{MNZ{PFFNC{{{FLAG FUNCTION ENTRY ! 7682: * ! 7683: * NO PROFILING MERGES HERE ! 7684: * ! 7685: {BPF7C{MOV{R9{-(SP){{STACK ICBLK PTR (OR ZERO) ! 7686: {{MOV{R$COD{R6{{LOAD OLD CODE BLOCK POINTER ! 7687: {{SCP{R7{{{GET CODE POINTER ! 7688: {{SUB{R6{R7{{MAKE CODE POINTER INTO OFFSET ! 7689: {{MOV{BPFPF{R10{{RECALL PFBLK POINTER ! 7690: {{MOV{BPFSV{-(SP){{STACK OLD VALUE OF FUNCTION NAME ! 7691: {{MOV{R6{-(SP){{STACK CODE BLOCK POINTER ! 7692: {{MOV{R7{-(SP){{STACK CODE OFFSET ! 7693: {{MOV{FLPRT{-(SP){{STACK OLD FLPRT ! 7694: {{MOV{FLPTR{-(SP){{STACK OLD FAILURE POINTER ! 7695: {{MOV{R10{-(SP){{STACK POINTER TO PFBLK ! 7696: {{ZER{-(SP){{{DUMMY ZERO ENTRY FOR FAIL RETURN ! 7697: {{CHK{{{{CHECK FOR STACK OVERFLOW ! 7698: {{MOV{SP{FLPTR{{SET NEW FAIL RETURN VALUE ! 7699: {{MOV{SP{FLPRT{{SET NEW FLPRT ! 7700: {{MOV{KVTRA{R6{{LOAD TRACE VALUE ! 7701: {{ADD{KVFTR{R6{{ADD FTRACE VALUE ! 7702: {{BNZ{R6{BPF09{{JUMP IF TRACING POSSIBLE ! 7703: {{ICV{KVFNC{{{ELSE BUMP FNCLEVEL ! 7704: * ! 7705: * HERE TO ACTUALLY JUMP TO FUNCTION ! 7706: * ! 7707: {BPF08{MOV{4*PFCOD(R10){R9{{POINT TO CODE ! 7708: {{BRI{(R9){{{OFF TO EXECUTE FUNCTION ! 7709: * ! 7710: * HERE IF TRACING IS POSSIBLE ! 7711: * ! 7712: {BPF09{MOV{4*PFCTR(R10){R9{{LOAD POSSIBLE CALL TRACE TRBLK ! 7713: {{MOV{4*PFVBL(R10){R10{{LOAD VRBLK POINTER FOR FUNCTION ! 7714: {{MOV{#4*VRVAL{R6{{SET NAME OFFSET FOR VARIABLE ! 7715: {{BZE{KVTRA{BPF10{{JUMP IF TRACE MODE IS OFF ! 7716: {{BZE{R9{BPF10{{OR IF THERE IS NO CALL TRACE ! 7717: * ! 7718: * HERE IF CALL TRACED ! 7719: * ! 7720: {{DCV{KVTRA{{{DECREMENT TRACE COUNT ! 7721: {{BZE{4*TRFNC(R9){BPF11{{JUMP IF PRINT TRACE ! 7722: {{JSR{TRXEQ{{{EXECUTE FUNCTION TYPE TRACE ! 7723: {{EJC{{{{ ! 7724: * ! 7725: * PFBLK (CONTINUED) ! 7726: * ! 7727: * HERE TO TEST FOR FTRACE TRACE ! 7728: * ! 7729: {BPF10{BZE{KVFTR{BPF16{{JUMP IF FTRACE IS OFF ! 7730: {{DCV{KVFTR{{{ELSE DECREMENT FTRACE ! 7731: * ! 7732: * HERE FOR PRINT TRACE ! 7733: * ! 7734: {BPF11{JSR{PRTSN{{{PRINT STATEMENT NUMBER ! 7735: {{JSR{PRTNM{{{PRINT FUNCTION NAME ! 7736: {{MOV{#CH$PP{R6{{LOAD LEFT PAREN ! 7737: {{JSR{PRTCH{{{PRINT LEFT PAREN ! 7738: {{MOV{4*1(SP){R10{{RECOVER PFBLK POINTER ! 7739: {{BZE{4*FARGS(R10){BPF15{{SKIP IF NO ARGUMENTS ! 7740: {{ZER{R7{{{ELSE SET ARGUMENT COUNTER ! 7741: {{BRN{BPF13{{{JUMP INTO LOOP ! 7742: * ! 7743: * LOOP TO PRINT ARGUMENT VALUES ! 7744: * ! 7745: {BPF12{MOV{#CH$CM{R6{{LOAD COMMA ! 7746: {{JSR{PRTCH{{{PRINT TO SEPARATE FROM LAST ARG ! 7747: * ! 7748: * MERGE HERE FIRST TIME (NO COMMA REQUIRED) ! 7749: * ! 7750: {BPF13{MOV{R7{(SP){{SAVE ARG CTR (OVER FAILOFFS IS OK) ! 7751: {{WTB{R7{{{CONVERT TO BYTE OFFSET ! 7752: {{ADD{R7{R10{{POINT TO NEXT ARGUMENT POINTER ! 7753: {{MOV{4*PFARG(R10){R9{{LOAD NEXT ARGUMENT VRBLK PTR ! 7754: {{SUB{R7{R10{{RESTORE PFBLK POINTER ! 7755: {{MOV{4*VRVAL(R9){R9{{LOAD NEXT VALUE ! 7756: {{JSR{PRTVL{{{PRINT ARGUMENT VALUE ! 7757: {{EJC{{{{ ! 7758: * ! 7759: * HERE AFTER DEALING WITH ONE ARGUMENT ! 7760: * ! 7761: {{MOV{(SP){R7{{RESTORE ARGUMENT COUNTER ! 7762: {{ICV{R7{{{INCREMENT ARGUMENT COUNTER ! 7763: {{BLT{R7{4*FARGS(R10){BPF12{LOOP IF MORE TO PRINT ! 7764: * ! 7765: * MERGE HERE IN NO ARGS CASE TO PRINT PAREN ! 7766: * ! 7767: {BPF15{MOV{#CH$RP{R6{{LOAD RIGHT PAREN ! 7768: {{JSR{PRTCH{{{PRINT TO TERMINATE OUTPUT ! 7769: {{JSR{PRTNL{{{TERMINATE PRINT LINE ! 7770: * ! 7771: * MERGE HERE TO EXIT WITH TEST FOR FNCLEVEL TRACE ! 7772: * ! 7773: {BPF16{ICV{KVFNC{{{INCREMENT FNCLEVEL ! 7774: {{MOV{R$FNC{R10{{LOAD PTR TO POSSIBLE TRBLK ! 7775: {{JSR{KTREX{{{CALL KEYWORD TRACE ROUTINE ! 7776: * ! 7777: * CALL FUNCTION AFTER TRACE TESTS COMPLETE ! 7778: * ! 7779: {{MOV{4*1(SP){R10{{RESTORE PFBLK POINTER ! 7780: {{BRN{BPF08{{{JUMP BACK TO EXECUTE FUNCTION ! 7781: {{EJC{{{{ ! 7782: * ! 7783: * RCBLK ! 7784: * ! 7785: * THE ROUTINE FOR AN RCBLK IS EXECUTED FROM THE GENERATED ! 7786: * CODE TO LOAD A REAL VALUE ONTO THE STACK. ! 7787: * ! 7788: * (XR) POINTER TO RCBLK ! 7789: * ! 7790: {B$RCL{ENT{BL$RC{{{ENTRY POINT (RCBLK) ! 7791: {{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD ! 7792: {{EJC{{{{ ! 7793: * ! 7794: * SCBLK ! 7795: * ! 7796: * THE ROUTINE FOR AN SCBLK IS EXECUTED FROM THE GENERATED ! 7797: * CODE TO LOAD A STRING VALUE ONTO THE STACK. ! 7798: * ! 7799: * (XR) POINTER TO SCBLK ! 7800: * ! 7801: {B$SCL{ENT{BL$SC{{{ENTRY POINT (SCBLK) ! 7802: {{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD ! 7803: {{EJC{{{{ ! 7804: * ! 7805: * TBBLK ! 7806: * ! 7807: * THE ROUTINE FOR A TBBLK IS NEVER EXECUTED ! 7808: * ! 7809: {B$TBT{ENT{BL$TB{{{ENTRY POINT (TBBLK) ! 7810: {{EJC{{{{ ! 7811: * ! 7812: * TEBLK ! 7813: * ! 7814: * THE ROUTINE FOR A TEBLK IS NEVER EXECUTED ! 7815: * ! 7816: {B$TET{ENT{BL$TE{{{ENTRY POINT (TEBLK) ! 7817: {{EJC{{{{ ! 7818: * ! 7819: * VCBLK ! 7820: * ! 7821: * THE ROUTINE FOR A VCBLK IS NEVER EXECUTED ! 7822: * ! 7823: {B$VCT{ENT{BL$VC{{{ENTRY POINT (VCBLK) ! 7824: {{EJC{{{{ ! 7825: * ! 7826: * VRBLK ! 7827: * ! 7828: * THE VRBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE. ! 7829: * THERE ARE SIX ENTRIES FOR VRBLK COVERING VARIOUS CASES ! 7830: * ! 7831: {B$VR${ENT{BL$$I{{{MARK START OF VRBLK ENTRY POINTS ! 7832: * ! 7833: * ENTRY FOR VRGET (TRAPPED CASE). THIS ROUTINE IS CALLED ! 7834: * FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE. ! 7835: * THIS ENTRY POINT IS USED IF AN ACCESS TRACE OR INPUT ! 7836: * ASSOCIATION IS CURRENTLY ACTIVE. ! 7837: * ! 7838: * (XR) POINTER TO VRGET FIELD OF VRBLK ! 7839: * ! 7840: {B$VRA{ENT{BL$$I{{{ENTRY POINT ! 7841: {{MOV{R9{R10{{COPY NAME BASE (VRGET = 0) ! 7842: {{MOV{#4*VRVAL{R6{{SET NAME OFFSET ! 7843: {{JSR{ACESS{{{ACCESS VALUE ! 7844: {{PPM{EXFAL{{{FAIL IF ACCESS FAILS ! 7845: {{BRN{EXIXR{{{ELSE EXIT WITH RESULT IN XR ! 7846: {{EJC{{{{ ! 7847: * ! 7848: * VRBLK (CONTINUED) ! 7849: * ! 7850: * ENTRY FOR VRSTO (ERROR CASE. THIS ROUTINE IS CALLED FROM ! 7851: * THE EXECUTED CODE FOR AN ATTEMPT TO MODIFY THE VALUE ! 7852: * OF A PROTECTED (PATTERN VALUED) NATURAL VARIABLE. ! 7853: * ! 7854: {B$VRE{ENT{{{{ENTRY POINT ! 7855: {{ERB{042{ATTEMPT{{TO CHANGE VALUE OF PROTECTED VARIABLE ! 7856: {{EJC{{{{ ! 7857: * ! 7858: * VRBLK (CONTINUED) ! 7859: * ! 7860: * ENTRY FOR VRTRA (UNTRAPPED CASE). THIS ROUTINE IS CALLED ! 7861: * FROM THE EXECUTED CODE TO TRANSFER TO A LABEL. ! 7862: * ! 7863: * (XR) POINTER TO VRTRA FIELD OF VRBLK ! 7864: * ! 7865: {B$VRG{ENT{{{{ENTRY POINT ! 7866: {{MOV{4*VRLBO(R9){R9{{LOAD CODE POINTER ! 7867: {{MOV{(R9){R10{{LOAD ENTRY ADDRESS ! 7868: {{BRI{R10{{{JUMP TO ROUTINE FOR NEXT CODE WORD ! 7869: {{EJC{{{{ ! 7870: * ! 7871: * VRBLK (CONTINUED) ! 7872: * ! 7873: * ENTRY FOR VRGET (UNTRAPPED CASE). THIS ROUTINE IS CALLED ! 7874: * FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE. ! 7875: * ! 7876: * (XR) POINTS TO VRGET FIELD OF VRBLK ! 7877: * ! 7878: {B$VRL{ENT{{{{ENTRY POINT ! 7879: {{MOV{4*VRVAL(R9){-(SP){{LOAD VALUE ONTO STACK (VRGET = 0) ! 7880: {{BRN{EXITS{{{OBEY NEXT CODE WORD ! 7881: {{EJC{{{{ ! 7882: * ! 7883: * VRBLK (CONTINUED) ! 7884: * ! 7885: * ENTRY FOR VRSTO (UNTRAPPED CASE). THIS ROUTINE IS CALLED ! 7886: * FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE. ! 7887: * ! 7888: * (XR) POINTER TO VRSTO FIELD OF VRBLK ! 7889: * ! 7890: {B$VRS{ENT{{{{ENTRY POINT ! 7891: {{MOV{(SP){4*VRVLO(R9){{STORE VALUE, LEAVE ON STACK ! 7892: {{BRN{EXITS{{{OBEY NEXT CODE WORD ! 7893: {{EJC{{{{ ! 7894: * ! 7895: * VRBLK (CONTINUED) ! 7896: * ! 7897: * VRTRA (TRAPPED CASE). THIS ROUTINE IS CALLED FROM THE ! 7898: * GENERATED CODE TO TRANSFER TO A LABEL WHEN A LABEL ! 7899: * TRACE IS CURRENTLY ACTIVE. ! 7900: * ! 7901: {B$VRT{ENT{{{{ENTRY POINT ! 7902: {{SUB{#4*VRTRA{R9{{POINT BACK TO START OF VRBLK ! 7903: {{MOV{R9{R10{{COPY VRBLK POINTER ! 7904: {{MOV{#4*VRVAL{R6{{SET NAME OFFSET ! 7905: {{MOV{4*VRLBL(R10){R9{{LOAD POINTER TO TRBLK ! 7906: {{BZE{KVTRA{BVRT2{{JUMP IF TRACE IS OFF ! 7907: {{DCV{KVTRA{{{ELSE DECREMENT TRACE COUNT ! 7908: {{BZE{4*TRFNC(R9){BVRT1{{JUMP IF PRINT TRACE CASE ! 7909: {{JSR{TRXEQ{{{ELSE EXECUTE FULL TRACE ! 7910: {{BRN{BVRT2{{{MERGE TO JUMP TO LABEL ! 7911: * ! 7912: * HERE FOR PRINT TRACE -- PRINT COLON ( LABEL NAME ) ! 7913: * ! 7914: {BVRT1{JSR{PRTSN{{{PRINT STATEMENT NUMBER ! 7915: {{MOV{R10{R9{{COPY VRBLK POINTER ! 7916: {{MOV{#CH$CL{R6{{COLON ! 7917: {{JSR{PRTCH{{{PRINT IT ! 7918: {{MOV{#CH$PP{R6{{LEFT PAREN ! 7919: {{JSR{PRTCH{{{PRINT IT ! 7920: {{JSR{PRTVN{{{PRINT LABEL NAME ! 7921: {{MOV{#CH$RP{R6{{RIGHT PAREN ! 7922: {{JSR{PRTCH{{{PRINT IT ! 7923: {{JSR{PRTNL{{{TERMINATE LINE ! 7924: {{MOV{4*VRLBL(R10){R9{{POINT BACK TO TRBLK ! 7925: * ! 7926: * MERGE HERE TO JUMP TO LABEL ! 7927: * ! 7928: {BVRT2{MOV{4*TRLBL(R9){R9{{LOAD POINTER TO ACTUAL CODE ! 7929: {{BRI{(R9){{{EXECUTE STATEMENT AT LABEL ! 7930: {{EJC{{{{ ! 7931: * ! 7932: * VRBLK (CONTINUED) ! 7933: * ! 7934: * ENTRY FOR VRSTO (TRAPPED CASE). THIS ROUTINE IS CALLED ! 7935: * FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE. ! 7936: * THIS ENTRY IS USED WHEN A VALUE TRACE OR OUTPUT ! 7937: * ASSOCIATION IS CURRENTLY ACTIVE. ! 7938: * ! 7939: * (XR) POINTER TO VRSTO FIELD OF VRBLK ! 7940: * ! 7941: {B$VRV{ENT{{{{ENTRY POINT ! 7942: {{MOV{(SP){R7{{LOAD VALUE (LEAVE COPY ON STACK) ! 7943: {{SUB{#4*VRSTO{R9{{POINT TO VRBLK ! 7944: {{MOV{R9{R10{{COPY VRBLK POINTER ! 7945: {{MOV{#4*VRVAL{R6{{SET OFFSET ! 7946: {{JSR{ASIGN{{{CALL ASSIGNMENT ROUTINE ! 7947: {{PPM{EXFAL{{{FAIL IF ASSIGNMENT FAILS ! 7948: {{BRN{EXITS{{{ELSE RETURN WITH RESULT ON STACK ! 7949: {{EJC{{{{ ! 7950: * ! 7951: * XNBLK ! 7952: * ! 7953: * THE ROUTINE FOR AN XNBLK IS NEVER EXECUTED ! 7954: * ! 7955: {B$XNT{ENT{BL$XN{{{ENTRY POINT (XNBLK) ! 7956: {{EJC{{{{ ! 7957: * ! 7958: * XRBLK ! 7959: * ! 7960: * THE ROUTINE FOR AN XRBLK IS NEVER EXECUTED ! 7961: * ! 7962: {B$XRT{ENT{BL$XR{{{ENTRY POINT (XRBLK) ! 7963: * ! 7964: * MARK ENTRY ADDRESS PAST LAST BLOCK ACTION ROUTINE ! 7965: * ! 7966: {B$YYY{ENT{BL$$I{{{LAST BLOCK ROUTINE ENTRY POINT ! 7967: {{TTL{S{{{P I T B O L -- PATTERN MATCHING ROUTINES ! 7968: * ! 7969: * THE FOLLOWING SECTION CONSISTS OF THE PATTERN MATCHING ! 7970: * ROUTINES. ALL PATTERN NODES CONTAIN A POINTER (PCODE) ! 7971: * TO ONE OF THE ROUTINES IN THIS SECTION (P$XXX). ! 7972: * ! 7973: * NOTE THAT THIS SECTION FOLLOWS THE B$XXX ROUTINES TO ! 7974: * ENABLE A FAST TEST FOR THE PATTERN DATATYPE. ! 7975: * ! 7976: {P$AAA{ENT{BL$$I{{{ENTRY TO MARK FIRST PATTERN ! 7977: * ! 7978: * ! 7979: * THE ENTRY CONDITIONS TO THE MATCH ROUTINE ARE AS FOLLOWS ! 7980: * (SEE O$PMN, O$PMV, O$PMS AND PROCEDURE MATCH). ! 7981: * ! 7982: * STACK CONTENTS. ! 7983: * ! 7984: * NAME BASE (O$PMN ONLY) ! 7985: * NAME OFFSET (O$PMN ONLY) ! 7986: * TYPE (0-O$PMN, 1-O$PMV, 2-O$PMS) ! 7987: * PMHBS --------------- INITIAL CURSOR (ZERO) ! 7988: * INITIAL NODE POINTER ! 7989: * XS ------------------ =NDABO (ANCHORED), =NDUNA (UNANCH) ! 7990: * ! 7991: * REGISTER VALUES. ! 7992: * ! 7993: * (XS) SET AS SHOWN IN STACK DIAGRAM ! 7994: * (XR) POINTER TO INITIAL PATTERN NODE ! 7995: * (WB) INITIAL CURSOR (ZERO) ! 7996: * ! 7997: * GLOBAL PATTERN VALUES ! 7998: * ! 7999: * R$PMS POINTER TO SUBJECT STRING SCBLK ! 8000: * PMSSL LENGTH OF SUBJECT STRING IN CHARS ! 8001: * PMDFL DOT FLAG, INITIALLY ZERO ! 8002: * PMHBS SET AS SHOWN IN STACK DIAGRAM ! 8003: * ! 8004: * CONTROL IS PASSED BY BRANCHING THROUGH THE PCODE ! 8005: * FIELD OF THE INITIAL PATTERN NODE (BRI (XR)). ! 8006: {{EJC{{{{ ! 8007: * ! 8008: * DESCRIPTION OF ALGORITHM ! 8009: * ! 8010: * A PATTERN STRUCTURE IS REPRESENTED AS A LINKED GRAPH ! 8011: * OF NODES WITH THE FOLLOWING STRUCTURE. ! 8012: * ! 8013: * +------------------------------------+ ! 8014: * I PCODE I ! 8015: * +------------------------------------+ ! 8016: * I PTHEN I ! 8017: * +------------------------------------+ ! 8018: * I PARM1 I ! 8019: * +------------------------------------+ ! 8020: * I PARM2 I ! 8021: * +------------------------------------+ ! 8022: * ! 8023: * PCODE IS A POINTER TO THE ROUTINE WHICH WILL PERFORM ! 8024: * THE MATCH OF THIS PARTICULAR NODE TYPE. ! 8025: * ! 8026: * PTHEN IS A POINTER TO THE SUCCESSOR NODE. I.E. THE NODE ! 8027: * TO BE MATCHED IF THE ATTEMPT TO MATCH THIS NODE SUCCEEDS. ! 8028: * IF THIS IS THE LAST NODE OF THE PATTERN PTHEN POINTS ! 8029: * TO THE DUMMY NODE NDNTH WHICH INITIATES PATTERN EXIT. ! 8030: * ! 8031: * PARM1, PARM2 ARE PARAMETERS WHOSE USE VARIES WITH THE ! 8032: * PARTICULAR NODE. THEY ARE ONLY PRESENT IF REQUIRED. ! 8033: * ! 8034: * ALTERNATIVES ARE HANDLED WITH THE SPECIAL ALTERNATIVE ! 8035: * NODE WHOSE PARAMETER POINTS TO THE NODE TO BE MATCHED ! 8036: * IF THERE IS A FAILURE ON THE SUCCESSOR PATH. ! 8037: * ! 8038: * THE FOLLOWING EXAMPLE ILLUSTRATES THE MANNER IN WHICH ! 8039: * THE STRUCTURE IS BUILT UP. THE PATTERN IS ! 8040: * ! 8041: * (A / B / C) (D / E) WHERE / IS ALTERNATION ! 8042: * ! 8043: * IN THE DIAGRAM, THE NODE MARKED + REPRESENTS AN ! 8044: * ALTERNATIVE NODE AND THE DOTTED LINE FROM A + NODE ! 8045: * REPRESENTS THE PARAMETER POINTER TO THE ALTERNATIVE. ! 8046: * ! 8047: * +---+ +---+ +---+ +---+ ! 8048: * I + I-----I A I-----I + I-----I D I----- ! 8049: * +---+ +---+ I +---+ +---+ ! 8050: * . I . ! 8051: * . I . ! 8052: * +---+ +---+ I +---+ ! 8053: * I + I-----I B I--I I E I----- ! 8054: * +---+ +---+ I +---+ ! 8055: * . I ! 8056: * . I ! 8057: * +---+ I ! 8058: * I C I------------I ! 8059: * +---+ ! 8060: {{EJC{{{{ ! 8061: * ! 8062: * DURING THE MATCH, THE REGISTERS ARE USED AS FOLLOWS. ! 8063: * ! 8064: * (XR) POINTS TO THE CURRENT NODE ! 8065: * (XL) SCRATCH ! 8066: * (XS) MAIN STACK POINTER ! 8067: * (WB) CURSOR (NUMBER OF CHARS MATCHED) ! 8068: * (WA,WC) SCRATCH ! 8069: * ! 8070: * TO KEEP TRACK OF ALTERNATIVES, THE MAIN STACK IS USED AS ! 8071: * A HISTORY STACK AND CONTAINS TWO WORD ENTRIES. ! 8072: * ! 8073: * WORD 1 SAVED CURSOR VALUE ! 8074: * WORD 2 NODE TO MATCH ON FAILURE ! 8075: * ! 8076: * WHEN A FAILURE OCCURS, THE MOST RECENT ENTRY ON THIS ! 8077: * STACK IS POPPED OFF TO RESTORE THE CURSOR AND POINT ! 8078: * TO THE NODE TO BE MATCHED AS AN ALTERNATIVE. THE ENTRY ! 8079: * AT THE BOTTOM OF THE STACK POINTS TO THE FOLLOWING ! 8080: * SPECIAL NODES DEPENDING ON THE SCAN MODE. ! 8081: * ! 8082: * ANCHORED MODE THE BOTTOM ENTRY POINTS TO THE ! 8083: * SPECIAL NODE NDABO WHICH CAUSES AN ! 8084: * ABORT. THE CURSOR VALUE STORED ! 8085: * WITH THIS ENTRY IS ALWAYS ZERO. ! 8086: * ! 8087: * UNANCHORED MODE THE BOTTOM ENTRY POINTS TO THE ! 8088: * SPECIAL NODE NDUNA WHICH MOVES THE ! 8089: * ANCHOR POINT AND RESTARTS THE MATCH ! 8090: * THE CURSOR SAVED WITH THIS ENTRY ! 8091: * IS THE NUMBER OF CHARACTERS WHICH ! 8092: * LIE BEFORE THE INITIAL ANCHOR POINT ! 8093: * (I.E. THE NUMBER OF ANCHOR MOVES). ! 8094: * THIS ENTRY IS THREE WORDS LONG AND ! 8095: * ALSO CONTAINS THE INITIAL PATTERN. ! 8096: * ! 8097: * ENTRIES ARE MADE ON THIS HISTORY STACK BY ALTERNATIVE ! 8098: * NODES AND BY SOME SPECIAL COMPOUD PATTERNS AS DESCRIBED ! 8099: * LATER ON. THE FOLLOWING GLOBAL LOCATIONS ARE USED DURING ! 8100: * PATTERN MATCHING. ! 8101: * ! 8102: * R$PMS POINTER TO SUBJECT STRING ! 8103: * PMSSL LENGTH OF SUBJECT STRING ! 8104: * PMDFL FLAG SET NON-ZERO FOR DOT PATTERNS ! 8105: * PMHBS BASE PTR FOR CURRENT HISTORY STACK ! 8106: * ! 8107: * THE FOLLOWING EXIT POINTS ARE AVAILABLE TO MATCH ROUTINES ! 8108: * ! 8109: * SUCCP SUCCESS IN MATCHING CURRENT NODE ! 8110: * FAILP FAILURE IN MATCHING CURRENT NODE ! 8111: {{EJC{{{{ ! 8112: * ! 8113: * COMPOUND PATTERNS ! 8114: * ! 8115: * SOME PATTERNS HAVE IMPLICIT ALTERNATIVES AND THEIR ! 8116: * REPRESENTATION IN THE PATTERN STRUCTURE CONSISTS OF A ! 8117: * LINKED SET OF NODES AS INDICATED BY THESE DIAGRAMS. ! 8118: * ! 8119: * AS BEFORE, THE + REPRESENTS AN ALTERNATIVE NODE AND ! 8120: * THE DOTTED LINE FROM A + NODE IS THE PARAMETER POINTER ! 8121: * TO THE ALTERNATIVE PATTERN. ! 8122: * ! 8123: * ARB ! 8124: * --- ! 8125: * ! 8126: * +---+ THIS NODE (P$ARB) MATCHES NULL ! 8127: * I B I----- AND STACKS CURSOR, SUCCESSOR PTR, ! 8128: * +---+ CURSOR (COPY) AND A PTR TO NDARC. ! 8129: * ! 8130: * ! 8131: * ! 8132: * ! 8133: * BAL ! 8134: * --- ! 8135: * ! 8136: * +---+ THE P$BAL NODE SCANS A BALANCED ! 8137: * I B I----- STRING AND THEN STACKS A POINTER ! 8138: * +---+ TO ITSELF ON THE HISTORY STACK. ! 8139: {{EJC{{{{ ! 8140: * ! 8141: * COMPOUND PATTERN STRUCTURES (CONTINUED) ! 8142: * ! 8143: * ! 8144: * ARBNO ! 8145: * ----- ! 8146: * ! 8147: * +---+ THIS ALTERNATIVE NODE MATCHES NULL ! 8148: * +----I + I----- THE FIRST TIME AND STACKS A POINTER ! 8149: * I +---+ TO THE ARGUMENT PATTERN X. ! 8150: * I . ! 8151: * I . ! 8152: * I +---+ NODE (P$ABA) TO STACK CURSOR ! 8153: * I I A I AND HISTORY STACK BASE PTR. ! 8154: * I +---+ ! 8155: * I I ! 8156: * I I ! 8157: * I +---+ THIS IS THE ARGUMENT PATTERN. AS ! 8158: * I I X I INDICATED, THE SUCCESSOR OF THE ! 8159: * I +---+ PATTERN IS THE P$ABC NODE ! 8160: * I I ! 8161: * I I ! 8162: * I +---+ THIS NODE (P$ABC) POPS PMHBS, ! 8163: * +----I C I STACKS OLD PMHBS AND PTR TO NDABD ! 8164: * +---+ (UNLESS OPTIMISATION HAS OCCURRED) ! 8165: * ! 8166: * STRUCTURE AND EXECUTION OF THIS PATTERN RESEMBLE THOSE OF ! 8167: * RECURSIVE PATTERN MATCHING AND IMMEDIATE ASSIGNMENT. ! 8168: * THE ALTERNATIVE NODE AT THE HEAD OF THE STRUCTURE MATCHES ! 8169: * NULL INITIALLY BUT ON SUBSEQUENT FAILURE ENSURES ATTEMPT ! 8170: * TO MATCH THE ARGUMENT. BEFORE THE ARGUMENT IS MATCHED ! 8171: * P$ABA STACKS THE CURSOR,PMHBS AND A PTR TO P$ABB. IF ! 8172: * THE ARGUMENT CANT BE MATCHED , P$ABB REMOVES THIS SPECIAL ! 8173: * STACK ENTRY AND FAILS. ! 8174: * IF ARGUMENT IS MATCHED , P$ABC RESTORES THE OUTER PMHBS ! 8175: * VALUE (SAVED BY P$ABA) . THEN IF THE ARGUMENT HAS LEFT ! 8176: * ALTERNATIVES ON STACK IT STACKS THE INNER VALUE OF PMHBS ! 8177: * AND A PTR TO NDABD. IF ARGUMENT LEFT NOTHING ON THE STACK ! 8178: * IT OPTIMISES BY REMOVING ITEMS STACKED BY P$ABA. FINALLY ! 8179: * A CHECK IS MADE THAT ARGUMENT MATCHED MORE THAN THE NULL ! 8180: * STRING (CHECK IS INTENDED TO PREVENT USELESS LOOPING). ! 8181: * IF SO THE SUCCESSOR IS AGAIN THE ALTERNATIVE NODE AT THE ! 8182: * HEAD OF THE STRUCTURE , ENSURING A POSSIBLE EXTRA ATTEMPT ! 8183: * TO MATCH THE ARG IF NECESSARY. IF NOT , THE SUCCESSOR TO ! 8184: * ALTERNATIVE IS TAKEN SO AS TO TERMINATE THE LOOP. P$ABD ! 8185: * RESTORES INNER PMHBS PTR AND FAILS , THUS TRYING TO MATCH ! 8186: * ALTERNATIVES LEFT BY THE ARBNO ARGUMENT. ! 8187: {{EJC{{{{ ! 8188: * ! 8189: * COMPOUND PATTERN STRUCTURES (CONTINUED) ! 8190: * ! 8191: * BREAKX ! 8192: * ------ ! 8193: * ! 8194: * +---+ THIS NODE IS A BREAK NODE FOR ! 8195: * +----I B I THE ARGUMENT TO BREAKX, IDENTICAL ! 8196: * I +---+ TO AN ORDINARY BREAK NODE. ! 8197: * I I ! 8198: * I I ! 8199: * I +---+ THIS ALTERNATIVE NODE STACKS A ! 8200: * I I + I----- POINTER TO THE BREAKX NODE TO ! 8201: * I +---+ ALLOW FOR SUBSEQUENT FAILURE ! 8202: * I . ! 8203: * I . ! 8204: * I +---+ THIS IS THE BREAKX NODE ITSELF. IT ! 8205: * +----I X I MATCHES ONE CHARACTER AND THEN ! 8206: * +---+ PROCEEDS BACK TO THE BREAK NODE. ! 8207: * ! 8208: * ! 8209: * ! 8210: * ! 8211: * FENCE ! 8212: * ----- ! 8213: * ! 8214: * +---+ THE FENCE NODE MATCHES NULL AND ! 8215: * I F I----- STACKS A POINTER TO NODE NDABO TO ! 8216: * +---+ ABORT ON A SUBSEQUENT REMATCH ! 8217: * ! 8218: * ! 8219: * ! 8220: * ! 8221: * SUCCEED ! 8222: * ------- ! 8223: * ! 8224: * +---+ THE NODE FOR SUCCEED MATCHES NULL ! 8225: * I S I----- AND STACKS A POINTER TO ITSELF ! 8226: * +---+ TO REPEAT THE MATCH ON A FAILURE. ! 8227: {{EJC{{{{ ! 8228: * ! 8229: * COMPOUND PATTERNS (CONTINUED) ! 8230: * ! 8231: * BINARY DOT (PATTERN ASSIGNMENT) ! 8232: * ------------------------------- ! 8233: * ! 8234: * +---+ THIS NODE (P$PAA) SAVES THE CURRENT ! 8235: * I A I CURSOR AND A POINTER TO THE ! 8236: * +---+ SPECIAL NODE NDPAB ON THE STACK. ! 8237: * I ! 8238: * I ! 8239: * +---+ THIS IS THE STRUCTURE FOR THE ! 8240: * I X I PATTERN LEFT ARGUMENT OF THE ! 8241: * +---+ PATTERN ASSIGNMENT CALL. ! 8242: * I ! 8243: * I ! 8244: * +---+ THIS NODE (P$PAC) SAVES THE CURSOR, ! 8245: * I C I----- A PTR TO ITSELF, THE CURSOR (COPY) ! 8246: * +---+ AND A PTR TO NDPAD ON THE STACK. ! 8247: * ! 8248: * ! 8249: * THE FUNCTION OF THE MATCH ROUTINE FOR NDPAB (P$PAB) ! 8250: * IS SIMPLY TO UNSTACK ITSELF AND FAIL BACK ONTO THE STACK. ! 8251: * ! 8252: * THE MATCH ROUTINE FOR P$PAC ALSO SETS THE GLOBAL PATTERN ! 8253: * FLAG PMDFL NON-ZERO TO INDICATE THAT PATTERN ASSIGNMENTS ! 8254: * MAY HAVE OCCURED IN THE PATTERN MATCH ! 8255: * ! 8256: * IF PMDFL IS SET AT THE END OF THE MATCH (SEE P$NTH), THE ! 8257: * HISTORY STACK IS SCANNED FOR MATCHING NDPAB-NDPAD PAIRS ! 8258: * AND THE CORRESPONDING PATTERN ASSIGNMENTS ARE EXECUTED. ! 8259: * ! 8260: * THE FUNCTION OF THE MATCH ROUTINE FOR NDPAD (P$PAD) ! 8261: * IS SIMPLY TO REMOVE ITS ENTRY FROM THE STACK AND FAIL. ! 8262: * THIS INCLUDES REMOVING THE SPECIAL NODE POINTER STORED ! 8263: * IN ADDITION TO THE STANDARD TWO ENTRIES ON THE STACK. ! 8264: {{EJC{{{{ ! 8265: * ! 8266: * COMPOUNT PATTERN STRUCTURES (CONTINUED) ! 8267: * ! 8268: * FENCE (FUNCTION) ! 8269: * ---------------- ! 8270: * ! 8271: * +---+ THIS NODE (P$FNA) SAVES THE ! 8272: * I A I CURRENT HISTORY STACK AND A ! 8273: * +---+ POINTER TO NDFNB ON THE STACK. ! 8274: * I ! 8275: * I ! 8276: * +---+ THIS IS THE PATTERN STRUCTURE ! 8277: * I X I GIVEN AS THE ARGUMENT TO THE ! 8278: * +---+ FENCE FUNCTION. ! 8279: * I ! 8280: * I ! 8281: * +---+ THIS NODE P$FNC RESTORES THE OUTER ! 8282: * I C I HISTORY STACK PTR SAVED IN P$FNA, ! 8283: * +---+ AND STACKS THE INNER STACK BASE ! 8284: * PTR AND A POINTER TO NDFND ON THE ! 8285: * STACK. ! 8286: * ! 8287: * NDFNB (F$FNB) SIMPLY IS THE FAILURE EXIT FOR PATTERN ! 8288: * ARGUMENT FAILURE, AND IT POPS ITSELF AND FAILS ONTO THE ! 8289: * STACK. ! 8290: * ! 8291: * THE MATCH ROUTINE P$FNC ALLOWS FOR AN OPTIMIZATION WHEN ! 8292: * THE FENCE PATTERN LEAVES NO ALTERNATIVES. IN THIS CASE, ! 8293: * THE NDFNB ENTRY IS POPPED, AND THE MATCH CONTINUES. ! 8294: * ! 8295: * NDFND (P$FND) IS ENTERED WHEN THE PATTERN FAILS AFTER ! 8296: * GOING THROUGH A NON-OPTIMIZED P$FNC, AND IT POPS THE ! 8297: * STACK BACK PAST THE INNTER STACK BASE CREATED BY P$FNA ! 8298: {{EJC{{{{ ! 8299: * ! 8300: * COMPOUND PATTERNS (CONTINUED) ! 8301: * ! 8302: * EXPRESSION PATTERNS (RECURSIVE PATTERN MATCHES) ! 8303: * ----------------------------------------------- ! 8304: * ! 8305: * INITIAL ENTRY FOR A PATTERN NODE IS TO THE ROUTINE P$EXA. ! 8306: * IF THE EVALUATED RESULT OF THE EXPRESSION IS ITSELF A ! 8307: * PATTERN, THEN THE FOLLOWING STEPS ARE TAKEN TO ARRANGE ! 8308: * FOR PROPER RECURSIVE PROCESSING. ! 8309: * ! 8310: * 1) A POINTER TO THE CURRENT NODE (THE P$EXA NODE) IS ! 8311: * STORED ON THE HISTORY STACK WITH A DUMMY CURSOR. ! 8312: * ! 8313: * 2) A SPECIAL HISTORY STACK ENTRY IS MADE IN WHICH THE ! 8314: * NODE POINTER POINTS TO NDEXB, AND THE CURSOR VALUE ! 8315: * IS THE SAVED VALUE OF PMHBS ON ENTRY TO THIS NODE. ! 8316: * THE MATCH ROUTINE FOR NDEXB (P$EXB) RESTORES PMHBS ! 8317: * FROM THIS CURSOR ENTRY, POPS OFF THE P$EXA NODE ! 8318: * POINTER AND FAILS. ! 8319: * ! 8320: * 3) THE RESULTING HISTORY STACK POINTER IS SAVED IN ! 8321: * PMHBS TO ESTABLISH A NEW LEVEL OF HISTORY STACK. ! 8322: * ! 8323: * AFTER MATCHING A PATTERN, THE END OF MATCH ROUTINE GETS ! 8324: * CONTROL (P$NTH). THIS ROUTINE PROCEEDS AS FOLLOWS. ! 8325: * ! 8326: * 1) LOAD THE CURRENT VALUE OF PMHBS AND RECOGNIZE THE ! 8327: * OUTER LEVEL CASE BY THE FACT THAT THE ASSOCIATED ! 8328: * CURSOR IN THIS CASE IS THE PATTERN MATCH TYPE CODE ! 8329: * WHICH IS LESS THAN 3. TERMINATE THE MATCH IN THIS ! 8330: * CASE AND CONTINUE EXECUTION OF THE PROGRAM. ! 8331: * ! 8332: * 2) OTHERWISE MAKE A SPECIAL HISTORY STACK ENTRY IN ! 8333: * WHICH THE NODE POINTER POINTS TO THE SPECIAL NODE ! 8334: * NDEXC AND THE CURSOR IS THE CURRENT VALUE OF PMHBS. ! 8335: * THE MATCH ROUTINE FOR NDEXC (P$EXC) RESETS PMHBS TO ! 8336: * THIS (INNER) VALUE AND AND THEN FAILS. ! 8337: * ! 8338: * 3) USING THE HISTORY STACK ENTRY MADE ON STARTING THE ! 8339: * EXPRESSION (ACCESSIBLE WITH THE CURRENT VALUE OF ! 8340: * PMHBS), RESTORE THE P$EXA NODE POINTER AND THE OLD ! 8341: * PMHBS SETTING. TAKE THE SUCCESSOR AND CONTINUE. ! 8342: * ! 8343: * AN OPTIMIZATION IS POSSIBLE IF THE EXPRESSION PATTERN ! 8344: * MAKES NO ENTRIES ON THE HISTORY STACK. IN THIS CASE, ! 8345: * INSTEAD OF BUILDING THE P$EXC NODE IN STEP 2, IT IS MORE ! 8346: * EFFICIENT TO SIMPLY POP OFF THE P$EXB ENTRY AND ITS ! 8347: * ASSOCIATED NODE POINTER. THE EFFECT IS THE SAME. ! 8348: {{EJC{{{{ ! 8349: * ! 8350: * COMPOUND PATTERNS (CONTINUED) ! 8351: * ! 8352: * BINARY DOLLAR (IMMEDIATE ASSIGNMENT) ! 8353: * ------------------------------------ ! 8354: * ! 8355: * +---+ THIS NODE (P$IMA) STACKS THE CURSOR ! 8356: * I A I PMHBS AND A PTR TO NDIMB AND RESETS ! 8357: * +---+ THE STACK PTR PMHBS. ! 8358: * I ! 8359: * I ! 8360: * +---+ THIS IS THE LEFT STRUCTURE FOR THE ! 8361: * I X I PATTERN LEFT ARGUMENT OF THE ! 8362: * +---+ IMMEDIATE ASSIGNMENT CALL. ! 8363: * I ! 8364: * I ! 8365: * +---+ THIS NODE (P$IMC) PERFORMS THE ! 8366: * I C I----- ASSIGNMENT, POPS PMHBS AND STACKS ! 8367: * +---+ THE OLD PMHBS AND A PTR TO NDIMD. ! 8368: * ! 8369: * ! 8370: * THE STRUCTURE AND EXECUTION OF THIS PATTERN ARE SIMILAR ! 8371: * TO THOSE OF THE RECURSIVE EXPRESSION PATTERN MATCHING. ! 8372: * ! 8373: * THE MATCH ROUTINE FOR NDIMB (P$IMB) RESTORES THE OUTER ! 8374: * LEVEL VALUE OF PMHBS, UNSTACKS THE SAVED CURSOR AND FAILS ! 8375: * ! 8376: * THE MATCH ROUTINE P$IMC USES THE CURRENT VALUE OF PMHBS ! 8377: * TO LOCATE THE P$IMB ENTRY. THIS ENTRY IS USED TO MAKE ! 8378: * THE ASSIGNMENT AND RESTORE THE OUTER LEVEL VALUE OF ! 8379: * PMHBS. FINALLY, THE INNER LEVEL VALUE OF PMHBS AND A ! 8380: * POINTER TO THE SPECIAL NODE NDIMD ARE STACKED. ! 8381: * ! 8382: * THE MATCH ROUTINE FOR NDIMD (P$IMD) RESTORES THE INNER ! 8383: * LEVEL VALUE OF PMHBS AND FAILS BACK INTO THE STACK. ! 8384: * ! 8385: * AN OPTIMIZATION OCCURS IF THE INNER PATTERN MAKES NO ! 8386: * ENTRIES ON THE HISTORY STACK. IN THIS CASE, P$IMC POPS ! 8387: * THE P$IMB ENTRY INSTEAD OF MAKING A P$IMD ENTRY. ! 8388: {{EJC{{{{ ! 8389: * ! 8390: * ARBNO ! 8391: * ! 8392: * SEE COMPOUND PATTERNS SECTION FOR STUCTURE AND ! 8393: * ALGORITHM FOR MATCHING THIS NODE TYPE. ! 8394: * ! 8395: * NO PARAMETERS ! 8396: * ! 8397: {P$ABA{ENT{BL$P0{{{P0BLK ! 8398: {{MOV{R7{-(SP){{STACK CURSOR ! 8399: {{MOV{R9{-(SP){{STACK DUMMY NODE PTR ! 8400: {{MOV{PMHBS{-(SP){{STACK OLD STACK BASE PTR ! 8401: {{MOV{#NDABB{-(SP){{STACK PTR TO NODE NDABB ! 8402: {{MOV{SP{PMHBS{{STORE NEW STACK BASE PTR ! 8403: {{BRN{SUCCP{{{SUCCEED ! 8404: {{EJC{{{{ ! 8405: * ! 8406: * ARBNO (REMOVE P$ABA SPECIAL STACK ENTRY) ! 8407: * ! 8408: * NO PARAMETERS (DUMMY PATTERN) ! 8409: * ! 8410: {P$ABB{ENT{{{{ENTRY POINT ! 8411: {{MOV{R7{PMHBS{{RESTORE HISTORY STACK BASE PTR ! 8412: {{BRN{FLPOP{{{FAIL AND POP DUMMY NODE PTR ! 8413: {{EJC{{{{ ! 8414: * ! 8415: * ARBNO (CHECK IF ARG MATCHED NULL STRING) ! 8416: * ! 8417: * NO PARAMETERS (DUMMY PATTERN) ! 8418: * ! 8419: {P$ABC{ENT{BL$P0{{{P0BLK ! 8420: {{MOV{PMHBS{R10{{KEEP P$ABB STACK BASE ! 8421: {{MOV{4*3(R10){R6{{LOAD INITIAL CURSOR ! 8422: {{MOV{4*1(R10){PMHBS{{RESTORE OUTER STACK BASE PTR ! 8423: {{BEQ{R10{SP{PABC1{JUMP IF NO HISTORY STACK ENTRIES ! 8424: {{MOV{R10{-(SP){{ELSE SAVE INNER PMHBS ENTRY ! 8425: {{MOV{#NDABD{-(SP){{STACK PTR TO SPECIAL NODE NDABD ! 8426: {{BRN{PABC2{{{MERGE ! 8427: * ! 8428: * OPTIMISE CASE OF NO EXTRA ENTRIES ON STACK FROM ARBNO ARG ! 8429: * ! 8430: {PABC1{ADD{#4*NUM04{SP{{REMOVE NDABB ENTRY AND CURSOR ! 8431: * ! 8432: * MERGE TO CHECK FOR MATCHING OF NULL STRING ! 8433: * ! 8434: {PABC2{BNE{R6{R7{SUCCP{ALLOW FURTHER ATTEMPT IF NON-NULL ! 8435: {{MOV{4*PTHEN(R9){R9{{BYPASS ALTERNATIVE NODE SO AS TO .. ! 8436: {{BRN{SUCCP{{{... REFUSE FURTHER MATCH ATTEMPTS ! 8437: {{EJC{{{{ ! 8438: * ! 8439: * ARBNO (TRY FOR ALTERNATIVES IN ARBNO ARGUMENT) ! 8440: * ! 8441: * NO PARAMETERS (DUMMY PATTERN) ! 8442: * ! 8443: {P$ABD{ENT{{{{ENTRY POINT ! 8444: {{MOV{R7{PMHBS{{RESTORE INNER STACK BASE PTR ! 8445: {{BRN{FAILP{{{AND FAIL ! 8446: {{EJC{{{{ ! 8447: * ! 8448: * ABORT ! 8449: * ! 8450: * NO PARAMETERS ! 8451: * ! 8452: {P$ABO{ENT{BL$P0{{{P0BLK ! 8453: {{BRN{EXFAL{{{SIGNAL STATEMENT FAILURE ! 8454: {{EJC{{{{ ! 8455: * ! 8456: * ALTERNATION ! 8457: * ! 8458: * PARM1 ALTERNATIVE NODE ! 8459: * ! 8460: {P$ALT{ENT{BL$P1{{{P1BLK ! 8461: {{MOV{R7{-(SP){{STACK CURSOR ! 8462: {{MOV{4*PARM1(R9){-(SP){{STACK POINTER TO ALTERNATIVE ! 8463: {{CHK{{{{CHECK FOR STACK OVERFLOW ! 8464: {{BRN{SUCCP{{{IF ALL OK, THEN SUCCEED ! 8465: {{EJC{{{{ ! 8466: * ! 8467: * ANY (ONE CHARACTER ARGUMENT) (1-CHAR STRING ALSO) ! 8468: * ! 8469: * PARM1 CHARACTER ARGUMENT ! 8470: * ! 8471: {P$ANS{ENT{BL$P1{{{P1BLK ! 8472: {{BEQ{R7{PMSSL{FAILP{FAIL IF NO CHARS LEFT ! 8473: {{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING ! 8474: {{PLC{R10{R7{{POINT TO CURRENT CHARACTER ! 8475: {{LCH{R6{(R10){{LOAD CURRENT CHARACTER ! 8476: {{BNE{R6{4*PARM1(R9){FAILP{FAIL IF NO MATCH ! 8477: {{ICV{R7{{{ELSE BUMP CURSOR ! 8478: {{BRN{SUCCP{{{AND SUCCEED ! 8479: {{EJC{{{{ ! 8480: * ! 8481: * ANY (MULTI-CHARACTER ARGUMENT CASE) ! 8482: * ! 8483: * PARM1 POINTER TO CTBLK ! 8484: * PARM2 BIT MASK TO SELECT BIT IN CTBLK ! 8485: * ! 8486: {P$ANY{ENT{BL$P2{{{P2BLK ! 8487: * ! 8488: * EXPRESSION ARGUMENT CASE MERGES HERE ! 8489: * ! 8490: {PANY1{BEQ{R7{PMSSL{FAILP{FAIL IF NO CHARACTERS LEFT ! 8491: {{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING ! 8492: {{PLC{R10{R7{{GET CHAR PTR TO CURRENT CHARACTER ! 8493: {{LCH{R6{(R10){{LOAD CURRENT CHARACTER ! 8494: {{MOV{4*PARM1(R9){R10{{POINT TO CTBLK ! 8495: {{WTB{R6{{{CHANGE TO BYTE OFFSET ! 8496: {{ADD{R6{R10{{POINT TO ENTRY IN CTBLK ! 8497: {{MOV{4*CTCHS(R10){R6{{LOAD WORD FROM CTBLK ! 8498: {{ANB{4*PARM2(R9){R6{{AND WITH SELECTED BIT ! 8499: {{ZRB{R6{FAILP{{FAIL IF NO MATCH ! 8500: {{ICV{R7{{{ELSE BUMP CURSOR ! 8501: {{BRN{SUCCP{{{AND SUCCEED ! 8502: {{EJC{{{{ ! 8503: * ! 8504: * ANY (EXPRESSION ARGUMENT) ! 8505: * ! 8506: * PARM1 EXPRESSION POINTER ! 8507: * ! 8508: {P$AYD{ENT{BL$P1{{{P1BLK ! 8509: {{JSR{EVALS{{{EVALUATE STRING ARGUMENT ! 8510: {{ERR{043{ANY{{EVALUATED ARGUMENT IS NOT STRING ! 8511: {{PPM{FAILP{{{FAIL IF EVALUATION FAILURE ! 8512: {{PPM{PANY1{{{MERGE MULTI-CHAR CASE IF OK ! 8513: {{EJC{{{{ ! 8514: * ! 8515: * P$ARB INITIAL ARB MATCH ! 8516: * ! 8517: * NO PARAMETERS ! 8518: * ! 8519: * THE P$ARB NODE IS PART OF A COMPOUND PATTERN STRUCTURE ! 8520: * FOR AN ARB PATTERN (SEE DESCRIPTION OF COMPOUND PATTERNS) ! 8521: * ! 8522: {P$ARB{ENT{BL$P0{{{P0BLK ! 8523: {{MOV{4*PTHEN(R9){R9{{LOAD SUCCESSOR POINTER ! 8524: {{MOV{R7{-(SP){{STACK DUMMY CURSOR ! 8525: {{MOV{R9{-(SP){{STACK SUCCESSOR POINTER ! 8526: {{MOV{R7{-(SP){{STACK CURSOR ! 8527: {{MOV{#NDARC{-(SP){{STACK PTR TO SPECIAL NODE NDARC ! 8528: {{BRI{(R9){{{EXECUTE NEXT NODE MATCHING NULL ! 8529: {{EJC{{{{ ! 8530: * ! 8531: * P$ARC EXTEND ARB MATCH ! 8532: * ! 8533: * NO PARAMETERS (DUMMY PATTERN) ! 8534: * ! 8535: {P$ARC{ENT{{{{ENTRY POINT ! 8536: {{BEQ{R7{PMSSL{FLPOP{FAIL AND POP STACK TO SUCCESSOR ! 8537: {{ICV{R7{{{ELSE BUMP CURSOR ! 8538: {{MOV{R7{-(SP){{STACK UPDATED CURSOR ! 8539: {{MOV{R9{-(SP){{RESTACK POINTER TO NDARC NODE ! 8540: {{MOV{4*2(SP){R9{{LOAD SUCCESSOR POINTER ! 8541: {{BRI{(R9){{{OFF TO REEXECUTE SUCCESSOR NODE ! 8542: {{EJC{{{{ ! 8543: * ! 8544: * BAL ! 8545: * ! 8546: * NO PARAMETERS ! 8547: * ! 8548: * THE P$BAL NODE IS PART OF THE COMPOUND STRUCTURE BUILT ! 8549: * FOR BAL (SEE SECTION ON COMPOUND PATTERNS). ! 8550: * ! 8551: {P$BAL{ENT{BL$P0{{{P0BLK ! 8552: {{ZER{R8{{{ZERO PARENTHESES LEVEL COUNTER ! 8553: {{MOV{R$PMS{R10{{POINT TO SUBJECT STRING ! 8554: {{PLC{R10{R7{{POINT TO CURRENT CHARACTER ! 8555: {{BRN{PBAL2{{{JUMP INTO SCAN LOOP ! 8556: * ! 8557: * LOOP TO SCAN OUT CHARACTERS ! 8558: * ! 8559: {PBAL1{LCH{R6{(R10)+{{LOAD NEXT CHARACTER, BUMP POINTER ! 8560: {{ICV{R7{{{PUSH CURSOR FOR CHARACTER ! 8561: {{BEQ{R6{#CH$PP{PBAL3{JUMP IF LEFT PAREN ! 8562: {{BEQ{R6{#CH$RP{PBAL4{JUMP IF RIGHT PAREN ! 8563: {{BZE{R8{PBAL5{{ELSE SUCCEED IF AT OUTER LEVEL ! 8564: * ! 8565: * HERE AFTER PROCESSING ONE CHARACTER ! 8566: * ! 8567: {PBAL2{BNE{R7{PMSSL{PBAL1{LOOP BACK UNLESS END OF STRING ! 8568: {{BRN{FAILP{{{IN WHICH CASE, FAIL ! 8569: * ! 8570: * HERE ON LEFT PAREN ! 8571: * ! 8572: {PBAL3{ICV{R8{{{BUMP PAREN LEVEL ! 8573: {{BRN{PBAL2{{{LOOP BACK TO CHECK END OF STRING ! 8574: * ! 8575: * HERE FOR RIGHT PAREN ! 8576: * ! 8577: {PBAL4{BZE{R8{FAILP{{FAIL IF NO MATCHING LEFT PAREN ! 8578: {{DCV{R8{{{ELSE DECREMENT LEVEL COUNTER ! 8579: {{BNZ{R8{PBAL2{{LOOP BACK IF NOT AT OUTER LEVEL ! 8580: * ! 8581: * HERE AFTER SUCCESSFULLY SCANNING A BALANCED STRING ! 8582: * ! 8583: {PBAL5{MOV{R7{-(SP){{STACK CURSOR ! 8584: {{MOV{R9{-(SP){{STACK PTR TO BAL NODE FOR EXTEND ! 8585: {{BRN{SUCCP{{{AND SUCCEED ! 8586: {{EJC{{{{ ! 8587: * ! 8588: * BREAK (EXPRESSION ARGUMENT) ! 8589: * ! 8590: * PARM1 EXPRESSION POINTER ! 8591: * ! 8592: {P$BKD{ENT{BL$P1{{{P1BLK ! 8593: {{JSR{EVALS{{{EVALUATE STRING EXPRESSION ! 8594: {{ERR{044{BREAK{{EVALUATED ARGUMENT IS NOT STRING ! 8595: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS ! 8596: {{PPM{PBRK1{{{MERGE WITH MULTI-CHAR CASE IF OK ! 8597: {{EJC{{{{ ! 8598: * ! 8599: * BREAK (ONE CHARACTER ARGUMENT) ! 8600: * ! 8601: * PARM1 CHARACTER ARGUMENT ! 8602: * ! 8603: {P$BKS{ENT{BL$P1{{{P1BLK ! 8604: {{MOV{PMSSL{R8{{GET SUBJECT STRING LENGTH ! 8605: {{SUB{R7{R8{{GET NUMBER OF CHARACTERS LEFT ! 8606: {{BZE{R8{FAILP{{FAIL IF NO CHARACTERS LEFT ! 8607: {{LCT{R8{R8{{SET COUNTER FOR CHARS LEFT ! 8608: {{MOV{R$PMS{R10{{POINT TO SUBJECT STRING ! 8609: {{PLC{R10{R7{{POINT TO CURRENT CHARACTER ! 8610: * ! 8611: * LOOP TO SCAN TILL BREAK CHARACTER FOUND ! 8612: * ! 8613: {PBKS1{LCH{R6{(R10)+{{LOAD NEXT CHAR, BUMP POINTER ! 8614: {{BEQ{R6{4*PARM1(R9){SUCCP{SUCCEED IF BREAK CHARACTER FOUND ! 8615: {{ICV{R7{{{ELSE PUSH CURSOR ! 8616: {{BCT{R8{PBKS1{{LOOP BACK IF MORE TO GO ! 8617: {{BRN{FAILP{{{FAIL IF END OF STRING, NO BREAK CHR ! 8618: {{EJC{{{{ ! 8619: * ! 8620: * BREAK (MULTI-CHARACTER ARGUMENT) ! 8621: * ! 8622: * PARM1 POINTER TO CTBLK ! 8623: * PARM2 BIT MASK TO SELECT BIT COLUMN ! 8624: * ! 8625: {P$BRK{ENT{BL$P2{{{P2BLK ! 8626: * ! 8627: * EXPRESSION ARGUMENT MERGES HERE ! 8628: * ! 8629: {PBRK1{MOV{PMSSL{R8{{LOAD SUBJECT STRING LENGTH ! 8630: {{SUB{R7{R8{{GET NUMBER OF CHARACTERS LEFT ! 8631: {{BZE{R8{FAILP{{FAIL IF NO CHARACTERS LEFT ! 8632: {{LCT{R8{R8{{SET COUNTER FOR CHARACTERS LEFT ! 8633: {{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING ! 8634: {{PLC{R10{R7{{POINT TO CURRENT CHARACTER ! 8635: {{MOV{R9{PSAVE{{SAVE NODE POINTER ! 8636: * ! 8637: * LOOP TO SEARCH FOR BREAK CHARACTER ! 8638: * ! 8639: {PBRK2{LCH{R6{(R10)+{{LOAD NEXT CHAR, BUMP POINTER ! 8640: {{MOV{4*PARM1(R9){R9{{LOAD POINTER TO CTBLK ! 8641: {{WTB{R6{{{CONVERT TO BYTE OFFSET ! 8642: {{ADD{R6{R9{{POINT TO CTBLK ENTRY ! 8643: {{MOV{4*CTCHS(R9){R6{{LOAD CTBLK WORD ! 8644: {{MOV{PSAVE{R9{{RESTORE NODE POINTER ! 8645: {{ANB{4*PARM2(R9){R6{{AND WITH SELECTED BIT ! 8646: {{NZB{R6{SUCCP{{SUCCEED IF BREAK CHARACTER FOUND ! 8647: {{ICV{R7{{{ELSE PUSH CURSOR ! 8648: {{BCT{R8{PBRK2{{LOOP BACK UNLESS END OF STRING ! 8649: {{BRN{FAILP{{{FAIL IF END OF STRING, NO BREAK CHR ! 8650: {{EJC{{{{ ! 8651: * ! 8652: * BREAKX (EXTENSION) ! 8653: * ! 8654: * THIS IS THE ENTRY WHICH CAUSES AN EXTENSION OF A BREAKX ! 8655: * MATCH WHEN FAILURE OCCURS. SEE SECTION ON COMPOUND ! 8656: * PATTERNS FOR FULL DETAILS OF BREAKX MATCHING. ! 8657: * ! 8658: * NO PARAMETERS ! 8659: * ! 8660: {P$BKX{ENT{BL$P0{{{P0BLK ! 8661: {{ICV{R7{{{STEP CURSOR PAST PREVIOUS BREAK CHR ! 8662: {{BRN{SUCCP{{{SUCCEED TO REMATCH BREAK ! 8663: {{EJC{{{{ ! 8664: * ! 8665: * BREAKX (EXPRESSION ARGUMENT) ! 8666: * ! 8667: * SEE SECTION ON COMPOUND PATTERNS FOR FULL STRUCTURE OF ! 8668: * BREAKX PATTERN. THE ACTUAL CHARACTER MATCHING USES A ! 8669: * BREAK NODE. HOWEVER, THE ENTRY FOR THE EXPRESSION ! 8670: * ARGUMENT CASE IS SEPARATED TO GET PROPER ERROR MESSAGES. ! 8671: * ! 8672: * PARM1 EXPRESSION POINTER ! 8673: * ! 8674: {P$BXD{ENT{BL$P1{{{P1BLK ! 8675: {{JSR{EVALS{{{EVALUATE STRING ARGUMENT ! 8676: {{ERR{045{BREAKX{{EVALUATED ARGUMENT IS NOT STRING ! 8677: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS ! 8678: {{PPM{PBRK1{{{MERGE WITH BREAK IF ALL OK ! 8679: {{EJC{{{{ ! 8680: * ! 8681: * CURSOR ASSIGNMENT ! 8682: * ! 8683: * PARM1 NAME BASE ! 8684: * PARM2 NAME OFFSET ! 8685: * ! 8686: {P$CAS{ENT{BL$P2{{{P2BLK ! 8687: {{MOV{R9{-(SP){{SAVE NODE POINTER ! 8688: {{MOV{R7{-(SP){{SAVE CURSOR ! 8689: {{MOV{4*PARM1(R9){R10{{LOAD NAME BASE ! 8690: {{MTI{R7{{{LOAD CURSOR AS INTEGER ! 8691: {{MOV{4*PARM2(R9){R7{{LOAD NAME OFFSET ! 8692: {{JSR{ICBLD{{{GET ICBLK FOR CURSOR VALUE ! 8693: {{MOV{R7{R6{{MOVE NAME OFFSET ! 8694: {{MOV{R9{R7{{MOVE VALUE TO ASSIGN ! 8695: {{JSR{ASINP{{{PERFORM ASSIGNMENT ! 8696: {{PPM{FLPOP{{{FAIL ON ASSIGNMENT FAILURE ! 8697: {{MOV{(SP)+{R7{{ELSE RESTORE CURSOR ! 8698: {{MOV{(SP)+{R9{{RESTORE NODE POINTER ! 8699: {{BRN{SUCCP{{{AND SUCCEED MATCHING NULL ! 8700: {{EJC{{{{ ! 8701: * ! 8702: * EXPRESSION NODE (P$EXA, INITIAL ENTRY) ! 8703: * ! 8704: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 8705: * ALGORITHMS FOR HANDLING EXPRESSION NODES. ! 8706: * ! 8707: * PARM1 EXPRESSION POINTER ! 8708: * ! 8709: {P$EXA{ENT{BL$P1{{{P1BLK ! 8710: {{JSR{EVALP{{{EVALUATE EXPRESSION ! 8711: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS ! 8712: {{BLO{R6{#P$AAA{PEXA1{JUMP IF RESULT IS NOT A PATTERN ! 8713: * ! 8714: * HERE IF RESULT OF EXPRESSION IS A PATTERN ! 8715: * ! 8716: {{MOV{R7{-(SP){{STACK DUMMY CURSOR ! 8717: {{MOV{R9{-(SP){{STACK PTR TO P$EXA NODE ! 8718: {{MOV{PMHBS{-(SP){{STACK HISTORY STACK BASE PTR ! 8719: {{MOV{#NDEXB{-(SP){{STACK PTR TO SPECIAL NODE NDEXB ! 8720: {{MOV{SP{PMHBS{{STORE NEW STACK BASE POINTER ! 8721: {{MOV{R10{R9{{COPY NODE POINTER ! 8722: {{BRI{(R9){{{MATCH FIRST NODE IN EXPRESSION PAT ! 8723: * ! 8724: * HERE IF RESULT OF EXPRESSION IS NOT A PATTERN ! 8725: * ! 8726: {PEXA1{BEQ{R6{#B$SCL{PEXA2{JUMP IF IT IS ALREADY A STRING ! 8727: {{MOV{R10{-(SP){{ELSE STACK RESULT ! 8728: {{MOV{R9{R10{{SAVE NODE POINTER ! 8729: {{JSR{GTSTG{{{CONVERT RESULT TO STRING ! 8730: {{ERR{046{EXPRESSION{{DOES NOT EVALUATE TO PATTERN ! 8731: {{MOV{R9{R8{{COPY STRING POINTER ! 8732: {{MOV{R10{R9{{RESTORE NODE POINTER ! 8733: {{MOV{R8{R10{{COPY STRING POINTER AGAIN ! 8734: * ! 8735: * MERGE HERE WITH STRING POINTER IN XL ! 8736: * ! 8737: {PEXA2{BZE{4*SCLEN(R10){SUCCP{{JUST SUCCEED IF NULL STRING ! 8738: {{BRN{PSTR1{{{ELSE MERGE WITH STRING CIRCUIT ! 8739: {{EJC{{{{ ! 8740: * ! 8741: * EXPRESSION NODE (P$EXB, REMOVE NDEXB ENTRY) ! 8742: * ! 8743: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 8744: * ALGORITHMS FOR HANDLING EXPRESSION NODES. ! 8745: * ! 8746: * NO PARAMETERS (DUMMY PATTERN) ! 8747: * ! 8748: {P$EXB{ENT{{{{ENTRY POINT ! 8749: {{MOV{R7{PMHBS{{RESTORE OUTER LEVEL STACK POINTER ! 8750: {{BRN{FLPOP{{{FAIL AND POP P$EXA NODE PTR ! 8751: {{EJC{{{{ ! 8752: * ! 8753: * EXPRESSION NODE (P$EXC, REMOVE NDEXC ENTRY) ! 8754: * ! 8755: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 8756: * ALGORITHMS FOR HANDLING EXPRESSION NODES. ! 8757: * ! 8758: * NO PARAMETERS (DUMMY PATTERN) ! 8759: * ! 8760: {P$EXC{ENT{{{{ENTRY POINT ! 8761: {{MOV{R7{PMHBS{{RESTORE INNER STACK BASE POINTER ! 8762: {{BRN{FAILP{{{AND FAIL INTO EXPR PATTERN ALTERNVS ! 8763: {{EJC{{{{ ! 8764: * ! 8765: * FAIL ! 8766: * ! 8767: * NO PARAMETERS ! 8768: * ! 8769: {P$FAL{ENT{BL$P0{{{P0BLK ! 8770: {{BRN{FAILP{{{JUST SIGNAL FAILURE ! 8771: {{EJC{{{{ ! 8772: * ! 8773: * FENCE ! 8774: * ! 8775: * SEE COMPOUND PATTERNS SECTION FOR THE STRUCTURE AND ! 8776: * ALGORITHM FOR MATCHING THIS NODE TYPE. ! 8777: * ! 8778: * NO PARAMETERS ! 8779: * ! 8780: {P$FEN{ENT{BL$P0{{{P0BLK ! 8781: {{MOV{R7{-(SP){{STACK DUMMY CURSOR ! 8782: {{MOV{#NDABO{-(SP){{STACK PTR TO ABORT NODE ! 8783: {{BRN{SUCCP{{{AND SUCCEED MATCHING NULL ! 8784: {{EJC{{{{ ! 8785: * ! 8786: * FENCE (FUNCTION) ! 8787: * ! 8788: * SEE COMPOUND PATTERNS COMMENTS AT START OF THIS SECTION ! 8789: * FOR DETAILS OF SCHEME ! 8790: * ! 8791: * NO PARAMETERS ! 8792: * ! 8793: {P$FNA{ENT{BL$P0{{{P0BLK ! 8794: {{MOV{PMHBS{-(SP){{STACK CURRENT HISTORY STACK BASE ! 8795: {{MOV{#NDFNB{-(SP){{STACK INDIR PTR TO P$FNB (FAILURE) ! 8796: {{MOV{SP{PMHBS{{BEGIN NEW HISTORY STACK ! 8797: {{BRN{SUCCP{{{SUCCEED ! 8798: {{EJC{{{{ ! 8799: * ! 8800: * FENCE (FUNCTION) (RESET HISTORY STACK AND FAIL) ! 8801: * ! 8802: * NO PARAMETERS (DUMMY PATTERN) ! 8803: * ! 8804: {P$FNB{ENT{BL$P0{{{P0BLK ! 8805: {{MOV{R7{PMHBS{{RESTORE OUTER PMHBS STACK BASE ! 8806: {{BRN{FAILP{{{...AND FAIL ! 8807: {{EJC{{{{ ! 8808: * ! 8809: * FENCE (FUNCTION) (MAKE FENCE TRAP ENTRY ON STACK) ! 8810: * ! 8811: * NO PARAMETERS (DUMMY PATTERN) ! 8812: * ! 8813: {P$FNC{ENT{BL$P0{{{P0BLK ! 8814: {{MOV{PMHBS{R10{{GET INNER STACK BASE PTR ! 8815: {{MOV{4*NUM01(R10){PMHBS{{RESTORE OUTER STACK BASE ! 8816: {{BEQ{R10{SP{PFNC1{OPTIMIZE IF NO ALTERNATIVES ! 8817: {{MOV{R10{-(SP){{ELSE STACK INNER STACK BASE ! 8818: {{MOV{#NDFND{-(SP){{STACK PTR TO NDFND ! 8819: {{BRN{SUCCP{{{SUCCEED ! 8820: * ! 8821: * HERE WHEN FENCE FUNCTION LEFT NOTHING ON THE STACK ! 8822: * ! 8823: {PFNC1{ADD{#4*NUM02{SP{{POP OFF P$FNB ENTRY ! 8824: {{BRN{SUCCP{{{SUCCEED ! 8825: {{EJC{{{{ ! 8826: * ! 8827: * FENCE (FUNCTION) (SKIP PAST ALTERNATIVES ON FAILURE) ! 8828: * ! 8829: * NO PARAMETERS (DUMMY PATTERN) ! 8830: * ! 8831: {P$FND{ENT{BL$P0{{{P0BLK ! 8832: {{MOV{R7{SP{{POP STACK TO FENCE() HISTORY BASE ! 8833: {{BRN{FLPOP{{{POP BASE ENTRY AND FAIL ! 8834: {{EJC{{{{ ! 8835: * ! 8836: * IMMEDIATE ASSIGNMENT (INITIAL ENTRY, SAVE CURRENT CURSOR) ! 8837: * ! 8838: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE ! 8839: * STRUCTURE AND ALGORITHM FOR MATCHING THIS NODE TYPE. ! 8840: * ! 8841: * NO PARAMETERS ! 8842: * ! 8843: {P$IMA{ENT{BL$P0{{{P0BLK ! 8844: {{MOV{R7{-(SP){{STACK CURSOR ! 8845: {{MOV{R9{-(SP){{STACK DUMMY NODE POINTER ! 8846: {{MOV{PMHBS{-(SP){{STACK OLD STACK BASE POINTER ! 8847: {{MOV{#NDIMB{-(SP){{STACK PTR TO SPECIAL NODE NDIMB ! 8848: {{MOV{SP{PMHBS{{STORE NEW STACK BASE POINTER ! 8849: {{BRN{SUCCP{{{AND SUCCEED ! 8850: {{EJC{{{{ ! 8851: * ! 8852: * IMMEDIATE ASSIGNMENT (REMOVE CURSOR MARK ENTRY) ! 8853: * ! 8854: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE ! 8855: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 8856: * ! 8857: * NO PARAMETERS (DUMMY PATTERN) ! 8858: * ! 8859: {P$IMB{ENT{{{{ENTRY POINT ! 8860: {{MOV{R7{PMHBS{{RESTORE HISTORY STACK BASE PTR ! 8861: {{BRN{FLPOP{{{FAIL AND POP DUMMY NODE PTR ! 8862: {{EJC{{{{ ! 8863: * ! 8864: * IMMEDIATE ASSIGNMENT (PERFORM ACTUAL ASSIGNMENT) ! 8865: * ! 8866: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE ! 8867: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 8868: * ! 8869: * PARM1 NAME BASE OF VARIABLE ! 8870: * PARM2 NAME OFFSET OF VARIABLE ! 8871: * ! 8872: {P$IMC{ENT{BL$P2{{{P2BLK ! 8873: {{MOV{PMHBS{R10{{LOAD POINTER TO P$IMB ENTRY ! 8874: {{MOV{R7{R6{{COPY FINAL CURSOR ! 8875: {{MOV{4*3(R10){R7{{LOAD INITIAL CURSOR ! 8876: {{MOV{4*1(R10){PMHBS{{RESTORE OUTER STACK BASE POINTER ! 8877: {{BEQ{R10{SP{PIMC1{JUMP IF NO HISTORY STACK ENTRIES ! 8878: {{MOV{R10{-(SP){{ELSE SAVE INNER PMHBS POINTER ! 8879: {{MOV{#NDIMD{-(SP){{AND A PTR TO SPECIAL NODE NDIMD ! 8880: {{BRN{PIMC2{{{MERGE ! 8881: * ! 8882: * HERE IF NO ENTRIES MADE ON HISTORY STACK ! 8883: * ! 8884: {PIMC1{ADD{#4*NUM04{SP{{REMOVE NDIMB ENTRY AND CURSOR ! 8885: * ! 8886: * MERGE HERE TO PERFORM ASSIGNMENT ! 8887: * ! 8888: {PIMC2{MOV{R6{-(SP){{SAVE CURRENT (FINAL) CURSOR ! 8889: {{MOV{R9{-(SP){{SAVE CURRENT NODE POINTER ! 8890: {{MOV{R$PMS{R10{{POINT TO SUBJECT STRING ! 8891: {{SUB{R7{R6{{COMPUTE SUBSTRING LENGTH ! 8892: {{JSR{SBSTR{{{BUILD SUBSTRING ! 8893: {{MOV{R9{R7{{MOVE RESULT ! 8894: {{MOV{(SP){R9{{RELOAD NODE POINTER ! 8895: {{MOV{4*PARM1(R9){R10{{LOAD NAME BASE ! 8896: {{MOV{4*PARM2(R9){R6{{LOAD NAME OFFSET ! 8897: {{JSR{ASINP{{{PERFORM ASSIGNMENT ! 8898: {{PPM{FLPOP{{{FAIL IF ASSIGNMENT FAILS ! 8899: {{MOV{(SP)+{R9{{ELSE RESTORE NODE POINTER ! 8900: {{MOV{(SP)+{R7{{RESTORE CURSOR ! 8901: {{BRN{SUCCP{{{AND SUCCEED ! 8902: {{EJC{{{{ ! 8903: * ! 8904: * IMMEDIATE ASSIGNMENT (REMOVE NDIMD ENTRY ON FAILURE) ! 8905: * ! 8906: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE ! 8907: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 8908: * ! 8909: * NO PARAMETERS (DUMMY PATTERN) ! 8910: * ! 8911: {P$IMD{ENT{{{{ENTRY POINT ! 8912: {{MOV{R7{PMHBS{{RESTORE INNER STACK BASE POINTER ! 8913: {{BRN{FAILP{{{AND FAIL ! 8914: {{EJC{{{{ ! 8915: * ! 8916: * LEN (INTEGER ARGUMENT) ! 8917: * ! 8918: * PARM1 INTEGER ARGUMENT ! 8919: * ! 8920: {P$LEN{ENT{BL$P1{{{P1BLK ! 8921: * ! 8922: * EXPRESSION ARGUMENT CASE MERGES HERE ! 8923: * ! 8924: {PLEN1{ADD{4*PARM1(R9){R7{{PUSH CURSOR INDICATED AMOUNT ! 8925: {{BLE{R7{PMSSL{SUCCP{SUCCEED IF NOT OFF END ! 8926: {{BRN{FAILP{{{ELSE FAIL ! 8927: {{EJC{{{{ ! 8928: * ! 8929: * LEN (EXPRESSION ARGUMENT) ! 8930: * ! 8931: * PARM1 EXPRESSION POINTER ! 8932: * ! 8933: {P$LND{ENT{BL$P1{{{P1BLK ! 8934: {{JSR{EVALI{{{EVALUATE INTEGER ARGUMENT ! 8935: {{ERR{047{LEN{{EVALUATED ARGUMENT IS NOT INTEGER ! 8936: {{ERR{048{LEN{{EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE ! 8937: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS ! 8938: {{PPM{PLEN1{{{MERGE WITH NORMAL CIRCUIT IF OK ! 8939: {{EJC{{{{ ! 8940: * ! 8941: * NOTANY (EXPRESSION ARGUMENT) ! 8942: * ! 8943: * PARM1 EXPRESSION POINTER ! 8944: * ! 8945: {P$NAD{ENT{BL$P1{{{P1BLK ! 8946: {{JSR{EVALS{{{EVALUATE STRING ARGUMENT ! 8947: {{ERR{049{NOTANY{{EVALUATED ARGUMENT IS NOT STRING ! 8948: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS ! 8949: {{PPM{PNAY1{{{MERGE WITH MULTI-CHAR CASE IF OK ! 8950: {{EJC{{{{ ! 8951: * ! 8952: * NOTANY (ONE CHARACTER ARGUMENT) ! 8953: * ! 8954: * PARM1 CHARACTER ARGUMENT ! 8955: * ! 8956: {P$NAS{ENT{BL$P1{{{ENTRY POINT ! 8957: {{BEQ{R7{PMSSL{FAILP{FAIL IF NO CHARS LEFT ! 8958: {{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING ! 8959: {{PLC{R10{R7{{POINT TO CURRENT CHARACTER IN STRIN ! 8960: {{LCH{R6{(R10){{LOAD CURRENT CHARACTER ! 8961: {{BEQ{R6{4*PARM1(R9){FAILP{FAIL IF MATCH ! 8962: {{ICV{R7{{{ELSE BUMP CURSOR ! 8963: {{BRN{SUCCP{{{AND SUCCEED ! 8964: {{EJC{{{{ ! 8965: * ! 8966: * NOTANY (MULTI-CHARACTER STRING ARGUMENT) ! 8967: * ! 8968: * PARM1 POINTER TO CTBLK ! 8969: * PARM2 BIT MASK TO SELECT BIT COLUMN ! 8970: * ! 8971: {P$NAY{ENT{BL$P2{{{P2BLK ! 8972: * ! 8973: * EXPRESSION ARGUMENT CASE MERGES HERE ! 8974: * ! 8975: {PNAY1{BEQ{R7{PMSSL{FAILP{FAIL IF NO CHARACTERS LEFT ! 8976: {{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING ! 8977: {{PLC{R10{R7{{POINT TO CURRENT CHARACTER ! 8978: {{LCH{R6{(R10){{LOAD CURRENT CHARACTER ! 8979: {{WTB{R6{{{CONVERT TO BYTE OFFSET ! 8980: {{MOV{4*PARM1(R9){R10{{LOAD POINTER TO CTBLK ! 8981: {{ADD{R6{R10{{POINT TO ENTRY IN CTBLK ! 8982: {{MOV{4*CTCHS(R10){R6{{LOAD ENTRY FROM CTBLK ! 8983: {{ANB{4*PARM2(R9){R6{{AND WITH SELECTED BIT ! 8984: {{NZB{R6{FAILP{{FAIL IF CHARACTER IS MATCHED ! 8985: {{ICV{R7{{{ELSE BUMP CURSOR ! 8986: {{BRN{SUCCP{{{AND SUCCEED ! 8987: {{EJC{{{{ ! 8988: * ! 8989: * END OF PATTERN MATCH ! 8990: * ! 8991: * THIS ROUTINE IS ENTERED ON SUCCESSFUL COMPLETION. ! 8992: * SEE DESCRIPTION OF EXPRESSION PATTERNS IN COMPOUND ! 8993: * PATTERN SECTION FOR HANDLING OF RECURSION IN MATCHING. ! 8994: * ! 8995: * NO PARAMETERS (DUMMY PATTERN) ! 8996: * ! 8997: {P$NTH{ENT{{{{ENTRY POINT ! 8998: {{MOV{PMHBS{R10{{LOAD POINTER TO BASE OF STACK ! 8999: {{MOV{4*1(R10){R6{{LOAD SAVED PMHBS (OR PATTERN TYPE) ! 9000: {{BLE{R6{#NUM02{PNTH2{JUMP IF OUTER LEVEL (PATTERN TYPE) ! 9001: * ! 9002: * HERE WE ARE AT THE END OF MATCHING AN EXPRESSION PATTERN ! 9003: * ! 9004: {{MOV{R6{PMHBS{{RESTORE OUTER STACK BASE POINTER ! 9005: {{MOV{4*2(R10){R9{{RESTORE POINTER TO P$EXA NODE ! 9006: {{BEQ{R10{SP{PNTH1{JUMP IF NO HISTORY STACK ENTRIES ! 9007: {{MOV{R10{-(SP){{ELSE STACK INNER STACK BASE PTR ! 9008: {{MOV{#NDEXC{-(SP){{STACK PTR TO SPECIAL NODE NDEXC ! 9009: {{BRN{SUCCP{{{AND SUCCEED ! 9010: * ! 9011: * HERE IF NO HISTORY STACK ENTRIES DURING PATTERN ! 9012: * ! 9013: {PNTH1{ADD{#4*NUM04{SP{{REMOVE P$EXB ENTRY AND NODE PTR ! 9014: {{BRN{SUCCP{{{AND SUCCEED ! 9015: * ! 9016: * HERE IF END OF MATCH AT OUTER LEVEL ! 9017: * ! 9018: {PNTH2{MOV{R7{PMSSL{{SAVE FINAL CURSOR IN SAFE PLACE ! 9019: {{BZE{PMDFL{PNTH6{{JUMP IF NO PATTERN ASSIGNMENTS ! 9020: {{EJC{{{{ ! 9021: * ! 9022: * END OF PATTERN MATCH (CONTINUED) ! 9023: * ! 9024: * NOW WE MUST PERFORM PATTERN ASSIGNMENTS. THIS IS DONE BY ! 9025: * SCANNING THE HISTORY STACK FOR MATCHING NDPAB-NDPAD PAIRS ! 9026: * ! 9027: {PNTH3{DCA{R10{{{POINT PAST CURSOR ENTRY ! 9028: {{MOV{-(R10){R6{{LOAD NODE POINTER ! 9029: {{BEQ{R6{#NDPAD{PNTH4{JUMP IF NDPAD ENTRY ! 9030: {{BNE{R6{#NDPAB{PNTH5{JUMP IF NOT NDPAB ENTRY ! 9031: * ! 9032: * HERE FOR NDPAB ENTRY, STACK INITIAL CURSOR ! 9033: * NOTE THAT THERE MUST BE MORE ENTRIES ON THE STACK. ! 9034: * ! 9035: {{MOV{4*1(R10){-(SP){{STACK INITIAL CURSOR ! 9036: {{CHK{{{{CHECK FOR STACK OVERFLOW ! 9037: {{BRN{PNTH3{{{LOOP BACK IF OK ! 9038: * ! 9039: * HERE FOR NDPAD ENTRY. THE STARTING CURSOR FROM THE ! 9040: * MATCHING NDPAD ENTRY IS NOW THE TOP STACK ENTRY. ! 9041: * ! 9042: {PNTH4{MOV{4*1(R10){R6{{LOAD FINAL CURSOR ! 9043: {{MOV{(SP){R7{{LOAD INITIAL CURSOR FROM STACK ! 9044: {{MOV{R10{(SP){{SAVE HISTORY STACK SCAN PTR ! 9045: {{SUB{R7{R6{{COMPUTE LENGTH OF STRING ! 9046: * ! 9047: * BUILD SUBSTRING AND PERFORM ASSIGNMENT ! 9048: * ! 9049: {{MOV{R$PMS{R10{{POINT TO SUBJECT STRING ! 9050: {{JSR{SBSTR{{{CONSTRUCT SUBSTRING ! 9051: {{MOV{R9{R7{{COPY SUBSTRING POINTER ! 9052: {{MOV{(SP){R10{{RELOAD HISTORY STACK SCAN PTR ! 9053: {{MOV{4*2(R10){R10{{LOAD POINTER TO P$PAC NODE WITH NAM ! 9054: {{MOV{4*PARM2(R10){R6{{LOAD NAME OFFSET ! 9055: {{MOV{4*PARM1(R10){R10{{LOAD NAME BASE ! 9056: {{JSR{ASINP{{{PERFORM ASSIGNMENT ! 9057: {{PPM{EXFAL{{{MATCH FAILS IF NAME EVAL FAILS ! 9058: {{MOV{(SP)+{R10{{ELSE RESTORE HISTORY STACK PTR ! 9059: {{EJC{{{{ ! 9060: * ! 9061: * END OF PATTERN MATCH (CONTINUED) ! 9062: * ! 9063: * HERE CHECK FOR END OF ENTRIES ! 9064: * ! 9065: {PNTH5{BNE{R10{SP{PNTH3{LOOP IF MORE ENTRIES TO SCAN ! 9066: * ! 9067: * HERE AFTER DEALING WITH PATTERN ASSIGNMENTS ! 9068: * ! 9069: {PNTH6{MOV{PMHBS{SP{{WIPE OUT HISTORY STACK ! 9070: {{MOV{(SP)+{R7{{LOAD INITIAL CURSOR ! 9071: {{MOV{(SP)+{R8{{LOAD MATCH TYPE CODE ! 9072: {{MOV{PMSSL{R6{{LOAD FINAL CURSOR VALUE ! 9073: {{MOV{R$PMS{R10{{POINT TO SUBJECT STRING ! 9074: {{ZER{R$PMS{{{CLEAR SUBJECT STRING PTR FOR GBCOL ! 9075: {{BZE{R8{PNTH7{{JUMP IF CALL BY NAME ! 9076: {{BEQ{R8{#NUM02{EXITS{EXIT IF STATEMENT LEVEL CALL ! 9077: * ! 9078: * HERE WE HAVE A CALL BY VALUE, BUILD SUBSTRING ! 9079: * ! 9080: {{SUB{R7{R6{{COMPUTE LENGTH OF STRING ! 9081: {{JSR{SBSTR{{{BUILD SUBSTRING ! 9082: {{BRN{EXIXR{{{AND EXIT WITH SUBSTRING VALUE ! 9083: * ! 9084: * HERE FOR CALL BY NAME, MAKE STACK ENTRIES FOR O$RPL ! 9085: * ! 9086: {PNTH7{MOV{R7{-(SP){{STACK INITIAL CURSOR ! 9087: {{MOV{R6{-(SP){{STACK FINAL CURSOR ! 9088: {{BZE{R$PMB{PNTH8{{SKIP IF SUBJECT NOT BUFFER ! 9089: {{MOV{R$PMB{R10{{ELSE GET PTR TO BCBLK INSTEAD ! 9090: * ! 9091: * HERE WITH XL POINTING TO SCBLK OR BCBLK ! 9092: * ! 9093: {PNTH8{MOV{R10{-(SP){{STACK SUBJECT POINTER ! 9094: {{BRN{EXITS{{{EXIT WITH SPECIAL ENTRY ON STACK ! 9095: {{EJC{{{{ ! 9096: * ! 9097: * POS (INTEGER ARGUMENT) ! 9098: * ! 9099: * PARM1 INTEGER ARGUMENT ! 9100: * ! 9101: {P$POS{ENT{BL$P1{{{P1BLK ! 9102: * ! 9103: * EXPRESSION ARGUMENT CASE MERGES HERE ! 9104: * ! 9105: {PPOS1{BEQ{R7{4*PARM1(R9){SUCCP{SUCCEED IF AT RIGHT LOCATION ! 9106: {{BRN{FAILP{{{ELSE FAIL ! 9107: {{EJC{{{{ ! 9108: * ! 9109: * POS (EXPRESSION ARGUMENT) ! 9110: * ! 9111: * PARM1 EXPRESSION POINTER ! 9112: * ! 9113: {P$PSD{ENT{BL$P1{{{P1BLK ! 9114: {{JSR{EVALI{{{EVALUATE INTEGER ARGUMENT ! 9115: {{ERR{050{POS{{EVALUATED ARGUMENT IS NOT INTEGER ! 9116: {{ERR{051{POS{{EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE ! 9117: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS ! 9118: {{PPM{PPOS1{{{MERGE WITH NORMAL CASE IF OK ! 9119: {{EJC{{{{ ! 9120: * ! 9121: * PATTERN ASSIGNMENT (INITIAL ENTRY, SAVE CURSOR) ! 9122: * ! 9123: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 9124: * ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 9125: * ! 9126: * NO PARAMETERS ! 9127: * ! 9128: {P$PAA{ENT{BL$P0{{{P0BLK ! 9129: {{MOV{R7{-(SP){{STACK INITIAL CURSOR ! 9130: {{MOV{#NDPAB{-(SP){{STACK PTR TO NDPAB SPECIAL NODE ! 9131: {{BRN{SUCCP{{{AND SUCCEED MATCHING NULL ! 9132: {{EJC{{{{ ! 9133: * ! 9134: * PATTERN ASSIGNMENT (REMOVE SAVED CURSOR) ! 9135: * ! 9136: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 9137: * ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 9138: * ! 9139: * NO PARAMETERS (DUMMY PATTERN) ! 9140: * ! 9141: {P$PAB{ENT{{{{ENTRY POINT ! 9142: {{BRN{FAILP{{{JUST FAIL (ENTRY IS ALREADY POPPED) ! 9143: {{EJC{{{{ ! 9144: * ! 9145: * PATTERN ASSIGNMENT (END OF MATCH, MAKE ASSIGN ENTRY) ! 9146: * ! 9147: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 9148: * ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 9149: * ! 9150: * PARM1 NAME BASE OF VARIABLE ! 9151: * PARM2 NAME OFFSET OF VARIABLE ! 9152: * ! 9153: {P$PAC{ENT{BL$P2{{{P2BLK ! 9154: {{MOV{R7{-(SP){{STACK DUMMY CURSOR VALUE ! 9155: {{MOV{R9{-(SP){{STACK POINTER TO P$PAC NODE ! 9156: {{MOV{R7{-(SP){{STACK FINAL CURSOR ! 9157: {{MOV{#NDPAD{-(SP){{STACK PTR TO SPECIAL NDPAD NODE ! 9158: {{MNZ{PMDFL{{{SET DOT FLAG NON-ZERO ! 9159: {{BRN{SUCCP{{{AND SUCCEED ! 9160: {{EJC{{{{ ! 9161: * ! 9162: * PATTERN ASSIGNMENT (REMOVE ASSIGN ENTRY) ! 9163: * ! 9164: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 9165: * ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 9166: * ! 9167: * NO PARAMETERS (DUMMY NODE) ! 9168: * ! 9169: {P$PAD{ENT{{{{ENTRY POINT ! 9170: {{BRN{FLPOP{{{FAIL AND REMOVE P$PAC NODE ! 9171: {{EJC{{{{ ! 9172: * ! 9173: * REM ! 9174: * ! 9175: * NO PARAMETERS ! 9176: * ! 9177: {P$REM{ENT{BL$P0{{{P0BLK ! 9178: {{MOV{PMSSL{R7{{POINT CURSOR TO END OF STRING ! 9179: {{BRN{SUCCP{{{AND SUCCEED ! 9180: {{EJC{{{{ ! 9181: * ! 9182: * RPOS (EXPRESSION ARGUMENT) ! 9183: * ! 9184: * PARM1 EXPRESSION POINTER ! 9185: * ! 9186: {P$RPD{ENT{BL$P1{{{P1BLK ! 9187: {{JSR{EVALI{{{EVALUATE INTEGER ARGUMENT ! 9188: {{ERR{052{RPOS{{EVALUATED ARGUMENT IS NOT INTEGER ! 9189: {{ERR{053{RPOS{{EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE ! 9190: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS ! 9191: {{PPM{PRPS1{{{MERGE WITH NORMAL CASE IF OK ! 9192: {{EJC{{{{ ! 9193: * ! 9194: * RPOS (INTEGER ARGUMENT) ! 9195: * ! 9196: * PARM1 INTEGER ARGUMENT ! 9197: * ! 9198: {P$RPS{ENT{BL$P1{{{P1BLK ! 9199: * ! 9200: * EXPRESSION ARGUMENT CASE MERGES HERE ! 9201: * ! 9202: {PRPS1{MOV{PMSSL{R8{{GET LENGTH OF STRING ! 9203: {{SUB{R7{R8{{GET NUMBER OF CHARACTERS REMAINING ! 9204: {{BEQ{R8{4*PARM1(R9){SUCCP{SUCCEED IF AT RIGHT LOCATION ! 9205: {{BRN{FAILP{{{ELSE FAIL ! 9206: {{EJC{{{{ ! 9207: * ! 9208: * RTAB (INTEGER ARGUMENT) ! 9209: * ! 9210: * PARM1 INTEGER ARGUMENT ! 9211: * ! 9212: {P$RTB{ENT{BL$P1{{{P1BLK ! 9213: * ! 9214: * EXPRESSION ARGUMENT CASE MERGES HERE ! 9215: * ! 9216: {PRTB1{MOV{R7{R8{{SAVE INITIAL CURSOR ! 9217: {{MOV{PMSSL{R7{{POINT TO END OF STRING ! 9218: {{BLT{R7{4*PARM1(R9){FAILP{FAIL IF STRING NOT LONG ENOUGH ! 9219: {{SUB{4*PARM1(R9){R7{{ELSE SET NEW CURSOR ! 9220: {{BGE{R7{R8{SUCCP{AND SUCCEED IF NOT TOO FAR ALREADY ! 9221: {{BRN{FAILP{{{IN WHICH CASE, FAIL ! 9222: {{EJC{{{{ ! 9223: * ! 9224: * RTAB (EXPRESSION ARGUMENT) ! 9225: * ! 9226: * PARM1 EXPRESSION POINTER ! 9227: * ! 9228: {P$RTD{ENT{BL$P1{{{P1BLK ! 9229: {{JSR{EVALI{{{EVALUATE INTEGER ARGUMENT ! 9230: {{ERR{054{RTAB{{EVALUATED ARGUMENT IS NOT INTEGER ! 9231: {{ERR{055{RTAB{{EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE ! 9232: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS ! 9233: {{PPM{PRTB1{{{MERGE WITH NORMAL CASE IF SUCCESS ! 9234: {{EJC{{{{ ! 9235: * ! 9236: * SPAN (EXPRESSION ARGUMENT) ! 9237: * ! 9238: * PARM1 EXPRESSION POINTER ! 9239: * ! 9240: {P$SPD{ENT{BL$P1{{{P1BLK ! 9241: {{JSR{EVALS{{{EVALUATE STRING ARGUMENT ! 9242: {{ERR{056{SPAN{{EVALUATED ARGUMENT IS NOT STRING ! 9243: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS ! 9244: {{PPM{PSPN1{{{MERGE WITH MULTI-CHAR CASE IF OK ! 9245: {{EJC{{{{ ! 9246: * ! 9247: * SPAN (MULTI-CHARACTER ARGUMENT CASE) ! 9248: * ! 9249: * PARM1 POINTER TO CTBLK ! 9250: * PARM2 BIT MASK TO SELECT BIT COLUMN ! 9251: * ! 9252: {P$SPN{ENT{BL$P2{{{P2BLK ! 9253: * ! 9254: * EXPRESSION ARGUMENT CASE MERGES HERE ! 9255: * ! 9256: {PSPN1{MOV{PMSSL{R8{{COPY SUBJECT STRING LENGTH ! 9257: {{SUB{R7{R8{{CALCULATE NUMBER OF CHARACTERS LEFT ! 9258: {{BZE{R8{FAILP{{FAIL IF NO CHARACTERS LEFT ! 9259: {{MOV{R$PMS{R10{{POINT TO SUBJECT STRING ! 9260: {{PLC{R10{R7{{POINT TO CURRENT CHARACTER ! 9261: {{MOV{R7{PSAVC{{SAVE INITIAL CURSOR ! 9262: {{MOV{R9{PSAVE{{SAVE NODE POINTER ! 9263: {{LCT{R8{R8{{SET COUNTER FOR CHARS LEFT ! 9264: * ! 9265: * LOOP TO SCAN MATCHING CHARACTERS ! 9266: * ! 9267: {PSPN2{LCH{R6{(R10)+{{LOAD NEXT CHARACTER, BUMP POINTER ! 9268: {{WTB{R6{{{CONVERT TO BYTE OFFSET ! 9269: {{MOV{4*PARM1(R9){R9{{POINT TO CTBLK ! 9270: {{ADD{R6{R9{{POINT TO CTBLK ENTRY ! 9271: {{MOV{4*CTCHS(R9){R6{{LOAD CTBLK ENTRY ! 9272: {{MOV{PSAVE{R9{{RESTORE NODE POINTER ! 9273: {{ANB{4*PARM2(R9){R6{{AND WITH SELECTED BIT ! 9274: {{ZRB{R6{PSPN3{{JUMP IF NO MATCH ! 9275: {{ICV{R7{{{ELSE PUSH CURSOR ! 9276: {{BCT{R8{PSPN2{{LOOP BACK UNLESS END OF STRING ! 9277: * ! 9278: * HERE AFTER SCANNING MATCHING CHARACTERS ! 9279: * ! 9280: {PSPN3{BNE{R7{PSAVC{SUCCP{SUCCEED IF CHARS MATCHED ! 9281: {{BRN{FAILP{{{ELSE FAIL IF NULL STRING MATCHED ! 9282: {{EJC{{{{ ! 9283: * ! 9284: * SPAN (ONE CHARACTER ARGUMENT) ! 9285: * ! 9286: * PARM1 CHARACTER ARGUMENT ! 9287: * ! 9288: {P$SPS{ENT{BL$P1{{{P1BLK ! 9289: {{MOV{PMSSL{R8{{GET SUBJECT STRING LENGTH ! 9290: {{SUB{R7{R8{{CALCULATE NUMBER OF CHARACTERS LEFT ! 9291: {{BZE{R8{FAILP{{FAIL IF NO CHARACTERS LEFT ! 9292: {{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING ! 9293: {{PLC{R10{R7{{POINT TO CURRENT CHARACTER ! 9294: {{MOV{R7{PSAVC{{SAVE INITIAL CURSOR ! 9295: {{LCT{R8{R8{{SET COUNTER FOR CHARACTERS LEFT ! 9296: * ! 9297: * LOOP TO SCAN MATCHING CHARACTERS ! 9298: * ! 9299: {PSPS1{LCH{R6{(R10)+{{LOAD NEXT CHARACTER, BUMP POINTER ! 9300: {{BNE{R6{4*PARM1(R9){PSPS2{JUMP IF NO MATCH ! 9301: {{ICV{R7{{{ELSE PUSH CURSOR ! 9302: {{BCT{R8{PSPS1{{AND LOOP UNLESS END OF STRING ! 9303: * ! 9304: * HERE AFTER SCANNING MATCHING CHARACTERS ! 9305: * ! 9306: {PSPS2{BNE{R7{PSAVC{SUCCP{SUCCEED IF CHARS MATCHED ! 9307: {{BRN{FAILP{{{FAIL IF NULL STRING MATCHED ! 9308: {{EJC{{{{ ! 9309: * ! 9310: * MULTI-CHARACTER STRING ! 9311: * ! 9312: * NOTE THAT ONE CHARACTER STRINGS USE THE CIRCUIT FOR ! 9313: * ONE CHARACTER ANY ARGUMENTS (P$AN1). ! 9314: * ! 9315: * PARM1 POINTER TO SCBLK FOR STRING ARG ! 9316: * ! 9317: {P$STR{ENT{BL$P1{{{P1BLK ! 9318: {{MOV{4*PARM1(R9){R10{{GET POINTER TO STRING ! 9319: * ! 9320: * MERGE HERE AFTER EVALUATING EXPRESSION WITH STRING VALUE ! 9321: * ! 9322: {PSTR1{MOV{R9{PSAVE{{SAVE NODE POINTER ! 9323: {{MOV{R$PMS{R9{{LOAD SUBJECT STRING POINTER ! 9324: {{PLC{R9{R7{{POINT TO CURRENT CHARACTER ! 9325: {{ADD{4*SCLEN(R10){R7{{COMPUTE NEW CURSOR POSITION ! 9326: {{BGT{R7{PMSSL{FAILP{FAIL IF PAST END OF STRING ! 9327: {{MOV{R7{PSAVC{{SAVE UPDATED CURSOR ! 9328: {{MOV{4*SCLEN(R10){R6{{GET NUMBER OF CHARS TO COMPARE ! 9329: {{PLC{R10{{{POINT TO CHARS OF TEST STRING ! 9330: {{CMC{FAILP{FAILP{{COMPARE, FAIL IF NOT EQUAL ! 9331: {{MOV{PSAVE{R9{{IF ALL MATCHED, RESTORE NODE PTR ! 9332: {{MOV{PSAVC{R7{{RESTORE UPDATED CURSOR ! 9333: {{BRN{SUCCP{{{AND SUCCEED ! 9334: {{EJC{{{{ ! 9335: * ! 9336: * SUCCEED ! 9337: * ! 9338: * SEE SECTION ON COMPOUND PATTERNS FOR DETAILS OF THE ! 9339: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE ! 9340: * ! 9341: * NO PARAMETERS ! 9342: * ! 9343: {P$SUC{ENT{BL$P0{{{P0BLK ! 9344: {{MOV{R7{-(SP){{STACK CURSOR ! 9345: {{MOV{R9{-(SP){{STACK POINTER TO THIS NODE ! 9346: {{BRN{SUCCP{{{SUCCEED MATCHING NULL ! 9347: {{EJC{{{{ ! 9348: * ! 9349: * TAB (INTEGER ARGUMENT) ! 9350: * ! 9351: * PARM1 INTEGER ARGUMENT ! 9352: * ! 9353: {P$TAB{ENT{BL$P1{{{P1BLK ! 9354: * ! 9355: * EXPRESSION ARGUMENT CASE MERGES HERE ! 9356: * ! 9357: {PTAB1{BGT{R7{4*PARM1(R9){FAILP{FAIL IF TOO FAR ALREADY ! 9358: {{MOV{4*PARM1(R9){R7{{ELSE SET NEW CURSOR POSITION ! 9359: {{BLE{R7{PMSSL{SUCCP{SUCCEED IF NOT OFF END ! 9360: {{BRN{FAILP{{{ELSE FAIL ! 9361: {{EJC{{{{ ! 9362: * ! 9363: * TAB (EXPRESSION ARGUMENT) ! 9364: * ! 9365: * PARM1 EXPRESSION POINTER ! 9366: * ! 9367: {P$TBD{ENT{BL$P1{{{P1BLK ! 9368: {{JSR{EVALI{{{EVALUATE INTEGER ARGUMENT ! 9369: {{ERR{057{TAB{{EVALUATED ARGUMENT IS NOT INTEGER ! 9370: {{ERR{058{TAB{{EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE ! 9371: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS ! 9372: {{PPM{PTAB1{{{MERGE WITH NORMAL CASE IF OK ! 9373: {{EJC{{{{ ! 9374: * ! 9375: * ANCHOR MOVEMENT ! 9376: * ! 9377: * NO PARAMETERS (DUMMY NODE) ! 9378: * ! 9379: {P$UNA{ENT{{{{ENTRY POINT ! 9380: {{MOV{R7{R9{{COPY INITIAL PATTERN NODE POINTER ! 9381: {{MOV{(SP){R7{{GET INITIAL CURSOR ! 9382: {{BEQ{R7{PMSSL{EXFAL{MATCH FAILS IF AT END OF STRING ! 9383: {{ICV{R7{{{ELSE INCREMENT CURSOR ! 9384: {{MOV{R7{(SP){{STORE INCREMENTED CURSOR ! 9385: {{MOV{R9{-(SP){{RESTACK INITIAL NODE PTR ! 9386: {{MOV{#NDUNA{-(SP){{RESTACK UNANCHORED NODE ! 9387: {{BRI{(R9){{{REMATCH FIRST NODE ! 9388: {{EJC{{{{ ! 9389: * ! 9390: * END OF PATTERN MATCH ROUTINES ! 9391: * ! 9392: * THE FOLLOWING ENTRY POINT MARKS THE END OF THE PATTERN ! 9393: * MATCHING ROUTINES AND ALSO THE END OF THE ENTRY POINTS ! 9394: * REFERENCED FROM THE FIRST WORD OF BLOCKS IN DYNAMIC STORE ! 9395: * ! 9396: {P$YYY{ENT{BL$$I{{{MARK LAST ENTRY IN PATTERN SECTION ! 9397: {{TTL{S{{{P I T B O L -- PREDEFINED SNOBOL4 FUNCTIONS ! 9398: * ! 9399: * THE FOLLOWING SECTION CONTAINS CODING FOR FUNCTIONS ! 9400: * WHICH ARE PREDEFINED AND AVAILABLE AT THE SNOBOL LEVEL. ! 9401: * ! 9402: * THESE ROUTINES RECEIVE CONTROL DIRECTLY FROM THE CODE OR ! 9403: * INDIRECTLY THROUGH THE O$FNC, O$FNS OR CFUNC ROUTINES. ! 9404: * IN BOTH CASES THE CONDITIONS ON ENTRY ARE AS FOLLOWS ! 9405: * ! 9406: * THE ARGUMENTS ARE ON THE STACK. THE NUMBER OF ARGUMENTS ! 9407: * HAS BEEN ADJUSTED TO CORRESPOND TO THE SVBLK SVNAR FIELD. ! 9408: * ! 9409: * IN CERTAIN FUNCTIONS THE DIRECT CALL IS NOT PERMITTED ! 9410: * AND IN THESE INSTANCES WE ALSO HAVE. ! 9411: * ! 9412: * (WA) ACTUAL NUMBER OF ARGUMENTS IN CALL ! 9413: * ! 9414: * CONTROL RETURNS BY PLACING THE FUNCTION RESULT VALUE ON ! 9415: * ON THE STACK AND CONTINUING EXECUTION WITH THE NEXT ! 9416: * WORD FROM THE GENERATED CODE. ! 9417: * ! 9418: * THE NAMES OF THE ENTRY POINTS OF THESE FUNCTIONS ARE OF ! 9419: * THE FORM S$XXX WHERE XXX IS THE THREE LETTER CODE FOR ! 9420: * THE SYSTEM VARIABLE NAME. THE FUNCTIONS ARE IN ORDER ! 9421: * ALPHABETICALLY BY THEIR ENTRY NAMES. ! 9422: {{EJC{{{{ ! 9423: * ! 9424: * ANY ! 9425: * ! 9426: {S$ANY{ENT{{{{ENTRY POINT ! 9427: {{MOV{#P$ANS{R7{{SET PCODE FOR SINGLE CHAR CASE ! 9428: {{MOV{#P$ANY{R10{{PCODE FOR MULTI-CHAR CASE ! 9429: {{MOV{#P$AYD{R8{{PCODE FOR EXPRESSION CASE ! 9430: {{JSR{PATST{{{CALL COMMON ROUTINE TO BUILD NODE ! 9431: {{ERR{059{ANY{{ARGUMENT IS NOT STRING OR EXPRESSION ! 9432: {{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD ! 9433: {{EJC{{{{ ! 9434: * ! 9435: * APPEND ! 9436: * ! 9437: {S$APN{ENT{{{{ENTRY POINT ! 9438: {{MOV{(SP)+{R10{{GET APPEND ARGUMENT ! 9439: {{MOV{(SP)+{R9{{GET BCBLK ! 9440: {{BEQ{(R9){#B$BCT{SAPN1{OK IF FIRST ARG IS BCBLK ! 9441: {{ERB{275{APPEND{{FIRST ARGUMENT IS NOT BUFFER ! 9442: * ! 9443: * HERE TO DO THE APPEND ! 9444: * ! 9445: {SAPN1{JSR{APNDB{{{DO THE APPEND ! 9446: {{ERR{276{APPEND{{SECOND ARGUMENT IS NOT STRING ! 9447: {{PPM{EXFAL{{{NO ROOM - FAIL ! 9448: {{BRN{EXNUL{{{EXIT WITH NULL RESULT ! 9449: {{EJC{{{{ ! 9450: * ! 9451: * APPLY ! 9452: * ! 9453: * APPLY DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT ! 9454: * WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED. ! 9455: * ! 9456: {S$APP{ENT{{{{ENTRY POINT ! 9457: {{BZE{R6{SAPP3{{JUMP IF NO ARGUMENTS ! 9458: {{DCV{R6{{{ELSE GET APPLIED FUNC ARG COUNT ! 9459: {{MOV{R6{R7{{COPY ! 9460: {{WTB{R7{{{CONVERT TO BYTES ! 9461: {{MOV{SP{R10{{COPY STACK POINTER ! 9462: {{ADD{R7{R10{{POINT TO FUNCTION ARGUMENT ON STACK ! 9463: {{MOV{(R10){R9{{LOAD FUNCTION PTR (APPLY 1ST ARG) ! 9464: {{BZE{R6{SAPP2{{JUMP IF NO ARGS FOR APPLIED FUNC ! 9465: {{LCT{R7{R6{{ELSE SET COUNTER FOR LOOP ! 9466: * ! 9467: * LOOP TO MOVE ARGUMENTS UP ON STACK ! 9468: * ! 9469: {SAPP1{DCA{R10{{{POINT TO NEXT ARGUMENT ! 9470: {{MOV{(R10){4*1(R10){{MOVE ARGUMENT UP ! 9471: {{BCT{R7{SAPP1{{LOOP TILL ALL MOVED ! 9472: * ! 9473: * MERGE HERE TO CALL FUNCTION (WA = NUMBER OF ARGUMENTS) ! 9474: * ! 9475: {SAPP2{ICA{SP{{{ADJUST STACK PTR FOR APPLY 1ST ARG ! 9476: {{JSR{GTNVR{{{GET VARIABLE BLOCK ADDR FOR FUNC ! 9477: {{PPM{SAPP3{{{JUMP IF NOT NATURAL VARIABLE ! 9478: {{MOV{4*VRFNC(R9){R10{{ELSE POINT TO FUNCTION BLOCK ! 9479: {{BRN{CFUNC{{{GO CALL APPLIED FUNCTION ! 9480: * ! 9481: * HERE FOR INVALID FIRST ARGUMENT ! 9482: * ! 9483: {SAPP3{ERB{060{APPLY{{FIRST ARG IS NOT NATURAL VARIABLE NAME ! 9484: {{EJC{{{{ ! 9485: * ! 9486: * ARBNO ! 9487: * ! 9488: * ARBNO BUILDS A COMPOUND PATTERN. SEE DESCRIPTION AT ! 9489: * START OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED. ! 9490: * ! 9491: {S$ABN{ENT{{{{ENTRY POINT ! 9492: {{ZER{R9{{{SET PARM1 = 0 FOR THE MOMENT ! 9493: {{MOV{#P$ALT{R7{{SET PCODE FOR ALTERNATIVE NODE ! 9494: {{JSR{PBILD{{{BUILD ALTERNATIVE NODE ! 9495: {{MOV{R9{R10{{SAVE PTR TO ALTERNATIVE PATTERN ! 9496: {{MOV{#P$ABC{R7{{PCODE FOR P$ABC ! 9497: {{ZER{R9{{{P0BLK ! 9498: {{JSR{PBILD{{{BUILD P$ABC NODE ! 9499: {{MOV{R10{4*PTHEN(R9){{PUT ALTERNATIVE NODE AS SUCCESSOR ! 9500: {{MOV{R10{R6{{REMEMBER ALTERNATIVE NODE POINTER ! 9501: {{MOV{R9{R10{{COPY P$ABC NODE PTR ! 9502: {{MOV{(SP){R9{{LOAD ARBNO ARGUMENT ! 9503: {{MOV{R6{(SP){{STACK ALTERNATIVE NODE POINTER ! 9504: {{JSR{GTPAT{{{GET ARBNO ARGUMENT AS PATTERN ! 9505: {{ERR{061{ARBNO{{ARGUMENT IS NOT PATTERN ! 9506: {{JSR{PCONC{{{CONCAT ARG WITH P$ABC NODE ! 9507: {{MOV{R9{R10{{REMEMBER PTR TO CONCD PATTERNS ! 9508: {{MOV{#P$ABA{R7{{PCODE FOR P$ABA ! 9509: {{ZER{R9{{{P0BLK ! 9510: {{JSR{PBILD{{{BUILD P$ABA NODE ! 9511: {{MOV{R10{4*PTHEN(R9){{CONCATENATE NODES ! 9512: {{MOV{(SP){R10{{RECALL PTR TO ALTERNATIVE NODE ! 9513: {{MOV{R9{4*PARM1(R10){{POINT ALTERNATIVE BACK TO ARGUMENT ! 9514: {{BRN{EXITS{{{JUMP FOR NEXT CODE WORD ! 9515: {{EJC{{{{ ! 9516: * ! 9517: * ARG ! 9518: * ! 9519: {S$ARG{ENT{{{{ENTRY POINT ! 9520: {{JSR{GTSMI{{{GET SECOND ARG AS SMALL INTEGER ! 9521: {{ERR{062{ARG{{SECOND ARGUMENT IS NOT INTEGER ! 9522: {{PPM{EXFAL{{{FAIL IF OUT OF RANGE OR NEGATIVE ! 9523: {{MOV{R9{R6{{SAVE ARGUMENT NUMBER ! 9524: {{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT ! 9525: {{JSR{GTNVR{{{LOCATE VRBLK ! 9526: {{PPM{SARG1{{{JUMP IF NOT NATURAL VARIABLE ! 9527: {{MOV{4*VRFNC(R9){R9{{ELSE LOAD FUNCTION BLOCK POINTER ! 9528: {{BNE{(R9){#B$PFC{SARG1{JUMP IF NOT PROGRAM DEFINED ! 9529: {{BZE{R6{EXFAL{{FAIL IF ARG NUMBER IS ZERO ! 9530: {{BGT{R6{4*FARGS(R9){EXFAL{FAIL IF ARG NUMBER IS TOO LARGE ! 9531: {{WTB{R6{{{ELSE CONVERT TO BYTE OFFSET ! 9532: {{ADD{R6{R9{{POINT TO ARGUMENT SELECTED ! 9533: {{MOV{4*PFAGB(R9){R9{{LOAD ARGUMENT VRBLK POINTER ! 9534: {{BRN{EXVNM{{{EXIT TO BUILD NMBLK ! 9535: * ! 9536: * HERE IF 1ST ARGUMENT IS BAD ! 9537: * ! 9538: {SARG1{ERB{063{ARG{{FIRST ARGUMENT IS NOT PROGRAM FUNCTION NAME ! 9539: {{EJC{{{{ ! 9540: * ! 9541: * ARRAY ! 9542: * ! 9543: {S$ARR{ENT{{{{ENTRY POINT ! 9544: {{MOV{(SP)+{R10{{LOAD INITIAL ELEMENT VALUE ! 9545: {{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT ! 9546: {{JSR{GTINT{{{CONVERT FIRST ARG TO INTEGER ! 9547: {{PPM{SAR02{{{JUMP IF NOT INTEGER ! 9548: * ! 9549: * HERE FOR INTEGER FIRST ARGUMENT, BUILD VCBLK ! 9550: * ! 9551: {{LDI{4*ICVAL(R9){{{LOAD INTEGER VALUE ! 9552: {{ILE{SAR10{{{JUMP IF ZERO OR NEG (BAD DIMENSION) ! 9553: {{MFI{R6{SAR11{{ELSE CONVERT TO ONE WORD, TEST OVFL ! 9554: {{LCT{R7{R6{{COPY ELEMENTS FOR LOOP LATER ON ! 9555: {{ADD{#VCSI${R6{{ADD SPACE FOR STANDARD FIELDS ! 9556: {{WTB{R6{{{CONVERT LENGTH TO BYTES ! 9557: {{BGE{R6{MXLEN{SAR11{FAIL IF TOO LARGE ! 9558: {{JSR{ALLOC{{{ALLOCATE SPACE FOR VCBLK ! 9559: {{MOV{#B$VCT{(R9){{STORE TYPE WORD ! 9560: {{MOV{R6{4*VCLEN(R9){{SET LENGTH ! 9561: {{MOV{R10{R8{{COPY DEFAULT VALUE ! 9562: {{MOV{R9{R10{{COPY VCBLK POINTER ! 9563: {{ADD{#4*VCVLS{R10{{POINT TO FIRST ELEMENT VALUE ! 9564: * ! 9565: * LOOP TO SET VECTOR ELEMENTS TO DEFAULT VALUE ! 9566: * ! 9567: {SAR01{MOV{R8{(R10)+{{STORE ONE VALUE ! 9568: {{BCT{R7{SAR01{{LOOP TILL ALL STORED ! 9569: {{BRN{EXSID{{{EXIT SETTING IDVAL ! 9570: {{EJC{{{{ ! 9571: * ! 9572: * ARRAY (CONTINUED) ! 9573: * ! 9574: * HERE IF FIRST ARGUMENT IS NOT AN INTEGER ! 9575: * ! 9576: {SAR02{MOV{R9{-(SP){{REPLACE ARGUMENT ON STACK ! 9577: {{JSR{XSCNI{{{INITIALIZE SCAN OF FIRST ARGUMENT ! 9578: {{ERR{064{ARRAY{{FIRST ARGUMENT IS NOT INTEGER OR STRING ! 9579: {{PPM{EXNUL{{{DUMMY (UNUSED) NULL STRING EXIT ! 9580: {{MOV{R$XSC{-(SP){{SAVE PROTOTYPE POINTER ! 9581: {{MOV{R10{-(SP){{SAVE DEFAULT VALUE ! 9582: {{ZER{ARCDM{{{ZERO COUNT OF DIMENSIONS ! 9583: {{ZER{ARPTR{{{ZERO OFFSET TO INDICATE PASS ONE ! 9584: {{LDI{INTV1{{{LOAD INTEGER ONE ! 9585: {{STI{ARNEL{{{INITIALIZE ELEMENT COUNT ! 9586: * ! 9587: * THE FOLLOWING CODE IS EXECUTED TWICE. THE FIRST TIME ! 9588: * (ARPTR EQ 0), IT IS USED TO COUNT THE NUMBER OF ELEMENTS ! 9589: * AND NUMBER OF DIMENSIONS. THE SECOND TIME (ARPTR GT 0) IS ! 9590: * USED TO ACTUALLY FILL IN THE DIM,LBD FIELDS OF THE ARBLK. ! 9591: * ! 9592: {SAR03{LDI{INTV1{{{LOAD ONE AS DEFAULT LOW BOUND ! 9593: {{STI{ARSVL{{{SAVE AS LOW BOUND ! 9594: {{MOV{#CH$CL{R8{{SET DELIMITER ONE = COLON ! 9595: {{MOV{#CH$CM{R10{{SET DELIMITER TWO = COMMA ! 9596: {{JSR{XSCAN{{{SCAN NEXT BOUND ! 9597: {{BNE{R6{#NUM01{SAR04{JUMP IF NOT COLON ! 9598: * ! 9599: * HERE WE HAVE A COLON ENDING A LOW BOUND ! 9600: * ! 9601: {{JSR{GTINT{{{CONVERT LOW BOUND ! 9602: {{ERR{065{ARRAY{{FIRST ARGUMENT LOWER BOUND IS NOT INTEGER ! 9603: {{LDI{4*ICVAL(R9){{{LOAD VALUE OF LOW BOUND ! 9604: {{STI{ARSVL{{{STORE LOW BOUND VALUE ! 9605: {{MOV{#CH$CM{R8{{SET DELIMITER ONE = COMMA ! 9606: {{MOV{R8{R10{{AND DELIMITER TWO = COMMA ! 9607: {{JSR{XSCAN{{{SCAN HIGH BOUND ! 9608: {{EJC{{{{ ! 9609: * ! 9610: * ARRAY (CONTINUED) ! 9611: * ! 9612: * MERGE HERE TO PROCESS UPPER BOUND ! 9613: * ! 9614: {SAR04{JSR{GTINT{{{CONVERT HIGH BOUND TO INTEGER ! 9615: {{ERR{066{ARRAY{{FIRST ARGUMENT UPPER BOUND IS NOT INTEGER ! 9616: {{LDI{4*ICVAL(R9){{{GET HIGH BOUND ! 9617: {{SBI{ARSVL{{{SUBTRACT LOWER BOUND ! 9618: {{IOV{SAR10{{{BAD DIMENSION IF OVERFLOW ! 9619: {{ILT{SAR10{{{BAD DIMENSION IF NEGATIVE ! 9620: {{ADI{INTV1{{{ADD 1 TO GET DIMENSION ! 9621: {{IOV{SAR10{{{BAD DIMENSION IF OVERFLOW ! 9622: {{MOV{ARPTR{R10{{LOAD OFFSET (ALSO PASS INDICATOR) ! 9623: {{BZE{R10{SAR05{{JUMP IF FIRST PASS ! 9624: * ! 9625: * HERE IN SECOND PASS TO STORE LBD AND DIM IN ARBLK ! 9626: * ! 9627: {{ADD{(SP){R10{{POINT TO CURRENT LOCATION IN ARBLK ! 9628: {{STI{4*CFP$I(R10){{{STORE DIMENSION ! 9629: {{LDI{ARSVL{{{LOAD LOW BOUND ! 9630: {{STI{(R10){{{STORE LOW BOUND ! 9631: {{ADD{#4*ARDMS{ARPTR{{BUMP OFFSET TO NEXT BOUNDS ! 9632: {{BRN{SAR06{{{JUMP TO CHECK FOR END OF BOUNDS ! 9633: * ! 9634: * HERE IN PASS 1 ! 9635: * ! 9636: {SAR05{ICV{ARCDM{{{BUMP DIMENSION COUNT ! 9637: {{MLI{ARNEL{{{MULTIPLY DIMENSION BY COUNT SO FAR ! 9638: {{IOV{SAR11{{{TOO LARGE IF OVERFLOW ! 9639: {{STI{ARNEL{{{ELSE STORE UPDATED ELEMENT COUNT ! 9640: * ! 9641: * MERGE HERE AFTER PROCESSING ONE SET OF BOUNDS ! 9642: * ! 9643: {SAR06{BNZ{R6{SAR03{{LOOP BACK UNLESS END OF BOUNDS ! 9644: {{BNZ{ARPTR{SAR09{{JUMP IF END OF PASS 2 ! 9645: {{EJC{{{{ ! 9646: * ! 9647: * ARRAY (CONTINUED) ! 9648: * ! 9649: * HERE AT END OF PASS ONE, BUILD ARBLK ! 9650: * ! 9651: {{LDI{ARNEL{{{GET NUMBER OF ELEMENTS ! 9652: {{MFI{R7{SAR11{{GET AS ADDR INTEGER, TEST OVFLO ! 9653: {{WTB{R7{{{ELSE CONVERT TO LENGTH IN BYTES ! 9654: {{MOV{#4*ARSI${R6{{SET SIZE OF STANDARD FIELDS ! 9655: {{LCT{R8{ARCDM{{SET DIMENSION COUNT TO CONTROL LOOP ! 9656: * ! 9657: * LOOP TO ALLOW SPACE FOR DIMENSIONS ! 9658: * ! 9659: {SAR07{ADD{#4*ARDMS{R6{{ALLOW SPACE FOR ONE SET OF BOUNDS ! 9660: {{BCT{R8{SAR07{{LOOP BACK TILL ALL ACCOUNTED FOR ! 9661: {{MOV{R6{R10{{SAVE SIZE (=AROFS) ! 9662: * ! 9663: * NOW ALLOCATE SPACE FOR ARBLK ! 9664: * ! 9665: {{ADD{R7{R6{{ADD SPACE FOR ELEMENTS ! 9666: {{ICA{R6{{{ALLOW FOR ARPRO PROTOTYPE FIELD ! 9667: {{BGE{R6{MXLEN{SAR11{FAIL IF TOO LARGE ! 9668: {{JSR{ALLOC{{{ELSE ALLOCATE ARBLK ! 9669: {{MOV{(SP){R7{{LOAD DEFAULT VALUE ! 9670: {{MOV{R9{(SP){{SAVE ARBLK POINTER ! 9671: {{MOV{R6{R8{{SAVE LENGTH IN BYTES ! 9672: {{BTW{R6{{{CONVERT LENGTH BACK TO WORDS ! 9673: {{LCT{R6{R6{{SET COUNTER TO CONTROL LOOP ! 9674: * ! 9675: * LOOP TO CLEAR ENTIRE ARBLK TO DEFAULT VALUE ! 9676: * ! 9677: {SAR08{MOV{R7{(R9)+{{SET ONE WORD ! 9678: {{BCT{R6{SAR08{{LOOP TILL ALL SET ! 9679: {{EJC{{{{ ! 9680: * ! 9681: * ARRAY (CONTINUED) ! 9682: * ! 9683: * NOW SET INITIAL FIELDS OF ARBLK ! 9684: * ! 9685: {{MOV{(SP)+{R9{{RELOAD ARBLK POINTER ! 9686: {{MOV{(SP){R7{{LOAD PROTOTYPE ! 9687: {{MOV{#B$ART{(R9){{SET TYPE WORD ! 9688: {{MOV{R8{4*ARLEN(R9){{STORE LENGTH IN BYTES ! 9689: {{ZER{4*IDVAL(R9){{{ZERO ID TILL WE GET IT BUILT ! 9690: {{MOV{R10{4*AROFS(R9){{SET PROTOTYPE FIELD PTR ! 9691: {{MOV{ARCDM{4*ARNDM(R9){{SET NUMBER OF DIMENSIONS ! 9692: {{MOV{R9{R8{{SAVE ARBLK POINTER ! 9693: {{ADD{R10{R9{{POINT TO PROTOTYPE FIELD ! 9694: {{MOV{R7{(R9){{STORE PROTOTYPE PTR IN ARBLK ! 9695: {{MOV{#4*ARLBD{ARPTR{{SET OFFSET FOR PASS 2 BOUNDS SCAN ! 9696: {{MOV{R7{R$XSC{{RESET STRING POINTER FOR XSCAN ! 9697: {{MOV{R8{(SP){{STORE ARBLK POINTER ON STACK ! 9698: {{ZER{XSOFS{{{RESET OFFSET PTR TO START OF STRING ! 9699: {{BRN{SAR03{{{JUMP BACK TO RESCAN BOUNDS ! 9700: * ! 9701: * HERE AFTER FILLING IN BOUNDS INFORMATION (END PASS TWO) ! 9702: * ! 9703: {SAR09{MOV{(SP)+{R9{{RELOAD POINTER TO ARBLK ! 9704: {{BRN{EXSID{{{EXIT SETTING IDVAL ! 9705: * ! 9706: * HERE FOR BAD DIMENSION ! 9707: * ! 9708: {SAR10{ERB{067{ARRAY{{DIMENSION IS ZERO,NEGATIVE OR OUT OF RANGE ! 9709: * ! 9710: * HERE IF ARRAY IS TOO LARGE ! 9711: * ! 9712: {SAR11{ERB{068{ARRAY{{SIZE EXCEEDS MAXIMUM PERMITTED ! 9713: {{EJC{{{{ ! 9714: * ! 9715: * BUFFER ! 9716: * ! 9717: {S$BUF{ENT{{{{ENTRY POINT ! 9718: {{MOV{(SP)+{R10{{GET INITIAL VALUE ! 9719: {{MOV{(SP)+{R9{{GET REQUESTED ALLOCATION ! 9720: {{JSR{GTINT{{{CONVERT TO INTEGER ! 9721: {{ERR{269{BUFFER{{FIRST ARGUMENT IS NOT INTEGER ! 9722: {{LDI{4*ICVAL(R9){{{GET VALUE ! 9723: {{ILE{SBF01{{{BRANCH IF NEGATIVE OR ZERO ! 9724: {{MFI{R6{SBF02{{MOVE WITH OVERFLOW CHECK ! 9725: {{JSR{ALOBF{{{ALLOCATE THE BUFFER ! 9726: {{JSR{APNDB{{{COPY IT IN ! 9727: {{ERR{270{BUFFER{{SECOND ARGUMENT IS NOT STRING OR BUFFER ! 9728: {{ERR{271{BUFFER{{INITIAL VALUE TOO BIG FOR ALLOCATION ! 9729: {{BRN{EXSID{{{EXIT SETTING IDVAL ! 9730: * ! 9731: * HERE FOR INVALID ALLOCATION SIZE ! 9732: * ! 9733: {SBF01{ERB{272{BUFFER{{FIRST ARGUMENT IS NOT POSITIVE ! 9734: * ! 9735: * HERE FOR ALLOCATION SIZE INTEGER OVERFLOW ! 9736: * ! 9737: {SBF02{ERB{273{BUFFER{{SIZE IS TOO BIG ! 9738: {{EJC{{{{ ! 9739: * ! 9740: * BREAK ! 9741: * ! 9742: {S$BRK{ENT{{{{ENTRY POINT ! 9743: {{MOV{#P$BKS{R7{{SET PCODE FOR SINGLE CHAR CASE ! 9744: {{MOV{#P$BRK{R10{{PCODE FOR MULTI-CHAR CASE ! 9745: {{MOV{#P$BKD{R8{{PCODE FOR EXPRESSION CASE ! 9746: {{JSR{PATST{{{CALL COMMON ROUTINE TO BUILD NODE ! 9747: {{ERR{069{BREAK{{ARGUMENT IS NOT STRING OR EXPRESSION ! 9748: {{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD ! 9749: {{EJC{{{{ ! 9750: * ! 9751: * BREAKX ! 9752: * ! 9753: * BREAKX IS A COMPOUND PATTERN. SEE DESCRIPTION AT START ! 9754: * OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED. ! 9755: * ! 9756: {S$BKX{ENT{{{{ENTRY POINT ! 9757: {{MOV{#P$BKS{R7{{PCODE FOR SINGLE CHAR ARGUMENT ! 9758: {{MOV{#P$BRK{R10{{PCODE FOR MULTI-CHAR ARGUMENT ! 9759: {{MOV{#P$BXD{R8{{PCODE FOR EXPRESSION CASE ! 9760: {{JSR{PATST{{{CALL COMMON ROUTINE TO BUILD NODE ! 9761: {{ERR{070{BREAKX{{ARGUMENT IS NOT STRING OR EXPRESSION ! 9762: * ! 9763: * NOW HOOK BREAKX NODE ON AT FRONT END ! 9764: * ! 9765: {{MOV{R9{-(SP){{SAVE PTR TO BREAK NODE ! 9766: {{MOV{#P$BKX{R7{{SET PCODE FOR BREAKX NODE ! 9767: {{JSR{PBILD{{{BUILD IT ! 9768: {{MOV{(SP){4*PTHEN(R9){{SET BREAK NODE AS SUCCESSOR ! 9769: {{MOV{#P$ALT{R7{{SET PCODE FOR ALTERNATION NODE ! 9770: {{JSR{PBILD{{{BUILD (PARM1=ALT=BREAKX NODE) ! 9771: {{MOV{R9{R6{{SAVE PTR TO ALTERNATION NODE ! 9772: {{MOV{(SP){R9{{POINT TO BREAK NODE ! 9773: {{MOV{R6{4*PTHEN(R9){{SET ALTERNATE NODE AS SUCCESSOR ! 9774: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK ! 9775: {{EJC{{{{ ! 9776: * ! 9777: * CHAR ! 9778: * ! 9779: {S$CHR{ENT{{{{ENTRY POINT ! 9780: {{JSR{GTSMI{{{CONVERT ARG TO INTEGER ! 9781: {{ERR{281{CHAR{{ARGUMENT NOT INTEGER ! 9782: {{PPM{SCHR1{{{TOO BIG ERROR EXIT ! 9783: {{BGE{R8{#CFP$A{SCHR1{SEE IF OUT OF RANGE OF HOST SET ! 9784: {{MOV{#NUM01{R6{{IF NOT SET SCBLK ALLOCATION ! 9785: {{MOV{R8{R7{{SAVE CHAR CODE ! 9786: {{JSR{ALOCS{{{ALLOCATE 1 BAU SCBLK ! 9787: {{MOV{R9{R10{{COPY SCBLK POINTER ! 9788: {{PSC{R10{{{GET SET TO STUFF CHAR ! 9789: {{SCH{R7{(R10)+{{STUFF IT ! 9790: {{ZER{R10{{{CLEAR SLOP IN XL ! 9791: {{BRN{EXIXR{{{EXIT WITH SCBLK POINTER ! 9792: * ! 9793: * HERE IF CHAR ARGUMENT IS OUT OF RANGE ! 9794: * ! 9795: {SCHR1{ERB{282{CHAR{{ARGUMENT NOT IN RANGE ! 9796: {{EJC{{{{ ! 9797: * ! 9798: * CLEAR ! 9799: * ! 9800: {S$CLR{ENT{{{{ENTRY POINT ! 9801: {{JSR{XSCNI{{{INITIALIZE TO SCAN ARGUMENT ! 9802: {{ERR{071{CLEAR{{ARGUMENT IS NOT STRING ! 9803: {{PPM{SCLR2{{{JUMP IF NULL ! 9804: * ! 9805: * LOOP TO SCAN OUT NAMES IN FIRST ARGUMENT. VARIABLES IN ! 9806: * THE LIST ARE FALGGED BY SETTING VRGET OF VRBLK TO ZERO. ! 9807: * ! 9808: {SCLR1{MOV{#CH$CM{R8{{SET DELIMITER ONE = COMMA ! 9809: {{MOV{R8{R10{{DELIMITER TWO = COMMA ! 9810: {{JSR{XSCAN{{{SCAN NEXT VARIABLE NAME ! 9811: {{JSR{GTNVR{{{LOCATE VRBLK ! 9812: {{ERR{072{CLEAR{{ARGUMENT HAS NULL VARIABLE NAME ! 9813: {{ZER{4*VRGET(R9){{{ELSE FLAG BY ZEROING VRGET FIELD ! 9814: {{BNZ{R6{SCLR1{{LOOP BACK IF STOPPED BY COMMA ! 9815: * ! 9816: * HERE AFTER FLAGGING VARIABLES IN ARGUMENT LIST ! 9817: * ! 9818: {SCLR2{MOV{HSHTB{R7{{POINT TO START OF HASH TABLE ! 9819: * ! 9820: * LOOP THROUGH SLOTS IN HASH TABLE ! 9821: * ! 9822: {SCLR3{BEQ{R7{HSHTE{EXNUL{EXIT RETURNING NULL IF NONE LEFT ! 9823: {{MOV{R7{R9{{ELSE COPY SLOT POINTER ! 9824: {{ICA{R7{{{BUMP SLOT POINTER ! 9825: {{SUB{#4*VRNXT{R9{{SET OFFSET TO MERGE INTO LOOP ! 9826: * ! 9827: * LOOP THROUGH VRBLKS ON ONE HASH CHAIN ! 9828: * ! 9829: {SCLR4{MOV{4*VRNXT(R9){R9{{POINT TO NEXT VRBLK ON CHAIN ! 9830: {{BZE{R9{SCLR3{{JUMP FOR NEXT BUCKET IF CHAIN END ! 9831: {{BNZ{4*VRGET(R9){SCLR5{{JUMP IF NOT FLAGGED ! 9832: {{EJC{{{{ ! 9833: * ! 9834: * CLEAR (CONTINUED) ! 9835: * ! 9836: * HERE FOR FLAGGED VARIABLE, DO NOT SET VALUE TO NULL ! 9837: * ! 9838: {{JSR{SETVR{{{FOR FLAGGED VAR, RESTORE VRGET ! 9839: {{BRN{SCLR4{{{AND LOOP BACK FOR NEXT VRBLK ! 9840: * ! 9841: * HERE TO SET VALUE OF A VARIABLE TO NULL ! 9842: * PRROTECTED VARIABLES (ARB, ETC) ARE EXEMPT ! 9843: * ! 9844: {SCLR5{BEQ{4*VRSTO(R9){#B$VRE{SCLR4{CHECK FOR PROTECTED VARIABLE (REG05) ! 9845: {{MOV{R9{R10{{COPY VRBLK POINTER (REG05) ! 9846: * ! 9847: * LOOP TO LOCATE VALUE AT END OF POSSIBLE TRBLK CHAIN ! 9848: * ! 9849: {SCLR6{MOV{R10{R6{{SAVE BLOCK POINTER ! 9850: {{MOV{4*VRVAL(R10){R10{{LOAD NEXT VALUE FIELD ! 9851: {{BEQ{(R10){#B$TRT{SCLR6{LOOP BACK IF TRAPPED ! 9852: * ! 9853: * NOW STORE THE NULL VALUE ! 9854: * ! 9855: {{MOV{R6{R10{{RESTORE BLOCK POINTER ! 9856: {{MOV{#NULLS{4*VRVAL(R10){{STORE NULL CONSTANT VALUE ! 9857: {{BRN{SCLR4{{{LOOP BACK FOR NEXT VRBLK ! 9858: {{EJC{{{{ ! 9859: * ! 9860: * CODE ! 9861: * ! 9862: {S$COD{ENT{{{{ENTRY POINT ! 9863: {{MOV{(SP)+{R9{{LOAD ARGUMENT ! 9864: {{JSR{GTCOD{{{CONVERT TO CODE ! 9865: {{PPM{EXFAL{{{FAIL IF CONVERSION IS IMPOSSIBLE ! 9866: {{BRN{EXIXR{{{ELSE RETURN CODE AS RESULT ! 9867: {{EJC{{{{ ! 9868: * ! 9869: * COLLECT ! 9870: * ! 9871: {S$COL{ENT{{{{ENTRY POINT ! 9872: {{MOV{(SP)+{R9{{LOAD ARGUMENT ! 9873: {{JSR{GTINT{{{CONVERT TO INTEGER ! 9874: {{ERR{073{COLLECT{{ARGUMENT IS NOT INTEGER ! 9875: {{LDI{4*ICVAL(R9){{{LOAD COLLECT ARGUMENT ! 9876: {{STI{CLSVI{{{SAVE COLLECT ARGUMENT ! 9877: {{ZER{R7{{{SET NO MOVE UP ! 9878: {{JSR{GBCOL{{{PERFORM GARBAGE COLLECTION ! 9879: {{MOV{DNAME{R6{{POINT TO END OF MEMORY ! 9880: {{SUB{DNAMP{R6{{SUBTRACT NEXT LOCATION ! 9881: {{BTW{R6{{{CONVERT BYTES TO WORDS ! 9882: {{MTI{R6{{{CONVERT WORDS AVAILABLE AS INTEGER ! 9883: {{SBI{CLSVI{{{SUBTRACT ARGUMENT ! 9884: {{IOV{EXFAL{{{FAIL IF OVERFLOW ! 9885: {{ILT{EXFAL{{{FAIL IF NOT ENOUGH ! 9886: {{ADI{CLSVI{{{ELSE RECOMPUTE AVAILABLE ! 9887: {{BRN{EXINT{{{AND EXIT WITH INTEGER RESULT ! 9888: {{EJC{{{{ ! 9889: * ! 9890: * CONVERT ! 9891: * ! 9892: {S$CNV{ENT{{{{ENTRY POINT ! 9893: {{JSR{GTSTG{{{CONVERT SECOND ARGUMENT TO STRING ! 9894: {{ERR{074{CONVERT{{SECOND ARGUMENT IS NOT STRING ! 9895: {{JSR{FLSTG{{{FOLD LOWER CASE TO UPPER CASE ! 9896: {{MOV{(SP){R10{{LOAD FIRST ARGUMENT ! 9897: {{BNE{(R10){#B$PDT{SCV01{JUMP IF NOT PROGRAM DEFINED ! 9898: * ! 9899: * HERE FOR PROGRAM DEFINED DATATYPE ! 9900: * ! 9901: {{MOV{4*PDDFP(R10){R10{{POINT TO DFBLK ! 9902: {{MOV{4*DFNAM(R10){R10{{LOAD DATATYPE NAME ! 9903: {{JSR{IDENT{{{COMPARE WITH SECOND ARG ! 9904: {{PPM{EXITS{{{EXIT IF IDENT WITH ARG AS RESULT ! 9905: {{BRN{EXFAL{{{ELSE FAIL ! 9906: * ! 9907: * HERE IF NOT PROGRAM DEFINED DATATYPE ! 9908: * ! 9909: {SCV01{MOV{R9{-(SP){{SAVE STRING ARGUMENT ! 9910: {{MOV{#SVCTB{R10{{POINT TO TABLE OF NAMES TO COMPARE ! 9911: {{ZER{R7{{{INITIALIZE COUNTER ! 9912: {{MOV{R6{R8{{SAVE LENGTH OF ARGUMENT STRING ! 9913: * ! 9914: * LOOP THROUGH TABLE ENTRIES ! 9915: * ! 9916: {SCV02{MOV{(R10)+{R9{{LOAD NEXT TABLE ENTRY, BUMP POINTER ! 9917: {{BZE{R9{EXFAL{{FAIL IF ZERO MARKING END OF LIST ! 9918: {{BNE{R8{4*SCLEN(R9){SCV05{JUMP IF WRONG LENGTH ! 9919: {{MOV{R10{CNVTP{{ELSE STORE TABLE POINTER ! 9920: {{PLC{R9{{{POINT TO CHARS OF TABLE ENTRY ! 9921: {{MOV{(SP){R10{{LOAD POINTER TO STRING ARGUMENT ! 9922: {{PLC{R10{{{POINT TO CHARS OF STRING ARG ! 9923: {{MOV{R8{R6{{SET NUMBER OF CHARS TO COMPARE ! 9924: {{CMC{SCV04{SCV04{{COMPARE, JUMP IF NO MATCH ! 9925: {{EJC{{{{ ! 9926: * ! 9927: * CONVERT (CONTINUED) ! 9928: * ! 9929: * HERE WE HAVE A MATCH ! 9930: * ! 9931: {SCV03{MOV{R7{R10{{COPY ENTRY NUMBER ! 9932: {{ICA{SP{{{POP STRING ARG OFF STACK ! 9933: {{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT ! 9934: {{BSW{R10{CNVTT{{JUMP TO APPROPRIATE ROUTINE ! 9935: {{IFF{0{SCV06{{STRING ! 9936: {{IFF{1{SCV07{{INTEGER ! 9937: {{IFF{2{SCV09{{NAME ! 9938: {{IFF{3{SCV10{{PATTERN ! 9939: {{IFF{4{SCV11{{ARRAY ! 9940: {{IFF{5{SCV19{{TABLE ! 9941: {{IFF{6{SCV25{{EXPRESSION ! 9942: {{IFF{7{SCV26{{CODE ! 9943: {{IFF{8{SCV27{{NUMERIC ! 9944: {{IFF{CNVRT{SCV08{{REAL ! 9945: {{IFF{CNVBT{SCV28{{BUFFER ! 9946: {{ESW{{{{END OF SWITCH TABLE ! 9947: * ! 9948: * HERE IF NO MATCH WITH TABLE ENTRY ! 9949: * ! 9950: {SCV04{MOV{CNVTP{R10{{RESTORE TABLE POINTER, MERGE ! 9951: * ! 9952: * MERGE HERE IF LENGTHS DID NOT MATCH ! 9953: * ! 9954: {SCV05{ICV{R7{{{BUMP ENTRY NUMBER ! 9955: {{BRN{SCV02{{{LOOP BACK TO CHECK NEXT ENTRY ! 9956: * ! 9957: * HERE TO CONVERT TO STRING ! 9958: * ! 9959: {SCV06{MOV{R9{-(SP){{REPLACE STRING ARGUMENT ON STACK ! 9960: {{JSR{GTSTG{{{CONVERT TO STRING ! 9961: {{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE ! 9962: {{BRN{EXIXR{{{ELSE RETURN STRING ! 9963: {{EJC{{{{ ! 9964: * ! 9965: * CONVERT (CONTINUED) ! 9966: * ! 9967: * HERE TO CONVERT TO INTEGER ! 9968: * ! 9969: {SCV07{JSR{GTINT{{{CONVERT TO INTEGER ! 9970: {{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE ! 9971: {{BRN{EXIXR{{{ELSE RETURN INTEGER ! 9972: * ! 9973: * HERE TO CONVERT TO REAL ! 9974: * ! 9975: {SCV08{JSR{GTREA{{{CONVERT TO REAL ! 9976: {{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE ! 9977: {{BRN{EXIXR{{{ELSE RETURN REAL ! 9978: * ! 9979: * HERE TO CONVERT TO NAME ! 9980: * ! 9981: {SCV09{BEQ{(R9){#B$NML{EXIXR{RETURN IF ALREADY A NAME ! 9982: {{JSR{GTNVR{{{ELSE TRY STRING TO NAME CONVERT ! 9983: {{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE ! 9984: {{BRN{EXVNM{{{ELSE EXIT BUILDING NMBLK FOR VRBLK ! 9985: * ! 9986: * HERE TO CONVERT TO PATTERN ! 9987: * ! 9988: {SCV10{JSR{GTPAT{{{CONVERT TO PATTERN ! 9989: {{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE ! 9990: {{BRN{EXIXR{{{ELSE RETURN PATTERN ! 9991: * ! 9992: * CONVERT TO ARRAY ! 9993: * ! 9994: {SCV11{JSR{GTARR{{{GET AN ARRAY ! 9995: {{PPM{EXFAL{{{FAIL IF NOT CONVERTIBLE ! 9996: {{BRN{EXSID{{{EXIT SETTING ID FIELD ! 9997: * ! 9998: * CONVERT TO TABLE ! 9999: * ! 10000: {SCV19{MOV{(R9){R6{{LOAD FIRST WORD OF BLOCK ! 10001: {{MOV{R9{-(SP){{REPLACE ARBLK POINTER ON STACK ! 10002: {{BEQ{R6{#B$TBT{EXITS{RETURN ARG IF ALREADY A TABLE ! 10003: {{BNE{R6{#B$ART{EXFAL{ELSE FAIL IF NOT AN ARRAY ! 10004: {{EJC{{{{ ! 10005: * ! 10006: * CONVERT (CONTINUED) ! 10007: * ! 10008: * HERE TO CONVERT AN ARRAY TO TABLE ! 10009: * ! 10010: {{BNE{4*ARNDM(R9){#NUM02{EXFAL{FAIL IF NOT 2-DIM ARRAY ! 10011: {{LDI{4*ARDM2(R9){{{LOAD DIM 2 ! 10012: {{SBI{INTV2{{{SUBTRACT 2 TO COMPARE ! 10013: {{INE{EXFAL{{{FAIL IF DIM2 NOT 2 ! 10014: * ! 10015: * HERE WE HAVE AN ARBLK OF THE RIGHT SHAPE ! 10016: * ! 10017: {{LDI{4*ARDIM(R9){{{LOAD DIM 1 (NUMBER OF ELEMENTS) ! 10018: {{MFI{R6{{{GET AS ONE WORD INTEGER ! 10019: {{LCT{R7{R6{{COPY TO CONTROL LOOP ! 10020: {{ADD{#TBSI${R6{{ADD SPACE FOR STANDARD FIELDS ! 10021: {{WTB{R6{{{CONVERT LENGTH TO BYTES ! 10022: {{JSR{ALLOC{{{ALLOCATE SPACE FOR TBBLK ! 10023: {{MOV{R9{R8{{COPY TBBLK POINTER ! 10024: {{MOV{R9{-(SP){{SAVE TBBLK POINTER ! 10025: {{MOV{#B$TBT{(R9)+{{STORE TYPE WORD ! 10026: {{ZER{(R9)+{{{STORE ZERO FOR IDVAL FOR NOW ! 10027: {{MOV{R6{(R9)+{{STORE LENGTH ! 10028: {{MOV{#NULLS{(R9)+{{NULL INITIAL LOOKUP VALUE ! 10029: * ! 10030: * LOOP TO INITIALIZE BUCKET PTRS TO POINT TO TABLE ! 10031: * ! 10032: {SCV20{MOV{R8{(R9)+{{SET BUCKET PTR TO POINT TO TBBLK ! 10033: {{BCT{R7{SCV20{{LOOP TILL ALL INITIALIZED ! 10034: {{MOV{#4*ARVL2{R7{{SET OFFSET TO FIRST ARBLK ELEMENT ! 10035: * ! 10036: * LOOP TO COPY ELEMENTS FROM ARRAY TO TABLE ! 10037: * ! 10038: {SCV21{MOV{4*1(SP){R10{{POINT TO ARBLK ! 10039: {{BEQ{R7{4*ARLEN(R10){SCV24{JUMP IF ALL MOVED ! 10040: {{ADD{R7{R10{{ELSE POINT TO CURRENT LOCATION ! 10041: {{ADD{#4*NUM02{R7{{BUMP OFFSET ! 10042: {{MOV{(R10){R9{{LOAD SUBSCRIPT NAME ! 10043: {{DCA{R10{{{ADJUST PTR TO MERGE (TRVAL=1+1) ! 10044: {{EJC{{{{ ! 10045: * ! 10046: * CONVERT (CONTINUED) ! 10047: * ! 10048: * LOOP TO CHASE DOWN TRBLK CHAIN FOR VALUE ! 10049: * ! 10050: {SCV22{MOV{4*TRVAL(R10){R10{{POINT TO NEXT VALUE ! 10051: {{BEQ{(R10){#B$TRT{SCV22{LOOP BACK IF TRAPPED ! 10052: * ! 10053: * HERE WITH NAME IN XR, VALUE IN XL ! 10054: * ! 10055: {SCV23{MOV{R10{-(SP){{STACK VALUE ! 10056: {{MOV{4*1(SP){R10{{LOAD TBBLK POINTER ! 10057: {{JSR{TFIND{{{BUILD TEBLK (NOTE WB GT 0 BY NAME) ! 10058: {{PPM{EXFAL{{{FAIL IF ACESS FAILS ! 10059: {{MOV{(SP)+{4*TEVAL(R10){{STORE VALUE IN TEBLK ! 10060: {{BRN{SCV21{{{LOOP BACK FOR NEXT ELEMENT ! 10061: * ! 10062: * HERE AFTER MOVING ALL ELEMENTS TO TBBLK ! 10063: * ! 10064: {SCV24{MOV{(SP)+{R9{{LOAD TBBLK POINTER ! 10065: {{ICA{SP{{{POP ARBLK POINTER ! 10066: {{BRN{EXSID{{{EXIT SETTING IDVAL ! 10067: * ! 10068: * CONVERT TO EXPRESSION ! 10069: * ! 10070: {SCV25{JSR{GTEXP{{{CONVERT TO EXPRESSION ! 10071: {{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE ! 10072: {{BRN{EXIXR{{{ELSE RETURN EXPRESSION ! 10073: * ! 10074: * CONVERT TO CODE ! 10075: * ! 10076: {SCV26{JSR{GTCOD{{{CONVERT TO CODE ! 10077: {{PPM{EXFAL{{{FAIL IF CONVERSION IS NOT POSSIBLE ! 10078: {{BRN{EXIXR{{{ELSE RETURN CODE ! 10079: * ! 10080: * CONVERT TO NUMERIC ! 10081: * ! 10082: {SCV27{JSR{GTNUM{{{CONVERT TO NUMERIC ! 10083: {{PPM{EXFAL{{{FAIL IF UNCONVERTIBLE ! 10084: {{BRN{EXIXR{{{RETURN NUMBER ! 10085: {{EJC{{{{ ! 10086: * ! 10087: * CONVERT TO BUFFER ! 10088: * ! 10089: {SCV28{MOV{R9{-(SP){{STACK STRING FOR PROCEDURE ! 10090: {{JSR{GTSTG{{{CONVERT TO STRING ! 10091: {{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE ! 10092: {{MOV{R9{R10{{SAVE STRING POINTER ! 10093: {{JSR{ALOBF{{{ALLOCATE BUFFER OF SAME SIZE ! 10094: {{JSR{APNDB{{{COPY IN THE STRING ! 10095: {{PPM{{{{ALREADY STRING - CANT FAIL TO CNV ! 10096: {{PPM{{{{MUST BE ENOUGH ROOM ! 10097: {{BRN{EXSID{{{EXIT SETTING IDVAL FIELD ! 10098: {{EJC{{{{ ! 10099: * ! 10100: * COPY ! 10101: * ! 10102: {S$COP{ENT{{{{ENTRY POINT ! 10103: {{JSR{COPYB{{{COPY THE BLOCK ! 10104: {{PPM{EXITS{{{RETURN IF NO IDVAL FIELD ! 10105: {{BRN{EXSID{{{EXIT SETTING ID VALUE ! 10106: {{EJC{{{{ ! 10107: * ! 10108: * DATA ! 10109: * ! 10110: {S$DAT{ENT{{{{ENTRY POINT ! 10111: {{JSR{XSCNI{{{PREPARE TO SCAN ARGUMENT ! 10112: {{ERR{075{DATA{{ARGUMENT IS NOT STRING ! 10113: {{ERR{076{DATA{{ARGUMENT IS NULL ! 10114: * ! 10115: * SCAN OUT DATATYPE NAME ! 10116: * ! 10117: {{MOV{#CH$PP{R8{{DELIMITER ONE = LEFT PAREN ! 10118: {{MOV{R8{R10{{DELIMITER TWO = LEFT PAREN ! 10119: {{JSR{XSCAN{{{SCAN DATATYPE NAME ! 10120: {{BNZ{R6{SDAT1{{SKIP IF LEFT PAREN FOUND ! 10121: {{ERB{077{DATA{{ARGUMENT IS MISSING A LEFT PAREN ! 10122: * ! 10123: * HERE AFTER SCANNING DATATYPE NAME ! 10124: * ! 10125: {SDAT1{MOV{4*SCLEN(R9){R6{{GET LENGTH ! 10126: {{JSR{FLSTG{{{FOLD LOWER CASE TO UPPER CASE ! 10127: {{MOV{R9{R10{{SAVE NAME PTR ! 10128: {{MOV{4*SCLEN(R9){R6{{GET LENGTH ! 10129: {{CTB{R6{SCSI${{COMPUTE SPACE NEEDED ! 10130: {{JSR{ALOST{{{REQUEST STATIC STORE FOR NAME ! 10131: {{MOV{R9{-(SP){{SAVE DATATYPE NAME ! 10132: {{MVW{{{{COPY NAME TO STATIC ! 10133: {{MOV{(SP){R9{{GET NAME PTR ! 10134: {{ZER{R10{{{SCRUB DUD REGISTER ! 10135: {{JSR{GTNVR{{{LOCATE VRBLK FOR DATATYPE NAME ! 10136: {{ERR{078{DATA{{ARGUMENT HAS NULL DATATYPE NAME ! 10137: {{MOV{R9{DATDV{{SAVE VRBLK POINTER FOR DATATYPE ! 10138: {{MOV{SP{DATXS{{STORE STARTING STACK VALUE ! 10139: {{ZER{R7{{{ZERO COUNT OF FIELD NAMES ! 10140: * ! 10141: * LOOP TO SCAN FIELD NAMES AND STACK VRBLK POINTERS ! 10142: * ! 10143: {SDAT2{MOV{#CH$RP{R8{{DELIMITER ONE = RIGHT PAREN ! 10144: {{MOV{#CH$CM{R10{{DELIMITER TWO = COMMA ! 10145: {{JSR{XSCAN{{{SCAN NEXT FIELD NAME ! 10146: {{BNZ{R6{SDAT3{{JUMP IF DELIMITER FOUND ! 10147: {{ERB{079{DATA{{ARGUMENT IS MISSING A RIGHT PAREN ! 10148: * ! 10149: * HERE AFTER SCANNING OUT ONE FIELD NAME ! 10150: * ! 10151: {SDAT3{JSR{GTNVR{{{LOCATE VRBLK FOR FIELD NAME ! 10152: {{ERR{080{DATA{{ARGUMENT HAS NULL FIELD NAME ! 10153: {{MOV{R9{-(SP){{STACK VRBLK POINTER ! 10154: {{ICV{R7{{{INCREMENT COUNTER ! 10155: {{BEQ{R6{#NUM02{SDAT2{LOOP BACK IF STOPPED BY COMMA ! 10156: {{EJC{{{{ ! 10157: * ! 10158: * DATA (CONTINUED) ! 10159: * ! 10160: * NOW BUILD THE DFBLK ! 10161: * ! 10162: {{MOV{#DFSI${R6{{SET SIZE OF DFBLK STANDARD FIELDS ! 10163: {{ADD{R7{R6{{ADD NUMBER OF FIELDS ! 10164: {{WTB{R6{{{CONVERT LENGTH TO BYTES ! 10165: {{MOV{R7{R8{{PRESERVE NO. OF FIELDS ! 10166: {{JSR{ALOST{{{ALLOCATE SPACE FOR DFBLK ! 10167: {{MOV{R8{R7{{GET NO OF FIELDS ! 10168: {{MOV{DATXS{R10{{POINT TO START OF STACK ! 10169: {{MOV{(R10){R8{{LOAD DATATYPE NAME ! 10170: {{MOV{R9{(R10){{SAVE DFBLK POINTER ON STACK ! 10171: {{MOV{#B$DFC{(R9)+{{STORE TYPE WORD ! 10172: {{MOV{R7{(R9)+{{STORE NUMBER OF FIELDS (FARGS) ! 10173: {{MOV{R6{(R9)+{{STORE LENGTH (DFLEN) ! 10174: {{SUB{#4*PDDFS{R6{{COMPUTE PDBLK LENGTH (FOR DFPDL) ! 10175: {{MOV{R6{(R9)+{{STORE PDBLK LENGTH (DFPDL) ! 10176: {{MOV{R8{(R9)+{{STORE DATATYPE NAME (DFNAM) ! 10177: {{LCT{R8{R7{{COPY NUMBER OF FIELDS ! 10178: * ! 10179: * LOOP TO MOVE FIELD NAME VRBLK POINTERS TO DFBLK ! 10180: * ! 10181: {SDAT4{MOV{-(R10){(R9)+{{MOVE ONE FIELD NAME VRBLK POINTER ! 10182: {{BCT{R8{SDAT4{{LOOP TILL ALL MOVED ! 10183: * ! 10184: * NOW DEFINE THE DATATYPE FUNCTION ! 10185: * ! 10186: {{MOV{R6{R8{{COPY LENGTH OF PDBLK FOR LATER LOOP ! 10187: {{MOV{DATDV{R9{{POINT TO VRBLK ! 10188: {{MOV{DATXS{R10{{POINT BACK ON STACK ! 10189: {{MOV{(R10){R10{{LOAD DFBLK POINTER ! 10190: {{JSR{DFFNC{{{DEFINE FUNCTION ! 10191: {{EJC{{{{ ! 10192: * ! 10193: * DATA (CONTINUED) ! 10194: * ! 10195: * LOOP TO BUILD FFBLKS ! 10196: * ! 10197: * ! 10198: * NOTICE THAT THE FFBLKS ARE CONSTRUCTED IN REVERSE ORDER ! 10199: * SO THAT THE REQUIRED OFFSETS CAN BE OBTAINED FROM ! 10200: * SUCCESSIVE DECREMENTATION OF THE PDBLK LENGTH (IN WC). ! 10201: * ! 10202: {SDAT5{MOV{#4*FFSI${R6{{SET LENGTH OF FFBLK ! 10203: {{JSR{ALLOC{{{ALLOCATE SPACE FOR FFBLK ! 10204: {{MOV{#B$FFC{(R9){{SET TYPE WORD ! 10205: {{MOV{#NUM01{4*FARGS(R9){{STORE FARGS (ALWAYS ONE) ! 10206: {{MOV{DATXS{R10{{POINT BACK ON STACK ! 10207: {{MOV{(R10){4*FFDFP(R9){{COPY DFBLK PTR TO FFBLK ! 10208: {{DCA{R8{{{DECREMENT OLD DFPDL TO GET NEXT OFS ! 10209: {{MOV{R8{4*FFOFS(R9){{SET OFFSET TO THIS FIELD ! 10210: {{ZER{4*FFNXT(R9){{{TENTATIVELY SET ZERO FORWARD PTR ! 10211: {{MOV{R9{R10{{COPY FFBLK POINTER FOR DFFNC ! 10212: {{MOV{(SP){R9{{LOAD VRBLK POINTER FOR FIELD ! 10213: {{MOV{4*VRFNC(R9){R9{{LOAD CURRENT FUNCTION POINTER ! 10214: {{BNE{(R9){#B$FFC{SDAT6{SKIP IF NOT CURRENTLY A FIELD FUNC ! 10215: * ! 10216: * HERE WE MUST CHAIN AN OLD FFBLK PTR TO PRESERVE IT IN THE ! 10217: * CASE OF MULTIPLE FIELD FUNCTIONS WITH THE SAME NAME ! 10218: * ! 10219: {{MOV{R9{4*FFNXT(R10){{LINK NEW FFBLK TO PREVIOUS CHAIN ! 10220: * ! 10221: * MERGE HERE TO DEFINE FIELD FUNCTION ! 10222: * ! 10223: {SDAT6{MOV{(SP)+{R9{{LOAD VRBLK POINTER ! 10224: {{JSR{DFFNC{{{DEFINE FIELD FUNCTION ! 10225: {{BNE{SP{DATXS{SDAT5{LOOP BACK TILL ALL DONE ! 10226: {{ICA{SP{{{POP DFBLK POINTER ! 10227: {{BRN{EXNUL{{{RETURN WITH NULL RESULT ! 10228: {{EJC{{{{ ! 10229: * ! 10230: * DATATYPE ! 10231: * ! 10232: {S$DTP{ENT{{{{ENTRY POINT ! 10233: {{MOV{(SP)+{R9{{LOAD ARGUMENT ! 10234: {{JSR{DTYPE{{{GET DATATYPE ! 10235: {{BRN{EXIXR{{{AND RETURN IT AS RESULT ! 10236: {{EJC{{{{ ! 10237: * ! 10238: * DATE ! 10239: * ! 10240: {S$DTE{ENT{{{{ENTRY POINT ! 10241: {{JSR{SYSDT{{{CALL SYSTEM DATE ROUTINE ! 10242: {{MOV{4*1(R10){R6{{LOAD LENGTH FOR SBSTR ! 10243: {{BZE{R6{EXNUL{{RETURN NULL IF LENGTH IS ZERO ! 10244: {{ZER{R7{{{SET ZERO OFFSET ! 10245: {{JSR{SBSTR{{{USE SBSTR TO BUILD SCBLK ! 10246: {{BRN{EXIXR{{{RETURN DATE STRING ! 10247: {{EJC{{{{ ! 10248: * ! 10249: * DEFINE ! 10250: * ! 10251: {S$DEF{ENT{{{{ENTRY POINT ! 10252: {{MOV{(SP)+{R9{{LOAD SECOND ARGUMENT ! 10253: {{ZER{DEFLB{{{ZERO LABEL POINTER IN CASE NULL ! 10254: {{BEQ{R9{#NULLS{SDF01{JUMP IF NULL SECOND ARGUMENT ! 10255: {{JSR{GTNVR{{{ELSE FIND VRBLK FOR LABEL ! 10256: {{PPM{SDF13{{{JUMP IF NOT A VARIABLE NAME ! 10257: {{MOV{R9{DEFLB{{ELSE SET SPECIFIED ENTRY ! 10258: * ! 10259: * SCAN FUNCTION NAME ! 10260: * ! 10261: {SDF01{JSR{XSCNI{{{PREPARE TO SCAN FIRST ARGUMENT ! 10262: {{ERR{081{DEFINE{{FIRST ARGUMENT IS NOT STRING ! 10263: {{ERR{082{DEFINE{{FIRST ARGUMENT IS NULL ! 10264: {{MOV{#CH$PP{R8{{DELIMITER ONE = LEFT PAREN ! 10265: {{MOV{R8{R10{{DELIMITER TWO = LEFT PAREN ! 10266: {{JSR{XSCAN{{{SCAN OUT FUNCTION NAME ! 10267: {{BNZ{R6{SDF02{{JUMP IF LEFT PAREN FOUND ! 10268: {{ERB{083{DEFINE{{FIRST ARGUMENT IS MISSING A LEFT PAREN ! 10269: * ! 10270: * HERE AFTER SCANNING OUT FUNCTION NAME ! 10271: * ! 10272: {SDF02{JSR{GTNVR{{{GET VARIABLE NAME ! 10273: {{ERR{084{DEFINE{{FIRST ARGUMENT HAS NULL FUNCTION NAME ! 10274: {{MOV{R9{DEFVR{{SAVE VRBLK POINTER FOR FUNCTION NAM ! 10275: {{ZER{R7{{{ZERO COUNT OF ARGUMENTS ! 10276: {{MOV{SP{DEFXS{{SAVE INITIAL STACK POINTER ! 10277: {{BNZ{DEFLB{SDF03{{JUMP IF SECOND ARGUMENT GIVEN ! 10278: {{MOV{R9{DEFLB{{ELSE DEFAULT IS FUNCTION NAME ! 10279: * ! 10280: * LOOP TO SCAN ARGUMENT NAMES AND STACK VRBLK POINTERS ! 10281: * ! 10282: {SDF03{MOV{#CH$RP{R8{{DELIMITER ONE = RIGHT PAREN ! 10283: {{MOV{#CH$CM{R10{{DELIMITER TWO = COMMA ! 10284: {{JSR{XSCAN{{{SCAN OUT NEXT ARGUMENT NAME ! 10285: {{BNZ{R6{SDF04{{SKIP IF DELIMITER FOUND ! 10286: {{ERB{085{NULL{{ARG NAME OR MISSING ) IN DEFINE FIRST ARG. ! 10287: {{EJC{{{{ ! 10288: * ! 10289: * DEFINE (CONTINUED) ! 10290: * ! 10291: * HERE AFTER SCANNING AN ARGUMENT NAME ! 10292: * ! 10293: {SDF04{BNE{R9{#NULLS{SDF05{SKIP IF NON-NULL ! 10294: {{BZE{R7{SDF06{{IGNORE NULL IF CASE OF NO ARGUMENTS ! 10295: * ! 10296: * HERE AFTER DEALING WITH THE CASE OF NO ARGUMENTS ! 10297: * ! 10298: {SDF05{JSR{GTNVR{{{GET VRBLK POINTER ! 10299: {{PPM{SDF03{{{LOOP BACK TO IGNORE NULL NAME ! 10300: {{MOV{R9{-(SP){{STACK ARGUMENT VRBLK POINTER ! 10301: {{ICV{R7{{{INCREMENT COUNTER ! 10302: {{BEQ{R6{#NUM02{SDF03{LOOP BACK IF STOPPED BY A COMMA ! 10303: * ! 10304: * HERE AFTER SCANNING OUT FUNCTION ARGUMENT NAMES ! 10305: * ! 10306: {SDF06{MOV{R7{DEFNA{{SAVE NUMBER OF ARGUMENTS ! 10307: {{ZER{R7{{{ZERO COUNT OF LOCALS ! 10308: * ! 10309: * LOOP TO SCAN LOCAL NAMES AND STACK VRBLK POINTERS ! 10310: * ! 10311: {SDF07{MOV{#CH$CM{R8{{SET DELIMITER ONE = COMMA ! 10312: {{MOV{R8{R10{{SET DELIMITER TWO = COMMA ! 10313: {{JSR{XSCAN{{{SCAN OUT NEXT LOCAL NAME ! 10314: {{BNE{R9{#NULLS{SDF08{SKIP IF NON-NULL ! 10315: {{BZE{R7{SDF09{{IGNORE NULL IF CASE OF NO LOCALS ! 10316: * ! 10317: * HERE AFTER SCANNING OUT A LOCAL NAME ! 10318: * ! 10319: {SDF08{JSR{GTNVR{{{GET VRBLK POINTER ! 10320: {{PPM{SDF07{{{LOOP BACK TO IGNORE NULL NAME ! 10321: {{ICV{R7{{{IF OK, INCREMENT COUNT ! 10322: {{MOV{R9{-(SP){{STACK VRBLK POINTER ! 10323: {{BNZ{R6{SDF07{{LOOP BACK IF STOPPED BY A COMMA ! 10324: {{EJC{{{{ ! 10325: * ! 10326: * DEFINE (CONTINUED) ! 10327: * ! 10328: * HERE AFTER SCANNING LOCALS, BUILD PFBLK ! 10329: * ! 10330: {SDF09{MOV{R7{R6{{COPY COUNT OF LOCALS ! 10331: {{ADD{DEFNA{R6{{ADD NUMBER OF ARGUMENTS ! 10332: {{MOV{R6{R8{{SET SUM ARGS+LOCALS AS LOOP COUNT ! 10333: {{ADD{#PFSI${R6{{ADD SPACE FOR STANDARD FIELDS ! 10334: {{WTB{R6{{{CONVERT LENGTH TO BYTES ! 10335: {{JSR{ALLOC{{{ALLOCATE SPACE FOR PFBLK ! 10336: {{MOV{R9{R10{{SAVE POINTER TO PFBLK ! 10337: {{MOV{#B$PFC{(R9)+{{STORE FIRST WORD ! 10338: {{MOV{DEFNA{(R9)+{{STORE NUMBER OF ARGUMENTS ! 10339: {{MOV{R6{(R9)+{{STORE LENGTH (PFLEN) ! 10340: {{MOV{DEFVR{(R9)+{{STORE VRBLK PTR FOR FUNCTION NAME ! 10341: {{MOV{R7{(R9)+{{STORE NUMBER OF LOCALS ! 10342: {{ZER{(R9)+{{{DEAL WITH LABEL LATER ! 10343: {{ZER{(R9)+{{{ZERO PFCTR ! 10344: {{ZER{(R9)+{{{ZERO PFRTR ! 10345: {{BZE{R8{SDF11{{SKIP IF NO ARGS OR LOCALS ! 10346: {{MOV{R10{R6{{KEEP PFBLK POINTER ! 10347: {{MOV{DEFXS{R10{{POINT BEFORE ARGUMENTS ! 10348: {{LCT{R8{R8{{GET COUNT OF ARGS+LOCALS FOR LOOP ! 10349: * ! 10350: * LOOP TO MOVE LOCALS AND ARGS TO PFBLK ! 10351: * ! 10352: {SDF10{MOV{-(R10){(R9)+{{STORE ONE ENTRY AND BUMP POINTERS ! 10353: {{BCT{R8{SDF10{{LOOP TILL ALL STORED ! 10354: {{MOV{R6{R10{{RECOVER PFBLK POINTER ! 10355: {{EJC{{{{ ! 10356: * ! 10357: * DEFINE (CONTINUED) ! 10358: * ! 10359: * NOW DEAL WITH LABEL ! 10360: * ! 10361: {SDF11{MOV{DEFXS{SP{{POP STACK ! 10362: {{MOV{DEFLB{R9{{POINT TO VRBLK FOR LABEL ! 10363: {{MOV{4*VRLBL(R9){R9{{LOAD LABEL POINTER ! 10364: {{BNE{(R9){#B$TRT{SDF12{SKIP IF NOT TRAPPED ! 10365: {{MOV{4*TRLBL(R9){R9{{ELSE POINT TO REAL LABEL ! 10366: * ! 10367: * HERE AFTER LOCATING REAL LABEL POINTER ! 10368: * ! 10369: {SDF12{BEQ{R9{#STNDL{SDF13{JUMP IF LABEL IS NOT DEFINED ! 10370: {{MOV{R9{4*PFCOD(R10){{ELSE STORE LABEL POINTER ! 10371: {{MOV{DEFVR{R9{{POINT BACK TO VRBLK FOR FUNCTION ! 10372: {{JSR{DFFNC{{{DEFINE FUNCTION ! 10373: {{BRN{EXNUL{{{AND EXIT RETURNING NULL ! 10374: * ! 10375: * HERE FOR ERRONEOUS LABEL ! 10376: * ! 10377: {SDF13{ERB{086{DEFINE{{FUNCTION ENTRY POINT IS NOT DEFINED LABEL ! 10378: {{EJC{{{{ ! 10379: * ! 10380: * DETACH ! 10381: * ! 10382: {S$DET{ENT{{{{ENTRY POINT ! 10383: {{MOV{(SP)+{R9{{LOAD ARGUMENT ! 10384: {{JSR{GTVAR{{{LOCATE VARIABLE ! 10385: {{ERR{087{DETACH{{ARGUMENT IS NOT APPROPRIATE NAME ! 10386: {{JSR{DTACH{{{DETACH I/O ASSOCIATION FROM NAME ! 10387: {{BRN{EXNUL{{{RETURN NULL RESULT ! 10388: {{EJC{{{{ ! 10389: * ! 10390: * DIFFER ! 10391: * ! 10392: {S$DIF{ENT{{{{ENTRY POINT ! 10393: {{MOV{(SP)+{R9{{LOAD SECOND ARGUMENT ! 10394: {{MOV{(SP)+{R10{{LOAD FIRST ARGUMENT ! 10395: {{JSR{IDENT{{{CALL IDENT COMPARISON ROUTINE ! 10396: {{PPM{EXFAL{{{FAIL IF IDENT ! 10397: {{BRN{EXNUL{{{RETURN NULL IF DIFFER ! 10398: {{EJC{{{{ ! 10399: * ! 10400: * DUMP ! 10401: * ! 10402: {S$DMP{ENT{{{{ENTRY POINT ! 10403: {{JSR{GTSMI{{{LOAD DUMP ARG AS SMALL INTEGER ! 10404: {{ERR{088{DUMP{{ARGUMENT IS NOT INTEGER ! 10405: {{ERR{089{DUMP{{ARGUMENT IS NEGATIVE OR TOO LARGE ! 10406: {{JSR{DUMPR{{{ELSE CALL DUMP ROUTINE ! 10407: {{BRN{EXNUL{{{AND RETURN NULL AS RESULT ! 10408: {{EJC{{{{ ! 10409: * ! 10410: * DUPL ! 10411: * ! 10412: {S$DUP{ENT{{{{ENTRY POINT ! 10413: {{JSR{GTSMI{{{GET SECOND ARGUMENT AS SMALL INTEGE ! 10414: {{ERR{090{DUPL{{SECOND ARGUMENT IS NOT INTEGER ! 10415: {{PPM{SDUP7{{{JUMP IF NEGATIVE OT TOO BIG ! 10416: {{MOV{R9{R7{{SAVE DUPLICATION FACTOR ! 10417: {{JSR{GTSTG{{{GET FIRST ARG AS STRING ! 10418: {{PPM{SDUP4{{{JUMP IF NOT A STRING ! 10419: * ! 10420: * HERE FOR CASE OF DUPLICATION OF A STRING ! 10421: * ! 10422: {{MTI{R6{{{ACQUIRE LENGTH AS INTEGER ! 10423: {{STI{DUPSI{{{SAVE FOR THE MOMENT ! 10424: {{MTI{R7{{{GET DUPLICATION FACTOR AS INTEGER ! 10425: {{MLI{DUPSI{{{FORM PRODUCT ! 10426: {{IOV{SDUP3{{{JUMP IF OVERFLOW ! 10427: {{IEQ{EXNUL{{{RETURN NULL IF RESULT LENGTH = 0 ! 10428: {{MFI{R6{SDUP3{{GET AS ADDR INTEGER, CHECK OVFLO ! 10429: * ! 10430: * MERGE HERE WITH RESULT LENGTH IN WA ! 10431: * ! 10432: {SDUP1{MOV{R9{R10{{SAVE STRING POINTER ! 10433: {{JSR{ALOCS{{{ALLOCATE SPACE FOR STRING ! 10434: {{MOV{R9{-(SP){{SAVE AS RESULT POINTER ! 10435: {{MOV{R10{R8{{SAVE POINTER TO ARGUMENT STRING ! 10436: {{PSC{R9{{{PREPARE TO STORE CHARS OF RESULT ! 10437: {{LCT{R7{R7{{SET COUNTER TO CONTROL LOOP ! 10438: * ! 10439: * LOOP THROUGH DUPLICATIONS ! 10440: * ! 10441: {SDUP2{MOV{R8{R10{{POINT BACK TO ARGUMENT STRING ! 10442: {{MOV{4*SCLEN(R10){R6{{GET NUMBER OF CHARACTERS ! 10443: {{PLC{R10{{{POINT TO CHARS IN ARGUMENT STRING ! 10444: {{MVC{{{{MOVE CHARACTERS TO RESULT STRING ! 10445: {{BCT{R7{SDUP2{{LOOP TILL ALL DUPLICATIONS DONE ! 10446: {{BRN{EXITS{{{THEN EXIT FOR NEXT CODE WORD ! 10447: {{EJC{{{{ ! 10448: * ! 10449: * DUPL (CONTINUED) ! 10450: * ! 10451: * HERE IF TOO LARGE, SET MAX LENGTH AND LET ALOCS CATCH IT ! 10452: * ! 10453: {SDUP3{MOV{DNAME{R6{{SET IMPOSSIBLE LENGTH FOR ALOCS ! 10454: {{BRN{SDUP1{{{MERGE BACK ! 10455: * ! 10456: * HERE IF NOT A STRING ! 10457: * ! 10458: {SDUP4{JSR{GTPAT{{{CONVERT ARGUMENT TO PATTERN ! 10459: {{ERR{091{DUPL{{FIRST ARGUMENT IS NOT STRING OR PATTERN ! 10460: * ! 10461: * HERE TO DUPLICATE A PATTERN ARGUMENT ! 10462: * ! 10463: {{MOV{R9{-(SP){{STORE PATTERN ON STACK ! 10464: {{MOV{#NDNTH{R9{{START OFF WITH NULL PATTERN ! 10465: {{BZE{R7{SDUP6{{NULL PATTERN IS RESULT IF DUPFAC=0 ! 10466: {{MOV{R7{-(SP){{PRESERVE LOOP COUNT ! 10467: * ! 10468: * LOOP TO DUPLICATE BY SUCCESSIVE CONCATENATION ! 10469: * ! 10470: {SDUP5{MOV{R9{R10{{COPY CURRENT VALUE AS RIGHT ARGUMNT ! 10471: {{MOV{4*1(SP){R9{{GET A NEW COPY OF LEFT ! 10472: {{JSR{PCONC{{{CONCATENATE ! 10473: {{DCV{(SP){{{COUNT DOWN ! 10474: {{BNZ{(SP){SDUP5{{LOOP ! 10475: {{ICA{SP{{{POP LOOP COUNT ! 10476: * ! 10477: * HERE TO EXIT AFTER CONSTRUCTING PATTERN ! 10478: * ! 10479: {SDUP6{MOV{R9{(SP){{STORE RESULT ON STACK ! 10480: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK ! 10481: * ! 10482: * FAIL IF SECOND ARG IS OUT OF RANGE ! 10483: * ! 10484: {SDUP7{ICA{SP{{{POP FIRST ARGUMENT ! 10485: {{BRN{EXFAL{{{FAIL ! 10486: {{EJC{{{{ ! 10487: * ! 10488: * EJECT ! 10489: * ! 10490: {S$EJC{ENT{{{{ENTRY POINT ! 10491: {{JSR{IOFCB{{{CALL FCBLK ROUTINE ! 10492: {{ERR{092{EJECT{{ARGUMENT IS NOT A SUITABLE NAME ! 10493: {{PPM{SEJC1{{{NULL ARGUMENT ! 10494: {{JSR{SYSEF{{{CALL EJECT FILE FUNCTION ! 10495: {{ERR{093{EJECT{{FILE DOES NOT EXIST ! 10496: {{ERR{094{EJECT{{FILE DOES NOT PERMIT PAGE EJECT ! 10497: {{ERR{095{EJECT{{CAUSED NON-RECOVERABLE OUTPUT ERROR ! 10498: {{BRN{EXNUL{{{RETURN NULL AS RESULT ! 10499: * ! 10500: * HERE TO EJECT STANDARD OUTPUT FILE ! 10501: * ! 10502: {SEJC1{JSR{SYSEP{{{CALL ROUTINE TO EJECT PRINTER ! 10503: {{BRN{EXNUL{{{EXIT WITH NULL RESULT ! 10504: {{EJC{{{{ ! 10505: * ! 10506: * ENDFILE ! 10507: * ! 10508: {S$ENF{ENT{{{{ENTRY POINT ! 10509: {{JSR{IOFCB{{{CALL FCBLK ROUTINE ! 10510: {{ERR{096{ENDFILE{{ARGUMENT IS NOT A SUITABLE NAME ! 10511: {{ERR{097{ENDFILE{{ARGUMENT IS NULL ! 10512: {{JSR{SYSEN{{{CALL ENDFILE ROUTINE ! 10513: {{ERR{098{ENDFILE{{FILE DOES NOT EXIST ! 10514: {{ERR{099{ENDFILE{{FILE DOES NOT PERMIT ENDFILE ! 10515: {{ERR{100{ENDFILE{{CAUSED NON-RECOVERABLE OUTPUT ERROR ! 10516: {{MOV{R10{R7{{REMEMBER VRBLK PTR FROM IOFCB CALL ! 10517: * ! 10518: * LOOP TO FIND TRTRF BLOCK ! 10519: * ! 10520: {SENF1{MOV{R10{R9{{COPY POINTER ! 10521: {{MOV{4*TRVAL(R9){R9{{CHAIN ALONG ! 10522: {{BNE{(R9){#B$TRT{EXNUL{SKIP OUT IF CHAIN END ! 10523: {{BNE{4*TRTYP(R9){#TRTFC{SENF1{LOOP IF NOT FOUND ! 10524: {{MOV{4*TRVAL(R9){4*TRVAL(R10){{REMOVE TRTRF ! 10525: {{MOV{4*TRTRF(R9){ENFCH{{POINT TO HEAD OF IOCHN ! 10526: {{MOV{4*TRFPT(R9){R8{{POINT TO FCBLK ! 10527: {{MOV{R7{R9{{FILEARG1 VRBLK FROM IOFCB ! 10528: {{JSR{SETVR{{{RESET IT ! 10529: {{MOV{#R$FCB{R10{{PTR TO HEAD OF FCBLK CHAIN ! 10530: {{SUB{#4*NUM02{R10{{ADJUST READY TO ENTER LOOP ! 10531: * ! 10532: * FIND FCBLK ! 10533: * ! 10534: {SENF2{MOV{R10{R9{{COPY PTR ! 10535: {{MOV{4*2(R10){R10{{GET NEXT LINK ! 10536: {{BZE{R10{SENF4{{STOP IF CHAIN END ! 10537: {{BEQ{4*3(R10){R8{SENF3{JUMP IF FCBLK FOUND ! 10538: {{BRN{SENF2{{{LOOP ! 10539: * ! 10540: * REMOVE FCBLK ! 10541: * ! 10542: {SENF3{MOV{4*2(R10){4*2(R9){{DELETE FCBLK FROM CHAIN ! 10543: * ! 10544: * LOOP WHICH DETACHES ALL VBLS ON IOCHN CHAIN ! 10545: * ! 10546: {SENF4{MOV{ENFCH{R10{{GET CHAIN HEAD ! 10547: {{BZE{R10{EXNUL{{FINISHED IF CHAIN END ! 10548: {{MOV{4*TRTRF(R10){ENFCH{{CHAIN ALONG ! 10549: {{MOV{4*IONMO(R10){R6{{NAME OFFSET ! 10550: {{MOV{4*IONMB(R10){R10{{NAME BASE ! 10551: {{JSR{DTACH{{{DETACH NAME ! 10552: {{BRN{SENF4{{{LOOP TILL DONE ! 10553: {{EJC{{{{ ! 10554: * ! 10555: * EQ ! 10556: * ! 10557: {S$EQF{ENT{{{{ENTRY POINT ! 10558: {{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE ! 10559: {{ERR{101{EQ{{FIRST ARGUMENT IS NOT NUMERIC ! 10560: {{ERR{102{EQ{{SECOND ARGUMENT IS NOT NUMERIC ! 10561: {{PPM{EXFAL{{{FAIL IF LT ! 10562: {{PPM{EXNUL{{{RETURN NULL IF EQ ! 10563: {{PPM{EXFAL{{{FAIL IF GT ! 10564: {{EJC{{{{ ! 10565: * ! 10566: * EVAL ! 10567: * ! 10568: {S$EVL{ENT{{{{ENTRY POINT ! 10569: {{MOV{(SP)+{R9{{LOAD ARGUMENT ! 10570: {{JSR{GTEXP{{{CONVERT TO EXPRESSION ! 10571: {{ERR{103{EVAL{{ARGUMENT IS NOT EXPRESSION ! 10572: {{LCW{R8{{{LOAD NEXT CODE WORD ! 10573: {{BNE{R8{#OFNE${SEVL1{JUMP IF CALLED BY VALUE ! 10574: {{SCP{R10{{{COPY CODE POINTER ! 10575: {{MOV{(R10){R6{{GET NEXT CODE WORD ! 10576: {{BNE{R6{#ORNM${SEVL2{BY NAME UNLESS EXPRESSION ! 10577: {{BNZ{4*1(SP){SEVL2{{JUMP IF BY NAME ! 10578: * ! 10579: * HERE IF CALLED BY VALUE ! 10580: * ! 10581: {SEVL1{ZER{R7{{{SET FLAG FOR BY VALUE ! 10582: {{MOV{R8{-(SP){{SAVE CODE WORD ! 10583: {{JSR{EVALX{{{EVALUATE EXPRESSION BY VALUE ! 10584: {{PPM{EXFAL{{{FAIL IF EVALUATION FAILS ! 10585: {{MOV{R9{R10{{COPY RESULT ! 10586: {{MOV{(SP){R9{{RELOAD NEXT CODE WORD ! 10587: {{MOV{R10{(SP){{STACK RESULT ! 10588: {{BRI{(R9){{{JUMP TO EXECUTE NEXT CODE WORD ! 10589: * ! 10590: * HERE IF CALLED BY NAME ! 10591: * ! 10592: {SEVL2{MOV{#NUM01{R7{{SET FLAG FOR BY NAME ! 10593: {{JSR{EVALX{{{EVALUATE EXPRESSION BY NAME ! 10594: {{PPM{EXFAL{{{FAIL IF EVALUATION FAILS ! 10595: {{BRN{EXNAM{{{EXIT WITH NAME ! 10596: {{EJC{{{{ ! 10597: * ! 10598: * EXIT ! 10599: * ! 10600: {S$EXT{ENT{{{{ENTRY POINT ! 10601: {{ZER{R7{{{CLEAR AMOUNT OF STATIC SHIFT ! 10602: {{JSR{GBCOL{{{COMPACT MEMORY BY COLLECTING ! 10603: {{JSR{GTSTG{{{CONVERT ARG TO STRING ! 10604: {{ERR{104{EXIT{{ARGUMENT IS NOT SUITABLE INTEGER OR STRING ! 10605: {{MOV{R9{R10{{COPY STRING PTR ! 10606: {{JSR{GTINT{{{CHECK IT IS INTEGER ! 10607: {{PPM{SEXT1{{{SKIP IF UNCONVERTIBLE ! 10608: {{ZER{R10{{{NOTE IT IS INTEGER ! 10609: {{LDI{4*ICVAL(R9){{{GET INTEGER ARG ! 10610: {{MOV{R$FCB{R7{{GET FCBLK CHAIN HEADER ! 10611: * ! 10612: * MERGE TO CALL OSINT EXIT ROUTINE ! 10613: * ! 10614: {SEXT1{MOV{#HEADV{R9{{POINT TO V.V STRING ! 10615: {{JSR{SYSXI{{{CALL EXTERNAL ROUTINE ! 10616: {{ERR{105{EXIT{{ACTION NOT AVAILABLE IN THIS IMPLEMENTATION ! 10617: {{ERR{106{EXIT{{ACTION CAUSED IRRECOVERABLE ERROR ! 10618: {{IEQ{EXNUL{{{RETURN IF ARGUMENT 0 ! 10619: {{ZER{GBCNT{{{RESUMING EXECUTION SO RESET ! 10620: {{IGT{SEXT2{{{SKIP IF POSITIVE ! 10621: {{NGI{{{{MAKE POSITIVE ! 10622: * ! 10623: * CHECK FOR OPTION RESPECIFICATION ! 10624: * ! 10625: {SEXT2{MFI{R8{{{GET VALUE IN WORK REG ! 10626: {{BEQ{R8{#NUM03{SEXT3{SKIP IF WAS 3 ! 10627: {{MOV{R8{-(SP){{SAVE VALUE ! 10628: {{ZER{R8{{{SET TO READ OPTIONS ! 10629: {{JSR{PRPAR{{{READ SYSPP OPTIONS ! 10630: {{MOV{(SP)+{R8{{RESTORE VALUE ! 10631: * ! 10632: * DEAL WITH HEADER OPTION (FIDDLED BY PRPAR) ! 10633: * ! 10634: {SEXT3{MNZ{HEADP{{{ASSUME NO HEADERS ! 10635: {{BNE{R8{#NUM01{SEXT4{SKIP IF NOT 1 ! 10636: {{ZER{HEADP{{{REQUEST HEADER PRINTING ! 10637: * ! 10638: * ALMOST READY TO RESUME RUNNING ! 10639: * ! 10640: {SEXT4{JSR{SYSTM{{{GET EXECUTION TIME START (SGD11) ! 10641: {{STI{TIMSX{{{SAVE AS INITIAL TIME ! 10642: {{LDI{KVSTC{{{RESET TO ENSURE ... ! 10643: {{STI{KVSTL{{{... CORRECT EXECUTION STATS ! 10644: {{BRN{EXNUL{{{RESUME EXECUTION ! 10645: {{EJC{{{{ ! 10646: * ! 10647: * FIELD ! 10648: * ! 10649: {S$FLD{ENT{{{{ENTRY POINT ! 10650: {{JSR{GTSMI{{{GET SECOND ARGUMENT (FIELD NUMBER) ! 10651: {{ERR{107{FIELD{{SECOND ARGUMENT IS NOT INTEGER ! 10652: {{PPM{EXFAL{{{FAIL IF OUT OF RANGE ! 10653: {{MOV{R9{R7{{ELSE SAVE INTEGER VALUE ! 10654: {{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT ! 10655: {{JSR{GTNVR{{{POINT TO VRBLK ! 10656: {{PPM{SFLD1{{{JUMP (ERROR) IF NOT VARIABLE NAME ! 10657: {{MOV{4*VRFNC(R9){R9{{ELSE POINT TO FUNCTION BLOCK ! 10658: {{BNE{(R9){#B$DFC{SFLD1{ERROR IF NOT DATATYPE FUNCTION ! 10659: * ! 10660: * HERE IF FIRST ARGUMENT IS A DATATYPE FUNCTION NAME ! 10661: * ! 10662: {{BZE{R7{EXFAL{{FAIL IF ARGUMENT NUMBER IS ZERO ! 10663: {{BGT{R7{4*FARGS(R9){EXFAL{FAIL IF TOO LARGE ! 10664: {{WTB{R7{{{ELSE CONVERT TO BYTE OFFSET ! 10665: {{ADD{R7{R9{{POINT TO FIELD NAME ! 10666: {{MOV{4*DFFLB(R9){R9{{LOAD VRBLK POINTER ! 10667: {{BRN{EXVNM{{{EXIT TO BUILD NMBLK ! 10668: * ! 10669: * HERE FOR BAD FIRST ARGUMENT ! 10670: * ! 10671: {SFLD1{ERB{108{FIELD{{FIRST ARGUMENT IS NOT DATATYPE NAME ! 10672: {{EJC{{{{ ! 10673: * ! 10674: * FENCE ! 10675: * ! 10676: {S$FNC{ENT{{{{ENTRY POINT ! 10677: {{MOV{#P$FNC{R7{{SET PCODE FOR P$FNC ! 10678: {{ZER{R9{{{P0BLK ! 10679: {{JSR{PBILD{{{BUILD P$FNC NODE ! 10680: {{MOV{R9{R10{{SAVE POINTER TO IT ! 10681: {{MOV{(SP)+{R9{{GET ARGUMENT ! 10682: {{JSR{GTPAT{{{CONVERT TO PATTERN ! 10683: {{ERR{259{FENCE{{ARGUMENT IS NOT PATTERN ! 10684: {{JSR{PCONC{{{CONCATENATE TO P$FNC NODE ! 10685: {{MOV{R9{R10{{SAVE PTR TO CONCATENATED PATTERN ! 10686: {{MOV{#P$FNA{R7{{SET FOR P$FNA PCODE ! 10687: {{ZER{R9{{{P0BLK ! 10688: {{JSR{PBILD{{{CONSTRUCT P$FNA NODE ! 10689: {{MOV{R10{4*PTHEN(R9){{SET PATTERN AS PTHEN ! 10690: {{MOV{R9{-(SP){{SET AS RESULT ! 10691: {{BRN{EXITS{{{DO NEXT CODE WORD ! 10692: {{EJC{{{{ ! 10693: * ! 10694: * GE ! 10695: * ! 10696: {S$GEF{ENT{{{{ENTRY POINT ! 10697: {{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE ! 10698: {{ERR{109{GE{{FIRST ARGUMENT IS NOT NUMERIC ! 10699: {{ERR{110{GE{{SECOND ARGUMENT IS NOT NUMERIC ! 10700: {{PPM{EXFAL{{{FAIL IF LT ! 10701: {{PPM{EXNUL{{{RETURN NULL IF EQ ! 10702: {{PPM{EXNUL{{{RETURN NULL IF GT ! 10703: {{EJC{{{{ ! 10704: * ! 10705: * GT ! 10706: * ! 10707: {S$GTF{ENT{{{{ENTRY POINT ! 10708: {{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE ! 10709: {{ERR{111{GT{{FIRST ARGUMENT IS NOT NUMERIC ! 10710: {{ERR{112{GT{{SECOND ARGUMENT IS NOT NUMERIC ! 10711: {{PPM{EXFAL{{{FAIL IF LT ! 10712: {{PPM{EXFAL{{{FAIL IF EQ ! 10713: {{PPM{EXNUL{{{RETURN NULL IF GT ! 10714: {{EJC{{{{ ! 10715: * ! 10716: * HOST ! 10717: * ! 10718: {S$HST{ENT{{{{ENTRY POINT ! 10719: {{MOV{(SP)+{R9{{GET THIRD ARG ! 10720: {{MOV{(SP)+{R10{{GET SECOND ARG ! 10721: {{MOV{(SP)+{R6{{GET FIRST ARG ! 10722: {{JSR{SYSHS{{{ENTER SYSHS ROUTINE ! 10723: {{ERR{254{ERRONEOUS{{ARGUMENT FOR HOST ! 10724: {{ERR{255{ERROR{{DURING EXECUTION OF HOST ! 10725: {{PPM{SHST1{{{STORE HOST STRING ! 10726: {{PPM{EXNUL{{{RETURN NULL RESULT ! 10727: {{PPM{EXIXR{{{RETURN XR ! 10728: {{PPM{EXFAL{{{FAIL RETURN ! 10729: * ! 10730: * RETURN HOST STRING ! 10731: * ! 10732: {SHST1{BZE{R10{EXNUL{{NULL STRING IF SYSHS UNCOOPERATIVE ! 10733: {{MOV{4*SCLEN(R10){R6{{LENGTH ! 10734: {{ZER{R7{{{ZERO OFFSET ! 10735: {{JSR{SBSTR{{{BUILD COPY OF STRING ! 10736: {{MOV{R9{-(SP){{STACK THE RESULT ! 10737: {{BRN{EXITS{{{RETURN RESULT ON STACK ! 10738: {{EJC{{{{ ! 10739: * ! 10740: * IDENT ! 10741: * ! 10742: {S$IDN{ENT{{{{ENTRY POINT ! 10743: {{MOV{(SP)+{R9{{LOAD SECOND ARGUMENT ! 10744: {{MOV{(SP)+{R10{{LOAD FIRST ARGUMENT ! 10745: {{JSR{IDENT{{{CALL IDENT COMPARISON ROUTINE ! 10746: {{PPM{EXNUL{{{RETURN NULL IF IDENT ! 10747: {{BRN{EXFAL{{{FAIL IF DIFFER ! 10748: {{EJC{{{{ ! 10749: * ! 10750: * INPUT ! 10751: * ! 10752: {S$INP{ENT{{{{ENTRY POINT ! 10753: {{ZER{R7{{{INPUT FLAG ! 10754: {{JSR{IOPUT{{{CALL INPUT/OUTPUT ASSOC. ROUTINE ! 10755: {{ERR{113{INPUT{{THIRD ARGUMENT IS NOT A STRING ! 10756: {{ERR{114{INAPPROPRIATE{{SECOND ARGUMENT FOR INPUT ! 10757: {{ERR{115{INAPPROPRIATE{{FIRST ARGUMENT FOR INPUT ! 10758: {{ERR{116{INAPPROPRIATE{{FILE SPECIFICATION FOR INPUT ! 10759: {{PPM{EXFAL{{{FAIL IF FILE DOES NOT EXIST ! 10760: {{ERR{117{INPUT{{FILE CANNOT BE READ ! 10761: {{BRN{EXNUL{{{RETURN NULL STRING ! 10762: {{EJC{{{{ ! 10763: * ! 10764: * INSERT ! 10765: * ! 10766: {S$INS{ENT{{{{ENTRY POINT ! 10767: {{MOV{(SP)+{R10{{GET STRING ARG ! 10768: {{JSR{GTSMI{{{GET REPLACE LENGTH ! 10769: {{ERR{277{INSERT{{THIRD ARGUMENT NOT INTEGER ! 10770: {{PPM{EXFAL{{{FAIL IF OUT OF RANGE ! 10771: {{MOV{R8{R7{{COPY TO PROPER REG ! 10772: {{JSR{GTSMI{{{GET REPLACE POSITION ! 10773: {{ERR{278{INSERT{{SECOND ARGUMENT NOT INTEGER ! 10774: {{PPM{EXFAL{{{FAIL IF OUT OF RANGE ! 10775: {{BZE{R8{EXFAL{{FAIL IF ZERO ! 10776: {{DCV{R8{{{DECREMENT TO GET OFFSET ! 10777: {{MOV{R8{R6{{PUT IN PROPER REGISTER ! 10778: {{MOV{(SP)+{R9{{GET BUFFER ! 10779: {{BEQ{(R9){#B$BCT{SINS1{PRESS ON IF TYPE OK ! 10780: {{ERB{279{INSERT{{FIRST ARGUMENT NOT BUFFER ! 10781: * ! 10782: * HERE WHEN EVERYTHING LOADED UP ! 10783: * ! 10784: {SINS1{JSR{INSBF{{{CALL TO INSERT ! 10785: {{ERR{280{INSERT{{FOURTH ARGUMENT NOT A STRING ! 10786: {{PPM{EXFAL{{{FAIL IF OUT OF RANGE ! 10787: {{BRN{EXNUL{{{ELSE OK - EXIT WITH NULL ! 10788: {{EJC{{{{ ! 10789: * ! 10790: * INTEGER ! 10791: * ! 10792: {S$INT{ENT{{{{ENTRY POINT ! 10793: {{MOV{(SP)+{R9{{LOAD ARGUMENT ! 10794: {{JSR{GTNUM{{{CONVERT TO NUMERIC ! 10795: {{PPM{EXFAL{{{FAIL IF NON-NUMERIC ! 10796: {{BEQ{R6{#B$ICL{EXNUL{RETURN NULL IF INTEGER ! 10797: {{BRN{EXFAL{{{FAIL IF REAL ! 10798: {{EJC{{{{ ! 10799: * ! 10800: * ITEM ! 10801: * ! 10802: * ITEM DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT ! 10803: * WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED. ! 10804: * ! 10805: {S$ITM{ENT{{{{ENTRY POINT ! 10806: * ! 10807: * DEAL WITH CASE OF NO ARGS ! 10808: * ! 10809: {{BNZ{R6{SITM1{{JUMP IF AT LEAST ONE ARG ! 10810: {{MOV{#NULLS{-(SP){{ELSE SUPPLY GARBAGE NULL ARG ! 10811: {{MOV{#NUM01{R6{{AND FIX ARGUMENT COUNT ! 10812: * ! 10813: * CHECK FOR NAME/VALUE CASES ! 10814: * ! 10815: {SITM1{SCP{R9{{{GET CURRENT CODE POINTER ! 10816: {{MOV{(R9){R10{{LOAD NEXT CODE WORD ! 10817: {{DCV{R6{{{GET NUMBER OF SUBSCRIPTS ! 10818: {{MOV{R6{R9{{COPY FOR ARREF ! 10819: {{BEQ{R10{#OFNE${SITM2{JUMP IF CALLED BY NAME ! 10820: * ! 10821: * HERE IF CALLED BY VALUE ! 10822: * ! 10823: {{ZER{R7{{{SET CODE FOR CALL BY VALUE ! 10824: {{BRN{ARREF{{{OFF TO ARRAY REFERENCE ROUTINE ! 10825: * ! 10826: * HERE FOR CALL BY NAME ! 10827: * ! 10828: {SITM2{MNZ{R7{{{SET CODE FOR CALL BY NAME ! 10829: {{LCW{R6{{{LOAD AND IGNORE OFNE$ CALL ! 10830: {{BRN{ARREF{{{OFF TO ARRAY REFERENCE ROUTINE ! 10831: {{EJC{{{{ ! 10832: * ! 10833: * LE ! 10834: * ! 10835: {S$LEF{ENT{{{{ENTRY POINT ! 10836: {{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE ! 10837: {{ERR{118{LE{{FIRST ARGUMENT IS NOT NUMERIC ! 10838: {{ERR{119{LE{{SECOND ARGUMENT IS NOT NUMERIC ! 10839: {{PPM{EXNUL{{{RETURN NULL IF LT ! 10840: {{PPM{EXNUL{{{RETURN NULL IF EQ ! 10841: {{PPM{EXFAL{{{FAIL IF GT ! 10842: {{EJC{{{{ ! 10843: * ! 10844: * LEN ! 10845: * ! 10846: {S$LEN{ENT{{{{ENTRY POINT ! 10847: {{MOV{#P$LEN{R7{{SET PCODE FOR INTEGER ARG CASE ! 10848: {{MOV{#P$LND{R6{{SET PCODE FOR EXPR ARG CASE ! 10849: {{JSR{PATIN{{{CALL COMMON ROUTINE TO BUILD NODE ! 10850: {{ERR{120{LEN{{ARGUMENT IS NOT INTEGER OR EXPRESSION ! 10851: {{ERR{121{LEN{{ARGUMENT IS NEGATIVE OR TOO LARGE ! 10852: {{BRN{EXIXR{{{RETURN PATTERN NODE ! 10853: {{EJC{{{{ ! 10854: * ! 10855: * LEQ ! 10856: * ! 10857: {S$LEQ{ENT{{{{ENTRY POINT ! 10858: {{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE ! 10859: {{ERR{122{LEQ{{FIRST ARGUMENT IS NOT STRING ! 10860: {{ERR{123{LEQ{{SECOND ARGUMENT IS NOT STRING ! 10861: {{PPM{EXFAL{{{FAIL IF LLT ! 10862: {{PPM{EXNUL{{{RETURN NULL IF LEQ ! 10863: {{PPM{EXFAL{{{FAIL IF LGT ! 10864: {{EJC{{{{ ! 10865: * ! 10866: * LGE ! 10867: * ! 10868: {S$LGE{ENT{{{{ENTRY POINT ! 10869: {{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE ! 10870: {{ERR{124{LGE{{FIRST ARGUMENT IS NOT STRING ! 10871: {{ERR{125{LGE{{SECOND ARGUMENT IS NOT STRING ! 10872: {{PPM{EXFAL{{{FAIL IF LLT ! 10873: {{PPM{EXNUL{{{RETURN NULL IF LEQ ! 10874: {{PPM{EXNUL{{{RETURN NULL IF LGT ! 10875: {{EJC{{{{ ! 10876: * ! 10877: * LGT ! 10878: * ! 10879: {S$LGT{ENT{{{{ENTRY POINT ! 10880: {{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE ! 10881: {{ERR{126{LGT{{FIRST ARGUMENT IS NOT STRING ! 10882: {{ERR{127{LGT{{SECOND ARGUMENT IS NOT STRING ! 10883: {{PPM{EXFAL{{{FAIL IF LLT ! 10884: {{PPM{EXFAL{{{FAIL IF LEQ ! 10885: {{PPM{EXNUL{{{RETURN NULL IF LGT ! 10886: {{EJC{{{{ ! 10887: * ! 10888: * LLE ! 10889: * ! 10890: {S$LLE{ENT{{{{ENTRY POINT ! 10891: {{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE ! 10892: {{ERR{128{LLE{{FIRST ARGUMENT IS NOT STRING ! 10893: {{ERR{129{LLE{{SECOND ARGUMENT IS NOT STRING ! 10894: {{PPM{EXNUL{{{RETURN NULL IF LLT ! 10895: {{PPM{EXNUL{{{RETURN NULL IF LEQ ! 10896: {{PPM{EXFAL{{{FAIL IF LGT ! 10897: {{EJC{{{{ ! 10898: * ! 10899: * LLT ! 10900: * ! 10901: {S$LLT{ENT{{{{ENTRY POINT ! 10902: {{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE ! 10903: {{ERR{130{LLT{{FIRST ARGUMENT IS NOT STRING ! 10904: {{ERR{131{LLT{{SECOND ARGUMENT IS NOT STRING ! 10905: {{PPM{EXNUL{{{RETURN NULL IF LLT ! 10906: {{PPM{EXFAL{{{FAIL IF LEQ ! 10907: {{PPM{EXFAL{{{FAIL IF LGT ! 10908: {{EJC{{{{ ! 10909: * ! 10910: * LNE ! 10911: * ! 10912: {S$LNE{ENT{{{{ENTRY POINT ! 10913: {{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE ! 10914: {{ERR{132{LNE{{FIRST ARGUMENT IS NOT STRING ! 10915: {{ERR{133{LNE{{SECOND ARGUMENT IS NOT STRING ! 10916: {{PPM{EXNUL{{{RETURN NULL IF LLT ! 10917: {{PPM{EXFAL{{{FAIL IF LEQ ! 10918: {{PPM{EXNUL{{{RETURN NULL IF LGT ! 10919: {{EJC{{{{ ! 10920: * ! 10921: * LOCAL ! 10922: * ! 10923: {S$LOC{ENT{{{{ENTRY POINT ! 10924: {{JSR{GTSMI{{{GET SECOND ARGUMENT (LOCAL NUMBER) ! 10925: {{ERR{134{LOCAL{{SECOND ARGUMENT IS NOT INTEGER ! 10926: {{PPM{EXFAL{{{FAIL IF OUT OF RANGE ! 10927: {{MOV{R9{R7{{SAVE LOCAL NUMBER ! 10928: {{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT ! 10929: {{JSR{GTNVR{{{POINT TO VRBLK ! 10930: {{PPM{SLOC1{{{JUMP IF NOT VARIABLE NAME ! 10931: {{MOV{4*VRFNC(R9){R9{{ELSE LOAD FUNCTION POINTER ! 10932: {{BNE{(R9){#B$PFC{SLOC1{JUMP IF NOT PROGRAM DEFINED ! 10933: * ! 10934: * HERE IF WE HAVE A PROGRAM DEFINED FUNCTION NAME ! 10935: * ! 10936: {{BZE{R7{EXFAL{{FAIL IF SECOND ARG IS ZERO ! 10937: {{BGT{R7{4*PFNLO(R9){EXFAL{OR TOO LARGE ! 10938: {{ADD{4*FARGS(R9){R7{{ELSE ADJUST OFFSET TO INCLUDE ARGS ! 10939: {{WTB{R7{{{CONVERT TO BYTES ! 10940: {{ADD{R7{R9{{POINT TO LOCAL POINTER ! 10941: {{MOV{4*PFAGB(R9){R9{{LOAD VRBLK POINTER ! 10942: {{BRN{EXVNM{{{EXIT BUILDING NMBLK ! 10943: * ! 10944: * HERE IF FIRST ARGUMENT IS NO GOOD ! 10945: * ! 10946: {SLOC1{ERB{135{LOCAL{{FIRST ARG IS NOT A PROGRAM FUNCTION NAME ! 10947: {{EJC{{{{ ! 10948: * ! 10949: * LOAD ! 10950: * ! 10951: {S$LOD{ENT{{{{ENTRY POINT ! 10952: {{JSR{GTSTG{{{LOAD LIBRARY NAME ! 10953: {{ERR{136{LOAD{{SECOND ARGUMENT IS NOT STRING ! 10954: {{MOV{R9{R10{{SAVE LIBRARY NAME ! 10955: {{JSR{XSCNI{{{PREPARE TO SCAN FIRST ARGUMENT ! 10956: {{ERR{137{LOAD{{FIRST ARGUMENT IS NOT STRING ! 10957: {{ERR{138{LOAD{{FIRST ARGUMENT IS NULL ! 10958: {{MOV{R10{-(SP){{STACK LIBRARY NAME ! 10959: {{MOV{#CH$PP{R8{{SET DELIMITER ONE = LEFT PAREN ! 10960: {{MOV{R8{R10{{SET DELIMITER TWO = LEFT PAREN ! 10961: {{JSR{XSCAN{{{SCAN FUNCTION NAME ! 10962: {{MOV{R9{-(SP){{SAVE PTR TO FUNCTION NAME ! 10963: {{BNZ{R6{SLOD1{{JUMP IF LEFT PAREN FOUND ! 10964: {{ERB{139{LOAD{{FIRST ARGUMENT IS MISSING A LEFT PAREN ! 10965: * ! 10966: * HERE AFTER SUCCESSFULLY SCANNING FUNCTION NAME ! 10967: * ! 10968: {SLOD1{JSR{GTNVR{{{LOCATE VRBLK ! 10969: {{ERR{140{LOAD{{FIRST ARGUMENT HAS NULL FUNCTION NAME ! 10970: {{MOV{R9{LODFN{{SAVE VRBLK POINTER ! 10971: {{ZER{LODNA{{{ZERO COUNT OF ARGUMENTS ! 10972: * ! 10973: * LOOP TO SCAN ARGUMENT DATATYPE NAMES ! 10974: * ! 10975: {SLOD2{MOV{#CH$RP{R8{{DELIMITER ONE IS RIGHT PAREN ! 10976: {{MOV{#CH$CM{R10{{DELIMITER TWO IS COMMA ! 10977: {{JSR{XSCAN{{{SCAN NEXT ARGUMENT NAME ! 10978: {{ICV{LODNA{{{BUMP ARGUMENT COUNT ! 10979: {{BNZ{R6{SLOD3{{JUMP IF OK DELIMITER WAS FOUND ! 10980: {{ERB{141{LOAD{{FIRST ARGUMENT IS MISSING A RIGHT PAREN ! 10981: {{EJC{{{{ ! 10982: * ! 10983: * LOAD (CONTINUED) ! 10984: * ! 10985: * COME HERE TO ANALYZE THE DATATYPE POINTER IN (XR). THIS ! 10986: * CODE IS USED BOTH FOR ARGUMENTS (WA=1,2) AND FOR THE ! 10987: * RESULT DATATYPE (WITH WA SET TO ZERO). ! 10988: * ! 10989: {SLOD3{MOV{R9{-(SP){{STACK DATATYPE NAME POINTER ! 10990: {{MOV{#NUM01{R7{{SET STRING CODE IN CASE ! 10991: {{MOV{#SCSTR{R10{{POINT TO /STRING/ ! 10992: {{JSR{IDENT{{{CHECK FOR MATCH ! 10993: {{PPM{SLOD4{{{JUMP IF MATCH ! 10994: {{MOV{(SP){R9{{ELSE RELOAD NAME ! 10995: {{ADD{R7{R7{{SET CODE FOR INTEGER (2) ! 10996: {{MOV{#SCINT{R10{{POINT TO /INTEGER/ ! 10997: {{JSR{IDENT{{{CHECK FOR MATCH ! 10998: {{PPM{SLOD4{{{JUMP IF MATCH ! 10999: {{MOV{(SP){R9{{ELSE RELOAD STRING POINTER ! 11000: {{ICV{R7{{{SET CODE FOR REAL (3) ! 11001: {{MOV{#SCREA{R10{{POINT TO /REAL/ ! 11002: {{JSR{IDENT{{{CHECK FOR MATCH ! 11003: {{PPM{SLOD4{{{JUMP IF MATCH ! 11004: {{ZER{R7{{{ELSE GET CODE FOR NO CONVERT ! 11005: * ! 11006: * MERGE HERE WITH PROPER DATATYPE CODE IN WB ! 11007: * ! 11008: {SLOD4{MOV{R7{(SP){{STORE CODE ON STACK ! 11009: {{BEQ{R6{#NUM02{SLOD2{LOOP BACK IF ARG STOPPED BY COMMA ! 11010: {{BZE{R6{SLOD5{{JUMP IF THAT WAS THE RESULT TYPE ! 11011: * ! 11012: * HERE WE SCAN OUT THE RESULT TYPE (ARG STOPPED BY ) ) ! 11013: * ! 11014: {{MOV{MXLEN{R8{{SET DUMMY (IMPOSSIBLE) DELIMITER 1 ! 11015: {{MOV{R8{R10{{AND DELIMITER TWO ! 11016: {{JSR{XSCAN{{{SCAN RESULT NAME ! 11017: {{ZER{R6{{{SET CODE FOR PROCESSING RESULT ! 11018: {{BRN{SLOD3{{{JUMP BACK TO PROCESS RESULT NAME ! 11019: {{EJC{{{{ ! 11020: * ! 11021: * LOAD (CONTINUED) ! 11022: * ! 11023: * HERE AFTER PROCESSING ALL ARGS AND RESULT ! 11024: * ! 11025: {SLOD5{MOV{LODNA{R6{{GET NUMBER OF ARGUMENTS ! 11026: {{MOV{R6{R8{{COPY FOR LATER ! 11027: {{WTB{R6{{{CONVERT LENGTH TO BYTES ! 11028: {{ADD{#4*EFSI${R6{{ADD SPACE FOR STANDARD FIELDS ! 11029: {{JSR{ALLOC{{{ALLOCATE EFBLK ! 11030: {{MOV{#B$EFC{(R9){{SET TYPE WORD ! 11031: {{MOV{R8{4*FARGS(R9){{SET NUMBER OF ARGUMENTS ! 11032: {{ZER{4*EFUSE(R9){{{SET USE COUNT (DFFNC WILL SET TO 1) ! 11033: {{ZER{4*EFCOD(R9){{{ZERO CODE POINTER FOR NOW ! 11034: {{MOV{(SP)+{4*EFRSL(R9){{STORE RESULT TYPE CODE ! 11035: {{MOV{LODFN{4*EFVAR(R9){{STORE FUNCTION VRBLK POINTER ! 11036: {{MOV{R6{4*EFLEN(R9){{STORE EFBLK LENGTH ! 11037: {{MOV{R9{R7{{SAVE EFBLK POINTER ! 11038: {{ADD{R6{R9{{POINT PAST END OF EFBLK ! 11039: {{LCT{R8{R8{{SET NUMBER OF ARGUMENTS FOR LOOP ! 11040: * ! 11041: * LOOP TO SET ARGUMENT TYPE CODES FROM STACK ! 11042: * ! 11043: {SLOD6{MOV{(SP)+{-(R9){{STORE ONE TYPE CODE FROM STACK ! 11044: {{BCT{R8{SLOD6{{LOOP TILL ALL STORED ! 11045: * ! 11046: * NOW LOAD THE EXTERNAL FUNCTION AND PERFORM DEFINITION ! 11047: * ! 11048: {{MOV{(SP)+{R9{{LOAD FUNCTION STRING NAME ! 11049: {{MOV{(SP){R10{{LOAD LIBRARY NAME ! 11050: {{MOV{R7{(SP){{STORE EFBLK POINTER ! 11051: {{JSR{SYSLD{{{CALL FUNCTION TO LOAD EXTERNAL FUNC ! 11052: {{ERR{142{LOAD{{FUNCTION DOES NOT EXIST ! 11053: {{ERR{143{LOAD{{FUNCTION CAUSED INPUT ERROR DURING LOAD ! 11054: {{MOV{(SP)+{R10{{RECALL EFBLK POINTER ! 11055: {{MOV{R9{4*EFCOD(R10){{STORE CODE POINTER ! 11056: {{MOV{LODFN{R9{{POINT TO VRBLK FOR FUNCTION ! 11057: {{JSR{DFFNC{{{PERFORM FUNCTION DEFINITION ! 11058: {{BRN{EXNUL{{{RETURN NULL RESULT ! 11059: {{EJC{{{{ ! 11060: * ! 11061: * LPAD ! 11062: * ! 11063: {S$LPD{ENT{{{{ENTRY POINT ! 11064: {{JSR{GTSTG{{{GET PAD CHARACTER ! 11065: {{ERR{144{LPAD{{THIRD ARGUMENT NOT A STRING ! 11066: {{PLC{R9{{{POINT TO CHARACTER (NULL IS BLANK) ! 11067: {{LCH{R7{(R9){{LOAD PAD CHARACTER ! 11068: {{JSR{GTSMI{{{GET PAD LENGTH ! 11069: {{ERR{145{LPAD{{SECOND ARGUMENT IS NOT INTEGER ! 11070: {{PPM{SLPD3{{{SKIP IF NEGATIVE OR LARGE ! 11071: * ! 11072: * MERGE TO CHECK FIRST ARG ! 11073: * ! 11074: {SLPD1{JSR{GTSTG{{{GET FIRST ARGUMENT (STRING TO PAD) ! 11075: {{ERR{146{LPAD{{FIRST ARGUMENT IS NOT STRING ! 11076: {{BGE{R6{R8{EXIXR{RETURN 1ST ARG IF TOO LONG TO PAD ! 11077: {{MOV{R9{R10{{ELSE MOVE PTR TO STRING TO PAD ! 11078: * ! 11079: * NOW WE ARE READY FOR THE PAD ! 11080: * ! 11081: * (XL) POINTER TO STRING TO PAD ! 11082: * (WB) PAD CHARACTER ! 11083: * (WC) LENGTH TO PAD STRING TO ! 11084: * ! 11085: {{MOV{R8{R6{{COPY LENGTH ! 11086: {{JSR{ALOCS{{{ALLOCATE SCBLK FOR NEW STRING ! 11087: {{MOV{R9{-(SP){{SAVE AS RESULT ! 11088: {{MOV{4*SCLEN(R10){R6{{LOAD LENGTH OF ARGUMENT ! 11089: {{SUB{R6{R8{{CALCULATE NUMBER OF PAD CHARACTERS ! 11090: {{PSC{R9{{{POINT TO CHARS IN RESULT STRING ! 11091: {{LCT{R8{R8{{SET COUNTER FOR PAD LOOP ! 11092: * ! 11093: * LOOP TO PERFORM PAD ! 11094: * ! 11095: {SLPD2{SCH{R7{(R9)+{{STORE PAD CHARACTER, BUMP PTR ! 11096: {{BCT{R8{SLPD2{{LOOP TILL ALL PAD CHARS STORED ! 11097: {{CSC{R9{{{COMPLETE STORE CHARACTERS ! 11098: * ! 11099: * NOW COPY STRING ! 11100: * ! 11101: {{BZE{R6{EXITS{{EXIT IF NULL STRING ! 11102: {{PLC{R10{{{ELSE POINT TO CHARS IN ARGUMENT ! 11103: {{MVC{{{{MOVE CHARACTERS TO RESULT STRING ! 11104: {{BRN{EXITS{{{JUMP FOR NEXT CODE WORD ! 11105: * ! 11106: * HERE IF 2ND ARG IS NEGATIVE OR LARGE ! 11107: * ! 11108: {SLPD3{ZER{R8{{{ZERO PAD COUNT ! 11109: {{BRN{SLPD1{{{MERGE ! 11110: {{EJC{{{{ ! 11111: * ! 11112: * LT ! 11113: * ! 11114: {S$LTF{ENT{{{{ENTRY POINT ! 11115: {{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE ! 11116: {{ERR{147{LT{{FIRST ARGUMENT IS NOT NUMERIC ! 11117: {{ERR{148{LT{{SECOND ARGUMENT IS NOT NUMERIC ! 11118: {{PPM{EXNUL{{{RETURN NULL IF LT ! 11119: {{PPM{EXFAL{{{FAIL IF EQ ! 11120: {{PPM{EXFAL{{{FAIL IF GT ! 11121: {{EJC{{{{ ! 11122: * ! 11123: * NE ! 11124: * ! 11125: {S$NEF{ENT{{{{ENTRY POINT ! 11126: {{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE ! 11127: {{ERR{149{NE{{FIRST ARGUMENT IS NOT NUMERIC ! 11128: {{ERR{150{NE{{SECOND ARGUMENT IS NOT NUMERIC ! 11129: {{PPM{EXNUL{{{RETURN NULL IF LT ! 11130: {{PPM{EXFAL{{{FAIL IF EQ ! 11131: {{PPM{EXNUL{{{RETURN NULL IF GT ! 11132: {{EJC{{{{ ! 11133: * ! 11134: * NOTANY ! 11135: * ! 11136: {S$NAY{ENT{{{{ENTRY POINT ! 11137: {{MOV{#P$NAS{R7{{SET PCODE FOR SINGLE CHAR ARG ! 11138: {{MOV{#P$NAY{R10{{PCODE FOR MULTI-CHAR ARG ! 11139: {{MOV{#P$NAD{R8{{SET PCODE FOR EXPR ARG ! 11140: {{JSR{PATST{{{CALL COMMON ROUTINE TO BUILD NODE ! 11141: {{ERR{151{NOTANY{{ARGUMENT IS NOT STRING OR EXPRESSION ! 11142: {{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD ! 11143: {{EJC{{{{ ! 11144: * ! 11145: * OPSYN ! 11146: * ! 11147: {S$OPS{ENT{{{{ENTRY POINT ! 11148: {{JSR{GTSMI{{{LOAD THIRD ARGUMENT ! 11149: {{ERR{152{OPSYN{{THIRD ARGUMENT IS NOT INTEGER ! 11150: {{ERR{153{OPSYN{{THIRD ARGUMENT IS NEGATIVE OR TOO LARGE ! 11151: {{MOV{R8{R7{{IF OK, SAVE THIRD ARGUMNET ! 11152: {{MOV{(SP)+{R9{{LOAD SECOND ARGUMENT ! 11153: {{JSR{GTNVR{{{LOCATE VARIABLE BLOCK ! 11154: {{ERR{154{OPSYN{{SECOND ARG IS NOT NATURAL VARIABLE NAME ! 11155: {{MOV{4*VRFNC(R9){R10{{IF OK, LOAD FUNCTION BLOCK POINTER ! 11156: {{BNZ{R7{SOPS2{{JUMP IF OPERATOR OPSYN CASE ! 11157: * ! 11158: * HERE FOR FUNCTION OPSYN (THIRD ARG ZERO) ! 11159: * ! 11160: {{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT ! 11161: {{JSR{GTNVR{{{GET VRBLK POINTER ! 11162: {{ERR{155{OPSYN{{FIRST ARG IS NOT NATURAL VARIABLE NAME ! 11163: * ! 11164: * MERGE HERE TO PERFORM FUNCTION DEFINITION ! 11165: * ! 11166: {SOPS1{JSR{DFFNC{{{CALL FUNCTION DEFINER ! 11167: {{BRN{EXNUL{{{EXIT WITH NULL RESULT ! 11168: * ! 11169: * HERE FOR OPERATOR OPSYN (THIRD ARG NON-ZERO) ! 11170: * ! 11171: {SOPS2{JSR{GTSTG{{{GET OPERATOR NAME ! 11172: {{PPM{SOPS5{{{JUMP IF NOT STRING ! 11173: {{BNE{R6{#NUM01{SOPS5{ERROR IF NOT ONE CHAR LONG ! 11174: {{PLC{R9{{{ELSE POINT TO CHARACTER ! 11175: {{LCH{R8{(R9){{LOAD CHARACTER NAME ! 11176: {{EJC{{{{ ! 11177: * ! 11178: * OPSYN (CONTINUED) ! 11179: * ! 11180: * NOW SET TO SEARCH FOR MATCHING UNARY OR BINARY OPERATOR ! 11181: * NAME AS APPROPRIATE. NOTE THAT THERE ARE =OPBUN UNDEFINED ! 11182: * BINARY OPERATORS AND =OPUUN UNDEFINED UNARY OPERATORS. ! 11183: * ! 11184: {{MOV{#R$UUB{R6{{POINT TO UNOP POINTERS IN CASE ! 11185: {{MOV{#OPNSU{R9{{POINT TO NAMES OF UNARY OPERATORS ! 11186: {{ADD{#OPBUN{R7{{ADD NO. OF UNDEFINED BINARY OPS ! 11187: {{BEQ{R7{#OPUUN{SOPS3{JUMP IF UNOP (THIRD ARG WAS 1) ! 11188: {{MOV{#R$UBA{R6{{ELSE POINT TO BINARY OPERATOR PTRS ! 11189: {{MOV{#OPSNB{R9{{POINT TO NAMES OF BINARY OPERATORS ! 11190: {{MOV{#OPBUN{R7{{SET NUMBER OF UNDEFINED BINOPS ! 11191: * ! 11192: * MERGE HERE TO CHECK LIST (WB = NUMBER TO CHECK) ! 11193: * ! 11194: {SOPS3{LCT{R7{R7{{SET COUNTER TO CONTROL LOOP ! 11195: * ! 11196: * LOOP TO SEARCH FOR NAME MATCH ! 11197: * ! 11198: {SOPS4{BEQ{R8{(R9){SOPS6{JUMP IF NAMES MATCH ! 11199: {{ICA{R6{{{ELSE PUSH POINTER TO FUNCTION PTR ! 11200: {{ICA{R9{{{BUMP POINTER ! 11201: {{BCT{R7{SOPS4{{LOOP BACK TILL ALL CHECKED ! 11202: * ! 11203: * HERE IF BAD OPERATOR NAME ! 11204: * ! 11205: {SOPS5{ERB{156{OPSYN{{FIRST ARG IS NOT CORRECT OPERATOR NAME ! 11206: * ! 11207: * COME HERE ON FINDING A MATCH IN THE OPERATOR NAME TABLE ! 11208: * ! 11209: {SOPS6{MOV{R6{R9{{COPY POINTER TO FUNCTION BLOCK PTR ! 11210: {{SUB{#4*VRFNC{R9{{MAKE IT LOOK LIKE DUMMY VRBLK ! 11211: {{BRN{SOPS1{{{MERGE BACK TO DEFINE OPERATOR ! 11212: {{EJC{{{{ ! 11213: * ! 11214: * OUTPUT ! 11215: * ! 11216: {S$OUP{ENT{{{{ENTRY POINT ! 11217: {{MOV{#NUM03{R7{{OUTPUT FLAG ! 11218: {{JSR{IOPUT{{{CALL INPUT/OUTPUT ASSOC. ROUTINE ! 11219: {{ERR{157{OUTPUT{{THIRD ARGUMENT IS NOT A STRING ! 11220: {{ERR{158{INAPPROPRIATE{{SECOND ARGUMENT FOR OUTPUT ! 11221: {{ERR{159{INAPPROPRIATE{{FIRST ARGUMENT FOR OUTPUT ! 11222: {{ERR{160{INAPPROPRIATE{{FILE SPECIFICATION FOR OUTPUT ! 11223: {{PPM{EXFAL{{{FAIL IF FILE DOES NOT EXIST ! 11224: {{ERR{161{OUTPUT{{FILE CANNOT BE WRITTEN TO ! 11225: {{BRN{EXNUL{{{RETURN NULL STRING ! 11226: {{EJC{{{{ ! 11227: * ! 11228: * POS ! 11229: * ! 11230: {S$POS{ENT{{{{ENTRY POINT ! 11231: {{MOV{#P$POS{R7{{SET PCODE FOR INTEGER ARG CASE ! 11232: {{MOV{#P$PSD{R6{{SET PCODE FOR EXPRESSION ARG CASE ! 11233: {{JSR{PATIN{{{CALL COMMON ROUTINE TO BUILD NODE ! 11234: {{ERR{162{POS{{ARGUMENT IS NOT INTEGER OR EXPRESSION ! 11235: {{ERR{163{POS{{ARGUMENT IS NEGATIVE OR TOO LARGE ! 11236: {{BRN{EXIXR{{{RETURN PATTERN NODE ! 11237: {{EJC{{{{ ! 11238: * ! 11239: * PROTOTYPE ! 11240: * ! 11241: {S$PRO{ENT{{{{ENTRY POINT ! 11242: {{MOV{(SP)+{R9{{LOAD ARGUMENT ! 11243: {{MOV{4*TBLEN(R9){R7{{LENGTH IF TABLE, VECTOR (=VCLEN) ! 11244: {{BTW{R7{{{CONVERT TO WORDS ! 11245: {{MOV{(R9){R6{{LOAD TYPE WORD OF ARGUMENT BLOCK ! 11246: {{BEQ{R6{#B$ART{SPRO4{JUMP IF ARRAY ! 11247: {{BEQ{R6{#B$TBT{SPRO1{JUMP IF TABLE ! 11248: {{BEQ{R6{#B$VCT{SPRO3{JUMP IF VECTOR ! 11249: {{BEQ{R6{#B$BCT{SPR05{JUMP IF BUFFER ! 11250: {{ERB{164{PROTOTYPE{{ARGUMENT IS NOT VALID OBJECT ! 11251: * ! 11252: * HERE FOR TABLE ! 11253: * ! 11254: {SPRO1{SUB{#TBSI${R7{{SUBTRACT STANDARD FIELDS ! 11255: * ! 11256: * MERGE FOR VECTOR ! 11257: * ! 11258: {SPRO2{MTI{R7{{{CONVERT TO INTEGER ! 11259: {{BRN{EXINT{{{EXIT WITH INTEGER RESULT ! 11260: * ! 11261: * HERE FOR VECTOR ! 11262: * ! 11263: {SPRO3{SUB{#VCSI${R7{{SUBTRACT STANDARD FIELDS ! 11264: {{BRN{SPRO2{{{MERGE ! 11265: * ! 11266: * HERE FOR ARRAY ! 11267: * ! 11268: {SPRO4{ADD{4*AROFS(R9){R9{{POINT TO PROTOTYPE FIELD ! 11269: {{MOV{(R9){R9{{LOAD PROTOTYPE ! 11270: {{BRN{EXIXR{{{RETURN PROTOTYPE AS RESULT ! 11271: * ! 11272: * HERE FOR BUFFER ! 11273: * ! 11274: {SPR05{MOV{4*BCBUF(R9){R9{{POINT TO BFBLK ! 11275: {{MTI{4*BFALC(R9){{{LOAD ALLOCATED LENGTH ! 11276: {{BRN{EXINT{{{EXIT WITH INTEGER ALLOCATION ! 11277: {{EJC{{{{ ! 11278: * ! 11279: * REMDR ! 11280: * ! 11281: {S$RMD{ENT{{{{ENTRY POINT ! 11282: {{ZER{R7{{{SET POSITIVE FLAG ! 11283: {{MOV{(SP){R9{{LOAD SECOND ARGUMENT ! 11284: {{JSR{GTINT{{{CONVERT TO INTEGER ! 11285: {{ERR{165{REMDR{{SECOND ARGUMENT IS NOT INTEGER ! 11286: {{JSR{ARITH{{{CONVERT ARGS ! 11287: {{PPM{SRM01{{{FIRST ARG NOT INTEGER ! 11288: {{PPM{{{{SECOND ARG CHECKED ABOVE ! 11289: {{PPM{SRM01{{{FIRST ARG REAL ! 11290: {{LDI{4*ICVAL(R9){{{LOAD LEFT ARGUMENT VALUE ! 11291: {{RMI{4*ICVAL(R10){{{GET REMAINDER ! 11292: {{INO{EXINT{{{JUMP IF NO OVERFLOW ! 11293: {{ERB{167{REMDR{{CAUSED INTEGER OVERFLOW ! 11294: * ! 11295: * FAIL FIRST ARGUMENT ! 11296: * ! 11297: {SRM01{ERB{166{REMDR{{FIRST ARGUMENT IS NOT INTEGER ! 11298: {{EJC{{{{ ! 11299: * ! 11300: * REPLACE ! 11301: * ! 11302: * THE ACTUAL REPLACE OPERATION USES AN SCBLK WHOSE CFP$A ! 11303: * CHARS CONTAIN THE TRANSLATED VERSIONS OF ALL THE CHARS. ! 11304: * THE TABLE POINTER IS REMEMBERED FROM CALL TO CALL AND ! 11305: * THE TABLE IS ONLY BUILT WHEN THE ARGUMENTS CHANGE. ! 11306: * ! 11307: {S$RPL{ENT{{{{ENTRY POINT ! 11308: {{JSR{GTSTG{{{LOAD THIRD ARGUMENT AS STRING ! 11309: {{ERR{168{REPLACE{{THIRD ARGUMENT IS NOT STRING ! 11310: {{MOV{R9{R10{{SAVE THIRD ARG PTR ! 11311: {{JSR{GTSTG{{{GET SECOND ARGUMENT ! 11312: {{ERR{169{REPLACE{{SECOND ARGUMENT IS NOT STRING ! 11313: * ! 11314: * CHECK TO SEE IF THIS IS THE SAME TABLE AS LAST TIME ! 11315: * ! 11316: {{BNE{R9{R$RA2{SRPL1{JUMP IF 2ND ARGUMENT DIFFERENT ! 11317: {{BEQ{R10{R$RA3{SRPL4{JUMP IF ARGS SAME AS LAST TIME ! 11318: * ! 11319: * HERE WE BUILD A NEW REPLACE TABLE (NOTE WA = 2ND ARG LEN) ! 11320: * ! 11321: {SRPL1{MOV{4*SCLEN(R10){R7{{LOAD 3RD ARGUMENT LENGTH ! 11322: {{BNE{R6{R7{SRPL5{JUMP IF ARGUMENTS NOT SAME LENGTH ! 11323: {{BZE{R7{SRPL5{{JUMP IF NULL 2ND ARGUMENT ! 11324: {{MOV{R10{R$RA3{{SAVE THIRD ARG FOR NEXT TIME IN ! 11325: {{MOV{R9{R$RA2{{SAVE SECOND ARG FOR NEXT TIME IN ! 11326: {{MOV{KVALP{R10{{POINT TO ALPHABET STRING ! 11327: {{MOV{4*SCLEN(R10){R6{{LOAD ALPHABET SCBLK LENGTH ! 11328: {{MOV{R$RPT{R9{{POINT TO CURRENT TABLE (IF ANY) ! 11329: {{BNZ{R9{SRPL2{{JUMP IF WE ALREADY HAVE A TABLE ! 11330: * ! 11331: * HERE WE ALLOCATE A NEW TABLE ! 11332: * ! 11333: {{JSR{ALOCS{{{ALLOCATE NEW TABLE ! 11334: {{MOV{R8{R6{{KEEP SCBLK LENGTH ! 11335: {{MOV{R9{R$RPT{{SAVE TABLE POINTER FOR NEXT TIME ! 11336: * ! 11337: * MERGE HERE WITH POINTER TO NEW TABLE BLOCK IN (XR) ! 11338: * ! 11339: {SRPL2{CTB{R6{SCSI${{COMPUTE LENGTH OF SCBLK ! 11340: {{MVW{{{{COPY TO GET INITIAL TABLE VALUES ! 11341: {{EJC{{{{ ! 11342: * ! 11343: * REPLACE (CONTINUED) ! 11344: * ! 11345: * NOW WE MUST PLUG SELECTED ENTRIES AS REQUIRED. NOTE THAT ! 11346: * WE ARE SHORT OF INDEX REGISTERS FOR THE FOLLOWING LOOP. ! 11347: * HENCE THE NEED TO REPEATEDLY RE-INITIALISE CHAR PTR XL ! 11348: * ! 11349: {{MOV{R$RA2{R10{{POINT TO SECOND ARGUMENT ! 11350: {{LCT{R7{R7{{NUMBER OF CHARS TO PLUG ! 11351: {{ZER{R8{{{ZERO CHAR OFFSET ! 11352: {{MOV{R$RA3{R9{{POINT TO 3RD ARG ! 11353: {{PLC{R9{{{GET CHAR PTR FOR 3RD ARG ! 11354: * ! 11355: * LOOP TO PLUG CHARS ! 11356: * ! 11357: {SRPL3{MOV{R$RA2{R10{{POINT TO 2ND ARG ! 11358: {{PLC{R10{R8{{POINT TO NEXT CHAR ! 11359: {{ICV{R8{{{INCREMENT OFFSET ! 11360: {{LCH{R6{(R10){{GET NEXT CHAR ! 11361: {{MOV{R$RPT{R10{{POINT TO TRANSLATE TABLE ! 11362: {{PSC{R10{R6{{CONVERT CHAR TO OFFSET INTO TABLE ! 11363: {{LCH{R6{(R9)+{{GET TRANSLATED CHAR ! 11364: {{SCH{R6{(R10){{STORE IN TABLE ! 11365: {{CSC{R10{{{COMPLETE STORE CHARACTERS ! 11366: {{BCT{R7{SRPL3{{LOOP TILL DONE ! 11367: {{EJC{{{{ ! 11368: * ! 11369: * REPLACE (CONTINUED) ! 11370: * ! 11371: * HERE TO PERFORM TRANSLATE ! 11372: * ! 11373: {SRPL4{JSR{GTSTG{{{GET FIRST ARGUMENT ! 11374: {{ERR{170{REPLACE{{FIRST ARGUMENT IS NOT STRING ! 11375: {{BZE{R6{EXNUL{{RETURN NULL IF NULL ARGUMENT ! 11376: {{MOV{R9{R10{{COPY POINTER ! 11377: {{MOV{R6{R8{{SAVE LENGTH ! 11378: {{CTB{R6{SCHAR{{GET SCBLK LENGTH ! 11379: {{JSR{ALLOC{{{ALLOCATE SPACE FOR COPY ! 11380: {{MOV{R9{R7{{SAVE ADDRESS OF COPY ! 11381: {{MVW{{{{MOVE SCBLK CONTENTS TO COPY ! 11382: {{MOV{R$RPT{R9{{POINT TO REPLACE TABLE ! 11383: {{PLC{R9{{{POINT TO CHARS OF TABLE ! 11384: {{MOV{R7{R10{{POINT TO STRING TO TRANSLATE ! 11385: {{PLC{R10{{{POINT TO CHARS OF STRING ! 11386: {{MOV{R8{R6{{SET NUMBER OF CHARS TO TRANSLATE ! 11387: {{TRC{{{{PERFORM TRANSLATION ! 11388: {{MOV{R7{-(SP){{STACK NEW STRING AS RESULT ! 11389: {{BRN{EXITS{{{RETURN WITH RESULT ON STACK ! 11390: * ! 11391: * ERROR POINT ! 11392: * ! 11393: {SRPL5{ERB{171{NULL{{OR UNEQUALLY LONG 2ND, 3RD ARGS TO REPLACE ! 11394: {{EJC{{{{ ! 11395: * ! 11396: * REWIND ! 11397: * ! 11398: {S$REW{ENT{{{{ENTRY POINT ! 11399: {{JSR{IOFCB{{{CALL FCBLK ROUTINE ! 11400: {{ERR{172{REWIND{{ARGUMENT IS NOT A SUITABLE NAME ! 11401: {{ERR{173{REWIND{{ARGUMENT IS NULL ! 11402: {{JSR{SYSRW{{{CALL SYSTEM REWIND FUNCTION ! 11403: {{ERR{174{REWIND{{FILE DOES NOT EXIST ! 11404: {{ERR{175{REWIND{{FILE DOES NOT PERMIT REWIND ! 11405: {{ERR{176{REWIND{{CAUSED NON-RECOVERABLE ERROR ! 11406: {{BRN{EXNUL{{{EXIT WITH NULL RESULT IF NO ERROR ! 11407: {{EJC{{{{ ! 11408: * ! 11409: * REVERSE ! 11410: * ! 11411: {S$RVS{ENT{{{{ENTRY POINT ! 11412: {{JSR{GTSTG{{{LOAD STRING ARGUMENT ! 11413: {{ERR{177{REVERSE{{ARGUMENT IS NOT STRING ! 11414: {{BZE{R6{EXIXR{{RETURN ARGUMENT IF NULL ! 11415: {{MOV{R9{R10{{ELSE SAVE POINTER TO STRING ARG ! 11416: {{JSR{ALOCS{{{ALLOCATE SPACE FOR NEW SCBLK ! 11417: {{MOV{R9{-(SP){{STORE SCBLK PTR ON STACK AS RESULT ! 11418: {{PSC{R9{{{PREPARE TO STORE IN NEW SCBLK ! 11419: {{PLC{R10{R8{{POINT PAST LAST CHAR IN ARGUMENT ! 11420: {{LCT{R8{R8{{SET LOOP COUNTER ! 11421: * ! 11422: * LOOP TO MOVE CHARS IN REVERSE ORDER ! 11423: * ! 11424: {SRVS1{LCH{R7{-(R10){{LOAD NEXT CHAR FROM ARGUMENT ! 11425: {{SCH{R7{(R9)+{{STORE IN RESULT ! 11426: {{BCT{R8{SRVS1{{LOOP TILL ALL MOVED ! 11427: {{CSC{R9{{{COMPLETE STORE CHARACTERS ! 11428: {{BRN{EXITS{{{AND THEN JUMP FOR NEXT CODE WORD ! 11429: {{EJC{{{{ ! 11430: * ! 11431: * RPAD ! 11432: * ! 11433: {S$RPD{ENT{{{{ENTRY POINT ! 11434: {{JSR{GTSTG{{{GET PAD CHARACTER ! 11435: {{ERR{178{RPAD{{THIRD ARGUMENT IS NOT STRING ! 11436: {{PLC{R9{{{POINT TO CHARACTER (NULL IS BLANK) ! 11437: {{LCH{R7{(R9){{LOAD PAD CHARACTER ! 11438: {{JSR{GTSMI{{{GET PAD LENGTH ! 11439: {{ERR{179{RPAD{{SECOND ARGUMENT IS NOT INTEGER ! 11440: {{PPM{SRPD3{{{SKIP IF NEGATIVE OR LARGE ! 11441: * ! 11442: * MERGE TO CHECK FIRST ARG. ! 11443: * ! 11444: {SRPD1{JSR{GTSTG{{{GET FIRST ARGUMENT (STRING TO PAD) ! 11445: {{ERR{180{RPAD{{FIRST ARGUMENT IS NOT STRING ! 11446: {{BGE{R6{R8{EXIXR{RETURN 1ST ARG IF TOO LONG TO PAD ! 11447: {{MOV{R9{R10{{ELSE MOVE PTR TO STRING TO PAD ! 11448: * ! 11449: * NOW WE ARE READY FOR THE PAD ! 11450: * ! 11451: * (XL) POINTER TO STRING TO PAD ! 11452: * (WB) PAD CHARACTER ! 11453: * (WC) LENGTH TO PAD STRING TO ! 11454: * ! 11455: {{MOV{R8{R6{{COPY LENGTH ! 11456: {{JSR{ALOCS{{{ALLOCATE SCBLK FOR NEW STRING ! 11457: {{MOV{R9{-(SP){{SAVE AS RESULT ! 11458: {{MOV{4*SCLEN(R10){R6{{LOAD LENGTH OF ARGUMENT ! 11459: {{SUB{R6{R8{{CALCULATE NUMBER OF PAD CHARACTERS ! 11460: {{PSC{R9{{{POINT TO CHARS IN RESULT STRING ! 11461: {{LCT{R8{R8{{SET COUNTER FOR PAD LOOP ! 11462: * ! 11463: * COPY ARGUMENT STRING ! 11464: * ! 11465: {{BZE{R6{SRPD2{{JUMP IF ARGUMENT IS NULL ! 11466: {{PLC{R10{{{ELSE POINT TO ARGUMENT CHARS ! 11467: {{MVC{{{{MOVE CHARACTERS TO RESULT STRING ! 11468: * ! 11469: * LOOP TO SUPPLY PAD CHARACTERS ! 11470: * ! 11471: {SRPD2{SCH{R7{(R9)+{{STORE PAD CHARACTER, BUMP PTR ! 11472: {{BCT{R8{SRPD2{{LOOP TILL ALL PAD CHARS STORED ! 11473: {{CSC{R9{{{COMPLETE CHARACTER STORING ! 11474: {{BRN{EXITS{{{AND EXIT FOR NEXT WORD ! 11475: * ! 11476: * HERE IF 2ND ARG IS NEGATIVE OR LARGE ! 11477: * ! 11478: {SRPD3{ZER{R8{{{ZERO PAD COUNT ! 11479: {{BRN{SRPD1{{{MERGE ! 11480: {{EJC{{{{ ! 11481: * ! 11482: * RTAB ! 11483: * ! 11484: {S$RTB{ENT{{{{ENTRY POINT ! 11485: {{MOV{#P$RTB{R7{{SET PCODE FOR INTEGER ARG CASE ! 11486: {{MOV{#P$RTD{R6{{SET PCODE FOR EXPRESSION ARG CASE ! 11487: {{JSR{PATIN{{{CALL COMMON ROUTINE TO BUILD NODE ! 11488: {{ERR{181{RTAB{{ARGUMENT IS NOT INTEGER OR EXPRESSION ! 11489: {{ERR{182{RTAB{{ARGUMENT IS NEGATIVE OR TOO LARGE ! 11490: {{BRN{EXIXR{{{RETURN PATTERN NODE ! 11491: {{EJC{{{{ ! 11492: * ! 11493: * SET ! 11494: * ! 11495: {S$SET{ENT{{{{ENTRY POINT ! 11496: {{MOV{(SP)+{R$IO2{{SAVE THIRD ARG ! 11497: {{MOV{(SP)+{R$IO1{{SAVE SECOND ARG ! 11498: {{JSR{IOFCB{{{CALL FCBLK ROUTINE ! 11499: {{ERR{291{SET{{FIRST ARGUMENT IS NOT A SUITABLE NAME ! 11500: {{ERR{292{SET{{FIRST ARGUMENT IS NULL ! 11501: {{MOV{R$IO1{R7{{LOAD SECOND ARG ! 11502: {{MOV{R$IO2{R8{{LOAD THIRD ARG ! 11503: {{JSR{SYSST{{{CALL SYSTEM SET ROUTINE ! 11504: {{ERR{293{INAPPROPRIATE{{SECOND ARGUMENT TO SET ! 11505: {{ERR{294{INAPPROPRIATE{{THIRD ARGUMENT TO SET ! 11506: {{ERR{295{SET{{FILE DOES NOT EXIST ! 11507: {{ERR{296{SET{{FILE DOES NOT PERMIT SETTING FILE POINTER ! 11508: {{ERR{297{SET{{CAUSED NON-RECOVERABLE I/O ERROR ! 11509: {{BRN{EXNUL{{{OTHERWISEW RETURN NULL ! 11510: {{EJC{{{{ ! 11511: * ! 11512: * TAB ! 11513: * ! 11514: {S$TAB{ENT{{{{ENTRY POINT ! 11515: {{MOV{#P$TAB{R7{{SET PCODE FOR INTEGER ARG CASE ! 11516: {{MOV{#P$TBD{R6{{SET PCODE FOR EXPRESSION ARG CASE ! 11517: {{JSR{PATIN{{{CALL COMMON ROUTINE TO BUILD NODE ! 11518: {{ERR{183{TAB{{ARGUMENT IS NOT INTEGER OR EXPRESSION ! 11519: {{ERR{184{TAB{{ARGUMENT IS NEGATIVE OR TOO LARGE ! 11520: {{BRN{EXIXR{{{RETURN PATTERN NODE ! 11521: {{EJC{{{{ ! 11522: * ! 11523: * RPOS ! 11524: * ! 11525: {S$RPS{ENT{{{{ENTRY POINT ! 11526: {{MOV{#P$RPS{R7{{SET PCODE FOR INTEGER ARG CASE ! 11527: {{MOV{#P$RPD{R6{{SET PCODE FOR EXPRESSION ARG CASE ! 11528: {{JSR{PATIN{{{CALL COMMON ROUTINE TO BUILD NODE ! 11529: {{ERR{185{RPOS{{ARGUMENT IS NOT INTEGER OR EXPRESSION ! 11530: {{ERR{186{RPOS{{ARGUMENT IS NEGATIVE OR TOO LARGE ! 11531: {{BRN{EXIXR{{{RETURN PATTERN NODE ! 11532: {{EJC{{{{ ! 11533: * ! 11534: * RSORT ! 11535: * ! 11536: {S$RSR{ENT{{{{ENTRY POINT ! 11537: {{MNZ{R6{{{MARK AS RSORT ! 11538: {{JSR{SORTA{{{CALL SORT ROUTINE ! 11539: {{BRN{EXSID{{{RETURN, SETTING IDVAL ! 11540: {{EJC{{{{ ! 11541: * ! 11542: * SETEXIT ! 11543: * ! 11544: {S$STX{ENT{{{{ENTRY POINT ! 11545: {{MOV{(SP)+{R9{{LOAD ARGUMENT ! 11546: {{MOV{STXVR{R6{{LOAD OLD VRBLK POINTER ! 11547: {{ZER{R10{{{LOAD ZERO IN CASE NULL ARG ! 11548: {{BEQ{R9{#NULLS{SSTX1{JUMP IF NULL ARGUMENT (RESET CALL) ! 11549: {{JSR{GTNVR{{{ELSE GET SPECIFIED VRBLK ! 11550: {{PPM{SSTX2{{{JUMP IF NOT NATURAL VARIABLE ! 11551: {{MOV{4*VRLBL(R9){R10{{ELSE LOAD LABEL ! 11552: {{BEQ{R10{#STNDL{SSTX2{JUMP IF LABEL IS NOT DEFINED ! 11553: {{BNE{(R10){#B$TRT{SSTX1{JUMP IF NOT TRAPPED ! 11554: {{MOV{4*TRLBL(R10){R10{{ELSE LOAD PTR TO REAL LABEL CODE ! 11555: * ! 11556: * HERE TO SET/RESET SETEXIT TRAP ! 11557: * ! 11558: {SSTX1{MOV{R9{STXVR{{STORE NEW VRBLK POINTER (OR NULL) ! 11559: {{MOV{R10{R$SXC{{STORE NEW CODE PTR (OR ZERO) ! 11560: {{BEQ{R6{#NULLS{EXNUL{RETURN NULL IF NULL RESULT ! 11561: {{MOV{R6{R9{{ELSE COPY VRBLK POINTER ! 11562: {{BRN{EXVNM{{{AND RETURN BUILDING NMBLK ! 11563: * ! 11564: * HERE IF BAD ARGUMENT ! 11565: * ! 11566: {SSTX2{ERB{187{SETEXIT{{ARGUMENT IS NOT LABEL NAME OR NULL ! 11567: {{EJC{{{{ ! 11568: * ! 11569: * SORT ! 11570: * ! 11571: {S$SRT{ENT{{{{ENTRY POINT ! 11572: {{ZER{R6{{{MARK AS SORT ! 11573: {{JSR{SORTA{{{CALL SORT ROUTINE ! 11574: {{BRN{EXSID{{{RETURN, SETTING IDVAL ! 11575: {{EJC{{{{ ! 11576: * ! 11577: * SPAN ! 11578: * ! 11579: {S$SPN{ENT{{{{ENTRY POINT ! 11580: {{MOV{#P$SPS{R7{{SET PCODE FOR SINGLE CHAR ARG ! 11581: {{MOV{#P$SPN{R10{{SET PCODE FOR MULTI-CHAR ARG ! 11582: {{MOV{#P$SPD{R8{{SET PCODE FOR EXPRESSION ARG ! 11583: {{JSR{PATST{{{CALL COMMON ROUTINE TO BUILD NODE ! 11584: {{ERR{188{SPAN{{ARGUMENT IS NOT STRING OR EXPRESSION ! 11585: {{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD ! 11586: {{EJC{{{{ ! 11587: * ! 11588: * SIZE ! 11589: * ! 11590: {S$SI${ENT{{{{ENTRY POINT ! 11591: {{MOV{(SP){R9{{LOAD ARGUMENT ! 11592: {{BNE{(R9){#B$BCT{SSI$1{BRANCH IF NOT BUFFER ! 11593: {{ICA{SP{{{ELSE POP ARGUMENT ! 11594: {{MTI{4*BCLEN(R9){{{LOAD DEFINED LENGTH ! 11595: {{BRN{EXINT{{{EXIT WITH INTEGER ! 11596: * ! 11597: * HERE IF NOT BUFFER ! 11598: * ! 11599: {SSI$1{JSR{GTSTG{{{LOAD STRING ARGUMENT ! 11600: {{ERR{189{SIZE{{ARGUMENT IS NOT STRING ! 11601: {{MTI{R6{{{LOAD LENGTH AS INTEGER ! 11602: {{BRN{EXINT{{{EXIT WITH INTEGER RESULT ! 11603: {{EJC{{{{ ! 11604: * ! 11605: * STOPTR ! 11606: * ! 11607: {S$STT{ENT{{{{ENTRY POINT ! 11608: {{ZER{R10{{{INDICATE STOPTR CASE ! 11609: {{JSR{TRACE{{{CALL TRACE PROCEDURE ! 11610: {{ERR{190{STOPTR{{FIRST ARGUMENT IS NOT APPROPRIATE NAME ! 11611: {{ERR{191{STOPTR{{SECOND ARGUMENT IS NOT TRACE TYPE ! 11612: {{BRN{EXNUL{{{RETURN NULL ! 11613: {{EJC{{{{ ! 11614: * ! 11615: * SUBSTR ! 11616: * ! 11617: {S$SUB{ENT{{{{ENTRY POINT ! 11618: {{JSR{GTSMI{{{LOAD THIRD ARGUMENT ! 11619: {{ERR{192{SUBSTR{{THIRD ARGUMENT IS NOT INTEGER ! 11620: {{PPM{EXFAL{{{JUMP IF NEGATIVE OR TOO LARGE ! 11621: {{MOV{R9{SBSSV{{SAVE THIRD ARGUMENT ! 11622: {{JSR{GTSMI{{{LOAD SECOND ARGUMENT ! 11623: {{ERR{193{SUBSTR{{SECOND ARGUMENT IS NOT INTEGER ! 11624: {{PPM{EXFAL{{{JUMP IF OUT OF RANGE ! 11625: {{MOV{R9{R7{{SAVE SECOND ARGUMENT ! 11626: {{BZE{R7{EXFAL{{JUMP IF SECOND ARGUMENT ZERO ! 11627: {{DCV{R7{{{ELSE DECREMENT FOR ONES ORIGIN ! 11628: {{MOV{(SP){R10{{GET FIRST ARG PTR ! 11629: {{BNE{(R10){#B$BCT{SSUBA{BRANCH IF NOT BUFFER ! 11630: {{MOV{4*BCBUF(R10){R9{{GET BFBLK PTR ! 11631: {{MOV{4*BCLEN(R10){R6{{GET LENGTH ! 11632: {{BRN{SSUBB{{{MERGE ! 11633: * ! 11634: * HERE IF NOT BUFFER TO GET STRING ! 11635: * ! 11636: {SSUBA{JSR{GTSTG{{{LOAD FIRST ARGUMENT ! 11637: {{ERR{194{SUBSTR{{FIRST ARGUMENT IS NOT STRING ! 11638: * ! 11639: * MERGE WITH BFBLK OR SCBLK PTR IN XR. WA HAS LENGTH ! 11640: * ! 11641: {SSUBB{MOV{SBSSV{R8{{RELOAD THIRD ARGUMENT ! 11642: {{BNZ{R8{SSUB1{{SKIP IF THIRD ARG GIVEN ! 11643: {{MOV{R6{R8{{ELSE GET STRING LENGTH ! 11644: {{BGT{R7{R8{EXFAL{FAIL IF IMPROPER ! 11645: {{SUB{R7{R8{{REDUCE BY OFFSET TO START ! 11646: * ! 11647: * MERGE ! 11648: * ! 11649: {SSUB1{MOV{R6{R10{{SAVE STRING LENGTH ! 11650: {{MOV{R8{R6{{SET LENGTH OF SUBSTRING ! 11651: {{ADD{R7{R8{{ADD 2ND ARG TO 3RD ARG ! 11652: {{BGT{R8{R10{EXFAL{JUMP IF IMPROPER SUBSTRING ! 11653: {{MOV{R9{R10{{COPY POINTER TO FIRST ARG ! 11654: {{JSR{SBSTR{{{BUILD SUBSTRING ! 11655: {{BRN{EXIXR{{{AND JUMP FOR NEXT CODE WORD ! 11656: {{EJC{{{{ ! 11657: * ! 11658: * TABLE ! 11659: * ! 11660: {S$TBL{ENT{{{{ENTRY POINT ! 11661: {{MOV{(SP)+{R10{{GET INITIAL LOOKUP VALUE ! 11662: {{ICA{SP{{{POP SECOND ARGUMENT ! 11663: {{JSR{GTSMI{{{LOAD ARGUMENT ! 11664: {{ERR{195{TABLE{{ARGUMENT IS NOT INTEGER ! 11665: {{ERR{196{TABLE{{ARGUMENT IS OUT OF RANGE ! 11666: {{BNZ{R8{STBL1{{JUMP IF NON-ZERO ! 11667: {{MOV{#TBNBK{R8{{ELSE SUPPLY DEFAULT VALUE ! 11668: * ! 11669: * MERGE HERE WITH NUMBER OF HEADERS IN WA ! 11670: * ! 11671: {STBL1{MOV{R8{R6{{COPY NUMBER OF HEADERS ! 11672: {{ADD{#TBSI${R6{{ADJUST FOR STANDARD FIELDS ! 11673: {{WTB{R6{{{CONVERT LENGTH TO BYTES ! 11674: {{JSR{ALLOC{{{ALLOCATE SPACE FOR TBBLK ! 11675: {{MOV{R9{R7{{COPY POINTER TO TBBLK ! 11676: {{MOV{#B$TBT{(R9)+{{STORE TYPE WORD ! 11677: {{ZER{(R9)+{{{ZERO ID FOR THE MOMENT ! 11678: {{MOV{R6{(R9)+{{STORE LENGTH (TBLEN) ! 11679: {{MOV{R10{(R9)+{{STORE INITIAL LOOKUP VALUE ! 11680: {{LCT{R8{R8{{SET LOOP COUNTER (NUM HEADERS) ! 11681: * ! 11682: * LOOP TO INITIALIZE ALL BUCKET POINTERS ! 11683: * ! 11684: {STBL2{MOV{R7{(R9)+{{STORE TBBLK PTR IN BUCKET HEADER ! 11685: {{BCT{R8{STBL2{{LOOP TILL ALL STORED ! 11686: {{MOV{R7{R9{{RECALL POINTER TO TBBLK ! 11687: {{BRN{EXSID{{{EXIT SETTING IDVAL ! 11688: {{EJC{{{{ ! 11689: * ! 11690: * TIME ! 11691: * ! 11692: {S$TIM{ENT{{{{ENTRY POINT ! 11693: {{JSR{SYSTM{{{GET TIMER VALUE ! 11694: {{SBI{TIMSX{{{SUBTRACT STARTING TIME ! 11695: {{BRN{EXINT{{{EXIT WITH INTEGER VALUE ! 11696: {{EJC{{{{ ! 11697: * ! 11698: * TRACE ! 11699: * ! 11700: {S$TRA{ENT{{{{ENTRY POINT ! 11701: {{BEQ{4*3(SP){#NULLS{STR03{JUMP IF FIRST ARGUMENT IS NULL ! 11702: {{MOV{(SP)+{R9{{LOAD FOURTH ARGUMENT ! 11703: {{ZER{R10{{{TENTATIVELY SET ZERO POINTER ! 11704: {{BEQ{R9{#NULLS{STR02{JUMP IF 4TH ARGUMENT IS NULL ! 11705: {{JSR{GTNVR{{{ELSE POINT TO VRBLK ! 11706: {{PPM{STR01{{{JUMP IF NOT VARIABLE NAME ! 11707: {{MOV{4*VRFNC(R9){R10{{ELSE LOAD FUNCTION POINTER ! 11708: {{BNE{R10{#STNDF{STR02{JUMP IF FUNCTION IS DEFINED ! 11709: * ! 11710: * HERE FOR BAD FOURTH ARGUMENT ! 11711: * ! 11712: {STR01{ERB{197{TRACE{{FOURTH ARG IS NOT FUNCTION NAME OR NULL ! 11713: * ! 11714: * HERE WITH FUNCTION POINTER IN XL ! 11715: * ! 11716: {STR02{MOV{(SP)+{R9{{LOAD THIRD ARGUMENT (TAG) ! 11717: {{ZER{R7{{{SET ZERO AS TRTYP VALUE FOR NOW ! 11718: {{JSR{TRBLD{{{BUILD TRBLK FOR TRACE CALL ! 11719: {{MOV{R9{R10{{MOVE TRBLK POINTER FOR TRACE ! 11720: {{JSR{TRACE{{{CALL TRACE PROCEDURE ! 11721: {{ERR{198{TRACE{{FIRST ARGUMENT IS NOT APPROPRIATE NAME ! 11722: {{ERR{199{TRACE{{SECOND ARGUMENT IS NOT TRACE TYPE ! 11723: {{BRN{EXNUL{{{RETURN NULL ! 11724: * ! 11725: * HERE TO CALL SYSTEM TRACE TOGGLE ROUTINE ! 11726: * ! 11727: {STR03{JSR{SYSTT{{{CALL IT ! 11728: {{ADD{#4*NUM04{SP{{POP TRACE ARGUMENTS ! 11729: {{BRN{EXNUL{{{RETURN ! 11730: {{EJC{{{{ ! 11731: * ! 11732: * TRIM ! 11733: * ! 11734: {S$TRM{ENT{{{{ENTRY POINT ! 11735: {{JSR{GTSTG{{{LOAD ARGUMENT AS STRING ! 11736: {{ERR{200{TRIM{{ARGUMENT IS NOT STRING ! 11737: {{BZE{R6{EXNUL{{RETURN NULL IF ARGUMENT IS NULL ! 11738: {{MOV{R9{R10{{COPY STRING POINTER ! 11739: {{CTB{R6{SCHAR{{GET BLOCK LENGTH ! 11740: {{JSR{ALLOC{{{ALLOCATE COPY SAME SIZE ! 11741: {{MOV{R9{R7{{SAVE POINTER TO COPY ! 11742: {{MVW{{{{COPY OLD STRING BLOCK TO NEW ! 11743: {{MOV{R7{R9{{RESTORE PTR TO NEW BLOCK ! 11744: {{JSR{TRIMR{{{TRIM BLANKS (WB IS NON-ZERO) ! 11745: {{BRN{EXIXR{{{EXIT WITH RESULT IN XR ! 11746: {{EJC{{{{ ! 11747: * ! 11748: * UNLOAD ! 11749: * ! 11750: {S$UNL{ENT{{{{ENTRY POINT ! 11751: {{MOV{(SP)+{R9{{LOAD ARGUMENT ! 11752: {{JSR{GTNVR{{{POINT TO VRBLK ! 11753: {{ERR{201{UNLOAD{{ARGUMENT IS NOT NATURAL VARIABLE NAME ! 11754: {{MOV{#STNDF{R10{{GET PTR TO UNDEFINED FUNCTION ! 11755: {{JSR{DFFNC{{{UNDEFINE NAMED FUNCTION ! 11756: {{BRN{EXNUL{{{RETURN NULL AS RESULT ! 11757: {{TTL{S{{{P I T B O L -- UTILITY PROCEDURES ! 11758: * ! 11759: * THE FOLLOWING SECTION CONTAINS PROCEDURES WHICH ARE ! 11760: * USED FOR VARIOUS PURPOSES THROUGHOUT THE SYSTEM. ! 11761: * ! 11762: * EACH PROCEDURE IS PRECEDED BY A DESCRIPTION OF THE ! 11763: * CALLING SEQUENCE. USUALLY THE ARGUMENTS ARE IN REGISTERS ! 11764: * BUT ARGUMENTS CAN ALSO OCCUR ON THE STACK AND AS ! 11765: * PARAMETERS ASSEMBLED AFTER THE JSR INSTRUCTION. ! 11766: * ! 11767: * THE FOLLOWING CONSIDERATIONS APPLY TO THESE DESCRIPTIONS. ! 11768: * ! 11769: * 1) THE STACK POINTER (XS) IS NOT CHANGED UNLESS THE ! 11770: * CHANGE IS EXPLICITLY DOCUMENTED IN THE CALL. ! 11771: * ! 11772: * 2) REGISTERS WHOSE ENTRY VALUES ARE NOT MENTIONED ! 11773: * MAY CONTAIN ANY VALUE EXCEPT THAT XL,XR MAY ONLY ! 11774: * CONTAIN PROPER (COLLECTABLE) POINTER VALUES. ! 11775: * THIS CONDITION ON XR MEANS THAT THE CALLED ROUTINE ! 11776: * MAY IF IT CHOOSES PRESERVE XR BY STACKING. ! 11777: * ! 11778: * 3) REGISTERS NOT MENTIONED ON EXIT CONTAIN THE SAME ! 11779: * VALUES AS THEY DID ON ENTRY EXCEPT THAT VALUES IN ! 11780: * XR,XL MAY HAVE BEEN RELOCATED BY THE COLLECTOR. ! 11781: * ! 11782: * 4) REGISTERS WHICH ARE DESTROYED ON EXIT MAY CONTAIN ! 11783: * ANY VALUE EXCEPT THAT VALUES IN XL,XR ARE PROPER ! 11784: * (COLLECTABLE) POINTERS. ! 11785: * ! 11786: * 5) THE CODE POINTER REGISTER POINTS TO THE CURRENT ! 11787: * CODE LOCATION ON ENTRY AND IS UNCHANGED ON EXIT. ! 11788: * ! 11789: * IN THE ABOVE DESCRIPTION, A COLLECTABLE POINTER IS ONE ! 11790: * WHICH EITHER POINTS OUTSIDE THE DYNAMIC REGION OR ! 11791: * POINTS TO THE START OF A BLOCK IN THE DYNAMIC REGION. ! 11792: * ! 11793: * IN THOSE CASES WHERE THE CALLING SEQUENCE CONTAINS ! 11794: * PARAMETERS WHICH ARE USED AS ALTERNATE RETURN POINTS, ! 11795: * THESE PARAMETERS MAY BE REPLACED BY ERROR CODES ! 11796: * ASSEMBLED WITH THE ERR INSTRUCTION. THIS WILL RESULT ! 11797: * IN THE POSTING OF THE ERROR IF THE RETURN IS TAKEN. ! 11798: * ! 11799: * THE PROCEDURES ALL HAVE NAMES CONSISTING OF FIVE LETTERS ! 11800: * AND ARE IN ALPHABETICAL ORDER BY THEIR NAMES. ! 11801: {{EJC{{{{ ! 11802: * ! 11803: * ACESS - ACCESS VARIABLE VALUE WITH TRACE/INPUT CHECKS ! 11804: * ! 11805: * ACESS LOADS THE VALUE OF A VARIABLE. TRACE AND INPUT ! 11806: * ASSOCIATIONS ARE TESTED FOR AND EXECUTED AS REQUIRED. ! 11807: * ACESS ALSO HANDLES THE SPECIAL CASES OF PSEUDO-VARIABLES. ! 11808: * ! 11809: * (XL) VARIABLE NAME BASE ! 11810: * (WA) VARIABLE NAME OFFSET ! 11811: * JSR ACESS CALL TO ACCESS VALUE ! 11812: * PPM LOC TRANSFER LOC IF ACCESS FAILURE ! 11813: * (XR) VARIABLE VALUE ! 11814: * (WA,WB,WC) DESTROYED ! 11815: * (XL,RA) DESTROYED ! 11816: * ! 11817: * FAILURE CAN OCCUR IF AN INPUT ASSOCIATION CAUSES AN END ! 11818: * OF FILE CONDITION OR IF THE EVALUATION OF AN EXPRESSION ! 11819: * ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS. ! 11820: * ! 11821: {ACESS{PRC{R{1{{ENTRY POINT (RECURSIVE) ! 11822: {{MOV{R10{R9{{COPY NAME BASE ! 11823: {{ADD{R6{R9{{POINT TO VARIABLE LOCATION ! 11824: {{MOV{(R9){R9{{LOAD VARIABLE VALUE ! 11825: * ! 11826: * LOOP HERE TO CHECK FOR SUCCESSIVE TRBLKS ! 11827: * ! 11828: {ACS02{BNE{(R9){#B$TRT{ACS18{JUMP IF NOT TRAPPED ! 11829: * ! 11830: * HERE IF TRAPPED ! 11831: * ! 11832: {{BEQ{R9{#TRBKV{ACS12{JUMP IF KEYWORD VARIABLE ! 11833: {{BNE{R9{#TRBEV{ACS05{JUMP IF NOT EXPRESSION VARIABLE ! 11834: * ! 11835: * HERE FOR EXPRESSION VARIABLE, EVALUATE VARIABLE ! 11836: * ! 11837: {{MOV{4*EVEXP(R10){R9{{LOAD EXPRESSION POINTER ! 11838: {{ZER{R7{{{EVALUATE BY VALUE ! 11839: {{JSR{EVALX{{{EVALUATE EXPRESSION ! 11840: {{PPM{ACS04{{{JUMP IF EVALUATION FAILURE ! 11841: {{BRN{ACS02{{{CHECK VALUE FOR MORE TRBLKS ! 11842: {{EJC{{{{ ! 11843: * ! 11844: * ACESS (CONTINUED) ! 11845: * ! 11846: * HERE ON READING END OF FILE ! 11847: * ! 11848: {ACS03{ADD{#4*NUM03{SP{{POP TRBLK PTR, NAME BASE AND OFFSET ! 11849: {{MOV{R9{DNAMP{{POP UNUSED SCBLK ! 11850: * ! 11851: * MERGE HERE WHEN EVALUATION OF EXPRESSION FAILS ! 11852: * ! 11853: {ACS04{EXI{1{{{TAKE ALTERNATE (FAILURE) RETURN ! 11854: * ! 11855: * HERE IF NOT KEYWORD OR EXPRESSION VARIABLE ! 11856: * ! 11857: {ACS05{MOV{4*TRTYP(R9){R7{{LOAD TRAP TYPE CODE ! 11858: {{BNZ{R7{ACS10{{JUMP IF NOT INPUT ASSOCIATION ! 11859: {{BZE{KVINP{ACS09{{IGNORE INPUT ASSOC IF INPUT IS OFF ! 11860: * ! 11861: * HERE FOR INPUT ASSOCIATION ! 11862: * ! 11863: {{MOV{R10{-(SP){{STACK NAME BASE ! 11864: {{MOV{R6{-(SP){{STACK NAME OFFSET ! 11865: {{MOV{R9{-(SP){{STACK TRBLK POINTER ! 11866: {{MOV{4*TRFPT(R9){R10{{GET FILE CTRL BLK PTR OR ZERO ! 11867: {{BNZ{R10{ACS06{{JUMP IF NOT STANDARD INPUT FILE ! 11868: {{BEQ{4*TRTER(R9){#V$TER{ACS21{JUMP IF TERMINAL ! 11869: * ! 11870: * HERE TO READ FROM STANDARD INPUT FILE ! 11871: * ! 11872: {{MOV{CSWIN{R6{{LENGTH FOR READ BUFFER ! 11873: {{JSR{ALOCS{{{BUILD STRING OF APPROPRIATE LENGTH ! 11874: {{JSR{SYSRD{{{READ NEXT STANDARD INPUT IMAGE ! 11875: {{PPM{ACS03{{{JUMP TO FAIL EXIT IF END OF FILE ! 11876: {{BRN{ACS07{{{ELSE MERGE WITH OTHER FILE CASE ! 11877: * ! 11878: * HERE FOR INPUT FROM OTHER THAN STANDARD INPUT FILE ! 11879: * ! 11880: {ACS06{MOV{R10{R6{{FCBLK PTR ! 11881: {{JSR{SYSIL{{{GET INPUT RECORD MAX LENGTH (TO WA) ! 11882: {{JSR{ALOCS{{{ALLOCATE STRING OF CORRECT SIZE ! 11883: {{MOV{R10{R6{{FCBLK PTR ! 11884: {{JSR{SYSIN{{{CALL SYSTEM INPUT ROUTINE ! 11885: {{PPM{ACS03{{{JUMP TO FAIL EXIT IF END OF FILE ! 11886: {{PPM{ACS22{{{ERROR ! 11887: {{PPM{ACS23{{{ERROR ! 11888: {{EJC{{{{ ! 11889: * ! 11890: * ACESS (CONTINUED) ! 11891: * ! 11892: * MERGE HERE AFTER OBTAINING INPUT RECORD ! 11893: * ! 11894: {ACS07{MOV{KVTRM{R7{{LOAD TRIM INDICATOR ! 11895: {{JSR{TRIMR{{{TRIM RECORD AS REQUIRED ! 11896: {{MOV{R9{R7{{COPY RESULT POINTER ! 11897: {{MOV{(SP){R9{{RELOAD POINTER TO TRBLK ! 11898: * ! 11899: * LOOP TO CHASE TO END OF TRBLK CHAIN AND STORE VALUE ! 11900: * ! 11901: {ACS08{MOV{R9{R10{{SAVE POINTER TO THIS TRBLK ! 11902: {{MOV{4*TRNXT(R9){R9{{LOAD FORWARD POINTER ! 11903: {{BEQ{(R9){#B$TRT{ACS08{LOOP IF THIS IS ANOTHER TRBLK ! 11904: {{MOV{R7{4*TRNXT(R10){{ELSE STORE RESULT AT END OF CHAIN ! 11905: {{MOV{(SP)+{R9{{RESTORE INITIAL TRBLK POINTER ! 11906: {{MOV{(SP)+{R6{{RESTORE NAME OFFSET ! 11907: {{MOV{(SP)+{R10{{RESTORE NAME BASE POINTER ! 11908: * ! 11909: * COME HERE TO MOVE TO NEXT TRBLK ! 11910: * ! 11911: {ACS09{MOV{4*TRNXT(R9){R9{{LOAD FORWARD PTR TO NEXT VALUE ! 11912: {{BRN{ACS02{{{BACK TO CHECK IF TRAPPED ! 11913: * ! 11914: * HERE TO CHECK FOR ACCESS TRACE TRBLK ! 11915: * ! 11916: {ACS10{BNE{R7{#TRTAC{ACS09{LOOP BACK IF NOT ACCESS TRACE ! 11917: {{BZE{KVTRA{ACS09{{IGNORE ACCESS TRACE IF TRACE OFF ! 11918: {{DCV{KVTRA{{{ELSE DECREMENT TRACE COUNT ! 11919: {{BZE{4*TRFNC(R9){ACS11{{JUMP IF PRINT TRACE ! 11920: {{EJC{{{{ ! 11921: * ! 11922: * ACESS (CONTINUED) ! 11923: * ! 11924: * HERE FOR FULL FUNCTION TRACE ! 11925: * ! 11926: {{JSR{TRXEQ{{{CALL ROUTINE TO EXECUTE TRACE ! 11927: {{BRN{ACS09{{{JUMP FOR NEXT TRBLK ! 11928: * ! 11929: * HERE FOR CASE OF PRINT TRACE ! 11930: * ! 11931: {ACS11{JSR{PRTSN{{{PRINT STATEMENT NUMBER ! 11932: {{JSR{PRTNV{{{PRINT NAME = VALUE ! 11933: {{BRN{ACS09{{{JUMP BACK FOR NEXT TRBLK ! 11934: * ! 11935: * HERE FOR KEYWORD VARIABLE ! 11936: * ! 11937: {ACS12{MOV{4*KVNUM(R10){R9{{LOAD KEYWORD NUMBER ! 11938: {{BGE{R9{#K$V$${ACS14{JUMP IF NOT ONE WORD VALUE ! 11939: {{MTI{L^KVABE(R9){{{ELSE LOAD VALUE AS INTEGER ! 11940: * ! 11941: * COMMON EXIT WITH KEYWORD VALUE AS INTEGER IN (IA) ! 11942: * ! 11943: {ACS13{JSR{ICBLD{{{BUILD ICBLK ! 11944: {{BRN{ACS18{{{JUMP TO EXIT ! 11945: * ! 11946: * HERE IF NOT ONE WORD KEYWORD VALUE ! 11947: * ! 11948: {ACS14{BGE{R9{#K$S$${ACS15{JUMP IF SPECIAL CASE ! 11949: {{SUB{#K$V$${R9{{ELSE GET OFFSET ! 11950: {{ADD{#NDABO{R9{{POINT TO PATTERN VALUE ! 11951: {{BRN{ACS18{{{JUMP TO EXIT ! 11952: * ! 11953: * HERE IF SPECIAL KEYWORD CASE ! 11954: * ! 11955: {ACS15{MOV{KVRTN{R10{{LOAD RTNTYPE IN CASE ! 11956: {{LDI{KVSTL{{{LOAD STLIMIT IN CASE ! 11957: {{SUB{#K$S$${R9{{GET CASE NUMBER ! 11958: {{BSW{R9{5{{SWITCH ON KEYWORD NUMBER ! 11959: {{IFF{K$$AL{ACS16{{JUMP IF ALPHABET ! 11960: {{IFF{K$$RT{ACS17{{RTNTYPE ! 11961: {{IFF{K$$SC{ACS19{{STCOUNT ! 11962: {{IFF{K$$ET{ACS20{{ERRTEXT ! 11963: {{IFF{K$$SL{ACS13{{STLIMIT ! 11964: {{ESW{{{{END SWITCH ON KEYWORD NUMBER ! 11965: {{EJC{{{{ ! 11966: * ! 11967: * ACESS (CONTINUED) ! 11968: * ! 11969: * ALPHABET ! 11970: * ! 11971: {ACS16{MOV{KVALP{R10{{LOAD POINTER TO ALPHABET STRING ! 11972: * ! 11973: * RTNTYPE MERGES HERE ! 11974: * ! 11975: {ACS17{MOV{R10{R9{{COPY STRING PTR TO PROPER REG ! 11976: * ! 11977: * COMMON RETURN POINT ! 11978: * ! 11979: {ACS18{EXI{{{{RETURN TO ACESS CALLER ! 11980: * ! 11981: * HERE FOR STCOUNT (IA HAS STLIMIT) ! 11982: * ! 11983: {ACS19{SBI{KVSTC{{{STCOUNT = LIMIT - LEFT ! 11984: {{BRN{ACS13{{{MERGE BACK WITH INTEGER RESULT ! 11985: * ! 11986: * ERRTEXT ! 11987: * ! 11988: {ACS20{MOV{R$ETX{R9{{GET ERRTEXT STRING ! 11989: {{BRN{ACS18{{{MERGE WITH RESULT ! 11990: * ! 11991: * HERE TO READ A RECORD FROM TERMINAL ! 11992: * ! 11993: {ACS21{MOV{#RILEN{R6{{BUFFER LENGTH ! 11994: {{JSR{ALOCS{{{ALLOCATE BUFFER ! 11995: {{JSR{SYSRI{{{READ RECORD ! 11996: {{PPM{ACS03{{{ENDFILE ! 11997: {{BRN{ACS07{{{MERGE WITH RECORD READ ! 11998: * ! 11999: * ERROR RETURNS ! 12000: * ! 12001: {ACS22{MOV{R9{DNAMP{{POP UNUSED SCBLK ! 12002: {{ERB{202{INPUT{{FROM FILE CAUSED NON-RECOVERABLE ERROR ! 12003: * ! 12004: {ACS23{MOV{R9{DNAMP{{POP UNUSED SCBLK ! 12005: {{ERB{203{INPUT{{FILE RECORD HAS INCORRECT FORMAT ! 12006: {{ENP{{{{END PROCEDURE ACESS ! 12007: {{EJC{{{{ ! 12008: * ! 12009: * ACOMP -- COMPARE TWO ARITHMETIC VALUES ! 12010: * ! 12011: * 1(XS) FIRST ARGUMENT ! 12012: * 0(XS) SECOND ARGUMENT ! 12013: * JSR ACOMP CALL TO COMPARE VALUES ! 12014: * PPM LOC TRANSFER LOC IF ARG1 IS NON-NUMERIC ! 12015: * PPM LOC TRANSFER LOC IF ARG2 IS NON-NUMERIC ! 12016: * PPM LOC TRANSFER LOC FOR ARG1 LT ARG2 ! 12017: * PPM LOC TRANSFER LOC FOR ARG1 EQ ARG2 ! 12018: * PPM LOC TRANSFER LOC FOR ARG1 GT ARG2 ! 12019: * (NORMAL RETURN IS NEVER GIVEN) ! 12020: * (WA,WB,WC,IA,RA) DESTROYED ! 12021: * (XL,XR) DESTROYED ! 12022: * ! 12023: {ACOMP{PRC{N{5{{ENTRY POINT ! 12024: {{JSR{ARITH{{{LOAD ARITHMETIC OPERANDS ! 12025: {{PPM{ACMP7{{{JUMP IF FIRST ARG NON-NUMERIC ! 12026: {{PPM{ACMP8{{{JUMP IF SECOND ARG NON-NUMERIC ! 12027: {{PPM{ACMP4{{{JUMP IF REAL ARGUMENTS ! 12028: * ! 12029: * HERE FOR INTEGER ARGUMENTS ! 12030: * ! 12031: {{SBI{4*ICVAL(R10){{{SUBTRACT TO COMPARE ! 12032: {{IOV{ACMP3{{{JUMP IF OVERFLOW ! 12033: {{ILT{ACMP5{{{ELSE JUMP IF ARG1 LT ARG2 ! 12034: {{IEQ{ACMP2{{{JUMP IF ARG1 EQ ARG2 ! 12035: * ! 12036: * HERE IF ARG1 GT ARG2 ! 12037: * ! 12038: {ACMP1{EXI{5{{{TAKE GT EXIT ! 12039: * ! 12040: * HERE IF ARG1 EQ ARG2 ! 12041: * ! 12042: {ACMP2{EXI{4{{{TAKE EQ EXIT ! 12043: {{EJC{{{{ ! 12044: * ! 12045: * ACOMP (CONTINUED) ! 12046: * ! 12047: * HERE FOR INTEGER OVERFLOW ON SUBTRACT ! 12048: * ! 12049: {ACMP3{LDI{4*ICVAL(R10){{{LOAD SECOND ARGUMENT ! 12050: {{ILT{ACMP1{{{GT IF NEGATIVE ! 12051: {{BRN{ACMP5{{{ELSE LT ! 12052: * ! 12053: * HERE FOR REAL OPERANDS ! 12054: * ! 12055: {ACMP4{SBR{4*RCVAL(R10){{{SUBTRACT TO COMPARE ! 12056: {{ROV{ACMP6{{{JUMP IF OVERFLOW ! 12057: {{RGT{ACMP1{{{ELSE JUMP IF ARG1 GT ! 12058: {{REQ{ACMP2{{{JUMP IF ARG1 EQ ARG2 ! 12059: * ! 12060: * HERE IF ARG1 LT ARG2 ! 12061: * ! 12062: {ACMP5{EXI{3{{{TAKE LT EXIT ! 12063: * ! 12064: * HERE IF OVERFLOW ON REAL SUBTRACTION ! 12065: * ! 12066: {ACMP6{LDR{4*RCVAL(R10){{{RELOAD ARG2 ! 12067: {{RLT{ACMP1{{{GT IF NEGATIVE ! 12068: {{BRN{ACMP5{{{ELSE LT ! 12069: * ! 12070: * HERE IF ARG1 NON-NUMERIC ! 12071: * ! 12072: {ACMP7{EXI{1{{{TAKE ERROR EXIT ! 12073: * ! 12074: * HERE IF ARG2 NON-NUMERIC ! 12075: * ! 12076: {ACMP8{EXI{2{{{TAKE ERROR EXIT ! 12077: {{ENP{{{{END PROCEDURE ACOMP ! 12078: {{EJC{{{{ ! 12079: * ! 12080: * ALLOC ALLOCATE BLOCK OF DYNAMIC STORAGE ! 12081: * ! 12082: * (WA) LENGTH REQUIRED IN BYTES ! 12083: * JSR ALLOC CALL TO ALLOCATE BLOCK ! 12084: * (XR) POINTER TO ALLOCATED BLOCK ! 12085: * ! 12086: * A POSSIBLE ALTERNATIVE TO AOV .. AND FOLLOWING STMT IS - ! 12087: * MOV DNAME,XR . SUB WA,XR . BLO XR,DNAMP,ALOC2 . ! 12088: * MOV DNAMP,XR . ADD WA,XR ! 12089: * ! 12090: {ALLOC{PRC{E{0{{ENTRY POINT ! 12091: * ! 12092: * COMMON EXIT POINT ! 12093: * ! 12094: {ALOC1{MOV{DNAMP{R9{{POINT TO NEXT AVAILABLE LOC ! 12095: {{AOV{R6{R9{ALOC2{POINT PAST ALLOCATED BLOCK ! 12096: {{BGT{R9{DNAME{ALOC2{JUMP IF NOT ENOUGH ROOM ! 12097: {{MOV{R9{DNAMP{{STORE NEW POINTER ! 12098: {{SUB{R6{R9{{POINT BACK TO START OF ALLOCATED BK ! 12099: {{EXI{{{{RETURN TO CALLER ! 12100: * ! 12101: * HERE IF INSUFFICIENT ROOM, TRY A GARBAGE COLLECTION ! 12102: * ! 12103: {ALOC2{MOV{R7{ALLSV{{SAVE WB ! 12104: {{ZER{R7{{{SET NO UPWARD MOVE FOR GBCOL ! 12105: {{JSR{GBCOL{{{GARBAGE COLLECT ! 12106: * ! 12107: * SEE IF ROOM AFTER GBCOL OR SYSMM CALL ! 12108: * ! 12109: {ALOC3{MOV{DNAMP{R9{{POINT TO FIRST AVAILABLE LOC ! 12110: {{AOV{R6{R9{ALC3A{POINT PAST NEW BLOCK ! 12111: {{BLO{R9{DNAME{ALOC4{JUMP IF THERE IS ROOM NOW ! 12112: * ! 12113: * FAILED AGAIN, SEE IF WE CAN GET MORE CORE ! 12114: * ! 12115: {ALC3A{JSR{SYSMM{{{TRY TO GET MORE MEMORY ! 12116: {{WTB{R9{{{CONVERT TO BAUS (SGD05) ! 12117: {{ADD{R9{DNAME{{BUMP PTR BY AMOUNT OBTAINED ! 12118: {{BNZ{R9{ALOC3{{JUMP IF GOT MORE CORE ! 12119: {{ADD{RSMEM{DNAME{{GET THE RESERVE MEMORY ! 12120: {{ZER{RSMEM{{{ONLY PERMISSIBLE ONCE ! 12121: {{ICV{ERRFT{{{FATAL ERROR ! 12122: {{ERB{204{MEMORY{{OVERFLOW ! 12123: {{EJC{{{{ ! 12124: * ! 12125: * HERE AFTER SUCCESSFUL GARBAGE COLLECTION ! 12126: * ! 12127: {ALOC4{STI{ALLIA{{{SAVE IA ! 12128: {{MOV{DNAME{R7{{GET DYNAMIC END ADRS ! 12129: {{SUB{DNAMP{R7{{COMPUTE FREE STORE ! 12130: {{BTW{R7{{{CONVERT BYTES TO WORDS ! 12131: {{MTI{R7{{{PUT FREE STORE IN IA ! 12132: {{MLI{ALFSF{{{MULTIPLY BY FREE STORE FACTOR ! 12133: {{IOV{ALOC5{{{JUMP IF OVERFLOWED ! 12134: {{MOV{DNAME{R7{{DYNAMIC END ADRS ! 12135: {{SUB{DNAMB{R7{{COMPUTE TOTAL AMOUNT OF DYNAMIC ! 12136: {{BTW{R7{{{CONVERT TO WORDS ! 12137: {{MOV{R7{ALDYN{{STORE IT ! 12138: {{SBI{ALDYN{{{SUBTRACT FROM SCALED UP FREE STORE ! 12139: {{IGT{ALOC5{{{JUMP IF SUFFICIENT FREE STORE ! 12140: {{JSR{SYSMM{{{TRY TO GET MORE STORE ! 12141: {{WTB{R9{{{CONVERT TO BAUS (SGD05) ! 12142: {{ADD{R9{DNAME{{ADJUST DYNAMIC END ADRS ! 12143: * ! 12144: * MERGE TO RESTORE IA AND WB ! 12145: * ! 12146: {ALOC5{LDI{ALLIA{{{RECOVER IA ! 12147: {{MOV{ALLSV{R7{{RESTORE WB ! 12148: {{BRN{ALOC1{{{JUMP BACK TO EXIT ! 12149: {{ENP{{{{END PROCEDURE ALLOC ! 12150: {{EJC{{{{ ! 12151: * ! 12152: * ALOBF -- ALLOCATE BUFFER ! 12153: * ! 12154: * THIS ROUTINES ALLOCATES A NEW BUFFER. AS THE BFBLK ! 12155: * AND BCBLK COME IN PAIRS, BOTH ARE ALLOCATED HERE, ! 12156: * AND XR POINTS TO THE BCBLK ON RETURN. THE BFBLK ! 12157: * AND BCBLK ARE SET TO THE NULL BUFFER, AND THE IDVAL ! 12158: * IS ZERO ON RETURN. ! 12159: * ! 12160: * (WA) BUFFER SIZE IN CHARACTERS ! 12161: * JSR ALOBF CALL TO CREATE BUFFER ! 12162: * (XR) BCBLK PTR ! 12163: * (WA,WB) DESTROYED ! 12164: * ! 12165: {ALOBF{PRC{E{0{{ENTRY POINT ! 12166: {{MOV{R6{R7{{HANG ONTO ALLOCATION SIZE ! 12167: {{CTB{R6{BFSI${{GET TOTAL BLOCK SIZE ! 12168: {{BGE{R6{MXLEN{ALB01{CHECK FOR MAXLEN EXCEEDED ! 12169: {{ADD{#4*BCSI${R6{{ADD IN ALLOCATION FOR BCBLK ! 12170: {{JSR{ALLOC{{{ALLOCATE FRAME ! 12171: {{MOV{#B$BCT{(R9){{SET TYPE ! 12172: {{ZER{4*IDVAL(R9){{{NO ID YET ! 12173: {{ZER{4*BCLEN(R9){{{NO DEFINED LENGTH ! 12174: {{MOV{R10{R6{{SAVE XL ! 12175: {{MOV{R9{R10{{COPY BCBLK PTR ! 12176: {{ADD{#4*BCSI${R10{{BIAS PAST PARTIALLY BUILT BCBLK ! 12177: {{MOV{#B$BFT{(R10){{SET BFBLK TYPE WORD ! 12178: {{MOV{R7{4*BFALC(R10){{SET ALLOCATED SIZE ! 12179: {{MOV{R10{4*BCBUF(R9){{SET POINTER IN BCBLK ! 12180: {{ZER{4*BFCHR(R10){{{CLEAR FIRST WORD (NULL PAD) ! 12181: {{MOV{R6{R10{{RESTORE ENTRY XL ! 12182: {{EXI{{{{RETURN TO CALLER ! 12183: * ! 12184: * HERE FOR MXLEN EXCEEDED ! 12185: * ! 12186: {ALB01{ERB{274{REQUESTED{{BUFFER ALLOCATION EXCEEDS MXLEN ! 12187: {{ENP{{{{END PROCEDURE ALOBF ! 12188: {{EJC{{{{ ! 12189: * ! 12190: * ALOCS -- ALLOCATE STRING BLOCK ! 12191: * ! 12192: * ALOCS IS USED TO BUILD A FRAME FOR A STRING BLOCK INTO ! 12193: * WHICH THE ACTUAL CHARACTERS ARE PLACED BY THE CALLER. ! 12194: * ALL STRINGS ARE CREATED WITH A CALL TO ALOCS (THE ! 12195: * EXCEPTIONS OCCUR IN TRIMR AND S$RPL PROCEDURES). ! 12196: * ! 12197: * (WA) LENGTH OF STRING TO BE ALLOCATED ! 12198: * JSR ALOCS CALL TO ALLOCATE SCBLK ! 12199: * (XR) POINTER TO RESULTING SCBLK ! 12200: * (WA) DESTROYED ! 12201: * (WC) CHARACTER COUNT (ENTRY VALUE OF WA) ! 12202: * ! 12203: * THE RESULTING SCBLK HAS THE TYPE WORD AND THE LENGTH ! 12204: * FILLED IN AND THE LAST WORD IS CLEARED TO ZERO CHARACTERS ! 12205: * TO ENSURE CORRECT RIGHT PADDING OF THE FINAL WORD. ! 12206: * ! 12207: {ALOCS{PRC{E{0{{ENTRY POINT ! 12208: {{BGT{R6{KVMXL{ALCS2{JUMP IF LENGTH EXCEEEDS MAXLENGTH ! 12209: {{MOV{R6{R8{{ELSE COPY LENGTH ! 12210: {{CTB{R6{SCSI${{COMPUTE LENGTH OF SCBLK IN BYTES ! 12211: {{MOV{DNAMP{R9{{POINT TO NEXT AVAILABLE LOCATION ! 12212: {{AOV{R6{R9{ALCS0{POINT PAST BLOCK ! 12213: {{BLO{R9{DNAME{ALCS1{JUMP IF THERE IS ROOM ! 12214: * ! 12215: * INSUFFICIENT MEMORY ! 12216: * ! 12217: {ALCS0{ZER{R9{{{ELSE CLEAR GARBAGE XR VALUE ! 12218: {{JSR{ALLOC{{{AND USE STANDARD ALLOCATOR ! 12219: {{ADD{R6{R9{{POINT PAST END OF BLOCK TO MERGE ! 12220: * ! 12221: * MERGE HERE WITH XR POINTING BEYOND NEW BLOCK ! 12222: * ! 12223: {ALCS1{MOV{R9{DNAMP{{SET UPDATED STORAGE POINTER ! 12224: {{ZER{-(R9){{{STORE ZERO CHARS IN LAST WORD ! 12225: {{DCA{R6{{{DECREMENT LENGTH ! 12226: {{SUB{R6{R9{{POINT BACK TO START OF BLOCK ! 12227: {{MOV{#B$SCL{(R9){{SET TYPE WORD ! 12228: {{MOV{R8{4*SCLEN(R9){{STORE LENGTH IN CHARS ! 12229: {{EXI{{{{RETURN TO ALOCS CALLER ! 12230: * ! 12231: * COME HERE IF STRING IS TOO LONG ! 12232: * ! 12233: {ALCS2{ERB{205{STRING{{LENGTH EXCEEDS VALUE OF MAXLNGTH KEYWORD ! 12234: {{ENP{{{{END PROCEDURE ALOCS ! 12235: {{EJC{{{{ ! 12236: * ! 12237: * ALOST -- ALLOCATE SPACE IN STATIC REGION ! 12238: * ! 12239: * (WA) LENGTH REQUIRED IN BYTES ! 12240: * JSR ALOST CALL TO ALLOCATE SPACE ! 12241: * (XR) POINTER TO ALLOCATED BLOCK ! 12242: * (WB) DESTROYED ! 12243: * ! 12244: * NOTE THAT THE CODING ENSURES THAT THE RESULTING VALUE ! 12245: * OF STATE IS ALWAYS LESS THAN DNAMB. THIS FACT IS USED ! 12246: * IN TESTING A VARIABLE NAME FOR BEING IN THE STATIC REGION ! 12247: * ! 12248: {ALOST{PRC{E{0{{ENTRY POINT ! 12249: * ! 12250: * MERGE BACK HERE AFTER ALLOCATING NEW CHUNK ! 12251: * ! 12252: {ALST1{MOV{STATE{R9{{POINT TO CURRENT END OF AREA ! 12253: {{AOV{R6{R9{ALST2{POINT BEYOND PROPOSED BLOCK ! 12254: {{BGE{R9{DNAMB{ALST2{JUMP IF OVERLAP WITH DYNAMIC AREA ! 12255: {{MOV{R9{STATE{{ELSE STORE NEW POINTER ! 12256: {{SUB{R6{R9{{POINT BACK TO START OF BLOCK ! 12257: {{EXI{{{{RETURN TO ALOST CALLER ! 12258: * ! 12259: * HERE IF NO ROOM, PREPARE TO MOVE DYNAMIC STORAGE UP ! 12260: * ! 12261: {ALST2{MOV{R6{ALSTA{{SAVE WA ! 12262: {{BGE{R6{#4*E$STS{ALST3{SKIP IF REQUESTED CHUNK IS LARGE ! 12263: {{MOV{#4*E$STS{R6{{ELSE SET TO GET LARGE ENOUGH CHUNK ! 12264: * ! 12265: * HERE WITH AMOUNT TO MOVE UP IN WA ! 12266: * ! 12267: {ALST3{JSR{ALLOC{{{ALLOCATE BLOCK TO ENSURE ROOM ! 12268: {{MOV{R9{DNAMP{{AND DELETE IT ! 12269: {{MOV{R6{R7{{COPY MOVE UP AMOUNT ! 12270: {{JSR{GBCOL{{{CALL GBCOL TO MOVE DYNAMIC AREA UP ! 12271: {{MOV{ALSTA{R6{{RESTORE WA ! 12272: {{BRN{ALST1{{{LOOP BACK TO TRY AGAIN ! 12273: {{ENP{{{{END PROCEDURE ALOST ! 12274: {{EJC{{{{ ! 12275: * ! 12276: * APNDB -- APPEND STRING TO BUFFER ! 12277: * ! 12278: * THIS ROUTINE IS USED BY BUFFER HANDLING ROUTINES TO ! 12279: * APPEND DATA TO AN EXISTING BFBLK. ! 12280: * ! 12281: * (XR) EXISTING BCBLK TO BE APPENDED ! 12282: * (XL) CONVERTABLE TO STRING ! 12283: * JSR APNDB CALL TO APPEND TO BUFFER ! 12284: * PPM LOC THREAD IF (XL) CANT BE CONVERTED ! 12285: * PPM LOC IF NOT ENOUGH ROOM ! 12286: * (WA,WB) DESTROYED ! 12287: * ! 12288: * IF MORE CHARACTERS ARE SPECIFIED THAN CAN BE INSERTED, ! 12289: * THEN NO ACTION IS TAKEN AND THE SECOND RETURN IS TAKEN. ! 12290: * ! 12291: {APNDB{PRC{E{2{{ENTRY POINT ! 12292: {{MOV{4*BCLEN(R9){R6{{LOAD OFFSET TO INSERT ! 12293: {{ZER{R7{{{REPLACE SECTION IS NULL ! 12294: {{JSR{INSBF{{{CALL TO INSERT AT END ! 12295: {{PPM{APN01{{{CONVERT ERROR ! 12296: {{PPM{APN02{{{NO ROOM ! 12297: {{EXI{{{{RETURN TO CALLER ! 12298: * ! 12299: * HERE TO TAKE CONVERT FAILURE EXIT ! 12300: * ! 12301: {APN01{EXI{1{{{RETURN TO CALLER ALTERNATE ! 12302: * ! 12303: * HERE FOR NO FIT EXIT ! 12304: * ! 12305: {APN02{EXI{2{{{ALTERNATE EXIT TO CALLER ! 12306: {{ENP{{{{END PROCEDURE APNDB ! 12307: {{EJC{{{{ ! 12308: * ! 12309: * ARITH -- FETCH ARITHMETIC OPERANDS ! 12310: * ! 12311: * ARITH IS USED BY FUNCTIONS AND OPERATORS WHICH EXPECT ! 12312: * TWO NUMERIC ARGUMENTS (OPERANDS) WHICH MUST BOTH BE ! 12313: * INTEGER OR BOTH BE REAL. ARITH FETCHES TWO ARGUMENTS FROM ! 12314: * THE STACK AND PERFORMS ANY NECESSARY CONVERSIONS. ! 12315: * ! 12316: * 1(XS) FIRST ARGUMENT (LEFT OPERAND) ! 12317: * 0(XS) SECOND ARGUMENT (RIGHT OPERAND) ! 12318: * JSR ARITH CALL TO FETCH NUMERIC ARGUMENTS ! 12319: * PPM LOC TRANSFER LOC FOR OPND 1 NON-NUMERIC ! 12320: * PPM LOC TRANSFER LOC FOR OPND 2 NON-NUMERIC ! 12321: * PPM LOC TRANSFER LOC FOR REAL OPERANDS ! 12322: * ! 12323: * FOR INTEGER ARGS, CONTROL RETURNS PAST THE PARAMETERS ! 12324: * ! 12325: * (IA) LEFT OPERAND VALUE ! 12326: * (XR) PTR TO ICBLK FOR LEFT OPERAND ! 12327: * (XL) PTR TO ICBLK FOR RIGHT OPERAND ! 12328: * (XS) POPPED TWICE ! 12329: * (WA,WB,RA) DESTROYED ! 12330: * ! 12331: * FOR REAL ARGUMENTS, CONTROL RETURNS TO THE LOCATION ! 12332: * SPECIFIED BY THE THIRD PARAMETER. ! 12333: * ! 12334: * (RA) LEFT OPERAND VALUE ! 12335: * (XR) PTR TO RCBLK FOR LEFT OPERAND ! 12336: * (XL) PTR TO RCBLK FOR RIGHT OPERAND ! 12337: * (WA,WB,WC) DESTROYED ! 12338: * (XS) POPPED TWICE ! 12339: {{EJC{{{{ ! 12340: * ! 12341: * ARITH (CONTINUED) ! 12342: * ! 12343: * ENTRY POINT ! 12344: * ! 12345: {ARITH{PRC{N{3{{ENTRY POINT ! 12346: {{MOV{(SP)+{R10{{LOAD RIGHT OPERAND ! 12347: {{MOV{(SP)+{R9{{LOAD LEFT OPERAND ! 12348: {{MOV{(R10){R6{{GET RIGHT OPERAND TYPE WORD ! 12349: {{BEQ{R6{#B$ICL{ARTH1{JUMP IF INTEGER ! 12350: {{BEQ{R6{#B$RCL{ARTH4{JUMP IF REAL ! 12351: {{MOV{R9{-(SP){{ELSE REPLACE LEFT ARG ON STACK ! 12352: {{MOV{R10{R9{{COPY LEFT ARG POINTER ! 12353: {{JSR{GTNUM{{{CONVERT TO NUMERIC ! 12354: {{PPM{ARTH6{{{JUMP IF UNCONVERTIBLE ! 12355: {{MOV{R9{R10{{ELSE COPY CONVERTED RESULT ! 12356: {{MOV{(R10){R6{{GET RIGHT OPERAND TYPE WORD ! 12357: {{MOV{(SP)+{R9{{RELOAD LEFT ARGUMENT ! 12358: {{BEQ{R6{#B$RCL{ARTH4{JUMP IF RIGHT ARG IS REAL ! 12359: * ! 12360: * HERE IF RIGHT ARG IS AN INTEGER ! 12361: * ! 12362: {ARTH1{BNE{(R9){#B$ICL{ARTH3{JUMP IF LEFT ARG NOT INTEGER ! 12363: * ! 12364: * EXIT FOR INTEGER CASE ! 12365: * ! 12366: {ARTH2{LDI{4*ICVAL(R9){{{LOAD LEFT OPERAND VALUE ! 12367: {{EXI{{{{RETURN TO ARITH CALLER ! 12368: * ! 12369: * HERE FOR RIGHT OPERAND INTEGER, LEFT OPERAND NOT ! 12370: * ! 12371: {ARTH3{JSR{GTNUM{{{CONVERT LEFT ARG TO NUMERIC ! 12372: {{PPM{ARTH7{{{JUMP IF NOT CONVERTIBLE ! 12373: {{BEQ{R6{#B$ICL{ARTH2{JUMP BACK IF INTEGER-INTEGER ! 12374: * ! 12375: * HERE WE MUST CONVERT REAL-INTEGER TO REAL-REAL ! 12376: * ! 12377: {{MOV{R9{-(SP){{PUT LEFT ARG BACK ON STACK ! 12378: {{LDI{4*ICVAL(R10){{{LOAD RIGHT ARGUMENT VALUE ! 12379: {{ITR{{{{CONVERT TO REAL ! 12380: {{JSR{RCBLD{{{GET REAL BLOCK FOR RIGHT ARG, MERGE ! 12381: {{MOV{R9{R10{{COPY RIGHT ARG PTR ! 12382: {{MOV{(SP)+{R9{{LOAD LEFT ARGUMENT ! 12383: {{BRN{ARTH5{{{MERGE FOR REAL-REAL CASE ! 12384: {{EJC{{{{ ! 12385: * ! 12386: * ARITH (CONTINUED) ! 12387: * ! 12388: * HERE IF RIGHT ARGUMENT IS REAL ! 12389: * ! 12390: {ARTH4{BEQ{(R9){#B$RCL{ARTH5{JUMP IF LEFT ARG REAL ! 12391: {{JSR{GTREA{{{ELSE CONVERT TO REAL ! 12392: {{PPM{ARTH7{{{ERROR IF UNCONVERTIBLE ! 12393: * ! 12394: * HERE FOR REAL-REAL ! 12395: * ! 12396: {ARTH5{LDR{4*RCVAL(R9){{{LOAD LEFT OPERAND VALUE ! 12397: {{EXI{3{{{TAKE REAL-REAL EXIT ! 12398: * ! 12399: * HERE FOR ERROR CONVERTING RIGHT ARGUMENT ! 12400: * ! 12401: {ARTH6{ICA{SP{{{POP UNWANTED LEFT ARG ! 12402: {{EXI{2{{{TAKE APPROPRIATE ERROR EXIT ! 12403: * ! 12404: * HERE FOR ERROR CONVERTING LEFT OPERAND ! 12405: * ! 12406: {ARTH7{EXI{1{{{TAKE APPROPRIATE ERROR RETURN ! 12407: {{ENP{{{{END PROCEDURE ARITH ! 12408: {{EJC{{{{ ! 12409: * ! 12410: * ASIGN -- PERFORM ASSIGNMENT ! 12411: * ! 12412: * ASIGN PERFORMS THE ASSIGNMENT OF A VALUE TO A VARIABLE ! 12413: * WITH APPROPRIATE CHECKS FOR OUTPUT ASSOCIATIONS AND ! 12414: * VALUE TRACE ASSOCIATIONS WHICH ARE EXECUTED AS REQUIRED. ! 12415: * ASIGN ALSO HANDLES THE SPECIAL CASES OF ASSIGNMENT TO ! 12416: * PATTERN AND EXPRESSION VARIABLES. ! 12417: * ! 12418: * (WB) VALUE TO BE ASSIGNED ! 12419: * (XL) BASE POINTER FOR VARIABLE ! 12420: * (WA) OFFSET FOR VARIABLE ! 12421: * JSR ASIGN CALL TO ASSIGN VALUE TO VARIABLE ! 12422: * PPM LOC TRANSFER LOC FOR FAILURE ! 12423: * (XR,XL,WA,WB,WC) DESTROYED ! 12424: * (RA) DESTROYED ! 12425: * ! 12426: * FAILURE OCCURS IF THE EVALUATION OF AN EXPRESSION ! 12427: * ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS. ! 12428: * ! 12429: {ASIGN{PRC{R{1{{ENTRY POINT (RECURSIVE) ! 12430: * ! 12431: * MERGE BACK HERE TO ASSIGN RESULT TO EXPRESSION VARIABLE. ! 12432: * ! 12433: {ASG01{ADD{R6{R10{{POINT TO VARIABLE VALUE ! 12434: {{MOV{(R10){R9{{LOAD VARIABLE VALUE ! 12435: {{BEQ{(R9){#B$TRT{ASG02{JUMP IF TRAPPED ! 12436: {{MOV{R7{(R10){{ELSE PERFORM ASSIGNMENT ! 12437: {{ZER{R10{{{CLEAR GARBAGE VALUE IN XL ! 12438: {{EXI{{{{AND RETURN TO ASIGN CALLER ! 12439: * ! 12440: * HERE IF VALUE IS TRAPPED ! 12441: * ! 12442: {ASG02{SUB{R6{R10{{RESTORE NAME BASE ! 12443: {{BEQ{R9{#TRBKV{ASG14{JUMP IF KEYWORD VARIABLE ! 12444: {{BNE{R9{#TRBEV{ASG04{JUMP IF NOT EXPRESSION VARIABLE ! 12445: * ! 12446: * HERE FOR ASSIGNMENT TO EXPRESSION VARIABLE ! 12447: * ! 12448: {{MOV{4*EVEXP(R10){R9{{POINT TO EXPRESSION ! 12449: {{MOV{R7{-(SP){{STORE VALUE TO ASSIGN ON STACK ! 12450: {{MOV{#NUM01{R7{{SET FOR EVALUATION BY NAME ! 12451: {{JSR{EVALX{{{EVALUATE EXPRESSION BY NAME ! 12452: {{PPM{ASG03{{{JUMP IF EVALUATION FAILS ! 12453: {{MOV{(SP)+{R7{{ELSE RELOAD VALUE TO ASSIGN ! 12454: {{BRN{ASG01{{{LOOP BACK TO PERFORM ASSIGNMENT ! 12455: {{EJC{{{{ ! 12456: * ! 12457: * ASIGN (CONTINUED) ! 12458: * ! 12459: * HERE FOR FAILURE DURING EXPRESSION EVALUATION ! 12460: * ! 12461: {ASG03{ICA{SP{{{REMOVE STACKED VALUE ENTRY ! 12462: {{EXI{1{{{TAKE FAILURE EXIT ! 12463: * ! 12464: * HERE IF NOT KEYWORD OR EXPRESSION VARIABLE ! 12465: * ! 12466: {ASG04{MOV{R9{-(SP){{SAVE PTR TO FIRST TRBLK ! 12467: * ! 12468: * LOOP TO CHASE DOWN TRBLK CHAIN AND ASSIGN VALUE AT END ! 12469: * ! 12470: {ASG05{MOV{R9{R8{{SAVE PTR TO THIS TRBLK ! 12471: {{MOV{4*TRNXT(R9){R9{{POINT TO NEXT TRBLK ! 12472: {{BEQ{(R9){#B$TRT{ASG05{LOOP BACK IF ANOTHER TRBLK ! 12473: {{MOV{R8{R9{{ELSE POINT BACK TO LAST TRBLK ! 12474: {{MOV{R7{4*TRVAL(R9){{STORE VALUE AT END OF CHAIN ! 12475: {{MOV{(SP)+{R9{{RESTORE PTR TO FIRST TRBLK ! 12476: * ! 12477: * LOOP TO PROCESS TRBLK ENTRIES ON CHAIN ! 12478: * ! 12479: {ASG06{MOV{4*TRTYP(R9){R7{{LOAD TYPE CODE OF TRBLK ! 12480: {{BEQ{R7{#TRTVL{ASG08{JUMP IF VALUE TRACE ! 12481: {{BEQ{R7{#TRTOU{ASG10{JUMP IF OUTPUT ASSOCIATION ! 12482: * ! 12483: * HERE TO MOVE TO NEXT TRBLK ON CHAIN ! 12484: * ! 12485: {ASG07{MOV{4*TRNXT(R9){R9{{POINT TO NEXT TRBLK ON CHAIN ! 12486: {{BEQ{(R9){#B$TRT{ASG06{LOOP BACK IF ANOTHER TRBLK ! 12487: {{EXI{{{{ELSE END OF CHAIN, RETURN TO CALLER ! 12488: * ! 12489: * HERE TO PROCESS VALUE TRACE ! 12490: * ! 12491: {ASG08{BZE{KVTRA{ASG07{{IGNORE VALUE TRACE IF TRACE OFF ! 12492: {{DCV{KVTRA{{{ELSE DECREMENT TRACE COUNT ! 12493: {{BZE{4*TRFNC(R9){ASG09{{JUMP IF PRINT TRACE ! 12494: {{JSR{TRXEQ{{{ELSE EXECUTE FUNCTION TRACE ! 12495: {{BRN{ASG07{{{AND LOOP BACK ! 12496: {{EJC{{{{ ! 12497: * ! 12498: * ASIGN (CONTINUED) ! 12499: * ! 12500: * HERE FOR PRINT TRACE ! 12501: * ! 12502: {ASG09{JSR{PRTSN{{{PRINT STATEMENT NUMBER ! 12503: {{JSR{PRTNV{{{PRINT NAME = VALUE ! 12504: {{BRN{ASG07{{{LOOP BACK FOR NEXT TRBLK ! 12505: * ! 12506: * HERE FOR OUTPUT ASSOCIATION ! 12507: * ! 12508: {ASG10{BZE{KVOUP{ASG07{{IGNORE OUTPUT ASSOC IF OUTPUT OFF ! 12509: {{MOV{R9{R10{{ELSE COPY TRBLK POINTER ! 12510: {{MOV{4*TRVAL(R8){-(SP){{STACK VALUE TO OUTPUT (SGD01) ! 12511: {{JSR{GTSTG{{{CONVERT TO STRING ! 12512: {{PPM{ASG12{{{GET DATATYPE NAME IF UNCONVERTIBLE ! 12513: * ! 12514: * MERGE WITH STRING FOR OUTPUT ! 12515: * ! 12516: {ASG11{MOV{4*TRFPT(R10){R6{{FCBLK PTR ! 12517: {{BZE{R6{ASG13{{JUMP IF STANDARD OUTPUT FILE ! 12518: * ! 12519: * HERE FOR OUTPUT TO NON-STANDARD OUTPUT FILE ! 12520: * ! 12521: {{JSR{SYSOU{{{CALL SYSTEM OUTPUT ROUTINE ! 12522: {{ERR{206{OUTPUT{{CAUSED FILE OVERFLOW ! 12523: {{ERR{207{OUTPUT{{CAUSED NON-RECOVERABLE ERROR ! 12524: {{EXI{{{{ELSE ALL DONE, RETURN TO CALLER ! 12525: * ! 12526: * IF NOT PRINTABLE, GET DATATYPE NAME INSTEAD ! 12527: * ! 12528: {ASG12{JSR{DTYPE{{{CALL DATATYPE ROUTINE ! 12529: {{BRN{ASG11{{{MERGE ! 12530: * ! 12531: * HERE TO PRINT A STRING ON THE PRINTER ! 12532: * ! 12533: {ASG13{JSR{PRTST{{{PRINT STRING VALUE ! 12534: {{BEQ{4*TRTER(R10){#V$TER{ASG20{JUMP IF TERMINAL OUTPUT ! 12535: {{JSR{PRTNL{{{END OF LINE ! 12536: {{EXI{{{{RETURN TO CALLER ! 12537: {{EJC{{{{ ! 12538: * ! 12539: * ASIGN (CONTINUED) ! 12540: * ! 12541: * HERE FOR KEYWORD ASSIGNMENT ! 12542: * ! 12543: {ASG14{MOV{4*KVNUM(R10){R10{{LOAD KEYWORD NUMBER ! 12544: {{BEQ{R10{#K$ETX{ASG19{JUMP IF ERRTEXT ! 12545: {{MOV{R7{R9{{COPY VALUE TO BE ASSIGNED ! 12546: {{JSR{GTINT{{{CONVERT TO INTEGER ! 12547: {{ERR{208{KEYWORD{{VALUE ASSIGNED IS NOT INTEGER ! 12548: {{LDI{4*ICVAL(R9){{{ELSE LOAD VALUE ! 12549: {{BEQ{R10{#K$STL{ASG16{JUMP IF SPECIAL CASE OF STLIMIT ! 12550: {{MFI{R6{ASG18{{ELSE GET ADDR INTEGER, TEST OVFLOW ! 12551: {{BGE{R6{MXLEN{ASG18{FAIL IF TOO LARGE ! 12552: {{BEQ{R10{#K$ERT{ASG17{JUMP IF SPECIAL CASE OF ERRTYPE ! 12553: {{BEQ{R10{#K$PFL{ASG21{JUMP IF SPECIAL CASE OF PROFILE ! 12554: {{BLT{R10{#K$P$${ASG15{JUMP UNLESS PROTECTED ! 12555: {{ERB{209{KEYWORD{{IN ASSIGNMENT IS PROTECTED ! 12556: * ! 12557: * HERE TO DO ASSIGNMENT IF NOT PROTECTED ! 12558: * ! 12559: {ASG15{MOV{R6{L^KVABE(R10){{STORE NEW VALUE ! 12560: {{EXI{{{{RETURN TO ASIGN CALLER ! 12561: * ! 12562: * HERE FOR SPECIAL CASE OF STLIMIT ! 12563: * ! 12564: * SINCE STCOUNT IS MAINTAINED AS (STLIMIT-STCOUNT) ! 12565: * IT IS ALSO NECESSARY TO MODIFY STCOUNT APPROPRIATELY. ! 12566: * ! 12567: {ASG16{SBI{KVSTL{{{SUBTRACT OLD LIMIT ! 12568: {{ADI{KVSTC{{{ADD OLD COUNTER ! 12569: {{STI{KVSTC{{{STORE NEW COUNTER VALUE ! 12570: {{LDI{4*ICVAL(R9){{{RELOAD NEW LIMIT VALUE ! 12571: {{STI{KVSTL{{{STORE NEW LIMIT VALUE ! 12572: {{EXI{{{{RETURN TO ASIGN CALLER ! 12573: * ! 12574: * HERE FOR SPECIAL CASE OF ERRTYPE ! 12575: * ! 12576: {ASG17{BLE{R6{#NINI9{ERROR{OK TO SIGNAL IF IN RANGE ! 12577: * ! 12578: * HERE IF VALUE ASSIGNED IS OUT OF RANGE ! 12579: * ! 12580: {ASG18{ERB{210{KEYWORD{{VALUE ASSIGNED IS NEGATIVE OR TOO LARGE ! 12581: * ! 12582: * HERE FOR SPECIAL CASE OF ERRTEXT ! 12583: * ! 12584: {ASG19{MOV{R7{-(SP){{STACK VALUE ! 12585: {{JSR{GTSTG{{{CONVERT TO STRING ! 12586: {{ERR{211{VALUE{{ASSIGNED TO KEYWORD ERRTEXT NOT A STRING ! 12587: {{MOV{R9{R$ETX{{MAKE ASSIGNMENT ! 12588: {{EXI{{{{RETURN TO CALLER ! 12589: * ! 12590: * PRINT STRING TO TERMINAL ! 12591: * ! 12592: {ASG20{JSR{PRTTR{{{PRINT ! 12593: {{EXI{{{{RETURN ! 12594: * ! 12595: * HERE FOR KEYWORD PROFILE ! 12596: * ! 12597: {ASG21{BGT{R6{#NUM02{ASG18{MOAN IF NOT 0,1, OR 2 ! 12598: {{BZE{R6{ASG15{{JUST ASSIGN IF ZERO ! 12599: {{BZE{PFDMP{ASG22{{BRANCH IF FIRST ASSIGNMENT ! 12600: {{BEQ{R6{PFDMP{ASG23{ALSO IF SAME VALUE AS BEFORE ! 12601: {{ERB{268{INCONSISTENT{{VALUE ASSIGNED TO KEYWORD PROFILE ! 12602: * ! 12603: {ASG22{MOV{R6{PFDMP{{NOTE VALUE ON FIRST ASSIGNMENT ! 12604: {ASG23{JSR{SYSTM{{{GET THE TIME ! 12605: {{STI{PFSTM{{{FUDGE SOME KIND OF START TIME ! 12606: {{BRN{ASG15{{{AND GO ASSIGN ! 12607: {{ENP{{{{END PROCEDURE ASIGN ! 12608: {{EJC{{{{ ! 12609: * ! 12610: * ASINP -- ASSIGN DURING PATTERN MATCH ! 12611: * ! 12612: * ASINP IS LIKE ASIGN AND HAS A SIMILAR CALLING SEQUENCE ! 12613: * AND EFFECT. THE DIFFERENCE IS THAT THE GLOBAL PATTERN ! 12614: * VARIABLES ARE SAVED AND RESTORED IF REQUIRED. ! 12615: * ! 12616: * (XL) BASE POINTER FOR VARIABLE ! 12617: * (WA) OFFSET FOR VARIABLE ! 12618: * (WB) VALUE TO BE ASSIGNED ! 12619: * JSR ASINP CALL TO ASSIGN VALUE TO VARIABLE ! 12620: * PPM LOC TRANSFER LOC IF FAILURE ! 12621: * (XR,XL) DESTROYED ! 12622: * (WA,WB,WC,RA) DESTROYED ! 12623: * ! 12624: {ASINP{PRC{R{1{{ENTRY POINT, RECURSIVE ! 12625: {{ADD{R6{R10{{POINT TO VARIABLE ! 12626: {{MOV{(R10){R9{{LOAD CURRENT CONTENTS ! 12627: {{BEQ{(R9){#B$TRT{ASNP1{JUMP IF TRAPPED ! 12628: {{MOV{R7{(R10){{ELSE PERFORM ASSIGNMENT ! 12629: {{ZER{R10{{{CLEAR GARBAGE VALUE IN XL ! 12630: {{EXI{{{{RETURN TO ASINP CALLER ! 12631: * ! 12632: * HERE IF VARIABLE IS TRAPPED ! 12633: * ! 12634: {ASNP1{SUB{R6{R10{{RESTORE BASE POINTER ! 12635: {{MOV{PMSSL{-(SP){{STACK SUBJECT STRING LENGTH ! 12636: {{MOV{PMHBS{-(SP){{STACK HISTORY STACK BASE PTR ! 12637: {{MOV{R$PMS{-(SP){{STACK SUBJECT STRING POINTER ! 12638: {{MOV{PMDFL{-(SP){{STACK DOT FLAG ! 12639: {{JSR{ASIGN{{{CALL FULL-BLOWN ASSIGNMENT ROUTINE ! 12640: {{PPM{ASNP2{{{JUMP IF FAILURE ! 12641: {{MOV{(SP)+{PMDFL{{RESTORE DOT FLAG ! 12642: {{MOV{(SP)+{R$PMS{{RESTORE SUBJECT STRING POINTER ! 12643: {{MOV{(SP)+{PMHBS{{RESTORE HISTORY STACK BASE POINTER ! 12644: {{MOV{(SP)+{PMSSL{{RESTORE SUBJECT STRING LENGTH ! 12645: {{EXI{{{{RETURN TO ASINP CALLER ! 12646: * ! 12647: * HERE IF FAILURE IN ASIGN CALL ! 12648: * ! 12649: {ASNP2{MOV{(SP)+{PMDFL{{RESTORE DOT FLAG ! 12650: {{MOV{(SP)+{R$PMS{{RESTORE SUBJECT STRING POINTER ! 12651: {{MOV{(SP)+{PMHBS{{RESTORE HISTORY STACK BASE POINTER ! 12652: {{MOV{(SP)+{PMSSL{{RESTORE SUBJECT STRING LENGTH ! 12653: {{EXI{1{{{TAKE FAILURE EXIT ! 12654: {{ENP{{{{END PROCEDURE ASINP ! 12655: {{EJC{{{{ ! 12656: * ! 12657: * BLKLN -- DETERMINE LENGTH OF BLOCK ! 12658: * ! 12659: * BLKLN DETERMINES THE LENGTH OF A BLOCK IN DYNAMIC STORE. ! 12660: * ! 12661: * (WA) FIRST WORD OF BLOCK ! 12662: * (XR) POINTER TO BLOCK ! 12663: * JSR BLKLN CALL TO GET BLOCK LENGTH ! 12664: * (WA) LENGTH OF BLOCK IN BYTES ! 12665: * (XL) DESTROYED ! 12666: * ! 12667: * BLKLN IS USED BY THE GARBAGE COLLECTOR AND IS NOT ! 12668: * PERMITTED TO CALL GBCOL DIRECTLY OR INDIRECTLY. ! 12669: * ! 12670: * THE FIRST WORD STORED IN THE BLOCK (I.E. AT XR) MAY ! 12671: * BE ANYTHING, BUT THE CONTENTS OF WA MUST BE CORRECT. ! 12672: * ! 12673: {BLKLN{PRC{E{0{{ENTRY POINT ! 12674: {{MOV{R6{R10{{COPY FIRST WORD ! 12675: {{LEI{R10{{{GET ENTRY ID (BL$XX) ! 12676: {{BSW{R10{BL$$${BLN00{SWITCH ON BLOCK TYPE ! 12677: {{IFF{BL$AR{BLN01{{ARBLK ! 12678: {{IFF{BL$BC{BLN04{{BCBLK ! 12679: {{IFF{BL$CD{BLN01{{CDBLK ! 12680: {{IFF{BL$EX{BLN01{{EXBLK ! 12681: {{IFF{BL$IC{BLN07{{ICBLK ! 12682: {{IFF{BL$NM{BLN03{{NMBLK ! 12683: {{IFF{BL$P0{BLN02{{P0BLK ! 12684: {{IFF{BL$P1{BLN03{{P1BLK ! 12685: {{IFF{BL$P2{BLN04{{P2BLK ! 12686: {{IFF{BL$RC{BLN09{{RCBLK ! 12687: {{IFF{BL$SC{BLN10{{SCBLK ! 12688: {{IFF{BL$SE{BLN02{{SEBLK ! 12689: {{IFF{BL$TB{BLN01{{TBBLK ! 12690: {{IFF{BL$VC{BLN01{{VCBLK ! 12691: {{IFF{DUMMY{BLN00{{ ! 12692: {{IFF{DUMMY{BLN00{{ ! 12693: {{IFF{BL$PD{BLN08{{PDBLK ! 12694: {{IFF{BL$TR{BLN05{{TRBLK ! 12695: {{IFF{BL$BF{BLN11{{BFBLK ! 12696: {{IFF{DUMMY{BLN00{{ ! 12697: {{IFF{DUMMY{BLN00{{ ! 12698: {{IFF{BL$CT{BLN06{{CTBLK ! 12699: {{IFF{BL$DF{BLN01{{DFBLK ! 12700: {{IFF{BL$EF{BLN01{{EFBLK ! 12701: {{IFF{BL$EV{BLN03{{EVBLK ! 12702: {{IFF{BL$FF{BLN05{{FFBLK ! 12703: {{IFF{BL$KV{BLN03{{KVBLK ! 12704: {{IFF{BL$PF{BLN01{{PFBLK ! 12705: {{IFF{BL$TE{BLN04{{TEBLK ! 12706: {{ESW{{{{END OF JUMP TABLE ON BLOCK TYPE ! 12707: {{EJC{{{{ ! 12708: * ! 12709: * BLKLN (CONTINUED) ! 12710: * ! 12711: * HERE FOR BLOCKS WITH LENGTH IN SECOND WORD ! 12712: * ! 12713: {BLN00{MOV{4*1(R9){R6{{LOAD LENGTH ! 12714: {{EXI{{{{RETURN TO BLKLN CALLER ! 12715: * ! 12716: * HERE FOR LENGTH IN THIRD WORD (AR,CD,DF,EF,EX,PF,TB,VC) ! 12717: * ! 12718: {BLN01{MOV{4*2(R9){R6{{LOAD LENGTH FROM THIRD WORD ! 12719: {{EXI{{{{RETURN TO BLKLN CALLER ! 12720: * ! 12721: * HERE FOR TWO WORD BLOCKS (P0,SE) ! 12722: * ! 12723: {BLN02{MOV{#4*NUM02{R6{{LOAD LENGTH (TWO WORDS) ! 12724: {{EXI{{{{RETURN TO BLKLN CALLER ! 12725: * ! 12726: * HERE FOR THREE WORD BLOCKS (NM,P1,EV,KV) ! 12727: * ! 12728: {BLN03{MOV{#4*NUM03{R6{{LOAD LENGTH (THREE WORDS) ! 12729: {{EXI{{{{RETURN TO BLKLN CALLER ! 12730: * ! 12731: * HERE FOR FOUR WORD BLOCKS (P2,TE,BC) ! 12732: * ! 12733: {BLN04{MOV{#4*NUM04{R6{{LOAD LENGTH (FOUR WORDS) ! 12734: {{EXI{{{{RETURN TO BLKLN CALLER ! 12735: * ! 12736: * HERE FOR FIVE WORD BLOCKS (FF,TR) ! 12737: * ! 12738: {BLN05{MOV{#4*NUM05{R6{{LOAD LENGTH ! 12739: {{EXI{{{{RETURN TO BLKLN CALLER ! 12740: {{EJC{{{{ ! 12741: * ! 12742: * BLKLN (CONTINUED) ! 12743: * ! 12744: * HERE FOR CTBLK ! 12745: * ! 12746: {BLN06{MOV{#4*CTSI${R6{{SET SIZE OF CTBLK ! 12747: {{EXI{{{{RETURN TO BLKLN CALLER ! 12748: * ! 12749: * HERE FOR ICBLK ! 12750: * ! 12751: {BLN07{MOV{#4*ICSI${R6{{SET SIZE OF ICBLK ! 12752: {{EXI{{{{RETURN TO BLKLN CALLER ! 12753: * ! 12754: * HERE FOR PDBLK ! 12755: * ! 12756: {BLN08{MOV{4*PDDFP(R9){R10{{POINT TO DFBLK ! 12757: {{MOV{4*DFPDL(R10){R6{{LOAD PDBLK LENGTH FROM DFBLK ! 12758: {{EXI{{{{RETURN TO BLKLN CALLER ! 12759: * ! 12760: * HERE FOR RCBLK ! 12761: * ! 12762: {BLN09{MOV{#4*RCSI${R6{{SET SIZE OF RCBLK ! 12763: {{EXI{{{{RETURN TO BLKLN CALLER ! 12764: * ! 12765: * HERE FOR SCBLK ! 12766: * ! 12767: {BLN10{MOV{4*SCLEN(R9){R6{{LOAD LENGTH IN CHARACTERS ! 12768: {{CTB{R6{SCSI${{CALCULATE LENGTH IN BYTES ! 12769: {{EXI{{{{RETURN TO BLKLN CALLER ! 12770: * ! 12771: * HERE FOR BFBLK ! 12772: * ! 12773: {BLN11{MOV{4*BFALC(R9){R6{{GET ALLOCATION IN BYTES ! 12774: {{CTB{R6{BFSI${{CALCULATE LENGTH IN BYTES ! 12775: {{EXI{{{{RETURN TO BLKLN CALLER ! 12776: {{ENP{{{{END PROCEDURE BLKLN ! 12777: {{EJC{{{{ ! 12778: * ! 12779: * COPYB -- COPY A BLOCK ! 12780: * ! 12781: * (XS) BLOCK TO BE COPIED ! 12782: * JSR COPYB CALL TO COPY BLOCK ! 12783: * PPM LOC RETURN IF BLOCK HAS NO IDVAL FIELD ! 12784: * NORMAL RETURN IF IDVAL FIELD ! 12785: * (XR) COPY OF BLOCK ! 12786: * (XS) POPPED ! 12787: * (XL,WA,WB,WC) DESTROYED ! 12788: * ! 12789: {COPYB{PRC{N{1{{ENTRY POINT ! 12790: {{MOV{(SP){R9{{LOAD ARGUMENT ! 12791: {{BEQ{R9{#NULLS{COP10{RETURN ARGUMENT IF IT IS NULL ! 12792: {{MOV{(R9){R6{{ELSE LOAD TYPE WORD ! 12793: {{MOV{R6{R7{{COPY TYPE WORD ! 12794: {{JSR{BLKLN{{{GET LENGTH OF ARGUMENT BLOCK ! 12795: {{MOV{R9{R10{{COPY POINTER ! 12796: {{JSR{ALLOC{{{ALLOCATE BLOCK OF SAME SIZE ! 12797: {{MOV{R9{(SP){{STORE POINTER TO COPY ! 12798: {{MVW{{{{COPY CONTENTS OF OLD BLOCK TO NEW ! 12799: {{MOV{(SP){R9{{RELOAD POINTER TO START OF COPY ! 12800: {{BEQ{R7{#B$TBT{COP05{JUMP IF TABLE ! 12801: {{BEQ{R7{#B$VCT{COP01{JUMP IF VECTOR ! 12802: {{BEQ{R7{#B$PDT{COP01{JUMP IF PROGRAM DEFINED ! 12803: {{BEQ{R7{#B$BCT{COP11{JUMP IF BUFFER ! 12804: {{BNE{R7{#B$ART{COP10{RETURN COPY IF NOT ARRAY ! 12805: * ! 12806: * HERE FOR ARRAY (ARBLK) ! 12807: * ! 12808: {{ADD{4*AROFS(R9){R9{{POINT TO PROTOTYPE FIELD ! 12809: {{BRN{COP02{{{JUMP TO MERGE ! 12810: * ! 12811: * HERE FOR VECTOR, PROGRAM DEFINED ! 12812: * ! 12813: {COP01{ADD{#4*PDFLD{R9{{POINT TO PDFLD = VCVLS ! 12814: * ! 12815: * MERGE HERE FOR ARBLK, VCBLK, PDBLK TO DELETE TRAP ! 12816: * BLOCKS FROM ALL VALUE FIELDS (THE COPY IS UNTRAPPED) ! 12817: * ! 12818: {COP02{MOV{(R9){R10{{LOAD NEXT POINTER ! 12819: * ! 12820: * LOOP TO GET VALUE AT END OF TRBLK CHAIN ! 12821: * ! 12822: {COP03{BNE{(R10){#B$TRT{COP04{JUMP IF NOT TRAPPED ! 12823: {{MOV{4*TRVAL(R10){R10{{ELSE POINT TO NEXT VALUE ! 12824: {{BRN{COP03{{{AND LOOP BACK ! 12825: {{EJC{{{{ ! 12826: * ! 12827: * COPYB (CONTINUED) ! 12828: * ! 12829: * HERE WITH UNTRAPPED VALUE IN XL ! 12830: * ! 12831: {COP04{MOV{R10{(R9)+{{STORE REAL VALUE, BUMP POINTER ! 12832: {{BNE{R9{DNAMP{COP02{LOOP BACK IF MORE TO GO ! 12833: {{BRN{COP09{{{ELSE JUMP TO EXIT ! 12834: * ! 12835: * HERE TO COPY A TABLE ! 12836: * ! 12837: {COP05{ZER{4*IDVAL(R9){{{ZERO ID TO STOP DUMP BLOWING UP ! 12838: {{MOV{#4*TESI${R6{{SET SIZE OF TEBLK ! 12839: {{MOV{#4*TBBUK{R8{{SET INITIAL OFFSET ! 12840: * ! 12841: * LOOP THROUGH BUCKETS IN TABLE ! 12842: * ! 12843: {COP06{MOV{(SP){R9{{LOAD TABLE POINTER ! 12844: {{BEQ{R8{4*TBLEN(R9){COP09{JUMP TO EXIT IF ALL DONE ! 12845: {{ADD{R8{R9{{ELSE POINT TO NEXT BUCKET HEADER ! 12846: {{ICA{R8{{{BUMP OFFSET ! 12847: {{SUB{#4*TENXT{R9{{SUBTRACT LINK OFFSET TO MERGE ! 12848: * ! 12849: * LOOP THROUGH TEBLKS ON ONE CHAIN ! 12850: * ! 12851: {COP07{MOV{4*TENXT(R9){R10{{LOAD POINTER TO NEXT TEBLK ! 12852: {{MOV{(SP){4*TENXT(R9){{SET END OF CHAIN POINTER IN CASE ! 12853: {{BEQ{(R10){#B$TBT{COP06{BACK FOR NEXT BUCKET IF CHAIN END ! 12854: {{MOV{R9{-(SP){{ELSE STACK PTR TO PREVIOUS BLOCK ! 12855: {{MOV{#4*TESI${R6{{SET SIZE OF TEBLK ! 12856: {{JSR{ALLOC{{{ALLOCATE NEW TEBLK ! 12857: {{MOV{R9{R7{{SAVE PTR TO NEW TEBLK ! 12858: {{MVW{{{{COPY OLD TEBLK TO NEW TEBLK ! 12859: {{MOV{R7{R9{{RESTORE POINTER TO NEW TEBLK ! 12860: {{MOV{(SP)+{R10{{RESTORE POINTER TO PREVIOUS BLOCK ! 12861: {{MOV{R9{4*TENXT(R10){{LINK NEW BLOCK TO PREVIOUS ! 12862: {{MOV{R9{R10{{COPY POINTER TO NEW BLOCK ! 12863: * ! 12864: * LOOP TO SET REAL VALUE AFTER REMOVING TRAP CHAIN ! 12865: * ! 12866: {COP08{MOV{4*TEVAL(R10){R10{{LOAD VALUE ! 12867: {{BEQ{(R10){#B$TRT{COP08{LOOP BACK IF TRAPPED ! 12868: {{MOV{R10{4*TEVAL(R9){{STORE UNTRAPPED VALUE IN TEBLK ! 12869: {{BRN{COP07{{{BACK FOR NEXT TEBLK ! 12870: * ! 12871: * COMMON EXIT POINT ! 12872: * ! 12873: {COP09{MOV{(SP)+{R9{{LOAD POINTER TO BLOCK ! 12874: {{EXI{{{{RETURN ! 12875: * ! 12876: * ALTERNATIVE RETURN ! 12877: * ! 12878: {COP10{EXI{1{{{RETURN ! 12879: {{EJC{{{{ ! 12880: * ! 12881: * HERE TO COPY BUFFER ! 12882: * ! 12883: {COP11{MOV{4*BCBUF(R9){R10{{GET BFBLK PTR ! 12884: {{MOV{4*BFALC(R10){R6{{GET ALLOCATION ! 12885: {{CTB{R6{BFSI${{SET TOTAL SIZE ! 12886: {{MOV{R9{R10{{SAVE BCBLK PTR ! 12887: {{JSR{ALLOC{{{ALLOCATE BFBLK ! 12888: {{MOV{4*BCBUF(R10){R7{{GET OLD BFBLK ! 12889: {{MOV{R9{4*BCBUF(R10){{SET POINTER TO NEW BFBLK ! 12890: {{MOV{R7{R10{{POINT TO OLD BFBLK ! 12891: {{MVW{{{{COPY BFBLK TOO ! 12892: {{ZER{R10{{{CLEAR RUBBISH PTR ! 12893: {{BRN{COP09{{{BRANCH TO EXIT ! 12894: {{ENP{{{{END PROCEDURE COPYB ! 12895: * ! 12896: * CDGCG -- GENERATE CODE FOR COMPLEX GOTO ! 12897: * ! 12898: * USED BY CMPIL TO PROCESS COMPLEX GOTO TREE ! 12899: * ! 12900: * (WB) MUST BE COLLECTABLE ! 12901: * (XR) EXPRESSION POINTER ! 12902: * JSR CDGCG CALL TO GENERATE COMPLEX GOTO ! 12903: * (XL,XR,WA) DESTROYED ! 12904: * ! 12905: {CDGCG{PRC{E{0{{ENTRY POINT ! 12906: {{MOV{4*CMOPN(R9){R10{{GET UNARY GOTO OPERATOR ! 12907: {{MOV{4*CMROP(R9){R9{{POINT TO GOTO OPERAND ! 12908: {{BEQ{R10{#OPDVD{CDGC2{JUMP IF DIRECT GOTO ! 12909: {{JSR{CDGNM{{{GENERATE OPND BY NAME IF NOT DIRECT ! 12910: * ! 12911: * RETURN POINT ! 12912: * ! 12913: {CDGC1{MOV{R10{R6{{GOTO OPERATOR ! 12914: {{JSR{CDWRD{{{GENERATE IT ! 12915: {{EXI{{{{RETURN TO CALLER ! 12916: * ! 12917: * DIRECT GOTO ! 12918: * ! 12919: {CDGC2{JSR{CDGVL{{{GENERATE OPERAND BY VALUE ! 12920: {{BRN{CDGC1{{{MERGE TO RETURN ! 12921: {{ENP{{{{END PROCEDURE CDGCG ! 12922: {{EJC{{{{ ! 12923: * ! 12924: * CDGEX -- BUILD EXPRESSION BLOCK ! 12925: * ! 12926: * CDGEX IS PASSED A POINTER TO AN EXPRESSION TREE (SEE ! 12927: * EXPAN) AND RETURNS AN EXPRESSION (SEBLK OR EXBLK). ! 12928: * ! 12929: * (WC) SOME COLLECTABLE VALUE ! 12930: * (WB) INTEGER IN RANGE 0 LE X LE MXLEN ! 12931: * (XL) PTR TO EXPRESSION TREE ! 12932: * JSR CDGEX CALL TO BUILD EXPRESSION ! 12933: * (XR) PTR TO SEBLK OR EXBLK ! 12934: * (XL,WA,WB) DESTROYED ! 12935: * ! 12936: {CDGEX{PRC{R{0{{ENTRY POINT, RECURSIVE ! 12937: {{BLO{(R10){#B$VR${CDGX1{JUMP IF NOT VARIABLE ! 12938: * ! 12939: * HERE FOR NATURAL VARIABLE, BUILD SEBLK ! 12940: * ! 12941: {{MOV{#4*SESI${R6{{SET SIZE OF SEBLK ! 12942: {{JSR{ALLOC{{{ALLOCATE SPACE FOR SEBLK ! 12943: {{MOV{#B$SEL{(R9){{SET TYPE WORD ! 12944: {{MOV{R10{4*SEVAR(R9){{STORE VRBLK POINTER ! 12945: {{EXI{{{{RETURN TO CDGEX CALLER ! 12946: * ! 12947: * HERE IF NOT VARIABLE, BUILD EXBLK ! 12948: * ! 12949: {CDGX1{MOV{R10{R9{{COPY TREE POINTER ! 12950: {{MOV{R8{-(SP){{SAVE WC ! 12951: {{MOV{CWCOF{R10{{SAVE CURRENT OFFSET ! 12952: {{MOV{(R9){R6{{GET TYPE WORD ! 12953: {{BNE{R6{#B$CMT{CDGX2{CALL BY VALUE IF NOT CMBLK ! 12954: {{BGE{4*CMTYP(R9){#C$$NM{CDGX2{JUMP IF CMBLK ONLY BY VALUE ! 12955: {{EJC{{{{ ! 12956: * ! 12957: * CDGEX (CONTINUED) ! 12958: * ! 12959: * HERE IF EXPRESSION CAN BE EVALUATED BY NAME ! 12960: * ! 12961: {{JSR{CDGNM{{{GENERATE CODE BY NAME ! 12962: {{MOV{#ORNM${R6{{LOAD RETURN BY NAME WORD ! 12963: {{BRN{CDGX3{{{MERGE WITH VALUE CASE ! 12964: * ! 12965: * HERE IF EXPRESSION CAN ONLY BE EVALUATED BY VALUE ! 12966: * ! 12967: {CDGX2{JSR{CDGVL{{{GENERATE CODE BY VALUE ! 12968: {{MOV{#ORVL${R6{{LOAD RETURN BY VALUE WORD ! 12969: * ! 12970: * MERGE HERE TO CONSTRUCT EXBLK ! 12971: * ! 12972: {CDGX3{JSR{CDWRD{{{GENERATE RETURN WORD ! 12973: {{JSR{EXBLD{{{BUILD EXBLK ! 12974: {{MOV{(SP)+{R8{{RESTORE WC ! 12975: {{EXI{{{{RETURN TO CDGEX CALLER ! 12976: {{ENP{{{{END PROCEDURE CDGEX ! 12977: {{EJC{{{{ ! 12978: * ! 12979: * CDGNM -- GENERATE CODE BY NAME ! 12980: * ! 12981: * CDGNM IS CALLED DURING THE COMPILATION PROCESS TO ! 12982: * GENERATE CODE BY NAME FOR AN EXPRESSION. SEE CDBLK ! 12983: * DESCRIPTION FOR DETAILS OF CODE GENERATED. THE INPUT ! 12984: * TO CDGNM IS AN EXPRESSION TREE AS GENERATED BY EXPAN. ! 12985: * ! 12986: * CDGNM IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING ! 12987: * RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS. ! 12988: * ! 12989: * (WB) INTEGER IN RANGE 0 LE N LE DNAMB ! 12990: * (XR) PTR TO TREE GENERATED BY EXPAN ! 12991: * (WC) CONSTANT FLAG (SEE BELOW) ! 12992: * JSR CDGNM CALL TO GENERATE CODE BY NAME ! 12993: * (XR,WA) DESTROYED ! 12994: * (WC) SET NON-ZERO IF NON-CONSTANT ! 12995: * ! 12996: * WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE ! 12997: * EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE ! 12998: * EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED. ! 12999: * ! 13000: * THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD). ! 13001: * ! 13002: {CDGNM{PRC{R{0{{ENTRY POINT, RECURSIVE ! 13003: {{MOV{R10{-(SP){{SAVE ENTRY XL ! 13004: {{MOV{R7{-(SP){{SAVE ENTRY WB ! 13005: {{CHK{{{{CHECK FOR STACK OVERFLOW ! 13006: {{MOV{(R9){R6{{LOAD TYPE WORD ! 13007: {{BEQ{R6{#B$CMT{CGN04{JUMP IF CMBLK ! 13008: {{BHI{R6{#B$VR${CGN02{JUMP IF SIMPLE VARIABLE ! 13009: * ! 13010: * MERGE HERE FOR OPERAND YIELDING VALUE (E.G. CONSTANT) ! 13011: * ! 13012: {CGN01{ERB{212{SYNTAX{{ERROR. VALUE USED WHERE NAME IS REQUIRED ! 13013: * ! 13014: * HERE FOR NATURAL VARIABLE REFERENCE ! 13015: * ! 13016: {CGN02{MOV{#OLVN${R6{{LOAD VARIABLE LOAD CALL ! 13017: {{JSR{CDWRD{{{GENERATE IT ! 13018: {{MOV{R9{R6{{COPY VRBLK POINTER ! 13019: {{JSR{CDWRD{{{GENERATE VRBLK POINTER ! 13020: {{EJC{{{{ ! 13021: * ! 13022: * CDGNM (CONTINUED) ! 13023: * ! 13024: * HERE TO EXIT WITH WC SET CORRECTLY ! 13025: * ! 13026: {CGN03{MOV{(SP)+{R7{{RESTORE ENTRY WB ! 13027: {{MOV{(SP)+{R10{{RESTORE ENTRY XL ! 13028: {{EXI{{{{RETURN TO CDGNM CALLER ! 13029: * ! 13030: * HERE FOR CMBLK ! 13031: * ! 13032: {CGN04{MOV{R9{R10{{COPY CMBLK POINTER ! 13033: {{MOV{4*CMTYP(R9){R9{{LOAD CMBLK TYPE ! 13034: {{BGE{R9{#C$$NM{CGN01{ERROR IF NOT NAME OPERAND ! 13035: {{BSW{R9{C$$NM{{ELSE SWITCH ON TYPE ! 13036: {{IFF{C$ARR{CGN05{{ARRAY REFERENCE ! 13037: {{IFF{C$FNC{CGN08{{FUNCTION CALL ! 13038: {{IFF{C$DEF{CGN09{{DEFERRED EXPRESSION ! 13039: {{IFF{C$IND{CGN10{{INDIRECT REFERENCE ! 13040: {{IFF{C$KEY{CGN11{{KEYWORD REFERENCE ! 13041: {{IFF{C$UBO{CGN08{{UNDEFINED BINARY OP ! 13042: {{IFF{C$UUO{CGN08{{UNDEFINED UNARY OP ! 13043: {{ESW{{{{END SWITCH ON CMBLK TYPE ! 13044: * ! 13045: * HERE TO GENERATE CODE FOR ARRAY REFERENCE ! 13046: * ! 13047: {CGN05{MOV{#4*CMOPN{R7{{POINT TO ARRAY OPERAND ! 13048: * ! 13049: * LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS ! 13050: * ! 13051: {CGN06{JSR{CMGEN{{{GENERATE CODE FOR NEXT OPERAND ! 13052: {{MOV{4*CMLEN(R10){R8{{LOAD LENGTH OF CMBLK ! 13053: {{BLT{R7{R8{CGN06{LOOP TILL ALL GENERATED ! 13054: * ! 13055: * GENERATE APPROPRIATE ARRAY CALL ! 13056: * ! 13057: {{MOV{#OAON${R6{{LOAD ONE-SUBSCRIPT CASE CALL ! 13058: {{BEQ{R8{#4*CMAR1{CGN07{JUMP TO EXIT IF ONE SUBSCRIPT CASE ! 13059: {{MOV{#OAMN${R6{{ELSE LOAD MULTI-SUBSCRIPT CASE CALL ! 13060: {{JSR{CDWRD{{{GENERATE CALL ! 13061: {{MOV{R8{R6{{COPY CMBLK LENGTH ! 13062: {{BTW{R6{{{CONVERT TO WORDS ! 13063: {{SUB{#CMVLS{R6{{CALCULATE NUMBER OF SUBSCRIPTS ! 13064: {{EJC{{{{ ! 13065: * ! 13066: * CDGNM (CONTINUED) ! 13067: * ! 13068: * HERE TO EXIT GENERATING WORD (NON-CONSTANT) ! 13069: * ! 13070: {CGN07{MNZ{R8{{{SET RESULT NON-CONSTANT ! 13071: {{JSR{CDWRD{{{GENERATE WORD ! 13072: {{BRN{CGN03{{{BACK TO EXIT ! 13073: * ! 13074: * HERE TO GENERATE CODE FOR FUNCTIONS AND UNDEFINED OPRS ! 13075: * ! 13076: {CGN08{MOV{R10{R9{{COPY CMBLK POINTER ! 13077: {{JSR{CDGVL{{{GEN CODE BY VALUE FOR CALL ! 13078: {{MOV{#OFNE${R6{{GET EXTRA CALL FOR BY NAME ! 13079: {{BRN{CGN07{{{BACK TO GENERATE AND EXIT ! 13080: * ! 13081: * HERE TO GENERATE CODE FOR DEFERED EXPRESSION ! 13082: * ! 13083: {CGN09{MOV{4*CMROP(R10){R9{{CHECK IF VARIABLE ! 13084: {{BHI{(R9){#B$VR${CGN02{TREAT *VARIABLE AS SIMPLE VAR ! 13085: {{MOV{R9{R10{{COPY PTR TO EXPRESSION TREE ! 13086: {{JSR{CDGEX{{{ELSE BUILD EXBLK ! 13087: {{MOV{#OLEX${R6{{SET CALL TO LOAD EXPR BY NAME ! 13088: {{JSR{CDWRD{{{GENERATE IT ! 13089: {{MOV{R9{R6{{COPY EXBLK POINTER ! 13090: {{JSR{CDWRD{{{GENERATE EXBLK POINTER ! 13091: {{BRN{CGN03{{{BACK TO EXIT ! 13092: * ! 13093: * HERE TO GENERATE CODE FOR INDIRECT REFERENCE ! 13094: * ! 13095: {CGN10{MOV{4*CMROP(R10){R9{{GET OPERAND ! 13096: {{JSR{CDGVL{{{GENERATE CODE BY VALUE FOR IT ! 13097: {{MOV{#OINN${R6{{LOAD CALL FOR INDIRECT BY NAME ! 13098: {{BRN{CGN12{{{MERGE ! 13099: * ! 13100: * HERE TO GENERATE CODE FOR KEYWORD REFERENCE ! 13101: * ! 13102: {CGN11{MOV{4*CMROP(R10){R9{{GET OPERAND ! 13103: {{JSR{CDGNM{{{GENERATE CODE BY NAME FOR IT ! 13104: {{MOV{#OKWN${R6{{LOAD CALL FOR KEYWORD BY NAME ! 13105: * ! 13106: * KEYWORD, INDIRECT MERGE HERE ! 13107: * ! 13108: {CGN12{JSR{CDWRD{{{GENERATE CODE FOR OPERATOR ! 13109: {{BRN{CGN03{{{EXIT ! 13110: {{ENP{{{{END PROCEDURE CDGNM ! 13111: {{EJC{{{{ ! 13112: * ! 13113: * CDGVL -- GENERATE CODE BY VALUE ! 13114: * ! 13115: * CDGVL IS CALLED DURING THE COMPILATION PROCESS TO ! 13116: * GENERATE CODE BY VALUE FOR AN EXPRESSION. SEE CDBLK ! 13117: * DESCRIPTION FOR DETAILS OF THE CODE GENERATED. THE INPUT ! 13118: * TO CDGVL IS AN EXPRESSION TREE AS GENERATED BY EXPAN. ! 13119: * ! 13120: * CDGVL IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING ! 13121: * RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS. ! 13122: * ! 13123: * (WB) INTEGER IN RANGE 0 LE N LE DNAMB ! 13124: * (XR) PTR TO TREE GENERATED BY EXPAN ! 13125: * (WC) CONSTANT FLAG (SEE BELOW) ! 13126: * JSR CDGVL CALL TO GENERATE CODE BY VALUE ! 13127: * (XR,WA) DESTROYED ! 13128: * (WC) SET NON-ZERO IF NON-CONSTANT ! 13129: * ! 13130: * WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE ! 13131: * EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE ! 13132: * EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED. ! 13133: * ! 13134: * IF WC IS NON-ZERO ON ENTRY, THEN PREEVALUATION IS NOT ! 13135: * ALLOWED REGARDLESS OF THE NATURE OF THE OPERAND. ! 13136: * ! 13137: * THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD). ! 13138: * ! 13139: {CDGVL{PRC{R{0{{ENTRY POINT, RECURSIVE ! 13140: {{MOV{(R9){R6{{LOAD TYPE WORD ! 13141: {{BEQ{R6{#B$CMT{CGV01{JUMP IF CMBLK ! 13142: {{BLT{R6{#B$VRA{CGV00{JUMP IF ICBLK, RCBLK, SCBLK ! 13143: {{BNZ{4*VRLEN(R9){CGVL0{{JUMP IF NOT SYSTEM VARIABLE ! 13144: {{MOV{R9{-(SP){{STACK XR ! 13145: {{MOV{4*VRSVP(R9){R9{{POINT TO SVBLK ! 13146: {{MOV{4*SVBIT(R9){R6{{GET SVBLK PROPERTY BITS ! 13147: {{MOV{(SP)+{R9{{RECOVER XR ! 13148: {{ANB{BTCKW{R6{{CHECK IF CONSTANT KEYWORD ! 13149: {{NZB{R6{CGV00{{JUMP IF CONSTANT KEYWORD ! 13150: * ! 13151: * HERE FOR VARIABLE VALUE REFERENCE ! 13152: * ! 13153: {CGVL0{MNZ{R8{{{INDICATE NON-CONSTANT VALUE ! 13154: * ! 13155: * MERGE HERE FOR SIMPLE CONSTANT (ICBLK,RCBLK,SCBLK) ! 13156: * AND FOR VARIABLES CORRESPONDING TO CONSTANT KEYWORDS. ! 13157: * ! 13158: {CGV00{MOV{R9{R6{{COPY PTR TO VAR OR CONSTANT ! 13159: {{JSR{CDWRD{{{GENERATE AS CODE WORD ! 13160: {{EXI{{{{RETURN TO CALLER ! 13161: {{EJC{{{{ ! 13162: * ! 13163: * CDGVL (CONTINUED) ! 13164: * ! 13165: * HERE FOR TREE NODE (CMBLK) ! 13166: * ! 13167: {CGV01{MOV{R7{-(SP){{SAVE ENTRY WB ! 13168: {{MOV{R10{-(SP){{SAVE ENTRY XL ! 13169: {{MOV{R8{-(SP){{SAVE ENTRY CONSTANT FLAG ! 13170: {{MOV{CWCOF{-(SP){{SAVE INITIAL CODE OFFSET ! 13171: {{CHK{{{{CHECK FOR STACK OVERFLOW ! 13172: * ! 13173: * PREPARE TO GENERATE CODE FOR CMBLK. WC IS SET TO THE ! 13174: * VALUE OF CSWNO (ZERO IF -OPTIMISE, 1 IF -NOOPT) TO ! 13175: * START WITH AND IS RESET NON-ZERO FOR ANY NON-CONSTANT ! 13176: * CODE GENERATED. IF IT IS STILL ZERO AFTER GENERATING ALL ! 13177: * THE CMBLK CODE, THEN ITS VALUE IS COMPUTED AS THE RESULT. ! 13178: * ! 13179: {{MOV{R9{R10{{COPY CMBLK POINTER ! 13180: {{MOV{4*CMTYP(R9){R9{{LOAD CMBLK TYPE ! 13181: {{MOV{CSWNO{R8{{RESET CONSTANT FLAG ! 13182: {{BLE{R9{#C$PR${CGV02{JUMP IF NOT PREDICATE VALUE ! 13183: {{MNZ{R8{{{ELSE FORCE NON-CONSTANT CASE ! 13184: * ! 13185: * HERE WITH WC SET APPROPRIATELY ! 13186: * ! 13187: {CGV02{BSW{R9{C$$NV{{SWITCH TO APPROPRIATE GENERATOR ! 13188: {{IFF{C$ARR{CGV03{{ARRAY REFERENCE ! 13189: {{IFF{C$FNC{CGV05{{FUNCTION CALL ! 13190: {{IFF{C$DEF{CGV14{{DEFERRED EXPRESSION ! 13191: {{IFF{C$IND{CGV31{{INDIRECT REFERENCE ! 13192: {{IFF{C$KEY{CGV27{{KEYWORD REFERENCE ! 13193: {{IFF{C$UBO{CGV29{{UNDEFINED BINOP ! 13194: {{IFF{C$UUO{CGV30{{UNDEFINED UNOP ! 13195: {{IFF{C$BVL{CGV18{{BINOPS WITH VAL OPDS ! 13196: {{IFF{C$UVL{CGV19{{UNOPS WITH VALU OPND ! 13197: {{IFF{C$ALT{CGV18{{ALTERNATION ! 13198: {{IFF{C$CNC{CGV24{{CONCATENATION ! 13199: {{IFF{C$CNP{CGV24{{CONCATENATION (NOT PATTERN MATCH) ! 13200: {{IFF{C$UNM{CGV27{{UNOPS WITH NAME OPND ! 13201: {{IFF{C$BVN{CGV26{{BINARY $ AND . ! 13202: {{IFF{C$ASS{CGV21{{ASSIGNMENT ! 13203: {{IFF{C$INT{CGV31{{INTERROGATION ! 13204: {{IFF{C$NEG{CGV28{{NEGATION ! 13205: {{IFF{C$SEL{CGV15{{SELECTION ! 13206: {{IFF{C$PMT{CGV18{{PATTERN MATCH ! 13207: {{ESW{{{{END SWITCH ON CMBLK TYPE ! 13208: {{EJC{{{{ ! 13209: * ! 13210: * CDGVL (CONTINUED) ! 13211: * ! 13212: * HERE TO GENERATE CODE FOR ARRAY REFERENCE ! 13213: * ! 13214: {CGV03{MOV{#4*CMOPN{R7{{SET OFFSET TO ARRAY OPERAND ! 13215: * ! 13216: * LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS ! 13217: * ! 13218: {CGV04{JSR{CMGEN{{{GEN VALUE CODE FOR NEXT OPERAND ! 13219: {{MOV{4*CMLEN(R10){R8{{LOAD CMBLK LENGTH ! 13220: {{BLT{R7{R8{CGV04{LOOP BACK IF MORE TO GO ! 13221: * ! 13222: * GENERATE CALL TO APPROPRIATE ARRAY REFERENCE ROUTINE ! 13223: * ! 13224: {{MOV{#OAOV${R6{{SET ONE SUBSCRIPT CALL IN CASE ! 13225: {{BEQ{R8{#4*CMAR1{CGV32{JUMP TO EXIT IF 1-SUB CASE ! 13226: {{MOV{#OAMV${R6{{ELSE SET CALL FOR MULTI-SUBSCRIPTS ! 13227: {{JSR{CDWRD{{{GENERATE CALL ! 13228: {{MOV{R8{R6{{COPY LENGTH OF CMBLK ! 13229: {{SUB{#4*CMVLS{R6{{SUBTRACT STANDARD LENGTH ! 13230: {{BTW{R6{{{GET NUMBER OF WORDS ! 13231: {{BRN{CGV32{{{JUMP TO GENERATE SUBSCRIPT COUNT ! 13232: * ! 13233: * HERE TO GENERATE CODE FOR FUNCTION CALL ! 13234: * ! 13235: {CGV05{MOV{#4*CMVLS{R7{{SET OFFSET TO FIRST ARGUMENT ! 13236: * ! 13237: * LOOP TO GENERATE CODE FOR ARGUMENTS ! 13238: * ! 13239: {CGV06{BEQ{R7{4*CMLEN(R10){CGV07{JUMP IF ALL GENERATED ! 13240: {{JSR{CMGEN{{{ELSE GEN VALUE CODE FOR NEXT ARG ! 13241: {{BRN{CGV06{{{BACK TO GENERATE NEXT ARGUMENT ! 13242: * ! 13243: * HERE TO GENERATE ACTUAL FUNCTION CALL ! 13244: * ! 13245: {CGV07{SUB{#4*CMVLS{R7{{GET NUMBER OF ARG PTRS (BYTES) ! 13246: {{BTW{R7{{{CONVERT BYTES TO WORDS ! 13247: {{MOV{4*CMOPN(R10){R9{{LOAD FUNCTION VRBLK POINTER ! 13248: {{BNZ{4*VRLEN(R9){CGV12{{JUMP IF NOT SYSTEM FUNCTION ! 13249: {{MOV{4*VRSVP(R9){R10{{LOAD SVBLK PTR IF SYSTEM VAR ! 13250: {{MOV{4*SVBIT(R10){R6{{LOAD BIT MASK ! 13251: {{ANB{BTFFC{R6{{TEST FOR FAST FUNCTION CALL ALLOWED ! 13252: {{ZRB{R6{CGV12{{JUMP IF NOT ! 13253: {{EJC{{{{ ! 13254: * ! 13255: * CDGVL (CONTINUED) ! 13256: * ! 13257: * HERE IF FAST FUNCTION CALL IS ALLOWED ! 13258: * ! 13259: {{MOV{4*SVBIT(R10){R6{{RELOAD BIT INDICATORS ! 13260: {{ANB{BTPRE{R6{{TEST FOR PREEVALUATION OK ! 13261: {{NZB{R6{CGV08{{JUMP IF PREEVALUATION PERMITTED ! 13262: {{MNZ{R8{{{ELSE SET RESULT NON-CONSTANT ! 13263: * ! 13264: * TEST FOR CORRECT NUMBER OF ARGS FOR FAST CALL ! 13265: * ! 13266: {CGV08{MOV{4*VRFNC(R9){R10{{LOAD PTR TO SVFNC FIELD ! 13267: {{MOV{4*FARGS(R10){R6{{LOAD SVNAR FIELD VALUE ! 13268: {{BEQ{R6{R7{CGV11{JUMP IF ARGUMENT COUNT IS CORRECT ! 13269: {{BHI{R6{R7{CGV09{JUMP IF TOO FEW ARGUMENTS GIVEN ! 13270: * ! 13271: * HERE IF TOO MANY ARGUMENTS, PREPARE TO GENERATE O$POPS ! 13272: * ! 13273: {{SUB{R6{R7{{GET NUMBER OF EXTRA ARGS ! 13274: {{LCT{R7{R7{{SET AS COUNT TO CONTROL LOOP ! 13275: {{MOV{#OPOP${R6{{SET POP CALL ! 13276: {{BRN{CGV10{{{JUMP TO COMMON LOOP ! 13277: * ! 13278: * HERE IF TOO FEW ARGUMENTS, PREPARE TO GENERATE NULLS ! 13279: * ! 13280: {CGV09{SUB{R7{R6{{GET NUMBER OF MISSING ARGUMENTS ! 13281: {{LCT{R7{R6{{LOAD AS COUNT TO CONTROL LOOP ! 13282: {{MOV{#NULLS{R6{{LOAD PTR TO NULL CONSTANT ! 13283: * ! 13284: * LOOP TO GENERATE CALLS TO FIX ARGUMENT COUNT ! 13285: * ! 13286: {CGV10{JSR{CDWRD{{{GENERATE ONE CALL ! 13287: {{BCT{R7{CGV10{{LOOP TILL ALL GENERATED ! 13288: * ! 13289: * HERE AFTER ADJUSTING ARG COUNT AS REQUIRED ! 13290: * ! 13291: {CGV11{MOV{R10{R6{{COPY POINTER TO SVFNC FIELD ! 13292: {{BRN{CGV36{{{JUMP TO GENERATE CALL ! 13293: {{EJC{{{{ ! 13294: * ! 13295: * CDGVL (CONTINUED) ! 13296: * ! 13297: * COME HERE IF FAST CALL IS NOT PERMITTED ! 13298: * ! 13299: {CGV12{MOV{#OFNS${R6{{SET ONE ARG CALL IN CASE ! 13300: {{BEQ{R7{#NUM01{CGV13{JUMP IF ONE ARG CASE ! 13301: {{MOV{#OFNC${R6{{ELSE LOAD CALL FOR MORE THAN 1 ARG ! 13302: {{JSR{CDWRD{{{GENERATE IT ! 13303: {{MOV{R7{R6{{COPY ARGUMENT COUNT ! 13304: * ! 13305: * ONE ARG CASE MERGES HERE ! 13306: * ! 13307: {CGV13{JSR{CDWRD{{{GENERATE =O$FNS OR ARG COUNT ! 13308: {{MOV{R9{R6{{COPY VRBLK POINTER ! 13309: {{BRN{CGV32{{{JUMP TO GENERATE VRBLK PTR ! 13310: * ! 13311: * HERE FOR DEFERRED EXPRESSION ! 13312: * ! 13313: {CGV14{MOV{4*CMROP(R10){R10{{POINT TO EXPRESSION TREE ! 13314: {{JSR{CDGEX{{{BUILD EXBLK OR SEBLK ! 13315: {{MOV{R9{R6{{COPY BLOCK PTR ! 13316: {{JSR{CDWRD{{{GENERATE PTR TO EXBLK OR SEBLK ! 13317: {{BRN{CGV34{{{JUMP TO EXIT, CONSTANT TEST ! 13318: * ! 13319: * HERE TO GENERATE CODE FOR SELECTION ! 13320: * ! 13321: {CGV15{ZER{-(SP){{{ZERO PTR TO CHAIN OF FORWARD JUMPS ! 13322: {{ZER{-(SP){{{ZERO PTR TO PREV O$SLC FORWARD PTR ! 13323: {{MOV{#4*CMVLS{R7{{POINT TO FIRST ALTERNATIVE ! 13324: {{MOV{#OSLA${R6{{SET INITIAL CODE WORD ! 13325: * ! 13326: * 0(XS) IS THE OFFSET TO THE PREVIOUS WORD ! 13327: * WHICH REQUIRES FILLING IN WITH AN ! 13328: * OFFSET TO THE FOLLOWING O$SLC,O$SLD ! 13329: * ! 13330: * 1(XS) IS THE HEAD OF A CHAIN OF OFFSET ! 13331: * POINTERS INDICATING THOSE LOCATIONS ! 13332: * TO BE FILLED WITH OFFSETS PAST ! 13333: * THE END OF ALL THE ALTERNATIVES ! 13334: * ! 13335: {CGV16{JSR{CDWRD{{{GENERATE O$SLC (O$SLA FIRST TIME) ! 13336: {{MOV{CWCOF{(SP){{SET CURRENT LOC AS PTR TO FILL IN ! 13337: {{JSR{CDWRD{{{GENERATE GARBAGE WORD THERE FOR NOW ! 13338: {{JSR{CMGEN{{{GEN VALUE CODE FOR ALTERNATIVE ! 13339: {{MOV{#OSLB${R6{{LOAD O$SLB POINTER ! 13340: {{JSR{CDWRD{{{GENERATE O$SLB CALL ! 13341: {{MOV{4*1(SP){R6{{LOAD OLD CHAIN PTR ! 13342: {{MOV{CWCOF{4*1(SP){{SET CURRENT LOC AS NEW CHAIN HEAD ! 13343: {{JSR{CDWRD{{{GENERATE FORWARD CHAIN LINK ! 13344: {{EJC{{{{ ! 13345: * ! 13346: * CDGVL (CONTINUED) ! 13347: * ! 13348: * NOW TO FILL IN THE SKIP OFFSET TO O$SLC,O$SLD ! 13349: * ! 13350: {{MOV{(SP){R9{{LOAD OFFSET TO WORD TO PLUG ! 13351: {{ADD{R$CCB{R9{{POINT TO ACTUAL LOCATION TO PLUG ! 13352: {{MOV{CWCOF{(R9){{PLUG PROPER OFFSET IN ! 13353: {{MOV{#OSLC${R6{{LOAD O$SLC PTR FOR NEXT ALTERNATIVE ! 13354: {{MOV{R7{R9{{COPY OFFSET (DESTROY GARBAGE XR) ! 13355: {{ICA{R9{{{BUMP EXTRA TIME FOR TEST ! 13356: {{BLT{R9{4*CMLEN(R10){CGV16{LOOP BACK IF NOT LAST ALTERNATIVE ! 13357: * ! 13358: * HERE TO GENERATE CODE FOR LAST ALTERNATIVE ! 13359: * ! 13360: {{MOV{#OSLD${R6{{GET HEADER CALL ! 13361: {{JSR{CDWRD{{{GENERATE O$SLD CALL ! 13362: {{JSR{CMGEN{{{GENERATE CODE FOR LAST ALTERNATIVE ! 13363: {{ICA{SP{{{POP OFFSET PTR ! 13364: {{MOV{(SP)+{R9{{LOAD CHAIN PTR ! 13365: * ! 13366: * LOOP TO PLUG OFFSETS PAST STRUCTURE ! 13367: * ! 13368: {CGV17{ADD{R$CCB{R9{{MAKE NEXT PTR ABSOLUTE ! 13369: {{MOV{(R9){R6{{LOAD FORWARD PTR ! 13370: {{MOV{CWCOF{(R9){{PLUG REQUIRED OFFSET ! 13371: {{MOV{R6{R9{{COPY FORWARD PTR ! 13372: {{BNZ{R6{CGV17{{LOOP BACK IF MORE TO GO ! 13373: {{BRN{CGV33{{{ELSE JUMP TO EXIT (NOT CONSTANT) ! 13374: * ! 13375: * HERE FOR BINARY OPS WITH VALUE OPERANDS ! 13376: * ! 13377: {CGV18{MOV{4*CMLOP(R10){R9{{LOAD LEFT OPERAND POINTER ! 13378: {{JSR{CDGVL{{{GEN VALUE CODE FOR LEFT OPERAND ! 13379: * ! 13380: * HERE FOR UNARY OPS WITH VALUE OPERAND (BINOPS MERGE) ! 13381: * ! 13382: {CGV19{MOV{4*CMROP(R10){R9{{LOAD RIGHT (ONLY) OPERAND PTR ! 13383: {{JSR{CDGVL{{{GEN CODE BY VALUE ! 13384: {{EJC{{{{ ! 13385: * ! 13386: * CDGVL (CONTINUED) ! 13387: * ! 13388: * MERGE HERE TO GENERATE OPERATOR CALL FROM CMOPN FIELD ! 13389: * ! 13390: {CGV20{MOV{4*CMOPN(R10){R6{{LOAD OPERATOR CALL POINTER ! 13391: {{BRN{CGV36{{{JUMP TO GENERATE IT WITH CONS TEST ! 13392: * ! 13393: * HERE FOR ASSIGNMENT ! 13394: * ! 13395: {CGV21{MOV{4*CMLOP(R10){R9{{LOAD LEFT OPERAND POINTER ! 13396: {{BLO{(R9){#B$VR${CGV22{JUMP IF NOT VARIABLE ! 13397: * ! 13398: * HERE FOR ASSIGNMENT TO SIMPLE VARIABLE ! 13399: * ! 13400: {{MOV{4*CMROP(R10){R9{{LOAD RIGHT OPERAND PTR ! 13401: {{JSR{CDGVL{{{GENERATE CODE BY VALUE ! 13402: {{MOV{4*CMLOP(R10){R6{{RELOAD LEFT OPERAND VRBLK PTR ! 13403: {{ADD{#4*VRSTO{R6{{POINT TO VRSTO FIELD ! 13404: {{BRN{CGV32{{{JUMP TO GENERATE STORE PTR ! 13405: * ! 13406: * HERE IF NOT SIMPLE VARIABLE ASSIGNMENT ! 13407: * ! 13408: {CGV22{JSR{EXPAP{{{TEST FOR PATTERN MATCH ON LEFT SIDE ! 13409: {{PPM{CGV23{{{JUMP IF NOT PATTERN MATCH ! 13410: * ! 13411: * HERE FOR PATTERN REPLACEMENT ! 13412: * ! 13413: {{MOV{4*CMROP(R9){4*CMLOP(R10){{SAVE PATTERN PTR IN SAFE PLACE ! 13414: {{MOV{4*CMLOP(R9){R9{{LOAD SUBJECT PTR ! 13415: {{JSR{CDGNM{{{GEN CODE BY NAME FOR SUBJECT ! 13416: {{MOV{4*CMLOP(R10){R9{{LOAD PATTERN PTR ! 13417: {{JSR{CDGVL{{{GEN CODE BY VALUE FOR PATTERN ! 13418: {{MOV{#OPMN${R6{{LOAD MATCH BY NAME CALL ! 13419: {{JSR{CDWRD{{{GENERATE IT ! 13420: {{MOV{4*CMROP(R10){R9{{LOAD REPLACEMENT VALUE PTR ! 13421: {{JSR{CDGVL{{{GEN CODE BY VALUE ! 13422: {{MOV{#ORPL${R6{{LOAD REPLACE CALL ! 13423: {{BRN{CGV32{{{JUMP TO GEN AND EXIT (NOT CONSTANT) ! 13424: * ! 13425: * HERE FOR ASSIGNMENT TO COMPLEX VARIABLE ! 13426: * ! 13427: {CGV23{MNZ{R8{{{INHIBIT PRE-EVALUATION ! 13428: {{JSR{CDGNM{{{GEN CODE BY NAME FOR LEFT SIDE ! 13429: {{BRN{CGV31{{{MERGE WITH UNOP CIRCUIT ! 13430: {{EJC{{{{ ! 13431: * ! 13432: * CDGVL (CONTINUED) ! 13433: * ! 13434: * HERE FOR CONCATENATION ! 13435: * ! 13436: {CGV24{MOV{4*CMLOP(R10){R9{{LOAD LEFT OPERAND PTR ! 13437: {{BNE{(R9){#B$CMT{CGV18{ORDINARY BINOP IF NOT CMBLK ! 13438: {{MOV{4*CMTYP(R9){R7{{LOAD CMBLK TYPE CODE ! 13439: {{BEQ{R7{#C$INT{CGV25{SPECIAL CASE IF INTERROGATION ! 13440: {{BEQ{R7{#C$NEG{CGV25{OR NEGATION ! 13441: {{BNE{R7{#C$FNC{CGV18{ELSE ORDINARY BINOP IF NOT FUNCTION ! 13442: {{MOV{4*CMOPN(R9){R9{{ELSE LOAD FUNCTION VRBLK PTR ! 13443: {{BNZ{4*VRLEN(R9){CGV18{{ORDINARY BINOP IF NOT SYSTEM VAR ! 13444: {{MOV{4*VRSVP(R9){R9{{ELSE POINT TO SVBLK ! 13445: {{MOV{4*SVBIT(R9){R6{{LOAD BIT INDICATORS ! 13446: {{ANB{BTPRD{R6{{TEST FOR PREDICATE FUNCTION ! 13447: {{ZRB{R6{CGV18{{ORDINARY BINOP IF NOT ! 13448: * ! 13449: * HERE IF LEFT ARG OF CONCATENATION IS PREDICATE FUNCTION ! 13450: * ! 13451: {CGV25{MOV{4*CMLOP(R10){R9{{RELOAD LEFT ARG ! 13452: {{JSR{CDGVL{{{GEN CODE BY VALUE ! 13453: {{MOV{#OPOP${R6{{LOAD POP CALL ! 13454: {{JSR{CDWRD{{{GENERATE IT ! 13455: {{MOV{4*CMROP(R10){R9{{LOAD RIGHT OPERAND ! 13456: {{JSR{CDGVL{{{GEN CODE BY VALUE AS RESULT CODE ! 13457: {{BRN{CGV33{{{EXIT (NOT CONSTANT) ! 13458: * ! 13459: * HERE TO GENERATE CODE FOR PATTERN, IMMEDIATE ASSIGNMENT ! 13460: * ! 13461: {CGV26{MOV{4*CMLOP(R10){R9{{LOAD LEFT OPERAND ! 13462: {{JSR{CDGVL{{{GEN CODE BY VALUE, MERGE ! 13463: * ! 13464: * HERE FOR UNOPS WITH ARG BY NAME (BINARY $ . MERGE) ! 13465: * ! 13466: {CGV27{MOV{4*CMROP(R10){R9{{LOAD RIGHT OPERAND PTR ! 13467: {{JSR{CDGNM{{{GEN CODE BY NAME FOR RIGHT ARG ! 13468: {{MOV{4*CMOPN(R10){R9{{GET OPERATOR CODE WORD ! 13469: {{BNE{(R9){#O$KWV{CGV20{GEN CALL UNLESS KEYWORD VALUE ! 13470: {{EJC{{{{ ! 13471: * ! 13472: * CDGVL (CONTINUED) ! 13473: * ! 13474: * HERE FOR KEYWORD BY VALUE. THIS IS CONSTANT ONLY IF ! 13475: * THE OPERAND IS ONE OF THE SPECIAL SYSTEM VARIABLES WITH ! 13476: * THE SVCKW BIT SET TO INDICATE A CONSTANT KEYWORD VALUE. ! 13477: * NOTE THAT THE ONLY CONSTANT OPERAND BY NAME IS A VARIABLE ! 13478: * ! 13479: {{BNZ{R8{CGV20{{GEN CALL IF NON-CONSTANT (NOT VAR) ! 13480: {{MNZ{R8{{{ELSE SET NON-CONSTANT IN CASE ! 13481: {{MOV{4*CMROP(R10){R9{{LOAD PTR TO OPERAND VRBLK ! 13482: {{BNZ{4*VRLEN(R9){CGV20{{GEN (NON-CONSTANT) IF NOT SYS VAR ! 13483: {{MOV{4*VRSVP(R9){R9{{ELSE LOAD PTR TO SVBLK ! 13484: {{MOV{4*SVBIT(R9){R6{{LOAD BIT MASK ! 13485: {{ANB{BTCKW{R6{{TEST FOR CONSTANT KEYWORD ! 13486: {{ZRB{R6{CGV20{{GO GEN IF NOT CONSTANT ! 13487: {{ZER{R8{{{ELSE SET RESULT CONSTANT ! 13488: {{BRN{CGV20{{{AND JUMP BACK TO GENERATE CALL ! 13489: * ! 13490: * HERE TO GENERATE CODE FOR NEGATION ! 13491: * ! 13492: {CGV28{MOV{#ONTA${R6{{GET INITIAL WORD ! 13493: {{JSR{CDWRD{{{GENERATE IT ! 13494: {{MOV{CWCOF{R7{{SAVE NEXT OFFSET ! 13495: {{JSR{CDWRD{{{GENERATE GUNK WORD FOR NOW ! 13496: {{MOV{4*CMROP(R10){R9{{LOAD RIGHT OPERAND PTR ! 13497: {{JSR{CDGVL{{{GEN CODE BY VALUE ! 13498: {{MOV{#ONTB${R6{{LOAD END OF EVALUATION CALL ! 13499: {{JSR{CDWRD{{{GENERATE IT ! 13500: {{MOV{R7{R9{{COPY OFFSET TO WORD TO PLUG ! 13501: {{ADD{R$CCB{R9{{POINT TO ACTUAL WORD TO PLUG ! 13502: {{MOV{CWCOF{(R9){{PLUG WORD WITH CURRENT OFFSET ! 13503: {{MOV{#ONTC${R6{{LOAD FINAL CALL ! 13504: {{BRN{CGV32{{{JUMP TO GENERATE IT (NOT CONSTANT) ! 13505: * ! 13506: * HERE TO GENERATE CODE FOR UNDEFINED BINARY OPERATOR ! 13507: * ! 13508: {CGV29{MOV{4*CMLOP(R10){R9{{LOAD LEFT OPERAND PTR ! 13509: {{JSR{CDGVL{{{GENERATE CODE BY VALUE ! 13510: {{EJC{{{{ ! 13511: * ! 13512: * CDGVL (CONTINUED) ! 13513: * ! 13514: * HERE TO GENERATE CODE FOR UNDEFINED UNARY OPERATOR ! 13515: * ! 13516: {CGV30{MOV{#C$UO${R7{{SET UNOP CODE + 1 ! 13517: {{SUB{4*CMTYP(R10){R7{{SET NUMBER OF ARGS (1 OR 2) ! 13518: * ! 13519: * MERGE HERE FOR UNDEFINED OPERATORS ! 13520: * ! 13521: {{MOV{4*CMROP(R10){R9{{LOAD RIGHT (ONLY) OPERAND POINTER ! 13522: {{JSR{CDGVL{{{GEN VALUE CODE FOR RIGHT OPERAND ! 13523: {{MOV{4*CMOPN(R10){R9{{LOAD POINTER TO OPERATOR DV ! 13524: {{MOV{4*DVOPN(R9){R9{{LOAD POINTER OFFSET ! 13525: {{WTB{R9{{{CONVERT WORD OFFSET TO BYTES ! 13526: {{ADD{#R$UBA{R9{{POINT TO PROPER FUNCTION PTR ! 13527: {{SUB{#4*VRFNC{R9{{SET STANDARD FUNCTION OFFSET ! 13528: {{BRN{CGV12{{{MERGE WITH FUNCTION CALL CIRCUIT ! 13529: * ! 13530: * HERE TO GENERATE CODE FOR INTERROGATION, INDIRECTION ! 13531: * ! 13532: {CGV31{MNZ{R8{{{SET NON CONSTANT ! 13533: {{BRN{CGV19{{{MERGE ! 13534: * ! 13535: * HERE TO EXIT GENERATING A WORD, RESULT NOT CONSTANT ! 13536: * ! 13537: {CGV32{JSR{CDWRD{{{GENERATE WORD, MERGE ! 13538: * ! 13539: * HERE TO EXIT WITH NO WORD GENERATED, NOT CONSTANT ! 13540: * ! 13541: {CGV33{MNZ{R8{{{INDICATE RESULT IS NOT CONSTANT ! 13542: * ! 13543: * COMMON EXIT POINT ! 13544: * ! 13545: {CGV34{ICA{SP{{{POP INITIAL CODE OFFSET ! 13546: {{MOV{(SP)+{R6{{RESTORE OLD CONSTANT FLAG ! 13547: {{MOV{(SP)+{R10{{RESTORE ENTRY XL ! 13548: {{MOV{(SP)+{R7{{RESTORE ENTRY WB ! 13549: {{BNZ{R8{CGV35{{JUMP IF NOT CONSTANT ! 13550: {{MOV{R6{R8{{ELSE RESTORE ENTRY CONSTANT FLAG ! 13551: * ! 13552: * HERE TO RETURN AFTER DEALING WITH WC SETTING ! 13553: * ! 13554: {CGV35{EXI{{{{RETURN TO CDGVL CALLER ! 13555: * ! 13556: * EXIT HERE TO GENERATE WORD AND TEST FOR CONSTANT ! 13557: * ! 13558: {CGV36{JSR{CDWRD{{{GENERATE WORD ! 13559: {{BNZ{R8{CGV34{{JUMP TO EXIT IF NOT CONSTANT ! 13560: {{EJC{{{{ ! 13561: * ! 13562: * CDGVL (CONTINUED) ! 13563: * ! 13564: * HERE TO PREEVALUATE CONSTANT SUB-EXPRESSION ! 13565: * ! 13566: {{MOV{#ORVL${R6{{LOAD CALL TO RETURN VALUE ! 13567: {{JSR{CDWRD{{{GENERATE IT ! 13568: {{MOV{(SP){R10{{LOAD INITIAL CODE OFFSET ! 13569: {{JSR{EXBLD{{{BUILD EXBLK FOR EXPRESSION ! 13570: {{ZER{R7{{{SET TO EVALUATE BY VALUE ! 13571: {{JSR{EVALX{{{EVALUATE EXPRESSION ! 13572: {{PPM{{{{SHOULD NOT FAIL ! 13573: {{MOV{(R9){R6{{LOAD TYPE WORD OF RESULT ! 13574: {{BLO{R6{#P$AAA{CGV37{JUMP IF NOT PATTERN ! 13575: {{MOV{#OLPT${R6{{ELSE LOAD SPECIAL PATTERN LOAD CALL ! 13576: {{JSR{CDWRD{{{GENERATE IT ! 13577: * ! 13578: * MERGE HERE TO GENERATE POINTER TO RESULTING CONSTANT ! 13579: * ! 13580: {CGV37{MOV{R9{R6{{COPY CONSTANT POINTER ! 13581: {{JSR{CDWRD{{{GENERATE PTR ! 13582: {{ZER{R8{{{SET RESULT CONSTANT ! 13583: {{BRN{CGV34{{{JUMP BACK TO EXIT ! 13584: {{ENP{{{{END PROCEDURE CDGVL ! 13585: {{EJC{{{{ ! 13586: * ! 13587: * CDWRD -- GENERATE ONE WORD OF CODE ! 13588: * ! 13589: * CDWRD WRITES ONE WORD INTO THE CURRENT CODE BLOCK UNDER ! 13590: * CONSTRUCTION. A NEW, LARGER, BLOCK IS ALLOCATED IF THERE ! 13591: * IS INSUFFICIENT ROOM IN THE CURRENT BLOCK. CDWRD ENSURES ! 13592: * THAT THERE ARE AT LEAST THREE WORDS LEFT IN THE BLOCK ! 13593: * AFTER ENTERING THE NEW WORD. THIS GUARANTEES THAT ANY ! 13594: * EXTRA SPACE AT THE END CAN BE SPLIT OFF AS A CCBLK. ! 13595: * ! 13596: * (WA) WORD TO BE GENERATED ! 13597: * JSR CDWRD CALL TO GENERATE WORD ! 13598: * ! 13599: {CDWRD{PRC{E{0{{ENTRY POINT ! 13600: {{MOV{R9{-(SP){{SAVE ENTRY XR ! 13601: {{MOV{R6{-(SP){{SAVE CODE WORD TO BE GENERATED ! 13602: * ! 13603: * MERGE BACK HERE AFTER ALLOCATING LARGER BLOCK ! 13604: * ! 13605: {CDWD1{MOV{R$CCB{R9{{LOAD PTR TO CCBLK BEING BUILT ! 13606: {{BNZ{R9{CDWD2{{JUMP IF BLOCK ALLOCATED ! 13607: * ! 13608: * HERE WE ALLOCATE AN ENTIRELY FRESH BLOCK ! 13609: * ! 13610: {{MOV{#4*E$CBS{R6{{LOAD INITIAL LENGTH ! 13611: {{JSR{ALLOC{{{ALLOCATE CCBLK ! 13612: {{MOV{#B$CCT{(R9){{STORE TYPE WORD ! 13613: {{MOV{#4*CCCOD{CWCOF{{SET INITIAL OFFSET ! 13614: {{MOV{R6{4*CCLEN(R9){{STORE BLOCK LENGTH ! 13615: {{MOV{R9{R$CCB{{STORE PTR TO NEW BLOCK ! 13616: * ! 13617: * HERE WE HAVE A BLOCK WE CAN USE ! 13618: * ! 13619: {CDWD2{MOV{CWCOF{R6{{LOAD CURRENT OFFSET ! 13620: {{ADD{#4*NUM04{R6{{ADJUST FOR TEST (FOUR WORDS) ! 13621: {{BLO{R6{4*CCLEN(R9){CDWD4{JUMP IF ROOM IN THIS BLOCK ! 13622: * ! 13623: * HERE IF NO ROOM IN CURRENT BLOCK ! 13624: * ! 13625: {{BGE{R6{MXLEN{CDWD5{JUMP IF ALREADY AT MAX SIZE ! 13626: {{ADD{#4*E$CBS{R6{{ELSE GET NEW SIZE ! 13627: {{MOV{R10{-(SP){{SAVE ENTRY XL ! 13628: {{MOV{R9{R10{{COPY POINTER ! 13629: {{BLT{R6{MXLEN{CDWD3{JUMP IF NOT TOO LARGE ! 13630: {{MOV{MXLEN{R6{{ELSE RESET TO MAX ALLOWED SIZE ! 13631: {{EJC{{{{ ! 13632: * ! 13633: * CDWRD (CONTINUED) ! 13634: * ! 13635: * HERE WITH NEW BLOCK SIZE IN WA ! 13636: * ! 13637: {CDWD3{JSR{ALLOC{{{ALLOCATE NEW BLOCK ! 13638: {{MOV{R9{R$CCB{{STORE POINTER TO NEW BLOCK ! 13639: {{MOV{#B$CCT{(R9)+{{STORE TYPE WORD IN NEW BLOCK ! 13640: {{MOV{R6{(R9)+{{STORE BLOCK LENGTH ! 13641: {{ADD{#4*CCUSE{R10{{POINT TO CCUSE,CCCOD FIELDS IN OLD ! 13642: {{MOV{(R10){R6{{LOAD CCUSE VALUE ! 13643: {{MVW{{{{COPY USEFUL WORDS FROM OLD BLOCK ! 13644: {{MOV{(SP)+{R10{{RESTORE XL ! 13645: {{BRN{CDWD1{{{MERGE BACK TO TRY AGAIN ! 13646: * ! 13647: * HERE WITH ROOM IN CURRENT BLOCK ! 13648: * ! 13649: {CDWD4{MOV{CWCOF{R6{{LOAD CURRENT OFFSET ! 13650: {{ICA{R6{{{GET NEW OFFSET ! 13651: {{MOV{R6{CWCOF{{STORE NEW OFFSET ! 13652: {{MOV{R6{4*CCUSE(R9){{STORE IN CCBLK FOR GBCOL ! 13653: {{DCA{R6{{{RESTORE PTR TO THIS WORD ! 13654: {{ADD{R6{R9{{POINT TO CURRENT ENTRY ! 13655: {{MOV{(SP)+{R6{{RELOAD WORD TO GENERATE ! 13656: {{MOV{R6{(R9){{STORE WORD IN BLOCK ! 13657: {{MOV{(SP)+{R9{{RESTORE ENTRY XR ! 13658: {{EXI{{{{RETURN TO CALLER ! 13659: * ! 13660: * HERE IF COMPILED CODE IS TOO LONG FOR CDBLK ! 13661: * ! 13662: {CDWD5{ERB{213{SYNTAX{{ERROR. STATEMENT IS TOO COMPLICATED. ! 13663: {{ENP{{{{END PROCEDURE CDWRD ! 13664: {{EJC{{{{ ! 13665: * ! 13666: * CMGEN -- GENERATE CODE FOR CMBLK PTR ! 13667: * ! 13668: * CMGEN IS A SUBSIDIARY PROCEDURE USED TO GENERATE VALUE ! 13669: * CODE FOR A CMBLK PTR FROM THE MAIN CODE GENERATORS. ! 13670: * ! 13671: * (XL) CMBLK POINTER ! 13672: * (WB) OFFSET TO POINTER IN CMBLK ! 13673: * JSR CMGEN CALL TO GENERATE CODE ! 13674: * (XR,WA) DESTROYED ! 13675: * (WB) BUMPED BY ONE WORD ! 13676: * ! 13677: {CMGEN{PRC{R{0{{ENTRY POINT, RECURSIVE ! 13678: {{MOV{R10{R9{{COPY CMBLK POINTER ! 13679: {{ADD{R7{R9{{POINT TO CMBLK POINTER ! 13680: {{MOV{(R9){R9{{LOAD CMBLK POINTER ! 13681: {{JSR{CDGVL{{{GENERATE CODE BY VALUE ! 13682: {{ICA{R7{{{BUMP OFFSET ! 13683: {{EXI{{{{RETURN TO CALLER ! 13684: {{ENP{{{{END PROCEDURE CMGEN ! 13685: {{EJC{{{{ ! 13686: * ! 13687: * CMPIL (COMPILE SOURCE CODE) ! 13688: * ! 13689: * CMPIL IS USED TO CONVERT SNOBOL4 SOURCE CODE TO INTERNAL ! 13690: * FORM (SEE CDBLK FORMAT). IT IS USED BOTH FOR THE INITIAL ! 13691: * COMPILE AND AT RUN TIME BY THE CODE AND CONVERT FUNCTIONS ! 13692: * THIS PROCEDURE HAS CONTROL FOR THE ENTIRE DURATION OF ! 13693: * INITIAL COMPILATION. AN ERROR IN ANY PROCEDURE CALLED ! 13694: * DURING COMPILATION WILL LEAD FIRST TO THE ERROR SECTION ! 13695: * AND ULTIMATELY BACK HERE FOR RESUMED COMPILATION. THE ! 13696: * RE-ENTRY POINTS AFTER AN ERROR ARE SPECIALLY LABELLED - ! 13697: * ! 13698: * CMPCE RESUME AFTER CONTROL CARD ERROR ! 13699: * CMPLE RESUME AFTER LABEL ERROR ! 13700: * CMPSE RESUME AFTER STATEMENT ERROR ! 13701: * ! 13702: * JSR CMPIL CALL TO COMPILE CODE ! 13703: * (XR) PTR TO CDBLK FOR ENTRY STATEMENT ! 13704: * (XL,WA,WB,WC,RA) DESTROYED ! 13705: * ! 13706: * THE FOLLOWING GLOBAL VARIABLES ARE REFERENCED ! 13707: * ! 13708: * CMPSN NUMBER OF NEXT STATEMENT ! 13709: * TO BE COMPILED. ! 13710: * ! 13711: * CSWXX CONTROL CARD SWITCH VALUES ARE ! 13712: * CHANGED WHEN RELEVANT CONTROL ! 13713: * CARDS ARE MET. ! 13714: * ! 13715: * CWCOF OFFSET TO NEXT WORD IN CODE BLOCK ! 13716: * BEING BUILT (SEE CDWRD). ! 13717: * ! 13718: * LSTSN NUMBER OF STATEMENT MOST RECENTLY ! 13719: * COMPILED (INITIALLY SET TO ZERO). ! 13720: * ! 13721: * R$CIM CURRENT (INITIAL) COMPILER IMAGE ! 13722: * (ZERO FOR INITIAL COMPILE CALL) ! 13723: * ! 13724: * R$CNI USED TO POINT TO FOLLOWING IMAGE. ! 13725: * (SEE READR PROCEDURE). ! 13726: * ! 13727: * SCNGO GOTO SWITCH FOR SCANE PROCEDURE ! 13728: * ! 13729: * SCNIL LENGTH OF CURRENT IMAGE EXCLUDING ! 13730: * CHARACTERS REMOVED BY -INPUT. ! 13731: * ! 13732: * SCNPT CURRENT SCAN OFFSET, SEE SCANE. ! 13733: * ! 13734: * SCNRS RESCAN SWITCH FOR SCANE PROCEDURE. ! 13735: * ! 13736: * SCNSE OFFSET (IN R$CIM) OF MOST RECENTLY ! 13737: * SCANNED ELEMENT. SET ZERO IF NOT ! 13738: * CURRENTLY SCANNING ITEMS ! 13739: {{EJC{{{{ ! 13740: * ! 13741: * CMPIL (CONTINUED) ! 13742: * ! 13743: * STAGE STGIC INITIAL COMPILE IN PROGRESS ! 13744: * STGXC CODE/CONVERT COMPILE ! 13745: * STGEV BUILDING EXBLK FOR EVAL ! 13746: * STGXT EXECUTE TIME (OUTSIDE COMPILE) ! 13747: * STGCE INITIAL COMPILE AFTER END LINE ! 13748: * STGXE EXECUTE COMPILE AFTER END LINE ! 13749: * ! 13750: * CMPIL ALSO USES A FIXED NUMBER OF LOCATIONS ON THE ! 13751: * MAIN STACK AS FOLLOWS. (THE DEFINITIONS OF THE ACTUAL ! 13752: * OFFSETS ARE IN THE DEFINITIONS SECTION). ! 13753: * ! 13754: * CMSTM(XS) POINTER TO EXPAN TREE FOR BODY OF ! 13755: * STATEMENT (SEE EXPAN PROCEDURE). ! 13756: * ! 13757: * CMSGO(XS) POINTER TO TREE REPRESENTATION OF ! 13758: * SUCCESS GOTO (SEE PROCEDURE SCNGO)9 ! 13759: * ZERO IF NO SUCCESS GOTO IS GIVEN ! 13760: * ! 13761: * CMFGO(XS) LIKE CMSGO FOR FAILURE GOTO. ! 13762: * ! 13763: * CMCGO(XS) SET NON-ZERO ONLY IF THERE IS A ! 13764: * CONDITIONAL GOTO. USED FOR -FAIL, ! 13765: * -NOFAIL CODE GENERATION. ! 13766: * ! 13767: * CMPCD(XS) POINTER TO CDBLK FOR PREVIOUS ! 13768: * STATEMENT. ZERO FOR 1ST STATEMENT. ! 13769: * ! 13770: * CMFFP(XS) SET NON-ZERO IF CDFAL IN PREVIOUS ! 13771: * CDBLK NEEDS FILLING WITH FORWARD ! 13772: * POINTER, ELSE SET TO ZERO. ! 13773: * ! 13774: * CMFFC(XS) SAME AS CMFFP FOR CURRENT CDBLK ! 13775: * ! 13776: * CMSOP(XS) OFFSET TO WORD IN PREVIOUS CDBLK ! 13777: * TO BE FILLED IN WITH FORWARD PTR ! 13778: * TO NEXT CDBLK FOR SUCCESS GOTO. ! 13779: * ZERO IF NO FILL IN IS REQUIRED. ! 13780: * ! 13781: * CMSOC(XS) SAME AS CMSOP FOR CURRENT CDBLK. ! 13782: * ! 13783: * CMLBL(XS) POINTER TO VRBLK FOR LABEL OF ! 13784: * CURRENT STATEMENT. ZERO IF NO LABEL ! 13785: * ! 13786: * CMTRA(XS) POINTER TO CDBLK FOR ENTRY STMNT. ! 13787: {{EJC{{{{ ! 13788: * ! 13789: * CMPIL (CONTINUED) ! 13790: * ! 13791: * ENTRY POINT ! 13792: * ! 13793: {CMPIL{PRC{E{0{{ENTRY POINT ! 13794: {{LCT{R7{#CMNEN{{SET NUMBER OF STACK WORK LOCATIONS ! 13795: * ! 13796: * LOOP TO INITIALIZE STACK WORKING LOCATIONS ! 13797: * ! 13798: {CMP00{ZER{-(SP){{{STORE A ZERO, MAKE ONE ENTRY ! 13799: {{BCT{R7{CMP00{{LOOP BACK UNTIL ALL SET ! 13800: {{MOV{SP{CMPXS{{SAVE STACK POINTER FOR ERROR SEC ! 13801: {{SSS{CMPSS{{{SAVE S-R STACK POINTER IF ANY ! 13802: * ! 13803: * LOOP THROUGH STATEMENTS ! 13804: * ! 13805: {CMP01{MOV{SCNPT{R7{{SET SCAN POINTER OFFSET ! 13806: {{MOV{R7{SCNSE{{SET START OF ELEMENT LOCATION ! 13807: {{MOV{#OCER${R6{{POINT TO COMPILE ERROR CALL ! 13808: {{JSR{CDWRD{{{GENERATE AS TEMPORARY CDFAL ! 13809: {{BLT{R7{SCNIL{CMP04{JUMP IF CHARS LEFT ON THIS IMAGE ! 13810: * ! 13811: * LOOP HERE AFTER COMMENT OR CONTROL CARD ! 13812: * ALSO SPECIAL ENTRY AFTER CONTROL CARD ERROR ! 13813: * ! 13814: {CMPCE{ZER{R9{{{CLEAR POSSIBLE GARBAGE XR VALUE ! 13815: {{BNE{STAGE{#STGIC{CMP02{SKIP UNLESS INITIAL COMPILE ! 13816: {{JSR{READR{{{READ NEXT INPUT IMAGE ! 13817: {{BZE{R9{CMP09{{JUMP IF NO INPUT AVAILABLE ! 13818: {{JSR{NEXTS{{{ACQUIRE NEXT SOURCE IMAGE ! 13819: {{MOV{CMPSN{LSTSN{{STORE STMT NO FOR USE BY LISTR ! 13820: {{ZER{SCNPT{{{RESET SCAN POINTER ! 13821: {{BRN{CMP04{{{GO PROCESS IMAGE ! 13822: * ! 13823: * FOR EXECUTE TIME COMPILE, PERMIT EMBEDDED CONTROL CARDS ! 13824: * AND COMMENTS (BY SKIPPING TO NEXT SEMI-COLON) ! 13825: * ! 13826: {CMP02{MOV{R$CIM{R9{{GET CURRENT IMAGE ! 13827: {{MOV{SCNPT{R7{{GET CURRENT OFFSET ! 13828: {{PLC{R9{R7{{PREPARE TO GET CHARS ! 13829: * ! 13830: * SKIP TO SEMI-COLON ! 13831: * ! 13832: {CMP03{LCH{R8{(R9)+{{GET CHAR ! 13833: {{ICV{SCNPT{{{ADVANCE OFFSET ! 13834: {{BEQ{R8{#CH$SM{CMP04{SKIP IF SEMI-COLON FOUND ! 13835: {{BLT{SCNPT{SCNIL{CMP03{LOOP IF MORE CHARS ! 13836: {{ZER{R9{{{CLEAR GARBAGE XR VALUE ! 13837: {{BRN{CMP09{{{END OF IMAGE ! 13838: {{EJC{{{{ ! 13839: * ! 13840: * CMPIL (CONTINUED) ! 13841: * ! 13842: * HERE WITH IMAGE AVAILABLE TO SCAN. NOTE THAT IF THE INPUT ! 13843: * STRING IS NULL, THEN EVERYTHING IS OK SINCE NULL IS ! 13844: * ACTUALLY ASSEMBLED AS A WORD OF BLANKS. ! 13845: * ! 13846: {CMP04{MOV{R$CIM{R9{{POINT TO CURRENT IMAGE ! 13847: {{MOV{SCNPT{R7{{LOAD CURRENT OFFSET ! 13848: {{MOV{R7{R6{{COPY FOR LABEL SCAN ! 13849: {{PLC{R9{R7{{POINT TO FIRST CHARACTER ! 13850: {{LCH{R8{(R9)+{{LOAD FIRST CHARACTER ! 13851: {{BEQ{R8{#CH$SM{CMP12{NO LABEL IF SEMICOLON ! 13852: {{BEQ{R8{#CH$AS{CMPCE{LOOP BACK IF COMMENT CARD ! 13853: {{BEQ{R8{#CH$MN{CMP32{JUMP IF CONTROL CARD ! 13854: {{MOV{R$CIM{R$CMP{{ABOUT TO DESTROY R$CIM ! 13855: {{MOV{#CMLAB{R10{{POINT TO LABEL WORK STRING ! 13856: {{MOV{R10{R$CIM{{SCANE IS TO SCAN WORK STRING ! 13857: {{PSC{R10{{{POINT TO FIRST CHARACTER POSITION ! 13858: {{SCH{R8{(R10)+{{STORE CHAR JUST LOADED ! 13859: {{MOV{#CH$SM{R8{{GET A SEMICOLON ! 13860: {{SCH{R8{(R10){{STORE AFTER FIRST CHAR ! 13861: {{CSC{R10{{{FINISHED CHARACTER STORING ! 13862: {{ZER{R10{{{CLEAR POINTER ! 13863: {{ZER{SCNPT{{{START AT FIRST CHARACTER ! 13864: {{MOV{SCNIL{-(SP){{PRESERVE IMAGE LENGTH ! 13865: {{MOV{#NUM02{SCNIL{{READ 2 CHARS AT MOST ! 13866: {{JSR{SCANE{{{SCAN FIRST CHAR FOR TYPE ! 13867: {{MOV{(SP)+{SCNIL{{RESTORE IMAGE LENGTH ! 13868: {{MOV{R10{R8{{NOTE RETURN CODE ! 13869: {{MOV{R$CMP{R10{{GET OLD R$CIM ! 13870: {{MOV{R10{R$CIM{{PUT IT BACK ! 13871: {{MOV{R7{SCNPT{{REINSTATE OFFSET ! 13872: {{BNZ{SCNBL{CMP12{{BLANK SEEN - CANT BE LABEL ! 13873: {{MOV{R10{R9{{POINT TO CURRENT IMAGE ! 13874: {{PLC{R9{R7{{POINT TO FIRST CHAR AGAIN ! 13875: {{BEQ{R8{#T$VAR{CMP06{OK IF LETTER ! 13876: {{BEQ{R8{#T$CON{CMP06{OK IF DIGIT ! 13877: * ! 13878: * DROP IN OR JUMP FROM ERROR SECTION IF SCANE FAILED ! 13879: * ! 13880: {CMPLE{MOV{R$CMP{R$CIM{{POINT TO BAD LINE ! 13881: {{ERB{214{BAD{{LABEL OR MISPLACED CONTINUATION LINE ! 13882: * ! 13883: * LOOP TO SCAN LABEL ! 13884: * ! 13885: {CMP05{BEQ{R8{#CH$SM{CMP07{SKIP IF SEMICOLON ! 13886: {{ICV{R6{{{BUMP OFFSET ! 13887: {{BEQ{R6{SCNIL{CMP07{JUMP IF END OF IMAGE (LABEL END) ! 13888: {{EJC{{{{ ! 13889: * ! 13890: * CMPIL (CONTINUED) ! 13891: * ! 13892: * ENTER LOOP AT THIS POINT ! 13893: * ! 13894: {CMP06{LCH{R8{(R9)+{{ELSE LOAD NEXT CHARACTER ! 13895: {{BEQ{R8{#CH$HT{CMP07{JUMP IF HORIZONTAL TAB ! 13896: {{BNE{R8{#CH$BL{CMP05{LOOP BACK IF NON-BLANK ! 13897: * ! 13898: * HERE AFTER SCANNING OUT LABEL ! 13899: * ! 13900: {CMP07{MOV{R6{SCNPT{{SAVE UPDATED SCAN OFFSET ! 13901: {{SUB{R7{R6{{GET LENGTH OF LABEL ! 13902: {{BZE{R6{CMP12{{SKIP IF LABEL LENGTH ZERO ! 13903: {{ZER{R9{{{CLEAR GARBAGE XR VALUE ! 13904: {{JSR{SBSTR{{{BUILD SCBLK FOR LABEL NAME ! 13905: {{JSR{GTNVR{{{LOCATE/CONTRUCT VRBLK ! 13906: {{PPM{{{{DUMMY (IMPOSSIBLE) ERROR RETURN ! 13907: {{MOV{R9{4*CMLBL(SP){{STORE LABEL POINTER ! 13908: {{BNZ{4*VRLEN(R9){CMP11{{JUMP IF NOT SYSTEM LABEL ! 13909: {{BNE{4*VRSVP(R9){#V$END{CMP11{JUMP IF NOT END LABEL ! 13910: * ! 13911: * HERE FOR END LABEL SCANNED OUT ! 13912: * ! 13913: {{ADD{#STGND{STAGE{{ADJUST STAGE APPROPRIATELY ! 13914: {{JSR{SCANE{{{SCAN OUT NEXT ELEMENT ! 13915: {{BEQ{R10{#T$SMC{CMP10{JUMP IF END OF IMAGE ! 13916: {{BNE{R10{#T$VAR{CMP08{ELSE ERROR IF NOT VARIABLE ! 13917: * ! 13918: * HERE CHECK FOR VALID INITIAL TRANSFER ! 13919: * ! 13920: {{BEQ{4*VRLBL(R9){#STNDL{CMP08{JUMP IF NOT DEFINED (ERROR) ! 13921: {{MOV{4*VRLBL(R9){4*CMTRA(SP){{ELSE SET INITIAL ENTRY POINTER ! 13922: {{JSR{SCANE{{{SCAN NEXT ELEMENT ! 13923: {{BEQ{R10{#T$SMC{CMP10{JUMP IF OK (END OF IMAGE) ! 13924: * ! 13925: * HERE FOR BAD TRANSFER LABEL ! 13926: * ! 13927: {CMP08{ERB{215{SYNTAX{{ERROR. UNDEFINED OR ERRONEOUS ENTRY LABEL ! 13928: * ! 13929: * HERE FOR END OF INPUT (NO END LABEL DETECTED) ! 13930: * ! 13931: {CMP09{ADD{#STGND{STAGE{{ADJUST STAGE APPROPRIATELY ! 13932: {{BEQ{STAGE{#STGXE{CMP10{JUMP IF CODE CALL (OK) ! 13933: {{ERB{216{SYNTAX{{ERROR. MISSING END LINE ! 13934: * ! 13935: * HERE AFTER PROCESSING END LINE (MERGE HERE ON END ERROR) ! 13936: * ! 13937: {CMP10{MOV{#OSTP${R6{{SET STOP CALL POINTER ! 13938: {{JSR{CDWRD{{{GENERATE AS STATEMENT CALL ! 13939: {{BRN{CMPSE{{{JUMP TO GENERATE AS FAILURE ! 13940: {{EJC{{{{ ! 13941: * ! 13942: * CMPIL (CONTINUED) ! 13943: * ! 13944: * HERE AFTER PROCESSING LABEL OTHER THAN END ! 13945: * ! 13946: {CMP11{BNE{STAGE{#STGIC{CMP12{JUMP IF CODE CALL - REDEF. OK ! 13947: {{BEQ{4*VRLBL(R9){#STNDL{CMP12{ELSE CHECK FOR REDEFINITION ! 13948: {{ZER{4*CMLBL(SP){{{LEAVE FIRST LABEL DECLN UNDISTURBED ! 13949: {{ERB{217{SYNTAX{{ERROR. DUPLICATE LABEL ! 13950: * ! 13951: * HERE AFTER DEALING WITH LABEL ! 13952: * ! 13953: {CMP12{ZER{R7{{{SET FLAG FOR STATEMENT BODY ! 13954: {{JSR{EXPAN{{{GET TREE FOR STATEMENT BODY ! 13955: {{MOV{R9{4*CMSTM(SP){{STORE FOR LATER USE ! 13956: {{ZER{4*CMSGO(SP){{{CLEAR SUCCESS GOTO POINTER ! 13957: {{ZER{4*CMFGO(SP){{{CLEAR FAILURE GOTO POINTER ! 13958: {{ZER{4*CMCGO(SP){{{CLEAR CONDITIONAL GOTO FLAG ! 13959: {{JSR{SCANE{{{SCAN NEXT ELEMENT ! 13960: {{BNE{R10{#T$COL{CMP18{JUMP IT NOT COLON (NO GOTO) ! 13961: * ! 13962: * LOOP TO PROCESS GOTO FIELDS ! 13963: * ! 13964: {CMP13{MNZ{SCNGO{{{SET GOTO FLAG ! 13965: {{JSR{SCANE{{{SCAN NEXT ELEMENT ! 13966: {{BEQ{R10{#T$SMC{CMP31{JUMP IF NO FIELDS LEFT ! 13967: {{BEQ{R10{#T$SGO{CMP14{JUMP IF S FOR SUCCESS GOTO ! 13968: {{BEQ{R10{#T$FGO{CMP16{JUMP IF F FOR FAILURE GOTO ! 13969: * ! 13970: * HERE FOR UNCONDITIONAL GOTO (I.E. NOT F OR S) ! 13971: * ! 13972: {{MNZ{SCNRS{{{SET TO RESCAN ELEMENT NOT F,S ! 13973: {{JSR{SCNGF{{{SCAN OUT GOTO FIELD ! 13974: {{BNZ{4*CMFGO(SP){CMP17{{ERROR IF FGOTO ALREADY ! 13975: {{MOV{R9{4*CMFGO(SP){{ELSE SET AS FGOTO ! 13976: {{BRN{CMP15{{{MERGE WITH SGOTO CIRCUIT ! 13977: * ! 13978: * HERE FOR SUCCESS GOTO ! 13979: * ! 13980: {CMP14{JSR{SCNGF{{{SCAN SUCCESS GOTO FIELD ! 13981: {{MOV{#NUM01{4*CMCGO(SP){{SET CONDITIONAL GOTO FLAG ! 13982: * ! 13983: * UNCONTIONAL GOTO MERGES HERE ! 13984: * ! 13985: {CMP15{BNZ{4*CMSGO(SP){CMP17{{ERROR IF SGOTO ALREADY GIVEN ! 13986: {{MOV{R9{4*CMSGO(SP){{ELSE SET SGOTO ! 13987: {{BRN{CMP13{{{LOOP BACK FOR NEXT GOTO FIELD ! 13988: * ! 13989: * HERE FOR FAILURE GOTO ! 13990: * ! 13991: {CMP16{JSR{SCNGF{{{SCAN GOTO FIELD ! 13992: {{MOV{#NUM01{4*CMCGO(SP){{SET CONDITONAL GOTO FLAG ! 13993: {{BNZ{4*CMFGO(SP){CMP17{{ERROR IF FGOTO ALREADY GIVEN ! 13994: {{MOV{R9{4*CMFGO(SP){{ELSE STORE FGOTO POINTER ! 13995: {{BRN{CMP13{{{LOOP BACK FOR NEXT FIELD ! 13996: {{EJC{{{{ ! 13997: * ! 13998: * CMPIL (CONTINUED) ! 13999: * ! 14000: * HERE FOR DUPLICATED GOTO FIELD ! 14001: * ! 14002: {CMP17{ERB{218{SYNTAX{{ERROR. DUPLICATED GOTO FIELD ! 14003: * ! 14004: * HERE TO GENERATE CODE ! 14005: * ! 14006: {CMP18{ZER{SCNSE{{{STOP POSITIONAL ERROR FLAGS ! 14007: {{MOV{4*CMSTM(SP){R9{{LOAD TREE PTR FOR STATEMENT BODY ! 14008: {{ZER{R7{{{COLLECTABLE VALUE FOR WB FOR CDGVL ! 14009: {{ZER{R8{{{RESET CONSTANT FLAG FOR CDGVL ! 14010: {{JSR{EXPAP{{{TEST FOR PATTERN MATCH ! 14011: {{PPM{CMP19{{{JUMP IF NOT PATTERN MATCH ! 14012: {{MOV{#OPMS${4*CMOPN(R9){{ELSE SET PATTERN MATCH POINTER ! 14013: {{MOV{#C$PMT{4*CMTYP(R9){{ ! 14014: * ! 14015: * HERE AFTER DEALING WITH SPECIAL PATTERN MATCH CASE ! 14016: * ! 14017: {CMP19{JSR{CDGVL{{{GENERATE CODE FOR BODY OF STATEMENT ! 14018: {{MOV{4*CMSGO(SP){R9{{LOAD SGOTO POINTER ! 14019: {{MOV{R9{R6{{COPY IT ! 14020: {{BZE{R9{CMP21{{JUMP IF NO SUCCESS GOTO ! 14021: {{ZER{4*CMSOC(SP){{{CLEAR SUCCESS OFFSET FILLIN PTR ! 14022: {{BHI{R9{STATE{CMP20{JUMP IF COMPLEX GOTO ! 14023: * ! 14024: * HERE FOR SIMPLE SUCCESS GOTO (LABEL) ! 14025: * ! 14026: {{ADD{#4*VRTRA{R6{{POINT TO VRTRA FIELD AS REQUIRED ! 14027: {{JSR{CDWRD{{{GENERATE SUCCESS GOTO ! 14028: {{BRN{CMP22{{{JUMP TO DEAL WITH FGOTO ! 14029: * ! 14030: * HERE FOR COMPLEX SUCCESS GOTO ! 14031: * ! 14032: {CMP20{BEQ{R9{4*CMFGO(SP){CMP22{NO CODE IF SAME AS FGOTO ! 14033: {{ZER{R7{{{ELSE SET OK VALUE FOR CDGVL IN WB ! 14034: {{JSR{CDGCG{{{GENERATE CODE FOR SUCCESS GOTO ! 14035: {{BRN{CMP22{{{JUMP TO DEAL WITH FGOTO ! 14036: * ! 14037: * HERE FOR NO SUCCESS GOTO ! 14038: * ! 14039: {CMP21{MOV{CWCOF{4*CMSOC(SP){{SET SUCCESS FILL IN OFFSET ! 14040: {{MOV{#OCER${R6{{POINT TO COMPILE ERROR CALL ! 14041: {{JSR{CDWRD{{{GENERATE AS TEMPORARY VALUE ! 14042: {{EJC{{{{ ! 14043: * ! 14044: * CMPIL (CONTINUED) ! 14045: * ! 14046: * HERE TO DEAL WITH FAILURE GOTO ! 14047: * ! 14048: {CMP22{MOV{4*CMFGO(SP){R9{{LOAD FAILURE GOTO POINTER ! 14049: {{MOV{R9{R6{{COPY IT ! 14050: {{ZER{4*CMFFC(SP){{{SET NO FILL IN REQUIRED YET ! 14051: {{BZE{R9{CMP23{{JUMP IF NO FAILURE GOTO GIVEN ! 14052: {{ADD{#4*VRTRA{R6{{POINT TO VRTRA FIELD IN CASE ! 14053: {{BLO{R9{STATE{CMPSE{JUMP TO GEN IF SIMPLE FGOTO ! 14054: * ! 14055: * HERE FOR COMPLEX FAILURE GOTO ! 14056: * ! 14057: {{MOV{CWCOF{R7{{SAVE OFFSET TO O$GOF CALL ! 14058: {{MOV{#OGOF${R6{{POINT TO FAILURE GOTO CALL ! 14059: {{JSR{CDWRD{{{GENERATE ! 14060: {{MOV{#OFIF${R6{{POINT TO FAIL IN FAIL WORD ! 14061: {{JSR{CDWRD{{{GENERATE ! 14062: {{JSR{CDGCG{{{GENERATE CODE FOR FAILURE GOTO ! 14063: {{MOV{R7{R6{{COPY OFFSET TO O$GOF FOR CDFAL ! 14064: {{MOV{#B$CDC{R7{{SET COMPLEX CASE CDTYP ! 14065: {{BRN{CMP25{{{JUMP TO BUILD CDBLK ! 14066: * ! 14067: * HERE IF NO FAILURE GOTO GIVEN ! 14068: * ! 14069: {CMP23{MOV{#OUNF${R6{{LOAD UNEXPECTED FAILURE CALL IN CAS ! 14070: {{MOV{CSWFL{R8{{GET -NOFAIL FLAG ! 14071: {{ORB{4*CMCGO(SP){R8{{CHECK IF CONDITIONAL GOTO ! 14072: {{ZRB{R8{CMPSE{{JUMP IF -NOFAIL AND NO COND. GOTO ! 14073: {{MNZ{4*CMFFC(SP){{{ELSE SET FILL IN FLAG ! 14074: {{MOV{#OCER${R6{{AND SET COMPILE ERROR FOR TEMPORARY ! 14075: * ! 14076: * MERGE HERE WITH CDFAL VALUE IN WA, SIMPLE CDBLK ! 14077: * ALSO SPECIAL ENTRY AFTER STATEMENT ERROR ! 14078: * ! 14079: {CMPSE{MOV{#B$CDS{R7{{SET CDTYP FOR SIMPLE CASE ! 14080: {{EJC{{{{ ! 14081: * ! 14082: * CMPIL (CONTINUED) ! 14083: * ! 14084: * MERGE HERE TO BUILD CDBLK ! 14085: * ! 14086: * (WA) CDFAL VALUE TO BE GENERATED ! 14087: * (WB) CDTYP VALUE TO BE GENERATED ! 14088: * ! 14089: * AT THIS STAGE, WE CHOP OFF AN APPROPRIATE CHUNK OF THE ! 14090: * CURRENT CCBLK AND CONVERT IT INTO A CDBLK. THE REMAINDER ! 14091: * OF THE CCBLK IS REFORMATTED TO BE THE NEW CCBLK. ! 14092: * ! 14093: {CMP25{MOV{R$CCB{R9{{POINT TO CCBLK ! 14094: {{MOV{4*CMLBL(SP){R10{{GET POSSIBLE LABEL POINTER ! 14095: {{BZE{R10{CMP26{{SKIP IF NO LABEL ! 14096: {{ZER{4*CMLBL(SP){{{CLEAR FLAG FOR NEXT STATEMENT ! 14097: {{MOV{R9{4*VRLBL(R10){{PUT CDBLK PTR IN VRBLK LABEL FIELD ! 14098: * ! 14099: * MERGE AFTER DOING LABEL ! 14100: * ! 14101: {CMP26{MOV{R7{(R9){{SET TYPE WORD FOR NEW CDBLK ! 14102: {{MOV{R6{4*CDFAL(R9){{SET FAILURE WORD ! 14103: {{MOV{R9{R10{{COPY POINTER TO CCBLK ! 14104: {{MOV{4*CCUSE(R9){R7{{LOAD LENGTH GEN (= NEW CDLEN) ! 14105: {{MOV{4*CCLEN(R9){R8{{LOAD TOTAL CCBLK LENGTH ! 14106: {{ADD{R7{R10{{POINT PAST CDBLK ! 14107: {{SUB{R7{R8{{GET LENGTH LEFT FOR CHOP OFF ! 14108: {{MOV{#B$CCT{(R10){{SET TYPE CODE FOR NEW CCBLK AT END ! 14109: {{MOV{#4*CCCOD{4*CCUSE(R10){{SET INITIAL CODE OFFSET ! 14110: {{MOV{#4*CCCOD{CWCOF{{REINITIALISE CWCOF ! 14111: {{MOV{R8{4*CCLEN(R10){{SET NEW LENGTH ! 14112: {{MOV{R10{R$CCB{{SET NEW CCBLK POINTER ! 14113: {{MOV{CMPSN{4*CDSTM(R9){{SET STATEMENT NUMBER ! 14114: {{ICV{CMPSN{{{BUMP STATEMENT NUMBER ! 14115: * ! 14116: * SET POINTERS IN PREVIOUS CODE BLOCK AS REQUIRED ! 14117: * ! 14118: {{MOV{4*CMPCD(SP){R10{{LOAD PTR TO PREVIOUS CDBLK ! 14119: {{BZE{4*CMFFP(SP){CMP27{{JUMP IF NO FAILURE FILL IN REQUIRED ! 14120: {{MOV{R9{4*CDFAL(R10){{ELSE SET FAILURE PTR IN PREVIOUS ! 14121: * ! 14122: * HERE TO DEAL WITH SUCCESS FORWARD POINTER ! 14123: * ! 14124: {CMP27{MOV{4*CMSOP(SP){R6{{LOAD SUCCESS OFFSET ! 14125: {{BZE{R6{CMP28{{JUMP IF NO FILL IN REQUIRED ! 14126: {{ADD{R6{R10{{ELSE POINT TO FILL IN LOCATION ! 14127: {{MOV{R9{(R10){{STORE FORWARD POINTER ! 14128: {{ZER{R10{{{CLEAR GARBAGE XL VALUE ! 14129: {{EJC{{{{ ! 14130: * ! 14131: * CMPIL (CONTINUED) ! 14132: * ! 14133: * NOW SET FILL IN POINTERS FOR THIS STATEMENT ! 14134: * ! 14135: {CMP28{MOV{4*CMFFC(SP){4*CMFFP(SP){{COPY FAILURE FILL IN FLAG ! 14136: {{MOV{4*CMSOC(SP){4*CMSOP(SP){{COPY SUCCESS FILL IN OFFSET ! 14137: {{MOV{R9{4*CMPCD(SP){{SAVE PTR TO THIS CDBLK ! 14138: {{BNZ{4*CMTRA(SP){CMP29{{JUMP IF INITIAL ENTRY ALREADY SET ! 14139: {{MOV{R9{4*CMTRA(SP){{ELSE SET PTR HERE AS DEFAULT ! 14140: * ! 14141: * HERE AFTER COMPILING ONE STATEMENT ! 14142: * ! 14143: {CMP29{BLT{STAGE{#STGCE{CMP01{JUMP IF NOT END LINE JUST DONE ! 14144: {{BZE{CSWLS{CMP30{{SKIP IF -NOLIST ! 14145: {{JSR{LISTR{{{LIST LAST LINE ! 14146: * ! 14147: * RETURN ! 14148: * ! 14149: {CMP30{MOV{4*CMTRA(SP){R9{{LOAD INITIAL ENTRY CDBLK POINTER ! 14150: {{ADD{#4*CMNEN{SP{{POP WORK LOCATIONS OFF STACK ! 14151: {{EXI{{{{AND RETURN TO CMPIL CALLER ! 14152: * ! 14153: * HERE AT END OF GOTO FIELD ! 14154: * ! 14155: {CMP31{MOV{4*CMFGO(SP){R7{{GET FAIL GOTO ! 14156: {{ORB{4*CMSGO(SP){R7{{OR IN SUCCESS GOTO ! 14157: {{BNZ{R7{CMP18{{OK IF NON-NULL FIELD ! 14158: {{ERB{219{SYNTAX{{ERROR. EMPTY GOTO FIELD ! 14159: * ! 14160: * CONTROL CARD FOUND ! 14161: * ! 14162: {CMP32{ICV{R7{{{POINT PAST CH$MN ! 14163: {{JSR{CNCRD{{{PROCESS CONTROL CARD ! 14164: {{ZER{SCNSE{{{CLEAR START OF ELEMENT LOC. ! 14165: {{BRN{CMPCE{{{LOOP FOR NEXT STATEMENT ! 14166: {{ENP{{{{END PROCEDURE CMPIL ! 14167: {{EJC{{{{ ! 14168: * ! 14169: * CNCRD -- CONTROL CARD PROCESSOR ! 14170: * ! 14171: * CALLED TO DEAL WITH CONTROL CARDS ! 14172: * ! 14173: * R$CIM POINTS TO CURRENT IMAGE ! 14174: * (WB) OFFSET TO 1ST CHAR OF CONTROL CARD ! 14175: * JSR CNCRD CALL TO PROCESS CONTROL CARDS ! 14176: * (XL,XR,WA,WB,WC,IA) DESTROYED ! 14177: * ! 14178: {CNCRD{PRC{E{0{{ENTRY POINT ! 14179: {{MOV{R7{SCNPT{{OFFSET FOR CONTROL CARD SCAN ! 14180: {{MOV{#CCNOC{R6{{NUMBER OF CHARS FOR COMPARISON ! 14181: {{CTW{R6{0{{CONVERT TO WORD COUNT ! 14182: {{MOV{R6{CNSWC{{SAVE WORD COUNT ! 14183: * ! 14184: * LOOP HERE IF MORE THAN ONE CONTROL CARD ! 14185: * ! 14186: {CNC01{BGE{SCNPT{SCNIL{CNC09{RETURN IF END OF IMAGE ! 14187: {{MOV{R$CIM{R9{{POINT TO IMAGE ! 14188: {{PLC{R9{SCNPT{{CHAR PTR FOR FIRST CHAR ! 14189: {{LCH{R6{(R9)+{{GET FIRST CHAR ! 14190: {{FLC{R6{{{FOLD TO UPPER CASE ! 14191: {{BEQ{R6{#CH$LI{CNC07{SPECIAL CASE OF -INXXX ! 14192: {{MNZ{SCNCC{{{SET FLAG FOR SCANE ! 14193: {{JSR{SCANE{{{SCAN CARD NAME ! 14194: {{ZER{SCNCC{{{CLEAR SCANE FLAG ! 14195: {{BNZ{R10{CNC06{{FAIL UNLESS CONTROL CARD NAME ! 14196: {{MOV{#CCNOC{R6{{NO. OF CHARS TO BE COMPARED ! 14197: {{BLT{4*SCLEN(R9){R6{CNC06{FAIL IF TOO FEW CHARS ! 14198: {{MOV{R9{R10{{POINT TO CONTROL CARD NAME ! 14199: {{ZER{R7{{{ZERO OFFSET FOR SUBSTRING ! 14200: {{JSR{SBSTR{{{EXTRACT SUBSTRING FOR COMPARISON ! 14201: {{MOV{4*SCLEN(R9){R6{{RELOAD LENGTH ! 14202: {{JSR{FLSTG{{{FOLD TO UPPER CASE ! 14203: {{MOV{R9{CNSCC{{KEEP CONTROL CARD SUBSTRING PTR ! 14204: {{MOV{#CCNMS{R9{{POINT TO LIST OF STANDARD NAMES ! 14205: {{ZER{R7{{{INITIALISE NAME OFFSET ! 14206: {{LCT{R8{#CC$NC{{NUMBER OF STANDARD NAMES ! 14207: * ! 14208: * TRY TO MATCH NAME ! 14209: * ! 14210: {CNC02{MOV{CNSCC{R10{{POINT TO NAME ! 14211: {{LCT{R6{CNSWC{{COUNTER FOR INNER LOOP ! 14212: {{BRN{CNC04{{{JUMP INTO LOOP ! 14213: * ! 14214: * INNER LOOP TO MATCH CARD NAME CHARS ! 14215: * ! 14216: {CNC03{ICA{R9{{{BUMP STANDARD NAMES PTR ! 14217: {{ICA{R10{{{BUMP NAME POINTER ! 14218: * ! 14219: * HERE TO INITIATE THE LOOP ! 14220: * ! 14221: {CNC04{CNE{4*SCHAR(R10){(R9){CNC05{COMP. UP TO CFP$C CHARS AT ONCE ! 14222: {{BCT{R6{CNC03{{LOOP IF MORE WORDS TO COMPARE ! 14223: {{EJC{{{{ ! 14224: * ! 14225: * CNCRD (CONTINUED) ! 14226: * ! 14227: * MATCHED - BRANCH ON CARD OFFSET ! 14228: * ! 14229: {{MOV{R7{R10{{GET NAME OFFSET ! 14230: {{BSW{R10{CC$NC{{SWITCH ! 14231: {{IFF{CC$CA{CNC37{{-CASE ! 14232: {{IFF{CC$DO{CNC10{{-DOUBLE ! 14233: {{IFF{CC$DU{CNC11{{-DUMP ! 14234: {{IFF{CC$EJ{CNC12{{-EJECT ! 14235: {{IFF{CC$ER{CNC13{{-ERRORS ! 14236: {{IFF{CC$EX{CNC14{{-EXECUTE ! 14237: {{IFF{CC$FA{CNC15{{-FAIL ! 14238: {{IFF{CC$LI{CNC16{{-LIST ! 14239: {{IFF{CC$NR{CNC17{{-NOERRORS ! 14240: {{IFF{CC$NX{CNC18{{-NOEXECUTE ! 14241: {{IFF{CC$NF{CNC19{{-NOFAIL ! 14242: {{IFF{CC$NL{CNC20{{-NOLIST ! 14243: {{IFF{CC$NO{CNC21{{-NOOPT ! 14244: {{IFF{CC$NP{CNC22{{-NOPRINT ! 14245: {{IFF{CC$OP{CNC24{{-OPTIMISE ! 14246: {{IFF{CC$PR{CNC25{{-PRINT ! 14247: {{IFF{CC$SI{CNC27{{-SINGLE ! 14248: {{IFF{CC$SP{CNC28{{-SPACE ! 14249: {{IFF{CC$ST{CNC31{{-STITLE ! 14250: {{IFF{CC$TI{CNC32{{-TITLE ! 14251: {{IFF{CC$TR{CNC36{{-TRACE ! 14252: {{ESW{{{{END SWITCH ! 14253: * ! 14254: * NOT MATCHED YET. ALIGN STD NAMES PTR AND TRY AGAIN ! 14255: * ! 14256: {CNC05{ICA{R9{{{BUMP STANDARD NAMES PTR ! 14257: {{BCT{R6{CNC05{{LOOP ! 14258: {{ICV{R7{{{BUMP NAMES OFFSET ! 14259: {{BCT{R8{CNC02{{CONTINUE IF MORE NAMES ! 14260: * ! 14261: * INVALID CONTROL CARD NAME ! 14262: * ! 14263: {CNC06{ERB{247{INVALID{{CONTROL CARD ! 14264: * ! 14265: * SPECIAL PROCESSING FOR -INXXX ! 14266: * ! 14267: {CNC07{LCH{R6{(R9){{GET NEXT CHAR ! 14268: {{FLC{R6{{{FOLD TO UPPER CASE ! 14269: {{BNE{R6{#CH$LN{CNC06{FAIL IF NOT LETTER N ! 14270: {{ADD{#NUM02{SCNPT{{BUMP OFFSET PAST -IN ! 14271: {{JSR{SCANE{{{SCAN INTEGER AFTER -IN ! 14272: {{MOV{R9{-(SP){{STACK SCANNED ITEM ! 14273: {{JSR{GTSMI{{{CHECK IF INTEGER ! 14274: {{PPM{CNC06{{{FAIL IF NOT INTEGER ! 14275: {{PPM{CNC06{{{FAIL IF NEGATIVE OR LARGE ! 14276: {{MOV{R9{CSWIN{{KEEP INTEGER ! 14277: {{EJC{{{{ ! 14278: * ! 14279: * CNCRD (CONTINUED) ! 14280: * ! 14281: * CHECK FOR MORE CONTROL CARDS BEFORE RETURNING ! 14282: * ! 14283: {CNC08{MOV{SCNPT{R6{{PRESERVE IN CASE XEQ TIME COMPILE ! 14284: {{JSR{SCANE{{{LOOK FOR COMMA ! 14285: {{BEQ{R10{#T$CMA{CNC01{LOOP IF COMMA FOUND ! 14286: {{MOV{R6{SCNPT{{RESTORE SCNPT IN CASE XEQ TIME ! 14287: * ! 14288: * RETURN POINT ! 14289: * ! 14290: {CNC09{EXI{{{{RETURN ! 14291: * ! 14292: * -DOUBLE ! 14293: * ! 14294: {CNC10{MNZ{CSWDB{{{SET SWITCH ! 14295: {{BRN{CNC08{{{MERGE ! 14296: * ! 14297: * -DUMP ! 14298: * THIS IS USED FOR SYSTEM DEBUGGING . IT HAS THE EFFECT OF ! 14299: * PRODUCING A CORE DUMP AT COMPILATION TIME ! 14300: * ! 14301: {CNC11{JSR{SYSDM{{{CALL DUMPER ! 14302: {{BRN{CNC09{{{FINISHED ! 14303: * ! 14304: * -EJECT ! 14305: * ! 14306: {CNC12{BZE{CSWLS{CNC09{{RETURN IF -NOLIST ! 14307: {{JSR{PRTPS{{{EJECT ! 14308: {{JSR{LISTT{{{LIST TITLE ! 14309: {{BRN{CNC09{{{FINISHED ! 14310: * ! 14311: * -ERRORS ! 14312: * ! 14313: {CNC13{ZER{CSWER{{{CLEAR SWITCH ! 14314: {{BRN{CNC08{{{MERGE ! 14315: * ! 14316: * -EXECUTE ! 14317: * ! 14318: {CNC14{ZER{CSWEX{{{CLEAR SWITCH ! 14319: {{BRN{CNC08{{{MERGE ! 14320: * ! 14321: * -FAIL ! 14322: * ! 14323: {CNC15{MNZ{CSWFL{{{SET SWITCH ! 14324: {{BRN{CNC08{{{MERGE ! 14325: * ! 14326: * -LIST ! 14327: * ! 14328: {CNC16{MNZ{CSWLS{{{SET SWITCH ! 14329: {{BEQ{STAGE{#STGIC{CNC08{DONE IF COMPILE TIME ! 14330: * ! 14331: * LIST CODE LINE IF EXECUTE TIME COMPILE ! 14332: * ! 14333: {{ZER{LSTPF{{{PERMIT LISTING ! 14334: {{JSR{LISTR{{{LIST LINE ! 14335: {{BRN{CNC08{{{MERGE ! 14336: {{EJC{{{{ ! 14337: * ! 14338: * CNCRD (CONTINUED) ! 14339: * ! 14340: * -NOERRORS ! 14341: * ! 14342: {CNC17{MNZ{CSWER{{{SET SWITCH ! 14343: {{BRN{CNC08{{{MERGE ! 14344: * ! 14345: * -NOEXECUTE ! 14346: * ! 14347: {CNC18{MNZ{CSWEX{{{SET SWITCH ! 14348: {{BRN{CNC08{{{MERGE ! 14349: * ! 14350: * -NOFAIL ! 14351: * ! 14352: {CNC19{ZER{CSWFL{{{CLEAR SWITCH ! 14353: {{BRN{CNC08{{{MERGE ! 14354: * ! 14355: * -NOLIST ! 14356: * ! 14357: {CNC20{ZER{CSWLS{{{CLEAR SWITCH ! 14358: {{BRN{CNC08{{{MERGE ! 14359: * ! 14360: * -NOOPTIMISE ! 14361: * ! 14362: {CNC21{MNZ{CSWNO{{{SET SWITCH ! 14363: {{BRN{CNC08{{{MERGE ! 14364: * ! 14365: * -NOPRINT ! 14366: * ! 14367: {CNC22{ZER{CSWPR{{{CLEAR SWITCH ! 14368: {{BRN{CNC08{{{MERGE ! 14369: * ! 14370: * -OPTIMISE ! 14371: * ! 14372: {CNC24{ZER{CSWNO{{{CLEAR SWITCH ! 14373: {{BRN{CNC08{{{MERGE ! 14374: * ! 14375: * -PRINT ! 14376: * ! 14377: {CNC25{MNZ{CSWPR{{{SET SWITCH ! 14378: {{BRN{CNC08{{{MERGE ! 14379: {{EJC{{{{ ! 14380: * ! 14381: * CNCRD (CONTINUED) ! 14382: * ! 14383: * -SINGLE ! 14384: * ! 14385: {CNC27{ZER{CSWDB{{{CLEAR SWITCH ! 14386: {{BRN{CNC08{{{MERGE ! 14387: * ! 14388: * -SPACE ! 14389: * ! 14390: {CNC28{BZE{CSWLS{CNC09{{RETURN IF -NOLIST ! 14391: {{JSR{SCANE{{{SCAN INTEGER AFTER -SPACE ! 14392: {{MOV{#NUM01{R8{{1 SPACE IN CASE ! 14393: {{BEQ{R9{#T$SMC{CNC29{JUMP IF NO INTEGER ! 14394: {{MOV{R9{-(SP){{STACK IT ! 14395: {{JSR{GTSMI{{{CHECK INTEGER ! 14396: {{PPM{CNC06{{{FAIL IF NOT INTEGER ! 14397: {{PPM{CNC06{{{FAIL IF NEGATIVE OR LARGE ! 14398: {{BNZ{R8{CNC29{{JUMP IF NON ZERO ! 14399: {{MOV{#NUM01{R8{{ELSE 1 SPACE ! 14400: * ! 14401: * MERGE WITH COUNT OF LINES TO SKIP ! 14402: * ! 14403: {CNC29{ADD{R8{LSTLC{{BUMP LINE COUNT ! 14404: {{LCT{R8{R8{{CONVERT TO LOOP COUNTER ! 14405: {{BLT{LSTLC{LSTNP{CNC30{JUMP IF FITS ON PAGE ! 14406: {{JSR{PRTPS{{{EJECT ! 14407: {{JSR{LISTT{{{LIST TITLE ! 14408: {{BRN{CNC09{{{MERGE ! 14409: * ! 14410: * SKIP LINES ! 14411: * ! 14412: {CNC30{JSR{PRTNL{{{PRINT A BLANK ! 14413: {{BCT{R8{CNC30{{LOOP ! 14414: {{BRN{CNC09{{{MERGE ! 14415: {{EJC{{{{ ! 14416: * ! 14417: * CNCRD (CONTINUED) ! 14418: * ! 14419: * -STITL ! 14420: * ! 14421: {CNC31{MOV{#R$STL{CNR$T{{PTR TO R$STL ! 14422: {{BRN{CNC33{{{MERGE ! 14423: * ! 14424: * -TITLE ! 14425: * ! 14426: {CNC32{MOV{#NULLS{R$STL{{CLEAR SUBTITLE ! 14427: {{MOV{#R$TTL{CNR$T{{PTR TO R$TTL ! 14428: * ! 14429: * COMMON PROCESSING FOR -TITLE, -STITL ! 14430: * ! 14431: {CNC33{MOV{#NULLS{R9{{NULL IN CASE NEEDED ! 14432: {{MNZ{CNTTL{{{SET FLAG FOR NEXT LISTR CALL ! 14433: {{MOV{#CCOFS{R7{{OFFSET TO TITLE/SUBTITLE ! 14434: {{MOV{SCNIL{R6{{INPUT IMAGE LENGTH ! 14435: {{BLO{R6{R7{CNC34{JUMP IF NO CHARS LEFT ! 14436: {{SUB{R7{R6{{NO OF CHARS TO EXTRACT ! 14437: {{MOV{R$CIM{R10{{POINT TO IMAGE ! 14438: {{JSR{SBSTR{{{GET TITLE/SUBTITLE ! 14439: * ! 14440: * STORE TITLE/SUBTITLE ! 14441: * ! 14442: {CNC34{MOV{CNR$T{R10{{POINT TO STORAGE LOCATION ! 14443: {{MOV{R9{(R10){{STORE TITLE/SUBTITLE ! 14444: {{BEQ{R10{#R$STL{CNC09{RETURN IF STITL ! 14445: {{BNZ{PRECL{CNC09{{RETURN IF EXTENDED LISTING ! 14446: {{BZE{PRICH{CNC09{{RETURN IF REGULAR PRINTER ! 14447: {{MOV{4*SCLEN(R9){R10{{GET LENGTH OF TITLE ! 14448: {{MOV{R10{R6{{COPY IT ! 14449: {{BZE{R10{CNC35{{JUMP IF NULL ! 14450: {{ADD{#NUM10{R10{{INCREMENT ! 14451: {{BHI{R10{PRLEN{CNC09{USE DEFAULT LSTP0 VAL IF TOO LONG ! 14452: {{ADD{#NUM04{R6{{POINT JUST PAST TITLE ! 14453: * ! 14454: * STORE OFFSET TO PAGE NN MESSAGE FOR SHORT TITLE ! 14455: * ! 14456: {CNC35{MOV{R6{LSTPO{{STORE OFFSET ! 14457: {{BRN{CNC09{{{RETURN ! 14458: * ! 14459: * -TRACE ! 14460: * PROVIDED FOR SYSTEM DEBUGGING. TOGGLES THE SYSTEM LABEL ! 14461: * TRACE SWITCH AT COMPILE TIME ! 14462: * ! 14463: {CNC36{JSR{SYSTT{{{TOGGLE SWITCH ! 14464: {{BRN{CNC08{{{MERGE ! 14465: * ! 14466: * -CASE ! 14467: * SETS VALUE OF KVCAS SO THAT NAMES ARE FOLDED OR NOT ! 14468: * DURING COMPILATION. ! 14469: * ! 14470: {CNC37{JSR{SCANE{{{SCAN INTEGER AFTER -CASE ! 14471: {{ZER{R8{{{GET 0 IN CASE NONE THERE ! 14472: {{BEQ{R10{#T$SMC{CNC38{SKIP IF NO INTEGER ! 14473: {{MOV{R9{-(SP){{STACK IT ! 14474: {{JSR{GTSMI{{{CHECK INTEGER ! 14475: {{PPM{CNC06{{{FAIL IF NOT INTEGER ! 14476: {{PPM{CNC06{{{FAIL IF NEGATIVE OR TOO LARGE ! 14477: {CNC38{MOV{R8{KVCAS{{STORE NEW CASE VALUE ! 14478: {{BRN{CNC09{{{MERGE ! 14479: {{ENP{{{{END PROCEDURE CNCRD ! 14480: {{EJC{{{{ ! 14481: * ! 14482: * DFFNC -- DEFINE FUNCTION ! 14483: * ! 14484: * DFFNC IS CALLED WHENEVER A NEW FUNCTION IS ASSIGNED TO ! 14485: * A VARIABLE. IT DEALS WITH EXTERNAL FUNCTION USE COUNTS. ! 14486: * ! 14487: * (XR) POINTER TO VRBLK ! 14488: * (XL) POINTER TO NEW FUNCTION BLOCK ! 14489: * JSR DFFNC CALL TO DEFINE FUNCTION ! 14490: * (WA,WB) DESTROYED ! 14491: * ! 14492: {DFFNC{PRC{E{0{{ENTRY POINT ! 14493: {{BNE{(R10){#B$EFC{DFFN1{SKIP IF NEW FUNCTION NOT EXTERNAL ! 14494: {{ICV{4*EFUSE(R10){{{ELSE INCREMENT ITS USE COUNT ! 14495: * ! 14496: * HERE AFTER DEALING WITH NEW FUNCTION USE COUNT ! 14497: * ! 14498: {DFFN1{MOV{R9{R6{{SAVE VRBLK POINTER ! 14499: {{MOV{4*VRFNC(R9){R9{{LOAD OLD FUNCTION POINTER ! 14500: {{BNE{(R9){#B$EFC{DFFN2{JUMP IF OLD FUNCTION NOT EXTERNAL ! 14501: {{MOV{4*EFUSE(R9){R7{{ELSE GET USE COUNT ! 14502: {{DCV{R7{{{DECREMENT ! 14503: {{MOV{R7{4*EFUSE(R9){{STORE DECREMENTED VALUE ! 14504: {{BNZ{R7{DFFN2{{JUMP IF USE COUNT STILL NON-ZERO ! 14505: {{JSR{SYSUL{{{ELSE CALL SYSTEM UNLOAD FUNCTION ! 14506: * ! 14507: * HERE AFTER DEALING WITH OLD FUNCTION USE COUNT ! 14508: * ! 14509: {DFFN2{MOV{R6{R9{{RESTORE VRBLK POINTER ! 14510: {{MOV{R10{R6{{COPY FUNCTION BLOCK PTR ! 14511: {{BLT{R9{#R$YYY{DFFN3{SKIP CHECKS IF OPSYN OP DEFINITION ! 14512: {{BNZ{4*VRLEN(R9){DFFN3{{JUMP IF NOT SYSTEM VARIABLE ! 14513: * ! 14514: * FOR SYSTEM VARIABLE, CHECK FOR ILLEGAL REDEFINITION ! 14515: * ! 14516: {{MOV{4*VRSVP(R9){R10{{POINT TO SVBLK ! 14517: {{MOV{4*SVBIT(R10){R7{{LOAD BIT INDICATORS ! 14518: {{ANB{BTFNC{R7{{IS IT A SYSTEM FUNCTION ! 14519: {{ZRB{R7{DFFN3{{REDEF OK IF NOT ! 14520: {{ERB{248{ATTEMPTED{{REDEFINITION OF SYSTEM FUNCTION ! 14521: * ! 14522: * HERE IF REDEFINITION IS PERMITTED ! 14523: * ! 14524: {DFFN3{MOV{R6{4*VRFNC(R9){{STORE NEW FUNCTION POINTER ! 14525: {{MOV{R6{R10{{RESTORE FUNCTION BLOCK POINTER ! 14526: {{EXI{{{{RETURN TO DFFNC CALLER ! 14527: {{ENP{{{{END PROCEDURE DFFNC ! 14528: {{EJC{{{{ ! 14529: * ! 14530: * DTACH -- DETACH I/O ASSOCIATED NAMES ! 14531: * ! 14532: * DETACHES TRBLKS FROM I/O ASSOCIATED VARIABLES, REMOVES ! 14533: * ENTRY FROM IOCHN CHAIN ATTACHED TO FILEARG1 VRBLK AND MAY ! 14534: * REMOVE VRBLK ACCESS AND STORE TRAPS. ! 14535: * INPUT, OUTPUT, TERMINAL ARE HANDLED SPECIALLY. ! 14536: * ! 14537: * (XL) I/O ASSOC. VBL NAME BASE PTR ! 14538: * (WA) OFFSET TO NAME ! 14539: * JSR DTACH CALL FOR DETACH OPERATION ! 14540: * (XL,XR,WA,WB,WC) DESTROYED ! 14541: * ! 14542: {DTACH{PRC{E{0{{ENTRY POINT ! 14543: {{MOV{R10{DTCNB{{STORE NAME BASE (GBCOL NOT CALLED) ! 14544: {{ADD{R6{R10{{POINT TO NAME LOCATION ! 14545: {{MOV{R10{DTCNM{{STORE IT ! 14546: * ! 14547: * LOOP TO SEARCH FOR I/O TRBLK ! 14548: * ! 14549: {DTCH1{MOV{R10{R9{{COPY NAME POINTER ! 14550: * ! 14551: * CONTINUE AFTER BLOCK DELETION ! 14552: * ! 14553: {DTCH2{MOV{(R10){R10{{POINT TO NEXT VALUE ! 14554: {{BNE{(R10){#B$TRT{DTCH6{JUMP AT CHAIN END ! 14555: {{MOV{4*TRTYP(R10){R6{{GET TRAP BLOCK TYPE ! 14556: {{BEQ{R6{#TRTIN{DTCH3{JUMP IF INPUT ! 14557: {{BEQ{R6{#TRTOU{DTCH3{JUMP IF OUTPUT ! 14558: {{ADD{#4*TRNXT{R10{{POINT TO NEXT LINK ! 14559: {{BRN{DTCH1{{{LOOP ! 14560: * ! 14561: * DELETE AN OLD ASSOCIATION ! 14562: * ! 14563: {DTCH3{MOV{4*TRVAL(R10){(R9){{DELETE TRBLK ! 14564: {{MOV{R10{R6{{DUMP XL ... ! 14565: {{MOV{R9{R7{{... AND XR ! 14566: {{MOV{4*TRTRF(R10){R10{{POINT TO TRTRF TRAP BLOCK ! 14567: {{BZE{R10{DTCH5{{JUMP IF NO IOCHN ! 14568: {{BNE{(R10){#B$TRT{DTCH5{JUMP IF INPUT, OUTPUT, TERMINAL ! 14569: * ! 14570: * LOOP TO SEARCH IOCHN CHAIN FOR NAME PTR ! 14571: * ! 14572: {DTCH4{MOV{R10{R9{{REMEMBER LINK PTR ! 14573: {{MOV{4*TRTRF(R10){R10{{POINT TO NEXT LINK ! 14574: {{BZE{R10{DTCH5{{JUMP IF END OF CHAIN ! 14575: {{MOV{4*IONMB(R10){R8{{GET NAME BASE ! 14576: {{ADD{4*IONMO(R10){R8{{ADD OFFSET ! 14577: {{BNE{R8{DTCNM{DTCH4{LOOP IF NO MATCH ! 14578: {{MOV{4*TRTRF(R10){4*TRTRF(R9){{REMOVE NAME FROM CHAIN ! 14579: {{EJC{{{{ ! 14580: * ! 14581: * DTACH (CONTINUED) ! 14582: * ! 14583: * PREPARE TO RESUME I/O TRBLK SCAN ! 14584: * ! 14585: {DTCH5{MOV{R6{R10{{RECOVER XL ... ! 14586: {{MOV{R7{R9{{... AND XR ! 14587: {{ADD{#4*TRVAL{R10{{POINT TO VALUE FIELD ! 14588: {{BRN{DTCH2{{{CONTINUE ! 14589: * ! 14590: * EXIT POINT ! 14591: * ! 14592: {DTCH6{MOV{DTCNB{R9{{POSSIBLE VRBLK PTR ! 14593: {{JSR{SETVR{{{RESET VRBLK IF NECESSARY ! 14594: {{EXI{{{{RETURN ! 14595: {{ENP{{{{END PROCEDURE DTACH ! 14596: {{EJC{{{{ ! 14597: * ! 14598: * DTYPE -- GET DATATYPE NAME ! 14599: * ! 14600: * (XR) OBJECT WHOSE DATATYPE IS REQUIRED ! 14601: * JSR DTYPE CALL TO GET DATATYPE ! 14602: * (XR) RESULT DATATYPE ! 14603: * ! 14604: {DTYPE{PRC{E{0{{ENTRY POINT ! 14605: {{BEQ{(R9){#B$PDT{DTYP1{JUMP IF PROG.DEFINED ! 14606: {{MOV{(R9){R9{{LOAD TYPE WORD ! 14607: {{LEI{R9{{{GET ENTRY POINT ID (BLOCK CODE) ! 14608: {{WTB{R9{{{CONVERT TO BYTE OFFSET ! 14609: {{MOV{L^SCNMT(R9){R9{{LOAD TABLE ENTRY ! 14610: {{EXI{{{{EXIT TO DTYPE CALLER ! 14611: * ! 14612: * HERE IF PROGRAM DEFINED ! 14613: * ! 14614: {DTYP1{MOV{4*PDDFP(R9){R9{{POINT TO DFBLK ! 14615: {{MOV{4*DFNAM(R9){R9{{GET DATATYPE NAME FROM DFBLK ! 14616: {{EXI{{{{RETURN TO DTYPE CALLER ! 14617: {{ENP{{{{END PROCEDURE DTYPE ! 14618: {{EJC{{{{ ! 14619: * ! 14620: * DUMPR -- PRINT DUMP OF STORAGE ! 14621: * ! 14622: * (XR) DUMP ARGUMENT (SEE BELOW) ! 14623: * JSR DUMPR CALL TO PRINT DUMP ! 14624: * (XR,XL) DESTROYED ! 14625: * (WA,WB,WC,RA) DESTROYED ! 14626: * ! 14627: * THE DUMP ARGUMENT HAS THE FOLLOWING SIGNIFICANCE ! 14628: * ! 14629: * DMARG = 0 NO DUMP PRINTED ! 14630: * DMARG = 1 PARTIAL DUMP (NAT VARS, KEYWORDS) ! 14631: * DMARG EQ 2 FULL DUMP (INCL ARRAYS ETC.) ! 14632: * DMARG GE 3 CORE DUMP ! 14633: * ! 14634: * SINCE DUMPR SCRAMBLES STORE, IT IS NOT PERMISSIBLE TO ! 14635: * COLLECT IN MID-DUMP. HENCE A COLLECT IS DONE INITIALLY ! 14636: * AND THEN IF STORE RUNS OUT AN ERROR MESSAGE IS PRODUCED. ! 14637: * ! 14638: {DUMPR{PRC{E{0{{ENTRY POINT ! 14639: {{BZE{R9{DMP28{{SKIP DUMP IF ARGUMENT IS ZERO ! 14640: {{BGT{R9{#NUM02{DMP29{JUMP IF CORE DUMP REQUIRED ! 14641: {{ZER{R10{{{CLEAR XL ! 14642: {{ZER{R7{{{ZERO MOVE OFFSET ! 14643: {{MOV{R9{DMARG{{SAVE DUMP ARGUMENT ! 14644: {{JSR{GBCOL{{{COLLECT GARBAGE ! 14645: {{JSR{PRTPG{{{EJECT PRINTER ! 14646: {{MOV{#DMHDV{R9{{POINT TO HEADING FOR VARIABLES ! 14647: {{JSR{PRTST{{{PRINT IT ! 14648: {{JSR{PRTNL{{{TERMINATE PRINT LINE ! 14649: {{JSR{PRTNL{{{AND PRINT A BLANK LINE ! 14650: * ! 14651: * FIRST ALL NATURAL VARIABLE BLOCKS (VRBLK) WHOSE VALUES ! 14652: * ARE NON-NULL ARE LINKED IN LEXICAL ORDER USING DMVCH AS ! 14653: * THE CHAIN HEAD AND CHAINING THROUGH THE VRGET FIELDS. ! 14654: * NOTE THAT THIS SCRAMBLES STORE IF THE PROCESS IS ! 14655: * INTERRUPTED BEFORE COMPLETION E.G. BY EXCEEDING TIME OR ! 14656: * PRINT LIMITS. SINCE THE SUBSEQUENT CORE DUMPS AND ! 14657: * FAILURES IF EXECUTION IS RESUMED ARE VERY CONFUSING, THE ! 14658: * EXECUTION TIME ERROR ROUTINE CHECKS FOR THIS EVENT AND ! 14659: * ATTEMPTS AN UNSCRAMBLE. SIMILAR PRECAUTIONS SHOULD BE ! 14660: * OBSERVED IF TRANSLATE TIME DUMPING IS IMPLEMENTED. ! 14661: * ! 14662: {{ZER{DMVCH{{{SET NULL CHAIN TO START ! 14663: {{MOV{HSHTB{R6{{POINT TO HASH TABLE ! 14664: * ! 14665: * LOOP THROUGH HEADERS IN HASH TABLE ! 14666: * ! 14667: {DMP00{MOV{R6{R9{{COPY HASH BUCKET POINTER ! 14668: {{ICA{R6{{{BUMP POINTER ! 14669: {{SUB{#4*VRNXT{R9{{SET OFFSET TO MERGE ! 14670: * ! 14671: * LOOP THROUGH VRBLKS ON ONE CHAIN ! 14672: * ! 14673: {DMP01{MOV{4*VRNXT(R9){R9{{POINT TO NEXT VRBLK ON CHAIN ! 14674: {{BZE{R9{DMP09{{JUMP IF END OF THIS HASH CHAIN ! 14675: {{MOV{R9{R10{{ELSE COPY VRBLK POINTER ! 14676: {{EJC{{{{ ! 14677: * ! 14678: * DUMPR (CONTINUED) ! 14679: * ! 14680: * LOOP TO FIND VALUE AND SKIP IF NULL ! 14681: * ! 14682: {DMP02{MOV{4*VRVAL(R10){R10{{LOAD VALUE ! 14683: {{BEQ{R10{#NULLS{DMP01{LOOP FOR NEXT VRBLK IF NULL VALUE ! 14684: {{BEQ{(R10){#B$TRT{DMP02{LOOP BACK IF VALUE IS TRAPPED ! 14685: * ! 14686: * NON-NULL VALUE, PREPARE TO SEARCH CHAIN ! 14687: * ! 14688: {{MOV{R9{R8{{SAVE VRBLK POINTER ! 14689: {{ADD{#4*VRSOF{R9{{ADJUST PTR TO BE LIKE SCBLK PTR ! 14690: {{BNZ{4*SCLEN(R9){DMP03{{JUMP IF NON-SYSTEM VARIABLE ! 14691: {{MOV{4*VRSVO(R9){R9{{ELSE LOAD PTR TO NAME IN SVBLK ! 14692: * ! 14693: * HERE WITH NAME POINTER FOR NEW BLOCK IN XR ! 14694: * ! 14695: {DMP03{MOV{R9{R7{{SAVE POINTER TO CHARS ! 14696: {{MOV{R6{DMPSV{{SAVE HASH BUCKET POINTER ! 14697: {{MOV{#DMVCH{R6{{POINT TO CHAIN HEAD ! 14698: * ! 14699: * LOOP TO SEARCH CHAIN FOR CORRECT INSERTION POINT ! 14700: * ! 14701: {DMP04{MOV{R6{DMPCH{{SAVE CHAIN POINTER ! 14702: {{MOV{R6{R10{{COPY IT ! 14703: {{MOV{(R10){R9{{LOAD POINTER TO NEXT ENTRY ! 14704: {{BZE{R9{DMP08{{JUMP IF END OF CHAIN TO INSERT ! 14705: {{ADD{#4*VRSOF{R9{{ELSE GET NAME PTR FOR CHAINED VRBLK ! 14706: {{BNZ{4*SCLEN(R9){DMP05{{JUMP IF NOT SYSTEM VARIABLE ! 14707: {{MOV{4*VRSVO(R9){R9{{ELSE POINT TO NAME IN SVBLK ! 14708: * ! 14709: * HERE PREPARE TO COMPARE THE NAMES ! 14710: * ! 14711: * (WA) SCRATCH ! 14712: * (WB) POINTER TO STRING OF ENTERING VRBLK ! 14713: * (WC) POINTER TO ENTERING VRBLK ! 14714: * (XR) POINTER TO STRING OF CURRENT BLOCK ! 14715: * (XL) SCRATCH ! 14716: * ! 14717: {DMP05{MOV{R7{R10{{POINT TO ENTERING VRBLK STRING ! 14718: {{MOV{4*SCLEN(R10){R6{{LOAD ITS LENGTH ! 14719: {{PLC{R10{{{POINT TO CHARS OF ENTERING STRING ! 14720: {{BHI{R6{4*SCLEN(R9){DMP06{JUMP IF ENTERING LENGTH HIGH ! 14721: {{PLC{R9{{{ELSE POINT TO CHARS OF OLD STRING ! 14722: {{CMC{DMP08{DMP07{{COMPARE, INSERT IF NEW IS LLT OLD ! 14723: {{BRN{DMP08{{{OR IF LEQ (WE HAD SHORTER LENGTH) ! 14724: * ! 14725: * HERE WHEN NEW LENGTH IS LONGER THAN OLD LENGTH ! 14726: * ! 14727: {DMP06{MOV{4*SCLEN(R9){R6{{LOAD SHORTER LENGTH ! 14728: {{PLC{R9{{{POINT TO CHARS OF OLD STRING ! 14729: {{CMC{DMP08{DMP07{{COMPARE, INSERT IF NEW ONE LOW ! 14730: {{EJC{{{{ ! 14731: * ! 14732: * DUMPR (CONTINUED) ! 14733: * ! 14734: * HERE WE MOVE OUT ON THE CHAIN ! 14735: * ! 14736: {DMP07{MOV{DMPCH{R10{{COPY CHAIN POINTER ! 14737: {{MOV{(R10){R6{{MOVE TO NEXT ENTRY ON CHAIN ! 14738: {{BRN{DMP04{{{LOOP BACK ! 14739: * ! 14740: * HERE AFTER LOCATING THE PROPER INSERTION POINT ! 14741: * ! 14742: {DMP08{MOV{DMPCH{R10{{COPY CHAIN POINTER ! 14743: {{MOV{DMPSV{R6{{RESTORE HASH BUCKET POINTER ! 14744: {{MOV{R8{R9{{RESTORE VRBLK POINTER ! 14745: {{MOV{(R10){4*VRGET(R9){{LINK VRBLK TO REST OF CHAIN ! 14746: {{MOV{R9{(R10){{LINK VRBLK INTO CURRENT CHAIN LOC ! 14747: {{BRN{DMP01{{{LOOP BACK FOR NEXT VRBLK ! 14748: * ! 14749: * HERE AFTER PROCESSING ALL VRBLKS ON ONE CHAIN ! 14750: * ! 14751: {DMP09{BNE{R6{HSHTE{DMP00{LOOP BACK IF MORE BUCKETS TO GO ! 14752: * ! 14753: * LOOP TO GENERATE DUMP OF NATURAL VARIABLE VALUES ! 14754: * ! 14755: {DMP10{MOV{DMVCH{R9{{LOAD POINTER TO NEXT ENTRY ON CHAIN ! 14756: {{BZE{R9{DMP11{{JUMP IF END OF CHAIN ! 14757: {{MOV{(R9){DMVCH{{ELSE UPDATE CHAIN PTR TO NEXT ENTRY ! 14758: {{JSR{SETVR{{{RESTORE VRGET FIELD ! 14759: {{MOV{R9{R10{{COPY VRBLK POINTER (NAME BASE) ! 14760: {{MOV{#4*VRVAL{R6{{SET OFFSET FOR VRBLK NAME ! 14761: {{JSR{PRTNV{{{PRINT NAME = VALUE ! 14762: {{BRN{DMP10{{{LOOP BACK TILL ALL PRINTED ! 14763: * ! 14764: * PREPARE TO PRINT KEYWORDS ! 14765: * ! 14766: {DMP11{JSR{PRTNL{{{PRINT BLANK LINE ! 14767: {{JSR{PRTNL{{{AND ANOTHER ! 14768: {{MOV{#DMHDK{R9{{POINT TO KEYWORD HEADING ! 14769: {{JSR{PRTST{{{PRINT HEADING ! 14770: {{JSR{PRTNL{{{END LINE ! 14771: {{JSR{PRTNL{{{PRINT ONE BLANK LINE ! 14772: {{MOV{#VDMKW{R10{{POINT TO LIST OF KEYWORD SVBLK PTRS ! 14773: {{EJC{{{{ ! 14774: * ! 14775: * DUMPR (CONTINUED) ! 14776: * ! 14777: * LOOP TO DUMP KEYWORD VALUES ! 14778: * ! 14779: {DMP12{MOV{(R10)+{R9{{LOAD NEXT SVBLK PTR FROM TABLE ! 14780: {{BZE{R9{DMP13{{JUMP IF END OF LIST ! 14781: {{MOV{#CH$AM{R6{{LOAD AMPERSAND ! 14782: {{JSR{PRTCH{{{PRINT AMPERSAND ! 14783: {{JSR{PRTST{{{PRINT KEYWORD NAME ! 14784: {{MOV{4*SVLEN(R9){R6{{LOAD NAME LENGTH FROM SVBLK ! 14785: {{CTB{R6{SVCHS{{GET LENGTH OF NAME ! 14786: {{ADD{R6{R9{{POINT TO SVKNM FIELD ! 14787: {{MOV{(R9){DMPKN{{STORE IN DUMMY KVBLK ! 14788: {{MOV{#TMBEB{R9{{POINT TO BLANK-EQUAL-BLANK ! 14789: {{JSR{PRTST{{{PRINT IT ! 14790: {{MOV{R10{DMPSV{{SAVE TABLE POINTER ! 14791: {{MOV{#DMPKB{R10{{POINT TO DUMMY KVBLK ! 14792: {{MOV{#4*KVVAR{R6{{SET ZERO OFFSET ! 14793: {{JSR{ACESS{{{GET KEYWORD VALUE ! 14794: {{PPM{{{{FAILURE IS IMPOSSIBLE ! 14795: {{JSR{PRTVL{{{PRINT KEYWORD VALUE ! 14796: {{JSR{PRTNL{{{TERMINATE PRINT LINE ! 14797: {{MOV{DMPSV{R10{{RESTORE TABLE POINTER ! 14798: {{BRN{DMP12{{{LOOP BACK TILL ALL PRINTED ! 14799: * ! 14800: * HERE AFTER COMPLETING PARTIAL DUMP ! 14801: * ! 14802: {DMP13{BEQ{DMARG{#NUM01{DMP27{EXIT IF PARTIAL DUMP COMPLETE ! 14803: {{MOV{DNAMB{R9{{ELSE POINT TO FIRST DYNAMIC BLOCK ! 14804: * ! 14805: * LOOP THROUGH BLOCKS IN DYNAMIC STORAGE ! 14806: * ! 14807: {DMP14{BEQ{R9{DNAMP{DMP27{JUMP IF END OF USED REGION ! 14808: {{MOV{(R9){R6{{ELSE LOAD FIRST WORD OF BLOCK ! 14809: {{BEQ{R6{#B$VCT{DMP16{JUMP IF VECTOR ! 14810: {{BEQ{R6{#B$ART{DMP17{JUMP IF ARRAY ! 14811: {{BEQ{R6{#B$PDT{DMP18{JUMP IF PROGRAM DEFINED ! 14812: {{BEQ{R6{#B$TBT{DMP19{JUMP IF TABLE ! 14813: {{BEQ{R6{#B$BCT{DMP30{JUMP IF BUFFER ! 14814: * ! 14815: * MERGE HERE TO MOVE TO NEXT BLOCK ! 14816: * ! 14817: {DMP15{JSR{BLKLN{{{GET LENGTH OF BLOCK ! 14818: {{ADD{R6{R9{{POINT PAST THIS BLOCK ! 14819: {{BRN{DMP14{{{LOOP BACK FOR NEXT BLOCK ! 14820: {{EJC{{{{ ! 14821: * ! 14822: * DUMPR (CONTINUED) ! 14823: * ! 14824: * HERE FOR VECTOR ! 14825: * ! 14826: {DMP16{MOV{#4*VCVLS{R7{{SET OFFSET TO FIRST VALUE ! 14827: {{BRN{DMP19{{{JUMP TO MERGE ! 14828: * ! 14829: * HERE FOR ARRAY ! 14830: * ! 14831: {DMP17{MOV{4*AROFS(R9){R7{{SET OFFSET TO ARPRO FIELD ! 14832: {{ICA{R7{{{BUMP TO GET OFFSET TO VALUES ! 14833: {{BRN{DMP19{{{JUMP TO MERGE ! 14834: * ! 14835: * HERE FOR PROGRAM DEFINED ! 14836: * ! 14837: {DMP18{MOV{#4*PDFLD{R7{{POINT TO VALUES, MERGE ! 14838: * ! 14839: * HERE FOR TABLE (OTHERS MERGE) ! 14840: * ! 14841: {DMP19{BZE{4*IDVAL(R9){DMP15{{IGNORE BLOCK IF ZERO ID VALUE ! 14842: {{JSR{BLKLN{{{ELSE GET BLOCK LENGTH ! 14843: {{MOV{R9{R10{{COPY BLOCK POINTER ! 14844: {{MOV{R6{DMPSV{{SAVE LENGTH ! 14845: {{MOV{R7{R6{{COPY OFFSET TO FIRST VALUE ! 14846: {{JSR{PRTNL{{{PRINT BLANK LINE ! 14847: {{MOV{R6{DMPSA{{PRESERVE OFFSET ! 14848: {{JSR{PRTVL{{{PRINT BLOCK VALUE (FOR TITLE) ! 14849: {{MOV{DMPSA{R6{{RECOVER OFFSET ! 14850: {{JSR{PRTNL{{{END PRINT LINE ! 14851: {{BEQ{(R9){#B$TBT{DMP22{JUMP IF TABLE ! 14852: {{DCA{R6{{{POINT BEFORE FIRST WORD ! 14853: * ! 14854: * LOOP TO PRINT CONTENTS OF ARRAY, VECTOR, OR PROGRAM DEF ! 14855: * ! 14856: {DMP20{MOV{R10{R9{{COPY BLOCK POINTER ! 14857: {{ICA{R6{{{BUMP OFFSET ! 14858: {{ADD{R6{R9{{POINT TO NEXT VALUE ! 14859: {{BEQ{R6{DMPSV{DMP14{EXIT IF END (XR PAST BLOCK) ! 14860: {{SUB{#4*VRVAL{R9{{SUBTRACT OFFSET TO MERGE INTO LOOP ! 14861: * ! 14862: * LOOP TO FIND VALUE AND IGNORE NULLS ! 14863: * ! 14864: {DMP21{MOV{4*VRVAL(R9){R9{{LOAD NEXT VALUE ! 14865: {{BEQ{R9{#NULLS{DMP20{LOOP BACK IF NULL VALUE ! 14866: {{BEQ{(R9){#B$TRT{DMP21{LOOP BACK IF TRAPPED ! 14867: {{JSR{PRTNV{{{ELSE PRINT NAME = VALUE ! 14868: {{BRN{DMP20{{{LOOP BACK FOR NEXT FIELD ! 14869: {{EJC{{{{ ! 14870: * ! 14871: * DUMPR (CONTINUED) ! 14872: * ! 14873: * HERE TO DUMP A TABLE ! 14874: * ! 14875: {DMP22{MOV{#4*TBBUK{R8{{SET OFFSET TO FIRST BUCKET ! 14876: {{MOV{#4*TEVAL{R6{{SET NAME OFFSET FOR ALL TEBLKS ! 14877: * ! 14878: * LOOP THROUGH TABLE BUCKETS ! 14879: * ! 14880: {DMP23{MOV{R10{-(SP){{SAVE TBBLK POINTER ! 14881: {{ADD{R8{R10{{POINT TO NEXT BUCKET HEADER ! 14882: {{ICA{R8{{{BUMP BUCKET OFFSET ! 14883: {{SUB{#4*TENXT{R10{{SUBTRACT OFFSET TO MERGE INTO LOOP ! 14884: * ! 14885: * LOOP TO PROCESS TEBLKS ON ONE CHAIN ! 14886: * ! 14887: {DMP24{MOV{4*TENXT(R10){R10{{POINT TO NEXT TEBLK ! 14888: {{BEQ{R10{(SP){DMP26{JUMP IF END OF CHAIN ! 14889: {{MOV{R10{R9{{ELSE COPY TEBLK POINTER ! 14890: * ! 14891: * LOOP TO FIND VALUE AND IGNORE IF NULL ! 14892: * ! 14893: {DMP25{MOV{4*TEVAL(R9){R9{{LOAD NEXT VALUE ! 14894: {{BEQ{R9{#NULLS{DMP24{IGNORE IF NULL VALUE ! 14895: {{BEQ{(R9){#B$TRT{DMP25{LOOP BACK IF TRAPPED ! 14896: {{MOV{R8{DMPSV{{ELSE SAVE OFFSET POINTER ! 14897: {{JSR{PRTNV{{{PRINT NAME = VALUE ! 14898: {{MOV{DMPSV{R8{{RELOAD OFFSET ! 14899: {{BRN{DMP24{{{LOOP BACK FOR NEXT TEBLK ! 14900: * ! 14901: * HERE TO MOVE TO NEXT HASH CHAIN ! 14902: * ! 14903: {DMP26{MOV{(SP)+{R10{{RESTORE TBBLK POINTER ! 14904: {{BNE{R8{4*TBLEN(R10){DMP23{LOOP BACK IF MORE BUCKETS TO GO ! 14905: {{MOV{R10{R9{{ELSE COPY TABLE POINTER ! 14906: {{ADD{R8{R9{{POINT TO FOLLOWING BLOCK ! 14907: {{BRN{DMP14{{{LOOP BACK TO PROCESS NEXT BLOCK ! 14908: * ! 14909: * HERE AFTER COMPLETING DUMP ! 14910: * ! 14911: {DMP27{JSR{PRTPG{{{EJECT PRINTER ! 14912: * ! 14913: * MERGE HERE IF NO DUMP GIVEN (DMARG=0) ! 14914: * ! 14915: {DMP28{EXI{{{{RETURN TO DUMP CALLER ! 14916: * ! 14917: * CALL SYSTEM CORE DUMP ROUTINE ! 14918: * ! 14919: {DMP29{JSR{SYSDM{{{CALL IT ! 14920: {{BRN{DMP28{{{RETURN ! 14921: {{EJC{{{{ ! 14922: * ! 14923: * DUMPR (CONTINUED) ! 14924: * ! 14925: * HERE TO DUMP BUFFER BLOCK ! 14926: * ! 14927: {DMP30{JSR{PRTNL{{{PRINT BLANK LINE ! 14928: {{JSR{PRTVL{{{PRINT VALUE ID FOR TITLE ! 14929: {{JSR{PRTNL{{{FORCE NEW LINE ! 14930: {{MOV{#CH$DQ{R6{{LOAD DOUBLE QUOTE ! 14931: {{JSR{PRTCH{{{PRINT IT ! 14932: {{MOV{4*BCLEN(R9){R8{{LOAD DEFINED LENGTH ! 14933: {{BZE{R8{DMP32{{SKIP CHARACTERS IF NONE ! 14934: {{LCT{R8{R8{{LOAD COUNT FOR LOOP ! 14935: {{MOV{R9{R7{{SAVE BCBLK PTR ! 14936: {{MOV{4*BCBUF(R9){R9{{POINT TO BFBLK ! 14937: {{PLC{R9{{{GET SET TO LOAD CHARACTERS ! 14938: * ! 14939: * LOOP HERE STUFFING CHARACTERS IN OUTPUT STREAM ! 14940: * ! 14941: {DMP31{LCH{R6{(R9)+{{GET NEXT CHARACTER ! 14942: {{JSR{PRTCH{{{STUFF IT ! 14943: {{BCT{R8{DMP31{{BRANCH FOR NEXT ONE ! 14944: {{MOV{R7{R9{{RESTORE BCBLK POINTER ! 14945: * ! 14946: * MERGE TO STUFF CLOSING QUOTE MARK ! 14947: * ! 14948: {DMP32{MOV{#CH$DQ{R6{{STUFF QUOTE ! 14949: {{JSR{PRTCH{{{PRINT IT ! 14950: {{JSR{PRTNL{{{PRINT NEW LINE ! 14951: {{MOV{(R9){R6{{GET FIRST WD FOR BLKLN ! 14952: {{BRN{DMP15{{{MERGE TO GET NEXT BLOCK ! 14953: {{ENP{{{{END PROCEDURE DUMPR ! 14954: {{EJC{{{{ ! 14955: * ! 14956: * ERMSG -- PRINT ERROR CODE AND ERROR MESSAGE ! 14957: * ! 14958: * KVERT ERROR CODE ! 14959: * JSR ERMSG CALL TO PRINT MESSAGE ! 14960: * (XR,XL,WA,WB,WC,IA) DESTROYED ! 14961: * ! 14962: {ERMSG{PRC{E{0{{ENTRY POINT ! 14963: {{JSR{PRTIS{{{PRINT ERROR PTR OR BLANK LINE ! 14964: {{MOV{KVERT{R6{{LOAD ERROR CODE ! 14965: {{MOV{#ERMMS{R9{{POINT TO ERROR MESSAGE /ERROR/ ! 14966: {{JSR{PRTST{{{PRINT IT ! 14967: {{JSR{ERTEX{{{GET ERROR MESSAGE TEXT ! 14968: {{ADD{#THSND{R6{{BUMP ERROR CODE FOR PRINT ! 14969: {{MTI{R6{{{FAIL CODE IN INT ACC ! 14970: {{JSR{PRTIN{{{PRINT CODE (NOW HAVE ERROR1XXX) ! 14971: {{MOV{PRBUF{R10{{POINT TO PRINT BUFFER ! 14972: {{PSC{R10{#NUM05{{POINT TO THE 1 ! 14973: {{MOV{#CH$BL{R6{{LOAD A BLANK ! 14974: {{SCH{R6{(R10){{STORE BLANK OVER 1 (ERROR XXX) ! 14975: {{CSC{R10{{{COMPLETE STORE CHARACTERS ! 14976: {{ZER{R10{{{CLEAR GARBAGE POINTER IN XL ! 14977: {{MOV{R9{R6{{KEEP ERROR TEXT ! 14978: {{MOV{#ERMNS{R9{{POINT TO / -- / ! 14979: {{JSR{PRTST{{{PRINT IT ! 14980: {{MOV{R6{R9{{GET ERROR TEXT AGAIN ! 14981: {{JSR{PRTST{{{PRINT ERROR MESSAGE TEXT ! 14982: {{JSR{PRTIS{{{PRINT LINE ! 14983: {{JSR{PRTIS{{{PRINT BLANK LINE ! 14984: {{EXI{{{{RETURN TO ERMSG CALLER ! 14985: {{ENP{{{{END PROCEDURE ERMSG ! 14986: {{EJC{{{{ ! 14987: * ! 14988: * ERTEX -- GET ERROR MESSAGE TEXT ! 14989: * ! 14990: * (WA) ERROR CODE ! 14991: * JSR ERTEX CALL TO GET ERROR TEXT ! 14992: * (XR) PTR TO ERROR TEXT IN DYNAMIC ! 14993: * (R$ETX) COPY OF PTR TO ERROR TEXT ! 14994: * (XL,WC,IA) DESTROYED ! 14995: * ! 14996: {ERTEX{PRC{E{0{{ENTRY POINT ! 14997: {{MOV{R6{ERTWA{{SAVE WA ! 14998: {{MOV{R7{ERTWB{{SAVE WB ! 14999: {{JSR{SYSEM{{{GET FAILURE MESSAGE TEXT ! 15000: {{MOV{R9{R10{{COPY POINTER TO IT ! 15001: {{MOV{4*SCLEN(R9){R6{{GET LENGTH OF STRING ! 15002: {{BZE{R6{ERT02{{JUMP IF NULL ! 15003: {{ZER{R7{{{OFFSET OF ZERO ! 15004: {{JSR{SBSTR{{{COPY INTO DYNAMIC STORE ! 15005: {{MOV{R9{R$ETX{{STORE FOR RELOCATION ! 15006: * ! 15007: * RETURN ! 15008: * ! 15009: {ERT01{MOV{ERTWB{R7{{RESTORE WB ! 15010: {{MOV{ERTWA{R6{{RESTORE WA ! 15011: {{EXI{{{{RETURN TO CALLER ! 15012: * ! 15013: * RETURN ERRTEXT CONTENTS INSTEAD OF NULL ! 15014: * ! 15015: {ERT02{MOV{R$ETX{R9{{GET ERRTEXT ! 15016: {{BRN{ERT01{{{RETURN ! 15017: {{ENP{{{{ ! 15018: {{EJC{{{{ ! 15019: * ! 15020: * EVALI -- EVALUATE INTEGER ARGUMENT ! 15021: * ! 15022: * EVALI IS USED BY PATTERN PRIMITIVES LEN,TAB,RTAB,POS,RPOS ! 15023: * WHEN THEIR ARGUMENT IS AN EXPRESSION VALUE. ! 15024: * ! 15025: * (XR) NODE POINTER ! 15026: * (WB) CURSOR ! 15027: * JSR EVALI CALL TO EVALUATE INTEGER ! 15028: * PPM LOC TRANSFER LOC FOR NON-INTEGER ARG ! 15029: * PPM LOC TRANSFER LOC FOR OUT OF RANGE ARG ! 15030: * PPM LOC TRANSFER LOC FOR EVALUATION FAILURE ! 15031: * PPM LOC TRANSFER LOC FOR SUCCESSFUL EVAL ! 15032: * (THE NORMAL RETURN IS NEVER TAKEN) ! 15033: * (XR) PTR TO NODE WITH INTEGER ARGUMENT ! 15034: * (WC,XL,RA) DESTROYED ! 15035: * ! 15036: * ON RETURN, THE NODE POINTED TO HAS THE INTEGER ARGUMENT ! 15037: * IN PARM1 AND THE PROPER SUCCESSOR POINTER IN PTHEN. ! 15038: * THIS ALLOWS MERGING WITH THE NORMAL (INTEGER ARG) CASE. ! 15039: * ! 15040: {EVALI{PRC{R{4{{ENTRY POINT (RECURSIVE) ! 15041: {{JSR{EVALP{{{EVALUATE EXPRESSION ! 15042: {{PPM{EVLI1{{{JUMP ON FAILURE ! 15043: {{MOV{R10{-(SP){{STACK RESULT FOR GTSMI ! 15044: {{MOV{4*PTHEN(R9){R10{{LOAD SUCCESSOR POINTER ! 15045: {{JSR{GTSMI{{{CONVERT ARG TO SMALL INTEGER ! 15046: {{PPM{EVLI2{{{JUMP IF NOT INTEGER ! 15047: {{PPM{EVLI3{{{JUMP IF OUT OF RANGE ! 15048: {{MOV{R9{EVLIV{{STORE RESULT IN SPECIAL DUMMY NODE ! 15049: {{MOV{R10{EVLIS{{STORE SUCCESSOR POINTER ! 15050: {{MOV{#EVLIN{R9{{POINT TO DUMMY NODE WITH RESULT ! 15051: {{EXI{4{{{TAKE SUCCESSFUL EXIT ! 15052: * ! 15053: * HERE IF EVALUATION FAILS ! 15054: * ! 15055: {EVLI1{EXI{3{{{TAKE FAILURE RETURN ! 15056: * ! 15057: * HERE IF ARGUMENT IS NOT INTEGER ! 15058: * ! 15059: {EVLI2{EXI{1{{{TAKE NON-INTEGER ERROR EXIT ! 15060: * ! 15061: * HERE IF ARGUMENT IS OUT OF RANGE ! 15062: * ! 15063: {EVLI3{EXI{2{{{TAKE OUT-OF-RANGE ERROR EXIT ! 15064: {{ENP{{{{END PROCEDURE EVALI ! 15065: {{EJC{{{{ ! 15066: * ! 15067: * EVALP -- EVALUATE EXPRESSION DURING PATTERN MATCH ! 15068: * ! 15069: * EVALP IS USED TO EVALUATE AN EXPRESSION (BY VALUE) DURING ! 15070: * A PATTERN MATCH. THE EFFECT IS LIKE EVALX, BUT PATTERN ! 15071: * VARIABLES ARE STACKED AND RESTORED IF NECESSARY. ! 15072: * ! 15073: * EVALP ALSO DIFFERS FROM EVALX IN THAT IF THE RESULT IS ! 15074: * AN EXPRESSION IT IS REEVALUATED. THIS OCCURS REPEATEDLY. ! 15075: * ! 15076: * (XR) NODE POINTER ! 15077: * (WB) PATTERN MATCH CURSOR ! 15078: * JSR EVALP CALL TO EVALUATE EXPRESSION ! 15079: * PPM LOC TRANSFER LOC IF EVALUATION FAILS ! 15080: * (XL) RESULT ! 15081: * (WA) FIRST WORD OF RESULT BLOCK ! 15082: * (XR,WB) DESTROYED (FAILURE CASE ONLY) ! 15083: * (WC,RA) DESTROYED ! 15084: * ! 15085: * THE EXPRESSION POINTER IS STORED IN PARM1 OF THE NODE ! 15086: * ! 15087: * CONTROL RETURNS TO FAILP ON FAILURE OF EVALUATION ! 15088: * ! 15089: {EVALP{PRC{R{1{{ENTRY POINT (RECURSIVE) ! 15090: {{MOV{4*PARM1(R9){R10{{LOAD EXPRESSION POINTER ! 15091: {{BEQ{(R10){#B$EXL{EVLP1{JUMP IF EXBLK CASE ! 15092: * ! 15093: * HERE FOR CASE OF SEBLK ! 15094: * ! 15095: * WE CAN GIVE A FAST RETURN IF THE VALUE OF THE VRBLK IS ! 15096: * NOT AN EXPRESSION AND IS NOT TRAPPED. ! 15097: * ! 15098: {{MOV{4*SEVAR(R10){R10{{LOAD VRBLK POINTER ! 15099: {{MOV{4*VRVAL(R10){R10{{LOAD VALUE OF VRBLK ! 15100: {{MOV{(R10){R6{{LOAD FIRST WORD OF VALUE ! 15101: {{BHI{R6{#B$T$${EVLP3{JUMP IF NOT SEBLK, TRBLK OR EXBLK ! 15102: * ! 15103: * HERE FOR EXBLK OR SEBLK WITH EXPR VALUE OR TRAPPED VALUE ! 15104: * ! 15105: {EVLP1{MOV{R9{-(SP){{STACK NODE POINTER ! 15106: {{MOV{R7{-(SP){{STACK CURSOR ! 15107: {{MOV{R$PMS{-(SP){{STACK SUBJECT STRING POINTER ! 15108: {{MOV{PMSSL{-(SP){{STACK SUBJECT STRING LENGTH ! 15109: {{MOV{PMDFL{-(SP){{STACK DOT FLAG ! 15110: {{MOV{PMHBS{-(SP){{STACK HISTORY STACK BASE POINTER ! 15111: {{MOV{4*PARM1(R9){R9{{LOAD EXPRESSION POINTER ! 15112: {{EJC{{{{ ! 15113: * ! 15114: * EVALP (CONTINUED) ! 15115: * ! 15116: * LOOP BACK HERE TO REEVALUATE EXPRESSION RESULT ! 15117: * ! 15118: {EVLP2{ZER{R7{{{SET FLAG FOR BY VALUE ! 15119: {{JSR{EVALX{{{EVALUATE EXPRESSION ! 15120: {{PPM{EVLP4{{{JUMP ON FAILURE ! 15121: {{MOV{(R9){R6{{ELSE LOAD FIRST WORD OF VALUE ! 15122: {{BLO{R6{#B$E$${EVLP2{LOOP BACK TO REEVALUATE EXPRESSION ! 15123: * ! 15124: * HERE TO RESTORE PATTERN VALUES AFTER SUCCESSFUL EVAL ! 15125: * ! 15126: {{MOV{R9{R10{{COPY RESULT POINTER ! 15127: {{MOV{(SP)+{PMHBS{{RESTORE HISTORY STACK BASE POINTER ! 15128: {{MOV{(SP)+{PMDFL{{RESTORE DOT FLAG ! 15129: {{MOV{(SP)+{PMSSL{{RESTORE SUBJECT STRING LENGTH ! 15130: {{MOV{(SP)+{R$PMS{{RESTORE SUBJECT STRING POINTER ! 15131: {{MOV{(SP)+{R7{{RESTORE CURSOR ! 15132: {{MOV{(SP)+{R9{{RESTORE NODE POINTER ! 15133: * ! 15134: * COMMON EXIT POINT ! 15135: * ! 15136: {EVLP3{EXI{{{{RETURN TO EVALP CALLER ! 15137: * ! 15138: * HERE FOR FAILURE DURING EVALUATION ! 15139: * ! 15140: {EVLP4{MOV{(SP)+{PMHBS{{RESTORE HISTORY STACK BASE POINTER ! 15141: {{MOV{(SP)+{PMDFL{{RESTORE DOT FLAG ! 15142: {{MOV{(SP)+{PMSSL{{RESTORE SUBJECT STRING LENGTH ! 15143: {{MOV{(SP)+{R$PMS{{RESTORE SUBJECT STRING POINTER ! 15144: {{ADD{#4*NUM02{SP{{REMOVE NODE PTR, CURSOR ! 15145: {{EXI{1{{{TAKE FAILURE EXIT ! 15146: {{ENP{{{{END PROCEDURE EVALP ! 15147: {{EJC{{{{ ! 15148: * ! 15149: * EVALS -- EVALUATE STRING ARGUMENT ! 15150: * ! 15151: * EVALS IS USED BY SPAN, ANY, NOTANY, BREAK, BREAKX WHEN ! 15152: * THEY ARE PASSED AN EXPRESSION ARGUMENT. ! 15153: * ! 15154: * (XR) NODE POINTER ! 15155: * (WB) CURSOR ! 15156: * JSR EVALS CALL TO EVALUATE STRING ! 15157: * PPM LOC TRANSFER LOC FOR NON-STRING ARG ! 15158: * PPM LOC TRANSFER LOC FOR EVALUATION FAILURE ! 15159: * PPM LOC TRANSFER LOC FOR SUCCESSFUL EVAL ! 15160: * (THE NORMAL RETURN IS NEVER TAKEN) ! 15161: * (XR) PTR TO NODE WITH PARMS SET ! 15162: * (XL,WC,RA) DESTROYED ! 15163: * ! 15164: * ON RETURN, THE NODE POINTED TO HAS A CHARACTER TABLE ! 15165: * POINTER IN PARM1 AND A BIT MASK IN PARM2. THE PROPER ! 15166: * SUCCESSOR IS STORED IN PTHEN OF THIS NODE. THUS IT IS ! 15167: * OK FOR MERGING WITH THE NORMAL (MULTI-CHAR STRING) CASE. ! 15168: * ! 15169: {EVALS{PRC{R{3{{ENTRY POINT (RECURSIVE) ! 15170: {{JSR{EVALP{{{EVALUATE EXPRESSION ! 15171: {{PPM{EVLS1{{{JUMP IF EVALUATION FAILS ! 15172: {{MOV{4*PTHEN(R9){-(SP){{SAVE SUCCESSOR POINTER ! 15173: {{MOV{R7{-(SP){{SAVE CURSOR ! 15174: {{MOV{R10{-(SP){{STACK RESULT PTR FOR PATST ! 15175: {{ZER{R7{{{DUMMY PCODE FOR ONE CHAR STRING ! 15176: {{ZER{R8{{{DUMMY PCODE FOR EXPRESSION ARG ! 15177: {{MOV{#P$BRK{R10{{APPROPRIATE PCODE FOR OUR USE ! 15178: {{JSR{PATST{{{CALL ROUTINE TO BUILD NODE ! 15179: {{PPM{EVLS2{{{JUMP IF NOT STRING ! 15180: {{MOV{(SP)+{R7{{RESTORE CURSOR ! 15181: {{MOV{(SP)+{4*PTHEN(R9){{STORE SUCCESSOR POINTER ! 15182: {{EXI{3{{{TAKE SUCCESS RETURN ! 15183: * ! 15184: * HERE IF EVALUATION FAILS ! 15185: * ! 15186: {EVLS1{EXI{2{{{TAKE FAILURE RETURN ! 15187: * ! 15188: * HERE IF ARGUMENT IS NOT STRING ! 15189: * ! 15190: {EVLS2{ADD{#4*NUM02{SP{{POP SUCCESSOR AND CURSOR ! 15191: {{EXI{1{{{TAKE NON-STRING ERROR EXIT ! 15192: {{ENP{{{{END PROCEDURE EVALS ! 15193: {{EJC{{{{ ! 15194: * ! 15195: * EVALX -- EVALUATE EXPRESSION ! 15196: * ! 15197: * EVALX IS CALLED TO EVALUATE AN EXPRESSION ! 15198: * ! 15199: * (XR) POINTER TO EXBLK OR SEBLK ! 15200: * (WB) 0 IF BY VALUE, 1 IF BY NAME ! 15201: * JSR EVALX CALL TO EVALUATE EXPRESSION ! 15202: * PPM LOC TRANSFER LOC IF EVALUATION FAILS ! 15203: * (XR) RESULT IF CALLED BY VALUE ! 15204: * (XL,WA) RESULT NAME BASE,OFFSET IF BY NAME ! 15205: * (XR) DESTROYED (NAME CASE ONLY) ! 15206: * (XL,WA) DESTROYED (VALUE CASE ONLY) ! 15207: * (WB,WC,RA) DESTROYED ! 15208: * ! 15209: {EVALX{PRC{R{1{{ENTRY POINT, RECURSIVE ! 15210: {{BEQ{(R9){#B$EXL{EVLX2{JUMP IF EXBLK CASE ! 15211: * ! 15212: * HERE FOR SEBLK ! 15213: * ! 15214: {{MOV{4*SEVAR(R9){R10{{LOAD VRBLK POINTER (NAME BASE) ! 15215: {{MOV{#4*VRVAL{R6{{SET NAME OFFSET ! 15216: {{BNZ{R7{EVLX1{{JUMP IF CALLED BY NAME ! 15217: {{JSR{ACESS{{{CALL ROUTINE TO ACCESS VALUE ! 15218: {{PPM{EVLX9{{{JUMP IF FAILURE ON ACCESS ! 15219: * ! 15220: * MERGE HERE TO EXIT FOR SEBLK CASE ! 15221: * ! 15222: {EVLX1{EXI{{{{RETURN TO EVALX CALLER ! 15223: {{EJC{{{{ ! 15224: * ! 15225: * EVALX (CONTINUED) ! 15226: * ! 15227: * HERE FOR FULL EXPRESSION (EXBLK) CASE ! 15228: * ! 15229: * IF AN ERROR OCCURS IN THE EXPRESSION CODE AT EXECUTION ! 15230: * TIME, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL ! 15231: * WITHOUT RETURNING TO THIS ROUTINE. ! 15232: * THE FOLLOWING ENTRIES ARE MADE ON THE STACK BEFORE ! 15233: * GIVING CONTROL TO THE EXPRESSION CODE ! 15234: * ! 15235: * EVALX RETURN POINT ! 15236: * SAVED VALUE OF R$COD ! 15237: * CODE POINTER (-R$COD) ! 15238: * SAVED VALUE OF FLPTR ! 15239: * 0 IF BY VALUE, 1 IF BY NAME ! 15240: * FLPTR --------------- *EXFLC, FAIL OFFSET IN EXBLK ! 15241: * ! 15242: {EVLX2{SCP{R8{{{GET CODE POINTER ! 15243: {{MOV{R$COD{R6{{LOAD CODE BLOCK POINTER ! 15244: {{SUB{R6{R8{{GET CODE POINTER AS OFFSET ! 15245: {{MOV{R6{-(SP){{STACK OLD CODE BLOCK POINTER ! 15246: {{MOV{R8{-(SP){{STACK RELATIVE CODE OFFSET ! 15247: {{MOV{FLPTR{-(SP){{STACK OLD FAILURE POINTER ! 15248: {{MOV{R7{-(SP){{STACK NAME/VALUE INDICATOR ! 15249: {{MOV{#4*EXFLC{-(SP){{STACK NEW FAIL OFFSET ! 15250: {{MOV{FLPTR{GTCEF{{KEEP IN CASE OF ERROR ! 15251: {{MOV{R$COD{R$GTC{{KEEP CODE BLOCK POINTER SIMILARLY ! 15252: {{MOV{SP{FLPTR{{SET NEW FAILURE POINTER ! 15253: {{MOV{R9{R$COD{{SET NEW CODE BLOCK POINTER ! 15254: {{MOV{KVSTN{4*EXSTM(R9){{REMEMBER STMNT NUMBER ! 15255: {{ADD{#4*EXCOD{R9{{POINT TO FIRST CODE WORD ! 15256: {{LCP{R9{{{SET CODE POINTER ! 15257: {{BNE{STAGE{#STGXT{EXITS{JUMP IF NOT EXECUTION TIME ! 15258: {{MOV{#STGEE{STAGE{{EVALUATING EXPRESSION ! 15259: {{BRN{EXITS{{{JUMP TO EXECUTE FIRST CODE WORD ! 15260: {{EJC{{{{ ! 15261: * ! 15262: * EVALX (CONTINUED) ! 15263: * ! 15264: * COME HERE IF SUCCESSFUL RETURN BY VALUE (SEE O$RVL) ! 15265: * ! 15266: {EVLX3{MOV{(SP)+{R9{{LOAD VALUE ! 15267: {{BZE{4*1(SP){EVLX5{{JUMP IF CALLED BY VALUE ! 15268: {{ERB{249{EXPRESSION{{EVALUATED BY NAME RETURNED VALUE ! 15269: * ! 15270: * HERE FOR EXPRESSION RETURNING BY NAME (SEE O$RNM) ! 15271: * ! 15272: {EVLX4{MOV{(SP)+{R6{{LOAD NAME OFFSET ! 15273: {{MOV{(SP)+{R10{{LOAD NAME BASE ! 15274: {{BNZ{4*1(SP){EVLX5{{JUMP IF CALLED BY NAME ! 15275: {{JSR{ACESS{{{ELSE ACCESS VALUE FIRST ! 15276: {{PPM{EVLX6{{{JUMP IF FAILURE DURING ACCESS ! 15277: * ! 15278: * HERE AFTER LOADING CORRECT RESULT INTO XR OR XL,WA ! 15279: * ! 15280: {EVLX5{ZER{R7{{{NOTE SUCCESSFUL ! 15281: {{BRN{EVLX7{{{MERGE ! 15282: * ! 15283: * HERE FOR FAILURE IN EXPRESSION EVALUATION (SEE O$FEX) ! 15284: * ! 15285: {EVLX6{MNZ{R7{{{NOTE UNSUCCESSFUL ! 15286: * ! 15287: * RESTORE ENVIRONMENT ! 15288: * ! 15289: {EVLX7{BNE{STAGE{#STGEE{EVLX8{SKIP IF WAS NOT PREVIOUSLY XT ! 15290: {{MOV{#STGXT{STAGE{{EXECUTE TIME ! 15291: * ! 15292: * MERGE WITH STAGE SET UP ! 15293: * ! 15294: {EVLX8{ADD{#4*NUM02{SP{{POP NAME/VALUE INDICATOR, *EXFAL ! 15295: {{MOV{(SP)+{FLPTR{{RESTORE OLD FAILURE POINTER ! 15296: {{MOV{(SP)+{R8{{LOAD CODE OFFSET ! 15297: {{ADD{(SP){R8{{MAKE CODE POINTER ABSOLUTE ! 15298: {{MOV{(SP)+{R$COD{{RESTORE OLD CODE BLOCK POINTER ! 15299: {{LCP{R8{{{RESTORE OLD CODE POINTER ! 15300: {{BZE{R7{EVLX1{{JUMP FOR SUCCESSFUL RETURN ! 15301: * ! 15302: * MERGE HERE FOR FAILURE IN SEBLK CASE ! 15303: * ! 15304: {EVLX9{EXI{1{{{TAKE FAILURE EXIT ! 15305: {{ENP{{{{END OF PROCEDURE EVALX ! 15306: {{EJC{{{{ ! 15307: * ! 15308: * EXBLD -- BUILD EXBLK ! 15309: * ! 15310: * EXBLD IS USED TO BUILD AN EXPRESSION BLOCK FROM THE ! 15311: * CODE COMPILED MOST RECENTLY IN THE CURRENT CCBLK. ! 15312: * ! 15313: * (XL) OFFSET IN CCBLK TO START OF CODE ! 15314: * (WB) INTEGER IN RANGE 0 LE N LE MXLEN ! 15315: * JSR EXBLD CALL TO BUILD EXBLK ! 15316: * (XR) PTR TO CONSTRUCTED EXBLK ! 15317: * (WA,WB,XL) DESTROYED ! 15318: * ! 15319: {EXBLD{PRC{E{0{{ENTRY POINT ! 15320: {{MOV{R10{R6{{COPY OFFSET TO START OF CODE ! 15321: {{SUB{#4*EXCOD{R6{{CALC REDUCTION IN OFFSET IN EXBLK ! 15322: {{MOV{R6{-(SP){{STACK FOR LATER ! 15323: {{MOV{CWCOF{R6{{LOAD FINAL OFFSET ! 15324: {{SUB{R10{R6{{COMPUTE LENGTH OF CODE ! 15325: {{ADD{#4*EXSI${R6{{ADD SPACE FOR STANDARD FIELDS ! 15326: {{JSR{ALLOC{{{ALLOCATE SPACE FOR EXBLK ! 15327: {{MOV{R9{-(SP){{SAVE POINTER TO EXBLK ! 15328: {{MOV{#B$EXL{4*EXTYP(R9){{STORE TYPE WORD ! 15329: {{ZER{4*EXSTM(R9){{{ZEROISE STMNT NUMBER FIELD ! 15330: {{MOV{R6{4*EXLEN(R9){{STORE LENGTH ! 15331: {{MOV{#OFEX${4*EXFLC(R9){{STORE FAILURE WORD ! 15332: {{ADD{#4*EXSI${R9{{SET XR FOR SYSMW ! 15333: {{MOV{R10{CWCOF{{RESET OFFSET TO START OF CODE ! 15334: {{ADD{R$CCB{R10{{POINT TO START OF CODE ! 15335: {{SUB{#4*EXSI${R6{{LENGTH OF CODE TO MOVE ! 15336: {{MOV{R6{-(SP){{STACK LENGTH OF CODE ! 15337: {{MVW{{{{MOVE CODE TO EXBLK ! 15338: {{MOV{(SP)+{R6{{GET LENGTH OF CODE ! 15339: {{BTW{R6{{{CONVERT BYTE COUNT TO WORD COUNT ! 15340: {{LCT{R6{R6{{PREPARE COUNTER FOR LOOP ! 15341: {{MOV{(SP){R10{{COPY EXBLK PTR, DONT UNSTACK ! 15342: {{ADD{#4*EXCOD{R10{{POINT TO CODE ITSELF ! 15343: {{MOV{4*1(SP){R7{{GET REDUCTION IN OFFSET ! 15344: * ! 15345: * THIS LOOP SEARCHES FOR NEGATION AND SELECTION CODE SO ! 15346: * THAT THE OFFSETS COMPUTED WHILST CODE WAS IN CODE BLOCK ! 15347: * CAN BE TRANSFORMED TO REDUCED VALUES APPLICABLE IN AN ! 15348: * EXBLK. ! 15349: * ! 15350: {EXBL1{MOV{(R10)+{R9{{GET NEXT CODE WORD ! 15351: {{BEQ{R9{#OSLA${EXBL3{JUMP IF SELECTION FOUND ! 15352: {{BEQ{R9{#ONTA${EXBL3{JUMP IF NEGATION FOUND ! 15353: {{BCT{R6{EXBL1{{LOOP TO END OF CODE ! 15354: * ! 15355: * NO SELECTION FOUND OR MERGE TO EXIT ON TERMINATION ! 15356: * ! 15357: {EXBL2{MOV{(SP)+{R9{{POP EXBLK PTR INTO XR ! 15358: {{MOV{(SP)+{R10{{POP REDUCTION CONSTANT ! 15359: {{EXI{{{{RETURN TO CALLER ! 15360: {{EJC{{{{ ! 15361: * ! 15362: * EXBLD (CONTINUED) ! 15363: * ! 15364: * SELECTION OR NEGATION FOUND ! 15365: * REDUCE THE OFFSETS AS NEEDED. OFFSETS OCCUR IN WORDS ! 15366: * FOLLOWING CODE WORDS - ! 15367: * =ONTA$, =OSLA$, =OSLB$, =OSLC$ ! 15368: * ! 15369: {EXBL3{SUB{R7{(R10)+{{ADJUST OFFSET ! 15370: {{BCT{R6{EXBL4{{DECREMENT COUNT ! 15371: * ! 15372: {EXBL4{BCT{R6{EXBL5{{DECREMENT COUNT ! 15373: * ! 15374: * CONTINUE SEARCH FOR MORE OFFSETS ! 15375: * ! 15376: {EXBL5{MOV{(R10)+{R9{{GET NEXT CODE WORD ! 15377: {{BEQ{R9{#OSLA${EXBL3{JUMP IF OFFSET FOUND ! 15378: {{BEQ{R9{#OSLB${EXBL3{JUMP IF OFFSET FOUND ! 15379: {{BEQ{R9{#OSLC${EXBL3{JUMP IF OFFSET FOUND ! 15380: {{BEQ{R9{#ONTA${EXBL3{JUMP IF OFFSET FOUND ! 15381: {{BCT{R6{EXBL5{{LOOP ! 15382: {{BRN{EXBL2{{{MERGE TO RETURN ! 15383: {{ENP{{{{END PROCEDURE EXBLD ! 15384: {{EJC{{{{ ! 15385: * ! 15386: * EXPAN -- ANALYZE EXPRESSION ! 15387: * ! 15388: * THE EXPRESSION ANALYZER (EXPAN) PROCEDURE IS USED TO SCAN ! 15389: * AN EXPRESSION AND CONVERT IT INTO A TREE REPRESENTATION. ! 15390: * SEE DESCRIPTIONS OF CMBLK, CUBLK, CBBLK IN THE STRUCTURES ! 15391: * SECTION FOR DETAILED FORMAT OF TREE BLOCKS. ! 15392: * ! 15393: * THE ANALYZER USES A SIMPLE PRECEDENCE SCHEME IN WHICH ! 15394: * OPERANDS AND OPERATORS ARE PLACED ON A SINGLE STACK ! 15395: * AND CONDENSATIONS ARE MADE WHEN LOW PRECEDENCE OPERATORS ! 15396: * ARE STACKED AFTER A HIGHER PRECEDENCE OPERATOR. A GLOBAL ! 15397: * VARIABLE (IN WB) KEEPS TRACK OF THE LEVEL AS FOLLOWS. ! 15398: * ! 15399: * 0 SCANNING OUTER LEVEL OF STATEMENT OR EXPRESSION ! 15400: * 1 SCANNING OUTER LEVEL OF NORMAL GOTO ! 15401: * 2 SCANNING OUTER LEVEL OF DIRECT GOTO ! 15402: * 3 SCANNING INSIDE ARRAY BRACKETS ! 15403: * 4 SCANNING INSIDE GROUPING PARENTHESES ! 15404: * 5 SCANNING INSIDE FUNCTION PARENTHESES ! 15405: * ! 15406: * THIS VARIABLE IS SAVED ON THE STACK ON ENCOUNTERING A ! 15407: * GROUPING AND RESTORED AT THE END OF THE GROUPING. ! 15408: * ! 15409: * ANOTHER GLOBAL VARIABLE (IN WC) COUNTS THE NUMBER OF ! 15410: * ITEMS AT ONE GROUPING LEVEL AND IS INCREMENTED FOR EACH ! 15411: * COMMA ENCOUNTERED. IT IS STACKED WITH THE LEVEL INDICATOR ! 15412: * ! 15413: * THE SCAN IS CONTROLLED BY A THREE STATE FINITE MACHINE. ! 15414: * A GLOBAL VARIABLE STORED IN WA IS THE CURRENT STATE. ! 15415: * ! 15416: * WA=0 NOTHING SCANNED AT THIS LEVEL ! 15417: * WA=1 OPERAND EXPECTED ! 15418: * WA=2 OPERATOR EXPECTED ! 15419: * ! 15420: * (WB) CALL TYPE (SEE BELOW) ! 15421: * JSR EXPAN CALL TO ANALYZE EXPRESSION ! 15422: * (XR) POINTER TO RESULTING TREE ! 15423: * (XL,WA,WB,WC,RA) DESTROYED ! 15424: * ! 15425: * THE ENTRY VALUE OF WB INDICATES THE CALL TYPE AS FOLLOWS. ! 15426: * ! 15427: * 0 SCANNING EITHER THE MAIN BODY OF A STATEMENT OR THE ! 15428: * TEXT OF AN EXPRESSION (FROM EVAL CALL). VALID ! 15429: * TERMINATORS ARE COLON, SEMICOLON. THE RESCAN FLAG IS ! 15430: * SET TO RETURN THE TERMINATOR ON THE NEXT SCANE CALL. ! 15431: * ! 15432: * 1 SCANNING A NORMAL GOTO. THE ONLY VALID ! 15433: * TERMINATOR IS A RIGHT PAREN. ! 15434: * ! 15435: * 2 SCANNING A DIRECT GOTO. THE ONLY VALID ! 15436: * TERMINATOR IS A RIGHT BRACKET. ! 15437: {{EJC{{{{ ! 15438: * ! 15439: * EXPAN (CONTINUED) ! 15440: * ! 15441: * ENTRY POINT ! 15442: * ! 15443: {EXPAN{PRC{E{0{{ENTRY POINT ! 15444: {{ZER{-(SP){{{SET TOP OF STACK INDICATOR ! 15445: {{ZER{R6{{{SET INITIAL STATE TO ZERO ! 15446: {{ZER{R8{{{ZERO COUNTER VALUE ! 15447: * ! 15448: * LOOP HERE FOR SUCCESSIVE ENTRIES ! 15449: * ! 15450: {EXP01{JSR{SCANE{{{SCAN NEXT ELEMENT ! 15451: {{ADD{R6{R10{{ADD STATE TO SYNTAX CODE ! 15452: {{BSW{R10{T$NES{{SWITCH ON ELEMENT TYPE/STATE ! 15453: {{IFF{T$UO0{EXP27{{UNOP, S=0 ! 15454: {{IFF{T$UO1{EXP27{{UNOP, S=1 ! 15455: {{IFF{T$UO2{EXP04{{UNOP, S=2 ! 15456: {{IFF{T$LP0{EXP06{{LEFT PAREN, S=0 ! 15457: {{IFF{T$LP1{EXP06{{LEFT PAREN, S=1 ! 15458: {{IFF{T$LP2{EXP04{{LEFT PAREN, S=2 ! 15459: {{IFF{T$LB0{EXP08{{LEFT BRKT, S=0 ! 15460: {{IFF{T$LB1{EXP08{{LEFT BRKT, S=1 ! 15461: {{IFF{T$LB2{EXP09{{LEFT BRKT, S=2 ! 15462: {{IFF{T$CM0{EXP02{{COMMA, S=0 ! 15463: {{IFF{T$CM1{EXP05{{COMMA, S=1 ! 15464: {{IFF{T$CM2{EXP11{{COMMA, S=2 ! 15465: {{IFF{T$FN0{EXP10{{FUNCTION, S=0 ! 15466: {{IFF{T$FN1{EXP10{{FUNCTION, S=1 ! 15467: {{IFF{T$FN2{EXP04{{FUNCTION, S=2 ! 15468: {{IFF{T$VA0{EXP03{{VARIABLE, S=0 ! 15469: {{IFF{T$VA1{EXP03{{VARIABLE, STATE ONE ! 15470: {{IFF{T$VA2{EXP04{{VARIABLE, S=2 ! 15471: {{IFF{T$CO0{EXP03{{CONSTANT, S=0 ! 15472: {{IFF{T$CO1{EXP03{{CONSTANT, S=1 ! 15473: {{IFF{T$CO2{EXP04{{CONSTANT, S=2 ! 15474: {{IFF{T$BO0{EXP05{{BINOP, S=0 ! 15475: {{IFF{T$BO1{EXP05{{BINOP, S=1 ! 15476: {{IFF{T$BO2{EXP26{{BINOP, S=2 ! 15477: {{IFF{T$RP0{EXP02{{RIGHT PAREN, S=0 ! 15478: {{IFF{T$RP1{EXP05{{RIGHT PAREN, S=1 ! 15479: {{IFF{T$RP2{EXP12{{RIGHT PAREN, S=2 ! 15480: {{IFF{T$RB0{EXP02{{RIGHT BRKT, S=0 ! 15481: {{IFF{T$RB1{EXP05{{RIGHT BRKT, S=1 ! 15482: {{IFF{T$RB2{EXP18{{RIGHT BRKT, S=2 ! 15483: {{IFF{T$CL0{EXP02{{COLON, S=0 ! 15484: {{IFF{T$CL1{EXP05{{COLON, S=1 ! 15485: {{IFF{T$CL2{EXP19{{COLON, S=2 ! 15486: {{IFF{T$SM0{EXP02{{SEMICOLON, S=0 ! 15487: {{IFF{T$SM1{EXP05{{SEMICOLON, S=1 ! 15488: {{IFF{T$SM2{EXP19{{SEMICOLON, S=2 ! 15489: {{ESW{{{{END SWITCH ON ELEMENT TYPE/STATE ! 15490: {{EJC{{{{ ! 15491: * ! 15492: * EXPAN (CONTINUED) ! 15493: * ! 15494: * HERE FOR RBR,RPR,COL,SMC,CMA IN STATE 0 ! 15495: * ! 15496: * SET TO RESCAN THE TERMINATOR ENCOUNTERED AND CREATE ! 15497: * A NULL CONSTANT (CASE OF OMITTED NULL) ! 15498: * ! 15499: {EXP02{MNZ{SCNRS{{{SET TO RESCAN ELEMENT ! 15500: {{MOV{#NULLS{R9{{POINT TO NULL, MERGE ! 15501: * ! 15502: * HERE FOR VAR OR CON IN STATES 0,1 ! 15503: * ! 15504: * STACK THE VARIABLE/CONSTANT AND SET STATE=2 ! 15505: * ! 15506: {EXP03{MOV{R9{-(SP){{STACK POINTER TO OPERAND ! 15507: {{MOV{#NUM02{R6{{SET STATE 2 ! 15508: {{BRN{EXP01{{{JUMP FOR NEXT ELEMENT ! 15509: * ! 15510: * HERE FOR VAR,CON,LPR,FNC,UOP IN STATE 2 ! 15511: * ! 15512: * WE RESCAN THE ELEMENT AND CREATE A CONCATENATION OPERATOR ! 15513: * THIS IS THE CASE OF THE BLANK CONCATENATION OPERATOR. ! 15514: * ! 15515: {EXP04{MNZ{SCNRS{{{SET TO RESCAN ELEMENT ! 15516: {{MOV{#OPDVC{R9{{POINT TO CONCAT OPERATOR DV ! 15517: {{BZE{R7{EXP4A{{OK IF AT TOP LEVEL ! 15518: {{MOV{#OPDVP{R9{{ELSE POINT TO UNMISTAKABLE CONCAT. ! 15519: * ! 15520: * MERGE HERE WHEN XR SET UP WITH PROPER CONCATENATION DVBLK ! 15521: * ! 15522: {EXP4A{BNZ{SCNBL{EXP26{{MERGE BOP IF BLANKS, ELSE ERROR ! 15523: {{DCV{SCNSE{{{ADJUST START OF ELEMENT LOCATION ! 15524: {{ERB{220{SYNTAX{{ERROR. MISSING OPERATOR ! 15525: * ! 15526: * HERE FOR CMA,RPR,RBR,COL,SMC,BOP(S=1) BOP(S=0) ! 15527: * ! 15528: * THIS IS AN ERRONOUS CONTRUCTION ! 15529: * ! 15530: {EXP05{DCV{SCNSE{{{ADJUST START OF ELEMENT LOCATION ! 15531: {{ERB{221{SYNTAX{{ERROR. MISSING OPERAND ! 15532: * ! 15533: * HERE FOR LPR (S=0,1) ! 15534: * ! 15535: {EXP06{MOV{#NUM04{R10{{SET NEW LEVEL INDICATOR ! 15536: {{ZER{R9{{{SET ZERO VALUE FOR CMOPN ! 15537: {{EJC{{{{ ! 15538: * ! 15539: * EXPAN (CONTINUED) ! 15540: * ! 15541: * MERGE HERE TO STORE OLD LEVEL ON STACK AND START NEW ONE ! 15542: * ! 15543: {EXP07{MOV{R9{-(SP){{STACK CMOPN VALUE ! 15544: {{MOV{R8{-(SP){{STACK OLD COUNTER ! 15545: {{MOV{R7{-(SP){{STACK OLD LEVEL INDICATOR ! 15546: {{CHK{{{{CHECK FOR STACK OVERFLOW ! 15547: {{ZER{R6{{{SET NEW STATE TO ZERO ! 15548: {{MOV{R10{R7{{SET NEW LEVEL INDICATOR ! 15549: {{MOV{#NUM01{R8{{INITIALIZE NEW COUNTER ! 15550: {{BRN{EXP01{{{JUMP TO SCAN NEXT ELEMENT ! 15551: * ! 15552: * HERE FOR LBR (S=0,1) ! 15553: * ! 15554: * THIS IS AN ILLEGAL USE OF LEFT BRACKET ! 15555: * ! 15556: {EXP08{ERB{222{SYNTAX{{ERROR. INVALID USE OF LEFT BRACKET ! 15557: * ! 15558: * HERE FOR LBR (S=2) ! 15559: * ! 15560: * SET NEW LEVEL AND START TO SCAN SUBSCRIPTS ! 15561: * ! 15562: {EXP09{MOV{(SP)+{R9{{LOAD ARRAY PTR FOR CMOPN ! 15563: {{MOV{#NUM03{R10{{SET NEW LEVEL INDICATOR ! 15564: {{BRN{EXP07{{{JUMP TO STACK OLD AND START NEW ! 15565: * ! 15566: * HERE FOR FNC (S=0,1) ! 15567: * ! 15568: * STACK OLD LEVEL AND START TO SCAN ARGUMENTS ! 15569: * ! 15570: {EXP10{MOV{#NUM05{R10{{SET NEW LEV INDIC (XR=VRBLK=CMOPN) ! 15571: {{BRN{EXP07{{{JUMP TO STACK OLD AND START NEW ! 15572: * ! 15573: * HERE FOR CMA (S=2) ! 15574: * ! 15575: * INCREMENT ARGUMENT COUNT AND CONTINUE ! 15576: * ! 15577: {EXP11{ICV{R8{{{INCREMENT COUNTER ! 15578: {{JSR{EXPDM{{{DUMP OPERATORS AT THIS LEVEL ! 15579: {{ZER{-(SP){{{SET NEW LEVEL FOR PARAMETER ! 15580: {{ZER{R6{{{SET NEW STATE ! 15581: {{BGT{R7{#NUM02{EXP01{LOOP BACK UNLESS OUTER LEVEL ! 15582: {{ERB{223{SYNTAX{{ERROR. INVALID USE OF COMMA ! 15583: {{EJC{{{{ ! 15584: * ! 15585: * EXPAN (CONTINUED) ! 15586: * ! 15587: * HERE FOR RPR (S=2) ! 15588: * ! 15589: * AT OUTER LEVEL IN A NORMAL GOTO THIS IS A TERMINATOR ! 15590: * OTHERWISE IT MUST TERMINATE A FUNCTION OR GROUPING ! 15591: * ! 15592: {EXP12{BEQ{R7{#NUM01{EXP20{END OF NORMAL GOTO ! 15593: {{BEQ{R7{#NUM05{EXP13{END OF FUNCTION ARGUMENTS ! 15594: {{BEQ{R7{#NUM04{EXP14{END OF GROUPING / SELECTION ! 15595: {{ERB{224{SYNTAX{{ERROR. UNBALANCED RIGHT PARENTHESIS ! 15596: * ! 15597: * HERE AT END OF FUNCTION ARGUMENTS ! 15598: * ! 15599: {EXP13{MOV{#C$FNC{R10{{SET CMTYP VALUE FOR FUNCTION ! 15600: {{BRN{EXP15{{{JUMP TO BUILD CMBLK ! 15601: * ! 15602: * HERE FOR END OF GROUPING ! 15603: * ! 15604: {EXP14{BEQ{R8{#NUM01{EXP17{JUMP IF END OF GROUPING ! 15605: {{MOV{#C$SEL{R10{{ELSE SET CMTYP FOR SELECTION ! 15606: * ! 15607: * MERGE HERE TO BUILD CMBLK FOR LEVEL JUST SCANNED AND ! 15608: * TO POP UP TO THE PREVIOUS SCAN LEVEL BEFORE CONTINUING. ! 15609: * ! 15610: {EXP15{JSR{EXPDM{{{DUMP OPERATORS AT THIS LEVEL ! 15611: {{MOV{R8{R6{{COPY COUNT ! 15612: {{ADD{#CMVLS{R6{{ADD FOR STANDARD FIELDS AT START ! 15613: {{WTB{R6{{{CONVERT LENGTH TO BYTES ! 15614: {{JSR{ALLOC{{{ALLOCATE SPACE FOR CMBLK ! 15615: {{MOV{#B$CMT{(R9){{STORE TYPE CODE FOR CMBLK ! 15616: {{MOV{R10{4*CMTYP(R9){{STORE CMBLK NODE TYPE INDICATOR ! 15617: {{MOV{R6{4*CMLEN(R9){{STORE LENGTH ! 15618: {{ADD{R6{R9{{POINT PAST END OF BLOCK ! 15619: {{LCT{R8{R8{{SET LOOP COUNTER ! 15620: * ! 15621: * LOOP TO MOVE REMAINING WORDS TO CMBLK ! 15622: * ! 15623: {EXP16{MOV{(SP)+{-(R9){{MOVE ONE OPERAND PTR FROM STACK ! 15624: {{MOV{(SP)+{R7{{POP TO OLD LEVEL INDICATOR ! 15625: {{BCT{R8{EXP16{{LOOP TILL ALL MOVED ! 15626: {{EJC{{{{ ! 15627: * ! 15628: * EXPAN (CONTINUED) ! 15629: * ! 15630: * COMPLETE CMBLK AND STACK POINTER TO IT ON STACK ! 15631: * ! 15632: {{SUB{#4*CMVLS{R9{{POINT BACK TO START OF BLOCK ! 15633: {{MOV{(SP)+{R8{{RESTORE OLD COUNTER ! 15634: {{MOV{(SP){4*CMOPN(R9){{STORE OPERAND PTR IN CMBLK ! 15635: {{MOV{R9{(SP){{STACK CMBLK POINTER ! 15636: {{MOV{#NUM02{R6{{SET NEW STATE ! 15637: {{BRN{EXP01{{{BACK FOR NEXT ELEMENT ! 15638: * ! 15639: * HERE AT END OF A PARENTHESIZED EXPRESSION ! 15640: * ! 15641: {EXP17{JSR{EXPDM{{{DUMP OPERATORS AT THIS LEVEL ! 15642: {{MOV{(SP)+{R9{{RESTORE XR ! 15643: {{MOV{(SP)+{R7{{RESTORE OUTER LEVEL ! 15644: {{MOV{(SP)+{R8{{RESTORE OUTER COUNT ! 15645: {{MOV{R9{(SP){{STORE OPND OVER UNUSED CMOPN VAL ! 15646: {{MOV{#NUM02{R6{{SET NEW STATE ! 15647: {{BRN{EXP01{{{BACK FOR NEXT ELE8ENT ! 15648: * ! 15649: * HERE FOR RBR (S=2) ! 15650: * ! 15651: * AT OUTER LEVEL IN A DIRECT GOTO, THIS IS A TERMINATOR. ! 15652: * OTHERWISE IT MUST TERMINATE A SUBSCRIPT LIST. ! 15653: * ! 15654: {EXP18{MOV{#C$ARR{R10{{SET CMTYP FOR ARRAY REFERENCE ! 15655: {{BEQ{R7{#NUM03{EXP15{JUMP TO BUILD CMBLK IF END ARRAYREF ! 15656: {{BEQ{R7{#NUM02{EXP20{JUMP IF END OF DIRECT GOTO ! 15657: {{ERB{225{SYNTAX{{ERROR. UNBALANCED RIGHT BRACKET ! 15658: {{EJC{{{{ ! 15659: * ! 15660: * EXPAN (CONTINUED) ! 15661: * ! 15662: * HERE FOR COL,SMC (S=2) ! 15663: * ! 15664: * ERROR UNLESS TERMINATING STATEMENT BODY AT OUTER LEVEL ! 15665: * ! 15666: {EXP19{MNZ{SCNRS{{{RESCAN TERMINATOR ! 15667: {{MOV{R7{R10{{COPY LEVEL INDICATOR ! 15668: {{BSW{R10{6{{SWITCH ON LEVEL INDICATOR ! 15669: {{IFF{0{EXP20{{NORMAL OUTER LEVEL ! 15670: {{IFF{1{EXP22{{FAIL IF NORMAL GOTO ! 15671: {{IFF{2{EXP23{{FAIL IF DIRECT GOTO ! 15672: {{IFF{3{EXP24{{FAIL ARRAY BRACKETS ! 15673: {{IFF{4{EXP21{{FAIL IF IN GROUPING ! 15674: {{IFF{5{EXP21{{FAIL FUNCTION ARGS ! 15675: {{ESW{{{{END SWITCH ON LEVEL ! 15676: * ! 15677: * HERE AT NORMAL END OF EXPRESSION ! 15678: * ! 15679: {EXP20{JSR{EXPDM{{{DUMP REMAINING OPERATORS ! 15680: {{MOV{(SP)+{R9{{LOAD TREE POINTER ! 15681: {{ICA{SP{{{POP OFF BOTTOM OF STACK MARKER ! 15682: {{EXI{{{{RETURN TO EXPAN CALLER ! 15683: * ! 15684: * MISSING RIGHT PAREN ! 15685: * ! 15686: {EXP21{ERB{226{SYNTAX{{ERROR. MISSING RIGHT PAREN ! 15687: * ! 15688: * MISSING RIGHT PAREN IN GOTO FIELD ! 15689: * ! 15690: {EXP22{ERB{227{SYNTAX{{ERROR. RIGHT PAREN MISSING FROM GOTO ! 15691: * ! 15692: * MISSING BRACKET IN GOTO ! 15693: * ! 15694: {EXP23{ERB{228{SYNTAX{{ERROR. RIGHT BRACKET MISSING FROM GOTO ! 15695: * ! 15696: * MISSING ARRAY BRACKET ! 15697: * ! 15698: {EXP24{ERB{229{SYNTAX{{ERROR. MISSING RIGHT ARRAY BRACKET ! 15699: {{EJC{{{{ ! 15700: * ! 15701: * EXPAN (CONTINUED) ! 15702: * ! 15703: * LOOP HERE WHEN AN OPERATOR CAUSES AN OPERATOR DUMP ! 15704: * ! 15705: {EXP25{MOV{R9{EXPSV{{ ! 15706: {{JSR{EXPOP{{{POP ONE OPERATOR ! 15707: {{MOV{EXPSV{R9{{RESTORE OP DV POINTER AND MERGE ! 15708: * ! 15709: * HERE FOR BOP (S=2) ! 15710: * ! 15711: * REMOVE OPERATORS (CONDENSE) FROM STACK UNTIL NO MORE ! 15712: * LEFT AT THIS LEVEL OR TOP ONE HAS LOWER PRECEDENCE. ! 15713: * LOOP HERE TILL THIS CONDITION IS MET. ! 15714: * ! 15715: {EXP26{MOV{4*1(SP){R10{{LOAD OPERATOR DVPTR FROM STACK ! 15716: {{BLE{R10{#NUM05{EXP27{JUMP IF BOTTOM OF STACK LEVEL ! 15717: {{BLT{4*DVRPR(R9){4*DVLPR(R10){EXP25{ELSE POP IF NEW PREC IS LO ! 15718: * ! 15719: * HERE FOR UOP (S=0,1) ! 15720: * ! 15721: * BINARY OPERATOR MERGES AFTER PRECEDENCE CHECK ! 15722: * ! 15723: * THE OPERATOR DV IS STORED ON THE STACK AND THE SCAN ! 15724: * CONTINUES AFTER SETTING THE SCAN STATE TO ONE. ! 15725: * ! 15726: {EXP27{MOV{R9{-(SP){{STACK OPERATOR DVPTR ON STACK ! 15727: {{CHK{{{{CHECK FOR STACK OVERFLOW ! 15728: {{MOV{#NUM01{R6{{SET NEW STATE ! 15729: {{BNE{R9{#OPDVS{EXP01{BACK FOR NEXT ELEMENT UNLESS = ! 15730: * ! 15731: * HERE FOR SPECIAL CASE OF BINARY =. THE SYNTAX ALLOWS A ! 15732: * NULL RIGHT ARGUMENT FOR THIS OPERATOR TO BE LEFT ! 15733: * OUT. ACCORDINGLY WE RESET TO STATE ZERO TO GET PROPER ! 15734: * ACTION ON A TERMINATOR (SUPPLY A NULL CONSTANT). ! 15735: * ! 15736: {{ZER{R6{{{SET STATE ZERO ! 15737: {{BRN{EXP01{{{JUMP FOR NEXT ELEMENT ! 15738: {{ENP{{{{END PROCEDURE EXPAN ! 15739: {{EJC{{{{ ! 15740: * ! 15741: * EXPAP -- TEST FOR PATTERN MATCH TREE ! 15742: * ! 15743: * EXPAP IS PASSED AN EXPRESSION TREE TO DETERMINE IF IT ! 15744: * IS A PATTERN MATCH. THE FOLLOWING ARE RECOGIZED AS ! 15745: * MATCHES IN THE CONTEXT OF THIS CALL. ! 15746: * ! 15747: * 1) AN EXPLICIT USE OF BINARY QUESTION MARK ! 15748: * 2) A CONCATENATION ! 15749: * 3) AN ALTERNATION WHOSE LEFT OPERAND IS A CONCATENATION ! 15750: * ! 15751: * (XR) PTR TO EXPAN TREE ! 15752: * JSR EXPAP CALL TO TEST FOR PATTERN MATCH ! 15753: * PPM LOC TRANSFER LOC IF NOT A PATTERN MATCH ! 15754: * (WA) DESTROYED ! 15755: * (XR) UNCHANGED (IF NOT MATCH) ! 15756: * (XR) PTR TO BINARY OPERATOR BLK IF MATCH ! 15757: * ! 15758: {EXPAP{PRC{E{1{{ENTRY POINT ! 15759: {{MOV{R10{-(SP){{SAVE XL ! 15760: {{BNE{(R9){#B$CMT{EXPP2{NO MATCH IF NOT COMPLEX ! 15761: {{MOV{4*CMTYP(R9){R6{{ELSE LOAD TYPE CODE ! 15762: {{BEQ{R6{#C$CNC{EXPP1{CONCATENATION IS A MATCH ! 15763: {{BEQ{R6{#C$PMT{EXPP1{BINARY QUESTION MARK IS A MATCH ! 15764: {{BNE{R6{#C$ALT{EXPP2{ELSE NOT MATCH UNLESS ALTERNATION ! 15765: * ! 15766: * HERE FOR ALTERNATION. CHANGE (A B) / C TO A QM (B / C) ! 15767: * ! 15768: {{MOV{4*CMLOP(R9){R10{{LOAD LEFT OPERAND POINTER ! 15769: {{BNE{(R10){#B$CMT{EXPP2{NOT MATCH IF LEFT OPND NOT COMPLEX ! 15770: {{BNE{4*CMTYP(R10){#C$CNC{EXPP2{NOT MATCH IF LEFT OP NOT CONC ! 15771: {{MOV{4*CMROP(R10){4*CMLOP(R9){{XR POINTS TO (B / C) ! 15772: {{MOV{R9{4*CMROP(R10){{SET XL OPNDS TO A, (B / C) ! 15773: {{MOV{R10{R9{{POINT TO THIS ALTERED NODE ! 15774: * ! 15775: * EXIT HERE FOR PATTERN MATCH ! 15776: * ! 15777: {EXPP1{MOV{(SP)+{R10{{RESTORE ENTRY XL ! 15778: {{EXI{{{{GIVE PATTERN MATCH RETURN ! 15779: * ! 15780: * EXIT HERE IF NOT PATTERN MATCH ! 15781: * ! 15782: {EXPP2{MOV{(SP)+{R10{{RESTORE ENTRY XL ! 15783: {{EXI{1{{{GIVE NON-MATCH RETURN ! 15784: {{ENP{{{{END PROCEDURE EXPAP ! 15785: {{EJC{{{{ ! 15786: * ! 15787: * EXPDM -- DUMP OPERATORS AT CURRENT LEVEL (FOR EXPAN) ! 15788: * ! 15789: * EXPDM USES EXPOP TO CONDENSE ALL OPERATORS AT THIS SYNTAX ! 15790: * LEVEL. THE STACK BOTTOM IS RECOGNIZED FROM THE LEVEL ! 15791: * VALUE WHICH IS SAVED ON THE TOP OF THE STACK. ! 15792: * ! 15793: * JSR EXPDM CALL TO DUMP OPERATORS ! 15794: * (XS) POPPED AS REQUIRED ! 15795: * (XR,WA) DESTROYED ! 15796: * ! 15797: {EXPDM{PRC{N{0{{ENTRY POINT ! 15798: {{MOV{R10{R$EXS{{SAVE XL VALUE ! 15799: * ! 15800: * LOOP TO DUMP OPERATORS ! 15801: * ! 15802: {EXDM1{BLE{4*1(SP){#NUM05{EXDM2{JUMP IF STACK BOTTOM (SAVED LEVEL ! 15803: {{JSR{EXPOP{{{ELSE POP ONE OPERATOR ! 15804: {{BRN{EXDM1{{{AND LOOP BACK ! 15805: * ! 15806: * HERE AFTER POPPING ALL OPERATORS ! 15807: * ! 15808: {EXDM2{MOV{R$EXS{R10{{RESTORE XL ! 15809: {{ZER{R$EXS{{{RELEASE SAVE LOCATION ! 15810: {{EXI{{{{RETURN TO EXPDM CALLER ! 15811: {{ENP{{{{END PROCEDURE EXPDM ! 15812: {{EJC{{{{ ! 15813: * ! 15814: * EXPOP-- POP OPERATOR (FOR EXPAN) ! 15815: * ! 15816: * EXPOP IS USED BY THE EXPAN ROUTINE TO CONDENSE ONE ! 15817: * OPERATOR FROM THE TOP OF THE SYNTAX STACK. AN APPROPRIATE ! 15818: * CMBLK IS BUILT FOR THE OPERATOR (UNARY OR BINARY) AND A ! 15819: * POINTER TO THIS CMBLK IS STACKED. ! 15820: * ! 15821: * EXPOP IS ALSO USED BY SCNGF (GOTO FIELD SCAN) PROCEDURE ! 15822: * ! 15823: * JSR EXPOP CALL TO POP OPERATOR ! 15824: * (XS) POPPED APPROPRIATELY ! 15825: * (XR,XL,WA) DESTROYED ! 15826: * ! 15827: {EXPOP{PRC{N{0{{ENTRY POINT ! 15828: {{MOV{4*1(SP){R9{{LOAD OPERATOR DV POINTER ! 15829: {{BEQ{4*DVLPR(R9){#LLUNO{EXPO2{JUMP IF UNARY ! 15830: * ! 15831: * HERE FOR BINARY OPERATOR ! 15832: * ! 15833: {{MOV{#4*CMBS${R6{{SET SIZE OF BINARY OPERATOR CMBLK ! 15834: {{JSR{ALLOC{{{ALLOCATE SPACE FOR CMBLK ! 15835: {{MOV{(SP)+{4*CMROP(R9){{POP AND STORE RIGHT OPERAND PTR ! 15836: {{MOV{(SP)+{R10{{POP AND LOAD OPERATOR DV PTR ! 15837: {{MOV{(SP){4*CMLOP(R9){{STORE LEFT OPERAND POINTER ! 15838: * ! 15839: * COMMON EXIT POINT ! 15840: * ! 15841: {EXPO1{MOV{#B$CMT{(R9){{STORE TYPE CODE FOR CMBLK ! 15842: {{MOV{4*DVTYP(R10){4*CMTYP(R9){{STORE CMBLK NODE TYPE CODE ! 15843: {{MOV{R10{4*CMOPN(R9){{STORE DVPTR (=PTR TO DAC O$XXX) ! 15844: {{MOV{R6{4*CMLEN(R9){{STORE CMBLK LENGTH ! 15845: {{MOV{R9{(SP){{STORE RESULTING NODE PTR ON STACK ! 15846: {{EXI{{{{RETURN TO EXPOP CALLER ! 15847: * ! 15848: * HERE FOR UNARY OPERATOR ! 15849: * ! 15850: {EXPO2{MOV{#4*CMUS${R6{{SET SIZE OF UNARY OPERATOR CMBLK ! 15851: {{JSR{ALLOC{{{ALLOCATE SPACE FOR CMBLK ! 15852: {{MOV{(SP)+{4*CMROP(R9){{POP AND STORE OPERAND POINTER ! 15853: {{MOV{(SP){R10{{LOAD OPERATOR DV POINTER ! 15854: {{BRN{EXPO1{{{MERGE BACK TO EXIT ! 15855: {{ENP{{{{END PROCEDURE EXPOP ! 15856: {{EJC{{{{ ! 15857: * ! 15858: * FLSTG -- FOLD STRING TO UPPER CASE ! 15859: * ! 15860: * FLSTG FOLDS A CHARACTER STRING CONTAINING LOWER CASE ! 15861: * CHARACCTERS TO ONE CONTAINING UPPER CASE CHARACTERS. ! 15862: * FOLDING IS ONLY DONE IF &CASE (KVCAS) IS NOT ZERO. ! 15863: * ! 15864: * (XR) STRING ARGUMENT ! 15865: * (WA) LENGTH OF STRING ! 15866: * JSR FLSTG CALL TO FOLD STRING ! 15867: * (XR) RESULT STRING (POSSIBLY ORIGINAL) ! 15868: * (WC) DESTROYED ! 15869: * ! 15870: {FLSTG{PRC{R{0{{ENTRY POINT ! 15871: {{BZE{KVCAS{FST99{{SKIP IF &CASE IS 0 ! 15872: {{MOV{R10{-(SP){{SAVE XL ACROSS CALL ! 15873: {{MOV{R9{-(SP){{SAVE ORIGINAL SCBLK PTR ! 15874: {{JSR{ALOCS{{{ALLOCATE NEW STRING BLOCK ! 15875: {{MOV{(SP){R10{{POINT TO ORIGINAL SCBLK ! 15876: {{MOV{R9{-(SP){{SAVE POINTER TO NEW SCBLK ! 15877: {{PLC{R10{{{POINT TO ORIGINAL CHARS ! 15878: {{PLC{R9{{{POINT TO NEW CHARS ! 15879: {{ZER{-(SP){{{INIT DID FOLD FLAG ! 15880: {{LCT{R8{R8{{LOAD LOOP COUNTER ! 15881: {FST01{LCH{R6{(R10)+{{LOAD CHARACTER ! 15882: {{BGT{#CH$$A{R6{FST02{SKIP IF LESS THAN LC A ! 15883: {{BGT{R6{#CH$$${FST02{SKIP IF GREATER THAN LC Z ! 15884: {{FLC{R6{{{FOLD CHARACTER TO UPPER CASE ! 15885: {{MNZ{(SP){{{SET DID FOLD CHARACTER FLAG ! 15886: {FST02{SCH{R6{(R9)+{{STORE (POSSIBLY FOLDED) CHARACTER ! 15887: {{BCT{R8{FST01{{LOOP THRU ENTIRE STRING ! 15888: {{CSC{R9{{{COMPLETE STORE CHARACTERS ! 15889: {{BNZ{(SP)+{FST10{{SKIP IF FOLDING DONE ! 15890: {{MOV{(SP)+{DNAMP{{DO NOT NEED NEW SCBLK ! 15891: {{MOV{(SP)+{R9{{RETURN ORIGINAL SCBLK ! 15892: {{BRN{FST20{{{MERGE BELOW ! 15893: {FST10{MOV{(SP)+{R9{{RETURN NEW SCBLK ! 15894: {{ICA{SP{{{THROW AWAY ORIGINAL SCBLK POINTER ! 15895: {FST20{MOV{4*SCLEN(R9){R6{{RELOAD STRING LENGTH ! 15896: {{MOV{(SP)+{R10{{RESTORE XL ! 15897: {FST99{EXI{{{{RETURN ! 15898: {{ENP{{{{ ! 15899: {{EJC{{{{ ! 15900: * ! 15901: * GBCOL -- PERFORM GARBAGE COLLECTION ! 15902: * ! 15903: * GBCOL PERFORMS A GARBAGE COLLECTION ON THE DYNAMIC REGION ! 15904: * ALL BLOCKS WHICH ARE NO LONGER IN USE ARE ELIMINATED ! 15905: * BY MOVING BLOCKS WHICH ARE IN USE DOWN AND RESETTING ! 15906: * DNAMP, THE POINTER TO THE NEXT AVAILABLE LOCATION. ! 15907: * ! 15908: * (WB) MOVE OFFSET (SEE BELOW) ! 15909: * JSR GBCOL CALL TO COLLECT GARBAGE ! 15910: * (XR) DESTROYED ! 15911: * ! 15912: * THE FOLLOWING CONDITIONS MUST BE MET AT THE TIME WHEN ! 15913: * GBCOL IS CALLED. ! 15914: * ! 15915: * 1) ALL POINTERS TO BLOCKS IN THE DYNAMIC AREA MUST BE ! 15916: * ACCESSIBLE TO THE GARBAGE COLLECTOR. THIS MEANS ! 15917: * THAT THEY MUST OCCUR IN ONE OF THE FOLLOWING. ! 15918: * ! 15919: * A) MAIN STACK, WITH CURRENT TOP ! 15920: * ELEMENT BEING INDICATED BY XS ! 15921: * ! 15922: * B) IN RELOCATABLE FIELDS OF VRBLKS. ! 15923: * ! 15924: * C) IN REGISTER XL AT THE TIME OF CALL ! 15925: * ! 15926: * E) IN THE SPECIAL REGION OF WORKING ! 15927: * STORAGE WHERE NAMES BEGIN WITH R$. ! 15928: * ! 15929: * 2) ALL POINTERS MUST POINT TO THE START OF BLOCKS WITH ! 15930: * THE SOLE EXCEPTION OF THE CONTENTS OF THE CODE ! 15931: * POINTER REGISTER WHICH POINTS INTO THE R$COD BLOCK. ! 15932: * ! 15933: * 3) NO LOCATION WHICH APPEARS TO CONTAIN A POINTER ! 15934: * INTO THE DYNAMIC REGION MAY OCCUR UNLESS IT IS IN ! 15935: * FACT A POINTER TO THE START OF THE BLOCK. HOWEVER ! 15936: * POINTERS OUTSIDE THIS AREA MAY OCCUR AND WILL ! 15937: * NOT BE CHANGED BY THE GARBAGE COLLECTOR. ! 15938: * IT IS ESPECIALLY IMPORTANT TO MAKE SURE THAT XL ! 15939: * DOES NOT CONTAIN A GARBAGE VALUE FROM SOME PROCESS ! 15940: * CARRIED OUT BEFORE THE CALL TO THE COLLECTOR. ! 15941: * ! 15942: * GBCOL HAS THE CAPABILITY OF MOVING THE FINAL COMPACTED ! 15943: * RESULT UP IN MEMORY (WITH ADDRESSES ADJUSTED ACCORDINGLY) ! 15944: * THIS IS USED TO ADD SPACE TO THE STATIC REGION. THE ! 15945: * ENTRY VALUE OF WB IS THE NUMBER OF BYTES TO MOVE UP. ! 15946: * THE CALLER MUST GUARANTEE THAT THERE IS ENOUGH ROOM. ! 15947: * FURTHERMORE THE VALUE IN WB IF IT IS NON-ZERO, MUST BE AT ! 15948: * LEAST 256 SO THAT THE MWB INSTRUCTION CONDITIONS ARE MET. ! 15949: {{EJC{{{{ ! 15950: * ! 15951: * GBCOL (CONTINUED) ! 15952: * ! 15953: * THE ALGORITHM, WHICH IS A MODIFICATION OF THE LISP-2 ! 15954: * GARBAGE COLLECTOR DEVISED BY R.DEWAR AND K.BELCHER ! 15955: * TAKES THREE PASSES AS FOLLOWS. ! 15956: * ! 15957: * 1) ALL POINTERS IN MEMORY ARE SCANNED AND BLOCKS IN USE ! 15958: * DETERMINED FROM THIS SCAN. NOTE THAT THIS PROCEDURE ! 15959: * IS RECURSIVE AND USES THE MAIN STACK FOR LINKAGE. ! 15960: * THE MARKING PROCESS IS THUS SIMILAR TO THAT USED IN ! 15961: * A STANDARD LISP COLLECTOR. HOWEVER THE METHOD OF ! 15962: * ACTUALLY MARKING THE BLOCKS IS DIFFERENT. ! 15963: * ! 15964: * THE FIRST FIELD OF A BLOCK NORMALLY CONTAINS A ! 15965: * CODE ENTRY POINT POINTER. SUCH AN ENTRY POINTER ! 15966: * CAN BE DISTINGUISHED FROM THE ADDRESS OF ANY POINTER ! 15967: * TO BE PROCESSED BY THE COLLECTOR. DURING GARBAGE ! 15968: * COLLECTION, THIS WORD IS USED TO BUILD A BACK CHAIN ! 15969: * OF POINTERS THROUGH FIELDS WHICH POINT TO THE BLOCK. ! 15970: * THE END OF THE CHAIN IS MARKED BY THE OCCURENCE ! 15971: * OF THE WORD WHICH USED TO BE IN THE FIRST WORD OF ! 15972: * THE BLOCK. THIS BACKCHAIN SERVES BOTH AS A MARK ! 15973: * INDICATING THAT THE BLOCK IS IN USE AND AS A LIST OF ! 15974: * REFERENCES FOR THE RELOCATION PHASE. ! 15975: * ! 15976: * 2) STORAGE IS SCANNED SEQUENTIALLY TO DISCOVER WHICH ! 15977: * BLOCKS ARE CURRENTLY IN USE AS INDICATED BY THE ! 15978: * PRESENCE OF A BACKCHAIN. TWO POINTERS ARE MAINTAINED ! 15979: * ONE SCANS THROUGH LOOKING AT EACH BLOCK. THE OTHER ! 15980: * IS INCREMENTED ONLY FOR BLOCKS FOUND TO BE IN USE. ! 15981: * IN THIS WAY, THE EVENTUAL LOCATION OF EACH BLOCK CAN ! 15982: * BE DETERMINED WITHOUT ACTUALLY MOVING ANY BLOCKS. ! 15983: * AS EACH BLOCK WHICH IS IN USE IS PROCESSED, THE BACK ! 15984: * CHAIN IS USED TO RESET ALL POINTERS WHICH POINT TO ! 15985: * THIS BLOCK TO CONTAIN ITS NEW ADDRESS, I.E. THE ! 15986: * ADDRESS IT WILL OCCUPY AFTER THE BLOCKS ARE MOVED. ! 15987: * THE FIRST WORD OF THE BLOCK, TAKEN FROM THE END OF ! 15988: * THE CHAIN IS RESTORED AT THIS POINT. ! 15989: * ! 15990: * DURING PASS 2, THE COLLECTOR BUILDS BLOCKS WHICH ! 15991: * DESCRIBE THE REGIONS OF STORAGE WHICH ARE TO BE ! 15992: * MOVED IN THE THIRD PASS. THERE IS ONE DESCRIPTOR FOR ! 15993: * EACH CONTIGUOUS SET OF GOOD BLOCKS. THE DESCRIPTOR ! 15994: * IS BUILT JUST BEHIND THE BLOCK TO BE MOVED AND ! 15995: * CONTAINS A POINTER TO THE NEXT BLOCK AND THE NUMBER ! 15996: * OF WORDS TO BE MOVED. ! 15997: * ! 15998: * 3) IN THE THIRD AND FINAL PASS, THE MOVE DESCRIPTOR ! 15999: * BLOCKS BUILT IN PASS TWO ARE USED TO ACTUALLY MOVE ! 16000: * THE BLOCKS DOWN TO THE BOTTOM OF THE DYNAMIC REGION. ! 16001: * THE COLLECTION IS THEN COMPLETE AND THE NEXT ! 16002: * AVAILABLE LOCATION POINTER IS RESET. ! 16003: {{EJC{{{{ ! 16004: * ! 16005: * GBCOL (CONTINUED) ! 16006: * ! 16007: {GBCOL{PRC{E{0{{ENTRY POINT ! 16008: {{BNZ{DMVCH{GBC14{{FAIL IF IN MID-DUMP ! 16009: {{MNZ{GBCFL{{{NOTE GBCOL ENTERED ! 16010: {{MOV{R6{GBSVA{{SAVE ENTRY WA ! 16011: {{MOV{R7{GBSVB{{SAVE ENTRY WB ! 16012: {{MOV{R8{GBSVC{{SAVE ENTRY WC ! 16013: {{MOV{R10{-(SP){{SAVE ENTRY XL ! 16014: {{SCP{R6{{{GET CODE POINTER VALUE ! 16015: {{SUB{R$COD{R6{{MAKE RELATIVE ! 16016: {{LCP{R6{{{AND RESTORE ! 16017: * ! 16018: * PROCESS STACK ENTRIES ! 16019: * ! 16020: {{MOV{SP{R9{{POINT TO STACK FRONT ! 16021: {{MOV{STBAS{R10{{POINT PAST END OF STACK ! 16022: {{BGE{R10{R9{GBC00{OK IF D-STACK ! 16023: {{MOV{R10{R9{{REVERSE IF ... ! 16024: {{MOV{SP{R10{{... U-STACK ! 16025: * ! 16026: * PROCESS THE STACK ! 16027: * ! 16028: {GBC00{JSR{GBCPF{{{PROCESS POINTERS ON STACK ! 16029: * ! 16030: * PROCESS SPECIAL WORK LOCATIONS ! 16031: * ! 16032: {{MOV{#R$AAA{R9{{POINT TO START OF RELOCATABLE LOCS ! 16033: {{MOV{#R$YYY{R10{{POINT PAST END OF RELOCATABLE LOCS ! 16034: {{JSR{GBCPF{{{PROCESS WORK FIELDS ! 16035: * ! 16036: * PREPARE TO PROCESS VARIABLE BLOCKS ! 16037: * ! 16038: {{MOV{HSHTB{R6{{POINT TO FIRST HASH SLOT POINTER ! 16039: * ! 16040: * LOOP THROUGH HASH SLOTS ! 16041: * ! 16042: {GBC01{MOV{R6{R10{{POINT TO NEXT SLOT ! 16043: {{ICA{R6{{{BUMP BUCKET POINTER ! 16044: {{MOV{R6{GBCNM{{SAVE BUCKET POINTER ! 16045: {{EJC{{{{ ! 16046: * ! 16047: * GBCOL (CONTINUED) ! 16048: * ! 16049: * LOOP THROUGH VARIABLES ON ONE HASH CHAIN ! 16050: * ! 16051: {GBC02{MOV{(R10){R9{{LOAD PTR TO NEXT VRBLK ! 16052: {{BZE{R9{GBC03{{JUMP IF END OF CHAIN ! 16053: {{MOV{R9{R10{{ELSE COPY VRBLK POINTER ! 16054: {{ADD{#4*VRVAL{R9{{POINT TO FIRST RELOC FLD ! 16055: {{ADD{#4*VRNXT{R10{{POINT PAST LAST (AND TO LINK PTR) ! 16056: {{JSR{GBCPF{{{PROCESS RELOC FIELDS IN VRBLK ! 16057: {{BRN{GBC02{{{LOOP BACK FOR NEXT BLOCK ! 16058: * ! 16059: * HERE AT END OF ONE HASH CHAIN ! 16060: * ! 16061: {GBC03{MOV{GBCNM{R6{{RESTORE BUCKET POINTER ! 16062: {{BNE{R6{HSHTE{GBC01{LOOP BACK IF MORE BUCKETS TO GO ! 16063: {{EJC{{{{ ! 16064: * ! 16065: * GBCOL (CONTINUED) ! 16066: * ! 16067: * NOW WE ARE READY TO START PASS TWO. REGISTERS ARE USED ! 16068: * AS FOLLOWS IN PASS TWO. ! 16069: * ! 16070: * (XR) SCANS THROUGH ALL BLOCKS ! 16071: * (WC) POINTER TO EVENTUAL LOCATION ! 16072: * ! 16073: * THE MOVE DESCRIPTION BLOCKS BUILT IN THIS PASS HAVE ! 16074: * THE FOLLOWING FORMAT. ! 16075: * ! 16076: * WORD 1 POINTER TO NEXT MOVE BLOCK, ! 16077: * ZERO IF END OF CHAIN OF BLOCKS ! 16078: * ! 16079: * WORD 2 LENGTH OF BLOCKS TO BE MOVED IN ! 16080: * BYTES. SET TO THE ADDRESS OF THE ! 16081: * FIRST BYTE WHILE ACTUALLY SCANNING ! 16082: * THE BLOCKS. ! 16083: * ! 16084: * THE FIRST ENTRY ON THIS CHAIN IS A SPECIAL ENTRY ! 16085: * CONSISTING OF THE TWO WORDS GBCNM AND GBCNS. AFTER ! 16086: * BUILDING THE CHAIN OF MOVE DESCRIPTORS, GBCNM POINTS TO ! 16087: * THE FIRST REAL MOVE BLOCK, AND GBCNS IS THE LENGTH OF ! 16088: * BLOCKS IN USE AT THE START OF STORAGE WHICH NEED NOT ! 16089: * BE MOVED SINCE THEY ARE IN THE CORRECT POSITION. ! 16090: * ! 16091: {GBC04{MOV{DNAMB{R9{{POINT TO FIRST BLOCK ! 16092: {{MOV{R9{R8{{SET AS FIRST EVENTUAL LOCATION ! 16093: {{ADD{GBSVB{R8{{ADD OFFSET FOR EVENTUAL MOVE UP ! 16094: {{ZER{GBCNM{{{CLEAR INITIAL FORWARD POINTER ! 16095: {{MOV{#GBCNM{GBCLM{{INITIALIZE PTR TO LAST MOVE BLOCK ! 16096: {{MOV{R9{GBCNS{{INITIALIZE FIRST ADDRESS ! 16097: * ! 16098: * LOOP THROUGH A SERIES OF BLOCKS IN USE ! 16099: * ! 16100: {GBC05{BEQ{R9{DNAMP{GBC07{JUMP IF END OF USED REGION ! 16101: {{MOV{(R9){R6{{ELSE GET FIRST WORD ! 16102: {{BHI{R6{#P$YYY{GBC06{SKIP IF NOT ENTRY PTR (IN USE) ! 16103: {{BHI{R6{#B$AAA{GBC07{JUMP IF ENTRY POINTER (UNUSED) ! 16104: * ! 16105: * HERE FOR BLOCK IN USE, LOOP TO RELOCATE REFERENCES ! 16106: * ! 16107: {GBC06{MOV{R6{R10{{COPY POINTER ! 16108: {{MOV{(R10){R6{{LOAD FORWARD POINTER ! 16109: {{MOV{R8{(R10){{RELOCATE REFERENCE ! 16110: {{BHI{R6{#P$YYY{GBC06{LOOP BACK IF NOT END OF CHAIN ! 16111: {{BLO{R6{#B$AAA{GBC06{LOOP BACK IF NOT END OF CHAIN ! 16112: {{EJC{{{{ ! 16113: * ! 16114: * GBCOL (CONTINUED) ! 16115: * ! 16116: * AT END OF CHAIN, RESTORE FIRST WORD AND BUMP PAST ! 16117: * ! 16118: {{MOV{R6{(R9){{RESTORE FIRST WORD ! 16119: {{JSR{BLKLN{{{GET LENGTH OF THIS BLOCK ! 16120: {{ADD{R6{R9{{BUMP ACTUAL POINTER ! 16121: {{ADD{R6{R8{{BUMP EVENTUAL POINTER ! 16122: {{BRN{GBC05{{{LOOP BACK FOR NEXT BLOCK ! 16123: * ! 16124: * HERE AT END OF A SERIES OF BLOCKS IN USE ! 16125: * ! 16126: {GBC07{MOV{R9{R6{{COPY POINTER PAST LAST BLOCK ! 16127: {{MOV{GBCLM{R10{{POINT TO PREVIOUS MOVE BLOCK ! 16128: {{SUB{4*1(R10){R6{{SUBTRACT STARTING ADDRESS ! 16129: {{MOV{R6{4*1(R10){{STORE LENGTH OF BLOCK TO BE MOVED ! 16130: * ! 16131: * LOOP THROUGH A SERIES OF BLOCKS NOT IN USE ! 16132: * ! 16133: {GBC08{BEQ{R9{DNAMP{GBC10{JUMP IF END OF USED REGION ! 16134: {{MOV{(R9){R6{{ELSE LOAD FIRST WORD OF NEXT BLOCK ! 16135: {{BHI{R6{#P$YYY{GBC09{JUMP IF IN USE ! 16136: {{BLO{R6{#B$AAA{GBC09{JUMP IF IN USE ! 16137: {{JSR{BLKLN{{{ELSE GET LENGTH OF NEXT BLOCK ! 16138: {{ADD{R6{R9{{PUSH POINTER ! 16139: {{BRN{GBC08{{{AND LOOP BACK ! 16140: * ! 16141: * HERE FOR A BLOCK IN USE AFTER PROCESSING A SERIES OF ! 16142: * BLOCKS WHICH WERE NOT IN USE, BUILD NEW MOVE BLOCK. ! 16143: * ! 16144: {GBC09{SUB{#4*NUM02{R9{{POINT 2 WORDS BEHIND FOR MOVE BLOCK ! 16145: {{MOV{GBCLM{R10{{POINT TO PREVIOUS MOVE BLOCK ! 16146: {{MOV{R9{(R10){{SET FORWARD PTR IN PREVIOUS BLOCK ! 16147: {{ZER{(R9){{{ZERO FORWARD PTR OF NEW BLOCK ! 16148: {{MOV{R9{GBCLM{{REMEMBER ADDRESS OF THIS BLOCK ! 16149: {{MOV{R9{R10{{COPY PTR TO MOVE BLOCK ! 16150: {{ADD{#4*NUM02{R9{{POINT BACK TO BLOCK IN USE ! 16151: {{MOV{R9{4*1(R10){{STORE STARTING ADDRESS ! 16152: {{BRN{GBC06{{{JUMP TO PROCESS BLOCK IN USE ! 16153: {{EJC{{{{ ! 16154: * ! 16155: * GBCOL (CONTINUED) ! 16156: * ! 16157: * HERE FOR PASS THREE -- ACTUALLY MOVE THE BLOCKS DOWN ! 16158: * ! 16159: * (XL) POINTER TO OLD LOCATION ! 16160: * (XR) POINTER TO NEW LOCATION ! 16161: * ! 16162: {GBC10{MOV{DNAMB{R9{{POINT TO START OF STORAGE ! 16163: {{ADD{GBCNS{R9{{BUMP PAST UNMOVED BLOCKS AT START ! 16164: * ! 16165: * LOOP THROUGH MOVE DESCRIPTORS ! 16166: * ! 16167: {GBC11{MOV{GBCNM{R10{{POINT TO NEXT MOVE BLOCK ! 16168: {{BZE{R10{GBC12{{JUMP IF END OF CHAIN ! 16169: {{MOV{(R10)+{GBCNM{{MOVE POINTER DOWN CHAIN ! 16170: {{MOV{(R10)+{R6{{GET LENGTH TO MOVE ! 16171: {{MVW{{{{PERFORM MOVE ! 16172: {{BRN{GBC11{{{LOOP BACK ! 16173: * ! 16174: * NOW TEST FOR MOVE UP ! 16175: * ! 16176: {GBC12{MOV{R9{DNAMP{{SET NEXT AVAILABLE LOC PTR ! 16177: {{MOV{GBSVB{R7{{RELOAD MOVE OFFSET ! 16178: {{BZE{R7{GBC13{{JUMP IF NO MOVE REQUIRED ! 16179: {{MOV{R9{R10{{ELSE COPY OLD TOP OF CORE ! 16180: {{ADD{R7{R9{{POINT TO NEW TOP OF CORE ! 16181: {{MOV{R9{DNAMP{{SAVE NEW TOP OF CORE POINTER ! 16182: {{MOV{R10{R6{{COPY OLD TOP ! 16183: {{SUB{DNAMB{R6{{MINUS OLD BOTTOM = LENGTH ! 16184: {{ADD{R7{DNAMB{{BUMP BOTTOM TO GET NEW VALUE ! 16185: {{MWB{{{{PERFORM MOVE (BACKWARDS) ! 16186: * ! 16187: * MERGE HERE TO EXIT ! 16188: * ! 16189: {GBC13{MOV{GBSVA{R6{{RESTORE WA ! 16190: {{SCP{R8{{{GET CODE POINTER ! 16191: {{ADD{R$COD{R8{{MAKE ABSOLUTE AGAIN ! 16192: {{LCP{R8{{{AND REPLACE ABSOLUTE VALUE ! 16193: {{MOV{GBSVC{R8{{RESTORE WC ! 16194: {{MOV{(SP)+{R10{{RESTORE ENTRY XL ! 16195: {{ICV{GBCNT{{{INCREMENT COUNT OF COLLECTIONS ! 16196: {{ZER{R9{{{CLEAR GARBAGE VALUE IN XR ! 16197: {{ZER{GBCFL{{{NOTE EXIT FROM GBCOL ! 16198: {{EXI{{{{EXIT TO GBCOL CALLER ! 16199: * ! 16200: * GARBAGE COLLECTION NOT ALLOWED WHILST DUMPING ! 16201: * ! 16202: {GBC14{ICV{ERRFT{{{FATAL ERROR ! 16203: {{ERB{250{INSUFFICIENT{{MEMORY TO COMPLETE DUMP ! 16204: {{ENP{{{{END PROCEDURE GBCOL ! 16205: {{EJC{{{{ ! 16206: * ! 16207: * GBCPF -- PROCESS FIELDS FOR GARBAGE COLLECTOR ! 16208: * ! 16209: * THIS PROCEDURE IS USED BY THE GARBAGE COLLECTOR TO ! 16210: * PROCESS FIELDS IN PASS ONE. SEE GBCOL FOR FULL DETAILS. ! 16211: * ! 16212: * (XR) PTR TO FIRST LOCATION TO PROCESS ! 16213: * (XL) PTR PAST LAST LOCATION TO PROCESS ! 16214: * JSR GBCPF CALL TO PROCESS FIELDS ! 16215: * (XR,WA,WB,WC,IA) DESTROYED ! 16216: * ! 16217: * NOTE THAT ALTHOUGH THIS PROCEDURE USES A RECURSIVE ! 16218: * APPROACH, IT CONTROLS ITS OWN STACK AND IS NOT RECURSIVE. ! 16219: * ! 16220: {GBCPF{PRC{E{0{{ENTRY POINT ! 16221: {{ZER{-(SP){{{SET ZERO TO MARK BOTTOM OF STACK ! 16222: {{MOV{R10{-(SP){{SAVE END POINTER ! 16223: * ! 16224: * MERGE HERE TO GO DOWN A LEVEL AND START A NEW LOOP ! 16225: * ! 16226: * 1(XS) NEXT LVL FIELD PTR (0 AT OUTER LVL) ! 16227: * 0(XS) PTR PAST LAST FIELD TO PROCESS ! 16228: * (XR) PTR TO FIRST FIELD TO PROCESS ! 16229: * ! 16230: * LOOP TO PROCESS SUCCESSIVE FIELDS ! 16231: * ! 16232: {GPF01{MOV{(R9){R10{{LOAD FIELD CONTENTS ! 16233: {{MOV{R9{R8{{SAVE FIELD POINTER ! 16234: {{BLT{R10{DNAMB{GPF02{JUMP IF NOT PTR INTO DYNAMIC AREA ! 16235: {{BGE{R10{DNAMP{GPF02{JUMP IF NOT PTR INTO DYNAMIC AREA ! 16236: * ! 16237: * HERE WE HAVE A PTR TO A BLOCK IN THE DYNAMIC AREA. ! 16238: * LINK THIS FIELD ONTO THE REFERENCE BACKCHAIN. ! 16239: * ! 16240: {{MOV{(R10){R6{{LOAD PTR TO CHAIN (OR ENTRY PTR) ! 16241: {{MOV{R9{(R10){{SET THIS FIELD AS NEW HEAD OF CHAIN ! 16242: {{MOV{R6{(R9){{SET FORWARD POINTER ! 16243: * ! 16244: * NOW SEE IF THIS BLOCK HAS BEEN PROCESSED BEFORE ! 16245: * ! 16246: {{BHI{R6{#P$YYY{GPF02{JUMP IF ALREADY PROCESSED ! 16247: {{BHI{R6{#B$AAA{GPF03{JUMP IF NOT ALREADY PROCESSED ! 16248: * ! 16249: * HERE TO MOVE TO NEXT FIELD ! 16250: * ! 16251: {GPF02{MOV{R8{R9{{RESTORE FIELD POINTER ! 16252: {{ICA{R9{{{BUMP TO NEXT FIELD ! 16253: {{BNE{R9{(SP){GPF01{LOOP BACK IF MORE TO GO ! 16254: {{EJC{{{{ ! 16255: * ! 16256: * GBCPF (CONTINUED) ! 16257: * ! 16258: * HERE WE POP UP A LEVEL AFTER FINISHING A BLOCK ! 16259: * ! 16260: {{MOV{(SP)+{R10{{RESTORE POINTER PAST END ! 16261: {{MOV{(SP)+{R8{{RESTORE BLOCK POINTER ! 16262: {{BNZ{R8{GPF02{{CONTINUE LOOP UNLESS OUTER LEVL ! 16263: {{EXI{{{{RETURN TO CALLER IF OUTER LEVEL ! 16264: * ! 16265: * HERE TO PROCESS AN ACTIVE BLOCK WHICH HAS NOT BEEN DONE ! 16266: * ! 16267: {GPF03{MOV{R10{R9{{COPY BLOCK POINTER ! 16268: {{MOV{R6{R10{{COPY FIRST WORD OF BLOCK ! 16269: {{LEI{R10{{{LOAD ENTRY POINT ID (BL$XX) ! 16270: * ! 16271: * BLOCK TYPE SWITCH. NOTE THAT BLOCKS WITH NO RELOCATABLE ! 16272: * FIELDS JUST RETURN TO GPF02 HERE TO CONTINE TO NEXT FLD. ! 16273: * ! 16274: {{BSW{R10{BL$$${{SWITCH ON BLOCK TYPE ! 16275: {{IFF{BL$AR{GPF06{{ARBLK ! 16276: {{IFF{BL$BC{GPF18{{BCBLK ! 16277: {{IFF{BL$CD{GPF08{{CDBLK ! 16278: {{IFF{BL$EX{GPF17{{EXBLK ! 16279: {{IFF{BL$IC{GPF02{{ICBLK ! 16280: {{IFF{BL$NM{GPF10{{NMBLK ! 16281: {{IFF{BL$P0{GPF10{{P0BLK ! 16282: {{IFF{BL$P1{GPF12{{P1BLK ! 16283: {{IFF{BL$P2{GPF12{{P2BLK ! 16284: {{IFF{BL$RC{GPF02{{RCBLK ! 16285: {{IFF{BL$SC{GPF02{{SCBLK ! 16286: {{IFF{BL$SE{GPF02{{SEBLK ! 16287: {{IFF{BL$TB{GPF08{{TBBLK ! 16288: {{IFF{BL$VC{GPF08{{VCBLK ! 16289: {{IFF{BL$XN{GPF02{{XNBLK ! 16290: {{IFF{BL$XR{GPF09{{XRBLK ! 16291: {{IFF{BL$PD{GPF13{{PDBLK ! 16292: {{IFF{BL$TR{GPF16{{TRBLK ! 16293: {{IFF{BL$BF{GPF02{{BFBLK ! 16294: {{IFF{BL$CC{GPF07{{CCBLK ! 16295: {{IFF{BL$CM{GPF04{{CMBLK ! 16296: {{IFF{BL$CT{GPF02{{CTBLK ! 16297: {{IFF{BL$DF{GPF02{{DFBLK ! 16298: {{IFF{BL$EF{GPF02{{EFBLK ! 16299: {{IFF{BL$EV{GPF10{{EVBLK ! 16300: {{IFF{BL$FF{GPF11{{FFBLK ! 16301: {{IFF{BL$KV{GPF02{{KVBLK ! 16302: {{IFF{BL$PF{GPF14{{PFBLK ! 16303: {{IFF{BL$TE{GPF15{{TEBLK ! 16304: {{ESW{{{{END OF JUMP TABLE ! 16305: {{EJC{{{{ ! 16306: * ! 16307: * GBCPF (CONTINUED) ! 16308: * ! 16309: * CMBLK ! 16310: * ! 16311: {GPF04{MOV{4*CMLEN(R9){R6{{LOAD LENGTH ! 16312: {{MOV{#4*CMTYP{R7{{SET OFFSET ! 16313: * ! 16314: * HERE TO PUSH DOWN TO NEW LEVEL ! 16315: * ! 16316: * (WC) FIELD PTR AT PREVIOUS LEVEL ! 16317: * (XR) PTR TO NEW BLOCK ! 16318: * (WA) LENGTH (RELOC FLDS + FLDS AT START) ! 16319: * (WB) OFFSET TO FIRST RELOC FIELD ! 16320: * ! 16321: {GPF05{ADD{R9{R6{{POINT PAST LAST RELOC FIELD ! 16322: {{ADD{R7{R9{{POINT TO FIRST RELOC FIELD ! 16323: {{MOV{R8{-(SP){{STACK OLD FIELD POINTER ! 16324: {{MOV{R6{-(SP){{STACK NEW LIMIT POINTER ! 16325: {{CHK{{{{CHECK FOR STACK OVERFLOW ! 16326: {{BRN{GPF01{{{IF OK, BACK TO PROCESS ! 16327: * ! 16328: * ARBLK ! 16329: * ! 16330: {GPF06{MOV{4*ARLEN(R9){R6{{LOAD LENGTH ! 16331: {{MOV{4*AROFS(R9){R7{{SET OFFSET TO 1ST RELOC FLD (ARPRO) ! 16332: {{BRN{GPF05{{{ALL SET ! 16333: * ! 16334: * CCBLK ! 16335: * ! 16336: {GPF07{MOV{4*CCUSE(R9){R6{{SET LENGTH IN USE ! 16337: {{MOV{#4*CCUSE{R7{{1ST WORD (MAKE SURE AT LEAST ONE) ! 16338: {{BRN{GPF05{{{ALL SET ! 16339: {{EJC{{{{ ! 16340: * ! 16341: * GBCPF (CONTINUED) ! 16342: * ! 16343: * CDBLK, TBBLK, VCBLK ! 16344: * ! 16345: {GPF08{MOV{4*OFFS2(R9){R6{{LOAD LENGTH ! 16346: {{MOV{#4*OFFS3{R7{{SET OFFSET ! 16347: {{BRN{GPF05{{{JUMP BACK ! 16348: * ! 16349: * XRBLK ! 16350: * ! 16351: {GPF09{MOV{4*XRLEN(R9){R6{{LOAD LENGTH ! 16352: {{MOV{#4*XRPTR{R7{{SET OFFSET ! 16353: {{BRN{GPF05{{{JUMP BACK ! 16354: * ! 16355: * EVBLK, NMBLK, P0BLK ! 16356: * ! 16357: {GPF10{MOV{#4*OFFS2{R6{{POINT PAST SECOND FIELD ! 16358: {{MOV{#4*OFFS1{R7{{OFFSET IS ONE (ONLY RELOC FLD IS 2) ! 16359: {{BRN{GPF05{{{ALL SET ! 16360: * ! 16361: * FFBLK ! 16362: * ! 16363: {GPF11{MOV{#4*FFOFS{R6{{SET LENGTH ! 16364: {{MOV{#4*FFNXT{R7{{SET OFFSET ! 16365: {{BRN{GPF05{{{ALL SET ! 16366: * ! 16367: * P1BLK, P2BLK ! 16368: * ! 16369: {GPF12{MOV{#4*PARM2{R6{{LENGTH (PARM2 IS NON-RELOCATABLE) ! 16370: {{MOV{#4*PTHEN{R7{{SET OFFSET ! 16371: {{BRN{GPF05{{{ALL SET ! 16372: {{EJC{{{{ ! 16373: * ! 16374: * GBCPF (CONTINUED) ! 16375: * ! 16376: * PDBLK ! 16377: * ! 16378: {GPF13{MOV{4*PDDFP(R9){R10{{LOAD PTR TO DFBLK ! 16379: {{MOV{4*DFPDL(R10){R6{{GET PDBLK LENGTH ! 16380: {{MOV{#4*PDFLD{R7{{SET OFFSET ! 16381: {{BRN{GPF05{{{ALL SET ! 16382: * ! 16383: * PFBLK ! 16384: * ! 16385: {GPF14{MOV{#4*PFARG{R6{{LENGTH PAST LAST RELOC ! 16386: {{MOV{#4*PFCOD{R7{{OFFSET TO FIRST RELOC ! 16387: {{BRN{GPF05{{{ALL SET ! 16388: * ! 16389: * TEBLK ! 16390: * ! 16391: {GPF15{MOV{#4*TESI${R6{{SET LENGTH ! 16392: {{MOV{#4*TESUB{R7{{AND OFFSET ! 16393: {{BRN{GPF05{{{ALL SET ! 16394: * ! 16395: * TRBLK ! 16396: * ! 16397: {GPF16{MOV{#4*TRSI${R6{{SET LENGTH ! 16398: {{MOV{#4*TRVAL{R7{{AND OFFSET ! 16399: {{BRN{GPF05{{{ALL SET ! 16400: * ! 16401: * EXBLK ! 16402: * ! 16403: {GPF17{MOV{4*EXLEN(R9){R6{{LOAD LENGTH ! 16404: {{MOV{#4*EXFLC{R7{{SET OFFSET ! 16405: {{BRN{GPF05{{{JUMP BACK ! 16406: * ! 16407: * BCBLK ! 16408: * ! 16409: {GPF18{MOV{#4*BCSI${R6{{SET LENGTH ! 16410: {{MOV{#4*BCBUF{R7{{AND OFFSET ! 16411: {{BRN{GPF05{{{ALL SET ! 16412: {{ENP{{{{END PROCEDURE GBCPF ! 16413: {{EJC{{{{ ! 16414: * ! 16415: * GTARR -- GET ARRAY ! 16416: * ! 16417: * GTARR IS PASSED AN OBJECT AND RETURNS AN ARRAY IF POSSIBL ! 16418: * ! 16419: * (XR) VALUE TO BE CONVERTED ! 16420: * JSR GTARR CALL TO GET ARRAY ! 16421: * PPM LOC TRANSFER LOC FOR CONVERT IMPOSSIBLE ! 16422: * (XR) RESULTING ARRAY ! 16423: * (XL,WA,WB,WC) DESTROYED ! 16424: * ! 16425: {GTARR{PRC{E{1{{ENTRY POINT ! 16426: {{MOV{(R9){R6{{LOAD TYPE WORD ! 16427: {{BEQ{R6{#B$ART{GTAR8{EXIT IF ALREADY AN ARRAY ! 16428: {{BEQ{R6{#B$VCT{GTAR8{EXIT IF ALREADY AN ARRAY ! 16429: {{BNE{R6{#B$TBT{GTA9A{ELSE FAIL IF NOT A TABLE (SGD02) ! 16430: * ! 16431: * HERE WE CONVERT A TABLE TO AN ARRAY ! 16432: * ! 16433: {{MOV{R9{-(SP){{REPLACE TBBLK POINTER ON STACK ! 16434: {{ZER{R9{{{SIGNAL FIRST PASS ! 16435: {{ZER{R7{{{ZERO NON-NULL ELEMENT COUNT ! 16436: * ! 16437: * THE FOLLOWING CODE IS EXECUTED TWICE. ON THE FIRST PASS, ! 16438: * SIGNALLED BY XR=0, THE NUMBER OF NON-NULL ELEMENTS IN ! 16439: * THE TABLE IS COUNTED IN WB. IN THE SECOND PASS, WHERE ! 16440: * XR IS A POINTER INTO THE ARBLK, THE NAME AND VALUE ARE ! 16441: * ENTERED INTO THE CURRENT ARBLK LOCATION. ! 16442: * ! 16443: {GTAR1{MOV{(SP){R10{{POINT TO TABLE ! 16444: {{ADD{4*TBLEN(R10){R10{{POINT PAST LAST BUCKET ! 16445: {{SUB{#4*TBBUK{R10{{SET FIRST BUCKET OFFSET ! 16446: {{MOV{R10{R6{{COPY ADJUSTED POINTER ! 16447: * ! 16448: * LOOP THROUGH BUCKETS IN TABLE BLOCK ! 16449: * NEXT THREE LINES OF CODE RELY ON TENXT HAVING A VALUE ! 16450: * 1 LESS THAN TBBUK. ! 16451: * ! 16452: {GTAR2{MOV{R6{R10{{COPY BUCKET POINTER ! 16453: {{DCA{R6{{{DECREMENT BUCKET POINTER ! 16454: * ! 16455: * LOOP THROUGH TEBLKS ON ONE BUCKET CHAIN ! 16456: * ! 16457: {GTAR3{MOV{4*TENXT(R10){R10{{POINT TO NEXT TEBLK ! 16458: {{BEQ{R10{(SP){GTAR6{JUMP IF CHAIN END (TBBLK PTR) ! 16459: {{MOV{R10{CNVTP{{ELSE SAVE TEBLK POINTER ! 16460: * ! 16461: * LOOP TO FIND VALUE DOWN TRBLK CHAIN ! 16462: * ! 16463: {GTAR4{MOV{4*TEVAL(R10){R10{{LOAD VALUE ! 16464: {{BEQ{(R10){#B$TRT{GTAR4{LOOP TILL VALUE FOUND ! 16465: {{MOV{R10{R8{{COPY VALUE ! 16466: {{MOV{CNVTP{R10{{RESTORE TEBLK POINTER ! 16467: {{EJC{{{{ ! 16468: * ! 16469: * GTARR (CONTINUED) ! 16470: * ! 16471: * NOW CHECK FOR NULL AND TEST CASES ! 16472: * ! 16473: {{BEQ{R8{#NULLS{GTAR3{LOOP BACK TO IGNORE NULL VALUE ! 16474: {{BNZ{R9{GTAR5{{JUMP IF SECOND PASS ! 16475: {{ICV{R7{{{FOR THE FIRST PASS, BUMP COUNT ! 16476: {{BRN{GTAR3{{{AND LOOP BACK FOR NEXT TEBLK ! 16477: * ! 16478: * HERE IN SECOND PASS ! 16479: * ! 16480: {GTAR5{MOV{4*TESUB(R10){(R9)+{{STORE SUBSCRIPT NAME ! 16481: {{MOV{R8{(R9)+{{STORE VALUE IN ARBLK ! 16482: {{BRN{GTAR3{{{LOOP BACK FOR NEXT TEBLK ! 16483: * ! 16484: * HERE AFTER SCANNING TEBLKS ON ONE CHAIN ! 16485: * ! 16486: {GTAR6{BNE{R6{(SP){GTAR2{LOOP BACK IF MORE BUCKETS TO GO ! 16487: {{BNZ{R9{GTAR7{{ELSE JUMP IF SECOND PASS ! 16488: * ! 16489: * HERE AFTER COUNTING NON-NULL ELEMENTS ! 16490: * ! 16491: {{BZE{R7{GTAR9{{FAIL IF NO NON-NULL ELEMENTS ! 16492: {{MOV{R7{R6{{ELSE COPY COUNT ! 16493: {{ADD{R7{R6{{DOUBLE (TWO WORDS/ELEMENT) ! 16494: {{ADD{#ARVL2{R6{{ADD SPACE FOR STANDARD FIELDS ! 16495: {{WTB{R6{{{CONVERT LENGTH TO BYTES ! 16496: {{BGE{R6{MXLEN{GTAR9{FAIL IF TOO LONG FOR ARRAY ! 16497: {{JSR{ALLOC{{{ELSE ALLOCATE SPACE FOR ARBLK ! 16498: {{MOV{#B$ART{(R9){{STORE TYPE WORD ! 16499: {{ZER{4*IDVAL(R9){{{ZERO ID FOR THE MOMENT ! 16500: {{MOV{R6{4*ARLEN(R9){{STORE LENGTH ! 16501: {{MOV{#NUM02{4*ARNDM(R9){{SET DIMENSIONS = 2 ! 16502: {{LDI{INTV1{{{GET INTEGER ONE ! 16503: {{STI{4*ARLBD(R9){{{STORE AS LBD 1 ! 16504: {{STI{4*ARLB2(R9){{{STORE AS LBD 2 ! 16505: {{LDI{INTV2{{{LOAD INTEGER TWO ! 16506: {{STI{4*ARDM2(R9){{{STORE AS DIM 2 ! 16507: {{MTI{R7{{{GET ELEMENT COUNT AS INTEGER ! 16508: {{STI{4*ARDIM(R9){{{STORE AS DIM 1 ! 16509: {{ZER{4*ARPR2(R9){{{ZERO PROTOTYPE FIELD FOR NOW ! 16510: {{MOV{#4*ARPR2{4*AROFS(R9){{SET OFFSET FIELD (SIGNAL PASS 2) ! 16511: {{MOV{R9{R7{{SAVE ARBLK POINTER ! 16512: {{ADD{#4*ARVL2{R9{{POINT TO FIRST ELEMENT LOCATION ! 16513: {{BRN{GTAR1{{{JUMP BACK TO FILL IN ELEMENTS ! 16514: {{EJC{{{{ ! 16515: * ! 16516: * GTARR (CONTINUED) ! 16517: * ! 16518: * HERE AFTER FILLING IN ELEMENT VALUES ! 16519: * ! 16520: {GTAR7{MOV{R7{R9{{RESTORE ARBLK POINTER ! 16521: {{MOV{R7{(SP){{STORE AS RESULT ! 16522: * ! 16523: * NOW WE NEED THE ARRAY PROTOTYPE WHICH IS OF THE FORM NN,2 ! 16524: * THIS IS OBTAINED BY BUILDING THE STRING FOR NN02 AND ! 16525: * CHANGING THE ZERO TO A COMMA BEFORE STORING IT. ! 16526: * ! 16527: {{LDI{4*ARDIM(R9){{{GET NUMBER OF ELEMENTS (NN) ! 16528: {{MLI{INTVH{{{MULTIPLY BY 100 ! 16529: {{ADI{INTV2{{{ADD 2 (NN02) ! 16530: {{JSR{ICBLD{{{BUILD INTEGER ! 16531: {{MOV{R9{-(SP){{STORE PTR FOR GTSTG ! 16532: {{JSR{GTSTG{{{CONVERT TO STRING ! 16533: {{PPM{{{{CONVERT FAIL IS IMPOSSIBLE ! 16534: {{MOV{R9{R10{{COPY STRING POINTER ! 16535: {{MOV{(SP)+{R9{{RELOAD ARBLK POINTER ! 16536: {{MOV{R10{4*ARPR2(R9){{STORE PROTOTYPE PTR (NN02) ! 16537: {{SUB{#NUM02{R6{{ADJUST LENGTH TO POINT TO ZERO ! 16538: {{PSC{R10{R6{{POINT TO ZERO ! 16539: {{MOV{#CH$CM{R7{{LOAD A COMMA ! 16540: {{SCH{R7{(R10){{STORE A COMMA OVER THE ZERO ! 16541: {{CSC{R10{{{COMPLETE STORE CHARACTERS ! 16542: * ! 16543: * NORMAL RETURN ! 16544: * ! 16545: {GTAR8{EXI{{{{RETURN TO CALLER ! 16546: * ! 16547: * NON-CONVERSION RETURN ! 16548: * ! 16549: {GTAR9{MOV{(SP)+{R9{{RESTORE STACK FOR CONV ERR (SGD02) ! 16550: * ! 16551: * MERGE TO TAKE CONVERT ERROR WHEN STACK ADJUSTED OK ! 16552: * ! 16553: {GTA9A{EXI{1{{{RETURN ! 16554: {{ENP{{{{PROCEDURE GTARR ! 16555: {{EJC{{{{ ! 16556: * ! 16557: * GTCOD -- CONVERT TO CODE ! 16558: * ! 16559: * (XR) OBJECT TO BE CONVERTED ! 16560: * JSR GTCOD CALL TO CONVERT TO CODE ! 16561: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 16562: * (XR) POINTER TO RESULTING CDBLK ! 16563: * (XL,WA,WB,WC,RA) DESTROYED ! 16564: * ! 16565: * IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE- ! 16566: * EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL ! 16567: * WITHOUT RETURNING TO THIS ROUTINE. ! 16568: * ! 16569: {GTCOD{PRC{E{1{{ENTRY POINT ! 16570: {{BEQ{(R9){#B$CDS{GTCD1{JUMP IF ALREADY CODE ! 16571: {{BEQ{(R9){#B$CDC{GTCD1{JUMP IF ALREADY CODE ! 16572: * ! 16573: * HERE WE MUST GENERATE A CDBLK BY COMPILATION ! 16574: * ! 16575: {{MOV{R9{-(SP){{STACK ARGUMENT FOR GTSTG ! 16576: {{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING ! 16577: {{PPM{GTCD2{{{JUMP IF NON-CONVERTIBLE ! 16578: {{MOV{FLPTR{GTCEF{{SAVE FAIL PTR IN CASE OF ERROR ! 16579: {{MOV{R$COD{R$GTC{{ALSO SAVE CODE PTR ! 16580: {{MOV{R9{R$CIM{{ELSE SET IMAGE POINTER ! 16581: {{MOV{R6{SCNIL{{SET IMAGE LENGTH ! 16582: {{ZER{SCNPT{{{SET SCAN POINTER ! 16583: {{MOV{#STGXC{STAGE{{SET STAGE FOR EXECUTE COMPILE ! 16584: {{MOV{CMPSN{LSTSN{{IN CASE LISTR CALLED ! 16585: {{JSR{CMPIL{{{COMPILE STRING ! 16586: {{MOV{#STGXT{STAGE{{RESET STAGE FOR EXECUTE TIME ! 16587: {{ZER{R$CIM{{{CLEAR IMAGE ! 16588: * ! 16589: * MERGE HERE IF NO CONVERT REQUIRED ! 16590: * ! 16591: {GTCD1{EXI{{{{GIVE NORMAL GTCOD RETURN ! 16592: * ! 16593: * HERE IF UNCONVERTIBLE ! 16594: * ! 16595: {GTCD2{EXI{1{{{GIVE ERROR RETURN ! 16596: {{ENP{{{{END PROCEDURE GTCOD ! 16597: {{EJC{{{{ ! 16598: * ! 16599: * GTEXP -- CONVERT TO EXPRESSION ! 16600: * ! 16601: * (XR) INPUT VALUE TO BE CONVERTED ! 16602: * JSR GTEXP CALL TO CONVERT TO EXPRESSION ! 16603: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 16604: * (XR) POINTER TO RESULT EXBLK OR SEBLK ! 16605: * (XL,WA,WB,WC,RA) DESTROYED ! 16606: * ! 16607: * IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE- ! 16608: * EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL ! 16609: * WITHOUT RETURNING TO THIS ROUTINE. ! 16610: * ! 16611: {GTEXP{PRC{E{1{{ENTRY POINT ! 16612: {{BLO{(R9){#B$E$${GTEX1{JUMP IF ALREADY AN EXPRESSION ! 16613: {{MOV{R9{-(SP){{STORE ARGUMENT FOR GTSTG ! 16614: {{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING ! 16615: {{PPM{GTEX2{{{JUMP IF UNCONVERTIBLE ! 16616: * ! 16617: * CHECK THE LAST CHARACTER OF THE STRING FOR COLON OR ! 16618: * SEMICOLON. THESE CHARACTERS CAN LEGITIMATELY END AN ! 16619: * EXPRESSION IN OPEN CODE, SO EXPAN WILL NOT DETECT THEM ! 16620: * AS ERRORS, BUT THEY ARE INVALID AS TERMINATORS FOR A ! 16621: * STRING THAT IS BEING CONVERTED TO EXPRESSION FORM. ! 16622: * ! 16623: {{MOV{R9{R10{{COPY INPUT STRING POINTER (REG06) ! 16624: {{PLC{R10{R6{{POINT ONE PAST THE STRING END (REG06) ! 16625: {{LCH{R10{-(R10){{FETCH THE LAST CHARACTER (REG06) ! 16626: {{BEQ{R10{#CH$CL{GTEX2{ERROR IF IT IS A SEMICOLON (REG06) ! 16627: {{BEQ{R10{#CH$SM{GTEX2{OR IF IT IS A COLON (REG06) ! 16628: * ! 16629: * HERE WE CONVERT A STRING BY COMPILATION ! 16630: * ! 16631: {{MOV{R9{R$CIM{{SET INPUT IMAGE POINTER ! 16632: {{ZER{SCNPT{{{SET SCAN POINTER ! 16633: {{MOV{R6{SCNIL{{SET INPUT IMAGE LENGTH ! 16634: {{ZER{R7{{{SET CODE FOR NORMAL SCAN ! 16635: {{MOV{FLPTR{GTCEF{{SAVE FAIL PTR IN CASE OF ERROR ! 16636: {{MOV{R$COD{R$GTC{{ALSO SAVE CODE PTR ! 16637: {{MOV{#STGEV{STAGE{{ADJUST STAGE FOR COMPILE ! 16638: {{MOV{#T$UOK{SCNTP{{INDICATE UNARY OPERATOR ACCEPTABLE ! 16639: {{JSR{EXPAN{{{BUILD TREE FOR EXPRESSION ! 16640: {{ZER{SCNRS{{{RESET RESCAN FLAG ! 16641: {{BNE{SCNPT{SCNIL{GTEX2{ERROR IF NOT END OF IMAGE ! 16642: {{ZER{R7{{{SET OK VALUE FOR CDGEX CALL ! 16643: {{MOV{R9{R10{{COPY TREE POINTER ! 16644: {{JSR{CDGEX{{{BUILD EXPRESSION BLOCK ! 16645: {{ZER{R$CIM{{{CLEAR POINTER ! 16646: {{MOV{#STGXT{STAGE{{RESTORE STAGE FOR EXECUTE TIME ! 16647: * ! 16648: * MERGE HERE IF NO CONVERSION REQUIRED ! 16649: * ! 16650: {GTEX1{EXI{{{{RETURN TO GTEXP CALLER ! 16651: * ! 16652: * HERE IF UNCONVERTIBLE ! 16653: * ! 16654: {GTEX2{EXI{1{{{TAKE ERROR EXIT ! 16655: {{ENP{{{{END PROCEDURE GTEXP ! 16656: {{EJC{{{{ ! 16657: * ! 16658: * GTINT -- GET INTEGER VALUE ! 16659: * ! 16660: * GTINT IS PASSED AN OBJECT AND RETURNS AN INTEGER AFTER ! 16661: * PERFORMING ANY NECESSARY CONVERSIONS. ! 16662: * ! 16663: * (XR) VALUE TO BE CONVERTED ! 16664: * JSR GTINT CALL TO CONVERT TO INTEGER ! 16665: * PPM LOC TRANSFER LOC FOR CONVERT IMPOSSIBLE ! 16666: * (XR) RESULTING INTEGER ! 16667: * (WC,RA) DESTROYED ! 16668: * (WA,WB) DESTROYED (ONLY ON CONVERSION ERR) ! 16669: * (XR) UNCHANGED (ON CONVERT ERROR) ! 16670: * ! 16671: {GTINT{PRC{E{1{{ENTRY POINT ! 16672: {{BEQ{(R9){#B$ICL{GTIN2{JUMP IF ALREADY AN INTEGER ! 16673: {{MOV{R6{GTINA{{ELSE SAVE WA ! 16674: {{MOV{R7{GTINB{{SAVE WB ! 16675: {{JSR{GTNUM{{{CONVERT TO NUMERIC ! 16676: {{PPM{GTIN3{{{JUMP IF UNCONVERTIBLE ! 16677: {{BEQ{R6{#B$ICL{GTIN1{JUMP IF INTEGER ! 16678: * ! 16679: * HERE WE CONVERT A REAL TO INTEGER ! 16680: * ! 16681: {{LDR{4*RCVAL(R9){{{LOAD REAL VALUE ! 16682: {{RTI{GTIN3{{{CONVERT TO INTEGER (ERR IF OVFLOW) ! 16683: {{JSR{ICBLD{{{IF OK BUILD ICBLK ! 16684: * ! 16685: * HERE AFTER SUCCESSFUL CONVERSION TO INTEGER ! 16686: * ! 16687: {GTIN1{MOV{GTINA{R6{{RESTORE WA ! 16688: {{MOV{GTINB{R7{{RESTORE WB ! 16689: * ! 16690: * COMMON EXIT POINT ! 16691: * ! 16692: {GTIN2{EXI{{{{RETURN TO GTINT CALLER ! 16693: * ! 16694: * HERE ON CONVERSION ERROR ! 16695: * ! 16696: {GTIN3{EXI{1{{{TAKE CONVERT ERROR EXIT ! 16697: {{ENP{{{{END PROCEDURE GTINT ! 16698: {{EJC{{{{ ! 16699: * ! 16700: * GTNUM -- GET NUMERIC VALUE ! 16701: * ! 16702: * GTNUM IS GIVEN AN OBJECT AND RETURNS EITHER AN INTEGER ! 16703: * OR A REAL, PERFORMING ANY NECESSARY CONVERSIONS. ! 16704: * ! 16705: * (XR) OBJECT TO BE CONVERTED ! 16706: * JSR GTNUM CALL TO CONVERT TO NUMERIC ! 16707: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 16708: * (XR) POINTER TO RESULT (INT OR REAL) ! 16709: * (WA) FIRST WORD OF RESULT BLOCK ! 16710: * (WB,WC,RA) DESTROYED ! 16711: * (XR) UNCHANGED (ON CONVERT ERROR) ! 16712: * ! 16713: {GTNUM{PRC{E{1{{ENTRY POINT ! 16714: {{MOV{(R9){R6{{LOAD FIRST WORD OF BLOCK ! 16715: {{BEQ{R6{#B$ICL{GTN34{JUMP IF INTEGER (NO CONVERSION) ! 16716: {{BEQ{R6{#B$RCL{GTN34{JUMP IF REAL (NO CONVERSION) ! 16717: * ! 16718: * AT THIS POINT THE ONLY POSSIBILITY IS TO CONVERT A STRING ! 16719: * TO AN INTEGER OR REAL AS APPROPRIATE. ! 16720: * ! 16721: {{MOV{R9{-(SP){{STACK ARGUMENT IN CASE CONVERT ERR ! 16722: {{MOV{R9{-(SP){{STACK ARGUMENT FOR GTSTG ! 16723: {{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING ! 16724: {{PPM{GTN36{{{JUMP IF UNCONVERTIBLE ! 16725: * ! 16726: * INITIALIZE NUMERIC CONVERSION ! 16727: * ! 16728: {{LDI{INTV0{{{INITIALIZE INTEGER RESULT TO ZERO ! 16729: {{BZE{R6{GTN32{{JUMP TO EXIT WITH ZERO IF NULL ! 16730: {{LCT{R6{R6{{SET BCT COUNTER FOR FOLLOWING LOOPS ! 16731: {{ZER{GTNNF{{{TENTATIVELY INDICATE RESULT + ! 16732: {{STI{GTNEX{{{INITIALISE EXPONENT TO ZERO ! 16733: {{ZER{GTNSC{{{ZERO SCALE IN CASE REAL ! 16734: {{ZER{GTNDF{{{RESET FLAG FOR DEC POINT FOUND ! 16735: {{ZER{GTNRD{{{RESET FLAG FOR DIGITS FOUND ! 16736: {{LDR{REAV0{{{ZERO REAL ACCUM IN CASE REAL ! 16737: {{PLC{R9{{{POINT TO ARGUMENT CHARACTERS ! 16738: * ! 16739: * MERGE BACK HERE AFTER IGNORING LEADING BLANK ! 16740: * ! 16741: {GTN01{LCH{R7{(R9)+{{LOAD FIRST CHARACTER ! 16742: {{BLT{R7{#CH$D0{GTN02{JUMP IF NOT DIGIT ! 16743: {{BLE{R7{#CH$D9{GTN06{JUMP IF FIRST CHAR IS A DIGIT ! 16744: {{EJC{{{{ ! 16745: * ! 16746: * GTNUM (CONTINUED) ! 16747: * ! 16748: * HERE IF FIRST DIGIT IS NON-DIGIT ! 16749: * ! 16750: {GTN02{BNE{R7{#CH$BL{GTN03{JUMP IF NON-BLANK ! 16751: {GTNA2{BCT{R6{GTN01{{ELSE DECR COUNT AND LOOP BACK ! 16752: {{BRN{GTN07{{{JUMP TO RETURN ZERO IF ALL BLANKS ! 16753: * ! 16754: * HERE FOR FIRST CHARACTER NON-BLANK, NON-DIGIT ! 16755: * ! 16756: {GTN03{BEQ{R7{#CH$PL{GTN04{JUMP IF PLUS SIGN ! 16757: {{BEQ{R7{#CH$HT{GTNA2{HORIZONTAL TAB EQUIV TO BLANK ! 16758: {{BNE{R7{#CH$MN{GTN12{JUMP IF NOT MINUS (MAY BE REAL) ! 16759: {{MNZ{GTNNF{{{IF MINUS SIGN, SET NEGATIVE FLAG ! 16760: * ! 16761: * MERGE HERE AFTER PROCESSING SIGN ! 16762: * ! 16763: {GTN04{BCT{R6{GTN05{{JUMP IF CHARS LEFT ! 16764: {{BRN{GTN36{{{ELSE ERROR ! 16765: * ! 16766: * LOOP TO FETCH CHARACTERS OF AN INTEGER ! 16767: * ! 16768: {GTN05{LCH{R7{(R9)+{{LOAD NEXT CHARACTER ! 16769: {{BLT{R7{#CH$D0{GTN08{JUMP IF NOT A DIGIT ! 16770: {{BGT{R7{#CH$D9{GTN08{JUMP IF NOT A DIGIT ! 16771: * ! 16772: * MERGE HERE FOR FIRST DIGIT ! 16773: * ! 16774: {GTN06{STI{GTNSI{{{SAVE CURRENT VALUE ! 16775: {{CVM{GTN35{{{CURRENT*10-(NEW DIG) JUMP IF OVFLOW ! 16776: {{MNZ{GTNRD{{{SET DIGIT READ FLAG ! 16777: {{BCT{R6{GTN05{{ELSE LOOP BACK IF MORE CHARS ! 16778: * ! 16779: * HERE TO EXIT WITH CONVERTED INTEGER VALUE ! 16780: * ! 16781: {GTN07{BNZ{GTNNF{GTN32{{JUMP IF NEGATIVE (ALL SET) ! 16782: {{NGI{{{{ELSE NEGATE ! 16783: {{INO{GTN32{{{JUMP IF NO OVERFLOW ! 16784: {{BRN{GTN36{{{ELSE SIGNAL ERROR ! 16785: {{EJC{{{{ ! 16786: * ! 16787: * GTNUM (CONTINUED) ! 16788: * ! 16789: * HERE FOR A NON-DIGIT CHARACTER WHILE ATTEMPTING TO ! 16790: * CONVERT AN INTEGER, CHECK FOR TRAILING BLANKS OR REAL. ! 16791: * ! 16792: {GTN08{BEQ{R7{#CH$BL{GTNA9{JUMP IF A BLANK ! 16793: {{BEQ{R7{#CH$HT{GTNA9{JUMP IF HORIZONTAL TAB ! 16794: {{ITR{{{{ELSE CONVERT INTEGER TO REAL ! 16795: {{NGR{{{{NEGATE TO GET POSITIVE VALUE ! 16796: {{BRN{GTN12{{{JUMP TO TRY FOR REAL ! 16797: * ! 16798: * HERE WE SCAN OUT BLANKS TO END OF STRING ! 16799: * ! 16800: {GTN09{LCH{R7{(R9)+{{GET NEXT CHAR ! 16801: {{BEQ{R7{#CH$HT{GTNA9{JUMP IF HORIZONTAL TAB ! 16802: {{BNE{R7{#CH$BL{GTN36{ERROR IF NON-BLANK ! 16803: {GTNA9{BCT{R6{GTN09{{LOOP BACK IF MORE CHARS TO CHECK ! 16804: {{BRN{GTN07{{{RETURN INTEGER IF ALL BLANKS ! 16805: * ! 16806: * LOOP TO COLLECT MANTISSA OF REAL ! 16807: * ! 16808: {GTN10{LCH{R7{(R9)+{{LOAD NEXT CHARACTER ! 16809: {{BLT{R7{#CH$D0{GTN12{JUMP IF NON-NUMERIC ! 16810: {{BGT{R7{#CH$D9{GTN12{JUMP IF NON-NUMERIC ! 16811: * ! 16812: * MERGE HERE TO COLLECT FIRST REAL DIGIT ! 16813: * ! 16814: {GTN11{SUB{#CH$D0{R7{{CONVERT DIGIT TO NUMBER ! 16815: {{MLR{REAVT{{{MULTIPLY REAL BY 10.0 ! 16816: {{ROV{GTN36{{{CONVERT ERROR IF OVERFLOW ! 16817: {{STR{GTNSR{{{SAVE RESULT ! 16818: {{MTI{R7{{{GET NEW DIGIT AS INTEGER ! 16819: {{ITR{{{{CONVERT NEW DIGIT TO REAL ! 16820: {{ADR{GTNSR{{{ADD TO GET NEW TOTAL ! 16821: {{ADD{GTNDF{GTNSC{{INCREMENT SCALE IF AFTER DEC POINT ! 16822: {{MNZ{GTNRD{{{SET DIGIT FOUND FLAG ! 16823: {{BCT{R6{GTN10{{LOOP BACK IF MORE CHARS ! 16824: {{BRN{GTN22{{{ELSE JUMP TO SCALE ! 16825: {{EJC{{{{ ! 16826: * ! 16827: * GTNUM (CONTINUED) ! 16828: * ! 16829: * HERE IF NON-DIGIT FOUND WHILE COLLECTING A REAL ! 16830: * ! 16831: {GTN12{BNE{R7{#CH$DT{GTN13{JUMP IF NOT DEC POINT ! 16832: {{BNZ{GTNDF{GTN36{{IF DEC POINT, ERROR IF ONE ALREADY ! 16833: {{MOV{#NUM01{GTNDF{{ELSE SET FLAG FOR DEC POINT ! 16834: {{BCT{R6{GTN10{{LOOP BACK IF MORE CHARS ! 16835: {{BRN{GTN22{{{ELSE JUMP TO SCALE ! 16836: * ! 16837: * HERE IF NOT DECIMAL POINT ! 16838: * ! 16839: {GTN13{BEQ{R7{#CH$LE{GTN15{JUMP IF E FOR EXPONENT ! 16840: {{BEQ{R7{#CH$LD{GTN15{JUMP IF D FOR EXPONENT ! 16841: {{BEQ{R7{#CH$$E{GTN15{JUMP IF E FOR EXPONENT ! 16842: {{BEQ{R7{#CH$$D{GTN15{JUMP IF D FOR EXPONENT ! 16843: * ! 16844: * HERE CHECK FOR TRAILING BLANKS ! 16845: * ! 16846: {GTN14{BEQ{R7{#CH$BL{GTNB4{JUMP IF BLANK ! 16847: {{BEQ{R7{#CH$HT{GTNB4{JUMP IF HORIZONTAL TAB ! 16848: {{BRN{GTN36{{{ERROR IF NON-BLANK ! 16849: * ! 16850: {GTNB4{LCH{R7{(R9)+{{GET NEXT CHARACTER ! 16851: {{BCT{R6{GTN14{{LOOP BACK TO CHECK IF MORE ! 16852: {{BRN{GTN22{{{ELSE JUMP TO SCALE ! 16853: * ! 16854: * HERE TO READ AND PROCESS AN EXPONENT ! 16855: * ! 16856: {GTN15{ZER{GTNES{{{SET EXPONENT SIGN POSITIVE ! 16857: {{LDI{INTV0{{{INITIALIZE EXPONENT TO ZERO ! 16858: {{MNZ{GTNDF{{{RESET NO DEC POINT INDICATION ! 16859: {{BCT{R6{GTN16{{JUMP SKIPPING PAST E OR D ! 16860: {{BRN{GTN36{{{ERROR IF NULL EXPONENT ! 16861: * ! 16862: * CHECK FOR EXPONENT SIGN ! 16863: * ! 16864: {GTN16{LCH{R7{(R9)+{{LOAD FIRST EXPONENT CHARACTER ! 16865: {{BEQ{R7{#CH$PL{GTN17{JUMP IF PLUS SIGN ! 16866: {{BNE{R7{#CH$MN{GTN19{ELSE JUMP IF NOT MINUS SIGN ! 16867: {{MNZ{GTNES{{{SET SIGN NEGATIVE IF MINUS SIGN ! 16868: * ! 16869: * MERGE HERE AFTER PROCESSING EXPONENT SIGN ! 16870: * ! 16871: {GTN17{BCT{R6{GTN18{{JUMP IF CHARS LEFT ! 16872: {{BRN{GTN36{{{ELSE ERROR ! 16873: * ! 16874: * LOOP TO CONVERT EXPONENT DIGITS ! 16875: * ! 16876: {GTN18{LCH{R7{(R9)+{{LOAD NEXT CHARACTER ! 16877: {{EJC{{{{ ! 16878: * ! 16879: * GTNUM (CONTINUED) ! 16880: * ! 16881: * MERGE HERE FOR FIRST EXPONENT DIGIT ! 16882: * ! 16883: {GTN19{BLT{R7{#CH$D0{GTN20{JUMP IF NOT DIGIT ! 16884: {{BGT{R7{#CH$D9{GTN20{JUMP IF NOT DIGIT ! 16885: {{CVM{GTN36{{{ELSE CURRENT*10, SUBTRACT NEW DIGIT ! 16886: {{BCT{R6{GTN18{{LOOP BACK IF MORE CHARS ! 16887: {{BRN{GTN21{{{JUMP IF EXPONENT FIELD IS EXHAUSTED ! 16888: * ! 16889: * HERE TO CHECK FOR TRAILING BLANKS AFTER EXPONENT ! 16890: * ! 16891: {GTN20{BEQ{R7{#CH$BL{GTNC0{JUMP IF BLANK ! 16892: {{BEQ{R7{#CH$HT{GTNC0{JUMP IF HORIZONTAL TAB ! 16893: {{BRN{GTN36{{{ERROR IF NON-BLANK ! 16894: * ! 16895: {GTNC0{LCH{R7{(R9)+{{GET NEXT CHARACTER ! 16896: {{BCT{R6{GTN20{{LOOP BACK TILL ALL BLANKS SCANNED ! 16897: * ! 16898: * MERGE HERE AFTER COLLECTING EXPONENT ! 16899: * ! 16900: {GTN21{STI{GTNEX{{{SAVE COLLECTED EXPONENT ! 16901: {{BNZ{GTNES{GTN22{{JUMP IF IT WAS NEGATIVE ! 16902: {{NGI{{{{ELSE COMPLEMENT ! 16903: {{IOV{GTN36{{{ERROR IF OVERFLOW ! 16904: {{STI{GTNEX{{{AND STORE POSITIVE EXPONENT ! 16905: * ! 16906: * MERGE HERE WITH EXPONENT (0 IF NONE GIVEN) ! 16907: * ! 16908: {GTN22{BZE{GTNRD{GTN36{{ERROR IF NOT DIGITS COLLECTED ! 16909: {{BZE{GTNDF{GTN36{{ERROR IF NO EXPONENT OR DEC POINT ! 16910: {{MTI{GTNSC{{{ELSE LOAD SCALE AS INTEGER ! 16911: {{SBI{GTNEX{{{SUBTRACT EXPONENT ! 16912: {{IOV{GTN36{{{ERROR IF OVERFLOW ! 16913: {{ILT{GTN26{{{JUMP IF WE MUST SCALE UP ! 16914: * ! 16915: * HERE WE HAVE A NEGATIVE EXPONENT, SO SCALE DOWN ! 16916: * ! 16917: {{MFI{R6{GTN36{{LOAD SCALE FACTOR, ERR IF OVFLOW ! 16918: * ! 16919: * LOOP TO SCALE DOWN IN STEPS OF 10**10 ! 16920: * ! 16921: {GTN23{BLE{R6{#NUM10{GTN24{JUMP IF 10 OR LESS TO GO ! 16922: {{DVR{REATT{{{ELSE DIVIDE BY 10**10 ! 16923: {{SUB{#NUM10{R6{{DECREMENT SCALE ! 16924: {{BRN{GTN23{{{AND LOOP BACK ! 16925: {{EJC{{{{ ! 16926: * ! 16927: * GTNUM (CONTINUED) ! 16928: * ! 16929: * HERE SCALE REST OF WAY FROM POWERS OF TEN TABLE ! 16930: * ! 16931: {GTN24{BZE{R6{GTN30{{JUMP IF SCALED ! 16932: {{LCT{R7{#CFP$R{{ELSE GET INDEXING FACTOR ! 16933: {{MOV{#REAV1{R9{{POINT TO POWERS OF TEN TABLE ! 16934: {{WTB{R6{{{CONVERT REMAINING SCALE TO BYTE OFS ! 16935: * ! 16936: * LOOP TO POINT TO POWERS OF TEN TABLE ENTRY ! 16937: * ! 16938: {GTN25{ADD{R6{R9{{BUMP POINTER ! 16939: {{BCT{R7{GTN25{{ONCE FOR EACH VALUE WORD ! 16940: {{DVR{(R9){{{SCALE DOWN AS REQUIRED ! 16941: {{BRN{GTN30{{{AND JUMP ! 16942: * ! 16943: * COME HERE TO SCALE RESULT UP (POSITIVE EXPONENT) ! 16944: * ! 16945: {GTN26{NGI{{{{GET ABSOLUTE VALUE OF EXPONENT ! 16946: {{IOV{GTN36{{{ERROR IF OVERFLOW ! 16947: {{MFI{R6{GTN36{{ACQUIRE SCALE, ERROR IF OVFLOW ! 16948: * ! 16949: * LOOP TO SCALE UP IN STEPS OF 10**10 ! 16950: * ! 16951: {GTN27{BLE{R6{#NUM10{GTN28{JUMP IF 10 OR LESS TO GO ! 16952: {{MLR{REATT{{{ELSE MULTIPLY BY 10**10 ! 16953: {{ROV{GTN36{{{ERROR IF OVERFLOW ! 16954: {{SUB{#NUM10{R6{{ELSE DECREMENT SCALE ! 16955: {{BRN{GTN27{{{AND LOOP BACK ! 16956: * ! 16957: * HERE TO SCALE UP REST OF WAY WITH TABLE ! 16958: * ! 16959: {GTN28{BZE{R6{GTN30{{JUMP IF SCALED ! 16960: {{LCT{R7{#CFP$R{{ELSE GET INDEXING FACTOR ! 16961: {{MOV{#REAV1{R9{{POINT TO POWERS OF TEN TABLE ! 16962: {{WTB{R6{{{CONVERT REMAINING SCALE TO BYTE OFS ! 16963: * ! 16964: * LOOP TO POINT TO PROPER ENTRY IN POWERS OF TEN TABLE ! 16965: * ! 16966: {GTN29{ADD{R6{R9{{BUMP POINTER ! 16967: {{BCT{R7{GTN29{{ONCE FOR EACH WORD IN VALUE ! 16968: {{MLR{(R9){{{SCALE UP ! 16969: {{ROV{GTN36{{{ERROR IF OVERFLOW ! 16970: {{EJC{{{{ ! 16971: * ! 16972: * GTNUM (CONTINUED) ! 16973: * ! 16974: * HERE WITH REAL VALUE SCALED AND READY EXCEPT FOR SIGN ! 16975: * ! 16976: {GTN30{BZE{GTNNF{GTN31{{JUMP IF POSITIVE ! 16977: {{NGR{{{{ELSE NEGATE ! 16978: * ! 16979: * HERE WITH PROPERLY SIGNED REAL VALUE IN (RA) ! 16980: * ! 16981: {GTN31{JSR{RCBLD{{{BUILD REAL BLOCK ! 16982: {{BRN{GTN33{{{MERGE TO EXIT ! 16983: * ! 16984: * HERE WITH PROPERLY SIGNED INTEGER VALUE IN (IA) ! 16985: * ! 16986: {GTN32{JSR{ICBLD{{{BUILD ICBLK ! 16987: * ! 16988: * REAL MERGES HERE ! 16989: * ! 16990: {GTN33{MOV{(R9){R6{{LOAD FIRST WORD OF RESULT BLOCK ! 16991: {{ICA{SP{{{POP ARGUMENT OFF STACK ! 16992: * ! 16993: * COMMON EXIT POINT ! 16994: * ! 16995: {GTN34{EXI{{{{RETURN TO GTNUM CALLER ! 16996: * ! 16997: * COME HERE IF OVERFLOW OCCURS DURING COLLECTION OF INTEGER ! 16998: * ! 16999: {GTN35{LDI{GTNSI{{{RELOAD INTEGER SO FAR ! 17000: {{ITR{{{{CONVERT TO REAL ! 17001: {{NGR{{{{MAKE VALUE POSITIVE ! 17002: {{BRN{GTN11{{{MERGE WITH REAL CIRCUIT ! 17003: * ! 17004: * HERE FOR UNCONVERTIBLE TO STRING OR CONVERSION ERROR ! 17005: * ! 17006: {GTN36{MOV{(SP)+{R9{{RELOAD ORIGINAL ARGUMENT ! 17007: {{EXI{1{{{TAKE CONVERT-ERROR EXIT ! 17008: {{ENP{{{{END PROCEDURE GTNUM ! 17009: {{EJC{{{{ ! 17010: * ! 17011: * GTNVR -- CONVERT TO NATURAL VARIABLE ! 17012: * ! 17013: * GTNVR LOCATES A VARIABLE BLOCK (VRBLK) GIVEN EITHER AN ! 17014: * APPROPRIATE NAME (NMBLK) OR A NON-NULL STRING (SCBLK). ! 17015: * ! 17016: * (XR) ARGUMENT ! 17017: * JSR GTNVR CALL TO CONVERT TO NATURAL VARIABLE ! 17018: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 17019: * (XR) POINTER TO VRBLK ! 17020: * (WA,WB) DESTROYED (CONVERSION ERROR ONLY) ! 17021: * (WC) DESTROYED ! 17022: * ! 17023: {GTNVR{PRC{E{1{{ENTRY POINT ! 17024: {{BNE{(R9){#B$NML{GNV02{JUMP IF NOT NAME ! 17025: {{MOV{4*NMBAS(R9){R9{{ELSE LOAD NAME BASE IF NAME ! 17026: {{BLO{R9{STATE{GNV07{SKIP IF VRBLK (IN STATIC REGION) ! 17027: * ! 17028: * COMMON ERROR EXIT ! 17029: * ! 17030: {GNV01{EXI{1{{{TAKE CONVERT-ERROR EXIT ! 17031: * ! 17032: * HERE IF NOT NAME ! 17033: * ! 17034: {GNV02{MOV{R6{GNVSA{{SAVE WA ! 17035: {{MOV{R7{GNVSB{{SAVE WB ! 17036: {{MOV{R9{-(SP){{STACK ARGUMENT FOR GTSTG ! 17037: {{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING ! 17038: {{PPM{GNV01{{{JUMP IF CONVERSION ERROR ! 17039: {{BZE{R6{GNV01{{NULL STRING IS AN ERROR ! 17040: {{JSR{FLSTG{{{FOLD LOWER CASE TO UPPER CASE ! 17041: {{MOV{R10{-(SP){{SAVE XL ! 17042: {{MOV{R9{-(SP){{STACK STRING PTR FOR LATER ! 17043: {{MOV{R9{R7{{COPY STRING POINTER ! 17044: {{ADD{#4*SCHAR{R7{{POINT TO CHARACTERS OF STRING ! 17045: {{MOV{R7{GNVST{{SAVE POINTER TO CHARACTERS ! 17046: {{MOV{R6{R7{{COPY LENGTH ! 17047: {{CTW{R7{0{{GET NUMBER OF WORDS IN NAME ! 17048: {{MOV{R7{GNVNW{{SAVE FOR LATER ! 17049: {{JSR{HASHS{{{COMPUTE HASH INDEX FOR STRING ! 17050: {{RMI{HSHNB{{{COMPUTE HASH OFFSET BY TAKING MOD ! 17051: {{MFI{R8{{{GET AS OFFSET ! 17052: {{WTB{R8{{{CONVERT OFFSET TO BYTES ! 17053: {{ADD{HSHTB{R8{{POINT TO PROPER HASH CHAIN ! 17054: {{SUB{#4*VRNXT{R8{{SUBTRACT OFFSET TO MERGE INTO LOOP ! 17055: {{EJC{{{{ ! 17056: * ! 17057: * GTNVR (CONTINUED) ! 17058: * ! 17059: * LOOP TO SEARCH HASH CHAIN ! 17060: * ! 17061: {GNV03{MOV{R8{R10{{COPY HASH CHAIN POINTER ! 17062: {{MOV{4*VRNXT(R10){R10{{POINT TO NEXT VRBLK ON CHAIN ! 17063: {{BZE{R10{GNV08{{JUMP IF END OF CHAIN ! 17064: {{MOV{R10{R8{{SAVE POINTER TO THIS VRBLK ! 17065: {{BNZ{4*VRLEN(R10){GNV04{{JUMP IF NOT SYSTEM VARIABLE ! 17066: {{MOV{4*VRSVP(R10){R10{{ELSE POINT TO SVBLK ! 17067: {{SUB{#4*VRSOF{R10{{ADJUST OFFSET FOR MERGE ! 17068: * ! 17069: * MERGE HERE WITH STRING PTR (LIKE VRBLK) IN XL ! 17070: * ! 17071: {GNV04{BNE{R6{4*VRLEN(R10){GNV03{BACK FOR NEXT VRBLK IF LENGTHS NE ! 17072: {{ADD{#4*VRCHS{R10{{ELSE POINT TO CHARS OF CHAIN ENTRY ! 17073: {{LCT{R7{GNVNW{{GET WORD COUNTER TO CONTROL LOOP ! 17074: {{MOV{GNVST{R9{{POINT TO CHARS OF NEW NAME ! 17075: * ! 17076: * LOOP TO COMPARE CHARACTERS OF THE TWO NAMES ! 17077: * ! 17078: {GNV05{CNE{(R9){(R10){GNV03{JUMP IF NO MATCH FOR NEXT VRBLK ! 17079: {{ICA{R9{{{BUMP NEW NAME POINTER ! 17080: {{ICA{R10{{{BUMP VRBLK IN CHAIN NAME POINTER ! 17081: {{BCT{R7{GNV05{{ELSE LOOP TILL ALL COMPARED ! 17082: {{MOV{R8{R9{{WE HAVE FOUND A MATCH, GET VRBLK ! 17083: * ! 17084: * EXIT POINT AFTER FINDING VRBLK OR BUILDING NEW ONE ! 17085: * ! 17086: {GNV06{MOV{GNVSA{R6{{RESTORE WA ! 17087: {{MOV{GNVSB{R7{{RESTORE WB ! 17088: {{ICA{SP{{{POP STRING POINTER ! 17089: {{MOV{(SP)+{R10{{RESTORE XL ! 17090: * ! 17091: * COMMON EXIT POINT ! 17092: * ! 17093: {GNV07{EXI{{{{RETURN TO GTNVR CALLER ! 17094: * ! 17095: * NOT FOUND, PREPARE TO SEARCH SYSTEM VARIABLE TABLE ! 17096: * ! 17097: {GNV08{ZER{R9{{{CLEAR GARBAGE XR POINTER ! 17098: {{MOV{R8{GNVHE{{SAVE PTR TO END OF HASH CHAIN ! 17099: {{BGT{R6{#NUM09{GNV14{CANNOT BE SYSTEM VAR IF LENGTH GT 9 ! 17100: {{MOV{R6{R10{{ELSE COPY LENGTH ! 17101: {{WTB{R10{{{CONVERT TO BYTE OFFSET ! 17102: {{MOV{L^VSRCH(R10){R10{{POINT TO FIRST SVBLK OF THIS LENGTH ! 17103: {{EJC{{{{ ! 17104: * ! 17105: * GTNVR (CONTINUED) ! 17106: * ! 17107: * LOOP TO SEARCH ENTRIES IN STANDARD VARIABLE TABLE ! 17108: * ! 17109: {GNV09{MOV{R10{GNVSP{{SAVE TABLE POINTER ! 17110: {{MOV{(R10)+{R8{{LOAD SVBIT BIT STRING ! 17111: {{MOV{(R10)+{R7{{LOAD LENGTH FROM TABLE ENTRY ! 17112: {{BNE{R6{R7{GNV14{JUMP IF END OF RIGHT LENGTH ENTIRES ! 17113: {{LCT{R7{GNVNW{{GET WORD COUNTER TO CONTROL LOOP ! 17114: {{MOV{GNVST{R9{{POINT TO CHARS OF NEW NAME ! 17115: * ! 17116: * LOOP TO CHECK FOR MATCHING NAMES ! 17117: * ! 17118: {GNV10{CNE{(R9){(R10){GNV11{JUMP IF NAME MISMATCH ! 17119: {{ICA{R9{{{ELSE BUMP NEW NAME POINTER ! 17120: {{ICA{R10{{{BUMP SVBLK POINTER ! 17121: {{BCT{R7{GNV10{{ELSE LOOP UNTIL ALL CHECKED ! 17122: * ! 17123: * HERE WE HAVE A MATCH IN THE STANDARD VARIABLE TABLE ! 17124: * ! 17125: {{ZER{R8{{{SET VRLEN VALUE ZERO ! 17126: {{MOV{#4*VRSI${R6{{SET STANDARD SIZE ! 17127: {{BRN{GNV15{{{JUMP TO BUILD VRBLK ! 17128: * ! 17129: * HERE IF NO MATCH WITH TABLE ENTRY IN SVBLKS TABLE ! 17130: * ! 17131: {GNV11{ICA{R10{{{BUMP PAST WORD OF CHARS ! 17132: {{BCT{R7{GNV11{{LOOP BACK IF MORE TO GO ! 17133: {{RSH{R8{SVNBT{{REMOVE UNINTERESTING BITS ! 17134: * ! 17135: * LOOP TO BUMP TABLE PTR FOR EACH FLAGGED WORD ! 17136: * ! 17137: {GNV12{MOV{BITS1{R7{{LOAD BIT TO TEST ! 17138: {{ANB{R8{R7{{TEST FOR WORD PRESENT ! 17139: {{ZRB{R7{GNV13{{JUMP IF NOT PRESENT ! 17140: {{ICA{R10{{{ELSE BUMP TABLE POINTER ! 17141: * ! 17142: * HERE AFTER DEALING WITH ONE WORD (ONE BIT) ! 17143: * ! 17144: {GNV13{RSH{R8{1{{REMOVE BIT ALREADY PROCESSED ! 17145: {{NZB{R8{GNV12{{LOOP BACK IF MORE BITS TO TEST ! 17146: {{BRN{GNV09{{{ELSE LOOP BACK FOR NEXT SVBLK ! 17147: * ! 17148: * HERE IF NOT SYSTEM VARIABLE ! 17149: * ! 17150: {GNV14{MOV{R6{R8{{COPY VRLEN VALUE ! 17151: {{MOV{#VRCHS{R6{{LOAD STANDARD SIZE -CHARS ! 17152: {{ADD{GNVNW{R6{{ADJUST FOR CHARS OF NAME ! 17153: {{WTB{R6{{{CONVERT LENGTH TO BYTES ! 17154: {{EJC{{{{ ! 17155: * ! 17156: * GTNVR (CONTINUED) ! 17157: * ! 17158: * MERGE HERE TO BUILD VRBLK ! 17159: * ! 17160: {GNV15{JSR{ALOST{{{ALLOCATE SPACE FOR VRBLK (STATIC) ! 17161: {{MOV{R9{R7{{SAVE VRBLK POINTER ! 17162: {{MOV{#STNVR{R10{{POINT TO MODEL VARIABLE BLOCK ! 17163: {{MOV{#4*VRLEN{R6{{SET LENGTH OF STANDARD FIELDS ! 17164: {{MVW{{{{SET INITIAL FIELDS OF NEW BLOCK ! 17165: {{MOV{GNVHE{R10{{LOAD POINTER TO END OF HASH CHAIN ! 17166: {{MOV{R7{4*VRNXT(R10){{ADD NEW BLOCK TO END OF CHAIN ! 17167: {{MOV{R8{(R9)+{{SET VRLEN FIELD, BUMP PTR ! 17168: {{MOV{GNVNW{R6{{GET LENGTH IN WORDS ! 17169: {{WTB{R6{{{CONVERT TO LENGTH IN BYTES ! 17170: {{BZE{R8{GNV16{{JUMP IF SYSTEM VARIABLE ! 17171: * ! 17172: * HERE FOR NON-SYSTEM VARIABLE -- SET CHARS OF NAME ! 17173: * ! 17174: {{MOV{(SP){R10{{POINT BACK TO STRING NAME ! 17175: {{ADD{#4*SCHAR{R10{{POINT TO CHARS OF NAME ! 17176: {{MVW{{{{MOVE CHARACTERS INTO PLACE ! 17177: {{MOV{R7{R9{{RESTORE VRBLK POINTER ! 17178: {{BRN{GNV06{{{JUMP BACK TO EXIT ! 17179: * ! 17180: * HERE FOR SYSTEM VARIABLE CASE TO FILL IN FIELDS WHERE ! 17181: * NECESSARY FROM THE FIELDS PRESENT IN THE SVBLK. ! 17182: * ! 17183: {GNV16{MOV{GNVSP{R10{{LOAD POINTER TO SVBLK ! 17184: {{MOV{R10{(R9){{SET SVBLK PTR IN VRBLK ! 17185: {{MOV{R7{R9{{RESTORE VRBLK POINTER ! 17186: {{MOV{4*SVBIT(R10){R7{{LOAD BIT INDICATORS ! 17187: {{ADD{#4*SVCHS{R10{{POINT TO CHARACTERS OF NAME ! 17188: {{ADD{R6{R10{{POINT PAST CHARACTERS ! 17189: * ! 17190: * SKIP PAST KEYWORD NUMBER (SVKNM) IF PRESENT ! 17191: * ! 17192: {{MOV{BTKNM{R8{{LOAD TEST BIT ! 17193: {{ANB{R7{R8{{AND TO TEST ! 17194: {{ZRB{R8{GNV17{{JUMP IF NO KEYWORD NUMBER ! 17195: {{ICA{R10{{{ELSE BUMP POINTER ! 17196: {{EJC{{{{ ! 17197: * ! 17198: * GTNVR (CONTINUED) ! 17199: * ! 17200: * HERE TEST FOR FUNCTION (SVFNC AND SVNAR) ! 17201: * ! 17202: {GNV17{MOV{BTFNC{R8{{GET TEST BIT ! 17203: {{ANB{R7{R8{{AND TO TEST ! 17204: {{ZRB{R8{GNV18{{SKIP IF NO SYSTEM FUNCTION ! 17205: {{MOV{R10{4*VRFNC(R9){{ELSE POINT VRFNC TO SVFNC FIELD ! 17206: {{ADD{#4*NUM02{R10{{AND BUMP PAST SVFNC, SVNAR FIELDS ! 17207: * ! 17208: * NOW TEST FOR LABEL (SVLBL) ! 17209: * ! 17210: {GNV18{MOV{BTLBL{R8{{GET TEST BIT ! 17211: {{ANB{R7{R8{{AND TO TEST ! 17212: {{ZRB{R8{GNV19{{JUMP IF BIT IS OFF (NO SYSTEM LABL) ! 17213: {{MOV{R10{4*VRLBL(R9){{ELSE POINT VRLBL TO SVLBL FIELD ! 17214: {{ICA{R10{{{BUMP PAST SVLBL FIELD ! 17215: * ! 17216: * NOW TEST FOR VALUE (SVVAL) ! 17217: * ! 17218: {GNV19{MOV{BTVAL{R8{{LOAD TEST BIT ! 17219: {{ANB{R7{R8{{AND TO TEST ! 17220: {{ZRB{R8{GNV06{{ALL DONE IF NO VALUE ! 17221: {{MOV{(R10){4*VRVAL(R9){{ELSE SET INITIAL VALUE ! 17222: {{MOV{#B$VRE{4*VRSTO(R9){{SET ERROR STORE ACCESS ! 17223: {{BRN{GNV06{{{MERGE BACK TO EXIT TO CALLER ! 17224: {{ENP{{{{END PROCEDURE GTNVR ! 17225: {{EJC{{{{ ! 17226: * ! 17227: * GTPAT -- GET PATTERN ! 17228: * ! 17229: * GTPAT IS PASSED AN OBJECT IN (XR) AND RETURNS A ! 17230: * PATTERN AFTER PERFORMING ANY NECESSARY CONVERSIONS ! 17231: * ! 17232: * (XR) INPUT ARGUMENT ! 17233: * JSR GTPAT CALL TO CONVERT TO PATTERN ! 17234: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 17235: * (XR) RESULTING PATTERN ! 17236: * (WA) DESTROYED ! 17237: * (WB) DESTROYED (ONLY ON CONVERT ERROR) ! 17238: * (XR) UNCHANGED (ONLY ON CONVERT ERROR) ! 17239: * ! 17240: {GTPAT{PRC{E{1{{ENTRY POINT ! 17241: {{BHI{(R9){#P$AAA{GTPT5{JUMP IF PATTERN ALREADY ! 17242: * ! 17243: * HERE IF NOT PATTERN, TRY FOR STRING ! 17244: * ! 17245: {{MOV{R7{GTPSB{{SAVE WB ! 17246: {{MOV{R9{-(SP){{STACK ARGUMENT FOR GTSTG ! 17247: {{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING ! 17248: {{PPM{GTPT2{{{JUMP IF IMPOSSIBLE ! 17249: * ! 17250: * HERE WE HAVE A STRING ! 17251: * ! 17252: {{BNZ{R6{GTPT1{{JUMP IF NON-NULL ! 17253: * ! 17254: * HERE FOR NULL STRING. GENERATE POINTER TO NULL PATTERN. ! 17255: * ! 17256: {{MOV{#NDNTH{R9{{POINT TO NOTHEN NODE ! 17257: {{BRN{GTPT4{{{JUMP TO EXIT ! 17258: {{EJC{{{{ ! 17259: * ! 17260: * GTPAT (CONTINUED) ! 17261: * ! 17262: * HERE FOR NON-NULL STRING ! 17263: * ! 17264: {GTPT1{MOV{#P$STR{R7{{LOAD PCODE FOR MULTI-CHAR STRING ! 17265: {{BNE{R6{#NUM01{GTPT3{JUMP IF MULTI-CHAR STRING ! 17266: * ! 17267: * HERE FOR ONE CHARACTER STRING, SHARE ONE CHARACTER ANY ! 17268: * ! 17269: {{PLC{R9{{{POINT TO CHARACTER ! 17270: {{LCH{R6{(R9){{LOAD CHARACTER ! 17271: {{MOV{R6{R9{{SET AS PARM1 ! 17272: {{MOV{#P$ANS{R7{{POINT TO PCODE FOR 1-CHAR ANY ! 17273: {{BRN{GTPT3{{{JUMP TO BUILD NODE ! 17274: * ! 17275: * HERE IF ARGUMENT IS NOT CONVERTIBLE TO STRING ! 17276: * ! 17277: {GTPT2{MOV{#P$EXA{R7{{SET PCODE FOR EXPRESSION IN CASE ! 17278: {{BLO{(R9){#B$E$${GTPT3{JUMP TO BUILD NODE IF EXPRESSION ! 17279: * ! 17280: * HERE WE HAVE AN ERROR (CONVERSION IMPOSSIBLE) ! 17281: * ! 17282: {{EXI{1{{{TAKE CONVERT ERROR EXIT ! 17283: * ! 17284: * MERGE HERE TO BUILD NODE FOR STRING OR EXPRESSION ! 17285: * ! 17286: {GTPT3{JSR{PBILD{{{CALL ROUTINE TO BUILD PATTERN NODE ! 17287: * ! 17288: * COMMON EXIT AFTER SUCCESSFUL CONVERSION ! 17289: * ! 17290: {GTPT4{MOV{GTPSB{R7{{RESTORE WB ! 17291: * ! 17292: * MERGE HERE TO EXIT OF NO CONVERSION REQUIRED ! 17293: * ! 17294: {GTPT5{EXI{{{{RETURN TO GTPAT CALLER ! 17295: {{ENP{{{{END PROCEDURE GTPAT ! 17296: {{EJC{{{{ ! 17297: * ! 17298: * GTREA -- GET REAL VALUE ! 17299: * ! 17300: * GTREA IS PASSED AN OBJECT AND RETURNS A REAL VALUE ! 17301: * PERFORMING ANY NECESSARY CONVERSIONS. ! 17302: * ! 17303: * (XR) OBJECT TO BE CONVERTED ! 17304: * JSR GTREA CALL TO CONVERT OBJECT TO REAL ! 17305: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 17306: * (XR) POINTER TO RESULTING REAL ! 17307: * (WA,WB,WC,RA) DESTROYED ! 17308: * (XR) UNCHANGED (CONVERT ERROR ONLY) ! 17309: * ! 17310: {GTREA{PRC{E{1{{ENTRY POINT ! 17311: {{MOV{(R9){R6{{GET FIRST WORD OF BLOCK ! 17312: {{BEQ{R6{#B$RCL{GTRE2{JUMP IF REAL ! 17313: {{JSR{GTNUM{{{ELSE CONVERT ARGUMENT TO NUMERIC ! 17314: {{PPM{GTRE3{{{JUMP IF UNCONVERTIBLE ! 17315: {{BEQ{R6{#B$RCL{GTRE2{JUMP IF REAL WAS RETURNED ! 17316: * ! 17317: * HERE FOR CASE OF AN INTEGER TO CONVERT TO REAL ! 17318: * ! 17319: {GTRE1{LDI{4*ICVAL(R9){{{LOAD INTEGER ! 17320: {{ITR{{{{CONVERT TO REAL ! 17321: {{JSR{RCBLD{{{BUILD RCBLK ! 17322: * ! 17323: * EXIT WITH REAL ! 17324: * ! 17325: {GTRE2{EXI{{{{RETURN TO GTREA CALLER ! 17326: * ! 17327: * HERE ON CONVERSION ERROR ! 17328: * ! 17329: {GTRE3{EXI{1{{{TAKE CONVERT ERROR EXIT ! 17330: {{ENP{{{{END PROCEDURE GTREA ! 17331: {{EJC{{{{ ! 17332: * ! 17333: * GTSMI -- GET SMALL INTEGER ! 17334: * ! 17335: * GTSMI IS PASSED A SNOBOL OBJECT AND RETURNS AN ADDRESS ! 17336: * INTEGER IN THE RANGE (0 LE N LE DNAMB). SUCH A VALUE CAN ! 17337: * ONLY BE DERIVED FROM AN INTEGER IN THE APPROPRIATE RANGE. ! 17338: * SMALL INTEGERS NEVER APPEAR AS SNOBOL VALUES. HOWEVER, ! 17339: * THEY ARE USED INTERNALLY FOR A VARIETY OF PURPOSES. ! 17340: * ! 17341: * -(XS) ARGUMENT TO CONVERT (ON STACK) ! 17342: * JSR GTSMI CALL TO CONVERT TO SMALL INTEGER ! 17343: * PPM LOC TRANSFER LOC FOR NOT INTEGER ! 17344: * PPM LOC TRANSFER LOC FOR LT 0, GT DNAMB ! 17345: * (XR,WC) RESULTING SMALL INT (TWO COPIES) ! 17346: * (XS) POPPED ! 17347: * (RA) DESTROYED ! 17348: * (WA,WB) DESTROYED (ON CONVERT ERROR ONLY) ! 17349: * (XR) INPUT ARG (CONVERT ERROR ONLY) ! 17350: * ! 17351: {GTSMI{PRC{N{2{{ENTRY POINT ! 17352: {{MOV{(SP)+{R9{{LOAD ARGUMENT ! 17353: {{BEQ{(R9){#B$ICL{GTSM1{SKIP IF ALREADY AN INTEGER ! 17354: * ! 17355: * HERE IF NOT AN INTEGER ! 17356: * ! 17357: {{JSR{GTINT{{{CONVERT ARGUMENT TO INTEGER ! 17358: {{PPM{GTSM2{{{JUMP IF CONVERT IS IMPOSSIBLE ! 17359: * ! 17360: * MERGE HERE WITH INTEGER ! 17361: * ! 17362: {GTSM1{LDI{4*ICVAL(R9){{{LOAD INTEGER VALUE ! 17363: {{MFI{R8{GTSM3{{MOVE AS ONE WORD, JUMP IF OVFLOW ! 17364: {{BGT{R8{MXLEN{GTSM3{OR IF TOO SMALL ! 17365: {{MOV{R8{R9{{COPY RESULT TO XR ! 17366: {{EXI{{{{RETURN TO GTSMI CALLER ! 17367: * ! 17368: * HERE IF UNCONVERTIBLE TO INTEGER ! 17369: * ! 17370: {GTSM2{EXI{1{{{TAKE NON-INTEGER ERROR EXIT ! 17371: * ! 17372: * HERE IF OUT OF RANGE ! 17373: * ! 17374: {GTSM3{EXI{2{{{TAKE OUT-OF-RANGE ERROR EXIT ! 17375: {{ENP{{{{END PROCEDURE GTSMI ! 17376: {{EJC{{{{ ! 17377: * ! 17378: * GTSTG -- GET STRING ! 17379: * ! 17380: * GTSTG IS PASSED AN OBJECT AND RETURNS A STRING WITH ! 17381: * ANY NECESSARY CONVERSIONS PERFORMED. ! 17382: * ! 17383: * -(XS) INPUT ARGUMENT (ON STACK) ! 17384: * JSR GTSTG CALL TO CONVERT TO STRING ! 17385: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 17386: * (XR) POINTER TO RESULTING STRING ! 17387: * (WA) LENGTH OF STRING IN CHARACTERS ! 17388: * (XS) POPPED ! 17389: * (RA) DESTROYED ! 17390: * (XR) INPUT ARG (CONVERT ERROR ONLY) ! 17391: * ! 17392: {GTSTG{PRC{N{1{{ENTRY POINT ! 17393: {{MOV{(SP)+{R9{{LOAD ARGUMENT, POP STACK ! 17394: {{BEQ{(R9){#B$SCL{GTS30{JUMP IF ALREADY A STRING ! 17395: * ! 17396: * HERE IF NOT A STRING ALREADY ! 17397: * ! 17398: {GTS01{MOV{R9{-(SP){{RESTACK ARGUMENT IN CASE ERROR ! 17399: {{MOV{R10{-(SP){{SAVE XL ! 17400: {{MOV{R7{GTSVB{{SAVE WB ! 17401: {{MOV{R8{GTSVC{{SAVE WC ! 17402: {{MOV{(R9){R6{{LOAD FIRST WORD OF BLOCK ! 17403: {{BEQ{R6{#B$ICL{GTS05{JUMP TO CONVERT INTEGER ! 17404: {{BEQ{R6{#B$RCL{GTS10{JUMP TO CONVERT REAL ! 17405: {{BEQ{R6{#B$NML{GTS03{JUMP TO CONVERT NAME ! 17406: {{BEQ{R6{#B$BCT{GTS32{JUMP TO CONVERT BUFFER ! 17407: * ! 17408: * HERE ON CONVERSION ERROR ! 17409: * ! 17410: {GTS02{MOV{(SP)+{R10{{RESTORE XL ! 17411: {{MOV{(SP)+{R9{{RELOAD INPUT ARGUMENT ! 17412: {{EXI{1{{{TAKE CONVERT ERROR EXIT ! 17413: {{EJC{{{{ ! 17414: * ! 17415: * GTSTG (CONTINUED) ! 17416: * ! 17417: * HERE TO CONVERT A NAME (ONLY POSSIBLE IF NATURAL VAR) ! 17418: * ! 17419: {GTS03{MOV{4*NMBAS(R9){R10{{LOAD NAME BASE ! 17420: {{BHI{R10{STATE{GTS02{ERROR IF NOT NATURAL VAR (STATIC) ! 17421: {{ADD{#4*VRSOF{R10{{ELSE POINT TO POSSIBLE STRING NAME ! 17422: {{MOV{4*SCLEN(R10){R6{{LOAD LENGTH ! 17423: {{BNZ{R6{GTS04{{JUMP IF NOT SYSTEM VARIABLE ! 17424: {{MOV{4*VRSVO(R10){R10{{ELSE POINT TO SVBLK ! 17425: {{MOV{4*SVLEN(R10){R6{{AND LOAD NAME LENGTH ! 17426: * ! 17427: * MERGE HERE WITH STRING IN XR, LENGTH IN WA ! 17428: * ! 17429: {GTS04{ZER{R7{{{SET OFFSET TO ZERO ! 17430: {{JSR{SBSTR{{{USE SBSTR TO COPY STRING ! 17431: {{BRN{GTS29{{{JUMP TO EXIT ! 17432: * ! 17433: * COME HERE TO CONVERT AN INTEGER ! 17434: * ! 17435: {GTS05{LDI{4*ICVAL(R9){{{LOAD INTEGER VALUE ! 17436: {{MOV{#NUM01{GTSSF{{SET SIGN FLAG NEGATIVE ! 17437: {{ILT{GTS06{{{SKIP IF INTEGER IS NEGATIVE ! 17438: {{NGI{{{{ELSE NEGATE INTEGER ! 17439: {{ZER{GTSSF{{{AND RESET NEGATIVE FLAG ! 17440: {{EJC{{{{ ! 17441: * ! 17442: * GTSTG (CONTINUED) ! 17443: * ! 17444: * HERE WITH SIGN FLAG SET AND SIGN FORCED NEGATIVE AS ! 17445: * REQUIRED BY THE CVD INSTRUCTION. ! 17446: * ! 17447: {GTS06{MOV{GTSWK{R9{{POINT TO RESULT WORK AREA ! 17448: {{MOV{#NSTMX{R7{{INITIALIZE COUNTER TO MAX LENGTH ! 17449: {{PSC{R9{R7{{PREPARE TO STORE (RIGHT-LEFT) ! 17450: * ! 17451: * LOOP TO CONVERT DIGITS INTO WORK AREA ! 17452: * ! 17453: {GTS07{CVD{{{{CONVERT ONE DIGIT INTO WA ! 17454: {{SCH{R6{-(R9){{STORE IN WORK AREA ! 17455: {{DCV{R7{{{DECREMENT COUNTER ! 17456: {{INE{GTS07{{{LOOP IF MORE DIGITS TO GO ! 17457: {{CSC{R9{{{COMPLETE STORE CHARACTERS ! 17458: * ! 17459: * MERGE HERE AFTER CONVERTING INTEGER OR REAL INTO WORK ! 17460: * AREA. WB IS SET TO NSTMX - (NUMBER OF CHARS IN RESULT). ! 17461: * ! 17462: {GTS08{MOV{#NSTMX{R6{{GET MAX NUMBER OF CHARACTERS ! 17463: {{SUB{R7{R6{{COMPUTE LENGTH OF RESULT ! 17464: {{MOV{R6{R10{{REMEMBER LENGTH FOR MOVE LATER ON ! 17465: {{ADD{GTSSF{R6{{ADD ONE FOR NEGATIVE SIGN IF NEEDED ! 17466: {{JSR{ALOCS{{{ALLOCATE STRING FOR RESULT ! 17467: {{MOV{R9{R8{{SAVE RESULT POINTER FOR THE MOMENT ! 17468: {{PSC{R9{{{POINT TO CHARS OF RESULT BLOCK ! 17469: {{BZE{GTSSF{GTS09{{SKIP IF POSITIVE ! 17470: {{MOV{#CH$MN{R6{{ELSE LOAD NEGATIVE SIGN ! 17471: {{SCH{R6{(R9)+{{AND STORE IT ! 17472: {{CSC{R9{{{COMPLETE STORE CHARACTERS ! 17473: * ! 17474: * HERE AFTER DEALING WITH SIGN ! 17475: * ! 17476: {GTS09{MOV{R10{R6{{RECALL LENGTH TO MOVE ! 17477: {{MOV{GTSWK{R10{{POINT TO RESULT WORK AREA ! 17478: {{PLC{R10{R7{{POINT TO FIRST RESULT CHARACTER ! 17479: {{MVC{{{{MOVE CHARS TO RESULT STRING ! 17480: {{MOV{R8{R9{{RESTORE RESULT POINTER ! 17481: {{BRN{GTS29{{{JUMP TO EXIT ! 17482: {{EJC{{{{ ! 17483: * ! 17484: * GTSTG (CONTINUED) ! 17485: * ! 17486: * HERE TO CONVERT A REAL ! 17487: * ! 17488: {GTS10{LDR{4*RCVAL(R9){{{LOAD REAL ! 17489: {{ZER{GTSSF{{{RESET NEGATIVE FLAG ! 17490: {{REQ{GTS31{{{SKIP IF ZERO ! 17491: {{RGE{GTS11{{{JUMP IF REAL IS POSITIVE ! 17492: {{MOV{#NUM01{GTSSF{{ELSE SET NEGATIVE FLAG ! 17493: {{NGR{{{{AND GET ABSOLUTE VALUE OF REAL ! 17494: * ! 17495: * NOW SCALE THE REAL TO THE RANGE (0.1 LE X LT 1.0) ! 17496: * ! 17497: {GTS11{LDI{INTV0{{{INITIALIZE EXPONENT TO ZERO ! 17498: * ! 17499: * LOOP TO SCALE UP IN STEPS OF 10**10 ! 17500: * ! 17501: {GTS12{STR{GTSRS{{{SAVE REAL VALUE ! 17502: {{SBR{REAP1{{{SUBTRACT 0.1 TO COMPARE ! 17503: {{RGE{GTS13{{{JUMP IF SCALE UP NOT REQUIRED ! 17504: {{LDR{GTSRS{{{ELSE RELOAD VALUE ! 17505: {{MLR{REATT{{{MULTIPLY BY 10**10 ! 17506: {{SBI{INTVT{{{DECREMENT EXPONENT BY 10 ! 17507: {{BRN{GTS12{{{LOOP BACK TO TEST AGAIN ! 17508: * ! 17509: * TEST FOR SCALE DOWN REQUIRED ! 17510: * ! 17511: {GTS13{LDR{GTSRS{{{RELOAD VALUE ! 17512: {{SBR{REAV1{{{SUBTRACT 1.0 ! 17513: {{RLT{GTS17{{{JUMP IF NO SCALE DOWN REQUIRED ! 17514: {{LDR{GTSRS{{{ELSE RELOAD VALUE ! 17515: * ! 17516: * LOOP TO SCALE DOWN IN STEPS OF 10**10 ! 17517: * ! 17518: {GTS14{SBR{REATT{{{SUBTRACT 10**10 TO COMPARE ! 17519: {{RLT{GTS15{{{JUMP IF LARGE STEP NOT REQUIRED ! 17520: {{LDR{GTSRS{{{ELSE RESTORE VALUE ! 17521: {{DVR{REATT{{{DIVIDE BY 10**10 ! 17522: {{STR{GTSRS{{{STORE NEW VALUE ! 17523: {{ADI{INTVT{{{INCREMENT EXPONENT BY 10 ! 17524: {{BRN{GTS14{{{LOOP BACK ! 17525: {{EJC{{{{ ! 17526: * ! 17527: * GTSTG (CONTINUED) ! 17528: * ! 17529: * AT THIS POINT WE HAVE (1.0 LE X LT 10**10) ! 17530: * COMPLETE SCALING WITH POWERS OF TEN TABLE ! 17531: * ! 17532: {GTS15{MOV{#REAV1{R9{{POINT TO POWERS OF TEN TABLE ! 17533: * ! 17534: * LOOP TO LOCATE CORRECT ENTRY IN TABLE ! 17535: * ! 17536: {GTS16{LDR{GTSRS{{{RELOAD VALUE ! 17537: {{ADI{INTV1{{{INCREMENT EXPONENT ! 17538: {{ADD{#4*CFP$R{R9{{POINT TO NEXT ENTRY IN TABLE ! 17539: {{SBR{(R9){{{SUBTRACT IT TO COMPARE ! 17540: {{RGE{GTS16{{{LOOP TILL WE FIND A LARGER ENTRY ! 17541: {{LDR{GTSRS{{{THEN RELOAD THE VALUE ! 17542: {{DVR{(R9){{{AND COMPLETE SCALING ! 17543: {{STR{GTSRS{{{STORE VALUE ! 17544: * ! 17545: * WE ARE NOW SCALED, SO ROUND BY ADDING 0.5 * 10**(-CFP$S) ! 17546: * ! 17547: {GTS17{LDR{GTSRS{{{GET VALUE AGAIN ! 17548: {{ADR{GTSRN{{{ADD ROUNDING FACTOR ! 17549: {{STR{GTSRS{{{STORE RESULT ! 17550: * ! 17551: * THE ROUNDING OPERATION MAY HAVE PUSHED US UP PAST ! 17552: * 1.0 AGAIN, SO CHECK ONE MORE TIME. ! 17553: * ! 17554: {{SBR{REAV1{{{SUBTRACT 1.0 TO COMPARE ! 17555: {{RLT{GTS18{{{SKIP IF OK ! 17556: {{ADI{INTV1{{{ELSE INCREMENT EXPONENT ! 17557: {{LDR{GTSRS{{{RELOAD VALUE ! 17558: {{DVR{REAVT{{{DIVIDE BY 10.0 TO RESCALE ! 17559: {{BRN{GTS19{{{JUMP TO MERGE ! 17560: * ! 17561: * HERE IF ROUNDING DID NOT MUCK UP SCALING ! 17562: * ! 17563: {GTS18{LDR{GTSRS{{{RELOAD ROUNDED VALUE ! 17564: {{EJC{{{{ ! 17565: * ! 17566: * GTSTG (CONTINUED) ! 17567: * ! 17568: * NOW WE HAVE COMPLETED THE SCALING AS FOLLOWS ! 17569: * ! 17570: * (IA) SIGNED EXPONENT ! 17571: * (RA) SCALED REAL (ABSOLUTE VALUE) ! 17572: * ! 17573: * IF THE EXPONENT IS NEGATIVE OR GREATER THAN CFP$S, THEN ! 17574: * WE CONVERT THE NUMBER IN THE FORM. ! 17575: * ! 17576: * (NEG SIGN) 0 . (CPF$S DIGITS) E (EXP SIGN) (EXP DIGITS) ! 17577: * ! 17578: * IF THE EXPONENT IS POSITIVE AND LESS THAN OR EQUAL TO ! 17579: * CFP$S, THE NUMBER IS CONVERTED IN THE FORM. ! 17580: * ! 17581: * (NEG SIGN) (EXPONENT DIGITS) . (CFP$S-EXPONENT DIGITS) ! 17582: * ! 17583: * IN BOTH CASES, THE FORMATS OBTAINED FROM THE ABOVE ! 17584: * RULES ARE MODIFIED BY DELETING TRAILING ZEROS AFTER THE ! 17585: * DECIMAL POINT. THERE ARE NO LEADING ZEROS IN THE EXPONENT ! 17586: * AND THE EXPONENT SIGN IS ALWAYS PRESENT. ! 17587: * ! 17588: {GTS19{MOV{#CFP$S{R10{{SET NUM DEC DIGITS = CFP$S ! 17589: {{MOV{#CH$MN{GTSES{{SET EXPONENT SIGN NEGATIVE ! 17590: {{ILT{GTS21{{{ALL SET IF EXPONENT IS NEGATIVE ! 17591: {{MFI{R6{{{ELSE FETCH EXPONENT ! 17592: {{BLE{R6{#CFP$S{GTS20{SKIP IF WE CAN USE SPECIAL FORMAT ! 17593: {{MTI{R6{{{ELSE RESTORE EXPONENT ! 17594: {{NGI{{{{SET NEGATIVE FOR CVD ! 17595: {{MOV{#CH$PL{GTSES{{SET PLUS SIGN FOR EXPONENT SIGN ! 17596: {{BRN{GTS21{{{JUMP TO GENERATE EXPONENT ! 17597: * ! 17598: * HERE IF WE CAN USE THE FORMAT WITHOUT AN EXPONENT ! 17599: * ! 17600: {GTS20{SUB{R6{R10{{COMPUTE DIGITS AFTER DECIMAL POINT ! 17601: {{LDI{INTV0{{{RESET EXPONENT TO ZERO ! 17602: {{EJC{{{{ ! 17603: * ! 17604: * GTSTG (CONTINUED) ! 17605: * ! 17606: * MERGE HERE AS FOLLOWS ! 17607: * ! 17608: * (IA) EXPONENT ABSOLUTE VALUE ! 17609: * GTSES CHARACTER FOR EXPONENT SIGN ! 17610: * (RA) POSITIVE FRACTION ! 17611: * (XL) NUMBER OF DIGITS AFTER DEC POINT ! 17612: * ! 17613: {GTS21{MOV{GTSWK{R9{{POINT TO WORK AREA ! 17614: {{MOV{#NSTMX{R7{{SET CHARACTER CTR TO MAX LENGTH ! 17615: {{PSC{R9{R7{{PREPARE TO STORE (RIGHT TO LEFT) ! 17616: {{IEQ{GTS23{{{SKIP EXPONENT IF IT IS ZERO ! 17617: * ! 17618: * LOOP TO GENERATE DIGITS OF EXPONENT ! 17619: * ! 17620: {GTS22{CVD{{{{CONVERT A DIGIT INTO WA ! 17621: {{SCH{R6{-(R9){{STORE IN WORK AREA ! 17622: {{DCV{R7{{{DECREMENT COUNTER ! 17623: {{INE{GTS22{{{LOOP BACK IF MORE DIGITS TO GO ! 17624: * ! 17625: * HERE GENERATE EXPONENT SIGN AND E ! 17626: * ! 17627: {{MOV{GTSES{R6{{LOAD EXPONENT SIGN ! 17628: {{SCH{R6{-(R9){{STORE IN WORK AREA ! 17629: {{MOV{#CH$LE{R6{{GET CHARACTER LETTER E ! 17630: {{SCH{R6{-(R9){{STORE IN WORK AREA ! 17631: {{SUB{#NUM02{R7{{DECREMENT COUNTER FOR SIGN AND E ! 17632: * ! 17633: * HERE TO GENERATE THE FRACTION ! 17634: * ! 17635: {GTS23{MLR{GTSSC{{{CONVERT REAL TO INTEGER (10**CFP$S) ! 17636: {{RTI{{{{GET INTEGER (OVERFLOW IMPOSSIBLE) ! 17637: {{NGI{{{{NEGATE AS REQUIRED BY CVD ! 17638: * ! 17639: * LOOP TO SUPPRESS TRAILING ZEROS ! 17640: * ! 17641: {GTS24{BZE{R10{GTS27{{JUMP IF NO DIGITS LEFT TO DO ! 17642: {{CVD{{{{ELSE CONVERT ONE DIGIT ! 17643: {{BNE{R6{#CH$D0{GTS26{JUMP IF NOT A ZERO ! 17644: {{DCV{R10{{{DECREMENT COUNTER ! 17645: {{BRN{GTS24{{{LOOP BACK FOR NEXT DIGIT ! 17646: {{EJC{{{{ ! 17647: * ! 17648: * GTSTG (CONTINUED) ! 17649: * ! 17650: * LOOP TO GENERATE DIGITS AFTER DECIMAL POINT ! 17651: * ! 17652: {GTS25{CVD{{{{CONVERT A DIGIT INTO WA ! 17653: * ! 17654: * MERGE HERE FIRST TIME ! 17655: * ! 17656: {GTS26{SCH{R6{-(R9){{STORE DIGIT ! 17657: {{DCV{R7{{{DECREMENT COUNTER ! 17658: {{DCV{R10{{{DECREMENT COUNTER ! 17659: {{BNZ{R10{GTS25{{LOOP BACK IF MORE TO GO ! 17660: * ! 17661: * HERE GENERATE THE DECIMAL POINT ! 17662: * ! 17663: {GTS27{MOV{#CH$DT{R6{{LOAD DECIMAL POINT ! 17664: {{SCH{R6{-(R9){{STORE IN WORK AREA ! 17665: {{DCV{R7{{{DECREMENT COUNTER ! 17666: * ! 17667: * HERE GENERATE THE DIGITS BEFORE THE DECIMAL POINT ! 17668: * ! 17669: {GTS28{CVD{{{{CONVERT A DIGIT INTO WA ! 17670: {{SCH{R6{-(R9){{STORE IN WORK AREA ! 17671: {{DCV{R7{{{DECREMENT COUNTER ! 17672: {{INE{GTS28{{{LOOP BACK IF MORE TO GO ! 17673: {{CSC{R9{{{COMPLETE STORE CHARACTERS ! 17674: {{BRN{GTS08{{{ELSE JUMP BACK TO EXIT ! 17675: * ! 17676: * EXIT POINT AFTER SUCCESSFUL CONVERSION ! 17677: * ! 17678: {GTS29{MOV{(SP)+{R10{{RESTORE XL ! 17679: {{ICA{SP{{{POP ARGUMENT ! 17680: {{MOV{GTSVB{R7{{RESTORE WB ! 17681: {{MOV{GTSVC{R8{{RESTORE WC ! 17682: * ! 17683: * MERGE HERE IF NO CONVERSION REQUIRED ! 17684: * ! 17685: {GTS30{MOV{4*SCLEN(R9){R6{{LOAD STRING LENGTH ! 17686: {{EXI{{{{RETURN TO CALLER ! 17687: * ! 17688: * HERE TO RETURN STRING FOR REAL ZERO ! 17689: * ! 17690: {GTS31{MOV{#SCRE0{R10{{POINT TO STRING ! 17691: {{MOV{#NUM02{R6{{2 CHARS ! 17692: {{ZER{R7{{{ZERO OFFSET ! 17693: {{JSR{SBSTR{{{COPY STRING ! 17694: {{BRN{GTS29{{{RETURN ! 17695: {{EJC{{{{ ! 17696: * ! 17697: * HERE TO CONVERT A BUFFER BLOCK ! 17698: * ! 17699: {GTS32{MOV{R9{R10{{COPY ARG PTR ! 17700: {{MOV{4*BCLEN(R10){R6{{GET SIZE TO ALLOCATE ! 17701: {{BZE{R6{GTS33{{IF NULL THEN RETURN NULL ! 17702: {{JSR{ALOCS{{{ALLOCATE STRING FRAME ! 17703: {{MOV{R9{R7{{SAVE STRING PTR ! 17704: {{MOV{4*SCLEN(R9){R6{{GET LENGTH TO MOVE ! 17705: {{CTB{R6{0{{GET AS MULTIPLE OF WORD SIZE ! 17706: {{MOV{4*BCBUF(R10){R10{{POINT TO BFBLK ! 17707: {{ADD{#4*SCSI${R9{{POINT TO START OF CHARACTER AREA ! 17708: {{ADD{#4*BFSI${R10{{POINT TO START OF BUFFER CHARS ! 17709: {{MVW{{{{COPY WORDS ! 17710: {{MOV{R7{R9{{RESTORE SCBLK PTR ! 17711: {{BRN{GTS29{{{EXIT WITH SCBLK ! 17712: * ! 17713: * HERE WHEN NULL BUFFER IS BEING CONVERTED ! 17714: * ! 17715: {GTS33{MOV{#NULLS{R9{{POINT TO NULL ! 17716: {{BRN{GTS29{{{EXIT WITH NULL ! 17717: {{ENP{{{{END PROCEDURE GTSTG ! 17718: {{EJC{{{{ ! 17719: * ! 17720: * GTVAR -- GET VARIABLE FOR I/O/TRACE ASSOCIATION ! 17721: * ! 17722: * GTVAR IS USED TO POINT TO AN ACTUAL VARIABLE LOCATION ! 17723: * FOR THE DETACH,INPUT,OUTPUT,TRACE,STOPTR SYSTEM FUNCTIONS ! 17724: * ! 17725: * (XR) ARGUMENT TO FUNCTION ! 17726: * JSR GTVAR CALL TO LOCATE VARIABLE POINTER ! 17727: * PPM LOC TRANSFER LOC IF NOT OK VARIABLE ! 17728: * (XL,WA) NAME BASE,OFFSET OF VARIABLE ! 17729: * (XR,RA) DESTROYED ! 17730: * (WB,WC) DESTROYED (CONVERT ERROR ONLY) ! 17731: * (XR) INPUT ARG (CONVERT ERROR ONLY) ! 17732: * ! 17733: {GTVAR{PRC{E{1{{ENTRY POINT ! 17734: {{BNE{(R9){#B$NML{GTVR2{JUMP IF NOT A NAME ! 17735: {{MOV{4*NMOFS(R9){R6{{ELSE LOAD NAME OFFSET ! 17736: {{MOV{4*NMBAS(R9){R10{{LOAD NAME BASE ! 17737: {{BEQ{(R10){#B$EVT{GTVR1{ERROR IF EXPRESSION VARIABLE ! 17738: {{BNE{(R10){#B$KVT{GTVR3{ALL OK IF NOT KEYWORD VARIABLE ! 17739: * ! 17740: * HERE ON CONVERSION ERROR ! 17741: * ! 17742: {GTVR1{EXI{1{{{TAKE CONVERT ERROR EXIT ! 17743: * ! 17744: * HERE IF NOT A NAME, TRY CONVERT TO NATURAL VARIABLE ! 17745: * ! 17746: {GTVR2{MOV{R8{GTVRC{{SAVE WC ! 17747: {{JSR{GTNVR{{{LOCATE VRBLK IF POSSIBLE ! 17748: {{PPM{GTVR1{{{JUMP IF CONVERT ERROR ! 17749: {{MOV{R9{R10{{ELSE COPY VRBLK NAME BASE ! 17750: {{MOV{#4*VRVAL{R6{{AND SET OFFSET ! 17751: {{MOV{GTVRC{R8{{RESTORE WC ! 17752: * ! 17753: * HERE FOR NAME OBTAINED ! 17754: * ! 17755: {GTVR3{BHI{R10{STATE{GTVR4{ALL OK IF NOT NATURAL VARIABLE ! 17756: {{BEQ{4*VRSTO(R10){#B$VRE{GTVR1{ERROR IF PROTECTED VARIABLE ! 17757: * ! 17758: * COMMON EXIT POINT ! 17759: * ! 17760: {GTVR4{EXI{{{{RETURN TO CALLER ! 17761: {{ENP{{{{END PROCEDURE GTVAR ! 17762: {{EJC{{{{ ! 17763: * ! 17764: * HASHS -- COMPUTE HASH INDEX FOR STRING ! 17765: * ! 17766: * HASHS IS USED TO CONVERT A STRING TO A UNIQUE INTEGER ! 17767: * VALUE. THE RESULTING HASH VALUE IS A POSITIVE INTEGER ! 17768: * IN THE RANGE 0 TO CFP$M ! 17769: * ! 17770: * (XR) STRING TO BE HASHED ! 17771: * JSR HASHS CALL TO HASH STRING ! 17772: * (IA) HASH VALUE ! 17773: * (XR,WB,WC) DESTROYED ! 17774: * ! 17775: * THE HASH FUNCTION USED IS AS FOLLOWS. ! 17776: * ! 17777: * START WITH THE LENGTH OF THE STRING (SGD07) ! 17778: * ! 17779: * TAKE THE FIRST E$HNW WORDS OF THE CHARACTERS FROM ! 17780: * THE STRING OR ALL THE WORDS IF FEWER THAN E$HNW. ! 17781: * ! 17782: * COMPUTE THE EXCLUSIVE OR OF ALL THESE WORDS TREATING ! 17783: * THEM AS ONE WORD BIT STRING VALUES. ! 17784: * ! 17785: * MOVE THE RESULT AS AN INTEGER WITH THE MTI INSTRUCTION. ! 17786: * ! 17787: {HASHS{PRC{E{0{{ENTRY POINT ! 17788: {{MOV{4*SCLEN(R9){R8{{LOAD STRING LENGTH IN CHARACTERS ! 17789: {{MOV{R8{R7{{INITIALIZE WITH LENGTH ! 17790: {{BZE{R8{HSHS3{{JUMP IF NULL STRING ! 17791: {{CTW{R8{0{{ELSE GET NUMBER OF WORDS OF CHARS ! 17792: {{ADD{#4*SCHAR{R9{{POINT TO CHARACTERS OF STRING ! 17793: {{BLO{R8{#E$HNW{HSHS1{USE WHOLE STRING IF SHORT ! 17794: {{MOV{#E$HNW{R8{{ELSE SET TO INVOLVE FIRST E$HNW WDS ! 17795: * ! 17796: * HERE WITH COUNT OF WORDS TO CHECK IN WC ! 17797: * ! 17798: {HSHS1{LCT{R8{R8{{SET COUNTER TO CONTROL LOOP ! 17799: * ! 17800: * LOOP TO COMPUTE EXCLUSIVE OR ! 17801: * ! 17802: {HSHS2{XOB{(R9)+{R7{{EXCLUSIVE OR NEXT WORD OF CHARS ! 17803: {{BCT{R8{HSHS2{{LOOP TILL ALL PROCESSED ! 17804: * ! 17805: * MERGE HERE WITH EXCLUSIVE OR IN WB ! 17806: * ! 17807: {HSHS3{ZGB{R7{{{ZEROISE UNDEFINED BITS ! 17808: {{ANB{BITSM{R7{{ENSURE IN RANGE 0 TO CFP$M ! 17809: {{MTI{R7{{{MOVE RESULT AS INTEGER ! 17810: {{ZER{R9{{{CLEAR GARBAGE VALUE IN XR ! 17811: {{EXI{{{{RETURN TO HASHS CALLER ! 17812: {{ENP{{{{END PROCEDURE HASHS ! 17813: {{EJC{{{{ ! 17814: * ! 17815: * ICBLD -- BUILD INTEGER BLOCK ! 17816: * ! 17817: * (IA) INTEGER VALUE FOR ICBLK ! 17818: * JSR ICBLD CALL TO BUILD INTEGER BLOCK ! 17819: * (XR) POINTER TO RESULT ICBLK ! 17820: * (WA) DESTROYED ! 17821: * ! 17822: {ICBLD{PRC{E{0{{ENTRY POINT ! 17823: {{MFI{R9{ICBL1{{COPY SMALL INTEGERS ! 17824: {{BLE{R9{#NUM02{ICBL3{JUMP IF 0,1 OR 2 ! 17825: * ! 17826: * CONSTRUCT ICBLK ! 17827: * ! 17828: {ICBL1{MOV{DNAMP{R9{{LOAD POINTER TO NEXT AVAILABLE LOC ! 17829: {{ADD{#4*ICSI${R9{{POINT PAST NEW ICBLK ! 17830: {{BLO{R9{DNAME{ICBL2{JUMP IF THERE IS ROOM ! 17831: {{MOV{#4*ICSI${R6{{ELSE LOAD LENGTH OF ICBLK ! 17832: {{JSR{ALLOC{{{USE STANDARD ALLOCATOR TO GET BLOCK ! 17833: {{ADD{R6{R9{{POINT PAST BLOCK TO MERGE ! 17834: * ! 17835: * MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED ! 17836: * ! 17837: {ICBL2{MOV{R9{DNAMP{{SET NEW POINTER ! 17838: {{SUB{#4*ICSI${R9{{POINT BACK TO START OF BLOCK ! 17839: {{MOV{#B$ICL{(R9){{STORE TYPE WORD ! 17840: {{STI{4*ICVAL(R9){{{STORE INTEGER VALUE IN ICBLK ! 17841: {{EXI{{{{RETURN TO ICBLD CALLER ! 17842: * ! 17843: * OPTIMISE BY NOT BUILDING ICBLKS FOR SMALL INTEGERS ! 17844: * ! 17845: {ICBL3{WTB{R9{{{CONVERT INTEGER TO OFFSET ! 17846: {{MOV{L^INTAB(R9){R9{{POINT TO PRE-BUILT ICBLK ! 17847: {{EXI{{{{RETURN ! 17848: {{ENP{{{{END PROCEDURE ICBLD ! 17849: {{EJC{{{{ ! 17850: * ! 17851: * IDENT -- COMPARE TWO VALUES ! 17852: * ! 17853: * IDENT COMPARES TWO VALUES IN THE SENSE OF THE IDENT ! 17854: * DIFFER FUNCTIONS AVAILABLE AT THE SNOBOL LEVEL. ! 17855: * ! 17856: * (XR) FIRST ARGUMENT ! 17857: * (XL) SECOND ARGUMENT ! 17858: * JSR IDENT CALL TO COMPARE ARGUMENTS ! 17859: * PPM LOC TRANSFER LOC IF IDENT ! 17860: * (NORMAL RETURN IF DIFFER) ! 17861: * (XR,XL,WC,RA) DESTROYED ! 17862: * ! 17863: {IDENT{PRC{E{1{{ENTRY POINT ! 17864: {{BEQ{R9{R10{IDEN7{JUMP IF SAME POINTER (IDENT) ! 17865: {{MOV{(R9){R8{{ELSE LOAD ARG 1 TYPE WORD ! 17866: {{BNE{R8{(R10){IDEN1{DIFFER IF ARG 2 TYPE WORD DIFFER ! 17867: {{BEQ{R8{#B$SCL{IDEN2{JUMP IF STRINGS ! 17868: {{BEQ{R8{#B$ICL{IDEN4{JUMP IF INTEGERS ! 17869: {{BEQ{R8{#B$RCL{IDEN5{JUMP IF REALS ! 17870: {{BEQ{R8{#B$NML{IDEN6{JUMP IF NAMES ! 17871: * ! 17872: * FOR ALL OTHER DATATYPES, MUST BE DIFFER IF XR NE XL ! 17873: * ! 17874: * MERGE HERE FOR DIFFER ! 17875: * ! 17876: {IDEN1{EXI{{{{TAKE DIFFER EXIT ! 17877: * ! 17878: * HERE FOR STRINGS, IDENT ONLY IF LENGTHS AND CHARS SAME ! 17879: * ! 17880: {IDEN2{MOV{4*SCLEN(R9){R8{{LOAD ARG 1 LENGTH ! 17881: {{BNE{R8{4*SCLEN(R10){IDEN1{DIFFER IF LENGTHS DIFFER ! 17882: {{CTW{R8{0{{GET NUMBER OF WORDS IN STRINGS ! 17883: {{ADD{#4*SCHAR{R9{{POINT TO CHARS OF ARG 1 ! 17884: {{ADD{#4*SCHAR{R10{{POINT TO CHARS OF ARG 2 ! 17885: {{LCT{R8{R8{{SET LOOP COUNTER ! 17886: * ! 17887: * LOOP TO COMPARE CHARACTERS. NOTE THAT WA CANNOT BE ZERO ! 17888: * SINCE ALL NULL STRINGS POINT TO NULLS AND GIVE XL=XR. ! 17889: * ! 17890: {IDEN3{CNE{(R9){(R10){IDEN8{DIFFER IF CHARS DO NOT MATCH ! 17891: {{ICA{R9{{{ELSE BUMP ARG ONE POINTER ! 17892: {{ICA{R10{{{BUMP ARG TWO POINTER ! 17893: {{BCT{R8{IDEN3{{LOOP BACK TILL ALL CHECKED ! 17894: {{EJC{{{{ ! 17895: * ! 17896: * IDENT (CONTINUED) ! 17897: * ! 17898: * HERE TO EXIT FOR CASE OF TWO IDENT STRINGS ! 17899: * ! 17900: {{ZER{R10{{{CLEAR GARBAGE VALUE IN XL ! 17901: {{ZER{R9{{{CLEAR GARBAGE VALUE IN XR ! 17902: {{EXI{1{{{TAKE IDENT EXIT ! 17903: * ! 17904: * HERE FOR INTEGERS, IDENT IF SAME VALUES ! 17905: * ! 17906: {IDEN4{LDI{4*ICVAL(R9){{{LOAD ARG 1 ! 17907: {{SBI{4*ICVAL(R10){{{SUBTRACT ARG 2 TO COMPARE ! 17908: {{IOV{IDEN1{{{DIFFER IF OVERFLOW ! 17909: {{INE{IDEN1{{{DIFFER IF RESULT IS NOT ZERO ! 17910: {{EXI{1{{{TAKE IDENT EXIT ! 17911: * ! 17912: * HERE FOR REALS, IDENT IF SAME VALUES ! 17913: * ! 17914: {IDEN5{LDR{4*RCVAL(R9){{{LOAD ARG 1 ! 17915: {{SBR{4*RCVAL(R10){{{SUBTRACT ARG 2 TO COMPARE ! 17916: {{ROV{IDEN1{{{DIFFER IF OVERFLOW ! 17917: {{RNE{IDEN1{{{DIFFER IF RESULT IS NOT ZERO ! 17918: {{EXI{1{{{TAKE IDENT EXIT ! 17919: * ! 17920: * HERE FOR NAMES, IDENT IF BASES AND OFFSETS SAME ! 17921: * ! 17922: {IDEN6{BNE{4*NMOFS(R9){4*NMOFS(R10){IDEN1{DIFFER IF DIFFERENT OFFSET ! 17923: {{BNE{4*NMBAS(R9){4*NMBAS(R10){IDEN1{DIFFER IF DIFFERENT BASE ! 17924: * ! 17925: * MERGE HERE TO SIGNAL IDENT FOR IDENTICAL POINTERS ! 17926: * ! 17927: {IDEN7{EXI{1{{{TAKE IDENT EXIT ! 17928: * ! 17929: * HERE FOR DIFFER STRINGS ! 17930: * ! 17931: {IDEN8{ZER{R9{{{CLEAR GARBAGE PTR IN XR ! 17932: {{ZER{R10{{{CLEAR GARBAGE PTR IN XL ! 17933: {{EXI{{{{RETURN TO CALLER (DIFFER) ! 17934: {{ENP{{{{END PROCEDURE IDENT ! 17935: {{EJC{{{{ ! 17936: * ! 17937: * INOUT - USED TO INITIALISE INPUT AND OUTPUT VARIABLES ! 17938: * ! 17939: * (XL) POINTER TO VBL NAME STRING ! 17940: * (WB) TRBLK TYPE ! 17941: * JSR INOUT CALL TO PERFORM INITIALISATION ! 17942: * (XL) VRBLK PTR ! 17943: * (XR) TRBLK PTR ! 17944: * (WA,WC) DESTROYED ! 17945: * ! 17946: * NOTE THAT TRTER (= TRTRF) FIELD OF STANDARD I/O VARIABLES ! 17947: * POINTS TO CORRESPONDING SVBLK NOT TO A TRBLK AS IS THE ! 17948: * CASE FOR ORDINARY VARIABLES. ! 17949: * ! 17950: {INOUT{PRC{E{0{{ENTRY POINT ! 17951: {{MOV{R7{-(SP){{STACK TRBLK TYPE ! 17952: {{MOV{4*SCLEN(R10){R6{{GET NAME LENGTH ! 17953: {{ZER{R7{{{POINT TO START OF NAME ! 17954: {{JSR{SBSTR{{{BUILD A PROPER SCBLK ! 17955: {{JSR{GTNVR{{{BUILD VRBLK ! 17956: {{PPM{{{{NO ERROR RETURN ! 17957: {{MOV{R9{R8{{SAVE VRBLK POINTER ! 17958: {{MOV{(SP)+{R7{{GET TRTER FIELD ! 17959: {{ZER{R10{{{ZERO TRFPT ! 17960: {{JSR{TRBLD{{{BUILD TRBLK ! 17961: {{MOV{R8{R10{{RECALL VRBLK POINTER ! 17962: {{MOV{4*VRSVP(R10){4*TRTER(R9){{STORE SVBLK POINTER ! 17963: {{MOV{R9{4*VRVAL(R10){{STORE TRBLK PTR IN VRBLK ! 17964: {{MOV{#B$VRA{4*VRGET(R10){{SET TRAPPED ACCESS ! 17965: {{MOV{#B$VRV{4*VRSTO(R10){{SET TRAPPED STORE ! 17966: {{EXI{{{{RETURN TO CALLER ! 17967: {{ENP{{{{END PROCEDURE INOUT ! 17968: {{EJC{{{{ ! 17969: * ! 17970: * INSBF -- INSERT STRING IN BUFFER ! 17971: * ! 17972: * THIS ROUTINE WILL REPLACE A SECTION OF A BUFFER WITH THE ! 17973: * CONTENTS OF A GIVEN STRING. IF THE LENGTH OF THE ! 17974: * SECTION TO BE REPLACED IS DIFFERENT THAN THE LENGTH OF ! 17975: * THE GIVEN STRING, AND THE REPLACEMENT IS NOT AN APPEND, ! 17976: * THEN THE UPPER SECTION OF THE BUFFER IS SHIFTED UP OR ! 17977: * DOWN TO CREATE THE PROPER SPACE FOR THE INSERT. ! 17978: * ! 17979: * (XR) POINTER TO BFBLK ! 17980: * (XL) OBJECT WHICH IS STRING CONVERTABLE ! 17981: * (WA) OFFSET OF START OF INSERT IN (XR) ! 17982: * (WB) LENGTH OF SECTION IN (XR) REPLACED ! 17983: * JSR INSBF CALL TO INSERT CHARACTERS IN BUFFER ! 17984: * PPM LOC THREAD IF (XR) NOT CONVERTABLE ! 17985: * PPM LOC THREAD IF INSERT NOT POSSIBLE ! 17986: * ! 17987: * THE SECOND ALTERNATE EXIT IS TAKEN IF THE INSERT WOULD ! 17988: * OVERFLOW THE BUFFER, OR IF THE INSERT IS OUT PAST THE ! 17989: * DEFINED END OF THE BUFFER AS GIVEN. ! 17990: * ! 17991: {INSBF{PRC{E{2{{ENTRY POINT ! 17992: {{MOV{R6{INSSA{{SAVE ENTRY WA ! 17993: {{MOV{R7{INSSB{{SAVE ENTRY WB ! 17994: {{MOV{R8{INSSC{{SAVE ENTRY WC ! 17995: {{ADD{R7{R6{{ADD TO GET OFFSET PAST REPLACE PART ! 17996: {{MOV{R6{INSAB{{SAVE WA+WB ! 17997: {{MOV{4*BCLEN(R9){R8{{GET CURRENT DEFINED LENGTH ! 17998: {{BGT{INSSA{R8{INS07{FAIL IF START OFFSET TOO BIG ! 17999: {{BGT{R6{R8{INS07{FAIL IF FINAL OFFSET TOO BIG ! 18000: {{MOV{R10{-(SP){{SAVE ENTRY XL ! 18001: {{MOV{R9{-(SP){{SAVE BCBLK PTR ! 18002: {{MOV{R10{-(SP){{STACK AGAIN FOR GTSTG ! 18003: {{JSR{GTSTG{{{CALL TO CONVERT TO STRING ! 18004: {{PPM{INS05{{{TAKE STRING CONVERT ERR EXIT ! 18005: {{MOV{R9{R10{{SAVE STRING PTR ! 18006: {{MOV{(SP){R9{{RESTORE BCBLK PTR ! 18007: {{ADD{R8{R6{{ADD BUFFER LEN TO STRING LEN ! 18008: {{SUB{INSSB{R6{{BIAS OUT COMPONENT BEING REPLACED ! 18009: {{MOV{4*BCBUF(R9){R9{{POINT TO BFBLK ! 18010: {{BGT{R6{4*BFALC(R9){INS06{FAIL IF RESULT EXCEEDS ALLOCATION ! 18011: {{MOV{(SP){R9{{RESTORE BCBLK PTR ! 18012: {{MOV{R8{R6{{GET BUFFER LENGTH ! 18013: {{SUB{INSAB{R6{{SUBTRACT TO GET SHIFT LENGTH ! 18014: {{ADD{4*SCLEN(R10){R8{{ADD LENGTH OF NEW ! 18015: {{SUB{INSSB{R8{{SUBTRACT OLD TO GET TOTAL NEW LEN ! 18016: {{MOV{4*BCLEN(R9){R7{{GET OLD BCLEN ! 18017: {{MOV{R8{4*BCLEN(R9){{STUFF NEW LENGTH ! 18018: {{BZE{R6{INS04{{SKIP SHIFT IF NOTHING TO DO ! 18019: {{BEQ{INSSB{4*SCLEN(R10){INS04{SKIP SHIFT IF LENGTHS MATCH ! 18020: {{MOV{4*BCBUF(R9){R9{{POINT TO BFBLK ! 18021: {{MOV{R10{-(SP){{SAVE SCBLK PTR ! 18022: {{BLO{INSSB{4*SCLEN(R10){INS01{BRN IF SHFT IS FOR MORE ROOM ! 18023: {{EJC{{{{ ! 18024: * ! 18025: * INSBF (CONTINUED) ! 18026: * ! 18027: * WE ARE SHIFTING THE UPPER SEGMENT DOWN TO COMPACT ! 18028: * THE BUFFER. (THE STRING LENGTH IS SMALLER THAN THE ! 18029: * SEGMENT BEING REPLACED.) REGISTERS ARE SET AS: ! 18030: * ! 18031: * (WA) MOVE (SHIFT DOWN) LENGTH ! 18032: * (WB) OLD BCLEN ! 18033: * (WC) NEW BCLEN ! 18034: * (XR) BFBLK PTR ! 18035: * (XL),(XS) SCBLK PTR ! 18036: * ! 18037: {{MOV{INSSA{R7{{GET OFFSET TO INSERT ! 18038: {{ADD{4*SCLEN(R10){R7{{ADD INSERT LENGTH TO GET DEST OFF ! 18039: {{MOV{R9{R10{{MAKE COPY ! 18040: {{PLC{R10{INSAB{{PREPARE SOURCE FOR MOVE ! 18041: {{PSC{R9{R7{{PREPARE DESTINATION REG FOR MOVE ! 18042: {{MVC{{{{MOVE EM OUT ! 18043: {{BRN{INS02{{{BRANCH TO PAD ! 18044: * ! 18045: * WE ARE SHIFTING THE UPPER SEGMENT UP TO EXPAND ! 18046: * THE BUFFER. (THE STRING LENGTH IS LARGER THAN THE ! 18047: * SEGMENT BEING REPLACED.) ! 18048: * ! 18049: {INS01{MOV{R9{R10{{COPY BFBLK PTR ! 18050: {{PLC{R10{R7{{SET SOURCE REG FOR MOVE BACKWARDS ! 18051: {{PSC{R9{R8{{SET DESTINATION PTR FOR MOVE ! 18052: {{MCB{{{{MOVE BACKWARDS (POSSIBLE OVERLAP) ! 18053: * ! 18054: * MERGE HERE AFTER MOVE TO ADJUST PADDING AT NEW BUFFER END ! 18055: * ! 18056: {INS02{MOV{(SP)+{R10{{RESTORE SCBLK PTR ! 18057: {{MOV{R8{R6{{COPY NEW BUFFER END ! 18058: {{CTB{R6{0{{ROUND OUT ! 18059: {{SUB{R8{R6{{SUBTRACT TO GET REMAINDER ! 18060: {{BZE{R6{INS04{{NO PAD IF ALREADY EVEN BOUNDARY ! 18061: {{MOV{(SP){R9{{GET BCBLK PTR ! 18062: {{MOV{4*BCBUF(R9){R9{{GET BFBLK PTR ! 18063: {{PSC{R9{R8{{PREPARE TO PAD ! 18064: {{ZER{R7{{{CLEAR WB ! 18065: {{LCT{R6{R6{{LOAD LOOP COUNT ! 18066: * ! 18067: * LOOP HERE TO STUFF PAD CHARACTERS ! 18068: * ! 18069: {INS03{SCH{R7{(R9)+{{STUFF ZERO PAD ! 18070: {{BCT{R6{INS03{{BRANCH FOR MORE ! 18071: {{EJC{{{{ ! 18072: * ! 18073: * INSBF (CONTINUED) ! 18074: * ! 18075: * MERGE HERE WHEN PADDING OK. NOW COPY IN THE INSERT ! 18076: * STRING TO THE HOLE. ! 18077: * ! 18078: {INS04{MOV{(SP){R9{{GET BCBLK PTR ! 18079: {{MOV{4*BCBUF(R9){R9{{GET BFBLK PTR ! 18080: {{MOV{4*SCLEN(R10){R6{{GET MOVE LENGTH ! 18081: {{PLC{R10{{{PREPARE TO COPY FROM FIRST CHAR ! 18082: {{PSC{R9{INSSA{{PREPARE TO STORE IN HOLE ! 18083: {{MVC{{{{COPY THE CHARACTERS ! 18084: {{MOV{(SP)+{R9{{RESTORE ENTRY XR ! 18085: {{MOV{(SP)+{R10{{RESTORE ENTRY XL ! 18086: {{MOV{INSSA{R6{{RESTORE ENTRY WA ! 18087: {{MOV{INSSB{R7{{RESTORE ENTRY WB ! 18088: {{MOV{INSSC{R8{{RESTORE ENTRY WC ! 18089: {{EXI{{{{RETURN TO CALLER ! 18090: * ! 18091: * HERE TO TAKE STRING CONVERT ERROR EXIT ! 18092: * ! 18093: {INS05{MOV{(SP)+{R9{{RESTORE ENTRY XR ! 18094: {{MOV{(SP)+{R10{{RESTORE ENTRY XL ! 18095: {{MOV{INSSA{R6{{RESTORE ENTRY WA ! 18096: {{MOV{INSSB{R7{{RESTORE ENTRY WB ! 18097: {{MOV{INSSC{R8{{RESTORE ENTRY WC ! 18098: {{EXI{1{{{ALTERNATE EXIT ! 18099: * ! 18100: * HERE FOR INVALID OFFSET OR LENGTH ! 18101: * ! 18102: {INS06{MOV{(SP)+{R9{{RESTORE ENTRY XR ! 18103: {{MOV{(SP)+{R10{{RESTORE ENTRY XL ! 18104: * ! 18105: * MERGE FOR LENGTH FAILURE EXIT WITH STACK SET ! 18106: * ! 18107: {INS07{MOV{INSSA{R6{{RESTORE ENTRY WA ! 18108: {{MOV{INSSB{R7{{RESTORE ENTRY WB ! 18109: {{MOV{INSSC{R8{{RESTORE ENTRY WC ! 18110: {{EXI{2{{{ALTERNATE EXIT ! 18111: {{ENP{{{{END PROCEDURE INSBF ! 18112: {{EJC{{{{ ! 18113: * ! 18114: * IOFCB -- GET INPUT/OUTPUT FCBLK POINTER ! 18115: * ! 18116: * USED BY ENDFILE, EJECT AND REWIND TO FIND THE FCBLK ! 18117: * (IF ANY) CORRESPONDING TO THEIR ARGUMENT. ! 18118: * ! 18119: * -(XS) ARGUMENT ! 18120: * JSR IOFCB CALL TO FIND FCBLK ! 18121: * PPM LOC ARG IS AN UNSUITABLE NAME ! 18122: * PPM LOC ARG IS NULL STRING ! 18123: * (XS) POPPED ! 18124: * (XL) PTR TO FILEARG1 VRBLK ! 18125: * (XR) ARGUMENT ! 18126: * (WA) FCBLK PTR OR 0 ! 18127: * (WB) DESTROYED ! 18128: * ! 18129: {IOFCB{PRC{N{2{{ENTRY POINT ! 18130: {{JSR{GTSTG{{{GET ARG AS STRING ! 18131: {{PPM{IOFC2{{{FAIL ! 18132: {{MOV{R9{R10{{COPY STRING PTR ! 18133: {{JSR{GTNVR{{{GET AS NATURAL VARIABLE ! 18134: {{PPM{IOFC3{{{FAIL IF NULL ! 18135: {{MOV{R10{R7{{COPY STRING POINTER AGAIN ! 18136: {{MOV{R9{R10{{COPY VRBLK PTR FOR RETURN ! 18137: {{ZER{R6{{{IN CASE NO TRBLK FOUND ! 18138: * ! 18139: * LOOP TO FIND FILE ARG1 TRBLK ! 18140: * ! 18141: {IOFC1{MOV{4*VRVAL(R9){R9{{GET POSSIBLE TRBLK PTR ! 18142: {{BNE{(R9){#B$TRT{IOFC2{FAIL IF END OF CHAIN ! 18143: {{BNE{4*TRTYP(R9){#TRTFC{IOFC1{LOOP IF NOT FILE ARG TRBLK ! 18144: {{MOV{4*TRFPT(R9){R6{{GET FCBLK PTR ! 18145: {{MOV{R7{R9{{COPY ARG ! 18146: {{EXI{{{{RETURN ! 18147: * ! 18148: * FAIL RETURN ! 18149: * ! 18150: {IOFC2{EXI{1{{{FAIL ! 18151: * ! 18152: * NULL ARG ! 18153: * ! 18154: {IOFC3{EXI{2{{{NULL ARG RETURN ! 18155: {{ENP{{{{END PROCEDURE IOFCB ! 18156: {{EJC{{{{ ! 18157: * ! 18158: * IOPPF -- PROCESS FILEARG2 FOR IOPUT ! 18159: * ! 18160: * (R$XSC) FILEARG2 PTR ! 18161: * JSR IOPPF CALL TO PROCESS FILEARG2 ! 18162: * (XL) FILEARG1 PTR ! 18163: * (XR) FILE ARG2 PTR ! 18164: * -(XS)..-(XS) FIELDS EXTRACTED FROM FILEARG2 ! 18165: * (WC) NO. OF FIELDS EXTRACTED ! 18166: * (WB) INPUT/OUTPUT FLAG ! 18167: * (WA) FCBLK PTR OR 0 ! 18168: * ! 18169: {IOPPF{PRC{N{0{{ENTRY POINT ! 18170: {{ZER{R7{{{TO COUNT FIELDS EXTRACTED ! 18171: * ! 18172: * LOOP TO EXTRACT FIELDS ! 18173: * ! 18174: {IOPP1{MOV{#IODEL{R10{{GET DELIMITER ! 18175: {{MOV{R10{R8{{COPY IT ! 18176: {{JSR{XSCAN{{{GET NEXT FIELD ! 18177: {{MOV{R9{-(SP){{STACK IT ! 18178: {{ICV{R7{{{INCREMENT COUNT ! 18179: {{BNZ{R6{IOPP1{{LOOP ! 18180: {{MOV{R7{R8{{COUNT OF FIELDS ! 18181: {{MOV{IOPTT{R7{{I/O MARKER ! 18182: {{MOV{R$IOF{R6{{FCBLK PTR OR 0 ! 18183: {{MOV{R$IO2{R9{{FILE ARG2 PTR ! 18184: {{MOV{R$IO1{R10{{FILEARG1 ! 18185: {{EXI{{{{RETURN ! 18186: {{ENP{{{{END PROCEDURE IOPPF ! 18187: {{EJC{{{{ ! 18188: * ! 18189: * IOPUT -- ROUTINE USED BY INPUT AND OUTPUT ! 18190: * ! 18191: * IOPUT SETS UP INPUT/OUTPUT ASSOCIATIONS. IT BUILDS ! 18192: * SUCH TRACE AND FILE CONTROL BLOCKS AS ARE NECESSARY AND ! 18193: * CALLS SYSFC,SYSIO TO PERFORM CHECKS ON THE ! 18194: * ARGUMENTS AND TO OPEN THE FILES. ! 18195: * ! 18196: * +-----------+ +---------------+ +-----------+ ! 18197: * +-.I I I I------.I =B$XRT I ! 18198: * I +-----------+ +---------------+ +-----------+ ! 18199: * I / / (R$FCB) I *4 I ! 18200: * I / / +-----------+ ! 18201: * I +-----------+ +---------------+ I I- ! 18202: * I I NAME +--.I =B$TRT I +-----------+ ! 18203: * I / / +---------------+ I I ! 18204: * I (FIRST ARG) I =TRTIN/=TRTOU I +-----------+ ! 18205: * I +---------------+ I ! 18206: * I I VALUE I I ! 18207: * I +---------------+ I ! 18208: * I I(TRTRF) 0 OR I--+ I ! 18209: * I +---------------+ I I ! 18210: * I I(TRFPT) 0 OR I----+ I ! 18211: * I +---------------+ I I I ! 18212: * I (I/O TRBLK) I I I ! 18213: * I +-----------+ I I I ! 18214: * I I I I I I ! 18215: * I +-----------+ I I I ! 18216: * I I I I I I ! 18217: * I +-----------+ +---------------+ I I I ! 18218: * I I +--.I =B$TRT I.-+ I I ! 18219: * I +-----------+ +---------------+ I I ! 18220: * I / / I =TRTFC I I I ! 18221: * I / / +---------------+ I I ! 18222: * I (FILEARG1 I VALUE I I I ! 18223: * I VRBLK) +---------------+ I I ! 18224: * I I(TRTRF) 0 OR I--+ I . ! 18225: * I +---------------+ I . +-----------+ ! 18226: * I I(TRFPT) 0 OR I------./ FCBLK / ! 18227: * I +---------------+ I +-----------+ ! 18228: * I (TRTRF) I ! 18229: * I I ! 18230: * I I ! 18231: * I +---------------+ I ! 18232: * I I =B$XRT I.-+ ! 18233: * I +---------------+ ! 18234: * I I *5 I ! 18235: * I +---------------+ ! 18236: * +------------------I I ! 18237: * +---------------+ +-----------+ ! 18238: * I(TRTRF) O OR I------.I =B$XRT I ! 18239: * +---------------+ +-----------+ ! 18240: * I NAME OFFSET I I ETC I ! 18241: * +---------------+ ! 18242: * (IOCHN - CHAIN OF NAME POINTERS) ! 18243: {{EJC{{{{ ! 18244: * ! 18245: * IOPUT (CONTINUED) ! 18246: * ! 18247: * NO ADDITIONAL TRAP BLOCKS ARE USED FOR STANDARD INPUT/OUT ! 18248: * FILES. OTHERWISE AN I/O TRAP BLOCK IS ATTACHED TO SECOND ! 18249: * ARG (FILEARG1) VRBLK. SEE DIAGRAM ABOVE FOR DETAILS OF ! 18250: * THE STRUCTURE BUILT. ! 18251: * ! 18252: * -(XS) 1ST ARG (VBL TO BE ASSOCIATED) ! 18253: * -(XS) 2ND ARG (FILE ARG1) ! 18254: * -(XS) 3RD ARG (FILE ARG2) ! 18255: * (WB) 0 FOR INPUT, 3 FOR OUTPUT ASSOC. ! 18256: * JSR IOPUT CALL FOR INPUT/OUTPUT ASSOCIATION ! 18257: * PPM LOC 3RD ARG NOT A STRING ! 18258: * PPM LOC 2ND ARG NOT A SUITABLE NAME ! 18259: * PPM LOC 1ST ARG NOT A SUITABLE NAME ! 18260: * PPM LOC INAPPROPRIATE FILE SPEC FOR I/O ! 18261: * PPM LOC I/O FILE DOES NOT EXIST ! 18262: * PPM LOC I/O FILE CANNOT BE READ/WRITTEN ! 18263: * (XS) POPPED ! 18264: * (XL,XR,WA,WB,WC) DESTROYED ! 18265: * ! 18266: {IOPUT{PRC{N{6{{ENTRY POINT ! 18267: {{ZER{R$IOT{{{IN CASE NO TRTRF BLOCK USED ! 18268: {{ZER{R$IOF{{{IN CASE NO FCBLK ALOCATED ! 18269: {{MOV{R7{IOPTT{{STORE I/O TRACE TYPE ! 18270: {{JSR{XSCNI{{{PREPARE TO SCAN FILEARG2 ! 18271: {{PPM{IOP13{{{FAIL ! 18272: {{PPM{IOPA0{{{NULL FILE ARG2 ! 18273: * ! 18274: {IOPA0{MOV{R9{R$IO2{{KEEP FILE ARG2 ! 18275: {{MOV{R6{R10{{COPY LENGTH ! 18276: {{JSR{GTSTG{{{CONVERT FILEARG1 TO STRING ! 18277: {{PPM{IOP14{{{FAIL ! 18278: {{MOV{R9{R$IO1{{KEEP FILEARG1 PTR ! 18279: {{JSR{GTNVR{{{CONVERT TO NATURAL VARIABLE ! 18280: {{PPM{IOP00{{{JUMP IF NULL ! 18281: {{BRN{IOP04{{{JUMP TO PROCESS NON-NULL ARGS ! 18282: * ! 18283: * NULL FILEARG1 ! 18284: * ! 18285: {IOP00{BZE{R10{IOP01{{SKIP IF BOTH ARGS NULL ! 18286: {{JSR{IOPPF{{{PROCESS FILEARG2 ! 18287: {{JSR{SYSFC{{{CALL FOR FILEARG2 CHECK ! 18288: {{PPM{IOP16{{{FAIL ! 18289: {{BRN{IOP11{{{COMPLETE FILE ASSOCIATION ! 18290: {{EJC{{{{ ! 18291: * ! 18292: * IOPUT (CONTINUED) ! 18293: * ! 18294: * HERE WITH 0 OR FCBLK PTR IN (XL) ! 18295: * ! 18296: {IOP01{MOV{IOPTT{R7{{GET TRACE TYPE ! 18297: {{MOV{R$IOT{R9{{GET 0 OR TRTRF PTR ! 18298: {{JSR{TRBLD{{{BUILD TRBLK ! 18299: {{MOV{R9{R8{{COPY TRBLK POINTER ! 18300: {{MOV{(SP)+{R9{{GET VARIABLE FROM STACK ! 18301: {{JSR{GTVAR{{{POINT TO VARIABLE ! 18302: {{PPM{IOP15{{{FAIL ! 18303: {{MOV{R10{R$ION{{SAVE NAME POINTER ! 18304: {{MOV{R10{R9{{COPY NAME POINTER ! 18305: {{ADD{R6{R9{{POINT TO VARIABLE ! 18306: {{SUB{#4*VRVAL{R9{{SUBTRACT OFFSET,MERGE INTO LOOP ! 18307: * ! 18308: * LOOP TO END OF TRBLK CHAIN IF ANY ! 18309: * ! 18310: {IOP02{MOV{R9{R10{{COPY BLK PTR ! 18311: {{MOV{4*VRVAL(R9){R9{{LOAD PTR TO NEXT TRBLK ! 18312: {{BNE{(R9){#B$TRT{IOP03{JUMP IF NOT TRAPPED ! 18313: {{BNE{4*TRTYP(R9){IOPTT{IOP02{LOOP IF NOT SAME ASSOCN ! 18314: {{MOV{4*TRNXT(R9){R9{{GET VALUE AND DELETE OLD TRBLK ! 18315: * ! 18316: * IOPUT (CONTINUED) ! 18317: * ! 18318: * STORE NEW ASSOCIATION ! 18319: * ! 18320: {IOP03{MOV{R8{4*VRVAL(R10){{LINK TO THIS TRBLK ! 18321: {{MOV{R8{R10{{COPY POINTER ! 18322: {{MOV{R9{4*TRNXT(R10){{STORE VALUE IN TRBLK ! 18323: {{MOV{R$ION{R9{{RESTORE POSSIBLE VRBLK POINTER ! 18324: {{MOV{R6{R7{{KEEP OFFSET TO NAME ! 18325: {{JSR{SETVR{{{IF VRBLK, SET VRGET,VRSTO ! 18326: {{MOV{R$IOT{R9{{GET 0 OR TRTRF PTR ! 18327: {{BNZ{R9{IOP19{{JUMP IF TRTRF BLOCK EXISTS ! 18328: {{EXI{{{{RETURN TO CALLER ! 18329: * ! 18330: * NON STANDARD FILE ! 18331: * SEE IF AN FCBLK HAS ALREADY BEEN ALLOCATED. ! 18332: * ! 18333: {IOP04{ZER{R6{{{IN CASE NO FCBLK FOUND ! 18334: {{EJC{{{{ ! 18335: * ! 18336: * IOPUT (CONTINUED) ! 18337: * ! 18338: * SEARCH POSSIBLE TRBLK CHAIN TO PICK UP THE FCBLK ! 18339: * ! 18340: {IOP05{MOV{R9{R7{{REMEMBER BLK PTR ! 18341: {{MOV{4*VRVAL(R9){R9{{CHAIN ALONG ! 18342: {{BNE{(R9){#B$TRT{IOP06{JUMP IF END OF TRBLK CHAIN ! 18343: {{BNE{4*TRTYP(R9){#TRTFC{IOP05{LOOP IF MORE TO GO ! 18344: {{MOV{R9{R$IOT{{POINT TO FILE ARG1 TRBLK ! 18345: {{MOV{4*TRFPT(R9){R6{{GET FCBLK PTR FROM TRBLK ! 18346: * ! 18347: * WA = 0 OR FCBLK PTR ! 18348: * WB = PTR TO PRECEDING BLK TO WHICH ANY TRTRF BLOCK ! 18349: * FOR FILE ARG1 MUST BE CHAINED. ! 18350: * ! 18351: {IOP06{MOV{R6{R$IOF{{KEEP POSSIBLE FCBLK PTR ! 18352: {{MOV{R7{R$IOP{{KEEP PRECEDING BLK PTR ! 18353: {{JSR{IOPPF{{{PROCESS FILEARG2 ! 18354: {{JSR{SYSFC{{{SEE IF FCBLK REQUIRED ! 18355: {{PPM{IOP16{{{FAIL ! 18356: {{BZE{R6{IOP12{{SKIP IF NO NEW FCBLK WANTED ! 18357: {{BLT{R8{#NUM02{IOP6A{JUMP IF FCBLK IN DYNAMIC ! 18358: {{JSR{ALOST{{{GET IT IN STATIC ! 18359: {{BRN{IOP6B{{{SKIP ! 18360: * ! 18361: * OBTAIN FCBLK IN DYNAMIC ! 18362: * ! 18363: {IOP6A{JSR{ALLOC{{{GET SPACE FOR FCBLK ! 18364: * ! 18365: * MERGE ! 18366: * ! 18367: {IOP6B{MOV{R9{R10{{POINT TO FCBLK ! 18368: {{MOV{R6{R7{{COPY ITS LENGTH ! 18369: {{BTW{R7{{{GET COUNT AS WORDS (SGD APR80) ! 18370: {{LCT{R7{R7{{LOOP COUNTER ! 18371: * ! 18372: * CLEAR FCBLK ! 18373: * ! 18374: {IOP07{ZER{(R9)+{{{CLEAR A WORD ! 18375: {{BCT{R7{IOP07{{LOOP ! 18376: {{BEQ{R8{#NUM02{IOP09{SKIP IF IN STATIC - DONT SET FIELDS ! 18377: {{MOV{#B$XNT{(R10){{STORE XNBLK CODE IN CASE ! 18378: {{MOV{R6{4*1(R10){{STORE LENGTH ! 18379: {{BNZ{R8{IOP09{{JUMP IF XNBLK WANTED ! 18380: {{MOV{#B$XRT{(R10){{XRBLK CODE REQUESTED ! 18381: * ! 18382: {{EJC{{{{ ! 18383: * IOPUT (CONTINUED) ! 18384: * ! 18385: * COMPLETE FCBLK INITIALISATION ! 18386: * ! 18387: {IOP09{MOV{R$IOT{R9{{GET POSSIBLE TRBLK PTR ! 18388: {{MOV{R10{R$IOF{{STORE FCBLK PTR ! 18389: {{BNZ{R9{IOP10{{JUMP IF TRBLK ALREADY FOUND ! 18390: * ! 18391: * A NEW TRBLK IS NEEDED ! 18392: * ! 18393: {{MOV{#TRTFC{R7{{TRTYP FOR FCBLK TRAP BLK ! 18394: {{JSR{TRBLD{{{MAKE THE BLOCK ! 18395: {{MOV{R9{R$IOT{{COPY TRTRF PTR ! 18396: {{MOV{R$IOP{R10{{POINT TO PRECEDING BLK ! 18397: {{MOV{4*VRVAL(R10){4*VRVAL(R9){{COPY VALUE FIELD TO TRBLK ! 18398: {{MOV{R9{4*VRVAL(R10){{LINK NEW TRBLK INTO CHAIN ! 18399: {{MOV{R10{R9{{POINT TO PREDECESSOR BLK ! 18400: {{JSR{SETVR{{{SET TRACE INTERCEPTS ! 18401: {{MOV{4*VRVAL(R9){R9{{RECOVER TRBLK PTR ! 18402: * ! 18403: * XR IS PTR TO TRBLK, XL IS FCBLK PTR OR 0 ! 18404: * ! 18405: {IOP10{MOV{R$IOF{4*TRFPT(R9){{STORE FCBLK PTR ! 18406: * ! 18407: * CALL SYSIO TO COMPLETE FILE ACCESSING ! 18408: * ! 18409: {IOP11{MOV{R$IOF{R6{{COPY FCBLK PTR OR 0 ! 18410: {{MOV{IOPTT{R7{{GET INPUT/OUTPUT FLAG ! 18411: {{MOV{R$IO2{R9{{GET FILE ARG2 ! 18412: {{MOV{R$IO1{R10{{GET FILE ARG1 ! 18413: {{JSR{SYSIO{{{ASSOCIATE TO THE FILE ! 18414: {{PPM{IOP17{{{FAIL ! 18415: {{PPM{IOP18{{{FAIL ! 18416: {{BNZ{R$IOT{IOP01{{NOT STD INPUT IF NON-NULL TRTRF BLK ! 18417: {{BNZ{IOPTT{IOP01{{JUMP IF OUTPUT ! 18418: {{BZE{R8{IOP01{{NO CHANGE TO STANDARD READ LENGTH ! 18419: {{MOV{R8{CSWIN{{STORE NEW READ LENGTH FOR STD FILE ! 18420: {{BRN{IOP01{{{MERGE TO FINISH THE TASK ! 18421: * ! 18422: * SYSFC MAY HAVE RETURNED A POINTER TO A PRIVATE FCBLK ! 18423: * ! 18424: {IOP12{BNZ{R10{IOP09{{JUMP IF PRIVATE FCBLK ! 18425: {{BRN{IOP11{{{FINISH THE ASSOCIATION ! 18426: * ! 18427: * FAILURE RETURNS ! 18428: * ! 18429: {IOP13{EXI{1{{{3RD ARG NOT A STRING ! 18430: {IOP14{EXI{2{{{2ND ARG UNSUITABLE ! 18431: {IOP15{EXI{3{{{1ST ARG UNSUITABLE ! 18432: {IOP16{EXI{4{{{FILE SPEC WRONG ! 18433: {IOP17{EXI{5{{{I/O FILE DOES NOT EXIST ! 18434: {IOP18{EXI{6{{{I/O FILE CANNOT BE READ/WRITTEN ! 18435: {{EJC{{{{ ! 18436: * ! 18437: * IOPUT (CONTINUED) ! 18438: * ! 18439: * ADD TO IOCHN CHAIN OF ASSSOCIATED VARIABLES UNLESS ALREAD ! 18440: * PRESENT. ! 18441: * ! 18442: {IOP19{MOV{R$ION{R8{{WC = NAME BASE, WB = NAME OFFSET ! 18443: * ! 18444: * SEARCH LOOP ! 18445: * ! 18446: {IOP20{MOV{4*TRTRF(R9){R9{{NEXT LINK OF CHAIN ! 18447: {{BZE{R9{IOP21{{NOT FOUND ! 18448: {{BNE{R8{4*IONMB(R9){IOP20{NO MATCH ! 18449: {{BEQ{R7{4*IONMO(R9){IOP22{EXIT IF MATCHED ! 18450: {{BRN{IOP20{{{LOOP ! 18451: * ! 18452: * NOT FOUND ! 18453: * ! 18454: {IOP21{MOV{#4*NUM05{R6{{SPACE NEEDED ! 18455: {{JSR{ALLOC{{{GET IT ! 18456: {{MOV{#B$XRT{(R9){{STORE XRBLK CODE ! 18457: {{MOV{R6{4*1(R9){{STORE LENGTH ! 18458: {{MOV{R8{4*IONMB(R9){{STORE NAME BASE ! 18459: {{MOV{R7{4*IONMO(R9){{STORE NAME OFFSET ! 18460: {{MOV{R$IOT{R10{{POINT TO TRTRF BLK ! 18461: {{MOV{4*TRTRF(R10){R6{{GET PTR FIELD CONTENTS ! 18462: {{MOV{R9{4*TRTRF(R10){{STORE PTR TO NEW BLOCK ! 18463: {{MOV{R6{4*TRTRF(R9){{COMPLETE THE LINKING ! 18464: * ! 18465: * INSERT FCBLK ON FCBLK CHAIN FOR SYSEJ, SYSXI ! 18466: * ! 18467: {IOP22{BZE{R$IOF{IOP25{{SKIP IF NO FCBLK ! 18468: {{MOV{R$FCB{R10{{PTR TO HEAD OF EXISTING CHAIN ! 18469: * ! 18470: * SEE IF FCBLK ALREADY ON CHAIN ! 18471: * ! 18472: {IOP23{BZE{R10{IOP24{{NOT ON IF END OF CHAIN ! 18473: {{BEQ{4*3(R10){R$IOF{IOP25{DONT DUPLICATE IF FIND IT ! 18474: {{MOV{4*2(R10){R10{{GET NEXT LINK ! 18475: {{BRN{IOP23{{{LOOP ! 18476: * ! 18477: * NOT FOUND SO ADD AN ENTRY FOR THIS FCBLK ! 18478: * ! 18479: {IOP24{MOV{#4*NUM04{R6{{SPACE NEEDED ! 18480: {{JSR{ALLOC{{{GET IT ! 18481: {{MOV{#B$XRT{(R9){{STORE BLOCK CODE ! 18482: {{MOV{R6{4*1(R9){{STORE LENGTH ! 18483: {{MOV{R$FCB{4*2(R9){{STORE PREVIOUS LINK IN THIS NODE ! 18484: {{MOV{R$IOF{4*3(R9){{STORE FCBLK PTR ! 18485: {{MOV{R9{R$FCB{{INSERT NODE INTO FCBLK CHAIN ! 18486: * ! 18487: * RETURN ! 18488: * ! 18489: {IOP25{EXI{{{{RETURN TO CALLER ! 18490: {{ENP{{{{END PROCEDURE IOPUT ! 18491: {{EJC{{{{ ! 18492: * ! 18493: * KTREX -- EXECUTE KEYWORD TRACE ! 18494: * ! 18495: * KTREX IS USED TO EXECUTE A POSSIBLE KEYWORD TRACE. IT ! 18496: * INCLUDES THE TEST ON TRACE AND TESTS FOR TRACE ACTIVE. ! 18497: * ! 18498: * (XL) PTR TO TRBLK (OR 0 IF UNTRACED) ! 18499: * JSR KTREX CALL TO EXECUTE KEYWORD TRACE ! 18500: * (XL,WA,WB,WC) DESTROYED ! 18501: * (RA) DESTROYED ! 18502: * ! 18503: {KTREX{PRC{R{0{{ENTRY POINT (RECURSIVE) ! 18504: {{BZE{R10{KTRX3{{IMMEDIATE EXIT IF KEYWORD UNTRACED ! 18505: {{BZE{KVTRA{KTRX3{{IMMEDIATE EXIT IF TRACE = 0 ! 18506: {{DCV{KVTRA{{{ELSE DECREMENT TRACE ! 18507: {{MOV{R9{-(SP){{SAVE XR ! 18508: {{MOV{R10{R9{{COPY TRBLK POINTER ! 18509: {{MOV{4*TRKVR(R9){R10{{LOAD VRBLK POINTER (NMBAS) ! 18510: {{MOV{#4*VRVAL{R6{{SET NAME OFFSET ! 18511: {{BZE{4*TRFNC(R9){KTRX1{{JUMP IF PRINT TRACE ! 18512: {{JSR{TRXEQ{{{ELSE EXECUTE FULL TRACE ! 18513: {{BRN{KTRX2{{{AND JUMP TO EXIT ! 18514: * ! 18515: * HERE FOR PRINT TRACE ! 18516: * ! 18517: {KTRX1{MOV{R10{-(SP){{STACK VRBLK PTR FOR KWNAM ! 18518: {{MOV{R6{-(SP){{STACK OFFSET FOR KWNAM ! 18519: {{JSR{PRTSN{{{PRINT STATEMENT NUMBER ! 18520: {{MOV{#CH$AM{R6{{LOAD AMPERSAND ! 18521: {{JSR{PRTCH{{{PRINT AMPERSAND ! 18522: {{JSR{PRTNM{{{PRINT KEYWORD NAME ! 18523: {{MOV{#TMBEB{R9{{POINT TO BLANK-EQUAL-BLANK ! 18524: {{JSR{PRTST{{{PRINT BLANK-EQUAL-BLANK ! 18525: {{JSR{KWNAM{{{GET KEYWORD PSEUDO-VARIABLE NAME ! 18526: {{MOV{R9{DNAMP{{RESET PTR TO DELETE KVBLK ! 18527: {{JSR{ACESS{{{GET KEYWORD VALUE ! 18528: {{PPM{{{{FAILURE IS IMPOSSIBLE ! 18529: {{JSR{PRTVL{{{PRINT KEYWORD VALUE ! 18530: {{JSR{PRTNL{{{TERMINATE PRINT LINE ! 18531: * ! 18532: * HERE TO EXIT AFTER COMPLETING TRACE ! 18533: * ! 18534: {KTRX2{MOV{(SP)+{R9{{RESTORE ENTRY XR ! 18535: * ! 18536: * MERGE HERE TO EXIT IF NO TRACE REQUIRED ! 18537: * ! 18538: {KTRX3{EXI{{{{RETURN TO KTREX CALLER ! 18539: {{ENP{{{{END PROCEDURE KTREX ! 18540: {{EJC{{{{ ! 18541: * ! 18542: * KWNAM -- GET PSEUDO-VARIABLE NAME FOR KEYWORD ! 18543: * ! 18544: * 1(XS) NAME BASE FOR VRBLK ! 18545: * 0(XS) OFFSET (SHOULD BE *VRVAL) ! 18546: * JSR KWNAM CALL TO GET PSEUDO-VARIABLE NAME ! 18547: * (XS) POPPED TWICE ! 18548: * (XL,WA) RESULTING PSEUDO-VARIABLE NAME ! 18549: * (XR,WA,WB) DESTROYED ! 18550: * ! 18551: {KWNAM{PRC{N{0{{ENTRY POINT ! 18552: {{ICA{SP{{{IGNORE NAME OFFSET ! 18553: {{MOV{(SP)+{R9{{LOAD NAME BASE ! 18554: {{BGE{R9{STATE{KWNM1{JUMP IF NOT NATURAL VARIABLE NAME ! 18555: {{BNZ{4*VRLEN(R9){KWNM1{{ERROR IF NOT SYSTEM VARIABLE ! 18556: {{MOV{4*VRSVP(R9){R9{{ELSE POINT TO SVBLK ! 18557: {{MOV{4*SVBIT(R9){R6{{LOAD BIT MASK ! 18558: {{ANB{BTKNM{R6{{AND WITH KEYWORD BIT ! 18559: {{ZRB{R6{KWNM1{{ERROR IF NO KEYWORD ASSOCIATION ! 18560: {{MOV{4*SVLEN(R9){R6{{ELSE LOAD NAME LENGTH IN CHARACTERS ! 18561: {{CTB{R6{SVCHS{{COMPUTE OFFSET TO FIELD WE WANT ! 18562: {{ADD{R6{R9{{POINT TO SVKNM FIELD ! 18563: {{MOV{(R9){R7{{LOAD SVKNM VALUE ! 18564: {{MOV{#4*KVSI${R6{{SET SIZE OF KVBLK ! 18565: {{JSR{ALLOC{{{ALLOCATE KVBLK ! 18566: {{MOV{#B$KVT{(R9){{STORE TYPE WORD ! 18567: {{MOV{R7{4*KVNUM(R9){{STORE KEYWORD NUMBER ! 18568: {{MOV{#TRBKV{4*KVVAR(R9){{SET DUMMY TRBLK POINTER ! 18569: {{MOV{R9{R10{{COPY KVBLK POINTER ! 18570: {{MOV{#4*KVVAR{R6{{SET PROPER OFFSET ! 18571: {{EXI{{{{RETURN TO KVNAM CALLER ! 18572: * ! 18573: * HERE IF NOT KEYWORD NAME ! 18574: * ! 18575: {KWNM1{ERB{251{KEYWORD{{OPERAND IS NOT NAME OF DEFINED KEYWORD ! 18576: {{ENP{{{{END PROCEDURE KWNAM ! 18577: {{EJC{{{{ ! 18578: * ! 18579: * LCOMP-- COMPARE TWO STRINGS LEXICALLY ! 18580: * ! 18581: * 1(XS) FIRST ARGUMENT ! 18582: * 0(XS) SECOND ARGUMENT ! 18583: * JSR LCOMP CALL TO COMPARE ARUMENTS ! 18584: * PPM LOC TRANSFER LOC FOR ARG1 NOT STRING ! 18585: * PPM LOC TRANSFER LOC FOR ARG2 NOT STRING ! 18586: * PPM LOC TRANSFER LOC IF ARG1 LLT ARG2 ! 18587: * PPM LOC TRANSFER LOC IF ARG1 LEQ ARG2 ! 18588: * PPM LOC TRANSFER LOC IF ARG1 LGT ARG2 ! 18589: * (THE NORMAL RETURN IS NEVER TAKEN) ! 18590: * (XS) POPPED TWICE ! 18591: * (XR,XL) DESTROYED ! 18592: * (WA,WB,WC,RA) DESTROYED ! 18593: * ! 18594: {LCOMP{PRC{N{5{{ENTRY POINT ! 18595: {{JSR{GTSTG{{{CONVERT SECOND ARG TO STRING ! 18596: {{PPM{LCMP6{{{JUMP IF SECOND ARG NOT STRING ! 18597: {{MOV{R9{R10{{ELSE SAVE POINTER ! 18598: {{MOV{R6{R7{{AND LENGTH ! 18599: {{JSR{GTSTG{{{CONVERT FIRST ARGUMENT TO STRING ! 18600: {{PPM{LCMP5{{{JUMP IF NOT STRING ! 18601: {{MOV{R6{R8{{SAVE ARG 1 LENGTH ! 18602: {{PLC{R9{{{POINT TO CHARS OF ARG 1 ! 18603: {{PLC{R10{{{POINT TO CHARS OF ARG 2 ! 18604: {{BLO{R6{R7{LCMP1{JUMP IF ARG 1 LENGTH IS SMALLER ! 18605: {{MOV{R7{R6{{ELSE SET ARG 2 LENGTH AS SMALLER ! 18606: * ! 18607: * HERE WITH SMALLER LENGTH IN (WA) ! 18608: * ! 18609: {LCMP1{CMC{LCMP4{LCMP3{{COMPARE STRINGS, JUMP IF UNEQUAL ! 18610: {{BNE{R7{R8{LCMP2{IF EQUAL, JUMP IF LENGTHS UNEQUAL ! 18611: {{EXI{4{{{ELSE IDENTICAL STRINGS, LEQ EXIT ! 18612: {{EJC{{{{ ! 18613: * ! 18614: * LCOMP (CONTINUED) ! 18615: * ! 18616: * HERE IF INITIAL STRINGS IDENTICAL, BUT LENGTHS UNEQUAL ! 18617: * ! 18618: {LCMP2{BHI{R8{R7{LCMP4{JUMP IF ARG 1 LENGTH GT ARG 2 LENG ! 18619: * ! 18620: * HERE IF FIRST ARG LLT SECOND ARG ! 18621: * ! 18622: {LCMP3{EXI{3{{{TAKE LLT EXIT ! 18623: * ! 18624: * HERE IF FIRST ARG LGT SECOND ARG ! 18625: * ! 18626: {LCMP4{EXI{5{{{TAKE LGT EXIT ! 18627: * ! 18628: * HERE IF FIRST ARG IS NOT A STRING ! 18629: * ! 18630: {LCMP5{EXI{1{{{TAKE BAD FIRST ARG EXIT ! 18631: * ! 18632: * HERE FOR SECOND ARG NOT A STRING ! 18633: * ! 18634: {LCMP6{EXI{2{{{TAKE BAD SECOND ARG ERROR EXIT ! 18635: {{ENP{{{{END PROCEDURE LCOMP ! 18636: {{EJC{{{{ ! 18637: * ! 18638: * LISTR -- LIST SOURCE LINE ! 18639: * ! 18640: * LISTR IS USED TO LIST A SOURCE LINE DURING THE INITIAL ! 18641: * COMPILATION. IT IS CALLED FROM SCANE AND SCANL. ! 18642: * ! 18643: * JSR LISTR CALL TO LIST LINE ! 18644: * (XR,XL,WA,WB,WC) DESTROYED ! 18645: * ! 18646: * GLOBAL LOCATIONS USED BY LISTR ! 18647: * ! 18648: * ERLST IF LISTING ON ACCOUNT OF AN ERROR ! 18649: * ! 18650: * LSTLC COUNT LINES ON CURRENT PAGE ! 18651: * ! 18652: * LSTNP MAX NUMBER OF LINES/PAGE ! 18653: * ! 18654: * LSTPF SET NON-ZERO IF THE CURRENT SOURCE ! 18655: * LINE HAS BEEN LISTED, ELSE ZERO. ! 18656: * ! 18657: * LSTPG COMPILER LISTING PAGE NUMBER ! 18658: * ! 18659: * LSTSN SET IF STMNT NUM TO BE LISTED ! 18660: * ! 18661: * R$CIM POINTER TO CURRENT INPUT LINE. ! 18662: * ! 18663: * R$TTL TITLE FOR SOURCE LISTING ! 18664: * ! 18665: * R$STL PTR TO SUB-TITLE STRING ! 18666: * ! 18667: * ENTRY POINT ! 18668: * ! 18669: {LISTR{PRC{E{0{{ENTRY POINT ! 18670: {{BNZ{CNTTL{LIST5{{JUMP IF -TITLE OR -STITL ! 18671: {{BNZ{LSTPF{LIST4{{IMMEDIATE EXIT IF ALREADY LISTED ! 18672: {{BGE{LSTLC{LSTNP{LIST6{JUMP IF NO ROOM ! 18673: * ! 18674: * HERE AFTER PRINTING TITLE (IF NEEDED) ! 18675: * ! 18676: {LIST0{MOV{R$CIM{R9{{LOAD POINTER TO CURRENT IMAGE ! 18677: {{PLC{R9{{{POINT TO CHARACTERS ! 18678: {{LCH{R6{(R9){{LOAD FIRST CHARACTER ! 18679: {{MOV{LSTSN{R9{{LOAD STATEMENT NUMBER ! 18680: {{BZE{R9{LIST2{{JUMP IF NO STATEMENT NUMBER ! 18681: {{MTI{R9{{{ELSE GET STMNT NUMBER AS INTEGER ! 18682: {{BNE{STAGE{#STGIC{LIST1{SKIP IF EXECUTE TIME ! 18683: {{BEQ{R6{#CH$AS{LIST2{NO STMNT NUMBER LIST IF COMMENT ! 18684: {{BEQ{R6{#CH$MN{LIST2{NO STMNT NO. IF CONTROL CARD ! 18685: * ! 18686: * PRINT STATEMENT NUMBER ! 18687: * ! 18688: {LIST1{JSR{PRTIN{{{ELSE PRINT STATEMENT NUMBER ! 18689: {{ZER{LSTSN{{{AND CLEAR FOR NEXT TIME IN ! 18690: {{EJC{{{{ ! 18691: * ! 18692: * LISTR (CONTINUED) ! 18693: * ! 18694: * MERGE HERE AFTER PRINTING STATEMENT NUMBER (IF REQUIRED) ! 18695: * ! 18696: {LIST2{MOV{#STNPD{PROFS{{POINT PAST STATEMENT NUMBER ! 18697: {{MOV{R$CIM{R9{{LOAD POINTER TO CURRENT IMAGE ! 18698: {{JSR{PRTST{{{PRINT IT ! 18699: {{ICV{LSTLC{{{BUMP LINE COUNTER ! 18700: {{BNZ{ERLST{LIST3{{JUMP IF ERROR COPY TO INT.CH. ! 18701: {{JSR{PRTNL{{{TERMINATE LINE ! 18702: {{BZE{CSWDB{LIST3{{JUMP IF -SINGLE MODE ! 18703: {{JSR{PRTNL{{{ELSE ADD A BLANK LINE ! 18704: {{ICV{LSTLC{{{AND BUMP LINE COUNTER ! 18705: * ! 18706: * HERE AFTER PRINTING SOURCE IMAGE ! 18707: * ! 18708: {LIST3{MNZ{LSTPF{{{SET FLAG FOR LINE PRINTED ! 18709: * ! 18710: * MERGE HERE TO EXIT ! 18711: * ! 18712: {LIST4{EXI{{{{RETURN TO LISTR CALLER ! 18713: * ! 18714: * PRINT TITLE AFTER -TITLE OR -STITL CARD ! 18715: * ! 18716: {LIST5{ZER{CNTTL{{{CLEAR FLAG ! 18717: * ! 18718: * EJECT TO NEW PAGE AND LIST TITLE ! 18719: * ! 18720: {LIST6{JSR{PRTPS{{{EJECT ! 18721: {{BZE{PRICH{LIST7{{SKIP IF LISTING TO REGULAR PRINTER ! 18722: {{BEQ{R$TTL{#NULLS{LIST0{TERMINAL LISTING OMITS NULL TITLE ! 18723: * ! 18724: * LIST TITLE ! 18725: * ! 18726: {LIST7{JSR{LISTT{{{LIST TITLE ! 18727: {{BRN{LIST0{{{MERGE ! 18728: {{ENP{{{{END PROCEDURE LISTR ! 18729: {{EJC{{{{ ! 18730: * ! 18731: * LISTT -- LIST TITLE AND SUBTITLE ! 18732: * ! 18733: * USED DURING COMPILATION TO PRINT PAGE HEADING ! 18734: * ! 18735: * JSR LISTT CALL TO LIST TITLE ! 18736: * (XR,WA) DESTROYED ! 18737: * ! 18738: {LISTT{PRC{E{0{{ENTRY POINT ! 18739: {{MOV{R$TTL{R9{{POINT TO SOURCE LISTING TITLE ! 18740: {{JSR{PRTST{{{PRINT TITLE ! 18741: {{MOV{LSTPO{PROFS{{SET OFFSET ! 18742: {{MOV{#LSTMS{R9{{SET PAGE MESSAGE ! 18743: {{JSR{PRTST{{{PRINT PAGE MESSAGE ! 18744: {{ICV{LSTPG{{{BUMP PAGE NUMBER ! 18745: {{MTI{LSTPG{{{LOAD PAGE NUMBER AS INTEGER ! 18746: {{JSR{PRTIN{{{PRINT PAGE NUMBER ! 18747: {{JSR{PRTNL{{{TERMINATE TITLE LINE ! 18748: {{ADD{#NUM02{LSTLC{{COUNT TITLE LINE AND BLANK LINE ! 18749: * ! 18750: * PRINT SUB-TITLE (IF ANY) ! 18751: * ! 18752: {{MOV{R$STL{R9{{LOAD POINTER TO SUB-TITLE ! 18753: {{BZE{R9{LSTT1{{JUMP IF NO SUB-TITLE ! 18754: {{JSR{PRTST{{{ELSE PRINT SUB-TITLE ! 18755: {{JSR{PRTNL{{{TERMINATE LINE ! 18756: {{ICV{LSTLC{{{BUMP LINE COUNT ! 18757: * ! 18758: * RETURN POINT ! 18759: * ! 18760: {LSTT1{JSR{PRTNL{{{PRINT A BLANK LINE ! 18761: {{EXI{{{{RETURN TO CALLER ! 18762: {{ENP{{{{END PROCEDURE LISTT ! 18763: {{EJC{{{{ ! 18764: * ! 18765: * NEXTS -- ACQUIRE NEXT SOURCE IMAGE ! 18766: * ! 18767: * NEXTS IS USED TO ACQUIRE THE NEXT SOURCE IMAGE AT COMPILE ! 18768: * TIME. IT ASSUMES THAT A PRIOR CALL TO READR HAS INPUT ! 18769: * A LINE IMAGE (SEE PROCEDURE READR). BEFORE THE CURRENT ! 18770: * IMAGE IS FINALLY LOST IT MAY BE LISTED HERE. ! 18771: * ! 18772: * JSR NEXTS CALL TO ACQUIRE NEXT INPUT LINE ! 18773: * (XR,XL,WA,WB,WC) DESTROYED ! 18774: * ! 18775: * GLOBAL VALUES AFFECTED ! 18776: * ! 18777: * R$CNI ON INPUT, NEXT IMAGE. ON ! 18778: * EXIT RESET TO ZERO ! 18779: * ! 18780: * R$CIM ON EXIT, SET TO POINT TO IMAGE ! 18781: * ! 18782: * SCNIL INPUT IMAGE LENGTH ON EXIT ! 18783: * ! 18784: * SCNSE RESET TO ZERO ON EXIT ! 18785: * ! 18786: * LSTPF SET ON EXIT IF LINE IS LISTED ! 18787: * ! 18788: {NEXTS{PRC{E{0{{ENTRY POINT ! 18789: {{BZE{CSWLS{NXTS2{{JUMP IF -NOLIST ! 18790: {{MOV{R$CIM{R9{{POINT TO IMAGE ! 18791: {{BZE{R9{NXTS2{{JUMP IF NO IMAGE ! 18792: {{PLC{R9{{{GET CHAR PTR ! 18793: {{LCH{R6{(R9){{GET FIRST CHAR ! 18794: {{BNE{R6{#CH$MN{NXTS1{JUMP IF NOT CTRL CARD ! 18795: {{BZE{CSWPR{NXTS2{{JUMP IF -NOPRINT ! 18796: * ! 18797: * HERE TO CALL LISTER ! 18798: * ! 18799: {NXTS1{JSR{LISTR{{{LIST LINE ! 18800: * ! 18801: * HERE AFTER POSSIBLE LISTING ! 18802: * ! 18803: {NXTS2{MOV{R$CNI{R9{{POINT TO NEXT IMAGE ! 18804: {{MOV{R9{R$CIM{{SET AS NEXT IMAGE ! 18805: {{ZER{R$CNI{{{CLEAR NEXT IMAGE POINTER ! 18806: {{MOV{4*SCLEN(R9){R6{{GET INPUT IMAGE LENGTH ! 18807: {{MOV{CSWIN{R7{{GET MAX ALLOWABLE LENGTH ! 18808: {{BLO{R6{R7{NXTS3{SKIP IF NOT TOO LONG ! 18809: {{MOV{R7{R6{{ELSE TRUNCATE ! 18810: * ! 18811: * HERE WITH LENGTH IN (WA) ! 18812: * ! 18813: {NXTS3{MOV{R6{SCNIL{{USE AS RECORD LENGTH ! 18814: {{ZER{SCNSE{{{RESET SCNSE ! 18815: {{ZER{LSTPF{{{SET LINE NOT LISTED YET ! 18816: {{EXI{{{{RETURN TO NEXTS CALLER ! 18817: {{ENP{{{{END PROCEDURE NEXTS ! 18818: {{EJC{{{{ ! 18819: * ! 18820: * PATIN -- PATTERN CONSTRUCTION FOR LEN,POS,RPOS,TAB,RTAB ! 18821: * ! 18822: * THESE PATTERN TYPES ALL GENERATE A SIMILAR NODE TYPE. SO ! 18823: * THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION ! 18824: * FOR ACTUAL ENTRY POINTS FOR THESE FIVE FUNCTIONS. ! 18825: * ! 18826: * (WA) PCODE FOR EXPRESSION ARG CASE ! 18827: * (WB) PCODE FOR INTEGER ARG CASE ! 18828: * JSR PATIN CALL TO BUILD PATTERN NODE ! 18829: * PPM LOC TRANSFER LOC FOR NOT INTEGER OR EXP ! 18830: * PPM LOC TRANSFER LOC FOR INT OUT OF RANGE ! 18831: * (XR) POINTER TO CONSTRUCTED NODE ! 18832: * (XL,WA,WB,WC,IA) DESTROYED ! 18833: * ! 18834: {PATIN{PRC{N{2{{ENTRY POINT ! 18835: {{MOV{R6{R10{{PRESERVE EXPRESSION ARG PCODE ! 18836: {{JSR{GTSMI{{{TRY TO CONVERT ARG AS SMALL INTEGER ! 18837: {{PPM{PTIN2{{{JUMP IF NOT INTEGER ! 18838: {{PPM{PTIN3{{{JUMP IF OUT OF RANGE ! 18839: * ! 18840: * COMMON SUCCESSFUL EXIT POINT ! 18841: * ! 18842: {PTIN1{JSR{PBILD{{{BUILD PATTERN NODE ! 18843: {{EXI{{{{RETURN TO CALLER ! 18844: * ! 18845: * HERE IF ARGUMENT IS NOT AN INTEGER ! 18846: * ! 18847: {PTIN2{MOV{R10{R7{{COPY EXPR ARG CASE PCODE ! 18848: {{BLO{(R9){#B$E$${PTIN1{ALL OK IF EXPRESSION ARG ! 18849: {{EXI{1{{{ELSE TAKE ERROR EXIT FOR WRONG TYPE ! 18850: * ! 18851: * HERE FOR ERROR OF OUT OF RANGE INTEGER ARGUMENT ! 18852: * ! 18853: {PTIN3{EXI{2{{{TAKE OUT-OF-RANGE ERROR EXIT ! 18854: {{ENP{{{{END PROCEDURE PATIN ! 18855: {{EJC{{{{ ! 18856: * ! 18857: * PATST -- PATTERN CONSTRUCTION FOR ANY,NOTANY, ! 18858: * BREAK,SPAN AND BREAKX PATTERN FUNCTIONS. ! 18859: * ! 18860: * THESE PATTERN FUNCTIONS BUILD SIMILAR TYPES OF NODES AND ! 18861: * THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION ! 18862: * FOR ACTUAL ENTRY POINTS FOR THESE FIVE PATTERN FUNCTIONS. ! 18863: * ! 18864: * 0(XS) STRING ARGUMENT ! 18865: * (WB) PCODE FOR ONE CHAR ARGUMENT ! 18866: * (XL) PCODE FOR MULTI-CHAR ARGUMENT ! 18867: * (WC) PCODE FOR EXPRESSION ARGUMENT ! 18868: * JSR PATST CALL TO BUILD NODE ! 18869: * PPM LOC TRANSFER LOC IF NOT STRING OR EXPR ! 18870: * (XS) POPPED PAST STRING ARGUMENT ! 18871: * (XR) POINTER TO CONSTRUCTED NODE ! 18872: * (XL) DESTROYED ! 18873: * (WA,WB,WC,RA) DESTROYED ! 18874: * ! 18875: * NOTE THAT THERE IS A SPECIAL CALL TO PATST IN THE EVALS ! 18876: * PROCEDURE WITH A SLIGHTLY DIFFERENT FORM. SEE EVALS ! 18877: * FOR DETAILS OF THE FORM OF THIS CALL. ! 18878: * ! 18879: {PATST{PRC{N{1{{ENTRY POINT ! 18880: {{JSR{GTSTG{{{CONVERT ARGUMENT AS STRING ! 18881: {{PPM{PATS7{{{JUMP IF NOT STRING ! 18882: {{BNE{R6{#NUM01{PATS2{JUMP IF NOT ONE CHAR STRING ! 18883: * ! 18884: * HERE FOR ONE CHAR STRING CASE ! 18885: * ! 18886: {{BZE{R7{PATS2{{TREAT AS MULTI-CHAR IF EVALS CALL ! 18887: {{PLC{R9{{{POINT TO CHARACTER ! 18888: {{LCH{R9{(R9){{LOAD CHARACTER ! 18889: * ! 18890: * COMMON EXIT POINT AFTER SUCCESSFUL CONSTRUCTION ! 18891: * ! 18892: {PATS1{JSR{PBILD{{{CALL ROUTINE TO BUILD NODE ! 18893: {{EXI{{{{RETURN TO PATST CALLER ! 18894: {{EJC{{{{ ! 18895: * ! 18896: * PATST (CONTINUED) ! 18897: * ! 18898: * HERE FOR MULTI-CHARACTER STRING CASE ! 18899: * ! 18900: {PATS2{MOV{R10{-(SP){{SAVE MULTI-CHAR PCODE ! 18901: {{MOV{R9{-(SP){{SAVE STRING POINTER ! 18902: {{MOV{CTMSK{R8{{LOAD CURRENT MASK BIT ! 18903: {{LSH{R8{1{{SHIFT TO NEXT POSITION ! 18904: {{NZB{R8{PATS4{{SKIP IF POSITION LEFT IN THIS TBL ! 18905: * ! 18906: * HERE WE MUST ALLOCATE A NEW CHARACTER TABLE ! 18907: * ! 18908: {{MOV{#4*CTSI${R6{{SET SIZE OF CTBLK ! 18909: {{JSR{ALLOC{{{ALLOCATE CTBLK ! 18910: {{MOV{R9{R$CTP{{STORE PTR TO NEW CTBLK ! 18911: {{MOV{#B$CTT{(R9)+{{STORE TYPE CODE, BUMP PTR ! 18912: {{LCT{R7{#CFP$A{{SET NUMBER OF WORDS TO CLEAR ! 18913: {{MOV{BITS0{R8{{LOAD ALL ZERO BITS ! 18914: * ! 18915: * LOOP TO CLEAR ALL BITS IN TABLE TO ZEROS ! 18916: * ! 18917: {PATS3{MOV{R8{(R9)+{{MOVE WORD OF ZERO BITS ! 18918: {{BCT{R7{PATS3{{LOOP TILL ALL CLEARED ! 18919: {{MOV{BITS1{R8{{SET INITIAL BIT POSITION ! 18920: * ! 18921: * MERGE HERE WITH BIT POSITION AVAILABLE ! 18922: * ! 18923: {PATS4{MOV{R8{CTMSK{{SAVE PARM2 (NEW BIT POSITION) ! 18924: {{MOV{(SP)+{R10{{RESTORE POINTER TO ARGUMENT STRING ! 18925: {{MOV{4*SCLEN(R10){R7{{LOAD STRING LENGTH ! 18926: {{BZE{R7{PATS6{{JUMP IF NULL STRING CASE ! 18927: {{LCT{R7{R7{{ELSE SET LOOP COUNTER ! 18928: {{PLC{R10{{{POINT TO CHARACTERS IN ARGUMENT ! 18929: {{EJC{{{{ ! 18930: * ! 18931: * PATST (CONTINUED) ! 18932: * ! 18933: * LOOP TO SET BITS IN COLUMN OF TABLE ! 18934: * ! 18935: {PATS5{LCH{R6{(R10)+{{LOAD NEXT CHARACTER ! 18936: {{WTB{R6{{{CONVERT TO BYTE OFFSET ! 18937: {{MOV{R$CTP{R9{{POINT TO CTBLK ! 18938: {{ADD{R6{R9{{POINT TO CTBLK ENTRY ! 18939: {{MOV{R8{R6{{COPY BIT MASK ! 18940: {{ORB{4*CTCHS(R9){R6{{OR IN BITS ALREADY SET ! 18941: {{MOV{R6{4*CTCHS(R9){{STORE RESULTING BIT STRING ! 18942: {{BCT{R7{PATS5{{LOOP TILL ALL BITS SET ! 18943: * ! 18944: * COMPLETE PROCESSING FOR MUTI-CHAR STRING CASE ! 18945: * ! 18946: {PATS6{MOV{R$CTP{R9{{LOAD CTBLK PTR AS PARM1 FOR PBILD ! 18947: {{ZER{R10{{{CLEAR GARBAGE PTR IN XL ! 18948: {{MOV{(SP)+{R7{{LOAD PCODE FOR MULTI-CHAR STR CASE ! 18949: {{BRN{PATS1{{{BACK TO EXIT (WC=BITSTRING=PARM2) ! 18950: * ! 18951: * HERE IF ARGUMENT IS NOT A STRING ! 18952: * ! 18953: * NOTE THAT THE CALL FROM EVALS CANNOT PASS AN EXPRESSION ! 18954: * SINCE EVALP ALWAYS REEVALUATES EXPRESSIONS. ! 18955: * ! 18956: {PATS7{MOV{R8{R7{{SET PCODE FOR EXPRESSION ARGUMENT ! 18957: {{BLO{(R9){#B$E$${PATS1{JUMP TO EXIT IF EXPRESSION ARG ! 18958: {{EXI{1{{{ELSE TAKE WRONG TYPE ERROR EXIT ! 18959: {{ENP{{{{END PROCEDURE PATST ! 18960: {{EJC{{{{ ! 18961: * ! 18962: * PBILD -- BUILD PATTERN NODE ! 18963: * ! 18964: * (XR) PARM1 (ONLY IF REQUIRED) ! 18965: * (WB) PCODE FOR NODE ! 18966: * (WC) PARM2 (ONLY IF REQUIRED) ! 18967: * JSR PBILD CALL TO BUILD NODE ! 18968: * (XR) POINTER TO CONSTRUCTED NODE ! 18969: * (WA) DESTROYED ! 18970: * ! 18971: {PBILD{PRC{E{0{{ENTRY POINT ! 18972: {{MOV{R9{-(SP){{STACK POSSIBLE PARM1 ! 18973: {{MOV{R7{R9{{COPY PCODE ! 18974: {{LEI{R9{{{LOAD ENTRY POINT ID (BL$PX) ! 18975: {{BEQ{R9{#BL$P1{PBLD1{JUMP IF ONE PARAMETER ! 18976: {{BEQ{R9{#BL$P0{PBLD3{JUMP IF NO PARAMETERS ! 18977: * ! 18978: * HERE FOR TWO PARAMETER CASE ! 18979: * ! 18980: {{MOV{#4*PCSI${R6{{SET SIZE OF P2BLK ! 18981: {{JSR{ALLOC{{{ALLOCATE BLOCK ! 18982: {{MOV{R8{4*PARM2(R9){{STORE SECOND PARAMETER ! 18983: {{BRN{PBLD2{{{MERGE WITH ONE PARM CASE ! 18984: * ! 18985: * HERE FOR ONE PARAMETER CASE ! 18986: * ! 18987: {PBLD1{MOV{#4*PBSI${R6{{SET SIZE OF P1BLK ! 18988: {{JSR{ALLOC{{{ALLOCATE NODE ! 18989: * ! 18990: * MERGE HERE FROM TWO PARM CASE ! 18991: * ! 18992: {PBLD2{MOV{(SP){4*PARM1(R9){{STORE FIRST PARAMETER ! 18993: {{BRN{PBLD4{{{MERGE WITH NO PARAMETER CASE ! 18994: * ! 18995: * HERE FOR CASE OF NO PARAMETERS ! 18996: * ! 18997: {PBLD3{MOV{#4*PASI${R6{{SET SIZE OF P0BLK ! 18998: {{JSR{ALLOC{{{ALLOCATE NODE ! 18999: * ! 19000: * MERGE HERE FROM OTHER CASES ! 19001: * ! 19002: {PBLD4{MOV{R7{(R9){{STORE PCODE ! 19003: {{ICA{SP{{{POP FIRST PARAMETER ! 19004: {{MOV{#NDNTH{4*PTHEN(R9){{SET NOTHEN SUCCESSOR POINTER ! 19005: {{EXI{{{{RETURN TO PBILD CALLER ! 19006: {{ENP{{{{END PROCEDURE PBILD ! 19007: {{EJC{{{{ ! 19008: * ! 19009: * PCONC -- CONCATENATE TWO PATTERNS ! 19010: * ! 19011: * (XL) PTR TO RIGHT PATTERN ! 19012: * (XR) PTR TO LEFT PATTERN ! 19013: * JSR PCONC CALL TO CONCATENATE PATTERNS ! 19014: * (XR) PTR TO CONCATENATED PATTERN ! 19015: * (XL,WA,WB,WC) DESTROYED ! 19016: * ! 19017: * ! 19018: * TO CONCATENATE TWO PATTERNS, ALL SUCCESSORS IN THE LEFT ! 19019: * PATTERN WHICH POINT TO THE NOTHEN NODE MUST BE CHANGED TO ! 19020: * POINT TO THE RIGHT PATTERN. HOWEVER, THIS MODIFICATION ! 19021: * MUST BE PERFORMED ON A COPY OF THE LEFT ARGUMENT RATHER ! 19022: * THAN THE LEFT ARGUMENT ITSELF, SINCE THE LEFT ARGUMENT ! 19023: * MAY BE POINTED TO BY SOME OTHER VARIABLE VALUE. ! 19024: * ! 19025: * ACCORDINGLY, IT IS NECESSARY TO COPY THE LEFT ARGUMENT. ! 19026: * THIS IS NOT A TRIVIAL PROCESS SINCE WE MUST AVOID COPYING ! 19027: * NODES MORE THAN ONCE AND THE PATTERN IS A GRAPH STRUCTURE ! 19028: * THE FOLLOWING ALGORITHM IS EMPLOYED. ! 19029: * ! 19030: * THE STACK IS USED TO STORE A LIST OF NODES WHICH ! 19031: * HAVE ALREADY BEEN COPIED. THE FORMAT OF THE ENTRIES ON ! 19032: * THIS LIST CONSISTS OF A TWO WORD BLOCK. THE FIRST WORD ! 19033: * IS THE OLD ADDRESS AND THE SECOND WORD IS THE ADDRESS ! 19034: * OF THE COPY. THIS LIST IS SEARCHED BY THE PCOPY ! 19035: * ROUTINE TO AVOID MAKING DUPLICATE COPIES. A TRICK IS ! 19036: * USED TO ACCOMPLISH THE CONCATENATION AT THE SAME TIME. ! 19037: * A SPECIAL ENTRY IS MADE TO START WITH ON THE STACK. THIS ! 19038: * ENTRY RECORDS THAT THE NOTHEN NODE HAS BEEN COPIED ! 19039: * ALREADY AND THE ADDRESS OF ITS COPY IS THE RIGHT PATTERN. ! 19040: * THIS AUTOMATICALLY PERFORMS THE CORRECT REPLACEMENTS. ! 19041: * ! 19042: {PCONC{PRC{E{0{{ENTRY POINT ! 19043: {{ZER{-(SP){{{MAKE ROOM FOR ONE ENTRY AT BOTTOM ! 19044: {{MOV{SP{R8{{STORE POINTER TO START OF LIST ! 19045: {{MOV{#NDNTH{-(SP){{STACK NOTHEN NODE AS OLD NODE ! 19046: {{MOV{R10{-(SP){{STORE RIGHT ARG AS COPY OF NOTHEN ! 19047: {{MOV{SP{R10{{INITIALIZE POINTER TO STACK ENTRIES ! 19048: {{JSR{PCOPY{{{COPY FIRST NODE OF LEFT ARG ! 19049: {{MOV{R6{4*2(R10){{STORE AS RESULT UNDER LIST ! 19050: {{EJC{{{{ ! 19051: * ! 19052: * PCONC (CONTINUED) ! 19053: * ! 19054: * THE FOLLOWING LOOP SCANS ENTRIES IN THE LIST AND MAKES ! 19055: * SURE THAT THEIR SUCCESSORS HAVE BEEN COPIED. ! 19056: * ! 19057: {PCNC1{BEQ{R10{SP{PCNC2{JUMP IF ALL ENTRIES PROCESSED ! 19058: {{MOV{-(R10){R9{{ELSE LOAD NEXT OLD ADDRESS ! 19059: {{MOV{4*PTHEN(R9){R9{{LOAD POINTER TO SUCCESSOR ! 19060: {{JSR{PCOPY{{{COPY SUCCESSOR NODE ! 19061: {{MOV{-(R10){R9{{LOAD POINTER TO NEW NODE (COPY) ! 19062: {{MOV{R6{4*PTHEN(R9){{STORE PTR TO NEW SUCCESSOR ! 19063: * ! 19064: * NOW CHECK FOR SPECIAL CASE OF ALTERNATION NODE WHERE ! 19065: * PARM1 POINTS TO A NODE AND MUST BE COPIED LIKE PTHEN. ! 19066: * ! 19067: {{BNE{(R9){#P$ALT{PCNC1{LOOP BACK IF NOT ! 19068: {{MOV{4*PARM1(R9){R9{{ELSE LOAD POINTER TO ALTERNATIVE ! 19069: {{JSR{PCOPY{{{COPY IT ! 19070: {{MOV{(R10){R9{{RESTORE PTR TO NEW NODE ! 19071: {{MOV{R6{4*PARM1(R9){{STORE PTR TO COPIED ALTERNATIVE ! 19072: {{BRN{PCNC1{{{LOOP BACK FOR NEXT ENTRY ! 19073: * ! 19074: * HERE AT END OF COPY PROCESS ! 19075: * ! 19076: {PCNC2{MOV{R8{SP{{RESTORE STACK POINTER ! 19077: {{MOV{(SP)+{R9{{LOAD POINTER TO COPY ! 19078: {{EXI{{{{RETURN TO PCONC CALLER ! 19079: {{ENP{{{{END PROCEDURE PCONC ! 19080: {{EJC{{{{ ! 19081: * ! 19082: * PCOPY -- COPY A PATTERN NODE ! 19083: * ! 19084: * PCOPY IS CALLED FROM THE PCONC PROCEDURE TO COPY A SINGLE ! 19085: * PATTERN NODE. THE COPY IS ONLY CARRIED OUT IF THE NODE ! 19086: * HAS NOT BEEN COPIED ALREADY. ! 19087: * ! 19088: * (XR) POINTER TO NODE TO BE COPIED ! 19089: * (XT) PTR TO CURRENT LOC IN COPY LIST ! 19090: * (WC) POINTER TO LIST OF COPIED NODES ! 19091: * JSR PCOPY CALL TO COPY A NODE ! 19092: * (WA) POINTER TO COPY ! 19093: * (WB,XR) DESTROYED ! 19094: * ! 19095: {PCOPY{PRC{N{0{{ENTRY POINT ! 19096: {{MOV{R10{R7{{SAVE XT ! 19097: {{MOV{R8{R10{{POINT TO START OF LIST ! 19098: * ! 19099: * LOOP TO SEARCH LIST OF NODES COPIED ALREADY ! 19100: * ! 19101: {PCOP1{DCA{R10{{{POINT TO NEXT ENTRY ON LIST ! 19102: {{BEQ{R9{(R10){PCOP2{JUMP IF MATCH ! 19103: {{DCA{R10{{{ELSE SKIP OVER COPIED ADDRESS ! 19104: {{BNE{R10{SP{PCOP1{LOOP BACK IF MORE TO TEST ! 19105: * ! 19106: * HERE IF NOT IN LIST, PERFORM COPY ! 19107: * ! 19108: {{MOV{(R9){R6{{LOAD FIRST WORD OF BLOCK ! 19109: {{JSR{BLKLN{{{GET LENGTH OF BLOCK ! 19110: {{MOV{R9{R10{{SAVE POINTER TO OLD NODE ! 19111: {{JSR{ALLOC{{{ALLOCATE SPACE FOR COPY ! 19112: {{MOV{R10{-(SP){{STORE OLD ADDRESS ON LIST ! 19113: {{MOV{R9{-(SP){{STORE NEW ADDRESS ON LIST ! 19114: {{CHK{{{{CHECK FOR STACK OVERFLOW ! 19115: {{MVW{{{{MOVE WORDS FROM OLD BLOCK TO COPY ! 19116: {{MOV{(SP){R6{{LOAD POINTER TO COPY ! 19117: {{BRN{PCOP3{{{JUMP TO EXIT ! 19118: * ! 19119: * HERE IF WE FIND ENTRY IN LIST ! 19120: * ! 19121: {PCOP2{MOV{-(R10){R6{{LOAD ADDRESS OF COPY FROM LIST ! 19122: * ! 19123: * COMMON EXIT POINT ! 19124: * ! 19125: {PCOP3{MOV{R7{R10{{RESTORE XT ! 19126: {{EXI{{{{RETURN TO PCOPY CALLER ! 19127: {{ENP{{{{END PROCEDURE PCOPY ! 19128: {{EJC{{{{ ! 19129: * ! 19130: * PRFLR -- PRINT PROFILE ! 19131: * PRFLR IS CALLED TO PRINT THE CONTENTS OF THE PROFILE ! 19132: * TABLE IN A FAIRLY READABLE TABULAR FORMAT. ! 19133: * ! 19134: * JSR PRFLR CALL TO PRINT PROFILE ! 19135: * (WA,IA) DESTROYED ! 19136: * ! 19137: {PRFLR{PRC{E{0{{ ! 19138: {{BZE{PFDMP{PRFL4{{NO PRINTING IF NO PROFILING DONE ! 19139: {{MOV{R9{-(SP){{PRESERVE ENTRY XR ! 19140: {{MOV{R7{PFSVW{{AND ALSO WB ! 19141: {{JSR{PRTPG{{{EJECT ! 19142: {{MOV{#PFMS1{R9{{LOAD MSG /PROGRAM PROFILE/ ! 19143: {{JSR{PRTST{{{AND PRINT IT ! 19144: {{JSR{PRTNL{{{FOLLOWED BY NEWLINE ! 19145: {{JSR{PRTNL{{{AND ANOTHER ! 19146: {{MOV{#PFMS2{R9{{POINT TO FIRST HDR ! 19147: {{JSR{PRTST{{{PRINT IT ! 19148: {{JSR{PRTNL{{{NEW LINE ! 19149: {{MOV{#PFMS3{R9{{SECOND HDR ! 19150: {{JSR{PRTST{{{PRINT IT ! 19151: {{JSR{PRTNL{{{NEW LINE ! 19152: {{JSR{PRTNL{{{AND ANOTHER BLANK LINE ! 19153: {{ZER{R7{{{INITIAL STMT COUNT ! 19154: {{MOV{PFTBL{R9{{POINT TO TABLE ORIGIN ! 19155: {{ADD{#4*NUM02{R9{{BIAS PAST XNBLK HEADER (SGD07) ! 19156: * ! 19157: * LOOP HERE TO PRINT SUCCESSIVE ENTRIES ! 19158: * ! 19159: {PRFL1{ICV{R7{{{BUMP STMT NR ! 19160: {{LDI{(R9){{{LOAD NR OF EXECUTIONS ! 19161: {{IEQ{PRFL3{{{NO PRINTING IF ZERO ! 19162: {{MOV{#PFPD1{PROFS{{POINT WHERE TO PRINT ! 19163: {{JSR{PRTIN{{{AND PRINT IT ! 19164: {{ZER{PROFS{{{BACK TO START OF LINE ! 19165: {{MTI{R7{{{LOAD STMT NR ! 19166: {{JSR{PRTIN{{{PRINT IT THERE ! 19167: {{MOV{#PFPD2{PROFS{{AND PAD PAST COUNT ! 19168: {{LDI{4*CFP$I(R9){{{LOAD TOTAL EXEC TIME ! 19169: {{JSR{PRTIN{{{PRINT THAT TOO ! 19170: {{LDI{4*CFP$I(R9){{{RELOAD TIME ! 19171: {{MLI{INTTH{{{CONVERT TO MICROSEC ! 19172: {{IOV{PRFL2{{{OMIT NEXT BIT IF OVERFLOW ! 19173: {{DVI{(R9){{{DIVIDE BY EXECUTIONS ! 19174: {{MOV{#PFPD3{PROFS{{PAD LAST PRINT ! 19175: {{JSR{PRTIN{{{AND PRINT MCSEC/EXECN ! 19176: * ! 19177: * MERGE AFTER PRINTING TIME ! 19178: * ! 19179: {PRFL2{JSR{PRTNL{{{THATS ANOTHER LINE ! 19180: * ! 19181: * HERE TO GO TO NEXT ENTRY ! 19182: * ! 19183: {PRFL3{ADD{#4*PF$I2{R9{{BUMP INDEX PTR (SGD07) ! 19184: {{BLT{R7{PFNTE{PRFL1{LOOP IF MORE STMTS ! 19185: {{MOV{(SP)+{R9{{RESTORE CALLERS XR ! 19186: {{MOV{PFSVW{R7{{AND WB TOO ! 19187: * ! 19188: * HERE TO EXIT ! 19189: * ! 19190: {PRFL4{EXI{{{{RETURN ! 19191: {{ENP{{{{END OF PRFLR ! 19192: {{EJC{{{{ ! 19193: * ! 19194: * PRFLU -- UPDATE AN ENTRY IN THE PROFILE TABLE ! 19195: * ! 19196: * ON ENTRY, KVSTN CONTAINS NR OF STMT TO PROFILE ! 19197: * ! 19198: * JSR PRFLU CALL TO UPDATE ENTRY ! 19199: * (IA) DESTROYED ! 19200: * ! 19201: {PRFLU{PRC{E{0{{ ! 19202: {{BNZ{PFFNC{PFLU4{{SKIP IF JUST ENTERED FUNCTION ! 19203: {{MOV{R9{-(SP){{PRESERVE ENTRY XR ! 19204: {{MOV{R6{PFSVW{{SAVE WA (SGD07) ! 19205: {{BNZ{PFTBL{PFLU2{{BRANCH IF TABLE ALLOCATED ! 19206: * ! 19207: * HERE IF SPACE FOR PROFILE TABLE NOT YET ALLOCATED. ! 19208: * CALCULATE SIZE NEEDED, ALLOCATE A STATIC XNBLK, AND ! 19209: * INITIALIZE IT ALL TO ZERO. ! 19210: * THE TIME TAKEN FOR THIS WILL BE ATTRIBUTED TO THE CURRENT ! 19211: * STATEMENT (ASSIGNMENT TO KEYWD PROFILE), BUT SINCE THE ! 19212: * TIMING FOR THIS STATEMENT IS UP THE POLE ANYWAY, THIS ! 19213: * DOESNT REALLY MATTER... ! 19214: * ! 19215: {{SUB{#NUM01{PFNTE{{ADJUST FOR EXTRA COUNT (SGD07) ! 19216: {{MTI{PFI2A{{{CONVRT ENTRY SIZE TO INT ! 19217: {{STI{PFSTE{{{AND STORE SAFELY FOR LATER ! 19218: {{MTI{PFNTE{{{LOAD TABLE LENGTH AS INTEGER ! 19219: {{MLI{PFSTE{{{MULTIPLY BY ENTRY SIZE ! 19220: {{MFI{R6{{{GET BACK ADDRESS-STYLE ! 19221: {{ADD{#NUM02{R6{{ADD ON 2 WORD OVERHEAD ! 19222: {{WTB{R6{{{CONVERT THE WHOLE LOT TO BYTES ! 19223: {{JSR{ALOST{{{GIMME THE SPACE ! 19224: {{MOV{R9{PFTBL{{SAVE BLOCK POINTER ! 19225: {{MOV{#B$XNT{(R9)+{{PUT BLOCK TYPE AND ... ! 19226: {{MOV{R6{(R9)+{{... LENGTH INTO HEADER ! 19227: {{MFI{R6{{{GET BACK NR OF WDS IN DATA AREA ! 19228: {{LCT{R6{R6{{LOAD THE COUNTER ! 19229: * ! 19230: * LOOP HERE TO ZERO THE BLOCK DATA ! 19231: * ! 19232: {PFLU1{ZER{(R9)+{{{BLANK A WORD ! 19233: {{BCT{R6{PFLU1{{AND ALLLLLLL THE REST ! 19234: * ! 19235: * END OF ALLOCATION. MERGE BACK INTO ROUTINE ! 19236: * ! 19237: {PFLU2{MTI{KVSTN{{{LOAD NR OF STMT JUST ENDED ! 19238: {{SBI{INTV1{{{MAKE INTO INDEX OFFSET ! 19239: {{MLI{PFSTE{{{MAKE OFFSET OF TABLE ENTRY ! 19240: {{MFI{R6{{{CONVERT TO ADDRESS ! 19241: {{WTB{R6{{{GET AS BAUS ! 19242: {{ADD{#4*NUM02{R6{{OFFSET INCLUDES TABLE HEADER ! 19243: {{MOV{PFTBL{R9{{GET TABLE START ! 19244: {{BGE{R6{4*NUM01(R9){PFLU3{IF OUT OF TABLE, SKIP IT ! 19245: {{ADD{R6{R9{{ELSE POINT TO ENTRY ! 19246: {{LDI{(R9){{{GET NR OF EXECUTIONS SO FAR ! 19247: {{ADI{INTV1{{{NUDGE UP ONE ! 19248: {{STI{(R9){{{AND PUT BACK ! 19249: {{JSR{SYSTM{{{GET TIME NOW ! 19250: {{STI{PFETM{{{STASH ENDING TIME ! 19251: {{SBI{PFSTM{{{SUBTRACT START TIME ! 19252: {{ADI{4*CFP$I(R9){{{ADD CUMULATIVE TIME SO FAR ! 19253: {{STI{4*CFP$I(R9){{{AND PUT BACK NEW TOTAL ! 19254: {{LDI{PFETM{{{LOAD END TIME OF THIS STMT ... ! 19255: {{STI{PFSTM{{{... WHICH IS START TIME OF NEXT ! 19256: * ! 19257: * MERGE HERE TO EXIT ! 19258: * ! 19259: {PFLU3{MOV{(SP)+{R9{{RESTORE CALLERS XR ! 19260: {{MOV{PFSVW{R6{{RESTORE SAVED REG ! 19261: {{EXI{{{{AND RETURN ! 19262: * ! 19263: * HERE IF PROFILE IS SUPPRESSED BECAUSE A PROGRAM DEFINED ! 19264: * FUNCTION IS ABOUT TO BE ENTERED, AND SO THE CURRENT STMT ! 19265: * HAS NOT YET FINISHED ! 19266: * ! 19267: {PFLU4{ZER{PFFNC{{{RESET THE CONDITION FLAG ! 19268: {{EXI{{{{AND IMMEDIATE RETURN ! 19269: {{ENP{{{{END OF PROCEDURE PRFLU ! 19270: {{EJC{{{{ ! 19271: * ! 19272: * PRPAR - PROCESS PRINT PARAMETERS ! 19273: * ! 19274: * (WC) IF NONZERO ASSOCIATE TERMINAL ONLY ! 19275: * JSR PRPAR CALL TO PROCESS PRINT PARAMETERS ! 19276: * (XL,XR,WA,WB,WC) DESTROYED ! 19277: * ! 19278: * SINCE MEMORY ALLOCATION IS UNDECIDED ON INITIAL CALL, ! 19279: * TERMINAL CANNOT BE ASSOCIATED. THE ENTRY WITH WC NON-ZERO ! 19280: * IS PROVIDED SO A LATER CALL CAN BE MADE TO COMPLETE THIS. ! 19281: * ! 19282: {PRPAR{PRC{E{0{{ENTRY POINT ! 19283: {{BNZ{R8{PRPA7{{JUMP TO ASSOCIATE TERMINAL ! 19284: {{JSR{SYSPP{{{GET PRINT PARAMETERS ! 19285: {{BNZ{R7{PRPA1{{JUMP IF LINES/PAGE SPECIFIED ! 19286: {{MOV{#CFP$M{R7{{ELSE USE A LARGE VALUE ! 19287: {{RSH{R7{1{{BUT NOT TOO LARGE ! 19288: * ! 19289: * STORE LINE COUNT/PAGE ! 19290: * ! 19291: {PRPA1{MOV{R7{LSTNP{{STORE NUMBER OF LINES/PAGE ! 19292: {{MOV{R7{LSTLC{{PRETEND PAGE IS FULL INITIALLY ! 19293: {{ZER{LSTPG{{{CLEAR PAGE NUMBER ! 19294: {{MOV{PRLEN{R7{{GET PRIOR LENGTH IF ANY ! 19295: {{BZE{R7{PRPA2{{SKIP IF NO LENGTH ! 19296: {{BGT{R6{R7{PRPA3{SKIP STORING IF TOO BIG ! 19297: * ! 19298: * STORE PRINT BUFFER LENGTH ! 19299: * ! 19300: {PRPA2{MOV{R6{PRLEN{{STORE VALUE ! 19301: * ! 19302: * PROCESS BITS OPTIONS ! 19303: * ! 19304: {PRPA3{MOV{BITS3{R7{{BIT 3 MASK ! 19305: {{ANB{R8{R7{{GET -NOLIST BIT ! 19306: {{ZRB{R7{PRPA4{{SKIP IF CLEAR ! 19307: {{ZER{CSWLS{{{SET -NOLIST ! 19308: * ! 19309: * CHECK IF FAIL REPORTS GOTO INTERACTIVE CHANNEL ! 19310: * ! 19311: {PRPA4{MOV{BITS1{R7{{BIT 1 MASK ! 19312: {{ANB{R8{R7{{GET BIT ! 19313: {{MOV{R7{ERICH{{STORE INT. CHAN. ERROR FLAG ! 19314: {{MOV{BITS2{R7{{BIT 2 MASK ! 19315: {{ANB{R8{R7{{GET BIT ! 19316: {{MOV{R7{PRICH{{FLAG FOR STD PRINTER ON INT. CHAN. ! 19317: {{MOV{BITS4{R7{{BIT 4 MASK ! 19318: {{ANB{R8{R7{{GET BIT ! 19319: {{MOV{R7{CPSTS{{FLAG FOR COMPILE STATS SUPPRESSN. ! 19320: {{MOV{BITS5{R7{{BIT 5 MASK ! 19321: {{ANB{R8{R7{{GET BIT ! 19322: {{MOV{R7{EXSTS{{FLAG FOR EXEC STATS SUPPRESSION ! 19323: {{EJC{{{{ ! 19324: * ! 19325: * PRPAR (CONTINUED) ! 19326: * ! 19327: {{MOV{BITS6{R7{{BIT 6 MASK ! 19328: {{ANB{R8{R7{{GET BIT ! 19329: {{MOV{R7{PRECL{{EXTENDED/COMPACT LISTING FLAG ! 19330: {{SUB{#NUM08{R6{{POINT 8 CHARS FROM LINE END ! 19331: {{ZRB{R7{PRPA5{{JUMP IF NOT EXTENDED ! 19332: {{MOV{R6{LSTPO{{STORE FOR LISTING PAGE HEADINGS ! 19333: * ! 19334: * CONTINUE OPTION PROCESSING ! 19335: * ! 19336: {PRPA5{MOV{BITS7{R7{{BIT 7 MASK ! 19337: {{ANB{R8{R7{{GET BIT 7 ! 19338: {{MOV{R7{CSWEX{{SET -NOEXECUTE IF NON-ZERO ! 19339: {{MOV{BIT10{R7{{BIT 10 MASK ! 19340: {{ANB{R8{R7{{GET BIT 10 ! 19341: {{MOV{R7{HEADP{{PRETEND PRINTED TO OMIT HEADERS ! 19342: {{MOV{BITS9{R7{{BIT 9 MASK ! 19343: {{ANB{R8{R7{{GET BIT 9 ! 19344: {{MOV{R7{PRSTO{{KEEP IT AS STD LISTING OPTION ! 19345: {{ZRB{R7{PRPA6{{SKIP IF CLEAR ! 19346: {{MOV{PRLEN{R6{{GET PRINT BUFFER LENGTH ! 19347: {{SUB{#NUM08{R6{{POINT 8 CHARS FROM LINE END ! 19348: {{MOV{R6{LSTPO{{STORE PAGE OFFSET ! 19349: * ! 19350: * CHECK FOR TERMINAL ! 19351: * ! 19352: {PRPA6{ANB{BITS8{R8{{SEE IF TERMINAL TO BE ACTIVATED ! 19353: {{BNZ{R8{PRPA7{{JUMP IF TERMINAL REQUIRED ! 19354: {{BZE{INITR{PRPA8{{JUMP IF NO TERMINAL TO DETACH ! 19355: {{MOV{#V$TER{R10{{PTR TO /TERMINAL/ ! 19356: {{JSR{GTNVR{{{GET VRBLK POINTER ! 19357: {{PPM{{{{CANT FAIL ! 19358: {{MOV{#NULLS{4*VRVAL(R9){{CLEAR VALUE OF TERMINAL ! 19359: {{JSR{SETVR{{{REMOVE ASSOCIATION ! 19360: {{BRN{PRPA8{{{RETURN ! 19361: * ! 19362: * ASSOCIATE TERMINAL ! 19363: * ! 19364: {PRPA7{MNZ{INITR{{{NOTE TERMINAL ASSOCIATED ! 19365: {{BZE{DNAMB{PRPA8{{CANT IF MEMORY NOT ORGANISED ! 19366: {{MOV{#V$TER{R10{{POINT TO TERMINAL STRING ! 19367: {{MOV{#TRTOU{R7{{OUTPUT TRACE TYPE ! 19368: {{JSR{INOUT{{{ATTACH OUTPUT TRBLK TO VRBLK ! 19369: {{MOV{R9{-(SP){{STACK TRBLK PTR ! 19370: {{MOV{#V$TER{R10{{POINT TO TERMINAL STRING ! 19371: {{MOV{#TRTIN{R7{{INPUT TRACE TYPE ! 19372: {{JSR{INOUT{{{ATTACH INPUT TRACE BLK ! 19373: {{MOV{(SP)+{4*VRVAL(R9){{ADD OUTPUT TRBLK TO CHAIN ! 19374: * ! 19375: * RETURN POINT ! 19376: * ! 19377: {PRPA8{EXI{{{{RETURN ! 19378: {{ENP{{{{END PROCEDURE PRPAR ! 19379: {{EJC{{{{ ! 19380: * ! 19381: * PRTCH -- PRINT A CHARACTER ! 19382: * ! 19383: * PRTCH IS USED TO PRINT A SINGLE CHARACTER ! 19384: * ! 19385: * (WA) CHARACTER TO BE PRINTED ! 19386: * JSR PRTCH CALL TO PRINT CHARACTER ! 19387: * ! 19388: {PRTCH{PRC{E{0{{ENTRY POINT ! 19389: {{MOV{R9{-(SP){{SAVE XR ! 19390: {{BNE{PROFS{PRLEN{PRCH1{JUMP IF ROOM IN BUFFER ! 19391: {{JSR{PRTNL{{{ELSE PRINT THIS LINE ! 19392: * ! 19393: * HERE AFTER MAKING SURE WE HAVE ROOM ! 19394: * ! 19395: {PRCH1{MOV{PRBUF{R9{{POINT TO PRINT BUFFER ! 19396: {{PSC{R9{PROFS{{POINT TO NEXT CHARACTER LOCATION ! 19397: {{SCH{R6{(R9){{STORE NEW CHARACTER ! 19398: {{CSC{R9{{{COMPLETE STORE CHARACTERS ! 19399: {{ICV{PROFS{{{BUMP POINTER ! 19400: {{MOV{(SP)+{R9{{RESTORE ENTRY XR ! 19401: {{EXI{{{{RETURN TO PRTCH CALLER ! 19402: {{ENP{{{{END PROCEDURE PRTCH ! 19403: {{EJC{{{{ ! 19404: * ! 19405: * PRTIC -- PRINT TO INTERACTIVE CHANNEL ! 19406: * ! 19407: * PRTIC IS CALLED TO PRINT THE CONTENTS OF THE STANDARD ! 19408: * PRINT BUFFER TO THE INTERACTIVE CHANNEL. IT IS ONLY ! 19409: * CALLED AFTER PRTST HAS SET UP THE STRING FOR PRINTING. ! 19410: * IT DOES NOT CLEAR THE BUFFER. ! 19411: * ! 19412: * JSR PRTIC CALL FOR PRINT ! 19413: * (WA,WB) DESTROYED ! 19414: * ! 19415: {PRTIC{PRC{E{0{{ENTRY POINT ! 19416: {{MOV{R9{-(SP){{SAVE XR ! 19417: {{MOV{PRBUF{R9{{POINT TO BUFFER ! 19418: {{MOV{PROFS{R6{{NO OF CHARS ! 19419: {{JSR{SYSPI{{{PRINT ! 19420: {{PPM{PRTC2{{{FAIL RETURN ! 19421: * ! 19422: * RETURN ! 19423: * ! 19424: {PRTC1{MOV{(SP)+{R9{{RESTORE XR ! 19425: {{EXI{{{{RETURN ! 19426: * ! 19427: * ERROR OCCURED ! 19428: * ! 19429: {PRTC2{ZER{ERICH{{{PREVENT LOOPING ! 19430: {{ERB{252{ERROR{{ON PRINTING TO INTERACTIVE CHANNEL ! 19431: {{BRN{PRTC1{{{RETURN ! 19432: {{ENP{{{{PROCEDURE PRTIC ! 19433: {{EJC{{{{ ! 19434: * ! 19435: * PRTIS -- PRINT TO INTERACTIVE AND STANDARD PRINTER ! 19436: * ! 19437: * PRTIS PUTS A LINE FROM THE PRINT BUFFER ONTO THE ! 19438: * INTERACTIVE CHANNEL (IF ANY) AND THE STANDARD PRINTER. ! 19439: * IT ALWAYS PRINTS TO THE STANDARD PRINTER BUT DOES ! 19440: * NOT DUPLICATE LINES IF THE STANDARD PRINTER IS ! 19441: * INTERACTIVE. IT CLEARS DOWN THE PRINT BUFFER. ! 19442: * ! 19443: * JSR PRTIS CALL FOR PRINTING ! 19444: * (WA,WB) DESTROYED ! 19445: * ! 19446: {PRTIS{PRC{E{0{{ENTRY POINT ! 19447: {{BNZ{PRICH{PRTS1{{JUMP IF STANDARD PRINTER IS INT.CH. ! 19448: {{BZE{ERICH{PRTS1{{SKIP IF NOT DOING INT. ERROR REPS. ! 19449: {{JSR{PRTIC{{{PRINT TO INTERACTIVE CHANNEL ! 19450: * ! 19451: * MERGE AND EXIT ! 19452: * ! 19453: {PRTS1{JSR{PRTNL{{{PRINT TO STANDARD PRINTER ! 19454: {{EXI{{{{RETURN ! 19455: {{ENP{{{{END PROCEDURE PRTIS ! 19456: {{EJC{{{{ ! 19457: * ! 19458: * PRTIN -- PRINT AN INTEGER ! 19459: * ! 19460: * PRTIN PRINTS THE INTEGER VALUE WHICH IS IN THE INTEGER ! 19461: * ACCUMULATOR. BLOCKS BUILT IN DYNAMIC STORAGE ! 19462: * DURING THIS PROCESS ARE IMMEDIATELY DELETED. ! 19463: * ! 19464: * (IA) INTEGER VALUE TO BE PRINTED ! 19465: * JSR PRTIN CALL TO PRINT INTEGER ! 19466: * (IA,RA) DESTROYED ! 19467: * ! 19468: {PRTIN{PRC{E{0{{ENTRY POINT ! 19469: {{MOV{R9{-(SP){{SAVE XR ! 19470: {{JSR{ICBLD{{{BUILD INTEGER BLOCK ! 19471: {{BLO{R9{DNAMB{PRTI1{JUMP IF ICBLK BELOW DYNAMIC ! 19472: {{BHI{R9{DNAMP{PRTI1{JUMP IF ABOVE DYNAMIC ! 19473: {{MOV{R9{DNAMP{{IMMEDIATELY DELETE IT ! 19474: * ! 19475: * DELETE ICBLK FROM DYNAMIC STORE ! 19476: * ! 19477: {PRTI1{MOV{R9{-(SP){{STACK PTR FOR GTSTG ! 19478: {{JSR{GTSTG{{{CONVERT TO STRING ! 19479: {{PPM{{{{CONVERT ERROR IS IMPOSSIBLE ! 19480: {{MOV{R9{DNAMP{{RESET POINTER TO DELETE SCBLK ! 19481: {{JSR{PRTST{{{PRINT INTEGER STRING ! 19482: {{MOV{(SP)+{R9{{RESTORE ENTRY XR ! 19483: {{EXI{{{{RETURN TO PRTIN CALLER ! 19484: {{ENP{{{{END PROCEDURE PRTIN ! 19485: {{EJC{{{{ ! 19486: * ! 19487: * PRTMI -- PRINT MESSAGE AND INTEGER ! 19488: * ! 19489: * PRTMI IS USED TO PRINT MESSAGES TOGETHER WITH AN INTEGER ! 19490: * VALUE STARTING IN COLUMN 15 (USED BY THE ROUTINES AT ! 19491: * THE END OF COMPILATION). ! 19492: * ! 19493: * JSR PRTMI CALL TO PRINT MESSAGE AND INTEGER ! 19494: * ! 19495: {PRTMI{PRC{E{0{{ENTRY POINT ! 19496: {{JSR{PRTST{{{PRINT STRING MESSAGE ! 19497: {{MOV{#PRTMF{PROFS{{SET OFFSET TO COL 15 ! 19498: {{JSR{PRTIN{{{PRINT INTEGER ! 19499: {{JSR{PRTNL{{{PRINT LINE ! 19500: {{EXI{{{{RETURN TO PRTMI CALLER ! 19501: {{ENP{{{{END PROCEDURE PRTMI ! 19502: {{EJC{{{{ ! 19503: * ! 19504: * PRTMX -- AS PRTMI WITH EXTRA COPY TO INTERACTIVE CHAN. ! 19505: * ! 19506: * JSR PRTMX CALL FOR PRINTING ! 19507: * (WA,WB) DESTROYED ! 19508: * ! 19509: {PRTMX{PRC{E{0{{ENTRY POINT ! 19510: {{JSR{PRTST{{{PRINT STRING MESSAGE ! 19511: {{MOV{#PRTMF{PROFS{{SET PTR TO COLUMN 15 ! 19512: {{JSR{PRTIN{{{PRINT INTEGER ! 19513: {{JSR{PRTIS{{{PRINT LINE ! 19514: {{EXI{{{{RETURN ! 19515: {{ENP{{{{END PROCEDURE PRTMX ! 19516: {{EJC{{{{ ! 19517: * ! 19518: * PRTNL -- PRINT NEW LINE (END PRINT LINE) ! 19519: * ! 19520: * PRTNL PRINTS THE CONTENTS OF THE PRINT BUFFER, RESETS ! 19521: * THE BUFFER TO ALL BLANKS AND RESETS THE PRINT POINTER. ! 19522: * ! 19523: * JSR PRTNL CALL TO PRINT LINE ! 19524: * ! 19525: {PRTNL{PRC{R{0{{ENTRY POINT ! 19526: {{BNZ{HEADP{PRNL0{{WERE HEADERS PRINTED ! 19527: {{JSR{PRTPS{{{NO - PRINT THEM ! 19528: * ! 19529: * CALL SYSPR ! 19530: * ! 19531: {PRNL0{MOV{R9{-(SP){{SAVE ENTRY XR ! 19532: {{MOV{R6{PRTSA{{SAVE WA ! 19533: {{MOV{R7{PRTSB{{SAVE WB ! 19534: {{MOV{PRBUF{R9{{LOAD POINTER TO BUFFER ! 19535: {{MOV{PROFS{R6{{LOAD NUMBER OF CHARS IN BUFFER ! 19536: {{JSR{SYSPR{{{CALL SYSTEM PRINT ROUTINE ! 19537: {{PPM{PRNL2{{{JUMP IF FAILED ! 19538: {{LCT{R6{PRLNW{{LOAD LENGTH OF BUFFER IN WORDS ! 19539: {{ADD{#4*SCHAR{R9{{POINT TO CHARS OF BUFFER ! 19540: {{MOV{NULLW{R7{{GET WORD OF BLANKS ! 19541: * ! 19542: * LOOP TO BLANK BUFFER ! 19543: * ! 19544: {PRNL1{MOV{R7{(R9)+{{STORE WORD OF BLANKS, BUMP PTR ! 19545: {{BCT{R6{PRNL1{{LOOP TILL ALL BLANKED ! 19546: * ! 19547: * EXIT POINT ! 19548: * ! 19549: {{MOV{PRTSB{R7{{RESTORE WB ! 19550: {{MOV{PRTSA{R6{{RESTORE WA ! 19551: {{MOV{(SP)+{R9{{RESTORE ENTRY XR ! 19552: {{ZER{PROFS{{{RESET PRINT BUFFER POINTER ! 19553: {{EXI{{{{RETURN TO PRTNL CALLER ! 19554: * ! 19555: * FILE FULL OR NO OUTPUT FILE FOR LOAD MODULE ! 19556: * ! 19557: {PRNL2{BNZ{PRTEF{PRNL3{{JUMP IF NOT FIRST TIME ! 19558: {{MNZ{PRTEF{{{MARK FIRST OCCURRENCE ! 19559: {{ERB{253{PRINT{{LIMIT EXCEEDED ON STANDARD OUTPUT CHANNEL ! 19560: * ! 19561: * STOP AT ONCE ! 19562: * ! 19563: {PRNL3{MOV{#NINI8{R7{{ENDING CODE ! 19564: {{MOV{KVSTN{R6{{STATEMENT NUMBER ! 19565: {{JSR{SYSEJ{{{STOP ! 19566: {{ENP{{{{END PROCEDURE PRTNL ! 19567: {{EJC{{{{ ! 19568: * ! 19569: * PRTNM -- PRINT VARIABLE NAME ! 19570: * ! 19571: * PRTNM IS USED TO PRINT A CHARACTER REPRESENTATION OF THE ! 19572: * NAME OF A VARIABLE (NOT A VALUE OF DATATYPE NAME) ! 19573: * NAMES OF PSEUDO-VARIABLES MAY NOT BE PASSED TO PRTNM. ! 19574: * ! 19575: * (XL) NAME BASE ! 19576: * (WA) NAME OFFSET ! 19577: * JSR PRTNM CALL TO PRINT NAME ! 19578: * (WB,WC,RA) DESTROYED ! 19579: * ! 19580: {PRTNM{PRC{R{0{{ENTRY POINT (RECURSIVE, SEE PRTVL) ! 19581: {{MOV{R6{-(SP){{SAVE WA (OFFSET IS COLLECTABLE) ! 19582: {{MOV{R9{-(SP){{SAVE ENTRY XR ! 19583: {{MOV{R10{-(SP){{SAVE NAME BASE ! 19584: {{BHI{R10{STATE{PRN02{JUMP IF NOT NATURAL VARIABLE ! 19585: * ! 19586: * HERE FOR NATURAL VARIABLE NAME, RECOGNIZED BY THE FACT ! 19587: * THAT THE NAME BASE POINTS INTO THE STATIC AREA. ! 19588: * ! 19589: {{MOV{R10{R9{{POINT TO VRBLK ! 19590: {{JSR{PRTVN{{{PRINT NAME OF VARIABLE ! 19591: * ! 19592: * COMMON EXIT POINT ! 19593: * ! 19594: {PRN01{MOV{(SP)+{R10{{RESTORE NAME BASE ! 19595: {{MOV{(SP)+{R9{{RESTORE ENTRY VALUE OF XR ! 19596: {{MOV{(SP)+{R6{{RESTORE WA ! 19597: {{EXI{{{{RETURN TO PRTNM CALLER ! 19598: * ! 19599: * HERE FOR CASE OF NON-NATURAL VARIABLE ! 19600: * ! 19601: {PRN02{MOV{R6{R7{{COPY NAME OFFSET ! 19602: {{BNE{(R10){#B$PDT{PRN03{JUMP IF ARRAY OR TABLE ! 19603: * ! 19604: * FOR PROGRAM DEFINED DATATYPE, PRT FLD NAME, LEFT PAREN ! 19605: * ! 19606: {{MOV{4*PDDFP(R10){R9{{LOAD POINTER TO DFBLK ! 19607: {{ADD{R6{R9{{ADD NAME OFFSET ! 19608: {{MOV{4*PDFOF(R9){R9{{LOAD VRBLK POINTER FOR FIELD ! 19609: {{JSR{PRTVN{{{PRINT FIELD NAME ! 19610: {{MOV{#CH$PP{R6{{LOAD LEFT PAREN ! 19611: {{JSR{PRTCH{{{PRINT CHARACTER ! 19612: {{EJC{{{{ ! 19613: * ! 19614: * PRTNM (CONTINUED) ! 19615: * ! 19616: * NOW WE PRINT AN IDENTIFYING NAME FOR THE OBJECT IF ONE ! 19617: * CAN BE FOUND. THE FOLLOWING CODE SEARCHES FOR A NATURAL ! 19618: * VARIABLE WHICH CONTAINS THIS OBJECT AS VALUE. IF SUCH A ! 19619: * VARIABLE IS FOUND, ITS NAME IS PRINTED, ELSE THE VALUE ! 19620: * OF THE OBJECT (AS PRINTED BY PRTVL) IS USED INSTEAD. ! 19621: * ! 19622: * FIRST WE POINT TO THE PARENT TBBLK IF THIS IS THE CASE OF ! 19623: * A TABLE ELEMENT. TO DO THIS, CHASE DOWN THE TRNXT CHAIN. ! 19624: * ! 19625: {PRN03{BNE{(R10){#B$TET{PRN04{JUMP IF WE GOT THERE (OR NOT TE) ! 19626: {{MOV{4*TENXT(R10){R10{{ELSE MOVE OUT ON CHAIN ! 19627: {{BRN{PRN03{{{AND LOOP BACK ! 19628: * ! 19629: * NOW WE ARE READY FOR THE SEARCH. TO SPEED THINGS UP IN ! 19630: * THE CASE OF CALLS FROM DUMP WHERE THE SAME NAME BASE ! 19631: * WILL OCCUR REPEATEDLY WHILE DUMPING AN ARRAY OR TABLE, ! 19632: * WE REMEMBER THE LAST VRBLK POINTER FOUND IN PRNMV. SO ! 19633: * FIRST CHECK TO SEE IF WE HAVE THIS ONE AGAIN. ! 19634: * ! 19635: {PRN04{MOV{PRNMV{R9{{POINT TO VRBLK WE FOUND LAST TIME ! 19636: {{MOV{HSHTB{R6{{POINT TO HASH TABLE IN CASE NOT ! 19637: {{BRN{PRN07{{{JUMP INTO SEARCH FOR SPECIAL CHECK ! 19638: * ! 19639: * LOOP THROUGH HASH SLOTS ! 19640: * ! 19641: {PRN05{MOV{R6{R9{{COPY SLOT POINTER ! 19642: {{ICA{R6{{{BUMP SLOT POINTER ! 19643: {{SUB{#4*VRNXT{R9{{INTRODUCE STANDARD VRBLK OFFSET ! 19644: * ! 19645: * LOOP THROUGH VRBLKS ON ONE HASH CHAIN ! 19646: * ! 19647: {PRN06{MOV{4*VRNXT(R9){R9{{POINT TO NEXT VRBLK ON HASH CHAIN ! 19648: * ! 19649: * MERGE HERE FIRST TIME TO CHECK BLOCK WE FOUND LAST TIME ! 19650: * ! 19651: {PRN07{MOV{R9{R8{{COPY VRBLK POINTER ! 19652: {{BZE{R8{PRN09{{JUMP IF CHAIN END (OR PRNMV ZERO) ! 19653: {{EJC{{{{ ! 19654: * ! 19655: * PRTNM (CONTINUED) ! 19656: * ! 19657: * LOOP TO FIND VALUE (CHASE DOWN POSSIBLE TRBLK CHAIN) ! 19658: * ! 19659: {PRN08{MOV{4*VRVAL(R9){R9{{LOAD VALUE ! 19660: {{BEQ{(R9){#B$TRT{PRN08{LOOP IF THAT WAS A TRBLK ! 19661: * ! 19662: * NOW WE HAVE THE VALUE, IS THIS THE BLOCK WE WANT ! 19663: * ! 19664: {{BEQ{R9{R10{PRN10{JUMP IF THIS MATCHES THE NAME BASE ! 19665: {{MOV{R8{R9{{ELSE POINT BACK TO THAT VRBLK ! 19666: {{BRN{PRN06{{{AND LOOP BACK ! 19667: * ! 19668: * HERE TO MOVE TO NEXT HASH SLOT ! 19669: * ! 19670: {PRN09{BLT{R6{HSHTE{PRN05{LOOP BACK IF MORE TO GO ! 19671: {{MOV{R10{R9{{ELSE NOT FOUND, COPY VALUE POINTER ! 19672: {{JSR{PRTVL{{{PRINT VALUE ! 19673: {{BRN{PRN11{{{AND MERGE AHEAD ! 19674: * ! 19675: * HERE WHEN WE FIND A MATCHING ENTRY ! 19676: * ! 19677: {PRN10{MOV{R8{R9{{COPY VRBLK POINTER ! 19678: {{MOV{R9{PRNMV{{SAVE FOR NEXT TIME IN ! 19679: {{JSR{PRTVN{{{PRINT VARIABLE NAME ! 19680: * ! 19681: * MERGE HERE IF NO ENTRY FOUND ! 19682: * ! 19683: {PRN11{MOV{(R10){R8{{LOAD FIRST WORD OF NAME BASE ! 19684: {{BNE{R8{#B$PDT{PRN13{JUMP IF NOT PROGRAM DEFINED ! 19685: * ! 19686: * FOR PROGRAM DEFINED DATATYPE, ADD RIGHT PAREN AND EXIT ! 19687: * ! 19688: {{MOV{#CH$RP{R6{{LOAD RIGHT PAREN, MERGE ! 19689: * ! 19690: * MERGE HERE TO PRINT FINAL RIGHT PAREN OR BRACKET ! 19691: * ! 19692: {PRN12{JSR{PRTCH{{{PRINT FINAL CHARACTER ! 19693: {{MOV{R7{R6{{RESTORE NAME OFFSET ! 19694: {{BRN{PRN01{{{MERGE BACK TO EXIT ! 19695: {{EJC{{{{ ! 19696: * ! 19697: * PRTNM (CONTINUED) ! 19698: * ! 19699: * HERE FOR ARRAY OR TABLE ! 19700: * ! 19701: {PRN13{MOV{#CH$BB{R6{{LOAD LEFT BRACKET ! 19702: {{JSR{PRTCH{{{AND PRINT IT ! 19703: {{MOV{(SP){R10{{RESTORE BLOCK POINTER ! 19704: {{MOV{(R10){R8{{LOAD TYPE WORD AGAIN ! 19705: {{BNE{R8{#B$TET{PRN15{JUMP IF NOT TABLE ! 19706: * ! 19707: * HERE FOR TABLE, PRINT SUBSCRIPT VALUE ! 19708: * ! 19709: {{MOV{4*TESUB(R10){R9{{LOAD SUBSCRIPT VALUE ! 19710: {{MOV{R7{R10{{SAVE NAME OFFSET ! 19711: {{JSR{PRTVL{{{PRINT SUBSCRIPT VALUE ! 19712: {{MOV{R10{R7{{RESTORE NAME OFFSET ! 19713: * ! 19714: * MERGE HERE FROM ARRAY CASE TO PRINT RIGHT BRACKET ! 19715: * ! 19716: {PRN14{MOV{#CH$RB{R6{{LOAD RIGHT BRACKET ! 19717: {{BRN{PRN12{{{MERGE BACK TO PRINT IT ! 19718: * ! 19719: * HERE FOR ARRAY OR VECTOR, TO PRINT SUBSCRIPT(S) ! 19720: * ! 19721: {PRN15{MOV{R7{R6{{COPY NAME OFFSET ! 19722: {{BTW{R6{{{CONVERT TO WORDS ! 19723: {{BEQ{R8{#B$ART{PRN16{JUMP IF ARBLK ! 19724: * ! 19725: * HERE FOR VECTOR ! 19726: * ! 19727: {{SUB{#VCVLB{R6{{ADJUST FOR STANDARD FIELDS ! 19728: {{MTI{R6{{{MOVE TO INTEGER ACCUM ! 19729: {{JSR{PRTIN{{{PRINT LINEAR SUBSCRIPT ! 19730: {{BRN{PRN14{{{MERGE BACK FOR RIGHT BRACKET ! 19731: {{EJC{{{{ ! 19732: * ! 19733: * PRTNM (CONTINUED) ! 19734: * ! 19735: * HERE FOR ARRAY. FIRST CALCULATE ABSOLUTE SUBSCRIPT ! 19736: * OFFSETS BY SUCCESSIVE DIVISIONS BY THE DIMENSION VALUES. ! 19737: * THIS MUST BE DONE RIGHT TO LEFT SINCE THE ELEMENTS ARE ! 19738: * STORED ROW-WISE. THE SUBSCRIPTS ARE STACKED AS INTEGERS. ! 19739: * ! 19740: {PRN16{MOV{4*AROFS(R10){R8{{LOAD LENGTH OF BOUNDS INFO ! 19741: {{ICA{R8{{{ADJUST FOR ARPRO FIELD ! 19742: {{BTW{R8{{{CONVERT TO WORDS ! 19743: {{SUB{R8{R6{{GET LINEAR ZERO-ORIGIN SUBSCRIPT ! 19744: {{MTI{R6{{{GET INTEGER VALUE ! 19745: {{LCT{R6{4*ARNDM(R10){{SET NUM OF DIMENSIONS AS LOOP COUNT ! 19746: {{ADD{4*AROFS(R10){R10{{POINT PAST BOUNDS INFORMATION ! 19747: {{SUB{#4*ARLBD{R10{{SET OK OFFSET FOR PROPER PTR LATER ! 19748: * ! 19749: * LOOP TO STACK SUBSCRIPT OFFSETS ! 19750: * ! 19751: {PRN17{SUB{#4*ARDMS{R10{{POINT TO NEXT SET OF BOUNDS ! 19752: {{STI{PRNSI{{{SAVE CURRENT OFFSET ! 19753: {{RMI{4*ARDIM(R10){{{GET REMAINDER ON DIVIDING BY DIMENS ! 19754: {{MFI{-(SP){{{STORE ON STACK (ONE WORD) ! 19755: {{LDI{PRNSI{{{RELOAD ARGUMENT ! 19756: {{DVI{4*ARDIM(R10){{{DIVIDE TO GET QUOTIENT ! 19757: {{BCT{R6{PRN17{{LOOP TILL ALL STACKED ! 19758: {{ZER{R9{{{SET OFFSET TO FIRST SET OF BOUNDS ! 19759: {{LCT{R7{4*ARNDM(R10){{LOAD COUNT OF DIMS TO CONTROL LOOP ! 19760: {{BRN{PRN19{{{JUMP INTO PRINT LOOP ! 19761: * ! 19762: * LOOP TO PRINT SUBSCRIPTS FROM STACK ADJUSTING BY ADDING ! 19763: * THE APPROPRIATE LOW BOUND VALUE FROM THE ARBLK ! 19764: * ! 19765: {PRN18{MOV{#CH$CM{R6{{LOAD A COMMA ! 19766: {{JSR{PRTCH{{{PRINT IT ! 19767: * ! 19768: * MERGE HERE FIRST TIME IN (NO COMMA REQUIRED) ! 19769: * ! 19770: {PRN19{MTI{(SP)+{{{LOAD SUBSCRIPT OFFSET AS INTEGER ! 19771: {{ADD{R9{R10{{POINT TO CURRENT LBD ! 19772: {{ADI{4*ARLBD(R10){{{ADD LBD TO GET SIGNED SUBSCRIPT ! 19773: {{SUB{R9{R10{{POINT BACK TO START OF ARBLK ! 19774: {{JSR{PRTIN{{{PRINT SUBSCRIPT ! 19775: {{ADD{#4*ARDMS{R9{{BUMP OFFSET TO NEXT BOUNDS ! 19776: {{BCT{R7{PRN18{{LOOP BACK TILL ALL PRINTED ! 19777: {{BRN{PRN14{{{MERGE BACK TO PRINT RIGHT BRACKET ! 19778: {{ENP{{{{END PROCEDURE PRTNM ! 19779: {{EJC{{{{ ! 19780: * ! 19781: * PRTNV -- PRINT NAME VALUE ! 19782: * ! 19783: * PRTNV IS USED BY THE TRACE AND DUMP ROUTINES TO PRINT ! 19784: * A LINE OF THE FORM ! 19785: * ! 19786: * NAME = VALUE ! 19787: * ! 19788: * NOTE THAT THE NAME INVOLVED CAN NEVER BE A PSEUDO-VAR ! 19789: * ! 19790: * (XL) NAME BASE ! 19791: * (WA) NAME OFFSET ! 19792: * JSR PRTNV CALL TO PRINT NAME = VALUE ! 19793: * (WB,WC,RA) DESTROYED ! 19794: * ! 19795: {PRTNV{PRC{E{0{{ENTRY POINT ! 19796: {{JSR{PRTNM{{{PRINT ARGUMENT NAME ! 19797: {{MOV{R9{-(SP){{SAVE ENTRY XR ! 19798: {{MOV{R6{-(SP){{SAVE NAME OFFSET (COLLECTABLE) ! 19799: {{MOV{#TMBEB{R9{{POINT TO BLANK EQUAL BLANK ! 19800: {{JSR{PRTST{{{PRINT IT ! 19801: {{MOV{R10{R9{{COPY NAME BASE ! 19802: {{ADD{R6{R9{{POINT TO VALUE ! 19803: {{MOV{(R9){R9{{LOAD VALUE POINTER ! 19804: {{JSR{PRTVL{{{PRINT VALUE ! 19805: {{JSR{PRTNL{{{TERMINATE LINE ! 19806: {{MOV{(SP)+{R6{{RESTORE NAME OFFSET ! 19807: {{MOV{(SP)+{R9{{RESTORE ENTRY XR ! 19808: {{EXI{{{{RETURN TO CALLER ! 19809: {{ENP{{{{END PROCEDURE PRTNV ! 19810: {{EJC{{{{ ! 19811: * ! 19812: * PRTPG -- PRINT A PAGE THROW ! 19813: * ! 19814: * PRINTS A PAGE THROW OR A FEW BLANK LINES ON THE STANDARD ! 19815: * LISTING CHANNEL DEPENDING ON THE LISTING OPTIONS CHOSEN. ! 19816: * ! 19817: * JSR PRTPG CALL FOR PAGE EJECT ! 19818: * ! 19819: {PRTPG{PRC{E{0{{ENTRY POINT ! 19820: {{BEQ{STAGE{#STGXT{PRP01{JUMP IF EXECUTION TIME ! 19821: {{BZE{LSTLC{PRP06{{RETURN IF TOP OF PAGE ALREADY ! 19822: {{ZER{LSTLC{{{CLEAR LINE COUNT ! 19823: * ! 19824: * CHECK TYPE OF LISTING ! 19825: * ! 19826: {PRP01{MOV{R9{-(SP){{PRESERVE XR ! 19827: {{BNZ{PRSTD{PRP02{{EJECT IF FLAG SET ! 19828: {{BNZ{PRICH{PRP03{{JUMP IF INTERACTIVE LISTING CHANNEL ! 19829: {{BZE{PRECL{PRP03{{JUMP IF COMPACT LISTING ! 19830: * ! 19831: * PERFORM AN EJECT ! 19832: * ! 19833: {PRP02{JSR{SYSEP{{{EJECT ! 19834: {{BRN{PRP04{{{MERGE ! 19835: * ! 19836: * COMPACT OR INTERACTIVE CHANNEL LISTING. CANT PRINT ! 19837: * BLANKS UNTIL CHECK MADE FOR HEADERS PRINTED AND FLAG SET. ! 19838: * ! 19839: * ! 19840: {PRP03{MOV{HEADP{R9{{REMEMBER HEADP ! 19841: {{MNZ{HEADP{{{SET TO AVOID REPEATED PRTPG CALLS ! 19842: {{JSR{PRTNL{{{PRINT BLANK LINE ! 19843: {{JSR{PRTNL{{{PRINT BLANK LINE ! 19844: {{JSR{PRTNL{{{PRINT BLANK LINE ! 19845: {{MOV{#NUM03{LSTLC{{COUNT BLANK LINES ! 19846: {{MOV{R9{HEADP{{RESTORE HEADER FLAG ! 19847: {{EJC{{{{ ! 19848: * ! 19849: * PRPTG (CONTINUED) ! 19850: * ! 19851: * PRINT THE HEADING ! 19852: * ! 19853: {PRP04{BNZ{HEADP{PRP05{{JUMP IF HEADER LISTED ! 19854: {{MNZ{HEADP{{{MARK HEADERS PRINTED ! 19855: {{MOV{R10{-(SP){{KEEP XL ! 19856: {{MOV{#HEADR{R9{{POINT TO LISTING HEADER ! 19857: {{JSR{PRTST{{{PLACE IT ! 19858: {{JSR{SYSID{{{GET SYSTEM IDENTIFICATION ! 19859: {{JSR{PRTST{{{APPEND EXTRA CHARS ! 19860: {{JSR{PRTNL{{{PRINT IT ! 19861: {{MOV{R10{R9{{EXTRA HEADER LINE ! 19862: {{JSR{PRTST{{{PLACE IT ! 19863: {{JSR{PRTNL{{{PRINT IT ! 19864: {{JSR{PRTNL{{{PRINT A BLANK ! 19865: {{JSR{PRTNL{{{AND ANOTHER ! 19866: {{ADD{#NUM04{LSTLC{{FOUR HEADER LINES PRINTED ! 19867: {{MOV{(SP)+{R10{{RESTORE XL ! 19868: * ! 19869: * MERGE IF HEADER NOT PRINTED ! 19870: * ! 19871: {PRP05{MOV{(SP)+{R9{{RESTORE XR ! 19872: * ! 19873: * RETURN ! 19874: * ! 19875: {PRP06{EXI{{{{RETURN ! 19876: {{ENP{{{{END PROCEDURE PRTPG ! 19877: {{EJC{{{{ ! 19878: * ! 19879: * PRTPS - PRINT PAGE WITH TEST FOR STANDARD LISTING OPTION ! 19880: * ! 19881: * IF THE STANDARD LISTING OPTION IS SELECTED, INSIST THAT ! 19882: * AN EJECT BE DONE ! 19883: * ! 19884: * JSR PRTPS CALL FOR EJECT ! 19885: * ! 19886: {PRTPS{PRC{E{0{{ENTRY POINT ! 19887: {{MOV{PRSTO{PRSTD{{COPY OPTION FLAG ! 19888: {{JSR{PRTPG{{{PRINT PAGE ! 19889: {{ZER{PRSTD{{{CLEAR FLAG ! 19890: {{EXI{{{{RETURN ! 19891: {{ENP{{{{END PROCEDURE PRTPS ! 19892: {{EJC{{{{ ! 19893: * ! 19894: * PRTSN -- PRINT STATEMENT NUMBER ! 19895: * ! 19896: * PRTSN IS USED TO INITIATE A PRINT TRACE LINE BY PRINTING ! 19897: * ASTERISKS AND THE CURRENT STATEMENT NUMBER. THE ACTUAL ! 19898: * FORMAT OF THE OUTPUT GENERATED IS. ! 19899: * ! 19900: * ***NNNNN**** III.....IIII ! 19901: * ! 19902: * NNNNN IS THE STATEMENT NUMBER WITH LEADING ZEROS REPLACED ! 19903: * BY ASTERISKS (E.G. *******9****) ! 19904: * ! 19905: * III...III REPRESENTS A VARIABLE LENGTH OUTPUT CONSISTING ! 19906: * OF A NUMBER OF LETTER I CHARACTERS EQUAL TO FNCLEVEL. ! 19907: * ! 19908: * JSR PRTSN CALL TO PRINT STATEMENT NUMBER ! 19909: * (WC) DESTROYED ! 19910: * ! 19911: {PRTSN{PRC{E{0{{ENTRY POINT ! 19912: {{MOV{R9{-(SP){{SAVE ENTRY XR ! 19913: {{MOV{R6{PRSNA{{SAVE ENTRY WA ! 19914: {{MOV{#TMASB{R9{{POINT TO ASTERISKS ! 19915: {{JSR{PRTST{{{PRINT ASTERISKS ! 19916: {{MOV{#NUM04{PROFS{{POINT INTO MIDDLE OF ASTERISKS ! 19917: {{MTI{KVSTN{{{LOAD STATEMENT NUMBER AS INTEGER ! 19918: {{JSR{PRTIN{{{PRINT INTEGER STATEMENT NUMBER ! 19919: {{MOV{#PRSNF{PROFS{{POINT PAST ASTERISKS PLUS BLANK ! 19920: {{MOV{KVFNC{R9{{GET FNCLEVEL ! 19921: {{MOV{#CH$LI{R6{{SET LETTER I ! 19922: * ! 19923: * LOOP TO GENERATE LETTER I FNCLEVEL TIMES ! 19924: * ! 19925: {PRSN1{BZE{R9{PRSN2{{JUMP IF ALL SET ! 19926: {{JSR{PRTCH{{{ELSE PRINT AN I ! 19927: {{DCV{R9{{{DECREMENT COUNTER ! 19928: {{BRN{PRSN1{{{LOOP BACK ! 19929: * ! 19930: * MERRE WITH ALL LETTER I CHARACTERS GENERATED ! 19931: * ! 19932: {PRSN2{MOV{#CH$BL{R6{{GET BLANK ! 19933: {{JSR{PRTCH{{{PRINT BLANK ! 19934: {{MOV{PRSNA{R6{{RESTORE ENTRY WA ! 19935: {{MOV{(SP)+{R9{{RESTORE ENTRY XR ! 19936: {{EXI{{{{RETURN TO PRTSN CALLER ! 19937: {{ENP{{{{END PROCEDURE PRTSN ! 19938: {{EJC{{{{ ! 19939: * ! 19940: * PRTST -- PRINT STRING ! 19941: * ! 19942: * PRTST PLACES A STRING OF CHARACTERS IN THE PRINT BUFFER ! 19943: * ! 19944: * SEE PRTNL FOR GLOBAL LOCATIONS USED ! 19945: * ! 19946: * NOTE THAT THE FIRST WORD OF THE BLOCK (NORMALLY B$SCL) ! 19947: * IS NOT USED AND NEED NOT BE SET CORRECTLY (SEE PRTVN) ! 19948: * ! 19949: * (XR) STRING TO BE PRINTED ! 19950: * JSR PRTST CALL TO PRINT STRING ! 19951: * (PROFS) UPDATED PAST CHARS PLACED ! 19952: * ! 19953: {PRTST{PRC{R{0{{ENTRY POINT ! 19954: {{BNZ{HEADP{PRST0{{WERE HEADERS PRINTED ! 19955: {{JSR{PRTPS{{{NO - PRINT THEM ! 19956: * ! 19957: * CALL SYSPR ! 19958: * ! 19959: {PRST0{MOV{R6{PRSVA{{SAVE WA ! 19960: {{MOV{R7{PRSVB{{SAVE WB ! 19961: {{ZER{R7{{{SET CHARS PRINTED COUNT TO ZERO ! 19962: * ! 19963: * LOOP TO PRINT SUCCESSIVE LINES FOR LONG STRING ! 19964: * ! 19965: {PRST1{MOV{4*SCLEN(R9){R6{{LOAD STRING LENGTH ! 19966: {{SUB{R7{R6{{SUBTRACT COUNT OF CHARS ALREADY OUT ! 19967: {{BZE{R6{PRST4{{JUMP TO EXIT IF NONE LEFT ! 19968: {{MOV{R10{-(SP){{ELSE STACK ENTRY XL ! 19969: {{MOV{R9{-(SP){{SAVE ARGUMENT ! 19970: {{MOV{R9{R10{{COPY FOR EVENTUAL MOVE ! 19971: {{MOV{PRLEN{R9{{LOAD PRINT BUFFER LENGTH ! 19972: {{SUB{PROFS{R9{{GET CHARS LEFT IN PRINT BUFFER ! 19973: {{BNZ{R9{PRST2{{SKIP IF ROOM LEFT ON THIS LINE ! 19974: {{JSR{PRTNL{{{ELSE PRINT THIS LINE ! 19975: {{MOV{PRLEN{R9{{AND SET FULL WIDTH AVAILABLE ! 19976: {{EJC{{{{ ! 19977: * ! 19978: * PRTST (CONTINUED) ! 19979: * ! 19980: * HERE WITH CHARS TO PRINT AND SOME ROOM IN BUFFER ! 19981: * ! 19982: {PRST2{BLO{R6{R9{PRST3{JUMP IF ROOM FOR REST OF STRING ! 19983: {{MOV{R9{R6{{ELSE SET TO FILL LINE ! 19984: * ! 19985: * MERGE HERE WITH CHARACTER COUNT IN WA ! 19986: * ! 19987: {PRST3{MOV{PRBUF{R9{{POINT TO PRINT BUFFER ! 19988: {{PLC{R10{R7{{POINT TO LOCATION IN STRING ! 19989: {{PSC{R9{PROFS{{POINT TO LOCATION IN BUFFER ! 19990: {{ADD{R6{R7{{BUMP STRING CHARS COUNT ! 19991: {{ADD{R6{PROFS{{BUMP BUFFER POINTER ! 19992: {{MOV{R7{PRSVC{{PRESERVE CHAR COUNTER ! 19993: {{MVC{{{{MOVE CHARACTERS TO BUFFER ! 19994: {{MOV{PRSVC{R7{{RECOVER CHAR COUNTER ! 19995: {{MOV{(SP)+{R9{{RESTORE ARGUMENT POINTER ! 19996: {{MOV{(SP)+{R10{{RESTORE ENTRY XL ! 19997: {{BRN{PRST1{{{LOOP BACK TO TEST FOR MORE ! 19998: * ! 19999: * HERE TO EXIT AFTER PRINTING STRING ! 20000: * ! 20001: {PRST4{MOV{PRSVB{R7{{RESTORE ENTRY WB ! 20002: {{MOV{PRSVA{R6{{RESTORE ENTRY WA ! 20003: {{EXI{{{{RETURN TO PRTST CALLER ! 20004: {{ENP{{{{END PROCEDURE PRTST ! 20005: {{EJC{{{{ ! 20006: * ! 20007: * PRTTR -- PRINT TO TERMINAL ! 20008: * ! 20009: * CALLED TO PRINT CONTENTS OF STANDARD PRINT BUFFER TO ! 20010: * ONLINE TERMINAL. CLEARS BUFFER DOWN AND RESETS PROFS. ! 20011: * ! 20012: * JSR PRTTR CALL FOR PRINT ! 20013: * (WA,WB) DESTROYED ! 20014: * ! 20015: {PRTTR{PRC{E{0{{ENTRY POINT ! 20016: {{MOV{R9{-(SP){{SAVE XR ! 20017: {{JSR{PRTIC{{{PRINT BUFFER CONTENTS ! 20018: {{MOV{PRBUF{R9{{POINT TO PRINT BFR TO CLEAR IT ! 20019: {{LCT{R6{PRLNW{{GET BUFFER LENGTH ! 20020: {{ADD{#4*SCHAR{R9{{POINT PAST SCBLK HEADER ! 20021: {{MOV{NULLW{R7{{GET BLANKS ! 20022: * ! 20023: * LOOP TO CLEAR BUFFER ! 20024: * ! 20025: {PRTT1{MOV{R7{(R9)+{{CLEAR A WORD ! 20026: {{BCT{R6{PRTT1{{LOOP ! 20027: {{ZER{PROFS{{{RESET PROFS ! 20028: {{MOV{(SP)+{R9{{RESTORE XR ! 20029: {{EXI{{{{RETURN ! 20030: {{ENP{{{{END PROCEDURE PRTTR ! 20031: {{EJC{{{{ ! 20032: * ! 20033: * PRTVL -- PRINT A VALUE ! 20034: * ! 20035: * PRTVL PLACES AN APPROPRIATE CHARACTER REPRESENTATION OF ! 20036: * A DATA VALUE IN THE PRINT BUFFER FOR DUMP/TRACE USE. ! 20037: * ! 20038: * (XR) VALUE TO BE PRINTED ! 20039: * JSR PRTVL CALL TO PRINT VALUE ! 20040: * (WA,WB,WC,RA) DESTROYED ! 20041: * ! 20042: {PRTVL{PRC{R{0{{ENTRY POINT, RECURSIVE ! 20043: {{MOV{R10{-(SP){{SAVE ENTRY XL ! 20044: {{MOV{R9{-(SP){{SAVE ARGUMENT ! 20045: {{CHK{{{{CHECK FOR STACK OVERFLOW ! 20046: * ! 20047: * LOOP BACK HERE AFTER FINDING A TRAP BLOCK (TRBLK) ! 20048: * ! 20049: {PRV01{MOV{4*IDVAL(R9){PRVSI{{COPY IDVAL (IF ANY) ! 20050: {{MOV{(R9){R10{{LOAD FIRST WORD OF BLOCK ! 20051: {{LEI{R10{{{LOAD ENTRY POINT ID ! 20052: {{BSW{R10{BL$$T{PRV02{SWITCH ON BLOCK TYPE ! 20053: {{IFF{BL$AR{PRV05{{ARBLK ! 20054: {{IFF{BL$BC{PRV15{{BCBLK ! 20055: {{IFF{DUMMY{PRV02{{ ! 20056: {{IFF{DUMMY{PRV02{{ ! 20057: {{IFF{BL$IC{PRV08{{ICBLK ! 20058: {{IFF{BL$NM{PRV09{{NMBLK ! 20059: {{IFF{DUMMY{PRV02{{ ! 20060: {{IFF{DUMMY{PRV02{{ ! 20061: {{IFF{DUMMY{PRV02{{ ! 20062: {{IFF{BL$RC{PRV08{{RCBLK ! 20063: {{IFF{BL$SC{PRV11{{SCBLK ! 20064: {{IFF{BL$SE{PRV12{{SEBLK ! 20065: {{IFF{BL$TB{PRV13{{TBBLK ! 20066: {{IFF{BL$VC{PRV13{{VCBLK ! 20067: {{IFF{DUMMY{PRV02{{ ! 20068: {{IFF{DUMMY{PRV02{{ ! 20069: {{IFF{BL$PD{PRV10{{PDBLK ! 20070: {{IFF{BL$TR{PRV04{{TRBLK ! 20071: {{ESW{{{{END OF SWITCH ON BLOCK TYPE ! 20072: * ! 20073: * HERE FOR BLOCKS FOR WHICH WE JUST PRINT DATATYPE NAME ! 20074: * ! 20075: {PRV02{JSR{DTYPE{{{GET DATATYPE NAME ! 20076: {{JSR{PRTST{{{PRINT DATATYPE NAME ! 20077: * ! 20078: * COMMON EXIT POINT ! 20079: * ! 20080: {PRV03{MOV{(SP)+{R9{{RELOAD ARGUMENT ! 20081: {{MOV{(SP)+{R10{{RESTORE XL ! 20082: {{EXI{{{{RETURN TO PRTVL CALLER ! 20083: * ! 20084: * HERE FOR TRBLK ! 20085: * ! 20086: {PRV04{MOV{4*TRVAL(R9){R9{{LOAD REAL VALUE ! 20087: {{BRN{PRV01{{{AND LOOP BACK ! 20088: {{EJC{{{{ ! 20089: * ! 20090: * PRTVL (CONTINUED) ! 20091: * ! 20092: * HERE FOR ARRAY (ARBLK) ! 20093: * ! 20094: * PRINT ARRAY ( PROTOTYPE ) BLANK NUMBER IDVAL ! 20095: * ! 20096: {PRV05{MOV{R9{R10{{PRESERVE ARGUMENT ! 20097: {{MOV{#SCARR{R9{{POINT TO DATATYPE NAME (ARRAY) ! 20098: {{JSR{PRTST{{{PRINT IT ! 20099: {{MOV{#CH$PP{R6{{LOAD LEFT PAREN ! 20100: {{JSR{PRTCH{{{PRINT LEFT PAREN ! 20101: {{ADD{4*AROFS(R10){R10{{POINT TO PROTOTYPE ! 20102: {{MOV{(R10){R9{{LOAD PROTOTYPE ! 20103: {{JSR{PRTST{{{PRINT PROTOTYPE ! 20104: * ! 20105: * VCBLK, TBBLK, BCBLK MERGE HERE FOR ) BLANK NUMBER IDVAL ! 20106: * ! 20107: {PRV06{MOV{#CH$RP{R6{{LOAD RIGHT PAREN ! 20108: {{JSR{PRTCH{{{PRINT RIGHT PAREN ! 20109: * ! 20110: * PDBLK MERGES HERE TO PRINT BLANK NUMBER IDVAL ! 20111: * ! 20112: {PRV07{MOV{#CH$BL{R6{{LOAD BLANK ! 20113: {{JSR{PRTCH{{{PRINT IT ! 20114: {{MOV{#CH$NM{R6{{LOAD NUMBER SIGN ! 20115: {{JSR{PRTCH{{{PRINT IT ! 20116: {{MTI{PRVSI{{{GET IDVAL ! 20117: {{JSR{PRTIN{{{PRINT ID NUMBER ! 20118: {{BRN{PRV03{{{BACK TO EXIT ! 20119: * ! 20120: * HERE FOR INTEGER (ICBLK), REAL (RCBLK) ! 20121: * ! 20122: * PRINT CHARACTER REPRESENTATION OF VALUE ! 20123: * ! 20124: {PRV08{MOV{R9{-(SP){{STACK ARGUMENT FOR GTSTG ! 20125: {{JSR{GTSTG{{{CONVERT TO STRING ! 20126: {{PPM{{{{ERROR RETURN IS IMPOSSIBLE ! 20127: {{JSR{PRTST{{{PRINT THE STRING ! 20128: {{MOV{R9{DNAMP{{DELETE GARBAGE STRING FROM STORAGE ! 20129: {{BRN{PRV03{{{BACK TO EXIT ! 20130: {{EJC{{{{ ! 20131: * ! 20132: * PRTVL (CONTINUED) ! 20133: * ! 20134: * NAME (NMBLK) ! 20135: * ! 20136: * FOR PSEUDO-VARIABLE, JUST PRINT DATATYPE NAME (NAME) ! 20137: * FOR ALL OTHER NAMES, PRINT DOT FOLLOWED BY NAME REP ! 20138: * ! 20139: {PRV09{MOV{4*NMBAS(R9){R10{{LOAD NAME BASE ! 20140: {{MOV{(R10){R6{{LOAD FIRST WORD OF BLOCK ! 20141: {{BEQ{R6{#B$KVT{PRV02{JUST PRINT NAME IF KEYWORD ! 20142: {{BEQ{R6{#B$EVT{PRV02{JUST PRINT NAME IF EXPRESSION VAR ! 20143: {{MOV{#CH$DT{R6{{ELSE GET DOT ! 20144: {{JSR{PRTCH{{{AND PRINT IT ! 20145: {{MOV{4*NMOFS(R9){R6{{LOAD NAME OFFSET ! 20146: {{JSR{PRTNM{{{PRINT NAME ! 20147: {{BRN{PRV03{{{BACK TO EXIT ! 20148: * ! 20149: * PROGRAM DATATYPE (PDBLK) ! 20150: * ! 20151: * PRINT DATATYPE NAME CH$BL CH$NM IDVAL ! 20152: * ! 20153: {PRV10{JSR{DTYPE{{{GET DATATYPE NAME ! 20154: {{JSR{PRTST{{{PRINT DATATYPE NAME ! 20155: {{BRN{PRV07{{{MERGE BACK TO PRINT ID ! 20156: * ! 20157: * HERE FOR STRING (SCBLK) ! 20158: * ! 20159: * PRINT QUOTE STRING-CHARACTERS QUOTE ! 20160: * ! 20161: {PRV11{MOV{#CH$SQ{R6{{LOAD SINGLE QUOTE ! 20162: {{JSR{PRTCH{{{PRINT QUOTE ! 20163: {{JSR{PRTST{{{PRINT STRING VALUE ! 20164: {{JSR{PRTCH{{{PRINT ANOTHER QUOTE ! 20165: {{BRN{PRV03{{{BACK TO EXIT ! 20166: {{EJC{{{{ ! 20167: * ! 20168: * PRTVL (CONTINUED) ! 20169: * ! 20170: * HERE FOR SIMPLE EXPRESSION (SEBLK) ! 20171: * ! 20172: * PRINT ASTERISK VARIABLE-NAME ! 20173: * ! 20174: {PRV12{MOV{#CH$AS{R6{{LOAD ASTERISK ! 20175: {{JSR{PRTCH{{{PRINT ASTERISK ! 20176: {{MOV{4*SEVAR(R9){R9{{LOAD VARIABLE POINTER ! 20177: {{JSR{PRTVN{{{PRINT VARIABLE NAME ! 20178: {{BRN{PRV03{{{JUMP BACK TO EXIT ! 20179: * ! 20180: * HERE FOR TABLE (TBBLK) AND ARRAY (VCBLK) ! 20181: * ! 20182: * PRINT DATATYPE ( PROTOTYPE ) BLANK NUMBER IDVAL ! 20183: * ! 20184: {PRV13{MOV{R9{R10{{PRESERVE ARGUMENT ! 20185: {{JSR{DTYPE{{{GET DATATYPE NAME ! 20186: {{JSR{PRTST{{{PRINT DATATYPE NAME ! 20187: {{MOV{#CH$PP{R6{{LOAD LEFT PAREN ! 20188: {{JSR{PRTCH{{{PRINT LEFT PAREN ! 20189: {{MOV{4*TBLEN(R10){R6{{LOAD LENGTH OF BLOCK (=VCLEN) ! 20190: {{BTW{R6{{{CONVERT TO WORD COUNT ! 20191: {{SUB{#TBSI${R6{{ALLOW FOR STANDARD FIELDS ! 20192: {{BEQ{(R10){#B$TBT{PRV14{JUMP IF TABLE ! 20193: {{ADD{#VCTBD{R6{{FOR VCBLK, ADJUST SIZE ! 20194: * ! 20195: * PRINT PROTOTYPE ! 20196: * ! 20197: {PRV14{MTI{R6{{{MOVE AS INTEGER ! 20198: {{JSR{PRTIN{{{PRINT INTEGER PROTOTYPE ! 20199: {{BRN{PRV06{{{MERGE BACK FOR REST ! 20200: {{EJC{{{{ ! 20201: * ! 20202: * PRTVL (CONTINUED) ! 20203: * ! 20204: * HERE FOR BUFFER (BCBLK) ! 20205: * ! 20206: {PRV15{MOV{R9{R10{{PRESERVE ARGUMENT ! 20207: {{MOV{#SCBUF{R9{{POINT TO DATATYPE NAME (BUFFER) ! 20208: {{JSR{PRTST{{{PRINT IT ! 20209: {{MOV{#CH$PP{R6{{LOAD LEFT PAREN ! 20210: {{JSR{PRTCH{{{PRINT LEFT PAREN ! 20211: {{MOV{4*BCBUF(R10){R9{{POINT TO BFBLK ! 20212: {{MTI{4*BFALC(R9){{{LOAD ALLOCATION SIZE ! 20213: {{JSR{PRTIN{{{PRINT IT ! 20214: {{MOV{#CH$CM{R6{{LOAD COMMA ! 20215: {{JSR{PRTCH{{{PRINT IT ! 20216: {{MTI{4*BCLEN(R10){{{LOAD DEFINED LENGTH ! 20217: {{JSR{PRTIN{{{PRINT IT ! 20218: {{BRN{PRV06{{{MERGE TO FINISH UP ! 20219: {{ENP{{{{END PROCEDURE PRTVL ! 20220: {{EJC{{{{ ! 20221: * ! 20222: * PRTVN -- PRINT NATURAL VARIABLE NAME ! 20223: * ! 20224: * PRTVN PRINTS THE NAME OF A NATURAL VARIABLE ! 20225: * ! 20226: * (XR) POINTER TO VRBLK ! 20227: * JSR PRTVN CALL TO PRINT VARIABLE NAME ! 20228: * ! 20229: {PRTVN{PRC{E{0{{ENTRY POINT ! 20230: {{MOV{R9{-(SP){{STACK VRBLK POINTER ! 20231: {{ADD{#4*VRSOF{R9{{POINT TO POSSIBLE STRING NAME ! 20232: {{BNZ{4*SCLEN(R9){PRVN1{{JUMP IF NOT SYSTEM VARIABLE ! 20233: {{MOV{4*VRSVO(R9){R9{{POINT TO SVBLK WITH NAME ! 20234: * ! 20235: * MERGE HERE WITH DUMMY SCBLK POINTER IN XR ! 20236: * ! 20237: {PRVN1{JSR{PRTST{{{PRINT STRING NAME OF VARIABLE ! 20238: {{MOV{(SP)+{R9{{RESTORE VRBLK POINTER ! 20239: {{EXI{{{{RETURN TO PRTVN CALLER ! 20240: {{ENP{{{{END PROCEDURE PRTVN ! 20241: {{EJC{{{{ ! 20242: * ! 20243: * RCBLD -- BUILD A REAL BLOCK ! 20244: * ! 20245: * (RA) REAL VALUE FOR RCBLK ! 20246: * JSR RCBLD CALL TO BUILD REAL BLOCK ! 20247: * (XR) POINTER TO RESULT RCBLK ! 20248: * (WA) DESTROYED ! 20249: * ! 20250: {RCBLD{PRC{E{0{{ENTRY POINT ! 20251: {{MOV{DNAMP{R9{{LOAD POINTER TO NEXT AVAILABLE LOC ! 20252: {{ADD{#4*RCSI${R9{{POINT PAST NEW RCBLK ! 20253: {{BLO{R9{DNAME{RCBL1{JUMP IF THERE IS ROOM ! 20254: {{MOV{#4*RCSI${R6{{ELSE LOAD RCBLK LENGTH ! 20255: {{JSR{ALLOC{{{USE STANDARD ALLOCATOR TO GET BLOCK ! 20256: {{ADD{R6{R9{{POINT PAST BLOCK TO MERGE ! 20257: * ! 20258: * MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED ! 20259: * ! 20260: {RCBL1{MOV{R9{DNAMP{{SET NEW POINTER ! 20261: {{SUB{#4*RCSI${R9{{POINT BACK TO START OF BLOCK ! 20262: {{MOV{#B$RCL{(R9){{STORE TYPE WORD ! 20263: {{STR{4*RCVAL(R9){{{STORE REAL VALUE IN RCBLK ! 20264: {{EXI{{{{RETURN TO RCBLD CALLER ! 20265: {{ENP{{{{END PROCEDURE RCBLD ! 20266: {{EJC{{{{ ! 20267: * ! 20268: * READR -- READ NEXT SOURCE IMAGE AT COMPILE TIME ! 20269: * ! 20270: * READR IS USED TO READ THE NEXT SOURCE IMAGE. TO PROCESS ! 20271: * CONTINUATION CARDS PROPERLY, THE COMPILER MUST READ ONE ! 20272: * LINE AHEAD. THUS READR DOES NOT DESTROY THE CURRENT IMAGE ! 20273: * SEE ALSO THE NEXTS ROUTINE WHICH ACTUALLY GETS THE IMAGE. ! 20274: * ! 20275: * JSR READR CALL TO READ NEXT IMAGE ! 20276: * (XR) PTR TO NEXT IMAGE (0 IF NONE) ! 20277: * (R$CNI) COPY OF POINTER ! 20278: * (WA,WB,WC,XL) DESTROYED ! 20279: * ! 20280: {READR{PRC{E{0{{ENTRY POINT ! 20281: {{MOV{R$CNI{R9{{GET PTR TO NEXT IMAGE ! 20282: {{BNZ{R9{READ3{{EXIT IF ALREADY READ ! 20283: {{BNE{STAGE{#STGIC{READ3{EXIT IF NOT INITIAL COMPILE ! 20284: {{MOV{CSWIN{R6{{MAX READ LENGTH ! 20285: {{JSR{ALOCS{{{ALLOCATE BUFFER ! 20286: {{JSR{SYSRD{{{READ INPUT IMAGE ! 20287: {{PPM{READ4{{{JUMP IF END OF FILE ! 20288: {{MNZ{R7{{{SET TRIMR TO PERFORM TRIM ! 20289: {{BLE{4*SCLEN(R9){CSWIN{READ1{USE SMALLER OF STRING LNTH .. ! 20290: {{MOV{CSWIN{4*SCLEN(R9){{... AND XXX OF -INXXX ! 20291: * ! 20292: * PERFORM THE TRIM ! 20293: * ! 20294: {READ1{JSR{TRIMR{{{TRIM TRAILING BLANKS ! 20295: * ! 20296: * MERGE HERE AFTER READ ! 20297: * ! 20298: {READ2{MOV{R9{R$CNI{{STORE COPY OF POINTER ! 20299: * ! 20300: * MERGE HERE IF NO READ ATTEMPTED ! 20301: * ! 20302: {READ3{EXI{{{{RETURN TO READR CALLER ! 20303: * ! 20304: * HERE ON END OF FILE ! 20305: * ! 20306: {READ4{MOV{R9{DNAMP{{POP UNUSED SCBLK ! 20307: {{ZER{R9{{{ZERO PTR AS RESULT ! 20308: {{BRN{READ2{{{MERGE ! 20309: {{ENP{{{{END PROCEDURE READR ! 20310: {{EJC{{{{ ! 20311: * ! 20312: * SBSTR -- BUILD A SUBSTRING ! 20313: * ! 20314: * (XL) PTR TO SCBLK/BFBLK WITH CHARS ! 20315: * (WA) NUMBER OF CHARS IN SUBSTRING ! 20316: * (WB) OFFSET TO FIRST CHAR IN SCBLK ! 20317: * JSR SBSTR CALL TO BUILD SUBSTRING ! 20318: * (XR) PTR TO NEW SCBLK WITH SUBSTRING ! 20319: * (XL) ZERO ! 20320: * (WA,WB,WC,XL,IA) DESTROYED ! 20321: * ! 20322: * NOTE THAT SBSTR IS CALLED WITH A DUMMY STRING POINTER ! 20323: * (POINTING INTO A VRBLK OR SVBLK) TO COPY THE NAME OF A ! 20324: * VARIABLE AS A STANDARD STRING VALUE. ! 20325: * ! 20326: {SBSTR{PRC{E{0{{ENTRY POINT ! 20327: {{BZE{R6{SBST2{{JUMP IF NULL SUBSTRING ! 20328: {{JSR{ALOCS{{{ELSE ALLOCATE SCBLK ! 20329: {{MOV{R8{R6{{MOVE NUMBER OF CHARACTERS ! 20330: {{MOV{R9{R8{{SAVE PTR TO NEW SCBLK ! 20331: {{PLC{R10{R7{{PREPARE TO LOAD CHARS FROM OLD BLK ! 20332: {{PSC{R9{{{PREPARE TO STORE CHARS IN NEW BLK ! 20333: {{MVC{{{{MOVE CHARACTERS TO NEW STRING ! 20334: {{MOV{R8{R9{{THEN RESTORE SCBLK POINTER ! 20335: * ! 20336: * RETURN POINT ! 20337: * ! 20338: {SBST1{ZER{R10{{{CLEAR GARBAGE POINTER IN XL ! 20339: {{EXI{{{{RETURN TO SBSTR CALLER ! 20340: * ! 20341: * HERE FOR NULL SUBSTRING ! 20342: * ! 20343: {SBST2{MOV{#NULLS{R9{{SET NULL STRING AS RESULT ! 20344: {{BRN{SBST1{{{RETURN ! 20345: {{ENP{{{{END PROCEDURE SBSTR ! 20346: {{EJC{{{{ ! 20347: * ! 20348: * SCANE -- SCAN AN ELEMENT ! 20349: * ! 20350: * SCANE IS CALLED AT COMPILE TIME (BY EXPAN ,CMPIL,CNCRD) ! 20351: * TO SCAN ONE ELEMENT FROM THE INPUT IMAGE. ! 20352: * ! 20353: * (SCNCC) NON-ZERO IF CALLED FROM CNCRD ! 20354: * JSR SCANE CALL TO SCAN ELEMENT ! 20355: * (XR) RESULT POINTER (SEE BELOW) ! 20356: * (XL) SYNTAX TYPE CODE (T$XXX) ! 20357: * ! 20358: * THE FOLLOWING GLOBAL LOCATIONS ARE USED. ! 20359: * ! 20360: * R$CIM POINTER TO STRING BLOCK (SCBLK) ! 20361: * FOR CURRENT INPUT IMAGE. ! 20362: * ! 20363: * R$CNI POINTER TO NEXT INPUT IMAGE STRING ! 20364: * POINTER (ZERO IF NONE). ! 20365: * ! 20366: * R$SCP SAVE POINTER (EXIT XR) FROM LAST ! 20367: * CALL IN CASE RESCAN IS SET. ! 20368: * ! 20369: * SCNBL THIS LOCATION IS SET NON-ZERO ON ! 20370: * EXIT IF SCANE SCANNED PAST BLANKS ! 20371: * BEFORE LOCATING THE CURRENT ELEMENT ! 20372: * THE END OF A LINE COUNTS AS BLANKS. ! 20373: * ! 20374: * SCNCC CNCRD SETS THIS NON-ZERO TO SCAN ! 20375: * CONTROL CARD NAMES AND CLEARS IT ! 20376: * ON RETURN ! 20377: * ! 20378: * SCNIL LENGTH OF CURRENT INPUT IMAGE ! 20379: * ! 20380: * SCNGO IF SET NON-ZERO ON ENTRY, F AND S ! 20381: * ARE RETURNED AS SEPARATE SYNTAX ! 20382: * TYPES (NOT LETTERS) (GOTO PRO- ! 20383: * CESSING). SCNGO IS RESET ON EXIT. ! 20384: * ! 20385: * SCNPT OFFSET TO CURRENT LOC IN R$CIM ! 20386: * ! 20387: * SCNRS IF SET NON-ZERO ON ENTRY, SCANE ! 20388: * RETURNS THE SAME RESULT AS ON THE ! 20389: * LAST CALL (RESCAN). SCNRS IS RESET ! 20390: * ON EXIT FROM ANY CALL TO SCANE. ! 20391: * ! 20392: * SCNTP SAVE SYNTAX TYPE FROM LAST ! 20393: * CALL (IN CASE RESCAN IS SET). ! 20394: {{EJC{{{{ ! 20395: * ! 20396: * SCANE (CONTINUED) ! 20397: * ! 20398: * ! 20399: * ! 20400: * ELEMENT SCANNED XL XR ! 20401: * --------------- -- -- ! 20402: * ! 20403: * CONTROL CARD NAME 0 POINTER TO SCBLK FOR NAME ! 20404: * ! 20405: * UNARY OPERATOR T$UOP PTR TO OPERATOR DVBLK ! 20406: * ! 20407: * LEFT PAREN T$LPR T$LPR ! 20408: * ! 20409: * LEFT BRACKET T$LBR T$LBR ! 20410: * ! 20411: * COMMA T$CMA T$CMA ! 20412: * ! 20413: * FUNCTION CALL T$FNC PTR TO FUNCTION VRBLK ! 20414: * ! 20415: * VARIABLE T$VAR PTR TO VRBLK ! 20416: * ! 20417: * STRING CONSTANT T$CON PTR TO SCBLK ! 20418: * ! 20419: * INTEGER CONSTANT T$CON PTR TO ICBLK ! 20420: * ! 20421: * REAL CONSTANT T$CON PTR TO RCBLK ! 20422: * ! 20423: * BINARY OPERATOR T$BOP PTR TO OPERATOR DVBLK ! 20424: * ! 20425: * RIGHT PAREN T$RPR T$RPR ! 20426: * ! 20427: * RIGHT BRACKET T$RBR T$RBR ! 20428: * ! 20429: * COLON T$COL T$COL ! 20430: * ! 20431: * SEMI-COLON T$SMC T$SMC ! 20432: * ! 20433: * F (SCNGO NE 0) T$FGO T$FGO ! 20434: * ! 20435: * S (SCNGO NE 0) T$SGO T$SGO ! 20436: {{EJC{{{{ ! 20437: * ! 20438: * SCANE (CONTINUED) ! 20439: * ! 20440: * ENTRY POINT ! 20441: * ! 20442: {SCANE{PRC{E{0{{ENTRY POINT ! 20443: {{ZER{SCNBL{{{RESET BLANKS FLAG ! 20444: {{MOV{R6{SCNSA{{SAVE WA ! 20445: {{MOV{R7{SCNSB{{SAVE WB ! 20446: {{MOV{R8{SCNSC{{SAVE WC ! 20447: {{BZE{SCNRS{SCN03{{JUMP IF NO RESCAN ! 20448: * ! 20449: * HERE FOR RESCAN REQUEST ! 20450: * ! 20451: {{MOV{SCNTP{R10{{SET PREVIOUS RETURNED SCAN TYPE ! 20452: {{MOV{R$SCP{R9{{SET PREVIOUS RETURNED POINTER ! 20453: {{ZER{SCNRS{{{RESET RESCAN SWITCH ! 20454: {{BRN{SCN13{{{JUMP TO EXIT ! 20455: * ! 20456: * COME HERE TO READ NEW IMAGE TO TEST FOR CONTINUATION ! 20457: * ! 20458: {SCN01{JSR{READR{{{READ NEXT IMAGE ! 20459: {{MOV{#4*DVUBS{R7{{SET WB FOR NOT READING NAME ! 20460: {{BZE{R9{SCN30{{TREAT AS SEMI-COLON IF NONE ! 20461: {{PLC{R9{{{ELSE POINT TO FIRST CHARACTER ! 20462: {{LCH{R8{(R9){{LOAD FIRST CHARACTER ! 20463: {{BEQ{R8{#CH$DT{SCN02{JUMP IF DOT FOR CONTINUATION ! 20464: {{BNE{R8{#CH$PL{SCN30{ELSE TREAT AS SEMICOLON UNLESS PLUS ! 20465: * ! 20466: * HERE FOR CONTINUATION LINE ! 20467: * ! 20468: {SCN02{JSR{NEXTS{{{ACQUIRE NEXT SOURCE IMAGE ! 20469: {{MOV{#NUM01{SCNPT{{SET SCAN POINTER PAST CONTINUATION ! 20470: {{MNZ{SCNBL{{{SET BLANKS FLAG ! 20471: {{EJC{{{{ ! 20472: * ! 20473: * SCANE (CONTINUED) ! 20474: * ! 20475: * MERGE HERE TO SCAN NEXT ELEMENT ON CURRENT LINE ! 20476: * ! 20477: {SCN03{MOV{SCNPT{R6{{LOAD CURRENT OFFSET ! 20478: {{BEQ{R6{SCNIL{SCN01{CHECK CONTINUATION IF END ! 20479: {{MOV{R$CIM{R10{{POINT TO CURRENT LINE ! 20480: {{PLC{R10{R6{{POINT TO CURRENT CHARACTER ! 20481: {{MOV{R6{SCNSE{{SET START OF ELEMENT LOCATION ! 20482: {{MOV{#OPDVS{R8{{POINT TO OPERATOR DV LIST ! 20483: {{MOV{#4*DVUBS{R7{{SET CONSTANT FOR OPERATOR CIRCUIT ! 20484: {{BRN{SCN06{{{START SCANNING ! 20485: * ! 20486: * LOOP HERE TO IGNORE LEADING BLANKS AND TABS ! 20487: * ! 20488: {SCN05{BZE{R7{SCN10{{JUMP IF TRAILING ! 20489: {{ICV{SCNSE{{{INCREMENT START OF ELEMENT ! 20490: {{BEQ{R6{SCNIL{SCN01{JUMP IF END OF IMAGE ! 20491: {{MNZ{SCNBL{{{NOTE BLANKS SEEN ! 20492: * ! 20493: * THE FOLLOWING JUMP IS USED REPEATEDLY FOR SCANNING OUT ! 20494: * THE CHARACTERS OF A NUMERIC CONSTANT OR VARIABLE NAME. ! 20495: * THE REGISTERS ARE USED AS FOLLOWS. ! 20496: * ! 20497: * (XR) SCRATCH ! 20498: * (XL) PTR TO NEXT CHARACTER ! 20499: * (WA) CURRENT SCAN OFFSET ! 20500: * (WB) *DVUBS (0 IF SCANNING NAME,CONST) ! 20501: * (WC) =OPDVS (0 IF SCANNING CONSTANT) ! 20502: * ! 20503: {SCN06{LCH{R9{(R10)+{{GET NEXT CHARACTER ! 20504: {{ICV{R6{{{BUMP SCAN OFFSET ! 20505: {{MOV{R6{SCNPT{{STORE OFFSET PAST CHAR SCANNED ! 20506: {{BLO{#CFP$U{R9{SCN07{QUICK CHECK FOR OTHER CHAR ! 20507: {{BSW{R9{CFP$U{SCN07{SWITCH ON SCANNED CHARACTER ! 20508: * ! 20509: * SWITCH TABLE FOR SWITCH ON CHARACTER ! 20510: * ! 20511: {{EJC{{{{ ! 20512: * ! 20513: * SCANE (CONTINUED) ! 20514: * ! 20515: {{EJC{{{{ ! 20516: * ! 20517: * SCANE (CONTINUED) ! 20518: * ! 20519: {{IFF{DUMMY{SCN07{{ ! 20520: {{IFF{DUMMY{SCN07{{ ! 20521: {{IFF{DUMMY{SCN07{{ ! 20522: {{IFF{DUMMY{SCN07{{ ! 20523: {{IFF{DUMMY{SCN07{{ ! 20524: {{IFF{DUMMY{SCN07{{ ! 20525: {{IFF{DUMMY{SCN07{{ ! 20526: {{IFF{DUMMY{SCN07{{ ! 20527: {{IFF{DUMMY{SCN07{{ ! 20528: {{IFF{CH$HT{SCN05{{HORIZONTAL TAB ! 20529: {{IFF{DUMMY{SCN07{{ ! 20530: {{IFF{DUMMY{SCN07{{ ! 20531: {{IFF{DUMMY{SCN07{{ ! 20532: {{IFF{DUMMY{SCN07{{ ! 20533: {{IFF{DUMMY{SCN07{{ ! 20534: {{IFF{DUMMY{SCN07{{ ! 20535: {{IFF{DUMMY{SCN07{{ ! 20536: {{IFF{DUMMY{SCN07{{ ! 20537: {{IFF{DUMMY{SCN07{{ ! 20538: {{IFF{DUMMY{SCN07{{ ! 20539: {{IFF{DUMMY{SCN07{{ ! 20540: {{IFF{DUMMY{SCN07{{ ! 20541: {{IFF{DUMMY{SCN07{{ ! 20542: {{IFF{DUMMY{SCN07{{ ! 20543: {{IFF{DUMMY{SCN07{{ ! 20544: {{IFF{DUMMY{SCN07{{ ! 20545: {{IFF{DUMMY{SCN07{{ ! 20546: {{IFF{DUMMY{SCN07{{ ! 20547: {{IFF{DUMMY{SCN07{{ ! 20548: {{IFF{DUMMY{SCN07{{ ! 20549: {{IFF{DUMMY{SCN07{{ ! 20550: {{IFF{DUMMY{SCN07{{ ! 20551: {{IFF{CH$BL{SCN05{{BLANK ! 20552: {{IFF{CH$EX{SCN37{{EXCLAMATION MARK ! 20553: {{IFF{CH$DQ{SCN17{{DOUBLE QUOTE ! 20554: {{IFF{CH$NM{SCN41{{NUMBER SIGN ! 20555: {{IFF{CH$DL{SCN36{{DOLLAR ! 20556: {{IFF{CH$PC{SCN38{{PERCENT ! 20557: {{IFF{CH$AM{SCN44{{AMPERSAND ! 20558: {{IFF{CH$SQ{SCN16{{SINGLE QUOTE ! 20559: {{IFF{CH$PP{SCN25{{LEFT PAREN ! 20560: {{IFF{CH$RP{SCN26{{RIGHT PAREN ! 20561: {{IFF{CH$AS{SCN49{{ASTERISK ! 20562: {{IFF{CH$PL{SCN33{{PLUS ! 20563: {{IFF{CH$CM{SCN31{{COMMA ! 20564: {{IFF{CH$MN{SCN34{{MINUS ! 20565: {{IFF{CH$DT{SCN32{{DOT ! 20566: {{IFF{CH$SL{SCN40{{SLASH ! 20567: {{IFF{CH$D0{SCN08{{DIGIT 0 ! 20568: {{IFF{CH$D1{SCN08{{DIGIT 1 ! 20569: {{IFF{CH$D2{SCN08{{DIGIT 2 ! 20570: {{IFF{CH$D3{SCN08{{DIGIT 3 ! 20571: {{IFF{CH$D4{SCN08{{DIGIT 4 ! 20572: {{IFF{CH$D5{SCN08{{DIGIT 5 ! 20573: {{IFF{CH$D6{SCN08{{DIGIT 6 ! 20574: {{IFF{CH$D7{SCN08{{DIGIT 7 ! 20575: {{IFF{CH$D8{SCN08{{DIGIT 8 ! 20576: {{IFF{CH$D9{SCN08{{DIGIT 9 ! 20577: {{IFF{CH$CL{SCN29{{COLON ! 20578: {{IFF{CH$SM{SCN30{{SEMI-COLON ! 20579: {{IFF{CH$BB{SCN28{{LEFT BRACKET ! 20580: {{IFF{CH$EQ{SCN46{{EQUAL ! 20581: {{IFF{CH$RB{SCN27{{RIGHT BRACKET ! 20582: {{IFF{CH$QU{SCN45{{QUESTION MARK ! 20583: {{IFF{CH$AT{SCN42{{AT ! 20584: {{IFF{CH$LA{SCN09{{LETTER A ! 20585: {{IFF{CH$LB{SCN09{{LETTER B ! 20586: {{IFF{CH$LC{SCN09{{LETTER C ! 20587: {{IFF{CH$LD{SCN09{{LETTER D ! 20588: {{IFF{CH$LE{SCN09{{LETTER E ! 20589: {{IFF{CH$LF{SCN20{{LETTER F ! 20590: {{IFF{CH$LG{SCN09{{LETTER G ! 20591: {{IFF{CH$LH{SCN09{{LETTER H ! 20592: {{IFF{CH$LI{SCN09{{LETTER I ! 20593: {{IFF{CH$LJ{SCN09{{LETTER J ! 20594: {{IFF{CH$LK{SCN09{{LETTER K ! 20595: {{IFF{CH$LL{SCN09{{LETTER L ! 20596: {{IFF{CH$LM{SCN09{{LETTER M ! 20597: {{IFF{CH$LN{SCN09{{LETTER N ! 20598: {{IFF{CH$LO{SCN09{{LETTER O ! 20599: {{IFF{CH$LP{SCN09{{LETTER P ! 20600: {{IFF{CH$LQ{SCN09{{LETTER Q ! 20601: {{IFF{CH$LR{SCN09{{LETTER R ! 20602: {{IFF{CH$LS{SCN21{{LETTER S ! 20603: {{IFF{CH$LT{SCN09{{LETTER T ! 20604: {{IFF{CH$LU{SCN09{{LETTER U ! 20605: {{IFF{CH$LV{SCN09{{LETTER V ! 20606: {{IFF{CH$LW{SCN09{{LETTER W ! 20607: {{IFF{CH$LX{SCN09{{LETTER X ! 20608: {{IFF{CH$LY{SCN09{{LETTER Y ! 20609: {{IFF{CH$L${SCN09{{LETTER Z ! 20610: {{IFF{CH$OB{SCN28{{LEFT BRACKET ! 20611: {{IFF{DUMMY{SCN07{{ ! 20612: {{IFF{CH$CB{SCN27{{RIGHT BRACKET ! 20613: {{IFF{DUMMY{SCN07{{ ! 20614: {{IFF{CH$UN{SCN24{{UNDERLINE ! 20615: {{IFF{DUMMY{SCN07{{ ! 20616: {{IFF{CH$$A{SCN09{{SHIFTED A ! 20617: {{IFF{CH$$B{SCN09{{SHIFTED B ! 20618: {{IFF{CH$$C{SCN09{{SHIFTED C ! 20619: {{IFF{CH$$D{SCN09{{SHIFTED D ! 20620: {{IFF{CH$$E{SCN09{{SHIFTED E ! 20621: {{IFF{CH$$F{SCN20{{SHIFTED F ! 20622: {{IFF{CH$$G{SCN09{{SHIFTED G ! 20623: {{IFF{CH$$H{SCN09{{SHIFTED H ! 20624: {{IFF{CH$$I{SCN09{{SHIFTED I ! 20625: {{IFF{CH$$J{SCN09{{SHIFTED J ! 20626: {{IFF{CH$$K{SCN09{{SHIFTED K ! 20627: {{IFF{CH$$L{SCN09{{SHIFTED L ! 20628: {{IFF{CH$$M{SCN09{{SHIFTED M ! 20629: {{IFF{CH$$N{SCN09{{SHIFTED N ! 20630: {{IFF{CH$$O{SCN09{{SHIFTED O ! 20631: {{IFF{CH$$P{SCN09{{SHIFTED P ! 20632: {{IFF{CH$$Q{SCN09{{SHIFTED Q ! 20633: {{IFF{CH$$R{SCN09{{SHIFTED R ! 20634: {{IFF{CH$$S{SCN21{{SHIFTED S ! 20635: {{IFF{CH$$T{SCN09{{SHIFTED T ! 20636: {{IFF{CH$$U{SCN09{{SHIFTED U ! 20637: {{IFF{CH$$V{SCN09{{SHIFTED V ! 20638: {{IFF{CH$$W{SCN09{{SHIFTED W ! 20639: {{IFF{CH$$X{SCN09{{SHIFTED X ! 20640: {{IFF{CH$$Y{SCN09{{SHIFTED Y ! 20641: {{IFF{CH$$${SCN09{{SHIFTED Z ! 20642: {{IFF{DUMMY{SCN07{{ ! 20643: {{IFF{CH$BR{SCN43{{VERTICAL BAR ! 20644: {{IFF{DUMMY{SCN07{{ ! 20645: {{IFF{CH$NT{SCN35{{NOT ! 20646: {{IFF{DUMMY{SCN07{{ ! 20647: {{ESW{{{{END SWITCH ON CHARACTER ! 20648: * ! 20649: * HERE FOR ILLEGAL CHARACTER (UNDERLINE MERGES) ! 20650: * ! 20651: {SCN07{BZE{R7{SCN10{{JUMP IF SCANNING NAME OR CONSTANT ! 20652: {{ERB{230{SYNTAX{{ERROR. ILLEGAL CHARACTER ! 20653: {{EJC{{{{ ! 20654: * ! 20655: * SCANE (CONTINUED) ! 20656: * ! 20657: * HERE FOR DIGITS 0-9 ! 20658: * ! 20659: {SCN08{BZE{R7{SCN09{{KEEP SCANNING IF NAME/CONSTANT ! 20660: {{ZER{R8{{{ELSE SET FLAG FOR SCANNING CONSTANT ! 20661: * ! 20662: * HERE FOR LETTER. LOOP HERE WHEN SCANNING NAME/CONSTANT ! 20663: * ! 20664: {SCN09{BEQ{R6{SCNIL{SCN11{JUMP IF END OF IMAGE ! 20665: {{ZER{R7{{{SET FLAG FOR SCANNING NAME/CONST ! 20666: {{BRN{SCN06{{{MERGE BACK TO CONTINUE SCAN ! 20667: * ! 20668: * COME HERE FOR DELIMITER ENDING NAME OR CONSTANT ! 20669: * ! 20670: {SCN10{DCV{R6{{{RESET OFFSET TO POINT TO DELIMITER ! 20671: * ! 20672: * COME HERE AFTER FINISHING SCAN OF NAME OR CONSTANT ! 20673: * ! 20674: {SCN11{MOV{R6{SCNPT{{STORE UPDATED SCAN OFFSET ! 20675: {{MOV{SCNSE{R7{{POINT TO START OF ELEMENT ! 20676: {{SUB{R7{R6{{GET NUMBER OF CHARACTERS ! 20677: {{MOV{R$CIM{R10{{POINT TO LINE IMAGE ! 20678: {{BNZ{R8{SCN15{{JUMP IF NAME ! 20679: * ! 20680: * HERE AFTER SCANNING OUT NUMERIC CONSTANT ! 20681: * ! 20682: {{JSR{SBSTR{{{GET STRING FOR CONSTANT ! 20683: {{MOV{R9{DNAMP{{DELETE FROM STORAGE (NOT NEEDED) ! 20684: {{JSR{GTNUM{{{CONVERT TO NUMERIC ! 20685: {{PPM{SCN14{{{JUMP IF CONVERSION FAILURE ! 20686: * ! 20687: * MERGE HERE TO EXIT WITH CONSTANT ! 20688: * ! 20689: {SCN12{MOV{#T$CON{R10{{SET RESULT TYPE OF CONSTANT ! 20690: {{EJC{{{{ ! 20691: * ! 20692: * SCANE (CONTINUED) ! 20693: * ! 20694: * COMMON EXIT POINT (XR,XL) SET ! 20695: * ! 20696: {SCN13{MOV{SCNSA{R6{{RESTORE WA ! 20697: {{MOV{SCNSB{R7{{RESTORE WB ! 20698: {{MOV{SCNSC{R8{{RESTORE WC ! 20699: {{MOV{R9{R$SCP{{SAVE XR IN CASE RESCAN ! 20700: {{MOV{R10{SCNTP{{SAVE XL IN CASE RESCAN ! 20701: {{ZER{SCNGO{{{RESET POSSIBLE GOTO FLAG ! 20702: {{EXI{{{{RETURN TO SCANE CALLER ! 20703: * ! 20704: * HERE IF CONVERSION ERROR ON NUMERIC ITEM ! 20705: * ! 20706: {SCN14{ERB{231{SYNTAX{{ERROR. INVALID NUMERIC ITEM ! 20707: * ! 20708: * HERE AFTER SCANNING OUT VARIABLE NAME ! 20709: * ! 20710: {SCN15{JSR{SBSTR{{{BUILD STRING NAME OF VARIABLE ! 20711: {{BNZ{SCNCC{SCN13{{RETURN IF CNCRD CALL ! 20712: {{JSR{GTNVR{{{LOCATE/BUILD VRBLK ! 20713: {{PPM{{{{DUMMY (UNUSED) ERROR RETURN ! 20714: {{MOV{#T$VAR{R10{{SET TYPE AS VARIABLE ! 20715: {{BRN{SCN13{{{BACK TO EXIT ! 20716: * ! 20717: * HERE FOR SINGLE QUOTE (START OF STRING CONSTANT) ! 20718: * ! 20719: {SCN16{BZE{R7{SCN10{{TERMINATOR IF SCANNING NAME OR CNST ! 20720: {{MOV{#CH$SQ{R7{{SET TERMINATOR AS SINGLE QUOTE ! 20721: {{BRN{SCN18{{{MERGE ! 20722: * ! 20723: * HERE FOR DOUBLE QUOTE (START OF STRING CONSTANT) ! 20724: * ! 20725: {SCN17{BZE{R7{SCN10{{TERMINATOR IF SCANNING NAME OR CNST ! 20726: {{MOV{#CH$DQ{R7{{SET DOUBLE QUOTE TERMINATOR, MERGE ! 20727: * ! 20728: * LOOP TO SCAN OUT STRING CONSTANT ! 20729: * ! 20730: {SCN18{BEQ{R6{SCNIL{SCN19{ERROR IF END OF IMAGE ! 20731: {{LCH{R8{(R10)+{{ELSE LOAD NEXT CHARACTER ! 20732: {{ICV{R6{{{BUMP OFFSET ! 20733: {{BNE{R8{R7{SCN18{LOOP BACK IF NOT TERMINATOR ! 20734: {{EJC{{{{ ! 20735: * ! 20736: * SCANE (CONTINUED) ! 20737: * ! 20738: * HERE AFTER SCANNING OUT STRING CONSTANT ! 20739: * ! 20740: {{MOV{SCNPT{R7{{POINT TO FIRST CHARACTER ! 20741: {{MOV{R6{SCNPT{{SAVE OFFSET PAST FINAL QUOTE ! 20742: {{DCV{R6{{{POINT BACK PAST LAST CHARACTER ! 20743: {{SUB{R7{R6{{GET NUMBER OF CHARACTERS ! 20744: {{MOV{R$CIM{R10{{POINT TO INPUT IMAGE ! 20745: {{JSR{SBSTR{{{BUILD SUBSTRING VALUE ! 20746: {{BRN{SCN12{{{BACK TO EXIT WITH CONSTANT RESULT ! 20747: * ! 20748: * HERE IF NO MATCHING QUOTE FOUND ! 20749: * ! 20750: {SCN19{MOV{R6{SCNPT{{SET UPDATED SCAN POINTER ! 20751: {{ERB{232{SYNTAX{{ERROR. UNMATCHED STRING QUOTE ! 20752: * ! 20753: * HERE FOR F (POSSIBLE FAILURE GOTO) ! 20754: * ! 20755: {SCN20{MOV{#T$FGO{R9{{SET RETURN CODE FOR FAIL GOTO ! 20756: {{BRN{SCN22{{{JUMP TO MERGE ! 20757: * ! 20758: * HERE FOR S (POSSIBLE SUCCESS GOTO) ! 20759: * ! 20760: {SCN21{MOV{#T$SGO{R9{{SET SUCCESS GOTO AS RETURN CODE ! 20761: * ! 20762: * SPECIAL GOTO CASES MERGE HERE ! 20763: * ! 20764: {SCN22{BZE{SCNGO{SCN09{{TREAT AS NORMAL LETTER IF NOT GOTO ! 20765: * ! 20766: * MERGE HERE FOR SPECIAL CHARACTER EXIT ! 20767: * ! 20768: {SCN23{BZE{R7{SCN10{{JUMP IF END OF NAME/CONSTANT ! 20769: {{MOV{R9{R10{{ELSE COPY CODE ! 20770: {{BRN{SCN13{{{AND JUMP TO EXIT ! 20771: * ! 20772: * HERE FOR UNDERLINE ! 20773: * ! 20774: {SCN24{BZE{R7{SCN09{{PART OF NAME IF SCANNING NAME ! 20775: {{BRN{SCN07{{{ELSE ILLEGAL ! 20776: {{EJC{{{{ ! 20777: * ! 20778: * SCANE (CONTINUED) ! 20779: * ! 20780: * HERE FOR LEFT PAREN ! 20781: * ! 20782: {SCN25{MOV{#T$LPR{R9{{SET LEFT PAREN RETURN CODE ! 20783: {{BNZ{R7{SCN23{{RETURN LEFT PAREN UNLESS NAME ! 20784: {{BZE{R8{SCN10{{DELIMITER IF SCANNING CONSTANT ! 20785: * ! 20786: * HERE FOR LEFT PAREN AFTER NAME (FUNCTION CALL) ! 20787: * ! 20788: {{MOV{SCNSE{R7{{POINT TO START OF NAME ! 20789: {{MOV{R6{SCNPT{{SET POINTER PAST LEFT PAREN ! 20790: {{DCV{R6{{{POINT BACK PAST LAST CHAR OF NAME ! 20791: {{SUB{R7{R6{{GET NAME LENGTH ! 20792: {{MOV{R$CIM{R10{{POINT TO INPUT IMAGE ! 20793: {{JSR{SBSTR{{{GET STRING NAME FOR FUNCTION ! 20794: {{JSR{GTNVR{{{LOCATE/BUILD VRBLK ! 20795: {{PPM{{{{DUMMY (UNUSED) ERROR RETURN ! 20796: {{MOV{#T$FNC{R10{{SET CODE FOR FUNCTION CALL ! 20797: {{BRN{SCN13{{{BACK TO EXIT ! 20798: * ! 20799: * PROCESSING FOR SPECIAL CHARACTERS ! 20800: * ! 20801: {SCN26{MOV{#T$RPR{R9{{RIGHT PAREN, SET CODE ! 20802: {{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT ! 20803: * ! 20804: {SCN27{MOV{#T$RBR{R9{{RIGHT BRACKET, SET CODE ! 20805: {{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT ! 20806: * ! 20807: {SCN28{MOV{#T$LBR{R9{{LEFT BRACKET, SET CODE ! 20808: {{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT ! 20809: * ! 20810: {SCN29{MOV{#T$COL{R9{{COLON, SET CODE ! 20811: {{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT ! 20812: * ! 20813: {SCN30{MOV{#T$SMC{R9{{SEMI-COLON, SET CODE ! 20814: {{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT ! 20815: * ! 20816: {SCN31{MOV{#T$CMA{R9{{COMMA, SET CODE ! 20817: {{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT ! 20818: {{EJC{{{{ ! 20819: * ! 20820: * SCANE (CONTINUED) ! 20821: * ! 20822: * HERE FOR OPERATORS. ON ENTRY, WC POINTS TO THE TABLE OF ! 20823: * OPERATOR DOPE VECTORS AND WB IS THE INCREMENT TO STEP ! 20824: * TO THE NEXT PAIR (BINARY/UNARY) OF DOPE VECTORS IN THE ! 20825: * LIST. ON REACHING SCN46, THE POINTER HAS BEEN ADJUSTED TO ! 20826: * POINT TO THE APPROPRIATE PAIR OF DOPE VECTORS. ! 20827: * THE FIRST THREE ENTRIES ARE SPECIAL SINCE THEY CAN OCCUR ! 20828: * AS PART OF A VARIABLE NAME (.) OR CONSTANT (.+-). ! 20829: * ! 20830: {SCN32{BZE{R7{SCN09{{DOT CAN BE PART OF NAME OR CONSTANT ! 20831: {{ADD{R7{R8{{ELSE BUMP POINTER ! 20832: * ! 20833: {SCN33{BZE{R8{SCN09{{PLUS CAN BE PART OF CONSTANT ! 20834: {{BZE{R7{SCN48{{PLUS CANNOT BE PART OF NAME ! 20835: {{ADD{R7{R8{{ELSE BUMP POINTER ! 20836: * ! 20837: {SCN34{BZE{R8{SCN09{{MINUS CAN BE PART OF CONSTANT ! 20838: {{BZE{R7{SCN48{{MINUS CANNOT BE PART OF NAME ! 20839: {{ADD{R7{R8{{ELSE BUMP POINTER ! 20840: * ! 20841: {SCN35{ADD{R7{R8{{NOT ! 20842: {SCN36{ADD{R7{R8{{DOLLAR ! 20843: {SCN37{ADD{R7{R8{{EXCLAMATION ! 20844: {SCN38{ADD{R7{R8{{PERCENT ! 20845: {SCN39{ADD{R7{R8{{ASTERISK ! 20846: {SCN40{ADD{R7{R8{{SLASH ! 20847: {SCN41{ADD{R7{R8{{NUMBER SIGN ! 20848: {SCN42{ADD{R7{R8{{AT SIGN ! 20849: {SCN43{ADD{R7{R8{{VERTICAL BAR ! 20850: {SCN44{ADD{R7{R8{{AMPERSAND ! 20851: {SCN45{ADD{R7{R8{{QUESTION MARK ! 20852: * ! 20853: * ALL OPERATORS COME HERE (EQUAL MERGES DIRECTLY) ! 20854: * (WC) POINTS TO THE BINARY/UNARY PAIR OF OPERATOR DVBLKS. ! 20855: * ! 20856: {SCN46{BZE{R7{SCN10{{OPERATOR TERMINATES NAME/CONSTANT ! 20857: {{MOV{R8{R9{{ELSE COPY DV POINTER ! 20858: {{LCH{R8{(R10){{LOAD NEXT CHARACTER ! 20859: {{MOV{#T$BOP{R10{{SET BINARY OP IN CASE ! 20860: {{BEQ{R6{SCNIL{SCN47{SHOULD BE BINARY IF IMAGE END ! 20861: {{BEQ{R8{#CH$BL{SCN47{SHOULD BE BINARY IF FOLLOWED BY BLK ! 20862: {{BEQ{R8{#CH$HT{SCN47{JUMP IF HORIZONTAL TAB ! 20863: {{BEQ{R8{#CH$SM{SCN47{SEMICOLON CAN IMMEDIATELY FOLLOW = ! 20864: * ! 20865: * HERE FOR UNARY OPERATOR ! 20866: * ! 20867: {{ADD{#4*DVBS${R9{{POINT TO DV FOR UNARY OP ! 20868: {{MOV{#T$UOP{R10{{SET TYPE FOR UNARY OPERATOR ! 20869: {{BLE{SCNTP{#T$UOK{SCN13{OK UNARY IF OK PRECEDING ELEMENT ! 20870: {{EJC{{{{ ! 20871: * ! 20872: * SCANE (CONTINUED) ! 20873: * ! 20874: * MERGE HERE TO REQUIRE PRECEDING BLANKS ! 20875: * ! 20876: {SCN47{BNZ{SCNBL{SCN13{{ALL OK IF PRECEDING BLANKS, EXIT ! 20877: * ! 20878: * FAIL OPERATOR IN THIS POSITION ! 20879: * ! 20880: {SCN48{ERB{233{SYNTAX{{ERROR. INVALID USE OF OPERATOR ! 20881: * ! 20882: * HERE FOR ASTERISK, COULD BE ** SUBSTITUTE FOR EXCLAMATION ! 20883: * ! 20884: {SCN49{BZE{R7{SCN10{{END OF NAME IF SCANNING NAME ! 20885: {{BEQ{R6{SCNIL{SCN39{NOT ** IF * AT IMAGE END ! 20886: {{MOV{R6{R9{{ELSE SAVE OFFSET PAST FIRST * ! 20887: {{MOV{R6{SCNOF{{SAVE ANOTHER COPY ! 20888: {{LCH{R6{(R10)+{{LOAD NEXT CHARACTER ! 20889: {{BNE{R6{#CH$AS{SCN50{NOT ** IF NEXT CHAR NOT * ! 20890: {{ICV{R9{{{ELSE STEP OFFSET PAST SECOND * ! 20891: {{BEQ{R9{SCNIL{SCN51{OK EXCLAM IF END OF IMAGE ! 20892: {{LCH{R6{(R10){{ELSE LOAD NEXT CHARACTER ! 20893: {{BEQ{R6{#CH$BL{SCN51{EXCLAMATION IF BLANK ! 20894: {{BEQ{R6{#CH$HT{SCN51{EXCLAMATION IF HORIZONTAL TAB ! 20895: * ! 20896: * UNARY * ! 20897: * ! 20898: {SCN50{MOV{SCNOF{R6{{RECOVER STORED OFFSET ! 20899: {{MOV{R$CIM{R10{{POINT TO LINE AGAIN ! 20900: {{PLC{R10{R6{{POINT TO CURRENT CHAR ! 20901: {{BRN{SCN39{{{MERGE WITH UNARY * ! 20902: * ! 20903: * HERE FOR ** AS SUBSTITUTE FOR EXCLAMATION ! 20904: * ! 20905: {SCN51{MOV{R9{SCNPT{{SAVE SCAN POINTER PAST 2ND * ! 20906: {{MOV{R9{R6{{COPY SCAN POINTER ! 20907: {{BRN{SCN37{{{MERGE WITH EXCLAMATION ! 20908: {{ENP{{{{END PROCEDURE SCANE ! 20909: {{EJC{{{{ ! 20910: * ! 20911: * SCNGF -- SCAN GOTO FIELD ! 20912: * ! 20913: * SCNGF IS CALLED FROM CMPIL TO SCAN AND ANALYZE A GOTO ! 20914: * FIELD INCLUDING THE SURROUNDING BRACKETS OR PARENTHESES. ! 20915: * FOR A NORMAL GOTO, THE RESULT RETURNED IS EITHER A VRBLK ! 20916: * POINTER FOR A SIMPLE LABEL OPERAND, OR A POINTER TO AN ! 20917: * EXPRESSION TREE WITH A SPECIAL OUTER UNARY OPERATOR ! 20918: * (O$GOC). FOR A DIRECT GOTO, THE RESULT RETURNED IS A ! 20919: * POINTER TO AN EXPRESSION TREE WITH THE SPECIAL OUTER ! 20920: * UNARY OPERATOR O$GOD. ! 20921: * ! 20922: * JSR SCNGF CALL TO SCAN GOTO FIELD ! 20923: * (XR) RESULT (SEE ABOVE) ! 20924: * (XL,WA,WB,WC) DESTROYED ! 20925: * ! 20926: {SCNGF{PRC{E{0{{ENTRY POINT ! 20927: {{JSR{SCANE{{{SCAN INITIAL ELEMENT ! 20928: {{BEQ{R10{#T$LPR{SCNG1{SKIP IF LEFT PAREN (NORMAL GOTO) ! 20929: {{BEQ{R10{#T$LBR{SCNG2{SKIP IF LEFT BRACKET (DIRECT GOTO) ! 20930: {{ERB{234{SYNTAX{{ERROR. GOTO FIELD INCORRECT ! 20931: * ! 20932: * HERE FOR LEFT PAREN (NORMAL GOTO) ! 20933: * ! 20934: {SCNG1{MOV{#NUM01{R7{{SET EXPAN FLAG FOR NORMAL GOTO ! 20935: {{JSR{EXPAN{{{ANALYZE GOTO FIELD ! 20936: {{MOV{#OPDVN{R6{{POINT TO OPDV FOR COMPLEX GOTO ! 20937: {{BLE{R9{STATB{SCNG3{JUMP IF NOT IN STATIC (SGD15) ! 20938: {{BLO{R9{STATE{SCNG4{JUMP TO EXIT IF SIMPLE LABEL NAME ! 20939: {{BRN{SCNG3{{{COMPLEX GOTO - MERGE ! 20940: * ! 20941: * HERE FOR LEFT BRACKET (DIRECT GOTO) ! 20942: * ! 20943: {SCNG2{MOV{#NUM02{R7{{SET EXPAN FLAG FOR DIRECT GOTO ! 20944: {{JSR{EXPAN{{{SCAN GOTO FIELD ! 20945: {{MOV{#OPDVD{R6{{SET OPDV POINTER FOR DIRECT GOTO ! 20946: {{EJC{{{{ ! 20947: * ! 20948: * SCNGF (CONTINUED) ! 20949: * ! 20950: * MERGE HERE TO BUILD OUTER UNARY OPERATOR BLOCK ! 20951: * ! 20952: {SCNG3{MOV{R6{-(SP){{STACK OPERATOR DV POINTER ! 20953: {{MOV{R9{-(SP){{STACK POINTER TO EXPRESSION TREE ! 20954: {{JSR{EXPOP{{{POP OPERATOR OFF ! 20955: {{MOV{(SP)+{R9{{RELOAD NEW EXPRESSION TREE POINTER ! 20956: * ! 20957: * COMMON EXIT POINT ! 20958: * ! 20959: {SCNG4{EXI{{{{RETURN TO CALLER ! 20960: {{ENP{{{{END PROCEDURE SCNGF ! 20961: {{EJC{{{{ ! 20962: * ! 20963: * SETVR -- SET VRGET,VRSTO FIELDS OF VRBLK ! 20964: * ! 20965: * SETVR SETS THE PROPER VALUES IN THE VRGET AND VRSTO ! 20966: * FIELDS OF A VRBLK. IT IS CALLED WHENEVER TRBLKS ARE ! 20967: * ADDED OR SUBTRACTED (TRACE,STOPTR,INPUT,OUTPUT,DETACH) ! 20968: * ! 20969: * (XR) POINTER TO VRBLK ! 20970: * JSR SETVR CALL TO SET FIELDS ! 20971: * (XL,WA) DESTROYED ! 20972: * ! 20973: * NOTE THAT SETVR IGNORES THE CALL IF XR DOES NOT POINT ! 20974: * INTO THE STATIC REGION (I.E. IS SOME OTHER NAME BASE) ! 20975: * ! 20976: {SETVR{PRC{E{0{{ENTRY POINT ! 20977: {{BHI{R9{STATE{SETV1{EXIT IF NOT NATURAL VARIABLE ! 20978: * ! 20979: * HERE IF WE HAVE A VRBLK ! 20980: * ! 20981: {{MOV{R9{R10{{COPY VRBLK POINTER ! 20982: {{MOV{#B$VRL{4*VRGET(R9){{STORE NORMAL GET VALUE ! 20983: {{BEQ{4*VRSTO(R9){#B$VRE{SETV1{SKIP IF PROTECTED VARIABLE ! 20984: {{MOV{#B$VRS{4*VRSTO(R9){{STORE NORMAL STORE VALUE ! 20985: {{MOV{4*VRVAL(R10){R10{{POINT TO NEXT ENTRY ON CHAIN ! 20986: {{BNE{(R10){#B$TRT{SETV1{JUMP IF END OF TRBLK CHAIN ! 20987: {{MOV{#B$VRA{4*VRGET(R9){{STORE TRAPPED ROUTINE ADDRESS ! 20988: {{MOV{#B$VRV{4*VRSTO(R9){{SET TRAPPED ROUTINE ADDRESS ! 20989: * ! 20990: * MERGE HERE TO EXIT TO CALLER ! 20991: * ! 20992: {SETV1{EXI{{{{RETURN TO SETVR CALLER ! 20993: {{ENP{{{{END PROCEDURE SETVR ! 20994: {{EJC{{{{ ! 20995: * ! 20996: * SORTA -- SORT ARRAY ! 20997: * ! 20998: * ROUTINE TO SORT AN ARRAY OR TABLE ON SAME BASIS AS IN ! 20999: * SITBOL. A TABLE IS CONVERTED TO AN ARRAY, LEAVING TWO ! 21000: * DIMENSIONAL ARRAYS AND VECTORS AS CASES TO BE CONSIDERED. ! 21001: * WHOLE ROWS OF ARRAYS ARE PERMUTED ACCORDING TO THE ! 21002: * ORDERING OF THE KEYS THEY CONTAIN, AND THE STRIDE ! 21003: * REFERRED TO, IS THE THE LENGTH OF A ROW. IT IS ONE ! 21004: * FOR A VECTOR. ! 21005: * THE SORT USED IS HEAPSORT, FUNDAMENTALS OF DATA STRUCTURE ! 21006: * HOROWITZ AND SAHNI, PITMAN 1977, PAGE 347. ! 21007: * IT IS AN ORDER N*LOG(N) ALGORITHM. IN ORDER ! 21008: * TO MAKE IT STABLE, COMPARANDS MAY NOT COMPARE EQUAL. THIS ! 21009: * IS ACHIEVED BY SORTING A COPY ARRAY (REFERRED TO AS THE ! 21010: * SORT ARRAY) CONTAINING AT ITS HIGH ADDRESS END, BYTE ! 21011: * OFFSETS TO THE ROWS TO BE SORTED HELD IN THE ORIGINAL ! 21012: * ARRAY (REFERRED TO AS THE KEY ARRAY). SORTC, THE ! 21013: * COMPARISON ROUTINE, ACCESSES THE KEYS THROUGH THESE ! 21014: * OFFSETS AND IN THE CASE OF EQUALITY, RESOLVES IT BY ! 21015: * COMPARING THE OFFSETS THEMSELVES. THE SORT PERMUTES THE ! 21016: * OFFSETS WHICH ARE THEN USED IN A FINAL OPERATION TO COPY ! 21017: * THE ACTUAL ITEMS INTO THE NEW ARRAY IN SORTED ORDER. ! 21018: * REFERENCES TO ZEROTH ITEM ARE TO NOTIONAL ITEM ! 21019: * PRECEDING FIRST ACTUAL ITEM. ! 21020: * REVERSE SORTING FOR RSORT IS DONE BY HAVING THE LESS THAN ! 21021: * TEST FOR KEYS EFFECTIVELY BE REPLACED BY A ! 21022: * GREATER THAN TEST. ! 21023: * ! 21024: * 1(XS) FIRST ARG - ARRAY OR TABLE ! 21025: * 0(XS) 2ND ARG - INDEX OR PDTYPE NAME ! 21026: * (WA) 0 , NON-ZERO FOR SORT , RSORT ! 21027: * JSR SORTA CALL TO SORT ARRAY ! 21028: * (XR) SORTED ARRAY ! 21029: * (XL,WA,WB,WC) DESTROYED ! 21030: {{EJC{{{{ ! 21031: * ! 21032: * SORTA (CONTINUED) ! 21033: * ! 21034: {SORTA{PRC{N{0{{ENTRY POINT ! 21035: {{MOV{R6{SRTSR{{SORT/RSORT INDICATOR ! 21036: {{MOV{#4*NUM01{SRTST{{DEFAULT STRIDE OF 1 ! 21037: {{ZER{SRTOF{{{DEFAULT ZERO OFFSET TO SORT KEY ! 21038: {{MOV{#NULLS{SRTDF{{CLEAR DATATYPE FIELD NAME ! 21039: {{MOV{(SP)+{R$SXR{{UNSTACK ARGUMENT 2 ! 21040: {{MOV{(SP)+{R9{{GET FIRST ARGUMENT ! 21041: {{JSR{GTARR{{{CONVERT TO ARRAY ! 21042: {{PPM{SRT16{{{FAIL ! 21043: {{MOV{R9{-(SP){{STACK PTR TO RESULTING KEY ARRAY ! 21044: {{MOV{R9{-(SP){{ANOTHER COPY FOR COPYB ! 21045: {{JSR{COPYB{{{GET COPY ARRAY FOR SORTING INTO ! 21046: {{PPM{{{{CANT FAIL ! 21047: {{MOV{R9{-(SP){{STACK POINTER TO SORT ARRAY ! 21048: {{MOV{R$SXR{R9{{GET SECOND ARG ! 21049: {{MOV{4*1(SP){R10{{GET PTR TO KEY ARRAY ! 21050: {{BNE{(R10){#B$VCT{SRT02{JUMP IF ARBLK ! 21051: {{BEQ{R9{#NULLS{SRT01{JUMP IF NULL SECOND ARG ! 21052: {{JSR{GTNVR{{{GET VRBLK PTR FOR IT ! 21053: {{ERR{257{ERRONEOUS{{2ND ARG IN SORT/RSORT OF VECTOR ! 21054: {{MOV{R9{SRTDF{{STORE DATATYPE FIELD NAME VRBLK ! 21055: * ! 21056: * COMPUTE N AND OFFSET TO ITEM A(0) IN VECTOR CASE ! 21057: * ! 21058: {SRT01{MOV{#4*VCLEN{R8{{OFFSET TO A(0) ! 21059: {{MOV{#4*VCVLS{R7{{OFFSET TO FIRST ITEM ! 21060: {{MOV{4*VCLEN(R10){R6{{GET BLOCK LENGTH ! 21061: {{SUB{#4*VCSI${R6{{GET NO. OF ENTRIES, N (IN BYTES) ! 21062: {{BRN{SRT04{{{MERGE ! 21063: * ! 21064: * HERE FOR ARRAY ! 21065: * ! 21066: {SRT02{LDI{4*ARDIM(R10){{{GET POSSIBLE DIMENSION ! 21067: {{MFI{R6{{{CONVERT TO SHORT INTEGER ! 21068: {{WTB{R6{{{FURTHER CONVERT TO BAUS ! 21069: {{MOV{#4*ARVLS{R7{{OFFSET TO FIRST VALUE IF ONE ! 21070: {{MOV{#4*ARPRO{R8{{OFFSET BEFORE VALUES IF ONE DIM. ! 21071: {{BEQ{4*ARNDM(R10){#NUM01{SRT04{JUMP IN FACT IF ONE DIM. ! 21072: {{BNE{4*ARNDM(R10){#NUM02{SRT16{FAIL UNLESS TWO DIMENS ! 21073: {{LDI{4*ARLB2(R10){{{GET LOWER BOUND 2 AS DEFAULT ! 21074: {{BEQ{R9{#NULLS{SRT03{JUMP IF DEFAULT SECOND ARG ! 21075: {{JSR{GTINT{{{CONVERT TO INTEGER ! 21076: {{PPM{SRT17{{{FAIL ! 21077: {{LDI{4*ICVAL(R9){{{GET ACTUAL INTEGER VALUE ! 21078: {{EJC{{{{ ! 21079: * ! 21080: * SORTA (CONTINUED) ! 21081: * ! 21082: * HERE WITH SORT COLUMN INDEX IN IA IN ARRAY CASE ! 21083: * ! 21084: {SRT03{SBI{4*ARLB2(R10){{{SUBTRACT LOW BOUND ! 21085: {{IOV{SRT17{{{FAIL IF OVERFLOW ! 21086: {{ILT{SRT17{{{FAIL IF BELOW LOW BOUND ! 21087: {{SBI{4*ARDM2(R10){{{CHECK AGAINST DIMENSION ! 21088: {{IGE{SRT17{{{FAIL IF TOO LARGE ! 21089: {{ADI{4*ARDM2(R10){{{RESTORE VALUE ! 21090: {{MFI{R6{{{GET AS SMALL INTEGER ! 21091: {{WTB{R6{{{OFFSET WITHIN ROW TO KEY ! 21092: {{MOV{R6{SRTOF{{KEEP OFFSET ! 21093: {{LDI{4*ARDM2(R10){{{SECOND DIMENSION IS ROW LENGTH ! 21094: {{MFI{R6{{{CONVERT TO SHORT INTEGER ! 21095: {{MOV{R6{R9{{COPY ROW LENGTH ! 21096: {{WTB{R6{{{CONVERT TO BYTES ! 21097: {{MOV{R6{SRTST{{STORE AS STRIDE ! 21098: {{LDI{4*ARDIM(R10){{{GET NUMBER OF ROWS ! 21099: {{MFI{R6{{{AS A SHORT INTEGER ! 21100: {{WTB{R6{{{CONVERT N TO BAUS ! 21101: {{MOV{4*ARLEN(R10){R8{{OFFSET PAST ARRAY END ! 21102: {{SUB{R6{R8{{ADJUST, GIVING SPACE FOR N OFFSETS ! 21103: {{DCA{R8{{{POINT TO A(0) ! 21104: {{MOV{4*AROFS(R10){R7{{OFFSET TO WORD BEFORE FIRST ITEM ! 21105: {{ICA{R7{{{OFFSET TO FIRST ITEM ! 21106: * ! 21107: * SEPARATE PRE-PROCESSING FOR ARRAYS AND VECTORS DONE. ! 21108: * TO SIMPLIFY LATER KEY COMPARISONS, REMOVAL OF ANY TRBLK ! 21109: * TRAP BLOCKS FROM ENTRIES IN KEY ARRAY IS EFFECTED. ! 21110: * ! 21111: * (XL) = 1(XS) = POINTER TO KEY ARRAY ! 21112: * (XS) = POINTER TO SORT ARRAY ! 21113: * WA = NUMBER OF ITEMS, N (CONVERTED TO BYTES). ! 21114: * WB = OFFSET TO FIRST ITEM OF ARRAYS. ! 21115: * WC = OFFSET TO A(0) ! 21116: * ! 21117: {SRT04{BLE{R6{#4*NUM01{SRT15{RETURN IF ONLY A SINGLE ITEM ! 21118: {{MOV{R6{SRTSN{{STORE NUMBER OF ITEMS (IN BAUS) ! 21119: {{MOV{R8{SRTSO{{STORE OFFSET TO A(0) ! 21120: {{MOV{4*ARLEN(R10){R8{{LENGTH OF ARRAY OR VEC (=VCLEN) ! 21121: {{ADD{R10{R8{{POINT PAST END OF ARRAY OR VECTOR ! 21122: {{MOV{R7{SRTSF{{STORE OFFSET TO FIRST ROW ! 21123: {{ADD{R7{R10{{POINT TO FIRST ITEM IN KEY ARRAY ! 21124: * ! 21125: * LOOP THROUGH ARRAY ! 21126: * ! 21127: {SRT05{MOV{(R10){R9{{GET AN ENTRY ! 21128: * ! 21129: * HUNT ALONG TRBLK CHAIN ! 21130: * ! 21131: {SRT06{BNE{(R9){#B$TRT{SRT07{JUMP OUT IF NOT TRBLK ! 21132: {{MOV{4*TRVAL(R9){R9{{GET VALUE FIELD ! 21133: {{BRN{SRT06{{{LOOP ! 21134: {{EJC{{{{ ! 21135: * ! 21136: * SORTA (CONTINUED) ! 21137: * ! 21138: * XR IS VALUE FROM END OF CHAIN ! 21139: * ! 21140: {SRT07{MOV{R9{(R10)+{{STORE AS ARRAY ENTRY ! 21141: {{BLT{R10{R8{SRT05{LOOP IF NOT DONE ! 21142: {{MOV{(SP){R10{{GET ADRS OF SORT ARRAY ! 21143: {{MOV{SRTSF{R9{{INITIAL OFFSET TO FIRST KEY ! 21144: {{MOV{SRTST{R7{{GET STRIDE ! 21145: {{ADD{SRTSO{R10{{OFFSET TO A(0) ! 21146: {{ICA{R10{{{POINT TO A(1) ! 21147: {{MOV{SRTSN{R8{{GET N ! 21148: {{BTW{R8{{{CONVERT FROM BYTES ! 21149: {{MOV{R8{SRTNR{{STORE AS ROW COUNT ! 21150: {{LCT{R8{R8{{LOOP COUNTER ! 21151: * ! 21152: * STORE KEY OFFSETS AT TOP OF SORT ARRAY ! 21153: * ! 21154: {SRT08{MOV{R9{(R10)+{{STORE AN OFFSET ! 21155: {{ADD{R7{R9{{BUMP OFFSET BY STRIDE ! 21156: {{BCT{R8{SRT08{{LOOP THROUGH ROWS ! 21157: * ! 21158: * PERFORM THE SORT ON OFFSETS IN SORT ARRAY. ! 21159: * ! 21160: * (SRTSN) NUMBER OF ITEMS TO SORT, N (BYTES) ! 21161: * (SRTSO) OFFSET TO A(0) ! 21162: * ! 21163: {SRT09{MOV{SRTSN{R6{{GET N ! 21164: {{MOV{SRTNR{R8{{GET NUMBER OF ROWS ! 21165: {{RSH{R8{1{{I = N / 2 (WC=I, INDEX INTO ARRAY) ! 21166: {{WTB{R8{{{CONVERT BACK TO BYTES ! 21167: * ! 21168: * LOOP TO FORM INITIAL HEAP ! 21169: * ! 21170: {SRT10{JSR{SORTH{{{SORTH(I,N) ! 21171: {{DCA{R8{{{I = I - 1 ! 21172: {{BNZ{R8{SRT10{{LOOP IF I GT 0 ! 21173: {{MOV{R6{R8{{I = N ! 21174: * ! 21175: * SORTING LOOP. AT THIS POINT, A(1) IS THE LARGEST ! 21176: * ITEM, SINCE ALGORITHM INITIALISES IT AS, AND THEN MAINTAI ! 21177: * IT AS, ROOT OF TREE. ! 21178: * ! 21179: {SRT11{DCA{R8{{{I = I - 1 (N - 1 INITIALLY) ! 21180: {{BZE{R8{SRT12{{JUMP IF DONE ! 21181: {{MOV{(SP){R9{{GET SORT ARRAY ADDRESS ! 21182: {{ADD{SRTSO{R9{{POINT TO A(0) ! 21183: {{MOV{R9{R10{{A(0) ADDRESS ! 21184: {{ADD{R8{R10{{A(I) ADDRESS ! 21185: {{MOV{4*1(R10){R7{{COPY A(I+1) ! 21186: {{MOV{4*1(R9){4*1(R10){{MOVE A(1) TO A(I+1) ! 21187: {{MOV{R7{4*1(R9){{COMPLETE EXCHANGE OF A(1), A(I+1) ! 21188: {{MOV{R8{R6{{N = I FOR SORTH ! 21189: {{MOV{#4*NUM01{R8{{I = 1 FOR SORTH ! 21190: {{JSR{SORTH{{{SORTH(1,N) ! 21191: {{MOV{R6{R8{{RESTORE WC ! 21192: {{BRN{SRT11{{{LOOP ! 21193: {{EJC{{{{ ! 21194: * ! 21195: * SORTA (CONTINUED) ! 21196: * ! 21197: * OFFSETS HAVE BEEN PERMUTED INTO REQUIRED ORDER BY SORT. ! 21198: * COPY ARRAY ELEMENTS OVER THEM. ! 21199: * ! 21200: {SRT12{MOV{(SP){R10{{BASE ADRS OF KEY ARRAY ! 21201: {{MOV{R10{R8{{COPY IT ! 21202: {{ADD{SRTSO{R8{{OFFSET OF A(0) ! 21203: {{ADD{SRTSF{R10{{ADRS OF FIRST ROW OF SORT ARRAY ! 21204: {{MOV{SRTST{R7{{GET STRIDE ! 21205: {{BTW{R7{{{CONVERT TO WORDS ! 21206: * ! 21207: * COPYING LOOP FOR SUCCESSIVE ITEMS. SORTED OFFSETS ARE ! 21208: * HELD AT END OF SORT ARRAY. ! 21209: * ! 21210: {SRT13{ICA{R8{{{ADRS OF NEXT OF SORTED OFFSETS ! 21211: {{MOV{R8{R9{{COPY IT FOR ACCESS ! 21212: {{MOV{(R9){R9{{GET OFFSET ! 21213: {{ADD{4*1(SP){R9{{ADD KEY ARRAY BASE ADRS ! 21214: {{LCT{R6{R7{{GET COUNT OF WORDS IN ROW ! 21215: * ! 21216: * COPY A COMPLETE ROW ! 21217: * ! 21218: {SRT14{MOV{(R9)+{(R10)+{{MOVE A WORD ! 21219: {{BCT{R6{SRT14{{LOOP ! 21220: {{DCV{SRTNR{{{DECREMENT ROW COUNT ! 21221: {{BNZ{SRTNR{SRT13{{REPEAT TILL ALL ROWS DONE ! 21222: * ! 21223: * RETURN POINT ! 21224: * ! 21225: {SRT15{MOV{(SP)+{R9{{POP RESULT ARRAY PTR ! 21226: {{ICA{SP{{{POP KEY ARRAY PTR ! 21227: {{ZER{R$SXL{{{CLEAR JUNK ! 21228: {{ZER{R$SXR{{{CLEAR JUNK ! 21229: {{EXI{{{{RETURN ! 21230: * ! 21231: * ERROR POINT ! 21232: * ! 21233: {SRT16{ERB{256{SORT/RSORT{{1ST ARG NOT SUITABLE ARRAY OR TABLE ! 21234: {SRT17{ERB{258{SORT/RSORT{{2ND ARG OUT OF RANGE OR NON-INTEGER ! 21235: {{ENP{{{{END PROCUDURE SORTA ! 21236: {{EJC{{{{ ! 21237: * ! 21238: * SORTC -- COMPARE SORT KEYS ! 21239: * ! 21240: * COMPARE TWO SORT KEYS GIVEN THEIR OFFSETS. IF ! 21241: * EQUAL, COMPARE KEY OFFSETS TO GIVE STABLE SORT. ! 21242: * NOTE THAT IF SRTSR IS NON-ZERO (REQUEST FOR REVERSE ! 21243: * SORT), THE QUOTED RETURNS ARE INVERTED. ! 21244: * FOR OBJECTS OF DIFFERING DATATYPES, THE ENTRY POINT ! 21245: * IDENTIFICATIONS ARE COMPARED. ! 21246: * ! 21247: * (XL) BASE ADRS FOR KEYS ! 21248: * (WA) OFFSET TO KEY 1 ITEM ! 21249: * (WB) OFFSET TO KEY 2 ITEM ! 21250: * (SRTSR) ZERO/NON-ZERO FOR SORT/RSORT ! 21251: * (SRTOF) OFFSET WITHIN ROW TO COMPARANDS ! 21252: * JSR SORTC CALL TO COMPARE KEYS ! 21253: * PPM LOC KEY1 LESS THAN KEY2 ! 21254: * NORMAL RETURN, KEY1 GT THAN KEY2 ! 21255: * (XL,XR,WA,WB) DESTROYED ! 21256: * ! 21257: {SORTC{PRC{E{1{{ENTRY POINT ! 21258: {{MOV{R6{SRTS1{{SAVE OFFSET 1 ! 21259: {{MOV{R7{SRTS2{{SAVE OFFSET 2 ! 21260: {{MOV{R8{SRTSC{{SAVE WC ! 21261: {{ADD{SRTOF{R10{{ADD OFFSET TO COMPARAND FIELD ! 21262: {{MOV{R10{R9{{COPY BASE + OFFSET ! 21263: {{ADD{R6{R10{{ADD KEY1 OFFSET ! 21264: {{ADD{R7{R9{{ADD KEY2 OFFSET ! 21265: {{MOV{(R10){R10{{GET KEY1 ! 21266: {{MOV{(R9){R9{{GET KEY2 ! 21267: {{BNE{SRTDF{#NULLS{SRC11{JUMP IF DATATYPE FIELD NAME USED ! 21268: {{EJC{{{{ ! 21269: * ! 21270: * SORTC (CONTINUED) ! 21271: * ! 21272: * MERGE AFTER DEALING WITH FIELD NAME. TRY FOR STRINGS. ! 21273: * ! 21274: {SRC01{MOV{(R10){R8{{GET TYPE CODE ! 21275: {{BNE{R8{(R9){SRC02{SKIP IF NOT SAME DATATYPE ! 21276: {{BEQ{R8{#B$SCL{SRC09{JUMP IF BOTH STRINGS ! 21277: * ! 21278: * NOW TRY FOR NUMERIC ! 21279: * ! 21280: {SRC02{MOV{R10{R$SXL{{KEEP ARG1 ! 21281: {{MOV{R9{R$SXR{{KEEP ARG2 ! 21282: {{MOV{R10{-(SP){{STACK ! 21283: {{MOV{R9{-(SP){{ARGS ! 21284: {{JSR{ACOMP{{{COMPARE OBJECTS ! 21285: {{PPM{SRC10{{{NOT NUMERIC ! 21286: {{PPM{SRC10{{{NOT NUMERIC ! 21287: {{PPM{SRC03{{{KEY1 LESS ! 21288: {{PPM{SRC08{{{KEYS EQUAL ! 21289: {{PPM{SRC05{{{KEY1 GREATER ! 21290: * ! 21291: * RETURN IF KEY1 SMALLER (SORT), GREATER (RSORT) ! 21292: * ! 21293: {SRC03{BNZ{SRTSR{SRC06{{JUMP IF RSORT ! 21294: * ! 21295: {SRC04{MOV{SRTSC{R8{{RESTORE WC ! 21296: {{EXI{1{{{RETURN ! 21297: * ! 21298: * RETURN IF KEY1 GREATER (SORT), SMALLER (RSORT) ! 21299: * ! 21300: {SRC05{BNZ{SRTSR{SRC04{{JUMP IF RSORT ! 21301: * ! 21302: {SRC06{MOV{SRTSC{R8{{RESTORE WC ! 21303: {{EXI{{{{RETURN ! 21304: * ! 21305: * KEYS ARE OF SAME DATATYPE ! 21306: * ! 21307: {SRC07{BLT{R10{R9{SRC03{ITEM FIRST CREATED IS LESS ! 21308: {{BGT{R10{R9{SRC05{ADDRESSES RISE IN ORDER OF CREATION ! 21309: * ! 21310: * DROP THROUGH OR MERGE FOR IDENTICAL OR EQUAL OBJECTS ! 21311: * ! 21312: {SRC08{BLT{SRTS1{SRTS2{SRC04{TEST OFFSETS OR KEY ADDRSS INSTEAD ! 21313: {{BRN{SRC06{{{OFFSET 1 GREATER ! 21314: {{EJC{{{{ ! 21315: * ! 21316: * SORTC (CONTINUED) ! 21317: * ! 21318: * STRINGS ! 21319: * ! 21320: {SRC09{MOV{R10{-(SP){{STACK ! 21321: {{MOV{R9{-(SP){{ARGS ! 21322: {{JSR{LCOMP{{{COMPARE OBJECTS ! 21323: {{PPM{{{{CANT ! 21324: {{PPM{{{{FAIL ! 21325: {{PPM{SRC03{{{KEY1 LESS ! 21326: {{PPM{SRC08{{{KEYS EQUAL ! 21327: {{PPM{SRC05{{{KEY1 GREATER ! 21328: * ! 21329: * ARITHMETIC COMPARISON FAILED - RECOVER ARGS ! 21330: * ! 21331: {SRC10{MOV{R$SXL{R10{{GET ARG1 ! 21332: {{MOV{R$SXR{R9{{GET ARG2 ! 21333: {{MOV{(R10){R8{{GET TYPE OF KEY1 ! 21334: {{BEQ{R8{(R9){SRC07{JUMP IF KEYS OF SAME TYPE ! 21335: {{MOV{R8{R10{{GET BLOCK TYPE WORD ! 21336: {{MOV{(R9){R9{{GET BLOCK TYPE WORD ! 21337: {{LEI{R10{{{ENTRY POINT ID FOR KEY1 ! 21338: {{LEI{R9{{{ENTRY POINT ID FOR KEY2 ! 21339: {{BGT{R10{R9{SRC05{JUMP IF KEY1 GT KEY2 ! 21340: {{BRN{SRC03{{{KEY1 LT KEY2 ! 21341: * ! 21342: * DATATYPE FIELD NAME USED ! 21343: * ! 21344: {SRC11{JSR{SORTF{{{CALL ROUTINE TO FIND FIELD 1 ! 21345: {{MOV{R10{-(SP){{STACK ITEM POINTER ! 21346: {{MOV{R9{R10{{GET KEY2 ! 21347: {{JSR{SORTF{{{FIND FIELD 2 ! 21348: {{MOV{R10{R9{{PLACE AS KEY2 ! 21349: {{MOV{(SP)+{R10{{RECOVER KEY1 ! 21350: {{BRN{SRC01{{{MERGE ! 21351: {{ENP{{{{PROCEDURE SORTC ! 21352: {{EJC{{{{ ! 21353: * ! 21354: * SORTF -- FIND FIELD FOR SORTC ! 21355: * ! 21356: * ROUTINE USED BY SORTC TO OBTAIN ITEM CORRESPONDING ! 21357: * TO A GIVEN FIELD NAME, IF THIS EXISTS, IN A PROGRAMMER ! 21358: * DEFINED OBJECT PASSED AS ARGUMENT. ! 21359: * IF SUCH A MATCH OCCURS, RECORD IS KEPT OF DATATYPE ! 21360: * NAME, FIELD NAME AND OFFSET TO FIELD IN ORDER TO ! 21361: * SHORT-CIRCUIT LATER SEARCHES ON SAME TYPE. NOTE THAT ! 21362: * DFBLKS ARE STORED IN STATIC AND HENCE CANNOT BE MOVED. ! 21363: * ! 21364: * (SRTDF) VRBLK POINTER OF FIELD NAME ! 21365: * (XL) POSSIBLE PDBLK POINTER ! 21366: * JSR SORTF CALL TO SEARCH FOR FIELD NAME ! 21367: * (XL) ITEM FOUND OR ORIGINAL PDBLK PTR ! 21368: * (WC) DESTROYED ! 21369: * ! 21370: {SORTF{PRC{E{0{{ENTRY POINT ! 21371: {{BNE{(R10){#B$PDT{SRTF3{RETURN IF NOT PDBLK ! 21372: {{MOV{R9{-(SP){{KEEP XR ! 21373: {{MOV{SRTFD{R9{{GET POSSIBLE FORMER DFBLK PTR ! 21374: {{BZE{R9{SRTF4{{JUMP IF NOT ! 21375: {{BNE{R9{4*PDDFP(R10){SRTF4{JUMP IF NOT RIGHT DATATYPE ! 21376: {{BNE{SRTDF{SRTFF{SRTF4{JUMP IF NOT RIGHT FIELD NAME ! 21377: {{ADD{SRTFO{R10{{ADD OFFSET TO REQUIRED FIELD ! 21378: * ! 21379: * HERE WITH XL POINTING TO FOUND FIELD ! 21380: * ! 21381: {SRTF1{MOV{(R10){R10{{GET ITEM FROM FIELD ! 21382: * ! 21383: * RETURN POINT ! 21384: * ! 21385: {SRTF2{MOV{(SP)+{R9{{RESTORE XR ! 21386: * ! 21387: {SRTF3{EXI{{{{RETURN ! 21388: {{EJC{{{{ ! 21389: * ! 21390: * SORTF (CONTINUED) ! 21391: * ! 21392: * CONDUCT A SEARCH ! 21393: * ! 21394: {SRTF4{MOV{R10{R9{{COPY ORIGINAL POINTER ! 21395: {{MOV{4*PDDFP(R9){R9{{POINT TO DFBLK ! 21396: {{MOV{R9{SRTFD{{KEEP A COPY ! 21397: {{MOV{4*FARGS(R9){R8{{GET NUMBER OF FIELDS ! 21398: {{WTB{R8{{{CONVERT TO BYTES ! 21399: {{ADD{4*DFLEN(R9){R9{{POINT PAST LAST FIELD ! 21400: * ! 21401: * LOOP TO FIND NAME IN PDFBLK ! 21402: * ! 21403: {SRTF5{DCA{R8{{{COUNT DOWN ! 21404: {{DCA{R9{{{POINT IN FRONT ! 21405: {{BEQ{(R9){SRTDF{SRTF6{SKIP OUT IF FOUND ! 21406: {{BNZ{R8{SRTF5{{LOOP ! 21407: {{BRN{SRTF2{{{RETURN - NOT FOUND ! 21408: * ! 21409: * FOUND ! 21410: * ! 21411: {SRTF6{MOV{(R9){SRTFF{{KEEP FIELD NAME PTR ! 21412: {{ADD{#4*PDFLD{R8{{ADD OFFSET TO FIRST FIELD ! 21413: {{MOV{R8{SRTFO{{STORE AS FIELD OFFSET ! 21414: {{ADD{R8{R10{{POINT TO FIELD ! 21415: {{BRN{SRTF1{{{RETURN ! 21416: {{ENP{{{{PROCEDURE SORTF ! 21417: {{EJC{{{{ ! 21418: * ! 21419: * SORTH -- HEAP ROUTINE FOR SORTA ! 21420: * ! 21421: * THIS ROUTINE CONSTRUCTS A HEAP FROM ELEMENTS OF ARRAY, A. ! 21422: * IN THIS APPLICATION, THE ELEMENTS ARE OFFSETS TO KEYS IN ! 21423: * A KEY ARRAY. ! 21424: * ! 21425: * (XS) POINTER TO SORT ARRAY BASE ! 21426: * 1(XS) POINTER TO KEY ARRAY BASE ! 21427: * (WA) MAX ARRAY INDEX, N (IN BYTES) ! 21428: * (WC) OFFSET J IN A TO ROOT (IN *1 TO *N) ! 21429: * JSR SORTH CALL SORTH(J,N) TO MAKE HEAP ! 21430: * (XL,XR,WB) DESTROYED ! 21431: * ! 21432: {SORTH{PRC{N{0{{ENTRY POINT ! 21433: {{MOV{R6{SRTSN{{SAVE N ! 21434: {{MOV{R8{SRTWC{{KEEP WC ! 21435: {{MOV{(SP){R10{{SORT ARRAY BASE ADRS ! 21436: {{ADD{SRTSO{R10{{ADD OFFSET TO A(0) ! 21437: {{ADD{R8{R10{{POINT TO A(J) ! 21438: {{MOV{(R10){SRTRT{{GET OFFSET TO ROOT ! 21439: {{ADD{R8{R8{{DOUBLE J - CANT EXCEED N ! 21440: * ! 21441: * LOOP TO MOVE DOWN TREE USING DOUBLED INDEX J ! 21442: * ! 21443: {SRH01{BGT{R8{SRTSN{SRH03{DONE IF J GT N ! 21444: {{BEQ{R8{SRTSN{SRH02{SKIP IF J EQUALS N ! 21445: {{MOV{(SP){R9{{SORT ARRAY BASE ADRS ! 21446: {{MOV{4*1(SP){R10{{KEY ARRAY BASE ADRS ! 21447: {{ADD{SRTSO{R9{{POINT TO A(0) ! 21448: {{ADD{R8{R9{{ADRS OF A(J) ! 21449: {{MOV{4*1(R9){R6{{GET A(J+1) ! 21450: {{MOV{(R9){R7{{GET A(J) ! 21451: * ! 21452: * COMPARE SONS. (WA) RIGHT SON, (WB) LEFT SON ! 21453: * ! 21454: {{JSR{SORTC{{{COMPARE KEYS - LT(A(J+1),A(J)) ! 21455: {{PPM{SRH02{{{A(J+1) LT A(J) ! 21456: {{ICA{R8{{{POINT TO GREATER SON, A(J+1) ! 21457: {{EJC{{{{ ! 21458: * ! 21459: * SORTH (CONTINUED) ! 21460: * ! 21461: * COMPARE ROOT WITH GREATER SON ! 21462: * ! 21463: {SRH02{MOV{4*1(SP){R10{{KEY ARRAY BASE ADRS ! 21464: {{MOV{(SP){R9{{GET SORT ARRAY ADDRESS ! 21465: {{ADD{SRTSO{R9{{ADRS OF A(0) ! 21466: {{MOV{R9{R7{{COPY THIS ADRS ! 21467: {{ADD{R8{R9{{ADRS OF GREATER SON, A(J) ! 21468: {{MOV{(R9){R6{{GET A(J) ! 21469: {{MOV{R7{R9{{POINT BACK TO A(0) ! 21470: {{MOV{SRTRT{R7{{GET ROOT ! 21471: {{JSR{SORTC{{{COMPARE THEM - LT(A(J),ROOT) ! 21472: {{PPM{SRH03{{{FATHER EXCEEDS SONS - DONE ! 21473: {{MOV{(SP){R9{{GET SORT ARRAY ADRS ! 21474: {{ADD{SRTSO{R9{{POINT TO A(0) ! 21475: {{MOV{R9{R10{{COPY IT ! 21476: {{MOV{R8{R6{{COPY J ! 21477: {{BTW{R8{{{CONVERT TO WORDS ! 21478: {{RSH{R8{1{{GET J/2 ! 21479: {{WTB{R8{{{CONVERT BACK TO BYTES ! 21480: {{ADD{R6{R10{{POINT TO A(J) ! 21481: {{ADD{R8{R9{{ADRS OF A(J/2) ! 21482: {{MOV{(R10){(R9){{A(J/2) = A(J) ! 21483: {{MOV{R6{R8{{RECOVER J ! 21484: {{AOV{R8{R8{SRH03{J = J*2. DONE IF TOO BIG ! 21485: {{BRN{SRH01{{{LOOP ! 21486: * ! 21487: * FINISH BY COPYING ROOT OFFSET BACK INTO ARRAY ! 21488: * ! 21489: {SRH03{BTW{R8{{{CONVERT TO WORDS ! 21490: {{RSH{R8{1{{J = J/2 ! 21491: {{WTB{R8{{{CONVERT BACK TO BYTES ! 21492: {{MOV{(SP){R9{{SORT ARRAY ADRS ! 21493: {{ADD{SRTSO{R9{{ADRS OF A(0) ! 21494: {{ADD{R8{R9{{ADRS OF A(J/2) ! 21495: {{MOV{SRTRT{(R9){{A(J/2) = ROOT ! 21496: {{MOV{SRTSN{R6{{RESTORE WA ! 21497: {{MOV{SRTWC{R8{{RESTORE WC ! 21498: {{EXI{{{{RETURN ! 21499: {{ENP{{{{END PROCEDURE SORTH ! 21500: {{EJC{{{{ ! 21501: {{EJC{{{{ ! 21502: * ! 21503: * TFIND -- LOCATE TABLE ELEMENT ! 21504: * ! 21505: * (XR) SUBSCRIPT VALUE FOR ELEMENT ! 21506: * (XL) POINTER TO TABLE ! 21507: * (WB) ZERO BY VALUE, NON-ZERO BY NAME ! 21508: * JSR TFIND CALL TO LOCATE ELEMENT ! 21509: * PPM LOC TRANSFER LOCATION IF ACCESS FAILS ! 21510: * (XR) ELEMENT VALUE (IF BY VALUE) ! 21511: * (XR) DESTROYED (IF BY NAME) ! 21512: * (XL,WA) TEBLK NAME (IF BY NAME) ! 21513: * (XL,WA) DESTROYED (IF BY VALUE) ! 21514: * (WC,RA) DESTROYED ! 21515: * ! 21516: * NOTE THAT IF A CALL BY VALUE SPECIFIES A NON-EXISTENT ! 21517: * SUBSCRIPT, NULL IS RETURNED WITHOUT BUILDING A NEW TEBLK. ! 21518: * ! 21519: {TFIND{PRC{E{1{{ENTRY POINT ! 21520: {{MOV{R7{-(SP){{SAVE NAME/VALUE INDICATOR ! 21521: {{MOV{R9{-(SP){{SAVE SUBSCRIPT VALUE ! 21522: {{MOV{R10{-(SP){{SAVE TABLE POINTER ! 21523: {{MOV{4*TBLEN(R10){R6{{LOAD LENGTH OF TBBLK ! 21524: {{BTW{R6{{{CONVERT TO WORD COUNT ! 21525: {{SUB{#TBBUK{R6{{GET NUMBER OF BUCKETS ! 21526: {{MTI{R6{{{CONVERT TO INTEGER VALUE ! 21527: {{STI{TFNSI{{{SAVE FOR LATER ! 21528: {{MOV{(R9){R10{{LOAD FIRST WORD OF SUBSCRIPT ! 21529: {{LEI{R10{{{LOAD BLOCK ENTRY ID (BL$XX) ! 21530: {{BSW{R10{BL$$D{TFN00{SWITCH ON BLOCK TYPE ! 21531: {{IFF{DUMMY{TFN00{{ ! 21532: {{IFF{DUMMY{TFN00{{ ! 21533: {{IFF{DUMMY{TFN00{{ ! 21534: {{IFF{DUMMY{TFN00{{ ! 21535: {{IFF{BL$IC{TFN02{{JUMP IF INTEGER ! 21536: {{IFF{BL$NM{TFN04{{JUMP IF NAME ! 21537: {{IFF{BL$P0{TFN03{{JUMP IF PATTERN ! 21538: {{IFF{BL$P1{TFN03{{JUMP IF PATTERN ! 21539: {{IFF{BL$P2{TFN03{{JUMP IF PATTERN ! 21540: {{IFF{BL$RC{TFN02{{REAL ! 21541: {{IFF{BL$SC{TFN05{{JUMP IF STRING ! 21542: {{IFF{DUMMY{TFN00{{ ! 21543: {{IFF{DUMMY{TFN00{{ ! 21544: {{IFF{DUMMY{TFN00{{ ! 21545: {{IFF{DUMMY{TFN00{{ ! 21546: {{IFF{DUMMY{TFN00{{ ! 21547: {{IFF{DUMMY{TFN00{{ ! 21548: {{ESW{{{{END SWITCH ON BLOCK TYPE ! 21549: * ! 21550: * HERE FOR BLOCKS FOR WHICH WE USE THE SECOND WORD OF THE ! 21551: * BLOCK AS THE HASH SOURCE (SEE BLOCK FORMATS FOR DETAILS). ! 21552: * ! 21553: {TFN00{MOV{4*1(R9){R6{{LOAD SECOND WORD ! 21554: * ! 21555: * MERGE HERE WITH ONE WORD HASH SOURCE IN WA ! 21556: * ! 21557: {TFN01{MTI{R6{{{CONVERT TO INTEGER ! 21558: {{BRN{TFN06{{{JUMP TO MERGE ! 21559: {{EJC{{{{ ! 21560: * ! 21561: * TFIND (CONTINUED) ! 21562: * ! 21563: * HERE FOR INTEGER OR REAL ! 21564: * ! 21565: {TFN02{LDI{4*1(R9){{{LOAD VALUE AS HASH SOURCE ! 21566: {{IGE{TFN06{{{OK IF POSITIVE OR ZERO ! 21567: {{NGI{{{{MAKE POSITIVE ! 21568: {{IOV{TFN06{{{CLEAR POSSIBLE OVERFLOW ! 21569: {{BRN{TFN06{{{MERGE ! 21570: * ! 21571: * FOR PATTERN, USE FIRST WORD (PCODE) AS SOURCE ! 21572: * ! 21573: {TFN03{MOV{(R9){R6{{LOAD FIRST WORD AS HASH SOURCE ! 21574: {{BRN{TFN01{{{MERGE BACK ! 21575: * ! 21576: * FOR NAME, USE OFFSET AS HASH SOURCE ! 21577: * ! 21578: {TFN04{MOV{4*NMOFS(R9){R6{{LOAD OFFSET AS HASH SOURCE ! 21579: {{BRN{TFN01{{{MERGE BACK ! 21580: * ! 21581: * HERE FOR STRING ! 21582: * ! 21583: {TFN05{JSR{HASHS{{{CALL ROUTINE TO COMPUTE HASH ! 21584: * ! 21585: * MERGE HERE WITH HASH SOURCE IN (IA) ! 21586: * ! 21587: {TFN06{RMI{TFNSI{{{COMPUTE HASH INDEX BY REMAINDERING ! 21588: {{MFI{R8{{{GET AS ONE WORD INTEGER ! 21589: {{WTB{R8{{{CONVERT TO BYTE OFFSET ! 21590: {{MOV{(SP){R10{{GET TABLE PTR AGAIN ! 21591: {{ADD{R8{R10{{POINT TO PROPER BUCKET ! 21592: {{MOV{4*TBBUK(R10){R9{{LOAD FIRST TEBLK POINTER ! 21593: {{BEQ{R9{(SP){TFN10{JUMP IF NO TEBLKS ON CHAIN ! 21594: * ! 21595: * LOOP THROUGH TEBLKS ON HASH CHAIN ! 21596: * ! 21597: {TFN07{MOV{R9{R7{{SAVE TEBLK POINTER ! 21598: {{MOV{4*TESUB(R9){R9{{LOAD SUBSCRIPT VALUE ! 21599: {{MOV{4*1(SP){R10{{LOAD INPUT ARGUMENT SUBSCRIPT VAL ! 21600: {{JSR{IDENT{{{COMPARE THEM ! 21601: {{PPM{TFN08{{{JUMP IF EQUAL (IDENT) ! 21602: * ! 21603: * HERE IF NO MATCH WITH THAT TEBLK ! 21604: * ! 21605: {{MOV{R7{R10{{RESTORE TEBLK POINTER ! 21606: {{MOV{4*TENXT(R10){R9{{POINT TO NEXT TEBLK ON CHAIN ! 21607: {{BNE{R9{(SP){TFN07{JUMP IF THERE IS ONE ! 21608: * ! 21609: * HERE IF NO MATCH WITH ANY TEBLK ON CHAIN ! 21610: * ! 21611: {{MOV{#4*TENXT{R8{{SET OFFSET TO LINK FIELD (XL BASE) ! 21612: {{BRN{TFN11{{{JUMP TO MERGE ! 21613: {{EJC{{{{ ! 21614: * ! 21615: * TFIND (CONTINUED) ! 21616: * ! 21617: * HERE WE HAVE FOUND A MATCHING ELEMENT ! 21618: * ! 21619: {TFN08{MOV{R7{R10{{RESTORE TEBLK POINTER ! 21620: {{MOV{#4*TEVAL{R6{{SET TEBLK NAME OFFSET ! 21621: {{MOV{4*2(SP){R7{{RESTORE NAME/VALUE INDICATOR ! 21622: {{BNZ{R7{TFN09{{JUMP IF CALLED BY NAME ! 21623: {{JSR{ACESS{{{ELSE GET VALUE ! 21624: {{PPM{TFN12{{{JUMP IF REFERENCE FAILS ! 21625: {{ZER{R7{{{RESTORE NAME/VALUE INDICATOR ! 21626: * ! 21627: * COMMON EXIT FOR ENTRY FOUND ! 21628: * ! 21629: {TFN09{ADD{#4*NUM03{SP{{POP STACK ENTRIES ! 21630: {{EXI{{{{RETURN TO TFIND CALLER ! 21631: * ! 21632: * HERE IF NO TEBLKS ON THE HASH CHAIN ! 21633: * ! 21634: {TFN10{ADD{#4*TBBUK{R8{{GET OFFSET TO BUCKET PTR ! 21635: {{MOV{(SP){R10{{SET TBBLK PTR AS BASE ! 21636: * ! 21637: * MERGE HERE WITH (XL,WC) BASE,OFFSET OF FINAL LINK ! 21638: * ! 21639: {TFN11{MOV{(SP){R9{{TBBLK POINTER ! 21640: {{MOV{4*TBINV(R9){R9{{LOAD DEFAULT VALUE IN CASE ! 21641: {{MOV{4*2(SP){R7{{LOAD NAME/VALUE INDICATOR ! 21642: {{BZE{R7{TFN09{{EXIT WITH DEFAULT IF VALUE CALL ! 21643: * ! 21644: * HERE WE MUST BUILD A NEW TEBLK ! 21645: * ! 21646: {{MOV{#4*TESI${R6{{SET SIZE OF TEBLK ! 21647: {{JSR{ALLOC{{{ALLOCATE TEBLK ! 21648: {{ADD{R8{R10{{POINT TO HASH LINK ! 21649: {{MOV{R9{(R10){{LINK NEW TEBLK AT END OF CHAIN ! 21650: {{MOV{#B$TET{(R9){{STORE TYPE WORD ! 21651: {{MOV{#NULLS{4*TEVAL(R9){{SET NULL AS INITIAL VALUE ! 21652: {{MOV{(SP)+{4*TENXT(R9){{SET TBBLK PTR TO MARK END OF CHAIN ! 21653: {{MOV{(SP)+{4*TESUB(R9){{STORE SUBSCRIPT VALUE ! 21654: {{ICA{SP{{{POP PAST NAME/VALUE INDICATOR ! 21655: {{MOV{R9{R10{{COPY TEBLK POINTER (NAME BASE) ! 21656: {{MOV{#4*TEVAL{R6{{SET OFFSET ! 21657: {{EXI{{{{RETURN TO CALLER WITH NEW TEBLK ! 21658: * ! 21659: * ACESS FAIL RETURN ! 21660: * ! 21661: {TFN12{EXI{1{{{ALTERNATIVE RETURN ! 21662: {{ENP{{{{END PROCEDURE TFIND ! 21663: {{EJC{{{{ ! 21664: * ! 21665: * TRACE -- SET/RESET A TRACE ASSOCIATION ! 21666: * ! 21667: * THIS PROCEDURE IS SHARED BY TRACE AND STOPTR TO ! 21668: * EITHER INITIATE OR STOP A TRACE RESPECTIVELY. ! 21669: * ! 21670: * (XL) TRBLK PTR (TRACE) OR ZERO (STOPTR) ! 21671: * 1(XS) FIRST ARGUMENT (NAME) ! 21672: * 0(XS) SECOND ARGUMENT (TRACE TYPE) ! 21673: * JSR TRACE CALL TO SET/RESET TRACE ! 21674: * PPM LOC TRANSFER LOC IF 1ST ARG IS BAD NAME ! 21675: * PPM LOC TRANSFER LOC IF 2ND ARG IS BAD TYPE ! 21676: * (XS) POPPED ! 21677: * (XL,XR,WA,WB,WC,IA) DESTROYED ! 21678: * ! 21679: {TRACE{PRC{N{2{{ENTRY POINT ! 21680: {{JSR{GTSTG{{{GET TRACE TYPE STRING ! 21681: {{PPM{TRC15{{{JUMP IF NOT STRING ! 21682: {{PLC{R9{{{ELSE POINT TO STRING ! 21683: {{LCH{R6{(R9){{LOAD FIRST CHARACTER ! 21684: {{FLC{R6{{{FOLD TO UPPER CASE ! 21685: {{MOV{(SP){R9{{LOAD NAME ARGUMENT ! 21686: {{MOV{R10{(SP){{STACK TRBLK PTR OR ZERO ! 21687: {{MOV{#TRTAC{R8{{SET TRTYP FOR ACCESS TRACE ! 21688: {{BEQ{R6{#CH$LA{TRC10{JUMP IF A (ACCESS) ! 21689: {{MOV{#TRTVL{R8{{SET TRTYP FOR VALUE TRACE ! 21690: {{BEQ{R6{#CH$LV{TRC10{JUMP IF V (VALUE) ! 21691: {{BZE{R6{TRC10{{JUMP IF BLANK (VALUE) ! 21692: * ! 21693: * HERE FOR L,K,F,C,R ! 21694: * ! 21695: {{BEQ{R6{#CH$LF{TRC01{JUMP IF F (FUNCTION) ! 21696: {{BEQ{R6{#CH$LR{TRC01{JUMP IF R (RETURN) ! 21697: {{BEQ{R6{#CH$LL{TRC03{JUMP IF L (LABEL) ! 21698: {{BEQ{R6{#CH$LK{TRC06{JUMP IF K (KEYWORD) ! 21699: {{BNE{R6{#CH$LC{TRC15{ELSE ERROR IF NOT C (CALL) ! 21700: * ! 21701: * HERE FOR F,C,R ! 21702: * ! 21703: {TRC01{JSR{GTNVR{{{POINT TO VRBLK FOR NAME ! 21704: {{PPM{TRC16{{{JUMP IF BAD NAME ! 21705: {{ICA{SP{{{POP STACK ! 21706: {{MOV{4*VRFNC(R9){R9{{POINT TO FUNCTION BLOCK ! 21707: {{BNE{(R9){#B$PFC{TRC17{ERROR IF NOT PROGRAM FUNCTION ! 21708: {{BEQ{R6{#CH$LR{TRC02{JUMP IF R (RETURN) ! 21709: {{EJC{{{{ ! 21710: * ! 21711: * TRACE (CONTINUED) ! 21712: * ! 21713: * HERE FOR F,C TO SET/RESET CALL TRACE ! 21714: * ! 21715: {{MOV{R10{4*PFCTR(R9){{SET/RESET CALL TRACE ! 21716: {{BEQ{R6{#CH$LC{EXNUL{EXIT WITH NULL IF C (CALL) ! 21717: * ! 21718: * HERE FOR F,R TO SET/RESET RETURN TRACE ! 21719: * ! 21720: {TRC02{MOV{R10{4*PFRTR(R9){{SET/RESET RETURN TRACE ! 21721: {{EXI{{{{RETURN ! 21722: * ! 21723: * HERE FOR L TO SET/RESET LABEL TRACE ! 21724: * ! 21725: {TRC03{JSR{GTNVR{{{POINT TO VRBLK ! 21726: {{PPM{TRC16{{{JUMP IF BAD NAME ! 21727: {{MOV{4*VRLBL(R9){R10{{LOAD LABEL POINTER ! 21728: {{BNE{(R10){#B$TRT{TRC04{JUMP IF NO OLD TRACE ! 21729: {{MOV{4*TRLBL(R10){R10{{ELSE DELETE OLD TRACE ASSOCIATION ! 21730: * ! 21731: * HERE WITH OLD LABEL TRACE ASSOCIATION DELETED ! 21732: * ! 21733: {TRC04{BEQ{R10{#STNDL{TRC16{ERROR IF UNDEFINED LABEL ! 21734: {{MOV{(SP)+{R7{{GET TRBLK PTR AGAIN ! 21735: {{BZE{R7{TRC05{{JUMP IF STOPTR CASE ! 21736: {{MOV{R7{4*VRLBL(R9){{ELSE SET NEW TRBLK POINTER ! 21737: {{MOV{#B$VRT{4*VRTRA(R9){{SET LABEL TRACE ROUTINE ADDRESS ! 21738: {{MOV{R7{R9{{COPY TRBLK POINTER ! 21739: {{MOV{R10{4*TRLBL(R9){{STORE REAL LABEL IN TRBLK ! 21740: {{EXI{{{{RETURN ! 21741: * ! 21742: * HERE FOR STOPTR CASE FOR LABEL ! 21743: * ! 21744: {TRC05{MOV{R10{4*VRLBL(R9){{STORE LABEL PTR BACK IN VRBLK ! 21745: {{MOV{#B$VRG{4*VRTRA(R9){{STORE NORMAL TRANSFER ADDRESS ! 21746: {{EXI{{{{RETURN ! 21747: {{EJC{{{{ ! 21748: * ! 21749: * TRACE (CONTINUED) ! 21750: * ! 21751: * HERE FOR K (KEYWORD) ! 21752: * ! 21753: {TRC06{JSR{GTNVR{{{POINT TO VRBLK ! 21754: {{PPM{TRC16{{{ERROR IF NOT NATURAL VAR ! 21755: {{BNZ{4*VRLEN(R9){TRC16{{ERROR IF NOT SYSTEM VAR ! 21756: {{ICA{SP{{{POP STACK ! 21757: {{BZE{R10{TRC07{{JUMP IF STOPTR CASE ! 21758: {{MOV{R9{4*TRKVR(R10){{STORE VRBLK PTR IN TRBLK FOR KTREX ! 21759: * ! 21760: * MERGE HERE WITH TRBLK SET UP IN WB (OR ZERO) ! 21761: * ! 21762: {TRC07{MOV{4*VRSVP(R9){R9{{POINT TO SVBLK ! 21763: {{BEQ{R9{#V$ERT{TRC08{JUMP IF ERRTYPE ! 21764: {{BEQ{R9{#V$STC{TRC09{JUMP IF STCOUNT ! 21765: {{BNE{R9{#V$FNC{TRC17{ELSE ERROR IF NOT FNCLEVEL ! 21766: * ! 21767: * FNCLEVEL ! 21768: * ! 21769: {{MOV{R10{R$FNC{{SET/RESET FNCLEVEL TRACE ! 21770: {{EXI{{{{RETURN ! 21771: * ! 21772: * ERRTYPE ! 21773: * ! 21774: {TRC08{MOV{R10{R$ERT{{SET/RESET ERRTYPE TRACE ! 21775: {{EXI{{{{RETURN ! 21776: * ! 21777: * STCOUNT ! 21778: * ! 21779: {TRC09{MOV{R10{R$STC{{SET/RESET STCOUNT TRACE ! 21780: {{EXI{{{{RETURN ! 21781: {{EJC{{{{ ! 21782: * ! 21783: * TRACE (CONTINUED) ! 21784: * ! 21785: * A,V MERGE HERE WITH TRTYP VALUE IN WC ! 21786: * ! 21787: {TRC10{JSR{GTVAR{{{LOCATE VARIABLE ! 21788: {{PPM{TRC16{{{ERROR IF NOT APPROPRIATE NAME ! 21789: {{MOV{(SP)+{R7{{GET NEW TRBLK PTR AGAIN ! 21790: {{ADD{R10{R6{{POINT TO VARIABLE LOCATION ! 21791: {{MOV{R6{R9{{COPY VARIABLE POINTER ! 21792: * ! 21793: * LOOP TO SEARCH TRBLK CHAIN ! 21794: * ! 21795: {TRC11{MOV{(R9){R10{{POINT TO NEXT ENTRY ! 21796: {{BNE{(R10){#B$TRT{TRC13{JUMP IF NOT TRBLK ! 21797: {{BLT{R8{4*TRTYP(R10){TRC13{JUMP IF TOO FAR OUT ON CHAIN ! 21798: {{BEQ{R8{4*TRTYP(R10){TRC12{JUMP IF THIS MATCHES OUR TYPE ! 21799: {{ADD{#4*TRNXT{R10{{ELSE POINT TO LINK FIELD ! 21800: {{MOV{R10{R9{{COPY POINTER ! 21801: {{BRN{TRC11{{{AND LOOP BACK ! 21802: * ! 21803: * HERE TO DELETE AN OLD TRBLK OF THE TYPE WE WERE GIVEN ! 21804: * ! 21805: {TRC12{MOV{4*TRNXT(R10){R10{{GET PTR TO NEXT BLOCK OR VALUE ! 21806: {{MOV{R10{(R9){{STORE TO DELETE THIS TRBLK ! 21807: * ! 21808: * HERE AFTER DELETING ANY OLD ASSOCIATION OF THIS TYPE ! 21809: * ! 21810: {TRC13{BZE{R7{TRC14{{JUMP IF STOPTR CASE ! 21811: {{MOV{R7{(R9){{ELSE LINK NEW TRBLK IN ! 21812: {{MOV{R7{R9{{COPY TRBLK POINTER ! 21813: {{MOV{R10{4*TRNXT(R9){{STORE FORWARD POINTER ! 21814: {{MOV{R8{4*TRTYP(R9){{STORE APPROPRIATE TRAP TYPE CODE ! 21815: * ! 21816: * HERE TO MAKE SURE VRGET,VRSTO ARE SET PROPERLY ! 21817: * ! 21818: {TRC14{MOV{R6{R9{{RECALL POSSIBLE VRBLK POINTER ! 21819: {{SUB{#4*VRVAL{R9{{POINT BACK TO VRBLK ! 21820: {{JSR{SETVR{{{SET FIELDS IF VRBLK ! 21821: {{EXI{{{{RETURN ! 21822: * ! 21823: * HERE FOR BAD TRACE TYPE ! 21824: * ! 21825: {TRC15{EXI{2{{{TAKE BAD TRACE TYPE ERROR EXIT ! 21826: * ! 21827: * POP STACK BEFORE FAILING ! 21828: * ! 21829: {TRC16{ICA{SP{{{POP STACK ! 21830: * ! 21831: * HERE FOR BAD NAME ARGUMENT ! 21832: * ! 21833: {TRC17{EXI{1{{{TAKE BAD NAME ERROR EXIT ! 21834: {{ENP{{{{END PROCEDURE TRACE ! 21835: {{EJC{{{{ ! 21836: * ! 21837: * TRBLD -- BUILD TRBLK ! 21838: * ! 21839: * TRBLK IS USED BY THE INPUT, OUTPUT AND TRACE FUNCTIONS ! 21840: * TO CONSTRUCT A TRBLK (TRAP BLOCK) ! 21841: * ! 21842: * (XR) TRTAG OR TRTER ! 21843: * (XL) TRFNC OR TRFPT ! 21844: * (WB) TRTYP ! 21845: * JSR TRBLD CALL TO BUILD TRBLK ! 21846: * (XR) POINTER TO TRBLK ! 21847: * (WA) DESTROYED ! 21848: * ! 21849: {TRBLD{PRC{E{0{{ENTRY POINT ! 21850: {{MOV{R9{-(SP){{STACK TRTAG (OR TRFNM) ! 21851: {{MOV{#4*TRSI${R6{{SET SIZE OF TRBLK ! 21852: {{JSR{ALLOC{{{ALLOCATE TRBLK ! 21853: {{MOV{#B$TRT{(R9){{STORE FIRST WORD ! 21854: {{MOV{R10{4*TRFNC(R9){{STORE TRFNC (OR TRFPT) ! 21855: {{MOV{(SP)+{4*TRTAG(R9){{STORE TRTAG (OR TRFNM) ! 21856: {{MOV{R7{4*TRTYP(R9){{STORE TYPE ! 21857: {{MOV{#NULLS{4*TRVAL(R9){{FOR NOW, A NULL VALUE ! 21858: {{EXI{{{{RETURN TO CALLER ! 21859: {{ENP{{{{END PROCEDURE TRBLD ! 21860: {{EJC{{{{ ! 21861: * ! 21862: * TRIMR -- TRIM TRAILING BLANKS ! 21863: * ! 21864: * TRIMR IS PASSED A POINTER TO AN SCBLK WHICH MUST BE THE ! 21865: * LAST BLOCK IN DYNAMIC STORAGE. TRAILING BLANKS ARE ! 21866: * TRIMMED OFF AND THE DYNAMIC STORAGE POINTER RESET TO ! 21867: * THE END OF THE (POSSIBLY) SHORTENED BLOCK. ! 21868: * ! 21869: * (WB) NON-ZERO TO TRIM TRAILING BLANKS ! 21870: * (XR) POINTER TO STRING TO TRIM ! 21871: * JSR TRIMR CALL TO TRIM STRING ! 21872: * (XR) POINTER TO TRIMMED STRING ! 21873: * (XL,WA,WB,WC) DESTROYED ! 21874: * ! 21875: * THE CALL WITH WB ZERO STILL PERFORMS THE END ZERO PAD ! 21876: * AND DNAMP READJUSTMENT. IT IS USED FROM ACESS IF KVTRM=0. ! 21877: * ! 21878: {TRIMR{PRC{E{0{{ENTRY POINT ! 21879: {{MOV{R9{R10{{COPY STRING POINTER ! 21880: {{MOV{4*SCLEN(R9){R6{{LOAD STRING LENGTH ! 21881: {{BZE{R6{TRIM2{{JUMP IF NULL INPUT ! 21882: {{PLC{R10{R6{{ELSE POINT PAST LAST CHARACTER ! 21883: {{BZE{R7{TRIM3{{JUMP IF NO TRIM ! 21884: {{MOV{#CH$BL{R8{{LOAD BLANK CHARACTER ! 21885: * ! 21886: * LOOP THROUGH CHARACTERS FROM RIGHT TO LEFT ! 21887: * ! 21888: {TRIM0{LCH{R7{-(R10){{LOAD NEXT CHARACTER ! 21889: {{BEQ{R7{#CH$HT{TRIM1{JUMP IF HORIZONTAL TAB ! 21890: {{BNE{R7{R8{TRIM3{JUMP IF NON-BLANK FOUND ! 21891: {TRIM1{DCV{R6{{{ELSE DECREMENT CHARACTER COUNT ! 21892: {{BNZ{R6{TRIM0{{LOOP BACK IF MORE TO CHECK ! 21893: * ! 21894: * HERE IF RESULT IS NULL (NULL OR ALL-BLANK INPUT) ! 21895: * ! 21896: {TRIM2{MOV{R9{DNAMP{{WIPE OUT INPUT STRING BLOCK ! 21897: {{MOV{#NULLS{R9{{LOAD NULL RESULT ! 21898: {{BRN{TRIM5{{{MERGE TO EXIT ! 21899: {{EJC{{{{ ! 21900: * ! 21901: * TRIMR (CONTINUED) ! 21902: * ! 21903: * HERE WITH NON-BLANK FOUND (MERGE FOR NO TRIM) ! 21904: * ! 21905: {TRIM3{MOV{R6{4*SCLEN(R9){{SET NEW LENGTH ! 21906: {{MOV{R9{R10{{COPY STRING POINTER ! 21907: {{PSC{R10{R6{{READY FOR STORING BLANKS ! 21908: {{CTB{R6{SCHAR{{GET LENGTH OF BLOCK IN BYTES ! 21909: {{ADD{R9{R6{{POINT PAST NEW BLOCK ! 21910: {{MOV{R6{DNAMP{{SET NEW TOP OF STORAGE POINTER ! 21911: {{LCT{R6{#CFP$C{{GET COUNT OF CHARS IN WORD ! 21912: {{ZER{R8{{{SET BLANK CHAR ! 21913: * ! 21914: * LOOP TO ZERO PAD LAST WORD OF CHARACTERS ! 21915: * ! 21916: {TRIM4{SCH{R8{(R10)+{{STORE ZERO CHARACTER ! 21917: {{BCT{R6{TRIM4{{LOOP BACK TILL ALL STORED ! 21918: {{CSC{R10{{{COMPLETE STORE CHARACTERS ! 21919: * ! 21920: * COMMON EXIT POINT ! 21921: * ! 21922: {TRIM5{ZER{R10{{{CLEAR GARBAGE XL POINTER ! 21923: {{EXI{{{{RETURN TO CALLER ! 21924: {{ENP{{{{END PROCEDURE TRIMR ! 21925: {{EJC{{{{ ! 21926: * ! 21927: * TRXEQ -- EXECUTE FUNCTION TYPE TRACE ! 21928: * ! 21929: * TRXEQ IS USED TO EXECUTE A TRACE WHEN A FOURTH ARGUMENT ! 21930: * HAS BEEN SUPPLIED. TRACE HAS ALREADY BEEN DECREMENTED. ! 21931: * ! 21932: * (XR) POINTER TO TRBLK ! 21933: * (XL,WA) NAME BASE,OFFSET FOR VARIABLE ! 21934: * JSR TRXEQ CALL TO EXECUTE TRACE ! 21935: * (WB,WC,RA) DESTROYED ! 21936: * ! 21937: * THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING ! 21938: * CONTROL TO THE TRACE FUNCTION USING THE CFUNC ROUTINE. ! 21939: * ! 21940: * TRXEQ RETURN POINT WORD(S) ! 21941: * SAVED VALUE OF TRACE KEYWORD ! 21942: * TRBLK POINTER ! 21943: * NAME BASE ! 21944: * NAME OFFSET ! 21945: * SAVED VALUE OF R$COD ! 21946: * SAVED CODE PTR (-R$COD) ! 21947: * SAVED VALUE OF FLPTR ! 21948: * FLPTR --------------- ZERO (DUMMY FAIL OFFSET) ! 21949: * NMBLK FOR VARIABLE NAME ! 21950: * XS ------------------ TRACE TAG ! 21951: * ! 21952: * R$COD AND THE CODE PTR ARE SET TO DUMMY VALUES WHICH ! 21953: * CAUSE CONTROL TO RETURN TO THE TRXEQ PROCEDURE ON SUCCESS ! 21954: * OR FAILURE (TRXEQ IGNORES A FAILURE CONDITION). ! 21955: * ! 21956: {TRXEQ{PRC{R{0{{ENTRY POINT (RECURSIVE) ! 21957: {{MOV{R$COD{R8{{LOAD CODE BLOCK POINTER ! 21958: {{SCP{R7{{{GET CURRENT CODE POINTER ! 21959: {{SUB{R8{R7{{MAKE CODE POINTER INTO OFFSET ! 21960: {{MOV{KVTRA{-(SP){{STACK TRACE KEYWORD VALUE ! 21961: {{MOV{R9{-(SP){{STACK TRBLK POINTER ! 21962: {{MOV{R10{-(SP){{STACK NAME BASE ! 21963: {{MOV{R6{-(SP){{STACK NAME OFFSET ! 21964: {{MOV{R8{-(SP){{STACK CODE BLOCK POINTER ! 21965: {{MOV{R7{-(SP){{STACK CODE POINTER OFFSET ! 21966: {{MOV{FLPTR{-(SP){{STACK OLD FAILURE POINTER ! 21967: {{ZER{-(SP){{{SET DUMMY FAIL OFFSET ! 21968: {{MOV{SP{FLPTR{{SET NEW FAILURE POINTER ! 21969: {{ZER{KVTRA{{{RESET TRACE KEYWORD TO ZERO ! 21970: {{MOV{#TRXDC{R8{{LOAD NEW (DUMMY) CODE BLK POINTER ! 21971: {{MOV{R8{R$COD{{SET AS CODE BLOCK POINTER ! 21972: {{LCP{R8{{{AND NEW CODE POINTER ! 21973: {{EJC{{{{ ! 21974: * ! 21975: * TRXEQ (CONTINUED) ! 21976: * ! 21977: * NOW PREPARE ARGUMENTS FOR FUNCTION ! 21978: * ! 21979: {{MOV{R6{R7{{SAVE NAME OFFSET ! 21980: {{MOV{#4*NMSI${R6{{LOAD NMBLK SIZE ! 21981: {{JSR{ALLOC{{{ALLOCATE SPACE FOR NMBLK ! 21982: {{MOV{#B$NML{(R9){{SET TYPE WORD ! 21983: {{MOV{R10{4*NMBAS(R9){{STORE NAME BASE ! 21984: {{MOV{R7{4*NMOFS(R9){{STORE NAME OFFSET ! 21985: {{MOV{4*6(SP){R10{{RELOAD POINTER TO TRBLK ! 21986: {{MOV{R9{-(SP){{STACK NMBLK POINTER (1ST ARGUMENT) ! 21987: {{MOV{4*TRTAG(R10){-(SP){{STACK TRACE TAG (2ND ARGUMENT) ! 21988: {{MOV{4*TRFNC(R10){R10{{LOAD TRACE FUNCTION POINTER ! 21989: {{MOV{#NUM02{R6{{SET NUMBER OF ARGUMENTS TO TWO ! 21990: {{BRN{CFUNC{{{JUMP TO CALL FUNCTION ! 21991: * ! 21992: * SEE O$TXR FOR DETAILS OF RETURN TO THIS POINT ! 21993: * ! 21994: {TRXQ1{MOV{FLPTR{SP{{POINT BACK TO OUR STACK ENTRIES ! 21995: {{ICA{SP{{{POP OFF GARBAGE FAIL OFFSET ! 21996: {{MOV{(SP)+{FLPTR{{RESTORE OLD FAILURE POINTER ! 21997: {{MOV{(SP)+{R7{{RELOAD CODE OFFSET ! 21998: {{MOV{(SP)+{R8{{LOAD OLD CODE BASE POINTER ! 21999: {{MOV{R8{R9{{COPY CDBLK POINTER ! 22000: {{MOV{4*CDSTM(R9){KVSTN{{RESTORE STMNT NO ! 22001: {{MOV{(SP)+{R6{{RELOAD NAME OFFSET ! 22002: {{MOV{(SP)+{R10{{RELOAD NAME BASE ! 22003: {{MOV{(SP)+{R9{{RELOAD TRBLK POINTER ! 22004: {{MOV{(SP)+{KVTRA{{RESTORE TRACE KEYWORD VALUE ! 22005: {{ADD{R8{R7{{RECOMPUTE ABSOLUTE CODE POINTER ! 22006: {{LCP{R7{{{RESTORE CODE POINTER ! 22007: {{MOV{R8{R$COD{{AND CODE BLOCK POINTER ! 22008: {{EXI{{{{RETURN TO TRXEQ CALLER ! 22009: {{ENP{{{{END PROCEDURE TRXEQ ! 22010: {{EJC{{{{ ! 22011: * ! 22012: * XSCAN -- EXECUTION FUNCTION ARGUMENT SCAN ! 22013: * ! 22014: * XSCAN SCANS OUT ONE TOKEN IN A PROTOTYPE ARGUMENT IN ! 22015: * ARRAY,CLEAR,DATA,DEFINE,LOAD FUNCTION CALLS. XSCAN ! 22016: * CALLS MUST BE PRECEDED BY A CALL TO THE INITIALIZATION ! 22017: * PROCEDURE XSCNI. THE FOLLOWING VARIABLES ARE USED. ! 22018: * ! 22019: * R$XSC POINTER TO SCBLK FOR FUNCTION ARG ! 22020: * XSOFS OFFSET (NUM CHARS SCANNED SO FAR) ! 22021: * ! 22022: * (WC) DELIMITER ONE (CH$XX) ! 22023: * (XL) DELIMITER TWO (CH$XX) ! 22024: * JSR XSCAN CALL TO SCAN NEXT ITEM ! 22025: * (XR) POINTER TO SCBLK FOR TOKEN SCANNED ! 22026: * (WA) COMPLETION CODE (SEE BELOW) ! 22027: * (WC,XL) DESTROYED ! 22028: * ! 22029: * THE SCAN STARTS FROM THE CURRENT POSITION AND CONTINUES ! 22030: * UNTIL ONE OF THE FOLLOWING THREE CONDITIONS OCCURS. ! 22031: * ! 22032: * 1) DELIMITER ONE IS ENCOUNTERED (WA SET TO 1) ! 22033: * ! 22034: * 2) DELIMITER TWO ENCOUNTERED (WA SET TO 2) ! 22035: * ! 22036: * 3) END OF STRING ENCOUNTERED (WA SET TO 0) ! 22037: * ! 22038: * THE RESULT IS A STRING CONTAINING ALL CHARACTERS SCANNED ! 22039: * UP TO BUT NOT INCLUDING ANY DELIMITER CHARACTER. ! 22040: * THE POINTER IS LEFT POINTING PAST THE DELIMITER. ! 22041: * ! 22042: * IF ONLY ONE DELIMITER IS TO BE DETECTED, DELIMITER ONE ! 22043: * AND DELIMITER TWO SHOULD BE SET TO THE SAME VALUE. ! 22044: * ! 22045: * IN THE CASE WHERE THE END OF STRING IS ENCOUNTERED, THE ! 22046: * STRING INCLUDES ALL THE CHARACTERS TO THE END OF THE ! 22047: * STRING. NO FURTHER CALLS CAN BE MADE TO XSCAN UNTIL ! 22048: * XSCNI IS CALLED TO INITIALIZE A NEW ARGUMENT SCAN ! 22049: {{EJC{{{{ ! 22050: * ! 22051: * XSCAN (CONTINUED) ! 22052: * ! 22053: {XSCAN{PRC{E{0{{ENTRY POINT ! 22054: {{MOV{R7{XSCWB{{PRESERVE WB ! 22055: {{MOV{R$XSC{R9{{POINT TO ARGUMENT STRING ! 22056: {{MOV{4*SCLEN(R9){R6{{LOAD STRING LENGTH ! 22057: {{MOV{XSOFS{R7{{LOAD CURRENT OFFSET ! 22058: {{SUB{R7{R6{{GET NUMBER OF REMAINING CHARACTERS ! 22059: {{BZE{R6{XSCN2{{JUMP IF NO CHARACTERS LEFT ! 22060: {{PLC{R9{R7{{POINT TO CURRENT CHARACTER ! 22061: * ! 22062: * LOOP TO SEARCH FOR DELIMITER ! 22063: * ! 22064: {XSCN1{LCH{R7{(R9)+{{LOAD NEXT CHARACTER ! 22065: {{BEQ{R7{R8{XSCN3{JUMP IF DELIMITER ONE FOUND ! 22066: {{BEQ{R7{R10{XSCN4{JUMP IF DELIMITER TWO FOUND ! 22067: {{DCV{R6{{{DECREMENT COUNT OF CHARS LEFT ! 22068: {{BNZ{R6{XSCN1{{LOOP BACK IF MORE CHARS TO GO ! 22069: * ! 22070: * HERE FOR RUNOUT ! 22071: * ! 22072: {XSCN2{MOV{R$XSC{R10{{POINT TO STRING BLOCK ! 22073: {{MOV{4*SCLEN(R10){R6{{GET STRING LENGTH ! 22074: {{MOV{XSOFS{R7{{LOAD OFFSET ! 22075: {{SUB{R7{R6{{GET SUBSTRING LENGTH ! 22076: {{ZER{R$XSC{{{CLEAR STRING PTR FOR COLLECTOR ! 22077: {{ZER{XSCRT{{{SET ZERO (RUNOUT) RETURN CODE ! 22078: {{BRN{XSCN6{{{JUMP TO EXIT ! 22079: {{EJC{{{{ ! 22080: * ! 22081: * XSCAN (CONTINUED) ! 22082: * ! 22083: * HERE IF DELIMITER ONE FOUND ! 22084: * ! 22085: {XSCN3{MOV{#NUM01{XSCRT{{SET RETURN CODE ! 22086: {{BRN{XSCN5{{{JUMP TO MERGE ! 22087: * ! 22088: * HERE IF DELIMITER TWO FOUND ! 22089: * ! 22090: {XSCN4{MOV{#NUM02{XSCRT{{SET RETURN CODE ! 22091: * ! 22092: * MERGE HERE AFTER DETECTING A DELIMITER ! 22093: * ! 22094: {XSCN5{MOV{R$XSC{R10{{RELOAD POINTER TO STRING ! 22095: {{MOV{4*SCLEN(R10){R8{{GET ORIGINAL LENGTH OF STRING ! 22096: {{SUB{R6{R8{{MINUS CHARS LEFT = CHARS SCANNED ! 22097: {{MOV{R8{R6{{MOVE TO REG FOR SBSTR ! 22098: {{MOV{XSOFS{R7{{SET OFFSET ! 22099: {{SUB{R7{R6{{COMPUTE LENGTH FOR SBSTR ! 22100: {{ICV{R8{{{ADJUST NEW CURSOR PAST DELIMITER ! 22101: {{MOV{R8{XSOFS{{STORE NEW OFFSET ! 22102: * ! 22103: * COMMON EXIT POINT ! 22104: * ! 22105: {XSCN6{ZER{R9{{{CLEAR GARBAGE CHARACTER PTR IN XR ! 22106: {{JSR{SBSTR{{{BUILD SUB-STRING ! 22107: {{MOV{XSCRT{R6{{LOAD RETURN CODE ! 22108: {{MOV{XSCWB{R7{{RESTORE WB ! 22109: {{EXI{{{{RETURN TO XSCAN CALLER ! 22110: {{ENP{{{{END PROCEDURE XSCAN ! 22111: {{EJC{{{{ ! 22112: * ! 22113: * XSCNI -- EXECUTION FUNCTION ARGUMENT SCAN ! 22114: * ! 22115: * XSCNI INITIALIZES THE SCAN USED FOR PROTOTYPE ARGUMENTS ! 22116: * IN THE CLEAR, DEFINE, LOAD, DATA, ARRAY FUNCTIONS. SEE ! 22117: * XSCAN FOR THE PROCEDURE WHICH IS USED AFTER THIS CALL. ! 22118: * ! 22119: * -(XS) ARGUMENT TO BE SCANNED (ON STACK) ! 22120: * JSR XSCNI CALL TO SCAN ARGUMENT ! 22121: * PPM LOC TRANSFER LOC IF ARG IS NOT STRING ! 22122: * PPM LOC TRANSFER LOC IF ARGUMENT IS NULL ! 22123: * (XS) POPPED ! 22124: * (XR,R$XSC) ARGUMENT (SCBLK PTR) ! 22125: * (WA) ARGUMENT LENGTH ! 22126: * (IA,RA) DESTROYED ! 22127: * ! 22128: {XSCNI{PRC{N{2{{ENTRY POINT ! 22129: {{JSR{GTSTG{{{FETCH ARGUMENT AS STRING ! 22130: {{PPM{XSCI1{{{JUMP IF NOT CONVERTIBLE ! 22131: {{MOV{R9{R$XSC{{ELSE STORE SCBLK PTR FOR XSCAN ! 22132: {{ZER{XSOFS{{{SET OFFSET TO ZERO ! 22133: {{BZE{R6{XSCI2{{JUMP IF NULL STRING ! 22134: {{EXI{{{{RETURN TO XSCNI CALLER ! 22135: * ! 22136: * HERE IF ARGUMENT IS NOT A STRING ! 22137: * ! 22138: {XSCI1{EXI{1{{{TAKE NOT-STRING ERROR EXIT ! 22139: * ! 22140: * HERE FOR NULL STRING ! 22141: * ! 22142: {XSCI2{EXI{2{{{TAKE NULL-STRING ERROR EXIT ! 22143: {{ENP{{{{END PROCEDURE XSCNI ! 22144: {{TTL{S{{{P I T B O L -- UTILITY ROUTINES ! 22145: * ! 22146: * THE FOLLOWING SECTION CONTAINS UTILITY ROUTINES USED FOR ! 22147: * VARIOUS PURPOSES THROUGHOUT THE SYSTEM. THESE DIFFER ! 22148: * FROM THE PROCEDURES IN THE UTILITY PROCEDURES SECTION IN ! 22149: * THEY ARE NOT IN PROCEDURE FORM AND THEY DO NOT RETURN ! 22150: * TO THEIR CALLERS. THEY ARE ACCESSED WITH A BRANCH TYPE ! 22151: * INSTRUCTION AFTER SETTING THE REGISTERS TO APPROPRIATE ! 22152: * PARAMETER VALUES. ! 22153: * ! 22154: * THE REGISTER VALUES REQUIRED FOR EACH ROUTINE ARE ! 22155: * DOCUMENTED AT THE START OF EACH ROUTINE. REGISTERS NOT ! 22156: * MENTIONED MAY CONTAIN ANY VALUES EXCEPT THAT XR,XL ! 22157: * CAN ONLY CONTAIN PROPER COLLECTABLE POINTERS. ! 22158: * ! 22159: * SOME OF THESE ROUTINES WILL TOLERATE GARBAGE POINTERS ! 22160: * IN XL,XR ON ENTRY. THIS IS ALWAYS DOCUMENTED AND IN ! 22161: * EACH CASE, THE ROUTINE CLEARS THESE GARBAGE VALUES BEFORE ! 22162: * EXITING AFTER COMPLETING ITS TASK. ! 22163: * ! 22164: * THE ROUTINES HAVE NAMES CONSISTING OF FIVE LETTERS ! 22165: * AND ARE ASSEMBLED IN ALPHABETICAL ORDER. ! 22166: {{EJC{{{{ ! 22167: * ARREF -- ARRAY REFERENCE ! 22168: * ! 22169: * (XL) MAY BE NON-COLLECTABLE ! 22170: * (XR) NUMBER OF SUBSCRIPTS ! 22171: * (WB) SET ZERO/NONZERO FOR VALUE/NAME ! 22172: * THE VALUE IN WB MUST BE COLLECTABLE ! 22173: * STACK SUBSCRIPTS AND ARRAY OPERAND ! 22174: * BRN ARREF JUMP TO CALL FUNCTION ! 22175: * ! 22176: * ARREF CONTINUES BY EXECUTING THE NEXT CODE WORD WITH ! 22177: * THE RESULT NAME OR VALUE PLACED ON TOP OF THE STACK. ! 22178: * TO DEAL WITH THE PROBLEM OF ACCESSING SUBSCRIPTS IN THE ! 22179: * ORDER OF STACKING, XL IS USED AS A SUBSCRIPT POINTER ! 22180: * WORKING BELOW THE STACK POINTER. ! 22181: * ! 22182: {ARREF{RTN{{{{ ! 22183: {{MOV{R9{R6{{COPY NUMBER OF SUBSCRIPTS ! 22184: {{MOV{SP{R10{{POINT TO STACK FRONT ! 22185: {{WTB{R9{{{CONVERT TO BYTE OFFSET ! 22186: {{ADD{R9{R10{{POINT TO ARRAY OPERAND ON STACK ! 22187: {{ICA{R10{{{FINAL VALUE FOR STACK POPPING ! 22188: {{MOV{R10{ARFXS{{KEEP FOR LATER ! 22189: {{MOV{-(R10){R9{{LOAD ARRAY OPERAND POINTER ! 22190: {{MOV{R9{R$ARF{{KEEP ARRAY POINTER ! 22191: {{MOV{R10{R9{{SAVE POINTER TO SUBSCRIPTS ! 22192: {{MOV{R$ARF{R10{{POINT XL TO POSSIBLE VCBLK OR TBBLK ! 22193: {{MOV{(R10){R8{{LOAD FIRST WORD ! 22194: {{BEQ{R8{#B$ART{ARF01{JUMP IF ARBLK ! 22195: {{BEQ{R8{#B$VCT{ARF07{JUMP IF VCBLK ! 22196: {{BEQ{R8{#B$TBT{ARF10{JUMP IF TBBLK ! 22197: {{ERB{235{SUBSCRIPTED{{OPERAND IS NOT TABLE OR ARRAY ! 22198: * ! 22199: * HERE FOR ARRAY (ARBLK) ! 22200: * ! 22201: {ARF01{BNE{R6{4*ARNDM(R10){ARF09{JUMP IF WRONG NUMBER OF DIMS ! 22202: {{LDI{INTV0{{{GET INITIAL SUBSCRIPT OF ZERO ! 22203: {{MOV{R9{R10{{POINT BEFORE SUBSCRIPTS ! 22204: {{ZER{R6{{{INITIAL OFFSET TO BOUNDS ! 22205: {{BRN{ARF03{{{JUMP INTO LOOP ! 22206: * ! 22207: * LOOP TO COMPUTE SUBSCRIPTS BY MULTIPLICATIONS ! 22208: * ! 22209: {ARF02{MLI{4*ARDM2(R9){{{MULTIPLY TOTAL BY NEXT DIMENSION ! 22210: * ! 22211: * MERGE HERE FIRST TIME ! 22212: * ! 22213: {ARF03{MOV{-(R10){R9{{LOAD NEXT SUBSCRIPT ! 22214: {{STI{ARFSI{{{SAVE CURRENT SUBSCRIPT ! 22215: {{LDI{4*ICVAL(R9){{{LOAD INTEGER VALUE IN CASE ! 22216: {{BEQ{(R9){#B$ICL{ARF04{JUMP IF IT WAS AN INTEGER ! 22217: {{EJC{{{{ ! 22218: * ! 22219: * ARREF (CONTINUED) ! 22220: * ! 22221: * ! 22222: {{JSR{GTINT{{{CONVERT TO INTEGER ! 22223: {{PPM{ARF12{{{JUMP IF NOT INTEGER ! 22224: {{LDI{4*ICVAL(R9){{{IF OK, LOAD INTEGER VALUE ! 22225: * ! 22226: * HERE WITH INTEGER SUBSCRIPT IN (IA) ! 22227: * ! 22228: {ARF04{MOV{R$ARF{R9{{POINT TO ARRAY ! 22229: {{ADD{R6{R9{{OFFSET TO NEXT BOUNDS ! 22230: {{SBI{4*ARLBD(R9){{{SUBTRACT LOW BOUND TO COMPARE ! 22231: {{IOV{ARF13{{{OUT OF RANGE FAIL IF OVERFLOW ! 22232: {{ILT{ARF13{{{OUT OF RANGE FAIL IF TOO SMALL ! 22233: {{SBI{4*ARDIM(R9){{{SUBTRACT DIMENSION ! 22234: {{IGE{ARF13{{{OUT OF RANGE FAIL IF TOO LARGE ! 22235: {{ADI{4*ARDIM(R9){{{ELSE RESTORE SUBSCRIPT OFFSET ! 22236: {{ADI{ARFSI{{{ADD TO CURRENT TOTAL ! 22237: {{ADD{#4*ARDMS{R6{{POINT TO NEXT BOUNDS ! 22238: {{BNE{R10{SP{ARF02{LOOP BACK IF MORE TO GO ! 22239: * ! 22240: * HERE WITH INTEGER SUBSCRIPT COMPUTED ! 22241: * ! 22242: {{MFI{R6{{{GET AS ONE WORD INTEGER ! 22243: {{WTB{R6{{{CONVERT TO OFFSET ! 22244: {{MOV{R$ARF{R10{{POINT TO ARBLK ! 22245: {{ADD{4*AROFS(R10){R6{{ADD OFFSET PAST BOUNDS ! 22246: {{ICA{R6{{{ADJUST FOR ARPRO FIELD ! 22247: {{BNZ{R7{ARF08{{EXIT WITH NAME IF NAME CALL ! 22248: * ! 22249: * MERGE HERE TO GET VALUE FOR VALUE CALL ! 22250: * ! 22251: {ARF05{JSR{ACESS{{{GET VALUE ! 22252: {{PPM{ARF13{{{FAIL IF ACESS FAILS ! 22253: * ! 22254: * RETURN VALUE ! 22255: * ! 22256: {ARF06{MOV{ARFXS{SP{{POP STACK ENTRIES ! 22257: {{ZER{R$ARF{{{FINISHED WITH ARRAY POINTER ! 22258: {{BRN{EXIXR{{{EXIT WITH VALUE IN XR ! 22259: {{EJC{{{{ ! 22260: * ! 22261: * ARREF (CONTINUED) ! 22262: * ! 22263: * HERE FOR VECTOR ! 22264: * ! 22265: {ARF07{BNE{R6{#NUM01{ARF09{ERROR IF MORE THAN 1 SUBSCRIPT ! 22266: {{MOV{(SP){R9{{ELSE LOAD SUBSCRIPT ! 22267: {{JSR{GTINT{{{CONVERT TO INTEGER ! 22268: {{PPM{ARF12{{{ERROR IF NOT INTEGER ! 22269: {{LDI{4*ICVAL(R9){{{ELSE LOAD INTEGER VALUE ! 22270: {{SBI{INTV1{{{SUBTRACT FOR ONES OFFSET ! 22271: {{MFI{R6{ARF13{{GET SUBSCRIPT AS ONE WORD ! 22272: {{ADD{#VCVLS{R6{{ADD OFFSET FOR STANDARD FIELDS ! 22273: {{WTB{R6{{{CONVERT OFFSET TO BYTES ! 22274: {{BGE{R6{4*VCLEN(R10){ARF13{FAIL IF OUT OF RANGE SUBSCRIPT ! 22275: {{BZE{R7{ARF05{{BACK TO GET VALUE IF VALUE CALL ! 22276: * ! 22277: * RETURN NAME ! 22278: * ! 22279: {ARF08{MOV{ARFXS{SP{{POP STACK ENTRIES ! 22280: {{ZER{R$ARF{{{FINISHED WITH ARRAY POINTER ! 22281: {{BRN{EXNAM{{{ELSE EXIT WITH NAME ! 22282: * ! 22283: * HERE IF SUBSCRIPT COUNT IS WRONG ! 22284: * ! 22285: {ARF09{ERB{236{ARRAY{{REFERENCED WITH WRONG NUMBER OF SUBSCRIPTS ! 22286: * ! 22287: * TABLE ! 22288: * ! 22289: {ARF10{BNE{R6{#NUM01{ARF11{ERROR IF MORE THAN 1 SUBSCRIPT ! 22290: {{MOV{(SP){R9{{ELSE LOAD SUBSCRIPT ! 22291: {{JSR{TFIND{{{CALL TABLE SEARCH ROUTINE ! 22292: {{PPM{ARF13{{{FAIL IF FAILED ! 22293: {{BNZ{R7{ARF08{{EXIT WITH NAME IF NAME CALL ! 22294: {{BRN{ARF06{{{ELSE EXIT WITH VALUE ! 22295: * ! 22296: * HERE FOR BAD TABLE REFERENCE ! 22297: * ! 22298: {ARF11{ERB{237{TABLE{{REFERENCED WITH MORE THAN ONE SUBSCRIPT ! 22299: * ! 22300: * HERE FOR BAD SUBSCRIPT ! 22301: * ! 22302: {ARF12{ERB{238{ARRAY{{SUBSCRIPT IS NOT INTEGER ! 22303: * ! 22304: * HERE TO SIGNAL FAILURE ! 22305: * ! 22306: {ARF13{ZER{R$ARF{{{FINISHED WITH ARRAY POINTER ! 22307: {{BRN{EXFAL{{{FAIL ! 22308: {{EJC{{{{ ! 22309: * ! 22310: * CFUNC -- CALL A FUNCTION ! 22311: * ! 22312: * CFUNC IS USED TO CALL A SNOBOL LEVEL FUNCTION. IT IS ! 22313: * USED BY THE APPLY FUNCTION (S$APP), THE FUNCTION ! 22314: * TRACE ROUTINE (TRXEQ) AND THE MAIN FUNCTION CALL ENTRY ! 22315: * (O$FNC, O$FNS). IN THE LATTER CASES, CFUNC IS USED ONLY ! 22316: * IF THE NUMBER OF ARGUMENTS IS INCORRECT. ! 22317: * ! 22318: * (XL) POINTER TO FUNCTION BLOCK ! 22319: * (WA) ACTUAL NUMBER OF ARGUMENTS ! 22320: * (XS) POINTS TO STACKED ARGUMENTS ! 22321: * BRN CFUNC JUMP TO CALL FUNCTION ! 22322: * ! 22323: * CFUNC CONTINUES BY EXECUTING THE FUNCTION ! 22324: * ! 22325: {CFUNC{RTN{{{{ ! 22326: {{BLT{R6{4*FARGS(R10){CFNC1{JUMP IF TOO FEW ARGUMENTS ! 22327: {{BEQ{R6{4*FARGS(R10){CFNC3{JUMP IF CORRECT NUMBER OF ARGS ! 22328: * ! 22329: * HERE IF TOO MANY ARGUMENTS SUPPLIED, POP THEM OFF ! 22330: * ! 22331: {{MOV{R6{R7{{COPY ACTUAL NUMBER ! 22332: {{SUB{4*FARGS(R10){R7{{GET NUMBER OF EXTRA ARGS ! 22333: {{WTB{R7{{{CONVERT TO BYTES ! 22334: {{ADD{R7{SP{{POP OFF UNWANTED ARGUMENTS ! 22335: {{BRN{CFNC3{{{JUMP TO GO OFF TO FUNCTION ! 22336: * ! 22337: * HERE IF TOO FEW ARGUMENTS ! 22338: * ! 22339: {CFNC1{MOV{4*FARGS(R10){R7{{LOAD REQUIRED NUMBER OF ARGUMENTS ! 22340: {{BEQ{R7{#NINI9{CFNC3{JUMP IF CASE OF VAR NUM OF ARGS ! 22341: {{SUB{R6{R7{{CALCULATE NUMBER MISSING ! 22342: {{LCT{R7{R7{{SET COUNTER TO CONTROL LOOP ! 22343: * ! 22344: * LOOP TO SUPPLY EXTRA NULL ARGUMENTS ! 22345: * ! 22346: {CFNC2{MOV{#NULLS{-(SP){{STACK A NULL ARGUMENT ! 22347: {{BCT{R7{CFNC2{{LOOP TILL PROPER NUMBER STACKED ! 22348: * ! 22349: * MERGE HERE TO JUMP TO FUNCTION ! 22350: * ! 22351: {CFNC3{BRI{(R10){{{JUMP THROUGH FCODE FIELD ! 22352: {{EJC{{{{ ! 22353: * ! 22354: * EXFAL -- EXIT SIGNALLING SNOBOL FAILURE ! 22355: * ! 22356: * (XL,XR) MAY BE NON-COLLECTABLE ! 22357: * BRN EXFAL JUMP TO FAIL ! 22358: * ! 22359: * EXFAL CONTINUES BY EXECUTING THE APPROPRIATE FAIL GOTO ! 22360: * ! 22361: {EXFAL{RTN{{{{ ! 22362: {{MOV{FLPTR{SP{{POP STACK ! 22363: {{MOV{(SP){R9{{LOAD FAILURE OFFSET ! 22364: {{ADD{R$COD{R9{{POINT TO FAILURE CODE LOCATION ! 22365: {{LCP{R9{{{SET CODE POINTER ! 22366: {{BRN{EXITS{{{DO NEXT CODE WORD ! 22367: {{EJC{{{{ ! 22368: * ! 22369: * EXINT -- EXIT WITH INTEGER RESULT ! 22370: * ! 22371: * (XL,XR) MAY BE NONCOLLECTABLE ! 22372: * (IA) INTEGER VALUE ! 22373: * BRN EXINT JUMP TO EXIT WITH INTEGER ! 22374: * ! 22375: * EXINT CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22376: * WHICH IT DOES BY FALLING THROUGH TO EXIXR ! 22377: * ! 22378: {EXINT{RTN{{{{ ! 22379: {{JSR{ICBLD{{{BUILD ICBLK ! 22380: {{EJC{{{{ ! 22381: * EXIXR -- EXIT WITH RESULT IN (XR) ! 22382: * ! 22383: * (XR) RESULT ! 22384: * (XL) MAY BE NON-COLLECTABLE ! 22385: * BRN EXIXR JUMP TO EXIT WITH RESULT IN (XR) ! 22386: * ! 22387: * EXIXR CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22388: * WHICH IT DOES BY FALLING THROUGH TO EXITS. ! 22389: {EXIXR{RTN{{{{ ! 22390: * ! 22391: {{MOV{R9{-(SP){{STACK RESULT ! 22392: * ! 22393: * ! 22394: * EXITS -- EXIT WITH RESULT IF ANY STACKED ! 22395: * ! 22396: * (XR,XL) MAY BE NON-COLLECTABLE ! 22397: * ! 22398: * BRN EXITS ENTER EXITS ROUTINE ! 22399: * ! 22400: {EXITS{RTN{{{{ ! 22401: {{LCW{R9{{{LOAD NEXT CODE WORD ! 22402: {{MOV{(R9){R10{{LOAD ENTRY ADDRESS ! 22403: {{BRI{R10{{{JUMP TO EXECUTE NEXT CODE WORD ! 22404: {{EJC{{{{ ! 22405: * ! 22406: * EXNAM -- EXIT WITH NAME IN (XL,WA) ! 22407: * ! 22408: * (XL) NAME BASE ! 22409: * (WA) NAME OFFSET ! 22410: * (XR) MAY BE NON-COLLECTABLE ! 22411: * BRN EXNAM JUMP TO EXIT WITH NAME IN (XL,WA) ! 22412: * ! 22413: * EXNAM CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22414: * ! 22415: {EXNAM{RTN{{{{ ! 22416: {{MOV{R10{-(SP){{STACK NAME BASE ! 22417: {{MOV{R6{-(SP){{STACK NAME OFFSET ! 22418: {{BRN{EXITS{{{DO NEXT CODE WORD ! 22419: {{EJC{{{{ ! 22420: * ! 22421: * EXNUL -- EXIT WITH NULL RESULT ! 22422: * ! 22423: * (XL,XR) MAY BE NON-COLLECTABLE ! 22424: * BRN EXNUL JUMP TO EXIT WITH NULL VALUE ! 22425: * ! 22426: * EXNUL CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22427: * ! 22428: {EXNUL{RTN{{{{ ! 22429: {{MOV{#NULLS{-(SP){{STACK NULL VALUE ! 22430: {{BRN{EXITS{{{DO NEXT CODE WORD ! 22431: {{EJC{{{{ ! 22432: * ! 22433: * EXREA -- EXIT WITH REAL RESULT ! 22434: * ! 22435: * (XL,XR) MAY BE NON-COLLECTABLE ! 22436: * (RA) REAL VALUE ! 22437: * BRN EXREA JUMP TO EXIT WITH REAL VALUE ! 22438: * ! 22439: * EXREA CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22440: * ! 22441: {EXREA{RTN{{{{ ! 22442: {{JSR{RCBLD{{{BUILD RCBLK ! 22443: {{BRN{EXIXR{{{JUMP TO EXIT WITH RESULT IN XR ! 22444: {{EJC{{{{ ! 22445: * ! 22446: * EXSID -- EXIT SETTING ID FIELD ! 22447: * ! 22448: * EXSID IS USED TO EXIT AFTER BUILDING ANY OF THE FOLLOWING ! 22449: * BLOCKS (ARBLK, TBBLK, PDBLK, VCBLK). IT SETS THE IDVAL. ! 22450: * ! 22451: * (XR) PTR TO BLOCK WITH IDVAL FIELD ! 22452: * (XL) MAY BE NON-COLLECTABLE ! 22453: * BRN EXSID JUMP TO EXIT AFTER SETTING ID FIELD ! 22454: * ! 22455: * EXSID CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22456: * ! 22457: {EXSID{RTN{{{{ ! 22458: {{MOV{CURID{R6{{LOAD CURRENT ID VALUE ! 22459: {{BNE{R6{#CFP$M{EXSI1{JUMP IF NO OVERFLOW ! 22460: {{ZER{R6{{{ELSE RESET FOR WRAPAROUND ! 22461: * ! 22462: * HERE WITH OLD IDVAL IN WA ! 22463: * ! 22464: {EXSI1{ICV{R6{{{BUMP ID VALUE ! 22465: {{MOV{R6{CURID{{STORE FOR NEXT TIME ! 22466: {{MOV{R6{4*IDVAL(R9){{STORE ID VALUE ! 22467: {{BRN{EXIXR{{{EXIT WITH RESULT IN (XR) ! 22468: {{EJC{{{{ ! 22469: * ! 22470: * EXVNM -- EXIT WITH NAME OF VARIABLE ! 22471: * ! 22472: * EXVNM EXITS AFTER STACKING A VALUE WHICH IS A NMBLK ! 22473: * REFERENCING THE NAME OF A GIVEN NATURAL VARIABLE. ! 22474: * ! 22475: * (XR) VRBLK POINTER ! 22476: * (XL) MAY BE NON-COLLECTABLE ! 22477: * BRN EXVNM EXIT WITH VRBLK POINTER IN XR ! 22478: * ! 22479: {EXVNM{RTN{{{{ ! 22480: {{MOV{R9{R10{{COPY NAME BASE POINTER ! 22481: {{MOV{#4*NMSI${R6{{SET SIZE OF NMBLK ! 22482: {{JSR{ALLOC{{{ALLOCATE NMBLK ! 22483: {{MOV{#B$NML{(R9){{STORE TYPE WORD ! 22484: {{MOV{R10{4*NMBAS(R9){{STORE NAME BASE ! 22485: {{MOV{#4*VRVAL{4*NMOFS(R9){{STORE NAME OFFSET ! 22486: {{BRN{EXIXR{{{EXIT WITH RESULT IN XR ! 22487: {{EJC{{{{ ! 22488: * ! 22489: * FLPOP -- FAIL AND POP IN PATTERN MATCHING ! 22490: * ! 22491: * FLPOP POPS THE NODE AND CURSOR ON THE STACK AND THEN ! 22492: * DROPS THROUGH INTO FAILP TO CAUSE PATTERN FAILURE ! 22493: * ! 22494: * (XL,XR) MAY BE NON-COLLECTABLE ! 22495: * BRN FLPOP JUMP TO FAIL AND POP STACK ! 22496: * ! 22497: {FLPOP{RTN{{{{ ! 22498: {{ADD{#4*NUM02{SP{{POP TWO ENTRIES OFF STACK ! 22499: {{EJC{{{{ ! 22500: * ! 22501: * FAILP -- FAILURE IN MATCHING PATTERN NODE ! 22502: * ! 22503: * FAILP IS USED AFTER FAILING TO MATCH A PATTERN NODE. ! 22504: * SEE PATTERN MATCH ROUTINES FOR DETAILS OF USE. ! 22505: * ! 22506: * (XL,XR) MAY BE NON-COLLECTABLE ! 22507: * BRN FAILP SIGNAL FAILURE TO MATCH ! 22508: * ! 22509: * FAILP CONTINUES BY MATCHING AN ALTERNATIVE FROM THE STACK ! 22510: * ! 22511: {FAILP{RTN{{{{ ! 22512: {{MOV{(SP)+{R9{{LOAD ALTERNATIVE NODE POINTER ! 22513: {{MOV{(SP)+{R7{{RESTORE OLD CURSOR ! 22514: {{MOV{(R9){R10{{LOAD PCODE ENTRY POINTER ! 22515: {{BRI{R10{{{JUMP TO EXECUTE CODE FOR NODE ! 22516: {{EJC{{{{ ! 22517: * ! 22518: * INDIR -- COMPUTE INDIRECT REFERENCE ! 22519: * ! 22520: * (WB) NONZERO/ZERO FOR BY NAME/VALUE ! 22521: * BRN INDIR JUMP TO GET INDIRECT REF ON STACK ! 22522: * ! 22523: * INDIR CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22524: * ! 22525: {INDIR{RTN{{{{ ! 22526: {{MOV{(SP)+{R9{{LOAD ARGUMENT ! 22527: {{BEQ{(R9){#B$NML{INDR2{JUMP IF A NAME ! 22528: {{JSR{GTNVR{{{ELSE CONVERT TO VARIABLE ! 22529: {{ERR{239{INDIRECTION{{OPERAND IS NOT NAME ! 22530: {{BZE{R7{INDR1{{SKIP IF BY VALUE ! 22531: {{MOV{R9{-(SP){{ELSE STACK VRBLK PTR ! 22532: {{MOV{#4*VRVAL{-(SP){{STACK NAME OFFSET ! 22533: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK ! 22534: * ! 22535: * HERE TO GET VALUE OF NATURAL VARIABLE ! 22536: * ! 22537: {INDR1{BRI{(R9){{{JUMP THROUGH VRGET FIELD OF VRBLK ! 22538: * ! 22539: * HERE IF OPERAND IS A NAME ! 22540: * ! 22541: {INDR2{MOV{4*NMBAS(R9){R10{{LOAD NAME BASE ! 22542: {{MOV{4*NMOFS(R9){R6{{LOAD NAME OFFSET ! 22543: {{BNZ{R7{EXNAM{{EXIT IF CALLED BY NAME ! 22544: {{JSR{ACESS{{{ELSE GET VALUE FIRST ! 22545: {{PPM{EXFAL{{{FAIL IF ACCESS FAILS ! 22546: {{BRN{EXIXR{{{ELSE RETURN WITH VALUE IN XR ! 22547: {{EJC{{{{ ! 22548: * ! 22549: * MATCH -- INITIATE PATTERN MATCH ! 22550: * ! 22551: * (WB) MATCH TYPE CODE ! 22552: * BRN MATCH JUMP TO INITIATE PATTERN MATCH ! 22553: * ! 22554: * MATCH CONTINUES BY EXECUTING THE PATTERN MATCH. SEE ! 22555: * PATTERN MATCH ROUTINES (P$XXX) FOR FULL DETAILS. ! 22556: * ! 22557: {MATCH{RTN{{{{ ! 22558: {{MOV{(SP)+{R9{{LOAD PATTERN OPERAND ! 22559: {{JSR{GTPAT{{{CONVERT TO PATTERN ! 22560: {{ERR{240{PATTERN{{MATCH RIGHT OPERAND IS NOT PATTERN ! 22561: {{MOV{R9{R10{{IF OK, SAVE PATTERN POINTER ! 22562: {{BNZ{R7{MTCH1{{JUMP IF NOT MATCH BY NAME ! 22563: {{MOV{(SP){R6{{ELSE LOAD NAME OFFSET ! 22564: {{MOV{R10{-(SP){{SAVE PATTERN POINTER ! 22565: {{MOV{4*2(SP){R10{{LOAD NAME BASE ! 22566: {{JSR{ACESS{{{ACCESS SUBJECT VALUE ! 22567: {{PPM{EXFAL{{{FAIL IF ACCESS FAILS ! 22568: {{MOV{(SP){R10{{RESTORE PATTERN POINTER ! 22569: {{MOV{R9{(SP){{STACK SUBJECT STRING VAL FOR MERGE ! 22570: {{ZER{R7{{{RESTORE TYPE CODE ! 22571: * ! 22572: * MERGE HERE WITH SUBJECT VALUE ON STACK ! 22573: * ! 22574: {MTCH1{MOV{(SP){R9{{LOAD SUBJECT VALUE ! 22575: {{ZER{R$PMB{{{ASSUME NOT A BUFFER ! 22576: {{BNE{(R9){#B$BCT{MTCHA{BRANCH IF NOT ! 22577: {{ICA{SP{{{ELSE POP VALUE ! 22578: {{MOV{R9{R$PMB{{SAVE POINTER ! 22579: {{MOV{4*BCLEN(R9){R6{{GET DEFINED LENGTH ! 22580: {{MOV{4*BCBUF(R9){R9{{POINT TO BFBLK ! 22581: {{BRN{MTCHB{{{ ! 22582: * ! 22583: * HERE IF NOT BUFFER TO CONVERT TO STRING ! 22584: * ! 22585: {MTCHA{JSR{GTSTG{{{NOT BUFFER - CONVERT TO STRING ! 22586: {{ERR{241{PATTERN{{MATCH LEFT OPERAND IS NOT STRING ! 22587: * ! 22588: * MERGE WITH BUFFER OR STRING ! 22589: * ! 22590: {MTCHB{MOV{R9{R$PMS{{IF OK, STORE SUBJECT STRING POINTER ! 22591: {{MOV{R6{PMSSL{{AND LENGTH ! 22592: {{MOV{R7{-(SP){{STACK MATCH TYPE CODE ! 22593: {{ZER{-(SP){{{STACK INITIAL CURSOR (ZERO) ! 22594: {{ZER{R7{{{SET INITIAL CURSOR ! 22595: {{MOV{SP{PMHBS{{SET HISTORY STACK BASE PTR ! 22596: {{ZER{PMDFL{{{RESET PATTERN ASSIGNMENT FLAG ! 22597: {{MOV{R10{R9{{SET INITIAL NODE POINTER ! 22598: {{BNZ{KVANC{MTCH2{{JUMP IF ANCHORED ! 22599: * ! 22600: * HERE FOR UNANCHORED ! 22601: * ! 22602: {{MOV{R9{-(SP){{STACK INITIAL NODE POINTER ! 22603: {{MOV{#NDUNA{-(SP){{STACK POINTER TO ANCHOR MOVE NODE ! 22604: {{BRI{(R9){{{START MATCH OF FIRST NODE ! 22605: * ! 22606: * HERE IN ANCHORED MODE ! 22607: * ! 22608: {MTCH2{ZER{-(SP){{{DUMMY CURSOR VALUE ! 22609: {{MOV{#NDABO{-(SP){{STACK POINTER TO ABORT NODE ! 22610: {{BRI{(R9){{{START MATCH OF FIRST NODE ! 22611: {{EJC{{{{ ! 22612: * ! 22613: * RETRN -- RETURN FROM FUNCTION ! 22614: * ! 22615: * (WA) STRING POINTER FOR RETURN TYPE ! 22616: * BRN RETRN JUMP TO RETURN FROM (SNOBOL) FUNC ! 22617: * ! 22618: * RETRN CONTINUES BY EXECUTING THE CODE AT THE RETURN POINT ! 22619: * THE STACK IS CLEANED OF ANY GARBAGE LEFT BY OTHER ! 22620: * ROUTINES WHICH MAY HAVE ALTERED FLPTR SINCE FUNCTION ! 22621: * ENTRY BY USING FLPRT, RESERVED FOR USE ONLY BY ! 22622: * FUNCTION CALL AND RETURN. ! 22623: * ! 22624: {RETRN{RTN{{{{ ! 22625: {{BNZ{KVFNC{RTN01{{JUMP IF NOT LEVEL ZERO ! 22626: {{ERB{242{FUNCTION{{RETURN FROM LEVEL ZERO ! 22627: * ! 22628: * HERE IF NOT LEVEL ZERO RETURN ! 22629: * ! 22630: {RTN01{MOV{FLPRT{SP{{POP STACK ! 22631: {{ICA{SP{{{REMOVE FAILURE OFFSET ! 22632: {{MOV{(SP)+{R9{{POP PFBLK POINTER ! 22633: {{MOV{(SP)+{FLPTR{{POP FAILURE POINTER ! 22634: {{MOV{(SP)+{FLPRT{{POP OLD FLPRT ! 22635: {{MOV{(SP)+{R7{{POP CODE POINTER OFFSET ! 22636: {{MOV{(SP)+{R8{{POP OLD CODE BLOCK POINTER ! 22637: {{ADD{R8{R7{{MAKE OLD CODE POINTER ABSOLUTE ! 22638: {{LCP{R7{{{RESTORE OLD CODE POINTER ! 22639: {{MOV{R8{R$COD{{RESTORE OLD CODE BLOCK POINTER ! 22640: {{DCV{KVFNC{{{DECREMENT FUNCTION LEVEL ! 22641: {{MOV{KVTRA{R7{{LOAD TRACE ! 22642: {{ADD{KVFTR{R7{{ADD FTRACE ! 22643: {{BZE{R7{RTN06{{JUMP IF NO TRACING POSSIBLE ! 22644: * ! 22645: * HERE IF THERE MAY BE A TRACE ! 22646: * ! 22647: {{MOV{R6{-(SP){{SAVE FUNCTION RETURN TYPE ! 22648: {{MOV{R9{-(SP){{SAVE PFBLK POINTER ! 22649: {{MOV{R6{KVRTN{{SET RTNTYPE FOR TRACE FUNCTION ! 22650: {{MOV{R$FNC{R10{{LOAD FNCLEVEL TRBLK PTR (IF ANY) ! 22651: {{JSR{KTREX{{{EXECUTE POSSIBLE FNCLEVEL TRACE ! 22652: {{MOV{4*PFVBL(R9){R10{{LOAD VRBLK PTR (SGD13) ! 22653: {{BZE{KVTRA{RTN02{{JUMP IF TRACE IS OFF ! 22654: {{MOV{4*PFRTR(R9){R9{{ELSE LOAD RETURN TRACE TRBLK PTR ! 22655: {{BZE{R9{RTN02{{JUMP IF NOT RETURN TRACED ! 22656: {{DCV{KVTRA{{{ELSE DECREMENT TRACE COUNT ! 22657: {{BZE{4*TRFNC(R9){RTN03{{JUMP IF PRINT TRACE ! 22658: {{MOV{#4*VRVAL{R6{{ELSE SET NAME OFFSET ! 22659: {{MOV{4*1(SP){KVRTN{{MAKE SURE RTNTYPE IS SET RIGHT ! 22660: {{JSR{TRXEQ{{{EXECUTE FULL TRACE ! 22661: {{EJC{{{{ ! 22662: * ! 22663: * RETRN (CONTINUED) ! 22664: * ! 22665: * HERE TO TEST FOR FTRACE ! 22666: * ! 22667: {RTN02{BZE{KVFTR{RTN05{{JUMP IF FTRACE IS OFF ! 22668: {{DCV{KVFTR{{{ELSE DECREMENT FTRACE ! 22669: * ! 22670: * HERE FOR PRINT TRACE OF FUNCTION RETURN ! 22671: * ! 22672: {RTN03{JSR{PRTSN{{{PRINT STATEMENT NUMBER ! 22673: {{MOV{4*1(SP){R9{{LOAD RETURN TYPE ! 22674: {{JSR{PRTST{{{PRINT IT ! 22675: {{MOV{#CH$BL{R6{{LOAD BLANK ! 22676: {{JSR{PRTCH{{{PRINT IT ! 22677: {{MOV{(SP){R10{{LOAD PFBLK PTR ! 22678: {{MOV{4*PFVBL(R10){R10{{LOAD FUNCTION VRBLK PTR ! 22679: {{MOV{#4*VRVAL{R6{{SET VRBLK NAME OFFSET ! 22680: {{BNE{R9{#SCFRT{RTN04{JUMP IF NOT FRETURN CASE ! 22681: * ! 22682: * FOR FRETURN, JUST PRINT FUNCTION NAME ! 22683: * ! 22684: {{JSR{PRTNM{{{PRINT NAME ! 22685: {{JSR{PRTNL{{{TERMINATE PRINT LINE ! 22686: {{BRN{RTN05{{{MERGE ! 22687: * ! 22688: * HERE FOR RETURN OR NRETURN, PRINT FUNCTION NAME = VALUE ! 22689: * ! 22690: {RTN04{JSR{PRTNV{{{PRINT NAME = VALUE ! 22691: * ! 22692: * HERE AFTER COMPLETING TRACE ! 22693: * ! 22694: {RTN05{MOV{(SP)+{R9{{POP PFBLK POINTER ! 22695: {{MOV{(SP)+{R6{{POP RETURN TYPE STRING ! 22696: * ! 22697: * MERGE HERE IF NO TRACE REQUIRED ! 22698: * ! 22699: {RTN06{MOV{R6{KVRTN{{SET RTNTYPE KEYWORD ! 22700: {{MOV{4*PFVBL(R9){R10{{LOAD POINTER TO FN VRBLK ! 22701: {{EJC{{{{ ! 22702: * RETRN (CONTINUED) ! 22703: * ! 22704: * GET VALUE OF FUNCTION ! 22705: * ! 22706: {RTN07{MOV{R10{RTNBP{{SAVE BLOCK POINTER ! 22707: {{MOV{4*VRVAL(R10){R10{{LOAD VALUE ! 22708: {{BEQ{(R10){#B$TRT{RTN07{LOOP BACK IF TRAPPED ! 22709: {{MOV{R10{RTNFV{{ELSE SAVE FUNCTION RESULT VALUE ! 22710: {{MOV{(SP)+{RTNSV{{SAVE ORIGINAL FUNCTION VALUE ! 22711: {{MOV{(SP)+{R10{{POP SAVED POINTER ! 22712: {{BZE{R10{RTN7C{{NO ACTION IF NONE ! 22713: {{BZE{KVPFL{RTN7C{{JUMP IF NO PROFILING ! 22714: {{JSR{PRFLU{{{ELSE PROFILE LAST FUNC STMT ! 22715: {{BEQ{KVPFL{#NUM02{RTN7A{BRANCH ON VALUE OF PROFILE KEYWD ! 22716: * ! 22717: * HERE IF &PROFILE = 1. START TIME MUST BE FRIGGED TO ! 22718: * APPEAR EARLIER THAN IT ACTUALLY IS, BY AMOUNT USED BEFORE ! 22719: * THE CALL. ! 22720: * ! 22721: {{LDI{PFSTM{{{LOAD CURRENT TIME ! 22722: {{SBI{4*ICVAL(R10){{{FRIG BY SUBTRACTING SAVED AMOUNT ! 22723: {{BRN{RTN7B{{{AND MERGE ! 22724: * ! 22725: * HERE IF &PROFILE = 2 ! 22726: * ! 22727: {RTN7A{LDI{4*ICVAL(R10){{{LOAD SAVED TIME ! 22728: * ! 22729: * BOTH PROFILE TYPES MERGE HERE ! 22730: * ! 22731: {RTN7B{STI{PFSTM{{{STORE BACK CORRECT START TIME ! 22732: * ! 22733: * MERGE HERE IF NO PROFILING ! 22734: * ! 22735: {RTN7C{MOV{4*FARGS(R9){R7{{GET NUMBER OF ARGS ! 22736: {{ADD{4*PFNLO(R9){R7{{ADD NUMBER OF LOCALS ! 22737: {{BZE{R7{RTN10{{JUMP IF NO ARGS/LOCALS ! 22738: {{LCT{R7{R7{{ELSE SET LOOP COUNTER ! 22739: {{ADD{4*PFLEN(R9){R9{{AND POINT TO END OF PFBLK ! 22740: * ! 22741: * LOOP TO RESTORE FUNCTIONS AND LOCALS ! 22742: * ! 22743: {RTN08{MOV{-(R9){R10{{LOAD NEXT VRBLK POINTER ! 22744: * ! 22745: * LOOP TO FIND VALUE BLOCK ! 22746: * ! 22747: {RTN09{MOV{R10{R6{{SAVE BLOCK POINTER ! 22748: {{MOV{4*VRVAL(R10){R10{{LOAD POINTER TO NEXT VALUE ! 22749: {{BEQ{(R10){#B$TRT{RTN09{LOOP BACK IF TRAPPED ! 22750: {{MOV{R6{R10{{ELSE RESTORE LAST BLOCK POINTER ! 22751: {{MOV{(SP)+{4*VRVAL(R10){{RESTORE OLD VARIABLE VALUE ! 22752: {{BCT{R7{RTN08{{LOOP TILL ALL PROCESSED ! 22753: * ! 22754: * NOW RESTORE FUNCTION VALUE AND EXIT ! 22755: * ! 22756: {RTN10{MOV{RTNBP{R10{{RESTORE PTR TO LAST FUNCTION BLOCK ! 22757: {{MOV{RTNSV{4*VRVAL(R10){{RESTORE OLD FUNCTION VALUE ! 22758: {{MOV{RTNFV{R9{{RELOAD FUNCTION RESULT ! 22759: {{MOV{R$COD{R10{{POINT TO NEW CODE BLOCK ! 22760: {{MOV{KVSTN{KVLST{{SET LASTNO FROM STNO ! 22761: {{MOV{4*CDSTM(R10){KVSTN{{RESET PROPER STNO VALUE ! 22762: {{MOV{KVRTN{R6{{LOAD RETURN TYPE ! 22763: {{BEQ{R6{#SCRTN{EXIXR{EXIT WITH RESULT IN XR IF RETURN ! 22764: {{BEQ{R6{#SCFRT{EXFAL{FAIL IF FRETURN ! 22765: {{EJC{{{{ ! 22766: * ! 22767: * RETRN (CONTINUED) ! 22768: * ! 22769: * HERE FOR NRETURN ! 22770: * ! 22771: {{BEQ{(R9){#B$NML{RTN11{JUMP IF IS A NAME ! 22772: {{JSR{GTNVR{{{ELSE TRY CONVERT TO VARIABLE NAME ! 22773: {{ERR{243{FUNCTION{{RESULT IN NRETURN IS NOT NAME ! 22774: {{MOV{R9{R10{{IF OK, COPY VRBLK (NAME BASE) PTR ! 22775: {{MOV{#4*VRVAL{R6{{SET NAME OFFSET ! 22776: {{BRN{RTN12{{{AND MERGE ! 22777: * ! 22778: * HERE IF RETURNED RESULT IS A NAME ! 22779: * ! 22780: {RTN11{MOV{4*NMBAS(R9){R10{{LOAD NAME BASE ! 22781: {{MOV{4*NMOFS(R9){R6{{LOAD NAME OFFSET ! 22782: * ! 22783: * MERGE HERE WITH RETURNED NAME IN (XL,WA) ! 22784: * ! 22785: {RTN12{MOV{R10{R9{{PRESERVE XL ! 22786: {{LCW{R7{{{LOAD NEXT WORD ! 22787: {{MOV{R9{R10{{RESTORE XL ! 22788: {{BEQ{R7{#OFNE${EXNAM{EXIT IF CALLED BY NAME ! 22789: {{MOV{R7{-(SP){{ELSE SAVE CODE WORD ! 22790: {{JSR{ACESS{{{GET VALUE ! 22791: {{PPM{EXFAL{{{FAIL IF ACCESS FAILS ! 22792: {{MOV{R9{R10{{IF OK, COPY RESULT ! 22793: {{MOV{(SP){R9{{RELOAD NEXT CODE WORD ! 22794: {{MOV{R10{(SP){{STORE RESULT ON STACK ! 22795: {{MOV{(R9){R10{{LOAD ROUTINE ADDRESS ! 22796: {{BRI{R10{{{JUMP TO EXECUTE NEXT CODE WORD ! 22797: {{EJC{{{{ ! 22798: * ! 22799: * STCOV -- SIGNAL STATEMENT COUNTER OVERFLOW ! 22800: * ! 22801: * BRN STCOV JUMP TO SIGNAL STATEMENT COUNT OFLO ! 22802: * ! 22803: * PERMIT UP TO 10 MORE STATEMENTS TO BE OBEYED SO THAT ! 22804: * SETEXIT TRAP CAN REGAIN CONTROL. ! 22805: * STCOV CONTINUES BY ISSUING THE ERROR MESSAGE ! 22806: * ! 22807: {STCOV{RTN{{{{ ! 22808: {{ICV{ERRFT{{{FATAL ERROR ! 22809: {{LDI{INTVT{{{GET 10 ! 22810: {{ADI{KVSTL{{{ADD TO FORMER LIMIT ! 22811: {{STI{KVSTL{{{STORE AS NEW STLIMIT ! 22812: {{LDI{INTVT{{{GET 10 ! 22813: {{STI{KVSTC{{{SET AS NEW COUNT ! 22814: {{ERB{244{STATEMENT{{COUNT EXCEEDS VALUE OF STLIMIT KEYWORD ! 22815: {{EJC{{{{ ! 22816: * ! 22817: * STMGO -- START EXECUTION OF NEW STATEMENT ! 22818: * ! 22819: * (XR) POINTER TO CDBLK FOR NEW STATEMENT ! 22820: * BRN STMGO JUMP TO EXECUTE NEW STATEMENT ! 22821: * ! 22822: * STMGO CONTINUES BY EXECUTING THE NEXT STATEMENT ! 22823: * ! 22824: {STMGO{RTN{{{{ ! 22825: {{MOV{R9{R$COD{{SET NEW CODE BLOCK POINTER ! 22826: {{BZE{KVPFL{STGO1{{SKIP IF NO PROFILING ! 22827: {{JSR{PRFLU{{{ELSE PROFILE THE STATEMENT ! 22828: {STGO1{MOV{KVSTN{KVLST{{SET LASTNO ! 22829: {{MOV{4*CDSTM(R9){KVSTN{{SET STNO ! 22830: {{ADD{#4*CDCOD{R9{{POINT TO FIRST CODE WORD ! 22831: {{LCP{R9{{{SET CODE POINTER ! 22832: {{LDI{KVSTC{{{GET STMT COUNT ! 22833: {{ILT{EXITS{{{OMIT COUNTING IF NEGATIVE ! 22834: {{IEQ{STCOV{{{FAIL IF STLIMIT REACHED ! 22835: {{SBI{INTV1{{{DECREMENT ! 22836: {{STI{KVSTC{{{REPLACE IT ! 22837: {{BZE{R$STC{EXITS{{EXIT IF NO STCOUNT TRACE ! 22838: * ! 22839: * HERE FOR STCOUNT TRACE ! 22840: * ! 22841: {{ZER{R9{{{CLEAR GARBAGE VALUE IN XR ! 22842: {{MOV{R$STC{R10{{LOAD POINTER TO STCOUNT TRBLK ! 22843: {{JSR{KTREX{{{EXECUTE KEYWORD TRACE ! 22844: {{BRN{EXITS{{{AND THEN EXIT FOR NEXT CODE WORD ! 22845: {{EJC{{{{ ! 22846: * ! 22847: * STOPR -- TERMINATE RUN ! 22848: * ! 22849: * (XR) POINTS TO ENDING MESSAGE ! 22850: * BRN STOPR JUMP TO TERMINATE RUN ! 22851: * ! 22852: * TERMINATE RUN AND PRINT STATISTICS. ON ENTRY XR POINTS ! 22853: * TO ENDING MESSAGE OR IS ZERO IF MESSAGE PRINTED ALREADY. ! 22854: * ! 22855: {STOPR{RTN{{{{ ! 22856: {{BZE{R9{STPRA{{SKIP IF SYSAX ALREADY CALLED (REG04) ! 22857: {{JSR{SYSAX{{{CALL AFTER EXECUTION PROC ! 22858: {STPRA{ADD{RSMEM{DNAME{{USE THE RESERVE MEMORY ! 22859: {{BNE{R9{#ENDMS{STPR0{SKIP IF NOT NORMAL END MESSAGE ! 22860: {{BNZ{EXSTS{STPR3{{SKIP IF EXEC STATS SUPPRESSED ! 22861: {{ZER{ERICH{{{CLEAR ERRORS TO INT.CH. FLAG ! 22862: * ! 22863: * LOOK TO SEE IF AN ENDING MESSAGE IS SUPPLIED ! 22864: * ! 22865: {STPR0{JSR{PRTPG{{{EJECT PRINTER ! 22866: {{BZE{R9{STPR1{{SKIP IF NO MESSAGE ! 22867: {{JSR{PRTST{{{PRINT MESSAGE ! 22868: * ! 22869: * MERGE HERE IF NO MESSAGE TO PRINT ! 22870: * ! 22871: {STPR1{JSR{PRTIS{{{PRINT BLANK LINE ! 22872: {{MTI{KVSTN{{{GET STATEMENT NUMBER ! 22873: {{MOV{#STPM1{R9{{POINT TO MESSAGE /IN STATEMENT XXX/ ! 22874: {{JSR{PRTMX{{{PRINT IT ! 22875: {{JSR{SYSTM{{{GET CURRENT TIME ! 22876: {{SBI{TIMSX{{{MINUS START TIME = ELAPSED EXEC TIM ! 22877: {{STI{STPTI{{{SAVE FOR LATER ! 22878: {{MOV{#STPM3{R9{{POINT TO MSG /EXECUTION TIME MSEC / ! 22879: {{JSR{PRTMX{{{PRINT IT ! 22880: {{LDI{KVSTL{{{GET STATEMENT LIMIT ! 22881: {{ILT{STPR2{{{SKIP IF NEGATIVE ! 22882: {{SBI{KVSTC{{{MINUS COUNTER = COUNT ! 22883: {{STI{STPSI{{{SAVE ! 22884: {{MOV{#STPM2{R9{{POINT TO MESSAGE /STMTS EXECUTED/ ! 22885: {{JSR{PRTMX{{{PRINT IT ! 22886: {{LDI{STPTI{{{RELOAD ELAPSED TIME ! 22887: {{MLI{INTTH{{{*1000 (MICROSECS) ! 22888: {{IOV{STPR2{{{JUMP IF WE CANNOT COMPUTE ! 22889: {{DVI{STPSI{{{DIVIDE BY STATEMENT COUNT ! 22890: {{IOV{STPR2{{{JUMP IF OVERFLOW ! 22891: {{MOV{#STPM4{R9{{POINT TO MSG (MCSEC PER STATEMENT / ! 22892: {{JSR{PRTMX{{{PRINT IT ! 22893: {{EJC{{{{ ! 22894: * ! 22895: * STOPR (CONTINUED) ! 22896: * ! 22897: * MERGE TO SKIP MESSAGE (OVERFLOW OR NEGATIVE STLIMIT) ! 22898: * ! 22899: {STPR2{MTI{GBCNT{{{LOAD COUNT OF COLLECTIONS ! 22900: {{MOV{#STPM5{R9{{POINT TO MESSAGE /REGENERATIONS / ! 22901: {{JSR{PRTMX{{{PRINT IT ! 22902: {{JSR{PRTIS{{{ONE MORE BLANK FOR LUCK ! 22903: * ! 22904: * CHECK IF DUMP REQUESTED ! 22905: * ! 22906: {STPR3{JSR{PRFLR{{{PRINT PROFILE IF WANTED ! 22907: * ! 22908: {{MOV{KVDMP{R9{{LOAD DUMP KEYWORD ! 22909: {{JSR{DUMPR{{{EXECUTE DUMP IF REQUESTED ! 22910: {{MOV{R$FCB{R10{{GET FCBLK CHAIN HEAD ! 22911: {{MOV{KVABE{R6{{LOAD ABEND VALUE ! 22912: {{MOV{KVCOD{R7{{LOAD CODE VALUE ! 22913: {{JSR{SYSEJ{{{EXIT TO SYSTEM ! 22914: {{EJC{{{{ ! 22915: * ! 22916: * SUCCP -- SIGNAL SUCCESSFUL MATCH OF A PATTERN NODE ! 22917: * ! 22918: * SEE PATTERN MATCH ROUTINES FOR DETAILS ! 22919: * ! 22920: * (XR) CURRENT NODE ! 22921: * (WB) CURRENT CURSOR ! 22922: * (XL) MAY BE NON-COLLECTABLE ! 22923: * BRN SUCCP SIGNAL SUCCESSFUL PATTERN MATCH ! 22924: * ! 22925: * SUCCP CONTINUES BY MATCHING THE SUCCESSOR NODE ! 22926: * ! 22927: {SUCCP{RTN{{{{ ! 22928: {{MOV{4*PTHEN(R9){R9{{LOAD SUCCESSOR NODE ! 22929: {{MOV{(R9){R10{{LOAD NODE CODE ENTRY ADDRESS ! 22930: {{BRI{R10{{{JUMP TO MATCH SUCCESSOR NODE ! 22931: {{EJC{{{{ ! 22932: * ! 22933: * SYSAB -- PRINT /ABNORMAL END/ AND TERMINATE ! 22934: * ! 22935: {SYSAB{RTN{{{{ ! 22936: {{MOV{#ENDAB{R9{{POINT TO MESSAGE ! 22937: {{MOV{#NUM01{KVABE{{SET ABEND FLAG ! 22938: {{JSR{PRTNL{{{SKIP TO NEW LINE ! 22939: {{BRN{STOPR{{{JUMP TO PACK UP ! 22940: {{EJC{{{{ ! 22941: * ! 22942: * SYSTU -- PRINT /TIME UP/ AND TERMINATE ! 22943: * ! 22944: {SYSTU{RTN{{{{ ! 22945: {{MOV{#ENDTU{R9{{POINT TO MESSAGE ! 22946: {{MOV{STRTU{R6{{GET CHARS /TU/ ! 22947: {{MOV{R6{KVCOD{{PUT IN KVCOD ! 22948: {{MOV{TIMUP{R6{{CHECK STATE OF TIMEUP SWITCH ! 22949: {{MNZ{TIMUP{{{SET SWITCH ! 22950: {{BNZ{R6{STOPR{{STOP RUN IF ALREADY SET ! 22951: {{ERB{245{TRANSLATION/EXECUTION{{TIME EXPIRED ! 22952: {{TTL{S{{{P I T B O L -- STACK OVERFLOW SECTION ! 22953: * ! 22954: * CONTROL COMES HERE IF THE MAIN STACK OVERFLOWS ! 22955: * ! 22956: {{SEC{{{{START OF STACK OVERFLOW SECTION ! 22957: * ! 22958: {{ICV{ERRFT{{{FATAL ERROR ! 22959: {{MOV{FLPTR{SP{{POP STACK TO AVOID MORE FAILS ! 22960: {{BNZ{GBCFL{STAK1{{JUMP IF GARBAGE COLLECTING ! 22961: {{ERB{246{STACK{{OVERFLOW ! 22962: * ! 22963: * NO CHANCE OF RECOVERY IN MID GARBAGE COLLECTION ! 22964: * ! 22965: {STAK1{MOV{#ENDSO{R9{{POINT TO MESSAGE ! 22966: {{ZER{KVDMP{{{MEMORY IS UNDUMPABLE ! 22967: {{BRN{STOPR{{{GIVE UP ! 22968: {{TTL{S{{{P I T B O L -- ERROR SECTION ! 22969: * ! 22970: * THIS SECTION OF CODE IS ENTERED WHENEVER A PROCEDURE ! 22971: * RETURN VIA AN ERR PARAMETER OR AN ERB OPCODE IS OBEYED. ! 22972: * ! 22973: * (WA) IS THE ERROR CODE ! 22974: * ! 22975: * THE GLOBAL VARIABLE STAGE INDICATES THE POINT AT WHICH ! 22976: * THE ERROR OCCURED AS FOLLOWS. ! 22977: * ! 22978: * STAGE=STGIC ERROR DURING INITIAL COMPILE ! 22979: * ! 22980: * STAGE=STGXC ERROR DURING COMPILE AT EXECUTE ! 22981: * TIME (CODE, CONVERT FUNCTION CALLS) ! 22982: * ! 22983: * STAGE=STGEV ERROR DURING COMPILATION OF ! 22984: * EXPRESSION AT EXECUTION TIME ! 22985: * (EVAL, CONVERT FUNCTION CALL). ! 22986: * ! 22987: * STAGE=STGXT ERROR AT EXECUTE TIME. COMPILER ! 22988: * NOT ACTIVE. ! 22989: * ! 22990: * STAGE=STGCE ERROR DURING INITIAL COMPILE AFTER ! 22991: * SCANNING OUT THE END LINE. ! 22992: * ! 22993: * STAGE=STGXE ERROR DURING COMPILE AT EXECUTE ! 22994: * TIME AFTER SCANNING END LINE. ! 22995: * ! 22996: * STAGE=STGEE ERROR DURING EXPRESSION EVALUATION ! 22997: * ! 22998: {{SEC{{{{START OF ERROR SECTION ! 22999: * ! 23000: {ERROR{BEQ{R$CIM{#CMLAB{CMPLE{JUMP IF ERROR IN SCANNING LABEL ! 23001: {{MOV{R6{KVERT{{SAVE ERROR CODE ! 23002: {{ZER{SCNRS{{{RESET RESCAN SWITCH FOR SCANE ! 23003: {{ZER{SCNGO{{{RESET GOTO SWITCH FOR SCANE ! 23004: {{MOV{STAGE{R9{{LOAD CURRENT STAGE ! 23005: {{BSW{R9{STGNO{{JUMP TO APPROPRIATE ERROR CIRCUIT ! 23006: {{IFF{STGIC{ERR01{{INITIAL COMPILE ! 23007: {{IFF{STGXC{ERR04{{EXECUTE TIME COMPILE ! 23008: {{IFF{STGEV{ERR04{{EVAL COMPILING EXPR. ! 23009: {{IFF{STGXT{ERR05{{EXECUTE TIME ! 23010: {{IFF{STGCE{ERR01{{COMPILE - AFTER END ! 23011: {{IFF{STGXE{ERR04{{XEQ COMPILE-PAST END ! 23012: {{IFF{STGEE{ERR04{{EVAL EVALUATING EXPR ! 23013: {{ESW{{{{END SWITCH ON ERROR TYPE ! 23014: {{EJC{{{{ ! 23015: * ! 23016: * ERROR DURING INITIAL COMPILE ! 23017: * ! 23018: * THE ERROR MESSAGE IS PRINTED AS PART OF THE COMPILER ! 23019: * OUTPUT. THIS PRINTOUT INCLUDES THE OFFENDING LINE (IF NOT ! 23020: * PRINTED ALREADY) AND AN ERROR FLAG UNDER THE APPROPRIATE ! 23021: * COLUMN AS INDICATED BY SCNSE UNLESS SCNSE IS SET TO ZERO. ! 23022: * ! 23023: * AFTER PRINTING THE MESSAGE, THE GENERATED CODE IS ! 23024: * MODIFIED TO AN ERROR CALL AND CONTROL IS RETURNED TO ! 23025: * THE CMPIL PROCEDURE AFTER RESETTING THE STACK POINTER. ! 23026: * ! 23027: * IF THE ERROR OCCURS AFTER THE END LINE, CONTROL RETURNS ! 23028: * IN A SLIGHTLY DIFFERENT MANNER TO ENSURE PROPER CLEANUP. ! 23029: * ! 23030: {ERR01{MOV{CMPXS{SP{{RESET STACK POINTER ! 23031: {{SSL{CMPSS{{{RESTORE S-R STACK PTR FOR CMPIL ! 23032: {{BNZ{ERRSP{ERR03{{JUMP IF ERROR SUPPRESS FLAG SET ! 23033: {{MOV{ERICH{ERLST{{SET FLAG FOR LISTR ! 23034: {{JSR{LISTR{{{LIST LINE ! 23035: {{JSR{PRTIS{{{TERMINATE LISTING ! 23036: {{ZER{ERLST{{{CLEAR LISTR FLAG ! 23037: {{MOV{SCNSE{R6{{LOAD SCAN ELEMENT OFFSET ! 23038: {{BZE{R6{ERR02{{SKIP IF NOT SET ! 23039: {{LCT{R7{R6{{LOOP COUNTER ! 23040: {{ICV{R6{{{INCREASE FOR CH$EX ! 23041: {{JSR{ALOCS{{{STRING BLOCK FOR ERROR FLAG ! 23042: {{MOV{R9{R6{{REMEMBER STRING PTR ! 23043: {{PSC{R9{{{READY FOR CHARACTER STORING ! 23044: {{MOV{R$CIM{R10{{POINT TO BAD STATEMENT ! 23045: {{PLC{R10{{{READY TO GET CHARS ! 23046: * ! 23047: * LOOP TO REPLACE ALL CHARS BUT TABS BY BLANKS ! 23048: * ! 23049: {ERRA1{LCH{R8{(R10)+{{GET NEXT CHAR ! 23050: {{BEQ{R8{#CH$HT{ERRA2{SKIP IF TAB ! 23051: {{MOV{#CH$BL{R8{{GET A BLANK ! 23052: {{EJC{{{{ ! 23053: * ! 23054: * MERGE TO STORE BLANK OR TAB IN ERROR LINE ! 23055: * ! 23056: {ERRA2{SCH{R8{(R9)+{{STORE CHAR ! 23057: {{BCT{R7{ERRA1{{LOOP ! 23058: {{MOV{#CH$EX{R10{{EXCLAMATION MARK ! 23059: {{SCH{R10{(R9){{STORE AT END OF ERROR LINE ! 23060: {{CSC{R9{{{END OF SCH LOOP ! 23061: {{MOV{#STNPD{PROFS{{ALLOW FOR STATEMENT NUMBER ! 23062: {{MOV{R6{R9{{POINT TO ERROR LINE ! 23063: {{JSR{PRTST{{{PRINT ERROR LINE ! 23064: * ! 23065: * HERE AFTER PLACING ERROR FLAG AS REQUIRED ! 23066: * ! 23067: {ERR02{JSR{ERMSG{{{GENERATE FLAG AND ERROR MESSAGE ! 23068: {{ADD{#NUM03{LSTLC{{BUMP PAGE CTR FOR BLANK, ERROR, BLK ! 23069: {{ZER{R9{{{IN CASE OF FATAL ERROR ! 23070: {{BHI{ERRFT{#NUM03{STOPR{PACK UP IF SEVERAL FATALS ! 23071: * ! 23072: * COUNT ERROR, INHIBIT EXECUTION IF REQUIRED ! 23073: * ! 23074: {{ICV{CMERC{{{BUMP ERROR COUNT ! 23075: {{ADD{CSWER{NOXEQ{{INHIBIT XEQ IF -NOERRORS ! 23076: {{BNE{STAGE{#STGIC{CMP10{SPECIAL RETURN IF AFTER END LINE ! 23077: {{EJC{{{{ ! 23078: * ! 23079: * LOOP TO SCAN TO END OF STATEMENT ! 23080: * ! 23081: {ERR03{MOV{R$CIM{R9{{POINT TO START OF IMAGE ! 23082: {{PLC{R9{{{POINT TO FIRST CHAR ! 23083: {{LCH{R9{(R9){{GET FIRST CHAR ! 23084: {{BEQ{R9{#CH$MN{CMPCE{JUMP IF ERROR IN CONTROL CARD ! 23085: {{ZER{SCNRS{{{CLEAR RESCAN FLAG ! 23086: {{MNZ{ERRSP{{{SET ERROR SUPPRESS FLAG ! 23087: {{JSR{SCANE{{{SCAN NEXT ELEMENT ! 23088: {{BNE{R10{#T$SMC{ERR03{LOOP BACK IF NOT STATEMENT END ! 23089: {{ZER{ERRSP{{{CLEAR ERROR SUPPRESS FLAG ! 23090: * ! 23091: * GENERATE ERROR CALL IN CODE AND RETURN TO CMPIL ! 23092: * ! 23093: {{MOV{#4*CDCOD{CWCOF{{RESET OFFSET IN CCBLK ! 23094: {{MOV{#OCER${R6{{LOAD COMPILE ERROR CALL ! 23095: {{JSR{CDWRD{{{GENERATE IT ! 23096: {{MOV{CWCOF{4*CMSOC(SP){{SET SUCCESS FILL IN OFFSET ! 23097: {{MNZ{4*CMFFC(SP){{{SET FAILURE FILL IN FLAG ! 23098: {{JSR{CDWRD{{{GENERATE SUCC. FILL IN WORD ! 23099: {{BRN{CMPSE{{{MERGE TO GENERATE ERROR AS CDFAL ! 23100: * ! 23101: * ERROR DURING EXECUTE TIME COMPILE OR EXPRESSION EVALUATIO ! 23102: * ! 23103: * EXECUTE TIME COMPILATION IS INITIATED THROUGH GTCOD OR ! 23104: * GTEXP WHICH ARE CALLED BY COMPILE, CODE OR EVAL. ! 23105: * BEFORE CAUSING STATEMENT FAILURE THROUGH EXFAL IT IS ! 23106: * HELPFUL TO SET KEYWORD ERRTEXT AND FOR GENERALITY ! 23107: * THESE ERRORS MAY BE HANDLED BY THE SETEXIT MECHANISM. ! 23108: * ! 23109: {ERR04{ZER{R$CCB{{{FORGET GARBAGE CODE BLOCK ! 23110: {{SSL{INISS{{{RESTORE MAIN PROG S-R STACK PTR ! 23111: {{JSR{ERTEX{{{GET FAIL MESSAGE TEXT ! 23112: {{DCA{SP{{{ENSURE STACK OK ON LOOP START ! 23113: * ! 23114: * POP STACK UNTIL FIND FLPTR FOR MOST DEEPLY NESTED PROG. ! 23115: * DEFINED FUNCTION CALL OR CALL OF EVAL / CODE. ! 23116: * ! 23117: {ERRA4{ICA{SP{{{POP STACK ! 23118: {{BEQ{SP{FLPRT{ERRC4{JUMP IF PROG DEFINED FN CALL FOUND ! 23119: {{BNE{SP{GTCEF{ERRA4{LOOP IF NOT EVAL OR CODE CALL YET ! 23120: {{MOV{#STGXT{STAGE{{RE-SET STAGE FOR EXECUTE ! 23121: {{MOV{R$GTC{R$COD{{RECOVER CODE PTR ! 23122: {{MOV{SP{FLPTR{{RESTORE FAIL POINTER ! 23123: {{ZER{R$CIM{{{FORGET POSSIBLE IMAGE ! 23124: * ! 23125: * TEST ERRLIMIT ! 23126: * ! 23127: {ERRB4{BNZ{KVERL{ERR07{{JUMP IF ERRLIMIT NON-ZERO ! 23128: {{BRN{EXFAL{{{FAIL ! 23129: * ! 23130: * RETURN FROM PROG. DEFINED FUNCTION IS OUTSTANDING ! 23131: * ! 23132: {ERRC4{MOV{FLPTR{SP{{RESTORE STACK FROM FLPTR ! 23133: {{BRN{ERRB4{{{MERGE ! 23134: {{EJC{{{{ ! 23135: * ! 23136: * ERROR AT EXECUTE TIME. ! 23137: * ! 23138: * THE ACTION TAKEN ON AN ERROR IS AS FOLLOWS. ! 23139: * ! 23140: * IF ERRLIMIT KEYWORD IS ZERO, AN ABORT IS SIGNALLED, ! 23141: * SEE CODING FOR SYSTEM LABEL ABORT AT L$ABO. ! 23142: * ! 23143: * OTHERWISE, ERRLIMIT IS DECREMENTED AND AN ERRTYPE TRACE ! 23144: * GENERATED IF REQUIRED. CONTROL RETURNS EITHER VIA A JUMP ! 23145: * TO CONTINUE (TO TAKE THE FAILURE EXIT) OR A SPECIFIED ! 23146: * SETEXIT TRAP IS EXECUTED AND CONTROL PASSES TO THE TRAP. ! 23147: * IF 3 OR MORE FATAL ERRORS OCCUR AN ABORT IS SIGNALLED ! 23148: * REGARDLESS OF ERRLIMIT AND SETEXIT - LOOPING IS ALL TOO ! 23149: * PROBABLE OTHERWISE. FATAL ERRORS INCLUDE STACK OVERFLOW ! 23150: * AND EXCEEDING STLIMIT. ! 23151: * ! 23152: {ERR05{SSL{INISS{{{RESTORE MAIN PROG S-R STACK PTR ! 23153: {{BNZ{DMVCH{ERR08{{JUMP IF IN MID-DUMP ! 23154: * ! 23155: * MERGE HERE FROM ERR08 ! 23156: * ! 23157: {ERR06{BZE{KVERL{LABO1{{ABORT IF ERRLIMIT IS ZERO ! 23158: {{JSR{ERTEX{{{GET FAIL MESSAGE TEXT ! 23159: * ! 23160: * MERGE FROM ERR04 ! 23161: * ! 23162: {ERR07{BGE{ERRFT{#NUM03{LABO1{ABORT IF TOO MANY FATAL ERRORS ! 23163: {{DCV{KVERL{{{DECREMENT ERRLIMIT ! 23164: {{MOV{R$ERT{R10{{LOAD ERRTYPE TRACE POINTER ! 23165: {{JSR{KTREX{{{GENERATE ERRTYPE TRACE IF REQUIRED ! 23166: {{MOV{R$COD{R$CNT{{SET CDBLK PTR FOR CONTINUATION ! 23167: {{MOV{FLPTR{R9{{SET PTR TO FAILURE OFFSET ! 23168: {{MOV{(R9){STXOF{{SAVE FAILURE OFFSET FOR CONTINUE ! 23169: {{MOV{R$SXC{R9{{LOAD SETEXIT CDBLK POINTER ! 23170: {{BZE{R9{LCNT1{{CONTINUE IF NO SETEXIT TRAP ! 23171: {{ZER{R$SXC{{{ELSE RESET TRAP ! 23172: {{MOV{#NULLS{STXVR{{RESET SETEXIT ARG TO NULL ! 23173: {{MOV{(R9){R10{{LOAD PTR TO CODE BLOCK ROUTINE ! 23174: {{BRI{R10{{{EXECUTE FIRST TRAP STATEMENT ! 23175: * ! 23176: * INTERRUPTED PARTLY THROUGH A DUMP WHILST STORE IS IN A ! 23177: * MESS SO DO A TIDY UP OPERATION. SEE DUMPR FOR DETAILS. ! 23178: * ! 23179: {ERR08{MOV{DMVCH{R9{{CHAIN HEAD FOR AFFECTED VRBLKS ! 23180: {{BZE{R9{ERR06{{DONE IF ZERO ! 23181: {{MOV{(R9){DMVCH{{SET NEXT LINK AS CHAIN HEAD ! 23182: {{JSR{SETVR{{{RESTORE VRGET FIELD ! 23183: {{BRN{ERR08{{{LOOP THROUGH CHAIN ! 23184: {{TTL{S{{{P I T B O L -- HERE ENDETH THE CODE ! 23185: * ! 23186: * END OF ASSEMBLY ! 23187: * ! 23188: {{END{{{{END MACRO-SPITBOL ASSEMBLY
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.