|
|
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: * ! 4634: TMBEB DAC B$SCL BLANK-EQUAL-BLANK ! 4635: DAC 3 ! 4636: DTC / = / ! 4637: * ! 4638: * DUMMY TRBLK FOR EXPRESSION VARIABLE ! 4639: * ! 4640: TRBEV DAC B$TRT DUMMY TRBLK ! 4641: * ! 4642: * DUMMY TRBLK FOR KEYWORD VARIABLE ! 4643: * ! 4644: TRBKV DAC B$TRT DUMMY TRBLK ! 4645: * ! 4646: * DUMMY CODE BLOCK TO RETURN CONTROL TO TRXEQ PROCEDURE ! 4647: * ! 4648: TRXDR DAC O$TXR BLOCK POINTS TO RETURN ROUTINE ! 4649: TRXDC DAC TRXDR POINTER TO BLOCK ! 4650: EJC ! 4651: * ! 4652: * STANDARD VARIABLE BLOCKS ! 4653: * ! 4654: * SEE SVBLK FORMAT FOR FULL DETAILS OF THE FORMAT. THE ! 4655: * VRBLKS ARE ORDERED BY LENGTH AND WITHIN EACH LENGTH THE ! 4656: * ORDER IS ALPHABETICAL BY NAME OF THE VARIABLE. ! 4657: * ! 4658: V$EQF DBC SVFPR EQ ! 4659: DAC 2 ! 4660: DTC /EQ/ ! 4661: DAC S$EQF ! 4662: DAC 2 ! 4663: * ! 4664: V$GEF DBC SVFPR GE ! 4665: DAC 2 ! 4666: DTC /GE/ ! 4667: DAC S$GEF ! 4668: DAC 2 ! 4669: * ! 4670: V$GTF DBC SVFPR GT ! 4671: DAC 2 ! 4672: DTC /GT/ ! 4673: DAC S$GTF ! 4674: DAC 2 ! 4675: * ! 4676: V$LEF DBC SVFPR LE ! 4677: DAC 2 ! 4678: DTC /LE/ ! 4679: DAC S$LEF ! 4680: DAC 2 ! 4681: * ! 4682: V$LTF DBC SVFPR LT ! 4683: DAC 2 ! 4684: DTC /LT/ ! 4685: DAC S$LTF ! 4686: DAC 2 ! 4687: * ! 4688: V$NEF DBC SVFPR NE ! 4689: DAC 2 ! 4690: DTC /NE/ ! 4691: DAC S$NEF ! 4692: DAC 2 ! 4693: * ! 4694: V$ANY DBC SVFNP ANY ! 4695: DAC 3 ! 4696: DTC /ANY/ ! 4697: DAC S$ANY ! 4698: DAC 1 ! 4699: * ! 4700: V$ARB DBC SVKVC ARB ! 4701: DAC 3 ! 4702: DTC /ARB/ ! 4703: DAC K$ARB ! 4704: DAC NDARB ! 4705: EJC ! 4706: * ! 4707: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 4708: * ! 4709: V$ARG DBC SVFNN ARG ! 4710: DAC 3 ! 4711: DTC /ARG/ ! 4712: DAC S$ARG ! 4713: DAC 2 ! 4714: * ! 4715: V$BAL DBC SVKVC BAL ! 4716: DAC 3 ! 4717: DTC /BAL/ ! 4718: DAC K$BAL ! 4719: DAC NDBAL ! 4720: * ! 4721: V$END DBC SVLBL END ! 4722: DAC 3 ! 4723: DTC /END/ ! 4724: DAC L$END ! 4725: * ! 4726: V$LEN DBC SVFNP LEN ! 4727: DAC 3 ! 4728: DTC /LEN/ ! 4729: DAC S$LEN ! 4730: DAC 1 ! 4731: * ! 4732: V$LEQ DBC SVFPR LEQ ! 4733: DAC 3 ! 4734: DTC /LEQ/ ! 4735: DAC S$LEQ ! 4736: DAC 2 ! 4737: * ! 4738: V$LGE DBC SVFPR LGE ! 4739: DAC 3 ! 4740: DTC /LGE/ ! 4741: DAC S$LGE ! 4742: DAC 2 ! 4743: * ! 4744: V$LGT DBC SVFPR LGT ! 4745: DAC 3 ! 4746: DTC /LGT/ ! 4747: DAC S$LGT ! 4748: DAC 2 ! 4749: * ! 4750: V$LLE DBC SVFPR LLE ! 4751: DAC 3 ! 4752: DTC /LLE/ ! 4753: DAC S$LLE ! 4754: DAC 2 ! 4755: EJC ! 4756: * ! 4757: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 4758: * ! 4759: V$LLT DBC SVFPR LLT ! 4760: DAC 3 ! 4761: DTC /LLT/ ! 4762: DAC S$LLT ! 4763: DAC 2 ! 4764: * ! 4765: V$LNE DBC SVFPR LNE ! 4766: DAC 3 ! 4767: DTC /LNE/ ! 4768: DAC S$LNE ! 4769: DAC 2 ! 4770: * ! 4771: V$POS DBC SVFNP POS ! 4772: DAC 3 ! 4773: DTC /POS/ ! 4774: DAC S$POS ! 4775: DAC 1 ! 4776: * ! 4777: V$REM DBC SVKVC REM ! 4778: DAC 3 ! 4779: DTC /REM/ ! 4780: DAC K$REM ! 4781: DAC NDREM ! 4782: * ! 4783: V$SET DBC SVFNN SET ! 4784: DAC 3 ! 4785: DTC /SET/ ! 4786: DAC S$SET ! 4787: DAC 3 ! 4788: * ! 4789: V$TAB DBC SVFNP TAB ! 4790: DAC 3 ! 4791: DTC /TAB/ ! 4792: DAC S$TAB ! 4793: DAC 1 ! 4794: * ! 4795: V$CAS DBC SVKNM CASE ! 4796: DAC 4 ! 4797: DTC /CASE/ ! 4798: DAC K$CAS ! 4799: * ! 4800: V$CHR DBC SVFNP CHAR ! 4801: DAC 4 ! 4802: DTC /CHAR/ ! 4803: DAC S$CHR ! 4804: DAC 1 ! 4805: * ! 4806: V$COD DBC SVFNK CODE ! 4807: DAC 4 ! 4808: DTC /CODE/ ! 4809: DAC K$COD ! 4810: DAC S$COD ! 4811: DAC 1 ! 4812: * ! 4813: V$COP DBC SVFNN COPY ! 4814: DAC 4 ! 4815: DTC /COPY/ ! 4816: DAC S$COP ! 4817: DAC 1 ! 4818: EJC ! 4819: * ! 4820: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 4821: * ! 4822: V$DAT DBC SVFNN DATA ! 4823: DAC 4 ! 4824: DTC /DATA/ ! 4825: DAC S$DAT ! 4826: DAC 1 ! 4827: * ! 4828: V$DTE DBC SVFNN DATE ! 4829: DAC 4 ! 4830: DTC /DATE/ ! 4831: DAC S$DTE ! 4832: DAC 0 ! 4833: * ! 4834: V$DMP DBC SVFNK DUMP ! 4835: DAC 4 ! 4836: DTC /DUMP/ ! 4837: DAC K$DMP ! 4838: DAC S$DMP ! 4839: DAC 1 ! 4840: * ! 4841: V$DUP DBC SVFNN DUPL ! 4842: DAC 4 ! 4843: DTC /DUPL/ ! 4844: DAC S$DUP ! 4845: DAC 2 ! 4846: * ! 4847: V$EVL DBC SVFNN EVAL ! 4848: DAC 4 ! 4849: DTC /EVAL/ ! 4850: DAC S$EVL ! 4851: DAC 1 ! 4852: * ! 4853: V$EXT DBC SVFNN EXIT ! 4854: DAC 4 ! 4855: DTC /EXIT/ ! 4856: DAC S$EXT ! 4857: DAC 1 ! 4858: * ! 4859: V$FAL DBC SVKVC FAIL ! 4860: DAC 4 ! 4861: DTC /FAIL/ ! 4862: DAC K$FAL ! 4863: DAC NDFAL ! 4864: * ! 4865: V$HST DBC SVFNN HOST ! 4866: DAC 4 ! 4867: DTC /HOST/ ! 4868: DAC S$HST ! 4869: DAC 3 ! 4870: EJC ! 4871: * ! 4872: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 4873: * ! 4874: V$ITM DBC SVFNF ITEM ! 4875: DAC 4 ! 4876: DTC /ITEM/ ! 4877: DAC S$ITM ! 4878: DAC 999 ! 4879: * ! 4880: V$LOD DBC SVFNN LOAD ! 4881: DAC 4 ! 4882: DTC /LOAD/ ! 4883: DAC S$LOD ! 4884: DAC 2 ! 4885: * ! 4886: V$LPD DBC SVFNP LPAD ! 4887: DAC 4 ! 4888: DTC /LPAD/ ! 4889: DAC S$LPD ! 4890: DAC 3 ! 4891: * ! 4892: V$RPD DBC SVFNP RPAD ! 4893: DAC 4 ! 4894: DTC /RPAD/ ! 4895: DAC S$RPD ! 4896: DAC 3 ! 4897: * ! 4898: V$RPS DBC SVFNP RPOS ! 4899: DAC 4 ! 4900: DTC /RPOS/ ! 4901: DAC S$RPS ! 4902: DAC 1 ! 4903: * ! 4904: V$RTB DBC SVFNP RTAB ! 4905: DAC 4 ! 4906: DTC /RTAB/ ! 4907: DAC S$RTB ! 4908: DAC 1 ! 4909: * ! 4910: V$SI$ DBC SVFNP SIZE ! 4911: DAC 4 ! 4912: DTC /SIZE/ ! 4913: DAC S$SI$ ! 4914: DAC 1 ! 4915: * ! 4916: * ! 4917: V$SRT DBC SVFNN SORT ! 4918: DAC 4 ! 4919: DTC /SORT/ ! 4920: DAC S$SRT ! 4921: DAC 2 ! 4922: V$SPN DBC SVFNP SPAN ! 4923: DAC 4 ! 4924: DTC /SPAN/ ! 4925: DAC S$SPN ! 4926: DAC 1 ! 4927: EJC ! 4928: * ! 4929: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 4930: * ! 4931: V$STN DBC SVKNM STNO ! 4932: DAC 4 ! 4933: DTC /STNO/ ! 4934: DAC K$STN ! 4935: * ! 4936: V$TIM DBC SVFNN TIME ! 4937: DAC 4 ! 4938: DTC /TIME/ ! 4939: DAC S$TIM ! 4940: DAC 0 ! 4941: * ! 4942: V$TRM DBC SVFNK TRIM ! 4943: DAC 4 ! 4944: DTC /TRIM/ ! 4945: DAC K$TRM ! 4946: DAC S$TRM ! 4947: DAC 1 ! 4948: * ! 4949: V$ABE DBC SVKNM ABEND ! 4950: DAC 5 ! 4951: DTC /ABEND/ ! 4952: DAC K$ABE ! 4953: * ! 4954: V$ABO DBC SVKVL ABORT ! 4955: DAC 5 ! 4956: DTC /ABORT/ ! 4957: DAC K$ABO ! 4958: DAC L$ABO ! 4959: DAC NDABO ! 4960: * ! 4961: V$APP DBC SVFNF APPLY ! 4962: DAC 5 ! 4963: DTC /APPLY/ ! 4964: DAC S$APP ! 4965: DAC 999 ! 4966: * ! 4967: V$ABN DBC SVFNP ARBNO ! 4968: DAC 5 ! 4969: DTC /ARBNO/ ! 4970: DAC S$ABN ! 4971: DAC 1 ! 4972: * ! 4973: V$ARR DBC SVFNN ARRAY ! 4974: DAC 5 ! 4975: DTC /ARRAY/ ! 4976: DAC S$ARR ! 4977: DAC 2 ! 4978: EJC ! 4979: * ! 4980: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 4981: * ! 4982: V$BRK DBC SVFNP BREAK ! 4983: DAC 5 ! 4984: DTC /BREAK/ ! 4985: DAC S$BRK ! 4986: DAC 1 ! 4987: * ! 4988: V$CLR DBC SVFNN CLEAR ! 4989: DAC 5 ! 4990: DTC /CLEAR/ ! 4991: DAC S$CLR ! 4992: DAC 1 ! 4993: * ! 4994: V$EJC DBC SVFNN EJECT ! 4995: DAC 5 ! 4996: DTC /EJECT/ ! 4997: DAC S$EJC ! 4998: DAC 1 ! 4999: * ! 5000: V$FEN DBC SVFPK FENCE ! 5001: DAC 5 ! 5002: DTC /FENCE/ ! 5003: DAC K$FEN ! 5004: DAC S$FNC ! 5005: DAC 1 ! 5006: DAC NDFEN ! 5007: * ! 5008: V$FLD DBC SVFNN FIELD ! 5009: DAC 5 ! 5010: DTC /FIELD/ ! 5011: DAC S$FLD ! 5012: DAC 2 ! 5013: * ! 5014: V$IDN DBC SVFPR IDENT ! 5015: DAC 5 ! 5016: DTC /IDENT/ ! 5017: DAC S$IDN ! 5018: DAC 2 ! 5019: * ! 5020: V$INP DBC SVFNK INPUT ! 5021: DAC 5 ! 5022: DTC /INPUT/ ! 5023: DAC K$INP ! 5024: DAC S$INP ! 5025: DAC 3 ! 5026: * ! 5027: V$LOC DBC SVFNN LOCAL ! 5028: DAC 5 ! 5029: DTC /LOCAL/ ! 5030: DAC S$LOC ! 5031: DAC 2 ! 5032: EJC ! 5033: * ! 5034: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5035: * ! 5036: V$OPS DBC SVFNN OPSYN ! 5037: DAC 5 ! 5038: DTC /OPSYN/ ! 5039: DAC S$OPS ! 5040: DAC 3 ! 5041: * ! 5042: V$RMD DBC SVFNP REMDR ! 5043: DAC 5 ! 5044: DTC /REMDR/ ! 5045: DAC S$RMD ! 5046: DAC 2 ! 5047: * ! 5048: V$RSR DBC SVFNN RSORT ! 5049: DAC 5 ! 5050: DTC /RSORT/ ! 5051: DAC S$RSR ! 5052: DAC 2 ! 5053: * ! 5054: V$TBL DBC SVFNN TABLE ! 5055: DAC 5 ! 5056: DTC /TABLE/ ! 5057: DAC S$TBL ! 5058: DAC 3 ! 5059: * ! 5060: V$TRA DBC SVFNK TRACE ! 5061: DAC 5 ! 5062: DTC /TRACE/ ! 5063: DAC K$TRA ! 5064: DAC S$TRA ! 5065: DAC 4 ! 5066: * ! 5067: V$ANC DBC SVKNM ANCHOR ! 5068: DAC 6 ! 5069: DTC /ANCHOR/ ! 5070: DAC K$ANC ! 5071: * ! 5072: V$APN DBC SVFNN ! 5073: DAC 6 ! 5074: DTC /APPEND/ ! 5075: DAC S$APN ! 5076: DAC 2 ! 5077: * ! 5078: V$BKX DBC SVFNP BREAKX ! 5079: DAC 6 ! 5080: DTC /BREAKX/ ! 5081: DAC S$BKX ! 5082: DAC 1 ! 5083: * ! 5084: V$BUF DBC SVFNN BUFFER ! 5085: DAC 6 ! 5086: DTC /BUFFER/ ! 5087: DAC S$BUF ! 5088: DAC 2 ! 5089: * ! 5090: V$DEF DBC SVFNN DEFINE ! 5091: DAC 6 ! 5092: DTC /DEFINE/ ! 5093: DAC S$DEF ! 5094: DAC 2 ! 5095: * ! 5096: V$DET DBC SVFNN DETACH ! 5097: DAC 6 ! 5098: DTC /DETACH/ ! 5099: DAC S$DET ! 5100: DAC 1 ! 5101: EJC ! 5102: * ! 5103: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5104: * ! 5105: V$DIF DBC SVFPR DIFFER ! 5106: DAC 6 ! 5107: DTC /DIFFER/ ! 5108: DAC S$DIF ! 5109: DAC 2 ! 5110: * ! 5111: V$FTR DBC SVKNM FTRACE ! 5112: DAC 6 ! 5113: DTC /FTRACE/ ! 5114: DAC K$FTR ! 5115: * ! 5116: V$INS DBC SVFNN INSERT ! 5117: DAC 6 ! 5118: DTC /INSERT/ ! 5119: DAC S$INS ! 5120: DAC 4 ! 5121: * ! 5122: V$LST DBC SVKNM LASTNO ! 5123: DAC 6 ! 5124: DTC /LASTNO/ ! 5125: DAC K$LST ! 5126: * ! 5127: V$NAY DBC SVFNP NOTANY ! 5128: DAC 6 ! 5129: DTC /NOTANY/ ! 5130: DAC S$NAY ! 5131: DAC 1 ! 5132: * ! 5133: V$OUP DBC SVFNK OUTPUT ! 5134: DAC 6 ! 5135: DTC /OUTPUT/ ! 5136: DAC K$OUP ! 5137: DAC S$OUP ! 5138: DAC 3 ! 5139: * ! 5140: V$RET DBC SVLBL RETURN ! 5141: DAC 6 ! 5142: DTC /RETURN/ ! 5143: DAC L$RTN ! 5144: * ! 5145: V$REW DBC SVFNN REWIND ! 5146: DAC 6 ! 5147: DTC /REWIND/ ! 5148: DAC S$REW ! 5149: DAC 1 ! 5150: * ! 5151: V$STT DBC SVFNN STOPTR ! 5152: DAC 6 ! 5153: DTC /STOPTR/ ! 5154: DAC S$STT ! 5155: DAC 2 ! 5156: EJC ! 5157: * ! 5158: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5159: * ! 5160: V$SUB DBC SVFNN SUBSTR ! 5161: DAC 6 ! 5162: DTC /SUBSTR/ ! 5163: DAC S$SUB ! 5164: DAC 3 ! 5165: * ! 5166: V$UNL DBC SVFNN UNLOAD ! 5167: DAC 6 ! 5168: DTC /UNLOAD/ ! 5169: DAC S$UNL ! 5170: DAC 1 ! 5171: * ! 5172: V$COL DBC SVFNN COLLECT ! 5173: DAC 7 ! 5174: DTC /COLLECT/ ! 5175: DAC S$COL ! 5176: DAC 1 ! 5177: * ! 5178: V$CNV DBC SVFNN CONVERT ! 5179: DAC 7 ! 5180: DTC /CONVERT/ ! 5181: DAC S$CNV ! 5182: DAC 2 ! 5183: * ! 5184: V$ENF DBC SVFNN ENDFILE ! 5185: DAC 7 ! 5186: DTC /ENDFILE/ ! 5187: DAC S$ENF ! 5188: DAC 1 ! 5189: * ! 5190: V$ETX DBC SVKNM ERRTEXT ! 5191: DAC 7 ! 5192: DTC /ERRTEXT/ ! 5193: DAC K$ETX ! 5194: * ! 5195: V$ERT DBC SVKNM ERRTYPE ! 5196: DAC 7 ! 5197: DTC /ERRTYPE/ ! 5198: DAC K$ERT ! 5199: * ! 5200: V$FRT DBC SVLBL FRETURN ! 5201: DAC 7 ! 5202: DTC /FRETURN/ ! 5203: DAC L$FRT ! 5204: * ! 5205: V$INT DBC SVFPR INTEGER ! 5206: DAC 7 ! 5207: DTC /INTEGER/ ! 5208: DAC S$INT ! 5209: DAC 1 ! 5210: * ! 5211: V$NRT DBC SVLBL NRETURN ! 5212: DAC 7 ! 5213: DTC /NRETURN/ ! 5214: DAC L$NRT ! 5215: EJC ! 5216: * ! 5217: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5218: * ! 5219: * ! 5220: V$PFL DBC SVKNM PROFILE ! 5221: DAC 7 ! 5222: DTC /PROFILE/ ! 5223: DAC K$PFL ! 5224: * ! 5225: V$RPL DBC SVFNP REPLACE ! 5226: DAC 7 ! 5227: DTC /REPLACE/ ! 5228: DAC S$RPL ! 5229: DAC 3 ! 5230: * ! 5231: V$RVS DBC SVFNP REVERSE ! 5232: DAC 7 ! 5233: DTC /REVERSE/ ! 5234: DAC S$RVS ! 5235: DAC 1 ! 5236: * ! 5237: V$RTN DBC SVKNM RTNTYPE ! 5238: DAC 7 ! 5239: DTC /RTNTYPE/ ! 5240: DAC K$RTN ! 5241: * ! 5242: V$STX DBC SVFNN SETEXIT ! 5243: DAC 7 ! 5244: DTC /SETEXIT/ ! 5245: DAC S$STX ! 5246: DAC 1 ! 5247: * ! 5248: V$STC DBC SVKNM STCOUNT ! 5249: DAC 7 ! 5250: DTC /STCOUNT/ ! 5251: DAC K$STC ! 5252: * ! 5253: V$STL DBC SVKNM STLIMIT ! 5254: DAC 7 ! 5255: DTC /STLIMIT/ ! 5256: DAC K$STL ! 5257: * ! 5258: V$SUC DBC SVKVC SUCCEED ! 5259: DAC 7 ! 5260: DTC /SUCCEED/ ! 5261: DAC K$SUC ! 5262: DAC NDSUC ! 5263: * ! 5264: V$ALP DBC SVKWC ALPHABET ! 5265: DAC 8 ! 5266: DTC /ALPHABET/ ! 5267: DAC K$ALP ! 5268: * ! 5269: V$CNT DBC SVLBL CONTINUE ! 5270: DAC 8 ! 5271: DTC /CONTINUE/ ! 5272: DAC L$CNT ! 5273: EJC ! 5274: * ! 5275: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5276: * ! 5277: V$DTP DBC SVFNP DATATYPE ! 5278: DAC 8 ! 5279: DTC /DATATYPE/ ! 5280: DAC S$DTP ! 5281: DAC 1 ! 5282: * ! 5283: V$ERL DBC SVKNM ERRLIMIT ! 5284: DAC 8 ! 5285: DTC /ERRLIMIT/ ! 5286: DAC K$ERL ! 5287: * ! 5288: V$FNC DBC SVKNM FNCLEVEL ! 5289: DAC 8 ! 5290: DTC /FNCLEVEL/ ! 5291: DAC K$FNC ! 5292: * ! 5293: V$MXL DBC SVKNM MAXLNGTH ! 5294: DAC 8 ! 5295: DTC /MAXLNGTH/ ! 5296: DAC K$MXL ! 5297: * ! 5298: V$TER DBC 0 TERMINAL ! 5299: DAC 8 ! 5300: DTC /TERMINAL/ ! 5301: DAC 0 ! 5302: * ! 5303: V$PRO DBC SVFNN PROTOTYPE ! 5304: DAC 9 ! 5305: DTC /PROTOTYPE/ ! 5306: DAC S$PRO ! 5307: DAC 1 ! 5308: * ! 5309: DBC 0 DUMMY ENTRY TO END LIST ! 5310: DAC 10 LENGTH GT 9 (PROTOTYPE) ! 5311: EJC ! 5312: * ! 5313: * LIST OF SVBLK POINTERS FOR KEYWORDS TO BE DUMPED. THE ! 5314: * LIST IS IN THE ORDER WHICH APPEARS ON THE DUMP OUTPUT. ! 5315: * ! 5316: VDMKW DAC V$ANC ANCHOR ! 5317: DAC V$CAS CCASE ! 5318: DAC V$COD CODE ! 5319: DAC V$DMP DUMP ! 5320: DAC V$ERL ERRLIMIT ! 5321: DAC V$ETX ERRTEXT ! 5322: DAC V$ERT ERRTYPE ! 5323: DAC V$FNC FNCLEVEL ! 5324: DAC V$FTR FTRACE ! 5325: DAC V$INP INPUT ! 5326: DAC V$LST LASTNO ! 5327: DAC V$MXL MAXLENGTH ! 5328: DAC V$OUP OUTPUT ! 5329: DAC V$PFL PROFILE ! 5330: DAC V$RTN RTNTYPE ! 5331: DAC V$STC STCOUNT ! 5332: DAC V$STL STLIMIT ! 5333: DAC V$STN STNO ! 5334: DAC V$TRA TRACE ! 5335: DAC V$TRM TRIM ! 5336: DAC 0 END OF LIST ! 5337: * ! 5338: * TABLE USED BY GTNVR TO SEARCH SVBLK LISTS ! 5339: * ! 5340: VSRCH DAC 0 DUMMY ENTRY TO GET PROPER INDEXING ! 5341: DAC V$EQF START OF 1 CHAR VARIABLES (NONE) ! 5342: DAC V$EQF START OF 2 CHAR VARIABLES ! 5343: DAC V$ANY START OF 3 CHAR VARIABLES ! 5344: DAC V$CAS START OF 4 CHAR VARIABLES ! 5345: DAC V$ABE START OF 5 CHAR VARIABLES ! 5346: DAC V$ANC START OF 6 CHAR VARIABLES ! 5347: DAC V$COL START OF 7 CHAR VARIABLES ! 5348: DAC V$ALP START OF 8 CHAR VARIABLES ! 5349: DAC V$PRO START OF 9 CHAR VARIABLES ! 5350: TTL S P I T B O L -- WORKING STORAGE SECTION ! 5351: * ! 5352: * THE WORKING STORAGE SECTION CONTAINS AREAS WHICH ARE ! 5353: * CHANGED DURING EXECUTION OF THE PROGRAM. THE VALUE ! 5354: * ASSEMBLED IS THE INITIAL VALUE BEFORE EXECUTION STARTS. ! 5355: * ! 5356: * ALL THESE AREAS ARE FIXED LENGTH AREAS. VARIABLE LENGTH ! 5357: * DATA IS STORED IN THE STATIC OR DYNAMIC REGIONS OF THE ! 5358: * ALLOCATED DATA AREAS. ! 5359: * ! 5360: * THE VALUES IN THIS AREA ARE DESCRIBED EITHER AS WORK ! 5361: * AREAS OR AS GLOBAL VALUES. A WORK AREA IS USED IN AN ! 5362: * EPHEMERAL MANNER AND THE VALUE IS NOT SAVED FROM ONE ! 5363: * ENTRY INTO A ROUTINE TO ANOTHER. A GLOBAL VALUE IS A ! 5364: * LESS TEMPORARY LOCATION WHOSE VALUE IS SAVED FROM ONE ! 5365: * CALL TO ANOTHER. ! 5366: * ! 5367: * A GENERAL PART OF THE APPROACH IN THIS PROGRAM IS NOT ! 5368: * TO OVERLAP WORK AREAS BETWEEN PROCEDURES EVEN THOUGH A ! 5369: * SMALL AMOUNT OF SPACE COULD BE SAVED. SUCH OVERLAP IS ! 5370: * CONSIDERED A SOURCE OF PROGRAM ERRORS AND DECREASES THE ! 5371: * INFORMATION LEFT BEHIND AFTER A SYSTEM CRASH OF ANY KIND. ! 5372: * ! 5373: * THE NAMES OF THESE LOCATIONS ARE LABELS WITH FIVE LETTER ! 5374: * (A-Y,$) NAMES. AS FAR AS POSSIBLE THE ORDER IS KEPT ! 5375: * ALPHABETICAL BY THESE NAMES BUT IN SOME CASES THERE ! 5376: * ARE SLIGHT DEPARTURES CAUSED BY OTHER ORDER REQUIREMENTS. ! 5377: * ! 5378: * UNLESS OTHERWISE DOCUMENTED, THE ORDER OF WORK AREAS ! 5379: * DOES NOT AFFECT THE EXECUTION OF THE SPITBOL PROGRAM. ! 5380: * ! 5381: SEC START OF WORKING STORAGE SECTION ! 5382: EJC ! 5383: * ! 5384: * THIS AREA IS NOT CLEARED BY INITIAL CODE ! 5385: * ! 5386: CMLAB DAC B$SCL STRING USED TO CHECK LABEL LEGALITY ! 5387: DAC 2 ! 5388: DTC / / ! 5389: * ! 5390: * LABEL TO MARK START OF WORK AREA ! 5391: * ! 5392: AAAAA DAC 0 ! 5393: * ! 5394: * WORK AREAS FOR ALLOC PROCEDURE ! 5395: * ! 5396: ALDYN DAC 0 AMOUNT OF DYNAMIC STORE ! 5397: ALFSF DIC +0 FACTOR IN FREE STORE PCNTAGE CHECK ! 5398: ALLIA DIC +0 DUMP IA ! 5399: ALLSV DAC 0 SAVE WB IN ALLOC ! 5400: * ! 5401: * WORK AREAS FOR ALOST PROCEDURE ! 5402: * ! 5403: ALSTA DAC 0 SAVE WA IN ALOST ! 5404: * ! 5405: * SAVE AREAS FOR ARRAY FUNCTION (S$ARR) ! 5406: * ! 5407: ARCDM DAC 0 COUNT DIMENSIONS ! 5408: ARNEL DIC +0 COUNT ELEMENTS ! 5409: ARPTR DAC 0 OFFSET PTR INTO ARBLK ! 5410: ARSVL DIC +0 SAVE INTEGER LOW BOUND ! 5411: EJC ! 5412: * WORK AREAS FOR ARREF ROUTINE ! 5413: * ! 5414: ARFSI DIC +0 SAVE CURRENT EVOLVING SUBSCRIPT ! 5415: ARFXS DAC 0 SAVE BASE STACK POINTER ! 5416: * ! 5417: * WORK AREAS FOR B$EFC BLOCK ROUTINE ! 5418: * ! 5419: BEFOF DAC 0 SAVE OFFSET PTR INTO EFBLK ! 5420: * ! 5421: * WORK AREAS FOR B$PFC BLOCK ROUTINE ! 5422: * ! 5423: BPFPF DAC 0 SAVE PFBLK POINTER ! 5424: BPFSV DAC 0 SAVE OLD FUNCTION VALUE ! 5425: BPFXT DAC 0 POINTER TO STACKED ARGUMENTS ! 5426: * ! 5427: * SAVE AREAS FOR COLLECT FUNCTION (S$COL) ! 5428: * ! 5429: CLSVI DIC +0 SAVE INTEGER ARGUMENT ! 5430: * ! 5431: * GLOBAL VALUES FOR CMPIL PROCEDURE ! 5432: * ! 5433: CMERC DAC 0 COUNT OF INITIAL COMPILE ERRORS ! 5434: CMPXS DAC 0 SAVE STACK PTR IN CASE OF ERRORS ! 5435: CMPSN DAC 1 NUMBER OF NEXT STATEMENT TO COMPILE ! 5436: CMPSS DAC 0 SAVE SUBROUTINE STACK PTR ! 5437: * ! 5438: * WORK AREA FOR CNCRD ! 5439: * ! 5440: CNSCC DAC 0 POINTER TO CONTROL CARD STRING ! 5441: CNSWC DAC 0 WORD COUNT ! 5442: CNR$T DAC 0 POINTER TO R$TTL OR R$STL ! 5443: CNTTL DAC 0 FLAG FOR -TITLE, -STITL ! 5444: * ! 5445: * WORK AREAS FOR CONVERT FUNCTION (S$CNV) ! 5446: * ! 5447: CNVTP DAC 0 SAVE PTR INTO SCVTB ! 5448: * ! 5449: * FLAG FOR SUPPRESSION OF COMPILATION STATISTICS. ! 5450: * ! 5451: CPSTS DAC 0 SUPPRESS COMP. STATS IF NON ZERO ! 5452: * ! 5453: * GLOBAL VALUES FOR CONTROL CARD SWITCHES ! 5454: * ! 5455: CSWDB DAC 0 0/1 FOR -SINGLE/-DOUBLE ! 5456: CSWER DAC 0 0/1 FOR -ERRORS/-NOERRORS ! 5457: CSWEX DAC 0 0/1 FOR -EXECUTE/-NOEXECUTE ! 5458: CSWFL DAC 1 0/1 FOR -NOFAIL/-FAIL ! 5459: CSWIN DAC INILN XXX FOR -INXXX ! 5460: CSWLS DAC 1 0/1 FOR -NOLIST/-LIST ! 5461: CSWNO DAC 0 0/1 FOR -OPTIMISE/-NOOPT ! 5462: CSWPR DAC 0 0/1 FOR -NOPRINT/-PRINT ! 5463: * ! 5464: * GLOBAL LOCATION USED BY PATST PROCEDURE ! 5465: * ! 5466: CTMSK DBC 0 LAST BIT POSITION USED IN R$CTP ! 5467: CURID DAC 0 CURRENT ID VALUE ! 5468: EJC ! 5469: * ! 5470: * GLOBAL VALUE FOR CDWRD PROCEDURE ! 5471: * ! 5472: CWCOF DAC 0 NEXT WORD OFFSET IN CURRENT CCBLK ! 5473: * ! 5474: * WORK AREAS FOR DATA FUNCTION (S$DAT) ! 5475: * ! 5476: DATDV DAC 0 SAVE VRBLK PTR FOR DATATYPE NAME ! 5477: DATXS DAC 0 SAVE INITIAL STACK POINTER ! 5478: * ! 5479: * WORK AREAS FOR DEFINE FUNCTION (S$DEF) ! 5480: * ! 5481: DEFLB DAC 0 SAVE VRBLK PTR FOR LABEL ! 5482: DEFNA DAC 0 COUNT FUNCTION ARGUMENTS ! 5483: DEFVR DAC 0 SAVE VRBLK PTR FOR FUNCTION NAME ! 5484: DEFXS DAC 0 SAVE INITIAL STACK POINTER ! 5485: * ! 5486: * WORK AREAS FOR DUMPR PROCEDURE ! 5487: * ! 5488: DMARG DAC 0 DUMP ARGUMENT ! 5489: DMPKB DAC B$KVT DUMMY KVBLK FOR USE IN DUMPR ! 5490: DMPKT DAC TRBKV KVVAR TRBLK POINTER ! 5491: DMPKN DAC 0 KEYWORD NUMBER (MUST FOLLOW DMPKB) ! 5492: DMPSA DAC 0 PRESERVE WA OVER PRTVL CALL ! 5493: DMPSV DAC 0 GENERAL SCRATCH SAVE ! 5494: DMVCH DAC 0 CHAIN POINTER FOR VARIABLE BLOCKS ! 5495: DMPCH DAC 0 SAVE SORTED VRBLK CHAIN POINTER ! 5496: * ! 5497: * GLOBAL LOCATIONS FOR DYNAMIC STORAGE POINTERS ! 5498: * ! 5499: DNAMB DAC 0 START OF DYNAMIC AREA ! 5500: DNAMP DAC 0 NEXT AVAILABLE LOC IN DYNAMIC AREA ! 5501: DNAME DAC 0 END OF AVAILABLE DYNAMIC AREA ! 5502: * ! 5503: * WORK AREA FOR DTACH ! 5504: * ! 5505: DTCNB DAC 0 NAME BASE ! 5506: DTCNM DAC 0 NAME PTR ! 5507: * ! 5508: * WORK AREAS FOR DUPL FUNCTION (S$DUP) ! 5509: * ! 5510: DUPSI DIC +0 STORE INTEGER STRING LENGTH ! 5511: * ! 5512: * WORK AREA FOR ENDFILE (S$ENF) ! 5513: * ! 5514: ENFCH DAC 0 FOR IOCHN CHAIN HEAD ! 5515: * ! 5516: * WORK AREA FOR ERROR PROCESSING. ! 5517: * ! 5518: ERICH DAC 0 COPY ERROR REPORTS TO INT.CHAN IF 1 ! 5519: ERLST DAC 0 FOR LISTR WHEN ERRORS GO TO INT.CH. ! 5520: ERRFT DAC 0 FATAL ERROR FLAG ! 5521: ERRSP DAC 0 ERROR SUPPRESSION FLAG ! 5522: EJC ! 5523: * ! 5524: * DUMP AREA FOR ERTEX ! 5525: * ! 5526: ERTWA DAC 0 SAVE WA ! 5527: ERTWB DAC 0 SAVE WB ! 5528: * ! 5529: * GLOBAL VALUES FOR EVALI ! 5530: * ! 5531: EVLIN DAC P$LEN DUMMY PATTERN BLOCK PCODE ! 5532: EVLIS DAC 0 POINTER TO SUBSEQUENT NODE ! 5533: EVLIV DAC 0 VALUE OF PARAMETER ! 5534: * WORK AREA FOR EXPAN ! 5535: * ! 5536: EXPSV DAC 0 SAVE OP DOPE VECTOR POINTER ! 5537: * ! 5538: * FLAG FOR SUPPRESSION OF EXECUTION STATS ! 5539: * ! 5540: EXSTS DAC 0 SUPPRESS EXEC STATS IF SET ! 5541: * ! 5542: * GLOBAL VALUES FOR EXFAL AND RETURN ! 5543: * ! 5544: FLPRT DAC 0 LOCATION OF FAIL OFFSET FOR RETURN ! 5545: FLPTR DAC 0 LOCATION OF FAILURE OFFSET ON STACK ! 5546: * ! 5547: * WORK AREAS FOR GBCOL PROCEDURE ! 5548: * ! 5549: GBCFL DAC 0 GARBAGE COLLECTOR ACTIVE FLAG ! 5550: GBCLM DAC 0 POINTER TO LAST MOVE BLOCK (PASS 3) ! 5551: GBCNM DAC 0 DUMMY FIRST MOVE BLOCK ! 5552: GBCNS DAC 0 REST OF DUMMY BLOCK (FOLLOWS GBCNM) ! 5553: GBSVA DAC 0 SAVE WA ! 5554: GBSVB DAC 0 SAVE WB ! 5555: GBSVC DAC 0 SAVE WC ! 5556: * ! 5557: * GLOBAL LOCATION TO COUNT GARBAGE COLLECTIONS (GBCOL) ! 5558: * ! 5559: GBCNT DAC 0 COUNT OF GARBAGE COLLECTIONS ! 5560: * ! 5561: * WORK AREAS FOR GTNVR PROCEDURE ! 5562: * ! 5563: GNVHE DAC 0 PTR TO END OF HASH CHAIN ! 5564: GNVNW DAC 0 NUMBER OF WORDS IN STRING NAME ! 5565: GNVSA DAC 0 SAVE WA ! 5566: GNVSB DAC 0 SAVE WB ! 5567: GNVSP DAC 0 POINTER INTO VSRCH TABLE ! 5568: GNVST DAC 0 POINTER TO CHARS OF STRING ! 5569: * ! 5570: * GLOBAL VALUE FOR GTCOD AND GTEXP ! 5571: * ! 5572: GTCEF DAC 0 SAVE FAIL PTR IN CASE OF ERROR ! 5573: * ! 5574: * WORK AREAS FOR GTINT ! 5575: * ! 5576: GTINA DAC 0 SAVE WA ! 5577: GTINB DAC 0 SAVE WB ! 5578: EJC ! 5579: * ! 5580: * WORK AREAS FOR GTNUM PROCEDURE ! 5581: * ! 5582: GTNNF DAC 0 ZERO/NONZERO FOR RESULT +/- ! 5583: GTNSI DIC +0 GENERAL INTEGER SAVE ! 5584: GTNDF DAC 0 0/1 FOR DEC POINT SO FAR NO/YES ! 5585: GTNES DAC 0 ZERO/NONZERO EXPONENT +/- ! 5586: GTNEX DIC +0 REAL EXPONENT ! 5587: GTNSC DAC 0 SCALE (PLACES AFTER POINT) ! 5588: GTNSR DRC +0.0 GENERAL REAL SAVE ! 5589: GTNRD DAC 0 FLAG FOR OK REAL NUMBER ! 5590: * ! 5591: * WORK AREAS FOR GTPAT PROCEDURE ! 5592: * ! 5593: GTPSB DAC 0 SAVE WB ! 5594: * ! 5595: * WORK AREAS FOR GTSTG PROCEDURE ! 5596: * ! 5597: GTSSF DAC 0 0/1 FOR RESULT +/- ! 5598: GTSVC DAC 0 SAVE WC ! 5599: GTSVB DAC 0 SAVE WB ! 5600: GTSWK DAC 0 PTR TO WORK AREA FOR GTSTG ! 5601: GTSES DAC 0 CHAR + OR - FOR EXPONENT +/- ! 5602: GTSRS DRC +0.0 GENERAL REAL SAVE ! 5603: * ! 5604: * GLOBAL LOCATIONS (CONSTANTS) FOR GTSTG PROCEDURE ! 5605: * ! 5606: GTSRN DRC +0.0 ROUNDING FACTOR 0.5*10**-CFP$S ! 5607: GTSSC DRC +0.0 SCALING VALUE 10**CFP$S ! 5608: * ! 5609: * WORK AREAS FOR GTVAR PROCEDURE ! 5610: * ! 5611: GTVRC DAC 0 SAVE WC ! 5612: * ! 5613: * FLAG FOR HEADER PRINTING ! 5614: * ! 5615: HEADP DAC 0 HEADER PRINTED FLAG ! 5616: * ! 5617: * GLOBAL VALUES FOR VARIABLE HASH TABLE ! 5618: * ! 5619: HSHNB DIC +0 NUMBER OF HASH BUCKETS ! 5620: HSHTB DAC 0 POINTER TO START OF VRBLK HASH TABL ! 5621: HSHTE DAC 0 POINTER PAST END OF VRBLK HASH TABL ! 5622: * ! 5623: * WORK AREA FOR INIT ! 5624: * ! 5625: INISS DAC 0 SAVE SUBROUTINE STACK PTR ! 5626: INITR DAC 0 SAVE TERMINAL FLAG ! 5627: * ! 5628: * SAVE AREA FOR INSBF ! 5629: * ! 5630: INSAB DAC 0 ENTRY WA + ENTRY WB ! 5631: INSSA DAC 0 SAVE ENTRY WA ! 5632: INSSB DAC 0 SAVE ENTRY WB ! 5633: INSSC DAC 0 SAVE ENTRY WC ! 5634: * ! 5635: * WORK AREAS FOR IOPUT ! 5636: * ! 5637: IOPTT DAC 0 TYPE OF ASSOCIATION ! 5638: EJC ! 5639: * ! 5640: * GLOBAL VALUES FOR KEYWORD VALUES WHICH ARE STORED AS ONE ! 5641: * WORD INTEGERS. THESE VALUES MUST BE ASSEMBLED IN THE ! 5642: * FOLLOWING ORDER (AS DICTATED BY K$XXX DEFINITION VALUES). ! 5643: * ! 5644: KVABE DAC 0 ABEND ! 5645: KVANC DAC 0 ANCHOR ! 5646: KVCAS DAC 0 CASE ! 5647: KVCOD DAC 0 CODE ! 5648: KVDMP DAC 0 DUMP ! 5649: KVERL DAC 0 ERRLIMIT ! 5650: KVERT DAC 0 ERRTYPE ! 5651: KVFTR DAC 0 FTRACE ! 5652: KVINP DAC 1 INPUT ! 5653: KVMXL DAC 5000 MAXLENGTH ! 5654: KVOUP DAC 1 OUTPUT ! 5655: KVPFL DAC 0 PROFILE ! 5656: KVTRA DAC 0 TRACE ! 5657: KVTRM DAC 0 TRIM ! 5658: KVFNC DAC 0 FNCLEVEL ! 5659: KVLST DAC 0 LASTNO ! 5660: KVSTN DAC 0 STNO ! 5661: * ! 5662: * GLOBAL VALUES FOR OTHER KEYWORDS ! 5663: * ! 5664: KVALP DAC 0 ALPHABET ! 5665: KVRTN DAC NULLS RTNTYPE (SCBLK POINTER) ! 5666: KVSTL DIC +50000 STLIMIT ! 5667: KVSTC DIC +50000 STCOUNT (COUNTS DOWN FROM STLIMIT) ! 5668: * ! 5669: * WORK AREAS FOR LOAD FUNCTION ! 5670: * ! 5671: LODFN DAC 0 POINTER TO VRBLK FOR FUNC NAME ! 5672: LODNA DAC 0 COUNT NUMBER OF ARGUMENTS ! 5673: * ! 5674: * GLOBAL VALUES FOR LISTR PROCEDURE ! 5675: * ! 5676: LSTLC DAC 0 COUNT LINES ON SOURCE LIST PAGE ! 5677: LSTNP DAC 0 MAX NUMBER OF LINES ON PAGE ! 5678: LSTPF DAC 1 SET NONZERO IF CURRENT IMAGE LISTED ! 5679: LSTPG DAC 0 CURRENT SOURCE LIST PAGE NUMBER ! 5680: LSTPO DAC 0 OFFSET TO PAGE NNN MESSAGE ! 5681: LSTSN DAC 0 REMEMBER LAST STMNUM LISTED ! 5682: * ! 5683: * MAXIMUM SIZE OF SPITBOL OBJECTS ! 5684: * ! 5685: MXLEN DAC 0 INITIALISED BY SYSMX CALL ! 5686: * ! 5687: * EXECUTION CONTROL VARIABLE ! 5688: * ! 5689: NOXEQ DAC 0 SET NON-ZERO TO INHIBIT EXECUTION ! 5690: * ! 5691: * PROFILER GLOBAL VALUES AND WORK LOCATIONS ! 5692: * ! 5693: PFDMP DAC 0 SET NON-0 IF &PROFILE SET NON-0 ! 5694: PFFNC DAC 0 SET NON-0 IF FUNCT JUST ENTERED ! 5695: PFSTM DIC +0 TO STORE STARTING TIME OF STMT ! 5696: PFETM DIC +0 TO STORE ENDING TIME OF STMT ! 5697: PFSVW DAC 0 TO SAVE A W-REG ! 5698: PFTBL DAC 0 GETS ADRS OF (IMAG) TABLE BASE ! 5699: PFNTE DAC 0 NR OF TABLE ENTRIES ! 5700: PFSTE DIC +0 GETS INT REP OF TABLE ENTRY SIZE ! 5701: * ! 5702: EJC ! 5703: * ! 5704: * GLOBAL VALUES USED IN PATTERN MATCH ROUTINES ! 5705: * ! 5706: PMDFL DAC 0 PATTERN ASSIGNMENT FLAG ! 5707: PMHBS DAC 0 HISTORY STACK BASE POINTER ! 5708: PMSSL DAC 0 LENGTH OF SUBJECT STRING IN CHARS ! 5709: * ! 5710: * FLAGS USED FOR STANDARD FILE LISTING OPTIONS ! 5711: * ! 5712: PRICH DAC 0 PRINTER ON INTERACTIVE CHANNEL ! 5713: PRSTD DAC 0 TESTED BY PRTPG ! 5714: PRSTO DAC 0 STANDARD LISTING OPTION FLAG ! 5715: * ! 5716: * GLOBAL VALUE FOR PRTNM PROCEDURE ! 5717: * ! 5718: PRNMV DAC 0 VRBLK PTR FROM LAST NAME SEARCH ! 5719: * ! 5720: * WORK AREAS FOR PRTNM PROCEDURE ! 5721: * ! 5722: PRNSI DIC +0 SCRATCH INTEGER LOC ! 5723: * ! 5724: * WORK AREAS FOR PRTSN PROCEDURE ! 5725: * ! 5726: PRSNA DAC 0 SAVE WA ! 5727: * ! 5728: * GLOBAL VALUES FOR PRINT PROCEDURES ! 5729: * ! 5730: PRBUF DAC 0 PTR TO PRINT BFR IN STATIC ! 5731: PRECL DAC 0 EXTENDED/COMPACT LISTING FLAG ! 5732: PRLEN DAC 0 LENGTH OF PRINT BUFFER IN CHARS ! 5733: PRLNW DAC 0 LENGTH OF PRINT BUFFER IN WORDS ! 5734: PROFS DAC 0 OFFSET TO NEXT LOCATION IN PRBUF ! 5735: PRTEF DAC 0 ENDFILE FLAG ! 5736: * ! 5737: * WORK AREAS FOR PRTST PROCEDURE ! 5738: * ! 5739: PRSVA DAC 0 SAVE WA ! 5740: PRSVB DAC 0 SAVE WB ! 5741: PRSVC DAC 0 SAVE CHAR COUNTER ! 5742: * ! 5743: * WORK AREA FOR PRTNL ! 5744: * ! 5745: PRTSA DAC 0 SAVE WA ! 5746: PRTSB DAC 0 SAVE WB ! 5747: * ! 5748: * WORK AREA FOR PRTVL ! 5749: * ! 5750: PRVSI DAC 0 SAVE IDVAL ! 5751: * ! 5752: * WORK AREAS FOR PATTERN MATCH ROUTINES ! 5753: * ! 5754: PSAVE DAC 0 TEMPORARY SAVE FOR CURRENT NODE PTR ! 5755: PSAVC DAC 0 SAVE CURSOR IN P$SPN, P$STR ! 5756: EJC ! 5757: * ! 5758: * AMOUNT OF MEMORY RESERVED FOR END OF EXECUTION ! 5759: * ! 5760: RSMEM DAC 0 RESERVE MEMORY ! 5761: * ! 5762: * WORK AREAS FOR RETRN ROUTINE ! 5763: * ! 5764: RTNBP DAC 0 TO SAVE A BLOCK POINTER ! 5765: RTNFV DAC 0 NEW FUNCTION VALUE (RESULT) ! 5766: RTNSV DAC 0 OLD FUNCTION VALUE (SAVED VALUE) ! 5767: * ! 5768: * RELOCATABLE GLOBAL VALUES ! 5769: * ! 5770: * ALL THE POINTERS IN THIS SECTION CAN POINT TO BLOCKS IN ! 5771: * THE DYNAMIC STORAGE AREA AND MUST BE RELOCATED BY THE ! 5772: * GARBAGE COLLECTOR. THEY ARE IDENTIFIED BY R$XXX NAMES. ! 5773: * ! 5774: R$AAA DAC 0 START OF RELOCATABLE VALUES ! 5775: R$ARF DAC 0 ARRAY BLOCK POINTER FOR ARREF ! 5776: R$CCB DAC 0 PTR TO CCBLK BEING BUILT (CDWRD) ! 5777: R$CIM DAC 0 PTR TO CURRENT COMPILER INPUT STR ! 5778: R$CMP DAC 0 COPY OF R$CIM USED IN CMPIL ! 5779: R$CNI DAC 0 PTR TO NEXT COMPILER INPUT STRING ! 5780: R$CNT DAC 0 CDBLK POINTER FOR SETEXIT CONTINUE ! 5781: R$COD DAC 0 POINTER TO CURRENT CDBLK OR EXBLK ! 5782: R$CTP DAC 0 PTR TO CURRENT CTBLK FOR PATST ! 5783: R$ERT DAC 0 TRBLK POINTER FOR ERRTYPE TRACE ! 5784: R$ETX DAC NULLS POINTER TO ERRTEXT STRING ! 5785: R$EXS DAC 0 = SAVE XL IN EXPDM ! 5786: R$FCB DAC 0 FCBLK CHAIN HEAD ! 5787: R$FNC DAC 0 TRBLK POINTER FOR FNCLEVEL TRACE ! 5788: R$GTC DAC 0 KEEP CODE PTR FOR GTCOD,GTEXP ! 5789: R$IO1 DAC 0 FILE ARG1 FOR IOPUT ! 5790: R$IO2 DAC 0 FILE ARG2 FOR IOPUT ! 5791: R$IOF DAC 0 FCBLK PTR OR 0 ! 5792: R$ION DAC 0 NAME BASE PTR ! 5793: R$IOP DAC 0 PREDECESSOR BLOCK PTR FOR IOPUT ! 5794: R$IOT DAC 0 TRBLK PTR FOR IOPUT ! 5795: R$PMB DAC 0 BUFFER PTR IN PATTERN MATCH ! 5796: R$PMS DAC 0 SUBJECT STRING PTR IN PATTERN MATCH ! 5797: R$RA2 DAC 0 REPLACE SECOND ARGUMENT LAST TIME ! 5798: R$RA3 DAC 0 REPLACE THIRD ARGUMENT LAST TIME ! 5799: R$RPT DAC 0 PTR TO CTBLK REPLACE TABLE LAST USD ! 5800: R$SCP DAC 0 SAVE POINTER FROM LAST SCANE CALL ! 5801: R$SXL DAC 0 PRESERVE XL IN SORTC ! 5802: R$SXR DAC 0 PRESERVE XR IN SORTA/SORTC ! 5803: R$STC DAC 0 TRBLK POINTER FOR STCOUNT TRACE ! 5804: R$STL DAC 0 SOURCE LISTING SUB-TITLE ! 5805: R$SXC DAC 0 CODE (CDBLK) PTR FOR SETEXIT TRAP ! 5806: R$TTL DAC NULLS SOURCE LISTING TITLE ! 5807: R$XSC DAC 0 STRING POINTER FOR XSCAN ! 5808: EJC ! 5809: * ! 5810: * THE REMAINING POINTERS IN THIS LIST ARE USED TO POINT ! 5811: * TO FUNCTION BLOCKS FOR NORMALLY UNDEFINED OPERATORS. ! 5812: * ! 5813: R$UBA DAC STNDO BINARY AT ! 5814: R$UBM DAC STNDO BINARY AMPERSAND ! 5815: R$UBN DAC STNDO BINARY NUMBER SIGN ! 5816: R$UBP DAC STNDO BINARY PERCENT ! 5817: R$UBT DAC STNDO BINARY NOT ! 5818: R$UUB DAC STNDO UNARY VERTICAL BAR ! 5819: R$UUE DAC STNDO UNARY EQUAL ! 5820: R$UUN DAC STNDO UNARY NUMBER SIGN ! 5821: R$UUP DAC STNDO UNARY PERCENT ! 5822: R$UUS DAC STNDO UNARY SLASH ! 5823: R$UUX DAC STNDO UNARY EXCLAMATION ! 5824: R$YYY DAC 0 LAST RELOCATABLE LOCATION ! 5825: * ! 5826: * WORK AREAS FOR SUBSTR FUNCTION (S$SUB) ! 5827: * ! 5828: SBSSV DAC 0 SAVE THIRD ARGUMENT ! 5829: * ! 5830: * GLOBAL LOCATIONS USED IN SCAN PROCEDURE ! 5831: * ! 5832: SCNBL DAC 0 SET NON-ZERO IF SCANNED PAST BLANKS ! 5833: SCNCC DAC 0 NON-ZERO TO SCAN CONTROL CARD NAME ! 5834: SCNGO DAC 0 SET NON-ZERO TO SCAN GOTO FIELD ! 5835: SCNIL DAC 0 LENGTH OF CURRENT INPUT IMAGE ! 5836: SCNPT DAC 0 POINTER TO NEXT LOCATION IN R$CIM ! 5837: SCNRS DAC 0 SET NON-ZERO TO SIGNAL RESCAN ! 5838: SCNTP DAC 0 SAVE SYNTAX TYPE FROM LAST CALL ! 5839: * ! 5840: * WORK AREAS FOR SCAN PROCEDURE ! 5841: * ! 5842: SCNSA DAC 0 SAVE WA ! 5843: SCNSB DAC 0 SAVE WB ! 5844: SCNSC DAC 0 SAVE WC ! 5845: SCNSE DAC 0 START OF CURRENT ELEMENT ! 5846: SCNOF DAC 0 SAVE OFFSET ! 5847: EJC ! 5848: * ! 5849: * WORK AREA USED BY SORTA, SORTC, SORTF, SORTH ! 5850: * ! 5851: SRTDF DAC 0 DATATYPE FIELD NAME ! 5852: SRTFD DAC 0 FOUND DFBLK ADDRESS ! 5853: SRTFF DAC 0 FOUND FIELD NAME ! 5854: SRTFO DAC 0 OFFSET TO FIELD NAME ! 5855: SRTNR DAC 0 NUMBER OF ROWS ! 5856: SRTOF DAC 0 OFFSET WITHIN ROW TO SORT KEY ! 5857: SRTRT DAC 0 ROOT OFFSET ! 5858: SRTS1 DAC 0 SAVE OFFSET 1 ! 5859: SRTS2 DAC 0 SAVE OFFSET 2 ! 5860: SRTSC DAC 0 SAVE WC ! 5861: SRTSF DAC 0 SORT ARRAY FIRST ROW OFFSET ! 5862: SRTSN DAC 0 SAVE N ! 5863: SRTSO DAC 0 OFFSET TO A(0) ! 5864: SRTSR DAC 0 0 , NON-ZERO FOR SORT, RSORT ! 5865: SRTST DAC 0 STRIDE FROM ONE ROW TO NEXT ! 5866: SRTWC DAC 0 DUMP WC ! 5867: * ! 5868: * GLOBAL VALUE FOR INDICATING STAGE (SEE ERROR SECTION) ! 5869: * ! 5870: STAGE DAC 0 INITIAL VALUE = INITIAL COMPILE ! 5871: * ! 5872: * GLOBAL VALUES DEFINING EXTENT OF STATIC AREA (ALOST) ! 5873: * ! 5874: STATB DAC 0 START OF STATIC AREA ! 5875: STATE DAC 0 END OF STATIC AREA ! 5876: EJC ! 5877: * ! 5878: * GLOBAL STACK POINTER ! 5879: * ! 5880: STBAS DAC 0 POINTER PAST STACK BASE ! 5881: * ! 5882: * WORK AREAS FOR STOPR ROUTINE ! 5883: * ! 5884: STPSI DIC +0 SAVE VALUE OF STCOUNT ! 5885: STPTI DIC +0 SAVE TIME ELAPSED ! 5886: * ! 5887: * GLOBAL VALUES FOR SETEXIT FUNCTION (S$STX) ! 5888: * ! 5889: STXOF DAC 0 FAILURE OFFSET ! 5890: STXVR DAC NULLS VRBLK POINTER OR NULL ! 5891: * ! 5892: * WORK AREAS FOR TFIND PROCEDURE ! 5893: * ! 5894: TFNSI DIC +0 NUMBER OF HEADERS ! 5895: * ! 5896: * GLOBAL VALUE FOR TIME KEEPING ! 5897: * ! 5898: TIMSX DIC +0 TIME AT START OF EXECUTION ! 5899: TIMUP DAC 0 SET WHEN TIME UP OCCURS ! 5900: * ! 5901: * WORK AREAS FOR XSCAN PROCEDURE ! 5902: * ! 5903: XSCRT DAC 0 SAVE RETURN CODE ! 5904: XSCWB DAC 0 SAVE REGISTER WB ! 5905: * ! 5906: * GLOBAL VALUES FOR XSCAN AND XSCNI PROCEDURES ! 5907: * ! 5908: XSOFS DAC 0 OFFSET TO CURRENT LOCATION IN R$XSC ! 5909: * ! 5910: * LABEL TO MARK END OF WORK AREA ! 5911: * ! 5912: YYYYY DAC 0 ! 5913: TTL S P I T B O L -- INITIALIZATION ! 5914: * ! 5915: * INITIALISATION ! 5916: * THE FOLLOWING SECTION RECEIVES CONTROL FROM THE SYSTEM ! 5917: * AT THE START OF A RUN WITH THE REGISTERS SET AS FOLLOWS. ! 5918: * ! 5919: * (XS) POINTS PAST STACK BASE ! 5920: * (XR) POINTS TO FIRST WORD OF DATA AREA ! 5921: * (XL) POINTS TO LAST WORD OF DATA AREA ! 5922: * ! 5923: SEC START OF PROGRAM SECTION ! 5924: JSR SYSTM INITIALISE TIMER ! 5925: * ! 5926: * INITIALISE WORK AREA (ESSENTIAL FOR BATCHED RUNS) ! 5927: * ! 5928: MOV XR,WB PRESERVE XR ! 5929: MOV =YYYYY,WA POINT TO END OF WORK AREA ! 5930: SUB =AAAAA,WA GET LENGTH OF WORK AREA ! 5931: BTW WA CONVERT TO WORDS ! 5932: LCT WA,WA COUNT FOR LOOP ! 5933: MOV =AAAAA,XR SET UP INDEX REGISTER ! 5934: * ! 5935: * CLEAR WORK SPACE ! 5936: * ! 5937: INI01 ZER (XR)+ CLEAR A WORD ! 5938: BCT WA,INI01 LOOP TILL DONE ! 5939: MOV =STNDO,WA UNDEFINED OPERATORS POINTER ! 5940: MOV =R$YYY,WC POINT TO TABLE END ! 5941: SUB =R$UBA,WC LENGTH OF UNDEF. OPERATORS TABLE ! 5942: BTW WC CONVERT TO WORDS ! 5943: LCT WC,WC LOOP COUNTER ! 5944: MOV =R$UBA,XR SET UP XR ! 5945: * ! 5946: * SET CORRECT VALUE INTO UNDEFINED OPERATORS TABLE ! 5947: * ! 5948: INI02 MOV WA,(XR)+ STORE VALUE ! 5949: BCT WC,INI02 LOOP TILL ALL DONE ! 5950: MOV =NUM01,WA GET A 1 ! 5951: MOV WA,CMPSN STATEMENT NO ! 5952: MOV WA,CSWFL NOFAIL ! 5953: MOV WA,CSWLS LIST ! 5954: MOV WA,KVINP INPUT ! 5955: MOV WA,KVOUP OUTPUT ! 5956: MOV WA,LSTPF NOTHING FOR LISTR YET ! 5957: MOV =INILN,WA INPUT IMAGE LENGTH ! 5958: MOV WA,CSWIN -IN72 ! 5959: MOV =B$KVT,DMPKB DUMP ! 5960: MOV =TRBKV,DMPKT DUMP ! 5961: MOV =P$LEN,EVLIN EVAL ! 5962: EJC ! 5963: MOV =NULLS,WA GET NULLSTRING POINTER ! 5964: MOV WA,KVRTN RETURN ! 5965: MOV WA,R$ETX ERRTEXT ! 5966: MOV WA,R$TTL TITLE FOR LISTING ! 5967: MOV WA,STXVR SETEXIT ! 5968: STI TIMSX STORE TIME IN CORRECT PLACE ! 5969: LDI STLIM GET DEFAULT STLIMIT ! 5970: STI KVSTL STATEMENT LIMIT ! 5971: STI KVSTC STATEMENT COUNT ! 5972: MOV WB,STATB STORE START ADRS OF STATIC ! 5973: MOV *E$SRS,RSMEM RESERVE MEMORY ! 5974: MOV XS,STBAS STORE STACK BASE ! 5975: SSS INISS SAVE S-R STACK PTR ! 5976: * ! 5977: * NOW CONVERT FREE STORE PERCENTAGE TO A SUITABLE FACTOR ! 5978: * FOR EASY TESTING IN ALLOC ROUTINE. ! 5979: * ! 5980: LDI INTVH GET 100 ! 5981: DVI ALFSP FORM 100 / ALFSP ! 5982: STI ALFSF STORE THE FACTOR ! 5983: * ! 5984: * INITIALIZE VALUES FOR REAL CONVERSION ROUTINE ! 5985: * ! 5986: LCT WB,=CFP$S LOAD COUNTER FOR SIGNIFICANT DIGITS ! 5987: LDR REAV1 LOAD 1.0 ! 5988: * ! 5989: * LOOP TO COMPUTE 10**(MAX NUMBER SIGNIFICANT DIGITS) ! 5990: * ! 5991: INI03 MLR REAVT * 10.0 ! 5992: BCT WB,INI03 LOOP TILL DONE ! 5993: STR GTSSC STORE 10**(MAX SIG DIGITS) ! 5994: LDR REAP5 LOAD 0.5 ! 5995: DVR GTSSC COMPUTE 0.5*10**(MAX SIG DIGITS) ! 5996: STR GTSRN STORE AS ROUNDING BIAS ! 5997: ZER WC SET TO READ PARAMETERS ! 5998: JSR PRPAR READ THEM ! 5999: EJC ! 6000: * ! 6001: * NOW COMPUTE STARTING ADDRESS FOR DYNAMIC STORE AND IF ! 6002: * NECESSARY REQUEST MORE MEMORY. ! 6003: * ! 6004: SUB *E$SRS,XL ALLOW FOR RESERVE MEMORY ! 6005: MOV PRLEN,WA GET PRINT BUFFER LENGTH ! 6006: ADD =CFP$A,WA ADD NO. OF CHARS IN ALPHABET ! 6007: ADD =NSTMX,WA ADD CHARS FOR GTSTG BFR ! 6008: CTB WA,8 CONVERT TO BYTES, ALLOWING A MARGIN ! 6009: MOV STATB,XR POINT TO STATIC BASE ! 6010: ADD WA,XR INCREMENT FOR ABOVE BUFFERS ! 6011: ADD *E$HNB,XR INCREMENT FOR HASH TABLE ! 6012: ADD *E$STS,XR BUMP FOR INITIAL STATIC BLOCK ! 6013: JSR SYSMX GET MXLEN ! 6014: MOV WA,KVMXL PROVISIONALLY STORE AS MAXLNGTH ! 6015: MOV WA,MXLEN AND AS MXLEN ! 6016: BGT XR,WA,INI06 SKIP IF STATIC HI EXCEEDS MXLEN ! 6017: MOV WA,XR USE MXLEN INSTEAD ! 6018: ICA XR MAKE BIGGER THAN MXLEN ! 6019: * ! 6020: * HERE TO STORE VALUES WHICH MARK INITIAL DIVISION ! 6021: * OF DATA AREA INTO STATIC AND DYNAMIC ! 6022: * ! 6023: INI06 MOV XR,DNAMB DYNAMIC BASE ADRS ! 6024: MOV XR,DNAMP DYNAMIC PTR ! 6025: BNZ WA,INI07 SKIP IF NON-ZERO MXLEN ! 6026: DCA XR POINT A WORD IN FRONT ! 6027: MOV XR,KVMXL USE AS MAXLNGTH ! 6028: MOV XR,MXLEN AND AS MXLEN ! 6029: EJC ! 6030: * ! 6031: * LOOP HERE IF NECESSARY TILL ENOUGH MEMORY OBTAINED ! 6032: * SO THAT DNAME IS ABOVE DNAMB ! 6033: * ! 6034: INI07 MOV XL,DNAME STORE DYNAMIC END ADDRESS ! 6035: BLT DNAMB,XL,INI09 SKIP IF HIGH ENOUGH ! 6036: JSR SYSMM REQUEST MORE MEMORY ! 6037: WTB XR GET AS BAUS (SGD05) ! 6038: ADD XR,XL BUMP BY AMOUNT OBTAINED ! 6039: BNZ XR,INI07 TRY AGAIN ! 6040: MOV =ENDMO,XR POINT TO FAILURE MESSAGE ! 6041: MOV ENDML,WA MESSAGE LENGTH ! 6042: JSR SYSPR PRINT IT (PRTST NOT YET USABLE) ! 6043: PPM SHOULD NOT FAIL ! 6044: JSR SYSEJ PACK UP (STOPR NOT YET USABLE) ! 6045: * ! 6046: * INITIALISE PRINT BUFFER WITH BLANK WORDS ! 6047: * ! 6048: INI09 MOV PRLEN,WC NO. OF CHARS IN PRINT BFR ! 6049: MOV STATB,XR POINT TO STATIC AGAIN ! 6050: MOV XR,PRBUF PRINT BFR IS PUT AT STATIC START ! 6051: MOV =B$SCL,(XR)+ STORE STRING TYPE CODE ! 6052: MOV WC,(XR)+ AND STRING LENGTH ! 6053: CTW WC,0 GET NUMBER OF WORDS IN BUFFER ! 6054: MOV WC,PRLNW STORE FOR BUFFER CLEAR ! 6055: LCT WC,WC WORDS TO CLEAR ! 6056: * ! 6057: * LOOP TO CLEAR BUFFER ! 6058: * ! 6059: INI10 MOV NULLW,(XR)+ STORE BLANK ! 6060: BCT WC,INI10 LOOP ! 6061: * ! 6062: * INITIALIZE NUMBER OF HASH HEADERS ! 6063: * ! 6064: MOV =E$HNB,WA GET NUMBER OF HASH HEADERS ! 6065: MTI WA CONVERT TO INTEGER ! 6066: STI HSHNB STORE FOR USE BY GTNVR PROCEDURE ! 6067: LCT WA,WA COUNTER FOR CLEARING HASH TABLE ! 6068: MOV XR,HSHTB POINTER TO HASH TABLE ! 6069: * ! 6070: * LOOP TO CLEAR HASH TABLE ! 6071: * ! 6072: INI11 ZER (XR)+ BLANK A WORD ! 6073: BCT WA,INI11 LOOP ! 6074: MOV XR,HSHTE END OF HASH TABLE ADRS IS KEPT ! 6075: * ! 6076: * ALLOCATE WORK AREA FOR GTSTG CONVERSION PROCEDURE ! 6077: * ! 6078: MOV =NSTMX,WA GET MAX NUM CHARS IN OUTPUT NUMBER ! 6079: CTB WA,SCSI$ NO OF BYTES NEEDED ! 6080: MOV XR,GTSWK STORE BFR ADRS ! 6081: ADD WA,XR BUMP FOR WORK BFR ! 6082: EJC ! 6083: * ! 6084: * BUILD ALPHABET STRING FOR ALPHABET KEYWORD AND REPLACE ! 6085: * ! 6086: MOV XR,KVALP SAVE ALPHABET POINTER ! 6087: MOV =B$SCL,(XR) STRING BLK TYPE ! 6088: MOV =CFP$A,WC NO OF CHARS IN ALPHABET ! 6089: MOV WC,SCLEN(XR) STORE AS STRING LENGTH ! 6090: MOV WC,WB COPY CHAR COUNT ! 6091: CTB WB,SCSI$ NO. OF BYTES NEEDED ! 6092: ADD XR,WB CURRENT END ADDRESS FOR STATIC ! 6093: MOV WB,STATE STORE STATIC END ADRS ! 6094: LCT WC,WC LOOP COUNTER ! 6095: PSC XR POINT TO CHARS OF STRING ! 6096: ZER WB SET INITIAL CHARACTER VALUE ! 6097: * ! 6098: * LOOP TO ENTER CHARACTER CODES IN ORDER ! 6099: * ! 6100: INI12 SCH WB,(XR)+ STORE NEXT CODE ! 6101: ICV WB BUMP CODE VALUE ! 6102: BCT WC,INI12 LOOP TILL ALL STORED ! 6103: CSC XR COMPLETE STORE CHARACTERS ! 6104: * ! 6105: * INITIALIZE VARIABLE BLOCKS FOR INPUT AND OUTPUT ! 6106: * ! 6107: MOV =V$INP,XL POINT TO STRING /INPUT/ ! 6108: MOV =TRTIN,WB TRBLK TYPE FOR INPUT ! 6109: JSR INOUT PERFORM INPUT ASSOCIATION ! 6110: MOV =V$OUP,XL POINT TO STRING /OUTPUT/ ! 6111: MOV =TRTOU,WB TRBLK TYPE FOR OUTPUT ! 6112: JSR INOUT PERFORM OUTPUT ASSOCIATION ! 6113: MOV INITR,WC TERMINAL FLAG ! 6114: BZE WC,INI13 SKIP IF NO TERMINAL ! 6115: JSR PRPAR ASSOCIATE TERMINAL ! 6116: EJC ! 6117: * ! 6118: * CHECK FOR EXPIRY DATE ! 6119: * ! 6120: INI13 JSR SYSDC CALL DATE CHECK ! 6121: MOV XS,FLPTR IN CASE STACK OVERFLOWS IN COMPILER ! 6122: * ! 6123: * NOW COMPILE SOURCE INPUT CODE ! 6124: * ! 6125: JSR CMPIL CALL COMPILER ! 6126: MOV XR,R$COD SET PTR TO FIRST CODE BLOCK ! 6127: MOV =NULLS,R$TTL FORGET TITLE (REG04) ! 6128: MOV =NULLS,R$STL FORGET SUB-TITLE (REG04) ! 6129: ZER R$CIM FORGET COMPILER INPUT IMAGE ! 6130: ZER XL CLEAR DUD VALUE ! 6131: ZER WB DONT SHIFT DYNAMIC STORE UP ! 6132: JSR GBCOL CLEAR GARBAGE LEFT FROM COMPILE ! 6133: BNZ CPSTS,INIX0 SKIP IF NO LISTING OF COMP STATS ! 6134: JSR PRTPG EJECT PAGE ! 6135: * ! 6136: * PRINT COMPILE STATISTICS ! 6137: * ! 6138: MOV DNAMP,WA NEXT AVAILABLE LOC ! 6139: SUB STATB,WA MINUS START ! 6140: BTW WA CONVERT TO WORDS ! 6141: MTI WA CONVERT TO INTEGER ! 6142: MOV =ENCM1,XR POINT TO /MEMORY USED (WORDS)/ ! 6143: JSR PRTMI PRINT MESSAGE ! 6144: MOV DNAME,WA END OF MEMORY ! 6145: SUB DNAMP,WA MINUS NEXT AVAILABLE LOC ! 6146: BTW WA CONVERT TO WORDS ! 6147: MTI WA CONVERT TO INTEGER ! 6148: MOV =ENCM2,XR POINT TO /MEMORY AVAILABLE (WORDS)/ ! 6149: JSR PRTMI PRINT LINE ! 6150: MTI CMERC GET COUNT OF ERRORS AS INTEGER ! 6151: MOV =ENCM3,XR POINT TO /COMPILE ERRORS/ ! 6152: JSR PRTMI PRINT IT ! 6153: MTI GBCNT GARBAGE COLLECTION COUNT ! 6154: SBI INTV1 ADJUST FOR UNAVOIDABLE COLLECT ! 6155: MOV =STPM5,XR POINT TO /STORAGE REGENERATIONS/ ! 6156: JSR PRTMI PRINT GBCOL COUNT ! 6157: JSR SYSTM GET TIME ! 6158: SBI TIMSX GET COMPILATION TIME ! 6159: MOV =ENCM4,XR POINT TO COMPILATION TIME (MSEC)/ ! 6160: JSR PRTMI PRINT MESSAGE ! 6161: ADD =NUM05,LSTLC BUMP LINE COUNT ! 6162: BZE HEADP,INIX0 NO EJECT IF NOTHING PRINTED (SDG11) ! 6163: JSR PRTPG EJECT PRINTER ! 6164: EJC ! 6165: * ! 6166: * PREPARE NOW TO START EXECUTION ! 6167: * ! 6168: * SET DEFAULT INPUT RECORD LENGTH ! 6169: * ! 6170: INIX0 BGT CSWIN,=INILN,INIX1 SKIP IF NOT DEFAULT -IN72 USED ! 6171: MOV =INILS,CSWIN ELSE USE DEFAULT RECORD LENGTH ! 6172: * ! 6173: * RESET TIMER ! 6174: * ! 6175: INIX1 JSR SYSTM GET TIME AGAIN ! 6176: STI TIMSX STORE FOR END RUN PROCESSING ! 6177: ADD CSWEX,NOXEQ ADD -NOEXECUTE FLAG ! 6178: BNZ NOXEQ,INIX2 JUMP IF EXECUTION SUPPRESSED ! 6179: ZER GBCNT INITIALISE COLLECT COUNT ! 6180: JSR SYSBX CALL BEFORE STARTING EXECUTION ! 6181: * ! 6182: * MERGE WHEN LISTING FILE SET FOR EXECUTION ! 6183: * ! 6184: INIY0 MNZ HEADP MARK HEADERS OUT REGARDLESS ! 6185: ZER -(XS) SET FAILURE LOCATION ON STACK ! 6186: MOV XS,FLPTR SAVE PTR TO FAILURE OFFSET WORD ! 6187: MOV R$COD,XR LOAD PTR TO ENTRY CODE BLOCK ! 6188: MOV =STGXT,STAGE SET STAGE FOR EXECUTE TIME ! 6189: MOV CMPSN,PFNTE COPY STMTS COMPILED COUNT IN CASE ! 6190: JSR SYSTM TIME YET AGAIN ! 6191: STI PFSTM ! 6192: BRI (XR) START XEQ WITH FIRST STATEMENT ! 6193: * ! 6194: * HERE IF EXECUTION IS SUPPRESSED ! 6195: * ! 6196: INIX2 JSR PRTNL PRINT A BLANK LINE ! 6197: MOV =ENCM5,XR POINT TO /EXECUTION SUPPRESSED/ ! 6198: JSR PRTST PRINT STRING ! 6199: JSR PRTNL OUTPUT LINE ! 6200: ZER WA SET ABEND VALUE TO ZERO ! 6201: MOV =NINI9,WB SET SPECIAL CODE VALUE ! 6202: JSR SYSEJ END OF JOB, EXIT TO SYSTEM ! 6203: TTL S P I T B O L -- SNOBOL4 OPERATOR ROUTINES ! 6204: * ! 6205: * THIS SECTION INCLUDES ALL ROUTINES WHICH CAN BE ACCESSED ! 6206: * DIRECTLY FROM THE GENERATED CODE EXCEPT SYSTEM FUNCTIONS. ! 6207: * ! 6208: * ALL ROUTINES IN THIS SECTION START WITH A LABEL OF THE ! 6209: * FORM O$XXX WHERE XXX IS THREE LETTERS. THE GENERATED CODE ! 6210: * CONTAINS A POINTER TO THE APPROPRIATE ENTRY LABEL. ! 6211: * ! 6212: * SINCE THE GENERAL FORM OF THE GENERATED CODE CONSISTS OF ! 6213: * POINTERS TO BLOCKS WHOSE FIRST WORD IS THE ADDRESS OF THE ! 6214: * ACTUAL ENTRY POINT LABEL (O$XXX). ! 6215: * ! 6216: * THESE ROUTINES ARE IN ALPHABETICAL ORDER BY THEIR ! 6217: * ENTRY LABEL NAMES (I.E. BY THE XXX OF THE O$XXX NAME) ! 6218: * ! 6219: * THESE ROUTINES RECEIVE CONTROL AS FOLLOWS ! 6220: * ! 6221: * (CP) POINTER TO NEXT CODE WORD ! 6222: * (XS) CURRENT STACK POINTER ! 6223: EJC ! 6224: * ! 6225: * BINARY PLUS (ADDITION) ! 6226: * ! 6227: O$ADD ENT ENTRY POINT ! 6228: JSR ARITH FETCH ARITHMETIC OPERANDS ! 6229: ERR 001,ADDITION LEFT OPERAND IS NOT NUMERIC ! 6230: ERR 002,ADDITION RIGHT OPERAND IS NOT NUMERIC ! 6231: PPM OADD1 JUMP IF REAL OPERANDS ! 6232: * ! 6233: * HERE TO ADD TWO INTEGERS ! 6234: * ! 6235: ADI ICVAL(XL) ADD RIGHT OPERAND TO LEFT ! 6236: INO EXINT RETURN INTEGER IF NO OVERFLOW ! 6237: ERB 003,ADDITION CAUSED INTEGER OVERFLOW ! 6238: * ! 6239: * HERE TO ADD TWO REALS ! 6240: * ! 6241: OADD1 ADR RCVAL(XL) ADD RIGHT OPERAND TO LEFT ! 6242: RNO EXREA RETURN REAL IF NO OVERFLOW ! 6243: ERB 261,ADDITION CAUSED REAL OVERFLOW ! 6244: EJC ! 6245: * ! 6246: * UNARY PLUS (AFFIRMATION) ! 6247: * ! 6248: O$AFF ENT ENTRY POINT ! 6249: MOV (XS)+,XR LOAD OPERAND ! 6250: JSR GTNUM CONVERT TO NUMERIC ! 6251: ERR 004,AFFIRMATION OPERAND IS NOT NUMERIC ! 6252: BRN EXIXR RETURN IF CONVERTED TO NUMERIC ! 6253: EJC ! 6254: * ! 6255: * BINARY BAR (ALTERNATION) ! 6256: * ! 6257: O$ALT ENT ENTRY POINT ! 6258: MOV (XS)+,XR LOAD RIGHT OPERAND ! 6259: JSR GTPAT CONVERT TO PATTERN ! 6260: ERR 005,ALTERNATION RIGHT OPERAND IS NOT PATTERN ! 6261: * ! 6262: * MERGE HERE FROM SPECIAL (LEFT ALTERNATION) CASE ! 6263: * ! 6264: OALT1 MOV =P$ALT,WB SET PCODE FOR ALTERNATIVE NODE ! 6265: JSR PBILD BUILD ALTERNATIVE NODE ! 6266: MOV XR,XL SAVE ADDRESS OF ALTERNATIVE NODE ! 6267: MOV (XS)+,XR LOAD LEFT OPERAND ! 6268: JSR GTPAT CONVERT TO PATTERN ! 6269: ERR 006,ALTERNATION LEFT OPERAND IS NOT PATTERN ! 6270: BEQ XR,=P$ALT,OALT2 JUMP IF LEFT ARG IS ALTERNATION ! 6271: MOV XR,PTHEN(XL) SET LEFT OPERAND AS SUCCESSOR ! 6272: MOV XL,XR MOVE RESULT TO PROPER REGISTER ! 6273: BRN EXIXR JUMP FOR NEXT CODE WORD ! 6274: * ! 6275: * COME HERE IF LEFT ARGUMENT IS ITSELF AN ALTERNATION ! 6276: * ! 6277: * THE RESULT IS MORE EFFICIENT IF WE MAKE THE REPLACEMENT ! 6278: * ! 6279: * (A / B) / C = A / (B / C) ! 6280: * ! 6281: OALT2 MOV PARM1(XR),PTHEN(XL) BUILD THE (B / C) NODE ! 6282: MOV PTHEN(XR),-(XS) SET A AS NEW LEFT ARG ! 6283: MOV XL,XR SET (B / C) AS NEW RIGHT ARG ! 6284: BRN OALT1 MERGE BACK TO BUILD A / (B / C) ! 6285: EJC ! 6286: * ! 6287: * ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY NAME) ! 6288: * ! 6289: O$AMN ENT ENTRY POINT ! 6290: LCW XR LOAD NUMBER OF SUBSCRIPTS ! 6291: MOV XR,WB SET FLAG FOR BY NAME ! 6292: BRN ARREF JUMP TO ARRAY REFERENCE ROUTINE ! 6293: EJC ! 6294: * ! 6295: * ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY VALUE) ! 6296: * ! 6297: O$AMV ENT ENTRY POINT ! 6298: LCW XR LOAD NUMBER OF SUBSCRIPTS ! 6299: ZER WB SET FLAG FOR BY VALUE ! 6300: BRN ARREF JUMP TO ARRAY REFERENCE ROUTINE ! 6301: EJC ! 6302: * ! 6303: * ARRAY REFERENCE (ONE SUBSCRIPT, BY NAME) ! 6304: * ! 6305: O$AON ENT ENTRY POINT ! 6306: MOV (XS),XR LOAD SUBSCRIPT VALUE ! 6307: MOV 1(XS),XL LOAD ARRAY VALUE ! 6308: MOV (XL),WA LOAD FIRST WORD OF ARRAY OPERAND ! 6309: BEQ WA,=B$VCT,OAON2 JUMP IF VECTOR REFERENCE ! 6310: BEQ WA,=B$TBT,OAON3 JUMP IF TABLE REFERENCE ! 6311: * ! 6312: * HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE ! 6313: * ! 6314: OAON1 MOV =NUM01,XR SET NUMBER OF SUBSCRIPTS TO ONE ! 6315: MOV XR,WB SET FLAG FOR BY NAME ! 6316: BRN ARREF JUMP TO ARRAY REFERENCE ROUTINE ! 6317: * ! 6318: * HERE IF WE HAVE A VECTOR REFERENCE ! 6319: * ! 6320: OAON2 BNE (XR),=B$ICL,OAON1 USE LONG ROUTINE IF NOT INTEGER ! 6321: LDI ICVAL(XR) LOAD INTEGER SUBSCRIPT VALUE ! 6322: MFI WA,EXFAL COPY AS ADDRESS INT, FAIL IF OVFLO ! 6323: BZE WA,EXFAL FAIL IF ZERO ! 6324: ADD =VCVLB,WA COMPUTE OFFSET IN WORDS ! 6325: WTB WA CONVERT TO BYTES ! 6326: MOV WA,(XS) COMPLETE NAME ON STACK ! 6327: BLT WA,VCLEN(XL),EXITS EXIT IF SUBSCRIPT NOT TOO LARGE ! 6328: BRN EXFAL ELSE FAIL ! 6329: * ! 6330: * HERE FOR TABLE REFERENCE ! 6331: * ! 6332: OAON3 MNZ WB SET FLAG FOR NAME REFERENCE ! 6333: JSR TFIND LOCATE/CREATE TABLE ELEMENT ! 6334: PPM EXFAL FAIL IF ACCESS FAILS ! 6335: MOV XL,1(XS) STORE NAME BASE ON STACK ! 6336: MOV WA,(XS) STORE NAME OFFSET ON STACK ! 6337: BRN EXITS EXIT WITH RESULT ON STACK ! 6338: EJC ! 6339: * ! 6340: * ARRAY REFERENCE (ONE SUBSCRIPT, BY VALUE) ! 6341: * ! 6342: O$AOV ENT ENTRY POINT ! 6343: MOV (XS)+,XR LOAD SUBSCRIPT VALUE ! 6344: MOV (XS)+,XL LOAD ARRAY VALUE ! 6345: MOV (XL),WA LOAD FIRST WORD OF ARRAY OPERAND ! 6346: BEQ WA,=B$VCT,OAOV2 JUMP IF VECTOR REFERENCE ! 6347: BEQ WA,=B$TBT,OAOV3 JUMP IF TABLE REFERENCE ! 6348: * ! 6349: * HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE ! 6350: * ! 6351: OAOV1 MOV XL,-(XS) RESTACK ARRAY VALUE ! 6352: MOV XR,-(XS) RESTACK SUBSCRIPT ! 6353: MOV =NUM01,XR SET NUMBER OF SUBSCRIPTS TO ONE ! 6354: ZER WB SET FLAG FOR VALUE CALL ! 6355: BRN ARREF JUMP TO ARRAY REFERENCE ROUTINE ! 6356: * ! 6357: * HERE IF WE HAVE A VECTOR REFERENCE ! 6358: * ! 6359: OAOV2 BNE (XR),=B$ICL,OAOV1 USE LONG ROUTINE IF NOT INTEGER ! 6360: LDI ICVAL(XR) LOAD INTEGER SUBSCRIPT VALUE ! 6361: MFI WA,EXFAL MOVE AS ONE WORD INT, FAIL IF OVFLO ! 6362: BZE WA,EXFAL FAIL IF ZERO ! 6363: ADD =VCVLB,WA COMPUTE OFFSET IN WORDS ! 6364: WTB WA CONVERT TO BYTES ! 6365: BGE WA,VCLEN(XL),EXFAL FAIL IF SUBSCRIPT TOO LARGE ! 6366: JSR ACESS ACCESS VALUE ! 6367: PPM EXFAL FAIL IF ACCESS FAILS ! 6368: BRN EXIXR ELSE RETURN VALUE TO CALLER ! 6369: * ! 6370: * HERE FOR TABLE REFERENCE BY VALUE ! 6371: * ! 6372: OAOV3 ZER WB SET FLAG FOR VALUE REFERENCE ! 6373: JSR TFIND CALL TABLE SEARCH ROUTINE ! 6374: PPM EXFAL FAIL IF ACCESS FAILS ! 6375: BRN EXIXR EXIT WITH RESULT IN XR ! 6376: EJC ! 6377: * ! 6378: * ASSIGNMENT ! 6379: * ! 6380: O$ASS ENT ENTRY POINT ! 6381: * ! 6382: * O$RPL (PATTERN REPLACEMENT) MERGES HERE ! 6383: * ! 6384: OASS0 MOV (XS)+,WB LOAD VALUE TO BE ASSIGNED ! 6385: MOV (XS)+,WA LOAD NAME OFFSET ! 6386: MOV (XS),XL LOAD NAME BASE ! 6387: MOV WB,(XS) STORE ASSIGNED VALUE AS RESULT ! 6388: JSR ASIGN PERFORM ASSIGNMENT ! 6389: PPM EXFAL FAIL IF ASSIGNMENT FAILS ! 6390: BRN EXITS EXIT WITH RESULT ON STACK ! 6391: EJC ! 6392: * ! 6393: * COMPILATION ERROR ! 6394: * ! 6395: O$CER ENT ENTRY POINT ! 6396: ERB 007,COMPILATION ERROR ENCOUNTERED DURING EXECUTION ! 6397: EJC ! 6398: * ! 6399: * UNARY AT (CURSOR ASSIGNMENT) ! 6400: * ! 6401: O$CAS ENT ENTRY POINT ! 6402: MOV (XS)+,WC LOAD NAME OFFSET (PARM2) ! 6403: MOV (XS)+,XR LOAD NAME BASE (PARM1) ! 6404: MOV =P$CAS,WB SET PCODE FOR CURSOR ASSIGNMENT ! 6405: JSR PBILD BUILD NODE ! 6406: BRN EXIXR JUMP FOR NEXT CODE WORD ! 6407: EJC ! 6408: * ! 6409: * CONCATENATION ! 6410: * ! 6411: O$CNC ENT ENTRY POINT ! 6412: MOV (XS),XR LOAD RIGHT ARGUMENT ! 6413: BEQ XR,=NULLS,OCNC3 JUMP IF RIGHT ARG IS NULL ! 6414: MOV 1(XS),XL LOAD LEFT ARGUMENT ! 6415: BEQ XL,=NULLS,OCNC4 JUMP IF LEFT ARGUMENT IS NULL ! 6416: MOV =B$SCL,WA GET CONSTANT TO TEST FOR STRING ! 6417: BNE WA,(XL),OCNC2 JUMP IF LEFT ARG NOT A STRING ! 6418: BNE WA,(XR),OCNC2 JUMP IF RIGHT ARG NOT A STRING ! 6419: * ! 6420: * MERGE HERE TO CONCATENATE TWO STRINGS ! 6421: * ! 6422: OCNC1 MOV SCLEN(XL),WA LOAD LEFT ARGUMENT LENGTH ! 6423: ADD SCLEN(XR),WA COMPUTE RESULT LENGTH ! 6424: JSR ALOCS ALLOCATE SCBLK FOR RESULT ! 6425: MOV XR,1(XS) STORE RESULT PTR OVER LEFT ARGUMENT ! 6426: PSC XR PREPARE TO STORE CHARS OF RESULT ! 6427: MOV SCLEN(XL),WA GET NUMBER OF CHARS IN LEFT ARG ! 6428: PLC XL PREPARE TO LOAD LEFT ARG CHARS ! 6429: MVC MOVE CHARACTERS OF LEFT ARGUMENT ! 6430: MOV (XS)+,XL LOAD RIGHT ARG POINTER, POP STACK ! 6431: MOV SCLEN(XL),WA LOAD NUMBER OF CHARS IN RIGHT ARG ! 6432: PLC XL PREPARE TO LOAD RIGHT ARG CHARS ! 6433: MVC MOVE CHARACTERS OF RIGHT ARGUMENT ! 6434: BRN EXITS EXIT WITH RESULT ON STACK ! 6435: * ! 6436: * COME HERE IF ARGUMENTS ARE NOT BOTH STRINGS ! 6437: * ! 6438: OCNC2 JSR GTSTG CONVERT RIGHT ARG TO STRING ! 6439: PPM OCNC5 JUMP IF RIGHT ARG IS NOT STRING ! 6440: MOV XR,XL SAVE RIGHT ARG PTR ! 6441: JSR GTSTG CONVERT LEFT ARG TO STRING ! 6442: PPM OCNC6 JUMP IF LEFT ARG IS NOT A STRING ! 6443: MOV XR,-(XS) STACK LEFT ARGUMENT ! 6444: MOV XL,-(XS) STACK RIGHT ARGUMENT ! 6445: MOV XR,XL MOVE LEFT ARG TO PROPER REG ! 6446: MOV (XS),XR MOVE RIGHT ARG TO PROPER REG ! 6447: BRN OCNC1 MERGE BACK TO CONCATENATE STRINGS ! 6448: EJC ! 6449: * ! 6450: * CONCATENATION (CONTINUED) ! 6451: * ! 6452: * COME HERE FOR NULL RIGHT ARGUMENT ! 6453: * ! 6454: OCNC3 ICA XS REMOVE RIGHT ARG FROM STACK ! 6455: BRN EXITS RETURN WITH LEFT ARGUMENT ON STACK ! 6456: * ! 6457: * HERE FOR NULL LEFT ARGUMENT ! 6458: * ! 6459: OCNC4 ICA XS UNSTACK ONE ARGUMENT ! 6460: MOV XR,(XS) STORE RIGHT ARGUMENT ! 6461: BRN EXITS EXIT WITH RESULT ON STACK ! 6462: * ! 6463: * HERE IF RIGHT ARGUMENT IS NOT A STRING ! 6464: * ! 6465: OCNC5 MOV XR,XL MOVE RIGHT ARGUMENT PTR ! 6466: MOV (XS)+,XR LOAD LEFT ARG POINTER ! 6467: * ! 6468: * MERGE HERE WHEN LEFT ARGUMENT IS NOT A STRING ! 6469: * ! 6470: OCNC6 JSR GTPAT CONVERT LEFT ARG TO PATTERN ! 6471: ERR 008,CONCATENATION LEFT OPND IS NOT STRING OR PATTERN ! 6472: MOV XR,-(XS) SAVE RESULT ON STACK ! 6473: MOV XL,XR POINT TO RIGHT OPERAND ! 6474: JSR GTPAT CONVERT TO PATTERN ! 6475: ERR 009,CONCATENATION RIGHT OPD IS NOT STRING OR PATTERN ! 6476: MOV XR,XL MOVE FOR PCONC ! 6477: MOV (XS)+,XR RELOAD LEFT OPERAND PTR ! 6478: JSR PCONC CONCATENATE PATTERNS ! 6479: BRN EXIXR EXIT WITH RESULT IN XR ! 6480: EJC ! 6481: * ! 6482: * COMPLEMENTATION ! 6483: * ! 6484: O$COM ENT ENTRY POINT ! 6485: MOV (XS)+,XR LOAD OPERAND ! 6486: MOV (XR),WA LOAD TYPE WORD ! 6487: * ! 6488: * MERGE BACK HERE AFTER CONVERSION ! 6489: * ! 6490: OCOM1 BEQ WA,=B$ICL,OCOM2 JUMP IF INTEGER ! 6491: BEQ WA,=B$RCL,OCOM3 JUMP IF REAL ! 6492: JSR GTNUM ELSE CONVERT TO NUMERIC ! 6493: ERR 010,COMPLEMENTATION OPERAND IS NOT NUMERIC ! 6494: BRN OCOM1 BACK TO CHECK CASES ! 6495: * ! 6496: * HERE TO COMPLEMENT INTEGER ! 6497: * ! 6498: OCOM2 LDI ICVAL(XR) LOAD INTEGER VALUE ! 6499: NGI NEGATE ! 6500: INO EXINT RETURN INTEGER IF NO OVERFLOW ! 6501: ERB 011,COMPLEMENTATION CAUSED INTEGER OVERFLOW ! 6502: * ! 6503: * HERE TO COMPLEMENT REAL ! 6504: * ! 6505: OCOM3 LDR RCVAL(XR) LOAD REAL VALUE ! 6506: NGR NEGATE ! 6507: BRN EXREA RETURN REAL RESULT ! 6508: EJC ! 6509: * ! 6510: * BINARY SLASH (DIVISION) ! 6511: * ! 6512: O$DVD ENT ENTRY POINT ! 6513: JSR ARITH FETCH ARITHMETIC OPERANDS ! 6514: ERR 012,DIVISION LEFT OPERAND IS NOT NUMERIC ! 6515: ERR 013,DIVISION RIGHT OPERAND IS NOT NUMERIC ! 6516: PPM ODVD2 JUMP IF REAL OPERANDS ! 6517: * ! 6518: * HERE TO DIVIDE TWO INTEGERS ! 6519: * ! 6520: DVI ICVAL(XL) DIVIDE LEFT OPERAND BY RIGHT ! 6521: INO EXINT RESULT OK IF NO OVERFLOW ! 6522: ERB 014,DIVISION CAUSED INTEGER OVERFLOW ! 6523: * ! 6524: * HERE TO DIVIDE TWO REALS ! 6525: * ! 6526: ODVD2 DVR RCVAL(XL) DIVIDE LEFT OPERAND BY RIGHT ! 6527: RNO EXREA RETURN REAL IF NO OVERFLOW ! 6528: ERB 262,DIVISION CAUSED REAL OVERFLOW ! 6529: EJC ! 6530: * ! 6531: * EXPONENTIATION ! 6532: * ! 6533: O$EXP ENT ENTRY POINT ! 6534: MOV (XS)+,XR LOAD EXPONENT ! 6535: JSR GTNUM CONVERT TO NUMBER ! 6536: ERR 015,EXPONENTIATION RIGHT OPERAND IS NOT NUMERIC ! 6537: BNE WA,=B$ICL,OEXP7 JUMP IF REAL ! 6538: MOV XR,XL MOVE EXPONENT ! 6539: MOV (XS)+,XR LOAD BASE ! 6540: JSR GTNUM CONVERT TO NUMERIC ! 6541: ERR 016,EXPONENTIATION LEFT OPERAND IS NOT NUMERIC ! 6542: LDI ICVAL(XL) LOAD EXPONENT ! 6543: ILT OEXP8 ERROR IF NEGATIVE EXPONENT ! 6544: BEQ WA,=B$RCL,OEXP3 JUMP IF BASE IS REAL ! 6545: * ! 6546: * HERE TO EXPONENTIATE AN INTEGER ! 6547: * ! 6548: MFI WA,OEXP2 CONVERT EXPONENT TO 1 WORD INTEGER ! 6549: LCT WA,WA SET LOOP COUNTER ! 6550: LDI INTV1 LOAD INITIAL VALUE OF 1 ! 6551: BNZ WA,OEXP1 JUMP IF NON-ZERO EXPONENT ! 6552: INE EXINT GIVE ZERO AS RESULT FOR NONZERO**0 ! 6553: BRN OEXP4 ELSE ERROR OF 0**0 ! 6554: * ! 6555: * LOOP TO PERFORM EXPONENTIATION ! 6556: * ! 6557: OEXP1 MLI ICVAL(XR) MULTIPLY BY BASE ! 6558: IOV OEXP2 JUMP IF OVERFLOW ! 6559: BCT WA,OEXP1 LOOP BACK TILL COMPUTATION COMPLETE ! 6560: BRN EXINT THEN RETURN INTEGER RESULT ! 6561: * ! 6562: * HERE IF INTEGER OVERFLOW ! 6563: * ! 6564: OEXP2 ERB 017,EXPONENTIATION CAUSED INTEGER OVERFLOW ! 6565: EJC ! 6566: * ! 6567: * EXPONENTIATION (CONTINUED) ! 6568: * ! 6569: * HERE TO EXPONENTIATE A REAL ! 6570: * ! 6571: OEXP3 MFI WA,OEXP6 CONVERT EXPONENT TO ONE WORD ! 6572: LCT WA,WA SET LOOP COUNTER ! 6573: LDR REAV1 LOAD 1.0 AS INITIAL VALUE ! 6574: BNZ WA,OEXP5 JUMP IF NON-ZERO EXPONENT ! 6575: RNE EXREA RETURN 1.0 IF NONZERO**ZERO ! 6576: * ! 6577: * HERE FOR ERROR OF 0**0 OR 0.0**0 ! 6578: * ! 6579: OEXP4 ERB 018,EXPONENTIATION RESULT IS UNDEFINED ! 6580: * ! 6581: * LOOP TO PERFORM EXPONENTIATION ! 6582: * ! 6583: OEXP5 MLR RCVAL(XR) MULTIPLY BY BASE ! 6584: ROV OEXP6 JUMP IF OVERFLOW ! 6585: BCT WA,OEXP5 LOOP TILL COMPUTATION COMPLETE ! 6586: BRN EXREA THEN RETURN REAL RESULT ! 6587: * ! 6588: * HERE IF REAL OVERFLOW ! 6589: * ! 6590: OEXP6 ERB 266,EXPONENTIATION CAUSED REAL OVERFLOW ! 6591: * ! 6592: * HERE IF REAL EXPONENT ! 6593: * ! 6594: OEXP7 ERB 267,EXPONENTIATION RIGHT OPERAND IS REAL NOT INTEGER ! 6595: * ! 6596: * HERE FOR NEGATIVE EXPONENT ! 6597: * ! 6598: OEXP8 ERB 019,EXPONENTIATION RIGHT OPERAND IS NEGATIVE ! 6599: EJC ! 6600: * ! 6601: * FAILURE IN EXPRESSION EVALUATION ! 6602: * ! 6603: * THIS ENTRY POINT IS USED IF THE EVALUATION OF AN ! 6604: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, FAILS. ! 6605: * CONTROL IS RETURNED TO AN APPROPRIATE POINT IN EVALX. ! 6606: * ! 6607: O$FEX ENT ENTRY POINT ! 6608: BRN EVLX6 JUMP TO FAILURE LOC IN EVALX ! 6609: EJC ! 6610: * ! 6611: * FAILURE DURING EVALUATION OF A COMPLEX OR DIRECT GOTO ! 6612: * ! 6613: O$FIF ENT ENTRY POINT ! 6614: ERB 020,GOTO EVALUATION FAILURE ! 6615: EJC ! 6616: * ! 6617: * FUNCTION CALL (MORE THAN ONE ARGUMENT) ! 6618: * ! 6619: O$FNC ENT ENTRY POINT ! 6620: LCW WA LOAD NUMBER OF ARGUMENTS ! 6621: LCW XR LOAD FUNCTION VRBLK POINTER ! 6622: MOV VRFNC(XR),XL LOAD FUNCTION POINTER ! 6623: BNE WA,FARGS(XL),CFUNC USE CENTRAL ROUTINE IF WRONG NUM ! 6624: BRI (XL) JUMP TO FUNCTION IF ARG COUNT OK ! 6625: EJC ! 6626: * ! 6627: * FUNCTION NAME ERROR ! 6628: * ! 6629: O$FNE ENT ENTRY POINT ! 6630: LCW WA GET NEXT CODE WORD ! 6631: BNE WA,=ORNM$,OFNE1 FAIL IF NOT EVALUATING EXPRESSION ! 6632: BZE 2(XS),EVLX3 OK IF EXPR. WAS WANTED BY VALUE ! 6633: * ! 6634: * HERE FOR ERROR ! 6635: * ! 6636: OFNE1 ERB 021,FUNCTION CALLED BY NAME RETURNED A VALUE ! 6637: EJC ! 6638: * ! 6639: * FUNCTION CALL (SINGLE ARGUMENT) ! 6640: * ! 6641: O$FNS ENT ENTRY POINT ! 6642: LCW XR LOAD FUNCTION VRBLK POINTER ! 6643: MOV =NUM01,WA SET NUMBER OF ARGUMENTS TO ONE ! 6644: MOV VRFNC(XR),XL LOAD FUNCTION POINTER ! 6645: BNE WA,FARGS(XL),CFUNC USE CENTRAL ROUTINE IF WRONG NUM ! 6646: BRI (XL) JUMP TO FUNCTION IF ARG COUNT OK ! 6647: EJC ! 6648: * CALL TO UNDEFINED FUNCTION ! 6649: * ! 6650: O$FUN ENT ENTRY POINT ! 6651: ERB 022,UNDEFINED FUNCTION CALLED ! 6652: EJC ! 6653: * ! 6654: * EXECUTE COMPLEX GOTO ! 6655: * ! 6656: O$GOC ENT ENTRY POINT ! 6657: MOV 1(XS),XR LOAD NAME BASE POINTER ! 6658: BHI XR,STATE,OGOC1 JUMP IF NOT NATURAL VARIABLE ! 6659: ADD *VRTRA,XR ELSE POINT TO VRTRA FIELD ! 6660: BRI (XR) AND JUMP THROUGH IT ! 6661: * ! 6662: * HERE IF GOTO OPERAND IS NOT NATURAL VARIABLE ! 6663: * ! 6664: OGOC1 ERB 023,GOTO OPERAND IS NOT A NATURAL VARIABLE ! 6665: EJC ! 6666: * ! 6667: * EXECUTE DIRECT GOTO ! 6668: * ! 6669: O$GOD ENT ENTRY POINT ! 6670: MOV (XS),XR LOAD OPERAND ! 6671: MOV (XR),WA LOAD FIRST WORD ! 6672: BEQ WA,=B$CDS,BCDS0 JUMP IF CODE BLOCK TO CODE ROUTINE ! 6673: BEQ WA,=B$CDC,BCDC0 JUMP IF CODE BLOCK TO CODE ROUTINE ! 6674: ERB 024,GOTO OPERAND IN DIRECT GOTO IS NOT CODE ! 6675: EJC ! 6676: * ! 6677: * SET GOTO FAILURE TRAP ! 6678: * ! 6679: * THIS ROUTINE IS EXECUTED AT THE START OF A COMPLEX OR ! 6680: * DIRECT FAILURE GOTO TO TRAP A SUBSEQUENT FAIL (SEE EXFAL) ! 6681: * ! 6682: O$GOF ENT ENTRY POINT ! 6683: MOV FLPTR,XR POINT TO FAIL OFFSET ON STACK ! 6684: ICA (XR) POINT FAILURE TO O$FIF WORD ! 6685: ICP POINT TO NEXT CODE WORD ! 6686: BRN EXITS EXIT TO CONTINUE ! 6687: EJC ! 6688: * ! 6689: * BINARY DOLLAR (IMMEDIATE ASSIGNMENT) ! 6690: * ! 6691: * THE PATTERN BUILT BY BINARY DOLLAR IS A COMPOUND PATTERN. ! 6692: * SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR ! 6693: * DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED. ! 6694: * ! 6695: O$IMA ENT ENTRY POINT ! 6696: MOV =P$IMC,WB SET PCODE FOR LAST NODE ! 6697: MOV (XS)+,WC POP NAME OFFSET (PARM2) ! 6698: MOV (XS)+,XR POP NAME BASE (PARM1) ! 6699: JSR PBILD BUILD P$IMC NODE ! 6700: MOV XR,XL SAVE PTR TO NODE ! 6701: MOV (XS),XR LOAD LEFT ARGUMENT ! 6702: JSR GTPAT CONVERT TO PATTERN ! 6703: ERR 025,IMMEDIATE ASSIGNMENT LEFT OPERAND IS NOT PATTERN ! 6704: MOV XR,(XS) SAVE PTR TO LEFT OPERAND PATTERN ! 6705: MOV =P$IMA,WB SET PCODE FOR FIRST NODE ! 6706: JSR PBILD BUILD P$IMA NODE ! 6707: MOV (XS)+,PTHEN(XR) SET LEFT OPERAND AS P$IMA SUCCESSOR ! 6708: JSR PCONC CONCATENATE TO FORM FINAL PATTERN ! 6709: BRN EXIXR ALL DONE ! 6710: EJC ! 6711: * ! 6712: * INDIRECTION (BY NAME) ! 6713: * ! 6714: O$INN ENT ENTRY POINT ! 6715: MNZ WB SET FLAG FOR RESULT BY NAME ! 6716: BRN INDIR JUMP TO COMMON ROUTINE ! 6717: EJC ! 6718: * ! 6719: * INTERROGATION ! 6720: * ! 6721: O$INT ENT ENTRY POINT ! 6722: MOV =NULLS,(XS) REPLACE OPERAND WITH NULL ! 6723: BRN EXITS EXIT FOR NEXT CODE WORD ! 6724: EJC ! 6725: * ! 6726: * INDIRECTION (BY VALUE) ! 6727: * ! 6728: O$INV ENT ENTRY POINT ! 6729: ZER WB SET FLAG FOR BY VALUE ! 6730: BRN INDIR JUMP TO COMMON ROUTINE ! 6731: EJC ! 6732: * ! 6733: * KEYWORD REFERENCE (BY NAME) ! 6734: * ! 6735: O$KWN ENT ENTRY POINT ! 6736: JSR KWNAM GET KEYWORD NAME ! 6737: BRN EXNAM EXIT WITH RESULT NAME ! 6738: EJC ! 6739: * ! 6740: * KEYWORD REFERENCE (BY VALUE) ! 6741: * ! 6742: O$KWV ENT ENTRY POINT ! 6743: JSR KWNAM GET KEYWORD NAME ! 6744: MOV XR,DNAMP DELETE KVBLK ! 6745: JSR ACESS ACCESS VALUE ! 6746: PPM EXNUL DUMMY (UNUSED) FAILURE RETURN ! 6747: BRN EXIXR JUMP WITH VALUE IN XR ! 6748: EJC ! 6749: * ! 6750: * LOAD EXPRESSION BY NAME ! 6751: * ! 6752: O$LEX ENT ENTRY POINT ! 6753: MOV *EVSI$,WA SET SIZE OF EVBLK ! 6754: JSR ALLOC ALLOCATE SPACE FOR EVBLK ! 6755: MOV =B$EVT,(XR) SET TYPE WORD ! 6756: MOV =TRBEV,EVVAR(XR) SET DUMMY TRBLK POINTER ! 6757: LCW WA LOAD EXBLK POINTER ! 6758: MOV WA,EVEXP(XR) SET EXBLK POINTER ! 6759: MOV XR,XL MOVE NAME BASE TO PROPER REG ! 6760: MOV *EVVAR,WA SET NAME OFFSET = ZERO ! 6761: BRN EXNAM EXIT WITH NAME IN (XL,WA) ! 6762: EJC ! 6763: * ! 6764: * LOAD PATTERN VALUE ! 6765: * ! 6766: O$LPT ENT ENTRY POINT ! 6767: LCW XR LOAD PATTERN POINTER ! 6768: BRN EXIXR STACK PTR AND OBEY NEXT CODE WORD ! 6769: EJC ! 6770: * ! 6771: * LOAD VARIABLE NAME ! 6772: * ! 6773: O$LVN ENT ENTRY POINT ! 6774: LCW WA LOAD VRBLK POINTER ! 6775: MOV WA,-(XS) STACK VRBLK PTR (NAME BASE) ! 6776: MOV *VRVAL,-(XS) STACK NAME OFFSET ! 6777: BRN EXITS EXIT WITH RESULT ON STACK ! 6778: EJC ! 6779: * ! 6780: * BINARY ASTERISK (MULTIPLICATION) ! 6781: * ! 6782: O$MLT ENT ENTRY POINT ! 6783: JSR ARITH FETCH ARITHMETIC OPERANDS ! 6784: ERR 026,MULTIPLICATION LEFT OPERAND IS NOT NUMERIC ! 6785: ERR 027,MULTIPLICATION RIGHT OPERAND IS NOT NUMERIC ! 6786: PPM OMLT1 JUMP IF REAL OPERANDS ! 6787: * ! 6788: * HERE TO MULTIPLY TWO INTEGERS ! 6789: * ! 6790: MLI ICVAL(XL) MULTIPLY LEFT OPERAND BY RIGHT ! 6791: INO EXINT RETURN INTEGER IF NO OVERFLOW ! 6792: ERB 028,MULTIPLICATION CAUSED INTEGER OVERFLOW ! 6793: * ! 6794: * HERE TO MULTIPLY TWO REALS ! 6795: * ! 6796: OMLT1 MLR RCVAL(XL) MULTIPLY LEFT OPERAND BY RIGHT ! 6797: RNO EXREA RETURN REAL IF NO OVERFLOW ! 6798: ERB 263,MULTIPLICATION CAUSED REAL OVERFLOW ! 6799: EJC ! 6800: * ! 6801: * NAME REFERENCE ! 6802: * ! 6803: O$NAM ENT ENTRY POINT ! 6804: MOV *NMSI$,WA SET LENGTH OF NMBLK ! 6805: JSR ALLOC ALLOCATE NMBLK ! 6806: MOV =B$NML,(XR) SET NAME BLOCK CODE ! 6807: MOV (XS)+,NMOFS(XR) SET NAME OFFSET FROM OPERAND ! 6808: MOV (XS)+,NMBAS(XR) SET NAME BASE FROM OPERAND ! 6809: BRN EXIXR EXIT WITH RESULT IN XR ! 6810: EJC ! 6811: * ! 6812: * NEGATION ! 6813: * ! 6814: * INITIAL ENTRY ! 6815: * ! 6816: O$NTA ENT ENTRY POINT ! 6817: LCW WA LOAD NEW FAILURE OFFSET ! 6818: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER ! 6819: MOV WA,-(XS) STACK NEW FAILURE OFFSET ! 6820: MOV XS,FLPTR SET NEW FAILURE POINTER ! 6821: BRN EXITS JUMP TO CONTINUE EXECUTION ! 6822: * ! 6823: * ENTRY AFTER SUCCESSFUL EVALUATION OF OPERAND ! 6824: * ! 6825: O$NTB ENT ENTRY POINT ! 6826: MOV 2(XS),FLPTR RESTORE OLD FAILURE POINTER ! 6827: BRN EXFAL AND FAIL ! 6828: * ! 6829: * ENTRY FOR FAILURE DURING OPERAND EVALUATION ! 6830: * ! 6831: O$NTC ENT ENTRY POINT ! 6832: ICA XS POP FAILURE OFFSET ! 6833: MOV (XS)+,FLPTR RESTORE OLD FAILURE POINTER ! 6834: BRN EXNUL EXIT GIVING NULL RESULT ! 6835: EJC ! 6836: * ! 6837: * USE OF UNDEFINED OPERATOR ! 6838: * ! 6839: O$OUN ENT ENTRY POINT ! 6840: ERB 029,UNDEFINED OPERATOR REFERENCED ! 6841: EJC ! 6842: * ! 6843: * BINARY DOT (PATTERN ASSIGNMENT) ! 6844: * ! 6845: * THE PATTERN BUILT BY BINARY DOT IS A COMPOUND PATTERN. ! 6846: * SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR ! 6847: * DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED. ! 6848: * ! 6849: O$PAS ENT ENTRY POINT ! 6850: MOV =P$PAC,WB LOAD PCODE FOR P$PAC NODE ! 6851: MOV (XS)+,WC LOAD NAME OFFSET (PARM2) ! 6852: MOV (XS)+,XR LOAD NAME BASE (PARM1) ! 6853: JSR PBILD BUILD P$PAC NODE ! 6854: MOV XR,XL SAVE PTR TO NODE ! 6855: MOV (XS),XR LOAD LEFT OPERAND ! 6856: JSR GTPAT CONVERT TO PATTERN ! 6857: ERR 030,PATTERN ASSIGNMENT LEFT OPERAND IS NOT PATTERN ! 6858: MOV XR,(XS) SAVE PTR TO LEFT OPERAND PATTERN ! 6859: MOV =P$PAA,WB SET PCODE FOR P$PAA NODE ! 6860: JSR PBILD BUILD P$PAA NODE ! 6861: MOV (XS)+,PTHEN(XR) SET LEFT OPERAND AS P$PAA SUCCESSOR ! 6862: JSR PCONC CONCATENATE TO FORM FINAL PATTERN ! 6863: BRN EXIXR JUMP FOR NEXT CODE WORD ! 6864: EJC ! 6865: * ! 6866: * PATTERN MATCH (BY NAME, FOR REPLACEMENT) ! 6867: * ! 6868: O$PMN ENT ENTRY POINT ! 6869: ZER WB SET TYPE CODE FOR MATCH BY NAME ! 6870: BRN MATCH JUMP TO ROUTINE TO START MATCH ! 6871: EJC ! 6872: * ! 6873: * PATTERN MATCH (STATEMENT) ! 6874: * ! 6875: * O$PMS IS USED IN PLACE OF O$PMV WHEN THE PATTERN MATCH ! 6876: * OCCURS AT THE OUTER (STATEMENT) LEVEL SINCE IN THIS ! 6877: * CASE THE SUBSTRING VALUE NEED NOT BE CONSTRUCTED. ! 6878: * ! 6879: O$PMS ENT ENTRY POINT ! 6880: MOV =NUM02,WB SET FLAG FOR STATEMENT TO MATCH ! 6881: BRN MATCH JUMP TO ROUTINE TO START MATCH ! 6882: EJC ! 6883: * ! 6884: * PATTERN MATCH (BY VALUE) ! 6885: * ! 6886: O$PMV ENT ENTRY POINT ! 6887: MOV =NUM01,WB SET TYPE CODE FOR VALUE MATCH ! 6888: BRN MATCH JUMP TO ROUTINE TO START MATCH ! 6889: EJC ! 6890: * ! 6891: * POP TOP ITEM ON STACK ! 6892: * ! 6893: O$POP ENT ENTRY POINT ! 6894: ICA XS POP TOP STACK ENTRY ! 6895: BRN EXITS OBEY NEXT CODE WORD ! 6896: EJC ! 6897: * ! 6898: * TERMINATE EXECUTION (CODE COMPILED FOR END STATEMENT) ! 6899: * ! 6900: O$STP ENT ENTRY POINT ! 6901: BRN LEND0 JUMP TO END CIRCUIT ! 6902: EJC ! 6903: * ! 6904: * RETURN NAME FROM EXPRESSION ! 6905: * THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN ! 6906: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS ! 6907: * A NAME. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX. ! 6908: * ! 6909: O$RNM ENT ENTRY POINT ! 6910: BRN EVLX4 RETURN TO EVALX PROCEDURE ! 6911: EJC ! 6912: * ! 6913: * PATTERN REPLACEMENT ! 6914: * ! 6915: * WHEN THIS ROUTINE GETS CONTROL, THE FOLLOWING STACK ! 6916: * ENTRIES HAVE BEEN MADE (SEE END OF MATCH ROUTINE P$NTH) ! 6917: * ! 6918: * SUBJECT NAME BASE ! 6919: * SUBJECT NAME OFFSET ! 6920: * INITIAL CURSOR VALUE ! 6921: * FINAL CURSOR VALUE ! 6922: * SUBJECT POINTER ! 6923: * (XS) ---------------- REPLACEMENT VALUE ! 6924: * ! 6925: O$RPL ENT ENTRY POINT ! 6926: JSR GTSTG CONVERT REPLACEMENT VAL TO STRING ! 6927: ERR 031,PATTERN REPLACEMENT RIGHT OPERAND IS NOT STRING ! 6928: * ! 6929: * GET RESULT LENGTH AND ALLOCATE RESULT SCBLK ! 6930: * ! 6931: MOV (XS),XL LOAD SUBJECT STRING POINTER ! 6932: BEQ (XL),=B$BCT,ORPL4 BRANCH IF BUFFER ASSIGNMENT ! 6933: ADD SCLEN(XL),WA ADD SUBJECT STRING LENGTH ! 6934: ADD 2(XS),WA ADD STARTING CURSOR ! 6935: SUB 1(XS),WA MINUS FINAL CURSOR = TOTAL LENGTH ! 6936: BZE WA,ORPL3 JUMP IF RESULT IS NULL ! 6937: MOV XR,-(XS) RESTACK REPLACEMENT STRING ! 6938: JSR ALOCS ALLOCATE SCBLK FOR RESULT ! 6939: MOV 3(XS),WA GET INITIAL CURSOR (PART 1 LEN) ! 6940: MOV XR,3(XS) STACK RESULT POINTER ! 6941: PSC XR POINT TO CHARACTERS OF RESULT ! 6942: * ! 6943: * MOVE PART 1 (START OF SUBJECT) TO RESULT ! 6944: * ! 6945: BZE WA,ORPL1 JUMP IF FIRST PART IS NULL ! 6946: MOV 1(XS),XL ELSE POINT TO SUBJECT STRING ! 6947: PLC XL POINT TO SUBJECT STRING CHARS ! 6948: MVC MOVE FIRST PART TO RESULT ! 6949: EJC ! 6950: * PATTERN REPLACEMENT (CONTINUED) ! 6951: * ! 6952: * NOW MOVE IN REPLACEMENT VALUE ! 6953: * ! 6954: ORPL1 MOV (XS)+,XL LOAD REPLACEMENT STRING, POP ! 6955: MOV SCLEN(XL),WA LOAD LENGTH ! 6956: BZE WA,ORPL2 JUMP IF NULL REPLACEMENT ! 6957: PLC XL ELSE POINT TO CHARS OF REPLACEMENT ! 6958: MVC MOVE IN CHARS (PART 2) ! 6959: * ! 6960: * NOW MOVE IN REMAINDER OF STRING (PART 3) ! 6961: * ! 6962: ORPL2 MOV (XS)+,XL LOAD SUBJECT STRING POINTER, POP ! 6963: MOV (XS)+,WC LOAD FINAL CURSOR, POP ! 6964: MOV SCLEN(XL),WA LOAD SUBJECT STRING LENGTH ! 6965: SUB WC,WA MINUS FINAL CURSOR = PART 3 LENGTH ! 6966: BZE WA,OASS0 JUMP TO ASSIGN IF PART 3 IS NULL ! 6967: PLC XL,WC ELSE POINT TO LAST PART OF STRING ! 6968: MVC MOVE PART 3 TO RESULT ! 6969: BRN OASS0 JUMP TO PERFORM ASSIGNMENT ! 6970: * ! 6971: * HERE IF RESULT IS NULL ! 6972: * ! 6973: ORPL3 ADD *NUM02,XS POP SUBJECT STR PTR, FINAL CURSOR ! 6974: MOV =NULLS,(XS) SET NULL RESULT ! 6975: BRN OASS0 JUMP TO ASSIGN NULL VALUE ! 6976: * ! 6977: * HERE FOR BUFFER SUBSTRING ASSIGNMENT ! 6978: * ! 6979: ORPL4 MOV XR,XL COPY SCBLK REPLACEMENT PTR ! 6980: MOV (XS)+,XR UNSTACK BCBLK PTR ! 6981: MOV (XS)+,WB GET FINAL CURSOR VALUE ! 6982: MOV (XS)+,WA GET INITIAL CURSOR ! 6983: SUB WA,WB GET LENGTH IN WB ! 6984: ADD *NUM02,XS GET RID OF NAME BASE/OFFSET ! 6985: JSR INSBF INSERT SUBSTRING ! 6986: PPM CONVERT FAIL IMPOSSIBLE ! 6987: PPM EXFAL FAIL IF INSERT FAILS ! 6988: BRN EXNUL ELSE NULL RESULT ! 6989: EJC ! 6990: * ! 6991: * RETURN VALUE FROM EXPRESSION ! 6992: * ! 6993: * THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN ! 6994: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS ! 6995: * A VALUE. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX ! 6996: * ! 6997: O$RVL ENT ENTRY POINT ! 6998: BRN EVLX3 RETURN TO EVALX PROCEDURE ! 6999: EJC ! 7000: * ! 7001: * SELECTION ! 7002: * ! 7003: * INITIAL ENTRY ! 7004: * ! 7005: O$SLA ENT ENTRY POINT ! 7006: LCW WA LOAD NEW FAILURE OFFSET ! 7007: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER ! 7008: MOV WA,-(XS) STACK NEW FAILURE OFFSET ! 7009: MOV XS,FLPTR SET NEW FAILURE POINTER ! 7010: BRN EXITS JUMP TO EXECUTE FIRST ALTERNATIVE ! 7011: * ! 7012: * ENTRY AFTER SUCCESSFUL EVALUATION OF ALTERNATIVE ! 7013: * ! 7014: O$SLB ENT ENTRY POINT ! 7015: MOV (XS)+,XR LOAD RESULT ! 7016: ICA XS POP FAIL OFFSET ! 7017: MOV (XS),FLPTR RESTORE OLD FAILURE POINTER ! 7018: MOV XR,(XS) RESTACK RESULT ! 7019: LCW WA LOAD NEW CODE OFFSET ! 7020: ADD R$COD,WA POINT TO ABSOLUTE CODE LOCATION ! 7021: LCP WA SET NEW CODE POINTER ! 7022: BRN EXITS JUMP TO CONTINUE PAST SELECTION ! 7023: * ! 7024: * ENTRY AT START OF SUBSEQUENT ALTERNATIVES ! 7025: * ! 7026: O$SLC ENT ENTRY POINT ! 7027: LCW WA LOAD NEW FAIL OFFSET ! 7028: MOV WA,(XS) STORE NEW FAIL OFFSET ! 7029: BRN EXITS JUMP TO EXECUTE NEXT ALTERNATIVE ! 7030: * ! 7031: * ENTRY AT START OF LAST ALTERNATIVE ! 7032: * ! 7033: O$SLD ENT ENTRY POINT ! 7034: ICA XS POP FAILURE OFFSET ! 7035: MOV (XS)+,FLPTR RESTORE OLD FAILURE POINTER ! 7036: BRN EXITS JUMP TO EXECUTE LAST ALTERNATIVE ! 7037: EJC ! 7038: * ! 7039: * BINARY MINUS (SUBTRACTION) ! 7040: * ! 7041: O$SUB ENT ENTRY POINT ! 7042: JSR ARITH FETCH ARITHMETIC OPERANDS ! 7043: ERR 032,SUBTRACTION LEFT OPERAND IS NOT NUMERIC ! 7044: ERR 033,SUBTRACTION RIGHT OPERAND IS NOT NUMERIC ! 7045: PPM OSUB1 JUMP IF REAL OPERANDS ! 7046: * ! 7047: * HERE TO SUBTRACT TWO INTEGERS ! 7048: * ! 7049: SBI ICVAL(XL) SUBTRACT RIGHT OPERAND FROM LEFT ! 7050: INO EXINT RETURN INTEGER IF NO OVERFLOW ! 7051: ERB 034,SUBTRACTION CAUSED INTEGER OVERFLOW ! 7052: * ! 7053: * HERE TO SUBTRACT TWO REALS ! 7054: * ! 7055: OSUB1 SBR RCVAL(XL) SUBTRACT RIGHT OPERAND FROM LEFT ! 7056: RNO EXREA RETURN REAL IF NO OVERFLOW ! 7057: ERB 264,SUBTRACTION CAUSED REAL OVERFLOW ! 7058: EJC ! 7059: * ! 7060: * DUMMY OPERATOR TO RETURN CONTROL TO TRXEQ PROCEDURE ! 7061: * ! 7062: O$TXR ENT ENTRY POINT ! 7063: BRN TRXQ1 JUMP INTO TRXEQ PROCEDURE ! 7064: EJC ! 7065: * ! 7066: * UNEXPECTED FAILURE ! 7067: * ! 7068: * NOTE THAT IF A SETEXIT TRAP IS OPERATING THEN ! 7069: * TRANSFER TO SYSTEM LABEL CONTINUE ! 7070: * WILL RESULT IN LOOPING HERE. DIFFICULT TO AVOID EXCEPT ! 7071: * WITH A CONSIDERABLE OVERHEAD WHICH IS NOT WORTHWHILE OR ! 7072: * ELSE BY A TECHNIQUE SUCH AS SETTING KVERL TO ZERO. ! 7073: * ! 7074: O$UNF ENT ENTRY POINT ! 7075: ERB 035,UNEXPECTED FAILURE IN -NOFAIL MODE ! 7076: TTL S P I T B O L -- SNOBOL4 BUILTIN LABEL ROUTINES ! 7077: * ! 7078: * THE FOLLOWING SECTION CONTAINS THE ROUTINES FOR LABELS ! 7079: * WHICH HAVE A PREDEFINED MEANING IN SNOBOL4. ! 7080: * ! 7081: * CONTROL IS PASSED DIRECTLY TO THE LABEL NAME ENTRY POINT. ! 7082: * ! 7083: * ENTRY NAMES ARE OF THE FORM L$XXX WHERE XXX IS THE THREE ! 7084: * LETTER VARIABLE NAME IDENTIFIER. ! 7085: * ! 7086: * ENTRIES ARE IN ALPHABETICAL ORDER ! 7087: EJC ! 7088: * ! 7089: * ABORT ! 7090: * ! 7091: L$ABO ENT ENTRY POINT ! 7092: * ! 7093: * MERGE HERE IF EXECUTION TERMINATES IN ERROR ! 7094: * ! 7095: LABO1 MOV KVERT,WA LOAD ERROR CODE ! 7096: BZE WA,LABO2 JUMP IF NO ERROR HAS OCCURED ! 7097: JSR SYSAX CALL AFTER EXECUTION PROC (REG04) ! 7098: JSR PRTPG ELSE EJECT PRINTER ! 7099: JSR ERMSG PRINT ERROR MESSAGE ! 7100: ZER XR INDICATE NO MESSAGE TO PRINT ! 7101: BRN STOPR JUMP TO ROUTINE TO STOP RUN ! 7102: * ! 7103: * HERE IF NO ERROR HAD OCCURED ! 7104: * ! 7105: LABO2 ERB 036,GOTO ABORT WITH NO PRECEDING ERROR ! 7106: EJC ! 7107: * ! 7108: * CONTINUE ! 7109: * ! 7110: L$CNT ENT ENTRY POINT ! 7111: * ! 7112: * MERGE HERE AFTER EXECUTION ERROR ! 7113: * ! 7114: LCNT1 MOV R$CNT,XR LOAD CONTINUATION CODE BLOCK PTR ! 7115: BZE XR,LCNT2 JUMP IF NO PREVIOUS ERROR ! 7116: ZER R$CNT CLEAR FLAG ! 7117: MOV XR,R$COD ELSE STORE AS NEW CODE BLOCK PTR ! 7118: ADD STXOF,XR ADD FAILURE OFFSET ! 7119: LCP XR LOAD CODE POINTER ! 7120: MOV FLPTR,XS RESET STACK POINTER ! 7121: BRN EXITS JUMP TO TAKE INDICATED FAILURE ! 7122: * ! 7123: * HERE IF NO PREVIOUS ERROR ! 7124: * ! 7125: LCNT2 ERB 037,GOTO CONTINUE WITH NO PRECEDING ERROR ! 7126: EJC ! 7127: * ! 7128: * END ! 7129: * ! 7130: L$END ENT ENTRY POINT ! 7131: * ! 7132: * MERGE HERE FROM END CODE CIRCUIT ! 7133: * ! 7134: LEND0 MOV =ENDMS,XR POINT TO MESSAGE /NORMAL TERM../ ! 7135: BRN STOPR JUMP TO ROUTINE TO STOP RUN ! 7136: EJC ! 7137: * ! 7138: * FRETURN ! 7139: * ! 7140: L$FRT ENT ENTRY POINT ! 7141: MOV =SCFRT,WA POINT TO STRING /FRETURN/ ! 7142: BRN RETRN JUMP TO COMMON RETURN ROUTINE ! 7143: EJC ! 7144: * ! 7145: * NRETURN ! 7146: * ! 7147: L$NRT ENT ENTRY POINT ! 7148: MOV =SCNRT,WA POINT TO STRING /NRETURN/ ! 7149: BRN RETRN JUMP TO COMMON RETURN ROUTINE ! 7150: EJC ! 7151: * ! 7152: * RETURN ! 7153: * ! 7154: L$RTN ENT ENTRY POINT ! 7155: MOV =SCRTN,WA POINT TO STRING /RETURN/ ! 7156: BRN RETRN JUMP TO COMMON RETURN ROUTINE ! 7157: EJC ! 7158: * ! 7159: * UNDEFINED LABEL ! 7160: * ! 7161: L$UND ENT ENTRY POINT ! 7162: ERB 038,GOTO UNDEFINED LABEL ! 7163: TTL S P I T B O L -- BLOCK ACTION ROUTINES ! 7164: * ! 7165: * THE FIRST WORD OF EVERY BLOCK IN DYNAMIC STORAGE AND THE ! 7166: * VRGET, VRSTO AND VRTRA FIELDS OF A VRBLK CONTAIN A ! 7167: * POINTER TO AN ENTRY POINT IN THE PROGRAM. ALL SUCH ENTRY ! 7168: * POINTS ARE IN THE FOLLOWING SECTION EXCEPT THOSE FOR ! 7169: * PATTERN BLOCKS WHICH ARE IN THE PATTERN MATCHING SEGMENT ! 7170: * LATER ON (LABELS OF THE FORM P$XXX), AND DOPE VECTORS ! 7171: * (D$XXX) WHICH ARE IN THE DOPE VECTOR SECTION FOLLOWING ! 7172: * THE PATTERN ROUTINES (DOPE VECTORS ARE USED FOR CMBLKS). ! 7173: * ! 7174: * THE ENTRY POINTS IN THIS SECTION HAVE LABELS OF THE ! 7175: * FORM B$XXY WHERE XX IS THE TWO CHARACTER BLOCK TYPE FOR ! 7176: * THE CORRESPONDING BLOCK AND Y IS ANY LETTER. ! 7177: * ! 7178: * IN SOME CASES, THE POINTERS SERVE NO OTHER PURPOSE THAN ! 7179: * TO IDENTIFY THE BLOCK TYPE. IN THIS CASE THE ROUTINE ! 7180: * IS NEVER EXECUTED AND THUS NO CODE IS ASSEMBLED. ! 7181: * ! 7182: * FOR EACH OF THESE ENTRY POINTS CORRESPONDING TO A BLOCK ! 7183: * AN ENTRY POINT IDENTIFICATION IS ASSEMBLED (BL$XX). ! 7184: * ! 7185: * THE EXACT ENTRY CONDITIONS DEPEND ON THE MANNER IN ! 7186: * WHICH THE ROUTINE IS ACCESSED AND ARE DOCUMENTED WITH ! 7187: * THE INDIVIDUAL ROUTINES AS REQUIRED. ! 7188: * ! 7189: * THE ORDER OF THESE ROUTINES IS ALPHABETICAL WITH THE ! 7190: * FOLLOWING EXCEPTIONS. ! 7191: * ! 7192: * THE ROUTINES FOR SEBLK AND EXBLK ENTRIES OCCUR FIRST SO ! 7193: * THAT EXPRESSIONS CAN BE QUICKLY IDENTIFIED FROM THE FACT ! 7194: * THAT THEIR ROUTINES LIE BEFORE THE SYMBOL B$E$$. ! 7195: * ! 7196: * THESE ARE IMMEDIATELY FOLLOWED BY THE ROUTINE FOR A TRBLK ! 7197: * SO THAT THE TEST AGAINST THE SYMBOL B$T$$ CHECKS FOR ! 7198: * TRAPPED VALUES OR EXPRESSION VALUES (SEE PROCEDURE EVALP) ! 7199: * ! 7200: * THE PATTERN ROUTINES LIE AFTER THIS SECTION SO THAT ! 7201: * PATTERNS ARE IDENTIFIED WITH ROUTINES STARTING AT OR ! 7202: * AFTER THE INITIAL INSTRUCTION IN THESE ROUTINES (P$AAA). ! 7203: * ! 7204: * THE SYMBOL B$AAA DEFINES THE FIRST LOCATION FOR BLOCK ! 7205: * ROUTINES AND THE SYMBOL P$YYY (AT THE END OF THE PATTERN ! 7206: * MATCH ROUTINES SECTION) DEFINES THE LAST SUCH ENTRY POINT ! 7207: * ! 7208: B$AAA ENT BL$$I ENTRY POINT OF FIRST BLOCK ROUTINE ! 7209: EJC ! 7210: * ! 7211: * EXBLK ! 7212: * ! 7213: * THE ROUTINE FOR AN EXBLK LOADS THE EXPRESSION ONTO ! 7214: * THE STACK AS A VALUE. ! 7215: * ! 7216: * (XR) POINTER TO EXBLK ! 7217: * ! 7218: B$EXL ENT BL$EX ENTRY POINT (EXBLK) ! 7219: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD ! 7220: EJC ! 7221: * ! 7222: * SEBLK ! 7223: * ! 7224: * THE ROUTINE FOR SEBLK IS ACCESSED FROM THE GENERATED ! 7225: * CODE TO LOAD THE EXPRESSION VALUE ONTO THE STACK. ! 7226: * ! 7227: B$SEL ENT BL$SE ENTRY POINT (SEBLK) ! 7228: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD ! 7229: * ! 7230: * DEFINE SYMBOL WHICH MARKS END OF ENTRIES FOR EXPRESSIONS ! 7231: * ! 7232: B$E$$ ENT BL$$I ENTRY POINT ! 7233: EJC ! 7234: * ! 7235: * TRBLK ! 7236: * ! 7237: * THE ROUTINE FOR A TRBLK IS NEVER EXECUTED ! 7238: * ! 7239: B$TRT ENT BL$TR ENTRY POINT (TRBLK) ! 7240: * ! 7241: * DEFINE SYMBOL MARKING END OF TRAP AND EXPRESSION BLOCKS ! 7242: * ! 7243: B$T$$ ENT BL$$I END OF TRBLK,SEBLK,EXBLK ENTRIES ! 7244: EJC ! 7245: * ! 7246: * ARBLK ! 7247: * ! 7248: * THE ROUTINE FOR ARBLK IS NEVER EXECUTED ! 7249: * ! 7250: B$ART ENT BL$AR ENTRY POINT (ARBLK) ! 7251: EJC ! 7252: * ! 7253: * BCBLK ! 7254: * ! 7255: * THE ROUTINE FOR A BCBLK IS NEVER EXECUTED ! 7256: * ! 7257: * (XR) POINTER TO BCBLK ! 7258: * ! 7259: B$BCT ENT BL$BC ENTRY POINT (BCBLK) ! 7260: EJC ! 7261: * ! 7262: * BFBLK ! 7263: * ! 7264: * THE ROUTINE FOR A BFBLK IS NEVER EXECUTED ! 7265: * ! 7266: * (XR) POINTER TO BFBLK ! 7267: * ! 7268: B$BFT ENT BL$BF ENTRY POINT (BFBLK) ! 7269: EJC ! 7270: * ! 7271: * CCBLK ! 7272: * ! 7273: * THE ROUTINE FOR CCBLK IS NEVER ENTERED ! 7274: * ! 7275: B$CCT ENT BL$CC ENTRY POINT (CCBLK) ! 7276: EJC ! 7277: * ! 7278: * CDBLK ! 7279: * ! 7280: * THE CDBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE. ! 7281: * THERE ARE TWO CASES DEPENDING ON THE FORM OF CDFAL. ! 7282: * ! 7283: * ENTRY FOR COMPLEX FAILURE CODE AT CDFAL ! 7284: * ! 7285: * (XR) POINTER TO CDBLK ! 7286: * ! 7287: B$CDC ENT BL$CD ENTRY POINT (CDBLK) ! 7288: BCDC0 MOV FLPTR,XS POP GARBAGE OFF STACK ! 7289: MOV CDFAL(XR),(XS) SET FAILURE OFFSET ! 7290: BRN STMGO ENTER STMT ! 7291: EJC ! 7292: * ! 7293: * CDBLK (CONTINUED) ! 7294: * ! 7295: * ENTRY FOR SIMPLE FAILURE CODE AT CDFAL ! 7296: * ! 7297: * (XR) POINTER TO CDBLK ! 7298: * ! 7299: B$CDS ENT BL$CD ENTRY POINT (CDBLK) ! 7300: BCDS0 MOV FLPTR,XS POP GARBAGE OFF STACK ! 7301: MOV *CDFAL,(XS) SET FAILURE OFFSET ! 7302: BRN STMGO ENTER STMT ! 7303: EJC ! 7304: * ! 7305: * CMBLK ! 7306: * ! 7307: * THE ROUTINE FOR A CMBLK IS NEVER EXECUTED ! 7308: * ! 7309: B$CMT ENT BL$CM ENTRY POINT (CMBLK) ! 7310: EJC ! 7311: * ! 7312: * CTBLK ! 7313: * ! 7314: * THE ROUTINE FOR A CTBLK IS NEVER EXECUTED ! 7315: * ! 7316: B$CTT ENT BL$CT ENTRY POINT (CTBLK) ! 7317: EJC ! 7318: * ! 7319: * DFBLK ! 7320: * ! 7321: * THE ROUTINE FOR A DFBLK IS ACCESSED FROM THE O$FNC ENTRY ! 7322: * TO CALL A DATATYPE FUNCTION AND BUILD A PDBLK. ! 7323: * ! 7324: * (XL) POINTER TO DFBLK ! 7325: * ! 7326: B$DFC ENT BL$DF ENTRY POINT ! 7327: MOV DFPDL(XL),WA LOAD LENGTH OF PDBLK ! 7328: JSR ALLOC ALLOCATE PDBLK ! 7329: MOV =B$PDT,(XR) STORE TYPE WORD ! 7330: MOV XL,PDDFP(XR) STORE DFBLK POINTER ! 7331: MOV XR,WC SAVE POINTER TO PDBLK ! 7332: ADD WA,XR POINT PAST PDBLK ! 7333: LCT WA,FARGS(XL) SET TO COUNT FIELDS ! 7334: * ! 7335: * LOOP TO ACQUIRE FIELD VALUES FROM STACK ! 7336: * ! 7337: BDFC1 MOV (XS)+,-(XR) MOVE A FIELD VALUE ! 7338: BCT WA,BDFC1 LOOP TILL ALL MOVED ! 7339: MOV WC,XR RECALL POINTER TO PDBLK ! 7340: BRN EXSID EXIT SETTING ID FIELD ! 7341: EJC ! 7342: * ! 7343: * EFBLK ! 7344: * ! 7345: * THE ROUTINE FOR AN EFBLK IS PASSED CONTROL FORM THE O$FNC ! 7346: * ENTRY TO CALL AN EXTERNAL FUNCTION. ! 7347: * ! 7348: * (XL) POINTER TO EFBLK ! 7349: * ! 7350: B$EFC ENT BL$EF ENTRY POINT (EFBLK) ! 7351: MOV FARGS(XL),WC LOAD NUMBER OF ARGUMENTS ! 7352: WTB WC CONVERT TO OFFSET ! 7353: MOV XL,-(XS) SAVE POINTER TO EFBLK ! 7354: MOV XS,XT COPY POINTER TO ARGUMENTS ! 7355: * ! 7356: * LOOP TO CONVERT ARGUMENTS ! 7357: * ! 7358: BEFC1 ICA XT POINT TO NEXT ENTRY ! 7359: MOV (XS),XR LOAD POINTER TO EFBLK ! 7360: DCA WC DECREMENT EFTAR OFFSET ! 7361: ADD WC,XR POINT TO NEXT EFTAR ENTRY ! 7362: MOV EFTAR(XR),XR LOAD EFTAR ENTRY ! 7363: BSW XR,4 SWITCH ON TYPE ! 7364: IFF 0,BEFC7 NO CONVERSION NEEDED ! 7365: IFF 1,BEFC2 STRING ! 7366: IFF 2,BEFC3 INTEGER ! 7367: IFF 3,BEFC4 REAL ! 7368: ESW END OF SWITCH ON TYPE ! 7369: * ! 7370: * HERE TO CONVERT TO STRING ! 7371: * ! 7372: BEFC2 MOV (XT),-(XS) STACK ARG PTR ! 7373: JSR GTSTG CONVERT ARGUMENT TO STRING ! 7374: ERR 039,EXTERNAL FUNCTION ARGUMENT IS NOT STRING ! 7375: BRN BEFC6 JUMP TO MERGE ! 7376: EJC ! 7377: * ! 7378: * EFBLK (CONTINUED) ! 7379: * ! 7380: * HERE TO CONVERT AN INTEGER ! 7381: * ! 7382: BEFC3 MOV (XT),XR LOAD NEXT ARGUMENT ! 7383: MOV WC,BEFOF SAVE OFFSET ! 7384: JSR GTINT CONVERT TO INTEGER ! 7385: ERR 040,EXTERNAL FUNCTION ARGUMENT IS NOT INTEGER ! 7386: BRN BEFC5 MERGE WITH REAL CASE ! 7387: * ! 7388: * HERE TO CONVERT A REAL ! 7389: * ! 7390: BEFC4 MOV (XT),XR LOAD NEXT ARGUMENT ! 7391: MOV WC,BEFOF SAVE OFFSET ! 7392: JSR GTREA CONVERT TO REAL ! 7393: ERR 265,EXTERNAL FUNCTION ARGUMENT IS NOT REAL ! 7394: * ! 7395: * INTEGER CASE MERGES HERE ! 7396: * ! 7397: BEFC5 MOV BEFOF,WC RESTORE OFFSET ! 7398: * ! 7399: * STRING MERGES HERE ! 7400: * ! 7401: BEFC6 MOV XR,(XT) STORE CONVERTED RESULT ! 7402: * ! 7403: * NO CONVERSION MERGES HERE ! 7404: * ! 7405: BEFC7 BNZ WC,BEFC1 LOOP BACK IF MORE TO GO ! 7406: * ! 7407: * HERE AFTER CONVERTING ALL THE ARGUMENTS ! 7408: * ! 7409: MOV (XS)+,XL RESTORE EFBLK POINTER ! 7410: MOV FARGS(XL),WA GET NUMBER OF ARGS ! 7411: JSR SYSEX CALL ROUTINE TO CALL EXTERNAL FNC ! 7412: PPM EXFAL FAIL IF FAILURE ! 7413: EJC ! 7414: * ! 7415: * EFBLK (CONTINUED) ! 7416: * ! 7417: * RETURN HERE WITH RESULT IN XR ! 7418: * ! 7419: * FIRST DEFEND AGAINST NON-STANDARD NULL STRING RETURNED ! 7420: * ! 7421: MOV EFRSL(XL),WB GET RESULT TYPE ID ! 7422: BNZ WB,BEFA8 BRANCH IF NOT UNCONVERTED ! 7423: BNE (XR),=B$SCL,BEFC8 JUMP IF NOT A STRING ! 7424: BZE SCLEN(XR),EXNUL RETURN NULL IF NULL ! 7425: * ! 7426: * HERE IF CONVERTED RESULT TO CHECK FOR NULL STRING ! 7427: * ! 7428: BEFA8 BNE WB,=NUM01,BEFC8 JUMP IF NOT A STRING ! 7429: BZE SCLEN(XR),EXNUL RETURN NULL IF NULL ! 7430: * ! 7431: * RETURN IF RESULT IS IN DYNAMIC STORAGE ! 7432: * ! 7433: BEFC8 BLT XR,DNAMB,BEFC9 JUMP IF NOT IN DYNAMIC STORAGE ! 7434: BLE XR,DNAMP,EXIXR RETURN RESULT IF ALREADY DYNAMIC ! 7435: * ! 7436: * HERE WE COPY A RESULT INTO THE DYNAMIC REGION ! 7437: * ! 7438: BEFC9 MOV (XR),WA GET POSSIBLE TYPE WORD ! 7439: BZE WB,BEF11 JUMP IF UNCONVERTED RESULT ! 7440: MOV =B$SCL,WA STRING ! 7441: BEQ WB,=NUM01,BEF10 YES JUMP ! 7442: MOV =B$ICL,WA INTEGER ! 7443: BEQ WB,=NUM02,BEF10 YES JUMP ! 7444: MOV =B$RCL,WA REAL ! 7445: * ! 7446: * STORE TYPE WORD IN RESULT ! 7447: * ! 7448: BEF10 MOV WA,(XR) STORED BEFORE COPYING TO DYNAMIC ! 7449: * ! 7450: * MERGE FOR UNCONVERTED RESULT ! 7451: * ! 7452: BEF11 JSR BLKLN GET LENGTH OF BLOCK ! 7453: MOV XR,XL COPY ADDRESS OF OLD BLOCK ! 7454: JSR ALLOC ALLOCATE DYNAMIC BLOCK SAME SIZE ! 7455: MOV XR,-(XS) SET POINTER TO NEW BLOCK AS RESULT ! 7456: MVW COPY OLD BLOCK TO DYNAMIC BLOCK ! 7457: BRN EXITS EXIT WITH RESULT ON STACK ! 7458: EJC ! 7459: * ! 7460: * EVBLK ! 7461: * ! 7462: * THE ROUTINE FOR AN EVBLK IS NEVER EXECUTED ! 7463: * ! 7464: B$EVT ENT BL$EV ENTRY POINT (EVBLK) ! 7465: EJC ! 7466: * ! 7467: * FFBLK ! 7468: * ! 7469: * THE ROUTINE FOR AN FFBLK IS EXECUTED FROM THE O$FNC ENTRY ! 7470: * TO CALL A FIELD FUNCTION AND EXTRACT A FIELD VALUE/NAME. ! 7471: * ! 7472: * (XL) POINTER TO FFBLK ! 7473: * ! 7474: B$FFC ENT BL$FF ENTRY POINT (FFBLK) ! 7475: MOV XL,XR COPY FFBLK POINTER ! 7476: LCW WC LOAD NEXT CODE WORD ! 7477: MOV (XS),XL LOAD PDBLK POINTER ! 7478: BNE (XL),=B$PDT,BFFC2 JUMP IF NOT PDBLK AT ALL ! 7479: MOV PDDFP(XL),WA LOAD DFBLK POINTER FROM PDBLK ! 7480: * ! 7481: * LOOP TO FIND CORRECT FFBLK FOR THIS PDBLK ! 7482: * ! 7483: BFFC1 BEQ WA,FFDFP(XR),BFFC3 JUMP IF THIS IS THE CORRECT FFBLK ! 7484: MOV FFNXT(XR),XR ELSE LINK TO NEXT FFBLK ON CHAIN ! 7485: BNZ XR,BFFC1 LOOP BACK IF ANOTHER ENTRY TO CHECK ! 7486: * ! 7487: * HERE FOR BAD ARGUMENT ! 7488: * ! 7489: BFFC2 ERB 041,FIELD FUNCTION ARGUMENT IS WRONG DATATYPE ! 7490: EJC ! 7491: * ! 7492: * FFBLK (CONTINUED) ! 7493: * ! 7494: * HERE AFTER LOCATING CORRECT FFBLK ! 7495: * ! 7496: BFFC3 MOV FFOFS(XR),WA LOAD FIELD OFFSET ! 7497: BEQ WC,=OFNE$,BFFC5 JUMP IF CALLED BY NAME ! 7498: ADD WA,XL ELSE POINT TO VALUE FIELD ! 7499: MOV (XL),XR LOAD VALUE ! 7500: BNE (XR),=B$TRT,BFFC4 JUMP IF NOT TRAPPED ! 7501: SUB WA,XL ELSE RESTORE NAME BASE,OFFSET ! 7502: MOV WC,(XS) SAVE NEXT CODE WORD OVER PDBLK PTR ! 7503: JSR ACESS ACCESS VALUE ! 7504: PPM EXFAL FAIL IF ACCESS FAILS ! 7505: MOV (XS),WC RESTORE NEXT CODE WORD ! 7506: * ! 7507: * HERE AFTER GETTING VALUE IN (XR) ! 7508: * ! 7509: BFFC4 MOV XR,(XS) STORE VALUE ON STACK (OVER PDBLK) ! 7510: MOV WC,XR COPY NEXT CODE WORD ! 7511: MOV (XR),XL LOAD ENTRY ADDRESS ! 7512: BRI XL JUMP TO ROUTINE FOR NEXT CODE WORD ! 7513: * ! 7514: * HERE IF CALLED BY NAME ! 7515: * ! 7516: BFFC5 MOV WA,-(XS) STORE NAME OFFSET (BASE IS SET) ! 7517: BRN EXITS EXIT WITH NAME ON STACK ! 7518: EJC ! 7519: * ! 7520: * ICBLK ! 7521: * ! 7522: * THE ROUTINE FOR ICBLK IS EXECUTED FROM THE GENERATED ! 7523: * CODE TO LOAD AN INTEGER VALUE ONTO THE STACK. ! 7524: * ! 7525: * (XR) POINTER TO ICBLK ! 7526: * ! 7527: B$ICL ENT BL$IC ENTRY POINT (ICBLK) ! 7528: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD ! 7529: EJC ! 7530: * ! 7531: * KVBLK ! 7532: * ! 7533: * THE ROUTINE FOR A KVBLK IS NEVER EXECUTED. ! 7534: * ! 7535: B$KVT ENT BL$KV ENTRY POINT (KVBLK) ! 7536: EJC ! 7537: * ! 7538: * NMBLK ! 7539: * ! 7540: * THE ROUTINE FOR A NMBLK IS EXECUTED FROM THE GENERATED ! 7541: * CODE FOR THE CASE OF LOADING A NAME ONTO THE STACK ! 7542: * WHERE THE NAME IS THAT OF A NATURAL VARIABLE WHICH CAN ! 7543: * BE PREEVALUATED AT COMPILE TIME. ! 7544: * ! 7545: * (XR) POINTER TO NMBLK ! 7546: * ! 7547: B$NML ENT BL$NM ENTRY POINT (NMBLK) ! 7548: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD ! 7549: EJC ! 7550: * ! 7551: * PDBLK ! 7552: * ! 7553: * THE ROUTINE FOR A PDBLK IS NEVER EXECUTED ! 7554: * ! 7555: B$PDT ENT BL$PD ENTRY POINT (PDBLK) ! 7556: EJC ! 7557: * ! 7558: * PFBLK ! 7559: * ! 7560: * THE ROUTINE FOR A PFBLK IS EXECUTED FROM THE ENTRY O$FNC ! 7561: * TO CALL A PROGRAM DEFINED FUNCTION. ! 7562: * ! 7563: * (XL) POINTER TO PFBLK ! 7564: * ! 7565: * THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING ! 7566: * CONTROL TO THE PROGRAM DEFINED FUNCTION. ! 7567: * ! 7568: * SAVED VALUE OF FIRST ARGUMENT ! 7569: * . ! 7570: * SAVED VALUE OF LAST ARGUMENT ! 7571: * SAVED VALUE OF FIRST LOCAL ! 7572: * . ! 7573: * SAVED VALUE OF LAST LOCAL ! 7574: * SAVED VALUE OF FUNCTION NAME ! 7575: * SAVED CODE BLOCK PTR (R$COD) ! 7576: * SAVED CODE POINTER (-R$COD) ! 7577: * SAVED VALUE OF FLPRT ! 7578: * SAVED VALUE OF FLPTR ! 7579: * POINTER TO PFBLK ! 7580: * FLPTR --------------- ZERO (TO BE OVERWRITTEN WITH OFFS) ! 7581: * ! 7582: B$PFC ENT BL$PF ENTRY POINT (PFBLK) ! 7583: MOV XL,BPFPF SAVE PFBLK PTR (NEED NOT BE RELOC) ! 7584: MOV XL,XR COPY FOR THE MOMENT ! 7585: MOV PFVBL(XR),XL POINT TO VRBLK FOR FUNCTION ! 7586: * ! 7587: * LOOP TO FIND OLD VALUE OF FUNCTION ! 7588: * ! 7589: BPF01 MOV XL,WB SAVE POINTER ! 7590: MOV VRVAL(XL),XL LOAD VALUE ! 7591: BEQ (XL),=B$TRT,BPF01 LOOP IF TRBLK ! 7592: * ! 7593: * SET VALUE TO NULL AND SAVE OLD FUNCTION VALUE ! 7594: * ! 7595: MOV XL,BPFSV SAVE OLD VALUE ! 7596: MOV WB,XL POINT BACK TO BLOCK WITH VALUE ! 7597: MOV =NULLS,VRVAL(XL) SET VALUE TO NULL ! 7598: MOV FARGS(XR),WA LOAD NUMBER OF ARGUMENTS ! 7599: ADD *PFARG,XR POINT TO PFARG ENTRIES ! 7600: BZE WA,BPF04 JUMP IF NO ARGUMENTS ! 7601: MOV XS,XT PTR TO LAST ARG ! 7602: WTB WA CONVERT NO. OF ARGS TO BYTES OFFSET ! 7603: ADD WA,XT POINT BEFORE FIRST ARG ! 7604: MOV XT,BPFXT REMEMBER ARG POINTER ! 7605: EJC ! 7606: * ! 7607: * PFBLK (CONTINUED) ! 7608: * ! 7609: * LOOP TO SAVE OLD ARGUMENT VALUES AND SET NEW ONES ! 7610: * ! 7611: BPF02 MOV (XR)+,XL LOAD VRBLK PTR FOR NEXT ARGUMENT ! 7612: * ! 7613: * LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE ! 7614: * ! 7615: BPF03 MOV XL,WC SAVE POINTER ! 7616: MOV VRVAL(XL),XL LOAD NEXT VALUE ! 7617: BEQ (XL),=B$TRT,BPF03 LOOP BACK IF TRBLK ! 7618: * ! 7619: * SAVE OLD VALUE AND GET NEW VALUE ! 7620: * ! 7621: MOV XL,WA KEEP OLD VALUE ! 7622: MOV BPFXT,XT POINT BEFORE NEXT STACKED ARG ! 7623: MOV -(XT),WB LOAD ARGUMENT (NEW VALUE) ! 7624: MOV WA,(XT) SAVE OLD VALUE ! 7625: MOV XT,BPFXT KEEP ARG PTR FOR NEXT TIME ! 7626: MOV WC,XL POINT BACK TO BLOCK WITH VALUE ! 7627: MOV WB,VRVAL(XL) SET NEW VALUE ! 7628: BNE XS,BPFXT,BPF02 LOOP IF NOT ALL DONE ! 7629: * ! 7630: * NOW PROCESS LOCALS ! 7631: * ! 7632: BPF04 MOV BPFPF,XL RESTORE PFBLK POINTER ! 7633: MOV PFNLO(XL),WA LOAD NUMBER OF LOCALS ! 7634: BZE WA,BPF07 JUMP IF NO LOCALS ! 7635: MOV =NULLS,WB GET NULL CONSTANT ! 7636: LCT WA,WA SET LOCAL COUNTER ! 7637: * ! 7638: * LOOP TO PROCESS LOCALS ! 7639: * ! 7640: BPF05 MOV (XR)+,XL LOAD VRBLK PTR FOR NEXT LOCAL ! 7641: * ! 7642: * LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE ! 7643: * ! 7644: BPF06 MOV XL,WC SAVE POINTER ! 7645: MOV VRVAL(XL),XL LOAD NEXT VALUE ! 7646: BEQ (XL),=B$TRT,BPF06 LOOP BACK IF TRBLK ! 7647: * ! 7648: * SAVE OLD VALUE AND SET NULL AS NEW VALUE ! 7649: * ! 7650: MOV XL,-(XS) STACK OLD VALUE ! 7651: MOV WC,XL POINT BACK TO BLOCK WITH VALUE ! 7652: MOV WB,VRVAL(XL) SET NULL AS NEW VALUE ! 7653: BCT WA,BPF05 LOOP TILL ALL LOCALS PROCESSED ! 7654: EJC ! 7655: * ! 7656: * PFBLK (CONTINUED) ! 7657: * ! 7658: * HERE AFTER PROCESSING ARGUMENTS AND LOCALS ! 7659: * ! 7660: BPF07 ZER XR ZERO REG XR IN CASE ! 7661: BZE KVPFL,BPF7C SKIP IF PROFILING IS OFF ! 7662: BEQ KVPFL,=NUM02,BPF7A BRANCH ON TYPE OF PROFILE ! 7663: * ! 7664: * HERE IF &PROFILE = 1 ! 7665: * ! 7666: JSR SYSTM GET CURRENT TIME ! 7667: STI PFETM SAVE FOR A SEC ! 7668: SBI PFSTM FIND TIME USED BY CALLER ! 7669: JSR ICBLD BUILD INTO AN ICBLK ! 7670: LDI PFETM RELOAD CURRENT TIME ! 7671: BRN BPF7B MERGE ! 7672: * ! 7673: * HERE IF &PROFILE = 2 ! 7674: * ! 7675: BPF7A LDI PFSTM GET START TIME OF CALLING STMT ! 7676: JSR ICBLD ASSEMBLE AN ICBLK ROUND IT ! 7677: JSR SYSTM GET NOW TIME ! 7678: * ! 7679: * BOTH TYPES OF PROFILE MERGE HERE ! 7680: * ! 7681: BPF7B STI PFSTM SET START TIME OF 1ST FUNC STMT ! 7682: MNZ PFFNC FLAG FUNCTION ENTRY ! 7683: * ! 7684: * NO PROFILING MERGES HERE ! 7685: * ! 7686: BPF7C MOV XR,-(XS) STACK ICBLK PTR (OR ZERO) ! 7687: MOV R$COD,WA LOAD OLD CODE BLOCK POINTER ! 7688: SCP WB GET CODE POINTER ! 7689: SUB WA,WB MAKE CODE POINTER INTO OFFSET ! 7690: MOV BPFPF,XL RECALL PFBLK POINTER ! 7691: MOV BPFSV,-(XS) STACK OLD VALUE OF FUNCTION NAME ! 7692: MOV WA,-(XS) STACK CODE BLOCK POINTER ! 7693: MOV WB,-(XS) STACK CODE OFFSET ! 7694: MOV FLPRT,-(XS) STACK OLD FLPRT ! 7695: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER ! 7696: MOV XL,-(XS) STACK POINTER TO PFBLK ! 7697: ZER -(XS) DUMMY ZERO ENTRY FOR FAIL RETURN ! 7698: CHK CHECK FOR STACK OVERFLOW ! 7699: MOV XS,FLPTR SET NEW FAIL RETURN VALUE ! 7700: MOV XS,FLPRT SET NEW FLPRT ! 7701: MOV KVTRA,WA LOAD TRACE VALUE ! 7702: ADD KVFTR,WA ADD FTRACE VALUE ! 7703: BNZ WA,BPF09 JUMP IF TRACING POSSIBLE ! 7704: ICV KVFNC ELSE BUMP FNCLEVEL ! 7705: * ! 7706: * HERE TO ACTUALLY JUMP TO FUNCTION ! 7707: * ! 7708: BPF08 MOV PFCOD(XL),XR POINT TO CODE ! 7709: BRI (XR) OFF TO EXECUTE FUNCTION ! 7710: * ! 7711: * HERE IF TRACING IS POSSIBLE ! 7712: * ! 7713: BPF09 MOV PFCTR(XL),XR LOAD POSSIBLE CALL TRACE TRBLK ! 7714: MOV PFVBL(XL),XL LOAD VRBLK POINTER FOR FUNCTION ! 7715: MOV *VRVAL,WA SET NAME OFFSET FOR VARIABLE ! 7716: BZE KVTRA,BPF10 JUMP IF TRACE MODE IS OFF ! 7717: BZE XR,BPF10 OR IF THERE IS NO CALL TRACE ! 7718: * ! 7719: * HERE IF CALL TRACED ! 7720: * ! 7721: DCV KVTRA DECREMENT TRACE COUNT ! 7722: BZE TRFNC(XR),BPF11 JUMP IF PRINT TRACE ! 7723: JSR TRXEQ EXECUTE FUNCTION TYPE TRACE ! 7724: EJC ! 7725: * ! 7726: * PFBLK (CONTINUED) ! 7727: * ! 7728: * HERE TO TEST FOR FTRACE TRACE ! 7729: * ! 7730: BPF10 BZE KVFTR,BPF16 JUMP IF FTRACE IS OFF ! 7731: DCV KVFTR ELSE DECREMENT FTRACE ! 7732: * ! 7733: * HERE FOR PRINT TRACE ! 7734: * ! 7735: BPF11 JSR PRTSN PRINT STATEMENT NUMBER ! 7736: JSR PRTNM PRINT FUNCTION NAME ! 7737: MOV =CH$PP,WA LOAD LEFT PAREN ! 7738: JSR PRTCH PRINT LEFT PAREN ! 7739: MOV 1(XS),XL RECOVER PFBLK POINTER ! 7740: BZE FARGS(XL),BPF15 SKIP IF NO ARGUMENTS ! 7741: ZER WB ELSE SET ARGUMENT COUNTER ! 7742: BRN BPF13 JUMP INTO LOOP ! 7743: * ! 7744: * LOOP TO PRINT ARGUMENT VALUES ! 7745: * ! 7746: BPF12 MOV =CH$CM,WA LOAD COMMA ! 7747: JSR PRTCH PRINT TO SEPARATE FROM LAST ARG ! 7748: * ! 7749: * MERGE HERE FIRST TIME (NO COMMA REQUIRED) ! 7750: * ! 7751: BPF13 MOV WB,(XS) SAVE ARG CTR (OVER FAILOFFS IS OK) ! 7752: WTB WB CONVERT TO BYTE OFFSET ! 7753: ADD WB,XL POINT TO NEXT ARGUMENT POINTER ! 7754: MOV PFARG(XL),XR LOAD NEXT ARGUMENT VRBLK PTR ! 7755: SUB WB,XL RESTORE PFBLK POINTER ! 7756: MOV VRVAL(XR),XR LOAD NEXT VALUE ! 7757: JSR PRTVL PRINT ARGUMENT VALUE ! 7758: EJC ! 7759: * ! 7760: * HERE AFTER DEALING WITH ONE ARGUMENT ! 7761: * ! 7762: MOV (XS),WB RESTORE ARGUMENT COUNTER ! 7763: ICV WB INCREMENT ARGUMENT COUNTER ! 7764: BLT WB,FARGS(XL),BPF12 LOOP IF MORE TO PRINT ! 7765: * ! 7766: * MERGE HERE IN NO ARGS CASE TO PRINT PAREN ! 7767: * ! 7768: BPF15 MOV =CH$RP,WA LOAD RIGHT PAREN ! 7769: JSR PRTCH PRINT TO TERMINATE OUTPUT ! 7770: JSR PRTNL TERMINATE PRINT LINE ! 7771: * ! 7772: * MERGE HERE TO EXIT WITH TEST FOR FNCLEVEL TRACE ! 7773: * ! 7774: BPF16 ICV KVFNC INCREMENT FNCLEVEL ! 7775: MOV R$FNC,XL LOAD PTR TO POSSIBLE TRBLK ! 7776: JSR KTREX CALL KEYWORD TRACE ROUTINE ! 7777: * ! 7778: * CALL FUNCTION AFTER TRACE TESTS COMPLETE ! 7779: * ! 7780: MOV 1(XS),XL RESTORE PFBLK POINTER ! 7781: BRN BPF08 JUMP BACK TO EXECUTE FUNCTION ! 7782: EJC ! 7783: * ! 7784: * RCBLK ! 7785: * ! 7786: * THE ROUTINE FOR AN RCBLK IS EXECUTED FROM THE GENERATED ! 7787: * CODE TO LOAD A REAL VALUE ONTO THE STACK. ! 7788: * ! 7789: * (XR) POINTER TO RCBLK ! 7790: * ! 7791: B$RCL ENT BL$RC ENTRY POINT (RCBLK) ! 7792: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD ! 7793: EJC ! 7794: * ! 7795: * SCBLK ! 7796: * ! 7797: * THE ROUTINE FOR AN SCBLK IS EXECUTED FROM THE GENERATED ! 7798: * CODE TO LOAD A STRING VALUE ONTO THE STACK. ! 7799: * ! 7800: * (XR) POINTER TO SCBLK ! 7801: * ! 7802: B$SCL ENT BL$SC ENTRY POINT (SCBLK) ! 7803: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD ! 7804: EJC ! 7805: * ! 7806: * TBBLK ! 7807: * ! 7808: * THE ROUTINE FOR A TBBLK IS NEVER EXECUTED ! 7809: * ! 7810: B$TBT ENT BL$TB ENTRY POINT (TBBLK) ! 7811: EJC ! 7812: * ! 7813: * TEBLK ! 7814: * ! 7815: * THE ROUTINE FOR A TEBLK IS NEVER EXECUTED ! 7816: * ! 7817: B$TET ENT BL$TE ENTRY POINT (TEBLK) ! 7818: EJC ! 7819: * ! 7820: * VCBLK ! 7821: * ! 7822: * THE ROUTINE FOR A VCBLK IS NEVER EXECUTED ! 7823: * ! 7824: B$VCT ENT BL$VC ENTRY POINT (VCBLK) ! 7825: EJC ! 7826: * ! 7827: * VRBLK ! 7828: * ! 7829: * THE VRBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE. ! 7830: * THERE ARE SIX ENTRIES FOR VRBLK COVERING VARIOUS CASES ! 7831: * ! 7832: B$VR$ ENT BL$$I MARK START OF VRBLK ENTRY POINTS ! 7833: * ! 7834: * ENTRY FOR VRGET (TRAPPED CASE). THIS ROUTINE IS CALLED ! 7835: * FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE. ! 7836: * THIS ENTRY POINT IS USED IF AN ACCESS TRACE OR INPUT ! 7837: * ASSOCIATION IS CURRENTLY ACTIVE. ! 7838: * ! 7839: * (XR) POINTER TO VRGET FIELD OF VRBLK ! 7840: * ! 7841: B$VRA ENT BL$$I ENTRY POINT ! 7842: MOV XR,XL COPY NAME BASE (VRGET = 0) ! 7843: MOV *VRVAL,WA SET NAME OFFSET ! 7844: JSR ACESS ACCESS VALUE ! 7845: PPM EXFAL FAIL IF ACCESS FAILS ! 7846: BRN EXIXR ELSE EXIT WITH RESULT IN XR ! 7847: EJC ! 7848: * ! 7849: * VRBLK (CONTINUED) ! 7850: * ! 7851: * ENTRY FOR VRSTO (ERROR CASE. THIS ROUTINE IS CALLED FROM ! 7852: * THE EXECUTED CODE FOR AN ATTEMPT TO MODIFY THE VALUE ! 7853: * OF A PROTECTED (PATTERN VALUED) NATURAL VARIABLE. ! 7854: * ! 7855: B$VRE ENT ENTRY POINT ! 7856: ERB 042,ATTEMPT TO CHANGE VALUE OF PROTECTED VARIABLE ! 7857: EJC ! 7858: * ! 7859: * VRBLK (CONTINUED) ! 7860: * ! 7861: * ENTRY FOR VRTRA (UNTRAPPED CASE). THIS ROUTINE IS CALLED ! 7862: * FROM THE EXECUTED CODE TO TRANSFER TO A LABEL. ! 7863: * ! 7864: * (XR) POINTER TO VRTRA FIELD OF VRBLK ! 7865: * ! 7866: B$VRG ENT ENTRY POINT ! 7867: MOV VRLBO(XR),XR LOAD CODE POINTER ! 7868: MOV (XR),XL LOAD ENTRY ADDRESS ! 7869: BRI XL JUMP TO ROUTINE FOR NEXT CODE WORD ! 7870: EJC ! 7871: * ! 7872: * VRBLK (CONTINUED) ! 7873: * ! 7874: * ENTRY FOR VRGET (UNTRAPPED CASE). THIS ROUTINE IS CALLED ! 7875: * FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE. ! 7876: * ! 7877: * (XR) POINTS TO VRGET FIELD OF VRBLK ! 7878: * ! 7879: B$VRL ENT ENTRY POINT ! 7880: MOV VRVAL(XR),-(XS) LOAD VALUE ONTO STACK (VRGET = 0) ! 7881: BRN EXITS OBEY NEXT CODE WORD ! 7882: EJC ! 7883: * ! 7884: * VRBLK (CONTINUED) ! 7885: * ! 7886: * ENTRY FOR VRSTO (UNTRAPPED CASE). THIS ROUTINE IS CALLED ! 7887: * FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE. ! 7888: * ! 7889: * (XR) POINTER TO VRSTO FIELD OF VRBLK ! 7890: * ! 7891: B$VRS ENT ENTRY POINT ! 7892: MOV (XS),VRVLO(XR) STORE VALUE, LEAVE ON STACK ! 7893: BRN EXITS OBEY NEXT CODE WORD ! 7894: EJC ! 7895: * ! 7896: * VRBLK (CONTINUED) ! 7897: * ! 7898: * VRTRA (TRAPPED CASE). THIS ROUTINE IS CALLED FROM THE ! 7899: * GENERATED CODE TO TRANSFER TO A LABEL WHEN A LABEL ! 7900: * TRACE IS CURRENTLY ACTIVE. ! 7901: * ! 7902: B$VRT ENT ENTRY POINT ! 7903: SUB *VRTRA,XR POINT BACK TO START OF VRBLK ! 7904: MOV XR,XL COPY VRBLK POINTER ! 7905: MOV *VRVAL,WA SET NAME OFFSET ! 7906: MOV VRLBL(XL),XR LOAD POINTER TO TRBLK ! 7907: BZE KVTRA,BVRT2 JUMP IF TRACE IS OFF ! 7908: DCV KVTRA ELSE DECREMENT TRACE COUNT ! 7909: BZE TRFNC(XR),BVRT1 JUMP IF PRINT TRACE CASE ! 7910: JSR TRXEQ ELSE EXECUTE FULL TRACE ! 7911: BRN BVRT2 MERGE TO JUMP TO LABEL ! 7912: * ! 7913: * HERE FOR PRINT TRACE -- PRINT COLON ( LABEL NAME ) ! 7914: * ! 7915: BVRT1 JSR PRTSN PRINT STATEMENT NUMBER ! 7916: MOV XL,XR COPY VRBLK POINTER ! 7917: MOV =CH$CL,WA COLON ! 7918: JSR PRTCH PRINT IT ! 7919: MOV =CH$PP,WA LEFT PAREN ! 7920: JSR PRTCH PRINT IT ! 7921: JSR PRTVN PRINT LABEL NAME ! 7922: MOV =CH$RP,WA RIGHT PAREN ! 7923: JSR PRTCH PRINT IT ! 7924: JSR PRTNL TERMINATE LINE ! 7925: MOV VRLBL(XL),XR POINT BACK TO TRBLK ! 7926: * ! 7927: * MERGE HERE TO JUMP TO LABEL ! 7928: * ! 7929: BVRT2 MOV TRLBL(XR),XR LOAD POINTER TO ACTUAL CODE ! 7930: BRI (XR) EXECUTE STATEMENT AT LABEL ! 7931: EJC ! 7932: * ! 7933: * VRBLK (CONTINUED) ! 7934: * ! 7935: * ENTRY FOR VRSTO (TRAPPED CASE). THIS ROUTINE IS CALLED ! 7936: * FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE. ! 7937: * THIS ENTRY IS USED WHEN A VALUE TRACE OR OUTPUT ! 7938: * ASSOCIATION IS CURRENTLY ACTIVE. ! 7939: * ! 7940: * (XR) POINTER TO VRSTO FIELD OF VRBLK ! 7941: * ! 7942: B$VRV ENT ENTRY POINT ! 7943: MOV (XS),WB LOAD VALUE (LEAVE COPY ON STACK) ! 7944: SUB *VRSTO,XR POINT TO VRBLK ! 7945: MOV XR,XL COPY VRBLK POINTER ! 7946: MOV *VRVAL,WA SET OFFSET ! 7947: JSR ASIGN CALL ASSIGNMENT ROUTINE ! 7948: PPM EXFAL FAIL IF ASSIGNMENT FAILS ! 7949: BRN EXITS ELSE RETURN WITH RESULT ON STACK ! 7950: EJC ! 7951: * ! 7952: * XNBLK ! 7953: * ! 7954: * THE ROUTINE FOR AN XNBLK IS NEVER EXECUTED ! 7955: * ! 7956: B$XNT ENT BL$XN ENTRY POINT (XNBLK) ! 7957: EJC ! 7958: * ! 7959: * XRBLK ! 7960: * ! 7961: * THE ROUTINE FOR AN XRBLK IS NEVER EXECUTED ! 7962: * ! 7963: B$XRT ENT BL$XR ENTRY POINT (XRBLK) ! 7964: * ! 7965: * MARK ENTRY ADDRESS PAST LAST BLOCK ACTION ROUTINE ! 7966: * ! 7967: B$YYY ENT BL$$I LAST BLOCK ROUTINE ENTRY POINT ! 7968: TTL S P I T B O L -- PATTERN MATCHING ROUTINES ! 7969: * ! 7970: * THE FOLLOWING SECTION CONSISTS OF THE PATTERN MATCHING ! 7971: * ROUTINES. ALL PATTERN NODES CONTAIN A POINTER (PCODE) ! 7972: * TO ONE OF THE ROUTINES IN THIS SECTION (P$XXX). ! 7973: * ! 7974: * NOTE THAT THIS SECTION FOLLOWS THE B$XXX ROUTINES TO ! 7975: * ENABLE A FAST TEST FOR THE PATTERN DATATYPE. ! 7976: * ! 7977: P$AAA ENT BL$$I ENTRY TO MARK FIRST PATTERN ! 7978: * ! 7979: * ! 7980: * THE ENTRY CONDITIONS TO THE MATCH ROUTINE ARE AS FOLLOWS ! 7981: * (SEE O$PMN, O$PMV, O$PMS AND PROCEDURE MATCH). ! 7982: * ! 7983: * STACK CONTENTS. ! 7984: * ! 7985: * NAME BASE (O$PMN ONLY) ! 7986: * NAME OFFSET (O$PMN ONLY) ! 7987: * TYPE (0-O$PMN, 1-O$PMV, 2-O$PMS) ! 7988: * PMHBS --------------- INITIAL CURSOR (ZERO) ! 7989: * INITIAL NODE POINTER ! 7990: * XS ------------------ =NDABO (ANCHORED), =NDUNA (UNANCH) ! 7991: * ! 7992: * REGISTER VALUES. ! 7993: * ! 7994: * (XS) SET AS SHOWN IN STACK DIAGRAM ! 7995: * (XR) POINTER TO INITIAL PATTERN NODE ! 7996: * (WB) INITIAL CURSOR (ZERO) ! 7997: * ! 7998: * GLOBAL PATTERN VALUES ! 7999: * ! 8000: * R$PMS POINTER TO SUBJECT STRING SCBLK ! 8001: * PMSSL LENGTH OF SUBJECT STRING IN CHARS ! 8002: * PMDFL DOT FLAG, INITIALLY ZERO ! 8003: * PMHBS SET AS SHOWN IN STACK DIAGRAM ! 8004: * ! 8005: * CONTROL IS PASSED BY BRANCHING THROUGH THE PCODE ! 8006: * FIELD OF THE INITIAL PATTERN NODE (BRI (XR)). ! 8007: EJC ! 8008: * ! 8009: * DESCRIPTION OF ALGORITHM ! 8010: * ! 8011: * A PATTERN STRUCTURE IS REPRESENTED AS A LINKED GRAPH ! 8012: * OF NODES WITH THE FOLLOWING STRUCTURE. ! 8013: * ! 8014: * +------------------------------------+ ! 8015: * I PCODE I ! 8016: * +------------------------------------+ ! 8017: * I PTHEN I ! 8018: * +------------------------------------+ ! 8019: * I PARM1 I ! 8020: * +------------------------------------+ ! 8021: * I PARM2 I ! 8022: * +------------------------------------+ ! 8023: * ! 8024: * PCODE IS A POINTER TO THE ROUTINE WHICH WILL PERFORM ! 8025: * THE MATCH OF THIS PARTICULAR NODE TYPE. ! 8026: * ! 8027: * PTHEN IS A POINTER TO THE SUCCESSOR NODE. I.E. THE NODE ! 8028: * TO BE MATCHED IF THE ATTEMPT TO MATCH THIS NODE SUCCEEDS. ! 8029: * IF THIS IS THE LAST NODE OF THE PATTERN PTHEN POINTS ! 8030: * TO THE DUMMY NODE NDNTH WHICH INITIATES PATTERN EXIT. ! 8031: * ! 8032: * PARM1, PARM2 ARE PARAMETERS WHOSE USE VARIES WITH THE ! 8033: * PARTICULAR NODE. THEY ARE ONLY PRESENT IF REQUIRED. ! 8034: * ! 8035: * ALTERNATIVES ARE HANDLED WITH THE SPECIAL ALTERNATIVE ! 8036: * NODE WHOSE PARAMETER POINTS TO THE NODE TO BE MATCHED ! 8037: * IF THERE IS A FAILURE ON THE SUCCESSOR PATH. ! 8038: * ! 8039: * THE FOLLOWING EXAMPLE ILLUSTRATES THE MANNER IN WHICH ! 8040: * THE STRUCTURE IS BUILT UP. THE PATTERN IS ! 8041: * ! 8042: * (A / B / C) (D / E) WHERE / IS ALTERNATION ! 8043: * ! 8044: * IN THE DIAGRAM, THE NODE MARKED + REPRESENTS AN ! 8045: * ALTERNATIVE NODE AND THE DOTTED LINE FROM A + NODE ! 8046: * REPRESENTS THE PARAMETER POINTER TO THE ALTERNATIVE. ! 8047: * ! 8048: * +---+ +---+ +---+ +---+ ! 8049: * I + I-----I A I-----I + I-----I D I----- ! 8050: * +---+ +---+ I +---+ +---+ ! 8051: * . I . ! 8052: * . I . ! 8053: * +---+ +---+ I +---+ ! 8054: * I + I-----I B I--I I E I----- ! 8055: * +---+ +---+ I +---+ ! 8056: * . I ! 8057: * . I ! 8058: * +---+ I ! 8059: * I C I------------I ! 8060: * +---+ ! 8061: EJC ! 8062: * ! 8063: * DURING THE MATCH, THE REGISTERS ARE USED AS FOLLOWS. ! 8064: * ! 8065: * (XR) POINTS TO THE CURRENT NODE ! 8066: * (XL) SCRATCH ! 8067: * (XS) MAIN STACK POINTER ! 8068: * (WB) CURSOR (NUMBER OF CHARS MATCHED) ! 8069: * (WA,WC) SCRATCH ! 8070: * ! 8071: * TO KEEP TRACK OF ALTERNATIVES, THE MAIN STACK IS USED AS ! 8072: * A HISTORY STACK AND CONTAINS TWO WORD ENTRIES. ! 8073: * ! 8074: * WORD 1 SAVED CURSOR VALUE ! 8075: * WORD 2 NODE TO MATCH ON FAILURE ! 8076: * ! 8077: * WHEN A FAILURE OCCURS, THE MOST RECENT ENTRY ON THIS ! 8078: * STACK IS POPPED OFF TO RESTORE THE CURSOR AND POINT ! 8079: * TO THE NODE TO BE MATCHED AS AN ALTERNATIVE. THE ENTRY ! 8080: * AT THE BOTTOM OF THE STACK POINTS TO THE FOLLOWING ! 8081: * SPECIAL NODES DEPENDING ON THE SCAN MODE. ! 8082: * ! 8083: * ANCHORED MODE THE BOTTOM ENTRY POINTS TO THE ! 8084: * SPECIAL NODE NDABO WHICH CAUSES AN ! 8085: * ABORT. THE CURSOR VALUE STORED ! 8086: * WITH THIS ENTRY IS ALWAYS ZERO. ! 8087: * ! 8088: * UNANCHORED MODE THE BOTTOM ENTRY POINTS TO THE ! 8089: * SPECIAL NODE NDUNA WHICH MOVES THE ! 8090: * ANCHOR POINT AND RESTARTS THE MATCH ! 8091: * THE CURSOR SAVED WITH THIS ENTRY ! 8092: * IS THE NUMBER OF CHARACTERS WHICH ! 8093: * LIE BEFORE THE INITIAL ANCHOR POINT ! 8094: * (I.E. THE NUMBER OF ANCHOR MOVES). ! 8095: * THIS ENTRY IS THREE WORDS LONG AND ! 8096: * ALSO CONTAINS THE INITIAL PATTERN. ! 8097: * ! 8098: * ENTRIES ARE MADE ON THIS HISTORY STACK BY ALTERNATIVE ! 8099: * NODES AND BY SOME SPECIAL COMPOUD PATTERNS AS DESCRIBED ! 8100: * LATER ON. THE FOLLOWING GLOBAL LOCATIONS ARE USED DURING ! 8101: * PATTERN MATCHING. ! 8102: * ! 8103: * R$PMS POINTER TO SUBJECT STRING ! 8104: * PMSSL LENGTH OF SUBJECT STRING ! 8105: * PMDFL FLAG SET NON-ZERO FOR DOT PATTERNS ! 8106: * PMHBS BASE PTR FOR CURRENT HISTORY STACK ! 8107: * ! 8108: * THE FOLLOWING EXIT POINTS ARE AVAILABLE TO MATCH ROUTINES ! 8109: * ! 8110: * SUCCP SUCCESS IN MATCHING CURRENT NODE ! 8111: * FAILP FAILURE IN MATCHING CURRENT NODE ! 8112: EJC ! 8113: * ! 8114: * COMPOUND PATTERNS ! 8115: * ! 8116: * SOME PATTERNS HAVE IMPLICIT ALTERNATIVES AND THEIR ! 8117: * REPRESENTATION IN THE PATTERN STRUCTURE CONSISTS OF A ! 8118: * LINKED SET OF NODES AS INDICATED BY THESE DIAGRAMS. ! 8119: * ! 8120: * AS BEFORE, THE + REPRESENTS AN ALTERNATIVE NODE AND ! 8121: * THE DOTTED LINE FROM A + NODE IS THE PARAMETER POINTER ! 8122: * TO THE ALTERNATIVE PATTERN. ! 8123: * ! 8124: * ARB ! 8125: * --- ! 8126: * ! 8127: * +---+ THIS NODE (P$ARB) MATCHES NULL ! 8128: * I B I----- AND STACKS CURSOR, SUCCESSOR PTR, ! 8129: * +---+ CURSOR (COPY) AND A PTR TO NDARC. ! 8130: * ! 8131: * ! 8132: * ! 8133: * ! 8134: * BAL ! 8135: * --- ! 8136: * ! 8137: * +---+ THE P$BAL NODE SCANS A BALANCED ! 8138: * I B I----- STRING AND THEN STACKS A POINTER ! 8139: * +---+ TO ITSELF ON THE HISTORY STACK. ! 8140: EJC ! 8141: * ! 8142: * COMPOUND PATTERN STRUCTURES (CONTINUED) ! 8143: * ! 8144: * ! 8145: * ARBNO ! 8146: * ----- ! 8147: * ! 8148: * +---+ THIS ALTERNATIVE NODE MATCHES NULL ! 8149: * +----I + I----- THE FIRST TIME AND STACKS A POINTER ! 8150: * I +---+ TO THE ARGUMENT PATTERN X. ! 8151: * I . ! 8152: * I . ! 8153: * I +---+ NODE (P$ABA) TO STACK CURSOR ! 8154: * I I A I AND HISTORY STACK BASE PTR. ! 8155: * I +---+ ! 8156: * I I ! 8157: * I I ! 8158: * I +---+ THIS IS THE ARGUMENT PATTERN. AS ! 8159: * I I X I INDICATED, THE SUCCESSOR OF THE ! 8160: * I +---+ PATTERN IS THE P$ABC NODE ! 8161: * I I ! 8162: * I I ! 8163: * I +---+ THIS NODE (P$ABC) POPS PMHBS, ! 8164: * +----I C I STACKS OLD PMHBS AND PTR TO NDABD ! 8165: * +---+ (UNLESS OPTIMISATION HAS OCCURRED) ! 8166: * ! 8167: * STRUCTURE AND EXECUTION OF THIS PATTERN RESEMBLE THOSE OF ! 8168: * RECURSIVE PATTERN MATCHING AND IMMEDIATE ASSIGNMENT. ! 8169: * THE ALTERNATIVE NODE AT THE HEAD OF THE STRUCTURE MATCHES ! 8170: * NULL INITIALLY BUT ON SUBSEQUENT FAILURE ENSURES ATTEMPT ! 8171: * TO MATCH THE ARGUMENT. BEFORE THE ARGUMENT IS MATCHED ! 8172: * P$ABA STACKS THE CURSOR,PMHBS AND A PTR TO P$ABB. IF ! 8173: * THE ARGUMENT CANT BE MATCHED , P$ABB REMOVES THIS SPECIAL ! 8174: * STACK ENTRY AND FAILS. ! 8175: * IF ARGUMENT IS MATCHED , P$ABC RESTORES THE OUTER PMHBS ! 8176: * VALUE (SAVED BY P$ABA) . THEN IF THE ARGUMENT HAS LEFT ! 8177: * ALTERNATIVES ON STACK IT STACKS THE INNER VALUE OF PMHBS ! 8178: * AND A PTR TO NDABD. IF ARGUMENT LEFT NOTHING ON THE STACK ! 8179: * IT OPTIMISES BY REMOVING ITEMS STACKED BY P$ABA. FINALLY ! 8180: * A CHECK IS MADE THAT ARGUMENT MATCHED MORE THAN THE NULL ! 8181: * STRING (CHECK IS INTENDED TO PREVENT USELESS LOOPING). ! 8182: * IF SO THE SUCCESSOR IS AGAIN THE ALTERNATIVE NODE AT THE ! 8183: * HEAD OF THE STRUCTURE , ENSURING A POSSIBLE EXTRA ATTEMPT ! 8184: * TO MATCH THE ARG IF NECESSARY. IF NOT , THE SUCCESSOR TO ! 8185: * ALTERNATIVE IS TAKEN SO AS TO TERMINATE THE LOOP. P$ABD ! 8186: * RESTORES INNER PMHBS PTR AND FAILS , THUS TRYING TO MATCH ! 8187: * ALTERNATIVES LEFT BY THE ARBNO ARGUMENT. ! 8188: EJC ! 8189: * ! 8190: * COMPOUND PATTERN STRUCTURES (CONTINUED) ! 8191: * ! 8192: * BREAKX ! 8193: * ------ ! 8194: * ! 8195: * +---+ THIS NODE IS A BREAK NODE FOR ! 8196: * +----I B I THE ARGUMENT TO BREAKX, IDENTICAL ! 8197: * I +---+ TO AN ORDINARY BREAK NODE. ! 8198: * I I ! 8199: * I I ! 8200: * I +---+ THIS ALTERNATIVE NODE STACKS A ! 8201: * I I + I----- POINTER TO THE BREAKX NODE TO ! 8202: * I +---+ ALLOW FOR SUBSEQUENT FAILURE ! 8203: * I . ! 8204: * I . ! 8205: * I +---+ THIS IS THE BREAKX NODE ITSELF. IT ! 8206: * +----I X I MATCHES ONE CHARACTER AND THEN ! 8207: * +---+ PROCEEDS BACK TO THE BREAK NODE. ! 8208: * ! 8209: * ! 8210: * ! 8211: * ! 8212: * FENCE ! 8213: * ----- ! 8214: * ! 8215: * +---+ THE FENCE NODE MATCHES NULL AND ! 8216: * I F I----- STACKS A POINTER TO NODE NDABO TO ! 8217: * +---+ ABORT ON A SUBSEQUENT REMATCH ! 8218: * ! 8219: * ! 8220: * ! 8221: * ! 8222: * SUCCEED ! 8223: * ------- ! 8224: * ! 8225: * +---+ THE NODE FOR SUCCEED MATCHES NULL ! 8226: * I S I----- AND STACKS A POINTER TO ITSELF ! 8227: * +---+ TO REPEAT THE MATCH ON A FAILURE. ! 8228: EJC ! 8229: * ! 8230: * COMPOUND PATTERNS (CONTINUED) ! 8231: * ! 8232: * BINARY DOT (PATTERN ASSIGNMENT) ! 8233: * ------------------------------- ! 8234: * ! 8235: * +---+ THIS NODE (P$PAA) SAVES THE CURRENT ! 8236: * I A I CURSOR AND A POINTER TO THE ! 8237: * +---+ SPECIAL NODE NDPAB ON THE STACK. ! 8238: * I ! 8239: * I ! 8240: * +---+ THIS IS THE STRUCTURE FOR THE ! 8241: * I X I PATTERN LEFT ARGUMENT OF THE ! 8242: * +---+ PATTERN ASSIGNMENT CALL. ! 8243: * I ! 8244: * I ! 8245: * +---+ THIS NODE (P$PAC) SAVES THE CURSOR, ! 8246: * I C I----- A PTR TO ITSELF, THE CURSOR (COPY) ! 8247: * +---+ AND A PTR TO NDPAD ON THE STACK. ! 8248: * ! 8249: * ! 8250: * THE FUNCTION OF THE MATCH ROUTINE FOR NDPAB (P$PAB) ! 8251: * IS SIMPLY TO UNSTACK ITSELF AND FAIL BACK ONTO THE STACK. ! 8252: * ! 8253: * THE MATCH ROUTINE FOR P$PAC ALSO SETS THE GLOBAL PATTERN ! 8254: * FLAG PMDFL NON-ZERO TO INDICATE THAT PATTERN ASSIGNMENTS ! 8255: * MAY HAVE OCCURED IN THE PATTERN MATCH ! 8256: * ! 8257: * IF PMDFL IS SET AT THE END OF THE MATCH (SEE P$NTH), THE ! 8258: * HISTORY STACK IS SCANNED FOR MATCHING NDPAB-NDPAD PAIRS ! 8259: * AND THE CORRESPONDING PATTERN ASSIGNMENTS ARE EXECUTED. ! 8260: * ! 8261: * THE FUNCTION OF THE MATCH ROUTINE FOR NDPAD (P$PAD) ! 8262: * IS SIMPLY TO REMOVE ITS ENTRY FROM THE STACK AND FAIL. ! 8263: * THIS INCLUDES REMOVING THE SPECIAL NODE POINTER STORED ! 8264: * IN ADDITION TO THE STANDARD TWO ENTRIES ON THE STACK. ! 8265: EJC ! 8266: * ! 8267: * COMPOUNT PATTERN STRUCTURES (CONTINUED) ! 8268: * ! 8269: * FENCE (FUNCTION) ! 8270: * ---------------- ! 8271: * ! 8272: * +---+ THIS NODE (P$FNA) SAVES THE ! 8273: * I A I CURRENT HISTORY STACK AND A ! 8274: * +---+ POINTER TO NDFNB ON THE STACK. ! 8275: * I ! 8276: * I ! 8277: * +---+ THIS IS THE PATTERN STRUCTURE ! 8278: * I X I GIVEN AS THE ARGUMENT TO THE ! 8279: * +---+ FENCE FUNCTION. ! 8280: * I ! 8281: * I ! 8282: * +---+ THIS NODE P$FNC RESTORES THE OUTER ! 8283: * I C I HISTORY STACK PTR SAVED IN P$FNA, ! 8284: * +---+ AND STACKS THE INNER STACK BASE ! 8285: * PTR AND A POINTER TO NDFND ON THE ! 8286: * STACK. ! 8287: * ! 8288: * NDFNB (F$FNB) SIMPLY IS THE FAILURE EXIT FOR PATTERN ! 8289: * ARGUMENT FAILURE, AND IT POPS ITSELF AND FAILS ONTO THE ! 8290: * STACK. ! 8291: * ! 8292: * THE MATCH ROUTINE P$FNC ALLOWS FOR AN OPTIMIZATION WHEN ! 8293: * THE FENCE PATTERN LEAVES NO ALTERNATIVES. IN THIS CASE, ! 8294: * THE NDFNB ENTRY IS POPPED, AND THE MATCH CONTINUES. ! 8295: * ! 8296: * NDFND (P$FND) IS ENTERED WHEN THE PATTERN FAILS AFTER ! 8297: * GOING THROUGH A NON-OPTIMIZED P$FNC, AND IT POPS THE ! 8298: * STACK BACK PAST THE INNTER STACK BASE CREATED BY P$FNA ! 8299: EJC ! 8300: * ! 8301: * COMPOUND PATTERNS (CONTINUED) ! 8302: * ! 8303: * EXPRESSION PATTERNS (RECURSIVE PATTERN MATCHES) ! 8304: * ----------------------------------------------- ! 8305: * ! 8306: * INITIAL ENTRY FOR A PATTERN NODE IS TO THE ROUTINE P$EXA. ! 8307: * IF THE EVALUATED RESULT OF THE EXPRESSION IS ITSELF A ! 8308: * PATTERN, THEN THE FOLLOWING STEPS ARE TAKEN TO ARRANGE ! 8309: * FOR PROPER RECURSIVE PROCESSING. ! 8310: * ! 8311: * 1) A POINTER TO THE CURRENT NODE (THE P$EXA NODE) IS ! 8312: * STORED ON THE HISTORY STACK WITH A DUMMY CURSOR. ! 8313: * ! 8314: * 2) A SPECIAL HISTORY STACK ENTRY IS MADE IN WHICH THE ! 8315: * NODE POINTER POINTS TO NDEXB, AND THE CURSOR VALUE ! 8316: * IS THE SAVED VALUE OF PMHBS ON ENTRY TO THIS NODE. ! 8317: * THE MATCH ROUTINE FOR NDEXB (P$EXB) RESTORES PMHBS ! 8318: * FROM THIS CURSOR ENTRY, POPS OFF THE P$EXA NODE ! 8319: * POINTER AND FAILS. ! 8320: * ! 8321: * 3) THE RESULTING HISTORY STACK POINTER IS SAVED IN ! 8322: * PMHBS TO ESTABLISH A NEW LEVEL OF HISTORY STACK. ! 8323: * ! 8324: * AFTER MATCHING A PATTERN, THE END OF MATCH ROUTINE GETS ! 8325: * CONTROL (P$NTH). THIS ROUTINE PROCEEDS AS FOLLOWS. ! 8326: * ! 8327: * 1) LOAD THE CURRENT VALUE OF PMHBS AND RECOGNIZE THE ! 8328: * OUTER LEVEL CASE BY THE FACT THAT THE ASSOCIATED ! 8329: * CURSOR IN THIS CASE IS THE PATTERN MATCH TYPE CODE ! 8330: * WHICH IS LESS THAN 3. TERMINATE THE MATCH IN THIS ! 8331: * CASE AND CONTINUE EXECUTION OF THE PROGRAM. ! 8332: * ! 8333: * 2) OTHERWISE MAKE A SPECIAL HISTORY STACK ENTRY IN ! 8334: * WHICH THE NODE POINTER POINTS TO THE SPECIAL NODE ! 8335: * NDEXC AND THE CURSOR IS THE CURRENT VALUE OF PMHBS. ! 8336: * THE MATCH ROUTINE FOR NDEXC (P$EXC) RESETS PMHBS TO ! 8337: * THIS (INNER) VALUE AND AND THEN FAILS. ! 8338: * ! 8339: * 3) USING THE HISTORY STACK ENTRY MADE ON STARTING THE ! 8340: * EXPRESSION (ACCESSIBLE WITH THE CURRENT VALUE OF ! 8341: * PMHBS), RESTORE THE P$EXA NODE POINTER AND THE OLD ! 8342: * PMHBS SETTING. TAKE THE SUCCESSOR AND CONTINUE. ! 8343: * ! 8344: * AN OPTIMIZATION IS POSSIBLE IF THE EXPRESSION PATTERN ! 8345: * MAKES NO ENTRIES ON THE HISTORY STACK. IN THIS CASE, ! 8346: * INSTEAD OF BUILDING THE P$EXC NODE IN STEP 2, IT IS MORE ! 8347: * EFFICIENT TO SIMPLY POP OFF THE P$EXB ENTRY AND ITS ! 8348: * ASSOCIATED NODE POINTER. THE EFFECT IS THE SAME. ! 8349: EJC ! 8350: * ! 8351: * COMPOUND PATTERNS (CONTINUED) ! 8352: * ! 8353: * BINARY DOLLAR (IMMEDIATE ASSIGNMENT) ! 8354: * ------------------------------------ ! 8355: * ! 8356: * +---+ THIS NODE (P$IMA) STACKS THE CURSOR ! 8357: * I A I PMHBS AND A PTR TO NDIMB AND RESETS ! 8358: * +---+ THE STACK PTR PMHBS. ! 8359: * I ! 8360: * I ! 8361: * +---+ THIS IS THE LEFT STRUCTURE FOR THE ! 8362: * I X I PATTERN LEFT ARGUMENT OF THE ! 8363: * +---+ IMMEDIATE ASSIGNMENT CALL. ! 8364: * I ! 8365: * I ! 8366: * +---+ THIS NODE (P$IMC) PERFORMS THE ! 8367: * I C I----- ASSIGNMENT, POPS PMHBS AND STACKS ! 8368: * +---+ THE OLD PMHBS AND A PTR TO NDIMD. ! 8369: * ! 8370: * ! 8371: * THE STRUCTURE AND EXECUTION OF THIS PATTERN ARE SIMILAR ! 8372: * TO THOSE OF THE RECURSIVE EXPRESSION PATTERN MATCHING. ! 8373: * ! 8374: * THE MATCH ROUTINE FOR NDIMB (P$IMB) RESTORES THE OUTER ! 8375: * LEVEL VALUE OF PMHBS, UNSTACKS THE SAVED CURSOR AND FAILS ! 8376: * ! 8377: * THE MATCH ROUTINE P$IMC USES THE CURRENT VALUE OF PMHBS ! 8378: * TO LOCATE THE P$IMB ENTRY. THIS ENTRY IS USED TO MAKE ! 8379: * THE ASSIGNMENT AND RESTORE THE OUTER LEVEL VALUE OF ! 8380: * PMHBS. FINALLY, THE INNER LEVEL VALUE OF PMHBS AND A ! 8381: * POINTER TO THE SPECIAL NODE NDIMD ARE STACKED. ! 8382: * ! 8383: * THE MATCH ROUTINE FOR NDIMD (P$IMD) RESTORES THE INNER ! 8384: * LEVEL VALUE OF PMHBS AND FAILS BACK INTO THE STACK. ! 8385: * ! 8386: * AN OPTIMIZATION OCCURS IF THE INNER PATTERN MAKES NO ! 8387: * ENTRIES ON THE HISTORY STACK. IN THIS CASE, P$IMC POPS ! 8388: * THE P$IMB ENTRY INSTEAD OF MAKING A P$IMD ENTRY. ! 8389: EJC ! 8390: * ! 8391: * ARBNO ! 8392: * ! 8393: * SEE COMPOUND PATTERNS SECTION FOR STUCTURE AND ! 8394: * ALGORITHM FOR MATCHING THIS NODE TYPE. ! 8395: * ! 8396: * NO PARAMETERS ! 8397: * ! 8398: P$ABA ENT BL$P0 P0BLK ! 8399: MOV WB,-(XS) STACK CURSOR ! 8400: MOV XR,-(XS) STACK DUMMY NODE PTR ! 8401: MOV PMHBS,-(XS) STACK OLD STACK BASE PTR ! 8402: MOV =NDABB,-(XS) STACK PTR TO NODE NDABB ! 8403: MOV XS,PMHBS STORE NEW STACK BASE PTR ! 8404: BRN SUCCP SUCCEED ! 8405: EJC ! 8406: * ! 8407: * ARBNO (REMOVE P$ABA SPECIAL STACK ENTRY) ! 8408: * ! 8409: * NO PARAMETERS (DUMMY PATTERN) ! 8410: * ! 8411: P$ABB ENT ENTRY POINT ! 8412: MOV WB,PMHBS RESTORE HISTORY STACK BASE PTR ! 8413: BRN FLPOP FAIL AND POP DUMMY NODE PTR ! 8414: EJC ! 8415: * ! 8416: * ARBNO (CHECK IF ARG MATCHED NULL STRING) ! 8417: * ! 8418: * NO PARAMETERS (DUMMY PATTERN) ! 8419: * ! 8420: P$ABC ENT BL$P0 P0BLK ! 8421: MOV PMHBS,XT KEEP P$ABB STACK BASE ! 8422: MOV 3(XT),WA LOAD INITIAL CURSOR ! 8423: MOV 1(XT),PMHBS RESTORE OUTER STACK BASE PTR ! 8424: BEQ XT,XS,PABC1 JUMP IF NO HISTORY STACK ENTRIES ! 8425: MOV XT,-(XS) ELSE SAVE INNER PMHBS ENTRY ! 8426: MOV =NDABD,-(XS) STACK PTR TO SPECIAL NODE NDABD ! 8427: BRN PABC2 MERGE ! 8428: * ! 8429: * OPTIMISE CASE OF NO EXTRA ENTRIES ON STACK FROM ARBNO ARG ! 8430: * ! 8431: PABC1 ADD *NUM04,XS REMOVE NDABB ENTRY AND CURSOR ! 8432: * ! 8433: * MERGE TO CHECK FOR MATCHING OF NULL STRING ! 8434: * ! 8435: PABC2 BNE WA,WB,SUCCP ALLOW FURTHER ATTEMPT IF NON-NULL ! 8436: MOV PTHEN(XR),XR BYPASS ALTERNATIVE NODE SO AS TO .. ! 8437: BRN SUCCP ... REFUSE FURTHER MATCH ATTEMPTS ! 8438: EJC ! 8439: * ! 8440: * ARBNO (TRY FOR ALTERNATIVES IN ARBNO ARGUMENT) ! 8441: * ! 8442: * NO PARAMETERS (DUMMY PATTERN) ! 8443: * ! 8444: P$ABD ENT ENTRY POINT ! 8445: MOV WB,PMHBS RESTORE INNER STACK BASE PTR ! 8446: BRN FAILP AND FAIL ! 8447: EJC ! 8448: * ! 8449: * ABORT ! 8450: * ! 8451: * NO PARAMETERS ! 8452: * ! 8453: P$ABO ENT BL$P0 P0BLK ! 8454: BRN EXFAL SIGNAL STATEMENT FAILURE ! 8455: EJC ! 8456: * ! 8457: * ALTERNATION ! 8458: * ! 8459: * PARM1 ALTERNATIVE NODE ! 8460: * ! 8461: P$ALT ENT BL$P1 P1BLK ! 8462: MOV WB,-(XS) STACK CURSOR ! 8463: MOV PARM1(XR),-(XS) STACK POINTER TO ALTERNATIVE ! 8464: CHK CHECK FOR STACK OVERFLOW ! 8465: BRN SUCCP IF ALL OK, THEN SUCCEED ! 8466: EJC ! 8467: * ! 8468: * ANY (ONE CHARACTER ARGUMENT) (1-CHAR STRING ALSO) ! 8469: * ! 8470: * PARM1 CHARACTER ARGUMENT ! 8471: * ! 8472: P$ANS ENT BL$P1 P1BLK ! 8473: BEQ WB,PMSSL,FAILP FAIL IF NO CHARS LEFT ! 8474: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING ! 8475: PLC XL,WB POINT TO CURRENT CHARACTER ! 8476: LCH WA,(XL) LOAD CURRENT CHARACTER ! 8477: BNE WA,PARM1(XR),FAILP FAIL IF NO MATCH ! 8478: ICV WB ELSE BUMP CURSOR ! 8479: BRN SUCCP AND SUCCEED ! 8480: EJC ! 8481: * ! 8482: * ANY (MULTI-CHARACTER ARGUMENT CASE) ! 8483: * ! 8484: * PARM1 POINTER TO CTBLK ! 8485: * PARM2 BIT MASK TO SELECT BIT IN CTBLK ! 8486: * ! 8487: P$ANY ENT BL$P2 P2BLK ! 8488: * ! 8489: * EXPRESSION ARGUMENT CASE MERGES HERE ! 8490: * ! 8491: PANY1 BEQ WB,PMSSL,FAILP FAIL IF NO CHARACTERS LEFT ! 8492: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING ! 8493: PLC XL,WB GET CHAR PTR TO CURRENT CHARACTER ! 8494: LCH WA,(XL) LOAD CURRENT CHARACTER ! 8495: MOV PARM1(XR),XL POINT TO CTBLK ! 8496: WTB WA CHANGE TO BYTE OFFSET ! 8497: ADD WA,XL POINT TO ENTRY IN CTBLK ! 8498: MOV CTCHS(XL),WA LOAD WORD FROM CTBLK ! 8499: ANB PARM2(XR),WA AND WITH SELECTED BIT ! 8500: ZRB WA,FAILP FAIL IF NO MATCH ! 8501: ICV WB ELSE BUMP CURSOR ! 8502: BRN SUCCP AND SUCCEED ! 8503: EJC ! 8504: * ! 8505: * ANY (EXPRESSION ARGUMENT) ! 8506: * ! 8507: * PARM1 EXPRESSION POINTER ! 8508: * ! 8509: P$AYD ENT BL$P1 P1BLK ! 8510: JSR EVALS EVALUATE STRING ARGUMENT ! 8511: ERR 043,ANY EVALUATED ARGUMENT IS NOT STRING ! 8512: PPM FAILP FAIL IF EVALUATION FAILURE ! 8513: PPM PANY1 MERGE MULTI-CHAR CASE IF OK ! 8514: EJC ! 8515: * ! 8516: * P$ARB INITIAL ARB MATCH ! 8517: * ! 8518: * NO PARAMETERS ! 8519: * ! 8520: * THE P$ARB NODE IS PART OF A COMPOUND PATTERN STRUCTURE ! 8521: * FOR AN ARB PATTERN (SEE DESCRIPTION OF COMPOUND PATTERNS) ! 8522: * ! 8523: P$ARB ENT BL$P0 P0BLK ! 8524: MOV PTHEN(XR),XR LOAD SUCCESSOR POINTER ! 8525: MOV WB,-(XS) STACK DUMMY CURSOR ! 8526: MOV XR,-(XS) STACK SUCCESSOR POINTER ! 8527: MOV WB,-(XS) STACK CURSOR ! 8528: MOV =NDARC,-(XS) STACK PTR TO SPECIAL NODE NDARC ! 8529: BRI (XR) EXECUTE NEXT NODE MATCHING NULL ! 8530: EJC ! 8531: * ! 8532: * P$ARC EXTEND ARB MATCH ! 8533: * ! 8534: * NO PARAMETERS (DUMMY PATTERN) ! 8535: * ! 8536: P$ARC ENT ENTRY POINT ! 8537: BEQ WB,PMSSL,FLPOP FAIL AND POP STACK TO SUCCESSOR ! 8538: ICV WB ELSE BUMP CURSOR ! 8539: MOV WB,-(XS) STACK UPDATED CURSOR ! 8540: MOV XR,-(XS) RESTACK POINTER TO NDARC NODE ! 8541: MOV 2(XS),XR LOAD SUCCESSOR POINTER ! 8542: BRI (XR) OFF TO REEXECUTE SUCCESSOR NODE ! 8543: EJC ! 8544: * ! 8545: * BAL ! 8546: * ! 8547: * NO PARAMETERS ! 8548: * ! 8549: * THE P$BAL NODE IS PART OF THE COMPOUND STRUCTURE BUILT ! 8550: * FOR BAL (SEE SECTION ON COMPOUND PATTERNS). ! 8551: * ! 8552: P$BAL ENT BL$P0 P0BLK ! 8553: ZER WC ZERO PARENTHESES LEVEL COUNTER ! 8554: MOV R$PMS,XL POINT TO SUBJECT STRING ! 8555: PLC XL,WB POINT TO CURRENT CHARACTER ! 8556: BRN PBAL2 JUMP INTO SCAN LOOP ! 8557: * ! 8558: * LOOP TO SCAN OUT CHARACTERS ! 8559: * ! 8560: PBAL1 LCH WA,(XL)+ LOAD NEXT CHARACTER, BUMP POINTER ! 8561: ICV WB PUSH CURSOR FOR CHARACTER ! 8562: BEQ WA,=CH$PP,PBAL3 JUMP IF LEFT PAREN ! 8563: BEQ WA,=CH$RP,PBAL4 JUMP IF RIGHT PAREN ! 8564: BZE WC,PBAL5 ELSE SUCCEED IF AT OUTER LEVEL ! 8565: * ! 8566: * HERE AFTER PROCESSING ONE CHARACTER ! 8567: * ! 8568: PBAL2 BNE WB,PMSSL,PBAL1 LOOP BACK UNLESS END OF STRING ! 8569: BRN FAILP IN WHICH CASE, FAIL ! 8570: * ! 8571: * HERE ON LEFT PAREN ! 8572: * ! 8573: PBAL3 ICV WC BUMP PAREN LEVEL ! 8574: BRN PBAL2 LOOP BACK TO CHECK END OF STRING ! 8575: * ! 8576: * HERE FOR RIGHT PAREN ! 8577: * ! 8578: PBAL4 BZE WC,FAILP FAIL IF NO MATCHING LEFT PAREN ! 8579: DCV WC ELSE DECREMENT LEVEL COUNTER ! 8580: BNZ WC,PBAL2 LOOP BACK IF NOT AT OUTER LEVEL ! 8581: * ! 8582: * HERE AFTER SUCCESSFULLY SCANNING A BALANCED STRING ! 8583: * ! 8584: PBAL5 MOV WB,-(XS) STACK CURSOR ! 8585: MOV XR,-(XS) STACK PTR TO BAL NODE FOR EXTEND ! 8586: BRN SUCCP AND SUCCEED ! 8587: EJC ! 8588: * ! 8589: * BREAK (EXPRESSION ARGUMENT) ! 8590: * ! 8591: * PARM1 EXPRESSION POINTER ! 8592: * ! 8593: P$BKD ENT BL$P1 P1BLK ! 8594: JSR EVALS EVALUATE STRING EXPRESSION ! 8595: ERR 044,BREAK EVALUATED ARGUMENT IS NOT STRING ! 8596: PPM FAILP FAIL IF EVALUATION FAILS ! 8597: PPM PBRK1 MERGE WITH MULTI-CHAR CASE IF OK ! 8598: EJC ! 8599: * ! 8600: * BREAK (ONE CHARACTER ARGUMENT) ! 8601: * ! 8602: * PARM1 CHARACTER ARGUMENT ! 8603: * ! 8604: P$BKS ENT BL$P1 P1BLK ! 8605: MOV PMSSL,WC GET SUBJECT STRING LENGTH ! 8606: SUB WB,WC GET NUMBER OF CHARACTERS LEFT ! 8607: BZE WC,FAILP FAIL IF NO CHARACTERS LEFT ! 8608: LCT WC,WC SET COUNTER FOR CHARS LEFT ! 8609: MOV R$PMS,XL POINT TO SUBJECT STRING ! 8610: PLC XL,WB POINT TO CURRENT CHARACTER ! 8611: * ! 8612: * LOOP TO SCAN TILL BREAK CHARACTER FOUND ! 8613: * ! 8614: PBKS1 LCH WA,(XL)+ LOAD NEXT CHAR, BUMP POINTER ! 8615: BEQ WA,PARM1(XR),SUCCP SUCCEED IF BREAK CHARACTER FOUND ! 8616: ICV WB ELSE PUSH CURSOR ! 8617: BCT WC,PBKS1 LOOP BACK IF MORE TO GO ! 8618: BRN FAILP FAIL IF END OF STRING, NO BREAK CHR ! 8619: EJC ! 8620: * ! 8621: * BREAK (MULTI-CHARACTER ARGUMENT) ! 8622: * ! 8623: * PARM1 POINTER TO CTBLK ! 8624: * PARM2 BIT MASK TO SELECT BIT COLUMN ! 8625: * ! 8626: P$BRK ENT BL$P2 P2BLK ! 8627: * ! 8628: * EXPRESSION ARGUMENT MERGES HERE ! 8629: * ! 8630: PBRK1 MOV PMSSL,WC LOAD SUBJECT STRING LENGTH ! 8631: SUB WB,WC GET NUMBER OF CHARACTERS LEFT ! 8632: BZE WC,FAILP FAIL IF NO CHARACTERS LEFT ! 8633: LCT WC,WC SET COUNTER FOR CHARACTERS LEFT ! 8634: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING ! 8635: PLC XL,WB POINT TO CURRENT CHARACTER ! 8636: MOV XR,PSAVE SAVE NODE POINTER ! 8637: * ! 8638: * LOOP TO SEARCH FOR BREAK CHARACTER ! 8639: * ! 8640: PBRK2 LCH WA,(XL)+ LOAD NEXT CHAR, BUMP POINTER ! 8641: MOV PARM1(XR),XR LOAD POINTER TO CTBLK ! 8642: WTB WA CONVERT TO BYTE OFFSET ! 8643: ADD WA,XR POINT TO CTBLK ENTRY ! 8644: MOV CTCHS(XR),WA LOAD CTBLK WORD ! 8645: MOV PSAVE,XR RESTORE NODE POINTER ! 8646: ANB PARM2(XR),WA AND WITH SELECTED BIT ! 8647: NZB WA,SUCCP SUCCEED IF BREAK CHARACTER FOUND ! 8648: ICV WB ELSE PUSH CURSOR ! 8649: BCT WC,PBRK2 LOOP BACK UNLESS END OF STRING ! 8650: BRN FAILP FAIL IF END OF STRING, NO BREAK CHR ! 8651: EJC ! 8652: * ! 8653: * BREAKX (EXTENSION) ! 8654: * ! 8655: * THIS IS THE ENTRY WHICH CAUSES AN EXTENSION OF A BREAKX ! 8656: * MATCH WHEN FAILURE OCCURS. SEE SECTION ON COMPOUND ! 8657: * PATTERNS FOR FULL DETAILS OF BREAKX MATCHING. ! 8658: * ! 8659: * NO PARAMETERS ! 8660: * ! 8661: P$BKX ENT BL$P0 P0BLK ! 8662: ICV WB STEP CURSOR PAST PREVIOUS BREAK CHR ! 8663: BRN SUCCP SUCCEED TO REMATCH BREAK ! 8664: EJC ! 8665: * ! 8666: * BREAKX (EXPRESSION ARGUMENT) ! 8667: * ! 8668: * SEE SECTION ON COMPOUND PATTERNS FOR FULL STRUCTURE OF ! 8669: * BREAKX PATTERN. THE ACTUAL CHARACTER MATCHING USES A ! 8670: * BREAK NODE. HOWEVER, THE ENTRY FOR THE EXPRESSION ! 8671: * ARGUMENT CASE IS SEPARATED TO GET PROPER ERROR MESSAGES. ! 8672: * ! 8673: * PARM1 EXPRESSION POINTER ! 8674: * ! 8675: P$BXD ENT BL$P1 P1BLK ! 8676: JSR EVALS EVALUATE STRING ARGUMENT ! 8677: ERR 045,BREAKX EVALUATED ARGUMENT IS NOT STRING ! 8678: PPM FAILP FAIL IF EVALUATION FAILS ! 8679: PPM PBRK1 MERGE WITH BREAK IF ALL OK ! 8680: EJC ! 8681: * ! 8682: * CURSOR ASSIGNMENT ! 8683: * ! 8684: * PARM1 NAME BASE ! 8685: * PARM2 NAME OFFSET ! 8686: * ! 8687: P$CAS ENT BL$P2 P2BLK ! 8688: MOV XR,-(XS) SAVE NODE POINTER ! 8689: MOV WB,-(XS) SAVE CURSOR ! 8690: MOV PARM1(XR),XL LOAD NAME BASE ! 8691: MTI WB LOAD CURSOR AS INTEGER ! 8692: MOV PARM2(XR),WB LOAD NAME OFFSET ! 8693: JSR ICBLD GET ICBLK FOR CURSOR VALUE ! 8694: MOV WB,WA MOVE NAME OFFSET ! 8695: MOV XR,WB MOVE VALUE TO ASSIGN ! 8696: JSR ASINP PERFORM ASSIGNMENT ! 8697: PPM FLPOP FAIL ON ASSIGNMENT FAILURE ! 8698: MOV (XS)+,WB ELSE RESTORE CURSOR ! 8699: MOV (XS)+,XR RESTORE NODE POINTER ! 8700: BRN SUCCP AND SUCCEED MATCHING NULL ! 8701: EJC ! 8702: * ! 8703: * EXPRESSION NODE (P$EXA, INITIAL ENTRY) ! 8704: * ! 8705: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 8706: * ALGORITHMS FOR HANDLING EXPRESSION NODES. ! 8707: * ! 8708: * PARM1 EXPRESSION POINTER ! 8709: * ! 8710: P$EXA ENT BL$P1 P1BLK ! 8711: JSR EVALP EVALUATE EXPRESSION ! 8712: PPM FAILP FAIL IF EVALUATION FAILS ! 8713: BLO WA,=P$AAA,PEXA1 JUMP IF RESULT IS NOT A PATTERN ! 8714: * ! 8715: * HERE IF RESULT OF EXPRESSION IS A PATTERN ! 8716: * ! 8717: MOV WB,-(XS) STACK DUMMY CURSOR ! 8718: MOV XR,-(XS) STACK PTR TO P$EXA NODE ! 8719: MOV PMHBS,-(XS) STACK HISTORY STACK BASE PTR ! 8720: MOV =NDEXB,-(XS) STACK PTR TO SPECIAL NODE NDEXB ! 8721: MOV XS,PMHBS STORE NEW STACK BASE POINTER ! 8722: MOV XL,XR COPY NODE POINTER ! 8723: BRI (XR) MATCH FIRST NODE IN EXPRESSION PAT ! 8724: * ! 8725: * HERE IF RESULT OF EXPRESSION IS NOT A PATTERN ! 8726: * ! 8727: PEXA1 BEQ WA,=B$SCL,PEXA2 JUMP IF IT IS ALREADY A STRING ! 8728: MOV XL,-(XS) ELSE STACK RESULT ! 8729: MOV XR,XL SAVE NODE POINTER ! 8730: JSR GTSTG CONVERT RESULT TO STRING ! 8731: ERR 046,EXPRESSION DOES NOT EVALUATE TO PATTERN ! 8732: MOV XR,WC COPY STRING POINTER ! 8733: MOV XL,XR RESTORE NODE POINTER ! 8734: MOV WC,XL COPY STRING POINTER AGAIN ! 8735: * ! 8736: * MERGE HERE WITH STRING POINTER IN XL ! 8737: * ! 8738: PEXA2 BZE SCLEN(XL),SUCCP JUST SUCCEED IF NULL STRING ! 8739: BRN PSTR1 ELSE MERGE WITH STRING CIRCUIT ! 8740: EJC ! 8741: * ! 8742: * EXPRESSION NODE (P$EXB, REMOVE NDEXB ENTRY) ! 8743: * ! 8744: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 8745: * ALGORITHMS FOR HANDLING EXPRESSION NODES. ! 8746: * ! 8747: * NO PARAMETERS (DUMMY PATTERN) ! 8748: * ! 8749: P$EXB ENT ENTRY POINT ! 8750: MOV WB,PMHBS RESTORE OUTER LEVEL STACK POINTER ! 8751: BRN FLPOP FAIL AND POP P$EXA NODE PTR ! 8752: EJC ! 8753: * ! 8754: * EXPRESSION NODE (P$EXC, REMOVE NDEXC ENTRY) ! 8755: * ! 8756: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 8757: * ALGORITHMS FOR HANDLING EXPRESSION NODES. ! 8758: * ! 8759: * NO PARAMETERS (DUMMY PATTERN) ! 8760: * ! 8761: P$EXC ENT ENTRY POINT ! 8762: MOV WB,PMHBS RESTORE INNER STACK BASE POINTER ! 8763: BRN FAILP AND FAIL INTO EXPR PATTERN ALTERNVS ! 8764: EJC ! 8765: * ! 8766: * FAIL ! 8767: * ! 8768: * NO PARAMETERS ! 8769: * ! 8770: P$FAL ENT BL$P0 P0BLK ! 8771: BRN FAILP JUST SIGNAL FAILURE ! 8772: EJC ! 8773: * ! 8774: * FENCE ! 8775: * ! 8776: * SEE COMPOUND PATTERNS SECTION FOR THE STRUCTURE AND ! 8777: * ALGORITHM FOR MATCHING THIS NODE TYPE. ! 8778: * ! 8779: * NO PARAMETERS ! 8780: * ! 8781: P$FEN ENT BL$P0 P0BLK ! 8782: MOV WB,-(XS) STACK DUMMY CURSOR ! 8783: MOV =NDABO,-(XS) STACK PTR TO ABORT NODE ! 8784: BRN SUCCP AND SUCCEED MATCHING NULL ! 8785: EJC ! 8786: * ! 8787: * FENCE (FUNCTION) ! 8788: * ! 8789: * SEE COMPOUND PATTERNS COMMENTS AT START OF THIS SECTION ! 8790: * FOR DETAILS OF SCHEME ! 8791: * ! 8792: * NO PARAMETERS ! 8793: * ! 8794: P$FNA ENT BL$P0 P0BLK ! 8795: MOV PMHBS,-(XS) STACK CURRENT HISTORY STACK BASE ! 8796: MOV =NDFNB,-(XS) STACK INDIR PTR TO P$FNB (FAILURE) ! 8797: MOV XS,PMHBS BEGIN NEW HISTORY STACK ! 8798: BRN SUCCP SUCCEED ! 8799: EJC ! 8800: * ! 8801: * FENCE (FUNCTION) (RESET HISTORY STACK AND FAIL) ! 8802: * ! 8803: * NO PARAMETERS (DUMMY PATTERN) ! 8804: * ! 8805: P$FNB ENT BL$P0 P0BLK ! 8806: MOV WB,PMHBS RESTORE OUTER PMHBS STACK BASE ! 8807: BRN FAILP ...AND FAIL ! 8808: EJC ! 8809: * ! 8810: * FENCE (FUNCTION) (MAKE FENCE TRAP ENTRY ON STACK) ! 8811: * ! 8812: * NO PARAMETERS (DUMMY PATTERN) ! 8813: * ! 8814: P$FNC ENT BL$P0 P0BLK ! 8815: MOV PMHBS,XT GET INNER STACK BASE PTR ! 8816: MOV NUM01(XT),PMHBS RESTORE OUTER STACK BASE ! 8817: BEQ XT,XS,PFNC1 OPTIMIZE IF NO ALTERNATIVES ! 8818: MOV XT,-(XS) ELSE STACK INNER STACK BASE ! 8819: MOV =NDFND,-(XS) STACK PTR TO NDFND ! 8820: BRN SUCCP SUCCEED ! 8821: * ! 8822: * HERE WHEN FENCE FUNCTION LEFT NOTHING ON THE STACK ! 8823: * ! 8824: PFNC1 ADD *NUM02,XS POP OFF P$FNB ENTRY ! 8825: BRN SUCCP SUCCEED ! 8826: EJC ! 8827: * ! 8828: * FENCE (FUNCTION) (SKIP PAST ALTERNATIVES ON FAILURE) ! 8829: * ! 8830: * NO PARAMETERS (DUMMY PATTERN) ! 8831: * ! 8832: P$FND ENT BL$P0 P0BLK ! 8833: MOV WB,XS POP STACK TO FENCE() HISTORY BASE ! 8834: BRN FLPOP POP BASE ENTRY AND FAIL ! 8835: EJC ! 8836: * ! 8837: * IMMEDIATE ASSIGNMENT (INITIAL ENTRY, SAVE CURRENT CURSOR) ! 8838: * ! 8839: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE ! 8840: * STRUCTURE AND ALGORITHM FOR MATCHING THIS NODE TYPE. ! 8841: * ! 8842: * NO PARAMETERS ! 8843: * ! 8844: P$IMA ENT BL$P0 P0BLK ! 8845: MOV WB,-(XS) STACK CURSOR ! 8846: MOV XR,-(XS) STACK DUMMY NODE POINTER ! 8847: MOV PMHBS,-(XS) STACK OLD STACK BASE POINTER ! 8848: MOV =NDIMB,-(XS) STACK PTR TO SPECIAL NODE NDIMB ! 8849: MOV XS,PMHBS STORE NEW STACK BASE POINTER ! 8850: BRN SUCCP AND SUCCEED ! 8851: EJC ! 8852: * ! 8853: * IMMEDIATE ASSIGNMENT (REMOVE CURSOR MARK ENTRY) ! 8854: * ! 8855: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE ! 8856: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 8857: * ! 8858: * NO PARAMETERS (DUMMY PATTERN) ! 8859: * ! 8860: P$IMB ENT ENTRY POINT ! 8861: MOV WB,PMHBS RESTORE HISTORY STACK BASE PTR ! 8862: BRN FLPOP FAIL AND POP DUMMY NODE PTR ! 8863: EJC ! 8864: * ! 8865: * IMMEDIATE ASSIGNMENT (PERFORM ACTUAL ASSIGNMENT) ! 8866: * ! 8867: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE ! 8868: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 8869: * ! 8870: * PARM1 NAME BASE OF VARIABLE ! 8871: * PARM2 NAME OFFSET OF VARIABLE ! 8872: * ! 8873: P$IMC ENT BL$P2 P2BLK ! 8874: MOV PMHBS,XT LOAD POINTER TO P$IMB ENTRY ! 8875: MOV WB,WA COPY FINAL CURSOR ! 8876: MOV 3(XT),WB LOAD INITIAL CURSOR ! 8877: MOV 1(XT),PMHBS RESTORE OUTER STACK BASE POINTER ! 8878: BEQ XT,XS,PIMC1 JUMP IF NO HISTORY STACK ENTRIES ! 8879: MOV XT,-(XS) ELSE SAVE INNER PMHBS POINTER ! 8880: MOV =NDIMD,-(XS) AND A PTR TO SPECIAL NODE NDIMD ! 8881: BRN PIMC2 MERGE ! 8882: * ! 8883: * HERE IF NO ENTRIES MADE ON HISTORY STACK ! 8884: * ! 8885: PIMC1 ADD *NUM04,XS REMOVE NDIMB ENTRY AND CURSOR ! 8886: * ! 8887: * MERGE HERE TO PERFORM ASSIGNMENT ! 8888: * ! 8889: PIMC2 MOV WA,-(XS) SAVE CURRENT (FINAL) CURSOR ! 8890: MOV XR,-(XS) SAVE CURRENT NODE POINTER ! 8891: MOV R$PMS,XL POINT TO SUBJECT STRING ! 8892: SUB WB,WA COMPUTE SUBSTRING LENGTH ! 8893: JSR SBSTR BUILD SUBSTRING ! 8894: MOV XR,WB MOVE RESULT ! 8895: MOV (XS),XR RELOAD NODE POINTER ! 8896: MOV PARM1(XR),XL LOAD NAME BASE ! 8897: MOV PARM2(XR),WA LOAD NAME OFFSET ! 8898: JSR ASINP PERFORM ASSIGNMENT ! 8899: PPM FLPOP FAIL IF ASSIGNMENT FAILS ! 8900: MOV (XS)+,XR ELSE RESTORE NODE POINTER ! 8901: MOV (XS)+,WB RESTORE CURSOR ! 8902: BRN SUCCP AND SUCCEED ! 8903: EJC ! 8904: * ! 8905: * IMMEDIATE ASSIGNMENT (REMOVE NDIMD ENTRY ON FAILURE) ! 8906: * ! 8907: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE ! 8908: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 8909: * ! 8910: * NO PARAMETERS (DUMMY PATTERN) ! 8911: * ! 8912: P$IMD ENT ENTRY POINT ! 8913: MOV WB,PMHBS RESTORE INNER STACK BASE POINTER ! 8914: BRN FAILP AND FAIL ! 8915: EJC ! 8916: * ! 8917: * LEN (INTEGER ARGUMENT) ! 8918: * ! 8919: * PARM1 INTEGER ARGUMENT ! 8920: * ! 8921: P$LEN ENT BL$P1 P1BLK ! 8922: * ! 8923: * EXPRESSION ARGUMENT CASE MERGES HERE ! 8924: * ! 8925: PLEN1 ADD PARM1(XR),WB PUSH CURSOR INDICATED AMOUNT ! 8926: BLE WB,PMSSL,SUCCP SUCCEED IF NOT OFF END ! 8927: BRN FAILP ELSE FAIL ! 8928: EJC ! 8929: * ! 8930: * LEN (EXPRESSION ARGUMENT) ! 8931: * ! 8932: * PARM1 EXPRESSION POINTER ! 8933: * ! 8934: P$LND ENT BL$P1 P1BLK ! 8935: JSR EVALI EVALUATE INTEGER ARGUMENT ! 8936: ERR 047,LEN EVALUATED ARGUMENT IS NOT INTEGER ! 8937: ERR 048,LEN EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE ! 8938: PPM FAILP FAIL IF EVALUATION FAILS ! 8939: PPM PLEN1 MERGE WITH NORMAL CIRCUIT IF OK ! 8940: EJC ! 8941: * ! 8942: * NOTANY (EXPRESSION ARGUMENT) ! 8943: * ! 8944: * PARM1 EXPRESSION POINTER ! 8945: * ! 8946: P$NAD ENT BL$P1 P1BLK ! 8947: JSR EVALS EVALUATE STRING ARGUMENT ! 8948: ERR 049,NOTANY EVALUATED ARGUMENT IS NOT STRING ! 8949: PPM FAILP FAIL IF EVALUATION FAILS ! 8950: PPM PNAY1 MERGE WITH MULTI-CHAR CASE IF OK ! 8951: EJC ! 8952: * ! 8953: * NOTANY (ONE CHARACTER ARGUMENT) ! 8954: * ! 8955: * PARM1 CHARACTER ARGUMENT ! 8956: * ! 8957: P$NAS ENT BL$P1 ENTRY POINT ! 8958: BEQ WB,PMSSL,FAILP FAIL IF NO CHARS LEFT ! 8959: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING ! 8960: PLC XL,WB POINT TO CURRENT CHARACTER IN STRIN ! 8961: LCH WA,(XL) LOAD CURRENT CHARACTER ! 8962: BEQ WA,PARM1(XR),FAILP FAIL IF MATCH ! 8963: ICV WB ELSE BUMP CURSOR ! 8964: BRN SUCCP AND SUCCEED ! 8965: EJC ! 8966: * ! 8967: * NOTANY (MULTI-CHARACTER STRING ARGUMENT) ! 8968: * ! 8969: * PARM1 POINTER TO CTBLK ! 8970: * PARM2 BIT MASK TO SELECT BIT COLUMN ! 8971: * ! 8972: P$NAY ENT BL$P2 P2BLK ! 8973: * ! 8974: * EXPRESSION ARGUMENT CASE MERGES HERE ! 8975: * ! 8976: PNAY1 BEQ WB,PMSSL,FAILP FAIL IF NO CHARACTERS LEFT ! 8977: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING ! 8978: PLC XL,WB POINT TO CURRENT CHARACTER ! 8979: LCH WA,(XL) LOAD CURRENT CHARACTER ! 8980: WTB WA CONVERT TO BYTE OFFSET ! 8981: MOV PARM1(XR),XL LOAD POINTER TO CTBLK ! 8982: ADD WA,XL POINT TO ENTRY IN CTBLK ! 8983: MOV CTCHS(XL),WA LOAD ENTRY FROM CTBLK ! 8984: ANB PARM2(XR),WA AND WITH SELECTED BIT ! 8985: NZB WA,FAILP FAIL IF CHARACTER IS MATCHED ! 8986: ICV WB ELSE BUMP CURSOR ! 8987: BRN SUCCP AND SUCCEED ! 8988: EJC ! 8989: * ! 8990: * END OF PATTERN MATCH ! 8991: * ! 8992: * THIS ROUTINE IS ENTERED ON SUCCESSFUL COMPLETION. ! 8993: * SEE DESCRIPTION OF EXPRESSION PATTERNS IN COMPOUND ! 8994: * PATTERN SECTION FOR HANDLING OF RECURSION IN MATCHING. ! 8995: * ! 8996: * NO PARAMETERS (DUMMY PATTERN) ! 8997: * ! 8998: P$NTH ENT ENTRY POINT ! 8999: MOV PMHBS,XT LOAD POINTER TO BASE OF STACK ! 9000: MOV 1(XT),WA LOAD SAVED PMHBS (OR PATTERN TYPE) ! 9001: BLE WA,=NUM02,PNTH2 JUMP IF OUTER LEVEL (PATTERN TYPE) ! 9002: * ! 9003: * HERE WE ARE AT THE END OF MATCHING AN EXPRESSION PATTERN ! 9004: * ! 9005: MOV WA,PMHBS RESTORE OUTER STACK BASE POINTER ! 9006: MOV 2(XT),XR RESTORE POINTER TO P$EXA NODE ! 9007: BEQ XT,XS,PNTH1 JUMP IF NO HISTORY STACK ENTRIES ! 9008: MOV XT,-(XS) ELSE STACK INNER STACK BASE PTR ! 9009: MOV =NDEXC,-(XS) STACK PTR TO SPECIAL NODE NDEXC ! 9010: BRN SUCCP AND SUCCEED ! 9011: * ! 9012: * HERE IF NO HISTORY STACK ENTRIES DURING PATTERN ! 9013: * ! 9014: PNTH1 ADD *NUM04,XS REMOVE P$EXB ENTRY AND NODE PTR ! 9015: BRN SUCCP AND SUCCEED ! 9016: * ! 9017: * HERE IF END OF MATCH AT OUTER LEVEL ! 9018: * ! 9019: PNTH2 MOV WB,PMSSL SAVE FINAL CURSOR IN SAFE PLACE ! 9020: BZE PMDFL,PNTH6 JUMP IF NO PATTERN ASSIGNMENTS ! 9021: EJC ! 9022: * ! 9023: * END OF PATTERN MATCH (CONTINUED) ! 9024: * ! 9025: * NOW WE MUST PERFORM PATTERN ASSIGNMENTS. THIS IS DONE BY ! 9026: * SCANNING THE HISTORY STACK FOR MATCHING NDPAB-NDPAD PAIRS ! 9027: * ! 9028: PNTH3 DCA XT POINT PAST CURSOR ENTRY ! 9029: MOV -(XT),WA LOAD NODE POINTER ! 9030: BEQ WA,=NDPAD,PNTH4 JUMP IF NDPAD ENTRY ! 9031: BNE WA,=NDPAB,PNTH5 JUMP IF NOT NDPAB ENTRY ! 9032: * ! 9033: * HERE FOR NDPAB ENTRY, STACK INITIAL CURSOR ! 9034: * NOTE THAT THERE MUST BE MORE ENTRIES ON THE STACK. ! 9035: * ! 9036: MOV 1(XT),-(XS) STACK INITIAL CURSOR ! 9037: CHK CHECK FOR STACK OVERFLOW ! 9038: BRN PNTH3 LOOP BACK IF OK ! 9039: * ! 9040: * HERE FOR NDPAD ENTRY. THE STARTING CURSOR FROM THE ! 9041: * MATCHING NDPAD ENTRY IS NOW THE TOP STACK ENTRY. ! 9042: * ! 9043: PNTH4 MOV 1(XT),WA LOAD FINAL CURSOR ! 9044: MOV (XS),WB LOAD INITIAL CURSOR FROM STACK ! 9045: MOV XT,(XS) SAVE HISTORY STACK SCAN PTR ! 9046: SUB WB,WA COMPUTE LENGTH OF STRING ! 9047: * ! 9048: * BUILD SUBSTRING AND PERFORM ASSIGNMENT ! 9049: * ! 9050: MOV R$PMS,XL POINT TO SUBJECT STRING ! 9051: JSR SBSTR CONSTRUCT SUBSTRING ! 9052: MOV XR,WB COPY SUBSTRING POINTER ! 9053: MOV (XS),XT RELOAD HISTORY STACK SCAN PTR ! 9054: MOV 2(XT),XL LOAD POINTER TO P$PAC NODE WITH NAM ! 9055: MOV PARM2(XL),WA LOAD NAME OFFSET ! 9056: MOV PARM1(XL),XL LOAD NAME BASE ! 9057: JSR ASINP PERFORM ASSIGNMENT ! 9058: PPM EXFAL MATCH FAILS IF NAME EVAL FAILS ! 9059: MOV (XS)+,XT ELSE RESTORE HISTORY STACK PTR ! 9060: EJC ! 9061: * ! 9062: * END OF PATTERN MATCH (CONTINUED) ! 9063: * ! 9064: * HERE CHECK FOR END OF ENTRIES ! 9065: * ! 9066: PNTH5 BNE XT,XS,PNTH3 LOOP IF MORE ENTRIES TO SCAN ! 9067: * ! 9068: * HERE AFTER DEALING WITH PATTERN ASSIGNMENTS ! 9069: * ! 9070: PNTH6 MOV PMHBS,XS WIPE OUT HISTORY STACK ! 9071: MOV (XS)+,WB LOAD INITIAL CURSOR ! 9072: MOV (XS)+,WC LOAD MATCH TYPE CODE ! 9073: MOV PMSSL,WA LOAD FINAL CURSOR VALUE ! 9074: MOV R$PMS,XL POINT TO SUBJECT STRING ! 9075: ZER R$PMS CLEAR SUBJECT STRING PTR FOR GBCOL ! 9076: BZE WC,PNTH7 JUMP IF CALL BY NAME ! 9077: BEQ WC,=NUM02,EXITS EXIT IF STATEMENT LEVEL CALL ! 9078: * ! 9079: * HERE WE HAVE A CALL BY VALUE, BUILD SUBSTRING ! 9080: * ! 9081: SUB WB,WA COMPUTE LENGTH OF STRING ! 9082: JSR SBSTR BUILD SUBSTRING ! 9083: BRN EXIXR AND EXIT WITH SUBSTRING VALUE ! 9084: * ! 9085: * HERE FOR CALL BY NAME, MAKE STACK ENTRIES FOR O$RPL ! 9086: * ! 9087: PNTH7 MOV WB,-(XS) STACK INITIAL CURSOR ! 9088: MOV WA,-(XS) STACK FINAL CURSOR ! 9089: BZE R$PMB,PNTH8 SKIP IF SUBJECT NOT BUFFER ! 9090: MOV R$PMB,XL ELSE GET PTR TO BCBLK INSTEAD ! 9091: * ! 9092: * HERE WITH XL POINTING TO SCBLK OR BCBLK ! 9093: * ! 9094: PNTH8 MOV XL,-(XS) STACK SUBJECT POINTER ! 9095: BRN EXITS EXIT WITH SPECIAL ENTRY ON STACK ! 9096: EJC ! 9097: * ! 9098: * POS (INTEGER ARGUMENT) ! 9099: * ! 9100: * PARM1 INTEGER ARGUMENT ! 9101: * ! 9102: P$POS ENT BL$P1 P1BLK ! 9103: * ! 9104: * EXPRESSION ARGUMENT CASE MERGES HERE ! 9105: * ! 9106: PPOS1 BEQ WB,PARM1(XR),SUCCP SUCCEED IF AT RIGHT LOCATION ! 9107: BRN FAILP ELSE FAIL ! 9108: EJC ! 9109: * ! 9110: * POS (EXPRESSION ARGUMENT) ! 9111: * ! 9112: * PARM1 EXPRESSION POINTER ! 9113: * ! 9114: P$PSD ENT BL$P1 P1BLK ! 9115: JSR EVALI EVALUATE INTEGER ARGUMENT ! 9116: ERR 050,POS EVALUATED ARGUMENT IS NOT INTEGER ! 9117: ERR 051,POS EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE ! 9118: PPM FAILP FAIL IF EVALUATION FAILS ! 9119: PPM PPOS1 MERGE WITH NORMAL CASE IF OK ! 9120: EJC ! 9121: * ! 9122: * PATTERN ASSIGNMENT (INITIAL ENTRY, SAVE CURSOR) ! 9123: * ! 9124: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 9125: * ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 9126: * ! 9127: * NO PARAMETERS ! 9128: * ! 9129: P$PAA ENT BL$P0 P0BLK ! 9130: MOV WB,-(XS) STACK INITIAL CURSOR ! 9131: MOV =NDPAB,-(XS) STACK PTR TO NDPAB SPECIAL NODE ! 9132: BRN SUCCP AND SUCCEED MATCHING NULL ! 9133: EJC ! 9134: * ! 9135: * PATTERN ASSIGNMENT (REMOVE SAVED CURSOR) ! 9136: * ! 9137: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 9138: * ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 9139: * ! 9140: * NO PARAMETERS (DUMMY PATTERN) ! 9141: * ! 9142: P$PAB ENT ENTRY POINT ! 9143: BRN FAILP JUST FAIL (ENTRY IS ALREADY POPPED) ! 9144: EJC ! 9145: * ! 9146: * PATTERN ASSIGNMENT (END OF MATCH, MAKE ASSIGN ENTRY) ! 9147: * ! 9148: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 9149: * ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 9150: * ! 9151: * PARM1 NAME BASE OF VARIABLE ! 9152: * PARM2 NAME OFFSET OF VARIABLE ! 9153: * ! 9154: P$PAC ENT BL$P2 P2BLK ! 9155: MOV WB,-(XS) STACK DUMMY CURSOR VALUE ! 9156: MOV XR,-(XS) STACK POINTER TO P$PAC NODE ! 9157: MOV WB,-(XS) STACK FINAL CURSOR ! 9158: MOV =NDPAD,-(XS) STACK PTR TO SPECIAL NDPAD NODE ! 9159: MNZ PMDFL SET DOT FLAG NON-ZERO ! 9160: BRN SUCCP AND SUCCEED ! 9161: EJC ! 9162: * ! 9163: * PATTERN ASSIGNMENT (REMOVE ASSIGN ENTRY) ! 9164: * ! 9165: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 9166: * ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 9167: * ! 9168: * NO PARAMETERS (DUMMY NODE) ! 9169: * ! 9170: P$PAD ENT ENTRY POINT ! 9171: BRN FLPOP FAIL AND REMOVE P$PAC NODE ! 9172: EJC ! 9173: * ! 9174: * REM ! 9175: * ! 9176: * NO PARAMETERS ! 9177: * ! 9178: P$REM ENT BL$P0 P0BLK ! 9179: MOV PMSSL,WB POINT CURSOR TO END OF STRING ! 9180: BRN SUCCP AND SUCCEED ! 9181: EJC ! 9182: * ! 9183: * RPOS (EXPRESSION ARGUMENT) ! 9184: * ! 9185: * PARM1 EXPRESSION POINTER ! 9186: * ! 9187: P$RPD ENT BL$P1 P1BLK ! 9188: JSR EVALI EVALUATE INTEGER ARGUMENT ! 9189: ERR 052,RPOS EVALUATED ARGUMENT IS NOT INTEGER ! 9190: ERR 053,RPOS EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE ! 9191: PPM FAILP FAIL IF EVALUATION FAILS ! 9192: PPM PRPS1 MERGE WITH NORMAL CASE IF OK ! 9193: EJC ! 9194: * ! 9195: * RPOS (INTEGER ARGUMENT) ! 9196: * ! 9197: * PARM1 INTEGER ARGUMENT ! 9198: * ! 9199: P$RPS ENT BL$P1 P1BLK ! 9200: * ! 9201: * EXPRESSION ARGUMENT CASE MERGES HERE ! 9202: * ! 9203: PRPS1 MOV PMSSL,WC GET LENGTH OF STRING ! 9204: SUB WB,WC GET NUMBER OF CHARACTERS REMAINING ! 9205: BEQ WC,PARM1(XR),SUCCP SUCCEED IF AT RIGHT LOCATION ! 9206: BRN FAILP ELSE FAIL ! 9207: EJC ! 9208: * ! 9209: * RTAB (INTEGER ARGUMENT) ! 9210: * ! 9211: * PARM1 INTEGER ARGUMENT ! 9212: * ! 9213: P$RTB ENT BL$P1 P1BLK ! 9214: * ! 9215: * EXPRESSION ARGUMENT CASE MERGES HERE ! 9216: * ! 9217: PRTB1 MOV WB,WC SAVE INITIAL CURSOR ! 9218: MOV PMSSL,WB POINT TO END OF STRING ! 9219: BLT WB,PARM1(XR),FAILP FAIL IF STRING NOT LONG ENOUGH ! 9220: SUB PARM1(XR),WB ELSE SET NEW CURSOR ! 9221: BGE WB,WC,SUCCP AND SUCCEED IF NOT TOO FAR ALREADY ! 9222: BRN FAILP IN WHICH CASE, FAIL ! 9223: EJC ! 9224: * ! 9225: * RTAB (EXPRESSION ARGUMENT) ! 9226: * ! 9227: * PARM1 EXPRESSION POINTER ! 9228: * ! 9229: P$RTD ENT BL$P1 P1BLK ! 9230: JSR EVALI EVALUATE INTEGER ARGUMENT ! 9231: ERR 054,RTAB EVALUATED ARGUMENT IS NOT INTEGER ! 9232: ERR 055,RTAB EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE ! 9233: PPM FAILP FAIL IF EVALUATION FAILS ! 9234: PPM PRTB1 MERGE WITH NORMAL CASE IF SUCCESS ! 9235: EJC ! 9236: * ! 9237: * SPAN (EXPRESSION ARGUMENT) ! 9238: * ! 9239: * PARM1 EXPRESSION POINTER ! 9240: * ! 9241: P$SPD ENT BL$P1 P1BLK ! 9242: JSR EVALS EVALUATE STRING ARGUMENT ! 9243: ERR 056,SPAN EVALUATED ARGUMENT IS NOT STRING ! 9244: PPM FAILP FAIL IF EVALUATION FAILS ! 9245: PPM PSPN1 MERGE WITH MULTI-CHAR CASE IF OK ! 9246: EJC ! 9247: * ! 9248: * SPAN (MULTI-CHARACTER ARGUMENT CASE) ! 9249: * ! 9250: * PARM1 POINTER TO CTBLK ! 9251: * PARM2 BIT MASK TO SELECT BIT COLUMN ! 9252: * ! 9253: P$SPN ENT BL$P2 P2BLK ! 9254: * ! 9255: * EXPRESSION ARGUMENT CASE MERGES HERE ! 9256: * ! 9257: PSPN1 MOV PMSSL,WC COPY SUBJECT STRING LENGTH ! 9258: SUB WB,WC CALCULATE NUMBER OF CHARACTERS LEFT ! 9259: BZE WC,FAILP FAIL IF NO CHARACTERS LEFT ! 9260: MOV R$PMS,XL POINT TO SUBJECT STRING ! 9261: PLC XL,WB POINT TO CURRENT CHARACTER ! 9262: MOV WB,PSAVC SAVE INITIAL CURSOR ! 9263: MOV XR,PSAVE SAVE NODE POINTER ! 9264: LCT WC,WC SET COUNTER FOR CHARS LEFT ! 9265: * ! 9266: * LOOP TO SCAN MATCHING CHARACTERS ! 9267: * ! 9268: PSPN2 LCH WA,(XL)+ LOAD NEXT CHARACTER, BUMP POINTER ! 9269: WTB WA CONVERT TO BYTE OFFSET ! 9270: MOV PARM1(XR),XR POINT TO CTBLK ! 9271: ADD WA,XR POINT TO CTBLK ENTRY ! 9272: MOV CTCHS(XR),WA LOAD CTBLK ENTRY ! 9273: MOV PSAVE,XR RESTORE NODE POINTER ! 9274: ANB PARM2(XR),WA AND WITH SELECTED BIT ! 9275: ZRB WA,PSPN3 JUMP IF NO MATCH ! 9276: ICV WB ELSE PUSH CURSOR ! 9277: BCT WC,PSPN2 LOOP BACK UNLESS END OF STRING ! 9278: * ! 9279: * HERE AFTER SCANNING MATCHING CHARACTERS ! 9280: * ! 9281: PSPN3 BNE WB,PSAVC,SUCCP SUCCEED IF CHARS MATCHED ! 9282: BRN FAILP ELSE FAIL IF NULL STRING MATCHED ! 9283: EJC ! 9284: * ! 9285: * SPAN (ONE CHARACTER ARGUMENT) ! 9286: * ! 9287: * PARM1 CHARACTER ARGUMENT ! 9288: * ! 9289: P$SPS ENT BL$P1 P1BLK ! 9290: MOV PMSSL,WC GET SUBJECT STRING LENGTH ! 9291: SUB WB,WC CALCULATE NUMBER OF CHARACTERS LEFT ! 9292: BZE WC,FAILP FAIL IF NO CHARACTERS LEFT ! 9293: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING ! 9294: PLC XL,WB POINT TO CURRENT CHARACTER ! 9295: MOV WB,PSAVC SAVE INITIAL CURSOR ! 9296: LCT WC,WC SET COUNTER FOR CHARACTERS LEFT ! 9297: * ! 9298: * LOOP TO SCAN MATCHING CHARACTERS ! 9299: * ! 9300: PSPS1 LCH WA,(XL)+ LOAD NEXT CHARACTER, BUMP POINTER ! 9301: BNE WA,PARM1(XR),PSPS2 JUMP IF NO MATCH ! 9302: ICV WB ELSE PUSH CURSOR ! 9303: BCT WC,PSPS1 AND LOOP UNLESS END OF STRING ! 9304: * ! 9305: * HERE AFTER SCANNING MATCHING CHARACTERS ! 9306: * ! 9307: PSPS2 BNE WB,PSAVC,SUCCP SUCCEED IF CHARS MATCHED ! 9308: BRN FAILP FAIL IF NULL STRING MATCHED ! 9309: EJC ! 9310: * ! 9311: * MULTI-CHARACTER STRING ! 9312: * ! 9313: * NOTE THAT ONE CHARACTER STRINGS USE THE CIRCUIT FOR ! 9314: * ONE CHARACTER ANY ARGUMENTS (P$AN1). ! 9315: * ! 9316: * PARM1 POINTER TO SCBLK FOR STRING ARG ! 9317: * ! 9318: P$STR ENT BL$P1 P1BLK ! 9319: MOV PARM1(XR),XL GET POINTER TO STRING ! 9320: * ! 9321: * MERGE HERE AFTER EVALUATING EXPRESSION WITH STRING VALUE ! 9322: * ! 9323: PSTR1 MOV XR,PSAVE SAVE NODE POINTER ! 9324: MOV R$PMS,XR LOAD SUBJECT STRING POINTER ! 9325: PLC XR,WB POINT TO CURRENT CHARACTER ! 9326: ADD SCLEN(XL),WB COMPUTE NEW CURSOR POSITION ! 9327: BGT WB,PMSSL,FAILP FAIL IF PAST END OF STRING ! 9328: MOV WB,PSAVC SAVE UPDATED CURSOR ! 9329: MOV SCLEN(XL),WA GET NUMBER OF CHARS TO COMPARE ! 9330: PLC XL POINT TO CHARS OF TEST STRING ! 9331: CMC FAILP,FAILP COMPARE, FAIL IF NOT EQUAL ! 9332: MOV PSAVE,XR IF ALL MATCHED, RESTORE NODE PTR ! 9333: MOV PSAVC,WB RESTORE UPDATED CURSOR ! 9334: BRN SUCCP AND SUCCEED ! 9335: EJC ! 9336: * ! 9337: * SUCCEED ! 9338: * ! 9339: * SEE SECTION ON COMPOUND PATTERNS FOR DETAILS OF THE ! 9340: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE ! 9341: * ! 9342: * NO PARAMETERS ! 9343: * ! 9344: P$SUC ENT BL$P0 P0BLK ! 9345: MOV WB,-(XS) STACK CURSOR ! 9346: MOV XR,-(XS) STACK POINTER TO THIS NODE ! 9347: BRN SUCCP SUCCEED MATCHING NULL ! 9348: EJC ! 9349: * ! 9350: * TAB (INTEGER ARGUMENT) ! 9351: * ! 9352: * PARM1 INTEGER ARGUMENT ! 9353: * ! 9354: P$TAB ENT BL$P1 P1BLK ! 9355: * ! 9356: * EXPRESSION ARGUMENT CASE MERGES HERE ! 9357: * ! 9358: PTAB1 BGT WB,PARM1(XR),FAILP FAIL IF TOO FAR ALREADY ! 9359: MOV PARM1(XR),WB ELSE SET NEW CURSOR POSITION ! 9360: BLE WB,PMSSL,SUCCP SUCCEED IF NOT OFF END ! 9361: BRN FAILP ELSE FAIL ! 9362: EJC ! 9363: * ! 9364: * TAB (EXPRESSION ARGUMENT) ! 9365: * ! 9366: * PARM1 EXPRESSION POINTER ! 9367: * ! 9368: P$TBD ENT BL$P1 P1BLK ! 9369: JSR EVALI EVALUATE INTEGER ARGUMENT ! 9370: ERR 057,TAB EVALUATED ARGUMENT IS NOT INTEGER ! 9371: ERR 058,TAB EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE ! 9372: PPM FAILP FAIL IF EVALUATION FAILS ! 9373: PPM PTAB1 MERGE WITH NORMAL CASE IF OK ! 9374: EJC ! 9375: * ! 9376: * ANCHOR MOVEMENT ! 9377: * ! 9378: * NO PARAMETERS (DUMMY NODE) ! 9379: * ! 9380: P$UNA ENT ENTRY POINT ! 9381: MOV WB,XR COPY INITIAL PATTERN NODE POINTER ! 9382: MOV (XS),WB GET INITIAL CURSOR ! 9383: BEQ WB,PMSSL,EXFAL MATCH FAILS IF AT END OF STRING ! 9384: ICV WB ELSE INCREMENT CURSOR ! 9385: MOV WB,(XS) STORE INCREMENTED CURSOR ! 9386: MOV XR,-(XS) RESTACK INITIAL NODE PTR ! 9387: MOV =NDUNA,-(XS) RESTACK UNANCHORED NODE ! 9388: BRI (XR) REMATCH FIRST NODE ! 9389: EJC ! 9390: * ! 9391: * END OF PATTERN MATCH ROUTINES ! 9392: * ! 9393: * THE FOLLOWING ENTRY POINT MARKS THE END OF THE PATTERN ! 9394: * MATCHING ROUTINES AND ALSO THE END OF THE ENTRY POINTS ! 9395: * REFERENCED FROM THE FIRST WORD OF BLOCKS IN DYNAMIC STORE ! 9396: * ! 9397: P$YYY ENT BL$$I MARK LAST ENTRY IN PATTERN SECTION ! 9398: TTL S P I T B O L -- PREDEFINED SNOBOL4 FUNCTIONS ! 9399: * ! 9400: * THE FOLLOWING SECTION CONTAINS CODING FOR FUNCTIONS ! 9401: * WHICH ARE PREDEFINED AND AVAILABLE AT THE SNOBOL LEVEL. ! 9402: * ! 9403: * THESE ROUTINES RECEIVE CONTROL DIRECTLY FROM THE CODE OR ! 9404: * INDIRECTLY THROUGH THE O$FNC, O$FNS OR CFUNC ROUTINES. ! 9405: * IN BOTH CASES THE CONDITIONS ON ENTRY ARE AS FOLLOWS ! 9406: * ! 9407: * THE ARGUMENTS ARE ON THE STACK. THE NUMBER OF ARGUMENTS ! 9408: * HAS BEEN ADJUSTED TO CORRESPOND TO THE SVBLK SVNAR FIELD. ! 9409: * ! 9410: * IN CERTAIN FUNCTIONS THE DIRECT CALL IS NOT PERMITTED ! 9411: * AND IN THESE INSTANCES WE ALSO HAVE. ! 9412: * ! 9413: * (WA) ACTUAL NUMBER OF ARGUMENTS IN CALL ! 9414: * ! 9415: * CONTROL RETURNS BY PLACING THE FUNCTION RESULT VALUE ON ! 9416: * ON THE STACK AND CONTINUING EXECUTION WITH THE NEXT ! 9417: * WORD FROM THE GENERATED CODE. ! 9418: * ! 9419: * THE NAMES OF THE ENTRY POINTS OF THESE FUNCTIONS ARE OF ! 9420: * THE FORM S$XXX WHERE XXX IS THE THREE LETTER CODE FOR ! 9421: * THE SYSTEM VARIABLE NAME. THE FUNCTIONS ARE IN ORDER ! 9422: * ALPHABETICALLY BY THEIR ENTRY NAMES. ! 9423: EJC ! 9424: * ! 9425: * ANY ! 9426: * ! 9427: S$ANY ENT ENTRY POINT ! 9428: MOV =P$ANS,WB SET PCODE FOR SINGLE CHAR CASE ! 9429: MOV =P$ANY,XL PCODE FOR MULTI-CHAR CASE ! 9430: MOV =P$AYD,WC PCODE FOR EXPRESSION CASE ! 9431: JSR PATST CALL COMMON ROUTINE TO BUILD NODE ! 9432: ERR 059,ANY ARGUMENT IS NOT STRING OR EXPRESSION ! 9433: BRN EXIXR JUMP FOR NEXT CODE WORD ! 9434: EJC ! 9435: * ! 9436: * APPEND ! 9437: * ! 9438: S$APN ENT ENTRY POINT ! 9439: MOV (XS)+,XL GET APPEND ARGUMENT ! 9440: MOV (XS)+,XR GET BCBLK ! 9441: BEQ (XR),=B$BCT,SAPN1 OK IF FIRST ARG IS BCBLK ! 9442: ERB 275,APPEND FIRST ARGUMENT IS NOT BUFFER ! 9443: * ! 9444: * HERE TO DO THE APPEND ! 9445: * ! 9446: SAPN1 JSR APNDB DO THE APPEND ! 9447: ERR 276,APPEND SECOND ARGUMENT IS NOT STRING ! 9448: PPM EXFAL NO ROOM - FAIL ! 9449: BRN EXNUL EXIT WITH NULL RESULT ! 9450: EJC ! 9451: * ! 9452: * APPLY ! 9453: * ! 9454: * APPLY DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT ! 9455: * WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED. ! 9456: * ! 9457: S$APP ENT ENTRY POINT ! 9458: BZE WA,SAPP3 JUMP IF NO ARGUMENTS ! 9459: DCV WA ELSE GET APPLIED FUNC ARG COUNT ! 9460: MOV WA,WB COPY ! 9461: WTB WB CONVERT TO BYTES ! 9462: MOV XS,XT COPY STACK POINTER ! 9463: ADD WB,XT POINT TO FUNCTION ARGUMENT ON STACK ! 9464: MOV (XT),XR LOAD FUNCTION PTR (APPLY 1ST ARG) ! 9465: BZE WA,SAPP2 JUMP IF NO ARGS FOR APPLIED FUNC ! 9466: LCT WB,WA ELSE SET COUNTER FOR LOOP ! 9467: * ! 9468: * LOOP TO MOVE ARGUMENTS UP ON STACK ! 9469: * ! 9470: SAPP1 DCA XT POINT TO NEXT ARGUMENT ! 9471: MOV (XT),1(XT) MOVE ARGUMENT UP ! 9472: BCT WB,SAPP1 LOOP TILL ALL MOVED ! 9473: * ! 9474: * MERGE HERE TO CALL FUNCTION (WA = NUMBER OF ARGUMENTS) ! 9475: * ! 9476: SAPP2 ICA XS ADJUST STACK PTR FOR APPLY 1ST ARG ! 9477: JSR GTNVR GET VARIABLE BLOCK ADDR FOR FUNC ! 9478: PPM SAPP3 JUMP IF NOT NATURAL VARIABLE ! 9479: MOV VRFNC(XR),XL ELSE POINT TO FUNCTION BLOCK ! 9480: BRN CFUNC GO CALL APPLIED FUNCTION ! 9481: * ! 9482: * HERE FOR INVALID FIRST ARGUMENT ! 9483: * ! 9484: SAPP3 ERB 060,APPLY FIRST ARG IS NOT NATURAL VARIABLE NAME ! 9485: EJC ! 9486: * ! 9487: * ARBNO ! 9488: * ! 9489: * ARBNO BUILDS A COMPOUND PATTERN. SEE DESCRIPTION AT ! 9490: * START OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED. ! 9491: * ! 9492: S$ABN ENT ENTRY POINT ! 9493: ZER XR SET PARM1 = 0 FOR THE MOMENT ! 9494: MOV =P$ALT,WB SET PCODE FOR ALTERNATIVE NODE ! 9495: JSR PBILD BUILD ALTERNATIVE NODE ! 9496: MOV XR,XL SAVE PTR TO ALTERNATIVE PATTERN ! 9497: MOV =P$ABC,WB PCODE FOR P$ABC ! 9498: ZER XR P0BLK ! 9499: JSR PBILD BUILD P$ABC NODE ! 9500: MOV XL,PTHEN(XR) PUT ALTERNATIVE NODE AS SUCCESSOR ! 9501: MOV XL,WA REMEMBER ALTERNATIVE NODE POINTER ! 9502: MOV XR,XL COPY P$ABC NODE PTR ! 9503: MOV (XS),XR LOAD ARBNO ARGUMENT ! 9504: MOV WA,(XS) STACK ALTERNATIVE NODE POINTER ! 9505: JSR GTPAT GET ARBNO ARGUMENT AS PATTERN ! 9506: ERR 061,ARBNO ARGUMENT IS NOT PATTERN ! 9507: JSR PCONC CONCAT ARG WITH P$ABC NODE ! 9508: MOV XR,XL REMEMBER PTR TO CONCD PATTERNS ! 9509: MOV =P$ABA,WB PCODE FOR P$ABA ! 9510: ZER XR P0BLK ! 9511: JSR PBILD BUILD P$ABA NODE ! 9512: MOV XL,PTHEN(XR) CONCATENATE NODES ! 9513: MOV (XS),XL RECALL PTR TO ALTERNATIVE NODE ! 9514: MOV XR,PARM1(XL) POINT ALTERNATIVE BACK TO ARGUMENT ! 9515: BRN EXITS JUMP FOR NEXT CODE WORD ! 9516: EJC ! 9517: * ! 9518: * ARG ! 9519: * ! 9520: S$ARG ENT ENTRY POINT ! 9521: JSR GTSMI GET SECOND ARG AS SMALL INTEGER ! 9522: ERR 062,ARG SECOND ARGUMENT IS NOT INTEGER ! 9523: PPM EXFAL FAIL IF OUT OF RANGE OR NEGATIVE ! 9524: MOV XR,WA SAVE ARGUMENT NUMBER ! 9525: MOV (XS)+,XR LOAD FIRST ARGUMENT ! 9526: JSR GTNVR LOCATE VRBLK ! 9527: PPM SARG1 JUMP IF NOT NATURAL VARIABLE ! 9528: MOV VRFNC(XR),XR ELSE LOAD FUNCTION BLOCK POINTER ! 9529: BNE (XR),=B$PFC,SARG1 JUMP IF NOT PROGRAM DEFINED ! 9530: BZE WA,EXFAL FAIL IF ARG NUMBER IS ZERO ! 9531: BGT WA,FARGS(XR),EXFAL FAIL IF ARG NUMBER IS TOO LARGE ! 9532: WTB WA ELSE CONVERT TO BYTE OFFSET ! 9533: ADD WA,XR POINT TO ARGUMENT SELECTED ! 9534: MOV PFAGB(XR),XR LOAD ARGUMENT VRBLK POINTER ! 9535: BRN EXVNM EXIT TO BUILD NMBLK ! 9536: * ! 9537: * HERE IF 1ST ARGUMENT IS BAD ! 9538: * ! 9539: SARG1 ERB 063,ARG FIRST ARGUMENT IS NOT PROGRAM FUNCTION NAME ! 9540: EJC ! 9541: * ! 9542: * ARRAY ! 9543: * ! 9544: S$ARR ENT ENTRY POINT ! 9545: MOV (XS)+,XL LOAD INITIAL ELEMENT VALUE ! 9546: MOV (XS)+,XR LOAD FIRST ARGUMENT ! 9547: JSR GTINT CONVERT FIRST ARG TO INTEGER ! 9548: PPM SAR02 JUMP IF NOT INTEGER ! 9549: * ! 9550: * HERE FOR INTEGER FIRST ARGUMENT, BUILD VCBLK ! 9551: * ! 9552: LDI ICVAL(XR) LOAD INTEGER VALUE ! 9553: ILE SAR10 JUMP IF ZERO OR NEG (BAD DIMENSION) ! 9554: MFI WA,SAR11 ELSE CONVERT TO ONE WORD, TEST OVFL ! 9555: LCT WB,WA COPY ELEMENTS FOR LOOP LATER ON ! 9556: ADD =VCSI$,WA ADD SPACE FOR STANDARD FIELDS ! 9557: WTB WA CONVERT LENGTH TO BYTES ! 9558: BGE WA,MXLEN,SAR11 FAIL IF TOO LARGE ! 9559: JSR ALLOC ALLOCATE SPACE FOR VCBLK ! 9560: MOV =B$VCT,(XR) STORE TYPE WORD ! 9561: MOV WA,VCLEN(XR) SET LENGTH ! 9562: MOV XL,WC COPY DEFAULT VALUE ! 9563: MOV XR,XL COPY VCBLK POINTER ! 9564: ADD *VCVLS,XL POINT TO FIRST ELEMENT VALUE ! 9565: * ! 9566: * LOOP TO SET VECTOR ELEMENTS TO DEFAULT VALUE ! 9567: * ! 9568: SAR01 MOV WC,(XL)+ STORE ONE VALUE ! 9569: BCT WB,SAR01 LOOP TILL ALL STORED ! 9570: BRN EXSID EXIT SETTING IDVAL ! 9571: EJC ! 9572: * ! 9573: * ARRAY (CONTINUED) ! 9574: * ! 9575: * HERE IF FIRST ARGUMENT IS NOT AN INTEGER ! 9576: * ! 9577: SAR02 MOV XR,-(XS) REPLACE ARGUMENT ON STACK ! 9578: JSR XSCNI INITIALIZE SCAN OF FIRST ARGUMENT ! 9579: ERR 064,ARRAY FIRST ARGUMENT IS NOT INTEGER OR STRING ! 9580: PPM EXNUL DUMMY (UNUSED) NULL STRING EXIT ! 9581: MOV R$XSC,-(XS) SAVE PROTOTYPE POINTER ! 9582: MOV XL,-(XS) SAVE DEFAULT VALUE ! 9583: ZER ARCDM ZERO COUNT OF DIMENSIONS ! 9584: ZER ARPTR ZERO OFFSET TO INDICATE PASS ONE ! 9585: LDI INTV1 LOAD INTEGER ONE ! 9586: STI ARNEL INITIALIZE ELEMENT COUNT ! 9587: * ! 9588: * THE FOLLOWING CODE IS EXECUTED TWICE. THE FIRST TIME ! 9589: * (ARPTR EQ 0), IT IS USED TO COUNT THE NUMBER OF ELEMENTS ! 9590: * AND NUMBER OF DIMENSIONS. THE SECOND TIME (ARPTR GT 0) IS ! 9591: * USED TO ACTUALLY FILL IN THE DIM,LBD FIELDS OF THE ARBLK. ! 9592: * ! 9593: SAR03 LDI INTV1 LOAD ONE AS DEFAULT LOW BOUND ! 9594: STI ARSVL SAVE AS LOW BOUND ! 9595: MOV =CH$CL,WC SET DELIMITER ONE = COLON ! 9596: MOV =CH$CM,XL SET DELIMITER TWO = COMMA ! 9597: JSR XSCAN SCAN NEXT BOUND ! 9598: BNE WA,=NUM01,SAR04 JUMP IF NOT COLON ! 9599: * ! 9600: * HERE WE HAVE A COLON ENDING A LOW BOUND ! 9601: * ! 9602: JSR GTINT CONVERT LOW BOUND ! 9603: ERR 065,ARRAY FIRST ARGUMENT LOWER BOUND IS NOT INTEGER ! 9604: LDI ICVAL(XR) LOAD VALUE OF LOW BOUND ! 9605: STI ARSVL STORE LOW BOUND VALUE ! 9606: MOV =CH$CM,WC SET DELIMITER ONE = COMMA ! 9607: MOV WC,XL AND DELIMITER TWO = COMMA ! 9608: JSR XSCAN SCAN HIGH BOUND ! 9609: EJC ! 9610: * ! 9611: * ARRAY (CONTINUED) ! 9612: * ! 9613: * MERGE HERE TO PROCESS UPPER BOUND ! 9614: * ! 9615: SAR04 JSR GTINT CONVERT HIGH BOUND TO INTEGER ! 9616: ERR 066,ARRAY FIRST ARGUMENT UPPER BOUND IS NOT INTEGER ! 9617: LDI ICVAL(XR) GET HIGH BOUND ! 9618: SBI ARSVL SUBTRACT LOWER BOUND ! 9619: IOV SAR10 BAD DIMENSION IF OVERFLOW ! 9620: ILT SAR10 BAD DIMENSION IF NEGATIVE ! 9621: ADI INTV1 ADD 1 TO GET DIMENSION ! 9622: IOV SAR10 BAD DIMENSION IF OVERFLOW ! 9623: MOV ARPTR,XL LOAD OFFSET (ALSO PASS INDICATOR) ! 9624: BZE XL,SAR05 JUMP IF FIRST PASS ! 9625: * ! 9626: * HERE IN SECOND PASS TO STORE LBD AND DIM IN ARBLK ! 9627: * ! 9628: ADD (XS),XL POINT TO CURRENT LOCATION IN ARBLK ! 9629: STI CFP$I(XL) STORE DIMENSION ! 9630: LDI ARSVL LOAD LOW BOUND ! 9631: STI (XL) STORE LOW BOUND ! 9632: ADD *ARDMS,ARPTR BUMP OFFSET TO NEXT BOUNDS ! 9633: BRN SAR06 JUMP TO CHECK FOR END OF BOUNDS ! 9634: * ! 9635: * HERE IN PASS 1 ! 9636: * ! 9637: SAR05 ICV ARCDM BUMP DIMENSION COUNT ! 9638: MLI ARNEL MULTIPLY DIMENSION BY COUNT SO FAR ! 9639: IOV SAR11 TOO LARGE IF OVERFLOW ! 9640: STI ARNEL ELSE STORE UPDATED ELEMENT COUNT ! 9641: * ! 9642: * MERGE HERE AFTER PROCESSING ONE SET OF BOUNDS ! 9643: * ! 9644: SAR06 BNZ WA,SAR03 LOOP BACK UNLESS END OF BOUNDS ! 9645: BNZ ARPTR,SAR09 JUMP IF END OF PASS 2 ! 9646: EJC ! 9647: * ! 9648: * ARRAY (CONTINUED) ! 9649: * ! 9650: * HERE AT END OF PASS ONE, BUILD ARBLK ! 9651: * ! 9652: LDI ARNEL GET NUMBER OF ELEMENTS ! 9653: MFI WB,SAR11 GET AS ADDR INTEGER, TEST OVFLO ! 9654: WTB WB ELSE CONVERT TO LENGTH IN BYTES ! 9655: MOV *ARSI$,WA SET SIZE OF STANDARD FIELDS ! 9656: LCT WC,ARCDM SET DIMENSION COUNT TO CONTROL LOOP ! 9657: * ! 9658: * LOOP TO ALLOW SPACE FOR DIMENSIONS ! 9659: * ! 9660: SAR07 ADD *ARDMS,WA ALLOW SPACE FOR ONE SET OF BOUNDS ! 9661: BCT WC,SAR07 LOOP BACK TILL ALL ACCOUNTED FOR ! 9662: MOV WA,XL SAVE SIZE (=AROFS) ! 9663: * ! 9664: * NOW ALLOCATE SPACE FOR ARBLK ! 9665: * ! 9666: ADD WB,WA ADD SPACE FOR ELEMENTS ! 9667: ICA WA ALLOW FOR ARPRO PROTOTYPE FIELD ! 9668: BGE WA,MXLEN,SAR11 FAIL IF TOO LARGE ! 9669: JSR ALLOC ELSE ALLOCATE ARBLK ! 9670: MOV (XS),WB LOAD DEFAULT VALUE ! 9671: MOV XR,(XS) SAVE ARBLK POINTER ! 9672: MOV WA,WC SAVE LENGTH IN BYTES ! 9673: BTW WA CONVERT LENGTH BACK TO WORDS ! 9674: LCT WA,WA SET COUNTER TO CONTROL LOOP ! 9675: * ! 9676: * LOOP TO CLEAR ENTIRE ARBLK TO DEFAULT VALUE ! 9677: * ! 9678: SAR08 MOV WB,(XR)+ SET ONE WORD ! 9679: BCT WA,SAR08 LOOP TILL ALL SET ! 9680: EJC ! 9681: * ! 9682: * ARRAY (CONTINUED) ! 9683: * ! 9684: * NOW SET INITIAL FIELDS OF ARBLK ! 9685: * ! 9686: MOV (XS)+,XR RELOAD ARBLK POINTER ! 9687: MOV (XS),WB LOAD PROTOTYPE ! 9688: MOV =B$ART,(XR) SET TYPE WORD ! 9689: MOV WC,ARLEN(XR) STORE LENGTH IN BYTES ! 9690: ZER IDVAL(XR) ZERO ID TILL WE GET IT BUILT ! 9691: MOV XL,AROFS(XR) SET PROTOTYPE FIELD PTR ! 9692: MOV ARCDM,ARNDM(XR) SET NUMBER OF DIMENSIONS ! 9693: MOV XR,WC SAVE ARBLK POINTER ! 9694: ADD XL,XR POINT TO PROTOTYPE FIELD ! 9695: MOV WB,(XR) STORE PROTOTYPE PTR IN ARBLK ! 9696: MOV *ARLBD,ARPTR SET OFFSET FOR PASS 2 BOUNDS SCAN ! 9697: MOV WB,R$XSC RESET STRING POINTER FOR XSCAN ! 9698: MOV WC,(XS) STORE ARBLK POINTER ON STACK ! 9699: ZER XSOFS RESET OFFSET PTR TO START OF STRING ! 9700: BRN SAR03 JUMP BACK TO RESCAN BOUNDS ! 9701: * ! 9702: * HERE AFTER FILLING IN BOUNDS INFORMATION (END PASS TWO) ! 9703: * ! 9704: SAR09 MOV (XS)+,XR RELOAD POINTER TO ARBLK ! 9705: BRN EXSID EXIT SETTING IDVAL ! 9706: * ! 9707: * HERE FOR BAD DIMENSION ! 9708: * ! 9709: SAR10 ERB 067,ARRAY DIMENSION IS ZERO,NEGATIVE OR OUT OF RANGE ! 9710: * ! 9711: * HERE IF ARRAY IS TOO LARGE ! 9712: * ! 9713: SAR11 ERB 068,ARRAY SIZE EXCEEDS MAXIMUM PERMITTED ! 9714: EJC ! 9715: * ! 9716: * BUFFER ! 9717: * ! 9718: S$BUF ENT ENTRY POINT ! 9719: MOV (XS)+,XL GET INITIAL VALUE ! 9720: MOV (XS)+,XR GET REQUESTED ALLOCATION ! 9721: JSR GTINT CONVERT TO INTEGER ! 9722: ERR 269,BUFFER FIRST ARGUMENT IS NOT INTEGER ! 9723: LDI ICVAL(XR) GET VALUE ! 9724: ILE SBF01 BRANCH IF NEGATIVE OR ZERO ! 9725: MFI WA,SBF02 MOVE WITH OVERFLOW CHECK ! 9726: JSR ALOBF ALLOCATE THE BUFFER ! 9727: JSR APNDB COPY IT IN ! 9728: ERR 270,BUFFER SECOND ARGUMENT IS NOT STRING OR BUFFER ! 9729: ERR 271,BUFFER INITIAL VALUE TOO BIG FOR ALLOCATION ! 9730: BRN EXSID EXIT SETTING IDVAL ! 9731: * ! 9732: * HERE FOR INVALID ALLOCATION SIZE ! 9733: * ! 9734: SBF01 ERB 272,BUFFER FIRST ARGUMENT IS NOT POSITIVE ! 9735: * ! 9736: * HERE FOR ALLOCATION SIZE INTEGER OVERFLOW ! 9737: * ! 9738: SBF02 ERB 273,BUFFER SIZE IS TOO BIG ! 9739: EJC ! 9740: * ! 9741: * BREAK ! 9742: * ! 9743: S$BRK ENT ENTRY POINT ! 9744: MOV =P$BKS,WB SET PCODE FOR SINGLE CHAR CASE ! 9745: MOV =P$BRK,XL PCODE FOR MULTI-CHAR CASE ! 9746: MOV =P$BKD,WC PCODE FOR EXPRESSION CASE ! 9747: JSR PATST CALL COMMON ROUTINE TO BUILD NODE ! 9748: ERR 069,BREAK ARGUMENT IS NOT STRING OR EXPRESSION ! 9749: BRN EXIXR JUMP FOR NEXT CODE WORD ! 9750: EJC ! 9751: * ! 9752: * BREAKX ! 9753: * ! 9754: * BREAKX IS A COMPOUND PATTERN. SEE DESCRIPTION AT START ! 9755: * OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED. ! 9756: * ! 9757: S$BKX ENT ENTRY POINT ! 9758: MOV =P$BKS,WB PCODE FOR SINGLE CHAR ARGUMENT ! 9759: MOV =P$BRK,XL PCODE FOR MULTI-CHAR ARGUMENT ! 9760: MOV =P$BXD,WC PCODE FOR EXPRESSION CASE ! 9761: JSR PATST CALL COMMON ROUTINE TO BUILD NODE ! 9762: ERR 070,BREAKX ARGUMENT IS NOT STRING OR EXPRESSION ! 9763: * ! 9764: * NOW HOOK BREAKX NODE ON AT FRONT END ! 9765: * ! 9766: MOV XR,-(XS) SAVE PTR TO BREAK NODE ! 9767: MOV =P$BKX,WB SET PCODE FOR BREAKX NODE ! 9768: JSR PBILD BUILD IT ! 9769: MOV (XS),PTHEN(XR) SET BREAK NODE AS SUCCESSOR ! 9770: MOV =P$ALT,WB SET PCODE FOR ALTERNATION NODE ! 9771: JSR PBILD BUILD (PARM1=ALT=BREAKX NODE) ! 9772: MOV XR,WA SAVE PTR TO ALTERNATION NODE ! 9773: MOV (XS),XR POINT TO BREAK NODE ! 9774: MOV WA,PTHEN(XR) SET ALTERNATE NODE AS SUCCESSOR ! 9775: BRN EXITS EXIT WITH RESULT ON STACK ! 9776: EJC ! 9777: * ! 9778: * CHAR ! 9779: * ! 9780: S$CHR ENT ENTRY POINT ! 9781: JSR GTSMI CONVERT ARG TO INTEGER ! 9782: ERR 281,CHAR ARGUMENT NOT INTEGER ! 9783: PPM SCHR1 TOO BIG ERROR EXIT ! 9784: BGE WC,=CFP$A,SCHR1 SEE IF OUT OF RANGE OF HOST SET ! 9785: MOV =NUM01,WA IF NOT SET SCBLK ALLOCATION ! 9786: MOV WC,WB SAVE CHAR CODE ! 9787: JSR ALOCS ALLOCATE 1 BAU SCBLK ! 9788: MOV XR,XL COPY SCBLK POINTER ! 9789: PSC XL GET SET TO STUFF CHAR ! 9790: SCH WB,(XL)+ STUFF IT ! 9791: ZER XL CLEAR SLOP IN XL ! 9792: BRN EXIXR EXIT WITH SCBLK POINTER ! 9793: * ! 9794: * HERE IF CHAR ARGUMENT IS OUT OF RANGE ! 9795: * ! 9796: SCHR1 ERB 282,CHAR ARGUMENT NOT IN RANGE ! 9797: EJC ! 9798: * ! 9799: * CLEAR ! 9800: * ! 9801: S$CLR ENT ENTRY POINT ! 9802: JSR XSCNI INITIALIZE TO SCAN ARGUMENT ! 9803: ERR 071,CLEAR ARGUMENT IS NOT STRING ! 9804: PPM SCLR2 JUMP IF NULL ! 9805: * ! 9806: * LOOP TO SCAN OUT NAMES IN FIRST ARGUMENT. VARIABLES IN ! 9807: * THE LIST ARE FALGGED BY SETTING VRGET OF VRBLK TO ZERO. ! 9808: * ! 9809: SCLR1 MOV =CH$CM,WC SET DELIMITER ONE = COMMA ! 9810: MOV WC,XL DELIMITER TWO = COMMA ! 9811: JSR XSCAN SCAN NEXT VARIABLE NAME ! 9812: JSR GTNVR LOCATE VRBLK ! 9813: ERR 072,CLEAR ARGUMENT HAS NULL VARIABLE NAME ! 9814: ZER VRGET(XR) ELSE FLAG BY ZEROING VRGET FIELD ! 9815: BNZ WA,SCLR1 LOOP BACK IF STOPPED BY COMMA ! 9816: * ! 9817: * HERE AFTER FLAGGING VARIABLES IN ARGUMENT LIST ! 9818: * ! 9819: SCLR2 MOV HSHTB,WB POINT TO START OF HASH TABLE ! 9820: * ! 9821: * LOOP THROUGH SLOTS IN HASH TABLE ! 9822: * ! 9823: SCLR3 BEQ WB,HSHTE,EXNUL EXIT RETURNING NULL IF NONE LEFT ! 9824: MOV WB,XR ELSE COPY SLOT POINTER ! 9825: ICA WB BUMP SLOT POINTER ! 9826: SUB *VRNXT,XR SET OFFSET TO MERGE INTO LOOP ! 9827: * ! 9828: * LOOP THROUGH VRBLKS ON ONE HASH CHAIN ! 9829: * ! 9830: SCLR4 MOV VRNXT(XR),XR POINT TO NEXT VRBLK ON CHAIN ! 9831: BZE XR,SCLR3 JUMP FOR NEXT BUCKET IF CHAIN END ! 9832: BNZ VRGET(XR),SCLR5 JUMP IF NOT FLAGGED ! 9833: EJC ! 9834: * ! 9835: * CLEAR (CONTINUED) ! 9836: * ! 9837: * HERE FOR FLAGGED VARIABLE, DO NOT SET VALUE TO NULL ! 9838: * ! 9839: JSR SETVR FOR FLAGGED VAR, RESTORE VRGET ! 9840: BRN SCLR4 AND LOOP BACK FOR NEXT VRBLK ! 9841: * ! 9842: * HERE TO SET VALUE OF A VARIABLE TO NULL ! 9843: * PRROTECTED VARIABLES (ARB, ETC) ARE EXEMPT ! 9844: * ! 9845: SCLR5 BEQ VRSTO(XR),=B$VRE,SCLR4 CHECK FOR PROTECTED VARIABLE (REG05) ! 9846: MOV XR,XL COPY VRBLK POINTER (REG05) ! 9847: * ! 9848: * LOOP TO LOCATE VALUE AT END OF POSSIBLE TRBLK CHAIN ! 9849: * ! 9850: SCLR6 MOV XL,WA SAVE BLOCK POINTER ! 9851: MOV VRVAL(XL),XL LOAD NEXT VALUE FIELD ! 9852: BEQ (XL),=B$TRT,SCLR6 LOOP BACK IF TRAPPED ! 9853: * ! 9854: * NOW STORE THE NULL VALUE ! 9855: * ! 9856: MOV WA,XL RESTORE BLOCK POINTER ! 9857: MOV =NULLS,VRVAL(XL) STORE NULL CONSTANT VALUE ! 9858: BRN SCLR4 LOOP BACK FOR NEXT VRBLK ! 9859: EJC ! 9860: * ! 9861: * CODE ! 9862: * ! 9863: S$COD ENT ENTRY POINT ! 9864: MOV (XS)+,XR LOAD ARGUMENT ! 9865: JSR GTCOD CONVERT TO CODE ! 9866: PPM EXFAL FAIL IF CONVERSION IS IMPOSSIBLE ! 9867: BRN EXIXR ELSE RETURN CODE AS RESULT ! 9868: EJC ! 9869: * ! 9870: * COLLECT ! 9871: * ! 9872: S$COL ENT ENTRY POINT ! 9873: MOV (XS)+,XR LOAD ARGUMENT ! 9874: JSR GTINT CONVERT TO INTEGER ! 9875: ERR 073,COLLECT ARGUMENT IS NOT INTEGER ! 9876: LDI ICVAL(XR) LOAD COLLECT ARGUMENT ! 9877: STI CLSVI SAVE COLLECT ARGUMENT ! 9878: ZER WB SET NO MOVE UP ! 9879: JSR GBCOL PERFORM GARBAGE COLLECTION ! 9880: MOV DNAME,WA POINT TO END OF MEMORY ! 9881: SUB DNAMP,WA SUBTRACT NEXT LOCATION ! 9882: BTW WA CONVERT BYTES TO WORDS ! 9883: MTI WA CONVERT WORDS AVAILABLE AS INTEGER ! 9884: SBI CLSVI SUBTRACT ARGUMENT ! 9885: IOV EXFAL FAIL IF OVERFLOW ! 9886: ILT EXFAL FAIL IF NOT ENOUGH ! 9887: ADI CLSVI ELSE RECOMPUTE AVAILABLE ! 9888: BRN EXINT AND EXIT WITH INTEGER RESULT ! 9889: EJC ! 9890: * ! 9891: * CONVERT ! 9892: * ! 9893: S$CNV ENT ENTRY POINT ! 9894: JSR GTSTG CONVERT SECOND ARGUMENT TO STRING ! 9895: ERR 074,CONVERT SECOND ARGUMENT IS NOT STRING ! 9896: JSR FLSTG FOLD LOWER CASE TO UPPER CASE ! 9897: MOV (XS),XL LOAD FIRST ARGUMENT ! 9898: BNE (XL),=B$PDT,SCV01 JUMP IF NOT PROGRAM DEFINED ! 9899: * ! 9900: * HERE FOR PROGRAM DEFINED DATATYPE ! 9901: * ! 9902: MOV PDDFP(XL),XL POINT TO DFBLK ! 9903: MOV DFNAM(XL),XL LOAD DATATYPE NAME ! 9904: JSR IDENT COMPARE WITH SECOND ARG ! 9905: PPM EXITS EXIT IF IDENT WITH ARG AS RESULT ! 9906: BRN EXFAL ELSE FAIL ! 9907: * ! 9908: * HERE IF NOT PROGRAM DEFINED DATATYPE ! 9909: * ! 9910: SCV01 MOV XR,-(XS) SAVE STRING ARGUMENT ! 9911: MOV =SVCTB,XL POINT TO TABLE OF NAMES TO COMPARE ! 9912: ZER WB INITIALIZE COUNTER ! 9913: MOV WA,WC SAVE LENGTH OF ARGUMENT STRING ! 9914: * ! 9915: * LOOP THROUGH TABLE ENTRIES ! 9916: * ! 9917: SCV02 MOV (XL)+,XR LOAD NEXT TABLE ENTRY, BUMP POINTER ! 9918: BZE XR,EXFAL FAIL IF ZERO MARKING END OF LIST ! 9919: BNE WC,SCLEN(XR),SCV05 JUMP IF WRONG LENGTH ! 9920: MOV XL,CNVTP ELSE STORE TABLE POINTER ! 9921: PLC XR POINT TO CHARS OF TABLE ENTRY ! 9922: MOV (XS),XL LOAD POINTER TO STRING ARGUMENT ! 9923: PLC XL POINT TO CHARS OF STRING ARG ! 9924: MOV WC,WA SET NUMBER OF CHARS TO COMPARE ! 9925: CMC SCV04,SCV04 COMPARE, JUMP IF NO MATCH ! 9926: EJC ! 9927: * ! 9928: * CONVERT (CONTINUED) ! 9929: * ! 9930: * HERE WE HAVE A MATCH ! 9931: * ! 9932: SCV03 MOV WB,XL COPY ENTRY NUMBER ! 9933: ICA XS POP STRING ARG OFF STACK ! 9934: MOV (XS)+,XR LOAD FIRST ARGUMENT ! 9935: BSW XL,CNVTT JUMP TO APPROPRIATE ROUTINE ! 9936: IFF 0,SCV06 STRING ! 9937: IFF 1,SCV07 INTEGER ! 9938: IFF 2,SCV09 NAME ! 9939: IFF 3,SCV10 PATTERN ! 9940: IFF 4,SCV11 ARRAY ! 9941: IFF 5,SCV19 TABLE ! 9942: IFF 6,SCV25 EXPRESSION ! 9943: IFF 7,SCV26 CODE ! 9944: IFF 8,SCV27 NUMERIC ! 9945: IFF CNVRT,SCV08 REAL ! 9946: IFF CNVBT,SCV28 BUFFER ! 9947: ESW END OF SWITCH TABLE ! 9948: * ! 9949: * HERE IF NO MATCH WITH TABLE ENTRY ! 9950: * ! 9951: SCV04 MOV CNVTP,XL RESTORE TABLE POINTER, MERGE ! 9952: * ! 9953: * MERGE HERE IF LENGTHS DID NOT MATCH ! 9954: * ! 9955: SCV05 ICV WB BUMP ENTRY NUMBER ! 9956: BRN SCV02 LOOP BACK TO CHECK NEXT ENTRY ! 9957: * ! 9958: * HERE TO CONVERT TO STRING ! 9959: * ! 9960: SCV06 MOV XR,-(XS) REPLACE STRING ARGUMENT ON STACK ! 9961: JSR GTSTG CONVERT TO STRING ! 9962: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE ! 9963: BRN EXIXR ELSE RETURN STRING ! 9964: EJC ! 9965: * ! 9966: * CONVERT (CONTINUED) ! 9967: * ! 9968: * HERE TO CONVERT TO INTEGER ! 9969: * ! 9970: SCV07 JSR GTINT CONVERT TO INTEGER ! 9971: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE ! 9972: BRN EXIXR ELSE RETURN INTEGER ! 9973: * ! 9974: * HERE TO CONVERT TO REAL ! 9975: * ! 9976: SCV08 JSR GTREA CONVERT TO REAL ! 9977: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE ! 9978: BRN EXIXR ELSE RETURN REAL ! 9979: * ! 9980: * HERE TO CONVERT TO NAME ! 9981: * ! 9982: SCV09 BEQ (XR),=B$NML,EXIXR RETURN IF ALREADY A NAME ! 9983: JSR GTNVR ELSE TRY STRING TO NAME CONVERT ! 9984: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE ! 9985: BRN EXVNM ELSE EXIT BUILDING NMBLK FOR VRBLK ! 9986: * ! 9987: * HERE TO CONVERT TO PATTERN ! 9988: * ! 9989: SCV10 JSR GTPAT CONVERT TO PATTERN ! 9990: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE ! 9991: BRN EXIXR ELSE RETURN PATTERN ! 9992: * ! 9993: * CONVERT TO ARRAY ! 9994: * ! 9995: SCV11 JSR GTARR GET AN ARRAY ! 9996: PPM EXFAL FAIL IF NOT CONVERTIBLE ! 9997: BRN EXSID EXIT SETTING ID FIELD ! 9998: * ! 9999: * CONVERT TO TABLE ! 10000: * ! 10001: SCV19 MOV (XR),WA LOAD FIRST WORD OF BLOCK ! 10002: MOV XR,-(XS) REPLACE ARBLK POINTER ON STACK ! 10003: BEQ WA,=B$TBT,EXITS RETURN ARG IF ALREADY A TABLE ! 10004: BNE WA,=B$ART,EXFAL ELSE FAIL IF NOT AN ARRAY ! 10005: EJC ! 10006: * ! 10007: * CONVERT (CONTINUED) ! 10008: * ! 10009: * HERE TO CONVERT AN ARRAY TO TABLE ! 10010: * ! 10011: BNE ARNDM(XR),=NUM02,EXFAL FAIL IF NOT 2-DIM ARRAY ! 10012: LDI ARDM2(XR) LOAD DIM 2 ! 10013: SBI INTV2 SUBTRACT 2 TO COMPARE ! 10014: INE EXFAL FAIL IF DIM2 NOT 2 ! 10015: * ! 10016: * HERE WE HAVE AN ARBLK OF THE RIGHT SHAPE ! 10017: * ! 10018: LDI ARDIM(XR) LOAD DIM 1 (NUMBER OF ELEMENTS) ! 10019: MFI WA GET AS ONE WORD INTEGER ! 10020: LCT WB,WA COPY TO CONTROL LOOP ! 10021: ADD =TBSI$,WA ADD SPACE FOR STANDARD FIELDS ! 10022: WTB WA CONVERT LENGTH TO BYTES ! 10023: JSR ALLOC ALLOCATE SPACE FOR TBBLK ! 10024: MOV XR,WC COPY TBBLK POINTER ! 10025: MOV XR,-(XS) SAVE TBBLK POINTER ! 10026: MOV =B$TBT,(XR)+ STORE TYPE WORD ! 10027: ZER (XR)+ STORE ZERO FOR IDVAL FOR NOW ! 10028: MOV WA,(XR)+ STORE LENGTH ! 10029: MOV =NULLS,(XR)+ NULL INITIAL LOOKUP VALUE ! 10030: * ! 10031: * LOOP TO INITIALIZE BUCKET PTRS TO POINT TO TABLE ! 10032: * ! 10033: SCV20 MOV WC,(XR)+ SET BUCKET PTR TO POINT TO TBBLK ! 10034: BCT WB,SCV20 LOOP TILL ALL INITIALIZED ! 10035: MOV *ARVL2,WB SET OFFSET TO FIRST ARBLK ELEMENT ! 10036: * ! 10037: * LOOP TO COPY ELEMENTS FROM ARRAY TO TABLE ! 10038: * ! 10039: SCV21 MOV 1(XS),XL POINT TO ARBLK ! 10040: BEQ WB,ARLEN(XL),SCV24 JUMP IF ALL MOVED ! 10041: ADD WB,XL ELSE POINT TO CURRENT LOCATION ! 10042: ADD *NUM02,WB BUMP OFFSET ! 10043: MOV (XL),XR LOAD SUBSCRIPT NAME ! 10044: DCA XL ADJUST PTR TO MERGE (TRVAL=1+1) ! 10045: EJC ! 10046: * ! 10047: * CONVERT (CONTINUED) ! 10048: * ! 10049: * LOOP TO CHASE DOWN TRBLK CHAIN FOR VALUE ! 10050: * ! 10051: SCV22 MOV TRVAL(XL),XL POINT TO NEXT VALUE ! 10052: BEQ (XL),=B$TRT,SCV22 LOOP BACK IF TRAPPED ! 10053: * ! 10054: * HERE WITH NAME IN XR, VALUE IN XL ! 10055: * ! 10056: SCV23 MOV XL,-(XS) STACK VALUE ! 10057: MOV 1(XS),XL LOAD TBBLK POINTER ! 10058: JSR TFIND BUILD TEBLK (NOTE WB GT 0 BY NAME) ! 10059: PPM EXFAL FAIL IF ACESS FAILS ! 10060: MOV (XS)+,TEVAL(XL) STORE VALUE IN TEBLK ! 10061: BRN SCV21 LOOP BACK FOR NEXT ELEMENT ! 10062: * ! 10063: * HERE AFTER MOVING ALL ELEMENTS TO TBBLK ! 10064: * ! 10065: SCV24 MOV (XS)+,XR LOAD TBBLK POINTER ! 10066: ICA XS POP ARBLK POINTER ! 10067: BRN EXSID EXIT SETTING IDVAL ! 10068: * ! 10069: * CONVERT TO EXPRESSION ! 10070: * ! 10071: SCV25 JSR GTEXP CONVERT TO EXPRESSION ! 10072: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE ! 10073: BRN EXIXR ELSE RETURN EXPRESSION ! 10074: * ! 10075: * CONVERT TO CODE ! 10076: * ! 10077: SCV26 JSR GTCOD CONVERT TO CODE ! 10078: PPM EXFAL FAIL IF CONVERSION IS NOT POSSIBLE ! 10079: BRN EXIXR ELSE RETURN CODE ! 10080: * ! 10081: * CONVERT TO NUMERIC ! 10082: * ! 10083: SCV27 JSR GTNUM CONVERT TO NUMERIC ! 10084: PPM EXFAL FAIL IF UNCONVERTIBLE ! 10085: BRN EXIXR RETURN NUMBER ! 10086: EJC ! 10087: * ! 10088: * CONVERT TO BUFFER ! 10089: * ! 10090: SCV28 MOV XR,-(XS) STACK STRING FOR PROCEDURE ! 10091: JSR GTSTG CONVERT TO STRING ! 10092: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE ! 10093: MOV XR,XL SAVE STRING POINTER ! 10094: JSR ALOBF ALLOCATE BUFFER OF SAME SIZE ! 10095: JSR APNDB COPY IN THE STRING ! 10096: PPM ALREADY STRING - CANT FAIL TO CNV ! 10097: PPM MUST BE ENOUGH ROOM ! 10098: BRN EXSID EXIT SETTING IDVAL FIELD ! 10099: EJC ! 10100: * ! 10101: * COPY ! 10102: * ! 10103: S$COP ENT ENTRY POINT ! 10104: JSR COPYB COPY THE BLOCK ! 10105: PPM EXITS RETURN IF NO IDVAL FIELD ! 10106: BRN EXSID EXIT SETTING ID VALUE ! 10107: EJC ! 10108: * ! 10109: * DATA ! 10110: * ! 10111: S$DAT ENT ENTRY POINT ! 10112: JSR XSCNI PREPARE TO SCAN ARGUMENT ! 10113: ERR 075,DATA ARGUMENT IS NOT STRING ! 10114: ERR 076,DATA ARGUMENT IS NULL ! 10115: * ! 10116: * SCAN OUT DATATYPE NAME ! 10117: * ! 10118: MOV =CH$PP,WC DELIMITER ONE = LEFT PAREN ! 10119: MOV WC,XL DELIMITER TWO = LEFT PAREN ! 10120: JSR XSCAN SCAN DATATYPE NAME ! 10121: BNZ WA,SDAT1 SKIP IF LEFT PAREN FOUND ! 10122: ERB 077,DATA ARGUMENT IS MISSING A LEFT PAREN ! 10123: * ! 10124: * HERE AFTER SCANNING DATATYPE NAME ! 10125: * ! 10126: SDAT1 MOV SCLEN(XR),WA GET LENGTH ! 10127: JSR FLSTG FOLD LOWER CASE TO UPPER CASE ! 10128: MOV XR,XL SAVE NAME PTR ! 10129: MOV SCLEN(XR),WA GET LENGTH ! 10130: CTB WA,SCSI$ COMPUTE SPACE NEEDED ! 10131: JSR ALOST REQUEST STATIC STORE FOR NAME ! 10132: MOV XR,-(XS) SAVE DATATYPE NAME ! 10133: MVW COPY NAME TO STATIC ! 10134: MOV (XS),XR GET NAME PTR ! 10135: ZER XL SCRUB DUD REGISTER ! 10136: JSR GTNVR LOCATE VRBLK FOR DATATYPE NAME ! 10137: ERR 078,DATA ARGUMENT HAS NULL DATATYPE NAME ! 10138: MOV XR,DATDV SAVE VRBLK POINTER FOR DATATYPE ! 10139: MOV XS,DATXS STORE STARTING STACK VALUE ! 10140: ZER WB ZERO COUNT OF FIELD NAMES ! 10141: * ! 10142: * LOOP TO SCAN FIELD NAMES AND STACK VRBLK POINTERS ! 10143: * ! 10144: SDAT2 MOV =CH$RP,WC DELIMITER ONE = RIGHT PAREN ! 10145: MOV =CH$CM,XL DELIMITER TWO = COMMA ! 10146: JSR XSCAN SCAN NEXT FIELD NAME ! 10147: BNZ WA,SDAT3 JUMP IF DELIMITER FOUND ! 10148: ERB 079,DATA ARGUMENT IS MISSING A RIGHT PAREN ! 10149: * ! 10150: * HERE AFTER SCANNING OUT ONE FIELD NAME ! 10151: * ! 10152: SDAT3 JSR GTNVR LOCATE VRBLK FOR FIELD NAME ! 10153: ERR 080,DATA ARGUMENT HAS NULL FIELD NAME ! 10154: MOV XR,-(XS) STACK VRBLK POINTER ! 10155: ICV WB INCREMENT COUNTER ! 10156: BEQ WA,=NUM02,SDAT2 LOOP BACK IF STOPPED BY COMMA ! 10157: EJC ! 10158: * ! 10159: * DATA (CONTINUED) ! 10160: * ! 10161: * NOW BUILD THE DFBLK ! 10162: * ! 10163: MOV =DFSI$,WA SET SIZE OF DFBLK STANDARD FIELDS ! 10164: ADD WB,WA ADD NUMBER OF FIELDS ! 10165: WTB WA CONVERT LENGTH TO BYTES ! 10166: MOV WB,WC PRESERVE NO. OF FIELDS ! 10167: JSR ALOST ALLOCATE SPACE FOR DFBLK ! 10168: MOV WC,WB GET NO OF FIELDS ! 10169: MOV DATXS,XT POINT TO START OF STACK ! 10170: MOV (XT),WC LOAD DATATYPE NAME ! 10171: MOV XR,(XT) SAVE DFBLK POINTER ON STACK ! 10172: MOV =B$DFC,(XR)+ STORE TYPE WORD ! 10173: MOV WB,(XR)+ STORE NUMBER OF FIELDS (FARGS) ! 10174: MOV WA,(XR)+ STORE LENGTH (DFLEN) ! 10175: SUB *PDDFS,WA COMPUTE PDBLK LENGTH (FOR DFPDL) ! 10176: MOV WA,(XR)+ STORE PDBLK LENGTH (DFPDL) ! 10177: MOV WC,(XR)+ STORE DATATYPE NAME (DFNAM) ! 10178: LCT WC,WB COPY NUMBER OF FIELDS ! 10179: * ! 10180: * LOOP TO MOVE FIELD NAME VRBLK POINTERS TO DFBLK ! 10181: * ! 10182: SDAT4 MOV -(XT),(XR)+ MOVE ONE FIELD NAME VRBLK POINTER ! 10183: BCT WC,SDAT4 LOOP TILL ALL MOVED ! 10184: * ! 10185: * NOW DEFINE THE DATATYPE FUNCTION ! 10186: * ! 10187: MOV WA,WC COPY LENGTH OF PDBLK FOR LATER LOOP ! 10188: MOV DATDV,XR POINT TO VRBLK ! 10189: MOV DATXS,XT POINT BACK ON STACK ! 10190: MOV (XT),XL LOAD DFBLK POINTER ! 10191: JSR DFFNC DEFINE FUNCTION ! 10192: EJC ! 10193: * ! 10194: * DATA (CONTINUED) ! 10195: * ! 10196: * LOOP TO BUILD FFBLKS ! 10197: * ! 10198: * ! 10199: * NOTICE THAT THE FFBLKS ARE CONSTRUCTED IN REVERSE ORDER ! 10200: * SO THAT THE REQUIRED OFFSETS CAN BE OBTAINED FROM ! 10201: * SUCCESSIVE DECREMENTATION OF THE PDBLK LENGTH (IN WC). ! 10202: * ! 10203: SDAT5 MOV *FFSI$,WA SET LENGTH OF FFBLK ! 10204: JSR ALLOC ALLOCATE SPACE FOR FFBLK ! 10205: MOV =B$FFC,(XR) SET TYPE WORD ! 10206: MOV =NUM01,FARGS(XR) STORE FARGS (ALWAYS ONE) ! 10207: MOV DATXS,XT POINT BACK ON STACK ! 10208: MOV (XT),FFDFP(XR) COPY DFBLK PTR TO FFBLK ! 10209: DCA WC DECREMENT OLD DFPDL TO GET NEXT OFS ! 10210: MOV WC,FFOFS(XR) SET OFFSET TO THIS FIELD ! 10211: ZER FFNXT(XR) TENTATIVELY SET ZERO FORWARD PTR ! 10212: MOV XR,XL COPY FFBLK POINTER FOR DFFNC ! 10213: MOV (XS),XR LOAD VRBLK POINTER FOR FIELD ! 10214: MOV VRFNC(XR),XR LOAD CURRENT FUNCTION POINTER ! 10215: BNE (XR),=B$FFC,SDAT6 SKIP IF NOT CURRENTLY A FIELD FUNC ! 10216: * ! 10217: * HERE WE MUST CHAIN AN OLD FFBLK PTR TO PRESERVE IT IN THE ! 10218: * CASE OF MULTIPLE FIELD FUNCTIONS WITH THE SAME NAME ! 10219: * ! 10220: MOV XR,FFNXT(XL) LINK NEW FFBLK TO PREVIOUS CHAIN ! 10221: * ! 10222: * MERGE HERE TO DEFINE FIELD FUNCTION ! 10223: * ! 10224: SDAT6 MOV (XS)+,XR LOAD VRBLK POINTER ! 10225: JSR DFFNC DEFINE FIELD FUNCTION ! 10226: BNE XS,DATXS,SDAT5 LOOP BACK TILL ALL DONE ! 10227: ICA XS POP DFBLK POINTER ! 10228: BRN EXNUL RETURN WITH NULL RESULT ! 10229: EJC ! 10230: * ! 10231: * DATATYPE ! 10232: * ! 10233: S$DTP ENT ENTRY POINT ! 10234: MOV (XS)+,XR LOAD ARGUMENT ! 10235: JSR DTYPE GET DATATYPE ! 10236: BRN EXIXR AND RETURN IT AS RESULT ! 10237: EJC ! 10238: * ! 10239: * DATE ! 10240: * ! 10241: S$DTE ENT ENTRY POINT ! 10242: JSR SYSDT CALL SYSTEM DATE ROUTINE ! 10243: MOV 1(XL),WA LOAD LENGTH FOR SBSTR ! 10244: BZE WA,EXNUL RETURN NULL IF LENGTH IS ZERO ! 10245: ZER WB SET ZERO OFFSET ! 10246: JSR SBSTR USE SBSTR TO BUILD SCBLK ! 10247: BRN EXIXR RETURN DATE STRING ! 10248: EJC ! 10249: * ! 10250: * DEFINE ! 10251: * ! 10252: S$DEF ENT ENTRY POINT ! 10253: MOV (XS)+,XR LOAD SECOND ARGUMENT ! 10254: ZER DEFLB ZERO LABEL POINTER IN CASE NULL ! 10255: BEQ XR,=NULLS,SDF01 JUMP IF NULL SECOND ARGUMENT ! 10256: JSR GTNVR ELSE FIND VRBLK FOR LABEL ! 10257: PPM SDF13 JUMP IF NOT A VARIABLE NAME ! 10258: MOV XR,DEFLB ELSE SET SPECIFIED ENTRY ! 10259: * ! 10260: * SCAN FUNCTION NAME ! 10261: * ! 10262: SDF01 JSR XSCNI PREPARE TO SCAN FIRST ARGUMENT ! 10263: ERR 081,DEFINE FIRST ARGUMENT IS NOT STRING ! 10264: ERR 082,DEFINE FIRST ARGUMENT IS NULL ! 10265: MOV =CH$PP,WC DELIMITER ONE = LEFT PAREN ! 10266: MOV WC,XL DELIMITER TWO = LEFT PAREN ! 10267: JSR XSCAN SCAN OUT FUNCTION NAME ! 10268: BNZ WA,SDF02 JUMP IF LEFT PAREN FOUND ! 10269: ERB 083,DEFINE FIRST ARGUMENT IS MISSING A LEFT PAREN ! 10270: * ! 10271: * HERE AFTER SCANNING OUT FUNCTION NAME ! 10272: * ! 10273: SDF02 JSR GTNVR GET VARIABLE NAME ! 10274: ERR 084,DEFINE FIRST ARGUMENT HAS NULL FUNCTION NAME ! 10275: MOV XR,DEFVR SAVE VRBLK POINTER FOR FUNCTION NAM ! 10276: ZER WB ZERO COUNT OF ARGUMENTS ! 10277: MOV XS,DEFXS SAVE INITIAL STACK POINTER ! 10278: BNZ DEFLB,SDF03 JUMP IF SECOND ARGUMENT GIVEN ! 10279: MOV XR,DEFLB ELSE DEFAULT IS FUNCTION NAME ! 10280: * ! 10281: * LOOP TO SCAN ARGUMENT NAMES AND STACK VRBLK POINTERS ! 10282: * ! 10283: SDF03 MOV =CH$RP,WC DELIMITER ONE = RIGHT PAREN ! 10284: MOV =CH$CM,XL DELIMITER TWO = COMMA ! 10285: JSR XSCAN SCAN OUT NEXT ARGUMENT NAME ! 10286: BNZ WA,SDF04 SKIP IF DELIMITER FOUND ! 10287: ERB 085,NULL ARG NAME OR MISSING ) IN DEFINE FIRST ARG. ! 10288: EJC ! 10289: * ! 10290: * DEFINE (CONTINUED) ! 10291: * ! 10292: * HERE AFTER SCANNING AN ARGUMENT NAME ! 10293: * ! 10294: SDF04 BNE XR,=NULLS,SDF05 SKIP IF NON-NULL ! 10295: BZE WB,SDF06 IGNORE NULL IF CASE OF NO ARGUMENTS ! 10296: * ! 10297: * HERE AFTER DEALING WITH THE CASE OF NO ARGUMENTS ! 10298: * ! 10299: SDF05 JSR GTNVR GET VRBLK POINTER ! 10300: PPM SDF03 LOOP BACK TO IGNORE NULL NAME ! 10301: MOV XR,-(XS) STACK ARGUMENT VRBLK POINTER ! 10302: ICV WB INCREMENT COUNTER ! 10303: BEQ WA,=NUM02,SDF03 LOOP BACK IF STOPPED BY A COMMA ! 10304: * ! 10305: * HERE AFTER SCANNING OUT FUNCTION ARGUMENT NAMES ! 10306: * ! 10307: SDF06 MOV WB,DEFNA SAVE NUMBER OF ARGUMENTS ! 10308: ZER WB ZERO COUNT OF LOCALS ! 10309: * ! 10310: * LOOP TO SCAN LOCAL NAMES AND STACK VRBLK POINTERS ! 10311: * ! 10312: SDF07 MOV =CH$CM,WC SET DELIMITER ONE = COMMA ! 10313: MOV WC,XL SET DELIMITER TWO = COMMA ! 10314: JSR XSCAN SCAN OUT NEXT LOCAL NAME ! 10315: BNE XR,=NULLS,SDF08 SKIP IF NON-NULL ! 10316: BZE WB,SDF09 IGNORE NULL IF CASE OF NO LOCALS ! 10317: * ! 10318: * HERE AFTER SCANNING OUT A LOCAL NAME ! 10319: * ! 10320: SDF08 JSR GTNVR GET VRBLK POINTER ! 10321: PPM SDF07 LOOP BACK TO IGNORE NULL NAME ! 10322: ICV WB IF OK, INCREMENT COUNT ! 10323: MOV XR,-(XS) STACK VRBLK POINTER ! 10324: BNZ WA,SDF07 LOOP BACK IF STOPPED BY A COMMA ! 10325: EJC ! 10326: * ! 10327: * DEFINE (CONTINUED) ! 10328: * ! 10329: * HERE AFTER SCANNING LOCALS, BUILD PFBLK ! 10330: * ! 10331: SDF09 MOV WB,WA COPY COUNT OF LOCALS ! 10332: ADD DEFNA,WA ADD NUMBER OF ARGUMENTS ! 10333: MOV WA,WC SET SUM ARGS+LOCALS AS LOOP COUNT ! 10334: ADD =PFSI$,WA ADD SPACE FOR STANDARD FIELDS ! 10335: WTB WA CONVERT LENGTH TO BYTES ! 10336: JSR ALLOC ALLOCATE SPACE FOR PFBLK ! 10337: MOV XR,XL SAVE POINTER TO PFBLK ! 10338: MOV =B$PFC,(XR)+ STORE FIRST WORD ! 10339: MOV DEFNA,(XR)+ STORE NUMBER OF ARGUMENTS ! 10340: MOV WA,(XR)+ STORE LENGTH (PFLEN) ! 10341: MOV DEFVR,(XR)+ STORE VRBLK PTR FOR FUNCTION NAME ! 10342: MOV WB,(XR)+ STORE NUMBER OF LOCALS ! 10343: ZER (XR)+ DEAL WITH LABEL LATER ! 10344: ZER (XR)+ ZERO PFCTR ! 10345: ZER (XR)+ ZERO PFRTR ! 10346: BZE WC,SDF11 SKIP IF NO ARGS OR LOCALS ! 10347: MOV XL,WA KEEP PFBLK POINTER ! 10348: MOV DEFXS,XT POINT BEFORE ARGUMENTS ! 10349: LCT WC,WC GET COUNT OF ARGS+LOCALS FOR LOOP ! 10350: * ! 10351: * LOOP TO MOVE LOCALS AND ARGS TO PFBLK ! 10352: * ! 10353: SDF10 MOV -(XT),(XR)+ STORE ONE ENTRY AND BUMP POINTERS ! 10354: BCT WC,SDF10 LOOP TILL ALL STORED ! 10355: MOV WA,XL RECOVER PFBLK POINTER ! 10356: EJC ! 10357: * ! 10358: * DEFINE (CONTINUED) ! 10359: * ! 10360: * NOW DEAL WITH LABEL ! 10361: * ! 10362: SDF11 MOV DEFXS,XS POP STACK ! 10363: MOV DEFLB,XR POINT TO VRBLK FOR LABEL ! 10364: MOV VRLBL(XR),XR LOAD LABEL POINTER ! 10365: BNE (XR),=B$TRT,SDF12 SKIP IF NOT TRAPPED ! 10366: MOV TRLBL(XR),XR ELSE POINT TO REAL LABEL ! 10367: * ! 10368: * HERE AFTER LOCATING REAL LABEL POINTER ! 10369: * ! 10370: SDF12 BEQ XR,=STNDL,SDF13 JUMP IF LABEL IS NOT DEFINED ! 10371: MOV XR,PFCOD(XL) ELSE STORE LABEL POINTER ! 10372: MOV DEFVR,XR POINT BACK TO VRBLK FOR FUNCTION ! 10373: JSR DFFNC DEFINE FUNCTION ! 10374: BRN EXNUL AND EXIT RETURNING NULL ! 10375: * ! 10376: * HERE FOR ERRONEOUS LABEL ! 10377: * ! 10378: SDF13 ERB 086,DEFINE FUNCTION ENTRY POINT IS NOT DEFINED LABEL ! 10379: EJC ! 10380: * ! 10381: * DETACH ! 10382: * ! 10383: S$DET ENT ENTRY POINT ! 10384: MOV (XS)+,XR LOAD ARGUMENT ! 10385: JSR GTVAR LOCATE VARIABLE ! 10386: ERR 087,DETACH ARGUMENT IS NOT APPROPRIATE NAME ! 10387: JSR DTACH DETACH I/O ASSOCIATION FROM NAME ! 10388: BRN EXNUL RETURN NULL RESULT ! 10389: EJC ! 10390: * ! 10391: * DIFFER ! 10392: * ! 10393: S$DIF ENT ENTRY POINT ! 10394: MOV (XS)+,XR LOAD SECOND ARGUMENT ! 10395: MOV (XS)+,XL LOAD FIRST ARGUMENT ! 10396: JSR IDENT CALL IDENT COMPARISON ROUTINE ! 10397: PPM EXFAL FAIL IF IDENT ! 10398: BRN EXNUL RETURN NULL IF DIFFER ! 10399: EJC ! 10400: * ! 10401: * DUMP ! 10402: * ! 10403: S$DMP ENT ENTRY POINT ! 10404: JSR GTSMI LOAD DUMP ARG AS SMALL INTEGER ! 10405: ERR 088,DUMP ARGUMENT IS NOT INTEGER ! 10406: ERR 089,DUMP ARGUMENT IS NEGATIVE OR TOO LARGE ! 10407: JSR DUMPR ELSE CALL DUMP ROUTINE ! 10408: BRN EXNUL AND RETURN NULL AS RESULT ! 10409: EJC ! 10410: * ! 10411: * DUPL ! 10412: * ! 10413: S$DUP ENT ENTRY POINT ! 10414: JSR GTSMI GET SECOND ARGUMENT AS SMALL INTEGE ! 10415: ERR 090,DUPL SECOND ARGUMENT IS NOT INTEGER ! 10416: PPM SDUP7 JUMP IF NEGATIVE OT TOO BIG ! 10417: MOV XR,WB SAVE DUPLICATION FACTOR ! 10418: JSR GTSTG GET FIRST ARG AS STRING ! 10419: PPM SDUP4 JUMP IF NOT A STRING ! 10420: * ! 10421: * HERE FOR CASE OF DUPLICATION OF A STRING ! 10422: * ! 10423: MTI WA ACQUIRE LENGTH AS INTEGER ! 10424: STI DUPSI SAVE FOR THE MOMENT ! 10425: MTI WB GET DUPLICATION FACTOR AS INTEGER ! 10426: MLI DUPSI FORM PRODUCT ! 10427: IOV SDUP3 JUMP IF OVERFLOW ! 10428: IEQ EXNUL RETURN NULL IF RESULT LENGTH = 0 ! 10429: MFI WA,SDUP3 GET AS ADDR INTEGER, CHECK OVFLO ! 10430: * ! 10431: * MERGE HERE WITH RESULT LENGTH IN WA ! 10432: * ! 10433: SDUP1 MOV XR,XL SAVE STRING POINTER ! 10434: JSR ALOCS ALLOCATE SPACE FOR STRING ! 10435: MOV XR,-(XS) SAVE AS RESULT POINTER ! 10436: MOV XL,WC SAVE POINTER TO ARGUMENT STRING ! 10437: PSC XR PREPARE TO STORE CHARS OF RESULT ! 10438: LCT WB,WB SET COUNTER TO CONTROL LOOP ! 10439: * ! 10440: * LOOP THROUGH DUPLICATIONS ! 10441: * ! 10442: SDUP2 MOV WC,XL POINT BACK TO ARGUMENT STRING ! 10443: MOV SCLEN(XL),WA GET NUMBER OF CHARACTERS ! 10444: PLC XL POINT TO CHARS IN ARGUMENT STRING ! 10445: MVC MOVE CHARACTERS TO RESULT STRING ! 10446: BCT WB,SDUP2 LOOP TILL ALL DUPLICATIONS DONE ! 10447: BRN EXITS THEN EXIT FOR NEXT CODE WORD ! 10448: EJC ! 10449: * ! 10450: * DUPL (CONTINUED) ! 10451: * ! 10452: * HERE IF TOO LARGE, SET MAX LENGTH AND LET ALOCS CATCH IT ! 10453: * ! 10454: SDUP3 MOV DNAME,WA SET IMPOSSIBLE LENGTH FOR ALOCS ! 10455: BRN SDUP1 MERGE BACK ! 10456: * ! 10457: * HERE IF NOT A STRING ! 10458: * ! 10459: SDUP4 JSR GTPAT CONVERT ARGUMENT TO PATTERN ! 10460: ERR 091,DUPL FIRST ARGUMENT IS NOT STRING OR PATTERN ! 10461: * ! 10462: * HERE TO DUPLICATE A PATTERN ARGUMENT ! 10463: * ! 10464: MOV XR,-(XS) STORE PATTERN ON STACK ! 10465: MOV =NDNTH,XR START OFF WITH NULL PATTERN ! 10466: BZE WB,SDUP6 NULL PATTERN IS RESULT IF DUPFAC=0 ! 10467: MOV WB,-(XS) PRESERVE LOOP COUNT ! 10468: * ! 10469: * LOOP TO DUPLICATE BY SUCCESSIVE CONCATENATION ! 10470: * ! 10471: SDUP5 MOV XR,XL COPY CURRENT VALUE AS RIGHT ARGUMNT ! 10472: MOV 1(XS),XR GET A NEW COPY OF LEFT ! 10473: JSR PCONC CONCATENATE ! 10474: DCV (XS) COUNT DOWN ! 10475: BNZ (XS),SDUP5 LOOP ! 10476: ICA XS POP LOOP COUNT ! 10477: * ! 10478: * HERE TO EXIT AFTER CONSTRUCTING PATTERN ! 10479: * ! 10480: SDUP6 MOV XR,(XS) STORE RESULT ON STACK ! 10481: BRN EXITS EXIT WITH RESULT ON STACK ! 10482: * ! 10483: * FAIL IF SECOND ARG IS OUT OF RANGE ! 10484: * ! 10485: SDUP7 ICA XS POP FIRST ARGUMENT ! 10486: BRN EXFAL FAIL ! 10487: EJC ! 10488: * ! 10489: * EJECT ! 10490: * ! 10491: S$EJC ENT ENTRY POINT ! 10492: JSR IOFCB CALL FCBLK ROUTINE ! 10493: ERR 092,EJECT ARGUMENT IS NOT A SUITABLE NAME ! 10494: PPM SEJC1 NULL ARGUMENT ! 10495: JSR SYSEF CALL EJECT FILE FUNCTION ! 10496: ERR 093,EJECT FILE DOES NOT EXIST ! 10497: ERR 094,EJECT FILE DOES NOT PERMIT PAGE EJECT ! 10498: ERR 095,EJECT CAUSED NON-RECOVERABLE OUTPUT ERROR ! 10499: BRN EXNUL RETURN NULL AS RESULT ! 10500: * ! 10501: * HERE TO EJECT STANDARD OUTPUT FILE ! 10502: * ! 10503: SEJC1 JSR SYSEP CALL ROUTINE TO EJECT PRINTER ! 10504: BRN EXNUL EXIT WITH NULL RESULT ! 10505: EJC ! 10506: * ! 10507: * ENDFILE ! 10508: * ! 10509: S$ENF ENT ENTRY POINT ! 10510: JSR IOFCB CALL FCBLK ROUTINE ! 10511: ERR 096,ENDFILE ARGUMENT IS NOT A SUITABLE NAME ! 10512: ERR 097,ENDFILE ARGUMENT IS NULL ! 10513: JSR SYSEN CALL ENDFILE ROUTINE ! 10514: ERR 098,ENDFILE FILE DOES NOT EXIST ! 10515: ERR 099,ENDFILE FILE DOES NOT PERMIT ENDFILE ! 10516: ERR 100,ENDFILE CAUSED NON-RECOVERABLE OUTPUT ERROR ! 10517: MOV XL,WB REMEMBER VRBLK PTR FROM IOFCB CALL ! 10518: * ! 10519: * LOOP TO FIND TRTRF BLOCK ! 10520: * ! 10521: SENF1 MOV XL,XR COPY POINTER ! 10522: MOV TRVAL(XR),XR CHAIN ALONG ! 10523: BNE (XR),=B$TRT,EXNUL SKIP OUT IF CHAIN END ! 10524: BNE TRTYP(XR),=TRTFC,SENF1 LOOP IF NOT FOUND ! 10525: MOV TRVAL(XR),TRVAL(XL) REMOVE TRTRF ! 10526: MOV TRTRF(XR),ENFCH POINT TO HEAD OF IOCHN ! 10527: MOV TRFPT(XR),WC POINT TO FCBLK ! 10528: MOV WB,XR FILEARG1 VRBLK FROM IOFCB ! 10529: JSR SETVR RESET IT ! 10530: MOV =R$FCB,XL PTR TO HEAD OF FCBLK CHAIN ! 10531: SUB *NUM02,XL ADJUST READY TO ENTER LOOP ! 10532: * ! 10533: * FIND FCBLK ! 10534: * ! 10535: SENF2 MOV XL,XR COPY PTR ! 10536: MOV 2(XL),XL GET NEXT LINK ! 10537: BZE XL,SENF4 STOP IF CHAIN END ! 10538: BEQ 3(XL),WC,SENF3 JUMP IF FCBLK FOUND ! 10539: BRN SENF2 LOOP ! 10540: * ! 10541: * REMOVE FCBLK ! 10542: * ! 10543: SENF3 MOV 2(XL),2(XR) DELETE FCBLK FROM CHAIN ! 10544: * ! 10545: * LOOP WHICH DETACHES ALL VBLS ON IOCHN CHAIN ! 10546: * ! 10547: SENF4 MOV ENFCH,XL GET CHAIN HEAD ! 10548: BZE XL,EXNUL FINISHED IF CHAIN END ! 10549: MOV TRTRF(XL),ENFCH CHAIN ALONG ! 10550: MOV IONMO(XL),WA NAME OFFSET ! 10551: MOV IONMB(XL),XL NAME BASE ! 10552: JSR DTACH DETACH NAME ! 10553: BRN SENF4 LOOP TILL DONE ! 10554: EJC ! 10555: * ! 10556: * EQ ! 10557: * ! 10558: S$EQF ENT ENTRY POINT ! 10559: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE ! 10560: ERR 101,EQ FIRST ARGUMENT IS NOT NUMERIC ! 10561: ERR 102,EQ SECOND ARGUMENT IS NOT NUMERIC ! 10562: PPM EXFAL FAIL IF LT ! 10563: PPM EXNUL RETURN NULL IF EQ ! 10564: PPM EXFAL FAIL IF GT ! 10565: EJC ! 10566: * ! 10567: * EVAL ! 10568: * ! 10569: S$EVL ENT ENTRY POINT ! 10570: MOV (XS)+,XR LOAD ARGUMENT ! 10571: JSR GTEXP CONVERT TO EXPRESSION ! 10572: ERR 103,EVAL ARGUMENT IS NOT EXPRESSION ! 10573: LCW WC LOAD NEXT CODE WORD ! 10574: BNE WC,=OFNE$,SEVL1 JUMP IF CALLED BY VALUE ! 10575: SCP XL COPY CODE POINTER ! 10576: MOV (XL),WA GET NEXT CODE WORD ! 10577: BNE WA,=ORNM$,SEVL2 BY NAME UNLESS EXPRESSION ! 10578: BNZ 1(XS),SEVL2 JUMP IF BY NAME ! 10579: * ! 10580: * HERE IF CALLED BY VALUE ! 10581: * ! 10582: SEVL1 ZER WB SET FLAG FOR BY VALUE ! 10583: MOV WC,-(XS) SAVE CODE WORD ! 10584: JSR EVALX EVALUATE EXPRESSION BY VALUE ! 10585: PPM EXFAL FAIL IF EVALUATION FAILS ! 10586: MOV XR,XL COPY RESULT ! 10587: MOV (XS),XR RELOAD NEXT CODE WORD ! 10588: MOV XL,(XS) STACK RESULT ! 10589: BRI (XR) JUMP TO EXECUTE NEXT CODE WORD ! 10590: * ! 10591: * HERE IF CALLED BY NAME ! 10592: * ! 10593: SEVL2 MOV =NUM01,WB SET FLAG FOR BY NAME ! 10594: JSR EVALX EVALUATE EXPRESSION BY NAME ! 10595: PPM EXFAL FAIL IF EVALUATION FAILS ! 10596: BRN EXNAM EXIT WITH NAME ! 10597: EJC ! 10598: * ! 10599: * EXIT ! 10600: * ! 10601: S$EXT ENT ENTRY POINT ! 10602: ZER WB CLEAR AMOUNT OF STATIC SHIFT ! 10603: JSR GBCOL COMPACT MEMORY BY COLLECTING ! 10604: JSR GTSTG CONVERT ARG TO STRING ! 10605: ERR 104,EXIT ARGUMENT IS NOT SUITABLE INTEGER OR STRING ! 10606: MOV XR,XL COPY STRING PTR ! 10607: JSR GTINT CHECK IT IS INTEGER ! 10608: PPM SEXT1 SKIP IF UNCONVERTIBLE ! 10609: ZER XL NOTE IT IS INTEGER ! 10610: LDI ICVAL(XR) GET INTEGER ARG ! 10611: MOV R$FCB,WB GET FCBLK CHAIN HEADER ! 10612: * ! 10613: * MERGE TO CALL OSINT EXIT ROUTINE ! 10614: * ! 10615: SEXT1 MOV =HEADV,XR POINT TO V.V STRING ! 10616: JSR SYSXI CALL EXTERNAL ROUTINE ! 10617: ERR 105,EXIT ACTION NOT AVAILABLE IN THIS IMPLEMENTATION ! 10618: ERR 106,EXIT ACTION CAUSED IRRECOVERABLE ERROR ! 10619: IEQ EXNUL RETURN IF ARGUMENT 0 ! 10620: ZER GBCNT RESUMING EXECUTION SO RESET ! 10621: IGT SEXT2 SKIP IF POSITIVE ! 10622: NGI MAKE POSITIVE ! 10623: * ! 10624: * CHECK FOR OPTION RESPECIFICATION ! 10625: * ! 10626: SEXT2 MFI WC GET VALUE IN WORK REG ! 10627: BEQ WC,=NUM03,SEXT3 SKIP IF WAS 3 ! 10628: MOV WC,-(XS) SAVE VALUE ! 10629: ZER WC SET TO READ OPTIONS ! 10630: JSR PRPAR READ SYSPP OPTIONS ! 10631: MOV (XS)+,WC RESTORE VALUE ! 10632: * ! 10633: * DEAL WITH HEADER OPTION (FIDDLED BY PRPAR) ! 10634: * ! 10635: SEXT3 MNZ HEADP ASSUME NO HEADERS ! 10636: BNE WC,=NUM01,SEXT4 SKIP IF NOT 1 ! 10637: ZER HEADP REQUEST HEADER PRINTING ! 10638: * ! 10639: * ALMOST READY TO RESUME RUNNING ! 10640: * ! 10641: SEXT4 JSR SYSTM GET EXECUTION TIME START (SGD11) ! 10642: STI TIMSX SAVE AS INITIAL TIME ! 10643: LDI KVSTC RESET TO ENSURE ... ! 10644: STI KVSTL ... CORRECT EXECUTION STATS ! 10645: BRN EXNUL RESUME EXECUTION ! 10646: EJC ! 10647: * ! 10648: * FIELD ! 10649: * ! 10650: S$FLD ENT ENTRY POINT ! 10651: JSR GTSMI GET SECOND ARGUMENT (FIELD NUMBER) ! 10652: ERR 107,FIELD SECOND ARGUMENT IS NOT INTEGER ! 10653: PPM EXFAL FAIL IF OUT OF RANGE ! 10654: MOV XR,WB ELSE SAVE INTEGER VALUE ! 10655: MOV (XS)+,XR LOAD FIRST ARGUMENT ! 10656: JSR GTNVR POINT TO VRBLK ! 10657: PPM SFLD1 JUMP (ERROR) IF NOT VARIABLE NAME ! 10658: MOV VRFNC(XR),XR ELSE POINT TO FUNCTION BLOCK ! 10659: BNE (XR),=B$DFC,SFLD1 ERROR IF NOT DATATYPE FUNCTION ! 10660: * ! 10661: * HERE IF FIRST ARGUMENT IS A DATATYPE FUNCTION NAME ! 10662: * ! 10663: BZE WB,EXFAL FAIL IF ARGUMENT NUMBER IS ZERO ! 10664: BGT WB,FARGS(XR),EXFAL FAIL IF TOO LARGE ! 10665: WTB WB ELSE CONVERT TO BYTE OFFSET ! 10666: ADD WB,XR POINT TO FIELD NAME ! 10667: MOV DFFLB(XR),XR LOAD VRBLK POINTER ! 10668: BRN EXVNM EXIT TO BUILD NMBLK ! 10669: * ! 10670: * HERE FOR BAD FIRST ARGUMENT ! 10671: * ! 10672: SFLD1 ERB 108,FIELD FIRST ARGUMENT IS NOT DATATYPE NAME ! 10673: EJC ! 10674: * ! 10675: * FENCE ! 10676: * ! 10677: S$FNC ENT ENTRY POINT ! 10678: MOV =P$FNC,WB SET PCODE FOR P$FNC ! 10679: ZER XR P0BLK ! 10680: JSR PBILD BUILD P$FNC NODE ! 10681: MOV XR,XL SAVE POINTER TO IT ! 10682: MOV (XS)+,XR GET ARGUMENT ! 10683: JSR GTPAT CONVERT TO PATTERN ! 10684: ERR 259,FENCE ARGUMENT IS NOT PATTERN ! 10685: JSR PCONC CONCATENATE TO P$FNC NODE ! 10686: MOV XR,XL SAVE PTR TO CONCATENATED PATTERN ! 10687: MOV =P$FNA,WB SET FOR P$FNA PCODE ! 10688: ZER XR P0BLK ! 10689: JSR PBILD CONSTRUCT P$FNA NODE ! 10690: MOV XL,PTHEN(XR) SET PATTERN AS PTHEN ! 10691: MOV XR,-(XS) SET AS RESULT ! 10692: BRN EXITS DO NEXT CODE WORD ! 10693: EJC ! 10694: * ! 10695: * GE ! 10696: * ! 10697: S$GEF ENT ENTRY POINT ! 10698: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE ! 10699: ERR 109,GE FIRST ARGUMENT IS NOT NUMERIC ! 10700: ERR 110,GE SECOND ARGUMENT IS NOT NUMERIC ! 10701: PPM EXFAL FAIL IF LT ! 10702: PPM EXNUL RETURN NULL IF EQ ! 10703: PPM EXNUL RETURN NULL IF GT ! 10704: EJC ! 10705: * ! 10706: * GT ! 10707: * ! 10708: S$GTF ENT ENTRY POINT ! 10709: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE ! 10710: ERR 111,GT FIRST ARGUMENT IS NOT NUMERIC ! 10711: ERR 112,GT SECOND ARGUMENT IS NOT NUMERIC ! 10712: PPM EXFAL FAIL IF LT ! 10713: PPM EXFAL FAIL IF EQ ! 10714: PPM EXNUL RETURN NULL IF GT ! 10715: EJC ! 10716: * ! 10717: * HOST ! 10718: * ! 10719: S$HST ENT ENTRY POINT ! 10720: MOV (XS)+,XR GET THIRD ARG ! 10721: MOV (XS)+,XL GET SECOND ARG ! 10722: MOV (XS)+,WA GET FIRST ARG ! 10723: JSR SYSHS ENTER SYSHS ROUTINE ! 10724: ERR 254,ERRONEOUS ARGUMENT FOR HOST ! 10725: ERR 255,ERROR DURING EXECUTION OF HOST ! 10726: PPM SHST1 STORE HOST STRING ! 10727: PPM EXNUL RETURN NULL RESULT ! 10728: PPM EXIXR RETURN XR ! 10729: PPM EXFAL FAIL RETURN ! 10730: * ! 10731: * RETURN HOST STRING ! 10732: * ! 10733: SHST1 BZE XL,EXNUL NULL STRING IF SYSHS UNCOOPERATIVE ! 10734: MOV SCLEN(XL),WA LENGTH ! 10735: ZER WB ZERO OFFSET ! 10736: JSR SBSTR BUILD COPY OF STRING ! 10737: MOV XR,-(XS) STACK THE RESULT ! 10738: BRN EXITS RETURN RESULT ON STACK ! 10739: EJC ! 10740: * ! 10741: * IDENT ! 10742: * ! 10743: S$IDN ENT ENTRY POINT ! 10744: MOV (XS)+,XR LOAD SECOND ARGUMENT ! 10745: MOV (XS)+,XL LOAD FIRST ARGUMENT ! 10746: JSR IDENT CALL IDENT COMPARISON ROUTINE ! 10747: PPM EXNUL RETURN NULL IF IDENT ! 10748: BRN EXFAL FAIL IF DIFFER ! 10749: EJC ! 10750: * ! 10751: * INPUT ! 10752: * ! 10753: S$INP ENT ENTRY POINT ! 10754: ZER WB INPUT FLAG ! 10755: JSR IOPUT CALL INPUT/OUTPUT ASSOC. ROUTINE ! 10756: ERR 113,INPUT THIRD ARGUMENT IS NOT A STRING ! 10757: ERR 114,INAPPROPRIATE SECOND ARGUMENT FOR INPUT ! 10758: ERR 115,INAPPROPRIATE FIRST ARGUMENT FOR INPUT ! 10759: ERR 116,INAPPROPRIATE FILE SPECIFICATION FOR INPUT ! 10760: PPM EXFAL FAIL IF FILE DOES NOT EXIST ! 10761: ERR 117,INPUT FILE CANNOT BE READ ! 10762: BRN EXNUL RETURN NULL STRING ! 10763: EJC ! 10764: * ! 10765: * INSERT ! 10766: * ! 10767: S$INS ENT ENTRY POINT ! 10768: MOV (XS)+,XL GET STRING ARG ! 10769: JSR GTSMI GET REPLACE LENGTH ! 10770: ERR 277,INSERT THIRD ARGUMENT NOT INTEGER ! 10771: PPM EXFAL FAIL IF OUT OF RANGE ! 10772: MOV WC,WB COPY TO PROPER REG ! 10773: JSR GTSMI GET REPLACE POSITION ! 10774: ERR 278,INSERT SECOND ARGUMENT NOT INTEGER ! 10775: PPM EXFAL FAIL IF OUT OF RANGE ! 10776: BZE WC,EXFAL FAIL IF ZERO ! 10777: DCV WC DECREMENT TO GET OFFSET ! 10778: MOV WC,WA PUT IN PROPER REGISTER ! 10779: MOV (XS)+,XR GET BUFFER ! 10780: BEQ (XR),=B$BCT,SINS1 PRESS ON IF TYPE OK ! 10781: ERB 279,INSERT FIRST ARGUMENT NOT BUFFER ! 10782: * ! 10783: * HERE WHEN EVERYTHING LOADED UP ! 10784: * ! 10785: SINS1 JSR INSBF CALL TO INSERT ! 10786: ERR 280,INSERT FOURTH ARGUMENT NOT A STRING ! 10787: PPM EXFAL FAIL IF OUT OF RANGE ! 10788: BRN EXNUL ELSE OK - EXIT WITH NULL ! 10789: EJC ! 10790: * ! 10791: * INTEGER ! 10792: * ! 10793: S$INT ENT ENTRY POINT ! 10794: MOV (XS)+,XR LOAD ARGUMENT ! 10795: JSR GTNUM CONVERT TO NUMERIC ! 10796: PPM EXFAL FAIL IF NON-NUMERIC ! 10797: BEQ WA,=B$ICL,EXNUL RETURN NULL IF INTEGER ! 10798: BRN EXFAL FAIL IF REAL ! 10799: EJC ! 10800: * ! 10801: * ITEM ! 10802: * ! 10803: * ITEM DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT ! 10804: * WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED. ! 10805: * ! 10806: S$ITM ENT ENTRY POINT ! 10807: * ! 10808: * DEAL WITH CASE OF NO ARGS ! 10809: * ! 10810: BNZ WA,SITM1 JUMP IF AT LEAST ONE ARG ! 10811: MOV =NULLS,-(XS) ELSE SUPPLY GARBAGE NULL ARG ! 10812: MOV =NUM01,WA AND FIX ARGUMENT COUNT ! 10813: * ! 10814: * CHECK FOR NAME/VALUE CASES ! 10815: * ! 10816: SITM1 SCP XR GET CURRENT CODE POINTER ! 10817: MOV (XR),XL LOAD NEXT CODE WORD ! 10818: DCV WA GET NUMBER OF SUBSCRIPTS ! 10819: MOV WA,XR COPY FOR ARREF ! 10820: BEQ XL,=OFNE$,SITM2 JUMP IF CALLED BY NAME ! 10821: * ! 10822: * HERE IF CALLED BY VALUE ! 10823: * ! 10824: ZER WB SET CODE FOR CALL BY VALUE ! 10825: BRN ARREF OFF TO ARRAY REFERENCE ROUTINE ! 10826: * ! 10827: * HERE FOR CALL BY NAME ! 10828: * ! 10829: SITM2 MNZ WB SET CODE FOR CALL BY NAME ! 10830: LCW WA LOAD AND IGNORE OFNE$ CALL ! 10831: BRN ARREF OFF TO ARRAY REFERENCE ROUTINE ! 10832: EJC ! 10833: * ! 10834: * LE ! 10835: * ! 10836: S$LEF ENT ENTRY POINT ! 10837: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE ! 10838: ERR 118,LE FIRST ARGUMENT IS NOT NUMERIC ! 10839: ERR 119,LE SECOND ARGUMENT IS NOT NUMERIC ! 10840: PPM EXNUL RETURN NULL IF LT ! 10841: PPM EXNUL RETURN NULL IF EQ ! 10842: PPM EXFAL FAIL IF GT ! 10843: EJC ! 10844: * ! 10845: * LEN ! 10846: * ! 10847: S$LEN ENT ENTRY POINT ! 10848: MOV =P$LEN,WB SET PCODE FOR INTEGER ARG CASE ! 10849: MOV =P$LND,WA SET PCODE FOR EXPR ARG CASE ! 10850: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE ! 10851: ERR 120,LEN ARGUMENT IS NOT INTEGER OR EXPRESSION ! 10852: ERR 121,LEN ARGUMENT IS NEGATIVE OR TOO LARGE ! 10853: BRN EXIXR RETURN PATTERN NODE ! 10854: EJC ! 10855: * ! 10856: * LEQ ! 10857: * ! 10858: S$LEQ ENT ENTRY POINT ! 10859: JSR LCOMP CALL STRING COMPARISON ROUTINE ! 10860: ERR 122,LEQ FIRST ARGUMENT IS NOT STRING ! 10861: ERR 123,LEQ SECOND ARGUMENT IS NOT STRING ! 10862: PPM EXFAL FAIL IF LLT ! 10863: PPM EXNUL RETURN NULL IF LEQ ! 10864: PPM EXFAL FAIL IF LGT ! 10865: EJC ! 10866: * ! 10867: * LGE ! 10868: * ! 10869: S$LGE ENT ENTRY POINT ! 10870: JSR LCOMP CALL STRING COMPARISON ROUTINE ! 10871: ERR 124,LGE FIRST ARGUMENT IS NOT STRING ! 10872: ERR 125,LGE SECOND ARGUMENT IS NOT STRING ! 10873: PPM EXFAL FAIL IF LLT ! 10874: PPM EXNUL RETURN NULL IF LEQ ! 10875: PPM EXNUL RETURN NULL IF LGT ! 10876: EJC ! 10877: * ! 10878: * LGT ! 10879: * ! 10880: S$LGT ENT ENTRY POINT ! 10881: JSR LCOMP CALL STRING COMPARISON ROUTINE ! 10882: ERR 126,LGT FIRST ARGUMENT IS NOT STRING ! 10883: ERR 127,LGT SECOND ARGUMENT IS NOT STRING ! 10884: PPM EXFAL FAIL IF LLT ! 10885: PPM EXFAL FAIL IF LEQ ! 10886: PPM EXNUL RETURN NULL IF LGT ! 10887: EJC ! 10888: * ! 10889: * LLE ! 10890: * ! 10891: S$LLE ENT ENTRY POINT ! 10892: JSR LCOMP CALL STRING COMPARISON ROUTINE ! 10893: ERR 128,LLE FIRST ARGUMENT IS NOT STRING ! 10894: ERR 129,LLE SECOND ARGUMENT IS NOT STRING ! 10895: PPM EXNUL RETURN NULL IF LLT ! 10896: PPM EXNUL RETURN NULL IF LEQ ! 10897: PPM EXFAL FAIL IF LGT ! 10898: EJC ! 10899: * ! 10900: * LLT ! 10901: * ! 10902: S$LLT ENT ENTRY POINT ! 10903: JSR LCOMP CALL STRING COMPARISON ROUTINE ! 10904: ERR 130,LLT FIRST ARGUMENT IS NOT STRING ! 10905: ERR 131,LLT SECOND ARGUMENT IS NOT STRING ! 10906: PPM EXNUL RETURN NULL IF LLT ! 10907: PPM EXFAL FAIL IF LEQ ! 10908: PPM EXFAL FAIL IF LGT ! 10909: EJC ! 10910: * ! 10911: * LNE ! 10912: * ! 10913: S$LNE ENT ENTRY POINT ! 10914: JSR LCOMP CALL STRING COMPARISON ROUTINE ! 10915: ERR 132,LNE FIRST ARGUMENT IS NOT STRING ! 10916: ERR 133,LNE SECOND ARGUMENT IS NOT STRING ! 10917: PPM EXNUL RETURN NULL IF LLT ! 10918: PPM EXFAL FAIL IF LEQ ! 10919: PPM EXNUL RETURN NULL IF LGT ! 10920: EJC ! 10921: * ! 10922: * LOCAL ! 10923: * ! 10924: S$LOC ENT ENTRY POINT ! 10925: JSR GTSMI GET SECOND ARGUMENT (LOCAL NUMBER) ! 10926: ERR 134,LOCAL SECOND ARGUMENT IS NOT INTEGER ! 10927: PPM EXFAL FAIL IF OUT OF RANGE ! 10928: MOV XR,WB SAVE LOCAL NUMBER ! 10929: MOV (XS)+,XR LOAD FIRST ARGUMENT ! 10930: JSR GTNVR POINT TO VRBLK ! 10931: PPM SLOC1 JUMP IF NOT VARIABLE NAME ! 10932: MOV VRFNC(XR),XR ELSE LOAD FUNCTION POINTER ! 10933: BNE (XR),=B$PFC,SLOC1 JUMP IF NOT PROGRAM DEFINED ! 10934: * ! 10935: * HERE IF WE HAVE A PROGRAM DEFINED FUNCTION NAME ! 10936: * ! 10937: BZE WB,EXFAL FAIL IF SECOND ARG IS ZERO ! 10938: BGT WB,PFNLO(XR),EXFAL OR TOO LARGE ! 10939: ADD FARGS(XR),WB ELSE ADJUST OFFSET TO INCLUDE ARGS ! 10940: WTB WB CONVERT TO BYTES ! 10941: ADD WB,XR POINT TO LOCAL POINTER ! 10942: MOV PFAGB(XR),XR LOAD VRBLK POINTER ! 10943: BRN EXVNM EXIT BUILDING NMBLK ! 10944: * ! 10945: * HERE IF FIRST ARGUMENT IS NO GOOD ! 10946: * ! 10947: SLOC1 ERB 135,LOCAL FIRST ARG IS NOT A PROGRAM FUNCTION NAME ! 10948: EJC ! 10949: * ! 10950: * LOAD ! 10951: * ! 10952: S$LOD ENT ENTRY POINT ! 10953: JSR GTSTG LOAD LIBRARY NAME ! 10954: ERR 136,LOAD SECOND ARGUMENT IS NOT STRING ! 10955: MOV XR,XL SAVE LIBRARY NAME ! 10956: JSR XSCNI PREPARE TO SCAN FIRST ARGUMENT ! 10957: ERR 137,LOAD FIRST ARGUMENT IS NOT STRING ! 10958: ERR 138,LOAD FIRST ARGUMENT IS NULL ! 10959: MOV XL,-(XS) STACK LIBRARY NAME ! 10960: MOV =CH$PP,WC SET DELIMITER ONE = LEFT PAREN ! 10961: MOV WC,XL SET DELIMITER TWO = LEFT PAREN ! 10962: JSR XSCAN SCAN FUNCTION NAME ! 10963: MOV XR,-(XS) SAVE PTR TO FUNCTION NAME ! 10964: BNZ WA,SLOD1 JUMP IF LEFT PAREN FOUND ! 10965: ERB 139,LOAD FIRST ARGUMENT IS MISSING A LEFT PAREN ! 10966: * ! 10967: * HERE AFTER SUCCESSFULLY SCANNING FUNCTION NAME ! 10968: * ! 10969: SLOD1 JSR GTNVR LOCATE VRBLK ! 10970: ERR 140,LOAD FIRST ARGUMENT HAS NULL FUNCTION NAME ! 10971: MOV XR,LODFN SAVE VRBLK POINTER ! 10972: ZER LODNA ZERO COUNT OF ARGUMENTS ! 10973: * ! 10974: * LOOP TO SCAN ARGUMENT DATATYPE NAMES ! 10975: * ! 10976: SLOD2 MOV =CH$RP,WC DELIMITER ONE IS RIGHT PAREN ! 10977: MOV =CH$CM,XL DELIMITER TWO IS COMMA ! 10978: JSR XSCAN SCAN NEXT ARGUMENT NAME ! 10979: ICV LODNA BUMP ARGUMENT COUNT ! 10980: BNZ WA,SLOD3 JUMP IF OK DELIMITER WAS FOUND ! 10981: ERB 141,LOAD FIRST ARGUMENT IS MISSING A RIGHT PAREN ! 10982: EJC ! 10983: * ! 10984: * LOAD (CONTINUED) ! 10985: * ! 10986: * COME HERE TO ANALYZE THE DATATYPE POINTER IN (XR). THIS ! 10987: * CODE IS USED BOTH FOR ARGUMENTS (WA=1,2) AND FOR THE ! 10988: * RESULT DATATYPE (WITH WA SET TO ZERO). ! 10989: * ! 10990: SLOD3 MOV XR,-(XS) STACK DATATYPE NAME POINTER ! 10991: MOV =NUM01,WB SET STRING CODE IN CASE ! 10992: MOV =SCSTR,XL POINT TO /STRING/ ! 10993: JSR IDENT CHECK FOR MATCH ! 10994: PPM SLOD4 JUMP IF MATCH ! 10995: MOV (XS),XR ELSE RELOAD NAME ! 10996: ADD WB,WB SET CODE FOR INTEGER (2) ! 10997: MOV =SCINT,XL POINT TO /INTEGER/ ! 10998: JSR IDENT CHECK FOR MATCH ! 10999: PPM SLOD4 JUMP IF MATCH ! 11000: MOV (XS),XR ELSE RELOAD STRING POINTER ! 11001: ICV WB SET CODE FOR REAL (3) ! 11002: MOV =SCREA,XL POINT TO /REAL/ ! 11003: JSR IDENT CHECK FOR MATCH ! 11004: PPM SLOD4 JUMP IF MATCH ! 11005: ZER WB ELSE GET CODE FOR NO CONVERT ! 11006: * ! 11007: * MERGE HERE WITH PROPER DATATYPE CODE IN WB ! 11008: * ! 11009: SLOD4 MOV WB,(XS) STORE CODE ON STACK ! 11010: BEQ WA,=NUM02,SLOD2 LOOP BACK IF ARG STOPPED BY COMMA ! 11011: BZE WA,SLOD5 JUMP IF THAT WAS THE RESULT TYPE ! 11012: * ! 11013: * HERE WE SCAN OUT THE RESULT TYPE (ARG STOPPED BY ) ) ! 11014: * ! 11015: MOV MXLEN,WC SET DUMMY (IMPOSSIBLE) DELIMITER 1 ! 11016: MOV WC,XL AND DELIMITER TWO ! 11017: JSR XSCAN SCAN RESULT NAME ! 11018: ZER WA SET CODE FOR PROCESSING RESULT ! 11019: BRN SLOD3 JUMP BACK TO PROCESS RESULT NAME ! 11020: EJC ! 11021: * ! 11022: * LOAD (CONTINUED) ! 11023: * ! 11024: * HERE AFTER PROCESSING ALL ARGS AND RESULT ! 11025: * ! 11026: SLOD5 MOV LODNA,WA GET NUMBER OF ARGUMENTS ! 11027: MOV WA,WC COPY FOR LATER ! 11028: WTB WA CONVERT LENGTH TO BYTES ! 11029: ADD *EFSI$,WA ADD SPACE FOR STANDARD FIELDS ! 11030: JSR ALLOC ALLOCATE EFBLK ! 11031: MOV =B$EFC,(XR) SET TYPE WORD ! 11032: MOV WC,FARGS(XR) SET NUMBER OF ARGUMENTS ! 11033: ZER EFUSE(XR) SET USE COUNT (DFFNC WILL SET TO 1) ! 11034: ZER EFCOD(XR) ZERO CODE POINTER FOR NOW ! 11035: MOV (XS)+,EFRSL(XR) STORE RESULT TYPE CODE ! 11036: MOV LODFN,EFVAR(XR) STORE FUNCTION VRBLK POINTER ! 11037: MOV WA,EFLEN(XR) STORE EFBLK LENGTH ! 11038: MOV XR,WB SAVE EFBLK POINTER ! 11039: ADD WA,XR POINT PAST END OF EFBLK ! 11040: LCT WC,WC SET NUMBER OF ARGUMENTS FOR LOOP ! 11041: * ! 11042: * LOOP TO SET ARGUMENT TYPE CODES FROM STACK ! 11043: * ! 11044: SLOD6 MOV (XS)+,-(XR) STORE ONE TYPE CODE FROM STACK ! 11045: BCT WC,SLOD6 LOOP TILL ALL STORED ! 11046: * ! 11047: * NOW LOAD THE EXTERNAL FUNCTION AND PERFORM DEFINITION ! 11048: * ! 11049: MOV (XS)+,XR LOAD FUNCTION STRING NAME ! 11050: MOV (XS),XL LOAD LIBRARY NAME ! 11051: MOV WB,(XS) STORE EFBLK POINTER ! 11052: JSR SYSLD CALL FUNCTION TO LOAD EXTERNAL FUNC ! 11053: ERR 142,LOAD FUNCTION DOES NOT EXIST ! 11054: ERR 143,LOAD FUNCTION CAUSED INPUT ERROR DURING LOAD ! 11055: MOV (XS)+,XL RECALL EFBLK POINTER ! 11056: MOV XR,EFCOD(XL) STORE CODE POINTER ! 11057: MOV LODFN,XR POINT TO VRBLK FOR FUNCTION ! 11058: JSR DFFNC PERFORM FUNCTION DEFINITION ! 11059: BRN EXNUL RETURN NULL RESULT ! 11060: EJC ! 11061: * ! 11062: * LPAD ! 11063: * ! 11064: S$LPD ENT ENTRY POINT ! 11065: JSR GTSTG GET PAD CHARACTER ! 11066: ERR 144,LPAD THIRD ARGUMENT NOT A STRING ! 11067: PLC XR POINT TO CHARACTER (NULL IS BLANK) ! 11068: LCH WB,(XR) LOAD PAD CHARACTER ! 11069: JSR GTSMI GET PAD LENGTH ! 11070: ERR 145,LPAD SECOND ARGUMENT IS NOT INTEGER ! 11071: PPM SLPD3 SKIP IF NEGATIVE OR LARGE ! 11072: * ! 11073: * MERGE TO CHECK FIRST ARG ! 11074: * ! 11075: SLPD1 JSR GTSTG GET FIRST ARGUMENT (STRING TO PAD) ! 11076: ERR 146,LPAD FIRST ARGUMENT IS NOT STRING ! 11077: BGE WA,WC,EXIXR RETURN 1ST ARG IF TOO LONG TO PAD ! 11078: MOV XR,XL ELSE MOVE PTR TO STRING TO PAD ! 11079: * ! 11080: * NOW WE ARE READY FOR THE PAD ! 11081: * ! 11082: * (XL) POINTER TO STRING TO PAD ! 11083: * (WB) PAD CHARACTER ! 11084: * (WC) LENGTH TO PAD STRING TO ! 11085: * ! 11086: MOV WC,WA COPY LENGTH ! 11087: JSR ALOCS ALLOCATE SCBLK FOR NEW STRING ! 11088: MOV XR,-(XS) SAVE AS RESULT ! 11089: MOV SCLEN(XL),WA LOAD LENGTH OF ARGUMENT ! 11090: SUB WA,WC CALCULATE NUMBER OF PAD CHARACTERS ! 11091: PSC XR POINT TO CHARS IN RESULT STRING ! 11092: LCT WC,WC SET COUNTER FOR PAD LOOP ! 11093: * ! 11094: * LOOP TO PERFORM PAD ! 11095: * ! 11096: SLPD2 SCH WB,(XR)+ STORE PAD CHARACTER, BUMP PTR ! 11097: BCT WC,SLPD2 LOOP TILL ALL PAD CHARS STORED ! 11098: CSC XR COMPLETE STORE CHARACTERS ! 11099: * ! 11100: * NOW COPY STRING ! 11101: * ! 11102: BZE WA,EXITS EXIT IF NULL STRING ! 11103: PLC XL ELSE POINT TO CHARS IN ARGUMENT ! 11104: MVC MOVE CHARACTERS TO RESULT STRING ! 11105: BRN EXITS JUMP FOR NEXT CODE WORD ! 11106: * ! 11107: * HERE IF 2ND ARG IS NEGATIVE OR LARGE ! 11108: * ! 11109: SLPD3 ZER WC ZERO PAD COUNT ! 11110: BRN SLPD1 MERGE ! 11111: EJC ! 11112: * ! 11113: * LT ! 11114: * ! 11115: S$LTF ENT ENTRY POINT ! 11116: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE ! 11117: ERR 147,LT FIRST ARGUMENT IS NOT NUMERIC ! 11118: ERR 148,LT SECOND ARGUMENT IS NOT NUMERIC ! 11119: PPM EXNUL RETURN NULL IF LT ! 11120: PPM EXFAL FAIL IF EQ ! 11121: PPM EXFAL FAIL IF GT ! 11122: EJC ! 11123: * ! 11124: * NE ! 11125: * ! 11126: S$NEF ENT ENTRY POINT ! 11127: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE ! 11128: ERR 149,NE FIRST ARGUMENT IS NOT NUMERIC ! 11129: ERR 150,NE SECOND ARGUMENT IS NOT NUMERIC ! 11130: PPM EXNUL RETURN NULL IF LT ! 11131: PPM EXFAL FAIL IF EQ ! 11132: PPM EXNUL RETURN NULL IF GT ! 11133: EJC ! 11134: * ! 11135: * NOTANY ! 11136: * ! 11137: S$NAY ENT ENTRY POINT ! 11138: MOV =P$NAS,WB SET PCODE FOR SINGLE CHAR ARG ! 11139: MOV =P$NAY,XL PCODE FOR MULTI-CHAR ARG ! 11140: MOV =P$NAD,WC SET PCODE FOR EXPR ARG ! 11141: JSR PATST CALL COMMON ROUTINE TO BUILD NODE ! 11142: ERR 151,NOTANY ARGUMENT IS NOT STRING OR EXPRESSION ! 11143: BRN EXIXR JUMP FOR NEXT CODE WORD ! 11144: EJC ! 11145: * ! 11146: * OPSYN ! 11147: * ! 11148: S$OPS ENT ENTRY POINT ! 11149: JSR GTSMI LOAD THIRD ARGUMENT ! 11150: ERR 152,OPSYN THIRD ARGUMENT IS NOT INTEGER ! 11151: ERR 153,OPSYN THIRD ARGUMENT IS NEGATIVE OR TOO LARGE ! 11152: MOV WC,WB IF OK, SAVE THIRD ARGUMNET ! 11153: MOV (XS)+,XR LOAD SECOND ARGUMENT ! 11154: JSR GTNVR LOCATE VARIABLE BLOCK ! 11155: ERR 154,OPSYN SECOND ARG IS NOT NATURAL VARIABLE NAME ! 11156: MOV VRFNC(XR),XL IF OK, LOAD FUNCTION BLOCK POINTER ! 11157: BNZ WB,SOPS2 JUMP IF OPERATOR OPSYN CASE ! 11158: * ! 11159: * HERE FOR FUNCTION OPSYN (THIRD ARG ZERO) ! 11160: * ! 11161: MOV (XS)+,XR LOAD FIRST ARGUMENT ! 11162: JSR GTNVR GET VRBLK POINTER ! 11163: ERR 155,OPSYN FIRST ARG IS NOT NATURAL VARIABLE NAME ! 11164: * ! 11165: * MERGE HERE TO PERFORM FUNCTION DEFINITION ! 11166: * ! 11167: SOPS1 JSR DFFNC CALL FUNCTION DEFINER ! 11168: BRN EXNUL EXIT WITH NULL RESULT ! 11169: * ! 11170: * HERE FOR OPERATOR OPSYN (THIRD ARG NON-ZERO) ! 11171: * ! 11172: SOPS2 JSR GTSTG GET OPERATOR NAME ! 11173: PPM SOPS5 JUMP IF NOT STRING ! 11174: BNE WA,=NUM01,SOPS5 ERROR IF NOT ONE CHAR LONG ! 11175: PLC XR ELSE POINT TO CHARACTER ! 11176: LCH WC,(XR) LOAD CHARACTER NAME ! 11177: EJC ! 11178: * ! 11179: * OPSYN (CONTINUED) ! 11180: * ! 11181: * NOW SET TO SEARCH FOR MATCHING UNARY OR BINARY OPERATOR ! 11182: * NAME AS APPROPRIATE. NOTE THAT THERE ARE =OPBUN UNDEFINED ! 11183: * BINARY OPERATORS AND =OPUUN UNDEFINED UNARY OPERATORS. ! 11184: * ! 11185: MOV =R$UUB,WA POINT TO UNOP POINTERS IN CASE ! 11186: MOV =OPNSU,XR POINT TO NAMES OF UNARY OPERATORS ! 11187: ADD =OPBUN,WB ADD NO. OF UNDEFINED BINARY OPS ! 11188: BEQ WB,=OPUUN,SOPS3 JUMP IF UNOP (THIRD ARG WAS 1) ! 11189: MOV =R$UBA,WA ELSE POINT TO BINARY OPERATOR PTRS ! 11190: MOV =OPSNB,XR POINT TO NAMES OF BINARY OPERATORS ! 11191: MOV =OPBUN,WB SET NUMBER OF UNDEFINED BINOPS ! 11192: * ! 11193: * MERGE HERE TO CHECK LIST (WB = NUMBER TO CHECK) ! 11194: * ! 11195: SOPS3 LCT WB,WB SET COUNTER TO CONTROL LOOP ! 11196: * ! 11197: * LOOP TO SEARCH FOR NAME MATCH ! 11198: * ! 11199: SOPS4 BEQ WC,(XR),SOPS6 JUMP IF NAMES MATCH ! 11200: ICA WA ELSE PUSH POINTER TO FUNCTION PTR ! 11201: ICA XR BUMP POINTER ! 11202: BCT WB,SOPS4 LOOP BACK TILL ALL CHECKED ! 11203: * ! 11204: * HERE IF BAD OPERATOR NAME ! 11205: * ! 11206: SOPS5 ERB 156,OPSYN FIRST ARG IS NOT CORRECT OPERATOR NAME ! 11207: * ! 11208: * COME HERE ON FINDING A MATCH IN THE OPERATOR NAME TABLE ! 11209: * ! 11210: SOPS6 MOV WA,XR COPY POINTER TO FUNCTION BLOCK PTR ! 11211: SUB *VRFNC,XR MAKE IT LOOK LIKE DUMMY VRBLK ! 11212: BRN SOPS1 MERGE BACK TO DEFINE OPERATOR ! 11213: EJC ! 11214: * ! 11215: * OUTPUT ! 11216: * ! 11217: S$OUP ENT ENTRY POINT ! 11218: MOV =NUM03,WB OUTPUT FLAG ! 11219: JSR IOPUT CALL INPUT/OUTPUT ASSOC. ROUTINE ! 11220: ERR 157,OUTPUT THIRD ARGUMENT IS NOT A STRING ! 11221: ERR 158,INAPPROPRIATE SECOND ARGUMENT FOR OUTPUT ! 11222: ERR 159,INAPPROPRIATE FIRST ARGUMENT FOR OUTPUT ! 11223: ERR 160,INAPPROPRIATE FILE SPECIFICATION FOR OUTPUT ! 11224: PPM EXFAL FAIL IF FILE DOES NOT EXIST ! 11225: ERR 161,OUTPUT FILE CANNOT BE WRITTEN TO ! 11226: BRN EXNUL RETURN NULL STRING ! 11227: EJC ! 11228: * ! 11229: * POS ! 11230: * ! 11231: S$POS ENT ENTRY POINT ! 11232: MOV =P$POS,WB SET PCODE FOR INTEGER ARG CASE ! 11233: MOV =P$PSD,WA SET PCODE FOR EXPRESSION ARG CASE ! 11234: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE ! 11235: ERR 162,POS ARGUMENT IS NOT INTEGER OR EXPRESSION ! 11236: ERR 163,POS ARGUMENT IS NEGATIVE OR TOO LARGE ! 11237: BRN EXIXR RETURN PATTERN NODE ! 11238: EJC ! 11239: * ! 11240: * PROTOTYPE ! 11241: * ! 11242: S$PRO ENT ENTRY POINT ! 11243: MOV (XS)+,XR LOAD ARGUMENT ! 11244: MOV TBLEN(XR),WB LENGTH IF TABLE, VECTOR (=VCLEN) ! 11245: BTW WB CONVERT TO WORDS ! 11246: MOV (XR),WA LOAD TYPE WORD OF ARGUMENT BLOCK ! 11247: BEQ WA,=B$ART,SPRO4 JUMP IF ARRAY ! 11248: BEQ WA,=B$TBT,SPRO1 JUMP IF TABLE ! 11249: BEQ WA,=B$VCT,SPRO3 JUMP IF VECTOR ! 11250: BEQ WA,=B$BCT,SPR05 JUMP IF BUFFER ! 11251: ERB 164,PROTOTYPE ARGUMENT IS NOT VALID OBJECT ! 11252: * ! 11253: * HERE FOR TABLE ! 11254: * ! 11255: SPRO1 SUB =TBSI$,WB SUBTRACT STANDARD FIELDS ! 11256: * ! 11257: * MERGE FOR VECTOR ! 11258: * ! 11259: SPRO2 MTI WB CONVERT TO INTEGER ! 11260: BRN EXINT EXIT WITH INTEGER RESULT ! 11261: * ! 11262: * HERE FOR VECTOR ! 11263: * ! 11264: SPRO3 SUB =VCSI$,WB SUBTRACT STANDARD FIELDS ! 11265: BRN SPRO2 MERGE ! 11266: * ! 11267: * HERE FOR ARRAY ! 11268: * ! 11269: SPRO4 ADD AROFS(XR),XR POINT TO PROTOTYPE FIELD ! 11270: MOV (XR),XR LOAD PROTOTYPE ! 11271: BRN EXIXR RETURN PROTOTYPE AS RESULT ! 11272: * ! 11273: * HERE FOR BUFFER ! 11274: * ! 11275: SPR05 MOV BCBUF(XR),XR POINT TO BFBLK ! 11276: MTI BFALC(XR) LOAD ALLOCATED LENGTH ! 11277: BRN EXINT EXIT WITH INTEGER ALLOCATION ! 11278: EJC ! 11279: * ! 11280: * REMDR ! 11281: * ! 11282: S$RMD ENT ENTRY POINT ! 11283: ZER WB SET POSITIVE FLAG ! 11284: MOV (XS),XR LOAD SECOND ARGUMENT ! 11285: JSR GTINT CONVERT TO INTEGER ! 11286: ERR 165,REMDR SECOND ARGUMENT IS NOT INTEGER ! 11287: JSR ARITH CONVERT ARGS ! 11288: PPM SRM01 FIRST ARG NOT INTEGER ! 11289: PPM SECOND ARG CHECKED ABOVE ! 11290: PPM SRM01 FIRST ARG REAL ! 11291: LDI ICVAL(XR) LOAD LEFT ARGUMENT VALUE ! 11292: RMI ICVAL(XL) GET REMAINDER ! 11293: INO EXINT JUMP IF NO OVERFLOW ! 11294: ERB 167,REMDR CAUSED INTEGER OVERFLOW ! 11295: * ! 11296: * FAIL FIRST ARGUMENT ! 11297: * ! 11298: SRM01 ERB 166,REMDR FIRST ARGUMENT IS NOT INTEGER ! 11299: EJC ! 11300: * ! 11301: * REPLACE ! 11302: * ! 11303: * THE ACTUAL REPLACE OPERATION USES AN SCBLK WHOSE CFP$A ! 11304: * CHARS CONTAIN THE TRANSLATED VERSIONS OF ALL THE CHARS. ! 11305: * THE TABLE POINTER IS REMEMBERED FROM CALL TO CALL AND ! 11306: * THE TABLE IS ONLY BUILT WHEN THE ARGUMENTS CHANGE. ! 11307: * ! 11308: S$RPL ENT ENTRY POINT ! 11309: JSR GTSTG LOAD THIRD ARGUMENT AS STRING ! 11310: ERR 168,REPLACE THIRD ARGUMENT IS NOT STRING ! 11311: MOV XR,XL SAVE THIRD ARG PTR ! 11312: JSR GTSTG GET SECOND ARGUMENT ! 11313: ERR 169,REPLACE SECOND ARGUMENT IS NOT STRING ! 11314: * ! 11315: * CHECK TO SEE IF THIS IS THE SAME TABLE AS LAST TIME ! 11316: * ! 11317: BNE XR,R$RA2,SRPL1 JUMP IF 2ND ARGUMENT DIFFERENT ! 11318: BEQ XL,R$RA3,SRPL4 JUMP IF ARGS SAME AS LAST TIME ! 11319: * ! 11320: * HERE WE BUILD A NEW REPLACE TABLE (NOTE WA = 2ND ARG LEN) ! 11321: * ! 11322: SRPL1 MOV SCLEN(XL),WB LOAD 3RD ARGUMENT LENGTH ! 11323: BNE WA,WB,SRPL5 JUMP IF ARGUMENTS NOT SAME LENGTH ! 11324: BZE WB,SRPL5 JUMP IF NULL 2ND ARGUMENT ! 11325: MOV XL,R$RA3 SAVE THIRD ARG FOR NEXT TIME IN ! 11326: MOV XR,R$RA2 SAVE SECOND ARG FOR NEXT TIME IN ! 11327: MOV KVALP,XL POINT TO ALPHABET STRING ! 11328: MOV SCLEN(XL),WA LOAD ALPHABET SCBLK LENGTH ! 11329: MOV R$RPT,XR POINT TO CURRENT TABLE (IF ANY) ! 11330: BNZ XR,SRPL2 JUMP IF WE ALREADY HAVE A TABLE ! 11331: * ! 11332: * HERE WE ALLOCATE A NEW TABLE ! 11333: * ! 11334: JSR ALOCS ALLOCATE NEW TABLE ! 11335: MOV WC,WA KEEP SCBLK LENGTH ! 11336: MOV XR,R$RPT SAVE TABLE POINTER FOR NEXT TIME ! 11337: * ! 11338: * MERGE HERE WITH POINTER TO NEW TABLE BLOCK IN (XR) ! 11339: * ! 11340: SRPL2 CTB WA,SCSI$ COMPUTE LENGTH OF SCBLK ! 11341: MVW COPY TO GET INITIAL TABLE VALUES ! 11342: EJC ! 11343: * ! 11344: * REPLACE (CONTINUED) ! 11345: * ! 11346: * NOW WE MUST PLUG SELECTED ENTRIES AS REQUIRED. NOTE THAT ! 11347: * WE ARE SHORT OF INDEX REGISTERS FOR THE FOLLOWING LOOP. ! 11348: * HENCE THE NEED TO REPEATEDLY RE-INITIALISE CHAR PTR XL ! 11349: * ! 11350: MOV R$RA2,XL POINT TO SECOND ARGUMENT ! 11351: LCT WB,WB NUMBER OF CHARS TO PLUG ! 11352: ZER WC ZERO CHAR OFFSET ! 11353: MOV R$RA3,XR POINT TO 3RD ARG ! 11354: PLC XR GET CHAR PTR FOR 3RD ARG ! 11355: * ! 11356: * LOOP TO PLUG CHARS ! 11357: * ! 11358: SRPL3 MOV R$RA2,XL POINT TO 2ND ARG ! 11359: PLC XL,WC POINT TO NEXT CHAR ! 11360: ICV WC INCREMENT OFFSET ! 11361: LCH WA,(XL) GET NEXT CHAR ! 11362: MOV R$RPT,XL POINT TO TRANSLATE TABLE ! 11363: PSC XL,WA CONVERT CHAR TO OFFSET INTO TABLE ! 11364: LCH WA,(XR)+ GET TRANSLATED CHAR ! 11365: SCH WA,(XL) STORE IN TABLE ! 11366: CSC XL COMPLETE STORE CHARACTERS ! 11367: BCT WB,SRPL3 LOOP TILL DONE ! 11368: EJC ! 11369: * ! 11370: * REPLACE (CONTINUED) ! 11371: * ! 11372: * HERE TO PERFORM TRANSLATE ! 11373: * ! 11374: SRPL4 JSR GTSTG GET FIRST ARGUMENT ! 11375: ERR 170,REPLACE FIRST ARGUMENT IS NOT STRING ! 11376: BZE WA,EXNUL RETURN NULL IF NULL ARGUMENT ! 11377: MOV XR,XL COPY POINTER ! 11378: MOV WA,WC SAVE LENGTH ! 11379: CTB WA,SCHAR GET SCBLK LENGTH ! 11380: JSR ALLOC ALLOCATE SPACE FOR COPY ! 11381: MOV XR,WB SAVE ADDRESS OF COPY ! 11382: MVW MOVE SCBLK CONTENTS TO COPY ! 11383: MOV R$RPT,XR POINT TO REPLACE TABLE ! 11384: PLC XR POINT TO CHARS OF TABLE ! 11385: MOV WB,XL POINT TO STRING TO TRANSLATE ! 11386: PLC XL POINT TO CHARS OF STRING ! 11387: MOV WC,WA SET NUMBER OF CHARS TO TRANSLATE ! 11388: TRC PERFORM TRANSLATION ! 11389: MOV WB,-(XS) STACK NEW STRING AS RESULT ! 11390: BRN EXITS RETURN WITH RESULT ON STACK ! 11391: * ! 11392: * ERROR POINT ! 11393: * ! 11394: SRPL5 ERB 171,NULL OR UNEQUALLY LONG 2ND, 3RD ARGS TO REPLACE ! 11395: EJC ! 11396: * ! 11397: * REWIND ! 11398: * ! 11399: S$REW ENT ENTRY POINT ! 11400: JSR IOFCB CALL FCBLK ROUTINE ! 11401: ERR 172,REWIND ARGUMENT IS NOT A SUITABLE NAME ! 11402: ERR 173,REWIND ARGUMENT IS NULL ! 11403: JSR SYSRW CALL SYSTEM REWIND FUNCTION ! 11404: ERR 174,REWIND FILE DOES NOT EXIST ! 11405: ERR 175,REWIND FILE DOES NOT PERMIT REWIND ! 11406: ERR 176,REWIND CAUSED NON-RECOVERABLE ERROR ! 11407: BRN EXNUL EXIT WITH NULL RESULT IF NO ERROR ! 11408: EJC ! 11409: * ! 11410: * REVERSE ! 11411: * ! 11412: S$RVS ENT ENTRY POINT ! 11413: JSR GTSTG LOAD STRING ARGUMENT ! 11414: ERR 177,REVERSE ARGUMENT IS NOT STRING ! 11415: BZE WA,EXIXR RETURN ARGUMENT IF NULL ! 11416: MOV XR,XL ELSE SAVE POINTER TO STRING ARG ! 11417: JSR ALOCS ALLOCATE SPACE FOR NEW SCBLK ! 11418: MOV XR,-(XS) STORE SCBLK PTR ON STACK AS RESULT ! 11419: PSC XR PREPARE TO STORE IN NEW SCBLK ! 11420: PLC XL,WC POINT PAST LAST CHAR IN ARGUMENT ! 11421: LCT WC,WC SET LOOP COUNTER ! 11422: * ! 11423: * LOOP TO MOVE CHARS IN REVERSE ORDER ! 11424: * ! 11425: SRVS1 LCH WB,-(XL) LOAD NEXT CHAR FROM ARGUMENT ! 11426: SCH WB,(XR)+ STORE IN RESULT ! 11427: BCT WC,SRVS1 LOOP TILL ALL MOVED ! 11428: CSC XR COMPLETE STORE CHARACTERS ! 11429: BRN EXITS AND THEN JUMP FOR NEXT CODE WORD ! 11430: EJC ! 11431: * ! 11432: * RPAD ! 11433: * ! 11434: S$RPD ENT ENTRY POINT ! 11435: JSR GTSTG GET PAD CHARACTER ! 11436: ERR 178,RPAD THIRD ARGUMENT IS NOT STRING ! 11437: PLC XR POINT TO CHARACTER (NULL IS BLANK) ! 11438: LCH WB,(XR) LOAD PAD CHARACTER ! 11439: JSR GTSMI GET PAD LENGTH ! 11440: ERR 179,RPAD SECOND ARGUMENT IS NOT INTEGER ! 11441: PPM SRPD3 SKIP IF NEGATIVE OR LARGE ! 11442: * ! 11443: * MERGE TO CHECK FIRST ARG. ! 11444: * ! 11445: SRPD1 JSR GTSTG GET FIRST ARGUMENT (STRING TO PAD) ! 11446: ERR 180,RPAD FIRST ARGUMENT IS NOT STRING ! 11447: BGE WA,WC,EXIXR RETURN 1ST ARG IF TOO LONG TO PAD ! 11448: MOV XR,XL ELSE MOVE PTR TO STRING TO PAD ! 11449: * ! 11450: * NOW WE ARE READY FOR THE PAD ! 11451: * ! 11452: * (XL) POINTER TO STRING TO PAD ! 11453: * (WB) PAD CHARACTER ! 11454: * (WC) LENGTH TO PAD STRING TO ! 11455: * ! 11456: MOV WC,WA COPY LENGTH ! 11457: JSR ALOCS ALLOCATE SCBLK FOR NEW STRING ! 11458: MOV XR,-(XS) SAVE AS RESULT ! 11459: MOV SCLEN(XL),WA LOAD LENGTH OF ARGUMENT ! 11460: SUB WA,WC CALCULATE NUMBER OF PAD CHARACTERS ! 11461: PSC XR POINT TO CHARS IN RESULT STRING ! 11462: LCT WC,WC SET COUNTER FOR PAD LOOP ! 11463: * ! 11464: * COPY ARGUMENT STRING ! 11465: * ! 11466: BZE WA,SRPD2 JUMP IF ARGUMENT IS NULL ! 11467: PLC XL ELSE POINT TO ARGUMENT CHARS ! 11468: MVC MOVE CHARACTERS TO RESULT STRING ! 11469: * ! 11470: * LOOP TO SUPPLY PAD CHARACTERS ! 11471: * ! 11472: SRPD2 SCH WB,(XR)+ STORE PAD CHARACTER, BUMP PTR ! 11473: BCT WC,SRPD2 LOOP TILL ALL PAD CHARS STORED ! 11474: CSC XR COMPLETE CHARACTER STORING ! 11475: BRN EXITS AND EXIT FOR NEXT WORD ! 11476: * ! 11477: * HERE IF 2ND ARG IS NEGATIVE OR LARGE ! 11478: * ! 11479: SRPD3 ZER WC ZERO PAD COUNT ! 11480: BRN SRPD1 MERGE ! 11481: EJC ! 11482: * ! 11483: * RTAB ! 11484: * ! 11485: S$RTB ENT ENTRY POINT ! 11486: MOV =P$RTB,WB SET PCODE FOR INTEGER ARG CASE ! 11487: MOV =P$RTD,WA SET PCODE FOR EXPRESSION ARG CASE ! 11488: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE ! 11489: ERR 181,RTAB ARGUMENT IS NOT INTEGER OR EXPRESSION ! 11490: ERR 182,RTAB ARGUMENT IS NEGATIVE OR TOO LARGE ! 11491: BRN EXIXR RETURN PATTERN NODE ! 11492: EJC ! 11493: * ! 11494: * SET ! 11495: * ! 11496: S$SET ENT ENTRY POINT ! 11497: MOV (XS)+,R$IO2 SAVE THIRD ARG ! 11498: MOV (XS)+,R$IO1 SAVE SECOND ARG ! 11499: JSR IOFCB CALL FCBLK ROUTINE ! 11500: ERR 291,SET FIRST ARGUMENT IS NOT A SUITABLE NAME ! 11501: ERR 292,SET FIRST ARGUMENT IS NULL ! 11502: MOV R$IO1,WB LOAD SECOND ARG ! 11503: MOV R$IO2,WC LOAD THIRD ARG ! 11504: JSR SYSST CALL SYSTEM SET ROUTINE ! 11505: ERR 293,INAPPROPRIATE SECOND ARGUMENT TO SET ! 11506: ERR 294,INAPPROPRIATE THIRD ARGUMENT TO SET ! 11507: ERR 295,SET FILE DOES NOT EXIST ! 11508: ERR 296,SET FILE DOES NOT PERMIT SETTING FILE POINTER ! 11509: ERR 297,SET CAUSED NON-RECOVERABLE I/O ERROR ! 11510: BRN EXNUL OTHERWISEW RETURN NULL ! 11511: EJC ! 11512: * ! 11513: * TAB ! 11514: * ! 11515: S$TAB ENT ENTRY POINT ! 11516: MOV =P$TAB,WB SET PCODE FOR INTEGER ARG CASE ! 11517: MOV =P$TBD,WA SET PCODE FOR EXPRESSION ARG CASE ! 11518: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE ! 11519: ERR 183,TAB ARGUMENT IS NOT INTEGER OR EXPRESSION ! 11520: ERR 184,TAB ARGUMENT IS NEGATIVE OR TOO LARGE ! 11521: BRN EXIXR RETURN PATTERN NODE ! 11522: EJC ! 11523: * ! 11524: * RPOS ! 11525: * ! 11526: S$RPS ENT ENTRY POINT ! 11527: MOV =P$RPS,WB SET PCODE FOR INTEGER ARG CASE ! 11528: MOV =P$RPD,WA SET PCODE FOR EXPRESSION ARG CASE ! 11529: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE ! 11530: ERR 185,RPOS ARGUMENT IS NOT INTEGER OR EXPRESSION ! 11531: ERR 186,RPOS ARGUMENT IS NEGATIVE OR TOO LARGE ! 11532: BRN EXIXR RETURN PATTERN NODE ! 11533: EJC ! 11534: * ! 11535: * RSORT ! 11536: * ! 11537: S$RSR ENT ENTRY POINT ! 11538: MNZ WA MARK AS RSORT ! 11539: JSR SORTA CALL SORT ROUTINE ! 11540: BRN EXSID RETURN, SETTING IDVAL ! 11541: EJC ! 11542: * ! 11543: * SETEXIT ! 11544: * ! 11545: S$STX ENT ENTRY POINT ! 11546: MOV (XS)+,XR LOAD ARGUMENT ! 11547: MOV STXVR,WA LOAD OLD VRBLK POINTER ! 11548: ZER XL LOAD ZERO IN CASE NULL ARG ! 11549: BEQ XR,=NULLS,SSTX1 JUMP IF NULL ARGUMENT (RESET CALL) ! 11550: JSR GTNVR ELSE GET SPECIFIED VRBLK ! 11551: PPM SSTX2 JUMP IF NOT NATURAL VARIABLE ! 11552: MOV VRLBL(XR),XL ELSE LOAD LABEL ! 11553: BEQ XL,=STNDL,SSTX2 JUMP IF LABEL IS NOT DEFINED ! 11554: BNE (XL),=B$TRT,SSTX1 JUMP IF NOT TRAPPED ! 11555: MOV TRLBL(XL),XL ELSE LOAD PTR TO REAL LABEL CODE ! 11556: * ! 11557: * HERE TO SET/RESET SETEXIT TRAP ! 11558: * ! 11559: SSTX1 MOV XR,STXVR STORE NEW VRBLK POINTER (OR NULL) ! 11560: MOV XL,R$SXC STORE NEW CODE PTR (OR ZERO) ! 11561: BEQ WA,=NULLS,EXNUL RETURN NULL IF NULL RESULT ! 11562: MOV WA,XR ELSE COPY VRBLK POINTER ! 11563: BRN EXVNM AND RETURN BUILDING NMBLK ! 11564: * ! 11565: * HERE IF BAD ARGUMENT ! 11566: * ! 11567: SSTX2 ERB 187,SETEXIT ARGUMENT IS NOT LABEL NAME OR NULL ! 11568: EJC ! 11569: * ! 11570: * SORT ! 11571: * ! 11572: S$SRT ENT ENTRY POINT ! 11573: ZER WA MARK AS SORT ! 11574: JSR SORTA CALL SORT ROUTINE ! 11575: BRN EXSID RETURN, SETTING IDVAL ! 11576: EJC ! 11577: * ! 11578: * SPAN ! 11579: * ! 11580: S$SPN ENT ENTRY POINT ! 11581: MOV =P$SPS,WB SET PCODE FOR SINGLE CHAR ARG ! 11582: MOV =P$SPN,XL SET PCODE FOR MULTI-CHAR ARG ! 11583: MOV =P$SPD,WC SET PCODE FOR EXPRESSION ARG ! 11584: JSR PATST CALL COMMON ROUTINE TO BUILD NODE ! 11585: ERR 188,SPAN ARGUMENT IS NOT STRING OR EXPRESSION ! 11586: BRN EXIXR JUMP FOR NEXT CODE WORD ! 11587: EJC ! 11588: * ! 11589: * SIZE ! 11590: * ! 11591: S$SI$ ENT ENTRY POINT ! 11592: MOV (XS),XR LOAD ARGUMENT ! 11593: BNE (XR),=B$BCT,SSI$1 BRANCH IF NOT BUFFER ! 11594: ICA XS ELSE POP ARGUMENT ! 11595: MTI BCLEN(XR) LOAD DEFINED LENGTH ! 11596: BRN EXINT EXIT WITH INTEGER ! 11597: * ! 11598: * HERE IF NOT BUFFER ! 11599: * ! 11600: SSI$1 JSR GTSTG LOAD STRING ARGUMENT ! 11601: ERR 189,SIZE ARGUMENT IS NOT STRING ! 11602: MTI WA LOAD LENGTH AS INTEGER ! 11603: BRN EXINT EXIT WITH INTEGER RESULT ! 11604: EJC ! 11605: * ! 11606: * STOPTR ! 11607: * ! 11608: S$STT ENT ENTRY POINT ! 11609: ZER XL INDICATE STOPTR CASE ! 11610: JSR TRACE CALL TRACE PROCEDURE ! 11611: ERR 190,STOPTR FIRST ARGUMENT IS NOT APPROPRIATE NAME ! 11612: ERR 191,STOPTR SECOND ARGUMENT IS NOT TRACE TYPE ! 11613: BRN EXNUL RETURN NULL ! 11614: EJC ! 11615: * ! 11616: * SUBSTR ! 11617: * ! 11618: S$SUB ENT ENTRY POINT ! 11619: JSR GTSMI LOAD THIRD ARGUMENT ! 11620: ERR 192,SUBSTR THIRD ARGUMENT IS NOT INTEGER ! 11621: PPM EXFAL JUMP IF NEGATIVE OR TOO LARGE ! 11622: MOV XR,SBSSV SAVE THIRD ARGUMENT ! 11623: JSR GTSMI LOAD SECOND ARGUMENT ! 11624: ERR 193,SUBSTR SECOND ARGUMENT IS NOT INTEGER ! 11625: PPM EXFAL JUMP IF OUT OF RANGE ! 11626: MOV XR,WB SAVE SECOND ARGUMENT ! 11627: BZE WB,EXFAL JUMP IF SECOND ARGUMENT ZERO ! 11628: DCV WB ELSE DECREMENT FOR ONES ORIGIN ! 11629: MOV (XS),XL GET FIRST ARG PTR ! 11630: BNE (XL),=B$BCT,SSUBA BRANCH IF NOT BUFFER ! 11631: MOV BCBUF(XL),XR GET BFBLK PTR ! 11632: MOV BCLEN(XL),WA GET LENGTH ! 11633: BRN SSUBB MERGE ! 11634: * ! 11635: * HERE IF NOT BUFFER TO GET STRING ! 11636: * ! 11637: SSUBA JSR GTSTG LOAD FIRST ARGUMENT ! 11638: ERR 194,SUBSTR FIRST ARGUMENT IS NOT STRING ! 11639: * ! 11640: * MERGE WITH BFBLK OR SCBLK PTR IN XR. WA HAS LENGTH ! 11641: * ! 11642: SSUBB MOV SBSSV,WC RELOAD THIRD ARGUMENT ! 11643: BNZ WC,SSUB1 SKIP IF THIRD ARG GIVEN ! 11644: MOV WA,WC ELSE GET STRING LENGTH ! 11645: BGT WB,WC,EXFAL FAIL IF IMPROPER ! 11646: SUB WB,WC REDUCE BY OFFSET TO START ! 11647: * ! 11648: * MERGE ! 11649: * ! 11650: SSUB1 MOV WA,XL SAVE STRING LENGTH ! 11651: MOV WC,WA SET LENGTH OF SUBSTRING ! 11652: ADD WB,WC ADD 2ND ARG TO 3RD ARG ! 11653: BGT WC,XL,EXFAL JUMP IF IMPROPER SUBSTRING ! 11654: MOV XR,XL COPY POINTER TO FIRST ARG ! 11655: JSR SBSTR BUILD SUBSTRING ! 11656: BRN EXIXR AND JUMP FOR NEXT CODE WORD ! 11657: EJC ! 11658: * ! 11659: * TABLE ! 11660: * ! 11661: S$TBL ENT ENTRY POINT ! 11662: MOV (XS)+,XL GET INITIAL LOOKUP VALUE ! 11663: ICA XS POP SECOND ARGUMENT ! 11664: JSR GTSMI LOAD ARGUMENT ! 11665: ERR 195,TABLE ARGUMENT IS NOT INTEGER ! 11666: ERR 196,TABLE ARGUMENT IS OUT OF RANGE ! 11667: BNZ WC,STBL1 JUMP IF NON-ZERO ! 11668: MOV =TBNBK,WC ELSE SUPPLY DEFAULT VALUE ! 11669: * ! 11670: * MERGE HERE WITH NUMBER OF HEADERS IN WA ! 11671: * ! 11672: STBL1 MOV WC,WA COPY NUMBER OF HEADERS ! 11673: ADD =TBSI$,WA ADJUST FOR STANDARD FIELDS ! 11674: WTB WA CONVERT LENGTH TO BYTES ! 11675: JSR ALLOC ALLOCATE SPACE FOR TBBLK ! 11676: MOV XR,WB COPY POINTER TO TBBLK ! 11677: MOV =B$TBT,(XR)+ STORE TYPE WORD ! 11678: ZER (XR)+ ZERO ID FOR THE MOMENT ! 11679: MOV WA,(XR)+ STORE LENGTH (TBLEN) ! 11680: MOV XL,(XR)+ STORE INITIAL LOOKUP VALUE ! 11681: LCT WC,WC SET LOOP COUNTER (NUM HEADERS) ! 11682: * ! 11683: * LOOP TO INITIALIZE ALL BUCKET POINTERS ! 11684: * ! 11685: STBL2 MOV WB,(XR)+ STORE TBBLK PTR IN BUCKET HEADER ! 11686: BCT WC,STBL2 LOOP TILL ALL STORED ! 11687: MOV WB,XR RECALL POINTER TO TBBLK ! 11688: BRN EXSID EXIT SETTING IDVAL ! 11689: EJC ! 11690: * ! 11691: * TIME ! 11692: * ! 11693: S$TIM ENT ENTRY POINT ! 11694: JSR SYSTM GET TIMER VALUE ! 11695: SBI TIMSX SUBTRACT STARTING TIME ! 11696: BRN EXINT EXIT WITH INTEGER VALUE ! 11697: EJC ! 11698: * ! 11699: * TRACE ! 11700: * ! 11701: S$TRA ENT ENTRY POINT ! 11702: BEQ 3(XS),=NULLS,STR03 JUMP IF FIRST ARGUMENT IS NULL ! 11703: MOV (XS)+,XR LOAD FOURTH ARGUMENT ! 11704: ZER XL TENTATIVELY SET ZERO POINTER ! 11705: BEQ XR,=NULLS,STR02 JUMP IF 4TH ARGUMENT IS NULL ! 11706: JSR GTNVR ELSE POINT TO VRBLK ! 11707: PPM STR01 JUMP IF NOT VARIABLE NAME ! 11708: MOV VRFNC(XR),XL ELSE LOAD FUNCTION POINTER ! 11709: BNE XL,=STNDF,STR02 JUMP IF FUNCTION IS DEFINED ! 11710: * ! 11711: * HERE FOR BAD FOURTH ARGUMENT ! 11712: * ! 11713: STR01 ERB 197,TRACE FOURTH ARG IS NOT FUNCTION NAME OR NULL ! 11714: * ! 11715: * HERE WITH FUNCTION POINTER IN XL ! 11716: * ! 11717: STR02 MOV (XS)+,XR LOAD THIRD ARGUMENT (TAG) ! 11718: ZER WB SET ZERO AS TRTYP VALUE FOR NOW ! 11719: JSR TRBLD BUILD TRBLK FOR TRACE CALL ! 11720: MOV XR,XL MOVE TRBLK POINTER FOR TRACE ! 11721: JSR TRACE CALL TRACE PROCEDURE ! 11722: ERR 198,TRACE FIRST ARGUMENT IS NOT APPROPRIATE NAME ! 11723: ERR 199,TRACE SECOND ARGUMENT IS NOT TRACE TYPE ! 11724: BRN EXNUL RETURN NULL ! 11725: * ! 11726: * HERE TO CALL SYSTEM TRACE TOGGLE ROUTINE ! 11727: * ! 11728: STR03 JSR SYSTT CALL IT ! 11729: ADD *NUM04,XS POP TRACE ARGUMENTS ! 11730: BRN EXNUL RETURN ! 11731: EJC ! 11732: * ! 11733: * TRIM ! 11734: * ! 11735: S$TRM ENT ENTRY POINT ! 11736: JSR GTSTG LOAD ARGUMENT AS STRING ! 11737: ERR 200,TRIM ARGUMENT IS NOT STRING ! 11738: BZE WA,EXNUL RETURN NULL IF ARGUMENT IS NULL ! 11739: MOV XR,XL COPY STRING POINTER ! 11740: CTB WA,SCHAR GET BLOCK LENGTH ! 11741: JSR ALLOC ALLOCATE COPY SAME SIZE ! 11742: MOV XR,WB SAVE POINTER TO COPY ! 11743: MVW COPY OLD STRING BLOCK TO NEW ! 11744: MOV WB,XR RESTORE PTR TO NEW BLOCK ! 11745: JSR TRIMR TRIM BLANKS (WB IS NON-ZERO) ! 11746: BRN EXIXR EXIT WITH RESULT IN XR ! 11747: EJC ! 11748: * ! 11749: * UNLOAD ! 11750: * ! 11751: S$UNL ENT ENTRY POINT ! 11752: MOV (XS)+,XR LOAD ARGUMENT ! 11753: JSR GTNVR POINT TO VRBLK ! 11754: ERR 201,UNLOAD ARGUMENT IS NOT NATURAL VARIABLE NAME ! 11755: MOV =STNDF,XL GET PTR TO UNDEFINED FUNCTION ! 11756: JSR DFFNC UNDEFINE NAMED FUNCTION ! 11757: BRN EXNUL RETURN NULL AS RESULT ! 11758: TTL S P I T B O L -- UTILITY PROCEDURES ! 11759: * ! 11760: * THE FOLLOWING SECTION CONTAINS PROCEDURES WHICH ARE ! 11761: * USED FOR VARIOUS PURPOSES THROUGHOUT THE SYSTEM. ! 11762: * ! 11763: * EACH PROCEDURE IS PRECEDED BY A DESCRIPTION OF THE ! 11764: * CALLING SEQUENCE. USUALLY THE ARGUMENTS ARE IN REGISTERS ! 11765: * BUT ARGUMENTS CAN ALSO OCCUR ON THE STACK AND AS ! 11766: * PARAMETERS ASSEMBLED AFTER THE JSR INSTRUCTION. ! 11767: * ! 11768: * THE FOLLOWING CONSIDERATIONS APPLY TO THESE DESCRIPTIONS. ! 11769: * ! 11770: * 1) THE STACK POINTER (XS) IS NOT CHANGED UNLESS THE ! 11771: * CHANGE IS EXPLICITLY DOCUMENTED IN THE CALL. ! 11772: * ! 11773: * 2) REGISTERS WHOSE ENTRY VALUES ARE NOT MENTIONED ! 11774: * MAY CONTAIN ANY VALUE EXCEPT THAT XL,XR MAY ONLY ! 11775: * CONTAIN PROPER (COLLECTABLE) POINTER VALUES. ! 11776: * THIS CONDITION ON XR MEANS THAT THE CALLED ROUTINE ! 11777: * MAY IF IT CHOOSES PRESERVE XR BY STACKING. ! 11778: * ! 11779: * 3) REGISTERS NOT MENTIONED ON EXIT CONTAIN THE SAME ! 11780: * VALUES AS THEY DID ON ENTRY EXCEPT THAT VALUES IN ! 11781: * XR,XL MAY HAVE BEEN RELOCATED BY THE COLLECTOR. ! 11782: * ! 11783: * 4) REGISTERS WHICH ARE DESTROYED ON EXIT MAY CONTAIN ! 11784: * ANY VALUE EXCEPT THAT VALUES IN XL,XR ARE PROPER ! 11785: * (COLLECTABLE) POINTERS. ! 11786: * ! 11787: * 5) THE CODE POINTER REGISTER POINTS TO THE CURRENT ! 11788: * CODE LOCATION ON ENTRY AND IS UNCHANGED ON EXIT. ! 11789: * ! 11790: * IN THE ABOVE DESCRIPTION, A COLLECTABLE POINTER IS ONE ! 11791: * WHICH EITHER POINTS OUTSIDE THE DYNAMIC REGION OR ! 11792: * POINTS TO THE START OF A BLOCK IN THE DYNAMIC REGION. ! 11793: * ! 11794: * IN THOSE CASES WHERE THE CALLING SEQUENCE CONTAINS ! 11795: * PARAMETERS WHICH ARE USED AS ALTERNATE RETURN POINTS, ! 11796: * THESE PARAMETERS MAY BE REPLACED BY ERROR CODES ! 11797: * ASSEMBLED WITH THE ERR INSTRUCTION. THIS WILL RESULT ! 11798: * IN THE POSTING OF THE ERROR IF THE RETURN IS TAKEN. ! 11799: * ! 11800: * THE PROCEDURES ALL HAVE NAMES CONSISTING OF FIVE LETTERS ! 11801: * AND ARE IN ALPHABETICAL ORDER BY THEIR NAMES. ! 11802: EJC ! 11803: * ! 11804: * ACESS - ACCESS VARIABLE VALUE WITH TRACE/INPUT CHECKS ! 11805: * ! 11806: * ACESS LOADS THE VALUE OF A VARIABLE. TRACE AND INPUT ! 11807: * ASSOCIATIONS ARE TESTED FOR AND EXECUTED AS REQUIRED. ! 11808: * ACESS ALSO HANDLES THE SPECIAL CASES OF PSEUDO-VARIABLES. ! 11809: * ! 11810: * (XL) VARIABLE NAME BASE ! 11811: * (WA) VARIABLE NAME OFFSET ! 11812: * JSR ACESS CALL TO ACCESS VALUE ! 11813: * PPM LOC TRANSFER LOC IF ACCESS FAILURE ! 11814: * (XR) VARIABLE VALUE ! 11815: * (WA,WB,WC) DESTROYED ! 11816: * (XL,RA) DESTROYED ! 11817: * ! 11818: * FAILURE CAN OCCUR IF AN INPUT ASSOCIATION CAUSES AN END ! 11819: * OF FILE CONDITION OR IF THE EVALUATION OF AN EXPRESSION ! 11820: * ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS. ! 11821: * ! 11822: ACESS PRC R,1 ENTRY POINT (RECURSIVE) ! 11823: MOV XL,XR COPY NAME BASE ! 11824: ADD WA,XR POINT TO VARIABLE LOCATION ! 11825: MOV (XR),XR LOAD VARIABLE VALUE ! 11826: * ! 11827: * LOOP HERE TO CHECK FOR SUCCESSIVE TRBLKS ! 11828: * ! 11829: ACS02 BNE (XR),=B$TRT,ACS18 JUMP IF NOT TRAPPED ! 11830: * ! 11831: * HERE IF TRAPPED ! 11832: * ! 11833: BEQ XR,=TRBKV,ACS12 JUMP IF KEYWORD VARIABLE ! 11834: BNE XR,=TRBEV,ACS05 JUMP IF NOT EXPRESSION VARIABLE ! 11835: * ! 11836: * HERE FOR EXPRESSION VARIABLE, EVALUATE VARIABLE ! 11837: * ! 11838: MOV EVEXP(XL),XR LOAD EXPRESSION POINTER ! 11839: ZER WB EVALUATE BY VALUE ! 11840: JSR EVALX EVALUATE EXPRESSION ! 11841: PPM ACS04 JUMP IF EVALUATION FAILURE ! 11842: BRN ACS02 CHECK VALUE FOR MORE TRBLKS ! 11843: EJC ! 11844: * ! 11845: * ACESS (CONTINUED) ! 11846: * ! 11847: * HERE ON READING END OF FILE ! 11848: * ! 11849: ACS03 ADD *NUM03,XS POP TRBLK PTR, NAME BASE AND OFFSET ! 11850: MOV XR,DNAMP POP UNUSED SCBLK ! 11851: * ! 11852: * MERGE HERE WHEN EVALUATION OF EXPRESSION FAILS ! 11853: * ! 11854: ACS04 EXI 1 TAKE ALTERNATE (FAILURE) RETURN ! 11855: * ! 11856: * HERE IF NOT KEYWORD OR EXPRESSION VARIABLE ! 11857: * ! 11858: ACS05 MOV TRTYP(XR),WB LOAD TRAP TYPE CODE ! 11859: BNZ WB,ACS10 JUMP IF NOT INPUT ASSOCIATION ! 11860: BZE KVINP,ACS09 IGNORE INPUT ASSOC IF INPUT IS OFF ! 11861: * ! 11862: * HERE FOR INPUT ASSOCIATION ! 11863: * ! 11864: MOV XL,-(XS) STACK NAME BASE ! 11865: MOV WA,-(XS) STACK NAME OFFSET ! 11866: MOV XR,-(XS) STACK TRBLK POINTER ! 11867: MOV TRFPT(XR),XL GET FILE CTRL BLK PTR OR ZERO ! 11868: BNZ XL,ACS06 JUMP IF NOT STANDARD INPUT FILE ! 11869: BEQ TRTER(XR),=V$TER,ACS21 JUMP IF TERMINAL ! 11870: * ! 11871: * HERE TO READ FROM STANDARD INPUT FILE ! 11872: * ! 11873: MOV CSWIN,WA LENGTH FOR READ BUFFER ! 11874: JSR ALOCS BUILD STRING OF APPROPRIATE LENGTH ! 11875: JSR SYSRD READ NEXT STANDARD INPUT IMAGE ! 11876: PPM ACS03 JUMP TO FAIL EXIT IF END OF FILE ! 11877: BRN ACS07 ELSE MERGE WITH OTHER FILE CASE ! 11878: * ! 11879: * HERE FOR INPUT FROM OTHER THAN STANDARD INPUT FILE ! 11880: * ! 11881: ACS06 MOV XL,WA FCBLK PTR ! 11882: JSR SYSIL GET INPUT RECORD MAX LENGTH (TO WA) ! 11883: JSR ALOCS ALLOCATE STRING OF CORRECT SIZE ! 11884: MOV XL,WA FCBLK PTR ! 11885: JSR SYSIN CALL SYSTEM INPUT ROUTINE ! 11886: PPM ACS03 JUMP TO FAIL EXIT IF END OF FILE ! 11887: PPM ACS22 ERROR ! 11888: PPM ACS23 ERROR ! 11889: EJC ! 11890: * ! 11891: * ACESS (CONTINUED) ! 11892: * ! 11893: * MERGE HERE AFTER OBTAINING INPUT RECORD ! 11894: * ! 11895: ACS07 MOV KVTRM,WB LOAD TRIM INDICATOR ! 11896: JSR TRIMR TRIM RECORD AS REQUIRED ! 11897: MOV XR,WB COPY RESULT POINTER ! 11898: MOV (XS),XR RELOAD POINTER TO TRBLK ! 11899: * ! 11900: * LOOP TO CHASE TO END OF TRBLK CHAIN AND STORE VALUE ! 11901: * ! 11902: ACS08 MOV XR,XL SAVE POINTER TO THIS TRBLK ! 11903: MOV TRNXT(XR),XR LOAD FORWARD POINTER ! 11904: BEQ (XR),=B$TRT,ACS08 LOOP IF THIS IS ANOTHER TRBLK ! 11905: MOV WB,TRNXT(XL) ELSE STORE RESULT AT END OF CHAIN ! 11906: MOV (XS)+,XR RESTORE INITIAL TRBLK POINTER ! 11907: MOV (XS)+,WA RESTORE NAME OFFSET ! 11908: MOV (XS)+,XL RESTORE NAME BASE POINTER ! 11909: * ! 11910: * COME HERE TO MOVE TO NEXT TRBLK ! 11911: * ! 11912: ACS09 MOV TRNXT(XR),XR LOAD FORWARD PTR TO NEXT VALUE ! 11913: BRN ACS02 BACK TO CHECK IF TRAPPED ! 11914: * ! 11915: * HERE TO CHECK FOR ACCESS TRACE TRBLK ! 11916: * ! 11917: ACS10 BNE WB,=TRTAC,ACS09 LOOP BACK IF NOT ACCESS TRACE ! 11918: BZE KVTRA,ACS09 IGNORE ACCESS TRACE IF TRACE OFF ! 11919: DCV KVTRA ELSE DECREMENT TRACE COUNT ! 11920: BZE TRFNC(XR),ACS11 JUMP IF PRINT TRACE ! 11921: EJC ! 11922: * ! 11923: * ACESS (CONTINUED) ! 11924: * ! 11925: * HERE FOR FULL FUNCTION TRACE ! 11926: * ! 11927: JSR TRXEQ CALL ROUTINE TO EXECUTE TRACE ! 11928: BRN ACS09 JUMP FOR NEXT TRBLK ! 11929: * ! 11930: * HERE FOR CASE OF PRINT TRACE ! 11931: * ! 11932: ACS11 JSR PRTSN PRINT STATEMENT NUMBER ! 11933: JSR PRTNV PRINT NAME = VALUE ! 11934: BRN ACS09 JUMP BACK FOR NEXT TRBLK ! 11935: * ! 11936: * HERE FOR KEYWORD VARIABLE ! 11937: * ! 11938: ACS12 MOV KVNUM(XL),XR LOAD KEYWORD NUMBER ! 11939: BGE XR,=K$V$$,ACS14 JUMP IF NOT ONE WORD VALUE ! 11940: MTI KVABE(XR) ELSE LOAD VALUE AS INTEGER ! 11941: * ! 11942: * COMMON EXIT WITH KEYWORD VALUE AS INTEGER IN (IA) ! 11943: * ! 11944: ACS13 JSR ICBLD BUILD ICBLK ! 11945: BRN ACS18 JUMP TO EXIT ! 11946: * ! 11947: * HERE IF NOT ONE WORD KEYWORD VALUE ! 11948: * ! 11949: ACS14 BGE XR,=K$S$$,ACS15 JUMP IF SPECIAL CASE ! 11950: SUB =K$V$$,XR ELSE GET OFFSET ! 11951: ADD =NDABO,XR POINT TO PATTERN VALUE ! 11952: BRN ACS18 JUMP TO EXIT ! 11953: * ! 11954: * HERE IF SPECIAL KEYWORD CASE ! 11955: * ! 11956: ACS15 MOV KVRTN,XL LOAD RTNTYPE IN CASE ! 11957: LDI KVSTL LOAD STLIMIT IN CASE ! 11958: SUB =K$S$$,XR GET CASE NUMBER ! 11959: BSW XR,5 SWITCH ON KEYWORD NUMBER ! 11960: IFF K$$AL,ACS16 JUMP IF ALPHABET ! 11961: IFF K$$RT,ACS17 RTNTYPE ! 11962: IFF K$$SC,ACS19 STCOUNT ! 11963: IFF K$$SL,ACS13 STLIMIT ! 11964: IFF K$$ET,ACS20 ERRTEXT ! 11965: ESW END SWITCH ON KEYWORD NUMBER ! 11966: EJC ! 11967: * ! 11968: * ACESS (CONTINUED) ! 11969: * ! 11970: * ALPHABET ! 11971: * ! 11972: ACS16 MOV KVALP,XL LOAD POINTER TO ALPHABET STRING ! 11973: * ! 11974: * RTNTYPE MERGES HERE ! 11975: * ! 11976: ACS17 MOV XL,XR COPY STRING PTR TO PROPER REG ! 11977: * ! 11978: * COMMON RETURN POINT ! 11979: * ! 11980: ACS18 EXI RETURN TO ACESS CALLER ! 11981: * ! 11982: * HERE FOR STCOUNT (IA HAS STLIMIT) ! 11983: * ! 11984: ACS19 SBI KVSTC STCOUNT = LIMIT - LEFT ! 11985: BRN ACS13 MERGE BACK WITH INTEGER RESULT ! 11986: * ! 11987: * ERRTEXT ! 11988: * ! 11989: ACS20 MOV R$ETX,XR GET ERRTEXT STRING ! 11990: BRN ACS18 MERGE WITH RESULT ! 11991: * ! 11992: * HERE TO READ A RECORD FROM TERMINAL ! 11993: * ! 11994: ACS21 MOV =RILEN,WA BUFFER LENGTH ! 11995: JSR ALOCS ALLOCATE BUFFER ! 11996: JSR SYSRI READ RECORD ! 11997: PPM ACS03 ENDFILE ! 11998: BRN ACS07 MERGE WITH RECORD READ ! 11999: * ! 12000: * ERROR RETURNS ! 12001: * ! 12002: ACS22 MOV XR,DNAMP POP UNUSED SCBLK ! 12003: ERB 202,INPUT FROM FILE CAUSED NON-RECOVERABLE ERROR ! 12004: * ! 12005: ACS23 MOV XR,DNAMP POP UNUSED SCBLK ! 12006: ERB 203,INPUT FILE RECORD HAS INCORRECT FORMAT ! 12007: ENP END PROCEDURE ACESS ! 12008: EJC ! 12009: * ! 12010: * ACOMP -- COMPARE TWO ARITHMETIC VALUES ! 12011: * ! 12012: * 1(XS) FIRST ARGUMENT ! 12013: * 0(XS) SECOND ARGUMENT ! 12014: * JSR ACOMP CALL TO COMPARE VALUES ! 12015: * PPM LOC TRANSFER LOC IF ARG1 IS NON-NUMERIC ! 12016: * PPM LOC TRANSFER LOC IF ARG2 IS NON-NUMERIC ! 12017: * PPM LOC TRANSFER LOC FOR ARG1 LT ARG2 ! 12018: * PPM LOC TRANSFER LOC FOR ARG1 EQ ARG2 ! 12019: * PPM LOC TRANSFER LOC FOR ARG1 GT ARG2 ! 12020: * (NORMAL RETURN IS NEVER GIVEN) ! 12021: * (WA,WB,WC,IA,RA) DESTROYED ! 12022: * (XL,XR) DESTROYED ! 12023: * ! 12024: ACOMP PRC N,5 ENTRY POINT ! 12025: JSR ARITH LOAD ARITHMETIC OPERANDS ! 12026: PPM ACMP7 JUMP IF FIRST ARG NON-NUMERIC ! 12027: PPM ACMP8 JUMP IF SECOND ARG NON-NUMERIC ! 12028: PPM ACMP4 JUMP IF REAL ARGUMENTS ! 12029: * ! 12030: * HERE FOR INTEGER ARGUMENTS ! 12031: * ! 12032: SBI ICVAL(XL) SUBTRACT TO COMPARE ! 12033: IOV ACMP3 JUMP IF OVERFLOW ! 12034: ILT ACMP5 ELSE JUMP IF ARG1 LT ARG2 ! 12035: IEQ ACMP2 JUMP IF ARG1 EQ ARG2 ! 12036: * ! 12037: * HERE IF ARG1 GT ARG2 ! 12038: * ! 12039: ACMP1 EXI 5 TAKE GT EXIT ! 12040: * ! 12041: * HERE IF ARG1 EQ ARG2 ! 12042: * ! 12043: ACMP2 EXI 4 TAKE EQ EXIT ! 12044: EJC ! 12045: * ! 12046: * ACOMP (CONTINUED) ! 12047: * ! 12048: * HERE FOR INTEGER OVERFLOW ON SUBTRACT ! 12049: * ! 12050: ACMP3 LDI ICVAL(XL) LOAD SECOND ARGUMENT ! 12051: ILT ACMP1 GT IF NEGATIVE ! 12052: BRN ACMP5 ELSE LT ! 12053: * ! 12054: * HERE FOR REAL OPERANDS ! 12055: * ! 12056: ACMP4 SBR RCVAL(XL) SUBTRACT TO COMPARE ! 12057: ROV ACMP6 JUMP IF OVERFLOW ! 12058: RGT ACMP1 ELSE JUMP IF ARG1 GT ! 12059: REQ ACMP2 JUMP IF ARG1 EQ ARG2 ! 12060: * ! 12061: * HERE IF ARG1 LT ARG2 ! 12062: * ! 12063: ACMP5 EXI 3 TAKE LT EXIT ! 12064: * ! 12065: * HERE IF OVERFLOW ON REAL SUBTRACTION ! 12066: * ! 12067: ACMP6 LDR RCVAL(XL) RELOAD ARG2 ! 12068: RLT ACMP1 GT IF NEGATIVE ! 12069: BRN ACMP5 ELSE LT ! 12070: * ! 12071: * HERE IF ARG1 NON-NUMERIC ! 12072: * ! 12073: ACMP7 EXI 1 TAKE ERROR EXIT ! 12074: * ! 12075: * HERE IF ARG2 NON-NUMERIC ! 12076: * ! 12077: ACMP8 EXI 2 TAKE ERROR EXIT ! 12078: ENP END PROCEDURE ACOMP ! 12079: EJC ! 12080: * ! 12081: * ALLOC ALLOCATE BLOCK OF DYNAMIC STORAGE ! 12082: * ! 12083: * (WA) LENGTH REQUIRED IN BYTES ! 12084: * JSR ALLOC CALL TO ALLOCATE BLOCK ! 12085: * (XR) POINTER TO ALLOCATED BLOCK ! 12086: * ! 12087: * A POSSIBLE ALTERNATIVE TO AOV .. AND FOLLOWING STMT IS - ! 12088: * MOV DNAME,XR . SUB WA,XR . BLO XR,DNAMP,ALOC2 . ! 12089: * MOV DNAMP,XR . ADD WA,XR ! 12090: * ! 12091: ALLOC PRC E,0 ENTRY POINT ! 12092: * ! 12093: * COMMON EXIT POINT ! 12094: * ! 12095: ALOC1 MOV DNAMP,XR POINT TO NEXT AVAILABLE LOC ! 12096: AOV WA,XR,ALOC2 POINT PAST ALLOCATED BLOCK ! 12097: BGT XR,DNAME,ALOC2 JUMP IF NOT ENOUGH ROOM ! 12098: MOV XR,DNAMP STORE NEW POINTER ! 12099: SUB WA,XR POINT BACK TO START OF ALLOCATED BK ! 12100: EXI RETURN TO CALLER ! 12101: * ! 12102: * HERE IF INSUFFICIENT ROOM, TRY A GARBAGE COLLECTION ! 12103: * ! 12104: ALOC2 MOV WB,ALLSV SAVE WB ! 12105: ZER WB SET NO UPWARD MOVE FOR GBCOL ! 12106: JSR GBCOL GARBAGE COLLECT ! 12107: * ! 12108: * SEE IF ROOM AFTER GBCOL OR SYSMM CALL ! 12109: * ! 12110: ALOC3 MOV DNAMP,XR POINT TO FIRST AVAILABLE LOC ! 12111: AOV WA,XR,ALC3A POINT PAST NEW BLOCK ! 12112: BLO XR,DNAME,ALOC4 JUMP IF THERE IS ROOM NOW ! 12113: * ! 12114: * FAILED AGAIN, SEE IF WE CAN GET MORE CORE ! 12115: * ! 12116: ALC3A JSR SYSMM TRY TO GET MORE MEMORY ! 12117: WTB XR CONVERT TO BAUS (SGD05) ! 12118: ADD XR,DNAME BUMP PTR BY AMOUNT OBTAINED ! 12119: BNZ XR,ALOC3 JUMP IF GOT MORE CORE ! 12120: ADD RSMEM,DNAME GET THE RESERVE MEMORY ! 12121: ZER RSMEM ONLY PERMISSIBLE ONCE ! 12122: ICV ERRFT FATAL ERROR ! 12123: ERB 204,MEMORY OVERFLOW ! 12124: EJC ! 12125: * ! 12126: * HERE AFTER SUCCESSFUL GARBAGE COLLECTION ! 12127: * ! 12128: ALOC4 STI ALLIA SAVE IA ! 12129: MOV DNAME,WB GET DYNAMIC END ADRS ! 12130: SUB DNAMP,WB COMPUTE FREE STORE ! 12131: BTW WB CONVERT BYTES TO WORDS ! 12132: MTI WB PUT FREE STORE IN IA ! 12133: MLI ALFSF MULTIPLY BY FREE STORE FACTOR ! 12134: IOV ALOC5 JUMP IF OVERFLOWED ! 12135: MOV DNAME,WB DYNAMIC END ADRS ! 12136: SUB DNAMB,WB COMPUTE TOTAL AMOUNT OF DYNAMIC ! 12137: BTW WB CONVERT TO WORDS ! 12138: MOV WB,ALDYN STORE IT ! 12139: SBI ALDYN SUBTRACT FROM SCALED UP FREE STORE ! 12140: IGT ALOC5 JUMP IF SUFFICIENT FREE STORE ! 12141: JSR SYSMM TRY TO GET MORE STORE ! 12142: WTB XR CONVERT TO BAUS (SGD05) ! 12143: ADD XR,DNAME ADJUST DYNAMIC END ADRS ! 12144: * ! 12145: * MERGE TO RESTORE IA AND WB ! 12146: * ! 12147: ALOC5 LDI ALLIA RECOVER IA ! 12148: MOV ALLSV,WB RESTORE WB ! 12149: BRN ALOC1 JUMP BACK TO EXIT ! 12150: ENP END PROCEDURE ALLOC ! 12151: EJC ! 12152: * ! 12153: * ALOBF -- ALLOCATE BUFFER ! 12154: * ! 12155: * THIS ROUTINES ALLOCATES A NEW BUFFER. AS THE BFBLK ! 12156: * AND BCBLK COME IN PAIRS, BOTH ARE ALLOCATED HERE, ! 12157: * AND XR POINTS TO THE BCBLK ON RETURN. THE BFBLK ! 12158: * AND BCBLK ARE SET TO THE NULL BUFFER, AND THE IDVAL ! 12159: * IS ZERO ON RETURN. ! 12160: * ! 12161: * (WA) BUFFER SIZE IN CHARACTERS ! 12162: * JSR ALOBF CALL TO CREATE BUFFER ! 12163: * (XR) BCBLK PTR ! 12164: * (WA,WB) DESTROYED ! 12165: * ! 12166: ALOBF PRC E,0 ENTRY POINT ! 12167: MOV WA,WB HANG ONTO ALLOCATION SIZE ! 12168: CTB WA,BFSI$ GET TOTAL BLOCK SIZE ! 12169: BGE WA,MXLEN,ALB01 CHECK FOR MAXLEN EXCEEDED ! 12170: ADD *BCSI$,WA ADD IN ALLOCATION FOR BCBLK ! 12171: JSR ALLOC ALLOCATE FRAME ! 12172: MOV =B$BCT,(XR) SET TYPE ! 12173: ZER IDVAL(XR) NO ID YET ! 12174: ZER BCLEN(XR) NO DEFINED LENGTH ! 12175: MOV XL,WA SAVE XL ! 12176: MOV XR,XL COPY BCBLK PTR ! 12177: ADD *BCSI$,XL BIAS PAST PARTIALLY BUILT BCBLK ! 12178: MOV =B$BFT,(XL) SET BFBLK TYPE WORD ! 12179: MOV WB,BFALC(XL) SET ALLOCATED SIZE ! 12180: MOV XL,BCBUF(XR) SET POINTER IN BCBLK ! 12181: ZER BFCHR(XL) CLEAR FIRST WORD (NULL PAD) ! 12182: MOV WA,XL RESTORE ENTRY XL ! 12183: EXI RETURN TO CALLER ! 12184: * ! 12185: * HERE FOR MXLEN EXCEEDED ! 12186: * ! 12187: ALB01 ERB 274,REQUESTED BUFFER ALLOCATION EXCEEDS MXLEN ! 12188: ENP END PROCEDURE ALOBF ! 12189: EJC ! 12190: * ! 12191: * ALOCS -- ALLOCATE STRING BLOCK ! 12192: * ! 12193: * ALOCS IS USED TO BUILD A FRAME FOR A STRING BLOCK INTO ! 12194: * WHICH THE ACTUAL CHARACTERS ARE PLACED BY THE CALLER. ! 12195: * ALL STRINGS ARE CREATED WITH A CALL TO ALOCS (THE ! 12196: * EXCEPTIONS OCCUR IN TRIMR AND S$RPL PROCEDURES). ! 12197: * ! 12198: * (WA) LENGTH OF STRING TO BE ALLOCATED ! 12199: * JSR ALOCS CALL TO ALLOCATE SCBLK ! 12200: * (XR) POINTER TO RESULTING SCBLK ! 12201: * (WA) DESTROYED ! 12202: * (WC) CHARACTER COUNT (ENTRY VALUE OF WA) ! 12203: * ! 12204: * THE RESULTING SCBLK HAS THE TYPE WORD AND THE LENGTH ! 12205: * FILLED IN AND THE LAST WORD IS CLEARED TO ZERO CHARACTERS ! 12206: * TO ENSURE CORRECT RIGHT PADDING OF THE FINAL WORD. ! 12207: * ! 12208: ALOCS PRC E,0 ENTRY POINT ! 12209: BGT WA,KVMXL,ALCS2 JUMP IF LENGTH EXCEEEDS MAXLENGTH ! 12210: MOV WA,WC ELSE COPY LENGTH ! 12211: CTB WA,SCSI$ COMPUTE LENGTH OF SCBLK IN BYTES ! 12212: MOV DNAMP,XR POINT TO NEXT AVAILABLE LOCATION ! 12213: AOV WA,XR,ALCS0 POINT PAST BLOCK ! 12214: BLO XR,DNAME,ALCS1 JUMP IF THERE IS ROOM ! 12215: * ! 12216: * INSUFFICIENT MEMORY ! 12217: * ! 12218: ALCS0 ZER XR ELSE CLEAR GARBAGE XR VALUE ! 12219: JSR ALLOC AND USE STANDARD ALLOCATOR ! 12220: ADD WA,XR POINT PAST END OF BLOCK TO MERGE ! 12221: * ! 12222: * MERGE HERE WITH XR POINTING BEYOND NEW BLOCK ! 12223: * ! 12224: ALCS1 MOV XR,DNAMP SET UPDATED STORAGE POINTER ! 12225: ZER -(XR) STORE ZERO CHARS IN LAST WORD ! 12226: DCA WA DECREMENT LENGTH ! 12227: SUB WA,XR POINT BACK TO START OF BLOCK ! 12228: MOV =B$SCL,(XR) SET TYPE WORD ! 12229: MOV WC,SCLEN(XR) STORE LENGTH IN CHARS ! 12230: EXI RETURN TO ALOCS CALLER ! 12231: * ! 12232: * COME HERE IF STRING IS TOO LONG ! 12233: * ! 12234: ALCS2 ERB 205,STRING LENGTH EXCEEDS VALUE OF MAXLNGTH KEYWORD ! 12235: ENP END PROCEDURE ALOCS ! 12236: EJC ! 12237: * ! 12238: * ALOST -- ALLOCATE SPACE IN STATIC REGION ! 12239: * ! 12240: * (WA) LENGTH REQUIRED IN BYTES ! 12241: * JSR ALOST CALL TO ALLOCATE SPACE ! 12242: * (XR) POINTER TO ALLOCATED BLOCK ! 12243: * (WB) DESTROYED ! 12244: * ! 12245: * NOTE THAT THE CODING ENSURES THAT THE RESULTING VALUE ! 12246: * OF STATE IS ALWAYS LESS THAN DNAMB. THIS FACT IS USED ! 12247: * IN TESTING A VARIABLE NAME FOR BEING IN THE STATIC REGION ! 12248: * ! 12249: ALOST PRC E,0 ENTRY POINT ! 12250: * ! 12251: * MERGE BACK HERE AFTER ALLOCATING NEW CHUNK ! 12252: * ! 12253: ALST1 MOV STATE,XR POINT TO CURRENT END OF AREA ! 12254: AOV WA,XR,ALST2 POINT BEYOND PROPOSED BLOCK ! 12255: BGE XR,DNAMB,ALST2 JUMP IF OVERLAP WITH DYNAMIC AREA ! 12256: MOV XR,STATE ELSE STORE NEW POINTER ! 12257: SUB WA,XR POINT BACK TO START OF BLOCK ! 12258: EXI RETURN TO ALOST CALLER ! 12259: * ! 12260: * HERE IF NO ROOM, PREPARE TO MOVE DYNAMIC STORAGE UP ! 12261: * ! 12262: ALST2 MOV WA,ALSTA SAVE WA ! 12263: BGE WA,*E$STS,ALST3 SKIP IF REQUESTED CHUNK IS LARGE ! 12264: MOV *E$STS,WA ELSE SET TO GET LARGE ENOUGH CHUNK ! 12265: * ! 12266: * HERE WITH AMOUNT TO MOVE UP IN WA ! 12267: * ! 12268: ALST3 JSR ALLOC ALLOCATE BLOCK TO ENSURE ROOM ! 12269: MOV XR,DNAMP AND DELETE IT ! 12270: MOV WA,WB COPY MOVE UP AMOUNT ! 12271: JSR GBCOL CALL GBCOL TO MOVE DYNAMIC AREA UP ! 12272: MOV ALSTA,WA RESTORE WA ! 12273: BRN ALST1 LOOP BACK TO TRY AGAIN ! 12274: ENP END PROCEDURE ALOST ! 12275: EJC ! 12276: * ! 12277: * APNDB -- APPEND STRING TO BUFFER ! 12278: * ! 12279: * THIS ROUTINE IS USED BY BUFFER HANDLING ROUTINES TO ! 12280: * APPEND DATA TO AN EXISTING BFBLK. ! 12281: * ! 12282: * (XR) EXISTING BCBLK TO BE APPENDED ! 12283: * (XL) CONVERTABLE TO STRING ! 12284: * JSR APNDB CALL TO APPEND TO BUFFER ! 12285: * PPM LOC THREAD IF (XL) CANT BE CONVERTED ! 12286: * PPM LOC IF NOT ENOUGH ROOM ! 12287: * (WA,WB) DESTROYED ! 12288: * ! 12289: * IF MORE CHARACTERS ARE SPECIFIED THAN CAN BE INSERTED, ! 12290: * THEN NO ACTION IS TAKEN AND THE SECOND RETURN IS TAKEN. ! 12291: * ! 12292: APNDB PRC E,2 ENTRY POINT ! 12293: MOV BCLEN(XR),WA LOAD OFFSET TO INSERT ! 12294: ZER WB REPLACE SECTION IS NULL ! 12295: JSR INSBF CALL TO INSERT AT END ! 12296: PPM APN01 CONVERT ERROR ! 12297: PPM APN02 NO ROOM ! 12298: EXI RETURN TO CALLER ! 12299: * ! 12300: * HERE TO TAKE CONVERT FAILURE EXIT ! 12301: * ! 12302: APN01 EXI 1 RETURN TO CALLER ALTERNATE ! 12303: * ! 12304: * HERE FOR NO FIT EXIT ! 12305: * ! 12306: APN02 EXI 2 ALTERNATE EXIT TO CALLER ! 12307: ENP END PROCEDURE APNDB ! 12308: EJC ! 12309: * ! 12310: * ARITH -- FETCH ARITHMETIC OPERANDS ! 12311: * ! 12312: * ARITH IS USED BY FUNCTIONS AND OPERATORS WHICH EXPECT ! 12313: * TWO NUMERIC ARGUMENTS (OPERANDS) WHICH MUST BOTH BE ! 12314: * INTEGER OR BOTH BE REAL. ARITH FETCHES TWO ARGUMENTS FROM ! 12315: * THE STACK AND PERFORMS ANY NECESSARY CONVERSIONS. ! 12316: * ! 12317: * 1(XS) FIRST ARGUMENT (LEFT OPERAND) ! 12318: * 0(XS) SECOND ARGUMENT (RIGHT OPERAND) ! 12319: * JSR ARITH CALL TO FETCH NUMERIC ARGUMENTS ! 12320: * PPM LOC TRANSFER LOC FOR OPND 1 NON-NUMERIC ! 12321: * PPM LOC TRANSFER LOC FOR OPND 2 NON-NUMERIC ! 12322: * PPM LOC TRANSFER LOC FOR REAL OPERANDS ! 12323: * ! 12324: * FOR INTEGER ARGS, CONTROL RETURNS PAST THE PARAMETERS ! 12325: * ! 12326: * (IA) LEFT OPERAND VALUE ! 12327: * (XR) PTR TO ICBLK FOR LEFT OPERAND ! 12328: * (XL) PTR TO ICBLK FOR RIGHT OPERAND ! 12329: * (XS) POPPED TWICE ! 12330: * (WA,WB,RA) DESTROYED ! 12331: * ! 12332: * FOR REAL ARGUMENTS, CONTROL RETURNS TO THE LOCATION ! 12333: * SPECIFIED BY THE THIRD PARAMETER. ! 12334: * ! 12335: * (RA) LEFT OPERAND VALUE ! 12336: * (XR) PTR TO RCBLK FOR LEFT OPERAND ! 12337: * (XL) PTR TO RCBLK FOR RIGHT OPERAND ! 12338: * (WA,WB,WC) DESTROYED ! 12339: * (XS) POPPED TWICE ! 12340: EJC ! 12341: * ! 12342: * ARITH (CONTINUED) ! 12343: * ! 12344: * ENTRY POINT ! 12345: * ! 12346: ARITH PRC N,3 ENTRY POINT ! 12347: MOV (XS)+,XL LOAD RIGHT OPERAND ! 12348: MOV (XS)+,XR LOAD LEFT OPERAND ! 12349: MOV (XL),WA GET RIGHT OPERAND TYPE WORD ! 12350: BEQ WA,=B$ICL,ARTH1 JUMP IF INTEGER ! 12351: BEQ WA,=B$RCL,ARTH4 JUMP IF REAL ! 12352: MOV XR,-(XS) ELSE REPLACE LEFT ARG ON STACK ! 12353: MOV XL,XR COPY LEFT ARG POINTER ! 12354: JSR GTNUM CONVERT TO NUMERIC ! 12355: PPM ARTH6 JUMP IF UNCONVERTIBLE ! 12356: MOV XR,XL ELSE COPY CONVERTED RESULT ! 12357: MOV (XL),WA GET RIGHT OPERAND TYPE WORD ! 12358: MOV (XS)+,XR RELOAD LEFT ARGUMENT ! 12359: BEQ WA,=B$RCL,ARTH4 JUMP IF RIGHT ARG IS REAL ! 12360: * ! 12361: * HERE IF RIGHT ARG IS AN INTEGER ! 12362: * ! 12363: ARTH1 BNE (XR),=B$ICL,ARTH3 JUMP IF LEFT ARG NOT INTEGER ! 12364: * ! 12365: * EXIT FOR INTEGER CASE ! 12366: * ! 12367: ARTH2 LDI ICVAL(XR) LOAD LEFT OPERAND VALUE ! 12368: EXI RETURN TO ARITH CALLER ! 12369: * ! 12370: * HERE FOR RIGHT OPERAND INTEGER, LEFT OPERAND NOT ! 12371: * ! 12372: ARTH3 JSR GTNUM CONVERT LEFT ARG TO NUMERIC ! 12373: PPM ARTH7 JUMP IF NOT CONVERTIBLE ! 12374: BEQ WA,=B$ICL,ARTH2 JUMP BACK IF INTEGER-INTEGER ! 12375: * ! 12376: * HERE WE MUST CONVERT REAL-INTEGER TO REAL-REAL ! 12377: * ! 12378: MOV XR,-(XS) PUT LEFT ARG BACK ON STACK ! 12379: LDI ICVAL(XL) LOAD RIGHT ARGUMENT VALUE ! 12380: ITR CONVERT TO REAL ! 12381: JSR RCBLD GET REAL BLOCK FOR RIGHT ARG, MERGE ! 12382: MOV XR,XL COPY RIGHT ARG PTR ! 12383: MOV (XS)+,XR LOAD LEFT ARGUMENT ! 12384: BRN ARTH5 MERGE FOR REAL-REAL CASE ! 12385: EJC ! 12386: * ! 12387: * ARITH (CONTINUED) ! 12388: * ! 12389: * HERE IF RIGHT ARGUMENT IS REAL ! 12390: * ! 12391: ARTH4 BEQ (XR),=B$RCL,ARTH5 JUMP IF LEFT ARG REAL ! 12392: JSR GTREA ELSE CONVERT TO REAL ! 12393: PPM ARTH7 ERROR IF UNCONVERTIBLE ! 12394: * ! 12395: * HERE FOR REAL-REAL ! 12396: * ! 12397: ARTH5 LDR RCVAL(XR) LOAD LEFT OPERAND VALUE ! 12398: EXI 3 TAKE REAL-REAL EXIT ! 12399: * ! 12400: * HERE FOR ERROR CONVERTING RIGHT ARGUMENT ! 12401: * ! 12402: ARTH6 ICA XS POP UNWANTED LEFT ARG ! 12403: EXI 2 TAKE APPROPRIATE ERROR EXIT ! 12404: * ! 12405: * HERE FOR ERROR CONVERTING LEFT OPERAND ! 12406: * ! 12407: ARTH7 EXI 1 TAKE APPROPRIATE ERROR RETURN ! 12408: ENP END PROCEDURE ARITH ! 12409: EJC ! 12410: * ! 12411: * ASIGN -- PERFORM ASSIGNMENT ! 12412: * ! 12413: * ASIGN PERFORMS THE ASSIGNMENT OF A VALUE TO A VARIABLE ! 12414: * WITH APPROPRIATE CHECKS FOR OUTPUT ASSOCIATIONS AND ! 12415: * VALUE TRACE ASSOCIATIONS WHICH ARE EXECUTED AS REQUIRED. ! 12416: * ASIGN ALSO HANDLES THE SPECIAL CASES OF ASSIGNMENT TO ! 12417: * PATTERN AND EXPRESSION VARIABLES. ! 12418: * ! 12419: * (WB) VALUE TO BE ASSIGNED ! 12420: * (XL) BASE POINTER FOR VARIABLE ! 12421: * (WA) OFFSET FOR VARIABLE ! 12422: * JSR ASIGN CALL TO ASSIGN VALUE TO VARIABLE ! 12423: * PPM LOC TRANSFER LOC FOR FAILURE ! 12424: * (XR,XL,WA,WB,WC) DESTROYED ! 12425: * (RA) DESTROYED ! 12426: * ! 12427: * FAILURE OCCURS IF THE EVALUATION OF AN EXPRESSION ! 12428: * ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS. ! 12429: * ! 12430: ASIGN PRC R,1 ENTRY POINT (RECURSIVE) ! 12431: * ! 12432: * MERGE BACK HERE TO ASSIGN RESULT TO EXPRESSION VARIABLE. ! 12433: * ! 12434: ASG01 ADD WA,XL POINT TO VARIABLE VALUE ! 12435: MOV (XL),XR LOAD VARIABLE VALUE ! 12436: BEQ (XR),=B$TRT,ASG02 JUMP IF TRAPPED ! 12437: MOV WB,(XL) ELSE PERFORM ASSIGNMENT ! 12438: ZER XL CLEAR GARBAGE VALUE IN XL ! 12439: EXI AND RETURN TO ASIGN CALLER ! 12440: * ! 12441: * HERE IF VALUE IS TRAPPED ! 12442: * ! 12443: ASG02 SUB WA,XL RESTORE NAME BASE ! 12444: BEQ XR,=TRBKV,ASG14 JUMP IF KEYWORD VARIABLE ! 12445: BNE XR,=TRBEV,ASG04 JUMP IF NOT EXPRESSION VARIABLE ! 12446: * ! 12447: * HERE FOR ASSIGNMENT TO EXPRESSION VARIABLE ! 12448: * ! 12449: MOV EVEXP(XL),XR POINT TO EXPRESSION ! 12450: MOV WB,-(XS) STORE VALUE TO ASSIGN ON STACK ! 12451: MOV =NUM01,WB SET FOR EVALUATION BY NAME ! 12452: JSR EVALX EVALUATE EXPRESSION BY NAME ! 12453: PPM ASG03 JUMP IF EVALUATION FAILS ! 12454: MOV (XS)+,WB ELSE RELOAD VALUE TO ASSIGN ! 12455: BRN ASG01 LOOP BACK TO PERFORM ASSIGNMENT ! 12456: EJC ! 12457: * ! 12458: * ASIGN (CONTINUED) ! 12459: * ! 12460: * HERE FOR FAILURE DURING EXPRESSION EVALUATION ! 12461: * ! 12462: ASG03 ICA XS REMOVE STACKED VALUE ENTRY ! 12463: EXI 1 TAKE FAILURE EXIT ! 12464: * ! 12465: * HERE IF NOT KEYWORD OR EXPRESSION VARIABLE ! 12466: * ! 12467: ASG04 MOV XR,-(XS) SAVE PTR TO FIRST TRBLK ! 12468: * ! 12469: * LOOP TO CHASE DOWN TRBLK CHAIN AND ASSIGN VALUE AT END ! 12470: * ! 12471: ASG05 MOV XR,WC SAVE PTR TO THIS TRBLK ! 12472: MOV TRNXT(XR),XR POINT TO NEXT TRBLK ! 12473: BEQ (XR),=B$TRT,ASG05 LOOP BACK IF ANOTHER TRBLK ! 12474: MOV WC,XR ELSE POINT BACK TO LAST TRBLK ! 12475: MOV WB,TRVAL(XR) STORE VALUE AT END OF CHAIN ! 12476: MOV (XS)+,XR RESTORE PTR TO FIRST TRBLK ! 12477: * ! 12478: * LOOP TO PROCESS TRBLK ENTRIES ON CHAIN ! 12479: * ! 12480: ASG06 MOV TRTYP(XR),WB LOAD TYPE CODE OF TRBLK ! 12481: BEQ WB,=TRTVL,ASG08 JUMP IF VALUE TRACE ! 12482: BEQ WB,=TRTOU,ASG10 JUMP IF OUTPUT ASSOCIATION ! 12483: * ! 12484: * HERE TO MOVE TO NEXT TRBLK ON CHAIN ! 12485: * ! 12486: ASG07 MOV TRNXT(XR),XR POINT TO NEXT TRBLK ON CHAIN ! 12487: BEQ (XR),=B$TRT,ASG06 LOOP BACK IF ANOTHER TRBLK ! 12488: EXI ELSE END OF CHAIN, RETURN TO CALLER ! 12489: * ! 12490: * HERE TO PROCESS VALUE TRACE ! 12491: * ! 12492: ASG08 BZE KVTRA,ASG07 IGNORE VALUE TRACE IF TRACE OFF ! 12493: DCV KVTRA ELSE DECREMENT TRACE COUNT ! 12494: BZE TRFNC(XR),ASG09 JUMP IF PRINT TRACE ! 12495: JSR TRXEQ ELSE EXECUTE FUNCTION TRACE ! 12496: BRN ASG07 AND LOOP BACK ! 12497: EJC ! 12498: * ! 12499: * ASIGN (CONTINUED) ! 12500: * ! 12501: * HERE FOR PRINT TRACE ! 12502: * ! 12503: ASG09 JSR PRTSN PRINT STATEMENT NUMBER ! 12504: JSR PRTNV PRINT NAME = VALUE ! 12505: BRN ASG07 LOOP BACK FOR NEXT TRBLK ! 12506: * ! 12507: * HERE FOR OUTPUT ASSOCIATION ! 12508: * ! 12509: ASG10 BZE KVOUP,ASG07 IGNORE OUTPUT ASSOC IF OUTPUT OFF ! 12510: MOV XR,XL ELSE COPY TRBLK POINTER ! 12511: MOV TRVAL(WC),-(XS) STACK VALUE TO OUTPUT (SGD01) ! 12512: JSR GTSTG CONVERT TO STRING ! 12513: PPM ASG12 GET DATATYPE NAME IF UNCONVERTIBLE ! 12514: * ! 12515: * MERGE WITH STRING FOR OUTPUT ! 12516: * ! 12517: ASG11 MOV TRFPT(XL),WA FCBLK PTR ! 12518: BZE WA,ASG13 JUMP IF STANDARD OUTPUT FILE ! 12519: * ! 12520: * HERE FOR OUTPUT TO NON-STANDARD OUTPUT FILE ! 12521: * ! 12522: JSR SYSOU CALL SYSTEM OUTPUT ROUTINE ! 12523: ERR 206,OUTPUT CAUSED FILE OVERFLOW ! 12524: ERR 207,OUTPUT CAUSED NON-RECOVERABLE ERROR ! 12525: EXI ELSE ALL DONE, RETURN TO CALLER ! 12526: * ! 12527: * IF NOT PRINTABLE, GET DATATYPE NAME INSTEAD ! 12528: * ! 12529: ASG12 JSR DTYPE CALL DATATYPE ROUTINE ! 12530: BRN ASG11 MERGE ! 12531: * ! 12532: * HERE TO PRINT A STRING ON THE PRINTER ! 12533: * ! 12534: ASG13 JSR PRTST PRINT STRING VALUE ! 12535: BEQ TRTER(XL),=V$TER,ASG20 JUMP IF TERMINAL OUTPUT ! 12536: JSR PRTNL END OF LINE ! 12537: EXI RETURN TO CALLER ! 12538: EJC ! 12539: * ! 12540: * ASIGN (CONTINUED) ! 12541: * ! 12542: * HERE FOR KEYWORD ASSIGNMENT ! 12543: * ! 12544: ASG14 MOV KVNUM(XL),XL LOAD KEYWORD NUMBER ! 12545: BEQ XL,=K$ETX,ASG19 JUMP IF ERRTEXT ! 12546: MOV WB,XR COPY VALUE TO BE ASSIGNED ! 12547: JSR GTINT CONVERT TO INTEGER ! 12548: ERR 208,KEYWORD VALUE ASSIGNED IS NOT INTEGER ! 12549: LDI ICVAL(XR) ELSE LOAD VALUE ! 12550: BEQ XL,=K$STL,ASG16 JUMP IF SPECIAL CASE OF STLIMIT ! 12551: MFI WA,ASG18 ELSE GET ADDR INTEGER, TEST OVFLOW ! 12552: BGE WA,MXLEN,ASG18 FAIL IF TOO LARGE ! 12553: BEQ XL,=K$ERT,ASG17 JUMP IF SPECIAL CASE OF ERRTYPE ! 12554: BEQ XL,=K$PFL,ASG21 JUMP IF SPECIAL CASE OF PROFILE ! 12555: BLT XL,=K$P$$,ASG15 JUMP UNLESS PROTECTED ! 12556: ERB 209,KEYWORD IN ASSIGNMENT IS PROTECTED ! 12557: * ! 12558: * HERE TO DO ASSIGNMENT IF NOT PROTECTED ! 12559: * ! 12560: ASG15 MOV WA,KVABE(XL) STORE NEW VALUE ! 12561: EXI RETURN TO ASIGN CALLER ! 12562: * ! 12563: * HERE FOR SPECIAL CASE OF STLIMIT ! 12564: * ! 12565: * SINCE STCOUNT IS MAINTAINED AS (STLIMIT-STCOUNT) ! 12566: * IT IS ALSO NECESSARY TO MODIFY STCOUNT APPROPRIATELY. ! 12567: * ! 12568: ASG16 SBI KVSTL SUBTRACT OLD LIMIT ! 12569: ADI KVSTC ADD OLD COUNTER ! 12570: STI KVSTC STORE NEW COUNTER VALUE ! 12571: LDI ICVAL(XR) RELOAD NEW LIMIT VALUE ! 12572: STI KVSTL STORE NEW LIMIT VALUE ! 12573: EXI RETURN TO ASIGN CALLER ! 12574: * ! 12575: * HERE FOR SPECIAL CASE OF ERRTYPE ! 12576: * ! 12577: ASG17 BLE WA,=NINI9,ERROR OK TO SIGNAL IF IN RANGE ! 12578: * ! 12579: * HERE IF VALUE ASSIGNED IS OUT OF RANGE ! 12580: * ! 12581: ASG18 ERB 210,KEYWORD VALUE ASSIGNED IS NEGATIVE OR TOO LARGE ! 12582: * ! 12583: * HERE FOR SPECIAL CASE OF ERRTEXT ! 12584: * ! 12585: ASG19 MOV WB,-(XS) STACK VALUE ! 12586: JSR GTSTG CONVERT TO STRING ! 12587: ERR 211,VALUE ASSIGNED TO KEYWORD ERRTEXT NOT A STRING ! 12588: MOV XR,R$ETX MAKE ASSIGNMENT ! 12589: EXI RETURN TO CALLER ! 12590: * ! 12591: * PRINT STRING TO TERMINAL ! 12592: * ! 12593: ASG20 JSR PRTTR PRINT ! 12594: EXI RETURN ! 12595: * ! 12596: * HERE FOR KEYWORD PROFILE ! 12597: * ! 12598: ASG21 BGT WA,=NUM02,ASG18 MOAN IF NOT 0,1, OR 2 ! 12599: BZE WA,ASG15 JUST ASSIGN IF ZERO ! 12600: BZE PFDMP,ASG22 BRANCH IF FIRST ASSIGNMENT ! 12601: BEQ WA,PFDMP,ASG23 ALSO IF SAME VALUE AS BEFORE ! 12602: ERB 268,INCONSISTENT VALUE ASSIGNED TO KEYWORD PROFILE ! 12603: * ! 12604: ASG22 MOV WA,PFDMP NOTE VALUE ON FIRST ASSIGNMENT ! 12605: ASG23 JSR SYSTM GET THE TIME ! 12606: STI PFSTM FUDGE SOME KIND OF START TIME ! 12607: BRN ASG15 AND GO ASSIGN ! 12608: ENP END PROCEDURE ASIGN ! 12609: EJC ! 12610: * ! 12611: * ASINP -- ASSIGN DURING PATTERN MATCH ! 12612: * ! 12613: * ASINP IS LIKE ASIGN AND HAS A SIMILAR CALLING SEQUENCE ! 12614: * AND EFFECT. THE DIFFERENCE IS THAT THE GLOBAL PATTERN ! 12615: * VARIABLES ARE SAVED AND RESTORED IF REQUIRED. ! 12616: * ! 12617: * (XL) BASE POINTER FOR VARIABLE ! 12618: * (WA) OFFSET FOR VARIABLE ! 12619: * (WB) VALUE TO BE ASSIGNED ! 12620: * JSR ASINP CALL TO ASSIGN VALUE TO VARIABLE ! 12621: * PPM LOC TRANSFER LOC IF FAILURE ! 12622: * (XR,XL) DESTROYED ! 12623: * (WA,WB,WC,RA) DESTROYED ! 12624: * ! 12625: ASINP PRC R,1 ENTRY POINT, RECURSIVE ! 12626: ADD WA,XL POINT TO VARIABLE ! 12627: MOV (XL),XR LOAD CURRENT CONTENTS ! 12628: BEQ (XR),=B$TRT,ASNP1 JUMP IF TRAPPED ! 12629: MOV WB,(XL) ELSE PERFORM ASSIGNMENT ! 12630: ZER XL CLEAR GARBAGE VALUE IN XL ! 12631: EXI RETURN TO ASINP CALLER ! 12632: * ! 12633: * HERE IF VARIABLE IS TRAPPED ! 12634: * ! 12635: ASNP1 SUB WA,XL RESTORE BASE POINTER ! 12636: MOV PMSSL,-(XS) STACK SUBJECT STRING LENGTH ! 12637: MOV PMHBS,-(XS) STACK HISTORY STACK BASE PTR ! 12638: MOV R$PMS,-(XS) STACK SUBJECT STRING POINTER ! 12639: MOV PMDFL,-(XS) STACK DOT FLAG ! 12640: JSR ASIGN CALL FULL-BLOWN ASSIGNMENT ROUTINE ! 12641: PPM ASNP2 JUMP IF FAILURE ! 12642: MOV (XS)+,PMDFL RESTORE DOT FLAG ! 12643: MOV (XS)+,R$PMS RESTORE SUBJECT STRING POINTER ! 12644: MOV (XS)+,PMHBS RESTORE HISTORY STACK BASE POINTER ! 12645: MOV (XS)+,PMSSL RESTORE SUBJECT STRING LENGTH ! 12646: EXI RETURN TO ASINP CALLER ! 12647: * ! 12648: * HERE IF FAILURE IN ASIGN CALL ! 12649: * ! 12650: ASNP2 MOV (XS)+,PMDFL RESTORE DOT FLAG ! 12651: MOV (XS)+,R$PMS RESTORE SUBJECT STRING POINTER ! 12652: MOV (XS)+,PMHBS RESTORE HISTORY STACK BASE POINTER ! 12653: MOV (XS)+,PMSSL RESTORE SUBJECT STRING LENGTH ! 12654: EXI 1 TAKE FAILURE EXIT ! 12655: ENP END PROCEDURE ASINP ! 12656: EJC ! 12657: * ! 12658: * BLKLN -- DETERMINE LENGTH OF BLOCK ! 12659: * ! 12660: * BLKLN DETERMINES THE LENGTH OF A BLOCK IN DYNAMIC STORE. ! 12661: * ! 12662: * (WA) FIRST WORD OF BLOCK ! 12663: * (XR) POINTER TO BLOCK ! 12664: * JSR BLKLN CALL TO GET BLOCK LENGTH ! 12665: * (WA) LENGTH OF BLOCK IN BYTES ! 12666: * (XL) DESTROYED ! 12667: * ! 12668: * BLKLN IS USED BY THE GARBAGE COLLECTOR AND IS NOT ! 12669: * PERMITTED TO CALL GBCOL DIRECTLY OR INDIRECTLY. ! 12670: * ! 12671: * THE FIRST WORD STORED IN THE BLOCK (I.E. AT XR) MAY ! 12672: * BE ANYTHING, BUT THE CONTENTS OF WA MUST BE CORRECT. ! 12673: * ! 12674: BLKLN PRC E,0 ENTRY POINT ! 12675: MOV WA,XL COPY FIRST WORD ! 12676: LEI XL GET ENTRY ID (BL$XX) ! 12677: BSW XL,BL$$$,BLN00 SWITCH ON BLOCK TYPE ! 12678: IFF BL$AR,BLN01 ARBLK ! 12679: IFF BL$BC,BLN04 BCBLK ! 12680: IFF BL$BF,BLN11 BFBLK ! 12681: IFF BL$CD,BLN01 CDBLK ! 12682: IFF BL$DF,BLN01 DFBLK ! 12683: IFF BL$EF,BLN01 EFBLK ! 12684: IFF BL$EX,BLN01 EXBLK ! 12685: IFF BL$PF,BLN01 PFBLK ! 12686: IFF BL$TB,BLN01 TBBLK ! 12687: IFF BL$VC,BLN01 VCBLK ! 12688: IFF BL$EV,BLN03 EVBLK ! 12689: IFF BL$KV,BLN03 KVBLK ! 12690: IFF BL$P0,BLN02 P0BLK ! 12691: IFF BL$SE,BLN02 SEBLK ! 12692: IFF BL$NM,BLN03 NMBLK ! 12693: IFF BL$P1,BLN03 P1BLK ! 12694: IFF BL$P2,BLN04 P2BLK ! 12695: IFF BL$TE,BLN04 TEBLK ! 12696: IFF BL$FF,BLN05 FFBLK ! 12697: IFF BL$TR,BLN05 TRBLK ! 12698: IFF BL$CT,BLN06 CTBLK ! 12699: IFF BL$IC,BLN07 ICBLK ! 12700: IFF BL$PD,BLN08 PDBLK ! 12701: IFF BL$RC,BLN09 RCBLK ! 12702: IFF BL$SC,BLN10 SCBLK ! 12703: ESW END OF JUMP TABLE ON BLOCK TYPE ! 12704: EJC ! 12705: * ! 12706: * BLKLN (CONTINUED) ! 12707: * ! 12708: * HERE FOR BLOCKS WITH LENGTH IN SECOND WORD ! 12709: * ! 12710: BLN00 MOV 1(XR),WA LOAD LENGTH ! 12711: EXI RETURN TO BLKLN CALLER ! 12712: * ! 12713: * HERE FOR LENGTH IN THIRD WORD (AR,CD,DF,EF,EX,PF,TB,VC) ! 12714: * ! 12715: BLN01 MOV 2(XR),WA LOAD LENGTH FROM THIRD WORD ! 12716: EXI RETURN TO BLKLN CALLER ! 12717: * ! 12718: * HERE FOR TWO WORD BLOCKS (P0,SE) ! 12719: * ! 12720: BLN02 MOV *NUM02,WA LOAD LENGTH (TWO WORDS) ! 12721: EXI RETURN TO BLKLN CALLER ! 12722: * ! 12723: * HERE FOR THREE WORD BLOCKS (NM,P1,EV,KV) ! 12724: * ! 12725: BLN03 MOV *NUM03,WA LOAD LENGTH (THREE WORDS) ! 12726: EXI RETURN TO BLKLN CALLER ! 12727: * ! 12728: * HERE FOR FOUR WORD BLOCKS (P2,TE,BC) ! 12729: * ! 12730: BLN04 MOV *NUM04,WA LOAD LENGTH (FOUR WORDS) ! 12731: EXI RETURN TO BLKLN CALLER ! 12732: * ! 12733: * HERE FOR FIVE WORD BLOCKS (FF,TR) ! 12734: * ! 12735: BLN05 MOV *NUM05,WA LOAD LENGTH ! 12736: EXI RETURN TO BLKLN CALLER ! 12737: EJC ! 12738: * ! 12739: * BLKLN (CONTINUED) ! 12740: * ! 12741: * HERE FOR CTBLK ! 12742: * ! 12743: BLN06 MOV *CTSI$,WA SET SIZE OF CTBLK ! 12744: EXI RETURN TO BLKLN CALLER ! 12745: * ! 12746: * HERE FOR ICBLK ! 12747: * ! 12748: BLN07 MOV *ICSI$,WA SET SIZE OF ICBLK ! 12749: EXI RETURN TO BLKLN CALLER ! 12750: * ! 12751: * HERE FOR PDBLK ! 12752: * ! 12753: BLN08 MOV PDDFP(XR),XL POINT TO DFBLK ! 12754: MOV DFPDL(XL),WA LOAD PDBLK LENGTH FROM DFBLK ! 12755: EXI RETURN TO BLKLN CALLER ! 12756: * ! 12757: * HERE FOR RCBLK ! 12758: * ! 12759: BLN09 MOV *RCSI$,WA SET SIZE OF RCBLK ! 12760: EXI RETURN TO BLKLN CALLER ! 12761: * ! 12762: * HERE FOR SCBLK ! 12763: * ! 12764: BLN10 MOV SCLEN(XR),WA LOAD LENGTH IN CHARACTERS ! 12765: CTB WA,SCSI$ CALCULATE LENGTH IN BYTES ! 12766: EXI RETURN TO BLKLN CALLER ! 12767: * ! 12768: * HERE FOR BFBLK ! 12769: * ! 12770: BLN11 MOV BFALC(XR),WA GET ALLOCATION IN BYTES ! 12771: CTB WA,BFSI$ CALCULATE LENGTH IN BYTES ! 12772: EXI RETURN TO BLKLN CALLER ! 12773: ENP END PROCEDURE BLKLN ! 12774: EJC ! 12775: * ! 12776: * COPYB -- COPY A BLOCK ! 12777: * ! 12778: * (XS) BLOCK TO BE COPIED ! 12779: * JSR COPYB CALL TO COPY BLOCK ! 12780: * PPM LOC RETURN IF BLOCK HAS NO IDVAL FIELD ! 12781: * NORMAL RETURN IF IDVAL FIELD ! 12782: * (XR) COPY OF BLOCK ! 12783: * (XS) POPPED ! 12784: * (XL,WA,WB,WC) DESTROYED ! 12785: * ! 12786: COPYB PRC N,1 ENTRY POINT ! 12787: MOV (XS),XR LOAD ARGUMENT ! 12788: BEQ XR,=NULLS,COP10 RETURN ARGUMENT IF IT IS NULL ! 12789: MOV (XR),WA ELSE LOAD TYPE WORD ! 12790: MOV WA,WB COPY TYPE WORD ! 12791: JSR BLKLN GET LENGTH OF ARGUMENT BLOCK ! 12792: MOV XR,XL COPY POINTER ! 12793: JSR ALLOC ALLOCATE BLOCK OF SAME SIZE ! 12794: MOV XR,(XS) STORE POINTER TO COPY ! 12795: MVW COPY CONTENTS OF OLD BLOCK TO NEW ! 12796: MOV (XS),XR RELOAD POINTER TO START OF COPY ! 12797: BEQ WB,=B$TBT,COP05 JUMP IF TABLE ! 12798: BEQ WB,=B$VCT,COP01 JUMP IF VECTOR ! 12799: BEQ WB,=B$PDT,COP01 JUMP IF PROGRAM DEFINED ! 12800: BEQ WB,=B$BCT,COP11 JUMP IF BUFFER ! 12801: BNE WB,=B$ART,COP10 RETURN COPY IF NOT ARRAY ! 12802: * ! 12803: * HERE FOR ARRAY (ARBLK) ! 12804: * ! 12805: ADD AROFS(XR),XR POINT TO PROTOTYPE FIELD ! 12806: BRN COP02 JUMP TO MERGE ! 12807: * ! 12808: * HERE FOR VECTOR, PROGRAM DEFINED ! 12809: * ! 12810: COP01 ADD *PDFLD,XR POINT TO PDFLD = VCVLS ! 12811: * ! 12812: * MERGE HERE FOR ARBLK, VCBLK, PDBLK TO DELETE TRAP ! 12813: * BLOCKS FROM ALL VALUE FIELDS (THE COPY IS UNTRAPPED) ! 12814: * ! 12815: COP02 MOV (XR),XL LOAD NEXT POINTER ! 12816: * ! 12817: * LOOP TO GET VALUE AT END OF TRBLK CHAIN ! 12818: * ! 12819: COP03 BNE (XL),=B$TRT,COP04 JUMP IF NOT TRAPPED ! 12820: MOV TRVAL(XL),XL ELSE POINT TO NEXT VALUE ! 12821: BRN COP03 AND LOOP BACK ! 12822: EJC ! 12823: * ! 12824: * COPYB (CONTINUED) ! 12825: * ! 12826: * HERE WITH UNTRAPPED VALUE IN XL ! 12827: * ! 12828: COP04 MOV XL,(XR)+ STORE REAL VALUE, BUMP POINTER ! 12829: BNE XR,DNAMP,COP02 LOOP BACK IF MORE TO GO ! 12830: BRN COP09 ELSE JUMP TO EXIT ! 12831: * ! 12832: * HERE TO COPY A TABLE ! 12833: * ! 12834: COP05 ZER IDVAL(XR) ZERO ID TO STOP DUMP BLOWING UP ! 12835: MOV *TESI$,WA SET SIZE OF TEBLK ! 12836: MOV *TBBUK,WC SET INITIAL OFFSET ! 12837: * ! 12838: * LOOP THROUGH BUCKETS IN TABLE ! 12839: * ! 12840: COP06 MOV (XS),XR LOAD TABLE POINTER ! 12841: BEQ WC,TBLEN(XR),COP09 JUMP TO EXIT IF ALL DONE ! 12842: ADD WC,XR ELSE POINT TO NEXT BUCKET HEADER ! 12843: ICA WC BUMP OFFSET ! 12844: SUB *TENXT,XR SUBTRACT LINK OFFSET TO MERGE ! 12845: * ! 12846: * LOOP THROUGH TEBLKS ON ONE CHAIN ! 12847: * ! 12848: COP07 MOV TENXT(XR),XL LOAD POINTER TO NEXT TEBLK ! 12849: MOV (XS),TENXT(XR) SET END OF CHAIN POINTER IN CASE ! 12850: BEQ (XL),=B$TBT,COP06 BACK FOR NEXT BUCKET IF CHAIN END ! 12851: MOV XR,-(XS) ELSE STACK PTR TO PREVIOUS BLOCK ! 12852: MOV *TESI$,WA SET SIZE OF TEBLK ! 12853: JSR ALLOC ALLOCATE NEW TEBLK ! 12854: MOV XR,WB SAVE PTR TO NEW TEBLK ! 12855: MVW COPY OLD TEBLK TO NEW TEBLK ! 12856: MOV WB,XR RESTORE POINTER TO NEW TEBLK ! 12857: MOV (XS)+,XL RESTORE POINTER TO PREVIOUS BLOCK ! 12858: MOV XR,TENXT(XL) LINK NEW BLOCK TO PREVIOUS ! 12859: MOV XR,XL COPY POINTER TO NEW BLOCK ! 12860: * ! 12861: * LOOP TO SET REAL VALUE AFTER REMOVING TRAP CHAIN ! 12862: * ! 12863: COP08 MOV TEVAL(XL),XL LOAD VALUE ! 12864: BEQ (XL),=B$TRT,COP08 LOOP BACK IF TRAPPED ! 12865: MOV XL,TEVAL(XR) STORE UNTRAPPED VALUE IN TEBLK ! 12866: BRN COP07 BACK FOR NEXT TEBLK ! 12867: * ! 12868: * COMMON EXIT POINT ! 12869: * ! 12870: COP09 MOV (XS)+,XR LOAD POINTER TO BLOCK ! 12871: EXI RETURN ! 12872: * ! 12873: * ALTERNATIVE RETURN ! 12874: * ! 12875: COP10 EXI 1 RETURN ! 12876: EJC ! 12877: * ! 12878: * HERE TO COPY BUFFER ! 12879: * ! 12880: COP11 MOV BCBUF(XR),XL GET BFBLK PTR ! 12881: MOV BFALC(XL),WA GET ALLOCATION ! 12882: CTB WA,BFSI$ SET TOTAL SIZE ! 12883: MOV XR,XL SAVE BCBLK PTR ! 12884: JSR ALLOC ALLOCATE BFBLK ! 12885: MOV BCBUF(XL),WB GET OLD BFBLK ! 12886: MOV XR,BCBUF(XL) SET POINTER TO NEW BFBLK ! 12887: MOV WB,XL POINT TO OLD BFBLK ! 12888: MVW COPY BFBLK TOO ! 12889: ZER XL CLEAR RUBBISH PTR ! 12890: BRN COP09 BRANCH TO EXIT ! 12891: ENP END PROCEDURE COPYB ! 12892: * ! 12893: * CDGCG -- GENERATE CODE FOR COMPLEX GOTO ! 12894: * ! 12895: * USED BY CMPIL TO PROCESS COMPLEX GOTO TREE ! 12896: * ! 12897: * (WB) MUST BE COLLECTABLE ! 12898: * (XR) EXPRESSION POINTER ! 12899: * JSR CDGCG CALL TO GENERATE COMPLEX GOTO ! 12900: * (XL,XR,WA) DESTROYED ! 12901: * ! 12902: CDGCG PRC E,0 ENTRY POINT ! 12903: MOV CMOPN(XR),XL GET UNARY GOTO OPERATOR ! 12904: MOV CMROP(XR),XR POINT TO GOTO OPERAND ! 12905: BEQ XL,=OPDVD,CDGC2 JUMP IF DIRECT GOTO ! 12906: JSR CDGNM GENERATE OPND BY NAME IF NOT DIRECT ! 12907: * ! 12908: * RETURN POINT ! 12909: * ! 12910: CDGC1 MOV XL,WA GOTO OPERATOR ! 12911: JSR CDWRD GENERATE IT ! 12912: EXI RETURN TO CALLER ! 12913: * ! 12914: * DIRECT GOTO ! 12915: * ! 12916: CDGC2 JSR CDGVL GENERATE OPERAND BY VALUE ! 12917: BRN CDGC1 MERGE TO RETURN ! 12918: ENP END PROCEDURE CDGCG ! 12919: EJC ! 12920: * ! 12921: * CDGEX -- BUILD EXPRESSION BLOCK ! 12922: * ! 12923: * CDGEX IS PASSED A POINTER TO AN EXPRESSION TREE (SEE ! 12924: * EXPAN) AND RETURNS AN EXPRESSION (SEBLK OR EXBLK). ! 12925: * ! 12926: * (WC) SOME COLLECTABLE VALUE ! 12927: * (WB) INTEGER IN RANGE 0 LE X LE MXLEN ! 12928: * (XL) PTR TO EXPRESSION TREE ! 12929: * JSR CDGEX CALL TO BUILD EXPRESSION ! 12930: * (XR) PTR TO SEBLK OR EXBLK ! 12931: * (XL,WA,WB) DESTROYED ! 12932: * ! 12933: CDGEX PRC R,0 ENTRY POINT, RECURSIVE ! 12934: BLO (XL),=B$VR$,CDGX1 JUMP IF NOT VARIABLE ! 12935: * ! 12936: * HERE FOR NATURAL VARIABLE, BUILD SEBLK ! 12937: * ! 12938: MOV *SESI$,WA SET SIZE OF SEBLK ! 12939: JSR ALLOC ALLOCATE SPACE FOR SEBLK ! 12940: MOV =B$SEL,(XR) SET TYPE WORD ! 12941: MOV XL,SEVAR(XR) STORE VRBLK POINTER ! 12942: EXI RETURN TO CDGEX CALLER ! 12943: * ! 12944: * HERE IF NOT VARIABLE, BUILD EXBLK ! 12945: * ! 12946: CDGX1 MOV XL,XR COPY TREE POINTER ! 12947: MOV WC,-(XS) SAVE WC ! 12948: MOV CWCOF,XL SAVE CURRENT OFFSET ! 12949: MOV (XR),WA GET TYPE WORD ! 12950: BNE WA,=B$CMT,CDGX2 CALL BY VALUE IF NOT CMBLK ! 12951: BGE CMTYP(XR),=C$$NM,CDGX2 JUMP IF CMBLK ONLY BY VALUE ! 12952: EJC ! 12953: * ! 12954: * CDGEX (CONTINUED) ! 12955: * ! 12956: * HERE IF EXPRESSION CAN BE EVALUATED BY NAME ! 12957: * ! 12958: JSR CDGNM GENERATE CODE BY NAME ! 12959: MOV =ORNM$,WA LOAD RETURN BY NAME WORD ! 12960: BRN CDGX3 MERGE WITH VALUE CASE ! 12961: * ! 12962: * HERE IF EXPRESSION CAN ONLY BE EVALUATED BY VALUE ! 12963: * ! 12964: CDGX2 JSR CDGVL GENERATE CODE BY VALUE ! 12965: MOV =ORVL$,WA LOAD RETURN BY VALUE WORD ! 12966: * ! 12967: * MERGE HERE TO CONSTRUCT EXBLK ! 12968: * ! 12969: CDGX3 JSR CDWRD GENERATE RETURN WORD ! 12970: JSR EXBLD BUILD EXBLK ! 12971: MOV (XS)+,WC RESTORE WC ! 12972: EXI RETURN TO CDGEX CALLER ! 12973: ENP END PROCEDURE CDGEX ! 12974: EJC ! 12975: * ! 12976: * CDGNM -- GENERATE CODE BY NAME ! 12977: * ! 12978: * CDGNM IS CALLED DURING THE COMPILATION PROCESS TO ! 12979: * GENERATE CODE BY NAME FOR AN EXPRESSION. SEE CDBLK ! 12980: * DESCRIPTION FOR DETAILS OF CODE GENERATED. THE INPUT ! 12981: * TO CDGNM IS AN EXPRESSION TREE AS GENERATED BY EXPAN. ! 12982: * ! 12983: * CDGNM IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING ! 12984: * RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS. ! 12985: * ! 12986: * (WB) INTEGER IN RANGE 0 LE N LE DNAMB ! 12987: * (XR) PTR TO TREE GENERATED BY EXPAN ! 12988: * (WC) CONSTANT FLAG (SEE BELOW) ! 12989: * JSR CDGNM CALL TO GENERATE CODE BY NAME ! 12990: * (XR,WA) DESTROYED ! 12991: * (WC) SET NON-ZERO IF NON-CONSTANT ! 12992: * ! 12993: * WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE ! 12994: * EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE ! 12995: * EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED. ! 12996: * ! 12997: * THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD). ! 12998: * ! 12999: CDGNM PRC R,0 ENTRY POINT, RECURSIVE ! 13000: MOV XL,-(XS) SAVE ENTRY XL ! 13001: MOV WB,-(XS) SAVE ENTRY WB ! 13002: CHK CHECK FOR STACK OVERFLOW ! 13003: MOV (XR),WA LOAD TYPE WORD ! 13004: BEQ WA,=B$CMT,CGN04 JUMP IF CMBLK ! 13005: BHI WA,=B$VR$,CGN02 JUMP IF SIMPLE VARIABLE ! 13006: * ! 13007: * MERGE HERE FOR OPERAND YIELDING VALUE (E.G. CONSTANT) ! 13008: * ! 13009: CGN01 ERB 212,SYNTAX ERROR. VALUE USED WHERE NAME IS REQUIRED ! 13010: * ! 13011: * HERE FOR NATURAL VARIABLE REFERENCE ! 13012: * ! 13013: CGN02 MOV =OLVN$,WA LOAD VARIABLE LOAD CALL ! 13014: JSR CDWRD GENERATE IT ! 13015: MOV XR,WA COPY VRBLK POINTER ! 13016: JSR CDWRD GENERATE VRBLK POINTER ! 13017: EJC ! 13018: * ! 13019: * CDGNM (CONTINUED) ! 13020: * ! 13021: * HERE TO EXIT WITH WC SET CORRECTLY ! 13022: * ! 13023: CGN03 MOV (XS)+,WB RESTORE ENTRY WB ! 13024: MOV (XS)+,XL RESTORE ENTRY XL ! 13025: EXI RETURN TO CDGNM CALLER ! 13026: * ! 13027: * HERE FOR CMBLK ! 13028: * ! 13029: CGN04 MOV XR,XL COPY CMBLK POINTER ! 13030: MOV CMTYP(XR),XR LOAD CMBLK TYPE ! 13031: BGE XR,=C$$NM,CGN01 ERROR IF NOT NAME OPERAND ! 13032: BSW XR,C$$NM ELSE SWITCH ON TYPE ! 13033: IFF C$ARR,CGN05 ARRAY REFERENCE ! 13034: IFF C$FNC,CGN08 FUNCTION CALL ! 13035: IFF C$DEF,CGN09 DEFERRED EXPRESSION ! 13036: IFF C$IND,CGN10 INDIRECT REFERENCE ! 13037: IFF C$KEY,CGN11 KEYWORD REFERENCE ! 13038: IFF C$UBO,CGN08 UNDEFINED BINARY OP ! 13039: IFF C$UUO,CGN08 UNDEFINED UNARY OP ! 13040: ESW END SWITCH ON CMBLK TYPE ! 13041: * ! 13042: * HERE TO GENERATE CODE FOR ARRAY REFERENCE ! 13043: * ! 13044: CGN05 MOV *CMOPN,WB POINT TO ARRAY OPERAND ! 13045: * ! 13046: * LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS ! 13047: * ! 13048: CGN06 JSR CMGEN GENERATE CODE FOR NEXT OPERAND ! 13049: MOV CMLEN(XL),WC LOAD LENGTH OF CMBLK ! 13050: BLT WB,WC,CGN06 LOOP TILL ALL GENERATED ! 13051: * ! 13052: * GENERATE APPROPRIATE ARRAY CALL ! 13053: * ! 13054: MOV =OAON$,WA LOAD ONE-SUBSCRIPT CASE CALL ! 13055: BEQ WC,*CMAR1,CGN07 JUMP TO EXIT IF ONE SUBSCRIPT CASE ! 13056: MOV =OAMN$,WA ELSE LOAD MULTI-SUBSCRIPT CASE CALL ! 13057: JSR CDWRD GENERATE CALL ! 13058: MOV WC,WA COPY CMBLK LENGTH ! 13059: BTW WA CONVERT TO WORDS ! 13060: SUB =CMVLS,WA CALCULATE NUMBER OF SUBSCRIPTS ! 13061: EJC ! 13062: * ! 13063: * CDGNM (CONTINUED) ! 13064: * ! 13065: * HERE TO EXIT GENERATING WORD (NON-CONSTANT) ! 13066: * ! 13067: CGN07 MNZ WC SET RESULT NON-CONSTANT ! 13068: JSR CDWRD GENERATE WORD ! 13069: BRN CGN03 BACK TO EXIT ! 13070: * ! 13071: * HERE TO GENERATE CODE FOR FUNCTIONS AND UNDEFINED OPRS ! 13072: * ! 13073: CGN08 MOV XL,XR COPY CMBLK POINTER ! 13074: JSR CDGVL GEN CODE BY VALUE FOR CALL ! 13075: MOV =OFNE$,WA GET EXTRA CALL FOR BY NAME ! 13076: BRN CGN07 BACK TO GENERATE AND EXIT ! 13077: * ! 13078: * HERE TO GENERATE CODE FOR DEFERED EXPRESSION ! 13079: * ! 13080: CGN09 MOV CMROP(XL),XR CHECK IF VARIABLE ! 13081: BHI (XR),=B$VR$,CGN02 TREAT *VARIABLE AS SIMPLE VAR ! 13082: MOV XR,XL COPY PTR TO EXPRESSION TREE ! 13083: JSR CDGEX ELSE BUILD EXBLK ! 13084: MOV =OLEX$,WA SET CALL TO LOAD EXPR BY NAME ! 13085: JSR CDWRD GENERATE IT ! 13086: MOV XR,WA COPY EXBLK POINTER ! 13087: JSR CDWRD GENERATE EXBLK POINTER ! 13088: BRN CGN03 BACK TO EXIT ! 13089: * ! 13090: * HERE TO GENERATE CODE FOR INDIRECT REFERENCE ! 13091: * ! 13092: CGN10 MOV CMROP(XL),XR GET OPERAND ! 13093: JSR CDGVL GENERATE CODE BY VALUE FOR IT ! 13094: MOV =OINN$,WA LOAD CALL FOR INDIRECT BY NAME ! 13095: BRN CGN12 MERGE ! 13096: * ! 13097: * HERE TO GENERATE CODE FOR KEYWORD REFERENCE ! 13098: * ! 13099: CGN11 MOV CMROP(XL),XR GET OPERAND ! 13100: JSR CDGNM GENERATE CODE BY NAME FOR IT ! 13101: MOV =OKWN$,WA LOAD CALL FOR KEYWORD BY NAME ! 13102: * ! 13103: * KEYWORD, INDIRECT MERGE HERE ! 13104: * ! 13105: CGN12 JSR CDWRD GENERATE CODE FOR OPERATOR ! 13106: BRN CGN03 EXIT ! 13107: ENP END PROCEDURE CDGNM ! 13108: EJC ! 13109: * ! 13110: * CDGVL -- GENERATE CODE BY VALUE ! 13111: * ! 13112: * CDGVL IS CALLED DURING THE COMPILATION PROCESS TO ! 13113: * GENERATE CODE BY VALUE FOR AN EXPRESSION. SEE CDBLK ! 13114: * DESCRIPTION FOR DETAILS OF THE CODE GENERATED. THE INPUT ! 13115: * TO CDGVL IS AN EXPRESSION TREE AS GENERATED BY EXPAN. ! 13116: * ! 13117: * CDGVL IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING ! 13118: * RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS. ! 13119: * ! 13120: * (WB) INTEGER IN RANGE 0 LE N LE DNAMB ! 13121: * (XR) PTR TO TREE GENERATED BY EXPAN ! 13122: * (WC) CONSTANT FLAG (SEE BELOW) ! 13123: * JSR CDGVL CALL TO GENERATE CODE BY VALUE ! 13124: * (XR,WA) DESTROYED ! 13125: * (WC) SET NON-ZERO IF NON-CONSTANT ! 13126: * ! 13127: * WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE ! 13128: * EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE ! 13129: * EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED. ! 13130: * ! 13131: * IF WC IS NON-ZERO ON ENTRY, THEN PREEVALUATION IS NOT ! 13132: * ALLOWED REGARDLESS OF THE NATURE OF THE OPERAND. ! 13133: * ! 13134: * THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD). ! 13135: * ! 13136: CDGVL PRC R,0 ENTRY POINT, RECURSIVE ! 13137: MOV (XR),WA LOAD TYPE WORD ! 13138: BEQ WA,=B$CMT,CGV01 JUMP IF CMBLK ! 13139: BLT WA,=B$VRA,CGV00 JUMP IF ICBLK, RCBLK, SCBLK ! 13140: BNZ VRLEN(XR),CGVL0 JUMP IF NOT SYSTEM VARIABLE ! 13141: MOV XR,-(XS) STACK XR ! 13142: MOV VRSVP(XR),XR POINT TO SVBLK ! 13143: MOV SVBIT(XR),WA GET SVBLK PROPERTY BITS ! 13144: MOV (XS)+,XR RECOVER XR ! 13145: ANB BTCKW,WA CHECK IF CONSTANT KEYWORD ! 13146: NZB WA,CGV00 JUMP IF CONSTANT KEYWORD ! 13147: * ! 13148: * HERE FOR VARIABLE VALUE REFERENCE ! 13149: * ! 13150: CGVL0 MNZ WC INDICATE NON-CONSTANT VALUE ! 13151: * ! 13152: * MERGE HERE FOR SIMPLE CONSTANT (ICBLK,RCBLK,SCBLK) ! 13153: * AND FOR VARIABLES CORRESPONDING TO CONSTANT KEYWORDS. ! 13154: * ! 13155: CGV00 MOV XR,WA COPY PTR TO VAR OR CONSTANT ! 13156: JSR CDWRD GENERATE AS CODE WORD ! 13157: EXI RETURN TO CALLER ! 13158: EJC ! 13159: * ! 13160: * CDGVL (CONTINUED) ! 13161: * ! 13162: * HERE FOR TREE NODE (CMBLK) ! 13163: * ! 13164: CGV01 MOV WB,-(XS) SAVE ENTRY WB ! 13165: MOV XL,-(XS) SAVE ENTRY XL ! 13166: MOV WC,-(XS) SAVE ENTRY CONSTANT FLAG ! 13167: MOV CWCOF,-(XS) SAVE INITIAL CODE OFFSET ! 13168: CHK CHECK FOR STACK OVERFLOW ! 13169: * ! 13170: * PREPARE TO GENERATE CODE FOR CMBLK. WC IS SET TO THE ! 13171: * VALUE OF CSWNO (ZERO IF -OPTIMISE, 1 IF -NOOPT) TO ! 13172: * START WITH AND IS RESET NON-ZERO FOR ANY NON-CONSTANT ! 13173: * CODE GENERATED. IF IT IS STILL ZERO AFTER GENERATING ALL ! 13174: * THE CMBLK CODE, THEN ITS VALUE IS COMPUTED AS THE RESULT. ! 13175: * ! 13176: MOV XR,XL COPY CMBLK POINTER ! 13177: MOV CMTYP(XR),XR LOAD CMBLK TYPE ! 13178: MOV CSWNO,WC RESET CONSTANT FLAG ! 13179: BLE XR,=C$PR$,CGV02 JUMP IF NOT PREDICATE VALUE ! 13180: MNZ WC ELSE FORCE NON-CONSTANT CASE ! 13181: * ! 13182: * HERE WITH WC SET APPROPRIATELY ! 13183: * ! 13184: CGV02 BSW XR,C$$NV SWITCH TO APPROPRIATE GENERATOR ! 13185: IFF C$ARR,CGV03 ARRAY REFERENCE ! 13186: IFF C$FNC,CGV05 FUNCTION CALL ! 13187: IFF C$DEF,CGV14 DEFERRED EXPRESSION ! 13188: IFF C$SEL,CGV15 SELECTION ! 13189: IFF C$IND,CGV31 INDIRECT REFERENCE ! 13190: IFF C$KEY,CGV27 KEYWORD REFERENCE ! 13191: IFF C$UBO,CGV29 UNDEFINED BINOP ! 13192: IFF C$UUO,CGV30 UNDEFINED UNOP ! 13193: IFF C$BVL,CGV18 BINOPS WITH VAL OPDS ! 13194: IFF C$ALT,CGV18 ALTERNATION ! 13195: IFF C$UVL,CGV19 UNOPS WITH VALU OPND ! 13196: IFF C$ASS,CGV21 ASSIGNMENT ! 13197: IFF C$CNC,CGV24 CONCATENATION ! 13198: IFF C$CNP,CGV24 CONCATENATION (NOT PATTERN MATCH) ! 13199: IFF C$UNM,CGV27 UNOPS WITH NAME OPND ! 13200: IFF C$BVN,CGV26 BINARY $ AND . ! 13201: IFF C$INT,CGV31 INTERROGATION ! 13202: IFF C$NEG,CGV28 NEGATION ! 13203: IFF C$PMT,CGV18 PATTERN MATCH ! 13204: ESW END SWITCH ON CMBLK TYPE ! 13205: EJC ! 13206: * ! 13207: * CDGVL (CONTINUED) ! 13208: * ! 13209: * HERE TO GENERATE CODE FOR ARRAY REFERENCE ! 13210: * ! 13211: CGV03 MOV *CMOPN,WB SET OFFSET TO ARRAY OPERAND ! 13212: * ! 13213: * LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS ! 13214: * ! 13215: CGV04 JSR CMGEN GEN VALUE CODE FOR NEXT OPERAND ! 13216: MOV CMLEN(XL),WC LOAD CMBLK LENGTH ! 13217: BLT WB,WC,CGV04 LOOP BACK IF MORE TO GO ! 13218: * ! 13219: * GENERATE CALL TO APPROPRIATE ARRAY REFERENCE ROUTINE ! 13220: * ! 13221: MOV =OAOV$,WA SET ONE SUBSCRIPT CALL IN CASE ! 13222: BEQ WC,*CMAR1,CGV32 JUMP TO EXIT IF 1-SUB CASE ! 13223: MOV =OAMV$,WA ELSE SET CALL FOR MULTI-SUBSCRIPTS ! 13224: JSR CDWRD GENERATE CALL ! 13225: MOV WC,WA COPY LENGTH OF CMBLK ! 13226: SUB *CMVLS,WA SUBTRACT STANDARD LENGTH ! 13227: BTW WA GET NUMBER OF WORDS ! 13228: BRN CGV32 JUMP TO GENERATE SUBSCRIPT COUNT ! 13229: * ! 13230: * HERE TO GENERATE CODE FOR FUNCTION CALL ! 13231: * ! 13232: CGV05 MOV *CMVLS,WB SET OFFSET TO FIRST ARGUMENT ! 13233: * ! 13234: * LOOP TO GENERATE CODE FOR ARGUMENTS ! 13235: * ! 13236: CGV06 BEQ WB,CMLEN(XL),CGV07 JUMP IF ALL GENERATED ! 13237: JSR CMGEN ELSE GEN VALUE CODE FOR NEXT ARG ! 13238: BRN CGV06 BACK TO GENERATE NEXT ARGUMENT ! 13239: * ! 13240: * HERE TO GENERATE ACTUAL FUNCTION CALL ! 13241: * ! 13242: CGV07 SUB *CMVLS,WB GET NUMBER OF ARG PTRS (BYTES) ! 13243: BTW WB CONVERT BYTES TO WORDS ! 13244: MOV CMOPN(XL),XR LOAD FUNCTION VRBLK POINTER ! 13245: BNZ VRLEN(XR),CGV12 JUMP IF NOT SYSTEM FUNCTION ! 13246: MOV VRSVP(XR),XL LOAD SVBLK PTR IF SYSTEM VAR ! 13247: MOV SVBIT(XL),WA LOAD BIT MASK ! 13248: ANB BTFFC,WA TEST FOR FAST FUNCTION CALL ALLOWED ! 13249: ZRB WA,CGV12 JUMP IF NOT ! 13250: EJC ! 13251: * ! 13252: * CDGVL (CONTINUED) ! 13253: * ! 13254: * HERE IF FAST FUNCTION CALL IS ALLOWED ! 13255: * ! 13256: MOV SVBIT(XL),WA RELOAD BIT INDICATORS ! 13257: ANB BTPRE,WA TEST FOR PREEVALUATION OK ! 13258: NZB WA,CGV08 JUMP IF PREEVALUATION PERMITTED ! 13259: MNZ WC ELSE SET RESULT NON-CONSTANT ! 13260: * ! 13261: * TEST FOR CORRECT NUMBER OF ARGS FOR FAST CALL ! 13262: * ! 13263: CGV08 MOV VRFNC(XR),XL LOAD PTR TO SVFNC FIELD ! 13264: MOV FARGS(XL),WA LOAD SVNAR FIELD VALUE ! 13265: BEQ WA,WB,CGV11 JUMP IF ARGUMENT COUNT IS CORRECT ! 13266: BHI WA,WB,CGV09 JUMP IF TOO FEW ARGUMENTS GIVEN ! 13267: * ! 13268: * HERE IF TOO MANY ARGUMENTS, PREPARE TO GENERATE O$POPS ! 13269: * ! 13270: SUB WA,WB GET NUMBER OF EXTRA ARGS ! 13271: LCT WB,WB SET AS COUNT TO CONTROL LOOP ! 13272: MOV =OPOP$,WA SET POP CALL ! 13273: BRN CGV10 JUMP TO COMMON LOOP ! 13274: * ! 13275: * HERE IF TOO FEW ARGUMENTS, PREPARE TO GENERATE NULLS ! 13276: * ! 13277: CGV09 SUB WB,WA GET NUMBER OF MISSING ARGUMENTS ! 13278: LCT WB,WA LOAD AS COUNT TO CONTROL LOOP ! 13279: MOV =NULLS,WA LOAD PTR TO NULL CONSTANT ! 13280: * ! 13281: * LOOP TO GENERATE CALLS TO FIX ARGUMENT COUNT ! 13282: * ! 13283: CGV10 JSR CDWRD GENERATE ONE CALL ! 13284: BCT WB,CGV10 LOOP TILL ALL GENERATED ! 13285: * ! 13286: * HERE AFTER ADJUSTING ARG COUNT AS REQUIRED ! 13287: * ! 13288: CGV11 MOV XL,WA COPY POINTER TO SVFNC FIELD ! 13289: BRN CGV36 JUMP TO GENERATE CALL ! 13290: EJC ! 13291: * ! 13292: * CDGVL (CONTINUED) ! 13293: * ! 13294: * COME HERE IF FAST CALL IS NOT PERMITTED ! 13295: * ! 13296: CGV12 MOV =OFNS$,WA SET ONE ARG CALL IN CASE ! 13297: BEQ WB,=NUM01,CGV13 JUMP IF ONE ARG CASE ! 13298: MOV =OFNC$,WA ELSE LOAD CALL FOR MORE THAN 1 ARG ! 13299: JSR CDWRD GENERATE IT ! 13300: MOV WB,WA COPY ARGUMENT COUNT ! 13301: * ! 13302: * ONE ARG CASE MERGES HERE ! 13303: * ! 13304: CGV13 JSR CDWRD GENERATE =O$FNS OR ARG COUNT ! 13305: MOV XR,WA COPY VRBLK POINTER ! 13306: BRN CGV32 JUMP TO GENERATE VRBLK PTR ! 13307: * ! 13308: * HERE FOR DEFERRED EXPRESSION ! 13309: * ! 13310: CGV14 MOV CMROP(XL),XL POINT TO EXPRESSION TREE ! 13311: JSR CDGEX BUILD EXBLK OR SEBLK ! 13312: MOV XR,WA COPY BLOCK PTR ! 13313: JSR CDWRD GENERATE PTR TO EXBLK OR SEBLK ! 13314: BRN CGV34 JUMP TO EXIT, CONSTANT TEST ! 13315: * ! 13316: * HERE TO GENERATE CODE FOR SELECTION ! 13317: * ! 13318: CGV15 ZER -(XS) ZERO PTR TO CHAIN OF FORWARD JUMPS ! 13319: ZER -(XS) ZERO PTR TO PREV O$SLC FORWARD PTR ! 13320: MOV *CMVLS,WB POINT TO FIRST ALTERNATIVE ! 13321: MOV =OSLA$,WA SET INITIAL CODE WORD ! 13322: * ! 13323: * 0(XS) IS THE OFFSET TO THE PREVIOUS WORD ! 13324: * WHICH REQUIRES FILLING IN WITH AN ! 13325: * OFFSET TO THE FOLLOWING O$SLC,O$SLD ! 13326: * ! 13327: * 1(XS) IS THE HEAD OF A CHAIN OF OFFSET ! 13328: * POINTERS INDICATING THOSE LOCATIONS ! 13329: * TO BE FILLED WITH OFFSETS PAST ! 13330: * THE END OF ALL THE ALTERNATIVES ! 13331: * ! 13332: CGV16 JSR CDWRD GENERATE O$SLC (O$SLA FIRST TIME) ! 13333: MOV CWCOF,(XS) SET CURRENT LOC AS PTR TO FILL IN ! 13334: JSR CDWRD GENERATE GARBAGE WORD THERE FOR NOW ! 13335: JSR CMGEN GEN VALUE CODE FOR ALTERNATIVE ! 13336: MOV =OSLB$,WA LOAD O$SLB POINTER ! 13337: JSR CDWRD GENERATE O$SLB CALL ! 13338: MOV 1(XS),WA LOAD OLD CHAIN PTR ! 13339: MOV CWCOF,1(XS) SET CURRENT LOC AS NEW CHAIN HEAD ! 13340: JSR CDWRD GENERATE FORWARD CHAIN LINK ! 13341: EJC ! 13342: * ! 13343: * CDGVL (CONTINUED) ! 13344: * ! 13345: * NOW TO FILL IN THE SKIP OFFSET TO O$SLC,O$SLD ! 13346: * ! 13347: MOV (XS),XR LOAD OFFSET TO WORD TO PLUG ! 13348: ADD R$CCB,XR POINT TO ACTUAL LOCATION TO PLUG ! 13349: MOV CWCOF,(XR) PLUG PROPER OFFSET IN ! 13350: MOV =OSLC$,WA LOAD O$SLC PTR FOR NEXT ALTERNATIVE ! 13351: MOV WB,XR COPY OFFSET (DESTROY GARBAGE XR) ! 13352: ICA XR BUMP EXTRA TIME FOR TEST ! 13353: BLT XR,CMLEN(XL),CGV16 LOOP BACK IF NOT LAST ALTERNATIVE ! 13354: * ! 13355: * HERE TO GENERATE CODE FOR LAST ALTERNATIVE ! 13356: * ! 13357: MOV =OSLD$,WA GET HEADER CALL ! 13358: JSR CDWRD GENERATE O$SLD CALL ! 13359: JSR CMGEN GENERATE CODE FOR LAST ALTERNATIVE ! 13360: ICA XS POP OFFSET PTR ! 13361: MOV (XS)+,XR LOAD CHAIN PTR ! 13362: * ! 13363: * LOOP TO PLUG OFFSETS PAST STRUCTURE ! 13364: * ! 13365: CGV17 ADD R$CCB,XR MAKE NEXT PTR ABSOLUTE ! 13366: MOV (XR),WA LOAD FORWARD PTR ! 13367: MOV CWCOF,(XR) PLUG REQUIRED OFFSET ! 13368: MOV WA,XR COPY FORWARD PTR ! 13369: BNZ WA,CGV17 LOOP BACK IF MORE TO GO ! 13370: BRN CGV33 ELSE JUMP TO EXIT (NOT CONSTANT) ! 13371: * ! 13372: * HERE FOR BINARY OPS WITH VALUE OPERANDS ! 13373: * ! 13374: CGV18 MOV CMLOP(XL),XR LOAD LEFT OPERAND POINTER ! 13375: JSR CDGVL GEN VALUE CODE FOR LEFT OPERAND ! 13376: * ! 13377: * HERE FOR UNARY OPS WITH VALUE OPERAND (BINOPS MERGE) ! 13378: * ! 13379: CGV19 MOV CMROP(XL),XR LOAD RIGHT (ONLY) OPERAND PTR ! 13380: JSR CDGVL GEN CODE BY VALUE ! 13381: EJC ! 13382: * ! 13383: * CDGVL (CONTINUED) ! 13384: * ! 13385: * MERGE HERE TO GENERATE OPERATOR CALL FROM CMOPN FIELD ! 13386: * ! 13387: CGV20 MOV CMOPN(XL),WA LOAD OPERATOR CALL POINTER ! 13388: BRN CGV36 JUMP TO GENERATE IT WITH CONS TEST ! 13389: * ! 13390: * HERE FOR ASSIGNMENT ! 13391: * ! 13392: CGV21 MOV CMLOP(XL),XR LOAD LEFT OPERAND POINTER ! 13393: BLO (XR),=B$VR$,CGV22 JUMP IF NOT VARIABLE ! 13394: * ! 13395: * HERE FOR ASSIGNMENT TO SIMPLE VARIABLE ! 13396: * ! 13397: MOV CMROP(XL),XR LOAD RIGHT OPERAND PTR ! 13398: JSR CDGVL GENERATE CODE BY VALUE ! 13399: MOV CMLOP(XL),WA RELOAD LEFT OPERAND VRBLK PTR ! 13400: ADD *VRSTO,WA POINT TO VRSTO FIELD ! 13401: BRN CGV32 JUMP TO GENERATE STORE PTR ! 13402: * ! 13403: * HERE IF NOT SIMPLE VARIABLE ASSIGNMENT ! 13404: * ! 13405: CGV22 JSR EXPAP TEST FOR PATTERN MATCH ON LEFT SIDE ! 13406: PPM CGV23 JUMP IF NOT PATTERN MATCH ! 13407: * ! 13408: * HERE FOR PATTERN REPLACEMENT ! 13409: * ! 13410: MOV CMROP(XR),CMLOP(XL) SAVE PATTERN PTR IN SAFE PLACE ! 13411: MOV CMLOP(XR),XR LOAD SUBJECT PTR ! 13412: JSR CDGNM GEN CODE BY NAME FOR SUBJECT ! 13413: MOV CMLOP(XL),XR LOAD PATTERN PTR ! 13414: JSR CDGVL GEN CODE BY VALUE FOR PATTERN ! 13415: MOV =OPMN$,WA LOAD MATCH BY NAME CALL ! 13416: JSR CDWRD GENERATE IT ! 13417: MOV CMROP(XL),XR LOAD REPLACEMENT VALUE PTR ! 13418: JSR CDGVL GEN CODE BY VALUE ! 13419: MOV =ORPL$,WA LOAD REPLACE CALL ! 13420: BRN CGV32 JUMP TO GEN AND EXIT (NOT CONSTANT) ! 13421: * ! 13422: * HERE FOR ASSIGNMENT TO COMPLEX VARIABLE ! 13423: * ! 13424: CGV23 MNZ WC INHIBIT PRE-EVALUATION ! 13425: JSR CDGNM GEN CODE BY NAME FOR LEFT SIDE ! 13426: BRN CGV31 MERGE WITH UNOP CIRCUIT ! 13427: EJC ! 13428: * ! 13429: * CDGVL (CONTINUED) ! 13430: * ! 13431: * HERE FOR CONCATENATION ! 13432: * ! 13433: CGV24 MOV CMLOP(XL),XR LOAD LEFT OPERAND PTR ! 13434: BNE (XR),=B$CMT,CGV18 ORDINARY BINOP IF NOT CMBLK ! 13435: MOV CMTYP(XR),WB LOAD CMBLK TYPE CODE ! 13436: BEQ WB,=C$INT,CGV25 SPECIAL CASE IF INTERROGATION ! 13437: BEQ WB,=C$NEG,CGV25 OR NEGATION ! 13438: BNE WB,=C$FNC,CGV18 ELSE ORDINARY BINOP IF NOT FUNCTION ! 13439: MOV CMOPN(XR),XR ELSE LOAD FUNCTION VRBLK PTR ! 13440: BNZ VRLEN(XR),CGV18 ORDINARY BINOP IF NOT SYSTEM VAR ! 13441: MOV VRSVP(XR),XR ELSE POINT TO SVBLK ! 13442: MOV SVBIT(XR),WA LOAD BIT INDICATORS ! 13443: ANB BTPRD,WA TEST FOR PREDICATE FUNCTION ! 13444: ZRB WA,CGV18 ORDINARY BINOP IF NOT ! 13445: * ! 13446: * HERE IF LEFT ARG OF CONCATENATION IS PREDICATE FUNCTION ! 13447: * ! 13448: CGV25 MOV CMLOP(XL),XR RELOAD LEFT ARG ! 13449: JSR CDGVL GEN CODE BY VALUE ! 13450: MOV =OPOP$,WA LOAD POP CALL ! 13451: JSR CDWRD GENERATE IT ! 13452: MOV CMROP(XL),XR LOAD RIGHT OPERAND ! 13453: JSR CDGVL GEN CODE BY VALUE AS RESULT CODE ! 13454: BRN CGV33 EXIT (NOT CONSTANT) ! 13455: * ! 13456: * HERE TO GENERATE CODE FOR PATTERN, IMMEDIATE ASSIGNMENT ! 13457: * ! 13458: CGV26 MOV CMLOP(XL),XR LOAD LEFT OPERAND ! 13459: JSR CDGVL GEN CODE BY VALUE, MERGE ! 13460: * ! 13461: * HERE FOR UNOPS WITH ARG BY NAME (BINARY $ . MERGE) ! 13462: * ! 13463: CGV27 MOV CMROP(XL),XR LOAD RIGHT OPERAND PTR ! 13464: JSR CDGNM GEN CODE BY NAME FOR RIGHT ARG ! 13465: MOV CMOPN(XL),XR GET OPERATOR CODE WORD ! 13466: BNE (XR),=O$KWV,CGV20 GEN CALL UNLESS KEYWORD VALUE ! 13467: EJC ! 13468: * ! 13469: * CDGVL (CONTINUED) ! 13470: * ! 13471: * HERE FOR KEYWORD BY VALUE. THIS IS CONSTANT ONLY IF ! 13472: * THE OPERAND IS ONE OF THE SPECIAL SYSTEM VARIABLES WITH ! 13473: * THE SVCKW BIT SET TO INDICATE A CONSTANT KEYWORD VALUE. ! 13474: * NOTE THAT THE ONLY CONSTANT OPERAND BY NAME IS A VARIABLE ! 13475: * ! 13476: BNZ WC,CGV20 GEN CALL IF NON-CONSTANT (NOT VAR) ! 13477: MNZ WC ELSE SET NON-CONSTANT IN CASE ! 13478: MOV CMROP(XL),XR LOAD PTR TO OPERAND VRBLK ! 13479: BNZ VRLEN(XR),CGV20 GEN (NON-CONSTANT) IF NOT SYS VAR ! 13480: MOV VRSVP(XR),XR ELSE LOAD PTR TO SVBLK ! 13481: MOV SVBIT(XR),WA LOAD BIT MASK ! 13482: ANB BTCKW,WA TEST FOR CONSTANT KEYWORD ! 13483: ZRB WA,CGV20 GO GEN IF NOT CONSTANT ! 13484: ZER WC ELSE SET RESULT CONSTANT ! 13485: BRN CGV20 AND JUMP BACK TO GENERATE CALL ! 13486: * ! 13487: * HERE TO GENERATE CODE FOR NEGATION ! 13488: * ! 13489: CGV28 MOV =ONTA$,WA GET INITIAL WORD ! 13490: JSR CDWRD GENERATE IT ! 13491: MOV CWCOF,WB SAVE NEXT OFFSET ! 13492: JSR CDWRD GENERATE GUNK WORD FOR NOW ! 13493: MOV CMROP(XL),XR LOAD RIGHT OPERAND PTR ! 13494: JSR CDGVL GEN CODE BY VALUE ! 13495: MOV =ONTB$,WA LOAD END OF EVALUATION CALL ! 13496: JSR CDWRD GENERATE IT ! 13497: MOV WB,XR COPY OFFSET TO WORD TO PLUG ! 13498: ADD R$CCB,XR POINT TO ACTUAL WORD TO PLUG ! 13499: MOV CWCOF,(XR) PLUG WORD WITH CURRENT OFFSET ! 13500: MOV =ONTC$,WA LOAD FINAL CALL ! 13501: BRN CGV32 JUMP TO GENERATE IT (NOT CONSTANT) ! 13502: * ! 13503: * HERE TO GENERATE CODE FOR UNDEFINED BINARY OPERATOR ! 13504: * ! 13505: CGV29 MOV CMLOP(XL),XR LOAD LEFT OPERAND PTR ! 13506: JSR CDGVL GENERATE CODE BY VALUE ! 13507: EJC ! 13508: * ! 13509: * CDGVL (CONTINUED) ! 13510: * ! 13511: * HERE TO GENERATE CODE FOR UNDEFINED UNARY OPERATOR ! 13512: * ! 13513: CGV30 MOV =C$UO$,WB SET UNOP CODE + 1 ! 13514: SUB CMTYP(XL),WB SET NUMBER OF ARGS (1 OR 2) ! 13515: * ! 13516: * MERGE HERE FOR UNDEFINED OPERATORS ! 13517: * ! 13518: MOV CMROP(XL),XR LOAD RIGHT (ONLY) OPERAND POINTER ! 13519: JSR CDGVL GEN VALUE CODE FOR RIGHT OPERAND ! 13520: MOV CMOPN(XL),XR LOAD POINTER TO OPERATOR DV ! 13521: MOV DVOPN(XR),XR LOAD POINTER OFFSET ! 13522: WTB XR CONVERT WORD OFFSET TO BYTES ! 13523: ADD =R$UBA,XR POINT TO PROPER FUNCTION PTR ! 13524: SUB *VRFNC,XR SET STANDARD FUNCTION OFFSET ! 13525: BRN CGV12 MERGE WITH FUNCTION CALL CIRCUIT ! 13526: * ! 13527: * HERE TO GENERATE CODE FOR INTERROGATION, INDIRECTION ! 13528: * ! 13529: CGV31 MNZ WC SET NON CONSTANT ! 13530: BRN CGV19 MERGE ! 13531: * ! 13532: * HERE TO EXIT GENERATING A WORD, RESULT NOT CONSTANT ! 13533: * ! 13534: CGV32 JSR CDWRD GENERATE WORD, MERGE ! 13535: * ! 13536: * HERE TO EXIT WITH NO WORD GENERATED, NOT CONSTANT ! 13537: * ! 13538: CGV33 MNZ WC INDICATE RESULT IS NOT CONSTANT ! 13539: * ! 13540: * COMMON EXIT POINT ! 13541: * ! 13542: CGV34 ICA XS POP INITIAL CODE OFFSET ! 13543: MOV (XS)+,WA RESTORE OLD CONSTANT FLAG ! 13544: MOV (XS)+,XL RESTORE ENTRY XL ! 13545: MOV (XS)+,WB RESTORE ENTRY WB ! 13546: BNZ WC,CGV35 JUMP IF NOT CONSTANT ! 13547: MOV WA,WC ELSE RESTORE ENTRY CONSTANT FLAG ! 13548: * ! 13549: * HERE TO RETURN AFTER DEALING WITH WC SETTING ! 13550: * ! 13551: CGV35 EXI RETURN TO CDGVL CALLER ! 13552: * ! 13553: * EXIT HERE TO GENERATE WORD AND TEST FOR CONSTANT ! 13554: * ! 13555: CGV36 JSR CDWRD GENERATE WORD ! 13556: BNZ WC,CGV34 JUMP TO EXIT IF NOT CONSTANT ! 13557: EJC ! 13558: * ! 13559: * CDGVL (CONTINUED) ! 13560: * ! 13561: * HERE TO PREEVALUATE CONSTANT SUB-EXPRESSION ! 13562: * ! 13563: MOV =ORVL$,WA LOAD CALL TO RETURN VALUE ! 13564: JSR CDWRD GENERATE IT ! 13565: MOV (XS),XL LOAD INITIAL CODE OFFSET ! 13566: JSR EXBLD BUILD EXBLK FOR EXPRESSION ! 13567: ZER WB SET TO EVALUATE BY VALUE ! 13568: JSR EVALX EVALUATE EXPRESSION ! 13569: PPM SHOULD NOT FAIL ! 13570: MOV (XR),WA LOAD TYPE WORD OF RESULT ! 13571: BLO WA,=P$AAA,CGV37 JUMP IF NOT PATTERN ! 13572: MOV =OLPT$,WA ELSE LOAD SPECIAL PATTERN LOAD CALL ! 13573: JSR CDWRD GENERATE IT ! 13574: * ! 13575: * MERGE HERE TO GENERATE POINTER TO RESULTING CONSTANT ! 13576: * ! 13577: CGV37 MOV XR,WA COPY CONSTANT POINTER ! 13578: JSR CDWRD GENERATE PTR ! 13579: ZER WC SET RESULT CONSTANT ! 13580: BRN CGV34 JUMP BACK TO EXIT ! 13581: ENP END PROCEDURE CDGVL ! 13582: EJC ! 13583: * ! 13584: * CDWRD -- GENERATE ONE WORD OF CODE ! 13585: * ! 13586: * CDWRD WRITES ONE WORD INTO THE CURRENT CODE BLOCK UNDER ! 13587: * CONSTRUCTION. A NEW, LARGER, BLOCK IS ALLOCATED IF THERE ! 13588: * IS INSUFFICIENT ROOM IN THE CURRENT BLOCK. CDWRD ENSURES ! 13589: * THAT THERE ARE AT LEAST THREE WORDS LEFT IN THE BLOCK ! 13590: * AFTER ENTERING THE NEW WORD. THIS GUARANTEES THAT ANY ! 13591: * EXTRA SPACE AT THE END CAN BE SPLIT OFF AS A CCBLK. ! 13592: * ! 13593: * (WA) WORD TO BE GENERATED ! 13594: * JSR CDWRD CALL TO GENERATE WORD ! 13595: * ! 13596: CDWRD PRC E,0 ENTRY POINT ! 13597: MOV XR,-(XS) SAVE ENTRY XR ! 13598: MOV WA,-(XS) SAVE CODE WORD TO BE GENERATED ! 13599: * ! 13600: * MERGE BACK HERE AFTER ALLOCATING LARGER BLOCK ! 13601: * ! 13602: CDWD1 MOV R$CCB,XR LOAD PTR TO CCBLK BEING BUILT ! 13603: BNZ XR,CDWD2 JUMP IF BLOCK ALLOCATED ! 13604: * ! 13605: * HERE WE ALLOCATE AN ENTIRELY FRESH BLOCK ! 13606: * ! 13607: MOV *E$CBS,WA LOAD INITIAL LENGTH ! 13608: JSR ALLOC ALLOCATE CCBLK ! 13609: MOV =B$CCT,(XR) STORE TYPE WORD ! 13610: MOV *CCCOD,CWCOF SET INITIAL OFFSET ! 13611: MOV WA,CCLEN(XR) STORE BLOCK LENGTH ! 13612: MOV XR,R$CCB STORE PTR TO NEW BLOCK ! 13613: * ! 13614: * HERE WE HAVE A BLOCK WE CAN USE ! 13615: * ! 13616: CDWD2 MOV CWCOF,WA LOAD CURRENT OFFSET ! 13617: ADD *NUM04,WA ADJUST FOR TEST (FOUR WORDS) ! 13618: BLO WA,CCLEN(XR),CDWD4 JUMP IF ROOM IN THIS BLOCK ! 13619: * ! 13620: * HERE IF NO ROOM IN CURRENT BLOCK ! 13621: * ! 13622: BGE WA,MXLEN,CDWD5 JUMP IF ALREADY AT MAX SIZE ! 13623: ADD *E$CBS,WA ELSE GET NEW SIZE ! 13624: MOV XL,-(XS) SAVE ENTRY XL ! 13625: MOV XR,XL COPY POINTER ! 13626: BLT WA,MXLEN,CDWD3 JUMP IF NOT TOO LARGE ! 13627: MOV MXLEN,WA ELSE RESET TO MAX ALLOWED SIZE ! 13628: EJC ! 13629: * ! 13630: * CDWRD (CONTINUED) ! 13631: * ! 13632: * HERE WITH NEW BLOCK SIZE IN WA ! 13633: * ! 13634: CDWD3 JSR ALLOC ALLOCATE NEW BLOCK ! 13635: MOV XR,R$CCB STORE POINTER TO NEW BLOCK ! 13636: MOV =B$CCT,(XR)+ STORE TYPE WORD IN NEW BLOCK ! 13637: MOV WA,(XR)+ STORE BLOCK LENGTH ! 13638: ADD *CCUSE,XL POINT TO CCUSE,CCCOD FIELDS IN OLD ! 13639: MOV (XL),WA LOAD CCUSE VALUE ! 13640: MVW COPY USEFUL WORDS FROM OLD BLOCK ! 13641: MOV (XS)+,XL RESTORE XL ! 13642: BRN CDWD1 MERGE BACK TO TRY AGAIN ! 13643: * ! 13644: * HERE WITH ROOM IN CURRENT BLOCK ! 13645: * ! 13646: CDWD4 MOV CWCOF,WA LOAD CURRENT OFFSET ! 13647: ICA WA GET NEW OFFSET ! 13648: MOV WA,CWCOF STORE NEW OFFSET ! 13649: MOV WA,CCUSE(XR) STORE IN CCBLK FOR GBCOL ! 13650: DCA WA RESTORE PTR TO THIS WORD ! 13651: ADD WA,XR POINT TO CURRENT ENTRY ! 13652: MOV (XS)+,WA RELOAD WORD TO GENERATE ! 13653: MOV WA,(XR) STORE WORD IN BLOCK ! 13654: MOV (XS)+,XR RESTORE ENTRY XR ! 13655: EXI RETURN TO CALLER ! 13656: * ! 13657: * HERE IF COMPILED CODE IS TOO LONG FOR CDBLK ! 13658: * ! 13659: CDWD5 ERB 213,SYNTAX ERROR. STATEMENT IS TOO COMPLICATED. ! 13660: ENP END PROCEDURE CDWRD ! 13661: EJC ! 13662: * ! 13663: * CMGEN -- GENERATE CODE FOR CMBLK PTR ! 13664: * ! 13665: * CMGEN IS A SUBSIDIARY PROCEDURE USED TO GENERATE VALUE ! 13666: * CODE FOR A CMBLK PTR FROM THE MAIN CODE GENERATORS. ! 13667: * ! 13668: * (XL) CMBLK POINTER ! 13669: * (WB) OFFSET TO POINTER IN CMBLK ! 13670: * JSR CMGEN CALL TO GENERATE CODE ! 13671: * (XR,WA) DESTROYED ! 13672: * (WB) BUMPED BY ONE WORD ! 13673: * ! 13674: CMGEN PRC R,0 ENTRY POINT, RECURSIVE ! 13675: MOV XL,XR COPY CMBLK POINTER ! 13676: ADD WB,XR POINT TO CMBLK POINTER ! 13677: MOV (XR),XR LOAD CMBLK POINTER ! 13678: JSR CDGVL GENERATE CODE BY VALUE ! 13679: ICA WB BUMP OFFSET ! 13680: EXI RETURN TO CALLER ! 13681: ENP END PROCEDURE CMGEN ! 13682: EJC ! 13683: * ! 13684: * CMPIL (COMPILE SOURCE CODE) ! 13685: * ! 13686: * CMPIL IS USED TO CONVERT SNOBOL4 SOURCE CODE TO INTERNAL ! 13687: * FORM (SEE CDBLK FORMAT). IT IS USED BOTH FOR THE INITIAL ! 13688: * COMPILE AND AT RUN TIME BY THE CODE AND CONVERT FUNCTIONS ! 13689: * THIS PROCEDURE HAS CONTROL FOR THE ENTIRE DURATION OF ! 13690: * INITIAL COMPILATION. AN ERROR IN ANY PROCEDURE CALLED ! 13691: * DURING COMPILATION WILL LEAD FIRST TO THE ERROR SECTION ! 13692: * AND ULTIMATELY BACK HERE FOR RESUMED COMPILATION. THE ! 13693: * RE-ENTRY POINTS AFTER AN ERROR ARE SPECIALLY LABELLED - ! 13694: * ! 13695: * CMPCE RESUME AFTER CONTROL CARD ERROR ! 13696: * CMPLE RESUME AFTER LABEL ERROR ! 13697: * CMPSE RESUME AFTER STATEMENT ERROR ! 13698: * ! 13699: * JSR CMPIL CALL TO COMPILE CODE ! 13700: * (XR) PTR TO CDBLK FOR ENTRY STATEMENT ! 13701: * (XL,WA,WB,WC,RA) DESTROYED ! 13702: * ! 13703: * THE FOLLOWING GLOBAL VARIABLES ARE REFERENCED ! 13704: * ! 13705: * CMPSN NUMBER OF NEXT STATEMENT ! 13706: * TO BE COMPILED. ! 13707: * ! 13708: * CSWXX CONTROL CARD SWITCH VALUES ARE ! 13709: * CHANGED WHEN RELEVANT CONTROL ! 13710: * CARDS ARE MET. ! 13711: * ! 13712: * CWCOF OFFSET TO NEXT WORD IN CODE BLOCK ! 13713: * BEING BUILT (SEE CDWRD). ! 13714: * ! 13715: * LSTSN NUMBER OF STATEMENT MOST RECENTLY ! 13716: * COMPILED (INITIALLY SET TO ZERO). ! 13717: * ! 13718: * R$CIM CURRENT (INITIAL) COMPILER IMAGE ! 13719: * (ZERO FOR INITIAL COMPILE CALL) ! 13720: * ! 13721: * R$CNI USED TO POINT TO FOLLOWING IMAGE. ! 13722: * (SEE READR PROCEDURE). ! 13723: * ! 13724: * SCNGO GOTO SWITCH FOR SCANE PROCEDURE ! 13725: * ! 13726: * SCNIL LENGTH OF CURRENT IMAGE EXCLUDING ! 13727: * CHARACTERS REMOVED BY -INPUT. ! 13728: * ! 13729: * SCNPT CURRENT SCAN OFFSET, SEE SCANE. ! 13730: * ! 13731: * SCNRS RESCAN SWITCH FOR SCANE PROCEDURE. ! 13732: * ! 13733: * SCNSE OFFSET (IN R$CIM) OF MOST RECENTLY ! 13734: * SCANNED ELEMENT. SET ZERO IF NOT ! 13735: * CURRENTLY SCANNING ITEMS ! 13736: EJC ! 13737: * ! 13738: * CMPIL (CONTINUED) ! 13739: * ! 13740: * STAGE STGIC INITIAL COMPILE IN PROGRESS ! 13741: * STGXC CODE/CONVERT COMPILE ! 13742: * STGEV BUILDING EXBLK FOR EVAL ! 13743: * STGXT EXECUTE TIME (OUTSIDE COMPILE) ! 13744: * STGCE INITIAL COMPILE AFTER END LINE ! 13745: * STGXE EXECUTE COMPILE AFTER END LINE ! 13746: * ! 13747: * CMPIL ALSO USES A FIXED NUMBER OF LOCATIONS ON THE ! 13748: * MAIN STACK AS FOLLOWS. (THE DEFINITIONS OF THE ACTUAL ! 13749: * OFFSETS ARE IN THE DEFINITIONS SECTION). ! 13750: * ! 13751: * CMSTM(XS) POINTER TO EXPAN TREE FOR BODY OF ! 13752: * STATEMENT (SEE EXPAN PROCEDURE). ! 13753: * ! 13754: * CMSGO(XS) POINTER TO TREE REPRESENTATION OF ! 13755: * SUCCESS GOTO (SEE PROCEDURE SCNGO)9 ! 13756: * ZERO IF NO SUCCESS GOTO IS GIVEN ! 13757: * ! 13758: * CMFGO(XS) LIKE CMSGO FOR FAILURE GOTO. ! 13759: * ! 13760: * CMCGO(XS) SET NON-ZERO ONLY IF THERE IS A ! 13761: * CONDITIONAL GOTO. USED FOR -FAIL, ! 13762: * -NOFAIL CODE GENERATION. ! 13763: * ! 13764: * CMPCD(XS) POINTER TO CDBLK FOR PREVIOUS ! 13765: * STATEMENT. ZERO FOR 1ST STATEMENT. ! 13766: * ! 13767: * CMFFP(XS) SET NON-ZERO IF CDFAL IN PREVIOUS ! 13768: * CDBLK NEEDS FILLING WITH FORWARD ! 13769: * POINTER, ELSE SET TO ZERO. ! 13770: * ! 13771: * CMFFC(XS) SAME AS CMFFP FOR CURRENT CDBLK ! 13772: * ! 13773: * CMSOP(XS) OFFSET TO WORD IN PREVIOUS CDBLK ! 13774: * TO BE FILLED IN WITH FORWARD PTR ! 13775: * TO NEXT CDBLK FOR SUCCESS GOTO. ! 13776: * ZERO IF NO FILL IN IS REQUIRED. ! 13777: * ! 13778: * CMSOC(XS) SAME AS CMSOP FOR CURRENT CDBLK. ! 13779: * ! 13780: * CMLBL(XS) POINTER TO VRBLK FOR LABEL OF ! 13781: * CURRENT STATEMENT. ZERO IF NO LABEL ! 13782: * ! 13783: * CMTRA(XS) POINTER TO CDBLK FOR ENTRY STMNT. ! 13784: EJC ! 13785: * ! 13786: * CMPIL (CONTINUED) ! 13787: * ! 13788: * ENTRY POINT ! 13789: * ! 13790: CMPIL PRC E,0 ENTRY POINT ! 13791: LCT WB,=CMNEN SET NUMBER OF STACK WORK LOCATIONS ! 13792: * ! 13793: * LOOP TO INITIALIZE STACK WORKING LOCATIONS ! 13794: * ! 13795: CMP00 ZER -(XS) STORE A ZERO, MAKE ONE ENTRY ! 13796: BCT WB,CMP00 LOOP BACK UNTIL ALL SET ! 13797: MOV XS,CMPXS SAVE STACK POINTER FOR ERROR SEC ! 13798: SSS CMPSS SAVE S-R STACK POINTER IF ANY ! 13799: * ! 13800: * LOOP THROUGH STATEMENTS ! 13801: * ! 13802: CMP01 MOV SCNPT,WB SET SCAN POINTER OFFSET ! 13803: MOV WB,SCNSE SET START OF ELEMENT LOCATION ! 13804: MOV =OCER$,WA POINT TO COMPILE ERROR CALL ! 13805: JSR CDWRD GENERATE AS TEMPORARY CDFAL ! 13806: BLT WB,SCNIL,CMP04 JUMP IF CHARS LEFT ON THIS IMAGE ! 13807: * ! 13808: * LOOP HERE AFTER COMMENT OR CONTROL CARD ! 13809: * ALSO SPECIAL ENTRY AFTER CONTROL CARD ERROR ! 13810: * ! 13811: CMPCE ZER XR CLEAR POSSIBLE GARBAGE XR VALUE ! 13812: BNE STAGE,=STGIC,CMP02 SKIP UNLESS INITIAL COMPILE ! 13813: JSR READR READ NEXT INPUT IMAGE ! 13814: BZE XR,CMP09 JUMP IF NO INPUT AVAILABLE ! 13815: JSR NEXTS ACQUIRE NEXT SOURCE IMAGE ! 13816: MOV CMPSN,LSTSN STORE STMT NO FOR USE BY LISTR ! 13817: ZER SCNPT RESET SCAN POINTER ! 13818: BRN CMP04 GO PROCESS IMAGE ! 13819: * ! 13820: * FOR EXECUTE TIME COMPILE, PERMIT EMBEDDED CONTROL CARDS ! 13821: * AND COMMENTS (BY SKIPPING TO NEXT SEMI-COLON) ! 13822: * ! 13823: CMP02 MOV R$CIM,XR GET CURRENT IMAGE ! 13824: MOV SCNPT,WB GET CURRENT OFFSET ! 13825: PLC XR,WB PREPARE TO GET CHARS ! 13826: * ! 13827: * SKIP TO SEMI-COLON ! 13828: * ! 13829: CMP03 LCH WC,(XR)+ GET CHAR ! 13830: ICV SCNPT ADVANCE OFFSET ! 13831: BEQ WC,=CH$SM,CMP04 SKIP IF SEMI-COLON FOUND ! 13832: BLT SCNPT,SCNIL,CMP03 LOOP IF MORE CHARS ! 13833: ZER XR CLEAR GARBAGE XR VALUE ! 13834: BRN CMP09 END OF IMAGE ! 13835: EJC ! 13836: * ! 13837: * CMPIL (CONTINUED) ! 13838: * ! 13839: * HERE WITH IMAGE AVAILABLE TO SCAN. NOTE THAT IF THE INPUT ! 13840: * STRING IS NULL, THEN EVERYTHING IS OK SINCE NULL IS ! 13841: * ACTUALLY ASSEMBLED AS A WORD OF BLANKS. ! 13842: * ! 13843: CMP04 MOV R$CIM,XR POINT TO CURRENT IMAGE ! 13844: MOV SCNPT,WB LOAD CURRENT OFFSET ! 13845: MOV WB,WA COPY FOR LABEL SCAN ! 13846: PLC XR,WB POINT TO FIRST CHARACTER ! 13847: LCH WC,(XR)+ LOAD FIRST CHARACTER ! 13848: BEQ WC,=CH$SM,CMP12 NO LABEL IF SEMICOLON ! 13849: BEQ WC,=CH$AS,CMPCE LOOP BACK IF COMMENT CARD ! 13850: BEQ WC,=CH$MN,CMP32 JUMP IF CONTROL CARD ! 13851: MOV R$CIM,R$CMP ABOUT TO DESTROY R$CIM ! 13852: MOV =CMLAB,XL POINT TO LABEL WORK STRING ! 13853: MOV XL,R$CIM SCANE IS TO SCAN WORK STRING ! 13854: PSC XL POINT TO FIRST CHARACTER POSITION ! 13855: SCH WC,(XL)+ STORE CHAR JUST LOADED ! 13856: MOV =CH$SM,WC GET A SEMICOLON ! 13857: SCH WC,(XL) STORE AFTER FIRST CHAR ! 13858: CSC XL FINISHED CHARACTER STORING ! 13859: ZER XL CLEAR POINTER ! 13860: ZER SCNPT START AT FIRST CHARACTER ! 13861: MOV SCNIL,-(XS) PRESERVE IMAGE LENGTH ! 13862: MOV =NUM02,SCNIL READ 2 CHARS AT MOST ! 13863: JSR SCANE SCAN FIRST CHAR FOR TYPE ! 13864: MOV (XS)+,SCNIL RESTORE IMAGE LENGTH ! 13865: MOV XL,WC NOTE RETURN CODE ! 13866: MOV R$CMP,XL GET OLD R$CIM ! 13867: MOV XL,R$CIM PUT IT BACK ! 13868: MOV WB,SCNPT REINSTATE OFFSET ! 13869: BNZ SCNBL,CMP12 BLANK SEEN - CANT BE LABEL ! 13870: MOV XL,XR POINT TO CURRENT IMAGE ! 13871: PLC XR,WB POINT TO FIRST CHAR AGAIN ! 13872: BEQ WC,=T$VAR,CMP06 OK IF LETTER ! 13873: BEQ WC,=T$CON,CMP06 OK IF DIGIT ! 13874: * ! 13875: * DROP IN OR JUMP FROM ERROR SECTION IF SCANE FAILED ! 13876: * ! 13877: CMPLE MOV R$CMP,R$CIM POINT TO BAD LINE ! 13878: ERB 214,BAD LABEL OR MISPLACED CONTINUATION LINE ! 13879: * ! 13880: * LOOP TO SCAN LABEL ! 13881: * ! 13882: CMP05 BEQ WC,=CH$SM,CMP07 SKIP IF SEMICOLON ! 13883: ICV WA BUMP OFFSET ! 13884: BEQ WA,SCNIL,CMP07 JUMP IF END OF IMAGE (LABEL END) ! 13885: EJC ! 13886: * ! 13887: * CMPIL (CONTINUED) ! 13888: * ! 13889: * ENTER LOOP AT THIS POINT ! 13890: * ! 13891: CMP06 LCH WC,(XR)+ ELSE LOAD NEXT CHARACTER ! 13892: BEQ WC,=CH$HT,CMP07 JUMP IF HORIZONTAL TAB ! 13893: BNE WC,=CH$BL,CMP05 LOOP BACK IF NON-BLANK ! 13894: * ! 13895: * HERE AFTER SCANNING OUT LABEL ! 13896: * ! 13897: CMP07 MOV WA,SCNPT SAVE UPDATED SCAN OFFSET ! 13898: SUB WB,WA GET LENGTH OF LABEL ! 13899: BZE WA,CMP12 SKIP IF LABEL LENGTH ZERO ! 13900: ZER XR CLEAR GARBAGE XR VALUE ! 13901: JSR SBSTR BUILD SCBLK FOR LABEL NAME ! 13902: JSR GTNVR LOCATE/CONTRUCT VRBLK ! 13903: PPM DUMMY (IMPOSSIBLE) ERROR RETURN ! 13904: MOV XR,CMLBL(XS) STORE LABEL POINTER ! 13905: BNZ VRLEN(XR),CMP11 JUMP IF NOT SYSTEM LABEL ! 13906: BNE VRSVP(XR),=V$END,CMP11 JUMP IF NOT END LABEL ! 13907: * ! 13908: * HERE FOR END LABEL SCANNED OUT ! 13909: * ! 13910: ADD =STGND,STAGE ADJUST STAGE APPROPRIATELY ! 13911: JSR SCANE SCAN OUT NEXT ELEMENT ! 13912: BEQ XL,=T$SMC,CMP10 JUMP IF END OF IMAGE ! 13913: BNE XL,=T$VAR,CMP08 ELSE ERROR IF NOT VARIABLE ! 13914: * ! 13915: * HERE CHECK FOR VALID INITIAL TRANSFER ! 13916: * ! 13917: BEQ VRLBL(XR),=STNDL,CMP08 JUMP IF NOT DEFINED (ERROR) ! 13918: MOV VRLBL(XR),CMTRA(XS) ELSE SET INITIAL ENTRY POINTER ! 13919: JSR SCANE SCAN NEXT ELEMENT ! 13920: BEQ XL,=T$SMC,CMP10 JUMP IF OK (END OF IMAGE) ! 13921: * ! 13922: * HERE FOR BAD TRANSFER LABEL ! 13923: * ! 13924: CMP08 ERB 215,SYNTAX ERROR. UNDEFINED OR ERRONEOUS ENTRY LABEL ! 13925: * ! 13926: * HERE FOR END OF INPUT (NO END LABEL DETECTED) ! 13927: * ! 13928: CMP09 ADD =STGND,STAGE ADJUST STAGE APPROPRIATELY ! 13929: BEQ STAGE,=STGXE,CMP10 JUMP IF CODE CALL (OK) ! 13930: ERB 216,SYNTAX ERROR. MISSING END LINE ! 13931: * ! 13932: * HERE AFTER PROCESSING END LINE (MERGE HERE ON END ERROR) ! 13933: * ! 13934: CMP10 MOV =OSTP$,WA SET STOP CALL POINTER ! 13935: JSR CDWRD GENERATE AS STATEMENT CALL ! 13936: BRN CMPSE JUMP TO GENERATE AS FAILURE ! 13937: EJC ! 13938: * ! 13939: * CMPIL (CONTINUED) ! 13940: * ! 13941: * HERE AFTER PROCESSING LABEL OTHER THAN END ! 13942: * ! 13943: CMP11 BNE STAGE,=STGIC,CMP12 JUMP IF CODE CALL - REDEF. OK ! 13944: BEQ VRLBL(XR),=STNDL,CMP12 ELSE CHECK FOR REDEFINITION ! 13945: ZER CMLBL(XS) LEAVE FIRST LABEL DECLN UNDISTURBED ! 13946: ERB 217,SYNTAX ERROR. DUPLICATE LABEL ! 13947: * ! 13948: * HERE AFTER DEALING WITH LABEL ! 13949: * ! 13950: CMP12 ZER WB SET FLAG FOR STATEMENT BODY ! 13951: JSR EXPAN GET TREE FOR STATEMENT BODY ! 13952: MOV XR,CMSTM(XS) STORE FOR LATER USE ! 13953: ZER CMSGO(XS) CLEAR SUCCESS GOTO POINTER ! 13954: ZER CMFGO(XS) CLEAR FAILURE GOTO POINTER ! 13955: ZER CMCGO(XS) CLEAR CONDITIONAL GOTO FLAG ! 13956: JSR SCANE SCAN NEXT ELEMENT ! 13957: BNE XL,=T$COL,CMP18 JUMP IT NOT COLON (NO GOTO) ! 13958: * ! 13959: * LOOP TO PROCESS GOTO FIELDS ! 13960: * ! 13961: CMP13 MNZ SCNGO SET GOTO FLAG ! 13962: JSR SCANE SCAN NEXT ELEMENT ! 13963: BEQ XL,=T$SMC,CMP31 JUMP IF NO FIELDS LEFT ! 13964: BEQ XL,=T$SGO,CMP14 JUMP IF S FOR SUCCESS GOTO ! 13965: BEQ XL,=T$FGO,CMP16 JUMP IF F FOR FAILURE GOTO ! 13966: * ! 13967: * HERE FOR UNCONDITIONAL GOTO (I.E. NOT F OR S) ! 13968: * ! 13969: MNZ SCNRS SET TO RESCAN ELEMENT NOT F,S ! 13970: JSR SCNGF SCAN OUT GOTO FIELD ! 13971: BNZ CMFGO(XS),CMP17 ERROR IF FGOTO ALREADY ! 13972: MOV XR,CMFGO(XS) ELSE SET AS FGOTO ! 13973: BRN CMP15 MERGE WITH SGOTO CIRCUIT ! 13974: * ! 13975: * HERE FOR SUCCESS GOTO ! 13976: * ! 13977: CMP14 JSR SCNGF SCAN SUCCESS GOTO FIELD ! 13978: MOV =NUM01,CMCGO(XS) SET CONDITIONAL GOTO FLAG ! 13979: * ! 13980: * UNCONTIONAL GOTO MERGES HERE ! 13981: * ! 13982: CMP15 BNZ CMSGO(XS),CMP17 ERROR IF SGOTO ALREADY GIVEN ! 13983: MOV XR,CMSGO(XS) ELSE SET SGOTO ! 13984: BRN CMP13 LOOP BACK FOR NEXT GOTO FIELD ! 13985: * ! 13986: * HERE FOR FAILURE GOTO ! 13987: * ! 13988: CMP16 JSR SCNGF SCAN GOTO FIELD ! 13989: MOV =NUM01,CMCGO(XS) SET CONDITONAL GOTO FLAG ! 13990: BNZ CMFGO(XS),CMP17 ERROR IF FGOTO ALREADY GIVEN ! 13991: MOV XR,CMFGO(XS) ELSE STORE FGOTO POINTER ! 13992: BRN CMP13 LOOP BACK FOR NEXT FIELD ! 13993: EJC ! 13994: * ! 13995: * CMPIL (CONTINUED) ! 13996: * ! 13997: * HERE FOR DUPLICATED GOTO FIELD ! 13998: * ! 13999: CMP17 ERB 218,SYNTAX ERROR. DUPLICATED GOTO FIELD ! 14000: * ! 14001: * HERE TO GENERATE CODE ! 14002: * ! 14003: CMP18 ZER SCNSE STOP POSITIONAL ERROR FLAGS ! 14004: MOV CMSTM(XS),XR LOAD TREE PTR FOR STATEMENT BODY ! 14005: ZER WB COLLECTABLE VALUE FOR WB FOR CDGVL ! 14006: ZER WC RESET CONSTANT FLAG FOR CDGVL ! 14007: JSR EXPAP TEST FOR PATTERN MATCH ! 14008: PPM CMP19 JUMP IF NOT PATTERN MATCH ! 14009: MOV =OPMS$,CMOPN(XR) ELSE SET PATTERN MATCH POINTER ! 14010: MOV =C$PMT,CMTYP(XR) ! 14011: * ! 14012: * HERE AFTER DEALING WITH SPECIAL PATTERN MATCH CASE ! 14013: * ! 14014: CMP19 JSR CDGVL GENERATE CODE FOR BODY OF STATEMENT ! 14015: MOV CMSGO(XS),XR LOAD SGOTO POINTER ! 14016: MOV XR,WA COPY IT ! 14017: BZE XR,CMP21 JUMP IF NO SUCCESS GOTO ! 14018: ZER CMSOC(XS) CLEAR SUCCESS OFFSET FILLIN PTR ! 14019: BHI XR,STATE,CMP20 JUMP IF COMPLEX GOTO ! 14020: * ! 14021: * HERE FOR SIMPLE SUCCESS GOTO (LABEL) ! 14022: * ! 14023: ADD *VRTRA,WA POINT TO VRTRA FIELD AS REQUIRED ! 14024: JSR CDWRD GENERATE SUCCESS GOTO ! 14025: BRN CMP22 JUMP TO DEAL WITH FGOTO ! 14026: * ! 14027: * HERE FOR COMPLEX SUCCESS GOTO ! 14028: * ! 14029: CMP20 BEQ XR,CMFGO(XS),CMP22 NO CODE IF SAME AS FGOTO ! 14030: ZER WB ELSE SET OK VALUE FOR CDGVL IN WB ! 14031: JSR CDGCG GENERATE CODE FOR SUCCESS GOTO ! 14032: BRN CMP22 JUMP TO DEAL WITH FGOTO ! 14033: * ! 14034: * HERE FOR NO SUCCESS GOTO ! 14035: * ! 14036: CMP21 MOV CWCOF,CMSOC(XS) SET SUCCESS FILL IN OFFSET ! 14037: MOV =OCER$,WA POINT TO COMPILE ERROR CALL ! 14038: JSR CDWRD GENERATE AS TEMPORARY VALUE ! 14039: EJC ! 14040: * ! 14041: * CMPIL (CONTINUED) ! 14042: * ! 14043: * HERE TO DEAL WITH FAILURE GOTO ! 14044: * ! 14045: CMP22 MOV CMFGO(XS),XR LOAD FAILURE GOTO POINTER ! 14046: MOV XR,WA COPY IT ! 14047: ZER CMFFC(XS) SET NO FILL IN REQUIRED YET ! 14048: BZE XR,CMP23 JUMP IF NO FAILURE GOTO GIVEN ! 14049: ADD *VRTRA,WA POINT TO VRTRA FIELD IN CASE ! 14050: BLO XR,STATE,CMPSE JUMP TO GEN IF SIMPLE FGOTO ! 14051: * ! 14052: * HERE FOR COMPLEX FAILURE GOTO ! 14053: * ! 14054: MOV CWCOF,WB SAVE OFFSET TO O$GOF CALL ! 14055: MOV =OGOF$,WA POINT TO FAILURE GOTO CALL ! 14056: JSR CDWRD GENERATE ! 14057: MOV =OFIF$,WA POINT TO FAIL IN FAIL WORD ! 14058: JSR CDWRD GENERATE ! 14059: JSR CDGCG GENERATE CODE FOR FAILURE GOTO ! 14060: MOV WB,WA COPY OFFSET TO O$GOF FOR CDFAL ! 14061: MOV =B$CDC,WB SET COMPLEX CASE CDTYP ! 14062: BRN CMP25 JUMP TO BUILD CDBLK ! 14063: * ! 14064: * HERE IF NO FAILURE GOTO GIVEN ! 14065: * ! 14066: CMP23 MOV =OUNF$,WA LOAD UNEXPECTED FAILURE CALL IN CAS ! 14067: MOV CSWFL,WC GET -NOFAIL FLAG ! 14068: ORB CMCGO(XS),WC CHECK IF CONDITIONAL GOTO ! 14069: ZRB WC,CMPSE JUMP IF -NOFAIL AND NO COND. GOTO ! 14070: MNZ CMFFC(XS) ELSE SET FILL IN FLAG ! 14071: MOV =OCER$,WA AND SET COMPILE ERROR FOR TEMPORARY ! 14072: * ! 14073: * MERGE HERE WITH CDFAL VALUE IN WA, SIMPLE CDBLK ! 14074: * ALSO SPECIAL ENTRY AFTER STATEMENT ERROR ! 14075: * ! 14076: CMPSE MOV =B$CDS,WB SET CDTYP FOR SIMPLE CASE ! 14077: EJC ! 14078: * ! 14079: * CMPIL (CONTINUED) ! 14080: * ! 14081: * MERGE HERE TO BUILD CDBLK ! 14082: * ! 14083: * (WA) CDFAL VALUE TO BE GENERATED ! 14084: * (WB) CDTYP VALUE TO BE GENERATED ! 14085: * ! 14086: * AT THIS STAGE, WE CHOP OFF AN APPROPRIATE CHUNK OF THE ! 14087: * CURRENT CCBLK AND CONVERT IT INTO A CDBLK. THE REMAINDER ! 14088: * OF THE CCBLK IS REFORMATTED TO BE THE NEW CCBLK. ! 14089: * ! 14090: CMP25 MOV R$CCB,XR POINT TO CCBLK ! 14091: MOV CMLBL(XS),XL GET POSSIBLE LABEL POINTER ! 14092: BZE XL,CMP26 SKIP IF NO LABEL ! 14093: ZER CMLBL(XS) CLEAR FLAG FOR NEXT STATEMENT ! 14094: MOV XR,VRLBL(XL) PUT CDBLK PTR IN VRBLK LABEL FIELD ! 14095: * ! 14096: * MERGE AFTER DOING LABEL ! 14097: * ! 14098: CMP26 MOV WB,(XR) SET TYPE WORD FOR NEW CDBLK ! 14099: MOV WA,CDFAL(XR) SET FAILURE WORD ! 14100: MOV XR,XL COPY POINTER TO CCBLK ! 14101: MOV CCUSE(XR),WB LOAD LENGTH GEN (= NEW CDLEN) ! 14102: MOV CCLEN(XR),WC LOAD TOTAL CCBLK LENGTH ! 14103: ADD WB,XL POINT PAST CDBLK ! 14104: SUB WB,WC GET LENGTH LEFT FOR CHOP OFF ! 14105: MOV =B$CCT,(XL) SET TYPE CODE FOR NEW CCBLK AT END ! 14106: MOV *CCCOD,CCUSE(XL) SET INITIAL CODE OFFSET ! 14107: MOV *CCCOD,CWCOF REINITIALISE CWCOF ! 14108: MOV WC,CCLEN(XL) SET NEW LENGTH ! 14109: MOV XL,R$CCB SET NEW CCBLK POINTER ! 14110: MOV CMPSN,CDSTM(XR) SET STATEMENT NUMBER ! 14111: ICV CMPSN BUMP STATEMENT NUMBER ! 14112: * ! 14113: * SET POINTERS IN PREVIOUS CODE BLOCK AS REQUIRED ! 14114: * ! 14115: MOV CMPCD(XS),XL LOAD PTR TO PREVIOUS CDBLK ! 14116: BZE CMFFP(XS),CMP27 JUMP IF NO FAILURE FILL IN REQUIRED ! 14117: MOV XR,CDFAL(XL) ELSE SET FAILURE PTR IN PREVIOUS ! 14118: * ! 14119: * HERE TO DEAL WITH SUCCESS FORWARD POINTER ! 14120: * ! 14121: CMP27 MOV CMSOP(XS),WA LOAD SUCCESS OFFSET ! 14122: BZE WA,CMP28 JUMP IF NO FILL IN REQUIRED ! 14123: ADD WA,XL ELSE POINT TO FILL IN LOCATION ! 14124: MOV XR,(XL) STORE FORWARD POINTER ! 14125: ZER XL CLEAR GARBAGE XL VALUE ! 14126: EJC ! 14127: * ! 14128: * CMPIL (CONTINUED) ! 14129: * ! 14130: * NOW SET FILL IN POINTERS FOR THIS STATEMENT ! 14131: * ! 14132: CMP28 MOV CMFFC(XS),CMFFP(XS) COPY FAILURE FILL IN FLAG ! 14133: MOV CMSOC(XS),CMSOP(XS) COPY SUCCESS FILL IN OFFSET ! 14134: MOV XR,CMPCD(XS) SAVE PTR TO THIS CDBLK ! 14135: BNZ CMTRA(XS),CMP29 JUMP IF INITIAL ENTRY ALREADY SET ! 14136: MOV XR,CMTRA(XS) ELSE SET PTR HERE AS DEFAULT ! 14137: * ! 14138: * HERE AFTER COMPILING ONE STATEMENT ! 14139: * ! 14140: CMP29 BLT STAGE,=STGCE,CMP01 JUMP IF NOT END LINE JUST DONE ! 14141: BZE CSWLS,CMP30 SKIP IF -NOLIST ! 14142: JSR LISTR LIST LAST LINE ! 14143: * ! 14144: * RETURN ! 14145: * ! 14146: CMP30 MOV CMTRA(XS),XR LOAD INITIAL ENTRY CDBLK POINTER ! 14147: ADD *CMNEN,XS POP WORK LOCATIONS OFF STACK ! 14148: EXI AND RETURN TO CMPIL CALLER ! 14149: * ! 14150: * HERE AT END OF GOTO FIELD ! 14151: * ! 14152: CMP31 MOV CMFGO(XS),WB GET FAIL GOTO ! 14153: ORB CMSGO(XS),WB OR IN SUCCESS GOTO ! 14154: BNZ WB,CMP18 OK IF NON-NULL FIELD ! 14155: ERB 219,SYNTAX ERROR. EMPTY GOTO FIELD ! 14156: * ! 14157: * CONTROL CARD FOUND ! 14158: * ! 14159: CMP32 ICV WB POINT PAST CH$MN ! 14160: JSR CNCRD PROCESS CONTROL CARD ! 14161: ZER SCNSE CLEAR START OF ELEMENT LOC. ! 14162: BRN CMPCE LOOP FOR NEXT STATEMENT ! 14163: ENP END PROCEDURE CMPIL ! 14164: EJC ! 14165: * ! 14166: * CNCRD -- CONTROL CARD PROCESSOR ! 14167: * ! 14168: * CALLED TO DEAL WITH CONTROL CARDS ! 14169: * ! 14170: * R$CIM POINTS TO CURRENT IMAGE ! 14171: * (WB) OFFSET TO 1ST CHAR OF CONTROL CARD ! 14172: * JSR CNCRD CALL TO PROCESS CONTROL CARDS ! 14173: * (XL,XR,WA,WB,WC,IA) DESTROYED ! 14174: * ! 14175: CNCRD PRC E,0 ENTRY POINT ! 14176: MOV WB,SCNPT OFFSET FOR CONTROL CARD SCAN ! 14177: MOV =CCNOC,WA NUMBER OF CHARS FOR COMPARISON ! 14178: CTW WA,0 CONVERT TO WORD COUNT ! 14179: MOV WA,CNSWC SAVE WORD COUNT ! 14180: * ! 14181: * LOOP HERE IF MORE THAN ONE CONTROL CARD ! 14182: * ! 14183: CNC01 BGE SCNPT,SCNIL,CNC09 RETURN IF END OF IMAGE ! 14184: MOV R$CIM,XR POINT TO IMAGE ! 14185: PLC XR,SCNPT CHAR PTR FOR FIRST CHAR ! 14186: LCH WA,(XR)+ GET FIRST CHAR ! 14187: FLC WA FOLD TO UPPER CASE ! 14188: BEQ WA,=CH$LI,CNC07 SPECIAL CASE OF -INXXX ! 14189: MNZ SCNCC SET FLAG FOR SCANE ! 14190: JSR SCANE SCAN CARD NAME ! 14191: ZER SCNCC CLEAR SCANE FLAG ! 14192: BNZ XL,CNC06 FAIL UNLESS CONTROL CARD NAME ! 14193: MOV =CCNOC,WA NO. OF CHARS TO BE COMPARED ! 14194: BLT SCLEN(XR),WA,CNC06 FAIL IF TOO FEW CHARS ! 14195: MOV XR,XL POINT TO CONTROL CARD NAME ! 14196: ZER WB ZERO OFFSET FOR SUBSTRING ! 14197: JSR SBSTR EXTRACT SUBSTRING FOR COMPARISON ! 14198: MOV SCLEN(XR),WA RELOAD LENGTH ! 14199: JSR FLSTG FOLD TO UPPER CASE ! 14200: MOV XR,CNSCC KEEP CONTROL CARD SUBSTRING PTR ! 14201: MOV =CCNMS,XR POINT TO LIST OF STANDARD NAMES ! 14202: ZER WB INITIALISE NAME OFFSET ! 14203: LCT WC,=CC$NC NUMBER OF STANDARD NAMES ! 14204: * ! 14205: * TRY TO MATCH NAME ! 14206: * ! 14207: CNC02 MOV CNSCC,XL POINT TO NAME ! 14208: LCT WA,CNSWC COUNTER FOR INNER LOOP ! 14209: BRN CNC04 JUMP INTO LOOP ! 14210: * ! 14211: * INNER LOOP TO MATCH CARD NAME CHARS ! 14212: * ! 14213: CNC03 ICA XR BUMP STANDARD NAMES PTR ! 14214: ICA XL BUMP NAME POINTER ! 14215: * ! 14216: * HERE TO INITIATE THE LOOP ! 14217: * ! 14218: CNC04 CNE SCHAR(XL),(XR),CNC05 COMP. UP TO CFP$C CHARS AT ONCE ! 14219: BCT WA,CNC03 LOOP IF MORE WORDS TO COMPARE ! 14220: EJC ! 14221: * ! 14222: * CNCRD (CONTINUED) ! 14223: * ! 14224: * MATCHED - BRANCH ON CARD OFFSET ! 14225: * ! 14226: MOV WB,XL GET NAME OFFSET ! 14227: BSW XL,CC$NC SWITCH ! 14228: IFF CC$CA,CNC37 -CASE ! 14229: IFF CC$DO,CNC10 -DOUBLE ! 14230: IFF CC$DU,CNC11 -DUMP ! 14231: IFF CC$EJ,CNC12 -EJECT ! 14232: IFF CC$ER,CNC13 -ERRORS ! 14233: IFF CC$EX,CNC14 -EXECUTE ! 14234: IFF CC$FA,CNC15 -FAIL ! 14235: IFF CC$LI,CNC16 -LIST ! 14236: IFF CC$NR,CNC17 -NOERRORS ! 14237: IFF CC$NX,CNC18 -NOEXECUTE ! 14238: IFF CC$NF,CNC19 -NOFAIL ! 14239: IFF CC$NL,CNC20 -NOLIST ! 14240: IFF CC$NO,CNC21 -NOOPT ! 14241: IFF CC$NP,CNC22 -NOPRINT ! 14242: IFF CC$OP,CNC24 -OPTIMISE ! 14243: IFF CC$PR,CNC25 -PRINT ! 14244: IFF CC$SI,CNC27 -SINGLE ! 14245: IFF CC$SP,CNC28 -SPACE ! 14246: IFF CC$ST,CNC31 -STITLE ! 14247: IFF CC$TI,CNC32 -TITLE ! 14248: IFF CC$TR,CNC36 -TRACE ! 14249: ESW END SWITCH ! 14250: * ! 14251: * NOT MATCHED YET. ALIGN STD NAMES PTR AND TRY AGAIN ! 14252: * ! 14253: CNC05 ICA XR BUMP STANDARD NAMES PTR ! 14254: BCT WA,CNC05 LOOP ! 14255: ICV WB BUMP NAMES OFFSET ! 14256: BCT WC,CNC02 CONTINUE IF MORE NAMES ! 14257: * ! 14258: * INVALID CONTROL CARD NAME ! 14259: * ! 14260: CNC06 ERB 247,INVALID CONTROL CARD ! 14261: * ! 14262: * SPECIAL PROCESSING FOR -INXXX ! 14263: * ! 14264: CNC07 LCH WA,(XR) GET NEXT CHAR ! 14265: FLC WA FOLD TO UPPER CASE ! 14266: BNE WA,=CH$LN,CNC06 FAIL IF NOT LETTER N ! 14267: ADD =NUM02,SCNPT BUMP OFFSET PAST -IN ! 14268: JSR SCANE SCAN INTEGER AFTER -IN ! 14269: MOV XR,-(XS) STACK SCANNED ITEM ! 14270: JSR GTSMI CHECK IF INTEGER ! 14271: PPM CNC06 FAIL IF NOT INTEGER ! 14272: PPM CNC06 FAIL IF NEGATIVE OR LARGE ! 14273: MOV XR,CSWIN KEEP INTEGER ! 14274: EJC ! 14275: * ! 14276: * CNCRD (CONTINUED) ! 14277: * ! 14278: * CHECK FOR MORE CONTROL CARDS BEFORE RETURNING ! 14279: * ! 14280: CNC08 MOV SCNPT,WA PRESERVE IN CASE XEQ TIME COMPILE ! 14281: JSR SCANE LOOK FOR COMMA ! 14282: BEQ XL,=T$CMA,CNC01 LOOP IF COMMA FOUND ! 14283: MOV WA,SCNPT RESTORE SCNPT IN CASE XEQ TIME ! 14284: * ! 14285: * RETURN POINT ! 14286: * ! 14287: CNC09 EXI RETURN ! 14288: * ! 14289: * -DOUBLE ! 14290: * ! 14291: CNC10 MNZ CSWDB SET SWITCH ! 14292: BRN CNC08 MERGE ! 14293: * ! 14294: * -DUMP ! 14295: * THIS IS USED FOR SYSTEM DEBUGGING . IT HAS THE EFFECT OF ! 14296: * PRODUCING A CORE DUMP AT COMPILATION TIME ! 14297: * ! 14298: CNC11 JSR SYSDM CALL DUMPER ! 14299: BRN CNC09 FINISHED ! 14300: * ! 14301: * -EJECT ! 14302: * ! 14303: CNC12 BZE CSWLS,CNC09 RETURN IF -NOLIST ! 14304: JSR PRTPS EJECT ! 14305: JSR LISTT LIST TITLE ! 14306: BRN CNC09 FINISHED ! 14307: * ! 14308: * -ERRORS ! 14309: * ! 14310: CNC13 ZER CSWER CLEAR SWITCH ! 14311: BRN CNC08 MERGE ! 14312: * ! 14313: * -EXECUTE ! 14314: * ! 14315: CNC14 ZER CSWEX CLEAR SWITCH ! 14316: BRN CNC08 MERGE ! 14317: * ! 14318: * -FAIL ! 14319: * ! 14320: CNC15 MNZ CSWFL SET SWITCH ! 14321: BRN CNC08 MERGE ! 14322: * ! 14323: * -LIST ! 14324: * ! 14325: CNC16 MNZ CSWLS SET SWITCH ! 14326: BEQ STAGE,=STGIC,CNC08 DONE IF COMPILE TIME ! 14327: * ! 14328: * LIST CODE LINE IF EXECUTE TIME COMPILE ! 14329: * ! 14330: ZER LSTPF PERMIT LISTING ! 14331: JSR LISTR LIST LINE ! 14332: BRN CNC08 MERGE ! 14333: EJC ! 14334: * ! 14335: * CNCRD (CONTINUED) ! 14336: * ! 14337: * -NOERRORS ! 14338: * ! 14339: CNC17 MNZ CSWER SET SWITCH ! 14340: BRN CNC08 MERGE ! 14341: * ! 14342: * -NOEXECUTE ! 14343: * ! 14344: CNC18 MNZ CSWEX SET SWITCH ! 14345: BRN CNC08 MERGE ! 14346: * ! 14347: * -NOFAIL ! 14348: * ! 14349: CNC19 ZER CSWFL CLEAR SWITCH ! 14350: BRN CNC08 MERGE ! 14351: * ! 14352: * -NOLIST ! 14353: * ! 14354: CNC20 ZER CSWLS CLEAR SWITCH ! 14355: BRN CNC08 MERGE ! 14356: * ! 14357: * -NOOPTIMISE ! 14358: * ! 14359: CNC21 MNZ CSWNO SET SWITCH ! 14360: BRN CNC08 MERGE ! 14361: * ! 14362: * -NOPRINT ! 14363: * ! 14364: CNC22 ZER CSWPR CLEAR SWITCH ! 14365: BRN CNC08 MERGE ! 14366: * ! 14367: * -OPTIMISE ! 14368: * ! 14369: CNC24 ZER CSWNO CLEAR SWITCH ! 14370: BRN CNC08 MERGE ! 14371: * ! 14372: * -PRINT ! 14373: * ! 14374: CNC25 MNZ CSWPR SET SWITCH ! 14375: BRN CNC08 MERGE ! 14376: EJC ! 14377: * ! 14378: * CNCRD (CONTINUED) ! 14379: * ! 14380: * -SINGLE ! 14381: * ! 14382: CNC27 ZER CSWDB CLEAR SWITCH ! 14383: BRN CNC08 MERGE ! 14384: * ! 14385: * -SPACE ! 14386: * ! 14387: CNC28 BZE CSWLS,CNC09 RETURN IF -NOLIST ! 14388: JSR SCANE SCAN INTEGER AFTER -SPACE ! 14389: MOV =NUM01,WC 1 SPACE IN CASE ! 14390: BEQ XR,=T$SMC,CNC29 JUMP IF NO INTEGER ! 14391: MOV XR,-(XS) STACK IT ! 14392: JSR GTSMI CHECK INTEGER ! 14393: PPM CNC06 FAIL IF NOT INTEGER ! 14394: PPM CNC06 FAIL IF NEGATIVE OR LARGE ! 14395: BNZ WC,CNC29 JUMP IF NON ZERO ! 14396: MOV =NUM01,WC ELSE 1 SPACE ! 14397: * ! 14398: * MERGE WITH COUNT OF LINES TO SKIP ! 14399: * ! 14400: CNC29 ADD WC,LSTLC BUMP LINE COUNT ! 14401: LCT WC,WC CONVERT TO LOOP COUNTER ! 14402: BLT LSTLC,LSTNP,CNC30 JUMP IF FITS ON PAGE ! 14403: JSR PRTPS EJECT ! 14404: JSR LISTT LIST TITLE ! 14405: BRN CNC09 MERGE ! 14406: * ! 14407: * SKIP LINES ! 14408: * ! 14409: CNC30 JSR PRTNL PRINT A BLANK ! 14410: BCT WC,CNC30 LOOP ! 14411: BRN CNC09 MERGE ! 14412: EJC ! 14413: * ! 14414: * CNCRD (CONTINUED) ! 14415: * ! 14416: * -STITL ! 14417: * ! 14418: CNC31 MOV =R$STL,CNR$T PTR TO R$STL ! 14419: BRN CNC33 MERGE ! 14420: * ! 14421: * -TITLE ! 14422: * ! 14423: CNC32 MOV =NULLS,R$STL CLEAR SUBTITLE ! 14424: MOV =R$TTL,CNR$T PTR TO R$TTL ! 14425: * ! 14426: * COMMON PROCESSING FOR -TITLE, -STITL ! 14427: * ! 14428: CNC33 MOV =NULLS,XR NULL IN CASE NEEDED ! 14429: MNZ CNTTL SET FLAG FOR NEXT LISTR CALL ! 14430: MOV =CCOFS,WB OFFSET TO TITLE/SUBTITLE ! 14431: MOV SCNIL,WA INPUT IMAGE LENGTH ! 14432: BLO WA,WB,CNC34 JUMP IF NO CHARS LEFT ! 14433: SUB WB,WA NO OF CHARS TO EXTRACT ! 14434: MOV R$CIM,XL POINT TO IMAGE ! 14435: JSR SBSTR GET TITLE/SUBTITLE ! 14436: * ! 14437: * STORE TITLE/SUBTITLE ! 14438: * ! 14439: CNC34 MOV CNR$T,XL POINT TO STORAGE LOCATION ! 14440: MOV XR,(XL) STORE TITLE/SUBTITLE ! 14441: BEQ XL,=R$STL,CNC09 RETURN IF STITL ! 14442: BNZ PRECL,CNC09 RETURN IF EXTENDED LISTING ! 14443: BZE PRICH,CNC09 RETURN IF REGULAR PRINTER ! 14444: MOV SCLEN(XR),XL GET LENGTH OF TITLE ! 14445: MOV XL,WA COPY IT ! 14446: BZE XL,CNC35 JUMP IF NULL ! 14447: ADD =NUM10,XL INCREMENT ! 14448: BHI XL,PRLEN,CNC09 USE DEFAULT LSTP0 VAL IF TOO LONG ! 14449: ADD =NUM04,WA POINT JUST PAST TITLE ! 14450: * ! 14451: * STORE OFFSET TO PAGE NN MESSAGE FOR SHORT TITLE ! 14452: * ! 14453: CNC35 MOV WA,LSTPO STORE OFFSET ! 14454: BRN CNC09 RETURN ! 14455: * ! 14456: * -TRACE ! 14457: * PROVIDED FOR SYSTEM DEBUGGING. TOGGLES THE SYSTEM LABEL ! 14458: * TRACE SWITCH AT COMPILE TIME ! 14459: * ! 14460: CNC36 JSR SYSTT TOGGLE SWITCH ! 14461: BRN CNC08 MERGE ! 14462: * ! 14463: * -CASE ! 14464: * SETS VALUE OF KVCAS SO THAT NAMES ARE FOLDED OR NOT ! 14465: * DURING COMPILATION. ! 14466: * ! 14467: CNC37 JSR SCANE SCAN INTEGER AFTER -CASE ! 14468: ZER WC GET 0 IN CASE NONE THERE ! 14469: BEQ XL,=T$SMC,CNC38 SKIP IF NO INTEGER ! 14470: MOV XR,-(XS) STACK IT ! 14471: JSR GTSMI CHECK INTEGER ! 14472: PPM CNC06 FAIL IF NOT INTEGER ! 14473: PPM CNC06 FAIL IF NEGATIVE OR TOO LARGE ! 14474: CNC38 MOV WC,KVCAS STORE NEW CASE VALUE ! 14475: BRN CNC09 MERGE ! 14476: ENP END PROCEDURE CNCRD ! 14477: EJC ! 14478: * ! 14479: * DFFNC -- DEFINE FUNCTION ! 14480: * ! 14481: * DFFNC IS CALLED WHENEVER A NEW FUNCTION IS ASSIGNED TO ! 14482: * A VARIABLE. IT DEALS WITH EXTERNAL FUNCTION USE COUNTS. ! 14483: * ! 14484: * (XR) POINTER TO VRBLK ! 14485: * (XL) POINTER TO NEW FUNCTION BLOCK ! 14486: * JSR DFFNC CALL TO DEFINE FUNCTION ! 14487: * (WA,WB) DESTROYED ! 14488: * ! 14489: DFFNC PRC E,0 ENTRY POINT ! 14490: BNE (XL),=B$EFC,DFFN1 SKIP IF NEW FUNCTION NOT EXTERNAL ! 14491: ICV EFUSE(XL) ELSE INCREMENT ITS USE COUNT ! 14492: * ! 14493: * HERE AFTER DEALING WITH NEW FUNCTION USE COUNT ! 14494: * ! 14495: DFFN1 MOV XR,WA SAVE VRBLK POINTER ! 14496: MOV VRFNC(XR),XR LOAD OLD FUNCTION POINTER ! 14497: BNE (XR),=B$EFC,DFFN2 JUMP IF OLD FUNCTION NOT EXTERNAL ! 14498: MOV EFUSE(XR),WB ELSE GET USE COUNT ! 14499: DCV WB DECREMENT ! 14500: MOV WB,EFUSE(XR) STORE DECREMENTED VALUE ! 14501: BNZ WB,DFFN2 JUMP IF USE COUNT STILL NON-ZERO ! 14502: JSR SYSUL ELSE CALL SYSTEM UNLOAD FUNCTION ! 14503: * ! 14504: * HERE AFTER DEALING WITH OLD FUNCTION USE COUNT ! 14505: * ! 14506: DFFN2 MOV WA,XR RESTORE VRBLK POINTER ! 14507: MOV XL,WA COPY FUNCTION BLOCK PTR ! 14508: BLT XR,=R$YYY,DFFN3 SKIP CHECKS IF OPSYN OP DEFINITION ! 14509: BNZ VRLEN(XR),DFFN3 JUMP IF NOT SYSTEM VARIABLE ! 14510: * ! 14511: * FOR SYSTEM VARIABLE, CHECK FOR ILLEGAL REDEFINITION ! 14512: * ! 14513: MOV VRSVP(XR),XL POINT TO SVBLK ! 14514: MOV SVBIT(XL),WB LOAD BIT INDICATORS ! 14515: ANB BTFNC,WB IS IT A SYSTEM FUNCTION ! 14516: ZRB WB,DFFN3 REDEF OK IF NOT ! 14517: ERB 248,ATTEMPTED REDEFINITION OF SYSTEM FUNCTION ! 14518: * ! 14519: * HERE IF REDEFINITION IS PERMITTED ! 14520: * ! 14521: DFFN3 MOV WA,VRFNC(XR) STORE NEW FUNCTION POINTER ! 14522: MOV WA,XL RESTORE FUNCTION BLOCK POINTER ! 14523: EXI RETURN TO DFFNC CALLER ! 14524: ENP END PROCEDURE DFFNC ! 14525: EJC ! 14526: * ! 14527: * DTACH -- DETACH I/O ASSOCIATED NAMES ! 14528: * ! 14529: * DETACHES TRBLKS FROM I/O ASSOCIATED VARIABLES, REMOVES ! 14530: * ENTRY FROM IOCHN CHAIN ATTACHED TO FILEARG1 VRBLK AND MAY ! 14531: * REMOVE VRBLK ACCESS AND STORE TRAPS. ! 14532: * INPUT, OUTPUT, TERMINAL ARE HANDLED SPECIALLY. ! 14533: * ! 14534: * (XL) I/O ASSOC. VBL NAME BASE PTR ! 14535: * (WA) OFFSET TO NAME ! 14536: * JSR DTACH CALL FOR DETACH OPERATION ! 14537: * (XL,XR,WA,WB,WC) DESTROYED ! 14538: * ! 14539: DTACH PRC E,0 ENTRY POINT ! 14540: MOV XL,DTCNB STORE NAME BASE (GBCOL NOT CALLED) ! 14541: ADD WA,XL POINT TO NAME LOCATION ! 14542: MOV XL,DTCNM STORE IT ! 14543: * ! 14544: * LOOP TO SEARCH FOR I/O TRBLK ! 14545: * ! 14546: DTCH1 MOV XL,XR COPY NAME POINTER ! 14547: * ! 14548: * CONTINUE AFTER BLOCK DELETION ! 14549: * ! 14550: DTCH2 MOV (XL),XL POINT TO NEXT VALUE ! 14551: BNE (XL),=B$TRT,DTCH6 JUMP AT CHAIN END ! 14552: MOV TRTYP(XL),WA GET TRAP BLOCK TYPE ! 14553: BEQ WA,=TRTIN,DTCH3 JUMP IF INPUT ! 14554: BEQ WA,=TRTOU,DTCH3 JUMP IF OUTPUT ! 14555: ADD *TRNXT,XL POINT TO NEXT LINK ! 14556: BRN DTCH1 LOOP ! 14557: * ! 14558: * DELETE AN OLD ASSOCIATION ! 14559: * ! 14560: DTCH3 MOV TRVAL(XL),(XR) DELETE TRBLK ! 14561: MOV XL,WA DUMP XL ... ! 14562: MOV XR,WB ... AND XR ! 14563: MOV TRTRF(XL),XL POINT TO TRTRF TRAP BLOCK ! 14564: BZE XL,DTCH5 JUMP IF NO IOCHN ! 14565: BNE (XL),=B$TRT,DTCH5 JUMP IF INPUT, OUTPUT, TERMINAL ! 14566: * ! 14567: * LOOP TO SEARCH IOCHN CHAIN FOR NAME PTR ! 14568: * ! 14569: DTCH4 MOV XL,XR REMEMBER LINK PTR ! 14570: MOV TRTRF(XL),XL POINT TO NEXT LINK ! 14571: BZE XL,DTCH5 JUMP IF END OF CHAIN ! 14572: MOV IONMB(XL),WC GET NAME BASE ! 14573: ADD IONMO(XL),WC ADD OFFSET ! 14574: BNE WC,DTCNM,DTCH4 LOOP IF NO MATCH ! 14575: MOV TRTRF(XL),TRTRF(XR) REMOVE NAME FROM CHAIN ! 14576: EJC ! 14577: * ! 14578: * DTACH (CONTINUED) ! 14579: * ! 14580: * PREPARE TO RESUME I/O TRBLK SCAN ! 14581: * ! 14582: DTCH5 MOV WA,XL RECOVER XL ... ! 14583: MOV WB,XR ... AND XR ! 14584: ADD *TRVAL,XL POINT TO VALUE FIELD ! 14585: BRN DTCH2 CONTINUE ! 14586: * ! 14587: * EXIT POINT ! 14588: * ! 14589: DTCH6 MOV DTCNB,XR POSSIBLE VRBLK PTR ! 14590: JSR SETVR RESET VRBLK IF NECESSARY ! 14591: EXI RETURN ! 14592: ENP END PROCEDURE DTACH ! 14593: EJC ! 14594: * ! 14595: * DTYPE -- GET DATATYPE NAME ! 14596: * ! 14597: * (XR) OBJECT WHOSE DATATYPE IS REQUIRED ! 14598: * JSR DTYPE CALL TO GET DATATYPE ! 14599: * (XR) RESULT DATATYPE ! 14600: * ! 14601: DTYPE PRC E,0 ENTRY POINT ! 14602: BEQ (XR),=B$PDT,DTYP1 JUMP IF PROG.DEFINED ! 14603: MOV (XR),XR LOAD TYPE WORD ! 14604: LEI XR GET ENTRY POINT ID (BLOCK CODE) ! 14605: WTB XR CONVERT TO BYTE OFFSET ! 14606: MOV SCNMT(XR),XR LOAD TABLE ENTRY ! 14607: EXI EXIT TO DTYPE CALLER ! 14608: * ! 14609: * HERE IF PROGRAM DEFINED ! 14610: * ! 14611: DTYP1 MOV PDDFP(XR),XR POINT TO DFBLK ! 14612: MOV DFNAM(XR),XR GET DATATYPE NAME FROM DFBLK ! 14613: EXI RETURN TO DTYPE CALLER ! 14614: ENP END PROCEDURE DTYPE ! 14615: EJC ! 14616: * ! 14617: * DUMPR -- PRINT DUMP OF STORAGE ! 14618: * ! 14619: * (XR) DUMP ARGUMENT (SEE BELOW) ! 14620: * JSR DUMPR CALL TO PRINT DUMP ! 14621: * (XR,XL) DESTROYED ! 14622: * (WA,WB,WC,RA) DESTROYED ! 14623: * ! 14624: * THE DUMP ARGUMENT HAS THE FOLLOWING SIGNIFICANCE ! 14625: * ! 14626: * DMARG = 0 NO DUMP PRINTED ! 14627: * DMARG = 1 PARTIAL DUMP (NAT VARS, KEYWORDS) ! 14628: * DMARG EQ 2 FULL DUMP (INCL ARRAYS ETC.) ! 14629: * DMARG GE 3 CORE DUMP ! 14630: * ! 14631: * SINCE DUMPR SCRAMBLES STORE, IT IS NOT PERMISSIBLE TO ! 14632: * COLLECT IN MID-DUMP. HENCE A COLLECT IS DONE INITIALLY ! 14633: * AND THEN IF STORE RUNS OUT AN ERROR MESSAGE IS PRODUCED. ! 14634: * ! 14635: DUMPR PRC E,0 ENTRY POINT ! 14636: BZE XR,DMP28 SKIP DUMP IF ARGUMENT IS ZERO ! 14637: BGT XR,=NUM02,DMP29 JUMP IF CORE DUMP REQUIRED ! 14638: ZER XL CLEAR XL ! 14639: ZER WB ZERO MOVE OFFSET ! 14640: MOV XR,DMARG SAVE DUMP ARGUMENT ! 14641: JSR GBCOL COLLECT GARBAGE ! 14642: JSR PRTPG EJECT PRINTER ! 14643: MOV =DMHDV,XR POINT TO HEADING FOR VARIABLES ! 14644: JSR PRTST PRINT IT ! 14645: JSR PRTNL TERMINATE PRINT LINE ! 14646: JSR PRTNL AND PRINT A BLANK LINE ! 14647: * ! 14648: * FIRST ALL NATURAL VARIABLE BLOCKS (VRBLK) WHOSE VALUES ! 14649: * ARE NON-NULL ARE LINKED IN LEXICAL ORDER USING DMVCH AS ! 14650: * THE CHAIN HEAD AND CHAINING THROUGH THE VRGET FIELDS. ! 14651: * NOTE THAT THIS SCRAMBLES STORE IF THE PROCESS IS ! 14652: * INTERRUPTED BEFORE COMPLETION E.G. BY EXCEEDING TIME OR ! 14653: * PRINT LIMITS. SINCE THE SUBSEQUENT CORE DUMPS AND ! 14654: * FAILURES IF EXECUTION IS RESUMED ARE VERY CONFUSING, THE ! 14655: * EXECUTION TIME ERROR ROUTINE CHECKS FOR THIS EVENT AND ! 14656: * ATTEMPTS AN UNSCRAMBLE. SIMILAR PRECAUTIONS SHOULD BE ! 14657: * OBSERVED IF TRANSLATE TIME DUMPING IS IMPLEMENTED. ! 14658: * ! 14659: ZER DMVCH SET NULL CHAIN TO START ! 14660: MOV HSHTB,WA POINT TO HASH TABLE ! 14661: * ! 14662: * LOOP THROUGH HEADERS IN HASH TABLE ! 14663: * ! 14664: DMP00 MOV WA,XR COPY HASH BUCKET POINTER ! 14665: ICA WA BUMP POINTER ! 14666: SUB *VRNXT,XR SET OFFSET TO MERGE ! 14667: * ! 14668: * LOOP THROUGH VRBLKS ON ONE CHAIN ! 14669: * ! 14670: DMP01 MOV VRNXT(XR),XR POINT TO NEXT VRBLK ON CHAIN ! 14671: BZE XR,DMP09 JUMP IF END OF THIS HASH CHAIN ! 14672: MOV XR,XL ELSE COPY VRBLK POINTER ! 14673: EJC ! 14674: * ! 14675: * DUMPR (CONTINUED) ! 14676: * ! 14677: * LOOP TO FIND VALUE AND SKIP IF NULL ! 14678: * ! 14679: DMP02 MOV VRVAL(XL),XL LOAD VALUE ! 14680: BEQ XL,=NULLS,DMP01 LOOP FOR NEXT VRBLK IF NULL VALUE ! 14681: BEQ (XL),=B$TRT,DMP02 LOOP BACK IF VALUE IS TRAPPED ! 14682: * ! 14683: * NON-NULL VALUE, PREPARE TO SEARCH CHAIN ! 14684: * ! 14685: MOV XR,WC SAVE VRBLK POINTER ! 14686: ADD *VRSOF,XR ADJUST PTR TO BE LIKE SCBLK PTR ! 14687: BNZ SCLEN(XR),DMP03 JUMP IF NON-SYSTEM VARIABLE ! 14688: MOV VRSVO(XR),XR ELSE LOAD PTR TO NAME IN SVBLK ! 14689: * ! 14690: * HERE WITH NAME POINTER FOR NEW BLOCK IN XR ! 14691: * ! 14692: DMP03 MOV XR,WB SAVE POINTER TO CHARS ! 14693: MOV WA,DMPSV SAVE HASH BUCKET POINTER ! 14694: MOV =DMVCH,WA POINT TO CHAIN HEAD ! 14695: * ! 14696: * LOOP TO SEARCH CHAIN FOR CORRECT INSERTION POINT ! 14697: * ! 14698: DMP04 MOV WA,DMPCH SAVE CHAIN POINTER ! 14699: MOV WA,XL COPY IT ! 14700: MOV (XL),XR LOAD POINTER TO NEXT ENTRY ! 14701: BZE XR,DMP08 JUMP IF END OF CHAIN TO INSERT ! 14702: ADD *VRSOF,XR ELSE GET NAME PTR FOR CHAINED VRBLK ! 14703: BNZ SCLEN(XR),DMP05 JUMP IF NOT SYSTEM VARIABLE ! 14704: MOV VRSVO(XR),XR ELSE POINT TO NAME IN SVBLK ! 14705: * ! 14706: * HERE PREPARE TO COMPARE THE NAMES ! 14707: * ! 14708: * (WA) SCRATCH ! 14709: * (WB) POINTER TO STRING OF ENTERING VRBLK ! 14710: * (WC) POINTER TO ENTERING VRBLK ! 14711: * (XR) POINTER TO STRING OF CURRENT BLOCK ! 14712: * (XL) SCRATCH ! 14713: * ! 14714: DMP05 MOV WB,XL POINT TO ENTERING VRBLK STRING ! 14715: MOV SCLEN(XL),WA LOAD ITS LENGTH ! 14716: PLC XL POINT TO CHARS OF ENTERING STRING ! 14717: BHI WA,SCLEN(XR),DMP06 JUMP IF ENTERING LENGTH HIGH ! 14718: PLC XR ELSE POINT TO CHARS OF OLD STRING ! 14719: CMC DMP08,DMP07 COMPARE, INSERT IF NEW IS LLT OLD ! 14720: BRN DMP08 OR IF LEQ (WE HAD SHORTER LENGTH) ! 14721: * ! 14722: * HERE WHEN NEW LENGTH IS LONGER THAN OLD LENGTH ! 14723: * ! 14724: DMP06 MOV SCLEN(XR),WA LOAD SHORTER LENGTH ! 14725: PLC XR POINT TO CHARS OF OLD STRING ! 14726: CMC DMP08,DMP07 COMPARE, INSERT IF NEW ONE LOW ! 14727: EJC ! 14728: * ! 14729: * DUMPR (CONTINUED) ! 14730: * ! 14731: * HERE WE MOVE OUT ON THE CHAIN ! 14732: * ! 14733: DMP07 MOV DMPCH,XL COPY CHAIN POINTER ! 14734: MOV (XL),WA MOVE TO NEXT ENTRY ON CHAIN ! 14735: BRN DMP04 LOOP BACK ! 14736: * ! 14737: * HERE AFTER LOCATING THE PROPER INSERTION POINT ! 14738: * ! 14739: DMP08 MOV DMPCH,XL COPY CHAIN POINTER ! 14740: MOV DMPSV,WA RESTORE HASH BUCKET POINTER ! 14741: MOV WC,XR RESTORE VRBLK POINTER ! 14742: MOV (XL),VRGET(XR) LINK VRBLK TO REST OF CHAIN ! 14743: MOV XR,(XL) LINK VRBLK INTO CURRENT CHAIN LOC ! 14744: BRN DMP01 LOOP BACK FOR NEXT VRBLK ! 14745: * ! 14746: * HERE AFTER PROCESSING ALL VRBLKS ON ONE CHAIN ! 14747: * ! 14748: DMP09 BNE WA,HSHTE,DMP00 LOOP BACK IF MORE BUCKETS TO GO ! 14749: * ! 14750: * LOOP TO GENERATE DUMP OF NATURAL VARIABLE VALUES ! 14751: * ! 14752: DMP10 MOV DMVCH,XR LOAD POINTER TO NEXT ENTRY ON CHAIN ! 14753: BZE XR,DMP11 JUMP IF END OF CHAIN ! 14754: MOV (XR),DMVCH ELSE UPDATE CHAIN PTR TO NEXT ENTRY ! 14755: JSR SETVR RESTORE VRGET FIELD ! 14756: MOV XR,XL COPY VRBLK POINTER (NAME BASE) ! 14757: MOV *VRVAL,WA SET OFFSET FOR VRBLK NAME ! 14758: JSR PRTNV PRINT NAME = VALUE ! 14759: BRN DMP10 LOOP BACK TILL ALL PRINTED ! 14760: * ! 14761: * PREPARE TO PRINT KEYWORDS ! 14762: * ! 14763: DMP11 JSR PRTNL PRINT BLANK LINE ! 14764: JSR PRTNL AND ANOTHER ! 14765: MOV =DMHDK,XR POINT TO KEYWORD HEADING ! 14766: JSR PRTST PRINT HEADING ! 14767: JSR PRTNL END LINE ! 14768: JSR PRTNL PRINT ONE BLANK LINE ! 14769: MOV =VDMKW,XL POINT TO LIST OF KEYWORD SVBLK PTRS ! 14770: EJC ! 14771: * ! 14772: * DUMPR (CONTINUED) ! 14773: * ! 14774: * LOOP TO DUMP KEYWORD VALUES ! 14775: * ! 14776: DMP12 MOV (XL)+,XR LOAD NEXT SVBLK PTR FROM TABLE ! 14777: BZE XR,DMP13 JUMP IF END OF LIST ! 14778: MOV =CH$AM,WA LOAD AMPERSAND ! 14779: JSR PRTCH PRINT AMPERSAND ! 14780: JSR PRTST PRINT KEYWORD NAME ! 14781: MOV SVLEN(XR),WA LOAD NAME LENGTH FROM SVBLK ! 14782: CTB WA,SVCHS GET LENGTH OF NAME ! 14783: ADD WA,XR POINT TO SVKNM FIELD ! 14784: MOV (XR),DMPKN STORE IN DUMMY KVBLK ! 14785: MOV =TMBEB,XR POINT TO BLANK-EQUAL-BLANK ! 14786: JSR PRTST PRINT IT ! 14787: MOV XL,DMPSV SAVE TABLE POINTER ! 14788: MOV =DMPKB,XL POINT TO DUMMY KVBLK ! 14789: MOV *KVVAR,WA SET ZERO OFFSET ! 14790: JSR ACESS GET KEYWORD VALUE ! 14791: PPM FAILURE IS IMPOSSIBLE ! 14792: JSR PRTVL PRINT KEYWORD VALUE ! 14793: JSR PRTNL TERMINATE PRINT LINE ! 14794: MOV DMPSV,XL RESTORE TABLE POINTER ! 14795: BRN DMP12 LOOP BACK TILL ALL PRINTED ! 14796: * ! 14797: * HERE AFTER COMPLETING PARTIAL DUMP ! 14798: * ! 14799: DMP13 BEQ DMARG,=NUM01,DMP27 EXIT IF PARTIAL DUMP COMPLETE ! 14800: MOV DNAMB,XR ELSE POINT TO FIRST DYNAMIC BLOCK ! 14801: * ! 14802: * LOOP THROUGH BLOCKS IN DYNAMIC STORAGE ! 14803: * ! 14804: DMP14 BEQ XR,DNAMP,DMP27 JUMP IF END OF USED REGION ! 14805: MOV (XR),WA ELSE LOAD FIRST WORD OF BLOCK ! 14806: BEQ WA,=B$VCT,DMP16 JUMP IF VECTOR ! 14807: BEQ WA,=B$ART,DMP17 JUMP IF ARRAY ! 14808: BEQ WA,=B$PDT,DMP18 JUMP IF PROGRAM DEFINED ! 14809: BEQ WA,=B$TBT,DMP19 JUMP IF TABLE ! 14810: BEQ WA,=B$BCT,DMP30 JUMP IF BUFFER ! 14811: * ! 14812: * MERGE HERE TO MOVE TO NEXT BLOCK ! 14813: * ! 14814: DMP15 JSR BLKLN GET LENGTH OF BLOCK ! 14815: ADD WA,XR POINT PAST THIS BLOCK ! 14816: BRN DMP14 LOOP BACK FOR NEXT BLOCK ! 14817: EJC ! 14818: * ! 14819: * DUMPR (CONTINUED) ! 14820: * ! 14821: * HERE FOR VECTOR ! 14822: * ! 14823: DMP16 MOV *VCVLS,WB SET OFFSET TO FIRST VALUE ! 14824: BRN DMP19 JUMP TO MERGE ! 14825: * ! 14826: * HERE FOR ARRAY ! 14827: * ! 14828: DMP17 MOV AROFS(XR),WB SET OFFSET TO ARPRO FIELD ! 14829: ICA WB BUMP TO GET OFFSET TO VALUES ! 14830: BRN DMP19 JUMP TO MERGE ! 14831: * ! 14832: * HERE FOR PROGRAM DEFINED ! 14833: * ! 14834: DMP18 MOV *PDFLD,WB POINT TO VALUES, MERGE ! 14835: * ! 14836: * HERE FOR TABLE (OTHERS MERGE) ! 14837: * ! 14838: DMP19 BZE IDVAL(XR),DMP15 IGNORE BLOCK IF ZERO ID VALUE ! 14839: JSR BLKLN ELSE GET BLOCK LENGTH ! 14840: MOV XR,XL COPY BLOCK POINTER ! 14841: MOV WA,DMPSV SAVE LENGTH ! 14842: MOV WB,WA COPY OFFSET TO FIRST VALUE ! 14843: JSR PRTNL PRINT BLANK LINE ! 14844: MOV WA,DMPSA PRESERVE OFFSET ! 14845: JSR PRTVL PRINT BLOCK VALUE (FOR TITLE) ! 14846: MOV DMPSA,WA RECOVER OFFSET ! 14847: JSR PRTNL END PRINT LINE ! 14848: BEQ (XR),=B$TBT,DMP22 JUMP IF TABLE ! 14849: DCA WA POINT BEFORE FIRST WORD ! 14850: * ! 14851: * LOOP TO PRINT CONTENTS OF ARRAY, VECTOR, OR PROGRAM DEF ! 14852: * ! 14853: DMP20 MOV XL,XR COPY BLOCK POINTER ! 14854: ICA WA BUMP OFFSET ! 14855: ADD WA,XR POINT TO NEXT VALUE ! 14856: BEQ WA,DMPSV,DMP14 EXIT IF END (XR PAST BLOCK) ! 14857: SUB *VRVAL,XR SUBTRACT OFFSET TO MERGE INTO LOOP ! 14858: * ! 14859: * LOOP TO FIND VALUE AND IGNORE NULLS ! 14860: * ! 14861: DMP21 MOV VRVAL(XR),XR LOAD NEXT VALUE ! 14862: BEQ XR,=NULLS,DMP20 LOOP BACK IF NULL VALUE ! 14863: BEQ (XR),=B$TRT,DMP21 LOOP BACK IF TRAPPED ! 14864: JSR PRTNV ELSE PRINT NAME = VALUE ! 14865: BRN DMP20 LOOP BACK FOR NEXT FIELD ! 14866: EJC ! 14867: * ! 14868: * DUMPR (CONTINUED) ! 14869: * ! 14870: * HERE TO DUMP A TABLE ! 14871: * ! 14872: DMP22 MOV *TBBUK,WC SET OFFSET TO FIRST BUCKET ! 14873: MOV *TEVAL,WA SET NAME OFFSET FOR ALL TEBLKS ! 14874: * ! 14875: * LOOP THROUGH TABLE BUCKETS ! 14876: * ! 14877: DMP23 MOV XL,-(XS) SAVE TBBLK POINTER ! 14878: ADD WC,XL POINT TO NEXT BUCKET HEADER ! 14879: ICA WC BUMP BUCKET OFFSET ! 14880: SUB *TENXT,XL SUBTRACT OFFSET TO MERGE INTO LOOP ! 14881: * ! 14882: * LOOP TO PROCESS TEBLKS ON ONE CHAIN ! 14883: * ! 14884: DMP24 MOV TENXT(XL),XL POINT TO NEXT TEBLK ! 14885: BEQ XL,(XS),DMP26 JUMP IF END OF CHAIN ! 14886: MOV XL,XR ELSE COPY TEBLK POINTER ! 14887: * ! 14888: * LOOP TO FIND VALUE AND IGNORE IF NULL ! 14889: * ! 14890: DMP25 MOV TEVAL(XR),XR LOAD NEXT VALUE ! 14891: BEQ XR,=NULLS,DMP24 IGNORE IF NULL VALUE ! 14892: BEQ (XR),=B$TRT,DMP25 LOOP BACK IF TRAPPED ! 14893: MOV WC,DMPSV ELSE SAVE OFFSET POINTER ! 14894: JSR PRTNV PRINT NAME = VALUE ! 14895: MOV DMPSV,WC RELOAD OFFSET ! 14896: BRN DMP24 LOOP BACK FOR NEXT TEBLK ! 14897: * ! 14898: * HERE TO MOVE TO NEXT HASH CHAIN ! 14899: * ! 14900: DMP26 MOV (XS)+,XL RESTORE TBBLK POINTER ! 14901: BNE WC,TBLEN(XL),DMP23 LOOP BACK IF MORE BUCKETS TO GO ! 14902: MOV XL,XR ELSE COPY TABLE POINTER ! 14903: ADD WC,XR POINT TO FOLLOWING BLOCK ! 14904: BRN DMP14 LOOP BACK TO PROCESS NEXT BLOCK ! 14905: * ! 14906: * HERE AFTER COMPLETING DUMP ! 14907: * ! 14908: DMP27 JSR PRTPG EJECT PRINTER ! 14909: * ! 14910: * MERGE HERE IF NO DUMP GIVEN (DMARG=0) ! 14911: * ! 14912: DMP28 EXI RETURN TO DUMP CALLER ! 14913: * ! 14914: * CALL SYSTEM CORE DUMP ROUTINE ! 14915: * ! 14916: DMP29 JSR SYSDM CALL IT ! 14917: BRN DMP28 RETURN ! 14918: EJC ! 14919: * ! 14920: * DUMPR (CONTINUED) ! 14921: * ! 14922: * HERE TO DUMP BUFFER BLOCK ! 14923: * ! 14924: DMP30 JSR PRTNL PRINT BLANK LINE ! 14925: JSR PRTVL PRINT VALUE ID FOR TITLE ! 14926: JSR PRTNL FORCE NEW LINE ! 14927: MOV =CH$DQ,WA LOAD DOUBLE QUOTE ! 14928: JSR PRTCH PRINT IT ! 14929: MOV BCLEN(XR),WC LOAD DEFINED LENGTH ! 14930: BZE WC,DMP32 SKIP CHARACTERS IF NONE ! 14931: LCT WC,WC LOAD COUNT FOR LOOP ! 14932: MOV XR,WB SAVE BCBLK PTR ! 14933: MOV BCBUF(XR),XR POINT TO BFBLK ! 14934: PLC XR GET SET TO LOAD CHARACTERS ! 14935: * ! 14936: * LOOP HERE STUFFING CHARACTERS IN OUTPUT STREAM ! 14937: * ! 14938: DMP31 LCH WA,(XR)+ GET NEXT CHARACTER ! 14939: JSR PRTCH STUFF IT ! 14940: BCT WC,DMP31 BRANCH FOR NEXT ONE ! 14941: MOV WB,XR RESTORE BCBLK POINTER ! 14942: * ! 14943: * MERGE TO STUFF CLOSING QUOTE MARK ! 14944: * ! 14945: DMP32 MOV =CH$DQ,WA STUFF QUOTE ! 14946: JSR PRTCH PRINT IT ! 14947: JSR PRTNL PRINT NEW LINE ! 14948: MOV (XR),WA GET FIRST WD FOR BLKLN ! 14949: BRN DMP15 MERGE TO GET NEXT BLOCK ! 14950: ENP END PROCEDURE DUMPR ! 14951: EJC ! 14952: * ! 14953: * ERMSG -- PRINT ERROR CODE AND ERROR MESSAGE ! 14954: * ! 14955: * KVERT ERROR CODE ! 14956: * JSR ERMSG CALL TO PRINT MESSAGE ! 14957: * (XR,XL,WA,WB,WC,IA) DESTROYED ! 14958: * ! 14959: ERMSG PRC E,0 ENTRY POINT ! 14960: JSR PRTIS PRINT ERROR PTR OR BLANK LINE ! 14961: MOV KVERT,WA LOAD ERROR CODE ! 14962: MOV =ERMMS,XR POINT TO ERROR MESSAGE /ERROR/ ! 14963: JSR PRTST PRINT IT ! 14964: JSR ERTEX GET ERROR MESSAGE TEXT ! 14965: ADD =THSND,WA BUMP ERROR CODE FOR PRINT ! 14966: MTI WA FAIL CODE IN INT ACC ! 14967: JSR PRTIN PRINT CODE (NOW HAVE ERROR1XXX) ! 14968: MOV PRBUF,XL POINT TO PRINT BUFFER ! 14969: PSC XL,=NUM05 POINT TO THE 1 ! 14970: MOV =CH$BL,WA LOAD A BLANK ! 14971: SCH WA,(XL) STORE BLANK OVER 1 (ERROR XXX) ! 14972: CSC XL COMPLETE STORE CHARACTERS ! 14973: ZER XL CLEAR GARBAGE POINTER IN XL ! 14974: MOV XR,WA KEEP ERROR TEXT ! 14975: MOV =ERMNS,XR POINT TO / -- / ! 14976: JSR PRTST PRINT IT ! 14977: MOV WA,XR GET ERROR TEXT AGAIN ! 14978: JSR PRTST PRINT ERROR MESSAGE TEXT ! 14979: JSR PRTIS PRINT LINE ! 14980: JSR PRTIS PRINT BLANK LINE ! 14981: EXI RETURN TO ERMSG CALLER ! 14982: ENP END PROCEDURE ERMSG ! 14983: EJC ! 14984: * ! 14985: * ERTEX -- GET ERROR MESSAGE TEXT ! 14986: * ! 14987: * (WA) ERROR CODE ! 14988: * JSR ERTEX CALL TO GET ERROR TEXT ! 14989: * (XR) PTR TO ERROR TEXT IN DYNAMIC ! 14990: * (R$ETX) COPY OF PTR TO ERROR TEXT ! 14991: * (XL,WC,IA) DESTROYED ! 14992: * ! 14993: ERTEX PRC E,0 ENTRY POINT ! 14994: MOV WA,ERTWA SAVE WA ! 14995: MOV WB,ERTWB SAVE WB ! 14996: JSR SYSEM GET FAILURE MESSAGE TEXT ! 14997: MOV XR,XL COPY POINTER TO IT ! 14998: MOV SCLEN(XR),WA GET LENGTH OF STRING ! 14999: BZE WA,ERT02 JUMP IF NULL ! 15000: ZER WB OFFSET OF ZERO ! 15001: JSR SBSTR COPY INTO DYNAMIC STORE ! 15002: MOV XR,R$ETX STORE FOR RELOCATION ! 15003: * ! 15004: * RETURN ! 15005: * ! 15006: ERT01 MOV ERTWB,WB RESTORE WB ! 15007: MOV ERTWA,WA RESTORE WA ! 15008: EXI RETURN TO CALLER ! 15009: * ! 15010: * RETURN ERRTEXT CONTENTS INSTEAD OF NULL ! 15011: * ! 15012: ERT02 MOV R$ETX,XR GET ERRTEXT ! 15013: BRN ERT01 RETURN ! 15014: ENP ! 15015: EJC ! 15016: * ! 15017: * EVALI -- EVALUATE INTEGER ARGUMENT ! 15018: * ! 15019: * EVALI IS USED BY PATTERN PRIMITIVES LEN,TAB,RTAB,POS,RPOS ! 15020: * WHEN THEIR ARGUMENT IS AN EXPRESSION VALUE. ! 15021: * ! 15022: * (XR) NODE POINTER ! 15023: * (WB) CURSOR ! 15024: * JSR EVALI CALL TO EVALUATE INTEGER ! 15025: * PPM LOC TRANSFER LOC FOR NON-INTEGER ARG ! 15026: * PPM LOC TRANSFER LOC FOR OUT OF RANGE ARG ! 15027: * PPM LOC TRANSFER LOC FOR EVALUATION FAILURE ! 15028: * PPM LOC TRANSFER LOC FOR SUCCESSFUL EVAL ! 15029: * (THE NORMAL RETURN IS NEVER TAKEN) ! 15030: * (XR) PTR TO NODE WITH INTEGER ARGUMENT ! 15031: * (WC,XL,RA) DESTROYED ! 15032: * ! 15033: * ON RETURN, THE NODE POINTED TO HAS THE INTEGER ARGUMENT ! 15034: * IN PARM1 AND THE PROPER SUCCESSOR POINTER IN PTHEN. ! 15035: * THIS ALLOWS MERGING WITH THE NORMAL (INTEGER ARG) CASE. ! 15036: * ! 15037: EVALI PRC R,4 ENTRY POINT (RECURSIVE) ! 15038: JSR EVALP EVALUATE EXPRESSION ! 15039: PPM EVLI1 JUMP ON FAILURE ! 15040: MOV XL,-(XS) STACK RESULT FOR GTSMI ! 15041: MOV PTHEN(XR),XL LOAD SUCCESSOR POINTER ! 15042: JSR GTSMI CONVERT ARG TO SMALL INTEGER ! 15043: PPM EVLI2 JUMP IF NOT INTEGER ! 15044: PPM EVLI3 JUMP IF OUT OF RANGE ! 15045: MOV XR,EVLIV STORE RESULT IN SPECIAL DUMMY NODE ! 15046: MOV XL,EVLIS STORE SUCCESSOR POINTER ! 15047: MOV =EVLIN,XR POINT TO DUMMY NODE WITH RESULT ! 15048: EXI 4 TAKE SUCCESSFUL EXIT ! 15049: * ! 15050: * HERE IF EVALUATION FAILS ! 15051: * ! 15052: EVLI1 EXI 3 TAKE FAILURE RETURN ! 15053: * ! 15054: * HERE IF ARGUMENT IS NOT INTEGER ! 15055: * ! 15056: EVLI2 EXI 1 TAKE NON-INTEGER ERROR EXIT ! 15057: * ! 15058: * HERE IF ARGUMENT IS OUT OF RANGE ! 15059: * ! 15060: EVLI3 EXI 2 TAKE OUT-OF-RANGE ERROR EXIT ! 15061: ENP END PROCEDURE EVALI ! 15062: EJC ! 15063: * ! 15064: * EVALP -- EVALUATE EXPRESSION DURING PATTERN MATCH ! 15065: * ! 15066: * EVALP IS USED TO EVALUATE AN EXPRESSION (BY VALUE) DURING ! 15067: * A PATTERN MATCH. THE EFFECT IS LIKE EVALX, BUT PATTERN ! 15068: * VARIABLES ARE STACKED AND RESTORED IF NECESSARY. ! 15069: * ! 15070: * EVALP ALSO DIFFERS FROM EVALX IN THAT IF THE RESULT IS ! 15071: * AN EXPRESSION IT IS REEVALUATED. THIS OCCURS REPEATEDLY. ! 15072: * ! 15073: * (XR) NODE POINTER ! 15074: * (WB) PATTERN MATCH CURSOR ! 15075: * JSR EVALP CALL TO EVALUATE EXPRESSION ! 15076: * PPM LOC TRANSFER LOC IF EVALUATION FAILS ! 15077: * (XL) RESULT ! 15078: * (WA) FIRST WORD OF RESULT BLOCK ! 15079: * (XR,WB) DESTROYED (FAILURE CASE ONLY) ! 15080: * (WC,RA) DESTROYED ! 15081: * ! 15082: * THE EXPRESSION POINTER IS STORED IN PARM1 OF THE NODE ! 15083: * ! 15084: * CONTROL RETURNS TO FAILP ON FAILURE OF EVALUATION ! 15085: * ! 15086: EVALP PRC R,1 ENTRY POINT (RECURSIVE) ! 15087: MOV PARM1(XR),XL LOAD EXPRESSION POINTER ! 15088: BEQ (XL),=B$EXL,EVLP1 JUMP IF EXBLK CASE ! 15089: * ! 15090: * HERE FOR CASE OF SEBLK ! 15091: * ! 15092: * WE CAN GIVE A FAST RETURN IF THE VALUE OF THE VRBLK IS ! 15093: * NOT AN EXPRESSION AND IS NOT TRAPPED. ! 15094: * ! 15095: MOV SEVAR(XL),XL LOAD VRBLK POINTER ! 15096: MOV VRVAL(XL),XL LOAD VALUE OF VRBLK ! 15097: MOV (XL),WA LOAD FIRST WORD OF VALUE ! 15098: BHI WA,=B$T$$,EVLP3 JUMP IF NOT SEBLK, TRBLK OR EXBLK ! 15099: * ! 15100: * HERE FOR EXBLK OR SEBLK WITH EXPR VALUE OR TRAPPED VALUE ! 15101: * ! 15102: EVLP1 MOV XR,-(XS) STACK NODE POINTER ! 15103: MOV WB,-(XS) STACK CURSOR ! 15104: MOV R$PMS,-(XS) STACK SUBJECT STRING POINTER ! 15105: MOV PMSSL,-(XS) STACK SUBJECT STRING LENGTH ! 15106: MOV PMDFL,-(XS) STACK DOT FLAG ! 15107: MOV PMHBS,-(XS) STACK HISTORY STACK BASE POINTER ! 15108: MOV PARM1(XR),XR LOAD EXPRESSION POINTER ! 15109: EJC ! 15110: * ! 15111: * EVALP (CONTINUED) ! 15112: * ! 15113: * LOOP BACK HERE TO REEVALUATE EXPRESSION RESULT ! 15114: * ! 15115: EVLP2 ZER WB SET FLAG FOR BY VALUE ! 15116: JSR EVALX EVALUATE EXPRESSION ! 15117: PPM EVLP4 JUMP ON FAILURE ! 15118: MOV (XR),WA ELSE LOAD FIRST WORD OF VALUE ! 15119: BLO WA,=B$E$$,EVLP2 LOOP BACK TO REEVALUATE EXPRESSION ! 15120: * ! 15121: * HERE TO RESTORE PATTERN VALUES AFTER SUCCESSFUL EVAL ! 15122: * ! 15123: MOV XR,XL COPY RESULT POINTER ! 15124: MOV (XS)+,PMHBS RESTORE HISTORY STACK BASE POINTER ! 15125: MOV (XS)+,PMDFL RESTORE DOT FLAG ! 15126: MOV (XS)+,PMSSL RESTORE SUBJECT STRING LENGTH ! 15127: MOV (XS)+,R$PMS RESTORE SUBJECT STRING POINTER ! 15128: MOV (XS)+,WB RESTORE CURSOR ! 15129: MOV (XS)+,XR RESTORE NODE POINTER ! 15130: * ! 15131: * COMMON EXIT POINT ! 15132: * ! 15133: EVLP3 EXI RETURN TO EVALP CALLER ! 15134: * ! 15135: * HERE FOR FAILURE DURING EVALUATION ! 15136: * ! 15137: EVLP4 MOV (XS)+,PMHBS RESTORE HISTORY STACK BASE POINTER ! 15138: MOV (XS)+,PMDFL RESTORE DOT FLAG ! 15139: MOV (XS)+,PMSSL RESTORE SUBJECT STRING LENGTH ! 15140: MOV (XS)+,R$PMS RESTORE SUBJECT STRING POINTER ! 15141: ADD *NUM02,XS REMOVE NODE PTR, CURSOR ! 15142: EXI 1 TAKE FAILURE EXIT ! 15143: ENP END PROCEDURE EVALP ! 15144: EJC ! 15145: * ! 15146: * EVALS -- EVALUATE STRING ARGUMENT ! 15147: * ! 15148: * EVALS IS USED BY SPAN, ANY, NOTANY, BREAK, BREAKX WHEN ! 15149: * THEY ARE PASSED AN EXPRESSION ARGUMENT. ! 15150: * ! 15151: * (XR) NODE POINTER ! 15152: * (WB) CURSOR ! 15153: * JSR EVALS CALL TO EVALUATE STRING ! 15154: * PPM LOC TRANSFER LOC FOR NON-STRING ARG ! 15155: * PPM LOC TRANSFER LOC FOR EVALUATION FAILURE ! 15156: * PPM LOC TRANSFER LOC FOR SUCCESSFUL EVAL ! 15157: * (THE NORMAL RETURN IS NEVER TAKEN) ! 15158: * (XR) PTR TO NODE WITH PARMS SET ! 15159: * (XL,WC,RA) DESTROYED ! 15160: * ! 15161: * ON RETURN, THE NODE POINTED TO HAS A CHARACTER TABLE ! 15162: * POINTER IN PARM1 AND A BIT MASK IN PARM2. THE PROPER ! 15163: * SUCCESSOR IS STORED IN PTHEN OF THIS NODE. THUS IT IS ! 15164: * OK FOR MERGING WITH THE NORMAL (MULTI-CHAR STRING) CASE. ! 15165: * ! 15166: EVALS PRC R,3 ENTRY POINT (RECURSIVE) ! 15167: JSR EVALP EVALUATE EXPRESSION ! 15168: PPM EVLS1 JUMP IF EVALUATION FAILS ! 15169: MOV PTHEN(XR),-(XS) SAVE SUCCESSOR POINTER ! 15170: MOV WB,-(XS) SAVE CURSOR ! 15171: MOV XL,-(XS) STACK RESULT PTR FOR PATST ! 15172: ZER WB DUMMY PCODE FOR ONE CHAR STRING ! 15173: ZER WC DUMMY PCODE FOR EXPRESSION ARG ! 15174: MOV =P$BRK,XL APPROPRIATE PCODE FOR OUR USE ! 15175: JSR PATST CALL ROUTINE TO BUILD NODE ! 15176: PPM EVLS2 JUMP IF NOT STRING ! 15177: MOV (XS)+,WB RESTORE CURSOR ! 15178: MOV (XS)+,PTHEN(XR) STORE SUCCESSOR POINTER ! 15179: EXI 3 TAKE SUCCESS RETURN ! 15180: * ! 15181: * HERE IF EVALUATION FAILS ! 15182: * ! 15183: EVLS1 EXI 2 TAKE FAILURE RETURN ! 15184: * ! 15185: * HERE IF ARGUMENT IS NOT STRING ! 15186: * ! 15187: EVLS2 ADD *NUM02,XS POP SUCCESSOR AND CURSOR ! 15188: EXI 1 TAKE NON-STRING ERROR EXIT ! 15189: ENP END PROCEDURE EVALS ! 15190: EJC ! 15191: * ! 15192: * EVALX -- EVALUATE EXPRESSION ! 15193: * ! 15194: * EVALX IS CALLED TO EVALUATE AN EXPRESSION ! 15195: * ! 15196: * (XR) POINTER TO EXBLK OR SEBLK ! 15197: * (WB) 0 IF BY VALUE, 1 IF BY NAME ! 15198: * JSR EVALX CALL TO EVALUATE EXPRESSION ! 15199: * PPM LOC TRANSFER LOC IF EVALUATION FAILS ! 15200: * (XR) RESULT IF CALLED BY VALUE ! 15201: * (XL,WA) RESULT NAME BASE,OFFSET IF BY NAME ! 15202: * (XR) DESTROYED (NAME CASE ONLY) ! 15203: * (XL,WA) DESTROYED (VALUE CASE ONLY) ! 15204: * (WB,WC,RA) DESTROYED ! 15205: * ! 15206: EVALX PRC R,1 ENTRY POINT, RECURSIVE ! 15207: BEQ (XR),=B$EXL,EVLX2 JUMP IF EXBLK CASE ! 15208: * ! 15209: * HERE FOR SEBLK ! 15210: * ! 15211: MOV SEVAR(XR),XL LOAD VRBLK POINTER (NAME BASE) ! 15212: MOV *VRVAL,WA SET NAME OFFSET ! 15213: BNZ WB,EVLX1 JUMP IF CALLED BY NAME ! 15214: JSR ACESS CALL ROUTINE TO ACCESS VALUE ! 15215: PPM EVLX9 JUMP IF FAILURE ON ACCESS ! 15216: * ! 15217: * MERGE HERE TO EXIT FOR SEBLK CASE ! 15218: * ! 15219: EVLX1 EXI RETURN TO EVALX CALLER ! 15220: EJC ! 15221: * ! 15222: * EVALX (CONTINUED) ! 15223: * ! 15224: * HERE FOR FULL EXPRESSION (EXBLK) CASE ! 15225: * ! 15226: * IF AN ERROR OCCURS IN THE EXPRESSION CODE AT EXECUTION ! 15227: * TIME, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL ! 15228: * WITHOUT RETURNING TO THIS ROUTINE. ! 15229: * THE FOLLOWING ENTRIES ARE MADE ON THE STACK BEFORE ! 15230: * GIVING CONTROL TO THE EXPRESSION CODE ! 15231: * ! 15232: * EVALX RETURN POINT ! 15233: * SAVED VALUE OF R$COD ! 15234: * CODE POINTER (-R$COD) ! 15235: * SAVED VALUE OF FLPTR ! 15236: * 0 IF BY VALUE, 1 IF BY NAME ! 15237: * FLPTR --------------- *EXFLC, FAIL OFFSET IN EXBLK ! 15238: * ! 15239: EVLX2 SCP WC GET CODE POINTER ! 15240: MOV R$COD,WA LOAD CODE BLOCK POINTER ! 15241: SUB WA,WC GET CODE POINTER AS OFFSET ! 15242: MOV WA,-(XS) STACK OLD CODE BLOCK POINTER ! 15243: MOV WC,-(XS) STACK RELATIVE CODE OFFSET ! 15244: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER ! 15245: MOV WB,-(XS) STACK NAME/VALUE INDICATOR ! 15246: MOV *EXFLC,-(XS) STACK NEW FAIL OFFSET ! 15247: MOV FLPTR,GTCEF KEEP IN CASE OF ERROR ! 15248: MOV R$COD,R$GTC KEEP CODE BLOCK POINTER SIMILARLY ! 15249: MOV XS,FLPTR SET NEW FAILURE POINTER ! 15250: MOV XR,R$COD SET NEW CODE BLOCK POINTER ! 15251: MOV KVSTN,EXSTM(XR) REMEMBER STMNT NUMBER ! 15252: ADD *EXCOD,XR POINT TO FIRST CODE WORD ! 15253: LCP XR SET CODE POINTER ! 15254: BNE STAGE,=STGXT,EXITS JUMP IF NOT EXECUTION TIME ! 15255: MOV =STGEE,STAGE EVALUATING EXPRESSION ! 15256: BRN EXITS JUMP TO EXECUTE FIRST CODE WORD ! 15257: EJC ! 15258: * ! 15259: * EVALX (CONTINUED) ! 15260: * ! 15261: * COME HERE IF SUCCESSFUL RETURN BY VALUE (SEE O$RVL) ! 15262: * ! 15263: EVLX3 MOV (XS)+,XR LOAD VALUE ! 15264: BZE 1(XS),EVLX5 JUMP IF CALLED BY VALUE ! 15265: ERB 249,EXPRESSION EVALUATED BY NAME RETURNED VALUE ! 15266: * ! 15267: * HERE FOR EXPRESSION RETURNING BY NAME (SEE O$RNM) ! 15268: * ! 15269: EVLX4 MOV (XS)+,WA LOAD NAME OFFSET ! 15270: MOV (XS)+,XL LOAD NAME BASE ! 15271: BNZ 1(XS),EVLX5 JUMP IF CALLED BY NAME ! 15272: JSR ACESS ELSE ACCESS VALUE FIRST ! 15273: PPM EVLX6 JUMP IF FAILURE DURING ACCESS ! 15274: * ! 15275: * HERE AFTER LOADING CORRECT RESULT INTO XR OR XL,WA ! 15276: * ! 15277: EVLX5 ZER WB NOTE SUCCESSFUL ! 15278: BRN EVLX7 MERGE ! 15279: * ! 15280: * HERE FOR FAILURE IN EXPRESSION EVALUATION (SEE O$FEX) ! 15281: * ! 15282: EVLX6 MNZ WB NOTE UNSUCCESSFUL ! 15283: * ! 15284: * RESTORE ENVIRONMENT ! 15285: * ! 15286: EVLX7 BNE STAGE,=STGEE,EVLX8 SKIP IF WAS NOT PREVIOUSLY XT ! 15287: MOV =STGXT,STAGE EXECUTE TIME ! 15288: * ! 15289: * MERGE WITH STAGE SET UP ! 15290: * ! 15291: EVLX8 ADD *NUM02,XS POP NAME/VALUE INDICATOR, *EXFAL ! 15292: MOV (XS)+,FLPTR RESTORE OLD FAILURE POINTER ! 15293: MOV (XS)+,WC LOAD CODE OFFSET ! 15294: ADD (XS),WC MAKE CODE POINTER ABSOLUTE ! 15295: MOV (XS)+,R$COD RESTORE OLD CODE BLOCK POINTER ! 15296: LCP WC RESTORE OLD CODE POINTER ! 15297: BZE WB,EVLX1 JUMP FOR SUCCESSFUL RETURN ! 15298: * ! 15299: * MERGE HERE FOR FAILURE IN SEBLK CASE ! 15300: * ! 15301: EVLX9 EXI 1 TAKE FAILURE EXIT ! 15302: ENP END OF PROCEDURE EVALX ! 15303: EJC ! 15304: * ! 15305: * EXBLD -- BUILD EXBLK ! 15306: * ! 15307: * EXBLD IS USED TO BUILD AN EXPRESSION BLOCK FROM THE ! 15308: * CODE COMPILED MOST RECENTLY IN THE CURRENT CCBLK. ! 15309: * ! 15310: * (XL) OFFSET IN CCBLK TO START OF CODE ! 15311: * (WB) INTEGER IN RANGE 0 LE N LE MXLEN ! 15312: * JSR EXBLD CALL TO BUILD EXBLK ! 15313: * (XR) PTR TO CONSTRUCTED EXBLK ! 15314: * (WA,WB,XL) DESTROYED ! 15315: * ! 15316: EXBLD PRC E,0 ENTRY POINT ! 15317: MOV XL,WA COPY OFFSET TO START OF CODE ! 15318: SUB *EXCOD,WA CALC REDUCTION IN OFFSET IN EXBLK ! 15319: MOV WA,-(XS) STACK FOR LATER ! 15320: MOV CWCOF,WA LOAD FINAL OFFSET ! 15321: SUB XL,WA COMPUTE LENGTH OF CODE ! 15322: ADD *EXSI$,WA ADD SPACE FOR STANDARD FIELDS ! 15323: JSR ALLOC ALLOCATE SPACE FOR EXBLK ! 15324: MOV XR,-(XS) SAVE POINTER TO EXBLK ! 15325: MOV =B$EXL,EXTYP(XR) STORE TYPE WORD ! 15326: ZER EXSTM(XR) ZEROISE STMNT NUMBER FIELD ! 15327: MOV WA,EXLEN(XR) STORE LENGTH ! 15328: MOV =OFEX$,EXFLC(XR) STORE FAILURE WORD ! 15329: ADD *EXSI$,XR SET XR FOR SYSMW ! 15330: MOV XL,CWCOF RESET OFFSET TO START OF CODE ! 15331: ADD R$CCB,XL POINT TO START OF CODE ! 15332: SUB *EXSI$,WA LENGTH OF CODE TO MOVE ! 15333: MOV WA,-(XS) STACK LENGTH OF CODE ! 15334: MVW MOVE CODE TO EXBLK ! 15335: MOV (XS)+,WA GET LENGTH OF CODE ! 15336: BTW WA CONVERT BYTE COUNT TO WORD COUNT ! 15337: LCT WA,WA PREPARE COUNTER FOR LOOP ! 15338: MOV (XS),XL COPY EXBLK PTR, DONT UNSTACK ! 15339: ADD *EXCOD,XL POINT TO CODE ITSELF ! 15340: MOV 1(XS),WB GET REDUCTION IN OFFSET ! 15341: * ! 15342: * THIS LOOP SEARCHES FOR NEGATION AND SELECTION CODE SO ! 15343: * THAT THE OFFSETS COMPUTED WHILST CODE WAS IN CODE BLOCK ! 15344: * CAN BE TRANSFORMED TO REDUCED VALUES APPLICABLE IN AN ! 15345: * EXBLK. ! 15346: * ! 15347: EXBL1 MOV (XL)+,XR GET NEXT CODE WORD ! 15348: BEQ XR,=OSLA$,EXBL3 JUMP IF SELECTION FOUND ! 15349: BEQ XR,=ONTA$,EXBL3 JUMP IF NEGATION FOUND ! 15350: BCT WA,EXBL1 LOOP TO END OF CODE ! 15351: * ! 15352: * NO SELECTION FOUND OR MERGE TO EXIT ON TERMINATION ! 15353: * ! 15354: EXBL2 MOV (XS)+,XR POP EXBLK PTR INTO XR ! 15355: MOV (XS)+,XL POP REDUCTION CONSTANT ! 15356: EXI RETURN TO CALLER ! 15357: EJC ! 15358: * ! 15359: * EXBLD (CONTINUED) ! 15360: * ! 15361: * SELECTION OR NEGATION FOUND ! 15362: * REDUCE THE OFFSETS AS NEEDED. OFFSETS OCCUR IN WORDS ! 15363: * FOLLOWING CODE WORDS - ! 15364: * =ONTA$, =OSLA$, =OSLB$, =OSLC$ ! 15365: * ! 15366: EXBL3 SUB WB,(XL)+ ADJUST OFFSET ! 15367: BCT WA,EXBL4 DECREMENT COUNT ! 15368: * ! 15369: EXBL4 BCT WA,EXBL5 DECREMENT COUNT ! 15370: * ! 15371: * CONTINUE SEARCH FOR MORE OFFSETS ! 15372: * ! 15373: EXBL5 MOV (XL)+,XR GET NEXT CODE WORD ! 15374: BEQ XR,=OSLA$,EXBL3 JUMP IF OFFSET FOUND ! 15375: BEQ XR,=OSLB$,EXBL3 JUMP IF OFFSET FOUND ! 15376: BEQ XR,=OSLC$,EXBL3 JUMP IF OFFSET FOUND ! 15377: BEQ XR,=ONTA$,EXBL3 JUMP IF OFFSET FOUND ! 15378: BCT WA,EXBL5 LOOP ! 15379: BRN EXBL2 MERGE TO RETURN ! 15380: ENP END PROCEDURE EXBLD ! 15381: EJC ! 15382: * ! 15383: * EXPAN -- ANALYZE EXPRESSION ! 15384: * ! 15385: * THE EXPRESSION ANALYZER (EXPAN) PROCEDURE IS USED TO SCAN ! 15386: * AN EXPRESSION AND CONVERT IT INTO A TREE REPRESENTATION. ! 15387: * SEE DESCRIPTIONS OF CMBLK, CUBLK, CBBLK IN THE STRUCTURES ! 15388: * SECTION FOR DETAILED FORMAT OF TREE BLOCKS. ! 15389: * ! 15390: * THE ANALYZER USES A SIMPLE PRECEDENCE SCHEME IN WHICH ! 15391: * OPERANDS AND OPERATORS ARE PLACED ON A SINGLE STACK ! 15392: * AND CONDENSATIONS ARE MADE WHEN LOW PRECEDENCE OPERATORS ! 15393: * ARE STACKED AFTER A HIGHER PRECEDENCE OPERATOR. A GLOBAL ! 15394: * VARIABLE (IN WB) KEEPS TRACK OF THE LEVEL AS FOLLOWS. ! 15395: * ! 15396: * 0 SCANNING OUTER LEVEL OF STATEMENT OR EXPRESSION ! 15397: * 1 SCANNING OUTER LEVEL OF NORMAL GOTO ! 15398: * 2 SCANNING OUTER LEVEL OF DIRECT GOTO ! 15399: * 3 SCANNING INSIDE ARRAY BRACKETS ! 15400: * 4 SCANNING INSIDE GROUPING PARENTHESES ! 15401: * 5 SCANNING INSIDE FUNCTION PARENTHESES ! 15402: * ! 15403: * THIS VARIABLE IS SAVED ON THE STACK ON ENCOUNTERING A ! 15404: * GROUPING AND RESTORED AT THE END OF THE GROUPING. ! 15405: * ! 15406: * ANOTHER GLOBAL VARIABLE (IN WC) COUNTS THE NUMBER OF ! 15407: * ITEMS AT ONE GROUPING LEVEL AND IS INCREMENTED FOR EACH ! 15408: * COMMA ENCOUNTERED. IT IS STACKED WITH THE LEVEL INDICATOR ! 15409: * ! 15410: * THE SCAN IS CONTROLLED BY A THREE STATE FINITE MACHINE. ! 15411: * A GLOBAL VARIABLE STORED IN WA IS THE CURRENT STATE. ! 15412: * ! 15413: * WA=0 NOTHING SCANNED AT THIS LEVEL ! 15414: * WA=1 OPERAND EXPECTED ! 15415: * WA=2 OPERATOR EXPECTED ! 15416: * ! 15417: * (WB) CALL TYPE (SEE BELOW) ! 15418: * JSR EXPAN CALL TO ANALYZE EXPRESSION ! 15419: * (XR) POINTER TO RESULTING TREE ! 15420: * (XL,WA,WB,WC,RA) DESTROYED ! 15421: * ! 15422: * THE ENTRY VALUE OF WB INDICATES THE CALL TYPE AS FOLLOWS. ! 15423: * ! 15424: * 0 SCANNING EITHER THE MAIN BODY OF A STATEMENT OR THE ! 15425: * TEXT OF AN EXPRESSION (FROM EVAL CALL). VALID ! 15426: * TERMINATORS ARE COLON, SEMICOLON. THE RESCAN FLAG IS ! 15427: * SET TO RETURN THE TERMINATOR ON THE NEXT SCANE CALL. ! 15428: * ! 15429: * 1 SCANNING A NORMAL GOTO. THE ONLY VALID ! 15430: * TERMINATOR IS A RIGHT PAREN. ! 15431: * ! 15432: * 2 SCANNING A DIRECT GOTO. THE ONLY VALID ! 15433: * TERMINATOR IS A RIGHT BRACKET. ! 15434: EJC ! 15435: * ! 15436: * EXPAN (CONTINUED) ! 15437: * ! 15438: * ENTRY POINT ! 15439: * ! 15440: EXPAN PRC E,0 ENTRY POINT ! 15441: ZER -(XS) SET TOP OF STACK INDICATOR ! 15442: ZER WA SET INITIAL STATE TO ZERO ! 15443: ZER WC ZERO COUNTER VALUE ! 15444: * ! 15445: * LOOP HERE FOR SUCCESSIVE ENTRIES ! 15446: * ! 15447: EXP01 JSR SCANE SCAN NEXT ELEMENT ! 15448: ADD WA,XL ADD STATE TO SYNTAX CODE ! 15449: BSW XL,T$NES SWITCH ON ELEMENT TYPE/STATE ! 15450: IFF T$VA0,EXP03 VARIABLE, S=0 ! 15451: IFF T$VA1,EXP03 VARIABLE, STATE ONE ! 15452: IFF T$VA2,EXP04 VARIABLE, S=2 ! 15453: IFF T$CO0,EXP03 CONSTANT, S=0 ! 15454: IFF T$CO1,EXP03 CONSTANT, S=1 ! 15455: IFF T$CO2,EXP04 CONSTANT, 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$FN0,EXP10 FUNCTION, S=0 ! 15460: IFF T$FN1,EXP10 FUNCTION, S=1 ! 15461: IFF T$FN2,EXP04 FUNCTION, S=2 ! 15462: IFF T$RP0,EXP02 RIGHT PAREN, S=0 ! 15463: IFF T$RP1,EXP05 RIGHT PAREN, S=1 ! 15464: IFF T$RP2,EXP12 RIGHT PAREN, S=2 ! 15465: IFF T$LB0,EXP08 LEFT BRKT, S=0 ! 15466: IFF T$LB1,EXP08 LEFT BRKT, S=1 ! 15467: IFF T$LB2,EXP09 LEFT BRKT, S=2 ! 15468: IFF T$RB0,EXP02 RIGHT BRKT, S=0 ! 15469: IFF T$RB1,EXP05 RIGHT BRKT, S=1 ! 15470: IFF T$RB2,EXP18 RIGHT BRKT, S=2 ! 15471: IFF T$UO0,EXP27 UNOP, S=0 ! 15472: IFF T$UO1,EXP27 UNOP, S=1 ! 15473: IFF T$UO2,EXP04 UNOP, 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$CM0,EXP02 COMMA, S=0 ! 15478: IFF T$CM1,EXP05 COMMA, S=1 ! 15479: IFF T$CM2,EXP11 COMMA, S=2 ! 15480: IFF T$CL0,EXP02 COLON, S=0 ! 15481: IFF T$CL1,EXP05 COLON, S=1 ! 15482: IFF T$CL2,EXP19 COLON, S=2 ! 15483: IFF T$SM0,EXP02 SEMICOLON, S=0 ! 15484: IFF T$SM1,EXP05 SEMICOLON, S=1 ! 15485: IFF T$SM2,EXP19 SEMICOLON, S=2 ! 15486: ESW END SWITCH ON ELEMENT TYPE/STATE ! 15487: EJC ! 15488: * ! 15489: * EXPAN (CONTINUED) ! 15490: * ! 15491: * HERE FOR RBR,RPR,COL,SMC,CMA IN STATE 0 ! 15492: * ! 15493: * SET TO RESCAN THE TERMINATOR ENCOUNTERED AND CREATE ! 15494: * A NULL CONSTANT (CASE OF OMITTED NULL) ! 15495: * ! 15496: EXP02 MNZ SCNRS SET TO RESCAN ELEMENT ! 15497: MOV =NULLS,XR POINT TO NULL, MERGE ! 15498: * ! 15499: * HERE FOR VAR OR CON IN STATES 0,1 ! 15500: * ! 15501: * STACK THE VARIABLE/CONSTANT AND SET STATE=2 ! 15502: * ! 15503: EXP03 MOV XR,-(XS) STACK POINTER TO OPERAND ! 15504: MOV =NUM02,WA SET STATE 2 ! 15505: BRN EXP01 JUMP FOR NEXT ELEMENT ! 15506: * ! 15507: * HERE FOR VAR,CON,LPR,FNC,UOP IN STATE 2 ! 15508: * ! 15509: * WE RESCAN THE ELEMENT AND CREATE A CONCATENATION OPERATOR ! 15510: * THIS IS THE CASE OF THE BLANK CONCATENATION OPERATOR. ! 15511: * ! 15512: EXP04 MNZ SCNRS SET TO RESCAN ELEMENT ! 15513: MOV =OPDVC,XR POINT TO CONCAT OPERATOR DV ! 15514: BZE WB,EXP4A OK IF AT TOP LEVEL ! 15515: MOV =OPDVP,XR ELSE POINT TO UNMISTAKABLE CONCAT. ! 15516: * ! 15517: * MERGE HERE WHEN XR SET UP WITH PROPER CONCATENATION DVBLK ! 15518: * ! 15519: EXP4A BNZ SCNBL,EXP26 MERGE BOP IF BLANKS, ELSE ERROR ! 15520: DCV SCNSE ADJUST START OF ELEMENT LOCATION ! 15521: ERB 220,SYNTAX ERROR. MISSING OPERATOR ! 15522: * ! 15523: * HERE FOR CMA,RPR,RBR,COL,SMC,BOP(S=1) BOP(S=0) ! 15524: * ! 15525: * THIS IS AN ERRONOUS CONTRUCTION ! 15526: * ! 15527: EXP05 DCV SCNSE ADJUST START OF ELEMENT LOCATION ! 15528: ERB 221,SYNTAX ERROR. MISSING OPERAND ! 15529: * ! 15530: * HERE FOR LPR (S=0,1) ! 15531: * ! 15532: EXP06 MOV =NUM04,XL SET NEW LEVEL INDICATOR ! 15533: ZER XR SET ZERO VALUE FOR CMOPN ! 15534: EJC ! 15535: * ! 15536: * EXPAN (CONTINUED) ! 15537: * ! 15538: * MERGE HERE TO STORE OLD LEVEL ON STACK AND START NEW ONE ! 15539: * ! 15540: EXP07 MOV XR,-(XS) STACK CMOPN VALUE ! 15541: MOV WC,-(XS) STACK OLD COUNTER ! 15542: MOV WB,-(XS) STACK OLD LEVEL INDICATOR ! 15543: CHK CHECK FOR STACK OVERFLOW ! 15544: ZER WA SET NEW STATE TO ZERO ! 15545: MOV XL,WB SET NEW LEVEL INDICATOR ! 15546: MOV =NUM01,WC INITIALIZE NEW COUNTER ! 15547: BRN EXP01 JUMP TO SCAN NEXT ELEMENT ! 15548: * ! 15549: * HERE FOR LBR (S=0,1) ! 15550: * ! 15551: * THIS IS AN ILLEGAL USE OF LEFT BRACKET ! 15552: * ! 15553: EXP08 ERB 222,SYNTAX ERROR. INVALID USE OF LEFT BRACKET ! 15554: * ! 15555: * HERE FOR LBR (S=2) ! 15556: * ! 15557: * SET NEW LEVEL AND START TO SCAN SUBSCRIPTS ! 15558: * ! 15559: EXP09 MOV (XS)+,XR LOAD ARRAY PTR FOR CMOPN ! 15560: MOV =NUM03,XL SET NEW LEVEL INDICATOR ! 15561: BRN EXP07 JUMP TO STACK OLD AND START NEW ! 15562: * ! 15563: * HERE FOR FNC (S=0,1) ! 15564: * ! 15565: * STACK OLD LEVEL AND START TO SCAN ARGUMENTS ! 15566: * ! 15567: EXP10 MOV =NUM05,XL SET NEW LEV INDIC (XR=VRBLK=CMOPN) ! 15568: BRN EXP07 JUMP TO STACK OLD AND START NEW ! 15569: * ! 15570: * HERE FOR CMA (S=2) ! 15571: * ! 15572: * INCREMENT ARGUMENT COUNT AND CONTINUE ! 15573: * ! 15574: EXP11 ICV WC INCREMENT COUNTER ! 15575: JSR EXPDM DUMP OPERATORS AT THIS LEVEL ! 15576: ZER -(XS) SET NEW LEVEL FOR PARAMETER ! 15577: ZER WA SET NEW STATE ! 15578: BGT WB,=NUM02,EXP01 LOOP BACK UNLESS OUTER LEVEL ! 15579: ERB 223,SYNTAX ERROR. INVALID USE OF COMMA ! 15580: EJC ! 15581: * ! 15582: * EXPAN (CONTINUED) ! 15583: * ! 15584: * HERE FOR RPR (S=2) ! 15585: * ! 15586: * AT OUTER LEVEL IN A NORMAL GOTO THIS IS A TERMINATOR ! 15587: * OTHERWISE IT MUST TERMINATE A FUNCTION OR GROUPING ! 15588: * ! 15589: EXP12 BEQ WB,=NUM01,EXP20 END OF NORMAL GOTO ! 15590: BEQ WB,=NUM05,EXP13 END OF FUNCTION ARGUMENTS ! 15591: BEQ WB,=NUM04,EXP14 END OF GROUPING / SELECTION ! 15592: ERB 224,SYNTAX ERROR. UNBALANCED RIGHT PARENTHESIS ! 15593: * ! 15594: * HERE AT END OF FUNCTION ARGUMENTS ! 15595: * ! 15596: EXP13 MOV =C$FNC,XL SET CMTYP VALUE FOR FUNCTION ! 15597: BRN EXP15 JUMP TO BUILD CMBLK ! 15598: * ! 15599: * HERE FOR END OF GROUPING ! 15600: * ! 15601: EXP14 BEQ WC,=NUM01,EXP17 JUMP IF END OF GROUPING ! 15602: MOV =C$SEL,XL ELSE SET CMTYP FOR SELECTION ! 15603: * ! 15604: * MERGE HERE TO BUILD CMBLK FOR LEVEL JUST SCANNED AND ! 15605: * TO POP UP TO THE PREVIOUS SCAN LEVEL BEFORE CONTINUING. ! 15606: * ! 15607: EXP15 JSR EXPDM DUMP OPERATORS AT THIS LEVEL ! 15608: MOV WC,WA COPY COUNT ! 15609: ADD =CMVLS,WA ADD FOR STANDARD FIELDS AT START ! 15610: WTB WA CONVERT LENGTH TO BYTES ! 15611: JSR ALLOC ALLOCATE SPACE FOR CMBLK ! 15612: MOV =B$CMT,(XR) STORE TYPE CODE FOR CMBLK ! 15613: MOV XL,CMTYP(XR) STORE CMBLK NODE TYPE INDICATOR ! 15614: MOV WA,CMLEN(XR) STORE LENGTH ! 15615: ADD WA,XR POINT PAST END OF BLOCK ! 15616: LCT WC,WC SET LOOP COUNTER ! 15617: * ! 15618: * LOOP TO MOVE REMAINING WORDS TO CMBLK ! 15619: * ! 15620: EXP16 MOV (XS)+,-(XR) MOVE ONE OPERAND PTR FROM STACK ! 15621: MOV (XS)+,WB POP TO OLD LEVEL INDICATOR ! 15622: BCT WC,EXP16 LOOP TILL ALL MOVED ! 15623: EJC ! 15624: * ! 15625: * EXPAN (CONTINUED) ! 15626: * ! 15627: * COMPLETE CMBLK AND STACK POINTER TO IT ON STACK ! 15628: * ! 15629: SUB *CMVLS,XR POINT BACK TO START OF BLOCK ! 15630: MOV (XS)+,WC RESTORE OLD COUNTER ! 15631: MOV (XS),CMOPN(XR) STORE OPERAND PTR IN CMBLK ! 15632: MOV XR,(XS) STACK CMBLK POINTER ! 15633: MOV =NUM02,WA SET NEW STATE ! 15634: BRN EXP01 BACK FOR NEXT ELEMENT ! 15635: * ! 15636: * HERE AT END OF A PARENTHESIZED EXPRESSION ! 15637: * ! 15638: EXP17 JSR EXPDM DUMP OPERATORS AT THIS LEVEL ! 15639: MOV (XS)+,XR RESTORE XR ! 15640: MOV (XS)+,WB RESTORE OUTER LEVEL ! 15641: MOV (XS)+,WC RESTORE OUTER COUNT ! 15642: MOV XR,(XS) STORE OPND OVER UNUSED CMOPN VAL ! 15643: MOV =NUM02,WA SET NEW STATE ! 15644: BRN EXP01 BACK FOR NEXT ELE8ENT ! 15645: * ! 15646: * HERE FOR RBR (S=2) ! 15647: * ! 15648: * AT OUTER LEVEL IN A DIRECT GOTO, THIS IS A TERMINATOR. ! 15649: * OTHERWISE IT MUST TERMINATE A SUBSCRIPT LIST. ! 15650: * ! 15651: EXP18 MOV =C$ARR,XL SET CMTYP FOR ARRAY REFERENCE ! 15652: BEQ WB,=NUM03,EXP15 JUMP TO BUILD CMBLK IF END ARRAYREF ! 15653: BEQ WB,=NUM02,EXP20 JUMP IF END OF DIRECT GOTO ! 15654: ERB 225,SYNTAX ERROR. UNBALANCED RIGHT BRACKET ! 15655: EJC ! 15656: * ! 15657: * EXPAN (CONTINUED) ! 15658: * ! 15659: * HERE FOR COL,SMC (S=2) ! 15660: * ! 15661: * ERROR UNLESS TERMINATING STATEMENT BODY AT OUTER LEVEL ! 15662: * ! 15663: EXP19 MNZ SCNRS RESCAN TERMINATOR ! 15664: MOV WB,XL COPY LEVEL INDICATOR ! 15665: BSW XL,6 SWITCH ON LEVEL INDICATOR ! 15666: IFF 0,EXP20 NORMAL OUTER LEVEL ! 15667: IFF 1,EXP22 FAIL IF NORMAL GOTO ! 15668: IFF 2,EXP23 FAIL IF DIRECT GOTO ! 15669: IFF 3,EXP24 FAIL ARRAY BRACKETS ! 15670: IFF 4,EXP21 FAIL IF IN GROUPING ! 15671: IFF 5,EXP21 FAIL FUNCTION ARGS ! 15672: ESW END SWITCH ON LEVEL ! 15673: * ! 15674: * HERE AT NORMAL END OF EXPRESSION ! 15675: * ! 15676: EXP20 JSR EXPDM DUMP REMAINING OPERATORS ! 15677: MOV (XS)+,XR LOAD TREE POINTER ! 15678: ICA XS POP OFF BOTTOM OF STACK MARKER ! 15679: EXI RETURN TO EXPAN CALLER ! 15680: * ! 15681: * MISSING RIGHT PAREN ! 15682: * ! 15683: EXP21 ERB 226,SYNTAX ERROR. MISSING RIGHT PAREN ! 15684: * ! 15685: * MISSING RIGHT PAREN IN GOTO FIELD ! 15686: * ! 15687: EXP22 ERB 227,SYNTAX ERROR. RIGHT PAREN MISSING FROM GOTO ! 15688: * ! 15689: * MISSING BRACKET IN GOTO ! 15690: * ! 15691: EXP23 ERB 228,SYNTAX ERROR. RIGHT BRACKET MISSING FROM GOTO ! 15692: * ! 15693: * MISSING ARRAY BRACKET ! 15694: * ! 15695: EXP24 ERB 229,SYNTAX ERROR. MISSING RIGHT ARRAY BRACKET ! 15696: EJC ! 15697: * ! 15698: * EXPAN (CONTINUED) ! 15699: * ! 15700: * LOOP HERE WHEN AN OPERATOR CAUSES AN OPERATOR DUMP ! 15701: * ! 15702: EXP25 MOV XR,EXPSV ! 15703: JSR EXPOP POP ONE OPERATOR ! 15704: MOV EXPSV,XR RESTORE OP DV POINTER AND MERGE ! 15705: * ! 15706: * HERE FOR BOP (S=2) ! 15707: * ! 15708: * REMOVE OPERATORS (CONDENSE) FROM STACK UNTIL NO MORE ! 15709: * LEFT AT THIS LEVEL OR TOP ONE HAS LOWER PRECEDENCE. ! 15710: * LOOP HERE TILL THIS CONDITION IS MET. ! 15711: * ! 15712: EXP26 MOV 1(XS),XL LOAD OPERATOR DVPTR FROM STACK ! 15713: BLE XL,=NUM05,EXP27 JUMP IF BOTTOM OF STACK LEVEL ! 15714: BLT DVRPR(XR),DVLPR(XL),EXP25 ELSE POP IF NEW PREC IS LO ! 15715: * ! 15716: * HERE FOR UOP (S=0,1) ! 15717: * ! 15718: * BINARY OPERATOR MERGES AFTER PRECEDENCE CHECK ! 15719: * ! 15720: * THE OPERATOR DV IS STORED ON THE STACK AND THE SCAN ! 15721: * CONTINUES AFTER SETTING THE SCAN STATE TO ONE. ! 15722: * ! 15723: EXP27 MOV XR,-(XS) STACK OPERATOR DVPTR ON STACK ! 15724: CHK CHECK FOR STACK OVERFLOW ! 15725: MOV =NUM01,WA SET NEW STATE ! 15726: BNE XR,=OPDVS,EXP01 BACK FOR NEXT ELEMENT UNLESS = ! 15727: * ! 15728: * HERE FOR SPECIAL CASE OF BINARY =. THE SYNTAX ALLOWS A ! 15729: * NULL RIGHT ARGUMENT FOR THIS OPERATOR TO BE LEFT ! 15730: * OUT. ACCORDINGLY WE RESET TO STATE ZERO TO GET PROPER ! 15731: * ACTION ON A TERMINATOR (SUPPLY A NULL CONSTANT). ! 15732: * ! 15733: ZER WA SET STATE ZERO ! 15734: BRN EXP01 JUMP FOR NEXT ELEMENT ! 15735: ENP END PROCEDURE EXPAN ! 15736: EJC ! 15737: * ! 15738: * EXPAP -- TEST FOR PATTERN MATCH TREE ! 15739: * ! 15740: * EXPAP IS PASSED AN EXPRESSION TREE TO DETERMINE IF IT ! 15741: * IS A PATTERN MATCH. THE FOLLOWING ARE RECOGIZED AS ! 15742: * MATCHES IN THE CONTEXT OF THIS CALL. ! 15743: * ! 15744: * 1) AN EXPLICIT USE OF BINARY QUESTION MARK ! 15745: * 2) A CONCATENATION ! 15746: * 3) AN ALTERNATION WHOSE LEFT OPERAND IS A CONCATENATION ! 15747: * ! 15748: * (XR) PTR TO EXPAN TREE ! 15749: * JSR EXPAP CALL TO TEST FOR PATTERN MATCH ! 15750: * PPM LOC TRANSFER LOC IF NOT A PATTERN MATCH ! 15751: * (WA) DESTROYED ! 15752: * (XR) UNCHANGED (IF NOT MATCH) ! 15753: * (XR) PTR TO BINARY OPERATOR BLK IF MATCH ! 15754: * ! 15755: EXPAP PRC E,1 ENTRY POINT ! 15756: MOV XL,-(XS) SAVE XL ! 15757: BNE (XR),=B$CMT,EXPP2 NO MATCH IF NOT COMPLEX ! 15758: MOV CMTYP(XR),WA ELSE LOAD TYPE CODE ! 15759: BEQ WA,=C$CNC,EXPP1 CONCATENATION IS A MATCH ! 15760: BEQ WA,=C$PMT,EXPP1 BINARY QUESTION MARK IS A MATCH ! 15761: BNE WA,=C$ALT,EXPP2 ELSE NOT MATCH UNLESS ALTERNATION ! 15762: * ! 15763: * HERE FOR ALTERNATION. CHANGE (A B) / C TO A QM (B / C) ! 15764: * ! 15765: MOV CMLOP(XR),XL LOAD LEFT OPERAND POINTER ! 15766: BNE (XL),=B$CMT,EXPP2 NOT MATCH IF LEFT OPND NOT COMPLEX ! 15767: BNE CMTYP(XL),=C$CNC,EXPP2 NOT MATCH IF LEFT OP NOT CONC ! 15768: MOV CMROP(XL),CMLOP(XR) XR POINTS TO (B / C) ! 15769: MOV XR,CMROP(XL) SET XL OPNDS TO A, (B / C) ! 15770: MOV XL,XR POINT TO THIS ALTERED NODE ! 15771: * ! 15772: * EXIT HERE FOR PATTERN MATCH ! 15773: * ! 15774: EXPP1 MOV (XS)+,XL RESTORE ENTRY XL ! 15775: EXI GIVE PATTERN MATCH RETURN ! 15776: * ! 15777: * EXIT HERE IF NOT PATTERN MATCH ! 15778: * ! 15779: EXPP2 MOV (XS)+,XL RESTORE ENTRY XL ! 15780: EXI 1 GIVE NON-MATCH RETURN ! 15781: ENP END PROCEDURE EXPAP ! 15782: EJC ! 15783: * ! 15784: * EXPDM -- DUMP OPERATORS AT CURRENT LEVEL (FOR EXPAN) ! 15785: * ! 15786: * EXPDM USES EXPOP TO CONDENSE ALL OPERATORS AT THIS SYNTAX ! 15787: * LEVEL. THE STACK BOTTOM IS RECOGNIZED FROM THE LEVEL ! 15788: * VALUE WHICH IS SAVED ON THE TOP OF THE STACK. ! 15789: * ! 15790: * JSR EXPDM CALL TO DUMP OPERATORS ! 15791: * (XS) POPPED AS REQUIRED ! 15792: * (XR,WA) DESTROYED ! 15793: * ! 15794: EXPDM PRC N,0 ENTRY POINT ! 15795: MOV XL,R$EXS SAVE XL VALUE ! 15796: * ! 15797: * LOOP TO DUMP OPERATORS ! 15798: * ! 15799: EXDM1 BLE 1(XS),=NUM05,EXDM2 JUMP IF STACK BOTTOM (SAVED LEVEL ! 15800: JSR EXPOP ELSE POP ONE OPERATOR ! 15801: BRN EXDM1 AND LOOP BACK ! 15802: * ! 15803: * HERE AFTER POPPING ALL OPERATORS ! 15804: * ! 15805: EXDM2 MOV R$EXS,XL RESTORE XL ! 15806: ZER R$EXS RELEASE SAVE LOCATION ! 15807: EXI RETURN TO EXPDM CALLER ! 15808: ENP END PROCEDURE EXPDM ! 15809: EJC ! 15810: * ! 15811: * EXPOP-- POP OPERATOR (FOR EXPAN) ! 15812: * ! 15813: * EXPOP IS USED BY THE EXPAN ROUTINE TO CONDENSE ONE ! 15814: * OPERATOR FROM THE TOP OF THE SYNTAX STACK. AN APPROPRIATE ! 15815: * CMBLK IS BUILT FOR THE OPERATOR (UNARY OR BINARY) AND A ! 15816: * POINTER TO THIS CMBLK IS STACKED. ! 15817: * ! 15818: * EXPOP IS ALSO USED BY SCNGF (GOTO FIELD SCAN) PROCEDURE ! 15819: * ! 15820: * JSR EXPOP CALL TO POP OPERATOR ! 15821: * (XS) POPPED APPROPRIATELY ! 15822: * (XR,XL,WA) DESTROYED ! 15823: * ! 15824: EXPOP PRC N,0 ENTRY POINT ! 15825: MOV 1(XS),XR LOAD OPERATOR DV POINTER ! 15826: BEQ DVLPR(XR),=LLUNO,EXPO2 JUMP IF UNARY ! 15827: * ! 15828: * HERE FOR BINARY OPERATOR ! 15829: * ! 15830: MOV *CMBS$,WA SET SIZE OF BINARY OPERATOR CMBLK ! 15831: JSR ALLOC ALLOCATE SPACE FOR CMBLK ! 15832: MOV (XS)+,CMROP(XR) POP AND STORE RIGHT OPERAND PTR ! 15833: MOV (XS)+,XL POP AND LOAD OPERATOR DV PTR ! 15834: MOV (XS),CMLOP(XR) STORE LEFT OPERAND POINTER ! 15835: * ! 15836: * COMMON EXIT POINT ! 15837: * ! 15838: EXPO1 MOV =B$CMT,(XR) STORE TYPE CODE FOR CMBLK ! 15839: MOV DVTYP(XL),CMTYP(XR) STORE CMBLK NODE TYPE CODE ! 15840: MOV XL,CMOPN(XR) STORE DVPTR (=PTR TO DAC O$XXX) ! 15841: MOV WA,CMLEN(XR) STORE CMBLK LENGTH ! 15842: MOV XR,(XS) STORE RESULTING NODE PTR ON STACK ! 15843: EXI RETURN TO EXPOP CALLER ! 15844: * ! 15845: * HERE FOR UNARY OPERATOR ! 15846: * ! 15847: EXPO2 MOV *CMUS$,WA SET SIZE OF UNARY OPERATOR CMBLK ! 15848: JSR ALLOC ALLOCATE SPACE FOR CMBLK ! 15849: MOV (XS)+,CMROP(XR) POP AND STORE OPERAND POINTER ! 15850: MOV (XS),XL LOAD OPERATOR DV POINTER ! 15851: BRN EXPO1 MERGE BACK TO EXIT ! 15852: ENP END PROCEDURE EXPOP ! 15853: EJC ! 15854: * ! 15855: * FLSTG -- FOLD STRING TO UPPER CASE ! 15856: * ! 15857: * FLSTG FOLDS A CHARACTER STRING CONTAINING LOWER CASE ! 15858: * CHARACCTERS TO ONE CONTAINING UPPER CASE CHARACTERS. ! 15859: * FOLDING IS ONLY DONE IF &CASE (KVCAS) IS NOT ZERO. ! 15860: * ! 15861: * (XR) STRING ARGUMENT ! 15862: * (WA) LENGTH OF STRING ! 15863: * JSR FLSTG CALL TO FOLD STRING ! 15864: * (XR) RESULT STRING (POSSIBLY ORIGINAL) ! 15865: * (WC) DESTROYED ! 15866: * ! 15867: FLSTG PRC R,0 ENTRY POINT ! 15868: BZE KVCAS,FST99 SKIP IF &CASE IS 0 ! 15869: MOV XL,-(XS) SAVE XL ACROSS CALL ! 15870: MOV XR,-(XS) SAVE ORIGINAL SCBLK PTR ! 15871: JSR ALOCS ALLOCATE NEW STRING BLOCK ! 15872: MOV (XS),XL POINT TO ORIGINAL SCBLK ! 15873: MOV XR,-(XS) SAVE POINTER TO NEW SCBLK ! 15874: PLC XL POINT TO ORIGINAL CHARS ! 15875: PLC XR POINT TO NEW CHARS ! 15876: ZER -(XS) INIT DID FOLD FLAG ! 15877: LCT WC,WC LOAD LOOP COUNTER ! 15878: FST01 LCH WA,(XL)+ LOAD CHARACTER ! 15879: BGT =CH$$A,WA,FST02 SKIP IF LESS THAN LC A ! 15880: BGT WA,=CH$$$,FST02 SKIP IF GREATER THAN LC Z ! 15881: FLC WA FOLD CHARACTER TO UPPER CASE ! 15882: MNZ (XS) SET DID FOLD CHARACTER FLAG ! 15883: FST02 SCH WA,(XR)+ STORE (POSSIBLY FOLDED) CHARACTER ! 15884: BCT WC,FST01 LOOP THRU ENTIRE STRING ! 15885: CSC XR COMPLETE STORE CHARACTERS ! 15886: BNZ (XS)+,FST10 SKIP IF FOLDING DONE ! 15887: MOV (XS)+,DNAMP DO NOT NEED NEW SCBLK ! 15888: MOV (XS)+,XR RETURN ORIGINAL SCBLK ! 15889: BRN FST20 MERGE BELOW ! 15890: FST10 MOV (XS)+,XR RETURN NEW SCBLK ! 15891: ICA XS THROW AWAY ORIGINAL SCBLK POINTER ! 15892: FST20 MOV SCLEN(XR),WA RELOAD STRING LENGTH ! 15893: MOV (XS)+,XL RESTORE XL ! 15894: FST99 EXI RETURN ! 15895: ENP ! 15896: EJC ! 15897: * ! 15898: * GBCOL -- PERFORM GARBAGE COLLECTION ! 15899: * ! 15900: * GBCOL PERFORMS A GARBAGE COLLECTION ON THE DYNAMIC REGION ! 15901: * ALL BLOCKS WHICH ARE NO LONGER IN USE ARE ELIMINATED ! 15902: * BY MOVING BLOCKS WHICH ARE IN USE DOWN AND RESETTING ! 15903: * DNAMP, THE POINTER TO THE NEXT AVAILABLE LOCATION. ! 15904: * ! 15905: * (WB) MOVE OFFSET (SEE BELOW) ! 15906: * JSR GBCOL CALL TO COLLECT GARBAGE ! 15907: * (XR) DESTROYED ! 15908: * ! 15909: * THE FOLLOWING CONDITIONS MUST BE MET AT THE TIME WHEN ! 15910: * GBCOL IS CALLED. ! 15911: * ! 15912: * 1) ALL POINTERS TO BLOCKS IN THE DYNAMIC AREA MUST BE ! 15913: * ACCESSIBLE TO THE GARBAGE COLLECTOR. THIS MEANS ! 15914: * THAT THEY MUST OCCUR IN ONE OF THE FOLLOWING. ! 15915: * ! 15916: * A) MAIN STACK, WITH CURRENT TOP ! 15917: * ELEMENT BEING INDICATED BY XS ! 15918: * ! 15919: * B) IN RELOCATABLE FIELDS OF VRBLKS. ! 15920: * ! 15921: * C) IN REGISTER XL AT THE TIME OF CALL ! 15922: * ! 15923: * E) IN THE SPECIAL REGION OF WORKING ! 15924: * STORAGE WHERE NAMES BEGIN WITH R$. ! 15925: * ! 15926: * 2) ALL POINTERS MUST POINT TO THE START OF BLOCKS WITH ! 15927: * THE SOLE EXCEPTION OF THE CONTENTS OF THE CODE ! 15928: * POINTER REGISTER WHICH POINTS INTO THE R$COD BLOCK. ! 15929: * ! 15930: * 3) NO LOCATION WHICH APPEARS TO CONTAIN A POINTER ! 15931: * INTO THE DYNAMIC REGION MAY OCCUR UNLESS IT IS IN ! 15932: * FACT A POINTER TO THE START OF THE BLOCK. HOWEVER ! 15933: * POINTERS OUTSIDE THIS AREA MAY OCCUR AND WILL ! 15934: * NOT BE CHANGED BY THE GARBAGE COLLECTOR. ! 15935: * IT IS ESPECIALLY IMPORTANT TO MAKE SURE THAT XL ! 15936: * DOES NOT CONTAIN A GARBAGE VALUE FROM SOME PROCESS ! 15937: * CARRIED OUT BEFORE THE CALL TO THE COLLECTOR. ! 15938: * ! 15939: * GBCOL HAS THE CAPABILITY OF MOVING THE FINAL COMPACTED ! 15940: * RESULT UP IN MEMORY (WITH ADDRESSES ADJUSTED ACCORDINGLY) ! 15941: * THIS IS USED TO ADD SPACE TO THE STATIC REGION. THE ! 15942: * ENTRY VALUE OF WB IS THE NUMBER OF BYTES TO MOVE UP. ! 15943: * THE CALLER MUST GUARANTEE THAT THERE IS ENOUGH ROOM. ! 15944: * FURTHERMORE THE VALUE IN WB IF IT IS NON-ZERO, MUST BE AT ! 15945: * LEAST 256 SO THAT THE MWB INSTRUCTION CONDITIONS ARE MET. ! 15946: EJC ! 15947: * ! 15948: * GBCOL (CONTINUED) ! 15949: * ! 15950: * THE ALGORITHM, WHICH IS A MODIFICATION OF THE LISP-2 ! 15951: * GARBAGE COLLECTOR DEVISED BY R.DEWAR AND K.BELCHER ! 15952: * TAKES THREE PASSES AS FOLLOWS. ! 15953: * ! 15954: * 1) ALL POINTERS IN MEMORY ARE SCANNED AND BLOCKS IN USE ! 15955: * DETERMINED FROM THIS SCAN. NOTE THAT THIS PROCEDURE ! 15956: * IS RECURSIVE AND USES THE MAIN STACK FOR LINKAGE. ! 15957: * THE MARKING PROCESS IS THUS SIMILAR TO THAT USED IN ! 15958: * A STANDARD LISP COLLECTOR. HOWEVER THE METHOD OF ! 15959: * ACTUALLY MARKING THE BLOCKS IS DIFFERENT. ! 15960: * ! 15961: * THE FIRST FIELD OF A BLOCK NORMALLY CONTAINS A ! 15962: * CODE ENTRY POINT POINTER. SUCH AN ENTRY POINTER ! 15963: * CAN BE DISTINGUISHED FROM THE ADDRESS OF ANY POINTER ! 15964: * TO BE PROCESSED BY THE COLLECTOR. DURING GARBAGE ! 15965: * COLLECTION, THIS WORD IS USED TO BUILD A BACK CHAIN ! 15966: * OF POINTERS THROUGH FIELDS WHICH POINT TO THE BLOCK. ! 15967: * THE END OF THE CHAIN IS MARKED BY THE OCCURENCE ! 15968: * OF THE WORD WHICH USED TO BE IN THE FIRST WORD OF ! 15969: * THE BLOCK. THIS BACKCHAIN SERVES BOTH AS A MARK ! 15970: * INDICATING THAT THE BLOCK IS IN USE AND AS A LIST OF ! 15971: * REFERENCES FOR THE RELOCATION PHASE. ! 15972: * ! 15973: * 2) STORAGE IS SCANNED SEQUENTIALLY TO DISCOVER WHICH ! 15974: * BLOCKS ARE CURRENTLY IN USE AS INDICATED BY THE ! 15975: * PRESENCE OF A BACKCHAIN. TWO POINTERS ARE MAINTAINED ! 15976: * ONE SCANS THROUGH LOOKING AT EACH BLOCK. THE OTHER ! 15977: * IS INCREMENTED ONLY FOR BLOCKS FOUND TO BE IN USE. ! 15978: * IN THIS WAY, THE EVENTUAL LOCATION OF EACH BLOCK CAN ! 15979: * BE DETERMINED WITHOUT ACTUALLY MOVING ANY BLOCKS. ! 15980: * AS EACH BLOCK WHICH IS IN USE IS PROCESSED, THE BACK ! 15981: * CHAIN IS USED TO RESET ALL POINTERS WHICH POINT TO ! 15982: * THIS BLOCK TO CONTAIN ITS NEW ADDRESS, I.E. THE ! 15983: * ADDRESS IT WILL OCCUPY AFTER THE BLOCKS ARE MOVED. ! 15984: * THE FIRST WORD OF THE BLOCK, TAKEN FROM THE END OF ! 15985: * THE CHAIN IS RESTORED AT THIS POINT. ! 15986: * ! 15987: * DURING PASS 2, THE COLLECTOR BUILDS BLOCKS WHICH ! 15988: * DESCRIBE THE REGIONS OF STORAGE WHICH ARE TO BE ! 15989: * MOVED IN THE THIRD PASS. THERE IS ONE DESCRIPTOR FOR ! 15990: * EACH CONTIGUOUS SET OF GOOD BLOCKS. THE DESCRIPTOR ! 15991: * IS BUILT JUST BEHIND THE BLOCK TO BE MOVED AND ! 15992: * CONTAINS A POINTER TO THE NEXT BLOCK AND THE NUMBER ! 15993: * OF WORDS TO BE MOVED. ! 15994: * ! 15995: * 3) IN THE THIRD AND FINAL PASS, THE MOVE DESCRIPTOR ! 15996: * BLOCKS BUILT IN PASS TWO ARE USED TO ACTUALLY MOVE ! 15997: * THE BLOCKS DOWN TO THE BOTTOM OF THE DYNAMIC REGION. ! 15998: * THE COLLECTION IS THEN COMPLETE AND THE NEXT ! 15999: * AVAILABLE LOCATION POINTER IS RESET. ! 16000: EJC ! 16001: * ! 16002: * GBCOL (CONTINUED) ! 16003: * ! 16004: GBCOL PRC E,0 ENTRY POINT ! 16005: BNZ DMVCH,GBC14 FAIL IF IN MID-DUMP ! 16006: MNZ GBCFL NOTE GBCOL ENTERED ! 16007: MOV WA,GBSVA SAVE ENTRY WA ! 16008: MOV WB,GBSVB SAVE ENTRY WB ! 16009: MOV WC,GBSVC SAVE ENTRY WC ! 16010: MOV XL,-(XS) SAVE ENTRY XL ! 16011: SCP WA GET CODE POINTER VALUE ! 16012: SUB R$COD,WA MAKE RELATIVE ! 16013: LCP WA AND RESTORE ! 16014: * ! 16015: * PROCESS STACK ENTRIES ! 16016: * ! 16017: MOV XS,XR POINT TO STACK FRONT ! 16018: MOV STBAS,XL POINT PAST END OF STACK ! 16019: BGE XL,XR,GBC00 OK IF D-STACK ! 16020: MOV XL,XR REVERSE IF ... ! 16021: MOV XS,XL ... U-STACK ! 16022: * ! 16023: * PROCESS THE STACK ! 16024: * ! 16025: GBC00 JSR GBCPF PROCESS POINTERS ON STACK ! 16026: * ! 16027: * PROCESS SPECIAL WORK LOCATIONS ! 16028: * ! 16029: MOV =R$AAA,XR POINT TO START OF RELOCATABLE LOCS ! 16030: MOV =R$YYY,XL POINT PAST END OF RELOCATABLE LOCS ! 16031: JSR GBCPF PROCESS WORK FIELDS ! 16032: * ! 16033: * PREPARE TO PROCESS VARIABLE BLOCKS ! 16034: * ! 16035: MOV HSHTB,WA POINT TO FIRST HASH SLOT POINTER ! 16036: * ! 16037: * LOOP THROUGH HASH SLOTS ! 16038: * ! 16039: GBC01 MOV WA,XL POINT TO NEXT SLOT ! 16040: ICA WA BUMP BUCKET POINTER ! 16041: MOV WA,GBCNM SAVE BUCKET POINTER ! 16042: EJC ! 16043: * ! 16044: * GBCOL (CONTINUED) ! 16045: * ! 16046: * LOOP THROUGH VARIABLES ON ONE HASH CHAIN ! 16047: * ! 16048: GBC02 MOV (XL),XR LOAD PTR TO NEXT VRBLK ! 16049: BZE XR,GBC03 JUMP IF END OF CHAIN ! 16050: MOV XR,XL ELSE COPY VRBLK POINTER ! 16051: ADD *VRVAL,XR POINT TO FIRST RELOC FLD ! 16052: ADD *VRNXT,XL POINT PAST LAST (AND TO LINK PTR) ! 16053: JSR GBCPF PROCESS RELOC FIELDS IN VRBLK ! 16054: BRN GBC02 LOOP BACK FOR NEXT BLOCK ! 16055: * ! 16056: * HERE AT END OF ONE HASH CHAIN ! 16057: * ! 16058: GBC03 MOV GBCNM,WA RESTORE BUCKET POINTER ! 16059: BNE WA,HSHTE,GBC01 LOOP BACK IF MORE BUCKETS TO GO ! 16060: EJC ! 16061: * ! 16062: * GBCOL (CONTINUED) ! 16063: * ! 16064: * NOW WE ARE READY TO START PASS TWO. REGISTERS ARE USED ! 16065: * AS FOLLOWS IN PASS TWO. ! 16066: * ! 16067: * (XR) SCANS THROUGH ALL BLOCKS ! 16068: * (WC) POINTER TO EVENTUAL LOCATION ! 16069: * ! 16070: * THE MOVE DESCRIPTION BLOCKS BUILT IN THIS PASS HAVE ! 16071: * THE FOLLOWING FORMAT. ! 16072: * ! 16073: * WORD 1 POINTER TO NEXT MOVE BLOCK, ! 16074: * ZERO IF END OF CHAIN OF BLOCKS ! 16075: * ! 16076: * WORD 2 LENGTH OF BLOCKS TO BE MOVED IN ! 16077: * BYTES. SET TO THE ADDRESS OF THE ! 16078: * FIRST BYTE WHILE ACTUALLY SCANNING ! 16079: * THE BLOCKS. ! 16080: * ! 16081: * THE FIRST ENTRY ON THIS CHAIN IS A SPECIAL ENTRY ! 16082: * CONSISTING OF THE TWO WORDS GBCNM AND GBCNS. AFTER ! 16083: * BUILDING THE CHAIN OF MOVE DESCRIPTORS, GBCNM POINTS TO ! 16084: * THE FIRST REAL MOVE BLOCK, AND GBCNS IS THE LENGTH OF ! 16085: * BLOCKS IN USE AT THE START OF STORAGE WHICH NEED NOT ! 16086: * BE MOVED SINCE THEY ARE IN THE CORRECT POSITION. ! 16087: * ! 16088: GBC04 MOV DNAMB,XR POINT TO FIRST BLOCK ! 16089: MOV XR,WC SET AS FIRST EVENTUAL LOCATION ! 16090: ADD GBSVB,WC ADD OFFSET FOR EVENTUAL MOVE UP ! 16091: ZER GBCNM CLEAR INITIAL FORWARD POINTER ! 16092: MOV =GBCNM,GBCLM INITIALIZE PTR TO LAST MOVE BLOCK ! 16093: MOV XR,GBCNS INITIALIZE FIRST ADDRESS ! 16094: * ! 16095: * LOOP THROUGH A SERIES OF BLOCKS IN USE ! 16096: * ! 16097: GBC05 BEQ XR,DNAMP,GBC07 JUMP IF END OF USED REGION ! 16098: MOV (XR),WA ELSE GET FIRST WORD ! 16099: BHI WA,=P$YYY,GBC06 SKIP IF NOT ENTRY PTR (IN USE) ! 16100: BHI WA,=B$AAA,GBC07 JUMP IF ENTRY POINTER (UNUSED) ! 16101: * ! 16102: * HERE FOR BLOCK IN USE, LOOP TO RELOCATE REFERENCES ! 16103: * ! 16104: GBC06 MOV WA,XL COPY POINTER ! 16105: MOV (XL),WA LOAD FORWARD POINTER ! 16106: MOV WC,(XL) RELOCATE REFERENCE ! 16107: BHI WA,=P$YYY,GBC06 LOOP BACK IF NOT END OF CHAIN ! 16108: BLO WA,=B$AAA,GBC06 LOOP BACK IF NOT END OF CHAIN ! 16109: EJC ! 16110: * ! 16111: * GBCOL (CONTINUED) ! 16112: * ! 16113: * AT END OF CHAIN, RESTORE FIRST WORD AND BUMP PAST ! 16114: * ! 16115: MOV WA,(XR) RESTORE FIRST WORD ! 16116: JSR BLKLN GET LENGTH OF THIS BLOCK ! 16117: ADD WA,XR BUMP ACTUAL POINTER ! 16118: ADD WA,WC BUMP EVENTUAL POINTER ! 16119: BRN GBC05 LOOP BACK FOR NEXT BLOCK ! 16120: * ! 16121: * HERE AT END OF A SERIES OF BLOCKS IN USE ! 16122: * ! 16123: GBC07 MOV XR,WA COPY POINTER PAST LAST BLOCK ! 16124: MOV GBCLM,XL POINT TO PREVIOUS MOVE BLOCK ! 16125: SUB 1(XL),WA SUBTRACT STARTING ADDRESS ! 16126: MOV WA,1(XL) STORE LENGTH OF BLOCK TO BE MOVED ! 16127: * ! 16128: * LOOP THROUGH A SERIES OF BLOCKS NOT IN USE ! 16129: * ! 16130: GBC08 BEQ XR,DNAMP,GBC10 JUMP IF END OF USED REGION ! 16131: MOV (XR),WA ELSE LOAD FIRST WORD OF NEXT BLOCK ! 16132: BHI WA,=P$YYY,GBC09 JUMP IF IN USE ! 16133: BLO WA,=B$AAA,GBC09 JUMP IF IN USE ! 16134: JSR BLKLN ELSE GET LENGTH OF NEXT BLOCK ! 16135: ADD WA,XR PUSH POINTER ! 16136: BRN GBC08 AND LOOP BACK ! 16137: * ! 16138: * HERE FOR A BLOCK IN USE AFTER PROCESSING A SERIES OF ! 16139: * BLOCKS WHICH WERE NOT IN USE, BUILD NEW MOVE BLOCK. ! 16140: * ! 16141: GBC09 SUB *NUM02,XR POINT 2 WORDS BEHIND FOR MOVE BLOCK ! 16142: MOV GBCLM,XL POINT TO PREVIOUS MOVE BLOCK ! 16143: MOV XR,(XL) SET FORWARD PTR IN PREVIOUS BLOCK ! 16144: ZER (XR) ZERO FORWARD PTR OF NEW BLOCK ! 16145: MOV XR,GBCLM REMEMBER ADDRESS OF THIS BLOCK ! 16146: MOV XR,XL COPY PTR TO MOVE BLOCK ! 16147: ADD *NUM02,XR POINT BACK TO BLOCK IN USE ! 16148: MOV XR,1(XL) STORE STARTING ADDRESS ! 16149: BRN GBC06 JUMP TO PROCESS BLOCK IN USE ! 16150: EJC ! 16151: * ! 16152: * GBCOL (CONTINUED) ! 16153: * ! 16154: * HERE FOR PASS THREE -- ACTUALLY MOVE THE BLOCKS DOWN ! 16155: * ! 16156: * (XL) POINTER TO OLD LOCATION ! 16157: * (XR) POINTER TO NEW LOCATION ! 16158: * ! 16159: GBC10 MOV DNAMB,XR POINT TO START OF STORAGE ! 16160: ADD GBCNS,XR BUMP PAST UNMOVED BLOCKS AT START ! 16161: * ! 16162: * LOOP THROUGH MOVE DESCRIPTORS ! 16163: * ! 16164: GBC11 MOV GBCNM,XL POINT TO NEXT MOVE BLOCK ! 16165: BZE XL,GBC12 JUMP IF END OF CHAIN ! 16166: MOV (XL)+,GBCNM MOVE POINTER DOWN CHAIN ! 16167: MOV (XL)+,WA GET LENGTH TO MOVE ! 16168: MVW PERFORM MOVE ! 16169: BRN GBC11 LOOP BACK ! 16170: * ! 16171: * NOW TEST FOR MOVE UP ! 16172: * ! 16173: GBC12 MOV XR,DNAMP SET NEXT AVAILABLE LOC PTR ! 16174: MOV GBSVB,WB RELOAD MOVE OFFSET ! 16175: BZE WB,GBC13 JUMP IF NO MOVE REQUIRED ! 16176: MOV XR,XL ELSE COPY OLD TOP OF CORE ! 16177: ADD WB,XR POINT TO NEW TOP OF CORE ! 16178: MOV XR,DNAMP SAVE NEW TOP OF CORE POINTER ! 16179: MOV XL,WA COPY OLD TOP ! 16180: SUB DNAMB,WA MINUS OLD BOTTOM = LENGTH ! 16181: ADD WB,DNAMB BUMP BOTTOM TO GET NEW VALUE ! 16182: MWB PERFORM MOVE (BACKWARDS) ! 16183: * ! 16184: * MERGE HERE TO EXIT ! 16185: * ! 16186: GBC13 MOV GBSVA,WA RESTORE WA ! 16187: SCP WC GET CODE POINTER ! 16188: ADD R$COD,WC MAKE ABSOLUTE AGAIN ! 16189: LCP WC AND REPLACE ABSOLUTE VALUE ! 16190: MOV GBSVC,WC RESTORE WC ! 16191: MOV (XS)+,XL RESTORE ENTRY XL ! 16192: ICV GBCNT INCREMENT COUNT OF COLLECTIONS ! 16193: ZER XR CLEAR GARBAGE VALUE IN XR ! 16194: ZER GBCFL NOTE EXIT FROM GBCOL ! 16195: EXI EXIT TO GBCOL CALLER ! 16196: * ! 16197: * GARBAGE COLLECTION NOT ALLOWED WHILST DUMPING ! 16198: * ! 16199: GBC14 ICV ERRFT FATAL ERROR ! 16200: ERB 250,INSUFFICIENT MEMORY TO COMPLETE DUMP ! 16201: ENP END PROCEDURE GBCOL ! 16202: EJC ! 16203: * ! 16204: * GBCPF -- PROCESS FIELDS FOR GARBAGE COLLECTOR ! 16205: * ! 16206: * THIS PROCEDURE IS USED BY THE GARBAGE COLLECTOR TO ! 16207: * PROCESS FIELDS IN PASS ONE. SEE GBCOL FOR FULL DETAILS. ! 16208: * ! 16209: * (XR) PTR TO FIRST LOCATION TO PROCESS ! 16210: * (XL) PTR PAST LAST LOCATION TO PROCESS ! 16211: * JSR GBCPF CALL TO PROCESS FIELDS ! 16212: * (XR,WA,WB,WC,IA) DESTROYED ! 16213: * ! 16214: * NOTE THAT ALTHOUGH THIS PROCEDURE USES A RECURSIVE ! 16215: * APPROACH, IT CONTROLS ITS OWN STACK AND IS NOT RECURSIVE. ! 16216: * ! 16217: GBCPF PRC E,0 ENTRY POINT ! 16218: ZER -(XS) SET ZERO TO MARK BOTTOM OF STACK ! 16219: MOV XL,-(XS) SAVE END POINTER ! 16220: * ! 16221: * MERGE HERE TO GO DOWN A LEVEL AND START A NEW LOOP ! 16222: * ! 16223: * 1(XS) NEXT LVL FIELD PTR (0 AT OUTER LVL) ! 16224: * 0(XS) PTR PAST LAST FIELD TO PROCESS ! 16225: * (XR) PTR TO FIRST FIELD TO PROCESS ! 16226: * ! 16227: * LOOP TO PROCESS SUCCESSIVE FIELDS ! 16228: * ! 16229: GPF01 MOV (XR),XL LOAD FIELD CONTENTS ! 16230: MOV XR,WC SAVE FIELD POINTER ! 16231: BLT XL,DNAMB,GPF02 JUMP IF NOT PTR INTO DYNAMIC AREA ! 16232: BGE XL,DNAMP,GPF02 JUMP IF NOT PTR INTO DYNAMIC AREA ! 16233: * ! 16234: * HERE WE HAVE A PTR TO A BLOCK IN THE DYNAMIC AREA. ! 16235: * LINK THIS FIELD ONTO THE REFERENCE BACKCHAIN. ! 16236: * ! 16237: MOV (XL),WA LOAD PTR TO CHAIN (OR ENTRY PTR) ! 16238: MOV XR,(XL) SET THIS FIELD AS NEW HEAD OF CHAIN ! 16239: MOV WA,(XR) SET FORWARD POINTER ! 16240: * ! 16241: * NOW SEE IF THIS BLOCK HAS BEEN PROCESSED BEFORE ! 16242: * ! 16243: BHI WA,=P$YYY,GPF02 JUMP IF ALREADY PROCESSED ! 16244: BHI WA,=B$AAA,GPF03 JUMP IF NOT ALREADY PROCESSED ! 16245: * ! 16246: * HERE TO MOVE TO NEXT FIELD ! 16247: * ! 16248: GPF02 MOV WC,XR RESTORE FIELD POINTER ! 16249: ICA XR BUMP TO NEXT FIELD ! 16250: BNE XR,(XS),GPF01 LOOP BACK IF MORE TO GO ! 16251: EJC ! 16252: * ! 16253: * GBCPF (CONTINUED) ! 16254: * ! 16255: * HERE WE POP UP A LEVEL AFTER FINISHING A BLOCK ! 16256: * ! 16257: MOV (XS)+,XL RESTORE POINTER PAST END ! 16258: MOV (XS)+,WC RESTORE BLOCK POINTER ! 16259: BNZ WC,GPF02 CONTINUE LOOP UNLESS OUTER LEVL ! 16260: EXI RETURN TO CALLER IF OUTER LEVEL ! 16261: * ! 16262: * HERE TO PROCESS AN ACTIVE BLOCK WHICH HAS NOT BEEN DONE ! 16263: * ! 16264: GPF03 MOV XL,XR COPY BLOCK POINTER ! 16265: MOV WA,XL COPY FIRST WORD OF BLOCK ! 16266: LEI XL LOAD ENTRY POINT ID (BL$XX) ! 16267: * ! 16268: * BLOCK TYPE SWITCH. NOTE THAT BLOCKS WITH NO RELOCATABLE ! 16269: * FIELDS JUST RETURN TO GPF02 HERE TO CONTINE TO NEXT FLD. ! 16270: * ! 16271: BSW XL,BL$$$ SWITCH ON BLOCK TYPE ! 16272: IFF BL$AR,GPF06 ARBLK ! 16273: IFF BL$BC,GPF18 BCBLK ! 16274: IFF BL$BF,GPF02 BFBLK ! 16275: IFF BL$CC,GPF07 CCBLK ! 16276: IFF BL$CD,GPF08 CDBLK ! 16277: IFF BL$CM,GPF04 CMBLK ! 16278: IFF BL$DF,GPF02 DFBLK ! 16279: IFF BL$EV,GPF10 EVBLK ! 16280: IFF BL$EX,GPF17 EXBLK ! 16281: IFF BL$FF,GPF11 FFBLK ! 16282: IFF BL$NM,GPF10 NMBLK ! 16283: IFF BL$P0,GPF10 P0BLK ! 16284: IFF BL$P1,GPF12 P1BLK ! 16285: IFF BL$P2,GPF12 P2BLK ! 16286: IFF BL$PD,GPF13 PDBLK ! 16287: IFF BL$PF,GPF14 PFBLK ! 16288: IFF BL$TB,GPF08 TBBLK ! 16289: IFF BL$TE,GPF15 TEBLK ! 16290: IFF BL$TR,GPF16 TRBLK ! 16291: IFF BL$VC,GPF08 VCBLK ! 16292: IFF BL$XR,GPF09 XRBLK ! 16293: IFF BL$CT,GPF02 CTBLK ! 16294: IFF BL$EF,GPF02 EFBLK ! 16295: IFF BL$IC,GPF02 ICBLK ! 16296: IFF BL$KV,GPF02 KVBLK ! 16297: IFF BL$RC,GPF02 RCBLK ! 16298: IFF BL$SC,GPF02 SCBLK ! 16299: IFF BL$SE,GPF02 SEBLK ! 16300: IFF BL$XN,GPF02 XNBLK ! 16301: ESW END OF JUMP TABLE ! 16302: EJC ! 16303: * ! 16304: * GBCPF (CONTINUED) ! 16305: * ! 16306: * CMBLK ! 16307: * ! 16308: GPF04 MOV CMLEN(XR),WA LOAD LENGTH ! 16309: MOV *CMTYP,WB SET OFFSET ! 16310: * ! 16311: * HERE TO PUSH DOWN TO NEW LEVEL ! 16312: * ! 16313: * (WC) FIELD PTR AT PREVIOUS LEVEL ! 16314: * (XR) PTR TO NEW BLOCK ! 16315: * (WA) LENGTH (RELOC FLDS + FLDS AT START) ! 16316: * (WB) OFFSET TO FIRST RELOC FIELD ! 16317: * ! 16318: GPF05 ADD XR,WA POINT PAST LAST RELOC FIELD ! 16319: ADD WB,XR POINT TO FIRST RELOC FIELD ! 16320: MOV WC,-(XS) STACK OLD FIELD POINTER ! 16321: MOV WA,-(XS) STACK NEW LIMIT POINTER ! 16322: CHK CHECK FOR STACK OVERFLOW ! 16323: BRN GPF01 IF OK, BACK TO PROCESS ! 16324: * ! 16325: * ARBLK ! 16326: * ! 16327: GPF06 MOV ARLEN(XR),WA LOAD LENGTH ! 16328: MOV AROFS(XR),WB SET OFFSET TO 1ST RELOC FLD (ARPRO) ! 16329: BRN GPF05 ALL SET ! 16330: * ! 16331: * CCBLK ! 16332: * ! 16333: GPF07 MOV CCUSE(XR),WA SET LENGTH IN USE ! 16334: MOV *CCUSE,WB 1ST WORD (MAKE SURE AT LEAST ONE) ! 16335: BRN GPF05 ALL SET ! 16336: EJC ! 16337: * ! 16338: * GBCPF (CONTINUED) ! 16339: * ! 16340: * CDBLK, TBBLK, VCBLK ! 16341: * ! 16342: GPF08 MOV OFFS2(XR),WA LOAD LENGTH ! 16343: MOV *OFFS3,WB SET OFFSET ! 16344: BRN GPF05 JUMP BACK ! 16345: * ! 16346: * XRBLK ! 16347: * ! 16348: GPF09 MOV XRLEN(XR),WA LOAD LENGTH ! 16349: MOV *XRPTR,WB SET OFFSET ! 16350: BRN GPF05 JUMP BACK ! 16351: * ! 16352: * EVBLK, NMBLK, P0BLK ! 16353: * ! 16354: GPF10 MOV *OFFS2,WA POINT PAST SECOND FIELD ! 16355: MOV *OFFS1,WB OFFSET IS ONE (ONLY RELOC FLD IS 2) ! 16356: BRN GPF05 ALL SET ! 16357: * ! 16358: * FFBLK ! 16359: * ! 16360: GPF11 MOV *FFOFS,WA SET LENGTH ! 16361: MOV *FFNXT,WB SET OFFSET ! 16362: BRN GPF05 ALL SET ! 16363: * ! 16364: * P1BLK, P2BLK ! 16365: * ! 16366: GPF12 MOV *PARM2,WA LENGTH (PARM2 IS NON-RELOCATABLE) ! 16367: MOV *PTHEN,WB SET OFFSET ! 16368: BRN GPF05 ALL SET ! 16369: EJC ! 16370: * ! 16371: * GBCPF (CONTINUED) ! 16372: * ! 16373: * PDBLK ! 16374: * ! 16375: GPF13 MOV PDDFP(XR),XL LOAD PTR TO DFBLK ! 16376: MOV DFPDL(XL),WA GET PDBLK LENGTH ! 16377: MOV *PDFLD,WB SET OFFSET ! 16378: BRN GPF05 ALL SET ! 16379: * ! 16380: * PFBLK ! 16381: * ! 16382: GPF14 MOV *PFARG,WA LENGTH PAST LAST RELOC ! 16383: MOV *PFCOD,WB OFFSET TO FIRST RELOC ! 16384: BRN GPF05 ALL SET ! 16385: * ! 16386: * TEBLK ! 16387: * ! 16388: GPF15 MOV *TESI$,WA SET LENGTH ! 16389: MOV *TESUB,WB AND OFFSET ! 16390: BRN GPF05 ALL SET ! 16391: * ! 16392: * TRBLK ! 16393: * ! 16394: GPF16 MOV *TRSI$,WA SET LENGTH ! 16395: MOV *TRVAL,WB AND OFFSET ! 16396: BRN GPF05 ALL SET ! 16397: * ! 16398: * EXBLK ! 16399: * ! 16400: GPF17 MOV EXLEN(XR),WA LOAD LENGTH ! 16401: MOV *EXFLC,WB SET OFFSET ! 16402: BRN GPF05 JUMP BACK ! 16403: * ! 16404: * BCBLK ! 16405: * ! 16406: GPF18 MOV *BCSI$,WA SET LENGTH ! 16407: MOV *BCBUF,WB AND OFFSET ! 16408: BRN GPF05 ALL SET ! 16409: ENP END PROCEDURE GBCPF ! 16410: EJC ! 16411: * ! 16412: * GTARR -- GET ARRAY ! 16413: * ! 16414: * GTARR IS PASSED AN OBJECT AND RETURNS AN ARRAY IF POSSIBL ! 16415: * ! 16416: * (XR) VALUE TO BE CONVERTED ! 16417: * JSR GTARR CALL TO GET ARRAY ! 16418: * PPM LOC TRANSFER LOC FOR CONVERT IMPOSSIBLE ! 16419: * (XR) RESULTING ARRAY ! 16420: * (XL,WA,WB,WC) DESTROYED ! 16421: * ! 16422: GTARR PRC E,1 ENTRY POINT ! 16423: MOV (XR),WA LOAD TYPE WORD ! 16424: BEQ WA,=B$ART,GTAR8 EXIT IF ALREADY AN ARRAY ! 16425: BEQ WA,=B$VCT,GTAR8 EXIT IF ALREADY AN ARRAY ! 16426: BNE WA,=B$TBT,GTA9A ELSE FAIL IF NOT A TABLE (SGD02) ! 16427: * ! 16428: * HERE WE CONVERT A TABLE TO AN ARRAY ! 16429: * ! 16430: MOV XR,-(XS) REPLACE TBBLK POINTER ON STACK ! 16431: ZER XR SIGNAL FIRST PASS ! 16432: ZER WB ZERO NON-NULL ELEMENT COUNT ! 16433: * ! 16434: * THE FOLLOWING CODE IS EXECUTED TWICE. ON THE FIRST PASS, ! 16435: * SIGNALLED BY XR=0, THE NUMBER OF NON-NULL ELEMENTS IN ! 16436: * THE TABLE IS COUNTED IN WB. IN THE SECOND PASS, WHERE ! 16437: * XR IS A POINTER INTO THE ARBLK, THE NAME AND VALUE ARE ! 16438: * ENTERED INTO THE CURRENT ARBLK LOCATION. ! 16439: * ! 16440: GTAR1 MOV (XS),XL POINT TO TABLE ! 16441: ADD TBLEN(XL),XL POINT PAST LAST BUCKET ! 16442: SUB *TBBUK,XL SET FIRST BUCKET OFFSET ! 16443: MOV XL,WA COPY ADJUSTED POINTER ! 16444: * ! 16445: * LOOP THROUGH BUCKETS IN TABLE BLOCK ! 16446: * NEXT THREE LINES OF CODE RELY ON TENXT HAVING A VALUE ! 16447: * 1 LESS THAN TBBUK. ! 16448: * ! 16449: GTAR2 MOV WA,XL COPY BUCKET POINTER ! 16450: DCA WA DECREMENT BUCKET POINTER ! 16451: * ! 16452: * LOOP THROUGH TEBLKS ON ONE BUCKET CHAIN ! 16453: * ! 16454: GTAR3 MOV TENXT(XL),XL POINT TO NEXT TEBLK ! 16455: BEQ XL,(XS),GTAR6 JUMP IF CHAIN END (TBBLK PTR) ! 16456: MOV XL,CNVTP ELSE SAVE TEBLK POINTER ! 16457: * ! 16458: * LOOP TO FIND VALUE DOWN TRBLK CHAIN ! 16459: * ! 16460: GTAR4 MOV TEVAL(XL),XL LOAD VALUE ! 16461: BEQ (XL),=B$TRT,GTAR4 LOOP TILL VALUE FOUND ! 16462: MOV XL,WC COPY VALUE ! 16463: MOV CNVTP,XL RESTORE TEBLK POINTER ! 16464: EJC ! 16465: * ! 16466: * GTARR (CONTINUED) ! 16467: * ! 16468: * NOW CHECK FOR NULL AND TEST CASES ! 16469: * ! 16470: BEQ WC,=NULLS,GTAR3 LOOP BACK TO IGNORE NULL VALUE ! 16471: BNZ XR,GTAR5 JUMP IF SECOND PASS ! 16472: ICV WB FOR THE FIRST PASS, BUMP COUNT ! 16473: BRN GTAR3 AND LOOP BACK FOR NEXT TEBLK ! 16474: * ! 16475: * HERE IN SECOND PASS ! 16476: * ! 16477: GTAR5 MOV TESUB(XL),(XR)+ STORE SUBSCRIPT NAME ! 16478: MOV WC,(XR)+ STORE VALUE IN ARBLK ! 16479: BRN GTAR3 LOOP BACK FOR NEXT TEBLK ! 16480: * ! 16481: * HERE AFTER SCANNING TEBLKS ON ONE CHAIN ! 16482: * ! 16483: GTAR6 BNE WA,(XS),GTAR2 LOOP BACK IF MORE BUCKETS TO GO ! 16484: BNZ XR,GTAR7 ELSE JUMP IF SECOND PASS ! 16485: * ! 16486: * HERE AFTER COUNTING NON-NULL ELEMENTS ! 16487: * ! 16488: BZE WB,GTAR9 FAIL IF NO NON-NULL ELEMENTS ! 16489: MOV WB,WA ELSE COPY COUNT ! 16490: ADD WB,WA DOUBLE (TWO WORDS/ELEMENT) ! 16491: ADD =ARVL2,WA ADD SPACE FOR STANDARD FIELDS ! 16492: WTB WA CONVERT LENGTH TO BYTES ! 16493: BGE WA,MXLEN,GTAR9 FAIL IF TOO LONG FOR ARRAY ! 16494: JSR ALLOC ELSE ALLOCATE SPACE FOR ARBLK ! 16495: MOV =B$ART,(XR) STORE TYPE WORD ! 16496: ZER IDVAL(XR) ZERO ID FOR THE MOMENT ! 16497: MOV WA,ARLEN(XR) STORE LENGTH ! 16498: MOV =NUM02,ARNDM(XR) SET DIMENSIONS = 2 ! 16499: LDI INTV1 GET INTEGER ONE ! 16500: STI ARLBD(XR) STORE AS LBD 1 ! 16501: STI ARLB2(XR) STORE AS LBD 2 ! 16502: LDI INTV2 LOAD INTEGER TWO ! 16503: STI ARDM2(XR) STORE AS DIM 2 ! 16504: MTI WB GET ELEMENT COUNT AS INTEGER ! 16505: STI ARDIM(XR) STORE AS DIM 1 ! 16506: ZER ARPR2(XR) ZERO PROTOTYPE FIELD FOR NOW ! 16507: MOV *ARPR2,AROFS(XR) SET OFFSET FIELD (SIGNAL PASS 2) ! 16508: MOV XR,WB SAVE ARBLK POINTER ! 16509: ADD *ARVL2,XR POINT TO FIRST ELEMENT LOCATION ! 16510: BRN GTAR1 JUMP BACK TO FILL IN ELEMENTS ! 16511: EJC ! 16512: * ! 16513: * GTARR (CONTINUED) ! 16514: * ! 16515: * HERE AFTER FILLING IN ELEMENT VALUES ! 16516: * ! 16517: GTAR7 MOV WB,XR RESTORE ARBLK POINTER ! 16518: MOV WB,(XS) STORE AS RESULT ! 16519: * ! 16520: * NOW WE NEED THE ARRAY PROTOTYPE WHICH IS OF THE FORM NN,2 ! 16521: * THIS IS OBTAINED BY BUILDING THE STRING FOR NN02 AND ! 16522: * CHANGING THE ZERO TO A COMMA BEFORE STORING IT. ! 16523: * ! 16524: LDI ARDIM(XR) GET NUMBER OF ELEMENTS (NN) ! 16525: MLI INTVH MULTIPLY BY 100 ! 16526: ADI INTV2 ADD 2 (NN02) ! 16527: JSR ICBLD BUILD INTEGER ! 16528: MOV XR,-(XS) STORE PTR FOR GTSTG ! 16529: JSR GTSTG CONVERT TO STRING ! 16530: PPM CONVERT FAIL IS IMPOSSIBLE ! 16531: MOV XR,XL COPY STRING POINTER ! 16532: MOV (XS)+,XR RELOAD ARBLK POINTER ! 16533: MOV XL,ARPR2(XR) STORE PROTOTYPE PTR (NN02) ! 16534: SUB =NUM02,WA ADJUST LENGTH TO POINT TO ZERO ! 16535: PSC XL,WA POINT TO ZERO ! 16536: MOV =CH$CM,WB LOAD A COMMA ! 16537: SCH WB,(XL) STORE A COMMA OVER THE ZERO ! 16538: CSC XL COMPLETE STORE CHARACTERS ! 16539: * ! 16540: * NORMAL RETURN ! 16541: * ! 16542: GTAR8 EXI RETURN TO CALLER ! 16543: * ! 16544: * NON-CONVERSION RETURN ! 16545: * ! 16546: GTAR9 MOV (XS)+,XR RESTORE STACK FOR CONV ERR (SGD02) ! 16547: * ! 16548: * MERGE TO TAKE CONVERT ERROR WHEN STACK ADJUSTED OK ! 16549: * ! 16550: GTA9A EXI 1 RETURN ! 16551: ENP PROCEDURE GTARR ! 16552: EJC ! 16553: * ! 16554: * GTCOD -- CONVERT TO CODE ! 16555: * ! 16556: * (XR) OBJECT TO BE CONVERTED ! 16557: * JSR GTCOD CALL TO CONVERT TO CODE ! 16558: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 16559: * (XR) POINTER TO RESULTING CDBLK ! 16560: * (XL,WA,WB,WC,RA) DESTROYED ! 16561: * ! 16562: * IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE- ! 16563: * EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL ! 16564: * WITHOUT RETURNING TO THIS ROUTINE. ! 16565: * ! 16566: GTCOD PRC E,1 ENTRY POINT ! 16567: BEQ (XR),=B$CDS,GTCD1 JUMP IF ALREADY CODE ! 16568: BEQ (XR),=B$CDC,GTCD1 JUMP IF ALREADY CODE ! 16569: * ! 16570: * HERE WE MUST GENERATE A CDBLK BY COMPILATION ! 16571: * ! 16572: MOV XR,-(XS) STACK ARGUMENT FOR GTSTG ! 16573: JSR GTSTG CONVERT ARGUMENT TO STRING ! 16574: PPM GTCD2 JUMP IF NON-CONVERTIBLE ! 16575: MOV FLPTR,GTCEF SAVE FAIL PTR IN CASE OF ERROR ! 16576: MOV R$COD,R$GTC ALSO SAVE CODE PTR ! 16577: MOV XR,R$CIM ELSE SET IMAGE POINTER ! 16578: MOV WA,SCNIL SET IMAGE LENGTH ! 16579: ZER SCNPT SET SCAN POINTER ! 16580: MOV =STGXC,STAGE SET STAGE FOR EXECUTE COMPILE ! 16581: MOV CMPSN,LSTSN IN CASE LISTR CALLED ! 16582: JSR CMPIL COMPILE STRING ! 16583: MOV =STGXT,STAGE RESET STAGE FOR EXECUTE TIME ! 16584: ZER R$CIM CLEAR IMAGE ! 16585: * ! 16586: * MERGE HERE IF NO CONVERT REQUIRED ! 16587: * ! 16588: GTCD1 EXI GIVE NORMAL GTCOD RETURN ! 16589: * ! 16590: * HERE IF UNCONVERTIBLE ! 16591: * ! 16592: GTCD2 EXI 1 GIVE ERROR RETURN ! 16593: ENP END PROCEDURE GTCOD ! 16594: EJC ! 16595: * ! 16596: * GTEXP -- CONVERT TO EXPRESSION ! 16597: * ! 16598: * (XR) INPUT VALUE TO BE CONVERTED ! 16599: * JSR GTEXP CALL TO CONVERT TO EXPRESSION ! 16600: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 16601: * (XR) POINTER TO RESULT EXBLK OR SEBLK ! 16602: * (XL,WA,WB,WC,RA) DESTROYED ! 16603: * ! 16604: * IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE- ! 16605: * EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL ! 16606: * WITHOUT RETURNING TO THIS ROUTINE. ! 16607: * ! 16608: GTEXP PRC E,1 ENTRY POINT ! 16609: BLO (XR),=B$E$$,GTEX1 JUMP IF ALREADY AN EXPRESSION ! 16610: MOV XR,-(XS) STORE ARGUMENT FOR GTSTG ! 16611: JSR GTSTG CONVERT ARGUMENT TO STRING ! 16612: PPM GTEX2 JUMP IF UNCONVERTIBLE ! 16613: * ! 16614: * CHECK THE LAST CHARACTER OF THE STRING FOR COLON OR ! 16615: * SEMICOLON. THESE CHARACTERS CAN LEGITIMATELY END AN ! 16616: * EXPRESSION IN OPEN CODE, SO EXPAN WILL NOT DETECT THEM ! 16617: * AS ERRORS, BUT THEY ARE INVALID AS TERMINATORS FOR A ! 16618: * STRING THAT IS BEING CONVERTED TO EXPRESSION FORM. ! 16619: * ! 16620: MOV XR,XL COPY INPUT STRING POINTER (REG06) ! 16621: PLC XL,WA POINT ONE PAST THE STRING END (REG06) ! 16622: LCH XL,-(XL) FETCH THE LAST CHARACTER (REG06) ! 16623: BEQ XL,=CH$CL,GTEX2 ERROR IF IT IS A SEMICOLON (REG06) ! 16624: BEQ XL,=CH$SM,GTEX2 OR IF IT IS A COLON (REG06) ! 16625: * ! 16626: * HERE WE CONVERT A STRING BY COMPILATION ! 16627: * ! 16628: MOV XR,R$CIM SET INPUT IMAGE POINTER ! 16629: ZER SCNPT SET SCAN POINTER ! 16630: MOV WA,SCNIL SET INPUT IMAGE LENGTH ! 16631: ZER WB SET CODE FOR NORMAL SCAN ! 16632: MOV FLPTR,GTCEF SAVE FAIL PTR IN CASE OF ERROR ! 16633: MOV R$COD,R$GTC ALSO SAVE CODE PTR ! 16634: MOV =STGEV,STAGE ADJUST STAGE FOR COMPILE ! 16635: MOV =T$UOK,SCNTP INDICATE UNARY OPERATOR ACCEPTABLE ! 16636: JSR EXPAN BUILD TREE FOR EXPRESSION ! 16637: ZER SCNRS RESET RESCAN FLAG ! 16638: BNE SCNPT,SCNIL,GTEX2 ERROR IF NOT END OF IMAGE ! 16639: ZER WB SET OK VALUE FOR CDGEX CALL ! 16640: MOV XR,XL COPY TREE POINTER ! 16641: JSR CDGEX BUILD EXPRESSION BLOCK ! 16642: ZER R$CIM CLEAR POINTER ! 16643: MOV =STGXT,STAGE RESTORE STAGE FOR EXECUTE TIME ! 16644: * ! 16645: * MERGE HERE IF NO CONVERSION REQUIRED ! 16646: * ! 16647: GTEX1 EXI RETURN TO GTEXP CALLER ! 16648: * ! 16649: * HERE IF UNCONVERTIBLE ! 16650: * ! 16651: GTEX2 EXI 1 TAKE ERROR EXIT ! 16652: ENP END PROCEDURE GTEXP ! 16653: EJC ! 16654: * ! 16655: * GTINT -- GET INTEGER VALUE ! 16656: * ! 16657: * GTINT IS PASSED AN OBJECT AND RETURNS AN INTEGER AFTER ! 16658: * PERFORMING ANY NECESSARY CONVERSIONS. ! 16659: * ! 16660: * (XR) VALUE TO BE CONVERTED ! 16661: * JSR GTINT CALL TO CONVERT TO INTEGER ! 16662: * PPM LOC TRANSFER LOC FOR CONVERT IMPOSSIBLE ! 16663: * (XR) RESULTING INTEGER ! 16664: * (WC,RA) DESTROYED ! 16665: * (WA,WB) DESTROYED (ONLY ON CONVERSION ERR) ! 16666: * (XR) UNCHANGED (ON CONVERT ERROR) ! 16667: * ! 16668: GTINT PRC E,1 ENTRY POINT ! 16669: BEQ (XR),=B$ICL,GTIN2 JUMP IF ALREADY AN INTEGER ! 16670: MOV WA,GTINA ELSE SAVE WA ! 16671: MOV WB,GTINB SAVE WB ! 16672: JSR GTNUM CONVERT TO NUMERIC ! 16673: PPM GTIN3 JUMP IF UNCONVERTIBLE ! 16674: BEQ WA,=B$ICL,GTIN1 JUMP IF INTEGER ! 16675: * ! 16676: * HERE WE CONVERT A REAL TO INTEGER ! 16677: * ! 16678: LDR RCVAL(XR) LOAD REAL VALUE ! 16679: RTI GTIN3 CONVERT TO INTEGER (ERR IF OVFLOW) ! 16680: JSR ICBLD IF OK BUILD ICBLK ! 16681: * ! 16682: * HERE AFTER SUCCESSFUL CONVERSION TO INTEGER ! 16683: * ! 16684: GTIN1 MOV GTINA,WA RESTORE WA ! 16685: MOV GTINB,WB RESTORE WB ! 16686: * ! 16687: * COMMON EXIT POINT ! 16688: * ! 16689: GTIN2 EXI RETURN TO GTINT CALLER ! 16690: * ! 16691: * HERE ON CONVERSION ERROR ! 16692: * ! 16693: GTIN3 EXI 1 TAKE CONVERT ERROR EXIT ! 16694: ENP END PROCEDURE GTINT ! 16695: EJC ! 16696: * ! 16697: * GTNUM -- GET NUMERIC VALUE ! 16698: * ! 16699: * GTNUM IS GIVEN AN OBJECT AND RETURNS EITHER AN INTEGER ! 16700: * OR A REAL, PERFORMING ANY NECESSARY CONVERSIONS. ! 16701: * ! 16702: * (XR) OBJECT TO BE CONVERTED ! 16703: * JSR GTNUM CALL TO CONVERT TO NUMERIC ! 16704: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 16705: * (XR) POINTER TO RESULT (INT OR REAL) ! 16706: * (WA) FIRST WORD OF RESULT BLOCK ! 16707: * (WB,WC,RA) DESTROYED ! 16708: * (XR) UNCHANGED (ON CONVERT ERROR) ! 16709: * ! 16710: GTNUM PRC E,1 ENTRY POINT ! 16711: MOV (XR),WA LOAD FIRST WORD OF BLOCK ! 16712: BEQ WA,=B$ICL,GTN34 JUMP IF INTEGER (NO CONVERSION) ! 16713: BEQ WA,=B$RCL,GTN34 JUMP IF REAL (NO CONVERSION) ! 16714: * ! 16715: * AT THIS POINT THE ONLY POSSIBILITY IS TO CONVERT A STRING ! 16716: * TO AN INTEGER OR REAL AS APPROPRIATE. ! 16717: * ! 16718: MOV XR,-(XS) STACK ARGUMENT IN CASE CONVERT ERR ! 16719: MOV XR,-(XS) STACK ARGUMENT FOR GTSTG ! 16720: JSR GTSTG CONVERT ARGUMENT TO STRING ! 16721: PPM GTN36 JUMP IF UNCONVERTIBLE ! 16722: * ! 16723: * INITIALIZE NUMERIC CONVERSION ! 16724: * ! 16725: LDI INTV0 INITIALIZE INTEGER RESULT TO ZERO ! 16726: BZE WA,GTN32 JUMP TO EXIT WITH ZERO IF NULL ! 16727: LCT WA,WA SET BCT COUNTER FOR FOLLOWING LOOPS ! 16728: ZER GTNNF TENTATIVELY INDICATE RESULT + ! 16729: STI GTNEX INITIALISE EXPONENT TO ZERO ! 16730: ZER GTNSC ZERO SCALE IN CASE REAL ! 16731: ZER GTNDF RESET FLAG FOR DEC POINT FOUND ! 16732: ZER GTNRD RESET FLAG FOR DIGITS FOUND ! 16733: LDR REAV0 ZERO REAL ACCUM IN CASE REAL ! 16734: PLC XR POINT TO ARGUMENT CHARACTERS ! 16735: * ! 16736: * MERGE BACK HERE AFTER IGNORING LEADING BLANK ! 16737: * ! 16738: GTN01 LCH WB,(XR)+ LOAD FIRST CHARACTER ! 16739: BLT WB,=CH$D0,GTN02 JUMP IF NOT DIGIT ! 16740: BLE WB,=CH$D9,GTN06 JUMP IF FIRST CHAR IS A DIGIT ! 16741: EJC ! 16742: * ! 16743: * GTNUM (CONTINUED) ! 16744: * ! 16745: * HERE IF FIRST DIGIT IS NON-DIGIT ! 16746: * ! 16747: GTN02 BNE WB,=CH$BL,GTN03 JUMP IF NON-BLANK ! 16748: GTNA2 BCT WA,GTN01 ELSE DECR COUNT AND LOOP BACK ! 16749: BRN GTN07 JUMP TO RETURN ZERO IF ALL BLANKS ! 16750: * ! 16751: * HERE FOR FIRST CHARACTER NON-BLANK, NON-DIGIT ! 16752: * ! 16753: GTN03 BEQ WB,=CH$PL,GTN04 JUMP IF PLUS SIGN ! 16754: BEQ WB,=CH$HT,GTNA2 HORIZONTAL TAB EQUIV TO BLANK ! 16755: BNE WB,=CH$MN,GTN12 JUMP IF NOT MINUS (MAY BE REAL) ! 16756: MNZ GTNNF IF MINUS SIGN, SET NEGATIVE FLAG ! 16757: * ! 16758: * MERGE HERE AFTER PROCESSING SIGN ! 16759: * ! 16760: GTN04 BCT WA,GTN05 JUMP IF CHARS LEFT ! 16761: BRN GTN36 ELSE ERROR ! 16762: * ! 16763: * LOOP TO FETCH CHARACTERS OF AN INTEGER ! 16764: * ! 16765: GTN05 LCH WB,(XR)+ LOAD NEXT CHARACTER ! 16766: BLT WB,=CH$D0,GTN08 JUMP IF NOT A DIGIT ! 16767: BGT WB,=CH$D9,GTN08 JUMP IF NOT A DIGIT ! 16768: * ! 16769: * MERGE HERE FOR FIRST DIGIT ! 16770: * ! 16771: GTN06 STI GTNSI SAVE CURRENT VALUE ! 16772: CVM GTN35 CURRENT*10-(NEW DIG) JUMP IF OVFLOW ! 16773: MNZ GTNRD SET DIGIT READ FLAG ! 16774: BCT WA,GTN05 ELSE LOOP BACK IF MORE CHARS ! 16775: * ! 16776: * HERE TO EXIT WITH CONVERTED INTEGER VALUE ! 16777: * ! 16778: GTN07 BNZ GTNNF,GTN32 JUMP IF NEGATIVE (ALL SET) ! 16779: NGI ELSE NEGATE ! 16780: INO GTN32 JUMP IF NO OVERFLOW ! 16781: BRN GTN36 ELSE SIGNAL ERROR ! 16782: EJC ! 16783: * ! 16784: * GTNUM (CONTINUED) ! 16785: * ! 16786: * HERE FOR A NON-DIGIT CHARACTER WHILE ATTEMPTING TO ! 16787: * CONVERT AN INTEGER, CHECK FOR TRAILING BLANKS OR REAL. ! 16788: * ! 16789: GTN08 BEQ WB,=CH$BL,GTNA9 JUMP IF A BLANK ! 16790: BEQ WB,=CH$HT,GTNA9 JUMP IF HORIZONTAL TAB ! 16791: ITR ELSE CONVERT INTEGER TO REAL ! 16792: NGR NEGATE TO GET POSITIVE VALUE ! 16793: BRN GTN12 JUMP TO TRY FOR REAL ! 16794: * ! 16795: * HERE WE SCAN OUT BLANKS TO END OF STRING ! 16796: * ! 16797: GTN09 LCH WB,(XR)+ GET NEXT CHAR ! 16798: BEQ WB,=CH$HT,GTNA9 JUMP IF HORIZONTAL TAB ! 16799: BNE WB,=CH$BL,GTN36 ERROR IF NON-BLANK ! 16800: GTNA9 BCT WA,GTN09 LOOP BACK IF MORE CHARS TO CHECK ! 16801: BRN GTN07 RETURN INTEGER IF ALL BLANKS ! 16802: * ! 16803: * LOOP TO COLLECT MANTISSA OF REAL ! 16804: * ! 16805: GTN10 LCH WB,(XR)+ LOAD NEXT CHARACTER ! 16806: BLT WB,=CH$D0,GTN12 JUMP IF NON-NUMERIC ! 16807: BGT WB,=CH$D9,GTN12 JUMP IF NON-NUMERIC ! 16808: * ! 16809: * MERGE HERE TO COLLECT FIRST REAL DIGIT ! 16810: * ! 16811: GTN11 SUB =CH$D0,WB CONVERT DIGIT TO NUMBER ! 16812: MLR REAVT MULTIPLY REAL BY 10.0 ! 16813: ROV GTN36 CONVERT ERROR IF OVERFLOW ! 16814: STR GTNSR SAVE RESULT ! 16815: MTI WB GET NEW DIGIT AS INTEGER ! 16816: ITR CONVERT NEW DIGIT TO REAL ! 16817: ADR GTNSR ADD TO GET NEW TOTAL ! 16818: ADD GTNDF,GTNSC INCREMENT SCALE IF AFTER DEC POINT ! 16819: MNZ GTNRD SET DIGIT FOUND FLAG ! 16820: BCT WA,GTN10 LOOP BACK IF MORE CHARS ! 16821: BRN GTN22 ELSE JUMP TO SCALE ! 16822: EJC ! 16823: * ! 16824: * GTNUM (CONTINUED) ! 16825: * ! 16826: * HERE IF NON-DIGIT FOUND WHILE COLLECTING A REAL ! 16827: * ! 16828: GTN12 BNE WB,=CH$DT,GTN13 JUMP IF NOT DEC POINT ! 16829: BNZ GTNDF,GTN36 IF DEC POINT, ERROR IF ONE ALREADY ! 16830: MOV =NUM01,GTNDF ELSE SET FLAG FOR DEC POINT ! 16831: BCT WA,GTN10 LOOP BACK IF MORE CHARS ! 16832: BRN GTN22 ELSE JUMP TO SCALE ! 16833: * ! 16834: * HERE IF NOT DECIMAL POINT ! 16835: * ! 16836: GTN13 BEQ WB,=CH$LE,GTN15 JUMP IF E FOR EXPONENT ! 16837: BEQ WB,=CH$LD,GTN15 JUMP IF D FOR EXPONENT ! 16838: BEQ WB,=CH$$E,GTN15 JUMP IF E FOR EXPONENT ! 16839: BEQ WB,=CH$$D,GTN15 JUMP IF D FOR EXPONENT ! 16840: * ! 16841: * HERE CHECK FOR TRAILING BLANKS ! 16842: * ! 16843: GTN14 BEQ WB,=CH$BL,GTNB4 JUMP IF BLANK ! 16844: BEQ WB,=CH$HT,GTNB4 JUMP IF HORIZONTAL TAB ! 16845: BRN GTN36 ERROR IF NON-BLANK ! 16846: * ! 16847: GTNB4 LCH WB,(XR)+ GET NEXT CHARACTER ! 16848: BCT WA,GTN14 LOOP BACK TO CHECK IF MORE ! 16849: BRN GTN22 ELSE JUMP TO SCALE ! 16850: * ! 16851: * HERE TO READ AND PROCESS AN EXPONENT ! 16852: * ! 16853: GTN15 ZER GTNES SET EXPONENT SIGN POSITIVE ! 16854: LDI INTV0 INITIALIZE EXPONENT TO ZERO ! 16855: MNZ GTNDF RESET NO DEC POINT INDICATION ! 16856: BCT WA,GTN16 JUMP SKIPPING PAST E OR D ! 16857: BRN GTN36 ERROR IF NULL EXPONENT ! 16858: * ! 16859: * CHECK FOR EXPONENT SIGN ! 16860: * ! 16861: GTN16 LCH WB,(XR)+ LOAD FIRST EXPONENT CHARACTER ! 16862: BEQ WB,=CH$PL,GTN17 JUMP IF PLUS SIGN ! 16863: BNE WB,=CH$MN,GTN19 ELSE JUMP IF NOT MINUS SIGN ! 16864: MNZ GTNES SET SIGN NEGATIVE IF MINUS SIGN ! 16865: * ! 16866: * MERGE HERE AFTER PROCESSING EXPONENT SIGN ! 16867: * ! 16868: GTN17 BCT WA,GTN18 JUMP IF CHARS LEFT ! 16869: BRN GTN36 ELSE ERROR ! 16870: * ! 16871: * LOOP TO CONVERT EXPONENT DIGITS ! 16872: * ! 16873: GTN18 LCH WB,(XR)+ LOAD NEXT CHARACTER ! 16874: EJC ! 16875: * ! 16876: * GTNUM (CONTINUED) ! 16877: * ! 16878: * MERGE HERE FOR FIRST EXPONENT DIGIT ! 16879: * ! 16880: GTN19 BLT WB,=CH$D0,GTN20 JUMP IF NOT DIGIT ! 16881: BGT WB,=CH$D9,GTN20 JUMP IF NOT DIGIT ! 16882: CVM GTN36 ELSE CURRENT*10, SUBTRACT NEW DIGIT ! 16883: BCT WA,GTN18 LOOP BACK IF MORE CHARS ! 16884: BRN GTN21 JUMP IF EXPONENT FIELD IS EXHAUSTED ! 16885: * ! 16886: * HERE TO CHECK FOR TRAILING BLANKS AFTER EXPONENT ! 16887: * ! 16888: GTN20 BEQ WB,=CH$BL,GTNC0 JUMP IF BLANK ! 16889: BEQ WB,=CH$HT,GTNC0 JUMP IF HORIZONTAL TAB ! 16890: BRN GTN36 ERROR IF NON-BLANK ! 16891: * ! 16892: GTNC0 LCH WB,(XR)+ GET NEXT CHARACTER ! 16893: BCT WA,GTN20 LOOP BACK TILL ALL BLANKS SCANNED ! 16894: * ! 16895: * MERGE HERE AFTER COLLECTING EXPONENT ! 16896: * ! 16897: GTN21 STI GTNEX SAVE COLLECTED EXPONENT ! 16898: BNZ GTNES,GTN22 JUMP IF IT WAS NEGATIVE ! 16899: NGI ELSE COMPLEMENT ! 16900: IOV GTN36 ERROR IF OVERFLOW ! 16901: STI GTNEX AND STORE POSITIVE EXPONENT ! 16902: * ! 16903: * MERGE HERE WITH EXPONENT (0 IF NONE GIVEN) ! 16904: * ! 16905: GTN22 BZE GTNRD,GTN36 ERROR IF NOT DIGITS COLLECTED ! 16906: BZE GTNDF,GTN36 ERROR IF NO EXPONENT OR DEC POINT ! 16907: MTI GTNSC ELSE LOAD SCALE AS INTEGER ! 16908: SBI GTNEX SUBTRACT EXPONENT ! 16909: IOV GTN36 ERROR IF OVERFLOW ! 16910: ILT GTN26 JUMP IF WE MUST SCALE UP ! 16911: * ! 16912: * HERE WE HAVE A NEGATIVE EXPONENT, SO SCALE DOWN ! 16913: * ! 16914: MFI WA,GTN36 LOAD SCALE FACTOR, ERR IF OVFLOW ! 16915: * ! 16916: * LOOP TO SCALE DOWN IN STEPS OF 10**10 ! 16917: * ! 16918: GTN23 BLE WA,=NUM10,GTN24 JUMP IF 10 OR LESS TO GO ! 16919: DVR REATT ELSE DIVIDE BY 10**10 ! 16920: SUB =NUM10,WA DECREMENT SCALE ! 16921: BRN GTN23 AND LOOP BACK ! 16922: EJC ! 16923: * ! 16924: * GTNUM (CONTINUED) ! 16925: * ! 16926: * HERE SCALE REST OF WAY FROM POWERS OF TEN TABLE ! 16927: * ! 16928: GTN24 BZE WA,GTN30 JUMP IF SCALED ! 16929: LCT WB,=CFP$R ELSE GET INDEXING FACTOR ! 16930: MOV =REAV1,XR POINT TO POWERS OF TEN TABLE ! 16931: WTB WA CONVERT REMAINING SCALE TO BYTE OFS ! 16932: * ! 16933: * LOOP TO POINT TO POWERS OF TEN TABLE ENTRY ! 16934: * ! 16935: GTN25 ADD WA,XR BUMP POINTER ! 16936: BCT WB,GTN25 ONCE FOR EACH VALUE WORD ! 16937: DVR (XR) SCALE DOWN AS REQUIRED ! 16938: BRN GTN30 AND JUMP ! 16939: * ! 16940: * COME HERE TO SCALE RESULT UP (POSITIVE EXPONENT) ! 16941: * ! 16942: GTN26 NGI GET ABSOLUTE VALUE OF EXPONENT ! 16943: IOV GTN36 ERROR IF OVERFLOW ! 16944: MFI WA,GTN36 ACQUIRE SCALE, ERROR IF OVFLOW ! 16945: * ! 16946: * LOOP TO SCALE UP IN STEPS OF 10**10 ! 16947: * ! 16948: GTN27 BLE WA,=NUM10,GTN28 JUMP IF 10 OR LESS TO GO ! 16949: MLR REATT ELSE MULTIPLY BY 10**10 ! 16950: ROV GTN36 ERROR IF OVERFLOW ! 16951: SUB =NUM10,WA ELSE DECREMENT SCALE ! 16952: BRN GTN27 AND LOOP BACK ! 16953: * ! 16954: * HERE TO SCALE UP REST OF WAY WITH TABLE ! 16955: * ! 16956: GTN28 BZE WA,GTN30 JUMP IF SCALED ! 16957: LCT WB,=CFP$R ELSE GET INDEXING FACTOR ! 16958: MOV =REAV1,XR POINT TO POWERS OF TEN TABLE ! 16959: WTB WA CONVERT REMAINING SCALE TO BYTE OFS ! 16960: * ! 16961: * LOOP TO POINT TO PROPER ENTRY IN POWERS OF TEN TABLE ! 16962: * ! 16963: GTN29 ADD WA,XR BUMP POINTER ! 16964: BCT WB,GTN29 ONCE FOR EACH WORD IN VALUE ! 16965: MLR (XR) SCALE UP ! 16966: ROV GTN36 ERROR IF OVERFLOW ! 16967: EJC ! 16968: * ! 16969: * GTNUM (CONTINUED) ! 16970: * ! 16971: * HERE WITH REAL VALUE SCALED AND READY EXCEPT FOR SIGN ! 16972: * ! 16973: GTN30 BZE GTNNF,GTN31 JUMP IF POSITIVE ! 16974: NGR ELSE NEGATE ! 16975: * ! 16976: * HERE WITH PROPERLY SIGNED REAL VALUE IN (RA) ! 16977: * ! 16978: GTN31 JSR RCBLD BUILD REAL BLOCK ! 16979: BRN GTN33 MERGE TO EXIT ! 16980: * ! 16981: * HERE WITH PROPERLY SIGNED INTEGER VALUE IN (IA) ! 16982: * ! 16983: GTN32 JSR ICBLD BUILD ICBLK ! 16984: * ! 16985: * REAL MERGES HERE ! 16986: * ! 16987: GTN33 MOV (XR),WA LOAD FIRST WORD OF RESULT BLOCK ! 16988: ICA XS POP ARGUMENT OFF STACK ! 16989: * ! 16990: * COMMON EXIT POINT ! 16991: * ! 16992: GTN34 EXI RETURN TO GTNUM CALLER ! 16993: * ! 16994: * COME HERE IF OVERFLOW OCCURS DURING COLLECTION OF INTEGER ! 16995: * ! 16996: GTN35 LDI GTNSI RELOAD INTEGER SO FAR ! 16997: ITR CONVERT TO REAL ! 16998: NGR MAKE VALUE POSITIVE ! 16999: BRN GTN11 MERGE WITH REAL CIRCUIT ! 17000: * ! 17001: * HERE FOR UNCONVERTIBLE TO STRING OR CONVERSION ERROR ! 17002: * ! 17003: GTN36 MOV (XS)+,XR RELOAD ORIGINAL ARGUMENT ! 17004: EXI 1 TAKE CONVERT-ERROR EXIT ! 17005: ENP END PROCEDURE GTNUM ! 17006: EJC ! 17007: * ! 17008: * GTNVR -- CONVERT TO NATURAL VARIABLE ! 17009: * ! 17010: * GTNVR LOCATES A VARIABLE BLOCK (VRBLK) GIVEN EITHER AN ! 17011: * APPROPRIATE NAME (NMBLK) OR A NON-NULL STRING (SCBLK). ! 17012: * ! 17013: * (XR) ARGUMENT ! 17014: * JSR GTNVR CALL TO CONVERT TO NATURAL VARIABLE ! 17015: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 17016: * (XR) POINTER TO VRBLK ! 17017: * (WA,WB) DESTROYED (CONVERSION ERROR ONLY) ! 17018: * (WC) DESTROYED ! 17019: * ! 17020: GTNVR PRC E,1 ENTRY POINT ! 17021: BNE (XR),=B$NML,GNV02 JUMP IF NOT NAME ! 17022: MOV NMBAS(XR),XR ELSE LOAD NAME BASE IF NAME ! 17023: BLO XR,STATE,GNV07 SKIP IF VRBLK (IN STATIC REGION) ! 17024: * ! 17025: * COMMON ERROR EXIT ! 17026: * ! 17027: GNV01 EXI 1 TAKE CONVERT-ERROR EXIT ! 17028: * ! 17029: * HERE IF NOT NAME ! 17030: * ! 17031: GNV02 MOV WA,GNVSA SAVE WA ! 17032: MOV WB,GNVSB SAVE WB ! 17033: MOV XR,-(XS) STACK ARGUMENT FOR GTSTG ! 17034: JSR GTSTG CONVERT ARGUMENT TO STRING ! 17035: PPM GNV01 JUMP IF CONVERSION ERROR ! 17036: BZE WA,GNV01 NULL STRING IS AN ERROR ! 17037: JSR FLSTG FOLD LOWER CASE TO UPPER CASE ! 17038: MOV XL,-(XS) SAVE XL ! 17039: MOV XR,-(XS) STACK STRING PTR FOR LATER ! 17040: MOV XR,WB COPY STRING POINTER ! 17041: ADD *SCHAR,WB POINT TO CHARACTERS OF STRING ! 17042: MOV WB,GNVST SAVE POINTER TO CHARACTERS ! 17043: MOV WA,WB COPY LENGTH ! 17044: CTW WB,0 GET NUMBER OF WORDS IN NAME ! 17045: MOV WB,GNVNW SAVE FOR LATER ! 17046: JSR HASHS COMPUTE HASH INDEX FOR STRING ! 17047: RMI HSHNB COMPUTE HASH OFFSET BY TAKING MOD ! 17048: MFI WC GET AS OFFSET ! 17049: WTB WC CONVERT OFFSET TO BYTES ! 17050: ADD HSHTB,WC POINT TO PROPER HASH CHAIN ! 17051: SUB *VRNXT,WC SUBTRACT OFFSET TO MERGE INTO LOOP ! 17052: EJC ! 17053: * ! 17054: * GTNVR (CONTINUED) ! 17055: * ! 17056: * LOOP TO SEARCH HASH CHAIN ! 17057: * ! 17058: GNV03 MOV WC,XL COPY HASH CHAIN POINTER ! 17059: MOV VRNXT(XL),XL POINT TO NEXT VRBLK ON CHAIN ! 17060: BZE XL,GNV08 JUMP IF END OF CHAIN ! 17061: MOV XL,WC SAVE POINTER TO THIS VRBLK ! 17062: BNZ VRLEN(XL),GNV04 JUMP IF NOT SYSTEM VARIABLE ! 17063: MOV VRSVP(XL),XL ELSE POINT TO SVBLK ! 17064: SUB *VRSOF,XL ADJUST OFFSET FOR MERGE ! 17065: * ! 17066: * MERGE HERE WITH STRING PTR (LIKE VRBLK) IN XL ! 17067: * ! 17068: GNV04 BNE WA,VRLEN(XL),GNV03 BACK FOR NEXT VRBLK IF LENGTHS NE ! 17069: ADD *VRCHS,XL ELSE POINT TO CHARS OF CHAIN ENTRY ! 17070: LCT WB,GNVNW GET WORD COUNTER TO CONTROL LOOP ! 17071: MOV GNVST,XR POINT TO CHARS OF NEW NAME ! 17072: * ! 17073: * LOOP TO COMPARE CHARACTERS OF THE TWO NAMES ! 17074: * ! 17075: GNV05 CNE (XR),(XL),GNV03 JUMP IF NO MATCH FOR NEXT VRBLK ! 17076: ICA XR BUMP NEW NAME POINTER ! 17077: ICA XL BUMP VRBLK IN CHAIN NAME POINTER ! 17078: BCT WB,GNV05 ELSE LOOP TILL ALL COMPARED ! 17079: MOV WC,XR WE HAVE FOUND A MATCH, GET VRBLK ! 17080: * ! 17081: * EXIT POINT AFTER FINDING VRBLK OR BUILDING NEW ONE ! 17082: * ! 17083: GNV06 MOV GNVSA,WA RESTORE WA ! 17084: MOV GNVSB,WB RESTORE WB ! 17085: ICA XS POP STRING POINTER ! 17086: MOV (XS)+,XL RESTORE XL ! 17087: * ! 17088: * COMMON EXIT POINT ! 17089: * ! 17090: GNV07 EXI RETURN TO GTNVR CALLER ! 17091: * ! 17092: * NOT FOUND, PREPARE TO SEARCH SYSTEM VARIABLE TABLE ! 17093: * ! 17094: GNV08 ZER XR CLEAR GARBAGE XR POINTER ! 17095: MOV WC,GNVHE SAVE PTR TO END OF HASH CHAIN ! 17096: BGT WA,=NUM09,GNV14 CANNOT BE SYSTEM VAR IF LENGTH GT 9 ! 17097: MOV WA,XL ELSE COPY LENGTH ! 17098: WTB XL CONVERT TO BYTE OFFSET ! 17099: MOV VSRCH(XL),XL POINT TO FIRST SVBLK OF THIS LENGTH ! 17100: EJC ! 17101: * ! 17102: * GTNVR (CONTINUED) ! 17103: * ! 17104: * LOOP TO SEARCH ENTRIES IN STANDARD VARIABLE TABLE ! 17105: * ! 17106: GNV09 MOV XL,GNVSP SAVE TABLE POINTER ! 17107: MOV (XL)+,WC LOAD SVBIT BIT STRING ! 17108: MOV (XL)+,WB LOAD LENGTH FROM TABLE ENTRY ! 17109: BNE WA,WB,GNV14 JUMP IF END OF RIGHT LENGTH ENTIRES ! 17110: LCT WB,GNVNW GET WORD COUNTER TO CONTROL LOOP ! 17111: MOV GNVST,XR POINT TO CHARS OF NEW NAME ! 17112: * ! 17113: * LOOP TO CHECK FOR MATCHING NAMES ! 17114: * ! 17115: GNV10 CNE (XR),(XL),GNV11 JUMP IF NAME MISMATCH ! 17116: ICA XR ELSE BUMP NEW NAME POINTER ! 17117: ICA XL BUMP SVBLK POINTER ! 17118: BCT WB,GNV10 ELSE LOOP UNTIL ALL CHECKED ! 17119: * ! 17120: * HERE WE HAVE A MATCH IN THE STANDARD VARIABLE TABLE ! 17121: * ! 17122: ZER WC SET VRLEN VALUE ZERO ! 17123: MOV *VRSI$,WA SET STANDARD SIZE ! 17124: BRN GNV15 JUMP TO BUILD VRBLK ! 17125: * ! 17126: * HERE IF NO MATCH WITH TABLE ENTRY IN SVBLKS TABLE ! 17127: * ! 17128: GNV11 ICA XL BUMP PAST WORD OF CHARS ! 17129: BCT WB,GNV11 LOOP BACK IF MORE TO GO ! 17130: RSH WC,SVNBT REMOVE UNINTERESTING BITS ! 17131: * ! 17132: * LOOP TO BUMP TABLE PTR FOR EACH FLAGGED WORD ! 17133: * ! 17134: GNV12 MOV BITS1,WB LOAD BIT TO TEST ! 17135: ANB WC,WB TEST FOR WORD PRESENT ! 17136: ZRB WB,GNV13 JUMP IF NOT PRESENT ! 17137: ICA XL ELSE BUMP TABLE POINTER ! 17138: * ! 17139: * HERE AFTER DEALING WITH ONE WORD (ONE BIT) ! 17140: * ! 17141: GNV13 RSH WC,1 REMOVE BIT ALREADY PROCESSED ! 17142: NZB WC,GNV12 LOOP BACK IF MORE BITS TO TEST ! 17143: BRN GNV09 ELSE LOOP BACK FOR NEXT SVBLK ! 17144: * ! 17145: * HERE IF NOT SYSTEM VARIABLE ! 17146: * ! 17147: GNV14 MOV WA,WC COPY VRLEN VALUE ! 17148: MOV =VRCHS,WA LOAD STANDARD SIZE -CHARS ! 17149: ADD GNVNW,WA ADJUST FOR CHARS OF NAME ! 17150: WTB WA CONVERT LENGTH TO BYTES ! 17151: EJC ! 17152: * ! 17153: * GTNVR (CONTINUED) ! 17154: * ! 17155: * MERGE HERE TO BUILD VRBLK ! 17156: * ! 17157: GNV15 JSR ALOST ALLOCATE SPACE FOR VRBLK (STATIC) ! 17158: MOV XR,WB SAVE VRBLK POINTER ! 17159: MOV =STNVR,XL POINT TO MODEL VARIABLE BLOCK ! 17160: MOV *VRLEN,WA SET LENGTH OF STANDARD FIELDS ! 17161: MVW SET INITIAL FIELDS OF NEW BLOCK ! 17162: MOV GNVHE,XL LOAD POINTER TO END OF HASH CHAIN ! 17163: MOV WB,VRNXT(XL) ADD NEW BLOCK TO END OF CHAIN ! 17164: MOV WC,(XR)+ SET VRLEN FIELD, BUMP PTR ! 17165: MOV GNVNW,WA GET LENGTH IN WORDS ! 17166: WTB WA CONVERT TO LENGTH IN BYTES ! 17167: BZE WC,GNV16 JUMP IF SYSTEM VARIABLE ! 17168: * ! 17169: * HERE FOR NON-SYSTEM VARIABLE -- SET CHARS OF NAME ! 17170: * ! 17171: MOV (XS),XL POINT BACK TO STRING NAME ! 17172: ADD *SCHAR,XL POINT TO CHARS OF NAME ! 17173: MVW MOVE CHARACTERS INTO PLACE ! 17174: MOV WB,XR RESTORE VRBLK POINTER ! 17175: BRN GNV06 JUMP BACK TO EXIT ! 17176: * ! 17177: * HERE FOR SYSTEM VARIABLE CASE TO FILL IN FIELDS WHERE ! 17178: * NECESSARY FROM THE FIELDS PRESENT IN THE SVBLK. ! 17179: * ! 17180: GNV16 MOV GNVSP,XL LOAD POINTER TO SVBLK ! 17181: MOV XL,(XR) SET SVBLK PTR IN VRBLK ! 17182: MOV WB,XR RESTORE VRBLK POINTER ! 17183: MOV SVBIT(XL),WB LOAD BIT INDICATORS ! 17184: ADD *SVCHS,XL POINT TO CHARACTERS OF NAME ! 17185: ADD WA,XL POINT PAST CHARACTERS ! 17186: * ! 17187: * SKIP PAST KEYWORD NUMBER (SVKNM) IF PRESENT ! 17188: * ! 17189: MOV BTKNM,WC LOAD TEST BIT ! 17190: ANB WB,WC AND TO TEST ! 17191: ZRB WC,GNV17 JUMP IF NO KEYWORD NUMBER ! 17192: ICA XL ELSE BUMP POINTER ! 17193: EJC ! 17194: * ! 17195: * GTNVR (CONTINUED) ! 17196: * ! 17197: * HERE TEST FOR FUNCTION (SVFNC AND SVNAR) ! 17198: * ! 17199: GNV17 MOV BTFNC,WC GET TEST BIT ! 17200: ANB WB,WC AND TO TEST ! 17201: ZRB WC,GNV18 SKIP IF NO SYSTEM FUNCTION ! 17202: MOV XL,VRFNC(XR) ELSE POINT VRFNC TO SVFNC FIELD ! 17203: ADD *NUM02,XL AND BUMP PAST SVFNC, SVNAR FIELDS ! 17204: * ! 17205: * NOW TEST FOR LABEL (SVLBL) ! 17206: * ! 17207: GNV18 MOV BTLBL,WC GET TEST BIT ! 17208: ANB WB,WC AND TO TEST ! 17209: ZRB WC,GNV19 JUMP IF BIT IS OFF (NO SYSTEM LABL) ! 17210: MOV XL,VRLBL(XR) ELSE POINT VRLBL TO SVLBL FIELD ! 17211: ICA XL BUMP PAST SVLBL FIELD ! 17212: * ! 17213: * NOW TEST FOR VALUE (SVVAL) ! 17214: * ! 17215: GNV19 MOV BTVAL,WC LOAD TEST BIT ! 17216: ANB WB,WC AND TO TEST ! 17217: ZRB WC,GNV06 ALL DONE IF NO VALUE ! 17218: MOV (XL),VRVAL(XR) ELSE SET INITIAL VALUE ! 17219: MOV =B$VRE,VRSTO(XR) SET ERROR STORE ACCESS ! 17220: BRN GNV06 MERGE BACK TO EXIT TO CALLER ! 17221: ENP END PROCEDURE GTNVR ! 17222: EJC ! 17223: * ! 17224: * GTPAT -- GET PATTERN ! 17225: * ! 17226: * GTPAT IS PASSED AN OBJECT IN (XR) AND RETURNS A ! 17227: * PATTERN AFTER PERFORMING ANY NECESSARY CONVERSIONS ! 17228: * ! 17229: * (XR) INPUT ARGUMENT ! 17230: * JSR GTPAT CALL TO CONVERT TO PATTERN ! 17231: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 17232: * (XR) RESULTING PATTERN ! 17233: * (WA) DESTROYED ! 17234: * (WB) DESTROYED (ONLY ON CONVERT ERROR) ! 17235: * (XR) UNCHANGED (ONLY ON CONVERT ERROR) ! 17236: * ! 17237: GTPAT PRC E,1 ENTRY POINT ! 17238: BHI (XR),=P$AAA,GTPT5 JUMP IF PATTERN ALREADY ! 17239: * ! 17240: * HERE IF NOT PATTERN, TRY FOR STRING ! 17241: * ! 17242: MOV WB,GTPSB SAVE WB ! 17243: MOV XR,-(XS) STACK ARGUMENT FOR GTSTG ! 17244: JSR GTSTG CONVERT ARGUMENT TO STRING ! 17245: PPM GTPT2 JUMP IF IMPOSSIBLE ! 17246: * ! 17247: * HERE WE HAVE A STRING ! 17248: * ! 17249: BNZ WA,GTPT1 JUMP IF NON-NULL ! 17250: * ! 17251: * HERE FOR NULL STRING. GENERATE POINTER TO NULL PATTERN. ! 17252: * ! 17253: MOV =NDNTH,XR POINT TO NOTHEN NODE ! 17254: BRN GTPT4 JUMP TO EXIT ! 17255: EJC ! 17256: * ! 17257: * GTPAT (CONTINUED) ! 17258: * ! 17259: * HERE FOR NON-NULL STRING ! 17260: * ! 17261: GTPT1 MOV =P$STR,WB LOAD PCODE FOR MULTI-CHAR STRING ! 17262: BNE WA,=NUM01,GTPT3 JUMP IF MULTI-CHAR STRING ! 17263: * ! 17264: * HERE FOR ONE CHARACTER STRING, SHARE ONE CHARACTER ANY ! 17265: * ! 17266: PLC XR POINT TO CHARACTER ! 17267: LCH WA,(XR) LOAD CHARACTER ! 17268: MOV WA,XR SET AS PARM1 ! 17269: MOV =P$ANS,WB POINT TO PCODE FOR 1-CHAR ANY ! 17270: BRN GTPT3 JUMP TO BUILD NODE ! 17271: * ! 17272: * HERE IF ARGUMENT IS NOT CONVERTIBLE TO STRING ! 17273: * ! 17274: GTPT2 MOV =P$EXA,WB SET PCODE FOR EXPRESSION IN CASE ! 17275: BLO (XR),=B$E$$,GTPT3 JUMP TO BUILD NODE IF EXPRESSION ! 17276: * ! 17277: * HERE WE HAVE AN ERROR (CONVERSION IMPOSSIBLE) ! 17278: * ! 17279: EXI 1 TAKE CONVERT ERROR EXIT ! 17280: * ! 17281: * MERGE HERE TO BUILD NODE FOR STRING OR EXPRESSION ! 17282: * ! 17283: GTPT3 JSR PBILD CALL ROUTINE TO BUILD PATTERN NODE ! 17284: * ! 17285: * COMMON EXIT AFTER SUCCESSFUL CONVERSION ! 17286: * ! 17287: GTPT4 MOV GTPSB,WB RESTORE WB ! 17288: * ! 17289: * MERGE HERE TO EXIT OF NO CONVERSION REQUIRED ! 17290: * ! 17291: GTPT5 EXI RETURN TO GTPAT CALLER ! 17292: ENP END PROCEDURE GTPAT ! 17293: EJC ! 17294: * ! 17295: * GTREA -- GET REAL VALUE ! 17296: * ! 17297: * GTREA IS PASSED AN OBJECT AND RETURNS A REAL VALUE ! 17298: * PERFORMING ANY NECESSARY CONVERSIONS. ! 17299: * ! 17300: * (XR) OBJECT TO BE CONVERTED ! 17301: * JSR GTREA CALL TO CONVERT OBJECT TO REAL ! 17302: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 17303: * (XR) POINTER TO RESULTING REAL ! 17304: * (WA,WB,WC,RA) DESTROYED ! 17305: * (XR) UNCHANGED (CONVERT ERROR ONLY) ! 17306: * ! 17307: GTREA PRC E,1 ENTRY POINT ! 17308: MOV (XR),WA GET FIRST WORD OF BLOCK ! 17309: BEQ WA,=B$RCL,GTRE2 JUMP IF REAL ! 17310: JSR GTNUM ELSE CONVERT ARGUMENT TO NUMERIC ! 17311: PPM GTRE3 JUMP IF UNCONVERTIBLE ! 17312: BEQ WA,=B$RCL,GTRE2 JUMP IF REAL WAS RETURNED ! 17313: * ! 17314: * HERE FOR CASE OF AN INTEGER TO CONVERT TO REAL ! 17315: * ! 17316: GTRE1 LDI ICVAL(XR) LOAD INTEGER ! 17317: ITR CONVERT TO REAL ! 17318: JSR RCBLD BUILD RCBLK ! 17319: * ! 17320: * EXIT WITH REAL ! 17321: * ! 17322: GTRE2 EXI RETURN TO GTREA CALLER ! 17323: * ! 17324: * HERE ON CONVERSION ERROR ! 17325: * ! 17326: GTRE3 EXI 1 TAKE CONVERT ERROR EXIT ! 17327: ENP END PROCEDURE GTREA ! 17328: EJC ! 17329: * ! 17330: * GTSMI -- GET SMALL INTEGER ! 17331: * ! 17332: * GTSMI IS PASSED A SNOBOL OBJECT AND RETURNS AN ADDRESS ! 17333: * INTEGER IN THE RANGE (0 LE N LE DNAMB). SUCH A VALUE CAN ! 17334: * ONLY BE DERIVED FROM AN INTEGER IN THE APPROPRIATE RANGE. ! 17335: * SMALL INTEGERS NEVER APPEAR AS SNOBOL VALUES. HOWEVER, ! 17336: * THEY ARE USED INTERNALLY FOR A VARIETY OF PURPOSES. ! 17337: * ! 17338: * -(XS) ARGUMENT TO CONVERT (ON STACK) ! 17339: * JSR GTSMI CALL TO CONVERT TO SMALL INTEGER ! 17340: * PPM LOC TRANSFER LOC FOR NOT INTEGER ! 17341: * PPM LOC TRANSFER LOC FOR LT 0, GT DNAMB ! 17342: * (XR,WC) RESULTING SMALL INT (TWO COPIES) ! 17343: * (XS) POPPED ! 17344: * (RA) DESTROYED ! 17345: * (WA,WB) DESTROYED (ON CONVERT ERROR ONLY) ! 17346: * (XR) INPUT ARG (CONVERT ERROR ONLY) ! 17347: * ! 17348: GTSMI PRC N,2 ENTRY POINT ! 17349: MOV (XS)+,XR LOAD ARGUMENT ! 17350: BEQ (XR),=B$ICL,GTSM1 SKIP IF ALREADY AN INTEGER ! 17351: * ! 17352: * HERE IF NOT AN INTEGER ! 17353: * ! 17354: JSR GTINT CONVERT ARGUMENT TO INTEGER ! 17355: PPM GTSM2 JUMP IF CONVERT IS IMPOSSIBLE ! 17356: * ! 17357: * MERGE HERE WITH INTEGER ! 17358: * ! 17359: GTSM1 LDI ICVAL(XR) LOAD INTEGER VALUE ! 17360: MFI WC,GTSM3 MOVE AS ONE WORD, JUMP IF OVFLOW ! 17361: BGT WC,MXLEN,GTSM3 OR IF TOO SMALL ! 17362: MOV WC,XR COPY RESULT TO XR ! 17363: EXI RETURN TO GTSMI CALLER ! 17364: * ! 17365: * HERE IF UNCONVERTIBLE TO INTEGER ! 17366: * ! 17367: GTSM2 EXI 1 TAKE NON-INTEGER ERROR EXIT ! 17368: * ! 17369: * HERE IF OUT OF RANGE ! 17370: * ! 17371: GTSM3 EXI 2 TAKE OUT-OF-RANGE ERROR EXIT ! 17372: ENP END PROCEDURE GTSMI ! 17373: EJC ! 17374: * ! 17375: * GTSTG -- GET STRING ! 17376: * ! 17377: * GTSTG IS PASSED AN OBJECT AND RETURNS A STRING WITH ! 17378: * ANY NECESSARY CONVERSIONS PERFORMED. ! 17379: * ! 17380: * -(XS) INPUT ARGUMENT (ON STACK) ! 17381: * JSR GTSTG CALL TO CONVERT TO STRING ! 17382: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 17383: * (XR) POINTER TO RESULTING STRING ! 17384: * (WA) LENGTH OF STRING IN CHARACTERS ! 17385: * (XS) POPPED ! 17386: * (RA) DESTROYED ! 17387: * (XR) INPUT ARG (CONVERT ERROR ONLY) ! 17388: * ! 17389: GTSTG PRC N,1 ENTRY POINT ! 17390: MOV (XS)+,XR LOAD ARGUMENT, POP STACK ! 17391: BEQ (XR),=B$SCL,GTS30 JUMP IF ALREADY A STRING ! 17392: * ! 17393: * HERE IF NOT A STRING ALREADY ! 17394: * ! 17395: GTS01 MOV XR,-(XS) RESTACK ARGUMENT IN CASE ERROR ! 17396: MOV XL,-(XS) SAVE XL ! 17397: MOV WB,GTSVB SAVE WB ! 17398: MOV WC,GTSVC SAVE WC ! 17399: MOV (XR),WA LOAD FIRST WORD OF BLOCK ! 17400: BEQ WA,=B$ICL,GTS05 JUMP TO CONVERT INTEGER ! 17401: BEQ WA,=B$RCL,GTS10 JUMP TO CONVERT REAL ! 17402: BEQ WA,=B$NML,GTS03 JUMP TO CONVERT NAME ! 17403: BEQ WA,=B$BCT,GTS32 JUMP TO CONVERT BUFFER ! 17404: * ! 17405: * HERE ON CONVERSION ERROR ! 17406: * ! 17407: GTS02 MOV (XS)+,XL RESTORE XL ! 17408: MOV (XS)+,XR RELOAD INPUT ARGUMENT ! 17409: EXI 1 TAKE CONVERT ERROR EXIT ! 17410: EJC ! 17411: * ! 17412: * GTSTG (CONTINUED) ! 17413: * ! 17414: * HERE TO CONVERT A NAME (ONLY POSSIBLE IF NATURAL VAR) ! 17415: * ! 17416: GTS03 MOV NMBAS(XR),XL LOAD NAME BASE ! 17417: BHI XL,STATE,GTS02 ERROR IF NOT NATURAL VAR (STATIC) ! 17418: ADD *VRSOF,XL ELSE POINT TO POSSIBLE STRING NAME ! 17419: MOV SCLEN(XL),WA LOAD LENGTH ! 17420: BNZ WA,GTS04 JUMP IF NOT SYSTEM VARIABLE ! 17421: MOV VRSVO(XL),XL ELSE POINT TO SVBLK ! 17422: MOV SVLEN(XL),WA AND LOAD NAME LENGTH ! 17423: * ! 17424: * MERGE HERE WITH STRING IN XR, LENGTH IN WA ! 17425: * ! 17426: GTS04 ZER WB SET OFFSET TO ZERO ! 17427: JSR SBSTR USE SBSTR TO COPY STRING ! 17428: BRN GTS29 JUMP TO EXIT ! 17429: * ! 17430: * COME HERE TO CONVERT AN INTEGER ! 17431: * ! 17432: GTS05 LDI ICVAL(XR) LOAD INTEGER VALUE ! 17433: MOV =NUM01,GTSSF SET SIGN FLAG NEGATIVE ! 17434: ILT GTS06 SKIP IF INTEGER IS NEGATIVE ! 17435: NGI ELSE NEGATE INTEGER ! 17436: ZER GTSSF AND RESET NEGATIVE FLAG ! 17437: EJC ! 17438: * ! 17439: * GTSTG (CONTINUED) ! 17440: * ! 17441: * HERE WITH SIGN FLAG SET AND SIGN FORCED NEGATIVE AS ! 17442: * REQUIRED BY THE CVD INSTRUCTION. ! 17443: * ! 17444: GTS06 MOV GTSWK,XR POINT TO RESULT WORK AREA ! 17445: MOV =NSTMX,WB INITIALIZE COUNTER TO MAX LENGTH ! 17446: PSC XR,WB PREPARE TO STORE (RIGHT-LEFT) ! 17447: * ! 17448: * LOOP TO CONVERT DIGITS INTO WORK AREA ! 17449: * ! 17450: GTS07 CVD CONVERT ONE DIGIT INTO WA ! 17451: SCH WA,-(XR) STORE IN WORK AREA ! 17452: DCV WB DECREMENT COUNTER ! 17453: INE GTS07 LOOP IF MORE DIGITS TO GO ! 17454: CSC XR COMPLETE STORE CHARACTERS ! 17455: * ! 17456: * MERGE HERE AFTER CONVERTING INTEGER OR REAL INTO WORK ! 17457: * AREA. WB IS SET TO NSTMX - (NUMBER OF CHARS IN RESULT). ! 17458: * ! 17459: GTS08 MOV =NSTMX,WA GET MAX NUMBER OF CHARACTERS ! 17460: SUB WB,WA COMPUTE LENGTH OF RESULT ! 17461: MOV WA,XL REMEMBER LENGTH FOR MOVE LATER ON ! 17462: ADD GTSSF,WA ADD ONE FOR NEGATIVE SIGN IF NEEDED ! 17463: JSR ALOCS ALLOCATE STRING FOR RESULT ! 17464: MOV XR,WC SAVE RESULT POINTER FOR THE MOMENT ! 17465: PSC XR POINT TO CHARS OF RESULT BLOCK ! 17466: BZE GTSSF,GTS09 SKIP IF POSITIVE ! 17467: MOV =CH$MN,WA ELSE LOAD NEGATIVE SIGN ! 17468: SCH WA,(XR)+ AND STORE IT ! 17469: CSC XR COMPLETE STORE CHARACTERS ! 17470: * ! 17471: * HERE AFTER DEALING WITH SIGN ! 17472: * ! 17473: GTS09 MOV XL,WA RECALL LENGTH TO MOVE ! 17474: MOV GTSWK,XL POINT TO RESULT WORK AREA ! 17475: PLC XL,WB POINT TO FIRST RESULT CHARACTER ! 17476: MVC MOVE CHARS TO RESULT STRING ! 17477: MOV WC,XR RESTORE RESULT POINTER ! 17478: BRN GTS29 JUMP TO EXIT ! 17479: EJC ! 17480: * ! 17481: * GTSTG (CONTINUED) ! 17482: * ! 17483: * HERE TO CONVERT A REAL ! 17484: * ! 17485: GTS10 LDR RCVAL(XR) LOAD REAL ! 17486: ZER GTSSF RESET NEGATIVE FLAG ! 17487: REQ GTS31 SKIP IF ZERO ! 17488: RGE GTS11 JUMP IF REAL IS POSITIVE ! 17489: MOV =NUM01,GTSSF ELSE SET NEGATIVE FLAG ! 17490: NGR AND GET ABSOLUTE VALUE OF REAL ! 17491: * ! 17492: * NOW SCALE THE REAL TO THE RANGE (0.1 LE X LT 1.0) ! 17493: * ! 17494: GTS11 LDI INTV0 INITIALIZE EXPONENT TO ZERO ! 17495: * ! 17496: * LOOP TO SCALE UP IN STEPS OF 10**10 ! 17497: * ! 17498: GTS12 STR GTSRS SAVE REAL VALUE ! 17499: SBR REAP1 SUBTRACT 0.1 TO COMPARE ! 17500: RGE GTS13 JUMP IF SCALE UP NOT REQUIRED ! 17501: LDR GTSRS ELSE RELOAD VALUE ! 17502: MLR REATT MULTIPLY BY 10**10 ! 17503: SBI INTVT DECREMENT EXPONENT BY 10 ! 17504: BRN GTS12 LOOP BACK TO TEST AGAIN ! 17505: * ! 17506: * TEST FOR SCALE DOWN REQUIRED ! 17507: * ! 17508: GTS13 LDR GTSRS RELOAD VALUE ! 17509: SBR REAV1 SUBTRACT 1.0 ! 17510: RLT GTS17 JUMP IF NO SCALE DOWN REQUIRED ! 17511: LDR GTSRS ELSE RELOAD VALUE ! 17512: * ! 17513: * LOOP TO SCALE DOWN IN STEPS OF 10**10 ! 17514: * ! 17515: GTS14 SBR REATT SUBTRACT 10**10 TO COMPARE ! 17516: RLT GTS15 JUMP IF LARGE STEP NOT REQUIRED ! 17517: LDR GTSRS ELSE RESTORE VALUE ! 17518: DVR REATT DIVIDE BY 10**10 ! 17519: STR GTSRS STORE NEW VALUE ! 17520: ADI INTVT INCREMENT EXPONENT BY 10 ! 17521: BRN GTS14 LOOP BACK ! 17522: EJC ! 17523: * ! 17524: * GTSTG (CONTINUED) ! 17525: * ! 17526: * AT THIS POINT WE HAVE (1.0 LE X LT 10**10) ! 17527: * COMPLETE SCALING WITH POWERS OF TEN TABLE ! 17528: * ! 17529: GTS15 MOV =REAV1,XR POINT TO POWERS OF TEN TABLE ! 17530: * ! 17531: * LOOP TO LOCATE CORRECT ENTRY IN TABLE ! 17532: * ! 17533: GTS16 LDR GTSRS RELOAD VALUE ! 17534: ADI INTV1 INCREMENT EXPONENT ! 17535: ADD *CFP$R,XR POINT TO NEXT ENTRY IN TABLE ! 17536: SBR (XR) SUBTRACT IT TO COMPARE ! 17537: RGE GTS16 LOOP TILL WE FIND A LARGER ENTRY ! 17538: LDR GTSRS THEN RELOAD THE VALUE ! 17539: DVR (XR) AND COMPLETE SCALING ! 17540: STR GTSRS STORE VALUE ! 17541: * ! 17542: * WE ARE NOW SCALED, SO ROUND BY ADDING 0.5 * 10**(-CFP$S) ! 17543: * ! 17544: GTS17 LDR GTSRS GET VALUE AGAIN ! 17545: ADR GTSRN ADD ROUNDING FACTOR ! 17546: STR GTSRS STORE RESULT ! 17547: * ! 17548: * THE ROUNDING OPERATION MAY HAVE PUSHED US UP PAST ! 17549: * 1.0 AGAIN, SO CHECK ONE MORE TIME. ! 17550: * ! 17551: SBR REAV1 SUBTRACT 1.0 TO COMPARE ! 17552: RLT GTS18 SKIP IF OK ! 17553: ADI INTV1 ELSE INCREMENT EXPONENT ! 17554: LDR GTSRS RELOAD VALUE ! 17555: DVR REAVT DIVIDE BY 10.0 TO RESCALE ! 17556: BRN GTS19 JUMP TO MERGE ! 17557: * ! 17558: * HERE IF ROUNDING DID NOT MUCK UP SCALING ! 17559: * ! 17560: GTS18 LDR GTSRS RELOAD ROUNDED VALUE ! 17561: EJC ! 17562: * ! 17563: * GTSTG (CONTINUED) ! 17564: * ! 17565: * NOW WE HAVE COMPLETED THE SCALING AS FOLLOWS ! 17566: * ! 17567: * (IA) SIGNED EXPONENT ! 17568: * (RA) SCALED REAL (ABSOLUTE VALUE) ! 17569: * ! 17570: * IF THE EXPONENT IS NEGATIVE OR GREATER THAN CFP$S, THEN ! 17571: * WE CONVERT THE NUMBER IN THE FORM. ! 17572: * ! 17573: * (NEG SIGN) 0 . (CPF$S DIGITS) E (EXP SIGN) (EXP DIGITS) ! 17574: * ! 17575: * IF THE EXPONENT IS POSITIVE AND LESS THAN OR EQUAL TO ! 17576: * CFP$S, THE NUMBER IS CONVERTED IN THE FORM. ! 17577: * ! 17578: * (NEG SIGN) (EXPONENT DIGITS) . (CFP$S-EXPONENT DIGITS) ! 17579: * ! 17580: * IN BOTH CASES, THE FORMATS OBTAINED FROM THE ABOVE ! 17581: * RULES ARE MODIFIED BY DELETING TRAILING ZEROS AFTER THE ! 17582: * DECIMAL POINT. THERE ARE NO LEADING ZEROS IN THE EXPONENT ! 17583: * AND THE EXPONENT SIGN IS ALWAYS PRESENT. ! 17584: * ! 17585: GTS19 MOV =CFP$S,XL SET NUM DEC DIGITS = CFP$S ! 17586: MOV =CH$MN,GTSES SET EXPONENT SIGN NEGATIVE ! 17587: ILT GTS21 ALL SET IF EXPONENT IS NEGATIVE ! 17588: MFI WA ELSE FETCH EXPONENT ! 17589: BLE WA,=CFP$S,GTS20 SKIP IF WE CAN USE SPECIAL FORMAT ! 17590: MTI WA ELSE RESTORE EXPONENT ! 17591: NGI SET NEGATIVE FOR CVD ! 17592: MOV =CH$PL,GTSES SET PLUS SIGN FOR EXPONENT SIGN ! 17593: BRN GTS21 JUMP TO GENERATE EXPONENT ! 17594: * ! 17595: * HERE IF WE CAN USE THE FORMAT WITHOUT AN EXPONENT ! 17596: * ! 17597: GTS20 SUB WA,XL COMPUTE DIGITS AFTER DECIMAL POINT ! 17598: LDI INTV0 RESET EXPONENT TO ZERO ! 17599: EJC ! 17600: * ! 17601: * GTSTG (CONTINUED) ! 17602: * ! 17603: * MERGE HERE AS FOLLOWS ! 17604: * ! 17605: * (IA) EXPONENT ABSOLUTE VALUE ! 17606: * GTSES CHARACTER FOR EXPONENT SIGN ! 17607: * (RA) POSITIVE FRACTION ! 17608: * (XL) NUMBER OF DIGITS AFTER DEC POINT ! 17609: * ! 17610: GTS21 MOV GTSWK,XR POINT TO WORK AREA ! 17611: MOV =NSTMX,WB SET CHARACTER CTR TO MAX LENGTH ! 17612: PSC XR,WB PREPARE TO STORE (RIGHT TO LEFT) ! 17613: IEQ GTS23 SKIP EXPONENT IF IT IS ZERO ! 17614: * ! 17615: * LOOP TO GENERATE DIGITS OF EXPONENT ! 17616: * ! 17617: GTS22 CVD CONVERT A DIGIT INTO WA ! 17618: SCH WA,-(XR) STORE IN WORK AREA ! 17619: DCV WB DECREMENT COUNTER ! 17620: INE GTS22 LOOP BACK IF MORE DIGITS TO GO ! 17621: * ! 17622: * HERE GENERATE EXPONENT SIGN AND E ! 17623: * ! 17624: MOV GTSES,WA LOAD EXPONENT SIGN ! 17625: SCH WA,-(XR) STORE IN WORK AREA ! 17626: MOV =CH$LE,WA GET CHARACTER LETTER E ! 17627: SCH WA,-(XR) STORE IN WORK AREA ! 17628: SUB =NUM02,WB DECREMENT COUNTER FOR SIGN AND E ! 17629: * ! 17630: * HERE TO GENERATE THE FRACTION ! 17631: * ! 17632: GTS23 MLR GTSSC CONVERT REAL TO INTEGER (10**CFP$S) ! 17633: RTI GET INTEGER (OVERFLOW IMPOSSIBLE) ! 17634: NGI NEGATE AS REQUIRED BY CVD ! 17635: * ! 17636: * LOOP TO SUPPRESS TRAILING ZEROS ! 17637: * ! 17638: GTS24 BZE XL,GTS27 JUMP IF NO DIGITS LEFT TO DO ! 17639: CVD ELSE CONVERT ONE DIGIT ! 17640: BNE WA,=CH$D0,GTS26 JUMP IF NOT A ZERO ! 17641: DCV XL DECREMENT COUNTER ! 17642: BRN GTS24 LOOP BACK FOR NEXT DIGIT ! 17643: EJC ! 17644: * ! 17645: * GTSTG (CONTINUED) ! 17646: * ! 17647: * LOOP TO GENERATE DIGITS AFTER DECIMAL POINT ! 17648: * ! 17649: GTS25 CVD CONVERT A DIGIT INTO WA ! 17650: * ! 17651: * MERGE HERE FIRST TIME ! 17652: * ! 17653: GTS26 SCH WA,-(XR) STORE DIGIT ! 17654: DCV WB DECREMENT COUNTER ! 17655: DCV XL DECREMENT COUNTER ! 17656: BNZ XL,GTS25 LOOP BACK IF MORE TO GO ! 17657: * ! 17658: * HERE GENERATE THE DECIMAL POINT ! 17659: * ! 17660: GTS27 MOV =CH$DT,WA LOAD DECIMAL POINT ! 17661: SCH WA,-(XR) STORE IN WORK AREA ! 17662: DCV WB DECREMENT COUNTER ! 17663: * ! 17664: * HERE GENERATE THE DIGITS BEFORE THE DECIMAL POINT ! 17665: * ! 17666: GTS28 CVD CONVERT A DIGIT INTO WA ! 17667: SCH WA,-(XR) STORE IN WORK AREA ! 17668: DCV WB DECREMENT COUNTER ! 17669: INE GTS28 LOOP BACK IF MORE TO GO ! 17670: CSC XR COMPLETE STORE CHARACTERS ! 17671: BRN GTS08 ELSE JUMP BACK TO EXIT ! 17672: * ! 17673: * EXIT POINT AFTER SUCCESSFUL CONVERSION ! 17674: * ! 17675: GTS29 MOV (XS)+,XL RESTORE XL ! 17676: ICA XS POP ARGUMENT ! 17677: MOV GTSVB,WB RESTORE WB ! 17678: MOV GTSVC,WC RESTORE WC ! 17679: * ! 17680: * MERGE HERE IF NO CONVERSION REQUIRED ! 17681: * ! 17682: GTS30 MOV SCLEN(XR),WA LOAD STRING LENGTH ! 17683: EXI RETURN TO CALLER ! 17684: * ! 17685: * HERE TO RETURN STRING FOR REAL ZERO ! 17686: * ! 17687: GTS31 MOV =SCRE0,XL POINT TO STRING ! 17688: MOV =NUM02,WA 2 CHARS ! 17689: ZER WB ZERO OFFSET ! 17690: JSR SBSTR COPY STRING ! 17691: BRN GTS29 RETURN ! 17692: EJC ! 17693: * ! 17694: * HERE TO CONVERT A BUFFER BLOCK ! 17695: * ! 17696: GTS32 MOV XR,XL COPY ARG PTR ! 17697: MOV BCLEN(XL),WA GET SIZE TO ALLOCATE ! 17698: BZE WA,GTS33 IF NULL THEN RETURN NULL ! 17699: JSR ALOCS ALLOCATE STRING FRAME ! 17700: MOV XR,WB SAVE STRING PTR ! 17701: MOV SCLEN(XR),WA GET LENGTH TO MOVE ! 17702: CTB WA,0 GET AS MULTIPLE OF WORD SIZE ! 17703: MOV BCBUF(XL),XL POINT TO BFBLK ! 17704: ADD *SCSI$,XR POINT TO START OF CHARACTER AREA ! 17705: ADD *BFSI$,XL POINT TO START OF BUFFER CHARS ! 17706: MVW COPY WORDS ! 17707: MOV WB,XR RESTORE SCBLK PTR ! 17708: BRN GTS29 EXIT WITH SCBLK ! 17709: * ! 17710: * HERE WHEN NULL BUFFER IS BEING CONVERTED ! 17711: * ! 17712: GTS33 MOV =NULLS,XR POINT TO NULL ! 17713: BRN GTS29 EXIT WITH NULL ! 17714: ENP END PROCEDURE GTSTG ! 17715: EJC ! 17716: * ! 17717: * GTVAR -- GET VARIABLE FOR I/O/TRACE ASSOCIATION ! 17718: * ! 17719: * GTVAR IS USED TO POINT TO AN ACTUAL VARIABLE LOCATION ! 17720: * FOR THE DETACH,INPUT,OUTPUT,TRACE,STOPTR SYSTEM FUNCTIONS ! 17721: * ! 17722: * (XR) ARGUMENT TO FUNCTION ! 17723: * JSR GTVAR CALL TO LOCATE VARIABLE POINTER ! 17724: * PPM LOC TRANSFER LOC IF NOT OK VARIABLE ! 17725: * (XL,WA) NAME BASE,OFFSET OF VARIABLE ! 17726: * (XR,RA) DESTROYED ! 17727: * (WB,WC) DESTROYED (CONVERT ERROR ONLY) ! 17728: * (XR) INPUT ARG (CONVERT ERROR ONLY) ! 17729: * ! 17730: GTVAR PRC E,1 ENTRY POINT ! 17731: BNE (XR),=B$NML,GTVR2 JUMP IF NOT A NAME ! 17732: MOV NMOFS(XR),WA ELSE LOAD NAME OFFSET ! 17733: MOV NMBAS(XR),XL LOAD NAME BASE ! 17734: BEQ (XL),=B$EVT,GTVR1 ERROR IF EXPRESSION VARIABLE ! 17735: BNE (XL),=B$KVT,GTVR3 ALL OK IF NOT KEYWORD VARIABLE ! 17736: * ! 17737: * HERE ON CONVERSION ERROR ! 17738: * ! 17739: GTVR1 EXI 1 TAKE CONVERT ERROR EXIT ! 17740: * ! 17741: * HERE IF NOT A NAME, TRY CONVERT TO NATURAL VARIABLE ! 17742: * ! 17743: GTVR2 MOV WC,GTVRC SAVE WC ! 17744: JSR GTNVR LOCATE VRBLK IF POSSIBLE ! 17745: PPM GTVR1 JUMP IF CONVERT ERROR ! 17746: MOV XR,XL ELSE COPY VRBLK NAME BASE ! 17747: MOV *VRVAL,WA AND SET OFFSET ! 17748: MOV GTVRC,WC RESTORE WC ! 17749: * ! 17750: * HERE FOR NAME OBTAINED ! 17751: * ! 17752: GTVR3 BHI XL,STATE,GTVR4 ALL OK IF NOT NATURAL VARIABLE ! 17753: BEQ VRSTO(XL),=B$VRE,GTVR1 ERROR IF PROTECTED VARIABLE ! 17754: * ! 17755: * COMMON EXIT POINT ! 17756: * ! 17757: GTVR4 EXI RETURN TO CALLER ! 17758: ENP END PROCEDURE GTVAR ! 17759: EJC ! 17760: * ! 17761: * HASHS -- COMPUTE HASH INDEX FOR STRING ! 17762: * ! 17763: * HASHS IS USED TO CONVERT A STRING TO A UNIQUE INTEGER ! 17764: * VALUE. THE RESULTING HASH VALUE IS A POSITIVE INTEGER ! 17765: * IN THE RANGE 0 TO CFP$M ! 17766: * ! 17767: * (XR) STRING TO BE HASHED ! 17768: * JSR HASHS CALL TO HASH STRING ! 17769: * (IA) HASH VALUE ! 17770: * (XR,WB,WC) DESTROYED ! 17771: * ! 17772: * THE HASH FUNCTION USED IS AS FOLLOWS. ! 17773: * ! 17774: * START WITH THE LENGTH OF THE STRING (SGD07) ! 17775: * ! 17776: * TAKE THE FIRST E$HNW WORDS OF THE CHARACTERS FROM ! 17777: * THE STRING OR ALL THE WORDS IF FEWER THAN E$HNW. ! 17778: * ! 17779: * COMPUTE THE EXCLUSIVE OR OF ALL THESE WORDS TREATING ! 17780: * THEM AS ONE WORD BIT STRING VALUES. ! 17781: * ! 17782: * MOVE THE RESULT AS AN INTEGER WITH THE MTI INSTRUCTION. ! 17783: * ! 17784: HASHS PRC E,0 ENTRY POINT ! 17785: MOV SCLEN(XR),WC LOAD STRING LENGTH IN CHARACTERS ! 17786: MOV WC,WB INITIALIZE WITH LENGTH ! 17787: BZE WC,HSHS3 JUMP IF NULL STRING ! 17788: CTW WC,0 ELSE GET NUMBER OF WORDS OF CHARS ! 17789: ADD *SCHAR,XR POINT TO CHARACTERS OF STRING ! 17790: BLO WC,=E$HNW,HSHS1 USE WHOLE STRING IF SHORT ! 17791: MOV =E$HNW,WC ELSE SET TO INVOLVE FIRST E$HNW WDS ! 17792: * ! 17793: * HERE WITH COUNT OF WORDS TO CHECK IN WC ! 17794: * ! 17795: HSHS1 LCT WC,WC SET COUNTER TO CONTROL LOOP ! 17796: * ! 17797: * LOOP TO COMPUTE EXCLUSIVE OR ! 17798: * ! 17799: HSHS2 XOB (XR)+,WB EXCLUSIVE OR NEXT WORD OF CHARS ! 17800: BCT WC,HSHS2 LOOP TILL ALL PROCESSED ! 17801: * ! 17802: * MERGE HERE WITH EXCLUSIVE OR IN WB ! 17803: * ! 17804: HSHS3 ZGB WB ZEROISE UNDEFINED BITS ! 17805: ANB BITSM,WB ENSURE IN RANGE 0 TO CFP$M ! 17806: MTI WB MOVE RESULT AS INTEGER ! 17807: ZER XR CLEAR GARBAGE VALUE IN XR ! 17808: EXI RETURN TO HASHS CALLER ! 17809: ENP END PROCEDURE HASHS ! 17810: EJC ! 17811: * ! 17812: * ICBLD -- BUILD INTEGER BLOCK ! 17813: * ! 17814: * (IA) INTEGER VALUE FOR ICBLK ! 17815: * JSR ICBLD CALL TO BUILD INTEGER BLOCK ! 17816: * (XR) POINTER TO RESULT ICBLK ! 17817: * (WA) DESTROYED ! 17818: * ! 17819: ICBLD PRC E,0 ENTRY POINT ! 17820: MFI XR,ICBL1 COPY SMALL INTEGERS ! 17821: BLE XR,=NUM02,ICBL3 JUMP IF 0,1 OR 2 ! 17822: * ! 17823: * CONSTRUCT ICBLK ! 17824: * ! 17825: ICBL1 MOV DNAMP,XR LOAD POINTER TO NEXT AVAILABLE LOC ! 17826: ADD *ICSI$,XR POINT PAST NEW ICBLK ! 17827: BLO XR,DNAME,ICBL2 JUMP IF THERE IS ROOM ! 17828: MOV *ICSI$,WA ELSE LOAD LENGTH OF ICBLK ! 17829: JSR ALLOC USE STANDARD ALLOCATOR TO GET BLOCK ! 17830: ADD WA,XR POINT PAST BLOCK TO MERGE ! 17831: * ! 17832: * MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED ! 17833: * ! 17834: ICBL2 MOV XR,DNAMP SET NEW POINTER ! 17835: SUB *ICSI$,XR POINT BACK TO START OF BLOCK ! 17836: MOV =B$ICL,(XR) STORE TYPE WORD ! 17837: STI ICVAL(XR) STORE INTEGER VALUE IN ICBLK ! 17838: EXI RETURN TO ICBLD CALLER ! 17839: * ! 17840: * OPTIMISE BY NOT BUILDING ICBLKS FOR SMALL INTEGERS ! 17841: * ! 17842: ICBL3 WTB XR CONVERT INTEGER TO OFFSET ! 17843: MOV INTAB(XR),XR POINT TO PRE-BUILT ICBLK ! 17844: EXI RETURN ! 17845: ENP END PROCEDURE ICBLD ! 17846: EJC ! 17847: * ! 17848: * IDENT -- COMPARE TWO VALUES ! 17849: * ! 17850: * IDENT COMPARES TWO VALUES IN THE SENSE OF THE IDENT ! 17851: * DIFFER FUNCTIONS AVAILABLE AT THE SNOBOL LEVEL. ! 17852: * ! 17853: * (XR) FIRST ARGUMENT ! 17854: * (XL) SECOND ARGUMENT ! 17855: * JSR IDENT CALL TO COMPARE ARGUMENTS ! 17856: * PPM LOC TRANSFER LOC IF IDENT ! 17857: * (NORMAL RETURN IF DIFFER) ! 17858: * (XR,XL,WC,RA) DESTROYED ! 17859: * ! 17860: IDENT PRC E,1 ENTRY POINT ! 17861: BEQ XR,XL,IDEN7 JUMP IF SAME POINTER (IDENT) ! 17862: MOV (XR),WC ELSE LOAD ARG 1 TYPE WORD ! 17863: BNE WC,(XL),IDEN1 DIFFER IF ARG 2 TYPE WORD DIFFER ! 17864: BEQ WC,=B$SCL,IDEN2 JUMP IF STRINGS ! 17865: BEQ WC,=B$ICL,IDEN4 JUMP IF INTEGERS ! 17866: BEQ WC,=B$RCL,IDEN5 JUMP IF REALS ! 17867: BEQ WC,=B$NML,IDEN6 JUMP IF NAMES ! 17868: * ! 17869: * FOR ALL OTHER DATATYPES, MUST BE DIFFER IF XR NE XL ! 17870: * ! 17871: * MERGE HERE FOR DIFFER ! 17872: * ! 17873: IDEN1 EXI TAKE DIFFER EXIT ! 17874: * ! 17875: * HERE FOR STRINGS, IDENT ONLY IF LENGTHS AND CHARS SAME ! 17876: * ! 17877: IDEN2 MOV SCLEN(XR),WC LOAD ARG 1 LENGTH ! 17878: BNE WC,SCLEN(XL),IDEN1 DIFFER IF LENGTHS DIFFER ! 17879: CTW WC,0 GET NUMBER OF WORDS IN STRINGS ! 17880: ADD *SCHAR,XR POINT TO CHARS OF ARG 1 ! 17881: ADD *SCHAR,XL POINT TO CHARS OF ARG 2 ! 17882: LCT WC,WC SET LOOP COUNTER ! 17883: * ! 17884: * LOOP TO COMPARE CHARACTERS. NOTE THAT WA CANNOT BE ZERO ! 17885: * SINCE ALL NULL STRINGS POINT TO NULLS AND GIVE XL=XR. ! 17886: * ! 17887: IDEN3 CNE (XR),(XL),IDEN8 DIFFER IF CHARS DO NOT MATCH ! 17888: ICA XR ELSE BUMP ARG ONE POINTER ! 17889: ICA XL BUMP ARG TWO POINTER ! 17890: BCT WC,IDEN3 LOOP BACK TILL ALL CHECKED ! 17891: EJC ! 17892: * ! 17893: * IDENT (CONTINUED) ! 17894: * ! 17895: * HERE TO EXIT FOR CASE OF TWO IDENT STRINGS ! 17896: * ! 17897: ZER XL CLEAR GARBAGE VALUE IN XL ! 17898: ZER XR CLEAR GARBAGE VALUE IN XR ! 17899: EXI 1 TAKE IDENT EXIT ! 17900: * ! 17901: * HERE FOR INTEGERS, IDENT IF SAME VALUES ! 17902: * ! 17903: IDEN4 LDI ICVAL(XR) LOAD ARG 1 ! 17904: SBI ICVAL(XL) SUBTRACT ARG 2 TO COMPARE ! 17905: IOV IDEN1 DIFFER IF OVERFLOW ! 17906: INE IDEN1 DIFFER IF RESULT IS NOT ZERO ! 17907: EXI 1 TAKE IDENT EXIT ! 17908: * ! 17909: * HERE FOR REALS, IDENT IF SAME VALUES ! 17910: * ! 17911: IDEN5 LDR RCVAL(XR) LOAD ARG 1 ! 17912: SBR RCVAL(XL) SUBTRACT ARG 2 TO COMPARE ! 17913: ROV IDEN1 DIFFER IF OVERFLOW ! 17914: RNE IDEN1 DIFFER IF RESULT IS NOT ZERO ! 17915: EXI 1 TAKE IDENT EXIT ! 17916: * ! 17917: * HERE FOR NAMES, IDENT IF BASES AND OFFSETS SAME ! 17918: * ! 17919: IDEN6 BNE NMOFS(XR),NMOFS(XL),IDEN1 DIFFER IF DIFFERENT OFFSET ! 17920: BNE NMBAS(XR),NMBAS(XL),IDEN1 DIFFER IF DIFFERENT BASE ! 17921: * ! 17922: * MERGE HERE TO SIGNAL IDENT FOR IDENTICAL POINTERS ! 17923: * ! 17924: IDEN7 EXI 1 TAKE IDENT EXIT ! 17925: * ! 17926: * HERE FOR DIFFER STRINGS ! 17927: * ! 17928: IDEN8 ZER XR CLEAR GARBAGE PTR IN XR ! 17929: ZER XL CLEAR GARBAGE PTR IN XL ! 17930: EXI RETURN TO CALLER (DIFFER) ! 17931: ENP END PROCEDURE IDENT ! 17932: EJC ! 17933: * ! 17934: * INOUT - USED TO INITIALISE INPUT AND OUTPUT VARIABLES ! 17935: * ! 17936: * (XL) POINTER TO VBL NAME STRING ! 17937: * (WB) TRBLK TYPE ! 17938: * JSR INOUT CALL TO PERFORM INITIALISATION ! 17939: * (XL) VRBLK PTR ! 17940: * (XR) TRBLK PTR ! 17941: * (WA,WC) DESTROYED ! 17942: * ! 17943: * NOTE THAT TRTER (= TRTRF) FIELD OF STANDARD I/O VARIABLES ! 17944: * POINTS TO CORRESPONDING SVBLK NOT TO A TRBLK AS IS THE ! 17945: * CASE FOR ORDINARY VARIABLES. ! 17946: * ! 17947: INOUT PRC E,0 ENTRY POINT ! 17948: MOV WB,-(XS) STACK TRBLK TYPE ! 17949: MOV SCLEN(XL),WA GET NAME LENGTH ! 17950: ZER WB POINT TO START OF NAME ! 17951: JSR SBSTR BUILD A PROPER SCBLK ! 17952: JSR GTNVR BUILD VRBLK ! 17953: PPM NO ERROR RETURN ! 17954: MOV XR,WC SAVE VRBLK POINTER ! 17955: MOV (XS)+,WB GET TRTER FIELD ! 17956: ZER XL ZERO TRFPT ! 17957: JSR TRBLD BUILD TRBLK ! 17958: MOV WC,XL RECALL VRBLK POINTER ! 17959: MOV VRSVP(XL),TRTER(XR) STORE SVBLK POINTER ! 17960: MOV XR,VRVAL(XL) STORE TRBLK PTR IN VRBLK ! 17961: MOV =B$VRA,VRGET(XL) SET TRAPPED ACCESS ! 17962: MOV =B$VRV,VRSTO(XL) SET TRAPPED STORE ! 17963: EXI RETURN TO CALLER ! 17964: ENP END PROCEDURE INOUT ! 17965: EJC ! 17966: * ! 17967: * INSBF -- INSERT STRING IN BUFFER ! 17968: * ! 17969: * THIS ROUTINE WILL REPLACE A SECTION OF A BUFFER WITH THE ! 17970: * CONTENTS OF A GIVEN STRING. IF THE LENGTH OF THE ! 17971: * SECTION TO BE REPLACED IS DIFFERENT THAN THE LENGTH OF ! 17972: * THE GIVEN STRING, AND THE REPLACEMENT IS NOT AN APPEND, ! 17973: * THEN THE UPPER SECTION OF THE BUFFER IS SHIFTED UP OR ! 17974: * DOWN TO CREATE THE PROPER SPACE FOR THE INSERT. ! 17975: * ! 17976: * (XR) POINTER TO BFBLK ! 17977: * (XL) OBJECT WHICH IS STRING CONVERTABLE ! 17978: * (WA) OFFSET OF START OF INSERT IN (XR) ! 17979: * (WB) LENGTH OF SECTION IN (XR) REPLACED ! 17980: * JSR INSBF CALL TO INSERT CHARACTERS IN BUFFER ! 17981: * PPM LOC THREAD IF (XR) NOT CONVERTABLE ! 17982: * PPM LOC THREAD IF INSERT NOT POSSIBLE ! 17983: * ! 17984: * THE SECOND ALTERNATE EXIT IS TAKEN IF THE INSERT WOULD ! 17985: * OVERFLOW THE BUFFER, OR IF THE INSERT IS OUT PAST THE ! 17986: * DEFINED END OF THE BUFFER AS GIVEN. ! 17987: * ! 17988: INSBF PRC E,2 ENTRY POINT ! 17989: MOV WA,INSSA SAVE ENTRY WA ! 17990: MOV WB,INSSB SAVE ENTRY WB ! 17991: MOV WC,INSSC SAVE ENTRY WC ! 17992: ADD WB,WA ADD TO GET OFFSET PAST REPLACE PART ! 17993: MOV WA,INSAB SAVE WA+WB ! 17994: MOV BCLEN(XR),WC GET CURRENT DEFINED LENGTH ! 17995: BGT INSSA,WC,INS07 FAIL IF START OFFSET TOO BIG ! 17996: BGT WA,WC,INS07 FAIL IF FINAL OFFSET TOO BIG ! 17997: MOV XL,-(XS) SAVE ENTRY XL ! 17998: MOV XR,-(XS) SAVE BCBLK PTR ! 17999: MOV XL,-(XS) STACK AGAIN FOR GTSTG ! 18000: JSR GTSTG CALL TO CONVERT TO STRING ! 18001: PPM INS05 TAKE STRING CONVERT ERR EXIT ! 18002: MOV XR,XL SAVE STRING PTR ! 18003: MOV (XS),XR RESTORE BCBLK PTR ! 18004: ADD WC,WA ADD BUFFER LEN TO STRING LEN ! 18005: SUB INSSB,WA BIAS OUT COMPONENT BEING REPLACED ! 18006: MOV BCBUF(XR),XR POINT TO BFBLK ! 18007: BGT WA,BFALC(XR),INS06 FAIL IF RESULT EXCEEDS ALLOCATION ! 18008: MOV (XS),XR RESTORE BCBLK PTR ! 18009: MOV WC,WA GET BUFFER LENGTH ! 18010: SUB INSAB,WA SUBTRACT TO GET SHIFT LENGTH ! 18011: ADD SCLEN(XL),WC ADD LENGTH OF NEW ! 18012: SUB INSSB,WC SUBTRACT OLD TO GET TOTAL NEW LEN ! 18013: MOV BCLEN(XR),WB GET OLD BCLEN ! 18014: MOV WC,BCLEN(XR) STUFF NEW LENGTH ! 18015: BZE WA,INS04 SKIP SHIFT IF NOTHING TO DO ! 18016: BEQ INSSB,SCLEN(XL),INS04 SKIP SHIFT IF LENGTHS MATCH ! 18017: MOV BCBUF(XR),XR POINT TO BFBLK ! 18018: MOV XL,-(XS) SAVE SCBLK PTR ! 18019: BLO INSSB,SCLEN(XL),INS01 BRN IF SHFT IS FOR MORE ROOM ! 18020: EJC ! 18021: * ! 18022: * INSBF (CONTINUED) ! 18023: * ! 18024: * WE ARE SHIFTING THE UPPER SEGMENT DOWN TO COMPACT ! 18025: * THE BUFFER. (THE STRING LENGTH IS SMALLER THAN THE ! 18026: * SEGMENT BEING REPLACED.) REGISTERS ARE SET AS: ! 18027: * ! 18028: * (WA) MOVE (SHIFT DOWN) LENGTH ! 18029: * (WB) OLD BCLEN ! 18030: * (WC) NEW BCLEN ! 18031: * (XR) BFBLK PTR ! 18032: * (XL),(XS) SCBLK PTR ! 18033: * ! 18034: MOV INSSA,WB GET OFFSET TO INSERT ! 18035: ADD SCLEN(XL),WB ADD INSERT LENGTH TO GET DEST OFF ! 18036: MOV XR,XL MAKE COPY ! 18037: PLC XL,INSAB PREPARE SOURCE FOR MOVE ! 18038: PSC XR,WB PREPARE DESTINATION REG FOR MOVE ! 18039: MVC MOVE EM OUT ! 18040: BRN INS02 BRANCH TO PAD ! 18041: * ! 18042: * WE ARE SHIFTING THE UPPER SEGMENT UP TO EXPAND ! 18043: * THE BUFFER. (THE STRING LENGTH IS LARGER THAN THE ! 18044: * SEGMENT BEING REPLACED.) ! 18045: * ! 18046: INS01 MOV XR,XL COPY BFBLK PTR ! 18047: PLC XL,WB SET SOURCE REG FOR MOVE BACKWARDS ! 18048: PSC XR,WC SET DESTINATION PTR FOR MOVE ! 18049: MCB MOVE BACKWARDS (POSSIBLE OVERLAP) ! 18050: * ! 18051: * MERGE HERE AFTER MOVE TO ADJUST PADDING AT NEW BUFFER END ! 18052: * ! 18053: INS02 MOV (XS)+,XL RESTORE SCBLK PTR ! 18054: MOV WC,WA COPY NEW BUFFER END ! 18055: CTB WA,0 ROUND OUT ! 18056: SUB WC,WA SUBTRACT TO GET REMAINDER ! 18057: BZE WA,INS04 NO PAD IF ALREADY EVEN BOUNDARY ! 18058: MOV (XS),XR GET BCBLK PTR ! 18059: MOV BCBUF(XR),XR GET BFBLK PTR ! 18060: PSC XR,WC PREPARE TO PAD ! 18061: ZER WB CLEAR WB ! 18062: LCT WA,WA LOAD LOOP COUNT ! 18063: * ! 18064: * LOOP HERE TO STUFF PAD CHARACTERS ! 18065: * ! 18066: INS03 SCH WB,(XR)+ STUFF ZERO PAD ! 18067: BCT WA,INS03 BRANCH FOR MORE ! 18068: EJC ! 18069: * ! 18070: * INSBF (CONTINUED) ! 18071: * ! 18072: * MERGE HERE WHEN PADDING OK. NOW COPY IN THE INSERT ! 18073: * STRING TO THE HOLE. ! 18074: * ! 18075: INS04 MOV (XS),XR GET BCBLK PTR ! 18076: MOV BCBUF(XR),XR GET BFBLK PTR ! 18077: MOV SCLEN(XL),WA GET MOVE LENGTH ! 18078: PLC XL PREPARE TO COPY FROM FIRST CHAR ! 18079: PSC XR,INSSA PREPARE TO STORE IN HOLE ! 18080: MVC COPY THE CHARACTERS ! 18081: MOV (XS)+,XR RESTORE ENTRY XR ! 18082: MOV (XS)+,XL RESTORE ENTRY XL ! 18083: MOV INSSA,WA RESTORE ENTRY WA ! 18084: MOV INSSB,WB RESTORE ENTRY WB ! 18085: MOV INSSC,WC RESTORE ENTRY WC ! 18086: EXI RETURN TO CALLER ! 18087: * ! 18088: * HERE TO TAKE STRING CONVERT ERROR EXIT ! 18089: * ! 18090: INS05 MOV (XS)+,XR RESTORE ENTRY XR ! 18091: MOV (XS)+,XL RESTORE ENTRY XL ! 18092: MOV INSSA,WA RESTORE ENTRY WA ! 18093: MOV INSSB,WB RESTORE ENTRY WB ! 18094: MOV INSSC,WC RESTORE ENTRY WC ! 18095: EXI 1 ALTERNATE EXIT ! 18096: * ! 18097: * HERE FOR INVALID OFFSET OR LENGTH ! 18098: * ! 18099: INS06 MOV (XS)+,XR RESTORE ENTRY XR ! 18100: MOV (XS)+,XL RESTORE ENTRY XL ! 18101: * ! 18102: * MERGE FOR LENGTH FAILURE EXIT WITH STACK SET ! 18103: * ! 18104: INS07 MOV INSSA,WA RESTORE ENTRY WA ! 18105: MOV INSSB,WB RESTORE ENTRY WB ! 18106: MOV INSSC,WC RESTORE ENTRY WC ! 18107: EXI 2 ALTERNATE EXIT ! 18108: ENP END PROCEDURE INSBF ! 18109: EJC ! 18110: * ! 18111: * IOFCB -- GET INPUT/OUTPUT FCBLK POINTER ! 18112: * ! 18113: * USED BY ENDFILE, EJECT AND REWIND TO FIND THE FCBLK ! 18114: * (IF ANY) CORRESPONDING TO THEIR ARGUMENT. ! 18115: * ! 18116: * -(XS) ARGUMENT ! 18117: * JSR IOFCB CALL TO FIND FCBLK ! 18118: * PPM LOC ARG IS AN UNSUITABLE NAME ! 18119: * PPM LOC ARG IS NULL STRING ! 18120: * (XS) POPPED ! 18121: * (XL) PTR TO FILEARG1 VRBLK ! 18122: * (XR) ARGUMENT ! 18123: * (WA) FCBLK PTR OR 0 ! 18124: * (WB) DESTROYED ! 18125: * ! 18126: IOFCB PRC N,2 ENTRY POINT ! 18127: JSR GTSTG GET ARG AS STRING ! 18128: PPM IOFC2 FAIL ! 18129: MOV XR,XL COPY STRING PTR ! 18130: JSR GTNVR GET AS NATURAL VARIABLE ! 18131: PPM IOFC3 FAIL IF NULL ! 18132: MOV XL,WB COPY STRING POINTER AGAIN ! 18133: MOV XR,XL COPY VRBLK PTR FOR RETURN ! 18134: ZER WA IN CASE NO TRBLK FOUND ! 18135: * ! 18136: * LOOP TO FIND FILE ARG1 TRBLK ! 18137: * ! 18138: IOFC1 MOV VRVAL(XR),XR GET POSSIBLE TRBLK PTR ! 18139: BNE (XR),=B$TRT,IOFC2 FAIL IF END OF CHAIN ! 18140: BNE TRTYP(XR),=TRTFC,IOFC1 LOOP IF NOT FILE ARG TRBLK ! 18141: MOV TRFPT(XR),WA GET FCBLK PTR ! 18142: MOV WB,XR COPY ARG ! 18143: EXI RETURN ! 18144: * ! 18145: * FAIL RETURN ! 18146: * ! 18147: IOFC2 EXI 1 FAIL ! 18148: * ! 18149: * NULL ARG ! 18150: * ! 18151: IOFC3 EXI 2 NULL ARG RETURN ! 18152: ENP END PROCEDURE IOFCB ! 18153: EJC ! 18154: * ! 18155: * IOPPF -- PROCESS FILEARG2 FOR IOPUT ! 18156: * ! 18157: * (R$XSC) FILEARG2 PTR ! 18158: * JSR IOPPF CALL TO PROCESS FILEARG2 ! 18159: * (XL) FILEARG1 PTR ! 18160: * (XR) FILE ARG2 PTR ! 18161: * -(XS)..-(XS) FIELDS EXTRACTED FROM FILEARG2 ! 18162: * (WC) NO. OF FIELDS EXTRACTED ! 18163: * (WB) INPUT/OUTPUT FLAG ! 18164: * (WA) FCBLK PTR OR 0 ! 18165: * ! 18166: IOPPF PRC N,0 ENTRY POINT ! 18167: ZER WB TO COUNT FIELDS EXTRACTED ! 18168: * ! 18169: * LOOP TO EXTRACT FIELDS ! 18170: * ! 18171: IOPP1 MOV =IODEL,XL GET DELIMITER ! 18172: MOV XL,WC COPY IT ! 18173: JSR XSCAN GET NEXT FIELD ! 18174: MOV XR,-(XS) STACK IT ! 18175: ICV WB INCREMENT COUNT ! 18176: BNZ WA,IOPP1 LOOP ! 18177: MOV WB,WC COUNT OF FIELDS ! 18178: MOV IOPTT,WB I/O MARKER ! 18179: MOV R$IOF,WA FCBLK PTR OR 0 ! 18180: MOV R$IO2,XR FILE ARG2 PTR ! 18181: MOV R$IO1,XL FILEARG1 ! 18182: EXI RETURN ! 18183: ENP END PROCEDURE IOPPF ! 18184: EJC ! 18185: * ! 18186: * IOPUT -- ROUTINE USED BY INPUT AND OUTPUT ! 18187: * ! 18188: * IOPUT SETS UP INPUT/OUTPUT ASSOCIATIONS. IT BUILDS ! 18189: * SUCH TRACE AND FILE CONTROL BLOCKS AS ARE NECESSARY AND ! 18190: * CALLS SYSFC,SYSIO TO PERFORM CHECKS ON THE ! 18191: * ARGUMENTS AND TO OPEN THE FILES. ! 18192: * ! 18193: * +-----------+ +---------------+ +-----------+ ! 18194: * +-.I I I I------.I =B$XRT I ! 18195: * I +-----------+ +---------------+ +-----------+ ! 18196: * I / / (R$FCB) I *4 I ! 18197: * I / / +-----------+ ! 18198: * I +-----------+ +---------------+ I I- ! 18199: * I I NAME +--.I =B$TRT I +-----------+ ! 18200: * I / / +---------------+ I I ! 18201: * I (FIRST ARG) I =TRTIN/=TRTOU I +-----------+ ! 18202: * I +---------------+ I ! 18203: * I I VALUE I I ! 18204: * I +---------------+ I ! 18205: * I I(TRTRF) 0 OR I--+ I ! 18206: * I +---------------+ I I ! 18207: * I I(TRFPT) 0 OR I----+ I ! 18208: * I +---------------+ I I I ! 18209: * I (I/O TRBLK) I I I ! 18210: * I +-----------+ I I I ! 18211: * I I I I I I ! 18212: * I +-----------+ I I I ! 18213: * I I I I I I ! 18214: * I +-----------+ +---------------+ I I I ! 18215: * I I +--.I =B$TRT I.-+ I I ! 18216: * I +-----------+ +---------------+ I I ! 18217: * I / / I =TRTFC I I I ! 18218: * I / / +---------------+ I I ! 18219: * I (FILEARG1 I VALUE I I I ! 18220: * I VRBLK) +---------------+ I I ! 18221: * I I(TRTRF) 0 OR I--+ I . ! 18222: * I +---------------+ I . +-----------+ ! 18223: * I I(TRFPT) 0 OR I------./ FCBLK / ! 18224: * I +---------------+ I +-----------+ ! 18225: * I (TRTRF) I ! 18226: * I I ! 18227: * I I ! 18228: * I +---------------+ I ! 18229: * I I =B$XRT I.-+ ! 18230: * I +---------------+ ! 18231: * I I *5 I ! 18232: * I +---------------+ ! 18233: * +------------------I I ! 18234: * +---------------+ +-----------+ ! 18235: * I(TRTRF) O OR I------.I =B$XRT I ! 18236: * +---------------+ +-----------+ ! 18237: * I NAME OFFSET I I ETC I ! 18238: * +---------------+ ! 18239: * (IOCHN - CHAIN OF NAME POINTERS) ! 18240: EJC ! 18241: * ! 18242: * IOPUT (CONTINUED) ! 18243: * ! 18244: * NO ADDITIONAL TRAP BLOCKS ARE USED FOR STANDARD INPUT/OUT ! 18245: * FILES. OTHERWISE AN I/O TRAP BLOCK IS ATTACHED TO SECOND ! 18246: * ARG (FILEARG1) VRBLK. SEE DIAGRAM ABOVE FOR DETAILS OF ! 18247: * THE STRUCTURE BUILT. ! 18248: * ! 18249: * -(XS) 1ST ARG (VBL TO BE ASSOCIATED) ! 18250: * -(XS) 2ND ARG (FILE ARG1) ! 18251: * -(XS) 3RD ARG (FILE ARG2) ! 18252: * (WB) 0 FOR INPUT, 3 FOR OUTPUT ASSOC. ! 18253: * JSR IOPUT CALL FOR INPUT/OUTPUT ASSOCIATION ! 18254: * PPM LOC 3RD ARG NOT A STRING ! 18255: * PPM LOC 2ND ARG NOT A SUITABLE NAME ! 18256: * PPM LOC 1ST ARG NOT A SUITABLE NAME ! 18257: * PPM LOC INAPPROPRIATE FILE SPEC FOR I/O ! 18258: * PPM LOC I/O FILE DOES NOT EXIST ! 18259: * PPM LOC I/O FILE CANNOT BE READ/WRITTEN ! 18260: * (XS) POPPED ! 18261: * (XL,XR,WA,WB,WC) DESTROYED ! 18262: * ! 18263: IOPUT PRC N,6 ENTRY POINT ! 18264: ZER R$IOT IN CASE NO TRTRF BLOCK USED ! 18265: ZER R$IOF IN CASE NO FCBLK ALOCATED ! 18266: MOV WB,IOPTT STORE I/O TRACE TYPE ! 18267: JSR XSCNI PREPARE TO SCAN FILEARG2 ! 18268: PPM IOP13 FAIL ! 18269: PPM IOPA0 NULL FILE ARG2 ! 18270: * ! 18271: IOPA0 MOV XR,R$IO2 KEEP FILE ARG2 ! 18272: MOV WA,XL COPY LENGTH ! 18273: JSR GTSTG CONVERT FILEARG1 TO STRING ! 18274: PPM IOP14 FAIL ! 18275: MOV XR,R$IO1 KEEP FILEARG1 PTR ! 18276: JSR GTNVR CONVERT TO NATURAL VARIABLE ! 18277: PPM IOP00 JUMP IF NULL ! 18278: BRN IOP04 JUMP TO PROCESS NON-NULL ARGS ! 18279: * ! 18280: * NULL FILEARG1 ! 18281: * ! 18282: IOP00 BZE XL,IOP01 SKIP IF BOTH ARGS NULL ! 18283: JSR IOPPF PROCESS FILEARG2 ! 18284: JSR SYSFC CALL FOR FILEARG2 CHECK ! 18285: PPM IOP16 FAIL ! 18286: BRN IOP11 COMPLETE FILE ASSOCIATION ! 18287: EJC ! 18288: * ! 18289: * IOPUT (CONTINUED) ! 18290: * ! 18291: * HERE WITH 0 OR FCBLK PTR IN (XL) ! 18292: * ! 18293: IOP01 MOV IOPTT,WB GET TRACE TYPE ! 18294: MOV R$IOT,XR GET 0 OR TRTRF PTR ! 18295: JSR TRBLD BUILD TRBLK ! 18296: MOV XR,WC COPY TRBLK POINTER ! 18297: MOV (XS)+,XR GET VARIABLE FROM STACK ! 18298: JSR GTVAR POINT TO VARIABLE ! 18299: PPM IOP15 FAIL ! 18300: MOV XL,R$ION SAVE NAME POINTER ! 18301: MOV XL,XR COPY NAME POINTER ! 18302: ADD WA,XR POINT TO VARIABLE ! 18303: SUB *VRVAL,XR SUBTRACT OFFSET,MERGE INTO LOOP ! 18304: * ! 18305: * LOOP TO END OF TRBLK CHAIN IF ANY ! 18306: * ! 18307: IOP02 MOV XR,XL COPY BLK PTR ! 18308: MOV VRVAL(XR),XR LOAD PTR TO NEXT TRBLK ! 18309: BNE (XR),=B$TRT,IOP03 JUMP IF NOT TRAPPED ! 18310: BNE TRTYP(XR),IOPTT,IOP02 LOOP IF NOT SAME ASSOCN ! 18311: MOV TRNXT(XR),XR GET VALUE AND DELETE OLD TRBLK ! 18312: * ! 18313: * IOPUT (CONTINUED) ! 18314: * ! 18315: * STORE NEW ASSOCIATION ! 18316: * ! 18317: IOP03 MOV WC,VRVAL(XL) LINK TO THIS TRBLK ! 18318: MOV WC,XL COPY POINTER ! 18319: MOV XR,TRNXT(XL) STORE VALUE IN TRBLK ! 18320: MOV R$ION,XR RESTORE POSSIBLE VRBLK POINTER ! 18321: MOV WA,WB KEEP OFFSET TO NAME ! 18322: JSR SETVR IF VRBLK, SET VRGET,VRSTO ! 18323: MOV R$IOT,XR GET 0 OR TRTRF PTR ! 18324: BNZ XR,IOP19 JUMP IF TRTRF BLOCK EXISTS ! 18325: EXI RETURN TO CALLER ! 18326: * ! 18327: * NON STANDARD FILE ! 18328: * SEE IF AN FCBLK HAS ALREADY BEEN ALLOCATED. ! 18329: * ! 18330: IOP04 ZER WA IN CASE NO FCBLK FOUND ! 18331: EJC ! 18332: * ! 18333: * IOPUT (CONTINUED) ! 18334: * ! 18335: * SEARCH POSSIBLE TRBLK CHAIN TO PICK UP THE FCBLK ! 18336: * ! 18337: IOP05 MOV XR,WB REMEMBER BLK PTR ! 18338: MOV VRVAL(XR),XR CHAIN ALONG ! 18339: BNE (XR),=B$TRT,IOP06 JUMP IF END OF TRBLK CHAIN ! 18340: BNE TRTYP(XR),=TRTFC,IOP05 LOOP IF MORE TO GO ! 18341: MOV XR,R$IOT POINT TO FILE ARG1 TRBLK ! 18342: MOV TRFPT(XR),WA GET FCBLK PTR FROM TRBLK ! 18343: * ! 18344: * WA = 0 OR FCBLK PTR ! 18345: * WB = PTR TO PRECEDING BLK TO WHICH ANY TRTRF BLOCK ! 18346: * FOR FILE ARG1 MUST BE CHAINED. ! 18347: * ! 18348: IOP06 MOV WA,R$IOF KEEP POSSIBLE FCBLK PTR ! 18349: MOV WB,R$IOP KEEP PRECEDING BLK PTR ! 18350: JSR IOPPF PROCESS FILEARG2 ! 18351: JSR SYSFC SEE IF FCBLK REQUIRED ! 18352: PPM IOP16 FAIL ! 18353: BZE WA,IOP12 SKIP IF NO NEW FCBLK WANTED ! 18354: BLT WC,=NUM02,IOP6A JUMP IF FCBLK IN DYNAMIC ! 18355: JSR ALOST GET IT IN STATIC ! 18356: BRN IOP6B SKIP ! 18357: * ! 18358: * OBTAIN FCBLK IN DYNAMIC ! 18359: * ! 18360: IOP6A JSR ALLOC GET SPACE FOR FCBLK ! 18361: * ! 18362: * MERGE ! 18363: * ! 18364: IOP6B MOV XR,XL POINT TO FCBLK ! 18365: MOV WA,WB COPY ITS LENGTH ! 18366: BTW WB GET COUNT AS WORDS (SGD APR80) ! 18367: LCT WB,WB LOOP COUNTER ! 18368: * ! 18369: * CLEAR FCBLK ! 18370: * ! 18371: IOP07 ZER (XR)+ CLEAR A WORD ! 18372: BCT WB,IOP07 LOOP ! 18373: BEQ WC,=NUM02,IOP09 SKIP IF IN STATIC - DONT SET FIELDS ! 18374: MOV =B$XNT,(XL) STORE XNBLK CODE IN CASE ! 18375: MOV WA,1(XL) STORE LENGTH ! 18376: BNZ WC,IOP09 JUMP IF XNBLK WANTED ! 18377: MOV =B$XRT,(XL) XRBLK CODE REQUESTED ! 18378: * ! 18379: EJC ! 18380: * IOPUT (CONTINUED) ! 18381: * ! 18382: * COMPLETE FCBLK INITIALISATION ! 18383: * ! 18384: IOP09 MOV R$IOT,XR GET POSSIBLE TRBLK PTR ! 18385: MOV XL,R$IOF STORE FCBLK PTR ! 18386: BNZ XR,IOP10 JUMP IF TRBLK ALREADY FOUND ! 18387: * ! 18388: * A NEW TRBLK IS NEEDED ! 18389: * ! 18390: MOV =TRTFC,WB TRTYP FOR FCBLK TRAP BLK ! 18391: JSR TRBLD MAKE THE BLOCK ! 18392: MOV XR,R$IOT COPY TRTRF PTR ! 18393: MOV R$IOP,XL POINT TO PRECEDING BLK ! 18394: MOV VRVAL(XL),VRVAL(XR) COPY VALUE FIELD TO TRBLK ! 18395: MOV XR,VRVAL(XL) LINK NEW TRBLK INTO CHAIN ! 18396: MOV XL,XR POINT TO PREDECESSOR BLK ! 18397: JSR SETVR SET TRACE INTERCEPTS ! 18398: MOV VRVAL(XR),XR RECOVER TRBLK PTR ! 18399: * ! 18400: * XR IS PTR TO TRBLK, XL IS FCBLK PTR OR 0 ! 18401: * ! 18402: IOP10 MOV R$IOF,TRFPT(XR) STORE FCBLK PTR ! 18403: * ! 18404: * CALL SYSIO TO COMPLETE FILE ACCESSING ! 18405: * ! 18406: IOP11 MOV R$IOF,WA COPY FCBLK PTR OR 0 ! 18407: MOV IOPTT,WB GET INPUT/OUTPUT FLAG ! 18408: MOV R$IO2,XR GET FILE ARG2 ! 18409: MOV R$IO1,XL GET FILE ARG1 ! 18410: JSR SYSIO ASSOCIATE TO THE FILE ! 18411: PPM IOP17 FAIL ! 18412: PPM IOP18 FAIL ! 18413: BNZ R$IOT,IOP01 NOT STD INPUT IF NON-NULL TRTRF BLK ! 18414: BNZ IOPTT,IOP01 JUMP IF OUTPUT ! 18415: BZE WC,IOP01 NO CHANGE TO STANDARD READ LENGTH ! 18416: MOV WC,CSWIN STORE NEW READ LENGTH FOR STD FILE ! 18417: BRN IOP01 MERGE TO FINISH THE TASK ! 18418: * ! 18419: * SYSFC MAY HAVE RETURNED A POINTER TO A PRIVATE FCBLK ! 18420: * ! 18421: IOP12 BNZ XL,IOP09 JUMP IF PRIVATE FCBLK ! 18422: BRN IOP11 FINISH THE ASSOCIATION ! 18423: * ! 18424: * FAILURE RETURNS ! 18425: * ! 18426: IOP13 EXI 1 3RD ARG NOT A STRING ! 18427: IOP14 EXI 2 2ND ARG UNSUITABLE ! 18428: IOP15 EXI 3 1ST ARG UNSUITABLE ! 18429: IOP16 EXI 4 FILE SPEC WRONG ! 18430: IOP17 EXI 5 I/O FILE DOES NOT EXIST ! 18431: IOP18 EXI 6 I/O FILE CANNOT BE READ/WRITTEN ! 18432: EJC ! 18433: * ! 18434: * IOPUT (CONTINUED) ! 18435: * ! 18436: * ADD TO IOCHN CHAIN OF ASSSOCIATED VARIABLES UNLESS ALREAD ! 18437: * PRESENT. ! 18438: * ! 18439: IOP19 MOV R$ION,WC WC = NAME BASE, WB = NAME OFFSET ! 18440: * ! 18441: * SEARCH LOOP ! 18442: * ! 18443: IOP20 MOV TRTRF(XR),XR NEXT LINK OF CHAIN ! 18444: BZE XR,IOP21 NOT FOUND ! 18445: BNE WC,IONMB(XR),IOP20 NO MATCH ! 18446: BEQ WB,IONMO(XR),IOP22 EXIT IF MATCHED ! 18447: BRN IOP20 LOOP ! 18448: * ! 18449: * NOT FOUND ! 18450: * ! 18451: IOP21 MOV *NUM05,WA SPACE NEEDED ! 18452: JSR ALLOC GET IT ! 18453: MOV =B$XRT,(XR) STORE XRBLK CODE ! 18454: MOV WA,1(XR) STORE LENGTH ! 18455: MOV WC,IONMB(XR) STORE NAME BASE ! 18456: MOV WB,IONMO(XR) STORE NAME OFFSET ! 18457: MOV R$IOT,XL POINT TO TRTRF BLK ! 18458: MOV TRTRF(XL),WA GET PTR FIELD CONTENTS ! 18459: MOV XR,TRTRF(XL) STORE PTR TO NEW BLOCK ! 18460: MOV WA,TRTRF(XR) COMPLETE THE LINKING ! 18461: * ! 18462: * INSERT FCBLK ON FCBLK CHAIN FOR SYSEJ, SYSXI ! 18463: * ! 18464: IOP22 BZE R$IOF,IOP25 SKIP IF NO FCBLK ! 18465: MOV R$FCB,XL PTR TO HEAD OF EXISTING CHAIN ! 18466: * ! 18467: * SEE IF FCBLK ALREADY ON CHAIN ! 18468: * ! 18469: IOP23 BZE XL,IOP24 NOT ON IF END OF CHAIN ! 18470: BEQ 3(XL),R$IOF,IOP25 DONT DUPLICATE IF FIND IT ! 18471: MOV 2(XL),XL GET NEXT LINK ! 18472: BRN IOP23 LOOP ! 18473: * ! 18474: * NOT FOUND SO ADD AN ENTRY FOR THIS FCBLK ! 18475: * ! 18476: IOP24 MOV *NUM04,WA SPACE NEEDED ! 18477: JSR ALLOC GET IT ! 18478: MOV =B$XRT,(XR) STORE BLOCK CODE ! 18479: MOV WA,1(XR) STORE LENGTH ! 18480: MOV R$FCB,2(XR) STORE PREVIOUS LINK IN THIS NODE ! 18481: MOV R$IOF,3(XR) STORE FCBLK PTR ! 18482: MOV XR,R$FCB INSERT NODE INTO FCBLK CHAIN ! 18483: * ! 18484: * RETURN ! 18485: * ! 18486: IOP25 EXI RETURN TO CALLER ! 18487: ENP END PROCEDURE IOPUT ! 18488: EJC ! 18489: * ! 18490: * KTREX -- EXECUTE KEYWORD TRACE ! 18491: * ! 18492: * KTREX IS USED TO EXECUTE A POSSIBLE KEYWORD TRACE. IT ! 18493: * INCLUDES THE TEST ON TRACE AND TESTS FOR TRACE ACTIVE. ! 18494: * ! 18495: * (XL) PTR TO TRBLK (OR 0 IF UNTRACED) ! 18496: * JSR KTREX CALL TO EXECUTE KEYWORD TRACE ! 18497: * (XL,WA,WB,WC) DESTROYED ! 18498: * (RA) DESTROYED ! 18499: * ! 18500: KTREX PRC R,0 ENTRY POINT (RECURSIVE) ! 18501: BZE XL,KTRX3 IMMEDIATE EXIT IF KEYWORD UNTRACED ! 18502: BZE KVTRA,KTRX3 IMMEDIATE EXIT IF TRACE = 0 ! 18503: DCV KVTRA ELSE DECREMENT TRACE ! 18504: MOV XR,-(XS) SAVE XR ! 18505: MOV XL,XR COPY TRBLK POINTER ! 18506: MOV TRKVR(XR),XL LOAD VRBLK POINTER (NMBAS) ! 18507: MOV *VRVAL,WA SET NAME OFFSET ! 18508: BZE TRFNC(XR),KTRX1 JUMP IF PRINT TRACE ! 18509: JSR TRXEQ ELSE EXECUTE FULL TRACE ! 18510: BRN KTRX2 AND JUMP TO EXIT ! 18511: * ! 18512: * HERE FOR PRINT TRACE ! 18513: * ! 18514: KTRX1 MOV XL,-(XS) STACK VRBLK PTR FOR KWNAM ! 18515: MOV WA,-(XS) STACK OFFSET FOR KWNAM ! 18516: JSR PRTSN PRINT STATEMENT NUMBER ! 18517: MOV =CH$AM,WA LOAD AMPERSAND ! 18518: JSR PRTCH PRINT AMPERSAND ! 18519: JSR PRTNM PRINT KEYWORD NAME ! 18520: MOV =TMBEB,XR POINT TO BLANK-EQUAL-BLANK ! 18521: JSR PRTST PRINT BLANK-EQUAL-BLANK ! 18522: JSR KWNAM GET KEYWORD PSEUDO-VARIABLE NAME ! 18523: MOV XR,DNAMP RESET PTR TO DELETE KVBLK ! 18524: JSR ACESS GET KEYWORD VALUE ! 18525: PPM FAILURE IS IMPOSSIBLE ! 18526: JSR PRTVL PRINT KEYWORD VALUE ! 18527: JSR PRTNL TERMINATE PRINT LINE ! 18528: * ! 18529: * HERE TO EXIT AFTER COMPLETING TRACE ! 18530: * ! 18531: KTRX2 MOV (XS)+,XR RESTORE ENTRY XR ! 18532: * ! 18533: * MERGE HERE TO EXIT IF NO TRACE REQUIRED ! 18534: * ! 18535: KTRX3 EXI RETURN TO KTREX CALLER ! 18536: ENP END PROCEDURE KTREX ! 18537: EJC ! 18538: * ! 18539: * KWNAM -- GET PSEUDO-VARIABLE NAME FOR KEYWORD ! 18540: * ! 18541: * 1(XS) NAME BASE FOR VRBLK ! 18542: * 0(XS) OFFSET (SHOULD BE *VRVAL) ! 18543: * JSR KWNAM CALL TO GET PSEUDO-VARIABLE NAME ! 18544: * (XS) POPPED TWICE ! 18545: * (XL,WA) RESULTING PSEUDO-VARIABLE NAME ! 18546: * (XR,WA,WB) DESTROYED ! 18547: * ! 18548: KWNAM PRC N,0 ENTRY POINT ! 18549: ICA XS IGNORE NAME OFFSET ! 18550: MOV (XS)+,XR LOAD NAME BASE ! 18551: BGE XR,STATE,KWNM1 JUMP IF NOT NATURAL VARIABLE NAME ! 18552: BNZ VRLEN(XR),KWNM1 ERROR IF NOT SYSTEM VARIABLE ! 18553: MOV VRSVP(XR),XR ELSE POINT TO SVBLK ! 18554: MOV SVBIT(XR),WA LOAD BIT MASK ! 18555: ANB BTKNM,WA AND WITH KEYWORD BIT ! 18556: ZRB WA,KWNM1 ERROR IF NO KEYWORD ASSOCIATION ! 18557: MOV SVLEN(XR),WA ELSE LOAD NAME LENGTH IN CHARACTERS ! 18558: CTB WA,SVCHS COMPUTE OFFSET TO FIELD WE WANT ! 18559: ADD WA,XR POINT TO SVKNM FIELD ! 18560: MOV (XR),WB LOAD SVKNM VALUE ! 18561: MOV *KVSI$,WA SET SIZE OF KVBLK ! 18562: JSR ALLOC ALLOCATE KVBLK ! 18563: MOV =B$KVT,(XR) STORE TYPE WORD ! 18564: MOV WB,KVNUM(XR) STORE KEYWORD NUMBER ! 18565: MOV =TRBKV,KVVAR(XR) SET DUMMY TRBLK POINTER ! 18566: MOV XR,XL COPY KVBLK POINTER ! 18567: MOV *KVVAR,WA SET PROPER OFFSET ! 18568: EXI RETURN TO KVNAM CALLER ! 18569: * ! 18570: * HERE IF NOT KEYWORD NAME ! 18571: * ! 18572: KWNM1 ERB 251,KEYWORD OPERAND IS NOT NAME OF DEFINED KEYWORD ! 18573: ENP END PROCEDURE KWNAM ! 18574: EJC ! 18575: * ! 18576: * LCOMP-- COMPARE TWO STRINGS LEXICALLY ! 18577: * ! 18578: * 1(XS) FIRST ARGUMENT ! 18579: * 0(XS) SECOND ARGUMENT ! 18580: * JSR LCOMP CALL TO COMPARE ARUMENTS ! 18581: * PPM LOC TRANSFER LOC FOR ARG1 NOT STRING ! 18582: * PPM LOC TRANSFER LOC FOR ARG2 NOT STRING ! 18583: * PPM LOC TRANSFER LOC IF ARG1 LLT ARG2 ! 18584: * PPM LOC TRANSFER LOC IF ARG1 LEQ ARG2 ! 18585: * PPM LOC TRANSFER LOC IF ARG1 LGT ARG2 ! 18586: * (THE NORMAL RETURN IS NEVER TAKEN) ! 18587: * (XS) POPPED TWICE ! 18588: * (XR,XL) DESTROYED ! 18589: * (WA,WB,WC,RA) DESTROYED ! 18590: * ! 18591: LCOMP PRC N,5 ENTRY POINT ! 18592: JSR GTSTG CONVERT SECOND ARG TO STRING ! 18593: PPM LCMP6 JUMP IF SECOND ARG NOT STRING ! 18594: MOV XR,XL ELSE SAVE POINTER ! 18595: MOV WA,WB AND LENGTH ! 18596: JSR GTSTG CONVERT FIRST ARGUMENT TO STRING ! 18597: PPM LCMP5 JUMP IF NOT STRING ! 18598: MOV WA,WC SAVE ARG 1 LENGTH ! 18599: PLC XR POINT TO CHARS OF ARG 1 ! 18600: PLC XL POINT TO CHARS OF ARG 2 ! 18601: BLO WA,WB,LCMP1 JUMP IF ARG 1 LENGTH IS SMALLER ! 18602: MOV WB,WA ELSE SET ARG 2 LENGTH AS SMALLER ! 18603: * ! 18604: * HERE WITH SMALLER LENGTH IN (WA) ! 18605: * ! 18606: LCMP1 CMC LCMP4,LCMP3 COMPARE STRINGS, JUMP IF UNEQUAL ! 18607: BNE WB,WC,LCMP2 IF EQUAL, JUMP IF LENGTHS UNEQUAL ! 18608: EXI 4 ELSE IDENTICAL STRINGS, LEQ EXIT ! 18609: EJC ! 18610: * ! 18611: * LCOMP (CONTINUED) ! 18612: * ! 18613: * HERE IF INITIAL STRINGS IDENTICAL, BUT LENGTHS UNEQUAL ! 18614: * ! 18615: LCMP2 BHI WC,WB,LCMP4 JUMP IF ARG 1 LENGTH GT ARG 2 LENG ! 18616: * ! 18617: * HERE IF FIRST ARG LLT SECOND ARG ! 18618: * ! 18619: LCMP3 EXI 3 TAKE LLT EXIT ! 18620: * ! 18621: * HERE IF FIRST ARG LGT SECOND ARG ! 18622: * ! 18623: LCMP4 EXI 5 TAKE LGT EXIT ! 18624: * ! 18625: * HERE IF FIRST ARG IS NOT A STRING ! 18626: * ! 18627: LCMP5 EXI 1 TAKE BAD FIRST ARG EXIT ! 18628: * ! 18629: * HERE FOR SECOND ARG NOT A STRING ! 18630: * ! 18631: LCMP6 EXI 2 TAKE BAD SECOND ARG ERROR EXIT ! 18632: ENP END PROCEDURE LCOMP ! 18633: EJC ! 18634: * ! 18635: * LISTR -- LIST SOURCE LINE ! 18636: * ! 18637: * LISTR IS USED TO LIST A SOURCE LINE DURING THE INITIAL ! 18638: * COMPILATION. IT IS CALLED FROM SCANE AND SCANL. ! 18639: * ! 18640: * JSR LISTR CALL TO LIST LINE ! 18641: * (XR,XL,WA,WB,WC) DESTROYED ! 18642: * ! 18643: * GLOBAL LOCATIONS USED BY LISTR ! 18644: * ! 18645: * ERLST IF LISTING ON ACCOUNT OF AN ERROR ! 18646: * ! 18647: * LSTLC COUNT LINES ON CURRENT PAGE ! 18648: * ! 18649: * LSTNP MAX NUMBER OF LINES/PAGE ! 18650: * ! 18651: * LSTPF SET NON-ZERO IF THE CURRENT SOURCE ! 18652: * LINE HAS BEEN LISTED, ELSE ZERO. ! 18653: * ! 18654: * LSTPG COMPILER LISTING PAGE NUMBER ! 18655: * ! 18656: * LSTSN SET IF STMNT NUM TO BE LISTED ! 18657: * ! 18658: * R$CIM POINTER TO CURRENT INPUT LINE. ! 18659: * ! 18660: * R$TTL TITLE FOR SOURCE LISTING ! 18661: * ! 18662: * R$STL PTR TO SUB-TITLE STRING ! 18663: * ! 18664: * ENTRY POINT ! 18665: * ! 18666: LISTR PRC E,0 ENTRY POINT ! 18667: BNZ CNTTL,LIST5 JUMP IF -TITLE OR -STITL ! 18668: BNZ LSTPF,LIST4 IMMEDIATE EXIT IF ALREADY LISTED ! 18669: BGE LSTLC,LSTNP,LIST6 JUMP IF NO ROOM ! 18670: * ! 18671: * HERE AFTER PRINTING TITLE (IF NEEDED) ! 18672: * ! 18673: LIST0 MOV R$CIM,XR LOAD POINTER TO CURRENT IMAGE ! 18674: PLC XR POINT TO CHARACTERS ! 18675: LCH WA,(XR) LOAD FIRST CHARACTER ! 18676: MOV LSTSN,XR LOAD STATEMENT NUMBER ! 18677: BZE XR,LIST2 JUMP IF NO STATEMENT NUMBER ! 18678: MTI XR ELSE GET STMNT NUMBER AS INTEGER ! 18679: BNE STAGE,=STGIC,LIST1 SKIP IF EXECUTE TIME ! 18680: BEQ WA,=CH$AS,LIST2 NO STMNT NUMBER LIST IF COMMENT ! 18681: BEQ WA,=CH$MN,LIST2 NO STMNT NO. IF CONTROL CARD ! 18682: * ! 18683: * PRINT STATEMENT NUMBER ! 18684: * ! 18685: LIST1 JSR PRTIN ELSE PRINT STATEMENT NUMBER ! 18686: ZER LSTSN AND CLEAR FOR NEXT TIME IN ! 18687: EJC ! 18688: * ! 18689: * LISTR (CONTINUED) ! 18690: * ! 18691: * MERGE HERE AFTER PRINTING STATEMENT NUMBER (IF REQUIRED) ! 18692: * ! 18693: LIST2 MOV =STNPD,PROFS POINT PAST STATEMENT NUMBER ! 18694: MOV R$CIM,XR LOAD POINTER TO CURRENT IMAGE ! 18695: JSR PRTST PRINT IT ! 18696: ICV LSTLC BUMP LINE COUNTER ! 18697: BNZ ERLST,LIST3 JUMP IF ERROR COPY TO INT.CH. ! 18698: JSR PRTNL TERMINATE LINE ! 18699: BZE CSWDB,LIST3 JUMP IF -SINGLE MODE ! 18700: JSR PRTNL ELSE ADD A BLANK LINE ! 18701: ICV LSTLC AND BUMP LINE COUNTER ! 18702: * ! 18703: * HERE AFTER PRINTING SOURCE IMAGE ! 18704: * ! 18705: LIST3 MNZ LSTPF SET FLAG FOR LINE PRINTED ! 18706: * ! 18707: * MERGE HERE TO EXIT ! 18708: * ! 18709: LIST4 EXI RETURN TO LISTR CALLER ! 18710: * ! 18711: * PRINT TITLE AFTER -TITLE OR -STITL CARD ! 18712: * ! 18713: LIST5 ZER CNTTL CLEAR FLAG ! 18714: * ! 18715: * EJECT TO NEW PAGE AND LIST TITLE ! 18716: * ! 18717: LIST6 JSR PRTPS EJECT ! 18718: BZE PRICH,LIST7 SKIP IF LISTING TO REGULAR PRINTER ! 18719: BEQ R$TTL,=NULLS,LIST0 TERMINAL LISTING OMITS NULL TITLE ! 18720: * ! 18721: * LIST TITLE ! 18722: * ! 18723: LIST7 JSR LISTT LIST TITLE ! 18724: BRN LIST0 MERGE ! 18725: ENP END PROCEDURE LISTR ! 18726: EJC ! 18727: * ! 18728: * LISTT -- LIST TITLE AND SUBTITLE ! 18729: * ! 18730: * USED DURING COMPILATION TO PRINT PAGE HEADING ! 18731: * ! 18732: * JSR LISTT CALL TO LIST TITLE ! 18733: * (XR,WA) DESTROYED ! 18734: * ! 18735: LISTT PRC E,0 ENTRY POINT ! 18736: MOV R$TTL,XR POINT TO SOURCE LISTING TITLE ! 18737: JSR PRTST PRINT TITLE ! 18738: MOV LSTPO,PROFS SET OFFSET ! 18739: MOV =LSTMS,XR SET PAGE MESSAGE ! 18740: JSR PRTST PRINT PAGE MESSAGE ! 18741: ICV LSTPG BUMP PAGE NUMBER ! 18742: MTI LSTPG LOAD PAGE NUMBER AS INTEGER ! 18743: JSR PRTIN PRINT PAGE NUMBER ! 18744: JSR PRTNL TERMINATE TITLE LINE ! 18745: ADD =NUM02,LSTLC COUNT TITLE LINE AND BLANK LINE ! 18746: * ! 18747: * PRINT SUB-TITLE (IF ANY) ! 18748: * ! 18749: MOV R$STL,XR LOAD POINTER TO SUB-TITLE ! 18750: BZE XR,LSTT1 JUMP IF NO SUB-TITLE ! 18751: JSR PRTST ELSE PRINT SUB-TITLE ! 18752: JSR PRTNL TERMINATE LINE ! 18753: ICV LSTLC BUMP LINE COUNT ! 18754: * ! 18755: * RETURN POINT ! 18756: * ! 18757: LSTT1 JSR PRTNL PRINT A BLANK LINE ! 18758: EXI RETURN TO CALLER ! 18759: ENP END PROCEDURE LISTT ! 18760: EJC ! 18761: * ! 18762: * NEXTS -- ACQUIRE NEXT SOURCE IMAGE ! 18763: * ! 18764: * NEXTS IS USED TO ACQUIRE THE NEXT SOURCE IMAGE AT COMPILE ! 18765: * TIME. IT ASSUMES THAT A PRIOR CALL TO READR HAS INPUT ! 18766: * A LINE IMAGE (SEE PROCEDURE READR). BEFORE THE CURRENT ! 18767: * IMAGE IS FINALLY LOST IT MAY BE LISTED HERE. ! 18768: * ! 18769: * JSR NEXTS CALL TO ACQUIRE NEXT INPUT LINE ! 18770: * (XR,XL,WA,WB,WC) DESTROYED ! 18771: * ! 18772: * GLOBAL VALUES AFFECTED ! 18773: * ! 18774: * R$CNI ON INPUT, NEXT IMAGE. ON ! 18775: * EXIT RESET TO ZERO ! 18776: * ! 18777: * R$CIM ON EXIT, SET TO POINT TO IMAGE ! 18778: * ! 18779: * SCNIL INPUT IMAGE LENGTH ON EXIT ! 18780: * ! 18781: * SCNSE RESET TO ZERO ON EXIT ! 18782: * ! 18783: * LSTPF SET ON EXIT IF LINE IS LISTED ! 18784: * ! 18785: NEXTS PRC E,0 ENTRY POINT ! 18786: BZE CSWLS,NXTS2 JUMP IF -NOLIST ! 18787: MOV R$CIM,XR POINT TO IMAGE ! 18788: BZE XR,NXTS2 JUMP IF NO IMAGE ! 18789: PLC XR GET CHAR PTR ! 18790: LCH WA,(XR) GET FIRST CHAR ! 18791: BNE WA,=CH$MN,NXTS1 JUMP IF NOT CTRL CARD ! 18792: BZE CSWPR,NXTS2 JUMP IF -NOPRINT ! 18793: * ! 18794: * HERE TO CALL LISTER ! 18795: * ! 18796: NXTS1 JSR LISTR LIST LINE ! 18797: * ! 18798: * HERE AFTER POSSIBLE LISTING ! 18799: * ! 18800: NXTS2 MOV R$CNI,XR POINT TO NEXT IMAGE ! 18801: MOV XR,R$CIM SET AS NEXT IMAGE ! 18802: ZER R$CNI CLEAR NEXT IMAGE POINTER ! 18803: MOV SCLEN(XR),WA GET INPUT IMAGE LENGTH ! 18804: MOV CSWIN,WB GET MAX ALLOWABLE LENGTH ! 18805: BLO WA,WB,NXTS3 SKIP IF NOT TOO LONG ! 18806: MOV WB,WA ELSE TRUNCATE ! 18807: * ! 18808: * HERE WITH LENGTH IN (WA) ! 18809: * ! 18810: NXTS3 MOV WA,SCNIL USE AS RECORD LENGTH ! 18811: ZER SCNSE RESET SCNSE ! 18812: ZER LSTPF SET LINE NOT LISTED YET ! 18813: EXI RETURN TO NEXTS CALLER ! 18814: ENP END PROCEDURE NEXTS ! 18815: EJC ! 18816: * ! 18817: * PATIN -- PATTERN CONSTRUCTION FOR LEN,POS,RPOS,TAB,RTAB ! 18818: * ! 18819: * THESE PATTERN TYPES ALL GENERATE A SIMILAR NODE TYPE. SO ! 18820: * THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION ! 18821: * FOR ACTUAL ENTRY POINTS FOR THESE FIVE FUNCTIONS. ! 18822: * ! 18823: * (WA) PCODE FOR EXPRESSION ARG CASE ! 18824: * (WB) PCODE FOR INTEGER ARG CASE ! 18825: * JSR PATIN CALL TO BUILD PATTERN NODE ! 18826: * PPM LOC TRANSFER LOC FOR NOT INTEGER OR EXP ! 18827: * PPM LOC TRANSFER LOC FOR INT OUT OF RANGE ! 18828: * (XR) POINTER TO CONSTRUCTED NODE ! 18829: * (XL,WA,WB,WC,IA) DESTROYED ! 18830: * ! 18831: PATIN PRC N,2 ENTRY POINT ! 18832: MOV WA,XL PRESERVE EXPRESSION ARG PCODE ! 18833: JSR GTSMI TRY TO CONVERT ARG AS SMALL INTEGER ! 18834: PPM PTIN2 JUMP IF NOT INTEGER ! 18835: PPM PTIN3 JUMP IF OUT OF RANGE ! 18836: * ! 18837: * COMMON SUCCESSFUL EXIT POINT ! 18838: * ! 18839: PTIN1 JSR PBILD BUILD PATTERN NODE ! 18840: EXI RETURN TO CALLER ! 18841: * ! 18842: * HERE IF ARGUMENT IS NOT AN INTEGER ! 18843: * ! 18844: PTIN2 MOV XL,WB COPY EXPR ARG CASE PCODE ! 18845: BLO (XR),=B$E$$,PTIN1 ALL OK IF EXPRESSION ARG ! 18846: EXI 1 ELSE TAKE ERROR EXIT FOR WRONG TYPE ! 18847: * ! 18848: * HERE FOR ERROR OF OUT OF RANGE INTEGER ARGUMENT ! 18849: * ! 18850: PTIN3 EXI 2 TAKE OUT-OF-RANGE ERROR EXIT ! 18851: ENP END PROCEDURE PATIN ! 18852: EJC ! 18853: * ! 18854: * PATST -- PATTERN CONSTRUCTION FOR ANY,NOTANY, ! 18855: * BREAK,SPAN AND BREAKX PATTERN FUNCTIONS. ! 18856: * ! 18857: * THESE PATTERN FUNCTIONS BUILD SIMILAR TYPES OF NODES AND ! 18858: * THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION ! 18859: * FOR ACTUAL ENTRY POINTS FOR THESE FIVE PATTERN FUNCTIONS. ! 18860: * ! 18861: * 0(XS) STRING ARGUMENT ! 18862: * (WB) PCODE FOR ONE CHAR ARGUMENT ! 18863: * (XL) PCODE FOR MULTI-CHAR ARGUMENT ! 18864: * (WC) PCODE FOR EXPRESSION ARGUMENT ! 18865: * JSR PATST CALL TO BUILD NODE ! 18866: * PPM LOC TRANSFER LOC IF NOT STRING OR EXPR ! 18867: * (XS) POPPED PAST STRING ARGUMENT ! 18868: * (XR) POINTER TO CONSTRUCTED NODE ! 18869: * (XL) DESTROYED ! 18870: * (WA,WB,WC,RA) DESTROYED ! 18871: * ! 18872: * NOTE THAT THERE IS A SPECIAL CALL TO PATST IN THE EVALS ! 18873: * PROCEDURE WITH A SLIGHTLY DIFFERENT FORM. SEE EVALS ! 18874: * FOR DETAILS OF THE FORM OF THIS CALL. ! 18875: * ! 18876: PATST PRC N,1 ENTRY POINT ! 18877: JSR GTSTG CONVERT ARGUMENT AS STRING ! 18878: PPM PATS7 JUMP IF NOT STRING ! 18879: BNE WA,=NUM01,PATS2 JUMP IF NOT ONE CHAR STRING ! 18880: * ! 18881: * HERE FOR ONE CHAR STRING CASE ! 18882: * ! 18883: BZE WB,PATS2 TREAT AS MULTI-CHAR IF EVALS CALL ! 18884: PLC XR POINT TO CHARACTER ! 18885: LCH XR,(XR) LOAD CHARACTER ! 18886: * ! 18887: * COMMON EXIT POINT AFTER SUCCESSFUL CONSTRUCTION ! 18888: * ! 18889: PATS1 JSR PBILD CALL ROUTINE TO BUILD NODE ! 18890: EXI RETURN TO PATST CALLER ! 18891: EJC ! 18892: * ! 18893: * PATST (CONTINUED) ! 18894: * ! 18895: * HERE FOR MULTI-CHARACTER STRING CASE ! 18896: * ! 18897: PATS2 MOV XL,-(XS) SAVE MULTI-CHAR PCODE ! 18898: MOV XR,-(XS) SAVE STRING POINTER ! 18899: MOV CTMSK,WC LOAD CURRENT MASK BIT ! 18900: LSH WC,1 SHIFT TO NEXT POSITION ! 18901: NZB WC,PATS4 SKIP IF POSITION LEFT IN THIS TBL ! 18902: * ! 18903: * HERE WE MUST ALLOCATE A NEW CHARACTER TABLE ! 18904: * ! 18905: MOV *CTSI$,WA SET SIZE OF CTBLK ! 18906: JSR ALLOC ALLOCATE CTBLK ! 18907: MOV XR,R$CTP STORE PTR TO NEW CTBLK ! 18908: MOV =B$CTT,(XR)+ STORE TYPE CODE, BUMP PTR ! 18909: LCT WB,=CFP$A SET NUMBER OF WORDS TO CLEAR ! 18910: MOV BITS0,WC LOAD ALL ZERO BITS ! 18911: * ! 18912: * LOOP TO CLEAR ALL BITS IN TABLE TO ZEROS ! 18913: * ! 18914: PATS3 MOV WC,(XR)+ MOVE WORD OF ZERO BITS ! 18915: BCT WB,PATS3 LOOP TILL ALL CLEARED ! 18916: MOV BITS1,WC SET INITIAL BIT POSITION ! 18917: * ! 18918: * MERGE HERE WITH BIT POSITION AVAILABLE ! 18919: * ! 18920: PATS4 MOV WC,CTMSK SAVE PARM2 (NEW BIT POSITION) ! 18921: MOV (XS)+,XL RESTORE POINTER TO ARGUMENT STRING ! 18922: MOV SCLEN(XL),WB LOAD STRING LENGTH ! 18923: BZE WB,PATS6 JUMP IF NULL STRING CASE ! 18924: LCT WB,WB ELSE SET LOOP COUNTER ! 18925: PLC XL POINT TO CHARACTERS IN ARGUMENT ! 18926: EJC ! 18927: * ! 18928: * PATST (CONTINUED) ! 18929: * ! 18930: * LOOP TO SET BITS IN COLUMN OF TABLE ! 18931: * ! 18932: PATS5 LCH WA,(XL)+ LOAD NEXT CHARACTER ! 18933: WTB WA CONVERT TO BYTE OFFSET ! 18934: MOV R$CTP,XR POINT TO CTBLK ! 18935: ADD WA,XR POINT TO CTBLK ENTRY ! 18936: MOV WC,WA COPY BIT MASK ! 18937: ORB CTCHS(XR),WA OR IN BITS ALREADY SET ! 18938: MOV WA,CTCHS(XR) STORE RESULTING BIT STRING ! 18939: BCT WB,PATS5 LOOP TILL ALL BITS SET ! 18940: * ! 18941: * COMPLETE PROCESSING FOR MUTI-CHAR STRING CASE ! 18942: * ! 18943: PATS6 MOV R$CTP,XR LOAD CTBLK PTR AS PARM1 FOR PBILD ! 18944: ZER XL CLEAR GARBAGE PTR IN XL ! 18945: MOV (XS)+,WB LOAD PCODE FOR MULTI-CHAR STR CASE ! 18946: BRN PATS1 BACK TO EXIT (WC=BITSTRING=PARM2) ! 18947: * ! 18948: * HERE IF ARGUMENT IS NOT A STRING ! 18949: * ! 18950: * NOTE THAT THE CALL FROM EVALS CANNOT PASS AN EXPRESSION ! 18951: * SINCE EVALP ALWAYS REEVALUATES EXPRESSIONS. ! 18952: * ! 18953: PATS7 MOV WC,WB SET PCODE FOR EXPRESSION ARGUMENT ! 18954: BLO (XR),=B$E$$,PATS1 JUMP TO EXIT IF EXPRESSION ARG ! 18955: EXI 1 ELSE TAKE WRONG TYPE ERROR EXIT ! 18956: ENP END PROCEDURE PATST ! 18957: EJC ! 18958: * ! 18959: * PBILD -- BUILD PATTERN NODE ! 18960: * ! 18961: * (XR) PARM1 (ONLY IF REQUIRED) ! 18962: * (WB) PCODE FOR NODE ! 18963: * (WC) PARM2 (ONLY IF REQUIRED) ! 18964: * JSR PBILD CALL TO BUILD NODE ! 18965: * (XR) POINTER TO CONSTRUCTED NODE ! 18966: * (WA) DESTROYED ! 18967: * ! 18968: PBILD PRC E,0 ENTRY POINT ! 18969: MOV XR,-(XS) STACK POSSIBLE PARM1 ! 18970: MOV WB,XR COPY PCODE ! 18971: LEI XR LOAD ENTRY POINT ID (BL$PX) ! 18972: BEQ XR,=BL$P1,PBLD1 JUMP IF ONE PARAMETER ! 18973: BEQ XR,=BL$P0,PBLD3 JUMP IF NO PARAMETERS ! 18974: * ! 18975: * HERE FOR TWO PARAMETER CASE ! 18976: * ! 18977: MOV *PCSI$,WA SET SIZE OF P2BLK ! 18978: JSR ALLOC ALLOCATE BLOCK ! 18979: MOV WC,PARM2(XR) STORE SECOND PARAMETER ! 18980: BRN PBLD2 MERGE WITH ONE PARM CASE ! 18981: * ! 18982: * HERE FOR ONE PARAMETER CASE ! 18983: * ! 18984: PBLD1 MOV *PBSI$,WA SET SIZE OF P1BLK ! 18985: JSR ALLOC ALLOCATE NODE ! 18986: * ! 18987: * MERGE HERE FROM TWO PARM CASE ! 18988: * ! 18989: PBLD2 MOV (XS),PARM1(XR) STORE FIRST PARAMETER ! 18990: BRN PBLD4 MERGE WITH NO PARAMETER CASE ! 18991: * ! 18992: * HERE FOR CASE OF NO PARAMETERS ! 18993: * ! 18994: PBLD3 MOV *PASI$,WA SET SIZE OF P0BLK ! 18995: JSR ALLOC ALLOCATE NODE ! 18996: * ! 18997: * MERGE HERE FROM OTHER CASES ! 18998: * ! 18999: PBLD4 MOV WB,(XR) STORE PCODE ! 19000: ICA XS POP FIRST PARAMETER ! 19001: MOV =NDNTH,PTHEN(XR) SET NOTHEN SUCCESSOR POINTER ! 19002: EXI RETURN TO PBILD CALLER ! 19003: ENP END PROCEDURE PBILD ! 19004: EJC ! 19005: * ! 19006: * PCONC -- CONCATENATE TWO PATTERNS ! 19007: * ! 19008: * (XL) PTR TO RIGHT PATTERN ! 19009: * (XR) PTR TO LEFT PATTERN ! 19010: * JSR PCONC CALL TO CONCATENATE PATTERNS ! 19011: * (XR) PTR TO CONCATENATED PATTERN ! 19012: * (XL,WA,WB,WC) DESTROYED ! 19013: * ! 19014: * ! 19015: * TO CONCATENATE TWO PATTERNS, ALL SUCCESSORS IN THE LEFT ! 19016: * PATTERN WHICH POINT TO THE NOTHEN NODE MUST BE CHANGED TO ! 19017: * POINT TO THE RIGHT PATTERN. HOWEVER, THIS MODIFICATION ! 19018: * MUST BE PERFORMED ON A COPY OF THE LEFT ARGUMENT RATHER ! 19019: * THAN THE LEFT ARGUMENT ITSELF, SINCE THE LEFT ARGUMENT ! 19020: * MAY BE POINTED TO BY SOME OTHER VARIABLE VALUE. ! 19021: * ! 19022: * ACCORDINGLY, IT IS NECESSARY TO COPY THE LEFT ARGUMENT. ! 19023: * THIS IS NOT A TRIVIAL PROCESS SINCE WE MUST AVOID COPYING ! 19024: * NODES MORE THAN ONCE AND THE PATTERN IS A GRAPH STRUCTURE ! 19025: * THE FOLLOWING ALGORITHM IS EMPLOYED. ! 19026: * ! 19027: * THE STACK IS USED TO STORE A LIST OF NODES WHICH ! 19028: * HAVE ALREADY BEEN COPIED. THE FORMAT OF THE ENTRIES ON ! 19029: * THIS LIST CONSISTS OF A TWO WORD BLOCK. THE FIRST WORD ! 19030: * IS THE OLD ADDRESS AND THE SECOND WORD IS THE ADDRESS ! 19031: * OF THE COPY. THIS LIST IS SEARCHED BY THE PCOPY ! 19032: * ROUTINE TO AVOID MAKING DUPLICATE COPIES. A TRICK IS ! 19033: * USED TO ACCOMPLISH THE CONCATENATION AT THE SAME TIME. ! 19034: * A SPECIAL ENTRY IS MADE TO START WITH ON THE STACK. THIS ! 19035: * ENTRY RECORDS THAT THE NOTHEN NODE HAS BEEN COPIED ! 19036: * ALREADY AND THE ADDRESS OF ITS COPY IS THE RIGHT PATTERN. ! 19037: * THIS AUTOMATICALLY PERFORMS THE CORRECT REPLACEMENTS. ! 19038: * ! 19039: PCONC PRC E,0 ENTRY POINT ! 19040: ZER -(XS) MAKE ROOM FOR ONE ENTRY AT BOTTOM ! 19041: MOV XS,WC STORE POINTER TO START OF LIST ! 19042: MOV =NDNTH,-(XS) STACK NOTHEN NODE AS OLD NODE ! 19043: MOV XL,-(XS) STORE RIGHT ARG AS COPY OF NOTHEN ! 19044: MOV XS,XT INITIALIZE POINTER TO STACK ENTRIES ! 19045: JSR PCOPY COPY FIRST NODE OF LEFT ARG ! 19046: MOV WA,2(XT) STORE AS RESULT UNDER LIST ! 19047: EJC ! 19048: * ! 19049: * PCONC (CONTINUED) ! 19050: * ! 19051: * THE FOLLOWING LOOP SCANS ENTRIES IN THE LIST AND MAKES ! 19052: * SURE THAT THEIR SUCCESSORS HAVE BEEN COPIED. ! 19053: * ! 19054: PCNC1 BEQ XT,XS,PCNC2 JUMP IF ALL ENTRIES PROCESSED ! 19055: MOV -(XT),XR ELSE LOAD NEXT OLD ADDRESS ! 19056: MOV PTHEN(XR),XR LOAD POINTER TO SUCCESSOR ! 19057: JSR PCOPY COPY SUCCESSOR NODE ! 19058: MOV -(XT),XR LOAD POINTER TO NEW NODE (COPY) ! 19059: MOV WA,PTHEN(XR) STORE PTR TO NEW SUCCESSOR ! 19060: * ! 19061: * NOW CHECK FOR SPECIAL CASE OF ALTERNATION NODE WHERE ! 19062: * PARM1 POINTS TO A NODE AND MUST BE COPIED LIKE PTHEN. ! 19063: * ! 19064: BNE (XR),=P$ALT,PCNC1 LOOP BACK IF NOT ! 19065: MOV PARM1(XR),XR ELSE LOAD POINTER TO ALTERNATIVE ! 19066: JSR PCOPY COPY IT ! 19067: MOV (XT),XR RESTORE PTR TO NEW NODE ! 19068: MOV WA,PARM1(XR) STORE PTR TO COPIED ALTERNATIVE ! 19069: BRN PCNC1 LOOP BACK FOR NEXT ENTRY ! 19070: * ! 19071: * HERE AT END OF COPY PROCESS ! 19072: * ! 19073: PCNC2 MOV WC,XS RESTORE STACK POINTER ! 19074: MOV (XS)+,XR LOAD POINTER TO COPY ! 19075: EXI RETURN TO PCONC CALLER ! 19076: ENP END PROCEDURE PCONC ! 19077: EJC ! 19078: * ! 19079: * PCOPY -- COPY A PATTERN NODE ! 19080: * ! 19081: * PCOPY IS CALLED FROM THE PCONC PROCEDURE TO COPY A SINGLE ! 19082: * PATTERN NODE. THE COPY IS ONLY CARRIED OUT IF THE NODE ! 19083: * HAS NOT BEEN COPIED ALREADY. ! 19084: * ! 19085: * (XR) POINTER TO NODE TO BE COPIED ! 19086: * (XT) PTR TO CURRENT LOC IN COPY LIST ! 19087: * (WC) POINTER TO LIST OF COPIED NODES ! 19088: * JSR PCOPY CALL TO COPY A NODE ! 19089: * (WA) POINTER TO COPY ! 19090: * (WB,XR) DESTROYED ! 19091: * ! 19092: PCOPY PRC N,0 ENTRY POINT ! 19093: MOV XT,WB SAVE XT ! 19094: MOV WC,XT POINT TO START OF LIST ! 19095: * ! 19096: * LOOP TO SEARCH LIST OF NODES COPIED ALREADY ! 19097: * ! 19098: PCOP1 DCA XT POINT TO NEXT ENTRY ON LIST ! 19099: BEQ XR,(XT),PCOP2 JUMP IF MATCH ! 19100: DCA XT ELSE SKIP OVER COPIED ADDRESS ! 19101: BNE XT,XS,PCOP1 LOOP BACK IF MORE TO TEST ! 19102: * ! 19103: * HERE IF NOT IN LIST, PERFORM COPY ! 19104: * ! 19105: MOV (XR),WA LOAD FIRST WORD OF BLOCK ! 19106: JSR BLKLN GET LENGTH OF BLOCK ! 19107: MOV XR,XL SAVE POINTER TO OLD NODE ! 19108: JSR ALLOC ALLOCATE SPACE FOR COPY ! 19109: MOV XL,-(XS) STORE OLD ADDRESS ON LIST ! 19110: MOV XR,-(XS) STORE NEW ADDRESS ON LIST ! 19111: CHK CHECK FOR STACK OVERFLOW ! 19112: MVW MOVE WORDS FROM OLD BLOCK TO COPY ! 19113: MOV (XS),WA LOAD POINTER TO COPY ! 19114: BRN PCOP3 JUMP TO EXIT ! 19115: * ! 19116: * HERE IF WE FIND ENTRY IN LIST ! 19117: * ! 19118: PCOP2 MOV -(XT),WA LOAD ADDRESS OF COPY FROM LIST ! 19119: * ! 19120: * COMMON EXIT POINT ! 19121: * ! 19122: PCOP3 MOV WB,XT RESTORE XT ! 19123: EXI RETURN TO PCOPY CALLER ! 19124: ENP END PROCEDURE PCOPY ! 19125: EJC ! 19126: * ! 19127: * PRFLR -- PRINT PROFILE ! 19128: * PRFLR IS CALLED TO PRINT THE CONTENTS OF THE PROFILE ! 19129: * TABLE IN A FAIRLY READABLE TABULAR FORMAT. ! 19130: * ! 19131: * JSR PRFLR CALL TO PRINT PROFILE ! 19132: * (WA,IA) DESTROYED ! 19133: * ! 19134: PRFLR PRC E,0 ! 19135: BZE PFDMP,PRFL4 NO PRINTING IF NO PROFILING DONE ! 19136: MOV XR,-(XS) PRESERVE ENTRY XR ! 19137: MOV WB,PFSVW AND ALSO WB ! 19138: JSR PRTPG EJECT ! 19139: MOV =PFMS1,XR LOAD MSG /PROGRAM PROFILE/ ! 19140: JSR PRTST AND PRINT IT ! 19141: JSR PRTNL FOLLOWED BY NEWLINE ! 19142: JSR PRTNL AND ANOTHER ! 19143: MOV =PFMS2,XR POINT TO FIRST HDR ! 19144: JSR PRTST PRINT IT ! 19145: JSR PRTNL NEW LINE ! 19146: MOV =PFMS3,XR SECOND HDR ! 19147: JSR PRTST PRINT IT ! 19148: JSR PRTNL NEW LINE ! 19149: JSR PRTNL AND ANOTHER BLANK LINE ! 19150: ZER WB INITIAL STMT COUNT ! 19151: MOV PFTBL,XR POINT TO TABLE ORIGIN ! 19152: ADD *NUM02,XR BIAS PAST XNBLK HEADER (SGD07) ! 19153: * ! 19154: * LOOP HERE TO PRINT SUCCESSIVE ENTRIES ! 19155: * ! 19156: PRFL1 ICV WB BUMP STMT NR ! 19157: LDI (XR) LOAD NR OF EXECUTIONS ! 19158: IEQ PRFL3 NO PRINTING IF ZERO ! 19159: MOV =PFPD1,PROFS POINT WHERE TO PRINT ! 19160: JSR PRTIN AND PRINT IT ! 19161: ZER PROFS BACK TO START OF LINE ! 19162: MTI WB LOAD STMT NR ! 19163: JSR PRTIN PRINT IT THERE ! 19164: MOV =PFPD2,PROFS AND PAD PAST COUNT ! 19165: LDI CFP$I(XR) LOAD TOTAL EXEC TIME ! 19166: JSR PRTIN PRINT THAT TOO ! 19167: LDI CFP$I(XR) RELOAD TIME ! 19168: MLI INTTH CONVERT TO MICROSEC ! 19169: IOV PRFL2 OMIT NEXT BIT IF OVERFLOW ! 19170: DVI (XR) DIVIDE BY EXECUTIONS ! 19171: MOV =PFPD3,PROFS PAD LAST PRINT ! 19172: JSR PRTIN AND PRINT MCSEC/EXECN ! 19173: * ! 19174: * MERGE AFTER PRINTING TIME ! 19175: * ! 19176: PRFL2 JSR PRTNL THATS ANOTHER LINE ! 19177: * ! 19178: * HERE TO GO TO NEXT ENTRY ! 19179: * ! 19180: PRFL3 ADD *PF$I2,XR BUMP INDEX PTR (SGD07) ! 19181: BLT WB,PFNTE,PRFL1 LOOP IF MORE STMTS ! 19182: MOV (XS)+,XR RESTORE CALLERS XR ! 19183: MOV PFSVW,WB AND WB TOO ! 19184: * ! 19185: * HERE TO EXIT ! 19186: * ! 19187: PRFL4 EXI RETURN ! 19188: ENP END OF PRFLR ! 19189: EJC ! 19190: * ! 19191: * PRFLU -- UPDATE AN ENTRY IN THE PROFILE TABLE ! 19192: * ! 19193: * ON ENTRY, KVSTN CONTAINS NR OF STMT TO PROFILE ! 19194: * ! 19195: * JSR PRFLU CALL TO UPDATE ENTRY ! 19196: * (IA) DESTROYED ! 19197: * ! 19198: PRFLU PRC E,0 ! 19199: BNZ PFFNC,PFLU4 SKIP IF JUST ENTERED FUNCTION ! 19200: MOV XR,-(XS) PRESERVE ENTRY XR ! 19201: MOV WA,PFSVW SAVE WA (SGD07) ! 19202: BNZ PFTBL,PFLU2 BRANCH IF TABLE ALLOCATED ! 19203: * ! 19204: * HERE IF SPACE FOR PROFILE TABLE NOT YET ALLOCATED. ! 19205: * CALCULATE SIZE NEEDED, ALLOCATE A STATIC XNBLK, AND ! 19206: * INITIALIZE IT ALL TO ZERO. ! 19207: * THE TIME TAKEN FOR THIS WILL BE ATTRIBUTED TO THE CURRENT ! 19208: * STATEMENT (ASSIGNMENT TO KEYWD PROFILE), BUT SINCE THE ! 19209: * TIMING FOR THIS STATEMENT IS UP THE POLE ANYWAY, THIS ! 19210: * DOESNT REALLY MATTER... ! 19211: * ! 19212: SUB =NUM01,PFNTE ADJUST FOR EXTRA COUNT (SGD07) ! 19213: MTI PFI2A CONVRT ENTRY SIZE TO INT ! 19214: STI PFSTE AND STORE SAFELY FOR LATER ! 19215: MTI PFNTE LOAD TABLE LENGTH AS INTEGER ! 19216: MLI PFSTE MULTIPLY BY ENTRY SIZE ! 19217: MFI WA GET BACK ADDRESS-STYLE ! 19218: ADD =NUM02,WA ADD ON 2 WORD OVERHEAD ! 19219: WTB WA CONVERT THE WHOLE LOT TO BYTES ! 19220: JSR ALOST GIMME THE SPACE ! 19221: MOV XR,PFTBL SAVE BLOCK POINTER ! 19222: MOV =B$XNT,(XR)+ PUT BLOCK TYPE AND ... ! 19223: MOV WA,(XR)+ ... LENGTH INTO HEADER ! 19224: MFI WA GET BACK NR OF WDS IN DATA AREA ! 19225: LCT WA,WA LOAD THE COUNTER ! 19226: * ! 19227: * LOOP HERE TO ZERO THE BLOCK DATA ! 19228: * ! 19229: PFLU1 ZER (XR)+ BLANK A WORD ! 19230: BCT WA,PFLU1 AND ALLLLLLL THE REST ! 19231: * ! 19232: * END OF ALLOCATION. MERGE BACK INTO ROUTINE ! 19233: * ! 19234: PFLU2 MTI KVSTN LOAD NR OF STMT JUST ENDED ! 19235: SBI INTV1 MAKE INTO INDEX OFFSET ! 19236: MLI PFSTE MAKE OFFSET OF TABLE ENTRY ! 19237: MFI WA CONVERT TO ADDRESS ! 19238: WTB WA GET AS BAUS ! 19239: ADD *NUM02,WA OFFSET INCLUDES TABLE HEADER ! 19240: MOV PFTBL,XR GET TABLE START ! 19241: BGE WA,NUM01(XR),PFLU3 IF OUT OF TABLE, SKIP IT ! 19242: ADD WA,XR ELSE POINT TO ENTRY ! 19243: LDI (XR) GET NR OF EXECUTIONS SO FAR ! 19244: ADI INTV1 NUDGE UP ONE ! 19245: STI (XR) AND PUT BACK ! 19246: JSR SYSTM GET TIME NOW ! 19247: STI PFETM STASH ENDING TIME ! 19248: SBI PFSTM SUBTRACT START TIME ! 19249: ADI CFP$I(XR) ADD CUMULATIVE TIME SO FAR ! 19250: STI CFP$I(XR) AND PUT BACK NEW TOTAL ! 19251: LDI PFETM LOAD END TIME OF THIS STMT ... ! 19252: STI PFSTM ... WHICH IS START TIME OF NEXT ! 19253: * ! 19254: * MERGE HERE TO EXIT ! 19255: * ! 19256: PFLU3 MOV (XS)+,XR RESTORE CALLERS XR ! 19257: MOV PFSVW,WA RESTORE SAVED REG ! 19258: EXI AND RETURN ! 19259: * ! 19260: * HERE IF PROFILE IS SUPPRESSED BECAUSE A PROGRAM DEFINED ! 19261: * FUNCTION IS ABOUT TO BE ENTERED, AND SO THE CURRENT STMT ! 19262: * HAS NOT YET FINISHED ! 19263: * ! 19264: PFLU4 ZER PFFNC RESET THE CONDITION FLAG ! 19265: EXI AND IMMEDIATE RETURN ! 19266: ENP END OF PROCEDURE PRFLU ! 19267: EJC ! 19268: * ! 19269: * PRPAR - PROCESS PRINT PARAMETERS ! 19270: * ! 19271: * (WC) IF NONZERO ASSOCIATE TERMINAL ONLY ! 19272: * JSR PRPAR CALL TO PROCESS PRINT PARAMETERS ! 19273: * (XL,XR,WA,WB,WC) DESTROYED ! 19274: * ! 19275: * SINCE MEMORY ALLOCATION IS UNDECIDED ON INITIAL CALL, ! 19276: * TERMINAL CANNOT BE ASSOCIATED. THE ENTRY WITH WC NON-ZERO ! 19277: * IS PROVIDED SO A LATER CALL CAN BE MADE TO COMPLETE THIS. ! 19278: * ! 19279: PRPAR PRC E,0 ENTRY POINT ! 19280: BNZ WC,PRPA7 JUMP TO ASSOCIATE TERMINAL ! 19281: JSR SYSPP GET PRINT PARAMETERS ! 19282: BNZ WB,PRPA1 JUMP IF LINES/PAGE SPECIFIED ! 19283: MOV =CFP$M,WB ELSE USE A LARGE VALUE ! 19284: RSH WB,1 BUT NOT TOO LARGE ! 19285: * ! 19286: * STORE LINE COUNT/PAGE ! 19287: * ! 19288: PRPA1 MOV WB,LSTNP STORE NUMBER OF LINES/PAGE ! 19289: MOV WB,LSTLC PRETEND PAGE IS FULL INITIALLY ! 19290: ZER LSTPG CLEAR PAGE NUMBER ! 19291: MOV PRLEN,WB GET PRIOR LENGTH IF ANY ! 19292: BZE WB,PRPA2 SKIP IF NO LENGTH ! 19293: BGT WA,WB,PRPA3 SKIP STORING IF TOO BIG ! 19294: * ! 19295: * STORE PRINT BUFFER LENGTH ! 19296: * ! 19297: PRPA2 MOV WA,PRLEN STORE VALUE ! 19298: * ! 19299: * PROCESS BITS OPTIONS ! 19300: * ! 19301: PRPA3 MOV BITS3,WB BIT 3 MASK ! 19302: ANB WC,WB GET -NOLIST BIT ! 19303: ZRB WB,PRPA4 SKIP IF CLEAR ! 19304: ZER CSWLS SET -NOLIST ! 19305: * ! 19306: * CHECK IF FAIL REPORTS GOTO INTERACTIVE CHANNEL ! 19307: * ! 19308: PRPA4 MOV BITS1,WB BIT 1 MASK ! 19309: ANB WC,WB GET BIT ! 19310: MOV WB,ERICH STORE INT. CHAN. ERROR FLAG ! 19311: MOV BITS2,WB BIT 2 MASK ! 19312: ANB WC,WB GET BIT ! 19313: MOV WB,PRICH FLAG FOR STD PRINTER ON INT. CHAN. ! 19314: MOV BITS4,WB BIT 4 MASK ! 19315: ANB WC,WB GET BIT ! 19316: MOV WB,CPSTS FLAG FOR COMPILE STATS SUPPRESSN. ! 19317: MOV BITS5,WB BIT 5 MASK ! 19318: ANB WC,WB GET BIT ! 19319: MOV WB,EXSTS FLAG FOR EXEC STATS SUPPRESSION ! 19320: EJC ! 19321: * ! 19322: * PRPAR (CONTINUED) ! 19323: * ! 19324: MOV BITS6,WB BIT 6 MASK ! 19325: ANB WC,WB GET BIT ! 19326: MOV WB,PRECL EXTENDED/COMPACT LISTING FLAG ! 19327: SUB =NUM08,WA POINT 8 CHARS FROM LINE END ! 19328: ZRB WB,PRPA5 JUMP IF NOT EXTENDED ! 19329: MOV WA,LSTPO STORE FOR LISTING PAGE HEADINGS ! 19330: * ! 19331: * CONTINUE OPTION PROCESSING ! 19332: * ! 19333: PRPA5 MOV BITS7,WB BIT 7 MASK ! 19334: ANB WC,WB GET BIT 7 ! 19335: MOV WB,CSWEX SET -NOEXECUTE IF NON-ZERO ! 19336: MOV BIT10,WB BIT 10 MASK ! 19337: ANB WC,WB GET BIT 10 ! 19338: MOV WB,HEADP PRETEND PRINTED TO OMIT HEADERS ! 19339: MOV BITS9,WB BIT 9 MASK ! 19340: ANB WC,WB GET BIT 9 ! 19341: MOV WB,PRSTO KEEP IT AS STD LISTING OPTION ! 19342: ZRB WB,PRPA6 SKIP IF CLEAR ! 19343: MOV PRLEN,WA GET PRINT BUFFER LENGTH ! 19344: SUB =NUM08,WA POINT 8 CHARS FROM LINE END ! 19345: MOV WA,LSTPO STORE PAGE OFFSET ! 19346: * ! 19347: * CHECK FOR TERMINAL ! 19348: * ! 19349: PRPA6 ANB BITS8,WC SEE IF TERMINAL TO BE ACTIVATED ! 19350: BNZ WC,PRPA7 JUMP IF TERMINAL REQUIRED ! 19351: BZE INITR,PRPA8 JUMP IF NO TERMINAL TO DETACH ! 19352: MOV =V$TER,XL PTR TO /TERMINAL/ ! 19353: JSR GTNVR GET VRBLK POINTER ! 19354: PPM CANT FAIL ! 19355: MOV =NULLS,VRVAL(XR) CLEAR VALUE OF TERMINAL ! 19356: JSR SETVR REMOVE ASSOCIATION ! 19357: BRN PRPA8 RETURN ! 19358: * ! 19359: * ASSOCIATE TERMINAL ! 19360: * ! 19361: PRPA7 MNZ INITR NOTE TERMINAL ASSOCIATED ! 19362: BZE DNAMB,PRPA8 CANT IF MEMORY NOT ORGANISED ! 19363: MOV =V$TER,XL POINT TO TERMINAL STRING ! 19364: MOV =TRTOU,WB OUTPUT TRACE TYPE ! 19365: JSR INOUT ATTACH OUTPUT TRBLK TO VRBLK ! 19366: MOV XR,-(XS) STACK TRBLK PTR ! 19367: MOV =V$TER,XL POINT TO TERMINAL STRING ! 19368: MOV =TRTIN,WB INPUT TRACE TYPE ! 19369: JSR INOUT ATTACH INPUT TRACE BLK ! 19370: MOV (XS)+,VRVAL(XR) ADD OUTPUT TRBLK TO CHAIN ! 19371: * ! 19372: * RETURN POINT ! 19373: * ! 19374: PRPA8 EXI RETURN ! 19375: ENP END PROCEDURE PRPAR ! 19376: EJC ! 19377: * ! 19378: * PRTCH -- PRINT A CHARACTER ! 19379: * ! 19380: * PRTCH IS USED TO PRINT A SINGLE CHARACTER ! 19381: * ! 19382: * (WA) CHARACTER TO BE PRINTED ! 19383: * JSR PRTCH CALL TO PRINT CHARACTER ! 19384: * ! 19385: PRTCH PRC E,0 ENTRY POINT ! 19386: MOV XR,-(XS) SAVE XR ! 19387: BNE PROFS,PRLEN,PRCH1 JUMP IF ROOM IN BUFFER ! 19388: JSR PRTNL ELSE PRINT THIS LINE ! 19389: * ! 19390: * HERE AFTER MAKING SURE WE HAVE ROOM ! 19391: * ! 19392: PRCH1 MOV PRBUF,XR POINT TO PRINT BUFFER ! 19393: PSC XR,PROFS POINT TO NEXT CHARACTER LOCATION ! 19394: SCH WA,(XR) STORE NEW CHARACTER ! 19395: CSC XR COMPLETE STORE CHARACTERS ! 19396: ICV PROFS BUMP POINTER ! 19397: MOV (XS)+,XR RESTORE ENTRY XR ! 19398: EXI RETURN TO PRTCH CALLER ! 19399: ENP END PROCEDURE PRTCH ! 19400: EJC ! 19401: * ! 19402: * PRTIC -- PRINT TO INTERACTIVE CHANNEL ! 19403: * ! 19404: * PRTIC IS CALLED TO PRINT THE CONTENTS OF THE STANDARD ! 19405: * PRINT BUFFER TO THE INTERACTIVE CHANNEL. IT IS ONLY ! 19406: * CALLED AFTER PRTST HAS SET UP THE STRING FOR PRINTING. ! 19407: * IT DOES NOT CLEAR THE BUFFER. ! 19408: * ! 19409: * JSR PRTIC CALL FOR PRINT ! 19410: * (WA,WB) DESTROYED ! 19411: * ! 19412: PRTIC PRC E,0 ENTRY POINT ! 19413: MOV XR,-(XS) SAVE XR ! 19414: MOV PRBUF,XR POINT TO BUFFER ! 19415: MOV PROFS,WA NO OF CHARS ! 19416: JSR SYSPI PRINT ! 19417: PPM PRTC2 FAIL RETURN ! 19418: * ! 19419: * RETURN ! 19420: * ! 19421: PRTC1 MOV (XS)+,XR RESTORE XR ! 19422: EXI RETURN ! 19423: * ! 19424: * ERROR OCCURED ! 19425: * ! 19426: PRTC2 ZER ERICH PREVENT LOOPING ! 19427: ERB 252,ERROR ON PRINTING TO INTERACTIVE CHANNEL ! 19428: BRN PRTC1 RETURN ! 19429: ENP PROCEDURE PRTIC ! 19430: EJC ! 19431: * ! 19432: * PRTIS -- PRINT TO INTERACTIVE AND STANDARD PRINTER ! 19433: * ! 19434: * PRTIS PUTS A LINE FROM THE PRINT BUFFER ONTO THE ! 19435: * INTERACTIVE CHANNEL (IF ANY) AND THE STANDARD PRINTER. ! 19436: * IT ALWAYS PRINTS TO THE STANDARD PRINTER BUT DOES ! 19437: * NOT DUPLICATE LINES IF THE STANDARD PRINTER IS ! 19438: * INTERACTIVE. IT CLEARS DOWN THE PRINT BUFFER. ! 19439: * ! 19440: * JSR PRTIS CALL FOR PRINTING ! 19441: * (WA,WB) DESTROYED ! 19442: * ! 19443: PRTIS PRC E,0 ENTRY POINT ! 19444: BNZ PRICH,PRTS1 JUMP IF STANDARD PRINTER IS INT.CH. ! 19445: BZE ERICH,PRTS1 SKIP IF NOT DOING INT. ERROR REPS. ! 19446: JSR PRTIC PRINT TO INTERACTIVE CHANNEL ! 19447: * ! 19448: * MERGE AND EXIT ! 19449: * ! 19450: PRTS1 JSR PRTNL PRINT TO STANDARD PRINTER ! 19451: EXI RETURN ! 19452: ENP END PROCEDURE PRTIS ! 19453: EJC ! 19454: * ! 19455: * PRTIN -- PRINT AN INTEGER ! 19456: * ! 19457: * PRTIN PRINTS THE INTEGER VALUE WHICH IS IN THE INTEGER ! 19458: * ACCUMULATOR. BLOCKS BUILT IN DYNAMIC STORAGE ! 19459: * DURING THIS PROCESS ARE IMMEDIATELY DELETED. ! 19460: * ! 19461: * (IA) INTEGER VALUE TO BE PRINTED ! 19462: * JSR PRTIN CALL TO PRINT INTEGER ! 19463: * (IA,RA) DESTROYED ! 19464: * ! 19465: PRTIN PRC E,0 ENTRY POINT ! 19466: MOV XR,-(XS) SAVE XR ! 19467: JSR ICBLD BUILD INTEGER BLOCK ! 19468: BLO XR,DNAMB,PRTI1 JUMP IF ICBLK BELOW DYNAMIC ! 19469: BHI XR,DNAMP,PRTI1 JUMP IF ABOVE DYNAMIC ! 19470: MOV XR,DNAMP IMMEDIATELY DELETE IT ! 19471: * ! 19472: * DELETE ICBLK FROM DYNAMIC STORE ! 19473: * ! 19474: PRTI1 MOV XR,-(XS) STACK PTR FOR GTSTG ! 19475: JSR GTSTG CONVERT TO STRING ! 19476: PPM CONVERT ERROR IS IMPOSSIBLE ! 19477: MOV XR,DNAMP RESET POINTER TO DELETE SCBLK ! 19478: JSR PRTST PRINT INTEGER STRING ! 19479: MOV (XS)+,XR RESTORE ENTRY XR ! 19480: EXI RETURN TO PRTIN CALLER ! 19481: ENP END PROCEDURE PRTIN ! 19482: EJC ! 19483: * ! 19484: * PRTMI -- PRINT MESSAGE AND INTEGER ! 19485: * ! 19486: * PRTMI IS USED TO PRINT MESSAGES TOGETHER WITH AN INTEGER ! 19487: * VALUE STARTING IN COLUMN 15 (USED BY THE ROUTINES AT ! 19488: * THE END OF COMPILATION). ! 19489: * ! 19490: * JSR PRTMI CALL TO PRINT MESSAGE AND INTEGER ! 19491: * ! 19492: PRTMI PRC E,0 ENTRY POINT ! 19493: JSR PRTST PRINT STRING MESSAGE ! 19494: MOV =PRTMF,PROFS SET OFFSET TO COL 15 ! 19495: JSR PRTIN PRINT INTEGER ! 19496: JSR PRTNL PRINT LINE ! 19497: EXI RETURN TO PRTMI CALLER ! 19498: ENP END PROCEDURE PRTMI ! 19499: EJC ! 19500: * ! 19501: * PRTMX -- AS PRTMI WITH EXTRA COPY TO INTERACTIVE CHAN. ! 19502: * ! 19503: * JSR PRTMX CALL FOR PRINTING ! 19504: * (WA,WB) DESTROYED ! 19505: * ! 19506: PRTMX PRC E,0 ENTRY POINT ! 19507: JSR PRTST PRINT STRING MESSAGE ! 19508: MOV =PRTMF,PROFS SET PTR TO COLUMN 15 ! 19509: JSR PRTIN PRINT INTEGER ! 19510: JSR PRTIS PRINT LINE ! 19511: EXI RETURN ! 19512: ENP END PROCEDURE PRTMX ! 19513: EJC ! 19514: * ! 19515: * PRTNL -- PRINT NEW LINE (END PRINT LINE) ! 19516: * ! 19517: * PRTNL PRINTS THE CONTENTS OF THE PRINT BUFFER, RESETS ! 19518: * THE BUFFER TO ALL BLANKS AND RESETS THE PRINT POINTER. ! 19519: * ! 19520: * JSR PRTNL CALL TO PRINT LINE ! 19521: * ! 19522: PRTNL PRC R,0 ENTRY POINT ! 19523: BNZ HEADP,PRNL0 WERE HEADERS PRINTED ! 19524: JSR PRTPS NO - PRINT THEM ! 19525: * ! 19526: * CALL SYSPR ! 19527: * ! 19528: PRNL0 MOV XR,-(XS) SAVE ENTRY XR ! 19529: MOV WA,PRTSA SAVE WA ! 19530: MOV WB,PRTSB SAVE WB ! 19531: MOV PRBUF,XR LOAD POINTER TO BUFFER ! 19532: MOV PROFS,WA LOAD NUMBER OF CHARS IN BUFFER ! 19533: JSR SYSPR CALL SYSTEM PRINT ROUTINE ! 19534: PPM PRNL2 JUMP IF FAILED ! 19535: LCT WA,PRLNW LOAD LENGTH OF BUFFER IN WORDS ! 19536: ADD *SCHAR,XR POINT TO CHARS OF BUFFER ! 19537: MOV NULLW,WB GET WORD OF BLANKS ! 19538: * ! 19539: * LOOP TO BLANK BUFFER ! 19540: * ! 19541: PRNL1 MOV WB,(XR)+ STORE WORD OF BLANKS, BUMP PTR ! 19542: BCT WA,PRNL1 LOOP TILL ALL BLANKED ! 19543: * ! 19544: * EXIT POINT ! 19545: * ! 19546: MOV PRTSB,WB RESTORE WB ! 19547: MOV PRTSA,WA RESTORE WA ! 19548: MOV (XS)+,XR RESTORE ENTRY XR ! 19549: ZER PROFS RESET PRINT BUFFER POINTER ! 19550: EXI RETURN TO PRTNL CALLER ! 19551: * ! 19552: * FILE FULL OR NO OUTPUT FILE FOR LOAD MODULE ! 19553: * ! 19554: PRNL2 BNZ PRTEF,PRNL3 JUMP IF NOT FIRST TIME ! 19555: MNZ PRTEF MARK FIRST OCCURRENCE ! 19556: ERB 253,PRINT LIMIT EXCEEDED ON STANDARD OUTPUT CHANNEL ! 19557: * ! 19558: * STOP AT ONCE ! 19559: * ! 19560: PRNL3 MOV =NINI8,WB ENDING CODE ! 19561: MOV KVSTN,WA STATEMENT NUMBER ! 19562: JSR SYSEJ STOP ! 19563: ENP END PROCEDURE PRTNL ! 19564: EJC ! 19565: * ! 19566: * PRTNM -- PRINT VARIABLE NAME ! 19567: * ! 19568: * PRTNM IS USED TO PRINT A CHARACTER REPRESENTATION OF THE ! 19569: * NAME OF A VARIABLE (NOT A VALUE OF DATATYPE NAME) ! 19570: * NAMES OF PSEUDO-VARIABLES MAY NOT BE PASSED TO PRTNM. ! 19571: * ! 19572: * (XL) NAME BASE ! 19573: * (WA) NAME OFFSET ! 19574: * JSR PRTNM CALL TO PRINT NAME ! 19575: * (WB,WC,RA) DESTROYED ! 19576: * ! 19577: PRTNM PRC R,0 ENTRY POINT (RECURSIVE, SEE PRTVL) ! 19578: MOV WA,-(XS) SAVE WA (OFFSET IS COLLECTABLE) ! 19579: MOV XR,-(XS) SAVE ENTRY XR ! 19580: MOV XL,-(XS) SAVE NAME BASE ! 19581: BHI XL,STATE,PRN02 JUMP IF NOT NATURAL VARIABLE ! 19582: * ! 19583: * HERE FOR NATURAL VARIABLE NAME, RECOGNIZED BY THE FACT ! 19584: * THAT THE NAME BASE POINTS INTO THE STATIC AREA. ! 19585: * ! 19586: MOV XL,XR POINT TO VRBLK ! 19587: JSR PRTVN PRINT NAME OF VARIABLE ! 19588: * ! 19589: * COMMON EXIT POINT ! 19590: * ! 19591: PRN01 MOV (XS)+,XL RESTORE NAME BASE ! 19592: MOV (XS)+,XR RESTORE ENTRY VALUE OF XR ! 19593: MOV (XS)+,WA RESTORE WA ! 19594: EXI RETURN TO PRTNM CALLER ! 19595: * ! 19596: * HERE FOR CASE OF NON-NATURAL VARIABLE ! 19597: * ! 19598: PRN02 MOV WA,WB COPY NAME OFFSET ! 19599: BNE (XL),=B$PDT,PRN03 JUMP IF ARRAY OR TABLE ! 19600: * ! 19601: * FOR PROGRAM DEFINED DATATYPE, PRT FLD NAME, LEFT PAREN ! 19602: * ! 19603: MOV PDDFP(XL),XR LOAD POINTER TO DFBLK ! 19604: ADD WA,XR ADD NAME OFFSET ! 19605: MOV PDFOF(XR),XR LOAD VRBLK POINTER FOR FIELD ! 19606: JSR PRTVN PRINT FIELD NAME ! 19607: MOV =CH$PP,WA LOAD LEFT PAREN ! 19608: JSR PRTCH PRINT CHARACTER ! 19609: EJC ! 19610: * ! 19611: * PRTNM (CONTINUED) ! 19612: * ! 19613: * NOW WE PRINT AN IDENTIFYING NAME FOR THE OBJECT IF ONE ! 19614: * CAN BE FOUND. THE FOLLOWING CODE SEARCHES FOR A NATURAL ! 19615: * VARIABLE WHICH CONTAINS THIS OBJECT AS VALUE. IF SUCH A ! 19616: * VARIABLE IS FOUND, ITS NAME IS PRINTED, ELSE THE VALUE ! 19617: * OF THE OBJECT (AS PRINTED BY PRTVL) IS USED INSTEAD. ! 19618: * ! 19619: * FIRST WE POINT TO THE PARENT TBBLK IF THIS IS THE CASE OF ! 19620: * A TABLE ELEMENT. TO DO THIS, CHASE DOWN THE TRNXT CHAIN. ! 19621: * ! 19622: PRN03 BNE (XL),=B$TET,PRN04 JUMP IF WE GOT THERE (OR NOT TE) ! 19623: MOV TENXT(XL),XL ELSE MOVE OUT ON CHAIN ! 19624: BRN PRN03 AND LOOP BACK ! 19625: * ! 19626: * NOW WE ARE READY FOR THE SEARCH. TO SPEED THINGS UP IN ! 19627: * THE CASE OF CALLS FROM DUMP WHERE THE SAME NAME BASE ! 19628: * WILL OCCUR REPEATEDLY WHILE DUMPING AN ARRAY OR TABLE, ! 19629: * WE REMEMBER THE LAST VRBLK POINTER FOUND IN PRNMV. SO ! 19630: * FIRST CHECK TO SEE IF WE HAVE THIS ONE AGAIN. ! 19631: * ! 19632: PRN04 MOV PRNMV,XR POINT TO VRBLK WE FOUND LAST TIME ! 19633: MOV HSHTB,WA POINT TO HASH TABLE IN CASE NOT ! 19634: BRN PRN07 JUMP INTO SEARCH FOR SPECIAL CHECK ! 19635: * ! 19636: * LOOP THROUGH HASH SLOTS ! 19637: * ! 19638: PRN05 MOV WA,XR COPY SLOT POINTER ! 19639: ICA WA BUMP SLOT POINTER ! 19640: SUB *VRNXT,XR INTRODUCE STANDARD VRBLK OFFSET ! 19641: * ! 19642: * LOOP THROUGH VRBLKS ON ONE HASH CHAIN ! 19643: * ! 19644: PRN06 MOV VRNXT(XR),XR POINT TO NEXT VRBLK ON HASH CHAIN ! 19645: * ! 19646: * MERGE HERE FIRST TIME TO CHECK BLOCK WE FOUND LAST TIME ! 19647: * ! 19648: PRN07 MOV XR,WC COPY VRBLK POINTER ! 19649: BZE WC,PRN09 JUMP IF CHAIN END (OR PRNMV ZERO) ! 19650: EJC ! 19651: * ! 19652: * PRTNM (CONTINUED) ! 19653: * ! 19654: * LOOP TO FIND VALUE (CHASE DOWN POSSIBLE TRBLK CHAIN) ! 19655: * ! 19656: PRN08 MOV VRVAL(XR),XR LOAD VALUE ! 19657: BEQ (XR),=B$TRT,PRN08 LOOP IF THAT WAS A TRBLK ! 19658: * ! 19659: * NOW WE HAVE THE VALUE, IS THIS THE BLOCK WE WANT ! 19660: * ! 19661: BEQ XR,XL,PRN10 JUMP IF THIS MATCHES THE NAME BASE ! 19662: MOV WC,XR ELSE POINT BACK TO THAT VRBLK ! 19663: BRN PRN06 AND LOOP BACK ! 19664: * ! 19665: * HERE TO MOVE TO NEXT HASH SLOT ! 19666: * ! 19667: PRN09 BLT WA,HSHTE,PRN05 LOOP BACK IF MORE TO GO ! 19668: MOV XL,XR ELSE NOT FOUND, COPY VALUE POINTER ! 19669: JSR PRTVL PRINT VALUE ! 19670: BRN PRN11 AND MERGE AHEAD ! 19671: * ! 19672: * HERE WHEN WE FIND A MATCHING ENTRY ! 19673: * ! 19674: PRN10 MOV WC,XR COPY VRBLK POINTER ! 19675: MOV XR,PRNMV SAVE FOR NEXT TIME IN ! 19676: JSR PRTVN PRINT VARIABLE NAME ! 19677: * ! 19678: * MERGE HERE IF NO ENTRY FOUND ! 19679: * ! 19680: PRN11 MOV (XL),WC LOAD FIRST WORD OF NAME BASE ! 19681: BNE WC,=B$PDT,PRN13 JUMP IF NOT PROGRAM DEFINED ! 19682: * ! 19683: * FOR PROGRAM DEFINED DATATYPE, ADD RIGHT PAREN AND EXIT ! 19684: * ! 19685: MOV =CH$RP,WA LOAD RIGHT PAREN, MERGE ! 19686: * ! 19687: * MERGE HERE TO PRINT FINAL RIGHT PAREN OR BRACKET ! 19688: * ! 19689: PRN12 JSR PRTCH PRINT FINAL CHARACTER ! 19690: MOV WB,WA RESTORE NAME OFFSET ! 19691: BRN PRN01 MERGE BACK TO EXIT ! 19692: EJC ! 19693: * ! 19694: * PRTNM (CONTINUED) ! 19695: * ! 19696: * HERE FOR ARRAY OR TABLE ! 19697: * ! 19698: PRN13 MOV =CH$BB,WA LOAD LEFT BRACKET ! 19699: JSR PRTCH AND PRINT IT ! 19700: MOV (XS),XL RESTORE BLOCK POINTER ! 19701: MOV (XL),WC LOAD TYPE WORD AGAIN ! 19702: BNE WC,=B$TET,PRN15 JUMP IF NOT TABLE ! 19703: * ! 19704: * HERE FOR TABLE, PRINT SUBSCRIPT VALUE ! 19705: * ! 19706: MOV TESUB(XL),XR LOAD SUBSCRIPT VALUE ! 19707: MOV WB,XL SAVE NAME OFFSET ! 19708: JSR PRTVL PRINT SUBSCRIPT VALUE ! 19709: MOV XL,WB RESTORE NAME OFFSET ! 19710: * ! 19711: * MERGE HERE FROM ARRAY CASE TO PRINT RIGHT BRACKET ! 19712: * ! 19713: PRN14 MOV =CH$RB,WA LOAD RIGHT BRACKET ! 19714: BRN PRN12 MERGE BACK TO PRINT IT ! 19715: * ! 19716: * HERE FOR ARRAY OR VECTOR, TO PRINT SUBSCRIPT(S) ! 19717: * ! 19718: PRN15 MOV WB,WA COPY NAME OFFSET ! 19719: BTW WA CONVERT TO WORDS ! 19720: BEQ WC,=B$ART,PRN16 JUMP IF ARBLK ! 19721: * ! 19722: * HERE FOR VECTOR ! 19723: * ! 19724: SUB =VCVLB,WA ADJUST FOR STANDARD FIELDS ! 19725: MTI WA MOVE TO INTEGER ACCUM ! 19726: JSR PRTIN PRINT LINEAR SUBSCRIPT ! 19727: BRN PRN14 MERGE BACK FOR RIGHT BRACKET ! 19728: EJC ! 19729: * ! 19730: * PRTNM (CONTINUED) ! 19731: * ! 19732: * HERE FOR ARRAY. FIRST CALCULATE ABSOLUTE SUBSCRIPT ! 19733: * OFFSETS BY SUCCESSIVE DIVISIONS BY THE DIMENSION VALUES. ! 19734: * THIS MUST BE DONE RIGHT TO LEFT SINCE THE ELEMENTS ARE ! 19735: * STORED ROW-WISE. THE SUBSCRIPTS ARE STACKED AS INTEGERS. ! 19736: * ! 19737: PRN16 MOV AROFS(XL),WC LOAD LENGTH OF BOUNDS INFO ! 19738: ICA WC ADJUST FOR ARPRO FIELD ! 19739: BTW WC CONVERT TO WORDS ! 19740: SUB WC,WA GET LINEAR ZERO-ORIGIN SUBSCRIPT ! 19741: MTI WA GET INTEGER VALUE ! 19742: LCT WA,ARNDM(XL) SET NUM OF DIMENSIONS AS LOOP COUNT ! 19743: ADD AROFS(XL),XL POINT PAST BOUNDS INFORMATION ! 19744: SUB *ARLBD,XL SET OK OFFSET FOR PROPER PTR LATER ! 19745: * ! 19746: * LOOP TO STACK SUBSCRIPT OFFSETS ! 19747: * ! 19748: PRN17 SUB *ARDMS,XL POINT TO NEXT SET OF BOUNDS ! 19749: STI PRNSI SAVE CURRENT OFFSET ! 19750: RMI ARDIM(XL) GET REMAINDER ON DIVIDING BY DIMENS ! 19751: MFI -(XS) STORE ON STACK (ONE WORD) ! 19752: LDI PRNSI RELOAD ARGUMENT ! 19753: DVI ARDIM(XL) DIVIDE TO GET QUOTIENT ! 19754: BCT WA,PRN17 LOOP TILL ALL STACKED ! 19755: ZER XR SET OFFSET TO FIRST SET OF BOUNDS ! 19756: LCT WB,ARNDM(XL) LOAD COUNT OF DIMS TO CONTROL LOOP ! 19757: BRN PRN19 JUMP INTO PRINT LOOP ! 19758: * ! 19759: * LOOP TO PRINT SUBSCRIPTS FROM STACK ADJUSTING BY ADDING ! 19760: * THE APPROPRIATE LOW BOUND VALUE FROM THE ARBLK ! 19761: * ! 19762: PRN18 MOV =CH$CM,WA LOAD A COMMA ! 19763: JSR PRTCH PRINT IT ! 19764: * ! 19765: * MERGE HERE FIRST TIME IN (NO COMMA REQUIRED) ! 19766: * ! 19767: PRN19 MTI (XS)+ LOAD SUBSCRIPT OFFSET AS INTEGER ! 19768: ADD XR,XL POINT TO CURRENT LBD ! 19769: ADI ARLBD(XL) ADD LBD TO GET SIGNED SUBSCRIPT ! 19770: SUB XR,XL POINT BACK TO START OF ARBLK ! 19771: JSR PRTIN PRINT SUBSCRIPT ! 19772: ADD *ARDMS,XR BUMP OFFSET TO NEXT BOUNDS ! 19773: BCT WB,PRN18 LOOP BACK TILL ALL PRINTED ! 19774: BRN PRN14 MERGE BACK TO PRINT RIGHT BRACKET ! 19775: ENP END PROCEDURE PRTNM ! 19776: EJC ! 19777: * ! 19778: * PRTNV -- PRINT NAME VALUE ! 19779: * ! 19780: * PRTNV IS USED BY THE TRACE AND DUMP ROUTINES TO PRINT ! 19781: * A LINE OF THE FORM ! 19782: * ! 19783: * NAME = VALUE ! 19784: * ! 19785: * NOTE THAT THE NAME INVOLVED CAN NEVER BE A PSEUDO-VAR ! 19786: * ! 19787: * (XL) NAME BASE ! 19788: * (WA) NAME OFFSET ! 19789: * JSR PRTNV CALL TO PRINT NAME = VALUE ! 19790: * (WB,WC,RA) DESTROYED ! 19791: * ! 19792: PRTNV PRC E,0 ENTRY POINT ! 19793: JSR PRTNM PRINT ARGUMENT NAME ! 19794: MOV XR,-(XS) SAVE ENTRY XR ! 19795: MOV WA,-(XS) SAVE NAME OFFSET (COLLECTABLE) ! 19796: MOV =TMBEB,XR POINT TO BLANK EQUAL BLANK ! 19797: JSR PRTST PRINT IT ! 19798: MOV XL,XR COPY NAME BASE ! 19799: ADD WA,XR POINT TO VALUE ! 19800: MOV (XR),XR LOAD VALUE POINTER ! 19801: JSR PRTVL PRINT VALUE ! 19802: JSR PRTNL TERMINATE LINE ! 19803: MOV (XS)+,WA RESTORE NAME OFFSET ! 19804: MOV (XS)+,XR RESTORE ENTRY XR ! 19805: EXI RETURN TO CALLER ! 19806: ENP END PROCEDURE PRTNV ! 19807: EJC ! 19808: * ! 19809: * PRTPG -- PRINT A PAGE THROW ! 19810: * ! 19811: * PRINTS A PAGE THROW OR A FEW BLANK LINES ON THE STANDARD ! 19812: * LISTING CHANNEL DEPENDING ON THE LISTING OPTIONS CHOSEN. ! 19813: * ! 19814: * JSR PRTPG CALL FOR PAGE EJECT ! 19815: * ! 19816: PRTPG PRC E,0 ENTRY POINT ! 19817: BEQ STAGE,=STGXT,PRP01 JUMP IF EXECUTION TIME ! 19818: BZE LSTLC,PRP06 RETURN IF TOP OF PAGE ALREADY ! 19819: ZER LSTLC CLEAR LINE COUNT ! 19820: * ! 19821: * CHECK TYPE OF LISTING ! 19822: * ! 19823: PRP01 MOV XR,-(XS) PRESERVE XR ! 19824: BNZ PRSTD,PRP02 EJECT IF FLAG SET ! 19825: BNZ PRICH,PRP03 JUMP IF INTERACTIVE LISTING CHANNEL ! 19826: BZE PRECL,PRP03 JUMP IF COMPACT LISTING ! 19827: * ! 19828: * PERFORM AN EJECT ! 19829: * ! 19830: PRP02 JSR SYSEP EJECT ! 19831: BRN PRP04 MERGE ! 19832: * ! 19833: * COMPACT OR INTERACTIVE CHANNEL LISTING. CANT PRINT ! 19834: * BLANKS UNTIL CHECK MADE FOR HEADERS PRINTED AND FLAG SET. ! 19835: * ! 19836: * ! 19837: PRP03 MOV HEADP,XR REMEMBER HEADP ! 19838: MNZ HEADP SET TO AVOID REPEATED PRTPG CALLS ! 19839: JSR PRTNL PRINT BLANK LINE ! 19840: JSR PRTNL PRINT BLANK LINE ! 19841: JSR PRTNL PRINT BLANK LINE ! 19842: MOV =NUM03,LSTLC COUNT BLANK LINES ! 19843: MOV XR,HEADP RESTORE HEADER FLAG ! 19844: EJC ! 19845: * ! 19846: * PRPTG (CONTINUED) ! 19847: * ! 19848: * PRINT THE HEADING ! 19849: * ! 19850: PRP04 BNZ HEADP,PRP05 JUMP IF HEADER LISTED ! 19851: MNZ HEADP MARK HEADERS PRINTED ! 19852: MOV XL,-(XS) KEEP XL ! 19853: MOV =HEADR,XR POINT TO LISTING HEADER ! 19854: JSR PRTST PLACE IT ! 19855: JSR SYSID GET SYSTEM IDENTIFICATION ! 19856: JSR PRTST APPEND EXTRA CHARS ! 19857: JSR PRTNL PRINT IT ! 19858: MOV XL,XR EXTRA HEADER LINE ! 19859: JSR PRTST PLACE IT ! 19860: JSR PRTNL PRINT IT ! 19861: JSR PRTNL PRINT A BLANK ! 19862: JSR PRTNL AND ANOTHER ! 19863: ADD =NUM04,LSTLC FOUR HEADER LINES PRINTED ! 19864: MOV (XS)+,XL RESTORE XL ! 19865: * ! 19866: * MERGE IF HEADER NOT PRINTED ! 19867: * ! 19868: PRP05 MOV (XS)+,XR RESTORE XR ! 19869: * ! 19870: * RETURN ! 19871: * ! 19872: PRP06 EXI RETURN ! 19873: ENP END PROCEDURE PRTPG ! 19874: EJC ! 19875: * ! 19876: * PRTPS - PRINT PAGE WITH TEST FOR STANDARD LISTING OPTION ! 19877: * ! 19878: * IF THE STANDARD LISTING OPTION IS SELECTED, INSIST THAT ! 19879: * AN EJECT BE DONE ! 19880: * ! 19881: * JSR PRTPS CALL FOR EJECT ! 19882: * ! 19883: PRTPS PRC E,0 ENTRY POINT ! 19884: MOV PRSTO,PRSTD COPY OPTION FLAG ! 19885: JSR PRTPG PRINT PAGE ! 19886: ZER PRSTD CLEAR FLAG ! 19887: EXI RETURN ! 19888: ENP END PROCEDURE PRTPS ! 19889: EJC ! 19890: * ! 19891: * PRTSN -- PRINT STATEMENT NUMBER ! 19892: * ! 19893: * PRTSN IS USED TO INITIATE A PRINT TRACE LINE BY PRINTING ! 19894: * ASTERISKS AND THE CURRENT STATEMENT NUMBER. THE ACTUAL ! 19895: * FORMAT OF THE OUTPUT GENERATED IS. ! 19896: * ! 19897: * ***NNNNN**** III.....IIII ! 19898: * ! 19899: * NNNNN IS THE STATEMENT NUMBER WITH LEADING ZEROS REPLACED ! 19900: * BY ASTERISKS (E.G. *******9****) ! 19901: * ! 19902: * III...III REPRESENTS A VARIABLE LENGTH OUTPUT CONSISTING ! 19903: * OF A NUMBER OF LETTER I CHARACTERS EQUAL TO FNCLEVEL. ! 19904: * ! 19905: * JSR PRTSN CALL TO PRINT STATEMENT NUMBER ! 19906: * (WC) DESTROYED ! 19907: * ! 19908: PRTSN PRC E,0 ENTRY POINT ! 19909: MOV XR,-(XS) SAVE ENTRY XR ! 19910: MOV WA,PRSNA SAVE ENTRY WA ! 19911: MOV =TMASB,XR POINT TO ASTERISKS ! 19912: JSR PRTST PRINT ASTERISKS ! 19913: MOV =NUM04,PROFS POINT INTO MIDDLE OF ASTERISKS ! 19914: MTI KVSTN LOAD STATEMENT NUMBER AS INTEGER ! 19915: JSR PRTIN PRINT INTEGER STATEMENT NUMBER ! 19916: MOV =PRSNF,PROFS POINT PAST ASTERISKS PLUS BLANK ! 19917: MOV KVFNC,XR GET FNCLEVEL ! 19918: MOV =CH$LI,WA SET LETTER I ! 19919: * ! 19920: * LOOP TO GENERATE LETTER I FNCLEVEL TIMES ! 19921: * ! 19922: PRSN1 BZE XR,PRSN2 JUMP IF ALL SET ! 19923: JSR PRTCH ELSE PRINT AN I ! 19924: DCV XR DECREMENT COUNTER ! 19925: BRN PRSN1 LOOP BACK ! 19926: * ! 19927: * MERRE WITH ALL LETTER I CHARACTERS GENERATED ! 19928: * ! 19929: PRSN2 MOV =CH$BL,WA GET BLANK ! 19930: JSR PRTCH PRINT BLANK ! 19931: MOV PRSNA,WA RESTORE ENTRY WA ! 19932: MOV (XS)+,XR RESTORE ENTRY XR ! 19933: EXI RETURN TO PRTSN CALLER ! 19934: ENP END PROCEDURE PRTSN ! 19935: EJC ! 19936: * ! 19937: * PRTST -- PRINT STRING ! 19938: * ! 19939: * PRTST PLACES A STRING OF CHARACTERS IN THE PRINT BUFFER ! 19940: * ! 19941: * SEE PRTNL FOR GLOBAL LOCATIONS USED ! 19942: * ! 19943: * NOTE THAT THE FIRST WORD OF THE BLOCK (NORMALLY B$SCL) ! 19944: * IS NOT USED AND NEED NOT BE SET CORRECTLY (SEE PRTVN) ! 19945: * ! 19946: * (XR) STRING TO BE PRINTED ! 19947: * JSR PRTST CALL TO PRINT STRING ! 19948: * (PROFS) UPDATED PAST CHARS PLACED ! 19949: * ! 19950: PRTST PRC R,0 ENTRY POINT ! 19951: BNZ HEADP,PRST0 WERE HEADERS PRINTED ! 19952: JSR PRTPS NO - PRINT THEM ! 19953: * ! 19954: * CALL SYSPR ! 19955: * ! 19956: PRST0 MOV WA,PRSVA SAVE WA ! 19957: MOV WB,PRSVB SAVE WB ! 19958: ZER WB SET CHARS PRINTED COUNT TO ZERO ! 19959: * ! 19960: * LOOP TO PRINT SUCCESSIVE LINES FOR LONG STRING ! 19961: * ! 19962: PRST1 MOV SCLEN(XR),WA LOAD STRING LENGTH ! 19963: SUB WB,WA SUBTRACT COUNT OF CHARS ALREADY OUT ! 19964: BZE WA,PRST4 JUMP TO EXIT IF NONE LEFT ! 19965: MOV XL,-(XS) ELSE STACK ENTRY XL ! 19966: MOV XR,-(XS) SAVE ARGUMENT ! 19967: MOV XR,XL COPY FOR EVENTUAL MOVE ! 19968: MOV PRLEN,XR LOAD PRINT BUFFER LENGTH ! 19969: SUB PROFS,XR GET CHARS LEFT IN PRINT BUFFER ! 19970: BNZ XR,PRST2 SKIP IF ROOM LEFT ON THIS LINE ! 19971: JSR PRTNL ELSE PRINT THIS LINE ! 19972: MOV PRLEN,XR AND SET FULL WIDTH AVAILABLE ! 19973: EJC ! 19974: * ! 19975: * PRTST (CONTINUED) ! 19976: * ! 19977: * HERE WITH CHARS TO PRINT AND SOME ROOM IN BUFFER ! 19978: * ! 19979: PRST2 BLO WA,XR,PRST3 JUMP IF ROOM FOR REST OF STRING ! 19980: MOV XR,WA ELSE SET TO FILL LINE ! 19981: * ! 19982: * MERGE HERE WITH CHARACTER COUNT IN WA ! 19983: * ! 19984: PRST3 MOV PRBUF,XR POINT TO PRINT BUFFER ! 19985: PLC XL,WB POINT TO LOCATION IN STRING ! 19986: PSC XR,PROFS POINT TO LOCATION IN BUFFER ! 19987: ADD WA,WB BUMP STRING CHARS COUNT ! 19988: ADD WA,PROFS BUMP BUFFER POINTER ! 19989: MOV WB,PRSVC PRESERVE CHAR COUNTER ! 19990: MVC MOVE CHARACTERS TO BUFFER ! 19991: MOV PRSVC,WB RECOVER CHAR COUNTER ! 19992: MOV (XS)+,XR RESTORE ARGUMENT POINTER ! 19993: MOV (XS)+,XL RESTORE ENTRY XL ! 19994: BRN PRST1 LOOP BACK TO TEST FOR MORE ! 19995: * ! 19996: * HERE TO EXIT AFTER PRINTING STRING ! 19997: * ! 19998: PRST4 MOV PRSVB,WB RESTORE ENTRY WB ! 19999: MOV PRSVA,WA RESTORE ENTRY WA ! 20000: EXI RETURN TO PRTST CALLER ! 20001: ENP END PROCEDURE PRTST ! 20002: EJC ! 20003: * ! 20004: * PRTTR -- PRINT TO TERMINAL ! 20005: * ! 20006: * CALLED TO PRINT CONTENTS OF STANDARD PRINT BUFFER TO ! 20007: * ONLINE TERMINAL. CLEARS BUFFER DOWN AND RESETS PROFS. ! 20008: * ! 20009: * JSR PRTTR CALL FOR PRINT ! 20010: * (WA,WB) DESTROYED ! 20011: * ! 20012: PRTTR PRC E,0 ENTRY POINT ! 20013: MOV XR,-(XS) SAVE XR ! 20014: JSR PRTIC PRINT BUFFER CONTENTS ! 20015: MOV PRBUF,XR POINT TO PRINT BFR TO CLEAR IT ! 20016: LCT WA,PRLNW GET BUFFER LENGTH ! 20017: ADD *SCHAR,XR POINT PAST SCBLK HEADER ! 20018: MOV NULLW,WB GET BLANKS ! 20019: * ! 20020: * LOOP TO CLEAR BUFFER ! 20021: * ! 20022: PRTT1 MOV WB,(XR)+ CLEAR A WORD ! 20023: BCT WA,PRTT1 LOOP ! 20024: ZER PROFS RESET PROFS ! 20025: MOV (XS)+,XR RESTORE XR ! 20026: EXI RETURN ! 20027: ENP END PROCEDURE PRTTR ! 20028: EJC ! 20029: * ! 20030: * PRTVL -- PRINT A VALUE ! 20031: * ! 20032: * PRTVL PLACES AN APPROPRIATE CHARACTER REPRESENTATION OF ! 20033: * A DATA VALUE IN THE PRINT BUFFER FOR DUMP/TRACE USE. ! 20034: * ! 20035: * (XR) VALUE TO BE PRINTED ! 20036: * JSR PRTVL CALL TO PRINT VALUE ! 20037: * (WA,WB,WC,RA) DESTROYED ! 20038: * ! 20039: PRTVL PRC R,0 ENTRY POINT, RECURSIVE ! 20040: MOV XL,-(XS) SAVE ENTRY XL ! 20041: MOV XR,-(XS) SAVE ARGUMENT ! 20042: CHK CHECK FOR STACK OVERFLOW ! 20043: * ! 20044: * LOOP BACK HERE AFTER FINDING A TRAP BLOCK (TRBLK) ! 20045: * ! 20046: PRV01 MOV IDVAL(XR),PRVSI COPY IDVAL (IF ANY) ! 20047: MOV (XR),XL LOAD FIRST WORD OF BLOCK ! 20048: LEI XL LOAD ENTRY POINT ID ! 20049: BSW XL,BL$$T,PRV02 SWITCH ON BLOCK TYPE ! 20050: IFF BL$TR,PRV04 TRBLK ! 20051: IFF BL$AR,PRV05 ARBLK ! 20052: IFF BL$IC,PRV08 ICBLK ! 20053: IFF BL$NM,PRV09 NMBLK ! 20054: IFF BL$PD,PRV10 PDBLK ! 20055: IFF BL$RC,PRV08 RCBLK ! 20056: IFF BL$SC,PRV11 SCBLK ! 20057: IFF BL$SE,PRV12 SEBLK ! 20058: IFF BL$TB,PRV13 TBBLK ! 20059: IFF BL$VC,PRV13 VCBLK ! 20060: IFF BL$BC,PRV15 BCBLK ! 20061: ESW END OF SWITCH ON BLOCK TYPE ! 20062: * ! 20063: * HERE FOR BLOCKS FOR WHICH WE JUST PRINT DATATYPE NAME ! 20064: * ! 20065: PRV02 JSR DTYPE GET DATATYPE NAME ! 20066: JSR PRTST PRINT DATATYPE NAME ! 20067: * ! 20068: * COMMON EXIT POINT ! 20069: * ! 20070: PRV03 MOV (XS)+,XR RELOAD ARGUMENT ! 20071: MOV (XS)+,XL RESTORE XL ! 20072: EXI RETURN TO PRTVL CALLER ! 20073: * ! 20074: * HERE FOR TRBLK ! 20075: * ! 20076: PRV04 MOV TRVAL(XR),XR LOAD REAL VALUE ! 20077: BRN PRV01 AND LOOP BACK ! 20078: EJC ! 20079: * ! 20080: * PRTVL (CONTINUED) ! 20081: * ! 20082: * HERE FOR ARRAY (ARBLK) ! 20083: * ! 20084: * PRINT ARRAY ( PROTOTYPE ) BLANK NUMBER IDVAL ! 20085: * ! 20086: PRV05 MOV XR,XL PRESERVE ARGUMENT ! 20087: MOV =SCARR,XR POINT TO DATATYPE NAME (ARRAY) ! 20088: JSR PRTST PRINT IT ! 20089: MOV =CH$PP,WA LOAD LEFT PAREN ! 20090: JSR PRTCH PRINT LEFT PAREN ! 20091: ADD AROFS(XL),XL POINT TO PROTOTYPE ! 20092: MOV (XL),XR LOAD PROTOTYPE ! 20093: JSR PRTST PRINT PROTOTYPE ! 20094: * ! 20095: * VCBLK, TBBLK, BCBLK MERGE HERE FOR ) BLANK NUMBER IDVAL ! 20096: * ! 20097: PRV06 MOV =CH$RP,WA LOAD RIGHT PAREN ! 20098: JSR PRTCH PRINT RIGHT PAREN ! 20099: * ! 20100: * PDBLK MERGES HERE TO PRINT BLANK NUMBER IDVAL ! 20101: * ! 20102: PRV07 MOV =CH$BL,WA LOAD BLANK ! 20103: JSR PRTCH PRINT IT ! 20104: MOV =CH$NM,WA LOAD NUMBER SIGN ! 20105: JSR PRTCH PRINT IT ! 20106: MTI PRVSI GET IDVAL ! 20107: JSR PRTIN PRINT ID NUMBER ! 20108: BRN PRV03 BACK TO EXIT ! 20109: * ! 20110: * HERE FOR INTEGER (ICBLK), REAL (RCBLK) ! 20111: * ! 20112: * PRINT CHARACTER REPRESENTATION OF VALUE ! 20113: * ! 20114: PRV08 MOV XR,-(XS) STACK ARGUMENT FOR GTSTG ! 20115: JSR GTSTG CONVERT TO STRING ! 20116: PPM ERROR RETURN IS IMPOSSIBLE ! 20117: JSR PRTST PRINT THE STRING ! 20118: MOV XR,DNAMP DELETE GARBAGE STRING FROM STORAGE ! 20119: BRN PRV03 BACK TO EXIT ! 20120: EJC ! 20121: * ! 20122: * PRTVL (CONTINUED) ! 20123: * ! 20124: * NAME (NMBLK) ! 20125: * ! 20126: * FOR PSEUDO-VARIABLE, JUST PRINT DATATYPE NAME (NAME) ! 20127: * FOR ALL OTHER NAMES, PRINT DOT FOLLOWED BY NAME REP ! 20128: * ! 20129: PRV09 MOV NMBAS(XR),XL LOAD NAME BASE ! 20130: MOV (XL),WA LOAD FIRST WORD OF BLOCK ! 20131: BEQ WA,=B$KVT,PRV02 JUST PRINT NAME IF KEYWORD ! 20132: BEQ WA,=B$EVT,PRV02 JUST PRINT NAME IF EXPRESSION VAR ! 20133: MOV =CH$DT,WA ELSE GET DOT ! 20134: JSR PRTCH AND PRINT IT ! 20135: MOV NMOFS(XR),WA LOAD NAME OFFSET ! 20136: JSR PRTNM PRINT NAME ! 20137: BRN PRV03 BACK TO EXIT ! 20138: * ! 20139: * PROGRAM DATATYPE (PDBLK) ! 20140: * ! 20141: * PRINT DATATYPE NAME CH$BL CH$NM IDVAL ! 20142: * ! 20143: PRV10 JSR DTYPE GET DATATYPE NAME ! 20144: JSR PRTST PRINT DATATYPE NAME ! 20145: BRN PRV07 MERGE BACK TO PRINT ID ! 20146: * ! 20147: * HERE FOR STRING (SCBLK) ! 20148: * ! 20149: * PRINT QUOTE STRING-CHARACTERS QUOTE ! 20150: * ! 20151: PRV11 MOV =CH$SQ,WA LOAD SINGLE QUOTE ! 20152: JSR PRTCH PRINT QUOTE ! 20153: JSR PRTST PRINT STRING VALUE ! 20154: JSR PRTCH PRINT ANOTHER QUOTE ! 20155: BRN PRV03 BACK TO EXIT ! 20156: EJC ! 20157: * ! 20158: * PRTVL (CONTINUED) ! 20159: * ! 20160: * HERE FOR SIMPLE EXPRESSION (SEBLK) ! 20161: * ! 20162: * PRINT ASTERISK VARIABLE-NAME ! 20163: * ! 20164: PRV12 MOV =CH$AS,WA LOAD ASTERISK ! 20165: JSR PRTCH PRINT ASTERISK ! 20166: MOV SEVAR(XR),XR LOAD VARIABLE POINTER ! 20167: JSR PRTVN PRINT VARIABLE NAME ! 20168: BRN PRV03 JUMP BACK TO EXIT ! 20169: * ! 20170: * HERE FOR TABLE (TBBLK) AND ARRAY (VCBLK) ! 20171: * ! 20172: * PRINT DATATYPE ( PROTOTYPE ) BLANK NUMBER IDVAL ! 20173: * ! 20174: PRV13 MOV XR,XL PRESERVE ARGUMENT ! 20175: JSR DTYPE GET DATATYPE NAME ! 20176: JSR PRTST PRINT DATATYPE NAME ! 20177: MOV =CH$PP,WA LOAD LEFT PAREN ! 20178: JSR PRTCH PRINT LEFT PAREN ! 20179: MOV TBLEN(XL),WA LOAD LENGTH OF BLOCK (=VCLEN) ! 20180: BTW WA CONVERT TO WORD COUNT ! 20181: SUB =TBSI$,WA ALLOW FOR STANDARD FIELDS ! 20182: BEQ (XL),=B$TBT,PRV14 JUMP IF TABLE ! 20183: ADD =VCTBD,WA FOR VCBLK, ADJUST SIZE ! 20184: * ! 20185: * PRINT PROTOTYPE ! 20186: * ! 20187: PRV14 MTI WA MOVE AS INTEGER ! 20188: JSR PRTIN PRINT INTEGER PROTOTYPE ! 20189: BRN PRV06 MERGE BACK FOR REST ! 20190: EJC ! 20191: * ! 20192: * PRTVL (CONTINUED) ! 20193: * ! 20194: * HERE FOR BUFFER (BCBLK) ! 20195: * ! 20196: PRV15 MOV XR,XL PRESERVE ARGUMENT ! 20197: MOV =SCBUF,XR POINT TO DATATYPE NAME (BUFFER) ! 20198: JSR PRTST PRINT IT ! 20199: MOV =CH$PP,WA LOAD LEFT PAREN ! 20200: JSR PRTCH PRINT LEFT PAREN ! 20201: MOV BCBUF(XL),XR POINT TO BFBLK ! 20202: MTI BFALC(XR) LOAD ALLOCATION SIZE ! 20203: JSR PRTIN PRINT IT ! 20204: MOV =CH$CM,WA LOAD COMMA ! 20205: JSR PRTCH PRINT IT ! 20206: MTI BCLEN(XL) LOAD DEFINED LENGTH ! 20207: JSR PRTIN PRINT IT ! 20208: BRN PRV06 MERGE TO FINISH UP ! 20209: ENP END PROCEDURE PRTVL ! 20210: EJC ! 20211: * ! 20212: * PRTVN -- PRINT NATURAL VARIABLE NAME ! 20213: * ! 20214: * PRTVN PRINTS THE NAME OF A NATURAL VARIABLE ! 20215: * ! 20216: * (XR) POINTER TO VRBLK ! 20217: * JSR PRTVN CALL TO PRINT VARIABLE NAME ! 20218: * ! 20219: PRTVN PRC E,0 ENTRY POINT ! 20220: MOV XR,-(XS) STACK VRBLK POINTER ! 20221: ADD *VRSOF,XR POINT TO POSSIBLE STRING NAME ! 20222: BNZ SCLEN(XR),PRVN1 JUMP IF NOT SYSTEM VARIABLE ! 20223: MOV VRSVO(XR),XR POINT TO SVBLK WITH NAME ! 20224: * ! 20225: * MERGE HERE WITH DUMMY SCBLK POINTER IN XR ! 20226: * ! 20227: PRVN1 JSR PRTST PRINT STRING NAME OF VARIABLE ! 20228: MOV (XS)+,XR RESTORE VRBLK POINTER ! 20229: EXI RETURN TO PRTVN CALLER ! 20230: ENP END PROCEDURE PRTVN ! 20231: EJC ! 20232: * ! 20233: * RCBLD -- BUILD A REAL BLOCK ! 20234: * ! 20235: * (RA) REAL VALUE FOR RCBLK ! 20236: * JSR RCBLD CALL TO BUILD REAL BLOCK ! 20237: * (XR) POINTER TO RESULT RCBLK ! 20238: * (WA) DESTROYED ! 20239: * ! 20240: RCBLD PRC E,0 ENTRY POINT ! 20241: MOV DNAMP,XR LOAD POINTER TO NEXT AVAILABLE LOC ! 20242: ADD *RCSI$,XR POINT PAST NEW RCBLK ! 20243: BLO XR,DNAME,RCBL1 JUMP IF THERE IS ROOM ! 20244: MOV *RCSI$,WA ELSE LOAD RCBLK LENGTH ! 20245: JSR ALLOC USE STANDARD ALLOCATOR TO GET BLOCK ! 20246: ADD WA,XR POINT PAST BLOCK TO MERGE ! 20247: * ! 20248: * MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED ! 20249: * ! 20250: RCBL1 MOV XR,DNAMP SET NEW POINTER ! 20251: SUB *RCSI$,XR POINT BACK TO START OF BLOCK ! 20252: MOV =B$RCL,(XR) STORE TYPE WORD ! 20253: STR RCVAL(XR) STORE REAL VALUE IN RCBLK ! 20254: EXI RETURN TO RCBLD CALLER ! 20255: ENP END PROCEDURE RCBLD ! 20256: EJC ! 20257: * ! 20258: * READR -- READ NEXT SOURCE IMAGE AT COMPILE TIME ! 20259: * ! 20260: * READR IS USED TO READ THE NEXT SOURCE IMAGE. TO PROCESS ! 20261: * CONTINUATION CARDS PROPERLY, THE COMPILER MUST READ ONE ! 20262: * LINE AHEAD. THUS READR DOES NOT DESTROY THE CURRENT IMAGE ! 20263: * SEE ALSO THE NEXTS ROUTINE WHICH ACTUALLY GETS THE IMAGE. ! 20264: * ! 20265: * JSR READR CALL TO READ NEXT IMAGE ! 20266: * (XR) PTR TO NEXT IMAGE (0 IF NONE) ! 20267: * (R$CNI) COPY OF POINTER ! 20268: * (WA,WB,WC,XL) DESTROYED ! 20269: * ! 20270: READR PRC E,0 ENTRY POINT ! 20271: MOV R$CNI,XR GET PTR TO NEXT IMAGE ! 20272: BNZ XR,READ3 EXIT IF ALREADY READ ! 20273: BNE STAGE,=STGIC,READ3 EXIT IF NOT INITIAL COMPILE ! 20274: MOV CSWIN,WA MAX READ LENGTH ! 20275: JSR ALOCS ALLOCATE BUFFER ! 20276: JSR SYSRD READ INPUT IMAGE ! 20277: PPM READ4 JUMP IF END OF FILE ! 20278: MNZ WB SET TRIMR TO PERFORM TRIM ! 20279: BLE SCLEN(XR),CSWIN,READ1 USE SMALLER OF STRING LNTH .. ! 20280: MOV CSWIN,SCLEN(XR) ... AND XXX OF -INXXX ! 20281: * ! 20282: * PERFORM THE TRIM ! 20283: * ! 20284: READ1 JSR TRIMR TRIM TRAILING BLANKS ! 20285: * ! 20286: * MERGE HERE AFTER READ ! 20287: * ! 20288: READ2 MOV XR,R$CNI STORE COPY OF POINTER ! 20289: * ! 20290: * MERGE HERE IF NO READ ATTEMPTED ! 20291: * ! 20292: READ3 EXI RETURN TO READR CALLER ! 20293: * ! 20294: * HERE ON END OF FILE ! 20295: * ! 20296: READ4 MOV XR,DNAMP POP UNUSED SCBLK ! 20297: ZER XR ZERO PTR AS RESULT ! 20298: BRN READ2 MERGE ! 20299: ENP END PROCEDURE READR ! 20300: EJC ! 20301: * ! 20302: * SBSTR -- BUILD A SUBSTRING ! 20303: * ! 20304: * (XL) PTR TO SCBLK/BFBLK WITH CHARS ! 20305: * (WA) NUMBER OF CHARS IN SUBSTRING ! 20306: * (WB) OFFSET TO FIRST CHAR IN SCBLK ! 20307: * JSR SBSTR CALL TO BUILD SUBSTRING ! 20308: * (XR) PTR TO NEW SCBLK WITH SUBSTRING ! 20309: * (XL) ZERO ! 20310: * (WA,WB,WC,XL,IA) DESTROYED ! 20311: * ! 20312: * NOTE THAT SBSTR IS CALLED WITH A DUMMY STRING POINTER ! 20313: * (POINTING INTO A VRBLK OR SVBLK) TO COPY THE NAME OF A ! 20314: * VARIABLE AS A STANDARD STRING VALUE. ! 20315: * ! 20316: SBSTR PRC E,0 ENTRY POINT ! 20317: BZE WA,SBST2 JUMP IF NULL SUBSTRING ! 20318: JSR ALOCS ELSE ALLOCATE SCBLK ! 20319: MOV WC,WA MOVE NUMBER OF CHARACTERS ! 20320: MOV XR,WC SAVE PTR TO NEW SCBLK ! 20321: PLC XL,WB PREPARE TO LOAD CHARS FROM OLD BLK ! 20322: PSC XR PREPARE TO STORE CHARS IN NEW BLK ! 20323: MVC MOVE CHARACTERS TO NEW STRING ! 20324: MOV WC,XR THEN RESTORE SCBLK POINTER ! 20325: * ! 20326: * RETURN POINT ! 20327: * ! 20328: SBST1 ZER XL CLEAR GARBAGE POINTER IN XL ! 20329: EXI RETURN TO SBSTR CALLER ! 20330: * ! 20331: * HERE FOR NULL SUBSTRING ! 20332: * ! 20333: SBST2 MOV =NULLS,XR SET NULL STRING AS RESULT ! 20334: BRN SBST1 RETURN ! 20335: ENP END PROCEDURE SBSTR ! 20336: EJC ! 20337: * ! 20338: * SCANE -- SCAN AN ELEMENT ! 20339: * ! 20340: * SCANE IS CALLED AT COMPILE TIME (BY EXPAN ,CMPIL,CNCRD) ! 20341: * TO SCAN ONE ELEMENT FROM THE INPUT IMAGE. ! 20342: * ! 20343: * (SCNCC) NON-ZERO IF CALLED FROM CNCRD ! 20344: * JSR SCANE CALL TO SCAN ELEMENT ! 20345: * (XR) RESULT POINTER (SEE BELOW) ! 20346: * (XL) SYNTAX TYPE CODE (T$XXX) ! 20347: * ! 20348: * THE FOLLOWING GLOBAL LOCATIONS ARE USED. ! 20349: * ! 20350: * R$CIM POINTER TO STRING BLOCK (SCBLK) ! 20351: * FOR CURRENT INPUT IMAGE. ! 20352: * ! 20353: * R$CNI POINTER TO NEXT INPUT IMAGE STRING ! 20354: * POINTER (ZERO IF NONE). ! 20355: * ! 20356: * R$SCP SAVE POINTER (EXIT XR) FROM LAST ! 20357: * CALL IN CASE RESCAN IS SET. ! 20358: * ! 20359: * SCNBL THIS LOCATION IS SET NON-ZERO ON ! 20360: * EXIT IF SCANE SCANNED PAST BLANKS ! 20361: * BEFORE LOCATING THE CURRENT ELEMENT ! 20362: * THE END OF A LINE COUNTS AS BLANKS. ! 20363: * ! 20364: * SCNCC CNCRD SETS THIS NON-ZERO TO SCAN ! 20365: * CONTROL CARD NAMES AND CLEARS IT ! 20366: * ON RETURN ! 20367: * ! 20368: * SCNIL LENGTH OF CURRENT INPUT IMAGE ! 20369: * ! 20370: * SCNGO IF SET NON-ZERO ON ENTRY, F AND S ! 20371: * ARE RETURNED AS SEPARATE SYNTAX ! 20372: * TYPES (NOT LETTERS) (GOTO PRO- ! 20373: * CESSING). SCNGO IS RESET ON EXIT. ! 20374: * ! 20375: * SCNPT OFFSET TO CURRENT LOC IN R$CIM ! 20376: * ! 20377: * SCNRS IF SET NON-ZERO ON ENTRY, SCANE ! 20378: * RETURNS THE SAME RESULT AS ON THE ! 20379: * LAST CALL (RESCAN). SCNRS IS RESET ! 20380: * ON EXIT FROM ANY CALL TO SCANE. ! 20381: * ! 20382: * SCNTP SAVE SYNTAX TYPE FROM LAST ! 20383: * CALL (IN CASE RESCAN IS SET). ! 20384: EJC ! 20385: * ! 20386: * SCANE (CONTINUED) ! 20387: * ! 20388: * ! 20389: * ! 20390: * ELEMENT SCANNED XL XR ! 20391: * --------------- -- -- ! 20392: * ! 20393: * CONTROL CARD NAME 0 POINTER TO SCBLK FOR NAME ! 20394: * ! 20395: * UNARY OPERATOR T$UOP PTR TO OPERATOR DVBLK ! 20396: * ! 20397: * LEFT PAREN T$LPR T$LPR ! 20398: * ! 20399: * LEFT BRACKET T$LBR T$LBR ! 20400: * ! 20401: * COMMA T$CMA T$CMA ! 20402: * ! 20403: * FUNCTION CALL T$FNC PTR TO FUNCTION VRBLK ! 20404: * ! 20405: * VARIABLE T$VAR PTR TO VRBLK ! 20406: * ! 20407: * STRING CONSTANT T$CON PTR TO SCBLK ! 20408: * ! 20409: * INTEGER CONSTANT T$CON PTR TO ICBLK ! 20410: * ! 20411: * REAL CONSTANT T$CON PTR TO RCBLK ! 20412: * ! 20413: * BINARY OPERATOR T$BOP PTR TO OPERATOR DVBLK ! 20414: * ! 20415: * RIGHT PAREN T$RPR T$RPR ! 20416: * ! 20417: * RIGHT BRACKET T$RBR T$RBR ! 20418: * ! 20419: * COLON T$COL T$COL ! 20420: * ! 20421: * SEMI-COLON T$SMC T$SMC ! 20422: * ! 20423: * F (SCNGO NE 0) T$FGO T$FGO ! 20424: * ! 20425: * S (SCNGO NE 0) T$SGO T$SGO ! 20426: EJC ! 20427: * ! 20428: * SCANE (CONTINUED) ! 20429: * ! 20430: * ENTRY POINT ! 20431: * ! 20432: SCANE PRC E,0 ENTRY POINT ! 20433: ZER SCNBL RESET BLANKS FLAG ! 20434: MOV WA,SCNSA SAVE WA ! 20435: MOV WB,SCNSB SAVE WB ! 20436: MOV WC,SCNSC SAVE WC ! 20437: BZE SCNRS,SCN03 JUMP IF NO RESCAN ! 20438: * ! 20439: * HERE FOR RESCAN REQUEST ! 20440: * ! 20441: MOV SCNTP,XL SET PREVIOUS RETURNED SCAN TYPE ! 20442: MOV R$SCP,XR SET PREVIOUS RETURNED POINTER ! 20443: ZER SCNRS RESET RESCAN SWITCH ! 20444: BRN SCN13 JUMP TO EXIT ! 20445: * ! 20446: * COME HERE TO READ NEW IMAGE TO TEST FOR CONTINUATION ! 20447: * ! 20448: SCN01 JSR READR READ NEXT IMAGE ! 20449: MOV *DVUBS,WB SET WB FOR NOT READING NAME ! 20450: BZE XR,SCN30 TREAT AS SEMI-COLON IF NONE ! 20451: PLC XR ELSE POINT TO FIRST CHARACTER ! 20452: LCH WC,(XR) LOAD FIRST CHARACTER ! 20453: BEQ WC,=CH$DT,SCN02 JUMP IF DOT FOR CONTINUATION ! 20454: BNE WC,=CH$PL,SCN30 ELSE TREAT AS SEMICOLON UNLESS PLUS ! 20455: * ! 20456: * HERE FOR CONTINUATION LINE ! 20457: * ! 20458: SCN02 JSR NEXTS ACQUIRE NEXT SOURCE IMAGE ! 20459: MOV =NUM01,SCNPT SET SCAN POINTER PAST CONTINUATION ! 20460: MNZ SCNBL SET BLANKS FLAG ! 20461: EJC ! 20462: * ! 20463: * SCANE (CONTINUED) ! 20464: * ! 20465: * MERGE HERE TO SCAN NEXT ELEMENT ON CURRENT LINE ! 20466: * ! 20467: SCN03 MOV SCNPT,WA LOAD CURRENT OFFSET ! 20468: BEQ WA,SCNIL,SCN01 CHECK CONTINUATION IF END ! 20469: MOV R$CIM,XL POINT TO CURRENT LINE ! 20470: PLC XL,WA POINT TO CURRENT CHARACTER ! 20471: MOV WA,SCNSE SET START OF ELEMENT LOCATION ! 20472: MOV =OPDVS,WC POINT TO OPERATOR DV LIST ! 20473: MOV *DVUBS,WB SET CONSTANT FOR OPERATOR CIRCUIT ! 20474: BRN SCN06 START SCANNING ! 20475: * ! 20476: * LOOP HERE TO IGNORE LEADING BLANKS AND TABS ! 20477: * ! 20478: SCN05 BZE WB,SCN10 JUMP IF TRAILING ! 20479: ICV SCNSE INCREMENT START OF ELEMENT ! 20480: BEQ WA,SCNIL,SCN01 JUMP IF END OF IMAGE ! 20481: MNZ SCNBL NOTE BLANKS SEEN ! 20482: * ! 20483: * THE FOLLOWING JUMP IS USED REPEATEDLY FOR SCANNING OUT ! 20484: * THE CHARACTERS OF A NUMERIC CONSTANT OR VARIABLE NAME. ! 20485: * THE REGISTERS ARE USED AS FOLLOWS. ! 20486: * ! 20487: * (XR) SCRATCH ! 20488: * (XL) PTR TO NEXT CHARACTER ! 20489: * (WA) CURRENT SCAN OFFSET ! 20490: * (WB) *DVUBS (0 IF SCANNING NAME,CONST) ! 20491: * (WC) =OPDVS (0 IF SCANNING CONSTANT) ! 20492: * ! 20493: SCN06 LCH XR,(XL)+ GET NEXT CHARACTER ! 20494: ICV WA BUMP SCAN OFFSET ! 20495: MOV WA,SCNPT STORE OFFSET PAST CHAR SCANNED ! 20496: BLO =CFP$U,XR,SCN07 QUICK CHECK FOR OTHER CHAR ! 20497: BSW XR,CFP$U,SCN07 SWITCH ON SCANNED CHARACTER ! 20498: * ! 20499: * SWITCH TABLE FOR SWITCH ON CHARACTER ! 20500: * ! 20501: IFF CH$BL,SCN05 BLANK ! 20502: IFF CH$HT,SCN05 HORIZONTAL TAB ! 20503: IFF CH$D0,SCN08 DIGIT 0 ! 20504: IFF CH$D1,SCN08 DIGIT 1 ! 20505: IFF CH$D2,SCN08 DIGIT 2 ! 20506: IFF CH$D3,SCN08 DIGIT 3 ! 20507: IFF CH$D4,SCN08 DIGIT 4 ! 20508: IFF CH$D5,SCN08 DIGIT 5 ! 20509: IFF CH$D6,SCN08 DIGIT 6 ! 20510: IFF CH$D7,SCN08 DIGIT 7 ! 20511: IFF CH$D8,SCN08 DIGIT 8 ! 20512: IFF CH$D9,SCN08 DIGIT 9 ! 20513: EJC ! 20514: * ! 20515: * SCANE (CONTINUED) ! 20516: * ! 20517: IFF CH$LA,SCN09 LETTER A ! 20518: IFF CH$LB,SCN09 LETTER B ! 20519: IFF CH$LC,SCN09 LETTER C ! 20520: IFF CH$LD,SCN09 LETTER D ! 20521: IFF CH$LE,SCN09 LETTER E ! 20522: IFF CH$LG,SCN09 LETTER G ! 20523: IFF CH$LH,SCN09 LETTER H ! 20524: IFF CH$LI,SCN09 LETTER I ! 20525: IFF CH$LJ,SCN09 LETTER J ! 20526: IFF CH$LK,SCN09 LETTER K ! 20527: IFF CH$LL,SCN09 LETTER L ! 20528: IFF CH$LM,SCN09 LETTER M ! 20529: IFF CH$LN,SCN09 LETTER N ! 20530: IFF CH$LO,SCN09 LETTER O ! 20531: IFF CH$LP,SCN09 LETTER P ! 20532: IFF CH$LQ,SCN09 LETTER Q ! 20533: IFF CH$LR,SCN09 LETTER R ! 20534: IFF CH$LT,SCN09 LETTER T ! 20535: IFF CH$LU,SCN09 LETTER U ! 20536: IFF CH$LV,SCN09 LETTER V ! 20537: IFF CH$LW,SCN09 LETTER W ! 20538: IFF CH$LX,SCN09 LETTER X ! 20539: IFF CH$LY,SCN09 LETTER Y ! 20540: IFF CH$L$,SCN09 LETTER Z ! 20541: IFF CH$$A,SCN09 SHIFTED A ! 20542: IFF CH$$B,SCN09 SHIFTED B ! 20543: IFF CH$$C,SCN09 SHIFTED C ! 20544: IFF CH$$D,SCN09 SHIFTED D ! 20545: IFF CH$$E,SCN09 SHIFTED E ! 20546: IFF CH$$F,SCN20 SHIFTED F ! 20547: IFF CH$$G,SCN09 SHIFTED G ! 20548: IFF CH$$H,SCN09 SHIFTED H ! 20549: IFF CH$$I,SCN09 SHIFTED I ! 20550: IFF CH$$J,SCN09 SHIFTED J ! 20551: IFF CH$$K,SCN09 SHIFTED K ! 20552: IFF CH$$L,SCN09 SHIFTED L ! 20553: IFF CH$$M,SCN09 SHIFTED M ! 20554: IFF CH$$N,SCN09 SHIFTED N ! 20555: IFF CH$$O,SCN09 SHIFTED O ! 20556: IFF CH$$P,SCN09 SHIFTED P ! 20557: IFF CH$$Q,SCN09 SHIFTED Q ! 20558: IFF CH$$R,SCN09 SHIFTED R ! 20559: IFF CH$$S,SCN21 SHIFTED S ! 20560: IFF CH$$T,SCN09 SHIFTED T ! 20561: IFF CH$$U,SCN09 SHIFTED U ! 20562: IFF CH$$V,SCN09 SHIFTED V ! 20563: IFF CH$$W,SCN09 SHIFTED W ! 20564: IFF CH$$X,SCN09 SHIFTED X ! 20565: IFF CH$$Y,SCN09 SHIFTED Y ! 20566: IFF CH$$$,SCN09 SHIFTED Z ! 20567: EJC ! 20568: * ! 20569: * SCANE (CONTINUED) ! 20570: * ! 20571: IFF CH$SQ,SCN16 SINGLE QUOTE ! 20572: IFF CH$DQ,SCN17 DOUBLE QUOTE ! 20573: IFF CH$LF,SCN20 LETTER F ! 20574: IFF CH$LS,SCN21 LETTER S ! 20575: IFF CH$UN,SCN24 UNDERLINE ! 20576: IFF CH$PP,SCN25 LEFT PAREN ! 20577: IFF CH$RP,SCN26 RIGHT PAREN ! 20578: IFF CH$RB,SCN27 RIGHT BRACKET ! 20579: IFF CH$BB,SCN28 LEFT BRACKET ! 20580: IFF CH$CB,SCN27 RIGHT BRACKET ! 20581: IFF CH$OB,SCN28 LEFT BRACKET ! 20582: IFF CH$CL,SCN29 COLON ! 20583: IFF CH$SM,SCN30 SEMI-COLON ! 20584: IFF CH$CM,SCN31 COMMA ! 20585: IFF CH$DT,SCN32 DOT ! 20586: IFF CH$PL,SCN33 PLUS ! 20587: IFF CH$MN,SCN34 MINUS ! 20588: IFF CH$NT,SCN35 NOT ! 20589: IFF CH$DL,SCN36 DOLLAR ! 20590: IFF CH$EX,SCN37 EXCLAMATION MARK ! 20591: IFF CH$PC,SCN38 PERCENT ! 20592: IFF CH$SL,SCN40 SLASH ! 20593: IFF CH$NM,SCN41 NUMBER SIGN ! 20594: IFF CH$AT,SCN42 AT ! 20595: IFF CH$BR,SCN43 VERTICAL BAR ! 20596: IFF CH$AM,SCN44 AMPERSAND ! 20597: IFF CH$QU,SCN45 QUESTION MARK ! 20598: IFF CH$EQ,SCN46 EQUAL ! 20599: IFF CH$AS,SCN49 ASTERISK ! 20600: ESW END SWITCH ON CHARACTER ! 20601: * ! 20602: * HERE FOR ILLEGAL CHARACTER (UNDERLINE MERGES) ! 20603: * ! 20604: SCN07 BZE WB,SCN10 JUMP IF SCANNING NAME OR CONSTANT ! 20605: ERB 230,SYNTAX ERROR. ILLEGAL CHARACTER ! 20606: EJC ! 20607: * ! 20608: * SCANE (CONTINUED) ! 20609: * ! 20610: * HERE FOR DIGITS 0-9 ! 20611: * ! 20612: SCN08 BZE WB,SCN09 KEEP SCANNING IF NAME/CONSTANT ! 20613: ZER WC ELSE SET FLAG FOR SCANNING CONSTANT ! 20614: * ! 20615: * HERE FOR LETTER. LOOP HERE WHEN SCANNING NAME/CONSTANT ! 20616: * ! 20617: SCN09 BEQ WA,SCNIL,SCN11 JUMP IF END OF IMAGE ! 20618: ZER WB SET FLAG FOR SCANNING NAME/CONST ! 20619: BRN SCN06 MERGE BACK TO CONTINUE SCAN ! 20620: * ! 20621: * COME HERE FOR DELIMITER ENDING NAME OR CONSTANT ! 20622: * ! 20623: SCN10 DCV WA RESET OFFSET TO POINT TO DELIMITER ! 20624: * ! 20625: * COME HERE AFTER FINISHING SCAN OF NAME OR CONSTANT ! 20626: * ! 20627: SCN11 MOV WA,SCNPT STORE UPDATED SCAN OFFSET ! 20628: MOV SCNSE,WB POINT TO START OF ELEMENT ! 20629: SUB WB,WA GET NUMBER OF CHARACTERS ! 20630: MOV R$CIM,XL POINT TO LINE IMAGE ! 20631: BNZ WC,SCN15 JUMP IF NAME ! 20632: * ! 20633: * HERE AFTER SCANNING OUT NUMERIC CONSTANT ! 20634: * ! 20635: JSR SBSTR GET STRING FOR CONSTANT ! 20636: MOV XR,DNAMP DELETE FROM STORAGE (NOT NEEDED) ! 20637: JSR GTNUM CONVERT TO NUMERIC ! 20638: PPM SCN14 JUMP IF CONVERSION FAILURE ! 20639: * ! 20640: * MERGE HERE TO EXIT WITH CONSTANT ! 20641: * ! 20642: SCN12 MOV =T$CON,XL SET RESULT TYPE OF CONSTANT ! 20643: EJC ! 20644: * ! 20645: * SCANE (CONTINUED) ! 20646: * ! 20647: * COMMON EXIT POINT (XR,XL) SET ! 20648: * ! 20649: SCN13 MOV SCNSA,WA RESTORE WA ! 20650: MOV SCNSB,WB RESTORE WB ! 20651: MOV SCNSC,WC RESTORE WC ! 20652: MOV XR,R$SCP SAVE XR IN CASE RESCAN ! 20653: MOV XL,SCNTP SAVE XL IN CASE RESCAN ! 20654: ZER SCNGO RESET POSSIBLE GOTO FLAG ! 20655: EXI RETURN TO SCANE CALLER ! 20656: * ! 20657: * HERE IF CONVERSION ERROR ON NUMERIC ITEM ! 20658: * ! 20659: SCN14 ERB 231,SYNTAX ERROR. INVALID NUMERIC ITEM ! 20660: * ! 20661: * HERE AFTER SCANNING OUT VARIABLE NAME ! 20662: * ! 20663: SCN15 JSR SBSTR BUILD STRING NAME OF VARIABLE ! 20664: BNZ SCNCC,SCN13 RETURN IF CNCRD CALL ! 20665: JSR GTNVR LOCATE/BUILD VRBLK ! 20666: PPM DUMMY (UNUSED) ERROR RETURN ! 20667: MOV =T$VAR,XL SET TYPE AS VARIABLE ! 20668: BRN SCN13 BACK TO EXIT ! 20669: * ! 20670: * HERE FOR SINGLE QUOTE (START OF STRING CONSTANT) ! 20671: * ! 20672: SCN16 BZE WB,SCN10 TERMINATOR IF SCANNING NAME OR CNST ! 20673: MOV =CH$SQ,WB SET TERMINATOR AS SINGLE QUOTE ! 20674: BRN SCN18 MERGE ! 20675: * ! 20676: * HERE FOR DOUBLE QUOTE (START OF STRING CONSTANT) ! 20677: * ! 20678: SCN17 BZE WB,SCN10 TERMINATOR IF SCANNING NAME OR CNST ! 20679: MOV =CH$DQ,WB SET DOUBLE QUOTE TERMINATOR, MERGE ! 20680: * ! 20681: * LOOP TO SCAN OUT STRING CONSTANT ! 20682: * ! 20683: SCN18 BEQ WA,SCNIL,SCN19 ERROR IF END OF IMAGE ! 20684: LCH WC,(XL)+ ELSE LOAD NEXT CHARACTER ! 20685: ICV WA BUMP OFFSET ! 20686: BNE WC,WB,SCN18 LOOP BACK IF NOT TERMINATOR ! 20687: EJC ! 20688: * ! 20689: * SCANE (CONTINUED) ! 20690: * ! 20691: * HERE AFTER SCANNING OUT STRING CONSTANT ! 20692: * ! 20693: MOV SCNPT,WB POINT TO FIRST CHARACTER ! 20694: MOV WA,SCNPT SAVE OFFSET PAST FINAL QUOTE ! 20695: DCV WA POINT BACK PAST LAST CHARACTER ! 20696: SUB WB,WA GET NUMBER OF CHARACTERS ! 20697: MOV R$CIM,XL POINT TO INPUT IMAGE ! 20698: JSR SBSTR BUILD SUBSTRING VALUE ! 20699: BRN SCN12 BACK TO EXIT WITH CONSTANT RESULT ! 20700: * ! 20701: * HERE IF NO MATCHING QUOTE FOUND ! 20702: * ! 20703: SCN19 MOV WA,SCNPT SET UPDATED SCAN POINTER ! 20704: ERB 232,SYNTAX ERROR. UNMATCHED STRING QUOTE ! 20705: * ! 20706: * HERE FOR F (POSSIBLE FAILURE GOTO) ! 20707: * ! 20708: SCN20 MOV =T$FGO,XR SET RETURN CODE FOR FAIL GOTO ! 20709: BRN SCN22 JUMP TO MERGE ! 20710: * ! 20711: * HERE FOR S (POSSIBLE SUCCESS GOTO) ! 20712: * ! 20713: SCN21 MOV =T$SGO,XR SET SUCCESS GOTO AS RETURN CODE ! 20714: * ! 20715: * SPECIAL GOTO CASES MERGE HERE ! 20716: * ! 20717: SCN22 BZE SCNGO,SCN09 TREAT AS NORMAL LETTER IF NOT GOTO ! 20718: * ! 20719: * MERGE HERE FOR SPECIAL CHARACTER EXIT ! 20720: * ! 20721: SCN23 BZE WB,SCN10 JUMP IF END OF NAME/CONSTANT ! 20722: MOV XR,XL ELSE COPY CODE ! 20723: BRN SCN13 AND JUMP TO EXIT ! 20724: * ! 20725: * HERE FOR UNDERLINE ! 20726: * ! 20727: SCN24 BZE WB,SCN09 PART OF NAME IF SCANNING NAME ! 20728: BRN SCN07 ELSE ILLEGAL ! 20729: EJC ! 20730: * ! 20731: * SCANE (CONTINUED) ! 20732: * ! 20733: * HERE FOR LEFT PAREN ! 20734: * ! 20735: SCN25 MOV =T$LPR,XR SET LEFT PAREN RETURN CODE ! 20736: BNZ WB,SCN23 RETURN LEFT PAREN UNLESS NAME ! 20737: BZE WC,SCN10 DELIMITER IF SCANNING CONSTANT ! 20738: * ! 20739: * HERE FOR LEFT PAREN AFTER NAME (FUNCTION CALL) ! 20740: * ! 20741: MOV SCNSE,WB POINT TO START OF NAME ! 20742: MOV WA,SCNPT SET POINTER PAST LEFT PAREN ! 20743: DCV WA POINT BACK PAST LAST CHAR OF NAME ! 20744: SUB WB,WA GET NAME LENGTH ! 20745: MOV R$CIM,XL POINT TO INPUT IMAGE ! 20746: JSR SBSTR GET STRING NAME FOR FUNCTION ! 20747: JSR GTNVR LOCATE/BUILD VRBLK ! 20748: PPM DUMMY (UNUSED) ERROR RETURN ! 20749: MOV =T$FNC,XL SET CODE FOR FUNCTION CALL ! 20750: BRN SCN13 BACK TO EXIT ! 20751: * ! 20752: * PROCESSING FOR SPECIAL CHARACTERS ! 20753: * ! 20754: SCN26 MOV =T$RPR,XR RIGHT PAREN, SET CODE ! 20755: BRN SCN23 TAKE SPECIAL CHARACTER EXIT ! 20756: * ! 20757: SCN27 MOV =T$RBR,XR RIGHT BRACKET, SET CODE ! 20758: BRN SCN23 TAKE SPECIAL CHARACTER EXIT ! 20759: * ! 20760: SCN28 MOV =T$LBR,XR LEFT BRACKET, SET CODE ! 20761: BRN SCN23 TAKE SPECIAL CHARACTER EXIT ! 20762: * ! 20763: SCN29 MOV =T$COL,XR COLON, SET CODE ! 20764: BRN SCN23 TAKE SPECIAL CHARACTER EXIT ! 20765: * ! 20766: SCN30 MOV =T$SMC,XR SEMI-COLON, SET CODE ! 20767: BRN SCN23 TAKE SPECIAL CHARACTER EXIT ! 20768: * ! 20769: SCN31 MOV =T$CMA,XR COMMA, SET CODE ! 20770: BRN SCN23 TAKE SPECIAL CHARACTER EXIT ! 20771: EJC ! 20772: * ! 20773: * SCANE (CONTINUED) ! 20774: * ! 20775: * HERE FOR OPERATORS. ON ENTRY, WC POINTS TO THE TABLE OF ! 20776: * OPERATOR DOPE VECTORS AND WB IS THE INCREMENT TO STEP ! 20777: * TO THE NEXT PAIR (BINARY/UNARY) OF DOPE VECTORS IN THE ! 20778: * LIST. ON REACHING SCN46, THE POINTER HAS BEEN ADJUSTED TO ! 20779: * POINT TO THE APPROPRIATE PAIR OF DOPE VECTORS. ! 20780: * THE FIRST THREE ENTRIES ARE SPECIAL SINCE THEY CAN OCCUR ! 20781: * AS PART OF A VARIABLE NAME (.) OR CONSTANT (.+-). ! 20782: * ! 20783: SCN32 BZE WB,SCN09 DOT CAN BE PART OF NAME OR CONSTANT ! 20784: ADD WB,WC ELSE BUMP POINTER ! 20785: * ! 20786: SCN33 BZE WC,SCN09 PLUS CAN BE PART OF CONSTANT ! 20787: BZE WB,SCN48 PLUS CANNOT BE PART OF NAME ! 20788: ADD WB,WC ELSE BUMP POINTER ! 20789: * ! 20790: SCN34 BZE WC,SCN09 MINUS CAN BE PART OF CONSTANT ! 20791: BZE WB,SCN48 MINUS CANNOT BE PART OF NAME ! 20792: ADD WB,WC ELSE BUMP POINTER ! 20793: * ! 20794: SCN35 ADD WB,WC NOT ! 20795: SCN36 ADD WB,WC DOLLAR ! 20796: SCN37 ADD WB,WC EXCLAMATION ! 20797: SCN38 ADD WB,WC PERCENT ! 20798: SCN39 ADD WB,WC ASTERISK ! 20799: SCN40 ADD WB,WC SLASH ! 20800: SCN41 ADD WB,WC NUMBER SIGN ! 20801: SCN42 ADD WB,WC AT SIGN ! 20802: SCN43 ADD WB,WC VERTICAL BAR ! 20803: SCN44 ADD WB,WC AMPERSAND ! 20804: SCN45 ADD WB,WC QUESTION MARK ! 20805: * ! 20806: * ALL OPERATORS COME HERE (EQUAL MERGES DIRECTLY) ! 20807: * (WC) POINTS TO THE BINARY/UNARY PAIR OF OPERATOR DVBLKS. ! 20808: * ! 20809: SCN46 BZE WB,SCN10 OPERATOR TERMINATES NAME/CONSTANT ! 20810: MOV WC,XR ELSE COPY DV POINTER ! 20811: LCH WC,(XL) LOAD NEXT CHARACTER ! 20812: MOV =T$BOP,XL SET BINARY OP IN CASE ! 20813: BEQ WA,SCNIL,SCN47 SHOULD BE BINARY IF IMAGE END ! 20814: BEQ WC,=CH$BL,SCN47 SHOULD BE BINARY IF FOLLOWED BY BLK ! 20815: BEQ WC,=CH$HT,SCN47 JUMP IF HORIZONTAL TAB ! 20816: BEQ WC,=CH$SM,SCN47 SEMICOLON CAN IMMEDIATELY FOLLOW = ! 20817: * ! 20818: * HERE FOR UNARY OPERATOR ! 20819: * ! 20820: ADD *DVBS$,XR POINT TO DV FOR UNARY OP ! 20821: MOV =T$UOP,XL SET TYPE FOR UNARY OPERATOR ! 20822: BLE SCNTP,=T$UOK,SCN13 OK UNARY IF OK PRECEDING ELEMENT ! 20823: EJC ! 20824: * ! 20825: * SCANE (CONTINUED) ! 20826: * ! 20827: * MERGE HERE TO REQUIRE PRECEDING BLANKS ! 20828: * ! 20829: SCN47 BNZ SCNBL,SCN13 ALL OK IF PRECEDING BLANKS, EXIT ! 20830: * ! 20831: * FAIL OPERATOR IN THIS POSITION ! 20832: * ! 20833: SCN48 ERB 233,SYNTAX ERROR. INVALID USE OF OPERATOR ! 20834: * ! 20835: * HERE FOR ASTERISK, COULD BE ** SUBSTITUTE FOR EXCLAMATION ! 20836: * ! 20837: SCN49 BZE WB,SCN10 END OF NAME IF SCANNING NAME ! 20838: BEQ WA,SCNIL,SCN39 NOT ** IF * AT IMAGE END ! 20839: MOV WA,XR ELSE SAVE OFFSET PAST FIRST * ! 20840: MOV WA,SCNOF SAVE ANOTHER COPY ! 20841: LCH WA,(XL)+ LOAD NEXT CHARACTER ! 20842: BNE WA,=CH$AS,SCN50 NOT ** IF NEXT CHAR NOT * ! 20843: ICV XR ELSE STEP OFFSET PAST SECOND * ! 20844: BEQ XR,SCNIL,SCN51 OK EXCLAM IF END OF IMAGE ! 20845: LCH WA,(XL) ELSE LOAD NEXT CHARACTER ! 20846: BEQ WA,=CH$BL,SCN51 EXCLAMATION IF BLANK ! 20847: BEQ WA,=CH$HT,SCN51 EXCLAMATION IF HORIZONTAL TAB ! 20848: * ! 20849: * UNARY * ! 20850: * ! 20851: SCN50 MOV SCNOF,WA RECOVER STORED OFFSET ! 20852: MOV R$CIM,XL POINT TO LINE AGAIN ! 20853: PLC XL,WA POINT TO CURRENT CHAR ! 20854: BRN SCN39 MERGE WITH UNARY * ! 20855: * ! 20856: * HERE FOR ** AS SUBSTITUTE FOR EXCLAMATION ! 20857: * ! 20858: SCN51 MOV XR,SCNPT SAVE SCAN POINTER PAST 2ND * ! 20859: MOV XR,WA COPY SCAN POINTER ! 20860: BRN SCN37 MERGE WITH EXCLAMATION ! 20861: ENP END PROCEDURE SCANE ! 20862: EJC ! 20863: * ! 20864: * SCNGF -- SCAN GOTO FIELD ! 20865: * ! 20866: * SCNGF IS CALLED FROM CMPIL TO SCAN AND ANALYZE A GOTO ! 20867: * FIELD INCLUDING THE SURROUNDING BRACKETS OR PARENTHESES. ! 20868: * FOR A NORMAL GOTO, THE RESULT RETURNED IS EITHER A VRBLK ! 20869: * POINTER FOR A SIMPLE LABEL OPERAND, OR A POINTER TO AN ! 20870: * EXPRESSION TREE WITH A SPECIAL OUTER UNARY OPERATOR ! 20871: * (O$GOC). FOR A DIRECT GOTO, THE RESULT RETURNED IS A ! 20872: * POINTER TO AN EXPRESSION TREE WITH THE SPECIAL OUTER ! 20873: * UNARY OPERATOR O$GOD. ! 20874: * ! 20875: * JSR SCNGF CALL TO SCAN GOTO FIELD ! 20876: * (XR) RESULT (SEE ABOVE) ! 20877: * (XL,WA,WB,WC) DESTROYED ! 20878: * ! 20879: SCNGF PRC E,0 ENTRY POINT ! 20880: JSR SCANE SCAN INITIAL ELEMENT ! 20881: BEQ XL,=T$LPR,SCNG1 SKIP IF LEFT PAREN (NORMAL GOTO) ! 20882: BEQ XL,=T$LBR,SCNG2 SKIP IF LEFT BRACKET (DIRECT GOTO) ! 20883: ERB 234,SYNTAX ERROR. GOTO FIELD INCORRECT ! 20884: * ! 20885: * HERE FOR LEFT PAREN (NORMAL GOTO) ! 20886: * ! 20887: SCNG1 MOV =NUM01,WB SET EXPAN FLAG FOR NORMAL GOTO ! 20888: JSR EXPAN ANALYZE GOTO FIELD ! 20889: MOV =OPDVN,WA POINT TO OPDV FOR COMPLEX GOTO ! 20890: BLE XR,STATB,SCNG3 JUMP IF NOT IN STATIC (SGD15) ! 20891: BLO XR,STATE,SCNG4 JUMP TO EXIT IF SIMPLE LABEL NAME ! 20892: BRN SCNG3 COMPLEX GOTO - MERGE ! 20893: * ! 20894: * HERE FOR LEFT BRACKET (DIRECT GOTO) ! 20895: * ! 20896: SCNG2 MOV =NUM02,WB SET EXPAN FLAG FOR DIRECT GOTO ! 20897: JSR EXPAN SCAN GOTO FIELD ! 20898: MOV =OPDVD,WA SET OPDV POINTER FOR DIRECT GOTO ! 20899: EJC ! 20900: * ! 20901: * SCNGF (CONTINUED) ! 20902: * ! 20903: * MERGE HERE TO BUILD OUTER UNARY OPERATOR BLOCK ! 20904: * ! 20905: SCNG3 MOV WA,-(XS) STACK OPERATOR DV POINTER ! 20906: MOV XR,-(XS) STACK POINTER TO EXPRESSION TREE ! 20907: JSR EXPOP POP OPERATOR OFF ! 20908: MOV (XS)+,XR RELOAD NEW EXPRESSION TREE POINTER ! 20909: * ! 20910: * COMMON EXIT POINT ! 20911: * ! 20912: SCNG4 EXI RETURN TO CALLER ! 20913: ENP END PROCEDURE SCNGF ! 20914: EJC ! 20915: * ! 20916: * SETVR -- SET VRGET,VRSTO FIELDS OF VRBLK ! 20917: * ! 20918: * SETVR SETS THE PROPER VALUES IN THE VRGET AND VRSTO ! 20919: * FIELDS OF A VRBLK. IT IS CALLED WHENEVER TRBLKS ARE ! 20920: * ADDED OR SUBTRACTED (TRACE,STOPTR,INPUT,OUTPUT,DETACH) ! 20921: * ! 20922: * (XR) POINTER TO VRBLK ! 20923: * JSR SETVR CALL TO SET FIELDS ! 20924: * (XL,WA) DESTROYED ! 20925: * ! 20926: * NOTE THAT SETVR IGNORES THE CALL IF XR DOES NOT POINT ! 20927: * INTO THE STATIC REGION (I.E. IS SOME OTHER NAME BASE) ! 20928: * ! 20929: SETVR PRC E,0 ENTRY POINT ! 20930: BHI XR,STATE,SETV1 EXIT IF NOT NATURAL VARIABLE ! 20931: * ! 20932: * HERE IF WE HAVE A VRBLK ! 20933: * ! 20934: MOV XR,XL COPY VRBLK POINTER ! 20935: MOV =B$VRL,VRGET(XR) STORE NORMAL GET VALUE ! 20936: BEQ VRSTO(XR),=B$VRE,SETV1 SKIP IF PROTECTED VARIABLE ! 20937: MOV =B$VRS,VRSTO(XR) STORE NORMAL STORE VALUE ! 20938: MOV VRVAL(XL),XL POINT TO NEXT ENTRY ON CHAIN ! 20939: BNE (XL),=B$TRT,SETV1 JUMP IF END OF TRBLK CHAIN ! 20940: MOV =B$VRA,VRGET(XR) STORE TRAPPED ROUTINE ADDRESS ! 20941: MOV =B$VRV,VRSTO(XR) SET TRAPPED ROUTINE ADDRESS ! 20942: * ! 20943: * MERGE HERE TO EXIT TO CALLER ! 20944: * ! 20945: SETV1 EXI RETURN TO SETVR CALLER ! 20946: ENP END PROCEDURE SETVR ! 20947: EJC ! 20948: * ! 20949: * SORTA -- SORT ARRAY ! 20950: * ! 20951: * ROUTINE TO SORT AN ARRAY OR TABLE ON SAME BASIS AS IN ! 20952: * SITBOL. A TABLE IS CONVERTED TO AN ARRAY, LEAVING TWO ! 20953: * DIMENSIONAL ARRAYS AND VECTORS AS CASES TO BE CONSIDERED. ! 20954: * WHOLE ROWS OF ARRAYS ARE PERMUTED ACCORDING TO THE ! 20955: * ORDERING OF THE KEYS THEY CONTAIN, AND THE STRIDE ! 20956: * REFERRED TO, IS THE THE LENGTH OF A ROW. IT IS ONE ! 20957: * FOR A VECTOR. ! 20958: * THE SORT USED IS HEAPSORT, FUNDAMENTALS OF DATA STRUCTURE ! 20959: * HOROWITZ AND SAHNI, PITMAN 1977, PAGE 347. ! 20960: * IT IS AN ORDER N*LOG(N) ALGORITHM. IN ORDER ! 20961: * TO MAKE IT STABLE, COMPARANDS MAY NOT COMPARE EQUAL. THIS ! 20962: * IS ACHIEVED BY SORTING A COPY ARRAY (REFERRED TO AS THE ! 20963: * SORT ARRAY) CONTAINING AT ITS HIGH ADDRESS END, BYTE ! 20964: * OFFSETS TO THE ROWS TO BE SORTED HELD IN THE ORIGINAL ! 20965: * ARRAY (REFERRED TO AS THE KEY ARRAY). SORTC, THE ! 20966: * COMPARISON ROUTINE, ACCESSES THE KEYS THROUGH THESE ! 20967: * OFFSETS AND IN THE CASE OF EQUALITY, RESOLVES IT BY ! 20968: * COMPARING THE OFFSETS THEMSELVES. THE SORT PERMUTES THE ! 20969: * OFFSETS WHICH ARE THEN USED IN A FINAL OPERATION TO COPY ! 20970: * THE ACTUAL ITEMS INTO THE NEW ARRAY IN SORTED ORDER. ! 20971: * REFERENCES TO ZEROTH ITEM ARE TO NOTIONAL ITEM ! 20972: * PRECEDING FIRST ACTUAL ITEM. ! 20973: * REVERSE SORTING FOR RSORT IS DONE BY HAVING THE LESS THAN ! 20974: * TEST FOR KEYS EFFECTIVELY BE REPLACED BY A ! 20975: * GREATER THAN TEST. ! 20976: * ! 20977: * 1(XS) FIRST ARG - ARRAY OR TABLE ! 20978: * 0(XS) 2ND ARG - INDEX OR PDTYPE NAME ! 20979: * (WA) 0 , NON-ZERO FOR SORT , RSORT ! 20980: * JSR SORTA CALL TO SORT ARRAY ! 20981: * (XR) SORTED ARRAY ! 20982: * (XL,WA,WB,WC) DESTROYED ! 20983: EJC ! 20984: * ! 20985: * SORTA (CONTINUED) ! 20986: * ! 20987: SORTA PRC N,0 ENTRY POINT ! 20988: MOV WA,SRTSR SORT/RSORT INDICATOR ! 20989: MOV *NUM01,SRTST DEFAULT STRIDE OF 1 ! 20990: ZER SRTOF DEFAULT ZERO OFFSET TO SORT KEY ! 20991: MOV =NULLS,SRTDF CLEAR DATATYPE FIELD NAME ! 20992: MOV (XS)+,R$SXR UNSTACK ARGUMENT 2 ! 20993: MOV (XS)+,XR GET FIRST ARGUMENT ! 20994: JSR GTARR CONVERT TO ARRAY ! 20995: PPM SRT16 FAIL ! 20996: MOV XR,-(XS) STACK PTR TO RESULTING KEY ARRAY ! 20997: MOV XR,-(XS) ANOTHER COPY FOR COPYB ! 20998: JSR COPYB GET COPY ARRAY FOR SORTING INTO ! 20999: PPM CANT FAIL ! 21000: MOV XR,-(XS) STACK POINTER TO SORT ARRAY ! 21001: MOV R$SXR,XR GET SECOND ARG ! 21002: MOV 1(XS),XL GET PTR TO KEY ARRAY ! 21003: BNE (XL),=B$VCT,SRT02 JUMP IF ARBLK ! 21004: BEQ XR,=NULLS,SRT01 JUMP IF NULL SECOND ARG ! 21005: JSR GTNVR GET VRBLK PTR FOR IT ! 21006: ERR 257,ERRONEOUS 2ND ARG IN SORT/RSORT OF VECTOR ! 21007: MOV XR,SRTDF STORE DATATYPE FIELD NAME VRBLK ! 21008: * ! 21009: * COMPUTE N AND OFFSET TO ITEM A(0) IN VECTOR CASE ! 21010: * ! 21011: SRT01 MOV *VCLEN,WC OFFSET TO A(0) ! 21012: MOV *VCVLS,WB OFFSET TO FIRST ITEM ! 21013: MOV VCLEN(XL),WA GET BLOCK LENGTH ! 21014: SUB *VCSI$,WA GET NO. OF ENTRIES, N (IN BYTES) ! 21015: BRN SRT04 MERGE ! 21016: * ! 21017: * HERE FOR ARRAY ! 21018: * ! 21019: SRT02 LDI ARDIM(XL) GET POSSIBLE DIMENSION ! 21020: MFI WA CONVERT TO SHORT INTEGER ! 21021: WTB WA FURTHER CONVERT TO BAUS ! 21022: MOV *ARVLS,WB OFFSET TO FIRST VALUE IF ONE ! 21023: MOV *ARPRO,WC OFFSET BEFORE VALUES IF ONE DIM. ! 21024: BEQ ARNDM(XL),=NUM01,SRT04 JUMP IN FACT IF ONE DIM. ! 21025: BNE ARNDM(XL),=NUM02,SRT16 FAIL UNLESS TWO DIMENS ! 21026: LDI ARLB2(XL) GET LOWER BOUND 2 AS DEFAULT ! 21027: BEQ XR,=NULLS,SRT03 JUMP IF DEFAULT SECOND ARG ! 21028: JSR GTINT CONVERT TO INTEGER ! 21029: PPM SRT17 FAIL ! 21030: LDI ICVAL(XR) GET ACTUAL INTEGER VALUE ! 21031: EJC ! 21032: * ! 21033: * SORTA (CONTINUED) ! 21034: * ! 21035: * HERE WITH SORT COLUMN INDEX IN IA IN ARRAY CASE ! 21036: * ! 21037: SRT03 SBI ARLB2(XL) SUBTRACT LOW BOUND ! 21038: IOV SRT17 FAIL IF OVERFLOW ! 21039: ILT SRT17 FAIL IF BELOW LOW BOUND ! 21040: SBI ARDM2(XL) CHECK AGAINST DIMENSION ! 21041: IGE SRT17 FAIL IF TOO LARGE ! 21042: ADI ARDM2(XL) RESTORE VALUE ! 21043: MFI WA GET AS SMALL INTEGER ! 21044: WTB WA OFFSET WITHIN ROW TO KEY ! 21045: MOV WA,SRTOF KEEP OFFSET ! 21046: LDI ARDM2(XL) SECOND DIMENSION IS ROW LENGTH ! 21047: MFI WA CONVERT TO SHORT INTEGER ! 21048: MOV WA,XR COPY ROW LENGTH ! 21049: WTB WA CONVERT TO BYTES ! 21050: MOV WA,SRTST STORE AS STRIDE ! 21051: LDI ARDIM(XL) GET NUMBER OF ROWS ! 21052: MFI WA AS A SHORT INTEGER ! 21053: WTB WA CONVERT N TO BAUS ! 21054: MOV ARLEN(XL),WC OFFSET PAST ARRAY END ! 21055: SUB WA,WC ADJUST, GIVING SPACE FOR N OFFSETS ! 21056: DCA WC POINT TO A(0) ! 21057: MOV AROFS(XL),WB OFFSET TO WORD BEFORE FIRST ITEM ! 21058: ICA WB OFFSET TO FIRST ITEM ! 21059: * ! 21060: * SEPARATE PRE-PROCESSING FOR ARRAYS AND VECTORS DONE. ! 21061: * TO SIMPLIFY LATER KEY COMPARISONS, REMOVAL OF ANY TRBLK ! 21062: * TRAP BLOCKS FROM ENTRIES IN KEY ARRAY IS EFFECTED. ! 21063: * ! 21064: * (XL) = 1(XS) = POINTER TO KEY ARRAY ! 21065: * (XS) = POINTER TO SORT ARRAY ! 21066: * WA = NUMBER OF ITEMS, N (CONVERTED TO BYTES). ! 21067: * WB = OFFSET TO FIRST ITEM OF ARRAYS. ! 21068: * WC = OFFSET TO A(0) ! 21069: * ! 21070: SRT04 BLE WA,*NUM01,SRT15 RETURN IF ONLY A SINGLE ITEM ! 21071: MOV WA,SRTSN STORE NUMBER OF ITEMS (IN BAUS) ! 21072: MOV WC,SRTSO STORE OFFSET TO A(0) ! 21073: MOV ARLEN(XL),WC LENGTH OF ARRAY OR VEC (=VCLEN) ! 21074: ADD XL,WC POINT PAST END OF ARRAY OR VECTOR ! 21075: MOV WB,SRTSF STORE OFFSET TO FIRST ROW ! 21076: ADD WB,XL POINT TO FIRST ITEM IN KEY ARRAY ! 21077: * ! 21078: * LOOP THROUGH ARRAY ! 21079: * ! 21080: SRT05 MOV (XL),XR GET AN ENTRY ! 21081: * ! 21082: * HUNT ALONG TRBLK CHAIN ! 21083: * ! 21084: SRT06 BNE (XR),=B$TRT,SRT07 JUMP OUT IF NOT TRBLK ! 21085: MOV TRVAL(XR),XR GET VALUE FIELD ! 21086: BRN SRT06 LOOP ! 21087: EJC ! 21088: * ! 21089: * SORTA (CONTINUED) ! 21090: * ! 21091: * XR IS VALUE FROM END OF CHAIN ! 21092: * ! 21093: SRT07 MOV XR,(XL)+ STORE AS ARRAY ENTRY ! 21094: BLT XL,WC,SRT05 LOOP IF NOT DONE ! 21095: MOV (XS),XL GET ADRS OF SORT ARRAY ! 21096: MOV SRTSF,XR INITIAL OFFSET TO FIRST KEY ! 21097: MOV SRTST,WB GET STRIDE ! 21098: ADD SRTSO,XL OFFSET TO A(0) ! 21099: ICA XL POINT TO A(1) ! 21100: MOV SRTSN,WC GET N ! 21101: BTW WC CONVERT FROM BYTES ! 21102: MOV WC,SRTNR STORE AS ROW COUNT ! 21103: LCT WC,WC LOOP COUNTER ! 21104: * ! 21105: * STORE KEY OFFSETS AT TOP OF SORT ARRAY ! 21106: * ! 21107: SRT08 MOV XR,(XL)+ STORE AN OFFSET ! 21108: ADD WB,XR BUMP OFFSET BY STRIDE ! 21109: BCT WC,SRT08 LOOP THROUGH ROWS ! 21110: * ! 21111: * PERFORM THE SORT ON OFFSETS IN SORT ARRAY. ! 21112: * ! 21113: * (SRTSN) NUMBER OF ITEMS TO SORT, N (BYTES) ! 21114: * (SRTSO) OFFSET TO A(0) ! 21115: * ! 21116: SRT09 MOV SRTSN,WA GET N ! 21117: MOV SRTNR,WC GET NUMBER OF ROWS ! 21118: RSH WC,1 I = N / 2 (WC=I, INDEX INTO ARRAY) ! 21119: WTB WC CONVERT BACK TO BYTES ! 21120: * ! 21121: * LOOP TO FORM INITIAL HEAP ! 21122: * ! 21123: SRT10 JSR SORTH SORTH(I,N) ! 21124: DCA WC I = I - 1 ! 21125: BNZ WC,SRT10 LOOP IF I GT 0 ! 21126: MOV WA,WC I = N ! 21127: * ! 21128: * SORTING LOOP. AT THIS POINT, A(1) IS THE LARGEST ! 21129: * ITEM, SINCE ALGORITHM INITIALISES IT AS, AND THEN MAINTAI ! 21130: * IT AS, ROOT OF TREE. ! 21131: * ! 21132: SRT11 DCA WC I = I - 1 (N - 1 INITIALLY) ! 21133: BZE WC,SRT12 JUMP IF DONE ! 21134: MOV (XS),XR GET SORT ARRAY ADDRESS ! 21135: ADD SRTSO,XR POINT TO A(0) ! 21136: MOV XR,XL A(0) ADDRESS ! 21137: ADD WC,XL A(I) ADDRESS ! 21138: MOV 1(XL),WB COPY A(I+1) ! 21139: MOV 1(XR),1(XL) MOVE A(1) TO A(I+1) ! 21140: MOV WB,1(XR) COMPLETE EXCHANGE OF A(1), A(I+1) ! 21141: MOV WC,WA N = I FOR SORTH ! 21142: MOV *NUM01,WC I = 1 FOR SORTH ! 21143: JSR SORTH SORTH(1,N) ! 21144: MOV WA,WC RESTORE WC ! 21145: BRN SRT11 LOOP ! 21146: EJC ! 21147: * ! 21148: * SORTA (CONTINUED) ! 21149: * ! 21150: * OFFSETS HAVE BEEN PERMUTED INTO REQUIRED ORDER BY SORT. ! 21151: * COPY ARRAY ELEMENTS OVER THEM. ! 21152: * ! 21153: SRT12 MOV (XS),XL BASE ADRS OF KEY ARRAY ! 21154: MOV XL,WC COPY IT ! 21155: ADD SRTSO,WC OFFSET OF A(0) ! 21156: ADD SRTSF,XL ADRS OF FIRST ROW OF SORT ARRAY ! 21157: MOV SRTST,WB GET STRIDE ! 21158: BTW WB CONVERT TO WORDS ! 21159: * ! 21160: * COPYING LOOP FOR SUCCESSIVE ITEMS. SORTED OFFSETS ARE ! 21161: * HELD AT END OF SORT ARRAY. ! 21162: * ! 21163: SRT13 ICA WC ADRS OF NEXT OF SORTED OFFSETS ! 21164: MOV WC,XR COPY IT FOR ACCESS ! 21165: MOV (XR),XR GET OFFSET ! 21166: ADD 1(XS),XR ADD KEY ARRAY BASE ADRS ! 21167: LCT WA,WB GET COUNT OF WORDS IN ROW ! 21168: * ! 21169: * COPY A COMPLETE ROW ! 21170: * ! 21171: SRT14 MOV (XR)+,(XL)+ MOVE A WORD ! 21172: BCT WA,SRT14 LOOP ! 21173: DCV SRTNR DECREMENT ROW COUNT ! 21174: BNZ SRTNR,SRT13 REPEAT TILL ALL ROWS DONE ! 21175: * ! 21176: * RETURN POINT ! 21177: * ! 21178: SRT15 MOV (XS)+,XR POP RESULT ARRAY PTR ! 21179: ICA XS POP KEY ARRAY PTR ! 21180: ZER R$SXL CLEAR JUNK ! 21181: ZER R$SXR CLEAR JUNK ! 21182: EXI RETURN ! 21183: * ! 21184: * ERROR POINT ! 21185: * ! 21186: SRT16 ERB 256,SORT/RSORT 1ST ARG NOT SUITABLE ARRAY OR TABLE ! 21187: SRT17 ERB 258,SORT/RSORT 2ND ARG OUT OF RANGE OR NON-INTEGER ! 21188: ENP END PROCUDURE SORTA ! 21189: EJC ! 21190: * ! 21191: * SORTC -- COMPARE SORT KEYS ! 21192: * ! 21193: * COMPARE TWO SORT KEYS GIVEN THEIR OFFSETS. IF ! 21194: * EQUAL, COMPARE KEY OFFSETS TO GIVE STABLE SORT. ! 21195: * NOTE THAT IF SRTSR IS NON-ZERO (REQUEST FOR REVERSE ! 21196: * SORT), THE QUOTED RETURNS ARE INVERTED. ! 21197: * FOR OBJECTS OF DIFFERING DATATYPES, THE ENTRY POINT ! 21198: * IDENTIFICATIONS ARE COMPARED. ! 21199: * ! 21200: * (XL) BASE ADRS FOR KEYS ! 21201: * (WA) OFFSET TO KEY 1 ITEM ! 21202: * (WB) OFFSET TO KEY 2 ITEM ! 21203: * (SRTSR) ZERO/NON-ZERO FOR SORT/RSORT ! 21204: * (SRTOF) OFFSET WITHIN ROW TO COMPARANDS ! 21205: * JSR SORTC CALL TO COMPARE KEYS ! 21206: * PPM LOC KEY1 LESS THAN KEY2 ! 21207: * NORMAL RETURN, KEY1 GT THAN KEY2 ! 21208: * (XL,XR,WA,WB) DESTROYED ! 21209: * ! 21210: SORTC PRC E,1 ENTRY POINT ! 21211: MOV WA,SRTS1 SAVE OFFSET 1 ! 21212: MOV WB,SRTS2 SAVE OFFSET 2 ! 21213: MOV WC,SRTSC SAVE WC ! 21214: ADD SRTOF,XL ADD OFFSET TO COMPARAND FIELD ! 21215: MOV XL,XR COPY BASE + OFFSET ! 21216: ADD WA,XL ADD KEY1 OFFSET ! 21217: ADD WB,XR ADD KEY2 OFFSET ! 21218: MOV (XL),XL GET KEY1 ! 21219: MOV (XR),XR GET KEY2 ! 21220: BNE SRTDF,=NULLS,SRC11 JUMP IF DATATYPE FIELD NAME USED ! 21221: EJC ! 21222: * ! 21223: * SORTC (CONTINUED) ! 21224: * ! 21225: * MERGE AFTER DEALING WITH FIELD NAME. TRY FOR STRINGS. ! 21226: * ! 21227: SRC01 MOV (XL),WC GET TYPE CODE ! 21228: BNE WC,(XR),SRC02 SKIP IF NOT SAME DATATYPE ! 21229: BEQ WC,=B$SCL,SRC09 JUMP IF BOTH STRINGS ! 21230: * ! 21231: * NOW TRY FOR NUMERIC ! 21232: * ! 21233: SRC02 MOV XL,R$SXL KEEP ARG1 ! 21234: MOV XR,R$SXR KEEP ARG2 ! 21235: MOV XL,-(XS) STACK ! 21236: MOV XR,-(XS) ARGS ! 21237: JSR ACOMP COMPARE OBJECTS ! 21238: PPM SRC10 NOT NUMERIC ! 21239: PPM SRC10 NOT NUMERIC ! 21240: PPM SRC03 KEY1 LESS ! 21241: PPM SRC08 KEYS EQUAL ! 21242: PPM SRC05 KEY1 GREATER ! 21243: * ! 21244: * RETURN IF KEY1 SMALLER (SORT), GREATER (RSORT) ! 21245: * ! 21246: SRC03 BNZ SRTSR,SRC06 JUMP IF RSORT ! 21247: * ! 21248: SRC04 MOV SRTSC,WC RESTORE WC ! 21249: EXI 1 RETURN ! 21250: * ! 21251: * RETURN IF KEY1 GREATER (SORT), SMALLER (RSORT) ! 21252: * ! 21253: SRC05 BNZ SRTSR,SRC04 JUMP IF RSORT ! 21254: * ! 21255: SRC06 MOV SRTSC,WC RESTORE WC ! 21256: EXI RETURN ! 21257: * ! 21258: * KEYS ARE OF SAME DATATYPE ! 21259: * ! 21260: SRC07 BLT XL,XR,SRC03 ITEM FIRST CREATED IS LESS ! 21261: BGT XL,XR,SRC05 ADDRESSES RISE IN ORDER OF CREATION ! 21262: * ! 21263: * DROP THROUGH OR MERGE FOR IDENTICAL OR EQUAL OBJECTS ! 21264: * ! 21265: SRC08 BLT SRTS1,SRTS2,SRC04 TEST OFFSETS OR KEY ADDRSS INSTEAD ! 21266: BRN SRC06 OFFSET 1 GREATER ! 21267: EJC ! 21268: * ! 21269: * SORTC (CONTINUED) ! 21270: * ! 21271: * STRINGS ! 21272: * ! 21273: SRC09 MOV XL,-(XS) STACK ! 21274: MOV XR,-(XS) ARGS ! 21275: JSR LCOMP COMPARE OBJECTS ! 21276: PPM CANT ! 21277: PPM FAIL ! 21278: PPM SRC03 KEY1 LESS ! 21279: PPM SRC08 KEYS EQUAL ! 21280: PPM SRC05 KEY1 GREATER ! 21281: * ! 21282: * ARITHMETIC COMPARISON FAILED - RECOVER ARGS ! 21283: * ! 21284: SRC10 MOV R$SXL,XL GET ARG1 ! 21285: MOV R$SXR,XR GET ARG2 ! 21286: MOV (XL),WC GET TYPE OF KEY1 ! 21287: BEQ WC,(XR),SRC07 JUMP IF KEYS OF SAME TYPE ! 21288: MOV WC,XL GET BLOCK TYPE WORD ! 21289: MOV (XR),XR GET BLOCK TYPE WORD ! 21290: LEI XL ENTRY POINT ID FOR KEY1 ! 21291: LEI XR ENTRY POINT ID FOR KEY2 ! 21292: BGT XL,XR,SRC05 JUMP IF KEY1 GT KEY2 ! 21293: BRN SRC03 KEY1 LT KEY2 ! 21294: * ! 21295: * DATATYPE FIELD NAME USED ! 21296: * ! 21297: SRC11 JSR SORTF CALL ROUTINE TO FIND FIELD 1 ! 21298: MOV XL,-(XS) STACK ITEM POINTER ! 21299: MOV XR,XL GET KEY2 ! 21300: JSR SORTF FIND FIELD 2 ! 21301: MOV XL,XR PLACE AS KEY2 ! 21302: MOV (XS)+,XL RECOVER KEY1 ! 21303: BRN SRC01 MERGE ! 21304: ENP PROCEDURE SORTC ! 21305: EJC ! 21306: * ! 21307: * SORTF -- FIND FIELD FOR SORTC ! 21308: * ! 21309: * ROUTINE USED BY SORTC TO OBTAIN ITEM CORRESPONDING ! 21310: * TO A GIVEN FIELD NAME, IF THIS EXISTS, IN A PROGRAMMER ! 21311: * DEFINED OBJECT PASSED AS ARGUMENT. ! 21312: * IF SUCH A MATCH OCCURS, RECORD IS KEPT OF DATATYPE ! 21313: * NAME, FIELD NAME AND OFFSET TO FIELD IN ORDER TO ! 21314: * SHORT-CIRCUIT LATER SEARCHES ON SAME TYPE. NOTE THAT ! 21315: * DFBLKS ARE STORED IN STATIC AND HENCE CANNOT BE MOVED. ! 21316: * ! 21317: * (SRTDF) VRBLK POINTER OF FIELD NAME ! 21318: * (XL) POSSIBLE PDBLK POINTER ! 21319: * JSR SORTF CALL TO SEARCH FOR FIELD NAME ! 21320: * (XL) ITEM FOUND OR ORIGINAL PDBLK PTR ! 21321: * (WC) DESTROYED ! 21322: * ! 21323: SORTF PRC E,0 ENTRY POINT ! 21324: BNE (XL),=B$PDT,SRTF3 RETURN IF NOT PDBLK ! 21325: MOV XR,-(XS) KEEP XR ! 21326: MOV SRTFD,XR GET POSSIBLE FORMER DFBLK PTR ! 21327: BZE XR,SRTF4 JUMP IF NOT ! 21328: BNE XR,PDDFP(XL),SRTF4 JUMP IF NOT RIGHT DATATYPE ! 21329: BNE SRTDF,SRTFF,SRTF4 JUMP IF NOT RIGHT FIELD NAME ! 21330: ADD SRTFO,XL ADD OFFSET TO REQUIRED FIELD ! 21331: * ! 21332: * HERE WITH XL POINTING TO FOUND FIELD ! 21333: * ! 21334: SRTF1 MOV (XL),XL GET ITEM FROM FIELD ! 21335: * ! 21336: * RETURN POINT ! 21337: * ! 21338: SRTF2 MOV (XS)+,XR RESTORE XR ! 21339: * ! 21340: SRTF3 EXI RETURN ! 21341: EJC ! 21342: * ! 21343: * SORTF (CONTINUED) ! 21344: * ! 21345: * CONDUCT A SEARCH ! 21346: * ! 21347: SRTF4 MOV XL,XR COPY ORIGINAL POINTER ! 21348: MOV PDDFP(XR),XR POINT TO DFBLK ! 21349: MOV XR,SRTFD KEEP A COPY ! 21350: MOV FARGS(XR),WC GET NUMBER OF FIELDS ! 21351: WTB WC CONVERT TO BYTES ! 21352: ADD DFLEN(XR),XR POINT PAST LAST FIELD ! 21353: * ! 21354: * LOOP TO FIND NAME IN PDFBLK ! 21355: * ! 21356: SRTF5 DCA WC COUNT DOWN ! 21357: DCA XR POINT IN FRONT ! 21358: BEQ (XR),SRTDF,SRTF6 SKIP OUT IF FOUND ! 21359: BNZ WC,SRTF5 LOOP ! 21360: BRN SRTF2 RETURN - NOT FOUND ! 21361: * ! 21362: * FOUND ! 21363: * ! 21364: SRTF6 MOV (XR),SRTFF KEEP FIELD NAME PTR ! 21365: ADD *PDFLD,WC ADD OFFSET TO FIRST FIELD ! 21366: MOV WC,SRTFO STORE AS FIELD OFFSET ! 21367: ADD WC,XL POINT TO FIELD ! 21368: BRN SRTF1 RETURN ! 21369: ENP PROCEDURE SORTF ! 21370: EJC ! 21371: * ! 21372: * SORTH -- HEAP ROUTINE FOR SORTA ! 21373: * ! 21374: * THIS ROUTINE CONSTRUCTS A HEAP FROM ELEMENTS OF ARRAY, A. ! 21375: * IN THIS APPLICATION, THE ELEMENTS ARE OFFSETS TO KEYS IN ! 21376: * A KEY ARRAY. ! 21377: * ! 21378: * (XS) POINTER TO SORT ARRAY BASE ! 21379: * 1(XS) POINTER TO KEY ARRAY BASE ! 21380: * (WA) MAX ARRAY INDEX, N (IN BYTES) ! 21381: * (WC) OFFSET J IN A TO ROOT (IN *1 TO *N) ! 21382: * JSR SORTH CALL SORTH(J,N) TO MAKE HEAP ! 21383: * (XL,XR,WB) DESTROYED ! 21384: * ! 21385: SORTH PRC N,0 ENTRY POINT ! 21386: MOV WA,SRTSN SAVE N ! 21387: MOV WC,SRTWC KEEP WC ! 21388: MOV (XS),XL SORT ARRAY BASE ADRS ! 21389: ADD SRTSO,XL ADD OFFSET TO A(0) ! 21390: ADD WC,XL POINT TO A(J) ! 21391: MOV (XL),SRTRT GET OFFSET TO ROOT ! 21392: ADD WC,WC DOUBLE J - CANT EXCEED N ! 21393: * ! 21394: * LOOP TO MOVE DOWN TREE USING DOUBLED INDEX J ! 21395: * ! 21396: SRH01 BGT WC,SRTSN,SRH03 DONE IF J GT N ! 21397: BEQ WC,SRTSN,SRH02 SKIP IF J EQUALS N ! 21398: MOV (XS),XR SORT ARRAY BASE ADRS ! 21399: MOV 1(XS),XL KEY ARRAY BASE ADRS ! 21400: ADD SRTSO,XR POINT TO A(0) ! 21401: ADD WC,XR ADRS OF A(J) ! 21402: MOV 1(XR),WA GET A(J+1) ! 21403: MOV (XR),WB GET A(J) ! 21404: * ! 21405: * COMPARE SONS. (WA) RIGHT SON, (WB) LEFT SON ! 21406: * ! 21407: JSR SORTC COMPARE KEYS - LT(A(J+1),A(J)) ! 21408: PPM SRH02 A(J+1) LT A(J) ! 21409: ICA WC POINT TO GREATER SON, A(J+1) ! 21410: EJC ! 21411: * ! 21412: * SORTH (CONTINUED) ! 21413: * ! 21414: * COMPARE ROOT WITH GREATER SON ! 21415: * ! 21416: SRH02 MOV 1(XS),XL KEY ARRAY BASE ADRS ! 21417: MOV (XS),XR GET SORT ARRAY ADDRESS ! 21418: ADD SRTSO,XR ADRS OF A(0) ! 21419: MOV XR,WB COPY THIS ADRS ! 21420: ADD WC,XR ADRS OF GREATER SON, A(J) ! 21421: MOV (XR),WA GET A(J) ! 21422: MOV WB,XR POINT BACK TO A(0) ! 21423: MOV SRTRT,WB GET ROOT ! 21424: JSR SORTC COMPARE THEM - LT(A(J),ROOT) ! 21425: PPM SRH03 FATHER EXCEEDS SONS - DONE ! 21426: MOV (XS),XR GET SORT ARRAY ADRS ! 21427: ADD SRTSO,XR POINT TO A(0) ! 21428: MOV XR,XL COPY IT ! 21429: MOV WC,WA COPY J ! 21430: BTW WC CONVERT TO WORDS ! 21431: RSH WC,1 GET J/2 ! 21432: WTB WC CONVERT BACK TO BYTES ! 21433: ADD WA,XL POINT TO A(J) ! 21434: ADD WC,XR ADRS OF A(J/2) ! 21435: MOV (XL),(XR) A(J/2) = A(J) ! 21436: MOV WA,WC RECOVER J ! 21437: AOV WC,WC,SRH03 J = J*2. DONE IF TOO BIG ! 21438: BRN SRH01 LOOP ! 21439: * ! 21440: * FINISH BY COPYING ROOT OFFSET BACK INTO ARRAY ! 21441: * ! 21442: SRH03 BTW WC CONVERT TO WORDS ! 21443: RSH WC,1 J = J/2 ! 21444: WTB WC CONVERT BACK TO BYTES ! 21445: MOV (XS),XR SORT ARRAY ADRS ! 21446: ADD SRTSO,XR ADRS OF A(0) ! 21447: ADD WC,XR ADRS OF A(J/2) ! 21448: MOV SRTRT,(XR) A(J/2) = ROOT ! 21449: MOV SRTSN,WA RESTORE WA ! 21450: MOV SRTWC,WC RESTORE WC ! 21451: EXI RETURN ! 21452: ENP END PROCEDURE SORTH ! 21453: EJC ! 21454: EJC ! 21455: * ! 21456: * TFIND -- LOCATE TABLE ELEMENT ! 21457: * ! 21458: * (XR) SUBSCRIPT VALUE FOR ELEMENT ! 21459: * (XL) POINTER TO TABLE ! 21460: * (WB) ZERO BY VALUE, NON-ZERO BY NAME ! 21461: * JSR TFIND CALL TO LOCATE ELEMENT ! 21462: * PPM LOC TRANSFER LOCATION IF ACCESS FAILS ! 21463: * (XR) ELEMENT VALUE (IF BY VALUE) ! 21464: * (XR) DESTROYED (IF BY NAME) ! 21465: * (XL,WA) TEBLK NAME (IF BY NAME) ! 21466: * (XL,WA) DESTROYED (IF BY VALUE) ! 21467: * (WC,RA) DESTROYED ! 21468: * ! 21469: * NOTE THAT IF A CALL BY VALUE SPECIFIES A NON-EXISTENT ! 21470: * SUBSCRIPT, NULL IS RETURNED WITHOUT BUILDING A NEW TEBLK. ! 21471: * ! 21472: TFIND PRC E,1 ENTRY POINT ! 21473: MOV WB,-(XS) SAVE NAME/VALUE INDICATOR ! 21474: MOV XR,-(XS) SAVE SUBSCRIPT VALUE ! 21475: MOV XL,-(XS) SAVE TABLE POINTER ! 21476: MOV TBLEN(XL),WA LOAD LENGTH OF TBBLK ! 21477: BTW WA CONVERT TO WORD COUNT ! 21478: SUB =TBBUK,WA GET NUMBER OF BUCKETS ! 21479: MTI WA CONVERT TO INTEGER VALUE ! 21480: STI TFNSI SAVE FOR LATER ! 21481: MOV (XR),XL LOAD FIRST WORD OF SUBSCRIPT ! 21482: LEI XL LOAD BLOCK ENTRY ID (BL$XX) ! 21483: BSW XL,BL$$D,TFN00 SWITCH ON BLOCK TYPE ! 21484: IFF BL$IC,TFN02 JUMP IF INTEGER ! 21485: IFF BL$RC,TFN02 REAL ! 21486: IFF BL$P0,TFN03 JUMP IF PATTERN ! 21487: IFF BL$P1,TFN03 JUMP IF PATTERN ! 21488: IFF BL$P2,TFN03 JUMP IF PATTERN ! 21489: IFF BL$NM,TFN04 JUMP IF NAME ! 21490: IFF BL$SC,TFN05 JUMP IF STRING ! 21491: ESW END SWITCH ON BLOCK TYPE ! 21492: * ! 21493: * HERE FOR BLOCKS FOR WHICH WE USE THE SECOND WORD OF THE ! 21494: * BLOCK AS THE HASH SOURCE (SEE BLOCK FORMATS FOR DETAILS). ! 21495: * ! 21496: TFN00 MOV 1(XR),WA LOAD SECOND WORD ! 21497: * ! 21498: * MERGE HERE WITH ONE WORD HASH SOURCE IN WA ! 21499: * ! 21500: TFN01 MTI WA CONVERT TO INTEGER ! 21501: BRN TFN06 JUMP TO MERGE ! 21502: EJC ! 21503: * ! 21504: * TFIND (CONTINUED) ! 21505: * ! 21506: * HERE FOR INTEGER OR REAL ! 21507: * ! 21508: TFN02 LDI 1(XR) LOAD VALUE AS HASH SOURCE ! 21509: IGE TFN06 OK IF POSITIVE OR ZERO ! 21510: NGI MAKE POSITIVE ! 21511: IOV TFN06 CLEAR POSSIBLE OVERFLOW ! 21512: BRN TFN06 MERGE ! 21513: * ! 21514: * FOR PATTERN, USE FIRST WORD (PCODE) AS SOURCE ! 21515: * ! 21516: TFN03 MOV (XR),WA LOAD FIRST WORD AS HASH SOURCE ! 21517: BRN TFN01 MERGE BACK ! 21518: * ! 21519: * FOR NAME, USE OFFSET AS HASH SOURCE ! 21520: * ! 21521: TFN04 MOV NMOFS(XR),WA LOAD OFFSET AS HASH SOURCE ! 21522: BRN TFN01 MERGE BACK ! 21523: * ! 21524: * HERE FOR STRING ! 21525: * ! 21526: TFN05 JSR HASHS CALL ROUTINE TO COMPUTE HASH ! 21527: * ! 21528: * MERGE HERE WITH HASH SOURCE IN (IA) ! 21529: * ! 21530: TFN06 RMI TFNSI COMPUTE HASH INDEX BY REMAINDERING ! 21531: MFI WC GET AS ONE WORD INTEGER ! 21532: WTB WC CONVERT TO BYTE OFFSET ! 21533: MOV (XS),XL GET TABLE PTR AGAIN ! 21534: ADD WC,XL POINT TO PROPER BUCKET ! 21535: MOV TBBUK(XL),XR LOAD FIRST TEBLK POINTER ! 21536: BEQ XR,(XS),TFN10 JUMP IF NO TEBLKS ON CHAIN ! 21537: * ! 21538: * LOOP THROUGH TEBLKS ON HASH CHAIN ! 21539: * ! 21540: TFN07 MOV XR,WB SAVE TEBLK POINTER ! 21541: MOV TESUB(XR),XR LOAD SUBSCRIPT VALUE ! 21542: MOV 1(XS),XL LOAD INPUT ARGUMENT SUBSCRIPT VAL ! 21543: JSR IDENT COMPARE THEM ! 21544: PPM TFN08 JUMP IF EQUAL (IDENT) ! 21545: * ! 21546: * HERE IF NO MATCH WITH THAT TEBLK ! 21547: * ! 21548: MOV WB,XL RESTORE TEBLK POINTER ! 21549: MOV TENXT(XL),XR POINT TO NEXT TEBLK ON CHAIN ! 21550: BNE XR,(XS),TFN07 JUMP IF THERE IS ONE ! 21551: * ! 21552: * HERE IF NO MATCH WITH ANY TEBLK ON CHAIN ! 21553: * ! 21554: MOV *TENXT,WC SET OFFSET TO LINK FIELD (XL BASE) ! 21555: BRN TFN11 JUMP TO MERGE ! 21556: EJC ! 21557: * ! 21558: * TFIND (CONTINUED) ! 21559: * ! 21560: * HERE WE HAVE FOUND A MATCHING ELEMENT ! 21561: * ! 21562: TFN08 MOV WB,XL RESTORE TEBLK POINTER ! 21563: MOV *TEVAL,WA SET TEBLK NAME OFFSET ! 21564: MOV 2(XS),WB RESTORE NAME/VALUE INDICATOR ! 21565: BNZ WB,TFN09 JUMP IF CALLED BY NAME ! 21566: JSR ACESS ELSE GET VALUE ! 21567: PPM TFN12 JUMP IF REFERENCE FAILS ! 21568: ZER WB RESTORE NAME/VALUE INDICATOR ! 21569: * ! 21570: * COMMON EXIT FOR ENTRY FOUND ! 21571: * ! 21572: TFN09 ADD *NUM03,XS POP STACK ENTRIES ! 21573: EXI RETURN TO TFIND CALLER ! 21574: * ! 21575: * HERE IF NO TEBLKS ON THE HASH CHAIN ! 21576: * ! 21577: TFN10 ADD *TBBUK,WC GET OFFSET TO BUCKET PTR ! 21578: MOV (XS),XL SET TBBLK PTR AS BASE ! 21579: * ! 21580: * MERGE HERE WITH (XL,WC) BASE,OFFSET OF FINAL LINK ! 21581: * ! 21582: TFN11 MOV (XS),XR TBBLK POINTER ! 21583: MOV TBINV(XR),XR LOAD DEFAULT VALUE IN CASE ! 21584: MOV 2(XS),WB LOAD NAME/VALUE INDICATOR ! 21585: BZE WB,TFN09 EXIT WITH DEFAULT IF VALUE CALL ! 21586: * ! 21587: * HERE WE MUST BUILD A NEW TEBLK ! 21588: * ! 21589: MOV *TESI$,WA SET SIZE OF TEBLK ! 21590: JSR ALLOC ALLOCATE TEBLK ! 21591: ADD WC,XL POINT TO HASH LINK ! 21592: MOV XR,(XL) LINK NEW TEBLK AT END OF CHAIN ! 21593: MOV =B$TET,(XR) STORE TYPE WORD ! 21594: MOV =NULLS,TEVAL(XR) SET NULL AS INITIAL VALUE ! 21595: MOV (XS)+,TENXT(XR) SET TBBLK PTR TO MARK END OF CHAIN ! 21596: MOV (XS)+,TESUB(XR) STORE SUBSCRIPT VALUE ! 21597: ICA XS POP PAST NAME/VALUE INDICATOR ! 21598: MOV XR,XL COPY TEBLK POINTER (NAME BASE) ! 21599: MOV *TEVAL,WA SET OFFSET ! 21600: EXI RETURN TO CALLER WITH NEW TEBLK ! 21601: * ! 21602: * ACESS FAIL RETURN ! 21603: * ! 21604: TFN12 EXI 1 ALTERNATIVE RETURN ! 21605: ENP END PROCEDURE TFIND ! 21606: EJC ! 21607: * ! 21608: * TRACE -- SET/RESET A TRACE ASSOCIATION ! 21609: * ! 21610: * THIS PROCEDURE IS SHARED BY TRACE AND STOPTR TO ! 21611: * EITHER INITIATE OR STOP A TRACE RESPECTIVELY. ! 21612: * ! 21613: * (XL) TRBLK PTR (TRACE) OR ZERO (STOPTR) ! 21614: * 1(XS) FIRST ARGUMENT (NAME) ! 21615: * 0(XS) SECOND ARGUMENT (TRACE TYPE) ! 21616: * JSR TRACE CALL TO SET/RESET TRACE ! 21617: * PPM LOC TRANSFER LOC IF 1ST ARG IS BAD NAME ! 21618: * PPM LOC TRANSFER LOC IF 2ND ARG IS BAD TYPE ! 21619: * (XS) POPPED ! 21620: * (XL,XR,WA,WB,WC,IA) DESTROYED ! 21621: * ! 21622: TRACE PRC N,2 ENTRY POINT ! 21623: JSR GTSTG GET TRACE TYPE STRING ! 21624: PPM TRC15 JUMP IF NOT STRING ! 21625: PLC XR ELSE POINT TO STRING ! 21626: LCH WA,(XR) LOAD FIRST CHARACTER ! 21627: FLC WA FOLD TO UPPER CASE ! 21628: MOV (XS),XR LOAD NAME ARGUMENT ! 21629: MOV XL,(XS) STACK TRBLK PTR OR ZERO ! 21630: MOV =TRTAC,WC SET TRTYP FOR ACCESS TRACE ! 21631: BEQ WA,=CH$LA,TRC10 JUMP IF A (ACCESS) ! 21632: MOV =TRTVL,WC SET TRTYP FOR VALUE TRACE ! 21633: BEQ WA,=CH$LV,TRC10 JUMP IF V (VALUE) ! 21634: BZE WA,TRC10 JUMP IF BLANK (VALUE) ! 21635: * ! 21636: * HERE FOR L,K,F,C,R ! 21637: * ! 21638: BEQ WA,=CH$LF,TRC01 JUMP IF F (FUNCTION) ! 21639: BEQ WA,=CH$LR,TRC01 JUMP IF R (RETURN) ! 21640: BEQ WA,=CH$LL,TRC03 JUMP IF L (LABEL) ! 21641: BEQ WA,=CH$LK,TRC06 JUMP IF K (KEYWORD) ! 21642: BNE WA,=CH$LC,TRC15 ELSE ERROR IF NOT C (CALL) ! 21643: * ! 21644: * HERE FOR F,C,R ! 21645: * ! 21646: TRC01 JSR GTNVR POINT TO VRBLK FOR NAME ! 21647: PPM TRC16 JUMP IF BAD NAME ! 21648: ICA XS POP STACK ! 21649: MOV VRFNC(XR),XR POINT TO FUNCTION BLOCK ! 21650: BNE (XR),=B$PFC,TRC17 ERROR IF NOT PROGRAM FUNCTION ! 21651: BEQ WA,=CH$LR,TRC02 JUMP IF R (RETURN) ! 21652: EJC ! 21653: * ! 21654: * TRACE (CONTINUED) ! 21655: * ! 21656: * HERE FOR F,C TO SET/RESET CALL TRACE ! 21657: * ! 21658: MOV XL,PFCTR(XR) SET/RESET CALL TRACE ! 21659: BEQ WA,=CH$LC,EXNUL EXIT WITH NULL IF C (CALL) ! 21660: * ! 21661: * HERE FOR F,R TO SET/RESET RETURN TRACE ! 21662: * ! 21663: TRC02 MOV XL,PFRTR(XR) SET/RESET RETURN TRACE ! 21664: EXI RETURN ! 21665: * ! 21666: * HERE FOR L TO SET/RESET LABEL TRACE ! 21667: * ! 21668: TRC03 JSR GTNVR POINT TO VRBLK ! 21669: PPM TRC16 JUMP IF BAD NAME ! 21670: MOV VRLBL(XR),XL LOAD LABEL POINTER ! 21671: BNE (XL),=B$TRT,TRC04 JUMP IF NO OLD TRACE ! 21672: MOV TRLBL(XL),XL ELSE DELETE OLD TRACE ASSOCIATION ! 21673: * ! 21674: * HERE WITH OLD LABEL TRACE ASSOCIATION DELETED ! 21675: * ! 21676: TRC04 BEQ XL,=STNDL,TRC16 ERROR IF UNDEFINED LABEL ! 21677: MOV (XS)+,WB GET TRBLK PTR AGAIN ! 21678: BZE WB,TRC05 JUMP IF STOPTR CASE ! 21679: MOV WB,VRLBL(XR) ELSE SET NEW TRBLK POINTER ! 21680: MOV =B$VRT,VRTRA(XR) SET LABEL TRACE ROUTINE ADDRESS ! 21681: MOV WB,XR COPY TRBLK POINTER ! 21682: MOV XL,TRLBL(XR) STORE REAL LABEL IN TRBLK ! 21683: EXI RETURN ! 21684: * ! 21685: * HERE FOR STOPTR CASE FOR LABEL ! 21686: * ! 21687: TRC05 MOV XL,VRLBL(XR) STORE LABEL PTR BACK IN VRBLK ! 21688: MOV =B$VRG,VRTRA(XR) STORE NORMAL TRANSFER ADDRESS ! 21689: EXI RETURN ! 21690: EJC ! 21691: * ! 21692: * TRACE (CONTINUED) ! 21693: * ! 21694: * HERE FOR K (KEYWORD) ! 21695: * ! 21696: TRC06 JSR GTNVR POINT TO VRBLK ! 21697: PPM TRC16 ERROR IF NOT NATURAL VAR ! 21698: BNZ VRLEN(XR),TRC16 ERROR IF NOT SYSTEM VAR ! 21699: ICA XS POP STACK ! 21700: BZE XL,TRC07 JUMP IF STOPTR CASE ! 21701: MOV XR,TRKVR(XL) STORE VRBLK PTR IN TRBLK FOR KTREX ! 21702: * ! 21703: * MERGE HERE WITH TRBLK SET UP IN WB (OR ZERO) ! 21704: * ! 21705: TRC07 MOV VRSVP(XR),XR POINT TO SVBLK ! 21706: BEQ XR,=V$ERT,TRC08 JUMP IF ERRTYPE ! 21707: BEQ XR,=V$STC,TRC09 JUMP IF STCOUNT ! 21708: BNE XR,=V$FNC,TRC17 ELSE ERROR IF NOT FNCLEVEL ! 21709: * ! 21710: * FNCLEVEL ! 21711: * ! 21712: MOV XL,R$FNC SET/RESET FNCLEVEL TRACE ! 21713: EXI RETURN ! 21714: * ! 21715: * ERRTYPE ! 21716: * ! 21717: TRC08 MOV XL,R$ERT SET/RESET ERRTYPE TRACE ! 21718: EXI RETURN ! 21719: * ! 21720: * STCOUNT ! 21721: * ! 21722: TRC09 MOV XL,R$STC SET/RESET STCOUNT TRACE ! 21723: EXI RETURN ! 21724: EJC ! 21725: * ! 21726: * TRACE (CONTINUED) ! 21727: * ! 21728: * A,V MERGE HERE WITH TRTYP VALUE IN WC ! 21729: * ! 21730: TRC10 JSR GTVAR LOCATE VARIABLE ! 21731: PPM TRC16 ERROR IF NOT APPROPRIATE NAME ! 21732: MOV (XS)+,WB GET NEW TRBLK PTR AGAIN ! 21733: ADD XL,WA POINT TO VARIABLE LOCATION ! 21734: MOV WA,XR COPY VARIABLE POINTER ! 21735: * ! 21736: * LOOP TO SEARCH TRBLK CHAIN ! 21737: * ! 21738: TRC11 MOV (XR),XL POINT TO NEXT ENTRY ! 21739: BNE (XL),=B$TRT,TRC13 JUMP IF NOT TRBLK ! 21740: BLT WC,TRTYP(XL),TRC13 JUMP IF TOO FAR OUT ON CHAIN ! 21741: BEQ WC,TRTYP(XL),TRC12 JUMP IF THIS MATCHES OUR TYPE ! 21742: ADD *TRNXT,XL ELSE POINT TO LINK FIELD ! 21743: MOV XL,XR COPY POINTER ! 21744: BRN TRC11 AND LOOP BACK ! 21745: * ! 21746: * HERE TO DELETE AN OLD TRBLK OF THE TYPE WE WERE GIVEN ! 21747: * ! 21748: TRC12 MOV TRNXT(XL),XL GET PTR TO NEXT BLOCK OR VALUE ! 21749: MOV XL,(XR) STORE TO DELETE THIS TRBLK ! 21750: * ! 21751: * HERE AFTER DELETING ANY OLD ASSOCIATION OF THIS TYPE ! 21752: * ! 21753: TRC13 BZE WB,TRC14 JUMP IF STOPTR CASE ! 21754: MOV WB,(XR) ELSE LINK NEW TRBLK IN ! 21755: MOV WB,XR COPY TRBLK POINTER ! 21756: MOV XL,TRNXT(XR) STORE FORWARD POINTER ! 21757: MOV WC,TRTYP(XR) STORE APPROPRIATE TRAP TYPE CODE ! 21758: * ! 21759: * HERE TO MAKE SURE VRGET,VRSTO ARE SET PROPERLY ! 21760: * ! 21761: TRC14 MOV WA,XR RECALL POSSIBLE VRBLK POINTER ! 21762: SUB *VRVAL,XR POINT BACK TO VRBLK ! 21763: JSR SETVR SET FIELDS IF VRBLK ! 21764: EXI RETURN ! 21765: * ! 21766: * HERE FOR BAD TRACE TYPE ! 21767: * ! 21768: TRC15 EXI 2 TAKE BAD TRACE TYPE ERROR EXIT ! 21769: * ! 21770: * POP STACK BEFORE FAILING ! 21771: * ! 21772: TRC16 ICA XS POP STACK ! 21773: * ! 21774: * HERE FOR BAD NAME ARGUMENT ! 21775: * ! 21776: TRC17 EXI 1 TAKE BAD NAME ERROR EXIT ! 21777: ENP END PROCEDURE TRACE ! 21778: EJC ! 21779: * ! 21780: * TRBLD -- BUILD TRBLK ! 21781: * ! 21782: * TRBLK IS USED BY THE INPUT, OUTPUT AND TRACE FUNCTIONS ! 21783: * TO CONSTRUCT A TRBLK (TRAP BLOCK) ! 21784: * ! 21785: * (XR) TRTAG OR TRTER ! 21786: * (XL) TRFNC OR TRFPT ! 21787: * (WB) TRTYP ! 21788: * JSR TRBLD CALL TO BUILD TRBLK ! 21789: * (XR) POINTER TO TRBLK ! 21790: * (WA) DESTROYED ! 21791: * ! 21792: TRBLD PRC E,0 ENTRY POINT ! 21793: MOV XR,-(XS) STACK TRTAG (OR TRFNM) ! 21794: MOV *TRSI$,WA SET SIZE OF TRBLK ! 21795: JSR ALLOC ALLOCATE TRBLK ! 21796: MOV =B$TRT,(XR) STORE FIRST WORD ! 21797: MOV XL,TRFNC(XR) STORE TRFNC (OR TRFPT) ! 21798: MOV (XS)+,TRTAG(XR) STORE TRTAG (OR TRFNM) ! 21799: MOV WB,TRTYP(XR) STORE TYPE ! 21800: MOV =NULLS,TRVAL(XR) FOR NOW, A NULL VALUE ! 21801: EXI RETURN TO CALLER ! 21802: ENP END PROCEDURE TRBLD ! 21803: EJC ! 21804: * ! 21805: * TRIMR -- TRIM TRAILING BLANKS ! 21806: * ! 21807: * TRIMR IS PASSED A POINTER TO AN SCBLK WHICH MUST BE THE ! 21808: * LAST BLOCK IN DYNAMIC STORAGE. TRAILING BLANKS ARE ! 21809: * TRIMMED OFF AND THE DYNAMIC STORAGE POINTER RESET TO ! 21810: * THE END OF THE (POSSIBLY) SHORTENED BLOCK. ! 21811: * ! 21812: * (WB) NON-ZERO TO TRIM TRAILING BLANKS ! 21813: * (XR) POINTER TO STRING TO TRIM ! 21814: * JSR TRIMR CALL TO TRIM STRING ! 21815: * (XR) POINTER TO TRIMMED STRING ! 21816: * (XL,WA,WB,WC) DESTROYED ! 21817: * ! 21818: * THE CALL WITH WB ZERO STILL PERFORMS THE END ZERO PAD ! 21819: * AND DNAMP READJUSTMENT. IT IS USED FROM ACESS IF KVTRM=0. ! 21820: * ! 21821: TRIMR PRC E,0 ENTRY POINT ! 21822: MOV XR,XL COPY STRING POINTER ! 21823: MOV SCLEN(XR),WA LOAD STRING LENGTH ! 21824: BZE WA,TRIM2 JUMP IF NULL INPUT ! 21825: PLC XL,WA ELSE POINT PAST LAST CHARACTER ! 21826: BZE WB,TRIM3 JUMP IF NO TRIM ! 21827: MOV =CH$BL,WC LOAD BLANK CHARACTER ! 21828: * ! 21829: * LOOP THROUGH CHARACTERS FROM RIGHT TO LEFT ! 21830: * ! 21831: TRIM0 LCH WB,-(XL) LOAD NEXT CHARACTER ! 21832: BEQ WB,=CH$HT,TRIM1 JUMP IF HORIZONTAL TAB ! 21833: BNE WB,WC,TRIM3 JUMP IF NON-BLANK FOUND ! 21834: TRIM1 DCV WA ELSE DECREMENT CHARACTER COUNT ! 21835: BNZ WA,TRIM0 LOOP BACK IF MORE TO CHECK ! 21836: * ! 21837: * HERE IF RESULT IS NULL (NULL OR ALL-BLANK INPUT) ! 21838: * ! 21839: TRIM2 MOV XR,DNAMP WIPE OUT INPUT STRING BLOCK ! 21840: MOV =NULLS,XR LOAD NULL RESULT ! 21841: BRN TRIM5 MERGE TO EXIT ! 21842: EJC ! 21843: * ! 21844: * TRIMR (CONTINUED) ! 21845: * ! 21846: * HERE WITH NON-BLANK FOUND (MERGE FOR NO TRIM) ! 21847: * ! 21848: TRIM3 MOV WA,SCLEN(XR) SET NEW LENGTH ! 21849: MOV XR,XL COPY STRING POINTER ! 21850: PSC XL,WA READY FOR STORING BLANKS ! 21851: CTB WA,SCHAR GET LENGTH OF BLOCK IN BYTES ! 21852: ADD XR,WA POINT PAST NEW BLOCK ! 21853: MOV WA,DNAMP SET NEW TOP OF STORAGE POINTER ! 21854: LCT WA,=CFP$C GET COUNT OF CHARS IN WORD ! 21855: ZER WC SET BLANK CHAR ! 21856: * ! 21857: * LOOP TO ZERO PAD LAST WORD OF CHARACTERS ! 21858: * ! 21859: TRIM4 SCH WC,(XL)+ STORE ZERO CHARACTER ! 21860: BCT WA,TRIM4 LOOP BACK TILL ALL STORED ! 21861: CSC XL COMPLETE STORE CHARACTERS ! 21862: * ! 21863: * COMMON EXIT POINT ! 21864: * ! 21865: TRIM5 ZER XL CLEAR GARBAGE XL POINTER ! 21866: EXI RETURN TO CALLER ! 21867: ENP END PROCEDURE TRIMR ! 21868: EJC ! 21869: * ! 21870: * TRXEQ -- EXECUTE FUNCTION TYPE TRACE ! 21871: * ! 21872: * TRXEQ IS USED TO EXECUTE A TRACE WHEN A FOURTH ARGUMENT ! 21873: * HAS BEEN SUPPLIED. TRACE HAS ALREADY BEEN DECREMENTED. ! 21874: * ! 21875: * (XR) POINTER TO TRBLK ! 21876: * (XL,WA) NAME BASE,OFFSET FOR VARIABLE ! 21877: * JSR TRXEQ CALL TO EXECUTE TRACE ! 21878: * (WB,WC,RA) DESTROYED ! 21879: * ! 21880: * THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING ! 21881: * CONTROL TO THE TRACE FUNCTION USING THE CFUNC ROUTINE. ! 21882: * ! 21883: * TRXEQ RETURN POINT WORD(S) ! 21884: * SAVED VALUE OF TRACE KEYWORD ! 21885: * TRBLK POINTER ! 21886: * NAME BASE ! 21887: * NAME OFFSET ! 21888: * SAVED VALUE OF R$COD ! 21889: * SAVED CODE PTR (-R$COD) ! 21890: * SAVED VALUE OF FLPTR ! 21891: * FLPTR --------------- ZERO (DUMMY FAIL OFFSET) ! 21892: * NMBLK FOR VARIABLE NAME ! 21893: * XS ------------------ TRACE TAG ! 21894: * ! 21895: * R$COD AND THE CODE PTR ARE SET TO DUMMY VALUES WHICH ! 21896: * CAUSE CONTROL TO RETURN TO THE TRXEQ PROCEDURE ON SUCCESS ! 21897: * OR FAILURE (TRXEQ IGNORES A FAILURE CONDITION). ! 21898: * ! 21899: TRXEQ PRC R,0 ENTRY POINT (RECURSIVE) ! 21900: MOV R$COD,WC LOAD CODE BLOCK POINTER ! 21901: SCP WB GET CURRENT CODE POINTER ! 21902: SUB WC,WB MAKE CODE POINTER INTO OFFSET ! 21903: MOV KVTRA,-(XS) STACK TRACE KEYWORD VALUE ! 21904: MOV XR,-(XS) STACK TRBLK POINTER ! 21905: MOV XL,-(XS) STACK NAME BASE ! 21906: MOV WA,-(XS) STACK NAME OFFSET ! 21907: MOV WC,-(XS) STACK CODE BLOCK POINTER ! 21908: MOV WB,-(XS) STACK CODE POINTER OFFSET ! 21909: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER ! 21910: ZER -(XS) SET DUMMY FAIL OFFSET ! 21911: MOV XS,FLPTR SET NEW FAILURE POINTER ! 21912: ZER KVTRA RESET TRACE KEYWORD TO ZERO ! 21913: MOV =TRXDC,WC LOAD NEW (DUMMY) CODE BLK POINTER ! 21914: MOV WC,R$COD SET AS CODE BLOCK POINTER ! 21915: LCP WC AND NEW CODE POINTER ! 21916: EJC ! 21917: * ! 21918: * TRXEQ (CONTINUED) ! 21919: * ! 21920: * NOW PREPARE ARGUMENTS FOR FUNCTION ! 21921: * ! 21922: MOV WA,WB SAVE NAME OFFSET ! 21923: MOV *NMSI$,WA LOAD NMBLK SIZE ! 21924: JSR ALLOC ALLOCATE SPACE FOR NMBLK ! 21925: MOV =B$NML,(XR) SET TYPE WORD ! 21926: MOV XL,NMBAS(XR) STORE NAME BASE ! 21927: MOV WB,NMOFS(XR) STORE NAME OFFSET ! 21928: MOV 6(XS),XL RELOAD POINTER TO TRBLK ! 21929: MOV XR,-(XS) STACK NMBLK POINTER (1ST ARGUMENT) ! 21930: MOV TRTAG(XL),-(XS) STACK TRACE TAG (2ND ARGUMENT) ! 21931: MOV TRFNC(XL),XL LOAD TRACE FUNCTION POINTER ! 21932: MOV =NUM02,WA SET NUMBER OF ARGUMENTS TO TWO ! 21933: BRN CFUNC JUMP TO CALL FUNCTION ! 21934: * ! 21935: * SEE O$TXR FOR DETAILS OF RETURN TO THIS POINT ! 21936: * ! 21937: TRXQ1 MOV FLPTR,XS POINT BACK TO OUR STACK ENTRIES ! 21938: ICA XS POP OFF GARBAGE FAIL OFFSET ! 21939: MOV (XS)+,FLPTR RESTORE OLD FAILURE POINTER ! 21940: MOV (XS)+,WB RELOAD CODE OFFSET ! 21941: MOV (XS)+,WC LOAD OLD CODE BASE POINTER ! 21942: MOV WC,XR COPY CDBLK POINTER ! 21943: MOV CDSTM(XR),KVSTN RESTORE STMNT NO ! 21944: MOV (XS)+,WA RELOAD NAME OFFSET ! 21945: MOV (XS)+,XL RELOAD NAME BASE ! 21946: MOV (XS)+,XR RELOAD TRBLK POINTER ! 21947: MOV (XS)+,KVTRA RESTORE TRACE KEYWORD VALUE ! 21948: ADD WC,WB RECOMPUTE ABSOLUTE CODE POINTER ! 21949: LCP WB RESTORE CODE POINTER ! 21950: MOV WC,R$COD AND CODE BLOCK POINTER ! 21951: EXI RETURN TO TRXEQ CALLER ! 21952: ENP END PROCEDURE TRXEQ ! 21953: EJC ! 21954: * ! 21955: * XSCAN -- EXECUTION FUNCTION ARGUMENT SCAN ! 21956: * ! 21957: * XSCAN SCANS OUT ONE TOKEN IN A PROTOTYPE ARGUMENT IN ! 21958: * ARRAY,CLEAR,DATA,DEFINE,LOAD FUNCTION CALLS. XSCAN ! 21959: * CALLS MUST BE PRECEDED BY A CALL TO THE INITIALIZATION ! 21960: * PROCEDURE XSCNI. THE FOLLOWING VARIABLES ARE USED. ! 21961: * ! 21962: * R$XSC POINTER TO SCBLK FOR FUNCTION ARG ! 21963: * XSOFS OFFSET (NUM CHARS SCANNED SO FAR) ! 21964: * ! 21965: * (WC) DELIMITER ONE (CH$XX) ! 21966: * (XL) DELIMITER TWO (CH$XX) ! 21967: * JSR XSCAN CALL TO SCAN NEXT ITEM ! 21968: * (XR) POINTER TO SCBLK FOR TOKEN SCANNED ! 21969: * (WA) COMPLETION CODE (SEE BELOW) ! 21970: * (WC,XL) DESTROYED ! 21971: * ! 21972: * THE SCAN STARTS FROM THE CURRENT POSITION AND CONTINUES ! 21973: * UNTIL ONE OF THE FOLLOWING THREE CONDITIONS OCCURS. ! 21974: * ! 21975: * 1) DELIMITER ONE IS ENCOUNTERED (WA SET TO 1) ! 21976: * ! 21977: * 2) DELIMITER TWO ENCOUNTERED (WA SET TO 2) ! 21978: * ! 21979: * 3) END OF STRING ENCOUNTERED (WA SET TO 0) ! 21980: * ! 21981: * THE RESULT IS A STRING CONTAINING ALL CHARACTERS SCANNED ! 21982: * UP TO BUT NOT INCLUDING ANY DELIMITER CHARACTER. ! 21983: * THE POINTER IS LEFT POINTING PAST THE DELIMITER. ! 21984: * ! 21985: * IF ONLY ONE DELIMITER IS TO BE DETECTED, DELIMITER ONE ! 21986: * AND DELIMITER TWO SHOULD BE SET TO THE SAME VALUE. ! 21987: * ! 21988: * IN THE CASE WHERE THE END OF STRING IS ENCOUNTERED, THE ! 21989: * STRING INCLUDES ALL THE CHARACTERS TO THE END OF THE ! 21990: * STRING. NO FURTHER CALLS CAN BE MADE TO XSCAN UNTIL ! 21991: * XSCNI IS CALLED TO INITIALIZE A NEW ARGUMENT SCAN ! 21992: EJC ! 21993: * ! 21994: * XSCAN (CONTINUED) ! 21995: * ! 21996: XSCAN PRC E,0 ENTRY POINT ! 21997: MOV WB,XSCWB PRESERVE WB ! 21998: MOV R$XSC,XR POINT TO ARGUMENT STRING ! 21999: MOV SCLEN(XR),WA LOAD STRING LENGTH ! 22000: MOV XSOFS,WB LOAD CURRENT OFFSET ! 22001: SUB WB,WA GET NUMBER OF REMAINING CHARACTERS ! 22002: BZE WA,XSCN2 JUMP IF NO CHARACTERS LEFT ! 22003: PLC XR,WB POINT TO CURRENT CHARACTER ! 22004: * ! 22005: * LOOP TO SEARCH FOR DELIMITER ! 22006: * ! 22007: XSCN1 LCH WB,(XR)+ LOAD NEXT CHARACTER ! 22008: BEQ WB,WC,XSCN3 JUMP IF DELIMITER ONE FOUND ! 22009: BEQ WB,XL,XSCN4 JUMP IF DELIMITER TWO FOUND ! 22010: DCV WA DECREMENT COUNT OF CHARS LEFT ! 22011: BNZ WA,XSCN1 LOOP BACK IF MORE CHARS TO GO ! 22012: * ! 22013: * HERE FOR RUNOUT ! 22014: * ! 22015: XSCN2 MOV R$XSC,XL POINT TO STRING BLOCK ! 22016: MOV SCLEN(XL),WA GET STRING LENGTH ! 22017: MOV XSOFS,WB LOAD OFFSET ! 22018: SUB WB,WA GET SUBSTRING LENGTH ! 22019: ZER R$XSC CLEAR STRING PTR FOR COLLECTOR ! 22020: ZER XSCRT SET ZERO (RUNOUT) RETURN CODE ! 22021: BRN XSCN6 JUMP TO EXIT ! 22022: EJC ! 22023: * ! 22024: * XSCAN (CONTINUED) ! 22025: * ! 22026: * HERE IF DELIMITER ONE FOUND ! 22027: * ! 22028: XSCN3 MOV =NUM01,XSCRT SET RETURN CODE ! 22029: BRN XSCN5 JUMP TO MERGE ! 22030: * ! 22031: * HERE IF DELIMITER TWO FOUND ! 22032: * ! 22033: XSCN4 MOV =NUM02,XSCRT SET RETURN CODE ! 22034: * ! 22035: * MERGE HERE AFTER DETECTING A DELIMITER ! 22036: * ! 22037: XSCN5 MOV R$XSC,XL RELOAD POINTER TO STRING ! 22038: MOV SCLEN(XL),WC GET ORIGINAL LENGTH OF STRING ! 22039: SUB WA,WC MINUS CHARS LEFT = CHARS SCANNED ! 22040: MOV WC,WA MOVE TO REG FOR SBSTR ! 22041: MOV XSOFS,WB SET OFFSET ! 22042: SUB WB,WA COMPUTE LENGTH FOR SBSTR ! 22043: ICV WC ADJUST NEW CURSOR PAST DELIMITER ! 22044: MOV WC,XSOFS STORE NEW OFFSET ! 22045: * ! 22046: * COMMON EXIT POINT ! 22047: * ! 22048: XSCN6 ZER XR CLEAR GARBAGE CHARACTER PTR IN XR ! 22049: JSR SBSTR BUILD SUB-STRING ! 22050: MOV XSCRT,WA LOAD RETURN CODE ! 22051: MOV XSCWB,WB RESTORE WB ! 22052: EXI RETURN TO XSCAN CALLER ! 22053: ENP END PROCEDURE XSCAN ! 22054: EJC ! 22055: * ! 22056: * XSCNI -- EXECUTION FUNCTION ARGUMENT SCAN ! 22057: * ! 22058: * XSCNI INITIALIZES THE SCAN USED FOR PROTOTYPE ARGUMENTS ! 22059: * IN THE CLEAR, DEFINE, LOAD, DATA, ARRAY FUNCTIONS. SEE ! 22060: * XSCAN FOR THE PROCEDURE WHICH IS USED AFTER THIS CALL. ! 22061: * ! 22062: * -(XS) ARGUMENT TO BE SCANNED (ON STACK) ! 22063: * JSR XSCNI CALL TO SCAN ARGUMENT ! 22064: * PPM LOC TRANSFER LOC IF ARG IS NOT STRING ! 22065: * PPM LOC TRANSFER LOC IF ARGUMENT IS NULL ! 22066: * (XS) POPPED ! 22067: * (XR,R$XSC) ARGUMENT (SCBLK PTR) ! 22068: * (WA) ARGUMENT LENGTH ! 22069: * (IA,RA) DESTROYED ! 22070: * ! 22071: XSCNI PRC N,2 ENTRY POINT ! 22072: JSR GTSTG FETCH ARGUMENT AS STRING ! 22073: PPM XSCI1 JUMP IF NOT CONVERTIBLE ! 22074: MOV XR,R$XSC ELSE STORE SCBLK PTR FOR XSCAN ! 22075: ZER XSOFS SET OFFSET TO ZERO ! 22076: BZE WA,XSCI2 JUMP IF NULL STRING ! 22077: EXI RETURN TO XSCNI CALLER ! 22078: * ! 22079: * HERE IF ARGUMENT IS NOT A STRING ! 22080: * ! 22081: XSCI1 EXI 1 TAKE NOT-STRING ERROR EXIT ! 22082: * ! 22083: * HERE FOR NULL STRING ! 22084: * ! 22085: XSCI2 EXI 2 TAKE NULL-STRING ERROR EXIT ! 22086: ENP END PROCEDURE XSCNI ! 22087: TTL S P I T B O L -- UTILITY ROUTINES ! 22088: * ! 22089: * THE FOLLOWING SECTION CONTAINS UTILITY ROUTINES USED FOR ! 22090: * VARIOUS PURPOSES THROUGHOUT THE SYSTEM. THESE DIFFER ! 22091: * FROM THE PROCEDURES IN THE UTILITY PROCEDURES SECTION IN ! 22092: * THEY ARE NOT IN PROCEDURE FORM AND THEY DO NOT RETURN ! 22093: * TO THEIR CALLERS. THEY ARE ACCESSED WITH A BRANCH TYPE ! 22094: * INSTRUCTION AFTER SETTING THE REGISTERS TO APPROPRIATE ! 22095: * PARAMETER VALUES. ! 22096: * ! 22097: * THE REGISTER VALUES REQUIRED FOR EACH ROUTINE ARE ! 22098: * DOCUMENTED AT THE START OF EACH ROUTINE. REGISTERS NOT ! 22099: * MENTIONED MAY CONTAIN ANY VALUES EXCEPT THAT XR,XL ! 22100: * CAN ONLY CONTAIN PROPER COLLECTABLE POINTERS. ! 22101: * ! 22102: * SOME OF THESE ROUTINES WILL TOLERATE GARBAGE POINTERS ! 22103: * IN XL,XR ON ENTRY. THIS IS ALWAYS DOCUMENTED AND IN ! 22104: * EACH CASE, THE ROUTINE CLEARS THESE GARBAGE VALUES BEFORE ! 22105: * EXITING AFTER COMPLETING ITS TASK. ! 22106: * ! 22107: * THE ROUTINES HAVE NAMES CONSISTING OF FIVE LETTERS ! 22108: * AND ARE ASSEMBLED IN ALPHABETICAL ORDER. ! 22109: EJC ! 22110: * ARREF -- ARRAY REFERENCE ! 22111: * ! 22112: * (XL) MAY BE NON-COLLECTABLE ! 22113: * (XR) NUMBER OF SUBSCRIPTS ! 22114: * (WB) SET ZERO/NONZERO FOR VALUE/NAME ! 22115: * THE VALUE IN WB MUST BE COLLECTABLE ! 22116: * STACK SUBSCRIPTS AND ARRAY OPERAND ! 22117: * BRN ARREF JUMP TO CALL FUNCTION ! 22118: * ! 22119: * ARREF CONTINUES BY EXECUTING THE NEXT CODE WORD WITH ! 22120: * THE RESULT NAME OR VALUE PLACED ON TOP OF THE STACK. ! 22121: * TO DEAL WITH THE PROBLEM OF ACCESSING SUBSCRIPTS IN THE ! 22122: * ORDER OF STACKING, XL IS USED AS A SUBSCRIPT POINTER ! 22123: * WORKING BELOW THE STACK POINTER. ! 22124: * ! 22125: ARREF RTN ! 22126: MOV XR,WA COPY NUMBER OF SUBSCRIPTS ! 22127: MOV XS,XT POINT TO STACK FRONT ! 22128: WTB XR CONVERT TO BYTE OFFSET ! 22129: ADD XR,XT POINT TO ARRAY OPERAND ON STACK ! 22130: ICA XT FINAL VALUE FOR STACK POPPING ! 22131: MOV XT,ARFXS KEEP FOR LATER ! 22132: MOV -(XT),XR LOAD ARRAY OPERAND POINTER ! 22133: MOV XR,R$ARF KEEP ARRAY POINTER ! 22134: MOV XT,XR SAVE POINTER TO SUBSCRIPTS ! 22135: MOV R$ARF,XL POINT XL TO POSSIBLE VCBLK OR TBBLK ! 22136: MOV (XL),WC LOAD FIRST WORD ! 22137: BEQ WC,=B$ART,ARF01 JUMP IF ARBLK ! 22138: BEQ WC,=B$VCT,ARF07 JUMP IF VCBLK ! 22139: BEQ WC,=B$TBT,ARF10 JUMP IF TBBLK ! 22140: ERB 235,SUBSCRIPTED OPERAND IS NOT TABLE OR ARRAY ! 22141: * ! 22142: * HERE FOR ARRAY (ARBLK) ! 22143: * ! 22144: ARF01 BNE WA,ARNDM(XL),ARF09 JUMP IF WRONG NUMBER OF DIMS ! 22145: LDI INTV0 GET INITIAL SUBSCRIPT OF ZERO ! 22146: MOV XR,XT POINT BEFORE SUBSCRIPTS ! 22147: ZER WA INITIAL OFFSET TO BOUNDS ! 22148: BRN ARF03 JUMP INTO LOOP ! 22149: * ! 22150: * LOOP TO COMPUTE SUBSCRIPTS BY MULTIPLICATIONS ! 22151: * ! 22152: ARF02 MLI ARDM2(XR) MULTIPLY TOTAL BY NEXT DIMENSION ! 22153: * ! 22154: * MERGE HERE FIRST TIME ! 22155: * ! 22156: ARF03 MOV -(XT),XR LOAD NEXT SUBSCRIPT ! 22157: STI ARFSI SAVE CURRENT SUBSCRIPT ! 22158: LDI ICVAL(XR) LOAD INTEGER VALUE IN CASE ! 22159: BEQ (XR),=B$ICL,ARF04 JUMP IF IT WAS AN INTEGER ! 22160: EJC ! 22161: * ! 22162: * ARREF (CONTINUED) ! 22163: * ! 22164: * ! 22165: JSR GTINT CONVERT TO INTEGER ! 22166: PPM ARF12 JUMP IF NOT INTEGER ! 22167: LDI ICVAL(XR) IF OK, LOAD INTEGER VALUE ! 22168: * ! 22169: * HERE WITH INTEGER SUBSCRIPT IN (IA) ! 22170: * ! 22171: ARF04 MOV R$ARF,XR POINT TO ARRAY ! 22172: ADD WA,XR OFFSET TO NEXT BOUNDS ! 22173: SBI ARLBD(XR) SUBTRACT LOW BOUND TO COMPARE ! 22174: IOV ARF13 OUT OF RANGE FAIL IF OVERFLOW ! 22175: ILT ARF13 OUT OF RANGE FAIL IF TOO SMALL ! 22176: SBI ARDIM(XR) SUBTRACT DIMENSION ! 22177: IGE ARF13 OUT OF RANGE FAIL IF TOO LARGE ! 22178: ADI ARDIM(XR) ELSE RESTORE SUBSCRIPT OFFSET ! 22179: ADI ARFSI ADD TO CURRENT TOTAL ! 22180: ADD *ARDMS,WA POINT TO NEXT BOUNDS ! 22181: BNE XT,XS,ARF02 LOOP BACK IF MORE TO GO ! 22182: * ! 22183: * HERE WITH INTEGER SUBSCRIPT COMPUTED ! 22184: * ! 22185: MFI WA GET AS ONE WORD INTEGER ! 22186: WTB WA CONVERT TO OFFSET ! 22187: MOV R$ARF,XL POINT TO ARBLK ! 22188: ADD AROFS(XL),WA ADD OFFSET PAST BOUNDS ! 22189: ICA WA ADJUST FOR ARPRO FIELD ! 22190: BNZ WB,ARF08 EXIT WITH NAME IF NAME CALL ! 22191: * ! 22192: * MERGE HERE TO GET VALUE FOR VALUE CALL ! 22193: * ! 22194: ARF05 JSR ACESS GET VALUE ! 22195: PPM ARF13 FAIL IF ACESS FAILS ! 22196: * ! 22197: * RETURN VALUE ! 22198: * ! 22199: ARF06 MOV ARFXS,XS POP STACK ENTRIES ! 22200: ZER R$ARF FINISHED WITH ARRAY POINTER ! 22201: BRN EXIXR EXIT WITH VALUE IN XR ! 22202: EJC ! 22203: * ! 22204: * ARREF (CONTINUED) ! 22205: * ! 22206: * HERE FOR VECTOR ! 22207: * ! 22208: ARF07 BNE WA,=NUM01,ARF09 ERROR IF MORE THAN 1 SUBSCRIPT ! 22209: MOV (XS),XR ELSE LOAD SUBSCRIPT ! 22210: JSR GTINT CONVERT TO INTEGER ! 22211: PPM ARF12 ERROR IF NOT INTEGER ! 22212: LDI ICVAL(XR) ELSE LOAD INTEGER VALUE ! 22213: SBI INTV1 SUBTRACT FOR ONES OFFSET ! 22214: MFI WA,ARF13 GET SUBSCRIPT AS ONE WORD ! 22215: ADD =VCVLS,WA ADD OFFSET FOR STANDARD FIELDS ! 22216: WTB WA CONVERT OFFSET TO BYTES ! 22217: BGE WA,VCLEN(XL),ARF13 FAIL IF OUT OF RANGE SUBSCRIPT ! 22218: BZE WB,ARF05 BACK TO GET VALUE IF VALUE CALL ! 22219: * ! 22220: * RETURN NAME ! 22221: * ! 22222: ARF08 MOV ARFXS,XS POP STACK ENTRIES ! 22223: ZER R$ARF FINISHED WITH ARRAY POINTER ! 22224: BRN EXNAM ELSE EXIT WITH NAME ! 22225: * ! 22226: * HERE IF SUBSCRIPT COUNT IS WRONG ! 22227: * ! 22228: ARF09 ERB 236,ARRAY REFERENCED WITH WRONG NUMBER OF SUBSCRIPTS ! 22229: * ! 22230: * TABLE ! 22231: * ! 22232: ARF10 BNE WA,=NUM01,ARF11 ERROR IF MORE THAN 1 SUBSCRIPT ! 22233: MOV (XS),XR ELSE LOAD SUBSCRIPT ! 22234: JSR TFIND CALL TABLE SEARCH ROUTINE ! 22235: PPM ARF13 FAIL IF FAILED ! 22236: BNZ WB,ARF08 EXIT WITH NAME IF NAME CALL ! 22237: BRN ARF06 ELSE EXIT WITH VALUE ! 22238: * ! 22239: * HERE FOR BAD TABLE REFERENCE ! 22240: * ! 22241: ARF11 ERB 237,TABLE REFERENCED WITH MORE THAN ONE SUBSCRIPT ! 22242: * ! 22243: * HERE FOR BAD SUBSCRIPT ! 22244: * ! 22245: ARF12 ERB 238,ARRAY SUBSCRIPT IS NOT INTEGER ! 22246: * ! 22247: * HERE TO SIGNAL FAILURE ! 22248: * ! 22249: ARF13 ZER R$ARF FINISHED WITH ARRAY POINTER ! 22250: BRN EXFAL FAIL ! 22251: EJC ! 22252: * ! 22253: * CFUNC -- CALL A FUNCTION ! 22254: * ! 22255: * CFUNC IS USED TO CALL A SNOBOL LEVEL FUNCTION. IT IS ! 22256: * USED BY THE APPLY FUNCTION (S$APP), THE FUNCTION ! 22257: * TRACE ROUTINE (TRXEQ) AND THE MAIN FUNCTION CALL ENTRY ! 22258: * (O$FNC, O$FNS). IN THE LATTER CASES, CFUNC IS USED ONLY ! 22259: * IF THE NUMBER OF ARGUMENTS IS INCORRECT. ! 22260: * ! 22261: * (XL) POINTER TO FUNCTION BLOCK ! 22262: * (WA) ACTUAL NUMBER OF ARGUMENTS ! 22263: * (XS) POINTS TO STACKED ARGUMENTS ! 22264: * BRN CFUNC JUMP TO CALL FUNCTION ! 22265: * ! 22266: * CFUNC CONTINUES BY EXECUTING THE FUNCTION ! 22267: * ! 22268: CFUNC RTN ! 22269: BLT WA,FARGS(XL),CFNC1 JUMP IF TOO FEW ARGUMENTS ! 22270: BEQ WA,FARGS(XL),CFNC3 JUMP IF CORRECT NUMBER OF ARGS ! 22271: * ! 22272: * HERE IF TOO MANY ARGUMENTS SUPPLIED, POP THEM OFF ! 22273: * ! 22274: MOV WA,WB COPY ACTUAL NUMBER ! 22275: SUB FARGS(XL),WB GET NUMBER OF EXTRA ARGS ! 22276: WTB WB CONVERT TO BYTES ! 22277: ADD WB,XS POP OFF UNWANTED ARGUMENTS ! 22278: BRN CFNC3 JUMP TO GO OFF TO FUNCTION ! 22279: * ! 22280: * HERE IF TOO FEW ARGUMENTS ! 22281: * ! 22282: CFNC1 MOV FARGS(XL),WB LOAD REQUIRED NUMBER OF ARGUMENTS ! 22283: BEQ WB,=NINI9,CFNC3 JUMP IF CASE OF VAR NUM OF ARGS ! 22284: SUB WA,WB CALCULATE NUMBER MISSING ! 22285: LCT WB,WB SET COUNTER TO CONTROL LOOP ! 22286: * ! 22287: * LOOP TO SUPPLY EXTRA NULL ARGUMENTS ! 22288: * ! 22289: CFNC2 MOV =NULLS,-(XS) STACK A NULL ARGUMENT ! 22290: BCT WB,CFNC2 LOOP TILL PROPER NUMBER STACKED ! 22291: * ! 22292: * MERGE HERE TO JUMP TO FUNCTION ! 22293: * ! 22294: CFNC3 BRI (XL) JUMP THROUGH FCODE FIELD ! 22295: EJC ! 22296: * ! 22297: * EXFAL -- EXIT SIGNALLING SNOBOL FAILURE ! 22298: * ! 22299: * (XL,XR) MAY BE NON-COLLECTABLE ! 22300: * BRN EXFAL JUMP TO FAIL ! 22301: * ! 22302: * EXFAL CONTINUES BY EXECUTING THE APPROPRIATE FAIL GOTO ! 22303: * ! 22304: EXFAL RTN ! 22305: MOV FLPTR,XS POP STACK ! 22306: MOV (XS),XR LOAD FAILURE OFFSET ! 22307: ADD R$COD,XR POINT TO FAILURE CODE LOCATION ! 22308: LCP XR SET CODE POINTER ! 22309: BRN EXITS DO NEXT CODE WORD ! 22310: EJC ! 22311: * ! 22312: * EXINT -- EXIT WITH INTEGER RESULT ! 22313: * ! 22314: * (XL,XR) MAY BE NONCOLLECTABLE ! 22315: * (IA) INTEGER VALUE ! 22316: * BRN EXINT JUMP TO EXIT WITH INTEGER ! 22317: * ! 22318: * EXINT CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22319: * WHICH IT DOES BY FALLING THROUGH TO EXIXR ! 22320: * ! 22321: EXINT RTN ! 22322: JSR ICBLD BUILD ICBLK ! 22323: EJC ! 22324: * EXIXR -- EXIT WITH RESULT IN (XR) ! 22325: * ! 22326: * (XR) RESULT ! 22327: * (XL) MAY BE NON-COLLECTABLE ! 22328: * BRN EXIXR JUMP TO EXIT WITH RESULT IN (XR) ! 22329: * ! 22330: * EXIXR CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22331: * WHICH IT DOES BY FALLING THROUGH TO EXITS. ! 22332: EXIXR RTN ! 22333: * ! 22334: MOV XR,-(XS) STACK RESULT ! 22335: * ! 22336: * ! 22337: * EXITS -- EXIT WITH RESULT IF ANY STACKED ! 22338: * ! 22339: * (XR,XL) MAY BE NON-COLLECTABLE ! 22340: * ! 22341: * BRN EXITS ENTER EXITS ROUTINE ! 22342: * ! 22343: EXITS RTN ! 22344: LCW XR LOAD NEXT CODE WORD ! 22345: MOV (XR),XL LOAD ENTRY ADDRESS ! 22346: BRI XL JUMP TO EXECUTE NEXT CODE WORD ! 22347: EJC ! 22348: * ! 22349: * EXNAM -- EXIT WITH NAME IN (XL,WA) ! 22350: * ! 22351: * (XL) NAME BASE ! 22352: * (WA) NAME OFFSET ! 22353: * (XR) MAY BE NON-COLLECTABLE ! 22354: * BRN EXNAM JUMP TO EXIT WITH NAME IN (XL,WA) ! 22355: * ! 22356: * EXNAM CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22357: * ! 22358: EXNAM RTN ! 22359: MOV XL,-(XS) STACK NAME BASE ! 22360: MOV WA,-(XS) STACK NAME OFFSET ! 22361: BRN EXITS DO NEXT CODE WORD ! 22362: EJC ! 22363: * ! 22364: * EXNUL -- EXIT WITH NULL RESULT ! 22365: * ! 22366: * (XL,XR) MAY BE NON-COLLECTABLE ! 22367: * BRN EXNUL JUMP TO EXIT WITH NULL VALUE ! 22368: * ! 22369: * EXNUL CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22370: * ! 22371: EXNUL RTN ! 22372: MOV =NULLS,-(XS) STACK NULL VALUE ! 22373: BRN EXITS DO NEXT CODE WORD ! 22374: EJC ! 22375: * ! 22376: * EXREA -- EXIT WITH REAL RESULT ! 22377: * ! 22378: * (XL,XR) MAY BE NON-COLLECTABLE ! 22379: * (RA) REAL VALUE ! 22380: * BRN EXREA JUMP TO EXIT WITH REAL VALUE ! 22381: * ! 22382: * EXREA CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22383: * ! 22384: EXREA RTN ! 22385: JSR RCBLD BUILD RCBLK ! 22386: BRN EXIXR JUMP TO EXIT WITH RESULT IN XR ! 22387: EJC ! 22388: * ! 22389: * EXSID -- EXIT SETTING ID FIELD ! 22390: * ! 22391: * EXSID IS USED TO EXIT AFTER BUILDING ANY OF THE FOLLOWING ! 22392: * BLOCKS (ARBLK, TBBLK, PDBLK, VCBLK). IT SETS THE IDVAL. ! 22393: * ! 22394: * (XR) PTR TO BLOCK WITH IDVAL FIELD ! 22395: * (XL) MAY BE NON-COLLECTABLE ! 22396: * BRN EXSID JUMP TO EXIT AFTER SETTING ID FIELD ! 22397: * ! 22398: * EXSID CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22399: * ! 22400: EXSID RTN ! 22401: MOV CURID,WA LOAD CURRENT ID VALUE ! 22402: BNE WA,=CFP$M,EXSI1 JUMP IF NO OVERFLOW ! 22403: ZER WA ELSE RESET FOR WRAPAROUND ! 22404: * ! 22405: * HERE WITH OLD IDVAL IN WA ! 22406: * ! 22407: EXSI1 ICV WA BUMP ID VALUE ! 22408: MOV WA,CURID STORE FOR NEXT TIME ! 22409: MOV WA,IDVAL(XR) STORE ID VALUE ! 22410: BRN EXIXR EXIT WITH RESULT IN (XR) ! 22411: EJC ! 22412: * ! 22413: * EXVNM -- EXIT WITH NAME OF VARIABLE ! 22414: * ! 22415: * EXVNM EXITS AFTER STACKING A VALUE WHICH IS A NMBLK ! 22416: * REFERENCING THE NAME OF A GIVEN NATURAL VARIABLE. ! 22417: * ! 22418: * (XR) VRBLK POINTER ! 22419: * (XL) MAY BE NON-COLLECTABLE ! 22420: * BRN EXVNM EXIT WITH VRBLK POINTER IN XR ! 22421: * ! 22422: EXVNM RTN ! 22423: MOV XR,XL COPY NAME BASE POINTER ! 22424: MOV *NMSI$,WA SET SIZE OF NMBLK ! 22425: JSR ALLOC ALLOCATE NMBLK ! 22426: MOV =B$NML,(XR) STORE TYPE WORD ! 22427: MOV XL,NMBAS(XR) STORE NAME BASE ! 22428: MOV *VRVAL,NMOFS(XR) STORE NAME OFFSET ! 22429: BRN EXIXR EXIT WITH RESULT IN XR ! 22430: EJC ! 22431: * ! 22432: * FLPOP -- FAIL AND POP IN PATTERN MATCHING ! 22433: * ! 22434: * FLPOP POPS THE NODE AND CURSOR ON THE STACK AND THEN ! 22435: * DROPS THROUGH INTO FAILP TO CAUSE PATTERN FAILURE ! 22436: * ! 22437: * (XL,XR) MAY BE NON-COLLECTABLE ! 22438: * BRN FLPOP JUMP TO FAIL AND POP STACK ! 22439: * ! 22440: FLPOP RTN ! 22441: ADD *NUM02,XS POP TWO ENTRIES OFF STACK ! 22442: EJC ! 22443: * ! 22444: * FAILP -- FAILURE IN MATCHING PATTERN NODE ! 22445: * ! 22446: * FAILP IS USED AFTER FAILING TO MATCH A PATTERN NODE. ! 22447: * SEE PATTERN MATCH ROUTINES FOR DETAILS OF USE. ! 22448: * ! 22449: * (XL,XR) MAY BE NON-COLLECTABLE ! 22450: * BRN FAILP SIGNAL FAILURE TO MATCH ! 22451: * ! 22452: * FAILP CONTINUES BY MATCHING AN ALTERNATIVE FROM THE STACK ! 22453: * ! 22454: FAILP RTN ! 22455: MOV (XS)+,XR LOAD ALTERNATIVE NODE POINTER ! 22456: MOV (XS)+,WB RESTORE OLD CURSOR ! 22457: MOV (XR),XL LOAD PCODE ENTRY POINTER ! 22458: BRI XL JUMP TO EXECUTE CODE FOR NODE ! 22459: EJC ! 22460: * ! 22461: * INDIR -- COMPUTE INDIRECT REFERENCE ! 22462: * ! 22463: * (WB) NONZERO/ZERO FOR BY NAME/VALUE ! 22464: * BRN INDIR JUMP TO GET INDIRECT REF ON STACK ! 22465: * ! 22466: * INDIR CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22467: * ! 22468: INDIR RTN ! 22469: MOV (XS)+,XR LOAD ARGUMENT ! 22470: BEQ (XR),=B$NML,INDR2 JUMP IF A NAME ! 22471: JSR GTNVR ELSE CONVERT TO VARIABLE ! 22472: ERR 239,INDIRECTION OPERAND IS NOT NAME ! 22473: BZE WB,INDR1 SKIP IF BY VALUE ! 22474: MOV XR,-(XS) ELSE STACK VRBLK PTR ! 22475: MOV *VRVAL,-(XS) STACK NAME OFFSET ! 22476: BRN EXITS EXIT WITH RESULT ON STACK ! 22477: * ! 22478: * HERE TO GET VALUE OF NATURAL VARIABLE ! 22479: * ! 22480: INDR1 BRI (XR) JUMP THROUGH VRGET FIELD OF VRBLK ! 22481: * ! 22482: * HERE IF OPERAND IS A NAME ! 22483: * ! 22484: INDR2 MOV NMBAS(XR),XL LOAD NAME BASE ! 22485: MOV NMOFS(XR),WA LOAD NAME OFFSET ! 22486: BNZ WB,EXNAM EXIT IF CALLED BY NAME ! 22487: JSR ACESS ELSE GET VALUE FIRST ! 22488: PPM EXFAL FAIL IF ACCESS FAILS ! 22489: BRN EXIXR ELSE RETURN WITH VALUE IN XR ! 22490: EJC ! 22491: * ! 22492: * MATCH -- INITIATE PATTERN MATCH ! 22493: * ! 22494: * (WB) MATCH TYPE CODE ! 22495: * BRN MATCH JUMP TO INITIATE PATTERN MATCH ! 22496: * ! 22497: * MATCH CONTINUES BY EXECUTING THE PATTERN MATCH. SEE ! 22498: * PATTERN MATCH ROUTINES (P$XXX) FOR FULL DETAILS. ! 22499: * ! 22500: MATCH RTN ! 22501: MOV (XS)+,XR LOAD PATTERN OPERAND ! 22502: JSR GTPAT CONVERT TO PATTERN ! 22503: ERR 240,PATTERN MATCH RIGHT OPERAND IS NOT PATTERN ! 22504: MOV XR,XL IF OK, SAVE PATTERN POINTER ! 22505: BNZ WB,MTCH1 JUMP IF NOT MATCH BY NAME ! 22506: MOV (XS),WA ELSE LOAD NAME OFFSET ! 22507: MOV XL,-(XS) SAVE PATTERN POINTER ! 22508: MOV 2(XS),XL LOAD NAME BASE ! 22509: JSR ACESS ACCESS SUBJECT VALUE ! 22510: PPM EXFAL FAIL IF ACCESS FAILS ! 22511: MOV (XS),XL RESTORE PATTERN POINTER ! 22512: MOV XR,(XS) STACK SUBJECT STRING VAL FOR MERGE ! 22513: ZER WB RESTORE TYPE CODE ! 22514: * ! 22515: * MERGE HERE WITH SUBJECT VALUE ON STACK ! 22516: * ! 22517: MTCH1 MOV (XS),XR LOAD SUBJECT VALUE ! 22518: ZER R$PMB ASSUME NOT A BUFFER ! 22519: BNE (XR),=B$BCT,MTCHA BRANCH IF NOT ! 22520: ICA XS ELSE POP VALUE ! 22521: MOV XR,R$PMB SAVE POINTER ! 22522: MOV BCLEN(XR),WA GET DEFINED LENGTH ! 22523: MOV BCBUF(XR),XR POINT TO BFBLK ! 22524: BRN MTCHB ! 22525: * ! 22526: * HERE IF NOT BUFFER TO CONVERT TO STRING ! 22527: * ! 22528: MTCHA JSR GTSTG NOT BUFFER - CONVERT TO STRING ! 22529: ERR 241,PATTERN MATCH LEFT OPERAND IS NOT STRING ! 22530: * ! 22531: * MERGE WITH BUFFER OR STRING ! 22532: * ! 22533: MTCHB MOV XR,R$PMS IF OK, STORE SUBJECT STRING POINTER ! 22534: MOV WA,PMSSL AND LENGTH ! 22535: MOV WB,-(XS) STACK MATCH TYPE CODE ! 22536: ZER -(XS) STACK INITIAL CURSOR (ZERO) ! 22537: ZER WB SET INITIAL CURSOR ! 22538: MOV XS,PMHBS SET HISTORY STACK BASE PTR ! 22539: ZER PMDFL RESET PATTERN ASSIGNMENT FLAG ! 22540: MOV XL,XR SET INITIAL NODE POINTER ! 22541: BNZ KVANC,MTCH2 JUMP IF ANCHORED ! 22542: * ! 22543: * HERE FOR UNANCHORED ! 22544: * ! 22545: MOV XR,-(XS) STACK INITIAL NODE POINTER ! 22546: MOV =NDUNA,-(XS) STACK POINTER TO ANCHOR MOVE NODE ! 22547: BRI (XR) START MATCH OF FIRST NODE ! 22548: * ! 22549: * HERE IN ANCHORED MODE ! 22550: * ! 22551: MTCH2 ZER -(XS) DUMMY CURSOR VALUE ! 22552: MOV =NDABO,-(XS) STACK POINTER TO ABORT NODE ! 22553: BRI (XR) START MATCH OF FIRST NODE ! 22554: EJC ! 22555: * ! 22556: * RETRN -- RETURN FROM FUNCTION ! 22557: * ! 22558: * (WA) STRING POINTER FOR RETURN TYPE ! 22559: * BRN RETRN JUMP TO RETURN FROM (SNOBOL) FUNC ! 22560: * ! 22561: * RETRN CONTINUES BY EXECUTING THE CODE AT THE RETURN POINT ! 22562: * THE STACK IS CLEANED OF ANY GARBAGE LEFT BY OTHER ! 22563: * ROUTINES WHICH MAY HAVE ALTERED FLPTR SINCE FUNCTION ! 22564: * ENTRY BY USING FLPRT, RESERVED FOR USE ONLY BY ! 22565: * FUNCTION CALL AND RETURN. ! 22566: * ! 22567: RETRN RTN ! 22568: BNZ KVFNC,RTN01 JUMP IF NOT LEVEL ZERO ! 22569: ERB 242,FUNCTION RETURN FROM LEVEL ZERO ! 22570: * ! 22571: * HERE IF NOT LEVEL ZERO RETURN ! 22572: * ! 22573: RTN01 MOV FLPRT,XS POP STACK ! 22574: ICA XS REMOVE FAILURE OFFSET ! 22575: MOV (XS)+,XR POP PFBLK POINTER ! 22576: MOV (XS)+,FLPTR POP FAILURE POINTER ! 22577: MOV (XS)+,FLPRT POP OLD FLPRT ! 22578: MOV (XS)+,WB POP CODE POINTER OFFSET ! 22579: MOV (XS)+,WC POP OLD CODE BLOCK POINTER ! 22580: ADD WC,WB MAKE OLD CODE POINTER ABSOLUTE ! 22581: LCP WB RESTORE OLD CODE POINTER ! 22582: MOV WC,R$COD RESTORE OLD CODE BLOCK POINTER ! 22583: DCV KVFNC DECREMENT FUNCTION LEVEL ! 22584: MOV KVTRA,WB LOAD TRACE ! 22585: ADD KVFTR,WB ADD FTRACE ! 22586: BZE WB,RTN06 JUMP IF NO TRACING POSSIBLE ! 22587: * ! 22588: * HERE IF THERE MAY BE A TRACE ! 22589: * ! 22590: MOV WA,-(XS) SAVE FUNCTION RETURN TYPE ! 22591: MOV XR,-(XS) SAVE PFBLK POINTER ! 22592: MOV WA,KVRTN SET RTNTYPE FOR TRACE FUNCTION ! 22593: MOV R$FNC,XL LOAD FNCLEVEL TRBLK PTR (IF ANY) ! 22594: JSR KTREX EXECUTE POSSIBLE FNCLEVEL TRACE ! 22595: MOV PFVBL(XR),XL LOAD VRBLK PTR (SGD13) ! 22596: BZE KVTRA,RTN02 JUMP IF TRACE IS OFF ! 22597: MOV PFRTR(XR),XR ELSE LOAD RETURN TRACE TRBLK PTR ! 22598: BZE XR,RTN02 JUMP IF NOT RETURN TRACED ! 22599: DCV KVTRA ELSE DECREMENT TRACE COUNT ! 22600: BZE TRFNC(XR),RTN03 JUMP IF PRINT TRACE ! 22601: MOV *VRVAL,WA ELSE SET NAME OFFSET ! 22602: MOV 1(XS),KVRTN MAKE SURE RTNTYPE IS SET RIGHT ! 22603: JSR TRXEQ EXECUTE FULL TRACE ! 22604: EJC ! 22605: * ! 22606: * RETRN (CONTINUED) ! 22607: * ! 22608: * HERE TO TEST FOR FTRACE ! 22609: * ! 22610: RTN02 BZE KVFTR,RTN05 JUMP IF FTRACE IS OFF ! 22611: DCV KVFTR ELSE DECREMENT FTRACE ! 22612: * ! 22613: * HERE FOR PRINT TRACE OF FUNCTION RETURN ! 22614: * ! 22615: RTN03 JSR PRTSN PRINT STATEMENT NUMBER ! 22616: MOV 1(XS),XR LOAD RETURN TYPE ! 22617: JSR PRTST PRINT IT ! 22618: MOV =CH$BL,WA LOAD BLANK ! 22619: JSR PRTCH PRINT IT ! 22620: MOV 0(XS),XL LOAD PFBLK PTR ! 22621: MOV PFVBL(XL),XL LOAD FUNCTION VRBLK PTR ! 22622: MOV *VRVAL,WA SET VRBLK NAME OFFSET ! 22623: BNE XR,=SCFRT,RTN04 JUMP IF NOT FRETURN CASE ! 22624: * ! 22625: * FOR FRETURN, JUST PRINT FUNCTION NAME ! 22626: * ! 22627: JSR PRTNM PRINT NAME ! 22628: JSR PRTNL TERMINATE PRINT LINE ! 22629: BRN RTN05 MERGE ! 22630: * ! 22631: * HERE FOR RETURN OR NRETURN, PRINT FUNCTION NAME = VALUE ! 22632: * ! 22633: RTN04 JSR PRTNV PRINT NAME = VALUE ! 22634: * ! 22635: * HERE AFTER COMPLETING TRACE ! 22636: * ! 22637: RTN05 MOV (XS)+,XR POP PFBLK POINTER ! 22638: MOV (XS)+,WA POP RETURN TYPE STRING ! 22639: * ! 22640: * MERGE HERE IF NO TRACE REQUIRED ! 22641: * ! 22642: RTN06 MOV WA,KVRTN SET RTNTYPE KEYWORD ! 22643: MOV PFVBL(XR),XL LOAD POINTER TO FN VRBLK ! 22644: EJC ! 22645: * RETRN (CONTINUED) ! 22646: * ! 22647: * GET VALUE OF FUNCTION ! 22648: * ! 22649: RTN07 MOV XL,RTNBP SAVE BLOCK POINTER ! 22650: MOV VRVAL(XL),XL LOAD VALUE ! 22651: BEQ (XL),=B$TRT,RTN07 LOOP BACK IF TRAPPED ! 22652: MOV XL,RTNFV ELSE SAVE FUNCTION RESULT VALUE ! 22653: MOV (XS)+,RTNSV SAVE ORIGINAL FUNCTION VALUE ! 22654: MOV (XS)+,XL POP SAVED POINTER ! 22655: BZE XL,RTN7C NO ACTION IF NONE ! 22656: BZE KVPFL,RTN7C JUMP IF NO PROFILING ! 22657: JSR PRFLU ELSE PROFILE LAST FUNC STMT ! 22658: BEQ KVPFL,=NUM02,RTN7A BRANCH ON VALUE OF PROFILE KEYWD ! 22659: * ! 22660: * HERE IF &PROFILE = 1. START TIME MUST BE FRIGGED TO ! 22661: * APPEAR EARLIER THAN IT ACTUALLY IS, BY AMOUNT USED BEFORE ! 22662: * THE CALL. ! 22663: * ! 22664: LDI PFSTM LOAD CURRENT TIME ! 22665: SBI ICVAL(XL) FRIG BY SUBTRACTING SAVED AMOUNT ! 22666: BRN RTN7B AND MERGE ! 22667: * ! 22668: * HERE IF &PROFILE = 2 ! 22669: * ! 22670: RTN7A LDI ICVAL(XL) LOAD SAVED TIME ! 22671: * ! 22672: * BOTH PROFILE TYPES MERGE HERE ! 22673: * ! 22674: RTN7B STI PFSTM STORE BACK CORRECT START TIME ! 22675: * ! 22676: * MERGE HERE IF NO PROFILING ! 22677: * ! 22678: RTN7C MOV FARGS(XR),WB GET NUMBER OF ARGS ! 22679: ADD PFNLO(XR),WB ADD NUMBER OF LOCALS ! 22680: BZE WB,RTN10 JUMP IF NO ARGS/LOCALS ! 22681: LCT WB,WB ELSE SET LOOP COUNTER ! 22682: ADD PFLEN(XR),XR AND POINT TO END OF PFBLK ! 22683: * ! 22684: * LOOP TO RESTORE FUNCTIONS AND LOCALS ! 22685: * ! 22686: RTN08 MOV -(XR),XL LOAD NEXT VRBLK POINTER ! 22687: * ! 22688: * LOOP TO FIND VALUE BLOCK ! 22689: * ! 22690: RTN09 MOV XL,WA SAVE BLOCK POINTER ! 22691: MOV VRVAL(XL),XL LOAD POINTER TO NEXT VALUE ! 22692: BEQ (XL),=B$TRT,RTN09 LOOP BACK IF TRAPPED ! 22693: MOV WA,XL ELSE RESTORE LAST BLOCK POINTER ! 22694: MOV (XS)+,VRVAL(XL) RESTORE OLD VARIABLE VALUE ! 22695: BCT WB,RTN08 LOOP TILL ALL PROCESSED ! 22696: * ! 22697: * NOW RESTORE FUNCTION VALUE AND EXIT ! 22698: * ! 22699: RTN10 MOV RTNBP,XL RESTORE PTR TO LAST FUNCTION BLOCK ! 22700: MOV RTNSV,VRVAL(XL) RESTORE OLD FUNCTION VALUE ! 22701: MOV RTNFV,XR RELOAD FUNCTION RESULT ! 22702: MOV R$COD,XL POINT TO NEW CODE BLOCK ! 22703: MOV KVSTN,KVLST SET LASTNO FROM STNO ! 22704: MOV CDSTM(XL),KVSTN RESET PROPER STNO VALUE ! 22705: MOV KVRTN,WA LOAD RETURN TYPE ! 22706: BEQ WA,=SCRTN,EXIXR EXIT WITH RESULT IN XR IF RETURN ! 22707: BEQ WA,=SCFRT,EXFAL FAIL IF FRETURN ! 22708: EJC ! 22709: * ! 22710: * RETRN (CONTINUED) ! 22711: * ! 22712: * HERE FOR NRETURN ! 22713: * ! 22714: BEQ (XR),=B$NML,RTN11 JUMP IF IS A NAME ! 22715: JSR GTNVR ELSE TRY CONVERT TO VARIABLE NAME ! 22716: ERR 243,FUNCTION RESULT IN NRETURN IS NOT NAME ! 22717: MOV XR,XL IF OK, COPY VRBLK (NAME BASE) PTR ! 22718: MOV *VRVAL,WA SET NAME OFFSET ! 22719: BRN RTN12 AND MERGE ! 22720: * ! 22721: * HERE IF RETURNED RESULT IS A NAME ! 22722: * ! 22723: RTN11 MOV NMBAS(XR),XL LOAD NAME BASE ! 22724: MOV NMOFS(XR),WA LOAD NAME OFFSET ! 22725: * ! 22726: * MERGE HERE WITH RETURNED NAME IN (XL,WA) ! 22727: * ! 22728: RTN12 MOV XL,XR PRESERVE XL ! 22729: LCW WB LOAD NEXT WORD ! 22730: MOV XR,XL RESTORE XL ! 22731: BEQ WB,=OFNE$,EXNAM EXIT IF CALLED BY NAME ! 22732: MOV WB,-(XS) ELSE SAVE CODE WORD ! 22733: JSR ACESS GET VALUE ! 22734: PPM EXFAL FAIL IF ACCESS FAILS ! 22735: MOV XR,XL IF OK, COPY RESULT ! 22736: MOV (XS),XR RELOAD NEXT CODE WORD ! 22737: MOV XL,(XS) STORE RESULT ON STACK ! 22738: MOV (XR),XL LOAD ROUTINE ADDRESS ! 22739: BRI XL JUMP TO EXECUTE NEXT CODE WORD ! 22740: EJC ! 22741: * ! 22742: * STCOV -- SIGNAL STATEMENT COUNTER OVERFLOW ! 22743: * ! 22744: * BRN STCOV JUMP TO SIGNAL STATEMENT COUNT OFLO ! 22745: * ! 22746: * PERMIT UP TO 10 MORE STATEMENTS TO BE OBEYED SO THAT ! 22747: * SETEXIT TRAP CAN REGAIN CONTROL. ! 22748: * STCOV CONTINUES BY ISSUING THE ERROR MESSAGE ! 22749: * ! 22750: STCOV RTN ! 22751: ICV ERRFT FATAL ERROR ! 22752: LDI INTVT GET 10 ! 22753: ADI KVSTL ADD TO FORMER LIMIT ! 22754: STI KVSTL STORE AS NEW STLIMIT ! 22755: LDI INTVT GET 10 ! 22756: STI KVSTC SET AS NEW COUNT ! 22757: ERB 244,STATEMENT COUNT EXCEEDS VALUE OF STLIMIT KEYWORD ! 22758: EJC ! 22759: * ! 22760: * STMGO -- START EXECUTION OF NEW STATEMENT ! 22761: * ! 22762: * (XR) POINTER TO CDBLK FOR NEW STATEMENT ! 22763: * BRN STMGO JUMP TO EXECUTE NEW STATEMENT ! 22764: * ! 22765: * STMGO CONTINUES BY EXECUTING THE NEXT STATEMENT ! 22766: * ! 22767: STMGO RTN ! 22768: MOV XR,R$COD SET NEW CODE BLOCK POINTER ! 22769: BZE KVPFL,STGO1 SKIP IF NO PROFILING ! 22770: JSR PRFLU ELSE PROFILE THE STATEMENT ! 22771: STGO1 MOV KVSTN,KVLST SET LASTNO ! 22772: MOV CDSTM(XR),KVSTN SET STNO ! 22773: ADD *CDCOD,XR POINT TO FIRST CODE WORD ! 22774: LCP XR SET CODE POINTER ! 22775: LDI KVSTC GET STMT COUNT ! 22776: ILT EXITS OMIT COUNTING IF NEGATIVE ! 22777: IEQ STCOV FAIL IF STLIMIT REACHED ! 22778: SBI INTV1 DECREMENT ! 22779: STI KVSTC REPLACE IT ! 22780: BZE R$STC,EXITS EXIT IF NO STCOUNT TRACE ! 22781: * ! 22782: * HERE FOR STCOUNT TRACE ! 22783: * ! 22784: ZER XR CLEAR GARBAGE VALUE IN XR ! 22785: MOV R$STC,XL LOAD POINTER TO STCOUNT TRBLK ! 22786: JSR KTREX EXECUTE KEYWORD TRACE ! 22787: BRN EXITS AND THEN EXIT FOR NEXT CODE WORD ! 22788: EJC ! 22789: * ! 22790: * STOPR -- TERMINATE RUN ! 22791: * ! 22792: * (XR) POINTS TO ENDING MESSAGE ! 22793: * BRN STOPR JUMP TO TERMINATE RUN ! 22794: * ! 22795: * TERMINATE RUN AND PRINT STATISTICS. ON ENTRY XR POINTS ! 22796: * TO ENDING MESSAGE OR IS ZERO IF MESSAGE PRINTED ALREADY. ! 22797: * ! 22798: STOPR RTN ! 22799: BZE XR,STPRA SKIP IF SYSAX ALREADY CALLED (REG04) ! 22800: JSR SYSAX CALL AFTER EXECUTION PROC ! 22801: STPRA ADD RSMEM,DNAME USE THE RESERVE MEMORY ! 22802: BNE XR,=ENDMS,STPR0 SKIP IF NOT NORMAL END MESSAGE ! 22803: BNZ EXSTS,STPR3 SKIP IF EXEC STATS SUPPRESSED ! 22804: ZER ERICH CLEAR ERRORS TO INT.CH. FLAG ! 22805: * ! 22806: * LOOK TO SEE IF AN ENDING MESSAGE IS SUPPLIED ! 22807: * ! 22808: STPR0 JSR PRTPG EJECT PRINTER ! 22809: BZE XR,STPR1 SKIP IF NO MESSAGE ! 22810: JSR PRTST PRINT MESSAGE ! 22811: * ! 22812: * MERGE HERE IF NO MESSAGE TO PRINT ! 22813: * ! 22814: STPR1 JSR PRTIS PRINT BLANK LINE ! 22815: MTI KVSTN GET STATEMENT NUMBER ! 22816: MOV =STPM1,XR POINT TO MESSAGE /IN STATEMENT XXX/ ! 22817: JSR PRTMX PRINT IT ! 22818: JSR SYSTM GET CURRENT TIME ! 22819: SBI TIMSX MINUS START TIME = ELAPSED EXEC TIM ! 22820: STI STPTI SAVE FOR LATER ! 22821: MOV =STPM3,XR POINT TO MSG /EXECUTION TIME MSEC / ! 22822: JSR PRTMX PRINT IT ! 22823: LDI KVSTL GET STATEMENT LIMIT ! 22824: ILT STPR2 SKIP IF NEGATIVE ! 22825: SBI KVSTC MINUS COUNTER = COUNT ! 22826: STI STPSI SAVE ! 22827: MOV =STPM2,XR POINT TO MESSAGE /STMTS EXECUTED/ ! 22828: JSR PRTMX PRINT IT ! 22829: LDI STPTI RELOAD ELAPSED TIME ! 22830: MLI INTTH *1000 (MICROSECS) ! 22831: IOV STPR2 JUMP IF WE CANNOT COMPUTE ! 22832: DVI STPSI DIVIDE BY STATEMENT COUNT ! 22833: IOV STPR2 JUMP IF OVERFLOW ! 22834: MOV =STPM4,XR POINT TO MSG (MCSEC PER STATEMENT / ! 22835: JSR PRTMX PRINT IT ! 22836: EJC ! 22837: * ! 22838: * STOPR (CONTINUED) ! 22839: * ! 22840: * MERGE TO SKIP MESSAGE (OVERFLOW OR NEGATIVE STLIMIT) ! 22841: * ! 22842: STPR2 MTI GBCNT LOAD COUNT OF COLLECTIONS ! 22843: MOV =STPM5,XR POINT TO MESSAGE /REGENERATIONS / ! 22844: JSR PRTMX PRINT IT ! 22845: JSR PRTIS ONE MORE BLANK FOR LUCK ! 22846: * ! 22847: * CHECK IF DUMP REQUESTED ! 22848: * ! 22849: STPR3 JSR PRFLR PRINT PROFILE IF WANTED ! 22850: * ! 22851: MOV KVDMP,XR LOAD DUMP KEYWORD ! 22852: JSR DUMPR EXECUTE DUMP IF REQUESTED ! 22853: MOV R$FCB,XL GET FCBLK CHAIN HEAD ! 22854: MOV KVABE,WA LOAD ABEND VALUE ! 22855: MOV KVCOD,WB LOAD CODE VALUE ! 22856: JSR SYSEJ EXIT TO SYSTEM ! 22857: EJC ! 22858: * ! 22859: * SUCCP -- SIGNAL SUCCESSFUL MATCH OF A PATTERN NODE ! 22860: * ! 22861: * SEE PATTERN MATCH ROUTINES FOR DETAILS ! 22862: * ! 22863: * (XR) CURRENT NODE ! 22864: * (WB) CURRENT CURSOR ! 22865: * (XL) MAY BE NON-COLLECTABLE ! 22866: * BRN SUCCP SIGNAL SUCCESSFUL PATTERN MATCH ! 22867: * ! 22868: * SUCCP CONTINUES BY MATCHING THE SUCCESSOR NODE ! 22869: * ! 22870: SUCCP RTN ! 22871: MOV PTHEN(XR),XR LOAD SUCCESSOR NODE ! 22872: MOV (XR),XL LOAD NODE CODE ENTRY ADDRESS ! 22873: BRI XL JUMP TO MATCH SUCCESSOR NODE ! 22874: EJC ! 22875: * ! 22876: * SYSAB -- PRINT /ABNORMAL END/ AND TERMINATE ! 22877: * ! 22878: SYSAB RTN ! 22879: MOV =ENDAB,XR POINT TO MESSAGE ! 22880: MOV =NUM01,KVABE SET ABEND FLAG ! 22881: JSR PRTNL SKIP TO NEW LINE ! 22882: BRN STOPR JUMP TO PACK UP ! 22883: EJC ! 22884: * ! 22885: * SYSTU -- PRINT /TIME UP/ AND TERMINATE ! 22886: * ! 22887: SYSTU RTN ! 22888: MOV =ENDTU,XR POINT TO MESSAGE ! 22889: MOV STRTU,WA GET CHARS /TU/ ! 22890: MOV WA,KVCOD PUT IN KVCOD ! 22891: MOV TIMUP,WA CHECK STATE OF TIMEUP SWITCH ! 22892: MNZ TIMUP SET SWITCH ! 22893: BNZ WA,STOPR STOP RUN IF ALREADY SET ! 22894: ERB 245,TRANSLATION/EXECUTION TIME EXPIRED ! 22895: TTL S P I T B O L -- STACK OVERFLOW SECTION ! 22896: * ! 22897: * CONTROL COMES HERE IF THE MAIN STACK OVERFLOWS ! 22898: * ! 22899: SEC START OF STACK OVERFLOW SECTION ! 22900: * ! 22901: ICV ERRFT FATAL ERROR ! 22902: MOV FLPTR,XS POP STACK TO AVOID MORE FAILS ! 22903: BNZ GBCFL,STAK1 JUMP IF GARBAGE COLLECTING ! 22904: ERB 246,STACK OVERFLOW ! 22905: * ! 22906: * NO CHANCE OF RECOVERY IN MID GARBAGE COLLECTION ! 22907: * ! 22908: STAK1 MOV =ENDSO,XR POINT TO MESSAGE ! 22909: ZER KVDMP MEMORY IS UNDUMPABLE ! 22910: BRN STOPR GIVE UP ! 22911: TTL S P I T B O L -- ERROR SECTION ! 22912: * ! 22913: * THIS SECTION OF CODE IS ENTERED WHENEVER A PROCEDURE ! 22914: * RETURN VIA AN ERR PARAMETER OR AN ERB OPCODE IS OBEYED. ! 22915: * ! 22916: * (WA) IS THE ERROR CODE ! 22917: * ! 22918: * THE GLOBAL VARIABLE STAGE INDICATES THE POINT AT WHICH ! 22919: * THE ERROR OCCURED AS FOLLOWS. ! 22920: * ! 22921: * STAGE=STGIC ERROR DURING INITIAL COMPILE ! 22922: * ! 22923: * STAGE=STGXC ERROR DURING COMPILE AT EXECUTE ! 22924: * TIME (CODE, CONVERT FUNCTION CALLS) ! 22925: * ! 22926: * STAGE=STGEV ERROR DURING COMPILATION OF ! 22927: * EXPRESSION AT EXECUTION TIME ! 22928: * (EVAL, CONVERT FUNCTION CALL). ! 22929: * ! 22930: * STAGE=STGXT ERROR AT EXECUTE TIME. COMPILER ! 22931: * NOT ACTIVE. ! 22932: * ! 22933: * STAGE=STGCE ERROR DURING INITIAL COMPILE AFTER ! 22934: * SCANNING OUT THE END LINE. ! 22935: * ! 22936: * STAGE=STGXE ERROR DURING COMPILE AT EXECUTE ! 22937: * TIME AFTER SCANNING END LINE. ! 22938: * ! 22939: * STAGE=STGEE ERROR DURING EXPRESSION EVALUATION ! 22940: * ! 22941: SEC START OF ERROR SECTION ! 22942: * ! 22943: ERROR BEQ R$CIM,=CMLAB,CMPLE JUMP IF ERROR IN SCANNING LABEL ! 22944: MOV WA,KVERT SAVE ERROR CODE ! 22945: ZER SCNRS RESET RESCAN SWITCH FOR SCANE ! 22946: ZER SCNGO RESET GOTO SWITCH FOR SCANE ! 22947: MOV STAGE,XR LOAD CURRENT STAGE ! 22948: BSW XR,STGNO JUMP TO APPROPRIATE ERROR CIRCUIT ! 22949: IFF STGIC,ERR01 INITIAL COMPILE ! 22950: IFF STGXC,ERR04 EXECUTE TIME COMPILE ! 22951: IFF STGEV,ERR04 EVAL COMPILING EXPR. ! 22952: IFF STGEE,ERR04 EVAL EVALUATING EXPR ! 22953: IFF STGXT,ERR05 EXECUTE TIME ! 22954: IFF STGCE,ERR01 COMPILE - AFTER END ! 22955: IFF STGXE,ERR04 XEQ COMPILE-PAST END ! 22956: ESW END SWITCH ON ERROR TYPE ! 22957: EJC ! 22958: * ! 22959: * ERROR DURING INITIAL COMPILE ! 22960: * ! 22961: * THE ERROR MESSAGE IS PRINTED AS PART OF THE COMPILER ! 22962: * OUTPUT. THIS PRINTOUT INCLUDES THE OFFENDING LINE (IF NOT ! 22963: * PRINTED ALREADY) AND AN ERROR FLAG UNDER THE APPROPRIATE ! 22964: * COLUMN AS INDICATED BY SCNSE UNLESS SCNSE IS SET TO ZERO. ! 22965: * ! 22966: * AFTER PRINTING THE MESSAGE, THE GENERATED CODE IS ! 22967: * MODIFIED TO AN ERROR CALL AND CONTROL IS RETURNED TO ! 22968: * THE CMPIL PROCEDURE AFTER RESETTING THE STACK POINTER. ! 22969: * ! 22970: * IF THE ERROR OCCURS AFTER THE END LINE, CONTROL RETURNS ! 22971: * IN A SLIGHTLY DIFFERENT MANNER TO ENSURE PROPER CLEANUP. ! 22972: * ! 22973: ERR01 MOV CMPXS,XS RESET STACK POINTER ! 22974: SSL CMPSS RESTORE S-R STACK PTR FOR CMPIL ! 22975: BNZ ERRSP,ERR03 JUMP IF ERROR SUPPRESS FLAG SET ! 22976: MOV ERICH,ERLST SET FLAG FOR LISTR ! 22977: JSR LISTR LIST LINE ! 22978: JSR PRTIS TERMINATE LISTING ! 22979: ZER ERLST CLEAR LISTR FLAG ! 22980: MOV SCNSE,WA LOAD SCAN ELEMENT OFFSET ! 22981: BZE WA,ERR02 SKIP IF NOT SET ! 22982: LCT WB,WA LOOP COUNTER ! 22983: ICV WA INCREASE FOR CH$EX ! 22984: JSR ALOCS STRING BLOCK FOR ERROR FLAG ! 22985: MOV XR,WA REMEMBER STRING PTR ! 22986: PSC XR READY FOR CHARACTER STORING ! 22987: MOV R$CIM,XL POINT TO BAD STATEMENT ! 22988: PLC XL READY TO GET CHARS ! 22989: * ! 22990: * LOOP TO REPLACE ALL CHARS BUT TABS BY BLANKS ! 22991: * ! 22992: ERRA1 LCH WC,(XL)+ GET NEXT CHAR ! 22993: BEQ WC,=CH$HT,ERRA2 SKIP IF TAB ! 22994: MOV =CH$BL,WC GET A BLANK ! 22995: EJC ! 22996: * ! 22997: * MERGE TO STORE BLANK OR TAB IN ERROR LINE ! 22998: * ! 22999: ERRA2 SCH WC,(XR)+ STORE CHAR ! 23000: BCT WB,ERRA1 LOOP ! 23001: MOV =CH$EX,XL EXCLAMATION MARK ! 23002: SCH XL,(XR) STORE AT END OF ERROR LINE ! 23003: CSC XR END OF SCH LOOP ! 23004: MOV =STNPD,PROFS ALLOW FOR STATEMENT NUMBER ! 23005: MOV WA,XR POINT TO ERROR LINE ! 23006: JSR PRTST PRINT ERROR LINE ! 23007: * ! 23008: * HERE AFTER PLACING ERROR FLAG AS REQUIRED ! 23009: * ! 23010: ERR02 JSR ERMSG GENERATE FLAG AND ERROR MESSAGE ! 23011: ADD =NUM03,LSTLC BUMP PAGE CTR FOR BLANK, ERROR, BLK ! 23012: ZER XR IN CASE OF FATAL ERROR ! 23013: BHI ERRFT,=NUM03,STOPR PACK UP IF SEVERAL FATALS ! 23014: * ! 23015: * COUNT ERROR, INHIBIT EXECUTION IF REQUIRED ! 23016: * ! 23017: ICV CMERC BUMP ERROR COUNT ! 23018: ADD CSWER,NOXEQ INHIBIT XEQ IF -NOERRORS ! 23019: BNE STAGE,=STGIC,CMP10 SPECIAL RETURN IF AFTER END LINE ! 23020: EJC ! 23021: * ! 23022: * LOOP TO SCAN TO END OF STATEMENT ! 23023: * ! 23024: ERR03 MOV R$CIM,XR POINT TO START OF IMAGE ! 23025: PLC XR POINT TO FIRST CHAR ! 23026: LCH XR,(XR) GET FIRST CHAR ! 23027: BEQ XR,=CH$MN,CMPCE JUMP IF ERROR IN CONTROL CARD ! 23028: ZER SCNRS CLEAR RESCAN FLAG ! 23029: MNZ ERRSP SET ERROR SUPPRESS FLAG ! 23030: JSR SCANE SCAN NEXT ELEMENT ! 23031: BNE XL,=T$SMC,ERR03 LOOP BACK IF NOT STATEMENT END ! 23032: ZER ERRSP CLEAR ERROR SUPPRESS FLAG ! 23033: * ! 23034: * GENERATE ERROR CALL IN CODE AND RETURN TO CMPIL ! 23035: * ! 23036: MOV *CDCOD,CWCOF RESET OFFSET IN CCBLK ! 23037: MOV =OCER$,WA LOAD COMPILE ERROR CALL ! 23038: JSR CDWRD GENERATE IT ! 23039: MOV CWCOF,CMSOC(XS) SET SUCCESS FILL IN OFFSET ! 23040: MNZ CMFFC(XS) SET FAILURE FILL IN FLAG ! 23041: JSR CDWRD GENERATE SUCC. FILL IN WORD ! 23042: BRN CMPSE MERGE TO GENERATE ERROR AS CDFAL ! 23043: * ! 23044: * ERROR DURING EXECUTE TIME COMPILE OR EXPRESSION EVALUATIO ! 23045: * ! 23046: * EXECUTE TIME COMPILATION IS INITIATED THROUGH GTCOD OR ! 23047: * GTEXP WHICH ARE CALLED BY COMPILE, CODE OR EVAL. ! 23048: * BEFORE CAUSING STATEMENT FAILURE THROUGH EXFAL IT IS ! 23049: * HELPFUL TO SET KEYWORD ERRTEXT AND FOR GENERALITY ! 23050: * THESE ERRORS MAY BE HANDLED BY THE SETEXIT MECHANISM. ! 23051: * ! 23052: ERR04 ZER R$CCB FORGET GARBAGE CODE BLOCK ! 23053: SSL INISS RESTORE MAIN PROG S-R STACK PTR ! 23054: JSR ERTEX GET FAIL MESSAGE TEXT ! 23055: DCA XS ENSURE STACK OK ON LOOP START ! 23056: * ! 23057: * POP STACK UNTIL FIND FLPTR FOR MOST DEEPLY NESTED PROG. ! 23058: * DEFINED FUNCTION CALL OR CALL OF EVAL / CODE. ! 23059: * ! 23060: ERRA4 ICA XS POP STACK ! 23061: BEQ XS,FLPRT,ERRC4 JUMP IF PROG DEFINED FN CALL FOUND ! 23062: BNE XS,GTCEF,ERRA4 LOOP IF NOT EVAL OR CODE CALL YET ! 23063: MOV =STGXT,STAGE RE-SET STAGE FOR EXECUTE ! 23064: MOV R$GTC,R$COD RECOVER CODE PTR ! 23065: MOV XS,FLPTR RESTORE FAIL POINTER ! 23066: ZER R$CIM FORGET POSSIBLE IMAGE ! 23067: * ! 23068: * TEST ERRLIMIT ! 23069: * ! 23070: ERRB4 BNZ KVERL,ERR07 JUMP IF ERRLIMIT NON-ZERO ! 23071: BRN EXFAL FAIL ! 23072: * ! 23073: * RETURN FROM PROG. DEFINED FUNCTION IS OUTSTANDING ! 23074: * ! 23075: ERRC4 MOV FLPTR,XS RESTORE STACK FROM FLPTR ! 23076: BRN ERRB4 MERGE ! 23077: EJC ! 23078: * ! 23079: * ERROR AT EXECUTE TIME. ! 23080: * ! 23081: * THE ACTION TAKEN ON AN ERROR IS AS FOLLOWS. ! 23082: * ! 23083: * IF ERRLIMIT KEYWORD IS ZERO, AN ABORT IS SIGNALLED, ! 23084: * SEE CODING FOR SYSTEM LABEL ABORT AT L$ABO. ! 23085: * ! 23086: * OTHERWISE, ERRLIMIT IS DECREMENTED AND AN ERRTYPE TRACE ! 23087: * GENERATED IF REQUIRED. CONTROL RETURNS EITHER VIA A JUMP ! 23088: * TO CONTINUE (TO TAKE THE FAILURE EXIT) OR A SPECIFIED ! 23089: * SETEXIT TRAP IS EXECUTED AND CONTROL PASSES TO THE TRAP. ! 23090: * IF 3 OR MORE FATAL ERRORS OCCUR AN ABORT IS SIGNALLED ! 23091: * REGARDLESS OF ERRLIMIT AND SETEXIT - LOOPING IS ALL TOO ! 23092: * PROBABLE OTHERWISE. FATAL ERRORS INCLUDE STACK OVERFLOW ! 23093: * AND EXCEEDING STLIMIT. ! 23094: * ! 23095: ERR05 SSL INISS RESTORE MAIN PROG S-R STACK PTR ! 23096: BNZ DMVCH,ERR08 JUMP IF IN MID-DUMP ! 23097: * ! 23098: * MERGE HERE FROM ERR08 ! 23099: * ! 23100: ERR06 BZE KVERL,LABO1 ABORT IF ERRLIMIT IS ZERO ! 23101: JSR ERTEX GET FAIL MESSAGE TEXT ! 23102: * ! 23103: * MERGE FROM ERR04 ! 23104: * ! 23105: ERR07 BGE ERRFT,=NUM03,LABO1 ABORT IF TOO MANY FATAL ERRORS ! 23106: DCV KVERL DECREMENT ERRLIMIT ! 23107: MOV R$ERT,XL LOAD ERRTYPE TRACE POINTER ! 23108: JSR KTREX GENERATE ERRTYPE TRACE IF REQUIRED ! 23109: MOV R$COD,R$CNT SET CDBLK PTR FOR CONTINUATION ! 23110: MOV FLPTR,XR SET PTR TO FAILURE OFFSET ! 23111: MOV (XR),STXOF SAVE FAILURE OFFSET FOR CONTINUE ! 23112: MOV R$SXC,XR LOAD SETEXIT CDBLK POINTER ! 23113: BZE XR,LCNT1 CONTINUE IF NO SETEXIT TRAP ! 23114: ZER R$SXC ELSE RESET TRAP ! 23115: MOV =NULLS,STXVR RESET SETEXIT ARG TO NULL ! 23116: MOV (XR),XL LOAD PTR TO CODE BLOCK ROUTINE ! 23117: BRI XL EXECUTE FIRST TRAP STATEMENT ! 23118: * ! 23119: * INTERRUPTED PARTLY THROUGH A DUMP WHILST STORE IS IN A ! 23120: * MESS SO DO A TIDY UP OPERATION. SEE DUMPR FOR DETAILS. ! 23121: * ! 23122: ERR08 MOV DMVCH,XR CHAIN HEAD FOR AFFECTED VRBLKS ! 23123: BZE XR,ERR06 DONE IF ZERO ! 23124: MOV (XR),DMVCH SET NEXT LINK AS CHAIN HEAD ! 23125: JSR SETVR RESTORE VRGET FIELD ! 23126: BRN ERR08 LOOP THROUGH CHAIN ! 23127: TTL S P I T B O L -- HERE ENDETH THE CODE ! 23128: * ! 23129: * END OF ASSEMBLY ! 23130: * ! 23131: END END MACRO-SPITBOL ASSEMBLY ! 23132: ! 23133: ! 23134: ! 23135: ! 23136: ! 23137: ! 23138: ! 23139: ! 23140: ! 23141: ! 23142:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.