|
|
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: .DEF .CASL ! 444: .DEF .CAHT ! 445: .DEF .CIOD ! 446: .DEF .CSAX ! 447: .DEF .CSN8 ! 448: .DEF .CUCF ! 449: .DEF .CUEJ ! 450: .DEF .CULC ! 451: .DEF .CUST ! 452: TTL S P I T B O L -- PROCEDURES SECTION ! 453: * ! 454: * THIS SECTION STARTS WITH DESCRIPTIONS OF THE OPERATING ! 455: * SYSTEM DEPENDENT PROCEDURES WHICH ARE USED BY THE SPITBOL ! 456: * TRANSLATOR. ALL SUCH PROCEDURES HAVE FIVE LETTER NAMES ! 457: * BEGINNING WITH SYS. THEY ARE LISTED IN ALPHABETICAL ! 458: * ORDER. ! 459: * ALL PROCEDURES HAVE A SPECIFICATION CONSISTING OF A ! 460: * MODEL CALL, PRECEDED BY A POSSIBLY EMPTY LIST OF REGISTER ! 461: * CONTENTS GIVING PARAMETERS AVAILABLE TO THE PROCEDURE AND ! 462: * FOLLOWED BY A POSSIBLY EMPTY LIST OF REGISTER CONTENTS ! 463: * REQUIRED ON RETURN FROM THE CALL OR WHICH MAY HAVE HAD ! 464: * THEIR CONTENTS DESTROYED. ONLY THOSE REGISTERS EXPLICITLY ! 465: * MENTIONED IN THE LIST AFTER THE CALL MAY HAVE THEIR ! 466: * VALUES CHANGED. ! 467: * THE SEGMENT OF CODE PROVIDING THE EXTERNAL PROCEDURES IS ! 468: * CONVENIENTLY REFERRED TO AS OSINT (OPERATING SYSTEM ! 469: * INTERFACE). THE SYSXX PROCEDURES IT CONTAINS PROVIDE ! 470: * FACILITIES NOT USUALLY AVAILABLE AS PRIMITIVES IN ! 471: * ASSEMBLY LANGUAGES. FOR PARTICULAR TARGET MACHINES, ! 472: * IMPLEMENTORS MAY CHOOSE FOR SOME MINIMAL OPCODES WHICH ! 473: * DO NOT HAVE REASONABLY DIRECT TRANSLATIONS, TO USE CALLS ! 474: * OF ADDITIONAL PROCEDURES WHICH THEY PROVIDE IN OSINT. ! 475: * E.G. MWB OR TRC MIGHT BE TRANSLATED AS JSR SYSMB, ! 476: * JSR SYSTC IN SOME IMPLEMENTATIONS. ! 477: * ! 478: * IN THE DESCRIPTIONS, REFERENCE IS MADE TO --BLK ! 479: * FORMATS (-- = A PAIR OF LETTERS). SEE THE SPITBOL ! 480: * DEFINITIONS SECTION FOR DETAILED DESCRIPTIONS OF ALL ! 481: * SUCH BLOCK FORMATS EXCEPT FCBLK FOR WHICH SYSFC SHOULD ! 482: * BE CONSULTED. ! 483: * ! 484: * SECTION 0 CONTAINS INP,INR SPECIFICATIONS OF INTERNAL ! 485: * PROCEDURES,ROUTINES. THIS GIVES A SINGLE PASS TRANSLATOR ! 486: * INFORMATION MAKING IT EASY TO GENERATE ALTERNATIVE CALLS ! 487: * IN THE TRANSLATION OF JSR-S FOR PROCEDURES OF DIFFERENT ! 488: * TYPES IF THIS PROVES NECESSARY. ! 489: * ! 490: SEC START OF PROCEDURES SECTION ! 491: .IF .CSAX ! 492: EJC ! 493: * ! 494: * SYSAX -- AFTER EXECUTION ! 495: * ! 496: SYSAX EXP DEFINE EXTERNAL ENTRY POINT ! 497: * ! 498: * IF THE CONDITIONAL ASSEMBLY SYMBOL .CSAX IS DEFINED, ! 499: * THIS ROUTINE IS CALLED IMMEDIATELY AFTER EXECUTION AND ! 500: * BEFORE PRINTING OF EXECUTION STATISTICS OR DUMP OUTPUT. ! 501: * PURPOSE OF CALL IS FOR IMPLEMENTOR TO DETERMINE AND ! 502: * IF THE CALL IS NOT REQUIRED IT WILL BE OMITTED IF .CSAX ! 503: * IS UNDEFINED. IN THIS CASE SYSAX NEED NOT BE CODED. ! 504: * ! 505: * JSR SYSAX CALL AFTER EXECUTION ! 506: .ELSE ! 507: .FI ! 508: EJC ! 509: * ! 510: * SYSBX -- BEFORE EXECUTION ! 511: * ! 512: SYSBX EXP DEFINE EXTERNAL ENTRY POINT ! 513: * ! 514: * CALLED AFTER INITIAL SPITBOL COMPILATION AND BEFORE ! 515: * COMMENCING EXECUTION IN CASE OSINT NEEDS ! 516: * TO ASSIGN FILES OR PERFORM OTHER NECESSARY SERVICES. ! 517: * OSINT MAY ALSO CHOOSE TO SEND A MESSAGE TO ONLINE ! 518: * TERMINAL (IF ANY) INDICATING THAT EXECUTION IS STARTING. ! 519: * ! 520: * JSR SYSBX CALL BEFORE EXECUTION STARTS ! 521: EJC ! 522: .IF .CNCI ! 523: * ! 524: * SYSCI -- CONVERT INTEGER ! 525: * ! 526: SYSCI EXP ! 527: * ! 528: * SYSCI IS AN OPTIONAL OSINT ROUTINE THAT CAUSES SPITBOL TO ! 529: * CALL SYSCI TO CONVERT INTEGER VALUES TO STRINGS, RATHER ! 530: * THAN USING SPITBOL'S OWN INTERNAL CONVERSION CODE. THIS ! 531: * CODE MAY BE LESS EFFICIENT ON MACHINES WITH HARDWARE ! 532: * CONVERSION INSTRUCTIONS AND IN SUCH CASES, IT MAY BE AN ! 533: * ADVANTAGE TO INCLUDE SYSCI. THE SYMBOL .CNCI MUST BE ! 534: * DEFINED IF THIS ROUTINE IS TO BE USED. ! 535: * ! 536: * THE RULES FOR CONVERTING INTEGERS TO STRINGS ARE THAT ! 537: * POSITIVE VALUES ARE REPRESENTED WITHOUT ANY SIGN, AND ! 538: * THERE ARE NEVER ANY LEADING BLANKS OR ZEROS, EXCEPT IN ! 539: * THE CASE OF ZERO ITSELF WHICH IS REPRESENTED AS A SINGLE ! 540: * ZERO DIGIT. NEGATIVE NUMBERS ARE REPRESENTED WITH A ! 541: * PRECEEDING MINUS SIGN. THERE ARE NEVER ANY TRAILING ! 542: * BLANKS, AND CONVERSION CANNOT FAIL. ! 543: * ! 544: * (IA) VALUE TO BE CONVERTED ! 545: * JSR SYSCI CALL TO CONVERT INTEGER VALUE ! 546: * (XL) POINTER TO PSEUDO-SCBLK WITH STRING ! 547: EJC ! 548: .FI ! 549: * ! 550: * SYSDC -- DATE CHECK ! 551: * ! 552: SYSDC EXP DEFINE EXTERNAL ENTRY POINT ! 553: * ! 554: * SYSDC IS CALLED TO CHECK THAT THE EXPIRY DATE FOR A TRIAL ! 555: * VERSION OF SPITBOL IS UNEXPIRED. ! 556: * ! 557: * JSR SYSDC CALL TO CHECK DATE ! 558: * RETURN ONLY IF DATE IS OK ! 559: EJC ! 560: * ! 561: * SYSDM -- DUMP CORE ! 562: * ! 563: SYSDM EXP DEFINE EXTERNAL ENTRY POINT ! 564: * ! 565: * SYSDM IS CALLED BY A SPITBOL PROGRAM CALL OF DUMP(N) WITH ! 566: * N GE 3. ITS PURPOSE IS TO PROVIDE A CORE DUMP. ! 567: * N COULD HOLD AN ENCODING OF THE START ADRS FOR DUMP AND ! 568: * AMOUNT TO BE DUMPED E.G. N = 256*A + S , S = START ADRS ! 569: * IN KILOWORDS, A = KILOWORDS TO DUMP ! 570: * ! 571: * (XR) PARAMETER N OF CALL DUMP(N) ! 572: * JSR SYSDM CALL TO ENTER ROUTINE ! 573: EJC ! 574: * ! 575: * SYSDT -- GET CURRENT DATE ! 576: * ! 577: SYSDT EXP DEFINE EXTERNAL ENTRY POINT ! 578: * ! 579: * SYSDT IS USED TO OBTAIN THE CURRENT DATE. THE DATE IS ! 580: * RETURNED AS A CHARACTER STRING IN ANY FORMAT APPROPRIATE ! 581: * TO THE OPERATING SYSTEM IN USE. IT MAY ALSO CONTAIN THE ! 582: * CURRENT TIME OF DAY. SYSDT IS USED TO IMPLEMENT THE ! 583: * SNOBOL4 FUNCTION DATE. ! 584: * ! 585: * JSR SYSDT CALL TO GET DATE ! 586: * (XL) POINTER TO BLOCK CONTAINING DATE ! 587: * ! 588: * THE FORMAT OF THE BLOCK IS LIKE AN SCBLK EXCEPT THAT ! 589: * THE FIRST WORD NEED NOT BE SET. THE RESULT IS COPIED ! 590: * INTO SPITBOL DYNAMIC MEMORY ON RETURN. ! 591: EJC ! 592: * ! 593: * SYSEF -- EJECT FILE ! 594: * ! 595: SYSEF EXP DEFINE EXTERNAL ENTRY POINT ! 596: * ! 597: * SYSEF IS USED TO WRITE A PAGE EJECT TO A NAMED FILE. IT ! 598: * MAY ONLY BE USED FOR FILES WHERE THIS CONCEPT MAKES ! 599: * SENSE. NOTE THAT SYSEF IS NOT NORMALLY USED FOR THE ! 600: * STANDARD OUTPUT FILE (SEE SYSEP). ! 601: * ! 602: * (WA) PTR TO FCBLK OR ZERO ! 603: * (XR) EJECT ARGUMENT (SCBLK PTR) ! 604: * JSR SYSEF CALL TO EJECT FILE ! 605: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST ! 606: * PPM LOC RETURN HERE IF INAPPROPRIATE FILE ! 607: * PPM LOC RETURN HERE IF I/O ERROR ! 608: EJC ! 609: * ! 610: * SYSEJ -- END OF JOB ! 611: * ! 612: SYSEJ EXP DEFINE EXTERNAL ENTRY POINT ! 613: * ! 614: * SYSEJ IS CALLED ONCE AT THE END OF EXECUTION TO ! 615: * TERMINATE THE RUN. THE SIGNIFICANCE OF THE ABEND AND ! 616: * CODE VALUES IS SYSTEM DEPENDENT. IN GENERAL, THE CODE ! 617: * VALUE SHOULD BE MADE AVAILABLE FOR TESTING, AND THE ! 618: * ABEND VALUE SHOULD CAUSE SOME POST-MORTEM ACTION SUCH AS ! 619: * A DUMP. NOTE THAT SYSEJ DOES NOT RETURN TO ITS CALLER. ! 620: * SEE SYSXI FOR DETAILS OF FCBLK CHAIN ! 621: * ! 622: * (WA) VALUE OF ABEND KEYWORD ! 623: * (WB) VALUE OF CODE KEYWORD ! 624: * (XL) O OR PTR TO HEAD OF FCBLK CHAIN ! 625: * JSR SYSEJ CALL TO END JOB ! 626: * ! 627: * THE FOLLOWING SPECIAL VALUES ARE USED AS CODES IN (WB) ! 628: * 999 EXECUTION SUPPRESSED ! 629: * 998 STANDARD OUTPUT FILE FULL OR UNAVAILABLE IN A SYSXI ! 630: * LOAD MODULE. IN THESE CASES (WA) CONTAINS THE NUMBER ! 631: * OF THE STATEMENT CAUSING PREMATURE TERMINATION. ! 632: EJC ! 633: * ! 634: * SYSEM -- GET ERROR MESSAGE TEXT ! 635: * ! 636: SYSEM EXP DEFINE EXTERNAL ENTRY POINT ! 637: * ! 638: * SYSEM IS USED TO OBTAIN THE TEXT OF ERR, ERB CALLS IN THE ! 639: * SOURCE PROGRAM GIVEN THE ERROR CODE NUMBER. IT IS ALLOWED ! 640: * TO RETURN A NULL STRING IF THIS FACILITY IS UNAVAILABLE. ! 641: * ! 642: * (WA) ERROR CODE NUMBER ! 643: * JSR SYSEM CALL TO GET TEXT ! 644: * (XR) TEXT OF MESSAGE ! 645: * ! 646: * THE RETURNED VALUE IS A POINTER TO A BLOCK IN SCBLK ! 647: * FORMAT EXCEPT THAT THE FIRST WORD NEED NOT BE SET. THE ! 648: * STRING IS COPIED INTO DYNAMIC MEMORY ON RETURN. ! 649: * IF THE NULL STRING IS RETURNED EITHER BECAUSE SYSEM DOES ! 650: * NOT PROVIDE ERROR MESSAGE TEXTS OR BECAUSE WA IS OUT OF ! 651: * RANGE, SPITBOL WILL PRINT THE STRING STORED IN ERRTEXT ! 652: * KEYWORD. ! 653: EJC ! 654: * ! 655: * SYSEN -- ENDFILE ! 656: * ! 657: SYSEN EXP DEFINE EXTERNAL ENTRY POINT ! 658: * ! 659: * SYSEN IS USED TO IMPLEMENT THE SNOBOL4 FUNCTION ENDFILE. ! 660: * THE MEANING IS SYSTEM DEPENDENT. IN GENERAL, ENDFILE ! 661: * IMPLIES THAT NO FURTHER I/O OPERATIONS WILL BE PERFORMED, ! 662: * BUT DOES NOT GUARANTEE THIS TO BE THE CASE. THE FILE ! 663: * SHOULD BE CLOSED AFTER THE CALL, A SUBSEQUENT READ ! 664: * OR WRITE MAY REOPEN THE FILE AT THE START OR IT MAY BE ! 665: * NECESSARY TO REOPEN THE FILE VIA SYSIO. ! 666: * ! 667: * (WA) PTR TO FCBLK OR ZERO ! 668: * (XR) ENDFILE ARGUMENT (SCBLK PTR) ! 669: * JSR SYSEN CALL TO ENDFILE ! 670: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST ! 671: * PPM LOC RETURN HERE IF ENDFILE NOT ALLOWED ! 672: * PPM LOC RETURN HERE IF I/O ERROR ! 673: * (WA,WB) DESTROYED ! 674: * ! 675: * THE SECOND ERROR RETURN IS USED FOR FILES FOR WHICH ! 676: * ENDFILE IS NOT PERMITTED. FOR EXAMPLE, IT MAY BE EXPECTED ! 677: * THAT THE STANDARD INPUT AND OUTPUT FILES ARE IN THIS ! 678: * CATEGORY. ! 679: EJC ! 680: * ! 681: * SYSEP -- EJECT PRINTER PAGE ! 682: * ! 683: SYSEP EXP DEFINE EXTERNAL ENTRY POINT ! 684: * ! 685: * SYSEP IS CALLED TO PERFORM A PAGE EJECT ON THE STANDARD ! 686: * PRINTER OUTPUT FILE (CORRESPONDING TO SYSPR OUTPUT). ! 687: * ! 688: * JSR SYSEP CALL TO EJECT PRINTER OUTPUT ! 689: EJC ! 690: * ! 691: * SYSEX -- CALL EXTERNAL FUNCTION ! 692: * ! 693: SYSEX EXP DEFINE EXTERNAL ENTRY POINT ! 694: * ! 695: * SYSEX IS CALLED TO PASS CONTROL TO AN EXTERNAL FUNCTION ! 696: * PREVIOUSLY LOADED WITH A CALL TO SYSLD. ! 697: * ! 698: * (XS) POINTER TO ARGUMENTS ON STACK ! 699: * (XL) POINTER TO CONTROL BLOCK (EFBLK) ! 700: * (WA) NUMBER OF ARGUMENTS ON STACK ! 701: * JSR SYSEX CALL TO PASS CONTROL TO FUNCTION ! 702: * PPM LOC RETURN HERE IF FUNCTION CALL FAILS ! 703: * (XS) POPPED PAST ARGUMENTS ! 704: * (XR) RESULT RETURNED ! 705: * ! 706: * THE ARGUMENTS ARE STORED ON THE STACK WITH ! 707: * THE LAST ARGUMENT AT 0(XS). ON RETURN, XS ! 708: * IS POPPED PAST THE ARGUMENTS. ! 709: * ! 710: * THE FORM OF THE ARGUMENTS AS PASSED IS THAT USED IN THE ! 711: * SPITBOL TRANSLATOR (SEE DEFINITIONS AND DATA STRUCTURES ! 712: * SECTION). THE CONTROL BLOCK FORMAT IS ALSO DESCRIBED ! 713: * (UNDER EFBLK) IN THIS SECTION. ! 714: * ! 715: * THERE ARE TWO WAYS OF RETURNING A RESULT. ! 716: * ! 717: * 1) RETURN A POINTER TO A BLOCK IN DYNAMIC STORAGE. THIS ! 718: * BLOCK MUST BE IN EXACTLY CORRECT FORMAT, INCLUDING ! 719: * THE FIRST WORD. ONLY FUNCTIONS WRITTEN WITH INTIMATE ! 720: * KNOWLEDGE OF THE SYSTEM WILL RETURN IN THIS WAY. ! 721: * ! 722: * 2) STRING, INTEGER AND REAL RESULTS MAY BE RETURNED BY ! 723: * POINTING TO A PSEUDO-BLOCK OUTSIDE DYNAMIC MEMORY. ! 724: * THIS BLOCK IS IN ICBLK, RCBLK OR SCBLK FORMAT EXCEPT ! 725: * THAT THE FIRST WORD WILL BE OVERWRITTEN ! 726: * BY A TYPE WORD ON RETURN AND SO NEED NOT ! 727: * BE CORRECTLY SET. SUCH A RESULT IS ! 728: * COPIED INTO MAIN STORAGE BEFORE PROCEEDING. ! 729: * UNCONVERTED RESULTS MAY SIMILARLY BE RETURNED IN A ! 730: * PSEUDO-BLOCK WHICH IS IN CORRECT FORMAT INCLUDING ! 731: * TYPE WORD RECOGNISABLE BY GARBAGE COLLECTOR SINCE ! 732: * BLOCK IS COPIED INTO DYNAMIC MEMORY. ! 733: EJC ! 734: * ! 735: * SYSFC -- FILE CONTROL BLOCK ROUTINE ! 736: * ! 737: SYSFC EXP DEFINE EXTERNAL ENTRY POINT ! 738: * ! 739: * SEE ALSO SYSIO ! 740: * INPUT AND OUTPUT HAVE 3 ARGUMENTS REFERRED TO AS SHOWN ! 741: * INPUT(VARIABLE NAME,FILE ARG1,FILE ARG2) ! 742: * OUTPUT(VARIABLE NAME,FILE ARG1,FILE ARG2) ! 743: * FILE ARG1 MAY BE AN INTEGER OR STRING USED TO IDENTIFY ! 744: * AN I/O CHANNEL. IT IS CONVERTED TO A STRING FOR CHECKING. ! 745: * THE EXACT SIGNIFICANCE OF FILE ARG2 ! 746: * IS NOT RIGOROUSLY PRESCRIBED BUT TO IMPROVE PORTABILITY, ! 747: * THE SCHEME DESCRIBED IN THE SPITBOL USER MANUAL ! 748: * SHOULD BE ADOPTED WHEN POSSIBLE. THE PREFERRED FORM IS ! 749: * A STRING $F$,R$R$,C$C$,I$I$,...,Z$Z$ WHERE ! 750: * $F$ IS AN OPTIONAL FILE NAME WHICH IS PLACED FIRST. ! 751: * REMAINING ITEMS MAY BE OMITTED OR INCLUDED IN ANY ORDER. ! 752: * $R$ IS MAXIMUM RECORD LENGTH ! 753: * $C$ IS A CARRIAGE CONTROL CHARACTER OR CHARACTER STRING ! 754: * $I$ IS SOME FORM OF CHANNEL IDENTIFICATION USED IN THE ! 755: * ABSENCE OF $F$ TO ASSOCIATE THE VARIABLE ! 756: * WITH A FILE ALLOCATED DYNAMICALLY BY JCL COMMANDS AT ! 757: * SPITBOL LOAD TIME. ! 758: * ,...,Z$Z$ ARE ADDITIONAL FIELDS. ! 759: * IF , (COMMA) CANNOT BE USED AS A DELIMITER, .CIOD ! 760: * SHOULD BE DEFINED TO INTRODUCE BY CONDITIONAL ASSEMBLY ! 761: * ANOTHER DELIMITER (SEE ! 762: * IODEL EQU * ! 763: * EARLY IN DEFINITIONS SECTION). ! 764: * SYSFC IS CALLED WHEN A VARIABLE IS INPUT OR OUTPUT ! 765: * ASSOCIATED TO CHECK FILE ARG1 AND FILE ARG2 AND ! 766: * TO REPORT WHETHER AN FCBLK (FILE CONTROL ! 767: * BLOCK) IS NECESSARY AND IF SO WHAT SIZE IT SHOULD BE. ! 768: * THIS MAKES IT POSSIBLE FOR SPITBOL RATHER THAN OSINT TO ! 769: * ALLOCATE SUCH A BLOCK IN DYNAMIC MEMORY IF REQUIRED ! 770: * OR ALTERNATIVELY IN STATIC MEMORY. ! 771: * THE SIGNIFICANCE OF AN FCBLK , IF ONE IS REQUESTED, IS ! 772: * ENTIRELY UP TO THE SYSTEM INTERFACE. THE ONLY RESTRICTION ! 773: * IS THAT IF THE FCBLK SHOULD APPEAR TO LIE IN DYNAMIC ! 774: * MEMORY , POINTERS TO IT SHOULD BE PROPER POINTERS TO ! 775: * THE START OF A RECOGNISABLE AND GARBAGE COLLECTABLE ! 776: * BLOCK (THIS CONDITION WILL BE MET IF SYSFC REQUESTS ! 777: * SPITBOL TO PROVIDE AN FCBLK). ! 778: * AN OPTION IS PROVIDED FOR OSINT TO RETURN A POINTER IN ! 779: * XL TO AN FCBLK WHICH IT PRIVATELY ALLOCATED. THIS PTR ! 780: * WILL BE MADE AVAILABLE WHEN I/O OCCURS LATER. ! 781: * PRIVATE FCBLKS MAY HAVE ARBITRARY CONTENTS AND SPITBOL ! 782: * STORES NOTHING IN THEM. ! 783: EJC ! 784: * THE REQUESTED SIZE FOR AN FCBLK IN DYNAMIC MEMORY ! 785: * SHOULD ALLOW A 2 WORD OVERHEAD FOR BLOCK TYPE AND ! 786: * LENGTH FIELDS. INFORMATION SUBSEQUENTLY STORED IN THE ! 787: * REMAINING WORDS MAY BE ARBITRARY IF AN XNBLK (EXTERNAL ! 788: * NON-RELOCATABLE BLOCK) IS REQUESTED. IF THE REQUEST IS ! 789: * FOR AN XRBLK (EXTERNAL RELOCATABLE BLOCK) THE ! 790: * CONTENTS OF WORDS SHOULD BE COLLECTABLE (I.E. ANY ! 791: * APPARENT POINTERS INTO DYNAMIC SHOULD BE GENUINE BLOCK ! 792: * POINTERS). THESE RESTRICTIONS DO NOT APPLY IF AN FCBLK ! 793: * IS ALLOCATED OUTSIDE DYNAMIC OR IS NOT ALLOCATED AT ALL. ! 794: * IF AN FCBLK IS REQUESTED, ITS FIELDS WILL BE INITIALISED ! 795: * TO ZERO BEFORE ENTRY TO SYSIO WITH THE EXCEPTION OF ! 796: * WORDS 0 AND 1 IN WHICH THE BLOCK TYPE AND LENGTH ! 797: * FIELDS ARE PLACED FOR FCBLKS IN DYNAMIC MEMORY ONLY. ! 798: * FOR THE POSSIBLE USE OF SYSEJ AND SYSXI, IF FCBLKS ! 799: * ARE USED, A CHAIN IS BUILT SO THAT THEY MAY ALL BE ! 800: * FOUND - SEE SYSXI FOR DETAILS. ! 801: * IF BOTH FILE ARG1 AND FILE ARG2 ARE NULL, CALLS OF SYSFC ! 802: * AND SYSIO ARE OMITTED. ! 803: * IF FILE ARG1 IS NULL (STANDARD INPUT/OUTPUT FILE), SYSFC ! 804: * IS CALLED TO CHECK NON-NULL FILE ARG2 BUT ANY REQUEST ! 805: * FOR AN FCBLK WILL BE IGNORED, SINCE SPITBOL HANDLES THE ! 806: * STANDARD FILES SPECIALLY AND CANNOT READILY KEEP FCBLK ! 807: * POINTERS FOR THEM. ! 808: * FILEARG1 IS TYPE CHECKED BY SPITBOL SO FURTHER CHECKING ! 809: * MAY BE UNNECCESSARY IN MANY IMPLEMENTATIONS. ! 810: * FILE ARG2 IS PASSED SO THAT SYSFC MAY ANALYSE AND ! 811: * CHECK IT. HOWEVER TO ASSIST IN THIS, SPITBOL ALSO PASSES ! 812: * ON THE STACK THE COMPONENTS OF THIS ARGUMENT WITH ! 813: * FILE NAME, $F$ (OTHERWISE NULL) EXTRACTED AND STACKED ! 814: * FIRST. ! 815: * THE OTHER FIELDS, IF ANY, ARE EXTRACTED AS SUBSTRINGS, ! 816: * POINTERS TO THEM ARE STACKED AND A COUNT OF ALL ITEMS ! 817: * STACKED IS PLACED IN WC. IF AN FCBLK WAS EARLIER ! 818: * ALLOCATED AND POINTED TO VIA FILE ARG1, SYSFC IS ALSO ! 819: * PASSED A POINTER TO THIS FCBLK. ! 820: * ! 821: * (XL) FILE ARG1 SCBLK PTR (2ND ARG) ! 822: * (XR) FILEARG2 (3RD ARG) OR NULL ! 823: * -(XS)...-(XS) SCBLKS FOR $F$,$R$,$C$,... ! 824: * (WC) NO. OF STACKED SCBLKS ABOVE ! 825: * (WA) EXISTING FILE ARG1 FCBLK PTR OR 0 ! 826: * (WB) 0/3 FOR INPUT/OUTPUT ASSOCN ! 827: * JSR SYSFC CALL TO CHECK NEED FOR FCBLK ! 828: * PPM LOC INVALID FILE ARGUMENT ! 829: * (XS) POPPED (WC) TIMES ! 830: * (WA NON ZERO) BYTE SIZE OF REQUESTED FCBLK ! 831: * (WA=0,XL NON ZERO) PRIVATE FCBLK PTR IN XL ! 832: * (WA=XL=0) NO FCBLK WANTED, NO PRIVATE FCBLK ! 833: * (WC) 0/1/2 REQUEST ALLOC OF XRBLK/XNBLK ! 834: * /STATIC BLOCK FOR USE AS FCBLK ! 835: * (WB) DESTROYED ! 836: EJC ! 837: * ! 838: * SYSHS -- GIVE ACCESS TO HOST COMPUTER FEATURES ! 839: * ! 840: SYSHS EXP DEFINE EXTERNAL ENTRY POINT ! 841: * ! 842: * PROVIDES MEANS FOR IMPLEMENTING SPECIAL FEATURES ! 843: * ON DIFFERENT HOST COMPUTERS. THE ONLY DEFINED ENTRY IS ! 844: * THAT WHERE ALL ARGUMENTS ARE NULL IN WHICH CASE SYSHS ! 845: * RETURNS AN SCBLK CONTAINING NAME OF COMPUTER, ! 846: * NAME OF OPERATING SYSTEM AND NAME OF SITE SEPARATED BY ! 847: * COLONS. THE SCBLK NEED NOT HAVE A CORRECT FIRST FIELD ! 848: * AS THIS IS SUPPLIED ON COPYING STRING TO DYNAMIC MEMORY. ! 849: * SPITBOL DOES NO ARGUMENT CHECKING BUT DOES PROVIDE A ! 850: * SINGLE ERROR RETURN FOR ARGUMENTS CHECKED AS ERRONEOUS ! 851: * BY OSINT. IT ALSO PROVIDES A SINGLE EXECUTION ERROR ! 852: * RETURN. IF THESE ARE INADEQUATE, USE MAY BE MADE OF THE ! 853: * MINIMAL ERROR SECTION DIRECT AS DESCRIBED IN MINIMAL ! 854: * DOCUMENTATION, SECTION 10. ! 855: * SEVERAL NON-ERROR RETURNS ARE PROVIDED. THE FIRST ! 856: * CORRESPONDS TO THE DEFINED ENTRY OR, FOR IMPLEMENTATION ! 857: * DEFINED ENTRIES, ANY STRING MAY BE RETURNED. THE OTHERS ! 858: * PERMIT RESPECTIVELY, RETURN A NULL RESULT, RETURN WITH A ! 859: * RESULT TO BE STACKED WHICH IS POINTED AT BY XR, AND A ! 860: * RETURN CAUSING SPITBOL STATEMENT FAILURE. IF A RETURNED ! 861: * RESULT IS IN DYNAMIC MEMORY IT MUST OBEY GARBAGE ! 862: * COLLECTOR RULES. THE ONLY RESULTS COPIED ON RETURN ! 863: * ARE STRINGS RETURNED VIA PPM LOC3 RETURN. ! 864: * ! 865: * (WA) ARGUMENT 1 ! 866: * (XL) ARGUMENT 2 ! 867: * (XR) ARGUMENT 3 ! 868: * JSR SYSHS CALL TO GET HOST INFORMATION ! 869: * PPM LOC1 ERRONEOUS ARG ! 870: * PPM LOC2 EXECUTION ERROR ! 871: * PPM LOC3 SCBLK PTR IN XL OR 0 IF UNAVAILABLE ! 872: * PPM LOC4 RETURN A NULL RESULT ! 873: * PPM LOC5 RETURN RESULT IN XR ! 874: * PPM LOC6 CAUSE STATEMENT FAILURE ! 875: EJC ! 876: * ! 877: * SYSID -- RETURN SYSTEM IDENTIFICATION ! 878: * ! 879: SYSID EXP DEFINE EXTERNAL ENTRY POINT ! 880: * ! 881: * THIS ROUTINE SHOULD RETURN STRINGS TO HEAD THE STANDARD ! 882: * PRINTER OUTPUT. THE FIRST STRING WILL BE APPENDED TO ! 883: * A HEADING LINE OF THE FORM ! 884: * MACRO SPITBOL VERSION V.V ! 885: * SUPPLIED BY SPITBOL ITSELF. V.V ARE DIGITS GIVING THE ! 886: * MAJOR VERSION NUMBER AND GENERALLY AT LEAST A MINOR ! 887: * VERSION NUMBER RELATING TO OSINT SHOULD BE SUPPLIED TO ! 888: * GIVE SAY ! 889: * MACRO SPITBOL VERSION V.V(M.M) ! 890: * THE SECOND STRING SHOULD IDENTIFY AT LEAST THE MACHINE ! 891: * AND OPERATING SYSTEM. PREFERABLY IT SHOULD INCLUDE ! 892: * THE DATE AND TIME OF THE RUN. ! 893: * OPTIONALLY THE STRINGS MAY INCLUDE SITE NAME OF THE ! 894: * THE IMPLEMENTOR AND/OR MACHINE ON WHICH RUN TAKES PLACE, ! 895: * UNIQUE SITE OR COPY NUMBER AND OTHER INFORMATION AS ! 896: * APPROPRIATE WITHOUT MAKING IT SO LONG AS TO BE A ! 897: * NUISANCE TO USERS. ! 898: * THE FIRST WORDS OF THE SCBLKS POINTED AT NEED NOT BE ! 899: * CORRECTLY SET. ! 900: * ! 901: * JSR SYSID CALL FOR SYSTEM IDENTIFICATION ! 902: * (XR) SCBLK PTR FOR ADDITION TO HEADER ! 903: * (XL) PTR TO SECOND HEADER SCBLK ! 904: EJC ! 905: * ! 906: * SYSIL -- GET INPUT RECORD LENGTH ! 907: * ! 908: SYSIL EXP DEFINE EXTERNAL ENTRY POINT ! 909: * ! 910: * SYSIL IS USED TO GET THE LENGTH OF THE NEXT INPUT RECORD ! 911: * FROM A FILE PREVIOUSLY INPUT ASSOCIATED WITH A SYSIO ! 912: * CALL. THE LENGTH RETURNED IS USED TO ESTABLISH A BUFFER ! 913: * FOR A SUBSEQUENT SYSIN CALL. ! 914: * ! 915: * (WA) PTR TO FCBLK OR ZERO ! 916: * JSR SYSIL CALL TO GET RECORD LENGTH ! 917: * (WA) LENGTH OR ZERO IF FILE CLOSED ! 918: * ! 919: * NO HARM IS DONE IF THE VALUE RETURNED IS TOO LONG SINCE ! 920: * UNUSED SPACE WILL BE RECLAIMED AFTER THE SYSIN CALL. ! 921: * ! 922: * NOTE THAT IT IS THE SYSIL CALL (NOT THE SYSIO CALL) WHICH ! 923: * CAUSES THE FILE TO BE OPENED AS REQUIRED FOR THE FIRST ! 924: * RECORD INPUT FROM THE FILE. ! 925: EJC ! 926: * ! 927: * SYSIN -- READ INPUT RECORD ! 928: * ! 929: SYSIN EXP DEFINE EXTERNAL ENTRY POINT ! 930: * ! 931: * SYSIN IS USED TO READ A RECORD FROM THE FILE WHICH WAS ! 932: * REFERENCED IN A PRIOR CALL TO SYSIL (I.E. THESE CALLS ! 933: * ALWAYS OCCUR IN PAIRS). THE BUFFER PROVIDED IS AN ! 934: * SCBLK FOR A STRING OF LENGTH SET FROM THE SYSIL CALL. ! 935: * IF THE ACTUAL LENGTH READ IS LESS THAN THIS, THE LENGTH ! 936: * FIELD OF THE SCBLK MUST BE MODIFIED BEFORE RETURNING ! 937: * UNLESS BUFFER IS RIGHT PADDED WITH ZEROES. ! 938: * IT IS ALSO PERMISSIBLE TO TAKE ANY OF THE ALTERNATIVE ! 939: * RETURNS AFTER SCBLK LENGTH HAS BEEN MODIFIED. ! 940: * ! 941: * (WA) PTR TO FCBLK OR ZERO ! 942: * (XR) POINTER TO BUFFER (SCBLK PTR) ! 943: * JSR SYSIN CALL TO READ RECORD ! 944: * PPM LOC ENDFILE OR NO I/P FILE AFTER SYSXI ! 945: * PPM LOC RETURN HERE IF I/O ERROR ! 946: * PPM LOC RETURN HERE IF RECORD FORMAT ERROR ! 947: * (WA,WB,WC) DESTROYED ! 948: EJC ! 949: * ! 950: * SYSIO -- INPUT/OUTPUT FILE ASSOCIATION ! 951: * ! 952: SYSIO EXP DEFINE EXTERNAL ENTRY POINT ! 953: * ! 954: * SEE ALSO SYSFC. ! 955: * SYSIO IS CALLED IN RESPONSE TO A SNOBOL4 INPUT OR OUTPUT ! 956: * FUNCTION CALL EXCEPT WHEN FILE ARG1 AND FILE ARG2 ! 957: * ARE BOTH NULL. ! 958: * ITS CALL ALWAYS FOLLOWS IMMEDIATELY AFTER A CALL ! 959: * OF SYSFC. IF SYSFC REQUESTED ALLOCATION ! 960: * OF AN FCBLK, ITS ADDRESS WILL BE IN WA. ! 961: * FOR INPUT FILES, NON-ZERO VALUES OF $R$ SHOULD BE ! 962: * COPIED TO WC FOR USE IN ALLOCATING INPUT BUFFERS. IF $R$ ! 963: * IS DEFAULTED OR NOT IMPLEMENTED, WC SHOULD BE ZEROISED. ! 964: * ONCE A FILE HAS BEEN OPENED, SUBSEQUENT INPUT(),OUTPUT() ! 965: * CALLS IN WHICH THE SECOND ARGUMENT IS IDENTICAL WITH THAT ! 966: * IN A PREVIOUS CALL, MERELY ASSOCIATE THE ADDITIONAL ! 967: * VARIABLE NAME (FIRST ARGUMENT) TO THE FILE AND DO NOT ! 968: * RESULT IN RE-OPENING THE FILE. ! 969: * IN SUBSEQUENT ASSOCIATED ACCESSES TO THE FILE A POINTER ! 970: * TO ANY FCBLK ALLOCATED WILL BE MADE AVAILABLE. ! 971: * ! 972: * (XL) FILE ARG1 SCBLK PTR (2ND ARG) ! 973: * (XR) FILE ARG2 SCBLK PTR (3RD ARG) ! 974: * (WA) FCBLK PTR (0 IF NONE) ! 975: * (WB) 0 FOR INPUT, 3 FOR OUTPUT ! 976: * JSR SYSIO CALL TO ASSOCIATE FILE ! 977: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST ! 978: * PPM LOC RETURN IF INPUT/OUTPUT NOT ALLOWED ! 979: * (XL) FCBLK POINTER (0 IF NONE) ! 980: * (WC) 0 (FOR DEFAULT) OR MAX RECORD LNGTH ! 981: * (WA,WB) DESTROYED ! 982: * ! 983: * THE SECOND ERROR RETURN IS USED IF THE FILE NAMED EXISTS ! 984: * BUT INPUT/OUTPUT FROM THE FILE IS NOT ALLOWED. FOR ! 985: * EXAMPLE, THE STANDARD OUTPUT FILE MAY BE IN THIS CATEGORY ! 986: * AS REGARDS INPUT ASSOCIATION. ! 987: EJC ! 988: * ! 989: * SYSLD -- LOAD EXTERNAL FUNCTION ! 990: * ! 991: SYSLD EXP DEFINE EXTERNAL ENTRY POINT ! 992: * ! 993: * SYSLD IS CALLED IN RESPONSE TO THE USE OF THE SNOBOL4 ! 994: * LOAD FUNCTION. THE NAMED FUNCTION IS LOADED (WHATEVER ! 995: * THIS MEANS), AND A POINTER IS RETURNED. THE POINTER WILL ! 996: * BE USED ON SUBSEQUENT CALLS TO THE FUNCTION (SEE SYSEX). ! 997: * ! 998: * (XR) POINTER TO FUNCTION NAME (SCBLK) ! 999: * (XL) POINTER TO LIBRARY NAME (SCBLK) ! 1000: * JSR SYSLD CALL TO LOAD FUNCTION ! 1001: * PPM LOC RETURN HERE IF FUNC DOES NOT EXIST ! 1002: * PPM LOC RETURN HERE IF I/O ERROR ! 1003: * (XR) POINTER TO LOADED CODE ! 1004: * ! 1005: * THE SIGNIFICANCE OF THE POINTER RETURNED IS UP TO THE ! 1006: * SYSTEM INTERFACE ROUTINE. THE ONLY RESTRICTION IS THAT ! 1007: * IF THE POINTER IS WITHIN DYNAMIC STORAGE, IT MUST BE ! 1008: * A PROPER BLOCK POINTER. ! 1009: EJC ! 1010: * ! 1011: * SYSMM -- GET MORE MEMORY ! 1012: * ! 1013: SYSMM EXP DEFINE EXTERNAL ENTRY POINT ! 1014: * ! 1015: * SYSMM IS CALLED IN AN ATTEMPT TO ALLOCATE MORE DYNAMIC ! 1016: * MEMORY. THIS MEMORY MUST BE ALLOCATED CONTIGUOUSLY WITH ! 1017: * THE CURRENT DYNAMIC DATA AREA. ! 1018: * ! 1019: * THE AMOUNT ALLOCATED IS UP TO THE SYSTEM TO DECIDE. ANY ! 1020: * VALUE IS ACCEPTABLE INCLUDING ZERO IF ALLOCATION IS ! 1021: * IMPOSSIBLE. ! 1022: * ! 1023: * JSR SYSMM CALL TO GET MORE MEMORY ! 1024: * (XR) NUMBER OF ADDITIONAL WORDS OBTAINED ! 1025: EJC ! 1026: * ! 1027: * SYSMX -- SUPPLY MXLEN ! 1028: * ! 1029: SYSMX EXP DEFINE EXTERNAL ENTRY POINT ! 1030: * ! 1031: * BECAUSE OF THE METHOD OF GARBAGE COLLECTION, NO SPITBOL ! 1032: * OBJECT IS ALLOWED TO OCCUPY MORE BYTES OF MEMORY THAN ! 1033: * THE INTEGER GIVING THE LOWEST ADDRESS OF DYNAMIC ! 1034: * (GARBAGE COLLECTABLE) MEMORY. MXLEN IS THE NAME USED TO ! 1035: * REFER TO THIS MAXIMUM LENGTH OF AN OBJECT AND FOR MOST ! 1036: * USERS OF MOST IMPLEMENTATIONS, PROVIDED DYNAMIC MEMORY ! 1037: * STARTS AT AN ADDRESS OF AT LEAST A FEW THOUSAND WORDS, ! 1038: * THERE IS NO PROBLEM. ! 1039: * IF THE DEFAULT STARTING ADDRESS IS LESS THAN SAY 10000 OR ! 1040: * 20000, THEN A LOAD TIME OPTION SHOULD BE PROVIDED WHERE A ! 1041: * USER CAN REQUEST THAT HE BE ABLE TO CREATE LARGER ! 1042: * OBJECTS. THIS ROUTINE INFORMS SPITBOL OF THIS REQUEST IF ! 1043: * ANY. THE VALUE RETURNED IS EITHER AN INTEGER ! 1044: * REPRESENTING THE DESIRED VALUE OF MXLEN (AND HENCE THE ! 1045: * MINIMUM DYNAMIC STORE ADDRESS WHICH MAY RESULT IN ! 1046: * NON-USE OF SOME STORE) OR ZERO IF A DEFAULT IS ACCEPTABLE ! 1047: * IN WHICH MXLEN IS SET TO THE LOWEST ADDRESS ALLOCATED ! 1048: * TO DYNAMIC STORE BEFORE COMPILATION STARTS. ! 1049: * IF A NON-ZERO VALUE IS RETURNED, THIS IS USED FOR KEYWORD ! 1050: * MAXLNGTH. OTHERWISE THE INITIAL LOW ADDRESS OF DYNAMIC ! 1051: * MEMORY IS USED FOR THIS KEYWORD. ! 1052: * ! 1053: * JSR SYSMX CALL TO GET MXLEN ! 1054: * (WA) EITHER MXLEN OR 0 FOR DEFAULT ! 1055: EJC ! 1056: * ! 1057: * SYSOU -- OUTPUT RECORD ! 1058: * ! 1059: SYSOU EXP DEFINE EXTERNAL ENTRY POINT ! 1060: * ! 1061: * SYSOU IS USED TO WRITE A RECORD TO A FILE PREVIOUSLY ! 1062: * ASSOCIATED WITH A SYSIO CALL. ! 1063: * ! 1064: * (WA) PTR TO FCBLK OR ZERO ! 1065: * (XR) RECORD TO BE WRITTEN (SCBLK) ! 1066: * JSR SYSOU CALL TO OUTPUT RECORD ! 1067: * PPM LOC FILE FULL OR NO FILE AFTER SYSXI ! 1068: * PPM LOC RETURN HERE IF I/O ERROR ! 1069: * (WA,WB,WC) DESTROYED ! 1070: * ! 1071: * NOTE THAT IT IS THE SYSOU CALL (NOT THE SYSIO CALL) WHICH ! 1072: * CAUSES THE FILE TO BE OPENED AS REQUIRED FOR THE FIRST ! 1073: * RECORD OUTPUT TO THE FILE. ! 1074: EJC ! 1075: * ! 1076: * SYSPI -- PRINT ON INTERACTIVE CHANNEL ! 1077: * ! 1078: SYSPI EXP DEFINE EXTERNAL ENTRY POINT ! 1079: * ! 1080: * IF SPITBOL IS RUN FROM AN ONLINE TERMINAL, OSINT CAN ! 1081: * REQUEST THAT MESSAGES SUCH AS COPIES OF COMPILATION ! 1082: * ERRORS BE SENT TO THE TERMINAL (SEE SYSPP). IF RELEVANT ! 1083: * REPLY WAS MADE BY SYSPP THEN SYSPI IS CALLED TO SEND SUCH ! 1084: * MESSAGES TO THE INTERACTIVE CHANNEL. ! 1085: * SYSPI IS ALSO USED FOR SENDING OUTPUT TO THE TERMINAL ! 1086: * THROUGH THE SPECIAL VARIABLE NAME, TERMINAL. ! 1087: * ! 1088: * (XR) PTR TO LINE BUFFER (SCBLK) ! 1089: * (WA) LINE LENGTH ! 1090: * JSR SYSPI CALL TO PRINT LINE ! 1091: * PPM LOC FAILURE RETURN ! 1092: * (WA,WB) DESTROYED ! 1093: EJC ! 1094: * ! 1095: * SYSPP -- OBTAIN PRINT PARAMETERS ! 1096: * ! 1097: SYSPP EXP DEFINE EXTERNAL ENTRY POINT ! 1098: * ! 1099: * SYSPP IS CALLED ONCE DURING COMPILATION TO OBTAIN ! 1100: * PARAMETERS REQUIRED FOR CORRECT PRINTED OUTPUT FORMAT ! 1101: * AND TO SELECT OTHER OPTIONS. IT MAY ALSO BE CALLED AGAIN ! 1102: * AFTER SYSXI WHEN A LOAD MODULE IS RESUMED. IN THIS ! 1103: * CASE THE VALUE RETURNED IN WA MAY BE LESS THAN OR EQUAL ! 1104: * TO THAT RETURNED IN INITIAL CALL BUT MAY NOT BE ! 1105: * GREATER. ! 1106: * THE INFORMATION RETURNED IS - ! 1107: * 1. LINE LENGTH IN CHARS FOR STANDARD PRINT FILE ! 1108: * 2. NO OF LINES/PAGE. 0 IS PREFERABLE FOR A NON-PAGED ! 1109: * DEVICE (E.G. ONLINE TERMINAL) IN WHICH CASE LISTING ! 1110: * PAGE THROWS ARE SUPPRESSED AND PAGE HEADERS ! 1111: * RESULTING FROM -TITLE,-STITL LINES ARE KEPT SHORT. ! 1112: * 3. AN INITIAL -NOLIST OPTION TO SUPPRESS LISTING UNLESS ! 1113: * THE PROGRAM CONTAINS AN EXPLICIT -LIST. ! 1114: * 4. OPTIONS TO SUPPRESS LISTING OF COMPILATION AND/OR ! 1115: * EXECUTION STATS (USEFUL FOR ESTABLISHED PROGRAMS) - ! 1116: * COMBINED WITH 3. GIVES POSSIBILITY OF LISTING ! 1117: * FILE NEVER BEING OPENED. ! 1118: * 5. OPTION TO HAVE COPIES OF ERRORS SENT TO AN ! 1119: * INTERACTIVE CHANNEL IN ADDITION TO STANDARD PRINTER. ! 1120: * 6. OPTION TO KEEP PAGE HEADERS SHORT (E.G. IF LISTING ! 1121: * TO AN ONLINE TERMINAL). ! 1122: * 7. AN OPTION TO CHOOSE EXTENDED OR COMPACT LISTING ! 1123: * FORMAT. IN THE FORMER A PAGE EJECT AND IN THE LATTER ! 1124: * A FEW LINE FEEDS PRECEDE THE PRINTING OF EACH ! 1125: * OF-- LISTING, COMPILATION STATISTICS, EXECUTION ! 1126: * OUTPUT AND EXECUTION STATISTICS. ! 1127: * 8. AN OPTION TO SUPPRESS EXECUTION AS THOUGH A ! 1128: * -NOEXECUTE CARD WERE SUPPLIED. ! 1129: * 9. AN OPTION TO REQUEST THAT NAME /TERMINAL/ BE PRE- ! 1130: * ASSOCIATED TO AN ONLINE TERMINAL VIA SYSPI AND SYSRI ! 1131: * 10. AN INTERMEDIATE (STANDARD) LISTING OPTION REQUIRING ! 1132: * THAT PAGE EJECTS OCCUR IN SOURCE LISTINGS. REDUNDANT ! 1133: * IF EXTENDED OPTION CHOSEN BUT PARTIALLY EXTENDS ! 1134: * COMPACT OPTION. ! 1135: * 11. OPTION TO SUPPRESS SYSID IDENTIFICATION. ! 1136: * ! 1137: * JSR SYSPP CALL TO GET PRINT PARAMETERS ! 1138: * (WA) PRINT LINE LENGTH IN CHARS ! 1139: * (WB) NUMBER OF LINES/PAGE ! 1140: * (WC) BITS VALUE ...JIHGFEDCBA WHERE ! 1141: * A = 1 TO SEND ERROR COPY TO INT.CH. ! 1142: * B = 1 MEANS STD PRINTER IS INT. CH. ! 1143: * C = 1 FOR -NOLIST OPTION ! 1144: * D = 1 TO SUPPRESS COMPILN. STATS ! 1145: * E = 1 TO SUPPRESS EXECN. STATS ! 1146: * F = 1/0 FOR EXTNDED/COMPACT LISTING ! 1147: * G = 1 FOR -NOEXECUTE ! 1148: * H = 1 PRE-ASSOCIATE /TERMINAL/ ! 1149: * I = 1 FOR STANDARD LISTING OPTION. ! 1150: * J = 1 SUPPRESSES LISTING HEADER ! 1151: EJC ! 1152: * ! 1153: * SYSPR -- PRINT LINE ON STANDARD OUTPUT FILE ! 1154: * ! 1155: SYSPR EXP DEFINE EXTERNAL ENTRY POINT ! 1156: * ! 1157: * SYSPR IS USED TO PRINT A SINGLE LINE ON THE STANDARD ! 1158: * OUTPUT FILE. ! 1159: * ! 1160: * (XR) POINTER TO LINE BUFFER (SCBLK) ! 1161: * (WA) LINE LENGTH ! 1162: * JSR SYSPR CALL TO PRINT LINE ! 1163: * PPM LOC TOO MUCH O/P OR NO FILE AFTER SYSXI ! 1164: * (WA,WB) DESTROYED ! 1165: * ! 1166: * THE BUFFER POINTED TO IS THE LENGTH OBTAINED FROM THE ! 1167: * SYSPP CALL AND IS FILLED OUT WITH TRAILING BLANKS. THE ! 1168: * VALUE IN WA IS THE ACTUAL LINE LENGTH WHICH MAY BE LESS ! 1169: * THAN THE MAXIMUM LINE LENGTH POSSIBLE. THERE IS NO SPACE ! 1170: * CONTROL ASSOCIATED WITH THE LINE, ALL LINES ARE PRINTED ! 1171: * SINGLE SPACED. NOTE THAT NULL LINES (WA=0) ARE POSSIBLE ! 1172: * IN WHICH CASE A BLANK LINE IS TO BE PRINTED. ! 1173: * ! 1174: * THE ERROR EXIT IS USED FOR SYSTEMS WHICH LIMIT THE AMOUNT ! 1175: * OF PRINTED OUTPUT. IF POSSIBLE, PRINTING SHOULD BE ! 1176: * PERMITTED AFTER THIS CONDITION HAS BEEN SIGNALLED ONCE TO ! 1177: * ALLOW FOR DUMP AND OTHER DIAGNOSTIC INFORMATION. ! 1178: * ASSUMING THIS TO BE POSSIBLE, SPITBOL MAY MAKE MORE SYSPR ! 1179: * CALLS. IF THE ERROR RETURN OCCURS ANOTHER TIME, EXECUTION ! 1180: * IS TERMINATED BY A CALL OF SYSEJ WITH ENDING CODE 998. ! 1181: EJC ! 1182: * ! 1183: * SYSRD -- READ RECORD FROM STANDARD INPUT FILE ! 1184: * ! 1185: SYSRD EXP DEFINE EXTERNAL ENTRY POINT ! 1186: * ! 1187: * SYSRD IS USED TO READ A RECORD FROM THE STANDARD INPUT ! 1188: * FILE. THE BUFFER PROVIDED IS AN SCBLK FOR A STRING THE ! 1189: * LENGTH OF WHICH IN CHARACTERS IS GIVEN IN WC, THIS ! 1190: * CORRESPONDING TO THE MAXIMUM LENGTH OF STRING WHICH ! 1191: * SPITBOL IS PREPARED TO RECEIVE. AT COMPILE TIME IT ! 1192: * CORRESPONDS TO XXX IN THE MOST RECENT -INXXX CARD ! 1193: * (DEFAULT 72) AND AT EXECUTION TIME TO THE MOST RECENT ! 1194: * ,R$R$ (RECORD LENGTH) IN THE THIRD ARG OF AN INPUT() ! 1195: * STATEMENT FOR THE STANDARD INPUT FILE (DEFAULT 80). ! 1196: * IF FEWER THAN (WC) CHARACTERS ARE READ, THE LENGTH ! 1197: * FIELD OF THE SCBLK MUST BE ADJUSTED BEFORE RETURNING ! 1198: * UNLESS THE BUFFER IS RIGHT PADDED WITH ZEROES. ! 1199: * IT IS ALSO PERMISSIBLE TO TAKE THE ALTERNATIVE RETURN ! 1200: * AFTER SUCH AN ADJUSTMENT HAS BEEN MADE. ! 1201: * SPITBOL MAY CONTINUE TO MAKE CALLS AFTER AN ENDFILE ! 1202: * RETURN SO THIS ROUTINE SHOULD BE PREPARED TO MAKE ! 1203: * REPEATED ENDFILE RETURNS. ! 1204: * ! 1205: * (XR) POINTER TO BUFFER (SCBLK PTR) ! 1206: * (WC) LENGTH OF BUFFER IN CHARACTERS ! 1207: * JSR SYSRD CALL TO READ LINE ! 1208: * PPM LOC ENDFILE OR NO I/P FILE AFTER SYSXI ! 1209: * (WA,WB,WC) DESTROYED ! 1210: EJC ! 1211: * ! 1212: * SYSRI -- READ RECORD FROM INTERACTIVE CHANNEL ! 1213: * ! 1214: SYSRI EXP DEFINE EXTERNAL ENTRY POINT ! 1215: * ! 1216: * READS A RECORD FROM ONLINE TERMINAL FOR SPITBOL VARIABLE, ! 1217: * TERMINAL. IF ONLINE TERMINAL IS UNAVAILABLE THEN CODE THE ! 1218: * ENDFILE RETURN ONLY. ! 1219: * THE BUFFER PROVIDED IS OF LENGTH 120 CHARACTERS. SYSRI ! 1220: * SHOULD REPLACE THE COUNT IN THE SECOND WORD OF THE SCBLK ! 1221: * BY THE ACTUAL CHARACTER COUNT UNLESS BUFFER IS RIGHT ! 1222: * PADDED WITH ZEROES. ! 1223: * IT IS ALSO PERMISSIBLE TO TAKE THE ALTERNATIVE ! 1224: * RETURN AFTER ADJUSTING THE COUNT. ! 1225: * THE END OF FILE RETURN MAY BE USED IF THIS MAKES ! 1226: * SENSE ON THE TARGET MACHINE (E.G. IF THERE IS AN ! 1227: * EOF CHARACTER.) ! 1228: * ! 1229: * (XR) PTR TO 120 CHAR BUFFER (SCBLK PTR) ! 1230: * JSR SYSRI CALL TO READ LINE FROM TERMINAL ! 1231: * PPM LOC END OF FILE RETURN ! 1232: * (WA,WB,WC) MAY BE DESTROYED ! 1233: EJC ! 1234: * ! 1235: * SYSRW -- REWIND FILE ! 1236: * ! 1237: SYSRW EXP DEFINE EXTERNAL ENTRY POINT ! 1238: * ! 1239: * SYSRW IS USED TO REWIND A FILE I.E. REPOSITION THE FILE ! 1240: * AT THE START BEFORE THE FIRST RECORD. THE FILE SHOULD BE ! 1241: * CLOSED AND THE NEXT READ OR WRITE CALL WILL OPEN THE ! 1242: * FILE AT THE START. ! 1243: * ! 1244: * (WA) PTR TO FCBLK OR ZERO ! 1245: * (XR) REWIND ARG (SCBLK PTR) ! 1246: * JSR SYSRW CALL TO REWIND FILE ! 1247: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST ! 1248: * PPM LOC RETURN HERE IF REWIND NOT ALLOWED ! 1249: * PPM LOC RETURN HERE IF I/O ERROR ! 1250: EJC ! 1251: .IF .CUST ! 1252: * ! 1253: * SYSST -- SET FILE POINTER ! 1254: * ! 1255: SYSST EXP DEFINE EXTERNAL ENTRY POINT ! 1256: * ! 1257: * SYSST IS CALLED TO CHANGE THE POSITION OF A FILE ! 1258: * POINTER. THIS IS ACCOMPLISHED IN A SYSTEM DEPENDENT ! 1259: * MANNER, AND THUS THE 2ND AND 3RD ARGUMENTS ARE PASSED ! 1260: * UNCONVERTED. ! 1261: * ! 1262: * (WA) FCBLK POINTER ! 1263: * (WB) 2ND ARGUMENT ! 1264: * (WC) 3RD ARGUMENT ! 1265: * JSR SYSST CALL TO SET FILE POINTER ! 1266: * PPM LOC RETURN HERE IF INVALID 2ND ARG ! 1267: * PPM LOC RETURN HERE IF INVALID 3RD ARG ! 1268: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST ! 1269: * PPM LOC RETURN HERE IF SET NOT ALLOWED ! 1270: * PPM LOC RETURN HERE IF I/O ERROR ! 1271: * ! 1272: EJC ! 1273: .FI ! 1274: * ! 1275: * SYSTM -- GET EXECUTION TIME SO FAR ! 1276: * ! 1277: SYSTM EXP DEFINE EXTERNAL ENTRY POINT ! 1278: * ! 1279: * SYSTM IS USED TO OBTAIN THE AMOUNT OF EXECUTION TIME ! 1280: * USED SO FAR SINCE SPITBOL WAS GIVEN CONTROL. THE UNITS ! 1281: * ARE DESCRIBED AS MILLISECONDS IN THE SPITBOL OUTPUT, BUT ! 1282: * THE EXACT MEANING IS SYSTEM DEPENDENT. WHERE APPROPRIATE, ! 1283: * THIS VALUE SHOULD RELATE TO PROCESSOR RATHER THAN CLOCK ! 1284: * TIMING VALUES. ! 1285: * ! 1286: * JSR SYSTM CALL TO GET TIMER VALUE ! 1287: * (IA) TIME SO FAR IN MILLISECONDS ! 1288: EJC ! 1289: * ! 1290: * SYSTT -- TRACE TOGGLE ! 1291: * ! 1292: SYSTT EXP DEFINE EXTERNAL ENTRY POINT ! 1293: * ! 1294: * CALLED BY SPITBOL FUNCTION TRACE() WITH NO ARGS TO ! 1295: * TOGGLE THE SYSTEM TRACE SWITCH. THIS PERMITS TRACING OF ! 1296: * LABELS IN SPITBOL CODE TO BE TURNED ON OR OFF. ! 1297: * ! 1298: * JSR SYSTT CALL TO TOGGLE TRACE SWITCH ! 1299: EJC ! 1300: * ! 1301: * SYSUL -- UNLOAD EXTERNAL FUNCTION ! 1302: * ! 1303: SYSUL EXP DEFINE EXTERNAL ENTRY POINT ! 1304: * ! 1305: * SYSUL IS USED TO UNLOAD A FUNCTION PREVIOUSLY ! 1306: * LOADED WITH A CALL TO SYSLD. ! 1307: * ! 1308: * (XR) PTR TO CONTROL BLOCK (EFBLK) ! 1309: * JSR SYSUL CALL TO UNLOAD FUNCTION ! 1310: * ! 1311: * THE FUNCTION CANNOT BE CALLED FOLLOWING A SYSUL CALL ! 1312: * UNTIL ANOTHER SYSLD CALL IS MADE FOR THE SAME FUNCTION. ! 1313: * ! 1314: * THE EFBLK CONTAINS THE FUNCTION CODE POINTER AND ALSO A ! 1315: * POINTER TO THE VRBLK CONTAINING THE FUNCTION NAME (SEE ! 1316: * DEFINITIONS AND DATA STRUCTURES SECTION). ! 1317: .IF .CNEX ! 1318: .ELSE ! 1319: EJC ! 1320: * ! 1321: * SYSXI -- EXIT TO PRODUCE LOAD MODULE ! 1322: * ! 1323: SYSXI EXP DEFINE EXTERNAL ENTRY POINT ! 1324: * ! 1325: * WHEN SYSXI IS CALLED, XL CONTAINS EITHER A STRING POINTER ! 1326: * OR ZERO. IN THE FORMER CASE, THE STRING GIVES THE ! 1327: * CHARACTER NAME OF A PROGRAM. THE INTENTION IS THAT ! 1328: * SPITBOL EXECUTION SHOULD BE TERMINATED FORTHWITH AND ! 1329: * THE NAMED PROGRAM LOADED AND EXECUTED. THIS TYPE OF CHAIN ! 1330: * EXECUTION IS VERY SYSTEM DEPENDENT AND IMPLEMENTORS MAY ! 1331: * CHOOSE TO OMIT IT OR FIND IT IMPOSSIBLE TO PROVIDE. ! 1332: * IF (XL) IS ZERO,IA CONTAINS ONE OF THE FOLLOWING INTEGERS ! 1333: * ! 1334: * -1, -2, -3 ! 1335: * CREATE IF POSSIBLE A LOAD MODULE CONTAINING ONLY THE ! 1336: * IMPURE AREA OF MEMORY WHICH NEEDS TO BE LOADED WITH ! 1337: * A COMPATIBLE PURE SEGMENT FOR SUBSEQUENT EXECUTIONS. ! 1338: * VERSION NUMBERS TO CHECK COMPATIBILITY SHOULD BE ! 1339: * KEPT IN BOTH SEGMENTS AND CHECKED ON LOADING. ! 1340: * TO ASSIST WITH THIS CHECK, (XR) ON ENTRY IS A ! 1341: * POINTER TO AN SCBLK CONTAINING THE SPITBOL MAJOR ! 1342: * VERSION NUMBER V.V (SEE SYSID). ! 1343: * ! 1344: * 0 IF POSSIBLE, RETURN CONTROL TO JOB CONTROL ! 1345: * COMMAND LEVEL. THE EFFECT IF AVAILABLE WILL BE ! 1346: * SYSTEM DEPENDENT. ! 1347: * ! 1348: * +1, +2, +3 ! 1349: * CREATE IF POSSIBLE A LOAD MODULE FROM ALL OF ! 1350: * MEMORY. IT SHOULD BE POSSIBLE TO LOAD AND EXECUTE ! 1351: * THIS MODULE DIRECTLY. ! 1352: * ! 1353: * IN THE CASE OF SAVED LOAD MODULES, THE STATUS OF OPEN ! 1354: * FILES IS NOT PRESERVED AND IMPLEMENTORS MAY CHOOSE TO ! 1355: * OFFER MEANS OF ATTACHING FILES BEFORE EXECUTION OF LOAD ! 1356: * MODULES STARTS OR LEAVE IT TO THE USER TO INCLUDE ! 1357: * SUITABLE INPUT(), OUTPUT() CALLS IN HIS PROGRAM. ! 1358: * SYSXI SHOULD MAKE A NOTE THAT NO I/O CHANNELS, ! 1359: * INCLUDING STANDARD FILES, HAVE FILES ATTACHED SO THAT ! 1360: * CALLS OF SYSIN, SYSOU, SYSPR, SYSRD SHOULD FAIL UNLESS ! 1361: * NEW ASSOCIATIONS ARE MADE FOR THE LOAD MODULE. ! 1362: * AT LEAST IN THE CASE OF THE STANDARD OUTPUT FILE, IT IS ! 1363: * RECOMMENDED THAT EITHER THE USER BE REQUIRED TO ATTACH ! 1364: * A FILE OR THAT A DEFAULT FILE IS ATTACHED, SINCE THE ! 1365: * PROBLEM OF ERROR MESSAGES GENERATED BY THE LOAD MODULE ! 1366: * IS OTHERWISE SEVERE. AS A LAST RESORT, IF SPITBOL ! 1367: * ATTEMPTS TO WRITE TO THE STANDARD OUTPUT FILE AND GETS A ! 1368: * REPLY INDICATING THAT SUCH OUPUT IS UNACCEPTABLE IT STOPS ! 1369: * BY USING AN ENTRY TO SYSEJ WITH ENDING CODE 998. ! 1370: * AS DESCRIBED BELOW, PASSING OF SOME ARGUMENTS MAKES IT ! 1371: * CLEAR THAT LOAD MODULE WILL USE A STANDARD OUTPUT FILE. ! 1372: * ! 1373: * IF USE IS MADE OF FCBLKS FOR I/O ASSOCIATION, SPITBOL ! 1374: * BUILDS A CHAIN SO THAT THOSE IN USE MAY BE FOUND IN SYSXI ! 1375: * AND SYSEJ. THE NODES ARE 4 WORDS LONG. THIRD WORD ! 1376: * CONTAINS LINK TO NEXT NODE OR 0, FOURTH WORD CONTAINS ! 1377: * FCBLK POINTER. ! 1378: EJC ! 1379: * ! 1380: * SYSXI (CONTINUED) ! 1381: * ! 1382: * (XL) ZERO OR SCBLK PTR ! 1383: * (XR) PTR TO V.V SCBLK ! 1384: * (IA) SIGNED INTEGER ARGUMENT ! 1385: * (WB) 0 OR PTR TO HEAD OF FCBLK CHAIN ! 1386: * JSR SYSXI CALL TO EXIT ! 1387: * PPM LOC REQUESTED ACTION NOT POSSIBLE ! 1388: * PPM LOC ACTION CAUSED IRRECOVERABLE ERROR ! 1389: * (REGISTERS) SHOULD BE PRESERVED OVER CALL ! 1390: * ! 1391: * LOADING AND RUNNING THE LOAD MODULE OR RETURNING FROM ! 1392: * JCL COMMAND LEVEL CAUSES EXECUTION TO RESUME AT THE POINT ! 1393: * AFTER THE ERROR RETURNS WHICH FOLLOW THE CALL OF SYSXI. ! 1394: * THE VALUE PASSED AS EXIT ARGUMENT IS USED TO INDICATE ! 1395: * OPTIONS REQUIRED ON RESUMPTION OF LOAD MODULE. ! 1396: * +1 OR -1 REQUIRE THAT ON RESUMPTION, SYSID AND SYSPP BE ! 1397: * CALLED AND A HEADING PRINTED ON THE STANDARD OUTPUT FILE. ! 1398: * +2 OR -2 INDICATE THAT SYSPP WILL BE CALLED BUT NOT SYSID ! 1399: * AND NO HEADING WILL BE PUT ON STANDARD OUTPUT FILE. ! 1400: * ABOVE OPTIONS HAVE THE OBVIOUS IMPLICATION THAT A ! 1401: * STANDARD O/P FILE MUST BE PROVIDED FOR THE LOAD MODULE. ! 1402: * +3 OR -3 INDICATE CALLS OF NEITHER SYSID NOR SYSPP ! 1403: * AND NO HEADING WILL BE PLACED ON STANDARD OUTPUT FILE. ! 1404: * NO RETURN FROM SYSXI IS POSSIBLE IF ANOTHER PROGRAM ! 1405: * IS LOADED AND ENTERED. ! 1406: .FI ! 1407: EJC ! 1408: * ! 1409: * INTRODUCE THE INTERNAL PROCEDURES. ! 1410: * ! 1411: ACESS INP R,1 ! 1412: ACOMP INP N,5 ! 1413: ALLOC INP E,0 ! 1414: .IF .CNBF ! 1415: .ELSE ! 1416: ALOBF INP E,0 ! 1417: .FI ! 1418: ALOCS INP E,0 ! 1419: ALOST INP E,0 ! 1420: APNDB INP E,2 ! 1421: .IF .CNRA ! 1422: ARITH INP N,2 ! 1423: .ELSE ! 1424: ARITH INP N,3 ! 1425: .FI ! 1426: ASIGN INP R,1 ! 1427: ASINP INP R,1 ! 1428: BLKLN INP E,0 ! 1429: CDGCG INP E,0 ! 1430: CDGEX INP R,0 ! 1431: CDGNM INP R,0 ! 1432: CDGVL INP R,0 ! 1433: CDWRD INP E,0 ! 1434: CMGEN INP R,0 ! 1435: CMPIL INP E,0 ! 1436: CNCRD INP E,0 ! 1437: COPYB INP N,1 ! 1438: DFFNC INP E,0 ! 1439: DTACH INP E,0 ! 1440: DTYPE INP E,0 ! 1441: DUMPR INP E,0 ! 1442: ERMSG INP E,0 ! 1443: ERTEX INP E,0 ! 1444: EVALI INP R,4 ! 1445: EVALP INP R,1 ! 1446: EVALS INP R,3 ! 1447: EVALX INP R,1 ! 1448: EXBLD INP E,0 ! 1449: EXPAN INP E,0 ! 1450: EXPAP INP E,1 ! 1451: EXPDM INP N,0 ! 1452: EXPOP INP N,0 ! 1453: .IF .CULC ! 1454: FLSTG INP R,0 ! 1455: .FI ! 1456: GBCOL INP E,0 ! 1457: GBCPF INP E,0 ! 1458: GTARR INP E,1 ! 1459: EJC ! 1460: GTCOD INP E,1 ! 1461: GTEXP INP E,1 ! 1462: GTINT INP E,1 ! 1463: GTNUM INP E,1 ! 1464: GTNVR INP E,1 ! 1465: GTPAT INP E,1 ! 1466: .IF .CNRA ! 1467: .ELSE ! 1468: GTREA INP E,1 ! 1469: .FI ! 1470: GTSMI INP N,2 ! 1471: GTSTG INP N,1 ! 1472: GTVAR INP E,1 ! 1473: HASHS INP E,0 ! 1474: ICBLD INP E,0 ! 1475: IDENT INP E,1 ! 1476: INOUT INP E,0 ! 1477: .IF .CNBF ! 1478: .ELSE ! 1479: INSBF INP E,2 ! 1480: .FI ! 1481: IOFCB INP N,2 ! 1482: IOPPF INP N,0 ! 1483: IOPUT INP N,6 ! 1484: KTREX INP R,0 ! 1485: KWNAM INP N,0 ! 1486: LCOMP INP N,5 ! 1487: LISTR INP E,0 ! 1488: LISTT INP E,0 ! 1489: NEXTS INP E,0 ! 1490: PATIN INP N,2 ! 1491: PATST INP N,1 ! 1492: PBILD INP E,0 ! 1493: PCONC INP E,0 ! 1494: PCOPY INP N,0 ! 1495: .IF .CNPF ! 1496: .ELSE ! 1497: PRFLR INP E,0 ! 1498: PRFLU INP E,0 ! 1499: .FI ! 1500: PRPAR INP E,0 ! 1501: PRTCH INP E,0 ! 1502: PRTIC INP E,0 ! 1503: PRTIS INP E,0 ! 1504: PRTIN INP E,0 ! 1505: PRTMI INP E,0 ! 1506: PRTMX INP E,0 ! 1507: PRTNL INP R,0 ! 1508: PRTNM INP R,0 ! 1509: PRTNV INP E,0 ! 1510: PRTPG INP E,0 ! 1511: PRTPS INP E,0 ! 1512: PRTSN INP E,0 ! 1513: PRTST INP R,0 ! 1514: EJC ! 1515: PRTTR INP E,0 ! 1516: PRTVL INP R,0 ! 1517: PRTVN INP E,0 ! 1518: .IF .CNRA ! 1519: .ELSE ! 1520: RCBLD INP E,0 ! 1521: .FI ! 1522: READR INP E,0 ! 1523: SBSTR INP E,0 ! 1524: SCANE INP E,0 ! 1525: SCNGF INP E,0 ! 1526: SETVR INP E,0 ! 1527: .IF .CNSR ! 1528: .ELSE ! 1529: SORTA INP N,0 ! 1530: SORTC INP E,1 ! 1531: SORTF INP E,0 ! 1532: SORTH INP E,0 ! 1533: .FI ! 1534: TFIND INP E,1 ! 1535: TRACE INP N,2 ! 1536: TRBLD INP E,0 ! 1537: TRIMR INP E,0 ! 1538: TRXEQ INP R,0 ! 1539: XSCAN INP E,0 ! 1540: XSCNI INP N,2 ! 1541: * ! 1542: * INTRODUCE THE INTERNAL ROUTINES ! 1543: * ! 1544: ARREF INR ! 1545: CFUNC INR ! 1546: EXFAL INR ! 1547: EXINT INR ! 1548: EXITS INR ! 1549: EXIXR INR ! 1550: EXNAM INR ! 1551: EXNUL INR ! 1552: .IF .CNRA ! 1553: .ELSE ! 1554: EXREA INR ! 1555: .FI ! 1556: EXSID INR ! 1557: EXVNM INR ! 1558: FAILP INR ! 1559: FLPOP INR ! 1560: INDIR INR ! 1561: MATCH INR ! 1562: RETRN INR ! 1563: STCOV INR ! 1564: STMGO INR ! 1565: STOPR INR ! 1566: SUCCP INR ! 1567: SYSAB INR ! 1568: SYSTU INR ! 1569: TTL S P I T B O L -- DEFINITIONS AND DATA STRUCTURES ! 1570: SEC START OF DEFINITIONS SECTION ! 1571: * ! 1572: * DEFINITIONS OF MACHINE PARAMETERS ! 1573: * ! 1574: * THE MINIMAL TRANSLATOR SHOULD SUPPLY APPROPRIATE VALUES ! 1575: * FOR THE PARTICULAR TARGET MACHINE FOR ALL THE ! 1576: * EQU * ! 1577: * DEFINITIONS GIVEN AT THE START OF THIS SECTION. ! 1578: * ! 1579: CFP$A EQU * NUMBER OF CHARACTERS IN ALPHABET ! 1580: * ! 1581: CFP$B EQU * BYTES/WORD ADDRESSING FACTOR ! 1582: * ! 1583: CFP$C EQU * NUMBER OF CHARACTERS PER WORD ! 1584: * ! 1585: CFP$F EQU * OFFSET IN BYTES TO CHARS IN ! 1586: * SCBLK. SEE SCBLK FORMAT. ! 1587: * ! 1588: CFP$I EQU * NUMBER OF WORDS IN INTEGER CONSTANT ! 1589: * ! 1590: CFP$M EQU * MAX POSITIVE INTEGER IN ONE WORD ! 1591: * ! 1592: CFP$N EQU * NUMBER OF BITS IN ONE WORD ! 1593: * ! 1594: * THE FOLLOWING DEFINITIONS REQUIRE THE SUPPLY OF EITHER ! 1595: * A SINGLE PARAMETER IF REAL ARITHMETIC IS OMITTED OR ! 1596: * THREE PARAMETERS IF REAL ARITHMETIC IS INCLUDED. ! 1597: * ! 1598: .IF .CNRA ! 1599: NSTMX EQU * NO. OF DECIMAL DIGITS IN CFP$M ! 1600: .ELSE ! 1601: * ! 1602: CFP$R EQU * NUMBER OF WORDS IN REAL CONSTANT ! 1603: * ! 1604: CFP$S EQU * NUMBER OF SIG DIGS FOR REAL OUTPUT ! 1605: * ! 1606: CFP$X EQU * MAX DIGITS IN REAL EXPONENT ! 1607: * ! 1608: MXDGS EQU CFP$S+CFP$X MAX DIGITS IN REAL NUMBER ! 1609: * ! 1610: NSTMX EQU MXDGS+5 MAX SPACE FOR REAL (FOR +0.E+) ! 1611: .FI ! 1612: .IF .CUCF ! 1613: * ! 1614: * THE FOLLOWING DEFINITION FOR CFP$U SUPPLIES A REALISTIC ! 1615: * UPPER BOUND ON THE SIZE OF THE ALPHABET. CFP$U IS USED ! 1616: * TO SAVE SPACE IN THE SCANE BSW-IFF-ESW TABLE AND TO EASE ! 1617: * TRANSLATION STORAGE REQUIREMENTS. ! 1618: * ! 1619: CFP$U EQU * REALISTIC UPPER BOUND ON ALPHABET ! 1620: .FI ! 1621: EJC ! 1622: * ! 1623: * ENVIRONMENT PARAMETERS ! 1624: * ! 1625: * THE SPITBOL PROGRAM IS ESSENTIALLY INDEPENDENT OF ! 1626: * THE DEFINITIONS OF THESE PARAMETERS. HOWEVER, THE ! 1627: * EFFICIENCY OF THE SYSTEM MAY BE AFFECTED. CONSEQUENTLY, ! 1628: * THESE PARAMETERS MAY REQUIRE TUNING FOR A GIVEN VERSION ! 1629: * THE VALUES GIVEN IN COMMENTS HAVE BEEN SUCCESSFULLY USED. ! 1630: * ! 1631: * E$SRS IS THE NUMBER OF WORDS TO RESERVE AT THE END OF ! 1632: * STORAGE FOR END OF RUN PROCESSING. IT SHOULD BE ! 1633: * SET AS SMALL AS POSSIBLE WITHOUT CAUSING MEMORY OVERFLOW ! 1634: * IN CRITICAL SITUATIONS (E.G. MEMORY OVERFLOW TERMINATION) ! 1635: * AND SHOULD THUS RESERVE SUFFICIENT SPACE AT LEAST FOR ! 1636: * AN SCBLK CONTAINING SAY 30 CHARACTERS. ! 1637: * ! 1638: E$SRS EQU * 30 WORDS ! 1639: * ! 1640: * E$STS IS THE NUMBER OF WORDS GRABBED IN A CHUNK WHEN ! 1641: * STORAGE IS ALLOCATED IN THE STATIC REGION. THE MINIMUM ! 1642: * PERMITTED VALUE IS 256/CFP$B. LARGER VALUES WILL LEAD ! 1643: * TO INCREASED EFFICIENCY AT THE COST OF WASTING MEMORY. ! 1644: * ! 1645: E$STS EQU * 500 WORDS ! 1646: * ! 1647: * E$CBS IS THE SIZE OF CODE BLOCK ALLOCATED INITIALLY AND ! 1648: * THE EXPANSION INCREMENT IF OVERFLOW OCCURS. IF THIS VALUE ! 1649: * IS TOO SMALL OR TOO LARGE, EXCESSIVE GARBAGE COLLECTIONS ! 1650: * WILL OCCUR DURING COMPILATION AND MEMORY MAY BE LOST ! 1651: * IN THE CASE OF A TOO LARGE VALUE. ! 1652: * ! 1653: E$CBS EQU * 500 WORDS ! 1654: * ! 1655: * E$HNB IS THE NUMBER OF BUCKET HEADERS IN THE VARIABLE ! 1656: * HASH TABLE. IT SHOULD ALWAYS BE ODD. LARGER VALUES WILL ! 1657: * SPEED UP COMPILATION AND INDIRECT REFERENCES AT THE ! 1658: * EXPENSE OF ADDITIONAL STORAGE FOR THE HASH TABLE ITSELF. ! 1659: * ! 1660: E$HNB EQU * 127 BUCKET HEADERS ! 1661: * ! 1662: * E$HNW IS THE MAXIMUM NUMBER OF WORDS OF A STRING ! 1663: * NAME WHICH PARTICIPATE IN THE STRING HASH ALGORITHM. ! 1664: * LARGER VALUES GIVE A BETTER HASH AT THE EXPENSE OF TAKING ! 1665: * LONGER TO COMPUTE THE HASH. THERE IS SOME OPTIMAL VALUE. ! 1666: * ! 1667: E$HNW EQU * 6 WORDS ! 1668: * ! 1669: * E$FSP . IF THE AMOUNT OF FREE SPACE LEFT AFTER A GARBAGE ! 1670: * COLLECTION IS SMALL COMPARED TO THE TOTAL AMOUNT OF SPACE ! 1671: * IN USE GARBAGE COLLECTOR THRASHING IS LIKELY TO OCCUR AS ! 1672: * THIS SPACE IS USED UP. E$FSP IS A MEASURE OF THE ! 1673: * MINIMUM PERCENTAGE OF DYNAMIC MEMORY LEFT AS FREE SPACE ! 1674: * BEFORE THE SYSTEM ROUTINE SYSMM IS CALLED TO TRY TO ! 1675: * OBTAIN MORE MEMORY. ! 1676: * ! 1677: E$FSP EQU * 15 PERCENT ! 1678: EJC ! 1679: * ! 1680: * DEFINITIONS OF CODES FOR LETTERS ! 1681: * ! 1682: CH$LA EQU * LETTER A ! 1683: CH$LB EQU * LETTER B ! 1684: CH$LC EQU * LETTER C ! 1685: CH$LD EQU * LETTER D ! 1686: CH$LE EQU * LETTER E ! 1687: CH$LF EQU * LETTER F ! 1688: CH$LG EQU * LETTER G ! 1689: CH$LH EQU * LETTER H ! 1690: CH$LI EQU * LETTER I ! 1691: CH$LJ EQU * LETTER J ! 1692: CH$LK EQU * LETTER K ! 1693: CH$LL EQU * LETTER L ! 1694: CH$LM EQU * LETTER M ! 1695: CH$LN EQU * LETTER N ! 1696: CH$LO EQU * LETTER O ! 1697: CH$LP EQU * LETTER P ! 1698: CH$LQ EQU * LETTER Q ! 1699: CH$LR EQU * LETTER R ! 1700: CH$LS EQU * LETTER S ! 1701: CH$LT EQU * LETTER T ! 1702: CH$LU EQU * LETTER U ! 1703: CH$LV EQU * LETTER V ! 1704: CH$LW EQU * LETTER W ! 1705: CH$LX EQU * LETTER X ! 1706: CH$LY EQU * LETTER Y ! 1707: CH$L$ EQU * LETTER Z ! 1708: * ! 1709: * DEFINITIONS OF CODES FOR DIGITS ! 1710: * ! 1711: CH$D0 EQU * DIGIT 0 ! 1712: CH$D1 EQU * DIGIT 1 ! 1713: CH$D2 EQU * DIGIT 2 ! 1714: CH$D3 EQU * DIGIT 3 ! 1715: CH$D4 EQU * DIGIT 4 ! 1716: CH$D5 EQU * DIGIT 5 ! 1717: CH$D6 EQU * DIGIT 6 ! 1718: CH$D7 EQU * DIGIT 7 ! 1719: CH$D8 EQU * DIGIT 8 ! 1720: CH$D9 EQU * DIGIT 9 ! 1721: EJC ! 1722: * ! 1723: * DEFINITIONS OF CODES FOR SPECIAL CHARACTERS ! 1724: * ! 1725: * THE NAMES OF THESE CHARACTERS ARE RELATED TO THEIR ! 1726: * ORIGINAL REPRESENTATION IN THE EBCDIC SET CORRESPONDING ! 1727: * TO THE DESCRIPTION IN STANDARD SNOBOL4 MANUALS AND TEXTS. ! 1728: * ! 1729: CH$AM EQU * KEYWORD OPERATOR (AMPERSAND) ! 1730: CH$AS EQU * MULTIPLICATION SYMBOL (ASTERISK) ! 1731: CH$AT EQU * CURSOR POSITION OPERATOR (AT) ! 1732: CH$BB EQU * LEFT ARRAY BRACKET (LESS THAN) ! 1733: CH$BL EQU * BLANK ! 1734: CH$BR EQU * ALTERNATION OPERATOR (VERTICAL BAR) ! 1735: CH$CL EQU * GOTO SYMBOL (COLON) ! 1736: CH$CM EQU * COMMA ! 1737: CH$DL EQU * INDIRECTION OPERATOR (DOLLAR) ! 1738: CH$DT EQU * NAME OPERATOR (DOT) ! 1739: CH$DQ EQU * DOUBLE QUOTE ! 1740: CH$EQ EQU * EQUAL SIGN ! 1741: CH$EX EQU * EXPONENTIATION OPERATOR (EXCLM) ! 1742: CH$MN EQU * MINUS SIGN ! 1743: CH$NM EQU * NUMBER SIGN ! 1744: CH$NT EQU * NEGATION OPERATOR (NOT) ! 1745: CH$PC EQU * PERCENT ! 1746: CH$PL EQU * PLUS SIGN ! 1747: CH$PP EQU * LEFT PARENTHESIS ! 1748: CH$RB EQU * RIGHT ARRAY BRACKET (GRTR THAN) ! 1749: CH$RP EQU * RIGHT PARENTHESIS ! 1750: CH$QU EQU * INTERROGATION OPERATOR (QUESTION) ! 1751: CH$SL EQU * SLASH ! 1752: CH$SM EQU * SEMICOLON ! 1753: CH$SQ EQU * SINGLE QUOTE ! 1754: CH$UN EQU * SPECIAL IDENTIFIER CHAR (UNDERLINE) ! 1755: CH$OB EQU * OPENING BRACKET ! 1756: CH$CB EQU * CLOSING BRACKET ! 1757: EJC ! 1758: * ! 1759: * REMAINING CHARS ARE OPTIONAL ADDITIONS TO THE STANDARDS. ! 1760: .IF .CAHT ! 1761: * ! 1762: * TAB CHARACTERS - SYNTACTICALLY EQUIVALENT TO BLANK ! 1763: * ! 1764: CH$HT EQU * HORIZONTAL TAB ! 1765: .FI ! 1766: .IF .CAVT ! 1767: CH$VT EQU * VERTICAL TAB ! 1768: .FI ! 1769: .IF .CASL ! 1770: * ! 1771: * LOWER CASE OR SHIFTED CASE ALPHABETIC CHARS ! 1772: * ! 1773: CH$$A EQU * SHIFTED A ! 1774: CH$$B EQU * SHIFTED B ! 1775: CH$$C EQU * SHIFTED C ! 1776: CH$$D EQU * SHIFTED D ! 1777: CH$$E EQU * SHIFTED E ! 1778: CH$$F EQU * SHIFTED F ! 1779: CH$$G EQU * SHIFTED G ! 1780: CH$$H EQU * SHIFTED H ! 1781: CH$$I EQU * SHIFTED I ! 1782: CH$$J EQU * SHIFTED J ! 1783: CH$$K EQU * SHIFTED K ! 1784: CH$$L EQU * SHIFTED L ! 1785: CH$$M EQU * SHIFTED M ! 1786: CH$$N EQU * SHIFTED N ! 1787: CH$$O EQU * SHIFTED O ! 1788: CH$$P EQU * SHIFTED P ! 1789: CH$$Q EQU * SHIFTED Q ! 1790: CH$$R EQU * SHIFTED R ! 1791: CH$$S EQU * SHIFTED S ! 1792: CH$$T EQU * SHIFTED T ! 1793: CH$$U EQU * SHIFTED U ! 1794: CH$$V EQU * SHIFTED V ! 1795: CH$$W EQU * SHIFTED W ! 1796: CH$$X EQU * SHIFTED X ! 1797: CH$$Y EQU * SHIFTED Y ! 1798: CH$$$ EQU * SHIFTED Z ! 1799: .FI ! 1800: * IF A DELIMITER OTHER THAN CH$CM MUST BE USED IN ! 1801: * THE THIRD ARGUMENT OF INPUT(),OUTPUT() THEN .CIOD SHOULD ! 1802: * BE DEFINED AND A PARAMETER SUPPLIED FOR IODEL. ! 1803: * ! 1804: .IF .CIOD ! 1805: IODEL EQU * ! 1806: .ELSE ! 1807: IODEL EQU CH$CM ! 1808: .FI ! 1809: EJC ! 1810: * ! 1811: * DATA BLOCK FORMATS AND DEFINITIONS ! 1812: * ! 1813: * THE FOLLOWING SECTIONS DESCRIBE THE DETAILED FORMAT OF ! 1814: * ALL POSSIBLE DATA BLOCKS IN STATIC AND DYNAMIC MEMORY. ! 1815: * ! 1816: * EVERY BLOCK HAS A NAME OF THE FORM XXBLK WHERE XX IS A ! 1817: * UNIQUE TWO CHARACTER IDENTIFIER. THE FIRST WORD OF EVERY ! 1818: * BLOCK MUST CONTAIN A POINTER TO A PROGRAM LOCATION IN THE ! 1819: * INTERPRETOR WHICH IS IMMEDIATELY PRECEDED BY AN ADDRESS ! 1820: * CONSTANT CONTAINING THE VALUE BL$XX WHERE XX IS THE BLOCK ! 1821: * IDENTIFIER. THIS PROVIDES A UNIFORM MECHANISM FOR ! 1822: * DISTINGUISHING BETWEEN THE VARIOUS BLOCK TYPES. ! 1823: * ! 1824: * IN SOME CASES, THE CONTENTS OF THE FIRST WORD IS CONSTANT ! 1825: * FOR A GIVEN BLOCK TYPE AND MERELY SERVES AS A POINTER ! 1826: * TO THE IDENTIFYING ADDRESS CONSTANT. HOWEVER, IN OTHER ! 1827: * CASES THERE ARE SEVERAL POSSIBILITIES FOR THE FIRST ! 1828: * WORD IN WHICH CASE EACH OF THE SEVERAL PROGRAM ENTRY ! 1829: * POINTS MUST BE PRECEDED BY THE APPROPRIATE CONSTANT. ! 1830: * ! 1831: * IN EACH BLOCK, SOME OF THE FIELDS ARE RELOCATABLE. THIS ! 1832: * MEANS THAT THEY MAY CONTAIN A POINTER TO ANOTHER BLOCK ! 1833: * IN THE DYNAMIC AREA. (TO BE MORE PRECISE, IF THEY CONTAIN ! 1834: * A POINTER WITHIN THE DYNAMIC AREA, THEN IT IS A POINTER ! 1835: * TO A BLOCK). SUCH FIELDS MUST BE MODIFIED BY THE GARBAGE ! 1836: * COLLECTOR (PROCEDURE GBCOL) WHENEVER BLOCKS ARE COMPACTED ! 1837: * IN THE DYNAMIC REGION. THE GARBAGE COLLECTOR (ACTUALLY ! 1838: * PROCEDURE GBCPF) REQUIRES THAT ALL SUCH RELOCATABLE ! 1839: * FIELDS IN A BLOCK MUST BE CONTIGUOUS. ! 1840: EJC ! 1841: * ! 1842: * THE DESCRIPTION FORMAT USES THE FOLLOWING SCHEME. ! 1843: * ! 1844: * 1) BLOCK TITLE AND TWO CHARACTER IDENTIFIER ! 1845: * ! 1846: * 2) DESCRIPTION OF BASIC USE OF BLOCK AND INDICATION ! 1847: * OF CIRCUMSTANCES UNDER WHICH IT IS CONSTRUCTED. ! 1848: * ! 1849: * 3) PICTURE OF THE BLOCK FORMAT. IN THESE PICTURES LOW ! 1850: * MEMORY ADDRESSES ARE AT THE TOP OF THE PAGE. FIXED ! 1851: * LENGTH FIELDS ARE SURROUNDED BY I (LETTER I). FIELDS ! 1852: * WHICH ARE FIXED LENGTH BUT WHOSE LENGTH IS DEPENDENT ! 1853: * ON A CONFIGURATION PARAMETER ARE SURROUNDED BY * ! 1854: * (ASTERISK). VARIABLE LENGTH FIELDS ARE SURROUNDED ! 1855: * BY / (SLASH). ! 1856: * ! 1857: * 4) DEFINITION OF SYMBOLIC OFFSETS TO FIELDS IN ! 1858: * BLOCK AND OF THE SIZE OF THE BLOCK IF FIXED LENGTH ! 1859: * OR OF THE SIZE OF THE FIXED LENGTH FIELDS IF THE ! 1860: * BLOCK IS VARIABLE LENGTH. ! 1861: * NOTE THAT SOME ROUTINES SUCH AS GBCPF ASSUME ! 1862: * CERTAIN OFFSETS ARE EQUAL. THE DEFINITIONS ! 1863: * GIVEN HERE ENFORCE THIS. MAKE CHANGES TO ! 1864: * THEM ONLY WITH DUE CARE. ! 1865: * ! 1866: * DEFINITIONS OF COMMON OFFSETS ! 1867: * ! 1868: OFFS1 EQU 1 ! 1869: OFFS2 EQU 2 ! 1870: OFFS3 EQU 3 ! 1871: * ! 1872: * 5) DETAILED COMMENTS ON THE SIGNIFICANCE AND FORMATS ! 1873: * OF THE VARIOUS FIELDS. ! 1874: * ! 1875: * THE ORDER IS ALPHABETICAL BY IDENTIFICATION CODE. ! 1876: EJC ! 1877: * ! 1878: * DEFINITIONS OF BLOCK CODES ! 1879: * ! 1880: * THIS TABLE PROVIDES A UNIQUE IDENTIFICATION CODE FOR ! 1881: * EACH SEPARATE BLOCK TYPE. THE FIRST WORD OF A BLOCK IN ! 1882: * THE DYNAMIC AREA ALWAYS CONTAINS THE ADDRESS OF A PROGRAM ! 1883: * ENTRY POINT. THE BLOCK CODE IS USED AS THE ENTRY POINT ID ! 1884: * THE ORDER OF THESE CODES DICTATES THE ORDER OF THE TABLE ! 1885: * USED BY THE DATATYPE FUNCTION (SCNMT IN THE CONSTANT SEC) ! 1886: * ! 1887: * BLOCK CODES FOR ACCESSIBLE DATATYPES ! 1888: * ! 1889: BL$AR EQU 0 ARBLK ARRAY ! 1890: .IF .CNBF ! 1891: BL$CD EQU BL$AR+1 CDBLK CODE ! 1892: .ELSE ! 1893: BL$BC EQU BL$AR+1 BCBLK BUFFER ! 1894: BL$CD EQU BL$BC+1 CDBLK CODE ! 1895: .FI ! 1896: BL$EX EQU BL$CD+1 EXBLK EXPRESSION ! 1897: BL$IC EQU BL$EX+1 ICBLK INTEGER ! 1898: BL$NM EQU BL$IC+1 NMBLK NAME ! 1899: BL$P0 EQU BL$NM+1 P0BLK PATTERN ! 1900: BL$P1 EQU BL$P0+1 P1BLK PATTERN ! 1901: BL$P2 EQU BL$P1+1 P2BLK PATTERN ! 1902: .IF .CNRA ! 1903: BL$SC EQU BL$P2+1 SCBLK STRING ! 1904: .ELSE ! 1905: BL$RC EQU BL$P2+1 RCBLK REAL ! 1906: BL$SC EQU BL$RC+1 SCBLK STRING ! 1907: .FI ! 1908: BL$SE EQU BL$SC+1 SEBLK EXPRESSION ! 1909: BL$TB EQU BL$SE+1 TBBLK TABLE ! 1910: BL$VC EQU BL$TB+1 VCBLK ARRAY ! 1911: BL$XN EQU BL$VC+1 XNBLK EXTERNAL ! 1912: BL$XR EQU BL$XN+1 XRBLK EXTERNAL ! 1913: BL$PD EQU BL$XR+1 PDBLK PROGRAM DEFINED DATATYPE ! 1914: * ! 1915: BL$$D EQU BL$PD+1 NUMBER OF BLOCK CODES FOR DATA ! 1916: * ! 1917: * OTHER BLOCK CODES ! 1918: * ! 1919: BL$TR EQU BL$PD+1 TRBLK ! 1920: .IF .CNBF ! 1921: BL$CC EQU BL$TR+1 CCBLK ! 1922: .ELSE ! 1923: BL$BF EQU BL$TR+1 BFBLK ! 1924: BL$CC EQU BL$BF+1 CCBLK ! 1925: .FI ! 1926: BL$CM EQU BL$CC+1 CMBLK ! 1927: BL$CT EQU BL$CM+1 CTBLK ! 1928: BL$DF EQU BL$CT+1 DFBLK ! 1929: BL$EF EQU BL$DF+1 EFBLK ! 1930: BL$EV EQU BL$EF+1 EVBLK ! 1931: BL$FF EQU BL$EV+1 FFBLK ! 1932: BL$KV EQU BL$FF+1 KVBLK ! 1933: BL$PF EQU BL$KV+1 PFBLK ! 1934: BL$TE EQU BL$PF+1 TEBLK ! 1935: * ! 1936: BL$$I EQU 0 DEFAULT IDENTIFICATION CODE ! 1937: BL$$T EQU BL$TR+1 CODE FOR DATA OR TRACE BLOCK ! 1938: BL$$$ EQU BL$TE+1 NUMBER OF BLOCK CODES ! 1939: EJC ! 1940: * ! 1941: * FIELD REFERENCES ! 1942: * ! 1943: * REFERENCES TO THE FIELDS OF DATA BLOCKS ARE SYMBOLIC ! 1944: * (I.E. USE THE SYMBOLIC OFFSETS) WITH THE FOLLOWING ! 1945: * EXCEPTIONS. ! 1946: * ! 1947: * 1) REFERENCES TO THE FIRST WORD ARE USUALLY NOT ! 1948: * SYMBOLIC SINCE THEY USE THE (X) OPERAND FORMAT. ! 1949: * ! 1950: * 2) THE CODE WHICH CONSTRUCTS A BLOCK IS OFTEN NOT ! 1951: * SYMBOLIC AND SHOULD BE CHANGED IF THE CORRESPONDING ! 1952: * BLOCK FORMAT IS MODIFIED. ! 1953: * ! 1954: * 3) THE PLC AND PSC INSTRUCTIONS IMPLY AN OFFSET ! 1955: * CORRESPONDING TO THE DEFINITION OF CFP$F. ! 1956: * ! 1957: * 4) THERE ARE NON-SYMBOLIC REFERENCES (EASILY CHANGED) ! 1958: * IN THE GARBAGE COLLECTOR (PROCEDURES GBCPF, BLKLN). ! 1959: * ! 1960: * 5) THE FIELDS IDVAL, FARGS APPEAR IN SEVERAL BLOCKS ! 1961: * AND ANY CHANGES MUST BE MADE IN PARALLEL TO ALL ! 1962: * BLOCKS CONTAINING THE FIELDS. THE ACTUAL REFERENCES ! 1963: * TO THESE FIELDS ARE SYMBOLIC WITH THE ABOVE ! 1964: * LISTED EXCEPTIONS. ! 1965: * ! 1966: * 6) SEVERAL SPOTS IN THE CODE ASSUME THAT THE ! 1967: * DEFINITIONS OF THE FIELDS VRVAL, TEVAL, TRNXT ARE ! 1968: * THE SAME (THESE ARE SECTIONS OF CODE WHICH SEARCH ! 1969: * OUT ALONG A TRBLK CHAIN FROM A VARIABLE). ! 1970: * ! 1971: * 7) REFERENCES TO THE FIELDS OF AN ARRAY BLOCK IN THE ! 1972: * ARRAY REFERENCE ROUTINE ARREF ARE NON-SYMBOLIC. ! 1973: * ! 1974: * APART FROM THE EXCEPTIONS LISTED, REFERENCES ARE SYMBOLIC ! 1975: * AS FAR AS POSSIBLE AND MODIFYING THE ORDER OR NUMBER ! 1976: * OF FIELDS WILL NOT REQUIRE CHANGES. ! 1977: EJC ! 1978: * ! 1979: * COMMON FIELDS FOR FUNCTION BLOCKS ! 1980: * ! 1981: * BLOCKS WHICH REPRESENT CALLABLE FUNCTIONS HAVE TWO ! 1982: * COMMON FIELDS AT THE START OF THE BLOCK AS FOLLOWS. ! 1983: * ! 1984: * +------------------------------------+ ! 1985: * I FCODE I ! 1986: * +------------------------------------+ ! 1987: * I FARGS I ! 1988: * +------------------------------------+ ! 1989: * / / ! 1990: * / REST OF FUNCTION BLOCK / ! 1991: * / / ! 1992: * +------------------------------------+ ! 1993: * ! 1994: FCODE EQU 0 POINTER TO CODE FOR FUNCTION ! 1995: FARGS EQU 1 NUMBER OF ARGUMENTS ! 1996: * ! 1997: * FCODE IS A POINTER TO THE LOCATION IN THE INTERPRETOR ! 1998: * PROGRAM WHICH PROCESSES THIS TYPE OF FUNCTION CALL. ! 1999: * ! 2000: * FARGS IS THE EXPECTED NUMBER OF ARGUMENTS. THE ACTUAL ! 2001: * NUMBER OF ARGUMENTS IS ADJUSTED TO THIS AMOUNT BY ! 2002: * DELETING EXTRA ARGUMENTS OR SUPPLYING TRAILING NULLS ! 2003: * FOR MISSING ONES BEFORE TRANSFERRING THOUGH FCODE. ! 2004: * A VALUE OF 999 MAY BE USED IN THIS FIELD TO INDICATE A ! 2005: * VARIABLE NUMBER OF ARGUMENTS (SEE SVBLK FIELD SVNAR). ! 2006: * ! 2007: * THE BLOCK TYPES WHICH FOLLOW THIS SCHEME ARE. ! 2008: * ! 2009: * FFBLK FIELD FUNCTION ! 2010: * DFBLK DATATYPE FUNCTION ! 2011: * PFBLK PROGRAM DEFINED FUNCTION ! 2012: * EFBLK EXTERNAL LOADED FUNCTION ! 2013: EJC ! 2014: * ! 2015: * IDENTIFICATION FIELD ! 2016: * ! 2017: * ! 2018: * ID FIELD ! 2019: * ! 2020: * CERTAIN PROGRAM ACCESSIBLE OBJECTS (THOSE WHICH CONTAIN ! 2021: * OTHER DATA VALUES AND CAN BE COPIED) ARE GIVEN A UNIQUE ! 2022: * IDENTIFICATION NUMBER (SEE EXSID). THIS ID VALUE IS AN ! 2023: * ADDRESS INTEGER VALUE WHICH IS ALWAYS STORED IN WORD TWO. ! 2024: * ! 2025: IDVAL EQU 1 ID VALUE FIELD ! 2026: * ! 2027: * THE BLOCKS CONTAINING AN IDVAL FIELD ARE. ! 2028: * ! 2029: * ARBLK ARRAY ! 2030: .IF .CNBF ! 2031: .ELSE ! 2032: * BCBLK BUFFER CONTROL BLOCK ! 2033: .FI ! 2034: * PDBLK PROGRAM DEFINED DATATYPE ! 2035: * TBBLK TABLE ! 2036: * VCBLK VECTOR BLOCK (ARRAY) ! 2037: * ! 2038: * NOTE THAT A ZERO IDVAL MEANS THAT THE BLOCK IS ONLY ! 2039: * HALF BUILT AND SHOULD NOT BE DUMPED (SEE DUMPR). ! 2040: EJC ! 2041: * ! 2042: * ARRAY BLOCK (ARBLK) ! 2043: * ! 2044: * AN ARRAY BLOCK REPRESENTS AN ARRAY VALUE OTHER THAN ONE ! 2045: * WITH ONE DIMENSION WHOSE LOWER BOUND IS ONE (SEE VCBLK). ! 2046: * AN ARBLK IS BUILT WITH A CALL TO THE FUNCTIONS CONVERT ! 2047: * (S$CNV) OR ARRAY (S$ARR). ! 2048: * ! 2049: * +------------------------------------+ ! 2050: * I ARTYP I ! 2051: * +------------------------------------+ ! 2052: * I IDVAL I ! 2053: * +------------------------------------+ ! 2054: * I ARLEN I ! 2055: * +------------------------------------+ ! 2056: * I AROFS I ! 2057: * +------------------------------------+ ! 2058: * I ARNDM I ! 2059: * +------------------------------------+ ! 2060: * * ARLBD * ! 2061: * +------------------------------------+ ! 2062: * * ARDIM * ! 2063: * +------------------------------------+ ! 2064: * * * ! 2065: * * ABOVE 2 FLDS REPEATED FOR EACH DIM * ! 2066: * * * ! 2067: * +------------------------------------+ ! 2068: * I ARPRO I ! 2069: * +------------------------------------+ ! 2070: * / / ! 2071: * / ARVLS / ! 2072: * / / ! 2073: * +------------------------------------+ ! 2074: EJC ! 2075: * ! 2076: * ARRAY BLOCK (CONTINUED) ! 2077: * ! 2078: ARTYP EQU 0 POINTER TO DUMMY ROUTINE B$ART ! 2079: ARLEN EQU IDVAL+1 LENGTH OF ARBLK IN BYTES ! 2080: AROFS EQU ARLEN+1 OFFSET IN ARBLK TO ARPRO FIELD ! 2081: ARNDM EQU AROFS+1 NUMBER OF DIMENSIONS ! 2082: ARLBD EQU ARNDM+1 LOW BOUND (FIRST SUBSCRIPT) ! 2083: ARDIM EQU ARLBD+CFP$I DIMENSION (FIRST SUBSCRIPT) ! 2084: ARLB2 EQU ARDIM+CFP$I LOW BOUND (SECOND SUBSCRIPT) ! 2085: ARDM2 EQU ARLB2+CFP$I DIMENSION (SECOND SUBSCRIPT) ! 2086: ARPRO EQU ARDIM+CFP$I ARRAY PROTOTYPE (ONE DIMENSION) ! 2087: ARVLS EQU ARPRO+1 START OF VALUES (ONE DIMENSION) ! 2088: ARPR2 EQU ARDM2+CFP$I ARRAY PROTOTYPE (TWO DIMENSIONS) ! 2089: ARVL2 EQU ARPR2+1 START OF VALUES (TWO DIMENSIONS) ! 2090: ARSI$ EQU ARLBD NUMBER OF STANDARD FIELDS IN BLOCK ! 2091: ARDMS EQU ARLB2-ARLBD SIZE OF INFO FOR ONE SET OF BOUNDS ! 2092: * ! 2093: * THE BOUNDS AND DIMENSION FIELDS ARE SIGNED INTEGER ! 2094: * VALUES AND EACH OCCUPY CFP$I WORDS IN THE ARBLK. ! 2095: * ! 2096: * THE LENGTH OF AN ARBLK IN BYTES MAY NOT EXCEED MXLEN. ! 2097: * THIS IS REQUIRED TO KEEP NAME OFFSETS GARBAGE COLLECTABLE ! 2098: * ! 2099: * THE ACTUAL VALUES ARE ARRANGED IN ROW-WISE ORDER AND ! 2100: * CAN CONTAIN A DATA POINTER OR A POINTER TO A TRBLK. ! 2101: .IF .CNBF ! 2102: .ELSE ! 2103: * ! 2104: * BUFFER CONTROL BLOCK (BCBLK) ! 2105: * ! 2106: * A BCBLK IS BUILT FOR EVERY BFBLK. ! 2107: * ! 2108: * +------------------------------------+ ! 2109: * I BCTYP I ! 2110: * +------------------------------------+ ! 2111: * I IDVAL I ! 2112: * +------------------------------------+ ! 2113: * I BCLEN I ! 2114: * +------------------------------------+ ! 2115: * I BCBUF I ! 2116: * +------------------------------------+ ! 2117: * ! 2118: BCTYP EQU 0 PTR TO DUMMY ROUTINE B$BCT ! 2119: BCLEN EQU IDVAL+1 DEFINED BUFFER LENGTH ! 2120: BCBUF EQU BCLEN+1 PTR TO BFBLK ! 2121: BCSI$ EQU BCBUF+1 SIZE OF BCBLK ! 2122: * ! 2123: * A BCBLK IS AN INDIRECT CONTROL HEADER FOR BFBLK. ! 2124: * THE REASON FOR NOT STORING THIS DATA DIRECTLY ! 2125: * IN THE RELATED BFBLK IS SO THAT THE BFBLK CAN ! 2126: * MAINTAIN THE SAME SKELETAL STRUCTURE AS AN SCBLK ! 2127: * THUS FACILITATING TRANSPARENT STRING OPERATIONS ! 2128: * (FOR THE MOST PART). SPECIFICALLY, CFP$F IS THE ! 2129: * SAME FOR A BFBLK AS FOR AN SCBLK. BY CONVENTION, ! 2130: * WHEREEVER A BUFFER VALUE IS EMPLOYED, THE BCBLK ! 2131: * IS POINTED TO. ! 2132: * ! 2133: * THE CORRESPONDING BFBLK IS POINTED TO BY THE ! 2134: * BCBUF POINTER IN THE BCBLK. ! 2135: * ! 2136: * BCLEN IS THE CURRENT DEFINED SIZE OF THE CHARACTER ! 2137: * ARRAY IN THE BFBLK. CHARACTERS FOLLOWING THE OFFSET ! 2138: * OF BCLEN ARE UNDEFINED. ! 2139: * ! 2140: EJC ! 2141: * ! 2142: * STRING BUFFER BLOCK (BFBLK) ! 2143: * ! 2144: * A BFBLK IS BUILT BY A CALL TO BUFFER(...) ! 2145: * ! 2146: * +------------------------------------+ ! 2147: * I BFTYP I ! 2148: * +------------------------------------+ ! 2149: * I BFALC I ! 2150: * +------------------------------------+ ! 2151: * / / ! 2152: * / BFCHR / ! 2153: * / / ! 2154: * +------------------------------------+ ! 2155: * ! 2156: BFTYP EQU 0 PTR TO DUMMY ROUTINE B$BFT ! 2157: BFALC EQU BFTYP+1 ALLOCATED SIZE OF BUFFER ! 2158: BFCHR EQU BFALC+1 CHARACTERS OF STRING ! 2159: BFSI$ EQU BFCHR SIZE OF STANDARD FIELDS IN BFBLK ! 2160: * ! 2161: * THE CHARACTERS IN THE BUFFER ARE STORED LEFT JUSTIFIED. ! 2162: * THE FINAL WORD OF DEFINED CHARACTERS IS ALWAYS ZERO ! 2163: * (CHARACTER) PADDED. ANY TRAILING ALLOCATION PAST THE ! 2164: * WORD CONTAINING THE LAST CHARACTER CONTAINS ! 2165: * UNPREDICTABLE CONTENTS AND IS NEVER REFERENCED. ! 2166: * ! 2167: * NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING ! 2168: * IS GIVEN BY CFP$F, AS WITH AN SCBLK. HOWEVER, THE ! 2169: * OFFSET WHICH IS OCCUPIED BY THE LENGTH FOR AN SCBLK ! 2170: * IS THE TOTAL CHAR SPACE FOR BFBLKS, AND ROUTINES WHICH ! 2171: * DEAL WITH BOTH MUST ACCOUNT FOR THIS DIFFERENCE. ! 2172: * ! 2173: * THE VALUE OF BFALC MAY NOT EXCEED MXLEN. THE VALUE OF ! 2174: * BCLEN IS ALWAYS LESS THAN OR EQUAL TO BFALC. ! 2175: * ! 2176: .FI ! 2177: EJC ! 2178: * ! 2179: * CODE CONSTRUCTION BLOCK (CCBLK) ! 2180: * ! 2181: * AT ANY ONE MOMENT THERE IS AT MOST ONE CCBLK INTO ! 2182: * WHICH THE COMPILER IS CURRENTLY STORING CODE (CDWRD). ! 2183: * ! 2184: * +------------------------------------+ ! 2185: * I CCTYP I ! 2186: * +------------------------------------+ ! 2187: * I CCLEN I ! 2188: * +------------------------------------+ ! 2189: * I CCUSE I ! 2190: * +------------------------------------+ ! 2191: * / / ! 2192: * / CCCOD / ! 2193: * / / ! 2194: * +------------------------------------+ ! 2195: * ! 2196: CCTYP EQU 0 POINTER TO DUMMY ROUTINE B$CCT ! 2197: CCLEN EQU CCTYP+1 LENGTH OF CCBLK IN BYTES ! 2198: CCUSE EQU CCLEN+1 OFFSET PAST LAST USED WORD (BYTES) ! 2199: CCCOD EQU CCUSE+1 START OF GENERATED CODE IN BLOCK ! 2200: * ! 2201: * THE REASON THAT THE CCBLK IS A SEPARATE BLOCK TYPE FROM ! 2202: * THE USUAL CDBLK IS THAT THE GARBAGE COLLECTOR MUST ! 2203: * ONLY PROCESS THOSE FIELDS WHICH HAVE BEEN SET (SEE GBCPF) ! 2204: EJC ! 2205: * ! 2206: * CODE BLOCK (CDBLK) ! 2207: * ! 2208: * A CODE BLOCK IS BUILT FOR EACH STATEMENT COMPILED DURING ! 2209: * THE INITIAL COMPILATION OR BY SUBSEQUENT CALLS TO CODE. ! 2210: * ! 2211: * +------------------------------------+ ! 2212: * I CDJMP I ! 2213: * +------------------------------------+ ! 2214: * I CDSTM I ! 2215: * +------------------------------------+ ! 2216: * I CDLEN I ! 2217: * +------------------------------------+ ! 2218: * I CDFAL I ! 2219: * +------------------------------------+ ! 2220: * / / ! 2221: * / CDCOD / ! 2222: * / / ! 2223: * +------------------------------------+ ! 2224: * ! 2225: CDJMP EQU 0 PTR TO ROUTINE TO EXECUTE STATEMENT ! 2226: CDSTM EQU CDJMP+1 STATEMENT NUMBER ! 2227: CDLEN EQU OFFS2 LENGTH OF CDBLK IN BYTES ! 2228: CDFAL EQU OFFS3 FAILURE EXIT (SEE BELOW) ! 2229: CDCOD EQU CDFAL+1 EXECUTABLE PSEUDO-CODE ! 2230: CDSI$ EQU CDCOD NUMBER OF STANDARD FIELDS IN CDBLK ! 2231: * ! 2232: * CDSTM IS THE STATEMENT NUMBER OF THE CURRENT STATEMENT. ! 2233: * ! 2234: * CDJMP, CDFAL ARE SET AS FOLLOWS. ! 2235: * ! 2236: * 1) IF THE FAILURE EXIT IS THE NEXT STATEMENT ! 2237: * ! 2238: * CDJMP = B$CDS ! 2239: * CDFAL = PTR TO CDBLK FOR NEXT STATEMENT ! 2240: * ! 2241: * 2) IF THE FAILURE EXIT IS A SIMPLE LABEL NAME ! 2242: * ! 2243: * CDJMP = B$CDS ! 2244: * CDFAL IS A PTR TO THE VRTRA FIELD OF THE VRBLK ! 2245: * ! 2246: * 3) IF THERE IS NO FAILURE EXIT (-NOFAIL MODE) ! 2247: * ! 2248: * CDJMP = B$CDS ! 2249: * CDFAL = O$UNF ! 2250: * ! 2251: * 4) IF THE FAILURE EXIT IS COMPLEX OR DIRECT ! 2252: * ! 2253: * CDJMP = B$CDC ! 2254: * CDFAL IS THE OFFSET TO THE O$GOF WORD ! 2255: EJC ! 2256: * ! 2257: * CODE BLOCK (CONTINUED) ! 2258: * ! 2259: * CDCOD IS THE START OF THE ACTUAL CODE. FIRST WE DESCRIBE ! 2260: * THE CODE GENERATED FOR AN EXPRESSION. IN AN EXPRESSION, ! 2261: * ELEMENTS ARE FETCHED BY NAME OR BY VALUE. FOR EXAMPLE, ! 2262: * THE BINARY EQUAL OPERATOR FETCHES ITS LEFT ARGUMENT ! 2263: * BY NAME AND ITS RIGHT ARGUMENT BY VALUE. THESE TWO ! 2264: * CASES GENERATE QUITE DIFFERENT CODE AND ARE DESCRIBED ! 2265: * SEPARATELY. FIRST WE CONSIDER THE CODE BY VALUE CASE. ! 2266: * ! 2267: * GENERATION OF CODE BY VALUE FOR EXPRESSIONS ELEMENTS. ! 2268: * ! 2269: * EXPRESSION POINTER TO EXBLK OR SEBLK ! 2270: * ! 2271: * INTEGER CONSTANT POINTER TO ICBLK ! 2272: * ! 2273: * NULL CONSTANT POINTER TO NULLS ! 2274: * ! 2275: * PATTERN (RESULTING FROM PREEVALUATION) ! 2276: * =O$LPT ! 2277: * POINTER TO P0BLK,P1BLK OR P2BLK ! 2278: * ! 2279: * REAL CONSTANT POINTER TO RCBLK ! 2280: * ! 2281: * STRING CONSTANT POINTER TO SCBLK ! 2282: * ! 2283: * VARIABLE POINTER TO VRGET FIELD OF VRBLK ! 2284: * ! 2285: * ADDITION VALUE CODE FOR LEFT OPERAND ! 2286: * VALUE CODE FOR RIGHT OPERAND ! 2287: * =O$ADD ! 2288: * ! 2289: * AFFIRMATION VALUE CODE FOR OPERAND ! 2290: * =O$AFF ! 2291: * ! 2292: * ALTERNATION VALUE CODE FOR LEFT OPERAND ! 2293: * VALUE CODE FOR RIGHT OPERAND ! 2294: * =O$ALT ! 2295: * ! 2296: * ARRAY REFERENCE (CASE OF ONE SUBSCRIPT) ! 2297: * VALUE CODE FOR ARRAY OPERAND ! 2298: * VALUE CODE FOR SUBSCRIPT OPERAND ! 2299: * =O$AOV ! 2300: * ! 2301: * (CASE OF MORE THAN ONE SUBSCRIPT) ! 2302: * VALUE CODE FOR ARRAY OPERAND ! 2303: * VALUE CODE FOR FIRST SUBSCRIPT ! 2304: * VALUE CODE FOR SECOND SUBSCRIPT ! 2305: * ... ! 2306: * VALUE CODE FOR LAST SUBSCRIPT ! 2307: * =O$AMV ! 2308: * NUMBER OF SUBSCRIPTS ! 2309: EJC ! 2310: * ! 2311: * CODE BLOCK (CONTINUED) ! 2312: * ! 2313: * ASSIGNMENT (TO NATURAL VARIABLE) ! 2314: * VALUE CODE FOR RIGHT OPERAND ! 2315: * POINTER TO VRSTO FIELD OF VRBLK ! 2316: * ! 2317: * (TO ANY OTHER VARIABLE) ! 2318: * NAME CODE FOR LEFT OPERAND ! 2319: * VALUE CODE FOR RIGHT OPERAND ! 2320: * =O$ASS ! 2321: * ! 2322: * COMPILE ERROR =O$CER ! 2323: * ! 2324: * ! 2325: * COMPLEMENTATION VALUE CODE FOR OPERAND ! 2326: * =O$COM ! 2327: * ! 2328: * CONCATENATION (CASE OF PRED FUNC LEFT OPERAND) ! 2329: * VALUE CODE FOR LEFT OPERAND ! 2330: * =O$POP ! 2331: * VALUE CODE FOR RIGHT OPERAND ! 2332: * ! 2333: * (ALL OTHER CASES) ! 2334: * VALUE CODE FOR LEFT OPERAND ! 2335: * VALUE CODE FOR RIGHT OPERAND ! 2336: * =O$CNC ! 2337: * ! 2338: * CURSOR ASSIGNMENT NAME CODE FOR OPERAND ! 2339: * =O$CAS ! 2340: * ! 2341: * DIVISION VALUE CODE FOR LEFT OPERAND ! 2342: * VALUE CODE FOR RIGHT OPERAND ! 2343: * =O$DVD ! 2344: * ! 2345: * EXPONENTIATION VALUE CODE FOR LEFT OPERAND ! 2346: * VALUE CODE FOR RIGHT OPERAND ! 2347: * =O$EXP ! 2348: * ! 2349: * FUNCTION CALL (CASE OF CALL TO SYSTEM FUNCTION) ! 2350: * VALUE CODE FOR FIRST ARGUMENT ! 2351: * VALUE CODE FOR SECOND ARGUMENT ! 2352: * ... ! 2353: * VALUE CODE FOR LAST ARGUMENT ! 2354: * POINTER TO SVFNC FIELD OF SVBLK ! 2355: * ! 2356: EJC ! 2357: * ! 2358: * CODE BLOCK (CONTINUED) ! 2359: * ! 2360: * FUNCTION CALL (CASE OF NON-SYSTEM FUNCTION 1 ARG) ! 2361: * VALUE CODE FOR ARGUMENT ! 2362: * =O$FNS ! 2363: * POINTER TO VRBLK FOR FUNCTION ! 2364: * ! 2365: * (NON-SYSTEM FUNCTION, GT 1 ARG) ! 2366: * VALUE CODE FOR FIRST ARGUMENT ! 2367: * VALUE CODE FOR SECOND ARGUMENT ! 2368: * ... ! 2369: * VALUE CODE FOR LAST ARGUMENT ! 2370: * =O$FNC ! 2371: * NUMBER OF ARGUMENTS ! 2372: * POINTER TO VRBLK FOR FUNCTION ! 2373: * ! 2374: * IMMEDIATE ASSIGNMENT VALUE CODE FOR LEFT OPERAND ! 2375: * NAME CODE FOR RIGHT OPERAND ! 2376: * =O$IMA ! 2377: * ! 2378: * INDIRECTION VALUE CODE FOR OPERAND ! 2379: * =O$INV ! 2380: * ! 2381: * INTERROGATION VALUE CODE FOR OPERAND ! 2382: * =O$INT ! 2383: * ! 2384: * KEYWORD REFERENCE NAME CODE FOR OPERAND ! 2385: * =O$KWV ! 2386: * ! 2387: * MULTIPLICATION VALUE CODE FOR LEFT OPERAND ! 2388: * VALUE CODE FOR RIGHT OPERAND ! 2389: * =O$MLT ! 2390: * ! 2391: * NAME REFERENCE (NATURAL VARIABLE CASE) ! 2392: * POINTER TO NMBLK FOR NAME ! 2393: * ! 2394: * (ALL OTHER CASES) ! 2395: * NAME CODE FOR OPERAND ! 2396: * =O$NAM ! 2397: * ! 2398: * NEGATION =O$NTA ! 2399: * CDBLK OFFSET OF O$NTC WORD ! 2400: * VALUE CODE FOR OPERAND ! 2401: * =O$NTB ! 2402: * =O$NTC ! 2403: EJC ! 2404: * ! 2405: * CODE BLOCK (CONTINUED) ! 2406: * ! 2407: * PATTERN ASSIGNMENT VALUE CODE FOR LEFT OPERAND ! 2408: * NAME CODE FOR RIGHT OPERAND ! 2409: * =O$PAS ! 2410: * ! 2411: * PATTERN MATCH VALUE CODE FOR LEFT OPERAND ! 2412: * VALUE CODE FOR RIGHT OPERAND ! 2413: * =O$PMV ! 2414: * ! 2415: * PATTERN REPLACEMENT NAME CODE FOR SUBJECT ! 2416: * VALUE CODE FOR PATTERN ! 2417: * =O$PMN ! 2418: * VALUE CODE FOR REPLACEMENT ! 2419: * =O$RPL ! 2420: * ! 2421: * SELECTION (FOR FIRST ALTERNATIVE) ! 2422: * =O$SLA ! 2423: * CDBLK OFFSET TO NEXT O$SLC WORD ! 2424: * VALUE CODE FOR FIRST ALTERNATIVE ! 2425: * =O$SLB ! 2426: * CDBLK OFFSET PAST ALTERNATIVES ! 2427: * ! 2428: * (FOR SUBSEQUENT ALTERNATIVES) ! 2429: * =O$SLC ! 2430: * CDBLK OFFSET TO NEXT O$SLC,O$SLD ! 2431: * VALUE CODE FOR ALTERNATIVE ! 2432: * =O$SLB ! 2433: * OFFSET IN CDBLK PAST ALTERNATIVES ! 2434: * ! 2435: * (FOR LAST ALTERNATIVE) ! 2436: * =O$SLD ! 2437: * VALUE CODE FOR LAST ALTERNATIVE ! 2438: * ! 2439: * SUBTRACTION VALUE CODE FOR LEFT OPERAND ! 2440: * VALUE CODE FOR RIGHT OPERAND ! 2441: * =O$SUB ! 2442: EJC ! 2443: * ! 2444: * CODE BLOCK (CONTINUED) ! 2445: * ! 2446: * GENERATION OF CODE BY NAME FOR EXPRESSION ELEMENTS. ! 2447: * ! 2448: * VARIABLE =O$LVN ! 2449: * POINTER TO VRBLK ! 2450: * ! 2451: * EXPRESSION (CASE OF *NATURAL VARIABLE) ! 2452: * =O$LVN ! 2453: * POINTER TO VRBLK ! 2454: * ! 2455: * (ALL OTHER CASES) ! 2456: * =O$LEX ! 2457: * POINTER TO EXBLK ! 2458: * ! 2459: * ! 2460: * ARRAY REFERENCE (CASE OF ONE SUBSCRIPT) ! 2461: * VALUE CODE FOR ARRAY OPERAND ! 2462: * VALUE CODE FOR SUBSCRIPT OPERAND ! 2463: * =O$AON ! 2464: * ! 2465: * (CASE OF MORE THAN ONE SUBSCRIPT) ! 2466: * VALUE CODE FOR ARRAY OPERAND ! 2467: * VALUE CODE FOR FIRST SUBSCRIPT ! 2468: * VALUE CODE FOR SECOND SUBSCRIPT ! 2469: * ... ! 2470: * VALUE CODE FOR LAST SUBSCRIPT ! 2471: * =O$AMN ! 2472: * NUMBER OF SUBSCRIPTS ! 2473: * ! 2474: * COMPILE ERROR =O$CER ! 2475: * ! 2476: * FUNCTION CALL (SAME CODE AS FOR VALUE CALL) ! 2477: * =O$FNE ! 2478: * ! 2479: * INDIRECTION VALUE CODE FOR OPERAND ! 2480: * =O$INN ! 2481: * ! 2482: * KEYWORD REFERENCE NAME CODE FOR OPERAND ! 2483: * =O$KWN ! 2484: * ! 2485: * ANY OTHER OPERAND IS AN ERROR IN A NAME POSITION ! 2486: * ! 2487: * NOTE THAT IN THIS DESCRIPTION, =O$XXX REFERS TO THE ! 2488: * GENERATION OF A WORD CONTAINING THE ADDRESS OF ANOTHER ! 2489: * WORD WHICH CONTAINS THE ENTRY POINT ADDRESS O$XXX. ! 2490: EJC ! 2491: * ! 2492: * CODE BLOCK (CONTINUED) ! 2493: * ! 2494: * NOW WE CONSIDER THE OVERALL STRUCTURE OF THE CODE BLOCK ! 2495: * FOR A STATEMENT WITH POSSIBLE GOTO FIELDS. ! 2496: * ! 2497: * FIRST COMES THE CODE FOR THE STATEMENT BODY. ! 2498: * THE STATEMENT BODY IS AN EXPRESSION TO BE EVALUATED ! 2499: * BY VALUE ALTHOUGH THE VALUE IS NOT ACTUALLY REQUIRED. ! 2500: * NORMAL VALUE CODE IS GENERATED FOR THE BODY OF THE ! 2501: * STATEMENT EXCEPT IN THE CASE OF A PATTERN MATCH BY ! 2502: * VALUE, IN WHICH CASE THE FOLLOWING IS GENERATED. ! 2503: * ! 2504: * VALUE CODE FOR LEFT OPERAND ! 2505: * VALUE CODE FOR RIGHT OPERAND ! 2506: * =O$PMS ! 2507: * ! 2508: * NEXT WE HAVE THE CODE FOR THE SUCCESS GOTO. THERE ARE ! 2509: * SEVERAL CASES AS FOLLOWS. ! 2510: * ! 2511: * 1) NO SUCCESS GOTO PTR TO CDBLK FOR NEXT STATEMENT ! 2512: * ! 2513: * 2) SIMPLE LABEL PTR TO VRTRA FIELD OF VRBLK ! 2514: * ! 2515: * 3) COMPLEX GOTO (CODE BY NAME FOR GOTO OPERAND) ! 2516: * =O$GOC ! 2517: * ! 2518: * 4) DIRECT GOTO (CODE BY VALUE FOR GOTO OPERAND) ! 2519: * =O$GOD ! 2520: * ! 2521: * FOLLOWING THIS WE GENERATE CODE FOR THE FAILURE GOTO IF ! 2522: * IT IS DIRECT OR IF IT IS COMPLEX, SIMPLE FAILURE GOTOS ! 2523: * HAVING BEEN HANDLED BY AN APPROPRIATE SETTING OF THE ! 2524: * CDFAL FIELD OF THE CDBLK. THE GENERATED CODE IS ONE ! 2525: * OF THE FOLLOWING. ! 2526: * ! 2527: * 1) COMPLEX FGOTO =O$FIF ! 2528: * =O$GOF ! 2529: * NAME CODE FOR GOTO OPERAND ! 2530: * =O$GOC ! 2531: * ! 2532: * 2) DIRECT FGOTO =O$FIF ! 2533: * =O$GOF ! 2534: * VALUE CODE FOR GOTO OPERAND ! 2535: * =O$GOD ! 2536: * ! 2537: * AN OPTIMIZATION OCCURS IF THE SUCCESS AND FAILURE GOTOS ! 2538: * ARE IDENTICAL AND EITHER COMPLEX OR DIRECT. IN THIS CASE, ! 2539: * NO CODE IS GENERATED FOR THE SUCCESS GOTO AND CONTROL ! 2540: * IS ALLOWED TO FALL INTO THE FAILURE GOTO ON SUCCESS. ! 2541: EJC ! 2542: * ! 2543: * COMPILER BLOCK (CMBLK) ! 2544: * ! 2545: * A COMPILER BLOCK (CMBLK) IS BUILT BY EXPAN TO REPRESENT ! 2546: * ONE NODE OF A TREE STRUCTURED EXPRESSION REPRESENTATION. ! 2547: * ! 2548: * +------------------------------------+ ! 2549: * I CMIDN I ! 2550: * +------------------------------------+ ! 2551: * I CMLEN I ! 2552: * +------------------------------------+ ! 2553: * I CMTYP I ! 2554: * +------------------------------------+ ! 2555: * I CMOPN I ! 2556: * +------------------------------------+ ! 2557: * / CMVLS OR CMROP / ! 2558: * / / ! 2559: * / CMLOP / ! 2560: * / / ! 2561: * +------------------------------------+ ! 2562: * ! 2563: CMIDN EQU 0 POINTER TO DUMMY ROUTINE B$CMT ! 2564: CMLEN EQU CMIDN+1 LENGTH OF CMBLK IN BYTES ! 2565: CMTYP EQU CMLEN+1 TYPE (C$XXX, SEE LIST BELOW) ! 2566: CMOPN EQU CMTYP+1 OPERAND POINTER (SEE BELOW) ! 2567: CMVLS EQU CMOPN+1 OPERAND VALUE POINTERS (SEE BELOW) ! 2568: CMROP EQU CMVLS RIGHT (ONLY) OPERATOR OPERAND ! 2569: CMLOP EQU CMVLS+1 LEFT OPERATOR OPERAND ! 2570: CMSI$ EQU CMVLS NUMBER OF STANDARD FIELDS IN CMBLK ! 2571: CMUS$ EQU CMSI$+1 SIZE OF UNARY OPERATOR CMBLK ! 2572: CMBS$ EQU CMSI$+2 SIZE OF BINARY OPERATOR CMBLK ! 2573: CMAR1 EQU CMVLS+1 ARRAY SUBSCRIPT POINTERS ! 2574: * ! 2575: * THE CMOPN AND CMVLS FIELDS ARE SET AS FOLLOWS ! 2576: * ! 2577: * ARRAY REFERENCE CMOPN = PTR TO ARRAY OPERAND ! 2578: * CMVLS = PTRS TO SUBSCRIPT OPERANDS ! 2579: * ! 2580: * FUNCTION CALL CMOPN = PTR TO VRBLK FOR FUNCTION ! 2581: * CMVLS = PTRS TO ARGUMENT OPERANDS ! 2582: * ! 2583: * SELECTION CMOPN = ZERO ! 2584: * CMVLS = PTRS TO ALTERNATE OPERANDS ! 2585: * ! 2586: * UNARY OPERATOR CMOPN = PTR TO OPERATOR DVBLK ! 2587: * CMROP = PTR TO OPERAND ! 2588: * ! 2589: * BINARY OPERATOR CMOPN = PTR TO OPERATOR DVBLK ! 2590: * CMROP = PTR TO RIGHT OPERAND ! 2591: * CMLOP = PTR TO LEFT OPERAND ! 2592: EJC ! 2593: * ! 2594: * CMTYP IS SET TO INDICATE THE TYPE OF EXPRESSION ELEMENT ! 2595: * AS SHOWN BY THE FOLLOWING TABLE OF DEFINITIONS. ! 2596: * ! 2597: C$ARR EQU 0 ARRAY REFERENCE ! 2598: C$FNC EQU C$ARR+1 FUNCTION CALL ! 2599: C$DEF EQU C$FNC+1 DEFERRED EXPRESSION (UNARY *) ! 2600: C$IND EQU C$DEF+1 INDIRECTION (UNARY $) ! 2601: C$KEY EQU C$IND+1 KEYWORD REFERENCE (UNARY AMPERSAND) ! 2602: C$UBO EQU C$KEY+1 UNDEFINED BINARY OPERATOR ! 2603: C$UUO EQU C$UBO+1 UNDEFINED UNARY OPERATOR ! 2604: C$UO$ EQU C$UUO+1 TEST VALUE (=C$UUO+1=C$UBO+2) ! 2605: C$$NM EQU C$UUO+1 NUMBER OF CODES FOR NAME OPERANDS ! 2606: * ! 2607: * THE REMAINING TYPES INDICATE EXPRESSION ELEMENTS WHICH ! 2608: * CAN ONLY BE EVALUATED BY VALUE (NOT BY NAME). ! 2609: * ! 2610: C$BVL EQU C$UUO+1 BINARY OP WITH VALUE OPERANDS ! 2611: C$UVL EQU C$BVL+1 UNARY OPERATOR WITH VALUE OPERAND ! 2612: C$ALT EQU C$UVL+1 ALTERNATION (BINARY BAR) ! 2613: C$CNC EQU C$ALT+1 CONCATENATION ! 2614: C$CNP EQU C$CNC+1 CONCATENATION, NOT PATTERN MATCH ! 2615: C$UNM EQU C$CNP+1 UNARY OP WITH NAME OPERAND ! 2616: C$BVN EQU C$UNM+1 BINARY OP (OPERANDS BY VALUE, NAME) ! 2617: C$ASS EQU C$BVN+1 ASSIGNMENT ! 2618: C$INT EQU C$ASS+1 INTERROGATION ! 2619: C$NEG EQU C$INT+1 NEGATION (UNARY NOT) ! 2620: C$SEL EQU C$NEG+1 SELECTION ! 2621: C$PMT EQU C$SEL+1 PATTERN MATCH ! 2622: * ! 2623: C$PR$ EQU C$BVN LAST PREEVALUABLE CODE ! 2624: C$$NV EQU C$PMT+1 NUMBER OF DIFFERENT CMBLK TYPES ! 2625: EJC ! 2626: * ! 2627: * CHARACTER TABLE BLOCK (CTBLK) ! 2628: * ! 2629: * A CHARACTER TABLE BLOCK IS USED TO HOLD LOGICAL CHARACTER ! 2630: * TABLES FOR USE WITH ANY,NOTANY,SPAN,BREAK,BREAKX ! 2631: * PATTERNS. EACH CHARACTER TABLE CAN BE USED TO STORE ! 2632: * CFP$N DISTINCT TABLES AS BIT COLUMNS. A BIT COLUMN ! 2633: * ALLOCATED FOR EACH ARGUMENT OF MORE THAN ONE CHARACTER ! 2634: * IN LENGTH TO ONE OF THE ABOVE LISTED PATTERN PRIMITIVES. ! 2635: * ! 2636: * +------------------------------------+ ! 2637: * I CTTYP I ! 2638: * +------------------------------------+ ! 2639: * * * ! 2640: * * * ! 2641: * * CTCHS * ! 2642: * * * ! 2643: * * * ! 2644: * +------------------------------------+ ! 2645: * ! 2646: CTTYP EQU 0 POINTER TO DUMMY ROUTINE B$CTT ! 2647: CTCHS EQU CTTYP+1 START OF CHARACTER TABLE WORDS ! 2648: CTSI$ EQU CTCHS+CFP$A NUMBER OF WORDS IN CTBLK ! 2649: * ! 2650: * CTCHS IS CFP$A WORDS LONG AND CONSISTS OF A ONE WORD ! 2651: * BIT STRING VALUE FOR EACH POSSIBLE CHARACTER IN THE ! 2652: * INTERNAL ALPHABET. EACH OF THE CFP$N POSSIBLE BITS IN ! 2653: * A BITSTRING IS USED TO FORM A COLUMN OF BIT INDICATORS. ! 2654: * A BIT IS SET ON IF THE CHARACTER IS IN THE TABLE AND OFF ! 2655: * IF THE CHARACTER IS NOT PRESENT. ! 2656: EJC ! 2657: * ! 2658: * DATATYPE FUNCTION BLOCK (DFBLK) ! 2659: * ! 2660: * A DATATYPE FUNCTION IS USED TO CONTROL THE CONSTRUCTION ! 2661: * OF A PROGRAM DEFINED DATATYPE OBJECT. A CALL TO THE ! 2662: * SYSTEM FUNCTION DATA BUILDS A DFBLK FOR THE DATATYPE NAME ! 2663: * ! 2664: * NOTE THAT THESE BLOCKS ARE BUILT IN STATIC BECAUSE PDBLK ! 2665: * LENGTH IS GOT FROM DFLEN FIELD. IF DFBLK WAS IN DYNAMIC ! 2666: * STORE THIS WOULD CAUSE TROUBLE DURING PASS TWO OF GARBAGE ! 2667: * COLLECTION. SCBLK REFERRED TO BY DFNAM FIELD IS ALSO PUT ! 2668: * IN STATIC SO THAT THERE ARE NO RELOC. FIELDS. THIS CUTS ! 2669: * GARBAGE COLLECTION TASK APPRECIABLY FOR PDBLKS WHICH ARE ! 2670: * LIKELY TO BE PRESENT IN LARGE NUMBERS. ! 2671: * ! 2672: * +------------------------------------+ ! 2673: * I FCODE I ! 2674: * +------------------------------------+ ! 2675: * I FARGS I ! 2676: * +------------------------------------+ ! 2677: * I DFLEN I ! 2678: * +------------------------------------+ ! 2679: * I DFPDL I ! 2680: * +------------------------------------+ ! 2681: * I DFNAM I ! 2682: * +------------------------------------+ ! 2683: * / / ! 2684: * / DFFLD / ! 2685: * / / ! 2686: * +------------------------------------+ ! 2687: * ! 2688: DFLEN EQU FARGS+1 LENGTH OF DFBLK IN BYTES ! 2689: DFPDL EQU DFLEN+1 LENGTH OF CORRESPONDING PDBLK ! 2690: DFNAM EQU DFPDL+1 POINTER TO SCBLK FOR DATATYPE NAME ! 2691: DFFLD EQU DFNAM+1 START OF VRBLK PTRS FOR FIELD NAMES ! 2692: DFFLB EQU DFFLD-1 OFFSET BEHIND DFFLD FOR FIELD FUNC ! 2693: DFSI$ EQU DFFLD NUMBER OF STANDARD FIELDS IN DFBLK ! 2694: * ! 2695: * THE FCODE FIELD POINTS TO THE ROUTINE B$DFC ! 2696: * ! 2697: * FARGS (THE NUMBER OF ARGUMENTS) IS THE NUMBER OF FIELDS. ! 2698: EJC ! 2699: * ! 2700: * DOPE VECTOR BLOCK (DVBLK) ! 2701: * ! 2702: * A DOPE VECTOR IS ASSEMBLED FOR EACH POSSIBLE OPERATOR IN ! 2703: * THE SNOBOL4 LANGUAGE AS PART OF THE CONSTANT SECTION. ! 2704: * ! 2705: * +------------------------------------+ ! 2706: * I DVOPN I ! 2707: * +------------------------------------+ ! 2708: * I DVTYP I ! 2709: * +------------------------------------+ ! 2710: * I DVLPR I ! 2711: * +------------------------------------+ ! 2712: * I DVRPR I ! 2713: * +------------------------------------+ ! 2714: * ! 2715: DVOPN EQU 0 ENTRY ADDRESS (PTR TO O$XXX) ! 2716: DVTYP EQU DVOPN+1 TYPE CODE (C$XXX, SEE CMBLK) ! 2717: DVLPR EQU DVTYP+1 LEFT PRECEDENCE (LLXXX, SEE BELOW) ! 2718: DVRPR EQU DVLPR+1 RIGHT PRECEDENCE (RRXXX, SEE BELOW) ! 2719: DVUS$ EQU DVLPR+1 SIZE OF UNARY OPERATOR DV ! 2720: DVBS$ EQU DVRPR+1 SIZE OF BINARY OPERATOR DV ! 2721: DVUBS EQU DVUS$+DVBS$ SIZE OF UNOP + BINOP (SEE SCANE) ! 2722: * ! 2723: * THE CONTENTS OF THE DVTYP FIELD IS COPIED INTO THE CMTYP ! 2724: * FIELD OF THE CMBLK FOR THE OPERATOR IF IT IS USED. ! 2725: * ! 2726: * THE CMOPN FIELD OF AN OPERATOR CMBLK POINTS TO THE DVBLK ! 2727: * ITSELF, PROVIDING THE REQUIRED ENTRY ADDRESS POINTER PTR. ! 2728: * ! 2729: * FOR NORMALLY UNDEFINED OPERATORS, THE DVOPN (AND CMOPN) ! 2730: * FIELDS CONTAIN A WORD OFFSET FROM R$UBA OF THE FUNCTION ! 2731: * BLOCK POINTER FOR THE OPERATOR (INSTEAD OF O$XXX PTR). ! 2732: * FOR CERTAIN SPECIAL OPERATORS, THE DVOPN FIELD IS NOT ! 2733: * REQUIRED AT ALL AND IS ASSEMBLED AS ZERO. ! 2734: * ! 2735: * THE LEFT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO ! 2736: * THE LEFT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS THE ! 2737: * PRECEDENCE OF THE OPERATOR TOWARDS ITS RIGHT OPERAND. ! 2738: * ! 2739: * THE RIGHT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO ! 2740: * THE RIGHT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS ! 2741: * THE PRECEDENCE OF THE OPERATOR TOWARDS ITS LEFT OPERAND. ! 2742: * ! 2743: * HIGHER PRECEDENCE VALUES CORRESPOND TO A TIGHTER BINDING ! 2744: * CAPABILITY. THUS WE HAVE THE LEFT PRECEDENCE LOWER ! 2745: * (HIGHER) THAN THE RIGHT PRECEDENCE FOR RIGHT (LEFT) ! 2746: * ASSOCIATIVE BINARY OPERATORS. ! 2747: * ! 2748: * THE LEFT PRECEDENCE OF UNARY OPERATORS IS SET TO AN ! 2749: * ARBITRARY HIGH VALUE. THE RIGHT VALUE IS NOT REQUIRED AND ! 2750: * CONSEQUENTLY THE DVRPR FIELD IS OMITTED FOR UNARY OPS. ! 2751: EJC ! 2752: * ! 2753: * TABLE OF OPERATOR PRECEDENCE VALUES ! 2754: * ! 2755: RRASS EQU 10 RIGHT EQUAL ! 2756: LLASS EQU 00 LEFT EQUAL ! 2757: RRPMT EQU 20 RIGHT QUESTION MARK ! 2758: LLPMT EQU 30 LEFT QUESTION MARK ! 2759: RRAMP EQU 40 RIGHT AMPERSAND ! 2760: LLAMP EQU 50 LEFT AMPERSAND ! 2761: RRALT EQU 70 RIGHT VERTICAL BAR ! 2762: LLALT EQU 60 LEFT VERTICAL BAR ! 2763: RRCNC EQU 90 RIGHT BLANK ! 2764: LLCNC EQU 80 LEFT BLANK ! 2765: RRATS EQU 110 RIGHT AT ! 2766: LLATS EQU 100 LEFT AT ! 2767: RRPLM EQU 120 RIGHT PLUS, MINUS ! 2768: LLPLM EQU 130 LEFT PLUS, MINUS ! 2769: RRNUM EQU 140 RIGHT NUMBER ! 2770: LLNUM EQU 150 LEFT NUMBER ! 2771: RRDVD EQU 160 RIGHT SLASH ! 2772: LLDVD EQU 170 LEFT SLASH ! 2773: RRMLT EQU 180 RIGHT ASTERISK ! 2774: LLMLT EQU 190 LEFT ASTERISK ! 2775: RRPCT EQU 200 RIGHT PERCENT ! 2776: LLPCT EQU 210 LEFT PERCENT ! 2777: RREXP EQU 230 RIGHT EXCLAMATION ! 2778: LLEXP EQU 220 LEFT EXCLAMATION ! 2779: RRDLD EQU 240 RIGHT DOLLAR, DOT ! 2780: LLDLD EQU 250 LEFT DOLLAR, DOT ! 2781: RRNOT EQU 270 RIGHT NOT ! 2782: LLNOT EQU 260 LEFT NOT ! 2783: LLUNO EQU 999 LEFT ALL UNARY OPERATORS ! 2784: * ! 2785: * PRECEDENCES ARE THE SAME AS IN BTL SNOBOL4 WITH THE ! 2786: * FOLLOWING EXCEPTIONS. ! 2787: * ! 2788: * 1) BINARY QUESTION MARK IS LOWERED AND MADE LEFT ASSOC- ! 2789: * IATIVE TO REFLECT ITS NEW USE FOR PATTERN MATCHING. ! 2790: * ! 2791: * 2) ALTERNATION AND CONCATENATION ARE MADE RIGHT ! 2792: * ASSOCIATIVE FOR GREATER EFFICIENCY IN PATTERN ! 2793: * CONSTRUCTION AND MATCHING RESPECTIVELY. THIS CHANGE ! 2794: * IS TRANSPARENT TO THE SNOBOL4 PROGRAMMER. ! 2795: * ! 2796: * 3) THE EQUAL SIGN HAS BEEN ADDED AS A LOW PRECEDENCE ! 2797: * OPERATOR WHICH IS RIGHT ASSOCIATIVE TO REFLECT ITS ! 2798: * MORE GENERAL USAGE IN THIS VERSION OF SNOBOL4. ! 2799: EJC ! 2800: * ! 2801: * EXTERNAL FUNCTION BLOCK (EFBLK) ! 2802: * ! 2803: * AN EXTERNAL FUNCTION BLOCK IS USED TO CONTROL THE CALLING ! 2804: * OF AN EXTERNAL FUNCTION. IT IS BUILT BY A CALL TO LOAD. ! 2805: * ! 2806: * +------------------------------------+ ! 2807: * I FCODE I ! 2808: * +------------------------------------+ ! 2809: * I FARGS I ! 2810: * +------------------------------------+ ! 2811: * I EFLEN I ! 2812: * +------------------------------------+ ! 2813: * I EFUSE I ! 2814: * +------------------------------------+ ! 2815: * I EFCOD I ! 2816: * +------------------------------------+ ! 2817: * I EFVAR I ! 2818: * +------------------------------------+ ! 2819: * I EFRSL I ! 2820: * +------------------------------------+ ! 2821: * / / ! 2822: * / EFTAR / ! 2823: * / / ! 2824: * +------------------------------------+ ! 2825: * ! 2826: EFLEN EQU FARGS+1 LENGTH OF EFBLK IN BYTES ! 2827: EFUSE EQU EFLEN+1 USE COUNT (FOR OPSYN) ! 2828: EFCOD EQU EFUSE+1 PTR TO CODE (FROM SYSLD) ! 2829: EFVAR EQU EFCOD+1 PTR TO ASSOCIATED VRBLK ! 2830: EFRSL EQU EFVAR+1 RESULT TYPE (SEE BELOW) ! 2831: EFTAR EQU EFRSL+1 ARGUMENT TYPES (SEE BELOW) ! 2832: EFSI$ EQU EFTAR NUMBER OF STANDARD FIELDS IN EFBLK ! 2833: * ! 2834: * THE FCODE FIELD POINTS TO THE ROUTINE B$EFC. ! 2835: * ! 2836: * EFUSE IS USED TO KEEP TRACK OF MULTIPLE USE WHEN OPSYN ! 2837: * IS EMPLOYED. THE FUNCTION IS AUTOMATICALLY UNLOADED ! 2838: * WHEN THERE ARE NO MORE REFERENCES TO THE FUNCTION. ! 2839: * ! 2840: * EFRSL AND EFTAR ARE TYPE CODES AS FOLLOWS. ! 2841: * ! 2842: * 0 TYPE IS UNCONVERTED ! 2843: * 1 TYPE IS STRING ! 2844: * 2 TYPE IS INTEGER ! 2845: * 3 TYPE IS REAL ! 2846: EJC ! 2847: * ! 2848: * EXPRESSION VARIABLE BLOCK (EVBLK) ! 2849: * ! 2850: * IN THIS VERSION OF SPITBOL, AN EXPRESSION CAN BE USED IN ! 2851: * ANY POSITION WHICH WOULD NORMALLY EXPECT A NAME (FOR ! 2852: * EXAMPLE ON THE LEFT SIDE OF EQUALS OR AS THE RIGHT ! 2853: * ARGUMENT OF BINARY DOT). THIS CORRESPONDS TO THE CREATION ! 2854: * OF A PSEUDO-VARIABLE WHICH IS REPRESENTED BY A POINTER TO ! 2855: * AN EXPRESSION VARIABLE BLOCK AS FOLLOWS. ! 2856: * ! 2857: * +------------------------------------+ ! 2858: * I EVTYP I ! 2859: * +------------------------------------+ ! 2860: * I EVEXP I ! 2861: * +------------------------------------+ ! 2862: * I EVVAR I ! 2863: * +------------------------------------+ ! 2864: * ! 2865: EVTYP EQU 0 POINTER TO DUMMY ROUTINE B$EVT ! 2866: EVEXP EQU EVTYP+1 POINTER TO EXBLK FOR EXPRESSION ! 2867: EVVAR EQU EVEXP+1 POINTER TO TRBEV DUMMY TRBLK ! 2868: EVSI$ EQU EVVAR+1 SIZE OF EVBLK ! 2869: * ! 2870: * THE NAME OF AN EXPRESSION VARIABLE IS REPRESENTED BY A ! 2871: * BASE POINTER TO THE EVBLK AND AN OFFSET OF EVVAR. THIS ! 2872: * VALUE APPEARS TO BE TRAPPED BY THE DUMMY TRBEV BLOCK. ! 2873: * ! 2874: * NOTE THAT THERE IS NO NEED TO ALLOW FOR THE CASE OF AN ! 2875: * EXPRESSION VARIABLE WHICH REFERENCES AN SEBLK SINCE A ! 2876: * VARIABLE WHICH IS OF THE FORM *VAR IS EQUIVALENT TO VAR. ! 2877: EJC ! 2878: * ! 2879: * EXPRESSION BLOCK (EXBLK) ! 2880: * ! 2881: * AN EXPRESSION BLOCK IS BUILT FOR EACH EXPRESSION ! 2882: * REFERENCED IN A PROGRAM OR CREATED BY EVAL OR CONVERT ! 2883: * DURING EXECUTION OF A PROGRAM. ! 2884: * ! 2885: * +------------------------------------+ ! 2886: * I EXTYP I ! 2887: * +------------------------------------+ ! 2888: * I EXSTM I ! 2889: * +------------------------------------+ ! 2890: * I EXLEN I ! 2891: * +------------------------------------+ ! 2892: * I EXFLC I ! 2893: * +------------------------------------+ ! 2894: * / / ! 2895: * / EXCOD / ! 2896: * / / ! 2897: * +------------------------------------+ ! 2898: * ! 2899: EXTYP EQU 0 PTR TO ROUTINE B$EXL TO LOAD EXPR ! 2900: EXSTM EQU CDSTM STORES STMNT NO. DURING EVALUATION ! 2901: EXLEN EQU EXSTM+1 LENGTH OF EXBLK IN BYTES ! 2902: EXFLC EQU EXLEN+1 FAILURE CODE (=O$FEX) ! 2903: EXCOD EQU EXFLC+1 PSEUDO-CODE FOR EXPRESSION ! 2904: EXSI$ EQU EXCOD NUMBER OF STANDARD FIELDS IN EXBLK ! 2905: * ! 2906: * THERE ARE TWO CASES FOR EXCOD DEPENDING ON WHETHER THE ! 2907: * EXPRESSION CAN BE EVALUATED BY NAME (SEE DESCRIPTION ! 2908: * OF CDBLK FOR DETAILS OF CODE FOR EXPRESSIONS). ! 2909: * ! 2910: * IF THE EXPRESSION CAN BE EVALUATED BY NAME WE HAVE. ! 2911: * ! 2912: * (CODE FOR EXPR BY NAME) ! 2913: * =O$RNM ! 2914: * ! 2915: * IF THE EXPRESSION CAN ONLY BE EVALUATED BY VALUE. ! 2916: * ! 2917: * (CODE FOR EXPR BY VALUE) ! 2918: * =O$RVL ! 2919: EJC ! 2920: * ! 2921: * FIELD FUNCTION BLOCK (FFBLK) ! 2922: * ! 2923: * A FIELD FUNCTION BLOCK IS USED TO CONTROL THE SELECTION ! 2924: * OF A FIELD FROM A PROGRAM DEFINED DATATYPE BLOCK. ! 2925: * A CALL TO DATA CREATES AN FFBLK FOR EACH FIELD. ! 2926: * ! 2927: * +------------------------------------+ ! 2928: * I FCODE I ! 2929: * +------------------------------------+ ! 2930: * I FARGS I ! 2931: * +------------------------------------+ ! 2932: * I FFDFP I ! 2933: * +------------------------------------+ ! 2934: * I FFNXT I ! 2935: * +------------------------------------+ ! 2936: * I FFOFS I ! 2937: * +------------------------------------+ ! 2938: * ! 2939: FFDFP EQU FARGS+1 POINTER TO ASSOCIATED DFBLK ! 2940: FFNXT EQU FFDFP+1 PTR TO NEXT FFBLK ON CHAIN OR ZERO ! 2941: FFOFS EQU FFNXT+1 OFFSET (BYTES) TO FIELD IN PDBLK ! 2942: FFSI$ EQU FFOFS+1 SIZE OF FFBLK IN WORDS ! 2943: * ! 2944: * THE FCODE FIELD POINTS TO THE ROUTINE B$FFC. ! 2945: * ! 2946: * FARGS ALWAYS CONTAINS ONE. ! 2947: * ! 2948: * FFDFP IS USED TO VERIFY THAT THE CORRECT PROGRAM DEFINED ! 2949: * DATATYPE IS BEING ACCESSED BY THIS CALL. ! 2950: * FFDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC ! 2951: * ! 2952: * FFOFS IS USED TO SELECT THE APPROPRIATE FIELD. NOTE THAT ! 2953: * IT IS AN ACTUAL OFFSET (NOT A FIELD NUMBER) ! 2954: * ! 2955: * FFNXT IS USED TO POINT TO THE NEXT FFBLK OF THE SAME NAME ! 2956: * IN THE CASE WHERE THERE ARE SEVERAL FIELDS OF THE SAME ! 2957: * NAME FOR DIFFERENT DATATYPES. ZERO MARKS THE END OF CHAIN ! 2958: EJC ! 2959: * ! 2960: * INTEGER CONSTANT BLOCK (ICBLK) ! 2961: * ! 2962: * AN ICBLK IS CREATED FOR EVERY INTEGER REFERENCED OR ! 2963: * CREATED BY A PROGRAM. NOTE HOWEVER THAT CERTAIN INTERNAL ! 2964: * INTEGER VALUES ARE STORED AS ADDRESSES (E.G. THE LENGTH ! 2965: * FIELD IN A STRING CONSTANT BLOCK) ! 2966: * ! 2967: * +------------------------------------+ ! 2968: * I ICGET I ! 2969: * +------------------------------------+ ! 2970: * * ICVAL * ! 2971: * +------------------------------------+ ! 2972: * ! 2973: ICGET EQU 0 PTR TO ROUTINE B$ICL TO LOAD INT ! 2974: ICVAL EQU ICGET+1 INTEGER VALUE ! 2975: ICSI$ EQU ICVAL+CFP$I SIZE OF ICBLK ! 2976: * ! 2977: * THE LENGTH OF THE ICVAL FIELD IS CFP$I. ! 2978: EJC ! 2979: * ! 2980: * KEYWORD VARIABLE BLOCK (KVBLK) ! 2981: * ! 2982: * A KVBLK IS USED TO REPRESENT A KEYWORD PSEUDO-VARIABLE. ! 2983: * A KVBLK IS BUILT FOR EACH KEYWORD REFERENCE (KWNAM). ! 2984: * ! 2985: * +------------------------------------+ ! 2986: * I KVTYP I ! 2987: * +------------------------------------+ ! 2988: * I KVVAR I ! 2989: * +------------------------------------+ ! 2990: * I KVNUM I ! 2991: * +------------------------------------+ ! 2992: * ! 2993: KVTYP EQU 0 POINTER TO DUMMY ROUTINE B$KVT ! 2994: KVVAR EQU KVTYP+1 POINTER TO DUMMY BLOCK TRBKV ! 2995: KVNUM EQU KVVAR+1 KEYWORD NUMBER ! 2996: KVSI$ EQU KVNUM+1 SIZE OF KVBLK ! 2997: * ! 2998: * THE NAME OF A KEYWORD VARIABLE IS REPRESENTED BY A ! 2999: * BASE POINTER TO THE KVBLK AND AN OFFSET OF KVVAR. THE ! 3000: * VALUE APPEARS TO BE TRAPPED BY THE POINTER TO TRBKV. ! 3001: EJC ! 3002: * ! 3003: * NAME BLOCK (NMBLK) ! 3004: * ! 3005: * A NAME BLOCK IS USED WHEREVER A NAME MUST BE STORED AS ! 3006: * A VALUE FOLLOWING USE OF THE UNARY DOT OPERATOR. ! 3007: * ! 3008: * +------------------------------------+ ! 3009: * I NMTYP I ! 3010: * +------------------------------------+ ! 3011: * I NMBAS I ! 3012: * +------------------------------------+ ! 3013: * I NMOFS I ! 3014: * +------------------------------------+ ! 3015: * ! 3016: NMTYP EQU 0 PTR TO ROUTINE B$NML TO LOAD NAME ! 3017: NMBAS EQU NMTYP+1 BASE POINTER FOR VARIABLE ! 3018: NMOFS EQU NMBAS+1 OFFSET FOR VARIABLE ! 3019: NMSI$ EQU NMOFS+1 SIZE OF NMBLK ! 3020: * ! 3021: * THE ACTUAL FIELD REPRESENTING THE CONTENTS OF THE NAME ! 3022: * IS FOUND NMOFS BYTES PAST THE ADDRESS IN NMBAS. ! 3023: * ! 3024: * THE NAME IS SPLIT INTO BASE AND OFFSET FORM TO AVOID ! 3025: * CREATION OF A POINTER INTO THE MIDDLE OF A BLOCK WHICH ! 3026: * COULD NOT BE HANDLED PROPERLY BY THE GARBAGE COLLECTOR. ! 3027: * ! 3028: * A NAME MAY BE BUILT FOR ANY VARIABLE (SEE SECTION ON ! 3029: * REPRESENTATIONS OF VARIABLES) THIS INCLUDES THE ! 3030: * CASES OF PSEUDO-VARIABLES. ! 3031: EJC ! 3032: * ! 3033: * PATTERN BLOCK, NO PARAMETERS (P0BLK) ! 3034: * ! 3035: * A P0BLK IS USED TO REPRESENT PATTERN NODES WHICH DO ! 3036: * NOT REQUIRE THE USE OF ANY PARAMETER VALUES. ! 3037: * ! 3038: * +------------------------------------+ ! 3039: * I PCODE I ! 3040: * +------------------------------------+ ! 3041: * I PTHEN I ! 3042: * +------------------------------------+ ! 3043: * ! 3044: PCODE EQU 0 PTR TO MATCH ROUTINE (P$XXX) ! 3045: PTHEN EQU PCODE+1 POINTER TO SUBSEQUENT NODE ! 3046: PASI$ EQU PTHEN+1 SIZE OF P0BLK ! 3047: * ! 3048: * PTHEN POINTS TO THE PATTERN BLOCK FOR THE SUBSEQUENT ! 3049: * NODE TO BE MATCHED. THIS IS A POINTER TO THE PATTERN ! 3050: * BLOCK NDNTH IF THERE IS NO SUBSEQUENT (END OF PATTERN) ! 3051: * ! 3052: * PCODE IS A POINTER TO THE MATCH ROUTINE FOR THE NODE. ! 3053: EJC ! 3054: * ! 3055: * PATTERN BLOCK (ONE PARAMETER) ! 3056: * ! 3057: * A P1BLK IS USED TO REPRESENT PATTERN NODES WHICH ! 3058: * REQUIRE ONE PARAMETER VALUE. ! 3059: * ! 3060: * +------------------------------------+ ! 3061: * I PCODE I ! 3062: * +------------------------------------+ ! 3063: * I PTHEN I ! 3064: * +------------------------------------+ ! 3065: * I PARM1 I ! 3066: * +------------------------------------+ ! 3067: * ! 3068: PARM1 EQU PTHEN+1 FIRST PARAMETER VALUE ! 3069: PBSI$ EQU PARM1+1 SIZE OF P1BLK IN WORDS ! 3070: * ! 3071: * SEE P0BLK FOR DEFINITIONS OF PCODE, PTHEN ! 3072: * ! 3073: * PARM1 CONTAINS A PARAMETER VALUE USED IN MATCHING THE ! 3074: * NODE. FOR EXAMPLE, IN A LEN PATTERN, IT IS THE INTEGER ! 3075: * ARGUMENT TO LEN. THE DETAILS OF THE USE OF THE PARAMETER ! 3076: * FIELD ARE INCLUDED IN THE DESCRIPTION OF THE INDIVIDUAL ! 3077: * MATCH ROUTINES. PARM1 IS ALWAYS AN ADDRESS POINTER WHICH ! 3078: * IS PROCESSED BY THE GARBAGE COLLECTOR. ! 3079: EJC ! 3080: * ! 3081: * PATTERN BLOCK (TWO PARAMETERS) ! 3082: * ! 3083: * A P2BLK IS USED TO REPRESENT PATTERN NODES WHICH ! 3084: * REQUIRE TWO PARAMETER VALUES. ! 3085: * ! 3086: * +------------------------------------+ ! 3087: * I PCODE I ! 3088: * +------------------------------------+ ! 3089: * I PTHEN I ! 3090: * +------------------------------------+ ! 3091: * I PARM1 I ! 3092: * +------------------------------------+ ! 3093: * I PARM2 I ! 3094: * +------------------------------------+ ! 3095: * ! 3096: PARM2 EQU PARM1+1 SECOND PARAMETER VALUE ! 3097: PCSI$ EQU PARM2+1 SIZE OF P2BLK IN WORDS ! 3098: * ! 3099: * SEE P1BLK FOR DEFINITIONS OF PCODE, PTHEN, PARM1 ! 3100: * ! 3101: * PARM2 IS A PARAMETER WHICH PERFORMS THE SAME SORT OF ! 3102: * FUNCTION AS PARM1 (SEE DESCRIPTION OF P1BLK). ! 3103: * ! 3104: * PARM2 IS A NON-RELOCATABLE FIELD AND IS NOT ! 3105: * PROCESSED BY THE GARBAGE COLLECTOR. ACCORDINGLY, IT MAY ! 3106: * NOT CONTAIN A POINTER TO A BLOCK IN DYNAMIC MEMORY. ! 3107: EJC ! 3108: * ! 3109: * PROGRAM-DEFINED DATATYPE BLOCK ! 3110: * ! 3111: * A PDBLK REPRESENTS THE DATA ITEM FORMED BY A CALL TO A ! 3112: * DATATYPE FUNCTION AS DEFINED BY THE SYSTEM FUNCTION DATA. ! 3113: * ! 3114: * +------------------------------------+ ! 3115: * I PDTYP I ! 3116: * +------------------------------------+ ! 3117: * I IDVAL I ! 3118: * +------------------------------------+ ! 3119: * I PDDFP I ! 3120: * +------------------------------------+ ! 3121: * / / ! 3122: * / PDFLD / ! 3123: * / / ! 3124: * +------------------------------------+ ! 3125: * ! 3126: PDTYP EQU 0 PTR TO DUMMY ROUTINE B$PDT ! 3127: PDDFP EQU IDVAL+1 PTR TO ASSOCIATED DFBLK ! 3128: PDFLD EQU PDDFP+1 START OF FIELD VALUE POINTERS ! 3129: PDFOF EQU DFFLD-PDFLD DIFFERENCE IN OFFSET TO FIELD PTRS ! 3130: PDSI$ EQU PDFLD SIZE OF STANDARD FIELDS IN PDBLK ! 3131: PDDFS EQU DFSI$-PDSI$ DIFFERENCE IN DFBLK, PDBLK SIZES ! 3132: * ! 3133: * THE PDDFP POINTER MAY BE USED TO DETERMINE THE DATATYPE ! 3134: * AND THE NAMES OF THE FIELDS IF REQUIRED. THE DFBLK ALSO ! 3135: * CONTAINS THE LENGTH OF THE PDBLK IN BYTES (FIELD DFPDL). ! 3136: * PDDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC ! 3137: * ! 3138: * PDFLD VALUES ARE STORED IN ORDER FROM LEFT TO RIGHT. ! 3139: * THEY CONTAIN VALUES OR POINTERS TO TRBLK CHAINS. ! 3140: EJC ! 3141: * ! 3142: * PROGRAM DEFINED FUNCTION BLOCK (PFBLK) ! 3143: * ! 3144: * A PFBLK IS CREATED FOR EACH CALL TO THE DEFINE FUNCTION ! 3145: * AND A POINTER TO THE PFBLK PLACED IN THE PROPER VRBLK. ! 3146: * ! 3147: * +------------------------------------+ ! 3148: * I FCODE I ! 3149: * +------------------------------------+ ! 3150: * I FARGS I ! 3151: * +------------------------------------+ ! 3152: * I PFLEN I ! 3153: * +------------------------------------+ ! 3154: * I PFVBL I ! 3155: * +------------------------------------+ ! 3156: * I PFNLO I ! 3157: * +------------------------------------+ ! 3158: * I PFCOD I ! 3159: * +------------------------------------+ ! 3160: * I PFCTR I ! 3161: * +------------------------------------+ ! 3162: * I PFRTR I ! 3163: * +------------------------------------+ ! 3164: * / / ! 3165: * / PFARG / ! 3166: * / / ! 3167: * +------------------------------------+ ! 3168: * ! 3169: PFLEN EQU FARGS+1 LENGTH OF PFBLK IN BYTES ! 3170: PFVBL EQU PFLEN+1 POINTER TO VRBLK FOR FUNCTION NAME ! 3171: PFNLO EQU PFVBL+1 NUMBER OF LOCALS ! 3172: PFCOD EQU PFNLO+1 PTR TO CDBLK FOR FIRST STATEMENT ! 3173: PFCTR EQU PFCOD+1 TRBLK PTR IF CALL TRACED ELSE 0 ! 3174: PFRTR EQU PFCTR+1 TRBLK PTR IF RETURN TRACED ELSE 0 ! 3175: PFARG EQU PFRTR+1 VRBLK PTRS FOR ARGUMENTS AND LOCALS ! 3176: PFAGB EQU PFARG-1 OFFSET BEHIND PFARG FOR ARG, LOCAL ! 3177: PFSI$ EQU PFARG NUMBER OF STANDARD FIELDS IN PFBLK ! 3178: * ! 3179: * THE FCODE FIELD POINTS TO THE ROUTINE B$PFC. ! 3180: * ! 3181: * PFARG IS STORED IN THE FOLLOWING ORDER. ! 3182: * ! 3183: * ARGUMENTS (LEFT TO RIGHT) ! 3184: * LOCALS (LEFT TO RIGHT) ! 3185: .IF .CNRA ! 3186: .ELSE ! 3187: EJC ! 3188: * ! 3189: * REAL CONSTANT BLOCK (RCBLK) ! 3190: * ! 3191: * AN RCBLK IS CREATED FOR EVERY REAL REFERENCED OR ! 3192: * CREATED BY A PROGRAM. ! 3193: * ! 3194: * +------------------------------------+ ! 3195: * I RCGET I ! 3196: * +------------------------------------+ ! 3197: * * RCVAL * ! 3198: * +------------------------------------+ ! 3199: * ! 3200: RCGET EQU 0 PTR TO ROUTINE B$RCL TO LOAD REAL ! 3201: RCVAL EQU RCGET+1 REAL VALUE ! 3202: RCSI$ EQU RCVAL+CFP$R SIZE OF RCBLK ! 3203: * ! 3204: * THE LENGTH OF THE RCVAL FIELD IS CFP$R. ! 3205: .FI ! 3206: EJC ! 3207: * ! 3208: * STRING CONSTANT BLOCK (SCBLK) ! 3209: * ! 3210: * AN SCBLK IS BUILT FOR EVERY STRING REFERENCED OR CREATED ! 3211: * BY A PROGRAM. ! 3212: * ! 3213: * +------------------------------------+ ! 3214: * I SCGET I ! 3215: * +------------------------------------+ ! 3216: * I SCLEN I ! 3217: * +------------------------------------+ ! 3218: * / / ! 3219: * / SCHAR / ! 3220: * / / ! 3221: * +------------------------------------+ ! 3222: * ! 3223: SCGET EQU 0 PTR TO ROUTINE B$SCL TO LOAD STRING ! 3224: SCLEN EQU SCGET+1 LENGTH OF STRING IN CHARACTERS ! 3225: SCHAR EQU SCLEN+1 CHARACTERS OF STRING ! 3226: SCSI$ EQU SCHAR SIZE OF STANDARD FIELDS IN SCBLK ! 3227: * ! 3228: * THE CHARACTERS OF THE STRING ARE STORED LEFT JUSTIFIED. ! 3229: * THE FINAL WORD IS PADDED ON THE RIGHT WITH ZEROS. ! 3230: * (I.E. THE CHARACTER WHOSE INTERNAL CODE IS ZERO). ! 3231: * ! 3232: * THE VALUE OF SCLEN MAY NOT EXCEED MXLEN. THIS ENSURES ! 3233: * THAT CHARACTER OFFSETS (E.G. THE PATTERN MATCH CURSOR) ! 3234: * CAN BE CORRECTLY PROCESSED BY THE GARBAGE COLLECTOR. ! 3235: * ! 3236: * NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING ! 3237: * IS GIVEN IN BYTES BY CFP$F AND THAT THIS VALUE IS ! 3238: * AUTOMATICALLY ALLOWED FOR IN PLC, PSC. ! 3239: * NOTE THAT FOR A SPITBOL SCBLK, THE VALUE OF CFP$F ! 3240: * IS GIVEN BY CFP$B*SCHAR. ! 3241: EJC ! 3242: * ! 3243: * SIMPLE EXPRESSION BLOCK (SEBLK) ! 3244: * ! 3245: * AN SEBLK IS USED TO REPRESENT AN EXPRESSION OF THE FORM ! 3246: * *(NATURAL VARIABLE). ALL OTHER EXPRESSIONS ARE EXBLKS. ! 3247: * ! 3248: * +------------------------------------+ ! 3249: * I SETYP I ! 3250: * +------------------------------------+ ! 3251: * I SEVAR I ! 3252: * +------------------------------------+ ! 3253: * ! 3254: SETYP EQU 0 PTR TO ROUTINE B$SEL TO LOAD EXPR ! 3255: SEVAR EQU SETYP+1 PTR TO VRBLK FOR VARIABLE ! 3256: SESI$ EQU SEVAR+1 LENGTH OF SEBLK IN WORDS ! 3257: EJC ! 3258: * ! 3259: * STANDARD VARIABLE BLOCK (SVBLK) ! 3260: * ! 3261: * AN SVBLK IS ASSEMBLED IN THE CONSTANT SECTION FOR EACH ! 3262: * VARIABLE WHICH SATISFIES ONE OF THE FOLLOWING CONDITIONS. ! 3263: * ! 3264: * 1) IT IS THE NAME OF A SYSTEM FUNCTION ! 3265: * 2) IT HAS AN INITIAL VALUE ! 3266: * 3) IT HAS A KEYWORD ASSOCIATION ! 3267: * 4) IT HAS A STANDARD I/O ASSOCIATION ! 3268: * 6) IT HAS A STANDARD LABEL ASSOCIATION ! 3269: * ! 3270: * IF VRBLKS ARE CONSTRUCTED FOR ANY OF THESE VARIABLES, ! 3271: * THEN THE VRSVP FIELD POINTS TO THE SVBLK (SEE VRBLK) ! 3272: * ! 3273: * +------------------------------------+ ! 3274: * I SVBIT I ! 3275: * +------------------------------------+ ! 3276: * I SVLEN I ! 3277: * +------------------------------------+ ! 3278: * I SVCHS I ! 3279: * +------------------------------------+ ! 3280: * I SVKNM I ! 3281: * +------------------------------------+ ! 3282: * I SVFNC I ! 3283: * +------------------------------------+ ! 3284: * I SVNAR I ! 3285: * +------------------------------------+ ! 3286: * I SVLBL I ! 3287: * +------------------------------------+ ! 3288: * I SVVAL I ! 3289: * +------------------------------------+ ! 3290: EJC ! 3291: * ! 3292: * STANDARD VARIABLE BLOCK (CONTINUED) ! 3293: * ! 3294: SVBIT EQU 0 BIT STRING INDICATING ATTRIBUTES ! 3295: SVLEN EQU 1 (=SCLEN) LENGTH OF NAME IN CHARS ! 3296: SVCHS EQU 2 (=SCHAR) CHARACTERS OF NAME ! 3297: SVSI$ EQU 2 NUMBER OF STANDARD FIELDS IN SVBLK ! 3298: SVPRE EQU 1 SET IF PREEVALUATION PERMITTED ! 3299: SVFFC EQU SVPRE+SVPRE SET ON IF FAST CALL PERMITTED ! 3300: SVCKW EQU SVFFC+SVFFC SET ON IF KEYWORD VALUE CONSTANT ! 3301: SVPRD EQU SVCKW+SVCKW SET ON IF PREDICATE FUNCTION ! 3302: SVNBT EQU 4 NUMBER OF BITS TO RIGHT OF SVKNM ! 3303: SVKNM EQU SVPRD+SVPRD SET ON IF KEYWORD ASSOCIATION ! 3304: SVFNC EQU SVKNM+SVKNM SET ON IF SYSTEM FUNCTION ! 3305: SVNAR EQU SVFNC+SVFNC SET ON IF SYSTEM FUNCTION ! 3306: SVLBL EQU SVNAR+SVNAR SET ON IF SYSTEM LABEL ! 3307: SVVAL EQU SVLBL+SVLBL SET ON IF PREDEFINED VALUE ! 3308: * ! 3309: * NOTE THAT THE LAST FIVE BITS CORRESPOND IN ORDER ! 3310: * TO THE FIELDS WHICH ARE PRESENT (SEE PROCEDURE GTNVR). ! 3311: * ! 3312: * THE FOLLOWING DEFINITIONS ARE USED IN THE SVBLK TABLE ! 3313: * ! 3314: SVFNF EQU SVFNC+SVNAR FUNCTION WITH NO FAST CALL ! 3315: SVFNN EQU SVFNF+SVFFC FUNCTION WITH FAST CALL, NO PREEVAL ! 3316: SVFNP EQU SVFNN+SVPRE FUNCTION ALLOWING PREEVALUATION ! 3317: SVFPR EQU SVFNN+SVPRD PREDICATE FUNCTION ! 3318: SVFNK EQU SVFNN+SVKNM NO PREEVAL FUNC + KEYWORD ! 3319: SVKWV EQU SVKNM+SVVAL KEYWORD + VALUE ! 3320: SVKWC EQU SVCKW+SVKNM KEYWORD WITH CONSTANT VALUE ! 3321: SVKVC EQU SVKWV+SVCKW CONSTANT KEYWORD + VALUE ! 3322: SVKVL EQU SVKVC+SVLBL CONSTANT KEYWORD + VALUE + LABEL ! 3323: SVFPK EQU SVFNP+SVKVC PREEVAL FCN + CONST KEYWD + VAL ! 3324: * ! 3325: * THE SVPRE BIT ALLOWS THE COMPILER TO PREEVALUATE A CALL ! 3326: * TO THE ASSOCIATED SYSTEM FUNCTION IF ALL THE ARGUMENTS ! 3327: * ARE THEMSELVES CONSTANTS. FUNCTIONS IN THIS CATEGORY ! 3328: * MUST HAVE NO SIDE EFFECTS AND MUST NEVER CAUSE FAILURE. ! 3329: * THE CALL MAY GENERATE AN ERROR CONDITION. ! 3330: * ! 3331: * THE SVFFC BIT ALLOWS THE COMPILER TO GENERATE THE SPECIAL ! 3332: * FAST CALL AFTER ADJUSTING THE NUMBER OF ARGUMENTS. ONLY ! 3333: * THE ITEM AND APPLY FUNCTIONS FALL OUTSIDE THIS CATEGORY. ! 3334: * ! 3335: * THE SVCKW BIT IS SET IF THE ASSOCIATED KEYWORD VALUE IS ! 3336: * A CONSTANT, THUS ALLOWING PREEVALUATION FOR A VALUE CALL. ! 3337: * ! 3338: * THE SVPRD BIT IS SET ON FOR ALL PREDICATE FUNCTIONS TO ! 3339: * ENABLE THE SPECIAL CONCATENATION CODE OPTIMIZATION. ! 3340: EJC ! 3341: * ! 3342: * SVBLK (CONTINUED) ! 3343: * ! 3344: * SVKNM KEYWORD NUMBER ! 3345: * ! 3346: * SVKNM IS PRESENT ONLY FOR A STANDARD KEYWORD ASSOC. ! 3347: * IT CONTAINS A KEYWORD NUMBER AS DEFINED BY THE ! 3348: * KEYWORD NUMBER TABLE GIVEN LATER ON. ! 3349: * ! 3350: * SVFNC SYSTEM FUNCTION POINTER ! 3351: * ! 3352: * SVFNC IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC. ! 3353: * IT IS A POINTER TO THE ACTUAL CODE FOR THE SYSTEM ! 3354: * FUNCTION. THE GENERATED CODE FOR A FAST CALL IS A ! 3355: * POINTER TO THE SVFNC FIELD OF THE SVBLK FOR THE ! 3356: * FUNCTION. THE VRFNC FIELD OF THE VRBLK POINTS TO ! 3357: * THIS SAME FIELD, IN WHICH CASE, IT SERVES AS THE ! 3358: * FCODE FIELD FOR THE FUNCTION CALL. ! 3359: * ! 3360: * SVNAR NUMBER OF FUNCTION ARGUMENTS ! 3361: * ! 3362: * SVNAR IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC. ! 3363: * IT IS THE NUMBER OF ARGUMENTS REQUIRED FOR A CALL ! 3364: * TO THE SYSTEM FUNCTION. THE COMPILER USES THIS ! 3365: * VALUE TO ADJUST THE NUMBER OF ARGUMENTS IN A FAST ! 3366: * CALL AND IN THE CASE OF A FUNCTION CALLED THROUGH ! 3367: * THE VRFNC FIELD OF THE VRBLK, THE SVNAR FIELD ! 3368: * SERVES AS THE FARGS FIELD FOR O$FNC. A SPECIAL ! 3369: * CASE OCCURS IF THIS VALUE IS SET TO 999. THIS IS ! 3370: * USED TO INDICATE THAT THE FUNCTION HAS A VARIABLE ! 3371: * NUMBER OF ARGUMENTS AND CAUSES O$FNC TO PASS CONTROL ! 3372: * WITHOUT ADJUSTING THE ARGUMENT COUNT. THE ONLY ! 3373: * PREDEFINED FUNCTIONS USING THIS ARE APPLY AND ITEM. ! 3374: * ! 3375: * SVLBL SYSTEM LABEL POINTER ! 3376: * ! 3377: * SVLBL IS PRESENT ONLY FOR A STANDARD LABEL ASSOC. ! 3378: * IT IS A POINTER TO A SYSTEM LABEL ROUTINE (L$XXX). ! 3379: * THE VRLBL FIELD OF THE CORRESPONDING VRBLK POINTS TO ! 3380: * THE SVLBL FIELD OF THE SVBLK. ! 3381: * ! 3382: * SVVAL SYSTEM VALUE POINTER ! 3383: * ! 3384: * SVVAL IS PRESENT ONLY FOR A STANDARD VALUE. ! 3385: * IT IS A POINTER TO THE PATTERN NODE (NDXXX) WHICH ! 3386: * IS THE STANDARD INITIAL VALUE OF THE VARIABLE. ! 3387: * THIS VALUE IS COPIED TO THE VRVAL FIELD OF THE VRBLK ! 3388: EJC ! 3389: * ! 3390: * SVBLK (CONTINUED) ! 3391: * ! 3392: * KEYWORD NUMBER TABLE ! 3393: * ! 3394: * THE FOLLOWING TABLE GIVES SYMBOLIC NAMES FOR KEYWORD ! 3395: * NUMBERS. THESE VALUES ARE STORED IN THE SVKNM FIELD OF ! 3396: * SVBLKS AND IN THE KVNUM FIELD OF KVBLKS. SEE ALSO ! 3397: * PROCEDURES ASIGN, ACESS AND KWNAM. ! 3398: * ! 3399: * UNPROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES ! 3400: * ! 3401: K$ABE EQU 0 ABEND ! 3402: K$ANC EQU K$ABE+CFP$B ANCHOR ! 3403: .IF .CULC ! 3404: K$CAS EQU K$ANC+CFP$B CASE ! 3405: K$COD EQU K$CAS+CFP$B CODE ! 3406: .ELSE ! 3407: K$COD EQU K$ANC+CFP$B CODE ! 3408: .FI ! 3409: K$DMP EQU K$COD+CFP$B DUMP ! 3410: K$ERL EQU K$DMP+CFP$B ERRLIMIT ! 3411: K$ERT EQU K$ERL+CFP$B ERRTYPE ! 3412: K$FTR EQU K$ERT+CFP$B FTRACE ! 3413: K$INP EQU K$FTR+CFP$B INPUT ! 3414: K$MXL EQU K$INP+CFP$B MAXLENGTH ! 3415: K$OUP EQU K$MXL+CFP$B OUTPUT ! 3416: .IF .CNPF ! 3417: K$TRA EQU K$OUP+CFP$B TRACE ! 3418: .ELSE ! 3419: K$PFL EQU K$OUP+CFP$B PROFILE ! 3420: K$TRA EQU K$PFL+CFP$B TRACE ! 3421: .FI ! 3422: K$TRM EQU K$TRA+CFP$B TRIM ! 3423: * ! 3424: * PROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES ! 3425: * ! 3426: K$FNC EQU K$TRM+CFP$B FNCLEVEL ! 3427: K$LST EQU K$FNC+CFP$B LASTNO ! 3428: K$STN EQU K$LST+CFP$B STNO ! 3429: * ! 3430: * KEYWORDS WITH CONSTANT PATTERN VALUES ! 3431: * ! 3432: K$ABO EQU K$STN+CFP$B ABORT ! 3433: K$ARB EQU K$ABO+PASI$ ARB ! 3434: K$BAL EQU K$ARB+PASI$ BAL ! 3435: K$FAL EQU K$BAL+PASI$ FAIL ! 3436: K$FEN EQU K$FAL+PASI$ FENCE ! 3437: K$REM EQU K$FEN+PASI$ REM ! 3438: K$SUC EQU K$REM+PASI$ SUCCEED ! 3439: EJC ! 3440: * ! 3441: * KEYWORD NUMBER TABLE (CONTINUED) ! 3442: * ! 3443: * SPECIAL KEYWORDS ! 3444: * ! 3445: K$ALP EQU K$SUC+1 ALPHABET ! 3446: K$RTN EQU K$ALP+1 RTNTYPE ! 3447: K$STC EQU K$RTN+1 STCOUNT ! 3448: K$ETX EQU K$STC+1 ERRTEXT ! 3449: K$STL EQU K$ETX+1 STLIMIT ! 3450: * ! 3451: * RELATIVE OFFSETS OF SPECIAL KEYWORDS ! 3452: * ! 3453: K$$AL EQU K$ALP-K$ALP ALPHABET ! 3454: K$$RT EQU K$RTN-K$ALP RTNTYPE ! 3455: K$$SC EQU K$STC-K$ALP STCOUNT ! 3456: K$$ET EQU K$ETX-K$ALP ERRTEXT ! 3457: K$$SL EQU K$STL-K$ALP STLIMIT ! 3458: * ! 3459: * SYMBOLS USED IN ASIGN AND ACESS PROCEDURES ! 3460: * ! 3461: K$P$$ EQU K$FNC FIRST PROTECTED KEYWORD ! 3462: K$V$$ EQU K$ABO FIRST KEYWORD WITH CONSTANT VALUE ! 3463: K$S$$ EQU K$ALP FIRST KEYWORD WITH SPECIAL ACESS ! 3464: EJC ! 3465: * ! 3466: * FORMAT OF A TABLE BLOCK (TBBLK) ! 3467: * ! 3468: * A TABLE BLOCK IS USED TO REPRESENT A TABLE VALUE. ! 3469: * IT IS BUILT BY A CALL TO THE TABLE OR CONVERT FUNCTIONS. ! 3470: * ! 3471: * +------------------------------------+ ! 3472: * I TBTYP I ! 3473: * +------------------------------------+ ! 3474: * I IDVAL I ! 3475: * +------------------------------------+ ! 3476: * I TBLEN I ! 3477: * +------------------------------------+ ! 3478: * +------------------------------------+ ! 3479: * I TBINV I ! 3480: * +------------------------------------+ ! 3481: * / / ! 3482: * / TBBUK / ! 3483: * / / ! 3484: * +------------------------------------+ ! 3485: * ! 3486: TBTYP EQU 0 POINTER TO DUMMY ROUTINE B$TBT ! 3487: TBLEN EQU OFFS2 LENGTH OF TBBLK IN BYTES ! 3488: TBINV EQU OFFS3 DEFAULT INITIAL LOOKUP VALUE ! 3489: TBBUK EQU TBINV+1 START OF HASH BUCKET POINTERS ! 3490: TBSI$ EQU TBBUK SIZE OF STANDARD FIELDS IN TBBLK ! 3491: TBNBK EQU 11 DEFAULT NO. OF BUCKETS ! 3492: * ! 3493: * THE TABLE BLOCK IS A HASH TABLE WHICH POINTS TO CHAINS ! 3494: * OF TABLE ELEMENT BLOCKS REPRESENTING THE ELEMENTS ! 3495: * IN THE TABLE WHICH HASH INTO THE SAME BUCKET. ! 3496: * ! 3497: * TBBUK ENTRIES EITHER POINT TO THE FIRST TEBLK ON THE ! 3498: * CHAIN OR THEY POINT TO THE TBBLK ITSELF TO INDICATE THE ! 3499: * END OF THE CHAIN. ! 3500: EJC ! 3501: * ! 3502: * TABLE ELEMENT BLOCK (TEBLK) ! 3503: * ! 3504: * A TABLE ELEMENT IS USED TO REPRESENT A SINGLE ENTRY IN ! 3505: * A TABLE (SEE DESCRIPTION OF TBBLK FORMAT FOR HASH TABLE) ! 3506: * ! 3507: * +------------------------------------+ ! 3508: * I TETYP I ! 3509: * +------------------------------------+ ! 3510: * I TESUB I ! 3511: * +------------------------------------+ ! 3512: * I TEVAL I ! 3513: * +------------------------------------+ ! 3514: * I TENXT I ! 3515: * +------------------------------------+ ! 3516: * ! 3517: TETYP EQU 0 POINTER TO DUMMY ROUTINE B$TET ! 3518: TESUB EQU TETYP+1 SUBSCRIPT VALUE ! 3519: TEVAL EQU TESUB+1 (=VRVAL) TABLE ELEMENT VALUE ! 3520: TENXT EQU TEVAL+1 LINK TO NEXT TEBLK ! 3521: * SEE S$CNV WHERE RELATION IS ASSUMED WITH TENXT AND TBBUK ! 3522: TESI$ EQU TENXT+1 SIZE OF TEBLK IN WORDS ! 3523: * ! 3524: * TENXT POINTS TO THE NEXT TEBLK ON THE HASH CHAIN FROM THE ! 3525: * TBBUK CHAIN FOR THIS HASH INDEX. AT THE END OF THE CHAIN, ! 3526: * TENXT POINTS BACK TO THE START OF THE TBBLK. ! 3527: * ! 3528: * TEVAL CONTAINS A DATA POINTER OR A TRBLK POINTER. ! 3529: * ! 3530: * TESUB CONTAINS A DATA POINTER. ! 3531: EJC ! 3532: * ! 3533: * TRAP BLOCK (TRBLK) ! 3534: * ! 3535: * A TRAP BLOCK IS USED TO REPRESENT A TRACE OR INPUT OR ! 3536: * OUTPUT ASSOCIATION IN RESPONSE TO A CALL TO THE TRACE ! 3537: * INPUT OR OUTPUT SYSTEM FUNCTIONS. SEE BELOW FOR DETAILS ! 3538: * ! 3539: * +------------------------------------+ ! 3540: * I TRIDN I ! 3541: * +------------------------------------+ ! 3542: * I TRTYP I ! 3543: * +------------------------------------+ ! 3544: * I TRVAL OR TRLBL OR TRNXT OR TRKVR I ! 3545: * +------------------------------------+ ! 3546: * I TRTAG OR TRTER OR TRTRF I ! 3547: * +------------------------------------+ ! 3548: * I TRFNC OR TRFPT I ! 3549: * +------------------------------------+ ! 3550: * ! 3551: TRIDN EQU 0 POINTER TO DUMMY ROUTINE B$TRT ! 3552: TRTYP EQU TRIDN+1 TRAP TYPE CODE ! 3553: TRVAL EQU TRTYP+1 VALUE OF TRAPPED VARIABLE (=VRVAL) ! 3554: TRNXT EQU TRVAL PTR TO NEXT TRBLK ON TRBLK CHAIN ! 3555: TRLBL EQU TRVAL PTR TO ACTUAL LABEL (TRACED LABEL) ! 3556: TRKVR EQU TRVAL VRBLK POINTER FOR KEYWORD TRACE ! 3557: TRTAG EQU TRVAL+1 TRACE TAG ! 3558: TRTER EQU TRTAG PTR TO TERMINAL VRBLK OR NULL ! 3559: TRTRF EQU TRTAG PTR TO TRBLK HOLDING FCBLK PTR ! 3560: TRFNC EQU TRTAG+1 TRACE FUNCTION VRBLK (ZERO IF NONE) ! 3561: TRFPT EQU TRFNC FCBLK PTR FOR SYSIO ! 3562: TRSI$ EQU TRFNC+1 NUMBER OF WORDS IN TRBLK ! 3563: * ! 3564: TRTIN EQU 0 TRACE TYPE FOR INPUT ASSOCIATION ! 3565: TRTAC EQU TRTIN+1 TRACE TYPE FOR ACCESS TRACE ! 3566: TRTVL EQU TRTAC+1 TRACE TYPE FOR VALUE TRACE ! 3567: TRTOU EQU TRTVL+1 TRACE TYPE FOR OUTPUT ASSOCIATION ! 3568: TRTFC EQU TRTOU+1 TRACE TYPE FOR FCBLK IDENTIFICATION ! 3569: EJC ! 3570: * ! 3571: * TRAP BLOCK (CONTINUED) ! 3572: * ! 3573: * VARIABLE INPUT ASSOCIATION ! 3574: * ! 3575: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK ! 3576: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE ! 3577: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS ! 3578: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK. ! 3579: * ! 3580: * TRTYP IS SET TO TRTIN ! 3581: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL ! 3582: * TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS ! 3583: * FOR INPUT, TERMINAL, ELSE IT IS NULL. ! 3584: * TRTRF POINTS TO THE TRAP BLOCK WHICH IN TURN POINTS ! 3585: * TO AN FCBLK USED FOR I/O ASSOCIATION. ! 3586: * TRFPT IS THE FCBLK PTR RETURNED BY SYSIO. ! 3587: * ! 3588: * VARIABLE ACCESS TRACE ASSOCIATION ! 3589: * ! 3590: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK ! 3591: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE ! 3592: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS ! 3593: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK. ! 3594: * ! 3595: * TRTYP IS SET TO TRTAC ! 3596: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL ! 3597: * TRTAG IS THE TRACE TAG (0 IF NONE) ! 3598: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE) ! 3599: * ! 3600: * VARIABLE VALUE TRACE ASSOCIATION ! 3601: * ! 3602: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK ! 3603: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE ! 3604: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS ! 3605: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK. ! 3606: * ! 3607: * TRTYP IS SET TO TRTVL ! 3608: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL ! 3609: * TRTAG IS THE TRACE TAG (0 IF NONE) ! 3610: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE) ! 3611: EJC ! 3612: * TRAP BLOCK (CONTINUED) ! 3613: * ! 3614: * VARIABLE OUTPUT ASSOCIATION ! 3615: * ! 3616: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK ! 3617: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE ! 3618: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS ! 3619: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK. ! 3620: * ! 3621: * TRTYP IS SET TO TRTOU ! 3622: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL ! 3623: * TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS ! 3624: * FOR OUTPUT, TERMINAL, ELSE IT IS NULL. ! 3625: * TRTRF POINTS TO THE TRAP BLOCK WHICH IN TURN POINTS ! 3626: * TO AN FCBLK USED FOR I/O ASSOCIATION. ! 3627: * TRFPT IS THE FCBLK PTR RETURNED BY SYSIO. ! 3628: * ! 3629: * FUNCTION CALL TRACE ! 3630: * ! 3631: * THE PFCTR FIELD OF THE CORRESPONDING PFBLK IS SET ! 3632: * TO POINT TO A TRBLK. ! 3633: * ! 3634: * TRTYP IS SET TO TRTIN ! 3635: * TRNXT IS ZERO ! 3636: * TRTAG IS THE TRACE TAG (0 IF NONE) ! 3637: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE) ! 3638: * ! 3639: * FUNCTION RETURN TRACE ! 3640: * ! 3641: * THE PFRTR FIELD OF THE CORRESPONDING PFBLK IS SET ! 3642: * TO POINT TO A TRBLK ! 3643: * ! 3644: * TRTYP IS SET TO TRTIN ! 3645: * TRNXT IS ZERO ! 3646: * TRTAG IS THE TRACE TAG (0 IF NONE) ! 3647: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE) ! 3648: * ! 3649: * LABEL TRACE ! 3650: * ! 3651: * THE VRLBL OF THE VRBLK FOR THE LABEL IS ! 3652: * CHANGED TO POINT TO A TRBLK AND THE VRTRA FIELD IS ! 3653: * SET TO B$VRT TO ACTIVATE THE CHECK. ! 3654: * ! 3655: * TRTYP IS SET TO TRTIN ! 3656: * TRLBL POINTS TO THE ACTUAL LABEL (CDBLK) VALUE ! 3657: * TRTAG IS THE TRACE TAG (0 IF NONE) ! 3658: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE) ! 3659: EJC ! 3660: * ! 3661: * TRAP BLOCK (CONTINUED) ! 3662: * ! 3663: * KEYWORD TRACE ! 3664: * ! 3665: * KEYWORDS WHICH CAN BE TRACED POSSESS A UNIQUE ! 3666: * LOCATION WHICH IS ZERO IF THERE IS NO TRACE AND ! 3667: * POINTS TO A TRBLK IF THERE IS A TRACE. THE LOCATIONS ! 3668: * ARE AS FOLLOWS. ! 3669: * ! 3670: * R$ERT ERRTYPE ! 3671: * R$FNC FNCLEVEL ! 3672: * R$STC STCOUNT ! 3673: * ! 3674: * THE FORMAT OF THE TRBLK IS AS FOLLOWS. ! 3675: * ! 3676: * TRTYP IS SET TO TRTIN ! 3677: * TRKVR IS A POINTER TO THE VRBLK FOR THE KEYWORD ! 3678: * TRTAG IS THE TRACE TAG (0 IF NONE) ! 3679: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE) ! 3680: * ! 3681: * INPUT/OUTPUT FILE ARG1 TRAP BLOCK ! 3682: * ! 3683: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK ! 3684: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE OF ! 3685: * A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS ! 3686: * CONTAIN =B$VRA AND =B$VRV. THIS TRAP BLOCK IS USED ! 3687: * TO HOLD A POINTER TO THE FCBLK WHICH AN ! 3688: * IMPLEMENTATION MAY REQUEST TO HOLD INFORMATION ! 3689: * ABOUT A FILE. ! 3690: * ! 3691: * TRTYP IS SET TO TRTFC ! 3692: * TRNEXT POINTS TO NEXT TRBLK OR TRVAL IS VARIABLE VAL ! 3693: * TRFNM IS 0 ! 3694: * TRFPT IS THE FCBLK POINTER. ! 3695: * ! 3696: * NOTE THAT WHEN MULTIPLE TRAPS ARE SET ON A VARIABLE ! 3697: * THE ORDER IS IN ASCENDING VALUE OF TRTYP FIELD. ! 3698: * ! 3699: * INPUT ASSOCIATION (IF PRESENT) ! 3700: * ACCESS TRACE (IF PRESENT) ! 3701: * VALUE TRACE (IF PRESENT) ! 3702: * OUTPUT ASSOCIATION (IF PRESENT) ! 3703: * ! 3704: * THE ACTUAL VALUE OF THE VARIABLE IS STORED IN THE TRVAL ! 3705: * FIELD OF THE LAST TRBLK ON THE CHAIN. ! 3706: * ! 3707: * THIS IMPLEMENTATION DOES NOT PERMIT TRACE OR I/O ! 3708: * ASSOCIATIONS TO ANY OF THE PSEUDO-VARIABLES. ! 3709: EJC ! 3710: * ! 3711: * VECTOR BLOCK (VCBLK) ! 3712: * ! 3713: * A VCBLK IS USED TO REPRESENT AN ARRAY VALUE WHICH HAS ! 3714: * ONE DIMENSION WHOSE LOWER BOUND IS ONE. ALL OTHER ARRAYS ! 3715: * ARE REPRESENTED BY ARBLKS. A VCBLK IS CREATED BY THE ! 3716: * SYSTEM FUNCTION ARRAY (S$ARR) WHEN PASSED AN INTEGER ARG. ! 3717: * ! 3718: * +------------------------------------+ ! 3719: * I VCTYP I ! 3720: * +------------------------------------+ ! 3721: * I IDVAL I ! 3722: * +------------------------------------+ ! 3723: * I VCLEN I ! 3724: * +------------------------------------+ ! 3725: * I VCVLS I ! 3726: * +------------------------------------+ ! 3727: * ! 3728: VCTYP EQU 0 POINTER TO DUMMY ROUTINE B$VCT ! 3729: VCLEN EQU OFFS2 LENGTH OF VCBLK IN BYTES ! 3730: VCVLS EQU OFFS3 START OF VECTOR VALUES ! 3731: VCSI$ EQU VCVLS SIZE OF STANDARD FIELDS IN VCBLK ! 3732: VCVLB EQU VCVLS-1 OFFSET ONE WORD BEHIND VCVLS ! 3733: VCTBD EQU TBSI$-VCSI$ DIFFERENCE IN SIZES - SEE PRTVL ! 3734: * ! 3735: * VCVLS ARE EITHER DATA POINTERS OR TRBLK POINTERS ! 3736: * ! 3737: * THE DIMENSION CAN BE DEDUCED FROM VCLEN. ! 3738: EJC ! 3739: * ! 3740: * VARIABLE BLOCK (VRBLK) ! 3741: * ! 3742: * A VARIABLE BLOCK IS BUILT IN THE STATIC MEMORY AREA ! 3743: * FOR EVERY VARIABLE REFERENCED OR CREATED BY A PROGRAM. ! 3744: * ! 3745: * NOTE THAT SINCE THESE BLOCKS ONLY OCCUR IN THE STATIC ! 3746: * REGION, IT IS PERMISSIBLE TO POINT TO ANY WORD IN ! 3747: * THE BLOCK AND THIS IS USED TO PROVIDE THREE DISTINCT ! 3748: * ACCESS POINTS FROM THE GENERATED CODE AS FOLLOWS. ! 3749: * ! 3750: * 1) POINT TO VRGET (FIRST WORD OF VRBLK) TO LOAD THE ! 3751: * VALUE OF THE VARIABLE ONTO THE MAIN STACK. ! 3752: * ! 3753: * 2) POINT TO VRSTO (SECOND WORD OF VRBLK) TO STORE THE ! 3754: * TOP STACK ELEMENT AS THE VALUE OF THE VARIABLE. ! 3755: * ! 3756: * 3) POINT TO VRTRA (FOURTH WORD OF VRBLK) TO JUMP TO ! 3757: * THE LABEL ASSOCIATED WITH THE VARIABLE NAME. ! 3758: * ! 3759: * +------------------------------------+ ! 3760: * I VRGET I ! 3761: * +------------------------------------+ ! 3762: * I VRSTO I ! 3763: * +------------------------------------+ ! 3764: * I VRVAL I ! 3765: * +------------------------------------+ ! 3766: * I VRTRA I ! 3767: * +------------------------------------+ ! 3768: * I VRLBL I ! 3769: * +------------------------------------+ ! 3770: * I VRFNC I ! 3771: * +------------------------------------+ ! 3772: * I VRNXT I ! 3773: * +------------------------------------+ ! 3774: * I VRLEN I ! 3775: * +------------------------------------+ ! 3776: * / / ! 3777: * / VRCHS = VRSVP / ! 3778: * / / ! 3779: * +------------------------------------+ ! 3780: EJC ! 3781: * ! 3782: * VARIABLE BLOCK (CONTINUED) ! 3783: * ! 3784: VRGET EQU 0 POINTER TO ROUTINE TO LOAD VALUE ! 3785: VRSTO EQU VRGET+1 POINTER TO ROUTINE TO STORE VALUE ! 3786: VRVAL EQU VRSTO+1 VARIABLE VALUE ! 3787: VRVLO EQU VRVAL-VRSTO OFFSET TO VALUE FROM STORE FIELD ! 3788: VRTRA EQU VRVAL+1 POINTER TO ROUTINE TO JUMP TO LABEL ! 3789: VRLBL EQU VRTRA+1 POINTER TO CODE FOR LABEL ! 3790: VRLBO EQU VRLBL-VRTRA OFFSET TO LABEL FROM TRANSFER FIELD ! 3791: VRFNC EQU VRLBL+1 POINTER TO FUNCTION BLOCK ! 3792: VRNXT EQU VRFNC+1 POINTER TO NEXT VRBLK ON HASH CHAIN ! 3793: VRLEN EQU VRNXT+1 LENGTH OF NAME (OR ZERO) ! 3794: VRCHS EQU VRLEN+1 CHARACTERS OF NAME (VRLEN GT 0) ! 3795: VRSVP EQU VRLEN+1 PTR TO SVBLK (VRLEN EQ 0) ! 3796: VRSI$ EQU VRCHS+1 NUMBER OF STANDARD FIELDS IN VRBLK ! 3797: VRSOF EQU VRLEN-SCLEN OFFSET TO DUMMY SCBLK FOR NAME ! 3798: VRSVO EQU VRSVP-VRSOF PSEUDO-OFFSET TO VRSVP FIELD ! 3799: * ! 3800: * VRGET = B$VRL IF NOT INPUT ASSOCIATED OR ACCESS TRACED ! 3801: * VRGET = B$VRA IF INPUT ASSOCIATED OR ACCESS TRACED ! 3802: * ! 3803: * VRSTO = B$VRS IF NOT OUTPUT ASSOCIATED OR VALUE TRACED ! 3804: * VRSTO = B$VRV IF OUTPUT ASSOCIATED OR VALUE TRACED ! 3805: * VRSTO = B$VRE IF VALUE IS PROTECTED PATTERN VALUE ! 3806: * ! 3807: * VRVAL POINTS TO THE APPROPRIATE VALUE UNLESS THE ! 3808: * VARIABLE IS I/O/TRACE ASSOCIATED IN WHICH CASE, VRVAL ! 3809: * POINTS TO AN APPROPRIATE TRBLK (TRAP BLOCK) CHAIN. ! 3810: * ! 3811: * VRTRA = B$VRG IF THE LABEL IS NOT TRACED ! 3812: * VRTRA = B$VRT IF THE LABEL IS TRACED ! 3813: * ! 3814: * VRLBL POINTS TO A CDBLK IF THERE IS A LABEL ! 3815: * VRLBL POINTS TO THE SVBLK SVLBL FIELD FOR A SYSTEM LABEL ! 3816: * VRLBL POINTS TO STNDL FOR AN UNDEFINED LABEL ! 3817: * VRLBL POINTS TO A TRBLK IF THE LABEL IS TRACED ! 3818: * ! 3819: * VRFNC POINTS TO A FFBLK FOR A FIELD FUNCTION ! 3820: * VRFNC POINTS TO A DFBLK FOR A DATATYPE FUNCTION ! 3821: * VRFNC POINTS TO A PFBLK FOR A PROGRAM DEFINED FUNCTION ! 3822: * VRFNC POINTS TO A EFBLK FOR AN EXTERNAL LOADED FUNCTION ! 3823: * VRFNC POINTS TO SVFNC (SVBLK) FOR A SYSTEM FUNCTION ! 3824: * VRFNC POINTS TO STNDF IF THE FUNCTION IS UNDEFINED ! 3825: * ! 3826: * VRNXT POINTS TO THE NEXT VRBLK ON THIS CHAIN UNLESS ! 3827: * THIS IS THE END OF THE CHAIN IN WHICH CASE IT IS ZERO. ! 3828: * ! 3829: * VRLEN IS THE NAME LENGTH FOR A NON-SYSTEM VARIABLE. ! 3830: * VRLEN IS ZERO FOR A SYSTEM VARIABLE. ! 3831: * ! 3832: * VRCHS IS THE NAME (LJRZ) IF VRLEN IS NON-ZERO. ! 3833: * VRSVP IS A PTR TO THE SVBLK IF VRLEN IS ZERO. ! 3834: EJC ! 3835: * ! 3836: * FORMAT OF A NON-RELOCATABLE EXTERNAL BLOCK (XNBLK) ! 3837: * ! 3838: * AN XNBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL) ! 3839: * DATA VALUE. THE BLOCK CONTAINS NO POINTERS TO OTHER ! 3840: * RELOCATABLE BLOCKS. AN XNBLK IS USED BY EXTERNAL FUNCTION ! 3841: * PROCESSING OR POSSIBLY FOR SYSTEM I/O ROUTINES ETC. ! 3842: * THE MACRO-SYSTEM ITSELF DOES NOT USE XNBLKS. ! 3843: * THIS TYPE OF BLOCK MAY BE USED AS A FILE CONTROL BLOCK. ! 3844: * SEE SYSFC,SYSIN,SYSOU,S$INP,S$OUP FOR DETAILS. ! 3845: * ! 3846: * +------------------------------------+ ! 3847: * I XNTYP I ! 3848: * +------------------------------------+ ! 3849: * I XNLEN I ! 3850: * +------------------------------------+ ! 3851: * / / ! 3852: * / XNDTA / ! 3853: * / / ! 3854: * +------------------------------------+ ! 3855: * ! 3856: XNTYP EQU 0 POINTER TO DUMMY ROUTINE B$XNT ! 3857: XNLEN EQU XNTYP+1 LENGTH OF XNBLK IN BYTES ! 3858: XNDTA EQU XNLEN+1 DATA WORDS ! 3859: XNSI$ EQU XNDTA SIZE OF STANDARD FIELDS IN XNBLK ! 3860: * ! 3861: * NOTE THAT THE TERM NON-RELOCATABLE REFERS TO THE CONTENTS ! 3862: * AND NOT THE BLOCK ITSELF. AN XNBLK CAN BE MOVED AROUND IF ! 3863: * IT IS BUILT IN THE DYNAMIC MEMORY AREA. ! 3864: EJC ! 3865: * ! 3866: * RELOCATABLE EXTERNAL BLOCK (XRBLK) ! 3867: * ! 3868: * AN XRBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL) ! 3869: * DATA VALUE. THE DATA AREA IN THIS BLOCK CONSISTS ONLY ! 3870: * OF ADDRESS VALUES AND ANY ADDRESSES POINTING INTO THE ! 3871: * DYNAMIC MEMORY AREA MUST POINT TO THE START OF OTHER ! 3872: * DATA BLOCKS. SEE ALSO DESCRIPTION OF XNBLK. ! 3873: * THIS TYPE OF BLOCK MAY BE USED AS A FILE CONTROL BLOCK. ! 3874: * SEE SYSFC,SYSIN,SYSOU,S$INP,S$OUP FOR DETAILS. ! 3875: * ! 3876: * +------------------------------------+ ! 3877: * I XRTYP I ! 3878: * +------------------------------------+ ! 3879: * I XRLEN I ! 3880: * +------------------------------------+ ! 3881: * / / ! 3882: * / XRPTR / ! 3883: * / / ! 3884: * +------------------------------------+ ! 3885: * ! 3886: XRTYP EQU 0 POINTER TO DUMMY ROUTINE B$XRT ! 3887: XRLEN EQU XRTYP+1 LENGTH OF XRBLK IN BYTES ! 3888: XRPTR EQU XRLEN+1 START OF ADDRESS POINTERS ! 3889: XRSI$ EQU XRPTR SIZE OF STANDARD FIELDS IN XRBLK ! 3890: EJC ! 3891: * ! 3892: * S$CNV (CONVERT) FUNCTION SWITCH CONSTANTS. THE VALUES ! 3893: * ARE TIED TO THE ORDER OF THE ENTRIES IN THE SVCTB TABLE ! 3894: * AND HENCE TO THE BRANCH TABLE IN S$CNV. ! 3895: * ! 3896: CNVST EQU 8 MAX STANDARD TYPE CODE FOR CONVERT ! 3897: .IF .CNRA ! 3898: CNVRT EQU CNVST NO REALS - SAME AS STANDARD TYPES ! 3899: .ELSE ! 3900: CNVRT EQU CNVST+1 CONVERT CODE FOR REALS ! 3901: .FI ! 3902: .IF .CNBF ! 3903: CNVBT EQU CNVRT NO BUFFERS - SAME AS REAL CODE ! 3904: .ELSE ! 3905: CNVBT EQU CNVRT+1 CONVERT CODE FOR BUFFER ! 3906: .FI ! 3907: CNVTT EQU CNVBT+1 BSW CODE FOR CONVERT ! 3908: * ! 3909: * INPUT IMAGE LENGTH ! 3910: * ! 3911: INILN EQU 132 DEFAULT IMAGE LENGTH FOR COMPILER ! 3912: INILS EQU 80 IMAGE LENGTH IF -SEQU IN EFFECT ! 3913: * ! 3914: IONMB EQU 2 NAME BASE USED FOR IOCHN IN SYSIO ! 3915: IONMO EQU 4 NAME OFFSET USED FOR IOCHN IN SYSIO ! 3916: * ! 3917: * IN GENERAL, MEANINGFUL MNEMONICS SHOULD BE USED FOR ! 3918: * OFFSETS. HOWEVER FOR SMALL INTEGERS USED OFTEN IN ! 3919: * LITERALS THE FOLLOWING GENERAL DEFINITIONS ARE PROVIDED. ! 3920: * ! 3921: NUM01 EQU 1 ! 3922: NUM02 EQU 2 ! 3923: NUM03 EQU 3 ! 3924: NUM04 EQU 4 ! 3925: NUM05 EQU 5 ! 3926: NUM06 EQU 6 ! 3927: NUM07 EQU 7 ! 3928: NUM08 EQU 8 ! 3929: NUM09 EQU 9 ! 3930: NUM10 EQU 10 ! 3931: NINI8 EQU 998 ! 3932: NINI9 EQU 999 ! 3933: THSND EQU 1000 ! 3934: EJC ! 3935: * ! 3936: * NUMBERS OF UNDEFINED SPITBOL OPERATORS ! 3937: * ! 3938: OPBUN EQU 5 NO. OF BINARY UNDEFINED OPS ! 3939: OPUUN EQU 6 NO OF UNARY UNDEFINED OPS ! 3940: * ! 3941: * OFFSETS USED IN PRTSN, PRTMI AND ACESS ! 3942: * ! 3943: PRSNF EQU 13 OFFSET USED IN PRTSN ! 3944: PRTMF EQU 15 OFFSET TO COL 15 (PRTMI) ! 3945: RILEN EQU 120 BUFFER LENGTH FOR SYSRI ! 3946: * ! 3947: * CODES FOR STAGES OF PROCESSING ! 3948: * ! 3949: STGIC EQU 0 INITIAL COMPILE ! 3950: STGXC EQU STGIC+1 EXECUTION COMPILE (CODE) ! 3951: STGEV EQU STGXC+1 EXPRESSION EVAL DURING EXECUTION ! 3952: STGXT EQU STGEV+1 EXECUTION TIME ! 3953: STGCE EQU STGXT+1 INITIAL COMPILE AFTER END LINE ! 3954: STGXE EQU STGCE+1 EXEC. COMPILE AFTER END LINE ! 3955: STGND EQU STGCE-STGIC DIFFERENCE IN STAGE AFTER END ! 3956: STGEE EQU STGXE+1 EVAL EVALUATING EXPRESSION ! 3957: STGNO EQU STGEE+1 NUMBER OF CODES ! 3958: EJC ! 3959: * ! 3960: * ! 3961: * STATEMENT NUMBER PAD COUNT FOR LISTR ! 3962: * ! 3963: .DEF .CSN5 ! 3964: .IF .CSN6 ! 3965: STNPD EQU 6 STATEMENT NO. PAD COUNT ! 3966: .UNDEF .CSN5 ! 3967: .FI ! 3968: .IF .CSN8 ! 3969: STNPD EQU 8 STATEMENT NO. PAD COUNT ! 3970: .UNDEF .CSN5 ! 3971: .FI ! 3972: .IF .CSN5 ! 3973: STNPD EQU 5 STATEMENT NO. PAD COUNT ! 3974: .FI ! 3975: * ! 3976: * SYNTAX TYPE CODES ! 3977: * ! 3978: * THESE CODES ARE RETURNED FROM THE SCANE PROCEDURE. ! 3979: * ! 3980: * THEY ARE SPACED 3 APART FOR THE BENEFIT OF EXPAN. ! 3981: * ! 3982: T$UOP EQU 0 UNARY OPERATOR ! 3983: T$LPR EQU T$UOP+3 LEFT PAREN ! 3984: T$LBR EQU T$LPR+3 LEFT BRACKET ! 3985: T$CMA EQU T$LBR+3 COMMA ! 3986: T$FNC EQU T$CMA+3 FUNCTION CALL ! 3987: T$VAR EQU T$FNC+3 VARIABLE ! 3988: T$CON EQU T$VAR+3 CONSTANT ! 3989: T$BOP EQU T$CON+3 BINARY OPERATOR ! 3990: T$RPR EQU T$BOP+3 RIGHT PAREN ! 3991: T$RBR EQU T$RPR+3 RIGHT BRACKET ! 3992: T$COL EQU T$RBR+3 COLON ! 3993: T$SMC EQU T$COL+3 SEMI-COLON ! 3994: * ! 3995: * THE FOLLOWING DEFINITIONS ARE USED ONLY IN THE GOTO FIELD ! 3996: * ! 3997: T$FGO EQU T$SMC+1 FAILURE GOTO ! 3998: T$SGO EQU T$FGO+1 SUCCESS GOTO ! 3999: * ! 4000: * THE ABOVE CODES ARE GROUPED SO THAT CODES FOR ELEMENTS ! 4001: * WHICH CAN LEGITIMATELY IMMEDIATELY PRECEDE A UNARY ! 4002: * OPERATOR COME FIRST TO FACILITATE OPERATOR SYNTAX CHECK. ! 4003: * ! 4004: T$UOK EQU T$FNC LAST CODE OK BEFORE UNARY OPERATOR ! 4005: EJC ! 4006: * ! 4007: * DEFINITIONS OF VALUES FOR EXPAN JUMP TABLE ! 4008: * ! 4009: T$UO0 EQU T$UOP+0 UNARY OPERATOR, STATE ZERO ! 4010: T$UO1 EQU T$UOP+1 UNARY OPERATOR, STATE ONE ! 4011: T$UO2 EQU T$UOP+2 UNARY OPERATOR, STATE TWO ! 4012: T$LP0 EQU T$LPR+0 LEFT PAREN, STATE ZERO ! 4013: T$LP1 EQU T$LPR+1 LEFT PAREN, STATE ONE ! 4014: T$LP2 EQU T$LPR+2 LEFT PAREN, STATE TWO ! 4015: T$LB0 EQU T$LBR+0 LEFT BRACKET, STATE ZERO ! 4016: T$LB1 EQU T$LBR+1 LEFT BRACKET, STATE ONE ! 4017: T$LB2 EQU T$LBR+2 LEFT BRACKET, STATE TWO ! 4018: T$CM0 EQU T$CMA+0 COMMA, STATE ZERO ! 4019: T$CM1 EQU T$CMA+1 COMMA, STATE ONE ! 4020: T$CM2 EQU T$CMA+2 COMMA, STATE TWO ! 4021: T$FN0 EQU T$FNC+0 FUNCTION CALL, STATE ZERO ! 4022: T$FN1 EQU T$FNC+1 FUNCTION CALL, STATE ONE ! 4023: T$FN2 EQU T$FNC+2 FUNCTION CALL, STATE TWO ! 4024: T$VA0 EQU T$VAR+0 VARIABLE, STATE ZERO ! 4025: T$VA1 EQU T$VAR+1 VARIABLE, STATE ONE ! 4026: T$VA2 EQU T$VAR+2 VARIABLE, STATE TWO ! 4027: T$CO0 EQU T$CON+0 CONSTANT, STATE ZERO ! 4028: T$CO1 EQU T$CON+1 CONSTANT, STATE ONE ! 4029: T$CO2 EQU T$CON+2 CONSTANT, STATE TWO ! 4030: T$BO0 EQU T$BOP+0 BINARY OPERATOR, STATE ZERO ! 4031: T$BO1 EQU T$BOP+1 BINARY OPERATOR, STATE ONE ! 4032: T$BO2 EQU T$BOP+2 BINARY OPERATOR, STATE TWO ! 4033: T$RP0 EQU T$RPR+0 RIGHT PAREN, STATE ZERO ! 4034: T$RP1 EQU T$RPR+1 RIGHT PAREN, STATE ONE ! 4035: T$RP2 EQU T$RPR+2 RIGHT PAREN, STATE TWO ! 4036: T$RB0 EQU T$RBR+0 RIGHT BRACKET, STATE ZERO ! 4037: T$RB1 EQU T$RBR+1 RIGHT BRACKET, STATE ONE ! 4038: T$RB2 EQU T$RBR+2 RIGHT BRACKET, STATE TWO ! 4039: T$CL0 EQU T$COL+0 COLON, STATE ZERO ! 4040: T$CL1 EQU T$COL+1 COLON, STATE ONE ! 4041: T$CL2 EQU T$COL+2 COLON, STATE TWO ! 4042: T$SM0 EQU T$SMC+0 SEMICOLON, STATE ZERO ! 4043: T$SM1 EQU T$SMC+1 SEMICOLON, STATE ONE ! 4044: T$SM2 EQU T$SMC+2 SEMICOLON, STATE TWO ! 4045: * ! 4046: T$NES EQU T$SM2+1 NUMBER OF ENTRIES IN BRANCH TABLE ! 4047: EJC ! 4048: * ! 4049: * DEFINITION OF OFFSETS USED IN CONTROL CARD PROCESSING ! 4050: * ! 4051: .IF .CULC ! 4052: CC$CA EQU 0 -CASE ! 4053: CC$DO EQU CC$CA+1 -DOUBLE ! 4054: .ELSE ! 4055: CC$DO EQU 0 -DOUBLE ! 4056: .FI ! 4057: CC$DU EQU CC$DO+1 -DUMP ! 4058: CC$EJ EQU CC$DU+1 -EJECT ! 4059: CC$ER EQU CC$EJ+1 -ERRORS ! 4060: CC$EX EQU CC$ER+1 -EXECUTE ! 4061: CC$FA EQU CC$EX+1 -FAIL ! 4062: CC$LI EQU CC$FA+1 -LIST ! 4063: CC$NR EQU CC$LI+1 -NOERRORS ! 4064: CC$NX EQU CC$NR+1 -NOEXECUTE ! 4065: CC$NF EQU CC$NX+1 -NOFAIL ! 4066: CC$NL EQU CC$NF+1 -NOLIST ! 4067: CC$NO EQU CC$NL+1 -NOOPT ! 4068: CC$NP EQU CC$NO+1 -NOPRINT ! 4069: CC$OP EQU CC$NP+1 -OPTIMISE ! 4070: CC$PR EQU CC$OP+1 -PRINT ! 4071: CC$SI EQU CC$PR+1 -SINGLE ! 4072: CC$SP EQU CC$SI+1 -SPACE ! 4073: CC$ST EQU CC$SP+1 -STITL ! 4074: CC$TI EQU CC$ST+1 -TITLE ! 4075: CC$TR EQU CC$TI+1 -TRACE ! 4076: CC$NC EQU CC$TR+1 NUMBER OF CONTROL CARDS ! 4077: CCNOC EQU 4 NO. OF CHARS INCLUDED IN MATCH ! 4078: CCOFS EQU 7 OFFSET TO START OF TITLE/SUBTITLE ! 4079: EJC ! 4080: * ! 4081: * DEFINITIONS OF STACK OFFSETS USED IN CMPIL PROCEDURE ! 4082: * ! 4083: * SEE DESCRIPTION AT START OF CMPIL PROCEDURE FOR DETAILS ! 4084: * OF USE OF THESE LOCATIONS ON THE STACK. ! 4085: * ! 4086: CMSTM EQU 0 TREE FOR STATEMENT BODY ! 4087: CMSGO EQU CMSTM+1 TREE FOR SUCCESS GOTO ! 4088: CMFGO EQU CMSGO+1 TREE FOR FAIL GOTO ! 4089: CMCGO EQU CMFGO+1 CONDITIONAL GOTO FLAG ! 4090: CMPCD EQU CMCGO+1 PREVIOUS CDBLK POINTER ! 4091: CMFFP EQU CMPCD+1 FAILURE FILL IN FLAG FOR PREVIOUS ! 4092: CMFFC EQU CMFFP+1 FAILURE FILL IN FLAG FOR CURRENT ! 4093: CMSOP EQU CMFFC+1 SUCCESS FILL IN OFFSET FOR PREVIOUS ! 4094: CMSOC EQU CMSOP+1 SUCCESS FILL IN OFFSET FOR CURRENT ! 4095: CMLBL EQU CMSOC+1 PTR TO VRBLK FOR CURRENT LABEL ! 4096: CMTRA EQU CMLBL+1 PTR TO ENTRY CDBLK ! 4097: * ! 4098: CMNEN EQU CMTRA+1 COUNT OF STACK ENTRIES FOR CMPIL ! 4099: .IF .CNPF ! 4100: .ELSE ! 4101: * ! 4102: * A FEW CONSTANTS USED BY THE PROFILER ! 4103: PFPD1 EQU 8 PAD POSITIONS ... ! 4104: PFPD2 EQU 20 ... FOR PROFILE ... ! 4105: PFPD3 EQU 32 ... PRINTOUT ! 4106: PF$I2 EQU CFP$I+CFP$I SIZE OF TABLE ENTRY (2 INTS) ! 4107: .FI ! 4108: * ! 4109: TTL S P I T B O L -- CONSTANT SECTION ! 4110: * ! 4111: * THIS SECTION CONSISTS ENTIRELY OF ASSEMBLED CONSTANTS. ! 4112: * ! 4113: * ALL LABEL NAMES ARE FIVE LETTERS. THE ORDER IS ! 4114: * APPROXIMATELY ALPHABETICAL, BUT IN SOME CASES (ALWAYS ! 4115: * DOCUMENTED), CONSTANTS MUST BE PLACED IN SOME SPECIAL ! 4116: * ORDER WHICH MUST NOT BE DISTURBED. ! 4117: * ! 4118: * IT MUST ALSO BE REMEMBERED THAT THERE IS A REQUIREMENT ! 4119: * FOR NO FORWARD REFERENCES WHICH ALSO DISTURBS THE ! 4120: * ALPHABETICAL ORDER IN SOME CASES. ! 4121: * ! 4122: SEC START OF CONSTANT SECTION ! 4123: * ! 4124: * FREE STORE PERCENTAGE (USED BY ALLOC) ! 4125: * ! 4126: ALFSP DAC E$FSP FREE STORE PERCENTAGE ! 4127: * ! 4128: * BIT CONSTANTS FOR GENERAL USE ! 4129: * ! 4130: BITS0 DBC 0 ALL ZERO BITS ! 4131: BITS1 DBC 1 ONE BIT IN LOW ORDER POSITION ! 4132: BITS2 DBC 2 BIT IN POSITION 2 ! 4133: BITS3 DBC 4 BIT IN POSITION 3 ! 4134: BITS4 DBC 8 BIT IN POSITION 4 ! 4135: BITS5 DBC 16 BIT IN POSITION 5 ! 4136: BITS6 DBC 32 BIT IN POSITION 6 ! 4137: BITS7 DBC 64 BIT IN POSITION 7 ! 4138: BITS8 DBC 128 BIT IN POSITION 8 ! 4139: BITS9 DBC 256 BIT IN POSITION 9 ! 4140: BIT10 DBC 512 BIT IN POSITION 10 ! 4141: BITSM DBC CFP$M MASK FOR MAX INTEGER ! 4142: * ! 4143: * BIT CONSTANTS FOR SVBLK (SVBIT FIELD) TESTS ! 4144: * ! 4145: BTFNC DBC SVFNC BIT TO TEST FOR FUNCTION ! 4146: BTKNM DBC SVKNM BIT TO TEST FOR KEYWORD NUMBER ! 4147: BTLBL DBC SVLBL BIT TO TEST FOR LABEL ! 4148: BTFFC DBC SVFFC BIT TO TEST FOR FAST CALL ! 4149: BTCKW DBC SVCKW BIT TO TEST FOR CONSTANT KEYWORD ! 4150: BTPRD DBC SVPRD BIT TO TEST FOR PREDICATE FUNCTION ! 4151: BTPRE DBC SVPRE BIT TO TEST FOR PREEVALUATION ! 4152: BTVAL DBC SVVAL BIT TO TEST FOR VALUE ! 4153: EJC ! 4154: * ! 4155: * LIST OF NAMES USED FOR CONTROL CARD PROCESSING ! 4156: * ! 4157: .IF .CULC ! 4158: CCNMS DTC /CASE/ ! 4159: DTC /DOUB/ ! 4160: .ELSE ! 4161: CCNMS DTC /DOUB/ ! 4162: .FI ! 4163: DTC /DUMP/ ! 4164: DTC /EJEC/ ! 4165: DTC /ERRO/ ! 4166: DTC /EXEC/ ! 4167: DTC /FAIL/ ! 4168: DTC /LIST/ ! 4169: DTC /NOER/ ! 4170: DTC /NOEX/ ! 4171: DTC /NOFA/ ! 4172: DTC /NOLI/ ! 4173: DTC /NOOP/ ! 4174: DTC /NOPR/ ! 4175: DTC /OPTI/ ! 4176: DTC /PRIN/ ! 4177: DTC /SING/ ! 4178: DTC /SPAC/ ! 4179: DTC /STIT/ ! 4180: DTC /TITL/ ! 4181: DTC /TRAC/ ! 4182: * ! 4183: * HEADER MESSAGES FOR DUMPR PROCEDURE (SCBLK FORMAT) ! 4184: * ! 4185: DMHDK DAC B$SCL DUMP OF KEYWORD VALUES ! 4186: DAC 22 ! 4187: DTC /DUMP OF KEYWORD VALUES/ ! 4188: * ! 4189: DMHDV DAC B$SCL DUMP OF NATURAL VARIABLES ! 4190: DAC 25 ! 4191: DTC /DUMP OF NATURAL VARIABLES/ ! 4192: EJC ! 4193: * ! 4194: * MESSAGE TEXT FOR COMPILATION STATISTICS ! 4195: * ! 4196: ENCM1 DAC B$SCL ! 4197: DAC 10 ! 4198: DTC /STORE USED/ ! 4199: * ! 4200: ENCM2 DAC B$SCL ! 4201: DAC 10 ! 4202: DTC /STORE LEFT/ ! 4203: * ! 4204: ENCM3 DAC B$SCL ! 4205: DAC 11 ! 4206: DTC /COMP ERRORS/ ! 4207: * ! 4208: ENCM4 DAC B$SCL ! 4209: DAC 14 ! 4210: DTC /COMP TIME-MSEC/ ! 4211: * ! 4212: ENCM5 DAC B$SCL EXECUTION SUPPRESSED ! 4213: DAC 20 ! 4214: DTC /EXECUTION SUPPRESSED/ ! 4215: * ! 4216: * STRING CONSTANT FOR ABNORMAL END ! 4217: * ! 4218: ENDAB DAC B$SCL ! 4219: DAC 12 ! 4220: DTC /ABNORMAL END/ ! 4221: EJC ! 4222: * ! 4223: * MEMORY OVERFLOW DURING INITIALISATION ! 4224: * ! 4225: ENDMO DAC B$SCL ! 4226: ENDML DAC 15 ! 4227: DTC /MEMORY OVERFLOW/ ! 4228: * ! 4229: * STRING CONSTANT FOR MESSAGE ISSUED BY L$END ! 4230: * ! 4231: ENDMS DAC B$SCL ! 4232: DAC 10 ! 4233: DTC /NORMAL END/ ! 4234: * ! 4235: * FAIL MESSAGE FOR STACK FAIL SECTION ! 4236: * ! 4237: ENDSO DAC B$SCL STACK OVERFLOW IN GARBAGE COLLECTOR ! 4238: DAC 36 ! 4239: DTC /STACK OVERFLOW IN GARBAGE COLLECTION/ ! 4240: * ! 4241: * STRING CONSTANT FOR TIME UP ! 4242: * ! 4243: ENDTU DAC B$SCL ! 4244: DAC 15 ! 4245: DTC /ERROR - TIME UP/ ! 4246: EJC ! 4247: * ! 4248: * STRING CONSTANT FOR ERROR MESSAGE (ERROR SECTION) ! 4249: * ! 4250: ERMMS DAC B$SCL ERROR ! 4251: DAC 5 ! 4252: DTC /ERROR/ ! 4253: * ! 4254: ERMNS DAC B$SCL STRING / -- / ! 4255: DAC 4 ! 4256: DTC / -- / ! 4257: * ! 4258: * STRING CONSTANT FOR PAGE NUMBERING ! 4259: * ! 4260: LSTMS DAC B$SCL PAGE ! 4261: DAC 5 ! 4262: DTC /PAGE / ! 4263: * ! 4264: * LISTING HEADER MESSAGE ! 4265: * ! 4266: HEADR DAC B$SCL ! 4267: DAC 25 ! 4268: DTC /MACRO SPITBOL VERSION 3.5/ ! 4269: * ! 4270: HEADV DAC B$SCL FOR EXIT() VERSION NO. CHECK ! 4271: DAC 3 ! 4272: DTC /3.5/ ! 4273: * ! 4274: * INTEGER CONSTANTS FOR GENERAL USE ! 4275: * ICBLD OPTIMISATION USES THE FIRST THREE. ! 4276: * ! 4277: INT$R DAC B$ICL ! 4278: INTV0 DIC +0 0 ! 4279: INTON DAC B$ICL ! 4280: INTV1 DIC +1 1 ! 4281: INTTW DAC B$ICL ! 4282: INTV2 DIC +2 2 ! 4283: INTVT DIC +10 10 ! 4284: INTVH DIC +100 100 ! 4285: INTTH DIC +1000 1000 ! 4286: * ! 4287: * TABLE USED IN ICBLD OPTIMISATION ! 4288: * ! 4289: INTAB DAC INT$R POINTER TO 0 ! 4290: DAC INTON POINTER TO 1 ! 4291: DAC INTTW POINTER TO 2 ! 4292: EJC ! 4293: * ! 4294: * SPECIAL PATTERN NODES. THE FOLLOWING PATTERN NODES ! 4295: * CONSIST SIMPLY OF A PCODE POINTER, SEE MATCH ROUTINES ! 4296: * (P$XXX) FOR FULL DETAILS OF THEIR USE AND FORMAT). ! 4297: * ! 4298: NDABB DAC P$ABB ARBNO ! 4299: NDABD DAC P$ABD ARBNO ! 4300: NDARC DAC P$ARC ARB ! 4301: NDEXB DAC P$EXB EXPRESSION ! 4302: NDFNB DAC P$FNB FENCE() ! 4303: NDFND DAC P$FND FENCE() ! 4304: NDEXC DAC P$EXC EXPRESSION ! 4305: NDIMB DAC P$IMB IMMEDIATE ASSIGNMENT ! 4306: NDIMD DAC P$IMD IMMEDIATE ASSIGNMENT ! 4307: NDNTH DAC P$NTH PATTERN END (NULL PATTERN) ! 4308: NDPAB DAC P$PAB PATTERN ASSIGNMENT ! 4309: NDPAD DAC P$PAD PATTERN ASSIGNMENT ! 4310: NDUNA DAC P$UNA ANCHOR POINT MOVEMENT ! 4311: * ! 4312: * KEYWORD CONSTANT PATTERN NODES. THE FOLLOWING NODES ARE ! 4313: * USED AS THE VALUES OF PATTERN KEYWORDS AND THE INITIAL ! 4314: * VALUES OF THE CORRESPONDING NATURAL VARIABLES. ALL ! 4315: * NODES ARE IN P0BLK FORMAT AND THE ORDER IS TIED TO THE ! 4316: * DEFINITIONS OF CORRESPONDING K$XXX SYMBOLS. ! 4317: * ! 4318: NDABO DAC P$ABO ABORT ! 4319: DAC NDNTH ! 4320: NDARB DAC P$ARB ARB ! 4321: DAC NDNTH ! 4322: NDBAL DAC P$BAL BAL ! 4323: DAC NDNTH ! 4324: NDFAL DAC P$FAL FAIL ! 4325: DAC NDNTH ! 4326: NDFEN DAC P$FEN FENCE ! 4327: DAC NDNTH ! 4328: NDREM DAC P$REM REM ! 4329: DAC NDNTH ! 4330: NDSUC DAC P$SUC SUCCEED ! 4331: DAC NDNTH ! 4332: * ! 4333: * NULL STRING. ALL NULL VALUES POINT TO THIS STRING. THE ! 4334: * SVCHS FIELD CONTAINS A BLANK TO PROVIDE FOR EASY DEFAULT ! 4335: * PROCESSING IN TRACE, STOPTR, LPAD AND RPAD. ! 4336: * NULLW CONTAINS 10 BLANKS WHICH ENSURES AN ALL BLANK WORD ! 4337: * BUT FOR VERY EXCEPTIONAL MACHINES. ! 4338: * ! 4339: NULLS DAC B$SCL NULL STRING VALUE ! 4340: DAC 0 SCLEN = 0 ! 4341: NULLW DTC / / ! 4342: EJC ! 4343: * ! 4344: * OPERATOR DOPE VECTORS (SEE DVBLK FORMAT) ! 4345: * ! 4346: OPDVC DAC O$CNC CONCATENATION ! 4347: DAC C$CNC ! 4348: DAC LLCNC ! 4349: DAC RRCNC ! 4350: * ! 4351: * OPDVS IS USED WHEN SCANNING BELOW THE TOP LEVEL TO ! 4352: * INSURE THAT THE CONCATENATION WILL NOT BE LATER ! 4353: * MISTAKEN FOR PATTERN MATCHING ! 4354: * ! 4355: OPDVP DAC O$CNC CONCATENATION - NOT PATTERN MATCH ! 4356: DAC C$CNP ! 4357: DAC LLCNC ! 4358: DAC RRCNC ! 4359: * ! 4360: * NOTE THAT THE ORDER OF THE REMAINING ENTRIES IS TIED TO ! 4361: * THE ORDER OF THE CODING IN THE SCANE PROCEDURE. ! 4362: * ! 4363: OPDVS DAC O$ASS ASSIGNMENT ! 4364: DAC C$ASS ! 4365: DAC LLASS ! 4366: DAC RRASS ! 4367: * ! 4368: DAC 6 UNARY EQUAL ! 4369: DAC C$UUO ! 4370: DAC LLUNO ! 4371: * ! 4372: DAC O$PMV PATTERN MATCH ! 4373: DAC C$PMT ! 4374: DAC LLPMT ! 4375: DAC RRPMT ! 4376: * ! 4377: DAC O$INT INTERROGATION ! 4378: DAC C$UVL ! 4379: DAC LLUNO ! 4380: * ! 4381: DAC 1 BINARY AMPERSAND ! 4382: DAC C$UBO ! 4383: DAC LLAMP ! 4384: DAC RRAMP ! 4385: * ! 4386: DAC O$KWV KEYWORD REFERENCE ! 4387: DAC C$KEY ! 4388: DAC LLUNO ! 4389: * ! 4390: DAC O$ALT ALTERNATION ! 4391: DAC C$ALT ! 4392: DAC LLALT ! 4393: DAC RRALT ! 4394: EJC ! 4395: * ! 4396: * OPERATOR DOPE VECTORS (CONTINUED) ! 4397: * ! 4398: DAC 5 UNARY VERTICAL BAR ! 4399: DAC C$UUO ! 4400: DAC LLUNO ! 4401: * ! 4402: DAC 0 BINARY AT ! 4403: DAC C$UBO ! 4404: DAC LLATS ! 4405: DAC RRATS ! 4406: * ! 4407: DAC O$CAS CURSOR ASSIGNMENT ! 4408: DAC C$UNM ! 4409: DAC LLUNO ! 4410: * ! 4411: DAC 2 BINARY NUMBER SIGN ! 4412: DAC C$UBO ! 4413: DAC LLNUM ! 4414: DAC RRNUM ! 4415: * ! 4416: DAC 7 UNARY NUMBER SIGN ! 4417: DAC C$UUO ! 4418: DAC LLUNO ! 4419: * ! 4420: DAC O$DVD DIVISION ! 4421: DAC C$BVL ! 4422: DAC LLDVD ! 4423: DAC RRDVD ! 4424: * ! 4425: DAC 9 UNARY SLASH ! 4426: DAC C$UUO ! 4427: DAC LLUNO ! 4428: * ! 4429: DAC O$MLT MULTIPLICATION ! 4430: DAC C$BVL ! 4431: DAC LLMLT ! 4432: DAC RRMLT ! 4433: EJC ! 4434: * ! 4435: * OPERATOR DOPE VECTORS (CONTINUED) ! 4436: * ! 4437: DAC 0 DEFERRED EXPRESSION ! 4438: DAC C$DEF ! 4439: DAC LLUNO ! 4440: * ! 4441: DAC 3 BINARY PERCENT ! 4442: DAC C$UBO ! 4443: DAC LLPCT ! 4444: DAC RRPCT ! 4445: * ! 4446: DAC 8 UNARY PERCENT ! 4447: DAC C$UUO ! 4448: DAC LLUNO ! 4449: * ! 4450: DAC O$EXP EXPONENTIATION ! 4451: DAC C$BVL ! 4452: DAC LLEXP ! 4453: DAC RREXP ! 4454: * ! 4455: DAC 10 UNARY EXCLAMATION ! 4456: DAC C$UUO ! 4457: DAC LLUNO ! 4458: * ! 4459: DAC O$IMA IMMEDIATE ASSIGNMENT ! 4460: DAC C$BVN ! 4461: DAC LLDLD ! 4462: DAC RRDLD ! 4463: * ! 4464: DAC O$INV INDIRECTION ! 4465: DAC C$IND ! 4466: DAC LLUNO ! 4467: * ! 4468: DAC 4 BINARY NOT ! 4469: DAC C$UBO ! 4470: DAC LLNOT ! 4471: DAC RRNOT ! 4472: * ! 4473: DAC 0 NEGATION ! 4474: DAC C$NEG ! 4475: DAC LLUNO ! 4476: EJC ! 4477: * ! 4478: * OPERATOR DOPE VECTORS (CONTINUED) ! 4479: * ! 4480: DAC O$SUB SUBTRACTION ! 4481: DAC C$BVL ! 4482: DAC LLPLM ! 4483: DAC RRPLM ! 4484: * ! 4485: DAC O$COM COMPLEMENTATION ! 4486: DAC C$UVL ! 4487: DAC LLUNO ! 4488: * ! 4489: DAC O$ADD ADDITION ! 4490: DAC C$BVL ! 4491: DAC LLPLM ! 4492: DAC RRPLM ! 4493: * ! 4494: DAC O$AFF AFFIRMATION ! 4495: DAC C$UVL ! 4496: DAC LLUNO ! 4497: * ! 4498: DAC O$PAS PATTERN ASSIGNMENT ! 4499: DAC C$BVN ! 4500: DAC LLDLD ! 4501: DAC RRDLD ! 4502: * ! 4503: DAC O$NAM NAME REFERENCE ! 4504: DAC C$UNM ! 4505: DAC LLUNO ! 4506: * ! 4507: * SPECIAL DVS FOR GOTO OPERATORS (SEE PROCEDURE SCNGF) ! 4508: * ! 4509: OPDVD DAC O$GOD DIRECT GOTO ! 4510: DAC C$UVL ! 4511: DAC LLUNO ! 4512: * ! 4513: OPDVN DAC O$GOC COMPLEX NORMAL GOTO ! 4514: DAC C$UNM ! 4515: DAC LLUNO ! 4516: EJC ! 4517: * ! 4518: * OPERATOR ENTRY ADDRESS POINTERS, USED IN CODE ! 4519: * ! 4520: OAMN$ DAC O$AMN ARRAY REF (MULTI-SUBS BY VALUE) ! 4521: OAMV$ DAC O$AMV ARRAY REF (MULTI-SUBS BY VALUE) ! 4522: OAON$ DAC O$AON ARRAY REF (ONE SUB BY NAME) ! 4523: OAOV$ DAC O$AOV ARRAY REF (ONE SUB BY VALUE) ! 4524: OCER$ DAC O$CER COMPILATION ERROR ! 4525: OFEX$ DAC O$FEX FAILURE IN EXPRESSION EVALUATION ! 4526: OFIF$ DAC O$FIF FAILURE DURING GOTO EVALUATION ! 4527: OFNC$ DAC O$FNC FUNCTION CALL (MORE THAN ONE ARG) ! 4528: OFNE$ DAC O$FNE FUNCTION NAME ERROR ! 4529: OFNS$ DAC O$FNS FUNCTION CALL (SINGLE ARGUMENT) ! 4530: OGOF$ DAC O$GOF SET GOTO FAILURE TRAP ! 4531: OINN$ DAC O$INN INDIRECTION BY NAME ! 4532: OKWN$ DAC O$KWN KEYWORD REFERENCE BY NAME ! 4533: OLEX$ DAC O$LEX LOAD EXPRESSION BY NAME ! 4534: OLPT$ DAC O$LPT LOAD PATTERN ! 4535: OLVN$ DAC O$LVN LOAD VARIABLE NAME ! 4536: ONTA$ DAC O$NTA NEGATION, FIRST ENTRY ! 4537: ONTB$ DAC O$NTB NEGATION, SECOND ENTRY ! 4538: ONTC$ DAC O$NTC NEGATION, THIRD ENTRY ! 4539: OPMN$ DAC O$PMN PATTERN MATCH BY NAME ! 4540: OPMS$ DAC O$PMS PATTERN MATCH (STATEMENT) ! 4541: OPOP$ DAC O$POP POP TOP STACK ITEM ! 4542: ORNM$ DAC O$RNM RETURN NAME FROM EXPRESSION ! 4543: ORPL$ DAC O$RPL PATTERN REPLACEMENT ! 4544: ORVL$ DAC O$RVL RETURN VALUE FROM EXPRESSION ! 4545: OSLA$ DAC O$SLA SELECTION, FIRST ENTRY ! 4546: OSLB$ DAC O$SLB SELECTION, SECOND ENTRY ! 4547: OSLC$ DAC O$SLC SELECTION, THIRD ENTRY ! 4548: OSLD$ DAC O$SLD SELECTION, FOURTH ENTRY ! 4549: OSTP$ DAC O$STP STOP EXECUTION ! 4550: OUNF$ DAC O$UNF UNEXPECTED FAILURE ! 4551: EJC ! 4552: * ! 4553: * TABLE OF NAMES OF UNDEFINED BINARY OPERATORS FOR OPSYN ! 4554: * ! 4555: OPSNB DAC CH$AT AT ! 4556: DAC CH$AM AMPERSAND ! 4557: DAC CH$NM NUMBER ! 4558: DAC CH$PC PERCENT ! 4559: DAC CH$NT NOT ! 4560: * ! 4561: * TABLE OF NAMES OF UNDEFINED UNARY OPERATORS FOR OPSYN ! 4562: * ! 4563: OPNSU DAC CH$BR VERTICAL BAR ! 4564: DAC CH$EQ EQUAL ! 4565: DAC CH$NM NUMBER ! 4566: DAC CH$PC PERCENT ! 4567: DAC CH$SL SLASH ! 4568: DAC CH$EX EXCLAMATION ! 4569: .IF .CNPF ! 4570: .ELSE ! 4571: * ! 4572: * ADDRESS CONST CONTAINING PROFILE TABLE ENTRY SIZE ! 4573: * ! 4574: PFI2A DAC PF$I2 ! 4575: * ! 4576: * PROFILER MESSAGE STRINGS ! 4577: * ! 4578: PFMS1 DAC B$SCL ! 4579: DAC 15 ! 4580: DTC /PROGRAM PROFILE/ ! 4581: PFMS2 DAC B$SCL ! 4582: DAC 42 ! 4583: DTC /STMT NUMBER OF -- EXECUTION TIME --/ ! 4584: PFMS3 DAC B$SCL ! 4585: DAC 47 ! 4586: DTC /NUMBER EXECUTIONS TOTAL(MSEC) PER EXCN(MCSEC)/ ! 4587: .FI ! 4588: * ! 4589: .IF .CNRA ! 4590: .ELSE ! 4591: * ! 4592: * REAL CONSTANTS FOR GENERAL USE. NOTE THAT THE CONSTANTS ! 4593: * STARTING AT REAV1 FORM A POWERS OF TEN TABLE (GTSTG) ! 4594: * ! 4595: REAV0 DRC +0.0 0.0 ! 4596: REAP1 DRC +0.1 0.1 ! 4597: REAP5 DRC +0.5 0.5 ! 4598: REAV1 DRC +1.0 10**0 ! 4599: REAVT DRC +1.0E+1 10**1 ! 4600: DRC +1.0E+2 10**2 ! 4601: DRC +1.0E+3 10**3 ! 4602: DRC +1.0E+4 10**4 ! 4603: DRC +1.0E+5 10**5 ! 4604: DRC +1.0E+6 10**6 ! 4605: DRC +1.0E+7 10**7 ! 4606: DRC +1.0E+8 10**8 ! 4607: DRC +1.0E+9 10**9 ! 4608: REATT DRC +1.0E+10 10**10 ! 4609: .FI ! 4610: EJC ! 4611: * ! 4612: * STRING CONSTANTS (SCBLK FORMAT) FOR DTYPE PROCEDURE ! 4613: * ! 4614: SCARR DAC B$SCL ARRAY ! 4615: DAC 5 ! 4616: DTC /ARRAY/ ! 4617: * ! 4618: SCBUF DAC B$SCL BUFFER ! 4619: DAC 6 ! 4620: DTC /BUFFER/ ! 4621: * ! 4622: SCCOD DAC B$SCL CODE ! 4623: DAC 4 ! 4624: DTC /CODE/ ! 4625: * ! 4626: SCEXP DAC B$SCL EXPRESSION ! 4627: DAC 10 ! 4628: DTC /EXPRESSION/ ! 4629: * ! 4630: SCEXT DAC B$SCL EXTERNAL ! 4631: DAC 8 ! 4632: DTC /EXTERNAL/ ! 4633: * ! 4634: SCINT DAC B$SCL INTEGER ! 4635: DAC 7 ! 4636: DTC /INTEGER/ ! 4637: * ! 4638: SCNAM DAC B$SCL NAME ! 4639: DAC 4 ! 4640: DTC /NAME/ ! 4641: * ! 4642: SCNUM DAC B$SCL NUMERIC ! 4643: DAC 7 ! 4644: DTC /NUMERIC/ ! 4645: * ! 4646: SCPAT DAC B$SCL PATTERN ! 4647: DAC 7 ! 4648: DTC /PATTERN/ ! 4649: .IF .CNRA ! 4650: .ELSE ! 4651: * ! 4652: SCREA DAC B$SCL REAL ! 4653: DAC 4 ! 4654: DTC /REAL/ ! 4655: .FI ! 4656: * ! 4657: SCSTR DAC B$SCL STRING ! 4658: DAC 6 ! 4659: DTC /STRING/ ! 4660: * ! 4661: SCTAB DAC B$SCL TABLE ! 4662: DAC 5 ! 4663: DTC /TABLE/ ! 4664: EJC ! 4665: * ! 4666: * STRING CONSTANTS (SCBLK FORMAT) FOR KVRTN (SEE RETRN) ! 4667: * ! 4668: SCFRT DAC B$SCL FRETURN ! 4669: DAC 7 ! 4670: DTC /FRETURN/ ! 4671: * ! 4672: SCNRT DAC B$SCL NRETURN ! 4673: DAC 7 ! 4674: DTC /NRETURN/ ! 4675: * ! 4676: SCRTN DAC B$SCL RETURN ! 4677: DAC 6 ! 4678: DTC /RETURN/ ! 4679: * ! 4680: * DATATYPE NAME TABLE FOR DTYPE PROCEDURE. THE ORDER OF ! 4681: * THESE ENTRIES IS TIED TO THE B$XXX DEFINITIONS FOR BLOCKS ! 4682: * ! 4683: SCNMT DAC SCARR ARBLK ARRAY ! 4684: .IF .CNBF ! 4685: .ELSE ! 4686: DAC SCBUF BFBLK BUFFER ! 4687: .FI ! 4688: DAC SCCOD CDBLK CODE ! 4689: DAC SCEXP EXBLK EXPRESSION ! 4690: DAC SCINT ICBLK INTEGER ! 4691: DAC SCNAM NMBLK NAME ! 4692: DAC SCPAT P0BLK PATTERN ! 4693: DAC SCPAT P1BLK PATTERN ! 4694: DAC SCPAT P2BLK PATTERN ! 4695: .IF .CNRA ! 4696: .ELSE ! 4697: DAC SCREA RCBLK REAL ! 4698: .FI ! 4699: DAC SCSTR SCBLK STRING ! 4700: DAC SCEXP SEBLK EXPRESSION ! 4701: DAC SCTAB TBBLK TABLE ! 4702: DAC SCARR VCBLK ARRAY ! 4703: DAC SCEXT XNBLK EXTERNAL ! 4704: DAC SCEXT XRBLK EXTERNAL ! 4705: * ! 4706: .IF .CNRA ! 4707: .ELSE ! 4708: * STRING CONSTANT FOR REAL ZERO ! 4709: * ! 4710: SCRE0 DAC B$SCL ! 4711: DAC 2 ! 4712: DTC /0./ ! 4713: .FI ! 4714: EJC ! 4715: * ! 4716: * USED TO RE-INITIALISE KVSTL ! 4717: * ! 4718: STLIM DIC +50000 DEFAULT STATEMENT LIMIT ! 4719: * ! 4720: * DUMMY FUNCTION BLOCK USED FOR UNDEFINED FUNCTIONS ! 4721: * ! 4722: STNDF DAC O$FUN PTR TO UNDEFINED FUNCTION ERR CALL ! 4723: DAC 0 DUMMY FARGS COUNT FOR CALL CIRCUIT ! 4724: * ! 4725: * DUMMY CODE BLOCK USED FOR UNDEFINED LABELS ! 4726: * ! 4727: STNDL DAC L$UND CODE PTR POINTS TO UNDEFINED LBL ! 4728: * ! 4729: * DUMMY OPERATOR BLOCK USED FOR UNDEFINED OPERATORS ! 4730: * ! 4731: STNDO DAC O$OUN PTR TO UNDEFINED OPERATOR ERR CALL ! 4732: DAC 0 DUMMY FARGS COUNT FOR CALL CIRCUIT ! 4733: * ! 4734: * STANDARD VARIABLE BLOCK. THIS BLOCK IS USED TO INITIALIZE ! 4735: * THE FIRST SEVEN FIELDS OF A NEWLY CONSTRUCTED VRBLK. ! 4736: * ITS FORMAT IS TIED TO THE VRBLK DEFINITIONS (SEE GTNVR). ! 4737: * ! 4738: STNVR DAC B$VRL VRGET ! 4739: DAC B$VRS VRSTO ! 4740: DAC NULLS VRVAL ! 4741: DAC B$VRG VRTRA ! 4742: DAC STNDL VRLBL ! 4743: DAC STNDF VRFNC ! 4744: DAC 0 VRNXT ! 4745: EJC ! 4746: * ! 4747: * MESSAGES USED IN END OF RUN PROCESSING (STOPR) ! 4748: * ! 4749: STPM1 DAC B$SCL IN STATEMENT ! 4750: DAC 12 ! 4751: DTC /IN STATEMENT/ ! 4752: * ! 4753: STPM2 DAC B$SCL ! 4754: DAC 14 ! 4755: DTC /STMTS EXECUTED/ ! 4756: * ! 4757: STPM3 DAC B$SCL ! 4758: DAC 13 ! 4759: DTC /RUN TIME-MSEC/ ! 4760: * ! 4761: STPM4 DAC B$SCL ! 4762: DAC 12 ! 4763: DTC $MCSEC / STMT$ ! 4764: * ! 4765: STPM5 DAC B$SCL ! 4766: DAC 13 ! 4767: DTC /REGENERATIONS/ ! 4768: * ! 4769: * CHARS FOR /TU/ ENDING CODE ! 4770: * ! 4771: STRTU DTC /TU/ ! 4772: * ! 4773: * TABLE USED BY CONVERT FUNCTION TO CHECK DATATYPE NAME ! 4774: * THE ENTRIES ARE ORDERED TO CORRESPOND TO BRANCH TABLE ! 4775: * IN S$CNV ! 4776: * ! 4777: SVCTB DAC SCSTR STRING ! 4778: DAC SCINT INTEGER ! 4779: DAC SCNAM NAME ! 4780: DAC SCPAT PATTERN ! 4781: DAC SCARR ARRAY ! 4782: DAC SCTAB TABLE ! 4783: DAC SCEXP EXPRESSION ! 4784: DAC SCCOD CODE ! 4785: DAC SCNUM NUMERIC ! 4786: .IF .CNRA ! 4787: .ELSE ! 4788: DAC SCREA REAL ! 4789: .FI ! 4790: .IF .CNBF ! 4791: .ELSE ! 4792: DAC SCBUF BUFFER ! 4793: .FI ! 4794: DAC 0 ZERO MARKS END OF LIST ! 4795: EJC ! 4796: * ! 4797: * MESSAGES (SCBLK FORMAT) USED BY TRACE PROCEDURES ! 4798: * ! 4799: * ! 4800: TMASB DAC B$SCL ASTERISKS FOR TRACE STATEMENT NO ! 4801: DAC 13 ! 4802: DTC /************ / ! 4803: ! 4804: * ! 4805: TMBEB DAC B$SCL BLANK-EQUAL-BLANK ! 4806: DAC 3 ! 4807: DTC / = / ! 4808: * ! 4809: * DUMMY TRBLK FOR EXPRESSION VARIABLE ! 4810: * ! 4811: TRBEV DAC B$TRT DUMMY TRBLK ! 4812: * ! 4813: * DUMMY TRBLK FOR KEYWORD VARIABLE ! 4814: * ! 4815: TRBKV DAC B$TRT DUMMY TRBLK ! 4816: * ! 4817: * DUMMY CODE BLOCK TO RETURN CONTROL TO TRXEQ PROCEDURE ! 4818: * ! 4819: TRXDR DAC O$TXR BLOCK POINTS TO RETURN ROUTINE ! 4820: TRXDC DAC TRXDR POINTER TO BLOCK ! 4821: EJC ! 4822: * ! 4823: * STANDARD VARIABLE BLOCKS ! 4824: * ! 4825: * SEE SVBLK FORMAT FOR FULL DETAILS OF THE FORMAT. THE ! 4826: * VRBLKS ARE ORDERED BY LENGTH AND WITHIN EACH LENGTH THE ! 4827: * ORDER IS ALPHABETICAL BY NAME OF THE VARIABLE. ! 4828: * ! 4829: V$EQF DBC SVFPR EQ ! 4830: DAC 2 ! 4831: DTC /EQ/ ! 4832: DAC S$EQF ! 4833: DAC 2 ! 4834: * ! 4835: V$GEF DBC SVFPR GE ! 4836: DAC 2 ! 4837: DTC /GE/ ! 4838: DAC S$GEF ! 4839: DAC 2 ! 4840: * ! 4841: V$GTF DBC SVFPR GT ! 4842: DAC 2 ! 4843: DTC /GT/ ! 4844: DAC S$GTF ! 4845: DAC 2 ! 4846: * ! 4847: V$LEF DBC SVFPR LE ! 4848: DAC 2 ! 4849: DTC /LE/ ! 4850: DAC S$LEF ! 4851: DAC 2 ! 4852: * ! 4853: V$LTF DBC SVFPR LT ! 4854: DAC 2 ! 4855: DTC /LT/ ! 4856: DAC S$LTF ! 4857: DAC 2 ! 4858: * ! 4859: V$NEF DBC SVFPR NE ! 4860: DAC 2 ! 4861: DTC /NE/ ! 4862: DAC S$NEF ! 4863: DAC 2 ! 4864: * ! 4865: V$ANY DBC SVFNP ANY ! 4866: DAC 3 ! 4867: DTC /ANY/ ! 4868: DAC S$ANY ! 4869: DAC 1 ! 4870: * ! 4871: V$ARB DBC SVKVC ARB ! 4872: DAC 3 ! 4873: DTC /ARB/ ! 4874: DAC K$ARB ! 4875: DAC NDARB ! 4876: EJC ! 4877: * ! 4878: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 4879: * ! 4880: V$ARG DBC SVFNN ARG ! 4881: DAC 3 ! 4882: DTC /ARG/ ! 4883: DAC S$ARG ! 4884: DAC 2 ! 4885: * ! 4886: V$BAL DBC SVKVC BAL ! 4887: DAC 3 ! 4888: DTC /BAL/ ! 4889: DAC K$BAL ! 4890: DAC NDBAL ! 4891: * ! 4892: V$END DBC SVLBL END ! 4893: DAC 3 ! 4894: DTC /END/ ! 4895: DAC L$END ! 4896: * ! 4897: V$LEN DBC SVFNP LEN ! 4898: DAC 3 ! 4899: DTC /LEN/ ! 4900: DAC S$LEN ! 4901: DAC 1 ! 4902: * ! 4903: V$LEQ DBC SVFPR LEQ ! 4904: DAC 3 ! 4905: DTC /LEQ/ ! 4906: DAC S$LEQ ! 4907: DAC 2 ! 4908: * ! 4909: V$LGE DBC SVFPR LGE ! 4910: DAC 3 ! 4911: DTC /LGE/ ! 4912: DAC S$LGE ! 4913: DAC 2 ! 4914: * ! 4915: V$LGT DBC SVFPR LGT ! 4916: DAC 3 ! 4917: DTC /LGT/ ! 4918: DAC S$LGT ! 4919: DAC 2 ! 4920: * ! 4921: V$LLE DBC SVFPR LLE ! 4922: DAC 3 ! 4923: DTC /LLE/ ! 4924: DAC S$LLE ! 4925: DAC 2 ! 4926: EJC ! 4927: * ! 4928: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 4929: * ! 4930: V$LLT DBC SVFPR LLT ! 4931: DAC 3 ! 4932: DTC /LLT/ ! 4933: DAC S$LLT ! 4934: DAC 2 ! 4935: * ! 4936: V$LNE DBC SVFPR LNE ! 4937: DAC 3 ! 4938: DTC /LNE/ ! 4939: DAC S$LNE ! 4940: DAC 2 ! 4941: * ! 4942: V$POS DBC SVFNP POS ! 4943: DAC 3 ! 4944: DTC /POS/ ! 4945: DAC S$POS ! 4946: DAC 1 ! 4947: * ! 4948: V$REM DBC SVKVC REM ! 4949: DAC 3 ! 4950: DTC /REM/ ! 4951: DAC K$REM ! 4952: DAC NDREM ! 4953: .IF .CUST ! 4954: * ! 4955: V$SET DBC SVFNN SET ! 4956: DAC 3 ! 4957: DTC /SET/ ! 4958: DAC S$SET ! 4959: DAC 3 ! 4960: .FI ! 4961: * ! 4962: V$TAB DBC SVFNP TAB ! 4963: DAC 3 ! 4964: DTC /TAB/ ! 4965: DAC S$TAB ! 4966: DAC 1 ! 4967: .IF .CULC ! 4968: * ! 4969: V$CAS DBC SVKNM CASE ! 4970: DAC 4 ! 4971: DTC /CASE/ ! 4972: DAC K$CAS ! 4973: .FI ! 4974: * ! 4975: V$CHR DBC SVFNP CHAR ! 4976: DAC 4 ! 4977: DTC /CHAR/ ! 4978: DAC S$CHR ! 4979: DAC 1 ! 4980: * ! 4981: V$COD DBC SVFNK CODE ! 4982: DAC 4 ! 4983: DTC /CODE/ ! 4984: DAC K$COD ! 4985: DAC S$COD ! 4986: DAC 1 ! 4987: * ! 4988: V$COP DBC SVFNN COPY ! 4989: DAC 4 ! 4990: DTC /COPY/ ! 4991: DAC S$COP ! 4992: DAC 1 ! 4993: EJC ! 4994: * ! 4995: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 4996: * ! 4997: V$DAT DBC SVFNN DATA ! 4998: DAC 4 ! 4999: DTC /DATA/ ! 5000: DAC S$DAT ! 5001: DAC 1 ! 5002: * ! 5003: V$DTE DBC SVFNN DATE ! 5004: DAC 4 ! 5005: DTC /DATE/ ! 5006: DAC S$DTE ! 5007: DAC 0 ! 5008: * ! 5009: V$DMP DBC SVFNK DUMP ! 5010: DAC 4 ! 5011: DTC /DUMP/ ! 5012: DAC K$DMP ! 5013: DAC S$DMP ! 5014: DAC 1 ! 5015: * ! 5016: V$DUP DBC SVFNN DUPL ! 5017: DAC 4 ! 5018: DTC /DUPL/ ! 5019: DAC S$DUP ! 5020: DAC 2 ! 5021: * ! 5022: V$EVL DBC SVFNN EVAL ! 5023: DAC 4 ! 5024: DTC /EVAL/ ! 5025: DAC S$EVL ! 5026: DAC 1 ! 5027: .IF .CNEX ! 5028: .ELSE ! 5029: * ! 5030: V$EXT DBC SVFNN EXIT ! 5031: DAC 4 ! 5032: DTC /EXIT/ ! 5033: DAC S$EXT ! 5034: DAC 1 ! 5035: .FI ! 5036: * ! 5037: V$FAL DBC SVKVC FAIL ! 5038: DAC 4 ! 5039: DTC /FAIL/ ! 5040: DAC K$FAL ! 5041: DAC NDFAL ! 5042: * ! 5043: V$HST DBC SVFNN HOST ! 5044: DAC 4 ! 5045: DTC /HOST/ ! 5046: DAC S$HST ! 5047: DAC 3 ! 5048: EJC ! 5049: * ! 5050: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5051: * ! 5052: V$ITM DBC SVFNF ITEM ! 5053: DAC 4 ! 5054: DTC /ITEM/ ! 5055: DAC S$ITM ! 5056: DAC 999 ! 5057: .IF .CNLD ! 5058: .ELSE ! 5059: * ! 5060: V$LOD DBC SVFNN LOAD ! 5061: DAC 4 ! 5062: DTC /LOAD/ ! 5063: DAC S$LOD ! 5064: DAC 2 ! 5065: .FI ! 5066: * ! 5067: V$LPD DBC SVFNP LPAD ! 5068: DAC 4 ! 5069: DTC /LPAD/ ! 5070: DAC S$LPD ! 5071: DAC 3 ! 5072: * ! 5073: V$RPD DBC SVFNP RPAD ! 5074: DAC 4 ! 5075: DTC /RPAD/ ! 5076: DAC S$RPD ! 5077: DAC 3 ! 5078: * ! 5079: V$RPS DBC SVFNP RPOS ! 5080: DAC 4 ! 5081: DTC /RPOS/ ! 5082: DAC S$RPS ! 5083: DAC 1 ! 5084: * ! 5085: V$RTB DBC SVFNP RTAB ! 5086: DAC 4 ! 5087: DTC /RTAB/ ! 5088: DAC S$RTB ! 5089: DAC 1 ! 5090: * ! 5091: V$SI$ DBC SVFNP SIZE ! 5092: DAC 4 ! 5093: DTC /SIZE/ ! 5094: DAC S$SI$ ! 5095: DAC 1 ! 5096: * ! 5097: .IF .CNSR ! 5098: .ELSE ! 5099: * ! 5100: V$SRT DBC SVFNN SORT ! 5101: DAC 4 ! 5102: DTC /SORT/ ! 5103: DAC S$SRT ! 5104: DAC 2 ! 5105: .FI ! 5106: V$SPN DBC SVFNP SPAN ! 5107: DAC 4 ! 5108: DTC /SPAN/ ! 5109: DAC S$SPN ! 5110: DAC 1 ! 5111: EJC ! 5112: * ! 5113: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5114: * ! 5115: V$STN DBC SVKNM STNO ! 5116: DAC 4 ! 5117: DTC /STNO/ ! 5118: DAC K$STN ! 5119: * ! 5120: V$TIM DBC SVFNN TIME ! 5121: DAC 4 ! 5122: DTC /TIME/ ! 5123: DAC S$TIM ! 5124: DAC 0 ! 5125: * ! 5126: V$TRM DBC SVFNK TRIM ! 5127: DAC 4 ! 5128: DTC /TRIM/ ! 5129: DAC K$TRM ! 5130: DAC S$TRM ! 5131: DAC 1 ! 5132: * ! 5133: V$ABE DBC SVKNM ABEND ! 5134: DAC 5 ! 5135: DTC /ABEND/ ! 5136: DAC K$ABE ! 5137: * ! 5138: V$ABO DBC SVKVL ABORT ! 5139: DAC 5 ! 5140: DTC /ABORT/ ! 5141: DAC K$ABO ! 5142: DAC L$ABO ! 5143: DAC NDABO ! 5144: * ! 5145: V$APP DBC SVFNF APPLY ! 5146: DAC 5 ! 5147: DTC /APPLY/ ! 5148: DAC S$APP ! 5149: DAC 999 ! 5150: * ! 5151: V$ABN DBC SVFNP ARBNO ! 5152: DAC 5 ! 5153: DTC /ARBNO/ ! 5154: DAC S$ABN ! 5155: DAC 1 ! 5156: * ! 5157: V$ARR DBC SVFNN ARRAY ! 5158: DAC 5 ! 5159: DTC /ARRAY/ ! 5160: DAC S$ARR ! 5161: DAC 2 ! 5162: EJC ! 5163: * ! 5164: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5165: * ! 5166: V$BRK DBC SVFNP BREAK ! 5167: DAC 5 ! 5168: DTC /BREAK/ ! 5169: DAC S$BRK ! 5170: DAC 1 ! 5171: * ! 5172: V$CLR DBC SVFNN CLEAR ! 5173: DAC 5 ! 5174: DTC /CLEAR/ ! 5175: DAC S$CLR ! 5176: DAC 1 ! 5177: * ! 5178: V$EJC DBC SVFNN EJECT ! 5179: DAC 5 ! 5180: DTC /EJECT/ ! 5181: DAC S$EJC ! 5182: DAC 1 ! 5183: * ! 5184: V$FEN DBC SVFPK FENCE ! 5185: DAC 5 ! 5186: DTC /FENCE/ ! 5187: DAC K$FEN ! 5188: DAC S$FNC ! 5189: DAC 1 ! 5190: DAC NDFEN ! 5191: * ! 5192: V$FLD DBC SVFNN FIELD ! 5193: DAC 5 ! 5194: DTC /FIELD/ ! 5195: DAC S$FLD ! 5196: DAC 2 ! 5197: * ! 5198: V$IDN DBC SVFPR IDENT ! 5199: DAC 5 ! 5200: DTC /IDENT/ ! 5201: DAC S$IDN ! 5202: DAC 2 ! 5203: * ! 5204: V$INP DBC SVFNK INPUT ! 5205: DAC 5 ! 5206: DTC /INPUT/ ! 5207: DAC K$INP ! 5208: DAC S$INP ! 5209: DAC 3 ! 5210: * ! 5211: V$LOC DBC SVFNN LOCAL ! 5212: DAC 5 ! 5213: DTC /LOCAL/ ! 5214: DAC S$LOC ! 5215: DAC 2 ! 5216: EJC ! 5217: * ! 5218: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5219: * ! 5220: V$OPS DBC SVFNN OPSYN ! 5221: DAC 5 ! 5222: DTC /OPSYN/ ! 5223: DAC S$OPS ! 5224: DAC 3 ! 5225: * ! 5226: V$RMD DBC SVFNP REMDR ! 5227: DAC 5 ! 5228: DTC /REMDR/ ! 5229: DAC S$RMD ! 5230: DAC 2 ! 5231: .IF .CNSR ! 5232: .ELSE ! 5233: * ! 5234: V$RSR DBC SVFNN RSORT ! 5235: DAC 5 ! 5236: DTC /RSORT/ ! 5237: DAC S$RSR ! 5238: DAC 2 ! 5239: .FI ! 5240: * ! 5241: V$TBL DBC SVFNN TABLE ! 5242: DAC 5 ! 5243: DTC /TABLE/ ! 5244: DAC S$TBL ! 5245: DAC 3 ! 5246: * ! 5247: V$TRA DBC SVFNK TRACE ! 5248: DAC 5 ! 5249: DTC /TRACE/ ! 5250: DAC K$TRA ! 5251: DAC S$TRA ! 5252: DAC 4 ! 5253: * ! 5254: V$ANC DBC SVKNM ANCHOR ! 5255: DAC 6 ! 5256: DTC /ANCHOR/ ! 5257: DAC K$ANC ! 5258: .IF .CNBF ! 5259: .ELSE ! 5260: * ! 5261: V$APN DBC SVFNN ! 5262: DAC 6 ! 5263: DTC /APPEND/ ! 5264: DAC S$APN ! 5265: DAC 2 ! 5266: .FI ! 5267: * ! 5268: V$BKX DBC SVFNP BREAKX ! 5269: DAC 6 ! 5270: DTC /BREAKX/ ! 5271: DAC S$BKX ! 5272: DAC 1 ! 5273: * ! 5274: .IF .CNBF ! 5275: .ELSE ! 5276: V$BUF DBC SVFNN BUFFER ! 5277: DAC 6 ! 5278: DTC /BUFFER/ ! 5279: DAC S$BUF ! 5280: DAC 2 ! 5281: .FI ! 5282: * ! 5283: V$DEF DBC SVFNN DEFINE ! 5284: DAC 6 ! 5285: DTC /DEFINE/ ! 5286: DAC S$DEF ! 5287: DAC 2 ! 5288: * ! 5289: V$DET DBC SVFNN DETACH ! 5290: DAC 6 ! 5291: DTC /DETACH/ ! 5292: DAC S$DET ! 5293: DAC 1 ! 5294: EJC ! 5295: * ! 5296: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5297: * ! 5298: V$DIF DBC SVFPR DIFFER ! 5299: DAC 6 ! 5300: DTC /DIFFER/ ! 5301: DAC S$DIF ! 5302: DAC 2 ! 5303: * ! 5304: V$FTR DBC SVKNM FTRACE ! 5305: DAC 6 ! 5306: DTC /FTRACE/ ! 5307: DAC K$FTR ! 5308: * ! 5309: .IF .CNBF ! 5310: .ELSE ! 5311: V$INS DBC SVFNN INSERT ! 5312: DAC 6 ! 5313: DTC /INSERT/ ! 5314: DAC S$INS ! 5315: DAC 4 ! 5316: * ! 5317: .FI ! 5318: V$LST DBC SVKNM LASTNO ! 5319: DAC 6 ! 5320: DTC /LASTNO/ ! 5321: DAC K$LST ! 5322: * ! 5323: V$NAY DBC SVFNP NOTANY ! 5324: DAC 6 ! 5325: DTC /NOTANY/ ! 5326: DAC S$NAY ! 5327: DAC 1 ! 5328: * ! 5329: V$OUP DBC SVFNK OUTPUT ! 5330: DAC 6 ! 5331: DTC /OUTPUT/ ! 5332: DAC K$OUP ! 5333: DAC S$OUP ! 5334: DAC 3 ! 5335: * ! 5336: V$RET DBC SVLBL RETURN ! 5337: DAC 6 ! 5338: DTC /RETURN/ ! 5339: DAC L$RTN ! 5340: * ! 5341: V$REW DBC SVFNN REWIND ! 5342: DAC 6 ! 5343: DTC /REWIND/ ! 5344: DAC S$REW ! 5345: DAC 1 ! 5346: * ! 5347: V$STT DBC SVFNN STOPTR ! 5348: DAC 6 ! 5349: DTC /STOPTR/ ! 5350: DAC S$STT ! 5351: DAC 2 ! 5352: EJC ! 5353: * ! 5354: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5355: * ! 5356: V$SUB DBC SVFNN SUBSTR ! 5357: DAC 6 ! 5358: DTC /SUBSTR/ ! 5359: DAC S$SUB ! 5360: DAC 3 ! 5361: * ! 5362: V$UNL DBC SVFNN UNLOAD ! 5363: DAC 6 ! 5364: DTC /UNLOAD/ ! 5365: DAC S$UNL ! 5366: DAC 1 ! 5367: * ! 5368: V$COL DBC SVFNN COLLECT ! 5369: DAC 7 ! 5370: DTC /COLLECT/ ! 5371: DAC S$COL ! 5372: DAC 1 ! 5373: * ! 5374: V$CNV DBC SVFNN CONVERT ! 5375: DAC 7 ! 5376: DTC /CONVERT/ ! 5377: DAC S$CNV ! 5378: DAC 2 ! 5379: * ! 5380: V$ENF DBC SVFNN ENDFILE ! 5381: DAC 7 ! 5382: DTC /ENDFILE/ ! 5383: DAC S$ENF ! 5384: DAC 1 ! 5385: * ! 5386: V$ETX DBC SVKNM ERRTEXT ! 5387: DAC 7 ! 5388: DTC /ERRTEXT/ ! 5389: DAC K$ETX ! 5390: * ! 5391: V$ERT DBC SVKNM ERRTYPE ! 5392: DAC 7 ! 5393: DTC /ERRTYPE/ ! 5394: DAC K$ERT ! 5395: * ! 5396: V$FRT DBC SVLBL FRETURN ! 5397: DAC 7 ! 5398: DTC /FRETURN/ ! 5399: DAC L$FRT ! 5400: * ! 5401: V$INT DBC SVFPR INTEGER ! 5402: DAC 7 ! 5403: DTC /INTEGER/ ! 5404: DAC S$INT ! 5405: DAC 1 ! 5406: * ! 5407: V$NRT DBC SVLBL NRETURN ! 5408: DAC 7 ! 5409: DTC /NRETURN/ ! 5410: DAC L$NRT ! 5411: EJC ! 5412: * ! 5413: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5414: * ! 5415: .IF .CNPF ! 5416: .ELSE ! 5417: * ! 5418: V$PFL DBC SVKNM PROFILE ! 5419: DAC 7 ! 5420: DTC /PROFILE/ ! 5421: DAC K$PFL ! 5422: .FI ! 5423: * ! 5424: V$RPL DBC SVFNP REPLACE ! 5425: DAC 7 ! 5426: DTC /REPLACE/ ! 5427: DAC S$RPL ! 5428: DAC 3 ! 5429: * ! 5430: V$RVS DBC SVFNP REVERSE ! 5431: DAC 7 ! 5432: DTC /REVERSE/ ! 5433: DAC S$RVS ! 5434: DAC 1 ! 5435: * ! 5436: V$RTN DBC SVKNM RTNTYPE ! 5437: DAC 7 ! 5438: DTC /RTNTYPE/ ! 5439: DAC K$RTN ! 5440: * ! 5441: V$STX DBC SVFNN SETEXIT ! 5442: DAC 7 ! 5443: DTC /SETEXIT/ ! 5444: DAC S$STX ! 5445: DAC 1 ! 5446: * ! 5447: V$STC DBC SVKNM STCOUNT ! 5448: DAC 7 ! 5449: DTC /STCOUNT/ ! 5450: DAC K$STC ! 5451: * ! 5452: V$STL DBC SVKNM STLIMIT ! 5453: DAC 7 ! 5454: DTC /STLIMIT/ ! 5455: DAC K$STL ! 5456: * ! 5457: V$SUC DBC SVKVC SUCCEED ! 5458: DAC 7 ! 5459: DTC /SUCCEED/ ! 5460: DAC K$SUC ! 5461: DAC NDSUC ! 5462: * ! 5463: V$ALP DBC SVKWC ALPHABET ! 5464: DAC 8 ! 5465: DTC /ALPHABET/ ! 5466: DAC K$ALP ! 5467: * ! 5468: V$CNT DBC SVLBL CONTINUE ! 5469: DAC 8 ! 5470: DTC /CONTINUE/ ! 5471: DAC L$CNT ! 5472: EJC ! 5473: * ! 5474: * STANDARD VARIABLE BLOCKS (CONTINUED) ! 5475: * ! 5476: V$DTP DBC SVFNP DATATYPE ! 5477: DAC 8 ! 5478: DTC /DATATYPE/ ! 5479: DAC S$DTP ! 5480: DAC 1 ! 5481: * ! 5482: V$ERL DBC SVKNM ERRLIMIT ! 5483: DAC 8 ! 5484: DTC /ERRLIMIT/ ! 5485: DAC K$ERL ! 5486: * ! 5487: V$FNC DBC SVKNM FNCLEVEL ! 5488: DAC 8 ! 5489: DTC /FNCLEVEL/ ! 5490: DAC K$FNC ! 5491: * ! 5492: V$MXL DBC SVKNM MAXLNGTH ! 5493: DAC 8 ! 5494: DTC /MAXLNGTH/ ! 5495: DAC K$MXL ! 5496: * ! 5497: V$TER DBC 0 TERMINAL ! 5498: DAC 8 ! 5499: DTC /TERMINAL/ ! 5500: DAC 0 ! 5501: * ! 5502: V$PRO DBC SVFNN PROTOTYPE ! 5503: DAC 9 ! 5504: DTC /PROTOTYPE/ ! 5505: DAC S$PRO ! 5506: DAC 1 ! 5507: * ! 5508: DBC 0 DUMMY ENTRY TO END LIST ! 5509: DAC 10 LENGTH GT 9 (PROTOTYPE) ! 5510: EJC ! 5511: * ! 5512: * LIST OF SVBLK POINTERS FOR KEYWORDS TO BE DUMPED. THE ! 5513: * LIST IS IN THE ORDER WHICH APPEARS ON THE DUMP OUTPUT. ! 5514: * ! 5515: VDMKW DAC V$ANC ANCHOR ! 5516: .IF .CULC ! 5517: DAC V$CAS CCASE ! 5518: .FI ! 5519: DAC V$COD CODE ! 5520: DAC V$DMP DUMP ! 5521: DAC V$ERL ERRLIMIT ! 5522: DAC V$ETX ERRTEXT ! 5523: DAC V$ERT ERRTYPE ! 5524: DAC V$FNC FNCLEVEL ! 5525: DAC V$FTR FTRACE ! 5526: DAC V$INP INPUT ! 5527: DAC V$LST LASTNO ! 5528: DAC V$MXL MAXLENGTH ! 5529: DAC V$OUP OUTPUT ! 5530: .IF .CNPF ! 5531: .ELSE ! 5532: DAC V$PFL PROFILE ! 5533: .FI ! 5534: DAC V$RTN RTNTYPE ! 5535: DAC V$STC STCOUNT ! 5536: DAC V$STL STLIMIT ! 5537: DAC V$STN STNO ! 5538: DAC V$TRA TRACE ! 5539: DAC V$TRM TRIM ! 5540: DAC 0 END OF LIST ! 5541: * ! 5542: * TABLE USED BY GTNVR TO SEARCH SVBLK LISTS ! 5543: * ! 5544: VSRCH DAC 0 DUMMY ENTRY TO GET PROPER INDEXING ! 5545: DAC V$EQF START OF 1 CHAR VARIABLES (NONE) ! 5546: DAC V$EQF START OF 2 CHAR VARIABLES ! 5547: DAC V$ANY START OF 3 CHAR VARIABLES ! 5548: .IF .CULC ! 5549: DAC V$CAS START OF 4 CHAR VARIABLES ! 5550: .ELSE ! 5551: DAC V$CHR START OF 4 CHAR VARIABLES ! 5552: .FI ! 5553: DAC V$ABE START OF 5 CHAR VARIABLES ! 5554: DAC V$ANC START OF 6 CHAR VARIABLES ! 5555: DAC V$COL START OF 7 CHAR VARIABLES ! 5556: DAC V$ALP START OF 8 CHAR VARIABLES ! 5557: DAC V$PRO START OF 9 CHAR VARIABLES ! 5558: TTL S P I T B O L -- WORKING STORAGE SECTION ! 5559: * ! 5560: * THE WORKING STORAGE SECTION CONTAINS AREAS WHICH ARE ! 5561: * CHANGED DURING EXECUTION OF THE PROGRAM. THE VALUE ! 5562: * ASSEMBLED IS THE INITIAL VALUE BEFORE EXECUTION STARTS. ! 5563: * ! 5564: * ALL THESE AREAS ARE FIXED LENGTH AREAS. VARIABLE LENGTH ! 5565: * DATA IS STORED IN THE STATIC OR DYNAMIC REGIONS OF THE ! 5566: * ALLOCATED DATA AREAS. ! 5567: * ! 5568: * THE VALUES IN THIS AREA ARE DESCRIBED EITHER AS WORK ! 5569: * AREAS OR AS GLOBAL VALUES. A WORK AREA IS USED IN AN ! 5570: * EPHEMERAL MANNER AND THE VALUE IS NOT SAVED FROM ONE ! 5571: * ENTRY INTO A ROUTINE TO ANOTHER. A GLOBAL VALUE IS A ! 5572: * LESS TEMPORARY LOCATION WHOSE VALUE IS SAVED FROM ONE ! 5573: * CALL TO ANOTHER. ! 5574: * ! 5575: * A GENERAL PART OF THE APPROACH IN THIS PROGRAM IS NOT ! 5576: * TO OVERLAP WORK AREAS BETWEEN PROCEDURES EVEN THOUGH A ! 5577: * SMALL AMOUNT OF SPACE COULD BE SAVED. SUCH OVERLAP IS ! 5578: * CONSIDERED A SOURCE OF PROGRAM ERRORS AND DECREASES THE ! 5579: * INFORMATION LEFT BEHIND AFTER A SYSTEM CRASH OF ANY KIND. ! 5580: * ! 5581: * THE NAMES OF THESE LOCATIONS ARE LABELS WITH FIVE LETTER ! 5582: * (A-Y,$) NAMES. AS FAR AS POSSIBLE THE ORDER IS KEPT ! 5583: * ALPHABETICAL BY THESE NAMES BUT IN SOME CASES THERE ! 5584: * ARE SLIGHT DEPARTURES CAUSED BY OTHER ORDER REQUIREMENTS. ! 5585: * ! 5586: * UNLESS OTHERWISE DOCUMENTED, THE ORDER OF WORK AREAS ! 5587: * DOES NOT AFFECT THE EXECUTION OF THE SPITBOL PROGRAM. ! 5588: * ! 5589: SEC START OF WORKING STORAGE SECTION ! 5590: EJC ! 5591: * ! 5592: * THIS AREA IS NOT CLEARED BY INITIAL CODE ! 5593: * ! 5594: CMLAB DAC B$SCL STRING USED TO CHECK LABEL LEGALITY ! 5595: DAC 2 ! 5596: DTC / / ! 5597: * ! 5598: * LABEL TO MARK START OF WORK AREA ! 5599: * ! 5600: AAAAA DAC 0 ! 5601: * ! 5602: * WORK AREAS FOR ALLOC PROCEDURE ! 5603: * ! 5604: ALDYN DAC 0 AMOUNT OF DYNAMIC STORE ! 5605: ALFSF DIC +0 FACTOR IN FREE STORE PCNTAGE CHECK ! 5606: ALLIA DIC +0 DUMP IA ! 5607: ALLSV DAC 0 SAVE WB IN ALLOC ! 5608: * ! 5609: * WORK AREAS FOR ALOST PROCEDURE ! 5610: * ! 5611: ALSTA DAC 0 SAVE WA IN ALOST ! 5612: * ! 5613: * SAVE AREAS FOR ARRAY FUNCTION (S$ARR) ! 5614: * ! 5615: ARCDM DAC 0 COUNT DIMENSIONS ! 5616: ARNEL DIC +0 COUNT ELEMENTS ! 5617: ARPTR DAC 0 OFFSET PTR INTO ARBLK ! 5618: ARSVL DIC +0 SAVE INTEGER LOW BOUND ! 5619: EJC ! 5620: * WORK AREAS FOR ARREF ROUTINE ! 5621: * ! 5622: ARFSI DIC +0 SAVE CURRENT EVOLVING SUBSCRIPT ! 5623: ARFXS DAC 0 SAVE BASE STACK POINTER ! 5624: * ! 5625: * WORK AREAS FOR B$EFC BLOCK ROUTINE ! 5626: * ! 5627: BEFOF DAC 0 SAVE OFFSET PTR INTO EFBLK ! 5628: * ! 5629: * WORK AREAS FOR B$PFC BLOCK ROUTINE ! 5630: * ! 5631: BPFPF DAC 0 SAVE PFBLK POINTER ! 5632: BPFSV DAC 0 SAVE OLD FUNCTION VALUE ! 5633: BPFXT DAC 0 POINTER TO STACKED ARGUMENTS ! 5634: * ! 5635: * SAVE AREAS FOR COLLECT FUNCTION (S$COL) ! 5636: * ! 5637: CLSVI DIC +0 SAVE INTEGER ARGUMENT ! 5638: * ! 5639: * GLOBAL VALUES FOR CMPIL PROCEDURE ! 5640: * ! 5641: CMERC DAC 0 COUNT OF INITIAL COMPILE ERRORS ! 5642: CMPXS DAC 0 SAVE STACK PTR IN CASE OF ERRORS ! 5643: CMPSN DAC 1 NUMBER OF NEXT STATEMENT TO COMPILE ! 5644: CMPSS DAC 0 SAVE SUBROUTINE STACK PTR ! 5645: * ! 5646: * WORK AREA FOR CNCRD ! 5647: * ! 5648: CNSCC DAC 0 POINTER TO CONTROL CARD STRING ! 5649: CNSWC DAC 0 WORD COUNT ! 5650: CNR$T DAC 0 POINTER TO R$TTL OR R$STL ! 5651: CNTTL DAC 0 FLAG FOR -TITLE, -STITL ! 5652: * ! 5653: * WORK AREAS FOR CONVERT FUNCTION (S$CNV) ! 5654: * ! 5655: CNVTP DAC 0 SAVE PTR INTO SCVTB ! 5656: * ! 5657: * FLAG FOR SUPPRESSION OF COMPILATION STATISTICS. ! 5658: * ! 5659: CPSTS DAC 0 SUPPRESS COMP. STATS IF NON ZERO ! 5660: * ! 5661: * GLOBAL VALUES FOR CONTROL CARD SWITCHES ! 5662: * ! 5663: CSWDB DAC 0 0/1 FOR -SINGLE/-DOUBLE ! 5664: CSWER DAC 0 0/1 FOR -ERRORS/-NOERRORS ! 5665: CSWEX DAC 0 0/1 FOR -EXECUTE/-NOEXECUTE ! 5666: CSWFL DAC 1 0/1 FOR -NOFAIL/-FAIL ! 5667: CSWIN DAC INILN XXX FOR -INXXX ! 5668: CSWLS DAC 1 0/1 FOR -NOLIST/-LIST ! 5669: CSWNO DAC 0 0/1 FOR -OPTIMISE/-NOOPT ! 5670: CSWPR DAC 0 0/1 FOR -NOPRINT/-PRINT ! 5671: * ! 5672: * GLOBAL LOCATION USED BY PATST PROCEDURE ! 5673: * ! 5674: CTMSK DBC 0 LAST BIT POSITION USED IN R$CTP ! 5675: CURID DAC 0 CURRENT ID VALUE ! 5676: EJC ! 5677: * ! 5678: * GLOBAL VALUE FOR CDWRD PROCEDURE ! 5679: * ! 5680: CWCOF DAC 0 NEXT WORD OFFSET IN CURRENT CCBLK ! 5681: * ! 5682: * WORK AREAS FOR DATA FUNCTION (S$DAT) ! 5683: * ! 5684: DATDV DAC 0 SAVE VRBLK PTR FOR DATATYPE NAME ! 5685: DATXS DAC 0 SAVE INITIAL STACK POINTER ! 5686: * ! 5687: * WORK AREAS FOR DEFINE FUNCTION (S$DEF) ! 5688: * ! 5689: DEFLB DAC 0 SAVE VRBLK PTR FOR LABEL ! 5690: DEFNA DAC 0 COUNT FUNCTION ARGUMENTS ! 5691: DEFVR DAC 0 SAVE VRBLK PTR FOR FUNCTION NAME ! 5692: DEFXS DAC 0 SAVE INITIAL STACK POINTER ! 5693: * ! 5694: * WORK AREAS FOR DUMPR PROCEDURE ! 5695: * ! 5696: DMARG DAC 0 DUMP ARGUMENT ! 5697: DMPKB DAC B$KVT DUMMY KVBLK FOR USE IN DUMPR ! 5698: DMPKT DAC TRBKV KVVAR TRBLK POINTER ! 5699: DMPKN DAC 0 KEYWORD NUMBER (MUST FOLLOW DMPKB) ! 5700: DMPSA DAC 0 PRESERVE WA OVER PRTVL CALL ! 5701: DMPSV DAC 0 GENERAL SCRATCH SAVE ! 5702: DMVCH DAC 0 CHAIN POINTER FOR VARIABLE BLOCKS ! 5703: DMPCH DAC 0 SAVE SORTED VRBLK CHAIN POINTER ! 5704: * ! 5705: * GLOBAL LOCATIONS FOR DYNAMIC STORAGE POINTERS ! 5706: * ! 5707: DNAMB DAC 0 START OF DYNAMIC AREA ! 5708: DNAMP DAC 0 NEXT AVAILABLE LOC IN DYNAMIC AREA ! 5709: DNAME DAC 0 END OF AVAILABLE DYNAMIC AREA ! 5710: * ! 5711: * WORK AREA FOR DTACH ! 5712: * ! 5713: DTCNB DAC 0 NAME BASE ! 5714: DTCNM DAC 0 NAME PTR ! 5715: * ! 5716: * WORK AREAS FOR DUPL FUNCTION (S$DUP) ! 5717: * ! 5718: DUPSI DIC +0 STORE INTEGER STRING LENGTH ! 5719: * ! 5720: * WORK AREA FOR ENDFILE (S$ENF) ! 5721: * ! 5722: ENFCH DAC 0 FOR IOCHN CHAIN HEAD ! 5723: * ! 5724: * WORK AREA FOR ERROR PROCESSING. ! 5725: * ! 5726: ERICH DAC 0 COPY ERROR REPORTS TO INT.CHAN IF 1 ! 5727: ERLST DAC 0 FOR LISTR WHEN ERRORS GO TO INT.CH. ! 5728: ERRFT DAC 0 FATAL ERROR FLAG ! 5729: ERRSP DAC 0 ERROR SUPPRESSION FLAG ! 5730: EJC ! 5731: * ! 5732: * DUMP AREA FOR ERTEX ! 5733: * ! 5734: ERTWA DAC 0 SAVE WA ! 5735: ERTWB DAC 0 SAVE WB ! 5736: * ! 5737: * GLOBAL VALUES FOR EVALI ! 5738: * ! 5739: EVLIN DAC P$LEN DUMMY PATTERN BLOCK PCODE ! 5740: EVLIS DAC 0 POINTER TO SUBSEQUENT NODE ! 5741: EVLIV DAC 0 VALUE OF PARAMETER ! 5742: * WORK AREA FOR EXPAN ! 5743: * ! 5744: EXPSV DAC 0 SAVE OP DOPE VECTOR POINTER ! 5745: * ! 5746: * FLAG FOR SUPPRESSION OF EXECUTION STATS ! 5747: * ! 5748: EXSTS DAC 0 SUPPRESS EXEC STATS IF SET ! 5749: * ! 5750: * GLOBAL VALUES FOR EXFAL AND RETURN ! 5751: * ! 5752: FLPRT DAC 0 LOCATION OF FAIL OFFSET FOR RETURN ! 5753: FLPTR DAC 0 LOCATION OF FAILURE OFFSET ON STACK ! 5754: * ! 5755: * WORK AREAS FOR GBCOL PROCEDURE ! 5756: * ! 5757: GBCFL DAC 0 GARBAGE COLLECTOR ACTIVE FLAG ! 5758: GBCLM DAC 0 POINTER TO LAST MOVE BLOCK (PASS 3) ! 5759: GBCNM DAC 0 DUMMY FIRST MOVE BLOCK ! 5760: GBCNS DAC 0 REST OF DUMMY BLOCK (FOLLOWS GBCNM) ! 5761: GBSVA DAC 0 SAVE WA ! 5762: GBSVB DAC 0 SAVE WB ! 5763: GBSVC DAC 0 SAVE WC ! 5764: * ! 5765: * GLOBAL LOCATION TO COUNT GARBAGE COLLECTIONS (GBCOL) ! 5766: * ! 5767: GBCNT DAC 0 COUNT OF GARBAGE COLLECTIONS ! 5768: * ! 5769: * WORK AREAS FOR GTNVR PROCEDURE ! 5770: * ! 5771: GNVHE DAC 0 PTR TO END OF HASH CHAIN ! 5772: GNVNW DAC 0 NUMBER OF WORDS IN STRING NAME ! 5773: GNVSA DAC 0 SAVE WA ! 5774: GNVSB DAC 0 SAVE WB ! 5775: GNVSP DAC 0 POINTER INTO VSRCH TABLE ! 5776: GNVST DAC 0 POINTER TO CHARS OF STRING ! 5777: * ! 5778: * GLOBAL VALUE FOR GTCOD AND GTEXP ! 5779: * ! 5780: GTCEF DAC 0 SAVE FAIL PTR IN CASE OF ERROR ! 5781: * ! 5782: * WORK AREAS FOR GTINT ! 5783: * ! 5784: GTINA DAC 0 SAVE WA ! 5785: GTINB DAC 0 SAVE WB ! 5786: EJC ! 5787: * ! 5788: * WORK AREAS FOR GTNUM PROCEDURE ! 5789: * ! 5790: GTNNF DAC 0 ZERO/NONZERO FOR RESULT +/- ! 5791: GTNSI DIC +0 GENERAL INTEGER SAVE ! 5792: .IF .CNRA ! 5793: .ELSE ! 5794: GTNDF DAC 0 0/1 FOR DEC POINT SO FAR NO/YES ! 5795: GTNES DAC 0 ZERO/NONZERO EXPONENT +/- ! 5796: GTNEX DIC +0 REAL EXPONENT ! 5797: GTNSC DAC 0 SCALE (PLACES AFTER POINT) ! 5798: GTNSR DRC +0.0 GENERAL REAL SAVE ! 5799: GTNRD DAC 0 FLAG FOR OK REAL NUMBER ! 5800: .FI ! 5801: * ! 5802: * WORK AREAS FOR GTPAT PROCEDURE ! 5803: * ! 5804: GTPSB DAC 0 SAVE WB ! 5805: * ! 5806: * WORK AREAS FOR GTSTG PROCEDURE ! 5807: * ! 5808: GTSSF DAC 0 0/1 FOR RESULT +/- ! 5809: GTSVC DAC 0 SAVE WC ! 5810: GTSVB DAC 0 SAVE WB ! 5811: GTSWK DAC 0 PTR TO WORK AREA FOR GTSTG ! 5812: .IF .CNRA ! 5813: .ELSE ! 5814: GTSES DAC 0 CHAR + OR - FOR EXPONENT +/- ! 5815: GTSRS DRC +0.0 GENERAL REAL SAVE ! 5816: * ! 5817: * GLOBAL LOCATIONS (CONSTANTS) FOR GTSTG PROCEDURE ! 5818: * ! 5819: GTSRN DRC +0.0 ROUNDING FACTOR 0.5*10**-CFP$S ! 5820: GTSSC DRC +0.0 SCALING VALUE 10**CFP$S ! 5821: .FI ! 5822: * ! 5823: * WORK AREAS FOR GTVAR PROCEDURE ! 5824: * ! 5825: GTVRC DAC 0 SAVE WC ! 5826: * ! 5827: * FLAG FOR HEADER PRINTING ! 5828: * ! 5829: HEADP DAC 0 HEADER PRINTED FLAG ! 5830: * ! 5831: * GLOBAL VALUES FOR VARIABLE HASH TABLE ! 5832: * ! 5833: HSHNB DIC +0 NUMBER OF HASH BUCKETS ! 5834: HSHTB DAC 0 POINTER TO START OF VRBLK HASH TABL ! 5835: HSHTE DAC 0 POINTER PAST END OF VRBLK HASH TABL ! 5836: * ! 5837: * WORK AREA FOR INIT ! 5838: * ! 5839: INISS DAC 0 SAVE SUBROUTINE STACK PTR ! 5840: INITR DAC 0 SAVE TERMINAL FLAG ! 5841: .IF .CNBF ! 5842: .ELSE ! 5843: * ! 5844: * SAVE AREA FOR INSBF ! 5845: * ! 5846: INSAB DAC 0 ENTRY WA + ENTRY WB ! 5847: INSSA DAC 0 SAVE ENTRY WA ! 5848: INSSB DAC 0 SAVE ENTRY WB ! 5849: INSSC DAC 0 SAVE ENTRY WC ! 5850: .FI ! 5851: * ! 5852: * WORK AREAS FOR IOPUT ! 5853: * ! 5854: IOPTT DAC 0 TYPE OF ASSOCIATION ! 5855: EJC ! 5856: * ! 5857: * GLOBAL VALUES FOR KEYWORD VALUES WHICH ARE STORED AS ONE ! 5858: * WORD INTEGERS. THESE VALUES MUST BE ASSEMBLED IN THE ! 5859: * FOLLOWING ORDER (AS DICTATED BY K$XXX DEFINITION VALUES). ! 5860: * ! 5861: KVABE DAC 0 ABEND ! 5862: KVANC DAC 0 ANCHOR ! 5863: .IF .CULC ! 5864: KVCAS DAC 0 CASE ! 5865: .FI ! 5866: KVCOD DAC 0 CODE ! 5867: KVDMP DAC 0 DUMP ! 5868: KVERL DAC 0 ERRLIMIT ! 5869: KVERT DAC 0 ERRTYPE ! 5870: KVFTR DAC 0 FTRACE ! 5871: KVINP DAC 1 INPUT ! 5872: KVMXL DAC 5000 MAXLENGTH ! 5873: KVOUP DAC 1 OUTPUT ! 5874: .IF .CNPF ! 5875: .ELSE ! 5876: KVPFL DAC 0 PROFILE ! 5877: .FI ! 5878: KVTRA DAC 0 TRACE ! 5879: KVTRM DAC 0 TRIM ! 5880: KVFNC DAC 0 FNCLEVEL ! 5881: KVLST DAC 0 LASTNO ! 5882: KVSTN DAC 0 STNO ! 5883: * ! 5884: * GLOBAL VALUES FOR OTHER KEYWORDS ! 5885: * ! 5886: KVALP DAC 0 ALPHABET ! 5887: KVRTN DAC NULLS RTNTYPE (SCBLK POINTER) ! 5888: KVSTL DIC +50000 STLIMIT ! 5889: KVSTC DIC +50000 STCOUNT (COUNTS DOWN FROM STLIMIT) ! 5890: .IF .CNLD ! 5891: .ELSE ! 5892: * ! 5893: * WORK AREAS FOR LOAD FUNCTION ! 5894: * ! 5895: LODFN DAC 0 POINTER TO VRBLK FOR FUNC NAME ! 5896: LODNA DAC 0 COUNT NUMBER OF ARGUMENTS ! 5897: .FI ! 5898: * ! 5899: * GLOBAL VALUES FOR LISTR PROCEDURE ! 5900: * ! 5901: LSTLC DAC 0 COUNT LINES ON SOURCE LIST PAGE ! 5902: LSTNP DAC 0 MAX NUMBER OF LINES ON PAGE ! 5903: LSTPF DAC 1 SET NONZERO IF CURRENT IMAGE LISTED ! 5904: LSTPG DAC 0 CURRENT SOURCE LIST PAGE NUMBER ! 5905: LSTPO DAC 0 OFFSET TO PAGE NNN MESSAGE ! 5906: LSTSN DAC 0 REMEMBER LAST STMNUM LISTED ! 5907: * ! 5908: * MAXIMUM SIZE OF SPITBOL OBJECTS ! 5909: * ! 5910: MXLEN DAC 0 INITIALISED BY SYSMX CALL ! 5911: * ! 5912: * EXECUTION CONTROL VARIABLE ! 5913: * ! 5914: NOXEQ DAC 0 SET NON-ZERO TO INHIBIT EXECUTION ! 5915: .IF .CNPF ! 5916: .ELSE ! 5917: * ! 5918: * PROFILER GLOBAL VALUES AND WORK LOCATIONS ! 5919: * ! 5920: PFDMP DAC 0 SET NON-0 IF &PROFILE SET NON-0 ! 5921: PFFNC DAC 0 SET NON-0 IF FUNCT JUST ENTERED ! 5922: PFSTM DIC +0 TO STORE STARTING TIME OF STMT ! 5923: PFETM DIC +0 TO STORE ENDING TIME OF STMT ! 5924: PFSVW DAC 0 TO SAVE A W-REG ! 5925: PFTBL DAC 0 GETS ADRS OF (IMAG) TABLE BASE ! 5926: PFNTE DAC 0 NR OF TABLE ENTRIES ! 5927: PFSTE DIC +0 GETS INT REP OF TABLE ENTRY SIZE ! 5928: .FI ! 5929: * ! 5930: EJC ! 5931: * ! 5932: * GLOBAL VALUES USED IN PATTERN MATCH ROUTINES ! 5933: * ! 5934: PMDFL DAC 0 PATTERN ASSIGNMENT FLAG ! 5935: PMHBS DAC 0 HISTORY STACK BASE POINTER ! 5936: PMSSL DAC 0 LENGTH OF SUBJECT STRING IN CHARS ! 5937: * ! 5938: * FLAGS USED FOR STANDARD FILE LISTING OPTIONS ! 5939: * ! 5940: PRICH DAC 0 PRINTER ON INTERACTIVE CHANNEL ! 5941: PRSTD DAC 0 TESTED BY PRTPG ! 5942: PRSTO DAC 0 STANDARD LISTING OPTION FLAG ! 5943: * ! 5944: * GLOBAL VALUE FOR PRTNM PROCEDURE ! 5945: * ! 5946: PRNMV DAC 0 VRBLK PTR FROM LAST NAME SEARCH ! 5947: * ! 5948: * WORK AREAS FOR PRTNM PROCEDURE ! 5949: * ! 5950: PRNSI DIC +0 SCRATCH INTEGER LOC ! 5951: * ! 5952: * WORK AREAS FOR PRTSN PROCEDURE ! 5953: * ! 5954: PRSNA DAC 0 SAVE WA ! 5955: * ! 5956: * GLOBAL VALUES FOR PRINT PROCEDURES ! 5957: * ! 5958: PRBUF DAC 0 PTR TO PRINT BFR IN STATIC ! 5959: PRECL DAC 0 EXTENDED/COMPACT LISTING FLAG ! 5960: PRLEN DAC 0 LENGTH OF PRINT BUFFER IN CHARS ! 5961: PRLNW DAC 0 LENGTH OF PRINT BUFFER IN WORDS ! 5962: PROFS DAC 0 OFFSET TO NEXT LOCATION IN PRBUF ! 5963: PRTEF DAC 0 ENDFILE FLAG ! 5964: * ! 5965: * WORK AREAS FOR PRTST PROCEDURE ! 5966: * ! 5967: PRSVA DAC 0 SAVE WA ! 5968: PRSVB DAC 0 SAVE WB ! 5969: PRSVC DAC 0 SAVE CHAR COUNTER ! 5970: * ! 5971: * WORK AREA FOR PRTNL ! 5972: * ! 5973: PRTSA DAC 0 SAVE WA ! 5974: PRTSB DAC 0 SAVE WB ! 5975: * ! 5976: * WORK AREA FOR PRTVL ! 5977: * ! 5978: PRVSI DAC 0 SAVE IDVAL ! 5979: * ! 5980: * WORK AREAS FOR PATTERN MATCH ROUTINES ! 5981: * ! 5982: PSAVE DAC 0 TEMPORARY SAVE FOR CURRENT NODE PTR ! 5983: PSAVC DAC 0 SAVE CURSOR IN P$SPN, P$STR ! 5984: EJC ! 5985: * ! 5986: * AMOUNT OF MEMORY RESERVED FOR END OF EXECUTION ! 5987: * ! 5988: RSMEM DAC 0 RESERVE MEMORY ! 5989: * ! 5990: * WORK AREAS FOR RETRN ROUTINE ! 5991: * ! 5992: RTNBP DAC 0 TO SAVE A BLOCK POINTER ! 5993: RTNFV DAC 0 NEW FUNCTION VALUE (RESULT) ! 5994: RTNSV DAC 0 OLD FUNCTION VALUE (SAVED VALUE) ! 5995: * ! 5996: * RELOCATABLE GLOBAL VALUES ! 5997: * ! 5998: * ALL THE POINTERS IN THIS SECTION CAN POINT TO BLOCKS IN ! 5999: * THE DYNAMIC STORAGE AREA AND MUST BE RELOCATED BY THE ! 6000: * GARBAGE COLLECTOR. THEY ARE IDENTIFIED BY R$XXX NAMES. ! 6001: * ! 6002: R$AAA DAC 0 START OF RELOCATABLE VALUES ! 6003: R$ARF DAC 0 ARRAY BLOCK POINTER FOR ARREF ! 6004: R$CCB DAC 0 PTR TO CCBLK BEING BUILT (CDWRD) ! 6005: R$CIM DAC 0 PTR TO CURRENT COMPILER INPUT STR ! 6006: R$CMP DAC 0 COPY OF R$CIM USED IN CMPIL ! 6007: R$CNI DAC 0 PTR TO NEXT COMPILER INPUT STRING ! 6008: R$CNT DAC 0 CDBLK POINTER FOR SETEXIT CONTINUE ! 6009: R$COD DAC 0 POINTER TO CURRENT CDBLK OR EXBLK ! 6010: R$CTP DAC 0 PTR TO CURRENT CTBLK FOR PATST ! 6011: R$ERT DAC 0 TRBLK POINTER FOR ERRTYPE TRACE ! 6012: R$ETX DAC NULLS POINTER TO ERRTEXT STRING ! 6013: R$EXS DAC 0 = SAVE XL IN EXPDM ! 6014: R$FCB DAC 0 FCBLK CHAIN HEAD ! 6015: R$FNC DAC 0 TRBLK POINTER FOR FNCLEVEL TRACE ! 6016: R$GTC DAC 0 KEEP CODE PTR FOR GTCOD,GTEXP ! 6017: R$IO1 DAC 0 FILE ARG1 FOR IOPUT ! 6018: R$IO2 DAC 0 FILE ARG2 FOR IOPUT ! 6019: R$IOF DAC 0 FCBLK PTR OR 0 ! 6020: R$ION DAC 0 NAME BASE PTR ! 6021: R$IOP DAC 0 PREDECESSOR BLOCK PTR FOR IOPUT ! 6022: R$IOT DAC 0 TRBLK PTR FOR IOPUT ! 6023: .IF .CNBF ! 6024: .ELSE ! 6025: R$PMB DAC 0 BUFFER PTR IN PATTERN MATCH ! 6026: .FI ! 6027: R$PMS DAC 0 SUBJECT STRING PTR IN PATTERN MATCH ! 6028: R$RA2 DAC 0 REPLACE SECOND ARGUMENT LAST TIME ! 6029: R$RA3 DAC 0 REPLACE THIRD ARGUMENT LAST TIME ! 6030: R$RPT DAC 0 PTR TO CTBLK REPLACE TABLE LAST USD ! 6031: R$SCP DAC 0 SAVE POINTER FROM LAST SCANE CALL ! 6032: R$SXL DAC 0 PRESERVE XL IN SORTC ! 6033: R$SXR DAC 0 PRESERVE XR IN SORTA/SORTC ! 6034: R$STC DAC 0 TRBLK POINTER FOR STCOUNT TRACE ! 6035: R$STL DAC 0 SOURCE LISTING SUB-TITLE ! 6036: R$SXC DAC 0 CODE (CDBLK) PTR FOR SETEXIT TRAP ! 6037: R$TTL DAC NULLS SOURCE LISTING TITLE ! 6038: R$XSC DAC 0 STRING POINTER FOR XSCAN ! 6039: EJC ! 6040: * ! 6041: * THE REMAINING POINTERS IN THIS LIST ARE USED TO POINT ! 6042: * TO FUNCTION BLOCKS FOR NORMALLY UNDEFINED OPERATORS. ! 6043: * ! 6044: R$UBA DAC STNDO BINARY AT ! 6045: R$UBM DAC STNDO BINARY AMPERSAND ! 6046: R$UBN DAC STNDO BINARY NUMBER SIGN ! 6047: R$UBP DAC STNDO BINARY PERCENT ! 6048: R$UBT DAC STNDO BINARY NOT ! 6049: R$UUB DAC STNDO UNARY VERTICAL BAR ! 6050: R$UUE DAC STNDO UNARY EQUAL ! 6051: R$UUN DAC STNDO UNARY NUMBER SIGN ! 6052: R$UUP DAC STNDO UNARY PERCENT ! 6053: R$UUS DAC STNDO UNARY SLASH ! 6054: R$UUX DAC STNDO UNARY EXCLAMATION ! 6055: R$YYY DAC 0 LAST RELOCATABLE LOCATION ! 6056: * ! 6057: * WORK AREAS FOR SUBSTR FUNCTION (S$SUB) ! 6058: * ! 6059: SBSSV DAC 0 SAVE THIRD ARGUMENT ! 6060: * ! 6061: * GLOBAL LOCATIONS USED IN SCAN PROCEDURE ! 6062: * ! 6063: SCNBL DAC 0 SET NON-ZERO IF SCANNED PAST BLANKS ! 6064: SCNCC DAC 0 NON-ZERO TO SCAN CONTROL CARD NAME ! 6065: SCNGO DAC 0 SET NON-ZERO TO SCAN GOTO FIELD ! 6066: SCNIL DAC 0 LENGTH OF CURRENT INPUT IMAGE ! 6067: SCNPT DAC 0 POINTER TO NEXT LOCATION IN R$CIM ! 6068: SCNRS DAC 0 SET NON-ZERO TO SIGNAL RESCAN ! 6069: SCNTP DAC 0 SAVE SYNTAX TYPE FROM LAST CALL ! 6070: * ! 6071: * WORK AREAS FOR SCAN PROCEDURE ! 6072: * ! 6073: SCNSA DAC 0 SAVE WA ! 6074: SCNSB DAC 0 SAVE WB ! 6075: SCNSC DAC 0 SAVE WC ! 6076: SCNSE DAC 0 START OF CURRENT ELEMENT ! 6077: SCNOF DAC 0 SAVE OFFSET ! 6078: .IF .CNSR ! 6079: .ELSE ! 6080: EJC ! 6081: * ! 6082: * WORK AREA USED BY SORTA, SORTC, SORTF, SORTH ! 6083: * ! 6084: SRTDF DAC 0 DATATYPE FIELD NAME ! 6085: SRTFD DAC 0 FOUND DFBLK ADDRESS ! 6086: SRTFF DAC 0 FOUND FIELD NAME ! 6087: SRTFO DAC 0 OFFSET TO FIELD NAME ! 6088: SRTNR DAC 0 NUMBER OF ROWS ! 6089: SRTOF DAC 0 OFFSET WITHIN ROW TO SORT KEY ! 6090: SRTRT DAC 0 ROOT OFFSET ! 6091: SRTS1 DAC 0 SAVE OFFSET 1 ! 6092: SRTS2 DAC 0 SAVE OFFSET 2 ! 6093: SRTSC DAC 0 SAVE WC ! 6094: SRTSF DAC 0 SORT ARRAY FIRST ROW OFFSET ! 6095: SRTSN DAC 0 SAVE N ! 6096: SRTSO DAC 0 OFFSET TO A(0) ! 6097: SRTSR DAC 0 0 , NON-ZERO FOR SORT, RSORT ! 6098: SRTST DAC 0 STRIDE FROM ONE ROW TO NEXT ! 6099: SRTWC DAC 0 DUMP WC ! 6100: .FI ! 6101: * ! 6102: * GLOBAL VALUE FOR INDICATING STAGE (SEE ERROR SECTION) ! 6103: * ! 6104: STAGE DAC 0 INITIAL VALUE = INITIAL COMPILE ! 6105: * ! 6106: * GLOBAL VALUES DEFINING EXTENT OF STATIC AREA (ALOST) ! 6107: * ! 6108: STATB DAC 0 START OF STATIC AREA ! 6109: STATE DAC 0 END OF STATIC AREA ! 6110: EJC ! 6111: * ! 6112: * GLOBAL STACK POINTER ! 6113: * ! 6114: STBAS DAC 0 POINTER PAST STACK BASE ! 6115: * ! 6116: * WORK AREAS FOR STOPR ROUTINE ! 6117: * ! 6118: STPSI DIC +0 SAVE VALUE OF STCOUNT ! 6119: STPTI DIC +0 SAVE TIME ELAPSED ! 6120: * ! 6121: * GLOBAL VALUES FOR SETEXIT FUNCTION (S$STX) ! 6122: * ! 6123: STXOF DAC 0 FAILURE OFFSET ! 6124: STXVR DAC NULLS VRBLK POINTER OR NULL ! 6125: * ! 6126: * WORK AREAS FOR TFIND PROCEDURE ! 6127: * ! 6128: TFNSI DIC +0 NUMBER OF HEADERS ! 6129: * ! 6130: * GLOBAL VALUE FOR TIME KEEPING ! 6131: * ! 6132: TIMSX DIC +0 TIME AT START OF EXECUTION ! 6133: TIMUP DAC 0 SET WHEN TIME UP OCCURS ! 6134: * ! 6135: * WORK AREAS FOR XSCAN PROCEDURE ! 6136: * ! 6137: XSCRT DAC 0 SAVE RETURN CODE ! 6138: XSCWB DAC 0 SAVE REGISTER WB ! 6139: * ! 6140: * GLOBAL VALUES FOR XSCAN AND XSCNI PROCEDURES ! 6141: * ! 6142: XSOFS DAC 0 OFFSET TO CURRENT LOCATION IN R$XSC ! 6143: * ! 6144: * LABEL TO MARK END OF WORK AREA ! 6145: * ! 6146: YYYYY DAC 0 ! 6147: TTL S P I T B O L -- INITIALIZATION ! 6148: * ! 6149: * INITIALISATION ! 6150: * THE FOLLOWING SECTION RECEIVES CONTROL FROM THE SYSTEM ! 6151: * AT THE START OF A RUN WITH THE REGISTERS SET AS FOLLOWS. ! 6152: * ! 6153: * (XS) POINTS PAST STACK BASE ! 6154: * (XR) POINTS TO FIRST WORD OF DATA AREA ! 6155: * (XL) POINTS TO LAST WORD OF DATA AREA ! 6156: * ! 6157: SEC START OF PROGRAM SECTION ! 6158: JSR SYSTM INITIALISE TIMER ! 6159: .IF .CNBT ! 6160: STI TIMSX STORE TIME ! 6161: MOV XR,STATB START ADDRESS OF STATIC ! 6162: .ELSE ! 6163: * ! 6164: * INITIALISE WORK AREA (ESSENTIAL FOR BATCHED RUNS) ! 6165: * ! 6166: MOV XR,WB PRESERVE XR ! 6167: MOV =YYYYY,WA POINT TO END OF WORK AREA ! 6168: SUB =AAAAA,WA GET LENGTH OF WORK AREA ! 6169: BTW WA CONVERT TO WORDS ! 6170: LCT WA,WA COUNT FOR LOOP ! 6171: MOV =AAAAA,XR SET UP INDEX REGISTER ! 6172: * ! 6173: * CLEAR WORK SPACE ! 6174: * ! 6175: INI01 ZER (XR)+ CLEAR A WORD ! 6176: BCT WA,INI01 LOOP TILL DONE ! 6177: MOV =STNDO,WA UNDEFINED OPERATORS POINTER ! 6178: MOV =R$YYY,WC POINT TO TABLE END ! 6179: SUB =R$UBA,WC LENGTH OF UNDEF. OPERATORS TABLE ! 6180: BTW WC CONVERT TO WORDS ! 6181: LCT WC,WC LOOP COUNTER ! 6182: MOV =R$UBA,XR SET UP XR ! 6183: * ! 6184: * SET CORRECT VALUE INTO UNDEFINED OPERATORS TABLE ! 6185: * ! 6186: INI02 MOV WA,(XR)+ STORE VALUE ! 6187: BCT WC,INI02 LOOP TILL ALL DONE ! 6188: MOV =NUM01,WA GET A 1 ! 6189: MOV WA,CMPSN STATEMENT NO ! 6190: MOV WA,CSWFL NOFAIL ! 6191: MOV WA,CSWLS LIST ! 6192: MOV WA,KVINP INPUT ! 6193: MOV WA,KVOUP OUTPUT ! 6194: MOV WA,LSTPF NOTHING FOR LISTR YET ! 6195: MOV =INILN,WA INPUT IMAGE LENGTH ! 6196: MOV WA,CSWIN -IN72 ! 6197: MOV =B$KVT,DMPKB DUMP ! 6198: MOV =TRBKV,DMPKT DUMP ! 6199: MOV =P$LEN,EVLIN EVAL ! 6200: EJC ! 6201: MOV =NULLS,WA GET NULLSTRING POINTER ! 6202: MOV WA,KVRTN RETURN ! 6203: MOV WA,R$ETX ERRTEXT ! 6204: MOV WA,R$TTL TITLE FOR LISTING ! 6205: MOV WA,STXVR SETEXIT ! 6206: STI TIMSX STORE TIME IN CORRECT PLACE ! 6207: LDI STLIM GET DEFAULT STLIMIT ! 6208: STI KVSTL STATEMENT LIMIT ! 6209: STI KVSTC STATEMENT COUNT ! 6210: MOV WB,STATB STORE START ADRS OF STATIC ! 6211: .FI ! 6212: MOV *E$SRS,RSMEM RESERVE MEMORY ! 6213: MOV XS,STBAS STORE STACK BASE ! 6214: SSS INISS SAVE S-R STACK PTR ! 6215: * ! 6216: * NOW CONVERT FREE STORE PERCENTAGE TO A SUITABLE FACTOR ! 6217: * FOR EASY TESTING IN ALLOC ROUTINE. ! 6218: * ! 6219: LDI INTVH GET 100 ! 6220: DVI ALFSP FORM 100 / ALFSP ! 6221: STI ALFSF STORE THE FACTOR ! 6222: .IF .CNRA ! 6223: .ELSE ! 6224: * ! 6225: * INITIALIZE VALUES FOR REAL CONVERSION ROUTINE ! 6226: * ! 6227: LCT WB,=CFP$S LOAD COUNTER FOR SIGNIFICANT DIGITS ! 6228: LDR REAV1 LOAD 1.0 ! 6229: * ! 6230: * LOOP TO COMPUTE 10**(MAX NUMBER SIGNIFICANT DIGITS) ! 6231: * ! 6232: INI03 MLR REAVT * 10.0 ! 6233: BCT WB,INI03 LOOP TILL DONE ! 6234: STR GTSSC STORE 10**(MAX SIG DIGITS) ! 6235: LDR REAP5 LOAD 0.5 ! 6236: DVR GTSSC COMPUTE 0.5*10**(MAX SIG DIGITS) ! 6237: STR GTSRN STORE AS ROUNDING BIAS ! 6238: .FI ! 6239: ZER WC SET TO READ PARAMETERS ! 6240: JSR PRPAR READ THEM ! 6241: EJC ! 6242: * ! 6243: * NOW COMPUTE STARTING ADDRESS FOR DYNAMIC STORE AND IF ! 6244: * NECESSARY REQUEST MORE MEMORY. ! 6245: * ! 6246: SUB *E$SRS,XL ALLOW FOR RESERVE MEMORY ! 6247: MOV PRLEN,WA GET PRINT BUFFER LENGTH ! 6248: ADD =CFP$A,WA ADD NO. OF CHARS IN ALPHABET ! 6249: ADD =NSTMX,WA ADD CHARS FOR GTSTG BFR ! 6250: CTB WA,8 CONVERT TO BYTES, ALLOWING A MARGIN ! 6251: MOV STATB,XR POINT TO STATIC BASE ! 6252: ADD WA,XR INCREMENT FOR ABOVE BUFFERS ! 6253: ADD *E$HNB,XR INCREMENT FOR HASH TABLE ! 6254: ADD *E$STS,XR BUMP FOR INITIAL STATIC BLOCK ! 6255: JSR SYSMX GET MXLEN ! 6256: MOV WA,KVMXL PROVISIONALLY STORE AS MAXLNGTH ! 6257: MOV WA,MXLEN AND AS MXLEN ! 6258: BGT XR,WA,INI06 SKIP IF STATIC HI EXCEEDS MXLEN ! 6259: MOV WA,XR USE MXLEN INSTEAD ! 6260: ICA XR MAKE BIGGER THAN MXLEN ! 6261: * ! 6262: * HERE TO STORE VALUES WHICH MARK INITIAL DIVISION ! 6263: * OF DATA AREA INTO STATIC AND DYNAMIC ! 6264: * ! 6265: INI06 MOV XR,DNAMB DYNAMIC BASE ADRS ! 6266: MOV XR,DNAMP DYNAMIC PTR ! 6267: BNZ WA,INI07 SKIP IF NON-ZERO MXLEN ! 6268: DCA XR POINT A WORD IN FRONT ! 6269: MOV XR,KVMXL USE AS MAXLNGTH ! 6270: MOV XR,MXLEN AND AS MXLEN ! 6271: EJC ! 6272: * ! 6273: * LOOP HERE IF NECESSARY TILL ENOUGH MEMORY OBTAINED ! 6274: * SO THAT DNAME IS ABOVE DNAMB ! 6275: * ! 6276: INI07 MOV XL,DNAME STORE DYNAMIC END ADDRESS ! 6277: BLT DNAMB,XL,INI09 SKIP IF HIGH ENOUGH ! 6278: JSR SYSMM REQUEST MORE MEMORY ! 6279: WTB XR GET AS BAUS (SGD05) ! 6280: ADD XR,XL BUMP BY AMOUNT OBTAINED ! 6281: BNZ XR,INI07 TRY AGAIN ! 6282: MOV =ENDMO,XR POINT TO FAILURE MESSAGE ! 6283: MOV ENDML,WA MESSAGE LENGTH ! 6284: JSR SYSPR PRINT IT (PRTST NOT YET USABLE) ! 6285: PPM SHOULD NOT FAIL ! 6286: JSR SYSEJ PACK UP (STOPR NOT YET USABLE) ! 6287: * ! 6288: * INITIALISE PRINT BUFFER WITH BLANK WORDS ! 6289: * ! 6290: INI09 MOV PRLEN,WC NO. OF CHARS IN PRINT BFR ! 6291: MOV STATB,XR POINT TO STATIC AGAIN ! 6292: MOV XR,PRBUF PRINT BFR IS PUT AT STATIC START ! 6293: MOV =B$SCL,(XR)+ STORE STRING TYPE CODE ! 6294: MOV WC,(XR)+ AND STRING LENGTH ! 6295: CTW WC,0 GET NUMBER OF WORDS IN BUFFER ! 6296: MOV WC,PRLNW STORE FOR BUFFER CLEAR ! 6297: LCT WC,WC WORDS TO CLEAR ! 6298: * ! 6299: * LOOP TO CLEAR BUFFER ! 6300: * ! 6301: INI10 MOV NULLW,(XR)+ STORE BLANK ! 6302: BCT WC,INI10 LOOP ! 6303: * ! 6304: * INITIALIZE NUMBER OF HASH HEADERS ! 6305: * ! 6306: MOV =E$HNB,WA GET NUMBER OF HASH HEADERS ! 6307: MTI WA CONVERT TO INTEGER ! 6308: STI HSHNB STORE FOR USE BY GTNVR PROCEDURE ! 6309: LCT WA,WA COUNTER FOR CLEARING HASH TABLE ! 6310: MOV XR,HSHTB POINTER TO HASH TABLE ! 6311: * ! 6312: * LOOP TO CLEAR HASH TABLE ! 6313: * ! 6314: INI11 ZER (XR)+ BLANK A WORD ! 6315: BCT WA,INI11 LOOP ! 6316: MOV XR,HSHTE END OF HASH TABLE ADRS IS KEPT ! 6317: * ! 6318: * ALLOCATE WORK AREA FOR GTSTG CONVERSION PROCEDURE ! 6319: * ! 6320: MOV =NSTMX,WA GET MAX NUM CHARS IN OUTPUT NUMBER ! 6321: CTB WA,SCSI$ NO OF BYTES NEEDED ! 6322: MOV XR,GTSWK STORE BFR ADRS ! 6323: ADD WA,XR BUMP FOR WORK BFR ! 6324: EJC ! 6325: * ! 6326: * BUILD ALPHABET STRING FOR ALPHABET KEYWORD AND REPLACE ! 6327: * ! 6328: MOV XR,KVALP SAVE ALPHABET POINTER ! 6329: MOV =B$SCL,(XR) STRING BLK TYPE ! 6330: MOV =CFP$A,WC NO OF CHARS IN ALPHABET ! 6331: MOV WC,SCLEN(XR) STORE AS STRING LENGTH ! 6332: MOV WC,WB COPY CHAR COUNT ! 6333: CTB WB,SCSI$ NO. OF BYTES NEEDED ! 6334: ADD XR,WB CURRENT END ADDRESS FOR STATIC ! 6335: MOV WB,STATE STORE STATIC END ADRS ! 6336: LCT WC,WC LOOP COUNTER ! 6337: PSC XR POINT TO CHARS OF STRING ! 6338: ZER WB SET INITIAL CHARACTER VALUE ! 6339: * ! 6340: * LOOP TO ENTER CHARACTER CODES IN ORDER ! 6341: * ! 6342: INI12 SCH WB,(XR)+ STORE NEXT CODE ! 6343: ICV WB BUMP CODE VALUE ! 6344: BCT WC,INI12 LOOP TILL ALL STORED ! 6345: CSC XR COMPLETE STORE CHARACTERS ! 6346: * ! 6347: * INITIALIZE VARIABLE BLOCKS FOR INPUT AND OUTPUT ! 6348: * ! 6349: MOV =V$INP,XL POINT TO STRING /INPUT/ ! 6350: MOV =TRTIN,WB TRBLK TYPE FOR INPUT ! 6351: JSR INOUT PERFORM INPUT ASSOCIATION ! 6352: MOV =V$OUP,XL POINT TO STRING /OUTPUT/ ! 6353: MOV =TRTOU,WB TRBLK TYPE FOR OUTPUT ! 6354: JSR INOUT PERFORM OUTPUT ASSOCIATION ! 6355: MOV INITR,WC TERMINAL FLAG ! 6356: BZE WC,INI13 SKIP IF NO TERMINAL ! 6357: JSR PRPAR ASSOCIATE TERMINAL ! 6358: EJC ! 6359: * ! 6360: * CHECK FOR EXPIRY DATE ! 6361: * ! 6362: INI13 JSR SYSDC CALL DATE CHECK ! 6363: MOV XS,FLPTR IN CASE STACK OVERFLOWS IN COMPILER ! 6364: * ! 6365: * NOW COMPILE SOURCE INPUT CODE ! 6366: * ! 6367: JSR CMPIL CALL COMPILER ! 6368: MOV XR,R$COD SET PTR TO FIRST CODE BLOCK ! 6369: MOV =NULLS,R$TTL FORGET TITLE (REG04) ! 6370: MOV =NULLS,R$STL FORGET SUB-TITLE (REG04) ! 6371: ZER R$CIM FORGET COMPILER INPUT IMAGE ! 6372: ZER XL CLEAR DUD VALUE ! 6373: ZER WB DONT SHIFT DYNAMIC STORE UP ! 6374: JSR GBCOL CLEAR GARBAGE LEFT FROM COMPILE ! 6375: BNZ CPSTS,INIX0 SKIP IF NO LISTING OF COMP STATS ! 6376: JSR PRTPG EJECT PAGE ! 6377: * ! 6378: * PRINT COMPILE STATISTICS ! 6379: * ! 6380: MOV DNAMP,WA NEXT AVAILABLE LOC ! 6381: SUB STATB,WA MINUS START ! 6382: BTW WA CONVERT TO WORDS ! 6383: MTI WA CONVERT TO INTEGER ! 6384: MOV =ENCM1,XR POINT TO /MEMORY USED (WORDS)/ ! 6385: JSR PRTMI PRINT MESSAGE ! 6386: MOV DNAME,WA END OF MEMORY ! 6387: SUB DNAMP,WA MINUS NEXT AVAILABLE LOC ! 6388: BTW WA CONVERT TO WORDS ! 6389: MTI WA CONVERT TO INTEGER ! 6390: MOV =ENCM2,XR POINT TO /MEMORY AVAILABLE (WORDS)/ ! 6391: JSR PRTMI PRINT LINE ! 6392: MTI CMERC GET COUNT OF ERRORS AS INTEGER ! 6393: MOV =ENCM3,XR POINT TO /COMPILE ERRORS/ ! 6394: JSR PRTMI PRINT IT ! 6395: MTI GBCNT GARBAGE COLLECTION COUNT ! 6396: SBI INTV1 ADJUST FOR UNAVOIDABLE COLLECT ! 6397: MOV =STPM5,XR POINT TO /STORAGE REGENERATIONS/ ! 6398: JSR PRTMI PRINT GBCOL COUNT ! 6399: JSR SYSTM GET TIME ! 6400: SBI TIMSX GET COMPILATION TIME ! 6401: MOV =ENCM4,XR POINT TO COMPILATION TIME (MSEC)/ ! 6402: JSR PRTMI PRINT MESSAGE ! 6403: ADD =NUM05,LSTLC BUMP LINE COUNT ! 6404: .IF .CUEJ ! 6405: BZE HEADP,INIX0 NO EJECT IF NOTHING PRINTED (SDG11) ! 6406: JSR PRTPG EJECT PRINTER ! 6407: .FI ! 6408: EJC ! 6409: * ! 6410: * PREPARE NOW TO START EXECUTION ! 6411: * ! 6412: * SET DEFAULT INPUT RECORD LENGTH ! 6413: * ! 6414: INIX0 BGT CSWIN,=INILN,INIX1 SKIP IF NOT DEFAULT -IN72 USED ! 6415: MOV =INILS,CSWIN ELSE USE DEFAULT RECORD LENGTH ! 6416: * ! 6417: * RESET TIMER ! 6418: * ! 6419: INIX1 JSR SYSTM GET TIME AGAIN ! 6420: STI TIMSX STORE FOR END RUN PROCESSING ! 6421: ADD CSWEX,NOXEQ ADD -NOEXECUTE FLAG ! 6422: BNZ NOXEQ,INIX2 JUMP IF EXECUTION SUPPRESSED ! 6423: ZER GBCNT INITIALISE COLLECT COUNT ! 6424: JSR SYSBX CALL BEFORE STARTING EXECUTION ! 6425: .IF .CUEJ ! 6426: .ELSE ! 6427: BZE HEADP,INIY0 NO EJECT IF NOTHING PRINTED (SGD11) ! 6428: JSR PRTPG EJECT PRINTER ! 6429: .FI ! 6430: * ! 6431: * MERGE WHEN LISTING FILE SET FOR EXECUTION ! 6432: * ! 6433: INIY0 MNZ HEADP MARK HEADERS OUT REGARDLESS ! 6434: ZER -(XS) SET FAILURE LOCATION ON STACK ! 6435: MOV XS,FLPTR SAVE PTR TO FAILURE OFFSET WORD ! 6436: MOV R$COD,XR LOAD PTR TO ENTRY CODE BLOCK ! 6437: MOV =STGXT,STAGE SET STAGE FOR EXECUTE TIME ! 6438: .IF .CNPF ! 6439: .ELSE ! 6440: MOV CMPSN,PFNTE COPY STMTS COMPILED COUNT IN CASE ! 6441: JSR SYSTM TIME YET AGAIN ! 6442: STI PFSTM ! 6443: .FI ! 6444: BRI (XR) START XEQ WITH FIRST STATEMENT ! 6445: * ! 6446: * HERE IF EXECUTION IS SUPPRESSED ! 6447: * ! 6448: INIX2 JSR PRTNL PRINT A BLANK LINE ! 6449: MOV =ENCM5,XR POINT TO /EXECUTION SUPPRESSED/ ! 6450: JSR PRTST PRINT STRING ! 6451: JSR PRTNL OUTPUT LINE ! 6452: ZER WA SET ABEND VALUE TO ZERO ! 6453: MOV =NINI9,WB SET SPECIAL CODE VALUE ! 6454: JSR SYSEJ END OF JOB, EXIT TO SYSTEM ! 6455: TTL S P I T B O L -- SNOBOL4 OPERATOR ROUTINES ! 6456: * ! 6457: * THIS SECTION INCLUDES ALL ROUTINES WHICH CAN BE ACCESSED ! 6458: * DIRECTLY FROM THE GENERATED CODE EXCEPT SYSTEM FUNCTIONS. ! 6459: * ! 6460: * ALL ROUTINES IN THIS SECTION START WITH A LABEL OF THE ! 6461: * FORM O$XXX WHERE XXX IS THREE LETTERS. THE GENERATED CODE ! 6462: * CONTAINS A POINTER TO THE APPROPRIATE ENTRY LABEL. ! 6463: * ! 6464: * SINCE THE GENERAL FORM OF THE GENERATED CODE CONSISTS OF ! 6465: * POINTERS TO BLOCKS WHOSE FIRST WORD IS THE ADDRESS OF THE ! 6466: * ACTUAL ENTRY POINT LABEL (O$XXX). ! 6467: * ! 6468: * THESE ROUTINES ARE IN ALPHABETICAL ORDER BY THEIR ! 6469: * ENTRY LABEL NAMES (I.E. BY THE XXX OF THE O$XXX NAME) ! 6470: * ! 6471: * THESE ROUTINES RECEIVE CONTROL AS FOLLOWS ! 6472: * ! 6473: * (CP) POINTER TO NEXT CODE WORD ! 6474: * (XS) CURRENT STACK POINTER ! 6475: EJC ! 6476: * ! 6477: * BINARY PLUS (ADDITION) ! 6478: * ! 6479: O$ADD ENT ENTRY POINT ! 6480: JSR ARITH FETCH ARITHMETIC OPERANDS ! 6481: ERR 001,ADDITION LEFT OPERAND IS NOT NUMERIC ! 6482: ERR 002,ADDITION RIGHT OPERAND IS NOT NUMERIC ! 6483: .IF .CNRA ! 6484: .ELSE ! 6485: PPM OADD1 JUMP IF REAL OPERANDS ! 6486: .FI ! 6487: * ! 6488: * HERE TO ADD TWO INTEGERS ! 6489: * ! 6490: ADI ICVAL(XL) ADD RIGHT OPERAND TO LEFT ! 6491: INO EXINT RETURN INTEGER IF NO OVERFLOW ! 6492: ERB 003,ADDITION CAUSED INTEGER OVERFLOW ! 6493: .IF .CNRA ! 6494: .ELSE ! 6495: * ! 6496: * HERE TO ADD TWO REALS ! 6497: * ! 6498: OADD1 ADR RCVAL(XL) ADD RIGHT OPERAND TO LEFT ! 6499: RNO EXREA RETURN REAL IF NO OVERFLOW ! 6500: ERB 261,ADDITION CAUSED REAL OVERFLOW ! 6501: .FI ! 6502: EJC ! 6503: * ! 6504: * UNARY PLUS (AFFIRMATION) ! 6505: * ! 6506: O$AFF ENT ENTRY POINT ! 6507: MOV (XS)+,XR LOAD OPERAND ! 6508: JSR GTNUM CONVERT TO NUMERIC ! 6509: ERR 004,AFFIRMATION OPERAND IS NOT NUMERIC ! 6510: BRN EXIXR RETURN IF CONVERTED TO NUMERIC ! 6511: EJC ! 6512: * ! 6513: * BINARY BAR (ALTERNATION) ! 6514: * ! 6515: O$ALT ENT ENTRY POINT ! 6516: MOV (XS)+,XR LOAD RIGHT OPERAND ! 6517: JSR GTPAT CONVERT TO PATTERN ! 6518: ERR 005,ALTERNATION RIGHT OPERAND IS NOT PATTERN ! 6519: * ! 6520: * MERGE HERE FROM SPECIAL (LEFT ALTERNATION) CASE ! 6521: * ! 6522: OALT1 MOV =P$ALT,WB SET PCODE FOR ALTERNATIVE NODE ! 6523: JSR PBILD BUILD ALTERNATIVE NODE ! 6524: MOV XR,XL SAVE ADDRESS OF ALTERNATIVE NODE ! 6525: MOV (XS)+,XR LOAD LEFT OPERAND ! 6526: JSR GTPAT CONVERT TO PATTERN ! 6527: ERR 006,ALTERNATION LEFT OPERAND IS NOT PATTERN ! 6528: BEQ XR,=P$ALT,OALT2 JUMP IF LEFT ARG IS ALTERNATION ! 6529: MOV XR,PTHEN(XL) SET LEFT OPERAND AS SUCCESSOR ! 6530: MOV XL,XR MOVE RESULT TO PROPER REGISTER ! 6531: BRN EXIXR JUMP FOR NEXT CODE WORD ! 6532: * ! 6533: * COME HERE IF LEFT ARGUMENT IS ITSELF AN ALTERNATION ! 6534: * ! 6535: * THE RESULT IS MORE EFFICIENT IF WE MAKE THE REPLACEMENT ! 6536: * ! 6537: * (A / B) / C = A / (B / C) ! 6538: * ! 6539: OALT2 MOV PARM1(XR),PTHEN(XL) BUILD THE (B / C) NODE ! 6540: MOV PTHEN(XR),-(XS) SET A AS NEW LEFT ARG ! 6541: MOV XL,XR SET (B / C) AS NEW RIGHT ARG ! 6542: BRN OALT1 MERGE BACK TO BUILD A / (B / C) ! 6543: EJC ! 6544: * ! 6545: * ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY NAME) ! 6546: * ! 6547: O$AMN ENT ENTRY POINT ! 6548: LCW XR LOAD NUMBER OF SUBSCRIPTS ! 6549: MOV XR,WB SET FLAG FOR BY NAME ! 6550: BRN ARREF JUMP TO ARRAY REFERENCE ROUTINE ! 6551: EJC ! 6552: * ! 6553: * ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY VALUE) ! 6554: * ! 6555: O$AMV ENT ENTRY POINT ! 6556: LCW XR LOAD NUMBER OF SUBSCRIPTS ! 6557: ZER WB SET FLAG FOR BY VALUE ! 6558: BRN ARREF JUMP TO ARRAY REFERENCE ROUTINE ! 6559: EJC ! 6560: * ! 6561: * ARRAY REFERENCE (ONE SUBSCRIPT, BY NAME) ! 6562: * ! 6563: O$AON ENT ENTRY POINT ! 6564: MOV (XS),XR LOAD SUBSCRIPT VALUE ! 6565: MOV 1(XS),XL LOAD ARRAY VALUE ! 6566: MOV (XL),WA LOAD FIRST WORD OF ARRAY OPERAND ! 6567: BEQ WA,=B$VCT,OAON2 JUMP IF VECTOR REFERENCE ! 6568: BEQ WA,=B$TBT,OAON3 JUMP IF TABLE REFERENCE ! 6569: * ! 6570: * HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE ! 6571: * ! 6572: OAON1 MOV =NUM01,XR SET NUMBER OF SUBSCRIPTS TO ONE ! 6573: MOV XR,WB SET FLAG FOR BY NAME ! 6574: BRN ARREF JUMP TO ARRAY REFERENCE ROUTINE ! 6575: * ! 6576: * HERE IF WE HAVE A VECTOR REFERENCE ! 6577: * ! 6578: OAON2 BNE (XR),=B$ICL,OAON1 USE LONG ROUTINE IF NOT INTEGER ! 6579: LDI ICVAL(XR) LOAD INTEGER SUBSCRIPT VALUE ! 6580: MFI WA,EXFAL COPY AS ADDRESS INT, FAIL IF OVFLO ! 6581: BZE WA,EXFAL FAIL IF ZERO ! 6582: ADD =VCVLB,WA COMPUTE OFFSET IN WORDS ! 6583: WTB WA CONVERT TO BYTES ! 6584: MOV WA,(XS) COMPLETE NAME ON STACK ! 6585: BLT WA,VCLEN(XL),EXITS EXIT IF SUBSCRIPT NOT TOO LARGE ! 6586: BRN EXFAL ELSE FAIL ! 6587: * ! 6588: * HERE FOR TABLE REFERENCE ! 6589: * ! 6590: OAON3 MNZ WB SET FLAG FOR NAME REFERENCE ! 6591: JSR TFIND LOCATE/CREATE TABLE ELEMENT ! 6592: PPM EXFAL FAIL IF ACCESS FAILS ! 6593: MOV XL,1(XS) STORE NAME BASE ON STACK ! 6594: MOV WA,(XS) STORE NAME OFFSET ON STACK ! 6595: BRN EXITS EXIT WITH RESULT ON STACK ! 6596: EJC ! 6597: * ! 6598: * ARRAY REFERENCE (ONE SUBSCRIPT, BY VALUE) ! 6599: * ! 6600: O$AOV ENT ENTRY POINT ! 6601: MOV (XS)+,XR LOAD SUBSCRIPT VALUE ! 6602: MOV (XS)+,XL LOAD ARRAY VALUE ! 6603: MOV (XL),WA LOAD FIRST WORD OF ARRAY OPERAND ! 6604: BEQ WA,=B$VCT,OAOV2 JUMP IF VECTOR REFERENCE ! 6605: BEQ WA,=B$TBT,OAOV3 JUMP IF TABLE REFERENCE ! 6606: * ! 6607: * HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE ! 6608: * ! 6609: OAOV1 MOV XL,-(XS) RESTACK ARRAY VALUE ! 6610: MOV XR,-(XS) RESTACK SUBSCRIPT ! 6611: MOV =NUM01,XR SET NUMBER OF SUBSCRIPTS TO ONE ! 6612: ZER WB SET FLAG FOR VALUE CALL ! 6613: BRN ARREF JUMP TO ARRAY REFERENCE ROUTINE ! 6614: * ! 6615: * HERE IF WE HAVE A VECTOR REFERENCE ! 6616: * ! 6617: OAOV2 BNE (XR),=B$ICL,OAOV1 USE LONG ROUTINE IF NOT INTEGER ! 6618: LDI ICVAL(XR) LOAD INTEGER SUBSCRIPT VALUE ! 6619: MFI WA,EXFAL MOVE AS ONE WORD INT, FAIL IF OVFLO ! 6620: BZE WA,EXFAL FAIL IF ZERO ! 6621: ADD =VCVLB,WA COMPUTE OFFSET IN WORDS ! 6622: WTB WA CONVERT TO BYTES ! 6623: BGE WA,VCLEN(XL),EXFAL FAIL IF SUBSCRIPT TOO LARGE ! 6624: JSR ACESS ACCESS VALUE ! 6625: PPM EXFAL FAIL IF ACCESS FAILS ! 6626: BRN EXIXR ELSE RETURN VALUE TO CALLER ! 6627: * ! 6628: * HERE FOR TABLE REFERENCE BY VALUE ! 6629: * ! 6630: OAOV3 ZER WB SET FLAG FOR VALUE REFERENCE ! 6631: JSR TFIND CALL TABLE SEARCH ROUTINE ! 6632: PPM EXFAL FAIL IF ACCESS FAILS ! 6633: BRN EXIXR EXIT WITH RESULT IN XR ! 6634: EJC ! 6635: * ! 6636: * ASSIGNMENT ! 6637: * ! 6638: O$ASS ENT ENTRY POINT ! 6639: * ! 6640: * O$RPL (PATTERN REPLACEMENT) MERGES HERE ! 6641: * ! 6642: OASS0 MOV (XS)+,WB LOAD VALUE TO BE ASSIGNED ! 6643: MOV (XS)+,WA LOAD NAME OFFSET ! 6644: MOV (XS),XL LOAD NAME BASE ! 6645: MOV WB,(XS) STORE ASSIGNED VALUE AS RESULT ! 6646: JSR ASIGN PERFORM ASSIGNMENT ! 6647: PPM EXFAL FAIL IF ASSIGNMENT FAILS ! 6648: BRN EXITS EXIT WITH RESULT ON STACK ! 6649: EJC ! 6650: * ! 6651: * COMPILATION ERROR ! 6652: * ! 6653: O$CER ENT ENTRY POINT ! 6654: ERB 007,COMPILATION ERROR ENCOUNTERED DURING EXECUTION ! 6655: EJC ! 6656: * ! 6657: * UNARY AT (CURSOR ASSIGNMENT) ! 6658: * ! 6659: O$CAS ENT ENTRY POINT ! 6660: MOV (XS)+,WC LOAD NAME OFFSET (PARM2) ! 6661: MOV (XS)+,XR LOAD NAME BASE (PARM1) ! 6662: MOV =P$CAS,WB SET PCODE FOR CURSOR ASSIGNMENT ! 6663: JSR PBILD BUILD NODE ! 6664: BRN EXIXR JUMP FOR NEXT CODE WORD ! 6665: EJC ! 6666: * ! 6667: * CONCATENATION ! 6668: * ! 6669: O$CNC ENT ENTRY POINT ! 6670: MOV (XS),XR LOAD RIGHT ARGUMENT ! 6671: BEQ XR,=NULLS,OCNC3 JUMP IF RIGHT ARG IS NULL ! 6672: MOV 1(XS),XL LOAD LEFT ARGUMENT ! 6673: BEQ XL,=NULLS,OCNC4 JUMP IF LEFT ARGUMENT IS NULL ! 6674: MOV =B$SCL,WA GET CONSTANT TO TEST FOR STRING ! 6675: BNE WA,(XL),OCNC2 JUMP IF LEFT ARG NOT A STRING ! 6676: BNE WA,(XR),OCNC2 JUMP IF RIGHT ARG NOT A STRING ! 6677: * ! 6678: * MERGE HERE TO CONCATENATE TWO STRINGS ! 6679: * ! 6680: OCNC1 MOV SCLEN(XL),WA LOAD LEFT ARGUMENT LENGTH ! 6681: ADD SCLEN(XR),WA COMPUTE RESULT LENGTH ! 6682: JSR ALOCS ALLOCATE SCBLK FOR RESULT ! 6683: MOV XR,1(XS) STORE RESULT PTR OVER LEFT ARGUMENT ! 6684: PSC XR PREPARE TO STORE CHARS OF RESULT ! 6685: MOV SCLEN(XL),WA GET NUMBER OF CHARS IN LEFT ARG ! 6686: PLC XL PREPARE TO LOAD LEFT ARG CHARS ! 6687: MVC MOVE CHARACTERS OF LEFT ARGUMENT ! 6688: MOV (XS)+,XL LOAD RIGHT ARG POINTER, POP STACK ! 6689: MOV SCLEN(XL),WA LOAD NUMBER OF CHARS IN RIGHT ARG ! 6690: PLC XL PREPARE TO LOAD RIGHT ARG CHARS ! 6691: MVC MOVE CHARACTERS OF RIGHT ARGUMENT ! 6692: BRN EXITS EXIT WITH RESULT ON STACK ! 6693: * ! 6694: * COME HERE IF ARGUMENTS ARE NOT BOTH STRINGS ! 6695: * ! 6696: OCNC2 JSR GTSTG CONVERT RIGHT ARG TO STRING ! 6697: PPM OCNC5 JUMP IF RIGHT ARG IS NOT STRING ! 6698: MOV XR,XL SAVE RIGHT ARG PTR ! 6699: JSR GTSTG CONVERT LEFT ARG TO STRING ! 6700: PPM OCNC6 JUMP IF LEFT ARG IS NOT A STRING ! 6701: MOV XR,-(XS) STACK LEFT ARGUMENT ! 6702: MOV XL,-(XS) STACK RIGHT ARGUMENT ! 6703: MOV XR,XL MOVE LEFT ARG TO PROPER REG ! 6704: MOV (XS),XR MOVE RIGHT ARG TO PROPER REG ! 6705: BRN OCNC1 MERGE BACK TO CONCATENATE STRINGS ! 6706: EJC ! 6707: * ! 6708: * CONCATENATION (CONTINUED) ! 6709: * ! 6710: * COME HERE FOR NULL RIGHT ARGUMENT ! 6711: * ! 6712: OCNC3 ICA XS REMOVE RIGHT ARG FROM STACK ! 6713: BRN EXITS RETURN WITH LEFT ARGUMENT ON STACK ! 6714: * ! 6715: * HERE FOR NULL LEFT ARGUMENT ! 6716: * ! 6717: OCNC4 ICA XS UNSTACK ONE ARGUMENT ! 6718: MOV XR,(XS) STORE RIGHT ARGUMENT ! 6719: BRN EXITS EXIT WITH RESULT ON STACK ! 6720: * ! 6721: * HERE IF RIGHT ARGUMENT IS NOT A STRING ! 6722: * ! 6723: OCNC5 MOV XR,XL MOVE RIGHT ARGUMENT PTR ! 6724: MOV (XS)+,XR LOAD LEFT ARG POINTER ! 6725: * ! 6726: * MERGE HERE WHEN LEFT ARGUMENT IS NOT A STRING ! 6727: * ! 6728: OCNC6 JSR GTPAT CONVERT LEFT ARG TO PATTERN ! 6729: ERR 008,CONCATENATION LEFT OPND IS NOT STRING OR PATTERN ! 6730: MOV XR,-(XS) SAVE RESULT ON STACK ! 6731: MOV XL,XR POINT TO RIGHT OPERAND ! 6732: JSR GTPAT CONVERT TO PATTERN ! 6733: ERR 009,CONCATENATION RIGHT OPD IS NOT STRING OR PATTERN ! 6734: MOV XR,XL MOVE FOR PCONC ! 6735: MOV (XS)+,XR RELOAD LEFT OPERAND PTR ! 6736: JSR PCONC CONCATENATE PATTERNS ! 6737: BRN EXIXR EXIT WITH RESULT IN XR ! 6738: EJC ! 6739: * ! 6740: * COMPLEMENTATION ! 6741: * ! 6742: O$COM ENT ENTRY POINT ! 6743: MOV (XS)+,XR LOAD OPERAND ! 6744: MOV (XR),WA LOAD TYPE WORD ! 6745: * ! 6746: * MERGE BACK HERE AFTER CONVERSION ! 6747: * ! 6748: OCOM1 BEQ WA,=B$ICL,OCOM2 JUMP IF INTEGER ! 6749: .IF .CNRA ! 6750: .ELSE ! 6751: BEQ WA,=B$RCL,OCOM3 JUMP IF REAL ! 6752: .FI ! 6753: JSR GTNUM ELSE CONVERT TO NUMERIC ! 6754: ERR 010,COMPLEMENTATION OPERAND IS NOT NUMERIC ! 6755: BRN OCOM1 BACK TO CHECK CASES ! 6756: * ! 6757: * HERE TO COMPLEMENT INTEGER ! 6758: * ! 6759: OCOM2 LDI ICVAL(XR) LOAD INTEGER VALUE ! 6760: NGI NEGATE ! 6761: INO EXINT RETURN INTEGER IF NO OVERFLOW ! 6762: ERB 011,COMPLEMENTATION CAUSED INTEGER OVERFLOW ! 6763: .IF .CNRA ! 6764: .ELSE ! 6765: * ! 6766: * HERE TO COMPLEMENT REAL ! 6767: * ! 6768: OCOM3 LDR RCVAL(XR) LOAD REAL VALUE ! 6769: NGR NEGATE ! 6770: BRN EXREA RETURN REAL RESULT ! 6771: .FI ! 6772: EJC ! 6773: * ! 6774: * BINARY SLASH (DIVISION) ! 6775: * ! 6776: O$DVD ENT ENTRY POINT ! 6777: JSR ARITH FETCH ARITHMETIC OPERANDS ! 6778: ERR 012,DIVISION LEFT OPERAND IS NOT NUMERIC ! 6779: ERR 013,DIVISION RIGHT OPERAND IS NOT NUMERIC ! 6780: .IF .CNRA ! 6781: .ELSE ! 6782: PPM ODVD2 JUMP IF REAL OPERANDS ! 6783: .FI ! 6784: * ! 6785: * HERE TO DIVIDE TWO INTEGERS ! 6786: * ! 6787: DVI ICVAL(XL) DIVIDE LEFT OPERAND BY RIGHT ! 6788: INO EXINT RESULT OK IF NO OVERFLOW ! 6789: ERB 014,DIVISION CAUSED INTEGER OVERFLOW ! 6790: .IF .CNRA ! 6791: .ELSE ! 6792: * ! 6793: * HERE TO DIVIDE TWO REALS ! 6794: * ! 6795: ODVD2 DVR RCVAL(XL) DIVIDE LEFT OPERAND BY RIGHT ! 6796: RNO EXREA RETURN REAL IF NO OVERFLOW ! 6797: ERB 262,DIVISION CAUSED REAL OVERFLOW ! 6798: .FI ! 6799: EJC ! 6800: * ! 6801: * EXPONENTIATION ! 6802: * ! 6803: O$EXP ENT ENTRY POINT ! 6804: MOV (XS)+,XR LOAD EXPONENT ! 6805: JSR GTNUM CONVERT TO NUMBER ! 6806: ERR 015,EXPONENTIATION RIGHT OPERAND IS NOT NUMERIC ! 6807: .IF .CNRA ! 6808: .ELSE ! 6809: BNE WA,=B$ICL,OEXP7 JUMP IF REAL ! 6810: .FI ! 6811: MOV XR,XL MOVE EXPONENT ! 6812: MOV (XS)+,XR LOAD BASE ! 6813: JSR GTNUM CONVERT TO NUMERIC ! 6814: ERR 016,EXPONENTIATION LEFT OPERAND IS NOT NUMERIC ! 6815: LDI ICVAL(XL) LOAD EXPONENT ! 6816: ILT OEXP8 ERROR IF NEGATIVE EXPONENT ! 6817: .IF .CNRA ! 6818: .ELSE ! 6819: BEQ WA,=B$RCL,OEXP3 JUMP IF BASE IS REAL ! 6820: .FI ! 6821: * ! 6822: * HERE TO EXPONENTIATE AN INTEGER ! 6823: * ! 6824: MFI WA,OEXP2 CONVERT EXPONENT TO 1 WORD INTEGER ! 6825: LCT WA,WA SET LOOP COUNTER ! 6826: LDI INTV1 LOAD INITIAL VALUE OF 1 ! 6827: BNZ WA,OEXP1 JUMP IF NON-ZERO EXPONENT ! 6828: INE EXINT GIVE ZERO AS RESULT FOR NONZERO**0 ! 6829: BRN OEXP4 ELSE ERROR OF 0**0 ! 6830: * ! 6831: * LOOP TO PERFORM EXPONENTIATION ! 6832: * ! 6833: OEXP1 MLI ICVAL(XR) MULTIPLY BY BASE ! 6834: IOV OEXP2 JUMP IF OVERFLOW ! 6835: BCT WA,OEXP1 LOOP BACK TILL COMPUTATION COMPLETE ! 6836: BRN EXINT THEN RETURN INTEGER RESULT ! 6837: * ! 6838: * HERE IF INTEGER OVERFLOW ! 6839: * ! 6840: OEXP2 ERB 017,EXPONENTIATION CAUSED INTEGER OVERFLOW ! 6841: EJC ! 6842: * ! 6843: * EXPONENTIATION (CONTINUED) ! 6844: .IF .CNRA ! 6845: .ELSE ! 6846: * ! 6847: * HERE TO EXPONENTIATE A REAL ! 6848: * ! 6849: OEXP3 MFI WA,OEXP6 CONVERT EXPONENT TO ONE WORD ! 6850: LCT WA,WA SET LOOP COUNTER ! 6851: LDR REAV1 LOAD 1.0 AS INITIAL VALUE ! 6852: BNZ WA,OEXP5 JUMP IF NON-ZERO EXPONENT ! 6853: RNE EXREA RETURN 1.0 IF NONZERO**ZERO ! 6854: .FI ! 6855: * ! 6856: * HERE FOR ERROR OF 0**0 OR 0.0**0 ! 6857: * ! 6858: OEXP4 ERB 018,EXPONENTIATION RESULT IS UNDEFINED ! 6859: .IF .CNRA ! 6860: .ELSE ! 6861: * ! 6862: * LOOP TO PERFORM EXPONENTIATION ! 6863: * ! 6864: OEXP5 MLR RCVAL(XR) MULTIPLY BY BASE ! 6865: ROV OEXP6 JUMP IF OVERFLOW ! 6866: BCT WA,OEXP5 LOOP TILL COMPUTATION COMPLETE ! 6867: BRN EXREA THEN RETURN REAL RESULT ! 6868: * ! 6869: * HERE IF REAL OVERFLOW ! 6870: * ! 6871: OEXP6 ERB 266,EXPONENTIATION CAUSED REAL OVERFLOW ! 6872: * ! 6873: * HERE IF REAL EXPONENT ! 6874: * ! 6875: OEXP7 ERB 267,EXPONENTIATION RIGHT OPERAND IS REAL NOT INTEGER ! 6876: .FI ! 6877: * ! 6878: * HERE FOR NEGATIVE EXPONENT ! 6879: * ! 6880: OEXP8 ERB 019,EXPONENTIATION RIGHT OPERAND IS NEGATIVE ! 6881: EJC ! 6882: * ! 6883: * FAILURE IN EXPRESSION EVALUATION ! 6884: * ! 6885: * THIS ENTRY POINT IS USED IF THE EVALUATION OF AN ! 6886: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, FAILS. ! 6887: * CONTROL IS RETURNED TO AN APPROPRIATE POINT IN EVALX. ! 6888: * ! 6889: O$FEX ENT ENTRY POINT ! 6890: BRN EVLX6 JUMP TO FAILURE LOC IN EVALX ! 6891: EJC ! 6892: * ! 6893: * FAILURE DURING EVALUATION OF A COMPLEX OR DIRECT GOTO ! 6894: * ! 6895: O$FIF ENT ENTRY POINT ! 6896: ERB 020,GOTO EVALUATION FAILURE ! 6897: EJC ! 6898: * ! 6899: * FUNCTION CALL (MORE THAN ONE ARGUMENT) ! 6900: * ! 6901: O$FNC ENT ENTRY POINT ! 6902: LCW WA LOAD NUMBER OF ARGUMENTS ! 6903: LCW XR LOAD FUNCTION VRBLK POINTER ! 6904: MOV VRFNC(XR),XL LOAD FUNCTION POINTER ! 6905: BNE WA,FARGS(XL),CFUNC USE CENTRAL ROUTINE IF WRONG NUM ! 6906: BRI (XL) JUMP TO FUNCTION IF ARG COUNT OK ! 6907: EJC ! 6908: * ! 6909: * FUNCTION NAME ERROR ! 6910: * ! 6911: O$FNE ENT ENTRY POINT ! 6912: LCW WA GET NEXT CODE WORD ! 6913: BNE WA,=ORNM$,OFNE1 FAIL IF NOT EVALUATING EXPRESSION ! 6914: BZE 2(XS),EVLX3 OK IF EXPR. WAS WANTED BY VALUE ! 6915: * ! 6916: * HERE FOR ERROR ! 6917: * ! 6918: OFNE1 ERB 021,FUNCTION CALLED BY NAME RETURNED A VALUE ! 6919: EJC ! 6920: * ! 6921: * FUNCTION CALL (SINGLE ARGUMENT) ! 6922: * ! 6923: O$FNS ENT ENTRY POINT ! 6924: LCW XR LOAD FUNCTION VRBLK POINTER ! 6925: MOV =NUM01,WA SET NUMBER OF ARGUMENTS TO ONE ! 6926: MOV VRFNC(XR),XL LOAD FUNCTION POINTER ! 6927: BNE WA,FARGS(XL),CFUNC USE CENTRAL ROUTINE IF WRONG NUM ! 6928: BRI (XL) JUMP TO FUNCTION IF ARG COUNT OK ! 6929: EJC ! 6930: * CALL TO UNDEFINED FUNCTION ! 6931: * ! 6932: O$FUN ENT ENTRY POINT ! 6933: ERB 022,UNDEFINED FUNCTION CALLED ! 6934: EJC ! 6935: * ! 6936: * EXECUTE COMPLEX GOTO ! 6937: * ! 6938: O$GOC ENT ENTRY POINT ! 6939: MOV 1(XS),XR LOAD NAME BASE POINTER ! 6940: BHI XR,STATE,OGOC1 JUMP IF NOT NATURAL VARIABLE ! 6941: ADD *VRTRA,XR ELSE POINT TO VRTRA FIELD ! 6942: BRI (XR) AND JUMP THROUGH IT ! 6943: * ! 6944: * HERE IF GOTO OPERAND IS NOT NATURAL VARIABLE ! 6945: * ! 6946: OGOC1 ERB 023,GOTO OPERAND IS NOT A NATURAL VARIABLE ! 6947: EJC ! 6948: * ! 6949: * EXECUTE DIRECT GOTO ! 6950: * ! 6951: O$GOD ENT ENTRY POINT ! 6952: MOV (XS),XR LOAD OPERAND ! 6953: MOV (XR),WA LOAD FIRST WORD ! 6954: BEQ WA,=B$CDS,BCDS0 JUMP IF CODE BLOCK TO CODE ROUTINE ! 6955: BEQ WA,=B$CDC,BCDC0 JUMP IF CODE BLOCK TO CODE ROUTINE ! 6956: ERB 024,GOTO OPERAND IN DIRECT GOTO IS NOT CODE ! 6957: EJC ! 6958: * ! 6959: * SET GOTO FAILURE TRAP ! 6960: * ! 6961: * THIS ROUTINE IS EXECUTED AT THE START OF A COMPLEX OR ! 6962: * DIRECT FAILURE GOTO TO TRAP A SUBSEQUENT FAIL (SEE EXFAL) ! 6963: * ! 6964: O$GOF ENT ENTRY POINT ! 6965: MOV FLPTR,XR POINT TO FAIL OFFSET ON STACK ! 6966: ICA (XR) POINT FAILURE TO O$FIF WORD ! 6967: ICP POINT TO NEXT CODE WORD ! 6968: BRN EXITS EXIT TO CONTINUE ! 6969: EJC ! 6970: * ! 6971: * BINARY DOLLAR (IMMEDIATE ASSIGNMENT) ! 6972: * ! 6973: * THE PATTERN BUILT BY BINARY DOLLAR IS A COMPOUND PATTERN. ! 6974: * SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR ! 6975: * DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED. ! 6976: * ! 6977: O$IMA ENT ENTRY POINT ! 6978: MOV =P$IMC,WB SET PCODE FOR LAST NODE ! 6979: MOV (XS)+,WC POP NAME OFFSET (PARM2) ! 6980: MOV (XS)+,XR POP NAME BASE (PARM1) ! 6981: JSR PBILD BUILD P$IMC NODE ! 6982: MOV XR,XL SAVE PTR TO NODE ! 6983: MOV (XS),XR LOAD LEFT ARGUMENT ! 6984: JSR GTPAT CONVERT TO PATTERN ! 6985: ERR 025,IMMEDIATE ASSIGNMENT LEFT OPERAND IS NOT PATTERN ! 6986: MOV XR,(XS) SAVE PTR TO LEFT OPERAND PATTERN ! 6987: MOV =P$IMA,WB SET PCODE FOR FIRST NODE ! 6988: JSR PBILD BUILD P$IMA NODE ! 6989: MOV (XS)+,PTHEN(XR) SET LEFT OPERAND AS P$IMA SUCCESSOR ! 6990: JSR PCONC CONCATENATE TO FORM FINAL PATTERN ! 6991: BRN EXIXR ALL DONE ! 6992: EJC ! 6993: * ! 6994: * INDIRECTION (BY NAME) ! 6995: * ! 6996: O$INN ENT ENTRY POINT ! 6997: MNZ WB SET FLAG FOR RESULT BY NAME ! 6998: BRN INDIR JUMP TO COMMON ROUTINE ! 6999: EJC ! 7000: * ! 7001: * INTERROGATION ! 7002: * ! 7003: O$INT ENT ENTRY POINT ! 7004: MOV =NULLS,(XS) REPLACE OPERAND WITH NULL ! 7005: BRN EXITS EXIT FOR NEXT CODE WORD ! 7006: EJC ! 7007: * ! 7008: * INDIRECTION (BY VALUE) ! 7009: * ! 7010: O$INV ENT ENTRY POINT ! 7011: ZER WB SET FLAG FOR BY VALUE ! 7012: BRN INDIR JUMP TO COMMON ROUTINE ! 7013: EJC ! 7014: * ! 7015: * KEYWORD REFERENCE (BY NAME) ! 7016: * ! 7017: O$KWN ENT ENTRY POINT ! 7018: JSR KWNAM GET KEYWORD NAME ! 7019: BRN EXNAM EXIT WITH RESULT NAME ! 7020: EJC ! 7021: * ! 7022: * KEYWORD REFERENCE (BY VALUE) ! 7023: * ! 7024: O$KWV ENT ENTRY POINT ! 7025: JSR KWNAM GET KEYWORD NAME ! 7026: MOV XR,DNAMP DELETE KVBLK ! 7027: JSR ACESS ACCESS VALUE ! 7028: PPM EXNUL DUMMY (UNUSED) FAILURE RETURN ! 7029: BRN EXIXR JUMP WITH VALUE IN XR ! 7030: EJC ! 7031: * ! 7032: * LOAD EXPRESSION BY NAME ! 7033: * ! 7034: O$LEX ENT ENTRY POINT ! 7035: MOV *EVSI$,WA SET SIZE OF EVBLK ! 7036: JSR ALLOC ALLOCATE SPACE FOR EVBLK ! 7037: MOV =B$EVT,(XR) SET TYPE WORD ! 7038: MOV =TRBEV,EVVAR(XR) SET DUMMY TRBLK POINTER ! 7039: LCW WA LOAD EXBLK POINTER ! 7040: MOV WA,EVEXP(XR) SET EXBLK POINTER ! 7041: MOV XR,XL MOVE NAME BASE TO PROPER REG ! 7042: MOV *EVVAR,WA SET NAME OFFSET = ZERO ! 7043: BRN EXNAM EXIT WITH NAME IN (XL,WA) ! 7044: EJC ! 7045: * ! 7046: * LOAD PATTERN VALUE ! 7047: * ! 7048: O$LPT ENT ENTRY POINT ! 7049: LCW XR LOAD PATTERN POINTER ! 7050: BRN EXIXR STACK PTR AND OBEY NEXT CODE WORD ! 7051: EJC ! 7052: * ! 7053: * LOAD VARIABLE NAME ! 7054: * ! 7055: O$LVN ENT ENTRY POINT ! 7056: LCW WA LOAD VRBLK POINTER ! 7057: MOV WA,-(XS) STACK VRBLK PTR (NAME BASE) ! 7058: MOV *VRVAL,-(XS) STACK NAME OFFSET ! 7059: BRN EXITS EXIT WITH RESULT ON STACK ! 7060: EJC ! 7061: * ! 7062: * BINARY ASTERISK (MULTIPLICATION) ! 7063: * ! 7064: O$MLT ENT ENTRY POINT ! 7065: JSR ARITH FETCH ARITHMETIC OPERANDS ! 7066: ERR 026,MULTIPLICATION LEFT OPERAND IS NOT NUMERIC ! 7067: ERR 027,MULTIPLICATION RIGHT OPERAND IS NOT NUMERIC ! 7068: .IF .CNRA ! 7069: .ELSE ! 7070: PPM OMLT1 JUMP IF REAL OPERANDS ! 7071: .FI ! 7072: * ! 7073: * HERE TO MULTIPLY TWO INTEGERS ! 7074: * ! 7075: MLI ICVAL(XL) MULTIPLY LEFT OPERAND BY RIGHT ! 7076: INO EXINT RETURN INTEGER IF NO OVERFLOW ! 7077: ERB 028,MULTIPLICATION CAUSED INTEGER OVERFLOW ! 7078: .IF .CNRA ! 7079: .ELSE ! 7080: * ! 7081: * HERE TO MULTIPLY TWO REALS ! 7082: * ! 7083: OMLT1 MLR RCVAL(XL) MULTIPLY LEFT OPERAND BY RIGHT ! 7084: RNO EXREA RETURN REAL IF NO OVERFLOW ! 7085: ERB 263,MULTIPLICATION CAUSED REAL OVERFLOW ! 7086: .FI ! 7087: EJC ! 7088: * ! 7089: * NAME REFERENCE ! 7090: * ! 7091: O$NAM ENT ENTRY POINT ! 7092: MOV *NMSI$,WA SET LENGTH OF NMBLK ! 7093: JSR ALLOC ALLOCATE NMBLK ! 7094: MOV =B$NML,(XR) SET NAME BLOCK CODE ! 7095: MOV (XS)+,NMOFS(XR) SET NAME OFFSET FROM OPERAND ! 7096: MOV (XS)+,NMBAS(XR) SET NAME BASE FROM OPERAND ! 7097: BRN EXIXR EXIT WITH RESULT IN XR ! 7098: EJC ! 7099: * ! 7100: * NEGATION ! 7101: * ! 7102: * INITIAL ENTRY ! 7103: * ! 7104: O$NTA ENT ENTRY POINT ! 7105: LCW WA LOAD NEW FAILURE OFFSET ! 7106: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER ! 7107: MOV WA,-(XS) STACK NEW FAILURE OFFSET ! 7108: MOV XS,FLPTR SET NEW FAILURE POINTER ! 7109: BRN EXITS JUMP TO CONTINUE EXECUTION ! 7110: * ! 7111: * ENTRY AFTER SUCCESSFUL EVALUATION OF OPERAND ! 7112: * ! 7113: O$NTB ENT ENTRY POINT ! 7114: MOV 2(XS),FLPTR RESTORE OLD FAILURE POINTER ! 7115: BRN EXFAL AND FAIL ! 7116: * ! 7117: * ENTRY FOR FAILURE DURING OPERAND EVALUATION ! 7118: * ! 7119: O$NTC ENT ENTRY POINT ! 7120: ICA XS POP FAILURE OFFSET ! 7121: MOV (XS)+,FLPTR RESTORE OLD FAILURE POINTER ! 7122: BRN EXNUL EXIT GIVING NULL RESULT ! 7123: EJC ! 7124: * ! 7125: * USE OF UNDEFINED OPERATOR ! 7126: * ! 7127: O$OUN ENT ENTRY POINT ! 7128: ERB 029,UNDEFINED OPERATOR REFERENCED ! 7129: EJC ! 7130: * ! 7131: * BINARY DOT (PATTERN ASSIGNMENT) ! 7132: * ! 7133: * THE PATTERN BUILT BY BINARY DOT IS A COMPOUND PATTERN. ! 7134: * SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR ! 7135: * DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED. ! 7136: * ! 7137: O$PAS ENT ENTRY POINT ! 7138: MOV =P$PAC,WB LOAD PCODE FOR P$PAC NODE ! 7139: MOV (XS)+,WC LOAD NAME OFFSET (PARM2) ! 7140: MOV (XS)+,XR LOAD NAME BASE (PARM1) ! 7141: JSR PBILD BUILD P$PAC NODE ! 7142: MOV XR,XL SAVE PTR TO NODE ! 7143: MOV (XS),XR LOAD LEFT OPERAND ! 7144: JSR GTPAT CONVERT TO PATTERN ! 7145: ERR 030,PATTERN ASSIGNMENT LEFT OPERAND IS NOT PATTERN ! 7146: MOV XR,(XS) SAVE PTR TO LEFT OPERAND PATTERN ! 7147: MOV =P$PAA,WB SET PCODE FOR P$PAA NODE ! 7148: JSR PBILD BUILD P$PAA NODE ! 7149: MOV (XS)+,PTHEN(XR) SET LEFT OPERAND AS P$PAA SUCCESSOR ! 7150: JSR PCONC CONCATENATE TO FORM FINAL PATTERN ! 7151: BRN EXIXR JUMP FOR NEXT CODE WORD ! 7152: EJC ! 7153: * ! 7154: * PATTERN MATCH (BY NAME, FOR REPLACEMENT) ! 7155: * ! 7156: O$PMN ENT ENTRY POINT ! 7157: ZER WB SET TYPE CODE FOR MATCH BY NAME ! 7158: BRN MATCH JUMP TO ROUTINE TO START MATCH ! 7159: EJC ! 7160: * ! 7161: * PATTERN MATCH (STATEMENT) ! 7162: * ! 7163: * O$PMS IS USED IN PLACE OF O$PMV WHEN THE PATTERN MATCH ! 7164: * OCCURS AT THE OUTER (STATEMENT) LEVEL SINCE IN THIS ! 7165: * CASE THE SUBSTRING VALUE NEED NOT BE CONSTRUCTED. ! 7166: * ! 7167: O$PMS ENT ENTRY POINT ! 7168: MOV =NUM02,WB SET FLAG FOR STATEMENT TO MATCH ! 7169: BRN MATCH JUMP TO ROUTINE TO START MATCH ! 7170: EJC ! 7171: * ! 7172: * PATTERN MATCH (BY VALUE) ! 7173: * ! 7174: O$PMV ENT ENTRY POINT ! 7175: MOV =NUM01,WB SET TYPE CODE FOR VALUE MATCH ! 7176: BRN MATCH JUMP TO ROUTINE TO START MATCH ! 7177: EJC ! 7178: * ! 7179: * POP TOP ITEM ON STACK ! 7180: * ! 7181: O$POP ENT ENTRY POINT ! 7182: ICA XS POP TOP STACK ENTRY ! 7183: BRN EXITS OBEY NEXT CODE WORD ! 7184: EJC ! 7185: * ! 7186: * TERMINATE EXECUTION (CODE COMPILED FOR END STATEMENT) ! 7187: * ! 7188: O$STP ENT ENTRY POINT ! 7189: BRN LEND0 JUMP TO END CIRCUIT ! 7190: EJC ! 7191: * ! 7192: * RETURN NAME FROM EXPRESSION ! 7193: * THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN ! 7194: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS ! 7195: * A NAME. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX. ! 7196: * ! 7197: O$RNM ENT ENTRY POINT ! 7198: BRN EVLX4 RETURN TO EVALX PROCEDURE ! 7199: EJC ! 7200: * ! 7201: * PATTERN REPLACEMENT ! 7202: * ! 7203: * WHEN THIS ROUTINE GETS CONTROL, THE FOLLOWING STACK ! 7204: * ENTRIES HAVE BEEN MADE (SEE END OF MATCH ROUTINE P$NTH) ! 7205: * ! 7206: * SUBJECT NAME BASE ! 7207: * SUBJECT NAME OFFSET ! 7208: * INITIAL CURSOR VALUE ! 7209: * FINAL CURSOR VALUE ! 7210: * SUBJECT POINTER ! 7211: * (XS) ---------------- REPLACEMENT VALUE ! 7212: * ! 7213: O$RPL ENT ENTRY POINT ! 7214: JSR GTSTG CONVERT REPLACEMENT VAL TO STRING ! 7215: ERR 031,PATTERN REPLACEMENT RIGHT OPERAND IS NOT STRING ! 7216: * ! 7217: * GET RESULT LENGTH AND ALLOCATE RESULT SCBLK ! 7218: * ! 7219: MOV (XS),XL LOAD SUBJECT STRING POINTER ! 7220: .IF .CNBF ! 7221: .ELSE ! 7222: BEQ (XL),=B$BCT,ORPL4 BRANCH IF BUFFER ASSIGNMENT ! 7223: .FI ! 7224: ADD SCLEN(XL),WA ADD SUBJECT STRING LENGTH ! 7225: ADD 2(XS),WA ADD STARTING CURSOR ! 7226: SUB 1(XS),WA MINUS FINAL CURSOR = TOTAL LENGTH ! 7227: BZE WA,ORPL3 JUMP IF RESULT IS NULL ! 7228: MOV XR,-(XS) RESTACK REPLACEMENT STRING ! 7229: JSR ALOCS ALLOCATE SCBLK FOR RESULT ! 7230: MOV 3(XS),WA GET INITIAL CURSOR (PART 1 LEN) ! 7231: MOV XR,3(XS) STACK RESULT POINTER ! 7232: PSC XR POINT TO CHARACTERS OF RESULT ! 7233: * ! 7234: * MOVE PART 1 (START OF SUBJECT) TO RESULT ! 7235: * ! 7236: BZE WA,ORPL1 JUMP IF FIRST PART IS NULL ! 7237: MOV 1(XS),XL ELSE POINT TO SUBJECT STRING ! 7238: PLC XL POINT TO SUBJECT STRING CHARS ! 7239: MVC MOVE FIRST PART TO RESULT ! 7240: EJC ! 7241: * PATTERN REPLACEMENT (CONTINUED) ! 7242: * ! 7243: * NOW MOVE IN REPLACEMENT VALUE ! 7244: * ! 7245: ORPL1 MOV (XS)+,XL LOAD REPLACEMENT STRING, POP ! 7246: MOV SCLEN(XL),WA LOAD LENGTH ! 7247: BZE WA,ORPL2 JUMP IF NULL REPLACEMENT ! 7248: PLC XL ELSE POINT TO CHARS OF REPLACEMENT ! 7249: MVC MOVE IN CHARS (PART 2) ! 7250: * ! 7251: * NOW MOVE IN REMAINDER OF STRING (PART 3) ! 7252: * ! 7253: ORPL2 MOV (XS)+,XL LOAD SUBJECT STRING POINTER, POP ! 7254: MOV (XS)+,WC LOAD FINAL CURSOR, POP ! 7255: MOV SCLEN(XL),WA LOAD SUBJECT STRING LENGTH ! 7256: SUB WC,WA MINUS FINAL CURSOR = PART 3 LENGTH ! 7257: BZE WA,OASS0 JUMP TO ASSIGN IF PART 3 IS NULL ! 7258: PLC XL,WC ELSE POINT TO LAST PART OF STRING ! 7259: MVC MOVE PART 3 TO RESULT ! 7260: BRN OASS0 JUMP TO PERFORM ASSIGNMENT ! 7261: * ! 7262: * HERE IF RESULT IS NULL ! 7263: * ! 7264: ORPL3 ADD *NUM02,XS POP SUBJECT STR PTR, FINAL CURSOR ! 7265: MOV =NULLS,(XS) SET NULL RESULT ! 7266: BRN OASS0 JUMP TO ASSIGN NULL VALUE ! 7267: .IF .CNBF ! 7268: .ELSE ! 7269: * ! 7270: * HERE FOR BUFFER SUBSTRING ASSIGNMENT ! 7271: * ! 7272: ORPL4 MOV XR,XL COPY SCBLK REPLACEMENT PTR ! 7273: MOV (XS)+,XR UNSTACK BCBLK PTR ! 7274: MOV (XS)+,WB GET FINAL CURSOR VALUE ! 7275: MOV (XS)+,WA GET INITIAL CURSOR ! 7276: SUB WA,WB GET LENGTH IN WB ! 7277: ADD *NUM02,XS GET RID OF NAME BASE/OFFSET ! 7278: JSR INSBF INSERT SUBSTRING ! 7279: PPM CONVERT FAIL IMPOSSIBLE ! 7280: PPM EXFAL FAIL IF INSERT FAILS ! 7281: BRN EXNUL ELSE NULL RESULT ! 7282: .FI ! 7283: EJC ! 7284: * ! 7285: * RETURN VALUE FROM EXPRESSION ! 7286: * ! 7287: * THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN ! 7288: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS ! 7289: * A VALUE. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX ! 7290: * ! 7291: O$RVL ENT ENTRY POINT ! 7292: BRN EVLX3 RETURN TO EVALX PROCEDURE ! 7293: EJC ! 7294: * ! 7295: * SELECTION ! 7296: * ! 7297: * INITIAL ENTRY ! 7298: * ! 7299: O$SLA ENT ENTRY POINT ! 7300: LCW WA LOAD NEW FAILURE OFFSET ! 7301: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER ! 7302: MOV WA,-(XS) STACK NEW FAILURE OFFSET ! 7303: MOV XS,FLPTR SET NEW FAILURE POINTER ! 7304: BRN EXITS JUMP TO EXECUTE FIRST ALTERNATIVE ! 7305: * ! 7306: * ENTRY AFTER SUCCESSFUL EVALUATION OF ALTERNATIVE ! 7307: * ! 7308: O$SLB ENT ENTRY POINT ! 7309: MOV (XS)+,XR LOAD RESULT ! 7310: ICA XS POP FAIL OFFSET ! 7311: MOV (XS),FLPTR RESTORE OLD FAILURE POINTER ! 7312: MOV XR,(XS) RESTACK RESULT ! 7313: LCW WA LOAD NEW CODE OFFSET ! 7314: ADD R$COD,WA POINT TO ABSOLUTE CODE LOCATION ! 7315: LCP WA SET NEW CODE POINTER ! 7316: BRN EXITS JUMP TO CONTINUE PAST SELECTION ! 7317: * ! 7318: * ENTRY AT START OF SUBSEQUENT ALTERNATIVES ! 7319: * ! 7320: O$SLC ENT ENTRY POINT ! 7321: LCW WA LOAD NEW FAIL OFFSET ! 7322: MOV WA,(XS) STORE NEW FAIL OFFSET ! 7323: BRN EXITS JUMP TO EXECUTE NEXT ALTERNATIVE ! 7324: * ! 7325: * ENTRY AT START OF LAST ALTERNATIVE ! 7326: * ! 7327: O$SLD ENT ENTRY POINT ! 7328: ICA XS POP FAILURE OFFSET ! 7329: MOV (XS)+,FLPTR RESTORE OLD FAILURE POINTER ! 7330: BRN EXITS JUMP TO EXECUTE LAST ALTERNATIVE ! 7331: EJC ! 7332: * ! 7333: * BINARY MINUS (SUBTRACTION) ! 7334: * ! 7335: O$SUB ENT ENTRY POINT ! 7336: JSR ARITH FETCH ARITHMETIC OPERANDS ! 7337: ERR 032,SUBTRACTION LEFT OPERAND IS NOT NUMERIC ! 7338: ERR 033,SUBTRACTION RIGHT OPERAND IS NOT NUMERIC ! 7339: .IF .CNRA ! 7340: .ELSE ! 7341: PPM OSUB1 JUMP IF REAL OPERANDS ! 7342: .FI ! 7343: * ! 7344: * HERE TO SUBTRACT TWO INTEGERS ! 7345: * ! 7346: SBI ICVAL(XL) SUBTRACT RIGHT OPERAND FROM LEFT ! 7347: INO EXINT RETURN INTEGER IF NO OVERFLOW ! 7348: ERB 034,SUBTRACTION CAUSED INTEGER OVERFLOW ! 7349: .IF .CNRA ! 7350: .ELSE ! 7351: * ! 7352: * HERE TO SUBTRACT TWO REALS ! 7353: * ! 7354: OSUB1 SBR RCVAL(XL) SUBTRACT RIGHT OPERAND FROM LEFT ! 7355: RNO EXREA RETURN REAL IF NO OVERFLOW ! 7356: ERB 264,SUBTRACTION CAUSED REAL OVERFLOW ! 7357: .FI ! 7358: EJC ! 7359: * ! 7360: * DUMMY OPERATOR TO RETURN CONTROL TO TRXEQ PROCEDURE ! 7361: * ! 7362: O$TXR ENT ENTRY POINT ! 7363: BRN TRXQ1 JUMP INTO TRXEQ PROCEDURE ! 7364: EJC ! 7365: * ! 7366: * UNEXPECTED FAILURE ! 7367: * ! 7368: * NOTE THAT IF A SETEXIT TRAP IS OPERATING THEN ! 7369: * TRANSFER TO SYSTEM LABEL CONTINUE ! 7370: * WILL RESULT IN LOOPING HERE. DIFFICULT TO AVOID EXCEPT ! 7371: * WITH A CONSIDERABLE OVERHEAD WHICH IS NOT WORTHWHILE OR ! 7372: * ELSE BY A TECHNIQUE SUCH AS SETTING KVERL TO ZERO. ! 7373: * ! 7374: O$UNF ENT ENTRY POINT ! 7375: ERB 035,UNEXPECTED FAILURE IN -NOFAIL MODE ! 7376: TTL S P I T B O L -- SNOBOL4 BUILTIN LABEL ROUTINES ! 7377: * ! 7378: * THE FOLLOWING SECTION CONTAINS THE ROUTINES FOR LABELS ! 7379: * WHICH HAVE A PREDEFINED MEANING IN SNOBOL4. ! 7380: * ! 7381: * CONTROL IS PASSED DIRECTLY TO THE LABEL NAME ENTRY POINT. ! 7382: * ! 7383: * ENTRY NAMES ARE OF THE FORM L$XXX WHERE XXX IS THE THREE ! 7384: * LETTER VARIABLE NAME IDENTIFIER. ! 7385: * ! 7386: * ENTRIES ARE IN ALPHABETICAL ORDER ! 7387: EJC ! 7388: * ! 7389: * ABORT ! 7390: * ! 7391: L$ABO ENT ENTRY POINT ! 7392: * ! 7393: * MERGE HERE IF EXECUTION TERMINATES IN ERROR ! 7394: * ! 7395: LABO1 MOV KVERT,WA LOAD ERROR CODE ! 7396: BZE WA,LABO2 JUMP IF NO ERROR HAS OCCURED ! 7397: .IF .CSAX ! 7398: JSR SYSAX CALL AFTER EXECUTION PROC (REG04) ! 7399: .ELSE ! 7400: .FI ! 7401: JSR PRTPG ELSE EJECT PRINTER ! 7402: JSR ERMSG PRINT ERROR MESSAGE ! 7403: ZER XR INDICATE NO MESSAGE TO PRINT ! 7404: BRN STOPR JUMP TO ROUTINE TO STOP RUN ! 7405: * ! 7406: * HERE IF NO ERROR HAD OCCURED ! 7407: * ! 7408: LABO2 ERB 036,GOTO ABORT WITH NO PRECEDING ERROR ! 7409: EJC ! 7410: * ! 7411: * CONTINUE ! 7412: * ! 7413: L$CNT ENT ENTRY POINT ! 7414: * ! 7415: * MERGE HERE AFTER EXECUTION ERROR ! 7416: * ! 7417: LCNT1 MOV R$CNT,XR LOAD CONTINUATION CODE BLOCK PTR ! 7418: BZE XR,LCNT2 JUMP IF NO PREVIOUS ERROR ! 7419: ZER R$CNT CLEAR FLAG ! 7420: MOV XR,R$COD ELSE STORE AS NEW CODE BLOCK PTR ! 7421: ADD STXOF,XR ADD FAILURE OFFSET ! 7422: LCP XR LOAD CODE POINTER ! 7423: MOV FLPTR,XS RESET STACK POINTER ! 7424: BRN EXITS JUMP TO TAKE INDICATED FAILURE ! 7425: * ! 7426: * HERE IF NO PREVIOUS ERROR ! 7427: * ! 7428: LCNT2 ERB 037,GOTO CONTINUE WITH NO PRECEDING ERROR ! 7429: EJC ! 7430: * ! 7431: * END ! 7432: * ! 7433: L$END ENT ENTRY POINT ! 7434: * ! 7435: * MERGE HERE FROM END CODE CIRCUIT ! 7436: * ! 7437: LEND0 MOV =ENDMS,XR POINT TO MESSAGE /NORMAL TERM../ ! 7438: BRN STOPR JUMP TO ROUTINE TO STOP RUN ! 7439: EJC ! 7440: * ! 7441: * FRETURN ! 7442: * ! 7443: L$FRT ENT ENTRY POINT ! 7444: MOV =SCFRT,WA POINT TO STRING /FRETURN/ ! 7445: BRN RETRN JUMP TO COMMON RETURN ROUTINE ! 7446: EJC ! 7447: * ! 7448: * NRETURN ! 7449: * ! 7450: L$NRT ENT ENTRY POINT ! 7451: MOV =SCNRT,WA POINT TO STRING /NRETURN/ ! 7452: BRN RETRN JUMP TO COMMON RETURN ROUTINE ! 7453: EJC ! 7454: * ! 7455: * RETURN ! 7456: * ! 7457: L$RTN ENT ENTRY POINT ! 7458: MOV =SCRTN,WA POINT TO STRING /RETURN/ ! 7459: BRN RETRN JUMP TO COMMON RETURN ROUTINE ! 7460: EJC ! 7461: * ! 7462: * UNDEFINED LABEL ! 7463: * ! 7464: L$UND ENT ENTRY POINT ! 7465: ERB 038,GOTO UNDEFINED LABEL ! 7466: TTL S P I T B O L -- BLOCK ACTION ROUTINES ! 7467: * ! 7468: * THE FIRST WORD OF EVERY BLOCK IN DYNAMIC STORAGE AND THE ! 7469: * VRGET, VRSTO AND VRTRA FIELDS OF A VRBLK CONTAIN A ! 7470: * POINTER TO AN ENTRY POINT IN THE PROGRAM. ALL SUCH ENTRY ! 7471: * POINTS ARE IN THE FOLLOWING SECTION EXCEPT THOSE FOR ! 7472: * PATTERN BLOCKS WHICH ARE IN THE PATTERN MATCHING SEGMENT ! 7473: * LATER ON (LABELS OF THE FORM P$XXX), AND DOPE VECTORS ! 7474: * (D$XXX) WHICH ARE IN THE DOPE VECTOR SECTION FOLLOWING ! 7475: * THE PATTERN ROUTINES (DOPE VECTORS ARE USED FOR CMBLKS). ! 7476: * ! 7477: * THE ENTRY POINTS IN THIS SECTION HAVE LABELS OF THE ! 7478: * FORM B$XXY WHERE XX IS THE TWO CHARACTER BLOCK TYPE FOR ! 7479: * THE CORRESPONDING BLOCK AND Y IS ANY LETTER. ! 7480: * ! 7481: * IN SOME CASES, THE POINTERS SERVE NO OTHER PURPOSE THAN ! 7482: * TO IDENTIFY THE BLOCK TYPE. IN THIS CASE THE ROUTINE ! 7483: * IS NEVER EXECUTED AND THUS NO CODE IS ASSEMBLED. ! 7484: * ! 7485: * FOR EACH OF THESE ENTRY POINTS CORRESPONDING TO A BLOCK ! 7486: * AN ENTRY POINT IDENTIFICATION IS ASSEMBLED (BL$XX). ! 7487: * ! 7488: * THE EXACT ENTRY CONDITIONS DEPEND ON THE MANNER IN ! 7489: * WHICH THE ROUTINE IS ACCESSED AND ARE DOCUMENTED WITH ! 7490: * THE INDIVIDUAL ROUTINES AS REQUIRED. ! 7491: * ! 7492: * THE ORDER OF THESE ROUTINES IS ALPHABETICAL WITH THE ! 7493: * FOLLOWING EXCEPTIONS. ! 7494: * ! 7495: * THE ROUTINES FOR SEBLK AND EXBLK ENTRIES OCCUR FIRST SO ! 7496: * THAT EXPRESSIONS CAN BE QUICKLY IDENTIFIED FROM THE FACT ! 7497: * THAT THEIR ROUTINES LIE BEFORE THE SYMBOL B$E$$. ! 7498: * ! 7499: * THESE ARE IMMEDIATELY FOLLOWED BY THE ROUTINE FOR A TRBLK ! 7500: * SO THAT THE TEST AGAINST THE SYMBOL B$T$$ CHECKS FOR ! 7501: * TRAPPED VALUES OR EXPRESSION VALUES (SEE PROCEDURE EVALP) ! 7502: * ! 7503: * THE PATTERN ROUTINES LIE AFTER THIS SECTION SO THAT ! 7504: * PATTERNS ARE IDENTIFIED WITH ROUTINES STARTING AT OR ! 7505: * AFTER THE INITIAL INSTRUCTION IN THESE ROUTINES (P$AAA). ! 7506: * ! 7507: * THE SYMBOL B$AAA DEFINES THE FIRST LOCATION FOR BLOCK ! 7508: * ROUTINES AND THE SYMBOL P$YYY (AT THE END OF THE PATTERN ! 7509: * MATCH ROUTINES SECTION) DEFINES THE LAST SUCH ENTRY POINT ! 7510: * ! 7511: B$AAA ENT BL$$I ENTRY POINT OF FIRST BLOCK ROUTINE ! 7512: EJC ! 7513: * ! 7514: * EXBLK ! 7515: * ! 7516: * THE ROUTINE FOR AN EXBLK LOADS THE EXPRESSION ONTO ! 7517: * THE STACK AS A VALUE. ! 7518: * ! 7519: * (XR) POINTER TO EXBLK ! 7520: * ! 7521: B$EXL ENT BL$EX ENTRY POINT (EXBLK) ! 7522: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD ! 7523: EJC ! 7524: * ! 7525: * SEBLK ! 7526: * ! 7527: * THE ROUTINE FOR SEBLK IS ACCESSED FROM THE GENERATED ! 7528: * CODE TO LOAD THE EXPRESSION VALUE ONTO THE STACK. ! 7529: * ! 7530: B$SEL ENT BL$SE ENTRY POINT (SEBLK) ! 7531: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD ! 7532: * ! 7533: * DEFINE SYMBOL WHICH MARKS END OF ENTRIES FOR EXPRESSIONS ! 7534: * ! 7535: B$E$$ ENT BL$$I ENTRY POINT ! 7536: EJC ! 7537: * ! 7538: * TRBLK ! 7539: * ! 7540: * THE ROUTINE FOR A TRBLK IS NEVER EXECUTED ! 7541: * ! 7542: B$TRT ENT BL$TR ENTRY POINT (TRBLK) ! 7543: * ! 7544: * DEFINE SYMBOL MARKING END OF TRAP AND EXPRESSION BLOCKS ! 7545: * ! 7546: B$T$$ ENT BL$$I END OF TRBLK,SEBLK,EXBLK ENTRIES ! 7547: EJC ! 7548: * ! 7549: * ARBLK ! 7550: * ! 7551: * THE ROUTINE FOR ARBLK IS NEVER EXECUTED ! 7552: * ! 7553: B$ART ENT BL$AR ENTRY POINT (ARBLK) ! 7554: EJC ! 7555: .IF .CNBF ! 7556: .ELSE ! 7557: * ! 7558: * BCBLK ! 7559: * ! 7560: * THE ROUTINE FOR A BCBLK IS NEVER EXECUTED ! 7561: * ! 7562: * (XR) POINTER TO BCBLK ! 7563: * ! 7564: B$BCT ENT BL$BC ENTRY POINT (BCBLK) ! 7565: EJC ! 7566: * ! 7567: * BFBLK ! 7568: * ! 7569: * THE ROUTINE FOR A BFBLK IS NEVER EXECUTED ! 7570: * ! 7571: * (XR) POINTER TO BFBLK ! 7572: * ! 7573: B$BFT ENT BL$BF ENTRY POINT (BFBLK) ! 7574: EJC ! 7575: .FI ! 7576: * ! 7577: * CCBLK ! 7578: * ! 7579: * THE ROUTINE FOR CCBLK IS NEVER ENTERED ! 7580: * ! 7581: B$CCT ENT BL$CC ENTRY POINT (CCBLK) ! 7582: EJC ! 7583: * ! 7584: * CDBLK ! 7585: * ! 7586: * THE CDBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE. ! 7587: * THERE ARE TWO CASES DEPENDING ON THE FORM OF CDFAL. ! 7588: * ! 7589: * ENTRY FOR COMPLEX FAILURE CODE AT CDFAL ! 7590: * ! 7591: * (XR) POINTER TO CDBLK ! 7592: * ! 7593: B$CDC ENT BL$CD ENTRY POINT (CDBLK) ! 7594: BCDC0 MOV FLPTR,XS POP GARBAGE OFF STACK ! 7595: MOV CDFAL(XR),(XS) SET FAILURE OFFSET ! 7596: BRN STMGO ENTER STMT ! 7597: EJC ! 7598: * ! 7599: * CDBLK (CONTINUED) ! 7600: * ! 7601: * ENTRY FOR SIMPLE FAILURE CODE AT CDFAL ! 7602: * ! 7603: * (XR) POINTER TO CDBLK ! 7604: * ! 7605: B$CDS ENT BL$CD ENTRY POINT (CDBLK) ! 7606: BCDS0 MOV FLPTR,XS POP GARBAGE OFF STACK ! 7607: MOV *CDFAL,(XS) SET FAILURE OFFSET ! 7608: BRN STMGO ENTER STMT ! 7609: EJC ! 7610: * ! 7611: * CMBLK ! 7612: * ! 7613: * THE ROUTINE FOR A CMBLK IS NEVER EXECUTED ! 7614: * ! 7615: B$CMT ENT BL$CM ENTRY POINT (CMBLK) ! 7616: EJC ! 7617: * ! 7618: * CTBLK ! 7619: * ! 7620: * THE ROUTINE FOR A CTBLK IS NEVER EXECUTED ! 7621: * ! 7622: B$CTT ENT BL$CT ENTRY POINT (CTBLK) ! 7623: EJC ! 7624: * ! 7625: * DFBLK ! 7626: * ! 7627: * THE ROUTINE FOR A DFBLK IS ACCESSED FROM THE O$FNC ENTRY ! 7628: * TO CALL A DATATYPE FUNCTION AND BUILD A PDBLK. ! 7629: * ! 7630: * (XL) POINTER TO DFBLK ! 7631: * ! 7632: B$DFC ENT BL$DF ENTRY POINT ! 7633: MOV DFPDL(XL),WA LOAD LENGTH OF PDBLK ! 7634: JSR ALLOC ALLOCATE PDBLK ! 7635: MOV =B$PDT,(XR) STORE TYPE WORD ! 7636: MOV XL,PDDFP(XR) STORE DFBLK POINTER ! 7637: MOV XR,WC SAVE POINTER TO PDBLK ! 7638: ADD WA,XR POINT PAST PDBLK ! 7639: LCT WA,FARGS(XL) SET TO COUNT FIELDS ! 7640: * ! 7641: * LOOP TO ACQUIRE FIELD VALUES FROM STACK ! 7642: * ! 7643: BDFC1 MOV (XS)+,-(XR) MOVE A FIELD VALUE ! 7644: BCT WA,BDFC1 LOOP TILL ALL MOVED ! 7645: MOV WC,XR RECALL POINTER TO PDBLK ! 7646: BRN EXSID EXIT SETTING ID FIELD ! 7647: EJC ! 7648: * ! 7649: * EFBLK ! 7650: * ! 7651: * THE ROUTINE FOR AN EFBLK IS PASSED CONTROL FORM THE O$FNC ! 7652: * ENTRY TO CALL AN EXTERNAL FUNCTION. ! 7653: * ! 7654: * (XL) POINTER TO EFBLK ! 7655: * ! 7656: B$EFC ENT BL$EF ENTRY POINT (EFBLK) ! 7657: .IF .CNLD ! 7658: .ELSE ! 7659: MOV FARGS(XL),WC LOAD NUMBER OF ARGUMENTS ! 7660: WTB WC CONVERT TO OFFSET ! 7661: MOV XL,-(XS) SAVE POINTER TO EFBLK ! 7662: MOV XS,XT COPY POINTER TO ARGUMENTS ! 7663: * ! 7664: * LOOP TO CONVERT ARGUMENTS ! 7665: * ! 7666: BEFC1 ICA XT POINT TO NEXT ENTRY ! 7667: MOV (XS),XR LOAD POINTER TO EFBLK ! 7668: DCA WC DECREMENT EFTAR OFFSET ! 7669: ADD WC,XR POINT TO NEXT EFTAR ENTRY ! 7670: MOV EFTAR(XR),XR LOAD EFTAR ENTRY ! 7671: .IF .CNRA ! 7672: BSW XR,3 SWITCH ON TYPE ! 7673: .ELSE ! 7674: BSW XR,4 SWITCH ON TYPE ! 7675: .FI ! 7676: IFF 0,BEFC7 NO CONVERSION NEEDED ! 7677: IFF 1,BEFC2 STRING ! 7678: IFF 2,BEFC3 INTEGER ! 7679: .IF .CNRA ! 7680: .ELSE ! 7681: IFF 3,BEFC4 REAL ! 7682: .FI ! 7683: ESW END OF SWITCH ON TYPE ! 7684: * ! 7685: * HERE TO CONVERT TO STRING ! 7686: * ! 7687: BEFC2 MOV (XT),-(XS) STACK ARG PTR ! 7688: JSR GTSTG CONVERT ARGUMENT TO STRING ! 7689: ERR 039,EXTERNAL FUNCTION ARGUMENT IS NOT STRING ! 7690: BRN BEFC6 JUMP TO MERGE ! 7691: EJC ! 7692: * ! 7693: * EFBLK (CONTINUED) ! 7694: * ! 7695: * HERE TO CONVERT AN INTEGER ! 7696: * ! 7697: BEFC3 MOV (XT),XR LOAD NEXT ARGUMENT ! 7698: MOV WC,BEFOF SAVE OFFSET ! 7699: JSR GTINT CONVERT TO INTEGER ! 7700: ERR 040,EXTERNAL FUNCTION ARGUMENT IS NOT INTEGER ! 7701: .IF .CNRA ! 7702: .ELSE ! 7703: BRN BEFC5 MERGE WITH REAL CASE ! 7704: * ! 7705: * HERE TO CONVERT A REAL ! 7706: * ! 7707: BEFC4 MOV (XT),XR LOAD NEXT ARGUMENT ! 7708: MOV WC,BEFOF SAVE OFFSET ! 7709: JSR GTREA CONVERT TO REAL ! 7710: ERR 265,EXTERNAL FUNCTION ARGUMENT IS NOT REAL ! 7711: .FI ! 7712: * ! 7713: * INTEGER CASE MERGES HERE ! 7714: * ! 7715: BEFC5 MOV BEFOF,WC RESTORE OFFSET ! 7716: * ! 7717: * STRING MERGES HERE ! 7718: * ! 7719: BEFC6 MOV XR,(XT) STORE CONVERTED RESULT ! 7720: * ! 7721: * NO CONVERSION MERGES HERE ! 7722: * ! 7723: BEFC7 BNZ WC,BEFC1 LOOP BACK IF MORE TO GO ! 7724: * ! 7725: * HERE AFTER CONVERTING ALL THE ARGUMENTS ! 7726: * ! 7727: MOV (XS)+,XL RESTORE EFBLK POINTER ! 7728: MOV FARGS(XL),WA GET NUMBER OF ARGS ! 7729: JSR SYSEX CALL ROUTINE TO CALL EXTERNAL FNC ! 7730: PPM EXFAL FAIL IF FAILURE ! 7731: EJC ! 7732: * ! 7733: * EFBLK (CONTINUED) ! 7734: * ! 7735: * RETURN HERE WITH RESULT IN XR ! 7736: * ! 7737: * FIRST DEFEND AGAINST NON-STANDARD NULL STRING RETURNED ! 7738: * ! 7739: MOV EFRSL(XL),WB GET RESULT TYPE ID ! 7740: BNZ WB,BEFA8 BRANCH IF NOT UNCONVERTED ! 7741: BNE (XR),=B$SCL,BEFC8 JUMP IF NOT A STRING ! 7742: BZE SCLEN(XR),EXNUL RETURN NULL IF NULL ! 7743: * ! 7744: * HERE IF CONVERTED RESULT TO CHECK FOR NULL STRING ! 7745: * ! 7746: BEFA8 BNE WB,=NUM01,BEFC8 JUMP IF NOT A STRING ! 7747: BZE SCLEN(XR),EXNUL RETURN NULL IF NULL ! 7748: * ! 7749: * RETURN IF RESULT IS IN DYNAMIC STORAGE ! 7750: * ! 7751: BEFC8 BLT XR,DNAMB,BEFC9 JUMP IF NOT IN DYNAMIC STORAGE ! 7752: BLE XR,DNAMP,EXIXR RETURN RESULT IF ALREADY DYNAMIC ! 7753: * ! 7754: * HERE WE COPY A RESULT INTO THE DYNAMIC REGION ! 7755: * ! 7756: BEFC9 MOV (XR),WA GET POSSIBLE TYPE WORD ! 7757: BZE WB,BEF11 JUMP IF UNCONVERTED RESULT ! 7758: MOV =B$SCL,WA STRING ! 7759: BEQ WB,=NUM01,BEF10 YES JUMP ! 7760: MOV =B$ICL,WA INTEGER ! 7761: BEQ WB,=NUM02,BEF10 YES JUMP ! 7762: .IF .CNRA ! 7763: .ELSE ! 7764: MOV =B$RCL,WA REAL ! 7765: .FI ! 7766: * ! 7767: * STORE TYPE WORD IN RESULT ! 7768: * ! 7769: BEF10 MOV WA,(XR) STORED BEFORE COPYING TO DYNAMIC ! 7770: * ! 7771: * MERGE FOR UNCONVERTED RESULT ! 7772: * ! 7773: BEF11 JSR BLKLN GET LENGTH OF BLOCK ! 7774: MOV XR,XL COPY ADDRESS OF OLD BLOCK ! 7775: JSR ALLOC ALLOCATE DYNAMIC BLOCK SAME SIZE ! 7776: MOV XR,-(XS) SET POINTER TO NEW BLOCK AS RESULT ! 7777: MVW COPY OLD BLOCK TO DYNAMIC BLOCK ! 7778: BRN EXITS EXIT WITH RESULT ON STACK ! 7779: .FI ! 7780: EJC ! 7781: * ! 7782: * EVBLK ! 7783: * ! 7784: * THE ROUTINE FOR AN EVBLK IS NEVER EXECUTED ! 7785: * ! 7786: B$EVT ENT BL$EV ENTRY POINT (EVBLK) ! 7787: EJC ! 7788: * ! 7789: * FFBLK ! 7790: * ! 7791: * THE ROUTINE FOR AN FFBLK IS EXECUTED FROM THE O$FNC ENTRY ! 7792: * TO CALL A FIELD FUNCTION AND EXTRACT A FIELD VALUE/NAME. ! 7793: * ! 7794: * (XL) POINTER TO FFBLK ! 7795: * ! 7796: B$FFC ENT BL$FF ENTRY POINT (FFBLK) ! 7797: MOV XL,XR COPY FFBLK POINTER ! 7798: LCW WC LOAD NEXT CODE WORD ! 7799: MOV (XS),XL LOAD PDBLK POINTER ! 7800: BNE (XL),=B$PDT,BFFC2 JUMP IF NOT PDBLK AT ALL ! 7801: MOV PDDFP(XL),WA LOAD DFBLK POINTER FROM PDBLK ! 7802: * ! 7803: * LOOP TO FIND CORRECT FFBLK FOR THIS PDBLK ! 7804: * ! 7805: BFFC1 BEQ WA,FFDFP(XR),BFFC3 JUMP IF THIS IS THE CORRECT FFBLK ! 7806: MOV FFNXT(XR),XR ELSE LINK TO NEXT FFBLK ON CHAIN ! 7807: BNZ XR,BFFC1 LOOP BACK IF ANOTHER ENTRY TO CHECK ! 7808: * ! 7809: * HERE FOR BAD ARGUMENT ! 7810: * ! 7811: BFFC2 ERB 041,FIELD FUNCTION ARGUMENT IS WRONG DATATYPE ! 7812: EJC ! 7813: * ! 7814: * FFBLK (CONTINUED) ! 7815: * ! 7816: * HERE AFTER LOCATING CORRECT FFBLK ! 7817: * ! 7818: BFFC3 MOV FFOFS(XR),WA LOAD FIELD OFFSET ! 7819: BEQ WC,=OFNE$,BFFC5 JUMP IF CALLED BY NAME ! 7820: ADD WA,XL ELSE POINT TO VALUE FIELD ! 7821: MOV (XL),XR LOAD VALUE ! 7822: BNE (XR),=B$TRT,BFFC4 JUMP IF NOT TRAPPED ! 7823: SUB WA,XL ELSE RESTORE NAME BASE,OFFSET ! 7824: MOV WC,(XS) SAVE NEXT CODE WORD OVER PDBLK PTR ! 7825: JSR ACESS ACCESS VALUE ! 7826: PPM EXFAL FAIL IF ACCESS FAILS ! 7827: MOV (XS),WC RESTORE NEXT CODE WORD ! 7828: * ! 7829: * HERE AFTER GETTING VALUE IN (XR) ! 7830: * ! 7831: BFFC4 MOV XR,(XS) STORE VALUE ON STACK (OVER PDBLK) ! 7832: MOV WC,XR COPY NEXT CODE WORD ! 7833: MOV (XR),XL LOAD ENTRY ADDRESS ! 7834: BRI XL JUMP TO ROUTINE FOR NEXT CODE WORD ! 7835: * ! 7836: * HERE IF CALLED BY NAME ! 7837: * ! 7838: BFFC5 MOV WA,-(XS) STORE NAME OFFSET (BASE IS SET) ! 7839: BRN EXITS EXIT WITH NAME ON STACK ! 7840: EJC ! 7841: * ! 7842: * ICBLK ! 7843: * ! 7844: * THE ROUTINE FOR ICBLK IS EXECUTED FROM THE GENERATED ! 7845: * CODE TO LOAD AN INTEGER VALUE ONTO THE STACK. ! 7846: * ! 7847: * (XR) POINTER TO ICBLK ! 7848: * ! 7849: B$ICL ENT BL$IC ENTRY POINT (ICBLK) ! 7850: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD ! 7851: EJC ! 7852: * ! 7853: * KVBLK ! 7854: * ! 7855: * THE ROUTINE FOR A KVBLK IS NEVER EXECUTED. ! 7856: * ! 7857: B$KVT ENT BL$KV ENTRY POINT (KVBLK) ! 7858: EJC ! 7859: * ! 7860: * NMBLK ! 7861: * ! 7862: * THE ROUTINE FOR A NMBLK IS EXECUTED FROM THE GENERATED ! 7863: * CODE FOR THE CASE OF LOADING A NAME ONTO THE STACK ! 7864: * WHERE THE NAME IS THAT OF A NATURAL VARIABLE WHICH CAN ! 7865: * BE PREEVALUATED AT COMPILE TIME. ! 7866: * ! 7867: * (XR) POINTER TO NMBLK ! 7868: * ! 7869: B$NML ENT BL$NM ENTRY POINT (NMBLK) ! 7870: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD ! 7871: EJC ! 7872: * ! 7873: * PDBLK ! 7874: * ! 7875: * THE ROUTINE FOR A PDBLK IS NEVER EXECUTED ! 7876: * ! 7877: B$PDT ENT BL$PD ENTRY POINT (PDBLK) ! 7878: EJC ! 7879: * ! 7880: * PFBLK ! 7881: * ! 7882: * THE ROUTINE FOR A PFBLK IS EXECUTED FROM THE ENTRY O$FNC ! 7883: * TO CALL A PROGRAM DEFINED FUNCTION. ! 7884: * ! 7885: * (XL) POINTER TO PFBLK ! 7886: * ! 7887: * THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING ! 7888: * CONTROL TO THE PROGRAM DEFINED FUNCTION. ! 7889: * ! 7890: * SAVED VALUE OF FIRST ARGUMENT ! 7891: * . ! 7892: * SAVED VALUE OF LAST ARGUMENT ! 7893: * SAVED VALUE OF FIRST LOCAL ! 7894: * . ! 7895: * SAVED VALUE OF LAST LOCAL ! 7896: * SAVED VALUE OF FUNCTION NAME ! 7897: * SAVED CODE BLOCK PTR (R$COD) ! 7898: * SAVED CODE POINTER (-R$COD) ! 7899: * SAVED VALUE OF FLPRT ! 7900: * SAVED VALUE OF FLPTR ! 7901: * POINTER TO PFBLK ! 7902: * FLPTR --------------- ZERO (TO BE OVERWRITTEN WITH OFFS) ! 7903: * ! 7904: B$PFC ENT BL$PF ENTRY POINT (PFBLK) ! 7905: MOV XL,BPFPF SAVE PFBLK PTR (NEED NOT BE RELOC) ! 7906: MOV XL,XR COPY FOR THE MOMENT ! 7907: MOV PFVBL(XR),XL POINT TO VRBLK FOR FUNCTION ! 7908: * ! 7909: * LOOP TO FIND OLD VALUE OF FUNCTION ! 7910: * ! 7911: BPF01 MOV XL,WB SAVE POINTER ! 7912: MOV VRVAL(XL),XL LOAD VALUE ! 7913: BEQ (XL),=B$TRT,BPF01 LOOP IF TRBLK ! 7914: * ! 7915: * SET VALUE TO NULL AND SAVE OLD FUNCTION VALUE ! 7916: * ! 7917: MOV XL,BPFSV SAVE OLD VALUE ! 7918: MOV WB,XL POINT BACK TO BLOCK WITH VALUE ! 7919: MOV =NULLS,VRVAL(XL) SET VALUE TO NULL ! 7920: MOV FARGS(XR),WA LOAD NUMBER OF ARGUMENTS ! 7921: ADD *PFARG,XR POINT TO PFARG ENTRIES ! 7922: BZE WA,BPF04 JUMP IF NO ARGUMENTS ! 7923: MOV XS,XT PTR TO LAST ARG ! 7924: WTB WA CONVERT NO. OF ARGS TO BYTES OFFSET ! 7925: ADD WA,XT POINT BEFORE FIRST ARG ! 7926: MOV XT,BPFXT REMEMBER ARG POINTER ! 7927: EJC ! 7928: * ! 7929: * PFBLK (CONTINUED) ! 7930: * ! 7931: * LOOP TO SAVE OLD ARGUMENT VALUES AND SET NEW ONES ! 7932: * ! 7933: BPF02 MOV (XR)+,XL LOAD VRBLK PTR FOR NEXT ARGUMENT ! 7934: * ! 7935: * LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE ! 7936: * ! 7937: BPF03 MOV XL,WC SAVE POINTER ! 7938: MOV VRVAL(XL),XL LOAD NEXT VALUE ! 7939: BEQ (XL),=B$TRT,BPF03 LOOP BACK IF TRBLK ! 7940: * ! 7941: * SAVE OLD VALUE AND GET NEW VALUE ! 7942: * ! 7943: MOV XL,WA KEEP OLD VALUE ! 7944: MOV BPFXT,XT POINT BEFORE NEXT STACKED ARG ! 7945: MOV -(XT),WB LOAD ARGUMENT (NEW VALUE) ! 7946: MOV WA,(XT) SAVE OLD VALUE ! 7947: MOV XT,BPFXT KEEP ARG PTR FOR NEXT TIME ! 7948: MOV WC,XL POINT BACK TO BLOCK WITH VALUE ! 7949: MOV WB,VRVAL(XL) SET NEW VALUE ! 7950: BNE XS,BPFXT,BPF02 LOOP IF NOT ALL DONE ! 7951: * ! 7952: * NOW PROCESS LOCALS ! 7953: * ! 7954: BPF04 MOV BPFPF,XL RESTORE PFBLK POINTER ! 7955: MOV PFNLO(XL),WA LOAD NUMBER OF LOCALS ! 7956: BZE WA,BPF07 JUMP IF NO LOCALS ! 7957: MOV =NULLS,WB GET NULL CONSTANT ! 7958: LCT WA,WA SET LOCAL COUNTER ! 7959: * ! 7960: * LOOP TO PROCESS LOCALS ! 7961: * ! 7962: BPF05 MOV (XR)+,XL LOAD VRBLK PTR FOR NEXT LOCAL ! 7963: * ! 7964: * LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE ! 7965: * ! 7966: BPF06 MOV XL,WC SAVE POINTER ! 7967: MOV VRVAL(XL),XL LOAD NEXT VALUE ! 7968: BEQ (XL),=B$TRT,BPF06 LOOP BACK IF TRBLK ! 7969: * ! 7970: * SAVE OLD VALUE AND SET NULL AS NEW VALUE ! 7971: * ! 7972: MOV XL,-(XS) STACK OLD VALUE ! 7973: MOV WC,XL POINT BACK TO BLOCK WITH VALUE ! 7974: MOV WB,VRVAL(XL) SET NULL AS NEW VALUE ! 7975: BCT WA,BPF05 LOOP TILL ALL LOCALS PROCESSED ! 7976: EJC ! 7977: * ! 7978: * PFBLK (CONTINUED) ! 7979: * ! 7980: * HERE AFTER PROCESSING ARGUMENTS AND LOCALS ! 7981: * ! 7982: .IF .CNPF ! 7983: BPF07 MOV R$COD,WA LOAD OLD CODE BLOCK POINTER ! 7984: .ELSE ! 7985: BPF07 ZER XR ZERO REG XR IN CASE ! 7986: BZE KVPFL,BPF7C SKIP IF PROFILING IS OFF ! 7987: BEQ KVPFL,=NUM02,BPF7A BRANCH ON TYPE OF PROFILE ! 7988: * ! 7989: * HERE IF &PROFILE = 1 ! 7990: * ! 7991: JSR SYSTM GET CURRENT TIME ! 7992: STI PFETM SAVE FOR A SEC ! 7993: SBI PFSTM FIND TIME USED BY CALLER ! 7994: JSR ICBLD BUILD INTO AN ICBLK ! 7995: LDI PFETM RELOAD CURRENT TIME ! 7996: BRN BPF7B MERGE ! 7997: * ! 7998: * HERE IF &PROFILE = 2 ! 7999: * ! 8000: BPF7A LDI PFSTM GET START TIME OF CALLING STMT ! 8001: JSR ICBLD ASSEMBLE AN ICBLK ROUND IT ! 8002: JSR SYSTM GET NOW TIME ! 8003: * ! 8004: * BOTH TYPES OF PROFILE MERGE HERE ! 8005: * ! 8006: BPF7B STI PFSTM SET START TIME OF 1ST FUNC STMT ! 8007: MNZ PFFNC FLAG FUNCTION ENTRY ! 8008: * ! 8009: * NO PROFILING MERGES HERE ! 8010: * ! 8011: BPF7C MOV XR,-(XS) STACK ICBLK PTR (OR ZERO) ! 8012: MOV R$COD,WA LOAD OLD CODE BLOCK POINTER ! 8013: .FI ! 8014: SCP WB GET CODE POINTER ! 8015: SUB WA,WB MAKE CODE POINTER INTO OFFSET ! 8016: MOV BPFPF,XL RECALL PFBLK POINTER ! 8017: MOV BPFSV,-(XS) STACK OLD VALUE OF FUNCTION NAME ! 8018: MOV WA,-(XS) STACK CODE BLOCK POINTER ! 8019: MOV WB,-(XS) STACK CODE OFFSET ! 8020: MOV FLPRT,-(XS) STACK OLD FLPRT ! 8021: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER ! 8022: MOV XL,-(XS) STACK POINTER TO PFBLK ! 8023: ZER -(XS) DUMMY ZERO ENTRY FOR FAIL RETURN ! 8024: CHK CHECK FOR STACK OVERFLOW ! 8025: MOV XS,FLPTR SET NEW FAIL RETURN VALUE ! 8026: MOV XS,FLPRT SET NEW FLPRT ! 8027: MOV KVTRA,WA LOAD TRACE VALUE ! 8028: ADD KVFTR,WA ADD FTRACE VALUE ! 8029: BNZ WA,BPF09 JUMP IF TRACING POSSIBLE ! 8030: ICV KVFNC ELSE BUMP FNCLEVEL ! 8031: * ! 8032: * HERE TO ACTUALLY JUMP TO FUNCTION ! 8033: * ! 8034: BPF08 MOV PFCOD(XL),XR POINT TO CODE ! 8035: BRI (XR) OFF TO EXECUTE FUNCTION ! 8036: * ! 8037: * HERE IF TRACING IS POSSIBLE ! 8038: * ! 8039: BPF09 MOV PFCTR(XL),XR LOAD POSSIBLE CALL TRACE TRBLK ! 8040: MOV PFVBL(XL),XL LOAD VRBLK POINTER FOR FUNCTION ! 8041: MOV *VRVAL,WA SET NAME OFFSET FOR VARIABLE ! 8042: BZE KVTRA,BPF10 JUMP IF TRACE MODE IS OFF ! 8043: BZE XR,BPF10 OR IF THERE IS NO CALL TRACE ! 8044: * ! 8045: * HERE IF CALL TRACED ! 8046: * ! 8047: DCV KVTRA DECREMENT TRACE COUNT ! 8048: BZE TRFNC(XR),BPF11 JUMP IF PRINT TRACE ! 8049: JSR TRXEQ EXECUTE FUNCTION TYPE TRACE ! 8050: EJC ! 8051: * ! 8052: * PFBLK (CONTINUED) ! 8053: * ! 8054: * HERE TO TEST FOR FTRACE TRACE ! 8055: * ! 8056: BPF10 BZE KVFTR,BPF16 JUMP IF FTRACE IS OFF ! 8057: DCV KVFTR ELSE DECREMENT FTRACE ! 8058: * ! 8059: * HERE FOR PRINT TRACE ! 8060: * ! 8061: BPF11 JSR PRTSN PRINT STATEMENT NUMBER ! 8062: JSR PRTNM PRINT FUNCTION NAME ! 8063: MOV =CH$PP,WA LOAD LEFT PAREN ! 8064: JSR PRTCH PRINT LEFT PAREN ! 8065: MOV 1(XS),XL RECOVER PFBLK POINTER ! 8066: BZE FARGS(XL),BPF15 SKIP IF NO ARGUMENTS ! 8067: ZER WB ELSE SET ARGUMENT COUNTER ! 8068: BRN BPF13 JUMP INTO LOOP ! 8069: * ! 8070: * LOOP TO PRINT ARGUMENT VALUES ! 8071: * ! 8072: BPF12 MOV =CH$CM,WA LOAD COMMA ! 8073: JSR PRTCH PRINT TO SEPARATE FROM LAST ARG ! 8074: * ! 8075: * MERGE HERE FIRST TIME (NO COMMA REQUIRED) ! 8076: * ! 8077: BPF13 MOV WB,(XS) SAVE ARG CTR (OVER FAILOFFS IS OK) ! 8078: WTB WB CONVERT TO BYTE OFFSET ! 8079: ADD WB,XL POINT TO NEXT ARGUMENT POINTER ! 8080: MOV PFARG(XL),XR LOAD NEXT ARGUMENT VRBLK PTR ! 8081: SUB WB,XL RESTORE PFBLK POINTER ! 8082: MOV VRVAL(XR),XR LOAD NEXT VALUE ! 8083: JSR PRTVL PRINT ARGUMENT VALUE ! 8084: EJC ! 8085: * ! 8086: * HERE AFTER DEALING WITH ONE ARGUMENT ! 8087: * ! 8088: MOV (XS),WB RESTORE ARGUMENT COUNTER ! 8089: ICV WB INCREMENT ARGUMENT COUNTER ! 8090: BLT WB,FARGS(XL),BPF12 LOOP IF MORE TO PRINT ! 8091: * ! 8092: * MERGE HERE IN NO ARGS CASE TO PRINT PAREN ! 8093: * ! 8094: BPF15 MOV =CH$RP,WA LOAD RIGHT PAREN ! 8095: JSR PRTCH PRINT TO TERMINATE OUTPUT ! 8096: JSR PRTNL TERMINATE PRINT LINE ! 8097: * ! 8098: * MERGE HERE TO EXIT WITH TEST FOR FNCLEVEL TRACE ! 8099: * ! 8100: BPF16 ICV KVFNC INCREMENT FNCLEVEL ! 8101: MOV R$FNC,XL LOAD PTR TO POSSIBLE TRBLK ! 8102: JSR KTREX CALL KEYWORD TRACE ROUTINE ! 8103: * ! 8104: * CALL FUNCTION AFTER TRACE TESTS COMPLETE ! 8105: * ! 8106: MOV 1(XS),XL RESTORE PFBLK POINTER ! 8107: BRN BPF08 JUMP BACK TO EXECUTE FUNCTION ! 8108: .IF .CNRA ! 8109: .ELSE ! 8110: EJC ! 8111: * ! 8112: * RCBLK ! 8113: * ! 8114: * THE ROUTINE FOR AN RCBLK IS EXECUTED FROM THE GENERATED ! 8115: * CODE TO LOAD A REAL VALUE ONTO THE STACK. ! 8116: * ! 8117: * (XR) POINTER TO RCBLK ! 8118: * ! 8119: B$RCL ENT BL$RC ENTRY POINT (RCBLK) ! 8120: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD ! 8121: .FI ! 8122: EJC ! 8123: * ! 8124: * SCBLK ! 8125: * ! 8126: * THE ROUTINE FOR AN SCBLK IS EXECUTED FROM THE GENERATED ! 8127: * CODE TO LOAD A STRING VALUE ONTO THE STACK. ! 8128: * ! 8129: * (XR) POINTER TO SCBLK ! 8130: * ! 8131: B$SCL ENT BL$SC ENTRY POINT (SCBLK) ! 8132: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD ! 8133: EJC ! 8134: * ! 8135: * TBBLK ! 8136: * ! 8137: * THE ROUTINE FOR A TBBLK IS NEVER EXECUTED ! 8138: * ! 8139: B$TBT ENT BL$TB ENTRY POINT (TBBLK) ! 8140: EJC ! 8141: * ! 8142: * TEBLK ! 8143: * ! 8144: * THE ROUTINE FOR A TEBLK IS NEVER EXECUTED ! 8145: * ! 8146: B$TET ENT BL$TE ENTRY POINT (TEBLK) ! 8147: EJC ! 8148: * ! 8149: * VCBLK ! 8150: * ! 8151: * THE ROUTINE FOR A VCBLK IS NEVER EXECUTED ! 8152: * ! 8153: B$VCT ENT BL$VC ENTRY POINT (VCBLK) ! 8154: EJC ! 8155: * ! 8156: * VRBLK ! 8157: * ! 8158: * THE VRBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE. ! 8159: * THERE ARE SIX ENTRIES FOR VRBLK COVERING VARIOUS CASES ! 8160: * ! 8161: B$VR$ ENT BL$$I MARK START OF VRBLK ENTRY POINTS ! 8162: * ! 8163: * ENTRY FOR VRGET (TRAPPED CASE). THIS ROUTINE IS CALLED ! 8164: * FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE. ! 8165: * THIS ENTRY POINT IS USED IF AN ACCESS TRACE OR INPUT ! 8166: * ASSOCIATION IS CURRENTLY ACTIVE. ! 8167: * ! 8168: * (XR) POINTER TO VRGET FIELD OF VRBLK ! 8169: * ! 8170: B$VRA ENT BL$$I ENTRY POINT ! 8171: MOV XR,XL COPY NAME BASE (VRGET = 0) ! 8172: MOV *VRVAL,WA SET NAME OFFSET ! 8173: JSR ACESS ACCESS VALUE ! 8174: PPM EXFAL FAIL IF ACCESS FAILS ! 8175: BRN EXIXR ELSE EXIT WITH RESULT IN XR ! 8176: EJC ! 8177: * ! 8178: * VRBLK (CONTINUED) ! 8179: * ! 8180: * ENTRY FOR VRSTO (ERROR CASE. THIS ROUTINE IS CALLED FROM ! 8181: * THE EXECUTED CODE FOR AN ATTEMPT TO MODIFY THE VALUE ! 8182: * OF A PROTECTED (PATTERN VALUED) NATURAL VARIABLE. ! 8183: * ! 8184: B$VRE ENT ENTRY POINT ! 8185: ERB 042,ATTEMPT TO CHANGE VALUE OF PROTECTED VARIABLE ! 8186: EJC ! 8187: * ! 8188: * VRBLK (CONTINUED) ! 8189: * ! 8190: * ENTRY FOR VRTRA (UNTRAPPED CASE). THIS ROUTINE IS CALLED ! 8191: * FROM THE EXECUTED CODE TO TRANSFER TO A LABEL. ! 8192: * ! 8193: * (XR) POINTER TO VRTRA FIELD OF VRBLK ! 8194: * ! 8195: B$VRG ENT ENTRY POINT ! 8196: MOV VRLBO(XR),XR LOAD CODE POINTER ! 8197: MOV (XR),XL LOAD ENTRY ADDRESS ! 8198: BRI XL JUMP TO ROUTINE FOR NEXT CODE WORD ! 8199: EJC ! 8200: * ! 8201: * VRBLK (CONTINUED) ! 8202: * ! 8203: * ENTRY FOR VRGET (UNTRAPPED CASE). THIS ROUTINE IS CALLED ! 8204: * FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE. ! 8205: * ! 8206: * (XR) POINTS TO VRGET FIELD OF VRBLK ! 8207: * ! 8208: B$VRL ENT ENTRY POINT ! 8209: MOV VRVAL(XR),-(XS) LOAD VALUE ONTO STACK (VRGET = 0) ! 8210: BRN EXITS OBEY NEXT CODE WORD ! 8211: EJC ! 8212: * ! 8213: * VRBLK (CONTINUED) ! 8214: * ! 8215: * ENTRY FOR VRSTO (UNTRAPPED CASE). THIS ROUTINE IS CALLED ! 8216: * FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE. ! 8217: * ! 8218: * (XR) POINTER TO VRSTO FIELD OF VRBLK ! 8219: * ! 8220: B$VRS ENT ENTRY POINT ! 8221: MOV (XS),VRVLO(XR) STORE VALUE, LEAVE ON STACK ! 8222: BRN EXITS OBEY NEXT CODE WORD ! 8223: EJC ! 8224: * ! 8225: * VRBLK (CONTINUED) ! 8226: * ! 8227: * VRTRA (TRAPPED CASE). THIS ROUTINE IS CALLED FROM THE ! 8228: * GENERATED CODE TO TRANSFER TO A LABEL WHEN A LABEL ! 8229: * TRACE IS CURRENTLY ACTIVE. ! 8230: * ! 8231: B$VRT ENT ENTRY POINT ! 8232: SUB *VRTRA,XR POINT BACK TO START OF VRBLK ! 8233: MOV XR,XL COPY VRBLK POINTER ! 8234: MOV *VRVAL,WA SET NAME OFFSET ! 8235: MOV VRLBL(XL),XR LOAD POINTER TO TRBLK ! 8236: BZE KVTRA,BVRT2 JUMP IF TRACE IS OFF ! 8237: DCV KVTRA ELSE DECREMENT TRACE COUNT ! 8238: BZE TRFNC(XR),BVRT1 JUMP IF PRINT TRACE CASE ! 8239: JSR TRXEQ ELSE EXECUTE FULL TRACE ! 8240: BRN BVRT2 MERGE TO JUMP TO LABEL ! 8241: * ! 8242: * HERE FOR PRINT TRACE -- PRINT COLON ( LABEL NAME ) ! 8243: * ! 8244: BVRT1 JSR PRTSN PRINT STATEMENT NUMBER ! 8245: MOV XL,XR COPY VRBLK POINTER ! 8246: MOV =CH$CL,WA COLON ! 8247: JSR PRTCH PRINT IT ! 8248: MOV =CH$PP,WA LEFT PAREN ! 8249: JSR PRTCH PRINT IT ! 8250: JSR PRTVN PRINT LABEL NAME ! 8251: MOV =CH$RP,WA RIGHT PAREN ! 8252: JSR PRTCH PRINT IT ! 8253: JSR PRTNL TERMINATE LINE ! 8254: MOV VRLBL(XL),XR POINT BACK TO TRBLK ! 8255: * ! 8256: * MERGE HERE TO JUMP TO LABEL ! 8257: * ! 8258: BVRT2 MOV TRLBL(XR),XR LOAD POINTER TO ACTUAL CODE ! 8259: BRI (XR) EXECUTE STATEMENT AT LABEL ! 8260: EJC ! 8261: * ! 8262: * VRBLK (CONTINUED) ! 8263: * ! 8264: * ENTRY FOR VRSTO (TRAPPED CASE). THIS ROUTINE IS CALLED ! 8265: * FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE. ! 8266: * THIS ENTRY IS USED WHEN A VALUE TRACE OR OUTPUT ! 8267: * ASSOCIATION IS CURRENTLY ACTIVE. ! 8268: * ! 8269: * (XR) POINTER TO VRSTO FIELD OF VRBLK ! 8270: * ! 8271: B$VRV ENT ENTRY POINT ! 8272: MOV (XS),WB LOAD VALUE (LEAVE COPY ON STACK) ! 8273: SUB *VRSTO,XR POINT TO VRBLK ! 8274: MOV XR,XL COPY VRBLK POINTER ! 8275: MOV *VRVAL,WA SET OFFSET ! 8276: JSR ASIGN CALL ASSIGNMENT ROUTINE ! 8277: PPM EXFAL FAIL IF ASSIGNMENT FAILS ! 8278: BRN EXITS ELSE RETURN WITH RESULT ON STACK ! 8279: EJC ! 8280: * ! 8281: * XNBLK ! 8282: * ! 8283: * THE ROUTINE FOR AN XNBLK IS NEVER EXECUTED ! 8284: * ! 8285: B$XNT ENT BL$XN ENTRY POINT (XNBLK) ! 8286: EJC ! 8287: * ! 8288: * XRBLK ! 8289: * ! 8290: * THE ROUTINE FOR AN XRBLK IS NEVER EXECUTED ! 8291: * ! 8292: B$XRT ENT BL$XR ENTRY POINT (XRBLK) ! 8293: * ! 8294: * MARK ENTRY ADDRESS PAST LAST BLOCK ACTION ROUTINE ! 8295: * ! 8296: B$YYY ENT BL$$I LAST BLOCK ROUTINE ENTRY POINT ! 8297: TTL S P I T B O L -- PATTERN MATCHING ROUTINES ! 8298: * ! 8299: * THE FOLLOWING SECTION CONSISTS OF THE PATTERN MATCHING ! 8300: * ROUTINES. ALL PATTERN NODES CONTAIN A POINTER (PCODE) ! 8301: * TO ONE OF THE ROUTINES IN THIS SECTION (P$XXX). ! 8302: * ! 8303: * NOTE THAT THIS SECTION FOLLOWS THE B$XXX ROUTINES TO ! 8304: * ENABLE A FAST TEST FOR THE PATTERN DATATYPE. ! 8305: * ! 8306: P$AAA ENT BL$$I ENTRY TO MARK FIRST PATTERN ! 8307: * ! 8308: * ! 8309: * THE ENTRY CONDITIONS TO THE MATCH ROUTINE ARE AS FOLLOWS ! 8310: * (SEE O$PMN, O$PMV, O$PMS AND PROCEDURE MATCH). ! 8311: * ! 8312: * STACK CONTENTS. ! 8313: * ! 8314: * NAME BASE (O$PMN ONLY) ! 8315: * NAME OFFSET (O$PMN ONLY) ! 8316: * TYPE (0-O$PMN, 1-O$PMV, 2-O$PMS) ! 8317: * PMHBS --------------- INITIAL CURSOR (ZERO) ! 8318: * INITIAL NODE POINTER ! 8319: * XS ------------------ =NDABO (ANCHORED), =NDUNA (UNANCH) ! 8320: * ! 8321: * REGISTER VALUES. ! 8322: * ! 8323: * (XS) SET AS SHOWN IN STACK DIAGRAM ! 8324: * (XR) POINTER TO INITIAL PATTERN NODE ! 8325: * (WB) INITIAL CURSOR (ZERO) ! 8326: * ! 8327: * GLOBAL PATTERN VALUES ! 8328: * ! 8329: * R$PMS POINTER TO SUBJECT STRING SCBLK ! 8330: * PMSSL LENGTH OF SUBJECT STRING IN CHARS ! 8331: * PMDFL DOT FLAG, INITIALLY ZERO ! 8332: * PMHBS SET AS SHOWN IN STACK DIAGRAM ! 8333: * ! 8334: * CONTROL IS PASSED BY BRANCHING THROUGH THE PCODE ! 8335: * FIELD OF THE INITIAL PATTERN NODE (BRI (XR)). ! 8336: EJC ! 8337: * ! 8338: * DESCRIPTION OF ALGORITHM ! 8339: * ! 8340: * A PATTERN STRUCTURE IS REPRESENTED AS A LINKED GRAPH ! 8341: * OF NODES WITH THE FOLLOWING STRUCTURE. ! 8342: * ! 8343: * +------------------------------------+ ! 8344: * I PCODE I ! 8345: * +------------------------------------+ ! 8346: * I PTHEN I ! 8347: * +------------------------------------+ ! 8348: * I PARM1 I ! 8349: * +------------------------------------+ ! 8350: * I PARM2 I ! 8351: * +------------------------------------+ ! 8352: * ! 8353: * PCODE IS A POINTER TO THE ROUTINE WHICH WILL PERFORM ! 8354: * THE MATCH OF THIS PARTICULAR NODE TYPE. ! 8355: * ! 8356: * PTHEN IS A POINTER TO THE SUCCESSOR NODE. I.E. THE NODE ! 8357: * TO BE MATCHED IF THE ATTEMPT TO MATCH THIS NODE SUCCEEDS. ! 8358: * IF THIS IS THE LAST NODE OF THE PATTERN PTHEN POINTS ! 8359: * TO THE DUMMY NODE NDNTH WHICH INITIATES PATTERN EXIT. ! 8360: * ! 8361: * PARM1, PARM2 ARE PARAMETERS WHOSE USE VARIES WITH THE ! 8362: * PARTICULAR NODE. THEY ARE ONLY PRESENT IF REQUIRED. ! 8363: * ! 8364: * ALTERNATIVES ARE HANDLED WITH THE SPECIAL ALTERNATIVE ! 8365: * NODE WHOSE PARAMETER POINTS TO THE NODE TO BE MATCHED ! 8366: * IF THERE IS A FAILURE ON THE SUCCESSOR PATH. ! 8367: * ! 8368: * THE FOLLOWING EXAMPLE ILLUSTRATES THE MANNER IN WHICH ! 8369: * THE STRUCTURE IS BUILT UP. THE PATTERN IS ! 8370: * ! 8371: * (A / B / C) (D / E) WHERE / IS ALTERNATION ! 8372: * ! 8373: * IN THE DIAGRAM, THE NODE MARKED + REPRESENTS AN ! 8374: * ALTERNATIVE NODE AND THE DOTTED LINE FROM A + NODE ! 8375: * REPRESENTS THE PARAMETER POINTER TO THE ALTERNATIVE. ! 8376: * ! 8377: * +---+ +---+ +---+ +---+ ! 8378: * I + I-----I A I-----I + I-----I D I----- ! 8379: * +---+ +---+ I +---+ +---+ ! 8380: * . I . ! 8381: * . I . ! 8382: * +---+ +---+ I +---+ ! 8383: * I + I-----I B I--I I E I----- ! 8384: * +---+ +---+ I +---+ ! 8385: * . I ! 8386: * . I ! 8387: * +---+ I ! 8388: * I C I------------I ! 8389: * +---+ ! 8390: EJC ! 8391: * ! 8392: * DURING THE MATCH, THE REGISTERS ARE USED AS FOLLOWS. ! 8393: * ! 8394: * (XR) POINTS TO THE CURRENT NODE ! 8395: * (XL) SCRATCH ! 8396: * (XS) MAIN STACK POINTER ! 8397: * (WB) CURSOR (NUMBER OF CHARS MATCHED) ! 8398: * (WA,WC) SCRATCH ! 8399: * ! 8400: * TO KEEP TRACK OF ALTERNATIVES, THE MAIN STACK IS USED AS ! 8401: * A HISTORY STACK AND CONTAINS TWO WORD ENTRIES. ! 8402: * ! 8403: * WORD 1 SAVED CURSOR VALUE ! 8404: * WORD 2 NODE TO MATCH ON FAILURE ! 8405: * ! 8406: * WHEN A FAILURE OCCURS, THE MOST RECENT ENTRY ON THIS ! 8407: * STACK IS POPPED OFF TO RESTORE THE CURSOR AND POINT ! 8408: * TO THE NODE TO BE MATCHED AS AN ALTERNATIVE. THE ENTRY ! 8409: * AT THE BOTTOM OF THE STACK POINTS TO THE FOLLOWING ! 8410: * SPECIAL NODES DEPENDING ON THE SCAN MODE. ! 8411: * ! 8412: * ANCHORED MODE THE BOTTOM ENTRY POINTS TO THE ! 8413: * SPECIAL NODE NDABO WHICH CAUSES AN ! 8414: * ABORT. THE CURSOR VALUE STORED ! 8415: * WITH THIS ENTRY IS ALWAYS ZERO. ! 8416: * ! 8417: * UNANCHORED MODE THE BOTTOM ENTRY POINTS TO THE ! 8418: * SPECIAL NODE NDUNA WHICH MOVES THE ! 8419: * ANCHOR POINT AND RESTARTS THE MATCH ! 8420: * THE CURSOR SAVED WITH THIS ENTRY ! 8421: * IS THE NUMBER OF CHARACTERS WHICH ! 8422: * LIE BEFORE THE INITIAL ANCHOR POINT ! 8423: * (I.E. THE NUMBER OF ANCHOR MOVES). ! 8424: * THIS ENTRY IS THREE WORDS LONG AND ! 8425: * ALSO CONTAINS THE INITIAL PATTERN. ! 8426: * ! 8427: * ENTRIES ARE MADE ON THIS HISTORY STACK BY ALTERNATIVE ! 8428: * NODES AND BY SOME SPECIAL COMPOUD PATTERNS AS DESCRIBED ! 8429: * LATER ON. THE FOLLOWING GLOBAL LOCATIONS ARE USED DURING ! 8430: * PATTERN MATCHING. ! 8431: * ! 8432: * R$PMS POINTER TO SUBJECT STRING ! 8433: * PMSSL LENGTH OF SUBJECT STRING ! 8434: * PMDFL FLAG SET NON-ZERO FOR DOT PATTERNS ! 8435: * PMHBS BASE PTR FOR CURRENT HISTORY STACK ! 8436: * ! 8437: * THE FOLLOWING EXIT POINTS ARE AVAILABLE TO MATCH ROUTINES ! 8438: * ! 8439: * SUCCP SUCCESS IN MATCHING CURRENT NODE ! 8440: * FAILP FAILURE IN MATCHING CURRENT NODE ! 8441: EJC ! 8442: * ! 8443: * COMPOUND PATTERNS ! 8444: * ! 8445: * SOME PATTERNS HAVE IMPLICIT ALTERNATIVES AND THEIR ! 8446: * REPRESENTATION IN THE PATTERN STRUCTURE CONSISTS OF A ! 8447: * LINKED SET OF NODES AS INDICATED BY THESE DIAGRAMS. ! 8448: * ! 8449: * AS BEFORE, THE + REPRESENTS AN ALTERNATIVE NODE AND ! 8450: * THE DOTTED LINE FROM A + NODE IS THE PARAMETER POINTER ! 8451: * TO THE ALTERNATIVE PATTERN. ! 8452: * ! 8453: * ARB ! 8454: * --- ! 8455: * ! 8456: * +---+ THIS NODE (P$ARB) MATCHES NULL ! 8457: * I B I----- AND STACKS CURSOR, SUCCESSOR PTR, ! 8458: * +---+ CURSOR (COPY) AND A PTR TO NDARC. ! 8459: * ! 8460: * ! 8461: * ! 8462: * ! 8463: * BAL ! 8464: * --- ! 8465: * ! 8466: * +---+ THE P$BAL NODE SCANS A BALANCED ! 8467: * I B I----- STRING AND THEN STACKS A POINTER ! 8468: * +---+ TO ITSELF ON THE HISTORY STACK. ! 8469: EJC ! 8470: * ! 8471: * COMPOUND PATTERN STRUCTURES (CONTINUED) ! 8472: * ! 8473: * ! 8474: * ARBNO ! 8475: * ----- ! 8476: * ! 8477: * +---+ THIS ALTERNATIVE NODE MATCHES NULL ! 8478: * +----I + I----- THE FIRST TIME AND STACKS A POINTER ! 8479: * I +---+ TO THE ARGUMENT PATTERN X. ! 8480: * I . ! 8481: * I . ! 8482: * I +---+ NODE (P$ABA) TO STACK CURSOR ! 8483: * I I A I AND HISTORY STACK BASE PTR. ! 8484: * I +---+ ! 8485: * I I ! 8486: * I I ! 8487: * I +---+ THIS IS THE ARGUMENT PATTERN. AS ! 8488: * I I X I INDICATED, THE SUCCESSOR OF THE ! 8489: * I +---+ PATTERN IS THE P$ABC NODE ! 8490: * I I ! 8491: * I I ! 8492: * I +---+ THIS NODE (P$ABC) POPS PMHBS, ! 8493: * +----I C I STACKS OLD PMHBS AND PTR TO NDABD ! 8494: * +---+ (UNLESS OPTIMISATION HAS OCCURRED) ! 8495: * ! 8496: * STRUCTURE AND EXECUTION OF THIS PATTERN RESEMBLE THOSE OF ! 8497: * RECURSIVE PATTERN MATCHING AND IMMEDIATE ASSIGNMENT. ! 8498: * THE ALTERNATIVE NODE AT THE HEAD OF THE STRUCTURE MATCHES ! 8499: * NULL INITIALLY BUT ON SUBSEQUENT FAILURE ENSURES ATTEMPT ! 8500: * TO MATCH THE ARGUMENT. BEFORE THE ARGUMENT IS MATCHED ! 8501: * P$ABA STACKS THE CURSOR,PMHBS AND A PTR TO P$ABB. IF ! 8502: * THE ARGUMENT CANT BE MATCHED , P$ABB REMOVES THIS SPECIAL ! 8503: * STACK ENTRY AND FAILS. ! 8504: * IF ARGUMENT IS MATCHED , P$ABC RESTORES THE OUTER PMHBS ! 8505: * VALUE (SAVED BY P$ABA) . THEN IF THE ARGUMENT HAS LEFT ! 8506: * ALTERNATIVES ON STACK IT STACKS THE INNER VALUE OF PMHBS ! 8507: * AND A PTR TO NDABD. IF ARGUMENT LEFT NOTHING ON THE STACK ! 8508: * IT OPTIMISES BY REMOVING ITEMS STACKED BY P$ABA. FINALLY ! 8509: * A CHECK IS MADE THAT ARGUMENT MATCHED MORE THAN THE NULL ! 8510: * STRING (CHECK IS INTENDED TO PREVENT USELESS LOOPING). ! 8511: * IF SO THE SUCCESSOR IS AGAIN THE ALTERNATIVE NODE AT THE ! 8512: * HEAD OF THE STRUCTURE , ENSURING A POSSIBLE EXTRA ATTEMPT ! 8513: * TO MATCH THE ARG IF NECESSARY. IF NOT , THE SUCCESSOR TO ! 8514: * ALTERNATIVE IS TAKEN SO AS TO TERMINATE THE LOOP. P$ABD ! 8515: * RESTORES INNER PMHBS PTR AND FAILS , THUS TRYING TO MATCH ! 8516: * ALTERNATIVES LEFT BY THE ARBNO ARGUMENT. ! 8517: EJC ! 8518: * ! 8519: * COMPOUND PATTERN STRUCTURES (CONTINUED) ! 8520: * ! 8521: * BREAKX ! 8522: * ------ ! 8523: * ! 8524: * +---+ THIS NODE IS A BREAK NODE FOR ! 8525: * +----I B I THE ARGUMENT TO BREAKX, IDENTICAL ! 8526: * I +---+ TO AN ORDINARY BREAK NODE. ! 8527: * I I ! 8528: * I I ! 8529: * I +---+ THIS ALTERNATIVE NODE STACKS A ! 8530: * I I + I----- POINTER TO THE BREAKX NODE TO ! 8531: * I +---+ ALLOW FOR SUBSEQUENT FAILURE ! 8532: * I . ! 8533: * I . ! 8534: * I +---+ THIS IS THE BREAKX NODE ITSELF. IT ! 8535: * +----I X I MATCHES ONE CHARACTER AND THEN ! 8536: * +---+ PROCEEDS BACK TO THE BREAK NODE. ! 8537: * ! 8538: * ! 8539: * ! 8540: * ! 8541: * FENCE ! 8542: * ----- ! 8543: * ! 8544: * +---+ THE FENCE NODE MATCHES NULL AND ! 8545: * I F I----- STACKS A POINTER TO NODE NDABO TO ! 8546: * +---+ ABORT ON A SUBSEQUENT REMATCH ! 8547: * ! 8548: * ! 8549: * ! 8550: * ! 8551: * SUCCEED ! 8552: * ------- ! 8553: * ! 8554: * +---+ THE NODE FOR SUCCEED MATCHES NULL ! 8555: * I S I----- AND STACKS A POINTER TO ITSELF ! 8556: * +---+ TO REPEAT THE MATCH ON A FAILURE. ! 8557: EJC ! 8558: * ! 8559: * COMPOUND PATTERNS (CONTINUED) ! 8560: * ! 8561: * BINARY DOT (PATTERN ASSIGNMENT) ! 8562: * ------------------------------- ! 8563: * ! 8564: * +---+ THIS NODE (P$PAA) SAVES THE CURRENT ! 8565: * I A I CURSOR AND A POINTER TO THE ! 8566: * +---+ SPECIAL NODE NDPAB ON THE STACK. ! 8567: * I ! 8568: * I ! 8569: * +---+ THIS IS THE STRUCTURE FOR THE ! 8570: * I X I PATTERN LEFT ARGUMENT OF THE ! 8571: * +---+ PATTERN ASSIGNMENT CALL. ! 8572: * I ! 8573: * I ! 8574: * +---+ THIS NODE (P$PAC) SAVES THE CURSOR, ! 8575: * I C I----- A PTR TO ITSELF, THE CURSOR (COPY) ! 8576: * +---+ AND A PTR TO NDPAD ON THE STACK. ! 8577: * ! 8578: * ! 8579: * THE FUNCTION OF THE MATCH ROUTINE FOR NDPAB (P$PAB) ! 8580: * IS SIMPLY TO UNSTACK ITSELF AND FAIL BACK ONTO THE STACK. ! 8581: * ! 8582: * THE MATCH ROUTINE FOR P$PAC ALSO SETS THE GLOBAL PATTERN ! 8583: * FLAG PMDFL NON-ZERO TO INDICATE THAT PATTERN ASSIGNMENTS ! 8584: * MAY HAVE OCCURED IN THE PATTERN MATCH ! 8585: * ! 8586: * IF PMDFL IS SET AT THE END OF THE MATCH (SEE P$NTH), THE ! 8587: * HISTORY STACK IS SCANNED FOR MATCHING NDPAB-NDPAD PAIRS ! 8588: * AND THE CORRESPONDING PATTERN ASSIGNMENTS ARE EXECUTED. ! 8589: * ! 8590: * THE FUNCTION OF THE MATCH ROUTINE FOR NDPAD (P$PAD) ! 8591: * IS SIMPLY TO REMOVE ITS ENTRY FROM THE STACK AND FAIL. ! 8592: * THIS INCLUDES REMOVING THE SPECIAL NODE POINTER STORED ! 8593: * IN ADDITION TO THE STANDARD TWO ENTRIES ON THE STACK. ! 8594: EJC ! 8595: * ! 8596: * COMPOUNT PATTERN STRUCTURES (CONTINUED) ! 8597: * ! 8598: * FENCE (FUNCTION) ! 8599: * ---------------- ! 8600: * ! 8601: * +---+ THIS NODE (P$FNA) SAVES THE ! 8602: * I A I CURRENT HISTORY STACK AND A ! 8603: * +---+ POINTER TO NDFNB ON THE STACK. ! 8604: * I ! 8605: * I ! 8606: * +---+ THIS IS THE PATTERN STRUCTURE ! 8607: * I X I GIVEN AS THE ARGUMENT TO THE ! 8608: * +---+ FENCE FUNCTION. ! 8609: * I ! 8610: * I ! 8611: * +---+ THIS NODE P$FNC RESTORES THE OUTER ! 8612: * I C I HISTORY STACK PTR SAVED IN P$FNA, ! 8613: * +---+ AND STACKS THE INNER STACK BASE ! 8614: * PTR AND A POINTER TO NDFND ON THE ! 8615: * STACK. ! 8616: * ! 8617: * NDFNB (F$FNB) SIMPLY IS THE FAILURE EXIT FOR PATTERN ! 8618: * ARGUMENT FAILURE, AND IT POPS ITSELF AND FAILS ONTO THE ! 8619: * STACK. ! 8620: * ! 8621: * THE MATCH ROUTINE P$FNC ALLOWS FOR AN OPTIMIZATION WHEN ! 8622: * THE FENCE PATTERN LEAVES NO ALTERNATIVES. IN THIS CASE, ! 8623: * THE NDFNB ENTRY IS POPPED, AND THE MATCH CONTINUES. ! 8624: * ! 8625: * NDFND (P$FND) IS ENTERED WHEN THE PATTERN FAILS AFTER ! 8626: * GOING THROUGH A NON-OPTIMIZED P$FNC, AND IT POPS THE ! 8627: * STACK BACK PAST THE INNTER STACK BASE CREATED BY P$FNA ! 8628: EJC ! 8629: * ! 8630: * COMPOUND PATTERNS (CONTINUED) ! 8631: * ! 8632: * EXPRESSION PATTERNS (RECURSIVE PATTERN MATCHES) ! 8633: * ----------------------------------------------- ! 8634: * ! 8635: * INITIAL ENTRY FOR A PATTERN NODE IS TO THE ROUTINE P$EXA. ! 8636: * IF THE EVALUATED RESULT OF THE EXPRESSION IS ITSELF A ! 8637: * PATTERN, THEN THE FOLLOWING STEPS ARE TAKEN TO ARRANGE ! 8638: * FOR PROPER RECURSIVE PROCESSING. ! 8639: * ! 8640: * 1) A POINTER TO THE CURRENT NODE (THE P$EXA NODE) IS ! 8641: * STORED ON THE HISTORY STACK WITH A DUMMY CURSOR. ! 8642: * ! 8643: * 2) A SPECIAL HISTORY STACK ENTRY IS MADE IN WHICH THE ! 8644: * NODE POINTER POINTS TO NDEXB, AND THE CURSOR VALUE ! 8645: * IS THE SAVED VALUE OF PMHBS ON ENTRY TO THIS NODE. ! 8646: * THE MATCH ROUTINE FOR NDEXB (P$EXB) RESTORES PMHBS ! 8647: * FROM THIS CURSOR ENTRY, POPS OFF THE P$EXA NODE ! 8648: * POINTER AND FAILS. ! 8649: * ! 8650: * 3) THE RESULTING HISTORY STACK POINTER IS SAVED IN ! 8651: * PMHBS TO ESTABLISH A NEW LEVEL OF HISTORY STACK. ! 8652: * ! 8653: * AFTER MATCHING A PATTERN, THE END OF MATCH ROUTINE GETS ! 8654: * CONTROL (P$NTH). THIS ROUTINE PROCEEDS AS FOLLOWS. ! 8655: * ! 8656: * 1) LOAD THE CURRENT VALUE OF PMHBS AND RECOGNIZE THE ! 8657: * OUTER LEVEL CASE BY THE FACT THAT THE ASSOCIATED ! 8658: * CURSOR IN THIS CASE IS THE PATTERN MATCH TYPE CODE ! 8659: * WHICH IS LESS THAN 3. TERMINATE THE MATCH IN THIS ! 8660: * CASE AND CONTINUE EXECUTION OF THE PROGRAM. ! 8661: * ! 8662: * 2) OTHERWISE MAKE A SPECIAL HISTORY STACK ENTRY IN ! 8663: * WHICH THE NODE POINTER POINTS TO THE SPECIAL NODE ! 8664: * NDEXC AND THE CURSOR IS THE CURRENT VALUE OF PMHBS. ! 8665: * THE MATCH ROUTINE FOR NDEXC (P$EXC) RESETS PMHBS TO ! 8666: * THIS (INNER) VALUE AND AND THEN FAILS. ! 8667: * ! 8668: * 3) USING THE HISTORY STACK ENTRY MADE ON STARTING THE ! 8669: * EXPRESSION (ACCESSIBLE WITH THE CURRENT VALUE OF ! 8670: * PMHBS), RESTORE THE P$EXA NODE POINTER AND THE OLD ! 8671: * PMHBS SETTING. TAKE THE SUCCESSOR AND CONTINUE. ! 8672: * ! 8673: * AN OPTIMIZATION IS POSSIBLE IF THE EXPRESSION PATTERN ! 8674: * MAKES NO ENTRIES ON THE HISTORY STACK. IN THIS CASE, ! 8675: * INSTEAD OF BUILDING THE P$EXC NODE IN STEP 2, IT IS MORE ! 8676: * EFFICIENT TO SIMPLY POP OFF THE P$EXB ENTRY AND ITS ! 8677: * ASSOCIATED NODE POINTER. THE EFFECT IS THE SAME. ! 8678: EJC ! 8679: * ! 8680: * COMPOUND PATTERNS (CONTINUED) ! 8681: * ! 8682: * BINARY DOLLAR (IMMEDIATE ASSIGNMENT) ! 8683: * ------------------------------------ ! 8684: * ! 8685: * +---+ THIS NODE (P$IMA) STACKS THE CURSOR ! 8686: * I A I PMHBS AND A PTR TO NDIMB AND RESETS ! 8687: * +---+ THE STACK PTR PMHBS. ! 8688: * I ! 8689: * I ! 8690: * +---+ THIS IS THE LEFT STRUCTURE FOR THE ! 8691: * I X I PATTERN LEFT ARGUMENT OF THE ! 8692: * +---+ IMMEDIATE ASSIGNMENT CALL. ! 8693: * I ! 8694: * I ! 8695: * +---+ THIS NODE (P$IMC) PERFORMS THE ! 8696: * I C I----- ASSIGNMENT, POPS PMHBS AND STACKS ! 8697: * +---+ THE OLD PMHBS AND A PTR TO NDIMD. ! 8698: * ! 8699: * ! 8700: * THE STRUCTURE AND EXECUTION OF THIS PATTERN ARE SIMILAR ! 8701: * TO THOSE OF THE RECURSIVE EXPRESSION PATTERN MATCHING. ! 8702: * ! 8703: * THE MATCH ROUTINE FOR NDIMB (P$IMB) RESTORES THE OUTER ! 8704: * LEVEL VALUE OF PMHBS, UNSTACKS THE SAVED CURSOR AND FAILS ! 8705: * ! 8706: * THE MATCH ROUTINE P$IMC USES THE CURRENT VALUE OF PMHBS ! 8707: * TO LOCATE THE P$IMB ENTRY. THIS ENTRY IS USED TO MAKE ! 8708: * THE ASSIGNMENT AND RESTORE THE OUTER LEVEL VALUE OF ! 8709: * PMHBS. FINALLY, THE INNER LEVEL VALUE OF PMHBS AND A ! 8710: * POINTER TO THE SPECIAL NODE NDIMD ARE STACKED. ! 8711: * ! 8712: * THE MATCH ROUTINE FOR NDIMD (P$IMD) RESTORES THE INNER ! 8713: * LEVEL VALUE OF PMHBS AND FAILS BACK INTO THE STACK. ! 8714: * ! 8715: * AN OPTIMIZATION OCCURS IF THE INNER PATTERN MAKES NO ! 8716: * ENTRIES ON THE HISTORY STACK. IN THIS CASE, P$IMC POPS ! 8717: * THE P$IMB ENTRY INSTEAD OF MAKING A P$IMD ENTRY. ! 8718: EJC ! 8719: * ! 8720: * ARBNO ! 8721: * ! 8722: * SEE COMPOUND PATTERNS SECTION FOR STUCTURE AND ! 8723: * ALGORITHM FOR MATCHING THIS NODE TYPE. ! 8724: * ! 8725: * NO PARAMETERS ! 8726: * ! 8727: P$ABA ENT BL$P0 P0BLK ! 8728: MOV WB,-(XS) STACK CURSOR ! 8729: MOV XR,-(XS) STACK DUMMY NODE PTR ! 8730: MOV PMHBS,-(XS) STACK OLD STACK BASE PTR ! 8731: MOV =NDABB,-(XS) STACK PTR TO NODE NDABB ! 8732: MOV XS,PMHBS STORE NEW STACK BASE PTR ! 8733: BRN SUCCP SUCCEED ! 8734: EJC ! 8735: * ! 8736: * ARBNO (REMOVE P$ABA SPECIAL STACK ENTRY) ! 8737: * ! 8738: * NO PARAMETERS (DUMMY PATTERN) ! 8739: * ! 8740: P$ABB ENT ENTRY POINT ! 8741: MOV WB,PMHBS RESTORE HISTORY STACK BASE PTR ! 8742: BRN FLPOP FAIL AND POP DUMMY NODE PTR ! 8743: EJC ! 8744: * ! 8745: * ARBNO (CHECK IF ARG MATCHED NULL STRING) ! 8746: * ! 8747: * NO PARAMETERS (DUMMY PATTERN) ! 8748: * ! 8749: P$ABC ENT BL$P0 P0BLK ! 8750: MOV PMHBS,XT KEEP P$ABB STACK BASE ! 8751: MOV 3(XT),WA LOAD INITIAL CURSOR ! 8752: MOV 1(XT),PMHBS RESTORE OUTER STACK BASE PTR ! 8753: BEQ XT,XS,PABC1 JUMP IF NO HISTORY STACK ENTRIES ! 8754: MOV XT,-(XS) ELSE SAVE INNER PMHBS ENTRY ! 8755: MOV =NDABD,-(XS) STACK PTR TO SPECIAL NODE NDABD ! 8756: BRN PABC2 MERGE ! 8757: * ! 8758: * OPTIMISE CASE OF NO EXTRA ENTRIES ON STACK FROM ARBNO ARG ! 8759: * ! 8760: PABC1 ADD *NUM04,XS REMOVE NDABB ENTRY AND CURSOR ! 8761: * ! 8762: * MERGE TO CHECK FOR MATCHING OF NULL STRING ! 8763: * ! 8764: PABC2 BNE WA,WB,SUCCP ALLOW FURTHER ATTEMPT IF NON-NULL ! 8765: MOV PTHEN(XR),XR BYPASS ALTERNATIVE NODE SO AS TO .. ! 8766: BRN SUCCP ... REFUSE FURTHER MATCH ATTEMPTS ! 8767: EJC ! 8768: * ! 8769: * ARBNO (TRY FOR ALTERNATIVES IN ARBNO ARGUMENT) ! 8770: * ! 8771: * NO PARAMETERS (DUMMY PATTERN) ! 8772: * ! 8773: P$ABD ENT ENTRY POINT ! 8774: MOV WB,PMHBS RESTORE INNER STACK BASE PTR ! 8775: BRN FAILP AND FAIL ! 8776: EJC ! 8777: * ! 8778: * ABORT ! 8779: * ! 8780: * NO PARAMETERS ! 8781: * ! 8782: P$ABO ENT BL$P0 P0BLK ! 8783: BRN EXFAL SIGNAL STATEMENT FAILURE ! 8784: EJC ! 8785: * ! 8786: * ALTERNATION ! 8787: * ! 8788: * PARM1 ALTERNATIVE NODE ! 8789: * ! 8790: P$ALT ENT BL$P1 P1BLK ! 8791: MOV WB,-(XS) STACK CURSOR ! 8792: MOV PARM1(XR),-(XS) STACK POINTER TO ALTERNATIVE ! 8793: CHK CHECK FOR STACK OVERFLOW ! 8794: BRN SUCCP IF ALL OK, THEN SUCCEED ! 8795: EJC ! 8796: * ! 8797: * ANY (ONE CHARACTER ARGUMENT) (1-CHAR STRING ALSO) ! 8798: * ! 8799: * PARM1 CHARACTER ARGUMENT ! 8800: * ! 8801: P$ANS ENT BL$P1 P1BLK ! 8802: BEQ WB,PMSSL,FAILP FAIL IF NO CHARS LEFT ! 8803: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING ! 8804: PLC XL,WB POINT TO CURRENT CHARACTER ! 8805: LCH WA,(XL) LOAD CURRENT CHARACTER ! 8806: BNE WA,PARM1(XR),FAILP FAIL IF NO MATCH ! 8807: ICV WB ELSE BUMP CURSOR ! 8808: BRN SUCCP AND SUCCEED ! 8809: EJC ! 8810: * ! 8811: * ANY (MULTI-CHARACTER ARGUMENT CASE) ! 8812: * ! 8813: * PARM1 POINTER TO CTBLK ! 8814: * PARM2 BIT MASK TO SELECT BIT IN CTBLK ! 8815: * ! 8816: P$ANY ENT BL$P2 P2BLK ! 8817: * ! 8818: * EXPRESSION ARGUMENT CASE MERGES HERE ! 8819: * ! 8820: PANY1 BEQ WB,PMSSL,FAILP FAIL IF NO CHARACTERS LEFT ! 8821: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING ! 8822: PLC XL,WB GET CHAR PTR TO CURRENT CHARACTER ! 8823: LCH WA,(XL) LOAD CURRENT CHARACTER ! 8824: MOV PARM1(XR),XL POINT TO CTBLK ! 8825: WTB WA CHANGE TO BYTE OFFSET ! 8826: ADD WA,XL POINT TO ENTRY IN CTBLK ! 8827: MOV CTCHS(XL),WA LOAD WORD FROM CTBLK ! 8828: ANB PARM2(XR),WA AND WITH SELECTED BIT ! 8829: ZRB WA,FAILP FAIL IF NO MATCH ! 8830: ICV WB ELSE BUMP CURSOR ! 8831: BRN SUCCP AND SUCCEED ! 8832: EJC ! 8833: * ! 8834: * ANY (EXPRESSION ARGUMENT) ! 8835: * ! 8836: * PARM1 EXPRESSION POINTER ! 8837: * ! 8838: P$AYD ENT BL$P1 P1BLK ! 8839: JSR EVALS EVALUATE STRING ARGUMENT ! 8840: ERR 043,ANY EVALUATED ARGUMENT IS NOT STRING ! 8841: PPM FAILP FAIL IF EVALUATION FAILURE ! 8842: PPM PANY1 MERGE MULTI-CHAR CASE IF OK ! 8843: EJC ! 8844: * ! 8845: * P$ARB INITIAL ARB MATCH ! 8846: * ! 8847: * NO PARAMETERS ! 8848: * ! 8849: * THE P$ARB NODE IS PART OF A COMPOUND PATTERN STRUCTURE ! 8850: * FOR AN ARB PATTERN (SEE DESCRIPTION OF COMPOUND PATTERNS) ! 8851: * ! 8852: P$ARB ENT BL$P0 P0BLK ! 8853: MOV PTHEN(XR),XR LOAD SUCCESSOR POINTER ! 8854: MOV WB,-(XS) STACK DUMMY CURSOR ! 8855: MOV XR,-(XS) STACK SUCCESSOR POINTER ! 8856: MOV WB,-(XS) STACK CURSOR ! 8857: MOV =NDARC,-(XS) STACK PTR TO SPECIAL NODE NDARC ! 8858: BRI (XR) EXECUTE NEXT NODE MATCHING NULL ! 8859: EJC ! 8860: * ! 8861: * P$ARC EXTEND ARB MATCH ! 8862: * ! 8863: * NO PARAMETERS (DUMMY PATTERN) ! 8864: * ! 8865: P$ARC ENT ENTRY POINT ! 8866: BEQ WB,PMSSL,FLPOP FAIL AND POP STACK TO SUCCESSOR ! 8867: ICV WB ELSE BUMP CURSOR ! 8868: MOV WB,-(XS) STACK UPDATED CURSOR ! 8869: MOV XR,-(XS) RESTACK POINTER TO NDARC NODE ! 8870: MOV 2(XS),XR LOAD SUCCESSOR POINTER ! 8871: BRI (XR) OFF TO REEXECUTE SUCCESSOR NODE ! 8872: EJC ! 8873: * ! 8874: * BAL ! 8875: * ! 8876: * NO PARAMETERS ! 8877: * ! 8878: * THE P$BAL NODE IS PART OF THE COMPOUND STRUCTURE BUILT ! 8879: * FOR BAL (SEE SECTION ON COMPOUND PATTERNS). ! 8880: * ! 8881: P$BAL ENT BL$P0 P0BLK ! 8882: ZER WC ZERO PARENTHESES LEVEL COUNTER ! 8883: MOV R$PMS,XL POINT TO SUBJECT STRING ! 8884: PLC XL,WB POINT TO CURRENT CHARACTER ! 8885: BRN PBAL2 JUMP INTO SCAN LOOP ! 8886: * ! 8887: * LOOP TO SCAN OUT CHARACTERS ! 8888: * ! 8889: PBAL1 LCH WA,(XL)+ LOAD NEXT CHARACTER, BUMP POINTER ! 8890: ICV WB PUSH CURSOR FOR CHARACTER ! 8891: BEQ WA,=CH$PP,PBAL3 JUMP IF LEFT PAREN ! 8892: BEQ WA,=CH$RP,PBAL4 JUMP IF RIGHT PAREN ! 8893: BZE WC,PBAL5 ELSE SUCCEED IF AT OUTER LEVEL ! 8894: * ! 8895: * HERE AFTER PROCESSING ONE CHARACTER ! 8896: * ! 8897: PBAL2 BNE WB,PMSSL,PBAL1 LOOP BACK UNLESS END OF STRING ! 8898: BRN FAILP IN WHICH CASE, FAIL ! 8899: * ! 8900: * HERE ON LEFT PAREN ! 8901: * ! 8902: PBAL3 ICV WC BUMP PAREN LEVEL ! 8903: BRN PBAL2 LOOP BACK TO CHECK END OF STRING ! 8904: * ! 8905: * HERE FOR RIGHT PAREN ! 8906: * ! 8907: PBAL4 BZE WC,FAILP FAIL IF NO MATCHING LEFT PAREN ! 8908: DCV WC ELSE DECREMENT LEVEL COUNTER ! 8909: BNZ WC,PBAL2 LOOP BACK IF NOT AT OUTER LEVEL ! 8910: * ! 8911: * HERE AFTER SUCCESSFULLY SCANNING A BALANCED STRING ! 8912: * ! 8913: PBAL5 MOV WB,-(XS) STACK CURSOR ! 8914: MOV XR,-(XS) STACK PTR TO BAL NODE FOR EXTEND ! 8915: BRN SUCCP AND SUCCEED ! 8916: EJC ! 8917: * ! 8918: * BREAK (EXPRESSION ARGUMENT) ! 8919: * ! 8920: * PARM1 EXPRESSION POINTER ! 8921: * ! 8922: P$BKD ENT BL$P1 P1BLK ! 8923: JSR EVALS EVALUATE STRING EXPRESSION ! 8924: ERR 044,BREAK EVALUATED ARGUMENT IS NOT STRING ! 8925: PPM FAILP FAIL IF EVALUATION FAILS ! 8926: PPM PBRK1 MERGE WITH MULTI-CHAR CASE IF OK ! 8927: EJC ! 8928: * ! 8929: * BREAK (ONE CHARACTER ARGUMENT) ! 8930: * ! 8931: * PARM1 CHARACTER ARGUMENT ! 8932: * ! 8933: P$BKS ENT BL$P1 P1BLK ! 8934: MOV PMSSL,WC GET SUBJECT STRING LENGTH ! 8935: SUB WB,WC GET NUMBER OF CHARACTERS LEFT ! 8936: BZE WC,FAILP FAIL IF NO CHARACTERS LEFT ! 8937: LCT WC,WC SET COUNTER FOR CHARS LEFT ! 8938: MOV R$PMS,XL POINT TO SUBJECT STRING ! 8939: PLC XL,WB POINT TO CURRENT CHARACTER ! 8940: * ! 8941: * LOOP TO SCAN TILL BREAK CHARACTER FOUND ! 8942: * ! 8943: PBKS1 LCH WA,(XL)+ LOAD NEXT CHAR, BUMP POINTER ! 8944: BEQ WA,PARM1(XR),SUCCP SUCCEED IF BREAK CHARACTER FOUND ! 8945: ICV WB ELSE PUSH CURSOR ! 8946: BCT WC,PBKS1 LOOP BACK IF MORE TO GO ! 8947: BRN FAILP FAIL IF END OF STRING, NO BREAK CHR ! 8948: EJC ! 8949: * ! 8950: * BREAK (MULTI-CHARACTER ARGUMENT) ! 8951: * ! 8952: * PARM1 POINTER TO CTBLK ! 8953: * PARM2 BIT MASK TO SELECT BIT COLUMN ! 8954: * ! 8955: P$BRK ENT BL$P2 P2BLK ! 8956: * ! 8957: * EXPRESSION ARGUMENT MERGES HERE ! 8958: * ! 8959: PBRK1 MOV PMSSL,WC LOAD SUBJECT STRING LENGTH ! 8960: SUB WB,WC GET NUMBER OF CHARACTERS LEFT ! 8961: BZE WC,FAILP FAIL IF NO CHARACTERS LEFT ! 8962: LCT WC,WC SET COUNTER FOR CHARACTERS LEFT ! 8963: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING ! 8964: PLC XL,WB POINT TO CURRENT CHARACTER ! 8965: MOV XR,PSAVE SAVE NODE POINTER ! 8966: * ! 8967: * LOOP TO SEARCH FOR BREAK CHARACTER ! 8968: * ! 8969: PBRK2 LCH WA,(XL)+ LOAD NEXT CHAR, BUMP POINTER ! 8970: MOV PARM1(XR),XR LOAD POINTER TO CTBLK ! 8971: WTB WA CONVERT TO BYTE OFFSET ! 8972: ADD WA,XR POINT TO CTBLK ENTRY ! 8973: MOV CTCHS(XR),WA LOAD CTBLK WORD ! 8974: MOV PSAVE,XR RESTORE NODE POINTER ! 8975: ANB PARM2(XR),WA AND WITH SELECTED BIT ! 8976: NZB WA,SUCCP SUCCEED IF BREAK CHARACTER FOUND ! 8977: ICV WB ELSE PUSH CURSOR ! 8978: BCT WC,PBRK2 LOOP BACK UNLESS END OF STRING ! 8979: BRN FAILP FAIL IF END OF STRING, NO BREAK CHR ! 8980: EJC ! 8981: * ! 8982: * BREAKX (EXTENSION) ! 8983: * ! 8984: * THIS IS THE ENTRY WHICH CAUSES AN EXTENSION OF A BREAKX ! 8985: * MATCH WHEN FAILURE OCCURS. SEE SECTION ON COMPOUND ! 8986: * PATTERNS FOR FULL DETAILS OF BREAKX MATCHING. ! 8987: * ! 8988: * NO PARAMETERS ! 8989: * ! 8990: P$BKX ENT BL$P0 P0BLK ! 8991: ICV WB STEP CURSOR PAST PREVIOUS BREAK CHR ! 8992: BRN SUCCP SUCCEED TO REMATCH BREAK ! 8993: EJC ! 8994: * ! 8995: * BREAKX (EXPRESSION ARGUMENT) ! 8996: * ! 8997: * SEE SECTION ON COMPOUND PATTERNS FOR FULL STRUCTURE OF ! 8998: * BREAKX PATTERN. THE ACTUAL CHARACTER MATCHING USES A ! 8999: * BREAK NODE. HOWEVER, THE ENTRY FOR THE EXPRESSION ! 9000: * ARGUMENT CASE IS SEPARATED TO GET PROPER ERROR MESSAGES. ! 9001: * ! 9002: * PARM1 EXPRESSION POINTER ! 9003: * ! 9004: P$BXD ENT BL$P1 P1BLK ! 9005: JSR EVALS EVALUATE STRING ARGUMENT ! 9006: ERR 045,BREAKX EVALUATED ARGUMENT IS NOT STRING ! 9007: PPM FAILP FAIL IF EVALUATION FAILS ! 9008: PPM PBRK1 MERGE WITH BREAK IF ALL OK ! 9009: EJC ! 9010: * ! 9011: * CURSOR ASSIGNMENT ! 9012: * ! 9013: * PARM1 NAME BASE ! 9014: * PARM2 NAME OFFSET ! 9015: * ! 9016: P$CAS ENT BL$P2 P2BLK ! 9017: MOV XR,-(XS) SAVE NODE POINTER ! 9018: MOV WB,-(XS) SAVE CURSOR ! 9019: MOV PARM1(XR),XL LOAD NAME BASE ! 9020: MTI WB LOAD CURSOR AS INTEGER ! 9021: MOV PARM2(XR),WB LOAD NAME OFFSET ! 9022: JSR ICBLD GET ICBLK FOR CURSOR VALUE ! 9023: MOV WB,WA MOVE NAME OFFSET ! 9024: MOV XR,WB MOVE VALUE TO ASSIGN ! 9025: JSR ASINP PERFORM ASSIGNMENT ! 9026: PPM FLPOP FAIL ON ASSIGNMENT FAILURE ! 9027: MOV (XS)+,WB ELSE RESTORE CURSOR ! 9028: MOV (XS)+,XR RESTORE NODE POINTER ! 9029: BRN SUCCP AND SUCCEED MATCHING NULL ! 9030: EJC ! 9031: * ! 9032: * EXPRESSION NODE (P$EXA, INITIAL ENTRY) ! 9033: * ! 9034: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 9035: * ALGORITHMS FOR HANDLING EXPRESSION NODES. ! 9036: * ! 9037: * PARM1 EXPRESSION POINTER ! 9038: * ! 9039: P$EXA ENT BL$P1 P1BLK ! 9040: JSR EVALP EVALUATE EXPRESSION ! 9041: PPM FAILP FAIL IF EVALUATION FAILS ! 9042: BLO WA,=P$AAA,PEXA1 JUMP IF RESULT IS NOT A PATTERN ! 9043: * ! 9044: * HERE IF RESULT OF EXPRESSION IS A PATTERN ! 9045: * ! 9046: MOV WB,-(XS) STACK DUMMY CURSOR ! 9047: MOV XR,-(XS) STACK PTR TO P$EXA NODE ! 9048: MOV PMHBS,-(XS) STACK HISTORY STACK BASE PTR ! 9049: MOV =NDEXB,-(XS) STACK PTR TO SPECIAL NODE NDEXB ! 9050: MOV XS,PMHBS STORE NEW STACK BASE POINTER ! 9051: MOV XL,XR COPY NODE POINTER ! 9052: BRI (XR) MATCH FIRST NODE IN EXPRESSION PAT ! 9053: * ! 9054: * HERE IF RESULT OF EXPRESSION IS NOT A PATTERN ! 9055: * ! 9056: PEXA1 BEQ WA,=B$SCL,PEXA2 JUMP IF IT IS ALREADY A STRING ! 9057: MOV XL,-(XS) ELSE STACK RESULT ! 9058: MOV XR,XL SAVE NODE POINTER ! 9059: JSR GTSTG CONVERT RESULT TO STRING ! 9060: ERR 046,EXPRESSION DOES NOT EVALUATE TO PATTERN ! 9061: MOV XR,WC COPY STRING POINTER ! 9062: MOV XL,XR RESTORE NODE POINTER ! 9063: MOV WC,XL COPY STRING POINTER AGAIN ! 9064: * ! 9065: * MERGE HERE WITH STRING POINTER IN XL ! 9066: * ! 9067: PEXA2 BZE SCLEN(XL),SUCCP JUST SUCCEED IF NULL STRING ! 9068: BRN PSTR1 ELSE MERGE WITH STRING CIRCUIT ! 9069: EJC ! 9070: * ! 9071: * EXPRESSION NODE (P$EXB, REMOVE NDEXB ENTRY) ! 9072: * ! 9073: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 9074: * ALGORITHMS FOR HANDLING EXPRESSION NODES. ! 9075: * ! 9076: * NO PARAMETERS (DUMMY PATTERN) ! 9077: * ! 9078: P$EXB ENT ENTRY POINT ! 9079: MOV WB,PMHBS RESTORE OUTER LEVEL STACK POINTER ! 9080: BRN FLPOP FAIL AND POP P$EXA NODE PTR ! 9081: EJC ! 9082: * ! 9083: * EXPRESSION NODE (P$EXC, REMOVE NDEXC ENTRY) ! 9084: * ! 9085: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 9086: * ALGORITHMS FOR HANDLING EXPRESSION NODES. ! 9087: * ! 9088: * NO PARAMETERS (DUMMY PATTERN) ! 9089: * ! 9090: P$EXC ENT ENTRY POINT ! 9091: MOV WB,PMHBS RESTORE INNER STACK BASE POINTER ! 9092: BRN FAILP AND FAIL INTO EXPR PATTERN ALTERNVS ! 9093: EJC ! 9094: * ! 9095: * FAIL ! 9096: * ! 9097: * NO PARAMETERS ! 9098: * ! 9099: P$FAL ENT BL$P0 P0BLK ! 9100: BRN FAILP JUST SIGNAL FAILURE ! 9101: EJC ! 9102: * ! 9103: * FENCE ! 9104: * ! 9105: * SEE COMPOUND PATTERNS SECTION FOR THE STRUCTURE AND ! 9106: * ALGORITHM FOR MATCHING THIS NODE TYPE. ! 9107: * ! 9108: * NO PARAMETERS ! 9109: * ! 9110: P$FEN ENT BL$P0 P0BLK ! 9111: MOV WB,-(XS) STACK DUMMY CURSOR ! 9112: MOV =NDABO,-(XS) STACK PTR TO ABORT NODE ! 9113: BRN SUCCP AND SUCCEED MATCHING NULL ! 9114: EJC ! 9115: * ! 9116: * FENCE (FUNCTION) ! 9117: * ! 9118: * SEE COMPOUND PATTERNS COMMENTS AT START OF THIS SECTION ! 9119: * FOR DETAILS OF SCHEME ! 9120: * ! 9121: * NO PARAMETERS ! 9122: * ! 9123: P$FNA ENT BL$P0 P0BLK ! 9124: MOV PMHBS,-(XS) STACK CURRENT HISTORY STACK BASE ! 9125: MOV =NDFNB,-(XS) STACK INDIR PTR TO P$FNB (FAILURE) ! 9126: MOV XS,PMHBS BEGIN NEW HISTORY STACK ! 9127: BRN SUCCP SUCCEED ! 9128: EJC ! 9129: * ! 9130: * FENCE (FUNCTION) (RESET HISTORY STACK AND FAIL) ! 9131: * ! 9132: * NO PARAMETERS (DUMMY PATTERN) ! 9133: * ! 9134: P$FNB ENT BL$P0 P0BLK ! 9135: MOV WB,PMHBS RESTORE OUTER PMHBS STACK BASE ! 9136: BRN FAILP ...AND FAIL ! 9137: EJC ! 9138: * ! 9139: * FENCE (FUNCTION) (MAKE FENCE TRAP ENTRY ON STACK) ! 9140: * ! 9141: * NO PARAMETERS (DUMMY PATTERN) ! 9142: * ! 9143: P$FNC ENT BL$P0 P0BLK ! 9144: MOV PMHBS,XT GET INNER STACK BASE PTR ! 9145: MOV NUM01(XT),PMHBS RESTORE OUTER STACK BASE ! 9146: BEQ XT,XS,PFNC1 OPTIMIZE IF NO ALTERNATIVES ! 9147: MOV XT,-(XS) ELSE STACK INNER STACK BASE ! 9148: MOV =NDFND,-(XS) STACK PTR TO NDFND ! 9149: BRN SUCCP SUCCEED ! 9150: * ! 9151: * HERE WHEN FENCE FUNCTION LEFT NOTHING ON THE STACK ! 9152: * ! 9153: PFNC1 ADD *NUM02,XS POP OFF P$FNB ENTRY ! 9154: BRN SUCCP SUCCEED ! 9155: EJC ! 9156: * ! 9157: * FENCE (FUNCTION) (SKIP PAST ALTERNATIVES ON FAILURE) ! 9158: * ! 9159: * NO PARAMETERS (DUMMY PATTERN) ! 9160: * ! 9161: P$FND ENT BL$P0 P0BLK ! 9162: MOV WB,XS POP STACK TO FENCE() HISTORY BASE ! 9163: BRN FLPOP POP BASE ENTRY AND FAIL ! 9164: EJC ! 9165: * ! 9166: * IMMEDIATE ASSIGNMENT (INITIAL ENTRY, SAVE CURRENT CURSOR) ! 9167: * ! 9168: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE ! 9169: * STRUCTURE AND ALGORITHM FOR MATCHING THIS NODE TYPE. ! 9170: * ! 9171: * NO PARAMETERS ! 9172: * ! 9173: P$IMA ENT BL$P0 P0BLK ! 9174: MOV WB,-(XS) STACK CURSOR ! 9175: MOV XR,-(XS) STACK DUMMY NODE POINTER ! 9176: MOV PMHBS,-(XS) STACK OLD STACK BASE POINTER ! 9177: MOV =NDIMB,-(XS) STACK PTR TO SPECIAL NODE NDIMB ! 9178: MOV XS,PMHBS STORE NEW STACK BASE POINTER ! 9179: BRN SUCCP AND SUCCEED ! 9180: EJC ! 9181: * ! 9182: * IMMEDIATE ASSIGNMENT (REMOVE CURSOR MARK ENTRY) ! 9183: * ! 9184: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE ! 9185: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 9186: * ! 9187: * NO PARAMETERS (DUMMY PATTERN) ! 9188: * ! 9189: P$IMB ENT ENTRY POINT ! 9190: MOV WB,PMHBS RESTORE HISTORY STACK BASE PTR ! 9191: BRN FLPOP FAIL AND POP DUMMY NODE PTR ! 9192: EJC ! 9193: * ! 9194: * IMMEDIATE ASSIGNMENT (PERFORM ACTUAL ASSIGNMENT) ! 9195: * ! 9196: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE ! 9197: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 9198: * ! 9199: * PARM1 NAME BASE OF VARIABLE ! 9200: * PARM2 NAME OFFSET OF VARIABLE ! 9201: * ! 9202: P$IMC ENT BL$P2 P2BLK ! 9203: MOV PMHBS,XT LOAD POINTER TO P$IMB ENTRY ! 9204: MOV WB,WA COPY FINAL CURSOR ! 9205: MOV 3(XT),WB LOAD INITIAL CURSOR ! 9206: MOV 1(XT),PMHBS RESTORE OUTER STACK BASE POINTER ! 9207: BEQ XT,XS,PIMC1 JUMP IF NO HISTORY STACK ENTRIES ! 9208: MOV XT,-(XS) ELSE SAVE INNER PMHBS POINTER ! 9209: MOV =NDIMD,-(XS) AND A PTR TO SPECIAL NODE NDIMD ! 9210: BRN PIMC2 MERGE ! 9211: * ! 9212: * HERE IF NO ENTRIES MADE ON HISTORY STACK ! 9213: * ! 9214: PIMC1 ADD *NUM04,XS REMOVE NDIMB ENTRY AND CURSOR ! 9215: * ! 9216: * MERGE HERE TO PERFORM ASSIGNMENT ! 9217: * ! 9218: PIMC2 MOV WA,-(XS) SAVE CURRENT (FINAL) CURSOR ! 9219: MOV XR,-(XS) SAVE CURRENT NODE POINTER ! 9220: MOV R$PMS,XL POINT TO SUBJECT STRING ! 9221: SUB WB,WA COMPUTE SUBSTRING LENGTH ! 9222: JSR SBSTR BUILD SUBSTRING ! 9223: MOV XR,WB MOVE RESULT ! 9224: MOV (XS),XR RELOAD NODE POINTER ! 9225: MOV PARM1(XR),XL LOAD NAME BASE ! 9226: MOV PARM2(XR),WA LOAD NAME OFFSET ! 9227: JSR ASINP PERFORM ASSIGNMENT ! 9228: PPM FLPOP FAIL IF ASSIGNMENT FAILS ! 9229: MOV (XS)+,XR ELSE RESTORE NODE POINTER ! 9230: MOV (XS)+,WB RESTORE CURSOR ! 9231: BRN SUCCP AND SUCCEED ! 9232: EJC ! 9233: * ! 9234: * IMMEDIATE ASSIGNMENT (REMOVE NDIMD ENTRY ON FAILURE) ! 9235: * ! 9236: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE ! 9237: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 9238: * ! 9239: * NO PARAMETERS (DUMMY PATTERN) ! 9240: * ! 9241: P$IMD ENT ENTRY POINT ! 9242: MOV WB,PMHBS RESTORE INNER STACK BASE POINTER ! 9243: BRN FAILP AND FAIL ! 9244: EJC ! 9245: * ! 9246: * LEN (INTEGER ARGUMENT) ! 9247: * ! 9248: * PARM1 INTEGER ARGUMENT ! 9249: * ! 9250: P$LEN ENT BL$P1 P1BLK ! 9251: * ! 9252: * EXPRESSION ARGUMENT CASE MERGES HERE ! 9253: * ! 9254: PLEN1 ADD PARM1(XR),WB PUSH CURSOR INDICATED AMOUNT ! 9255: BLE WB,PMSSL,SUCCP SUCCEED IF NOT OFF END ! 9256: BRN FAILP ELSE FAIL ! 9257: EJC ! 9258: * ! 9259: * LEN (EXPRESSION ARGUMENT) ! 9260: * ! 9261: * PARM1 EXPRESSION POINTER ! 9262: * ! 9263: P$LND ENT BL$P1 P1BLK ! 9264: JSR EVALI EVALUATE INTEGER ARGUMENT ! 9265: ERR 047,LEN EVALUATED ARGUMENT IS NOT INTEGER ! 9266: ERR 048,LEN EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE ! 9267: PPM FAILP FAIL IF EVALUATION FAILS ! 9268: PPM PLEN1 MERGE WITH NORMAL CIRCUIT IF OK ! 9269: EJC ! 9270: * ! 9271: * NOTANY (EXPRESSION ARGUMENT) ! 9272: * ! 9273: * PARM1 EXPRESSION POINTER ! 9274: * ! 9275: P$NAD ENT BL$P1 P1BLK ! 9276: JSR EVALS EVALUATE STRING ARGUMENT ! 9277: ERR 049,NOTANY EVALUATED ARGUMENT IS NOT STRING ! 9278: PPM FAILP FAIL IF EVALUATION FAILS ! 9279: PPM PNAY1 MERGE WITH MULTI-CHAR CASE IF OK ! 9280: EJC ! 9281: * ! 9282: * NOTANY (ONE CHARACTER ARGUMENT) ! 9283: * ! 9284: * PARM1 CHARACTER ARGUMENT ! 9285: * ! 9286: P$NAS ENT BL$P1 ENTRY POINT ! 9287: BEQ WB,PMSSL,FAILP FAIL IF NO CHARS LEFT ! 9288: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING ! 9289: PLC XL,WB POINT TO CURRENT CHARACTER IN STRIN ! 9290: LCH WA,(XL) LOAD CURRENT CHARACTER ! 9291: BEQ WA,PARM1(XR),FAILP FAIL IF MATCH ! 9292: ICV WB ELSE BUMP CURSOR ! 9293: BRN SUCCP AND SUCCEED ! 9294: EJC ! 9295: * ! 9296: * NOTANY (MULTI-CHARACTER STRING ARGUMENT) ! 9297: * ! 9298: * PARM1 POINTER TO CTBLK ! 9299: * PARM2 BIT MASK TO SELECT BIT COLUMN ! 9300: * ! 9301: P$NAY ENT BL$P2 P2BLK ! 9302: * ! 9303: * EXPRESSION ARGUMENT CASE MERGES HERE ! 9304: * ! 9305: PNAY1 BEQ WB,PMSSL,FAILP FAIL IF NO CHARACTERS LEFT ! 9306: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING ! 9307: PLC XL,WB POINT TO CURRENT CHARACTER ! 9308: LCH WA,(XL) LOAD CURRENT CHARACTER ! 9309: WTB WA CONVERT TO BYTE OFFSET ! 9310: MOV PARM1(XR),XL LOAD POINTER TO CTBLK ! 9311: ADD WA,XL POINT TO ENTRY IN CTBLK ! 9312: MOV CTCHS(XL),WA LOAD ENTRY FROM CTBLK ! 9313: ANB PARM2(XR),WA AND WITH SELECTED BIT ! 9314: NZB WA,FAILP FAIL IF CHARACTER IS MATCHED ! 9315: ICV WB ELSE BUMP CURSOR ! 9316: BRN SUCCP AND SUCCEED ! 9317: EJC ! 9318: * ! 9319: * END OF PATTERN MATCH ! 9320: * ! 9321: * THIS ROUTINE IS ENTERED ON SUCCESSFUL COMPLETION. ! 9322: * SEE DESCRIPTION OF EXPRESSION PATTERNS IN COMPOUND ! 9323: * PATTERN SECTION FOR HANDLING OF RECURSION IN MATCHING. ! 9324: * ! 9325: * NO PARAMETERS (DUMMY PATTERN) ! 9326: * ! 9327: P$NTH ENT ENTRY POINT ! 9328: MOV PMHBS,XT LOAD POINTER TO BASE OF STACK ! 9329: MOV 1(XT),WA LOAD SAVED PMHBS (OR PATTERN TYPE) ! 9330: BLE WA,=NUM02,PNTH2 JUMP IF OUTER LEVEL (PATTERN TYPE) ! 9331: * ! 9332: * HERE WE ARE AT THE END OF MATCHING AN EXPRESSION PATTERN ! 9333: * ! 9334: MOV WA,PMHBS RESTORE OUTER STACK BASE POINTER ! 9335: MOV 2(XT),XR RESTORE POINTER TO P$EXA NODE ! 9336: BEQ XT,XS,PNTH1 JUMP IF NO HISTORY STACK ENTRIES ! 9337: MOV XT,-(XS) ELSE STACK INNER STACK BASE PTR ! 9338: MOV =NDEXC,-(XS) STACK PTR TO SPECIAL NODE NDEXC ! 9339: BRN SUCCP AND SUCCEED ! 9340: * ! 9341: * HERE IF NO HISTORY STACK ENTRIES DURING PATTERN ! 9342: * ! 9343: PNTH1 ADD *NUM04,XS REMOVE P$EXB ENTRY AND NODE PTR ! 9344: BRN SUCCP AND SUCCEED ! 9345: * ! 9346: * HERE IF END OF MATCH AT OUTER LEVEL ! 9347: * ! 9348: PNTH2 MOV WB,PMSSL SAVE FINAL CURSOR IN SAFE PLACE ! 9349: BZE PMDFL,PNTH6 JUMP IF NO PATTERN ASSIGNMENTS ! 9350: EJC ! 9351: * ! 9352: * END OF PATTERN MATCH (CONTINUED) ! 9353: * ! 9354: * NOW WE MUST PERFORM PATTERN ASSIGNMENTS. THIS IS DONE BY ! 9355: * SCANNING THE HISTORY STACK FOR MATCHING NDPAB-NDPAD PAIRS ! 9356: * ! 9357: PNTH3 DCA XT POINT PAST CURSOR ENTRY ! 9358: MOV -(XT),WA LOAD NODE POINTER ! 9359: BEQ WA,=NDPAD,PNTH4 JUMP IF NDPAD ENTRY ! 9360: BNE WA,=NDPAB,PNTH5 JUMP IF NOT NDPAB ENTRY ! 9361: * ! 9362: * HERE FOR NDPAB ENTRY, STACK INITIAL CURSOR ! 9363: * NOTE THAT THERE MUST BE MORE ENTRIES ON THE STACK. ! 9364: * ! 9365: MOV 1(XT),-(XS) STACK INITIAL CURSOR ! 9366: CHK CHECK FOR STACK OVERFLOW ! 9367: BRN PNTH3 LOOP BACK IF OK ! 9368: * ! 9369: * HERE FOR NDPAD ENTRY. THE STARTING CURSOR FROM THE ! 9370: * MATCHING NDPAD ENTRY IS NOW THE TOP STACK ENTRY. ! 9371: * ! 9372: PNTH4 MOV 1(XT),WA LOAD FINAL CURSOR ! 9373: MOV (XS),WB LOAD INITIAL CURSOR FROM STACK ! 9374: MOV XT,(XS) SAVE HISTORY STACK SCAN PTR ! 9375: SUB WB,WA COMPUTE LENGTH OF STRING ! 9376: * ! 9377: * BUILD SUBSTRING AND PERFORM ASSIGNMENT ! 9378: * ! 9379: MOV R$PMS,XL POINT TO SUBJECT STRING ! 9380: JSR SBSTR CONSTRUCT SUBSTRING ! 9381: MOV XR,WB COPY SUBSTRING POINTER ! 9382: MOV (XS),XT RELOAD HISTORY STACK SCAN PTR ! 9383: MOV 2(XT),XL LOAD POINTER TO P$PAC NODE WITH NAM ! 9384: MOV PARM2(XL),WA LOAD NAME OFFSET ! 9385: MOV PARM1(XL),XL LOAD NAME BASE ! 9386: JSR ASINP PERFORM ASSIGNMENT ! 9387: PPM EXFAL MATCH FAILS IF NAME EVAL FAILS ! 9388: MOV (XS)+,XT ELSE RESTORE HISTORY STACK PTR ! 9389: EJC ! 9390: * ! 9391: * END OF PATTERN MATCH (CONTINUED) ! 9392: * ! 9393: * HERE CHECK FOR END OF ENTRIES ! 9394: * ! 9395: PNTH5 BNE XT,XS,PNTH3 LOOP IF MORE ENTRIES TO SCAN ! 9396: * ! 9397: * HERE AFTER DEALING WITH PATTERN ASSIGNMENTS ! 9398: * ! 9399: PNTH6 MOV PMHBS,XS WIPE OUT HISTORY STACK ! 9400: MOV (XS)+,WB LOAD INITIAL CURSOR ! 9401: MOV (XS)+,WC LOAD MATCH TYPE CODE ! 9402: MOV PMSSL,WA LOAD FINAL CURSOR VALUE ! 9403: MOV R$PMS,XL POINT TO SUBJECT STRING ! 9404: ZER R$PMS CLEAR SUBJECT STRING PTR FOR GBCOL ! 9405: BZE WC,PNTH7 JUMP IF CALL BY NAME ! 9406: BEQ WC,=NUM02,EXITS EXIT IF STATEMENT LEVEL CALL ! 9407: * ! 9408: * HERE WE HAVE A CALL BY VALUE, BUILD SUBSTRING ! 9409: * ! 9410: SUB WB,WA COMPUTE LENGTH OF STRING ! 9411: JSR SBSTR BUILD SUBSTRING ! 9412: BRN EXIXR AND EXIT WITH SUBSTRING VALUE ! 9413: * ! 9414: * HERE FOR CALL BY NAME, MAKE STACK ENTRIES FOR O$RPL ! 9415: * ! 9416: PNTH7 MOV WB,-(XS) STACK INITIAL CURSOR ! 9417: MOV WA,-(XS) STACK FINAL CURSOR ! 9418: .IF .CNBF ! 9419: .ELSE ! 9420: BZE R$PMB,PNTH8 SKIP IF SUBJECT NOT BUFFER ! 9421: MOV R$PMB,XL ELSE GET PTR TO BCBLK INSTEAD ! 9422: .FI ! 9423: * ! 9424: * HERE WITH XL POINTING TO SCBLK OR BCBLK ! 9425: * ! 9426: PNTH8 MOV XL,-(XS) STACK SUBJECT POINTER ! 9427: BRN EXITS EXIT WITH SPECIAL ENTRY ON STACK ! 9428: EJC ! 9429: * ! 9430: * POS (INTEGER ARGUMENT) ! 9431: * ! 9432: * PARM1 INTEGER ARGUMENT ! 9433: * ! 9434: P$POS ENT BL$P1 P1BLK ! 9435: * ! 9436: * EXPRESSION ARGUMENT CASE MERGES HERE ! 9437: * ! 9438: PPOS1 BEQ WB,PARM1(XR),SUCCP SUCCEED IF AT RIGHT LOCATION ! 9439: BRN FAILP ELSE FAIL ! 9440: EJC ! 9441: * ! 9442: * POS (EXPRESSION ARGUMENT) ! 9443: * ! 9444: * PARM1 EXPRESSION POINTER ! 9445: * ! 9446: P$PSD ENT BL$P1 P1BLK ! 9447: JSR EVALI EVALUATE INTEGER ARGUMENT ! 9448: ERR 050,POS EVALUATED ARGUMENT IS NOT INTEGER ! 9449: ERR 051,POS EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE ! 9450: PPM FAILP FAIL IF EVALUATION FAILS ! 9451: PPM PPOS1 MERGE WITH NORMAL CASE IF OK ! 9452: EJC ! 9453: * ! 9454: * PATTERN ASSIGNMENT (INITIAL ENTRY, SAVE CURSOR) ! 9455: * ! 9456: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 9457: * ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 9458: * ! 9459: * NO PARAMETERS ! 9460: * ! 9461: P$PAA ENT BL$P0 P0BLK ! 9462: MOV WB,-(XS) STACK INITIAL CURSOR ! 9463: MOV =NDPAB,-(XS) STACK PTR TO NDPAB SPECIAL NODE ! 9464: BRN SUCCP AND SUCCEED MATCHING NULL ! 9465: EJC ! 9466: * ! 9467: * PATTERN ASSIGNMENT (REMOVE SAVED CURSOR) ! 9468: * ! 9469: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 9470: * ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 9471: * ! 9472: * NO PARAMETERS (DUMMY PATTERN) ! 9473: * ! 9474: P$PAB ENT ENTRY POINT ! 9475: BRN FAILP JUST FAIL (ENTRY IS ALREADY POPPED) ! 9476: EJC ! 9477: * ! 9478: * PATTERN ASSIGNMENT (END OF MATCH, MAKE ASSIGN ENTRY) ! 9479: * ! 9480: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 9481: * ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 9482: * ! 9483: * PARM1 NAME BASE OF VARIABLE ! 9484: * PARM2 NAME OFFSET OF VARIABLE ! 9485: * ! 9486: P$PAC ENT BL$P2 P2BLK ! 9487: MOV WB,-(XS) STACK DUMMY CURSOR VALUE ! 9488: MOV XR,-(XS) STACK POINTER TO P$PAC NODE ! 9489: MOV WB,-(XS) STACK FINAL CURSOR ! 9490: MOV =NDPAD,-(XS) STACK PTR TO SPECIAL NDPAD NODE ! 9491: MNZ PMDFL SET DOT FLAG NON-ZERO ! 9492: BRN SUCCP AND SUCCEED ! 9493: EJC ! 9494: * ! 9495: * PATTERN ASSIGNMENT (REMOVE ASSIGN ENTRY) ! 9496: * ! 9497: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND ! 9498: * ALGORITHMS FOR MATCHING THIS NODE TYPE. ! 9499: * ! 9500: * NO PARAMETERS (DUMMY NODE) ! 9501: * ! 9502: P$PAD ENT ENTRY POINT ! 9503: BRN FLPOP FAIL AND REMOVE P$PAC NODE ! 9504: EJC ! 9505: * ! 9506: * REM ! 9507: * ! 9508: * NO PARAMETERS ! 9509: * ! 9510: P$REM ENT BL$P0 P0BLK ! 9511: MOV PMSSL,WB POINT CURSOR TO END OF STRING ! 9512: BRN SUCCP AND SUCCEED ! 9513: EJC ! 9514: * ! 9515: * RPOS (EXPRESSION ARGUMENT) ! 9516: * ! 9517: * PARM1 EXPRESSION POINTER ! 9518: * ! 9519: P$RPD ENT BL$P1 P1BLK ! 9520: JSR EVALI EVALUATE INTEGER ARGUMENT ! 9521: ERR 052,RPOS EVALUATED ARGUMENT IS NOT INTEGER ! 9522: ERR 053,RPOS EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE ! 9523: PPM FAILP FAIL IF EVALUATION FAILS ! 9524: PPM PRPS1 MERGE WITH NORMAL CASE IF OK ! 9525: EJC ! 9526: * ! 9527: * RPOS (INTEGER ARGUMENT) ! 9528: * ! 9529: * PARM1 INTEGER ARGUMENT ! 9530: * ! 9531: P$RPS ENT BL$P1 P1BLK ! 9532: * ! 9533: * EXPRESSION ARGUMENT CASE MERGES HERE ! 9534: * ! 9535: PRPS1 MOV PMSSL,WC GET LENGTH OF STRING ! 9536: SUB WB,WC GET NUMBER OF CHARACTERS REMAINING ! 9537: BEQ WC,PARM1(XR),SUCCP SUCCEED IF AT RIGHT LOCATION ! 9538: BRN FAILP ELSE FAIL ! 9539: EJC ! 9540: * ! 9541: * RTAB (INTEGER ARGUMENT) ! 9542: * ! 9543: * PARM1 INTEGER ARGUMENT ! 9544: * ! 9545: P$RTB ENT BL$P1 P1BLK ! 9546: * ! 9547: * EXPRESSION ARGUMENT CASE MERGES HERE ! 9548: * ! 9549: PRTB1 MOV WB,WC SAVE INITIAL CURSOR ! 9550: MOV PMSSL,WB POINT TO END OF STRING ! 9551: BLT WB,PARM1(XR),FAILP FAIL IF STRING NOT LONG ENOUGH ! 9552: SUB PARM1(XR),WB ELSE SET NEW CURSOR ! 9553: BGE WB,WC,SUCCP AND SUCCEED IF NOT TOO FAR ALREADY ! 9554: BRN FAILP IN WHICH CASE, FAIL ! 9555: EJC ! 9556: * ! 9557: * RTAB (EXPRESSION ARGUMENT) ! 9558: * ! 9559: * PARM1 EXPRESSION POINTER ! 9560: * ! 9561: P$RTD ENT BL$P1 P1BLK ! 9562: JSR EVALI EVALUATE INTEGER ARGUMENT ! 9563: ERR 054,RTAB EVALUATED ARGUMENT IS NOT INTEGER ! 9564: ERR 055,RTAB EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE ! 9565: PPM FAILP FAIL IF EVALUATION FAILS ! 9566: PPM PRTB1 MERGE WITH NORMAL CASE IF SUCCESS ! 9567: EJC ! 9568: * ! 9569: * SPAN (EXPRESSION ARGUMENT) ! 9570: * ! 9571: * PARM1 EXPRESSION POINTER ! 9572: * ! 9573: P$SPD ENT BL$P1 P1BLK ! 9574: JSR EVALS EVALUATE STRING ARGUMENT ! 9575: ERR 056,SPAN EVALUATED ARGUMENT IS NOT STRING ! 9576: PPM FAILP FAIL IF EVALUATION FAILS ! 9577: PPM PSPN1 MERGE WITH MULTI-CHAR CASE IF OK ! 9578: EJC ! 9579: * ! 9580: * SPAN (MULTI-CHARACTER ARGUMENT CASE) ! 9581: * ! 9582: * PARM1 POINTER TO CTBLK ! 9583: * PARM2 BIT MASK TO SELECT BIT COLUMN ! 9584: * ! 9585: P$SPN ENT BL$P2 P2BLK ! 9586: * ! 9587: * EXPRESSION ARGUMENT CASE MERGES HERE ! 9588: * ! 9589: PSPN1 MOV PMSSL,WC COPY SUBJECT STRING LENGTH ! 9590: SUB WB,WC CALCULATE NUMBER OF CHARACTERS LEFT ! 9591: BZE WC,FAILP FAIL IF NO CHARACTERS LEFT ! 9592: MOV R$PMS,XL POINT TO SUBJECT STRING ! 9593: PLC XL,WB POINT TO CURRENT CHARACTER ! 9594: MOV WB,PSAVC SAVE INITIAL CURSOR ! 9595: MOV XR,PSAVE SAVE NODE POINTER ! 9596: LCT WC,WC SET COUNTER FOR CHARS LEFT ! 9597: * ! 9598: * LOOP TO SCAN MATCHING CHARACTERS ! 9599: * ! 9600: PSPN2 LCH WA,(XL)+ LOAD NEXT CHARACTER, BUMP POINTER ! 9601: WTB WA CONVERT TO BYTE OFFSET ! 9602: MOV PARM1(XR),XR POINT TO CTBLK ! 9603: ADD WA,XR POINT TO CTBLK ENTRY ! 9604: MOV CTCHS(XR),WA LOAD CTBLK ENTRY ! 9605: MOV PSAVE,XR RESTORE NODE POINTER ! 9606: ANB PARM2(XR),WA AND WITH SELECTED BIT ! 9607: ZRB WA,PSPN3 JUMP IF NO MATCH ! 9608: ICV WB ELSE PUSH CURSOR ! 9609: BCT WC,PSPN2 LOOP BACK UNLESS END OF STRING ! 9610: * ! 9611: * HERE AFTER SCANNING MATCHING CHARACTERS ! 9612: * ! 9613: PSPN3 BNE WB,PSAVC,SUCCP SUCCEED IF CHARS MATCHED ! 9614: BRN FAILP ELSE FAIL IF NULL STRING MATCHED ! 9615: EJC ! 9616: * ! 9617: * SPAN (ONE CHARACTER ARGUMENT) ! 9618: * ! 9619: * PARM1 CHARACTER ARGUMENT ! 9620: * ! 9621: P$SPS ENT BL$P1 P1BLK ! 9622: MOV PMSSL,WC GET SUBJECT STRING LENGTH ! 9623: SUB WB,WC CALCULATE NUMBER OF CHARACTERS LEFT ! 9624: BZE WC,FAILP FAIL IF NO CHARACTERS LEFT ! 9625: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING ! 9626: PLC XL,WB POINT TO CURRENT CHARACTER ! 9627: MOV WB,PSAVC SAVE INITIAL CURSOR ! 9628: LCT WC,WC SET COUNTER FOR CHARACTERS LEFT ! 9629: * ! 9630: * LOOP TO SCAN MATCHING CHARACTERS ! 9631: * ! 9632: PSPS1 LCH WA,(XL)+ LOAD NEXT CHARACTER, BUMP POINTER ! 9633: BNE WA,PARM1(XR),PSPS2 JUMP IF NO MATCH ! 9634: ICV WB ELSE PUSH CURSOR ! 9635: BCT WC,PSPS1 AND LOOP UNLESS END OF STRING ! 9636: * ! 9637: * HERE AFTER SCANNING MATCHING CHARACTERS ! 9638: * ! 9639: PSPS2 BNE WB,PSAVC,SUCCP SUCCEED IF CHARS MATCHED ! 9640: BRN FAILP FAIL IF NULL STRING MATCHED ! 9641: EJC ! 9642: * ! 9643: * MULTI-CHARACTER STRING ! 9644: * ! 9645: * NOTE THAT ONE CHARACTER STRINGS USE THE CIRCUIT FOR ! 9646: * ONE CHARACTER ANY ARGUMENTS (P$AN1). ! 9647: * ! 9648: * PARM1 POINTER TO SCBLK FOR STRING ARG ! 9649: * ! 9650: P$STR ENT BL$P1 P1BLK ! 9651: MOV PARM1(XR),XL GET POINTER TO STRING ! 9652: * ! 9653: * MERGE HERE AFTER EVALUATING EXPRESSION WITH STRING VALUE ! 9654: * ! 9655: PSTR1 MOV XR,PSAVE SAVE NODE POINTER ! 9656: MOV R$PMS,XR LOAD SUBJECT STRING POINTER ! 9657: PLC XR,WB POINT TO CURRENT CHARACTER ! 9658: ADD SCLEN(XL),WB COMPUTE NEW CURSOR POSITION ! 9659: BGT WB,PMSSL,FAILP FAIL IF PAST END OF STRING ! 9660: MOV WB,PSAVC SAVE UPDATED CURSOR ! 9661: MOV SCLEN(XL),WA GET NUMBER OF CHARS TO COMPARE ! 9662: PLC XL POINT TO CHARS OF TEST STRING ! 9663: CMC FAILP,FAILP COMPARE, FAIL IF NOT EQUAL ! 9664: MOV PSAVE,XR IF ALL MATCHED, RESTORE NODE PTR ! 9665: MOV PSAVC,WB RESTORE UPDATED CURSOR ! 9666: BRN SUCCP AND SUCCEED ! 9667: EJC ! 9668: * ! 9669: * SUCCEED ! 9670: * ! 9671: * SEE SECTION ON COMPOUND PATTERNS FOR DETAILS OF THE ! 9672: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE ! 9673: * ! 9674: * NO PARAMETERS ! 9675: * ! 9676: P$SUC ENT BL$P0 P0BLK ! 9677: MOV WB,-(XS) STACK CURSOR ! 9678: MOV XR,-(XS) STACK POINTER TO THIS NODE ! 9679: BRN SUCCP SUCCEED MATCHING NULL ! 9680: EJC ! 9681: * ! 9682: * TAB (INTEGER ARGUMENT) ! 9683: * ! 9684: * PARM1 INTEGER ARGUMENT ! 9685: * ! 9686: P$TAB ENT BL$P1 P1BLK ! 9687: * ! 9688: * EXPRESSION ARGUMENT CASE MERGES HERE ! 9689: * ! 9690: PTAB1 BGT WB,PARM1(XR),FAILP FAIL IF TOO FAR ALREADY ! 9691: MOV PARM1(XR),WB ELSE SET NEW CURSOR POSITION ! 9692: BLE WB,PMSSL,SUCCP SUCCEED IF NOT OFF END ! 9693: BRN FAILP ELSE FAIL ! 9694: EJC ! 9695: * ! 9696: * TAB (EXPRESSION ARGUMENT) ! 9697: * ! 9698: * PARM1 EXPRESSION POINTER ! 9699: * ! 9700: P$TBD ENT BL$P1 P1BLK ! 9701: JSR EVALI EVALUATE INTEGER ARGUMENT ! 9702: ERR 057,TAB EVALUATED ARGUMENT IS NOT INTEGER ! 9703: ERR 058,TAB EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE ! 9704: PPM FAILP FAIL IF EVALUATION FAILS ! 9705: PPM PTAB1 MERGE WITH NORMAL CASE IF OK ! 9706: EJC ! 9707: * ! 9708: * ANCHOR MOVEMENT ! 9709: * ! 9710: * NO PARAMETERS (DUMMY NODE) ! 9711: * ! 9712: P$UNA ENT ENTRY POINT ! 9713: MOV WB,XR COPY INITIAL PATTERN NODE POINTER ! 9714: MOV (XS),WB GET INITIAL CURSOR ! 9715: BEQ WB,PMSSL,EXFAL MATCH FAILS IF AT END OF STRING ! 9716: ICV WB ELSE INCREMENT CURSOR ! 9717: MOV WB,(XS) STORE INCREMENTED CURSOR ! 9718: MOV XR,-(XS) RESTACK INITIAL NODE PTR ! 9719: MOV =NDUNA,-(XS) RESTACK UNANCHORED NODE ! 9720: BRI (XR) REMATCH FIRST NODE ! 9721: EJC ! 9722: * ! 9723: * END OF PATTERN MATCH ROUTINES ! 9724: * ! 9725: * THE FOLLOWING ENTRY POINT MARKS THE END OF THE PATTERN ! 9726: * MATCHING ROUTINES AND ALSO THE END OF THE ENTRY POINTS ! 9727: * REFERENCED FROM THE FIRST WORD OF BLOCKS IN DYNAMIC STORE ! 9728: * ! 9729: P$YYY ENT BL$$I MARK LAST ENTRY IN PATTERN SECTION ! 9730: TTL S P I T B O L -- PREDEFINED SNOBOL4 FUNCTIONS ! 9731: * ! 9732: * THE FOLLOWING SECTION CONTAINS CODING FOR FUNCTIONS ! 9733: * WHICH ARE PREDEFINED AND AVAILABLE AT THE SNOBOL LEVEL. ! 9734: * ! 9735: * THESE ROUTINES RECEIVE CONTROL DIRECTLY FROM THE CODE OR ! 9736: * INDIRECTLY THROUGH THE O$FNC, O$FNS OR CFUNC ROUTINES. ! 9737: * IN BOTH CASES THE CONDITIONS ON ENTRY ARE AS FOLLOWS ! 9738: * ! 9739: * THE ARGUMENTS ARE ON THE STACK. THE NUMBER OF ARGUMENTS ! 9740: * HAS BEEN ADJUSTED TO CORRESPOND TO THE SVBLK SVNAR FIELD. ! 9741: * ! 9742: * IN CERTAIN FUNCTIONS THE DIRECT CALL IS NOT PERMITTED ! 9743: * AND IN THESE INSTANCES WE ALSO HAVE. ! 9744: * ! 9745: * (WA) ACTUAL NUMBER OF ARGUMENTS IN CALL ! 9746: * ! 9747: * CONTROL RETURNS BY PLACING THE FUNCTION RESULT VALUE ON ! 9748: * ON THE STACK AND CONTINUING EXECUTION WITH THE NEXT ! 9749: * WORD FROM THE GENERATED CODE. ! 9750: * ! 9751: * THE NAMES OF THE ENTRY POINTS OF THESE FUNCTIONS ARE OF ! 9752: * THE FORM S$XXX WHERE XXX IS THE THREE LETTER CODE FOR ! 9753: * THE SYSTEM VARIABLE NAME. THE FUNCTIONS ARE IN ORDER ! 9754: * ALPHABETICALLY BY THEIR ENTRY NAMES. ! 9755: EJC ! 9756: * ! 9757: * ANY ! 9758: * ! 9759: S$ANY ENT ENTRY POINT ! 9760: MOV =P$ANS,WB SET PCODE FOR SINGLE CHAR CASE ! 9761: MOV =P$ANY,XL PCODE FOR MULTI-CHAR CASE ! 9762: MOV =P$AYD,WC PCODE FOR EXPRESSION CASE ! 9763: JSR PATST CALL COMMON ROUTINE TO BUILD NODE ! 9764: ERR 059,ANY ARGUMENT IS NOT STRING OR EXPRESSION ! 9765: BRN EXIXR JUMP FOR NEXT CODE WORD ! 9766: EJC ! 9767: .IF .CNBF ! 9768: .ELSE ! 9769: * ! 9770: * APPEND ! 9771: * ! 9772: S$APN ENT ENTRY POINT ! 9773: MOV (XS)+,XL GET APPEND ARGUMENT ! 9774: MOV (XS)+,XR GET BCBLK ! 9775: BEQ (XR),=B$BCT,SAPN1 OK IF FIRST ARG IS BCBLK ! 9776: ERB 275,APPEND FIRST ARGUMENT IS NOT BUFFER ! 9777: * ! 9778: * HERE TO DO THE APPEND ! 9779: * ! 9780: SAPN1 JSR APNDB DO THE APPEND ! 9781: ERR 276,APPEND SECOND ARGUMENT IS NOT STRING ! 9782: PPM EXFAL NO ROOM - FAIL ! 9783: BRN EXNUL EXIT WITH NULL RESULT ! 9784: EJC ! 9785: .FI ! 9786: * ! 9787: * APPLY ! 9788: * ! 9789: * APPLY DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT ! 9790: * WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED. ! 9791: * ! 9792: S$APP ENT ENTRY POINT ! 9793: BZE WA,SAPP3 JUMP IF NO ARGUMENTS ! 9794: DCV WA ELSE GET APPLIED FUNC ARG COUNT ! 9795: MOV WA,WB COPY ! 9796: WTB WB CONVERT TO BYTES ! 9797: MOV XS,XT COPY STACK POINTER ! 9798: ADD WB,XT POINT TO FUNCTION ARGUMENT ON STACK ! 9799: MOV (XT),XR LOAD FUNCTION PTR (APPLY 1ST ARG) ! 9800: BZE WA,SAPP2 JUMP IF NO ARGS FOR APPLIED FUNC ! 9801: LCT WB,WA ELSE SET COUNTER FOR LOOP ! 9802: * ! 9803: * LOOP TO MOVE ARGUMENTS UP ON STACK ! 9804: * ! 9805: SAPP1 DCA XT POINT TO NEXT ARGUMENT ! 9806: MOV (XT),1(XT) MOVE ARGUMENT UP ! 9807: BCT WB,SAPP1 LOOP TILL ALL MOVED ! 9808: * ! 9809: * MERGE HERE TO CALL FUNCTION (WA = NUMBER OF ARGUMENTS) ! 9810: * ! 9811: SAPP2 ICA XS ADJUST STACK PTR FOR APPLY 1ST ARG ! 9812: JSR GTNVR GET VARIABLE BLOCK ADDR FOR FUNC ! 9813: PPM SAPP3 JUMP IF NOT NATURAL VARIABLE ! 9814: MOV VRFNC(XR),XL ELSE POINT TO FUNCTION BLOCK ! 9815: BRN CFUNC GO CALL APPLIED FUNCTION ! 9816: * ! 9817: * HERE FOR INVALID FIRST ARGUMENT ! 9818: * ! 9819: SAPP3 ERB 060,APPLY FIRST ARG IS NOT NATURAL VARIABLE NAME ! 9820: EJC ! 9821: * ! 9822: * ARBNO ! 9823: * ! 9824: * ARBNO BUILDS A COMPOUND PATTERN. SEE DESCRIPTION AT ! 9825: * START OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED. ! 9826: * ! 9827: S$ABN ENT ENTRY POINT ! 9828: ZER XR SET PARM1 = 0 FOR THE MOMENT ! 9829: MOV =P$ALT,WB SET PCODE FOR ALTERNATIVE NODE ! 9830: JSR PBILD BUILD ALTERNATIVE NODE ! 9831: MOV XR,XL SAVE PTR TO ALTERNATIVE PATTERN ! 9832: MOV =P$ABC,WB PCODE FOR P$ABC ! 9833: ZER XR P0BLK ! 9834: JSR PBILD BUILD P$ABC NODE ! 9835: MOV XL,PTHEN(XR) PUT ALTERNATIVE NODE AS SUCCESSOR ! 9836: MOV XL,WA REMEMBER ALTERNATIVE NODE POINTER ! 9837: MOV XR,XL COPY P$ABC NODE PTR ! 9838: MOV (XS),XR LOAD ARBNO ARGUMENT ! 9839: MOV WA,(XS) STACK ALTERNATIVE NODE POINTER ! 9840: JSR GTPAT GET ARBNO ARGUMENT AS PATTERN ! 9841: ERR 061,ARBNO ARGUMENT IS NOT PATTERN ! 9842: JSR PCONC CONCAT ARG WITH P$ABC NODE ! 9843: MOV XR,XL REMEMBER PTR TO CONCD PATTERNS ! 9844: MOV =P$ABA,WB PCODE FOR P$ABA ! 9845: ZER XR P0BLK ! 9846: JSR PBILD BUILD P$ABA NODE ! 9847: MOV XL,PTHEN(XR) CONCATENATE NODES ! 9848: MOV (XS),XL RECALL PTR TO ALTERNATIVE NODE ! 9849: MOV XR,PARM1(XL) POINT ALTERNATIVE BACK TO ARGUMENT ! 9850: BRN EXITS JUMP FOR NEXT CODE WORD ! 9851: EJC ! 9852: * ! 9853: * ARG ! 9854: * ! 9855: S$ARG ENT ENTRY POINT ! 9856: JSR GTSMI GET SECOND ARG AS SMALL INTEGER ! 9857: ERR 062,ARG SECOND ARGUMENT IS NOT INTEGER ! 9858: PPM EXFAL FAIL IF OUT OF RANGE OR NEGATIVE ! 9859: MOV XR,WA SAVE ARGUMENT NUMBER ! 9860: MOV (XS)+,XR LOAD FIRST ARGUMENT ! 9861: JSR GTNVR LOCATE VRBLK ! 9862: PPM SARG1 JUMP IF NOT NATURAL VARIABLE ! 9863: MOV VRFNC(XR),XR ELSE LOAD FUNCTION BLOCK POINTER ! 9864: BNE (XR),=B$PFC,SARG1 JUMP IF NOT PROGRAM DEFINED ! 9865: BZE WA,EXFAL FAIL IF ARG NUMBER IS ZERO ! 9866: BGT WA,FARGS(XR),EXFAL FAIL IF ARG NUMBER IS TOO LARGE ! 9867: WTB WA ELSE CONVERT TO BYTE OFFSET ! 9868: ADD WA,XR POINT TO ARGUMENT SELECTED ! 9869: MOV PFAGB(XR),XR LOAD ARGUMENT VRBLK POINTER ! 9870: BRN EXVNM EXIT TO BUILD NMBLK ! 9871: * ! 9872: * HERE IF 1ST ARGUMENT IS BAD ! 9873: * ! 9874: SARG1 ERB 063,ARG FIRST ARGUMENT IS NOT PROGRAM FUNCTION NAME ! 9875: EJC ! 9876: * ! 9877: * ARRAY ! 9878: * ! 9879: S$ARR ENT ENTRY POINT ! 9880: MOV (XS)+,XL LOAD INITIAL ELEMENT VALUE ! 9881: MOV (XS)+,XR LOAD FIRST ARGUMENT ! 9882: JSR GTINT CONVERT FIRST ARG TO INTEGER ! 9883: PPM SAR02 JUMP IF NOT INTEGER ! 9884: * ! 9885: * HERE FOR INTEGER FIRST ARGUMENT, BUILD VCBLK ! 9886: * ! 9887: LDI ICVAL(XR) LOAD INTEGER VALUE ! 9888: ILE SAR10 JUMP IF ZERO OR NEG (BAD DIMENSION) ! 9889: MFI WA,SAR11 ELSE CONVERT TO ONE WORD, TEST OVFL ! 9890: LCT WB,WA COPY ELEMENTS FOR LOOP LATER ON ! 9891: ADD =VCSI$,WA ADD SPACE FOR STANDARD FIELDS ! 9892: WTB WA CONVERT LENGTH TO BYTES ! 9893: BGE WA,MXLEN,SAR11 FAIL IF TOO LARGE ! 9894: JSR ALLOC ALLOCATE SPACE FOR VCBLK ! 9895: MOV =B$VCT,(XR) STORE TYPE WORD ! 9896: MOV WA,VCLEN(XR) SET LENGTH ! 9897: MOV XL,WC COPY DEFAULT VALUE ! 9898: MOV XR,XL COPY VCBLK POINTER ! 9899: ADD *VCVLS,XL POINT TO FIRST ELEMENT VALUE ! 9900: * ! 9901: * LOOP TO SET VECTOR ELEMENTS TO DEFAULT VALUE ! 9902: * ! 9903: SAR01 MOV WC,(XL)+ STORE ONE VALUE ! 9904: BCT WB,SAR01 LOOP TILL ALL STORED ! 9905: BRN EXSID EXIT SETTING IDVAL ! 9906: EJC ! 9907: * ! 9908: * ARRAY (CONTINUED) ! 9909: * ! 9910: * HERE IF FIRST ARGUMENT IS NOT AN INTEGER ! 9911: * ! 9912: SAR02 MOV XR,-(XS) REPLACE ARGUMENT ON STACK ! 9913: JSR XSCNI INITIALIZE SCAN OF FIRST ARGUMENT ! 9914: ERR 064,ARRAY FIRST ARGUMENT IS NOT INTEGER OR STRING ! 9915: PPM EXNUL DUMMY (UNUSED) NULL STRING EXIT ! 9916: MOV R$XSC,-(XS) SAVE PROTOTYPE POINTER ! 9917: MOV XL,-(XS) SAVE DEFAULT VALUE ! 9918: ZER ARCDM ZERO COUNT OF DIMENSIONS ! 9919: ZER ARPTR ZERO OFFSET TO INDICATE PASS ONE ! 9920: LDI INTV1 LOAD INTEGER ONE ! 9921: STI ARNEL INITIALIZE ELEMENT COUNT ! 9922: * ! 9923: * THE FOLLOWING CODE IS EXECUTED TWICE. THE FIRST TIME ! 9924: * (ARPTR EQ 0), IT IS USED TO COUNT THE NUMBER OF ELEMENTS ! 9925: * AND NUMBER OF DIMENSIONS. THE SECOND TIME (ARPTR GT 0) IS ! 9926: * USED TO ACTUALLY FILL IN THE DIM,LBD FIELDS OF THE ARBLK. ! 9927: * ! 9928: SAR03 LDI INTV1 LOAD ONE AS DEFAULT LOW BOUND ! 9929: STI ARSVL SAVE AS LOW BOUND ! 9930: MOV =CH$CL,WC SET DELIMITER ONE = COLON ! 9931: MOV =CH$CM,XL SET DELIMITER TWO = COMMA ! 9932: JSR XSCAN SCAN NEXT BOUND ! 9933: BNE WA,=NUM01,SAR04 JUMP IF NOT COLON ! 9934: * ! 9935: * HERE WE HAVE A COLON ENDING A LOW BOUND ! 9936: * ! 9937: JSR GTINT CONVERT LOW BOUND ! 9938: ERR 065,ARRAY FIRST ARGUMENT LOWER BOUND IS NOT INTEGER ! 9939: LDI ICVAL(XR) LOAD VALUE OF LOW BOUND ! 9940: STI ARSVL STORE LOW BOUND VALUE ! 9941: MOV =CH$CM,WC SET DELIMITER ONE = COMMA ! 9942: MOV WC,XL AND DELIMITER TWO = COMMA ! 9943: JSR XSCAN SCAN HIGH BOUND ! 9944: EJC ! 9945: * ! 9946: * ARRAY (CONTINUED) ! 9947: * ! 9948: * MERGE HERE TO PROCESS UPPER BOUND ! 9949: * ! 9950: SAR04 JSR GTINT CONVERT HIGH BOUND TO INTEGER ! 9951: ERR 066,ARRAY FIRST ARGUMENT UPPER BOUND IS NOT INTEGER ! 9952: LDI ICVAL(XR) GET HIGH BOUND ! 9953: SBI ARSVL SUBTRACT LOWER BOUND ! 9954: IOV SAR10 BAD DIMENSION IF OVERFLOW ! 9955: ILT SAR10 BAD DIMENSION IF NEGATIVE ! 9956: ADI INTV1 ADD 1 TO GET DIMENSION ! 9957: IOV SAR10 BAD DIMENSION IF OVERFLOW ! 9958: MOV ARPTR,XL LOAD OFFSET (ALSO PASS INDICATOR) ! 9959: BZE XL,SAR05 JUMP IF FIRST PASS ! 9960: * ! 9961: * HERE IN SECOND PASS TO STORE LBD AND DIM IN ARBLK ! 9962: * ! 9963: ADD (XS),XL POINT TO CURRENT LOCATION IN ARBLK ! 9964: STI CFP$I(XL) STORE DIMENSION ! 9965: LDI ARSVL LOAD LOW BOUND ! 9966: STI (XL) STORE LOW BOUND ! 9967: ADD *ARDMS,ARPTR BUMP OFFSET TO NEXT BOUNDS ! 9968: BRN SAR06 JUMP TO CHECK FOR END OF BOUNDS ! 9969: * ! 9970: * HERE IN PASS 1 ! 9971: * ! 9972: SAR05 ICV ARCDM BUMP DIMENSION COUNT ! 9973: MLI ARNEL MULTIPLY DIMENSION BY COUNT SO FAR ! 9974: IOV SAR11 TOO LARGE IF OVERFLOW ! 9975: STI ARNEL ELSE STORE UPDATED ELEMENT COUNT ! 9976: * ! 9977: * MERGE HERE AFTER PROCESSING ONE SET OF BOUNDS ! 9978: * ! 9979: SAR06 BNZ WA,SAR03 LOOP BACK UNLESS END OF BOUNDS ! 9980: BNZ ARPTR,SAR09 JUMP IF END OF PASS 2 ! 9981: EJC ! 9982: * ! 9983: * ARRAY (CONTINUED) ! 9984: * ! 9985: * HERE AT END OF PASS ONE, BUILD ARBLK ! 9986: * ! 9987: LDI ARNEL GET NUMBER OF ELEMENTS ! 9988: MFI WB,SAR11 GET AS ADDR INTEGER, TEST OVFLO ! 9989: WTB WB ELSE CONVERT TO LENGTH IN BYTES ! 9990: MOV *ARSI$,WA SET SIZE OF STANDARD FIELDS ! 9991: LCT WC,ARCDM SET DIMENSION COUNT TO CONTROL LOOP ! 9992: * ! 9993: * LOOP TO ALLOW SPACE FOR DIMENSIONS ! 9994: * ! 9995: SAR07 ADD *ARDMS,WA ALLOW SPACE FOR ONE SET OF BOUNDS ! 9996: BCT WC,SAR07 LOOP BACK TILL ALL ACCOUNTED FOR ! 9997: MOV WA,XL SAVE SIZE (=AROFS) ! 9998: * ! 9999: * NOW ALLOCATE SPACE FOR ARBLK ! 10000: * ! 10001: ADD WB,WA ADD SPACE FOR ELEMENTS ! 10002: ICA WA ALLOW FOR ARPRO PROTOTYPE FIELD ! 10003: BGE WA,MXLEN,SAR11 FAIL IF TOO LARGE ! 10004: JSR ALLOC ELSE ALLOCATE ARBLK ! 10005: MOV (XS),WB LOAD DEFAULT VALUE ! 10006: MOV XR,(XS) SAVE ARBLK POINTER ! 10007: MOV WA,WC SAVE LENGTH IN BYTES ! 10008: BTW WA CONVERT LENGTH BACK TO WORDS ! 10009: LCT WA,WA SET COUNTER TO CONTROL LOOP ! 10010: * ! 10011: * LOOP TO CLEAR ENTIRE ARBLK TO DEFAULT VALUE ! 10012: * ! 10013: SAR08 MOV WB,(XR)+ SET ONE WORD ! 10014: BCT WA,SAR08 LOOP TILL ALL SET ! 10015: EJC ! 10016: * ! 10017: * ARRAY (CONTINUED) ! 10018: * ! 10019: * NOW SET INITIAL FIELDS OF ARBLK ! 10020: * ! 10021: MOV (XS)+,XR RELOAD ARBLK POINTER ! 10022: MOV (XS),WB LOAD PROTOTYPE ! 10023: MOV =B$ART,(XR) SET TYPE WORD ! 10024: MOV WC,ARLEN(XR) STORE LENGTH IN BYTES ! 10025: ZER IDVAL(XR) ZERO ID TILL WE GET IT BUILT ! 10026: MOV XL,AROFS(XR) SET PROTOTYPE FIELD PTR ! 10027: MOV ARCDM,ARNDM(XR) SET NUMBER OF DIMENSIONS ! 10028: MOV XR,WC SAVE ARBLK POINTER ! 10029: ADD XL,XR POINT TO PROTOTYPE FIELD ! 10030: MOV WB,(XR) STORE PROTOTYPE PTR IN ARBLK ! 10031: MOV *ARLBD,ARPTR SET OFFSET FOR PASS 2 BOUNDS SCAN ! 10032: MOV WB,R$XSC RESET STRING POINTER FOR XSCAN ! 10033: MOV WC,(XS) STORE ARBLK POINTER ON STACK ! 10034: ZER XSOFS RESET OFFSET PTR TO START OF STRING ! 10035: BRN SAR03 JUMP BACK TO RESCAN BOUNDS ! 10036: * ! 10037: * HERE AFTER FILLING IN BOUNDS INFORMATION (END PASS TWO) ! 10038: * ! 10039: SAR09 MOV (XS)+,XR RELOAD POINTER TO ARBLK ! 10040: BRN EXSID EXIT SETTING IDVAL ! 10041: * ! 10042: * HERE FOR BAD DIMENSION ! 10043: * ! 10044: SAR10 ERB 067,ARRAY DIMENSION IS ZERO,NEGATIVE OR OUT OF RANGE ! 10045: * ! 10046: * HERE IF ARRAY IS TOO LARGE ! 10047: * ! 10048: SAR11 ERB 068,ARRAY SIZE EXCEEDS MAXIMUM PERMITTED ! 10049: EJC ! 10050: .IF .CNBF ! 10051: .ELSE ! 10052: * ! 10053: * BUFFER ! 10054: * ! 10055: S$BUF ENT ENTRY POINT ! 10056: MOV (XS)+,XL GET INITIAL VALUE ! 10057: MOV (XS)+,XR GET REQUESTED ALLOCATION ! 10058: JSR GTINT CONVERT TO INTEGER ! 10059: ERR 269,BUFFER FIRST ARGUMENT IS NOT INTEGER ! 10060: LDI ICVAL(XR) GET VALUE ! 10061: ILE SBF01 BRANCH IF NEGATIVE OR ZERO ! 10062: MFI WA,SBF02 MOVE WITH OVERFLOW CHECK ! 10063: JSR ALOBF ALLOCATE THE BUFFER ! 10064: JSR APNDB COPY IT IN ! 10065: ERR 270,BUFFER SECOND ARGUMENT IS NOT STRING OR BUFFER ! 10066: ERR 271,BUFFER INITIAL VALUE TOO BIG FOR ALLOCATION ! 10067: BRN EXSID EXIT SETTING IDVAL ! 10068: * ! 10069: * HERE FOR INVALID ALLOCATION SIZE ! 10070: * ! 10071: SBF01 ERB 272,BUFFER FIRST ARGUMENT IS NOT POSITIVE ! 10072: * ! 10073: * HERE FOR ALLOCATION SIZE INTEGER OVERFLOW ! 10074: * ! 10075: SBF02 ERB 273,BUFFER SIZE IS TOO BIG ! 10076: EJC ! 10077: .FI ! 10078: * ! 10079: * BREAK ! 10080: * ! 10081: S$BRK ENT ENTRY POINT ! 10082: MOV =P$BKS,WB SET PCODE FOR SINGLE CHAR CASE ! 10083: MOV =P$BRK,XL PCODE FOR MULTI-CHAR CASE ! 10084: MOV =P$BKD,WC PCODE FOR EXPRESSION CASE ! 10085: JSR PATST CALL COMMON ROUTINE TO BUILD NODE ! 10086: ERR 069,BREAK ARGUMENT IS NOT STRING OR EXPRESSION ! 10087: BRN EXIXR JUMP FOR NEXT CODE WORD ! 10088: EJC ! 10089: * ! 10090: * BREAKX ! 10091: * ! 10092: * BREAKX IS A COMPOUND PATTERN. SEE DESCRIPTION AT START ! 10093: * OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED. ! 10094: * ! 10095: S$BKX ENT ENTRY POINT ! 10096: MOV =P$BKS,WB PCODE FOR SINGLE CHAR ARGUMENT ! 10097: MOV =P$BRK,XL PCODE FOR MULTI-CHAR ARGUMENT ! 10098: MOV =P$BXD,WC PCODE FOR EXPRESSION CASE ! 10099: JSR PATST CALL COMMON ROUTINE TO BUILD NODE ! 10100: ERR 070,BREAKX ARGUMENT IS NOT STRING OR EXPRESSION ! 10101: * ! 10102: * NOW HOOK BREAKX NODE ON AT FRONT END ! 10103: * ! 10104: MOV XR,-(XS) SAVE PTR TO BREAK NODE ! 10105: MOV =P$BKX,WB SET PCODE FOR BREAKX NODE ! 10106: JSR PBILD BUILD IT ! 10107: MOV (XS),PTHEN(XR) SET BREAK NODE AS SUCCESSOR ! 10108: MOV =P$ALT,WB SET PCODE FOR ALTERNATION NODE ! 10109: JSR PBILD BUILD (PARM1=ALT=BREAKX NODE) ! 10110: MOV XR,WA SAVE PTR TO ALTERNATION NODE ! 10111: MOV (XS),XR POINT TO BREAK NODE ! 10112: MOV WA,PTHEN(XR) SET ALTERNATE NODE AS SUCCESSOR ! 10113: BRN EXITS EXIT WITH RESULT ON STACK ! 10114: EJC ! 10115: * ! 10116: * CHAR ! 10117: * ! 10118: S$CHR ENT ENTRY POINT ! 10119: JSR GTSMI CONVERT ARG TO INTEGER ! 10120: ERR 281,CHAR ARGUMENT NOT INTEGER ! 10121: PPM SCHR1 TOO BIG ERROR EXIT ! 10122: BGE WC,=CFP$A,SCHR1 SEE IF OUT OF RANGE OF HOST SET ! 10123: MOV =NUM01,WA IF NOT SET SCBLK ALLOCATION ! 10124: MOV WC,WB SAVE CHAR CODE ! 10125: JSR ALOCS ALLOCATE 1 BAU SCBLK ! 10126: MOV XR,XL COPY SCBLK POINTER ! 10127: PSC XL GET SET TO STUFF CHAR ! 10128: SCH WB,(XL)+ STUFF IT ! 10129: ZER XL CLEAR SLOP IN XL ! 10130: BRN EXIXR EXIT WITH SCBLK POINTER ! 10131: * ! 10132: * HERE IF CHAR ARGUMENT IS OUT OF RANGE ! 10133: * ! 10134: SCHR1 ERB 282,CHAR ARGUMENT NOT IN RANGE ! 10135: EJC ! 10136: * ! 10137: * CLEAR ! 10138: * ! 10139: S$CLR ENT ENTRY POINT ! 10140: JSR XSCNI INITIALIZE TO SCAN ARGUMENT ! 10141: ERR 071,CLEAR ARGUMENT IS NOT STRING ! 10142: PPM SCLR2 JUMP IF NULL ! 10143: * ! 10144: * LOOP TO SCAN OUT NAMES IN FIRST ARGUMENT. VARIABLES IN ! 10145: * THE LIST ARE FALGGED BY SETTING VRGET OF VRBLK TO ZERO. ! 10146: * ! 10147: SCLR1 MOV =CH$CM,WC SET DELIMITER ONE = COMMA ! 10148: MOV WC,XL DELIMITER TWO = COMMA ! 10149: JSR XSCAN SCAN NEXT VARIABLE NAME ! 10150: JSR GTNVR LOCATE VRBLK ! 10151: ERR 072,CLEAR ARGUMENT HAS NULL VARIABLE NAME ! 10152: ZER VRGET(XR) ELSE FLAG BY ZEROING VRGET FIELD ! 10153: BNZ WA,SCLR1 LOOP BACK IF STOPPED BY COMMA ! 10154: * ! 10155: * HERE AFTER FLAGGING VARIABLES IN ARGUMENT LIST ! 10156: * ! 10157: SCLR2 MOV HSHTB,WB POINT TO START OF HASH TABLE ! 10158: * ! 10159: * LOOP THROUGH SLOTS IN HASH TABLE ! 10160: * ! 10161: SCLR3 BEQ WB,HSHTE,EXNUL EXIT RETURNING NULL IF NONE LEFT ! 10162: MOV WB,XR ELSE COPY SLOT POINTER ! 10163: ICA WB BUMP SLOT POINTER ! 10164: SUB *VRNXT,XR SET OFFSET TO MERGE INTO LOOP ! 10165: * ! 10166: * LOOP THROUGH VRBLKS ON ONE HASH CHAIN ! 10167: * ! 10168: SCLR4 MOV VRNXT(XR),XR POINT TO NEXT VRBLK ON CHAIN ! 10169: BZE XR,SCLR3 JUMP FOR NEXT BUCKET IF CHAIN END ! 10170: BNZ VRGET(XR),SCLR5 JUMP IF NOT FLAGGED ! 10171: EJC ! 10172: * ! 10173: * CLEAR (CONTINUED) ! 10174: * ! 10175: * HERE FOR FLAGGED VARIABLE, DO NOT SET VALUE TO NULL ! 10176: * ! 10177: JSR SETVR FOR FLAGGED VAR, RESTORE VRGET ! 10178: BRN SCLR4 AND LOOP BACK FOR NEXT VRBLK ! 10179: * ! 10180: * HERE TO SET VALUE OF A VARIABLE TO NULL ! 10181: * PRROTECTED VARIABLES (ARB, ETC) ARE EXEMPT ! 10182: * ! 10183: SCLR5 BEQ VRSTO(XR),=B$VRE,SCLR4 CHECK FOR PROTECTED VARIABLE (REG05) ! 10184: MOV XR,XL COPY VRBLK POINTER (REG05) ! 10185: * ! 10186: * LOOP TO LOCATE VALUE AT END OF POSSIBLE TRBLK CHAIN ! 10187: * ! 10188: SCLR6 MOV XL,WA SAVE BLOCK POINTER ! 10189: MOV VRVAL(XL),XL LOAD NEXT VALUE FIELD ! 10190: BEQ (XL),=B$TRT,SCLR6 LOOP BACK IF TRAPPED ! 10191: * ! 10192: * NOW STORE THE NULL VALUE ! 10193: * ! 10194: MOV WA,XL RESTORE BLOCK POINTER ! 10195: MOV =NULLS,VRVAL(XL) STORE NULL CONSTANT VALUE ! 10196: BRN SCLR4 LOOP BACK FOR NEXT VRBLK ! 10197: EJC ! 10198: * ! 10199: * CODE ! 10200: * ! 10201: S$COD ENT ENTRY POINT ! 10202: MOV (XS)+,XR LOAD ARGUMENT ! 10203: JSR GTCOD CONVERT TO CODE ! 10204: PPM EXFAL FAIL IF CONVERSION IS IMPOSSIBLE ! 10205: BRN EXIXR ELSE RETURN CODE AS RESULT ! 10206: EJC ! 10207: * ! 10208: * COLLECT ! 10209: * ! 10210: S$COL ENT ENTRY POINT ! 10211: MOV (XS)+,XR LOAD ARGUMENT ! 10212: JSR GTINT CONVERT TO INTEGER ! 10213: ERR 073,COLLECT ARGUMENT IS NOT INTEGER ! 10214: LDI ICVAL(XR) LOAD COLLECT ARGUMENT ! 10215: STI CLSVI SAVE COLLECT ARGUMENT ! 10216: ZER WB SET NO MOVE UP ! 10217: JSR GBCOL PERFORM GARBAGE COLLECTION ! 10218: MOV DNAME,WA POINT TO END OF MEMORY ! 10219: SUB DNAMP,WA SUBTRACT NEXT LOCATION ! 10220: BTW WA CONVERT BYTES TO WORDS ! 10221: MTI WA CONVERT WORDS AVAILABLE AS INTEGER ! 10222: SBI CLSVI SUBTRACT ARGUMENT ! 10223: IOV EXFAL FAIL IF OVERFLOW ! 10224: ILT EXFAL FAIL IF NOT ENOUGH ! 10225: ADI CLSVI ELSE RECOMPUTE AVAILABLE ! 10226: BRN EXINT AND EXIT WITH INTEGER RESULT ! 10227: EJC ! 10228: * ! 10229: * CONVERT ! 10230: * ! 10231: S$CNV ENT ENTRY POINT ! 10232: JSR GTSTG CONVERT SECOND ARGUMENT TO STRING ! 10233: ERR 074,CONVERT SECOND ARGUMENT IS NOT STRING ! 10234: .IF .CULC ! 10235: JSR FLSTG FOLD LOWER CASE TO UPPER CASE ! 10236: .FI ! 10237: MOV (XS),XL LOAD FIRST ARGUMENT ! 10238: BNE (XL),=B$PDT,SCV01 JUMP IF NOT PROGRAM DEFINED ! 10239: * ! 10240: * HERE FOR PROGRAM DEFINED DATATYPE ! 10241: * ! 10242: MOV PDDFP(XL),XL POINT TO DFBLK ! 10243: MOV DFNAM(XL),XL LOAD DATATYPE NAME ! 10244: JSR IDENT COMPARE WITH SECOND ARG ! 10245: PPM EXITS EXIT IF IDENT WITH ARG AS RESULT ! 10246: BRN EXFAL ELSE FAIL ! 10247: * ! 10248: * HERE IF NOT PROGRAM DEFINED DATATYPE ! 10249: * ! 10250: SCV01 MOV XR,-(XS) SAVE STRING ARGUMENT ! 10251: MOV =SVCTB,XL POINT TO TABLE OF NAMES TO COMPARE ! 10252: ZER WB INITIALIZE COUNTER ! 10253: MOV WA,WC SAVE LENGTH OF ARGUMENT STRING ! 10254: * ! 10255: * LOOP THROUGH TABLE ENTRIES ! 10256: * ! 10257: SCV02 MOV (XL)+,XR LOAD NEXT TABLE ENTRY, BUMP POINTER ! 10258: BZE XR,EXFAL FAIL IF ZERO MARKING END OF LIST ! 10259: BNE WC,SCLEN(XR),SCV05 JUMP IF WRONG LENGTH ! 10260: MOV XL,CNVTP ELSE STORE TABLE POINTER ! 10261: PLC XR POINT TO CHARS OF TABLE ENTRY ! 10262: MOV (XS),XL LOAD POINTER TO STRING ARGUMENT ! 10263: PLC XL POINT TO CHARS OF STRING ARG ! 10264: MOV WC,WA SET NUMBER OF CHARS TO COMPARE ! 10265: CMC SCV04,SCV04 COMPARE, JUMP IF NO MATCH ! 10266: EJC ! 10267: * ! 10268: * CONVERT (CONTINUED) ! 10269: * ! 10270: * HERE WE HAVE A MATCH ! 10271: * ! 10272: SCV03 MOV WB,XL COPY ENTRY NUMBER ! 10273: ICA XS POP STRING ARG OFF STACK ! 10274: MOV (XS)+,XR LOAD FIRST ARGUMENT ! 10275: BSW XL,CNVTT JUMP TO APPROPRIATE ROUTINE ! 10276: IFF 0,SCV06 STRING ! 10277: IFF 1,SCV07 INTEGER ! 10278: IFF 2,SCV09 NAME ! 10279: IFF 3,SCV10 PATTERN ! 10280: IFF 4,SCV11 ARRAY ! 10281: IFF 5,SCV19 TABLE ! 10282: IFF 6,SCV25 EXPRESSION ! 10283: IFF 7,SCV26 CODE ! 10284: IFF 8,SCV27 NUMERIC ! 10285: .IF .CNRA ! 10286: .ELSE ! 10287: IFF CNVRT,SCV08 REAL ! 10288: .FI ! 10289: .IF .CNBF ! 10290: .ELSE ! 10291: IFF CNVBT,SCV28 BUFFER ! 10292: .FI ! 10293: ESW END OF SWITCH TABLE ! 10294: * ! 10295: * HERE IF NO MATCH WITH TABLE ENTRY ! 10296: * ! 10297: SCV04 MOV CNVTP,XL RESTORE TABLE POINTER, MERGE ! 10298: * ! 10299: * MERGE HERE IF LENGTHS DID NOT MATCH ! 10300: * ! 10301: SCV05 ICV WB BUMP ENTRY NUMBER ! 10302: BRN SCV02 LOOP BACK TO CHECK NEXT ENTRY ! 10303: * ! 10304: * HERE TO CONVERT TO STRING ! 10305: * ! 10306: SCV06 MOV XR,-(XS) REPLACE STRING ARGUMENT ON STACK ! 10307: JSR GTSTG CONVERT TO STRING ! 10308: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE ! 10309: BRN EXIXR ELSE RETURN STRING ! 10310: EJC ! 10311: * ! 10312: * CONVERT (CONTINUED) ! 10313: * ! 10314: * HERE TO CONVERT TO INTEGER ! 10315: * ! 10316: SCV07 JSR GTINT CONVERT TO INTEGER ! 10317: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE ! 10318: BRN EXIXR ELSE RETURN INTEGER ! 10319: .IF .CNRA ! 10320: .ELSE ! 10321: * ! 10322: * HERE TO CONVERT TO REAL ! 10323: * ! 10324: SCV08 JSR GTREA CONVERT TO REAL ! 10325: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE ! 10326: BRN EXIXR ELSE RETURN REAL ! 10327: .FI ! 10328: * ! 10329: * HERE TO CONVERT TO NAME ! 10330: * ! 10331: SCV09 BEQ (XR),=B$NML,EXIXR RETURN IF ALREADY A NAME ! 10332: JSR GTNVR ELSE TRY STRING TO NAME CONVERT ! 10333: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE ! 10334: BRN EXVNM ELSE EXIT BUILDING NMBLK FOR VRBLK ! 10335: * ! 10336: * HERE TO CONVERT TO PATTERN ! 10337: * ! 10338: SCV10 JSR GTPAT CONVERT TO PATTERN ! 10339: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE ! 10340: BRN EXIXR ELSE RETURN PATTERN ! 10341: * ! 10342: * CONVERT TO ARRAY ! 10343: * ! 10344: SCV11 JSR GTARR GET AN ARRAY ! 10345: PPM EXFAL FAIL IF NOT CONVERTIBLE ! 10346: BRN EXSID EXIT SETTING ID FIELD ! 10347: * ! 10348: * CONVERT TO TABLE ! 10349: * ! 10350: SCV19 MOV (XR),WA LOAD FIRST WORD OF BLOCK ! 10351: MOV XR,-(XS) REPLACE ARBLK POINTER ON STACK ! 10352: BEQ WA,=B$TBT,EXITS RETURN ARG IF ALREADY A TABLE ! 10353: BNE WA,=B$ART,EXFAL ELSE FAIL IF NOT AN ARRAY ! 10354: EJC ! 10355: * ! 10356: * CONVERT (CONTINUED) ! 10357: * ! 10358: * HERE TO CONVERT AN ARRAY TO TABLE ! 10359: * ! 10360: BNE ARNDM(XR),=NUM02,EXFAL FAIL IF NOT 2-DIM ARRAY ! 10361: LDI ARDM2(XR) LOAD DIM 2 ! 10362: SBI INTV2 SUBTRACT 2 TO COMPARE ! 10363: INE EXFAL FAIL IF DIM2 NOT 2 ! 10364: * ! 10365: * HERE WE HAVE AN ARBLK OF THE RIGHT SHAPE ! 10366: * ! 10367: LDI ARDIM(XR) LOAD DIM 1 (NUMBER OF ELEMENTS) ! 10368: MFI WA GET AS ONE WORD INTEGER ! 10369: LCT WB,WA COPY TO CONTROL LOOP ! 10370: ADD =TBSI$,WA ADD SPACE FOR STANDARD FIELDS ! 10371: WTB WA CONVERT LENGTH TO BYTES ! 10372: JSR ALLOC ALLOCATE SPACE FOR TBBLK ! 10373: MOV XR,WC COPY TBBLK POINTER ! 10374: MOV XR,-(XS) SAVE TBBLK POINTER ! 10375: MOV =B$TBT,(XR)+ STORE TYPE WORD ! 10376: ZER (XR)+ STORE ZERO FOR IDVAL FOR NOW ! 10377: MOV WA,(XR)+ STORE LENGTH ! 10378: MOV =NULLS,(XR)+ NULL INITIAL LOOKUP VALUE ! 10379: * ! 10380: * LOOP TO INITIALIZE BUCKET PTRS TO POINT TO TABLE ! 10381: * ! 10382: SCV20 MOV WC,(XR)+ SET BUCKET PTR TO POINT TO TBBLK ! 10383: BCT WB,SCV20 LOOP TILL ALL INITIALIZED ! 10384: MOV *ARVL2,WB SET OFFSET TO FIRST ARBLK ELEMENT ! 10385: * ! 10386: * LOOP TO COPY ELEMENTS FROM ARRAY TO TABLE ! 10387: * ! 10388: SCV21 MOV 1(XS),XL POINT TO ARBLK ! 10389: BEQ WB,ARLEN(XL),SCV24 JUMP IF ALL MOVED ! 10390: ADD WB,XL ELSE POINT TO CURRENT LOCATION ! 10391: ADD *NUM02,WB BUMP OFFSET ! 10392: MOV (XL),XR LOAD SUBSCRIPT NAME ! 10393: DCA XL ADJUST PTR TO MERGE (TRVAL=1+1) ! 10394: EJC ! 10395: * ! 10396: * CONVERT (CONTINUED) ! 10397: * ! 10398: * LOOP TO CHASE DOWN TRBLK CHAIN FOR VALUE ! 10399: * ! 10400: SCV22 MOV TRVAL(XL),XL POINT TO NEXT VALUE ! 10401: BEQ (XL),=B$TRT,SCV22 LOOP BACK IF TRAPPED ! 10402: * ! 10403: * HERE WITH NAME IN XR, VALUE IN XL ! 10404: * ! 10405: SCV23 MOV XL,-(XS) STACK VALUE ! 10406: MOV 1(XS),XL LOAD TBBLK POINTER ! 10407: JSR TFIND BUILD TEBLK (NOTE WB GT 0 BY NAME) ! 10408: PPM EXFAL FAIL IF ACESS FAILS ! 10409: MOV (XS)+,TEVAL(XL) STORE VALUE IN TEBLK ! 10410: BRN SCV21 LOOP BACK FOR NEXT ELEMENT ! 10411: * ! 10412: * HERE AFTER MOVING ALL ELEMENTS TO TBBLK ! 10413: * ! 10414: SCV24 MOV (XS)+,XR LOAD TBBLK POINTER ! 10415: ICA XS POP ARBLK POINTER ! 10416: BRN EXSID EXIT SETTING IDVAL ! 10417: * ! 10418: * CONVERT TO EXPRESSION ! 10419: * ! 10420: SCV25 JSR GTEXP CONVERT TO EXPRESSION ! 10421: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE ! 10422: BRN EXIXR ELSE RETURN EXPRESSION ! 10423: * ! 10424: * CONVERT TO CODE ! 10425: * ! 10426: SCV26 JSR GTCOD CONVERT TO CODE ! 10427: PPM EXFAL FAIL IF CONVERSION IS NOT POSSIBLE ! 10428: BRN EXIXR ELSE RETURN CODE ! 10429: * ! 10430: * CONVERT TO NUMERIC ! 10431: * ! 10432: SCV27 JSR GTNUM CONVERT TO NUMERIC ! 10433: PPM EXFAL FAIL IF UNCONVERTIBLE ! 10434: BRN EXIXR RETURN NUMBER ! 10435: EJC ! 10436: .IF .CNBF ! 10437: .ELSE ! 10438: * ! 10439: * CONVERT TO BUFFER ! 10440: * ! 10441: SCV28 MOV XR,-(XS) STACK STRING FOR PROCEDURE ! 10442: JSR GTSTG CONVERT TO STRING ! 10443: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE ! 10444: MOV XR,XL SAVE STRING POINTER ! 10445: JSR ALOBF ALLOCATE BUFFER OF SAME SIZE ! 10446: JSR APNDB COPY IN THE STRING ! 10447: PPM ALREADY STRING - CANT FAIL TO CNV ! 10448: PPM MUST BE ENOUGH ROOM ! 10449: BRN EXSID EXIT SETTING IDVAL FIELD ! 10450: EJC ! 10451: .FI ! 10452: * ! 10453: * COPY ! 10454: * ! 10455: S$COP ENT ENTRY POINT ! 10456: JSR COPYB COPY THE BLOCK ! 10457: PPM EXITS RETURN IF NO IDVAL FIELD ! 10458: BRN EXSID EXIT SETTING ID VALUE ! 10459: EJC ! 10460: * ! 10461: * DATA ! 10462: * ! 10463: S$DAT ENT ENTRY POINT ! 10464: JSR XSCNI PREPARE TO SCAN ARGUMENT ! 10465: ERR 075,DATA ARGUMENT IS NOT STRING ! 10466: ERR 076,DATA ARGUMENT IS NULL ! 10467: * ! 10468: * SCAN OUT DATATYPE NAME ! 10469: * ! 10470: MOV =CH$PP,WC DELIMITER ONE = LEFT PAREN ! 10471: MOV WC,XL DELIMITER TWO = LEFT PAREN ! 10472: JSR XSCAN SCAN DATATYPE NAME ! 10473: BNZ WA,SDAT1 SKIP IF LEFT PAREN FOUND ! 10474: ERB 077,DATA ARGUMENT IS MISSING A LEFT PAREN ! 10475: * ! 10476: * HERE AFTER SCANNING DATATYPE NAME ! 10477: * ! 10478: .IF .CULC ! 10479: SDAT1 MOV SCLEN(XR),WA GET LENGTH ! 10480: JSR FLSTG FOLD LOWER CASE TO UPPER CASE ! 10481: MOV XR,XL SAVE NAME PTR ! 10482: .ELSE ! 10483: SDAT1 MOV XR,XL SAVE NAME PTR ! 10484: .FI ! 10485: MOV SCLEN(XR),WA GET LENGTH ! 10486: CTB WA,SCSI$ COMPUTE SPACE NEEDED ! 10487: JSR ALOST REQUEST STATIC STORE FOR NAME ! 10488: MOV XR,-(XS) SAVE DATATYPE NAME ! 10489: MVW COPY NAME TO STATIC ! 10490: MOV (XS),XR GET NAME PTR ! 10491: ZER XL SCRUB DUD REGISTER ! 10492: JSR GTNVR LOCATE VRBLK FOR DATATYPE NAME ! 10493: ERR 078,DATA ARGUMENT HAS NULL DATATYPE NAME ! 10494: MOV XR,DATDV SAVE VRBLK POINTER FOR DATATYPE ! 10495: MOV XS,DATXS STORE STARTING STACK VALUE ! 10496: ZER WB ZERO COUNT OF FIELD NAMES ! 10497: * ! 10498: * LOOP TO SCAN FIELD NAMES AND STACK VRBLK POINTERS ! 10499: * ! 10500: SDAT2 MOV =CH$RP,WC DELIMITER ONE = RIGHT PAREN ! 10501: MOV =CH$CM,XL DELIMITER TWO = COMMA ! 10502: JSR XSCAN SCAN NEXT FIELD NAME ! 10503: BNZ WA,SDAT3 JUMP IF DELIMITER FOUND ! 10504: ERB 079,DATA ARGUMENT IS MISSING A RIGHT PAREN ! 10505: * ! 10506: * HERE AFTER SCANNING OUT ONE FIELD NAME ! 10507: * ! 10508: SDAT3 JSR GTNVR LOCATE VRBLK FOR FIELD NAME ! 10509: ERR 080,DATA ARGUMENT HAS NULL FIELD NAME ! 10510: MOV XR,-(XS) STACK VRBLK POINTER ! 10511: ICV WB INCREMENT COUNTER ! 10512: BEQ WA,=NUM02,SDAT2 LOOP BACK IF STOPPED BY COMMA ! 10513: EJC ! 10514: * ! 10515: * DATA (CONTINUED) ! 10516: * ! 10517: * NOW BUILD THE DFBLK ! 10518: * ! 10519: MOV =DFSI$,WA SET SIZE OF DFBLK STANDARD FIELDS ! 10520: ADD WB,WA ADD NUMBER OF FIELDS ! 10521: WTB WA CONVERT LENGTH TO BYTES ! 10522: MOV WB,WC PRESERVE NO. OF FIELDS ! 10523: JSR ALOST ALLOCATE SPACE FOR DFBLK ! 10524: MOV WC,WB GET NO OF FIELDS ! 10525: MOV DATXS,XT POINT TO START OF STACK ! 10526: MOV (XT),WC LOAD DATATYPE NAME ! 10527: MOV XR,(XT) SAVE DFBLK POINTER ON STACK ! 10528: MOV =B$DFC,(XR)+ STORE TYPE WORD ! 10529: MOV WB,(XR)+ STORE NUMBER OF FIELDS (FARGS) ! 10530: MOV WA,(XR)+ STORE LENGTH (DFLEN) ! 10531: SUB *PDDFS,WA COMPUTE PDBLK LENGTH (FOR DFPDL) ! 10532: MOV WA,(XR)+ STORE PDBLK LENGTH (DFPDL) ! 10533: MOV WC,(XR)+ STORE DATATYPE NAME (DFNAM) ! 10534: LCT WC,WB COPY NUMBER OF FIELDS ! 10535: * ! 10536: * LOOP TO MOVE FIELD NAME VRBLK POINTERS TO DFBLK ! 10537: * ! 10538: SDAT4 MOV -(XT),(XR)+ MOVE ONE FIELD NAME VRBLK POINTER ! 10539: BCT WC,SDAT4 LOOP TILL ALL MOVED ! 10540: * ! 10541: * NOW DEFINE THE DATATYPE FUNCTION ! 10542: * ! 10543: MOV WA,WC COPY LENGTH OF PDBLK FOR LATER LOOP ! 10544: MOV DATDV,XR POINT TO VRBLK ! 10545: MOV DATXS,XT POINT BACK ON STACK ! 10546: MOV (XT),XL LOAD DFBLK POINTER ! 10547: JSR DFFNC DEFINE FUNCTION ! 10548: EJC ! 10549: * ! 10550: * DATA (CONTINUED) ! 10551: * ! 10552: * LOOP TO BUILD FFBLKS ! 10553: * ! 10554: * ! 10555: * NOTICE THAT THE FFBLKS ARE CONSTRUCTED IN REVERSE ORDER ! 10556: * SO THAT THE REQUIRED OFFSETS CAN BE OBTAINED FROM ! 10557: * SUCCESSIVE DECREMENTATION OF THE PDBLK LENGTH (IN WC). ! 10558: * ! 10559: SDAT5 MOV *FFSI$,WA SET LENGTH OF FFBLK ! 10560: JSR ALLOC ALLOCATE SPACE FOR FFBLK ! 10561: MOV =B$FFC,(XR) SET TYPE WORD ! 10562: MOV =NUM01,FARGS(XR) STORE FARGS (ALWAYS ONE) ! 10563: MOV DATXS,XT POINT BACK ON STACK ! 10564: MOV (XT),FFDFP(XR) COPY DFBLK PTR TO FFBLK ! 10565: DCA WC DECREMENT OLD DFPDL TO GET NEXT OFS ! 10566: MOV WC,FFOFS(XR) SET OFFSET TO THIS FIELD ! 10567: ZER FFNXT(XR) TENTATIVELY SET ZERO FORWARD PTR ! 10568: MOV XR,XL COPY FFBLK POINTER FOR DFFNC ! 10569: MOV (XS),XR LOAD VRBLK POINTER FOR FIELD ! 10570: MOV VRFNC(XR),XR LOAD CURRENT FUNCTION POINTER ! 10571: BNE (XR),=B$FFC,SDAT6 SKIP IF NOT CURRENTLY A FIELD FUNC ! 10572: * ! 10573: * HERE WE MUST CHAIN AN OLD FFBLK PTR TO PRESERVE IT IN THE ! 10574: * CASE OF MULTIPLE FIELD FUNCTIONS WITH THE SAME NAME ! 10575: * ! 10576: MOV XR,FFNXT(XL) LINK NEW FFBLK TO PREVIOUS CHAIN ! 10577: * ! 10578: * MERGE HERE TO DEFINE FIELD FUNCTION ! 10579: * ! 10580: SDAT6 MOV (XS)+,XR LOAD VRBLK POINTER ! 10581: JSR DFFNC DEFINE FIELD FUNCTION ! 10582: BNE XS,DATXS,SDAT5 LOOP BACK TILL ALL DONE ! 10583: ICA XS POP DFBLK POINTER ! 10584: BRN EXNUL RETURN WITH NULL RESULT ! 10585: EJC ! 10586: * ! 10587: * DATATYPE ! 10588: * ! 10589: S$DTP ENT ENTRY POINT ! 10590: MOV (XS)+,XR LOAD ARGUMENT ! 10591: JSR DTYPE GET DATATYPE ! 10592: BRN EXIXR AND RETURN IT AS RESULT ! 10593: EJC ! 10594: * ! 10595: * DATE ! 10596: * ! 10597: S$DTE ENT ENTRY POINT ! 10598: JSR SYSDT CALL SYSTEM DATE ROUTINE ! 10599: MOV 1(XL),WA LOAD LENGTH FOR SBSTR ! 10600: BZE WA,EXNUL RETURN NULL IF LENGTH IS ZERO ! 10601: ZER WB SET ZERO OFFSET ! 10602: JSR SBSTR USE SBSTR TO BUILD SCBLK ! 10603: BRN EXIXR RETURN DATE STRING ! 10604: EJC ! 10605: * ! 10606: * DEFINE ! 10607: * ! 10608: S$DEF ENT ENTRY POINT ! 10609: MOV (XS)+,XR LOAD SECOND ARGUMENT ! 10610: ZER DEFLB ZERO LABEL POINTER IN CASE NULL ! 10611: BEQ XR,=NULLS,SDF01 JUMP IF NULL SECOND ARGUMENT ! 10612: JSR GTNVR ELSE FIND VRBLK FOR LABEL ! 10613: PPM SDF13 JUMP IF NOT A VARIABLE NAME ! 10614: MOV XR,DEFLB ELSE SET SPECIFIED ENTRY ! 10615: * ! 10616: * SCAN FUNCTION NAME ! 10617: * ! 10618: SDF01 JSR XSCNI PREPARE TO SCAN FIRST ARGUMENT ! 10619: ERR 081,DEFINE FIRST ARGUMENT IS NOT STRING ! 10620: ERR 082,DEFINE FIRST ARGUMENT IS NULL ! 10621: MOV =CH$PP,WC DELIMITER ONE = LEFT PAREN ! 10622: MOV WC,XL DELIMITER TWO = LEFT PAREN ! 10623: JSR XSCAN SCAN OUT FUNCTION NAME ! 10624: BNZ WA,SDF02 JUMP IF LEFT PAREN FOUND ! 10625: ERB 083,DEFINE FIRST ARGUMENT IS MISSING A LEFT PAREN ! 10626: * ! 10627: * HERE AFTER SCANNING OUT FUNCTION NAME ! 10628: * ! 10629: SDF02 JSR GTNVR GET VARIABLE NAME ! 10630: ERR 084,DEFINE FIRST ARGUMENT HAS NULL FUNCTION NAME ! 10631: MOV XR,DEFVR SAVE VRBLK POINTER FOR FUNCTION NAM ! 10632: ZER WB ZERO COUNT OF ARGUMENTS ! 10633: MOV XS,DEFXS SAVE INITIAL STACK POINTER ! 10634: BNZ DEFLB,SDF03 JUMP IF SECOND ARGUMENT GIVEN ! 10635: MOV XR,DEFLB ELSE DEFAULT IS FUNCTION NAME ! 10636: * ! 10637: * LOOP TO SCAN ARGUMENT NAMES AND STACK VRBLK POINTERS ! 10638: * ! 10639: SDF03 MOV =CH$RP,WC DELIMITER ONE = RIGHT PAREN ! 10640: MOV =CH$CM,XL DELIMITER TWO = COMMA ! 10641: JSR XSCAN SCAN OUT NEXT ARGUMENT NAME ! 10642: BNZ WA,SDF04 SKIP IF DELIMITER FOUND ! 10643: ERB 085,NULL ARG NAME OR MISSING ) IN DEFINE FIRST ARG. ! 10644: EJC ! 10645: * ! 10646: * DEFINE (CONTINUED) ! 10647: * ! 10648: * HERE AFTER SCANNING AN ARGUMENT NAME ! 10649: * ! 10650: SDF04 BNE XR,=NULLS,SDF05 SKIP IF NON-NULL ! 10651: BZE WB,SDF06 IGNORE NULL IF CASE OF NO ARGUMENTS ! 10652: * ! 10653: * HERE AFTER DEALING WITH THE CASE OF NO ARGUMENTS ! 10654: * ! 10655: SDF05 JSR GTNVR GET VRBLK POINTER ! 10656: PPM SDF03 LOOP BACK TO IGNORE NULL NAME ! 10657: MOV XR,-(XS) STACK ARGUMENT VRBLK POINTER ! 10658: ICV WB INCREMENT COUNTER ! 10659: BEQ WA,=NUM02,SDF03 LOOP BACK IF STOPPED BY A COMMA ! 10660: * ! 10661: * HERE AFTER SCANNING OUT FUNCTION ARGUMENT NAMES ! 10662: * ! 10663: SDF06 MOV WB,DEFNA SAVE NUMBER OF ARGUMENTS ! 10664: ZER WB ZERO COUNT OF LOCALS ! 10665: * ! 10666: * LOOP TO SCAN LOCAL NAMES AND STACK VRBLK POINTERS ! 10667: * ! 10668: SDF07 MOV =CH$CM,WC SET DELIMITER ONE = COMMA ! 10669: MOV WC,XL SET DELIMITER TWO = COMMA ! 10670: JSR XSCAN SCAN OUT NEXT LOCAL NAME ! 10671: BNE XR,=NULLS,SDF08 SKIP IF NON-NULL ! 10672: BZE WB,SDF09 IGNORE NULL IF CASE OF NO LOCALS ! 10673: * ! 10674: * HERE AFTER SCANNING OUT A LOCAL NAME ! 10675: * ! 10676: SDF08 JSR GTNVR GET VRBLK POINTER ! 10677: PPM SDF07 LOOP BACK TO IGNORE NULL NAME ! 10678: ICV WB IF OK, INCREMENT COUNT ! 10679: MOV XR,-(XS) STACK VRBLK POINTER ! 10680: BNZ WA,SDF07 LOOP BACK IF STOPPED BY A COMMA ! 10681: EJC ! 10682: * ! 10683: * DEFINE (CONTINUED) ! 10684: * ! 10685: * HERE AFTER SCANNING LOCALS, BUILD PFBLK ! 10686: * ! 10687: SDF09 MOV WB,WA COPY COUNT OF LOCALS ! 10688: ADD DEFNA,WA ADD NUMBER OF ARGUMENTS ! 10689: MOV WA,WC SET SUM ARGS+LOCALS AS LOOP COUNT ! 10690: ADD =PFSI$,WA ADD SPACE FOR STANDARD FIELDS ! 10691: WTB WA CONVERT LENGTH TO BYTES ! 10692: JSR ALLOC ALLOCATE SPACE FOR PFBLK ! 10693: MOV XR,XL SAVE POINTER TO PFBLK ! 10694: MOV =B$PFC,(XR)+ STORE FIRST WORD ! 10695: MOV DEFNA,(XR)+ STORE NUMBER OF ARGUMENTS ! 10696: MOV WA,(XR)+ STORE LENGTH (PFLEN) ! 10697: MOV DEFVR,(XR)+ STORE VRBLK PTR FOR FUNCTION NAME ! 10698: MOV WB,(XR)+ STORE NUMBER OF LOCALS ! 10699: ZER (XR)+ DEAL WITH LABEL LATER ! 10700: ZER (XR)+ ZERO PFCTR ! 10701: ZER (XR)+ ZERO PFRTR ! 10702: BZE WC,SDF11 SKIP IF NO ARGS OR LOCALS ! 10703: MOV XL,WA KEEP PFBLK POINTER ! 10704: MOV DEFXS,XT POINT BEFORE ARGUMENTS ! 10705: LCT WC,WC GET COUNT OF ARGS+LOCALS FOR LOOP ! 10706: * ! 10707: * LOOP TO MOVE LOCALS AND ARGS TO PFBLK ! 10708: * ! 10709: SDF10 MOV -(XT),(XR)+ STORE ONE ENTRY AND BUMP POINTERS ! 10710: BCT WC,SDF10 LOOP TILL ALL STORED ! 10711: MOV WA,XL RECOVER PFBLK POINTER ! 10712: EJC ! 10713: * ! 10714: * DEFINE (CONTINUED) ! 10715: * ! 10716: * NOW DEAL WITH LABEL ! 10717: * ! 10718: SDF11 MOV DEFXS,XS POP STACK ! 10719: MOV DEFLB,XR POINT TO VRBLK FOR LABEL ! 10720: MOV VRLBL(XR),XR LOAD LABEL POINTER ! 10721: BNE (XR),=B$TRT,SDF12 SKIP IF NOT TRAPPED ! 10722: MOV TRLBL(XR),XR ELSE POINT TO REAL LABEL ! 10723: * ! 10724: * HERE AFTER LOCATING REAL LABEL POINTER ! 10725: * ! 10726: SDF12 BEQ XR,=STNDL,SDF13 JUMP IF LABEL IS NOT DEFINED ! 10727: MOV XR,PFCOD(XL) ELSE STORE LABEL POINTER ! 10728: MOV DEFVR,XR POINT BACK TO VRBLK FOR FUNCTION ! 10729: JSR DFFNC DEFINE FUNCTION ! 10730: BRN EXNUL AND EXIT RETURNING NULL ! 10731: * ! 10732: * HERE FOR ERRONEOUS LABEL ! 10733: * ! 10734: SDF13 ERB 086,DEFINE FUNCTION ENTRY POINT IS NOT DEFINED LABEL ! 10735: EJC ! 10736: * ! 10737: * DETACH ! 10738: * ! 10739: S$DET ENT ENTRY POINT ! 10740: MOV (XS)+,XR LOAD ARGUMENT ! 10741: JSR GTVAR LOCATE VARIABLE ! 10742: ERR 087,DETACH ARGUMENT IS NOT APPROPRIATE NAME ! 10743: JSR DTACH DETACH I/O ASSOCIATION FROM NAME ! 10744: BRN EXNUL RETURN NULL RESULT ! 10745: EJC ! 10746: * ! 10747: * DIFFER ! 10748: * ! 10749: S$DIF ENT ENTRY POINT ! 10750: MOV (XS)+,XR LOAD SECOND ARGUMENT ! 10751: MOV (XS)+,XL LOAD FIRST ARGUMENT ! 10752: JSR IDENT CALL IDENT COMPARISON ROUTINE ! 10753: PPM EXFAL FAIL IF IDENT ! 10754: BRN EXNUL RETURN NULL IF DIFFER ! 10755: EJC ! 10756: * ! 10757: * DUMP ! 10758: * ! 10759: S$DMP ENT ENTRY POINT ! 10760: JSR GTSMI LOAD DUMP ARG AS SMALL INTEGER ! 10761: ERR 088,DUMP ARGUMENT IS NOT INTEGER ! 10762: ERR 089,DUMP ARGUMENT IS NEGATIVE OR TOO LARGE ! 10763: JSR DUMPR ELSE CALL DUMP ROUTINE ! 10764: BRN EXNUL AND RETURN NULL AS RESULT ! 10765: EJC ! 10766: * ! 10767: * DUPL ! 10768: * ! 10769: S$DUP ENT ENTRY POINT ! 10770: JSR GTSMI GET SECOND ARGUMENT AS SMALL INTEGE ! 10771: ERR 090,DUPL SECOND ARGUMENT IS NOT INTEGER ! 10772: PPM SDUP7 JUMP IF NEGATIVE OT TOO BIG ! 10773: MOV XR,WB SAVE DUPLICATION FACTOR ! 10774: JSR GTSTG GET FIRST ARG AS STRING ! 10775: PPM SDUP4 JUMP IF NOT A STRING ! 10776: * ! 10777: * HERE FOR CASE OF DUPLICATION OF A STRING ! 10778: * ! 10779: MTI WA ACQUIRE LENGTH AS INTEGER ! 10780: STI DUPSI SAVE FOR THE MOMENT ! 10781: MTI WB GET DUPLICATION FACTOR AS INTEGER ! 10782: MLI DUPSI FORM PRODUCT ! 10783: IOV SDUP3 JUMP IF OVERFLOW ! 10784: IEQ EXNUL RETURN NULL IF RESULT LENGTH = 0 ! 10785: MFI WA,SDUP3 GET AS ADDR INTEGER, CHECK OVFLO ! 10786: * ! 10787: * MERGE HERE WITH RESULT LENGTH IN WA ! 10788: * ! 10789: SDUP1 MOV XR,XL SAVE STRING POINTER ! 10790: JSR ALOCS ALLOCATE SPACE FOR STRING ! 10791: MOV XR,-(XS) SAVE AS RESULT POINTER ! 10792: MOV XL,WC SAVE POINTER TO ARGUMENT STRING ! 10793: PSC XR PREPARE TO STORE CHARS OF RESULT ! 10794: LCT WB,WB SET COUNTER TO CONTROL LOOP ! 10795: * ! 10796: * LOOP THROUGH DUPLICATIONS ! 10797: * ! 10798: SDUP2 MOV WC,XL POINT BACK TO ARGUMENT STRING ! 10799: MOV SCLEN(XL),WA GET NUMBER OF CHARACTERS ! 10800: PLC XL POINT TO CHARS IN ARGUMENT STRING ! 10801: MVC MOVE CHARACTERS TO RESULT STRING ! 10802: BCT WB,SDUP2 LOOP TILL ALL DUPLICATIONS DONE ! 10803: BRN EXITS THEN EXIT FOR NEXT CODE WORD ! 10804: EJC ! 10805: * ! 10806: * DUPL (CONTINUED) ! 10807: * ! 10808: * HERE IF TOO LARGE, SET MAX LENGTH AND LET ALOCS CATCH IT ! 10809: * ! 10810: SDUP3 MOV DNAME,WA SET IMPOSSIBLE LENGTH FOR ALOCS ! 10811: BRN SDUP1 MERGE BACK ! 10812: * ! 10813: * HERE IF NOT A STRING ! 10814: * ! 10815: SDUP4 JSR GTPAT CONVERT ARGUMENT TO PATTERN ! 10816: ERR 091,DUPL FIRST ARGUMENT IS NOT STRING OR PATTERN ! 10817: * ! 10818: * HERE TO DUPLICATE A PATTERN ARGUMENT ! 10819: * ! 10820: MOV XR,-(XS) STORE PATTERN ON STACK ! 10821: MOV =NDNTH,XR START OFF WITH NULL PATTERN ! 10822: BZE WB,SDUP6 NULL PATTERN IS RESULT IF DUPFAC=0 ! 10823: MOV WB,-(XS) PRESERVE LOOP COUNT ! 10824: * ! 10825: * LOOP TO DUPLICATE BY SUCCESSIVE CONCATENATION ! 10826: * ! 10827: SDUP5 MOV XR,XL COPY CURRENT VALUE AS RIGHT ARGUMNT ! 10828: MOV 1(XS),XR GET A NEW COPY OF LEFT ! 10829: JSR PCONC CONCATENATE ! 10830: DCV (XS) COUNT DOWN ! 10831: BNZ (XS),SDUP5 LOOP ! 10832: ICA XS POP LOOP COUNT ! 10833: * ! 10834: * HERE TO EXIT AFTER CONSTRUCTING PATTERN ! 10835: * ! 10836: SDUP6 MOV XR,(XS) STORE RESULT ON STACK ! 10837: BRN EXITS EXIT WITH RESULT ON STACK ! 10838: * ! 10839: * FAIL IF SECOND ARG IS OUT OF RANGE ! 10840: * ! 10841: SDUP7 ICA XS POP FIRST ARGUMENT ! 10842: BRN EXFAL FAIL ! 10843: EJC ! 10844: * ! 10845: * EJECT ! 10846: * ! 10847: S$EJC ENT ENTRY POINT ! 10848: JSR IOFCB CALL FCBLK ROUTINE ! 10849: ERR 092,EJECT ARGUMENT IS NOT A SUITABLE NAME ! 10850: PPM SEJC1 NULL ARGUMENT ! 10851: JSR SYSEF CALL EJECT FILE FUNCTION ! 10852: ERR 093,EJECT FILE DOES NOT EXIST ! 10853: ERR 094,EJECT FILE DOES NOT PERMIT PAGE EJECT ! 10854: ERR 095,EJECT CAUSED NON-RECOVERABLE OUTPUT ERROR ! 10855: BRN EXNUL RETURN NULL AS RESULT ! 10856: * ! 10857: * HERE TO EJECT STANDARD OUTPUT FILE ! 10858: * ! 10859: SEJC1 JSR SYSEP CALL ROUTINE TO EJECT PRINTER ! 10860: BRN EXNUL EXIT WITH NULL RESULT ! 10861: EJC ! 10862: * ! 10863: * ENDFILE ! 10864: * ! 10865: S$ENF ENT ENTRY POINT ! 10866: JSR IOFCB CALL FCBLK ROUTINE ! 10867: ERR 096,ENDFILE ARGUMENT IS NOT A SUITABLE NAME ! 10868: ERR 097,ENDFILE ARGUMENT IS NULL ! 10869: JSR SYSEN CALL ENDFILE ROUTINE ! 10870: ERR 098,ENDFILE FILE DOES NOT EXIST ! 10871: ERR 099,ENDFILE FILE DOES NOT PERMIT ENDFILE ! 10872: ERR 100,ENDFILE CAUSED NON-RECOVERABLE OUTPUT ERROR ! 10873: MOV XL,WB REMEMBER VRBLK PTR FROM IOFCB CALL ! 10874: * ! 10875: * LOOP TO FIND TRTRF BLOCK ! 10876: * ! 10877: SENF1 MOV XL,XR COPY POINTER ! 10878: MOV TRVAL(XR),XR CHAIN ALONG ! 10879: BNE (XR),=B$TRT,EXNUL SKIP OUT IF CHAIN END ! 10880: BNE TRTYP(XR),=TRTFC,SENF1 LOOP IF NOT FOUND ! 10881: MOV TRVAL(XR),TRVAL(XL) REMOVE TRTRF ! 10882: MOV TRTRF(XR),ENFCH POINT TO HEAD OF IOCHN ! 10883: MOV TRFPT(XR),WC POINT TO FCBLK ! 10884: MOV WB,XR FILEARG1 VRBLK FROM IOFCB ! 10885: JSR SETVR RESET IT ! 10886: MOV =R$FCB,XL PTR TO HEAD OF FCBLK CHAIN ! 10887: SUB *NUM02,XL ADJUST READY TO ENTER LOOP ! 10888: * ! 10889: * FIND FCBLK ! 10890: * ! 10891: SENF2 MOV XL,XR COPY PTR ! 10892: MOV 2(XL),XL GET NEXT LINK ! 10893: BZE XL,SENF4 STOP IF CHAIN END ! 10894: BEQ 3(XL),WC,SENF3 JUMP IF FCBLK FOUND ! 10895: BRN SENF2 LOOP ! 10896: * ! 10897: * REMOVE FCBLK ! 10898: * ! 10899: SENF3 MOV 2(XL),2(XR) DELETE FCBLK FROM CHAIN ! 10900: * ! 10901: * LOOP WHICH DETACHES ALL VBLS ON IOCHN CHAIN ! 10902: * ! 10903: SENF4 MOV ENFCH,XL GET CHAIN HEAD ! 10904: BZE XL,EXNUL FINISHED IF CHAIN END ! 10905: MOV TRTRF(XL),ENFCH CHAIN ALONG ! 10906: MOV IONMO(XL),WA NAME OFFSET ! 10907: MOV IONMB(XL),XL NAME BASE ! 10908: JSR DTACH DETACH NAME ! 10909: BRN SENF4 LOOP TILL DONE ! 10910: EJC ! 10911: * ! 10912: * EQ ! 10913: * ! 10914: S$EQF ENT ENTRY POINT ! 10915: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE ! 10916: ERR 101,EQ FIRST ARGUMENT IS NOT NUMERIC ! 10917: ERR 102,EQ SECOND ARGUMENT IS NOT NUMERIC ! 10918: PPM EXFAL FAIL IF LT ! 10919: PPM EXNUL RETURN NULL IF EQ ! 10920: PPM EXFAL FAIL IF GT ! 10921: EJC ! 10922: * ! 10923: * EVAL ! 10924: * ! 10925: S$EVL ENT ENTRY POINT ! 10926: MOV (XS)+,XR LOAD ARGUMENT ! 10927: JSR GTEXP CONVERT TO EXPRESSION ! 10928: ERR 103,EVAL ARGUMENT IS NOT EXPRESSION ! 10929: LCW WC LOAD NEXT CODE WORD ! 10930: BNE WC,=OFNE$,SEVL1 JUMP IF CALLED BY VALUE ! 10931: SCP XL COPY CODE POINTER ! 10932: MOV (XL),WA GET NEXT CODE WORD ! 10933: BNE WA,=ORNM$,SEVL2 BY NAME UNLESS EXPRESSION ! 10934: BNZ 1(XS),SEVL2 JUMP IF BY NAME ! 10935: * ! 10936: * HERE IF CALLED BY VALUE ! 10937: * ! 10938: SEVL1 ZER WB SET FLAG FOR BY VALUE ! 10939: MOV WC,-(XS) SAVE CODE WORD ! 10940: JSR EVALX EVALUATE EXPRESSION BY VALUE ! 10941: PPM EXFAL FAIL IF EVALUATION FAILS ! 10942: MOV XR,XL COPY RESULT ! 10943: MOV (XS),XR RELOAD NEXT CODE WORD ! 10944: MOV XL,(XS) STACK RESULT ! 10945: BRI (XR) JUMP TO EXECUTE NEXT CODE WORD ! 10946: * ! 10947: * HERE IF CALLED BY NAME ! 10948: * ! 10949: SEVL2 MOV =NUM01,WB SET FLAG FOR BY NAME ! 10950: JSR EVALX EVALUATE EXPRESSION BY NAME ! 10951: PPM EXFAL FAIL IF EVALUATION FAILS ! 10952: BRN EXNAM EXIT WITH NAME ! 10953: .IF .CNEX ! 10954: .ELSE ! 10955: EJC ! 10956: * ! 10957: * EXIT ! 10958: * ! 10959: S$EXT ENT ENTRY POINT ! 10960: ZER WB CLEAR AMOUNT OF STATIC SHIFT ! 10961: JSR GBCOL COMPACT MEMORY BY COLLECTING ! 10962: JSR GTSTG CONVERT ARG TO STRING ! 10963: ERR 104,EXIT ARGUMENT IS NOT SUITABLE INTEGER OR STRING ! 10964: MOV XR,XL COPY STRING PTR ! 10965: JSR GTINT CHECK IT IS INTEGER ! 10966: PPM SEXT1 SKIP IF UNCONVERTIBLE ! 10967: ZER XL NOTE IT IS INTEGER ! 10968: LDI ICVAL(XR) GET INTEGER ARG ! 10969: MOV R$FCB,WB GET FCBLK CHAIN HEADER ! 10970: * ! 10971: * MERGE TO CALL OSINT EXIT ROUTINE ! 10972: * ! 10973: SEXT1 MOV =HEADV,XR POINT TO V.V STRING ! 10974: JSR SYSXI CALL EXTERNAL ROUTINE ! 10975: ERR 105,EXIT ACTION NOT AVAILABLE IN THIS IMPLEMENTATION ! 10976: ERR 106,EXIT ACTION CAUSED IRRECOVERABLE ERROR ! 10977: IEQ EXNUL RETURN IF ARGUMENT 0 ! 10978: ZER GBCNT RESUMING EXECUTION SO RESET ! 10979: IGT SEXT2 SKIP IF POSITIVE ! 10980: NGI MAKE POSITIVE ! 10981: * ! 10982: * CHECK FOR OPTION RESPECIFICATION ! 10983: * ! 10984: SEXT2 MFI WC GET VALUE IN WORK REG ! 10985: BEQ WC,=NUM03,SEXT3 SKIP IF WAS 3 ! 10986: MOV WC,-(XS) SAVE VALUE ! 10987: ZER WC SET TO READ OPTIONS ! 10988: JSR PRPAR READ SYSPP OPTIONS ! 10989: MOV (XS)+,WC RESTORE VALUE ! 10990: * ! 10991: * DEAL WITH HEADER OPTION (FIDDLED BY PRPAR) ! 10992: * ! 10993: SEXT3 MNZ HEADP ASSUME NO HEADERS ! 10994: BNE WC,=NUM01,SEXT4 SKIP IF NOT 1 ! 10995: ZER HEADP REQUEST HEADER PRINTING ! 10996: * ! 10997: * ALMOST READY TO RESUME RUNNING ! 10998: * ! 10999: SEXT4 JSR SYSTM GET EXECUTION TIME START (SGD11) ! 11000: STI TIMSX SAVE AS INITIAL TIME ! 11001: LDI KVSTC RESET TO ENSURE ... ! 11002: STI KVSTL ... CORRECT EXECUTION STATS ! 11003: BRN EXNUL RESUME EXECUTION ! 11004: .FI ! 11005: EJC ! 11006: * ! 11007: * FIELD ! 11008: * ! 11009: S$FLD ENT ENTRY POINT ! 11010: JSR GTSMI GET SECOND ARGUMENT (FIELD NUMBER) ! 11011: ERR 107,FIELD SECOND ARGUMENT IS NOT INTEGER ! 11012: PPM EXFAL FAIL IF OUT OF RANGE ! 11013: MOV XR,WB ELSE SAVE INTEGER VALUE ! 11014: MOV (XS)+,XR LOAD FIRST ARGUMENT ! 11015: JSR GTNVR POINT TO VRBLK ! 11016: PPM SFLD1 JUMP (ERROR) IF NOT VARIABLE NAME ! 11017: MOV VRFNC(XR),XR ELSE POINT TO FUNCTION BLOCK ! 11018: BNE (XR),=B$DFC,SFLD1 ERROR IF NOT DATATYPE FUNCTION ! 11019: * ! 11020: * HERE IF FIRST ARGUMENT IS A DATATYPE FUNCTION NAME ! 11021: * ! 11022: BZE WB,EXFAL FAIL IF ARGUMENT NUMBER IS ZERO ! 11023: BGT WB,FARGS(XR),EXFAL FAIL IF TOO LARGE ! 11024: WTB WB ELSE CONVERT TO BYTE OFFSET ! 11025: ADD WB,XR POINT TO FIELD NAME ! 11026: MOV DFFLB(XR),XR LOAD VRBLK POINTER ! 11027: BRN EXVNM EXIT TO BUILD NMBLK ! 11028: * ! 11029: * HERE FOR BAD FIRST ARGUMENT ! 11030: * ! 11031: SFLD1 ERB 108,FIELD FIRST ARGUMENT IS NOT DATATYPE NAME ! 11032: EJC ! 11033: * ! 11034: * FENCE ! 11035: * ! 11036: S$FNC ENT ENTRY POINT ! 11037: MOV =P$FNC,WB SET PCODE FOR P$FNC ! 11038: ZER XR P0BLK ! 11039: JSR PBILD BUILD P$FNC NODE ! 11040: MOV XR,XL SAVE POINTER TO IT ! 11041: MOV (XS)+,XR GET ARGUMENT ! 11042: JSR GTPAT CONVERT TO PATTERN ! 11043: ERR 259,FENCE ARGUMENT IS NOT PATTERN ! 11044: JSR PCONC CONCATENATE TO P$FNC NODE ! 11045: MOV XR,XL SAVE PTR TO CONCATENATED PATTERN ! 11046: MOV =P$FNA,WB SET FOR P$FNA PCODE ! 11047: ZER XR P0BLK ! 11048: JSR PBILD CONSTRUCT P$FNA NODE ! 11049: MOV XL,PTHEN(XR) SET PATTERN AS PTHEN ! 11050: MOV XR,-(XS) SET AS RESULT ! 11051: BRN EXITS DO NEXT CODE WORD ! 11052: EJC ! 11053: * ! 11054: * GE ! 11055: * ! 11056: S$GEF ENT ENTRY POINT ! 11057: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE ! 11058: ERR 109,GE FIRST ARGUMENT IS NOT NUMERIC ! 11059: ERR 110,GE SECOND ARGUMENT IS NOT NUMERIC ! 11060: PPM EXFAL FAIL IF LT ! 11061: PPM EXNUL RETURN NULL IF EQ ! 11062: PPM EXNUL RETURN NULL IF GT ! 11063: EJC ! 11064: * ! 11065: * GT ! 11066: * ! 11067: S$GTF ENT ENTRY POINT ! 11068: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE ! 11069: ERR 111,GT FIRST ARGUMENT IS NOT NUMERIC ! 11070: ERR 112,GT SECOND ARGUMENT IS NOT NUMERIC ! 11071: PPM EXFAL FAIL IF LT ! 11072: PPM EXFAL FAIL IF EQ ! 11073: PPM EXNUL RETURN NULL IF GT ! 11074: EJC ! 11075: * ! 11076: * HOST ! 11077: * ! 11078: S$HST ENT ENTRY POINT ! 11079: MOV (XS)+,XR GET THIRD ARG ! 11080: MOV (XS)+,XL GET SECOND ARG ! 11081: MOV (XS)+,WA GET FIRST ARG ! 11082: JSR SYSHS ENTER SYSHS ROUTINE ! 11083: ERR 254,ERRONEOUS ARGUMENT FOR HOST ! 11084: ERR 255,ERROR DURING EXECUTION OF HOST ! 11085: PPM SHST1 STORE HOST STRING ! 11086: PPM EXNUL RETURN NULL RESULT ! 11087: PPM EXIXR RETURN XR ! 11088: PPM EXFAL FAIL RETURN ! 11089: * ! 11090: * RETURN HOST STRING ! 11091: * ! 11092: SHST1 BZE XL,EXNUL NULL STRING IF SYSHS UNCOOPERATIVE ! 11093: MOV SCLEN(XL),WA LENGTH ! 11094: ZER WB ZERO OFFSET ! 11095: JSR SBSTR BUILD COPY OF STRING ! 11096: MOV XR,-(XS) STACK THE RESULT ! 11097: BRN EXITS RETURN RESULT ON STACK ! 11098: EJC ! 11099: * ! 11100: * IDENT ! 11101: * ! 11102: S$IDN ENT ENTRY POINT ! 11103: MOV (XS)+,XR LOAD SECOND ARGUMENT ! 11104: MOV (XS)+,XL LOAD FIRST ARGUMENT ! 11105: JSR IDENT CALL IDENT COMPARISON ROUTINE ! 11106: PPM EXNUL RETURN NULL IF IDENT ! 11107: BRN EXFAL FAIL IF DIFFER ! 11108: EJC ! 11109: * ! 11110: * INPUT ! 11111: * ! 11112: S$INP ENT ENTRY POINT ! 11113: ZER WB INPUT FLAG ! 11114: JSR IOPUT CALL INPUT/OUTPUT ASSOC. ROUTINE ! 11115: ERR 113,INPUT THIRD ARGUMENT IS NOT A STRING ! 11116: ERR 114,INAPPROPRIATE SECOND ARGUMENT FOR INPUT ! 11117: ERR 115,INAPPROPRIATE FIRST ARGUMENT FOR INPUT ! 11118: ERR 116,INAPPROPRIATE FILE SPECIFICATION FOR INPUT ! 11119: PPM EXFAL FAIL IF FILE DOES NOT EXIST ! 11120: ERR 117,INPUT FILE CANNOT BE READ ! 11121: BRN EXNUL RETURN NULL STRING ! 11122: EJC ! 11123: .IF .CNBF ! 11124: .ELSE ! 11125: * ! 11126: * INSERT ! 11127: * ! 11128: S$INS ENT ENTRY POINT ! 11129: MOV (XS)+,XL GET STRING ARG ! 11130: JSR GTSMI GET REPLACE LENGTH ! 11131: ERR 277,INSERT THIRD ARGUMENT NOT INTEGER ! 11132: PPM EXFAL FAIL IF OUT OF RANGE ! 11133: MOV WC,WB COPY TO PROPER REG ! 11134: JSR GTSMI GET REPLACE POSITION ! 11135: ERR 278,INSERT SECOND ARGUMENT NOT INTEGER ! 11136: PPM EXFAL FAIL IF OUT OF RANGE ! 11137: BZE WC,EXFAL FAIL IF ZERO ! 11138: DCV WC DECREMENT TO GET OFFSET ! 11139: MOV WC,WA PUT IN PROPER REGISTER ! 11140: MOV (XS)+,XR GET BUFFER ! 11141: BEQ (XR),=B$BCT,SINS1 PRESS ON IF TYPE OK ! 11142: ERB 279,INSERT FIRST ARGUMENT NOT BUFFER ! 11143: * ! 11144: * HERE WHEN EVERYTHING LOADED UP ! 11145: * ! 11146: SINS1 JSR INSBF CALL TO INSERT ! 11147: ERR 280,INSERT FOURTH ARGUMENT NOT A STRING ! 11148: PPM EXFAL FAIL IF OUT OF RANGE ! 11149: BRN EXNUL ELSE OK - EXIT WITH NULL ! 11150: EJC ! 11151: .FI ! 11152: * ! 11153: * INTEGER ! 11154: * ! 11155: S$INT ENT ENTRY POINT ! 11156: MOV (XS)+,XR LOAD ARGUMENT ! 11157: JSR GTNUM CONVERT TO NUMERIC ! 11158: PPM EXFAL FAIL IF NON-NUMERIC ! 11159: BEQ WA,=B$ICL,EXNUL RETURN NULL IF INTEGER ! 11160: BRN EXFAL FAIL IF REAL ! 11161: EJC ! 11162: * ! 11163: * ITEM ! 11164: * ! 11165: * ITEM DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT ! 11166: * WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED. ! 11167: * ! 11168: S$ITM ENT ENTRY POINT ! 11169: * ! 11170: * DEAL WITH CASE OF NO ARGS ! 11171: * ! 11172: BNZ WA,SITM1 JUMP IF AT LEAST ONE ARG ! 11173: MOV =NULLS,-(XS) ELSE SUPPLY GARBAGE NULL ARG ! 11174: MOV =NUM01,WA AND FIX ARGUMENT COUNT ! 11175: * ! 11176: * CHECK FOR NAME/VALUE CASES ! 11177: * ! 11178: SITM1 SCP XR GET CURRENT CODE POINTER ! 11179: MOV (XR),XL LOAD NEXT CODE WORD ! 11180: DCV WA GET NUMBER OF SUBSCRIPTS ! 11181: MOV WA,XR COPY FOR ARREF ! 11182: BEQ XL,=OFNE$,SITM2 JUMP IF CALLED BY NAME ! 11183: * ! 11184: * HERE IF CALLED BY VALUE ! 11185: * ! 11186: ZER WB SET CODE FOR CALL BY VALUE ! 11187: BRN ARREF OFF TO ARRAY REFERENCE ROUTINE ! 11188: * ! 11189: * HERE FOR CALL BY NAME ! 11190: * ! 11191: SITM2 MNZ WB SET CODE FOR CALL BY NAME ! 11192: LCW WA LOAD AND IGNORE OFNE$ CALL ! 11193: BRN ARREF OFF TO ARRAY REFERENCE ROUTINE ! 11194: EJC ! 11195: * ! 11196: * LE ! 11197: * ! 11198: S$LEF ENT ENTRY POINT ! 11199: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE ! 11200: ERR 118,LE FIRST ARGUMENT IS NOT NUMERIC ! 11201: ERR 119,LE SECOND ARGUMENT IS NOT NUMERIC ! 11202: PPM EXNUL RETURN NULL IF LT ! 11203: PPM EXNUL RETURN NULL IF EQ ! 11204: PPM EXFAL FAIL IF GT ! 11205: EJC ! 11206: * ! 11207: * LEN ! 11208: * ! 11209: S$LEN ENT ENTRY POINT ! 11210: MOV =P$LEN,WB SET PCODE FOR INTEGER ARG CASE ! 11211: MOV =P$LND,WA SET PCODE FOR EXPR ARG CASE ! 11212: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE ! 11213: ERR 120,LEN ARGUMENT IS NOT INTEGER OR EXPRESSION ! 11214: ERR 121,LEN ARGUMENT IS NEGATIVE OR TOO LARGE ! 11215: BRN EXIXR RETURN PATTERN NODE ! 11216: EJC ! 11217: * ! 11218: * LEQ ! 11219: * ! 11220: S$LEQ ENT ENTRY POINT ! 11221: JSR LCOMP CALL STRING COMPARISON ROUTINE ! 11222: ERR 122,LEQ FIRST ARGUMENT IS NOT STRING ! 11223: ERR 123,LEQ SECOND ARGUMENT IS NOT STRING ! 11224: PPM EXFAL FAIL IF LLT ! 11225: PPM EXNUL RETURN NULL IF LEQ ! 11226: PPM EXFAL FAIL IF LGT ! 11227: EJC ! 11228: * ! 11229: * LGE ! 11230: * ! 11231: S$LGE ENT ENTRY POINT ! 11232: JSR LCOMP CALL STRING COMPARISON ROUTINE ! 11233: ERR 124,LGE FIRST ARGUMENT IS NOT STRING ! 11234: ERR 125,LGE SECOND ARGUMENT IS NOT STRING ! 11235: PPM EXFAL FAIL IF LLT ! 11236: PPM EXNUL RETURN NULL IF LEQ ! 11237: PPM EXNUL RETURN NULL IF LGT ! 11238: EJC ! 11239: * ! 11240: * LGT ! 11241: * ! 11242: S$LGT ENT ENTRY POINT ! 11243: JSR LCOMP CALL STRING COMPARISON ROUTINE ! 11244: ERR 126,LGT FIRST ARGUMENT IS NOT STRING ! 11245: ERR 127,LGT SECOND ARGUMENT IS NOT STRING ! 11246: PPM EXFAL FAIL IF LLT ! 11247: PPM EXFAL FAIL IF LEQ ! 11248: PPM EXNUL RETURN NULL IF LGT ! 11249: EJC ! 11250: * ! 11251: * LLE ! 11252: * ! 11253: S$LLE ENT ENTRY POINT ! 11254: JSR LCOMP CALL STRING COMPARISON ROUTINE ! 11255: ERR 128,LLE FIRST ARGUMENT IS NOT STRING ! 11256: ERR 129,LLE SECOND ARGUMENT IS NOT STRING ! 11257: PPM EXNUL RETURN NULL IF LLT ! 11258: PPM EXNUL RETURN NULL IF LEQ ! 11259: PPM EXFAL FAIL IF LGT ! 11260: EJC ! 11261: * ! 11262: * LLT ! 11263: * ! 11264: S$LLT ENT ENTRY POINT ! 11265: JSR LCOMP CALL STRING COMPARISON ROUTINE ! 11266: ERR 130,LLT FIRST ARGUMENT IS NOT STRING ! 11267: ERR 131,LLT SECOND ARGUMENT IS NOT STRING ! 11268: PPM EXNUL RETURN NULL IF LLT ! 11269: PPM EXFAL FAIL IF LEQ ! 11270: PPM EXFAL FAIL IF LGT ! 11271: EJC ! 11272: * ! 11273: * LNE ! 11274: * ! 11275: S$LNE ENT ENTRY POINT ! 11276: JSR LCOMP CALL STRING COMPARISON ROUTINE ! 11277: ERR 132,LNE FIRST ARGUMENT IS NOT STRING ! 11278: ERR 133,LNE SECOND ARGUMENT IS NOT STRING ! 11279: PPM EXNUL RETURN NULL IF LLT ! 11280: PPM EXFAL FAIL IF LEQ ! 11281: PPM EXNUL RETURN NULL IF LGT ! 11282: EJC ! 11283: * ! 11284: * LOCAL ! 11285: * ! 11286: S$LOC ENT ENTRY POINT ! 11287: JSR GTSMI GET SECOND ARGUMENT (LOCAL NUMBER) ! 11288: ERR 134,LOCAL SECOND ARGUMENT IS NOT INTEGER ! 11289: PPM EXFAL FAIL IF OUT OF RANGE ! 11290: MOV XR,WB SAVE LOCAL NUMBER ! 11291: MOV (XS)+,XR LOAD FIRST ARGUMENT ! 11292: JSR GTNVR POINT TO VRBLK ! 11293: PPM SLOC1 JUMP IF NOT VARIABLE NAME ! 11294: MOV VRFNC(XR),XR ELSE LOAD FUNCTION POINTER ! 11295: BNE (XR),=B$PFC,SLOC1 JUMP IF NOT PROGRAM DEFINED ! 11296: * ! 11297: * HERE IF WE HAVE A PROGRAM DEFINED FUNCTION NAME ! 11298: * ! 11299: BZE WB,EXFAL FAIL IF SECOND ARG IS ZERO ! 11300: BGT WB,PFNLO(XR),EXFAL OR TOO LARGE ! 11301: ADD FARGS(XR),WB ELSE ADJUST OFFSET TO INCLUDE ARGS ! 11302: WTB WB CONVERT TO BYTES ! 11303: ADD WB,XR POINT TO LOCAL POINTER ! 11304: MOV PFAGB(XR),XR LOAD VRBLK POINTER ! 11305: BRN EXVNM EXIT BUILDING NMBLK ! 11306: * ! 11307: * HERE IF FIRST ARGUMENT IS NO GOOD ! 11308: * ! 11309: SLOC1 ERB 135,LOCAL FIRST ARG IS NOT A PROGRAM FUNCTION NAME ! 11310: .IF .CNLD ! 11311: .ELSE ! 11312: EJC ! 11313: * ! 11314: * LOAD ! 11315: * ! 11316: S$LOD ENT ENTRY POINT ! 11317: JSR GTSTG LOAD LIBRARY NAME ! 11318: ERR 136,LOAD SECOND ARGUMENT IS NOT STRING ! 11319: MOV XR,XL SAVE LIBRARY NAME ! 11320: JSR XSCNI PREPARE TO SCAN FIRST ARGUMENT ! 11321: ERR 137,LOAD FIRST ARGUMENT IS NOT STRING ! 11322: ERR 138,LOAD FIRST ARGUMENT IS NULL ! 11323: MOV XL,-(XS) STACK LIBRARY NAME ! 11324: MOV =CH$PP,WC SET DELIMITER ONE = LEFT PAREN ! 11325: MOV WC,XL SET DELIMITER TWO = LEFT PAREN ! 11326: JSR XSCAN SCAN FUNCTION NAME ! 11327: MOV XR,-(XS) SAVE PTR TO FUNCTION NAME ! 11328: BNZ WA,SLOD1 JUMP IF LEFT PAREN FOUND ! 11329: ERB 139,LOAD FIRST ARGUMENT IS MISSING A LEFT PAREN ! 11330: * ! 11331: * HERE AFTER SUCCESSFULLY SCANNING FUNCTION NAME ! 11332: * ! 11333: SLOD1 JSR GTNVR LOCATE VRBLK ! 11334: ERR 140,LOAD FIRST ARGUMENT HAS NULL FUNCTION NAME ! 11335: MOV XR,LODFN SAVE VRBLK POINTER ! 11336: ZER LODNA ZERO COUNT OF ARGUMENTS ! 11337: * ! 11338: * LOOP TO SCAN ARGUMENT DATATYPE NAMES ! 11339: * ! 11340: SLOD2 MOV =CH$RP,WC DELIMITER ONE IS RIGHT PAREN ! 11341: MOV =CH$CM,XL DELIMITER TWO IS COMMA ! 11342: JSR XSCAN SCAN NEXT ARGUMENT NAME ! 11343: ICV LODNA BUMP ARGUMENT COUNT ! 11344: BNZ WA,SLOD3 JUMP IF OK DELIMITER WAS FOUND ! 11345: ERB 141,LOAD FIRST ARGUMENT IS MISSING A RIGHT PAREN ! 11346: EJC ! 11347: * ! 11348: * LOAD (CONTINUED) ! 11349: * ! 11350: * COME HERE TO ANALYZE THE DATATYPE POINTER IN (XR). THIS ! 11351: * CODE IS USED BOTH FOR ARGUMENTS (WA=1,2) AND FOR THE ! 11352: * RESULT DATATYPE (WITH WA SET TO ZERO). ! 11353: * ! 11354: SLOD3 MOV XR,-(XS) STACK DATATYPE NAME POINTER ! 11355: MOV =NUM01,WB SET STRING CODE IN CASE ! 11356: MOV =SCSTR,XL POINT TO /STRING/ ! 11357: JSR IDENT CHECK FOR MATCH ! 11358: PPM SLOD4 JUMP IF MATCH ! 11359: MOV (XS),XR ELSE RELOAD NAME ! 11360: ADD WB,WB SET CODE FOR INTEGER (2) ! 11361: MOV =SCINT,XL POINT TO /INTEGER/ ! 11362: JSR IDENT CHECK FOR MATCH ! 11363: PPM SLOD4 JUMP IF MATCH ! 11364: .IF .CNRA ! 11365: .ELSE ! 11366: MOV (XS),XR ELSE RELOAD STRING POINTER ! 11367: ICV WB SET CODE FOR REAL (3) ! 11368: MOV =SCREA,XL POINT TO /REAL/ ! 11369: JSR IDENT CHECK FOR MATCH ! 11370: PPM SLOD4 JUMP IF MATCH ! 11371: .FI ! 11372: ZER WB ELSE GET CODE FOR NO CONVERT ! 11373: * ! 11374: * MERGE HERE WITH PROPER DATATYPE CODE IN WB ! 11375: * ! 11376: SLOD4 MOV WB,(XS) STORE CODE ON STACK ! 11377: BEQ WA,=NUM02,SLOD2 LOOP BACK IF ARG STOPPED BY COMMA ! 11378: BZE WA,SLOD5 JUMP IF THAT WAS THE RESULT TYPE ! 11379: * ! 11380: * HERE WE SCAN OUT THE RESULT TYPE (ARG STOPPED BY ) ) ! 11381: * ! 11382: MOV MXLEN,WC SET DUMMY (IMPOSSIBLE) DELIMITER 1 ! 11383: MOV WC,XL AND DELIMITER TWO ! 11384: JSR XSCAN SCAN RESULT NAME ! 11385: ZER WA SET CODE FOR PROCESSING RESULT ! 11386: BRN SLOD3 JUMP BACK TO PROCESS RESULT NAME ! 11387: EJC ! 11388: * ! 11389: * LOAD (CONTINUED) ! 11390: * ! 11391: * HERE AFTER PROCESSING ALL ARGS AND RESULT ! 11392: * ! 11393: SLOD5 MOV LODNA,WA GET NUMBER OF ARGUMENTS ! 11394: MOV WA,WC COPY FOR LATER ! 11395: WTB WA CONVERT LENGTH TO BYTES ! 11396: ADD *EFSI$,WA ADD SPACE FOR STANDARD FIELDS ! 11397: JSR ALLOC ALLOCATE EFBLK ! 11398: MOV =B$EFC,(XR) SET TYPE WORD ! 11399: MOV WC,FARGS(XR) SET NUMBER OF ARGUMENTS ! 11400: ZER EFUSE(XR) SET USE COUNT (DFFNC WILL SET TO 1) ! 11401: ZER EFCOD(XR) ZERO CODE POINTER FOR NOW ! 11402: MOV (XS)+,EFRSL(XR) STORE RESULT TYPE CODE ! 11403: MOV LODFN,EFVAR(XR) STORE FUNCTION VRBLK POINTER ! 11404: MOV WA,EFLEN(XR) STORE EFBLK LENGTH ! 11405: MOV XR,WB SAVE EFBLK POINTER ! 11406: ADD WA,XR POINT PAST END OF EFBLK ! 11407: LCT WC,WC SET NUMBER OF ARGUMENTS FOR LOOP ! 11408: * ! 11409: * LOOP TO SET ARGUMENT TYPE CODES FROM STACK ! 11410: * ! 11411: SLOD6 MOV (XS)+,-(XR) STORE ONE TYPE CODE FROM STACK ! 11412: BCT WC,SLOD6 LOOP TILL ALL STORED ! 11413: * ! 11414: * NOW LOAD THE EXTERNAL FUNCTION AND PERFORM DEFINITION ! 11415: * ! 11416: MOV (XS)+,XR LOAD FUNCTION STRING NAME ! 11417: MOV (XS),XL LOAD LIBRARY NAME ! 11418: MOV WB,(XS) STORE EFBLK POINTER ! 11419: JSR SYSLD CALL FUNCTION TO LOAD EXTERNAL FUNC ! 11420: ERR 142,LOAD FUNCTION DOES NOT EXIST ! 11421: ERR 143,LOAD FUNCTION CAUSED INPUT ERROR DURING LOAD ! 11422: MOV (XS)+,XL RECALL EFBLK POINTER ! 11423: MOV XR,EFCOD(XL) STORE CODE POINTER ! 11424: MOV LODFN,XR POINT TO VRBLK FOR FUNCTION ! 11425: JSR DFFNC PERFORM FUNCTION DEFINITION ! 11426: BRN EXNUL RETURN NULL RESULT ! 11427: .FI ! 11428: EJC ! 11429: * ! 11430: * LPAD ! 11431: * ! 11432: S$LPD ENT ENTRY POINT ! 11433: JSR GTSTG GET PAD CHARACTER ! 11434: ERR 144,LPAD THIRD ARGUMENT NOT A STRING ! 11435: PLC XR POINT TO CHARACTER (NULL IS BLANK) ! 11436: LCH WB,(XR) LOAD PAD CHARACTER ! 11437: JSR GTSMI GET PAD LENGTH ! 11438: ERR 145,LPAD SECOND ARGUMENT IS NOT INTEGER ! 11439: PPM SLPD3 SKIP IF NEGATIVE OR LARGE ! 11440: * ! 11441: * MERGE TO CHECK FIRST ARG ! 11442: * ! 11443: SLPD1 JSR GTSTG GET FIRST ARGUMENT (STRING TO PAD) ! 11444: ERR 146,LPAD FIRST ARGUMENT IS NOT STRING ! 11445: BGE WA,WC,EXIXR RETURN 1ST ARG IF TOO LONG TO PAD ! 11446: MOV XR,XL ELSE MOVE PTR TO STRING TO PAD ! 11447: * ! 11448: * NOW WE ARE READY FOR THE PAD ! 11449: * ! 11450: * (XL) POINTER TO STRING TO PAD ! 11451: * (WB) PAD CHARACTER ! 11452: * (WC) LENGTH TO PAD STRING TO ! 11453: * ! 11454: MOV WC,WA COPY LENGTH ! 11455: JSR ALOCS ALLOCATE SCBLK FOR NEW STRING ! 11456: MOV XR,-(XS) SAVE AS RESULT ! 11457: MOV SCLEN(XL),WA LOAD LENGTH OF ARGUMENT ! 11458: SUB WA,WC CALCULATE NUMBER OF PAD CHARACTERS ! 11459: PSC XR POINT TO CHARS IN RESULT STRING ! 11460: LCT WC,WC SET COUNTER FOR PAD LOOP ! 11461: * ! 11462: * LOOP TO PERFORM PAD ! 11463: * ! 11464: SLPD2 SCH WB,(XR)+ STORE PAD CHARACTER, BUMP PTR ! 11465: BCT WC,SLPD2 LOOP TILL ALL PAD CHARS STORED ! 11466: CSC XR COMPLETE STORE CHARACTERS ! 11467: * ! 11468: * NOW COPY STRING ! 11469: * ! 11470: BZE WA,EXITS EXIT IF NULL STRING ! 11471: PLC XL ELSE POINT TO CHARS IN ARGUMENT ! 11472: MVC MOVE CHARACTERS TO RESULT STRING ! 11473: BRN EXITS JUMP FOR NEXT CODE WORD ! 11474: * ! 11475: * HERE IF 2ND ARG IS NEGATIVE OR LARGE ! 11476: * ! 11477: SLPD3 ZER WC ZERO PAD COUNT ! 11478: BRN SLPD1 MERGE ! 11479: EJC ! 11480: * ! 11481: * LT ! 11482: * ! 11483: S$LTF ENT ENTRY POINT ! 11484: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE ! 11485: ERR 147,LT FIRST ARGUMENT IS NOT NUMERIC ! 11486: ERR 148,LT SECOND ARGUMENT IS NOT NUMERIC ! 11487: PPM EXNUL RETURN NULL IF LT ! 11488: PPM EXFAL FAIL IF EQ ! 11489: PPM EXFAL FAIL IF GT ! 11490: EJC ! 11491: * ! 11492: * NE ! 11493: * ! 11494: S$NEF ENT ENTRY POINT ! 11495: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE ! 11496: ERR 149,NE FIRST ARGUMENT IS NOT NUMERIC ! 11497: ERR 150,NE SECOND ARGUMENT IS NOT NUMERIC ! 11498: PPM EXNUL RETURN NULL IF LT ! 11499: PPM EXFAL FAIL IF EQ ! 11500: PPM EXNUL RETURN NULL IF GT ! 11501: EJC ! 11502: * ! 11503: * NOTANY ! 11504: * ! 11505: S$NAY ENT ENTRY POINT ! 11506: MOV =P$NAS,WB SET PCODE FOR SINGLE CHAR ARG ! 11507: MOV =P$NAY,XL PCODE FOR MULTI-CHAR ARG ! 11508: MOV =P$NAD,WC SET PCODE FOR EXPR ARG ! 11509: JSR PATST CALL COMMON ROUTINE TO BUILD NODE ! 11510: ERR 151,NOTANY ARGUMENT IS NOT STRING OR EXPRESSION ! 11511: BRN EXIXR JUMP FOR NEXT CODE WORD ! 11512: EJC ! 11513: * ! 11514: * OPSYN ! 11515: * ! 11516: S$OPS ENT ENTRY POINT ! 11517: JSR GTSMI LOAD THIRD ARGUMENT ! 11518: ERR 152,OPSYN THIRD ARGUMENT IS NOT INTEGER ! 11519: ERR 153,OPSYN THIRD ARGUMENT IS NEGATIVE OR TOO LARGE ! 11520: MOV WC,WB IF OK, SAVE THIRD ARGUMNET ! 11521: MOV (XS)+,XR LOAD SECOND ARGUMENT ! 11522: JSR GTNVR LOCATE VARIABLE BLOCK ! 11523: ERR 154,OPSYN SECOND ARG IS NOT NATURAL VARIABLE NAME ! 11524: MOV VRFNC(XR),XL IF OK, LOAD FUNCTION BLOCK POINTER ! 11525: BNZ WB,SOPS2 JUMP IF OPERATOR OPSYN CASE ! 11526: * ! 11527: * HERE FOR FUNCTION OPSYN (THIRD ARG ZERO) ! 11528: * ! 11529: MOV (XS)+,XR LOAD FIRST ARGUMENT ! 11530: JSR GTNVR GET VRBLK POINTER ! 11531: ERR 155,OPSYN FIRST ARG IS NOT NATURAL VARIABLE NAME ! 11532: * ! 11533: * MERGE HERE TO PERFORM FUNCTION DEFINITION ! 11534: * ! 11535: SOPS1 JSR DFFNC CALL FUNCTION DEFINER ! 11536: BRN EXNUL EXIT WITH NULL RESULT ! 11537: * ! 11538: * HERE FOR OPERATOR OPSYN (THIRD ARG NON-ZERO) ! 11539: * ! 11540: SOPS2 JSR GTSTG GET OPERATOR NAME ! 11541: PPM SOPS5 JUMP IF NOT STRING ! 11542: BNE WA,=NUM01,SOPS5 ERROR IF NOT ONE CHAR LONG ! 11543: PLC XR ELSE POINT TO CHARACTER ! 11544: LCH WC,(XR) LOAD CHARACTER NAME ! 11545: EJC ! 11546: * ! 11547: * OPSYN (CONTINUED) ! 11548: * ! 11549: * NOW SET TO SEARCH FOR MATCHING UNARY OR BINARY OPERATOR ! 11550: * NAME AS APPROPRIATE. NOTE THAT THERE ARE =OPBUN UNDEFINED ! 11551: * BINARY OPERATORS AND =OPUUN UNDEFINED UNARY OPERATORS. ! 11552: * ! 11553: MOV =R$UUB,WA POINT TO UNOP POINTERS IN CASE ! 11554: MOV =OPNSU,XR POINT TO NAMES OF UNARY OPERATORS ! 11555: ADD =OPBUN,WB ADD NO. OF UNDEFINED BINARY OPS ! 11556: BEQ WB,=OPUUN,SOPS3 JUMP IF UNOP (THIRD ARG WAS 1) ! 11557: MOV =R$UBA,WA ELSE POINT TO BINARY OPERATOR PTRS ! 11558: MOV =OPSNB,XR POINT TO NAMES OF BINARY OPERATORS ! 11559: MOV =OPBUN,WB SET NUMBER OF UNDEFINED BINOPS ! 11560: * ! 11561: * MERGE HERE TO CHECK LIST (WB = NUMBER TO CHECK) ! 11562: * ! 11563: SOPS3 LCT WB,WB SET COUNTER TO CONTROL LOOP ! 11564: * ! 11565: * LOOP TO SEARCH FOR NAME MATCH ! 11566: * ! 11567: SOPS4 BEQ WC,(XR),SOPS6 JUMP IF NAMES MATCH ! 11568: ICA WA ELSE PUSH POINTER TO FUNCTION PTR ! 11569: ICA XR BUMP POINTER ! 11570: BCT WB,SOPS4 LOOP BACK TILL ALL CHECKED ! 11571: * ! 11572: * HERE IF BAD OPERATOR NAME ! 11573: * ! 11574: SOPS5 ERB 156,OPSYN FIRST ARG IS NOT CORRECT OPERATOR NAME ! 11575: * ! 11576: * COME HERE ON FINDING A MATCH IN THE OPERATOR NAME TABLE ! 11577: * ! 11578: SOPS6 MOV WA,XR COPY POINTER TO FUNCTION BLOCK PTR ! 11579: SUB *VRFNC,XR MAKE IT LOOK LIKE DUMMY VRBLK ! 11580: BRN SOPS1 MERGE BACK TO DEFINE OPERATOR ! 11581: EJC ! 11582: * ! 11583: * OUTPUT ! 11584: * ! 11585: S$OUP ENT ENTRY POINT ! 11586: MOV =NUM03,WB OUTPUT FLAG ! 11587: JSR IOPUT CALL INPUT/OUTPUT ASSOC. ROUTINE ! 11588: ERR 157,OUTPUT THIRD ARGUMENT IS NOT A STRING ! 11589: ERR 158,INAPPROPRIATE SECOND ARGUMENT FOR OUTPUT ! 11590: ERR 159,INAPPROPRIATE FIRST ARGUMENT FOR OUTPUT ! 11591: ERR 160,INAPPROPRIATE FILE SPECIFICATION FOR OUTPUT ! 11592: PPM EXFAL FAIL IF FILE DOES NOT EXIST ! 11593: ERR 161,OUTPUT FILE CANNOT BE WRITTEN TO ! 11594: BRN EXNUL RETURN NULL STRING ! 11595: EJC ! 11596: * ! 11597: * POS ! 11598: * ! 11599: S$POS ENT ENTRY POINT ! 11600: MOV =P$POS,WB SET PCODE FOR INTEGER ARG CASE ! 11601: MOV =P$PSD,WA SET PCODE FOR EXPRESSION ARG CASE ! 11602: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE ! 11603: ERR 162,POS ARGUMENT IS NOT INTEGER OR EXPRESSION ! 11604: ERR 163,POS ARGUMENT IS NEGATIVE OR TOO LARGE ! 11605: BRN EXIXR RETURN PATTERN NODE ! 11606: EJC ! 11607: * ! 11608: * PROTOTYPE ! 11609: * ! 11610: S$PRO ENT ENTRY POINT ! 11611: MOV (XS)+,XR LOAD ARGUMENT ! 11612: MOV TBLEN(XR),WB LENGTH IF TABLE, VECTOR (=VCLEN) ! 11613: BTW WB CONVERT TO WORDS ! 11614: MOV (XR),WA LOAD TYPE WORD OF ARGUMENT BLOCK ! 11615: BEQ WA,=B$ART,SPRO4 JUMP IF ARRAY ! 11616: BEQ WA,=B$TBT,SPRO1 JUMP IF TABLE ! 11617: BEQ WA,=B$VCT,SPRO3 JUMP IF VECTOR ! 11618: BEQ WA,=B$BCT,SPR05 JUMP IF BUFFER ! 11619: ERB 164,PROTOTYPE ARGUMENT IS NOT VALID OBJECT ! 11620: * ! 11621: * HERE FOR TABLE ! 11622: * ! 11623: SPRO1 SUB =TBSI$,WB SUBTRACT STANDARD FIELDS ! 11624: * ! 11625: * MERGE FOR VECTOR ! 11626: * ! 11627: SPRO2 MTI WB CONVERT TO INTEGER ! 11628: BRN EXINT EXIT WITH INTEGER RESULT ! 11629: * ! 11630: * HERE FOR VECTOR ! 11631: * ! 11632: SPRO3 SUB =VCSI$,WB SUBTRACT STANDARD FIELDS ! 11633: BRN SPRO2 MERGE ! 11634: * ! 11635: * HERE FOR ARRAY ! 11636: * ! 11637: SPRO4 ADD AROFS(XR),XR POINT TO PROTOTYPE FIELD ! 11638: MOV (XR),XR LOAD PROTOTYPE ! 11639: BRN EXIXR RETURN PROTOTYPE AS RESULT ! 11640: .IF .CNBF ! 11641: .ELSE ! 11642: * ! 11643: * HERE FOR BUFFER ! 11644: * ! 11645: SPR05 MOV BCBUF(XR),XR POINT TO BFBLK ! 11646: MTI BFALC(XR) LOAD ALLOCATED LENGTH ! 11647: BRN EXINT EXIT WITH INTEGER ALLOCATION ! 11648: .FI ! 11649: EJC ! 11650: * ! 11651: * REMDR ! 11652: * ! 11653: S$RMD ENT ENTRY POINT ! 11654: ZER WB SET POSITIVE FLAG ! 11655: MOV (XS),XR LOAD SECOND ARGUMENT ! 11656: JSR GTINT CONVERT TO INTEGER ! 11657: ERR 165,REMDR SECOND ARGUMENT IS NOT INTEGER ! 11658: JSR ARITH CONVERT ARGS ! 11659: PPM SRM01 FIRST ARG NOT INTEGER ! 11660: PPM SECOND ARG CHECKED ABOVE ! 11661: .IF .CNRA ! 11662: .ELSE ! 11663: PPM SRM01 FIRST ARG REAL ! 11664: .FI ! 11665: LDI ICVAL(XR) LOAD LEFT ARGUMENT VALUE ! 11666: RMI ICVAL(XL) GET REMAINDER ! 11667: INO EXINT JUMP IF NO OVERFLOW ! 11668: ERB 167,REMDR CAUSED INTEGER OVERFLOW ! 11669: * ! 11670: * FAIL FIRST ARGUMENT ! 11671: * ! 11672: SRM01 ERB 166,REMDR FIRST ARGUMENT IS NOT INTEGER ! 11673: EJC ! 11674: * ! 11675: * REPLACE ! 11676: * ! 11677: * THE ACTUAL REPLACE OPERATION USES AN SCBLK WHOSE CFP$A ! 11678: * CHARS CONTAIN THE TRANSLATED VERSIONS OF ALL THE CHARS. ! 11679: * THE TABLE POINTER IS REMEMBERED FROM CALL TO CALL AND ! 11680: * THE TABLE IS ONLY BUILT WHEN THE ARGUMENTS CHANGE. ! 11681: * ! 11682: S$RPL ENT ENTRY POINT ! 11683: JSR GTSTG LOAD THIRD ARGUMENT AS STRING ! 11684: ERR 168,REPLACE THIRD ARGUMENT IS NOT STRING ! 11685: MOV XR,XL SAVE THIRD ARG PTR ! 11686: JSR GTSTG GET SECOND ARGUMENT ! 11687: ERR 169,REPLACE SECOND ARGUMENT IS NOT STRING ! 11688: * ! 11689: * CHECK TO SEE IF THIS IS THE SAME TABLE AS LAST TIME ! 11690: * ! 11691: BNE XR,R$RA2,SRPL1 JUMP IF 2ND ARGUMENT DIFFERENT ! 11692: BEQ XL,R$RA3,SRPL4 JUMP IF ARGS SAME AS LAST TIME ! 11693: * ! 11694: * HERE WE BUILD A NEW REPLACE TABLE (NOTE WA = 2ND ARG LEN) ! 11695: * ! 11696: SRPL1 MOV SCLEN(XL),WB LOAD 3RD ARGUMENT LENGTH ! 11697: BNE WA,WB,SRPL5 JUMP IF ARGUMENTS NOT SAME LENGTH ! 11698: BZE WB,SRPL5 JUMP IF NULL 2ND ARGUMENT ! 11699: MOV XL,R$RA3 SAVE THIRD ARG FOR NEXT TIME IN ! 11700: MOV XR,R$RA2 SAVE SECOND ARG FOR NEXT TIME IN ! 11701: MOV KVALP,XL POINT TO ALPHABET STRING ! 11702: MOV SCLEN(XL),WA LOAD ALPHABET SCBLK LENGTH ! 11703: MOV R$RPT,XR POINT TO CURRENT TABLE (IF ANY) ! 11704: BNZ XR,SRPL2 JUMP IF WE ALREADY HAVE A TABLE ! 11705: * ! 11706: * HERE WE ALLOCATE A NEW TABLE ! 11707: * ! 11708: JSR ALOCS ALLOCATE NEW TABLE ! 11709: MOV WC,WA KEEP SCBLK LENGTH ! 11710: MOV XR,R$RPT SAVE TABLE POINTER FOR NEXT TIME ! 11711: * ! 11712: * MERGE HERE WITH POINTER TO NEW TABLE BLOCK IN (XR) ! 11713: * ! 11714: SRPL2 CTB WA,SCSI$ COMPUTE LENGTH OF SCBLK ! 11715: MVW COPY TO GET INITIAL TABLE VALUES ! 11716: EJC ! 11717: * ! 11718: * REPLACE (CONTINUED) ! 11719: * ! 11720: * NOW WE MUST PLUG SELECTED ENTRIES AS REQUIRED. NOTE THAT ! 11721: * WE ARE SHORT OF INDEX REGISTERS FOR THE FOLLOWING LOOP. ! 11722: * HENCE THE NEED TO REPEATEDLY RE-INITIALISE CHAR PTR XL ! 11723: * ! 11724: MOV R$RA2,XL POINT TO SECOND ARGUMENT ! 11725: LCT WB,WB NUMBER OF CHARS TO PLUG ! 11726: ZER WC ZERO CHAR OFFSET ! 11727: MOV R$RA3,XR POINT TO 3RD ARG ! 11728: PLC XR GET CHAR PTR FOR 3RD ARG ! 11729: * ! 11730: * LOOP TO PLUG CHARS ! 11731: * ! 11732: SRPL3 MOV R$RA2,XL POINT TO 2ND ARG ! 11733: PLC XL,WC POINT TO NEXT CHAR ! 11734: ICV WC INCREMENT OFFSET ! 11735: LCH WA,(XL) GET NEXT CHAR ! 11736: MOV R$RPT,XL POINT TO TRANSLATE TABLE ! 11737: PSC XL,WA CONVERT CHAR TO OFFSET INTO TABLE ! 11738: LCH WA,(XR)+ GET TRANSLATED CHAR ! 11739: SCH WA,(XL) STORE IN TABLE ! 11740: CSC XL COMPLETE STORE CHARACTERS ! 11741: BCT WB,SRPL3 LOOP TILL DONE ! 11742: EJC ! 11743: * ! 11744: * REPLACE (CONTINUED) ! 11745: * ! 11746: * HERE TO PERFORM TRANSLATE ! 11747: * ! 11748: SRPL4 JSR GTSTG GET FIRST ARGUMENT ! 11749: ERR 170,REPLACE FIRST ARGUMENT IS NOT STRING ! 11750: BZE WA,EXNUL RETURN NULL IF NULL ARGUMENT ! 11751: MOV XR,XL COPY POINTER ! 11752: MOV WA,WC SAVE LENGTH ! 11753: CTB WA,SCHAR GET SCBLK LENGTH ! 11754: JSR ALLOC ALLOCATE SPACE FOR COPY ! 11755: MOV XR,WB SAVE ADDRESS OF COPY ! 11756: MVW MOVE SCBLK CONTENTS TO COPY ! 11757: MOV R$RPT,XR POINT TO REPLACE TABLE ! 11758: PLC XR POINT TO CHARS OF TABLE ! 11759: MOV WB,XL POINT TO STRING TO TRANSLATE ! 11760: PLC XL POINT TO CHARS OF STRING ! 11761: MOV WC,WA SET NUMBER OF CHARS TO TRANSLATE ! 11762: TRC PERFORM TRANSLATION ! 11763: MOV WB,-(XS) STACK NEW STRING AS RESULT ! 11764: BRN EXITS RETURN WITH RESULT ON STACK ! 11765: * ! 11766: * ERROR POINT ! 11767: * ! 11768: SRPL5 ERB 171,NULL OR UNEQUALLY LONG 2ND, 3RD ARGS TO REPLACE ! 11769: EJC ! 11770: * ! 11771: * REWIND ! 11772: * ! 11773: S$REW ENT ENTRY POINT ! 11774: JSR IOFCB CALL FCBLK ROUTINE ! 11775: ERR 172,REWIND ARGUMENT IS NOT A SUITABLE NAME ! 11776: ERR 173,REWIND ARGUMENT IS NULL ! 11777: JSR SYSRW CALL SYSTEM REWIND FUNCTION ! 11778: ERR 174,REWIND FILE DOES NOT EXIST ! 11779: ERR 175,REWIND FILE DOES NOT PERMIT REWIND ! 11780: ERR 176,REWIND CAUSED NON-RECOVERABLE ERROR ! 11781: BRN EXNUL EXIT WITH NULL RESULT IF NO ERROR ! 11782: EJC ! 11783: * ! 11784: * REVERSE ! 11785: * ! 11786: S$RVS ENT ENTRY POINT ! 11787: JSR GTSTG LOAD STRING ARGUMENT ! 11788: ERR 177,REVERSE ARGUMENT IS NOT STRING ! 11789: BZE WA,EXIXR RETURN ARGUMENT IF NULL ! 11790: MOV XR,XL ELSE SAVE POINTER TO STRING ARG ! 11791: JSR ALOCS ALLOCATE SPACE FOR NEW SCBLK ! 11792: MOV XR,-(XS) STORE SCBLK PTR ON STACK AS RESULT ! 11793: PSC XR PREPARE TO STORE IN NEW SCBLK ! 11794: PLC XL,WC POINT PAST LAST CHAR IN ARGUMENT ! 11795: LCT WC,WC SET LOOP COUNTER ! 11796: * ! 11797: * LOOP TO MOVE CHARS IN REVERSE ORDER ! 11798: * ! 11799: SRVS1 LCH WB,-(XL) LOAD NEXT CHAR FROM ARGUMENT ! 11800: SCH WB,(XR)+ STORE IN RESULT ! 11801: BCT WC,SRVS1 LOOP TILL ALL MOVED ! 11802: CSC XR COMPLETE STORE CHARACTERS ! 11803: BRN EXITS AND THEN JUMP FOR NEXT CODE WORD ! 11804: EJC ! 11805: * ! 11806: * RPAD ! 11807: * ! 11808: S$RPD ENT ENTRY POINT ! 11809: JSR GTSTG GET PAD CHARACTER ! 11810: ERR 178,RPAD THIRD ARGUMENT IS NOT STRING ! 11811: PLC XR POINT TO CHARACTER (NULL IS BLANK) ! 11812: LCH WB,(XR) LOAD PAD CHARACTER ! 11813: JSR GTSMI GET PAD LENGTH ! 11814: ERR 179,RPAD SECOND ARGUMENT IS NOT INTEGER ! 11815: PPM SRPD3 SKIP IF NEGATIVE OR LARGE ! 11816: * ! 11817: * MERGE TO CHECK FIRST ARG. ! 11818: * ! 11819: SRPD1 JSR GTSTG GET FIRST ARGUMENT (STRING TO PAD) ! 11820: ERR 180,RPAD FIRST ARGUMENT IS NOT STRING ! 11821: BGE WA,WC,EXIXR RETURN 1ST ARG IF TOO LONG TO PAD ! 11822: MOV XR,XL ELSE MOVE PTR TO STRING TO PAD ! 11823: * ! 11824: * NOW WE ARE READY FOR THE PAD ! 11825: * ! 11826: * (XL) POINTER TO STRING TO PAD ! 11827: * (WB) PAD CHARACTER ! 11828: * (WC) LENGTH TO PAD STRING TO ! 11829: * ! 11830: MOV WC,WA COPY LENGTH ! 11831: JSR ALOCS ALLOCATE SCBLK FOR NEW STRING ! 11832: MOV XR,-(XS) SAVE AS RESULT ! 11833: MOV SCLEN(XL),WA LOAD LENGTH OF ARGUMENT ! 11834: SUB WA,WC CALCULATE NUMBER OF PAD CHARACTERS ! 11835: PSC XR POINT TO CHARS IN RESULT STRING ! 11836: LCT WC,WC SET COUNTER FOR PAD LOOP ! 11837: * ! 11838: * COPY ARGUMENT STRING ! 11839: * ! 11840: BZE WA,SRPD2 JUMP IF ARGUMENT IS NULL ! 11841: PLC XL ELSE POINT TO ARGUMENT CHARS ! 11842: MVC MOVE CHARACTERS TO RESULT STRING ! 11843: * ! 11844: * LOOP TO SUPPLY PAD CHARACTERS ! 11845: * ! 11846: SRPD2 SCH WB,(XR)+ STORE PAD CHARACTER, BUMP PTR ! 11847: BCT WC,SRPD2 LOOP TILL ALL PAD CHARS STORED ! 11848: CSC XR COMPLETE CHARACTER STORING ! 11849: BRN EXITS AND EXIT FOR NEXT WORD ! 11850: * ! 11851: * HERE IF 2ND ARG IS NEGATIVE OR LARGE ! 11852: * ! 11853: SRPD3 ZER WC ZERO PAD COUNT ! 11854: BRN SRPD1 MERGE ! 11855: EJC ! 11856: * ! 11857: * RTAB ! 11858: * ! 11859: S$RTB ENT ENTRY POINT ! 11860: MOV =P$RTB,WB SET PCODE FOR INTEGER ARG CASE ! 11861: MOV =P$RTD,WA SET PCODE FOR EXPRESSION ARG CASE ! 11862: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE ! 11863: ERR 181,RTAB ARGUMENT IS NOT INTEGER OR EXPRESSION ! 11864: ERR 182,RTAB ARGUMENT IS NEGATIVE OR TOO LARGE ! 11865: BRN EXIXR RETURN PATTERN NODE ! 11866: EJC ! 11867: .IF .CUST ! 11868: * ! 11869: * SET ! 11870: * ! 11871: S$SET ENT ENTRY POINT ! 11872: MOV (XS)+,R$IO2 SAVE THIRD ARG ! 11873: MOV (XS)+,R$IO1 SAVE SECOND ARG ! 11874: JSR IOFCB CALL FCBLK ROUTINE ! 11875: ERR 291,SET FIRST ARGUMENT IS NOT A SUITABLE NAME ! 11876: ERR 292,SET FIRST ARGUMENT IS NULL ! 11877: MOV R$IO1,WB LOAD SECOND ARG ! 11878: MOV R$IO2,WC LOAD THIRD ARG ! 11879: JSR SYSST CALL SYSTEM SET ROUTINE ! 11880: ERR 293,INAPPROPRIATE SECOND ARGUMENT TO SET ! 11881: ERR 294,INAPPROPRIATE THIRD ARGUMENT TO SET ! 11882: ERR 295,SET FILE DOES NOT EXIST ! 11883: ERR 296,SET FILE DOES NOT PERMIT SETTING FILE POINTER ! 11884: ERR 297,SET CAUSED NON-RECOVERABLE I/O ERROR ! 11885: BRN EXNUL OTHERWISEW RETURN NULL ! 11886: EJC ! 11887: .FI ! 11888: * ! 11889: * TAB ! 11890: * ! 11891: S$TAB ENT ENTRY POINT ! 11892: MOV =P$TAB,WB SET PCODE FOR INTEGER ARG CASE ! 11893: MOV =P$TBD,WA SET PCODE FOR EXPRESSION ARG CASE ! 11894: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE ! 11895: ERR 183,TAB ARGUMENT IS NOT INTEGER OR EXPRESSION ! 11896: ERR 184,TAB ARGUMENT IS NEGATIVE OR TOO LARGE ! 11897: BRN EXIXR RETURN PATTERN NODE ! 11898: EJC ! 11899: * ! 11900: * RPOS ! 11901: * ! 11902: S$RPS ENT ENTRY POINT ! 11903: MOV =P$RPS,WB SET PCODE FOR INTEGER ARG CASE ! 11904: MOV =P$RPD,WA SET PCODE FOR EXPRESSION ARG CASE ! 11905: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE ! 11906: ERR 185,RPOS ARGUMENT IS NOT INTEGER OR EXPRESSION ! 11907: ERR 186,RPOS ARGUMENT IS NEGATIVE OR TOO LARGE ! 11908: BRN EXIXR RETURN PATTERN NODE ! 11909: .IF .CNSR ! 11910: .ELSE ! 11911: EJC ! 11912: * ! 11913: * RSORT ! 11914: * ! 11915: S$RSR ENT ENTRY POINT ! 11916: MNZ WA MARK AS RSORT ! 11917: JSR SORTA CALL SORT ROUTINE ! 11918: BRN EXSID RETURN, SETTING IDVAL ! 11919: .FI ! 11920: EJC ! 11921: * ! 11922: * SETEXIT ! 11923: * ! 11924: S$STX ENT ENTRY POINT ! 11925: MOV (XS)+,XR LOAD ARGUMENT ! 11926: MOV STXVR,WA LOAD OLD VRBLK POINTER ! 11927: ZER XL LOAD ZERO IN CASE NULL ARG ! 11928: BEQ XR,=NULLS,SSTX1 JUMP IF NULL ARGUMENT (RESET CALL) ! 11929: JSR GTNVR ELSE GET SPECIFIED VRBLK ! 11930: PPM SSTX2 JUMP IF NOT NATURAL VARIABLE ! 11931: MOV VRLBL(XR),XL ELSE LOAD LABEL ! 11932: BEQ XL,=STNDL,SSTX2 JUMP IF LABEL IS NOT DEFINED ! 11933: BNE (XL),=B$TRT,SSTX1 JUMP IF NOT TRAPPED ! 11934: MOV TRLBL(XL),XL ELSE LOAD PTR TO REAL LABEL CODE ! 11935: * ! 11936: * HERE TO SET/RESET SETEXIT TRAP ! 11937: * ! 11938: SSTX1 MOV XR,STXVR STORE NEW VRBLK POINTER (OR NULL) ! 11939: MOV XL,R$SXC STORE NEW CODE PTR (OR ZERO) ! 11940: BEQ WA,=NULLS,EXNUL RETURN NULL IF NULL RESULT ! 11941: MOV WA,XR ELSE COPY VRBLK POINTER ! 11942: BRN EXVNM AND RETURN BUILDING NMBLK ! 11943: * ! 11944: * HERE IF BAD ARGUMENT ! 11945: * ! 11946: SSTX2 ERB 187,SETEXIT ARGUMENT IS NOT LABEL NAME OR NULL ! 11947: .IF .CNSR ! 11948: .ELSE ! 11949: EJC ! 11950: * ! 11951: * SORT ! 11952: * ! 11953: S$SRT ENT ENTRY POINT ! 11954: ZER WA MARK AS SORT ! 11955: JSR SORTA CALL SORT ROUTINE ! 11956: BRN EXSID RETURN, SETTING IDVAL ! 11957: .FI ! 11958: EJC ! 11959: * ! 11960: * SPAN ! 11961: * ! 11962: S$SPN ENT ENTRY POINT ! 11963: MOV =P$SPS,WB SET PCODE FOR SINGLE CHAR ARG ! 11964: MOV =P$SPN,XL SET PCODE FOR MULTI-CHAR ARG ! 11965: MOV =P$SPD,WC SET PCODE FOR EXPRESSION ARG ! 11966: JSR PATST CALL COMMON ROUTINE TO BUILD NODE ! 11967: ERR 188,SPAN ARGUMENT IS NOT STRING OR EXPRESSION ! 11968: BRN EXIXR JUMP FOR NEXT CODE WORD ! 11969: EJC ! 11970: * ! 11971: * SIZE ! 11972: * ! 11973: S$SI$ ENT ENTRY POINT ! 11974: .IF .CNBF ! 11975: .ELSE ! 11976: MOV (XS),XR LOAD ARGUMENT ! 11977: BNE (XR),=B$BCT,SSI$1 BRANCH IF NOT BUFFER ! 11978: ICA XS ELSE POP ARGUMENT ! 11979: MTI BCLEN(XR) LOAD DEFINED LENGTH ! 11980: BRN EXINT EXIT WITH INTEGER ! 11981: .FI ! 11982: * ! 11983: * HERE IF NOT BUFFER ! 11984: * ! 11985: SSI$1 JSR GTSTG LOAD STRING ARGUMENT ! 11986: ERR 189,SIZE ARGUMENT IS NOT STRING ! 11987: MTI WA LOAD LENGTH AS INTEGER ! 11988: BRN EXINT EXIT WITH INTEGER RESULT ! 11989: EJC ! 11990: * ! 11991: * STOPTR ! 11992: * ! 11993: S$STT ENT ENTRY POINT ! 11994: ZER XL INDICATE STOPTR CASE ! 11995: JSR TRACE CALL TRACE PROCEDURE ! 11996: ERR 190,STOPTR FIRST ARGUMENT IS NOT APPROPRIATE NAME ! 11997: ERR 191,STOPTR SECOND ARGUMENT IS NOT TRACE TYPE ! 11998: BRN EXNUL RETURN NULL ! 11999: EJC ! 12000: * ! 12001: * SUBSTR ! 12002: * ! 12003: S$SUB ENT ENTRY POINT ! 12004: JSR GTSMI LOAD THIRD ARGUMENT ! 12005: ERR 192,SUBSTR THIRD ARGUMENT IS NOT INTEGER ! 12006: PPM EXFAL JUMP IF NEGATIVE OR TOO LARGE ! 12007: MOV XR,SBSSV SAVE THIRD ARGUMENT ! 12008: JSR GTSMI LOAD SECOND ARGUMENT ! 12009: ERR 193,SUBSTR SECOND ARGUMENT IS NOT INTEGER ! 12010: PPM EXFAL JUMP IF OUT OF RANGE ! 12011: MOV XR,WB SAVE SECOND ARGUMENT ! 12012: BZE WB,EXFAL JUMP IF SECOND ARGUMENT ZERO ! 12013: DCV WB ELSE DECREMENT FOR ONES ORIGIN ! 12014: .IF .CNBF ! 12015: .ELSE ! 12016: MOV (XS),XL GET FIRST ARG PTR ! 12017: BNE (XL),=B$BCT,SSUBA BRANCH IF NOT BUFFER ! 12018: MOV BCBUF(XL),XR GET BFBLK PTR ! 12019: MOV BCLEN(XL),WA GET LENGTH ! 12020: BRN SSUBB MERGE ! 12021: * ! 12022: * HERE IF NOT BUFFER TO GET STRING ! 12023: * ! 12024: .FI ! 12025: SSUBA JSR GTSTG LOAD FIRST ARGUMENT ! 12026: ERR 194,SUBSTR FIRST ARGUMENT IS NOT STRING ! 12027: * ! 12028: * MERGE WITH BFBLK OR SCBLK PTR IN XR. WA HAS LENGTH ! 12029: * ! 12030: SSUBB MOV SBSSV,WC RELOAD THIRD ARGUMENT ! 12031: BNZ WC,SSUB1 SKIP IF THIRD ARG GIVEN ! 12032: MOV WA,WC ELSE GET STRING LENGTH ! 12033: BGT WB,WC,EXFAL FAIL IF IMPROPER ! 12034: SUB WB,WC REDUCE BY OFFSET TO START ! 12035: * ! 12036: * MERGE ! 12037: * ! 12038: SSUB1 MOV WA,XL SAVE STRING LENGTH ! 12039: MOV WC,WA SET LENGTH OF SUBSTRING ! 12040: ADD WB,WC ADD 2ND ARG TO 3RD ARG ! 12041: BGT WC,XL,EXFAL JUMP IF IMPROPER SUBSTRING ! 12042: MOV XR,XL COPY POINTER TO FIRST ARG ! 12043: JSR SBSTR BUILD SUBSTRING ! 12044: BRN EXIXR AND JUMP FOR NEXT CODE WORD ! 12045: EJC ! 12046: * ! 12047: * TABLE ! 12048: * ! 12049: S$TBL ENT ENTRY POINT ! 12050: MOV (XS)+,XL GET INITIAL LOOKUP VALUE ! 12051: ICA XS POP SECOND ARGUMENT ! 12052: JSR GTSMI LOAD ARGUMENT ! 12053: ERR 195,TABLE ARGUMENT IS NOT INTEGER ! 12054: ERR 196,TABLE ARGUMENT IS OUT OF RANGE ! 12055: BNZ WC,STBL1 JUMP IF NON-ZERO ! 12056: MOV =TBNBK,WC ELSE SUPPLY DEFAULT VALUE ! 12057: * ! 12058: * MERGE HERE WITH NUMBER OF HEADERS IN WA ! 12059: * ! 12060: STBL1 MOV WC,WA COPY NUMBER OF HEADERS ! 12061: ADD =TBSI$,WA ADJUST FOR STANDARD FIELDS ! 12062: WTB WA CONVERT LENGTH TO BYTES ! 12063: JSR ALLOC ALLOCATE SPACE FOR TBBLK ! 12064: MOV XR,WB COPY POINTER TO TBBLK ! 12065: MOV =B$TBT,(XR)+ STORE TYPE WORD ! 12066: ZER (XR)+ ZERO ID FOR THE MOMENT ! 12067: MOV WA,(XR)+ STORE LENGTH (TBLEN) ! 12068: MOV XL,(XR)+ STORE INITIAL LOOKUP VALUE ! 12069: LCT WC,WC SET LOOP COUNTER (NUM HEADERS) ! 12070: * ! 12071: * LOOP TO INITIALIZE ALL BUCKET POINTERS ! 12072: * ! 12073: STBL2 MOV WB,(XR)+ STORE TBBLK PTR IN BUCKET HEADER ! 12074: BCT WC,STBL2 LOOP TILL ALL STORED ! 12075: MOV WB,XR RECALL POINTER TO TBBLK ! 12076: BRN EXSID EXIT SETTING IDVAL ! 12077: EJC ! 12078: * ! 12079: * TIME ! 12080: * ! 12081: S$TIM ENT ENTRY POINT ! 12082: JSR SYSTM GET TIMER VALUE ! 12083: SBI TIMSX SUBTRACT STARTING TIME ! 12084: BRN EXINT EXIT WITH INTEGER VALUE ! 12085: EJC ! 12086: * ! 12087: * TRACE ! 12088: * ! 12089: S$TRA ENT ENTRY POINT ! 12090: BEQ 3(XS),=NULLS,STR03 JUMP IF FIRST ARGUMENT IS NULL ! 12091: MOV (XS)+,XR LOAD FOURTH ARGUMENT ! 12092: ZER XL TENTATIVELY SET ZERO POINTER ! 12093: BEQ XR,=NULLS,STR02 JUMP IF 4TH ARGUMENT IS NULL ! 12094: JSR GTNVR ELSE POINT TO VRBLK ! 12095: PPM STR01 JUMP IF NOT VARIABLE NAME ! 12096: MOV VRFNC(XR),XL ELSE LOAD FUNCTION POINTER ! 12097: BNE XL,=STNDF,STR02 JUMP IF FUNCTION IS DEFINED ! 12098: * ! 12099: * HERE FOR BAD FOURTH ARGUMENT ! 12100: * ! 12101: STR01 ERB 197,TRACE FOURTH ARG IS NOT FUNCTION NAME OR NULL ! 12102: * ! 12103: * HERE WITH FUNCTION POINTER IN XL ! 12104: * ! 12105: STR02 MOV (XS)+,XR LOAD THIRD ARGUMENT (TAG) ! 12106: ZER WB SET ZERO AS TRTYP VALUE FOR NOW ! 12107: JSR TRBLD BUILD TRBLK FOR TRACE CALL ! 12108: MOV XR,XL MOVE TRBLK POINTER FOR TRACE ! 12109: JSR TRACE CALL TRACE PROCEDURE ! 12110: ERR 198,TRACE FIRST ARGUMENT IS NOT APPROPRIATE NAME ! 12111: ERR 199,TRACE SECOND ARGUMENT IS NOT TRACE TYPE ! 12112: BRN EXNUL RETURN NULL ! 12113: * ! 12114: * HERE TO CALL SYSTEM TRACE TOGGLE ROUTINE ! 12115: * ! 12116: STR03 JSR SYSTT CALL IT ! 12117: ADD *NUM04,XS POP TRACE ARGUMENTS ! 12118: BRN EXNUL RETURN ! 12119: EJC ! 12120: * ! 12121: * TRIM ! 12122: * ! 12123: S$TRM ENT ENTRY POINT ! 12124: JSR GTSTG LOAD ARGUMENT AS STRING ! 12125: ERR 200,TRIM ARGUMENT IS NOT STRING ! 12126: BZE WA,EXNUL RETURN NULL IF ARGUMENT IS NULL ! 12127: MOV XR,XL COPY STRING POINTER ! 12128: CTB WA,SCHAR GET BLOCK LENGTH ! 12129: JSR ALLOC ALLOCATE COPY SAME SIZE ! 12130: MOV XR,WB SAVE POINTER TO COPY ! 12131: MVW COPY OLD STRING BLOCK TO NEW ! 12132: MOV WB,XR RESTORE PTR TO NEW BLOCK ! 12133: JSR TRIMR TRIM BLANKS (WB IS NON-ZERO) ! 12134: BRN EXIXR EXIT WITH RESULT IN XR ! 12135: EJC ! 12136: * ! 12137: * UNLOAD ! 12138: * ! 12139: S$UNL ENT ENTRY POINT ! 12140: MOV (XS)+,XR LOAD ARGUMENT ! 12141: JSR GTNVR POINT TO VRBLK ! 12142: ERR 201,UNLOAD ARGUMENT IS NOT NATURAL VARIABLE NAME ! 12143: MOV =STNDF,XL GET PTR TO UNDEFINED FUNCTION ! 12144: JSR DFFNC UNDEFINE NAMED FUNCTION ! 12145: BRN EXNUL RETURN NULL AS RESULT ! 12146: TTL S P I T B O L -- UTILITY PROCEDURES ! 12147: * ! 12148: * THE FOLLOWING SECTION CONTAINS PROCEDURES WHICH ARE ! 12149: * USED FOR VARIOUS PURPOSES THROUGHOUT THE SYSTEM. ! 12150: * ! 12151: * EACH PROCEDURE IS PRECEDED BY A DESCRIPTION OF THE ! 12152: * CALLING SEQUENCE. USUALLY THE ARGUMENTS ARE IN REGISTERS ! 12153: * BUT ARGUMENTS CAN ALSO OCCUR ON THE STACK AND AS ! 12154: * PARAMETERS ASSEMBLED AFTER THE JSR INSTRUCTION. ! 12155: * ! 12156: * THE FOLLOWING CONSIDERATIONS APPLY TO THESE DESCRIPTIONS. ! 12157: * ! 12158: * 1) THE STACK POINTER (XS) IS NOT CHANGED UNLESS THE ! 12159: * CHANGE IS EXPLICITLY DOCUMENTED IN THE CALL. ! 12160: * ! 12161: * 2) REGISTERS WHOSE ENTRY VALUES ARE NOT MENTIONED ! 12162: * MAY CONTAIN ANY VALUE EXCEPT THAT XL,XR MAY ONLY ! 12163: * CONTAIN PROPER (COLLECTABLE) POINTER VALUES. ! 12164: * THIS CONDITION ON XR MEANS THAT THE CALLED ROUTINE ! 12165: * MAY IF IT CHOOSES PRESERVE XR BY STACKING. ! 12166: * ! 12167: * 3) REGISTERS NOT MENTIONED ON EXIT CONTAIN THE SAME ! 12168: * VALUES AS THEY DID ON ENTRY EXCEPT THAT VALUES IN ! 12169: * XR,XL MAY HAVE BEEN RELOCATED BY THE COLLECTOR. ! 12170: * ! 12171: * 4) REGISTERS WHICH ARE DESTROYED ON EXIT MAY CONTAIN ! 12172: * ANY VALUE EXCEPT THAT VALUES IN XL,XR ARE PROPER ! 12173: * (COLLECTABLE) POINTERS. ! 12174: * ! 12175: * 5) THE CODE POINTER REGISTER POINTS TO THE CURRENT ! 12176: * CODE LOCATION ON ENTRY AND IS UNCHANGED ON EXIT. ! 12177: * ! 12178: * IN THE ABOVE DESCRIPTION, A COLLECTABLE POINTER IS ONE ! 12179: * WHICH EITHER POINTS OUTSIDE THE DYNAMIC REGION OR ! 12180: * POINTS TO THE START OF A BLOCK IN THE DYNAMIC REGION. ! 12181: * ! 12182: * IN THOSE CASES WHERE THE CALLING SEQUENCE CONTAINS ! 12183: * PARAMETERS WHICH ARE USED AS ALTERNATE RETURN POINTS, ! 12184: * THESE PARAMETERS MAY BE REPLACED BY ERROR CODES ! 12185: * ASSEMBLED WITH THE ERR INSTRUCTION. THIS WILL RESULT ! 12186: * IN THE POSTING OF THE ERROR IF THE RETURN IS TAKEN. ! 12187: * ! 12188: * THE PROCEDURES ALL HAVE NAMES CONSISTING OF FIVE LETTERS ! 12189: * AND ARE IN ALPHABETICAL ORDER BY THEIR NAMES. ! 12190: EJC ! 12191: * ! 12192: * ACESS - ACCESS VARIABLE VALUE WITH TRACE/INPUT CHECKS ! 12193: * ! 12194: * ACESS LOADS THE VALUE OF A VARIABLE. TRACE AND INPUT ! 12195: * ASSOCIATIONS ARE TESTED FOR AND EXECUTED AS REQUIRED. ! 12196: * ACESS ALSO HANDLES THE SPECIAL CASES OF PSEUDO-VARIABLES. ! 12197: * ! 12198: * (XL) VARIABLE NAME BASE ! 12199: * (WA) VARIABLE NAME OFFSET ! 12200: * JSR ACESS CALL TO ACCESS VALUE ! 12201: * PPM LOC TRANSFER LOC IF ACCESS FAILURE ! 12202: * (XR) VARIABLE VALUE ! 12203: * (WA,WB,WC) DESTROYED ! 12204: * (XL,RA) DESTROYED ! 12205: * ! 12206: * FAILURE CAN OCCUR IF AN INPUT ASSOCIATION CAUSES AN END ! 12207: * OF FILE CONDITION OR IF THE EVALUATION OF AN EXPRESSION ! 12208: * ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS. ! 12209: * ! 12210: ACESS PRC R,1 ENTRY POINT (RECURSIVE) ! 12211: MOV XL,XR COPY NAME BASE ! 12212: ADD WA,XR POINT TO VARIABLE LOCATION ! 12213: MOV (XR),XR LOAD VARIABLE VALUE ! 12214: * ! 12215: * LOOP HERE TO CHECK FOR SUCCESSIVE TRBLKS ! 12216: * ! 12217: ACS02 BNE (XR),=B$TRT,ACS18 JUMP IF NOT TRAPPED ! 12218: * ! 12219: * HERE IF TRAPPED ! 12220: * ! 12221: BEQ XR,=TRBKV,ACS12 JUMP IF KEYWORD VARIABLE ! 12222: BNE XR,=TRBEV,ACS05 JUMP IF NOT EXPRESSION VARIABLE ! 12223: * ! 12224: * HERE FOR EXPRESSION VARIABLE, EVALUATE VARIABLE ! 12225: * ! 12226: MOV EVEXP(XL),XR LOAD EXPRESSION POINTER ! 12227: ZER WB EVALUATE BY VALUE ! 12228: JSR EVALX EVALUATE EXPRESSION ! 12229: PPM ACS04 JUMP IF EVALUATION FAILURE ! 12230: BRN ACS02 CHECK VALUE FOR MORE TRBLKS ! 12231: EJC ! 12232: * ! 12233: * ACESS (CONTINUED) ! 12234: * ! 12235: * HERE ON READING END OF FILE ! 12236: * ! 12237: ACS03 ADD *NUM03,XS POP TRBLK PTR, NAME BASE AND OFFSET ! 12238: MOV XR,DNAMP POP UNUSED SCBLK ! 12239: * ! 12240: * MERGE HERE WHEN EVALUATION OF EXPRESSION FAILS ! 12241: * ! 12242: ACS04 EXI 1 TAKE ALTERNATE (FAILURE) RETURN ! 12243: * ! 12244: * HERE IF NOT KEYWORD OR EXPRESSION VARIABLE ! 12245: * ! 12246: ACS05 MOV TRTYP(XR),WB LOAD TRAP TYPE CODE ! 12247: BNZ WB,ACS10 JUMP IF NOT INPUT ASSOCIATION ! 12248: BZE KVINP,ACS09 IGNORE INPUT ASSOC IF INPUT IS OFF ! 12249: * ! 12250: * HERE FOR INPUT ASSOCIATION ! 12251: * ! 12252: MOV XL,-(XS) STACK NAME BASE ! 12253: MOV WA,-(XS) STACK NAME OFFSET ! 12254: MOV XR,-(XS) STACK TRBLK POINTER ! 12255: MOV TRFPT(XR),XL GET FILE CTRL BLK PTR OR ZERO ! 12256: BNZ XL,ACS06 JUMP IF NOT STANDARD INPUT FILE ! 12257: BEQ TRTER(XR),=V$TER,ACS21 JUMP IF TERMINAL ! 12258: * ! 12259: * HERE TO READ FROM STANDARD INPUT FILE ! 12260: * ! 12261: MOV CSWIN,WA LENGTH FOR READ BUFFER ! 12262: JSR ALOCS BUILD STRING OF APPROPRIATE LENGTH ! 12263: JSR SYSRD READ NEXT STANDARD INPUT IMAGE ! 12264: PPM ACS03 JUMP TO FAIL EXIT IF END OF FILE ! 12265: BRN ACS07 ELSE MERGE WITH OTHER FILE CASE ! 12266: * ! 12267: * HERE FOR INPUT FROM OTHER THAN STANDARD INPUT FILE ! 12268: * ! 12269: ACS06 MOV XL,WA FCBLK PTR ! 12270: JSR SYSIL GET INPUT RECORD MAX LENGTH (TO WA) ! 12271: JSR ALOCS ALLOCATE STRING OF CORRECT SIZE ! 12272: MOV XL,WA FCBLK PTR ! 12273: JSR SYSIN CALL SYSTEM INPUT ROUTINE ! 12274: PPM ACS03 JUMP TO FAIL EXIT IF END OF FILE ! 12275: PPM ACS22 ERROR ! 12276: PPM ACS23 ERROR ! 12277: EJC ! 12278: * ! 12279: * ACESS (CONTINUED) ! 12280: * ! 12281: * MERGE HERE AFTER OBTAINING INPUT RECORD ! 12282: * ! 12283: ACS07 MOV KVTRM,WB LOAD TRIM INDICATOR ! 12284: JSR TRIMR TRIM RECORD AS REQUIRED ! 12285: MOV XR,WB COPY RESULT POINTER ! 12286: MOV (XS),XR RELOAD POINTER TO TRBLK ! 12287: * ! 12288: * LOOP TO CHASE TO END OF TRBLK CHAIN AND STORE VALUE ! 12289: * ! 12290: ACS08 MOV XR,XL SAVE POINTER TO THIS TRBLK ! 12291: MOV TRNXT(XR),XR LOAD FORWARD POINTER ! 12292: BEQ (XR),=B$TRT,ACS08 LOOP IF THIS IS ANOTHER TRBLK ! 12293: MOV WB,TRNXT(XL) ELSE STORE RESULT AT END OF CHAIN ! 12294: MOV (XS)+,XR RESTORE INITIAL TRBLK POINTER ! 12295: MOV (XS)+,WA RESTORE NAME OFFSET ! 12296: MOV (XS)+,XL RESTORE NAME BASE POINTER ! 12297: * ! 12298: * COME HERE TO MOVE TO NEXT TRBLK ! 12299: * ! 12300: ACS09 MOV TRNXT(XR),XR LOAD FORWARD PTR TO NEXT VALUE ! 12301: BRN ACS02 BACK TO CHECK IF TRAPPED ! 12302: * ! 12303: * HERE TO CHECK FOR ACCESS TRACE TRBLK ! 12304: * ! 12305: ACS10 BNE WB,=TRTAC,ACS09 LOOP BACK IF NOT ACCESS TRACE ! 12306: BZE KVTRA,ACS09 IGNORE ACCESS TRACE IF TRACE OFF ! 12307: DCV KVTRA ELSE DECREMENT TRACE COUNT ! 12308: BZE TRFNC(XR),ACS11 JUMP IF PRINT TRACE ! 12309: EJC ! 12310: * ! 12311: * ACESS (CONTINUED) ! 12312: * ! 12313: * HERE FOR FULL FUNCTION TRACE ! 12314: * ! 12315: JSR TRXEQ CALL ROUTINE TO EXECUTE TRACE ! 12316: BRN ACS09 JUMP FOR NEXT TRBLK ! 12317: * ! 12318: * HERE FOR CASE OF PRINT TRACE ! 12319: * ! 12320: ACS11 JSR PRTSN PRINT STATEMENT NUMBER ! 12321: JSR PRTNV PRINT NAME = VALUE ! 12322: BRN ACS09 JUMP BACK FOR NEXT TRBLK ! 12323: * ! 12324: * HERE FOR KEYWORD VARIABLE ! 12325: * ! 12326: ACS12 MOV KVNUM(XL),XR LOAD KEYWORD NUMBER ! 12327: BGE XR,=K$V$$,ACS14 JUMP IF NOT ONE WORD VALUE ! 12328: MTI KVABE(XR) ELSE LOAD VALUE AS INTEGER ! 12329: * ! 12330: * COMMON EXIT WITH KEYWORD VALUE AS INTEGER IN (IA) ! 12331: * ! 12332: ACS13 JSR ICBLD BUILD ICBLK ! 12333: BRN ACS18 JUMP TO EXIT ! 12334: * ! 12335: * HERE IF NOT ONE WORD KEYWORD VALUE ! 12336: * ! 12337: ACS14 BGE XR,=K$S$$,ACS15 JUMP IF SPECIAL CASE ! 12338: SUB =K$V$$,XR ELSE GET OFFSET ! 12339: ADD =NDABO,XR POINT TO PATTERN VALUE ! 12340: BRN ACS18 JUMP TO EXIT ! 12341: * ! 12342: * HERE IF SPECIAL KEYWORD CASE ! 12343: * ! 12344: ACS15 MOV KVRTN,XL LOAD RTNTYPE IN CASE ! 12345: LDI KVSTL LOAD STLIMIT IN CASE ! 12346: SUB =K$S$$,XR GET CASE NUMBER ! 12347: BSW XR,5 SWITCH ON KEYWORD NUMBER ! 12348: IFF K$$AL,ACS16 JUMP IF ALPHABET ! 12349: IFF K$$RT,ACS17 RTNTYPE ! 12350: IFF K$$SC,ACS19 STCOUNT ! 12351: IFF K$$SL,ACS13 STLIMIT ! 12352: IFF K$$ET,ACS20 ERRTEXT ! 12353: ESW END SWITCH ON KEYWORD NUMBER ! 12354: EJC ! 12355: * ! 12356: * ACESS (CONTINUED) ! 12357: * ! 12358: * ALPHABET ! 12359: * ! 12360: ACS16 MOV KVALP,XL LOAD POINTER TO ALPHABET STRING ! 12361: * ! 12362: * RTNTYPE MERGES HERE ! 12363: * ! 12364: ACS17 MOV XL,XR COPY STRING PTR TO PROPER REG ! 12365: * ! 12366: * COMMON RETURN POINT ! 12367: * ! 12368: ACS18 EXI RETURN TO ACESS CALLER ! 12369: * ! 12370: * HERE FOR STCOUNT (IA HAS STLIMIT) ! 12371: * ! 12372: ACS19 SBI KVSTC STCOUNT = LIMIT - LEFT ! 12373: BRN ACS13 MERGE BACK WITH INTEGER RESULT ! 12374: * ! 12375: * ERRTEXT ! 12376: * ! 12377: ACS20 MOV R$ETX,XR GET ERRTEXT STRING ! 12378: BRN ACS18 MERGE WITH RESULT ! 12379: * ! 12380: * HERE TO READ A RECORD FROM TERMINAL ! 12381: * ! 12382: ACS21 MOV =RILEN,WA BUFFER LENGTH ! 12383: JSR ALOCS ALLOCATE BUFFER ! 12384: JSR SYSRI READ RECORD ! 12385: PPM ACS03 ENDFILE ! 12386: BRN ACS07 MERGE WITH RECORD READ ! 12387: * ! 12388: * ERROR RETURNS ! 12389: * ! 12390: ACS22 MOV XR,DNAMP POP UNUSED SCBLK ! 12391: ERB 202,INPUT FROM FILE CAUSED NON-RECOVERABLE ERROR ! 12392: * ! 12393: ACS23 MOV XR,DNAMP POP UNUSED SCBLK ! 12394: ERB 203,INPUT FILE RECORD HAS INCORRECT FORMAT ! 12395: ENP END PROCEDURE ACESS ! 12396: EJC ! 12397: * ! 12398: * ACOMP -- COMPARE TWO ARITHMETIC VALUES ! 12399: * ! 12400: * 1(XS) FIRST ARGUMENT ! 12401: * 0(XS) SECOND ARGUMENT ! 12402: * JSR ACOMP CALL TO COMPARE VALUES ! 12403: * PPM LOC TRANSFER LOC IF ARG1 IS NON-NUMERIC ! 12404: * PPM LOC TRANSFER LOC IF ARG2 IS NON-NUMERIC ! 12405: * PPM LOC TRANSFER LOC FOR ARG1 LT ARG2 ! 12406: * PPM LOC TRANSFER LOC FOR ARG1 EQ ARG2 ! 12407: * PPM LOC TRANSFER LOC FOR ARG1 GT ARG2 ! 12408: * (NORMAL RETURN IS NEVER GIVEN) ! 12409: * (WA,WB,WC,IA,RA) DESTROYED ! 12410: * (XL,XR) DESTROYED ! 12411: * ! 12412: ACOMP PRC N,5 ENTRY POINT ! 12413: JSR ARITH LOAD ARITHMETIC OPERANDS ! 12414: PPM ACMP7 JUMP IF FIRST ARG NON-NUMERIC ! 12415: PPM ACMP8 JUMP IF SECOND ARG NON-NUMERIC ! 12416: .IF .CNRA ! 12417: .ELSE ! 12418: PPM ACMP4 JUMP IF REAL ARGUMENTS ! 12419: .FI ! 12420: * ! 12421: * HERE FOR INTEGER ARGUMENTS ! 12422: * ! 12423: SBI ICVAL(XL) SUBTRACT TO COMPARE ! 12424: IOV ACMP3 JUMP IF OVERFLOW ! 12425: ILT ACMP5 ELSE JUMP IF ARG1 LT ARG2 ! 12426: IEQ ACMP2 JUMP IF ARG1 EQ ARG2 ! 12427: * ! 12428: * HERE IF ARG1 GT ARG2 ! 12429: * ! 12430: ACMP1 EXI 5 TAKE GT EXIT ! 12431: * ! 12432: * HERE IF ARG1 EQ ARG2 ! 12433: * ! 12434: ACMP2 EXI 4 TAKE EQ EXIT ! 12435: EJC ! 12436: * ! 12437: * ACOMP (CONTINUED) ! 12438: * ! 12439: * HERE FOR INTEGER OVERFLOW ON SUBTRACT ! 12440: * ! 12441: ACMP3 LDI ICVAL(XL) LOAD SECOND ARGUMENT ! 12442: ILT ACMP1 GT IF NEGATIVE ! 12443: BRN ACMP5 ELSE LT ! 12444: .IF .CNRA ! 12445: .ELSE ! 12446: * ! 12447: * HERE FOR REAL OPERANDS ! 12448: * ! 12449: ACMP4 SBR RCVAL(XL) SUBTRACT TO COMPARE ! 12450: ROV ACMP6 JUMP IF OVERFLOW ! 12451: RGT ACMP1 ELSE JUMP IF ARG1 GT ! 12452: REQ ACMP2 JUMP IF ARG1 EQ ARG2 ! 12453: .FI ! 12454: * ! 12455: * HERE IF ARG1 LT ARG2 ! 12456: * ! 12457: ACMP5 EXI 3 TAKE LT EXIT ! 12458: .IF .CNRA ! 12459: .ELSE ! 12460: * ! 12461: * HERE IF OVERFLOW ON REAL SUBTRACTION ! 12462: * ! 12463: ACMP6 LDR RCVAL(XL) RELOAD ARG2 ! 12464: RLT ACMP1 GT IF NEGATIVE ! 12465: BRN ACMP5 ELSE LT ! 12466: .FI ! 12467: * ! 12468: * HERE IF ARG1 NON-NUMERIC ! 12469: * ! 12470: ACMP7 EXI 1 TAKE ERROR EXIT ! 12471: * ! 12472: * HERE IF ARG2 NON-NUMERIC ! 12473: * ! 12474: ACMP8 EXI 2 TAKE ERROR EXIT ! 12475: ENP END PROCEDURE ACOMP ! 12476: EJC ! 12477: * ! 12478: * ALLOC ALLOCATE BLOCK OF DYNAMIC STORAGE ! 12479: * ! 12480: * (WA) LENGTH REQUIRED IN BYTES ! 12481: * JSR ALLOC CALL TO ALLOCATE BLOCK ! 12482: * (XR) POINTER TO ALLOCATED BLOCK ! 12483: * ! 12484: * A POSSIBLE ALTERNATIVE TO AOV .. AND FOLLOWING STMT IS - ! 12485: * MOV DNAME,XR . SUB WA,XR . BLO XR,DNAMP,ALOC2 . ! 12486: * MOV DNAMP,XR . ADD WA,XR ! 12487: * ! 12488: ALLOC PRC E,0 ENTRY POINT ! 12489: * ! 12490: * COMMON EXIT POINT ! 12491: * ! 12492: ALOC1 MOV DNAMP,XR POINT TO NEXT AVAILABLE LOC ! 12493: AOV WA,XR,ALOC2 POINT PAST ALLOCATED BLOCK ! 12494: BGT XR,DNAME,ALOC2 JUMP IF NOT ENOUGH ROOM ! 12495: MOV XR,DNAMP STORE NEW POINTER ! 12496: SUB WA,XR POINT BACK TO START OF ALLOCATED BK ! 12497: EXI RETURN TO CALLER ! 12498: * ! 12499: * HERE IF INSUFFICIENT ROOM, TRY A GARBAGE COLLECTION ! 12500: * ! 12501: ALOC2 MOV WB,ALLSV SAVE WB ! 12502: ZER WB SET NO UPWARD MOVE FOR GBCOL ! 12503: JSR GBCOL GARBAGE COLLECT ! 12504: * ! 12505: * SEE IF ROOM AFTER GBCOL OR SYSMM CALL ! 12506: * ! 12507: ALOC3 MOV DNAMP,XR POINT TO FIRST AVAILABLE LOC ! 12508: AOV WA,XR,ALC3A POINT PAST NEW BLOCK ! 12509: BLO XR,DNAME,ALOC4 JUMP IF THERE IS ROOM NOW ! 12510: * ! 12511: * FAILED AGAIN, SEE IF WE CAN GET MORE CORE ! 12512: * ! 12513: ALC3A JSR SYSMM TRY TO GET MORE MEMORY ! 12514: WTB XR CONVERT TO BAUS (SGD05) ! 12515: ADD XR,DNAME BUMP PTR BY AMOUNT OBTAINED ! 12516: BNZ XR,ALOC3 JUMP IF GOT MORE CORE ! 12517: ADD RSMEM,DNAME GET THE RESERVE MEMORY ! 12518: ZER RSMEM ONLY PERMISSIBLE ONCE ! 12519: ICV ERRFT FATAL ERROR ! 12520: ERB 204,MEMORY OVERFLOW ! 12521: EJC ! 12522: * ! 12523: * HERE AFTER SUCCESSFUL GARBAGE COLLECTION ! 12524: * ! 12525: ALOC4 STI ALLIA SAVE IA ! 12526: MOV DNAME,WB GET DYNAMIC END ADRS ! 12527: SUB DNAMP,WB COMPUTE FREE STORE ! 12528: BTW WB CONVERT BYTES TO WORDS ! 12529: MTI WB PUT FREE STORE IN IA ! 12530: MLI ALFSF MULTIPLY BY FREE STORE FACTOR ! 12531: IOV ALOC5 JUMP IF OVERFLOWED ! 12532: MOV DNAME,WB DYNAMIC END ADRS ! 12533: SUB DNAMB,WB COMPUTE TOTAL AMOUNT OF DYNAMIC ! 12534: BTW WB CONVERT TO WORDS ! 12535: MOV WB,ALDYN STORE IT ! 12536: SBI ALDYN SUBTRACT FROM SCALED UP FREE STORE ! 12537: IGT ALOC5 JUMP IF SUFFICIENT FREE STORE ! 12538: JSR SYSMM TRY TO GET MORE STORE ! 12539: WTB XR CONVERT TO BAUS (SGD05) ! 12540: ADD XR,DNAME ADJUST DYNAMIC END ADRS ! 12541: * ! 12542: * MERGE TO RESTORE IA AND WB ! 12543: * ! 12544: ALOC5 LDI ALLIA RECOVER IA ! 12545: MOV ALLSV,WB RESTORE WB ! 12546: BRN ALOC1 JUMP BACK TO EXIT ! 12547: ENP END PROCEDURE ALLOC ! 12548: EJC ! 12549: .IF .CNBF ! 12550: .ELSE ! 12551: * ! 12552: * ALOBF -- ALLOCATE BUFFER ! 12553: * ! 12554: * THIS ROUTINES ALLOCATES A NEW BUFFER. AS THE BFBLK ! 12555: * AND BCBLK COME IN PAIRS, BOTH ARE ALLOCATED HERE, ! 12556: * AND XR POINTS TO THE BCBLK ON RETURN. THE BFBLK ! 12557: * AND BCBLK ARE SET TO THE NULL BUFFER, AND THE IDVAL ! 12558: * IS ZERO ON RETURN. ! 12559: * ! 12560: * (WA) BUFFER SIZE IN CHARACTERS ! 12561: * JSR ALOBF CALL TO CREATE BUFFER ! 12562: * (XR) BCBLK PTR ! 12563: * (WA,WB) DESTROYED ! 12564: * ! 12565: ALOBF PRC E,0 ENTRY POINT ! 12566: MOV WA,WB HANG ONTO ALLOCATION SIZE ! 12567: CTB WA,BFSI$ GET TOTAL BLOCK SIZE ! 12568: BGE WA,MXLEN,ALB01 CHECK FOR MAXLEN EXCEEDED ! 12569: ADD *BCSI$,WA ADD IN ALLOCATION FOR BCBLK ! 12570: JSR ALLOC ALLOCATE FRAME ! 12571: MOV =B$BCT,(XR) SET TYPE ! 12572: ZER IDVAL(XR) NO ID YET ! 12573: ZER BCLEN(XR) NO DEFINED LENGTH ! 12574: MOV XL,WA SAVE XL ! 12575: MOV XR,XL COPY BCBLK PTR ! 12576: ADD *BCSI$,XL BIAS PAST PARTIALLY BUILT BCBLK ! 12577: MOV =B$BFT,(XL) SET BFBLK TYPE WORD ! 12578: MOV WB,BFALC(XL) SET ALLOCATED SIZE ! 12579: MOV XL,BCBUF(XR) SET POINTER IN BCBLK ! 12580: ZER BFCHR(XL) CLEAR FIRST WORD (NULL PAD) ! 12581: MOV WA,XL RESTORE ENTRY XL ! 12582: EXI RETURN TO CALLER ! 12583: * ! 12584: * HERE FOR MXLEN EXCEEDED ! 12585: * ! 12586: ALB01 ERB 274,REQUESTED BUFFER ALLOCATION EXCEEDS MXLEN ! 12587: ENP END PROCEDURE ALOBF ! 12588: EJC ! 12589: .FI ! 12590: * ! 12591: * ALOCS -- ALLOCATE STRING BLOCK ! 12592: * ! 12593: * ALOCS IS USED TO BUILD A FRAME FOR A STRING BLOCK INTO ! 12594: * WHICH THE ACTUAL CHARACTERS ARE PLACED BY THE CALLER. ! 12595: * ALL STRINGS ARE CREATED WITH A CALL TO ALOCS (THE ! 12596: * EXCEPTIONS OCCUR IN TRIMR AND S$RPL PROCEDURES). ! 12597: * ! 12598: * (WA) LENGTH OF STRING TO BE ALLOCATED ! 12599: * JSR ALOCS CALL TO ALLOCATE SCBLK ! 12600: * (XR) POINTER TO RESULTING SCBLK ! 12601: * (WA) DESTROYED ! 12602: * (WC) CHARACTER COUNT (ENTRY VALUE OF WA) ! 12603: * ! 12604: * THE RESULTING SCBLK HAS THE TYPE WORD AND THE LENGTH ! 12605: * FILLED IN AND THE LAST WORD IS CLEARED TO ZERO CHARACTERS ! 12606: * TO ENSURE CORRECT RIGHT PADDING OF THE FINAL WORD. ! 12607: * ! 12608: ALOCS PRC E,0 ENTRY POINT ! 12609: BGT WA,KVMXL,ALCS2 JUMP IF LENGTH EXCEEEDS MAXLENGTH ! 12610: MOV WA,WC ELSE COPY LENGTH ! 12611: CTB WA,SCSI$ COMPUTE LENGTH OF SCBLK IN BYTES ! 12612: MOV DNAMP,XR POINT TO NEXT AVAILABLE LOCATION ! 12613: AOV WA,XR,ALCS0 POINT PAST BLOCK ! 12614: BLO XR,DNAME,ALCS1 JUMP IF THERE IS ROOM ! 12615: * ! 12616: * INSUFFICIENT MEMORY ! 12617: * ! 12618: ALCS0 ZER XR ELSE CLEAR GARBAGE XR VALUE ! 12619: JSR ALLOC AND USE STANDARD ALLOCATOR ! 12620: ADD WA,XR POINT PAST END OF BLOCK TO MERGE ! 12621: * ! 12622: * MERGE HERE WITH XR POINTING BEYOND NEW BLOCK ! 12623: * ! 12624: ALCS1 MOV XR,DNAMP SET UPDATED STORAGE POINTER ! 12625: ZER -(XR) STORE ZERO CHARS IN LAST WORD ! 12626: DCA WA DECREMENT LENGTH ! 12627: SUB WA,XR POINT BACK TO START OF BLOCK ! 12628: MOV =B$SCL,(XR) SET TYPE WORD ! 12629: MOV WC,SCLEN(XR) STORE LENGTH IN CHARS ! 12630: EXI RETURN TO ALOCS CALLER ! 12631: * ! 12632: * COME HERE IF STRING IS TOO LONG ! 12633: * ! 12634: ALCS2 ERB 205,STRING LENGTH EXCEEDS VALUE OF MAXLNGTH KEYWORD ! 12635: ENP END PROCEDURE ALOCS ! 12636: EJC ! 12637: * ! 12638: * ALOST -- ALLOCATE SPACE IN STATIC REGION ! 12639: * ! 12640: * (WA) LENGTH REQUIRED IN BYTES ! 12641: * JSR ALOST CALL TO ALLOCATE SPACE ! 12642: * (XR) POINTER TO ALLOCATED BLOCK ! 12643: * (WB) DESTROYED ! 12644: * ! 12645: * NOTE THAT THE CODING ENSURES THAT THE RESULTING VALUE ! 12646: * OF STATE IS ALWAYS LESS THAN DNAMB. THIS FACT IS USED ! 12647: * IN TESTING A VARIABLE NAME FOR BEING IN THE STATIC REGION ! 12648: * ! 12649: ALOST PRC E,0 ENTRY POINT ! 12650: * ! 12651: * MERGE BACK HERE AFTER ALLOCATING NEW CHUNK ! 12652: * ! 12653: ALST1 MOV STATE,XR POINT TO CURRENT END OF AREA ! 12654: AOV WA,XR,ALST2 POINT BEYOND PROPOSED BLOCK ! 12655: BGE XR,DNAMB,ALST2 JUMP IF OVERLAP WITH DYNAMIC AREA ! 12656: MOV XR,STATE ELSE STORE NEW POINTER ! 12657: SUB WA,XR POINT BACK TO START OF BLOCK ! 12658: EXI RETURN TO ALOST CALLER ! 12659: * ! 12660: * HERE IF NO ROOM, PREPARE TO MOVE DYNAMIC STORAGE UP ! 12661: * ! 12662: ALST2 MOV WA,ALSTA SAVE WA ! 12663: BGE WA,*E$STS,ALST3 SKIP IF REQUESTED CHUNK IS LARGE ! 12664: MOV *E$STS,WA ELSE SET TO GET LARGE ENOUGH CHUNK ! 12665: * ! 12666: * HERE WITH AMOUNT TO MOVE UP IN WA ! 12667: * ! 12668: ALST3 JSR ALLOC ALLOCATE BLOCK TO ENSURE ROOM ! 12669: MOV XR,DNAMP AND DELETE IT ! 12670: MOV WA,WB COPY MOVE UP AMOUNT ! 12671: JSR GBCOL CALL GBCOL TO MOVE DYNAMIC AREA UP ! 12672: MOV ALSTA,WA RESTORE WA ! 12673: BRN ALST1 LOOP BACK TO TRY AGAIN ! 12674: ENP END PROCEDURE ALOST ! 12675: EJC ! 12676: .IF .CNBF ! 12677: .ELSE ! 12678: * ! 12679: * APNDB -- APPEND STRING TO BUFFER ! 12680: * ! 12681: * THIS ROUTINE IS USED BY BUFFER HANDLING ROUTINES TO ! 12682: * APPEND DATA TO AN EXISTING BFBLK. ! 12683: * ! 12684: * (XR) EXISTING BCBLK TO BE APPENDED ! 12685: * (XL) CONVERTABLE TO STRING ! 12686: * JSR APNDB CALL TO APPEND TO BUFFER ! 12687: * PPM LOC THREAD IF (XL) CANT BE CONVERTED ! 12688: * PPM LOC IF NOT ENOUGH ROOM ! 12689: * (WA,WB) DESTROYED ! 12690: * ! 12691: * IF MORE CHARACTERS ARE SPECIFIED THAN CAN BE INSERTED, ! 12692: * THEN NO ACTION IS TAKEN AND THE SECOND RETURN IS TAKEN. ! 12693: * ! 12694: APNDB PRC E,2 ENTRY POINT ! 12695: MOV BCLEN(XR),WA LOAD OFFSET TO INSERT ! 12696: ZER WB REPLACE SECTION IS NULL ! 12697: JSR INSBF CALL TO INSERT AT END ! 12698: PPM APN01 CONVERT ERROR ! 12699: PPM APN02 NO ROOM ! 12700: EXI RETURN TO CALLER ! 12701: * ! 12702: * HERE TO TAKE CONVERT FAILURE EXIT ! 12703: * ! 12704: APN01 EXI 1 RETURN TO CALLER ALTERNATE ! 12705: * ! 12706: * HERE FOR NO FIT EXIT ! 12707: * ! 12708: APN02 EXI 2 ALTERNATE EXIT TO CALLER ! 12709: ENP END PROCEDURE APNDB ! 12710: EJC ! 12711: .FI ! 12712: * ! 12713: * ARITH -- FETCH ARITHMETIC OPERANDS ! 12714: * ! 12715: * ARITH IS USED BY FUNCTIONS AND OPERATORS WHICH EXPECT ! 12716: * TWO NUMERIC ARGUMENTS (OPERANDS) WHICH MUST BOTH BE ! 12717: * INTEGER OR BOTH BE REAL. ARITH FETCHES TWO ARGUMENTS FROM ! 12718: * THE STACK AND PERFORMS ANY NECESSARY CONVERSIONS. ! 12719: * ! 12720: * 1(XS) FIRST ARGUMENT (LEFT OPERAND) ! 12721: * 0(XS) SECOND ARGUMENT (RIGHT OPERAND) ! 12722: * JSR ARITH CALL TO FETCH NUMERIC ARGUMENTS ! 12723: * PPM LOC TRANSFER LOC FOR OPND 1 NON-NUMERIC ! 12724: * PPM LOC TRANSFER LOC FOR OPND 2 NON-NUMERIC ! 12725: .IF .CNRA ! 12726: .ELSE ! 12727: * PPM LOC TRANSFER LOC FOR REAL OPERANDS ! 12728: .FI ! 12729: * ! 12730: * FOR INTEGER ARGS, CONTROL RETURNS PAST THE PARAMETERS ! 12731: * ! 12732: * (IA) LEFT OPERAND VALUE ! 12733: * (XR) PTR TO ICBLK FOR LEFT OPERAND ! 12734: * (XL) PTR TO ICBLK FOR RIGHT OPERAND ! 12735: * (XS) POPPED TWICE ! 12736: * (WA,WB,RA) DESTROYED ! 12737: .IF .CNRA ! 12738: .ELSE ! 12739: * ! 12740: * FOR REAL ARGUMENTS, CONTROL RETURNS TO THE LOCATION ! 12741: * SPECIFIED BY THE THIRD PARAMETER. ! 12742: * ! 12743: * (RA) LEFT OPERAND VALUE ! 12744: * (XR) PTR TO RCBLK FOR LEFT OPERAND ! 12745: * (XL) PTR TO RCBLK FOR RIGHT OPERAND ! 12746: * (WA,WB,WC) DESTROYED ! 12747: * (XS) POPPED TWICE ! 12748: .FI ! 12749: EJC ! 12750: * ! 12751: * ARITH (CONTINUED) ! 12752: * ! 12753: * ENTRY POINT ! 12754: * ! 12755: .IF .CNRA ! 12756: ARITH PRC N,2 ENTRY POINT ! 12757: .ELSE ! 12758: ARITH PRC N,3 ENTRY POINT ! 12759: .FI ! 12760: MOV (XS)+,XL LOAD RIGHT OPERAND ! 12761: MOV (XS)+,XR LOAD LEFT OPERAND ! 12762: MOV (XL),WA GET RIGHT OPERAND TYPE WORD ! 12763: BEQ WA,=B$ICL,ARTH1 JUMP IF INTEGER ! 12764: .IF .CNRA ! 12765: .ELSE ! 12766: BEQ WA,=B$RCL,ARTH4 JUMP IF REAL ! 12767: .FI ! 12768: MOV XR,-(XS) ELSE REPLACE LEFT ARG ON STACK ! 12769: MOV XL,XR COPY LEFT ARG POINTER ! 12770: JSR GTNUM CONVERT TO NUMERIC ! 12771: PPM ARTH6 JUMP IF UNCONVERTIBLE ! 12772: MOV XR,XL ELSE COPY CONVERTED RESULT ! 12773: MOV (XL),WA GET RIGHT OPERAND TYPE WORD ! 12774: MOV (XS)+,XR RELOAD LEFT ARGUMENT ! 12775: .IF .CNRA ! 12776: .ELSE ! 12777: BEQ WA,=B$RCL,ARTH4 JUMP IF RIGHT ARG IS REAL ! 12778: .FI ! 12779: * ! 12780: * HERE IF RIGHT ARG IS AN INTEGER ! 12781: * ! 12782: ARTH1 BNE (XR),=B$ICL,ARTH3 JUMP IF LEFT ARG NOT INTEGER ! 12783: * ! 12784: * EXIT FOR INTEGER CASE ! 12785: * ! 12786: ARTH2 LDI ICVAL(XR) LOAD LEFT OPERAND VALUE ! 12787: EXI RETURN TO ARITH CALLER ! 12788: * ! 12789: * HERE FOR RIGHT OPERAND INTEGER, LEFT OPERAND NOT ! 12790: * ! 12791: ARTH3 JSR GTNUM CONVERT LEFT ARG TO NUMERIC ! 12792: PPM ARTH7 JUMP IF NOT CONVERTIBLE ! 12793: BEQ WA,=B$ICL,ARTH2 JUMP BACK IF INTEGER-INTEGER ! 12794: .IF .CNRA ! 12795: .ELSE ! 12796: * ! 12797: * HERE WE MUST CONVERT REAL-INTEGER TO REAL-REAL ! 12798: * ! 12799: MOV XR,-(XS) PUT LEFT ARG BACK ON STACK ! 12800: LDI ICVAL(XL) LOAD RIGHT ARGUMENT VALUE ! 12801: ITR CONVERT TO REAL ! 12802: JSR RCBLD GET REAL BLOCK FOR RIGHT ARG, MERGE ! 12803: MOV XR,XL COPY RIGHT ARG PTR ! 12804: MOV (XS)+,XR LOAD LEFT ARGUMENT ! 12805: BRN ARTH5 MERGE FOR REAL-REAL CASE ! 12806: EJC ! 12807: * ! 12808: * ARITH (CONTINUED) ! 12809: * ! 12810: * HERE IF RIGHT ARGUMENT IS REAL ! 12811: * ! 12812: ARTH4 BEQ (XR),=B$RCL,ARTH5 JUMP IF LEFT ARG REAL ! 12813: JSR GTREA ELSE CONVERT TO REAL ! 12814: PPM ARTH7 ERROR IF UNCONVERTIBLE ! 12815: * ! 12816: * HERE FOR REAL-REAL ! 12817: * ! 12818: ARTH5 LDR RCVAL(XR) LOAD LEFT OPERAND VALUE ! 12819: EXI 3 TAKE REAL-REAL EXIT ! 12820: .FI ! 12821: * ! 12822: * HERE FOR ERROR CONVERTING RIGHT ARGUMENT ! 12823: * ! 12824: ARTH6 ICA XS POP UNWANTED LEFT ARG ! 12825: EXI 2 TAKE APPROPRIATE ERROR EXIT ! 12826: * ! 12827: * HERE FOR ERROR CONVERTING LEFT OPERAND ! 12828: * ! 12829: ARTH7 EXI 1 TAKE APPROPRIATE ERROR RETURN ! 12830: ENP END PROCEDURE ARITH ! 12831: EJC ! 12832: * ! 12833: * ASIGN -- PERFORM ASSIGNMENT ! 12834: * ! 12835: * ASIGN PERFORMS THE ASSIGNMENT OF A VALUE TO A VARIABLE ! 12836: * WITH APPROPRIATE CHECKS FOR OUTPUT ASSOCIATIONS AND ! 12837: * VALUE TRACE ASSOCIATIONS WHICH ARE EXECUTED AS REQUIRED. ! 12838: * ASIGN ALSO HANDLES THE SPECIAL CASES OF ASSIGNMENT TO ! 12839: * PATTERN AND EXPRESSION VARIABLES. ! 12840: * ! 12841: * (WB) VALUE TO BE ASSIGNED ! 12842: * (XL) BASE POINTER FOR VARIABLE ! 12843: * (WA) OFFSET FOR VARIABLE ! 12844: * JSR ASIGN CALL TO ASSIGN VALUE TO VARIABLE ! 12845: * PPM LOC TRANSFER LOC FOR FAILURE ! 12846: * (XR,XL,WA,WB,WC) DESTROYED ! 12847: * (RA) DESTROYED ! 12848: * ! 12849: * FAILURE OCCURS IF THE EVALUATION OF AN EXPRESSION ! 12850: * ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS. ! 12851: * ! 12852: ASIGN PRC R,1 ENTRY POINT (RECURSIVE) ! 12853: * ! 12854: * MERGE BACK HERE TO ASSIGN RESULT TO EXPRESSION VARIABLE. ! 12855: * ! 12856: ASG01 ADD WA,XL POINT TO VARIABLE VALUE ! 12857: MOV (XL),XR LOAD VARIABLE VALUE ! 12858: BEQ (XR),=B$TRT,ASG02 JUMP IF TRAPPED ! 12859: MOV WB,(XL) ELSE PERFORM ASSIGNMENT ! 12860: ZER XL CLEAR GARBAGE VALUE IN XL ! 12861: EXI AND RETURN TO ASIGN CALLER ! 12862: * ! 12863: * HERE IF VALUE IS TRAPPED ! 12864: * ! 12865: ASG02 SUB WA,XL RESTORE NAME BASE ! 12866: BEQ XR,=TRBKV,ASG14 JUMP IF KEYWORD VARIABLE ! 12867: BNE XR,=TRBEV,ASG04 JUMP IF NOT EXPRESSION VARIABLE ! 12868: * ! 12869: * HERE FOR ASSIGNMENT TO EXPRESSION VARIABLE ! 12870: * ! 12871: MOV EVEXP(XL),XR POINT TO EXPRESSION ! 12872: MOV WB,-(XS) STORE VALUE TO ASSIGN ON STACK ! 12873: MOV =NUM01,WB SET FOR EVALUATION BY NAME ! 12874: JSR EVALX EVALUATE EXPRESSION BY NAME ! 12875: PPM ASG03 JUMP IF EVALUATION FAILS ! 12876: MOV (XS)+,WB ELSE RELOAD VALUE TO ASSIGN ! 12877: BRN ASG01 LOOP BACK TO PERFORM ASSIGNMENT ! 12878: EJC ! 12879: * ! 12880: * ASIGN (CONTINUED) ! 12881: * ! 12882: * HERE FOR FAILURE DURING EXPRESSION EVALUATION ! 12883: * ! 12884: ASG03 ICA XS REMOVE STACKED VALUE ENTRY ! 12885: EXI 1 TAKE FAILURE EXIT ! 12886: * ! 12887: * HERE IF NOT KEYWORD OR EXPRESSION VARIABLE ! 12888: * ! 12889: ASG04 MOV XR,-(XS) SAVE PTR TO FIRST TRBLK ! 12890: * ! 12891: * LOOP TO CHASE DOWN TRBLK CHAIN AND ASSIGN VALUE AT END ! 12892: * ! 12893: ASG05 MOV XR,WC SAVE PTR TO THIS TRBLK ! 12894: MOV TRNXT(XR),XR POINT TO NEXT TRBLK ! 12895: BEQ (XR),=B$TRT,ASG05 LOOP BACK IF ANOTHER TRBLK ! 12896: MOV WC,XR ELSE POINT BACK TO LAST TRBLK ! 12897: MOV WB,TRVAL(XR) STORE VALUE AT END OF CHAIN ! 12898: MOV (XS)+,XR RESTORE PTR TO FIRST TRBLK ! 12899: * ! 12900: * LOOP TO PROCESS TRBLK ENTRIES ON CHAIN ! 12901: * ! 12902: ASG06 MOV TRTYP(XR),WB LOAD TYPE CODE OF TRBLK ! 12903: BEQ WB,=TRTVL,ASG08 JUMP IF VALUE TRACE ! 12904: BEQ WB,=TRTOU,ASG10 JUMP IF OUTPUT ASSOCIATION ! 12905: * ! 12906: * HERE TO MOVE TO NEXT TRBLK ON CHAIN ! 12907: * ! 12908: ASG07 MOV TRNXT(XR),XR POINT TO NEXT TRBLK ON CHAIN ! 12909: BEQ (XR),=B$TRT,ASG06 LOOP BACK IF ANOTHER TRBLK ! 12910: EXI ELSE END OF CHAIN, RETURN TO CALLER ! 12911: * ! 12912: * HERE TO PROCESS VALUE TRACE ! 12913: * ! 12914: ASG08 BZE KVTRA,ASG07 IGNORE VALUE TRACE IF TRACE OFF ! 12915: DCV KVTRA ELSE DECREMENT TRACE COUNT ! 12916: BZE TRFNC(XR),ASG09 JUMP IF PRINT TRACE ! 12917: JSR TRXEQ ELSE EXECUTE FUNCTION TRACE ! 12918: BRN ASG07 AND LOOP BACK ! 12919: EJC ! 12920: * ! 12921: * ASIGN (CONTINUED) ! 12922: * ! 12923: * HERE FOR PRINT TRACE ! 12924: * ! 12925: ASG09 JSR PRTSN PRINT STATEMENT NUMBER ! 12926: JSR PRTNV PRINT NAME = VALUE ! 12927: BRN ASG07 LOOP BACK FOR NEXT TRBLK ! 12928: * ! 12929: * HERE FOR OUTPUT ASSOCIATION ! 12930: * ! 12931: ASG10 BZE KVOUP,ASG07 IGNORE OUTPUT ASSOC IF OUTPUT OFF ! 12932: MOV XR,XL ELSE COPY TRBLK POINTER ! 12933: MOV TRVAL(WC),-(XS) STACK VALUE TO OUTPUT (SGD01) ! 12934: JSR GTSTG CONVERT TO STRING ! 12935: PPM ASG12 GET DATATYPE NAME IF UNCONVERTIBLE ! 12936: * ! 12937: * MERGE WITH STRING FOR OUTPUT ! 12938: * ! 12939: ASG11 MOV TRFPT(XL),WA FCBLK PTR ! 12940: BZE WA,ASG13 JUMP IF STANDARD OUTPUT FILE ! 12941: * ! 12942: * HERE FOR OUTPUT TO NON-STANDARD OUTPUT FILE ! 12943: * ! 12944: JSR SYSOU CALL SYSTEM OUTPUT ROUTINE ! 12945: ERR 206,OUTPUT CAUSED FILE OVERFLOW ! 12946: ERR 207,OUTPUT CAUSED NON-RECOVERABLE ERROR ! 12947: EXI ELSE ALL DONE, RETURN TO CALLER ! 12948: * ! 12949: * IF NOT PRINTABLE, GET DATATYPE NAME INSTEAD ! 12950: * ! 12951: ASG12 JSR DTYPE CALL DATATYPE ROUTINE ! 12952: BRN ASG11 MERGE ! 12953: * ! 12954: * HERE TO PRINT A STRING ON THE PRINTER ! 12955: * ! 12956: ASG13 JSR PRTST PRINT STRING VALUE ! 12957: BEQ TRTER(XL),=V$TER,ASG20 JUMP IF TERMINAL OUTPUT ! 12958: JSR PRTNL END OF LINE ! 12959: EXI RETURN TO CALLER ! 12960: EJC ! 12961: * ! 12962: * ASIGN (CONTINUED) ! 12963: * ! 12964: * HERE FOR KEYWORD ASSIGNMENT ! 12965: * ! 12966: ASG14 MOV KVNUM(XL),XL LOAD KEYWORD NUMBER ! 12967: BEQ XL,=K$ETX,ASG19 JUMP IF ERRTEXT ! 12968: MOV WB,XR COPY VALUE TO BE ASSIGNED ! 12969: JSR GTINT CONVERT TO INTEGER ! 12970: ERR 208,KEYWORD VALUE ASSIGNED IS NOT INTEGER ! 12971: LDI ICVAL(XR) ELSE LOAD VALUE ! 12972: BEQ XL,=K$STL,ASG16 JUMP IF SPECIAL CASE OF STLIMIT ! 12973: MFI WA,ASG18 ELSE GET ADDR INTEGER, TEST OVFLOW ! 12974: BGE WA,MXLEN,ASG18 FAIL IF TOO LARGE ! 12975: BEQ XL,=K$ERT,ASG17 JUMP IF SPECIAL CASE OF ERRTYPE ! 12976: .IF .CNPF ! 12977: .ELSE ! 12978: BEQ XL,=K$PFL,ASG21 JUMP IF SPECIAL CASE OF PROFILE ! 12979: .FI ! 12980: BLT XL,=K$P$$,ASG15 JUMP UNLESS PROTECTED ! 12981: ERB 209,KEYWORD IN ASSIGNMENT IS PROTECTED ! 12982: * ! 12983: * HERE TO DO ASSIGNMENT IF NOT PROTECTED ! 12984: * ! 12985: ASG15 MOV WA,KVABE(XL) STORE NEW VALUE ! 12986: EXI RETURN TO ASIGN CALLER ! 12987: * ! 12988: * HERE FOR SPECIAL CASE OF STLIMIT ! 12989: * ! 12990: * SINCE STCOUNT IS MAINTAINED AS (STLIMIT-STCOUNT) ! 12991: * IT IS ALSO NECESSARY TO MODIFY STCOUNT APPROPRIATELY. ! 12992: * ! 12993: ASG16 SBI KVSTL SUBTRACT OLD LIMIT ! 12994: ADI KVSTC ADD OLD COUNTER ! 12995: STI KVSTC STORE NEW COUNTER VALUE ! 12996: LDI ICVAL(XR) RELOAD NEW LIMIT VALUE ! 12997: STI KVSTL STORE NEW LIMIT VALUE ! 12998: EXI RETURN TO ASIGN CALLER ! 12999: * ! 13000: * HERE FOR SPECIAL CASE OF ERRTYPE ! 13001: * ! 13002: ASG17 BLE WA,=NINI9,ERROR OK TO SIGNAL IF IN RANGE ! 13003: * ! 13004: * HERE IF VALUE ASSIGNED IS OUT OF RANGE ! 13005: * ! 13006: ASG18 ERB 210,KEYWORD VALUE ASSIGNED IS NEGATIVE OR TOO LARGE ! 13007: * ! 13008: * HERE FOR SPECIAL CASE OF ERRTEXT ! 13009: * ! 13010: ASG19 MOV WB,-(XS) STACK VALUE ! 13011: JSR GTSTG CONVERT TO STRING ! 13012: ERR 211,VALUE ASSIGNED TO KEYWORD ERRTEXT NOT A STRING ! 13013: MOV XR,R$ETX MAKE ASSIGNMENT ! 13014: EXI RETURN TO CALLER ! 13015: * ! 13016: * PRINT STRING TO TERMINAL ! 13017: * ! 13018: ASG20 JSR PRTTR PRINT ! 13019: EXI RETURN ! 13020: * ! 13021: .IF .CNPF ! 13022: .ELSE ! 13023: * HERE FOR KEYWORD PROFILE ! 13024: * ! 13025: ASG21 BGT WA,=NUM02,ASG18 MOAN IF NOT 0,1, OR 2 ! 13026: BZE WA,ASG15 JUST ASSIGN IF ZERO ! 13027: BZE PFDMP,ASG22 BRANCH IF FIRST ASSIGNMENT ! 13028: BEQ WA,PFDMP,ASG23 ALSO IF SAME VALUE AS BEFORE ! 13029: ERB 268,INCONSISTENT VALUE ASSIGNED TO KEYWORD PROFILE ! 13030: * ! 13031: ASG22 MOV WA,PFDMP NOTE VALUE ON FIRST ASSIGNMENT ! 13032: ASG23 JSR SYSTM GET THE TIME ! 13033: STI PFSTM FUDGE SOME KIND OF START TIME ! 13034: BRN ASG15 AND GO ASSIGN ! 13035: .FI ! 13036: ENP END PROCEDURE ASIGN ! 13037: EJC ! 13038: * ! 13039: * ASINP -- ASSIGN DURING PATTERN MATCH ! 13040: * ! 13041: * ASINP IS LIKE ASIGN AND HAS A SIMILAR CALLING SEQUENCE ! 13042: * AND EFFECT. THE DIFFERENCE IS THAT THE GLOBAL PATTERN ! 13043: * VARIABLES ARE SAVED AND RESTORED IF REQUIRED. ! 13044: * ! 13045: * (XL) BASE POINTER FOR VARIABLE ! 13046: * (WA) OFFSET FOR VARIABLE ! 13047: * (WB) VALUE TO BE ASSIGNED ! 13048: * JSR ASINP CALL TO ASSIGN VALUE TO VARIABLE ! 13049: * PPM LOC TRANSFER LOC IF FAILURE ! 13050: * (XR,XL) DESTROYED ! 13051: * (WA,WB,WC,RA) DESTROYED ! 13052: * ! 13053: ASINP PRC R,1 ENTRY POINT, RECURSIVE ! 13054: ADD WA,XL POINT TO VARIABLE ! 13055: MOV (XL),XR LOAD CURRENT CONTENTS ! 13056: BEQ (XR),=B$TRT,ASNP1 JUMP IF TRAPPED ! 13057: MOV WB,(XL) ELSE PERFORM ASSIGNMENT ! 13058: ZER XL CLEAR GARBAGE VALUE IN XL ! 13059: EXI RETURN TO ASINP CALLER ! 13060: * ! 13061: * HERE IF VARIABLE IS TRAPPED ! 13062: * ! 13063: ASNP1 SUB WA,XL RESTORE BASE POINTER ! 13064: MOV PMSSL,-(XS) STACK SUBJECT STRING LENGTH ! 13065: MOV PMHBS,-(XS) STACK HISTORY STACK BASE PTR ! 13066: MOV R$PMS,-(XS) STACK SUBJECT STRING POINTER ! 13067: MOV PMDFL,-(XS) STACK DOT FLAG ! 13068: JSR ASIGN CALL FULL-BLOWN ASSIGNMENT ROUTINE ! 13069: PPM ASNP2 JUMP IF FAILURE ! 13070: MOV (XS)+,PMDFL RESTORE DOT FLAG ! 13071: MOV (XS)+,R$PMS RESTORE SUBJECT STRING POINTER ! 13072: MOV (XS)+,PMHBS RESTORE HISTORY STACK BASE POINTER ! 13073: MOV (XS)+,PMSSL RESTORE SUBJECT STRING LENGTH ! 13074: EXI RETURN TO ASINP CALLER ! 13075: * ! 13076: * HERE IF FAILURE IN ASIGN CALL ! 13077: * ! 13078: ASNP2 MOV (XS)+,PMDFL RESTORE DOT FLAG ! 13079: MOV (XS)+,R$PMS RESTORE SUBJECT STRING POINTER ! 13080: MOV (XS)+,PMHBS RESTORE HISTORY STACK BASE POINTER ! 13081: MOV (XS)+,PMSSL RESTORE SUBJECT STRING LENGTH ! 13082: EXI 1 TAKE FAILURE EXIT ! 13083: ENP END PROCEDURE ASINP ! 13084: EJC ! 13085: * ! 13086: * BLKLN -- DETERMINE LENGTH OF BLOCK ! 13087: * ! 13088: * BLKLN DETERMINES THE LENGTH OF A BLOCK IN DYNAMIC STORE. ! 13089: * ! 13090: * (WA) FIRST WORD OF BLOCK ! 13091: * (XR) POINTER TO BLOCK ! 13092: * JSR BLKLN CALL TO GET BLOCK LENGTH ! 13093: * (WA) LENGTH OF BLOCK IN BYTES ! 13094: * (XL) DESTROYED ! 13095: * ! 13096: * BLKLN IS USED BY THE GARBAGE COLLECTOR AND IS NOT ! 13097: * PERMITTED TO CALL GBCOL DIRECTLY OR INDIRECTLY. ! 13098: * ! 13099: * THE FIRST WORD STORED IN THE BLOCK (I.E. AT XR) MAY ! 13100: * BE ANYTHING, BUT THE CONTENTS OF WA MUST BE CORRECT. ! 13101: * ! 13102: BLKLN PRC E,0 ENTRY POINT ! 13103: MOV WA,XL COPY FIRST WORD ! 13104: LEI XL GET ENTRY ID (BL$XX) ! 13105: BSW XL,BL$$$,BLN00 SWITCH ON BLOCK TYPE ! 13106: IFF BL$AR,BLN01 ARBLK ! 13107: .IF .CNBF ! 13108: .ELSE ! 13109: IFF BL$BC,BLN04 BCBLK ! 13110: IFF BL$BF,BLN11 BFBLK ! 13111: .FI ! 13112: IFF BL$CD,BLN01 CDBLK ! 13113: IFF BL$DF,BLN01 DFBLK ! 13114: IFF BL$EF,BLN01 EFBLK ! 13115: IFF BL$EX,BLN01 EXBLK ! 13116: IFF BL$PF,BLN01 PFBLK ! 13117: IFF BL$TB,BLN01 TBBLK ! 13118: IFF BL$VC,BLN01 VCBLK ! 13119: IFF BL$EV,BLN03 EVBLK ! 13120: IFF BL$KV,BLN03 KVBLK ! 13121: IFF BL$P0,BLN02 P0BLK ! 13122: IFF BL$SE,BLN02 SEBLK ! 13123: IFF BL$NM,BLN03 NMBLK ! 13124: IFF BL$P1,BLN03 P1BLK ! 13125: IFF BL$P2,BLN04 P2BLK ! 13126: IFF BL$TE,BLN04 TEBLK ! 13127: IFF BL$FF,BLN05 FFBLK ! 13128: IFF BL$TR,BLN05 TRBLK ! 13129: IFF BL$CT,BLN06 CTBLK ! 13130: IFF BL$IC,BLN07 ICBLK ! 13131: IFF BL$PD,BLN08 PDBLK ! 13132: .IF .CNRA ! 13133: .ELSE ! 13134: IFF BL$RC,BLN09 RCBLK ! 13135: .FI ! 13136: IFF BL$SC,BLN10 SCBLK ! 13137: ESW END OF JUMP TABLE ON BLOCK TYPE ! 13138: EJC ! 13139: * ! 13140: * BLKLN (CONTINUED) ! 13141: * ! 13142: * HERE FOR BLOCKS WITH LENGTH IN SECOND WORD ! 13143: * ! 13144: BLN00 MOV 1(XR),WA LOAD LENGTH ! 13145: EXI RETURN TO BLKLN CALLER ! 13146: * ! 13147: * HERE FOR LENGTH IN THIRD WORD (AR,CD,DF,EF,EX,PF,TB,VC) ! 13148: * ! 13149: BLN01 MOV 2(XR),WA LOAD LENGTH FROM THIRD WORD ! 13150: EXI RETURN TO BLKLN CALLER ! 13151: * ! 13152: * HERE FOR TWO WORD BLOCKS (P0,SE) ! 13153: * ! 13154: BLN02 MOV *NUM02,WA LOAD LENGTH (TWO WORDS) ! 13155: EXI RETURN TO BLKLN CALLER ! 13156: * ! 13157: * HERE FOR THREE WORD BLOCKS (NM,P1,EV,KV) ! 13158: * ! 13159: BLN03 MOV *NUM03,WA LOAD LENGTH (THREE WORDS) ! 13160: EXI RETURN TO BLKLN CALLER ! 13161: * ! 13162: * HERE FOR FOUR WORD BLOCKS (P2,TE,BC) ! 13163: * ! 13164: BLN04 MOV *NUM04,WA LOAD LENGTH (FOUR WORDS) ! 13165: EXI RETURN TO BLKLN CALLER ! 13166: * ! 13167: * HERE FOR FIVE WORD BLOCKS (FF,TR) ! 13168: * ! 13169: BLN05 MOV *NUM05,WA LOAD LENGTH ! 13170: EXI RETURN TO BLKLN CALLER ! 13171: EJC ! 13172: * ! 13173: * BLKLN (CONTINUED) ! 13174: * ! 13175: * HERE FOR CTBLK ! 13176: * ! 13177: BLN06 MOV *CTSI$,WA SET SIZE OF CTBLK ! 13178: EXI RETURN TO BLKLN CALLER ! 13179: * ! 13180: * HERE FOR ICBLK ! 13181: * ! 13182: BLN07 MOV *ICSI$,WA SET SIZE OF ICBLK ! 13183: EXI RETURN TO BLKLN CALLER ! 13184: * ! 13185: * HERE FOR PDBLK ! 13186: * ! 13187: BLN08 MOV PDDFP(XR),XL POINT TO DFBLK ! 13188: MOV DFPDL(XL),WA LOAD PDBLK LENGTH FROM DFBLK ! 13189: EXI RETURN TO BLKLN CALLER ! 13190: .IF .CNRA ! 13191: .ELSE ! 13192: * ! 13193: * HERE FOR RCBLK ! 13194: * ! 13195: BLN09 MOV *RCSI$,WA SET SIZE OF RCBLK ! 13196: EXI RETURN TO BLKLN CALLER ! 13197: .FI ! 13198: * ! 13199: * HERE FOR SCBLK ! 13200: * ! 13201: BLN10 MOV SCLEN(XR),WA LOAD LENGTH IN CHARACTERS ! 13202: CTB WA,SCSI$ CALCULATE LENGTH IN BYTES ! 13203: EXI RETURN TO BLKLN CALLER ! 13204: .IF .CNBF ! 13205: .ELSE ! 13206: * ! 13207: * HERE FOR BFBLK ! 13208: * ! 13209: BLN11 MOV BFALC(XR),WA GET ALLOCATION IN BYTES ! 13210: CTB WA,BFSI$ CALCULATE LENGTH IN BYTES ! 13211: EXI RETURN TO BLKLN CALLER ! 13212: .FI ! 13213: ENP END PROCEDURE BLKLN ! 13214: EJC ! 13215: * ! 13216: * COPYB -- COPY A BLOCK ! 13217: * ! 13218: * (XS) BLOCK TO BE COPIED ! 13219: * JSR COPYB CALL TO COPY BLOCK ! 13220: * PPM LOC RETURN IF BLOCK HAS NO IDVAL FIELD ! 13221: * NORMAL RETURN IF IDVAL FIELD ! 13222: * (XR) COPY OF BLOCK ! 13223: * (XS) POPPED ! 13224: * (XL,WA,WB,WC) DESTROYED ! 13225: * ! 13226: COPYB PRC N,1 ENTRY POINT ! 13227: MOV (XS),XR LOAD ARGUMENT ! 13228: BEQ XR,=NULLS,COP10 RETURN ARGUMENT IF IT IS NULL ! 13229: MOV (XR),WA ELSE LOAD TYPE WORD ! 13230: MOV WA,WB COPY TYPE WORD ! 13231: JSR BLKLN GET LENGTH OF ARGUMENT BLOCK ! 13232: MOV XR,XL COPY POINTER ! 13233: JSR ALLOC ALLOCATE BLOCK OF SAME SIZE ! 13234: MOV XR,(XS) STORE POINTER TO COPY ! 13235: MVW COPY CONTENTS OF OLD BLOCK TO NEW ! 13236: MOV (XS),XR RELOAD POINTER TO START OF COPY ! 13237: BEQ WB,=B$TBT,COP05 JUMP IF TABLE ! 13238: BEQ WB,=B$VCT,COP01 JUMP IF VECTOR ! 13239: BEQ WB,=B$PDT,COP01 JUMP IF PROGRAM DEFINED ! 13240: .IF .CNBF ! 13241: .ELSE ! 13242: BEQ WB,=B$BCT,COP11 JUMP IF BUFFER ! 13243: .FI ! 13244: BNE WB,=B$ART,COP10 RETURN COPY IF NOT ARRAY ! 13245: * ! 13246: * HERE FOR ARRAY (ARBLK) ! 13247: * ! 13248: ADD AROFS(XR),XR POINT TO PROTOTYPE FIELD ! 13249: BRN COP02 JUMP TO MERGE ! 13250: * ! 13251: * HERE FOR VECTOR, PROGRAM DEFINED ! 13252: * ! 13253: COP01 ADD *PDFLD,XR POINT TO PDFLD = VCVLS ! 13254: * ! 13255: * MERGE HERE FOR ARBLK, VCBLK, PDBLK TO DELETE TRAP ! 13256: * BLOCKS FROM ALL VALUE FIELDS (THE COPY IS UNTRAPPED) ! 13257: * ! 13258: COP02 MOV (XR),XL LOAD NEXT POINTER ! 13259: * ! 13260: * LOOP TO GET VALUE AT END OF TRBLK CHAIN ! 13261: * ! 13262: COP03 BNE (XL),=B$TRT,COP04 JUMP IF NOT TRAPPED ! 13263: MOV TRVAL(XL),XL ELSE POINT TO NEXT VALUE ! 13264: BRN COP03 AND LOOP BACK ! 13265: EJC ! 13266: * ! 13267: * COPYB (CONTINUED) ! 13268: * ! 13269: * HERE WITH UNTRAPPED VALUE IN XL ! 13270: * ! 13271: COP04 MOV XL,(XR)+ STORE REAL VALUE, BUMP POINTER ! 13272: BNE XR,DNAMP,COP02 LOOP BACK IF MORE TO GO ! 13273: BRN COP09 ELSE JUMP TO EXIT ! 13274: * ! 13275: * HERE TO COPY A TABLE ! 13276: * ! 13277: COP05 ZER IDVAL(XR) ZERO ID TO STOP DUMP BLOWING UP ! 13278: MOV *TESI$,WA SET SIZE OF TEBLK ! 13279: MOV *TBBUK,WC SET INITIAL OFFSET ! 13280: * ! 13281: * LOOP THROUGH BUCKETS IN TABLE ! 13282: * ! 13283: COP06 MOV (XS),XR LOAD TABLE POINTER ! 13284: BEQ WC,TBLEN(XR),COP09 JUMP TO EXIT IF ALL DONE ! 13285: ADD WC,XR ELSE POINT TO NEXT BUCKET HEADER ! 13286: ICA WC BUMP OFFSET ! 13287: SUB *TENXT,XR SUBTRACT LINK OFFSET TO MERGE ! 13288: * ! 13289: * LOOP THROUGH TEBLKS ON ONE CHAIN ! 13290: * ! 13291: COP07 MOV TENXT(XR),XL LOAD POINTER TO NEXT TEBLK ! 13292: MOV (XS),TENXT(XR) SET END OF CHAIN POINTER IN CASE ! 13293: BEQ (XL),=B$TBT,COP06 BACK FOR NEXT BUCKET IF CHAIN END ! 13294: MOV XR,-(XS) ELSE STACK PTR TO PREVIOUS BLOCK ! 13295: MOV *TESI$,WA SET SIZE OF TEBLK ! 13296: JSR ALLOC ALLOCATE NEW TEBLK ! 13297: MOV XR,WB SAVE PTR TO NEW TEBLK ! 13298: MVW COPY OLD TEBLK TO NEW TEBLK ! 13299: MOV WB,XR RESTORE POINTER TO NEW TEBLK ! 13300: MOV (XS)+,XL RESTORE POINTER TO PREVIOUS BLOCK ! 13301: MOV XR,TENXT(XL) LINK NEW BLOCK TO PREVIOUS ! 13302: MOV XR,XL COPY POINTER TO NEW BLOCK ! 13303: * ! 13304: * LOOP TO SET REAL VALUE AFTER REMOVING TRAP CHAIN ! 13305: * ! 13306: COP08 MOV TEVAL(XL),XL LOAD VALUE ! 13307: BEQ (XL),=B$TRT,COP08 LOOP BACK IF TRAPPED ! 13308: MOV XL,TEVAL(XR) STORE UNTRAPPED VALUE IN TEBLK ! 13309: BRN COP07 BACK FOR NEXT TEBLK ! 13310: * ! 13311: * COMMON EXIT POINT ! 13312: * ! 13313: COP09 MOV (XS)+,XR LOAD POINTER TO BLOCK ! 13314: EXI RETURN ! 13315: * ! 13316: * ALTERNATIVE RETURN ! 13317: * ! 13318: COP10 EXI 1 RETURN ! 13319: EJC ! 13320: .IF .CNBF ! 13321: .ELSE ! 13322: * ! 13323: * HERE TO COPY BUFFER ! 13324: * ! 13325: COP11 MOV BCBUF(XR),XL GET BFBLK PTR ! 13326: MOV BFALC(XL),WA GET ALLOCATION ! 13327: CTB WA,BFSI$ SET TOTAL SIZE ! 13328: MOV XR,XL SAVE BCBLK PTR ! 13329: JSR ALLOC ALLOCATE BFBLK ! 13330: MOV BCBUF(XL),WB GET OLD BFBLK ! 13331: MOV XR,BCBUF(XL) SET POINTER TO NEW BFBLK ! 13332: MOV WB,XL POINT TO OLD BFBLK ! 13333: MVW COPY BFBLK TOO ! 13334: ZER XL CLEAR RUBBISH PTR ! 13335: BRN COP09 BRANCH TO EXIT ! 13336: .FI ! 13337: ENP END PROCEDURE COPYB ! 13338: * ! 13339: * CDGCG -- GENERATE CODE FOR COMPLEX GOTO ! 13340: * ! 13341: * USED BY CMPIL TO PROCESS COMPLEX GOTO TREE ! 13342: * ! 13343: * (WB) MUST BE COLLECTABLE ! 13344: * (XR) EXPRESSION POINTER ! 13345: * JSR CDGCG CALL TO GENERATE COMPLEX GOTO ! 13346: * (XL,XR,WA) DESTROYED ! 13347: * ! 13348: CDGCG PRC E,0 ENTRY POINT ! 13349: MOV CMOPN(XR),XL GET UNARY GOTO OPERATOR ! 13350: MOV CMROP(XR),XR POINT TO GOTO OPERAND ! 13351: BEQ XL,=OPDVD,CDGC2 JUMP IF DIRECT GOTO ! 13352: JSR CDGNM GENERATE OPND BY NAME IF NOT DIRECT ! 13353: * ! 13354: * RETURN POINT ! 13355: * ! 13356: CDGC1 MOV XL,WA GOTO OPERATOR ! 13357: JSR CDWRD GENERATE IT ! 13358: EXI RETURN TO CALLER ! 13359: * ! 13360: * DIRECT GOTO ! 13361: * ! 13362: CDGC2 JSR CDGVL GENERATE OPERAND BY VALUE ! 13363: BRN CDGC1 MERGE TO RETURN ! 13364: ENP END PROCEDURE CDGCG ! 13365: EJC ! 13366: * ! 13367: * CDGEX -- BUILD EXPRESSION BLOCK ! 13368: * ! 13369: * CDGEX IS PASSED A POINTER TO AN EXPRESSION TREE (SEE ! 13370: * EXPAN) AND RETURNS AN EXPRESSION (SEBLK OR EXBLK). ! 13371: * ! 13372: * (WC) SOME COLLECTABLE VALUE ! 13373: * (WB) INTEGER IN RANGE 0 LE X LE MXLEN ! 13374: * (XL) PTR TO EXPRESSION TREE ! 13375: * JSR CDGEX CALL TO BUILD EXPRESSION ! 13376: * (XR) PTR TO SEBLK OR EXBLK ! 13377: * (XL,WA,WB) DESTROYED ! 13378: * ! 13379: CDGEX PRC R,0 ENTRY POINT, RECURSIVE ! 13380: BLO (XL),=B$VR$,CDGX1 JUMP IF NOT VARIABLE ! 13381: * ! 13382: * HERE FOR NATURAL VARIABLE, BUILD SEBLK ! 13383: * ! 13384: MOV *SESI$,WA SET SIZE OF SEBLK ! 13385: JSR ALLOC ALLOCATE SPACE FOR SEBLK ! 13386: MOV =B$SEL,(XR) SET TYPE WORD ! 13387: MOV XL,SEVAR(XR) STORE VRBLK POINTER ! 13388: EXI RETURN TO CDGEX CALLER ! 13389: * ! 13390: * HERE IF NOT VARIABLE, BUILD EXBLK ! 13391: * ! 13392: CDGX1 MOV XL,XR COPY TREE POINTER ! 13393: MOV WC,-(XS) SAVE WC ! 13394: MOV CWCOF,XL SAVE CURRENT OFFSET ! 13395: MOV (XR),WA GET TYPE WORD ! 13396: BNE WA,=B$CMT,CDGX2 CALL BY VALUE IF NOT CMBLK ! 13397: BGE CMTYP(XR),=C$$NM,CDGX2 JUMP IF CMBLK ONLY BY VALUE ! 13398: EJC ! 13399: * ! 13400: * CDGEX (CONTINUED) ! 13401: * ! 13402: * HERE IF EXPRESSION CAN BE EVALUATED BY NAME ! 13403: * ! 13404: JSR CDGNM GENERATE CODE BY NAME ! 13405: MOV =ORNM$,WA LOAD RETURN BY NAME WORD ! 13406: BRN CDGX3 MERGE WITH VALUE CASE ! 13407: * ! 13408: * HERE IF EXPRESSION CAN ONLY BE EVALUATED BY VALUE ! 13409: * ! 13410: CDGX2 JSR CDGVL GENERATE CODE BY VALUE ! 13411: MOV =ORVL$,WA LOAD RETURN BY VALUE WORD ! 13412: * ! 13413: * MERGE HERE TO CONSTRUCT EXBLK ! 13414: * ! 13415: CDGX3 JSR CDWRD GENERATE RETURN WORD ! 13416: JSR EXBLD BUILD EXBLK ! 13417: MOV (XS)+,WC RESTORE WC ! 13418: EXI RETURN TO CDGEX CALLER ! 13419: ENP END PROCEDURE CDGEX ! 13420: EJC ! 13421: * ! 13422: * CDGNM -- GENERATE CODE BY NAME ! 13423: * ! 13424: * CDGNM IS CALLED DURING THE COMPILATION PROCESS TO ! 13425: * GENERATE CODE BY NAME FOR AN EXPRESSION. SEE CDBLK ! 13426: * DESCRIPTION FOR DETAILS OF CODE GENERATED. THE INPUT ! 13427: * TO CDGNM IS AN EXPRESSION TREE AS GENERATED BY EXPAN. ! 13428: * ! 13429: * CDGNM IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING ! 13430: * RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS. ! 13431: * ! 13432: * (WB) INTEGER IN RANGE 0 LE N LE DNAMB ! 13433: * (XR) PTR TO TREE GENERATED BY EXPAN ! 13434: * (WC) CONSTANT FLAG (SEE BELOW) ! 13435: * JSR CDGNM CALL TO GENERATE CODE BY NAME ! 13436: * (XR,WA) DESTROYED ! 13437: * (WC) SET NON-ZERO IF NON-CONSTANT ! 13438: * ! 13439: * WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE ! 13440: * EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE ! 13441: * EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED. ! 13442: * ! 13443: * THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD). ! 13444: * ! 13445: CDGNM PRC R,0 ENTRY POINT, RECURSIVE ! 13446: MOV XL,-(XS) SAVE ENTRY XL ! 13447: MOV WB,-(XS) SAVE ENTRY WB ! 13448: CHK CHECK FOR STACK OVERFLOW ! 13449: MOV (XR),WA LOAD TYPE WORD ! 13450: BEQ WA,=B$CMT,CGN04 JUMP IF CMBLK ! 13451: BHI WA,=B$VR$,CGN02 JUMP IF SIMPLE VARIABLE ! 13452: * ! 13453: * MERGE HERE FOR OPERAND YIELDING VALUE (E.G. CONSTANT) ! 13454: * ! 13455: CGN01 ERB 212,SYNTAX ERROR. VALUE USED WHERE NAME IS REQUIRED ! 13456: * ! 13457: * HERE FOR NATURAL VARIABLE REFERENCE ! 13458: * ! 13459: CGN02 MOV =OLVN$,WA LOAD VARIABLE LOAD CALL ! 13460: JSR CDWRD GENERATE IT ! 13461: MOV XR,WA COPY VRBLK POINTER ! 13462: JSR CDWRD GENERATE VRBLK POINTER ! 13463: EJC ! 13464: * ! 13465: * CDGNM (CONTINUED) ! 13466: * ! 13467: * HERE TO EXIT WITH WC SET CORRECTLY ! 13468: * ! 13469: CGN03 MOV (XS)+,WB RESTORE ENTRY WB ! 13470: MOV (XS)+,XL RESTORE ENTRY XL ! 13471: EXI RETURN TO CDGNM CALLER ! 13472: * ! 13473: * HERE FOR CMBLK ! 13474: * ! 13475: CGN04 MOV XR,XL COPY CMBLK POINTER ! 13476: MOV CMTYP(XR),XR LOAD CMBLK TYPE ! 13477: BGE XR,=C$$NM,CGN01 ERROR IF NOT NAME OPERAND ! 13478: BSW XR,C$$NM ELSE SWITCH ON TYPE ! 13479: IFF C$ARR,CGN05 ARRAY REFERENCE ! 13480: IFF C$FNC,CGN08 FUNCTION CALL ! 13481: IFF C$DEF,CGN09 DEFERRED EXPRESSION ! 13482: IFF C$IND,CGN10 INDIRECT REFERENCE ! 13483: IFF C$KEY,CGN11 KEYWORD REFERENCE ! 13484: IFF C$UBO,CGN08 UNDEFINED BINARY OP ! 13485: IFF C$UUO,CGN08 UNDEFINED UNARY OP ! 13486: ESW END SWITCH ON CMBLK TYPE ! 13487: * ! 13488: * HERE TO GENERATE CODE FOR ARRAY REFERENCE ! 13489: * ! 13490: CGN05 MOV *CMOPN,WB POINT TO ARRAY OPERAND ! 13491: * ! 13492: * LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS ! 13493: * ! 13494: CGN06 JSR CMGEN GENERATE CODE FOR NEXT OPERAND ! 13495: MOV CMLEN(XL),WC LOAD LENGTH OF CMBLK ! 13496: BLT WB,WC,CGN06 LOOP TILL ALL GENERATED ! 13497: * ! 13498: * GENERATE APPROPRIATE ARRAY CALL ! 13499: * ! 13500: MOV =OAON$,WA LOAD ONE-SUBSCRIPT CASE CALL ! 13501: BEQ WC,*CMAR1,CGN07 JUMP TO EXIT IF ONE SUBSCRIPT CASE ! 13502: MOV =OAMN$,WA ELSE LOAD MULTI-SUBSCRIPT CASE CALL ! 13503: JSR CDWRD GENERATE CALL ! 13504: MOV WC,WA COPY CMBLK LENGTH ! 13505: BTW WA CONVERT TO WORDS ! 13506: SUB =CMVLS,WA CALCULATE NUMBER OF SUBSCRIPTS ! 13507: EJC ! 13508: * ! 13509: * CDGNM (CONTINUED) ! 13510: * ! 13511: * HERE TO EXIT GENERATING WORD (NON-CONSTANT) ! 13512: * ! 13513: CGN07 MNZ WC SET RESULT NON-CONSTANT ! 13514: JSR CDWRD GENERATE WORD ! 13515: BRN CGN03 BACK TO EXIT ! 13516: * ! 13517: * HERE TO GENERATE CODE FOR FUNCTIONS AND UNDEFINED OPRS ! 13518: * ! 13519: CGN08 MOV XL,XR COPY CMBLK POINTER ! 13520: JSR CDGVL GEN CODE BY VALUE FOR CALL ! 13521: MOV =OFNE$,WA GET EXTRA CALL FOR BY NAME ! 13522: BRN CGN07 BACK TO GENERATE AND EXIT ! 13523: * ! 13524: * HERE TO GENERATE CODE FOR DEFERED EXPRESSION ! 13525: * ! 13526: CGN09 MOV CMROP(XL),XR CHECK IF VARIABLE ! 13527: BHI (XR),=B$VR$,CGN02 TREAT *VARIABLE AS SIMPLE VAR ! 13528: MOV XR,XL COPY PTR TO EXPRESSION TREE ! 13529: JSR CDGEX ELSE BUILD EXBLK ! 13530: MOV =OLEX$,WA SET CALL TO LOAD EXPR BY NAME ! 13531: JSR CDWRD GENERATE IT ! 13532: MOV XR,WA COPY EXBLK POINTER ! 13533: JSR CDWRD GENERATE EXBLK POINTER ! 13534: BRN CGN03 BACK TO EXIT ! 13535: * ! 13536: * HERE TO GENERATE CODE FOR INDIRECT REFERENCE ! 13537: * ! 13538: CGN10 MOV CMROP(XL),XR GET OPERAND ! 13539: JSR CDGVL GENERATE CODE BY VALUE FOR IT ! 13540: MOV =OINN$,WA LOAD CALL FOR INDIRECT BY NAME ! 13541: BRN CGN12 MERGE ! 13542: * ! 13543: * HERE TO GENERATE CODE FOR KEYWORD REFERENCE ! 13544: * ! 13545: CGN11 MOV CMROP(XL),XR GET OPERAND ! 13546: JSR CDGNM GENERATE CODE BY NAME FOR IT ! 13547: MOV =OKWN$,WA LOAD CALL FOR KEYWORD BY NAME ! 13548: * ! 13549: * KEYWORD, INDIRECT MERGE HERE ! 13550: * ! 13551: CGN12 JSR CDWRD GENERATE CODE FOR OPERATOR ! 13552: BRN CGN03 EXIT ! 13553: ENP END PROCEDURE CDGNM ! 13554: EJC ! 13555: * ! 13556: * CDGVL -- GENERATE CODE BY VALUE ! 13557: * ! 13558: * CDGVL IS CALLED DURING THE COMPILATION PROCESS TO ! 13559: * GENERATE CODE BY VALUE FOR AN EXPRESSION. SEE CDBLK ! 13560: * DESCRIPTION FOR DETAILS OF THE CODE GENERATED. THE INPUT ! 13561: * TO CDGVL IS AN EXPRESSION TREE AS GENERATED BY EXPAN. ! 13562: * ! 13563: * CDGVL IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING ! 13564: * RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS. ! 13565: * ! 13566: * (WB) INTEGER IN RANGE 0 LE N LE DNAMB ! 13567: * (XR) PTR TO TREE GENERATED BY EXPAN ! 13568: * (WC) CONSTANT FLAG (SEE BELOW) ! 13569: * JSR CDGVL CALL TO GENERATE CODE BY VALUE ! 13570: * (XR,WA) DESTROYED ! 13571: * (WC) SET NON-ZERO IF NON-CONSTANT ! 13572: * ! 13573: * WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE ! 13574: * EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE ! 13575: * EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED. ! 13576: * ! 13577: * IF WC IS NON-ZERO ON ENTRY, THEN PREEVALUATION IS NOT ! 13578: * ALLOWED REGARDLESS OF THE NATURE OF THE OPERAND. ! 13579: * ! 13580: * THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD). ! 13581: * ! 13582: CDGVL PRC R,0 ENTRY POINT, RECURSIVE ! 13583: MOV (XR),WA LOAD TYPE WORD ! 13584: BEQ WA,=B$CMT,CGV01 JUMP IF CMBLK ! 13585: BLT WA,=B$VRA,CGV00 JUMP IF ICBLK, RCBLK, SCBLK ! 13586: BNZ VRLEN(XR),CGVL0 JUMP IF NOT SYSTEM VARIABLE ! 13587: MOV XR,-(XS) STACK XR ! 13588: MOV VRSVP(XR),XR POINT TO SVBLK ! 13589: MOV SVBIT(XR),WA GET SVBLK PROPERTY BITS ! 13590: MOV (XS)+,XR RECOVER XR ! 13591: ANB BTCKW,WA CHECK IF CONSTANT KEYWORD ! 13592: NZB WA,CGV00 JUMP IF CONSTANT KEYWORD ! 13593: * ! 13594: * HERE FOR VARIABLE VALUE REFERENCE ! 13595: * ! 13596: CGVL0 MNZ WC INDICATE NON-CONSTANT VALUE ! 13597: * ! 13598: * MERGE HERE FOR SIMPLE CONSTANT (ICBLK,RCBLK,SCBLK) ! 13599: * AND FOR VARIABLES CORRESPONDING TO CONSTANT KEYWORDS. ! 13600: * ! 13601: CGV00 MOV XR,WA COPY PTR TO VAR OR CONSTANT ! 13602: JSR CDWRD GENERATE AS CODE WORD ! 13603: EXI RETURN TO CALLER ! 13604: EJC ! 13605: * ! 13606: * CDGVL (CONTINUED) ! 13607: * ! 13608: * HERE FOR TREE NODE (CMBLK) ! 13609: * ! 13610: CGV01 MOV WB,-(XS) SAVE ENTRY WB ! 13611: MOV XL,-(XS) SAVE ENTRY XL ! 13612: MOV WC,-(XS) SAVE ENTRY CONSTANT FLAG ! 13613: MOV CWCOF,-(XS) SAVE INITIAL CODE OFFSET ! 13614: CHK CHECK FOR STACK OVERFLOW ! 13615: * ! 13616: * PREPARE TO GENERATE CODE FOR CMBLK. WC IS SET TO THE ! 13617: * VALUE OF CSWNO (ZERO IF -OPTIMISE, 1 IF -NOOPT) TO ! 13618: * START WITH AND IS RESET NON-ZERO FOR ANY NON-CONSTANT ! 13619: * CODE GENERATED. IF IT IS STILL ZERO AFTER GENERATING ALL ! 13620: * THE CMBLK CODE, THEN ITS VALUE IS COMPUTED AS THE RESULT. ! 13621: * ! 13622: MOV XR,XL COPY CMBLK POINTER ! 13623: MOV CMTYP(XR),XR LOAD CMBLK TYPE ! 13624: MOV CSWNO,WC RESET CONSTANT FLAG ! 13625: BLE XR,=C$PR$,CGV02 JUMP IF NOT PREDICATE VALUE ! 13626: MNZ WC ELSE FORCE NON-CONSTANT CASE ! 13627: * ! 13628: * HERE WITH WC SET APPROPRIATELY ! 13629: * ! 13630: CGV02 BSW XR,C$$NV SWITCH TO APPROPRIATE GENERATOR ! 13631: IFF C$ARR,CGV03 ARRAY REFERENCE ! 13632: IFF C$FNC,CGV05 FUNCTION CALL ! 13633: IFF C$DEF,CGV14 DEFERRED EXPRESSION ! 13634: IFF C$SEL,CGV15 SELECTION ! 13635: IFF C$IND,CGV31 INDIRECT REFERENCE ! 13636: IFF C$KEY,CGV27 KEYWORD REFERENCE ! 13637: IFF C$UBO,CGV29 UNDEFINED BINOP ! 13638: IFF C$UUO,CGV30 UNDEFINED UNOP ! 13639: IFF C$BVL,CGV18 BINOPS WITH VAL OPDS ! 13640: IFF C$ALT,CGV18 ALTERNATION ! 13641: IFF C$UVL,CGV19 UNOPS WITH VALU OPND ! 13642: IFF C$ASS,CGV21 ASSIGNMENT ! 13643: IFF C$CNC,CGV24 CONCATENATION ! 13644: IFF C$CNP,CGV24 CONCATENATION (NOT PATTERN MATCH) ! 13645: IFF C$UNM,CGV27 UNOPS WITH NAME OPND ! 13646: IFF C$BVN,CGV26 BINARY $ AND . ! 13647: IFF C$INT,CGV31 INTERROGATION ! 13648: IFF C$NEG,CGV28 NEGATION ! 13649: IFF C$PMT,CGV18 PATTERN MATCH ! 13650: ESW END SWITCH ON CMBLK TYPE ! 13651: EJC ! 13652: * ! 13653: * CDGVL (CONTINUED) ! 13654: * ! 13655: * HERE TO GENERATE CODE FOR ARRAY REFERENCE ! 13656: * ! 13657: CGV03 MOV *CMOPN,WB SET OFFSET TO ARRAY OPERAND ! 13658: * ! 13659: * LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS ! 13660: * ! 13661: CGV04 JSR CMGEN GEN VALUE CODE FOR NEXT OPERAND ! 13662: MOV CMLEN(XL),WC LOAD CMBLK LENGTH ! 13663: BLT WB,WC,CGV04 LOOP BACK IF MORE TO GO ! 13664: * ! 13665: * GENERATE CALL TO APPROPRIATE ARRAY REFERENCE ROUTINE ! 13666: * ! 13667: MOV =OAOV$,WA SET ONE SUBSCRIPT CALL IN CASE ! 13668: BEQ WC,*CMAR1,CGV32 JUMP TO EXIT IF 1-SUB CASE ! 13669: MOV =OAMV$,WA ELSE SET CALL FOR MULTI-SUBSCRIPTS ! 13670: JSR CDWRD GENERATE CALL ! 13671: MOV WC,WA COPY LENGTH OF CMBLK ! 13672: SUB *CMVLS,WA SUBTRACT STANDARD LENGTH ! 13673: BTW WA GET NUMBER OF WORDS ! 13674: BRN CGV32 JUMP TO GENERATE SUBSCRIPT COUNT ! 13675: * ! 13676: * HERE TO GENERATE CODE FOR FUNCTION CALL ! 13677: * ! 13678: CGV05 MOV *CMVLS,WB SET OFFSET TO FIRST ARGUMENT ! 13679: * ! 13680: * LOOP TO GENERATE CODE FOR ARGUMENTS ! 13681: * ! 13682: CGV06 BEQ WB,CMLEN(XL),CGV07 JUMP IF ALL GENERATED ! 13683: JSR CMGEN ELSE GEN VALUE CODE FOR NEXT ARG ! 13684: BRN CGV06 BACK TO GENERATE NEXT ARGUMENT ! 13685: * ! 13686: * HERE TO GENERATE ACTUAL FUNCTION CALL ! 13687: * ! 13688: CGV07 SUB *CMVLS,WB GET NUMBER OF ARG PTRS (BYTES) ! 13689: BTW WB CONVERT BYTES TO WORDS ! 13690: MOV CMOPN(XL),XR LOAD FUNCTION VRBLK POINTER ! 13691: BNZ VRLEN(XR),CGV12 JUMP IF NOT SYSTEM FUNCTION ! 13692: MOV VRSVP(XR),XL LOAD SVBLK PTR IF SYSTEM VAR ! 13693: MOV SVBIT(XL),WA LOAD BIT MASK ! 13694: ANB BTFFC,WA TEST FOR FAST FUNCTION CALL ALLOWED ! 13695: ZRB WA,CGV12 JUMP IF NOT ! 13696: EJC ! 13697: * ! 13698: * CDGVL (CONTINUED) ! 13699: * ! 13700: * HERE IF FAST FUNCTION CALL IS ALLOWED ! 13701: * ! 13702: MOV SVBIT(XL),WA RELOAD BIT INDICATORS ! 13703: ANB BTPRE,WA TEST FOR PREEVALUATION OK ! 13704: NZB WA,CGV08 JUMP IF PREEVALUATION PERMITTED ! 13705: MNZ WC ELSE SET RESULT NON-CONSTANT ! 13706: * ! 13707: * TEST FOR CORRECT NUMBER OF ARGS FOR FAST CALL ! 13708: * ! 13709: CGV08 MOV VRFNC(XR),XL LOAD PTR TO SVFNC FIELD ! 13710: MOV FARGS(XL),WA LOAD SVNAR FIELD VALUE ! 13711: BEQ WA,WB,CGV11 JUMP IF ARGUMENT COUNT IS CORRECT ! 13712: BHI WA,WB,CGV09 JUMP IF TOO FEW ARGUMENTS GIVEN ! 13713: * ! 13714: * HERE IF TOO MANY ARGUMENTS, PREPARE TO GENERATE O$POPS ! 13715: * ! 13716: SUB WA,WB GET NUMBER OF EXTRA ARGS ! 13717: LCT WB,WB SET AS COUNT TO CONTROL LOOP ! 13718: MOV =OPOP$,WA SET POP CALL ! 13719: BRN CGV10 JUMP TO COMMON LOOP ! 13720: * ! 13721: * HERE IF TOO FEW ARGUMENTS, PREPARE TO GENERATE NULLS ! 13722: * ! 13723: CGV09 SUB WB,WA GET NUMBER OF MISSING ARGUMENTS ! 13724: LCT WB,WA LOAD AS COUNT TO CONTROL LOOP ! 13725: MOV =NULLS,WA LOAD PTR TO NULL CONSTANT ! 13726: * ! 13727: * LOOP TO GENERATE CALLS TO FIX ARGUMENT COUNT ! 13728: * ! 13729: CGV10 JSR CDWRD GENERATE ONE CALL ! 13730: BCT WB,CGV10 LOOP TILL ALL GENERATED ! 13731: * ! 13732: * HERE AFTER ADJUSTING ARG COUNT AS REQUIRED ! 13733: * ! 13734: CGV11 MOV XL,WA COPY POINTER TO SVFNC FIELD ! 13735: BRN CGV36 JUMP TO GENERATE CALL ! 13736: EJC ! 13737: * ! 13738: * CDGVL (CONTINUED) ! 13739: * ! 13740: * COME HERE IF FAST CALL IS NOT PERMITTED ! 13741: * ! 13742: CGV12 MOV =OFNS$,WA SET ONE ARG CALL IN CASE ! 13743: BEQ WB,=NUM01,CGV13 JUMP IF ONE ARG CASE ! 13744: MOV =OFNC$,WA ELSE LOAD CALL FOR MORE THAN 1 ARG ! 13745: JSR CDWRD GENERATE IT ! 13746: MOV WB,WA COPY ARGUMENT COUNT ! 13747: * ! 13748: * ONE ARG CASE MERGES HERE ! 13749: * ! 13750: CGV13 JSR CDWRD GENERATE =O$FNS OR ARG COUNT ! 13751: MOV XR,WA COPY VRBLK POINTER ! 13752: BRN CGV32 JUMP TO GENERATE VRBLK PTR ! 13753: * ! 13754: * HERE FOR DEFERRED EXPRESSION ! 13755: * ! 13756: CGV14 MOV CMROP(XL),XL POINT TO EXPRESSION TREE ! 13757: JSR CDGEX BUILD EXBLK OR SEBLK ! 13758: MOV XR,WA COPY BLOCK PTR ! 13759: JSR CDWRD GENERATE PTR TO EXBLK OR SEBLK ! 13760: BRN CGV34 JUMP TO EXIT, CONSTANT TEST ! 13761: * ! 13762: * HERE TO GENERATE CODE FOR SELECTION ! 13763: * ! 13764: CGV15 ZER -(XS) ZERO PTR TO CHAIN OF FORWARD JUMPS ! 13765: ZER -(XS) ZERO PTR TO PREV O$SLC FORWARD PTR ! 13766: MOV *CMVLS,WB POINT TO FIRST ALTERNATIVE ! 13767: MOV =OSLA$,WA SET INITIAL CODE WORD ! 13768: * ! 13769: * 0(XS) IS THE OFFSET TO THE PREVIOUS WORD ! 13770: * WHICH REQUIRES FILLING IN WITH AN ! 13771: * OFFSET TO THE FOLLOWING O$SLC,O$SLD ! 13772: * ! 13773: * 1(XS) IS THE HEAD OF A CHAIN OF OFFSET ! 13774: * POINTERS INDICATING THOSE LOCATIONS ! 13775: * TO BE FILLED WITH OFFSETS PAST ! 13776: * THE END OF ALL THE ALTERNATIVES ! 13777: * ! 13778: CGV16 JSR CDWRD GENERATE O$SLC (O$SLA FIRST TIME) ! 13779: MOV CWCOF,(XS) SET CURRENT LOC AS PTR TO FILL IN ! 13780: JSR CDWRD GENERATE GARBAGE WORD THERE FOR NOW ! 13781: JSR CMGEN GEN VALUE CODE FOR ALTERNATIVE ! 13782: MOV =OSLB$,WA LOAD O$SLB POINTER ! 13783: JSR CDWRD GENERATE O$SLB CALL ! 13784: MOV 1(XS),WA LOAD OLD CHAIN PTR ! 13785: MOV CWCOF,1(XS) SET CURRENT LOC AS NEW CHAIN HEAD ! 13786: JSR CDWRD GENERATE FORWARD CHAIN LINK ! 13787: EJC ! 13788: * ! 13789: * CDGVL (CONTINUED) ! 13790: * ! 13791: * NOW TO FILL IN THE SKIP OFFSET TO O$SLC,O$SLD ! 13792: * ! 13793: MOV (XS),XR LOAD OFFSET TO WORD TO PLUG ! 13794: ADD R$CCB,XR POINT TO ACTUAL LOCATION TO PLUG ! 13795: MOV CWCOF,(XR) PLUG PROPER OFFSET IN ! 13796: MOV =OSLC$,WA LOAD O$SLC PTR FOR NEXT ALTERNATIVE ! 13797: MOV WB,XR COPY OFFSET (DESTROY GARBAGE XR) ! 13798: ICA XR BUMP EXTRA TIME FOR TEST ! 13799: BLT XR,CMLEN(XL),CGV16 LOOP BACK IF NOT LAST ALTERNATIVE ! 13800: * ! 13801: * HERE TO GENERATE CODE FOR LAST ALTERNATIVE ! 13802: * ! 13803: MOV =OSLD$,WA GET HEADER CALL ! 13804: JSR CDWRD GENERATE O$SLD CALL ! 13805: JSR CMGEN GENERATE CODE FOR LAST ALTERNATIVE ! 13806: ICA XS POP OFFSET PTR ! 13807: MOV (XS)+,XR LOAD CHAIN PTR ! 13808: * ! 13809: * LOOP TO PLUG OFFSETS PAST STRUCTURE ! 13810: * ! 13811: CGV17 ADD R$CCB,XR MAKE NEXT PTR ABSOLUTE ! 13812: MOV (XR),WA LOAD FORWARD PTR ! 13813: MOV CWCOF,(XR) PLUG REQUIRED OFFSET ! 13814: MOV WA,XR COPY FORWARD PTR ! 13815: BNZ WA,CGV17 LOOP BACK IF MORE TO GO ! 13816: BRN CGV33 ELSE JUMP TO EXIT (NOT CONSTANT) ! 13817: * ! 13818: * HERE FOR BINARY OPS WITH VALUE OPERANDS ! 13819: * ! 13820: CGV18 MOV CMLOP(XL),XR LOAD LEFT OPERAND POINTER ! 13821: JSR CDGVL GEN VALUE CODE FOR LEFT OPERAND ! 13822: * ! 13823: * HERE FOR UNARY OPS WITH VALUE OPERAND (BINOPS MERGE) ! 13824: * ! 13825: CGV19 MOV CMROP(XL),XR LOAD RIGHT (ONLY) OPERAND PTR ! 13826: JSR CDGVL GEN CODE BY VALUE ! 13827: EJC ! 13828: * ! 13829: * CDGVL (CONTINUED) ! 13830: * ! 13831: * MERGE HERE TO GENERATE OPERATOR CALL FROM CMOPN FIELD ! 13832: * ! 13833: CGV20 MOV CMOPN(XL),WA LOAD OPERATOR CALL POINTER ! 13834: BRN CGV36 JUMP TO GENERATE IT WITH CONS TEST ! 13835: * ! 13836: * HERE FOR ASSIGNMENT ! 13837: * ! 13838: CGV21 MOV CMLOP(XL),XR LOAD LEFT OPERAND POINTER ! 13839: BLO (XR),=B$VR$,CGV22 JUMP IF NOT VARIABLE ! 13840: * ! 13841: * HERE FOR ASSIGNMENT TO SIMPLE VARIABLE ! 13842: * ! 13843: MOV CMROP(XL),XR LOAD RIGHT OPERAND PTR ! 13844: JSR CDGVL GENERATE CODE BY VALUE ! 13845: MOV CMLOP(XL),WA RELOAD LEFT OPERAND VRBLK PTR ! 13846: ADD *VRSTO,WA POINT TO VRSTO FIELD ! 13847: BRN CGV32 JUMP TO GENERATE STORE PTR ! 13848: * ! 13849: * HERE IF NOT SIMPLE VARIABLE ASSIGNMENT ! 13850: * ! 13851: CGV22 JSR EXPAP TEST FOR PATTERN MATCH ON LEFT SIDE ! 13852: PPM CGV23 JUMP IF NOT PATTERN MATCH ! 13853: * ! 13854: * HERE FOR PATTERN REPLACEMENT ! 13855: * ! 13856: MOV CMROP(XR),CMLOP(XL) SAVE PATTERN PTR IN SAFE PLACE ! 13857: MOV CMLOP(XR),XR LOAD SUBJECT PTR ! 13858: JSR CDGNM GEN CODE BY NAME FOR SUBJECT ! 13859: MOV CMLOP(XL),XR LOAD PATTERN PTR ! 13860: JSR CDGVL GEN CODE BY VALUE FOR PATTERN ! 13861: MOV =OPMN$,WA LOAD MATCH BY NAME CALL ! 13862: JSR CDWRD GENERATE IT ! 13863: MOV CMROP(XL),XR LOAD REPLACEMENT VALUE PTR ! 13864: JSR CDGVL GEN CODE BY VALUE ! 13865: MOV =ORPL$,WA LOAD REPLACE CALL ! 13866: BRN CGV32 JUMP TO GEN AND EXIT (NOT CONSTANT) ! 13867: * ! 13868: * HERE FOR ASSIGNMENT TO COMPLEX VARIABLE ! 13869: * ! 13870: CGV23 MNZ WC INHIBIT PRE-EVALUATION ! 13871: JSR CDGNM GEN CODE BY NAME FOR LEFT SIDE ! 13872: BRN CGV31 MERGE WITH UNOP CIRCUIT ! 13873: EJC ! 13874: * ! 13875: * CDGVL (CONTINUED) ! 13876: * ! 13877: * HERE FOR CONCATENATION ! 13878: * ! 13879: CGV24 MOV CMLOP(XL),XR LOAD LEFT OPERAND PTR ! 13880: BNE (XR),=B$CMT,CGV18 ORDINARY BINOP IF NOT CMBLK ! 13881: MOV CMTYP(XR),WB LOAD CMBLK TYPE CODE ! 13882: BEQ WB,=C$INT,CGV25 SPECIAL CASE IF INTERROGATION ! 13883: BEQ WB,=C$NEG,CGV25 OR NEGATION ! 13884: BNE WB,=C$FNC,CGV18 ELSE ORDINARY BINOP IF NOT FUNCTION ! 13885: MOV CMOPN(XR),XR ELSE LOAD FUNCTION VRBLK PTR ! 13886: BNZ VRLEN(XR),CGV18 ORDINARY BINOP IF NOT SYSTEM VAR ! 13887: MOV VRSVP(XR),XR ELSE POINT TO SVBLK ! 13888: MOV SVBIT(XR),WA LOAD BIT INDICATORS ! 13889: ANB BTPRD,WA TEST FOR PREDICATE FUNCTION ! 13890: ZRB WA,CGV18 ORDINARY BINOP IF NOT ! 13891: * ! 13892: * HERE IF LEFT ARG OF CONCATENATION IS PREDICATE FUNCTION ! 13893: * ! 13894: CGV25 MOV CMLOP(XL),XR RELOAD LEFT ARG ! 13895: JSR CDGVL GEN CODE BY VALUE ! 13896: MOV =OPOP$,WA LOAD POP CALL ! 13897: JSR CDWRD GENERATE IT ! 13898: MOV CMROP(XL),XR LOAD RIGHT OPERAND ! 13899: JSR CDGVL GEN CODE BY VALUE AS RESULT CODE ! 13900: BRN CGV33 EXIT (NOT CONSTANT) ! 13901: * ! 13902: * HERE TO GENERATE CODE FOR PATTERN, IMMEDIATE ASSIGNMENT ! 13903: * ! 13904: CGV26 MOV CMLOP(XL),XR LOAD LEFT OPERAND ! 13905: JSR CDGVL GEN CODE BY VALUE, MERGE ! 13906: * ! 13907: * HERE FOR UNOPS WITH ARG BY NAME (BINARY $ . MERGE) ! 13908: * ! 13909: CGV27 MOV CMROP(XL),XR LOAD RIGHT OPERAND PTR ! 13910: JSR CDGNM GEN CODE BY NAME FOR RIGHT ARG ! 13911: MOV CMOPN(XL),XR GET OPERATOR CODE WORD ! 13912: BNE (XR),=O$KWV,CGV20 GEN CALL UNLESS KEYWORD VALUE ! 13913: EJC ! 13914: * ! 13915: * CDGVL (CONTINUED) ! 13916: * ! 13917: * HERE FOR KEYWORD BY VALUE. THIS IS CONSTANT ONLY IF ! 13918: * THE OPERAND IS ONE OF THE SPECIAL SYSTEM VARIABLES WITH ! 13919: * THE SVCKW BIT SET TO INDICATE A CONSTANT KEYWORD VALUE. ! 13920: * NOTE THAT THE ONLY CONSTANT OPERAND BY NAME IS A VARIABLE ! 13921: * ! 13922: BNZ WC,CGV20 GEN CALL IF NON-CONSTANT (NOT VAR) ! 13923: MNZ WC ELSE SET NON-CONSTANT IN CASE ! 13924: MOV CMROP(XL),XR LOAD PTR TO OPERAND VRBLK ! 13925: BNZ VRLEN(XR),CGV20 GEN (NON-CONSTANT) IF NOT SYS VAR ! 13926: MOV VRSVP(XR),XR ELSE LOAD PTR TO SVBLK ! 13927: MOV SVBIT(XR),WA LOAD BIT MASK ! 13928: ANB BTCKW,WA TEST FOR CONSTANT KEYWORD ! 13929: ZRB WA,CGV20 GO GEN IF NOT CONSTANT ! 13930: ZER WC ELSE SET RESULT CONSTANT ! 13931: BRN CGV20 AND JUMP BACK TO GENERATE CALL ! 13932: * ! 13933: * HERE TO GENERATE CODE FOR NEGATION ! 13934: * ! 13935: CGV28 MOV =ONTA$,WA GET INITIAL WORD ! 13936: JSR CDWRD GENERATE IT ! 13937: MOV CWCOF,WB SAVE NEXT OFFSET ! 13938: JSR CDWRD GENERATE GUNK WORD FOR NOW ! 13939: MOV CMROP(XL),XR LOAD RIGHT OPERAND PTR ! 13940: JSR CDGVL GEN CODE BY VALUE ! 13941: MOV =ONTB$,WA LOAD END OF EVALUATION CALL ! 13942: JSR CDWRD GENERATE IT ! 13943: MOV WB,XR COPY OFFSET TO WORD TO PLUG ! 13944: ADD R$CCB,XR POINT TO ACTUAL WORD TO PLUG ! 13945: MOV CWCOF,(XR) PLUG WORD WITH CURRENT OFFSET ! 13946: MOV =ONTC$,WA LOAD FINAL CALL ! 13947: BRN CGV32 JUMP TO GENERATE IT (NOT CONSTANT) ! 13948: * ! 13949: * HERE TO GENERATE CODE FOR UNDEFINED BINARY OPERATOR ! 13950: * ! 13951: CGV29 MOV CMLOP(XL),XR LOAD LEFT OPERAND PTR ! 13952: JSR CDGVL GENERATE CODE BY VALUE ! 13953: EJC ! 13954: * ! 13955: * CDGVL (CONTINUED) ! 13956: * ! 13957: * HERE TO GENERATE CODE FOR UNDEFINED UNARY OPERATOR ! 13958: * ! 13959: CGV30 MOV =C$UO$,WB SET UNOP CODE + 1 ! 13960: SUB CMTYP(XL),WB SET NUMBER OF ARGS (1 OR 2) ! 13961: * ! 13962: * MERGE HERE FOR UNDEFINED OPERATORS ! 13963: * ! 13964: MOV CMROP(XL),XR LOAD RIGHT (ONLY) OPERAND POINTER ! 13965: JSR CDGVL GEN VALUE CODE FOR RIGHT OPERAND ! 13966: MOV CMOPN(XL),XR LOAD POINTER TO OPERATOR DV ! 13967: MOV DVOPN(XR),XR LOAD POINTER OFFSET ! 13968: WTB XR CONVERT WORD OFFSET TO BYTES ! 13969: ADD =R$UBA,XR POINT TO PROPER FUNCTION PTR ! 13970: SUB *VRFNC,XR SET STANDARD FUNCTION OFFSET ! 13971: BRN CGV12 MERGE WITH FUNCTION CALL CIRCUIT ! 13972: * ! 13973: * HERE TO GENERATE CODE FOR INTERROGATION, INDIRECTION ! 13974: * ! 13975: CGV31 MNZ WC SET NON CONSTANT ! 13976: BRN CGV19 MERGE ! 13977: * ! 13978: * HERE TO EXIT GENERATING A WORD, RESULT NOT CONSTANT ! 13979: * ! 13980: CGV32 JSR CDWRD GENERATE WORD, MERGE ! 13981: * ! 13982: * HERE TO EXIT WITH NO WORD GENERATED, NOT CONSTANT ! 13983: * ! 13984: CGV33 MNZ WC INDICATE RESULT IS NOT CONSTANT ! 13985: * ! 13986: * COMMON EXIT POINT ! 13987: * ! 13988: CGV34 ICA XS POP INITIAL CODE OFFSET ! 13989: MOV (XS)+,WA RESTORE OLD CONSTANT FLAG ! 13990: MOV (XS)+,XL RESTORE ENTRY XL ! 13991: MOV (XS)+,WB RESTORE ENTRY WB ! 13992: BNZ WC,CGV35 JUMP IF NOT CONSTANT ! 13993: MOV WA,WC ELSE RESTORE ENTRY CONSTANT FLAG ! 13994: * ! 13995: * HERE TO RETURN AFTER DEALING WITH WC SETTING ! 13996: * ! 13997: CGV35 EXI RETURN TO CDGVL CALLER ! 13998: * ! 13999: * EXIT HERE TO GENERATE WORD AND TEST FOR CONSTANT ! 14000: * ! 14001: CGV36 JSR CDWRD GENERATE WORD ! 14002: BNZ WC,CGV34 JUMP TO EXIT IF NOT CONSTANT ! 14003: EJC ! 14004: * ! 14005: * CDGVL (CONTINUED) ! 14006: * ! 14007: * HERE TO PREEVALUATE CONSTANT SUB-EXPRESSION ! 14008: * ! 14009: MOV =ORVL$,WA LOAD CALL TO RETURN VALUE ! 14010: JSR CDWRD GENERATE IT ! 14011: MOV (XS),XL LOAD INITIAL CODE OFFSET ! 14012: JSR EXBLD BUILD EXBLK FOR EXPRESSION ! 14013: ZER WB SET TO EVALUATE BY VALUE ! 14014: JSR EVALX EVALUATE EXPRESSION ! 14015: PPM SHOULD NOT FAIL ! 14016: MOV (XR),WA LOAD TYPE WORD OF RESULT ! 14017: BLO WA,=P$AAA,CGV37 JUMP IF NOT PATTERN ! 14018: MOV =OLPT$,WA ELSE LOAD SPECIAL PATTERN LOAD CALL ! 14019: JSR CDWRD GENERATE IT ! 14020: * ! 14021: * MERGE HERE TO GENERATE POINTER TO RESULTING CONSTANT ! 14022: * ! 14023: CGV37 MOV XR,WA COPY CONSTANT POINTER ! 14024: JSR CDWRD GENERATE PTR ! 14025: ZER WC SET RESULT CONSTANT ! 14026: BRN CGV34 JUMP BACK TO EXIT ! 14027: ENP END PROCEDURE CDGVL ! 14028: EJC ! 14029: * ! 14030: * CDWRD -- GENERATE ONE WORD OF CODE ! 14031: * ! 14032: * CDWRD WRITES ONE WORD INTO THE CURRENT CODE BLOCK UNDER ! 14033: * CONSTRUCTION. A NEW, LARGER, BLOCK IS ALLOCATED IF THERE ! 14034: * IS INSUFFICIENT ROOM IN THE CURRENT BLOCK. CDWRD ENSURES ! 14035: * THAT THERE ARE AT LEAST THREE WORDS LEFT IN THE BLOCK ! 14036: * AFTER ENTERING THE NEW WORD. THIS GUARANTEES THAT ANY ! 14037: * EXTRA SPACE AT THE END CAN BE SPLIT OFF AS A CCBLK. ! 14038: * ! 14039: * (WA) WORD TO BE GENERATED ! 14040: * JSR CDWRD CALL TO GENERATE WORD ! 14041: * ! 14042: CDWRD PRC E,0 ENTRY POINT ! 14043: MOV XR,-(XS) SAVE ENTRY XR ! 14044: MOV WA,-(XS) SAVE CODE WORD TO BE GENERATED ! 14045: * ! 14046: * MERGE BACK HERE AFTER ALLOCATING LARGER BLOCK ! 14047: * ! 14048: CDWD1 MOV R$CCB,XR LOAD PTR TO CCBLK BEING BUILT ! 14049: BNZ XR,CDWD2 JUMP IF BLOCK ALLOCATED ! 14050: * ! 14051: * HERE WE ALLOCATE AN ENTIRELY FRESH BLOCK ! 14052: * ! 14053: MOV *E$CBS,WA LOAD INITIAL LENGTH ! 14054: JSR ALLOC ALLOCATE CCBLK ! 14055: MOV =B$CCT,(XR) STORE TYPE WORD ! 14056: MOV *CCCOD,CWCOF SET INITIAL OFFSET ! 14057: MOV WA,CCLEN(XR) STORE BLOCK LENGTH ! 14058: MOV XR,R$CCB STORE PTR TO NEW BLOCK ! 14059: * ! 14060: * HERE WE HAVE A BLOCK WE CAN USE ! 14061: * ! 14062: CDWD2 MOV CWCOF,WA LOAD CURRENT OFFSET ! 14063: ADD *NUM04,WA ADJUST FOR TEST (FOUR WORDS) ! 14064: BLO WA,CCLEN(XR),CDWD4 JUMP IF ROOM IN THIS BLOCK ! 14065: * ! 14066: * HERE IF NO ROOM IN CURRENT BLOCK ! 14067: * ! 14068: BGE WA,MXLEN,CDWD5 JUMP IF ALREADY AT MAX SIZE ! 14069: ADD *E$CBS,WA ELSE GET NEW SIZE ! 14070: MOV XL,-(XS) SAVE ENTRY XL ! 14071: MOV XR,XL COPY POINTER ! 14072: BLT WA,MXLEN,CDWD3 JUMP IF NOT TOO LARGE ! 14073: MOV MXLEN,WA ELSE RESET TO MAX ALLOWED SIZE ! 14074: EJC ! 14075: * ! 14076: * CDWRD (CONTINUED) ! 14077: * ! 14078: * HERE WITH NEW BLOCK SIZE IN WA ! 14079: * ! 14080: CDWD3 JSR ALLOC ALLOCATE NEW BLOCK ! 14081: MOV XR,R$CCB STORE POINTER TO NEW BLOCK ! 14082: MOV =B$CCT,(XR)+ STORE TYPE WORD IN NEW BLOCK ! 14083: MOV WA,(XR)+ STORE BLOCK LENGTH ! 14084: ADD *CCUSE,XL POINT TO CCUSE,CCCOD FIELDS IN OLD ! 14085: MOV (XL),WA LOAD CCUSE VALUE ! 14086: MVW COPY USEFUL WORDS FROM OLD BLOCK ! 14087: MOV (XS)+,XL RESTORE XL ! 14088: BRN CDWD1 MERGE BACK TO TRY AGAIN ! 14089: * ! 14090: * HERE WITH ROOM IN CURRENT BLOCK ! 14091: * ! 14092: CDWD4 MOV CWCOF,WA LOAD CURRENT OFFSET ! 14093: ICA WA GET NEW OFFSET ! 14094: MOV WA,CWCOF STORE NEW OFFSET ! 14095: MOV WA,CCUSE(XR) STORE IN CCBLK FOR GBCOL ! 14096: DCA WA RESTORE PTR TO THIS WORD ! 14097: ADD WA,XR POINT TO CURRENT ENTRY ! 14098: MOV (XS)+,WA RELOAD WORD TO GENERATE ! 14099: MOV WA,(XR) STORE WORD IN BLOCK ! 14100: MOV (XS)+,XR RESTORE ENTRY XR ! 14101: EXI RETURN TO CALLER ! 14102: * ! 14103: * HERE IF COMPILED CODE IS TOO LONG FOR CDBLK ! 14104: * ! 14105: CDWD5 ERB 213,SYNTAX ERROR. STATEMENT IS TOO COMPLICATED. ! 14106: ENP END PROCEDURE CDWRD ! 14107: EJC ! 14108: * ! 14109: * CMGEN -- GENERATE CODE FOR CMBLK PTR ! 14110: * ! 14111: * CMGEN IS A SUBSIDIARY PROCEDURE USED TO GENERATE VALUE ! 14112: * CODE FOR A CMBLK PTR FROM THE MAIN CODE GENERATORS. ! 14113: * ! 14114: * (XL) CMBLK POINTER ! 14115: * (WB) OFFSET TO POINTER IN CMBLK ! 14116: * JSR CMGEN CALL TO GENERATE CODE ! 14117: * (XR,WA) DESTROYED ! 14118: * (WB) BUMPED BY ONE WORD ! 14119: * ! 14120: CMGEN PRC R,0 ENTRY POINT, RECURSIVE ! 14121: MOV XL,XR COPY CMBLK POINTER ! 14122: ADD WB,XR POINT TO CMBLK POINTER ! 14123: MOV (XR),XR LOAD CMBLK POINTER ! 14124: JSR CDGVL GENERATE CODE BY VALUE ! 14125: ICA WB BUMP OFFSET ! 14126: EXI RETURN TO CALLER ! 14127: ENP END PROCEDURE CMGEN ! 14128: EJC ! 14129: * ! 14130: * CMPIL (COMPILE SOURCE CODE) ! 14131: * ! 14132: * CMPIL IS USED TO CONVERT SNOBOL4 SOURCE CODE TO INTERNAL ! 14133: * FORM (SEE CDBLK FORMAT). IT IS USED BOTH FOR THE INITIAL ! 14134: * COMPILE AND AT RUN TIME BY THE CODE AND CONVERT FUNCTIONS ! 14135: * THIS PROCEDURE HAS CONTROL FOR THE ENTIRE DURATION OF ! 14136: * INITIAL COMPILATION. AN ERROR IN ANY PROCEDURE CALLED ! 14137: * DURING COMPILATION WILL LEAD FIRST TO THE ERROR SECTION ! 14138: * AND ULTIMATELY BACK HERE FOR RESUMED COMPILATION. THE ! 14139: * RE-ENTRY POINTS AFTER AN ERROR ARE SPECIALLY LABELLED - ! 14140: * ! 14141: * CMPCE RESUME AFTER CONTROL CARD ERROR ! 14142: * CMPLE RESUME AFTER LABEL ERROR ! 14143: * CMPSE RESUME AFTER STATEMENT ERROR ! 14144: * ! 14145: * JSR CMPIL CALL TO COMPILE CODE ! 14146: * (XR) PTR TO CDBLK FOR ENTRY STATEMENT ! 14147: * (XL,WA,WB,WC,RA) DESTROYED ! 14148: * ! 14149: * THE FOLLOWING GLOBAL VARIABLES ARE REFERENCED ! 14150: * ! 14151: * CMPSN NUMBER OF NEXT STATEMENT ! 14152: * TO BE COMPILED. ! 14153: * ! 14154: * CSWXX CONTROL CARD SWITCH VALUES ARE ! 14155: * CHANGED WHEN RELEVANT CONTROL ! 14156: * CARDS ARE MET. ! 14157: * ! 14158: * CWCOF OFFSET TO NEXT WORD IN CODE BLOCK ! 14159: * BEING BUILT (SEE CDWRD). ! 14160: * ! 14161: * LSTSN NUMBER OF STATEMENT MOST RECENTLY ! 14162: * COMPILED (INITIALLY SET TO ZERO). ! 14163: * ! 14164: * R$CIM CURRENT (INITIAL) COMPILER IMAGE ! 14165: * (ZERO FOR INITIAL COMPILE CALL) ! 14166: * ! 14167: * R$CNI USED TO POINT TO FOLLOWING IMAGE. ! 14168: * (SEE READR PROCEDURE). ! 14169: * ! 14170: * SCNGO GOTO SWITCH FOR SCANE PROCEDURE ! 14171: * ! 14172: * SCNIL LENGTH OF CURRENT IMAGE EXCLUDING ! 14173: * CHARACTERS REMOVED BY -INPUT. ! 14174: * ! 14175: * SCNPT CURRENT SCAN OFFSET, SEE SCANE. ! 14176: * ! 14177: * SCNRS RESCAN SWITCH FOR SCANE PROCEDURE. ! 14178: * ! 14179: * SCNSE OFFSET (IN R$CIM) OF MOST RECENTLY ! 14180: * SCANNED ELEMENT. SET ZERO IF NOT ! 14181: * CURRENTLY SCANNING ITEMS ! 14182: EJC ! 14183: * ! 14184: * CMPIL (CONTINUED) ! 14185: * ! 14186: * STAGE STGIC INITIAL COMPILE IN PROGRESS ! 14187: * STGXC CODE/CONVERT COMPILE ! 14188: * STGEV BUILDING EXBLK FOR EVAL ! 14189: * STGXT EXECUTE TIME (OUTSIDE COMPILE) ! 14190: * STGCE INITIAL COMPILE AFTER END LINE ! 14191: * STGXE EXECUTE COMPILE AFTER END LINE ! 14192: * ! 14193: * CMPIL ALSO USES A FIXED NUMBER OF LOCATIONS ON THE ! 14194: * MAIN STACK AS FOLLOWS. (THE DEFINITIONS OF THE ACTUAL ! 14195: * OFFSETS ARE IN THE DEFINITIONS SECTION). ! 14196: * ! 14197: * CMSTM(XS) POINTER TO EXPAN TREE FOR BODY OF ! 14198: * STATEMENT (SEE EXPAN PROCEDURE). ! 14199: * ! 14200: * CMSGO(XS) POINTER TO TREE REPRESENTATION OF ! 14201: * SUCCESS GOTO (SEE PROCEDURE SCNGO)9 ! 14202: * ZERO IF NO SUCCESS GOTO IS GIVEN ! 14203: * ! 14204: * CMFGO(XS) LIKE CMSGO FOR FAILURE GOTO. ! 14205: * ! 14206: * CMCGO(XS) SET NON-ZERO ONLY IF THERE IS A ! 14207: * CONDITIONAL GOTO. USED FOR -FAIL, ! 14208: * -NOFAIL CODE GENERATION. ! 14209: * ! 14210: * CMPCD(XS) POINTER TO CDBLK FOR PREVIOUS ! 14211: * STATEMENT. ZERO FOR 1ST STATEMENT. ! 14212: * ! 14213: * CMFFP(XS) SET NON-ZERO IF CDFAL IN PREVIOUS ! 14214: * CDBLK NEEDS FILLING WITH FORWARD ! 14215: * POINTER, ELSE SET TO ZERO. ! 14216: * ! 14217: * CMFFC(XS) SAME AS CMFFP FOR CURRENT CDBLK ! 14218: * ! 14219: * CMSOP(XS) OFFSET TO WORD IN PREVIOUS CDBLK ! 14220: * TO BE FILLED IN WITH FORWARD PTR ! 14221: * TO NEXT CDBLK FOR SUCCESS GOTO. ! 14222: * ZERO IF NO FILL IN IS REQUIRED. ! 14223: * ! 14224: * CMSOC(XS) SAME AS CMSOP FOR CURRENT CDBLK. ! 14225: * ! 14226: * CMLBL(XS) POINTER TO VRBLK FOR LABEL OF ! 14227: * CURRENT STATEMENT. ZERO IF NO LABEL ! 14228: * ! 14229: * CMTRA(XS) POINTER TO CDBLK FOR ENTRY STMNT. ! 14230: EJC ! 14231: * ! 14232: * CMPIL (CONTINUED) ! 14233: * ! 14234: * ENTRY POINT ! 14235: * ! 14236: CMPIL PRC E,0 ENTRY POINT ! 14237: LCT WB,=CMNEN SET NUMBER OF STACK WORK LOCATIONS ! 14238: * ! 14239: * LOOP TO INITIALIZE STACK WORKING LOCATIONS ! 14240: * ! 14241: CMP00 ZER -(XS) STORE A ZERO, MAKE ONE ENTRY ! 14242: BCT WB,CMP00 LOOP BACK UNTIL ALL SET ! 14243: MOV XS,CMPXS SAVE STACK POINTER FOR ERROR SEC ! 14244: SSS CMPSS SAVE S-R STACK POINTER IF ANY ! 14245: * ! 14246: * LOOP THROUGH STATEMENTS ! 14247: * ! 14248: CMP01 MOV SCNPT,WB SET SCAN POINTER OFFSET ! 14249: MOV WB,SCNSE SET START OF ELEMENT LOCATION ! 14250: MOV =OCER$,WA POINT TO COMPILE ERROR CALL ! 14251: JSR CDWRD GENERATE AS TEMPORARY CDFAL ! 14252: BLT WB,SCNIL,CMP04 JUMP IF CHARS LEFT ON THIS IMAGE ! 14253: * ! 14254: * LOOP HERE AFTER COMMENT OR CONTROL CARD ! 14255: * ALSO SPECIAL ENTRY AFTER CONTROL CARD ERROR ! 14256: * ! 14257: CMPCE ZER XR CLEAR POSSIBLE GARBAGE XR VALUE ! 14258: BNE STAGE,=STGIC,CMP02 SKIP UNLESS INITIAL COMPILE ! 14259: JSR READR READ NEXT INPUT IMAGE ! 14260: BZE XR,CMP09 JUMP IF NO INPUT AVAILABLE ! 14261: JSR NEXTS ACQUIRE NEXT SOURCE IMAGE ! 14262: MOV CMPSN,LSTSN STORE STMT NO FOR USE BY LISTR ! 14263: ZER SCNPT RESET SCAN POINTER ! 14264: BRN CMP04 GO PROCESS IMAGE ! 14265: * ! 14266: * FOR EXECUTE TIME COMPILE, PERMIT EMBEDDED CONTROL CARDS ! 14267: * AND COMMENTS (BY SKIPPING TO NEXT SEMI-COLON) ! 14268: * ! 14269: CMP02 MOV R$CIM,XR GET CURRENT IMAGE ! 14270: MOV SCNPT,WB GET CURRENT OFFSET ! 14271: PLC XR,WB PREPARE TO GET CHARS ! 14272: * ! 14273: * SKIP TO SEMI-COLON ! 14274: * ! 14275: CMP03 LCH WC,(XR)+ GET CHAR ! 14276: ICV SCNPT ADVANCE OFFSET ! 14277: BEQ WC,=CH$SM,CMP04 SKIP IF SEMI-COLON FOUND ! 14278: BLT SCNPT,SCNIL,CMP03 LOOP IF MORE CHARS ! 14279: ZER XR CLEAR GARBAGE XR VALUE ! 14280: BRN CMP09 END OF IMAGE ! 14281: EJC ! 14282: * ! 14283: * CMPIL (CONTINUED) ! 14284: * ! 14285: * HERE WITH IMAGE AVAILABLE TO SCAN. NOTE THAT IF THE INPUT ! 14286: * STRING IS NULL, THEN EVERYTHING IS OK SINCE NULL IS ! 14287: * ACTUALLY ASSEMBLED AS A WORD OF BLANKS. ! 14288: * ! 14289: CMP04 MOV R$CIM,XR POINT TO CURRENT IMAGE ! 14290: MOV SCNPT,WB LOAD CURRENT OFFSET ! 14291: MOV WB,WA COPY FOR LABEL SCAN ! 14292: PLC XR,WB POINT TO FIRST CHARACTER ! 14293: LCH WC,(XR)+ LOAD FIRST CHARACTER ! 14294: BEQ WC,=CH$SM,CMP12 NO LABEL IF SEMICOLON ! 14295: BEQ WC,=CH$AS,CMPCE LOOP BACK IF COMMENT CARD ! 14296: BEQ WC,=CH$MN,CMP32 JUMP IF CONTROL CARD ! 14297: MOV R$CIM,R$CMP ABOUT TO DESTROY R$CIM ! 14298: MOV =CMLAB,XL POINT TO LABEL WORK STRING ! 14299: MOV XL,R$CIM SCANE IS TO SCAN WORK STRING ! 14300: PSC XL POINT TO FIRST CHARACTER POSITION ! 14301: SCH WC,(XL)+ STORE CHAR JUST LOADED ! 14302: MOV =CH$SM,WC GET A SEMICOLON ! 14303: SCH WC,(XL) STORE AFTER FIRST CHAR ! 14304: CSC XL FINISHED CHARACTER STORING ! 14305: ZER XL CLEAR POINTER ! 14306: ZER SCNPT START AT FIRST CHARACTER ! 14307: MOV SCNIL,-(XS) PRESERVE IMAGE LENGTH ! 14308: MOV =NUM02,SCNIL READ 2 CHARS AT MOST ! 14309: JSR SCANE SCAN FIRST CHAR FOR TYPE ! 14310: MOV (XS)+,SCNIL RESTORE IMAGE LENGTH ! 14311: MOV XL,WC NOTE RETURN CODE ! 14312: MOV R$CMP,XL GET OLD R$CIM ! 14313: MOV XL,R$CIM PUT IT BACK ! 14314: MOV WB,SCNPT REINSTATE OFFSET ! 14315: BNZ SCNBL,CMP12 BLANK SEEN - CANT BE LABEL ! 14316: MOV XL,XR POINT TO CURRENT IMAGE ! 14317: PLC XR,WB POINT TO FIRST CHAR AGAIN ! 14318: BEQ WC,=T$VAR,CMP06 OK IF LETTER ! 14319: BEQ WC,=T$CON,CMP06 OK IF DIGIT ! 14320: * ! 14321: * DROP IN OR JUMP FROM ERROR SECTION IF SCANE FAILED ! 14322: * ! 14323: CMPLE MOV R$CMP,R$CIM POINT TO BAD LINE ! 14324: ERB 214,BAD LABEL OR MISPLACED CONTINUATION LINE ! 14325: * ! 14326: * LOOP TO SCAN LABEL ! 14327: * ! 14328: CMP05 BEQ WC,=CH$SM,CMP07 SKIP IF SEMICOLON ! 14329: ICV WA BUMP OFFSET ! 14330: BEQ WA,SCNIL,CMP07 JUMP IF END OF IMAGE (LABEL END) ! 14331: EJC ! 14332: * ! 14333: * CMPIL (CONTINUED) ! 14334: * ! 14335: * ENTER LOOP AT THIS POINT ! 14336: * ! 14337: CMP06 LCH WC,(XR)+ ELSE LOAD NEXT CHARACTER ! 14338: .IF .CAHT ! 14339: BEQ WC,=CH$HT,CMP07 JUMP IF HORIZONTAL TAB ! 14340: .FI ! 14341: .IF .CAVT ! 14342: BEQ WC,=CH$VT,CMP07 JUMP IF VERTICAL TAB ! 14343: .FI ! 14344: BNE WC,=CH$BL,CMP05 LOOP BACK IF NON-BLANK ! 14345: * ! 14346: * HERE AFTER SCANNING OUT LABEL ! 14347: * ! 14348: CMP07 MOV WA,SCNPT SAVE UPDATED SCAN OFFSET ! 14349: SUB WB,WA GET LENGTH OF LABEL ! 14350: BZE WA,CMP12 SKIP IF LABEL LENGTH ZERO ! 14351: ZER XR CLEAR GARBAGE XR VALUE ! 14352: JSR SBSTR BUILD SCBLK FOR LABEL NAME ! 14353: JSR GTNVR LOCATE/CONTRUCT VRBLK ! 14354: PPM DUMMY (IMPOSSIBLE) ERROR RETURN ! 14355: MOV XR,CMLBL(XS) STORE LABEL POINTER ! 14356: BNZ VRLEN(XR),CMP11 JUMP IF NOT SYSTEM LABEL ! 14357: BNE VRSVP(XR),=V$END,CMP11 JUMP IF NOT END LABEL ! 14358: * ! 14359: * HERE FOR END LABEL SCANNED OUT ! 14360: * ! 14361: ADD =STGND,STAGE ADJUST STAGE APPROPRIATELY ! 14362: JSR SCANE SCAN OUT NEXT ELEMENT ! 14363: BEQ XL,=T$SMC,CMP10 JUMP IF END OF IMAGE ! 14364: BNE XL,=T$VAR,CMP08 ELSE ERROR IF NOT VARIABLE ! 14365: * ! 14366: * HERE CHECK FOR VALID INITIAL TRANSFER ! 14367: * ! 14368: BEQ VRLBL(XR),=STNDL,CMP08 JUMP IF NOT DEFINED (ERROR) ! 14369: MOV VRLBL(XR),CMTRA(XS) ELSE SET INITIAL ENTRY POINTER ! 14370: JSR SCANE SCAN NEXT ELEMENT ! 14371: BEQ XL,=T$SMC,CMP10 JUMP IF OK (END OF IMAGE) ! 14372: * ! 14373: * HERE FOR BAD TRANSFER LABEL ! 14374: * ! 14375: CMP08 ERB 215,SYNTAX ERROR. UNDEFINED OR ERRONEOUS ENTRY LABEL ! 14376: * ! 14377: * HERE FOR END OF INPUT (NO END LABEL DETECTED) ! 14378: * ! 14379: CMP09 ADD =STGND,STAGE ADJUST STAGE APPROPRIATELY ! 14380: BEQ STAGE,=STGXE,CMP10 JUMP IF CODE CALL (OK) ! 14381: ERB 216,SYNTAX ERROR. MISSING END LINE ! 14382: * ! 14383: * HERE AFTER PROCESSING END LINE (MERGE HERE ON END ERROR) ! 14384: * ! 14385: CMP10 MOV =OSTP$,WA SET STOP CALL POINTER ! 14386: JSR CDWRD GENERATE AS STATEMENT CALL ! 14387: BRN CMPSE JUMP TO GENERATE AS FAILURE ! 14388: EJC ! 14389: * ! 14390: * CMPIL (CONTINUED) ! 14391: * ! 14392: * HERE AFTER PROCESSING LABEL OTHER THAN END ! 14393: * ! 14394: CMP11 BNE STAGE,=STGIC,CMP12 JUMP IF CODE CALL - REDEF. OK ! 14395: BEQ VRLBL(XR),=STNDL,CMP12 ELSE CHECK FOR REDEFINITION ! 14396: ZER CMLBL(XS) LEAVE FIRST LABEL DECLN UNDISTURBED ! 14397: ERB 217,SYNTAX ERROR. DUPLICATE LABEL ! 14398: * ! 14399: * HERE AFTER DEALING WITH LABEL ! 14400: * ! 14401: CMP12 ZER WB SET FLAG FOR STATEMENT BODY ! 14402: JSR EXPAN GET TREE FOR STATEMENT BODY ! 14403: MOV XR,CMSTM(XS) STORE FOR LATER USE ! 14404: ZER CMSGO(XS) CLEAR SUCCESS GOTO POINTER ! 14405: ZER CMFGO(XS) CLEAR FAILURE GOTO POINTER ! 14406: ZER CMCGO(XS) CLEAR CONDITIONAL GOTO FLAG ! 14407: JSR SCANE SCAN NEXT ELEMENT ! 14408: BNE XL,=T$COL,CMP18 JUMP IT NOT COLON (NO GOTO) ! 14409: * ! 14410: * LOOP TO PROCESS GOTO FIELDS ! 14411: * ! 14412: CMP13 MNZ SCNGO SET GOTO FLAG ! 14413: JSR SCANE SCAN NEXT ELEMENT ! 14414: BEQ XL,=T$SMC,CMP31 JUMP IF NO FIELDS LEFT ! 14415: BEQ XL,=T$SGO,CMP14 JUMP IF S FOR SUCCESS GOTO ! 14416: BEQ XL,=T$FGO,CMP16 JUMP IF F FOR FAILURE GOTO ! 14417: * ! 14418: * HERE FOR UNCONDITIONAL GOTO (I.E. NOT F OR S) ! 14419: * ! 14420: MNZ SCNRS SET TO RESCAN ELEMENT NOT F,S ! 14421: JSR SCNGF SCAN OUT GOTO FIELD ! 14422: BNZ CMFGO(XS),CMP17 ERROR IF FGOTO ALREADY ! 14423: MOV XR,CMFGO(XS) ELSE SET AS FGOTO ! 14424: BRN CMP15 MERGE WITH SGOTO CIRCUIT ! 14425: * ! 14426: * HERE FOR SUCCESS GOTO ! 14427: * ! 14428: CMP14 JSR SCNGF SCAN SUCCESS GOTO FIELD ! 14429: MOV =NUM01,CMCGO(XS) SET CONDITIONAL GOTO FLAG ! 14430: * ! 14431: * UNCONTIONAL GOTO MERGES HERE ! 14432: * ! 14433: CMP15 BNZ CMSGO(XS),CMP17 ERROR IF SGOTO ALREADY GIVEN ! 14434: MOV XR,CMSGO(XS) ELSE SET SGOTO ! 14435: BRN CMP13 LOOP BACK FOR NEXT GOTO FIELD ! 14436: * ! 14437: * HERE FOR FAILURE GOTO ! 14438: * ! 14439: CMP16 JSR SCNGF SCAN GOTO FIELD ! 14440: MOV =NUM01,CMCGO(XS) SET CONDITONAL GOTO FLAG ! 14441: BNZ CMFGO(XS),CMP17 ERROR IF FGOTO ALREADY GIVEN ! 14442: MOV XR,CMFGO(XS) ELSE STORE FGOTO POINTER ! 14443: BRN CMP13 LOOP BACK FOR NEXT FIELD ! 14444: EJC ! 14445: * ! 14446: * CMPIL (CONTINUED) ! 14447: * ! 14448: * HERE FOR DUPLICATED GOTO FIELD ! 14449: * ! 14450: CMP17 ERB 218,SYNTAX ERROR. DUPLICATED GOTO FIELD ! 14451: * ! 14452: * HERE TO GENERATE CODE ! 14453: * ! 14454: CMP18 ZER SCNSE STOP POSITIONAL ERROR FLAGS ! 14455: MOV CMSTM(XS),XR LOAD TREE PTR FOR STATEMENT BODY ! 14456: ZER WB COLLECTABLE VALUE FOR WB FOR CDGVL ! 14457: ZER WC RESET CONSTANT FLAG FOR CDGVL ! 14458: JSR EXPAP TEST FOR PATTERN MATCH ! 14459: PPM CMP19 JUMP IF NOT PATTERN MATCH ! 14460: MOV =OPMS$,CMOPN(XR) ELSE SET PATTERN MATCH POINTER ! 14461: MOV =C$PMT,CMTYP(XR) ! 14462: * ! 14463: * HERE AFTER DEALING WITH SPECIAL PATTERN MATCH CASE ! 14464: * ! 14465: CMP19 JSR CDGVL GENERATE CODE FOR BODY OF STATEMENT ! 14466: MOV CMSGO(XS),XR LOAD SGOTO POINTER ! 14467: MOV XR,WA COPY IT ! 14468: BZE XR,CMP21 JUMP IF NO SUCCESS GOTO ! 14469: ZER CMSOC(XS) CLEAR SUCCESS OFFSET FILLIN PTR ! 14470: BHI XR,STATE,CMP20 JUMP IF COMPLEX GOTO ! 14471: * ! 14472: * HERE FOR SIMPLE SUCCESS GOTO (LABEL) ! 14473: * ! 14474: ADD *VRTRA,WA POINT TO VRTRA FIELD AS REQUIRED ! 14475: JSR CDWRD GENERATE SUCCESS GOTO ! 14476: BRN CMP22 JUMP TO DEAL WITH FGOTO ! 14477: * ! 14478: * HERE FOR COMPLEX SUCCESS GOTO ! 14479: * ! 14480: CMP20 BEQ XR,CMFGO(XS),CMP22 NO CODE IF SAME AS FGOTO ! 14481: ZER WB ELSE SET OK VALUE FOR CDGVL IN WB ! 14482: JSR CDGCG GENERATE CODE FOR SUCCESS GOTO ! 14483: BRN CMP22 JUMP TO DEAL WITH FGOTO ! 14484: * ! 14485: * HERE FOR NO SUCCESS GOTO ! 14486: * ! 14487: CMP21 MOV CWCOF,CMSOC(XS) SET SUCCESS FILL IN OFFSET ! 14488: MOV =OCER$,WA POINT TO COMPILE ERROR CALL ! 14489: JSR CDWRD GENERATE AS TEMPORARY VALUE ! 14490: EJC ! 14491: * ! 14492: * CMPIL (CONTINUED) ! 14493: * ! 14494: * HERE TO DEAL WITH FAILURE GOTO ! 14495: * ! 14496: CMP22 MOV CMFGO(XS),XR LOAD FAILURE GOTO POINTER ! 14497: MOV XR,WA COPY IT ! 14498: ZER CMFFC(XS) SET NO FILL IN REQUIRED YET ! 14499: BZE XR,CMP23 JUMP IF NO FAILURE GOTO GIVEN ! 14500: ADD *VRTRA,WA POINT TO VRTRA FIELD IN CASE ! 14501: BLO XR,STATE,CMPSE JUMP TO GEN IF SIMPLE FGOTO ! 14502: * ! 14503: * HERE FOR COMPLEX FAILURE GOTO ! 14504: * ! 14505: MOV CWCOF,WB SAVE OFFSET TO O$GOF CALL ! 14506: MOV =OGOF$,WA POINT TO FAILURE GOTO CALL ! 14507: JSR CDWRD GENERATE ! 14508: MOV =OFIF$,WA POINT TO FAIL IN FAIL WORD ! 14509: JSR CDWRD GENERATE ! 14510: JSR CDGCG GENERATE CODE FOR FAILURE GOTO ! 14511: MOV WB,WA COPY OFFSET TO O$GOF FOR CDFAL ! 14512: MOV =B$CDC,WB SET COMPLEX CASE CDTYP ! 14513: BRN CMP25 JUMP TO BUILD CDBLK ! 14514: * ! 14515: * HERE IF NO FAILURE GOTO GIVEN ! 14516: * ! 14517: CMP23 MOV =OUNF$,WA LOAD UNEXPECTED FAILURE CALL IN CAS ! 14518: MOV CSWFL,WC GET -NOFAIL FLAG ! 14519: ORB CMCGO(XS),WC CHECK IF CONDITIONAL GOTO ! 14520: ZRB WC,CMPSE JUMP IF -NOFAIL AND NO COND. GOTO ! 14521: MNZ CMFFC(XS) ELSE SET FILL IN FLAG ! 14522: MOV =OCER$,WA AND SET COMPILE ERROR FOR TEMPORARY ! 14523: * ! 14524: * MERGE HERE WITH CDFAL VALUE IN WA, SIMPLE CDBLK ! 14525: * ALSO SPECIAL ENTRY AFTER STATEMENT ERROR ! 14526: * ! 14527: CMPSE MOV =B$CDS,WB SET CDTYP FOR SIMPLE CASE ! 14528: EJC ! 14529: * ! 14530: * CMPIL (CONTINUED) ! 14531: * ! 14532: * MERGE HERE TO BUILD CDBLK ! 14533: * ! 14534: * (WA) CDFAL VALUE TO BE GENERATED ! 14535: * (WB) CDTYP VALUE TO BE GENERATED ! 14536: * ! 14537: * AT THIS STAGE, WE CHOP OFF AN APPROPRIATE CHUNK OF THE ! 14538: * CURRENT CCBLK AND CONVERT IT INTO A CDBLK. THE REMAINDER ! 14539: * OF THE CCBLK IS REFORMATTED TO BE THE NEW CCBLK. ! 14540: * ! 14541: CMP25 MOV R$CCB,XR POINT TO CCBLK ! 14542: MOV CMLBL(XS),XL GET POSSIBLE LABEL POINTER ! 14543: BZE XL,CMP26 SKIP IF NO LABEL ! 14544: ZER CMLBL(XS) CLEAR FLAG FOR NEXT STATEMENT ! 14545: MOV XR,VRLBL(XL) PUT CDBLK PTR IN VRBLK LABEL FIELD ! 14546: * ! 14547: * MERGE AFTER DOING LABEL ! 14548: * ! 14549: CMP26 MOV WB,(XR) SET TYPE WORD FOR NEW CDBLK ! 14550: MOV WA,CDFAL(XR) SET FAILURE WORD ! 14551: MOV XR,XL COPY POINTER TO CCBLK ! 14552: MOV CCUSE(XR),WB LOAD LENGTH GEN (= NEW CDLEN) ! 14553: MOV CCLEN(XR),WC LOAD TOTAL CCBLK LENGTH ! 14554: ADD WB,XL POINT PAST CDBLK ! 14555: SUB WB,WC GET LENGTH LEFT FOR CHOP OFF ! 14556: MOV =B$CCT,(XL) SET TYPE CODE FOR NEW CCBLK AT END ! 14557: MOV *CCCOD,CCUSE(XL) SET INITIAL CODE OFFSET ! 14558: MOV *CCCOD,CWCOF REINITIALISE CWCOF ! 14559: MOV WC,CCLEN(XL) SET NEW LENGTH ! 14560: MOV XL,R$CCB SET NEW CCBLK POINTER ! 14561: MOV CMPSN,CDSTM(XR) SET STATEMENT NUMBER ! 14562: ICV CMPSN BUMP STATEMENT NUMBER ! 14563: * ! 14564: * SET POINTERS IN PREVIOUS CODE BLOCK AS REQUIRED ! 14565: * ! 14566: MOV CMPCD(XS),XL LOAD PTR TO PREVIOUS CDBLK ! 14567: BZE CMFFP(XS),CMP27 JUMP IF NO FAILURE FILL IN REQUIRED ! 14568: MOV XR,CDFAL(XL) ELSE SET FAILURE PTR IN PREVIOUS ! 14569: * ! 14570: * HERE TO DEAL WITH SUCCESS FORWARD POINTER ! 14571: * ! 14572: CMP27 MOV CMSOP(XS),WA LOAD SUCCESS OFFSET ! 14573: BZE WA,CMP28 JUMP IF NO FILL IN REQUIRED ! 14574: ADD WA,XL ELSE POINT TO FILL IN LOCATION ! 14575: MOV XR,(XL) STORE FORWARD POINTER ! 14576: ZER XL CLEAR GARBAGE XL VALUE ! 14577: EJC ! 14578: * ! 14579: * CMPIL (CONTINUED) ! 14580: * ! 14581: * NOW SET FILL IN POINTERS FOR THIS STATEMENT ! 14582: * ! 14583: CMP28 MOV CMFFC(XS),CMFFP(XS) COPY FAILURE FILL IN FLAG ! 14584: MOV CMSOC(XS),CMSOP(XS) COPY SUCCESS FILL IN OFFSET ! 14585: MOV XR,CMPCD(XS) SAVE PTR TO THIS CDBLK ! 14586: BNZ CMTRA(XS),CMP29 JUMP IF INITIAL ENTRY ALREADY SET ! 14587: MOV XR,CMTRA(XS) ELSE SET PTR HERE AS DEFAULT ! 14588: * ! 14589: * HERE AFTER COMPILING ONE STATEMENT ! 14590: * ! 14591: CMP29 BLT STAGE,=STGCE,CMP01 JUMP IF NOT END LINE JUST DONE ! 14592: BZE CSWLS,CMP30 SKIP IF -NOLIST ! 14593: JSR LISTR LIST LAST LINE ! 14594: * ! 14595: * RETURN ! 14596: * ! 14597: CMP30 MOV CMTRA(XS),XR LOAD INITIAL ENTRY CDBLK POINTER ! 14598: ADD *CMNEN,XS POP WORK LOCATIONS OFF STACK ! 14599: EXI AND RETURN TO CMPIL CALLER ! 14600: * ! 14601: * HERE AT END OF GOTO FIELD ! 14602: * ! 14603: CMP31 MOV CMFGO(XS),WB GET FAIL GOTO ! 14604: ORB CMSGO(XS),WB OR IN SUCCESS GOTO ! 14605: BNZ WB,CMP18 OK IF NON-NULL FIELD ! 14606: ERB 219,SYNTAX ERROR. EMPTY GOTO FIELD ! 14607: * ! 14608: * CONTROL CARD FOUND ! 14609: * ! 14610: CMP32 ICV WB POINT PAST CH$MN ! 14611: JSR CNCRD PROCESS CONTROL CARD ! 14612: ZER SCNSE CLEAR START OF ELEMENT LOC. ! 14613: BRN CMPCE LOOP FOR NEXT STATEMENT ! 14614: ENP END PROCEDURE CMPIL ! 14615: EJC ! 14616: * ! 14617: * CNCRD -- CONTROL CARD PROCESSOR ! 14618: * ! 14619: * CALLED TO DEAL WITH CONTROL CARDS ! 14620: * ! 14621: * R$CIM POINTS TO CURRENT IMAGE ! 14622: * (WB) OFFSET TO 1ST CHAR OF CONTROL CARD ! 14623: * JSR CNCRD CALL TO PROCESS CONTROL CARDS ! 14624: * (XL,XR,WA,WB,WC,IA) DESTROYED ! 14625: * ! 14626: CNCRD PRC E,0 ENTRY POINT ! 14627: MOV WB,SCNPT OFFSET FOR CONTROL CARD SCAN ! 14628: MOV =CCNOC,WA NUMBER OF CHARS FOR COMPARISON ! 14629: CTW WA,0 CONVERT TO WORD COUNT ! 14630: MOV WA,CNSWC SAVE WORD COUNT ! 14631: * ! 14632: * LOOP HERE IF MORE THAN ONE CONTROL CARD ! 14633: * ! 14634: CNC01 BGE SCNPT,SCNIL,CNC09 RETURN IF END OF IMAGE ! 14635: MOV R$CIM,XR POINT TO IMAGE ! 14636: PLC XR,SCNPT CHAR PTR FOR FIRST CHAR ! 14637: LCH WA,(XR)+ GET FIRST CHAR ! 14638: .IF .CULC ! 14639: FLC WA FOLD TO UPPER CASE ! 14640: .FI ! 14641: BEQ WA,=CH$LI,CNC07 SPECIAL CASE OF -INXXX ! 14642: MNZ SCNCC SET FLAG FOR SCANE ! 14643: JSR SCANE SCAN CARD NAME ! 14644: ZER SCNCC CLEAR SCANE FLAG ! 14645: BNZ XL,CNC06 FAIL UNLESS CONTROL CARD NAME ! 14646: MOV =CCNOC,WA NO. OF CHARS TO BE COMPARED ! 14647: BLT SCLEN(XR),WA,CNC06 FAIL IF TOO FEW CHARS ! 14648: MOV XR,XL POINT TO CONTROL CARD NAME ! 14649: ZER WB ZERO OFFSET FOR SUBSTRING ! 14650: JSR SBSTR EXTRACT SUBSTRING FOR COMPARISON ! 14651: .IF .CULC ! 14652: MOV SCLEN(XR),WA RELOAD LENGTH ! 14653: JSR FLSTG FOLD TO UPPER CASE ! 14654: .FI ! 14655: MOV XR,CNSCC KEEP CONTROL CARD SUBSTRING PTR ! 14656: MOV =CCNMS,XR POINT TO LIST OF STANDARD NAMES ! 14657: ZER WB INITIALISE NAME OFFSET ! 14658: LCT WC,=CC$NC NUMBER OF STANDARD NAMES ! 14659: * ! 14660: * TRY TO MATCH NAME ! 14661: * ! 14662: CNC02 MOV CNSCC,XL POINT TO NAME ! 14663: LCT WA,CNSWC COUNTER FOR INNER LOOP ! 14664: BRN CNC04 JUMP INTO LOOP ! 14665: * ! 14666: * INNER LOOP TO MATCH CARD NAME CHARS ! 14667: * ! 14668: CNC03 ICA XR BUMP STANDARD NAMES PTR ! 14669: ICA XL BUMP NAME POINTER ! 14670: * ! 14671: * HERE TO INITIATE THE LOOP ! 14672: * ! 14673: CNC04 CNE SCHAR(XL),(XR),CNC05 COMP. UP TO CFP$C CHARS AT ONCE ! 14674: BCT WA,CNC03 LOOP IF MORE WORDS TO COMPARE ! 14675: EJC ! 14676: * ! 14677: * CNCRD (CONTINUED) ! 14678: * ! 14679: * MATCHED - BRANCH ON CARD OFFSET ! 14680: * ! 14681: MOV WB,XL GET NAME OFFSET ! 14682: BSW XL,CC$NC SWITCH ! 14683: .IF .CULC ! 14684: IFF CC$CA,CNC37 -CASE ! 14685: .FI ! 14686: IFF CC$DO,CNC10 -DOUBLE ! 14687: IFF CC$DU,CNC11 -DUMP ! 14688: IFF CC$EJ,CNC12 -EJECT ! 14689: IFF CC$ER,CNC13 -ERRORS ! 14690: IFF CC$EX,CNC14 -EXECUTE ! 14691: IFF CC$FA,CNC15 -FAIL ! 14692: IFF CC$LI,CNC16 -LIST ! 14693: IFF CC$NR,CNC17 -NOERRORS ! 14694: IFF CC$NX,CNC18 -NOEXECUTE ! 14695: IFF CC$NF,CNC19 -NOFAIL ! 14696: IFF CC$NL,CNC20 -NOLIST ! 14697: IFF CC$NO,CNC21 -NOOPT ! 14698: IFF CC$NP,CNC22 -NOPRINT ! 14699: IFF CC$OP,CNC24 -OPTIMISE ! 14700: IFF CC$PR,CNC25 -PRINT ! 14701: IFF CC$SI,CNC27 -SINGLE ! 14702: IFF CC$SP,CNC28 -SPACE ! 14703: IFF CC$ST,CNC31 -STITLE ! 14704: IFF CC$TI,CNC32 -TITLE ! 14705: IFF CC$TR,CNC36 -TRACE ! 14706: ESW END SWITCH ! 14707: * ! 14708: * NOT MATCHED YET. ALIGN STD NAMES PTR AND TRY AGAIN ! 14709: * ! 14710: CNC05 ICA XR BUMP STANDARD NAMES PTR ! 14711: BCT WA,CNC05 LOOP ! 14712: ICV WB BUMP NAMES OFFSET ! 14713: BCT WC,CNC02 CONTINUE IF MORE NAMES ! 14714: * ! 14715: * INVALID CONTROL CARD NAME ! 14716: * ! 14717: CNC06 ERB 247,INVALID CONTROL CARD ! 14718: * ! 14719: * SPECIAL PROCESSING FOR -INXXX ! 14720: * ! 14721: CNC07 LCH WA,(XR) GET NEXT CHAR ! 14722: .IF .CULC ! 14723: FLC WA FOLD TO UPPER CASE ! 14724: .FI ! 14725: BNE WA,=CH$LN,CNC06 FAIL IF NOT LETTER N ! 14726: ADD =NUM02,SCNPT BUMP OFFSET PAST -IN ! 14727: JSR SCANE SCAN INTEGER AFTER -IN ! 14728: MOV XR,-(XS) STACK SCANNED ITEM ! 14729: JSR GTSMI CHECK IF INTEGER ! 14730: PPM CNC06 FAIL IF NOT INTEGER ! 14731: PPM CNC06 FAIL IF NEGATIVE OR LARGE ! 14732: MOV XR,CSWIN KEEP INTEGER ! 14733: EJC ! 14734: * ! 14735: * CNCRD (CONTINUED) ! 14736: * ! 14737: * CHECK FOR MORE CONTROL CARDS BEFORE RETURNING ! 14738: * ! 14739: CNC08 MOV SCNPT,WA PRESERVE IN CASE XEQ TIME COMPILE ! 14740: JSR SCANE LOOK FOR COMMA ! 14741: BEQ XL,=T$CMA,CNC01 LOOP IF COMMA FOUND ! 14742: MOV WA,SCNPT RESTORE SCNPT IN CASE XEQ TIME ! 14743: * ! 14744: * RETURN POINT ! 14745: * ! 14746: CNC09 EXI RETURN ! 14747: * ! 14748: * -DOUBLE ! 14749: * ! 14750: CNC10 MNZ CSWDB SET SWITCH ! 14751: BRN CNC08 MERGE ! 14752: * ! 14753: * -DUMP ! 14754: * THIS IS USED FOR SYSTEM DEBUGGING . IT HAS THE EFFECT OF ! 14755: * PRODUCING A CORE DUMP AT COMPILATION TIME ! 14756: * ! 14757: CNC11 JSR SYSDM CALL DUMPER ! 14758: BRN CNC09 FINISHED ! 14759: * ! 14760: * -EJECT ! 14761: * ! 14762: CNC12 BZE CSWLS,CNC09 RETURN IF -NOLIST ! 14763: JSR PRTPS EJECT ! 14764: JSR LISTT LIST TITLE ! 14765: BRN CNC09 FINISHED ! 14766: * ! 14767: * -ERRORS ! 14768: * ! 14769: CNC13 ZER CSWER CLEAR SWITCH ! 14770: BRN CNC08 MERGE ! 14771: * ! 14772: * -EXECUTE ! 14773: * ! 14774: CNC14 ZER CSWEX CLEAR SWITCH ! 14775: BRN CNC08 MERGE ! 14776: * ! 14777: * -FAIL ! 14778: * ! 14779: CNC15 MNZ CSWFL SET SWITCH ! 14780: BRN CNC08 MERGE ! 14781: * ! 14782: * -LIST ! 14783: * ! 14784: CNC16 MNZ CSWLS SET SWITCH ! 14785: BEQ STAGE,=STGIC,CNC08 DONE IF COMPILE TIME ! 14786: * ! 14787: * LIST CODE LINE IF EXECUTE TIME COMPILE ! 14788: * ! 14789: ZER LSTPF PERMIT LISTING ! 14790: JSR LISTR LIST LINE ! 14791: BRN CNC08 MERGE ! 14792: EJC ! 14793: * ! 14794: * CNCRD (CONTINUED) ! 14795: * ! 14796: * -NOERRORS ! 14797: * ! 14798: CNC17 MNZ CSWER SET SWITCH ! 14799: BRN CNC08 MERGE ! 14800: * ! 14801: * -NOEXECUTE ! 14802: * ! 14803: CNC18 MNZ CSWEX SET SWITCH ! 14804: BRN CNC08 MERGE ! 14805: * ! 14806: * -NOFAIL ! 14807: * ! 14808: CNC19 ZER CSWFL CLEAR SWITCH ! 14809: BRN CNC08 MERGE ! 14810: * ! 14811: * -NOLIST ! 14812: * ! 14813: CNC20 ZER CSWLS CLEAR SWITCH ! 14814: BRN CNC08 MERGE ! 14815: * ! 14816: * -NOOPTIMISE ! 14817: * ! 14818: CNC21 MNZ CSWNO SET SWITCH ! 14819: BRN CNC08 MERGE ! 14820: * ! 14821: * -NOPRINT ! 14822: * ! 14823: CNC22 ZER CSWPR CLEAR SWITCH ! 14824: BRN CNC08 MERGE ! 14825: * ! 14826: * -OPTIMISE ! 14827: * ! 14828: CNC24 ZER CSWNO CLEAR SWITCH ! 14829: BRN CNC08 MERGE ! 14830: * ! 14831: * -PRINT ! 14832: * ! 14833: CNC25 MNZ CSWPR SET SWITCH ! 14834: BRN CNC08 MERGE ! 14835: EJC ! 14836: * ! 14837: * CNCRD (CONTINUED) ! 14838: * ! 14839: * -SINGLE ! 14840: * ! 14841: CNC27 ZER CSWDB CLEAR SWITCH ! 14842: BRN CNC08 MERGE ! 14843: * ! 14844: * -SPACE ! 14845: * ! 14846: CNC28 BZE CSWLS,CNC09 RETURN IF -NOLIST ! 14847: JSR SCANE SCAN INTEGER AFTER -SPACE ! 14848: MOV =NUM01,WC 1 SPACE IN CASE ! 14849: BEQ XR,=T$SMC,CNC29 JUMP IF NO INTEGER ! 14850: MOV XR,-(XS) STACK IT ! 14851: JSR GTSMI CHECK INTEGER ! 14852: PPM CNC06 FAIL IF NOT INTEGER ! 14853: PPM CNC06 FAIL IF NEGATIVE OR LARGE ! 14854: BNZ WC,CNC29 JUMP IF NON ZERO ! 14855: MOV =NUM01,WC ELSE 1 SPACE ! 14856: * ! 14857: * MERGE WITH COUNT OF LINES TO SKIP ! 14858: * ! 14859: CNC29 ADD WC,LSTLC BUMP LINE COUNT ! 14860: LCT WC,WC CONVERT TO LOOP COUNTER ! 14861: BLT LSTLC,LSTNP,CNC30 JUMP IF FITS ON PAGE ! 14862: JSR PRTPS EJECT ! 14863: JSR LISTT LIST TITLE ! 14864: BRN CNC09 MERGE ! 14865: * ! 14866: * SKIP LINES ! 14867: * ! 14868: CNC30 JSR PRTNL PRINT A BLANK ! 14869: BCT WC,CNC30 LOOP ! 14870: BRN CNC09 MERGE ! 14871: EJC ! 14872: * ! 14873: * CNCRD (CONTINUED) ! 14874: * ! 14875: * -STITL ! 14876: * ! 14877: CNC31 MOV =R$STL,CNR$T PTR TO R$STL ! 14878: BRN CNC33 MERGE ! 14879: * ! 14880: * -TITLE ! 14881: * ! 14882: CNC32 MOV =NULLS,R$STL CLEAR SUBTITLE ! 14883: MOV =R$TTL,CNR$T PTR TO R$TTL ! 14884: * ! 14885: * COMMON PROCESSING FOR -TITLE, -STITL ! 14886: * ! 14887: CNC33 MOV =NULLS,XR NULL IN CASE NEEDED ! 14888: MNZ CNTTL SET FLAG FOR NEXT LISTR CALL ! 14889: MOV =CCOFS,WB OFFSET TO TITLE/SUBTITLE ! 14890: MOV SCNIL,WA INPUT IMAGE LENGTH ! 14891: BLO WA,WB,CNC34 JUMP IF NO CHARS LEFT ! 14892: SUB WB,WA NO OF CHARS TO EXTRACT ! 14893: MOV R$CIM,XL POINT TO IMAGE ! 14894: JSR SBSTR GET TITLE/SUBTITLE ! 14895: * ! 14896: * STORE TITLE/SUBTITLE ! 14897: * ! 14898: CNC34 MOV CNR$T,XL POINT TO STORAGE LOCATION ! 14899: MOV XR,(XL) STORE TITLE/SUBTITLE ! 14900: BEQ XL,=R$STL,CNC09 RETURN IF STITL ! 14901: BNZ PRECL,CNC09 RETURN IF EXTENDED LISTING ! 14902: BZE PRICH,CNC09 RETURN IF REGULAR PRINTER ! 14903: MOV SCLEN(XR),XL GET LENGTH OF TITLE ! 14904: MOV XL,WA COPY IT ! 14905: BZE XL,CNC35 JUMP IF NULL ! 14906: ADD =NUM10,XL INCREMENT ! 14907: BHI XL,PRLEN,CNC09 USE DEFAULT LSTP0 VAL IF TOO LONG ! 14908: ADD =NUM04,WA POINT JUST PAST TITLE ! 14909: * ! 14910: * STORE OFFSET TO PAGE NN MESSAGE FOR SHORT TITLE ! 14911: * ! 14912: CNC35 MOV WA,LSTPO STORE OFFSET ! 14913: BRN CNC09 RETURN ! 14914: * ! 14915: * -TRACE ! 14916: * PROVIDED FOR SYSTEM DEBUGGING. TOGGLES THE SYSTEM LABEL ! 14917: * TRACE SWITCH AT COMPILE TIME ! 14918: * ! 14919: CNC36 JSR SYSTT TOGGLE SWITCH ! 14920: BRN CNC08 MERGE ! 14921: .IF .CULC ! 14922: * ! 14923: * -CASE ! 14924: * SETS VALUE OF KVCAS SO THAT NAMES ARE FOLDED OR NOT ! 14925: * DURING COMPILATION. ! 14926: * ! 14927: CNC37 JSR SCANE SCAN INTEGER AFTER -CASE ! 14928: ZER WC GET 0 IN CASE NONE THERE ! 14929: BEQ XL,=T$SMC,CNC38 SKIP IF NO INTEGER ! 14930: MOV XR,-(XS) STACK IT ! 14931: JSR GTSMI CHECK INTEGER ! 14932: PPM CNC06 FAIL IF NOT INTEGER ! 14933: PPM CNC06 FAIL IF NEGATIVE OR TOO LARGE ! 14934: CNC38 MOV WC,KVCAS STORE NEW CASE VALUE ! 14935: BRN CNC09 MERGE ! 14936: .FI ! 14937: ENP END PROCEDURE CNCRD ! 14938: EJC ! 14939: * ! 14940: * DFFNC -- DEFINE FUNCTION ! 14941: * ! 14942: * DFFNC IS CALLED WHENEVER A NEW FUNCTION IS ASSIGNED TO ! 14943: * A VARIABLE. IT DEALS WITH EXTERNAL FUNCTION USE COUNTS. ! 14944: * ! 14945: * (XR) POINTER TO VRBLK ! 14946: * (XL) POINTER TO NEW FUNCTION BLOCK ! 14947: * JSR DFFNC CALL TO DEFINE FUNCTION ! 14948: * (WA,WB) DESTROYED ! 14949: * ! 14950: DFFNC PRC E,0 ENTRY POINT ! 14951: BNE (XL),=B$EFC,DFFN1 SKIP IF NEW FUNCTION NOT EXTERNAL ! 14952: ICV EFUSE(XL) ELSE INCREMENT ITS USE COUNT ! 14953: * ! 14954: * HERE AFTER DEALING WITH NEW FUNCTION USE COUNT ! 14955: * ! 14956: DFFN1 MOV XR,WA SAVE VRBLK POINTER ! 14957: .IF .CNLD ! 14958: .ELSE ! 14959: MOV VRFNC(XR),XR LOAD OLD FUNCTION POINTER ! 14960: BNE (XR),=B$EFC,DFFN2 JUMP IF OLD FUNCTION NOT EXTERNAL ! 14961: MOV EFUSE(XR),WB ELSE GET USE COUNT ! 14962: DCV WB DECREMENT ! 14963: MOV WB,EFUSE(XR) STORE DECREMENTED VALUE ! 14964: BNZ WB,DFFN2 JUMP IF USE COUNT STILL NON-ZERO ! 14965: JSR SYSUL ELSE CALL SYSTEM UNLOAD FUNCTION ! 14966: .FI ! 14967: * ! 14968: * HERE AFTER DEALING WITH OLD FUNCTION USE COUNT ! 14969: * ! 14970: DFFN2 MOV WA,XR RESTORE VRBLK POINTER ! 14971: MOV XL,WA COPY FUNCTION BLOCK PTR ! 14972: BLT XR,=R$YYY,DFFN3 SKIP CHECKS IF OPSYN OP DEFINITION ! 14973: BNZ VRLEN(XR),DFFN3 JUMP IF NOT SYSTEM VARIABLE ! 14974: * ! 14975: * FOR SYSTEM VARIABLE, CHECK FOR ILLEGAL REDEFINITION ! 14976: * ! 14977: MOV VRSVP(XR),XL POINT TO SVBLK ! 14978: MOV SVBIT(XL),WB LOAD BIT INDICATORS ! 14979: ANB BTFNC,WB IS IT A SYSTEM FUNCTION ! 14980: ZRB WB,DFFN3 REDEF OK IF NOT ! 14981: ERB 248,ATTEMPTED REDEFINITION OF SYSTEM FUNCTION ! 14982: * ! 14983: * HERE IF REDEFINITION IS PERMITTED ! 14984: * ! 14985: DFFN3 MOV WA,VRFNC(XR) STORE NEW FUNCTION POINTER ! 14986: MOV WA,XL RESTORE FUNCTION BLOCK POINTER ! 14987: EXI RETURN TO DFFNC CALLER ! 14988: ENP END PROCEDURE DFFNC ! 14989: EJC ! 14990: * ! 14991: * DTACH -- DETACH I/O ASSOCIATED NAMES ! 14992: * ! 14993: * DETACHES TRBLKS FROM I/O ASSOCIATED VARIABLES, REMOVES ! 14994: * ENTRY FROM IOCHN CHAIN ATTACHED TO FILEARG1 VRBLK AND MAY ! 14995: * REMOVE VRBLK ACCESS AND STORE TRAPS. ! 14996: * INPUT, OUTPUT, TERMINAL ARE HANDLED SPECIALLY. ! 14997: * ! 14998: * (XL) I/O ASSOC. VBL NAME BASE PTR ! 14999: * (WA) OFFSET TO NAME ! 15000: * JSR DTACH CALL FOR DETACH OPERATION ! 15001: * (XL,XR,WA,WB,WC) DESTROYED ! 15002: * ! 15003: DTACH PRC E,0 ENTRY POINT ! 15004: MOV XL,DTCNB STORE NAME BASE (GBCOL NOT CALLED) ! 15005: ADD WA,XL POINT TO NAME LOCATION ! 15006: MOV XL,DTCNM STORE IT ! 15007: * ! 15008: * LOOP TO SEARCH FOR I/O TRBLK ! 15009: * ! 15010: DTCH1 MOV XL,XR COPY NAME POINTER ! 15011: * ! 15012: * CONTINUE AFTER BLOCK DELETION ! 15013: * ! 15014: DTCH2 MOV (XL),XL POINT TO NEXT VALUE ! 15015: BNE (XL),=B$TRT,DTCH6 JUMP AT CHAIN END ! 15016: MOV TRTYP(XL),WA GET TRAP BLOCK TYPE ! 15017: BEQ WA,=TRTIN,DTCH3 JUMP IF INPUT ! 15018: BEQ WA,=TRTOU,DTCH3 JUMP IF OUTPUT ! 15019: ADD *TRNXT,XL POINT TO NEXT LINK ! 15020: BRN DTCH1 LOOP ! 15021: * ! 15022: * DELETE AN OLD ASSOCIATION ! 15023: * ! 15024: DTCH3 MOV TRVAL(XL),(XR) DELETE TRBLK ! 15025: MOV XL,WA DUMP XL ... ! 15026: MOV XR,WB ... AND XR ! 15027: MOV TRTRF(XL),XL POINT TO TRTRF TRAP BLOCK ! 15028: BZE XL,DTCH5 JUMP IF NO IOCHN ! 15029: BNE (XL),=B$TRT,DTCH5 JUMP IF INPUT, OUTPUT, TERMINAL ! 15030: * ! 15031: * LOOP TO SEARCH IOCHN CHAIN FOR NAME PTR ! 15032: * ! 15033: DTCH4 MOV XL,XR REMEMBER LINK PTR ! 15034: MOV TRTRF(XL),XL POINT TO NEXT LINK ! 15035: BZE XL,DTCH5 JUMP IF END OF CHAIN ! 15036: MOV IONMB(XL),WC GET NAME BASE ! 15037: ADD IONMO(XL),WC ADD OFFSET ! 15038: BNE WC,DTCNM,DTCH4 LOOP IF NO MATCH ! 15039: MOV TRTRF(XL),TRTRF(XR) REMOVE NAME FROM CHAIN ! 15040: EJC ! 15041: * ! 15042: * DTACH (CONTINUED) ! 15043: * ! 15044: * PREPARE TO RESUME I/O TRBLK SCAN ! 15045: * ! 15046: DTCH5 MOV WA,XL RECOVER XL ... ! 15047: MOV WB,XR ... AND XR ! 15048: ADD *TRVAL,XL POINT TO VALUE FIELD ! 15049: BRN DTCH2 CONTINUE ! 15050: * ! 15051: * EXIT POINT ! 15052: * ! 15053: DTCH6 MOV DTCNB,XR POSSIBLE VRBLK PTR ! 15054: JSR SETVR RESET VRBLK IF NECESSARY ! 15055: EXI RETURN ! 15056: ENP END PROCEDURE DTACH ! 15057: EJC ! 15058: * ! 15059: * DTYPE -- GET DATATYPE NAME ! 15060: * ! 15061: * (XR) OBJECT WHOSE DATATYPE IS REQUIRED ! 15062: * JSR DTYPE CALL TO GET DATATYPE ! 15063: * (XR) RESULT DATATYPE ! 15064: * ! 15065: DTYPE PRC E,0 ENTRY POINT ! 15066: BEQ (XR),=B$PDT,DTYP1 JUMP IF PROG.DEFINED ! 15067: MOV (XR),XR LOAD TYPE WORD ! 15068: LEI XR GET ENTRY POINT ID (BLOCK CODE) ! 15069: WTB XR CONVERT TO BYTE OFFSET ! 15070: MOV SCNMT(XR),XR LOAD TABLE ENTRY ! 15071: EXI EXIT TO DTYPE CALLER ! 15072: * ! 15073: * HERE IF PROGRAM DEFINED ! 15074: * ! 15075: DTYP1 MOV PDDFP(XR),XR POINT TO DFBLK ! 15076: MOV DFNAM(XR),XR GET DATATYPE NAME FROM DFBLK ! 15077: EXI RETURN TO DTYPE CALLER ! 15078: ENP END PROCEDURE DTYPE ! 15079: EJC ! 15080: * ! 15081: * DUMPR -- PRINT DUMP OF STORAGE ! 15082: * ! 15083: * (XR) DUMP ARGUMENT (SEE BELOW) ! 15084: * JSR DUMPR CALL TO PRINT DUMP ! 15085: * (XR,XL) DESTROYED ! 15086: * (WA,WB,WC,RA) DESTROYED ! 15087: * ! 15088: * THE DUMP ARGUMENT HAS THE FOLLOWING SIGNIFICANCE ! 15089: * ! 15090: * DMARG = 0 NO DUMP PRINTED ! 15091: * DMARG = 1 PARTIAL DUMP (NAT VARS, KEYWORDS) ! 15092: * DMARG EQ 2 FULL DUMP (INCL ARRAYS ETC.) ! 15093: * DMARG GE 3 CORE DUMP ! 15094: * ! 15095: * SINCE DUMPR SCRAMBLES STORE, IT IS NOT PERMISSIBLE TO ! 15096: * COLLECT IN MID-DUMP. HENCE A COLLECT IS DONE INITIALLY ! 15097: * AND THEN IF STORE RUNS OUT AN ERROR MESSAGE IS PRODUCED. ! 15098: * ! 15099: DUMPR PRC E,0 ENTRY POINT ! 15100: BZE XR,DMP28 SKIP DUMP IF ARGUMENT IS ZERO ! 15101: BGT XR,=NUM02,DMP29 JUMP IF CORE DUMP REQUIRED ! 15102: ZER XL CLEAR XL ! 15103: ZER WB ZERO MOVE OFFSET ! 15104: MOV XR,DMARG SAVE DUMP ARGUMENT ! 15105: JSR GBCOL COLLECT GARBAGE ! 15106: JSR PRTPG EJECT PRINTER ! 15107: MOV =DMHDV,XR POINT TO HEADING FOR VARIABLES ! 15108: JSR PRTST PRINT IT ! 15109: JSR PRTNL TERMINATE PRINT LINE ! 15110: JSR PRTNL AND PRINT A BLANK LINE ! 15111: * ! 15112: * FIRST ALL NATURAL VARIABLE BLOCKS (VRBLK) WHOSE VALUES ! 15113: * ARE NON-NULL ARE LINKED IN LEXICAL ORDER USING DMVCH AS ! 15114: * THE CHAIN HEAD AND CHAINING THROUGH THE VRGET FIELDS. ! 15115: * NOTE THAT THIS SCRAMBLES STORE IF THE PROCESS IS ! 15116: * INTERRUPTED BEFORE COMPLETION E.G. BY EXCEEDING TIME OR ! 15117: * PRINT LIMITS. SINCE THE SUBSEQUENT CORE DUMPS AND ! 15118: * FAILURES IF EXECUTION IS RESUMED ARE VERY CONFUSING, THE ! 15119: * EXECUTION TIME ERROR ROUTINE CHECKS FOR THIS EVENT AND ! 15120: * ATTEMPTS AN UNSCRAMBLE. SIMILAR PRECAUTIONS SHOULD BE ! 15121: * OBSERVED IF TRANSLATE TIME DUMPING IS IMPLEMENTED. ! 15122: * ! 15123: ZER DMVCH SET NULL CHAIN TO START ! 15124: MOV HSHTB,WA POINT TO HASH TABLE ! 15125: * ! 15126: * LOOP THROUGH HEADERS IN HASH TABLE ! 15127: * ! 15128: DMP00 MOV WA,XR COPY HASH BUCKET POINTER ! 15129: ICA WA BUMP POINTER ! 15130: SUB *VRNXT,XR SET OFFSET TO MERGE ! 15131: * ! 15132: * LOOP THROUGH VRBLKS ON ONE CHAIN ! 15133: * ! 15134: DMP01 MOV VRNXT(XR),XR POINT TO NEXT VRBLK ON CHAIN ! 15135: BZE XR,DMP09 JUMP IF END OF THIS HASH CHAIN ! 15136: MOV XR,XL ELSE COPY VRBLK POINTER ! 15137: EJC ! 15138: * ! 15139: * DUMPR (CONTINUED) ! 15140: * ! 15141: * LOOP TO FIND VALUE AND SKIP IF NULL ! 15142: * ! 15143: DMP02 MOV VRVAL(XL),XL LOAD VALUE ! 15144: BEQ XL,=NULLS,DMP01 LOOP FOR NEXT VRBLK IF NULL VALUE ! 15145: BEQ (XL),=B$TRT,DMP02 LOOP BACK IF VALUE IS TRAPPED ! 15146: * ! 15147: * NON-NULL VALUE, PREPARE TO SEARCH CHAIN ! 15148: * ! 15149: MOV XR,WC SAVE VRBLK POINTER ! 15150: ADD *VRSOF,XR ADJUST PTR TO BE LIKE SCBLK PTR ! 15151: BNZ SCLEN(XR),DMP03 JUMP IF NON-SYSTEM VARIABLE ! 15152: MOV VRSVO(XR),XR ELSE LOAD PTR TO NAME IN SVBLK ! 15153: * ! 15154: * HERE WITH NAME POINTER FOR NEW BLOCK IN XR ! 15155: * ! 15156: DMP03 MOV XR,WB SAVE POINTER TO CHARS ! 15157: MOV WA,DMPSV SAVE HASH BUCKET POINTER ! 15158: MOV =DMVCH,WA POINT TO CHAIN HEAD ! 15159: * ! 15160: * LOOP TO SEARCH CHAIN FOR CORRECT INSERTION POINT ! 15161: * ! 15162: DMP04 MOV WA,DMPCH SAVE CHAIN POINTER ! 15163: MOV WA,XL COPY IT ! 15164: MOV (XL),XR LOAD POINTER TO NEXT ENTRY ! 15165: BZE XR,DMP08 JUMP IF END OF CHAIN TO INSERT ! 15166: ADD *VRSOF,XR ELSE GET NAME PTR FOR CHAINED VRBLK ! 15167: BNZ SCLEN(XR),DMP05 JUMP IF NOT SYSTEM VARIABLE ! 15168: MOV VRSVO(XR),XR ELSE POINT TO NAME IN SVBLK ! 15169: * ! 15170: * HERE PREPARE TO COMPARE THE NAMES ! 15171: * ! 15172: * (WA) SCRATCH ! 15173: * (WB) POINTER TO STRING OF ENTERING VRBLK ! 15174: * (WC) POINTER TO ENTERING VRBLK ! 15175: * (XR) POINTER TO STRING OF CURRENT BLOCK ! 15176: * (XL) SCRATCH ! 15177: * ! 15178: DMP05 MOV WB,XL POINT TO ENTERING VRBLK STRING ! 15179: MOV SCLEN(XL),WA LOAD ITS LENGTH ! 15180: PLC XL POINT TO CHARS OF ENTERING STRING ! 15181: BHI WA,SCLEN(XR),DMP06 JUMP IF ENTERING LENGTH HIGH ! 15182: PLC XR ELSE POINT TO CHARS OF OLD STRING ! 15183: CMC DMP08,DMP07 COMPARE, INSERT IF NEW IS LLT OLD ! 15184: BRN DMP08 OR IF LEQ (WE HAD SHORTER LENGTH) ! 15185: * ! 15186: * HERE WHEN NEW LENGTH IS LONGER THAN OLD LENGTH ! 15187: * ! 15188: DMP06 MOV SCLEN(XR),WA LOAD SHORTER LENGTH ! 15189: PLC XR POINT TO CHARS OF OLD STRING ! 15190: CMC DMP08,DMP07 COMPARE, INSERT IF NEW ONE LOW ! 15191: EJC ! 15192: * ! 15193: * DUMPR (CONTINUED) ! 15194: * ! 15195: * HERE WE MOVE OUT ON THE CHAIN ! 15196: * ! 15197: DMP07 MOV DMPCH,XL COPY CHAIN POINTER ! 15198: MOV (XL),WA MOVE TO NEXT ENTRY ON CHAIN ! 15199: BRN DMP04 LOOP BACK ! 15200: * ! 15201: * HERE AFTER LOCATING THE PROPER INSERTION POINT ! 15202: * ! 15203: DMP08 MOV DMPCH,XL COPY CHAIN POINTER ! 15204: MOV DMPSV,WA RESTORE HASH BUCKET POINTER ! 15205: MOV WC,XR RESTORE VRBLK POINTER ! 15206: MOV (XL),VRGET(XR) LINK VRBLK TO REST OF CHAIN ! 15207: MOV XR,(XL) LINK VRBLK INTO CURRENT CHAIN LOC ! 15208: BRN DMP01 LOOP BACK FOR NEXT VRBLK ! 15209: * ! 15210: * HERE AFTER PROCESSING ALL VRBLKS ON ONE CHAIN ! 15211: * ! 15212: DMP09 BNE WA,HSHTE,DMP00 LOOP BACK IF MORE BUCKETS TO GO ! 15213: * ! 15214: * LOOP TO GENERATE DUMP OF NATURAL VARIABLE VALUES ! 15215: * ! 15216: DMP10 MOV DMVCH,XR LOAD POINTER TO NEXT ENTRY ON CHAIN ! 15217: BZE XR,DMP11 JUMP IF END OF CHAIN ! 15218: MOV (XR),DMVCH ELSE UPDATE CHAIN PTR TO NEXT ENTRY ! 15219: JSR SETVR RESTORE VRGET FIELD ! 15220: MOV XR,XL COPY VRBLK POINTER (NAME BASE) ! 15221: MOV *VRVAL,WA SET OFFSET FOR VRBLK NAME ! 15222: JSR PRTNV PRINT NAME = VALUE ! 15223: BRN DMP10 LOOP BACK TILL ALL PRINTED ! 15224: * ! 15225: * PREPARE TO PRINT KEYWORDS ! 15226: * ! 15227: DMP11 JSR PRTNL PRINT BLANK LINE ! 15228: JSR PRTNL AND ANOTHER ! 15229: MOV =DMHDK,XR POINT TO KEYWORD HEADING ! 15230: JSR PRTST PRINT HEADING ! 15231: JSR PRTNL END LINE ! 15232: JSR PRTNL PRINT ONE BLANK LINE ! 15233: MOV =VDMKW,XL POINT TO LIST OF KEYWORD SVBLK PTRS ! 15234: EJC ! 15235: * ! 15236: * DUMPR (CONTINUED) ! 15237: * ! 15238: * LOOP TO DUMP KEYWORD VALUES ! 15239: * ! 15240: DMP12 MOV (XL)+,XR LOAD NEXT SVBLK PTR FROM TABLE ! 15241: BZE XR,DMP13 JUMP IF END OF LIST ! 15242: MOV =CH$AM,WA LOAD AMPERSAND ! 15243: JSR PRTCH PRINT AMPERSAND ! 15244: JSR PRTST PRINT KEYWORD NAME ! 15245: MOV SVLEN(XR),WA LOAD NAME LENGTH FROM SVBLK ! 15246: CTB WA,SVCHS GET LENGTH OF NAME ! 15247: ADD WA,XR POINT TO SVKNM FIELD ! 15248: MOV (XR),DMPKN STORE IN DUMMY KVBLK ! 15249: MOV =TMBEB,XR POINT TO BLANK-EQUAL-BLANK ! 15250: JSR PRTST PRINT IT ! 15251: MOV XL,DMPSV SAVE TABLE POINTER ! 15252: MOV =DMPKB,XL POINT TO DUMMY KVBLK ! 15253: MOV *KVVAR,WA SET ZERO OFFSET ! 15254: JSR ACESS GET KEYWORD VALUE ! 15255: PPM FAILURE IS IMPOSSIBLE ! 15256: JSR PRTVL PRINT KEYWORD VALUE ! 15257: JSR PRTNL TERMINATE PRINT LINE ! 15258: MOV DMPSV,XL RESTORE TABLE POINTER ! 15259: BRN DMP12 LOOP BACK TILL ALL PRINTED ! 15260: * ! 15261: * HERE AFTER COMPLETING PARTIAL DUMP ! 15262: * ! 15263: DMP13 BEQ DMARG,=NUM01,DMP27 EXIT IF PARTIAL DUMP COMPLETE ! 15264: MOV DNAMB,XR ELSE POINT TO FIRST DYNAMIC BLOCK ! 15265: * ! 15266: * LOOP THROUGH BLOCKS IN DYNAMIC STORAGE ! 15267: * ! 15268: DMP14 BEQ XR,DNAMP,DMP27 JUMP IF END OF USED REGION ! 15269: MOV (XR),WA ELSE LOAD FIRST WORD OF BLOCK ! 15270: BEQ WA,=B$VCT,DMP16 JUMP IF VECTOR ! 15271: BEQ WA,=B$ART,DMP17 JUMP IF ARRAY ! 15272: BEQ WA,=B$PDT,DMP18 JUMP IF PROGRAM DEFINED ! 15273: BEQ WA,=B$TBT,DMP19 JUMP IF TABLE ! 15274: .IF .CNBF ! 15275: .ELSE ! 15276: BEQ WA,=B$BCT,DMP30 JUMP IF BUFFER ! 15277: .FI ! 15278: * ! 15279: * MERGE HERE TO MOVE TO NEXT BLOCK ! 15280: * ! 15281: DMP15 JSR BLKLN GET LENGTH OF BLOCK ! 15282: ADD WA,XR POINT PAST THIS BLOCK ! 15283: BRN DMP14 LOOP BACK FOR NEXT BLOCK ! 15284: EJC ! 15285: * ! 15286: * DUMPR (CONTINUED) ! 15287: * ! 15288: * HERE FOR VECTOR ! 15289: * ! 15290: DMP16 MOV *VCVLS,WB SET OFFSET TO FIRST VALUE ! 15291: BRN DMP19 JUMP TO MERGE ! 15292: * ! 15293: * HERE FOR ARRAY ! 15294: * ! 15295: DMP17 MOV AROFS(XR),WB SET OFFSET TO ARPRO FIELD ! 15296: ICA WB BUMP TO GET OFFSET TO VALUES ! 15297: BRN DMP19 JUMP TO MERGE ! 15298: * ! 15299: * HERE FOR PROGRAM DEFINED ! 15300: * ! 15301: DMP18 MOV *PDFLD,WB POINT TO VALUES, MERGE ! 15302: * ! 15303: * HERE FOR TABLE (OTHERS MERGE) ! 15304: * ! 15305: DMP19 BZE IDVAL(XR),DMP15 IGNORE BLOCK IF ZERO ID VALUE ! 15306: JSR BLKLN ELSE GET BLOCK LENGTH ! 15307: MOV XR,XL COPY BLOCK POINTER ! 15308: MOV WA,DMPSV SAVE LENGTH ! 15309: MOV WB,WA COPY OFFSET TO FIRST VALUE ! 15310: JSR PRTNL PRINT BLANK LINE ! 15311: MOV WA,DMPSA PRESERVE OFFSET ! 15312: JSR PRTVL PRINT BLOCK VALUE (FOR TITLE) ! 15313: MOV DMPSA,WA RECOVER OFFSET ! 15314: JSR PRTNL END PRINT LINE ! 15315: BEQ (XR),=B$TBT,DMP22 JUMP IF TABLE ! 15316: DCA WA POINT BEFORE FIRST WORD ! 15317: * ! 15318: * LOOP TO PRINT CONTENTS OF ARRAY, VECTOR, OR PROGRAM DEF ! 15319: * ! 15320: DMP20 MOV XL,XR COPY BLOCK POINTER ! 15321: ICA WA BUMP OFFSET ! 15322: ADD WA,XR POINT TO NEXT VALUE ! 15323: BEQ WA,DMPSV,DMP14 EXIT IF END (XR PAST BLOCK) ! 15324: SUB *VRVAL,XR SUBTRACT OFFSET TO MERGE INTO LOOP ! 15325: * ! 15326: * LOOP TO FIND VALUE AND IGNORE NULLS ! 15327: * ! 15328: DMP21 MOV VRVAL(XR),XR LOAD NEXT VALUE ! 15329: BEQ XR,=NULLS,DMP20 LOOP BACK IF NULL VALUE ! 15330: BEQ (XR),=B$TRT,DMP21 LOOP BACK IF TRAPPED ! 15331: JSR PRTNV ELSE PRINT NAME = VALUE ! 15332: BRN DMP20 LOOP BACK FOR NEXT FIELD ! 15333: EJC ! 15334: * ! 15335: * DUMPR (CONTINUED) ! 15336: * ! 15337: * HERE TO DUMP A TABLE ! 15338: * ! 15339: DMP22 MOV *TBBUK,WC SET OFFSET TO FIRST BUCKET ! 15340: MOV *TEVAL,WA SET NAME OFFSET FOR ALL TEBLKS ! 15341: * ! 15342: * LOOP THROUGH TABLE BUCKETS ! 15343: * ! 15344: DMP23 MOV XL,-(XS) SAVE TBBLK POINTER ! 15345: ADD WC,XL POINT TO NEXT BUCKET HEADER ! 15346: ICA WC BUMP BUCKET OFFSET ! 15347: SUB *TENXT,XL SUBTRACT OFFSET TO MERGE INTO LOOP ! 15348: * ! 15349: * LOOP TO PROCESS TEBLKS ON ONE CHAIN ! 15350: * ! 15351: DMP24 MOV TENXT(XL),XL POINT TO NEXT TEBLK ! 15352: BEQ XL,(XS),DMP26 JUMP IF END OF CHAIN ! 15353: MOV XL,XR ELSE COPY TEBLK POINTER ! 15354: * ! 15355: * LOOP TO FIND VALUE AND IGNORE IF NULL ! 15356: * ! 15357: DMP25 MOV TEVAL(XR),XR LOAD NEXT VALUE ! 15358: BEQ XR,=NULLS,DMP24 IGNORE IF NULL VALUE ! 15359: BEQ (XR),=B$TRT,DMP25 LOOP BACK IF TRAPPED ! 15360: MOV WC,DMPSV ELSE SAVE OFFSET POINTER ! 15361: JSR PRTNV PRINT NAME = VALUE ! 15362: MOV DMPSV,WC RELOAD OFFSET ! 15363: BRN DMP24 LOOP BACK FOR NEXT TEBLK ! 15364: * ! 15365: * HERE TO MOVE TO NEXT HASH CHAIN ! 15366: * ! 15367: DMP26 MOV (XS)+,XL RESTORE TBBLK POINTER ! 15368: BNE WC,TBLEN(XL),DMP23 LOOP BACK IF MORE BUCKETS TO GO ! 15369: MOV XL,XR ELSE COPY TABLE POINTER ! 15370: ADD WC,XR POINT TO FOLLOWING BLOCK ! 15371: BRN DMP14 LOOP BACK TO PROCESS NEXT BLOCK ! 15372: * ! 15373: * HERE AFTER COMPLETING DUMP ! 15374: * ! 15375: DMP27 JSR PRTPG EJECT PRINTER ! 15376: * ! 15377: * MERGE HERE IF NO DUMP GIVEN (DMARG=0) ! 15378: * ! 15379: DMP28 EXI RETURN TO DUMP CALLER ! 15380: * ! 15381: * CALL SYSTEM CORE DUMP ROUTINE ! 15382: * ! 15383: DMP29 JSR SYSDM CALL IT ! 15384: BRN DMP28 RETURN ! 15385: .IF .CNBF ! 15386: .ELSE ! 15387: EJC ! 15388: * ! 15389: * DUMPR (CONTINUED) ! 15390: * ! 15391: * HERE TO DUMP BUFFER BLOCK ! 15392: * ! 15393: DMP30 JSR PRTNL PRINT BLANK LINE ! 15394: JSR PRTVL PRINT VALUE ID FOR TITLE ! 15395: JSR PRTNL FORCE NEW LINE ! 15396: MOV =CH$DQ,WA LOAD DOUBLE QUOTE ! 15397: JSR PRTCH PRINT IT ! 15398: MOV BCLEN(XR),WC LOAD DEFINED LENGTH ! 15399: BZE WC,DMP32 SKIP CHARACTERS IF NONE ! 15400: LCT WC,WC LOAD COUNT FOR LOOP ! 15401: MOV XR,WB SAVE BCBLK PTR ! 15402: MOV BCBUF(XR),XR POINT TO BFBLK ! 15403: PLC XR GET SET TO LOAD CHARACTERS ! 15404: * ! 15405: * LOOP HERE STUFFING CHARACTERS IN OUTPUT STREAM ! 15406: * ! 15407: DMP31 LCH WA,(XR)+ GET NEXT CHARACTER ! 15408: JSR PRTCH STUFF IT ! 15409: BCT WC,DMP31 BRANCH FOR NEXT ONE ! 15410: MOV WB,XR RESTORE BCBLK POINTER ! 15411: * ! 15412: * MERGE TO STUFF CLOSING QUOTE MARK ! 15413: * ! 15414: DMP32 MOV =CH$DQ,WA STUFF QUOTE ! 15415: JSR PRTCH PRINT IT ! 15416: JSR PRTNL PRINT NEW LINE ! 15417: MOV (XR),WA GET FIRST WD FOR BLKLN ! 15418: BRN DMP15 MERGE TO GET NEXT BLOCK ! 15419: .FI ! 15420: ENP END PROCEDURE DUMPR ! 15421: EJC ! 15422: * ! 15423: * ERMSG -- PRINT ERROR CODE AND ERROR MESSAGE ! 15424: * ! 15425: * KVERT ERROR CODE ! 15426: * JSR ERMSG CALL TO PRINT MESSAGE ! 15427: * (XR,XL,WA,WB,WC,IA) DESTROYED ! 15428: * ! 15429: ERMSG PRC E,0 ENTRY POINT ! 15430: JSR PRTIS PRINT ERROR PTR OR BLANK LINE ! 15431: MOV KVERT,WA LOAD ERROR CODE ! 15432: MOV =ERMMS,XR POINT TO ERROR MESSAGE /ERROR/ ! 15433: JSR PRTST PRINT IT ! 15434: JSR ERTEX GET ERROR MESSAGE TEXT ! 15435: ADD =THSND,WA BUMP ERROR CODE FOR PRINT ! 15436: MTI WA FAIL CODE IN INT ACC ! 15437: JSR PRTIN PRINT CODE (NOW HAVE ERROR1XXX) ! 15438: MOV PRBUF,XL POINT TO PRINT BUFFER ! 15439: PSC XL,=NUM05 POINT TO THE 1 ! 15440: MOV =CH$BL,WA LOAD A BLANK ! 15441: SCH WA,(XL) STORE BLANK OVER 1 (ERROR XXX) ! 15442: CSC XL COMPLETE STORE CHARACTERS ! 15443: ZER XL CLEAR GARBAGE POINTER IN XL ! 15444: MOV XR,WA KEEP ERROR TEXT ! 15445: MOV =ERMNS,XR POINT TO / -- / ! 15446: JSR PRTST PRINT IT ! 15447: MOV WA,XR GET ERROR TEXT AGAIN ! 15448: JSR PRTST PRINT ERROR MESSAGE TEXT ! 15449: JSR PRTIS PRINT LINE ! 15450: JSR PRTIS PRINT BLANK LINE ! 15451: EXI RETURN TO ERMSG CALLER ! 15452: ENP END PROCEDURE ERMSG ! 15453: EJC ! 15454: * ! 15455: * ERTEX -- GET ERROR MESSAGE TEXT ! 15456: * ! 15457: * (WA) ERROR CODE ! 15458: * JSR ERTEX CALL TO GET ERROR TEXT ! 15459: * (XR) PTR TO ERROR TEXT IN DYNAMIC ! 15460: * (R$ETX) COPY OF PTR TO ERROR TEXT ! 15461: * (XL,WC,IA) DESTROYED ! 15462: * ! 15463: ERTEX PRC E,0 ENTRY POINT ! 15464: MOV WA,ERTWA SAVE WA ! 15465: MOV WB,ERTWB SAVE WB ! 15466: JSR SYSEM GET FAILURE MESSAGE TEXT ! 15467: MOV XR,XL COPY POINTER TO IT ! 15468: MOV SCLEN(XR),WA GET LENGTH OF STRING ! 15469: BZE WA,ERT02 JUMP IF NULL ! 15470: ZER WB OFFSET OF ZERO ! 15471: JSR SBSTR COPY INTO DYNAMIC STORE ! 15472: MOV XR,R$ETX STORE FOR RELOCATION ! 15473: * ! 15474: * RETURN ! 15475: * ! 15476: ERT01 MOV ERTWB,WB RESTORE WB ! 15477: MOV ERTWA,WA RESTORE WA ! 15478: EXI RETURN TO CALLER ! 15479: * ! 15480: * RETURN ERRTEXT CONTENTS INSTEAD OF NULL ! 15481: * ! 15482: ERT02 MOV R$ETX,XR GET ERRTEXT ! 15483: BRN ERT01 RETURN ! 15484: ENP ! 15485: EJC ! 15486: * ! 15487: * EVALI -- EVALUATE INTEGER ARGUMENT ! 15488: * ! 15489: * EVALI IS USED BY PATTERN PRIMITIVES LEN,TAB,RTAB,POS,RPOS ! 15490: * WHEN THEIR ARGUMENT IS AN EXPRESSION VALUE. ! 15491: * ! 15492: * (XR) NODE POINTER ! 15493: * (WB) CURSOR ! 15494: * JSR EVALI CALL TO EVALUATE INTEGER ! 15495: * PPM LOC TRANSFER LOC FOR NON-INTEGER ARG ! 15496: * PPM LOC TRANSFER LOC FOR OUT OF RANGE ARG ! 15497: * PPM LOC TRANSFER LOC FOR EVALUATION FAILURE ! 15498: * PPM LOC TRANSFER LOC FOR SUCCESSFUL EVAL ! 15499: * (THE NORMAL RETURN IS NEVER TAKEN) ! 15500: * (XR) PTR TO NODE WITH INTEGER ARGUMENT ! 15501: * (WC,XL,RA) DESTROYED ! 15502: * ! 15503: * ON RETURN, THE NODE POINTED TO HAS THE INTEGER ARGUMENT ! 15504: * IN PARM1 AND THE PROPER SUCCESSOR POINTER IN PTHEN. ! 15505: * THIS ALLOWS MERGING WITH THE NORMAL (INTEGER ARG) CASE. ! 15506: * ! 15507: EVALI PRC R,4 ENTRY POINT (RECURSIVE) ! 15508: JSR EVALP EVALUATE EXPRESSION ! 15509: PPM EVLI1 JUMP ON FAILURE ! 15510: MOV XL,-(XS) STACK RESULT FOR GTSMI ! 15511: MOV PTHEN(XR),XL LOAD SUCCESSOR POINTER ! 15512: JSR GTSMI CONVERT ARG TO SMALL INTEGER ! 15513: PPM EVLI2 JUMP IF NOT INTEGER ! 15514: PPM EVLI3 JUMP IF OUT OF RANGE ! 15515: MOV XR,EVLIV STORE RESULT IN SPECIAL DUMMY NODE ! 15516: MOV XL,EVLIS STORE SUCCESSOR POINTER ! 15517: MOV =EVLIN,XR POINT TO DUMMY NODE WITH RESULT ! 15518: EXI 4 TAKE SUCCESSFUL EXIT ! 15519: * ! 15520: * HERE IF EVALUATION FAILS ! 15521: * ! 15522: EVLI1 EXI 3 TAKE FAILURE RETURN ! 15523: * ! 15524: * HERE IF ARGUMENT IS NOT INTEGER ! 15525: * ! 15526: EVLI2 EXI 1 TAKE NON-INTEGER ERROR EXIT ! 15527: * ! 15528: * HERE IF ARGUMENT IS OUT OF RANGE ! 15529: * ! 15530: EVLI3 EXI 2 TAKE OUT-OF-RANGE ERROR EXIT ! 15531: ENP END PROCEDURE EVALI ! 15532: EJC ! 15533: * ! 15534: * EVALP -- EVALUATE EXPRESSION DURING PATTERN MATCH ! 15535: * ! 15536: * EVALP IS USED TO EVALUATE AN EXPRESSION (BY VALUE) DURING ! 15537: * A PATTERN MATCH. THE EFFECT IS LIKE EVALX, BUT PATTERN ! 15538: * VARIABLES ARE STACKED AND RESTORED IF NECESSARY. ! 15539: * ! 15540: * EVALP ALSO DIFFERS FROM EVALX IN THAT IF THE RESULT IS ! 15541: * AN EXPRESSION IT IS REEVALUATED. THIS OCCURS REPEATEDLY. ! 15542: * ! 15543: * (XR) NODE POINTER ! 15544: * (WB) PATTERN MATCH CURSOR ! 15545: * JSR EVALP CALL TO EVALUATE EXPRESSION ! 15546: * PPM LOC TRANSFER LOC IF EVALUATION FAILS ! 15547: * (XL) RESULT ! 15548: * (WA) FIRST WORD OF RESULT BLOCK ! 15549: * (XR,WB) DESTROYED (FAILURE CASE ONLY) ! 15550: * (WC,RA) DESTROYED ! 15551: * ! 15552: * THE EXPRESSION POINTER IS STORED IN PARM1 OF THE NODE ! 15553: * ! 15554: * CONTROL RETURNS TO FAILP ON FAILURE OF EVALUATION ! 15555: * ! 15556: EVALP PRC R,1 ENTRY POINT (RECURSIVE) ! 15557: MOV PARM1(XR),XL LOAD EXPRESSION POINTER ! 15558: BEQ (XL),=B$EXL,EVLP1 JUMP IF EXBLK CASE ! 15559: * ! 15560: * HERE FOR CASE OF SEBLK ! 15561: * ! 15562: * WE CAN GIVE A FAST RETURN IF THE VALUE OF THE VRBLK IS ! 15563: * NOT AN EXPRESSION AND IS NOT TRAPPED. ! 15564: * ! 15565: MOV SEVAR(XL),XL LOAD VRBLK POINTER ! 15566: MOV VRVAL(XL),XL LOAD VALUE OF VRBLK ! 15567: MOV (XL),WA LOAD FIRST WORD OF VALUE ! 15568: BHI WA,=B$T$$,EVLP3 JUMP IF NOT SEBLK, TRBLK OR EXBLK ! 15569: * ! 15570: * HERE FOR EXBLK OR SEBLK WITH EXPR VALUE OR TRAPPED VALUE ! 15571: * ! 15572: EVLP1 MOV XR,-(XS) STACK NODE POINTER ! 15573: MOV WB,-(XS) STACK CURSOR ! 15574: MOV R$PMS,-(XS) STACK SUBJECT STRING POINTER ! 15575: MOV PMSSL,-(XS) STACK SUBJECT STRING LENGTH ! 15576: MOV PMDFL,-(XS) STACK DOT FLAG ! 15577: MOV PMHBS,-(XS) STACK HISTORY STACK BASE POINTER ! 15578: MOV PARM1(XR),XR LOAD EXPRESSION POINTER ! 15579: EJC ! 15580: * ! 15581: * EVALP (CONTINUED) ! 15582: * ! 15583: * LOOP BACK HERE TO REEVALUATE EXPRESSION RESULT ! 15584: * ! 15585: EVLP2 ZER WB SET FLAG FOR BY VALUE ! 15586: JSR EVALX EVALUATE EXPRESSION ! 15587: PPM EVLP4 JUMP ON FAILURE ! 15588: MOV (XR),WA ELSE LOAD FIRST WORD OF VALUE ! 15589: BLO WA,=B$E$$,EVLP2 LOOP BACK TO REEVALUATE EXPRESSION ! 15590: * ! 15591: * HERE TO RESTORE PATTERN VALUES AFTER SUCCESSFUL EVAL ! 15592: * ! 15593: MOV XR,XL COPY RESULT POINTER ! 15594: MOV (XS)+,PMHBS RESTORE HISTORY STACK BASE POINTER ! 15595: MOV (XS)+,PMDFL RESTORE DOT FLAG ! 15596: MOV (XS)+,PMSSL RESTORE SUBJECT STRING LENGTH ! 15597: MOV (XS)+,R$PMS RESTORE SUBJECT STRING POINTER ! 15598: MOV (XS)+,WB RESTORE CURSOR ! 15599: MOV (XS)+,XR RESTORE NODE POINTER ! 15600: * ! 15601: * COMMON EXIT POINT ! 15602: * ! 15603: EVLP3 EXI RETURN TO EVALP CALLER ! 15604: * ! 15605: * HERE FOR FAILURE DURING EVALUATION ! 15606: * ! 15607: EVLP4 MOV (XS)+,PMHBS RESTORE HISTORY STACK BASE POINTER ! 15608: MOV (XS)+,PMDFL RESTORE DOT FLAG ! 15609: MOV (XS)+,PMSSL RESTORE SUBJECT STRING LENGTH ! 15610: MOV (XS)+,R$PMS RESTORE SUBJECT STRING POINTER ! 15611: ADD *NUM02,XS REMOVE NODE PTR, CURSOR ! 15612: EXI 1 TAKE FAILURE EXIT ! 15613: ENP END PROCEDURE EVALP ! 15614: EJC ! 15615: * ! 15616: * EVALS -- EVALUATE STRING ARGUMENT ! 15617: * ! 15618: * EVALS IS USED BY SPAN, ANY, NOTANY, BREAK, BREAKX WHEN ! 15619: * THEY ARE PASSED AN EXPRESSION ARGUMENT. ! 15620: * ! 15621: * (XR) NODE POINTER ! 15622: * (WB) CURSOR ! 15623: * JSR EVALS CALL TO EVALUATE STRING ! 15624: * PPM LOC TRANSFER LOC FOR NON-STRING ARG ! 15625: * PPM LOC TRANSFER LOC FOR EVALUATION FAILURE ! 15626: * PPM LOC TRANSFER LOC FOR SUCCESSFUL EVAL ! 15627: * (THE NORMAL RETURN IS NEVER TAKEN) ! 15628: * (XR) PTR TO NODE WITH PARMS SET ! 15629: * (XL,WC,RA) DESTROYED ! 15630: * ! 15631: * ON RETURN, THE NODE POINTED TO HAS A CHARACTER TABLE ! 15632: * POINTER IN PARM1 AND A BIT MASK IN PARM2. THE PROPER ! 15633: * SUCCESSOR IS STORED IN PTHEN OF THIS NODE. THUS IT IS ! 15634: * OK FOR MERGING WITH THE NORMAL (MULTI-CHAR STRING) CASE. ! 15635: * ! 15636: EVALS PRC R,3 ENTRY POINT (RECURSIVE) ! 15637: JSR EVALP EVALUATE EXPRESSION ! 15638: PPM EVLS1 JUMP IF EVALUATION FAILS ! 15639: MOV PTHEN(XR),-(XS) SAVE SUCCESSOR POINTER ! 15640: MOV WB,-(XS) SAVE CURSOR ! 15641: MOV XL,-(XS) STACK RESULT PTR FOR PATST ! 15642: ZER WB DUMMY PCODE FOR ONE CHAR STRING ! 15643: ZER WC DUMMY PCODE FOR EXPRESSION ARG ! 15644: MOV =P$BRK,XL APPROPRIATE PCODE FOR OUR USE ! 15645: JSR PATST CALL ROUTINE TO BUILD NODE ! 15646: PPM EVLS2 JUMP IF NOT STRING ! 15647: MOV (XS)+,WB RESTORE CURSOR ! 15648: MOV (XS)+,PTHEN(XR) STORE SUCCESSOR POINTER ! 15649: EXI 3 TAKE SUCCESS RETURN ! 15650: * ! 15651: * HERE IF EVALUATION FAILS ! 15652: * ! 15653: EVLS1 EXI 2 TAKE FAILURE RETURN ! 15654: * ! 15655: * HERE IF ARGUMENT IS NOT STRING ! 15656: * ! 15657: EVLS2 ADD *NUM02,XS POP SUCCESSOR AND CURSOR ! 15658: EXI 1 TAKE NON-STRING ERROR EXIT ! 15659: ENP END PROCEDURE EVALS ! 15660: EJC ! 15661: * ! 15662: * EVALX -- EVALUATE EXPRESSION ! 15663: * ! 15664: * EVALX IS CALLED TO EVALUATE AN EXPRESSION ! 15665: * ! 15666: * (XR) POINTER TO EXBLK OR SEBLK ! 15667: * (WB) 0 IF BY VALUE, 1 IF BY NAME ! 15668: * JSR EVALX CALL TO EVALUATE EXPRESSION ! 15669: * PPM LOC TRANSFER LOC IF EVALUATION FAILS ! 15670: * (XR) RESULT IF CALLED BY VALUE ! 15671: * (XL,WA) RESULT NAME BASE,OFFSET IF BY NAME ! 15672: * (XR) DESTROYED (NAME CASE ONLY) ! 15673: * (XL,WA) DESTROYED (VALUE CASE ONLY) ! 15674: * (WB,WC,RA) DESTROYED ! 15675: * ! 15676: EVALX PRC R,1 ENTRY POINT, RECURSIVE ! 15677: BEQ (XR),=B$EXL,EVLX2 JUMP IF EXBLK CASE ! 15678: * ! 15679: * HERE FOR SEBLK ! 15680: * ! 15681: MOV SEVAR(XR),XL LOAD VRBLK POINTER (NAME BASE) ! 15682: MOV *VRVAL,WA SET NAME OFFSET ! 15683: BNZ WB,EVLX1 JUMP IF CALLED BY NAME ! 15684: JSR ACESS CALL ROUTINE TO ACCESS VALUE ! 15685: PPM EVLX9 JUMP IF FAILURE ON ACCESS ! 15686: * ! 15687: * MERGE HERE TO EXIT FOR SEBLK CASE ! 15688: * ! 15689: EVLX1 EXI RETURN TO EVALX CALLER ! 15690: EJC ! 15691: * ! 15692: * EVALX (CONTINUED) ! 15693: * ! 15694: * HERE FOR FULL EXPRESSION (EXBLK) CASE ! 15695: * ! 15696: * IF AN ERROR OCCURS IN THE EXPRESSION CODE AT EXECUTION ! 15697: * TIME, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL ! 15698: * WITHOUT RETURNING TO THIS ROUTINE. ! 15699: * THE FOLLOWING ENTRIES ARE MADE ON THE STACK BEFORE ! 15700: * GIVING CONTROL TO THE EXPRESSION CODE ! 15701: * ! 15702: * EVALX RETURN POINT ! 15703: * SAVED VALUE OF R$COD ! 15704: * CODE POINTER (-R$COD) ! 15705: * SAVED VALUE OF FLPTR ! 15706: * 0 IF BY VALUE, 1 IF BY NAME ! 15707: * FLPTR --------------- *EXFLC, FAIL OFFSET IN EXBLK ! 15708: * ! 15709: EVLX2 SCP WC GET CODE POINTER ! 15710: MOV R$COD,WA LOAD CODE BLOCK POINTER ! 15711: SUB WA,WC GET CODE POINTER AS OFFSET ! 15712: MOV WA,-(XS) STACK OLD CODE BLOCK POINTER ! 15713: MOV WC,-(XS) STACK RELATIVE CODE OFFSET ! 15714: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER ! 15715: MOV WB,-(XS) STACK NAME/VALUE INDICATOR ! 15716: MOV *EXFLC,-(XS) STACK NEW FAIL OFFSET ! 15717: MOV FLPTR,GTCEF KEEP IN CASE OF ERROR ! 15718: MOV R$COD,R$GTC KEEP CODE BLOCK POINTER SIMILARLY ! 15719: MOV XS,FLPTR SET NEW FAILURE POINTER ! 15720: MOV XR,R$COD SET NEW CODE BLOCK POINTER ! 15721: MOV KVSTN,EXSTM(XR) REMEMBER STMNT NUMBER ! 15722: ADD *EXCOD,XR POINT TO FIRST CODE WORD ! 15723: LCP XR SET CODE POINTER ! 15724: BNE STAGE,=STGXT,EXITS JUMP IF NOT EXECUTION TIME ! 15725: MOV =STGEE,STAGE EVALUATING EXPRESSION ! 15726: BRN EXITS JUMP TO EXECUTE FIRST CODE WORD ! 15727: EJC ! 15728: * ! 15729: * EVALX (CONTINUED) ! 15730: * ! 15731: * COME HERE IF SUCCESSFUL RETURN BY VALUE (SEE O$RVL) ! 15732: * ! 15733: EVLX3 MOV (XS)+,XR LOAD VALUE ! 15734: BZE 1(XS),EVLX5 JUMP IF CALLED BY VALUE ! 15735: ERB 249,EXPRESSION EVALUATED BY NAME RETURNED VALUE ! 15736: * ! 15737: * HERE FOR EXPRESSION RETURNING BY NAME (SEE O$RNM) ! 15738: * ! 15739: EVLX4 MOV (XS)+,WA LOAD NAME OFFSET ! 15740: MOV (XS)+,XL LOAD NAME BASE ! 15741: BNZ 1(XS),EVLX5 JUMP IF CALLED BY NAME ! 15742: JSR ACESS ELSE ACCESS VALUE FIRST ! 15743: PPM EVLX6 JUMP IF FAILURE DURING ACCESS ! 15744: * ! 15745: * HERE AFTER LOADING CORRECT RESULT INTO XR OR XL,WA ! 15746: * ! 15747: EVLX5 ZER WB NOTE SUCCESSFUL ! 15748: BRN EVLX7 MERGE ! 15749: * ! 15750: * HERE FOR FAILURE IN EXPRESSION EVALUATION (SEE O$FEX) ! 15751: * ! 15752: EVLX6 MNZ WB NOTE UNSUCCESSFUL ! 15753: * ! 15754: * RESTORE ENVIRONMENT ! 15755: * ! 15756: EVLX7 BNE STAGE,=STGEE,EVLX8 SKIP IF WAS NOT PREVIOUSLY XT ! 15757: MOV =STGXT,STAGE EXECUTE TIME ! 15758: * ! 15759: * MERGE WITH STAGE SET UP ! 15760: * ! 15761: EVLX8 ADD *NUM02,XS POP NAME/VALUE INDICATOR, *EXFAL ! 15762: MOV (XS)+,FLPTR RESTORE OLD FAILURE POINTER ! 15763: MOV (XS)+,WC LOAD CODE OFFSET ! 15764: ADD (XS),WC MAKE CODE POINTER ABSOLUTE ! 15765: MOV (XS)+,R$COD RESTORE OLD CODE BLOCK POINTER ! 15766: LCP WC RESTORE OLD CODE POINTER ! 15767: BZE WB,EVLX1 JUMP FOR SUCCESSFUL RETURN ! 15768: * ! 15769: * MERGE HERE FOR FAILURE IN SEBLK CASE ! 15770: * ! 15771: EVLX9 EXI 1 TAKE FAILURE EXIT ! 15772: ENP END OF PROCEDURE EVALX ! 15773: EJC ! 15774: * ! 15775: * EXBLD -- BUILD EXBLK ! 15776: * ! 15777: * EXBLD IS USED TO BUILD AN EXPRESSION BLOCK FROM THE ! 15778: * CODE COMPILED MOST RECENTLY IN THE CURRENT CCBLK. ! 15779: * ! 15780: * (XL) OFFSET IN CCBLK TO START OF CODE ! 15781: * (WB) INTEGER IN RANGE 0 LE N LE MXLEN ! 15782: * JSR EXBLD CALL TO BUILD EXBLK ! 15783: * (XR) PTR TO CONSTRUCTED EXBLK ! 15784: * (WA,WB,XL) DESTROYED ! 15785: * ! 15786: EXBLD PRC E,0 ENTRY POINT ! 15787: MOV XL,WA COPY OFFSET TO START OF CODE ! 15788: SUB *EXCOD,WA CALC REDUCTION IN OFFSET IN EXBLK ! 15789: MOV WA,-(XS) STACK FOR LATER ! 15790: MOV CWCOF,WA LOAD FINAL OFFSET ! 15791: SUB XL,WA COMPUTE LENGTH OF CODE ! 15792: ADD *EXSI$,WA ADD SPACE FOR STANDARD FIELDS ! 15793: JSR ALLOC ALLOCATE SPACE FOR EXBLK ! 15794: MOV XR,-(XS) SAVE POINTER TO EXBLK ! 15795: MOV =B$EXL,EXTYP(XR) STORE TYPE WORD ! 15796: ZER EXSTM(XR) ZEROISE STMNT NUMBER FIELD ! 15797: MOV WA,EXLEN(XR) STORE LENGTH ! 15798: MOV =OFEX$,EXFLC(XR) STORE FAILURE WORD ! 15799: ADD *EXSI$,XR SET XR FOR SYSMW ! 15800: MOV XL,CWCOF RESET OFFSET TO START OF CODE ! 15801: ADD R$CCB,XL POINT TO START OF CODE ! 15802: SUB *EXSI$,WA LENGTH OF CODE TO MOVE ! 15803: MOV WA,-(XS) STACK LENGTH OF CODE ! 15804: MVW MOVE CODE TO EXBLK ! 15805: MOV (XS)+,WA GET LENGTH OF CODE ! 15806: BTW WA CONVERT BYTE COUNT TO WORD COUNT ! 15807: LCT WA,WA PREPARE COUNTER FOR LOOP ! 15808: MOV (XS),XL COPY EXBLK PTR, DONT UNSTACK ! 15809: ADD *EXCOD,XL POINT TO CODE ITSELF ! 15810: MOV 1(XS),WB GET REDUCTION IN OFFSET ! 15811: * ! 15812: * THIS LOOP SEARCHES FOR NEGATION AND SELECTION CODE SO ! 15813: * THAT THE OFFSETS COMPUTED WHILST CODE WAS IN CODE BLOCK ! 15814: * CAN BE TRANSFORMED TO REDUCED VALUES APPLICABLE IN AN ! 15815: * EXBLK. ! 15816: * ! 15817: EXBL1 MOV (XL)+,XR GET NEXT CODE WORD ! 15818: BEQ XR,=OSLA$,EXBL3 JUMP IF SELECTION FOUND ! 15819: BEQ XR,=ONTA$,EXBL3 JUMP IF NEGATION FOUND ! 15820: BCT WA,EXBL1 LOOP TO END OF CODE ! 15821: * ! 15822: * NO SELECTION FOUND OR MERGE TO EXIT ON TERMINATION ! 15823: * ! 15824: EXBL2 MOV (XS)+,XR POP EXBLK PTR INTO XR ! 15825: MOV (XS)+,XL POP REDUCTION CONSTANT ! 15826: EXI RETURN TO CALLER ! 15827: EJC ! 15828: * ! 15829: * EXBLD (CONTINUED) ! 15830: * ! 15831: * SELECTION OR NEGATION FOUND ! 15832: * REDUCE THE OFFSETS AS NEEDED. OFFSETS OCCUR IN WORDS ! 15833: * FOLLOWING CODE WORDS - ! 15834: * =ONTA$, =OSLA$, =OSLB$, =OSLC$ ! 15835: * ! 15836: EXBL3 SUB WB,(XL)+ ADJUST OFFSET ! 15837: BCT WA,EXBL4 DECREMENT COUNT ! 15838: * ! 15839: EXBL4 BCT WA,EXBL5 DECREMENT COUNT ! 15840: * ! 15841: * CONTINUE SEARCH FOR MORE OFFSETS ! 15842: * ! 15843: EXBL5 MOV (XL)+,XR GET NEXT CODE WORD ! 15844: BEQ XR,=OSLA$,EXBL3 JUMP IF OFFSET FOUND ! 15845: BEQ XR,=OSLB$,EXBL3 JUMP IF OFFSET FOUND ! 15846: BEQ XR,=OSLC$,EXBL3 JUMP IF OFFSET FOUND ! 15847: BEQ XR,=ONTA$,EXBL3 JUMP IF OFFSET FOUND ! 15848: BCT WA,EXBL5 LOOP ! 15849: BRN EXBL2 MERGE TO RETURN ! 15850: ENP END PROCEDURE EXBLD ! 15851: EJC ! 15852: * ! 15853: * EXPAN -- ANALYZE EXPRESSION ! 15854: * ! 15855: * THE EXPRESSION ANALYZER (EXPAN) PROCEDURE IS USED TO SCAN ! 15856: * AN EXPRESSION AND CONVERT IT INTO A TREE REPRESENTATION. ! 15857: * SEE DESCRIPTIONS OF CMBLK, CUBLK, CBBLK IN THE STRUCTURES ! 15858: * SECTION FOR DETAILED FORMAT OF TREE BLOCKS. ! 15859: * ! 15860: * THE ANALYZER USES A SIMPLE PRECEDENCE SCHEME IN WHICH ! 15861: * OPERANDS AND OPERATORS ARE PLACED ON A SINGLE STACK ! 15862: * AND CONDENSATIONS ARE MADE WHEN LOW PRECEDENCE OPERATORS ! 15863: * ARE STACKED AFTER A HIGHER PRECEDENCE OPERATOR. A GLOBAL ! 15864: * VARIABLE (IN WB) KEEPS TRACK OF THE LEVEL AS FOLLOWS. ! 15865: * ! 15866: * 0 SCANNING OUTER LEVEL OF STATEMENT OR EXPRESSION ! 15867: * 1 SCANNING OUTER LEVEL OF NORMAL GOTO ! 15868: * 2 SCANNING OUTER LEVEL OF DIRECT GOTO ! 15869: * 3 SCANNING INSIDE ARRAY BRACKETS ! 15870: * 4 SCANNING INSIDE GROUPING PARENTHESES ! 15871: * 5 SCANNING INSIDE FUNCTION PARENTHESES ! 15872: * ! 15873: * THIS VARIABLE IS SAVED ON THE STACK ON ENCOUNTERING A ! 15874: * GROUPING AND RESTORED AT THE END OF THE GROUPING. ! 15875: * ! 15876: * ANOTHER GLOBAL VARIABLE (IN WC) COUNTS THE NUMBER OF ! 15877: * ITEMS AT ONE GROUPING LEVEL AND IS INCREMENTED FOR EACH ! 15878: * COMMA ENCOUNTERED. IT IS STACKED WITH THE LEVEL INDICATOR ! 15879: * ! 15880: * THE SCAN IS CONTROLLED BY A THREE STATE FINITE MACHINE. ! 15881: * A GLOBAL VARIABLE STORED IN WA IS THE CURRENT STATE. ! 15882: * ! 15883: * WA=0 NOTHING SCANNED AT THIS LEVEL ! 15884: * WA=1 OPERAND EXPECTED ! 15885: * WA=2 OPERATOR EXPECTED ! 15886: * ! 15887: * (WB) CALL TYPE (SEE BELOW) ! 15888: * JSR EXPAN CALL TO ANALYZE EXPRESSION ! 15889: * (XR) POINTER TO RESULTING TREE ! 15890: * (XL,WA,WB,WC,RA) DESTROYED ! 15891: * ! 15892: * THE ENTRY VALUE OF WB INDICATES THE CALL TYPE AS FOLLOWS. ! 15893: * ! 15894: * 0 SCANNING EITHER THE MAIN BODY OF A STATEMENT OR THE ! 15895: * TEXT OF AN EXPRESSION (FROM EVAL CALL). VALID ! 15896: * TERMINATORS ARE COLON, SEMICOLON. THE RESCAN FLAG IS ! 15897: * SET TO RETURN THE TERMINATOR ON THE NEXT SCANE CALL. ! 15898: * ! 15899: * 1 SCANNING A NORMAL GOTO. THE ONLY VALID ! 15900: * TERMINATOR IS A RIGHT PAREN. ! 15901: * ! 15902: * 2 SCANNING A DIRECT GOTO. THE ONLY VALID ! 15903: * TERMINATOR IS A RIGHT BRACKET. ! 15904: EJC ! 15905: * ! 15906: * EXPAN (CONTINUED) ! 15907: * ! 15908: * ENTRY POINT ! 15909: * ! 15910: EXPAN PRC E,0 ENTRY POINT ! 15911: ZER -(XS) SET TOP OF STACK INDICATOR ! 15912: ZER WA SET INITIAL STATE TO ZERO ! 15913: ZER WC ZERO COUNTER VALUE ! 15914: * ! 15915: * LOOP HERE FOR SUCCESSIVE ENTRIES ! 15916: * ! 15917: EXP01 JSR SCANE SCAN NEXT ELEMENT ! 15918: ADD WA,XL ADD STATE TO SYNTAX CODE ! 15919: BSW XL,T$NES SWITCH ON ELEMENT TYPE/STATE ! 15920: IFF T$VA0,EXP03 VARIABLE, S=0 ! 15921: IFF T$VA1,EXP03 VARIABLE, STATE ONE ! 15922: IFF T$VA2,EXP04 VARIABLE, S=2 ! 15923: IFF T$CO0,EXP03 CONSTANT, S=0 ! 15924: IFF T$CO1,EXP03 CONSTANT, S=1 ! 15925: IFF T$CO2,EXP04 CONSTANT, S=2 ! 15926: IFF T$LP0,EXP06 LEFT PAREN, S=0 ! 15927: IFF T$LP1,EXP06 LEFT PAREN, S=1 ! 15928: IFF T$LP2,EXP04 LEFT PAREN, S=2 ! 15929: IFF T$FN0,EXP10 FUNCTION, S=0 ! 15930: IFF T$FN1,EXP10 FUNCTION, S=1 ! 15931: IFF T$FN2,EXP04 FUNCTION, S=2 ! 15932: IFF T$RP0,EXP02 RIGHT PAREN, S=0 ! 15933: IFF T$RP1,EXP05 RIGHT PAREN, S=1 ! 15934: IFF T$RP2,EXP12 RIGHT PAREN, S=2 ! 15935: IFF T$LB0,EXP08 LEFT BRKT, S=0 ! 15936: IFF T$LB1,EXP08 LEFT BRKT, S=1 ! 15937: IFF T$LB2,EXP09 LEFT BRKT, S=2 ! 15938: IFF T$RB0,EXP02 RIGHT BRKT, S=0 ! 15939: IFF T$RB1,EXP05 RIGHT BRKT, S=1 ! 15940: IFF T$RB2,EXP18 RIGHT BRKT, S=2 ! 15941: IFF T$UO0,EXP27 UNOP, S=0 ! 15942: IFF T$UO1,EXP27 UNOP, S=1 ! 15943: IFF T$UO2,EXP04 UNOP, S=2 ! 15944: IFF T$BO0,EXP05 BINOP, S=0 ! 15945: IFF T$BO1,EXP05 BINOP, S=1 ! 15946: IFF T$BO2,EXP26 BINOP, S=2 ! 15947: IFF T$CM0,EXP02 COMMA, S=0 ! 15948: IFF T$CM1,EXP05 COMMA, S=1 ! 15949: IFF T$CM2,EXP11 COMMA, S=2 ! 15950: IFF T$CL0,EXP02 COLON, S=0 ! 15951: IFF T$CL1,EXP05 COLON, S=1 ! 15952: IFF T$CL2,EXP19 COLON, S=2 ! 15953: IFF T$SM0,EXP02 SEMICOLON, S=0 ! 15954: IFF T$SM1,EXP05 SEMICOLON, S=1 ! 15955: IFF T$SM2,EXP19 SEMICOLON, S=2 ! 15956: ESW END SWITCH ON ELEMENT TYPE/STATE ! 15957: EJC ! 15958: * ! 15959: * EXPAN (CONTINUED) ! 15960: * ! 15961: * HERE FOR RBR,RPR,COL,SMC,CMA IN STATE 0 ! 15962: * ! 15963: * SET TO RESCAN THE TERMINATOR ENCOUNTERED AND CREATE ! 15964: * A NULL CONSTANT (CASE OF OMITTED NULL) ! 15965: * ! 15966: EXP02 MNZ SCNRS SET TO RESCAN ELEMENT ! 15967: MOV =NULLS,XR POINT TO NULL, MERGE ! 15968: * ! 15969: * HERE FOR VAR OR CON IN STATES 0,1 ! 15970: * ! 15971: * STACK THE VARIABLE/CONSTANT AND SET STATE=2 ! 15972: * ! 15973: EXP03 MOV XR,-(XS) STACK POINTER TO OPERAND ! 15974: MOV =NUM02,WA SET STATE 2 ! 15975: BRN EXP01 JUMP FOR NEXT ELEMENT ! 15976: * ! 15977: * HERE FOR VAR,CON,LPR,FNC,UOP IN STATE 2 ! 15978: * ! 15979: * WE RESCAN THE ELEMENT AND CREATE A CONCATENATION OPERATOR ! 15980: * THIS IS THE CASE OF THE BLANK CONCATENATION OPERATOR. ! 15981: * ! 15982: EXP04 MNZ SCNRS SET TO RESCAN ELEMENT ! 15983: MOV =OPDVC,XR POINT TO CONCAT OPERATOR DV ! 15984: BZE WB,EXP4A OK IF AT TOP LEVEL ! 15985: MOV =OPDVP,XR ELSE POINT TO UNMISTAKABLE CONCAT. ! 15986: * ! 15987: * MERGE HERE WHEN XR SET UP WITH PROPER CONCATENATION DVBLK ! 15988: * ! 15989: EXP4A BNZ SCNBL,EXP26 MERGE BOP IF BLANKS, ELSE ERROR ! 15990: DCV SCNSE ADJUST START OF ELEMENT LOCATION ! 15991: ERB 220,SYNTAX ERROR. MISSING OPERATOR ! 15992: * ! 15993: * HERE FOR CMA,RPR,RBR,COL,SMC,BOP(S=1) BOP(S=0) ! 15994: * ! 15995: * THIS IS AN ERRONOUS CONTRUCTION ! 15996: * ! 15997: EXP05 DCV SCNSE ADJUST START OF ELEMENT LOCATION ! 15998: ERB 221,SYNTAX ERROR. MISSING OPERAND ! 15999: * ! 16000: * HERE FOR LPR (S=0,1) ! 16001: * ! 16002: EXP06 MOV =NUM04,XL SET NEW LEVEL INDICATOR ! 16003: ZER XR SET ZERO VALUE FOR CMOPN ! 16004: EJC ! 16005: * ! 16006: * EXPAN (CONTINUED) ! 16007: * ! 16008: * MERGE HERE TO STORE OLD LEVEL ON STACK AND START NEW ONE ! 16009: * ! 16010: EXP07 MOV XR,-(XS) STACK CMOPN VALUE ! 16011: MOV WC,-(XS) STACK OLD COUNTER ! 16012: MOV WB,-(XS) STACK OLD LEVEL INDICATOR ! 16013: CHK CHECK FOR STACK OVERFLOW ! 16014: ZER WA SET NEW STATE TO ZERO ! 16015: MOV XL,WB SET NEW LEVEL INDICATOR ! 16016: MOV =NUM01,WC INITIALIZE NEW COUNTER ! 16017: BRN EXP01 JUMP TO SCAN NEXT ELEMENT ! 16018: * ! 16019: * HERE FOR LBR (S=0,1) ! 16020: * ! 16021: * THIS IS AN ILLEGAL USE OF LEFT BRACKET ! 16022: * ! 16023: EXP08 ERB 222,SYNTAX ERROR. INVALID USE OF LEFT BRACKET ! 16024: * ! 16025: * HERE FOR LBR (S=2) ! 16026: * ! 16027: * SET NEW LEVEL AND START TO SCAN SUBSCRIPTS ! 16028: * ! 16029: EXP09 MOV (XS)+,XR LOAD ARRAY PTR FOR CMOPN ! 16030: MOV =NUM03,XL SET NEW LEVEL INDICATOR ! 16031: BRN EXP07 JUMP TO STACK OLD AND START NEW ! 16032: * ! 16033: * HERE FOR FNC (S=0,1) ! 16034: * ! 16035: * STACK OLD LEVEL AND START TO SCAN ARGUMENTS ! 16036: * ! 16037: EXP10 MOV =NUM05,XL SET NEW LEV INDIC (XR=VRBLK=CMOPN) ! 16038: BRN EXP07 JUMP TO STACK OLD AND START NEW ! 16039: * ! 16040: * HERE FOR CMA (S=2) ! 16041: * ! 16042: * INCREMENT ARGUMENT COUNT AND CONTINUE ! 16043: * ! 16044: EXP11 ICV WC INCREMENT COUNTER ! 16045: JSR EXPDM DUMP OPERATORS AT THIS LEVEL ! 16046: ZER -(XS) SET NEW LEVEL FOR PARAMETER ! 16047: ZER WA SET NEW STATE ! 16048: BGT WB,=NUM02,EXP01 LOOP BACK UNLESS OUTER LEVEL ! 16049: ERB 223,SYNTAX ERROR. INVALID USE OF COMMA ! 16050: EJC ! 16051: * ! 16052: * EXPAN (CONTINUED) ! 16053: * ! 16054: * HERE FOR RPR (S=2) ! 16055: * ! 16056: * AT OUTER LEVEL IN A NORMAL GOTO THIS IS A TERMINATOR ! 16057: * OTHERWISE IT MUST TERMINATE A FUNCTION OR GROUPING ! 16058: * ! 16059: EXP12 BEQ WB,=NUM01,EXP20 END OF NORMAL GOTO ! 16060: BEQ WB,=NUM05,EXP13 END OF FUNCTION ARGUMENTS ! 16061: BEQ WB,=NUM04,EXP14 END OF GROUPING / SELECTION ! 16062: ERB 224,SYNTAX ERROR. UNBALANCED RIGHT PARENTHESIS ! 16063: * ! 16064: * HERE AT END OF FUNCTION ARGUMENTS ! 16065: * ! 16066: EXP13 MOV =C$FNC,XL SET CMTYP VALUE FOR FUNCTION ! 16067: BRN EXP15 JUMP TO BUILD CMBLK ! 16068: * ! 16069: * HERE FOR END OF GROUPING ! 16070: * ! 16071: EXP14 BEQ WC,=NUM01,EXP17 JUMP IF END OF GROUPING ! 16072: MOV =C$SEL,XL ELSE SET CMTYP FOR SELECTION ! 16073: * ! 16074: * MERGE HERE TO BUILD CMBLK FOR LEVEL JUST SCANNED AND ! 16075: * TO POP UP TO THE PREVIOUS SCAN LEVEL BEFORE CONTINUING. ! 16076: * ! 16077: EXP15 JSR EXPDM DUMP OPERATORS AT THIS LEVEL ! 16078: MOV WC,WA COPY COUNT ! 16079: ADD =CMVLS,WA ADD FOR STANDARD FIELDS AT START ! 16080: WTB WA CONVERT LENGTH TO BYTES ! 16081: JSR ALLOC ALLOCATE SPACE FOR CMBLK ! 16082: MOV =B$CMT,(XR) STORE TYPE CODE FOR CMBLK ! 16083: MOV XL,CMTYP(XR) STORE CMBLK NODE TYPE INDICATOR ! 16084: MOV WA,CMLEN(XR) STORE LENGTH ! 16085: ADD WA,XR POINT PAST END OF BLOCK ! 16086: LCT WC,WC SET LOOP COUNTER ! 16087: * ! 16088: * LOOP TO MOVE REMAINING WORDS TO CMBLK ! 16089: * ! 16090: EXP16 MOV (XS)+,-(XR) MOVE ONE OPERAND PTR FROM STACK ! 16091: MOV (XS)+,WB POP TO OLD LEVEL INDICATOR ! 16092: BCT WC,EXP16 LOOP TILL ALL MOVED ! 16093: EJC ! 16094: * ! 16095: * EXPAN (CONTINUED) ! 16096: * ! 16097: * COMPLETE CMBLK AND STACK POINTER TO IT ON STACK ! 16098: * ! 16099: SUB *CMVLS,XR POINT BACK TO START OF BLOCK ! 16100: MOV (XS)+,WC RESTORE OLD COUNTER ! 16101: MOV (XS),CMOPN(XR) STORE OPERAND PTR IN CMBLK ! 16102: MOV XR,(XS) STACK CMBLK POINTER ! 16103: MOV =NUM02,WA SET NEW STATE ! 16104: BRN EXP01 BACK FOR NEXT ELEMENT ! 16105: * ! 16106: * HERE AT END OF A PARENTHESIZED EXPRESSION ! 16107: * ! 16108: EXP17 JSR EXPDM DUMP OPERATORS AT THIS LEVEL ! 16109: MOV (XS)+,XR RESTORE XR ! 16110: MOV (XS)+,WB RESTORE OUTER LEVEL ! 16111: MOV (XS)+,WC RESTORE OUTER COUNT ! 16112: MOV XR,(XS) STORE OPND OVER UNUSED CMOPN VAL ! 16113: MOV =NUM02,WA SET NEW STATE ! 16114: BRN EXP01 BACK FOR NEXT ELE8ENT ! 16115: * ! 16116: * HERE FOR RBR (S=2) ! 16117: * ! 16118: * AT OUTER LEVEL IN A DIRECT GOTO, THIS IS A TERMINATOR. ! 16119: * OTHERWISE IT MUST TERMINATE A SUBSCRIPT LIST. ! 16120: * ! 16121: EXP18 MOV =C$ARR,XL SET CMTYP FOR ARRAY REFERENCE ! 16122: BEQ WB,=NUM03,EXP15 JUMP TO BUILD CMBLK IF END ARRAYREF ! 16123: BEQ WB,=NUM02,EXP20 JUMP IF END OF DIRECT GOTO ! 16124: ERB 225,SYNTAX ERROR. UNBALANCED RIGHT BRACKET ! 16125: EJC ! 16126: * ! 16127: * EXPAN (CONTINUED) ! 16128: * ! 16129: * HERE FOR COL,SMC (S=2) ! 16130: * ! 16131: * ERROR UNLESS TERMINATING STATEMENT BODY AT OUTER LEVEL ! 16132: * ! 16133: EXP19 MNZ SCNRS RESCAN TERMINATOR ! 16134: MOV WB,XL COPY LEVEL INDICATOR ! 16135: BSW XL,6 SWITCH ON LEVEL INDICATOR ! 16136: IFF 0,EXP20 NORMAL OUTER LEVEL ! 16137: IFF 1,EXP22 FAIL IF NORMAL GOTO ! 16138: IFF 2,EXP23 FAIL IF DIRECT GOTO ! 16139: IFF 3,EXP24 FAIL ARRAY BRACKETS ! 16140: IFF 4,EXP21 FAIL IF IN GROUPING ! 16141: IFF 5,EXP21 FAIL FUNCTION ARGS ! 16142: ESW END SWITCH ON LEVEL ! 16143: * ! 16144: * HERE AT NORMAL END OF EXPRESSION ! 16145: * ! 16146: EXP20 JSR EXPDM DUMP REMAINING OPERATORS ! 16147: MOV (XS)+,XR LOAD TREE POINTER ! 16148: ICA XS POP OFF BOTTOM OF STACK MARKER ! 16149: EXI RETURN TO EXPAN CALLER ! 16150: * ! 16151: * MISSING RIGHT PAREN ! 16152: * ! 16153: EXP21 ERB 226,SYNTAX ERROR. MISSING RIGHT PAREN ! 16154: * ! 16155: * MISSING RIGHT PAREN IN GOTO FIELD ! 16156: * ! 16157: EXP22 ERB 227,SYNTAX ERROR. RIGHT PAREN MISSING FROM GOTO ! 16158: * ! 16159: * MISSING BRACKET IN GOTO ! 16160: * ! 16161: EXP23 ERB 228,SYNTAX ERROR. RIGHT BRACKET MISSING FROM GOTO ! 16162: * ! 16163: * MISSING ARRAY BRACKET ! 16164: * ! 16165: EXP24 ERB 229,SYNTAX ERROR. MISSING RIGHT ARRAY BRACKET ! 16166: EJC ! 16167: * ! 16168: * EXPAN (CONTINUED) ! 16169: * ! 16170: * LOOP HERE WHEN AN OPERATOR CAUSES AN OPERATOR DUMP ! 16171: * ! 16172: EXP25 MOV XR,EXPSV ! 16173: JSR EXPOP POP ONE OPERATOR ! 16174: MOV EXPSV,XR RESTORE OP DV POINTER AND MERGE ! 16175: * ! 16176: * HERE FOR BOP (S=2) ! 16177: * ! 16178: * REMOVE OPERATORS (CONDENSE) FROM STACK UNTIL NO MORE ! 16179: * LEFT AT THIS LEVEL OR TOP ONE HAS LOWER PRECEDENCE. ! 16180: * LOOP HERE TILL THIS CONDITION IS MET. ! 16181: * ! 16182: EXP26 MOV 1(XS),XL LOAD OPERATOR DVPTR FROM STACK ! 16183: BLE XL,=NUM05,EXP27 JUMP IF BOTTOM OF STACK LEVEL ! 16184: BLT DVRPR(XR),DVLPR(XL),EXP25 ELSE POP IF NEW PREC IS LO ! 16185: * ! 16186: * HERE FOR UOP (S=0,1) ! 16187: * ! 16188: * BINARY OPERATOR MERGES AFTER PRECEDENCE CHECK ! 16189: * ! 16190: * THE OPERATOR DV IS STORED ON THE STACK AND THE SCAN ! 16191: * CONTINUES AFTER SETTING THE SCAN STATE TO ONE. ! 16192: * ! 16193: EXP27 MOV XR,-(XS) STACK OPERATOR DVPTR ON STACK ! 16194: CHK CHECK FOR STACK OVERFLOW ! 16195: MOV =NUM01,WA SET NEW STATE ! 16196: BNE XR,=OPDVS,EXP01 BACK FOR NEXT ELEMENT UNLESS = ! 16197: * ! 16198: * HERE FOR SPECIAL CASE OF BINARY =. THE SYNTAX ALLOWS A ! 16199: * NULL RIGHT ARGUMENT FOR THIS OPERATOR TO BE LEFT ! 16200: * OUT. ACCORDINGLY WE RESET TO STATE ZERO TO GET PROPER ! 16201: * ACTION ON A TERMINATOR (SUPPLY A NULL CONSTANT). ! 16202: * ! 16203: ZER WA SET STATE ZERO ! 16204: BRN EXP01 JUMP FOR NEXT ELEMENT ! 16205: ENP END PROCEDURE EXPAN ! 16206: EJC ! 16207: * ! 16208: * EXPAP -- TEST FOR PATTERN MATCH TREE ! 16209: * ! 16210: * EXPAP IS PASSED AN EXPRESSION TREE TO DETERMINE IF IT ! 16211: * IS A PATTERN MATCH. THE FOLLOWING ARE RECOGIZED AS ! 16212: * MATCHES IN THE CONTEXT OF THIS CALL. ! 16213: * ! 16214: * 1) AN EXPLICIT USE OF BINARY QUESTION MARK ! 16215: * 2) A CONCATENATION ! 16216: * 3) AN ALTERNATION WHOSE LEFT OPERAND IS A CONCATENATION ! 16217: * ! 16218: * (XR) PTR TO EXPAN TREE ! 16219: * JSR EXPAP CALL TO TEST FOR PATTERN MATCH ! 16220: * PPM LOC TRANSFER LOC IF NOT A PATTERN MATCH ! 16221: * (WA) DESTROYED ! 16222: * (XR) UNCHANGED (IF NOT MATCH) ! 16223: * (XR) PTR TO BINARY OPERATOR BLK IF MATCH ! 16224: * ! 16225: EXPAP PRC E,1 ENTRY POINT ! 16226: MOV XL,-(XS) SAVE XL ! 16227: BNE (XR),=B$CMT,EXPP2 NO MATCH IF NOT COMPLEX ! 16228: MOV CMTYP(XR),WA ELSE LOAD TYPE CODE ! 16229: BEQ WA,=C$CNC,EXPP1 CONCATENATION IS A MATCH ! 16230: BEQ WA,=C$PMT,EXPP1 BINARY QUESTION MARK IS A MATCH ! 16231: BNE WA,=C$ALT,EXPP2 ELSE NOT MATCH UNLESS ALTERNATION ! 16232: * ! 16233: * HERE FOR ALTERNATION. CHANGE (A B) / C TO A QM (B / C) ! 16234: * ! 16235: MOV CMLOP(XR),XL LOAD LEFT OPERAND POINTER ! 16236: BNE (XL),=B$CMT,EXPP2 NOT MATCH IF LEFT OPND NOT COMPLEX ! 16237: BNE CMTYP(XL),=C$CNC,EXPP2 NOT MATCH IF LEFT OP NOT CONC ! 16238: MOV CMROP(XL),CMLOP(XR) XR POINTS TO (B / C) ! 16239: MOV XR,CMROP(XL) SET XL OPNDS TO A, (B / C) ! 16240: MOV XL,XR POINT TO THIS ALTERED NODE ! 16241: * ! 16242: * EXIT HERE FOR PATTERN MATCH ! 16243: * ! 16244: EXPP1 MOV (XS)+,XL RESTORE ENTRY XL ! 16245: EXI GIVE PATTERN MATCH RETURN ! 16246: * ! 16247: * EXIT HERE IF NOT PATTERN MATCH ! 16248: * ! 16249: EXPP2 MOV (XS)+,XL RESTORE ENTRY XL ! 16250: EXI 1 GIVE NON-MATCH RETURN ! 16251: ENP END PROCEDURE EXPAP ! 16252: EJC ! 16253: * ! 16254: * EXPDM -- DUMP OPERATORS AT CURRENT LEVEL (FOR EXPAN) ! 16255: * ! 16256: * EXPDM USES EXPOP TO CONDENSE ALL OPERATORS AT THIS SYNTAX ! 16257: * LEVEL. THE STACK BOTTOM IS RECOGNIZED FROM THE LEVEL ! 16258: * VALUE WHICH IS SAVED ON THE TOP OF THE STACK. ! 16259: * ! 16260: * JSR EXPDM CALL TO DUMP OPERATORS ! 16261: * (XS) POPPED AS REQUIRED ! 16262: * (XR,WA) DESTROYED ! 16263: * ! 16264: EXPDM PRC N,0 ENTRY POINT ! 16265: MOV XL,R$EXS SAVE XL VALUE ! 16266: * ! 16267: * LOOP TO DUMP OPERATORS ! 16268: * ! 16269: EXDM1 BLE 1(XS),=NUM05,EXDM2 JUMP IF STACK BOTTOM (SAVED LEVEL ! 16270: JSR EXPOP ELSE POP ONE OPERATOR ! 16271: BRN EXDM1 AND LOOP BACK ! 16272: * ! 16273: * HERE AFTER POPPING ALL OPERATORS ! 16274: * ! 16275: EXDM2 MOV R$EXS,XL RESTORE XL ! 16276: ZER R$EXS RELEASE SAVE LOCATION ! 16277: EXI RETURN TO EXPDM CALLER ! 16278: ENP END PROCEDURE EXPDM ! 16279: EJC ! 16280: * ! 16281: * EXPOP-- POP OPERATOR (FOR EXPAN) ! 16282: * ! 16283: * EXPOP IS USED BY THE EXPAN ROUTINE TO CONDENSE ONE ! 16284: * OPERATOR FROM THE TOP OF THE SYNTAX STACK. AN APPROPRIATE ! 16285: * CMBLK IS BUILT FOR THE OPERATOR (UNARY OR BINARY) AND A ! 16286: * POINTER TO THIS CMBLK IS STACKED. ! 16287: * ! 16288: * EXPOP IS ALSO USED BY SCNGF (GOTO FIELD SCAN) PROCEDURE ! 16289: * ! 16290: * JSR EXPOP CALL TO POP OPERATOR ! 16291: * (XS) POPPED APPROPRIATELY ! 16292: * (XR,XL,WA) DESTROYED ! 16293: * ! 16294: EXPOP PRC N,0 ENTRY POINT ! 16295: MOV 1(XS),XR LOAD OPERATOR DV POINTER ! 16296: BEQ DVLPR(XR),=LLUNO,EXPO2 JUMP IF UNARY ! 16297: * ! 16298: * HERE FOR BINARY OPERATOR ! 16299: * ! 16300: MOV *CMBS$,WA SET SIZE OF BINARY OPERATOR CMBLK ! 16301: JSR ALLOC ALLOCATE SPACE FOR CMBLK ! 16302: MOV (XS)+,CMROP(XR) POP AND STORE RIGHT OPERAND PTR ! 16303: MOV (XS)+,XL POP AND LOAD OPERATOR DV PTR ! 16304: MOV (XS),CMLOP(XR) STORE LEFT OPERAND POINTER ! 16305: * ! 16306: * COMMON EXIT POINT ! 16307: * ! 16308: EXPO1 MOV =B$CMT,(XR) STORE TYPE CODE FOR CMBLK ! 16309: MOV DVTYP(XL),CMTYP(XR) STORE CMBLK NODE TYPE CODE ! 16310: MOV XL,CMOPN(XR) STORE DVPTR (=PTR TO DAC O$XXX) ! 16311: MOV WA,CMLEN(XR) STORE CMBLK LENGTH ! 16312: MOV XR,(XS) STORE RESULTING NODE PTR ON STACK ! 16313: EXI RETURN TO EXPOP CALLER ! 16314: * ! 16315: * HERE FOR UNARY OPERATOR ! 16316: * ! 16317: EXPO2 MOV *CMUS$,WA SET SIZE OF UNARY OPERATOR CMBLK ! 16318: JSR ALLOC ALLOCATE SPACE FOR CMBLK ! 16319: MOV (XS)+,CMROP(XR) POP AND STORE OPERAND POINTER ! 16320: MOV (XS),XL LOAD OPERATOR DV POINTER ! 16321: BRN EXPO1 MERGE BACK TO EXIT ! 16322: ENP END PROCEDURE EXPOP ! 16323: EJC ! 16324: .IF .CULC ! 16325: * ! 16326: * FLSTG -- FOLD STRING TO UPPER CASE ! 16327: * ! 16328: * FLSTG FOLDS A CHARACTER STRING CONTAINING LOWER CASE ! 16329: * CHARACCTERS TO ONE CONTAINING UPPER CASE CHARACTERS. ! 16330: * FOLDING IS ONLY DONE IF &CASE (KVCAS) IS NOT ZERO. ! 16331: * ! 16332: * (XR) STRING ARGUMENT ! 16333: * (WA) LENGTH OF STRING ! 16334: * JSR FLSTG CALL TO FOLD STRING ! 16335: * (XR) RESULT STRING (POSSIBLY ORIGINAL) ! 16336: * (WC) DESTROYED ! 16337: * ! 16338: FLSTG PRC R,0 ENTRY POINT ! 16339: BZE KVCAS,FST99 SKIP IF &CASE IS 0 ! 16340: MOV XL,-(XS) SAVE XL ACROSS CALL ! 16341: MOV XR,-(XS) SAVE ORIGINAL SCBLK PTR ! 16342: JSR ALOCS ALLOCATE NEW STRING BLOCK ! 16343: MOV (XS),XL POINT TO ORIGINAL SCBLK ! 16344: MOV XR,-(XS) SAVE POINTER TO NEW SCBLK ! 16345: PLC XL POINT TO ORIGINAL CHARS ! 16346: PLC XR POINT TO NEW CHARS ! 16347: ZER -(XS) INIT DID FOLD FLAG ! 16348: LCT WC,WC LOAD LOOP COUNTER ! 16349: FST01 LCH WA,(XL)+ LOAD CHARACTER ! 16350: BGT =CH$$A,WA,FST02 SKIP IF LESS THAN LC A ! 16351: BGT WA,=CH$$$,FST02 SKIP IF GREATER THAN LC Z ! 16352: FLC WA FOLD CHARACTER TO UPPER CASE ! 16353: MNZ (XS) SET DID FOLD CHARACTER FLAG ! 16354: FST02 SCH WA,(XR)+ STORE (POSSIBLY FOLDED) CHARACTER ! 16355: BCT WC,FST01 LOOP THRU ENTIRE STRING ! 16356: CSC XR COMPLETE STORE CHARACTERS ! 16357: BNZ (XS)+,FST10 SKIP IF FOLDING DONE ! 16358: MOV (XS)+,DNAMP DO NOT NEED NEW SCBLK ! 16359: MOV (XS)+,XR RETURN ORIGINAL SCBLK ! 16360: BRN FST20 MERGE BELOW ! 16361: FST10 MOV (XS)+,XR RETURN NEW SCBLK ! 16362: ICA XS THROW AWAY ORIGINAL SCBLK POINTER ! 16363: FST20 MOV SCLEN(XR),WA RELOAD STRING LENGTH ! 16364: MOV (XS)+,XL RESTORE XL ! 16365: FST99 EXI RETURN ! 16366: ENP ! 16367: EJC ! 16368: .FI ! 16369: * ! 16370: * GBCOL -- PERFORM GARBAGE COLLECTION ! 16371: * ! 16372: * GBCOL PERFORMS A GARBAGE COLLECTION ON THE DYNAMIC REGION ! 16373: * ALL BLOCKS WHICH ARE NO LONGER IN USE ARE ELIMINATED ! 16374: * BY MOVING BLOCKS WHICH ARE IN USE DOWN AND RESETTING ! 16375: * DNAMP, THE POINTER TO THE NEXT AVAILABLE LOCATION. ! 16376: * ! 16377: * (WB) MOVE OFFSET (SEE BELOW) ! 16378: * JSR GBCOL CALL TO COLLECT GARBAGE ! 16379: * (XR) DESTROYED ! 16380: * ! 16381: * THE FOLLOWING CONDITIONS MUST BE MET AT THE TIME WHEN ! 16382: * GBCOL IS CALLED. ! 16383: * ! 16384: * 1) ALL POINTERS TO BLOCKS IN THE DYNAMIC AREA MUST BE ! 16385: * ACCESSIBLE TO THE GARBAGE COLLECTOR. THIS MEANS ! 16386: * THAT THEY MUST OCCUR IN ONE OF THE FOLLOWING. ! 16387: * ! 16388: * A) MAIN STACK, WITH CURRENT TOP ! 16389: * ELEMENT BEING INDICATED BY XS ! 16390: * ! 16391: * B) IN RELOCATABLE FIELDS OF VRBLKS. ! 16392: * ! 16393: * C) IN REGISTER XL AT THE TIME OF CALL ! 16394: * ! 16395: * E) IN THE SPECIAL REGION OF WORKING ! 16396: * STORAGE WHERE NAMES BEGIN WITH R$. ! 16397: * ! 16398: * 2) ALL POINTERS MUST POINT TO THE START OF BLOCKS WITH ! 16399: * THE SOLE EXCEPTION OF THE CONTENTS OF THE CODE ! 16400: * POINTER REGISTER WHICH POINTS INTO THE R$COD BLOCK. ! 16401: * ! 16402: * 3) NO LOCATION WHICH APPEARS TO CONTAIN A POINTER ! 16403: * INTO THE DYNAMIC REGION MAY OCCUR UNLESS IT IS IN ! 16404: * FACT A POINTER TO THE START OF THE BLOCK. HOWEVER ! 16405: * POINTERS OUTSIDE THIS AREA MAY OCCUR AND WILL ! 16406: * NOT BE CHANGED BY THE GARBAGE COLLECTOR. ! 16407: * IT IS ESPECIALLY IMPORTANT TO MAKE SURE THAT XL ! 16408: * DOES NOT CONTAIN A GARBAGE VALUE FROM SOME PROCESS ! 16409: * CARRIED OUT BEFORE THE CALL TO THE COLLECTOR. ! 16410: * ! 16411: * GBCOL HAS THE CAPABILITY OF MOVING THE FINAL COMPACTED ! 16412: * RESULT UP IN MEMORY (WITH ADDRESSES ADJUSTED ACCORDINGLY) ! 16413: * THIS IS USED TO ADD SPACE TO THE STATIC REGION. THE ! 16414: * ENTRY VALUE OF WB IS THE NUMBER OF BYTES TO MOVE UP. ! 16415: * THE CALLER MUST GUARANTEE THAT THERE IS ENOUGH ROOM. ! 16416: * FURTHERMORE THE VALUE IN WB IF IT IS NON-ZERO, MUST BE AT ! 16417: * LEAST 256 SO THAT THE MWB INSTRUCTION CONDITIONS ARE MET. ! 16418: EJC ! 16419: * ! 16420: * GBCOL (CONTINUED) ! 16421: * ! 16422: * THE ALGORITHM, WHICH IS A MODIFICATION OF THE LISP-2 ! 16423: * GARBAGE COLLECTOR DEVISED BY R.DEWAR AND K.BELCHER ! 16424: * TAKES THREE PASSES AS FOLLOWS. ! 16425: * ! 16426: * 1) ALL POINTERS IN MEMORY ARE SCANNED AND BLOCKS IN USE ! 16427: * DETERMINED FROM THIS SCAN. NOTE THAT THIS PROCEDURE ! 16428: * IS RECURSIVE AND USES THE MAIN STACK FOR LINKAGE. ! 16429: * THE MARKING PROCESS IS THUS SIMILAR TO THAT USED IN ! 16430: * A STANDARD LISP COLLECTOR. HOWEVER THE METHOD OF ! 16431: * ACTUALLY MARKING THE BLOCKS IS DIFFERENT. ! 16432: * ! 16433: * THE FIRST FIELD OF A BLOCK NORMALLY CONTAINS A ! 16434: * CODE ENTRY POINT POINTER. SUCH AN ENTRY POINTER ! 16435: * CAN BE DISTINGUISHED FROM THE ADDRESS OF ANY POINTER ! 16436: * TO BE PROCESSED BY THE COLLECTOR. DURING GARBAGE ! 16437: * COLLECTION, THIS WORD IS USED TO BUILD A BACK CHAIN ! 16438: * OF POINTERS THROUGH FIELDS WHICH POINT TO THE BLOCK. ! 16439: * THE END OF THE CHAIN IS MARKED BY THE OCCURENCE ! 16440: * OF THE WORD WHICH USED TO BE IN THE FIRST WORD OF ! 16441: * THE BLOCK. THIS BACKCHAIN SERVES BOTH AS A MARK ! 16442: * INDICATING THAT THE BLOCK IS IN USE AND AS A LIST OF ! 16443: * REFERENCES FOR THE RELOCATION PHASE. ! 16444: * ! 16445: * 2) STORAGE IS SCANNED SEQUENTIALLY TO DISCOVER WHICH ! 16446: * BLOCKS ARE CURRENTLY IN USE AS INDICATED BY THE ! 16447: * PRESENCE OF A BACKCHAIN. TWO POINTERS ARE MAINTAINED ! 16448: * ONE SCANS THROUGH LOOKING AT EACH BLOCK. THE OTHER ! 16449: * IS INCREMENTED ONLY FOR BLOCKS FOUND TO BE IN USE. ! 16450: * IN THIS WAY, THE EVENTUAL LOCATION OF EACH BLOCK CAN ! 16451: * BE DETERMINED WITHOUT ACTUALLY MOVING ANY BLOCKS. ! 16452: * AS EACH BLOCK WHICH IS IN USE IS PROCESSED, THE BACK ! 16453: * CHAIN IS USED TO RESET ALL POINTERS WHICH POINT TO ! 16454: * THIS BLOCK TO CONTAIN ITS NEW ADDRESS, I.E. THE ! 16455: * ADDRESS IT WILL OCCUPY AFTER THE BLOCKS ARE MOVED. ! 16456: * THE FIRST WORD OF THE BLOCK, TAKEN FROM THE END OF ! 16457: * THE CHAIN IS RESTORED AT THIS POINT. ! 16458: * ! 16459: * DURING PASS 2, THE COLLECTOR BUILDS BLOCKS WHICH ! 16460: * DESCRIBE THE REGIONS OF STORAGE WHICH ARE TO BE ! 16461: * MOVED IN THE THIRD PASS. THERE IS ONE DESCRIPTOR FOR ! 16462: * EACH CONTIGUOUS SET OF GOOD BLOCKS. THE DESCRIPTOR ! 16463: * IS BUILT JUST BEHIND THE BLOCK TO BE MOVED AND ! 16464: * CONTAINS A POINTER TO THE NEXT BLOCK AND THE NUMBER ! 16465: * OF WORDS TO BE MOVED. ! 16466: * ! 16467: * 3) IN THE THIRD AND FINAL PASS, THE MOVE DESCRIPTOR ! 16468: * BLOCKS BUILT IN PASS TWO ARE USED TO ACTUALLY MOVE ! 16469: * THE BLOCKS DOWN TO THE BOTTOM OF THE DYNAMIC REGION. ! 16470: * THE COLLECTION IS THEN COMPLETE AND THE NEXT ! 16471: * AVAILABLE LOCATION POINTER IS RESET. ! 16472: EJC ! 16473: * ! 16474: * GBCOL (CONTINUED) ! 16475: * ! 16476: GBCOL PRC E,0 ENTRY POINT ! 16477: BNZ DMVCH,GBC14 FAIL IF IN MID-DUMP ! 16478: MNZ GBCFL NOTE GBCOL ENTERED ! 16479: MOV WA,GBSVA SAVE ENTRY WA ! 16480: MOV WB,GBSVB SAVE ENTRY WB ! 16481: MOV WC,GBSVC SAVE ENTRY WC ! 16482: MOV XL,-(XS) SAVE ENTRY XL ! 16483: SCP WA GET CODE POINTER VALUE ! 16484: SUB R$COD,WA MAKE RELATIVE ! 16485: LCP WA AND RESTORE ! 16486: * ! 16487: * PROCESS STACK ENTRIES ! 16488: * ! 16489: MOV XS,XR POINT TO STACK FRONT ! 16490: MOV STBAS,XL POINT PAST END OF STACK ! 16491: BGE XL,XR,GBC00 OK IF D-STACK ! 16492: MOV XL,XR REVERSE IF ... ! 16493: MOV XS,XL ... U-STACK ! 16494: * ! 16495: * PROCESS THE STACK ! 16496: * ! 16497: GBC00 JSR GBCPF PROCESS POINTERS ON STACK ! 16498: * ! 16499: * PROCESS SPECIAL WORK LOCATIONS ! 16500: * ! 16501: MOV =R$AAA,XR POINT TO START OF RELOCATABLE LOCS ! 16502: MOV =R$YYY,XL POINT PAST END OF RELOCATABLE LOCS ! 16503: JSR GBCPF PROCESS WORK FIELDS ! 16504: * ! 16505: * PREPARE TO PROCESS VARIABLE BLOCKS ! 16506: * ! 16507: MOV HSHTB,WA POINT TO FIRST HASH SLOT POINTER ! 16508: * ! 16509: * LOOP THROUGH HASH SLOTS ! 16510: * ! 16511: GBC01 MOV WA,XL POINT TO NEXT SLOT ! 16512: ICA WA BUMP BUCKET POINTER ! 16513: MOV WA,GBCNM SAVE BUCKET POINTER ! 16514: EJC ! 16515: * ! 16516: * GBCOL (CONTINUED) ! 16517: * ! 16518: * LOOP THROUGH VARIABLES ON ONE HASH CHAIN ! 16519: * ! 16520: GBC02 MOV (XL),XR LOAD PTR TO NEXT VRBLK ! 16521: BZE XR,GBC03 JUMP IF END OF CHAIN ! 16522: MOV XR,XL ELSE COPY VRBLK POINTER ! 16523: ADD *VRVAL,XR POINT TO FIRST RELOC FLD ! 16524: ADD *VRNXT,XL POINT PAST LAST (AND TO LINK PTR) ! 16525: JSR GBCPF PROCESS RELOC FIELDS IN VRBLK ! 16526: BRN GBC02 LOOP BACK FOR NEXT BLOCK ! 16527: * ! 16528: * HERE AT END OF ONE HASH CHAIN ! 16529: * ! 16530: GBC03 MOV GBCNM,WA RESTORE BUCKET POINTER ! 16531: BNE WA,HSHTE,GBC01 LOOP BACK IF MORE BUCKETS TO GO ! 16532: EJC ! 16533: * ! 16534: * GBCOL (CONTINUED) ! 16535: * ! 16536: * NOW WE ARE READY TO START PASS TWO. REGISTERS ARE USED ! 16537: * AS FOLLOWS IN PASS TWO. ! 16538: * ! 16539: * (XR) SCANS THROUGH ALL BLOCKS ! 16540: * (WC) POINTER TO EVENTUAL LOCATION ! 16541: * ! 16542: * THE MOVE DESCRIPTION BLOCKS BUILT IN THIS PASS HAVE ! 16543: * THE FOLLOWING FORMAT. ! 16544: * ! 16545: * WORD 1 POINTER TO NEXT MOVE BLOCK, ! 16546: * ZERO IF END OF CHAIN OF BLOCKS ! 16547: * ! 16548: * WORD 2 LENGTH OF BLOCKS TO BE MOVED IN ! 16549: * BYTES. SET TO THE ADDRESS OF THE ! 16550: * FIRST BYTE WHILE ACTUALLY SCANNING ! 16551: * THE BLOCKS. ! 16552: * ! 16553: * THE FIRST ENTRY ON THIS CHAIN IS A SPECIAL ENTRY ! 16554: * CONSISTING OF THE TWO WORDS GBCNM AND GBCNS. AFTER ! 16555: * BUILDING THE CHAIN OF MOVE DESCRIPTORS, GBCNM POINTS TO ! 16556: * THE FIRST REAL MOVE BLOCK, AND GBCNS IS THE LENGTH OF ! 16557: * BLOCKS IN USE AT THE START OF STORAGE WHICH NEED NOT ! 16558: * BE MOVED SINCE THEY ARE IN THE CORRECT POSITION. ! 16559: * ! 16560: GBC04 MOV DNAMB,XR POINT TO FIRST BLOCK ! 16561: MOV XR,WC SET AS FIRST EVENTUAL LOCATION ! 16562: ADD GBSVB,WC ADD OFFSET FOR EVENTUAL MOVE UP ! 16563: ZER GBCNM CLEAR INITIAL FORWARD POINTER ! 16564: MOV =GBCNM,GBCLM INITIALIZE PTR TO LAST MOVE BLOCK ! 16565: MOV XR,GBCNS INITIALIZE FIRST ADDRESS ! 16566: * ! 16567: * LOOP THROUGH A SERIES OF BLOCKS IN USE ! 16568: * ! 16569: GBC05 BEQ XR,DNAMP,GBC07 JUMP IF END OF USED REGION ! 16570: MOV (XR),WA ELSE GET FIRST WORD ! 16571: BHI WA,=P$YYY,GBC06 SKIP IF NOT ENTRY PTR (IN USE) ! 16572: BHI WA,=B$AAA,GBC07 JUMP IF ENTRY POINTER (UNUSED) ! 16573: * ! 16574: * HERE FOR BLOCK IN USE, LOOP TO RELOCATE REFERENCES ! 16575: * ! 16576: GBC06 MOV WA,XL COPY POINTER ! 16577: MOV (XL),WA LOAD FORWARD POINTER ! 16578: MOV WC,(XL) RELOCATE REFERENCE ! 16579: BHI WA,=P$YYY,GBC06 LOOP BACK IF NOT END OF CHAIN ! 16580: BLO WA,=B$AAA,GBC06 LOOP BACK IF NOT END OF CHAIN ! 16581: EJC ! 16582: * ! 16583: * GBCOL (CONTINUED) ! 16584: * ! 16585: * AT END OF CHAIN, RESTORE FIRST WORD AND BUMP PAST ! 16586: * ! 16587: MOV WA,(XR) RESTORE FIRST WORD ! 16588: JSR BLKLN GET LENGTH OF THIS BLOCK ! 16589: ADD WA,XR BUMP ACTUAL POINTER ! 16590: ADD WA,WC BUMP EVENTUAL POINTER ! 16591: BRN GBC05 LOOP BACK FOR NEXT BLOCK ! 16592: * ! 16593: * HERE AT END OF A SERIES OF BLOCKS IN USE ! 16594: * ! 16595: GBC07 MOV XR,WA COPY POINTER PAST LAST BLOCK ! 16596: MOV GBCLM,XL POINT TO PREVIOUS MOVE BLOCK ! 16597: SUB 1(XL),WA SUBTRACT STARTING ADDRESS ! 16598: MOV WA,1(XL) STORE LENGTH OF BLOCK TO BE MOVED ! 16599: * ! 16600: * LOOP THROUGH A SERIES OF BLOCKS NOT IN USE ! 16601: * ! 16602: GBC08 BEQ XR,DNAMP,GBC10 JUMP IF END OF USED REGION ! 16603: MOV (XR),WA ELSE LOAD FIRST WORD OF NEXT BLOCK ! 16604: BHI WA,=P$YYY,GBC09 JUMP IF IN USE ! 16605: BLO WA,=B$AAA,GBC09 JUMP IF IN USE ! 16606: JSR BLKLN ELSE GET LENGTH OF NEXT BLOCK ! 16607: ADD WA,XR PUSH POINTER ! 16608: BRN GBC08 AND LOOP BACK ! 16609: * ! 16610: * HERE FOR A BLOCK IN USE AFTER PROCESSING A SERIES OF ! 16611: * BLOCKS WHICH WERE NOT IN USE, BUILD NEW MOVE BLOCK. ! 16612: * ! 16613: GBC09 SUB *NUM02,XR POINT 2 WORDS BEHIND FOR MOVE BLOCK ! 16614: MOV GBCLM,XL POINT TO PREVIOUS MOVE BLOCK ! 16615: MOV XR,(XL) SET FORWARD PTR IN PREVIOUS BLOCK ! 16616: ZER (XR) ZERO FORWARD PTR OF NEW BLOCK ! 16617: MOV XR,GBCLM REMEMBER ADDRESS OF THIS BLOCK ! 16618: MOV XR,XL COPY PTR TO MOVE BLOCK ! 16619: ADD *NUM02,XR POINT BACK TO BLOCK IN USE ! 16620: MOV XR,1(XL) STORE STARTING ADDRESS ! 16621: BRN GBC06 JUMP TO PROCESS BLOCK IN USE ! 16622: EJC ! 16623: * ! 16624: * GBCOL (CONTINUED) ! 16625: * ! 16626: * HERE FOR PASS THREE -- ACTUALLY MOVE THE BLOCKS DOWN ! 16627: * ! 16628: * (XL) POINTER TO OLD LOCATION ! 16629: * (XR) POINTER TO NEW LOCATION ! 16630: * ! 16631: GBC10 MOV DNAMB,XR POINT TO START OF STORAGE ! 16632: ADD GBCNS,XR BUMP PAST UNMOVED BLOCKS AT START ! 16633: * ! 16634: * LOOP THROUGH MOVE DESCRIPTORS ! 16635: * ! 16636: GBC11 MOV GBCNM,XL POINT TO NEXT MOVE BLOCK ! 16637: BZE XL,GBC12 JUMP IF END OF CHAIN ! 16638: MOV (XL)+,GBCNM MOVE POINTER DOWN CHAIN ! 16639: MOV (XL)+,WA GET LENGTH TO MOVE ! 16640: MVW PERFORM MOVE ! 16641: BRN GBC11 LOOP BACK ! 16642: * ! 16643: * NOW TEST FOR MOVE UP ! 16644: * ! 16645: GBC12 MOV XR,DNAMP SET NEXT AVAILABLE LOC PTR ! 16646: MOV GBSVB,WB RELOAD MOVE OFFSET ! 16647: BZE WB,GBC13 JUMP IF NO MOVE REQUIRED ! 16648: MOV XR,XL ELSE COPY OLD TOP OF CORE ! 16649: ADD WB,XR POINT TO NEW TOP OF CORE ! 16650: MOV XR,DNAMP SAVE NEW TOP OF CORE POINTER ! 16651: MOV XL,WA COPY OLD TOP ! 16652: SUB DNAMB,WA MINUS OLD BOTTOM = LENGTH ! 16653: ADD WB,DNAMB BUMP BOTTOM TO GET NEW VALUE ! 16654: MWB PERFORM MOVE (BACKWARDS) ! 16655: * ! 16656: * MERGE HERE TO EXIT ! 16657: * ! 16658: GBC13 MOV GBSVA,WA RESTORE WA ! 16659: SCP WC GET CODE POINTER ! 16660: ADD R$COD,WC MAKE ABSOLUTE AGAIN ! 16661: LCP WC AND REPLACE ABSOLUTE VALUE ! 16662: MOV GBSVC,WC RESTORE WC ! 16663: MOV (XS)+,XL RESTORE ENTRY XL ! 16664: ICV GBCNT INCREMENT COUNT OF COLLECTIONS ! 16665: ZER XR CLEAR GARBAGE VALUE IN XR ! 16666: ZER GBCFL NOTE EXIT FROM GBCOL ! 16667: EXI EXIT TO GBCOL CALLER ! 16668: * ! 16669: * GARBAGE COLLECTION NOT ALLOWED WHILST DUMPING ! 16670: * ! 16671: GBC14 ICV ERRFT FATAL ERROR ! 16672: ERB 250,INSUFFICIENT MEMORY TO COMPLETE DUMP ! 16673: ENP END PROCEDURE GBCOL ! 16674: EJC ! 16675: * ! 16676: * GBCPF -- PROCESS FIELDS FOR GARBAGE COLLECTOR ! 16677: * ! 16678: * THIS PROCEDURE IS USED BY THE GARBAGE COLLECTOR TO ! 16679: * PROCESS FIELDS IN PASS ONE. SEE GBCOL FOR FULL DETAILS. ! 16680: * ! 16681: * (XR) PTR TO FIRST LOCATION TO PROCESS ! 16682: * (XL) PTR PAST LAST LOCATION TO PROCESS ! 16683: * JSR GBCPF CALL TO PROCESS FIELDS ! 16684: * (XR,WA,WB,WC,IA) DESTROYED ! 16685: * ! 16686: * NOTE THAT ALTHOUGH THIS PROCEDURE USES A RECURSIVE ! 16687: * APPROACH, IT CONTROLS ITS OWN STACK AND IS NOT RECURSIVE. ! 16688: * ! 16689: GBCPF PRC E,0 ENTRY POINT ! 16690: ZER -(XS) SET ZERO TO MARK BOTTOM OF STACK ! 16691: MOV XL,-(XS) SAVE END POINTER ! 16692: * ! 16693: * MERGE HERE TO GO DOWN A LEVEL AND START A NEW LOOP ! 16694: * ! 16695: * 1(XS) NEXT LVL FIELD PTR (0 AT OUTER LVL) ! 16696: * 0(XS) PTR PAST LAST FIELD TO PROCESS ! 16697: * (XR) PTR TO FIRST FIELD TO PROCESS ! 16698: * ! 16699: * LOOP TO PROCESS SUCCESSIVE FIELDS ! 16700: * ! 16701: GPF01 MOV (XR),XL LOAD FIELD CONTENTS ! 16702: MOV XR,WC SAVE FIELD POINTER ! 16703: BLT XL,DNAMB,GPF02 JUMP IF NOT PTR INTO DYNAMIC AREA ! 16704: BGE XL,DNAMP,GPF02 JUMP IF NOT PTR INTO DYNAMIC AREA ! 16705: * ! 16706: * HERE WE HAVE A PTR TO A BLOCK IN THE DYNAMIC AREA. ! 16707: * LINK THIS FIELD ONTO THE REFERENCE BACKCHAIN. ! 16708: * ! 16709: MOV (XL),WA LOAD PTR TO CHAIN (OR ENTRY PTR) ! 16710: MOV XR,(XL) SET THIS FIELD AS NEW HEAD OF CHAIN ! 16711: MOV WA,(XR) SET FORWARD POINTER ! 16712: * ! 16713: * NOW SEE IF THIS BLOCK HAS BEEN PROCESSED BEFORE ! 16714: * ! 16715: BHI WA,=P$YYY,GPF02 JUMP IF ALREADY PROCESSED ! 16716: BHI WA,=B$AAA,GPF03 JUMP IF NOT ALREADY PROCESSED ! 16717: * ! 16718: * HERE TO MOVE TO NEXT FIELD ! 16719: * ! 16720: GPF02 MOV WC,XR RESTORE FIELD POINTER ! 16721: ICA XR BUMP TO NEXT FIELD ! 16722: BNE XR,(XS),GPF01 LOOP BACK IF MORE TO GO ! 16723: EJC ! 16724: * ! 16725: * GBCPF (CONTINUED) ! 16726: * ! 16727: * HERE WE POP UP A LEVEL AFTER FINISHING A BLOCK ! 16728: * ! 16729: MOV (XS)+,XL RESTORE POINTER PAST END ! 16730: MOV (XS)+,WC RESTORE BLOCK POINTER ! 16731: BNZ WC,GPF02 CONTINUE LOOP UNLESS OUTER LEVL ! 16732: EXI RETURN TO CALLER IF OUTER LEVEL ! 16733: * ! 16734: * HERE TO PROCESS AN ACTIVE BLOCK WHICH HAS NOT BEEN DONE ! 16735: * ! 16736: GPF03 MOV XL,XR COPY BLOCK POINTER ! 16737: MOV WA,XL COPY FIRST WORD OF BLOCK ! 16738: LEI XL LOAD ENTRY POINT ID (BL$XX) ! 16739: * ! 16740: * BLOCK TYPE SWITCH. NOTE THAT BLOCKS WITH NO RELOCATABLE ! 16741: * FIELDS JUST RETURN TO GPF02 HERE TO CONTINE TO NEXT FLD. ! 16742: * ! 16743: BSW XL,BL$$$ SWITCH ON BLOCK TYPE ! 16744: IFF BL$AR,GPF06 ARBLK ! 16745: .IF .CNBF ! 16746: .ELSE ! 16747: IFF BL$BC,GPF18 BCBLK ! 16748: IFF BL$BF,GPF02 BFBLK ! 16749: .FI ! 16750: IFF BL$CC,GPF07 CCBLK ! 16751: IFF BL$CD,GPF08 CDBLK ! 16752: IFF BL$CM,GPF04 CMBLK ! 16753: IFF BL$DF,GPF02 DFBLK ! 16754: IFF BL$EV,GPF10 EVBLK ! 16755: IFF BL$EX,GPF17 EXBLK ! 16756: IFF BL$FF,GPF11 FFBLK ! 16757: IFF BL$NM,GPF10 NMBLK ! 16758: IFF BL$P0,GPF10 P0BLK ! 16759: IFF BL$P1,GPF12 P1BLK ! 16760: IFF BL$P2,GPF12 P2BLK ! 16761: IFF BL$PD,GPF13 PDBLK ! 16762: IFF BL$PF,GPF14 PFBLK ! 16763: IFF BL$TB,GPF08 TBBLK ! 16764: IFF BL$TE,GPF15 TEBLK ! 16765: IFF BL$TR,GPF16 TRBLK ! 16766: IFF BL$VC,GPF08 VCBLK ! 16767: IFF BL$XR,GPF09 XRBLK ! 16768: IFF BL$CT,GPF02 CTBLK ! 16769: IFF BL$EF,GPF02 EFBLK ! 16770: IFF BL$IC,GPF02 ICBLK ! 16771: IFF BL$KV,GPF02 KVBLK ! 16772: .IF .CNRA ! 16773: .ELSE ! 16774: IFF BL$RC,GPF02 RCBLK ! 16775: .FI ! 16776: IFF BL$SC,GPF02 SCBLK ! 16777: IFF BL$SE,GPF02 SEBLK ! 16778: IFF BL$XN,GPF02 XNBLK ! 16779: ESW END OF JUMP TABLE ! 16780: EJC ! 16781: * ! 16782: * GBCPF (CONTINUED) ! 16783: * ! 16784: * CMBLK ! 16785: * ! 16786: GPF04 MOV CMLEN(XR),WA LOAD LENGTH ! 16787: MOV *CMTYP,WB SET OFFSET ! 16788: * ! 16789: * HERE TO PUSH DOWN TO NEW LEVEL ! 16790: * ! 16791: * (WC) FIELD PTR AT PREVIOUS LEVEL ! 16792: * (XR) PTR TO NEW BLOCK ! 16793: * (WA) LENGTH (RELOC FLDS + FLDS AT START) ! 16794: * (WB) OFFSET TO FIRST RELOC FIELD ! 16795: * ! 16796: GPF05 ADD XR,WA POINT PAST LAST RELOC FIELD ! 16797: ADD WB,XR POINT TO FIRST RELOC FIELD ! 16798: MOV WC,-(XS) STACK OLD FIELD POINTER ! 16799: MOV WA,-(XS) STACK NEW LIMIT POINTER ! 16800: CHK CHECK FOR STACK OVERFLOW ! 16801: BRN GPF01 IF OK, BACK TO PROCESS ! 16802: * ! 16803: * ARBLK ! 16804: * ! 16805: GPF06 MOV ARLEN(XR),WA LOAD LENGTH ! 16806: MOV AROFS(XR),WB SET OFFSET TO 1ST RELOC FLD (ARPRO) ! 16807: BRN GPF05 ALL SET ! 16808: * ! 16809: * CCBLK ! 16810: * ! 16811: GPF07 MOV CCUSE(XR),WA SET LENGTH IN USE ! 16812: MOV *CCUSE,WB 1ST WORD (MAKE SURE AT LEAST ONE) ! 16813: BRN GPF05 ALL SET ! 16814: EJC ! 16815: * ! 16816: * GBCPF (CONTINUED) ! 16817: * ! 16818: * CDBLK, TBBLK, VCBLK ! 16819: * ! 16820: GPF08 MOV OFFS2(XR),WA LOAD LENGTH ! 16821: MOV *OFFS3,WB SET OFFSET ! 16822: BRN GPF05 JUMP BACK ! 16823: * ! 16824: * XRBLK ! 16825: * ! 16826: GPF09 MOV XRLEN(XR),WA LOAD LENGTH ! 16827: MOV *XRPTR,WB SET OFFSET ! 16828: BRN GPF05 JUMP BACK ! 16829: * ! 16830: * EVBLK, NMBLK, P0BLK ! 16831: * ! 16832: GPF10 MOV *OFFS2,WA POINT PAST SECOND FIELD ! 16833: MOV *OFFS1,WB OFFSET IS ONE (ONLY RELOC FLD IS 2) ! 16834: BRN GPF05 ALL SET ! 16835: * ! 16836: * FFBLK ! 16837: * ! 16838: GPF11 MOV *FFOFS,WA SET LENGTH ! 16839: MOV *FFNXT,WB SET OFFSET ! 16840: BRN GPF05 ALL SET ! 16841: * ! 16842: * P1BLK, P2BLK ! 16843: * ! 16844: GPF12 MOV *PARM2,WA LENGTH (PARM2 IS NON-RELOCATABLE) ! 16845: MOV *PTHEN,WB SET OFFSET ! 16846: BRN GPF05 ALL SET ! 16847: EJC ! 16848: * ! 16849: * GBCPF (CONTINUED) ! 16850: * ! 16851: * PDBLK ! 16852: * ! 16853: GPF13 MOV PDDFP(XR),XL LOAD PTR TO DFBLK ! 16854: MOV DFPDL(XL),WA GET PDBLK LENGTH ! 16855: MOV *PDFLD,WB SET OFFSET ! 16856: BRN GPF05 ALL SET ! 16857: * ! 16858: * PFBLK ! 16859: * ! 16860: GPF14 MOV *PFARG,WA LENGTH PAST LAST RELOC ! 16861: MOV *PFCOD,WB OFFSET TO FIRST RELOC ! 16862: BRN GPF05 ALL SET ! 16863: * ! 16864: * TEBLK ! 16865: * ! 16866: GPF15 MOV *TESI$,WA SET LENGTH ! 16867: MOV *TESUB,WB AND OFFSET ! 16868: BRN GPF05 ALL SET ! 16869: * ! 16870: * TRBLK ! 16871: * ! 16872: GPF16 MOV *TRSI$,WA SET LENGTH ! 16873: MOV *TRVAL,WB AND OFFSET ! 16874: BRN GPF05 ALL SET ! 16875: * ! 16876: * EXBLK ! 16877: * ! 16878: GPF17 MOV EXLEN(XR),WA LOAD LENGTH ! 16879: MOV *EXFLC,WB SET OFFSET ! 16880: BRN GPF05 JUMP BACK ! 16881: .IF .CNBF ! 16882: .ELSE ! 16883: * ! 16884: * BCBLK ! 16885: * ! 16886: GPF18 MOV *BCSI$,WA SET LENGTH ! 16887: MOV *BCBUF,WB AND OFFSET ! 16888: BRN GPF05 ALL SET ! 16889: .FI ! 16890: ENP END PROCEDURE GBCPF ! 16891: EJC ! 16892: * ! 16893: * GTARR -- GET ARRAY ! 16894: * ! 16895: * GTARR IS PASSED AN OBJECT AND RETURNS AN ARRAY IF POSSIBL ! 16896: * ! 16897: * (XR) VALUE TO BE CONVERTED ! 16898: * JSR GTARR CALL TO GET ARRAY ! 16899: * PPM LOC TRANSFER LOC FOR CONVERT IMPOSSIBLE ! 16900: * (XR) RESULTING ARRAY ! 16901: * (XL,WA,WB,WC) DESTROYED ! 16902: * ! 16903: GTARR PRC E,1 ENTRY POINT ! 16904: MOV (XR),WA LOAD TYPE WORD ! 16905: BEQ WA,=B$ART,GTAR8 EXIT IF ALREADY AN ARRAY ! 16906: BEQ WA,=B$VCT,GTAR8 EXIT IF ALREADY AN ARRAY ! 16907: BNE WA,=B$TBT,GTA9A ELSE FAIL IF NOT A TABLE (SGD02) ! 16908: * ! 16909: * HERE WE CONVERT A TABLE TO AN ARRAY ! 16910: * ! 16911: MOV XR,-(XS) REPLACE TBBLK POINTER ON STACK ! 16912: ZER XR SIGNAL FIRST PASS ! 16913: ZER WB ZERO NON-NULL ELEMENT COUNT ! 16914: * ! 16915: * THE FOLLOWING CODE IS EXECUTED TWICE. ON THE FIRST PASS, ! 16916: * SIGNALLED BY XR=0, THE NUMBER OF NON-NULL ELEMENTS IN ! 16917: * THE TABLE IS COUNTED IN WB. IN THE SECOND PASS, WHERE ! 16918: * XR IS A POINTER INTO THE ARBLK, THE NAME AND VALUE ARE ! 16919: * ENTERED INTO THE CURRENT ARBLK LOCATION. ! 16920: * ! 16921: GTAR1 MOV (XS),XL POINT TO TABLE ! 16922: ADD TBLEN(XL),XL POINT PAST LAST BUCKET ! 16923: SUB *TBBUK,XL SET FIRST BUCKET OFFSET ! 16924: MOV XL,WA COPY ADJUSTED POINTER ! 16925: * ! 16926: * LOOP THROUGH BUCKETS IN TABLE BLOCK ! 16927: * NEXT THREE LINES OF CODE RELY ON TENXT HAVING A VALUE ! 16928: * 1 LESS THAN TBBUK. ! 16929: * ! 16930: GTAR2 MOV WA,XL COPY BUCKET POINTER ! 16931: DCA WA DECREMENT BUCKET POINTER ! 16932: * ! 16933: * LOOP THROUGH TEBLKS ON ONE BUCKET CHAIN ! 16934: * ! 16935: GTAR3 MOV TENXT(XL),XL POINT TO NEXT TEBLK ! 16936: BEQ XL,(XS),GTAR6 JUMP IF CHAIN END (TBBLK PTR) ! 16937: MOV XL,CNVTP ELSE SAVE TEBLK POINTER ! 16938: * ! 16939: * LOOP TO FIND VALUE DOWN TRBLK CHAIN ! 16940: * ! 16941: GTAR4 MOV TEVAL(XL),XL LOAD VALUE ! 16942: BEQ (XL),=B$TRT,GTAR4 LOOP TILL VALUE FOUND ! 16943: MOV XL,WC COPY VALUE ! 16944: MOV CNVTP,XL RESTORE TEBLK POINTER ! 16945: EJC ! 16946: * ! 16947: * GTARR (CONTINUED) ! 16948: * ! 16949: * NOW CHECK FOR NULL AND TEST CASES ! 16950: * ! 16951: BEQ WC,=NULLS,GTAR3 LOOP BACK TO IGNORE NULL VALUE ! 16952: BNZ XR,GTAR5 JUMP IF SECOND PASS ! 16953: ICV WB FOR THE FIRST PASS, BUMP COUNT ! 16954: BRN GTAR3 AND LOOP BACK FOR NEXT TEBLK ! 16955: * ! 16956: * HERE IN SECOND PASS ! 16957: * ! 16958: GTAR5 MOV TESUB(XL),(XR)+ STORE SUBSCRIPT NAME ! 16959: MOV WC,(XR)+ STORE VALUE IN ARBLK ! 16960: BRN GTAR3 LOOP BACK FOR NEXT TEBLK ! 16961: * ! 16962: * HERE AFTER SCANNING TEBLKS ON ONE CHAIN ! 16963: * ! 16964: GTAR6 BNE WA,(XS),GTAR2 LOOP BACK IF MORE BUCKETS TO GO ! 16965: BNZ XR,GTAR7 ELSE JUMP IF SECOND PASS ! 16966: * ! 16967: * HERE AFTER COUNTING NON-NULL ELEMENTS ! 16968: * ! 16969: BZE WB,GTAR9 FAIL IF NO NON-NULL ELEMENTS ! 16970: MOV WB,WA ELSE COPY COUNT ! 16971: ADD WB,WA DOUBLE (TWO WORDS/ELEMENT) ! 16972: ADD =ARVL2,WA ADD SPACE FOR STANDARD FIELDS ! 16973: WTB WA CONVERT LENGTH TO BYTES ! 16974: BGE WA,MXLEN,GTAR9 FAIL IF TOO LONG FOR ARRAY ! 16975: JSR ALLOC ELSE ALLOCATE SPACE FOR ARBLK ! 16976: MOV =B$ART,(XR) STORE TYPE WORD ! 16977: ZER IDVAL(XR) ZERO ID FOR THE MOMENT ! 16978: MOV WA,ARLEN(XR) STORE LENGTH ! 16979: MOV =NUM02,ARNDM(XR) SET DIMENSIONS = 2 ! 16980: LDI INTV1 GET INTEGER ONE ! 16981: STI ARLBD(XR) STORE AS LBD 1 ! 16982: STI ARLB2(XR) STORE AS LBD 2 ! 16983: LDI INTV2 LOAD INTEGER TWO ! 16984: STI ARDM2(XR) STORE AS DIM 2 ! 16985: MTI WB GET ELEMENT COUNT AS INTEGER ! 16986: STI ARDIM(XR) STORE AS DIM 1 ! 16987: ZER ARPR2(XR) ZERO PROTOTYPE FIELD FOR NOW ! 16988: MOV *ARPR2,AROFS(XR) SET OFFSET FIELD (SIGNAL PASS 2) ! 16989: MOV XR,WB SAVE ARBLK POINTER ! 16990: ADD *ARVL2,XR POINT TO FIRST ELEMENT LOCATION ! 16991: BRN GTAR1 JUMP BACK TO FILL IN ELEMENTS ! 16992: EJC ! 16993: * ! 16994: * GTARR (CONTINUED) ! 16995: * ! 16996: * HERE AFTER FILLING IN ELEMENT VALUES ! 16997: * ! 16998: GTAR7 MOV WB,XR RESTORE ARBLK POINTER ! 16999: MOV WB,(XS) STORE AS RESULT ! 17000: * ! 17001: * NOW WE NEED THE ARRAY PROTOTYPE WHICH IS OF THE FORM NN,2 ! 17002: * THIS IS OBTAINED BY BUILDING THE STRING FOR NN02 AND ! 17003: * CHANGING THE ZERO TO A COMMA BEFORE STORING IT. ! 17004: * ! 17005: LDI ARDIM(XR) GET NUMBER OF ELEMENTS (NN) ! 17006: MLI INTVH MULTIPLY BY 100 ! 17007: ADI INTV2 ADD 2 (NN02) ! 17008: JSR ICBLD BUILD INTEGER ! 17009: MOV XR,-(XS) STORE PTR FOR GTSTG ! 17010: JSR GTSTG CONVERT TO STRING ! 17011: PPM CONVERT FAIL IS IMPOSSIBLE ! 17012: MOV XR,XL COPY STRING POINTER ! 17013: MOV (XS)+,XR RELOAD ARBLK POINTER ! 17014: MOV XL,ARPR2(XR) STORE PROTOTYPE PTR (NN02) ! 17015: SUB =NUM02,WA ADJUST LENGTH TO POINT TO ZERO ! 17016: PSC XL,WA POINT TO ZERO ! 17017: MOV =CH$CM,WB LOAD A COMMA ! 17018: SCH WB,(XL) STORE A COMMA OVER THE ZERO ! 17019: CSC XL COMPLETE STORE CHARACTERS ! 17020: * ! 17021: * NORMAL RETURN ! 17022: * ! 17023: GTAR8 EXI RETURN TO CALLER ! 17024: * ! 17025: * NON-CONVERSION RETURN ! 17026: * ! 17027: GTAR9 MOV (XS)+,XR RESTORE STACK FOR CONV ERR (SGD02) ! 17028: * ! 17029: * MERGE TO TAKE CONVERT ERROR WHEN STACK ADJUSTED OK ! 17030: * ! 17031: GTA9A EXI 1 RETURN ! 17032: ENP PROCEDURE GTARR ! 17033: EJC ! 17034: * ! 17035: * GTCOD -- CONVERT TO CODE ! 17036: * ! 17037: * (XR) OBJECT TO BE CONVERTED ! 17038: * JSR GTCOD CALL TO CONVERT TO CODE ! 17039: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 17040: * (XR) POINTER TO RESULTING CDBLK ! 17041: * (XL,WA,WB,WC,RA) DESTROYED ! 17042: * ! 17043: * IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE- ! 17044: * EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL ! 17045: * WITHOUT RETURNING TO THIS ROUTINE. ! 17046: * ! 17047: GTCOD PRC E,1 ENTRY POINT ! 17048: BEQ (XR),=B$CDS,GTCD1 JUMP IF ALREADY CODE ! 17049: BEQ (XR),=B$CDC,GTCD1 JUMP IF ALREADY CODE ! 17050: * ! 17051: * HERE WE MUST GENERATE A CDBLK BY COMPILATION ! 17052: * ! 17053: MOV XR,-(XS) STACK ARGUMENT FOR GTSTG ! 17054: JSR GTSTG CONVERT ARGUMENT TO STRING ! 17055: PPM GTCD2 JUMP IF NON-CONVERTIBLE ! 17056: MOV FLPTR,GTCEF SAVE FAIL PTR IN CASE OF ERROR ! 17057: MOV R$COD,R$GTC ALSO SAVE CODE PTR ! 17058: MOV XR,R$CIM ELSE SET IMAGE POINTER ! 17059: MOV WA,SCNIL SET IMAGE LENGTH ! 17060: ZER SCNPT SET SCAN POINTER ! 17061: MOV =STGXC,STAGE SET STAGE FOR EXECUTE COMPILE ! 17062: MOV CMPSN,LSTSN IN CASE LISTR CALLED ! 17063: JSR CMPIL COMPILE STRING ! 17064: MOV =STGXT,STAGE RESET STAGE FOR EXECUTE TIME ! 17065: ZER R$CIM CLEAR IMAGE ! 17066: * ! 17067: * MERGE HERE IF NO CONVERT REQUIRED ! 17068: * ! 17069: GTCD1 EXI GIVE NORMAL GTCOD RETURN ! 17070: * ! 17071: * HERE IF UNCONVERTIBLE ! 17072: * ! 17073: GTCD2 EXI 1 GIVE ERROR RETURN ! 17074: ENP END PROCEDURE GTCOD ! 17075: EJC ! 17076: * ! 17077: * GTEXP -- CONVERT TO EXPRESSION ! 17078: * ! 17079: * (XR) INPUT VALUE TO BE CONVERTED ! 17080: * JSR GTEXP CALL TO CONVERT TO EXPRESSION ! 17081: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 17082: * (XR) POINTER TO RESULT EXBLK OR SEBLK ! 17083: * (XL,WA,WB,WC,RA) DESTROYED ! 17084: * ! 17085: * IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE- ! 17086: * EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL ! 17087: * WITHOUT RETURNING TO THIS ROUTINE. ! 17088: * ! 17089: GTEXP PRC E,1 ENTRY POINT ! 17090: BLO (XR),=B$E$$,GTEX1 JUMP IF ALREADY AN EXPRESSION ! 17091: MOV XR,-(XS) STORE ARGUMENT FOR GTSTG ! 17092: JSR GTSTG CONVERT ARGUMENT TO STRING ! 17093: PPM GTEX2 JUMP IF UNCONVERTIBLE ! 17094: * ! 17095: * CHECK THE LAST CHARACTER OF THE STRING FOR COLON OR ! 17096: * SEMICOLON. THESE CHARACTERS CAN LEGITIMATELY END AN ! 17097: * EXPRESSION IN OPEN CODE, SO EXPAN WILL NOT DETECT THEM ! 17098: * AS ERRORS, BUT THEY ARE INVALID AS TERMINATORS FOR A ! 17099: * STRING THAT IS BEING CONVERTED TO EXPRESSION FORM. ! 17100: * ! 17101: MOV XR,XL COPY INPUT STRING POINTER (REG06) ! 17102: PLC XL,WA POINT ONE PAST THE STRING END (REG06) ! 17103: LCH XL,-(XL) FETCH THE LAST CHARACTER (REG06) ! 17104: BEQ XL,=CH$CL,GTEX2 ERROR IF IT IS A SEMICOLON (REG06) ! 17105: BEQ XL,=CH$SM,GTEX2 OR IF IT IS A COLON (REG06) ! 17106: * ! 17107: * HERE WE CONVERT A STRING BY COMPILATION ! 17108: * ! 17109: MOV XR,R$CIM SET INPUT IMAGE POINTER ! 17110: ZER SCNPT SET SCAN POINTER ! 17111: MOV WA,SCNIL SET INPUT IMAGE LENGTH ! 17112: ZER WB SET CODE FOR NORMAL SCAN ! 17113: MOV FLPTR,GTCEF SAVE FAIL PTR IN CASE OF ERROR ! 17114: MOV R$COD,R$GTC ALSO SAVE CODE PTR ! 17115: MOV =STGEV,STAGE ADJUST STAGE FOR COMPILE ! 17116: MOV =T$UOK,SCNTP INDICATE UNARY OPERATOR ACCEPTABLE ! 17117: JSR EXPAN BUILD TREE FOR EXPRESSION ! 17118: ZER SCNRS RESET RESCAN FLAG ! 17119: BNE SCNPT,SCNIL,GTEX2 ERROR IF NOT END OF IMAGE ! 17120: ZER WB SET OK VALUE FOR CDGEX CALL ! 17121: MOV XR,XL COPY TREE POINTER ! 17122: JSR CDGEX BUILD EXPRESSION BLOCK ! 17123: ZER R$CIM CLEAR POINTER ! 17124: MOV =STGXT,STAGE RESTORE STAGE FOR EXECUTE TIME ! 17125: * ! 17126: * MERGE HERE IF NO CONVERSION REQUIRED ! 17127: * ! 17128: GTEX1 EXI RETURN TO GTEXP CALLER ! 17129: * ! 17130: * HERE IF UNCONVERTIBLE ! 17131: * ! 17132: GTEX2 EXI 1 TAKE ERROR EXIT ! 17133: ENP END PROCEDURE GTEXP ! 17134: EJC ! 17135: * ! 17136: * GTINT -- GET INTEGER VALUE ! 17137: * ! 17138: * GTINT IS PASSED AN OBJECT AND RETURNS AN INTEGER AFTER ! 17139: * PERFORMING ANY NECESSARY CONVERSIONS. ! 17140: * ! 17141: * (XR) VALUE TO BE CONVERTED ! 17142: * JSR GTINT CALL TO CONVERT TO INTEGER ! 17143: * PPM LOC TRANSFER LOC FOR CONVERT IMPOSSIBLE ! 17144: * (XR) RESULTING INTEGER ! 17145: * (WC,RA) DESTROYED ! 17146: * (WA,WB) DESTROYED (ONLY ON CONVERSION ERR) ! 17147: * (XR) UNCHANGED (ON CONVERT ERROR) ! 17148: * ! 17149: GTINT PRC E,1 ENTRY POINT ! 17150: BEQ (XR),=B$ICL,GTIN2 JUMP IF ALREADY AN INTEGER ! 17151: MOV WA,GTINA ELSE SAVE WA ! 17152: MOV WB,GTINB SAVE WB ! 17153: JSR GTNUM CONVERT TO NUMERIC ! 17154: PPM GTIN3 JUMP IF UNCONVERTIBLE ! 17155: .IF .CNRA ! 17156: .ELSE ! 17157: BEQ WA,=B$ICL,GTIN1 JUMP IF INTEGER ! 17158: * ! 17159: * HERE WE CONVERT A REAL TO INTEGER ! 17160: * ! 17161: LDR RCVAL(XR) LOAD REAL VALUE ! 17162: RTI GTIN3 CONVERT TO INTEGER (ERR IF OVFLOW) ! 17163: JSR ICBLD IF OK BUILD ICBLK ! 17164: .FI ! 17165: * ! 17166: * HERE AFTER SUCCESSFUL CONVERSION TO INTEGER ! 17167: * ! 17168: GTIN1 MOV GTINA,WA RESTORE WA ! 17169: MOV GTINB,WB RESTORE WB ! 17170: * ! 17171: * COMMON EXIT POINT ! 17172: * ! 17173: GTIN2 EXI RETURN TO GTINT CALLER ! 17174: * ! 17175: * HERE ON CONVERSION ERROR ! 17176: * ! 17177: GTIN3 EXI 1 TAKE CONVERT ERROR EXIT ! 17178: ENP END PROCEDURE GTINT ! 17179: EJC ! 17180: * ! 17181: * GTNUM -- GET NUMERIC VALUE ! 17182: * ! 17183: * GTNUM IS GIVEN AN OBJECT AND RETURNS EITHER AN INTEGER ! 17184: * OR A REAL, PERFORMING ANY NECESSARY CONVERSIONS. ! 17185: * ! 17186: * (XR) OBJECT TO BE CONVERTED ! 17187: * JSR GTNUM CALL TO CONVERT TO NUMERIC ! 17188: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 17189: * (XR) POINTER TO RESULT (INT OR REAL) ! 17190: * (WA) FIRST WORD OF RESULT BLOCK ! 17191: * (WB,WC,RA) DESTROYED ! 17192: * (XR) UNCHANGED (ON CONVERT ERROR) ! 17193: * ! 17194: GTNUM PRC E,1 ENTRY POINT ! 17195: MOV (XR),WA LOAD FIRST WORD OF BLOCK ! 17196: BEQ WA,=B$ICL,GTN34 JUMP IF INTEGER (NO CONVERSION) ! 17197: .IF .CNRA ! 17198: .ELSE ! 17199: BEQ WA,=B$RCL,GTN34 JUMP IF REAL (NO CONVERSION) ! 17200: .FI ! 17201: * ! 17202: * AT THIS POINT THE ONLY POSSIBILITY IS TO CONVERT A STRING ! 17203: * TO AN INTEGER OR REAL AS APPROPRIATE. ! 17204: * ! 17205: MOV XR,-(XS) STACK ARGUMENT IN CASE CONVERT ERR ! 17206: MOV XR,-(XS) STACK ARGUMENT FOR GTSTG ! 17207: JSR GTSTG CONVERT ARGUMENT TO STRING ! 17208: PPM GTN36 JUMP IF UNCONVERTIBLE ! 17209: * ! 17210: * INITIALIZE NUMERIC CONVERSION ! 17211: * ! 17212: LDI INTV0 INITIALIZE INTEGER RESULT TO ZERO ! 17213: BZE WA,GTN32 JUMP TO EXIT WITH ZERO IF NULL ! 17214: LCT WA,WA SET BCT COUNTER FOR FOLLOWING LOOPS ! 17215: ZER GTNNF TENTATIVELY INDICATE RESULT + ! 17216: .IF .CNRA ! 17217: .ELSE ! 17218: STI GTNEX INITIALISE EXPONENT TO ZERO ! 17219: ZER GTNSC ZERO SCALE IN CASE REAL ! 17220: ZER GTNDF RESET FLAG FOR DEC POINT FOUND ! 17221: ZER GTNRD RESET FLAG FOR DIGITS FOUND ! 17222: LDR REAV0 ZERO REAL ACCUM IN CASE REAL ! 17223: .FI ! 17224: PLC XR POINT TO ARGUMENT CHARACTERS ! 17225: * ! 17226: * MERGE BACK HERE AFTER IGNORING LEADING BLANK ! 17227: * ! 17228: GTN01 LCH WB,(XR)+ LOAD FIRST CHARACTER ! 17229: BLT WB,=CH$D0,GTN02 JUMP IF NOT DIGIT ! 17230: BLE WB,=CH$D9,GTN06 JUMP IF FIRST CHAR IS A DIGIT ! 17231: EJC ! 17232: * ! 17233: * GTNUM (CONTINUED) ! 17234: * ! 17235: * HERE IF FIRST DIGIT IS NON-DIGIT ! 17236: * ! 17237: GTN02 BNE WB,=CH$BL,GTN03 JUMP IF NON-BLANK ! 17238: GTNA2 BCT WA,GTN01 ELSE DECR COUNT AND LOOP BACK ! 17239: BRN GTN07 JUMP TO RETURN ZERO IF ALL BLANKS ! 17240: * ! 17241: * HERE FOR FIRST CHARACTER NON-BLANK, NON-DIGIT ! 17242: * ! 17243: GTN03 BEQ WB,=CH$PL,GTN04 JUMP IF PLUS SIGN ! 17244: .IF .CAHT ! 17245: BEQ WB,=CH$HT,GTNA2 HORIZONTAL TAB EQUIV TO BLANK ! 17246: .FI ! 17247: .IF .CAVT ! 17248: BEQ WB,=CH$VT,GTNA2 VERTICAL TAB EQUIV TO BLANK ! 17249: .FI ! 17250: .IF .CNRA ! 17251: BNE WB,=CH$MN,GTN36 ELSE FAIL ! 17252: .ELSE ! 17253: BNE WB,=CH$MN,GTN12 JUMP IF NOT MINUS (MAY BE REAL) ! 17254: .FI ! 17255: MNZ GTNNF IF MINUS SIGN, SET NEGATIVE FLAG ! 17256: * ! 17257: * MERGE HERE AFTER PROCESSING SIGN ! 17258: * ! 17259: GTN04 BCT WA,GTN05 JUMP IF CHARS LEFT ! 17260: BRN GTN36 ELSE ERROR ! 17261: * ! 17262: * LOOP TO FETCH CHARACTERS OF AN INTEGER ! 17263: * ! 17264: GTN05 LCH WB,(XR)+ LOAD NEXT CHARACTER ! 17265: BLT WB,=CH$D0,GTN08 JUMP IF NOT A DIGIT ! 17266: BGT WB,=CH$D9,GTN08 JUMP IF NOT A DIGIT ! 17267: * ! 17268: * MERGE HERE FOR FIRST DIGIT ! 17269: * ! 17270: GTN06 STI GTNSI SAVE CURRENT VALUE ! 17271: .IF .CNRA ! 17272: CVM GTN36 CURRENT*10-(NEW DIG) JUMP IF OVFLOW ! 17273: .ELSE ! 17274: CVM GTN35 CURRENT*10-(NEW DIG) JUMP IF OVFLOW ! 17275: MNZ GTNRD SET DIGIT READ FLAG ! 17276: .FI ! 17277: BCT WA,GTN05 ELSE LOOP BACK IF MORE CHARS ! 17278: * ! 17279: * HERE TO EXIT WITH CONVERTED INTEGER VALUE ! 17280: * ! 17281: GTN07 BNZ GTNNF,GTN32 JUMP IF NEGATIVE (ALL SET) ! 17282: NGI ELSE NEGATE ! 17283: INO GTN32 JUMP IF NO OVERFLOW ! 17284: BRN GTN36 ELSE SIGNAL ERROR ! 17285: EJC ! 17286: * ! 17287: * GTNUM (CONTINUED) ! 17288: * ! 17289: * HERE FOR A NON-DIGIT CHARACTER WHILE ATTEMPTING TO ! 17290: * CONVERT AN INTEGER, CHECK FOR TRAILING BLANKS OR REAL. ! 17291: * ! 17292: GTN08 BEQ WB,=CH$BL,GTNA9 JUMP IF A BLANK ! 17293: .IF .CAHT ! 17294: BEQ WB,=CH$HT,GTNA9 JUMP IF HORIZONTAL TAB ! 17295: .FI ! 17296: .IF .CAVT ! 17297: BEQ WB,=CH$VT,GTNA9 JUMP IF VERTICAL TAB ! 17298: .FI ! 17299: .IF .CNRA ! 17300: BRN GTN36 ERROR ! 17301: .ELSE ! 17302: ITR ELSE CONVERT INTEGER TO REAL ! 17303: NGR NEGATE TO GET POSITIVE VALUE ! 17304: BRN GTN12 JUMP TO TRY FOR REAL ! 17305: .FI ! 17306: * ! 17307: * HERE WE SCAN OUT BLANKS TO END OF STRING ! 17308: * ! 17309: GTN09 LCH WB,(XR)+ GET NEXT CHAR ! 17310: .IF .CAHT ! 17311: BEQ WB,=CH$HT,GTNA9 JUMP IF HORIZONTAL TAB ! 17312: .FI ! 17313: .IF .CAVT ! 17314: BEQ WB,=CH$VT,GTNA9 JUMP IF VERTICAL TAB ! 17315: .FI ! 17316: BNE WB,=CH$BL,GTN36 ERROR IF NON-BLANK ! 17317: GTNA9 BCT WA,GTN09 LOOP BACK IF MORE CHARS TO CHECK ! 17318: BRN GTN07 RETURN INTEGER IF ALL BLANKS ! 17319: .IF .CNRA ! 17320: .ELSE ! 17321: * ! 17322: * LOOP TO COLLECT MANTISSA OF REAL ! 17323: * ! 17324: GTN10 LCH WB,(XR)+ LOAD NEXT CHARACTER ! 17325: BLT WB,=CH$D0,GTN12 JUMP IF NON-NUMERIC ! 17326: BGT WB,=CH$D9,GTN12 JUMP IF NON-NUMERIC ! 17327: * ! 17328: * MERGE HERE TO COLLECT FIRST REAL DIGIT ! 17329: * ! 17330: GTN11 SUB =CH$D0,WB CONVERT DIGIT TO NUMBER ! 17331: MLR REAVT MULTIPLY REAL BY 10.0 ! 17332: ROV GTN36 CONVERT ERROR IF OVERFLOW ! 17333: STR GTNSR SAVE RESULT ! 17334: MTI WB GET NEW DIGIT AS INTEGER ! 17335: ITR CONVERT NEW DIGIT TO REAL ! 17336: ADR GTNSR ADD TO GET NEW TOTAL ! 17337: ADD GTNDF,GTNSC INCREMENT SCALE IF AFTER DEC POINT ! 17338: MNZ GTNRD SET DIGIT FOUND FLAG ! 17339: BCT WA,GTN10 LOOP BACK IF MORE CHARS ! 17340: BRN GTN22 ELSE JUMP TO SCALE ! 17341: EJC ! 17342: * ! 17343: * GTNUM (CONTINUED) ! 17344: * ! 17345: * HERE IF NON-DIGIT FOUND WHILE COLLECTING A REAL ! 17346: * ! 17347: GTN12 BNE WB,=CH$DT,GTN13 JUMP IF NOT DEC POINT ! 17348: BNZ GTNDF,GTN36 IF DEC POINT, ERROR IF ONE ALREADY ! 17349: MOV =NUM01,GTNDF ELSE SET FLAG FOR DEC POINT ! 17350: BCT WA,GTN10 LOOP BACK IF MORE CHARS ! 17351: BRN GTN22 ELSE JUMP TO SCALE ! 17352: * ! 17353: * HERE IF NOT DECIMAL POINT ! 17354: * ! 17355: GTN13 BEQ WB,=CH$LE,GTN15 JUMP IF E FOR EXPONENT ! 17356: BEQ WB,=CH$LD,GTN15 JUMP IF D FOR EXPONENT ! 17357: .IF .CULC ! 17358: BEQ WB,=CH$$E,GTN15 JUMP IF E FOR EXPONENT ! 17359: BEQ WB,=CH$$D,GTN15 JUMP IF D FOR EXPONENT ! 17360: .FI ! 17361: * ! 17362: * HERE CHECK FOR TRAILING BLANKS ! 17363: * ! 17364: GTN14 BEQ WB,=CH$BL,GTNB4 JUMP IF BLANK ! 17365: .IF .CAHT ! 17366: BEQ WB,=CH$HT,GTNB4 JUMP IF HORIZONTAL TAB ! 17367: .FI ! 17368: .IF .CAVT ! 17369: BEQ WB,=CH$VT,GTNB4 JUMP IF VERTICAL TAB ! 17370: .FI ! 17371: BRN GTN36 ERROR IF NON-BLANK ! 17372: * ! 17373: GTNB4 LCH WB,(XR)+ GET NEXT CHARACTER ! 17374: BCT WA,GTN14 LOOP BACK TO CHECK IF MORE ! 17375: BRN GTN22 ELSE JUMP TO SCALE ! 17376: * ! 17377: * HERE TO READ AND PROCESS AN EXPONENT ! 17378: * ! 17379: GTN15 ZER GTNES SET EXPONENT SIGN POSITIVE ! 17380: LDI INTV0 INITIALIZE EXPONENT TO ZERO ! 17381: MNZ GTNDF RESET NO DEC POINT INDICATION ! 17382: BCT WA,GTN16 JUMP SKIPPING PAST E OR D ! 17383: BRN GTN36 ERROR IF NULL EXPONENT ! 17384: * ! 17385: * CHECK FOR EXPONENT SIGN ! 17386: * ! 17387: GTN16 LCH WB,(XR)+ LOAD FIRST EXPONENT CHARACTER ! 17388: BEQ WB,=CH$PL,GTN17 JUMP IF PLUS SIGN ! 17389: BNE WB,=CH$MN,GTN19 ELSE JUMP IF NOT MINUS SIGN ! 17390: MNZ GTNES SET SIGN NEGATIVE IF MINUS SIGN ! 17391: * ! 17392: * MERGE HERE AFTER PROCESSING EXPONENT SIGN ! 17393: * ! 17394: GTN17 BCT WA,GTN18 JUMP IF CHARS LEFT ! 17395: BRN GTN36 ELSE ERROR ! 17396: * ! 17397: * LOOP TO CONVERT EXPONENT DIGITS ! 17398: * ! 17399: GTN18 LCH WB,(XR)+ LOAD NEXT CHARACTER ! 17400: EJC ! 17401: * ! 17402: * GTNUM (CONTINUED) ! 17403: * ! 17404: * MERGE HERE FOR FIRST EXPONENT DIGIT ! 17405: * ! 17406: GTN19 BLT WB,=CH$D0,GTN20 JUMP IF NOT DIGIT ! 17407: BGT WB,=CH$D9,GTN20 JUMP IF NOT DIGIT ! 17408: CVM GTN36 ELSE CURRENT*10, SUBTRACT NEW DIGIT ! 17409: BCT WA,GTN18 LOOP BACK IF MORE CHARS ! 17410: BRN GTN21 JUMP IF EXPONENT FIELD IS EXHAUSTED ! 17411: * ! 17412: * HERE TO CHECK FOR TRAILING BLANKS AFTER EXPONENT ! 17413: * ! 17414: GTN20 BEQ WB,=CH$BL,GTNC0 JUMP IF BLANK ! 17415: .IF .CAHT ! 17416: BEQ WB,=CH$HT,GTNC0 JUMP IF HORIZONTAL TAB ! 17417: .FI ! 17418: .IF .CAVT ! 17419: BEQ WC,=CH$VT,GTNC0 JUMP IF VERTICAL TAB ! 17420: .FI ! 17421: BRN GTN36 ERROR IF NON-BLANK ! 17422: * ! 17423: GTNC0 LCH WB,(XR)+ GET NEXT CHARACTER ! 17424: BCT WA,GTN20 LOOP BACK TILL ALL BLANKS SCANNED ! 17425: * ! 17426: * MERGE HERE AFTER COLLECTING EXPONENT ! 17427: * ! 17428: GTN21 STI GTNEX SAVE COLLECTED EXPONENT ! 17429: BNZ GTNES,GTN22 JUMP IF IT WAS NEGATIVE ! 17430: NGI ELSE COMPLEMENT ! 17431: IOV GTN36 ERROR IF OVERFLOW ! 17432: STI GTNEX AND STORE POSITIVE EXPONENT ! 17433: * ! 17434: * MERGE HERE WITH EXPONENT (0 IF NONE GIVEN) ! 17435: * ! 17436: GTN22 BZE GTNRD,GTN36 ERROR IF NOT DIGITS COLLECTED ! 17437: BZE GTNDF,GTN36 ERROR IF NO EXPONENT OR DEC POINT ! 17438: MTI GTNSC ELSE LOAD SCALE AS INTEGER ! 17439: SBI GTNEX SUBTRACT EXPONENT ! 17440: IOV GTN36 ERROR IF OVERFLOW ! 17441: ILT GTN26 JUMP IF WE MUST SCALE UP ! 17442: * ! 17443: * HERE WE HAVE A NEGATIVE EXPONENT, SO SCALE DOWN ! 17444: * ! 17445: MFI WA,GTN36 LOAD SCALE FACTOR, ERR IF OVFLOW ! 17446: * ! 17447: * LOOP TO SCALE DOWN IN STEPS OF 10**10 ! 17448: * ! 17449: GTN23 BLE WA,=NUM10,GTN24 JUMP IF 10 OR LESS TO GO ! 17450: DVR REATT ELSE DIVIDE BY 10**10 ! 17451: SUB =NUM10,WA DECREMENT SCALE ! 17452: BRN GTN23 AND LOOP BACK ! 17453: EJC ! 17454: * ! 17455: * GTNUM (CONTINUED) ! 17456: * ! 17457: * HERE SCALE REST OF WAY FROM POWERS OF TEN TABLE ! 17458: * ! 17459: GTN24 BZE WA,GTN30 JUMP IF SCALED ! 17460: LCT WB,=CFP$R ELSE GET INDEXING FACTOR ! 17461: MOV =REAV1,XR POINT TO POWERS OF TEN TABLE ! 17462: WTB WA CONVERT REMAINING SCALE TO BYTE OFS ! 17463: * ! 17464: * LOOP TO POINT TO POWERS OF TEN TABLE ENTRY ! 17465: * ! 17466: GTN25 ADD WA,XR BUMP POINTER ! 17467: BCT WB,GTN25 ONCE FOR EACH VALUE WORD ! 17468: DVR (XR) SCALE DOWN AS REQUIRED ! 17469: BRN GTN30 AND JUMP ! 17470: * ! 17471: * COME HERE TO SCALE RESULT UP (POSITIVE EXPONENT) ! 17472: * ! 17473: GTN26 NGI GET ABSOLUTE VALUE OF EXPONENT ! 17474: IOV GTN36 ERROR IF OVERFLOW ! 17475: MFI WA,GTN36 ACQUIRE SCALE, ERROR IF OVFLOW ! 17476: * ! 17477: * LOOP TO SCALE UP IN STEPS OF 10**10 ! 17478: * ! 17479: GTN27 BLE WA,=NUM10,GTN28 JUMP IF 10 OR LESS TO GO ! 17480: MLR REATT ELSE MULTIPLY BY 10**10 ! 17481: ROV GTN36 ERROR IF OVERFLOW ! 17482: SUB =NUM10,WA ELSE DECREMENT SCALE ! 17483: BRN GTN27 AND LOOP BACK ! 17484: * ! 17485: * HERE TO SCALE UP REST OF WAY WITH TABLE ! 17486: * ! 17487: GTN28 BZE WA,GTN30 JUMP IF SCALED ! 17488: LCT WB,=CFP$R ELSE GET INDEXING FACTOR ! 17489: MOV =REAV1,XR POINT TO POWERS OF TEN TABLE ! 17490: WTB WA CONVERT REMAINING SCALE TO BYTE OFS ! 17491: * ! 17492: * LOOP TO POINT TO PROPER ENTRY IN POWERS OF TEN TABLE ! 17493: * ! 17494: GTN29 ADD WA,XR BUMP POINTER ! 17495: BCT WB,GTN29 ONCE FOR EACH WORD IN VALUE ! 17496: MLR (XR) SCALE UP ! 17497: ROV GTN36 ERROR IF OVERFLOW ! 17498: EJC ! 17499: * ! 17500: * GTNUM (CONTINUED) ! 17501: * ! 17502: * HERE WITH REAL VALUE SCALED AND READY EXCEPT FOR SIGN ! 17503: * ! 17504: GTN30 BZE GTNNF,GTN31 JUMP IF POSITIVE ! 17505: NGR ELSE NEGATE ! 17506: * ! 17507: * HERE WITH PROPERLY SIGNED REAL VALUE IN (RA) ! 17508: * ! 17509: GTN31 JSR RCBLD BUILD REAL BLOCK ! 17510: BRN GTN33 MERGE TO EXIT ! 17511: .FI ! 17512: * ! 17513: * HERE WITH PROPERLY SIGNED INTEGER VALUE IN (IA) ! 17514: * ! 17515: GTN32 JSR ICBLD BUILD ICBLK ! 17516: * ! 17517: * REAL MERGES HERE ! 17518: * ! 17519: GTN33 MOV (XR),WA LOAD FIRST WORD OF RESULT BLOCK ! 17520: ICA XS POP ARGUMENT OFF STACK ! 17521: * ! 17522: * COMMON EXIT POINT ! 17523: * ! 17524: GTN34 EXI RETURN TO GTNUM CALLER ! 17525: .IF .CNRA ! 17526: .ELSE ! 17527: * ! 17528: * COME HERE IF OVERFLOW OCCURS DURING COLLECTION OF INTEGER ! 17529: * ! 17530: GTN35 LDI GTNSI RELOAD INTEGER SO FAR ! 17531: ITR CONVERT TO REAL ! 17532: NGR MAKE VALUE POSITIVE ! 17533: BRN GTN11 MERGE WITH REAL CIRCUIT ! 17534: .FI ! 17535: * ! 17536: * HERE FOR UNCONVERTIBLE TO STRING OR CONVERSION ERROR ! 17537: * ! 17538: GTN36 MOV (XS)+,XR RELOAD ORIGINAL ARGUMENT ! 17539: EXI 1 TAKE CONVERT-ERROR EXIT ! 17540: ENP END PROCEDURE GTNUM ! 17541: EJC ! 17542: * ! 17543: * GTNVR -- CONVERT TO NATURAL VARIABLE ! 17544: * ! 17545: * GTNVR LOCATES A VARIABLE BLOCK (VRBLK) GIVEN EITHER AN ! 17546: * APPROPRIATE NAME (NMBLK) OR A NON-NULL STRING (SCBLK). ! 17547: * ! 17548: * (XR) ARGUMENT ! 17549: * JSR GTNVR CALL TO CONVERT TO NATURAL VARIABLE ! 17550: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 17551: * (XR) POINTER TO VRBLK ! 17552: * (WA,WB) DESTROYED (CONVERSION ERROR ONLY) ! 17553: * (WC) DESTROYED ! 17554: * ! 17555: GTNVR PRC E,1 ENTRY POINT ! 17556: BNE (XR),=B$NML,GNV02 JUMP IF NOT NAME ! 17557: MOV NMBAS(XR),XR ELSE LOAD NAME BASE IF NAME ! 17558: BLO XR,STATE,GNV07 SKIP IF VRBLK (IN STATIC REGION) ! 17559: * ! 17560: * COMMON ERROR EXIT ! 17561: * ! 17562: GNV01 EXI 1 TAKE CONVERT-ERROR EXIT ! 17563: * ! 17564: * HERE IF NOT NAME ! 17565: * ! 17566: GNV02 MOV WA,GNVSA SAVE WA ! 17567: MOV WB,GNVSB SAVE WB ! 17568: MOV XR,-(XS) STACK ARGUMENT FOR GTSTG ! 17569: JSR GTSTG CONVERT ARGUMENT TO STRING ! 17570: PPM GNV01 JUMP IF CONVERSION ERROR ! 17571: BZE WA,GNV01 NULL STRING IS AN ERROR ! 17572: .IF .CULC ! 17573: JSR FLSTG FOLD LOWER CASE TO UPPER CASE ! 17574: .FI ! 17575: MOV XL,-(XS) SAVE XL ! 17576: MOV XR,-(XS) STACK STRING PTR FOR LATER ! 17577: MOV XR,WB COPY STRING POINTER ! 17578: ADD *SCHAR,WB POINT TO CHARACTERS OF STRING ! 17579: MOV WB,GNVST SAVE POINTER TO CHARACTERS ! 17580: MOV WA,WB COPY LENGTH ! 17581: CTW WB,0 GET NUMBER OF WORDS IN NAME ! 17582: MOV WB,GNVNW SAVE FOR LATER ! 17583: JSR HASHS COMPUTE HASH INDEX FOR STRING ! 17584: RMI HSHNB COMPUTE HASH OFFSET BY TAKING MOD ! 17585: MFI WC GET AS OFFSET ! 17586: WTB WC CONVERT OFFSET TO BYTES ! 17587: ADD HSHTB,WC POINT TO PROPER HASH CHAIN ! 17588: SUB *VRNXT,WC SUBTRACT OFFSET TO MERGE INTO LOOP ! 17589: EJC ! 17590: * ! 17591: * GTNVR (CONTINUED) ! 17592: * ! 17593: * LOOP TO SEARCH HASH CHAIN ! 17594: * ! 17595: GNV03 MOV WC,XL COPY HASH CHAIN POINTER ! 17596: MOV VRNXT(XL),XL POINT TO NEXT VRBLK ON CHAIN ! 17597: BZE XL,GNV08 JUMP IF END OF CHAIN ! 17598: MOV XL,WC SAVE POINTER TO THIS VRBLK ! 17599: BNZ VRLEN(XL),GNV04 JUMP IF NOT SYSTEM VARIABLE ! 17600: MOV VRSVP(XL),XL ELSE POINT TO SVBLK ! 17601: SUB *VRSOF,XL ADJUST OFFSET FOR MERGE ! 17602: * ! 17603: * MERGE HERE WITH STRING PTR (LIKE VRBLK) IN XL ! 17604: * ! 17605: GNV04 BNE WA,VRLEN(XL),GNV03 BACK FOR NEXT VRBLK IF LENGTHS NE ! 17606: ADD *VRCHS,XL ELSE POINT TO CHARS OF CHAIN ENTRY ! 17607: LCT WB,GNVNW GET WORD COUNTER TO CONTROL LOOP ! 17608: MOV GNVST,XR POINT TO CHARS OF NEW NAME ! 17609: * ! 17610: * LOOP TO COMPARE CHARACTERS OF THE TWO NAMES ! 17611: * ! 17612: GNV05 CNE (XR),(XL),GNV03 JUMP IF NO MATCH FOR NEXT VRBLK ! 17613: ICA XR BUMP NEW NAME POINTER ! 17614: ICA XL BUMP VRBLK IN CHAIN NAME POINTER ! 17615: BCT WB,GNV05 ELSE LOOP TILL ALL COMPARED ! 17616: MOV WC,XR WE HAVE FOUND A MATCH, GET VRBLK ! 17617: * ! 17618: * EXIT POINT AFTER FINDING VRBLK OR BUILDING NEW ONE ! 17619: * ! 17620: GNV06 MOV GNVSA,WA RESTORE WA ! 17621: MOV GNVSB,WB RESTORE WB ! 17622: ICA XS POP STRING POINTER ! 17623: MOV (XS)+,XL RESTORE XL ! 17624: * ! 17625: * COMMON EXIT POINT ! 17626: * ! 17627: GNV07 EXI RETURN TO GTNVR CALLER ! 17628: * ! 17629: * NOT FOUND, PREPARE TO SEARCH SYSTEM VARIABLE TABLE ! 17630: * ! 17631: GNV08 ZER XR CLEAR GARBAGE XR POINTER ! 17632: MOV WC,GNVHE SAVE PTR TO END OF HASH CHAIN ! 17633: BGT WA,=NUM09,GNV14 CANNOT BE SYSTEM VAR IF LENGTH GT 9 ! 17634: MOV WA,XL ELSE COPY LENGTH ! 17635: WTB XL CONVERT TO BYTE OFFSET ! 17636: MOV VSRCH(XL),XL POINT TO FIRST SVBLK OF THIS LENGTH ! 17637: EJC ! 17638: * ! 17639: * GTNVR (CONTINUED) ! 17640: * ! 17641: * LOOP TO SEARCH ENTRIES IN STANDARD VARIABLE TABLE ! 17642: * ! 17643: GNV09 MOV XL,GNVSP SAVE TABLE POINTER ! 17644: MOV (XL)+,WC LOAD SVBIT BIT STRING ! 17645: MOV (XL)+,WB LOAD LENGTH FROM TABLE ENTRY ! 17646: BNE WA,WB,GNV14 JUMP IF END OF RIGHT LENGTH ENTIRES ! 17647: LCT WB,GNVNW GET WORD COUNTER TO CONTROL LOOP ! 17648: MOV GNVST,XR POINT TO CHARS OF NEW NAME ! 17649: * ! 17650: * LOOP TO CHECK FOR MATCHING NAMES ! 17651: * ! 17652: GNV10 CNE (XR),(XL),GNV11 JUMP IF NAME MISMATCH ! 17653: ICA XR ELSE BUMP NEW NAME POINTER ! 17654: ICA XL BUMP SVBLK POINTER ! 17655: BCT WB,GNV10 ELSE LOOP UNTIL ALL CHECKED ! 17656: * ! 17657: * HERE WE HAVE A MATCH IN THE STANDARD VARIABLE TABLE ! 17658: * ! 17659: ZER WC SET VRLEN VALUE ZERO ! 17660: MOV *VRSI$,WA SET STANDARD SIZE ! 17661: BRN GNV15 JUMP TO BUILD VRBLK ! 17662: * ! 17663: * HERE IF NO MATCH WITH TABLE ENTRY IN SVBLKS TABLE ! 17664: * ! 17665: GNV11 ICA XL BUMP PAST WORD OF CHARS ! 17666: BCT WB,GNV11 LOOP BACK IF MORE TO GO ! 17667: RSH WC,SVNBT REMOVE UNINTERESTING BITS ! 17668: * ! 17669: * LOOP TO BUMP TABLE PTR FOR EACH FLAGGED WORD ! 17670: * ! 17671: GNV12 MOV BITS1,WB LOAD BIT TO TEST ! 17672: ANB WC,WB TEST FOR WORD PRESENT ! 17673: ZRB WB,GNV13 JUMP IF NOT PRESENT ! 17674: ICA XL ELSE BUMP TABLE POINTER ! 17675: * ! 17676: * HERE AFTER DEALING WITH ONE WORD (ONE BIT) ! 17677: * ! 17678: GNV13 RSH WC,1 REMOVE BIT ALREADY PROCESSED ! 17679: NZB WC,GNV12 LOOP BACK IF MORE BITS TO TEST ! 17680: BRN GNV09 ELSE LOOP BACK FOR NEXT SVBLK ! 17681: * ! 17682: * HERE IF NOT SYSTEM VARIABLE ! 17683: * ! 17684: GNV14 MOV WA,WC COPY VRLEN VALUE ! 17685: MOV =VRCHS,WA LOAD STANDARD SIZE -CHARS ! 17686: ADD GNVNW,WA ADJUST FOR CHARS OF NAME ! 17687: WTB WA CONVERT LENGTH TO BYTES ! 17688: EJC ! 17689: * ! 17690: * GTNVR (CONTINUED) ! 17691: * ! 17692: * MERGE HERE TO BUILD VRBLK ! 17693: * ! 17694: GNV15 JSR ALOST ALLOCATE SPACE FOR VRBLK (STATIC) ! 17695: MOV XR,WB SAVE VRBLK POINTER ! 17696: MOV =STNVR,XL POINT TO MODEL VARIABLE BLOCK ! 17697: MOV *VRLEN,WA SET LENGTH OF STANDARD FIELDS ! 17698: MVW SET INITIAL FIELDS OF NEW BLOCK ! 17699: MOV GNVHE,XL LOAD POINTER TO END OF HASH CHAIN ! 17700: MOV WB,VRNXT(XL) ADD NEW BLOCK TO END OF CHAIN ! 17701: MOV WC,(XR)+ SET VRLEN FIELD, BUMP PTR ! 17702: MOV GNVNW,WA GET LENGTH IN WORDS ! 17703: WTB WA CONVERT TO LENGTH IN BYTES ! 17704: BZE WC,GNV16 JUMP IF SYSTEM VARIABLE ! 17705: * ! 17706: * HERE FOR NON-SYSTEM VARIABLE -- SET CHARS OF NAME ! 17707: * ! 17708: MOV (XS),XL POINT BACK TO STRING NAME ! 17709: ADD *SCHAR,XL POINT TO CHARS OF NAME ! 17710: MVW MOVE CHARACTERS INTO PLACE ! 17711: MOV WB,XR RESTORE VRBLK POINTER ! 17712: BRN GNV06 JUMP BACK TO EXIT ! 17713: * ! 17714: * HERE FOR SYSTEM VARIABLE CASE TO FILL IN FIELDS WHERE ! 17715: * NECESSARY FROM THE FIELDS PRESENT IN THE SVBLK. ! 17716: * ! 17717: GNV16 MOV GNVSP,XL LOAD POINTER TO SVBLK ! 17718: MOV XL,(XR) SET SVBLK PTR IN VRBLK ! 17719: MOV WB,XR RESTORE VRBLK POINTER ! 17720: MOV SVBIT(XL),WB LOAD BIT INDICATORS ! 17721: ADD *SVCHS,XL POINT TO CHARACTERS OF NAME ! 17722: ADD WA,XL POINT PAST CHARACTERS ! 17723: * ! 17724: * SKIP PAST KEYWORD NUMBER (SVKNM) IF PRESENT ! 17725: * ! 17726: MOV BTKNM,WC LOAD TEST BIT ! 17727: ANB WB,WC AND TO TEST ! 17728: ZRB WC,GNV17 JUMP IF NO KEYWORD NUMBER ! 17729: ICA XL ELSE BUMP POINTER ! 17730: EJC ! 17731: * ! 17732: * GTNVR (CONTINUED) ! 17733: * ! 17734: * HERE TEST FOR FUNCTION (SVFNC AND SVNAR) ! 17735: * ! 17736: GNV17 MOV BTFNC,WC GET TEST BIT ! 17737: ANB WB,WC AND TO TEST ! 17738: ZRB WC,GNV18 SKIP IF NO SYSTEM FUNCTION ! 17739: MOV XL,VRFNC(XR) ELSE POINT VRFNC TO SVFNC FIELD ! 17740: ADD *NUM02,XL AND BUMP PAST SVFNC, SVNAR FIELDS ! 17741: * ! 17742: * NOW TEST FOR LABEL (SVLBL) ! 17743: * ! 17744: GNV18 MOV BTLBL,WC GET TEST BIT ! 17745: ANB WB,WC AND TO TEST ! 17746: ZRB WC,GNV19 JUMP IF BIT IS OFF (NO SYSTEM LABL) ! 17747: MOV XL,VRLBL(XR) ELSE POINT VRLBL TO SVLBL FIELD ! 17748: ICA XL BUMP PAST SVLBL FIELD ! 17749: * ! 17750: * NOW TEST FOR VALUE (SVVAL) ! 17751: * ! 17752: GNV19 MOV BTVAL,WC LOAD TEST BIT ! 17753: ANB WB,WC AND TO TEST ! 17754: ZRB WC,GNV06 ALL DONE IF NO VALUE ! 17755: MOV (XL),VRVAL(XR) ELSE SET INITIAL VALUE ! 17756: MOV =B$VRE,VRSTO(XR) SET ERROR STORE ACCESS ! 17757: BRN GNV06 MERGE BACK TO EXIT TO CALLER ! 17758: ENP END PROCEDURE GTNVR ! 17759: EJC ! 17760: * ! 17761: * GTPAT -- GET PATTERN ! 17762: * ! 17763: * GTPAT IS PASSED AN OBJECT IN (XR) AND RETURNS A ! 17764: * PATTERN AFTER PERFORMING ANY NECESSARY CONVERSIONS ! 17765: * ! 17766: * (XR) INPUT ARGUMENT ! 17767: * JSR GTPAT CALL TO CONVERT TO PATTERN ! 17768: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 17769: * (XR) RESULTING PATTERN ! 17770: * (WA) DESTROYED ! 17771: * (WB) DESTROYED (ONLY ON CONVERT ERROR) ! 17772: * (XR) UNCHANGED (ONLY ON CONVERT ERROR) ! 17773: * ! 17774: GTPAT PRC E,1 ENTRY POINT ! 17775: BHI (XR),=P$AAA,GTPT5 JUMP IF PATTERN ALREADY ! 17776: * ! 17777: * HERE IF NOT PATTERN, TRY FOR STRING ! 17778: * ! 17779: MOV WB,GTPSB SAVE WB ! 17780: MOV XR,-(XS) STACK ARGUMENT FOR GTSTG ! 17781: JSR GTSTG CONVERT ARGUMENT TO STRING ! 17782: PPM GTPT2 JUMP IF IMPOSSIBLE ! 17783: * ! 17784: * HERE WE HAVE A STRING ! 17785: * ! 17786: BNZ WA,GTPT1 JUMP IF NON-NULL ! 17787: * ! 17788: * HERE FOR NULL STRING. GENERATE POINTER TO NULL PATTERN. ! 17789: * ! 17790: MOV =NDNTH,XR POINT TO NOTHEN NODE ! 17791: BRN GTPT4 JUMP TO EXIT ! 17792: EJC ! 17793: * ! 17794: * GTPAT (CONTINUED) ! 17795: * ! 17796: * HERE FOR NON-NULL STRING ! 17797: * ! 17798: GTPT1 MOV =P$STR,WB LOAD PCODE FOR MULTI-CHAR STRING ! 17799: BNE WA,=NUM01,GTPT3 JUMP IF MULTI-CHAR STRING ! 17800: * ! 17801: * HERE FOR ONE CHARACTER STRING, SHARE ONE CHARACTER ANY ! 17802: * ! 17803: PLC XR POINT TO CHARACTER ! 17804: LCH WA,(XR) LOAD CHARACTER ! 17805: MOV WA,XR SET AS PARM1 ! 17806: MOV =P$ANS,WB POINT TO PCODE FOR 1-CHAR ANY ! 17807: BRN GTPT3 JUMP TO BUILD NODE ! 17808: * ! 17809: * HERE IF ARGUMENT IS NOT CONVERTIBLE TO STRING ! 17810: * ! 17811: GTPT2 MOV =P$EXA,WB SET PCODE FOR EXPRESSION IN CASE ! 17812: BLO (XR),=B$E$$,GTPT3 JUMP TO BUILD NODE IF EXPRESSION ! 17813: * ! 17814: * HERE WE HAVE AN ERROR (CONVERSION IMPOSSIBLE) ! 17815: * ! 17816: EXI 1 TAKE CONVERT ERROR EXIT ! 17817: * ! 17818: * MERGE HERE TO BUILD NODE FOR STRING OR EXPRESSION ! 17819: * ! 17820: GTPT3 JSR PBILD CALL ROUTINE TO BUILD PATTERN NODE ! 17821: * ! 17822: * COMMON EXIT AFTER SUCCESSFUL CONVERSION ! 17823: * ! 17824: GTPT4 MOV GTPSB,WB RESTORE WB ! 17825: * ! 17826: * MERGE HERE TO EXIT OF NO CONVERSION REQUIRED ! 17827: * ! 17828: GTPT5 EXI RETURN TO GTPAT CALLER ! 17829: ENP END PROCEDURE GTPAT ! 17830: .IF .CNRA ! 17831: .ELSE ! 17832: EJC ! 17833: * ! 17834: * GTREA -- GET REAL VALUE ! 17835: * ! 17836: * GTREA IS PASSED AN OBJECT AND RETURNS A REAL VALUE ! 17837: * PERFORMING ANY NECESSARY CONVERSIONS. ! 17838: * ! 17839: * (XR) OBJECT TO BE CONVERTED ! 17840: * JSR GTREA CALL TO CONVERT OBJECT TO REAL ! 17841: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 17842: * (XR) POINTER TO RESULTING REAL ! 17843: * (WA,WB,WC,RA) DESTROYED ! 17844: * (XR) UNCHANGED (CONVERT ERROR ONLY) ! 17845: * ! 17846: GTREA PRC E,1 ENTRY POINT ! 17847: MOV (XR),WA GET FIRST WORD OF BLOCK ! 17848: BEQ WA,=B$RCL,GTRE2 JUMP IF REAL ! 17849: JSR GTNUM ELSE CONVERT ARGUMENT TO NUMERIC ! 17850: PPM GTRE3 JUMP IF UNCONVERTIBLE ! 17851: BEQ WA,=B$RCL,GTRE2 JUMP IF REAL WAS RETURNED ! 17852: * ! 17853: * HERE FOR CASE OF AN INTEGER TO CONVERT TO REAL ! 17854: * ! 17855: GTRE1 LDI ICVAL(XR) LOAD INTEGER ! 17856: ITR CONVERT TO REAL ! 17857: JSR RCBLD BUILD RCBLK ! 17858: * ! 17859: * EXIT WITH REAL ! 17860: * ! 17861: GTRE2 EXI RETURN TO GTREA CALLER ! 17862: * ! 17863: * HERE ON CONVERSION ERROR ! 17864: * ! 17865: GTRE3 EXI 1 TAKE CONVERT ERROR EXIT ! 17866: ENP END PROCEDURE GTREA ! 17867: .FI ! 17868: EJC ! 17869: * ! 17870: * GTSMI -- GET SMALL INTEGER ! 17871: * ! 17872: * GTSMI IS PASSED A SNOBOL OBJECT AND RETURNS AN ADDRESS ! 17873: * INTEGER IN THE RANGE (0 LE N LE DNAMB). SUCH A VALUE CAN ! 17874: * ONLY BE DERIVED FROM AN INTEGER IN THE APPROPRIATE RANGE. ! 17875: * SMALL INTEGERS NEVER APPEAR AS SNOBOL VALUES. HOWEVER, ! 17876: * THEY ARE USED INTERNALLY FOR A VARIETY OF PURPOSES. ! 17877: * ! 17878: * -(XS) ARGUMENT TO CONVERT (ON STACK) ! 17879: * JSR GTSMI CALL TO CONVERT TO SMALL INTEGER ! 17880: * PPM LOC TRANSFER LOC FOR NOT INTEGER ! 17881: * PPM LOC TRANSFER LOC FOR LT 0, GT DNAMB ! 17882: * (XR,WC) RESULTING SMALL INT (TWO COPIES) ! 17883: * (XS) POPPED ! 17884: * (RA) DESTROYED ! 17885: * (WA,WB) DESTROYED (ON CONVERT ERROR ONLY) ! 17886: * (XR) INPUT ARG (CONVERT ERROR ONLY) ! 17887: * ! 17888: GTSMI PRC N,2 ENTRY POINT ! 17889: MOV (XS)+,XR LOAD ARGUMENT ! 17890: BEQ (XR),=B$ICL,GTSM1 SKIP IF ALREADY AN INTEGER ! 17891: * ! 17892: * HERE IF NOT AN INTEGER ! 17893: * ! 17894: JSR GTINT CONVERT ARGUMENT TO INTEGER ! 17895: PPM GTSM2 JUMP IF CONVERT IS IMPOSSIBLE ! 17896: * ! 17897: * MERGE HERE WITH INTEGER ! 17898: * ! 17899: GTSM1 LDI ICVAL(XR) LOAD INTEGER VALUE ! 17900: MFI WC,GTSM3 MOVE AS ONE WORD, JUMP IF OVFLOW ! 17901: BGT WC,MXLEN,GTSM3 OR IF TOO SMALL ! 17902: MOV WC,XR COPY RESULT TO XR ! 17903: EXI RETURN TO GTSMI CALLER ! 17904: * ! 17905: * HERE IF UNCONVERTIBLE TO INTEGER ! 17906: * ! 17907: GTSM2 EXI 1 TAKE NON-INTEGER ERROR EXIT ! 17908: * ! 17909: * HERE IF OUT OF RANGE ! 17910: * ! 17911: GTSM3 EXI 2 TAKE OUT-OF-RANGE ERROR EXIT ! 17912: ENP END PROCEDURE GTSMI ! 17913: EJC ! 17914: * ! 17915: * GTSTG -- GET STRING ! 17916: * ! 17917: * GTSTG IS PASSED AN OBJECT AND RETURNS A STRING WITH ! 17918: * ANY NECESSARY CONVERSIONS PERFORMED. ! 17919: * ! 17920: * -(XS) INPUT ARGUMENT (ON STACK) ! 17921: * JSR GTSTG CALL TO CONVERT TO STRING ! 17922: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE ! 17923: * (XR) POINTER TO RESULTING STRING ! 17924: * (WA) LENGTH OF STRING IN CHARACTERS ! 17925: * (XS) POPPED ! 17926: * (RA) DESTROYED ! 17927: * (XR) INPUT ARG (CONVERT ERROR ONLY) ! 17928: * ! 17929: GTSTG PRC N,1 ENTRY POINT ! 17930: MOV (XS)+,XR LOAD ARGUMENT, POP STACK ! 17931: BEQ (XR),=B$SCL,GTS30 JUMP IF ALREADY A STRING ! 17932: * ! 17933: * HERE IF NOT A STRING ALREADY ! 17934: * ! 17935: GTS01 MOV XR,-(XS) RESTACK ARGUMENT IN CASE ERROR ! 17936: MOV XL,-(XS) SAVE XL ! 17937: MOV WB,GTSVB SAVE WB ! 17938: MOV WC,GTSVC SAVE WC ! 17939: MOV (XR),WA LOAD FIRST WORD OF BLOCK ! 17940: BEQ WA,=B$ICL,GTS05 JUMP TO CONVERT INTEGER ! 17941: .IF .CNRA ! 17942: .ELSE ! 17943: BEQ WA,=B$RCL,GTS10 JUMP TO CONVERT REAL ! 17944: .FI ! 17945: BEQ WA,=B$NML,GTS03 JUMP TO CONVERT NAME ! 17946: .IF .CNBF ! 17947: .ELSE ! 17948: BEQ WA,=B$BCT,GTS32 JUMP TO CONVERT BUFFER ! 17949: .FI ! 17950: * ! 17951: * HERE ON CONVERSION ERROR ! 17952: * ! 17953: GTS02 MOV (XS)+,XL RESTORE XL ! 17954: MOV (XS)+,XR RELOAD INPUT ARGUMENT ! 17955: EXI 1 TAKE CONVERT ERROR EXIT ! 17956: EJC ! 17957: * ! 17958: * GTSTG (CONTINUED) ! 17959: * ! 17960: * HERE TO CONVERT A NAME (ONLY POSSIBLE IF NATURAL VAR) ! 17961: * ! 17962: GTS03 MOV NMBAS(XR),XL LOAD NAME BASE ! 17963: BHI XL,STATE,GTS02 ERROR IF NOT NATURAL VAR (STATIC) ! 17964: ADD *VRSOF,XL ELSE POINT TO POSSIBLE STRING NAME ! 17965: MOV SCLEN(XL),WA LOAD LENGTH ! 17966: BNZ WA,GTS04 JUMP IF NOT SYSTEM VARIABLE ! 17967: MOV VRSVO(XL),XL ELSE POINT TO SVBLK ! 17968: MOV SVLEN(XL),WA AND LOAD NAME LENGTH ! 17969: * ! 17970: * MERGE HERE WITH STRING IN XR, LENGTH IN WA ! 17971: * ! 17972: GTS04 ZER WB SET OFFSET TO ZERO ! 17973: JSR SBSTR USE SBSTR TO COPY STRING ! 17974: BRN GTS29 JUMP TO EXIT ! 17975: * ! 17976: * COME HERE TO CONVERT AN INTEGER ! 17977: * ! 17978: GTS05 LDI ICVAL(XR) LOAD INTEGER VALUE ! 17979: .IF .CNCI ! 17980: JSR SYSCI CONVERT INTEGER ! 17981: MOV SCLEN(XL),WA GET LENGTH ! 17982: ZER WB ZERO OFFSET FOR SBSTR ! 17983: JSR SBSTR COPY IN RESULT FROM SYSCI ! 17984: BRN GTS29 EXIT ! 17985: .ELSE ! 17986: MOV =NUM01,GTSSF SET SIGN FLAG NEGATIVE ! 17987: ILT GTS06 SKIP IF INTEGER IS NEGATIVE ! 17988: NGI ELSE NEGATE INTEGER ! 17989: ZER GTSSF AND RESET NEGATIVE FLAG ! 17990: EJC ! 17991: * ! 17992: * GTSTG (CONTINUED) ! 17993: * ! 17994: * HERE WITH SIGN FLAG SET AND SIGN FORCED NEGATIVE AS ! 17995: * REQUIRED BY THE CVD INSTRUCTION. ! 17996: * ! 17997: GTS06 MOV GTSWK,XR POINT TO RESULT WORK AREA ! 17998: MOV =NSTMX,WB INITIALIZE COUNTER TO MAX LENGTH ! 17999: PSC XR,WB PREPARE TO STORE (RIGHT-LEFT) ! 18000: * ! 18001: * LOOP TO CONVERT DIGITS INTO WORK AREA ! 18002: * ! 18003: GTS07 CVD CONVERT ONE DIGIT INTO WA ! 18004: SCH WA,-(XR) STORE IN WORK AREA ! 18005: DCV WB DECREMENT COUNTER ! 18006: INE GTS07 LOOP IF MORE DIGITS TO GO ! 18007: CSC XR COMPLETE STORE CHARACTERS ! 18008: .FI ! 18009: * ! 18010: * MERGE HERE AFTER CONVERTING INTEGER OR REAL INTO WORK ! 18011: * AREA. WB IS SET TO NSTMX - (NUMBER OF CHARS IN RESULT). ! 18012: * ! 18013: GTS08 MOV =NSTMX,WA GET MAX NUMBER OF CHARACTERS ! 18014: SUB WB,WA COMPUTE LENGTH OF RESULT ! 18015: MOV WA,XL REMEMBER LENGTH FOR MOVE LATER ON ! 18016: ADD GTSSF,WA ADD ONE FOR NEGATIVE SIGN IF NEEDED ! 18017: JSR ALOCS ALLOCATE STRING FOR RESULT ! 18018: MOV XR,WC SAVE RESULT POINTER FOR THE MOMENT ! 18019: PSC XR POINT TO CHARS OF RESULT BLOCK ! 18020: BZE GTSSF,GTS09 SKIP IF POSITIVE ! 18021: MOV =CH$MN,WA ELSE LOAD NEGATIVE SIGN ! 18022: SCH WA,(XR)+ AND STORE IT ! 18023: CSC XR COMPLETE STORE CHARACTERS ! 18024: * ! 18025: * HERE AFTER DEALING WITH SIGN ! 18026: * ! 18027: GTS09 MOV XL,WA RECALL LENGTH TO MOVE ! 18028: MOV GTSWK,XL POINT TO RESULT WORK AREA ! 18029: PLC XL,WB POINT TO FIRST RESULT CHARACTER ! 18030: MVC MOVE CHARS TO RESULT STRING ! 18031: MOV WC,XR RESTORE RESULT POINTER ! 18032: .IF .CNRA ! 18033: .ELSE ! 18034: BRN GTS29 JUMP TO EXIT ! 18035: EJC ! 18036: * ! 18037: * GTSTG (CONTINUED) ! 18038: * ! 18039: * HERE TO CONVERT A REAL ! 18040: * ! 18041: GTS10 LDR RCVAL(XR) LOAD REAL ! 18042: ZER GTSSF RESET NEGATIVE FLAG ! 18043: REQ GTS31 SKIP IF ZERO ! 18044: RGE GTS11 JUMP IF REAL IS POSITIVE ! 18045: MOV =NUM01,GTSSF ELSE SET NEGATIVE FLAG ! 18046: NGR AND GET ABSOLUTE VALUE OF REAL ! 18047: * ! 18048: * NOW SCALE THE REAL TO THE RANGE (0.1 LE X LT 1.0) ! 18049: * ! 18050: GTS11 LDI INTV0 INITIALIZE EXPONENT TO ZERO ! 18051: * ! 18052: * LOOP TO SCALE UP IN STEPS OF 10**10 ! 18053: * ! 18054: GTS12 STR GTSRS SAVE REAL VALUE ! 18055: SBR REAP1 SUBTRACT 0.1 TO COMPARE ! 18056: RGE GTS13 JUMP IF SCALE UP NOT REQUIRED ! 18057: LDR GTSRS ELSE RELOAD VALUE ! 18058: MLR REATT MULTIPLY BY 10**10 ! 18059: SBI INTVT DECREMENT EXPONENT BY 10 ! 18060: BRN GTS12 LOOP BACK TO TEST AGAIN ! 18061: * ! 18062: * TEST FOR SCALE DOWN REQUIRED ! 18063: * ! 18064: GTS13 LDR GTSRS RELOAD VALUE ! 18065: SBR REAV1 SUBTRACT 1.0 ! 18066: RLT GTS17 JUMP IF NO SCALE DOWN REQUIRED ! 18067: LDR GTSRS ELSE RELOAD VALUE ! 18068: * ! 18069: * LOOP TO SCALE DOWN IN STEPS OF 10**10 ! 18070: * ! 18071: GTS14 SBR REATT SUBTRACT 10**10 TO COMPARE ! 18072: RLT GTS15 JUMP IF LARGE STEP NOT REQUIRED ! 18073: LDR GTSRS ELSE RESTORE VALUE ! 18074: DVR REATT DIVIDE BY 10**10 ! 18075: STR GTSRS STORE NEW VALUE ! 18076: ADI INTVT INCREMENT EXPONENT BY 10 ! 18077: BRN GTS14 LOOP BACK ! 18078: EJC ! 18079: * ! 18080: * GTSTG (CONTINUED) ! 18081: * ! 18082: * AT THIS POINT WE HAVE (1.0 LE X LT 10**10) ! 18083: * COMPLETE SCALING WITH POWERS OF TEN TABLE ! 18084: * ! 18085: GTS15 MOV =REAV1,XR POINT TO POWERS OF TEN TABLE ! 18086: * ! 18087: * LOOP TO LOCATE CORRECT ENTRY IN TABLE ! 18088: * ! 18089: GTS16 LDR GTSRS RELOAD VALUE ! 18090: ADI INTV1 INCREMENT EXPONENT ! 18091: ADD *CFP$R,XR POINT TO NEXT ENTRY IN TABLE ! 18092: SBR (XR) SUBTRACT IT TO COMPARE ! 18093: RGE GTS16 LOOP TILL WE FIND A LARGER ENTRY ! 18094: LDR GTSRS THEN RELOAD THE VALUE ! 18095: DVR (XR) AND COMPLETE SCALING ! 18096: STR GTSRS STORE VALUE ! 18097: * ! 18098: * WE ARE NOW SCALED, SO ROUND BY ADDING 0.5 * 10**(-CFP$S) ! 18099: * ! 18100: GTS17 LDR GTSRS GET VALUE AGAIN ! 18101: ADR GTSRN ADD ROUNDING FACTOR ! 18102: STR GTSRS STORE RESULT ! 18103: * ! 18104: * THE ROUNDING OPERATION MAY HAVE PUSHED US UP PAST ! 18105: * 1.0 AGAIN, SO CHECK ONE MORE TIME. ! 18106: * ! 18107: SBR REAV1 SUBTRACT 1.0 TO COMPARE ! 18108: RLT GTS18 SKIP IF OK ! 18109: ADI INTV1 ELSE INCREMENT EXPONENT ! 18110: LDR GTSRS RELOAD VALUE ! 18111: DVR REAVT DIVIDE BY 10.0 TO RESCALE ! 18112: BRN GTS19 JUMP TO MERGE ! 18113: * ! 18114: * HERE IF ROUNDING DID NOT MUCK UP SCALING ! 18115: * ! 18116: GTS18 LDR GTSRS RELOAD ROUNDED VALUE ! 18117: EJC ! 18118: * ! 18119: * GTSTG (CONTINUED) ! 18120: * ! 18121: * NOW WE HAVE COMPLETED THE SCALING AS FOLLOWS ! 18122: * ! 18123: * (IA) SIGNED EXPONENT ! 18124: * (RA) SCALED REAL (ABSOLUTE VALUE) ! 18125: * ! 18126: * IF THE EXPONENT IS NEGATIVE OR GREATER THAN CFP$S, THEN ! 18127: * WE CONVERT THE NUMBER IN THE FORM. ! 18128: * ! 18129: * (NEG SIGN) 0 . (CPF$S DIGITS) E (EXP SIGN) (EXP DIGITS) ! 18130: * ! 18131: * IF THE EXPONENT IS POSITIVE AND LESS THAN OR EQUAL TO ! 18132: * CFP$S, THE NUMBER IS CONVERTED IN THE FORM. ! 18133: * ! 18134: * (NEG SIGN) (EXPONENT DIGITS) . (CFP$S-EXPONENT DIGITS) ! 18135: * ! 18136: * IN BOTH CASES, THE FORMATS OBTAINED FROM THE ABOVE ! 18137: * RULES ARE MODIFIED BY DELETING TRAILING ZEROS AFTER THE ! 18138: * DECIMAL POINT. THERE ARE NO LEADING ZEROS IN THE EXPONENT ! 18139: * AND THE EXPONENT SIGN IS ALWAYS PRESENT. ! 18140: * ! 18141: GTS19 MOV =CFP$S,XL SET NUM DEC DIGITS = CFP$S ! 18142: MOV =CH$MN,GTSES SET EXPONENT SIGN NEGATIVE ! 18143: ILT GTS21 ALL SET IF EXPONENT IS NEGATIVE ! 18144: MFI WA ELSE FETCH EXPONENT ! 18145: BLE WA,=CFP$S,GTS20 SKIP IF WE CAN USE SPECIAL FORMAT ! 18146: MTI WA ELSE RESTORE EXPONENT ! 18147: NGI SET NEGATIVE FOR CVD ! 18148: MOV =CH$PL,GTSES SET PLUS SIGN FOR EXPONENT SIGN ! 18149: BRN GTS21 JUMP TO GENERATE EXPONENT ! 18150: * ! 18151: * HERE IF WE CAN USE THE FORMAT WITHOUT AN EXPONENT ! 18152: * ! 18153: GTS20 SUB WA,XL COMPUTE DIGITS AFTER DECIMAL POINT ! 18154: LDI INTV0 RESET EXPONENT TO ZERO ! 18155: EJC ! 18156: * ! 18157: * GTSTG (CONTINUED) ! 18158: * ! 18159: * MERGE HERE AS FOLLOWS ! 18160: * ! 18161: * (IA) EXPONENT ABSOLUTE VALUE ! 18162: * GTSES CHARACTER FOR EXPONENT SIGN ! 18163: * (RA) POSITIVE FRACTION ! 18164: * (XL) NUMBER OF DIGITS AFTER DEC POINT ! 18165: * ! 18166: GTS21 MOV GTSWK,XR POINT TO WORK AREA ! 18167: MOV =NSTMX,WB SET CHARACTER CTR TO MAX LENGTH ! 18168: PSC XR,WB PREPARE TO STORE (RIGHT TO LEFT) ! 18169: IEQ GTS23 SKIP EXPONENT IF IT IS ZERO ! 18170: * ! 18171: * LOOP TO GENERATE DIGITS OF EXPONENT ! 18172: * ! 18173: GTS22 CVD CONVERT A DIGIT INTO WA ! 18174: SCH WA,-(XR) STORE IN WORK AREA ! 18175: DCV WB DECREMENT COUNTER ! 18176: INE GTS22 LOOP BACK IF MORE DIGITS TO GO ! 18177: * ! 18178: * HERE GENERATE EXPONENT SIGN AND E ! 18179: * ! 18180: MOV GTSES,WA LOAD EXPONENT SIGN ! 18181: SCH WA,-(XR) STORE IN WORK AREA ! 18182: MOV =CH$LE,WA GET CHARACTER LETTER E ! 18183: SCH WA,-(XR) STORE IN WORK AREA ! 18184: SUB =NUM02,WB DECREMENT COUNTER FOR SIGN AND E ! 18185: * ! 18186: * HERE TO GENERATE THE FRACTION ! 18187: * ! 18188: GTS23 MLR GTSSC CONVERT REAL TO INTEGER (10**CFP$S) ! 18189: RTI GET INTEGER (OVERFLOW IMPOSSIBLE) ! 18190: NGI NEGATE AS REQUIRED BY CVD ! 18191: * ! 18192: * LOOP TO SUPPRESS TRAILING ZEROS ! 18193: * ! 18194: GTS24 BZE XL,GTS27 JUMP IF NO DIGITS LEFT TO DO ! 18195: CVD ELSE CONVERT ONE DIGIT ! 18196: BNE WA,=CH$D0,GTS26 JUMP IF NOT A ZERO ! 18197: DCV XL DECREMENT COUNTER ! 18198: BRN GTS24 LOOP BACK FOR NEXT DIGIT ! 18199: EJC ! 18200: * ! 18201: * GTSTG (CONTINUED) ! 18202: * ! 18203: * LOOP TO GENERATE DIGITS AFTER DECIMAL POINT ! 18204: * ! 18205: GTS25 CVD CONVERT A DIGIT INTO WA ! 18206: * ! 18207: * MERGE HERE FIRST TIME ! 18208: * ! 18209: GTS26 SCH WA,-(XR) STORE DIGIT ! 18210: DCV WB DECREMENT COUNTER ! 18211: DCV XL DECREMENT COUNTER ! 18212: BNZ XL,GTS25 LOOP BACK IF MORE TO GO ! 18213: * ! 18214: * HERE GENERATE THE DECIMAL POINT ! 18215: * ! 18216: GTS27 MOV =CH$DT,WA LOAD DECIMAL POINT ! 18217: SCH WA,-(XR) STORE IN WORK AREA ! 18218: DCV WB DECREMENT COUNTER ! 18219: * ! 18220: * HERE GENERATE THE DIGITS BEFORE THE DECIMAL POINT ! 18221: * ! 18222: GTS28 CVD CONVERT A DIGIT INTO WA ! 18223: SCH WA,-(XR) STORE IN WORK AREA ! 18224: DCV WB DECREMENT COUNTER ! 18225: INE GTS28 LOOP BACK IF MORE TO GO ! 18226: CSC XR COMPLETE STORE CHARACTERS ! 18227: BRN GTS08 ELSE JUMP BACK TO EXIT ! 18228: .FI ! 18229: * ! 18230: * EXIT POINT AFTER SUCCESSFUL CONVERSION ! 18231: * ! 18232: GTS29 MOV (XS)+,XL RESTORE XL ! 18233: ICA XS POP ARGUMENT ! 18234: MOV GTSVB,WB RESTORE WB ! 18235: MOV GTSVC,WC RESTORE WC ! 18236: * ! 18237: * MERGE HERE IF NO CONVERSION REQUIRED ! 18238: * ! 18239: GTS30 MOV SCLEN(XR),WA LOAD STRING LENGTH ! 18240: EXI RETURN TO CALLER ! 18241: .IF .CNRA ! 18242: .ELSE ! 18243: * ! 18244: * HERE TO RETURN STRING FOR REAL ZERO ! 18245: * ! 18246: GTS31 MOV =SCRE0,XL POINT TO STRING ! 18247: MOV =NUM02,WA 2 CHARS ! 18248: ZER WB ZERO OFFSET ! 18249: JSR SBSTR COPY STRING ! 18250: BRN GTS29 RETURN ! 18251: .FI ! 18252: .IF .CNBF ! 18253: .ELSE ! 18254: EJC ! 18255: * ! 18256: * HERE TO CONVERT A BUFFER BLOCK ! 18257: * ! 18258: GTS32 MOV XR,XL COPY ARG PTR ! 18259: MOV BCLEN(XL),WA GET SIZE TO ALLOCATE ! 18260: BZE WA,GTS33 IF NULL THEN RETURN NULL ! 18261: JSR ALOCS ALLOCATE STRING FRAME ! 18262: MOV XR,WB SAVE STRING PTR ! 18263: MOV SCLEN(XR),WA GET LENGTH TO MOVE ! 18264: CTB WA,0 GET AS MULTIPLE OF WORD SIZE ! 18265: MOV BCBUF(XL),XL POINT TO BFBLK ! 18266: ADD *SCSI$,XR POINT TO START OF CHARACTER AREA ! 18267: ADD *BFSI$,XL POINT TO START OF BUFFER CHARS ! 18268: MVW COPY WORDS ! 18269: MOV WB,XR RESTORE SCBLK PTR ! 18270: BRN GTS29 EXIT WITH SCBLK ! 18271: * ! 18272: * HERE WHEN NULL BUFFER IS BEING CONVERTED ! 18273: * ! 18274: GTS33 MOV =NULLS,XR POINT TO NULL ! 18275: BRN GTS29 EXIT WITH NULL ! 18276: .FI ! 18277: ENP END PROCEDURE GTSTG ! 18278: EJC ! 18279: * ! 18280: * GTVAR -- GET VARIABLE FOR I/O/TRACE ASSOCIATION ! 18281: * ! 18282: * GTVAR IS USED TO POINT TO AN ACTUAL VARIABLE LOCATION ! 18283: * FOR THE DETACH,INPUT,OUTPUT,TRACE,STOPTR SYSTEM FUNCTIONS ! 18284: * ! 18285: * (XR) ARGUMENT TO FUNCTION ! 18286: * JSR GTVAR CALL TO LOCATE VARIABLE POINTER ! 18287: * PPM LOC TRANSFER LOC IF NOT OK VARIABLE ! 18288: * (XL,WA) NAME BASE,OFFSET OF VARIABLE ! 18289: * (XR,RA) DESTROYED ! 18290: * (WB,WC) DESTROYED (CONVERT ERROR ONLY) ! 18291: * (XR) INPUT ARG (CONVERT ERROR ONLY) ! 18292: * ! 18293: GTVAR PRC E,1 ENTRY POINT ! 18294: BNE (XR),=B$NML,GTVR2 JUMP IF NOT A NAME ! 18295: MOV NMOFS(XR),WA ELSE LOAD NAME OFFSET ! 18296: MOV NMBAS(XR),XL LOAD NAME BASE ! 18297: BEQ (XL),=B$EVT,GTVR1 ERROR IF EXPRESSION VARIABLE ! 18298: BNE (XL),=B$KVT,GTVR3 ALL OK IF NOT KEYWORD VARIABLE ! 18299: * ! 18300: * HERE ON CONVERSION ERROR ! 18301: * ! 18302: GTVR1 EXI 1 TAKE CONVERT ERROR EXIT ! 18303: * ! 18304: * HERE IF NOT A NAME, TRY CONVERT TO NATURAL VARIABLE ! 18305: * ! 18306: GTVR2 MOV WC,GTVRC SAVE WC ! 18307: JSR GTNVR LOCATE VRBLK IF POSSIBLE ! 18308: PPM GTVR1 JUMP IF CONVERT ERROR ! 18309: MOV XR,XL ELSE COPY VRBLK NAME BASE ! 18310: MOV *VRVAL,WA AND SET OFFSET ! 18311: MOV GTVRC,WC RESTORE WC ! 18312: * ! 18313: * HERE FOR NAME OBTAINED ! 18314: * ! 18315: GTVR3 BHI XL,STATE,GTVR4 ALL OK IF NOT NATURAL VARIABLE ! 18316: BEQ VRSTO(XL),=B$VRE,GTVR1 ERROR IF PROTECTED VARIABLE ! 18317: * ! 18318: * COMMON EXIT POINT ! 18319: * ! 18320: GTVR4 EXI RETURN TO CALLER ! 18321: ENP END PROCEDURE GTVAR ! 18322: EJC ! 18323: * ! 18324: * HASHS -- COMPUTE HASH INDEX FOR STRING ! 18325: * ! 18326: * HASHS IS USED TO CONVERT A STRING TO A UNIQUE INTEGER ! 18327: * VALUE. THE RESULTING HASH VALUE IS A POSITIVE INTEGER ! 18328: * IN THE RANGE 0 TO CFP$M ! 18329: * ! 18330: * (XR) STRING TO BE HASHED ! 18331: * JSR HASHS CALL TO HASH STRING ! 18332: * (IA) HASH VALUE ! 18333: * (XR,WB,WC) DESTROYED ! 18334: * ! 18335: * THE HASH FUNCTION USED IS AS FOLLOWS. ! 18336: * ! 18337: * START WITH THE LENGTH OF THE STRING (SGD07) ! 18338: * ! 18339: * TAKE THE FIRST E$HNW WORDS OF THE CHARACTERS FROM ! 18340: * THE STRING OR ALL THE WORDS IF FEWER THAN E$HNW. ! 18341: * ! 18342: * COMPUTE THE EXCLUSIVE OR OF ALL THESE WORDS TREATING ! 18343: * THEM AS ONE WORD BIT STRING VALUES. ! 18344: * ! 18345: * MOVE THE RESULT AS AN INTEGER WITH THE MTI INSTRUCTION. ! 18346: * ! 18347: HASHS PRC E,0 ENTRY POINT ! 18348: MOV SCLEN(XR),WC LOAD STRING LENGTH IN CHARACTERS ! 18349: MOV WC,WB INITIALIZE WITH LENGTH ! 18350: BZE WC,HSHS3 JUMP IF NULL STRING ! 18351: CTW WC,0 ELSE GET NUMBER OF WORDS OF CHARS ! 18352: ADD *SCHAR,XR POINT TO CHARACTERS OF STRING ! 18353: BLO WC,=E$HNW,HSHS1 USE WHOLE STRING IF SHORT ! 18354: MOV =E$HNW,WC ELSE SET TO INVOLVE FIRST E$HNW WDS ! 18355: * ! 18356: * HERE WITH COUNT OF WORDS TO CHECK IN WC ! 18357: * ! 18358: HSHS1 LCT WC,WC SET COUNTER TO CONTROL LOOP ! 18359: * ! 18360: * LOOP TO COMPUTE EXCLUSIVE OR ! 18361: * ! 18362: HSHS2 XOB (XR)+,WB EXCLUSIVE OR NEXT WORD OF CHARS ! 18363: BCT WC,HSHS2 LOOP TILL ALL PROCESSED ! 18364: * ! 18365: * MERGE HERE WITH EXCLUSIVE OR IN WB ! 18366: * ! 18367: HSHS3 ZGB WB ZEROISE UNDEFINED BITS ! 18368: ANB BITSM,WB ENSURE IN RANGE 0 TO CFP$M ! 18369: MTI WB MOVE RESULT AS INTEGER ! 18370: ZER XR CLEAR GARBAGE VALUE IN XR ! 18371: EXI RETURN TO HASHS CALLER ! 18372: ENP END PROCEDURE HASHS ! 18373: EJC ! 18374: * ! 18375: * ICBLD -- BUILD INTEGER BLOCK ! 18376: * ! 18377: * (IA) INTEGER VALUE FOR ICBLK ! 18378: * JSR ICBLD CALL TO BUILD INTEGER BLOCK ! 18379: * (XR) POINTER TO RESULT ICBLK ! 18380: * (WA) DESTROYED ! 18381: * ! 18382: ICBLD PRC E,0 ENTRY POINT ! 18383: MFI XR,ICBL1 COPY SMALL INTEGERS ! 18384: BLE XR,=NUM02,ICBL3 JUMP IF 0,1 OR 2 ! 18385: * ! 18386: * CONSTRUCT ICBLK ! 18387: * ! 18388: ICBL1 MOV DNAMP,XR LOAD POINTER TO NEXT AVAILABLE LOC ! 18389: ADD *ICSI$,XR POINT PAST NEW ICBLK ! 18390: BLO XR,DNAME,ICBL2 JUMP IF THERE IS ROOM ! 18391: MOV *ICSI$,WA ELSE LOAD LENGTH OF ICBLK ! 18392: JSR ALLOC USE STANDARD ALLOCATOR TO GET BLOCK ! 18393: ADD WA,XR POINT PAST BLOCK TO MERGE ! 18394: * ! 18395: * MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED ! 18396: * ! 18397: ICBL2 MOV XR,DNAMP SET NEW POINTER ! 18398: SUB *ICSI$,XR POINT BACK TO START OF BLOCK ! 18399: MOV =B$ICL,(XR) STORE TYPE WORD ! 18400: STI ICVAL(XR) STORE INTEGER VALUE IN ICBLK ! 18401: EXI RETURN TO ICBLD CALLER ! 18402: * ! 18403: * OPTIMISE BY NOT BUILDING ICBLKS FOR SMALL INTEGERS ! 18404: * ! 18405: ICBL3 WTB XR CONVERT INTEGER TO OFFSET ! 18406: MOV INTAB(XR),XR POINT TO PRE-BUILT ICBLK ! 18407: EXI RETURN ! 18408: ENP END PROCEDURE ICBLD ! 18409: EJC ! 18410: * ! 18411: * IDENT -- COMPARE TWO VALUES ! 18412: * ! 18413: * IDENT COMPARES TWO VALUES IN THE SENSE OF THE IDENT ! 18414: * DIFFER FUNCTIONS AVAILABLE AT THE SNOBOL LEVEL. ! 18415: * ! 18416: * (XR) FIRST ARGUMENT ! 18417: * (XL) SECOND ARGUMENT ! 18418: * JSR IDENT CALL TO COMPARE ARGUMENTS ! 18419: * PPM LOC TRANSFER LOC IF IDENT ! 18420: * (NORMAL RETURN IF DIFFER) ! 18421: * (XR,XL,WC,RA) DESTROYED ! 18422: * ! 18423: IDENT PRC E,1 ENTRY POINT ! 18424: BEQ XR,XL,IDEN7 JUMP IF SAME POINTER (IDENT) ! 18425: MOV (XR),WC ELSE LOAD ARG 1 TYPE WORD ! 18426: BNE WC,(XL),IDEN1 DIFFER IF ARG 2 TYPE WORD DIFFER ! 18427: BEQ WC,=B$SCL,IDEN2 JUMP IF STRINGS ! 18428: BEQ WC,=B$ICL,IDEN4 JUMP IF INTEGERS ! 18429: .IF .CNRA ! 18430: .ELSE ! 18431: BEQ WC,=B$RCL,IDEN5 JUMP IF REALS ! 18432: .FI ! 18433: BEQ WC,=B$NML,IDEN6 JUMP IF NAMES ! 18434: * ! 18435: * FOR ALL OTHER DATATYPES, MUST BE DIFFER IF XR NE XL ! 18436: * ! 18437: * MERGE HERE FOR DIFFER ! 18438: * ! 18439: IDEN1 EXI TAKE DIFFER EXIT ! 18440: * ! 18441: * HERE FOR STRINGS, IDENT ONLY IF LENGTHS AND CHARS SAME ! 18442: * ! 18443: IDEN2 MOV SCLEN(XR),WC LOAD ARG 1 LENGTH ! 18444: BNE WC,SCLEN(XL),IDEN1 DIFFER IF LENGTHS DIFFER ! 18445: CTW WC,0 GET NUMBER OF WORDS IN STRINGS ! 18446: ADD *SCHAR,XR POINT TO CHARS OF ARG 1 ! 18447: ADD *SCHAR,XL POINT TO CHARS OF ARG 2 ! 18448: LCT WC,WC SET LOOP COUNTER ! 18449: * ! 18450: * LOOP TO COMPARE CHARACTERS. NOTE THAT WA CANNOT BE ZERO ! 18451: * SINCE ALL NULL STRINGS POINT TO NULLS AND GIVE XL=XR. ! 18452: * ! 18453: IDEN3 CNE (XR),(XL),IDEN8 DIFFER IF CHARS DO NOT MATCH ! 18454: ICA XR ELSE BUMP ARG ONE POINTER ! 18455: ICA XL BUMP ARG TWO POINTER ! 18456: BCT WC,IDEN3 LOOP BACK TILL ALL CHECKED ! 18457: EJC ! 18458: * ! 18459: * IDENT (CONTINUED) ! 18460: * ! 18461: * HERE TO EXIT FOR CASE OF TWO IDENT STRINGS ! 18462: * ! 18463: ZER XL CLEAR GARBAGE VALUE IN XL ! 18464: ZER XR CLEAR GARBAGE VALUE IN XR ! 18465: EXI 1 TAKE IDENT EXIT ! 18466: * ! 18467: * HERE FOR INTEGERS, IDENT IF SAME VALUES ! 18468: * ! 18469: IDEN4 LDI ICVAL(XR) LOAD ARG 1 ! 18470: SBI ICVAL(XL) SUBTRACT ARG 2 TO COMPARE ! 18471: IOV IDEN1 DIFFER IF OVERFLOW ! 18472: INE IDEN1 DIFFER IF RESULT IS NOT ZERO ! 18473: EXI 1 TAKE IDENT EXIT ! 18474: .IF .CNRA ! 18475: .ELSE ! 18476: * ! 18477: * HERE FOR REALS, IDENT IF SAME VALUES ! 18478: * ! 18479: IDEN5 LDR RCVAL(XR) LOAD ARG 1 ! 18480: SBR RCVAL(XL) SUBTRACT ARG 2 TO COMPARE ! 18481: ROV IDEN1 DIFFER IF OVERFLOW ! 18482: RNE IDEN1 DIFFER IF RESULT IS NOT ZERO ! 18483: EXI 1 TAKE IDENT EXIT ! 18484: .FI ! 18485: * ! 18486: * HERE FOR NAMES, IDENT IF BASES AND OFFSETS SAME ! 18487: * ! 18488: IDEN6 BNE NMOFS(XR),NMOFS(XL),IDEN1 DIFFER IF DIFFERENT OFFSET ! 18489: BNE NMBAS(XR),NMBAS(XL),IDEN1 DIFFER IF DIFFERENT BASE ! 18490: * ! 18491: * MERGE HERE TO SIGNAL IDENT FOR IDENTICAL POINTERS ! 18492: * ! 18493: IDEN7 EXI 1 TAKE IDENT EXIT ! 18494: * ! 18495: * HERE FOR DIFFER STRINGS ! 18496: * ! 18497: IDEN8 ZER XR CLEAR GARBAGE PTR IN XR ! 18498: ZER XL CLEAR GARBAGE PTR IN XL ! 18499: EXI RETURN TO CALLER (DIFFER) ! 18500: ENP END PROCEDURE IDENT ! 18501: EJC ! 18502: * ! 18503: * INOUT - USED TO INITIALISE INPUT AND OUTPUT VARIABLES ! 18504: * ! 18505: * (XL) POINTER TO VBL NAME STRING ! 18506: * (WB) TRBLK TYPE ! 18507: * JSR INOUT CALL TO PERFORM INITIALISATION ! 18508: * (XL) VRBLK PTR ! 18509: * (XR) TRBLK PTR ! 18510: * (WA,WC) DESTROYED ! 18511: * ! 18512: * NOTE THAT TRTER (= TRTRF) FIELD OF STANDARD I/O VARIABLES ! 18513: * POINTS TO CORRESPONDING SVBLK NOT TO A TRBLK AS IS THE ! 18514: * CASE FOR ORDINARY VARIABLES. ! 18515: * ! 18516: INOUT PRC E,0 ENTRY POINT ! 18517: MOV WB,-(XS) STACK TRBLK TYPE ! 18518: MOV SCLEN(XL),WA GET NAME LENGTH ! 18519: ZER WB POINT TO START OF NAME ! 18520: JSR SBSTR BUILD A PROPER SCBLK ! 18521: JSR GTNVR BUILD VRBLK ! 18522: PPM NO ERROR RETURN ! 18523: MOV XR,WC SAVE VRBLK POINTER ! 18524: MOV (XS)+,WB GET TRTER FIELD ! 18525: ZER XL ZERO TRFPT ! 18526: JSR TRBLD BUILD TRBLK ! 18527: MOV WC,XL RECALL VRBLK POINTER ! 18528: MOV VRSVP(XL),TRTER(XR) STORE SVBLK POINTER ! 18529: MOV XR,VRVAL(XL) STORE TRBLK PTR IN VRBLK ! 18530: MOV =B$VRA,VRGET(XL) SET TRAPPED ACCESS ! 18531: MOV =B$VRV,VRSTO(XL) SET TRAPPED STORE ! 18532: EXI RETURN TO CALLER ! 18533: ENP END PROCEDURE INOUT ! 18534: EJC ! 18535: .IF .CNBF ! 18536: .ELSE ! 18537: * ! 18538: * INSBF -- INSERT STRING IN BUFFER ! 18539: * ! 18540: * THIS ROUTINE WILL REPLACE A SECTION OF A BUFFER WITH THE ! 18541: * CONTENTS OF A GIVEN STRING. IF THE LENGTH OF THE ! 18542: * SECTION TO BE REPLACED IS DIFFERENT THAN THE LENGTH OF ! 18543: * THE GIVEN STRING, AND THE REPLACEMENT IS NOT AN APPEND, ! 18544: * THEN THE UPPER SECTION OF THE BUFFER IS SHIFTED UP OR ! 18545: * DOWN TO CREATE THE PROPER SPACE FOR THE INSERT. ! 18546: * ! 18547: * (XR) POINTER TO BFBLK ! 18548: * (XL) OBJECT WHICH IS STRING CONVERTABLE ! 18549: * (WA) OFFSET OF START OF INSERT IN (XR) ! 18550: * (WB) LENGTH OF SECTION IN (XR) REPLACED ! 18551: * JSR INSBF CALL TO INSERT CHARACTERS IN BUFFER ! 18552: * PPM LOC THREAD IF (XR) NOT CONVERTABLE ! 18553: * PPM LOC THREAD IF INSERT NOT POSSIBLE ! 18554: * ! 18555: * THE SECOND ALTERNATE EXIT IS TAKEN IF THE INSERT WOULD ! 18556: * OVERFLOW THE BUFFER, OR IF THE INSERT IS OUT PAST THE ! 18557: * DEFINED END OF THE BUFFER AS GIVEN. ! 18558: * ! 18559: INSBF PRC E,2 ENTRY POINT ! 18560: MOV WA,INSSA SAVE ENTRY WA ! 18561: MOV WB,INSSB SAVE ENTRY WB ! 18562: MOV WC,INSSC SAVE ENTRY WC ! 18563: ADD WB,WA ADD TO GET OFFSET PAST REPLACE PART ! 18564: MOV WA,INSAB SAVE WA+WB ! 18565: MOV BCLEN(XR),WC GET CURRENT DEFINED LENGTH ! 18566: BGT INSSA,WC,INS07 FAIL IF START OFFSET TOO BIG ! 18567: BGT WA,WC,INS07 FAIL IF FINAL OFFSET TOO BIG ! 18568: MOV XL,-(XS) SAVE ENTRY XL ! 18569: MOV XR,-(XS) SAVE BCBLK PTR ! 18570: MOV XL,-(XS) STACK AGAIN FOR GTSTG ! 18571: JSR GTSTG CALL TO CONVERT TO STRING ! 18572: PPM INS05 TAKE STRING CONVERT ERR EXIT ! 18573: MOV XR,XL SAVE STRING PTR ! 18574: MOV (XS),XR RESTORE BCBLK PTR ! 18575: ADD WC,WA ADD BUFFER LEN TO STRING LEN ! 18576: SUB INSSB,WA BIAS OUT COMPONENT BEING REPLACED ! 18577: MOV BCBUF(XR),XR POINT TO BFBLK ! 18578: BGT WA,BFALC(XR),INS06 FAIL IF RESULT EXCEEDS ALLOCATION ! 18579: MOV (XS),XR RESTORE BCBLK PTR ! 18580: MOV WC,WA GET BUFFER LENGTH ! 18581: SUB INSAB,WA SUBTRACT TO GET SHIFT LENGTH ! 18582: ADD SCLEN(XL),WC ADD LENGTH OF NEW ! 18583: SUB INSSB,WC SUBTRACT OLD TO GET TOTAL NEW LEN ! 18584: MOV BCLEN(XR),WB GET OLD BCLEN ! 18585: MOV WC,BCLEN(XR) STUFF NEW LENGTH ! 18586: BZE WA,INS04 SKIP SHIFT IF NOTHING TO DO ! 18587: BEQ INSSB,SCLEN(XL),INS04 SKIP SHIFT IF LENGTHS MATCH ! 18588: MOV BCBUF(XR),XR POINT TO BFBLK ! 18589: MOV XL,-(XS) SAVE SCBLK PTR ! 18590: BLO INSSB,SCLEN(XL),INS01 BRN IF SHFT IS FOR MORE ROOM ! 18591: EJC ! 18592: * ! 18593: * INSBF (CONTINUED) ! 18594: * ! 18595: * WE ARE SHIFTING THE UPPER SEGMENT DOWN TO COMPACT ! 18596: * THE BUFFER. (THE STRING LENGTH IS SMALLER THAN THE ! 18597: * SEGMENT BEING REPLACED.) REGISTERS ARE SET AS: ! 18598: * ! 18599: * (WA) MOVE (SHIFT DOWN) LENGTH ! 18600: * (WB) OLD BCLEN ! 18601: * (WC) NEW BCLEN ! 18602: * (XR) BFBLK PTR ! 18603: * (XL),(XS) SCBLK PTR ! 18604: * ! 18605: MOV INSSA,WB GET OFFSET TO INSERT ! 18606: ADD SCLEN(XL),WB ADD INSERT LENGTH TO GET DEST OFF ! 18607: MOV XR,XL MAKE COPY ! 18608: PLC XL,INSAB PREPARE SOURCE FOR MOVE ! 18609: PSC XR,WB PREPARE DESTINATION REG FOR MOVE ! 18610: MVC MOVE EM OUT ! 18611: BRN INS02 BRANCH TO PAD ! 18612: * ! 18613: * WE ARE SHIFTING THE UPPER SEGMENT UP TO EXPAND ! 18614: * THE BUFFER. (THE STRING LENGTH IS LARGER THAN THE ! 18615: * SEGMENT BEING REPLACED.) ! 18616: * ! 18617: INS01 MOV XR,XL COPY BFBLK PTR ! 18618: PLC XL,WB SET SOURCE REG FOR MOVE BACKWARDS ! 18619: PSC XR,WC SET DESTINATION PTR FOR MOVE ! 18620: MCB MOVE BACKWARDS (POSSIBLE OVERLAP) ! 18621: * ! 18622: * MERGE HERE AFTER MOVE TO ADJUST PADDING AT NEW BUFFER END ! 18623: * ! 18624: INS02 MOV (XS)+,XL RESTORE SCBLK PTR ! 18625: MOV WC,WA COPY NEW BUFFER END ! 18626: CTB WA,0 ROUND OUT ! 18627: SUB WC,WA SUBTRACT TO GET REMAINDER ! 18628: BZE WA,INS04 NO PAD IF ALREADY EVEN BOUNDARY ! 18629: MOV (XS),XR GET BCBLK PTR ! 18630: MOV BCBUF(XR),XR GET BFBLK PTR ! 18631: PSC XR,WC PREPARE TO PAD ! 18632: ZER WB CLEAR WB ! 18633: LCT WA,WA LOAD LOOP COUNT ! 18634: * ! 18635: * LOOP HERE TO STUFF PAD CHARACTERS ! 18636: * ! 18637: INS03 SCH WB,(XR)+ STUFF ZERO PAD ! 18638: BCT WA,INS03 BRANCH FOR MORE ! 18639: EJC ! 18640: * ! 18641: * INSBF (CONTINUED) ! 18642: * ! 18643: * MERGE HERE WHEN PADDING OK. NOW COPY IN THE INSERT ! 18644: * STRING TO THE HOLE. ! 18645: * ! 18646: INS04 MOV (XS),XR GET BCBLK PTR ! 18647: MOV BCBUF(XR),XR GET BFBLK PTR ! 18648: MOV SCLEN(XL),WA GET MOVE LENGTH ! 18649: PLC XL PREPARE TO COPY FROM FIRST CHAR ! 18650: PSC XR,INSSA PREPARE TO STORE IN HOLE ! 18651: MVC COPY THE CHARACTERS ! 18652: MOV (XS)+,XR RESTORE ENTRY XR ! 18653: MOV (XS)+,XL RESTORE ENTRY XL ! 18654: MOV INSSA,WA RESTORE ENTRY WA ! 18655: MOV INSSB,WB RESTORE ENTRY WB ! 18656: MOV INSSC,WC RESTORE ENTRY WC ! 18657: EXI RETURN TO CALLER ! 18658: * ! 18659: * HERE TO TAKE STRING CONVERT ERROR EXIT ! 18660: * ! 18661: INS05 MOV (XS)+,XR RESTORE ENTRY XR ! 18662: MOV (XS)+,XL RESTORE ENTRY XL ! 18663: MOV INSSA,WA RESTORE ENTRY WA ! 18664: MOV INSSB,WB RESTORE ENTRY WB ! 18665: MOV INSSC,WC RESTORE ENTRY WC ! 18666: EXI 1 ALTERNATE EXIT ! 18667: * ! 18668: * HERE FOR INVALID OFFSET OR LENGTH ! 18669: * ! 18670: INS06 MOV (XS)+,XR RESTORE ENTRY XR ! 18671: MOV (XS)+,XL RESTORE ENTRY XL ! 18672: * ! 18673: * MERGE FOR LENGTH FAILURE EXIT WITH STACK SET ! 18674: * ! 18675: INS07 MOV INSSA,WA RESTORE ENTRY WA ! 18676: MOV INSSB,WB RESTORE ENTRY WB ! 18677: MOV INSSC,WC RESTORE ENTRY WC ! 18678: EXI 2 ALTERNATE EXIT ! 18679: ENP END PROCEDURE INSBF ! 18680: EJC ! 18681: .FI ! 18682: * ! 18683: * IOFCB -- GET INPUT/OUTPUT FCBLK POINTER ! 18684: * ! 18685: * USED BY ENDFILE, EJECT AND REWIND TO FIND THE FCBLK ! 18686: * (IF ANY) CORRESPONDING TO THEIR ARGUMENT. ! 18687: * ! 18688: * -(XS) ARGUMENT ! 18689: * JSR IOFCB CALL TO FIND FCBLK ! 18690: * PPM LOC ARG IS AN UNSUITABLE NAME ! 18691: * PPM LOC ARG IS NULL STRING ! 18692: * (XS) POPPED ! 18693: * (XL) PTR TO FILEARG1 VRBLK ! 18694: * (XR) ARGUMENT ! 18695: * (WA) FCBLK PTR OR 0 ! 18696: * (WB) DESTROYED ! 18697: * ! 18698: IOFCB PRC N,2 ENTRY POINT ! 18699: JSR GTSTG GET ARG AS STRING ! 18700: PPM IOFC2 FAIL ! 18701: MOV XR,XL COPY STRING PTR ! 18702: JSR GTNVR GET AS NATURAL VARIABLE ! 18703: PPM IOFC3 FAIL IF NULL ! 18704: MOV XL,WB COPY STRING POINTER AGAIN ! 18705: MOV XR,XL COPY VRBLK PTR FOR RETURN ! 18706: ZER WA IN CASE NO TRBLK FOUND ! 18707: * ! 18708: * LOOP TO FIND FILE ARG1 TRBLK ! 18709: * ! 18710: IOFC1 MOV VRVAL(XR),XR GET POSSIBLE TRBLK PTR ! 18711: BNE (XR),=B$TRT,IOFC2 FAIL IF END OF CHAIN ! 18712: BNE TRTYP(XR),=TRTFC,IOFC1 LOOP IF NOT FILE ARG TRBLK ! 18713: MOV TRFPT(XR),WA GET FCBLK PTR ! 18714: MOV WB,XR COPY ARG ! 18715: EXI RETURN ! 18716: * ! 18717: * FAIL RETURN ! 18718: * ! 18719: IOFC2 EXI 1 FAIL ! 18720: * ! 18721: * NULL ARG ! 18722: * ! 18723: IOFC3 EXI 2 NULL ARG RETURN ! 18724: ENP END PROCEDURE IOFCB ! 18725: EJC ! 18726: * ! 18727: * IOPPF -- PROCESS FILEARG2 FOR IOPUT ! 18728: * ! 18729: * (R$XSC) FILEARG2 PTR ! 18730: * JSR IOPPF CALL TO PROCESS FILEARG2 ! 18731: * (XL) FILEARG1 PTR ! 18732: * (XR) FILE ARG2 PTR ! 18733: * -(XS)..-(XS) FIELDS EXTRACTED FROM FILEARG2 ! 18734: * (WC) NO. OF FIELDS EXTRACTED ! 18735: * (WB) INPUT/OUTPUT FLAG ! 18736: * (WA) FCBLK PTR OR 0 ! 18737: * ! 18738: IOPPF PRC N,0 ENTRY POINT ! 18739: ZER WB TO COUNT FIELDS EXTRACTED ! 18740: * ! 18741: * LOOP TO EXTRACT FIELDS ! 18742: * ! 18743: IOPP1 MOV =IODEL,XL GET DELIMITER ! 18744: MOV XL,WC COPY IT ! 18745: JSR XSCAN GET NEXT FIELD ! 18746: MOV XR,-(XS) STACK IT ! 18747: ICV WB INCREMENT COUNT ! 18748: BNZ WA,IOPP1 LOOP ! 18749: MOV WB,WC COUNT OF FIELDS ! 18750: MOV IOPTT,WB I/O MARKER ! 18751: MOV R$IOF,WA FCBLK PTR OR 0 ! 18752: MOV R$IO2,XR FILE ARG2 PTR ! 18753: MOV R$IO1,XL FILEARG1 ! 18754: EXI RETURN ! 18755: ENP END PROCEDURE IOPPF ! 18756: EJC ! 18757: * ! 18758: * IOPUT -- ROUTINE USED BY INPUT AND OUTPUT ! 18759: * ! 18760: * IOPUT SETS UP INPUT/OUTPUT ASSOCIATIONS. IT BUILDS ! 18761: * SUCH TRACE AND FILE CONTROL BLOCKS AS ARE NECESSARY AND ! 18762: * CALLS SYSFC,SYSIO TO PERFORM CHECKS ON THE ! 18763: * ARGUMENTS AND TO OPEN THE FILES. ! 18764: * ! 18765: * +-----------+ +---------------+ +-----------+ ! 18766: * +-.I I I I------.I =B$XRT I ! 18767: * I +-----------+ +---------------+ +-----------+ ! 18768: * I / / (R$FCB) I *4 I ! 18769: * I / / +-----------+ ! 18770: * I +-----------+ +---------------+ I I- ! 18771: * I I NAME +--.I =B$TRT I +-----------+ ! 18772: * I / / +---------------+ I I ! 18773: * I (FIRST ARG) I =TRTIN/=TRTOU I +-----------+ ! 18774: * I +---------------+ I ! 18775: * I I VALUE I I ! 18776: * I +---------------+ I ! 18777: * I I(TRTRF) 0 OR I--+ I ! 18778: * I +---------------+ I I ! 18779: * I I(TRFPT) 0 OR I----+ I ! 18780: * I +---------------+ I I I ! 18781: * I (I/O TRBLK) I I I ! 18782: * I +-----------+ I I I ! 18783: * I I I I I I ! 18784: * I +-----------+ I I I ! 18785: * I I I I I I ! 18786: * I +-----------+ +---------------+ I I I ! 18787: * I I +--.I =B$TRT I.-+ I I ! 18788: * I +-----------+ +---------------+ I I ! 18789: * I / / I =TRTFC I I I ! 18790: * I / / +---------------+ I I ! 18791: * I (FILEARG1 I VALUE I I I ! 18792: * I VRBLK) +---------------+ I I ! 18793: * I I(TRTRF) 0 OR I--+ I . ! 18794: * I +---------------+ I . +-----------+ ! 18795: * I I(TRFPT) 0 OR I------./ FCBLK / ! 18796: * I +---------------+ I +-----------+ ! 18797: * I (TRTRF) I ! 18798: * I I ! 18799: * I I ! 18800: * I +---------------+ I ! 18801: * I I =B$XRT I.-+ ! 18802: * I +---------------+ ! 18803: * I I *5 I ! 18804: * I +---------------+ ! 18805: * +------------------I I ! 18806: * +---------------+ +-----------+ ! 18807: * I(TRTRF) O OR I------.I =B$XRT I ! 18808: * +---------------+ +-----------+ ! 18809: * I NAME OFFSET I I ETC I ! 18810: * +---------------+ ! 18811: * (IOCHN - CHAIN OF NAME POINTERS) ! 18812: EJC ! 18813: * ! 18814: * IOPUT (CONTINUED) ! 18815: * ! 18816: * NO ADDITIONAL TRAP BLOCKS ARE USED FOR STANDARD INPUT/OUT ! 18817: * FILES. OTHERWISE AN I/O TRAP BLOCK IS ATTACHED TO SECOND ! 18818: * ARG (FILEARG1) VRBLK. SEE DIAGRAM ABOVE FOR DETAILS OF ! 18819: * THE STRUCTURE BUILT. ! 18820: * ! 18821: * -(XS) 1ST ARG (VBL TO BE ASSOCIATED) ! 18822: * -(XS) 2ND ARG (FILE ARG1) ! 18823: * -(XS) 3RD ARG (FILE ARG2) ! 18824: * (WB) 0 FOR INPUT, 3 FOR OUTPUT ASSOC. ! 18825: * JSR IOPUT CALL FOR INPUT/OUTPUT ASSOCIATION ! 18826: * PPM LOC 3RD ARG NOT A STRING ! 18827: * PPM LOC 2ND ARG NOT A SUITABLE NAME ! 18828: * PPM LOC 1ST ARG NOT A SUITABLE NAME ! 18829: * PPM LOC INAPPROPRIATE FILE SPEC FOR I/O ! 18830: * PPM LOC I/O FILE DOES NOT EXIST ! 18831: * PPM LOC I/O FILE CANNOT BE READ/WRITTEN ! 18832: * (XS) POPPED ! 18833: * (XL,XR,WA,WB,WC) DESTROYED ! 18834: * ! 18835: IOPUT PRC N,6 ENTRY POINT ! 18836: ZER R$IOT IN CASE NO TRTRF BLOCK USED ! 18837: ZER R$IOF IN CASE NO FCBLK ALOCATED ! 18838: MOV WB,IOPTT STORE I/O TRACE TYPE ! 18839: JSR XSCNI PREPARE TO SCAN FILEARG2 ! 18840: PPM IOP13 FAIL ! 18841: PPM IOPA0 NULL FILE ARG2 ! 18842: * ! 18843: IOPA0 MOV XR,R$IO2 KEEP FILE ARG2 ! 18844: MOV WA,XL COPY LENGTH ! 18845: JSR GTSTG CONVERT FILEARG1 TO STRING ! 18846: PPM IOP14 FAIL ! 18847: MOV XR,R$IO1 KEEP FILEARG1 PTR ! 18848: JSR GTNVR CONVERT TO NATURAL VARIABLE ! 18849: PPM IOP00 JUMP IF NULL ! 18850: BRN IOP04 JUMP TO PROCESS NON-NULL ARGS ! 18851: * ! 18852: * NULL FILEARG1 ! 18853: * ! 18854: IOP00 BZE XL,IOP01 SKIP IF BOTH ARGS NULL ! 18855: JSR IOPPF PROCESS FILEARG2 ! 18856: JSR SYSFC CALL FOR FILEARG2 CHECK ! 18857: PPM IOP16 FAIL ! 18858: BRN IOP11 COMPLETE FILE ASSOCIATION ! 18859: EJC ! 18860: * ! 18861: * IOPUT (CONTINUED) ! 18862: * ! 18863: * HERE WITH 0 OR FCBLK PTR IN (XL) ! 18864: * ! 18865: IOP01 MOV IOPTT,WB GET TRACE TYPE ! 18866: MOV R$IOT,XR GET 0 OR TRTRF PTR ! 18867: JSR TRBLD BUILD TRBLK ! 18868: MOV XR,WC COPY TRBLK POINTER ! 18869: MOV (XS)+,XR GET VARIABLE FROM STACK ! 18870: JSR GTVAR POINT TO VARIABLE ! 18871: PPM IOP15 FAIL ! 18872: MOV XL,R$ION SAVE NAME POINTER ! 18873: MOV XL,XR COPY NAME POINTER ! 18874: ADD WA,XR POINT TO VARIABLE ! 18875: SUB *VRVAL,XR SUBTRACT OFFSET,MERGE INTO LOOP ! 18876: * ! 18877: * LOOP TO END OF TRBLK CHAIN IF ANY ! 18878: * ! 18879: IOP02 MOV XR,XL COPY BLK PTR ! 18880: MOV VRVAL(XR),XR LOAD PTR TO NEXT TRBLK ! 18881: BNE (XR),=B$TRT,IOP03 JUMP IF NOT TRAPPED ! 18882: BNE TRTYP(XR),IOPTT,IOP02 LOOP IF NOT SAME ASSOCN ! 18883: MOV TRNXT(XR),XR GET VALUE AND DELETE OLD TRBLK ! 18884: * ! 18885: * IOPUT (CONTINUED) ! 18886: * ! 18887: * STORE NEW ASSOCIATION ! 18888: * ! 18889: IOP03 MOV WC,VRVAL(XL) LINK TO THIS TRBLK ! 18890: MOV WC,XL COPY POINTER ! 18891: MOV XR,TRNXT(XL) STORE VALUE IN TRBLK ! 18892: MOV R$ION,XR RESTORE POSSIBLE VRBLK POINTER ! 18893: MOV WA,WB KEEP OFFSET TO NAME ! 18894: JSR SETVR IF VRBLK, SET VRGET,VRSTO ! 18895: MOV R$IOT,XR GET 0 OR TRTRF PTR ! 18896: BNZ XR,IOP19 JUMP IF TRTRF BLOCK EXISTS ! 18897: EXI RETURN TO CALLER ! 18898: * ! 18899: * NON STANDARD FILE ! 18900: * SEE IF AN FCBLK HAS ALREADY BEEN ALLOCATED. ! 18901: * ! 18902: IOP04 ZER WA IN CASE NO FCBLK FOUND ! 18903: EJC ! 18904: * ! 18905: * IOPUT (CONTINUED) ! 18906: * ! 18907: * SEARCH POSSIBLE TRBLK CHAIN TO PICK UP THE FCBLK ! 18908: * ! 18909: IOP05 MOV XR,WB REMEMBER BLK PTR ! 18910: MOV VRVAL(XR),XR CHAIN ALONG ! 18911: BNE (XR),=B$TRT,IOP06 JUMP IF END OF TRBLK CHAIN ! 18912: BNE TRTYP(XR),=TRTFC,IOP05 LOOP IF MORE TO GO ! 18913: MOV XR,R$IOT POINT TO FILE ARG1 TRBLK ! 18914: MOV TRFPT(XR),WA GET FCBLK PTR FROM TRBLK ! 18915: * ! 18916: * WA = 0 OR FCBLK PTR ! 18917: * WB = PTR TO PRECEDING BLK TO WHICH ANY TRTRF BLOCK ! 18918: * FOR FILE ARG1 MUST BE CHAINED. ! 18919: * ! 18920: IOP06 MOV WA,R$IOF KEEP POSSIBLE FCBLK PTR ! 18921: MOV WB,R$IOP KEEP PRECEDING BLK PTR ! 18922: JSR IOPPF PROCESS FILEARG2 ! 18923: JSR SYSFC SEE IF FCBLK REQUIRED ! 18924: PPM IOP16 FAIL ! 18925: BZE WA,IOP12 SKIP IF NO NEW FCBLK WANTED ! 18926: BLT WC,=NUM02,IOP6A JUMP IF FCBLK IN DYNAMIC ! 18927: JSR ALOST GET IT IN STATIC ! 18928: BRN IOP6B SKIP ! 18929: * ! 18930: * OBTAIN FCBLK IN DYNAMIC ! 18931: * ! 18932: IOP6A JSR ALLOC GET SPACE FOR FCBLK ! 18933: * ! 18934: * MERGE ! 18935: * ! 18936: IOP6B MOV XR,XL POINT TO FCBLK ! 18937: MOV WA,WB COPY ITS LENGTH ! 18938: BTW WB GET COUNT AS WORDS (SGD APR80) ! 18939: LCT WB,WB LOOP COUNTER ! 18940: * ! 18941: * CLEAR FCBLK ! 18942: * ! 18943: IOP07 ZER (XR)+ CLEAR A WORD ! 18944: BCT WB,IOP07 LOOP ! 18945: BEQ WC,=NUM02,IOP09 SKIP IF IN STATIC - DONT SET FIELDS ! 18946: MOV =B$XNT,(XL) STORE XNBLK CODE IN CASE ! 18947: MOV WA,1(XL) STORE LENGTH ! 18948: BNZ WC,IOP09 JUMP IF XNBLK WANTED ! 18949: MOV =B$XRT,(XL) XRBLK CODE REQUESTED ! 18950: * ! 18951: EJC ! 18952: * IOPUT (CONTINUED) ! 18953: * ! 18954: * COMPLETE FCBLK INITIALISATION ! 18955: * ! 18956: IOP09 MOV R$IOT,XR GET POSSIBLE TRBLK PTR ! 18957: MOV XL,R$IOF STORE FCBLK PTR ! 18958: BNZ XR,IOP10 JUMP IF TRBLK ALREADY FOUND ! 18959: * ! 18960: * A NEW TRBLK IS NEEDED ! 18961: * ! 18962: MOV =TRTFC,WB TRTYP FOR FCBLK TRAP BLK ! 18963: JSR TRBLD MAKE THE BLOCK ! 18964: MOV XR,R$IOT COPY TRTRF PTR ! 18965: MOV R$IOP,XL POINT TO PRECEDING BLK ! 18966: MOV VRVAL(XL),VRVAL(XR) COPY VALUE FIELD TO TRBLK ! 18967: MOV XR,VRVAL(XL) LINK NEW TRBLK INTO CHAIN ! 18968: MOV XL,XR POINT TO PREDECESSOR BLK ! 18969: JSR SETVR SET TRACE INTERCEPTS ! 18970: MOV VRVAL(XR),XR RECOVER TRBLK PTR ! 18971: * ! 18972: * XR IS PTR TO TRBLK, XL IS FCBLK PTR OR 0 ! 18973: * ! 18974: IOP10 MOV R$IOF,TRFPT(XR) STORE FCBLK PTR ! 18975: * ! 18976: * CALL SYSIO TO COMPLETE FILE ACCESSING ! 18977: * ! 18978: IOP11 MOV R$IOF,WA COPY FCBLK PTR OR 0 ! 18979: MOV IOPTT,WB GET INPUT/OUTPUT FLAG ! 18980: MOV R$IO2,XR GET FILE ARG2 ! 18981: MOV R$IO1,XL GET FILE ARG1 ! 18982: JSR SYSIO ASSOCIATE TO THE FILE ! 18983: PPM IOP17 FAIL ! 18984: PPM IOP18 FAIL ! 18985: BNZ R$IOT,IOP01 NOT STD INPUT IF NON-NULL TRTRF BLK ! 18986: BNZ IOPTT,IOP01 JUMP IF OUTPUT ! 18987: BZE WC,IOP01 NO CHANGE TO STANDARD READ LENGTH ! 18988: MOV WC,CSWIN STORE NEW READ LENGTH FOR STD FILE ! 18989: BRN IOP01 MERGE TO FINISH THE TASK ! 18990: * ! 18991: * SYSFC MAY HAVE RETURNED A POINTER TO A PRIVATE FCBLK ! 18992: * ! 18993: IOP12 BNZ XL,IOP09 JUMP IF PRIVATE FCBLK ! 18994: BRN IOP11 FINISH THE ASSOCIATION ! 18995: * ! 18996: * FAILURE RETURNS ! 18997: * ! 18998: IOP13 EXI 1 3RD ARG NOT A STRING ! 18999: IOP14 EXI 2 2ND ARG UNSUITABLE ! 19000: IOP15 EXI 3 1ST ARG UNSUITABLE ! 19001: IOP16 EXI 4 FILE SPEC WRONG ! 19002: IOP17 EXI 5 I/O FILE DOES NOT EXIST ! 19003: IOP18 EXI 6 I/O FILE CANNOT BE READ/WRITTEN ! 19004: EJC ! 19005: * ! 19006: * IOPUT (CONTINUED) ! 19007: * ! 19008: * ADD TO IOCHN CHAIN OF ASSSOCIATED VARIABLES UNLESS ALREAD ! 19009: * PRESENT. ! 19010: * ! 19011: IOP19 MOV R$ION,WC WC = NAME BASE, WB = NAME OFFSET ! 19012: * ! 19013: * SEARCH LOOP ! 19014: * ! 19015: IOP20 MOV TRTRF(XR),XR NEXT LINK OF CHAIN ! 19016: BZE XR,IOP21 NOT FOUND ! 19017: BNE WC,IONMB(XR),IOP20 NO MATCH ! 19018: BEQ WB,IONMO(XR),IOP22 EXIT IF MATCHED ! 19019: BRN IOP20 LOOP ! 19020: * ! 19021: * NOT FOUND ! 19022: * ! 19023: IOP21 MOV *NUM05,WA SPACE NEEDED ! 19024: JSR ALLOC GET IT ! 19025: MOV =B$XRT,(XR) STORE XRBLK CODE ! 19026: MOV WA,1(XR) STORE LENGTH ! 19027: MOV WC,IONMB(XR) STORE NAME BASE ! 19028: MOV WB,IONMO(XR) STORE NAME OFFSET ! 19029: MOV R$IOT,XL POINT TO TRTRF BLK ! 19030: MOV TRTRF(XL),WA GET PTR FIELD CONTENTS ! 19031: MOV XR,TRTRF(XL) STORE PTR TO NEW BLOCK ! 19032: MOV WA,TRTRF(XR) COMPLETE THE LINKING ! 19033: * ! 19034: * INSERT FCBLK ON FCBLK CHAIN FOR SYSEJ, SYSXI ! 19035: * ! 19036: IOP22 BZE R$IOF,IOP25 SKIP IF NO FCBLK ! 19037: MOV R$FCB,XL PTR TO HEAD OF EXISTING CHAIN ! 19038: * ! 19039: * SEE IF FCBLK ALREADY ON CHAIN ! 19040: * ! 19041: IOP23 BZE XL,IOP24 NOT ON IF END OF CHAIN ! 19042: BEQ 3(XL),R$IOF,IOP25 DONT DUPLICATE IF FIND IT ! 19043: MOV 2(XL),XL GET NEXT LINK ! 19044: BRN IOP23 LOOP ! 19045: * ! 19046: * NOT FOUND SO ADD AN ENTRY FOR THIS FCBLK ! 19047: * ! 19048: IOP24 MOV *NUM04,WA SPACE NEEDED ! 19049: JSR ALLOC GET IT ! 19050: MOV =B$XRT,(XR) STORE BLOCK CODE ! 19051: MOV WA,1(XR) STORE LENGTH ! 19052: MOV R$FCB,2(XR) STORE PREVIOUS LINK IN THIS NODE ! 19053: MOV R$IOF,3(XR) STORE FCBLK PTR ! 19054: MOV XR,R$FCB INSERT NODE INTO FCBLK CHAIN ! 19055: * ! 19056: * RETURN ! 19057: * ! 19058: IOP25 EXI RETURN TO CALLER ! 19059: ENP END PROCEDURE IOPUT ! 19060: EJC ! 19061: * ! 19062: * KTREX -- EXECUTE KEYWORD TRACE ! 19063: * ! 19064: * KTREX IS USED TO EXECUTE A POSSIBLE KEYWORD TRACE. IT ! 19065: * INCLUDES THE TEST ON TRACE AND TESTS FOR TRACE ACTIVE. ! 19066: * ! 19067: * (XL) PTR TO TRBLK (OR 0 IF UNTRACED) ! 19068: * JSR KTREX CALL TO EXECUTE KEYWORD TRACE ! 19069: * (XL,WA,WB,WC) DESTROYED ! 19070: * (RA) DESTROYED ! 19071: * ! 19072: KTREX PRC R,0 ENTRY POINT (RECURSIVE) ! 19073: BZE XL,KTRX3 IMMEDIATE EXIT IF KEYWORD UNTRACED ! 19074: BZE KVTRA,KTRX3 IMMEDIATE EXIT IF TRACE = 0 ! 19075: DCV KVTRA ELSE DECREMENT TRACE ! 19076: MOV XR,-(XS) SAVE XR ! 19077: MOV XL,XR COPY TRBLK POINTER ! 19078: MOV TRKVR(XR),XL LOAD VRBLK POINTER (NMBAS) ! 19079: MOV *VRVAL,WA SET NAME OFFSET ! 19080: BZE TRFNC(XR),KTRX1 JUMP IF PRINT TRACE ! 19081: JSR TRXEQ ELSE EXECUTE FULL TRACE ! 19082: BRN KTRX2 AND JUMP TO EXIT ! 19083: * ! 19084: * HERE FOR PRINT TRACE ! 19085: * ! 19086: KTRX1 MOV XL,-(XS) STACK VRBLK PTR FOR KWNAM ! 19087: MOV WA,-(XS) STACK OFFSET FOR KWNAM ! 19088: JSR PRTSN PRINT STATEMENT NUMBER ! 19089: MOV =CH$AM,WA LOAD AMPERSAND ! 19090: JSR PRTCH PRINT AMPERSAND ! 19091: JSR PRTNM PRINT KEYWORD NAME ! 19092: MOV =TMBEB,XR POINT TO BLANK-EQUAL-BLANK ! 19093: JSR PRTST PRINT BLANK-EQUAL-BLANK ! 19094: JSR KWNAM GET KEYWORD PSEUDO-VARIABLE NAME ! 19095: MOV XR,DNAMP RESET PTR TO DELETE KVBLK ! 19096: JSR ACESS GET KEYWORD VALUE ! 19097: PPM FAILURE IS IMPOSSIBLE ! 19098: JSR PRTVL PRINT KEYWORD VALUE ! 19099: JSR PRTNL TERMINATE PRINT LINE ! 19100: * ! 19101: * HERE TO EXIT AFTER COMPLETING TRACE ! 19102: * ! 19103: KTRX2 MOV (XS)+,XR RESTORE ENTRY XR ! 19104: * ! 19105: * MERGE HERE TO EXIT IF NO TRACE REQUIRED ! 19106: * ! 19107: KTRX3 EXI RETURN TO KTREX CALLER ! 19108: ENP END PROCEDURE KTREX ! 19109: EJC ! 19110: * ! 19111: * KWNAM -- GET PSEUDO-VARIABLE NAME FOR KEYWORD ! 19112: * ! 19113: * 1(XS) NAME BASE FOR VRBLK ! 19114: * 0(XS) OFFSET (SHOULD BE *VRVAL) ! 19115: * JSR KWNAM CALL TO GET PSEUDO-VARIABLE NAME ! 19116: * (XS) POPPED TWICE ! 19117: * (XL,WA) RESULTING PSEUDO-VARIABLE NAME ! 19118: * (XR,WA,WB) DESTROYED ! 19119: * ! 19120: KWNAM PRC N,0 ENTRY POINT ! 19121: ICA XS IGNORE NAME OFFSET ! 19122: MOV (XS)+,XR LOAD NAME BASE ! 19123: BGE XR,STATE,KWNM1 JUMP IF NOT NATURAL VARIABLE NAME ! 19124: BNZ VRLEN(XR),KWNM1 ERROR IF NOT SYSTEM VARIABLE ! 19125: MOV VRSVP(XR),XR ELSE POINT TO SVBLK ! 19126: MOV SVBIT(XR),WA LOAD BIT MASK ! 19127: ANB BTKNM,WA AND WITH KEYWORD BIT ! 19128: ZRB WA,KWNM1 ERROR IF NO KEYWORD ASSOCIATION ! 19129: MOV SVLEN(XR),WA ELSE LOAD NAME LENGTH IN CHARACTERS ! 19130: CTB WA,SVCHS COMPUTE OFFSET TO FIELD WE WANT ! 19131: ADD WA,XR POINT TO SVKNM FIELD ! 19132: MOV (XR),WB LOAD SVKNM VALUE ! 19133: MOV *KVSI$,WA SET SIZE OF KVBLK ! 19134: JSR ALLOC ALLOCATE KVBLK ! 19135: MOV =B$KVT,(XR) STORE TYPE WORD ! 19136: MOV WB,KVNUM(XR) STORE KEYWORD NUMBER ! 19137: MOV =TRBKV,KVVAR(XR) SET DUMMY TRBLK POINTER ! 19138: MOV XR,XL COPY KVBLK POINTER ! 19139: MOV *KVVAR,WA SET PROPER OFFSET ! 19140: EXI RETURN TO KVNAM CALLER ! 19141: * ! 19142: * HERE IF NOT KEYWORD NAME ! 19143: * ! 19144: KWNM1 ERB 251,KEYWORD OPERAND IS NOT NAME OF DEFINED KEYWORD ! 19145: ENP END PROCEDURE KWNAM ! 19146: EJC ! 19147: * ! 19148: * LCOMP-- COMPARE TWO STRINGS LEXICALLY ! 19149: * ! 19150: * 1(XS) FIRST ARGUMENT ! 19151: * 0(XS) SECOND ARGUMENT ! 19152: * JSR LCOMP CALL TO COMPARE ARUMENTS ! 19153: * PPM LOC TRANSFER LOC FOR ARG1 NOT STRING ! 19154: * PPM LOC TRANSFER LOC FOR ARG2 NOT STRING ! 19155: * PPM LOC TRANSFER LOC IF ARG1 LLT ARG2 ! 19156: * PPM LOC TRANSFER LOC IF ARG1 LEQ ARG2 ! 19157: * PPM LOC TRANSFER LOC IF ARG1 LGT ARG2 ! 19158: * (THE NORMAL RETURN IS NEVER TAKEN) ! 19159: * (XS) POPPED TWICE ! 19160: * (XR,XL) DESTROYED ! 19161: * (WA,WB,WC,RA) DESTROYED ! 19162: * ! 19163: LCOMP PRC N,5 ENTRY POINT ! 19164: JSR GTSTG CONVERT SECOND ARG TO STRING ! 19165: PPM LCMP6 JUMP IF SECOND ARG NOT STRING ! 19166: MOV XR,XL ELSE SAVE POINTER ! 19167: MOV WA,WB AND LENGTH ! 19168: JSR GTSTG CONVERT FIRST ARGUMENT TO STRING ! 19169: PPM LCMP5 JUMP IF NOT STRING ! 19170: MOV WA,WC SAVE ARG 1 LENGTH ! 19171: PLC XR POINT TO CHARS OF ARG 1 ! 19172: PLC XL POINT TO CHARS OF ARG 2 ! 19173: BLO WA,WB,LCMP1 JUMP IF ARG 1 LENGTH IS SMALLER ! 19174: MOV WB,WA ELSE SET ARG 2 LENGTH AS SMALLER ! 19175: * ! 19176: * HERE WITH SMALLER LENGTH IN (WA) ! 19177: * ! 19178: LCMP1 CMC LCMP4,LCMP3 COMPARE STRINGS, JUMP IF UNEQUAL ! 19179: BNE WB,WC,LCMP2 IF EQUAL, JUMP IF LENGTHS UNEQUAL ! 19180: EXI 4 ELSE IDENTICAL STRINGS, LEQ EXIT ! 19181: EJC ! 19182: * ! 19183: * LCOMP (CONTINUED) ! 19184: * ! 19185: * HERE IF INITIAL STRINGS IDENTICAL, BUT LENGTHS UNEQUAL ! 19186: * ! 19187: LCMP2 BHI WC,WB,LCMP4 JUMP IF ARG 1 LENGTH GT ARG 2 LENG ! 19188: * ! 19189: * HERE IF FIRST ARG LLT SECOND ARG ! 19190: * ! 19191: LCMP3 EXI 3 TAKE LLT EXIT ! 19192: * ! 19193: * HERE IF FIRST ARG LGT SECOND ARG ! 19194: * ! 19195: LCMP4 EXI 5 TAKE LGT EXIT ! 19196: * ! 19197: * HERE IF FIRST ARG IS NOT A STRING ! 19198: * ! 19199: LCMP5 EXI 1 TAKE BAD FIRST ARG EXIT ! 19200: * ! 19201: * HERE FOR SECOND ARG NOT A STRING ! 19202: * ! 19203: LCMP6 EXI 2 TAKE BAD SECOND ARG ERROR EXIT ! 19204: ENP END PROCEDURE LCOMP ! 19205: EJC ! 19206: * ! 19207: * LISTR -- LIST SOURCE LINE ! 19208: * ! 19209: * LISTR IS USED TO LIST A SOURCE LINE DURING THE INITIAL ! 19210: * COMPILATION. IT IS CALLED FROM SCANE AND SCANL. ! 19211: * ! 19212: * JSR LISTR CALL TO LIST LINE ! 19213: * (XR,XL,WA,WB,WC) DESTROYED ! 19214: * ! 19215: * GLOBAL LOCATIONS USED BY LISTR ! 19216: * ! 19217: * ERLST IF LISTING ON ACCOUNT OF AN ERROR ! 19218: * ! 19219: * LSTLC COUNT LINES ON CURRENT PAGE ! 19220: * ! 19221: * LSTNP MAX NUMBER OF LINES/PAGE ! 19222: * ! 19223: * LSTPF SET NON-ZERO IF THE CURRENT SOURCE ! 19224: * LINE HAS BEEN LISTED, ELSE ZERO. ! 19225: * ! 19226: * LSTPG COMPILER LISTING PAGE NUMBER ! 19227: * ! 19228: * LSTSN SET IF STMNT NUM TO BE LISTED ! 19229: * ! 19230: * R$CIM POINTER TO CURRENT INPUT LINE. ! 19231: * ! 19232: * R$TTL TITLE FOR SOURCE LISTING ! 19233: * ! 19234: * R$STL PTR TO SUB-TITLE STRING ! 19235: * ! 19236: * ENTRY POINT ! 19237: * ! 19238: LISTR PRC E,0 ENTRY POINT ! 19239: BNZ CNTTL,LIST5 JUMP IF -TITLE OR -STITL ! 19240: BNZ LSTPF,LIST4 IMMEDIATE EXIT IF ALREADY LISTED ! 19241: BGE LSTLC,LSTNP,LIST6 JUMP IF NO ROOM ! 19242: * ! 19243: * HERE AFTER PRINTING TITLE (IF NEEDED) ! 19244: * ! 19245: LIST0 MOV R$CIM,XR LOAD POINTER TO CURRENT IMAGE ! 19246: PLC XR POINT TO CHARACTERS ! 19247: LCH WA,(XR) LOAD FIRST CHARACTER ! 19248: MOV LSTSN,XR LOAD STATEMENT NUMBER ! 19249: BZE XR,LIST2 JUMP IF NO STATEMENT NUMBER ! 19250: MTI XR ELSE GET STMNT NUMBER AS INTEGER ! 19251: BNE STAGE,=STGIC,LIST1 SKIP IF EXECUTE TIME ! 19252: BEQ WA,=CH$AS,LIST2 NO STMNT NUMBER LIST IF COMMENT ! 19253: BEQ WA,=CH$MN,LIST2 NO STMNT NO. IF CONTROL CARD ! 19254: * ! 19255: * PRINT STATEMENT NUMBER ! 19256: * ! 19257: LIST1 JSR PRTIN ELSE PRINT STATEMENT NUMBER ! 19258: ZER LSTSN AND CLEAR FOR NEXT TIME IN ! 19259: EJC ! 19260: * ! 19261: * LISTR (CONTINUED) ! 19262: * ! 19263: * MERGE HERE AFTER PRINTING STATEMENT NUMBER (IF REQUIRED) ! 19264: * ! 19265: LIST2 MOV =STNPD,PROFS POINT PAST STATEMENT NUMBER ! 19266: MOV R$CIM,XR LOAD POINTER TO CURRENT IMAGE ! 19267: JSR PRTST PRINT IT ! 19268: ICV LSTLC BUMP LINE COUNTER ! 19269: BNZ ERLST,LIST3 JUMP IF ERROR COPY TO INT.CH. ! 19270: JSR PRTNL TERMINATE LINE ! 19271: BZE CSWDB,LIST3 JUMP IF -SINGLE MODE ! 19272: JSR PRTNL ELSE ADD A BLANK LINE ! 19273: ICV LSTLC AND BUMP LINE COUNTER ! 19274: * ! 19275: * HERE AFTER PRINTING SOURCE IMAGE ! 19276: * ! 19277: LIST3 MNZ LSTPF SET FLAG FOR LINE PRINTED ! 19278: * ! 19279: * MERGE HERE TO EXIT ! 19280: * ! 19281: LIST4 EXI RETURN TO LISTR CALLER ! 19282: * ! 19283: * PRINT TITLE AFTER -TITLE OR -STITL CARD ! 19284: * ! 19285: LIST5 ZER CNTTL CLEAR FLAG ! 19286: * ! 19287: * EJECT TO NEW PAGE AND LIST TITLE ! 19288: * ! 19289: LIST6 JSR PRTPS EJECT ! 19290: BZE PRICH,LIST7 SKIP IF LISTING TO REGULAR PRINTER ! 19291: BEQ R$TTL,=NULLS,LIST0 TERMINAL LISTING OMITS NULL TITLE ! 19292: * ! 19293: * LIST TITLE ! 19294: * ! 19295: LIST7 JSR LISTT LIST TITLE ! 19296: BRN LIST0 MERGE ! 19297: ENP END PROCEDURE LISTR ! 19298: EJC ! 19299: * ! 19300: * LISTT -- LIST TITLE AND SUBTITLE ! 19301: * ! 19302: * USED DURING COMPILATION TO PRINT PAGE HEADING ! 19303: * ! 19304: * JSR LISTT CALL TO LIST TITLE ! 19305: * (XR,WA) DESTROYED ! 19306: * ! 19307: LISTT PRC E,0 ENTRY POINT ! 19308: MOV R$TTL,XR POINT TO SOURCE LISTING TITLE ! 19309: JSR PRTST PRINT TITLE ! 19310: MOV LSTPO,PROFS SET OFFSET ! 19311: MOV =LSTMS,XR SET PAGE MESSAGE ! 19312: JSR PRTST PRINT PAGE MESSAGE ! 19313: ICV LSTPG BUMP PAGE NUMBER ! 19314: MTI LSTPG LOAD PAGE NUMBER AS INTEGER ! 19315: JSR PRTIN PRINT PAGE NUMBER ! 19316: JSR PRTNL TERMINATE TITLE LINE ! 19317: ADD =NUM02,LSTLC COUNT TITLE LINE AND BLANK LINE ! 19318: * ! 19319: * PRINT SUB-TITLE (IF ANY) ! 19320: * ! 19321: MOV R$STL,XR LOAD POINTER TO SUB-TITLE ! 19322: BZE XR,LSTT1 JUMP IF NO SUB-TITLE ! 19323: JSR PRTST ELSE PRINT SUB-TITLE ! 19324: JSR PRTNL TERMINATE LINE ! 19325: ICV LSTLC BUMP LINE COUNT ! 19326: * ! 19327: * RETURN POINT ! 19328: * ! 19329: LSTT1 JSR PRTNL PRINT A BLANK LINE ! 19330: EXI RETURN TO CALLER ! 19331: ENP END PROCEDURE LISTT ! 19332: EJC ! 19333: * ! 19334: * NEXTS -- ACQUIRE NEXT SOURCE IMAGE ! 19335: * ! 19336: * NEXTS IS USED TO ACQUIRE THE NEXT SOURCE IMAGE AT COMPILE ! 19337: * TIME. IT ASSUMES THAT A PRIOR CALL TO READR HAS INPUT ! 19338: * A LINE IMAGE (SEE PROCEDURE READR). BEFORE THE CURRENT ! 19339: * IMAGE IS FINALLY LOST IT MAY BE LISTED HERE. ! 19340: * ! 19341: * JSR NEXTS CALL TO ACQUIRE NEXT INPUT LINE ! 19342: * (XR,XL,WA,WB,WC) DESTROYED ! 19343: * ! 19344: * GLOBAL VALUES AFFECTED ! 19345: * ! 19346: * R$CNI ON INPUT, NEXT IMAGE. ON ! 19347: * EXIT RESET TO ZERO ! 19348: * ! 19349: * R$CIM ON EXIT, SET TO POINT TO IMAGE ! 19350: * ! 19351: * SCNIL INPUT IMAGE LENGTH ON EXIT ! 19352: * ! 19353: * SCNSE RESET TO ZERO ON EXIT ! 19354: * ! 19355: * LSTPF SET ON EXIT IF LINE IS LISTED ! 19356: * ! 19357: NEXTS PRC E,0 ENTRY POINT ! 19358: BZE CSWLS,NXTS2 JUMP IF -NOLIST ! 19359: MOV R$CIM,XR POINT TO IMAGE ! 19360: BZE XR,NXTS2 JUMP IF NO IMAGE ! 19361: PLC XR GET CHAR PTR ! 19362: LCH WA,(XR) GET FIRST CHAR ! 19363: BNE WA,=CH$MN,NXTS1 JUMP IF NOT CTRL CARD ! 19364: BZE CSWPR,NXTS2 JUMP IF -NOPRINT ! 19365: * ! 19366: * HERE TO CALL LISTER ! 19367: * ! 19368: NXTS1 JSR LISTR LIST LINE ! 19369: * ! 19370: * HERE AFTER POSSIBLE LISTING ! 19371: * ! 19372: NXTS2 MOV R$CNI,XR POINT TO NEXT IMAGE ! 19373: MOV XR,R$CIM SET AS NEXT IMAGE ! 19374: ZER R$CNI CLEAR NEXT IMAGE POINTER ! 19375: MOV SCLEN(XR),WA GET INPUT IMAGE LENGTH ! 19376: MOV CSWIN,WB GET MAX ALLOWABLE LENGTH ! 19377: BLO WA,WB,NXTS3 SKIP IF NOT TOO LONG ! 19378: MOV WB,WA ELSE TRUNCATE ! 19379: * ! 19380: * HERE WITH LENGTH IN (WA) ! 19381: * ! 19382: NXTS3 MOV WA,SCNIL USE AS RECORD LENGTH ! 19383: ZER SCNSE RESET SCNSE ! 19384: ZER LSTPF SET LINE NOT LISTED YET ! 19385: EXI RETURN TO NEXTS CALLER ! 19386: ENP END PROCEDURE NEXTS ! 19387: EJC ! 19388: * ! 19389: * PATIN -- PATTERN CONSTRUCTION FOR LEN,POS,RPOS,TAB,RTAB ! 19390: * ! 19391: * THESE PATTERN TYPES ALL GENERATE A SIMILAR NODE TYPE. SO ! 19392: * THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION ! 19393: * FOR ACTUAL ENTRY POINTS FOR THESE FIVE FUNCTIONS. ! 19394: * ! 19395: * (WA) PCODE FOR EXPRESSION ARG CASE ! 19396: * (WB) PCODE FOR INTEGER ARG CASE ! 19397: * JSR PATIN CALL TO BUILD PATTERN NODE ! 19398: * PPM LOC TRANSFER LOC FOR NOT INTEGER OR EXP ! 19399: * PPM LOC TRANSFER LOC FOR INT OUT OF RANGE ! 19400: * (XR) POINTER TO CONSTRUCTED NODE ! 19401: * (XL,WA,WB,WC,IA) DESTROYED ! 19402: * ! 19403: PATIN PRC N,2 ENTRY POINT ! 19404: MOV WA,XL PRESERVE EXPRESSION ARG PCODE ! 19405: JSR GTSMI TRY TO CONVERT ARG AS SMALL INTEGER ! 19406: PPM PTIN2 JUMP IF NOT INTEGER ! 19407: PPM PTIN3 JUMP IF OUT OF RANGE ! 19408: * ! 19409: * COMMON SUCCESSFUL EXIT POINT ! 19410: * ! 19411: PTIN1 JSR PBILD BUILD PATTERN NODE ! 19412: EXI RETURN TO CALLER ! 19413: * ! 19414: * HERE IF ARGUMENT IS NOT AN INTEGER ! 19415: * ! 19416: PTIN2 MOV XL,WB COPY EXPR ARG CASE PCODE ! 19417: BLO (XR),=B$E$$,PTIN1 ALL OK IF EXPRESSION ARG ! 19418: EXI 1 ELSE TAKE ERROR EXIT FOR WRONG TYPE ! 19419: * ! 19420: * HERE FOR ERROR OF OUT OF RANGE INTEGER ARGUMENT ! 19421: * ! 19422: PTIN3 EXI 2 TAKE OUT-OF-RANGE ERROR EXIT ! 19423: ENP END PROCEDURE PATIN ! 19424: EJC ! 19425: * ! 19426: * PATST -- PATTERN CONSTRUCTION FOR ANY,NOTANY, ! 19427: * BREAK,SPAN AND BREAKX PATTERN FUNCTIONS. ! 19428: * ! 19429: * THESE PATTERN FUNCTIONS BUILD SIMILAR TYPES OF NODES AND ! 19430: * THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION ! 19431: * FOR ACTUAL ENTRY POINTS FOR THESE FIVE PATTERN FUNCTIONS. ! 19432: * ! 19433: * 0(XS) STRING ARGUMENT ! 19434: * (WB) PCODE FOR ONE CHAR ARGUMENT ! 19435: * (XL) PCODE FOR MULTI-CHAR ARGUMENT ! 19436: * (WC) PCODE FOR EXPRESSION ARGUMENT ! 19437: * JSR PATST CALL TO BUILD NODE ! 19438: * PPM LOC TRANSFER LOC IF NOT STRING OR EXPR ! 19439: * (XS) POPPED PAST STRING ARGUMENT ! 19440: * (XR) POINTER TO CONSTRUCTED NODE ! 19441: * (XL) DESTROYED ! 19442: * (WA,WB,WC,RA) DESTROYED ! 19443: * ! 19444: * NOTE THAT THERE IS A SPECIAL CALL TO PATST IN THE EVALS ! 19445: * PROCEDURE WITH A SLIGHTLY DIFFERENT FORM. SEE EVALS ! 19446: * FOR DETAILS OF THE FORM OF THIS CALL. ! 19447: * ! 19448: PATST PRC N,1 ENTRY POINT ! 19449: JSR GTSTG CONVERT ARGUMENT AS STRING ! 19450: PPM PATS7 JUMP IF NOT STRING ! 19451: BNE WA,=NUM01,PATS2 JUMP IF NOT ONE CHAR STRING ! 19452: * ! 19453: * HERE FOR ONE CHAR STRING CASE ! 19454: * ! 19455: BZE WB,PATS2 TREAT AS MULTI-CHAR IF EVALS CALL ! 19456: PLC XR POINT TO CHARACTER ! 19457: LCH XR,(XR) LOAD CHARACTER ! 19458: * ! 19459: * COMMON EXIT POINT AFTER SUCCESSFUL CONSTRUCTION ! 19460: * ! 19461: PATS1 JSR PBILD CALL ROUTINE TO BUILD NODE ! 19462: EXI RETURN TO PATST CALLER ! 19463: EJC ! 19464: * ! 19465: * PATST (CONTINUED) ! 19466: * ! 19467: * HERE FOR MULTI-CHARACTER STRING CASE ! 19468: * ! 19469: PATS2 MOV XL,-(XS) SAVE MULTI-CHAR PCODE ! 19470: MOV XR,-(XS) SAVE STRING POINTER ! 19471: MOV CTMSK,WC LOAD CURRENT MASK BIT ! 19472: LSH WC,1 SHIFT TO NEXT POSITION ! 19473: NZB WC,PATS4 SKIP IF POSITION LEFT IN THIS TBL ! 19474: * ! 19475: * HERE WE MUST ALLOCATE A NEW CHARACTER TABLE ! 19476: * ! 19477: MOV *CTSI$,WA SET SIZE OF CTBLK ! 19478: JSR ALLOC ALLOCATE CTBLK ! 19479: MOV XR,R$CTP STORE PTR TO NEW CTBLK ! 19480: MOV =B$CTT,(XR)+ STORE TYPE CODE, BUMP PTR ! 19481: LCT WB,=CFP$A SET NUMBER OF WORDS TO CLEAR ! 19482: MOV BITS0,WC LOAD ALL ZERO BITS ! 19483: * ! 19484: * LOOP TO CLEAR ALL BITS IN TABLE TO ZEROS ! 19485: * ! 19486: PATS3 MOV WC,(XR)+ MOVE WORD OF ZERO BITS ! 19487: BCT WB,PATS3 LOOP TILL ALL CLEARED ! 19488: MOV BITS1,WC SET INITIAL BIT POSITION ! 19489: * ! 19490: * MERGE HERE WITH BIT POSITION AVAILABLE ! 19491: * ! 19492: PATS4 MOV WC,CTMSK SAVE PARM2 (NEW BIT POSITION) ! 19493: MOV (XS)+,XL RESTORE POINTER TO ARGUMENT STRING ! 19494: MOV SCLEN(XL),WB LOAD STRING LENGTH ! 19495: BZE WB,PATS6 JUMP IF NULL STRING CASE ! 19496: LCT WB,WB ELSE SET LOOP COUNTER ! 19497: PLC XL POINT TO CHARACTERS IN ARGUMENT ! 19498: EJC ! 19499: * ! 19500: * PATST (CONTINUED) ! 19501: * ! 19502: * LOOP TO SET BITS IN COLUMN OF TABLE ! 19503: * ! 19504: PATS5 LCH WA,(XL)+ LOAD NEXT CHARACTER ! 19505: WTB WA CONVERT TO BYTE OFFSET ! 19506: MOV R$CTP,XR POINT TO CTBLK ! 19507: ADD WA,XR POINT TO CTBLK ENTRY ! 19508: MOV WC,WA COPY BIT MASK ! 19509: ORB CTCHS(XR),WA OR IN BITS ALREADY SET ! 19510: MOV WA,CTCHS(XR) STORE RESULTING BIT STRING ! 19511: BCT WB,PATS5 LOOP TILL ALL BITS SET ! 19512: * ! 19513: * COMPLETE PROCESSING FOR MUTI-CHAR STRING CASE ! 19514: * ! 19515: PATS6 MOV R$CTP,XR LOAD CTBLK PTR AS PARM1 FOR PBILD ! 19516: ZER XL CLEAR GARBAGE PTR IN XL ! 19517: MOV (XS)+,WB LOAD PCODE FOR MULTI-CHAR STR CASE ! 19518: BRN PATS1 BACK TO EXIT (WC=BITSTRING=PARM2) ! 19519: * ! 19520: * HERE IF ARGUMENT IS NOT A STRING ! 19521: * ! 19522: * NOTE THAT THE CALL FROM EVALS CANNOT PASS AN EXPRESSION ! 19523: * SINCE EVALP ALWAYS REEVALUATES EXPRESSIONS. ! 19524: * ! 19525: PATS7 MOV WC,WB SET PCODE FOR EXPRESSION ARGUMENT ! 19526: BLO (XR),=B$E$$,PATS1 JUMP TO EXIT IF EXPRESSION ARG ! 19527: EXI 1 ELSE TAKE WRONG TYPE ERROR EXIT ! 19528: ENP END PROCEDURE PATST ! 19529: EJC ! 19530: * ! 19531: * PBILD -- BUILD PATTERN NODE ! 19532: * ! 19533: * (XR) PARM1 (ONLY IF REQUIRED) ! 19534: * (WB) PCODE FOR NODE ! 19535: * (WC) PARM2 (ONLY IF REQUIRED) ! 19536: * JSR PBILD CALL TO BUILD NODE ! 19537: * (XR) POINTER TO CONSTRUCTED NODE ! 19538: * (WA) DESTROYED ! 19539: * ! 19540: PBILD PRC E,0 ENTRY POINT ! 19541: MOV XR,-(XS) STACK POSSIBLE PARM1 ! 19542: MOV WB,XR COPY PCODE ! 19543: LEI XR LOAD ENTRY POINT ID (BL$PX) ! 19544: BEQ XR,=BL$P1,PBLD1 JUMP IF ONE PARAMETER ! 19545: BEQ XR,=BL$P0,PBLD3 JUMP IF NO PARAMETERS ! 19546: * ! 19547: * HERE FOR TWO PARAMETER CASE ! 19548: * ! 19549: MOV *PCSI$,WA SET SIZE OF P2BLK ! 19550: JSR ALLOC ALLOCATE BLOCK ! 19551: MOV WC,PARM2(XR) STORE SECOND PARAMETER ! 19552: BRN PBLD2 MERGE WITH ONE PARM CASE ! 19553: * ! 19554: * HERE FOR ONE PARAMETER CASE ! 19555: * ! 19556: PBLD1 MOV *PBSI$,WA SET SIZE OF P1BLK ! 19557: JSR ALLOC ALLOCATE NODE ! 19558: * ! 19559: * MERGE HERE FROM TWO PARM CASE ! 19560: * ! 19561: PBLD2 MOV (XS),PARM1(XR) STORE FIRST PARAMETER ! 19562: BRN PBLD4 MERGE WITH NO PARAMETER CASE ! 19563: * ! 19564: * HERE FOR CASE OF NO PARAMETERS ! 19565: * ! 19566: PBLD3 MOV *PASI$,WA SET SIZE OF P0BLK ! 19567: JSR ALLOC ALLOCATE NODE ! 19568: * ! 19569: * MERGE HERE FROM OTHER CASES ! 19570: * ! 19571: PBLD4 MOV WB,(XR) STORE PCODE ! 19572: ICA XS POP FIRST PARAMETER ! 19573: MOV =NDNTH,PTHEN(XR) SET NOTHEN SUCCESSOR POINTER ! 19574: EXI RETURN TO PBILD CALLER ! 19575: ENP END PROCEDURE PBILD ! 19576: EJC ! 19577: * ! 19578: * PCONC -- CONCATENATE TWO PATTERNS ! 19579: * ! 19580: * (XL) PTR TO RIGHT PATTERN ! 19581: * (XR) PTR TO LEFT PATTERN ! 19582: * JSR PCONC CALL TO CONCATENATE PATTERNS ! 19583: * (XR) PTR TO CONCATENATED PATTERN ! 19584: * (XL,WA,WB,WC) DESTROYED ! 19585: * ! 19586: * ! 19587: * TO CONCATENATE TWO PATTERNS, ALL SUCCESSORS IN THE LEFT ! 19588: * PATTERN WHICH POINT TO THE NOTHEN NODE MUST BE CHANGED TO ! 19589: * POINT TO THE RIGHT PATTERN. HOWEVER, THIS MODIFICATION ! 19590: * MUST BE PERFORMED ON A COPY OF THE LEFT ARGUMENT RATHER ! 19591: * THAN THE LEFT ARGUMENT ITSELF, SINCE THE LEFT ARGUMENT ! 19592: * MAY BE POINTED TO BY SOME OTHER VARIABLE VALUE. ! 19593: * ! 19594: * ACCORDINGLY, IT IS NECESSARY TO COPY THE LEFT ARGUMENT. ! 19595: * THIS IS NOT A TRIVIAL PROCESS SINCE WE MUST AVOID COPYING ! 19596: * NODES MORE THAN ONCE AND THE PATTERN IS A GRAPH STRUCTURE ! 19597: * THE FOLLOWING ALGORITHM IS EMPLOYED. ! 19598: * ! 19599: * THE STACK IS USED TO STORE A LIST OF NODES WHICH ! 19600: * HAVE ALREADY BEEN COPIED. THE FORMAT OF THE ENTRIES ON ! 19601: * THIS LIST CONSISTS OF A TWO WORD BLOCK. THE FIRST WORD ! 19602: * IS THE OLD ADDRESS AND THE SECOND WORD IS THE ADDRESS ! 19603: * OF THE COPY. THIS LIST IS SEARCHED BY THE PCOPY ! 19604: * ROUTINE TO AVOID MAKING DUPLICATE COPIES. A TRICK IS ! 19605: * USED TO ACCOMPLISH THE CONCATENATION AT THE SAME TIME. ! 19606: * A SPECIAL ENTRY IS MADE TO START WITH ON THE STACK. THIS ! 19607: * ENTRY RECORDS THAT THE NOTHEN NODE HAS BEEN COPIED ! 19608: * ALREADY AND THE ADDRESS OF ITS COPY IS THE RIGHT PATTERN. ! 19609: * THIS AUTOMATICALLY PERFORMS THE CORRECT REPLACEMENTS. ! 19610: * ! 19611: PCONC PRC E,0 ENTRY POINT ! 19612: ZER -(XS) MAKE ROOM FOR ONE ENTRY AT BOTTOM ! 19613: MOV XS,WC STORE POINTER TO START OF LIST ! 19614: MOV =NDNTH,-(XS) STACK NOTHEN NODE AS OLD NODE ! 19615: MOV XL,-(XS) STORE RIGHT ARG AS COPY OF NOTHEN ! 19616: MOV XS,XT INITIALIZE POINTER TO STACK ENTRIES ! 19617: JSR PCOPY COPY FIRST NODE OF LEFT ARG ! 19618: MOV WA,2(XT) STORE AS RESULT UNDER LIST ! 19619: EJC ! 19620: * ! 19621: * PCONC (CONTINUED) ! 19622: * ! 19623: * THE FOLLOWING LOOP SCANS ENTRIES IN THE LIST AND MAKES ! 19624: * SURE THAT THEIR SUCCESSORS HAVE BEEN COPIED. ! 19625: * ! 19626: PCNC1 BEQ XT,XS,PCNC2 JUMP IF ALL ENTRIES PROCESSED ! 19627: MOV -(XT),XR ELSE LOAD NEXT OLD ADDRESS ! 19628: MOV PTHEN(XR),XR LOAD POINTER TO SUCCESSOR ! 19629: JSR PCOPY COPY SUCCESSOR NODE ! 19630: MOV -(XT),XR LOAD POINTER TO NEW NODE (COPY) ! 19631: MOV WA,PTHEN(XR) STORE PTR TO NEW SUCCESSOR ! 19632: * ! 19633: * NOW CHECK FOR SPECIAL CASE OF ALTERNATION NODE WHERE ! 19634: * PARM1 POINTS TO A NODE AND MUST BE COPIED LIKE PTHEN. ! 19635: * ! 19636: BNE (XR),=P$ALT,PCNC1 LOOP BACK IF NOT ! 19637: MOV PARM1(XR),XR ELSE LOAD POINTER TO ALTERNATIVE ! 19638: JSR PCOPY COPY IT ! 19639: MOV (XT),XR RESTORE PTR TO NEW NODE ! 19640: MOV WA,PARM1(XR) STORE PTR TO COPIED ALTERNATIVE ! 19641: BRN PCNC1 LOOP BACK FOR NEXT ENTRY ! 19642: * ! 19643: * HERE AT END OF COPY PROCESS ! 19644: * ! 19645: PCNC2 MOV WC,XS RESTORE STACK POINTER ! 19646: MOV (XS)+,XR LOAD POINTER TO COPY ! 19647: EXI RETURN TO PCONC CALLER ! 19648: ENP END PROCEDURE PCONC ! 19649: EJC ! 19650: * ! 19651: * PCOPY -- COPY A PATTERN NODE ! 19652: * ! 19653: * PCOPY IS CALLED FROM THE PCONC PROCEDURE TO COPY A SINGLE ! 19654: * PATTERN NODE. THE COPY IS ONLY CARRIED OUT IF THE NODE ! 19655: * HAS NOT BEEN COPIED ALREADY. ! 19656: * ! 19657: * (XR) POINTER TO NODE TO BE COPIED ! 19658: * (XT) PTR TO CURRENT LOC IN COPY LIST ! 19659: * (WC) POINTER TO LIST OF COPIED NODES ! 19660: * JSR PCOPY CALL TO COPY A NODE ! 19661: * (WA) POINTER TO COPY ! 19662: * (WB,XR) DESTROYED ! 19663: * ! 19664: PCOPY PRC N,0 ENTRY POINT ! 19665: MOV XT,WB SAVE XT ! 19666: MOV WC,XT POINT TO START OF LIST ! 19667: * ! 19668: * LOOP TO SEARCH LIST OF NODES COPIED ALREADY ! 19669: * ! 19670: PCOP1 DCA XT POINT TO NEXT ENTRY ON LIST ! 19671: BEQ XR,(XT),PCOP2 JUMP IF MATCH ! 19672: DCA XT ELSE SKIP OVER COPIED ADDRESS ! 19673: BNE XT,XS,PCOP1 LOOP BACK IF MORE TO TEST ! 19674: * ! 19675: * HERE IF NOT IN LIST, PERFORM COPY ! 19676: * ! 19677: MOV (XR),WA LOAD FIRST WORD OF BLOCK ! 19678: JSR BLKLN GET LENGTH OF BLOCK ! 19679: MOV XR,XL SAVE POINTER TO OLD NODE ! 19680: JSR ALLOC ALLOCATE SPACE FOR COPY ! 19681: MOV XL,-(XS) STORE OLD ADDRESS ON LIST ! 19682: MOV XR,-(XS) STORE NEW ADDRESS ON LIST ! 19683: CHK CHECK FOR STACK OVERFLOW ! 19684: MVW MOVE WORDS FROM OLD BLOCK TO COPY ! 19685: MOV (XS),WA LOAD POINTER TO COPY ! 19686: BRN PCOP3 JUMP TO EXIT ! 19687: * ! 19688: * HERE IF WE FIND ENTRY IN LIST ! 19689: * ! 19690: PCOP2 MOV -(XT),WA LOAD ADDRESS OF COPY FROM LIST ! 19691: * ! 19692: * COMMON EXIT POINT ! 19693: * ! 19694: PCOP3 MOV WB,XT RESTORE XT ! 19695: EXI RETURN TO PCOPY CALLER ! 19696: ENP END PROCEDURE PCOPY ! 19697: EJC ! 19698: .IF .CNPF ! 19699: .ELSE ! 19700: * ! 19701: * PRFLR -- PRINT PROFILE ! 19702: * PRFLR IS CALLED TO PRINT THE CONTENTS OF THE PROFILE ! 19703: * TABLE IN A FAIRLY READABLE TABULAR FORMAT. ! 19704: * ! 19705: * JSR PRFLR CALL TO PRINT PROFILE ! 19706: * (WA,IA) DESTROYED ! 19707: * ! 19708: PRFLR PRC E,0 ! 19709: BZE PFDMP,PRFL4 NO PRINTING IF NO PROFILING DONE ! 19710: MOV XR,-(XS) PRESERVE ENTRY XR ! 19711: MOV WB,PFSVW AND ALSO WB ! 19712: JSR PRTPG EJECT ! 19713: MOV =PFMS1,XR LOAD MSG /PROGRAM PROFILE/ ! 19714: JSR PRTST AND PRINT IT ! 19715: JSR PRTNL FOLLOWED BY NEWLINE ! 19716: JSR PRTNL AND ANOTHER ! 19717: MOV =PFMS2,XR POINT TO FIRST HDR ! 19718: JSR PRTST PRINT IT ! 19719: JSR PRTNL NEW LINE ! 19720: MOV =PFMS3,XR SECOND HDR ! 19721: JSR PRTST PRINT IT ! 19722: JSR PRTNL NEW LINE ! 19723: JSR PRTNL AND ANOTHER BLANK LINE ! 19724: ZER WB INITIAL STMT COUNT ! 19725: MOV PFTBL,XR POINT TO TABLE ORIGIN ! 19726: ADD *NUM02,XR BIAS PAST XNBLK HEADER (SGD07) ! 19727: * ! 19728: * LOOP HERE TO PRINT SUCCESSIVE ENTRIES ! 19729: * ! 19730: PRFL1 ICV WB BUMP STMT NR ! 19731: LDI (XR) LOAD NR OF EXECUTIONS ! 19732: IEQ PRFL3 NO PRINTING IF ZERO ! 19733: MOV =PFPD1,PROFS POINT WHERE TO PRINT ! 19734: JSR PRTIN AND PRINT IT ! 19735: ZER PROFS BACK TO START OF LINE ! 19736: MTI WB LOAD STMT NR ! 19737: JSR PRTIN PRINT IT THERE ! 19738: MOV =PFPD2,PROFS AND PAD PAST COUNT ! 19739: LDI CFP$I(XR) LOAD TOTAL EXEC TIME ! 19740: JSR PRTIN PRINT THAT TOO ! 19741: LDI CFP$I(XR) RELOAD TIME ! 19742: MLI INTTH CONVERT TO MICROSEC ! 19743: IOV PRFL2 OMIT NEXT BIT IF OVERFLOW ! 19744: DVI (XR) DIVIDE BY EXECUTIONS ! 19745: MOV =PFPD3,PROFS PAD LAST PRINT ! 19746: JSR PRTIN AND PRINT MCSEC/EXECN ! 19747: * ! 19748: * MERGE AFTER PRINTING TIME ! 19749: * ! 19750: PRFL2 JSR PRTNL THATS ANOTHER LINE ! 19751: * ! 19752: * HERE TO GO TO NEXT ENTRY ! 19753: * ! 19754: PRFL3 ADD *PF$I2,XR BUMP INDEX PTR (SGD07) ! 19755: BLT WB,PFNTE,PRFL1 LOOP IF MORE STMTS ! 19756: MOV (XS)+,XR RESTORE CALLERS XR ! 19757: MOV PFSVW,WB AND WB TOO ! 19758: * ! 19759: * HERE TO EXIT ! 19760: * ! 19761: PRFL4 EXI RETURN ! 19762: ENP END OF PRFLR ! 19763: EJC ! 19764: * ! 19765: * PRFLU -- UPDATE AN ENTRY IN THE PROFILE TABLE ! 19766: * ! 19767: * ON ENTRY, KVSTN CONTAINS NR OF STMT TO PROFILE ! 19768: * ! 19769: * JSR PRFLU CALL TO UPDATE ENTRY ! 19770: * (IA) DESTROYED ! 19771: * ! 19772: PRFLU PRC E,0 ! 19773: BNZ PFFNC,PFLU4 SKIP IF JUST ENTERED FUNCTION ! 19774: MOV XR,-(XS) PRESERVE ENTRY XR ! 19775: MOV WA,PFSVW SAVE WA (SGD07) ! 19776: BNZ PFTBL,PFLU2 BRANCH IF TABLE ALLOCATED ! 19777: * ! 19778: * HERE IF SPACE FOR PROFILE TABLE NOT YET ALLOCATED. ! 19779: * CALCULATE SIZE NEEDED, ALLOCATE A STATIC XNBLK, AND ! 19780: * INITIALIZE IT ALL TO ZERO. ! 19781: * THE TIME TAKEN FOR THIS WILL BE ATTRIBUTED TO THE CURRENT ! 19782: * STATEMENT (ASSIGNMENT TO KEYWD PROFILE), BUT SINCE THE ! 19783: * TIMING FOR THIS STATEMENT IS UP THE POLE ANYWAY, THIS ! 19784: * DOESNT REALLY MATTER... ! 19785: * ! 19786: SUB =NUM01,PFNTE ADJUST FOR EXTRA COUNT (SGD07) ! 19787: MTI PFI2A CONVRT ENTRY SIZE TO INT ! 19788: STI PFSTE AND STORE SAFELY FOR LATER ! 19789: MTI PFNTE LOAD TABLE LENGTH AS INTEGER ! 19790: MLI PFSTE MULTIPLY BY ENTRY SIZE ! 19791: MFI WA GET BACK ADDRESS-STYLE ! 19792: ADD =NUM02,WA ADD ON 2 WORD OVERHEAD ! 19793: WTB WA CONVERT THE WHOLE LOT TO BYTES ! 19794: JSR ALOST GIMME THE SPACE ! 19795: MOV XR,PFTBL SAVE BLOCK POINTER ! 19796: MOV =B$XNT,(XR)+ PUT BLOCK TYPE AND ... ! 19797: MOV WA,(XR)+ ... LENGTH INTO HEADER ! 19798: MFI WA GET BACK NR OF WDS IN DATA AREA ! 19799: LCT WA,WA LOAD THE COUNTER ! 19800: * ! 19801: * LOOP HERE TO ZERO THE BLOCK DATA ! 19802: * ! 19803: PFLU1 ZER (XR)+ BLANK A WORD ! 19804: BCT WA,PFLU1 AND ALLLLLLL THE REST ! 19805: * ! 19806: * END OF ALLOCATION. MERGE BACK INTO ROUTINE ! 19807: * ! 19808: PFLU2 MTI KVSTN LOAD NR OF STMT JUST ENDED ! 19809: SBI INTV1 MAKE INTO INDEX OFFSET ! 19810: MLI PFSTE MAKE OFFSET OF TABLE ENTRY ! 19811: MFI WA CONVERT TO ADDRESS ! 19812: WTB WA GET AS BAUS ! 19813: ADD *NUM02,WA OFFSET INCLUDES TABLE HEADER ! 19814: MOV PFTBL,XR GET TABLE START ! 19815: BGE WA,NUM01(XR),PFLU3 IF OUT OF TABLE, SKIP IT ! 19816: ADD WA,XR ELSE POINT TO ENTRY ! 19817: LDI (XR) GET NR OF EXECUTIONS SO FAR ! 19818: ADI INTV1 NUDGE UP ONE ! 19819: STI (XR) AND PUT BACK ! 19820: JSR SYSTM GET TIME NOW ! 19821: STI PFETM STASH ENDING TIME ! 19822: SBI PFSTM SUBTRACT START TIME ! 19823: ADI CFP$I(XR) ADD CUMULATIVE TIME SO FAR ! 19824: STI CFP$I(XR) AND PUT BACK NEW TOTAL ! 19825: LDI PFETM LOAD END TIME OF THIS STMT ... ! 19826: STI PFSTM ... WHICH IS START TIME OF NEXT ! 19827: * ! 19828: * MERGE HERE TO EXIT ! 19829: * ! 19830: PFLU3 MOV (XS)+,XR RESTORE CALLERS XR ! 19831: MOV PFSVW,WA RESTORE SAVED REG ! 19832: EXI AND RETURN ! 19833: * ! 19834: * HERE IF PROFILE IS SUPPRESSED BECAUSE A PROGRAM DEFINED ! 19835: * FUNCTION IS ABOUT TO BE ENTERED, AND SO THE CURRENT STMT ! 19836: * HAS NOT YET FINISHED ! 19837: * ! 19838: PFLU4 ZER PFFNC RESET THE CONDITION FLAG ! 19839: EXI AND IMMEDIATE RETURN ! 19840: ENP END OF PROCEDURE PRFLU ! 19841: EJC ! 19842: .FI ! 19843: * ! 19844: * PRPAR - PROCESS PRINT PARAMETERS ! 19845: * ! 19846: * (WC) IF NONZERO ASSOCIATE TERMINAL ONLY ! 19847: * JSR PRPAR CALL TO PROCESS PRINT PARAMETERS ! 19848: * (XL,XR,WA,WB,WC) DESTROYED ! 19849: * ! 19850: * SINCE MEMORY ALLOCATION IS UNDECIDED ON INITIAL CALL, ! 19851: * TERMINAL CANNOT BE ASSOCIATED. THE ENTRY WITH WC NON-ZERO ! 19852: * IS PROVIDED SO A LATER CALL CAN BE MADE TO COMPLETE THIS. ! 19853: * ! 19854: PRPAR PRC E,0 ENTRY POINT ! 19855: BNZ WC,PRPA7 JUMP TO ASSOCIATE TERMINAL ! 19856: JSR SYSPP GET PRINT PARAMETERS ! 19857: BNZ WB,PRPA1 JUMP IF LINES/PAGE SPECIFIED ! 19858: MOV =CFP$M,WB ELSE USE A LARGE VALUE ! 19859: RSH WB,1 BUT NOT TOO LARGE ! 19860: * ! 19861: * STORE LINE COUNT/PAGE ! 19862: * ! 19863: PRPA1 MOV WB,LSTNP STORE NUMBER OF LINES/PAGE ! 19864: MOV WB,LSTLC PRETEND PAGE IS FULL INITIALLY ! 19865: ZER LSTPG CLEAR PAGE NUMBER ! 19866: MOV PRLEN,WB GET PRIOR LENGTH IF ANY ! 19867: BZE WB,PRPA2 SKIP IF NO LENGTH ! 19868: BGT WA,WB,PRPA3 SKIP STORING IF TOO BIG ! 19869: * ! 19870: * STORE PRINT BUFFER LENGTH ! 19871: * ! 19872: PRPA2 MOV WA,PRLEN STORE VALUE ! 19873: * ! 19874: * PROCESS BITS OPTIONS ! 19875: * ! 19876: PRPA3 MOV BITS3,WB BIT 3 MASK ! 19877: ANB WC,WB GET -NOLIST BIT ! 19878: ZRB WB,PRPA4 SKIP IF CLEAR ! 19879: ZER CSWLS SET -NOLIST ! 19880: * ! 19881: * CHECK IF FAIL REPORTS GOTO INTERACTIVE CHANNEL ! 19882: * ! 19883: PRPA4 MOV BITS1,WB BIT 1 MASK ! 19884: ANB WC,WB GET BIT ! 19885: MOV WB,ERICH STORE INT. CHAN. ERROR FLAG ! 19886: MOV BITS2,WB BIT 2 MASK ! 19887: ANB WC,WB GET BIT ! 19888: MOV WB,PRICH FLAG FOR STD PRINTER ON INT. CHAN. ! 19889: MOV BITS4,WB BIT 4 MASK ! 19890: ANB WC,WB GET BIT ! 19891: MOV WB,CPSTS FLAG FOR COMPILE STATS SUPPRESSN. ! 19892: MOV BITS5,WB BIT 5 MASK ! 19893: ANB WC,WB GET BIT ! 19894: MOV WB,EXSTS FLAG FOR EXEC STATS SUPPRESSION ! 19895: EJC ! 19896: * ! 19897: * PRPAR (CONTINUED) ! 19898: * ! 19899: MOV BITS6,WB BIT 6 MASK ! 19900: ANB WC,WB GET BIT ! 19901: MOV WB,PRECL EXTENDED/COMPACT LISTING FLAG ! 19902: SUB =NUM08,WA POINT 8 CHARS FROM LINE END ! 19903: ZRB WB,PRPA5 JUMP IF NOT EXTENDED ! 19904: MOV WA,LSTPO STORE FOR LISTING PAGE HEADINGS ! 19905: * ! 19906: * CONTINUE OPTION PROCESSING ! 19907: * ! 19908: PRPA5 MOV BITS7,WB BIT 7 MASK ! 19909: ANB WC,WB GET BIT 7 ! 19910: MOV WB,CSWEX SET -NOEXECUTE IF NON-ZERO ! 19911: MOV BIT10,WB BIT 10 MASK ! 19912: ANB WC,WB GET BIT 10 ! 19913: MOV WB,HEADP PRETEND PRINTED TO OMIT HEADERS ! 19914: MOV BITS9,WB BIT 9 MASK ! 19915: ANB WC,WB GET BIT 9 ! 19916: MOV WB,PRSTO KEEP IT AS STD LISTING OPTION ! 19917: ZRB WB,PRPA6 SKIP IF CLEAR ! 19918: MOV PRLEN,WA GET PRINT BUFFER LENGTH ! 19919: SUB =NUM08,WA POINT 8 CHARS FROM LINE END ! 19920: MOV WA,LSTPO STORE PAGE OFFSET ! 19921: * ! 19922: * CHECK FOR TERMINAL ! 19923: * ! 19924: PRPA6 ANB BITS8,WC SEE IF TERMINAL TO BE ACTIVATED ! 19925: BNZ WC,PRPA7 JUMP IF TERMINAL REQUIRED ! 19926: BZE INITR,PRPA8 JUMP IF NO TERMINAL TO DETACH ! 19927: MOV =V$TER,XL PTR TO /TERMINAL/ ! 19928: JSR GTNVR GET VRBLK POINTER ! 19929: PPM CANT FAIL ! 19930: MOV =NULLS,VRVAL(XR) CLEAR VALUE OF TERMINAL ! 19931: JSR SETVR REMOVE ASSOCIATION ! 19932: BRN PRPA8 RETURN ! 19933: * ! 19934: * ASSOCIATE TERMINAL ! 19935: * ! 19936: PRPA7 MNZ INITR NOTE TERMINAL ASSOCIATED ! 19937: BZE DNAMB,PRPA8 CANT IF MEMORY NOT ORGANISED ! 19938: MOV =V$TER,XL POINT TO TERMINAL STRING ! 19939: MOV =TRTOU,WB OUTPUT TRACE TYPE ! 19940: JSR INOUT ATTACH OUTPUT TRBLK TO VRBLK ! 19941: MOV XR,-(XS) STACK TRBLK PTR ! 19942: MOV =V$TER,XL POINT TO TERMINAL STRING ! 19943: MOV =TRTIN,WB INPUT TRACE TYPE ! 19944: JSR INOUT ATTACH INPUT TRACE BLK ! 19945: MOV (XS)+,VRVAL(XR) ADD OUTPUT TRBLK TO CHAIN ! 19946: * ! 19947: * RETURN POINT ! 19948: * ! 19949: PRPA8 EXI RETURN ! 19950: ENP END PROCEDURE PRPAR ! 19951: EJC ! 19952: * ! 19953: * PRTCH -- PRINT A CHARACTER ! 19954: * ! 19955: * PRTCH IS USED TO PRINT A SINGLE CHARACTER ! 19956: * ! 19957: * (WA) CHARACTER TO BE PRINTED ! 19958: * JSR PRTCH CALL TO PRINT CHARACTER ! 19959: * ! 19960: PRTCH PRC E,0 ENTRY POINT ! 19961: MOV XR,-(XS) SAVE XR ! 19962: BNE PROFS,PRLEN,PRCH1 JUMP IF ROOM IN BUFFER ! 19963: JSR PRTNL ELSE PRINT THIS LINE ! 19964: * ! 19965: * HERE AFTER MAKING SURE WE HAVE ROOM ! 19966: * ! 19967: PRCH1 MOV PRBUF,XR POINT TO PRINT BUFFER ! 19968: PSC XR,PROFS POINT TO NEXT CHARACTER LOCATION ! 19969: SCH WA,(XR) STORE NEW CHARACTER ! 19970: CSC XR COMPLETE STORE CHARACTERS ! 19971: ICV PROFS BUMP POINTER ! 19972: MOV (XS)+,XR RESTORE ENTRY XR ! 19973: EXI RETURN TO PRTCH CALLER ! 19974: ENP END PROCEDURE PRTCH ! 19975: EJC ! 19976: * ! 19977: * PRTIC -- PRINT TO INTERACTIVE CHANNEL ! 19978: * ! 19979: * PRTIC IS CALLED TO PRINT THE CONTENTS OF THE STANDARD ! 19980: * PRINT BUFFER TO THE INTERACTIVE CHANNEL. IT IS ONLY ! 19981: * CALLED AFTER PRTST HAS SET UP THE STRING FOR PRINTING. ! 19982: * IT DOES NOT CLEAR THE BUFFER. ! 19983: * ! 19984: * JSR PRTIC CALL FOR PRINT ! 19985: * (WA,WB) DESTROYED ! 19986: * ! 19987: PRTIC PRC E,0 ENTRY POINT ! 19988: MOV XR,-(XS) SAVE XR ! 19989: MOV PRBUF,XR POINT TO BUFFER ! 19990: MOV PROFS,WA NO OF CHARS ! 19991: JSR SYSPI PRINT ! 19992: PPM PRTC2 FAIL RETURN ! 19993: * ! 19994: * RETURN ! 19995: * ! 19996: PRTC1 MOV (XS)+,XR RESTORE XR ! 19997: EXI RETURN ! 19998: * ! 19999: * ERROR OCCURED ! 20000: * ! 20001: PRTC2 ZER ERICH PREVENT LOOPING ! 20002: ERB 252,ERROR ON PRINTING TO INTERACTIVE CHANNEL ! 20003: BRN PRTC1 RETURN ! 20004: ENP PROCEDURE PRTIC ! 20005: EJC ! 20006: * ! 20007: * PRTIS -- PRINT TO INTERACTIVE AND STANDARD PRINTER ! 20008: * ! 20009: * PRTIS PUTS A LINE FROM THE PRINT BUFFER ONTO THE ! 20010: * INTERACTIVE CHANNEL (IF ANY) AND THE STANDARD PRINTER. ! 20011: * IT ALWAYS PRINTS TO THE STANDARD PRINTER BUT DOES ! 20012: * NOT DUPLICATE LINES IF THE STANDARD PRINTER IS ! 20013: * INTERACTIVE. IT CLEARS DOWN THE PRINT BUFFER. ! 20014: * ! 20015: * JSR PRTIS CALL FOR PRINTING ! 20016: * (WA,WB) DESTROYED ! 20017: * ! 20018: PRTIS PRC E,0 ENTRY POINT ! 20019: BNZ PRICH,PRTS1 JUMP IF STANDARD PRINTER IS INT.CH. ! 20020: BZE ERICH,PRTS1 SKIP IF NOT DOING INT. ERROR REPS. ! 20021: JSR PRTIC PRINT TO INTERACTIVE CHANNEL ! 20022: * ! 20023: * MERGE AND EXIT ! 20024: * ! 20025: PRTS1 JSR PRTNL PRINT TO STANDARD PRINTER ! 20026: EXI RETURN ! 20027: ENP END PROCEDURE PRTIS ! 20028: EJC ! 20029: * ! 20030: * PRTIN -- PRINT AN INTEGER ! 20031: * ! 20032: * PRTIN PRINTS THE INTEGER VALUE WHICH IS IN THE INTEGER ! 20033: * ACCUMULATOR. BLOCKS BUILT IN DYNAMIC STORAGE ! 20034: * DURING THIS PROCESS ARE IMMEDIATELY DELETED. ! 20035: * ! 20036: * (IA) INTEGER VALUE TO BE PRINTED ! 20037: * JSR PRTIN CALL TO PRINT INTEGER ! 20038: * (IA,RA) DESTROYED ! 20039: * ! 20040: PRTIN PRC E,0 ENTRY POINT ! 20041: MOV XR,-(XS) SAVE XR ! 20042: JSR ICBLD BUILD INTEGER BLOCK ! 20043: BLO XR,DNAMB,PRTI1 JUMP IF ICBLK BELOW DYNAMIC ! 20044: BHI XR,DNAMP,PRTI1 JUMP IF ABOVE DYNAMIC ! 20045: MOV XR,DNAMP IMMEDIATELY DELETE IT ! 20046: * ! 20047: * DELETE ICBLK FROM DYNAMIC STORE ! 20048: * ! 20049: PRTI1 MOV XR,-(XS) STACK PTR FOR GTSTG ! 20050: JSR GTSTG CONVERT TO STRING ! 20051: PPM CONVERT ERROR IS IMPOSSIBLE ! 20052: MOV XR,DNAMP RESET POINTER TO DELETE SCBLK ! 20053: JSR PRTST PRINT INTEGER STRING ! 20054: MOV (XS)+,XR RESTORE ENTRY XR ! 20055: EXI RETURN TO PRTIN CALLER ! 20056: ENP END PROCEDURE PRTIN ! 20057: EJC ! 20058: * ! 20059: * PRTMI -- PRINT MESSAGE AND INTEGER ! 20060: * ! 20061: * PRTMI IS USED TO PRINT MESSAGES TOGETHER WITH AN INTEGER ! 20062: * VALUE STARTING IN COLUMN 15 (USED BY THE ROUTINES AT ! 20063: * THE END OF COMPILATION). ! 20064: * ! 20065: * JSR PRTMI CALL TO PRINT MESSAGE AND INTEGER ! 20066: * ! 20067: PRTMI PRC E,0 ENTRY POINT ! 20068: JSR PRTST PRINT STRING MESSAGE ! 20069: MOV =PRTMF,PROFS SET OFFSET TO COL 15 ! 20070: JSR PRTIN PRINT INTEGER ! 20071: JSR PRTNL PRINT LINE ! 20072: EXI RETURN TO PRTMI CALLER ! 20073: ENP END PROCEDURE PRTMI ! 20074: EJC ! 20075: * ! 20076: * PRTMX -- AS PRTMI WITH EXTRA COPY TO INTERACTIVE CHAN. ! 20077: * ! 20078: * JSR PRTMX CALL FOR PRINTING ! 20079: * (WA,WB) DESTROYED ! 20080: * ! 20081: PRTMX PRC E,0 ENTRY POINT ! 20082: JSR PRTST PRINT STRING MESSAGE ! 20083: MOV =PRTMF,PROFS SET PTR TO COLUMN 15 ! 20084: JSR PRTIN PRINT INTEGER ! 20085: JSR PRTIS PRINT LINE ! 20086: EXI RETURN ! 20087: ENP END PROCEDURE PRTMX ! 20088: EJC ! 20089: * ! 20090: * PRTNL -- PRINT NEW LINE (END PRINT LINE) ! 20091: * ! 20092: * PRTNL PRINTS THE CONTENTS OF THE PRINT BUFFER, RESETS ! 20093: * THE BUFFER TO ALL BLANKS AND RESETS THE PRINT POINTER. ! 20094: * ! 20095: * JSR PRTNL CALL TO PRINT LINE ! 20096: * ! 20097: PRTNL PRC R,0 ENTRY POINT ! 20098: BNZ HEADP,PRNL0 WERE HEADERS PRINTED ! 20099: JSR PRTPS NO - PRINT THEM ! 20100: * ! 20101: * CALL SYSPR ! 20102: * ! 20103: PRNL0 MOV XR,-(XS) SAVE ENTRY XR ! 20104: MOV WA,PRTSA SAVE WA ! 20105: MOV WB,PRTSB SAVE WB ! 20106: MOV PRBUF,XR LOAD POINTER TO BUFFER ! 20107: MOV PROFS,WA LOAD NUMBER OF CHARS IN BUFFER ! 20108: JSR SYSPR CALL SYSTEM PRINT ROUTINE ! 20109: PPM PRNL2 JUMP IF FAILED ! 20110: LCT WA,PRLNW LOAD LENGTH OF BUFFER IN WORDS ! 20111: ADD *SCHAR,XR POINT TO CHARS OF BUFFER ! 20112: MOV NULLW,WB GET WORD OF BLANKS ! 20113: * ! 20114: * LOOP TO BLANK BUFFER ! 20115: * ! 20116: PRNL1 MOV WB,(XR)+ STORE WORD OF BLANKS, BUMP PTR ! 20117: BCT WA,PRNL1 LOOP TILL ALL BLANKED ! 20118: * ! 20119: * EXIT POINT ! 20120: * ! 20121: MOV PRTSB,WB RESTORE WB ! 20122: MOV PRTSA,WA RESTORE WA ! 20123: MOV (XS)+,XR RESTORE ENTRY XR ! 20124: ZER PROFS RESET PRINT BUFFER POINTER ! 20125: EXI RETURN TO PRTNL CALLER ! 20126: * ! 20127: * FILE FULL OR NO OUTPUT FILE FOR LOAD MODULE ! 20128: * ! 20129: PRNL2 BNZ PRTEF,PRNL3 JUMP IF NOT FIRST TIME ! 20130: MNZ PRTEF MARK FIRST OCCURRENCE ! 20131: ERB 253,PRINT LIMIT EXCEEDED ON STANDARD OUTPUT CHANNEL ! 20132: * ! 20133: * STOP AT ONCE ! 20134: * ! 20135: PRNL3 MOV =NINI8,WB ENDING CODE ! 20136: MOV KVSTN,WA STATEMENT NUMBER ! 20137: JSR SYSEJ STOP ! 20138: ENP END PROCEDURE PRTNL ! 20139: EJC ! 20140: * ! 20141: * PRTNM -- PRINT VARIABLE NAME ! 20142: * ! 20143: * PRTNM IS USED TO PRINT A CHARACTER REPRESENTATION OF THE ! 20144: * NAME OF A VARIABLE (NOT A VALUE OF DATATYPE NAME) ! 20145: * NAMES OF PSEUDO-VARIABLES MAY NOT BE PASSED TO PRTNM. ! 20146: * ! 20147: * (XL) NAME BASE ! 20148: * (WA) NAME OFFSET ! 20149: * JSR PRTNM CALL TO PRINT NAME ! 20150: * (WB,WC,RA) DESTROYED ! 20151: * ! 20152: PRTNM PRC R,0 ENTRY POINT (RECURSIVE, SEE PRTVL) ! 20153: MOV WA,-(XS) SAVE WA (OFFSET IS COLLECTABLE) ! 20154: MOV XR,-(XS) SAVE ENTRY XR ! 20155: MOV XL,-(XS) SAVE NAME BASE ! 20156: BHI XL,STATE,PRN02 JUMP IF NOT NATURAL VARIABLE ! 20157: * ! 20158: * HERE FOR NATURAL VARIABLE NAME, RECOGNIZED BY THE FACT ! 20159: * THAT THE NAME BASE POINTS INTO THE STATIC AREA. ! 20160: * ! 20161: MOV XL,XR POINT TO VRBLK ! 20162: JSR PRTVN PRINT NAME OF VARIABLE ! 20163: * ! 20164: * COMMON EXIT POINT ! 20165: * ! 20166: PRN01 MOV (XS)+,XL RESTORE NAME BASE ! 20167: MOV (XS)+,XR RESTORE ENTRY VALUE OF XR ! 20168: MOV (XS)+,WA RESTORE WA ! 20169: EXI RETURN TO PRTNM CALLER ! 20170: * ! 20171: * HERE FOR CASE OF NON-NATURAL VARIABLE ! 20172: * ! 20173: PRN02 MOV WA,WB COPY NAME OFFSET ! 20174: BNE (XL),=B$PDT,PRN03 JUMP IF ARRAY OR TABLE ! 20175: * ! 20176: * FOR PROGRAM DEFINED DATATYPE, PRT FLD NAME, LEFT PAREN ! 20177: * ! 20178: MOV PDDFP(XL),XR LOAD POINTER TO DFBLK ! 20179: ADD WA,XR ADD NAME OFFSET ! 20180: MOV PDFOF(XR),XR LOAD VRBLK POINTER FOR FIELD ! 20181: JSR PRTVN PRINT FIELD NAME ! 20182: MOV =CH$PP,WA LOAD LEFT PAREN ! 20183: JSR PRTCH PRINT CHARACTER ! 20184: EJC ! 20185: * ! 20186: * PRTNM (CONTINUED) ! 20187: * ! 20188: * NOW WE PRINT AN IDENTIFYING NAME FOR THE OBJECT IF ONE ! 20189: * CAN BE FOUND. THE FOLLOWING CODE SEARCHES FOR A NATURAL ! 20190: * VARIABLE WHICH CONTAINS THIS OBJECT AS VALUE. IF SUCH A ! 20191: * VARIABLE IS FOUND, ITS NAME IS PRINTED, ELSE THE VALUE ! 20192: * OF THE OBJECT (AS PRINTED BY PRTVL) IS USED INSTEAD. ! 20193: * ! 20194: * FIRST WE POINT TO THE PARENT TBBLK IF THIS IS THE CASE OF ! 20195: * A TABLE ELEMENT. TO DO THIS, CHASE DOWN THE TRNXT CHAIN. ! 20196: * ! 20197: PRN03 BNE (XL),=B$TET,PRN04 JUMP IF WE GOT THERE (OR NOT TE) ! 20198: MOV TENXT(XL),XL ELSE MOVE OUT ON CHAIN ! 20199: BRN PRN03 AND LOOP BACK ! 20200: * ! 20201: * NOW WE ARE READY FOR THE SEARCH. TO SPEED THINGS UP IN ! 20202: * THE CASE OF CALLS FROM DUMP WHERE THE SAME NAME BASE ! 20203: * WILL OCCUR REPEATEDLY WHILE DUMPING AN ARRAY OR TABLE, ! 20204: * WE REMEMBER THE LAST VRBLK POINTER FOUND IN PRNMV. SO ! 20205: * FIRST CHECK TO SEE IF WE HAVE THIS ONE AGAIN. ! 20206: * ! 20207: PRN04 MOV PRNMV,XR POINT TO VRBLK WE FOUND LAST TIME ! 20208: MOV HSHTB,WA POINT TO HASH TABLE IN CASE NOT ! 20209: BRN PRN07 JUMP INTO SEARCH FOR SPECIAL CHECK ! 20210: * ! 20211: * LOOP THROUGH HASH SLOTS ! 20212: * ! 20213: PRN05 MOV WA,XR COPY SLOT POINTER ! 20214: ICA WA BUMP SLOT POINTER ! 20215: SUB *VRNXT,XR INTRODUCE STANDARD VRBLK OFFSET ! 20216: * ! 20217: * LOOP THROUGH VRBLKS ON ONE HASH CHAIN ! 20218: * ! 20219: PRN06 MOV VRNXT(XR),XR POINT TO NEXT VRBLK ON HASH CHAIN ! 20220: * ! 20221: * MERGE HERE FIRST TIME TO CHECK BLOCK WE FOUND LAST TIME ! 20222: * ! 20223: PRN07 MOV XR,WC COPY VRBLK POINTER ! 20224: BZE WC,PRN09 JUMP IF CHAIN END (OR PRNMV ZERO) ! 20225: EJC ! 20226: * ! 20227: * PRTNM (CONTINUED) ! 20228: * ! 20229: * LOOP TO FIND VALUE (CHASE DOWN POSSIBLE TRBLK CHAIN) ! 20230: * ! 20231: PRN08 MOV VRVAL(XR),XR LOAD VALUE ! 20232: BEQ (XR),=B$TRT,PRN08 LOOP IF THAT WAS A TRBLK ! 20233: * ! 20234: * NOW WE HAVE THE VALUE, IS THIS THE BLOCK WE WANT ! 20235: * ! 20236: BEQ XR,XL,PRN10 JUMP IF THIS MATCHES THE NAME BASE ! 20237: MOV WC,XR ELSE POINT BACK TO THAT VRBLK ! 20238: BRN PRN06 AND LOOP BACK ! 20239: * ! 20240: * HERE TO MOVE TO NEXT HASH SLOT ! 20241: * ! 20242: PRN09 BLT WA,HSHTE,PRN05 LOOP BACK IF MORE TO GO ! 20243: MOV XL,XR ELSE NOT FOUND, COPY VALUE POINTER ! 20244: JSR PRTVL PRINT VALUE ! 20245: BRN PRN11 AND MERGE AHEAD ! 20246: * ! 20247: * HERE WHEN WE FIND A MATCHING ENTRY ! 20248: * ! 20249: PRN10 MOV WC,XR COPY VRBLK POINTER ! 20250: MOV XR,PRNMV SAVE FOR NEXT TIME IN ! 20251: JSR PRTVN PRINT VARIABLE NAME ! 20252: * ! 20253: * MERGE HERE IF NO ENTRY FOUND ! 20254: * ! 20255: PRN11 MOV (XL),WC LOAD FIRST WORD OF NAME BASE ! 20256: BNE WC,=B$PDT,PRN13 JUMP IF NOT PROGRAM DEFINED ! 20257: * ! 20258: * FOR PROGRAM DEFINED DATATYPE, ADD RIGHT PAREN AND EXIT ! 20259: * ! 20260: MOV =CH$RP,WA LOAD RIGHT PAREN, MERGE ! 20261: * ! 20262: * MERGE HERE TO PRINT FINAL RIGHT PAREN OR BRACKET ! 20263: * ! 20264: PRN12 JSR PRTCH PRINT FINAL CHARACTER ! 20265: MOV WB,WA RESTORE NAME OFFSET ! 20266: BRN PRN01 MERGE BACK TO EXIT ! 20267: EJC ! 20268: * ! 20269: * PRTNM (CONTINUED) ! 20270: * ! 20271: * HERE FOR ARRAY OR TABLE ! 20272: * ! 20273: PRN13 MOV =CH$BB,WA LOAD LEFT BRACKET ! 20274: JSR PRTCH AND PRINT IT ! 20275: MOV (XS),XL RESTORE BLOCK POINTER ! 20276: MOV (XL),WC LOAD TYPE WORD AGAIN ! 20277: BNE WC,=B$TET,PRN15 JUMP IF NOT TABLE ! 20278: * ! 20279: * HERE FOR TABLE, PRINT SUBSCRIPT VALUE ! 20280: * ! 20281: MOV TESUB(XL),XR LOAD SUBSCRIPT VALUE ! 20282: MOV WB,XL SAVE NAME OFFSET ! 20283: JSR PRTVL PRINT SUBSCRIPT VALUE ! 20284: MOV XL,WB RESTORE NAME OFFSET ! 20285: * ! 20286: * MERGE HERE FROM ARRAY CASE TO PRINT RIGHT BRACKET ! 20287: * ! 20288: PRN14 MOV =CH$RB,WA LOAD RIGHT BRACKET ! 20289: BRN PRN12 MERGE BACK TO PRINT IT ! 20290: * ! 20291: * HERE FOR ARRAY OR VECTOR, TO PRINT SUBSCRIPT(S) ! 20292: * ! 20293: PRN15 MOV WB,WA COPY NAME OFFSET ! 20294: BTW WA CONVERT TO WORDS ! 20295: BEQ WC,=B$ART,PRN16 JUMP IF ARBLK ! 20296: * ! 20297: * HERE FOR VECTOR ! 20298: * ! 20299: SUB =VCVLB,WA ADJUST FOR STANDARD FIELDS ! 20300: MTI WA MOVE TO INTEGER ACCUM ! 20301: JSR PRTIN PRINT LINEAR SUBSCRIPT ! 20302: BRN PRN14 MERGE BACK FOR RIGHT BRACKET ! 20303: EJC ! 20304: * ! 20305: * PRTNM (CONTINUED) ! 20306: * ! 20307: * HERE FOR ARRAY. FIRST CALCULATE ABSOLUTE SUBSCRIPT ! 20308: * OFFSETS BY SUCCESSIVE DIVISIONS BY THE DIMENSION VALUES. ! 20309: * THIS MUST BE DONE RIGHT TO LEFT SINCE THE ELEMENTS ARE ! 20310: * STORED ROW-WISE. THE SUBSCRIPTS ARE STACKED AS INTEGERS. ! 20311: * ! 20312: PRN16 MOV AROFS(XL),WC LOAD LENGTH OF BOUNDS INFO ! 20313: ICA WC ADJUST FOR ARPRO FIELD ! 20314: BTW WC CONVERT TO WORDS ! 20315: SUB WC,WA GET LINEAR ZERO-ORIGIN SUBSCRIPT ! 20316: MTI WA GET INTEGER VALUE ! 20317: LCT WA,ARNDM(XL) SET NUM OF DIMENSIONS AS LOOP COUNT ! 20318: ADD AROFS(XL),XL POINT PAST BOUNDS INFORMATION ! 20319: SUB *ARLBD,XL SET OK OFFSET FOR PROPER PTR LATER ! 20320: * ! 20321: * LOOP TO STACK SUBSCRIPT OFFSETS ! 20322: * ! 20323: PRN17 SUB *ARDMS,XL POINT TO NEXT SET OF BOUNDS ! 20324: STI PRNSI SAVE CURRENT OFFSET ! 20325: RMI ARDIM(XL) GET REMAINDER ON DIVIDING BY DIMENS ! 20326: MFI -(XS) STORE ON STACK (ONE WORD) ! 20327: LDI PRNSI RELOAD ARGUMENT ! 20328: DVI ARDIM(XL) DIVIDE TO GET QUOTIENT ! 20329: BCT WA,PRN17 LOOP TILL ALL STACKED ! 20330: ZER XR SET OFFSET TO FIRST SET OF BOUNDS ! 20331: LCT WB,ARNDM(XL) LOAD COUNT OF DIMS TO CONTROL LOOP ! 20332: BRN PRN19 JUMP INTO PRINT LOOP ! 20333: * ! 20334: * LOOP TO PRINT SUBSCRIPTS FROM STACK ADJUSTING BY ADDING ! 20335: * THE APPROPRIATE LOW BOUND VALUE FROM THE ARBLK ! 20336: * ! 20337: PRN18 MOV =CH$CM,WA LOAD A COMMA ! 20338: JSR PRTCH PRINT IT ! 20339: * ! 20340: * MERGE HERE FIRST TIME IN (NO COMMA REQUIRED) ! 20341: * ! 20342: PRN19 MTI (XS)+ LOAD SUBSCRIPT OFFSET AS INTEGER ! 20343: ADD XR,XL POINT TO CURRENT LBD ! 20344: ADI ARLBD(XL) ADD LBD TO GET SIGNED SUBSCRIPT ! 20345: SUB XR,XL POINT BACK TO START OF ARBLK ! 20346: JSR PRTIN PRINT SUBSCRIPT ! 20347: ADD *ARDMS,XR BUMP OFFSET TO NEXT BOUNDS ! 20348: BCT WB,PRN18 LOOP BACK TILL ALL PRINTED ! 20349: BRN PRN14 MERGE BACK TO PRINT RIGHT BRACKET ! 20350: ENP END PROCEDURE PRTNM ! 20351: EJC ! 20352: * ! 20353: * PRTNV -- PRINT NAME VALUE ! 20354: * ! 20355: * PRTNV IS USED BY THE TRACE AND DUMP ROUTINES TO PRINT ! 20356: * A LINE OF THE FORM ! 20357: * ! 20358: * NAME = VALUE ! 20359: * ! 20360: * NOTE THAT THE NAME INVOLVED CAN NEVER BE A PSEUDO-VAR ! 20361: * ! 20362: * (XL) NAME BASE ! 20363: * (WA) NAME OFFSET ! 20364: * JSR PRTNV CALL TO PRINT NAME = VALUE ! 20365: * (WB,WC,RA) DESTROYED ! 20366: * ! 20367: PRTNV PRC E,0 ENTRY POINT ! 20368: JSR PRTNM PRINT ARGUMENT NAME ! 20369: MOV XR,-(XS) SAVE ENTRY XR ! 20370: MOV WA,-(XS) SAVE NAME OFFSET (COLLECTABLE) ! 20371: MOV =TMBEB,XR POINT TO BLANK EQUAL BLANK ! 20372: JSR PRTST PRINT IT ! 20373: MOV XL,XR COPY NAME BASE ! 20374: ADD WA,XR POINT TO VALUE ! 20375: MOV (XR),XR LOAD VALUE POINTER ! 20376: JSR PRTVL PRINT VALUE ! 20377: JSR PRTNL TERMINATE LINE ! 20378: MOV (XS)+,WA RESTORE NAME OFFSET ! 20379: MOV (XS)+,XR RESTORE ENTRY XR ! 20380: EXI RETURN TO CALLER ! 20381: ENP END PROCEDURE PRTNV ! 20382: EJC ! 20383: * ! 20384: * PRTPG -- PRINT A PAGE THROW ! 20385: * ! 20386: * PRINTS A PAGE THROW OR A FEW BLANK LINES ON THE STANDARD ! 20387: * LISTING CHANNEL DEPENDING ON THE LISTING OPTIONS CHOSEN. ! 20388: * ! 20389: * JSR PRTPG CALL FOR PAGE EJECT ! 20390: * ! 20391: PRTPG PRC E,0 ENTRY POINT ! 20392: BEQ STAGE,=STGXT,PRP01 JUMP IF EXECUTION TIME ! 20393: BZE LSTLC,PRP06 RETURN IF TOP OF PAGE ALREADY ! 20394: ZER LSTLC CLEAR LINE COUNT ! 20395: * ! 20396: * CHECK TYPE OF LISTING ! 20397: * ! 20398: PRP01 MOV XR,-(XS) PRESERVE XR ! 20399: BNZ PRSTD,PRP02 EJECT IF FLAG SET ! 20400: BNZ PRICH,PRP03 JUMP IF INTERACTIVE LISTING CHANNEL ! 20401: BZE PRECL,PRP03 JUMP IF COMPACT LISTING ! 20402: * ! 20403: * PERFORM AN EJECT ! 20404: * ! 20405: PRP02 JSR SYSEP EJECT ! 20406: BRN PRP04 MERGE ! 20407: * ! 20408: * COMPACT OR INTERACTIVE CHANNEL LISTING. CANT PRINT ! 20409: * BLANKS UNTIL CHECK MADE FOR HEADERS PRINTED AND FLAG SET. ! 20410: * ! 20411: * ! 20412: PRP03 MOV HEADP,XR REMEMBER HEADP ! 20413: MNZ HEADP SET TO AVOID REPEATED PRTPG CALLS ! 20414: JSR PRTNL PRINT BLANK LINE ! 20415: JSR PRTNL PRINT BLANK LINE ! 20416: JSR PRTNL PRINT BLANK LINE ! 20417: MOV =NUM03,LSTLC COUNT BLANK LINES ! 20418: MOV XR,HEADP RESTORE HEADER FLAG ! 20419: EJC ! 20420: * ! 20421: * PRPTG (CONTINUED) ! 20422: * ! 20423: * PRINT THE HEADING ! 20424: * ! 20425: PRP04 BNZ HEADP,PRP05 JUMP IF HEADER LISTED ! 20426: MNZ HEADP MARK HEADERS PRINTED ! 20427: MOV XL,-(XS) KEEP XL ! 20428: MOV =HEADR,XR POINT TO LISTING HEADER ! 20429: JSR PRTST PLACE IT ! 20430: JSR SYSID GET SYSTEM IDENTIFICATION ! 20431: JSR PRTST APPEND EXTRA CHARS ! 20432: JSR PRTNL PRINT IT ! 20433: MOV XL,XR EXTRA HEADER LINE ! 20434: JSR PRTST PLACE IT ! 20435: JSR PRTNL PRINT IT ! 20436: JSR PRTNL PRINT A BLANK ! 20437: JSR PRTNL AND ANOTHER ! 20438: ADD =NUM04,LSTLC FOUR HEADER LINES PRINTED ! 20439: MOV (XS)+,XL RESTORE XL ! 20440: * ! 20441: * MERGE IF HEADER NOT PRINTED ! 20442: * ! 20443: PRP05 MOV (XS)+,XR RESTORE XR ! 20444: * ! 20445: * RETURN ! 20446: * ! 20447: PRP06 EXI RETURN ! 20448: ENP END PROCEDURE PRTPG ! 20449: EJC ! 20450: * ! 20451: * PRTPS - PRINT PAGE WITH TEST FOR STANDARD LISTING OPTION ! 20452: * ! 20453: * IF THE STANDARD LISTING OPTION IS SELECTED, INSIST THAT ! 20454: * AN EJECT BE DONE ! 20455: * ! 20456: * JSR PRTPS CALL FOR EJECT ! 20457: * ! 20458: PRTPS PRC E,0 ENTRY POINT ! 20459: MOV PRSTO,PRSTD COPY OPTION FLAG ! 20460: JSR PRTPG PRINT PAGE ! 20461: ZER PRSTD CLEAR FLAG ! 20462: EXI RETURN ! 20463: ENP END PROCEDURE PRTPS ! 20464: EJC ! 20465: * ! 20466: * PRTSN -- PRINT STATEMENT NUMBER ! 20467: * ! 20468: * PRTSN IS USED TO INITIATE A PRINT TRACE LINE BY PRINTING ! 20469: * ASTERISKS AND THE CURRENT STATEMENT NUMBER. THE ACTUAL ! 20470: * FORMAT OF THE OUTPUT GENERATED IS. ! 20471: * ! 20472: * ***NNNNN**** III.....IIII ! 20473: * ! 20474: * NNNNN IS THE STATEMENT NUMBER WITH LEADING ZEROS REPLACED ! 20475: * BY ASTERISKS (E.G. *******9****) ! 20476: * ! 20477: * III...III REPRESENTS A VARIABLE LENGTH OUTPUT CONSISTING ! 20478: * OF A NUMBER OF LETTER I CHARACTERS EQUAL TO FNCLEVEL. ! 20479: * ! 20480: * JSR PRTSN CALL TO PRINT STATEMENT NUMBER ! 20481: * (WC) DESTROYED ! 20482: * ! 20483: PRTSN PRC E,0 ENTRY POINT ! 20484: MOV XR,-(XS) SAVE ENTRY XR ! 20485: MOV WA,PRSNA SAVE ENTRY WA ! 20486: MOV =TMASB,XR POINT TO ASTERISKS ! 20487: JSR PRTST PRINT ASTERISKS ! 20488: MOV =NUM04,PROFS POINT INTO MIDDLE OF ASTERISKS ! 20489: MTI KVSTN LOAD STATEMENT NUMBER AS INTEGER ! 20490: JSR PRTIN PRINT INTEGER STATEMENT NUMBER ! 20491: MOV =PRSNF,PROFS POINT PAST ASTERISKS PLUS BLANK ! 20492: MOV KVFNC,XR GET FNCLEVEL ! 20493: MOV =CH$LI,WA SET LETTER I ! 20494: * ! 20495: * LOOP TO GENERATE LETTER I FNCLEVEL TIMES ! 20496: * ! 20497: PRSN1 BZE XR,PRSN2 JUMP IF ALL SET ! 20498: JSR PRTCH ELSE PRINT AN I ! 20499: DCV XR DECREMENT COUNTER ! 20500: BRN PRSN1 LOOP BACK ! 20501: * ! 20502: * MERRE WITH ALL LETTER I CHARACTERS GENERATED ! 20503: * ! 20504: PRSN2 MOV =CH$BL,WA GET BLANK ! 20505: JSR PRTCH PRINT BLANK ! 20506: MOV PRSNA,WA RESTORE ENTRY WA ! 20507: MOV (XS)+,XR RESTORE ENTRY XR ! 20508: EXI RETURN TO PRTSN CALLER ! 20509: ENP END PROCEDURE PRTSN ! 20510: EJC ! 20511: * ! 20512: * PRTST -- PRINT STRING ! 20513: * ! 20514: * PRTST PLACES A STRING OF CHARACTERS IN THE PRINT BUFFER ! 20515: * ! 20516: * SEE PRTNL FOR GLOBAL LOCATIONS USED ! 20517: * ! 20518: * NOTE THAT THE FIRST WORD OF THE BLOCK (NORMALLY B$SCL) ! 20519: * IS NOT USED AND NEED NOT BE SET CORRECTLY (SEE PRTVN) ! 20520: * ! 20521: * (XR) STRING TO BE PRINTED ! 20522: * JSR PRTST CALL TO PRINT STRING ! 20523: * (PROFS) UPDATED PAST CHARS PLACED ! 20524: * ! 20525: PRTST PRC R,0 ENTRY POINT ! 20526: BNZ HEADP,PRST0 WERE HEADERS PRINTED ! 20527: JSR PRTPS NO - PRINT THEM ! 20528: * ! 20529: * CALL SYSPR ! 20530: * ! 20531: PRST0 MOV WA,PRSVA SAVE WA ! 20532: MOV WB,PRSVB SAVE WB ! 20533: ZER WB SET CHARS PRINTED COUNT TO ZERO ! 20534: * ! 20535: * LOOP TO PRINT SUCCESSIVE LINES FOR LONG STRING ! 20536: * ! 20537: PRST1 MOV SCLEN(XR),WA LOAD STRING LENGTH ! 20538: SUB WB,WA SUBTRACT COUNT OF CHARS ALREADY OUT ! 20539: BZE WA,PRST4 JUMP TO EXIT IF NONE LEFT ! 20540: MOV XL,-(XS) ELSE STACK ENTRY XL ! 20541: MOV XR,-(XS) SAVE ARGUMENT ! 20542: MOV XR,XL COPY FOR EVENTUAL MOVE ! 20543: MOV PRLEN,XR LOAD PRINT BUFFER LENGTH ! 20544: SUB PROFS,XR GET CHARS LEFT IN PRINT BUFFER ! 20545: BNZ XR,PRST2 SKIP IF ROOM LEFT ON THIS LINE ! 20546: JSR PRTNL ELSE PRINT THIS LINE ! 20547: MOV PRLEN,XR AND SET FULL WIDTH AVAILABLE ! 20548: EJC ! 20549: * ! 20550: * PRTST (CONTINUED) ! 20551: * ! 20552: * HERE WITH CHARS TO PRINT AND SOME ROOM IN BUFFER ! 20553: * ! 20554: PRST2 BLO WA,XR,PRST3 JUMP IF ROOM FOR REST OF STRING ! 20555: MOV XR,WA ELSE SET TO FILL LINE ! 20556: * ! 20557: * MERGE HERE WITH CHARACTER COUNT IN WA ! 20558: * ! 20559: PRST3 MOV PRBUF,XR POINT TO PRINT BUFFER ! 20560: PLC XL,WB POINT TO LOCATION IN STRING ! 20561: PSC XR,PROFS POINT TO LOCATION IN BUFFER ! 20562: ADD WA,WB BUMP STRING CHARS COUNT ! 20563: ADD WA,PROFS BUMP BUFFER POINTER ! 20564: MOV WB,PRSVC PRESERVE CHAR COUNTER ! 20565: MVC MOVE CHARACTERS TO BUFFER ! 20566: MOV PRSVC,WB RECOVER CHAR COUNTER ! 20567: MOV (XS)+,XR RESTORE ARGUMENT POINTER ! 20568: MOV (XS)+,XL RESTORE ENTRY XL ! 20569: BRN PRST1 LOOP BACK TO TEST FOR MORE ! 20570: * ! 20571: * HERE TO EXIT AFTER PRINTING STRING ! 20572: * ! 20573: PRST4 MOV PRSVB,WB RESTORE ENTRY WB ! 20574: MOV PRSVA,WA RESTORE ENTRY WA ! 20575: EXI RETURN TO PRTST CALLER ! 20576: ENP END PROCEDURE PRTST ! 20577: EJC ! 20578: * ! 20579: * PRTTR -- PRINT TO TERMINAL ! 20580: * ! 20581: * CALLED TO PRINT CONTENTS OF STANDARD PRINT BUFFER TO ! 20582: * ONLINE TERMINAL. CLEARS BUFFER DOWN AND RESETS PROFS. ! 20583: * ! 20584: * JSR PRTTR CALL FOR PRINT ! 20585: * (WA,WB) DESTROYED ! 20586: * ! 20587: PRTTR PRC E,0 ENTRY POINT ! 20588: MOV XR,-(XS) SAVE XR ! 20589: JSR PRTIC PRINT BUFFER CONTENTS ! 20590: MOV PRBUF,XR POINT TO PRINT BFR TO CLEAR IT ! 20591: LCT WA,PRLNW GET BUFFER LENGTH ! 20592: ADD *SCHAR,XR POINT PAST SCBLK HEADER ! 20593: MOV NULLW,WB GET BLANKS ! 20594: * ! 20595: * LOOP TO CLEAR BUFFER ! 20596: * ! 20597: PRTT1 MOV WB,(XR)+ CLEAR A WORD ! 20598: BCT WA,PRTT1 LOOP ! 20599: ZER PROFS RESET PROFS ! 20600: MOV (XS)+,XR RESTORE XR ! 20601: EXI RETURN ! 20602: ENP END PROCEDURE PRTTR ! 20603: EJC ! 20604: * ! 20605: * PRTVL -- PRINT A VALUE ! 20606: * ! 20607: * PRTVL PLACES AN APPROPRIATE CHARACTER REPRESENTATION OF ! 20608: * A DATA VALUE IN THE PRINT BUFFER FOR DUMP/TRACE USE. ! 20609: * ! 20610: * (XR) VALUE TO BE PRINTED ! 20611: * JSR PRTVL CALL TO PRINT VALUE ! 20612: * (WA,WB,WC,RA) DESTROYED ! 20613: * ! 20614: PRTVL PRC R,0 ENTRY POINT, RECURSIVE ! 20615: MOV XL,-(XS) SAVE ENTRY XL ! 20616: MOV XR,-(XS) SAVE ARGUMENT ! 20617: CHK CHECK FOR STACK OVERFLOW ! 20618: * ! 20619: * LOOP BACK HERE AFTER FINDING A TRAP BLOCK (TRBLK) ! 20620: * ! 20621: PRV01 MOV IDVAL(XR),PRVSI COPY IDVAL (IF ANY) ! 20622: MOV (XR),XL LOAD FIRST WORD OF BLOCK ! 20623: LEI XL LOAD ENTRY POINT ID ! 20624: BSW XL,BL$$T,PRV02 SWITCH ON BLOCK TYPE ! 20625: IFF BL$TR,PRV04 TRBLK ! 20626: IFF BL$AR,PRV05 ARBLK ! 20627: IFF BL$IC,PRV08 ICBLK ! 20628: IFF BL$NM,PRV09 NMBLK ! 20629: IFF BL$PD,PRV10 PDBLK ! 20630: .IF .CNRA ! 20631: .ELSE ! 20632: IFF BL$RC,PRV08 RCBLK ! 20633: .FI ! 20634: IFF BL$SC,PRV11 SCBLK ! 20635: IFF BL$SE,PRV12 SEBLK ! 20636: IFF BL$TB,PRV13 TBBLK ! 20637: IFF BL$VC,PRV13 VCBLK ! 20638: .IF .CNBF ! 20639: .ELSE ! 20640: IFF BL$BC,PRV15 BCBLK ! 20641: .FI ! 20642: ESW END OF SWITCH ON BLOCK TYPE ! 20643: * ! 20644: * HERE FOR BLOCKS FOR WHICH WE JUST PRINT DATATYPE NAME ! 20645: * ! 20646: PRV02 JSR DTYPE GET DATATYPE NAME ! 20647: JSR PRTST PRINT DATATYPE NAME ! 20648: * ! 20649: * COMMON EXIT POINT ! 20650: * ! 20651: PRV03 MOV (XS)+,XR RELOAD ARGUMENT ! 20652: MOV (XS)+,XL RESTORE XL ! 20653: EXI RETURN TO PRTVL CALLER ! 20654: * ! 20655: * HERE FOR TRBLK ! 20656: * ! 20657: PRV04 MOV TRVAL(XR),XR LOAD REAL VALUE ! 20658: BRN PRV01 AND LOOP BACK ! 20659: EJC ! 20660: * ! 20661: * PRTVL (CONTINUED) ! 20662: * ! 20663: * HERE FOR ARRAY (ARBLK) ! 20664: * ! 20665: * PRINT ARRAY ( PROTOTYPE ) BLANK NUMBER IDVAL ! 20666: * ! 20667: PRV05 MOV XR,XL PRESERVE ARGUMENT ! 20668: MOV =SCARR,XR POINT TO DATATYPE NAME (ARRAY) ! 20669: JSR PRTST PRINT IT ! 20670: MOV =CH$PP,WA LOAD LEFT PAREN ! 20671: JSR PRTCH PRINT LEFT PAREN ! 20672: ADD AROFS(XL),XL POINT TO PROTOTYPE ! 20673: MOV (XL),XR LOAD PROTOTYPE ! 20674: JSR PRTST PRINT PROTOTYPE ! 20675: * ! 20676: * VCBLK, TBBLK, BCBLK MERGE HERE FOR ) BLANK NUMBER IDVAL ! 20677: * ! 20678: PRV06 MOV =CH$RP,WA LOAD RIGHT PAREN ! 20679: JSR PRTCH PRINT RIGHT PAREN ! 20680: * ! 20681: * PDBLK MERGES HERE TO PRINT BLANK NUMBER IDVAL ! 20682: * ! 20683: PRV07 MOV =CH$BL,WA LOAD BLANK ! 20684: JSR PRTCH PRINT IT ! 20685: MOV =CH$NM,WA LOAD NUMBER SIGN ! 20686: JSR PRTCH PRINT IT ! 20687: MTI PRVSI GET IDVAL ! 20688: JSR PRTIN PRINT ID NUMBER ! 20689: BRN PRV03 BACK TO EXIT ! 20690: * ! 20691: * HERE FOR INTEGER (ICBLK), REAL (RCBLK) ! 20692: * ! 20693: * PRINT CHARACTER REPRESENTATION OF VALUE ! 20694: * ! 20695: PRV08 MOV XR,-(XS) STACK ARGUMENT FOR GTSTG ! 20696: JSR GTSTG CONVERT TO STRING ! 20697: PPM ERROR RETURN IS IMPOSSIBLE ! 20698: JSR PRTST PRINT THE STRING ! 20699: MOV XR,DNAMP DELETE GARBAGE STRING FROM STORAGE ! 20700: BRN PRV03 BACK TO EXIT ! 20701: EJC ! 20702: * ! 20703: * PRTVL (CONTINUED) ! 20704: * ! 20705: * NAME (NMBLK) ! 20706: * ! 20707: * FOR PSEUDO-VARIABLE, JUST PRINT DATATYPE NAME (NAME) ! 20708: * FOR ALL OTHER NAMES, PRINT DOT FOLLOWED BY NAME REP ! 20709: * ! 20710: PRV09 MOV NMBAS(XR),XL LOAD NAME BASE ! 20711: MOV (XL),WA LOAD FIRST WORD OF BLOCK ! 20712: BEQ WA,=B$KVT,PRV02 JUST PRINT NAME IF KEYWORD ! 20713: BEQ WA,=B$EVT,PRV02 JUST PRINT NAME IF EXPRESSION VAR ! 20714: MOV =CH$DT,WA ELSE GET DOT ! 20715: JSR PRTCH AND PRINT IT ! 20716: MOV NMOFS(XR),WA LOAD NAME OFFSET ! 20717: JSR PRTNM PRINT NAME ! 20718: BRN PRV03 BACK TO EXIT ! 20719: * ! 20720: * PROGRAM DATATYPE (PDBLK) ! 20721: * ! 20722: * PRINT DATATYPE NAME CH$BL CH$NM IDVAL ! 20723: * ! 20724: PRV10 JSR DTYPE GET DATATYPE NAME ! 20725: JSR PRTST PRINT DATATYPE NAME ! 20726: BRN PRV07 MERGE BACK TO PRINT ID ! 20727: * ! 20728: * HERE FOR STRING (SCBLK) ! 20729: * ! 20730: * PRINT QUOTE STRING-CHARACTERS QUOTE ! 20731: * ! 20732: PRV11 MOV =CH$SQ,WA LOAD SINGLE QUOTE ! 20733: JSR PRTCH PRINT QUOTE ! 20734: JSR PRTST PRINT STRING VALUE ! 20735: JSR PRTCH PRINT ANOTHER QUOTE ! 20736: BRN PRV03 BACK TO EXIT ! 20737: EJC ! 20738: * ! 20739: * PRTVL (CONTINUED) ! 20740: * ! 20741: * HERE FOR SIMPLE EXPRESSION (SEBLK) ! 20742: * ! 20743: * PRINT ASTERISK VARIABLE-NAME ! 20744: * ! 20745: PRV12 MOV =CH$AS,WA LOAD ASTERISK ! 20746: JSR PRTCH PRINT ASTERISK ! 20747: MOV SEVAR(XR),XR LOAD VARIABLE POINTER ! 20748: JSR PRTVN PRINT VARIABLE NAME ! 20749: BRN PRV03 JUMP BACK TO EXIT ! 20750: * ! 20751: * HERE FOR TABLE (TBBLK) AND ARRAY (VCBLK) ! 20752: * ! 20753: * PRINT DATATYPE ( PROTOTYPE ) BLANK NUMBER IDVAL ! 20754: * ! 20755: PRV13 MOV XR,XL PRESERVE ARGUMENT ! 20756: JSR DTYPE GET DATATYPE NAME ! 20757: JSR PRTST PRINT DATATYPE NAME ! 20758: MOV =CH$PP,WA LOAD LEFT PAREN ! 20759: JSR PRTCH PRINT LEFT PAREN ! 20760: MOV TBLEN(XL),WA LOAD LENGTH OF BLOCK (=VCLEN) ! 20761: BTW WA CONVERT TO WORD COUNT ! 20762: SUB =TBSI$,WA ALLOW FOR STANDARD FIELDS ! 20763: BEQ (XL),=B$TBT,PRV14 JUMP IF TABLE ! 20764: ADD =VCTBD,WA FOR VCBLK, ADJUST SIZE ! 20765: * ! 20766: * PRINT PROTOTYPE ! 20767: * ! 20768: PRV14 MTI WA MOVE AS INTEGER ! 20769: JSR PRTIN PRINT INTEGER PROTOTYPE ! 20770: BRN PRV06 MERGE BACK FOR REST ! 20771: .IF .CNBF ! 20772: .ELSE ! 20773: EJC ! 20774: * ! 20775: * PRTVL (CONTINUED) ! 20776: * ! 20777: * HERE FOR BUFFER (BCBLK) ! 20778: * ! 20779: PRV15 MOV XR,XL PRESERVE ARGUMENT ! 20780: MOV =SCBUF,XR POINT TO DATATYPE NAME (BUFFER) ! 20781: JSR PRTST PRINT IT ! 20782: MOV =CH$PP,WA LOAD LEFT PAREN ! 20783: JSR PRTCH PRINT LEFT PAREN ! 20784: MOV BCBUF(XL),XR POINT TO BFBLK ! 20785: MTI BFALC(XR) LOAD ALLOCATION SIZE ! 20786: JSR PRTIN PRINT IT ! 20787: MOV =CH$CM,WA LOAD COMMA ! 20788: JSR PRTCH PRINT IT ! 20789: MTI BCLEN(XL) LOAD DEFINED LENGTH ! 20790: JSR PRTIN PRINT IT ! 20791: BRN PRV06 MERGE TO FINISH UP ! 20792: .FI ! 20793: ENP END PROCEDURE PRTVL ! 20794: EJC ! 20795: * ! 20796: * PRTVN -- PRINT NATURAL VARIABLE NAME ! 20797: * ! 20798: * PRTVN PRINTS THE NAME OF A NATURAL VARIABLE ! 20799: * ! 20800: * (XR) POINTER TO VRBLK ! 20801: * JSR PRTVN CALL TO PRINT VARIABLE NAME ! 20802: * ! 20803: PRTVN PRC E,0 ENTRY POINT ! 20804: MOV XR,-(XS) STACK VRBLK POINTER ! 20805: ADD *VRSOF,XR POINT TO POSSIBLE STRING NAME ! 20806: BNZ SCLEN(XR),PRVN1 JUMP IF NOT SYSTEM VARIABLE ! 20807: MOV VRSVO(XR),XR POINT TO SVBLK WITH NAME ! 20808: * ! 20809: * MERGE HERE WITH DUMMY SCBLK POINTER IN XR ! 20810: * ! 20811: PRVN1 JSR PRTST PRINT STRING NAME OF VARIABLE ! 20812: MOV (XS)+,XR RESTORE VRBLK POINTER ! 20813: EXI RETURN TO PRTVN CALLER ! 20814: ENP END PROCEDURE PRTVN ! 20815: .IF .CNRA ! 20816: .ELSE ! 20817: EJC ! 20818: * ! 20819: * RCBLD -- BUILD A REAL BLOCK ! 20820: * ! 20821: * (RA) REAL VALUE FOR RCBLK ! 20822: * JSR RCBLD CALL TO BUILD REAL BLOCK ! 20823: * (XR) POINTER TO RESULT RCBLK ! 20824: * (WA) DESTROYED ! 20825: * ! 20826: RCBLD PRC E,0 ENTRY POINT ! 20827: MOV DNAMP,XR LOAD POINTER TO NEXT AVAILABLE LOC ! 20828: ADD *RCSI$,XR POINT PAST NEW RCBLK ! 20829: BLO XR,DNAME,RCBL1 JUMP IF THERE IS ROOM ! 20830: MOV *RCSI$,WA ELSE LOAD RCBLK LENGTH ! 20831: JSR ALLOC USE STANDARD ALLOCATOR TO GET BLOCK ! 20832: ADD WA,XR POINT PAST BLOCK TO MERGE ! 20833: * ! 20834: * MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED ! 20835: * ! 20836: RCBL1 MOV XR,DNAMP SET NEW POINTER ! 20837: SUB *RCSI$,XR POINT BACK TO START OF BLOCK ! 20838: MOV =B$RCL,(XR) STORE TYPE WORD ! 20839: STR RCVAL(XR) STORE REAL VALUE IN RCBLK ! 20840: EXI RETURN TO RCBLD CALLER ! 20841: ENP END PROCEDURE RCBLD ! 20842: .FI ! 20843: EJC ! 20844: * ! 20845: * READR -- READ NEXT SOURCE IMAGE AT COMPILE TIME ! 20846: * ! 20847: * READR IS USED TO READ THE NEXT SOURCE IMAGE. TO PROCESS ! 20848: * CONTINUATION CARDS PROPERLY, THE COMPILER MUST READ ONE ! 20849: * LINE AHEAD. THUS READR DOES NOT DESTROY THE CURRENT IMAGE ! 20850: * SEE ALSO THE NEXTS ROUTINE WHICH ACTUALLY GETS THE IMAGE. ! 20851: * ! 20852: * JSR READR CALL TO READ NEXT IMAGE ! 20853: * (XR) PTR TO NEXT IMAGE (0 IF NONE) ! 20854: * (R$CNI) COPY OF POINTER ! 20855: * (WA,WB,WC,XL) DESTROYED ! 20856: * ! 20857: READR PRC E,0 ENTRY POINT ! 20858: MOV R$CNI,XR GET PTR TO NEXT IMAGE ! 20859: BNZ XR,READ3 EXIT IF ALREADY READ ! 20860: BNE STAGE,=STGIC,READ3 EXIT IF NOT INITIAL COMPILE ! 20861: MOV CSWIN,WA MAX READ LENGTH ! 20862: JSR ALOCS ALLOCATE BUFFER ! 20863: JSR SYSRD READ INPUT IMAGE ! 20864: PPM READ4 JUMP IF END OF FILE ! 20865: MNZ WB SET TRIMR TO PERFORM TRIM ! 20866: BLE SCLEN(XR),CSWIN,READ1 USE SMALLER OF STRING LNTH .. ! 20867: MOV CSWIN,SCLEN(XR) ... AND XXX OF -INXXX ! 20868: * ! 20869: * PERFORM THE TRIM ! 20870: * ! 20871: READ1 JSR TRIMR TRIM TRAILING BLANKS ! 20872: * ! 20873: * MERGE HERE AFTER READ ! 20874: * ! 20875: READ2 MOV XR,R$CNI STORE COPY OF POINTER ! 20876: * ! 20877: * MERGE HERE IF NO READ ATTEMPTED ! 20878: * ! 20879: READ3 EXI RETURN TO READR CALLER ! 20880: * ! 20881: * HERE ON END OF FILE ! 20882: * ! 20883: READ4 MOV XR,DNAMP POP UNUSED SCBLK ! 20884: ZER XR ZERO PTR AS RESULT ! 20885: BRN READ2 MERGE ! 20886: ENP END PROCEDURE READR ! 20887: EJC ! 20888: * ! 20889: * SBSTR -- BUILD A SUBSTRING ! 20890: * ! 20891: * (XL) PTR TO SCBLK/BFBLK WITH CHARS ! 20892: * (WA) NUMBER OF CHARS IN SUBSTRING ! 20893: * (WB) OFFSET TO FIRST CHAR IN SCBLK ! 20894: * JSR SBSTR CALL TO BUILD SUBSTRING ! 20895: * (XR) PTR TO NEW SCBLK WITH SUBSTRING ! 20896: * (XL) ZERO ! 20897: * (WA,WB,WC,XL,IA) DESTROYED ! 20898: * ! 20899: * NOTE THAT SBSTR IS CALLED WITH A DUMMY STRING POINTER ! 20900: * (POINTING INTO A VRBLK OR SVBLK) TO COPY THE NAME OF A ! 20901: * VARIABLE AS A STANDARD STRING VALUE. ! 20902: * ! 20903: SBSTR PRC E,0 ENTRY POINT ! 20904: BZE WA,SBST2 JUMP IF NULL SUBSTRING ! 20905: JSR ALOCS ELSE ALLOCATE SCBLK ! 20906: MOV WC,WA MOVE NUMBER OF CHARACTERS ! 20907: MOV XR,WC SAVE PTR TO NEW SCBLK ! 20908: PLC XL,WB PREPARE TO LOAD CHARS FROM OLD BLK ! 20909: PSC XR PREPARE TO STORE CHARS IN NEW BLK ! 20910: MVC MOVE CHARACTERS TO NEW STRING ! 20911: MOV WC,XR THEN RESTORE SCBLK POINTER ! 20912: * ! 20913: * RETURN POINT ! 20914: * ! 20915: SBST1 ZER XL CLEAR GARBAGE POINTER IN XL ! 20916: EXI RETURN TO SBSTR CALLER ! 20917: * ! 20918: * HERE FOR NULL SUBSTRING ! 20919: * ! 20920: SBST2 MOV =NULLS,XR SET NULL STRING AS RESULT ! 20921: BRN SBST1 RETURN ! 20922: ENP END PROCEDURE SBSTR ! 20923: EJC ! 20924: * ! 20925: * SCANE -- SCAN AN ELEMENT ! 20926: * ! 20927: * SCANE IS CALLED AT COMPILE TIME (BY EXPAN ,CMPIL,CNCRD) ! 20928: * TO SCAN ONE ELEMENT FROM THE INPUT IMAGE. ! 20929: * ! 20930: * (SCNCC) NON-ZERO IF CALLED FROM CNCRD ! 20931: * JSR SCANE CALL TO SCAN ELEMENT ! 20932: * (XR) RESULT POINTER (SEE BELOW) ! 20933: * (XL) SYNTAX TYPE CODE (T$XXX) ! 20934: * ! 20935: * THE FOLLOWING GLOBAL LOCATIONS ARE USED. ! 20936: * ! 20937: * R$CIM POINTER TO STRING BLOCK (SCBLK) ! 20938: * FOR CURRENT INPUT IMAGE. ! 20939: * ! 20940: * R$CNI POINTER TO NEXT INPUT IMAGE STRING ! 20941: * POINTER (ZERO IF NONE). ! 20942: * ! 20943: * R$SCP SAVE POINTER (EXIT XR) FROM LAST ! 20944: * CALL IN CASE RESCAN IS SET. ! 20945: * ! 20946: * SCNBL THIS LOCATION IS SET NON-ZERO ON ! 20947: * EXIT IF SCANE SCANNED PAST BLANKS ! 20948: * BEFORE LOCATING THE CURRENT ELEMENT ! 20949: * THE END OF A LINE COUNTS AS BLANKS. ! 20950: * ! 20951: * SCNCC CNCRD SETS THIS NON-ZERO TO SCAN ! 20952: * CONTROL CARD NAMES AND CLEARS IT ! 20953: * ON RETURN ! 20954: * ! 20955: * SCNIL LENGTH OF CURRENT INPUT IMAGE ! 20956: * ! 20957: * SCNGO IF SET NON-ZERO ON ENTRY, F AND S ! 20958: * ARE RETURNED AS SEPARATE SYNTAX ! 20959: * TYPES (NOT LETTERS) (GOTO PRO- ! 20960: * CESSING). SCNGO IS RESET ON EXIT. ! 20961: * ! 20962: * SCNPT OFFSET TO CURRENT LOC IN R$CIM ! 20963: * ! 20964: * SCNRS IF SET NON-ZERO ON ENTRY, SCANE ! 20965: * RETURNS THE SAME RESULT AS ON THE ! 20966: * LAST CALL (RESCAN). SCNRS IS RESET ! 20967: * ON EXIT FROM ANY CALL TO SCANE. ! 20968: * ! 20969: * SCNTP SAVE SYNTAX TYPE FROM LAST ! 20970: * CALL (IN CASE RESCAN IS SET). ! 20971: EJC ! 20972: * ! 20973: * SCANE (CONTINUED) ! 20974: * ! 20975: * ! 20976: * ! 20977: * ELEMENT SCANNED XL XR ! 20978: * --------------- -- -- ! 20979: * ! 20980: * CONTROL CARD NAME 0 POINTER TO SCBLK FOR NAME ! 20981: * ! 20982: * UNARY OPERATOR T$UOP PTR TO OPERATOR DVBLK ! 20983: * ! 20984: * LEFT PAREN T$LPR T$LPR ! 20985: * ! 20986: * LEFT BRACKET T$LBR T$LBR ! 20987: * ! 20988: * COMMA T$CMA T$CMA ! 20989: * ! 20990: * FUNCTION CALL T$FNC PTR TO FUNCTION VRBLK ! 20991: * ! 20992: * VARIABLE T$VAR PTR TO VRBLK ! 20993: * ! 20994: * STRING CONSTANT T$CON PTR TO SCBLK ! 20995: * ! 20996: * INTEGER CONSTANT T$CON PTR TO ICBLK ! 20997: * ! 20998: .IF .CNRA ! 20999: .ELSE ! 21000: * REAL CONSTANT T$CON PTR TO RCBLK ! 21001: * ! 21002: .FI ! 21003: * BINARY OPERATOR T$BOP PTR TO OPERATOR DVBLK ! 21004: * ! 21005: * RIGHT PAREN T$RPR T$RPR ! 21006: * ! 21007: * RIGHT BRACKET T$RBR T$RBR ! 21008: * ! 21009: * COLON T$COL T$COL ! 21010: * ! 21011: * SEMI-COLON T$SMC T$SMC ! 21012: * ! 21013: * F (SCNGO NE 0) T$FGO T$FGO ! 21014: * ! 21015: * S (SCNGO NE 0) T$SGO T$SGO ! 21016: EJC ! 21017: * ! 21018: * SCANE (CONTINUED) ! 21019: * ! 21020: * ENTRY POINT ! 21021: * ! 21022: SCANE PRC E,0 ENTRY POINT ! 21023: ZER SCNBL RESET BLANKS FLAG ! 21024: MOV WA,SCNSA SAVE WA ! 21025: MOV WB,SCNSB SAVE WB ! 21026: MOV WC,SCNSC SAVE WC ! 21027: BZE SCNRS,SCN03 JUMP IF NO RESCAN ! 21028: * ! 21029: * HERE FOR RESCAN REQUEST ! 21030: * ! 21031: MOV SCNTP,XL SET PREVIOUS RETURNED SCAN TYPE ! 21032: MOV R$SCP,XR SET PREVIOUS RETURNED POINTER ! 21033: ZER SCNRS RESET RESCAN SWITCH ! 21034: BRN SCN13 JUMP TO EXIT ! 21035: * ! 21036: * COME HERE TO READ NEW IMAGE TO TEST FOR CONTINUATION ! 21037: * ! 21038: SCN01 JSR READR READ NEXT IMAGE ! 21039: MOV *DVUBS,WB SET WB FOR NOT READING NAME ! 21040: BZE XR,SCN30 TREAT AS SEMI-COLON IF NONE ! 21041: PLC XR ELSE POINT TO FIRST CHARACTER ! 21042: LCH WC,(XR) LOAD FIRST CHARACTER ! 21043: BEQ WC,=CH$DT,SCN02 JUMP IF DOT FOR CONTINUATION ! 21044: BNE WC,=CH$PL,SCN30 ELSE TREAT AS SEMICOLON UNLESS PLUS ! 21045: * ! 21046: * HERE FOR CONTINUATION LINE ! 21047: * ! 21048: SCN02 JSR NEXTS ACQUIRE NEXT SOURCE IMAGE ! 21049: MOV =NUM01,SCNPT SET SCAN POINTER PAST CONTINUATION ! 21050: MNZ SCNBL SET BLANKS FLAG ! 21051: EJC ! 21052: * ! 21053: * SCANE (CONTINUED) ! 21054: * ! 21055: * MERGE HERE TO SCAN NEXT ELEMENT ON CURRENT LINE ! 21056: * ! 21057: SCN03 MOV SCNPT,WA LOAD CURRENT OFFSET ! 21058: BEQ WA,SCNIL,SCN01 CHECK CONTINUATION IF END ! 21059: MOV R$CIM,XL POINT TO CURRENT LINE ! 21060: PLC XL,WA POINT TO CURRENT CHARACTER ! 21061: MOV WA,SCNSE SET START OF ELEMENT LOCATION ! 21062: MOV =OPDVS,WC POINT TO OPERATOR DV LIST ! 21063: MOV *DVUBS,WB SET CONSTANT FOR OPERATOR CIRCUIT ! 21064: BRN SCN06 START SCANNING ! 21065: * ! 21066: * LOOP HERE TO IGNORE LEADING BLANKS AND TABS ! 21067: * ! 21068: SCN05 BZE WB,SCN10 JUMP IF TRAILING ! 21069: ICV SCNSE INCREMENT START OF ELEMENT ! 21070: BEQ WA,SCNIL,SCN01 JUMP IF END OF IMAGE ! 21071: MNZ SCNBL NOTE BLANKS SEEN ! 21072: * ! 21073: * THE FOLLOWING JUMP IS USED REPEATEDLY FOR SCANNING OUT ! 21074: * THE CHARACTERS OF A NUMERIC CONSTANT OR VARIABLE NAME. ! 21075: * THE REGISTERS ARE USED AS FOLLOWS. ! 21076: * ! 21077: * (XR) SCRATCH ! 21078: * (XL) PTR TO NEXT CHARACTER ! 21079: * (WA) CURRENT SCAN OFFSET ! 21080: * (WB) *DVUBS (0 IF SCANNING NAME,CONST) ! 21081: * (WC) =OPDVS (0 IF SCANNING CONSTANT) ! 21082: * ! 21083: SCN06 LCH XR,(XL)+ GET NEXT CHARACTER ! 21084: ICV WA BUMP SCAN OFFSET ! 21085: MOV WA,SCNPT STORE OFFSET PAST CHAR SCANNED ! 21086: .IF .CUCF ! 21087: BLO =CFP$U,XR,SCN07 QUICK CHECK FOR OTHER CHAR ! 21088: BSW XR,CFP$U,SCN07 SWITCH ON SCANNED CHARACTER ! 21089: .ELSE ! 21090: BSW XR,CFP$A,SCN07 SWITCH ON SCANNED CHARACTER ! 21091: .FI ! 21092: * ! 21093: * SWITCH TABLE FOR SWITCH ON CHARACTER ! 21094: * ! 21095: IFF CH$BL,SCN05 BLANK ! 21096: .IF .CAHT ! 21097: IFF CH$HT,SCN05 HORIZONTAL TAB ! 21098: .FI ! 21099: .IF .CAVT ! 21100: IFF CH$VT,SCN05 VERTICAL TAB ! 21101: .FI ! 21102: IFF CH$D0,SCN08 DIGIT 0 ! 21103: IFF CH$D1,SCN08 DIGIT 1 ! 21104: IFF CH$D2,SCN08 DIGIT 2 ! 21105: IFF CH$D3,SCN08 DIGIT 3 ! 21106: IFF CH$D4,SCN08 DIGIT 4 ! 21107: IFF CH$D5,SCN08 DIGIT 5 ! 21108: IFF CH$D6,SCN08 DIGIT 6 ! 21109: IFF CH$D7,SCN08 DIGIT 7 ! 21110: IFF CH$D8,SCN08 DIGIT 8 ! 21111: IFF CH$D9,SCN08 DIGIT 9 ! 21112: EJC ! 21113: * ! 21114: * SCANE (CONTINUED) ! 21115: * ! 21116: IFF CH$LA,SCN09 LETTER A ! 21117: IFF CH$LB,SCN09 LETTER B ! 21118: IFF CH$LC,SCN09 LETTER C ! 21119: IFF CH$LD,SCN09 LETTER D ! 21120: IFF CH$LE,SCN09 LETTER E ! 21121: IFF CH$LG,SCN09 LETTER G ! 21122: IFF CH$LH,SCN09 LETTER H ! 21123: IFF CH$LI,SCN09 LETTER I ! 21124: IFF CH$LJ,SCN09 LETTER J ! 21125: IFF CH$LK,SCN09 LETTER K ! 21126: IFF CH$LL,SCN09 LETTER L ! 21127: IFF CH$LM,SCN09 LETTER M ! 21128: IFF CH$LN,SCN09 LETTER N ! 21129: IFF CH$LO,SCN09 LETTER O ! 21130: IFF CH$LP,SCN09 LETTER P ! 21131: IFF CH$LQ,SCN09 LETTER Q ! 21132: IFF CH$LR,SCN09 LETTER R ! 21133: IFF CH$LT,SCN09 LETTER T ! 21134: IFF CH$LU,SCN09 LETTER U ! 21135: IFF CH$LV,SCN09 LETTER V ! 21136: IFF CH$LW,SCN09 LETTER W ! 21137: IFF CH$LX,SCN09 LETTER X ! 21138: IFF CH$LY,SCN09 LETTER Y ! 21139: IFF CH$L$,SCN09 LETTER Z ! 21140: .IF .CASL ! 21141: IFF CH$$A,SCN09 SHIFTED A ! 21142: IFF CH$$B,SCN09 SHIFTED B ! 21143: IFF CH$$C,SCN09 SHIFTED C ! 21144: IFF CH$$D,SCN09 SHIFTED D ! 21145: IFF CH$$E,SCN09 SHIFTED E ! 21146: IFF CH$$F,SCN20 SHIFTED F ! 21147: IFF CH$$G,SCN09 SHIFTED G ! 21148: IFF CH$$H,SCN09 SHIFTED H ! 21149: IFF CH$$I,SCN09 SHIFTED I ! 21150: IFF CH$$J,SCN09 SHIFTED J ! 21151: IFF CH$$K,SCN09 SHIFTED K ! 21152: IFF CH$$L,SCN09 SHIFTED L ! 21153: IFF CH$$M,SCN09 SHIFTED M ! 21154: IFF CH$$N,SCN09 SHIFTED N ! 21155: IFF CH$$O,SCN09 SHIFTED O ! 21156: IFF CH$$P,SCN09 SHIFTED P ! 21157: IFF CH$$Q,SCN09 SHIFTED Q ! 21158: IFF CH$$R,SCN09 SHIFTED R ! 21159: IFF CH$$S,SCN21 SHIFTED S ! 21160: IFF CH$$T,SCN09 SHIFTED T ! 21161: IFF CH$$U,SCN09 SHIFTED U ! 21162: IFF CH$$V,SCN09 SHIFTED V ! 21163: IFF CH$$W,SCN09 SHIFTED W ! 21164: IFF CH$$X,SCN09 SHIFTED X ! 21165: IFF CH$$Y,SCN09 SHIFTED Y ! 21166: IFF CH$$$,SCN09 SHIFTED Z ! 21167: .FI ! 21168: EJC ! 21169: * ! 21170: * SCANE (CONTINUED) ! 21171: * ! 21172: IFF CH$SQ,SCN16 SINGLE QUOTE ! 21173: IFF CH$DQ,SCN17 DOUBLE QUOTE ! 21174: IFF CH$LF,SCN20 LETTER F ! 21175: IFF CH$LS,SCN21 LETTER S ! 21176: IFF CH$UN,SCN24 UNDERLINE ! 21177: IFF CH$PP,SCN25 LEFT PAREN ! 21178: IFF CH$RP,SCN26 RIGHT PAREN ! 21179: IFF CH$RB,SCN27 RIGHT BRACKET ! 21180: IFF CH$BB,SCN28 LEFT BRACKET ! 21181: IFF CH$CB,SCN27 RIGHT BRACKET ! 21182: IFF CH$OB,SCN28 LEFT BRACKET ! 21183: IFF CH$CL,SCN29 COLON ! 21184: IFF CH$SM,SCN30 SEMI-COLON ! 21185: IFF CH$CM,SCN31 COMMA ! 21186: IFF CH$DT,SCN32 DOT ! 21187: IFF CH$PL,SCN33 PLUS ! 21188: IFF CH$MN,SCN34 MINUS ! 21189: IFF CH$NT,SCN35 NOT ! 21190: IFF CH$DL,SCN36 DOLLAR ! 21191: IFF CH$EX,SCN37 EXCLAMATION MARK ! 21192: IFF CH$PC,SCN38 PERCENT ! 21193: IFF CH$SL,SCN40 SLASH ! 21194: IFF CH$NM,SCN41 NUMBER SIGN ! 21195: IFF CH$AT,SCN42 AT ! 21196: IFF CH$BR,SCN43 VERTICAL BAR ! 21197: IFF CH$AM,SCN44 AMPERSAND ! 21198: IFF CH$QU,SCN45 QUESTION MARK ! 21199: IFF CH$EQ,SCN46 EQUAL ! 21200: IFF CH$AS,SCN49 ASTERISK ! 21201: ESW END SWITCH ON CHARACTER ! 21202: * ! 21203: * HERE FOR ILLEGAL CHARACTER (UNDERLINE MERGES) ! 21204: * ! 21205: SCN07 BZE WB,SCN10 JUMP IF SCANNING NAME OR CONSTANT ! 21206: ERB 230,SYNTAX ERROR. ILLEGAL CHARACTER ! 21207: EJC ! 21208: * ! 21209: * SCANE (CONTINUED) ! 21210: * ! 21211: * HERE FOR DIGITS 0-9 ! 21212: * ! 21213: SCN08 BZE WB,SCN09 KEEP SCANNING IF NAME/CONSTANT ! 21214: ZER WC ELSE SET FLAG FOR SCANNING CONSTANT ! 21215: * ! 21216: * HERE FOR LETTER. LOOP HERE WHEN SCANNING NAME/CONSTANT ! 21217: * ! 21218: SCN09 BEQ WA,SCNIL,SCN11 JUMP IF END OF IMAGE ! 21219: ZER WB SET FLAG FOR SCANNING NAME/CONST ! 21220: BRN SCN06 MERGE BACK TO CONTINUE SCAN ! 21221: * ! 21222: * COME HERE FOR DELIMITER ENDING NAME OR CONSTANT ! 21223: * ! 21224: SCN10 DCV WA RESET OFFSET TO POINT TO DELIMITER ! 21225: * ! 21226: * COME HERE AFTER FINISHING SCAN OF NAME OR CONSTANT ! 21227: * ! 21228: SCN11 MOV WA,SCNPT STORE UPDATED SCAN OFFSET ! 21229: MOV SCNSE,WB POINT TO START OF ELEMENT ! 21230: SUB WB,WA GET NUMBER OF CHARACTERS ! 21231: MOV R$CIM,XL POINT TO LINE IMAGE ! 21232: BNZ WC,SCN15 JUMP IF NAME ! 21233: * ! 21234: * HERE AFTER SCANNING OUT NUMERIC CONSTANT ! 21235: * ! 21236: JSR SBSTR GET STRING FOR CONSTANT ! 21237: MOV XR,DNAMP DELETE FROM STORAGE (NOT NEEDED) ! 21238: JSR GTNUM CONVERT TO NUMERIC ! 21239: PPM SCN14 JUMP IF CONVERSION FAILURE ! 21240: * ! 21241: * MERGE HERE TO EXIT WITH CONSTANT ! 21242: * ! 21243: SCN12 MOV =T$CON,XL SET RESULT TYPE OF CONSTANT ! 21244: EJC ! 21245: * ! 21246: * SCANE (CONTINUED) ! 21247: * ! 21248: * COMMON EXIT POINT (XR,XL) SET ! 21249: * ! 21250: SCN13 MOV SCNSA,WA RESTORE WA ! 21251: MOV SCNSB,WB RESTORE WB ! 21252: MOV SCNSC,WC RESTORE WC ! 21253: MOV XR,R$SCP SAVE XR IN CASE RESCAN ! 21254: MOV XL,SCNTP SAVE XL IN CASE RESCAN ! 21255: ZER SCNGO RESET POSSIBLE GOTO FLAG ! 21256: EXI RETURN TO SCANE CALLER ! 21257: * ! 21258: * HERE IF CONVERSION ERROR ON NUMERIC ITEM ! 21259: * ! 21260: SCN14 ERB 231,SYNTAX ERROR. INVALID NUMERIC ITEM ! 21261: * ! 21262: * HERE AFTER SCANNING OUT VARIABLE NAME ! 21263: * ! 21264: SCN15 JSR SBSTR BUILD STRING NAME OF VARIABLE ! 21265: BNZ SCNCC,SCN13 RETURN IF CNCRD CALL ! 21266: JSR GTNVR LOCATE/BUILD VRBLK ! 21267: PPM DUMMY (UNUSED) ERROR RETURN ! 21268: MOV =T$VAR,XL SET TYPE AS VARIABLE ! 21269: BRN SCN13 BACK TO EXIT ! 21270: * ! 21271: * HERE FOR SINGLE QUOTE (START OF STRING CONSTANT) ! 21272: * ! 21273: SCN16 BZE WB,SCN10 TERMINATOR IF SCANNING NAME OR CNST ! 21274: MOV =CH$SQ,WB SET TERMINATOR AS SINGLE QUOTE ! 21275: BRN SCN18 MERGE ! 21276: * ! 21277: * HERE FOR DOUBLE QUOTE (START OF STRING CONSTANT) ! 21278: * ! 21279: SCN17 BZE WB,SCN10 TERMINATOR IF SCANNING NAME OR CNST ! 21280: MOV =CH$DQ,WB SET DOUBLE QUOTE TERMINATOR, MERGE ! 21281: * ! 21282: * LOOP TO SCAN OUT STRING CONSTANT ! 21283: * ! 21284: SCN18 BEQ WA,SCNIL,SCN19 ERROR IF END OF IMAGE ! 21285: LCH WC,(XL)+ ELSE LOAD NEXT CHARACTER ! 21286: ICV WA BUMP OFFSET ! 21287: BNE WC,WB,SCN18 LOOP BACK IF NOT TERMINATOR ! 21288: EJC ! 21289: * ! 21290: * SCANE (CONTINUED) ! 21291: * ! 21292: * HERE AFTER SCANNING OUT STRING CONSTANT ! 21293: * ! 21294: MOV SCNPT,WB POINT TO FIRST CHARACTER ! 21295: MOV WA,SCNPT SAVE OFFSET PAST FINAL QUOTE ! 21296: DCV WA POINT BACK PAST LAST CHARACTER ! 21297: SUB WB,WA GET NUMBER OF CHARACTERS ! 21298: MOV R$CIM,XL POINT TO INPUT IMAGE ! 21299: JSR SBSTR BUILD SUBSTRING VALUE ! 21300: BRN SCN12 BACK TO EXIT WITH CONSTANT RESULT ! 21301: * ! 21302: * HERE IF NO MATCHING QUOTE FOUND ! 21303: * ! 21304: SCN19 MOV WA,SCNPT SET UPDATED SCAN POINTER ! 21305: ERB 232,SYNTAX ERROR. UNMATCHED STRING QUOTE ! 21306: * ! 21307: * HERE FOR F (POSSIBLE FAILURE GOTO) ! 21308: * ! 21309: SCN20 MOV =T$FGO,XR SET RETURN CODE FOR FAIL GOTO ! 21310: BRN SCN22 JUMP TO MERGE ! 21311: * ! 21312: * HERE FOR S (POSSIBLE SUCCESS GOTO) ! 21313: * ! 21314: SCN21 MOV =T$SGO,XR SET SUCCESS GOTO AS RETURN CODE ! 21315: * ! 21316: * SPECIAL GOTO CASES MERGE HERE ! 21317: * ! 21318: SCN22 BZE SCNGO,SCN09 TREAT AS NORMAL LETTER IF NOT GOTO ! 21319: * ! 21320: * MERGE HERE FOR SPECIAL CHARACTER EXIT ! 21321: * ! 21322: SCN23 BZE WB,SCN10 JUMP IF END OF NAME/CONSTANT ! 21323: MOV XR,XL ELSE COPY CODE ! 21324: BRN SCN13 AND JUMP TO EXIT ! 21325: * ! 21326: * HERE FOR UNDERLINE ! 21327: * ! 21328: SCN24 BZE WB,SCN09 PART OF NAME IF SCANNING NAME ! 21329: BRN SCN07 ELSE ILLEGAL ! 21330: EJC ! 21331: * ! 21332: * SCANE (CONTINUED) ! 21333: * ! 21334: * HERE FOR LEFT PAREN ! 21335: * ! 21336: SCN25 MOV =T$LPR,XR SET LEFT PAREN RETURN CODE ! 21337: BNZ WB,SCN23 RETURN LEFT PAREN UNLESS NAME ! 21338: BZE WC,SCN10 DELIMITER IF SCANNING CONSTANT ! 21339: * ! 21340: * HERE FOR LEFT PAREN AFTER NAME (FUNCTION CALL) ! 21341: * ! 21342: MOV SCNSE,WB POINT TO START OF NAME ! 21343: MOV WA,SCNPT SET POINTER PAST LEFT PAREN ! 21344: DCV WA POINT BACK PAST LAST CHAR OF NAME ! 21345: SUB WB,WA GET NAME LENGTH ! 21346: MOV R$CIM,XL POINT TO INPUT IMAGE ! 21347: JSR SBSTR GET STRING NAME FOR FUNCTION ! 21348: JSR GTNVR LOCATE/BUILD VRBLK ! 21349: PPM DUMMY (UNUSED) ERROR RETURN ! 21350: MOV =T$FNC,XL SET CODE FOR FUNCTION CALL ! 21351: BRN SCN13 BACK TO EXIT ! 21352: * ! 21353: * PROCESSING FOR SPECIAL CHARACTERS ! 21354: * ! 21355: SCN26 MOV =T$RPR,XR RIGHT PAREN, SET CODE ! 21356: BRN SCN23 TAKE SPECIAL CHARACTER EXIT ! 21357: * ! 21358: SCN27 MOV =T$RBR,XR RIGHT BRACKET, SET CODE ! 21359: BRN SCN23 TAKE SPECIAL CHARACTER EXIT ! 21360: * ! 21361: SCN28 MOV =T$LBR,XR LEFT BRACKET, SET CODE ! 21362: BRN SCN23 TAKE SPECIAL CHARACTER EXIT ! 21363: * ! 21364: SCN29 MOV =T$COL,XR COLON, SET CODE ! 21365: BRN SCN23 TAKE SPECIAL CHARACTER EXIT ! 21366: * ! 21367: SCN30 MOV =T$SMC,XR SEMI-COLON, SET CODE ! 21368: BRN SCN23 TAKE SPECIAL CHARACTER EXIT ! 21369: * ! 21370: SCN31 MOV =T$CMA,XR COMMA, SET CODE ! 21371: BRN SCN23 TAKE SPECIAL CHARACTER EXIT ! 21372: EJC ! 21373: * ! 21374: * SCANE (CONTINUED) ! 21375: * ! 21376: * HERE FOR OPERATORS. ON ENTRY, WC POINTS TO THE TABLE OF ! 21377: * OPERATOR DOPE VECTORS AND WB IS THE INCREMENT TO STEP ! 21378: * TO THE NEXT PAIR (BINARY/UNARY) OF DOPE VECTORS IN THE ! 21379: * LIST. ON REACHING SCN46, THE POINTER HAS BEEN ADJUSTED TO ! 21380: * POINT TO THE APPROPRIATE PAIR OF DOPE VECTORS. ! 21381: * THE FIRST THREE ENTRIES ARE SPECIAL SINCE THEY CAN OCCUR ! 21382: * AS PART OF A VARIABLE NAME (.) OR CONSTANT (.+-). ! 21383: * ! 21384: SCN32 BZE WB,SCN09 DOT CAN BE PART OF NAME OR CONSTANT ! 21385: ADD WB,WC ELSE BUMP POINTER ! 21386: * ! 21387: SCN33 BZE WC,SCN09 PLUS CAN BE PART OF CONSTANT ! 21388: BZE WB,SCN48 PLUS CANNOT BE PART OF NAME ! 21389: ADD WB,WC ELSE BUMP POINTER ! 21390: * ! 21391: SCN34 BZE WC,SCN09 MINUS CAN BE PART OF CONSTANT ! 21392: BZE WB,SCN48 MINUS CANNOT BE PART OF NAME ! 21393: ADD WB,WC ELSE BUMP POINTER ! 21394: * ! 21395: SCN35 ADD WB,WC NOT ! 21396: SCN36 ADD WB,WC DOLLAR ! 21397: SCN37 ADD WB,WC EXCLAMATION ! 21398: SCN38 ADD WB,WC PERCENT ! 21399: SCN39 ADD WB,WC ASTERISK ! 21400: SCN40 ADD WB,WC SLASH ! 21401: SCN41 ADD WB,WC NUMBER SIGN ! 21402: SCN42 ADD WB,WC AT SIGN ! 21403: SCN43 ADD WB,WC VERTICAL BAR ! 21404: SCN44 ADD WB,WC AMPERSAND ! 21405: SCN45 ADD WB,WC QUESTION MARK ! 21406: * ! 21407: * ALL OPERATORS COME HERE (EQUAL MERGES DIRECTLY) ! 21408: * (WC) POINTS TO THE BINARY/UNARY PAIR OF OPERATOR DVBLKS. ! 21409: * ! 21410: SCN46 BZE WB,SCN10 OPERATOR TERMINATES NAME/CONSTANT ! 21411: MOV WC,XR ELSE COPY DV POINTER ! 21412: LCH WC,(XL) LOAD NEXT CHARACTER ! 21413: MOV =T$BOP,XL SET BINARY OP IN CASE ! 21414: BEQ WA,SCNIL,SCN47 SHOULD BE BINARY IF IMAGE END ! 21415: BEQ WC,=CH$BL,SCN47 SHOULD BE BINARY IF FOLLOWED BY BLK ! 21416: .IF .CAHT ! 21417: BEQ WC,=CH$HT,SCN47 JUMP IF HORIZONTAL TAB ! 21418: .FI ! 21419: .IF .CAVT ! 21420: BEQ WC,=CH$VT,SCN47 JUMP IF VERTICAL TAB ! 21421: .FI ! 21422: BEQ WC,=CH$SM,SCN47 SEMICOLON CAN IMMEDIATELY FOLLOW = ! 21423: * ! 21424: * HERE FOR UNARY OPERATOR ! 21425: * ! 21426: ADD *DVBS$,XR POINT TO DV FOR UNARY OP ! 21427: MOV =T$UOP,XL SET TYPE FOR UNARY OPERATOR ! 21428: BLE SCNTP,=T$UOK,SCN13 OK UNARY IF OK PRECEDING ELEMENT ! 21429: EJC ! 21430: * ! 21431: * SCANE (CONTINUED) ! 21432: * ! 21433: * MERGE HERE TO REQUIRE PRECEDING BLANKS ! 21434: * ! 21435: SCN47 BNZ SCNBL,SCN13 ALL OK IF PRECEDING BLANKS, EXIT ! 21436: * ! 21437: * FAIL OPERATOR IN THIS POSITION ! 21438: * ! 21439: SCN48 ERB 233,SYNTAX ERROR. INVALID USE OF OPERATOR ! 21440: * ! 21441: * HERE FOR ASTERISK, COULD BE ** SUBSTITUTE FOR EXCLAMATION ! 21442: * ! 21443: SCN49 BZE WB,SCN10 END OF NAME IF SCANNING NAME ! 21444: BEQ WA,SCNIL,SCN39 NOT ** IF * AT IMAGE END ! 21445: MOV WA,XR ELSE SAVE OFFSET PAST FIRST * ! 21446: MOV WA,SCNOF SAVE ANOTHER COPY ! 21447: LCH WA,(XL)+ LOAD NEXT CHARACTER ! 21448: BNE WA,=CH$AS,SCN50 NOT ** IF NEXT CHAR NOT * ! 21449: ICV XR ELSE STEP OFFSET PAST SECOND * ! 21450: BEQ XR,SCNIL,SCN51 OK EXCLAM IF END OF IMAGE ! 21451: LCH WA,(XL) ELSE LOAD NEXT CHARACTER ! 21452: BEQ WA,=CH$BL,SCN51 EXCLAMATION IF BLANK ! 21453: .IF .CAHT ! 21454: BEQ WA,=CH$HT,SCN51 EXCLAMATION IF HORIZONTAL TAB ! 21455: .FI ! 21456: .IF .CAVT ! 21457: BEQ WA,=CH$VT,SCN51 EXCLAMATION IF VERTICAL TAB ! 21458: .FI ! 21459: * ! 21460: * UNARY * ! 21461: * ! 21462: SCN50 MOV SCNOF,WA RECOVER STORED OFFSET ! 21463: MOV R$CIM,XL POINT TO LINE AGAIN ! 21464: PLC XL,WA POINT TO CURRENT CHAR ! 21465: BRN SCN39 MERGE WITH UNARY * ! 21466: * ! 21467: * HERE FOR ** AS SUBSTITUTE FOR EXCLAMATION ! 21468: * ! 21469: SCN51 MOV XR,SCNPT SAVE SCAN POINTER PAST 2ND * ! 21470: MOV XR,WA COPY SCAN POINTER ! 21471: BRN SCN37 MERGE WITH EXCLAMATION ! 21472: ENP END PROCEDURE SCANE ! 21473: EJC ! 21474: * ! 21475: * SCNGF -- SCAN GOTO FIELD ! 21476: * ! 21477: * SCNGF IS CALLED FROM CMPIL TO SCAN AND ANALYZE A GOTO ! 21478: * FIELD INCLUDING THE SURROUNDING BRACKETS OR PARENTHESES. ! 21479: * FOR A NORMAL GOTO, THE RESULT RETURNED IS EITHER A VRBLK ! 21480: * POINTER FOR A SIMPLE LABEL OPERAND, OR A POINTER TO AN ! 21481: * EXPRESSION TREE WITH A SPECIAL OUTER UNARY OPERATOR ! 21482: * (O$GOC). FOR A DIRECT GOTO, THE RESULT RETURNED IS A ! 21483: * POINTER TO AN EXPRESSION TREE WITH THE SPECIAL OUTER ! 21484: * UNARY OPERATOR O$GOD. ! 21485: * ! 21486: * JSR SCNGF CALL TO SCAN GOTO FIELD ! 21487: * (XR) RESULT (SEE ABOVE) ! 21488: * (XL,WA,WB,WC) DESTROYED ! 21489: * ! 21490: SCNGF PRC E,0 ENTRY POINT ! 21491: JSR SCANE SCAN INITIAL ELEMENT ! 21492: BEQ XL,=T$LPR,SCNG1 SKIP IF LEFT PAREN (NORMAL GOTO) ! 21493: BEQ XL,=T$LBR,SCNG2 SKIP IF LEFT BRACKET (DIRECT GOTO) ! 21494: ERB 234,SYNTAX ERROR. GOTO FIELD INCORRECT ! 21495: * ! 21496: * HERE FOR LEFT PAREN (NORMAL GOTO) ! 21497: * ! 21498: SCNG1 MOV =NUM01,WB SET EXPAN FLAG FOR NORMAL GOTO ! 21499: JSR EXPAN ANALYZE GOTO FIELD ! 21500: MOV =OPDVN,WA POINT TO OPDV FOR COMPLEX GOTO ! 21501: BLE XR,STATB,SCNG3 JUMP IF NOT IN STATIC (SGD15) ! 21502: BLO XR,STATE,SCNG4 JUMP TO EXIT IF SIMPLE LABEL NAME ! 21503: BRN SCNG3 COMPLEX GOTO - MERGE ! 21504: * ! 21505: * HERE FOR LEFT BRACKET (DIRECT GOTO) ! 21506: * ! 21507: SCNG2 MOV =NUM02,WB SET EXPAN FLAG FOR DIRECT GOTO ! 21508: JSR EXPAN SCAN GOTO FIELD ! 21509: MOV =OPDVD,WA SET OPDV POINTER FOR DIRECT GOTO ! 21510: EJC ! 21511: * ! 21512: * SCNGF (CONTINUED) ! 21513: * ! 21514: * MERGE HERE TO BUILD OUTER UNARY OPERATOR BLOCK ! 21515: * ! 21516: SCNG3 MOV WA,-(XS) STACK OPERATOR DV POINTER ! 21517: MOV XR,-(XS) STACK POINTER TO EXPRESSION TREE ! 21518: JSR EXPOP POP OPERATOR OFF ! 21519: MOV (XS)+,XR RELOAD NEW EXPRESSION TREE POINTER ! 21520: * ! 21521: * COMMON EXIT POINT ! 21522: * ! 21523: SCNG4 EXI RETURN TO CALLER ! 21524: ENP END PROCEDURE SCNGF ! 21525: EJC ! 21526: * ! 21527: * SETVR -- SET VRGET,VRSTO FIELDS OF VRBLK ! 21528: * ! 21529: * SETVR SETS THE PROPER VALUES IN THE VRGET AND VRSTO ! 21530: * FIELDS OF A VRBLK. IT IS CALLED WHENEVER TRBLKS ARE ! 21531: * ADDED OR SUBTRACTED (TRACE,STOPTR,INPUT,OUTPUT,DETACH) ! 21532: * ! 21533: * (XR) POINTER TO VRBLK ! 21534: * JSR SETVR CALL TO SET FIELDS ! 21535: * (XL,WA) DESTROYED ! 21536: * ! 21537: * NOTE THAT SETVR IGNORES THE CALL IF XR DOES NOT POINT ! 21538: * INTO THE STATIC REGION (I.E. IS SOME OTHER NAME BASE) ! 21539: * ! 21540: SETVR PRC E,0 ENTRY POINT ! 21541: BHI XR,STATE,SETV1 EXIT IF NOT NATURAL VARIABLE ! 21542: * ! 21543: * HERE IF WE HAVE A VRBLK ! 21544: * ! 21545: MOV XR,XL COPY VRBLK POINTER ! 21546: MOV =B$VRL,VRGET(XR) STORE NORMAL GET VALUE ! 21547: BEQ VRSTO(XR),=B$VRE,SETV1 SKIP IF PROTECTED VARIABLE ! 21548: MOV =B$VRS,VRSTO(XR) STORE NORMAL STORE VALUE ! 21549: MOV VRVAL(XL),XL POINT TO NEXT ENTRY ON CHAIN ! 21550: BNE (XL),=B$TRT,SETV1 JUMP IF END OF TRBLK CHAIN ! 21551: MOV =B$VRA,VRGET(XR) STORE TRAPPED ROUTINE ADDRESS ! 21552: MOV =B$VRV,VRSTO(XR) SET TRAPPED ROUTINE ADDRESS ! 21553: * ! 21554: * MERGE HERE TO EXIT TO CALLER ! 21555: * ! 21556: SETV1 EXI RETURN TO SETVR CALLER ! 21557: ENP END PROCEDURE SETVR ! 21558: .IF .CNSR ! 21559: .ELSE ! 21560: EJC ! 21561: * ! 21562: * SORTA -- SORT ARRAY ! 21563: * ! 21564: * ROUTINE TO SORT AN ARRAY OR TABLE ON SAME BASIS AS IN ! 21565: * SITBOL. A TABLE IS CONVERTED TO AN ARRAY, LEAVING TWO ! 21566: * DIMENSIONAL ARRAYS AND VECTORS AS CASES TO BE CONSIDERED. ! 21567: * WHOLE ROWS OF ARRAYS ARE PERMUTED ACCORDING TO THE ! 21568: * ORDERING OF THE KEYS THEY CONTAIN, AND THE STRIDE ! 21569: * REFERRED TO, IS THE THE LENGTH OF A ROW. IT IS ONE ! 21570: * FOR A VECTOR. ! 21571: * THE SORT USED IS HEAPSORT, FUNDAMENTALS OF DATA STRUCTURE ! 21572: * HOROWITZ AND SAHNI, PITMAN 1977, PAGE 347. ! 21573: * IT IS AN ORDER N*LOG(N) ALGORITHM. IN ORDER ! 21574: * TO MAKE IT STABLE, COMPARANDS MAY NOT COMPARE EQUAL. THIS ! 21575: * IS ACHIEVED BY SORTING A COPY ARRAY (REFERRED TO AS THE ! 21576: * SORT ARRAY) CONTAINING AT ITS HIGH ADDRESS END, BYTE ! 21577: * OFFSETS TO THE ROWS TO BE SORTED HELD IN THE ORIGINAL ! 21578: * ARRAY (REFERRED TO AS THE KEY ARRAY). SORTC, THE ! 21579: * COMPARISON ROUTINE, ACCESSES THE KEYS THROUGH THESE ! 21580: * OFFSETS AND IN THE CASE OF EQUALITY, RESOLVES IT BY ! 21581: * COMPARING THE OFFSETS THEMSELVES. THE SORT PERMUTES THE ! 21582: * OFFSETS WHICH ARE THEN USED IN A FINAL OPERATION TO COPY ! 21583: * THE ACTUAL ITEMS INTO THE NEW ARRAY IN SORTED ORDER. ! 21584: * REFERENCES TO ZEROTH ITEM ARE TO NOTIONAL ITEM ! 21585: * PRECEDING FIRST ACTUAL ITEM. ! 21586: * REVERSE SORTING FOR RSORT IS DONE BY HAVING THE LESS THAN ! 21587: * TEST FOR KEYS EFFECTIVELY BE REPLACED BY A ! 21588: * GREATER THAN TEST. ! 21589: * ! 21590: * 1(XS) FIRST ARG - ARRAY OR TABLE ! 21591: * 0(XS) 2ND ARG - INDEX OR PDTYPE NAME ! 21592: * (WA) 0 , NON-ZERO FOR SORT , RSORT ! 21593: * JSR SORTA CALL TO SORT ARRAY ! 21594: * (XR) SORTED ARRAY ! 21595: * (XL,WA,WB,WC) DESTROYED ! 21596: EJC ! 21597: * ! 21598: * SORTA (CONTINUED) ! 21599: * ! 21600: SORTA PRC N,0 ENTRY POINT ! 21601: MOV WA,SRTSR SORT/RSORT INDICATOR ! 21602: MOV *NUM01,SRTST DEFAULT STRIDE OF 1 ! 21603: ZER SRTOF DEFAULT ZERO OFFSET TO SORT KEY ! 21604: MOV =NULLS,SRTDF CLEAR DATATYPE FIELD NAME ! 21605: MOV (XS)+,R$SXR UNSTACK ARGUMENT 2 ! 21606: MOV (XS)+,XR GET FIRST ARGUMENT ! 21607: JSR GTARR CONVERT TO ARRAY ! 21608: PPM SRT16 FAIL ! 21609: MOV XR,-(XS) STACK PTR TO RESULTING KEY ARRAY ! 21610: MOV XR,-(XS) ANOTHER COPY FOR COPYB ! 21611: JSR COPYB GET COPY ARRAY FOR SORTING INTO ! 21612: PPM CANT FAIL ! 21613: MOV XR,-(XS) STACK POINTER TO SORT ARRAY ! 21614: MOV R$SXR,XR GET SECOND ARG ! 21615: MOV 1(XS),XL GET PTR TO KEY ARRAY ! 21616: BNE (XL),=B$VCT,SRT02 JUMP IF ARBLK ! 21617: BEQ XR,=NULLS,SRT01 JUMP IF NULL SECOND ARG ! 21618: JSR GTNVR GET VRBLK PTR FOR IT ! 21619: ERR 257,ERRONEOUS 2ND ARG IN SORT/RSORT OF VECTOR ! 21620: MOV XR,SRTDF STORE DATATYPE FIELD NAME VRBLK ! 21621: * ! 21622: * COMPUTE N AND OFFSET TO ITEM A(0) IN VECTOR CASE ! 21623: * ! 21624: SRT01 MOV *VCLEN,WC OFFSET TO A(0) ! 21625: MOV *VCVLS,WB OFFSET TO FIRST ITEM ! 21626: MOV VCLEN(XL),WA GET BLOCK LENGTH ! 21627: SUB *VCSI$,WA GET NO. OF ENTRIES, N (IN BYTES) ! 21628: BRN SRT04 MERGE ! 21629: * ! 21630: * HERE FOR ARRAY ! 21631: * ! 21632: SRT02 LDI ARDIM(XL) GET POSSIBLE DIMENSION ! 21633: MFI WA CONVERT TO SHORT INTEGER ! 21634: WTB WA FURTHER CONVERT TO BAUS ! 21635: MOV *ARVLS,WB OFFSET TO FIRST VALUE IF ONE ! 21636: MOV *ARPRO,WC OFFSET BEFORE VALUES IF ONE DIM. ! 21637: BEQ ARNDM(XL),=NUM01,SRT04 JUMP IN FACT IF ONE DIM. ! 21638: BNE ARNDM(XL),=NUM02,SRT16 FAIL UNLESS TWO DIMENS ! 21639: LDI ARLB2(XL) GET LOWER BOUND 2 AS DEFAULT ! 21640: BEQ XR,=NULLS,SRT03 JUMP IF DEFAULT SECOND ARG ! 21641: JSR GTINT CONVERT TO INTEGER ! 21642: PPM SRT17 FAIL ! 21643: LDI ICVAL(XR) GET ACTUAL INTEGER VALUE ! 21644: EJC ! 21645: * ! 21646: * SORTA (CONTINUED) ! 21647: * ! 21648: * HERE WITH SORT COLUMN INDEX IN IA IN ARRAY CASE ! 21649: * ! 21650: SRT03 SBI ARLB2(XL) SUBTRACT LOW BOUND ! 21651: IOV SRT17 FAIL IF OVERFLOW ! 21652: ILT SRT17 FAIL IF BELOW LOW BOUND ! 21653: SBI ARDM2(XL) CHECK AGAINST DIMENSION ! 21654: IGE SRT17 FAIL IF TOO LARGE ! 21655: ADI ARDM2(XL) RESTORE VALUE ! 21656: MFI WA GET AS SMALL INTEGER ! 21657: WTB WA OFFSET WITHIN ROW TO KEY ! 21658: MOV WA,SRTOF KEEP OFFSET ! 21659: LDI ARDM2(XL) SECOND DIMENSION IS ROW LENGTH ! 21660: MFI WA CONVERT TO SHORT INTEGER ! 21661: MOV WA,XR COPY ROW LENGTH ! 21662: WTB WA CONVERT TO BYTES ! 21663: MOV WA,SRTST STORE AS STRIDE ! 21664: LDI ARDIM(XL) GET NUMBER OF ROWS ! 21665: MFI WA AS A SHORT INTEGER ! 21666: WTB WA CONVERT N TO BAUS ! 21667: MOV ARLEN(XL),WC OFFSET PAST ARRAY END ! 21668: SUB WA,WC ADJUST, GIVING SPACE FOR N OFFSETS ! 21669: DCA WC POINT TO A(0) ! 21670: MOV AROFS(XL),WB OFFSET TO WORD BEFORE FIRST ITEM ! 21671: ICA WB OFFSET TO FIRST ITEM ! 21672: * ! 21673: * SEPARATE PRE-PROCESSING FOR ARRAYS AND VECTORS DONE. ! 21674: * TO SIMPLIFY LATER KEY COMPARISONS, REMOVAL OF ANY TRBLK ! 21675: * TRAP BLOCKS FROM ENTRIES IN KEY ARRAY IS EFFECTED. ! 21676: * ! 21677: * (XL) = 1(XS) = POINTER TO KEY ARRAY ! 21678: * (XS) = POINTER TO SORT ARRAY ! 21679: * WA = NUMBER OF ITEMS, N (CONVERTED TO BYTES). ! 21680: * WB = OFFSET TO FIRST ITEM OF ARRAYS. ! 21681: * WC = OFFSET TO A(0) ! 21682: * ! 21683: SRT04 BLE WA,*NUM01,SRT15 RETURN IF ONLY A SINGLE ITEM ! 21684: MOV WA,SRTSN STORE NUMBER OF ITEMS (IN BAUS) ! 21685: MOV WC,SRTSO STORE OFFSET TO A(0) ! 21686: MOV ARLEN(XL),WC LENGTH OF ARRAY OR VEC (=VCLEN) ! 21687: ADD XL,WC POINT PAST END OF ARRAY OR VECTOR ! 21688: MOV WB,SRTSF STORE OFFSET TO FIRST ROW ! 21689: ADD WB,XL POINT TO FIRST ITEM IN KEY ARRAY ! 21690: * ! 21691: * LOOP THROUGH ARRAY ! 21692: * ! 21693: SRT05 MOV (XL),XR GET AN ENTRY ! 21694: * ! 21695: * HUNT ALONG TRBLK CHAIN ! 21696: * ! 21697: SRT06 BNE (XR),=B$TRT,SRT07 JUMP OUT IF NOT TRBLK ! 21698: MOV TRVAL(XR),XR GET VALUE FIELD ! 21699: BRN SRT06 LOOP ! 21700: EJC ! 21701: * ! 21702: * SORTA (CONTINUED) ! 21703: * ! 21704: * XR IS VALUE FROM END OF CHAIN ! 21705: * ! 21706: SRT07 MOV XR,(XL)+ STORE AS ARRAY ENTRY ! 21707: BLT XL,WC,SRT05 LOOP IF NOT DONE ! 21708: MOV (XS),XL GET ADRS OF SORT ARRAY ! 21709: MOV SRTSF,XR INITIAL OFFSET TO FIRST KEY ! 21710: MOV SRTST,WB GET STRIDE ! 21711: ADD SRTSO,XL OFFSET TO A(0) ! 21712: ICA XL POINT TO A(1) ! 21713: MOV SRTSN,WC GET N ! 21714: BTW WC CONVERT FROM BYTES ! 21715: MOV WC,SRTNR STORE AS ROW COUNT ! 21716: LCT WC,WC LOOP COUNTER ! 21717: * ! 21718: * STORE KEY OFFSETS AT TOP OF SORT ARRAY ! 21719: * ! 21720: SRT08 MOV XR,(XL)+ STORE AN OFFSET ! 21721: ADD WB,XR BUMP OFFSET BY STRIDE ! 21722: BCT WC,SRT08 LOOP THROUGH ROWS ! 21723: * ! 21724: * PERFORM THE SORT ON OFFSETS IN SORT ARRAY. ! 21725: * ! 21726: * (SRTSN) NUMBER OF ITEMS TO SORT, N (BYTES) ! 21727: * (SRTSO) OFFSET TO A(0) ! 21728: * ! 21729: SRT09 MOV SRTSN,WA GET N ! 21730: MOV SRTNR,WC GET NUMBER OF ROWS ! 21731: RSH WC,1 I = N / 2 (WC=I, INDEX INTO ARRAY) ! 21732: WTB WC CONVERT BACK TO BYTES ! 21733: * ! 21734: * LOOP TO FORM INITIAL HEAP ! 21735: * ! 21736: SRT10 JSR SORTH SORTH(I,N) ! 21737: DCA WC I = I - 1 ! 21738: BNZ WC,SRT10 LOOP IF I GT 0 ! 21739: MOV WA,WC I = N ! 21740: * ! 21741: * SORTING LOOP. AT THIS POINT, A(1) IS THE LARGEST ! 21742: * ITEM, SINCE ALGORITHM INITIALISES IT AS, AND THEN MAINTAI ! 21743: * IT AS, ROOT OF TREE. ! 21744: * ! 21745: SRT11 DCA WC I = I - 1 (N - 1 INITIALLY) ! 21746: BZE WC,SRT12 JUMP IF DONE ! 21747: MOV (XS),XR GET SORT ARRAY ADDRESS ! 21748: ADD SRTSO,XR POINT TO A(0) ! 21749: MOV XR,XL A(0) ADDRESS ! 21750: ADD WC,XL A(I) ADDRESS ! 21751: MOV 1(XL),WB COPY A(I+1) ! 21752: MOV 1(XR),1(XL) MOVE A(1) TO A(I+1) ! 21753: MOV WB,1(XR) COMPLETE EXCHANGE OF A(1), A(I+1) ! 21754: MOV WC,WA N = I FOR SORTH ! 21755: MOV *NUM01,WC I = 1 FOR SORTH ! 21756: JSR SORTH SORTH(1,N) ! 21757: MOV WA,WC RESTORE WC ! 21758: BRN SRT11 LOOP ! 21759: EJC ! 21760: * ! 21761: * SORTA (CONTINUED) ! 21762: * ! 21763: * OFFSETS HAVE BEEN PERMUTED INTO REQUIRED ORDER BY SORT. ! 21764: * COPY ARRAY ELEMENTS OVER THEM. ! 21765: * ! 21766: SRT12 MOV (XS),XL BASE ADRS OF KEY ARRAY ! 21767: MOV XL,WC COPY IT ! 21768: ADD SRTSO,WC OFFSET OF A(0) ! 21769: ADD SRTSF,XL ADRS OF FIRST ROW OF SORT ARRAY ! 21770: MOV SRTST,WB GET STRIDE ! 21771: BTW WB CONVERT TO WORDS ! 21772: * ! 21773: * COPYING LOOP FOR SUCCESSIVE ITEMS. SORTED OFFSETS ARE ! 21774: * HELD AT END OF SORT ARRAY. ! 21775: * ! 21776: SRT13 ICA WC ADRS OF NEXT OF SORTED OFFSETS ! 21777: MOV WC,XR COPY IT FOR ACCESS ! 21778: MOV (XR),XR GET OFFSET ! 21779: ADD 1(XS),XR ADD KEY ARRAY BASE ADRS ! 21780: LCT WA,WB GET COUNT OF WORDS IN ROW ! 21781: * ! 21782: * COPY A COMPLETE ROW ! 21783: * ! 21784: SRT14 MOV (XR)+,(XL)+ MOVE A WORD ! 21785: BCT WA,SRT14 LOOP ! 21786: DCV SRTNR DECREMENT ROW COUNT ! 21787: BNZ SRTNR,SRT13 REPEAT TILL ALL ROWS DONE ! 21788: * ! 21789: * RETURN POINT ! 21790: * ! 21791: SRT15 MOV (XS)+,XR POP RESULT ARRAY PTR ! 21792: ICA XS POP KEY ARRAY PTR ! 21793: ZER R$SXL CLEAR JUNK ! 21794: ZER R$SXR CLEAR JUNK ! 21795: EXI RETURN ! 21796: * ! 21797: * ERROR POINT ! 21798: * ! 21799: SRT16 ERB 256,SORT/RSORT 1ST ARG NOT SUITABLE ARRAY OR TABLE ! 21800: SRT17 ERB 258,SORT/RSORT 2ND ARG OUT OF RANGE OR NON-INTEGER ! 21801: ENP END PROCUDURE SORTA ! 21802: EJC ! 21803: * ! 21804: * SORTC -- COMPARE SORT KEYS ! 21805: * ! 21806: * COMPARE TWO SORT KEYS GIVEN THEIR OFFSETS. IF ! 21807: * EQUAL, COMPARE KEY OFFSETS TO GIVE STABLE SORT. ! 21808: * NOTE THAT IF SRTSR IS NON-ZERO (REQUEST FOR REVERSE ! 21809: * SORT), THE QUOTED RETURNS ARE INVERTED. ! 21810: * FOR OBJECTS OF DIFFERING DATATYPES, THE ENTRY POINT ! 21811: * IDENTIFICATIONS ARE COMPARED. ! 21812: * ! 21813: * (XL) BASE ADRS FOR KEYS ! 21814: * (WA) OFFSET TO KEY 1 ITEM ! 21815: * (WB) OFFSET TO KEY 2 ITEM ! 21816: * (SRTSR) ZERO/NON-ZERO FOR SORT/RSORT ! 21817: * (SRTOF) OFFSET WITHIN ROW TO COMPARANDS ! 21818: * JSR SORTC CALL TO COMPARE KEYS ! 21819: * PPM LOC KEY1 LESS THAN KEY2 ! 21820: * NORMAL RETURN, KEY1 GT THAN KEY2 ! 21821: * (XL,XR,WA,WB) DESTROYED ! 21822: * ! 21823: SORTC PRC E,1 ENTRY POINT ! 21824: MOV WA,SRTS1 SAVE OFFSET 1 ! 21825: MOV WB,SRTS2 SAVE OFFSET 2 ! 21826: MOV WC,SRTSC SAVE WC ! 21827: ADD SRTOF,XL ADD OFFSET TO COMPARAND FIELD ! 21828: MOV XL,XR COPY BASE + OFFSET ! 21829: ADD WA,XL ADD KEY1 OFFSET ! 21830: ADD WB,XR ADD KEY2 OFFSET ! 21831: MOV (XL),XL GET KEY1 ! 21832: MOV (XR),XR GET KEY2 ! 21833: BNE SRTDF,=NULLS,SRC11 JUMP IF DATATYPE FIELD NAME USED ! 21834: EJC ! 21835: * ! 21836: * SORTC (CONTINUED) ! 21837: * ! 21838: * MERGE AFTER DEALING WITH FIELD NAME. TRY FOR STRINGS. ! 21839: * ! 21840: SRC01 MOV (XL),WC GET TYPE CODE ! 21841: BNE WC,(XR),SRC02 SKIP IF NOT SAME DATATYPE ! 21842: BEQ WC,=B$SCL,SRC09 JUMP IF BOTH STRINGS ! 21843: * ! 21844: * NOW TRY FOR NUMERIC ! 21845: * ! 21846: SRC02 MOV XL,R$SXL KEEP ARG1 ! 21847: MOV XR,R$SXR KEEP ARG2 ! 21848: MOV XL,-(XS) STACK ! 21849: MOV XR,-(XS) ARGS ! 21850: JSR ACOMP COMPARE OBJECTS ! 21851: PPM SRC10 NOT NUMERIC ! 21852: PPM SRC10 NOT NUMERIC ! 21853: PPM SRC03 KEY1 LESS ! 21854: PPM SRC08 KEYS EQUAL ! 21855: PPM SRC05 KEY1 GREATER ! 21856: * ! 21857: * RETURN IF KEY1 SMALLER (SORT), GREATER (RSORT) ! 21858: * ! 21859: SRC03 BNZ SRTSR,SRC06 JUMP IF RSORT ! 21860: * ! 21861: SRC04 MOV SRTSC,WC RESTORE WC ! 21862: EXI 1 RETURN ! 21863: * ! 21864: * RETURN IF KEY1 GREATER (SORT), SMALLER (RSORT) ! 21865: * ! 21866: SRC05 BNZ SRTSR,SRC04 JUMP IF RSORT ! 21867: * ! 21868: SRC06 MOV SRTSC,WC RESTORE WC ! 21869: EXI RETURN ! 21870: * ! 21871: * KEYS ARE OF SAME DATATYPE ! 21872: * ! 21873: SRC07 BLT XL,XR,SRC03 ITEM FIRST CREATED IS LESS ! 21874: BGT XL,XR,SRC05 ADDRESSES RISE IN ORDER OF CREATION ! 21875: * ! 21876: * DROP THROUGH OR MERGE FOR IDENTICAL OR EQUAL OBJECTS ! 21877: * ! 21878: SRC08 BLT SRTS1,SRTS2,SRC04 TEST OFFSETS OR KEY ADDRSS INSTEAD ! 21879: BRN SRC06 OFFSET 1 GREATER ! 21880: EJC ! 21881: * ! 21882: * SORTC (CONTINUED) ! 21883: * ! 21884: * STRINGS ! 21885: * ! 21886: SRC09 MOV XL,-(XS) STACK ! 21887: MOV XR,-(XS) ARGS ! 21888: JSR LCOMP COMPARE OBJECTS ! 21889: PPM CANT ! 21890: PPM FAIL ! 21891: PPM SRC03 KEY1 LESS ! 21892: PPM SRC08 KEYS EQUAL ! 21893: PPM SRC05 KEY1 GREATER ! 21894: * ! 21895: * ARITHMETIC COMPARISON FAILED - RECOVER ARGS ! 21896: * ! 21897: SRC10 MOV R$SXL,XL GET ARG1 ! 21898: MOV R$SXR,XR GET ARG2 ! 21899: MOV (XL),WC GET TYPE OF KEY1 ! 21900: BEQ WC,(XR),SRC07 JUMP IF KEYS OF SAME TYPE ! 21901: MOV WC,XL GET BLOCK TYPE WORD ! 21902: MOV (XR),XR GET BLOCK TYPE WORD ! 21903: LEI XL ENTRY POINT ID FOR KEY1 ! 21904: LEI XR ENTRY POINT ID FOR KEY2 ! 21905: BGT XL,XR,SRC05 JUMP IF KEY1 GT KEY2 ! 21906: BRN SRC03 KEY1 LT KEY2 ! 21907: * ! 21908: * DATATYPE FIELD NAME USED ! 21909: * ! 21910: SRC11 JSR SORTF CALL ROUTINE TO FIND FIELD 1 ! 21911: MOV XL,-(XS) STACK ITEM POINTER ! 21912: MOV XR,XL GET KEY2 ! 21913: JSR SORTF FIND FIELD 2 ! 21914: MOV XL,XR PLACE AS KEY2 ! 21915: MOV (XS)+,XL RECOVER KEY1 ! 21916: BRN SRC01 MERGE ! 21917: ENP PROCEDURE SORTC ! 21918: EJC ! 21919: * ! 21920: * SORTF -- FIND FIELD FOR SORTC ! 21921: * ! 21922: * ROUTINE USED BY SORTC TO OBTAIN ITEM CORRESPONDING ! 21923: * TO A GIVEN FIELD NAME, IF THIS EXISTS, IN A PROGRAMMER ! 21924: * DEFINED OBJECT PASSED AS ARGUMENT. ! 21925: * IF SUCH A MATCH OCCURS, RECORD IS KEPT OF DATATYPE ! 21926: * NAME, FIELD NAME AND OFFSET TO FIELD IN ORDER TO ! 21927: * SHORT-CIRCUIT LATER SEARCHES ON SAME TYPE. NOTE THAT ! 21928: * DFBLKS ARE STORED IN STATIC AND HENCE CANNOT BE MOVED. ! 21929: * ! 21930: * (SRTDF) VRBLK POINTER OF FIELD NAME ! 21931: * (XL) POSSIBLE PDBLK POINTER ! 21932: * JSR SORTF CALL TO SEARCH FOR FIELD NAME ! 21933: * (XL) ITEM FOUND OR ORIGINAL PDBLK PTR ! 21934: * (WC) DESTROYED ! 21935: * ! 21936: SORTF PRC E,0 ENTRY POINT ! 21937: BNE (XL),=B$PDT,SRTF3 RETURN IF NOT PDBLK ! 21938: MOV XR,-(XS) KEEP XR ! 21939: MOV SRTFD,XR GET POSSIBLE FORMER DFBLK PTR ! 21940: BZE XR,SRTF4 JUMP IF NOT ! 21941: BNE XR,PDDFP(XL),SRTF4 JUMP IF NOT RIGHT DATATYPE ! 21942: BNE SRTDF,SRTFF,SRTF4 JUMP IF NOT RIGHT FIELD NAME ! 21943: ADD SRTFO,XL ADD OFFSET TO REQUIRED FIELD ! 21944: * ! 21945: * HERE WITH XL POINTING TO FOUND FIELD ! 21946: * ! 21947: SRTF1 MOV (XL),XL GET ITEM FROM FIELD ! 21948: * ! 21949: * RETURN POINT ! 21950: * ! 21951: SRTF2 MOV (XS)+,XR RESTORE XR ! 21952: * ! 21953: SRTF3 EXI RETURN ! 21954: EJC ! 21955: * ! 21956: * SORTF (CONTINUED) ! 21957: * ! 21958: * CONDUCT A SEARCH ! 21959: * ! 21960: SRTF4 MOV XL,XR COPY ORIGINAL POINTER ! 21961: MOV PDDFP(XR),XR POINT TO DFBLK ! 21962: MOV XR,SRTFD KEEP A COPY ! 21963: MOV FARGS(XR),WC GET NUMBER OF FIELDS ! 21964: WTB WC CONVERT TO BYTES ! 21965: ADD DFLEN(XR),XR POINT PAST LAST FIELD ! 21966: * ! 21967: * LOOP TO FIND NAME IN PDFBLK ! 21968: * ! 21969: SRTF5 DCA WC COUNT DOWN ! 21970: DCA XR POINT IN FRONT ! 21971: BEQ (XR),SRTDF,SRTF6 SKIP OUT IF FOUND ! 21972: BNZ WC,SRTF5 LOOP ! 21973: BRN SRTF2 RETURN - NOT FOUND ! 21974: * ! 21975: * FOUND ! 21976: * ! 21977: SRTF6 MOV (XR),SRTFF KEEP FIELD NAME PTR ! 21978: ADD *PDFLD,WC ADD OFFSET TO FIRST FIELD ! 21979: MOV WC,SRTFO STORE AS FIELD OFFSET ! 21980: ADD WC,XL POINT TO FIELD ! 21981: BRN SRTF1 RETURN ! 21982: ENP PROCEDURE SORTF ! 21983: EJC ! 21984: * ! 21985: * SORTH -- HEAP ROUTINE FOR SORTA ! 21986: * ! 21987: * THIS ROUTINE CONSTRUCTS A HEAP FROM ELEMENTS OF ARRAY, A. ! 21988: * IN THIS APPLICATION, THE ELEMENTS ARE OFFSETS TO KEYS IN ! 21989: * A KEY ARRAY. ! 21990: * ! 21991: * (XS) POINTER TO SORT ARRAY BASE ! 21992: * 1(XS) POINTER TO KEY ARRAY BASE ! 21993: * (WA) MAX ARRAY INDEX, N (IN BYTES) ! 21994: * (WC) OFFSET J IN A TO ROOT (IN *1 TO *N) ! 21995: * JSR SORTH CALL SORTH(J,N) TO MAKE HEAP ! 21996: * (XL,XR,WB) DESTROYED ! 21997: * ! 21998: SORTH PRC N,0 ENTRY POINT ! 21999: MOV WA,SRTSN SAVE N ! 22000: MOV WC,SRTWC KEEP WC ! 22001: MOV (XS),XL SORT ARRAY BASE ADRS ! 22002: ADD SRTSO,XL ADD OFFSET TO A(0) ! 22003: ADD WC,XL POINT TO A(J) ! 22004: MOV (XL),SRTRT GET OFFSET TO ROOT ! 22005: ADD WC,WC DOUBLE J - CANT EXCEED N ! 22006: * ! 22007: * LOOP TO MOVE DOWN TREE USING DOUBLED INDEX J ! 22008: * ! 22009: SRH01 BGT WC,SRTSN,SRH03 DONE IF J GT N ! 22010: BEQ WC,SRTSN,SRH02 SKIP IF J EQUALS N ! 22011: MOV (XS),XR SORT ARRAY BASE ADRS ! 22012: MOV 1(XS),XL KEY ARRAY BASE ADRS ! 22013: ADD SRTSO,XR POINT TO A(0) ! 22014: ADD WC,XR ADRS OF A(J) ! 22015: MOV 1(XR),WA GET A(J+1) ! 22016: MOV (XR),WB GET A(J) ! 22017: * ! 22018: * COMPARE SONS. (WA) RIGHT SON, (WB) LEFT SON ! 22019: * ! 22020: JSR SORTC COMPARE KEYS - LT(A(J+1),A(J)) ! 22021: PPM SRH02 A(J+1) LT A(J) ! 22022: ICA WC POINT TO GREATER SON, A(J+1) ! 22023: EJC ! 22024: * ! 22025: * SORTH (CONTINUED) ! 22026: * ! 22027: * COMPARE ROOT WITH GREATER SON ! 22028: * ! 22029: SRH02 MOV 1(XS),XL KEY ARRAY BASE ADRS ! 22030: MOV (XS),XR GET SORT ARRAY ADDRESS ! 22031: ADD SRTSO,XR ADRS OF A(0) ! 22032: MOV XR,WB COPY THIS ADRS ! 22033: ADD WC,XR ADRS OF GREATER SON, A(J) ! 22034: MOV (XR),WA GET A(J) ! 22035: MOV WB,XR POINT BACK TO A(0) ! 22036: MOV SRTRT,WB GET ROOT ! 22037: JSR SORTC COMPARE THEM - LT(A(J),ROOT) ! 22038: PPM SRH03 FATHER EXCEEDS SONS - DONE ! 22039: MOV (XS),XR GET SORT ARRAY ADRS ! 22040: ADD SRTSO,XR POINT TO A(0) ! 22041: MOV XR,XL COPY IT ! 22042: MOV WC,WA COPY J ! 22043: BTW WC CONVERT TO WORDS ! 22044: RSH WC,1 GET J/2 ! 22045: WTB WC CONVERT BACK TO BYTES ! 22046: ADD WA,XL POINT TO A(J) ! 22047: ADD WC,XR ADRS OF A(J/2) ! 22048: MOV (XL),(XR) A(J/2) = A(J) ! 22049: MOV WA,WC RECOVER J ! 22050: AOV WC,WC,SRH03 J = J*2. DONE IF TOO BIG ! 22051: BRN SRH01 LOOP ! 22052: * ! 22053: * FINISH BY COPYING ROOT OFFSET BACK INTO ARRAY ! 22054: * ! 22055: SRH03 BTW WC CONVERT TO WORDS ! 22056: RSH WC,1 J = J/2 ! 22057: WTB WC CONVERT BACK TO BYTES ! 22058: MOV (XS),XR SORT ARRAY ADRS ! 22059: ADD SRTSO,XR ADRS OF A(0) ! 22060: ADD WC,XR ADRS OF A(J/2) ! 22061: MOV SRTRT,(XR) A(J/2) = ROOT ! 22062: MOV SRTSN,WA RESTORE WA ! 22063: MOV SRTWC,WC RESTORE WC ! 22064: EXI RETURN ! 22065: ENP END PROCEDURE SORTH ! 22066: EJC ! 22067: .FI ! 22068: EJC ! 22069: * ! 22070: * TFIND -- LOCATE TABLE ELEMENT ! 22071: * ! 22072: * (XR) SUBSCRIPT VALUE FOR ELEMENT ! 22073: * (XL) POINTER TO TABLE ! 22074: * (WB) ZERO BY VALUE, NON-ZERO BY NAME ! 22075: * JSR TFIND CALL TO LOCATE ELEMENT ! 22076: * PPM LOC TRANSFER LOCATION IF ACCESS FAILS ! 22077: * (XR) ELEMENT VALUE (IF BY VALUE) ! 22078: * (XR) DESTROYED (IF BY NAME) ! 22079: * (XL,WA) TEBLK NAME (IF BY NAME) ! 22080: * (XL,WA) DESTROYED (IF BY VALUE) ! 22081: * (WC,RA) DESTROYED ! 22082: * ! 22083: * NOTE THAT IF A CALL BY VALUE SPECIFIES A NON-EXISTENT ! 22084: * SUBSCRIPT, NULL IS RETURNED WITHOUT BUILDING A NEW TEBLK. ! 22085: * ! 22086: TFIND PRC E,1 ENTRY POINT ! 22087: MOV WB,-(XS) SAVE NAME/VALUE INDICATOR ! 22088: MOV XR,-(XS) SAVE SUBSCRIPT VALUE ! 22089: MOV XL,-(XS) SAVE TABLE POINTER ! 22090: MOV TBLEN(XL),WA LOAD LENGTH OF TBBLK ! 22091: BTW WA CONVERT TO WORD COUNT ! 22092: SUB =TBBUK,WA GET NUMBER OF BUCKETS ! 22093: MTI WA CONVERT TO INTEGER VALUE ! 22094: STI TFNSI SAVE FOR LATER ! 22095: MOV (XR),XL LOAD FIRST WORD OF SUBSCRIPT ! 22096: LEI XL LOAD BLOCK ENTRY ID (BL$XX) ! 22097: BSW XL,BL$$D,TFN00 SWITCH ON BLOCK TYPE ! 22098: IFF BL$IC,TFN02 JUMP IF INTEGER ! 22099: .IF .CNRA ! 22100: .ELSE ! 22101: IFF BL$RC,TFN02 REAL ! 22102: .FI ! 22103: IFF BL$P0,TFN03 JUMP IF PATTERN ! 22104: IFF BL$P1,TFN03 JUMP IF PATTERN ! 22105: IFF BL$P2,TFN03 JUMP IF PATTERN ! 22106: IFF BL$NM,TFN04 JUMP IF NAME ! 22107: IFF BL$SC,TFN05 JUMP IF STRING ! 22108: ESW END SWITCH ON BLOCK TYPE ! 22109: * ! 22110: * HERE FOR BLOCKS FOR WHICH WE USE THE SECOND WORD OF THE ! 22111: * BLOCK AS THE HASH SOURCE (SEE BLOCK FORMATS FOR DETAILS). ! 22112: * ! 22113: TFN00 MOV 1(XR),WA LOAD SECOND WORD ! 22114: * ! 22115: * MERGE HERE WITH ONE WORD HASH SOURCE IN WA ! 22116: * ! 22117: TFN01 MTI WA CONVERT TO INTEGER ! 22118: BRN TFN06 JUMP TO MERGE ! 22119: EJC ! 22120: * ! 22121: * TFIND (CONTINUED) ! 22122: * ! 22123: * HERE FOR INTEGER OR REAL ! 22124: * ! 22125: TFN02 LDI 1(XR) LOAD VALUE AS HASH SOURCE ! 22126: IGE TFN06 OK IF POSITIVE OR ZERO ! 22127: NGI MAKE POSITIVE ! 22128: IOV TFN06 CLEAR POSSIBLE OVERFLOW ! 22129: BRN TFN06 MERGE ! 22130: * ! 22131: * FOR PATTERN, USE FIRST WORD (PCODE) AS SOURCE ! 22132: * ! 22133: TFN03 MOV (XR),WA LOAD FIRST WORD AS HASH SOURCE ! 22134: BRN TFN01 MERGE BACK ! 22135: * ! 22136: * FOR NAME, USE OFFSET AS HASH SOURCE ! 22137: * ! 22138: TFN04 MOV NMOFS(XR),WA LOAD OFFSET AS HASH SOURCE ! 22139: BRN TFN01 MERGE BACK ! 22140: * ! 22141: * HERE FOR STRING ! 22142: * ! 22143: TFN05 JSR HASHS CALL ROUTINE TO COMPUTE HASH ! 22144: * ! 22145: * MERGE HERE WITH HASH SOURCE IN (IA) ! 22146: * ! 22147: TFN06 RMI TFNSI COMPUTE HASH INDEX BY REMAINDERING ! 22148: MFI WC GET AS ONE WORD INTEGER ! 22149: WTB WC CONVERT TO BYTE OFFSET ! 22150: MOV (XS),XL GET TABLE PTR AGAIN ! 22151: ADD WC,XL POINT TO PROPER BUCKET ! 22152: MOV TBBUK(XL),XR LOAD FIRST TEBLK POINTER ! 22153: BEQ XR,(XS),TFN10 JUMP IF NO TEBLKS ON CHAIN ! 22154: * ! 22155: * LOOP THROUGH TEBLKS ON HASH CHAIN ! 22156: * ! 22157: TFN07 MOV XR,WB SAVE TEBLK POINTER ! 22158: MOV TESUB(XR),XR LOAD SUBSCRIPT VALUE ! 22159: MOV 1(XS),XL LOAD INPUT ARGUMENT SUBSCRIPT VAL ! 22160: JSR IDENT COMPARE THEM ! 22161: PPM TFN08 JUMP IF EQUAL (IDENT) ! 22162: * ! 22163: * HERE IF NO MATCH WITH THAT TEBLK ! 22164: * ! 22165: MOV WB,XL RESTORE TEBLK POINTER ! 22166: MOV TENXT(XL),XR POINT TO NEXT TEBLK ON CHAIN ! 22167: BNE XR,(XS),TFN07 JUMP IF THERE IS ONE ! 22168: * ! 22169: * HERE IF NO MATCH WITH ANY TEBLK ON CHAIN ! 22170: * ! 22171: MOV *TENXT,WC SET OFFSET TO LINK FIELD (XL BASE) ! 22172: BRN TFN11 JUMP TO MERGE ! 22173: EJC ! 22174: * ! 22175: * TFIND (CONTINUED) ! 22176: * ! 22177: * HERE WE HAVE FOUND A MATCHING ELEMENT ! 22178: * ! 22179: TFN08 MOV WB,XL RESTORE TEBLK POINTER ! 22180: MOV *TEVAL,WA SET TEBLK NAME OFFSET ! 22181: MOV 2(XS),WB RESTORE NAME/VALUE INDICATOR ! 22182: BNZ WB,TFN09 JUMP IF CALLED BY NAME ! 22183: JSR ACESS ELSE GET VALUE ! 22184: PPM TFN12 JUMP IF REFERENCE FAILS ! 22185: ZER WB RESTORE NAME/VALUE INDICATOR ! 22186: * ! 22187: * COMMON EXIT FOR ENTRY FOUND ! 22188: * ! 22189: TFN09 ADD *NUM03,XS POP STACK ENTRIES ! 22190: EXI RETURN TO TFIND CALLER ! 22191: * ! 22192: * HERE IF NO TEBLKS ON THE HASH CHAIN ! 22193: * ! 22194: TFN10 ADD *TBBUK,WC GET OFFSET TO BUCKET PTR ! 22195: MOV (XS),XL SET TBBLK PTR AS BASE ! 22196: * ! 22197: * MERGE HERE WITH (XL,WC) BASE,OFFSET OF FINAL LINK ! 22198: * ! 22199: TFN11 MOV (XS),XR TBBLK POINTER ! 22200: MOV TBINV(XR),XR LOAD DEFAULT VALUE IN CASE ! 22201: MOV 2(XS),WB LOAD NAME/VALUE INDICATOR ! 22202: BZE WB,TFN09 EXIT WITH DEFAULT IF VALUE CALL ! 22203: * ! 22204: * HERE WE MUST BUILD A NEW TEBLK ! 22205: * ! 22206: MOV *TESI$,WA SET SIZE OF TEBLK ! 22207: JSR ALLOC ALLOCATE TEBLK ! 22208: ADD WC,XL POINT TO HASH LINK ! 22209: MOV XR,(XL) LINK NEW TEBLK AT END OF CHAIN ! 22210: MOV =B$TET,(XR) STORE TYPE WORD ! 22211: MOV =NULLS,TEVAL(XR) SET NULL AS INITIAL VALUE ! 22212: MOV (XS)+,TENXT(XR) SET TBBLK PTR TO MARK END OF CHAIN ! 22213: MOV (XS)+,TESUB(XR) STORE SUBSCRIPT VALUE ! 22214: ICA XS POP PAST NAME/VALUE INDICATOR ! 22215: MOV XR,XL COPY TEBLK POINTER (NAME BASE) ! 22216: MOV *TEVAL,WA SET OFFSET ! 22217: EXI RETURN TO CALLER WITH NEW TEBLK ! 22218: * ! 22219: * ACESS FAIL RETURN ! 22220: * ! 22221: TFN12 EXI 1 ALTERNATIVE RETURN ! 22222: ENP END PROCEDURE TFIND ! 22223: EJC ! 22224: * ! 22225: * TRACE -- SET/RESET A TRACE ASSOCIATION ! 22226: * ! 22227: * THIS PROCEDURE IS SHARED BY TRACE AND STOPTR TO ! 22228: * EITHER INITIATE OR STOP A TRACE RESPECTIVELY. ! 22229: * ! 22230: * (XL) TRBLK PTR (TRACE) OR ZERO (STOPTR) ! 22231: * 1(XS) FIRST ARGUMENT (NAME) ! 22232: * 0(XS) SECOND ARGUMENT (TRACE TYPE) ! 22233: * JSR TRACE CALL TO SET/RESET TRACE ! 22234: * PPM LOC TRANSFER LOC IF 1ST ARG IS BAD NAME ! 22235: * PPM LOC TRANSFER LOC IF 2ND ARG IS BAD TYPE ! 22236: * (XS) POPPED ! 22237: * (XL,XR,WA,WB,WC,IA) DESTROYED ! 22238: * ! 22239: TRACE PRC N,2 ENTRY POINT ! 22240: JSR GTSTG GET TRACE TYPE STRING ! 22241: PPM TRC15 JUMP IF NOT STRING ! 22242: PLC XR ELSE POINT TO STRING ! 22243: LCH WA,(XR) LOAD FIRST CHARACTER ! 22244: .IF .CULC ! 22245: FLC WA FOLD TO UPPER CASE ! 22246: .FI ! 22247: MOV (XS),XR LOAD NAME ARGUMENT ! 22248: MOV XL,(XS) STACK TRBLK PTR OR ZERO ! 22249: MOV =TRTAC,WC SET TRTYP FOR ACCESS TRACE ! 22250: BEQ WA,=CH$LA,TRC10 JUMP IF A (ACCESS) ! 22251: MOV =TRTVL,WC SET TRTYP FOR VALUE TRACE ! 22252: BEQ WA,=CH$LV,TRC10 JUMP IF V (VALUE) ! 22253: .IF .CULC ! 22254: BZE WA,TRC10 JUMP IF BLANK (VALUE) ! 22255: .ELSE ! 22256: BEQ WA,=CH$BL,TRC10 JUMP IF BLANK (VALUE) ! 22257: .FI ! 22258: * ! 22259: * HERE FOR L,K,F,C,R ! 22260: * ! 22261: BEQ WA,=CH$LF,TRC01 JUMP IF F (FUNCTION) ! 22262: BEQ WA,=CH$LR,TRC01 JUMP IF R (RETURN) ! 22263: BEQ WA,=CH$LL,TRC03 JUMP IF L (LABEL) ! 22264: BEQ WA,=CH$LK,TRC06 JUMP IF K (KEYWORD) ! 22265: BNE WA,=CH$LC,TRC15 ELSE ERROR IF NOT C (CALL) ! 22266: * ! 22267: * HERE FOR F,C,R ! 22268: * ! 22269: TRC01 JSR GTNVR POINT TO VRBLK FOR NAME ! 22270: PPM TRC16 JUMP IF BAD NAME ! 22271: ICA XS POP STACK ! 22272: MOV VRFNC(XR),XR POINT TO FUNCTION BLOCK ! 22273: BNE (XR),=B$PFC,TRC17 ERROR IF NOT PROGRAM FUNCTION ! 22274: BEQ WA,=CH$LR,TRC02 JUMP IF R (RETURN) ! 22275: EJC ! 22276: * ! 22277: * TRACE (CONTINUED) ! 22278: * ! 22279: * HERE FOR F,C TO SET/RESET CALL TRACE ! 22280: * ! 22281: MOV XL,PFCTR(XR) SET/RESET CALL TRACE ! 22282: BEQ WA,=CH$LC,EXNUL EXIT WITH NULL IF C (CALL) ! 22283: * ! 22284: * HERE FOR F,R TO SET/RESET RETURN TRACE ! 22285: * ! 22286: TRC02 MOV XL,PFRTR(XR) SET/RESET RETURN TRACE ! 22287: EXI RETURN ! 22288: * ! 22289: * HERE FOR L TO SET/RESET LABEL TRACE ! 22290: * ! 22291: TRC03 JSR GTNVR POINT TO VRBLK ! 22292: PPM TRC16 JUMP IF BAD NAME ! 22293: MOV VRLBL(XR),XL LOAD LABEL POINTER ! 22294: BNE (XL),=B$TRT,TRC04 JUMP IF NO OLD TRACE ! 22295: MOV TRLBL(XL),XL ELSE DELETE OLD TRACE ASSOCIATION ! 22296: * ! 22297: * HERE WITH OLD LABEL TRACE ASSOCIATION DELETED ! 22298: * ! 22299: TRC04 BEQ XL,=STNDL,TRC16 ERROR IF UNDEFINED LABEL ! 22300: MOV (XS)+,WB GET TRBLK PTR AGAIN ! 22301: BZE WB,TRC05 JUMP IF STOPTR CASE ! 22302: MOV WB,VRLBL(XR) ELSE SET NEW TRBLK POINTER ! 22303: MOV =B$VRT,VRTRA(XR) SET LABEL TRACE ROUTINE ADDRESS ! 22304: MOV WB,XR COPY TRBLK POINTER ! 22305: MOV XL,TRLBL(XR) STORE REAL LABEL IN TRBLK ! 22306: EXI RETURN ! 22307: * ! 22308: * HERE FOR STOPTR CASE FOR LABEL ! 22309: * ! 22310: TRC05 MOV XL,VRLBL(XR) STORE LABEL PTR BACK IN VRBLK ! 22311: MOV =B$VRG,VRTRA(XR) STORE NORMAL TRANSFER ADDRESS ! 22312: EXI RETURN ! 22313: EJC ! 22314: * ! 22315: * TRACE (CONTINUED) ! 22316: * ! 22317: * HERE FOR K (KEYWORD) ! 22318: * ! 22319: TRC06 JSR GTNVR POINT TO VRBLK ! 22320: PPM TRC16 ERROR IF NOT NATURAL VAR ! 22321: BNZ VRLEN(XR),TRC16 ERROR IF NOT SYSTEM VAR ! 22322: ICA XS POP STACK ! 22323: BZE XL,TRC07 JUMP IF STOPTR CASE ! 22324: MOV XR,TRKVR(XL) STORE VRBLK PTR IN TRBLK FOR KTREX ! 22325: * ! 22326: * MERGE HERE WITH TRBLK SET UP IN WB (OR ZERO) ! 22327: * ! 22328: TRC07 MOV VRSVP(XR),XR POINT TO SVBLK ! 22329: BEQ XR,=V$ERT,TRC08 JUMP IF ERRTYPE ! 22330: BEQ XR,=V$STC,TRC09 JUMP IF STCOUNT ! 22331: BNE XR,=V$FNC,TRC17 ELSE ERROR IF NOT FNCLEVEL ! 22332: * ! 22333: * FNCLEVEL ! 22334: * ! 22335: MOV XL,R$FNC SET/RESET FNCLEVEL TRACE ! 22336: EXI RETURN ! 22337: * ! 22338: * ERRTYPE ! 22339: * ! 22340: TRC08 MOV XL,R$ERT SET/RESET ERRTYPE TRACE ! 22341: EXI RETURN ! 22342: * ! 22343: * STCOUNT ! 22344: * ! 22345: TRC09 MOV XL,R$STC SET/RESET STCOUNT TRACE ! 22346: EXI RETURN ! 22347: EJC ! 22348: * ! 22349: * TRACE (CONTINUED) ! 22350: * ! 22351: * A,V MERGE HERE WITH TRTYP VALUE IN WC ! 22352: * ! 22353: TRC10 JSR GTVAR LOCATE VARIABLE ! 22354: PPM TRC16 ERROR IF NOT APPROPRIATE NAME ! 22355: MOV (XS)+,WB GET NEW TRBLK PTR AGAIN ! 22356: ADD XL,WA POINT TO VARIABLE LOCATION ! 22357: MOV WA,XR COPY VARIABLE POINTER ! 22358: * ! 22359: * LOOP TO SEARCH TRBLK CHAIN ! 22360: * ! 22361: TRC11 MOV (XR),XL POINT TO NEXT ENTRY ! 22362: BNE (XL),=B$TRT,TRC13 JUMP IF NOT TRBLK ! 22363: BLT WC,TRTYP(XL),TRC13 JUMP IF TOO FAR OUT ON CHAIN ! 22364: BEQ WC,TRTYP(XL),TRC12 JUMP IF THIS MATCHES OUR TYPE ! 22365: ADD *TRNXT,XL ELSE POINT TO LINK FIELD ! 22366: MOV XL,XR COPY POINTER ! 22367: BRN TRC11 AND LOOP BACK ! 22368: * ! 22369: * HERE TO DELETE AN OLD TRBLK OF THE TYPE WE WERE GIVEN ! 22370: * ! 22371: TRC12 MOV TRNXT(XL),XL GET PTR TO NEXT BLOCK OR VALUE ! 22372: MOV XL,(XR) STORE TO DELETE THIS TRBLK ! 22373: * ! 22374: * HERE AFTER DELETING ANY OLD ASSOCIATION OF THIS TYPE ! 22375: * ! 22376: TRC13 BZE WB,TRC14 JUMP IF STOPTR CASE ! 22377: MOV WB,(XR) ELSE LINK NEW TRBLK IN ! 22378: MOV WB,XR COPY TRBLK POINTER ! 22379: MOV XL,TRNXT(XR) STORE FORWARD POINTER ! 22380: MOV WC,TRTYP(XR) STORE APPROPRIATE TRAP TYPE CODE ! 22381: * ! 22382: * HERE TO MAKE SURE VRGET,VRSTO ARE SET PROPERLY ! 22383: * ! 22384: TRC14 MOV WA,XR RECALL POSSIBLE VRBLK POINTER ! 22385: SUB *VRVAL,XR POINT BACK TO VRBLK ! 22386: JSR SETVR SET FIELDS IF VRBLK ! 22387: EXI RETURN ! 22388: * ! 22389: * HERE FOR BAD TRACE TYPE ! 22390: * ! 22391: TRC15 EXI 2 TAKE BAD TRACE TYPE ERROR EXIT ! 22392: * ! 22393: * POP STACK BEFORE FAILING ! 22394: * ! 22395: TRC16 ICA XS POP STACK ! 22396: * ! 22397: * HERE FOR BAD NAME ARGUMENT ! 22398: * ! 22399: TRC17 EXI 1 TAKE BAD NAME ERROR EXIT ! 22400: ENP END PROCEDURE TRACE ! 22401: EJC ! 22402: * ! 22403: * TRBLD -- BUILD TRBLK ! 22404: * ! 22405: * TRBLK IS USED BY THE INPUT, OUTPUT AND TRACE FUNCTIONS ! 22406: * TO CONSTRUCT A TRBLK (TRAP BLOCK) ! 22407: * ! 22408: * (XR) TRTAG OR TRTER ! 22409: * (XL) TRFNC OR TRFPT ! 22410: * (WB) TRTYP ! 22411: * JSR TRBLD CALL TO BUILD TRBLK ! 22412: * (XR) POINTER TO TRBLK ! 22413: * (WA) DESTROYED ! 22414: * ! 22415: TRBLD PRC E,0 ENTRY POINT ! 22416: MOV XR,-(XS) STACK TRTAG (OR TRFNM) ! 22417: MOV *TRSI$,WA SET SIZE OF TRBLK ! 22418: JSR ALLOC ALLOCATE TRBLK ! 22419: MOV =B$TRT,(XR) STORE FIRST WORD ! 22420: MOV XL,TRFNC(XR) STORE TRFNC (OR TRFPT) ! 22421: MOV (XS)+,TRTAG(XR) STORE TRTAG (OR TRFNM) ! 22422: MOV WB,TRTYP(XR) STORE TYPE ! 22423: MOV =NULLS,TRVAL(XR) FOR NOW, A NULL VALUE ! 22424: EXI RETURN TO CALLER ! 22425: ENP END PROCEDURE TRBLD ! 22426: EJC ! 22427: * ! 22428: * TRIMR -- TRIM TRAILING BLANKS ! 22429: * ! 22430: * TRIMR IS PASSED A POINTER TO AN SCBLK WHICH MUST BE THE ! 22431: * LAST BLOCK IN DYNAMIC STORAGE. TRAILING BLANKS ARE ! 22432: * TRIMMED OFF AND THE DYNAMIC STORAGE POINTER RESET TO ! 22433: * THE END OF THE (POSSIBLY) SHORTENED BLOCK. ! 22434: * ! 22435: * (WB) NON-ZERO TO TRIM TRAILING BLANKS ! 22436: * (XR) POINTER TO STRING TO TRIM ! 22437: * JSR TRIMR CALL TO TRIM STRING ! 22438: * (XR) POINTER TO TRIMMED STRING ! 22439: * (XL,WA,WB,WC) DESTROYED ! 22440: * ! 22441: * THE CALL WITH WB ZERO STILL PERFORMS THE END ZERO PAD ! 22442: * AND DNAMP READJUSTMENT. IT IS USED FROM ACESS IF KVTRM=0. ! 22443: * ! 22444: TRIMR PRC E,0 ENTRY POINT ! 22445: MOV XR,XL COPY STRING POINTER ! 22446: MOV SCLEN(XR),WA LOAD STRING LENGTH ! 22447: BZE WA,TRIM2 JUMP IF NULL INPUT ! 22448: PLC XL,WA ELSE POINT PAST LAST CHARACTER ! 22449: BZE WB,TRIM3 JUMP IF NO TRIM ! 22450: MOV =CH$BL,WC LOAD BLANK CHARACTER ! 22451: * ! 22452: * LOOP THROUGH CHARACTERS FROM RIGHT TO LEFT ! 22453: * ! 22454: TRIM0 LCH WB,-(XL) LOAD NEXT CHARACTER ! 22455: .IF .CAHT ! 22456: BEQ WB,=CH$HT,TRIM1 JUMP IF HORIZONTAL TAB ! 22457: .FI ! 22458: BNE WB,WC,TRIM3 JUMP IF NON-BLANK FOUND ! 22459: TRIM1 DCV WA ELSE DECREMENT CHARACTER COUNT ! 22460: BNZ WA,TRIM0 LOOP BACK IF MORE TO CHECK ! 22461: * ! 22462: * HERE IF RESULT IS NULL (NULL OR ALL-BLANK INPUT) ! 22463: * ! 22464: TRIM2 MOV XR,DNAMP WIPE OUT INPUT STRING BLOCK ! 22465: MOV =NULLS,XR LOAD NULL RESULT ! 22466: BRN TRIM5 MERGE TO EXIT ! 22467: EJC ! 22468: * ! 22469: * TRIMR (CONTINUED) ! 22470: * ! 22471: * HERE WITH NON-BLANK FOUND (MERGE FOR NO TRIM) ! 22472: * ! 22473: TRIM3 MOV WA,SCLEN(XR) SET NEW LENGTH ! 22474: MOV XR,XL COPY STRING POINTER ! 22475: PSC XL,WA READY FOR STORING BLANKS ! 22476: CTB WA,SCHAR GET LENGTH OF BLOCK IN BYTES ! 22477: ADD XR,WA POINT PAST NEW BLOCK ! 22478: MOV WA,DNAMP SET NEW TOP OF STORAGE POINTER ! 22479: LCT WA,=CFP$C GET COUNT OF CHARS IN WORD ! 22480: ZER WC SET BLANK CHAR ! 22481: * ! 22482: * LOOP TO ZERO PAD LAST WORD OF CHARACTERS ! 22483: * ! 22484: TRIM4 SCH WC,(XL)+ STORE ZERO CHARACTER ! 22485: BCT WA,TRIM4 LOOP BACK TILL ALL STORED ! 22486: CSC XL COMPLETE STORE CHARACTERS ! 22487: * ! 22488: * COMMON EXIT POINT ! 22489: * ! 22490: TRIM5 ZER XL CLEAR GARBAGE XL POINTER ! 22491: EXI RETURN TO CALLER ! 22492: ENP END PROCEDURE TRIMR ! 22493: EJC ! 22494: * ! 22495: * TRXEQ -- EXECUTE FUNCTION TYPE TRACE ! 22496: * ! 22497: * TRXEQ IS USED TO EXECUTE A TRACE WHEN A FOURTH ARGUMENT ! 22498: * HAS BEEN SUPPLIED. TRACE HAS ALREADY BEEN DECREMENTED. ! 22499: * ! 22500: * (XR) POINTER TO TRBLK ! 22501: * (XL,WA) NAME BASE,OFFSET FOR VARIABLE ! 22502: * JSR TRXEQ CALL TO EXECUTE TRACE ! 22503: * (WB,WC,RA) DESTROYED ! 22504: * ! 22505: * THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING ! 22506: * CONTROL TO THE TRACE FUNCTION USING THE CFUNC ROUTINE. ! 22507: * ! 22508: * TRXEQ RETURN POINT WORD(S) ! 22509: * SAVED VALUE OF TRACE KEYWORD ! 22510: * TRBLK POINTER ! 22511: * NAME BASE ! 22512: * NAME OFFSET ! 22513: * SAVED VALUE OF R$COD ! 22514: * SAVED CODE PTR (-R$COD) ! 22515: * SAVED VALUE OF FLPTR ! 22516: * FLPTR --------------- ZERO (DUMMY FAIL OFFSET) ! 22517: * NMBLK FOR VARIABLE NAME ! 22518: * XS ------------------ TRACE TAG ! 22519: * ! 22520: * R$COD AND THE CODE PTR ARE SET TO DUMMY VALUES WHICH ! 22521: * CAUSE CONTROL TO RETURN TO THE TRXEQ PROCEDURE ON SUCCESS ! 22522: * OR FAILURE (TRXEQ IGNORES A FAILURE CONDITION). ! 22523: * ! 22524: TRXEQ PRC R,0 ENTRY POINT (RECURSIVE) ! 22525: MOV R$COD,WC LOAD CODE BLOCK POINTER ! 22526: SCP WB GET CURRENT CODE POINTER ! 22527: SUB WC,WB MAKE CODE POINTER INTO OFFSET ! 22528: MOV KVTRA,-(XS) STACK TRACE KEYWORD VALUE ! 22529: MOV XR,-(XS) STACK TRBLK POINTER ! 22530: MOV XL,-(XS) STACK NAME BASE ! 22531: MOV WA,-(XS) STACK NAME OFFSET ! 22532: MOV WC,-(XS) STACK CODE BLOCK POINTER ! 22533: MOV WB,-(XS) STACK CODE POINTER OFFSET ! 22534: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER ! 22535: ZER -(XS) SET DUMMY FAIL OFFSET ! 22536: MOV XS,FLPTR SET NEW FAILURE POINTER ! 22537: ZER KVTRA RESET TRACE KEYWORD TO ZERO ! 22538: MOV =TRXDC,WC LOAD NEW (DUMMY) CODE BLK POINTER ! 22539: MOV WC,R$COD SET AS CODE BLOCK POINTER ! 22540: LCP WC AND NEW CODE POINTER ! 22541: EJC ! 22542: * ! 22543: * TRXEQ (CONTINUED) ! 22544: * ! 22545: * NOW PREPARE ARGUMENTS FOR FUNCTION ! 22546: * ! 22547: MOV WA,WB SAVE NAME OFFSET ! 22548: MOV *NMSI$,WA LOAD NMBLK SIZE ! 22549: JSR ALLOC ALLOCATE SPACE FOR NMBLK ! 22550: MOV =B$NML,(XR) SET TYPE WORD ! 22551: MOV XL,NMBAS(XR) STORE NAME BASE ! 22552: MOV WB,NMOFS(XR) STORE NAME OFFSET ! 22553: MOV 6(XS),XL RELOAD POINTER TO TRBLK ! 22554: MOV XR,-(XS) STACK NMBLK POINTER (1ST ARGUMENT) ! 22555: MOV TRTAG(XL),-(XS) STACK TRACE TAG (2ND ARGUMENT) ! 22556: MOV TRFNC(XL),XL LOAD TRACE FUNCTION POINTER ! 22557: MOV =NUM02,WA SET NUMBER OF ARGUMENTS TO TWO ! 22558: BRN CFUNC JUMP TO CALL FUNCTION ! 22559: * ! 22560: * SEE O$TXR FOR DETAILS OF RETURN TO THIS POINT ! 22561: * ! 22562: TRXQ1 MOV FLPTR,XS POINT BACK TO OUR STACK ENTRIES ! 22563: ICA XS POP OFF GARBAGE FAIL OFFSET ! 22564: MOV (XS)+,FLPTR RESTORE OLD FAILURE POINTER ! 22565: MOV (XS)+,WB RELOAD CODE OFFSET ! 22566: MOV (XS)+,WC LOAD OLD CODE BASE POINTER ! 22567: MOV WC,XR COPY CDBLK POINTER ! 22568: MOV CDSTM(XR),KVSTN RESTORE STMNT NO ! 22569: MOV (XS)+,WA RELOAD NAME OFFSET ! 22570: MOV (XS)+,XL RELOAD NAME BASE ! 22571: MOV (XS)+,XR RELOAD TRBLK POINTER ! 22572: MOV (XS)+,KVTRA RESTORE TRACE KEYWORD VALUE ! 22573: ADD WC,WB RECOMPUTE ABSOLUTE CODE POINTER ! 22574: LCP WB RESTORE CODE POINTER ! 22575: MOV WC,R$COD AND CODE BLOCK POINTER ! 22576: EXI RETURN TO TRXEQ CALLER ! 22577: ENP END PROCEDURE TRXEQ ! 22578: EJC ! 22579: * ! 22580: * XSCAN -- EXECUTION FUNCTION ARGUMENT SCAN ! 22581: * ! 22582: * XSCAN SCANS OUT ONE TOKEN IN A PROTOTYPE ARGUMENT IN ! 22583: * ARRAY,CLEAR,DATA,DEFINE,LOAD FUNCTION CALLS. XSCAN ! 22584: * CALLS MUST BE PRECEDED BY A CALL TO THE INITIALIZATION ! 22585: * PROCEDURE XSCNI. THE FOLLOWING VARIABLES ARE USED. ! 22586: * ! 22587: * R$XSC POINTER TO SCBLK FOR FUNCTION ARG ! 22588: * XSOFS OFFSET (NUM CHARS SCANNED SO FAR) ! 22589: * ! 22590: * (WC) DELIMITER ONE (CH$XX) ! 22591: * (XL) DELIMITER TWO (CH$XX) ! 22592: * JSR XSCAN CALL TO SCAN NEXT ITEM ! 22593: * (XR) POINTER TO SCBLK FOR TOKEN SCANNED ! 22594: * (WA) COMPLETION CODE (SEE BELOW) ! 22595: * (WC,XL) DESTROYED ! 22596: * ! 22597: * THE SCAN STARTS FROM THE CURRENT POSITION AND CONTINUES ! 22598: * UNTIL ONE OF THE FOLLOWING THREE CONDITIONS OCCURS. ! 22599: * ! 22600: * 1) DELIMITER ONE IS ENCOUNTERED (WA SET TO 1) ! 22601: * ! 22602: * 2) DELIMITER TWO ENCOUNTERED (WA SET TO 2) ! 22603: * ! 22604: * 3) END OF STRING ENCOUNTERED (WA SET TO 0) ! 22605: * ! 22606: * THE RESULT IS A STRING CONTAINING ALL CHARACTERS SCANNED ! 22607: * UP TO BUT NOT INCLUDING ANY DELIMITER CHARACTER. ! 22608: * THE POINTER IS LEFT POINTING PAST THE DELIMITER. ! 22609: * ! 22610: * IF ONLY ONE DELIMITER IS TO BE DETECTED, DELIMITER ONE ! 22611: * AND DELIMITER TWO SHOULD BE SET TO THE SAME VALUE. ! 22612: * ! 22613: * IN THE CASE WHERE THE END OF STRING IS ENCOUNTERED, THE ! 22614: * STRING INCLUDES ALL THE CHARACTERS TO THE END OF THE ! 22615: * STRING. NO FURTHER CALLS CAN BE MADE TO XSCAN UNTIL ! 22616: * XSCNI IS CALLED TO INITIALIZE A NEW ARGUMENT SCAN ! 22617: EJC ! 22618: * ! 22619: * XSCAN (CONTINUED) ! 22620: * ! 22621: XSCAN PRC E,0 ENTRY POINT ! 22622: MOV WB,XSCWB PRESERVE WB ! 22623: MOV R$XSC,XR POINT TO ARGUMENT STRING ! 22624: MOV SCLEN(XR),WA LOAD STRING LENGTH ! 22625: MOV XSOFS,WB LOAD CURRENT OFFSET ! 22626: SUB WB,WA GET NUMBER OF REMAINING CHARACTERS ! 22627: BZE WA,XSCN2 JUMP IF NO CHARACTERS LEFT ! 22628: PLC XR,WB POINT TO CURRENT CHARACTER ! 22629: * ! 22630: * LOOP TO SEARCH FOR DELIMITER ! 22631: * ! 22632: XSCN1 LCH WB,(XR)+ LOAD NEXT CHARACTER ! 22633: BEQ WB,WC,XSCN3 JUMP IF DELIMITER ONE FOUND ! 22634: BEQ WB,XL,XSCN4 JUMP IF DELIMITER TWO FOUND ! 22635: DCV WA DECREMENT COUNT OF CHARS LEFT ! 22636: BNZ WA,XSCN1 LOOP BACK IF MORE CHARS TO GO ! 22637: * ! 22638: * HERE FOR RUNOUT ! 22639: * ! 22640: XSCN2 MOV R$XSC,XL POINT TO STRING BLOCK ! 22641: MOV SCLEN(XL),WA GET STRING LENGTH ! 22642: MOV XSOFS,WB LOAD OFFSET ! 22643: SUB WB,WA GET SUBSTRING LENGTH ! 22644: ZER R$XSC CLEAR STRING PTR FOR COLLECTOR ! 22645: ZER XSCRT SET ZERO (RUNOUT) RETURN CODE ! 22646: BRN XSCN6 JUMP TO EXIT ! 22647: EJC ! 22648: * ! 22649: * XSCAN (CONTINUED) ! 22650: * ! 22651: * HERE IF DELIMITER ONE FOUND ! 22652: * ! 22653: XSCN3 MOV =NUM01,XSCRT SET RETURN CODE ! 22654: BRN XSCN5 JUMP TO MERGE ! 22655: * ! 22656: * HERE IF DELIMITER TWO FOUND ! 22657: * ! 22658: XSCN4 MOV =NUM02,XSCRT SET RETURN CODE ! 22659: * ! 22660: * MERGE HERE AFTER DETECTING A DELIMITER ! 22661: * ! 22662: XSCN5 MOV R$XSC,XL RELOAD POINTER TO STRING ! 22663: MOV SCLEN(XL),WC GET ORIGINAL LENGTH OF STRING ! 22664: SUB WA,WC MINUS CHARS LEFT = CHARS SCANNED ! 22665: MOV WC,WA MOVE TO REG FOR SBSTR ! 22666: MOV XSOFS,WB SET OFFSET ! 22667: SUB WB,WA COMPUTE LENGTH FOR SBSTR ! 22668: ICV WC ADJUST NEW CURSOR PAST DELIMITER ! 22669: MOV WC,XSOFS STORE NEW OFFSET ! 22670: * ! 22671: * COMMON EXIT POINT ! 22672: * ! 22673: XSCN6 ZER XR CLEAR GARBAGE CHARACTER PTR IN XR ! 22674: JSR SBSTR BUILD SUB-STRING ! 22675: MOV XSCRT,WA LOAD RETURN CODE ! 22676: MOV XSCWB,WB RESTORE WB ! 22677: EXI RETURN TO XSCAN CALLER ! 22678: ENP END PROCEDURE XSCAN ! 22679: EJC ! 22680: * ! 22681: * XSCNI -- EXECUTION FUNCTION ARGUMENT SCAN ! 22682: * ! 22683: * XSCNI INITIALIZES THE SCAN USED FOR PROTOTYPE ARGUMENTS ! 22684: * IN THE CLEAR, DEFINE, LOAD, DATA, ARRAY FUNCTIONS. SEE ! 22685: * XSCAN FOR THE PROCEDURE WHICH IS USED AFTER THIS CALL. ! 22686: * ! 22687: * -(XS) ARGUMENT TO BE SCANNED (ON STACK) ! 22688: * JSR XSCNI CALL TO SCAN ARGUMENT ! 22689: * PPM LOC TRANSFER LOC IF ARG IS NOT STRING ! 22690: * PPM LOC TRANSFER LOC IF ARGUMENT IS NULL ! 22691: * (XS) POPPED ! 22692: * (XR,R$XSC) ARGUMENT (SCBLK PTR) ! 22693: * (WA) ARGUMENT LENGTH ! 22694: * (IA,RA) DESTROYED ! 22695: * ! 22696: XSCNI PRC N,2 ENTRY POINT ! 22697: JSR GTSTG FETCH ARGUMENT AS STRING ! 22698: PPM XSCI1 JUMP IF NOT CONVERTIBLE ! 22699: MOV XR,R$XSC ELSE STORE SCBLK PTR FOR XSCAN ! 22700: ZER XSOFS SET OFFSET TO ZERO ! 22701: BZE WA,XSCI2 JUMP IF NULL STRING ! 22702: EXI RETURN TO XSCNI CALLER ! 22703: * ! 22704: * HERE IF ARGUMENT IS NOT A STRING ! 22705: * ! 22706: XSCI1 EXI 1 TAKE NOT-STRING ERROR EXIT ! 22707: * ! 22708: * HERE FOR NULL STRING ! 22709: * ! 22710: XSCI2 EXI 2 TAKE NULL-STRING ERROR EXIT ! 22711: ENP END PROCEDURE XSCNI ! 22712: TTL S P I T B O L -- UTILITY ROUTINES ! 22713: * ! 22714: * THE FOLLOWING SECTION CONTAINS UTILITY ROUTINES USED FOR ! 22715: * VARIOUS PURPOSES THROUGHOUT THE SYSTEM. THESE DIFFER ! 22716: * FROM THE PROCEDURES IN THE UTILITY PROCEDURES SECTION IN ! 22717: * THEY ARE NOT IN PROCEDURE FORM AND THEY DO NOT RETURN ! 22718: * TO THEIR CALLERS. THEY ARE ACCESSED WITH A BRANCH TYPE ! 22719: * INSTRUCTION AFTER SETTING THE REGISTERS TO APPROPRIATE ! 22720: * PARAMETER VALUES. ! 22721: * ! 22722: * THE REGISTER VALUES REQUIRED FOR EACH ROUTINE ARE ! 22723: * DOCUMENTED AT THE START OF EACH ROUTINE. REGISTERS NOT ! 22724: * MENTIONED MAY CONTAIN ANY VALUES EXCEPT THAT XR,XL ! 22725: * CAN ONLY CONTAIN PROPER COLLECTABLE POINTERS. ! 22726: * ! 22727: * SOME OF THESE ROUTINES WILL TOLERATE GARBAGE POINTERS ! 22728: * IN XL,XR ON ENTRY. THIS IS ALWAYS DOCUMENTED AND IN ! 22729: * EACH CASE, THE ROUTINE CLEARS THESE GARBAGE VALUES BEFORE ! 22730: * EXITING AFTER COMPLETING ITS TASK. ! 22731: * ! 22732: * THE ROUTINES HAVE NAMES CONSISTING OF FIVE LETTERS ! 22733: * AND ARE ASSEMBLED IN ALPHABETICAL ORDER. ! 22734: EJC ! 22735: * ARREF -- ARRAY REFERENCE ! 22736: * ! 22737: * (XL) MAY BE NON-COLLECTABLE ! 22738: * (XR) NUMBER OF SUBSCRIPTS ! 22739: * (WB) SET ZERO/NONZERO FOR VALUE/NAME ! 22740: * THE VALUE IN WB MUST BE COLLECTABLE ! 22741: * STACK SUBSCRIPTS AND ARRAY OPERAND ! 22742: * BRN ARREF JUMP TO CALL FUNCTION ! 22743: * ! 22744: * ARREF CONTINUES BY EXECUTING THE NEXT CODE WORD WITH ! 22745: * THE RESULT NAME OR VALUE PLACED ON TOP OF THE STACK. ! 22746: * TO DEAL WITH THE PROBLEM OF ACCESSING SUBSCRIPTS IN THE ! 22747: * ORDER OF STACKING, XL IS USED AS A SUBSCRIPT POINTER ! 22748: * WORKING BELOW THE STACK POINTER. ! 22749: * ! 22750: ARREF RTN ! 22751: MOV XR,WA COPY NUMBER OF SUBSCRIPTS ! 22752: MOV XS,XT POINT TO STACK FRONT ! 22753: WTB XR CONVERT TO BYTE OFFSET ! 22754: ADD XR,XT POINT TO ARRAY OPERAND ON STACK ! 22755: ICA XT FINAL VALUE FOR STACK POPPING ! 22756: MOV XT,ARFXS KEEP FOR LATER ! 22757: MOV -(XT),XR LOAD ARRAY OPERAND POINTER ! 22758: MOV XR,R$ARF KEEP ARRAY POINTER ! 22759: MOV XT,XR SAVE POINTER TO SUBSCRIPTS ! 22760: MOV R$ARF,XL POINT XL TO POSSIBLE VCBLK OR TBBLK ! 22761: MOV (XL),WC LOAD FIRST WORD ! 22762: BEQ WC,=B$ART,ARF01 JUMP IF ARBLK ! 22763: BEQ WC,=B$VCT,ARF07 JUMP IF VCBLK ! 22764: BEQ WC,=B$TBT,ARF10 JUMP IF TBBLK ! 22765: ERB 235,SUBSCRIPTED OPERAND IS NOT TABLE OR ARRAY ! 22766: * ! 22767: * HERE FOR ARRAY (ARBLK) ! 22768: * ! 22769: ARF01 BNE WA,ARNDM(XL),ARF09 JUMP IF WRONG NUMBER OF DIMS ! 22770: LDI INTV0 GET INITIAL SUBSCRIPT OF ZERO ! 22771: MOV XR,XT POINT BEFORE SUBSCRIPTS ! 22772: ZER WA INITIAL OFFSET TO BOUNDS ! 22773: BRN ARF03 JUMP INTO LOOP ! 22774: * ! 22775: * LOOP TO COMPUTE SUBSCRIPTS BY MULTIPLICATIONS ! 22776: * ! 22777: ARF02 MLI ARDM2(XR) MULTIPLY TOTAL BY NEXT DIMENSION ! 22778: * ! 22779: * MERGE HERE FIRST TIME ! 22780: * ! 22781: ARF03 MOV -(XT),XR LOAD NEXT SUBSCRIPT ! 22782: STI ARFSI SAVE CURRENT SUBSCRIPT ! 22783: LDI ICVAL(XR) LOAD INTEGER VALUE IN CASE ! 22784: BEQ (XR),=B$ICL,ARF04 JUMP IF IT WAS AN INTEGER ! 22785: EJC ! 22786: * ! 22787: * ARREF (CONTINUED) ! 22788: * ! 22789: * ! 22790: JSR GTINT CONVERT TO INTEGER ! 22791: PPM ARF12 JUMP IF NOT INTEGER ! 22792: LDI ICVAL(XR) IF OK, LOAD INTEGER VALUE ! 22793: * ! 22794: * HERE WITH INTEGER SUBSCRIPT IN (IA) ! 22795: * ! 22796: ARF04 MOV R$ARF,XR POINT TO ARRAY ! 22797: ADD WA,XR OFFSET TO NEXT BOUNDS ! 22798: SBI ARLBD(XR) SUBTRACT LOW BOUND TO COMPARE ! 22799: IOV ARF13 OUT OF RANGE FAIL IF OVERFLOW ! 22800: ILT ARF13 OUT OF RANGE FAIL IF TOO SMALL ! 22801: SBI ARDIM(XR) SUBTRACT DIMENSION ! 22802: IGE ARF13 OUT OF RANGE FAIL IF TOO LARGE ! 22803: ADI ARDIM(XR) ELSE RESTORE SUBSCRIPT OFFSET ! 22804: ADI ARFSI ADD TO CURRENT TOTAL ! 22805: ADD *ARDMS,WA POINT TO NEXT BOUNDS ! 22806: BNE XT,XS,ARF02 LOOP BACK IF MORE TO GO ! 22807: * ! 22808: * HERE WITH INTEGER SUBSCRIPT COMPUTED ! 22809: * ! 22810: MFI WA GET AS ONE WORD INTEGER ! 22811: WTB WA CONVERT TO OFFSET ! 22812: MOV R$ARF,XL POINT TO ARBLK ! 22813: ADD AROFS(XL),WA ADD OFFSET PAST BOUNDS ! 22814: ICA WA ADJUST FOR ARPRO FIELD ! 22815: BNZ WB,ARF08 EXIT WITH NAME IF NAME CALL ! 22816: * ! 22817: * MERGE HERE TO GET VALUE FOR VALUE CALL ! 22818: * ! 22819: ARF05 JSR ACESS GET VALUE ! 22820: PPM ARF13 FAIL IF ACESS FAILS ! 22821: * ! 22822: * RETURN VALUE ! 22823: * ! 22824: ARF06 MOV ARFXS,XS POP STACK ENTRIES ! 22825: ZER R$ARF FINISHED WITH ARRAY POINTER ! 22826: BRN EXIXR EXIT WITH VALUE IN XR ! 22827: EJC ! 22828: * ! 22829: * ARREF (CONTINUED) ! 22830: * ! 22831: * HERE FOR VECTOR ! 22832: * ! 22833: ARF07 BNE WA,=NUM01,ARF09 ERROR IF MORE THAN 1 SUBSCRIPT ! 22834: MOV (XS),XR ELSE LOAD SUBSCRIPT ! 22835: JSR GTINT CONVERT TO INTEGER ! 22836: PPM ARF12 ERROR IF NOT INTEGER ! 22837: LDI ICVAL(XR) ELSE LOAD INTEGER VALUE ! 22838: SBI INTV1 SUBTRACT FOR ONES OFFSET ! 22839: MFI WA,ARF13 GET SUBSCRIPT AS ONE WORD ! 22840: ADD =VCVLS,WA ADD OFFSET FOR STANDARD FIELDS ! 22841: WTB WA CONVERT OFFSET TO BYTES ! 22842: BGE WA,VCLEN(XL),ARF13 FAIL IF OUT OF RANGE SUBSCRIPT ! 22843: BZE WB,ARF05 BACK TO GET VALUE IF VALUE CALL ! 22844: * ! 22845: * RETURN NAME ! 22846: * ! 22847: ARF08 MOV ARFXS,XS POP STACK ENTRIES ! 22848: ZER R$ARF FINISHED WITH ARRAY POINTER ! 22849: BRN EXNAM ELSE EXIT WITH NAME ! 22850: * ! 22851: * HERE IF SUBSCRIPT COUNT IS WRONG ! 22852: * ! 22853: ARF09 ERB 236,ARRAY REFERENCED WITH WRONG NUMBER OF SUBSCRIPTS ! 22854: * ! 22855: * TABLE ! 22856: * ! 22857: ARF10 BNE WA,=NUM01,ARF11 ERROR IF MORE THAN 1 SUBSCRIPT ! 22858: MOV (XS),XR ELSE LOAD SUBSCRIPT ! 22859: JSR TFIND CALL TABLE SEARCH ROUTINE ! 22860: PPM ARF13 FAIL IF FAILED ! 22861: BNZ WB,ARF08 EXIT WITH NAME IF NAME CALL ! 22862: BRN ARF06 ELSE EXIT WITH VALUE ! 22863: * ! 22864: * HERE FOR BAD TABLE REFERENCE ! 22865: * ! 22866: ARF11 ERB 237,TABLE REFERENCED WITH MORE THAN ONE SUBSCRIPT ! 22867: * ! 22868: * HERE FOR BAD SUBSCRIPT ! 22869: * ! 22870: ARF12 ERB 238,ARRAY SUBSCRIPT IS NOT INTEGER ! 22871: * ! 22872: * HERE TO SIGNAL FAILURE ! 22873: * ! 22874: ARF13 ZER R$ARF FINISHED WITH ARRAY POINTER ! 22875: BRN EXFAL FAIL ! 22876: EJC ! 22877: * ! 22878: * CFUNC -- CALL A FUNCTION ! 22879: * ! 22880: * CFUNC IS USED TO CALL A SNOBOL LEVEL FUNCTION. IT IS ! 22881: * USED BY THE APPLY FUNCTION (S$APP), THE FUNCTION ! 22882: * TRACE ROUTINE (TRXEQ) AND THE MAIN FUNCTION CALL ENTRY ! 22883: * (O$FNC, O$FNS). IN THE LATTER CASES, CFUNC IS USED ONLY ! 22884: * IF THE NUMBER OF ARGUMENTS IS INCORRECT. ! 22885: * ! 22886: * (XL) POINTER TO FUNCTION BLOCK ! 22887: * (WA) ACTUAL NUMBER OF ARGUMENTS ! 22888: * (XS) POINTS TO STACKED ARGUMENTS ! 22889: * BRN CFUNC JUMP TO CALL FUNCTION ! 22890: * ! 22891: * CFUNC CONTINUES BY EXECUTING THE FUNCTION ! 22892: * ! 22893: CFUNC RTN ! 22894: BLT WA,FARGS(XL),CFNC1 JUMP IF TOO FEW ARGUMENTS ! 22895: BEQ WA,FARGS(XL),CFNC3 JUMP IF CORRECT NUMBER OF ARGS ! 22896: * ! 22897: * HERE IF TOO MANY ARGUMENTS SUPPLIED, POP THEM OFF ! 22898: * ! 22899: MOV WA,WB COPY ACTUAL NUMBER ! 22900: SUB FARGS(XL),WB GET NUMBER OF EXTRA ARGS ! 22901: WTB WB CONVERT TO BYTES ! 22902: ADD WB,XS POP OFF UNWANTED ARGUMENTS ! 22903: BRN CFNC3 JUMP TO GO OFF TO FUNCTION ! 22904: * ! 22905: * HERE IF TOO FEW ARGUMENTS ! 22906: * ! 22907: CFNC1 MOV FARGS(XL),WB LOAD REQUIRED NUMBER OF ARGUMENTS ! 22908: BEQ WB,=NINI9,CFNC3 JUMP IF CASE OF VAR NUM OF ARGS ! 22909: SUB WA,WB CALCULATE NUMBER MISSING ! 22910: LCT WB,WB SET COUNTER TO CONTROL LOOP ! 22911: * ! 22912: * LOOP TO SUPPLY EXTRA NULL ARGUMENTS ! 22913: * ! 22914: CFNC2 MOV =NULLS,-(XS) STACK A NULL ARGUMENT ! 22915: BCT WB,CFNC2 LOOP TILL PROPER NUMBER STACKED ! 22916: * ! 22917: * MERGE HERE TO JUMP TO FUNCTION ! 22918: * ! 22919: CFNC3 BRI (XL) JUMP THROUGH FCODE FIELD ! 22920: EJC ! 22921: * ! 22922: * EXFAL -- EXIT SIGNALLING SNOBOL FAILURE ! 22923: * ! 22924: * (XL,XR) MAY BE NON-COLLECTABLE ! 22925: * BRN EXFAL JUMP TO FAIL ! 22926: * ! 22927: * EXFAL CONTINUES BY EXECUTING THE APPROPRIATE FAIL GOTO ! 22928: * ! 22929: EXFAL RTN ! 22930: MOV FLPTR,XS POP STACK ! 22931: MOV (XS),XR LOAD FAILURE OFFSET ! 22932: ADD R$COD,XR POINT TO FAILURE CODE LOCATION ! 22933: LCP XR SET CODE POINTER ! 22934: BRN EXITS DO NEXT CODE WORD ! 22935: EJC ! 22936: * ! 22937: * EXINT -- EXIT WITH INTEGER RESULT ! 22938: * ! 22939: * (XL,XR) MAY BE NONCOLLECTABLE ! 22940: * (IA) INTEGER VALUE ! 22941: * BRN EXINT JUMP TO EXIT WITH INTEGER ! 22942: * ! 22943: * EXINT CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22944: * WHICH IT DOES BY FALLING THROUGH TO EXIXR ! 22945: * ! 22946: EXINT RTN ! 22947: JSR ICBLD BUILD ICBLK ! 22948: EJC ! 22949: * EXIXR -- EXIT WITH RESULT IN (XR) ! 22950: * ! 22951: * (XR) RESULT ! 22952: * (XL) MAY BE NON-COLLECTABLE ! 22953: * BRN EXIXR JUMP TO EXIT WITH RESULT IN (XR) ! 22954: * ! 22955: * EXIXR CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22956: * WHICH IT DOES BY FALLING THROUGH TO EXITS. ! 22957: EXIXR RTN ! 22958: * ! 22959: MOV XR,-(XS) STACK RESULT ! 22960: * ! 22961: * ! 22962: * EXITS -- EXIT WITH RESULT IF ANY STACKED ! 22963: * ! 22964: * (XR,XL) MAY BE NON-COLLECTABLE ! 22965: * ! 22966: * BRN EXITS ENTER EXITS ROUTINE ! 22967: * ! 22968: EXITS RTN ! 22969: LCW XR LOAD NEXT CODE WORD ! 22970: MOV (XR),XL LOAD ENTRY ADDRESS ! 22971: BRI XL JUMP TO EXECUTE NEXT CODE WORD ! 22972: EJC ! 22973: * ! 22974: * EXNAM -- EXIT WITH NAME IN (XL,WA) ! 22975: * ! 22976: * (XL) NAME BASE ! 22977: * (WA) NAME OFFSET ! 22978: * (XR) MAY BE NON-COLLECTABLE ! 22979: * BRN EXNAM JUMP TO EXIT WITH NAME IN (XL,WA) ! 22980: * ! 22981: * EXNAM CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22982: * ! 22983: EXNAM RTN ! 22984: MOV XL,-(XS) STACK NAME BASE ! 22985: MOV WA,-(XS) STACK NAME OFFSET ! 22986: BRN EXITS DO NEXT CODE WORD ! 22987: EJC ! 22988: * ! 22989: * EXNUL -- EXIT WITH NULL RESULT ! 22990: * ! 22991: * (XL,XR) MAY BE NON-COLLECTABLE ! 22992: * BRN EXNUL JUMP TO EXIT WITH NULL VALUE ! 22993: * ! 22994: * EXNUL CONTINUES BY EXECUTING THE NEXT CODE WORD ! 22995: * ! 22996: EXNUL RTN ! 22997: MOV =NULLS,-(XS) STACK NULL VALUE ! 22998: BRN EXITS DO NEXT CODE WORD ! 22999: EJC ! 23000: .IF .CNRA ! 23001: .ELSE ! 23002: * ! 23003: * EXREA -- EXIT WITH REAL RESULT ! 23004: * ! 23005: * (XL,XR) MAY BE NON-COLLECTABLE ! 23006: * (RA) REAL VALUE ! 23007: * BRN EXREA JUMP TO EXIT WITH REAL VALUE ! 23008: * ! 23009: * EXREA CONTINUES BY EXECUTING THE NEXT CODE WORD ! 23010: * ! 23011: EXREA RTN ! 23012: JSR RCBLD BUILD RCBLK ! 23013: BRN EXIXR JUMP TO EXIT WITH RESULT IN XR ! 23014: .FI ! 23015: EJC ! 23016: * ! 23017: * EXSID -- EXIT SETTING ID FIELD ! 23018: * ! 23019: * EXSID IS USED TO EXIT AFTER BUILDING ANY OF THE FOLLOWING ! 23020: * BLOCKS (ARBLK, TBBLK, PDBLK, VCBLK). IT SETS THE IDVAL. ! 23021: * ! 23022: * (XR) PTR TO BLOCK WITH IDVAL FIELD ! 23023: * (XL) MAY BE NON-COLLECTABLE ! 23024: * BRN EXSID JUMP TO EXIT AFTER SETTING ID FIELD ! 23025: * ! 23026: * EXSID CONTINUES BY EXECUTING THE NEXT CODE WORD ! 23027: * ! 23028: EXSID RTN ! 23029: MOV CURID,WA LOAD CURRENT ID VALUE ! 23030: BNE WA,=CFP$M,EXSI1 JUMP IF NO OVERFLOW ! 23031: ZER WA ELSE RESET FOR WRAPAROUND ! 23032: * ! 23033: * HERE WITH OLD IDVAL IN WA ! 23034: * ! 23035: EXSI1 ICV WA BUMP ID VALUE ! 23036: MOV WA,CURID STORE FOR NEXT TIME ! 23037: MOV WA,IDVAL(XR) STORE ID VALUE ! 23038: BRN EXIXR EXIT WITH RESULT IN (XR) ! 23039: EJC ! 23040: * ! 23041: * EXVNM -- EXIT WITH NAME OF VARIABLE ! 23042: * ! 23043: * EXVNM EXITS AFTER STACKING A VALUE WHICH IS A NMBLK ! 23044: * REFERENCING THE NAME OF A GIVEN NATURAL VARIABLE. ! 23045: * ! 23046: * (XR) VRBLK POINTER ! 23047: * (XL) MAY BE NON-COLLECTABLE ! 23048: * BRN EXVNM EXIT WITH VRBLK POINTER IN XR ! 23049: * ! 23050: EXVNM RTN ! 23051: MOV XR,XL COPY NAME BASE POINTER ! 23052: MOV *NMSI$,WA SET SIZE OF NMBLK ! 23053: JSR ALLOC ALLOCATE NMBLK ! 23054: MOV =B$NML,(XR) STORE TYPE WORD ! 23055: MOV XL,NMBAS(XR) STORE NAME BASE ! 23056: MOV *VRVAL,NMOFS(XR) STORE NAME OFFSET ! 23057: BRN EXIXR EXIT WITH RESULT IN XR ! 23058: EJC ! 23059: * ! 23060: * FLPOP -- FAIL AND POP IN PATTERN MATCHING ! 23061: * ! 23062: * FLPOP POPS THE NODE AND CURSOR ON THE STACK AND THEN ! 23063: * DROPS THROUGH INTO FAILP TO CAUSE PATTERN FAILURE ! 23064: * ! 23065: * (XL,XR) MAY BE NON-COLLECTABLE ! 23066: * BRN FLPOP JUMP TO FAIL AND POP STACK ! 23067: * ! 23068: FLPOP RTN ! 23069: ADD *NUM02,XS POP TWO ENTRIES OFF STACK ! 23070: EJC ! 23071: * ! 23072: * FAILP -- FAILURE IN MATCHING PATTERN NODE ! 23073: * ! 23074: * FAILP IS USED AFTER FAILING TO MATCH A PATTERN NODE. ! 23075: * SEE PATTERN MATCH ROUTINES FOR DETAILS OF USE. ! 23076: * ! 23077: * (XL,XR) MAY BE NON-COLLECTABLE ! 23078: * BRN FAILP SIGNAL FAILURE TO MATCH ! 23079: * ! 23080: * FAILP CONTINUES BY MATCHING AN ALTERNATIVE FROM THE STACK ! 23081: * ! 23082: FAILP RTN ! 23083: MOV (XS)+,XR LOAD ALTERNATIVE NODE POINTER ! 23084: MOV (XS)+,WB RESTORE OLD CURSOR ! 23085: MOV (XR),XL LOAD PCODE ENTRY POINTER ! 23086: BRI XL JUMP TO EXECUTE CODE FOR NODE ! 23087: EJC ! 23088: * ! 23089: * INDIR -- COMPUTE INDIRECT REFERENCE ! 23090: * ! 23091: * (WB) NONZERO/ZERO FOR BY NAME/VALUE ! 23092: * BRN INDIR JUMP TO GET INDIRECT REF ON STACK ! 23093: * ! 23094: * INDIR CONTINUES BY EXECUTING THE NEXT CODE WORD ! 23095: * ! 23096: INDIR RTN ! 23097: MOV (XS)+,XR LOAD ARGUMENT ! 23098: BEQ (XR),=B$NML,INDR2 JUMP IF A NAME ! 23099: JSR GTNVR ELSE CONVERT TO VARIABLE ! 23100: ERR 239,INDIRECTION OPERAND IS NOT NAME ! 23101: BZE WB,INDR1 SKIP IF BY VALUE ! 23102: MOV XR,-(XS) ELSE STACK VRBLK PTR ! 23103: MOV *VRVAL,-(XS) STACK NAME OFFSET ! 23104: BRN EXITS EXIT WITH RESULT ON STACK ! 23105: * ! 23106: * HERE TO GET VALUE OF NATURAL VARIABLE ! 23107: * ! 23108: INDR1 BRI (XR) JUMP THROUGH VRGET FIELD OF VRBLK ! 23109: * ! 23110: * HERE IF OPERAND IS A NAME ! 23111: * ! 23112: INDR2 MOV NMBAS(XR),XL LOAD NAME BASE ! 23113: MOV NMOFS(XR),WA LOAD NAME OFFSET ! 23114: BNZ WB,EXNAM EXIT IF CALLED BY NAME ! 23115: JSR ACESS ELSE GET VALUE FIRST ! 23116: PPM EXFAL FAIL IF ACCESS FAILS ! 23117: BRN EXIXR ELSE RETURN WITH VALUE IN XR ! 23118: EJC ! 23119: * ! 23120: * MATCH -- INITIATE PATTERN MATCH ! 23121: * ! 23122: * (WB) MATCH TYPE CODE ! 23123: * BRN MATCH JUMP TO INITIATE PATTERN MATCH ! 23124: * ! 23125: * MATCH CONTINUES BY EXECUTING THE PATTERN MATCH. SEE ! 23126: * PATTERN MATCH ROUTINES (P$XXX) FOR FULL DETAILS. ! 23127: * ! 23128: MATCH RTN ! 23129: MOV (XS)+,XR LOAD PATTERN OPERAND ! 23130: JSR GTPAT CONVERT TO PATTERN ! 23131: ERR 240,PATTERN MATCH RIGHT OPERAND IS NOT PATTERN ! 23132: MOV XR,XL IF OK, SAVE PATTERN POINTER ! 23133: BNZ WB,MTCH1 JUMP IF NOT MATCH BY NAME ! 23134: MOV (XS),WA ELSE LOAD NAME OFFSET ! 23135: MOV XL,-(XS) SAVE PATTERN POINTER ! 23136: MOV 2(XS),XL LOAD NAME BASE ! 23137: JSR ACESS ACCESS SUBJECT VALUE ! 23138: PPM EXFAL FAIL IF ACCESS FAILS ! 23139: MOV (XS),XL RESTORE PATTERN POINTER ! 23140: MOV XR,(XS) STACK SUBJECT STRING VAL FOR MERGE ! 23141: ZER WB RESTORE TYPE CODE ! 23142: * ! 23143: * MERGE HERE WITH SUBJECT VALUE ON STACK ! 23144: * ! 23145: .IF .CNBF ! 23146: MTCH1 JSR GTSTG CONVERT SUBJECT TO STRING ! 23147: .ELSE ! 23148: MTCH1 MOV (XS),XR LOAD SUBJECT VALUE ! 23149: ZER R$PMB ASSUME NOT A BUFFER ! 23150: BNE (XR),=B$BCT,MTCHA BRANCH IF NOT ! 23151: ICA XS ELSE POP VALUE ! 23152: MOV XR,R$PMB SAVE POINTER ! 23153: MOV BCLEN(XR),WA GET DEFINED LENGTH ! 23154: MOV BCBUF(XR),XR POINT TO BFBLK ! 23155: BRN MTCHB ! 23156: * ! 23157: * HERE IF NOT BUFFER TO CONVERT TO STRING ! 23158: * ! 23159: MTCHA JSR GTSTG NOT BUFFER - CONVERT TO STRING ! 23160: .FI ! 23161: ERR 241,PATTERN MATCH LEFT OPERAND IS NOT STRING ! 23162: * ! 23163: * MERGE WITH BUFFER OR STRING ! 23164: * ! 23165: MTCHB MOV XR,R$PMS IF OK, STORE SUBJECT STRING POINTER ! 23166: MOV WA,PMSSL AND LENGTH ! 23167: MOV WB,-(XS) STACK MATCH TYPE CODE ! 23168: ZER -(XS) STACK INITIAL CURSOR (ZERO) ! 23169: ZER WB SET INITIAL CURSOR ! 23170: MOV XS,PMHBS SET HISTORY STACK BASE PTR ! 23171: ZER PMDFL RESET PATTERN ASSIGNMENT FLAG ! 23172: MOV XL,XR SET INITIAL NODE POINTER ! 23173: BNZ KVANC,MTCH2 JUMP IF ANCHORED ! 23174: * ! 23175: * HERE FOR UNANCHORED ! 23176: * ! 23177: MOV XR,-(XS) STACK INITIAL NODE POINTER ! 23178: MOV =NDUNA,-(XS) STACK POINTER TO ANCHOR MOVE NODE ! 23179: BRI (XR) START MATCH OF FIRST NODE ! 23180: * ! 23181: * HERE IN ANCHORED MODE ! 23182: * ! 23183: MTCH2 ZER -(XS) DUMMY CURSOR VALUE ! 23184: MOV =NDABO,-(XS) STACK POINTER TO ABORT NODE ! 23185: BRI (XR) START MATCH OF FIRST NODE ! 23186: EJC ! 23187: * ! 23188: * RETRN -- RETURN FROM FUNCTION ! 23189: * ! 23190: * (WA) STRING POINTER FOR RETURN TYPE ! 23191: * BRN RETRN JUMP TO RETURN FROM (SNOBOL) FUNC ! 23192: * ! 23193: * RETRN CONTINUES BY EXECUTING THE CODE AT THE RETURN POINT ! 23194: * THE STACK IS CLEANED OF ANY GARBAGE LEFT BY OTHER ! 23195: * ROUTINES WHICH MAY HAVE ALTERED FLPTR SINCE FUNCTION ! 23196: * ENTRY BY USING FLPRT, RESERVED FOR USE ONLY BY ! 23197: * FUNCTION CALL AND RETURN. ! 23198: * ! 23199: RETRN RTN ! 23200: BNZ KVFNC,RTN01 JUMP IF NOT LEVEL ZERO ! 23201: ERB 242,FUNCTION RETURN FROM LEVEL ZERO ! 23202: * ! 23203: * HERE IF NOT LEVEL ZERO RETURN ! 23204: * ! 23205: RTN01 MOV FLPRT,XS POP STACK ! 23206: ICA XS REMOVE FAILURE OFFSET ! 23207: MOV (XS)+,XR POP PFBLK POINTER ! 23208: MOV (XS)+,FLPTR POP FAILURE POINTER ! 23209: MOV (XS)+,FLPRT POP OLD FLPRT ! 23210: MOV (XS)+,WB POP CODE POINTER OFFSET ! 23211: MOV (XS)+,WC POP OLD CODE BLOCK POINTER ! 23212: ADD WC,WB MAKE OLD CODE POINTER ABSOLUTE ! 23213: LCP WB RESTORE OLD CODE POINTER ! 23214: MOV WC,R$COD RESTORE OLD CODE BLOCK POINTER ! 23215: DCV KVFNC DECREMENT FUNCTION LEVEL ! 23216: MOV KVTRA,WB LOAD TRACE ! 23217: ADD KVFTR,WB ADD FTRACE ! 23218: BZE WB,RTN06 JUMP IF NO TRACING POSSIBLE ! 23219: * ! 23220: * HERE IF THERE MAY BE A TRACE ! 23221: * ! 23222: MOV WA,-(XS) SAVE FUNCTION RETURN TYPE ! 23223: MOV XR,-(XS) SAVE PFBLK POINTER ! 23224: MOV WA,KVRTN SET RTNTYPE FOR TRACE FUNCTION ! 23225: MOV R$FNC,XL LOAD FNCLEVEL TRBLK PTR (IF ANY) ! 23226: JSR KTREX EXECUTE POSSIBLE FNCLEVEL TRACE ! 23227: MOV PFVBL(XR),XL LOAD VRBLK PTR (SGD13) ! 23228: BZE KVTRA,RTN02 JUMP IF TRACE IS OFF ! 23229: MOV PFRTR(XR),XR ELSE LOAD RETURN TRACE TRBLK PTR ! 23230: BZE XR,RTN02 JUMP IF NOT RETURN TRACED ! 23231: DCV KVTRA ELSE DECREMENT TRACE COUNT ! 23232: BZE TRFNC(XR),RTN03 JUMP IF PRINT TRACE ! 23233: MOV *VRVAL,WA ELSE SET NAME OFFSET ! 23234: MOV 1(XS),KVRTN MAKE SURE RTNTYPE IS SET RIGHT ! 23235: JSR TRXEQ EXECUTE FULL TRACE ! 23236: EJC ! 23237: * ! 23238: * RETRN (CONTINUED) ! 23239: * ! 23240: * HERE TO TEST FOR FTRACE ! 23241: * ! 23242: RTN02 BZE KVFTR,RTN05 JUMP IF FTRACE IS OFF ! 23243: DCV KVFTR ELSE DECREMENT FTRACE ! 23244: * ! 23245: * HERE FOR PRINT TRACE OF FUNCTION RETURN ! 23246: * ! 23247: RTN03 JSR PRTSN PRINT STATEMENT NUMBER ! 23248: MOV 1(XS),XR LOAD RETURN TYPE ! 23249: JSR PRTST PRINT IT ! 23250: MOV =CH$BL,WA LOAD BLANK ! 23251: JSR PRTCH PRINT IT ! 23252: MOV 0(XS),XL LOAD PFBLK PTR ! 23253: MOV PFVBL(XL),XL LOAD FUNCTION VRBLK PTR ! 23254: MOV *VRVAL,WA SET VRBLK NAME OFFSET ! 23255: BNE XR,=SCFRT,RTN04 JUMP IF NOT FRETURN CASE ! 23256: * ! 23257: * FOR FRETURN, JUST PRINT FUNCTION NAME ! 23258: * ! 23259: JSR PRTNM PRINT NAME ! 23260: JSR PRTNL TERMINATE PRINT LINE ! 23261: BRN RTN05 MERGE ! 23262: * ! 23263: * HERE FOR RETURN OR NRETURN, PRINT FUNCTION NAME = VALUE ! 23264: * ! 23265: RTN04 JSR PRTNV PRINT NAME = VALUE ! 23266: * ! 23267: * HERE AFTER COMPLETING TRACE ! 23268: * ! 23269: RTN05 MOV (XS)+,XR POP PFBLK POINTER ! 23270: MOV (XS)+,WA POP RETURN TYPE STRING ! 23271: * ! 23272: * MERGE HERE IF NO TRACE REQUIRED ! 23273: * ! 23274: RTN06 MOV WA,KVRTN SET RTNTYPE KEYWORD ! 23275: MOV PFVBL(XR),XL LOAD POINTER TO FN VRBLK ! 23276: EJC ! 23277: * RETRN (CONTINUED) ! 23278: * ! 23279: * GET VALUE OF FUNCTION ! 23280: * ! 23281: RTN07 MOV XL,RTNBP SAVE BLOCK POINTER ! 23282: MOV VRVAL(XL),XL LOAD VALUE ! 23283: BEQ (XL),=B$TRT,RTN07 LOOP BACK IF TRAPPED ! 23284: MOV XL,RTNFV ELSE SAVE FUNCTION RESULT VALUE ! 23285: MOV (XS)+,RTNSV SAVE ORIGINAL FUNCTION VALUE ! 23286: .IF .CNPF ! 23287: MOV FARGS(XR),WB GET NUMBER OF ARGUMENTS ! 23288: .ELSE ! 23289: MOV (XS)+,XL POP SAVED POINTER ! 23290: BZE XL,RTN7C NO ACTION IF NONE ! 23291: BZE KVPFL,RTN7C JUMP IF NO PROFILING ! 23292: JSR PRFLU ELSE PROFILE LAST FUNC STMT ! 23293: BEQ KVPFL,=NUM02,RTN7A BRANCH ON VALUE OF PROFILE KEYWD ! 23294: * ! 23295: * HERE IF &PROFILE = 1. START TIME MUST BE FRIGGED TO ! 23296: * APPEAR EARLIER THAN IT ACTUALLY IS, BY AMOUNT USED BEFORE ! 23297: * THE CALL. ! 23298: * ! 23299: LDI PFSTM LOAD CURRENT TIME ! 23300: SBI ICVAL(XL) FRIG BY SUBTRACTING SAVED AMOUNT ! 23301: BRN RTN7B AND MERGE ! 23302: * ! 23303: * HERE IF &PROFILE = 2 ! 23304: * ! 23305: RTN7A LDI ICVAL(XL) LOAD SAVED TIME ! 23306: * ! 23307: * BOTH PROFILE TYPES MERGE HERE ! 23308: * ! 23309: RTN7B STI PFSTM STORE BACK CORRECT START TIME ! 23310: * ! 23311: * MERGE HERE IF NO PROFILING ! 23312: * ! 23313: RTN7C MOV FARGS(XR),WB GET NUMBER OF ARGS ! 23314: .FI ! 23315: ADD PFNLO(XR),WB ADD NUMBER OF LOCALS ! 23316: BZE WB,RTN10 JUMP IF NO ARGS/LOCALS ! 23317: LCT WB,WB ELSE SET LOOP COUNTER ! 23318: ADD PFLEN(XR),XR AND POINT TO END OF PFBLK ! 23319: * ! 23320: * LOOP TO RESTORE FUNCTIONS AND LOCALS ! 23321: * ! 23322: RTN08 MOV -(XR),XL LOAD NEXT VRBLK POINTER ! 23323: * ! 23324: * LOOP TO FIND VALUE BLOCK ! 23325: * ! 23326: RTN09 MOV XL,WA SAVE BLOCK POINTER ! 23327: MOV VRVAL(XL),XL LOAD POINTER TO NEXT VALUE ! 23328: BEQ (XL),=B$TRT,RTN09 LOOP BACK IF TRAPPED ! 23329: MOV WA,XL ELSE RESTORE LAST BLOCK POINTER ! 23330: MOV (XS)+,VRVAL(XL) RESTORE OLD VARIABLE VALUE ! 23331: BCT WB,RTN08 LOOP TILL ALL PROCESSED ! 23332: * ! 23333: * NOW RESTORE FUNCTION VALUE AND EXIT ! 23334: * ! 23335: RTN10 MOV RTNBP,XL RESTORE PTR TO LAST FUNCTION BLOCK ! 23336: MOV RTNSV,VRVAL(XL) RESTORE OLD FUNCTION VALUE ! 23337: MOV RTNFV,XR RELOAD FUNCTION RESULT ! 23338: MOV R$COD,XL POINT TO NEW CODE BLOCK ! 23339: MOV KVSTN,KVLST SET LASTNO FROM STNO ! 23340: MOV CDSTM(XL),KVSTN RESET PROPER STNO VALUE ! 23341: MOV KVRTN,WA LOAD RETURN TYPE ! 23342: BEQ WA,=SCRTN,EXIXR EXIT WITH RESULT IN XR IF RETURN ! 23343: BEQ WA,=SCFRT,EXFAL FAIL IF FRETURN ! 23344: EJC ! 23345: * ! 23346: * RETRN (CONTINUED) ! 23347: * ! 23348: * HERE FOR NRETURN ! 23349: * ! 23350: BEQ (XR),=B$NML,RTN11 JUMP IF IS A NAME ! 23351: JSR GTNVR ELSE TRY CONVERT TO VARIABLE NAME ! 23352: ERR 243,FUNCTION RESULT IN NRETURN IS NOT NAME ! 23353: MOV XR,XL IF OK, COPY VRBLK (NAME BASE) PTR ! 23354: MOV *VRVAL,WA SET NAME OFFSET ! 23355: BRN RTN12 AND MERGE ! 23356: * ! 23357: * HERE IF RETURNED RESULT IS A NAME ! 23358: * ! 23359: RTN11 MOV NMBAS(XR),XL LOAD NAME BASE ! 23360: MOV NMOFS(XR),WA LOAD NAME OFFSET ! 23361: * ! 23362: * MERGE HERE WITH RETURNED NAME IN (XL,WA) ! 23363: * ! 23364: RTN12 MOV XL,XR PRESERVE XL ! 23365: LCW WB LOAD NEXT WORD ! 23366: MOV XR,XL RESTORE XL ! 23367: BEQ WB,=OFNE$,EXNAM EXIT IF CALLED BY NAME ! 23368: MOV WB,-(XS) ELSE SAVE CODE WORD ! 23369: JSR ACESS GET VALUE ! 23370: PPM EXFAL FAIL IF ACCESS FAILS ! 23371: MOV XR,XL IF OK, COPY RESULT ! 23372: MOV (XS),XR RELOAD NEXT CODE WORD ! 23373: MOV XL,(XS) STORE RESULT ON STACK ! 23374: MOV (XR),XL LOAD ROUTINE ADDRESS ! 23375: BRI XL JUMP TO EXECUTE NEXT CODE WORD ! 23376: EJC ! 23377: * ! 23378: * STCOV -- SIGNAL STATEMENT COUNTER OVERFLOW ! 23379: * ! 23380: * BRN STCOV JUMP TO SIGNAL STATEMENT COUNT OFLO ! 23381: * ! 23382: * PERMIT UP TO 10 MORE STATEMENTS TO BE OBEYED SO THAT ! 23383: * SETEXIT TRAP CAN REGAIN CONTROL. ! 23384: * STCOV CONTINUES BY ISSUING THE ERROR MESSAGE ! 23385: * ! 23386: STCOV RTN ! 23387: ICV ERRFT FATAL ERROR ! 23388: LDI INTVT GET 10 ! 23389: ADI KVSTL ADD TO FORMER LIMIT ! 23390: STI KVSTL STORE AS NEW STLIMIT ! 23391: LDI INTVT GET 10 ! 23392: STI KVSTC SET AS NEW COUNT ! 23393: ERB 244,STATEMENT COUNT EXCEEDS VALUE OF STLIMIT KEYWORD ! 23394: EJC ! 23395: * ! 23396: * STMGO -- START EXECUTION OF NEW STATEMENT ! 23397: * ! 23398: * (XR) POINTER TO CDBLK FOR NEW STATEMENT ! 23399: * BRN STMGO JUMP TO EXECUTE NEW STATEMENT ! 23400: * ! 23401: * STMGO CONTINUES BY EXECUTING THE NEXT STATEMENT ! 23402: * ! 23403: STMGO RTN ! 23404: MOV XR,R$COD SET NEW CODE BLOCK POINTER ! 23405: .IF .CNPF ! 23406: MOV KVSTN,KVLST SET LASTNO ! 23407: .ELSE ! 23408: BZE KVPFL,STGO1 SKIP IF NO PROFILING ! 23409: JSR PRFLU ELSE PROFILE THE STATEMENT ! 23410: STGO1 MOV KVSTN,KVLST SET LASTNO ! 23411: .FI ! 23412: MOV CDSTM(XR),KVSTN SET STNO ! 23413: ADD *CDCOD,XR POINT TO FIRST CODE WORD ! 23414: LCP XR SET CODE POINTER ! 23415: LDI KVSTC GET STMT COUNT ! 23416: ILT EXITS OMIT COUNTING IF NEGATIVE ! 23417: IEQ STCOV FAIL IF STLIMIT REACHED ! 23418: SBI INTV1 DECREMENT ! 23419: STI KVSTC REPLACE IT ! 23420: BZE R$STC,EXITS EXIT IF NO STCOUNT TRACE ! 23421: * ! 23422: * HERE FOR STCOUNT TRACE ! 23423: * ! 23424: ZER XR CLEAR GARBAGE VALUE IN XR ! 23425: MOV R$STC,XL LOAD POINTER TO STCOUNT TRBLK ! 23426: JSR KTREX EXECUTE KEYWORD TRACE ! 23427: BRN EXITS AND THEN EXIT FOR NEXT CODE WORD ! 23428: EJC ! 23429: * ! 23430: * STOPR -- TERMINATE RUN ! 23431: * ! 23432: * (XR) POINTS TO ENDING MESSAGE ! 23433: * BRN STOPR JUMP TO TERMINATE RUN ! 23434: * ! 23435: * TERMINATE RUN AND PRINT STATISTICS. ON ENTRY XR POINTS ! 23436: * TO ENDING MESSAGE OR IS ZERO IF MESSAGE PRINTED ALREADY. ! 23437: * ! 23438: STOPR RTN ! 23439: .IF .CSAX ! 23440: BZE XR,STPRA SKIP IF SYSAX ALREADY CALLED (REG04) ! 23441: JSR SYSAX CALL AFTER EXECUTION PROC ! 23442: STPRA ADD RSMEM,DNAME USE THE RESERVE MEMORY ! 23443: .ELSE ! 23444: ADD RSMEM,DNAME USE THE RESERVE MEMORY ! 23445: .FI ! 23446: BNE XR,=ENDMS,STPR0 SKIP IF NOT NORMAL END MESSAGE ! 23447: BNZ EXSTS,STPR3 SKIP IF EXEC STATS SUPPRESSED ! 23448: ZER ERICH CLEAR ERRORS TO INT.CH. FLAG ! 23449: * ! 23450: * LOOK TO SEE IF AN ENDING MESSAGE IS SUPPLIED ! 23451: * ! 23452: STPR0 JSR PRTPG EJECT PRINTER ! 23453: BZE XR,STPR1 SKIP IF NO MESSAGE ! 23454: JSR PRTST PRINT MESSAGE ! 23455: * ! 23456: * MERGE HERE IF NO MESSAGE TO PRINT ! 23457: * ! 23458: STPR1 JSR PRTIS PRINT BLANK LINE ! 23459: MTI KVSTN GET STATEMENT NUMBER ! 23460: MOV =STPM1,XR POINT TO MESSAGE /IN STATEMENT XXX/ ! 23461: JSR PRTMX PRINT IT ! 23462: JSR SYSTM GET CURRENT TIME ! 23463: SBI TIMSX MINUS START TIME = ELAPSED EXEC TIM ! 23464: STI STPTI SAVE FOR LATER ! 23465: MOV =STPM3,XR POINT TO MSG /EXECUTION TIME MSEC / ! 23466: JSR PRTMX PRINT IT ! 23467: LDI KVSTL GET STATEMENT LIMIT ! 23468: ILT STPR2 SKIP IF NEGATIVE ! 23469: SBI KVSTC MINUS COUNTER = COUNT ! 23470: STI STPSI SAVE ! 23471: MOV =STPM2,XR POINT TO MESSAGE /STMTS EXECUTED/ ! 23472: JSR PRTMX PRINT IT ! 23473: LDI STPTI RELOAD ELAPSED TIME ! 23474: MLI INTTH *1000 (MICROSECS) ! 23475: IOV STPR2 JUMP IF WE CANNOT COMPUTE ! 23476: DVI STPSI DIVIDE BY STATEMENT COUNT ! 23477: IOV STPR2 JUMP IF OVERFLOW ! 23478: MOV =STPM4,XR POINT TO MSG (MCSEC PER STATEMENT / ! 23479: JSR PRTMX PRINT IT ! 23480: EJC ! 23481: * ! 23482: * STOPR (CONTINUED) ! 23483: * ! 23484: * MERGE TO SKIP MESSAGE (OVERFLOW OR NEGATIVE STLIMIT) ! 23485: * ! 23486: STPR2 MTI GBCNT LOAD COUNT OF COLLECTIONS ! 23487: MOV =STPM5,XR POINT TO MESSAGE /REGENERATIONS / ! 23488: JSR PRTMX PRINT IT ! 23489: JSR PRTIS ONE MORE BLANK FOR LUCK ! 23490: * ! 23491: * CHECK IF DUMP REQUESTED ! 23492: * ! 23493: .IF .CNPF ! 23494: STPR3 MOV KVDMP,XR LOAD DUMP KEYWORD ! 23495: .ELSE ! 23496: STPR3 JSR PRFLR PRINT PROFILE IF WANTED ! 23497: * ! 23498: MOV KVDMP,XR LOAD DUMP KEYWORD ! 23499: .FI ! 23500: JSR DUMPR EXECUTE DUMP IF REQUESTED ! 23501: MOV R$FCB,XL GET FCBLK CHAIN HEAD ! 23502: MOV KVABE,WA LOAD ABEND VALUE ! 23503: MOV KVCOD,WB LOAD CODE VALUE ! 23504: JSR SYSEJ EXIT TO SYSTEM ! 23505: EJC ! 23506: * ! 23507: * SUCCP -- SIGNAL SUCCESSFUL MATCH OF A PATTERN NODE ! 23508: * ! 23509: * SEE PATTERN MATCH ROUTINES FOR DETAILS ! 23510: * ! 23511: * (XR) CURRENT NODE ! 23512: * (WB) CURRENT CURSOR ! 23513: * (XL) MAY BE NON-COLLECTABLE ! 23514: * BRN SUCCP SIGNAL SUCCESSFUL PATTERN MATCH ! 23515: * ! 23516: * SUCCP CONTINUES BY MATCHING THE SUCCESSOR NODE ! 23517: * ! 23518: SUCCP RTN ! 23519: MOV PTHEN(XR),XR LOAD SUCCESSOR NODE ! 23520: MOV (XR),XL LOAD NODE CODE ENTRY ADDRESS ! 23521: BRI XL JUMP TO MATCH SUCCESSOR NODE ! 23522: EJC ! 23523: * ! 23524: * SYSAB -- PRINT /ABNORMAL END/ AND TERMINATE ! 23525: * ! 23526: SYSAB RTN ! 23527: MOV =ENDAB,XR POINT TO MESSAGE ! 23528: MOV =NUM01,KVABE SET ABEND FLAG ! 23529: JSR PRTNL SKIP TO NEW LINE ! 23530: BRN STOPR JUMP TO PACK UP ! 23531: EJC ! 23532: * ! 23533: * SYSTU -- PRINT /TIME UP/ AND TERMINATE ! 23534: * ! 23535: SYSTU RTN ! 23536: MOV =ENDTU,XR POINT TO MESSAGE ! 23537: MOV STRTU,WA GET CHARS /TU/ ! 23538: MOV WA,KVCOD PUT IN KVCOD ! 23539: MOV TIMUP,WA CHECK STATE OF TIMEUP SWITCH ! 23540: MNZ TIMUP SET SWITCH ! 23541: BNZ WA,STOPR STOP RUN IF ALREADY SET ! 23542: ERB 245,TRANSLATION/EXECUTION TIME EXPIRED ! 23543: TTL S P I T B O L -- STACK OVERFLOW SECTION ! 23544: * ! 23545: * CONTROL COMES HERE IF THE MAIN STACK OVERFLOWS ! 23546: * ! 23547: SEC START OF STACK OVERFLOW SECTION ! 23548: * ! 23549: ICV ERRFT FATAL ERROR ! 23550: MOV FLPTR,XS POP STACK TO AVOID MORE FAILS ! 23551: BNZ GBCFL,STAK1 JUMP IF GARBAGE COLLECTING ! 23552: ERB 246,STACK OVERFLOW ! 23553: * ! 23554: * NO CHANCE OF RECOVERY IN MID GARBAGE COLLECTION ! 23555: * ! 23556: STAK1 MOV =ENDSO,XR POINT TO MESSAGE ! 23557: ZER KVDMP MEMORY IS UNDUMPABLE ! 23558: BRN STOPR GIVE UP ! 23559: TTL S P I T B O L -- ERROR SECTION ! 23560: * ! 23561: * THIS SECTION OF CODE IS ENTERED WHENEVER A PROCEDURE ! 23562: * RETURN VIA AN ERR PARAMETER OR AN ERB OPCODE IS OBEYED. ! 23563: * ! 23564: * (WA) IS THE ERROR CODE ! 23565: * ! 23566: * THE GLOBAL VARIABLE STAGE INDICATES THE POINT AT WHICH ! 23567: * THE ERROR OCCURED AS FOLLOWS. ! 23568: * ! 23569: * STAGE=STGIC ERROR DURING INITIAL COMPILE ! 23570: * ! 23571: * STAGE=STGXC ERROR DURING COMPILE AT EXECUTE ! 23572: * TIME (CODE, CONVERT FUNCTION CALLS) ! 23573: * ! 23574: * STAGE=STGEV ERROR DURING COMPILATION OF ! 23575: * EXPRESSION AT EXECUTION TIME ! 23576: * (EVAL, CONVERT FUNCTION CALL). ! 23577: * ! 23578: * STAGE=STGXT ERROR AT EXECUTE TIME. COMPILER ! 23579: * NOT ACTIVE. ! 23580: * ! 23581: * STAGE=STGCE ERROR DURING INITIAL COMPILE AFTER ! 23582: * SCANNING OUT THE END LINE. ! 23583: * ! 23584: * STAGE=STGXE ERROR DURING COMPILE AT EXECUTE ! 23585: * TIME AFTER SCANNING END LINE. ! 23586: * ! 23587: * STAGE=STGEE ERROR DURING EXPRESSION EVALUATION ! 23588: * ! 23589: SEC START OF ERROR SECTION ! 23590: * ! 23591: ERROR BEQ R$CIM,=CMLAB,CMPLE JUMP IF ERROR IN SCANNING LABEL ! 23592: MOV WA,KVERT SAVE ERROR CODE ! 23593: ZER SCNRS RESET RESCAN SWITCH FOR SCANE ! 23594: ZER SCNGO RESET GOTO SWITCH FOR SCANE ! 23595: MOV STAGE,XR LOAD CURRENT STAGE ! 23596: BSW XR,STGNO JUMP TO APPROPRIATE ERROR CIRCUIT ! 23597: IFF STGIC,ERR01 INITIAL COMPILE ! 23598: IFF STGXC,ERR04 EXECUTE TIME COMPILE ! 23599: IFF STGEV,ERR04 EVAL COMPILING EXPR. ! 23600: IFF STGEE,ERR04 EVAL EVALUATING EXPR ! 23601: IFF STGXT,ERR05 EXECUTE TIME ! 23602: IFF STGCE,ERR01 COMPILE - AFTER END ! 23603: IFF STGXE,ERR04 XEQ COMPILE-PAST END ! 23604: ESW END SWITCH ON ERROR TYPE ! 23605: EJC ! 23606: * ! 23607: * ERROR DURING INITIAL COMPILE ! 23608: * ! 23609: * THE ERROR MESSAGE IS PRINTED AS PART OF THE COMPILER ! 23610: * OUTPUT. THIS PRINTOUT INCLUDES THE OFFENDING LINE (IF NOT ! 23611: * PRINTED ALREADY) AND AN ERROR FLAG UNDER THE APPROPRIATE ! 23612: * COLUMN AS INDICATED BY SCNSE UNLESS SCNSE IS SET TO ZERO. ! 23613: * ! 23614: * AFTER PRINTING THE MESSAGE, THE GENERATED CODE IS ! 23615: * MODIFIED TO AN ERROR CALL AND CONTROL IS RETURNED TO ! 23616: * THE CMPIL PROCEDURE AFTER RESETTING THE STACK POINTER. ! 23617: * ! 23618: * IF THE ERROR OCCURS AFTER THE END LINE, CONTROL RETURNS ! 23619: * IN A SLIGHTLY DIFFERENT MANNER TO ENSURE PROPER CLEANUP. ! 23620: * ! 23621: ERR01 MOV CMPXS,XS RESET STACK POINTER ! 23622: SSL CMPSS RESTORE S-R STACK PTR FOR CMPIL ! 23623: BNZ ERRSP,ERR03 JUMP IF ERROR SUPPRESS FLAG SET ! 23624: MOV ERICH,ERLST SET FLAG FOR LISTR ! 23625: JSR LISTR LIST LINE ! 23626: JSR PRTIS TERMINATE LISTING ! 23627: ZER ERLST CLEAR LISTR FLAG ! 23628: MOV SCNSE,WA LOAD SCAN ELEMENT OFFSET ! 23629: BZE WA,ERR02 SKIP IF NOT SET ! 23630: .IF .CAHT ! 23631: LCT WB,WA LOOP COUNTER ! 23632: ICV WA INCREASE FOR CH$EX ! 23633: JSR ALOCS STRING BLOCK FOR ERROR FLAG ! 23634: MOV XR,WA REMEMBER STRING PTR ! 23635: PSC XR READY FOR CHARACTER STORING ! 23636: MOV R$CIM,XL POINT TO BAD STATEMENT ! 23637: PLC XL READY TO GET CHARS ! 23638: * ! 23639: * LOOP TO REPLACE ALL CHARS BUT TABS BY BLANKS ! 23640: * ! 23641: ERRA1 LCH WC,(XL)+ GET NEXT CHAR ! 23642: BEQ WC,=CH$HT,ERRA2 SKIP IF TAB ! 23643: MOV =CH$BL,WC GET A BLANK ! 23644: EJC ! 23645: * ! 23646: * MERGE TO STORE BLANK OR TAB IN ERROR LINE ! 23647: * ! 23648: ERRA2 SCH WC,(XR)+ STORE CHAR ! 23649: BCT WB,ERRA1 LOOP ! 23650: MOV =CH$EX,XL EXCLAMATION MARK ! 23651: SCH XL,(XR) STORE AT END OF ERROR LINE ! 23652: CSC XR END OF SCH LOOP ! 23653: MOV =STNPD,PROFS ALLOW FOR STATEMENT NUMBER ! 23654: MOV WA,XR POINT TO ERROR LINE ! 23655: JSR PRTST PRINT ERROR LINE ! 23656: .ELSE ! 23657: MTI PRLEN GET PRINT BUFFER LENGTH ! 23658: MFI GTNSI STORE AS SIGNED INTEGER ! 23659: ADD =STNPD,WA ADJUST FOR STATEMENT NUMBER ! 23660: MTI WA COPY TO INTEGER ACCUMULATOR ! 23661: RMI GTNSI REMAINDER MODULO PRINT BFR LENGTH ! 23662: STI PROFS USE AS CHARACTER OFFSET ! 23663: MOV =CH$EX,WA GET EXCLAMATION MARK ! 23664: JSR PRTCH GENERATE UNDER BAD COLUMN ! 23665: .FI ! 23666: * ! 23667: * HERE AFTER PLACING ERROR FLAG AS REQUIRED ! 23668: * ! 23669: ERR02 JSR ERMSG GENERATE FLAG AND ERROR MESSAGE ! 23670: ADD =NUM03,LSTLC BUMP PAGE CTR FOR BLANK, ERROR, BLK ! 23671: ZER XR IN CASE OF FATAL ERROR ! 23672: BHI ERRFT,=NUM03,STOPR PACK UP IF SEVERAL FATALS ! 23673: * ! 23674: * COUNT ERROR, INHIBIT EXECUTION IF REQUIRED ! 23675: * ! 23676: ICV CMERC BUMP ERROR COUNT ! 23677: ADD CSWER,NOXEQ INHIBIT XEQ IF -NOERRORS ! 23678: BNE STAGE,=STGIC,CMP10 SPECIAL RETURN IF AFTER END LINE ! 23679: EJC ! 23680: * ! 23681: * LOOP TO SCAN TO END OF STATEMENT ! 23682: * ! 23683: ERR03 MOV R$CIM,XR POINT TO START OF IMAGE ! 23684: PLC XR POINT TO FIRST CHAR ! 23685: LCH XR,(XR) GET FIRST CHAR ! 23686: BEQ XR,=CH$MN,CMPCE JUMP IF ERROR IN CONTROL CARD ! 23687: ZER SCNRS CLEAR RESCAN FLAG ! 23688: MNZ ERRSP SET ERROR SUPPRESS FLAG ! 23689: JSR SCANE SCAN NEXT ELEMENT ! 23690: BNE XL,=T$SMC,ERR03 LOOP BACK IF NOT STATEMENT END ! 23691: ZER ERRSP CLEAR ERROR SUPPRESS FLAG ! 23692: * ! 23693: * GENERATE ERROR CALL IN CODE AND RETURN TO CMPIL ! 23694: * ! 23695: MOV *CDCOD,CWCOF RESET OFFSET IN CCBLK ! 23696: MOV =OCER$,WA LOAD COMPILE ERROR CALL ! 23697: JSR CDWRD GENERATE IT ! 23698: MOV CWCOF,CMSOC(XS) SET SUCCESS FILL IN OFFSET ! 23699: MNZ CMFFC(XS) SET FAILURE FILL IN FLAG ! 23700: JSR CDWRD GENERATE SUCC. FILL IN WORD ! 23701: BRN CMPSE MERGE TO GENERATE ERROR AS CDFAL ! 23702: * ! 23703: * ERROR DURING EXECUTE TIME COMPILE OR EXPRESSION EVALUATIO ! 23704: * ! 23705: * EXECUTE TIME COMPILATION IS INITIATED THROUGH GTCOD OR ! 23706: * GTEXP WHICH ARE CALLED BY COMPILE, CODE OR EVAL. ! 23707: * BEFORE CAUSING STATEMENT FAILURE THROUGH EXFAL IT IS ! 23708: * HELPFUL TO SET KEYWORD ERRTEXT AND FOR GENERALITY ! 23709: * THESE ERRORS MAY BE HANDLED BY THE SETEXIT MECHANISM. ! 23710: * ! 23711: ERR04 ZER R$CCB FORGET GARBAGE CODE BLOCK ! 23712: SSL INISS RESTORE MAIN PROG S-R STACK PTR ! 23713: JSR ERTEX GET FAIL MESSAGE TEXT ! 23714: DCA XS ENSURE STACK OK ON LOOP START ! 23715: * ! 23716: * POP STACK UNTIL FIND FLPTR FOR MOST DEEPLY NESTED PROG. ! 23717: * DEFINED FUNCTION CALL OR CALL OF EVAL / CODE. ! 23718: * ! 23719: ERRA4 ICA XS POP STACK ! 23720: BEQ XS,FLPRT,ERRC4 JUMP IF PROG DEFINED FN CALL FOUND ! 23721: BNE XS,GTCEF,ERRA4 LOOP IF NOT EVAL OR CODE CALL YET ! 23722: MOV =STGXT,STAGE RE-SET STAGE FOR EXECUTE ! 23723: MOV R$GTC,R$COD RECOVER CODE PTR ! 23724: MOV XS,FLPTR RESTORE FAIL POINTER ! 23725: ZER R$CIM FORGET POSSIBLE IMAGE ! 23726: * ! 23727: * TEST ERRLIMIT ! 23728: * ! 23729: ERRB4 BNZ KVERL,ERR07 JUMP IF ERRLIMIT NON-ZERO ! 23730: BRN EXFAL FAIL ! 23731: * ! 23732: * RETURN FROM PROG. DEFINED FUNCTION IS OUTSTANDING ! 23733: * ! 23734: ERRC4 MOV FLPTR,XS RESTORE STACK FROM FLPTR ! 23735: BRN ERRB4 MERGE ! 23736: EJC ! 23737: * ! 23738: * ERROR AT EXECUTE TIME. ! 23739: * ! 23740: * THE ACTION TAKEN ON AN ERROR IS AS FOLLOWS. ! 23741: * ! 23742: * IF ERRLIMIT KEYWORD IS ZERO, AN ABORT IS SIGNALLED, ! 23743: * SEE CODING FOR SYSTEM LABEL ABORT AT L$ABO. ! 23744: * ! 23745: * OTHERWISE, ERRLIMIT IS DECREMENTED AND AN ERRTYPE TRACE ! 23746: * GENERATED IF REQUIRED. CONTROL RETURNS EITHER VIA A JUMP ! 23747: * TO CONTINUE (TO TAKE THE FAILURE EXIT) OR A SPECIFIED ! 23748: * SETEXIT TRAP IS EXECUTED AND CONTROL PASSES TO THE TRAP. ! 23749: * IF 3 OR MORE FATAL ERRORS OCCUR AN ABORT IS SIGNALLED ! 23750: * REGARDLESS OF ERRLIMIT AND SETEXIT - LOOPING IS ALL TOO ! 23751: * PROBABLE OTHERWISE. FATAL ERRORS INCLUDE STACK OVERFLOW ! 23752: * AND EXCEEDING STLIMIT. ! 23753: * ! 23754: ERR05 SSL INISS RESTORE MAIN PROG S-R STACK PTR ! 23755: BNZ DMVCH,ERR08 JUMP IF IN MID-DUMP ! 23756: * ! 23757: * MERGE HERE FROM ERR08 ! 23758: * ! 23759: ERR06 BZE KVERL,LABO1 ABORT IF ERRLIMIT IS ZERO ! 23760: JSR ERTEX GET FAIL MESSAGE TEXT ! 23761: * ! 23762: * MERGE FROM ERR04 ! 23763: * ! 23764: ERR07 BGE ERRFT,=NUM03,LABO1 ABORT IF TOO MANY FATAL ERRORS ! 23765: DCV KVERL DECREMENT ERRLIMIT ! 23766: MOV R$ERT,XL LOAD ERRTYPE TRACE POINTER ! 23767: JSR KTREX GENERATE ERRTYPE TRACE IF REQUIRED ! 23768: MOV R$COD,R$CNT SET CDBLK PTR FOR CONTINUATION ! 23769: MOV FLPTR,XR SET PTR TO FAILURE OFFSET ! 23770: MOV (XR),STXOF SAVE FAILURE OFFSET FOR CONTINUE ! 23771: MOV R$SXC,XR LOAD SETEXIT CDBLK POINTER ! 23772: BZE XR,LCNT1 CONTINUE IF NO SETEXIT TRAP ! 23773: ZER R$SXC ELSE RESET TRAP ! 23774: MOV =NULLS,STXVR RESET SETEXIT ARG TO NULL ! 23775: MOV (XR),XL LOAD PTR TO CODE BLOCK ROUTINE ! 23776: BRI XL EXECUTE FIRST TRAP STATEMENT ! 23777: * ! 23778: * INTERRUPTED PARTLY THROUGH A DUMP WHILST STORE IS IN A ! 23779: * MESS SO DO A TIDY UP OPERATION. SEE DUMPR FOR DETAILS. ! 23780: * ! 23781: ERR08 MOV DMVCH,XR CHAIN HEAD FOR AFFECTED VRBLKS ! 23782: BZE XR,ERR06 DONE IF ZERO ! 23783: MOV (XR),DMVCH SET NEXT LINK AS CHAIN HEAD ! 23784: JSR SETVR RESTORE VRGET FIELD ! 23785: BRN ERR08 LOOP THROUGH CHAIN ! 23786: TTL S P I T B O L -- HERE ENDETH THE CODE ! 23787: * ! 23788: * END OF ASSEMBLY ! 23789: * ! 23790: END END MACRO-SPITBOL ASSEMBLY ! 23791: ! 23792: ! 23793: ! 23794: ! 23795: ! 23796: ! 23797: ! 23798: ! 23799: ! 23800: ! 23801:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.