|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.