|
|
1.1 root 1: {{TTL{S{{{P I T B O L - REVISION HISTORY
2: {{EJC{{{{
3: * R E V I S I O N H I S T O R Y
4: * -------------------------------
5: *
6: *
7: * VERSION 3.5B (FEB 81... - SGD PATCHES)
8: * -----------------------------------
9: *
10: * SGD03 - ADDITION OF .CNCI AND SYSCI (INT->STRING
11: * SYSTEM ROUTINE OPTION)
12: * SGD04 - (06-MAY-1981) MODIFIED INILN TO 132
13: * SGD05 - (13-MAY-1981) INSERTED MISSING WTB AFTER SYSMM
14: * CALLS
15: * SGD06 - (25-MAY-1981) MERGED IN PROFILER PATCHES
16: * (NOT MARKED)
17: * SGD07 - (25-MAY-1981) MUCHO PATCHES TO PROFILER (MARKED,
18: * BUT BEST JUST TO EXTRACT ENMASSE)
19: * SGD08 - (25-MAY-1981) USE STRING LENGTH IN HASHS
20: * SGD09 - (25-MAY-1981) FIXED SERIOUS PARSER PROBLEM
21: * RELATING TO (X Y) ON LINE BEING VIEWED AS PATTERN
22: * MATCH. FIXED BY ADDITION OF NEW CMTYP VALUE
23: * C$CNP (CONCATENATION - NOT PATTERN MATCH)
24: * SGD10 - (01-AUG-1981) FIXED EXIT(N) RESPECIFICATION CODE
25: * TO PROPERLY OBSERVE HEADER SEMANTICS ON RETURN.
26: * SGD11 - (07-AUG-1981) BYPASS PRTPG CALL AT INITIALIZATION
27: * FOLLOWING COMPILATION IF NO OUTPUT GENERATED.
28: * THIS PREVENTS OUTPUT FILES CONSISTING OF THE
29: * HEADERS AND A FEW BLANK LINES WHEN THERE IS NO
30: * SOURCE LISTING AND NO COMPILATION STATS.
31: * ALSO FIX TIMSX INITIALIZATION IN SAME CODE.
32: * SGD12 - (17-AUG-1981) B$EFC CODE DID NOT CHECK FOR
33: * UNCONVERTED RESULT RETURNING NULL STRING. FIXED.
34: * SGDBF - ( NOV-1981) ADDED BUFFER TYPE AND SYMBOL CNBF
35: * SGD13 - (03-MAR-1982) LOAD PFVBL FIELD IN RETRN FOR
36: * RETURN TRACING. THIS WAS CAUSING BUG ON RETURN
37: * TRACES THAT TRIED TO ACCESS THE VARIABLE NAME
38: * SGD14 - ADDED CHAR FUNCTION. CHAR(N) RETURNS NTH
39: * CHARACTER OF HOST MACHINE CHARACTER SET.
40: * NOT CONDITIONALIZED OR MARKED.
41: * SGD15 - FIXED PROBLEM RELATING TO COMPILATION OF GOTO
42: * FIELDS CONTAINING SMALL INTEGERS (IN CONST SEC).
43: *
44: * REG01 - (XX-AUG-82)
45: * ADDED CFP$U TO EASE TRANSLATION ON SMALLER
46: * SYSTEMS - CONDITIONAL .CUCF
47: * ADDED LOWER CASE SUPPORT - CONDITIONAL .CULC
48: * ADDED SET I/O FUNCTION - CONDITIONAL .CUST
49: *
50: * REG02 - (XX-SEP-82)
51: * CHANGED INILN AND AND INILS TO 258
52: *
53: * REG03 - (XX-OCT-82)
54: * CONDITIONALIZED THE PAGE EJECT AFTER CALL TO SYSBX
55: * AND ADDED ANOTHER BEFORE CALL TO SYSBX, SO THAT,
56: * IF DESIRED BY THE IMPLEMENTOR, STANDARD OUTPUT
57: * WILL REFLECT ASSIGNMENTS MADE BY EXECUTING PROGRAM
58: * ONLY. CONDITIONAL .CUEJ CONTROLS - IF DEFINED
59: * EJECT IS BEFORE CALL TO SYSBX.
60: *
61: * REG04 - (XX-NOV-82)
62: * FIXED DIFFICULTIES WITH LISTINGS DURING EXECUTION
63: * WHEN NO LISTING GENERATED DURING COMPILATION.
64: *
65: * -LIST TO CODE() CAUSED BOMB. FIX IS TO RESET
66: * R$TTL AND R$STL TO NULLS NOT 0 AFTER COMPILATION.
67: * (LISTR AND LISTT EXPECT NULLS)
68: *
69: * WHEN LISTING AND STATISTICS ROUTED TO DIFFERENT
70: * FILE THAN EXECUTION OUTPUT, ERROR MESSAGE IS SENT
71: * TO EXECUTION OUTPUT (AND GETS SEPARATED FROM
72: * ... IN STATEMENT ... MSG). LABO1 CALLS SYSAX AND
73: * STOPR DOES NOT CALL SYSAX IF ENTERED FROM LABO1.
74: *
75: * REG05 - (XX-NOV-82)
76: * PREVENT CLEAR() FROM CLOBBERING PROTECTED VARIABLES
77: * AT LABEL SCLR5.
78: *
79: * REG06 - (XX-NOV-82)
80: * FIXED GTEXP FROM ACCEPTING TRAILING SEMICOLON OR
81: * COLON. NOT LEGAL WAY TO END AN EXPRESSION.
82: *
83: * VERSION 3.5A (OCT 79 - SGD PATCHES)
84: * -----------------------------------
85: *
86: * SGD01 - PATCH IN ASIGN TO FIX MULTIPLE TRAP BLOCK PROBLEM
87: * (ASG10+2)
88: * SGD02 - PATCH IN GTARR TO FIX NULL CONVERT (GTAR9+0)
89: *
90: {{TTL{S{{{P I T B O L -- BASIC INFORMATION
91: {{EJC{{{{
92: *
93: * GENERAL STRUCTURE
94: * -----------------
95: *
96: * THIS PROGRAM IS A TRANSLATOR FOR A VERSION OF THE SNOBOL4
97: * PROGRAMMING LANGUAGE. LANGUAGE DETAILS ARE CONTAINED IN
98: * THE MANUAL MACRO SPITBOL BY DEWAR AND MCCANN, TECHNICAL
99: * REPORT 90, UNIVERSITY OF LEEDS 1976. THE LANGUAGE
100: * IS IDENTICAL TO THAT IMPLEMENTED BY THE BTL TRANSLATOR
101: * (R. E. GRISWOLD ET AL.) WITH THE FOLLOWING EXCEPTIONS.
102: *
103: * 1) REDEFINITION OF STANDARD SYSTEM FUNCTIONS AND
104: * OPERATORS IS NOT PERMITTED.
105: *
106: * 2) THE VALUE FUNCTION IS NOT PROVIDED.
107: *
108: * 3) ACCESS TRACING IS PROVIDED IN ADDITION TO THE
109: * OTHER STANDARD TRACE MODES.
110: *
111: * 4) THE KEYWORD STFCOUNT IS NOT PROVIDED.
112: *
113: * 5) THE KEYWORD FULLSCAN IS NOT PROVIDED AND ALL PATTERN
114: * MATCHING TAKES PLACE IN FULLSCAN MODE (I.E. WITH NO
115: * HEURISTICS APPLIED).
116: *
117: * 6) A SERIES OF EXPRESSIONS SEPARATED BY COMMAS MAY
118: * BE GROUPED WITHIN PARENTHESES TO PROVIDE A SELECTION
119: * CAPABILITY. THE SEMANTICS ARE THAT THE SELECTION
120: * ASSUMES THE VALUE OF THE FIRST EXPRESSION WITHIN IT
121: * WHICH SUCCEEDS AS THEY ARE EVALUATED FROM THE LEFT.
122: * IF NO EXPRESSION SUCCEEDS THE ENTIRE STATEMENT FAILS
123: *
124: * 7) AN EXPLICIT PATTERN MATCHING OPERATOR IS PROVIDED.
125: * THIS IS THE BINARY QUERY (SEE GIMPEL SIGPLAN OCT 74)
126: *
127: * 8) THE ASSIGNMENT OPERATOR IS INTRODUCED AS IN THE
128: * GIMPEL REFERENCE.
129: *
130: * 9) THE EXIT FUNCTION IS PROVIDED FOR GENERATING LOAD
131: * MODULES - CF. GIMPELS SITBOL.
132: *
133: *
134: * THE METHOD USED IN THIS PROGRAM IS TO TRANSLATE THE
135: * SOURCE CODE INTO AN INTERNAL PSEUDO-CODE (SEE FOLLOWING
136: * SECTION). AN INTERPRETOR IS THEN USED TO EXECUTE THIS
137: * GENERATED PSEUDO-CODE. THE NATURE OF THE SNOBOL4 LANGUAGE
138: * IS SUCH THAT THE LATTER TASK IS MUCH MORE COMPLEX THAN
139: * THE ACTUAL TRANSLATION PHASE. ACCORDINGLY, NEARLY ALL THE
140: * CODE IN THE PROGRAM SECTION IS CONCERNED WITH THE ACTUAL
141: * EXECUTION OF THE SNOBOL4 PROGRAM.
142: {{EJC{{{{
143: *
144: * INTERPRETIVE CODE FORMAT
145: * ------------------------
146: *
147: * THE INTERPRETIVE PSEUDO-CODE CONSISTS OF A SERIES OF
148: * ADDRESS POINTERS. THE EXACT FORMAT OF THE CODE IS
149: * DESCRIBED IN CONNECTION WITH THE CDBLK FORMAT. THE
150: * PURPOSE OF THIS SECTION IS TO GIVE GENERAL INSIGHT INTO
151: * THE INTERPRETIVE APPROACH INVOLVED.
152: *
153: * THE BASIC FORM OF THE CODE IS RELATED TO REVERSE POLISH.
154: * IN OTHER WORDS, THE OPERANDS PRECEDE THE OPERATORS WHICH
155: * ARE ZERO ADDRESS OPERATORS. THERE ARE SOME EXCEPTIONS TO
156: * THESE RULES, NOTABLY THE UNARY NOT OPERATOR AND THE
157: * SELECTION CONSTRUCTION WHICH CLEARLY REQUIRE ADVANCE
158: * KNOWLEDGE OF THE OPERATOR INVOLVED.
159: *
160: * THE OPERANDS ARE MOVED TO THE TOP OF THE MAIN STACK AND
161: * THE OPERATORS ARE APPLIED TO THE TOP STACK ENTRIES. LIKE
162: * OTHER VERSIONS OF SPITBOL, THIS PROCESSOR DEPENDS ON
163: * KNOWING WHETHER OPERANDS ARE REQUIRED BY NAME OR BY VALUE
164: * AND MOVES THE APPROPRIATE OBJECT TO THE STACK. THUS NO
165: * NAME/VALUE CHECKS ARE INCLUDED IN THE OPERATOR CIRCUITS.
166: *
167: * THE ACTUAL POINTERS IN THE CODE POINT TO A BLOCK WHOSE
168: * FIRST WORD IS THE ADDRESS OF THE INTERPRETOR ROUTINE
169: * TO BE EXECUTED FOR THE CODE WORD.
170: *
171: * IN THE CASE OF OPERATORS, THE POINTER IS TO A WORD WHICH
172: * CONTAINS THE ADDRESS OF THE OPERATOR TO BE EXECUTED. IN
173: * THE CASE OF OPERANDS SUCH AS CONSTANTS, THE POINTER IS TO
174: * THE OPERAND ITSELF. ACCORDINGLY, ALL OPERANDS CONTAIN
175: * A FIELD WHICH POINTS TO THE ROUTINE TO LOAD THE VALUE OF
176: * THE OPERAND ONTO THE STACK. IN THE CASE OF A VARIABLE,
177: * THERE ARE THREE SUCH POINTERS. ONE TO LOAD THE VALUE,
178: * ONE TO STORE THE VALUE AND A THIRD TO JUMP TO THE LABEL.
179: *
180: * THE HANDLING OF FAILURE RETURNS DESERVES SPECIAL COMMENT.
181: * THE LOCATION FLPTR CONTAINS THE POINTER TO THE LOCATION
182: * ON THE MAIN STACK WHICH CONTAINS THE FAILURE RETURN
183: * WHICH IS IN THE FORM OF A BYTE OFFSET IN THE CURRENT
184: * CODE BLOCK (CDBLK OR EXBLK). WHEN A FAILURE OCCURS, THE
185: * STACK IS POPPED AS INDICATED BY THE SETTING OF FLPTR AND
186: * CONTROL IS PASSED TO THE APPROPRIATE LOCATION IN THE
187: * CURRENT CODE BLOCK WITH THE STACK POINTER POINTING TO THE
188: * FAILURE OFFSET ON THE STACK AND FLPTR UNCHANGED.
189: {{EJC{{{{
190: *
191: * INTERNAL DATA REPRESENTATIONS
192: * -----------------------------
193: *
194: * REPRESENTATION OF VALUES
195: *
196: * A VALUE IS REPRESENTED BY A POINTER TO A BLOCK WHICH
197: * DESCRIBES THE TYPE AND PARTICULARS OF THE DATA VALUE.
198: * IN GENERAL, A VARIABLE IS A LOCATION CONTAINING SUCH A
199: * POINTER (ALTHOUGH IN THE CASE OF TRACE ASSOCIATIONS THIS
200: * IS MODIFIED, SEE DESCRIPTION OF TRBLK).
201: *
202: * THE FOLLOWING IS A LIST OF POSSIBLE DATATYPES SHOWING THE
203: * TYPE OF BLOCK USED TO HOLD THE VALUE. THE DETAILS OF
204: * EACH BLOCK FORMAT ARE GIVEN LATER.
205: *
206: * DATATYPE BLOCK TYPE
207: * -------- ----------
208: *
209: *
210: * ARRAY ARBLK OR VCBLK
211: *
212: * CODE CDBLK
213: *
214: * EXPRESSION EXBLK OR SEBLK
215: *
216: * INTEGER ICBLK
217: *
218: * NAME NMBLK
219: *
220: * PATTERN P0BLK OR P1BLK OR P2BLK
221: *
222: * REAL RCBLK
223: *
224: * STRING SCBLK
225: *
226: * TABLE TBBLK
227: *
228: * PROGRAM DATATYPE PDBLK
229: {{EJC{{{{
230: *
231: * REPRESENTATION OF VARIABLES
232: * ---------------------------
233: *
234: * DURING THE COURSE OF EVALUATING EXPRESSIONS, IT IS
235: * NECESSARY TO GENERATE NAMES OF VARIABLES (FOR EXAMPLE
236: * ON THE LEFT SIDE OF A BINARY EQUALS OPERATOR). THESE ARE
237: * NOT TO BE CONFUSED WITH OBJECTS OF DATATYPE NAME WHICH
238: * ARE IN FACT VALUES.
239: *
240: * FROM A LOGICAL POINT OF VIEW, SUCH NAMES COULD BE SIMPLY
241: * REPRESENTED BY A POINTER TO THE APPROPRIATE VALUE CELL.
242: * HOWEVER IN THE CASE OF ARRAYS AND PROGRAM DEFINED
243: * DATATYPES, THIS WOULD VIOLATE THE RULE THAT THERE MUST BE
244: * NO POINTERS INTO THE MIDDLE OF A BLOCK IN DYNAMIC STORE.
245: * ACCORDINGLY, A NAME IS ALWAYS REPRESENTED BY A BASE AND
246: * OFFSET. THE BASE POINTS TO THE START OF THE BLOCK
247: * CONTAINING THE VARIABLE VALUE AND THE OFFSET IS THE
248: * OFFSET WITHIN THIS BLOCK IN BYTES. THUS THE ADDRESS
249: * OF THE ACTUAL VARIABLE IS DETERMINED BY ADDING THE BASE
250: * AND OFFSET VALUES.
251: *
252: * THE FOLLOWING ARE THE INSTANCES OF VARIABLES REPRESENTED
253: * IN THIS MANNER.
254: *
255: * 1) NATURAL VARIABLE BASE IS PTR TO VRBLK
256: * OFFSET IS *VRVAL
257: *
258: * 2) TABLE ELEMENT BASE IS PTR TO TEBLK
259: * OFFSET IS *TEVAL
260: *
261: * 3) ARRAY ELEMENT BASE IS PTR TO ARBLK
262: * OFFSET IS OFFSET TO ELEMENT
263: *
264: * 4) VECTOR ELEMENT BASE IS PTR TO VCBLK
265: * OFFSET IS OFFSET TO ELEMENT
266: *
267: * 5) PROG DEF DTP BASE IS PTR TO PDBLK
268: * OFFSET IS OFFSET TO FIELD VALUE
269: *
270: * IN ADDITION THERE ARE TWO CASES OF OBJECTS WHICH ARE
271: * LIKE VARIABLES BUT CANNOT BE HANDLED IN THIS MANNER.
272: * THESE ARE CALLED PSEUDO-VARIABLES AND ARE REPRESENTED
273: * WITH A SPECIAL BASE POINTER AS FOLLOWS=
274: *
275: * EXPRESSION VARIABLE PTR TO EVBLK (SEE EVBLK)
276: *
277: * KEYWORD VARIABLE PTR TO KVBLK (SEE KVBLK)
278: *
279: * PSEUDO-VARIABLES ARE HANDLED AS SPECIAL CASES BY THE
280: * ACCESS PROCEDURE (ACESS) AND THE ASSIGNMENT PROCEDURE
281: * (ASIGN). SEE THESE TWO PROCEDURES FOR DETAILS.
282: {{EJC{{{{
283: *
284: * ORGANIZATION OF DATA AREA
285: * -------------------------
286: *
287: *
288: * THE DATA AREA IS DIVIDED INTO TWO REGIONS.
289: *
290: * STATIC AREA
291: *
292: * THE STATIC AREA BUILDS UP FROM THE BOTTOM AND CONTAINS
293: * DATA AREAS WHICH ARE ALLOCATED DYNAMICALLY BUT ARE NEVER
294: * DELETED OR MOVED AROUND. THE MACRO-PROGRAM ITSELF
295: * USES THE STATIC AREA FOR THE FOLLOWING.
296: *
297: * 1) ALL VARIABLE BLOCKS (VRBLK).
298: *
299: * 2) THE HASH TABLE FOR VARIABLE BLOCKS.
300: *
301: * 3) MISCELLANEOUS BUFFERS AND WORK AREAS (SEE PROGRAM
302: * INITIALIZATION SECTION).
303: *
304: * IN ADDITION, THE SYSTEM PROCEDURES MAY USE THIS AREA FOR
305: * INPUT/OUTPUT BUFFERS, EXTERNAL FUNCTIONS ETC. SPACE IN
306: * THE STATIC REGION IS ALLOCATED BY CALLING PROCEDURE ALOST
307: *
308: * THE FOLLOWING GLOBAL VARIABLES DEFINE THE CURRENT
309: * LOCATION AND SIZE OF THE STATIC AREA.
310: *
311: * STATB ADDRESS OF START OF STATIC AREA
312: * STATE ADDRESS+1 OF LAST WORD IN AREA.
313: *
314: * THE MINIMUM SIZE OF STATIC IS GIVEN APPROXIMATELY BY
315: * 12 + *E$HNB + *E$STS + SPACE FOR ALPHABET STRING
316: * AND STANDARD PRINT BUFFER.
317: {{EJC{{{{
318: *
319: * DYNAMIC AREA
320: *
321: * THE DYNAMIC AREA IS BUILT UPWARDS IN MEMORY AFTER THE
322: * STATIC REGION. DATA IN THIS AREA MUST ALL BE IN STANDARD
323: * BLOCK FORMATS SO THAT IT CAN BE PROCESSED BY THE GARBAGE
324: * COLLECTOR (PROCEDURE GBCOL). GBCOL COMPACTS BLOCKS DOWN
325: * IN THIS REGION AS REQUIRED BY SPACE EXHAUSTION AND CAN
326: * ALSO MOVE ALL BLOCKS UP TO ALLOW FOR EXPANSION OF THE
327: * STATIC REGION.
328: * WITH THE EXCEPTION OF TABLES AND ARRAYS, NO SPITBOL
329: * OBJECT ONCE BUILT IN DYNAMIC MEMORY IS EVER SUBSEQUENTLY
330: * MODIFIED. OBSERVING THIS RULE NECESSITATES A COPYING
331: * ACTION DURING STRING AND PATTERN CONCATENATION.
332: *
333: * GARBAGE COLLECTION IS FUNDAMENTAL TO THE ALLOCATION OF
334: * SPACE FOR VALUES. SPITBOL USES A VERY EFFICIENT GARBAGE
335: * COLLECTOR WHICH INSISTS THAT POINTERS INTO DYNAMIC STORE
336: * SHOULD BE IDENTIFIABLE WITHOUT USE OF BIT TABLES,
337: * MARKER BITS ETC. TO SATISFY THIS REQUIREMENT, DYNAMIC
338: * MEMORY MUST NOT START AT TOO LOW AN ADDRESS AND LENGTHS
339: * OF ARRAYS, TABLES, STRINGS, CODE AND EXPRESSION BLOCKS
340: * MAY NOT EXCEED THE NUMERICAL VALUE OF THE LOWEST DYNAMIC
341: * ADDRESS. TO AVOID EITHER PENALIZING USERS WITH MODEST
342: * REQUIREMENTS OR RESTRICTING THOSE WITH GREATER NEEDS ON
343: * HOST SYSTEMS WHERE DYNAMIC MEMORY IS ALLOCATED IN LOW
344: * ADDRESSES, THE MINIMUM DYNAMIC ADDRESS MAY BE SPECIFIED
345: * SUFFICIENTLY HIGH TO PERMIT ARBITRARILY LARGE SPITBOL
346: * OBJECTS TO BE CREATED ( WITH THE POSSIBILITY IN EXTREME
347: * CASES OF WASTING LARGE AMOUNTS OF MEMORY BELOW THE
348: * START ADDRESS). THIS MINIMUM VALUE IS MADE AVAILABLE
349: * IN VARIABLE MXLEN BY A SYSTEM ROUTINE, SYSMX.
350: * ALTERNATIVELY SYSMX MAY INDICATE THAT A
351: * DEFAULT MAY BE USED IN WHICH DYNAMIC IS PLACED
352: * AT THE LOWEST POSSIBLE ADDRESS FOLLOWING STATIC.
353: *
354: * THE FOLLOWING GLOBAL WORK CELLS DEFINE THE LOCATION AND
355: * LENGTH OF THE DYNAMIC AREA.
356: *
357: * DNAMB START OF DYNAMIC AREA
358: * DNAMP NEXT AVAILABLE LOCATION
359: * DNAME LAST AVAILABLE LOCATION + 1
360: *
361: * DNAMB IS ALWAYS HIGHER THAN STATE SINCE THE ALOST
362: * PROCEDURE MAINTAINS SOME EXPANSION SPACE ABOVE STATE.
363: * *** DNAMB MUST NEVER BE PERMITTED TO HAVE A VALUE LESS
364: * THAN THAT IN MXLEN ***
365: *
366: * SPACE IN THE DYNAMIC REGION IS ALLOCATED BY THE ALLOC
367: * PROCEDURE. THE DYNAMIC REGION MAY BE USED BY SYSTEM
368: * PROCEDURES PROVIDED THAT ALL THE RULES ARE OBEYED.
369: {{EJC{{{{
370: *
371: * REGISTER USAGE
372: * --------------
373: *
374: * (CP) CODE POINTER REGISTER. USED TO
375: * HOLD A POINTER TO THE CURRENT
376: * LOCATION IN THE INTERPRETIVE PSEUDO
377: * CODE (I.E. PTR INTO A CDBLK).
378: *
379: * (XL,XR) GENERAL INDEX REGISTERS. USUALLY
380: * USED TO HOLD POINTERS TO BLOCKS IN
381: * DYNAMIC STORAGE. AN IMPORTANT
382: * RESTRICTION IS THAT THE VALUE IN
383: * XL MUST BE COLLECTABLE FOR
384: * A GARBAGE COLLECT CALL. A VALUE
385: * IS COLLECTABLE IF IT EITHER POINTS
386: * OUTSIDE THE DYNAMIC AREA, OR IF IT
387: * POINTS TO THE START OF A BLOCK IN
388: * THE DYNAMIC AREA.
389: *
390: * (XS) STACK POINTER. USED TO POINT TO
391: * THE STACK FRONT. THE STACK MAY
392: * BUILD UP OR DOWN AND IS USED
393: * TO STACK SUBROUTINE RETURN POINTS
394: * AND OTHER RECURSIVELY SAVED DATA.
395: *
396: * (XT) AN ALTERNATIVE NAME FOR XL DURING
397: * ITS USE IN ACCESSING STACKED ITEMS.
398: *
399: * (WA,WB,WC) GENERAL WORK REGISTERS. CANNOT BE
400: * USED FOR INDEXING, BUT MAY HOLD
401: * VARIOUS TYPES OF DATA.
402: *
403: * (IA) USED FOR ALL SIGNED INTEGER
404: * ARITHMETIC, BOTH THAT USED BY THE
405: * TRANSLATOR AND THAT ARISING FROM
406: * USE OF SNOBOL4 ARITHMETIC OPERATORS
407: *
408: * (RA) REAL ACCUMULATOR. USED FOR ALL
409: * FLOATING POINT ARITHMETIC.
410: {{EJC{{{{
411: *
412: * SPITBOL CONDITIONAL ASSEMBLY SYMBOLS
413: * ------------------------------------
414: *
415: * IN THE SPITBOL TRANSLATOR, THE FOLLOWING CONDITIONAL
416: * ASSEMBLY SYMBOLS ARE REFERRED TO. TO INCORPORATE THE
417: * FEATURES REFERRED TO, THE MINIMAL SOURCE SHOULD BE
418: * PREFACED BY SUITABLE CONDITIONAL ASSEMBLY SYMBOL
419: * DEFINITIONS.
420: * IN ALL CASES IT IS PERMISSIBLE TO DEFAULT THE DEFINITIONS
421: * IN WHICH CASE THE ADDITIONAL FEATURES WILL BE OMITTED
422: * FROM THE TARGET CODE.
423: *
424: * .CASL DEFINE TO INCLUDE 26 SHIFTED LETTRS
425: * .CAHT DEFINE TO INCLUDE HORIZONTAL TAB
426: * .CAVT DEFINE TO INCLUDE VERTICAL TAB
427: * .CIOD IF DEFINED, DEFAULT DELIMITER IS
428: * NOT USED IN PROCESSING 3RD ARG OF
429: * INPUT() AND OUTPUT()
430: * .CNBT DEFINE TO OMIT BATCH INITIALISATION
431: * .CNCI DEFINE TO ENABLE SYSCI ROUTINE
432: * .CNEX DEFINE TO OMIT EXIT() CODE.
433: * .CNLD DEFINE TO OMIT LOAD() CODE.
434: * .CNPF DEFINE TO OMIT PROFILE STUFF
435: * .CNRA DEFINE TO OMIT ALL REAL ARITHMETIC
436: * .CNSR DEFINE TO OMIT SORT, RSORT
437: * .CSAX DEFINE IF SYSAX IS TO BE CALLED
438: * .CSN6 DEFINE TO PAD STMT NOS TO 6 CHARS
439: * .CSN8 DEFINE TO PAD STMT NOS TO 8 CHARS
440: * .CUCF DEFINE TO INCLUDE CFP$U
441: * .CULC DEFINE TO INCLUDE &CASE (LC NAMES)
442: * .CUST DEFINE TO INCLUDE SET() CODE
443: {{TTL{S{{{P I T B O L -- PROCEDURES SECTION
444: *
445: * THIS SECTION STARTS WITH DESCRIPTIONS OF THE OPERATING
446: * SYSTEM DEPENDENT PROCEDURES WHICH ARE USED BY THE SPITBOL
447: * TRANSLATOR. ALL SUCH PROCEDURES HAVE FIVE LETTER NAMES
448: * BEGINNING WITH SYS. THEY ARE LISTED IN ALPHABETICAL
449: * ORDER.
450: * ALL PROCEDURES HAVE A SPECIFICATION CONSISTING OF A
451: * MODEL CALL, PRECEDED BY A POSSIBLY EMPTY LIST OF REGISTER
452: * CONTENTS GIVING PARAMETERS AVAILABLE TO THE PROCEDURE AND
453: * FOLLOWED BY A POSSIBLY EMPTY LIST OF REGISTER CONTENTS
454: * REQUIRED ON RETURN FROM THE CALL OR WHICH MAY HAVE HAD
455: * THEIR CONTENTS DESTROYED. ONLY THOSE REGISTERS EXPLICITLY
456: * MENTIONED IN THE LIST AFTER THE CALL MAY HAVE THEIR
457: * VALUES CHANGED.
458: * THE SEGMENT OF CODE PROVIDING THE EXTERNAL PROCEDURES IS
459: * CONVENIENTLY REFERRED TO AS OSINT (OPERATING SYSTEM
460: * INTERFACE). THE SYSXX PROCEDURES IT CONTAINS PROVIDE
461: * FACILITIES NOT USUALLY AVAILABLE AS PRIMITIVES IN
462: * ASSEMBLY LANGUAGES. FOR PARTICULAR TARGET MACHINES,
463: * IMPLEMENTORS MAY CHOOSE FOR SOME MINIMAL OPCODES WHICH
464: * DO NOT HAVE REASONABLY DIRECT TRANSLATIONS, TO USE CALLS
465: * OF ADDITIONAL PROCEDURES WHICH THEY PROVIDE IN OSINT.
466: * E.G. MWB OR TRC MIGHT BE TRANSLATED AS JSR SYSMB,
467: * JSR SYSTC IN SOME IMPLEMENTATIONS.
468: *
469: * IN THE DESCRIPTIONS, REFERENCE IS MADE TO --BLK
470: * FORMATS (-- = A PAIR OF LETTERS). SEE THE SPITBOL
471: * DEFINITIONS SECTION FOR DETAILED DESCRIPTIONS OF ALL
472: * SUCH BLOCK FORMATS EXCEPT FCBLK FOR WHICH SYSFC SHOULD
473: * BE CONSULTED.
474: *
475: * SECTION 0 CONTAINS INP,INR SPECIFICATIONS OF INTERNAL
476: * PROCEDURES,ROUTINES. THIS GIVES A SINGLE PASS TRANSLATOR
477: * INFORMATION MAKING IT EASY TO GENERATE ALTERNATIVE CALLS
478: * IN THE TRANSLATION OF JSR-S FOR PROCEDURES OF DIFFERENT
479: * TYPES IF THIS PROVES NECESSARY.
480: *
481: {{SEC{{{{START OF PROCEDURES SECTION
482: {{EJC{{{{
483: *
484: * SYSAX -- AFTER EXECUTION
485: *
486: {SYSAX{EXP{{{{DEFINE EXTERNAL ENTRY POINT
487: *
488: * IF THE CONDITIONAL ASSEMBLY SYMBOL .CSAX IS DEFINED,
489: * THIS ROUTINE IS CALLED IMMEDIATELY AFTER EXECUTION AND
490: * BEFORE PRINTING OF EXECUTION STATISTICS OR DUMP OUTPUT.
491: * PURPOSE OF CALL IS FOR IMPLEMENTOR TO DETERMINE AND
492: * IF THE CALL IS NOT REQUIRED IT WILL BE OMITTED IF .CSAX
493: * IS UNDEFINED. IN THIS CASE SYSAX NEED NOT BE CODED.
494: *
495: * JSR SYSAX CALL AFTER EXECUTION
496: {{EJC{{{{
497: *
498: * SYSBX -- BEFORE EXECUTION
499: *
500: {SYSBX{EXP{{{{DEFINE EXTERNAL ENTRY POINT
501: *
502: * CALLED AFTER INITIAL SPITBOL COMPILATION AND BEFORE
503: * COMMENCING EXECUTION IN CASE OSINT NEEDS
504: * TO ASSIGN FILES OR PERFORM OTHER NECESSARY SERVICES.
505: * OSINT MAY ALSO CHOOSE TO SEND A MESSAGE TO ONLINE
506: * TERMINAL (IF ANY) INDICATING THAT EXECUTION IS STARTING.
507: *
508: * JSR SYSBX CALL BEFORE EXECUTION STARTS
509: {{EJC{{{{
510: *
511: * SYSDC -- DATE CHECK
512: *
513: {SYSDC{EXP{{{{DEFINE EXTERNAL ENTRY POINT
514: *
515: * SYSDC IS CALLED TO CHECK THAT THE EXPIRY DATE FOR A TRIAL
516: * VERSION OF SPITBOL IS UNEXPIRED.
517: *
518: * JSR SYSDC CALL TO CHECK DATE
519: * RETURN ONLY IF DATE IS OK
520: {{EJC{{{{
521: *
522: * SYSDM -- DUMP CORE
523: *
524: {SYSDM{EXP{{{{DEFINE EXTERNAL ENTRY POINT
525: *
526: * SYSDM IS CALLED BY A SPITBOL PROGRAM CALL OF DUMP(N) WITH
527: * N GE 3. ITS PURPOSE IS TO PROVIDE A CORE DUMP.
528: * N COULD HOLD AN ENCODING OF THE START ADRS FOR DUMP AND
529: * AMOUNT TO BE DUMPED E.G. N = 256*A + S , S = START ADRS
530: * IN KILOWORDS, A = KILOWORDS TO DUMP
531: *
532: * (XR) PARAMETER N OF CALL DUMP(N)
533: * JSR SYSDM CALL TO ENTER ROUTINE
534: {{EJC{{{{
535: *
536: * SYSDT -- GET CURRENT DATE
537: *
538: {SYSDT{EXP{{{{DEFINE EXTERNAL ENTRY POINT
539: *
540: * SYSDT IS USED TO OBTAIN THE CURRENT DATE. THE DATE IS
541: * RETURNED AS A CHARACTER STRING IN ANY FORMAT APPROPRIATE
542: * TO THE OPERATING SYSTEM IN USE. IT MAY ALSO CONTAIN THE
543: * CURRENT TIME OF DAY. SYSDT IS USED TO IMPLEMENT THE
544: * SNOBOL4 FUNCTION DATE.
545: *
546: * JSR SYSDT CALL TO GET DATE
547: * (XL) POINTER TO BLOCK CONTAINING DATE
548: *
549: * THE FORMAT OF THE BLOCK IS LIKE AN SCBLK EXCEPT THAT
550: * THE FIRST WORD NEED NOT BE SET. THE RESULT IS COPIED
551: * INTO SPITBOL DYNAMIC MEMORY ON RETURN.
552: {{EJC{{{{
553: *
554: * SYSEF -- EJECT FILE
555: *
556: {SYSEF{EXP{{{{DEFINE EXTERNAL ENTRY POINT
557: *
558: * SYSEF IS USED TO WRITE A PAGE EJECT TO A NAMED FILE. IT
559: * MAY ONLY BE USED FOR FILES WHERE THIS CONCEPT MAKES
560: * SENSE. NOTE THAT SYSEF IS NOT NORMALLY USED FOR THE
561: * STANDARD OUTPUT FILE (SEE SYSEP).
562: *
563: * (WA) PTR TO FCBLK OR ZERO
564: * (XR) EJECT ARGUMENT (SCBLK PTR)
565: * JSR SYSEF CALL TO EJECT FILE
566: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST
567: * PPM LOC RETURN HERE IF INAPPROPRIATE FILE
568: * PPM LOC RETURN HERE IF I/O ERROR
569: {{EJC{{{{
570: *
571: * SYSEJ -- END OF JOB
572: *
573: {SYSEJ{EXP{{{{DEFINE EXTERNAL ENTRY POINT
574: *
575: * SYSEJ IS CALLED ONCE AT THE END OF EXECUTION TO
576: * TERMINATE THE RUN. THE SIGNIFICANCE OF THE ABEND AND
577: * CODE VALUES IS SYSTEM DEPENDENT. IN GENERAL, THE CODE
578: * VALUE SHOULD BE MADE AVAILABLE FOR TESTING, AND THE
579: * ABEND VALUE SHOULD CAUSE SOME POST-MORTEM ACTION SUCH AS
580: * A DUMP. NOTE THAT SYSEJ DOES NOT RETURN TO ITS CALLER.
581: * SEE SYSXI FOR DETAILS OF FCBLK CHAIN
582: *
583: * (WA) VALUE OF ABEND KEYWORD
584: * (WB) VALUE OF CODE KEYWORD
585: * (XL) O OR PTR TO HEAD OF FCBLK CHAIN
586: * JSR SYSEJ CALL TO END JOB
587: *
588: * THE FOLLOWING SPECIAL VALUES ARE USED AS CODES IN (WB)
589: * 999 EXECUTION SUPPRESSED
590: * 998 STANDARD OUTPUT FILE FULL OR UNAVAILABLE IN A SYSXI
591: * LOAD MODULE. IN THESE CASES (WA) CONTAINS THE NUMBER
592: * OF THE STATEMENT CAUSING PREMATURE TERMINATION.
593: {{EJC{{{{
594: *
595: * SYSEM -- GET ERROR MESSAGE TEXT
596: *
597: {SYSEM{EXP{{{{DEFINE EXTERNAL ENTRY POINT
598: *
599: * SYSEM IS USED TO OBTAIN THE TEXT OF ERR, ERB CALLS IN THE
600: * SOURCE PROGRAM GIVEN THE ERROR CODE NUMBER. IT IS ALLOWED
601: * TO RETURN A NULL STRING IF THIS FACILITY IS UNAVAILABLE.
602: *
603: * (WA) ERROR CODE NUMBER
604: * JSR SYSEM CALL TO GET TEXT
605: * (XR) TEXT OF MESSAGE
606: *
607: * THE RETURNED VALUE IS A POINTER TO A BLOCK IN SCBLK
608: * FORMAT EXCEPT THAT THE FIRST WORD NEED NOT BE SET. THE
609: * STRING IS COPIED INTO DYNAMIC MEMORY ON RETURN.
610: * IF THE NULL STRING IS RETURNED EITHER BECAUSE SYSEM DOES
611: * NOT PROVIDE ERROR MESSAGE TEXTS OR BECAUSE WA IS OUT OF
612: * RANGE, SPITBOL WILL PRINT THE STRING STORED IN ERRTEXT
613: * KEYWORD.
614: {{EJC{{{{
615: *
616: * SYSEN -- ENDFILE
617: *
618: {SYSEN{EXP{{{{DEFINE EXTERNAL ENTRY POINT
619: *
620: * SYSEN IS USED TO IMPLEMENT THE SNOBOL4 FUNCTION ENDFILE.
621: * THE MEANING IS SYSTEM DEPENDENT. IN GENERAL, ENDFILE
622: * IMPLIES THAT NO FURTHER I/O OPERATIONS WILL BE PERFORMED,
623: * BUT DOES NOT GUARANTEE THIS TO BE THE CASE. THE FILE
624: * SHOULD BE CLOSED AFTER THE CALL, A SUBSEQUENT READ
625: * OR WRITE MAY REOPEN THE FILE AT THE START OR IT MAY BE
626: * NECESSARY TO REOPEN THE FILE VIA SYSIO.
627: *
628: * (WA) PTR TO FCBLK OR ZERO
629: * (XR) ENDFILE ARGUMENT (SCBLK PTR)
630: * JSR SYSEN CALL TO ENDFILE
631: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST
632: * PPM LOC RETURN HERE IF ENDFILE NOT ALLOWED
633: * PPM LOC RETURN HERE IF I/O ERROR
634: * (WA,WB) DESTROYED
635: *
636: * THE SECOND ERROR RETURN IS USED FOR FILES FOR WHICH
637: * ENDFILE IS NOT PERMITTED. FOR EXAMPLE, IT MAY BE EXPECTED
638: * THAT THE STANDARD INPUT AND OUTPUT FILES ARE IN THIS
639: * CATEGORY.
640: {{EJC{{{{
641: *
642: * SYSEP -- EJECT PRINTER PAGE
643: *
644: {SYSEP{EXP{{{{DEFINE EXTERNAL ENTRY POINT
645: *
646: * SYSEP IS CALLED TO PERFORM A PAGE EJECT ON THE STANDARD
647: * PRINTER OUTPUT FILE (CORRESPONDING TO SYSPR OUTPUT).
648: *
649: * JSR SYSEP CALL TO EJECT PRINTER OUTPUT
650: {{EJC{{{{
651: *
652: * SYSEX -- CALL EXTERNAL FUNCTION
653: *
654: {SYSEX{EXP{{{{DEFINE EXTERNAL ENTRY POINT
655: *
656: * SYSEX IS CALLED TO PASS CONTROL TO AN EXTERNAL FUNCTION
657: * PREVIOUSLY LOADED WITH A CALL TO SYSLD.
658: *
659: * (XS) POINTER TO ARGUMENTS ON STACK
660: * (XL) POINTER TO CONTROL BLOCK (EFBLK)
661: * (WA) NUMBER OF ARGUMENTS ON STACK
662: * JSR SYSEX CALL TO PASS CONTROL TO FUNCTION
663: * PPM LOC RETURN HERE IF FUNCTION CALL FAILS
664: * (XS) POPPED PAST ARGUMENTS
665: * (XR) RESULT RETURNED
666: *
667: * THE ARGUMENTS ARE STORED ON THE STACK WITH
668: * THE LAST ARGUMENT AT 0(XS). ON RETURN, XS
669: * IS POPPED PAST THE ARGUMENTS.
670: *
671: * THE FORM OF THE ARGUMENTS AS PASSED IS THAT USED IN THE
672: * SPITBOL TRANSLATOR (SEE DEFINITIONS AND DATA STRUCTURES
673: * SECTION). THE CONTROL BLOCK FORMAT IS ALSO DESCRIBED
674: * (UNDER EFBLK) IN THIS SECTION.
675: *
676: * THERE ARE TWO WAYS OF RETURNING A RESULT.
677: *
678: * 1) RETURN A POINTER TO A BLOCK IN DYNAMIC STORAGE. THIS
679: * BLOCK MUST BE IN EXACTLY CORRECT FORMAT, INCLUDING
680: * THE FIRST WORD. ONLY FUNCTIONS WRITTEN WITH INTIMATE
681: * KNOWLEDGE OF THE SYSTEM WILL RETURN IN THIS WAY.
682: *
683: * 2) STRING, INTEGER AND REAL RESULTS MAY BE RETURNED BY
684: * POINTING TO A PSEUDO-BLOCK OUTSIDE DYNAMIC MEMORY.
685: * THIS BLOCK IS IN ICBLK, RCBLK OR SCBLK FORMAT EXCEPT
686: * THAT THE FIRST WORD WILL BE OVERWRITTEN
687: * BY A TYPE WORD ON RETURN AND SO NEED NOT
688: * BE CORRECTLY SET. SUCH A RESULT IS
689: * COPIED INTO MAIN STORAGE BEFORE PROCEEDING.
690: * UNCONVERTED RESULTS MAY SIMILARLY BE RETURNED IN A
691: * PSEUDO-BLOCK WHICH IS IN CORRECT FORMAT INCLUDING
692: * TYPE WORD RECOGNISABLE BY GARBAGE COLLECTOR SINCE
693: * BLOCK IS COPIED INTO DYNAMIC MEMORY.
694: {{EJC{{{{
695: *
696: * SYSFC -- FILE CONTROL BLOCK ROUTINE
697: *
698: {SYSFC{EXP{{{{DEFINE EXTERNAL ENTRY POINT
699: *
700: * SEE ALSO SYSIO
701: * INPUT AND OUTPUT HAVE 3 ARGUMENTS REFERRED TO AS SHOWN
702: * INPUT(VARIABLE NAME,FILE ARG1,FILE ARG2)
703: * OUTPUT(VARIABLE NAME,FILE ARG1,FILE ARG2)
704: * FILE ARG1 MAY BE AN INTEGER OR STRING USED TO IDENTIFY
705: * AN I/O CHANNEL. IT IS CONVERTED TO A STRING FOR CHECKING.
706: * THE EXACT SIGNIFICANCE OF FILE ARG2
707: * IS NOT RIGOROUSLY PRESCRIBED BUT TO IMPROVE PORTABILITY,
708: * THE SCHEME DESCRIBED IN THE SPITBOL USER MANUAL
709: * SHOULD BE ADOPTED WHEN POSSIBLE. THE PREFERRED FORM IS
710: * A STRING $F$,R$R$,C$C$,I$I$,...,Z$Z$ WHERE
711: * $F$ IS AN OPTIONAL FILE NAME WHICH IS PLACED FIRST.
712: * REMAINING ITEMS MAY BE OMITTED OR INCLUDED IN ANY ORDER.
713: * $R$ IS MAXIMUM RECORD LENGTH
714: * $C$ IS A CARRIAGE CONTROL CHARACTER OR CHARACTER STRING
715: * $I$ IS SOME FORM OF CHANNEL IDENTIFICATION USED IN THE
716: * ABSENCE OF $F$ TO ASSOCIATE THE VARIABLE
717: * WITH A FILE ALLOCATED DYNAMICALLY BY JCL COMMANDS AT
718: * SPITBOL LOAD TIME.
719: * ,...,Z$Z$ ARE ADDITIONAL FIELDS.
720: * IF , (COMMA) CANNOT BE USED AS A DELIMITER, .CIOD
721: * SHOULD BE DEFINED TO INTRODUCE BY CONDITIONAL ASSEMBLY
722: * ANOTHER DELIMITER (SEE
723: * IODEL EQU *
724: * EARLY IN DEFINITIONS SECTION).
725: * SYSFC IS CALLED WHEN A VARIABLE IS INPUT OR OUTPUT
726: * ASSOCIATED TO CHECK FILE ARG1 AND FILE ARG2 AND
727: * TO REPORT WHETHER AN FCBLK (FILE CONTROL
728: * BLOCK) IS NECESSARY AND IF SO WHAT SIZE IT SHOULD BE.
729: * THIS MAKES IT POSSIBLE FOR SPITBOL RATHER THAN OSINT TO
730: * ALLOCATE SUCH A BLOCK IN DYNAMIC MEMORY IF REQUIRED
731: * OR ALTERNATIVELY IN STATIC MEMORY.
732: * THE SIGNIFICANCE OF AN FCBLK , IF ONE IS REQUESTED, IS
733: * ENTIRELY UP TO THE SYSTEM INTERFACE. THE ONLY RESTRICTION
734: * IS THAT IF THE FCBLK SHOULD APPEAR TO LIE IN DYNAMIC
735: * MEMORY , POINTERS TO IT SHOULD BE PROPER POINTERS TO
736: * THE START OF A RECOGNISABLE AND GARBAGE COLLECTABLE
737: * BLOCK (THIS CONDITION WILL BE MET IF SYSFC REQUESTS
738: * SPITBOL TO PROVIDE AN FCBLK).
739: * AN OPTION IS PROVIDED FOR OSINT TO RETURN A POINTER IN
740: * XL TO AN FCBLK WHICH IT PRIVATELY ALLOCATED. THIS PTR
741: * WILL BE MADE AVAILABLE WHEN I/O OCCURS LATER.
742: * PRIVATE FCBLKS MAY HAVE ARBITRARY CONTENTS AND SPITBOL
743: * STORES NOTHING IN THEM.
744: {{EJC{{{{
745: * THE REQUESTED SIZE FOR AN FCBLK IN DYNAMIC MEMORY
746: * SHOULD ALLOW A 2 WORD OVERHEAD FOR BLOCK TYPE AND
747: * LENGTH FIELDS. INFORMATION SUBSEQUENTLY STORED IN THE
748: * REMAINING WORDS MAY BE ARBITRARY IF AN XNBLK (EXTERNAL
749: * NON-RELOCATABLE BLOCK) IS REQUESTED. IF THE REQUEST IS
750: * FOR AN XRBLK (EXTERNAL RELOCATABLE BLOCK) THE
751: * CONTENTS OF WORDS SHOULD BE COLLECTABLE (I.E. ANY
752: * APPARENT POINTERS INTO DYNAMIC SHOULD BE GENUINE BLOCK
753: * POINTERS). THESE RESTRICTIONS DO NOT APPLY IF AN FCBLK
754: * IS ALLOCATED OUTSIDE DYNAMIC OR IS NOT ALLOCATED AT ALL.
755: * IF AN FCBLK IS REQUESTED, ITS FIELDS WILL BE INITIALISED
756: * TO ZERO BEFORE ENTRY TO SYSIO WITH THE EXCEPTION OF
757: * WORDS 0 AND 1 IN WHICH THE BLOCK TYPE AND LENGTH
758: * FIELDS ARE PLACED FOR FCBLKS IN DYNAMIC MEMORY ONLY.
759: * FOR THE POSSIBLE USE OF SYSEJ AND SYSXI, IF FCBLKS
760: * ARE USED, A CHAIN IS BUILT SO THAT THEY MAY ALL BE
761: * FOUND - SEE SYSXI FOR DETAILS.
762: * IF BOTH FILE ARG1 AND FILE ARG2 ARE NULL, CALLS OF SYSFC
763: * AND SYSIO ARE OMITTED.
764: * IF FILE ARG1 IS NULL (STANDARD INPUT/OUTPUT FILE), SYSFC
765: * IS CALLED TO CHECK NON-NULL FILE ARG2 BUT ANY REQUEST
766: * FOR AN FCBLK WILL BE IGNORED, SINCE SPITBOL HANDLES THE
767: * STANDARD FILES SPECIALLY AND CANNOT READILY KEEP FCBLK
768: * POINTERS FOR THEM.
769: * FILEARG1 IS TYPE CHECKED BY SPITBOL SO FURTHER CHECKING
770: * MAY BE UNNECCESSARY IN MANY IMPLEMENTATIONS.
771: * FILE ARG2 IS PASSED SO THAT SYSFC MAY ANALYSE AND
772: * CHECK IT. HOWEVER TO ASSIST IN THIS, SPITBOL ALSO PASSES
773: * ON THE STACK THE COMPONENTS OF THIS ARGUMENT WITH
774: * FILE NAME, $F$ (OTHERWISE NULL) EXTRACTED AND STACKED
775: * FIRST.
776: * THE OTHER FIELDS, IF ANY, ARE EXTRACTED AS SUBSTRINGS,
777: * POINTERS TO THEM ARE STACKED AND A COUNT OF ALL ITEMS
778: * STACKED IS PLACED IN WC. IF AN FCBLK WAS EARLIER
779: * ALLOCATED AND POINTED TO VIA FILE ARG1, SYSFC IS ALSO
780: * PASSED A POINTER TO THIS FCBLK.
781: *
782: * (XL) FILE ARG1 SCBLK PTR (2ND ARG)
783: * (XR) FILEARG2 (3RD ARG) OR NULL
784: * -(XS)...-(XS) SCBLKS FOR $F$,$R$,$C$,...
785: * (WC) NO. OF STACKED SCBLKS ABOVE
786: * (WA) EXISTING FILE ARG1 FCBLK PTR OR 0
787: * (WB) 0/3 FOR INPUT/OUTPUT ASSOCN
788: * JSR SYSFC CALL TO CHECK NEED FOR FCBLK
789: * PPM LOC INVALID FILE ARGUMENT
790: * (XS) POPPED (WC) TIMES
791: * (WA NON ZERO) BYTE SIZE OF REQUESTED FCBLK
792: * (WA=0,XL NON ZERO) PRIVATE FCBLK PTR IN XL
793: * (WA=XL=0) NO FCBLK WANTED, NO PRIVATE FCBLK
794: * (WC) 0/1/2 REQUEST ALLOC OF XRBLK/XNBLK
795: * /STATIC BLOCK FOR USE AS FCBLK
796: * (WB) DESTROYED
797: {{EJC{{{{
798: *
799: * SYSHS -- GIVE ACCESS TO HOST COMPUTER FEATURES
800: *
801: {SYSHS{EXP{{{{DEFINE EXTERNAL ENTRY POINT
802: *
803: * PROVIDES MEANS FOR IMPLEMENTING SPECIAL FEATURES
804: * ON DIFFERENT HOST COMPUTERS. THE ONLY DEFINED ENTRY IS
805: * THAT WHERE ALL ARGUMENTS ARE NULL IN WHICH CASE SYSHS
806: * RETURNS AN SCBLK CONTAINING NAME OF COMPUTER,
807: * NAME OF OPERATING SYSTEM AND NAME OF SITE SEPARATED BY
808: * COLONS. THE SCBLK NEED NOT HAVE A CORRECT FIRST FIELD
809: * AS THIS IS SUPPLIED ON COPYING STRING TO DYNAMIC MEMORY.
810: * SPITBOL DOES NO ARGUMENT CHECKING BUT DOES PROVIDE A
811: * SINGLE ERROR RETURN FOR ARGUMENTS CHECKED AS ERRONEOUS
812: * BY OSINT. IT ALSO PROVIDES A SINGLE EXECUTION ERROR
813: * RETURN. IF THESE ARE INADEQUATE, USE MAY BE MADE OF THE
814: * MINIMAL ERROR SECTION DIRECT AS DESCRIBED IN MINIMAL
815: * DOCUMENTATION, SECTION 10.
816: * SEVERAL NON-ERROR RETURNS ARE PROVIDED. THE FIRST
817: * CORRESPONDS TO THE DEFINED ENTRY OR, FOR IMPLEMENTATION
818: * DEFINED ENTRIES, ANY STRING MAY BE RETURNED. THE OTHERS
819: * PERMIT RESPECTIVELY, RETURN A NULL RESULT, RETURN WITH A
820: * RESULT TO BE STACKED WHICH IS POINTED AT BY XR, AND A
821: * RETURN CAUSING SPITBOL STATEMENT FAILURE. IF A RETURNED
822: * RESULT IS IN DYNAMIC MEMORY IT MUST OBEY GARBAGE
823: * COLLECTOR RULES. THE ONLY RESULTS COPIED ON RETURN
824: * ARE STRINGS RETURNED VIA PPM LOC3 RETURN.
825: *
826: * (WA) ARGUMENT 1
827: * (XL) ARGUMENT 2
828: * (XR) ARGUMENT 3
829: * JSR SYSHS CALL TO GET HOST INFORMATION
830: * PPM LOC1 ERRONEOUS ARG
831: * PPM LOC2 EXECUTION ERROR
832: * PPM LOC3 SCBLK PTR IN XL OR 0 IF UNAVAILABLE
833: * PPM LOC4 RETURN A NULL RESULT
834: * PPM LOC5 RETURN RESULT IN XR
835: * PPM LOC6 CAUSE STATEMENT FAILURE
836: {{EJC{{{{
837: *
838: * SYSID -- RETURN SYSTEM IDENTIFICATION
839: *
840: {SYSID{EXP{{{{DEFINE EXTERNAL ENTRY POINT
841: *
842: * THIS ROUTINE SHOULD RETURN STRINGS TO HEAD THE STANDARD
843: * PRINTER OUTPUT. THE FIRST STRING WILL BE APPENDED TO
844: * A HEADING LINE OF THE FORM
845: * MACRO SPITBOL VERSION V.V
846: * SUPPLIED BY SPITBOL ITSELF. V.V ARE DIGITS GIVING THE
847: * MAJOR VERSION NUMBER AND GENERALLY AT LEAST A MINOR
848: * VERSION NUMBER RELATING TO OSINT SHOULD BE SUPPLIED TO
849: * GIVE SAY
850: * MACRO SPITBOL VERSION V.V(M.M)
851: * THE SECOND STRING SHOULD IDENTIFY AT LEAST THE MACHINE
852: * AND OPERATING SYSTEM. PREFERABLY IT SHOULD INCLUDE
853: * THE DATE AND TIME OF THE RUN.
854: * OPTIONALLY THE STRINGS MAY INCLUDE SITE NAME OF THE
855: * THE IMPLEMENTOR AND/OR MACHINE ON WHICH RUN TAKES PLACE,
856: * UNIQUE SITE OR COPY NUMBER AND OTHER INFORMATION AS
857: * APPROPRIATE WITHOUT MAKING IT SO LONG AS TO BE A
858: * NUISANCE TO USERS.
859: * THE FIRST WORDS OF THE SCBLKS POINTED AT NEED NOT BE
860: * CORRECTLY SET.
861: *
862: * JSR SYSID CALL FOR SYSTEM IDENTIFICATION
863: * (XR) SCBLK PTR FOR ADDITION TO HEADER
864: * (XL) PTR TO SECOND HEADER SCBLK
865: {{EJC{{{{
866: *
867: * SYSIL -- GET INPUT RECORD LENGTH
868: *
869: {SYSIL{EXP{{{{DEFINE EXTERNAL ENTRY POINT
870: *
871: * SYSIL IS USED TO GET THE LENGTH OF THE NEXT INPUT RECORD
872: * FROM A FILE PREVIOUSLY INPUT ASSOCIATED WITH A SYSIO
873: * CALL. THE LENGTH RETURNED IS USED TO ESTABLISH A BUFFER
874: * FOR A SUBSEQUENT SYSIN CALL.
875: *
876: * (WA) PTR TO FCBLK OR ZERO
877: * JSR SYSIL CALL TO GET RECORD LENGTH
878: * (WA) LENGTH OR ZERO IF FILE CLOSED
879: *
880: * NO HARM IS DONE IF THE VALUE RETURNED IS TOO LONG SINCE
881: * UNUSED SPACE WILL BE RECLAIMED AFTER THE SYSIN CALL.
882: *
883: * NOTE THAT IT IS THE SYSIL CALL (NOT THE SYSIO CALL) WHICH
884: * CAUSES THE FILE TO BE OPENED AS REQUIRED FOR THE FIRST
885: * RECORD INPUT FROM THE FILE.
886: {{EJC{{{{
887: *
888: * SYSIN -- READ INPUT RECORD
889: *
890: {SYSIN{EXP{{{{DEFINE EXTERNAL ENTRY POINT
891: *
892: * SYSIN IS USED TO READ A RECORD FROM THE FILE WHICH WAS
893: * REFERENCED IN A PRIOR CALL TO SYSIL (I.E. THESE CALLS
894: * ALWAYS OCCUR IN PAIRS). THE BUFFER PROVIDED IS AN
895: * SCBLK FOR A STRING OF LENGTH SET FROM THE SYSIL CALL.
896: * IF THE ACTUAL LENGTH READ IS LESS THAN THIS, THE LENGTH
897: * FIELD OF THE SCBLK MUST BE MODIFIED BEFORE RETURNING
898: * UNLESS BUFFER IS RIGHT PADDED WITH ZEROES.
899: * IT IS ALSO PERMISSIBLE TO TAKE ANY OF THE ALTERNATIVE
900: * RETURNS AFTER SCBLK LENGTH HAS BEEN MODIFIED.
901: *
902: * (WA) PTR TO FCBLK OR ZERO
903: * (XR) POINTER TO BUFFER (SCBLK PTR)
904: * JSR SYSIN CALL TO READ RECORD
905: * PPM LOC ENDFILE OR NO I/P FILE AFTER SYSXI
906: * PPM LOC RETURN HERE IF I/O ERROR
907: * PPM LOC RETURN HERE IF RECORD FORMAT ERROR
908: * (WA,WB,WC) DESTROYED
909: {{EJC{{{{
910: *
911: * SYSIO -- INPUT/OUTPUT FILE ASSOCIATION
912: *
913: {SYSIO{EXP{{{{DEFINE EXTERNAL ENTRY POINT
914: *
915: * SEE ALSO SYSFC.
916: * SYSIO IS CALLED IN RESPONSE TO A SNOBOL4 INPUT OR OUTPUT
917: * FUNCTION CALL EXCEPT WHEN FILE ARG1 AND FILE ARG2
918: * ARE BOTH NULL.
919: * ITS CALL ALWAYS FOLLOWS IMMEDIATELY AFTER A CALL
920: * OF SYSFC. IF SYSFC REQUESTED ALLOCATION
921: * OF AN FCBLK, ITS ADDRESS WILL BE IN WA.
922: * FOR INPUT FILES, NON-ZERO VALUES OF $R$ SHOULD BE
923: * COPIED TO WC FOR USE IN ALLOCATING INPUT BUFFERS. IF $R$
924: * IS DEFAULTED OR NOT IMPLEMENTED, WC SHOULD BE ZEROISED.
925: * ONCE A FILE HAS BEEN OPENED, SUBSEQUENT INPUT(),OUTPUT()
926: * CALLS IN WHICH THE SECOND ARGUMENT IS IDENTICAL WITH THAT
927: * IN A PREVIOUS CALL, MERELY ASSOCIATE THE ADDITIONAL
928: * VARIABLE NAME (FIRST ARGUMENT) TO THE FILE AND DO NOT
929: * RESULT IN RE-OPENING THE FILE.
930: * IN SUBSEQUENT ASSOCIATED ACCESSES TO THE FILE A POINTER
931: * TO ANY FCBLK ALLOCATED WILL BE MADE AVAILABLE.
932: *
933: * (XL) FILE ARG1 SCBLK PTR (2ND ARG)
934: * (XR) FILE ARG2 SCBLK PTR (3RD ARG)
935: * (WA) FCBLK PTR (0 IF NONE)
936: * (WB) 0 FOR INPUT, 3 FOR OUTPUT
937: * JSR SYSIO CALL TO ASSOCIATE FILE
938: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST
939: * PPM LOC RETURN IF INPUT/OUTPUT NOT ALLOWED
940: * (XL) FCBLK POINTER (0 IF NONE)
941: * (WC) 0 (FOR DEFAULT) OR MAX RECORD LNGTH
942: * (WA,WB) DESTROYED
943: *
944: * THE SECOND ERROR RETURN IS USED IF THE FILE NAMED EXISTS
945: * BUT INPUT/OUTPUT FROM THE FILE IS NOT ALLOWED. FOR
946: * EXAMPLE, THE STANDARD OUTPUT FILE MAY BE IN THIS CATEGORY
947: * AS REGARDS INPUT ASSOCIATION.
948: {{EJC{{{{
949: *
950: * SYSLD -- LOAD EXTERNAL FUNCTION
951: *
952: {SYSLD{EXP{{{{DEFINE EXTERNAL ENTRY POINT
953: *
954: * SYSLD IS CALLED IN RESPONSE TO THE USE OF THE SNOBOL4
955: * LOAD FUNCTION. THE NAMED FUNCTION IS LOADED (WHATEVER
956: * THIS MEANS), AND A POINTER IS RETURNED. THE POINTER WILL
957: * BE USED ON SUBSEQUENT CALLS TO THE FUNCTION (SEE SYSEX).
958: *
959: * (XR) POINTER TO FUNCTION NAME (SCBLK)
960: * (XL) POINTER TO LIBRARY NAME (SCBLK)
961: * JSR SYSLD CALL TO LOAD FUNCTION
962: * PPM LOC RETURN HERE IF FUNC DOES NOT EXIST
963: * PPM LOC RETURN HERE IF I/O ERROR
964: * (XR) POINTER TO LOADED CODE
965: *
966: * THE SIGNIFICANCE OF THE POINTER RETURNED IS UP TO THE
967: * SYSTEM INTERFACE ROUTINE. THE ONLY RESTRICTION IS THAT
968: * IF THE POINTER IS WITHIN DYNAMIC STORAGE, IT MUST BE
969: * A PROPER BLOCK POINTER.
970: {{EJC{{{{
971: *
972: * SYSMM -- GET MORE MEMORY
973: *
974: {SYSMM{EXP{{{{DEFINE EXTERNAL ENTRY POINT
975: *
976: * SYSMM IS CALLED IN AN ATTEMPT TO ALLOCATE MORE DYNAMIC
977: * MEMORY. THIS MEMORY MUST BE ALLOCATED CONTIGUOUSLY WITH
978: * THE CURRENT DYNAMIC DATA AREA.
979: *
980: * THE AMOUNT ALLOCATED IS UP TO THE SYSTEM TO DECIDE. ANY
981: * VALUE IS ACCEPTABLE INCLUDING ZERO IF ALLOCATION IS
982: * IMPOSSIBLE.
983: *
984: * JSR SYSMM CALL TO GET MORE MEMORY
985: * (XR) NUMBER OF ADDITIONAL WORDS OBTAINED
986: {{EJC{{{{
987: *
988: * SYSMX -- SUPPLY MXLEN
989: *
990: {SYSMX{EXP{{{{DEFINE EXTERNAL ENTRY POINT
991: *
992: * BECAUSE OF THE METHOD OF GARBAGE COLLECTION, NO SPITBOL
993: * OBJECT IS ALLOWED TO OCCUPY MORE BYTES OF MEMORY THAN
994: * THE INTEGER GIVING THE LOWEST ADDRESS OF DYNAMIC
995: * (GARBAGE COLLECTABLE) MEMORY. MXLEN IS THE NAME USED TO
996: * REFER TO THIS MAXIMUM LENGTH OF AN OBJECT AND FOR MOST
997: * USERS OF MOST IMPLEMENTATIONS, PROVIDED DYNAMIC MEMORY
998: * STARTS AT AN ADDRESS OF AT LEAST A FEW THOUSAND WORDS,
999: * THERE IS NO PROBLEM.
1000: * IF THE DEFAULT STARTING ADDRESS IS LESS THAN SAY 10000 OR
1001: * 20000, THEN A LOAD TIME OPTION SHOULD BE PROVIDED WHERE A
1002: * USER CAN REQUEST THAT HE BE ABLE TO CREATE LARGER
1003: * OBJECTS. THIS ROUTINE INFORMS SPITBOL OF THIS REQUEST IF
1004: * ANY. THE VALUE RETURNED IS EITHER AN INTEGER
1005: * REPRESENTING THE DESIRED VALUE OF MXLEN (AND HENCE THE
1006: * MINIMUM DYNAMIC STORE ADDRESS WHICH MAY RESULT IN
1007: * NON-USE OF SOME STORE) OR ZERO IF A DEFAULT IS ACCEPTABLE
1008: * IN WHICH MXLEN IS SET TO THE LOWEST ADDRESS ALLOCATED
1009: * TO DYNAMIC STORE BEFORE COMPILATION STARTS.
1010: * IF A NON-ZERO VALUE IS RETURNED, THIS IS USED FOR KEYWORD
1011: * MAXLNGTH. OTHERWISE THE INITIAL LOW ADDRESS OF DYNAMIC
1012: * MEMORY IS USED FOR THIS KEYWORD.
1013: *
1014: * JSR SYSMX CALL TO GET MXLEN
1015: * (WA) EITHER MXLEN OR 0 FOR DEFAULT
1016: {{EJC{{{{
1017: *
1018: * SYSOU -- OUTPUT RECORD
1019: *
1020: {SYSOU{EXP{{{{DEFINE EXTERNAL ENTRY POINT
1021: *
1022: * SYSOU IS USED TO WRITE A RECORD TO A FILE PREVIOUSLY
1023: * ASSOCIATED WITH A SYSIO CALL.
1024: *
1025: * (WA) PTR TO FCBLK OR ZERO
1026: * (XR) RECORD TO BE WRITTEN (SCBLK)
1027: * JSR SYSOU CALL TO OUTPUT RECORD
1028: * PPM LOC FILE FULL OR NO FILE AFTER SYSXI
1029: * PPM LOC RETURN HERE IF I/O ERROR
1030: * (WA,WB,WC) DESTROYED
1031: *
1032: * NOTE THAT IT IS THE SYSOU CALL (NOT THE SYSIO CALL) WHICH
1033: * CAUSES THE FILE TO BE OPENED AS REQUIRED FOR THE FIRST
1034: * RECORD OUTPUT TO THE FILE.
1035: {{EJC{{{{
1036: *
1037: * SYSPI -- PRINT ON INTERACTIVE CHANNEL
1038: *
1039: {SYSPI{EXP{{{{DEFINE EXTERNAL ENTRY POINT
1040: *
1041: * IF SPITBOL IS RUN FROM AN ONLINE TERMINAL, OSINT CAN
1042: * REQUEST THAT MESSAGES SUCH AS COPIES OF COMPILATION
1043: * ERRORS BE SENT TO THE TERMINAL (SEE SYSPP). IF RELEVANT
1044: * REPLY WAS MADE BY SYSPP THEN SYSPI IS CALLED TO SEND SUCH
1045: * MESSAGES TO THE INTERACTIVE CHANNEL.
1046: * SYSPI IS ALSO USED FOR SENDING OUTPUT TO THE TERMINAL
1047: * THROUGH THE SPECIAL VARIABLE NAME, TERMINAL.
1048: *
1049: * (XR) PTR TO LINE BUFFER (SCBLK)
1050: * (WA) LINE LENGTH
1051: * JSR SYSPI CALL TO PRINT LINE
1052: * PPM LOC FAILURE RETURN
1053: * (WA,WB) DESTROYED
1054: {{EJC{{{{
1055: *
1056: * SYSPP -- OBTAIN PRINT PARAMETERS
1057: *
1058: {SYSPP{EXP{{{{DEFINE EXTERNAL ENTRY POINT
1059: *
1060: * SYSPP IS CALLED ONCE DURING COMPILATION TO OBTAIN
1061: * PARAMETERS REQUIRED FOR CORRECT PRINTED OUTPUT FORMAT
1062: * AND TO SELECT OTHER OPTIONS. IT MAY ALSO BE CALLED AGAIN
1063: * AFTER SYSXI WHEN A LOAD MODULE IS RESUMED. IN THIS
1064: * CASE THE VALUE RETURNED IN WA MAY BE LESS THAN OR EQUAL
1065: * TO THAT RETURNED IN INITIAL CALL BUT MAY NOT BE
1066: * GREATER.
1067: * THE INFORMATION RETURNED IS -
1068: * 1. LINE LENGTH IN CHARS FOR STANDARD PRINT FILE
1069: * 2. NO OF LINES/PAGE. 0 IS PREFERABLE FOR A NON-PAGED
1070: * DEVICE (E.G. ONLINE TERMINAL) IN WHICH CASE LISTING
1071: * PAGE THROWS ARE SUPPRESSED AND PAGE HEADERS
1072: * RESULTING FROM -TITLE,-STITL LINES ARE KEPT SHORT.
1073: * 3. AN INITIAL -NOLIST OPTION TO SUPPRESS LISTING UNLESS
1074: * THE PROGRAM CONTAINS AN EXPLICIT -LIST.
1075: * 4. OPTIONS TO SUPPRESS LISTING OF COMPILATION AND/OR
1076: * EXECUTION STATS (USEFUL FOR ESTABLISHED PROGRAMS) -
1077: * COMBINED WITH 3. GIVES POSSIBILITY OF LISTING
1078: * FILE NEVER BEING OPENED.
1079: * 5. OPTION TO HAVE COPIES OF ERRORS SENT TO AN
1080: * INTERACTIVE CHANNEL IN ADDITION TO STANDARD PRINTER.
1081: * 6. OPTION TO KEEP PAGE HEADERS SHORT (E.G. IF LISTING
1082: * TO AN ONLINE TERMINAL).
1083: * 7. AN OPTION TO CHOOSE EXTENDED OR COMPACT LISTING
1084: * FORMAT. IN THE FORMER A PAGE EJECT AND IN THE LATTER
1085: * A FEW LINE FEEDS PRECEDE THE PRINTING OF EACH
1086: * OF-- LISTING, COMPILATION STATISTICS, EXECUTION
1087: * OUTPUT AND EXECUTION STATISTICS.
1088: * 8. AN OPTION TO SUPPRESS EXECUTION AS THOUGH A
1089: * -NOEXECUTE CARD WERE SUPPLIED.
1090: * 9. AN OPTION TO REQUEST THAT NAME /TERMINAL/ BE PRE-
1091: * ASSOCIATED TO AN ONLINE TERMINAL VIA SYSPI AND SYSRI
1092: * 10. AN INTERMEDIATE (STANDARD) LISTING OPTION REQUIRING
1093: * THAT PAGE EJECTS OCCUR IN SOURCE LISTINGS. REDUNDANT
1094: * IF EXTENDED OPTION CHOSEN BUT PARTIALLY EXTENDS
1095: * COMPACT OPTION.
1096: * 11. OPTION TO SUPPRESS SYSID IDENTIFICATION.
1097: *
1098: * JSR SYSPP CALL TO GET PRINT PARAMETERS
1099: * (WA) PRINT LINE LENGTH IN CHARS
1100: * (WB) NUMBER OF LINES/PAGE
1101: * (WC) BITS VALUE ...JIHGFEDCBA WHERE
1102: * A = 1 TO SEND ERROR COPY TO INT.CH.
1103: * B = 1 MEANS STD PRINTER IS INT. CH.
1104: * C = 1 FOR -NOLIST OPTION
1105: * D = 1 TO SUPPRESS COMPILN. STATS
1106: * E = 1 TO SUPPRESS EXECN. STATS
1107: * F = 1/0 FOR EXTNDED/COMPACT LISTING
1108: * G = 1 FOR -NOEXECUTE
1109: * H = 1 PRE-ASSOCIATE /TERMINAL/
1110: * I = 1 FOR STANDARD LISTING OPTION.
1111: * J = 1 SUPPRESSES LISTING HEADER
1112: {{EJC{{{{
1113: *
1114: * SYSPR -- PRINT LINE ON STANDARD OUTPUT FILE
1115: *
1116: {SYSPR{EXP{{{{DEFINE EXTERNAL ENTRY POINT
1117: *
1118: * SYSPR IS USED TO PRINT A SINGLE LINE ON THE STANDARD
1119: * OUTPUT FILE.
1120: *
1121: * (XR) POINTER TO LINE BUFFER (SCBLK)
1122: * (WA) LINE LENGTH
1123: * JSR SYSPR CALL TO PRINT LINE
1124: * PPM LOC TOO MUCH O/P OR NO FILE AFTER SYSXI
1125: * (WA,WB) DESTROYED
1126: *
1127: * THE BUFFER POINTED TO IS THE LENGTH OBTAINED FROM THE
1128: * SYSPP CALL AND IS FILLED OUT WITH TRAILING BLANKS. THE
1129: * VALUE IN WA IS THE ACTUAL LINE LENGTH WHICH MAY BE LESS
1130: * THAN THE MAXIMUM LINE LENGTH POSSIBLE. THERE IS NO SPACE
1131: * CONTROL ASSOCIATED WITH THE LINE, ALL LINES ARE PRINTED
1132: * SINGLE SPACED. NOTE THAT NULL LINES (WA=0) ARE POSSIBLE
1133: * IN WHICH CASE A BLANK LINE IS TO BE PRINTED.
1134: *
1135: * THE ERROR EXIT IS USED FOR SYSTEMS WHICH LIMIT THE AMOUNT
1136: * OF PRINTED OUTPUT. IF POSSIBLE, PRINTING SHOULD BE
1137: * PERMITTED AFTER THIS CONDITION HAS BEEN SIGNALLED ONCE TO
1138: * ALLOW FOR DUMP AND OTHER DIAGNOSTIC INFORMATION.
1139: * ASSUMING THIS TO BE POSSIBLE, SPITBOL MAY MAKE MORE SYSPR
1140: * CALLS. IF THE ERROR RETURN OCCURS ANOTHER TIME, EXECUTION
1141: * IS TERMINATED BY A CALL OF SYSEJ WITH ENDING CODE 998.
1142: {{EJC{{{{
1143: *
1144: * SYSRD -- READ RECORD FROM STANDARD INPUT FILE
1145: *
1146: {SYSRD{EXP{{{{DEFINE EXTERNAL ENTRY POINT
1147: *
1148: * SYSRD IS USED TO READ A RECORD FROM THE STANDARD INPUT
1149: * FILE. THE BUFFER PROVIDED IS AN SCBLK FOR A STRING THE
1150: * LENGTH OF WHICH IN CHARACTERS IS GIVEN IN WC, THIS
1151: * CORRESPONDING TO THE MAXIMUM LENGTH OF STRING WHICH
1152: * SPITBOL IS PREPARED TO RECEIVE. AT COMPILE TIME IT
1153: * CORRESPONDS TO XXX IN THE MOST RECENT -INXXX CARD
1154: * (DEFAULT 72) AND AT EXECUTION TIME TO THE MOST RECENT
1155: * ,R$R$ (RECORD LENGTH) IN THE THIRD ARG OF AN INPUT()
1156: * STATEMENT FOR THE STANDARD INPUT FILE (DEFAULT 80).
1157: * IF FEWER THAN (WC) CHARACTERS ARE READ, THE LENGTH
1158: * FIELD OF THE SCBLK MUST BE ADJUSTED BEFORE RETURNING
1159: * UNLESS THE BUFFER IS RIGHT PADDED WITH ZEROES.
1160: * IT IS ALSO PERMISSIBLE TO TAKE THE ALTERNATIVE RETURN
1161: * AFTER SUCH AN ADJUSTMENT HAS BEEN MADE.
1162: * SPITBOL MAY CONTINUE TO MAKE CALLS AFTER AN ENDFILE
1163: * RETURN SO THIS ROUTINE SHOULD BE PREPARED TO MAKE
1164: * REPEATED ENDFILE RETURNS.
1165: *
1166: * (XR) POINTER TO BUFFER (SCBLK PTR)
1167: * (WC) LENGTH OF BUFFER IN CHARACTERS
1168: * JSR SYSRD CALL TO READ LINE
1169: * PPM LOC ENDFILE OR NO I/P FILE AFTER SYSXI
1170: * (WA,WB,WC) DESTROYED
1171: {{EJC{{{{
1172: *
1173: * SYSRI -- READ RECORD FROM INTERACTIVE CHANNEL
1174: *
1175: {SYSRI{EXP{{{{DEFINE EXTERNAL ENTRY POINT
1176: *
1177: * READS A RECORD FROM ONLINE TERMINAL FOR SPITBOL VARIABLE,
1178: * TERMINAL. IF ONLINE TERMINAL IS UNAVAILABLE THEN CODE THE
1179: * ENDFILE RETURN ONLY.
1180: * THE BUFFER PROVIDED IS OF LENGTH 120 CHARACTERS. SYSRI
1181: * SHOULD REPLACE THE COUNT IN THE SECOND WORD OF THE SCBLK
1182: * BY THE ACTUAL CHARACTER COUNT UNLESS BUFFER IS RIGHT
1183: * PADDED WITH ZEROES.
1184: * IT IS ALSO PERMISSIBLE TO TAKE THE ALTERNATIVE
1185: * RETURN AFTER ADJUSTING THE COUNT.
1186: * THE END OF FILE RETURN MAY BE USED IF THIS MAKES
1187: * SENSE ON THE TARGET MACHINE (E.G. IF THERE IS AN
1188: * EOF CHARACTER.)
1189: *
1190: * (XR) PTR TO 120 CHAR BUFFER (SCBLK PTR)
1191: * JSR SYSRI CALL TO READ LINE FROM TERMINAL
1192: * PPM LOC END OF FILE RETURN
1193: * (WA,WB,WC) MAY BE DESTROYED
1194: {{EJC{{{{
1195: *
1196: * SYSRW -- REWIND FILE
1197: *
1198: {SYSRW{EXP{{{{DEFINE EXTERNAL ENTRY POINT
1199: *
1200: * SYSRW IS USED TO REWIND A FILE I.E. REPOSITION THE FILE
1201: * AT THE START BEFORE THE FIRST RECORD. THE FILE SHOULD BE
1202: * CLOSED AND THE NEXT READ OR WRITE CALL WILL OPEN THE
1203: * FILE AT THE START.
1204: *
1205: * (WA) PTR TO FCBLK OR ZERO
1206: * (XR) REWIND ARG (SCBLK PTR)
1207: * JSR SYSRW CALL TO REWIND FILE
1208: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST
1209: * PPM LOC RETURN HERE IF REWIND NOT ALLOWED
1210: * PPM LOC RETURN HERE IF I/O ERROR
1211: {{EJC{{{{
1212: *
1213: * SYSST -- SET FILE POINTER
1214: *
1215: {SYSST{EXP{{{{DEFINE EXTERNAL ENTRY POINT
1216: *
1217: * SYSST IS CALLED TO CHANGE THE POSITION OF A FILE
1218: * POINTER. THIS IS ACCOMPLISHED IN A SYSTEM DEPENDENT
1219: * MANNER, AND THUS THE 2ND AND 3RD ARGUMENTS ARE PASSED
1220: * UNCONVERTED.
1221: *
1222: * (WA) FCBLK POINTER
1223: * (WB) 2ND ARGUMENT
1224: * (WC) 3RD ARGUMENT
1225: * JSR SYSST CALL TO SET FILE POINTER
1226: * PPM LOC RETURN HERE IF INVALID 2ND ARG
1227: * PPM LOC RETURN HERE IF INVALID 3RD ARG
1228: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST
1229: * PPM LOC RETURN HERE IF SET NOT ALLOWED
1230: * PPM LOC RETURN HERE IF I/O ERROR
1231: *
1232: {{EJC{{{{
1233: *
1234: * SYSTM -- GET EXECUTION TIME SO FAR
1235: *
1236: {SYSTM{EXP{{{{DEFINE EXTERNAL ENTRY POINT
1237: *
1238: * SYSTM IS USED TO OBTAIN THE AMOUNT OF EXECUTION TIME
1239: * USED SO FAR SINCE SPITBOL WAS GIVEN CONTROL. THE UNITS
1240: * ARE DESCRIBED AS MILLISECONDS IN THE SPITBOL OUTPUT, BUT
1241: * THE EXACT MEANING IS SYSTEM DEPENDENT. WHERE APPROPRIATE,
1242: * THIS VALUE SHOULD RELATE TO PROCESSOR RATHER THAN CLOCK
1243: * TIMING VALUES.
1244: *
1245: * JSR SYSTM CALL TO GET TIMER VALUE
1246: * (IA) TIME SO FAR IN MILLISECONDS
1247: {{EJC{{{{
1248: *
1249: * SYSTT -- TRACE TOGGLE
1250: *
1251: {SYSTT{EXP{{{{DEFINE EXTERNAL ENTRY POINT
1252: *
1253: * CALLED BY SPITBOL FUNCTION TRACE() WITH NO ARGS TO
1254: * TOGGLE THE SYSTEM TRACE SWITCH. THIS PERMITS TRACING OF
1255: * LABELS IN SPITBOL CODE TO BE TURNED ON OR OFF.
1256: *
1257: * JSR SYSTT CALL TO TOGGLE TRACE SWITCH
1258: {{EJC{{{{
1259: *
1260: * SYSUL -- UNLOAD EXTERNAL FUNCTION
1261: *
1262: {SYSUL{EXP{{{{DEFINE EXTERNAL ENTRY POINT
1263: *
1264: * SYSUL IS USED TO UNLOAD A FUNCTION PREVIOUSLY
1265: * LOADED WITH A CALL TO SYSLD.
1266: *
1267: * (XR) PTR TO CONTROL BLOCK (EFBLK)
1268: * JSR SYSUL CALL TO UNLOAD FUNCTION
1269: *
1270: * THE FUNCTION CANNOT BE CALLED FOLLOWING A SYSUL CALL
1271: * UNTIL ANOTHER SYSLD CALL IS MADE FOR THE SAME FUNCTION.
1272: *
1273: * THE EFBLK CONTAINS THE FUNCTION CODE POINTER AND ALSO A
1274: * POINTER TO THE VRBLK CONTAINING THE FUNCTION NAME (SEE
1275: * DEFINITIONS AND DATA STRUCTURES SECTION).
1276: {{EJC{{{{
1277: *
1278: * SYSXI -- EXIT TO PRODUCE LOAD MODULE
1279: *
1280: {SYSXI{EXP{{{{DEFINE EXTERNAL ENTRY POINT
1281: *
1282: * WHEN SYSXI IS CALLED, XL CONTAINS EITHER A STRING POINTER
1283: * OR ZERO. IN THE FORMER CASE, THE STRING GIVES THE
1284: * CHARACTER NAME OF A PROGRAM. THE INTENTION IS THAT
1285: * SPITBOL EXECUTION SHOULD BE TERMINATED FORTHWITH AND
1286: * THE NAMED PROGRAM LOADED AND EXECUTED. THIS TYPE OF CHAIN
1287: * EXECUTION IS VERY SYSTEM DEPENDENT AND IMPLEMENTORS MAY
1288: * CHOOSE TO OMIT IT OR FIND IT IMPOSSIBLE TO PROVIDE.
1289: * IF (XL) IS ZERO,IA CONTAINS ONE OF THE FOLLOWING INTEGERS
1290: *
1291: * -1, -2, -3
1292: * CREATE IF POSSIBLE A LOAD MODULE CONTAINING ONLY THE
1293: * IMPURE AREA OF MEMORY WHICH NEEDS TO BE LOADED WITH
1294: * A COMPATIBLE PURE SEGMENT FOR SUBSEQUENT EXECUTIONS.
1295: * VERSION NUMBERS TO CHECK COMPATIBILITY SHOULD BE
1296: * KEPT IN BOTH SEGMENTS AND CHECKED ON LOADING.
1297: * TO ASSIST WITH THIS CHECK, (XR) ON ENTRY IS A
1298: * POINTER TO AN SCBLK CONTAINING THE SPITBOL MAJOR
1299: * VERSION NUMBER V.V (SEE SYSID).
1300: *
1301: * 0 IF POSSIBLE, RETURN CONTROL TO JOB CONTROL
1302: * COMMAND LEVEL. THE EFFECT IF AVAILABLE WILL BE
1303: * SYSTEM DEPENDENT.
1304: *
1305: * +1, +2, +3
1306: * CREATE IF POSSIBLE A LOAD MODULE FROM ALL OF
1307: * MEMORY. IT SHOULD BE POSSIBLE TO LOAD AND EXECUTE
1308: * THIS MODULE DIRECTLY.
1309: *
1310: * IN THE CASE OF SAVED LOAD MODULES, THE STATUS OF OPEN
1311: * FILES IS NOT PRESERVED AND IMPLEMENTORS MAY CHOOSE TO
1312: * OFFER MEANS OF ATTACHING FILES BEFORE EXECUTION OF LOAD
1313: * MODULES STARTS OR LEAVE IT TO THE USER TO INCLUDE
1314: * SUITABLE INPUT(), OUTPUT() CALLS IN HIS PROGRAM.
1315: * SYSXI SHOULD MAKE A NOTE THAT NO I/O CHANNELS,
1316: * INCLUDING STANDARD FILES, HAVE FILES ATTACHED SO THAT
1317: * CALLS OF SYSIN, SYSOU, SYSPR, SYSRD SHOULD FAIL UNLESS
1318: * NEW ASSOCIATIONS ARE MADE FOR THE LOAD MODULE.
1319: * AT LEAST IN THE CASE OF THE STANDARD OUTPUT FILE, IT IS
1320: * RECOMMENDED THAT EITHER THE USER BE REQUIRED TO ATTACH
1321: * A FILE OR THAT A DEFAULT FILE IS ATTACHED, SINCE THE
1322: * PROBLEM OF ERROR MESSAGES GENERATED BY THE LOAD MODULE
1323: * IS OTHERWISE SEVERE. AS A LAST RESORT, IF SPITBOL
1324: * ATTEMPTS TO WRITE TO THE STANDARD OUTPUT FILE AND GETS A
1325: * REPLY INDICATING THAT SUCH OUPUT IS UNACCEPTABLE IT STOPS
1326: * BY USING AN ENTRY TO SYSEJ WITH ENDING CODE 998.
1327: * AS DESCRIBED BELOW, PASSING OF SOME ARGUMENTS MAKES IT
1328: * CLEAR THAT LOAD MODULE WILL USE A STANDARD OUTPUT FILE.
1329: *
1330: * IF USE IS MADE OF FCBLKS FOR I/O ASSOCIATION, SPITBOL
1331: * BUILDS A CHAIN SO THAT THOSE IN USE MAY BE FOUND IN SYSXI
1332: * AND SYSEJ. THE NODES ARE 4 WORDS LONG. THIRD WORD
1333: * CONTAINS LINK TO NEXT NODE OR 0, FOURTH WORD CONTAINS
1334: * FCBLK POINTER.
1335: {{EJC{{{{
1336: *
1337: * SYSXI (CONTINUED)
1338: *
1339: * (XL) ZERO OR SCBLK PTR
1340: * (XR) PTR TO V.V SCBLK
1341: * (IA) SIGNED INTEGER ARGUMENT
1342: * (WB) 0 OR PTR TO HEAD OF FCBLK CHAIN
1343: * JSR SYSXI CALL TO EXIT
1344: * PPM LOC REQUESTED ACTION NOT POSSIBLE
1345: * PPM LOC ACTION CAUSED IRRECOVERABLE ERROR
1346: * (REGISTERS) SHOULD BE PRESERVED OVER CALL
1347: *
1348: * LOADING AND RUNNING THE LOAD MODULE OR RETURNING FROM
1349: * JCL COMMAND LEVEL CAUSES EXECUTION TO RESUME AT THE POINT
1350: * AFTER THE ERROR RETURNS WHICH FOLLOW THE CALL OF SYSXI.
1351: * THE VALUE PASSED AS EXIT ARGUMENT IS USED TO INDICATE
1352: * OPTIONS REQUIRED ON RESUMPTION OF LOAD MODULE.
1353: * +1 OR -1 REQUIRE THAT ON RESUMPTION, SYSID AND SYSPP BE
1354: * CALLED AND A HEADING PRINTED ON THE STANDARD OUTPUT FILE.
1355: * +2 OR -2 INDICATE THAT SYSPP WILL BE CALLED BUT NOT SYSID
1356: * AND NO HEADING WILL BE PUT ON STANDARD OUTPUT FILE.
1357: * ABOVE OPTIONS HAVE THE OBVIOUS IMPLICATION THAT A
1358: * STANDARD O/P FILE MUST BE PROVIDED FOR THE LOAD MODULE.
1359: * +3 OR -3 INDICATE CALLS OF NEITHER SYSID NOR SYSPP
1360: * AND NO HEADING WILL BE PLACED ON STANDARD OUTPUT FILE.
1361: * NO RETURN FROM SYSXI IS POSSIBLE IF ANOTHER PROGRAM
1362: * IS LOADED AND ENTERED.
1363: {{EJC{{{{
1364: *
1365: * INTRODUCE THE INTERNAL PROCEDURES.
1366: *
1367: {ACESS{INP{R{1{{
1368: {ACOMP{INP{N{5{{
1369: {ALLOC{INP{E{0{{
1370: {ALOBF{INP{E{0{{
1371: {ALOCS{INP{E{0{{
1372: {ALOST{INP{E{0{{
1373: {APNDB{INP{E{2{{
1374: {ARITH{INP{N{3{{
1375: {ASIGN{INP{R{1{{
1376: {ASINP{INP{R{1{{
1377: {BLKLN{INP{E{0{{
1378: {CDGCG{INP{E{0{{
1379: {CDGEX{INP{R{0{{
1380: {CDGNM{INP{R{0{{
1381: {CDGVL{INP{R{0{{
1382: {CDWRD{INP{E{0{{
1383: {CMGEN{INP{R{0{{
1384: {CMPIL{INP{E{0{{
1385: {CNCRD{INP{E{0{{
1386: {COPYB{INP{N{1{{
1387: {DFFNC{INP{E{0{{
1388: {DTACH{INP{E{0{{
1389: {DTYPE{INP{E{0{{
1390: {DUMPR{INP{E{0{{
1391: {ERMSG{INP{E{0{{
1392: {ERTEX{INP{E{0{{
1393: {EVALI{INP{R{4{{
1394: {EVALP{INP{R{1{{
1395: {EVALS{INP{R{3{{
1396: {EVALX{INP{R{1{{
1397: {EXBLD{INP{E{0{{
1398: {EXPAN{INP{E{0{{
1399: {EXPAP{INP{E{1{{
1400: {EXPDM{INP{N{0{{
1401: {EXPOP{INP{N{0{{
1402: {FLSTG{INP{R{0{{
1403: {GBCOL{INP{E{0{{
1404: {GBCPF{INP{E{0{{
1405: {GTARR{INP{E{1{{
1406: {{EJC{{{{
1407: {GTCOD{INP{E{1{{
1408: {GTEXP{INP{E{1{{
1409: {GTINT{INP{E{1{{
1410: {GTNUM{INP{E{1{{
1411: {GTNVR{INP{E{1{{
1412: {GTPAT{INP{E{1{{
1413: {GTREA{INP{E{1{{
1414: {GTSMI{INP{N{2{{
1415: {GTSTG{INP{N{1{{
1416: {GTVAR{INP{E{1{{
1417: {HASHS{INP{E{0{{
1418: {ICBLD{INP{E{0{{
1419: {IDENT{INP{E{1{{
1420: {INOUT{INP{E{0{{
1421: {INSBF{INP{E{2{{
1422: {IOFCB{INP{N{2{{
1423: {IOPPF{INP{N{0{{
1424: {IOPUT{INP{N{6{{
1425: {KTREX{INP{R{0{{
1426: {KWNAM{INP{N{0{{
1427: {LCOMP{INP{N{5{{
1428: {LISTR{INP{E{0{{
1429: {LISTT{INP{E{0{{
1430: {NEXTS{INP{E{0{{
1431: {PATIN{INP{N{2{{
1432: {PATST{INP{N{1{{
1433: {PBILD{INP{E{0{{
1434: {PCONC{INP{E{0{{
1435: {PCOPY{INP{N{0{{
1436: {PRFLR{INP{E{0{{
1437: {PRFLU{INP{E{0{{
1438: {PRPAR{INP{E{0{{
1439: {PRTCH{INP{E{0{{
1440: {PRTIC{INP{E{0{{
1441: {PRTIS{INP{E{0{{
1442: {PRTIN{INP{E{0{{
1443: {PRTMI{INP{E{0{{
1444: {PRTMX{INP{E{0{{
1445: {PRTNL{INP{R{0{{
1446: {PRTNM{INP{R{0{{
1447: {PRTNV{INP{E{0{{
1448: {PRTPG{INP{E{0{{
1449: {PRTPS{INP{E{0{{
1450: {PRTSN{INP{E{0{{
1451: {PRTST{INP{R{0{{
1452: {{EJC{{{{
1453: {PRTTR{INP{E{0{{
1454: {PRTVL{INP{R{0{{
1455: {PRTVN{INP{E{0{{
1456: {RCBLD{INP{E{0{{
1457: {READR{INP{E{0{{
1458: {SBSTR{INP{E{0{{
1459: {SCANE{INP{E{0{{
1460: {SCNGF{INP{E{0{{
1461: {SETVR{INP{E{0{{
1462: {SORTA{INP{N{0{{
1463: {SORTC{INP{E{1{{
1464: {SORTF{INP{E{0{{
1465: {SORTH{INP{E{0{{
1466: {TFIND{INP{E{1{{
1467: {TRACE{INP{N{2{{
1468: {TRBLD{INP{E{0{{
1469: {TRIMR{INP{E{0{{
1470: {TRXEQ{INP{R{0{{
1471: {XSCAN{INP{E{0{{
1472: {XSCNI{INP{N{2{{
1473: *
1474: * INTRODUCE THE INTERNAL ROUTINES
1475: *
1476: {ARREF{INR{{{{
1477: {CFUNC{INR{{{{
1478: {EXFAL{INR{{{{
1479: {EXINT{INR{{{{
1480: {EXITS{INR{{{{
1481: {EXIXR{INR{{{{
1482: {EXNAM{INR{{{{
1483: {EXNUL{INR{{{{
1484: {EXREA{INR{{{{
1485: {EXSID{INR{{{{
1486: {EXVNM{INR{{{{
1487: {FAILP{INR{{{{
1488: {FLPOP{INR{{{{
1489: {INDIR{INR{{{{
1490: {MATCH{INR{{{{
1491: {RETRN{INR{{{{
1492: {STCOV{INR{{{{
1493: {STMGO{INR{{{{
1494: {STOPR{INR{{{{
1495: {SUCCP{INR{{{{
1496: {SYSAB{INR{{{{
1497: {SYSTU{INR{{{{
1498: {{TTL{S{{{P I T B O L -- DEFINITIONS AND DATA STRUCTURES
1499: {{SEC{{{{START OF DEFINITIONS SECTION
1500: *
1501: * DEFINITIONS OF MACHINE PARAMETERS
1502: *
1503: * THE MINIMAL TRANSLATOR SHOULD SUPPLY APPROPRIATE VALUES
1504: * FOR THE PARTICULAR TARGET MACHINE FOR ALL THE
1505: * EQU *
1506: * DEFINITIONS GIVEN AT THE START OF THIS SECTION.
1507: *
1508: {CFP$A{EQU{*{{{NUMBER OF CHARACTERS IN ALPHABET
1509: *
1510: {CFP$B{EQU{*{{{BYTES/WORD ADDRESSING FACTOR
1511: *
1512: {CFP$C{EQU{*{{{NUMBER OF CHARACTERS PER WORD
1513: *
1514: {CFP$F{EQU{*{{{OFFSET IN BYTES TO CHARS IN
1515: * SCBLK. SEE SCBLK FORMAT.
1516: *
1517: {CFP$I{EQU{*{{{NUMBER OF WORDS IN INTEGER CONSTANT
1518: *
1519: {CFP$M{EQU{*{{{MAX POSITIVE INTEGER IN ONE WORD
1520: *
1521: {CFP$N{EQU{*{{{NUMBER OF BITS IN ONE WORD
1522: *
1523: * THE FOLLOWING DEFINITIONS REQUIRE THE SUPPLY OF EITHER
1524: * A SINGLE PARAMETER IF REAL ARITHMETIC IS OMITTED OR
1525: * THREE PARAMETERS IF REAL ARITHMETIC IS INCLUDED.
1526: *
1527: *
1528: {CFP$R{EQU{*{{{NUMBER OF WORDS IN REAL CONSTANT
1529: *
1530: {CFP$S{EQU{*{{{NUMBER OF SIG DIGS FOR REAL OUTPUT
1531: *
1532: {CFP$X{EQU{*{{{MAX DIGITS IN REAL EXPONENT
1533: *
1534: {MXDGS{EQU{CFP$S+CFP$X{{{MAX DIGITS IN REAL NUMBER
1535: *
1536: {NSTMX{EQU{MXDGS+5{{{MAX SPACE FOR REAL (FOR +0.E+)
1537: *
1538: * THE FOLLOWING DEFINITION FOR CFP$U SUPPLIES A REALISTIC
1539: * UPPER BOUND ON THE SIZE OF THE ALPHABET. CFP$U IS USED
1540: * TO SAVE SPACE IN THE SCANE BSW-IFF-ESW TABLE AND TO EASE
1541: * TRANSLATION STORAGE REQUIREMENTS.
1542: *
1543: {CFP$U{EQU{*{{{REALISTIC UPPER BOUND ON ALPHABET
1544: {{EJC{{{{
1545: *
1546: * ENVIRONMENT PARAMETERS
1547: *
1548: * THE SPITBOL PROGRAM IS ESSENTIALLY INDEPENDENT OF
1549: * THE DEFINITIONS OF THESE PARAMETERS. HOWEVER, THE
1550: * EFFICIENCY OF THE SYSTEM MAY BE AFFECTED. CONSEQUENTLY,
1551: * THESE PARAMETERS MAY REQUIRE TUNING FOR A GIVEN VERSION
1552: * THE VALUES GIVEN IN COMMENTS HAVE BEEN SUCCESSFULLY USED.
1553: *
1554: * E$SRS IS THE NUMBER OF WORDS TO RESERVE AT THE END OF
1555: * STORAGE FOR END OF RUN PROCESSING. IT SHOULD BE
1556: * SET AS SMALL AS POSSIBLE WITHOUT CAUSING MEMORY OVERFLOW
1557: * IN CRITICAL SITUATIONS (E.G. MEMORY OVERFLOW TERMINATION)
1558: * AND SHOULD THUS RESERVE SUFFICIENT SPACE AT LEAST FOR
1559: * AN SCBLK CONTAINING SAY 30 CHARACTERS.
1560: *
1561: {E$SRS{EQU{*{{{30 WORDS
1562: *
1563: * E$STS IS THE NUMBER OF WORDS GRABBED IN A CHUNK WHEN
1564: * STORAGE IS ALLOCATED IN THE STATIC REGION. THE MINIMUM
1565: * PERMITTED VALUE IS 256/CFP$B. LARGER VALUES WILL LEAD
1566: * TO INCREASED EFFICIENCY AT THE COST OF WASTING MEMORY.
1567: *
1568: {E$STS{EQU{*{{{500 WORDS
1569: *
1570: * E$CBS IS THE SIZE OF CODE BLOCK ALLOCATED INITIALLY AND
1571: * THE EXPANSION INCREMENT IF OVERFLOW OCCURS. IF THIS VALUE
1572: * IS TOO SMALL OR TOO LARGE, EXCESSIVE GARBAGE COLLECTIONS
1573: * WILL OCCUR DURING COMPILATION AND MEMORY MAY BE LOST
1574: * IN THE CASE OF A TOO LARGE VALUE.
1575: *
1576: {E$CBS{EQU{*{{{500 WORDS
1577: *
1578: * E$HNB IS THE NUMBER OF BUCKET HEADERS IN THE VARIABLE
1579: * HASH TABLE. IT SHOULD ALWAYS BE ODD. LARGER VALUES WILL
1580: * SPEED UP COMPILATION AND INDIRECT REFERENCES AT THE
1581: * EXPENSE OF ADDITIONAL STORAGE FOR THE HASH TABLE ITSELF.
1582: *
1583: {E$HNB{EQU{*{{{127 BUCKET HEADERS
1584: *
1585: * E$HNW IS THE MAXIMUM NUMBER OF WORDS OF A STRING
1586: * NAME WHICH PARTICIPATE IN THE STRING HASH ALGORITHM.
1587: * LARGER VALUES GIVE A BETTER HASH AT THE EXPENSE OF TAKING
1588: * LONGER TO COMPUTE THE HASH. THERE IS SOME OPTIMAL VALUE.
1589: *
1590: {E$HNW{EQU{*{{{6 WORDS
1591: *
1592: * E$FSP . IF THE AMOUNT OF FREE SPACE LEFT AFTER A GARBAGE
1593: * COLLECTION IS SMALL COMPARED TO THE TOTAL AMOUNT OF SPACE
1594: * IN USE GARBAGE COLLECTOR THRASHING IS LIKELY TO OCCUR AS
1595: * THIS SPACE IS USED UP. E$FSP IS A MEASURE OF THE
1596: * MINIMUM PERCENTAGE OF DYNAMIC MEMORY LEFT AS FREE SPACE
1597: * BEFORE THE SYSTEM ROUTINE SYSMM IS CALLED TO TRY TO
1598: * OBTAIN MORE MEMORY.
1599: *
1600: {E$FSP{EQU{*{{{15 PERCENT
1601: {{EJC{{{{
1602: *
1603: * DEFINITIONS OF CODES FOR LETTERS
1604: *
1605: {CH$LA{EQU{*{{{LETTER A
1606: {CH$LB{EQU{*{{{LETTER B
1607: {CH$LC{EQU{*{{{LETTER C
1608: {CH$LD{EQU{*{{{LETTER D
1609: {CH$LE{EQU{*{{{LETTER E
1610: {CH$LF{EQU{*{{{LETTER F
1611: {CH$LG{EQU{*{{{LETTER G
1612: {CH$LH{EQU{*{{{LETTER H
1613: {CH$LI{EQU{*{{{LETTER I
1614: {CH$LJ{EQU{*{{{LETTER J
1615: {CH$LK{EQU{*{{{LETTER K
1616: {CH$LL{EQU{*{{{LETTER L
1617: {CH$LM{EQU{*{{{LETTER M
1618: {CH$LN{EQU{*{{{LETTER N
1619: {CH$LO{EQU{*{{{LETTER O
1620: {CH$LP{EQU{*{{{LETTER P
1621: {CH$LQ{EQU{*{{{LETTER Q
1622: {CH$LR{EQU{*{{{LETTER R
1623: {CH$LS{EQU{*{{{LETTER S
1624: {CH$LT{EQU{*{{{LETTER T
1625: {CH$LU{EQU{*{{{LETTER U
1626: {CH$LV{EQU{*{{{LETTER V
1627: {CH$LW{EQU{*{{{LETTER W
1628: {CH$LX{EQU{*{{{LETTER X
1629: {CH$LY{EQU{*{{{LETTER Y
1630: {CH$L${EQU{*{{{LETTER Z
1631: *
1632: * DEFINITIONS OF CODES FOR DIGITS
1633: *
1634: {CH$D0{EQU{*{{{DIGIT 0
1635: {CH$D1{EQU{*{{{DIGIT 1
1636: {CH$D2{EQU{*{{{DIGIT 2
1637: {CH$D3{EQU{*{{{DIGIT 3
1638: {CH$D4{EQU{*{{{DIGIT 4
1639: {CH$D5{EQU{*{{{DIGIT 5
1640: {CH$D6{EQU{*{{{DIGIT 6
1641: {CH$D7{EQU{*{{{DIGIT 7
1642: {CH$D8{EQU{*{{{DIGIT 8
1643: {CH$D9{EQU{*{{{DIGIT 9
1644: {{EJC{{{{
1645: *
1646: * DEFINITIONS OF CODES FOR SPECIAL CHARACTERS
1647: *
1648: * THE NAMES OF THESE CHARACTERS ARE RELATED TO THEIR
1649: * ORIGINAL REPRESENTATION IN THE EBCDIC SET CORRESPONDING
1650: * TO THE DESCRIPTION IN STANDARD SNOBOL4 MANUALS AND TEXTS.
1651: *
1652: {CH$AM{EQU{*{{{KEYWORD OPERATOR (AMPERSAND)
1653: {CH$AS{EQU{*{{{MULTIPLICATION SYMBOL (ASTERISK)
1654: {CH$AT{EQU{*{{{CURSOR POSITION OPERATOR (AT)
1655: {CH$BB{EQU{*{{{LEFT ARRAY BRACKET (LESS THAN)
1656: {CH$BL{EQU{*{{{BLANK
1657: {CH$BR{EQU{*{{{ALTERNATION OPERATOR (VERTICAL BAR)
1658: {CH$CL{EQU{*{{{GOTO SYMBOL (COLON)
1659: {CH$CM{EQU{*{{{COMMA
1660: {CH$DL{EQU{*{{{INDIRECTION OPERATOR (DOLLAR)
1661: {CH$DT{EQU{*{{{NAME OPERATOR (DOT)
1662: {CH$DQ{EQU{*{{{DOUBLE QUOTE
1663: {CH$EQ{EQU{*{{{EQUAL SIGN
1664: {CH$EX{EQU{*{{{EXPONENTIATION OPERATOR (EXCLM)
1665: {CH$MN{EQU{*{{{MINUS SIGN
1666: {CH$NM{EQU{*{{{NUMBER SIGN
1667: {CH$NT{EQU{*{{{NEGATION OPERATOR (NOT)
1668: {CH$PC{EQU{*{{{PERCENT
1669: {CH$PL{EQU{*{{{PLUS SIGN
1670: {CH$PP{EQU{*{{{LEFT PARENTHESIS
1671: {CH$RB{EQU{*{{{RIGHT ARRAY BRACKET (GRTR THAN)
1672: {CH$RP{EQU{*{{{RIGHT PARENTHESIS
1673: {CH$QU{EQU{*{{{INTERROGATION OPERATOR (QUESTION)
1674: {CH$SL{EQU{*{{{SLASH
1675: {CH$SM{EQU{*{{{SEMICOLON
1676: {CH$SQ{EQU{*{{{SINGLE QUOTE
1677: {CH$UN{EQU{*{{{SPECIAL IDENTIFIER CHAR (UNDERLINE)
1678: {CH$OB{EQU{*{{{OPENING BRACKET
1679: {CH$CB{EQU{*{{{CLOSING BRACKET
1680: {{EJC{{{{
1681: *
1682: * REMAINING CHARS ARE OPTIONAL ADDITIONS TO THE STANDARDS.
1683: *
1684: * TAB CHARACTERS - SYNTACTICALLY EQUIVALENT TO BLANK
1685: *
1686: {CH$HT{EQU{*{{{HORIZONTAL TAB
1687: *
1688: * LOWER CASE OR SHIFTED CASE ALPHABETIC CHARS
1689: *
1690: {CH$$A{EQU{*{{{SHIFTED A
1691: {CH$$B{EQU{*{{{SHIFTED B
1692: {CH$$C{EQU{*{{{SHIFTED C
1693: {CH$$D{EQU{*{{{SHIFTED D
1694: {CH$$E{EQU{*{{{SHIFTED E
1695: {CH$$F{EQU{*{{{SHIFTED F
1696: {CH$$G{EQU{*{{{SHIFTED G
1697: {CH$$H{EQU{*{{{SHIFTED H
1698: {CH$$I{EQU{*{{{SHIFTED I
1699: {CH$$J{EQU{*{{{SHIFTED J
1700: {CH$$K{EQU{*{{{SHIFTED K
1701: {CH$$L{EQU{*{{{SHIFTED L
1702: {CH$$M{EQU{*{{{SHIFTED M
1703: {CH$$N{EQU{*{{{SHIFTED N
1704: {CH$$O{EQU{*{{{SHIFTED O
1705: {CH$$P{EQU{*{{{SHIFTED P
1706: {CH$$Q{EQU{*{{{SHIFTED Q
1707: {CH$$R{EQU{*{{{SHIFTED R
1708: {CH$$S{EQU{*{{{SHIFTED S
1709: {CH$$T{EQU{*{{{SHIFTED T
1710: {CH$$U{EQU{*{{{SHIFTED U
1711: {CH$$V{EQU{*{{{SHIFTED V
1712: {CH$$W{EQU{*{{{SHIFTED W
1713: {CH$$X{EQU{*{{{SHIFTED X
1714: {CH$$Y{EQU{*{{{SHIFTED Y
1715: {CH$$${EQU{*{{{SHIFTED Z
1716: * IF A DELIMITER OTHER THAN CH$CM MUST BE USED IN
1717: * THE THIRD ARGUMENT OF INPUT(),OUTPUT() THEN .CIOD SHOULD
1718: * BE DEFINED AND A PARAMETER SUPPLIED FOR IODEL.
1719: *
1720: {IODEL{EQU{*{{{
1721: {{EJC{{{{
1722: *
1723: * DATA BLOCK FORMATS AND DEFINITIONS
1724: *
1725: * THE FOLLOWING SECTIONS DESCRIBE THE DETAILED FORMAT OF
1726: * ALL POSSIBLE DATA BLOCKS IN STATIC AND DYNAMIC MEMORY.
1727: *
1728: * EVERY BLOCK HAS A NAME OF THE FORM XXBLK WHERE XX IS A
1729: * UNIQUE TWO CHARACTER IDENTIFIER. THE FIRST WORD OF EVERY
1730: * BLOCK MUST CONTAIN A POINTER TO A PROGRAM LOCATION IN THE
1731: * INTERPRETOR WHICH IS IMMEDIATELY PRECEDED BY AN ADDRESS
1732: * CONSTANT CONTAINING THE VALUE BL$XX WHERE XX IS THE BLOCK
1733: * IDENTIFIER. THIS PROVIDES A UNIFORM MECHANISM FOR
1734: * DISTINGUISHING BETWEEN THE VARIOUS BLOCK TYPES.
1735: *
1736: * IN SOME CASES, THE CONTENTS OF THE FIRST WORD IS CONSTANT
1737: * FOR A GIVEN BLOCK TYPE AND MERELY SERVES AS A POINTER
1738: * TO THE IDENTIFYING ADDRESS CONSTANT. HOWEVER, IN OTHER
1739: * CASES THERE ARE SEVERAL POSSIBILITIES FOR THE FIRST
1740: * WORD IN WHICH CASE EACH OF THE SEVERAL PROGRAM ENTRY
1741: * POINTS MUST BE PRECEDED BY THE APPROPRIATE CONSTANT.
1742: *
1743: * IN EACH BLOCK, SOME OF THE FIELDS ARE RELOCATABLE. THIS
1744: * MEANS THAT THEY MAY CONTAIN A POINTER TO ANOTHER BLOCK
1745: * IN THE DYNAMIC AREA. (TO BE MORE PRECISE, IF THEY CONTAIN
1746: * A POINTER WITHIN THE DYNAMIC AREA, THEN IT IS A POINTER
1747: * TO A BLOCK). SUCH FIELDS MUST BE MODIFIED BY THE GARBAGE
1748: * COLLECTOR (PROCEDURE GBCOL) WHENEVER BLOCKS ARE COMPACTED
1749: * IN THE DYNAMIC REGION. THE GARBAGE COLLECTOR (ACTUALLY
1750: * PROCEDURE GBCPF) REQUIRES THAT ALL SUCH RELOCATABLE
1751: * FIELDS IN A BLOCK MUST BE CONTIGUOUS.
1752: {{EJC{{{{
1753: *
1754: * THE DESCRIPTION FORMAT USES THE FOLLOWING SCHEME.
1755: *
1756: * 1) BLOCK TITLE AND TWO CHARACTER IDENTIFIER
1757: *
1758: * 2) DESCRIPTION OF BASIC USE OF BLOCK AND INDICATION
1759: * OF CIRCUMSTANCES UNDER WHICH IT IS CONSTRUCTED.
1760: *
1761: * 3) PICTURE OF THE BLOCK FORMAT. IN THESE PICTURES LOW
1762: * MEMORY ADDRESSES ARE AT THE TOP OF THE PAGE. FIXED
1763: * LENGTH FIELDS ARE SURROUNDED BY I (LETTER I). FIELDS
1764: * WHICH ARE FIXED LENGTH BUT WHOSE LENGTH IS DEPENDENT
1765: * ON A CONFIGURATION PARAMETER ARE SURROUNDED BY *
1766: * (ASTERISK). VARIABLE LENGTH FIELDS ARE SURROUNDED
1767: * BY / (SLASH).
1768: *
1769: * 4) DEFINITION OF SYMBOLIC OFFSETS TO FIELDS IN
1770: * BLOCK AND OF THE SIZE OF THE BLOCK IF FIXED LENGTH
1771: * OR OF THE SIZE OF THE FIXED LENGTH FIELDS IF THE
1772: * BLOCK IS VARIABLE LENGTH.
1773: * NOTE THAT SOME ROUTINES SUCH AS GBCPF ASSUME
1774: * CERTAIN OFFSETS ARE EQUAL. THE DEFINITIONS
1775: * GIVEN HERE ENFORCE THIS. MAKE CHANGES TO
1776: * THEM ONLY WITH DUE CARE.
1777: *
1778: * DEFINITIONS OF COMMON OFFSETS
1779: *
1780: {OFFS1{EQU{1{{{
1781: {OFFS2{EQU{2{{{
1782: {OFFS3{EQU{3{{{
1783: *
1784: * 5) DETAILED COMMENTS ON THE SIGNIFICANCE AND FORMATS
1785: * OF THE VARIOUS FIELDS.
1786: *
1787: * THE ORDER IS ALPHABETICAL BY IDENTIFICATION CODE.
1788: {{EJC{{{{
1789: *
1790: * DEFINITIONS OF BLOCK CODES
1791: *
1792: * THIS TABLE PROVIDES A UNIQUE IDENTIFICATION CODE FOR
1793: * EACH SEPARATE BLOCK TYPE. THE FIRST WORD OF A BLOCK IN
1794: * THE DYNAMIC AREA ALWAYS CONTAINS THE ADDRESS OF A PROGRAM
1795: * ENTRY POINT. THE BLOCK CODE IS USED AS THE ENTRY POINT ID
1796: * THE ORDER OF THESE CODES DICTATES THE ORDER OF THE TABLE
1797: * USED BY THE DATATYPE FUNCTION (SCNMT IN THE CONSTANT SEC)
1798: *
1799: * BLOCK CODES FOR ACCESSIBLE DATATYPES
1800: *
1801: {BL$AR{EQU{0{{{ARBLK ARRAY
1802: {BL$BC{EQU{BL$AR+1{{{BCBLK BUFFER
1803: {BL$CD{EQU{BL$BC+1{{{CDBLK CODE
1804: {BL$EX{EQU{BL$CD+1{{{EXBLK EXPRESSION
1805: {BL$IC{EQU{BL$EX+1{{{ICBLK INTEGER
1806: {BL$NM{EQU{BL$IC+1{{{NMBLK NAME
1807: {BL$P0{EQU{BL$NM+1{{{P0BLK PATTERN
1808: {BL$P1{EQU{BL$P0+1{{{P1BLK PATTERN
1809: {BL$P2{EQU{BL$P1+1{{{P2BLK PATTERN
1810: {BL$RC{EQU{BL$P2+1{{{RCBLK REAL
1811: {BL$SC{EQU{BL$RC+1{{{SCBLK STRING
1812: {BL$SE{EQU{BL$SC+1{{{SEBLK EXPRESSION
1813: {BL$TB{EQU{BL$SE+1{{{TBBLK TABLE
1814: {BL$VC{EQU{BL$TB+1{{{VCBLK ARRAY
1815: {BL$XN{EQU{BL$VC+1{{{XNBLK EXTERNAL
1816: {BL$XR{EQU{BL$XN+1{{{XRBLK EXTERNAL
1817: {BL$PD{EQU{BL$XR+1{{{PDBLK PROGRAM DEFINED DATATYPE
1818: *
1819: {BL$$D{EQU{BL$PD+1{{{NUMBER OF BLOCK CODES FOR DATA
1820: *
1821: * OTHER BLOCK CODES
1822: *
1823: {BL$TR{EQU{BL$PD+1{{{TRBLK
1824: {BL$BF{EQU{BL$TR+1{{{BFBLK
1825: {BL$CC{EQU{BL$BF+1{{{CCBLK
1826: {BL$CM{EQU{BL$CC+1{{{CMBLK
1827: {BL$CT{EQU{BL$CM+1{{{CTBLK
1828: {BL$DF{EQU{BL$CT+1{{{DFBLK
1829: {BL$EF{EQU{BL$DF+1{{{EFBLK
1830: {BL$EV{EQU{BL$EF+1{{{EVBLK
1831: {BL$FF{EQU{BL$EV+1{{{FFBLK
1832: {BL$KV{EQU{BL$FF+1{{{KVBLK
1833: {BL$PF{EQU{BL$KV+1{{{PFBLK
1834: {BL$TE{EQU{BL$PF+1{{{TEBLK
1835: *
1836: {BL$$I{EQU{0{{{DEFAULT IDENTIFICATION CODE
1837: {BL$$T{EQU{BL$TR+1{{{CODE FOR DATA OR TRACE BLOCK
1838: {BL$$${EQU{BL$TE+1{{{NUMBER OF BLOCK CODES
1839: {{EJC{{{{
1840: *
1841: * FIELD REFERENCES
1842: *
1843: * REFERENCES TO THE FIELDS OF DATA BLOCKS ARE SYMBOLIC
1844: * (I.E. USE THE SYMBOLIC OFFSETS) WITH THE FOLLOWING
1845: * EXCEPTIONS.
1846: *
1847: * 1) REFERENCES TO THE FIRST WORD ARE USUALLY NOT
1848: * SYMBOLIC SINCE THEY USE THE (X) OPERAND FORMAT.
1849: *
1850: * 2) THE CODE WHICH CONSTRUCTS A BLOCK IS OFTEN NOT
1851: * SYMBOLIC AND SHOULD BE CHANGED IF THE CORRESPONDING
1852: * BLOCK FORMAT IS MODIFIED.
1853: *
1854: * 3) THE PLC AND PSC INSTRUCTIONS IMPLY AN OFFSET
1855: * CORRESPONDING TO THE DEFINITION OF CFP$F.
1856: *
1857: * 4) THERE ARE NON-SYMBOLIC REFERENCES (EASILY CHANGED)
1858: * IN THE GARBAGE COLLECTOR (PROCEDURES GBCPF, BLKLN).
1859: *
1860: * 5) THE FIELDS IDVAL, FARGS APPEAR IN SEVERAL BLOCKS
1861: * AND ANY CHANGES MUST BE MADE IN PARALLEL TO ALL
1862: * BLOCKS CONTAINING THE FIELDS. THE ACTUAL REFERENCES
1863: * TO THESE FIELDS ARE SYMBOLIC WITH THE ABOVE
1864: * LISTED EXCEPTIONS.
1865: *
1866: * 6) SEVERAL SPOTS IN THE CODE ASSUME THAT THE
1867: * DEFINITIONS OF THE FIELDS VRVAL, TEVAL, TRNXT ARE
1868: * THE SAME (THESE ARE SECTIONS OF CODE WHICH SEARCH
1869: * OUT ALONG A TRBLK CHAIN FROM A VARIABLE).
1870: *
1871: * 7) REFERENCES TO THE FIELDS OF AN ARRAY BLOCK IN THE
1872: * ARRAY REFERENCE ROUTINE ARREF ARE NON-SYMBOLIC.
1873: *
1874: * APART FROM THE EXCEPTIONS LISTED, REFERENCES ARE SYMBOLIC
1875: * AS FAR AS POSSIBLE AND MODIFYING THE ORDER OR NUMBER
1876: * OF FIELDS WILL NOT REQUIRE CHANGES.
1877: {{EJC{{{{
1878: *
1879: * COMMON FIELDS FOR FUNCTION BLOCKS
1880: *
1881: * BLOCKS WHICH REPRESENT CALLABLE FUNCTIONS HAVE TWO
1882: * COMMON FIELDS AT THE START OF THE BLOCK AS FOLLOWS.
1883: *
1884: * +------------------------------------+
1885: * I FCODE I
1886: * +------------------------------------+
1887: * I FARGS I
1888: * +------------------------------------+
1889: * / /
1890: * / REST OF FUNCTION BLOCK /
1891: * / /
1892: * +------------------------------------+
1893: *
1894: {FCODE{EQU{0{{{POINTER TO CODE FOR FUNCTION
1895: {FARGS{EQU{1{{{NUMBER OF ARGUMENTS
1896: *
1897: * FCODE IS A POINTER TO THE LOCATION IN THE INTERPRETOR
1898: * PROGRAM WHICH PROCESSES THIS TYPE OF FUNCTION CALL.
1899: *
1900: * FARGS IS THE EXPECTED NUMBER OF ARGUMENTS. THE ACTUAL
1901: * NUMBER OF ARGUMENTS IS ADJUSTED TO THIS AMOUNT BY
1902: * DELETING EXTRA ARGUMENTS OR SUPPLYING TRAILING NULLS
1903: * FOR MISSING ONES BEFORE TRANSFERRING THOUGH FCODE.
1904: * A VALUE OF 999 MAY BE USED IN THIS FIELD TO INDICATE A
1905: * VARIABLE NUMBER OF ARGUMENTS (SEE SVBLK FIELD SVNAR).
1906: *
1907: * THE BLOCK TYPES WHICH FOLLOW THIS SCHEME ARE.
1908: *
1909: * FFBLK FIELD FUNCTION
1910: * DFBLK DATATYPE FUNCTION
1911: * PFBLK PROGRAM DEFINED FUNCTION
1912: * EFBLK EXTERNAL LOADED FUNCTION
1913: {{EJC{{{{
1914: *
1915: * IDENTIFICATION FIELD
1916: *
1917: *
1918: * ID FIELD
1919: *
1920: * CERTAIN PROGRAM ACCESSIBLE OBJECTS (THOSE WHICH CONTAIN
1921: * OTHER DATA VALUES AND CAN BE COPIED) ARE GIVEN A UNIQUE
1922: * IDENTIFICATION NUMBER (SEE EXSID). THIS ID VALUE IS AN
1923: * ADDRESS INTEGER VALUE WHICH IS ALWAYS STORED IN WORD TWO.
1924: *
1925: {IDVAL{EQU{1{{{ID VALUE FIELD
1926: *
1927: * THE BLOCKS CONTAINING AN IDVAL FIELD ARE.
1928: *
1929: * ARBLK ARRAY
1930: * BCBLK BUFFER CONTROL BLOCK
1931: * PDBLK PROGRAM DEFINED DATATYPE
1932: * TBBLK TABLE
1933: * VCBLK VECTOR BLOCK (ARRAY)
1934: *
1935: * NOTE THAT A ZERO IDVAL MEANS THAT THE BLOCK IS ONLY
1936: * HALF BUILT AND SHOULD NOT BE DUMPED (SEE DUMPR).
1937: {{EJC{{{{
1938: *
1939: * ARRAY BLOCK (ARBLK)
1940: *
1941: * AN ARRAY BLOCK REPRESENTS AN ARRAY VALUE OTHER THAN ONE
1942: * WITH ONE DIMENSION WHOSE LOWER BOUND IS ONE (SEE VCBLK).
1943: * AN ARBLK IS BUILT WITH A CALL TO THE FUNCTIONS CONVERT
1944: * (S$CNV) OR ARRAY (S$ARR).
1945: *
1946: * +------------------------------------+
1947: * I ARTYP I
1948: * +------------------------------------+
1949: * I IDVAL I
1950: * +------------------------------------+
1951: * I ARLEN I
1952: * +------------------------------------+
1953: * I AROFS I
1954: * +------------------------------------+
1955: * I ARNDM I
1956: * +------------------------------------+
1957: * * ARLBD *
1958: * +------------------------------------+
1959: * * ARDIM *
1960: * +------------------------------------+
1961: * * *
1962: * * ABOVE 2 FLDS REPEATED FOR EACH DIM *
1963: * * *
1964: * +------------------------------------+
1965: * I ARPRO I
1966: * +------------------------------------+
1967: * / /
1968: * / ARVLS /
1969: * / /
1970: * +------------------------------------+
1971: {{EJC{{{{
1972: *
1973: * ARRAY BLOCK (CONTINUED)
1974: *
1975: {ARTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$ART
1976: {ARLEN{EQU{IDVAL+1{{{LENGTH OF ARBLK IN BYTES
1977: {AROFS{EQU{ARLEN+1{{{OFFSET IN ARBLK TO ARPRO FIELD
1978: {ARNDM{EQU{AROFS+1{{{NUMBER OF DIMENSIONS
1979: {ARLBD{EQU{ARNDM+1{{{LOW BOUND (FIRST SUBSCRIPT)
1980: {ARDIM{EQU{ARLBD+CFP$I{{{DIMENSION (FIRST SUBSCRIPT)
1981: {ARLB2{EQU{ARDIM+CFP$I{{{LOW BOUND (SECOND SUBSCRIPT)
1982: {ARDM2{EQU{ARLB2+CFP$I{{{DIMENSION (SECOND SUBSCRIPT)
1983: {ARPRO{EQU{ARDIM+CFP$I{{{ARRAY PROTOTYPE (ONE DIMENSION)
1984: {ARVLS{EQU{ARPRO+1{{{START OF VALUES (ONE DIMENSION)
1985: {ARPR2{EQU{ARDM2+CFP$I{{{ARRAY PROTOTYPE (TWO DIMENSIONS)
1986: {ARVL2{EQU{ARPR2+1{{{START OF VALUES (TWO DIMENSIONS)
1987: {ARSI${EQU{ARLBD{{{NUMBER OF STANDARD FIELDS IN BLOCK
1988: {ARDMS{EQU{ARLB2-ARLBD{{{SIZE OF INFO FOR ONE SET OF BOUNDS
1989: *
1990: * THE BOUNDS AND DIMENSION FIELDS ARE SIGNED INTEGER
1991: * VALUES AND EACH OCCUPY CFP$I WORDS IN THE ARBLK.
1992: *
1993: * THE LENGTH OF AN ARBLK IN BYTES MAY NOT EXCEED MXLEN.
1994: * THIS IS REQUIRED TO KEEP NAME OFFSETS GARBAGE COLLECTABLE
1995: *
1996: * THE ACTUAL VALUES ARE ARRANGED IN ROW-WISE ORDER AND
1997: * CAN CONTAIN A DATA POINTER OR A POINTER TO A TRBLK.
1998: *
1999: * BUFFER CONTROL BLOCK (BCBLK)
2000: *
2001: * A BCBLK IS BUILT FOR EVERY BFBLK.
2002: *
2003: * +------------------------------------+
2004: * I BCTYP I
2005: * +------------------------------------+
2006: * I IDVAL I
2007: * +------------------------------------+
2008: * I BCLEN I
2009: * +------------------------------------+
2010: * I BCBUF I
2011: * +------------------------------------+
2012: *
2013: {BCTYP{EQU{0{{{PTR TO DUMMY ROUTINE B$BCT
2014: {BCLEN{EQU{IDVAL+1{{{DEFINED BUFFER LENGTH
2015: {BCBUF{EQU{BCLEN+1{{{PTR TO BFBLK
2016: {BCSI${EQU{BCBUF+1{{{SIZE OF BCBLK
2017: *
2018: * A BCBLK IS AN INDIRECT CONTROL HEADER FOR BFBLK.
2019: * THE REASON FOR NOT STORING THIS DATA DIRECTLY
2020: * IN THE RELATED BFBLK IS SO THAT THE BFBLK CAN
2021: * MAINTAIN THE SAME SKELETAL STRUCTURE AS AN SCBLK
2022: * THUS FACILITATING TRANSPARENT STRING OPERATIONS
2023: * (FOR THE MOST PART). SPECIFICALLY, CFP$F IS THE
2024: * SAME FOR A BFBLK AS FOR AN SCBLK. BY CONVENTION,
2025: * WHEREEVER A BUFFER VALUE IS EMPLOYED, THE BCBLK
2026: * IS POINTED TO.
2027: *
2028: * THE CORRESPONDING BFBLK IS POINTED TO BY THE
2029: * BCBUF POINTER IN THE BCBLK.
2030: *
2031: * BCLEN IS THE CURRENT DEFINED SIZE OF THE CHARACTER
2032: * ARRAY IN THE BFBLK. CHARACTERS FOLLOWING THE OFFSET
2033: * OF BCLEN ARE UNDEFINED.
2034: *
2035: {{EJC{{{{
2036: *
2037: * STRING BUFFER BLOCK (BFBLK)
2038: *
2039: * A BFBLK IS BUILT BY A CALL TO BUFFER(...)
2040: *
2041: * +------------------------------------+
2042: * I BFTYP I
2043: * +------------------------------------+
2044: * I BFALC I
2045: * +------------------------------------+
2046: * / /
2047: * / BFCHR /
2048: * / /
2049: * +------------------------------------+
2050: *
2051: {BFTYP{EQU{0{{{PTR TO DUMMY ROUTINE B$BFT
2052: {BFALC{EQU{BFTYP+1{{{ALLOCATED SIZE OF BUFFER
2053: {BFCHR{EQU{BFALC+1{{{CHARACTERS OF STRING
2054: {BFSI${EQU{BFCHR{{{SIZE OF STANDARD FIELDS IN BFBLK
2055: *
2056: * THE CHARACTERS IN THE BUFFER ARE STORED LEFT JUSTIFIED.
2057: * THE FINAL WORD OF DEFINED CHARACTERS IS ALWAYS ZERO
2058: * (CHARACTER) PADDED. ANY TRAILING ALLOCATION PAST THE
2059: * WORD CONTAINING THE LAST CHARACTER CONTAINS
2060: * UNPREDICTABLE CONTENTS AND IS NEVER REFERENCED.
2061: *
2062: * NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING
2063: * IS GIVEN BY CFP$F, AS WITH AN SCBLK. HOWEVER, THE
2064: * OFFSET WHICH IS OCCUPIED BY THE LENGTH FOR AN SCBLK
2065: * IS THE TOTAL CHAR SPACE FOR BFBLKS, AND ROUTINES WHICH
2066: * DEAL WITH BOTH MUST ACCOUNT FOR THIS DIFFERENCE.
2067: *
2068: * THE VALUE OF BFALC MAY NOT EXCEED MXLEN. THE VALUE OF
2069: * BCLEN IS ALWAYS LESS THAN OR EQUAL TO BFALC.
2070: *
2071: {{EJC{{{{
2072: *
2073: * CODE CONSTRUCTION BLOCK (CCBLK)
2074: *
2075: * AT ANY ONE MOMENT THERE IS AT MOST ONE CCBLK INTO
2076: * WHICH THE COMPILER IS CURRENTLY STORING CODE (CDWRD).
2077: *
2078: * +------------------------------------+
2079: * I CCTYP I
2080: * +------------------------------------+
2081: * I CCLEN I
2082: * +------------------------------------+
2083: * I CCUSE I
2084: * +------------------------------------+
2085: * / /
2086: * / CCCOD /
2087: * / /
2088: * +------------------------------------+
2089: *
2090: {CCTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$CCT
2091: {CCLEN{EQU{CCTYP+1{{{LENGTH OF CCBLK IN BYTES
2092: {CCUSE{EQU{CCLEN+1{{{OFFSET PAST LAST USED WORD (BYTES)
2093: {CCCOD{EQU{CCUSE+1{{{START OF GENERATED CODE IN BLOCK
2094: *
2095: * THE REASON THAT THE CCBLK IS A SEPARATE BLOCK TYPE FROM
2096: * THE USUAL CDBLK IS THAT THE GARBAGE COLLECTOR MUST
2097: * ONLY PROCESS THOSE FIELDS WHICH HAVE BEEN SET (SEE GBCPF)
2098: {{EJC{{{{
2099: *
2100: * CODE BLOCK (CDBLK)
2101: *
2102: * A CODE BLOCK IS BUILT FOR EACH STATEMENT COMPILED DURING
2103: * THE INITIAL COMPILATION OR BY SUBSEQUENT CALLS TO CODE.
2104: *
2105: * +------------------------------------+
2106: * I CDJMP I
2107: * +------------------------------------+
2108: * I CDSTM I
2109: * +------------------------------------+
2110: * I CDLEN I
2111: * +------------------------------------+
2112: * I CDFAL I
2113: * +------------------------------------+
2114: * / /
2115: * / CDCOD /
2116: * / /
2117: * +------------------------------------+
2118: *
2119: {CDJMP{EQU{0{{{PTR TO ROUTINE TO EXECUTE STATEMENT
2120: {CDSTM{EQU{CDJMP+1{{{STATEMENT NUMBER
2121: {CDLEN{EQU{OFFS2{{{LENGTH OF CDBLK IN BYTES
2122: {CDFAL{EQU{OFFS3{{{FAILURE EXIT (SEE BELOW)
2123: {CDCOD{EQU{CDFAL+1{{{EXECUTABLE PSEUDO-CODE
2124: {CDSI${EQU{CDCOD{{{NUMBER OF STANDARD FIELDS IN CDBLK
2125: *
2126: * CDSTM IS THE STATEMENT NUMBER OF THE CURRENT STATEMENT.
2127: *
2128: * CDJMP, CDFAL ARE SET AS FOLLOWS.
2129: *
2130: * 1) IF THE FAILURE EXIT IS THE NEXT STATEMENT
2131: *
2132: * CDJMP = B$CDS
2133: * CDFAL = PTR TO CDBLK FOR NEXT STATEMENT
2134: *
2135: * 2) IF THE FAILURE EXIT IS A SIMPLE LABEL NAME
2136: *
2137: * CDJMP = B$CDS
2138: * CDFAL IS A PTR TO THE VRTRA FIELD OF THE VRBLK
2139: *
2140: * 3) IF THERE IS NO FAILURE EXIT (-NOFAIL MODE)
2141: *
2142: * CDJMP = B$CDS
2143: * CDFAL = O$UNF
2144: *
2145: * 4) IF THE FAILURE EXIT IS COMPLEX OR DIRECT
2146: *
2147: * CDJMP = B$CDC
2148: * CDFAL IS THE OFFSET TO THE O$GOF WORD
2149: {{EJC{{{{
2150: *
2151: * CODE BLOCK (CONTINUED)
2152: *
2153: * CDCOD IS THE START OF THE ACTUAL CODE. FIRST WE DESCRIBE
2154: * THE CODE GENERATED FOR AN EXPRESSION. IN AN EXPRESSION,
2155: * ELEMENTS ARE FETCHED BY NAME OR BY VALUE. FOR EXAMPLE,
2156: * THE BINARY EQUAL OPERATOR FETCHES ITS LEFT ARGUMENT
2157: * BY NAME AND ITS RIGHT ARGUMENT BY VALUE. THESE TWO
2158: * CASES GENERATE QUITE DIFFERENT CODE AND ARE DESCRIBED
2159: * SEPARATELY. FIRST WE CONSIDER THE CODE BY VALUE CASE.
2160: *
2161: * GENERATION OF CODE BY VALUE FOR EXPRESSIONS ELEMENTS.
2162: *
2163: * EXPRESSION POINTER TO EXBLK OR SEBLK
2164: *
2165: * INTEGER CONSTANT POINTER TO ICBLK
2166: *
2167: * NULL CONSTANT POINTER TO NULLS
2168: *
2169: * PATTERN (RESULTING FROM PREEVALUATION)
2170: * =O$LPT
2171: * POINTER TO P0BLK,P1BLK OR P2BLK
2172: *
2173: * REAL CONSTANT POINTER TO RCBLK
2174: *
2175: * STRING CONSTANT POINTER TO SCBLK
2176: *
2177: * VARIABLE POINTER TO VRGET FIELD OF VRBLK
2178: *
2179: * ADDITION VALUE CODE FOR LEFT OPERAND
2180: * VALUE CODE FOR RIGHT OPERAND
2181: * =O$ADD
2182: *
2183: * AFFIRMATION VALUE CODE FOR OPERAND
2184: * =O$AFF
2185: *
2186: * ALTERNATION VALUE CODE FOR LEFT OPERAND
2187: * VALUE CODE FOR RIGHT OPERAND
2188: * =O$ALT
2189: *
2190: * ARRAY REFERENCE (CASE OF ONE SUBSCRIPT)
2191: * VALUE CODE FOR ARRAY OPERAND
2192: * VALUE CODE FOR SUBSCRIPT OPERAND
2193: * =O$AOV
2194: *
2195: * (CASE OF MORE THAN ONE SUBSCRIPT)
2196: * VALUE CODE FOR ARRAY OPERAND
2197: * VALUE CODE FOR FIRST SUBSCRIPT
2198: * VALUE CODE FOR SECOND SUBSCRIPT
2199: * ...
2200: * VALUE CODE FOR LAST SUBSCRIPT
2201: * =O$AMV
2202: * NUMBER OF SUBSCRIPTS
2203: {{EJC{{{{
2204: *
2205: * CODE BLOCK (CONTINUED)
2206: *
2207: * ASSIGNMENT (TO NATURAL VARIABLE)
2208: * VALUE CODE FOR RIGHT OPERAND
2209: * POINTER TO VRSTO FIELD OF VRBLK
2210: *
2211: * (TO ANY OTHER VARIABLE)
2212: * NAME CODE FOR LEFT OPERAND
2213: * VALUE CODE FOR RIGHT OPERAND
2214: * =O$ASS
2215: *
2216: * COMPILE ERROR =O$CER
2217: *
2218: *
2219: * COMPLEMENTATION VALUE CODE FOR OPERAND
2220: * =O$COM
2221: *
2222: * CONCATENATION (CASE OF PRED FUNC LEFT OPERAND)
2223: * VALUE CODE FOR LEFT OPERAND
2224: * =O$POP
2225: * VALUE CODE FOR RIGHT OPERAND
2226: *
2227: * (ALL OTHER CASES)
2228: * VALUE CODE FOR LEFT OPERAND
2229: * VALUE CODE FOR RIGHT OPERAND
2230: * =O$CNC
2231: *
2232: * CURSOR ASSIGNMENT NAME CODE FOR OPERAND
2233: * =O$CAS
2234: *
2235: * DIVISION VALUE CODE FOR LEFT OPERAND
2236: * VALUE CODE FOR RIGHT OPERAND
2237: * =O$DVD
2238: *
2239: * EXPONENTIATION VALUE CODE FOR LEFT OPERAND
2240: * VALUE CODE FOR RIGHT OPERAND
2241: * =O$EXP
2242: *
2243: * FUNCTION CALL (CASE OF CALL TO SYSTEM FUNCTION)
2244: * VALUE CODE FOR FIRST ARGUMENT
2245: * VALUE CODE FOR SECOND ARGUMENT
2246: * ...
2247: * VALUE CODE FOR LAST ARGUMENT
2248: * POINTER TO SVFNC FIELD OF SVBLK
2249: *
2250: {{EJC{{{{
2251: *
2252: * CODE BLOCK (CONTINUED)
2253: *
2254: * FUNCTION CALL (CASE OF NON-SYSTEM FUNCTION 1 ARG)
2255: * VALUE CODE FOR ARGUMENT
2256: * =O$FNS
2257: * POINTER TO VRBLK FOR FUNCTION
2258: *
2259: * (NON-SYSTEM FUNCTION, GT 1 ARG)
2260: * VALUE CODE FOR FIRST ARGUMENT
2261: * VALUE CODE FOR SECOND ARGUMENT
2262: * ...
2263: * VALUE CODE FOR LAST ARGUMENT
2264: * =O$FNC
2265: * NUMBER OF ARGUMENTS
2266: * POINTER TO VRBLK FOR FUNCTION
2267: *
2268: * IMMEDIATE ASSIGNMENT VALUE CODE FOR LEFT OPERAND
2269: * NAME CODE FOR RIGHT OPERAND
2270: * =O$IMA
2271: *
2272: * INDIRECTION VALUE CODE FOR OPERAND
2273: * =O$INV
2274: *
2275: * INTERROGATION VALUE CODE FOR OPERAND
2276: * =O$INT
2277: *
2278: * KEYWORD REFERENCE NAME CODE FOR OPERAND
2279: * =O$KWV
2280: *
2281: * MULTIPLICATION VALUE CODE FOR LEFT OPERAND
2282: * VALUE CODE FOR RIGHT OPERAND
2283: * =O$MLT
2284: *
2285: * NAME REFERENCE (NATURAL VARIABLE CASE)
2286: * POINTER TO NMBLK FOR NAME
2287: *
2288: * (ALL OTHER CASES)
2289: * NAME CODE FOR OPERAND
2290: * =O$NAM
2291: *
2292: * NEGATION =O$NTA
2293: * CDBLK OFFSET OF O$NTC WORD
2294: * VALUE CODE FOR OPERAND
2295: * =O$NTB
2296: * =O$NTC
2297: {{EJC{{{{
2298: *
2299: * CODE BLOCK (CONTINUED)
2300: *
2301: * PATTERN ASSIGNMENT VALUE CODE FOR LEFT OPERAND
2302: * NAME CODE FOR RIGHT OPERAND
2303: * =O$PAS
2304: *
2305: * PATTERN MATCH VALUE CODE FOR LEFT OPERAND
2306: * VALUE CODE FOR RIGHT OPERAND
2307: * =O$PMV
2308: *
2309: * PATTERN REPLACEMENT NAME CODE FOR SUBJECT
2310: * VALUE CODE FOR PATTERN
2311: * =O$PMN
2312: * VALUE CODE FOR REPLACEMENT
2313: * =O$RPL
2314: *
2315: * SELECTION (FOR FIRST ALTERNATIVE)
2316: * =O$SLA
2317: * CDBLK OFFSET TO NEXT O$SLC WORD
2318: * VALUE CODE FOR FIRST ALTERNATIVE
2319: * =O$SLB
2320: * CDBLK OFFSET PAST ALTERNATIVES
2321: *
2322: * (FOR SUBSEQUENT ALTERNATIVES)
2323: * =O$SLC
2324: * CDBLK OFFSET TO NEXT O$SLC,O$SLD
2325: * VALUE CODE FOR ALTERNATIVE
2326: * =O$SLB
2327: * OFFSET IN CDBLK PAST ALTERNATIVES
2328: *
2329: * (FOR LAST ALTERNATIVE)
2330: * =O$SLD
2331: * VALUE CODE FOR LAST ALTERNATIVE
2332: *
2333: * SUBTRACTION VALUE CODE FOR LEFT OPERAND
2334: * VALUE CODE FOR RIGHT OPERAND
2335: * =O$SUB
2336: {{EJC{{{{
2337: *
2338: * CODE BLOCK (CONTINUED)
2339: *
2340: * GENERATION OF CODE BY NAME FOR EXPRESSION ELEMENTS.
2341: *
2342: * VARIABLE =O$LVN
2343: * POINTER TO VRBLK
2344: *
2345: * EXPRESSION (CASE OF *NATURAL VARIABLE)
2346: * =O$LVN
2347: * POINTER TO VRBLK
2348: *
2349: * (ALL OTHER CASES)
2350: * =O$LEX
2351: * POINTER TO EXBLK
2352: *
2353: *
2354: * ARRAY REFERENCE (CASE OF ONE SUBSCRIPT)
2355: * VALUE CODE FOR ARRAY OPERAND
2356: * VALUE CODE FOR SUBSCRIPT OPERAND
2357: * =O$AON
2358: *
2359: * (CASE OF MORE THAN ONE SUBSCRIPT)
2360: * VALUE CODE FOR ARRAY OPERAND
2361: * VALUE CODE FOR FIRST SUBSCRIPT
2362: * VALUE CODE FOR SECOND SUBSCRIPT
2363: * ...
2364: * VALUE CODE FOR LAST SUBSCRIPT
2365: * =O$AMN
2366: * NUMBER OF SUBSCRIPTS
2367: *
2368: * COMPILE ERROR =O$CER
2369: *
2370: * FUNCTION CALL (SAME CODE AS FOR VALUE CALL)
2371: * =O$FNE
2372: *
2373: * INDIRECTION VALUE CODE FOR OPERAND
2374: * =O$INN
2375: *
2376: * KEYWORD REFERENCE NAME CODE FOR OPERAND
2377: * =O$KWN
2378: *
2379: * ANY OTHER OPERAND IS AN ERROR IN A NAME POSITION
2380: *
2381: * NOTE THAT IN THIS DESCRIPTION, =O$XXX REFERS TO THE
2382: * GENERATION OF A WORD CONTAINING THE ADDRESS OF ANOTHER
2383: * WORD WHICH CONTAINS THE ENTRY POINT ADDRESS O$XXX.
2384: {{EJC{{{{
2385: *
2386: * CODE BLOCK (CONTINUED)
2387: *
2388: * NOW WE CONSIDER THE OVERALL STRUCTURE OF THE CODE BLOCK
2389: * FOR A STATEMENT WITH POSSIBLE GOTO FIELDS.
2390: *
2391: * FIRST COMES THE CODE FOR THE STATEMENT BODY.
2392: * THE STATEMENT BODY IS AN EXPRESSION TO BE EVALUATED
2393: * BY VALUE ALTHOUGH THE VALUE IS NOT ACTUALLY REQUIRED.
2394: * NORMAL VALUE CODE IS GENERATED FOR THE BODY OF THE
2395: * STATEMENT EXCEPT IN THE CASE OF A PATTERN MATCH BY
2396: * VALUE, IN WHICH CASE THE FOLLOWING IS GENERATED.
2397: *
2398: * VALUE CODE FOR LEFT OPERAND
2399: * VALUE CODE FOR RIGHT OPERAND
2400: * =O$PMS
2401: *
2402: * NEXT WE HAVE THE CODE FOR THE SUCCESS GOTO. THERE ARE
2403: * SEVERAL CASES AS FOLLOWS.
2404: *
2405: * 1) NO SUCCESS GOTO PTR TO CDBLK FOR NEXT STATEMENT
2406: *
2407: * 2) SIMPLE LABEL PTR TO VRTRA FIELD OF VRBLK
2408: *
2409: * 3) COMPLEX GOTO (CODE BY NAME FOR GOTO OPERAND)
2410: * =O$GOC
2411: *
2412: * 4) DIRECT GOTO (CODE BY VALUE FOR GOTO OPERAND)
2413: * =O$GOD
2414: *
2415: * FOLLOWING THIS WE GENERATE CODE FOR THE FAILURE GOTO IF
2416: * IT IS DIRECT OR IF IT IS COMPLEX, SIMPLE FAILURE GOTOS
2417: * HAVING BEEN HANDLED BY AN APPROPRIATE SETTING OF THE
2418: * CDFAL FIELD OF THE CDBLK. THE GENERATED CODE IS ONE
2419: * OF THE FOLLOWING.
2420: *
2421: * 1) COMPLEX FGOTO =O$FIF
2422: * =O$GOF
2423: * NAME CODE FOR GOTO OPERAND
2424: * =O$GOC
2425: *
2426: * 2) DIRECT FGOTO =O$FIF
2427: * =O$GOF
2428: * VALUE CODE FOR GOTO OPERAND
2429: * =O$GOD
2430: *
2431: * AN OPTIMIZATION OCCURS IF THE SUCCESS AND FAILURE GOTOS
2432: * ARE IDENTICAL AND EITHER COMPLEX OR DIRECT. IN THIS CASE,
2433: * NO CODE IS GENERATED FOR THE SUCCESS GOTO AND CONTROL
2434: * IS ALLOWED TO FALL INTO THE FAILURE GOTO ON SUCCESS.
2435: {{EJC{{{{
2436: *
2437: * COMPILER BLOCK (CMBLK)
2438: *
2439: * A COMPILER BLOCK (CMBLK) IS BUILT BY EXPAN TO REPRESENT
2440: * ONE NODE OF A TREE STRUCTURED EXPRESSION REPRESENTATION.
2441: *
2442: * +------------------------------------+
2443: * I CMIDN I
2444: * +------------------------------------+
2445: * I CMLEN I
2446: * +------------------------------------+
2447: * I CMTYP I
2448: * +------------------------------------+
2449: * I CMOPN I
2450: * +------------------------------------+
2451: * / CMVLS OR CMROP /
2452: * / /
2453: * / CMLOP /
2454: * / /
2455: * +------------------------------------+
2456: *
2457: {CMIDN{EQU{0{{{POINTER TO DUMMY ROUTINE B$CMT
2458: {CMLEN{EQU{CMIDN+1{{{LENGTH OF CMBLK IN BYTES
2459: {CMTYP{EQU{CMLEN+1{{{TYPE (C$XXX, SEE LIST BELOW)
2460: {CMOPN{EQU{CMTYP+1{{{OPERAND POINTER (SEE BELOW)
2461: {CMVLS{EQU{CMOPN+1{{{OPERAND VALUE POINTERS (SEE BELOW)
2462: {CMROP{EQU{CMVLS{{{RIGHT (ONLY) OPERATOR OPERAND
2463: {CMLOP{EQU{CMVLS+1{{{LEFT OPERATOR OPERAND
2464: {CMSI${EQU{CMVLS{{{NUMBER OF STANDARD FIELDS IN CMBLK
2465: {CMUS${EQU{CMSI$+1{{{SIZE OF UNARY OPERATOR CMBLK
2466: {CMBS${EQU{CMSI$+2{{{SIZE OF BINARY OPERATOR CMBLK
2467: {CMAR1{EQU{CMVLS+1{{{ARRAY SUBSCRIPT POINTERS
2468: *
2469: * THE CMOPN AND CMVLS FIELDS ARE SET AS FOLLOWS
2470: *
2471: * ARRAY REFERENCE CMOPN = PTR TO ARRAY OPERAND
2472: * CMVLS = PTRS TO SUBSCRIPT OPERANDS
2473: *
2474: * FUNCTION CALL CMOPN = PTR TO VRBLK FOR FUNCTION
2475: * CMVLS = PTRS TO ARGUMENT OPERANDS
2476: *
2477: * SELECTION CMOPN = ZERO
2478: * CMVLS = PTRS TO ALTERNATE OPERANDS
2479: *
2480: * UNARY OPERATOR CMOPN = PTR TO OPERATOR DVBLK
2481: * CMROP = PTR TO OPERAND
2482: *
2483: * BINARY OPERATOR CMOPN = PTR TO OPERATOR DVBLK
2484: * CMROP = PTR TO RIGHT OPERAND
2485: * CMLOP = PTR TO LEFT OPERAND
2486: {{EJC{{{{
2487: *
2488: * CMTYP IS SET TO INDICATE THE TYPE OF EXPRESSION ELEMENT
2489: * AS SHOWN BY THE FOLLOWING TABLE OF DEFINITIONS.
2490: *
2491: {C$ARR{EQU{0{{{ARRAY REFERENCE
2492: {C$FNC{EQU{C$ARR+1{{{FUNCTION CALL
2493: {C$DEF{EQU{C$FNC+1{{{DEFERRED EXPRESSION (UNARY *)
2494: {C$IND{EQU{C$DEF+1{{{INDIRECTION (UNARY $)
2495: {C$KEY{EQU{C$IND+1{{{KEYWORD REFERENCE (UNARY AMPERSAND)
2496: {C$UBO{EQU{C$KEY+1{{{UNDEFINED BINARY OPERATOR
2497: {C$UUO{EQU{C$UBO+1{{{UNDEFINED UNARY OPERATOR
2498: {C$UO${EQU{C$UUO+1{{{TEST VALUE (=C$UUO+1=C$UBO+2)
2499: {C$$NM{EQU{C$UUO+1{{{NUMBER OF CODES FOR NAME OPERANDS
2500: *
2501: * THE REMAINING TYPES INDICATE EXPRESSION ELEMENTS WHICH
2502: * CAN ONLY BE EVALUATED BY VALUE (NOT BY NAME).
2503: *
2504: {C$BVL{EQU{C$UUO+1{{{BINARY OP WITH VALUE OPERANDS
2505: {C$UVL{EQU{C$BVL+1{{{UNARY OPERATOR WITH VALUE OPERAND
2506: {C$ALT{EQU{C$UVL+1{{{ALTERNATION (BINARY BAR)
2507: {C$CNC{EQU{C$ALT+1{{{CONCATENATION
2508: {C$CNP{EQU{C$CNC+1{{{CONCATENATION, NOT PATTERN MATCH
2509: {C$UNM{EQU{C$CNP+1{{{UNARY OP WITH NAME OPERAND
2510: {C$BVN{EQU{C$UNM+1{{{BINARY OP (OPERANDS BY VALUE, NAME)
2511: {C$ASS{EQU{C$BVN+1{{{ASSIGNMENT
2512: {C$INT{EQU{C$ASS+1{{{INTERROGATION
2513: {C$NEG{EQU{C$INT+1{{{NEGATION (UNARY NOT)
2514: {C$SEL{EQU{C$NEG+1{{{SELECTION
2515: {C$PMT{EQU{C$SEL+1{{{PATTERN MATCH
2516: *
2517: {C$PR${EQU{C$BVN{{{LAST PREEVALUABLE CODE
2518: {C$$NV{EQU{C$PMT+1{{{NUMBER OF DIFFERENT CMBLK TYPES
2519: {{EJC{{{{
2520: *
2521: * CHARACTER TABLE BLOCK (CTBLK)
2522: *
2523: * A CHARACTER TABLE BLOCK IS USED TO HOLD LOGICAL CHARACTER
2524: * TABLES FOR USE WITH ANY,NOTANY,SPAN,BREAK,BREAKX
2525: * PATTERNS. EACH CHARACTER TABLE CAN BE USED TO STORE
2526: * CFP$N DISTINCT TABLES AS BIT COLUMNS. A BIT COLUMN
2527: * ALLOCATED FOR EACH ARGUMENT OF MORE THAN ONE CHARACTER
2528: * IN LENGTH TO ONE OF THE ABOVE LISTED PATTERN PRIMITIVES.
2529: *
2530: * +------------------------------------+
2531: * I CTTYP I
2532: * +------------------------------------+
2533: * * *
2534: * * *
2535: * * CTCHS *
2536: * * *
2537: * * *
2538: * +------------------------------------+
2539: *
2540: {CTTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$CTT
2541: {CTCHS{EQU{CTTYP+1{{{START OF CHARACTER TABLE WORDS
2542: {CTSI${EQU{CTCHS+CFP$A{{{NUMBER OF WORDS IN CTBLK
2543: *
2544: * CTCHS IS CFP$A WORDS LONG AND CONSISTS OF A ONE WORD
2545: * BIT STRING VALUE FOR EACH POSSIBLE CHARACTER IN THE
2546: * INTERNAL ALPHABET. EACH OF THE CFP$N POSSIBLE BITS IN
2547: * A BITSTRING IS USED TO FORM A COLUMN OF BIT INDICATORS.
2548: * A BIT IS SET ON IF THE CHARACTER IS IN THE TABLE AND OFF
2549: * IF THE CHARACTER IS NOT PRESENT.
2550: {{EJC{{{{
2551: *
2552: * DATATYPE FUNCTION BLOCK (DFBLK)
2553: *
2554: * A DATATYPE FUNCTION IS USED TO CONTROL THE CONSTRUCTION
2555: * OF A PROGRAM DEFINED DATATYPE OBJECT. A CALL TO THE
2556: * SYSTEM FUNCTION DATA BUILDS A DFBLK FOR THE DATATYPE NAME
2557: *
2558: * NOTE THAT THESE BLOCKS ARE BUILT IN STATIC BECAUSE PDBLK
2559: * LENGTH IS GOT FROM DFLEN FIELD. IF DFBLK WAS IN DYNAMIC
2560: * STORE THIS WOULD CAUSE TROUBLE DURING PASS TWO OF GARBAGE
2561: * COLLECTION. SCBLK REFERRED TO BY DFNAM FIELD IS ALSO PUT
2562: * IN STATIC SO THAT THERE ARE NO RELOC. FIELDS. THIS CUTS
2563: * GARBAGE COLLECTION TASK APPRECIABLY FOR PDBLKS WHICH ARE
2564: * LIKELY TO BE PRESENT IN LARGE NUMBERS.
2565: *
2566: * +------------------------------------+
2567: * I FCODE I
2568: * +------------------------------------+
2569: * I FARGS I
2570: * +------------------------------------+
2571: * I DFLEN I
2572: * +------------------------------------+
2573: * I DFPDL I
2574: * +------------------------------------+
2575: * I DFNAM I
2576: * +------------------------------------+
2577: * / /
2578: * / DFFLD /
2579: * / /
2580: * +------------------------------------+
2581: *
2582: {DFLEN{EQU{FARGS+1{{{LENGTH OF DFBLK IN BYTES
2583: {DFPDL{EQU{DFLEN+1{{{LENGTH OF CORRESPONDING PDBLK
2584: {DFNAM{EQU{DFPDL+1{{{POINTER TO SCBLK FOR DATATYPE NAME
2585: {DFFLD{EQU{DFNAM+1{{{START OF VRBLK PTRS FOR FIELD NAMES
2586: {DFFLB{EQU{DFFLD-1{{{OFFSET BEHIND DFFLD FOR FIELD FUNC
2587: {DFSI${EQU{DFFLD{{{NUMBER OF STANDARD FIELDS IN DFBLK
2588: *
2589: * THE FCODE FIELD POINTS TO THE ROUTINE B$DFC
2590: *
2591: * FARGS (THE NUMBER OF ARGUMENTS) IS THE NUMBER OF FIELDS.
2592: {{EJC{{{{
2593: *
2594: * DOPE VECTOR BLOCK (DVBLK)
2595: *
2596: * A DOPE VECTOR IS ASSEMBLED FOR EACH POSSIBLE OPERATOR IN
2597: * THE SNOBOL4 LANGUAGE AS PART OF THE CONSTANT SECTION.
2598: *
2599: * +------------------------------------+
2600: * I DVOPN I
2601: * +------------------------------------+
2602: * I DVTYP I
2603: * +------------------------------------+
2604: * I DVLPR I
2605: * +------------------------------------+
2606: * I DVRPR I
2607: * +------------------------------------+
2608: *
2609: {DVOPN{EQU{0{{{ENTRY ADDRESS (PTR TO O$XXX)
2610: {DVTYP{EQU{DVOPN+1{{{TYPE CODE (C$XXX, SEE CMBLK)
2611: {DVLPR{EQU{DVTYP+1{{{LEFT PRECEDENCE (LLXXX, SEE BELOW)
2612: {DVRPR{EQU{DVLPR+1{{{RIGHT PRECEDENCE (RRXXX, SEE BELOW)
2613: {DVUS${EQU{DVLPR+1{{{SIZE OF UNARY OPERATOR DV
2614: {DVBS${EQU{DVRPR+1{{{SIZE OF BINARY OPERATOR DV
2615: {DVUBS{EQU{DVUS$+DVBS${{{SIZE OF UNOP + BINOP (SEE SCANE)
2616: *
2617: * THE CONTENTS OF THE DVTYP FIELD IS COPIED INTO THE CMTYP
2618: * FIELD OF THE CMBLK FOR THE OPERATOR IF IT IS USED.
2619: *
2620: * THE CMOPN FIELD OF AN OPERATOR CMBLK POINTS TO THE DVBLK
2621: * ITSELF, PROVIDING THE REQUIRED ENTRY ADDRESS POINTER PTR.
2622: *
2623: * FOR NORMALLY UNDEFINED OPERATORS, THE DVOPN (AND CMOPN)
2624: * FIELDS CONTAIN A WORD OFFSET FROM R$UBA OF THE FUNCTION
2625: * BLOCK POINTER FOR THE OPERATOR (INSTEAD OF O$XXX PTR).
2626: * FOR CERTAIN SPECIAL OPERATORS, THE DVOPN FIELD IS NOT
2627: * REQUIRED AT ALL AND IS ASSEMBLED AS ZERO.
2628: *
2629: * THE LEFT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO
2630: * THE LEFT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS THE
2631: * PRECEDENCE OF THE OPERATOR TOWARDS ITS RIGHT OPERAND.
2632: *
2633: * THE RIGHT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO
2634: * THE RIGHT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS
2635: * THE PRECEDENCE OF THE OPERATOR TOWARDS ITS LEFT OPERAND.
2636: *
2637: * HIGHER PRECEDENCE VALUES CORRESPOND TO A TIGHTER BINDING
2638: * CAPABILITY. THUS WE HAVE THE LEFT PRECEDENCE LOWER
2639: * (HIGHER) THAN THE RIGHT PRECEDENCE FOR RIGHT (LEFT)
2640: * ASSOCIATIVE BINARY OPERATORS.
2641: *
2642: * THE LEFT PRECEDENCE OF UNARY OPERATORS IS SET TO AN
2643: * ARBITRARY HIGH VALUE. THE RIGHT VALUE IS NOT REQUIRED AND
2644: * CONSEQUENTLY THE DVRPR FIELD IS OMITTED FOR UNARY OPS.
2645: {{EJC{{{{
2646: *
2647: * TABLE OF OPERATOR PRECEDENCE VALUES
2648: *
2649: {RRASS{EQU{10{{{RIGHT EQUAL
2650: {LLASS{EQU{00{{{LEFT EQUAL
2651: {RRPMT{EQU{20{{{RIGHT QUESTION MARK
2652: {LLPMT{EQU{30{{{LEFT QUESTION MARK
2653: {RRAMP{EQU{40{{{RIGHT AMPERSAND
2654: {LLAMP{EQU{50{{{LEFT AMPERSAND
2655: {RRALT{EQU{70{{{RIGHT VERTICAL BAR
2656: {LLALT{EQU{60{{{LEFT VERTICAL BAR
2657: {RRCNC{EQU{90{{{RIGHT BLANK
2658: {LLCNC{EQU{80{{{LEFT BLANK
2659: {RRATS{EQU{110{{{RIGHT AT
2660: {LLATS{EQU{100{{{LEFT AT
2661: {RRPLM{EQU{120{{{RIGHT PLUS, MINUS
2662: {LLPLM{EQU{130{{{LEFT PLUS, MINUS
2663: {RRNUM{EQU{140{{{RIGHT NUMBER
2664: {LLNUM{EQU{150{{{LEFT NUMBER
2665: {RRDVD{EQU{160{{{RIGHT SLASH
2666: {LLDVD{EQU{170{{{LEFT SLASH
2667: {RRMLT{EQU{180{{{RIGHT ASTERISK
2668: {LLMLT{EQU{190{{{LEFT ASTERISK
2669: {RRPCT{EQU{200{{{RIGHT PERCENT
2670: {LLPCT{EQU{210{{{LEFT PERCENT
2671: {RREXP{EQU{230{{{RIGHT EXCLAMATION
2672: {LLEXP{EQU{220{{{LEFT EXCLAMATION
2673: {RRDLD{EQU{240{{{RIGHT DOLLAR, DOT
2674: {LLDLD{EQU{250{{{LEFT DOLLAR, DOT
2675: {RRNOT{EQU{270{{{RIGHT NOT
2676: {LLNOT{EQU{260{{{LEFT NOT
2677: {LLUNO{EQU{999{{{LEFT ALL UNARY OPERATORS
2678: *
2679: * PRECEDENCES ARE THE SAME AS IN BTL SNOBOL4 WITH THE
2680: * FOLLOWING EXCEPTIONS.
2681: *
2682: * 1) BINARY QUESTION MARK IS LOWERED AND MADE LEFT ASSOC-
2683: * IATIVE TO REFLECT ITS NEW USE FOR PATTERN MATCHING.
2684: *
2685: * 2) ALTERNATION AND CONCATENATION ARE MADE RIGHT
2686: * ASSOCIATIVE FOR GREATER EFFICIENCY IN PATTERN
2687: * CONSTRUCTION AND MATCHING RESPECTIVELY. THIS CHANGE
2688: * IS TRANSPARENT TO THE SNOBOL4 PROGRAMMER.
2689: *
2690: * 3) THE EQUAL SIGN HAS BEEN ADDED AS A LOW PRECEDENCE
2691: * OPERATOR WHICH IS RIGHT ASSOCIATIVE TO REFLECT ITS
2692: * MORE GENERAL USAGE IN THIS VERSION OF SNOBOL4.
2693: {{EJC{{{{
2694: *
2695: * EXTERNAL FUNCTION BLOCK (EFBLK)
2696: *
2697: * AN EXTERNAL FUNCTION BLOCK IS USED TO CONTROL THE CALLING
2698: * OF AN EXTERNAL FUNCTION. IT IS BUILT BY A CALL TO LOAD.
2699: *
2700: * +------------------------------------+
2701: * I FCODE I
2702: * +------------------------------------+
2703: * I FARGS I
2704: * +------------------------------------+
2705: * I EFLEN I
2706: * +------------------------------------+
2707: * I EFUSE I
2708: * +------------------------------------+
2709: * I EFCOD I
2710: * +------------------------------------+
2711: * I EFVAR I
2712: * +------------------------------------+
2713: * I EFRSL I
2714: * +------------------------------------+
2715: * / /
2716: * / EFTAR /
2717: * / /
2718: * +------------------------------------+
2719: *
2720: {EFLEN{EQU{FARGS+1{{{LENGTH OF EFBLK IN BYTES
2721: {EFUSE{EQU{EFLEN+1{{{USE COUNT (FOR OPSYN)
2722: {EFCOD{EQU{EFUSE+1{{{PTR TO CODE (FROM SYSLD)
2723: {EFVAR{EQU{EFCOD+1{{{PTR TO ASSOCIATED VRBLK
2724: {EFRSL{EQU{EFVAR+1{{{RESULT TYPE (SEE BELOW)
2725: {EFTAR{EQU{EFRSL+1{{{ARGUMENT TYPES (SEE BELOW)
2726: {EFSI${EQU{EFTAR{{{NUMBER OF STANDARD FIELDS IN EFBLK
2727: *
2728: * THE FCODE FIELD POINTS TO THE ROUTINE B$EFC.
2729: *
2730: * EFUSE IS USED TO KEEP TRACK OF MULTIPLE USE WHEN OPSYN
2731: * IS EMPLOYED. THE FUNCTION IS AUTOMATICALLY UNLOADED
2732: * WHEN THERE ARE NO MORE REFERENCES TO THE FUNCTION.
2733: *
2734: * EFRSL AND EFTAR ARE TYPE CODES AS FOLLOWS.
2735: *
2736: * 0 TYPE IS UNCONVERTED
2737: * 1 TYPE IS STRING
2738: * 2 TYPE IS INTEGER
2739: * 3 TYPE IS REAL
2740: {{EJC{{{{
2741: *
2742: * EXPRESSION VARIABLE BLOCK (EVBLK)
2743: *
2744: * IN THIS VERSION OF SPITBOL, AN EXPRESSION CAN BE USED IN
2745: * ANY POSITION WHICH WOULD NORMALLY EXPECT A NAME (FOR
2746: * EXAMPLE ON THE LEFT SIDE OF EQUALS OR AS THE RIGHT
2747: * ARGUMENT OF BINARY DOT). THIS CORRESPONDS TO THE CREATION
2748: * OF A PSEUDO-VARIABLE WHICH IS REPRESENTED BY A POINTER TO
2749: * AN EXPRESSION VARIABLE BLOCK AS FOLLOWS.
2750: *
2751: * +------------------------------------+
2752: * I EVTYP I
2753: * +------------------------------------+
2754: * I EVEXP I
2755: * +------------------------------------+
2756: * I EVVAR I
2757: * +------------------------------------+
2758: *
2759: {EVTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$EVT
2760: {EVEXP{EQU{EVTYP+1{{{POINTER TO EXBLK FOR EXPRESSION
2761: {EVVAR{EQU{EVEXP+1{{{POINTER TO TRBEV DUMMY TRBLK
2762: {EVSI${EQU{EVVAR+1{{{SIZE OF EVBLK
2763: *
2764: * THE NAME OF AN EXPRESSION VARIABLE IS REPRESENTED BY A
2765: * BASE POINTER TO THE EVBLK AND AN OFFSET OF EVVAR. THIS
2766: * VALUE APPEARS TO BE TRAPPED BY THE DUMMY TRBEV BLOCK.
2767: *
2768: * NOTE THAT THERE IS NO NEED TO ALLOW FOR THE CASE OF AN
2769: * EXPRESSION VARIABLE WHICH REFERENCES AN SEBLK SINCE A
2770: * VARIABLE WHICH IS OF THE FORM *VAR IS EQUIVALENT TO VAR.
2771: {{EJC{{{{
2772: *
2773: * EXPRESSION BLOCK (EXBLK)
2774: *
2775: * AN EXPRESSION BLOCK IS BUILT FOR EACH EXPRESSION
2776: * REFERENCED IN A PROGRAM OR CREATED BY EVAL OR CONVERT
2777: * DURING EXECUTION OF A PROGRAM.
2778: *
2779: * +------------------------------------+
2780: * I EXTYP I
2781: * +------------------------------------+
2782: * I EXSTM I
2783: * +------------------------------------+
2784: * I EXLEN I
2785: * +------------------------------------+
2786: * I EXFLC I
2787: * +------------------------------------+
2788: * / /
2789: * / EXCOD /
2790: * / /
2791: * +------------------------------------+
2792: *
2793: {EXTYP{EQU{0{{{PTR TO ROUTINE B$EXL TO LOAD EXPR
2794: {EXSTM{EQU{CDSTM{{{STORES STMNT NO. DURING EVALUATION
2795: {EXLEN{EQU{EXSTM+1{{{LENGTH OF EXBLK IN BYTES
2796: {EXFLC{EQU{EXLEN+1{{{FAILURE CODE (=O$FEX)
2797: {EXCOD{EQU{EXFLC+1{{{PSEUDO-CODE FOR EXPRESSION
2798: {EXSI${EQU{EXCOD{{{NUMBER OF STANDARD FIELDS IN EXBLK
2799: *
2800: * THERE ARE TWO CASES FOR EXCOD DEPENDING ON WHETHER THE
2801: * EXPRESSION CAN BE EVALUATED BY NAME (SEE DESCRIPTION
2802: * OF CDBLK FOR DETAILS OF CODE FOR EXPRESSIONS).
2803: *
2804: * IF THE EXPRESSION CAN BE EVALUATED BY NAME WE HAVE.
2805: *
2806: * (CODE FOR EXPR BY NAME)
2807: * =O$RNM
2808: *
2809: * IF THE EXPRESSION CAN ONLY BE EVALUATED BY VALUE.
2810: *
2811: * (CODE FOR EXPR BY VALUE)
2812: * =O$RVL
2813: {{EJC{{{{
2814: *
2815: * FIELD FUNCTION BLOCK (FFBLK)
2816: *
2817: * A FIELD FUNCTION BLOCK IS USED TO CONTROL THE SELECTION
2818: * OF A FIELD FROM A PROGRAM DEFINED DATATYPE BLOCK.
2819: * A CALL TO DATA CREATES AN FFBLK FOR EACH FIELD.
2820: *
2821: * +------------------------------------+
2822: * I FCODE I
2823: * +------------------------------------+
2824: * I FARGS I
2825: * +------------------------------------+
2826: * I FFDFP I
2827: * +------------------------------------+
2828: * I FFNXT I
2829: * +------------------------------------+
2830: * I FFOFS I
2831: * +------------------------------------+
2832: *
2833: {FFDFP{EQU{FARGS+1{{{POINTER TO ASSOCIATED DFBLK
2834: {FFNXT{EQU{FFDFP+1{{{PTR TO NEXT FFBLK ON CHAIN OR ZERO
2835: {FFOFS{EQU{FFNXT+1{{{OFFSET (BYTES) TO FIELD IN PDBLK
2836: {FFSI${EQU{FFOFS+1{{{SIZE OF FFBLK IN WORDS
2837: *
2838: * THE FCODE FIELD POINTS TO THE ROUTINE B$FFC.
2839: *
2840: * FARGS ALWAYS CONTAINS ONE.
2841: *
2842: * FFDFP IS USED TO VERIFY THAT THE CORRECT PROGRAM DEFINED
2843: * DATATYPE IS BEING ACCESSED BY THIS CALL.
2844: * FFDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC
2845: *
2846: * FFOFS IS USED TO SELECT THE APPROPRIATE FIELD. NOTE THAT
2847: * IT IS AN ACTUAL OFFSET (NOT A FIELD NUMBER)
2848: *
2849: * FFNXT IS USED TO POINT TO THE NEXT FFBLK OF THE SAME NAME
2850: * IN THE CASE WHERE THERE ARE SEVERAL FIELDS OF THE SAME
2851: * NAME FOR DIFFERENT DATATYPES. ZERO MARKS THE END OF CHAIN
2852: {{EJC{{{{
2853: *
2854: * INTEGER CONSTANT BLOCK (ICBLK)
2855: *
2856: * AN ICBLK IS CREATED FOR EVERY INTEGER REFERENCED OR
2857: * CREATED BY A PROGRAM. NOTE HOWEVER THAT CERTAIN INTERNAL
2858: * INTEGER VALUES ARE STORED AS ADDRESSES (E.G. THE LENGTH
2859: * FIELD IN A STRING CONSTANT BLOCK)
2860: *
2861: * +------------------------------------+
2862: * I ICGET I
2863: * +------------------------------------+
2864: * * ICVAL *
2865: * +------------------------------------+
2866: *
2867: {ICGET{EQU{0{{{PTR TO ROUTINE B$ICL TO LOAD INT
2868: {ICVAL{EQU{ICGET+1{{{INTEGER VALUE
2869: {ICSI${EQU{ICVAL+CFP$I{{{SIZE OF ICBLK
2870: *
2871: * THE LENGTH OF THE ICVAL FIELD IS CFP$I.
2872: {{EJC{{{{
2873: *
2874: * KEYWORD VARIABLE BLOCK (KVBLK)
2875: *
2876: * A KVBLK IS USED TO REPRESENT A KEYWORD PSEUDO-VARIABLE.
2877: * A KVBLK IS BUILT FOR EACH KEYWORD REFERENCE (KWNAM).
2878: *
2879: * +------------------------------------+
2880: * I KVTYP I
2881: * +------------------------------------+
2882: * I KVVAR I
2883: * +------------------------------------+
2884: * I KVNUM I
2885: * +------------------------------------+
2886: *
2887: {KVTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$KVT
2888: {KVVAR{EQU{KVTYP+1{{{POINTER TO DUMMY BLOCK TRBKV
2889: {KVNUM{EQU{KVVAR+1{{{KEYWORD NUMBER
2890: {KVSI${EQU{KVNUM+1{{{SIZE OF KVBLK
2891: *
2892: * THE NAME OF A KEYWORD VARIABLE IS REPRESENTED BY A
2893: * BASE POINTER TO THE KVBLK AND AN OFFSET OF KVVAR. THE
2894: * VALUE APPEARS TO BE TRAPPED BY THE POINTER TO TRBKV.
2895: {{EJC{{{{
2896: *
2897: * NAME BLOCK (NMBLK)
2898: *
2899: * A NAME BLOCK IS USED WHEREVER A NAME MUST BE STORED AS
2900: * A VALUE FOLLOWING USE OF THE UNARY DOT OPERATOR.
2901: *
2902: * +------------------------------------+
2903: * I NMTYP I
2904: * +------------------------------------+
2905: * I NMBAS I
2906: * +------------------------------------+
2907: * I NMOFS I
2908: * +------------------------------------+
2909: *
2910: {NMTYP{EQU{0{{{PTR TO ROUTINE B$NML TO LOAD NAME
2911: {NMBAS{EQU{NMTYP+1{{{BASE POINTER FOR VARIABLE
2912: {NMOFS{EQU{NMBAS+1{{{OFFSET FOR VARIABLE
2913: {NMSI${EQU{NMOFS+1{{{SIZE OF NMBLK
2914: *
2915: * THE ACTUAL FIELD REPRESENTING THE CONTENTS OF THE NAME
2916: * IS FOUND NMOFS BYTES PAST THE ADDRESS IN NMBAS.
2917: *
2918: * THE NAME IS SPLIT INTO BASE AND OFFSET FORM TO AVOID
2919: * CREATION OF A POINTER INTO THE MIDDLE OF A BLOCK WHICH
2920: * COULD NOT BE HANDLED PROPERLY BY THE GARBAGE COLLECTOR.
2921: *
2922: * A NAME MAY BE BUILT FOR ANY VARIABLE (SEE SECTION ON
2923: * REPRESENTATIONS OF VARIABLES) THIS INCLUDES THE
2924: * CASES OF PSEUDO-VARIABLES.
2925: {{EJC{{{{
2926: *
2927: * PATTERN BLOCK, NO PARAMETERS (P0BLK)
2928: *
2929: * A P0BLK IS USED TO REPRESENT PATTERN NODES WHICH DO
2930: * NOT REQUIRE THE USE OF ANY PARAMETER VALUES.
2931: *
2932: * +------------------------------------+
2933: * I PCODE I
2934: * +------------------------------------+
2935: * I PTHEN I
2936: * +------------------------------------+
2937: *
2938: {PCODE{EQU{0{{{PTR TO MATCH ROUTINE (P$XXX)
2939: {PTHEN{EQU{PCODE+1{{{POINTER TO SUBSEQUENT NODE
2940: {PASI${EQU{PTHEN+1{{{SIZE OF P0BLK
2941: *
2942: * PTHEN POINTS TO THE PATTERN BLOCK FOR THE SUBSEQUENT
2943: * NODE TO BE MATCHED. THIS IS A POINTER TO THE PATTERN
2944: * BLOCK NDNTH IF THERE IS NO SUBSEQUENT (END OF PATTERN)
2945: *
2946: * PCODE IS A POINTER TO THE MATCH ROUTINE FOR THE NODE.
2947: {{EJC{{{{
2948: *
2949: * PATTERN BLOCK (ONE PARAMETER)
2950: *
2951: * A P1BLK IS USED TO REPRESENT PATTERN NODES WHICH
2952: * REQUIRE ONE PARAMETER VALUE.
2953: *
2954: * +------------------------------------+
2955: * I PCODE I
2956: * +------------------------------------+
2957: * I PTHEN I
2958: * +------------------------------------+
2959: * I PARM1 I
2960: * +------------------------------------+
2961: *
2962: {PARM1{EQU{PTHEN+1{{{FIRST PARAMETER VALUE
2963: {PBSI${EQU{PARM1+1{{{SIZE OF P1BLK IN WORDS
2964: *
2965: * SEE P0BLK FOR DEFINITIONS OF PCODE, PTHEN
2966: *
2967: * PARM1 CONTAINS A PARAMETER VALUE USED IN MATCHING THE
2968: * NODE. FOR EXAMPLE, IN A LEN PATTERN, IT IS THE INTEGER
2969: * ARGUMENT TO LEN. THE DETAILS OF THE USE OF THE PARAMETER
2970: * FIELD ARE INCLUDED IN THE DESCRIPTION OF THE INDIVIDUAL
2971: * MATCH ROUTINES. PARM1 IS ALWAYS AN ADDRESS POINTER WHICH
2972: * IS PROCESSED BY THE GARBAGE COLLECTOR.
2973: {{EJC{{{{
2974: *
2975: * PATTERN BLOCK (TWO PARAMETERS)
2976: *
2977: * A P2BLK IS USED TO REPRESENT PATTERN NODES WHICH
2978: * REQUIRE TWO PARAMETER VALUES.
2979: *
2980: * +------------------------------------+
2981: * I PCODE I
2982: * +------------------------------------+
2983: * I PTHEN I
2984: * +------------------------------------+
2985: * I PARM1 I
2986: * +------------------------------------+
2987: * I PARM2 I
2988: * +------------------------------------+
2989: *
2990: {PARM2{EQU{PARM1+1{{{SECOND PARAMETER VALUE
2991: {PCSI${EQU{PARM2+1{{{SIZE OF P2BLK IN WORDS
2992: *
2993: * SEE P1BLK FOR DEFINITIONS OF PCODE, PTHEN, PARM1
2994: *
2995: * PARM2 IS A PARAMETER WHICH PERFORMS THE SAME SORT OF
2996: * FUNCTION AS PARM1 (SEE DESCRIPTION OF P1BLK).
2997: *
2998: * PARM2 IS A NON-RELOCATABLE FIELD AND IS NOT
2999: * PROCESSED BY THE GARBAGE COLLECTOR. ACCORDINGLY, IT MAY
3000: * NOT CONTAIN A POINTER TO A BLOCK IN DYNAMIC MEMORY.
3001: {{EJC{{{{
3002: *
3003: * PROGRAM-DEFINED DATATYPE BLOCK
3004: *
3005: * A PDBLK REPRESENTS THE DATA ITEM FORMED BY A CALL TO A
3006: * DATATYPE FUNCTION AS DEFINED BY THE SYSTEM FUNCTION DATA.
3007: *
3008: * +------------------------------------+
3009: * I PDTYP I
3010: * +------------------------------------+
3011: * I IDVAL I
3012: * +------------------------------------+
3013: * I PDDFP I
3014: * +------------------------------------+
3015: * / /
3016: * / PDFLD /
3017: * / /
3018: * +------------------------------------+
3019: *
3020: {PDTYP{EQU{0{{{PTR TO DUMMY ROUTINE B$PDT
3021: {PDDFP{EQU{IDVAL+1{{{PTR TO ASSOCIATED DFBLK
3022: {PDFLD{EQU{PDDFP+1{{{START OF FIELD VALUE POINTERS
3023: {PDFOF{EQU{DFFLD-PDFLD{{{DIFFERENCE IN OFFSET TO FIELD PTRS
3024: {PDSI${EQU{PDFLD{{{SIZE OF STANDARD FIELDS IN PDBLK
3025: {PDDFS{EQU{DFSI$-PDSI${{{DIFFERENCE IN DFBLK, PDBLK SIZES
3026: *
3027: * THE PDDFP POINTER MAY BE USED TO DETERMINE THE DATATYPE
3028: * AND THE NAMES OF THE FIELDS IF REQUIRED. THE DFBLK ALSO
3029: * CONTAINS THE LENGTH OF THE PDBLK IN BYTES (FIELD DFPDL).
3030: * PDDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC
3031: *
3032: * PDFLD VALUES ARE STORED IN ORDER FROM LEFT TO RIGHT.
3033: * THEY CONTAIN VALUES OR POINTERS TO TRBLK CHAINS.
3034: {{EJC{{{{
3035: *
3036: * PROGRAM DEFINED FUNCTION BLOCK (PFBLK)
3037: *
3038: * A PFBLK IS CREATED FOR EACH CALL TO THE DEFINE FUNCTION
3039: * AND A POINTER TO THE PFBLK PLACED IN THE PROPER VRBLK.
3040: *
3041: * +------------------------------------+
3042: * I FCODE I
3043: * +------------------------------------+
3044: * I FARGS I
3045: * +------------------------------------+
3046: * I PFLEN I
3047: * +------------------------------------+
3048: * I PFVBL I
3049: * +------------------------------------+
3050: * I PFNLO I
3051: * +------------------------------------+
3052: * I PFCOD I
3053: * +------------------------------------+
3054: * I PFCTR I
3055: * +------------------------------------+
3056: * I PFRTR I
3057: * +------------------------------------+
3058: * / /
3059: * / PFARG /
3060: * / /
3061: * +------------------------------------+
3062: *
3063: {PFLEN{EQU{FARGS+1{{{LENGTH OF PFBLK IN BYTES
3064: {PFVBL{EQU{PFLEN+1{{{POINTER TO VRBLK FOR FUNCTION NAME
3065: {PFNLO{EQU{PFVBL+1{{{NUMBER OF LOCALS
3066: {PFCOD{EQU{PFNLO+1{{{PTR TO CDBLK FOR FIRST STATEMENT
3067: {PFCTR{EQU{PFCOD+1{{{TRBLK PTR IF CALL TRACED ELSE 0
3068: {PFRTR{EQU{PFCTR+1{{{TRBLK PTR IF RETURN TRACED ELSE 0
3069: {PFARG{EQU{PFRTR+1{{{VRBLK PTRS FOR ARGUMENTS AND LOCALS
3070: {PFAGB{EQU{PFARG-1{{{OFFSET BEHIND PFARG FOR ARG, LOCAL
3071: {PFSI${EQU{PFARG{{{NUMBER OF STANDARD FIELDS IN PFBLK
3072: *
3073: * THE FCODE FIELD POINTS TO THE ROUTINE B$PFC.
3074: *
3075: * PFARG IS STORED IN THE FOLLOWING ORDER.
3076: *
3077: * ARGUMENTS (LEFT TO RIGHT)
3078: * LOCALS (LEFT TO RIGHT)
3079: {{EJC{{{{
3080: *
3081: * REAL CONSTANT BLOCK (RCBLK)
3082: *
3083: * AN RCBLK IS CREATED FOR EVERY REAL REFERENCED OR
3084: * CREATED BY A PROGRAM.
3085: *
3086: * +------------------------------------+
3087: * I RCGET I
3088: * +------------------------------------+
3089: * * RCVAL *
3090: * +------------------------------------+
3091: *
3092: {RCGET{EQU{0{{{PTR TO ROUTINE B$RCL TO LOAD REAL
3093: {RCVAL{EQU{RCGET+1{{{REAL VALUE
3094: {RCSI${EQU{RCVAL+CFP$R{{{SIZE OF RCBLK
3095: *
3096: * THE LENGTH OF THE RCVAL FIELD IS CFP$R.
3097: {{EJC{{{{
3098: *
3099: * STRING CONSTANT BLOCK (SCBLK)
3100: *
3101: * AN SCBLK IS BUILT FOR EVERY STRING REFERENCED OR CREATED
3102: * BY A PROGRAM.
3103: *
3104: * +------------------------------------+
3105: * I SCGET I
3106: * +------------------------------------+
3107: * I SCLEN I
3108: * +------------------------------------+
3109: * / /
3110: * / SCHAR /
3111: * / /
3112: * +------------------------------------+
3113: *
3114: {SCGET{EQU{0{{{PTR TO ROUTINE B$SCL TO LOAD STRING
3115: {SCLEN{EQU{SCGET+1{{{LENGTH OF STRING IN CHARACTERS
3116: {SCHAR{EQU{SCLEN+1{{{CHARACTERS OF STRING
3117: {SCSI${EQU{SCHAR{{{SIZE OF STANDARD FIELDS IN SCBLK
3118: *
3119: * THE CHARACTERS OF THE STRING ARE STORED LEFT JUSTIFIED.
3120: * THE FINAL WORD IS PADDED ON THE RIGHT WITH ZEROS.
3121: * (I.E. THE CHARACTER WHOSE INTERNAL CODE IS ZERO).
3122: *
3123: * THE VALUE OF SCLEN MAY NOT EXCEED MXLEN. THIS ENSURES
3124: * THAT CHARACTER OFFSETS (E.G. THE PATTERN MATCH CURSOR)
3125: * CAN BE CORRECTLY PROCESSED BY THE GARBAGE COLLECTOR.
3126: *
3127: * NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING
3128: * IS GIVEN IN BYTES BY CFP$F AND THAT THIS VALUE IS
3129: * AUTOMATICALLY ALLOWED FOR IN PLC, PSC.
3130: * NOTE THAT FOR A SPITBOL SCBLK, THE VALUE OF CFP$F
3131: * IS GIVEN BY CFP$B*SCHAR.
3132: {{EJC{{{{
3133: *
3134: * SIMPLE EXPRESSION BLOCK (SEBLK)
3135: *
3136: * AN SEBLK IS USED TO REPRESENT AN EXPRESSION OF THE FORM
3137: * *(NATURAL VARIABLE). ALL OTHER EXPRESSIONS ARE EXBLKS.
3138: *
3139: * +------------------------------------+
3140: * I SETYP I
3141: * +------------------------------------+
3142: * I SEVAR I
3143: * +------------------------------------+
3144: *
3145: {SETYP{EQU{0{{{PTR TO ROUTINE B$SEL TO LOAD EXPR
3146: {SEVAR{EQU{SETYP+1{{{PTR TO VRBLK FOR VARIABLE
3147: {SESI${EQU{SEVAR+1{{{LENGTH OF SEBLK IN WORDS
3148: {{EJC{{{{
3149: *
3150: * STANDARD VARIABLE BLOCK (SVBLK)
3151: *
3152: * AN SVBLK IS ASSEMBLED IN THE CONSTANT SECTION FOR EACH
3153: * VARIABLE WHICH SATISFIES ONE OF THE FOLLOWING CONDITIONS.
3154: *
3155: * 1) IT IS THE NAME OF A SYSTEM FUNCTION
3156: * 2) IT HAS AN INITIAL VALUE
3157: * 3) IT HAS A KEYWORD ASSOCIATION
3158: * 4) IT HAS A STANDARD I/O ASSOCIATION
3159: * 6) IT HAS A STANDARD LABEL ASSOCIATION
3160: *
3161: * IF VRBLKS ARE CONSTRUCTED FOR ANY OF THESE VARIABLES,
3162: * THEN THE VRSVP FIELD POINTS TO THE SVBLK (SEE VRBLK)
3163: *
3164: * +------------------------------------+
3165: * I SVBIT I
3166: * +------------------------------------+
3167: * I SVLEN I
3168: * +------------------------------------+
3169: * I SVCHS I
3170: * +------------------------------------+
3171: * I SVKNM I
3172: * +------------------------------------+
3173: * I SVFNC I
3174: * +------------------------------------+
3175: * I SVNAR I
3176: * +------------------------------------+
3177: * I SVLBL I
3178: * +------------------------------------+
3179: * I SVVAL I
3180: * +------------------------------------+
3181: {{EJC{{{{
3182: *
3183: * STANDARD VARIABLE BLOCK (CONTINUED)
3184: *
3185: {SVBIT{EQU{0{{{BIT STRING INDICATING ATTRIBUTES
3186: {SVLEN{EQU{1{{{(=SCLEN) LENGTH OF NAME IN CHARS
3187: {SVCHS{EQU{2{{{(=SCHAR) CHARACTERS OF NAME
3188: {SVSI${EQU{2{{{NUMBER OF STANDARD FIELDS IN SVBLK
3189: {SVPRE{EQU{1{{{SET IF PREEVALUATION PERMITTED
3190: {SVFFC{EQU{SVPRE+SVPRE{{{SET ON IF FAST CALL PERMITTED
3191: {SVCKW{EQU{SVFFC+SVFFC{{{SET ON IF KEYWORD VALUE CONSTANT
3192: {SVPRD{EQU{SVCKW+SVCKW{{{SET ON IF PREDICATE FUNCTION
3193: {SVNBT{EQU{4{{{NUMBER OF BITS TO RIGHT OF SVKNM
3194: {SVKNM{EQU{SVPRD+SVPRD{{{SET ON IF KEYWORD ASSOCIATION
3195: {SVFNC{EQU{SVKNM+SVKNM{{{SET ON IF SYSTEM FUNCTION
3196: {SVNAR{EQU{SVFNC+SVFNC{{{SET ON IF SYSTEM FUNCTION
3197: {SVLBL{EQU{SVNAR+SVNAR{{{SET ON IF SYSTEM LABEL
3198: {SVVAL{EQU{SVLBL+SVLBL{{{SET ON IF PREDEFINED VALUE
3199: *
3200: * NOTE THAT THE LAST FIVE BITS CORRESPOND IN ORDER
3201: * TO THE FIELDS WHICH ARE PRESENT (SEE PROCEDURE GTNVR).
3202: *
3203: * THE FOLLOWING DEFINITIONS ARE USED IN THE SVBLK TABLE
3204: *
3205: {SVFNF{EQU{SVFNC+SVNAR{{{FUNCTION WITH NO FAST CALL
3206: {SVFNN{EQU{SVFNF+SVFFC{{{FUNCTION WITH FAST CALL, NO PREEVAL
3207: {SVFNP{EQU{SVFNN+SVPRE{{{FUNCTION ALLOWING PREEVALUATION
3208: {SVFPR{EQU{SVFNN+SVPRD{{{PREDICATE FUNCTION
3209: {SVFNK{EQU{SVFNN+SVKNM{{{NO PREEVAL FUNC + KEYWORD
3210: {SVKWV{EQU{SVKNM+SVVAL{{{KEYWORD + VALUE
3211: {SVKWC{EQU{SVCKW+SVKNM{{{KEYWORD WITH CONSTANT VALUE
3212: {SVKVC{EQU{SVKWV+SVCKW{{{CONSTANT KEYWORD + VALUE
3213: {SVKVL{EQU{SVKVC+SVLBL{{{CONSTANT KEYWORD + VALUE + LABEL
3214: {SVFPK{EQU{SVFNP+SVKVC{{{PREEVAL FCN + CONST KEYWD + VAL
3215: *
3216: * THE SVPRE BIT ALLOWS THE COMPILER TO PREEVALUATE A CALL
3217: * TO THE ASSOCIATED SYSTEM FUNCTION IF ALL THE ARGUMENTS
3218: * ARE THEMSELVES CONSTANTS. FUNCTIONS IN THIS CATEGORY
3219: * MUST HAVE NO SIDE EFFECTS AND MUST NEVER CAUSE FAILURE.
3220: * THE CALL MAY GENERATE AN ERROR CONDITION.
3221: *
3222: * THE SVFFC BIT ALLOWS THE COMPILER TO GENERATE THE SPECIAL
3223: * FAST CALL AFTER ADJUSTING THE NUMBER OF ARGUMENTS. ONLY
3224: * THE ITEM AND APPLY FUNCTIONS FALL OUTSIDE THIS CATEGORY.
3225: *
3226: * THE SVCKW BIT IS SET IF THE ASSOCIATED KEYWORD VALUE IS
3227: * A CONSTANT, THUS ALLOWING PREEVALUATION FOR A VALUE CALL.
3228: *
3229: * THE SVPRD BIT IS SET ON FOR ALL PREDICATE FUNCTIONS TO
3230: * ENABLE THE SPECIAL CONCATENATION CODE OPTIMIZATION.
3231: {{EJC{{{{
3232: *
3233: * SVBLK (CONTINUED)
3234: *
3235: * SVKNM KEYWORD NUMBER
3236: *
3237: * SVKNM IS PRESENT ONLY FOR A STANDARD KEYWORD ASSOC.
3238: * IT CONTAINS A KEYWORD NUMBER AS DEFINED BY THE
3239: * KEYWORD NUMBER TABLE GIVEN LATER ON.
3240: *
3241: * SVFNC SYSTEM FUNCTION POINTER
3242: *
3243: * SVFNC IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC.
3244: * IT IS A POINTER TO THE ACTUAL CODE FOR THE SYSTEM
3245: * FUNCTION. THE GENERATED CODE FOR A FAST CALL IS A
3246: * POINTER TO THE SVFNC FIELD OF THE SVBLK FOR THE
3247: * FUNCTION. THE VRFNC FIELD OF THE VRBLK POINTS TO
3248: * THIS SAME FIELD, IN WHICH CASE, IT SERVES AS THE
3249: * FCODE FIELD FOR THE FUNCTION CALL.
3250: *
3251: * SVNAR NUMBER OF FUNCTION ARGUMENTS
3252: *
3253: * SVNAR IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC.
3254: * IT IS THE NUMBER OF ARGUMENTS REQUIRED FOR A CALL
3255: * TO THE SYSTEM FUNCTION. THE COMPILER USES THIS
3256: * VALUE TO ADJUST THE NUMBER OF ARGUMENTS IN A FAST
3257: * CALL AND IN THE CASE OF A FUNCTION CALLED THROUGH
3258: * THE VRFNC FIELD OF THE VRBLK, THE SVNAR FIELD
3259: * SERVES AS THE FARGS FIELD FOR O$FNC. A SPECIAL
3260: * CASE OCCURS IF THIS VALUE IS SET TO 999. THIS IS
3261: * USED TO INDICATE THAT THE FUNCTION HAS A VARIABLE
3262: * NUMBER OF ARGUMENTS AND CAUSES O$FNC TO PASS CONTROL
3263: * WITHOUT ADJUSTING THE ARGUMENT COUNT. THE ONLY
3264: * PREDEFINED FUNCTIONS USING THIS ARE APPLY AND ITEM.
3265: *
3266: * SVLBL SYSTEM LABEL POINTER
3267: *
3268: * SVLBL IS PRESENT ONLY FOR A STANDARD LABEL ASSOC.
3269: * IT IS A POINTER TO A SYSTEM LABEL ROUTINE (L$XXX).
3270: * THE VRLBL FIELD OF THE CORRESPONDING VRBLK POINTS TO
3271: * THE SVLBL FIELD OF THE SVBLK.
3272: *
3273: * SVVAL SYSTEM VALUE POINTER
3274: *
3275: * SVVAL IS PRESENT ONLY FOR A STANDARD VALUE.
3276: * IT IS A POINTER TO THE PATTERN NODE (NDXXX) WHICH
3277: * IS THE STANDARD INITIAL VALUE OF THE VARIABLE.
3278: * THIS VALUE IS COPIED TO THE VRVAL FIELD OF THE VRBLK
3279: {{EJC{{{{
3280: *
3281: * SVBLK (CONTINUED)
3282: *
3283: * KEYWORD NUMBER TABLE
3284: *
3285: * THE FOLLOWING TABLE GIVES SYMBOLIC NAMES FOR KEYWORD
3286: * NUMBERS. THESE VALUES ARE STORED IN THE SVKNM FIELD OF
3287: * SVBLKS AND IN THE KVNUM FIELD OF KVBLKS. SEE ALSO
3288: * PROCEDURES ASIGN, ACESS AND KWNAM.
3289: *
3290: * UNPROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES
3291: *
3292: {K$ABE{EQU{0{{{ABEND
3293: {K$ANC{EQU{K$ABE+CFP$B{{{ANCHOR
3294: {K$CAS{EQU{K$ANC+CFP$B{{{CASE
3295: {K$COD{EQU{K$CAS+CFP$B{{{CODE
3296: {K$DMP{EQU{K$COD+CFP$B{{{DUMP
3297: {K$ERL{EQU{K$DMP+CFP$B{{{ERRLIMIT
3298: {K$ERT{EQU{K$ERL+CFP$B{{{ERRTYPE
3299: {K$FTR{EQU{K$ERT+CFP$B{{{FTRACE
3300: {K$INP{EQU{K$FTR+CFP$B{{{INPUT
3301: {K$MXL{EQU{K$INP+CFP$B{{{MAXLENGTH
3302: {K$OUP{EQU{K$MXL+CFP$B{{{OUTPUT
3303: {K$PFL{EQU{K$OUP+CFP$B{{{PROFILE
3304: {K$TRA{EQU{K$PFL+CFP$B{{{TRACE
3305: {K$TRM{EQU{K$TRA+CFP$B{{{TRIM
3306: *
3307: * PROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES
3308: *
3309: {K$FNC{EQU{K$TRM+CFP$B{{{FNCLEVEL
3310: {K$LST{EQU{K$FNC+CFP$B{{{LASTNO
3311: {K$STN{EQU{K$LST+CFP$B{{{STNO
3312: *
3313: * KEYWORDS WITH CONSTANT PATTERN VALUES
3314: *
3315: {K$ABO{EQU{K$STN+CFP$B{{{ABORT
3316: {K$ARB{EQU{K$ABO+PASI${{{ARB
3317: {K$BAL{EQU{K$ARB+PASI${{{BAL
3318: {K$FAL{EQU{K$BAL+PASI${{{FAIL
3319: {K$FEN{EQU{K$FAL+PASI${{{FENCE
3320: {K$REM{EQU{K$FEN+PASI${{{REM
3321: {K$SUC{EQU{K$REM+PASI${{{SUCCEED
3322: {{EJC{{{{
3323: *
3324: * KEYWORD NUMBER TABLE (CONTINUED)
3325: *
3326: * SPECIAL KEYWORDS
3327: *
3328: {K$ALP{EQU{K$SUC+1{{{ALPHABET
3329: {K$RTN{EQU{K$ALP+1{{{RTNTYPE
3330: {K$STC{EQU{K$RTN+1{{{STCOUNT
3331: {K$ETX{EQU{K$STC+1{{{ERRTEXT
3332: {K$STL{EQU{K$ETX+1{{{STLIMIT
3333: *
3334: * RELATIVE OFFSETS OF SPECIAL KEYWORDS
3335: *
3336: {K$$AL{EQU{K$ALP-K$ALP{{{ALPHABET
3337: {K$$RT{EQU{K$RTN-K$ALP{{{RTNTYPE
3338: {K$$SC{EQU{K$STC-K$ALP{{{STCOUNT
3339: {K$$ET{EQU{K$ETX-K$ALP{{{ERRTEXT
3340: {K$$SL{EQU{K$STL-K$ALP{{{STLIMIT
3341: *
3342: * SYMBOLS USED IN ASIGN AND ACESS PROCEDURES
3343: *
3344: {K$P$${EQU{K$FNC{{{FIRST PROTECTED KEYWORD
3345: {K$V$${EQU{K$ABO{{{FIRST KEYWORD WITH CONSTANT VALUE
3346: {K$S$${EQU{K$ALP{{{FIRST KEYWORD WITH SPECIAL ACESS
3347: {{EJC{{{{
3348: *
3349: * FORMAT OF A TABLE BLOCK (TBBLK)
3350: *
3351: * A TABLE BLOCK IS USED TO REPRESENT A TABLE VALUE.
3352: * IT IS BUILT BY A CALL TO THE TABLE OR CONVERT FUNCTIONS.
3353: *
3354: * +------------------------------------+
3355: * I TBTYP I
3356: * +------------------------------------+
3357: * I IDVAL I
3358: * +------------------------------------+
3359: * I TBLEN I
3360: * +------------------------------------+
3361: * +------------------------------------+
3362: * I TBINV I
3363: * +------------------------------------+
3364: * / /
3365: * / TBBUK /
3366: * / /
3367: * +------------------------------------+
3368: *
3369: {TBTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$TBT
3370: {TBLEN{EQU{OFFS2{{{LENGTH OF TBBLK IN BYTES
3371: {TBINV{EQU{OFFS3{{{DEFAULT INITIAL LOOKUP VALUE
3372: {TBBUK{EQU{TBINV+1{{{START OF HASH BUCKET POINTERS
3373: {TBSI${EQU{TBBUK{{{SIZE OF STANDARD FIELDS IN TBBLK
3374: {TBNBK{EQU{11{{{DEFAULT NO. OF BUCKETS
3375: *
3376: * THE TABLE BLOCK IS A HASH TABLE WHICH POINTS TO CHAINS
3377: * OF TABLE ELEMENT BLOCKS REPRESENTING THE ELEMENTS
3378: * IN THE TABLE WHICH HASH INTO THE SAME BUCKET.
3379: *
3380: * TBBUK ENTRIES EITHER POINT TO THE FIRST TEBLK ON THE
3381: * CHAIN OR THEY POINT TO THE TBBLK ITSELF TO INDICATE THE
3382: * END OF THE CHAIN.
3383: {{EJC{{{{
3384: *
3385: * TABLE ELEMENT BLOCK (TEBLK)
3386: *
3387: * A TABLE ELEMENT IS USED TO REPRESENT A SINGLE ENTRY IN
3388: * A TABLE (SEE DESCRIPTION OF TBBLK FORMAT FOR HASH TABLE)
3389: *
3390: * +------------------------------------+
3391: * I TETYP I
3392: * +------------------------------------+
3393: * I TESUB I
3394: * +------------------------------------+
3395: * I TEVAL I
3396: * +------------------------------------+
3397: * I TENXT I
3398: * +------------------------------------+
3399: *
3400: {TETYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$TET
3401: {TESUB{EQU{TETYP+1{{{SUBSCRIPT VALUE
3402: {TEVAL{EQU{TESUB+1{{{(=VRVAL) TABLE ELEMENT VALUE
3403: {TENXT{EQU{TEVAL+1{{{LINK TO NEXT TEBLK
3404: * SEE S$CNV WHERE RELATION IS ASSUMED WITH TENXT AND TBBUK
3405: {TESI${EQU{TENXT+1{{{SIZE OF TEBLK IN WORDS
3406: *
3407: * TENXT POINTS TO THE NEXT TEBLK ON THE HASH CHAIN FROM THE
3408: * TBBUK CHAIN FOR THIS HASH INDEX. AT THE END OF THE CHAIN,
3409: * TENXT POINTS BACK TO THE START OF THE TBBLK.
3410: *
3411: * TEVAL CONTAINS A DATA POINTER OR A TRBLK POINTER.
3412: *
3413: * TESUB CONTAINS A DATA POINTER.
3414: {{EJC{{{{
3415: *
3416: * TRAP BLOCK (TRBLK)
3417: *
3418: * A TRAP BLOCK IS USED TO REPRESENT A TRACE OR INPUT OR
3419: * OUTPUT ASSOCIATION IN RESPONSE TO A CALL TO THE TRACE
3420: * INPUT OR OUTPUT SYSTEM FUNCTIONS. SEE BELOW FOR DETAILS
3421: *
3422: * +------------------------------------+
3423: * I TRIDN I
3424: * +------------------------------------+
3425: * I TRTYP I
3426: * +------------------------------------+
3427: * I TRVAL OR TRLBL OR TRNXT OR TRKVR I
3428: * +------------------------------------+
3429: * I TRTAG OR TRTER OR TRTRF I
3430: * +------------------------------------+
3431: * I TRFNC OR TRFPT I
3432: * +------------------------------------+
3433: *
3434: {TRIDN{EQU{0{{{POINTER TO DUMMY ROUTINE B$TRT
3435: {TRTYP{EQU{TRIDN+1{{{TRAP TYPE CODE
3436: {TRVAL{EQU{TRTYP+1{{{VALUE OF TRAPPED VARIABLE (=VRVAL)
3437: {TRNXT{EQU{TRVAL{{{PTR TO NEXT TRBLK ON TRBLK CHAIN
3438: {TRLBL{EQU{TRVAL{{{PTR TO ACTUAL LABEL (TRACED LABEL)
3439: {TRKVR{EQU{TRVAL{{{VRBLK POINTER FOR KEYWORD TRACE
3440: {TRTAG{EQU{TRVAL+1{{{TRACE TAG
3441: {TRTER{EQU{TRTAG{{{PTR TO TERMINAL VRBLK OR NULL
3442: {TRTRF{EQU{TRTAG{{{PTR TO TRBLK HOLDING FCBLK PTR
3443: {TRFNC{EQU{TRTAG+1{{{TRACE FUNCTION VRBLK (ZERO IF NONE)
3444: {TRFPT{EQU{TRFNC{{{FCBLK PTR FOR SYSIO
3445: {TRSI${EQU{TRFNC+1{{{NUMBER OF WORDS IN TRBLK
3446: *
3447: {TRTIN{EQU{0{{{TRACE TYPE FOR INPUT ASSOCIATION
3448: {TRTAC{EQU{TRTIN+1{{{TRACE TYPE FOR ACCESS TRACE
3449: {TRTVL{EQU{TRTAC+1{{{TRACE TYPE FOR VALUE TRACE
3450: {TRTOU{EQU{TRTVL+1{{{TRACE TYPE FOR OUTPUT ASSOCIATION
3451: {TRTFC{EQU{TRTOU+1{{{TRACE TYPE FOR FCBLK IDENTIFICATION
3452: {{EJC{{{{
3453: *
3454: * TRAP BLOCK (CONTINUED)
3455: *
3456: * VARIABLE INPUT ASSOCIATION
3457: *
3458: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
3459: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
3460: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
3461: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
3462: *
3463: * TRTYP IS SET TO TRTIN
3464: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
3465: * TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS
3466: * FOR INPUT, TERMINAL, ELSE IT IS NULL.
3467: * TRTRF POINTS TO THE TRAP BLOCK WHICH IN TURN POINTS
3468: * TO AN FCBLK USED FOR I/O ASSOCIATION.
3469: * TRFPT IS THE FCBLK PTR RETURNED BY SYSIO.
3470: *
3471: * VARIABLE ACCESS TRACE ASSOCIATION
3472: *
3473: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
3474: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
3475: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
3476: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
3477: *
3478: * TRTYP IS SET TO TRTAC
3479: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
3480: * TRTAG IS THE TRACE TAG (0 IF NONE)
3481: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
3482: *
3483: * VARIABLE VALUE TRACE ASSOCIATION
3484: *
3485: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
3486: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
3487: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
3488: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
3489: *
3490: * TRTYP IS SET TO TRTVL
3491: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
3492: * TRTAG IS THE TRACE TAG (0 IF NONE)
3493: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
3494: {{EJC{{{{
3495: * TRAP BLOCK (CONTINUED)
3496: *
3497: * VARIABLE OUTPUT ASSOCIATION
3498: *
3499: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
3500: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
3501: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
3502: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
3503: *
3504: * TRTYP IS SET TO TRTOU
3505: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
3506: * TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS
3507: * FOR OUTPUT, TERMINAL, ELSE IT IS NULL.
3508: * TRTRF POINTS TO THE TRAP BLOCK WHICH IN TURN POINTS
3509: * TO AN FCBLK USED FOR I/O ASSOCIATION.
3510: * TRFPT IS THE FCBLK PTR RETURNED BY SYSIO.
3511: *
3512: * FUNCTION CALL TRACE
3513: *
3514: * THE PFCTR FIELD OF THE CORRESPONDING PFBLK IS SET
3515: * TO POINT TO A TRBLK.
3516: *
3517: * TRTYP IS SET TO TRTIN
3518: * TRNXT IS ZERO
3519: * TRTAG IS THE TRACE TAG (0 IF NONE)
3520: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
3521: *
3522: * FUNCTION RETURN TRACE
3523: *
3524: * THE PFRTR FIELD OF THE CORRESPONDING PFBLK IS SET
3525: * TO POINT TO A TRBLK
3526: *
3527: * TRTYP IS SET TO TRTIN
3528: * TRNXT IS ZERO
3529: * TRTAG IS THE TRACE TAG (0 IF NONE)
3530: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
3531: *
3532: * LABEL TRACE
3533: *
3534: * THE VRLBL OF THE VRBLK FOR THE LABEL IS
3535: * CHANGED TO POINT TO A TRBLK AND THE VRTRA FIELD IS
3536: * SET TO B$VRT TO ACTIVATE THE CHECK.
3537: *
3538: * TRTYP IS SET TO TRTIN
3539: * TRLBL POINTS TO THE ACTUAL LABEL (CDBLK) VALUE
3540: * TRTAG IS THE TRACE TAG (0 IF NONE)
3541: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
3542: {{EJC{{{{
3543: *
3544: * TRAP BLOCK (CONTINUED)
3545: *
3546: * KEYWORD TRACE
3547: *
3548: * KEYWORDS WHICH CAN BE TRACED POSSESS A UNIQUE
3549: * LOCATION WHICH IS ZERO IF THERE IS NO TRACE AND
3550: * POINTS TO A TRBLK IF THERE IS A TRACE. THE LOCATIONS
3551: * ARE AS FOLLOWS.
3552: *
3553: * R$ERT ERRTYPE
3554: * R$FNC FNCLEVEL
3555: * R$STC STCOUNT
3556: *
3557: * THE FORMAT OF THE TRBLK IS AS FOLLOWS.
3558: *
3559: * TRTYP IS SET TO TRTIN
3560: * TRKVR IS A POINTER TO THE VRBLK FOR THE KEYWORD
3561: * TRTAG IS THE TRACE TAG (0 IF NONE)
3562: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
3563: *
3564: * INPUT/OUTPUT FILE ARG1 TRAP BLOCK
3565: *
3566: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
3567: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE OF
3568: * A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
3569: * CONTAIN =B$VRA AND =B$VRV. THIS TRAP BLOCK IS USED
3570: * TO HOLD A POINTER TO THE FCBLK WHICH AN
3571: * IMPLEMENTATION MAY REQUEST TO HOLD INFORMATION
3572: * ABOUT A FILE.
3573: *
3574: * TRTYP IS SET TO TRTFC
3575: * TRNEXT POINTS TO NEXT TRBLK OR TRVAL IS VARIABLE VAL
3576: * TRFNM IS 0
3577: * TRFPT IS THE FCBLK POINTER.
3578: *
3579: * NOTE THAT WHEN MULTIPLE TRAPS ARE SET ON A VARIABLE
3580: * THE ORDER IS IN ASCENDING VALUE OF TRTYP FIELD.
3581: *
3582: * INPUT ASSOCIATION (IF PRESENT)
3583: * ACCESS TRACE (IF PRESENT)
3584: * VALUE TRACE (IF PRESENT)
3585: * OUTPUT ASSOCIATION (IF PRESENT)
3586: *
3587: * THE ACTUAL VALUE OF THE VARIABLE IS STORED IN THE TRVAL
3588: * FIELD OF THE LAST TRBLK ON THE CHAIN.
3589: *
3590: * THIS IMPLEMENTATION DOES NOT PERMIT TRACE OR I/O
3591: * ASSOCIATIONS TO ANY OF THE PSEUDO-VARIABLES.
3592: {{EJC{{{{
3593: *
3594: * VECTOR BLOCK (VCBLK)
3595: *
3596: * A VCBLK IS USED TO REPRESENT AN ARRAY VALUE WHICH HAS
3597: * ONE DIMENSION WHOSE LOWER BOUND IS ONE. ALL OTHER ARRAYS
3598: * ARE REPRESENTED BY ARBLKS. A VCBLK IS CREATED BY THE
3599: * SYSTEM FUNCTION ARRAY (S$ARR) WHEN PASSED AN INTEGER ARG.
3600: *
3601: * +------------------------------------+
3602: * I VCTYP I
3603: * +------------------------------------+
3604: * I IDVAL I
3605: * +------------------------------------+
3606: * I VCLEN I
3607: * +------------------------------------+
3608: * I VCVLS I
3609: * +------------------------------------+
3610: *
3611: {VCTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$VCT
3612: {VCLEN{EQU{OFFS2{{{LENGTH OF VCBLK IN BYTES
3613: {VCVLS{EQU{OFFS3{{{START OF VECTOR VALUES
3614: {VCSI${EQU{VCVLS{{{SIZE OF STANDARD FIELDS IN VCBLK
3615: {VCVLB{EQU{VCVLS-1{{{OFFSET ONE WORD BEHIND VCVLS
3616: {VCTBD{EQU{TBSI$-VCSI${{{DIFFERENCE IN SIZES - SEE PRTVL
3617: *
3618: * VCVLS ARE EITHER DATA POINTERS OR TRBLK POINTERS
3619: *
3620: * THE DIMENSION CAN BE DEDUCED FROM VCLEN.
3621: {{EJC{{{{
3622: *
3623: * VARIABLE BLOCK (VRBLK)
3624: *
3625: * A VARIABLE BLOCK IS BUILT IN THE STATIC MEMORY AREA
3626: * FOR EVERY VARIABLE REFERENCED OR CREATED BY A PROGRAM.
3627: *
3628: * NOTE THAT SINCE THESE BLOCKS ONLY OCCUR IN THE STATIC
3629: * REGION, IT IS PERMISSIBLE TO POINT TO ANY WORD IN
3630: * THE BLOCK AND THIS IS USED TO PROVIDE THREE DISTINCT
3631: * ACCESS POINTS FROM THE GENERATED CODE AS FOLLOWS.
3632: *
3633: * 1) POINT TO VRGET (FIRST WORD OF VRBLK) TO LOAD THE
3634: * VALUE OF THE VARIABLE ONTO THE MAIN STACK.
3635: *
3636: * 2) POINT TO VRSTO (SECOND WORD OF VRBLK) TO STORE THE
3637: * TOP STACK ELEMENT AS THE VALUE OF THE VARIABLE.
3638: *
3639: * 3) POINT TO VRTRA (FOURTH WORD OF VRBLK) TO JUMP TO
3640: * THE LABEL ASSOCIATED WITH THE VARIABLE NAME.
3641: *
3642: * +------------------------------------+
3643: * I VRGET I
3644: * +------------------------------------+
3645: * I VRSTO I
3646: * +------------------------------------+
3647: * I VRVAL I
3648: * +------------------------------------+
3649: * I VRTRA I
3650: * +------------------------------------+
3651: * I VRLBL I
3652: * +------------------------------------+
3653: * I VRFNC I
3654: * +------------------------------------+
3655: * I VRNXT I
3656: * +------------------------------------+
3657: * I VRLEN I
3658: * +------------------------------------+
3659: * / /
3660: * / VRCHS = VRSVP /
3661: * / /
3662: * +------------------------------------+
3663: {{EJC{{{{
3664: *
3665: * VARIABLE BLOCK (CONTINUED)
3666: *
3667: {VRGET{EQU{0{{{POINTER TO ROUTINE TO LOAD VALUE
3668: {VRSTO{EQU{VRGET+1{{{POINTER TO ROUTINE TO STORE VALUE
3669: {VRVAL{EQU{VRSTO+1{{{VARIABLE VALUE
3670: {VRVLO{EQU{VRVAL-VRSTO{{{OFFSET TO VALUE FROM STORE FIELD
3671: {VRTRA{EQU{VRVAL+1{{{POINTER TO ROUTINE TO JUMP TO LABEL
3672: {VRLBL{EQU{VRTRA+1{{{POINTER TO CODE FOR LABEL
3673: {VRLBO{EQU{VRLBL-VRTRA{{{OFFSET TO LABEL FROM TRANSFER FIELD
3674: {VRFNC{EQU{VRLBL+1{{{POINTER TO FUNCTION BLOCK
3675: {VRNXT{EQU{VRFNC+1{{{POINTER TO NEXT VRBLK ON HASH CHAIN
3676: {VRLEN{EQU{VRNXT+1{{{LENGTH OF NAME (OR ZERO)
3677: {VRCHS{EQU{VRLEN+1{{{CHARACTERS OF NAME (VRLEN GT 0)
3678: {VRSVP{EQU{VRLEN+1{{{PTR TO SVBLK (VRLEN EQ 0)
3679: {VRSI${EQU{VRCHS+1{{{NUMBER OF STANDARD FIELDS IN VRBLK
3680: {VRSOF{EQU{VRLEN-SCLEN{{{OFFSET TO DUMMY SCBLK FOR NAME
3681: {VRSVO{EQU{VRSVP-VRSOF{{{PSEUDO-OFFSET TO VRSVP FIELD
3682: *
3683: * VRGET = B$VRL IF NOT INPUT ASSOCIATED OR ACCESS TRACED
3684: * VRGET = B$VRA IF INPUT ASSOCIATED OR ACCESS TRACED
3685: *
3686: * VRSTO = B$VRS IF NOT OUTPUT ASSOCIATED OR VALUE TRACED
3687: * VRSTO = B$VRV IF OUTPUT ASSOCIATED OR VALUE TRACED
3688: * VRSTO = B$VRE IF VALUE IS PROTECTED PATTERN VALUE
3689: *
3690: * VRVAL POINTS TO THE APPROPRIATE VALUE UNLESS THE
3691: * VARIABLE IS I/O/TRACE ASSOCIATED IN WHICH CASE, VRVAL
3692: * POINTS TO AN APPROPRIATE TRBLK (TRAP BLOCK) CHAIN.
3693: *
3694: * VRTRA = B$VRG IF THE LABEL IS NOT TRACED
3695: * VRTRA = B$VRT IF THE LABEL IS TRACED
3696: *
3697: * VRLBL POINTS TO A CDBLK IF THERE IS A LABEL
3698: * VRLBL POINTS TO THE SVBLK SVLBL FIELD FOR A SYSTEM LABEL
3699: * VRLBL POINTS TO STNDL FOR AN UNDEFINED LABEL
3700: * VRLBL POINTS TO A TRBLK IF THE LABEL IS TRACED
3701: *
3702: * VRFNC POINTS TO A FFBLK FOR A FIELD FUNCTION
3703: * VRFNC POINTS TO A DFBLK FOR A DATATYPE FUNCTION
3704: * VRFNC POINTS TO A PFBLK FOR A PROGRAM DEFINED FUNCTION
3705: * VRFNC POINTS TO A EFBLK FOR AN EXTERNAL LOADED FUNCTION
3706: * VRFNC POINTS TO SVFNC (SVBLK) FOR A SYSTEM FUNCTION
3707: * VRFNC POINTS TO STNDF IF THE FUNCTION IS UNDEFINED
3708: *
3709: * VRNXT POINTS TO THE NEXT VRBLK ON THIS CHAIN UNLESS
3710: * THIS IS THE END OF THE CHAIN IN WHICH CASE IT IS ZERO.
3711: *
3712: * VRLEN IS THE NAME LENGTH FOR A NON-SYSTEM VARIABLE.
3713: * VRLEN IS ZERO FOR A SYSTEM VARIABLE.
3714: *
3715: * VRCHS IS THE NAME (LJRZ) IF VRLEN IS NON-ZERO.
3716: * VRSVP IS A PTR TO THE SVBLK IF VRLEN IS ZERO.
3717: {{EJC{{{{
3718: *
3719: * FORMAT OF A NON-RELOCATABLE EXTERNAL BLOCK (XNBLK)
3720: *
3721: * AN XNBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL)
3722: * DATA VALUE. THE BLOCK CONTAINS NO POINTERS TO OTHER
3723: * RELOCATABLE BLOCKS. AN XNBLK IS USED BY EXTERNAL FUNCTION
3724: * PROCESSING OR POSSIBLY FOR SYSTEM I/O ROUTINES ETC.
3725: * THE MACRO-SYSTEM ITSELF DOES NOT USE XNBLKS.
3726: * THIS TYPE OF BLOCK MAY BE USED AS A FILE CONTROL BLOCK.
3727: * SEE SYSFC,SYSIN,SYSOU,S$INP,S$OUP FOR DETAILS.
3728: *
3729: * +------------------------------------+
3730: * I XNTYP I
3731: * +------------------------------------+
3732: * I XNLEN I
3733: * +------------------------------------+
3734: * / /
3735: * / XNDTA /
3736: * / /
3737: * +------------------------------------+
3738: *
3739: {XNTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$XNT
3740: {XNLEN{EQU{XNTYP+1{{{LENGTH OF XNBLK IN BYTES
3741: {XNDTA{EQU{XNLEN+1{{{DATA WORDS
3742: {XNSI${EQU{XNDTA{{{SIZE OF STANDARD FIELDS IN XNBLK
3743: *
3744: * NOTE THAT THE TERM NON-RELOCATABLE REFERS TO THE CONTENTS
3745: * AND NOT THE BLOCK ITSELF. AN XNBLK CAN BE MOVED AROUND IF
3746: * IT IS BUILT IN THE DYNAMIC MEMORY AREA.
3747: {{EJC{{{{
3748: *
3749: * RELOCATABLE EXTERNAL BLOCK (XRBLK)
3750: *
3751: * AN XRBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL)
3752: * DATA VALUE. THE DATA AREA IN THIS BLOCK CONSISTS ONLY
3753: * OF ADDRESS VALUES AND ANY ADDRESSES POINTING INTO THE
3754: * DYNAMIC MEMORY AREA MUST POINT TO THE START OF OTHER
3755: * DATA BLOCKS. SEE ALSO DESCRIPTION OF XNBLK.
3756: * THIS TYPE OF BLOCK MAY BE USED AS A FILE CONTROL BLOCK.
3757: * SEE SYSFC,SYSIN,SYSOU,S$INP,S$OUP FOR DETAILS.
3758: *
3759: * +------------------------------------+
3760: * I XRTYP I
3761: * +------------------------------------+
3762: * I XRLEN I
3763: * +------------------------------------+
3764: * / /
3765: * / XRPTR /
3766: * / /
3767: * +------------------------------------+
3768: *
3769: {XRTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$XRT
3770: {XRLEN{EQU{XRTYP+1{{{LENGTH OF XRBLK IN BYTES
3771: {XRPTR{EQU{XRLEN+1{{{START OF ADDRESS POINTERS
3772: {XRSI${EQU{XRPTR{{{SIZE OF STANDARD FIELDS IN XRBLK
3773: {{EJC{{{{
3774: *
3775: * S$CNV (CONVERT) FUNCTION SWITCH CONSTANTS. THE VALUES
3776: * ARE TIED TO THE ORDER OF THE ENTRIES IN THE SVCTB TABLE
3777: * AND HENCE TO THE BRANCH TABLE IN S$CNV.
3778: *
3779: {CNVST{EQU{8{{{MAX STANDARD TYPE CODE FOR CONVERT
3780: {CNVRT{EQU{CNVST+1{{{CONVERT CODE FOR REALS
3781: {CNVBT{EQU{CNVRT+1{{{CONVERT CODE FOR BUFFER
3782: {CNVTT{EQU{CNVBT+1{{{BSW CODE FOR CONVERT
3783: *
3784: * INPUT IMAGE LENGTH
3785: *
3786: {INILN{EQU{132{{{DEFAULT IMAGE LENGTH FOR COMPILER
3787: {INILS{EQU{80{{{IMAGE LENGTH IF -SEQU IN EFFECT
3788: *
3789: {IONMB{EQU{2{{{NAME BASE USED FOR IOCHN IN SYSIO
3790: {IONMO{EQU{4{{{NAME OFFSET USED FOR IOCHN IN SYSIO
3791: *
3792: * IN GENERAL, MEANINGFUL MNEMONICS SHOULD BE USED FOR
3793: * OFFSETS. HOWEVER FOR SMALL INTEGERS USED OFTEN IN
3794: * LITERALS THE FOLLOWING GENERAL DEFINITIONS ARE PROVIDED.
3795: *
3796: {NUM01{EQU{1{{{
3797: {NUM02{EQU{2{{{
3798: {NUM03{EQU{3{{{
3799: {NUM04{EQU{4{{{
3800: {NUM05{EQU{5{{{
3801: {NUM06{EQU{6{{{
3802: {NUM07{EQU{7{{{
3803: {NUM08{EQU{8{{{
3804: {NUM09{EQU{9{{{
3805: {NUM10{EQU{10{{{
3806: {NINI8{EQU{998{{{
3807: {NINI9{EQU{999{{{
3808: {THSND{EQU{1000{{{
3809: {{EJC{{{{
3810: *
3811: * NUMBERS OF UNDEFINED SPITBOL OPERATORS
3812: *
3813: {OPBUN{EQU{5{{{NO. OF BINARY UNDEFINED OPS
3814: {OPUUN{EQU{6{{{NO OF UNARY UNDEFINED OPS
3815: *
3816: * OFFSETS USED IN PRTSN, PRTMI AND ACESS
3817: *
3818: {PRSNF{EQU{13{{{OFFSET USED IN PRTSN
3819: {PRTMF{EQU{15{{{OFFSET TO COL 15 (PRTMI)
3820: {RILEN{EQU{120{{{BUFFER LENGTH FOR SYSRI
3821: *
3822: * CODES FOR STAGES OF PROCESSING
3823: *
3824: {STGIC{EQU{0{{{INITIAL COMPILE
3825: {STGXC{EQU{STGIC+1{{{EXECUTION COMPILE (CODE)
3826: {STGEV{EQU{STGXC+1{{{EXPRESSION EVAL DURING EXECUTION
3827: {STGXT{EQU{STGEV+1{{{EXECUTION TIME
3828: {STGCE{EQU{STGXT+1{{{INITIAL COMPILE AFTER END LINE
3829: {STGXE{EQU{STGCE+1{{{EXEC. COMPILE AFTER END LINE
3830: {STGND{EQU{STGCE-STGIC{{{DIFFERENCE IN STAGE AFTER END
3831: {STGEE{EQU{STGXE+1{{{EVAL EVALUATING EXPRESSION
3832: {STGNO{EQU{STGEE+1{{{NUMBER OF CODES
3833: {{EJC{{{{
3834: *
3835: *
3836: * STATEMENT NUMBER PAD COUNT FOR LISTR
3837: *
3838: {STNPD{EQU{8{{{STATEMENT NO. PAD COUNT
3839: *
3840: * SYNTAX TYPE CODES
3841: *
3842: * THESE CODES ARE RETURNED FROM THE SCANE PROCEDURE.
3843: *
3844: * THEY ARE SPACED 3 APART FOR THE BENEFIT OF EXPAN.
3845: *
3846: {T$UOP{EQU{0{{{UNARY OPERATOR
3847: {T$LPR{EQU{T$UOP+3{{{LEFT PAREN
3848: {T$LBR{EQU{T$LPR+3{{{LEFT BRACKET
3849: {T$CMA{EQU{T$LBR+3{{{COMMA
3850: {T$FNC{EQU{T$CMA+3{{{FUNCTION CALL
3851: {T$VAR{EQU{T$FNC+3{{{VARIABLE
3852: {T$CON{EQU{T$VAR+3{{{CONSTANT
3853: {T$BOP{EQU{T$CON+3{{{BINARY OPERATOR
3854: {T$RPR{EQU{T$BOP+3{{{RIGHT PAREN
3855: {T$RBR{EQU{T$RPR+3{{{RIGHT BRACKET
3856: {T$COL{EQU{T$RBR+3{{{COLON
3857: {T$SMC{EQU{T$COL+3{{{SEMI-COLON
3858: *
3859: * THE FOLLOWING DEFINITIONS ARE USED ONLY IN THE GOTO FIELD
3860: *
3861: {T$FGO{EQU{T$SMC+1{{{FAILURE GOTO
3862: {T$SGO{EQU{T$FGO+1{{{SUCCESS GOTO
3863: *
3864: * THE ABOVE CODES ARE GROUPED SO THAT CODES FOR ELEMENTS
3865: * WHICH CAN LEGITIMATELY IMMEDIATELY PRECEDE A UNARY
3866: * OPERATOR COME FIRST TO FACILITATE OPERATOR SYNTAX CHECK.
3867: *
3868: {T$UOK{EQU{T$FNC{{{LAST CODE OK BEFORE UNARY OPERATOR
3869: {{EJC{{{{
3870: *
3871: * DEFINITIONS OF VALUES FOR EXPAN JUMP TABLE
3872: *
3873: {T$UO0{EQU{T$UOP+0{{{UNARY OPERATOR, STATE ZERO
3874: {T$UO1{EQU{T$UOP+1{{{UNARY OPERATOR, STATE ONE
3875: {T$UO2{EQU{T$UOP+2{{{UNARY OPERATOR, STATE TWO
3876: {T$LP0{EQU{T$LPR+0{{{LEFT PAREN, STATE ZERO
3877: {T$LP1{EQU{T$LPR+1{{{LEFT PAREN, STATE ONE
3878: {T$LP2{EQU{T$LPR+2{{{LEFT PAREN, STATE TWO
3879: {T$LB0{EQU{T$LBR+0{{{LEFT BRACKET, STATE ZERO
3880: {T$LB1{EQU{T$LBR+1{{{LEFT BRACKET, STATE ONE
3881: {T$LB2{EQU{T$LBR+2{{{LEFT BRACKET, STATE TWO
3882: {T$CM0{EQU{T$CMA+0{{{COMMA, STATE ZERO
3883: {T$CM1{EQU{T$CMA+1{{{COMMA, STATE ONE
3884: {T$CM2{EQU{T$CMA+2{{{COMMA, STATE TWO
3885: {T$FN0{EQU{T$FNC+0{{{FUNCTION CALL, STATE ZERO
3886: {T$FN1{EQU{T$FNC+1{{{FUNCTION CALL, STATE ONE
3887: {T$FN2{EQU{T$FNC+2{{{FUNCTION CALL, STATE TWO
3888: {T$VA0{EQU{T$VAR+0{{{VARIABLE, STATE ZERO
3889: {T$VA1{EQU{T$VAR+1{{{VARIABLE, STATE ONE
3890: {T$VA2{EQU{T$VAR+2{{{VARIABLE, STATE TWO
3891: {T$CO0{EQU{T$CON+0{{{CONSTANT, STATE ZERO
3892: {T$CO1{EQU{T$CON+1{{{CONSTANT, STATE ONE
3893: {T$CO2{EQU{T$CON+2{{{CONSTANT, STATE TWO
3894: {T$BO0{EQU{T$BOP+0{{{BINARY OPERATOR, STATE ZERO
3895: {T$BO1{EQU{T$BOP+1{{{BINARY OPERATOR, STATE ONE
3896: {T$BO2{EQU{T$BOP+2{{{BINARY OPERATOR, STATE TWO
3897: {T$RP0{EQU{T$RPR+0{{{RIGHT PAREN, STATE ZERO
3898: {T$RP1{EQU{T$RPR+1{{{RIGHT PAREN, STATE ONE
3899: {T$RP2{EQU{T$RPR+2{{{RIGHT PAREN, STATE TWO
3900: {T$RB0{EQU{T$RBR+0{{{RIGHT BRACKET, STATE ZERO
3901: {T$RB1{EQU{T$RBR+1{{{RIGHT BRACKET, STATE ONE
3902: {T$RB2{EQU{T$RBR+2{{{RIGHT BRACKET, STATE TWO
3903: {T$CL0{EQU{T$COL+0{{{COLON, STATE ZERO
3904: {T$CL1{EQU{T$COL+1{{{COLON, STATE ONE
3905: {T$CL2{EQU{T$COL+2{{{COLON, STATE TWO
3906: {T$SM0{EQU{T$SMC+0{{{SEMICOLON, STATE ZERO
3907: {T$SM1{EQU{T$SMC+1{{{SEMICOLON, STATE ONE
3908: {T$SM2{EQU{T$SMC+2{{{SEMICOLON, STATE TWO
3909: *
3910: {T$NES{EQU{T$SM2+1{{{NUMBER OF ENTRIES IN BRANCH TABLE
3911: {{EJC{{{{
3912: *
3913: * DEFINITION OF OFFSETS USED IN CONTROL CARD PROCESSING
3914: *
3915: {CC$CA{EQU{0{{{-CASE
3916: {CC$DO{EQU{CC$CA+1{{{-DOUBLE
3917: {CC$DU{EQU{CC$DO+1{{{-DUMP
3918: {CC$EJ{EQU{CC$DU+1{{{-EJECT
3919: {CC$ER{EQU{CC$EJ+1{{{-ERRORS
3920: {CC$EX{EQU{CC$ER+1{{{-EXECUTE
3921: {CC$FA{EQU{CC$EX+1{{{-FAIL
3922: {CC$LI{EQU{CC$FA+1{{{-LIST
3923: {CC$NR{EQU{CC$LI+1{{{-NOERRORS
3924: {CC$NX{EQU{CC$NR+1{{{-NOEXECUTE
3925: {CC$NF{EQU{CC$NX+1{{{-NOFAIL
3926: {CC$NL{EQU{CC$NF+1{{{-NOLIST
3927: {CC$NO{EQU{CC$NL+1{{{-NOOPT
3928: {CC$NP{EQU{CC$NO+1{{{-NOPRINT
3929: {CC$OP{EQU{CC$NP+1{{{-OPTIMISE
3930: {CC$PR{EQU{CC$OP+1{{{-PRINT
3931: {CC$SI{EQU{CC$PR+1{{{-SINGLE
3932: {CC$SP{EQU{CC$SI+1{{{-SPACE
3933: {CC$ST{EQU{CC$SP+1{{{-STITL
3934: {CC$TI{EQU{CC$ST+1{{{-TITLE
3935: {CC$TR{EQU{CC$TI+1{{{-TRACE
3936: {CC$NC{EQU{CC$TR+1{{{NUMBER OF CONTROL CARDS
3937: {CCNOC{EQU{4{{{NO. OF CHARS INCLUDED IN MATCH
3938: {CCOFS{EQU{7{{{OFFSET TO START OF TITLE/SUBTITLE
3939: {{EJC{{{{
3940: *
3941: * DEFINITIONS OF STACK OFFSETS USED IN CMPIL PROCEDURE
3942: *
3943: * SEE DESCRIPTION AT START OF CMPIL PROCEDURE FOR DETAILS
3944: * OF USE OF THESE LOCATIONS ON THE STACK.
3945: *
3946: {CMSTM{EQU{0{{{TREE FOR STATEMENT BODY
3947: {CMSGO{EQU{CMSTM+1{{{TREE FOR SUCCESS GOTO
3948: {CMFGO{EQU{CMSGO+1{{{TREE FOR FAIL GOTO
3949: {CMCGO{EQU{CMFGO+1{{{CONDITIONAL GOTO FLAG
3950: {CMPCD{EQU{CMCGO+1{{{PREVIOUS CDBLK POINTER
3951: {CMFFP{EQU{CMPCD+1{{{FAILURE FILL IN FLAG FOR PREVIOUS
3952: {CMFFC{EQU{CMFFP+1{{{FAILURE FILL IN FLAG FOR CURRENT
3953: {CMSOP{EQU{CMFFC+1{{{SUCCESS FILL IN OFFSET FOR PREVIOUS
3954: {CMSOC{EQU{CMSOP+1{{{SUCCESS FILL IN OFFSET FOR CURRENT
3955: {CMLBL{EQU{CMSOC+1{{{PTR TO VRBLK FOR CURRENT LABEL
3956: {CMTRA{EQU{CMLBL+1{{{PTR TO ENTRY CDBLK
3957: *
3958: {CMNEN{EQU{CMTRA+1{{{COUNT OF STACK ENTRIES FOR CMPIL
3959: *
3960: * A FEW CONSTANTS USED BY THE PROFILER
3961: {PFPD1{EQU{8{{{PAD POSITIONS ...
3962: {PFPD2{EQU{20{{{... FOR PROFILE ...
3963: {PFPD3{EQU{32{{{... PRINTOUT
3964: {PF$I2{EQU{CFP$I+CFP$I{{{SIZE OF TABLE ENTRY (2 INTS)
3965: *
3966: {{TTL{S{{{P I T B O L -- CONSTANT SECTION
3967: *
3968: * THIS SECTION CONSISTS ENTIRELY OF ASSEMBLED CONSTANTS.
3969: *
3970: * ALL LABEL NAMES ARE FIVE LETTERS. THE ORDER IS
3971: * APPROXIMATELY ALPHABETICAL, BUT IN SOME CASES (ALWAYS
3972: * DOCUMENTED), CONSTANTS MUST BE PLACED IN SOME SPECIAL
3973: * ORDER WHICH MUST NOT BE DISTURBED.
3974: *
3975: * IT MUST ALSO BE REMEMBERED THAT THERE IS A REQUIREMENT
3976: * FOR NO FORWARD REFERENCES WHICH ALSO DISTURBS THE
3977: * ALPHABETICAL ORDER IN SOME CASES.
3978: *
3979: {{SEC{{{{START OF CONSTANT SECTION
3980: *
3981: * FREE STORE PERCENTAGE (USED BY ALLOC)
3982: *
3983: {ALFSP{DAC{E$FSP{{{FREE STORE PERCENTAGE
3984: *
3985: * BIT CONSTANTS FOR GENERAL USE
3986: *
3987: {BITS0{DBC{0{{{ALL ZERO BITS
3988: {BITS1{DBC{1{{{ONE BIT IN LOW ORDER POSITION
3989: {BITS2{DBC{2{{{BIT IN POSITION 2
3990: {BITS3{DBC{4{{{BIT IN POSITION 3
3991: {BITS4{DBC{8{{{BIT IN POSITION 4
3992: {BITS5{DBC{16{{{BIT IN POSITION 5
3993: {BITS6{DBC{32{{{BIT IN POSITION 6
3994: {BITS7{DBC{64{{{BIT IN POSITION 7
3995: {BITS8{DBC{128{{{BIT IN POSITION 8
3996: {BITS9{DBC{256{{{BIT IN POSITION 9
3997: {BIT10{DBC{512{{{BIT IN POSITION 10
3998: {BITSM{DBC{CFP$M{{{MASK FOR MAX INTEGER
3999: *
4000: * BIT CONSTANTS FOR SVBLK (SVBIT FIELD) TESTS
4001: *
4002: {BTFNC{DBC{SVFNC{{{BIT TO TEST FOR FUNCTION
4003: {BTKNM{DBC{SVKNM{{{BIT TO TEST FOR KEYWORD NUMBER
4004: {BTLBL{DBC{SVLBL{{{BIT TO TEST FOR LABEL
4005: {BTFFC{DBC{SVFFC{{{BIT TO TEST FOR FAST CALL
4006: {BTCKW{DBC{SVCKW{{{BIT TO TEST FOR CONSTANT KEYWORD
4007: {BTPRD{DBC{SVPRD{{{BIT TO TEST FOR PREDICATE FUNCTION
4008: {BTPRE{DBC{SVPRE{{{BIT TO TEST FOR PREEVALUATION
4009: {BTVAL{DBC{SVVAL{{{BIT TO TEST FOR VALUE
4010: {{EJC{{{{
4011: *
4012: * LIST OF NAMES USED FOR CONTROL CARD PROCESSING
4013: *
4014: {CCNMS{DTC{/CASE/{{{
4015: {{DTC{/DOUB/{{{
4016: {{DTC{/DUMP/{{{
4017: {{DTC{/EJEC/{{{
4018: {{DTC{/ERRO/{{{
4019: {{DTC{/EXEC/{{{
4020: {{DTC{/FAIL/{{{
4021: {{DTC{/LIST/{{{
4022: {{DTC{/NOER/{{{
4023: {{DTC{/NOEX/{{{
4024: {{DTC{/NOFA/{{{
4025: {{DTC{/NOLI/{{{
4026: {{DTC{/NOOP/{{{
4027: {{DTC{/NOPR/{{{
4028: {{DTC{/OPTI/{{{
4029: {{DTC{/PRIN/{{{
4030: {{DTC{/SING/{{{
4031: {{DTC{/SPAC/{{{
4032: {{DTC{/STIT/{{{
4033: {{DTC{/TITL/{{{
4034: {{DTC{/TRAC/{{{
4035: *
4036: * HEADER MESSAGES FOR DUMPR PROCEDURE (SCBLK FORMAT)
4037: *
4038: {DMHDK{DAC{B$SCL{{{DUMP OF KEYWORD VALUES
4039: {{DAC{22{{{
4040: {{DTC{/DUMP OF KEYWORD VALUES/{{{
4041: *
4042: {DMHDV{DAC{B$SCL{{{DUMP OF NATURAL VARIABLES
4043: {{DAC{25{{{
4044: {{DTC{/DUMP OF NATURAL VARIABLES/{{{
4045: {{EJC{{{{
4046: *
4047: * MESSAGE TEXT FOR COMPILATION STATISTICS
4048: *
4049: {ENCM1{DAC{B$SCL{{{
4050: {{DAC{10{{{
4051: {{DTC{/STORE USED/{{{
4052: *
4053: {ENCM2{DAC{B$SCL{{{
4054: {{DAC{10{{{
4055: {{DTC{/STORE LEFT/{{{
4056: *
4057: {ENCM3{DAC{B$SCL{{{
4058: {{DAC{11{{{
4059: {{DTC{/COMP ERRORS/{{{
4060: *
4061: {ENCM4{DAC{B$SCL{{{
4062: {{DAC{14{{{
4063: {{DTC{/COMP TIME-MSEC/{{{
4064: *
4065: {ENCM5{DAC{B$SCL{{{EXECUTION SUPPRESSED
4066: {{DAC{20{{{
4067: {{DTC{/EXECUTION SUPPRESSED/{{{
4068: *
4069: * STRING CONSTANT FOR ABNORMAL END
4070: *
4071: {ENDAB{DAC{B$SCL{{{
4072: {{DAC{12{{{
4073: {{DTC{/ABNORMAL END/{{{
4074: {{EJC{{{{
4075: *
4076: * MEMORY OVERFLOW DURING INITIALISATION
4077: *
4078: {ENDMO{DAC{B$SCL{{{
4079: {ENDML{DAC{15{{{
4080: {{DTC{/MEMORY OVERFLOW/{{{
4081: *
4082: * STRING CONSTANT FOR MESSAGE ISSUED BY L$END
4083: *
4084: {ENDMS{DAC{B$SCL{{{
4085: {{DAC{10{{{
4086: {{DTC{/NORMAL END/{{{
4087: *
4088: * FAIL MESSAGE FOR STACK FAIL SECTION
4089: *
4090: {ENDSO{DAC{B$SCL{{{STACK OVERFLOW IN GARBAGE COLLECTOR
4091: {{DAC{36{{{
4092: {{DTC{/STACK OVERFLOW IN GARBAGE COLLECTION/{{{
4093: *
4094: * STRING CONSTANT FOR TIME UP
4095: *
4096: {ENDTU{DAC{B$SCL{{{
4097: {{DAC{15{{{
4098: {{DTC{/ERROR - TIME UP/{{{
4099: {{EJC{{{{
4100: *
4101: * STRING CONSTANT FOR ERROR MESSAGE (ERROR SECTION)
4102: *
4103: {ERMMS{DAC{B$SCL{{{ERROR
4104: {{DAC{5{{{
4105: {{DTC{/ERROR/{{{
4106: *
4107: {ERMNS{DAC{B$SCL{{{STRING / -- /
4108: {{DAC{4{{{
4109: {{DTC{/ -- /{{{
4110: *
4111: * STRING CONSTANT FOR PAGE NUMBERING
4112: *
4113: {LSTMS{DAC{B$SCL{{{PAGE
4114: {{DAC{5{{{
4115: {{DTC{/PAGE /{{{
4116: *
4117: * LISTING HEADER MESSAGE
4118: *
4119: {HEADR{DAC{B$SCL{{{
4120: {{DAC{25{{{
4121: {{DTC{/MACRO SPITBOL VERSION 3.5/{{{
4122: *
4123: {HEADV{DAC{B$SCL{{{FOR EXIT() VERSION NO. CHECK
4124: {{DAC{3{{{
4125: {{DTC{/3.5/{{{
4126: *
4127: * INTEGER CONSTANTS FOR GENERAL USE
4128: * ICBLD OPTIMISATION USES THE FIRST THREE.
4129: *
4130: {INT$R{DAC{B$ICL{{{
4131: {INTV0{DIC{+0{{{0
4132: {INTON{DAC{B$ICL{{{
4133: {INTV1{DIC{+1{{{1
4134: {INTTW{DAC{B$ICL{{{
4135: {INTV2{DIC{+2{{{2
4136: {INTVT{DIC{+10{{{10
4137: {INTVH{DIC{+100{{{100
4138: {INTTH{DIC{+1000{{{1000
4139: *
4140: * TABLE USED IN ICBLD OPTIMISATION
4141: *
4142: {INTAB{DAC{INT$R{{{POINTER TO 0
4143: {{DAC{INTON{{{POINTER TO 1
4144: {{DAC{INTTW{{{POINTER TO 2
4145: {{EJC{{{{
4146: *
4147: * SPECIAL PATTERN NODES. THE FOLLOWING PATTERN NODES
4148: * CONSIST SIMPLY OF A PCODE POINTER, SEE MATCH ROUTINES
4149: * (P$XXX) FOR FULL DETAILS OF THEIR USE AND FORMAT).
4150: *
4151: {NDABB{DAC{P$ABB{{{ARBNO
4152: {NDABD{DAC{P$ABD{{{ARBNO
4153: {NDARC{DAC{P$ARC{{{ARB
4154: {NDEXB{DAC{P$EXB{{{EXPRESSION
4155: {NDFNB{DAC{P$FNB{{{FENCE()
4156: {NDFND{DAC{P$FND{{{FENCE()
4157: {NDEXC{DAC{P$EXC{{{EXPRESSION
4158: {NDIMB{DAC{P$IMB{{{IMMEDIATE ASSIGNMENT
4159: {NDIMD{DAC{P$IMD{{{IMMEDIATE ASSIGNMENT
4160: {NDNTH{DAC{P$NTH{{{PATTERN END (NULL PATTERN)
4161: {NDPAB{DAC{P$PAB{{{PATTERN ASSIGNMENT
4162: {NDPAD{DAC{P$PAD{{{PATTERN ASSIGNMENT
4163: {NDUNA{DAC{P$UNA{{{ANCHOR POINT MOVEMENT
4164: *
4165: * KEYWORD CONSTANT PATTERN NODES. THE FOLLOWING NODES ARE
4166: * USED AS THE VALUES OF PATTERN KEYWORDS AND THE INITIAL
4167: * VALUES OF THE CORRESPONDING NATURAL VARIABLES. ALL
4168: * NODES ARE IN P0BLK FORMAT AND THE ORDER IS TIED TO THE
4169: * DEFINITIONS OF CORRESPONDING K$XXX SYMBOLS.
4170: *
4171: {NDABO{DAC{P$ABO{{{ABORT
4172: {{DAC{NDNTH{{{
4173: {NDARB{DAC{P$ARB{{{ARB
4174: {{DAC{NDNTH{{{
4175: {NDBAL{DAC{P$BAL{{{BAL
4176: {{DAC{NDNTH{{{
4177: {NDFAL{DAC{P$FAL{{{FAIL
4178: {{DAC{NDNTH{{{
4179: {NDFEN{DAC{P$FEN{{{FENCE
4180: {{DAC{NDNTH{{{
4181: {NDREM{DAC{P$REM{{{REM
4182: {{DAC{NDNTH{{{
4183: {NDSUC{DAC{P$SUC{{{SUCCEED
4184: {{DAC{NDNTH{{{
4185: *
4186: * NULL STRING. ALL NULL VALUES POINT TO THIS STRING. THE
4187: * SVCHS FIELD CONTAINS A BLANK TO PROVIDE FOR EASY DEFAULT
4188: * PROCESSING IN TRACE, STOPTR, LPAD AND RPAD.
4189: * NULLW CONTAINS 10 BLANKS WHICH ENSURES AN ALL BLANK WORD
4190: * BUT FOR VERY EXCEPTIONAL MACHINES.
4191: *
4192: {NULLS{DAC{B$SCL{{{NULL STRING VALUE
4193: {{DAC{0{{{SCLEN = 0
4194: {NULLW{DTC{/ /{{{
4195: {{EJC{{{{
4196: *
4197: * OPERATOR DOPE VECTORS (SEE DVBLK FORMAT)
4198: *
4199: {OPDVC{DAC{O$CNC{{{CONCATENATION
4200: {{DAC{C$CNC{{{
4201: {{DAC{LLCNC{{{
4202: {{DAC{RRCNC{{{
4203: *
4204: * OPDVS IS USED WHEN SCANNING BELOW THE TOP LEVEL TO
4205: * INSURE THAT THE CONCATENATION WILL NOT BE LATER
4206: * MISTAKEN FOR PATTERN MATCHING
4207: *
4208: {OPDVP{DAC{O$CNC{{{CONCATENATION - NOT PATTERN MATCH
4209: {{DAC{C$CNP{{{
4210: {{DAC{LLCNC{{{
4211: {{DAC{RRCNC{{{
4212: *
4213: * NOTE THAT THE ORDER OF THE REMAINING ENTRIES IS TIED TO
4214: * THE ORDER OF THE CODING IN THE SCANE PROCEDURE.
4215: *
4216: {OPDVS{DAC{O$ASS{{{ASSIGNMENT
4217: {{DAC{C$ASS{{{
4218: {{DAC{LLASS{{{
4219: {{DAC{RRASS{{{
4220: *
4221: {{DAC{6{{{UNARY EQUAL
4222: {{DAC{C$UUO{{{
4223: {{DAC{LLUNO{{{
4224: *
4225: {{DAC{O$PMV{{{PATTERN MATCH
4226: {{DAC{C$PMT{{{
4227: {{DAC{LLPMT{{{
4228: {{DAC{RRPMT{{{
4229: *
4230: {{DAC{O$INT{{{INTERROGATION
4231: {{DAC{C$UVL{{{
4232: {{DAC{LLUNO{{{
4233: *
4234: {{DAC{1{{{BINARY AMPERSAND
4235: {{DAC{C$UBO{{{
4236: {{DAC{LLAMP{{{
4237: {{DAC{RRAMP{{{
4238: *
4239: {{DAC{O$KWV{{{KEYWORD REFERENCE
4240: {{DAC{C$KEY{{{
4241: {{DAC{LLUNO{{{
4242: *
4243: {{DAC{O$ALT{{{ALTERNATION
4244: {{DAC{C$ALT{{{
4245: {{DAC{LLALT{{{
4246: {{DAC{RRALT{{{
4247: {{EJC{{{{
4248: *
4249: * OPERATOR DOPE VECTORS (CONTINUED)
4250: *
4251: {{DAC{5{{{UNARY VERTICAL BAR
4252: {{DAC{C$UUO{{{
4253: {{DAC{LLUNO{{{
4254: *
4255: {{DAC{0{{{BINARY AT
4256: {{DAC{C$UBO{{{
4257: {{DAC{LLATS{{{
4258: {{DAC{RRATS{{{
4259: *
4260: {{DAC{O$CAS{{{CURSOR ASSIGNMENT
4261: {{DAC{C$UNM{{{
4262: {{DAC{LLUNO{{{
4263: *
4264: {{DAC{2{{{BINARY NUMBER SIGN
4265: {{DAC{C$UBO{{{
4266: {{DAC{LLNUM{{{
4267: {{DAC{RRNUM{{{
4268: *
4269: {{DAC{7{{{UNARY NUMBER SIGN
4270: {{DAC{C$UUO{{{
4271: {{DAC{LLUNO{{{
4272: *
4273: {{DAC{O$DVD{{{DIVISION
4274: {{DAC{C$BVL{{{
4275: {{DAC{LLDVD{{{
4276: {{DAC{RRDVD{{{
4277: *
4278: {{DAC{9{{{UNARY SLASH
4279: {{DAC{C$UUO{{{
4280: {{DAC{LLUNO{{{
4281: *
4282: {{DAC{O$MLT{{{MULTIPLICATION
4283: {{DAC{C$BVL{{{
4284: {{DAC{LLMLT{{{
4285: {{DAC{RRMLT{{{
4286: {{EJC{{{{
4287: *
4288: * OPERATOR DOPE VECTORS (CONTINUED)
4289: *
4290: {{DAC{0{{{DEFERRED EXPRESSION
4291: {{DAC{C$DEF{{{
4292: {{DAC{LLUNO{{{
4293: *
4294: {{DAC{3{{{BINARY PERCENT
4295: {{DAC{C$UBO{{{
4296: {{DAC{LLPCT{{{
4297: {{DAC{RRPCT{{{
4298: *
4299: {{DAC{8{{{UNARY PERCENT
4300: {{DAC{C$UUO{{{
4301: {{DAC{LLUNO{{{
4302: *
4303: {{DAC{O$EXP{{{EXPONENTIATION
4304: {{DAC{C$BVL{{{
4305: {{DAC{LLEXP{{{
4306: {{DAC{RREXP{{{
4307: *
4308: {{DAC{10{{{UNARY EXCLAMATION
4309: {{DAC{C$UUO{{{
4310: {{DAC{LLUNO{{{
4311: *
4312: {{DAC{O$IMA{{{IMMEDIATE ASSIGNMENT
4313: {{DAC{C$BVN{{{
4314: {{DAC{LLDLD{{{
4315: {{DAC{RRDLD{{{
4316: *
4317: {{DAC{O$INV{{{INDIRECTION
4318: {{DAC{C$IND{{{
4319: {{DAC{LLUNO{{{
4320: *
4321: {{DAC{4{{{BINARY NOT
4322: {{DAC{C$UBO{{{
4323: {{DAC{LLNOT{{{
4324: {{DAC{RRNOT{{{
4325: *
4326: {{DAC{0{{{NEGATION
4327: {{DAC{C$NEG{{{
4328: {{DAC{LLUNO{{{
4329: {{EJC{{{{
4330: *
4331: * OPERATOR DOPE VECTORS (CONTINUED)
4332: *
4333: {{DAC{O$SUB{{{SUBTRACTION
4334: {{DAC{C$BVL{{{
4335: {{DAC{LLPLM{{{
4336: {{DAC{RRPLM{{{
4337: *
4338: {{DAC{O$COM{{{COMPLEMENTATION
4339: {{DAC{C$UVL{{{
4340: {{DAC{LLUNO{{{
4341: *
4342: {{DAC{O$ADD{{{ADDITION
4343: {{DAC{C$BVL{{{
4344: {{DAC{LLPLM{{{
4345: {{DAC{RRPLM{{{
4346: *
4347: {{DAC{O$AFF{{{AFFIRMATION
4348: {{DAC{C$UVL{{{
4349: {{DAC{LLUNO{{{
4350: *
4351: {{DAC{O$PAS{{{PATTERN ASSIGNMENT
4352: {{DAC{C$BVN{{{
4353: {{DAC{LLDLD{{{
4354: {{DAC{RRDLD{{{
4355: *
4356: {{DAC{O$NAM{{{NAME REFERENCE
4357: {{DAC{C$UNM{{{
4358: {{DAC{LLUNO{{{
4359: *
4360: * SPECIAL DVS FOR GOTO OPERATORS (SEE PROCEDURE SCNGF)
4361: *
4362: {OPDVD{DAC{O$GOD{{{DIRECT GOTO
4363: {{DAC{C$UVL{{{
4364: {{DAC{LLUNO{{{
4365: *
4366: {OPDVN{DAC{O$GOC{{{COMPLEX NORMAL GOTO
4367: {{DAC{C$UNM{{{
4368: {{DAC{LLUNO{{{
4369: {{EJC{{{{
4370: *
4371: * OPERATOR ENTRY ADDRESS POINTERS, USED IN CODE
4372: *
4373: {OAMN${DAC{O$AMN{{{ARRAY REF (MULTI-SUBS BY VALUE)
4374: {OAMV${DAC{O$AMV{{{ARRAY REF (MULTI-SUBS BY VALUE)
4375: {OAON${DAC{O$AON{{{ARRAY REF (ONE SUB BY NAME)
4376: {OAOV${DAC{O$AOV{{{ARRAY REF (ONE SUB BY VALUE)
4377: {OCER${DAC{O$CER{{{COMPILATION ERROR
4378: {OFEX${DAC{O$FEX{{{FAILURE IN EXPRESSION EVALUATION
4379: {OFIF${DAC{O$FIF{{{FAILURE DURING GOTO EVALUATION
4380: {OFNC${DAC{O$FNC{{{FUNCTION CALL (MORE THAN ONE ARG)
4381: {OFNE${DAC{O$FNE{{{FUNCTION NAME ERROR
4382: {OFNS${DAC{O$FNS{{{FUNCTION CALL (SINGLE ARGUMENT)
4383: {OGOF${DAC{O$GOF{{{SET GOTO FAILURE TRAP
4384: {OINN${DAC{O$INN{{{INDIRECTION BY NAME
4385: {OKWN${DAC{O$KWN{{{KEYWORD REFERENCE BY NAME
4386: {OLEX${DAC{O$LEX{{{LOAD EXPRESSION BY NAME
4387: {OLPT${DAC{O$LPT{{{LOAD PATTERN
4388: {OLVN${DAC{O$LVN{{{LOAD VARIABLE NAME
4389: {ONTA${DAC{O$NTA{{{NEGATION, FIRST ENTRY
4390: {ONTB${DAC{O$NTB{{{NEGATION, SECOND ENTRY
4391: {ONTC${DAC{O$NTC{{{NEGATION, THIRD ENTRY
4392: {OPMN${DAC{O$PMN{{{PATTERN MATCH BY NAME
4393: {OPMS${DAC{O$PMS{{{PATTERN MATCH (STATEMENT)
4394: {OPOP${DAC{O$POP{{{POP TOP STACK ITEM
4395: {ORNM${DAC{O$RNM{{{RETURN NAME FROM EXPRESSION
4396: {ORPL${DAC{O$RPL{{{PATTERN REPLACEMENT
4397: {ORVL${DAC{O$RVL{{{RETURN VALUE FROM EXPRESSION
4398: {OSLA${DAC{O$SLA{{{SELECTION, FIRST ENTRY
4399: {OSLB${DAC{O$SLB{{{SELECTION, SECOND ENTRY
4400: {OSLC${DAC{O$SLC{{{SELECTION, THIRD ENTRY
4401: {OSLD${DAC{O$SLD{{{SELECTION, FOURTH ENTRY
4402: {OSTP${DAC{O$STP{{{STOP EXECUTION
4403: {OUNF${DAC{O$UNF{{{UNEXPECTED FAILURE
4404: {{EJC{{{{
4405: *
4406: * TABLE OF NAMES OF UNDEFINED BINARY OPERATORS FOR OPSYN
4407: *
4408: {OPSNB{DAC{CH$AT{{{AT
4409: {{DAC{CH$AM{{{AMPERSAND
4410: {{DAC{CH$NM{{{NUMBER
4411: {{DAC{CH$PC{{{PERCENT
4412: {{DAC{CH$NT{{{NOT
4413: *
4414: * TABLE OF NAMES OF UNDEFINED UNARY OPERATORS FOR OPSYN
4415: *
4416: {OPNSU{DAC{CH$BR{{{VERTICAL BAR
4417: {{DAC{CH$EQ{{{EQUAL
4418: {{DAC{CH$NM{{{NUMBER
4419: {{DAC{CH$PC{{{PERCENT
4420: {{DAC{CH$SL{{{SLASH
4421: {{DAC{CH$EX{{{EXCLAMATION
4422: *
4423: * ADDRESS CONST CONTAINING PROFILE TABLE ENTRY SIZE
4424: *
4425: {PFI2A{DAC{PF$I2{{{
4426: *
4427: * PROFILER MESSAGE STRINGS
4428: *
4429: {PFMS1{DAC{B$SCL{{{
4430: {{DAC{15{{{
4431: {{DTC{/PROGRAM PROFILE/{{{
4432: {PFMS2{DAC{B$SCL{{{
4433: {{DAC{42{{{
4434: {{DTC{/STMT NUMBER OF -- EXECUTION TIME --/{{{
4435: {PFMS3{DAC{B$SCL{{{
4436: {{DAC{47{{{
4437: {{DTC{/NUMBER EXECUTIONS TOTAL(MSEC) PER EXCN(MCSEC)/{{{
4438: *
4439: *
4440: * REAL CONSTANTS FOR GENERAL USE. NOTE THAT THE CONSTANTS
4441: * STARTING AT REAV1 FORM A POWERS OF TEN TABLE (GTSTG)
4442: *
4443: {REAV0{DRC{+0.0{{{0.0
4444: {REAP1{DRC{+0.1{{{0.1
4445: {REAP5{DRC{+0.5{{{0.5
4446: {REAV1{DRC{+1.0{{{10**0
4447: {REAVT{DRC{+1.0E+1{{{10**1
4448: {{DRC{+1.0E+2{{{10**2
4449: {{DRC{+1.0E+3{{{10**3
4450: {{DRC{+1.0E+4{{{10**4
4451: {{DRC{+1.0E+5{{{10**5
4452: {{DRC{+1.0E+6{{{10**6
4453: {{DRC{+1.0E+7{{{10**7
4454: {{DRC{+1.0E+8{{{10**8
4455: {{DRC{+1.0E+9{{{10**9
4456: {REATT{DRC{+1.0E+10{{{10**10
4457: {{EJC{{{{
4458: *
4459: * STRING CONSTANTS (SCBLK FORMAT) FOR DTYPE PROCEDURE
4460: *
4461: {SCARR{DAC{B$SCL{{{ARRAY
4462: {{DAC{5{{{
4463: {{DTC{/ARRAY/{{{
4464: *
4465: {SCBUF{DAC{B$SCL{{{BUFFER
4466: {{DAC{6{{{
4467: {{DTC{/BUFFER/{{{
4468: *
4469: {SCCOD{DAC{B$SCL{{{CODE
4470: {{DAC{4{{{
4471: {{DTC{/CODE/{{{
4472: *
4473: {SCEXP{DAC{B$SCL{{{EXPRESSION
4474: {{DAC{10{{{
4475: {{DTC{/EXPRESSION/{{{
4476: *
4477: {SCEXT{DAC{B$SCL{{{EXTERNAL
4478: {{DAC{8{{{
4479: {{DTC{/EXTERNAL/{{{
4480: *
4481: {SCINT{DAC{B$SCL{{{INTEGER
4482: {{DAC{7{{{
4483: {{DTC{/INTEGER/{{{
4484: *
4485: {SCNAM{DAC{B$SCL{{{NAME
4486: {{DAC{4{{{
4487: {{DTC{/NAME/{{{
4488: *
4489: {SCNUM{DAC{B$SCL{{{NUMERIC
4490: {{DAC{7{{{
4491: {{DTC{/NUMERIC/{{{
4492: *
4493: {SCPAT{DAC{B$SCL{{{PATTERN
4494: {{DAC{7{{{
4495: {{DTC{/PATTERN/{{{
4496: *
4497: {SCREA{DAC{B$SCL{{{REAL
4498: {{DAC{4{{{
4499: {{DTC{/REAL/{{{
4500: *
4501: {SCSTR{DAC{B$SCL{{{STRING
4502: {{DAC{6{{{
4503: {{DTC{/STRING/{{{
4504: *
4505: {SCTAB{DAC{B$SCL{{{TABLE
4506: {{DAC{5{{{
4507: {{DTC{/TABLE/{{{
4508: {{EJC{{{{
4509: *
4510: * STRING CONSTANTS (SCBLK FORMAT) FOR KVRTN (SEE RETRN)
4511: *
4512: {SCFRT{DAC{B$SCL{{{FRETURN
4513: {{DAC{7{{{
4514: {{DTC{/FRETURN/{{{
4515: *
4516: {SCNRT{DAC{B$SCL{{{NRETURN
4517: {{DAC{7{{{
4518: {{DTC{/NRETURN/{{{
4519: *
4520: {SCRTN{DAC{B$SCL{{{RETURN
4521: {{DAC{6{{{
4522: {{DTC{/RETURN/{{{
4523: *
4524: * DATATYPE NAME TABLE FOR DTYPE PROCEDURE. THE ORDER OF
4525: * THESE ENTRIES IS TIED TO THE B$XXX DEFINITIONS FOR BLOCKS
4526: *
4527: {SCNMT{DAC{SCARR{{{ARBLK ARRAY
4528: {{DAC{SCBUF{{{BFBLK BUFFER
4529: {{DAC{SCCOD{{{CDBLK CODE
4530: {{DAC{SCEXP{{{EXBLK EXPRESSION
4531: {{DAC{SCINT{{{ICBLK INTEGER
4532: {{DAC{SCNAM{{{NMBLK NAME
4533: {{DAC{SCPAT{{{P0BLK PATTERN
4534: {{DAC{SCPAT{{{P1BLK PATTERN
4535: {{DAC{SCPAT{{{P2BLK PATTERN
4536: {{DAC{SCREA{{{RCBLK REAL
4537: {{DAC{SCSTR{{{SCBLK STRING
4538: {{DAC{SCEXP{{{SEBLK EXPRESSION
4539: {{DAC{SCTAB{{{TBBLK TABLE
4540: {{DAC{SCARR{{{VCBLK ARRAY
4541: {{DAC{SCEXT{{{XNBLK EXTERNAL
4542: {{DAC{SCEXT{{{XRBLK EXTERNAL
4543: *
4544: * STRING CONSTANT FOR REAL ZERO
4545: *
4546: {SCRE0{DAC{B$SCL{{{
4547: {{DAC{2{{{
4548: {{DTC{/0./{{{
4549: {{EJC{{{{
4550: *
4551: * USED TO RE-INITIALISE KVSTL
4552: *
4553: {STLIM{DIC{+50000{{{DEFAULT STATEMENT LIMIT
4554: *
4555: * DUMMY FUNCTION BLOCK USED FOR UNDEFINED FUNCTIONS
4556: *
4557: {STNDF{DAC{O$FUN{{{PTR TO UNDEFINED FUNCTION ERR CALL
4558: {{DAC{0{{{DUMMY FARGS COUNT FOR CALL CIRCUIT
4559: *
4560: * DUMMY CODE BLOCK USED FOR UNDEFINED LABELS
4561: *
4562: {STNDL{DAC{L$UND{{{CODE PTR POINTS TO UNDEFINED LBL
4563: *
4564: * DUMMY OPERATOR BLOCK USED FOR UNDEFINED OPERATORS
4565: *
4566: {STNDO{DAC{O$OUN{{{PTR TO UNDEFINED OPERATOR ERR CALL
4567: {{DAC{0{{{DUMMY FARGS COUNT FOR CALL CIRCUIT
4568: *
4569: * STANDARD VARIABLE BLOCK. THIS BLOCK IS USED TO INITIALIZE
4570: * THE FIRST SEVEN FIELDS OF A NEWLY CONSTRUCTED VRBLK.
4571: * ITS FORMAT IS TIED TO THE VRBLK DEFINITIONS (SEE GTNVR).
4572: *
4573: {STNVR{DAC{B$VRL{{{VRGET
4574: {{DAC{B$VRS{{{VRSTO
4575: {{DAC{NULLS{{{VRVAL
4576: {{DAC{B$VRG{{{VRTRA
4577: {{DAC{STNDL{{{VRLBL
4578: {{DAC{STNDF{{{VRFNC
4579: {{DAC{0{{{VRNXT
4580: {{EJC{{{{
4581: *
4582: * MESSAGES USED IN END OF RUN PROCESSING (STOPR)
4583: *
4584: {STPM1{DAC{B$SCL{{{IN STATEMENT
4585: {{DAC{12{{{
4586: {{DTC{/IN STATEMENT/{{{
4587: *
4588: {STPM2{DAC{B$SCL{{{
4589: {{DAC{14{{{
4590: {{DTC{/STMTS EXECUTED/{{{
4591: *
4592: {STPM3{DAC{B$SCL{{{
4593: {{DAC{13{{{
4594: {{DTC{/RUN TIME-MSEC/{{{
4595: *
4596: {STPM4{DAC{B$SCL{{{
4597: {{DAC{12{{{
4598: {{DTC{$MCSEC / STMT${{{
4599: *
4600: {STPM5{DAC{B$SCL{{{
4601: {{DAC{13{{{
4602: {{DTC{/REGENERATIONS/{{{
4603: *
4604: * CHARS FOR /TU/ ENDING CODE
4605: *
4606: {STRTU{DTC{/TU/{{{
4607: *
4608: * TABLE USED BY CONVERT FUNCTION TO CHECK DATATYPE NAME
4609: * THE ENTRIES ARE ORDERED TO CORRESPOND TO BRANCH TABLE
4610: * IN S$CNV
4611: *
4612: {SVCTB{DAC{SCSTR{{{STRING
4613: {{DAC{SCINT{{{INTEGER
4614: {{DAC{SCNAM{{{NAME
4615: {{DAC{SCPAT{{{PATTERN
4616: {{DAC{SCARR{{{ARRAY
4617: {{DAC{SCTAB{{{TABLE
4618: {{DAC{SCEXP{{{EXPRESSION
4619: {{DAC{SCCOD{{{CODE
4620: {{DAC{SCNUM{{{NUMERIC
4621: {{DAC{SCREA{{{REAL
4622: {{DAC{SCBUF{{{BUFFER
4623: {{DAC{0{{{ZERO MARKS END OF LIST
4624: {{EJC{{{{
4625: *
4626: * MESSAGES (SCBLK FORMAT) USED BY TRACE PROCEDURES
4627: *
4628: *
4629: {TMASB{DAC{B$SCL{{{ASTERISKS FOR TRACE STATEMENT NO
4630: {{DAC{13{{{
4631: {{DTC{/************ /{{{
4632: *
4633: {TMBEB{DAC{B$SCL{{{BLANK-EQUAL-BLANK
4634: {{DAC{3{{{
4635: {{DTC{/ = /{{{
4636: *
4637: * DUMMY TRBLK FOR EXPRESSION VARIABLE
4638: *
4639: {TRBEV{DAC{B$TRT{{{DUMMY TRBLK
4640: *
4641: * DUMMY TRBLK FOR KEYWORD VARIABLE
4642: *
4643: {TRBKV{DAC{B$TRT{{{DUMMY TRBLK
4644: *
4645: * DUMMY CODE BLOCK TO RETURN CONTROL TO TRXEQ PROCEDURE
4646: *
4647: {TRXDR{DAC{O$TXR{{{BLOCK POINTS TO RETURN ROUTINE
4648: {TRXDC{DAC{TRXDR{{{POINTER TO BLOCK
4649: {{EJC{{{{
4650: *
4651: * STANDARD VARIABLE BLOCKS
4652: *
4653: * SEE SVBLK FORMAT FOR FULL DETAILS OF THE FORMAT. THE
4654: * VRBLKS ARE ORDERED BY LENGTH AND WITHIN EACH LENGTH THE
4655: * ORDER IS ALPHABETICAL BY NAME OF THE VARIABLE.
4656: *
4657: {V$EQF{DBC{SVFPR{{{EQ
4658: {{DAC{2{{{
4659: {{DTC{/EQ/{{{
4660: {{DAC{S$EQF{{{
4661: {{DAC{2{{{
4662: *
4663: {V$GEF{DBC{SVFPR{{{GE
4664: {{DAC{2{{{
4665: {{DTC{/GE/{{{
4666: {{DAC{S$GEF{{{
4667: {{DAC{2{{{
4668: *
4669: {V$GTF{DBC{SVFPR{{{GT
4670: {{DAC{2{{{
4671: {{DTC{/GT/{{{
4672: {{DAC{S$GTF{{{
4673: {{DAC{2{{{
4674: *
4675: {V$LEF{DBC{SVFPR{{{LE
4676: {{DAC{2{{{
4677: {{DTC{/LE/{{{
4678: {{DAC{S$LEF{{{
4679: {{DAC{2{{{
4680: *
4681: {V$LTF{DBC{SVFPR{{{LT
4682: {{DAC{2{{{
4683: {{DTC{/LT/{{{
4684: {{DAC{S$LTF{{{
4685: {{DAC{2{{{
4686: *
4687: {V$NEF{DBC{SVFPR{{{NE
4688: {{DAC{2{{{
4689: {{DTC{/NE/{{{
4690: {{DAC{S$NEF{{{
4691: {{DAC{2{{{
4692: *
4693: {V$ANY{DBC{SVFNP{{{ANY
4694: {{DAC{3{{{
4695: {{DTC{/ANY/{{{
4696: {{DAC{S$ANY{{{
4697: {{DAC{1{{{
4698: *
4699: {V$ARB{DBC{SVKVC{{{ARB
4700: {{DAC{3{{{
4701: {{DTC{/ARB/{{{
4702: {{DAC{K$ARB{{{
4703: {{DAC{NDARB{{{
4704: {{EJC{{{{
4705: *
4706: * STANDARD VARIABLE BLOCKS (CONTINUED)
4707: *
4708: {V$ARG{DBC{SVFNN{{{ARG
4709: {{DAC{3{{{
4710: {{DTC{/ARG/{{{
4711: {{DAC{S$ARG{{{
4712: {{DAC{2{{{
4713: *
4714: {V$BAL{DBC{SVKVC{{{BAL
4715: {{DAC{3{{{
4716: {{DTC{/BAL/{{{
4717: {{DAC{K$BAL{{{
4718: {{DAC{NDBAL{{{
4719: *
4720: {V$END{DBC{SVLBL{{{END
4721: {{DAC{3{{{
4722: {{DTC{/END/{{{
4723: {{DAC{L$END{{{
4724: *
4725: {V$LEN{DBC{SVFNP{{{LEN
4726: {{DAC{3{{{
4727: {{DTC{/LEN/{{{
4728: {{DAC{S$LEN{{{
4729: {{DAC{1{{{
4730: *
4731: {V$LEQ{DBC{SVFPR{{{LEQ
4732: {{DAC{3{{{
4733: {{DTC{/LEQ/{{{
4734: {{DAC{S$LEQ{{{
4735: {{DAC{2{{{
4736: *
4737: {V$LGE{DBC{SVFPR{{{LGE
4738: {{DAC{3{{{
4739: {{DTC{/LGE/{{{
4740: {{DAC{S$LGE{{{
4741: {{DAC{2{{{
4742: *
4743: {V$LGT{DBC{SVFPR{{{LGT
4744: {{DAC{3{{{
4745: {{DTC{/LGT/{{{
4746: {{DAC{S$LGT{{{
4747: {{DAC{2{{{
4748: *
4749: {V$LLE{DBC{SVFPR{{{LLE
4750: {{DAC{3{{{
4751: {{DTC{/LLE/{{{
4752: {{DAC{S$LLE{{{
4753: {{DAC{2{{{
4754: {{EJC{{{{
4755: *
4756: * STANDARD VARIABLE BLOCKS (CONTINUED)
4757: *
4758: {V$LLT{DBC{SVFPR{{{LLT
4759: {{DAC{3{{{
4760: {{DTC{/LLT/{{{
4761: {{DAC{S$LLT{{{
4762: {{DAC{2{{{
4763: *
4764: {V$LNE{DBC{SVFPR{{{LNE
4765: {{DAC{3{{{
4766: {{DTC{/LNE/{{{
4767: {{DAC{S$LNE{{{
4768: {{DAC{2{{{
4769: *
4770: {V$POS{DBC{SVFNP{{{POS
4771: {{DAC{3{{{
4772: {{DTC{/POS/{{{
4773: {{DAC{S$POS{{{
4774: {{DAC{1{{{
4775: *
4776: {V$REM{DBC{SVKVC{{{REM
4777: {{DAC{3{{{
4778: {{DTC{/REM/{{{
4779: {{DAC{K$REM{{{
4780: {{DAC{NDREM{{{
4781: *
4782: {V$SET{DBC{SVFNN{{{SET
4783: {{DAC{3{{{
4784: {{DTC{/SET/{{{
4785: {{DAC{S$SET{{{
4786: {{DAC{3{{{
4787: *
4788: {V$TAB{DBC{SVFNP{{{TAB
4789: {{DAC{3{{{
4790: {{DTC{/TAB/{{{
4791: {{DAC{S$TAB{{{
4792: {{DAC{1{{{
4793: *
4794: {V$CAS{DBC{SVKNM{{{CASE
4795: {{DAC{4{{{
4796: {{DTC{/CASE/{{{
4797: {{DAC{K$CAS{{{
4798: *
4799: {V$CHR{DBC{SVFNP{{{CHAR
4800: {{DAC{4{{{
4801: {{DTC{/CHAR/{{{
4802: {{DAC{S$CHR{{{
4803: {{DAC{1{{{
4804: *
4805: {V$COD{DBC{SVFNK{{{CODE
4806: {{DAC{4{{{
4807: {{DTC{/CODE/{{{
4808: {{DAC{K$COD{{{
4809: {{DAC{S$COD{{{
4810: {{DAC{1{{{
4811: *
4812: {V$COP{DBC{SVFNN{{{COPY
4813: {{DAC{4{{{
4814: {{DTC{/COPY/{{{
4815: {{DAC{S$COP{{{
4816: {{DAC{1{{{
4817: {{EJC{{{{
4818: *
4819: * STANDARD VARIABLE BLOCKS (CONTINUED)
4820: *
4821: {V$DAT{DBC{SVFNN{{{DATA
4822: {{DAC{4{{{
4823: {{DTC{/DATA/{{{
4824: {{DAC{S$DAT{{{
4825: {{DAC{1{{{
4826: *
4827: {V$DTE{DBC{SVFNN{{{DATE
4828: {{DAC{4{{{
4829: {{DTC{/DATE/{{{
4830: {{DAC{S$DTE{{{
4831: {{DAC{0{{{
4832: *
4833: {V$DMP{DBC{SVFNK{{{DUMP
4834: {{DAC{4{{{
4835: {{DTC{/DUMP/{{{
4836: {{DAC{K$DMP{{{
4837: {{DAC{S$DMP{{{
4838: {{DAC{1{{{
4839: *
4840: {V$DUP{DBC{SVFNN{{{DUPL
4841: {{DAC{4{{{
4842: {{DTC{/DUPL/{{{
4843: {{DAC{S$DUP{{{
4844: {{DAC{2{{{
4845: *
4846: {V$EVL{DBC{SVFNN{{{EVAL
4847: {{DAC{4{{{
4848: {{DTC{/EVAL/{{{
4849: {{DAC{S$EVL{{{
4850: {{DAC{1{{{
4851: *
4852: {V$EXT{DBC{SVFNN{{{EXIT
4853: {{DAC{4{{{
4854: {{DTC{/EXIT/{{{
4855: {{DAC{S$EXT{{{
4856: {{DAC{1{{{
4857: *
4858: {V$FAL{DBC{SVKVC{{{FAIL
4859: {{DAC{4{{{
4860: {{DTC{/FAIL/{{{
4861: {{DAC{K$FAL{{{
4862: {{DAC{NDFAL{{{
4863: *
4864: {V$HST{DBC{SVFNN{{{HOST
4865: {{DAC{4{{{
4866: {{DTC{/HOST/{{{
4867: {{DAC{S$HST{{{
4868: {{DAC{3{{{
4869: {{EJC{{{{
4870: *
4871: * STANDARD VARIABLE BLOCKS (CONTINUED)
4872: *
4873: {V$ITM{DBC{SVFNF{{{ITEM
4874: {{DAC{4{{{
4875: {{DTC{/ITEM/{{{
4876: {{DAC{S$ITM{{{
4877: {{DAC{999{{{
4878: *
4879: {V$LOD{DBC{SVFNN{{{LOAD
4880: {{DAC{4{{{
4881: {{DTC{/LOAD/{{{
4882: {{DAC{S$LOD{{{
4883: {{DAC{2{{{
4884: *
4885: {V$LPD{DBC{SVFNP{{{LPAD
4886: {{DAC{4{{{
4887: {{DTC{/LPAD/{{{
4888: {{DAC{S$LPD{{{
4889: {{DAC{3{{{
4890: *
4891: {V$RPD{DBC{SVFNP{{{RPAD
4892: {{DAC{4{{{
4893: {{DTC{/RPAD/{{{
4894: {{DAC{S$RPD{{{
4895: {{DAC{3{{{
4896: *
4897: {V$RPS{DBC{SVFNP{{{RPOS
4898: {{DAC{4{{{
4899: {{DTC{/RPOS/{{{
4900: {{DAC{S$RPS{{{
4901: {{DAC{1{{{
4902: *
4903: {V$RTB{DBC{SVFNP{{{RTAB
4904: {{DAC{4{{{
4905: {{DTC{/RTAB/{{{
4906: {{DAC{S$RTB{{{
4907: {{DAC{1{{{
4908: *
4909: {V$SI${DBC{SVFNP{{{SIZE
4910: {{DAC{4{{{
4911: {{DTC{/SIZE/{{{
4912: {{DAC{S$SI${{{
4913: {{DAC{1{{{
4914: *
4915: *
4916: {V$SRT{DBC{SVFNN{{{SORT
4917: {{DAC{4{{{
4918: {{DTC{/SORT/{{{
4919: {{DAC{S$SRT{{{
4920: {{DAC{2{{{
4921: {V$SPN{DBC{SVFNP{{{SPAN
4922: {{DAC{4{{{
4923: {{DTC{/SPAN/{{{
4924: {{DAC{S$SPN{{{
4925: {{DAC{1{{{
4926: {{EJC{{{{
4927: *
4928: * STANDARD VARIABLE BLOCKS (CONTINUED)
4929: *
4930: {V$STN{DBC{SVKNM{{{STNO
4931: {{DAC{4{{{
4932: {{DTC{/STNO/{{{
4933: {{DAC{K$STN{{{
4934: *
4935: {V$TIM{DBC{SVFNN{{{TIME
4936: {{DAC{4{{{
4937: {{DTC{/TIME/{{{
4938: {{DAC{S$TIM{{{
4939: {{DAC{0{{{
4940: *
4941: {V$TRM{DBC{SVFNK{{{TRIM
4942: {{DAC{4{{{
4943: {{DTC{/TRIM/{{{
4944: {{DAC{K$TRM{{{
4945: {{DAC{S$TRM{{{
4946: {{DAC{1{{{
4947: *
4948: {V$ABE{DBC{SVKNM{{{ABEND
4949: {{DAC{5{{{
4950: {{DTC{/ABEND/{{{
4951: {{DAC{K$ABE{{{
4952: *
4953: {V$ABO{DBC{SVKVL{{{ABORT
4954: {{DAC{5{{{
4955: {{DTC{/ABORT/{{{
4956: {{DAC{K$ABO{{{
4957: {{DAC{L$ABO{{{
4958: {{DAC{NDABO{{{
4959: *
4960: {V$APP{DBC{SVFNF{{{APPLY
4961: {{DAC{5{{{
4962: {{DTC{/APPLY/{{{
4963: {{DAC{S$APP{{{
4964: {{DAC{999{{{
4965: *
4966: {V$ABN{DBC{SVFNP{{{ARBNO
4967: {{DAC{5{{{
4968: {{DTC{/ARBNO/{{{
4969: {{DAC{S$ABN{{{
4970: {{DAC{1{{{
4971: *
4972: {V$ARR{DBC{SVFNN{{{ARRAY
4973: {{DAC{5{{{
4974: {{DTC{/ARRAY/{{{
4975: {{DAC{S$ARR{{{
4976: {{DAC{2{{{
4977: {{EJC{{{{
4978: *
4979: * STANDARD VARIABLE BLOCKS (CONTINUED)
4980: *
4981: {V$BRK{DBC{SVFNP{{{BREAK
4982: {{DAC{5{{{
4983: {{DTC{/BREAK/{{{
4984: {{DAC{S$BRK{{{
4985: {{DAC{1{{{
4986: *
4987: {V$CLR{DBC{SVFNN{{{CLEAR
4988: {{DAC{5{{{
4989: {{DTC{/CLEAR/{{{
4990: {{DAC{S$CLR{{{
4991: {{DAC{1{{{
4992: *
4993: {V$EJC{DBC{SVFNN{{{EJECT
4994: {{DAC{5{{{
4995: {{DTC{/EJECT/{{{
4996: {{DAC{S$EJC{{{
4997: {{DAC{1{{{
4998: *
4999: {V$FEN{DBC{SVFPK{{{FENCE
5000: {{DAC{5{{{
5001: {{DTC{/FENCE/{{{
5002: {{DAC{K$FEN{{{
5003: {{DAC{S$FNC{{{
5004: {{DAC{1{{{
5005: {{DAC{NDFEN{{{
5006: *
5007: {V$FLD{DBC{SVFNN{{{FIELD
5008: {{DAC{5{{{
5009: {{DTC{/FIELD/{{{
5010: {{DAC{S$FLD{{{
5011: {{DAC{2{{{
5012: *
5013: {V$IDN{DBC{SVFPR{{{IDENT
5014: {{DAC{5{{{
5015: {{DTC{/IDENT/{{{
5016: {{DAC{S$IDN{{{
5017: {{DAC{2{{{
5018: *
5019: {V$INP{DBC{SVFNK{{{INPUT
5020: {{DAC{5{{{
5021: {{DTC{/INPUT/{{{
5022: {{DAC{K$INP{{{
5023: {{DAC{S$INP{{{
5024: {{DAC{3{{{
5025: *
5026: {V$LOC{DBC{SVFNN{{{LOCAL
5027: {{DAC{5{{{
5028: {{DTC{/LOCAL/{{{
5029: {{DAC{S$LOC{{{
5030: {{DAC{2{{{
5031: {{EJC{{{{
5032: *
5033: * STANDARD VARIABLE BLOCKS (CONTINUED)
5034: *
5035: {V$OPS{DBC{SVFNN{{{OPSYN
5036: {{DAC{5{{{
5037: {{DTC{/OPSYN/{{{
5038: {{DAC{S$OPS{{{
5039: {{DAC{3{{{
5040: *
5041: {V$RMD{DBC{SVFNP{{{REMDR
5042: {{DAC{5{{{
5043: {{DTC{/REMDR/{{{
5044: {{DAC{S$RMD{{{
5045: {{DAC{2{{{
5046: *
5047: {V$RSR{DBC{SVFNN{{{RSORT
5048: {{DAC{5{{{
5049: {{DTC{/RSORT/{{{
5050: {{DAC{S$RSR{{{
5051: {{DAC{2{{{
5052: *
5053: {V$TBL{DBC{SVFNN{{{TABLE
5054: {{DAC{5{{{
5055: {{DTC{/TABLE/{{{
5056: {{DAC{S$TBL{{{
5057: {{DAC{3{{{
5058: *
5059: {V$TRA{DBC{SVFNK{{{TRACE
5060: {{DAC{5{{{
5061: {{DTC{/TRACE/{{{
5062: {{DAC{K$TRA{{{
5063: {{DAC{S$TRA{{{
5064: {{DAC{4{{{
5065: *
5066: {V$ANC{DBC{SVKNM{{{ANCHOR
5067: {{DAC{6{{{
5068: {{DTC{/ANCHOR/{{{
5069: {{DAC{K$ANC{{{
5070: *
5071: {V$APN{DBC{SVFNN{{{
5072: {{DAC{6{{{
5073: {{DTC{/APPEND/{{{
5074: {{DAC{S$APN{{{
5075: {{DAC{2{{{
5076: *
5077: {V$BKX{DBC{SVFNP{{{BREAKX
5078: {{DAC{6{{{
5079: {{DTC{/BREAKX/{{{
5080: {{DAC{S$BKX{{{
5081: {{DAC{1{{{
5082: *
5083: {V$BUF{DBC{SVFNN{{{BUFFER
5084: {{DAC{6{{{
5085: {{DTC{/BUFFER/{{{
5086: {{DAC{S$BUF{{{
5087: {{DAC{2{{{
5088: *
5089: {V$DEF{DBC{SVFNN{{{DEFINE
5090: {{DAC{6{{{
5091: {{DTC{/DEFINE/{{{
5092: {{DAC{S$DEF{{{
5093: {{DAC{2{{{
5094: *
5095: {V$DET{DBC{SVFNN{{{DETACH
5096: {{DAC{6{{{
5097: {{DTC{/DETACH/{{{
5098: {{DAC{S$DET{{{
5099: {{DAC{1{{{
5100: {{EJC{{{{
5101: *
5102: * STANDARD VARIABLE BLOCKS (CONTINUED)
5103: *
5104: {V$DIF{DBC{SVFPR{{{DIFFER
5105: {{DAC{6{{{
5106: {{DTC{/DIFFER/{{{
5107: {{DAC{S$DIF{{{
5108: {{DAC{2{{{
5109: *
5110: {V$FTR{DBC{SVKNM{{{FTRACE
5111: {{DAC{6{{{
5112: {{DTC{/FTRACE/{{{
5113: {{DAC{K$FTR{{{
5114: *
5115: {V$INS{DBC{SVFNN{{{INSERT
5116: {{DAC{6{{{
5117: {{DTC{/INSERT/{{{
5118: {{DAC{S$INS{{{
5119: {{DAC{4{{{
5120: *
5121: {V$LST{DBC{SVKNM{{{LASTNO
5122: {{DAC{6{{{
5123: {{DTC{/LASTNO/{{{
5124: {{DAC{K$LST{{{
5125: *
5126: {V$NAY{DBC{SVFNP{{{NOTANY
5127: {{DAC{6{{{
5128: {{DTC{/NOTANY/{{{
5129: {{DAC{S$NAY{{{
5130: {{DAC{1{{{
5131: *
5132: {V$OUP{DBC{SVFNK{{{OUTPUT
5133: {{DAC{6{{{
5134: {{DTC{/OUTPUT/{{{
5135: {{DAC{K$OUP{{{
5136: {{DAC{S$OUP{{{
5137: {{DAC{3{{{
5138: *
5139: {V$RET{DBC{SVLBL{{{RETURN
5140: {{DAC{6{{{
5141: {{DTC{/RETURN/{{{
5142: {{DAC{L$RTN{{{
5143: *
5144: {V$REW{DBC{SVFNN{{{REWIND
5145: {{DAC{6{{{
5146: {{DTC{/REWIND/{{{
5147: {{DAC{S$REW{{{
5148: {{DAC{1{{{
5149: *
5150: {V$STT{DBC{SVFNN{{{STOPTR
5151: {{DAC{6{{{
5152: {{DTC{/STOPTR/{{{
5153: {{DAC{S$STT{{{
5154: {{DAC{2{{{
5155: {{EJC{{{{
5156: *
5157: * STANDARD VARIABLE BLOCKS (CONTINUED)
5158: *
5159: {V$SUB{DBC{SVFNN{{{SUBSTR
5160: {{DAC{6{{{
5161: {{DTC{/SUBSTR/{{{
5162: {{DAC{S$SUB{{{
5163: {{DAC{3{{{
5164: *
5165: {V$UNL{DBC{SVFNN{{{UNLOAD
5166: {{DAC{6{{{
5167: {{DTC{/UNLOAD/{{{
5168: {{DAC{S$UNL{{{
5169: {{DAC{1{{{
5170: *
5171: {V$COL{DBC{SVFNN{{{COLLECT
5172: {{DAC{7{{{
5173: {{DTC{/COLLECT/{{{
5174: {{DAC{S$COL{{{
5175: {{DAC{1{{{
5176: *
5177: {V$CNV{DBC{SVFNN{{{CONVERT
5178: {{DAC{7{{{
5179: {{DTC{/CONVERT/{{{
5180: {{DAC{S$CNV{{{
5181: {{DAC{2{{{
5182: *
5183: {V$ENF{DBC{SVFNN{{{ENDFILE
5184: {{DAC{7{{{
5185: {{DTC{/ENDFILE/{{{
5186: {{DAC{S$ENF{{{
5187: {{DAC{1{{{
5188: *
5189: {V$ETX{DBC{SVKNM{{{ERRTEXT
5190: {{DAC{7{{{
5191: {{DTC{/ERRTEXT/{{{
5192: {{DAC{K$ETX{{{
5193: *
5194: {V$ERT{DBC{SVKNM{{{ERRTYPE
5195: {{DAC{7{{{
5196: {{DTC{/ERRTYPE/{{{
5197: {{DAC{K$ERT{{{
5198: *
5199: {V$FRT{DBC{SVLBL{{{FRETURN
5200: {{DAC{7{{{
5201: {{DTC{/FRETURN/{{{
5202: {{DAC{L$FRT{{{
5203: *
5204: {V$INT{DBC{SVFPR{{{INTEGER
5205: {{DAC{7{{{
5206: {{DTC{/INTEGER/{{{
5207: {{DAC{S$INT{{{
5208: {{DAC{1{{{
5209: *
5210: {V$NRT{DBC{SVLBL{{{NRETURN
5211: {{DAC{7{{{
5212: {{DTC{/NRETURN/{{{
5213: {{DAC{L$NRT{{{
5214: {{EJC{{{{
5215: *
5216: * STANDARD VARIABLE BLOCKS (CONTINUED)
5217: *
5218: *
5219: {V$PFL{DBC{SVKNM{{{PROFILE
5220: {{DAC{7{{{
5221: {{DTC{/PROFILE/{{{
5222: {{DAC{K$PFL{{{
5223: *
5224: {V$RPL{DBC{SVFNP{{{REPLACE
5225: {{DAC{7{{{
5226: {{DTC{/REPLACE/{{{
5227: {{DAC{S$RPL{{{
5228: {{DAC{3{{{
5229: *
5230: {V$RVS{DBC{SVFNP{{{REVERSE
5231: {{DAC{7{{{
5232: {{DTC{/REVERSE/{{{
5233: {{DAC{S$RVS{{{
5234: {{DAC{1{{{
5235: *
5236: {V$RTN{DBC{SVKNM{{{RTNTYPE
5237: {{DAC{7{{{
5238: {{DTC{/RTNTYPE/{{{
5239: {{DAC{K$RTN{{{
5240: *
5241: {V$STX{DBC{SVFNN{{{SETEXIT
5242: {{DAC{7{{{
5243: {{DTC{/SETEXIT/{{{
5244: {{DAC{S$STX{{{
5245: {{DAC{1{{{
5246: *
5247: {V$STC{DBC{SVKNM{{{STCOUNT
5248: {{DAC{7{{{
5249: {{DTC{/STCOUNT/{{{
5250: {{DAC{K$STC{{{
5251: *
5252: {V$STL{DBC{SVKNM{{{STLIMIT
5253: {{DAC{7{{{
5254: {{DTC{/STLIMIT/{{{
5255: {{DAC{K$STL{{{
5256: *
5257: {V$SUC{DBC{SVKVC{{{SUCCEED
5258: {{DAC{7{{{
5259: {{DTC{/SUCCEED/{{{
5260: {{DAC{K$SUC{{{
5261: {{DAC{NDSUC{{{
5262: *
5263: {V$ALP{DBC{SVKWC{{{ALPHABET
5264: {{DAC{8{{{
5265: {{DTC{/ALPHABET/{{{
5266: {{DAC{K$ALP{{{
5267: *
5268: {V$CNT{DBC{SVLBL{{{CONTINUE
5269: {{DAC{8{{{
5270: {{DTC{/CONTINUE/{{{
5271: {{DAC{L$CNT{{{
5272: {{EJC{{{{
5273: *
5274: * STANDARD VARIABLE BLOCKS (CONTINUED)
5275: *
5276: {V$DTP{DBC{SVFNP{{{DATATYPE
5277: {{DAC{8{{{
5278: {{DTC{/DATATYPE/{{{
5279: {{DAC{S$DTP{{{
5280: {{DAC{1{{{
5281: *
5282: {V$ERL{DBC{SVKNM{{{ERRLIMIT
5283: {{DAC{8{{{
5284: {{DTC{/ERRLIMIT/{{{
5285: {{DAC{K$ERL{{{
5286: *
5287: {V$FNC{DBC{SVKNM{{{FNCLEVEL
5288: {{DAC{8{{{
5289: {{DTC{/FNCLEVEL/{{{
5290: {{DAC{K$FNC{{{
5291: *
5292: {V$MXL{DBC{SVKNM{{{MAXLNGTH
5293: {{DAC{8{{{
5294: {{DTC{/MAXLNGTH/{{{
5295: {{DAC{K$MXL{{{
5296: *
5297: {V$TER{DBC{0{{{TERMINAL
5298: {{DAC{8{{{
5299: {{DTC{/TERMINAL/{{{
5300: {{DAC{0{{{
5301: *
5302: {V$PRO{DBC{SVFNN{{{PROTOTYPE
5303: {{DAC{9{{{
5304: {{DTC{/PROTOTYPE/{{{
5305: {{DAC{S$PRO{{{
5306: {{DAC{1{{{
5307: *
5308: {{DBC{0{{{DUMMY ENTRY TO END LIST
5309: {{DAC{10{{{LENGTH GT 9 (PROTOTYPE)
5310: {{EJC{{{{
5311: *
5312: * LIST OF SVBLK POINTERS FOR KEYWORDS TO BE DUMPED. THE
5313: * LIST IS IN THE ORDER WHICH APPEARS ON THE DUMP OUTPUT.
5314: *
5315: {VDMKW{DAC{V$ANC{{{ANCHOR
5316: {{DAC{V$CAS{{{CCASE
5317: {{DAC{V$COD{{{CODE
5318: {{DAC{V$DMP{{{DUMP
5319: {{DAC{V$ERL{{{ERRLIMIT
5320: {{DAC{V$ETX{{{ERRTEXT
5321: {{DAC{V$ERT{{{ERRTYPE
5322: {{DAC{V$FNC{{{FNCLEVEL
5323: {{DAC{V$FTR{{{FTRACE
5324: {{DAC{V$INP{{{INPUT
5325: {{DAC{V$LST{{{LASTNO
5326: {{DAC{V$MXL{{{MAXLENGTH
5327: {{DAC{V$OUP{{{OUTPUT
5328: {{DAC{V$PFL{{{PROFILE
5329: {{DAC{V$RTN{{{RTNTYPE
5330: {{DAC{V$STC{{{STCOUNT
5331: {{DAC{V$STL{{{STLIMIT
5332: {{DAC{V$STN{{{STNO
5333: {{DAC{V$TRA{{{TRACE
5334: {{DAC{V$TRM{{{TRIM
5335: {{DAC{0{{{END OF LIST
5336: *
5337: * TABLE USED BY GTNVR TO SEARCH SVBLK LISTS
5338: *
5339: {VSRCH{DAC{0{{{DUMMY ENTRY TO GET PROPER INDEXING
5340: {{DAC{V$EQF{{{START OF 1 CHAR VARIABLES (NONE)
5341: {{DAC{V$EQF{{{START OF 2 CHAR VARIABLES
5342: {{DAC{V$ANY{{{START OF 3 CHAR VARIABLES
5343: {{DAC{V$CAS{{{START OF 4 CHAR VARIABLES
5344: {{DAC{V$ABE{{{START OF 5 CHAR VARIABLES
5345: {{DAC{V$ANC{{{START OF 6 CHAR VARIABLES
5346: {{DAC{V$COL{{{START OF 7 CHAR VARIABLES
5347: {{DAC{V$ALP{{{START OF 8 CHAR VARIABLES
5348: {{DAC{V$PRO{{{START OF 9 CHAR VARIABLES
5349: {{TTL{S{{{P I T B O L -- WORKING STORAGE SECTION
5350: *
5351: * THE WORKING STORAGE SECTION CONTAINS AREAS WHICH ARE
5352: * CHANGED DURING EXECUTION OF THE PROGRAM. THE VALUE
5353: * ASSEMBLED IS THE INITIAL VALUE BEFORE EXECUTION STARTS.
5354: *
5355: * ALL THESE AREAS ARE FIXED LENGTH AREAS. VARIABLE LENGTH
5356: * DATA IS STORED IN THE STATIC OR DYNAMIC REGIONS OF THE
5357: * ALLOCATED DATA AREAS.
5358: *
5359: * THE VALUES IN THIS AREA ARE DESCRIBED EITHER AS WORK
5360: * AREAS OR AS GLOBAL VALUES. A WORK AREA IS USED IN AN
5361: * EPHEMERAL MANNER AND THE VALUE IS NOT SAVED FROM ONE
5362: * ENTRY INTO A ROUTINE TO ANOTHER. A GLOBAL VALUE IS A
5363: * LESS TEMPORARY LOCATION WHOSE VALUE IS SAVED FROM ONE
5364: * CALL TO ANOTHER.
5365: *
5366: * A GENERAL PART OF THE APPROACH IN THIS PROGRAM IS NOT
5367: * TO OVERLAP WORK AREAS BETWEEN PROCEDURES EVEN THOUGH A
5368: * SMALL AMOUNT OF SPACE COULD BE SAVED. SUCH OVERLAP IS
5369: * CONSIDERED A SOURCE OF PROGRAM ERRORS AND DECREASES THE
5370: * INFORMATION LEFT BEHIND AFTER A SYSTEM CRASH OF ANY KIND.
5371: *
5372: * THE NAMES OF THESE LOCATIONS ARE LABELS WITH FIVE LETTER
5373: * (A-Y,$) NAMES. AS FAR AS POSSIBLE THE ORDER IS KEPT
5374: * ALPHABETICAL BY THESE NAMES BUT IN SOME CASES THERE
5375: * ARE SLIGHT DEPARTURES CAUSED BY OTHER ORDER REQUIREMENTS.
5376: *
5377: * UNLESS OTHERWISE DOCUMENTED, THE ORDER OF WORK AREAS
5378: * DOES NOT AFFECT THE EXECUTION OF THE SPITBOL PROGRAM.
5379: *
5380: {{SEC{{{{START OF WORKING STORAGE SECTION
5381: {{EJC{{{{
5382: *
5383: * THIS AREA IS NOT CLEARED BY INITIAL CODE
5384: *
5385: {CMLAB{DAC{B$SCL{{{STRING USED TO CHECK LABEL LEGALITY
5386: {{DAC{2{{{
5387: {{DTC{/ /{{{
5388: *
5389: * LABEL TO MARK START OF WORK AREA
5390: *
5391: {AAAAA{DAC{0{{{
5392: *
5393: * WORK AREAS FOR ALLOC PROCEDURE
5394: *
5395: {ALDYN{DAC{0{{{AMOUNT OF DYNAMIC STORE
5396: {ALFSF{DIC{+0{{{FACTOR IN FREE STORE PCNTAGE CHECK
5397: {ALLIA{DIC{+0{{{DUMP IA
5398: {ALLSV{DAC{0{{{SAVE WB IN ALLOC
5399: *
5400: * WORK AREAS FOR ALOST PROCEDURE
5401: *
5402: {ALSTA{DAC{0{{{SAVE WA IN ALOST
5403: *
5404: * SAVE AREAS FOR ARRAY FUNCTION (S$ARR)
5405: *
5406: {ARCDM{DAC{0{{{COUNT DIMENSIONS
5407: {ARNEL{DIC{+0{{{COUNT ELEMENTS
5408: {ARPTR{DAC{0{{{OFFSET PTR INTO ARBLK
5409: {ARSVL{DIC{+0{{{SAVE INTEGER LOW BOUND
5410: {{EJC{{{{
5411: * WORK AREAS FOR ARREF ROUTINE
5412: *
5413: {ARFSI{DIC{+0{{{SAVE CURRENT EVOLVING SUBSCRIPT
5414: {ARFXS{DAC{0{{{SAVE BASE STACK POINTER
5415: *
5416: * WORK AREAS FOR B$EFC BLOCK ROUTINE
5417: *
5418: {BEFOF{DAC{0{{{SAVE OFFSET PTR INTO EFBLK
5419: *
5420: * WORK AREAS FOR B$PFC BLOCK ROUTINE
5421: *
5422: {BPFPF{DAC{0{{{SAVE PFBLK POINTER
5423: {BPFSV{DAC{0{{{SAVE OLD FUNCTION VALUE
5424: {BPFXT{DAC{0{{{POINTER TO STACKED ARGUMENTS
5425: *
5426: * SAVE AREAS FOR COLLECT FUNCTION (S$COL)
5427: *
5428: {CLSVI{DIC{+0{{{SAVE INTEGER ARGUMENT
5429: *
5430: * GLOBAL VALUES FOR CMPIL PROCEDURE
5431: *
5432: {CMERC{DAC{0{{{COUNT OF INITIAL COMPILE ERRORS
5433: {CMPXS{DAC{0{{{SAVE STACK PTR IN CASE OF ERRORS
5434: {CMPSN{DAC{1{{{NUMBER OF NEXT STATEMENT TO COMPILE
5435: {CMPSS{DAC{0{{{SAVE SUBROUTINE STACK PTR
5436: *
5437: * WORK AREA FOR CNCRD
5438: *
5439: {CNSCC{DAC{0{{{POINTER TO CONTROL CARD STRING
5440: {CNSWC{DAC{0{{{WORD COUNT
5441: {CNR$T{DAC{0{{{POINTER TO R$TTL OR R$STL
5442: {CNTTL{DAC{0{{{FLAG FOR -TITLE, -STITL
5443: *
5444: * WORK AREAS FOR CONVERT FUNCTION (S$CNV)
5445: *
5446: {CNVTP{DAC{0{{{SAVE PTR INTO SCVTB
5447: *
5448: * FLAG FOR SUPPRESSION OF COMPILATION STATISTICS.
5449: *
5450: {CPSTS{DAC{0{{{SUPPRESS COMP. STATS IF NON ZERO
5451: *
5452: * GLOBAL VALUES FOR CONTROL CARD SWITCHES
5453: *
5454: {CSWDB{DAC{0{{{0/1 FOR -SINGLE/-DOUBLE
5455: {CSWER{DAC{0{{{0/1 FOR -ERRORS/-NOERRORS
5456: {CSWEX{DAC{0{{{0/1 FOR -EXECUTE/-NOEXECUTE
5457: {CSWFL{DAC{1{{{0/1 FOR -NOFAIL/-FAIL
5458: {CSWIN{DAC{INILN{{{XXX FOR -INXXX
5459: {CSWLS{DAC{1{{{0/1 FOR -NOLIST/-LIST
5460: {CSWNO{DAC{0{{{0/1 FOR -OPTIMISE/-NOOPT
5461: {CSWPR{DAC{0{{{0/1 FOR -NOPRINT/-PRINT
5462: *
5463: * GLOBAL LOCATION USED BY PATST PROCEDURE
5464: *
5465: {CTMSK{DBC{0{{{LAST BIT POSITION USED IN R$CTP
5466: {CURID{DAC{0{{{CURRENT ID VALUE
5467: {{EJC{{{{
5468: *
5469: * GLOBAL VALUE FOR CDWRD PROCEDURE
5470: *
5471: {CWCOF{DAC{0{{{NEXT WORD OFFSET IN CURRENT CCBLK
5472: *
5473: * WORK AREAS FOR DATA FUNCTION (S$DAT)
5474: *
5475: {DATDV{DAC{0{{{SAVE VRBLK PTR FOR DATATYPE NAME
5476: {DATXS{DAC{0{{{SAVE INITIAL STACK POINTER
5477: *
5478: * WORK AREAS FOR DEFINE FUNCTION (S$DEF)
5479: *
5480: {DEFLB{DAC{0{{{SAVE VRBLK PTR FOR LABEL
5481: {DEFNA{DAC{0{{{COUNT FUNCTION ARGUMENTS
5482: {DEFVR{DAC{0{{{SAVE VRBLK PTR FOR FUNCTION NAME
5483: {DEFXS{DAC{0{{{SAVE INITIAL STACK POINTER
5484: *
5485: * WORK AREAS FOR DUMPR PROCEDURE
5486: *
5487: {DMARG{DAC{0{{{DUMP ARGUMENT
5488: {DMPKB{DAC{B$KVT{{{DUMMY KVBLK FOR USE IN DUMPR
5489: {DMPKT{DAC{TRBKV{{{KVVAR TRBLK POINTER
5490: {DMPKN{DAC{0{{{KEYWORD NUMBER (MUST FOLLOW DMPKB)
5491: {DMPSA{DAC{0{{{PRESERVE WA OVER PRTVL CALL
5492: {DMPSV{DAC{0{{{GENERAL SCRATCH SAVE
5493: {DMVCH{DAC{0{{{CHAIN POINTER FOR VARIABLE BLOCKS
5494: {DMPCH{DAC{0{{{SAVE SORTED VRBLK CHAIN POINTER
5495: *
5496: * GLOBAL LOCATIONS FOR DYNAMIC STORAGE POINTERS
5497: *
5498: {DNAMB{DAC{0{{{START OF DYNAMIC AREA
5499: {DNAMP{DAC{0{{{NEXT AVAILABLE LOC IN DYNAMIC AREA
5500: {DNAME{DAC{0{{{END OF AVAILABLE DYNAMIC AREA
5501: *
5502: * WORK AREA FOR DTACH
5503: *
5504: {DTCNB{DAC{0{{{NAME BASE
5505: {DTCNM{DAC{0{{{NAME PTR
5506: *
5507: * WORK AREAS FOR DUPL FUNCTION (S$DUP)
5508: *
5509: {DUPSI{DIC{+0{{{STORE INTEGER STRING LENGTH
5510: *
5511: * WORK AREA FOR ENDFILE (S$ENF)
5512: *
5513: {ENFCH{DAC{0{{{FOR IOCHN CHAIN HEAD
5514: *
5515: * WORK AREA FOR ERROR PROCESSING.
5516: *
5517: {ERICH{DAC{0{{{COPY ERROR REPORTS TO INT.CHAN IF 1
5518: {ERLST{DAC{0{{{FOR LISTR WHEN ERRORS GO TO INT.CH.
5519: {ERRFT{DAC{0{{{FATAL ERROR FLAG
5520: {ERRSP{DAC{0{{{ERROR SUPPRESSION FLAG
5521: {{EJC{{{{
5522: *
5523: * DUMP AREA FOR ERTEX
5524: *
5525: {ERTWA{DAC{0{{{SAVE WA
5526: {ERTWB{DAC{0{{{SAVE WB
5527: *
5528: * GLOBAL VALUES FOR EVALI
5529: *
5530: {EVLIN{DAC{P$LEN{{{DUMMY PATTERN BLOCK PCODE
5531: {EVLIS{DAC{0{{{POINTER TO SUBSEQUENT NODE
5532: {EVLIV{DAC{0{{{VALUE OF PARAMETER
5533: * WORK AREA FOR EXPAN
5534: *
5535: {EXPSV{DAC{0{{{SAVE OP DOPE VECTOR POINTER
5536: *
5537: * FLAG FOR SUPPRESSION OF EXECUTION STATS
5538: *
5539: {EXSTS{DAC{0{{{SUPPRESS EXEC STATS IF SET
5540: *
5541: * GLOBAL VALUES FOR EXFAL AND RETURN
5542: *
5543: {FLPRT{DAC{0{{{LOCATION OF FAIL OFFSET FOR RETURN
5544: {FLPTR{DAC{0{{{LOCATION OF FAILURE OFFSET ON STACK
5545: *
5546: * WORK AREAS FOR GBCOL PROCEDURE
5547: *
5548: {GBCFL{DAC{0{{{GARBAGE COLLECTOR ACTIVE FLAG
5549: {GBCLM{DAC{0{{{POINTER TO LAST MOVE BLOCK (PASS 3)
5550: {GBCNM{DAC{0{{{DUMMY FIRST MOVE BLOCK
5551: {GBCNS{DAC{0{{{REST OF DUMMY BLOCK (FOLLOWS GBCNM)
5552: {GBSVA{DAC{0{{{SAVE WA
5553: {GBSVB{DAC{0{{{SAVE WB
5554: {GBSVC{DAC{0{{{SAVE WC
5555: *
5556: * GLOBAL LOCATION TO COUNT GARBAGE COLLECTIONS (GBCOL)
5557: *
5558: {GBCNT{DAC{0{{{COUNT OF GARBAGE COLLECTIONS
5559: *
5560: * WORK AREAS FOR GTNVR PROCEDURE
5561: *
5562: {GNVHE{DAC{0{{{PTR TO END OF HASH CHAIN
5563: {GNVNW{DAC{0{{{NUMBER OF WORDS IN STRING NAME
5564: {GNVSA{DAC{0{{{SAVE WA
5565: {GNVSB{DAC{0{{{SAVE WB
5566: {GNVSP{DAC{0{{{POINTER INTO VSRCH TABLE
5567: {GNVST{DAC{0{{{POINTER TO CHARS OF STRING
5568: *
5569: * GLOBAL VALUE FOR GTCOD AND GTEXP
5570: *
5571: {GTCEF{DAC{0{{{SAVE FAIL PTR IN CASE OF ERROR
5572: *
5573: * WORK AREAS FOR GTINT
5574: *
5575: {GTINA{DAC{0{{{SAVE WA
5576: {GTINB{DAC{0{{{SAVE WB
5577: {{EJC{{{{
5578: *
5579: * WORK AREAS FOR GTNUM PROCEDURE
5580: *
5581: {GTNNF{DAC{0{{{ZERO/NONZERO FOR RESULT +/-
5582: {GTNSI{DIC{+0{{{GENERAL INTEGER SAVE
5583: {GTNDF{DAC{0{{{0/1 FOR DEC POINT SO FAR NO/YES
5584: {GTNES{DAC{0{{{ZERO/NONZERO EXPONENT +/-
5585: {GTNEX{DIC{+0{{{REAL EXPONENT
5586: {GTNSC{DAC{0{{{SCALE (PLACES AFTER POINT)
5587: {GTNSR{DRC{+0.0{{{GENERAL REAL SAVE
5588: {GTNRD{DAC{0{{{FLAG FOR OK REAL NUMBER
5589: *
5590: * WORK AREAS FOR GTPAT PROCEDURE
5591: *
5592: {GTPSB{DAC{0{{{SAVE WB
5593: *
5594: * WORK AREAS FOR GTSTG PROCEDURE
5595: *
5596: {GTSSF{DAC{0{{{0/1 FOR RESULT +/-
5597: {GTSVC{DAC{0{{{SAVE WC
5598: {GTSVB{DAC{0{{{SAVE WB
5599: {GTSWK{DAC{0{{{PTR TO WORK AREA FOR GTSTG
5600: {GTSES{DAC{0{{{CHAR + OR - FOR EXPONENT +/-
5601: {GTSRS{DRC{+0.0{{{GENERAL REAL SAVE
5602: *
5603: * GLOBAL LOCATIONS (CONSTANTS) FOR GTSTG PROCEDURE
5604: *
5605: {GTSRN{DRC{+0.0{{{ROUNDING FACTOR 0.5*10**-CFP$S
5606: {GTSSC{DRC{+0.0{{{SCALING VALUE 10**CFP$S
5607: *
5608: * WORK AREAS FOR GTVAR PROCEDURE
5609: *
5610: {GTVRC{DAC{0{{{SAVE WC
5611: *
5612: * FLAG FOR HEADER PRINTING
5613: *
5614: {HEADP{DAC{0{{{HEADER PRINTED FLAG
5615: *
5616: * GLOBAL VALUES FOR VARIABLE HASH TABLE
5617: *
5618: {HSHNB{DIC{+0{{{NUMBER OF HASH BUCKETS
5619: {HSHTB{DAC{0{{{POINTER TO START OF VRBLK HASH TABL
5620: {HSHTE{DAC{0{{{POINTER PAST END OF VRBLK HASH TABL
5621: *
5622: * WORK AREA FOR INIT
5623: *
5624: {INISS{DAC{0{{{SAVE SUBROUTINE STACK PTR
5625: {INITR{DAC{0{{{SAVE TERMINAL FLAG
5626: *
5627: * SAVE AREA FOR INSBF
5628: *
5629: {INSAB{DAC{0{{{ENTRY WA + ENTRY WB
5630: {INSSA{DAC{0{{{SAVE ENTRY WA
5631: {INSSB{DAC{0{{{SAVE ENTRY WB
5632: {INSSC{DAC{0{{{SAVE ENTRY WC
5633: *
5634: * WORK AREAS FOR IOPUT
5635: *
5636: {IOPTT{DAC{0{{{TYPE OF ASSOCIATION
5637: {{EJC{{{{
5638: *
5639: * GLOBAL VALUES FOR KEYWORD VALUES WHICH ARE STORED AS ONE
5640: * WORD INTEGERS. THESE VALUES MUST BE ASSEMBLED IN THE
5641: * FOLLOWING ORDER (AS DICTATED BY K$XXX DEFINITION VALUES).
5642: *
5643: {KVABE{DAC{0{{{ABEND
5644: {KVANC{DAC{0{{{ANCHOR
5645: {KVCAS{DAC{0{{{CASE
5646: {KVCOD{DAC{0{{{CODE
5647: {KVDMP{DAC{0{{{DUMP
5648: {KVERL{DAC{0{{{ERRLIMIT
5649: {KVERT{DAC{0{{{ERRTYPE
5650: {KVFTR{DAC{0{{{FTRACE
5651: {KVINP{DAC{1{{{INPUT
5652: {KVMXL{DAC{5000{{{MAXLENGTH
5653: {KVOUP{DAC{1{{{OUTPUT
5654: {KVPFL{DAC{0{{{PROFILE
5655: {KVTRA{DAC{0{{{TRACE
5656: {KVTRM{DAC{0{{{TRIM
5657: {KVFNC{DAC{0{{{FNCLEVEL
5658: {KVLST{DAC{0{{{LASTNO
5659: {KVSTN{DAC{0{{{STNO
5660: *
5661: * GLOBAL VALUES FOR OTHER KEYWORDS
5662: *
5663: {KVALP{DAC{0{{{ALPHABET
5664: {KVRTN{DAC{NULLS{{{RTNTYPE (SCBLK POINTER)
5665: {KVSTL{DIC{+50000{{{STLIMIT
5666: {KVSTC{DIC{+50000{{{STCOUNT (COUNTS DOWN FROM STLIMIT)
5667: *
5668: * WORK AREAS FOR LOAD FUNCTION
5669: *
5670: {LODFN{DAC{0{{{POINTER TO VRBLK FOR FUNC NAME
5671: {LODNA{DAC{0{{{COUNT NUMBER OF ARGUMENTS
5672: *
5673: * GLOBAL VALUES FOR LISTR PROCEDURE
5674: *
5675: {LSTLC{DAC{0{{{COUNT LINES ON SOURCE LIST PAGE
5676: {LSTNP{DAC{0{{{MAX NUMBER OF LINES ON PAGE
5677: {LSTPF{DAC{1{{{SET NONZERO IF CURRENT IMAGE LISTED
5678: {LSTPG{DAC{0{{{CURRENT SOURCE LIST PAGE NUMBER
5679: {LSTPO{DAC{0{{{OFFSET TO PAGE NNN MESSAGE
5680: {LSTSN{DAC{0{{{REMEMBER LAST STMNUM LISTED
5681: *
5682: * MAXIMUM SIZE OF SPITBOL OBJECTS
5683: *
5684: {MXLEN{DAC{0{{{INITIALISED BY SYSMX CALL
5685: *
5686: * EXECUTION CONTROL VARIABLE
5687: *
5688: {NOXEQ{DAC{0{{{SET NON-ZERO TO INHIBIT EXECUTION
5689: *
5690: * PROFILER GLOBAL VALUES AND WORK LOCATIONS
5691: *
5692: {PFDMP{DAC{0{{{SET NON-0 IF &PROFILE SET NON-0
5693: {PFFNC{DAC{0{{{SET NON-0 IF FUNCT JUST ENTERED
5694: {PFSTM{DIC{+0{{{TO STORE STARTING TIME OF STMT
5695: {PFETM{DIC{+0{{{TO STORE ENDING TIME OF STMT
5696: {PFSVW{DAC{0{{{TO SAVE A W-REG
5697: {PFTBL{DAC{0{{{GETS ADRS OF (IMAG) TABLE BASE
5698: {PFNTE{DAC{0{{{NR OF TABLE ENTRIES
5699: {PFSTE{DIC{+0{{{GETS INT REP OF TABLE ENTRY SIZE
5700: *
5701: {{EJC{{{{
5702: *
5703: * GLOBAL VALUES USED IN PATTERN MATCH ROUTINES
5704: *
5705: {PMDFL{DAC{0{{{PATTERN ASSIGNMENT FLAG
5706: {PMHBS{DAC{0{{{HISTORY STACK BASE POINTER
5707: {PMSSL{DAC{0{{{LENGTH OF SUBJECT STRING IN CHARS
5708: *
5709: * FLAGS USED FOR STANDARD FILE LISTING OPTIONS
5710: *
5711: {PRICH{DAC{0{{{PRINTER ON INTERACTIVE CHANNEL
5712: {PRSTD{DAC{0{{{TESTED BY PRTPG
5713: {PRSTO{DAC{0{{{STANDARD LISTING OPTION FLAG
5714: *
5715: * GLOBAL VALUE FOR PRTNM PROCEDURE
5716: *
5717: {PRNMV{DAC{0{{{VRBLK PTR FROM LAST NAME SEARCH
5718: *
5719: * WORK AREAS FOR PRTNM PROCEDURE
5720: *
5721: {PRNSI{DIC{+0{{{SCRATCH INTEGER LOC
5722: *
5723: * WORK AREAS FOR PRTSN PROCEDURE
5724: *
5725: {PRSNA{DAC{0{{{SAVE WA
5726: *
5727: * GLOBAL VALUES FOR PRINT PROCEDURES
5728: *
5729: {PRBUF{DAC{0{{{PTR TO PRINT BFR IN STATIC
5730: {PRECL{DAC{0{{{EXTENDED/COMPACT LISTING FLAG
5731: {PRLEN{DAC{0{{{LENGTH OF PRINT BUFFER IN CHARS
5732: {PRLNW{DAC{0{{{LENGTH OF PRINT BUFFER IN WORDS
5733: {PROFS{DAC{0{{{OFFSET TO NEXT LOCATION IN PRBUF
5734: {PRTEF{DAC{0{{{ENDFILE FLAG
5735: *
5736: * WORK AREAS FOR PRTST PROCEDURE
5737: *
5738: {PRSVA{DAC{0{{{SAVE WA
5739: {PRSVB{DAC{0{{{SAVE WB
5740: {PRSVC{DAC{0{{{SAVE CHAR COUNTER
5741: *
5742: * WORK AREA FOR PRTNL
5743: *
5744: {PRTSA{DAC{0{{{SAVE WA
5745: {PRTSB{DAC{0{{{SAVE WB
5746: *
5747: * WORK AREA FOR PRTVL
5748: *
5749: {PRVSI{DAC{0{{{SAVE IDVAL
5750: *
5751: * WORK AREAS FOR PATTERN MATCH ROUTINES
5752: *
5753: {PSAVE{DAC{0{{{TEMPORARY SAVE FOR CURRENT NODE PTR
5754: {PSAVC{DAC{0{{{SAVE CURSOR IN P$SPN, P$STR
5755: {{EJC{{{{
5756: *
5757: * AMOUNT OF MEMORY RESERVED FOR END OF EXECUTION
5758: *
5759: {RSMEM{DAC{0{{{RESERVE MEMORY
5760: *
5761: * WORK AREAS FOR RETRN ROUTINE
5762: *
5763: {RTNBP{DAC{0{{{TO SAVE A BLOCK POINTER
5764: {RTNFV{DAC{0{{{NEW FUNCTION VALUE (RESULT)
5765: {RTNSV{DAC{0{{{OLD FUNCTION VALUE (SAVED VALUE)
5766: *
5767: * RELOCATABLE GLOBAL VALUES
5768: *
5769: * ALL THE POINTERS IN THIS SECTION CAN POINT TO BLOCKS IN
5770: * THE DYNAMIC STORAGE AREA AND MUST BE RELOCATED BY THE
5771: * GARBAGE COLLECTOR. THEY ARE IDENTIFIED BY R$XXX NAMES.
5772: *
5773: {R$AAA{DAC{0{{{START OF RELOCATABLE VALUES
5774: {R$ARF{DAC{0{{{ARRAY BLOCK POINTER FOR ARREF
5775: {R$CCB{DAC{0{{{PTR TO CCBLK BEING BUILT (CDWRD)
5776: {R$CIM{DAC{0{{{PTR TO CURRENT COMPILER INPUT STR
5777: {R$CMP{DAC{0{{{COPY OF R$CIM USED IN CMPIL
5778: {R$CNI{DAC{0{{{PTR TO NEXT COMPILER INPUT STRING
5779: {R$CNT{DAC{0{{{CDBLK POINTER FOR SETEXIT CONTINUE
5780: {R$COD{DAC{0{{{POINTER TO CURRENT CDBLK OR EXBLK
5781: {R$CTP{DAC{0{{{PTR TO CURRENT CTBLK FOR PATST
5782: {R$ERT{DAC{0{{{TRBLK POINTER FOR ERRTYPE TRACE
5783: {R$ETX{DAC{NULLS{{{POINTER TO ERRTEXT STRING
5784: {R$EXS{DAC{0{{{= SAVE XL IN EXPDM
5785: {R$FCB{DAC{0{{{FCBLK CHAIN HEAD
5786: {R$FNC{DAC{0{{{TRBLK POINTER FOR FNCLEVEL TRACE
5787: {R$GTC{DAC{0{{{KEEP CODE PTR FOR GTCOD,GTEXP
5788: {R$IO1{DAC{0{{{FILE ARG1 FOR IOPUT
5789: {R$IO2{DAC{0{{{FILE ARG2 FOR IOPUT
5790: {R$IOF{DAC{0{{{FCBLK PTR OR 0
5791: {R$ION{DAC{0{{{NAME BASE PTR
5792: {R$IOP{DAC{0{{{PREDECESSOR BLOCK PTR FOR IOPUT
5793: {R$IOT{DAC{0{{{TRBLK PTR FOR IOPUT
5794: {R$PMB{DAC{0{{{BUFFER PTR IN PATTERN MATCH
5795: {R$PMS{DAC{0{{{SUBJECT STRING PTR IN PATTERN MATCH
5796: {R$RA2{DAC{0{{{REPLACE SECOND ARGUMENT LAST TIME
5797: {R$RA3{DAC{0{{{REPLACE THIRD ARGUMENT LAST TIME
5798: {R$RPT{DAC{0{{{PTR TO CTBLK REPLACE TABLE LAST USD
5799: {R$SCP{DAC{0{{{SAVE POINTER FROM LAST SCANE CALL
5800: {R$SXL{DAC{0{{{PRESERVE XL IN SORTC
5801: {R$SXR{DAC{0{{{PRESERVE XR IN SORTA/SORTC
5802: {R$STC{DAC{0{{{TRBLK POINTER FOR STCOUNT TRACE
5803: {R$STL{DAC{0{{{SOURCE LISTING SUB-TITLE
5804: {R$SXC{DAC{0{{{CODE (CDBLK) PTR FOR SETEXIT TRAP
5805: {R$TTL{DAC{NULLS{{{SOURCE LISTING TITLE
5806: {R$XSC{DAC{0{{{STRING POINTER FOR XSCAN
5807: {{EJC{{{{
5808: *
5809: * THE REMAINING POINTERS IN THIS LIST ARE USED TO POINT
5810: * TO FUNCTION BLOCKS FOR NORMALLY UNDEFINED OPERATORS.
5811: *
5812: {R$UBA{DAC{STNDO{{{BINARY AT
5813: {R$UBM{DAC{STNDO{{{BINARY AMPERSAND
5814: {R$UBN{DAC{STNDO{{{BINARY NUMBER SIGN
5815: {R$UBP{DAC{STNDO{{{BINARY PERCENT
5816: {R$UBT{DAC{STNDO{{{BINARY NOT
5817: {R$UUB{DAC{STNDO{{{UNARY VERTICAL BAR
5818: {R$UUE{DAC{STNDO{{{UNARY EQUAL
5819: {R$UUN{DAC{STNDO{{{UNARY NUMBER SIGN
5820: {R$UUP{DAC{STNDO{{{UNARY PERCENT
5821: {R$UUS{DAC{STNDO{{{UNARY SLASH
5822: {R$UUX{DAC{STNDO{{{UNARY EXCLAMATION
5823: {R$YYY{DAC{0{{{LAST RELOCATABLE LOCATION
5824: *
5825: * WORK AREAS FOR SUBSTR FUNCTION (S$SUB)
5826: *
5827: {SBSSV{DAC{0{{{SAVE THIRD ARGUMENT
5828: *
5829: * GLOBAL LOCATIONS USED IN SCAN PROCEDURE
5830: *
5831: {SCNBL{DAC{0{{{SET NON-ZERO IF SCANNED PAST BLANKS
5832: {SCNCC{DAC{0{{{NON-ZERO TO SCAN CONTROL CARD NAME
5833: {SCNGO{DAC{0{{{SET NON-ZERO TO SCAN GOTO FIELD
5834: {SCNIL{DAC{0{{{LENGTH OF CURRENT INPUT IMAGE
5835: {SCNPT{DAC{0{{{POINTER TO NEXT LOCATION IN R$CIM
5836: {SCNRS{DAC{0{{{SET NON-ZERO TO SIGNAL RESCAN
5837: {SCNTP{DAC{0{{{SAVE SYNTAX TYPE FROM LAST CALL
5838: *
5839: * WORK AREAS FOR SCAN PROCEDURE
5840: *
5841: {SCNSA{DAC{0{{{SAVE WA
5842: {SCNSB{DAC{0{{{SAVE WB
5843: {SCNSC{DAC{0{{{SAVE WC
5844: {SCNSE{DAC{0{{{START OF CURRENT ELEMENT
5845: {SCNOF{DAC{0{{{SAVE OFFSET
5846: {{EJC{{{{
5847: *
5848: * WORK AREA USED BY SORTA, SORTC, SORTF, SORTH
5849: *
5850: {SRTDF{DAC{0{{{DATATYPE FIELD NAME
5851: {SRTFD{DAC{0{{{FOUND DFBLK ADDRESS
5852: {SRTFF{DAC{0{{{FOUND FIELD NAME
5853: {SRTFO{DAC{0{{{OFFSET TO FIELD NAME
5854: {SRTNR{DAC{0{{{NUMBER OF ROWS
5855: {SRTOF{DAC{0{{{OFFSET WITHIN ROW TO SORT KEY
5856: {SRTRT{DAC{0{{{ROOT OFFSET
5857: {SRTS1{DAC{0{{{SAVE OFFSET 1
5858: {SRTS2{DAC{0{{{SAVE OFFSET 2
5859: {SRTSC{DAC{0{{{SAVE WC
5860: {SRTSF{DAC{0{{{SORT ARRAY FIRST ROW OFFSET
5861: {SRTSN{DAC{0{{{SAVE N
5862: {SRTSO{DAC{0{{{OFFSET TO A(0)
5863: {SRTSR{DAC{0{{{0 , NON-ZERO FOR SORT, RSORT
5864: {SRTST{DAC{0{{{STRIDE FROM ONE ROW TO NEXT
5865: {SRTWC{DAC{0{{{DUMP WC
5866: *
5867: * GLOBAL VALUE FOR INDICATING STAGE (SEE ERROR SECTION)
5868: *
5869: {STAGE{DAC{0{{{INITIAL VALUE = INITIAL COMPILE
5870: *
5871: * GLOBAL VALUES DEFINING EXTENT OF STATIC AREA (ALOST)
5872: *
5873: {STATB{DAC{0{{{START OF STATIC AREA
5874: {STATE{DAC{0{{{END OF STATIC AREA
5875: {{EJC{{{{
5876: *
5877: * GLOBAL STACK POINTER
5878: *
5879: {STBAS{DAC{0{{{POINTER PAST STACK BASE
5880: *
5881: * WORK AREAS FOR STOPR ROUTINE
5882: *
5883: {STPSI{DIC{+0{{{SAVE VALUE OF STCOUNT
5884: {STPTI{DIC{+0{{{SAVE TIME ELAPSED
5885: *
5886: * GLOBAL VALUES FOR SETEXIT FUNCTION (S$STX)
5887: *
5888: {STXOF{DAC{0{{{FAILURE OFFSET
5889: {STXVR{DAC{NULLS{{{VRBLK POINTER OR NULL
5890: *
5891: * WORK AREAS FOR TFIND PROCEDURE
5892: *
5893: {TFNSI{DIC{+0{{{NUMBER OF HEADERS
5894: *
5895: * GLOBAL VALUE FOR TIME KEEPING
5896: *
5897: {TIMSX{DIC{+0{{{TIME AT START OF EXECUTION
5898: {TIMUP{DAC{0{{{SET WHEN TIME UP OCCURS
5899: *
5900: * WORK AREAS FOR XSCAN PROCEDURE
5901: *
5902: {XSCRT{DAC{0{{{SAVE RETURN CODE
5903: {XSCWB{DAC{0{{{SAVE REGISTER WB
5904: *
5905: * GLOBAL VALUES FOR XSCAN AND XSCNI PROCEDURES
5906: *
5907: {XSOFS{DAC{0{{{OFFSET TO CURRENT LOCATION IN R$XSC
5908: *
5909: * LABEL TO MARK END OF WORK AREA
5910: *
5911: {YYYYY{DAC{0{{{
5912: {{TTL{S{{{P I T B O L -- INITIALIZATION
5913: *
5914: * INITIALISATION
5915: * THE FOLLOWING SECTION RECEIVES CONTROL FROM THE SYSTEM
5916: * AT THE START OF A RUN WITH THE REGISTERS SET AS FOLLOWS.
5917: *
5918: * (XS) POINTS PAST STACK BASE
5919: * (XR) POINTS TO FIRST WORD OF DATA AREA
5920: * (XL) POINTS TO LAST WORD OF DATA AREA
5921: *
5922: {{SEC{{{{START OF PROGRAM SECTION
5923: {{JSR{SYSTM{{{INITIALISE TIMER
5924: *
5925: * INITIALISE WORK AREA (ESSENTIAL FOR BATCHED RUNS)
5926: *
5927: {{MOV{R9{R7{{PRESERVE XR
5928: {{MOV{#YYYYY{R6{{POINT TO END OF WORK AREA
5929: {{SUB{#AAAAA{R6{{GET LENGTH OF WORK AREA
5930: {{BTW{R6{{{CONVERT TO WORDS
5931: {{LCT{R6{R6{{COUNT FOR LOOP
5932: {{MOV{#AAAAA{R9{{SET UP INDEX REGISTER
5933: *
5934: * CLEAR WORK SPACE
5935: *
5936: {INI01{ZER{(R9)+{{{CLEAR A WORD
5937: {{BCT{R6{INI01{{LOOP TILL DONE
5938: {{MOV{#STNDO{R6{{UNDEFINED OPERATORS POINTER
5939: {{MOV{#R$YYY{R8{{POINT TO TABLE END
5940: {{SUB{#R$UBA{R8{{LENGTH OF UNDEF. OPERATORS TABLE
5941: {{BTW{R8{{{CONVERT TO WORDS
5942: {{LCT{R8{R8{{LOOP COUNTER
5943: {{MOV{#R$UBA{R9{{SET UP XR
5944: *
5945: * SET CORRECT VALUE INTO UNDEFINED OPERATORS TABLE
5946: *
5947: {INI02{MOV{R6{(R9)+{{STORE VALUE
5948: {{BCT{R8{INI02{{LOOP TILL ALL DONE
5949: {{MOV{#NUM01{R6{{GET A 1
5950: {{MOV{R6{CMPSN{{STATEMENT NO
5951: {{MOV{R6{CSWFL{{NOFAIL
5952: {{MOV{R6{CSWLS{{LIST
5953: {{MOV{R6{KVINP{{INPUT
5954: {{MOV{R6{KVOUP{{OUTPUT
5955: {{MOV{R6{LSTPF{{NOTHING FOR LISTR YET
5956: {{MOV{#INILN{R6{{INPUT IMAGE LENGTH
5957: {{MOV{R6{CSWIN{{-IN72
5958: {{MOV{#B$KVT{DMPKB{{DUMP
5959: {{MOV{#TRBKV{DMPKT{{DUMP
5960: {{MOV{#P$LEN{EVLIN{{EVAL
5961: {{EJC{{{{
5962: {{MOV{#NULLS{R6{{GET NULLSTRING POINTER
5963: {{MOV{R6{KVRTN{{RETURN
5964: {{MOV{R6{R$ETX{{ERRTEXT
5965: {{MOV{R6{R$TTL{{TITLE FOR LISTING
5966: {{MOV{R6{STXVR{{SETEXIT
5967: {{STI{TIMSX{{{STORE TIME IN CORRECT PLACE
5968: {{LDI{STLIM{{{GET DEFAULT STLIMIT
5969: {{STI{KVSTL{{{STATEMENT LIMIT
5970: {{STI{KVSTC{{{STATEMENT COUNT
5971: {{MOV{R7{STATB{{STORE START ADRS OF STATIC
5972: {{MOV{#4*E$SRS{RSMEM{{RESERVE MEMORY
5973: {{MOV{SP{STBAS{{STORE STACK BASE
5974: {{SSS{INISS{{{SAVE S-R STACK PTR
5975: *
5976: * NOW CONVERT FREE STORE PERCENTAGE TO A SUITABLE FACTOR
5977: * FOR EASY TESTING IN ALLOC ROUTINE.
5978: *
5979: {{LDI{INTVH{{{GET 100
5980: {{DVI{ALFSP{{{FORM 100 / ALFSP
5981: {{STI{ALFSF{{{STORE THE FACTOR
5982: *
5983: * INITIALIZE VALUES FOR REAL CONVERSION ROUTINE
5984: *
5985: {{LCT{R7{#CFP$S{{LOAD COUNTER FOR SIGNIFICANT DIGITS
5986: {{LDR{REAV1{{{LOAD 1.0
5987: *
5988: * LOOP TO COMPUTE 10**(MAX NUMBER SIGNIFICANT DIGITS)
5989: *
5990: {INI03{MLR{REAVT{{{* 10.0
5991: {{BCT{R7{INI03{{LOOP TILL DONE
5992: {{STR{GTSSC{{{STORE 10**(MAX SIG DIGITS)
5993: {{LDR{REAP5{{{LOAD 0.5
5994: {{DVR{GTSSC{{{COMPUTE 0.5*10**(MAX SIG DIGITS)
5995: {{STR{GTSRN{{{STORE AS ROUNDING BIAS
5996: {{ZER{R8{{{SET TO READ PARAMETERS
5997: {{JSR{PRPAR{{{READ THEM
5998: {{EJC{{{{
5999: *
6000: * NOW COMPUTE STARTING ADDRESS FOR DYNAMIC STORE AND IF
6001: * NECESSARY REQUEST MORE MEMORY.
6002: *
6003: {{SUB{#4*E$SRS{R10{{ALLOW FOR RESERVE MEMORY
6004: {{MOV{PRLEN{R6{{GET PRINT BUFFER LENGTH
6005: {{ADD{#CFP$A{R6{{ADD NO. OF CHARS IN ALPHABET
6006: {{ADD{#NSTMX{R6{{ADD CHARS FOR GTSTG BFR
6007: {{CTB{R6{8{{CONVERT TO BYTES, ALLOWING A MARGIN
6008: {{MOV{STATB{R9{{POINT TO STATIC BASE
6009: {{ADD{R6{R9{{INCREMENT FOR ABOVE BUFFERS
6010: {{ADD{#4*E$HNB{R9{{INCREMENT FOR HASH TABLE
6011: {{ADD{#4*E$STS{R9{{BUMP FOR INITIAL STATIC BLOCK
6012: {{JSR{SYSMX{{{GET MXLEN
6013: {{MOV{R6{KVMXL{{PROVISIONALLY STORE AS MAXLNGTH
6014: {{MOV{R6{MXLEN{{AND AS MXLEN
6015: {{BGT{R9{R6{INI06{SKIP IF STATIC HI EXCEEDS MXLEN
6016: {{MOV{R6{R9{{USE MXLEN INSTEAD
6017: {{ICA{R9{{{MAKE BIGGER THAN MXLEN
6018: *
6019: * HERE TO STORE VALUES WHICH MARK INITIAL DIVISION
6020: * OF DATA AREA INTO STATIC AND DYNAMIC
6021: *
6022: {INI06{MOV{R9{DNAMB{{DYNAMIC BASE ADRS
6023: {{MOV{R9{DNAMP{{DYNAMIC PTR
6024: {{BNZ{R6{INI07{{SKIP IF NON-ZERO MXLEN
6025: {{DCA{R9{{{POINT A WORD IN FRONT
6026: {{MOV{R9{KVMXL{{USE AS MAXLNGTH
6027: {{MOV{R9{MXLEN{{AND AS MXLEN
6028: {{EJC{{{{
6029: *
6030: * LOOP HERE IF NECESSARY TILL ENOUGH MEMORY OBTAINED
6031: * SO THAT DNAME IS ABOVE DNAMB
6032: *
6033: {INI07{MOV{R10{DNAME{{STORE DYNAMIC END ADDRESS
6034: {{BLT{DNAMB{R10{INI09{SKIP IF HIGH ENOUGH
6035: {{JSR{SYSMM{{{REQUEST MORE MEMORY
6036: {{WTB{R9{{{GET AS BAUS (SGD05)
6037: {{ADD{R9{R10{{BUMP BY AMOUNT OBTAINED
6038: {{BNZ{R9{INI07{{TRY AGAIN
6039: {{MOV{#ENDMO{R9{{POINT TO FAILURE MESSAGE
6040: {{MOV{ENDML{R6{{MESSAGE LENGTH
6041: {{JSR{SYSPR{{{PRINT IT (PRTST NOT YET USABLE)
6042: {{PPM{{{{SHOULD NOT FAIL
6043: {{JSR{SYSEJ{{{PACK UP (STOPR NOT YET USABLE)
6044: *
6045: * INITIALISE PRINT BUFFER WITH BLANK WORDS
6046: *
6047: {INI09{MOV{PRLEN{R8{{NO. OF CHARS IN PRINT BFR
6048: {{MOV{STATB{R9{{POINT TO STATIC AGAIN
6049: {{MOV{R9{PRBUF{{PRINT BFR IS PUT AT STATIC START
6050: {{MOV{#B$SCL{(R9)+{{STORE STRING TYPE CODE
6051: {{MOV{R8{(R9)+{{AND STRING LENGTH
6052: {{CTW{R8{0{{GET NUMBER OF WORDS IN BUFFER
6053: {{MOV{R8{PRLNW{{STORE FOR BUFFER CLEAR
6054: {{LCT{R8{R8{{WORDS TO CLEAR
6055: *
6056: * LOOP TO CLEAR BUFFER
6057: *
6058: {INI10{MOV{NULLW{(R9)+{{STORE BLANK
6059: {{BCT{R8{INI10{{LOOP
6060: *
6061: * INITIALIZE NUMBER OF HASH HEADERS
6062: *
6063: {{MOV{#E$HNB{R6{{GET NUMBER OF HASH HEADERS
6064: {{MTI{R6{{{CONVERT TO INTEGER
6065: {{STI{HSHNB{{{STORE FOR USE BY GTNVR PROCEDURE
6066: {{LCT{R6{R6{{COUNTER FOR CLEARING HASH TABLE
6067: {{MOV{R9{HSHTB{{POINTER TO HASH TABLE
6068: *
6069: * LOOP TO CLEAR HASH TABLE
6070: *
6071: {INI11{ZER{(R9)+{{{BLANK A WORD
6072: {{BCT{R6{INI11{{LOOP
6073: {{MOV{R9{HSHTE{{END OF HASH TABLE ADRS IS KEPT
6074: *
6075: * ALLOCATE WORK AREA FOR GTSTG CONVERSION PROCEDURE
6076: *
6077: {{MOV{#NSTMX{R6{{GET MAX NUM CHARS IN OUTPUT NUMBER
6078: {{CTB{R6{SCSI${{NO OF BYTES NEEDED
6079: {{MOV{R9{GTSWK{{STORE BFR ADRS
6080: {{ADD{R6{R9{{BUMP FOR WORK BFR
6081: {{EJC{{{{
6082: *
6083: * BUILD ALPHABET STRING FOR ALPHABET KEYWORD AND REPLACE
6084: *
6085: {{MOV{R9{KVALP{{SAVE ALPHABET POINTER
6086: {{MOV{#B$SCL{(R9){{STRING BLK TYPE
6087: {{MOV{#CFP$A{R8{{NO OF CHARS IN ALPHABET
6088: {{MOV{R8{4*SCLEN(R9){{STORE AS STRING LENGTH
6089: {{MOV{R8{R7{{COPY CHAR COUNT
6090: {{CTB{R7{SCSI${{NO. OF BYTES NEEDED
6091: {{ADD{R9{R7{{CURRENT END ADDRESS FOR STATIC
6092: {{MOV{R7{STATE{{STORE STATIC END ADRS
6093: {{LCT{R8{R8{{LOOP COUNTER
6094: {{PSC{R9{{{POINT TO CHARS OF STRING
6095: {{ZER{R7{{{SET INITIAL CHARACTER VALUE
6096: *
6097: * LOOP TO ENTER CHARACTER CODES IN ORDER
6098: *
6099: {INI12{SCH{R7{(R9)+{{STORE NEXT CODE
6100: {{ICV{R7{{{BUMP CODE VALUE
6101: {{BCT{R8{INI12{{LOOP TILL ALL STORED
6102: {{CSC{R9{{{COMPLETE STORE CHARACTERS
6103: *
6104: * INITIALIZE VARIABLE BLOCKS FOR INPUT AND OUTPUT
6105: *
6106: {{MOV{#V$INP{R10{{POINT TO STRING /INPUT/
6107: {{MOV{#TRTIN{R7{{TRBLK TYPE FOR INPUT
6108: {{JSR{INOUT{{{PERFORM INPUT ASSOCIATION
6109: {{MOV{#V$OUP{R10{{POINT TO STRING /OUTPUT/
6110: {{MOV{#TRTOU{R7{{TRBLK TYPE FOR OUTPUT
6111: {{JSR{INOUT{{{PERFORM OUTPUT ASSOCIATION
6112: {{MOV{INITR{R8{{TERMINAL FLAG
6113: {{BZE{R8{INI13{{SKIP IF NO TERMINAL
6114: {{JSR{PRPAR{{{ASSOCIATE TERMINAL
6115: {{EJC{{{{
6116: *
6117: * CHECK FOR EXPIRY DATE
6118: *
6119: {INI13{JSR{SYSDC{{{CALL DATE CHECK
6120: {{MOV{SP{FLPTR{{IN CASE STACK OVERFLOWS IN COMPILER
6121: *
6122: * NOW COMPILE SOURCE INPUT CODE
6123: *
6124: {{JSR{CMPIL{{{CALL COMPILER
6125: {{MOV{R9{R$COD{{SET PTR TO FIRST CODE BLOCK
6126: {{MOV{#NULLS{R$TTL{{FORGET TITLE (REG04)
6127: {{MOV{#NULLS{R$STL{{FORGET SUB-TITLE (REG04)
6128: {{ZER{R$CIM{{{FORGET COMPILER INPUT IMAGE
6129: {{ZER{R10{{{CLEAR DUD VALUE
6130: {{ZER{R7{{{DONT SHIFT DYNAMIC STORE UP
6131: {{JSR{GBCOL{{{CLEAR GARBAGE LEFT FROM COMPILE
6132: {{BNZ{CPSTS{INIX0{{SKIP IF NO LISTING OF COMP STATS
6133: {{JSR{PRTPG{{{EJECT PAGE
6134: *
6135: * PRINT COMPILE STATISTICS
6136: *
6137: {{MOV{DNAMP{R6{{NEXT AVAILABLE LOC
6138: {{SUB{STATB{R6{{MINUS START
6139: {{BTW{R6{{{CONVERT TO WORDS
6140: {{MTI{R6{{{CONVERT TO INTEGER
6141: {{MOV{#ENCM1{R9{{POINT TO /MEMORY USED (WORDS)/
6142: {{JSR{PRTMI{{{PRINT MESSAGE
6143: {{MOV{DNAME{R6{{END OF MEMORY
6144: {{SUB{DNAMP{R6{{MINUS NEXT AVAILABLE LOC
6145: {{BTW{R6{{{CONVERT TO WORDS
6146: {{MTI{R6{{{CONVERT TO INTEGER
6147: {{MOV{#ENCM2{R9{{POINT TO /MEMORY AVAILABLE (WORDS)/
6148: {{JSR{PRTMI{{{PRINT LINE
6149: {{MTI{CMERC{{{GET COUNT OF ERRORS AS INTEGER
6150: {{MOV{#ENCM3{R9{{POINT TO /COMPILE ERRORS/
6151: {{JSR{PRTMI{{{PRINT IT
6152: {{MTI{GBCNT{{{GARBAGE COLLECTION COUNT
6153: {{SBI{INTV1{{{ADJUST FOR UNAVOIDABLE COLLECT
6154: {{MOV{#STPM5{R9{{POINT TO /STORAGE REGENERATIONS/
6155: {{JSR{PRTMI{{{PRINT GBCOL COUNT
6156: {{JSR{SYSTM{{{GET TIME
6157: {{SBI{TIMSX{{{GET COMPILATION TIME
6158: {{MOV{#ENCM4{R9{{POINT TO COMPILATION TIME (MSEC)/
6159: {{JSR{PRTMI{{{PRINT MESSAGE
6160: {{ADD{#NUM05{LSTLC{{BUMP LINE COUNT
6161: {{BZE{HEADP{INIX0{{NO EJECT IF NOTHING PRINTED (SDG11)
6162: {{JSR{PRTPG{{{EJECT PRINTER
6163: {{EJC{{{{
6164: *
6165: * PREPARE NOW TO START EXECUTION
6166: *
6167: * SET DEFAULT INPUT RECORD LENGTH
6168: *
6169: {INIX0{BGT{CSWIN{#INILN{INIX1{SKIP IF NOT DEFAULT -IN72 USED
6170: {{MOV{#INILS{CSWIN{{ELSE USE DEFAULT RECORD LENGTH
6171: *
6172: * RESET TIMER
6173: *
6174: {INIX1{JSR{SYSTM{{{GET TIME AGAIN
6175: {{STI{TIMSX{{{STORE FOR END RUN PROCESSING
6176: {{ADD{CSWEX{NOXEQ{{ADD -NOEXECUTE FLAG
6177: {{BNZ{NOXEQ{INIX2{{JUMP IF EXECUTION SUPPRESSED
6178: {{ZER{GBCNT{{{INITIALISE COLLECT COUNT
6179: {{JSR{SYSBX{{{CALL BEFORE STARTING EXECUTION
6180: *
6181: * MERGE WHEN LISTING FILE SET FOR EXECUTION
6182: *
6183: {INIY0{MNZ{HEADP{{{MARK HEADERS OUT REGARDLESS
6184: {{ZER{-(SP){{{SET FAILURE LOCATION ON STACK
6185: {{MOV{SP{FLPTR{{SAVE PTR TO FAILURE OFFSET WORD
6186: {{MOV{R$COD{R9{{LOAD PTR TO ENTRY CODE BLOCK
6187: {{MOV{#STGXT{STAGE{{SET STAGE FOR EXECUTE TIME
6188: {{MOV{CMPSN{PFNTE{{COPY STMTS COMPILED COUNT IN CASE
6189: {{JSR{SYSTM{{{TIME YET AGAIN
6190: {{STI{PFSTM{{{
6191: {{BRI{(R9){{{START XEQ WITH FIRST STATEMENT
6192: *
6193: * HERE IF EXECUTION IS SUPPRESSED
6194: *
6195: {INIX2{JSR{PRTNL{{{PRINT A BLANK LINE
6196: {{MOV{#ENCM5{R9{{POINT TO /EXECUTION SUPPRESSED/
6197: {{JSR{PRTST{{{PRINT STRING
6198: {{JSR{PRTNL{{{OUTPUT LINE
6199: {{ZER{R6{{{SET ABEND VALUE TO ZERO
6200: {{MOV{#NINI9{R7{{SET SPECIAL CODE VALUE
6201: {{JSR{SYSEJ{{{END OF JOB, EXIT TO SYSTEM
6202: {{TTL{S{{{P I T B O L -- SNOBOL4 OPERATOR ROUTINES
6203: *
6204: * THIS SECTION INCLUDES ALL ROUTINES WHICH CAN BE ACCESSED
6205: * DIRECTLY FROM THE GENERATED CODE EXCEPT SYSTEM FUNCTIONS.
6206: *
6207: * ALL ROUTINES IN THIS SECTION START WITH A LABEL OF THE
6208: * FORM O$XXX WHERE XXX IS THREE LETTERS. THE GENERATED CODE
6209: * CONTAINS A POINTER TO THE APPROPRIATE ENTRY LABEL.
6210: *
6211: * SINCE THE GENERAL FORM OF THE GENERATED CODE CONSISTS OF
6212: * POINTERS TO BLOCKS WHOSE FIRST WORD IS THE ADDRESS OF THE
6213: * ACTUAL ENTRY POINT LABEL (O$XXX).
6214: *
6215: * THESE ROUTINES ARE IN ALPHABETICAL ORDER BY THEIR
6216: * ENTRY LABEL NAMES (I.E. BY THE XXX OF THE O$XXX NAME)
6217: *
6218: * THESE ROUTINES RECEIVE CONTROL AS FOLLOWS
6219: *
6220: * (CP) POINTER TO NEXT CODE WORD
6221: * (XS) CURRENT STACK POINTER
6222: {{EJC{{{{
6223: *
6224: * BINARY PLUS (ADDITION)
6225: *
6226: {O$ADD{ENT{{{{ENTRY POINT
6227: {{JSR{ARITH{{{FETCH ARITHMETIC OPERANDS
6228: {{ERR{001{ADDITION{{LEFT OPERAND IS NOT NUMERIC
6229: {{ERR{002{ADDITION{{RIGHT OPERAND IS NOT NUMERIC
6230: {{PPM{OADD1{{{JUMP IF REAL OPERANDS
6231: *
6232: * HERE TO ADD TWO INTEGERS
6233: *
6234: {{ADI{4*ICVAL(R10){{{ADD RIGHT OPERAND TO LEFT
6235: {{INO{EXINT{{{RETURN INTEGER IF NO OVERFLOW
6236: {{ERB{003{ADDITION{{CAUSED INTEGER OVERFLOW
6237: *
6238: * HERE TO ADD TWO REALS
6239: *
6240: {OADD1{ADR{4*RCVAL(R10){{{ADD RIGHT OPERAND TO LEFT
6241: {{RNO{EXREA{{{RETURN REAL IF NO OVERFLOW
6242: {{ERB{261{ADDITION{{CAUSED REAL OVERFLOW
6243: {{EJC{{{{
6244: *
6245: * UNARY PLUS (AFFIRMATION)
6246: *
6247: {O$AFF{ENT{{{{ENTRY POINT
6248: {{MOV{(SP)+{R9{{LOAD OPERAND
6249: {{JSR{GTNUM{{{CONVERT TO NUMERIC
6250: {{ERR{004{AFFIRMATION{{OPERAND IS NOT NUMERIC
6251: {{BRN{EXIXR{{{RETURN IF CONVERTED TO NUMERIC
6252: {{EJC{{{{
6253: *
6254: * BINARY BAR (ALTERNATION)
6255: *
6256: {O$ALT{ENT{{{{ENTRY POINT
6257: {{MOV{(SP)+{R9{{LOAD RIGHT OPERAND
6258: {{JSR{GTPAT{{{CONVERT TO PATTERN
6259: {{ERR{005{ALTERNATION{{RIGHT OPERAND IS NOT PATTERN
6260: *
6261: * MERGE HERE FROM SPECIAL (LEFT ALTERNATION) CASE
6262: *
6263: {OALT1{MOV{#P$ALT{R7{{SET PCODE FOR ALTERNATIVE NODE
6264: {{JSR{PBILD{{{BUILD ALTERNATIVE NODE
6265: {{MOV{R9{R10{{SAVE ADDRESS OF ALTERNATIVE NODE
6266: {{MOV{(SP)+{R9{{LOAD LEFT OPERAND
6267: {{JSR{GTPAT{{{CONVERT TO PATTERN
6268: {{ERR{006{ALTERNATION{{LEFT OPERAND IS NOT PATTERN
6269: {{BEQ{R9{#P$ALT{OALT2{JUMP IF LEFT ARG IS ALTERNATION
6270: {{MOV{R9{4*PTHEN(R10){{SET LEFT OPERAND AS SUCCESSOR
6271: {{MOV{R10{R9{{MOVE RESULT TO PROPER REGISTER
6272: {{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD
6273: *
6274: * COME HERE IF LEFT ARGUMENT IS ITSELF AN ALTERNATION
6275: *
6276: * THE RESULT IS MORE EFFICIENT IF WE MAKE THE REPLACEMENT
6277: *
6278: * (A / B) / C = A / (B / C)
6279: *
6280: {OALT2{MOV{4*PARM1(R9){4*PTHEN(R10){{BUILD THE (B / C) NODE
6281: {{MOV{4*PTHEN(R9){-(SP){{SET A AS NEW LEFT ARG
6282: {{MOV{R10{R9{{SET (B / C) AS NEW RIGHT ARG
6283: {{BRN{OALT1{{{MERGE BACK TO BUILD A / (B / C)
6284: {{EJC{{{{
6285: *
6286: * ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY NAME)
6287: *
6288: {O$AMN{ENT{{{{ENTRY POINT
6289: {{LCW{R9{{{LOAD NUMBER OF SUBSCRIPTS
6290: {{MOV{R9{R7{{SET FLAG FOR BY NAME
6291: {{BRN{ARREF{{{JUMP TO ARRAY REFERENCE ROUTINE
6292: {{EJC{{{{
6293: *
6294: * ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY VALUE)
6295: *
6296: {O$AMV{ENT{{{{ENTRY POINT
6297: {{LCW{R9{{{LOAD NUMBER OF SUBSCRIPTS
6298: {{ZER{R7{{{SET FLAG FOR BY VALUE
6299: {{BRN{ARREF{{{JUMP TO ARRAY REFERENCE ROUTINE
6300: {{EJC{{{{
6301: *
6302: * ARRAY REFERENCE (ONE SUBSCRIPT, BY NAME)
6303: *
6304: {O$AON{ENT{{{{ENTRY POINT
6305: {{MOV{(SP){R9{{LOAD SUBSCRIPT VALUE
6306: {{MOV{4*1(SP){R10{{LOAD ARRAY VALUE
6307: {{MOV{(R10){R6{{LOAD FIRST WORD OF ARRAY OPERAND
6308: {{BEQ{R6{#B$VCT{OAON2{JUMP IF VECTOR REFERENCE
6309: {{BEQ{R6{#B$TBT{OAON3{JUMP IF TABLE REFERENCE
6310: *
6311: * HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE
6312: *
6313: {OAON1{MOV{#NUM01{R9{{SET NUMBER OF SUBSCRIPTS TO ONE
6314: {{MOV{R9{R7{{SET FLAG FOR BY NAME
6315: {{BRN{ARREF{{{JUMP TO ARRAY REFERENCE ROUTINE
6316: *
6317: * HERE IF WE HAVE A VECTOR REFERENCE
6318: *
6319: {OAON2{BNE{(R9){#B$ICL{OAON1{USE LONG ROUTINE IF NOT INTEGER
6320: {{LDI{4*ICVAL(R9){{{LOAD INTEGER SUBSCRIPT VALUE
6321: {{MFI{R6{EXFAL{{COPY AS ADDRESS INT, FAIL IF OVFLO
6322: {{BZE{R6{EXFAL{{FAIL IF ZERO
6323: {{ADD{#VCVLB{R6{{COMPUTE OFFSET IN WORDS
6324: {{WTB{R6{{{CONVERT TO BYTES
6325: {{MOV{R6{(SP){{COMPLETE NAME ON STACK
6326: {{BLT{R6{4*VCLEN(R10){EXITS{EXIT IF SUBSCRIPT NOT TOO LARGE
6327: {{BRN{EXFAL{{{ELSE FAIL
6328: *
6329: * HERE FOR TABLE REFERENCE
6330: *
6331: {OAON3{MNZ{R7{{{SET FLAG FOR NAME REFERENCE
6332: {{JSR{TFIND{{{LOCATE/CREATE TABLE ELEMENT
6333: {{PPM{EXFAL{{{FAIL IF ACCESS FAILS
6334: {{MOV{R10{4*1(SP){{STORE NAME BASE ON STACK
6335: {{MOV{R6{(SP){{STORE NAME OFFSET ON STACK
6336: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK
6337: {{EJC{{{{
6338: *
6339: * ARRAY REFERENCE (ONE SUBSCRIPT, BY VALUE)
6340: *
6341: {O$AOV{ENT{{{{ENTRY POINT
6342: {{MOV{(SP)+{R9{{LOAD SUBSCRIPT VALUE
6343: {{MOV{(SP)+{R10{{LOAD ARRAY VALUE
6344: {{MOV{(R10){R6{{LOAD FIRST WORD OF ARRAY OPERAND
6345: {{BEQ{R6{#B$VCT{OAOV2{JUMP IF VECTOR REFERENCE
6346: {{BEQ{R6{#B$TBT{OAOV3{JUMP IF TABLE REFERENCE
6347: *
6348: * HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE
6349: *
6350: {OAOV1{MOV{R10{-(SP){{RESTACK ARRAY VALUE
6351: {{MOV{R9{-(SP){{RESTACK SUBSCRIPT
6352: {{MOV{#NUM01{R9{{SET NUMBER OF SUBSCRIPTS TO ONE
6353: {{ZER{R7{{{SET FLAG FOR VALUE CALL
6354: {{BRN{ARREF{{{JUMP TO ARRAY REFERENCE ROUTINE
6355: *
6356: * HERE IF WE HAVE A VECTOR REFERENCE
6357: *
6358: {OAOV2{BNE{(R9){#B$ICL{OAOV1{USE LONG ROUTINE IF NOT INTEGER
6359: {{LDI{4*ICVAL(R9){{{LOAD INTEGER SUBSCRIPT VALUE
6360: {{MFI{R6{EXFAL{{MOVE AS ONE WORD INT, FAIL IF OVFLO
6361: {{BZE{R6{EXFAL{{FAIL IF ZERO
6362: {{ADD{#VCVLB{R6{{COMPUTE OFFSET IN WORDS
6363: {{WTB{R6{{{CONVERT TO BYTES
6364: {{BGE{R6{4*VCLEN(R10){EXFAL{FAIL IF SUBSCRIPT TOO LARGE
6365: {{JSR{ACESS{{{ACCESS VALUE
6366: {{PPM{EXFAL{{{FAIL IF ACCESS FAILS
6367: {{BRN{EXIXR{{{ELSE RETURN VALUE TO CALLER
6368: *
6369: * HERE FOR TABLE REFERENCE BY VALUE
6370: *
6371: {OAOV3{ZER{R7{{{SET FLAG FOR VALUE REFERENCE
6372: {{JSR{TFIND{{{CALL TABLE SEARCH ROUTINE
6373: {{PPM{EXFAL{{{FAIL IF ACCESS FAILS
6374: {{BRN{EXIXR{{{EXIT WITH RESULT IN XR
6375: {{EJC{{{{
6376: *
6377: * ASSIGNMENT
6378: *
6379: {O$ASS{ENT{{{{ENTRY POINT
6380: *
6381: * O$RPL (PATTERN REPLACEMENT) MERGES HERE
6382: *
6383: {OASS0{MOV{(SP)+{R7{{LOAD VALUE TO BE ASSIGNED
6384: {{MOV{(SP)+{R6{{LOAD NAME OFFSET
6385: {{MOV{(SP){R10{{LOAD NAME BASE
6386: {{MOV{R7{(SP){{STORE ASSIGNED VALUE AS RESULT
6387: {{JSR{ASIGN{{{PERFORM ASSIGNMENT
6388: {{PPM{EXFAL{{{FAIL IF ASSIGNMENT FAILS
6389: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK
6390: {{EJC{{{{
6391: *
6392: * COMPILATION ERROR
6393: *
6394: {O$CER{ENT{{{{ENTRY POINT
6395: {{ERB{007{COMPILATION{{ERROR ENCOUNTERED DURING EXECUTION
6396: {{EJC{{{{
6397: *
6398: * UNARY AT (CURSOR ASSIGNMENT)
6399: *
6400: {O$CAS{ENT{{{{ENTRY POINT
6401: {{MOV{(SP)+{R8{{LOAD NAME OFFSET (PARM2)
6402: {{MOV{(SP)+{R9{{LOAD NAME BASE (PARM1)
6403: {{MOV{#P$CAS{R7{{SET PCODE FOR CURSOR ASSIGNMENT
6404: {{JSR{PBILD{{{BUILD NODE
6405: {{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD
6406: {{EJC{{{{
6407: *
6408: * CONCATENATION
6409: *
6410: {O$CNC{ENT{{{{ENTRY POINT
6411: {{MOV{(SP){R9{{LOAD RIGHT ARGUMENT
6412: {{BEQ{R9{#NULLS{OCNC3{JUMP IF RIGHT ARG IS NULL
6413: {{MOV{4*1(SP){R10{{LOAD LEFT ARGUMENT
6414: {{BEQ{R10{#NULLS{OCNC4{JUMP IF LEFT ARGUMENT IS NULL
6415: {{MOV{#B$SCL{R6{{GET CONSTANT TO TEST FOR STRING
6416: {{BNE{R6{(R10){OCNC2{JUMP IF LEFT ARG NOT A STRING
6417: {{BNE{R6{(R9){OCNC2{JUMP IF RIGHT ARG NOT A STRING
6418: *
6419: * MERGE HERE TO CONCATENATE TWO STRINGS
6420: *
6421: {OCNC1{MOV{4*SCLEN(R10){R6{{LOAD LEFT ARGUMENT LENGTH
6422: {{ADD{4*SCLEN(R9){R6{{COMPUTE RESULT LENGTH
6423: {{JSR{ALOCS{{{ALLOCATE SCBLK FOR RESULT
6424: {{MOV{R9{4*1(SP){{STORE RESULT PTR OVER LEFT ARGUMENT
6425: {{PSC{R9{{{PREPARE TO STORE CHARS OF RESULT
6426: {{MOV{4*SCLEN(R10){R6{{GET NUMBER OF CHARS IN LEFT ARG
6427: {{PLC{R10{{{PREPARE TO LOAD LEFT ARG CHARS
6428: {{MVC{{{{MOVE CHARACTERS OF LEFT ARGUMENT
6429: {{MOV{(SP)+{R10{{LOAD RIGHT ARG POINTER, POP STACK
6430: {{MOV{4*SCLEN(R10){R6{{LOAD NUMBER OF CHARS IN RIGHT ARG
6431: {{PLC{R10{{{PREPARE TO LOAD RIGHT ARG CHARS
6432: {{MVC{{{{MOVE CHARACTERS OF RIGHT ARGUMENT
6433: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK
6434: *
6435: * COME HERE IF ARGUMENTS ARE NOT BOTH STRINGS
6436: *
6437: {OCNC2{JSR{GTSTG{{{CONVERT RIGHT ARG TO STRING
6438: {{PPM{OCNC5{{{JUMP IF RIGHT ARG IS NOT STRING
6439: {{MOV{R9{R10{{SAVE RIGHT ARG PTR
6440: {{JSR{GTSTG{{{CONVERT LEFT ARG TO STRING
6441: {{PPM{OCNC6{{{JUMP IF LEFT ARG IS NOT A STRING
6442: {{MOV{R9{-(SP){{STACK LEFT ARGUMENT
6443: {{MOV{R10{-(SP){{STACK RIGHT ARGUMENT
6444: {{MOV{R9{R10{{MOVE LEFT ARG TO PROPER REG
6445: {{MOV{(SP){R9{{MOVE RIGHT ARG TO PROPER REG
6446: {{BRN{OCNC1{{{MERGE BACK TO CONCATENATE STRINGS
6447: {{EJC{{{{
6448: *
6449: * CONCATENATION (CONTINUED)
6450: *
6451: * COME HERE FOR NULL RIGHT ARGUMENT
6452: *
6453: {OCNC3{ICA{SP{{{REMOVE RIGHT ARG FROM STACK
6454: {{BRN{EXITS{{{RETURN WITH LEFT ARGUMENT ON STACK
6455: *
6456: * HERE FOR NULL LEFT ARGUMENT
6457: *
6458: {OCNC4{ICA{SP{{{UNSTACK ONE ARGUMENT
6459: {{MOV{R9{(SP){{STORE RIGHT ARGUMENT
6460: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK
6461: *
6462: * HERE IF RIGHT ARGUMENT IS NOT A STRING
6463: *
6464: {OCNC5{MOV{R9{R10{{MOVE RIGHT ARGUMENT PTR
6465: {{MOV{(SP)+{R9{{LOAD LEFT ARG POINTER
6466: *
6467: * MERGE HERE WHEN LEFT ARGUMENT IS NOT A STRING
6468: *
6469: {OCNC6{JSR{GTPAT{{{CONVERT LEFT ARG TO PATTERN
6470: {{ERR{008{CONCATENATION{{LEFT OPND IS NOT STRING OR PATTERN
6471: {{MOV{R9{-(SP){{SAVE RESULT ON STACK
6472: {{MOV{R10{R9{{POINT TO RIGHT OPERAND
6473: {{JSR{GTPAT{{{CONVERT TO PATTERN
6474: {{ERR{009{CONCATENATION{{RIGHT OPD IS NOT STRING OR PATTERN
6475: {{MOV{R9{R10{{MOVE FOR PCONC
6476: {{MOV{(SP)+{R9{{RELOAD LEFT OPERAND PTR
6477: {{JSR{PCONC{{{CONCATENATE PATTERNS
6478: {{BRN{EXIXR{{{EXIT WITH RESULT IN XR
6479: {{EJC{{{{
6480: *
6481: * COMPLEMENTATION
6482: *
6483: {O$COM{ENT{{{{ENTRY POINT
6484: {{MOV{(SP)+{R9{{LOAD OPERAND
6485: {{MOV{(R9){R6{{LOAD TYPE WORD
6486: *
6487: * MERGE BACK HERE AFTER CONVERSION
6488: *
6489: {OCOM1{BEQ{R6{#B$ICL{OCOM2{JUMP IF INTEGER
6490: {{BEQ{R6{#B$RCL{OCOM3{JUMP IF REAL
6491: {{JSR{GTNUM{{{ELSE CONVERT TO NUMERIC
6492: {{ERR{010{COMPLEMENTATION{{OPERAND IS NOT NUMERIC
6493: {{BRN{OCOM1{{{BACK TO CHECK CASES
6494: *
6495: * HERE TO COMPLEMENT INTEGER
6496: *
6497: {OCOM2{LDI{4*ICVAL(R9){{{LOAD INTEGER VALUE
6498: {{NGI{{{{NEGATE
6499: {{INO{EXINT{{{RETURN INTEGER IF NO OVERFLOW
6500: {{ERB{011{COMPLEMENTATION{{CAUSED INTEGER OVERFLOW
6501: *
6502: * HERE TO COMPLEMENT REAL
6503: *
6504: {OCOM3{LDR{4*RCVAL(R9){{{LOAD REAL VALUE
6505: {{NGR{{{{NEGATE
6506: {{BRN{EXREA{{{RETURN REAL RESULT
6507: {{EJC{{{{
6508: *
6509: * BINARY SLASH (DIVISION)
6510: *
6511: {O$DVD{ENT{{{{ENTRY POINT
6512: {{JSR{ARITH{{{FETCH ARITHMETIC OPERANDS
6513: {{ERR{012{DIVISION{{LEFT OPERAND IS NOT NUMERIC
6514: {{ERR{013{DIVISION{{RIGHT OPERAND IS NOT NUMERIC
6515: {{PPM{ODVD2{{{JUMP IF REAL OPERANDS
6516: *
6517: * HERE TO DIVIDE TWO INTEGERS
6518: *
6519: {{DVI{4*ICVAL(R10){{{DIVIDE LEFT OPERAND BY RIGHT
6520: {{INO{EXINT{{{RESULT OK IF NO OVERFLOW
6521: {{ERB{014{DIVISION{{CAUSED INTEGER OVERFLOW
6522: *
6523: * HERE TO DIVIDE TWO REALS
6524: *
6525: {ODVD2{DVR{4*RCVAL(R10){{{DIVIDE LEFT OPERAND BY RIGHT
6526: {{RNO{EXREA{{{RETURN REAL IF NO OVERFLOW
6527: {{ERB{262{DIVISION{{CAUSED REAL OVERFLOW
6528: {{EJC{{{{
6529: *
6530: * EXPONENTIATION
6531: *
6532: {O$EXP{ENT{{{{ENTRY POINT
6533: {{MOV{(SP)+{R9{{LOAD EXPONENT
6534: {{JSR{GTNUM{{{CONVERT TO NUMBER
6535: {{ERR{015{EXPONENTIATION{{RIGHT OPERAND IS NOT NUMERIC
6536: {{BNE{R6{#B$ICL{OEXP7{JUMP IF REAL
6537: {{MOV{R9{R10{{MOVE EXPONENT
6538: {{MOV{(SP)+{R9{{LOAD BASE
6539: {{JSR{GTNUM{{{CONVERT TO NUMERIC
6540: {{ERR{016{EXPONENTIATION{{LEFT OPERAND IS NOT NUMERIC
6541: {{LDI{4*ICVAL(R10){{{LOAD EXPONENT
6542: {{ILT{OEXP8{{{ERROR IF NEGATIVE EXPONENT
6543: {{BEQ{R6{#B$RCL{OEXP3{JUMP IF BASE IS REAL
6544: *
6545: * HERE TO EXPONENTIATE AN INTEGER
6546: *
6547: {{MFI{R6{OEXP2{{CONVERT EXPONENT TO 1 WORD INTEGER
6548: {{LCT{R6{R6{{SET LOOP COUNTER
6549: {{LDI{INTV1{{{LOAD INITIAL VALUE OF 1
6550: {{BNZ{R6{OEXP1{{JUMP IF NON-ZERO EXPONENT
6551: {{INE{EXINT{{{GIVE ZERO AS RESULT FOR NONZERO**0
6552: {{BRN{OEXP4{{{ELSE ERROR OF 0**0
6553: *
6554: * LOOP TO PERFORM EXPONENTIATION
6555: *
6556: {OEXP1{MLI{4*ICVAL(R9){{{MULTIPLY BY BASE
6557: {{IOV{OEXP2{{{JUMP IF OVERFLOW
6558: {{BCT{R6{OEXP1{{LOOP BACK TILL COMPUTATION COMPLETE
6559: {{BRN{EXINT{{{THEN RETURN INTEGER RESULT
6560: *
6561: * HERE IF INTEGER OVERFLOW
6562: *
6563: {OEXP2{ERB{017{EXPONENTIATION{{CAUSED INTEGER OVERFLOW
6564: {{EJC{{{{
6565: *
6566: * EXPONENTIATION (CONTINUED)
6567: *
6568: * HERE TO EXPONENTIATE A REAL
6569: *
6570: {OEXP3{MFI{R6{OEXP6{{CONVERT EXPONENT TO ONE WORD
6571: {{LCT{R6{R6{{SET LOOP COUNTER
6572: {{LDR{REAV1{{{LOAD 1.0 AS INITIAL VALUE
6573: {{BNZ{R6{OEXP5{{JUMP IF NON-ZERO EXPONENT
6574: {{RNE{EXREA{{{RETURN 1.0 IF NONZERO**ZERO
6575: *
6576: * HERE FOR ERROR OF 0**0 OR 0.0**0
6577: *
6578: {OEXP4{ERB{018{EXPONENTIATION{{RESULT IS UNDEFINED
6579: *
6580: * LOOP TO PERFORM EXPONENTIATION
6581: *
6582: {OEXP5{MLR{4*RCVAL(R9){{{MULTIPLY BY BASE
6583: {{ROV{OEXP6{{{JUMP IF OVERFLOW
6584: {{BCT{R6{OEXP5{{LOOP TILL COMPUTATION COMPLETE
6585: {{BRN{EXREA{{{THEN RETURN REAL RESULT
6586: *
6587: * HERE IF REAL OVERFLOW
6588: *
6589: {OEXP6{ERB{266{EXPONENTIATION{{CAUSED REAL OVERFLOW
6590: *
6591: * HERE IF REAL EXPONENT
6592: *
6593: {OEXP7{ERB{267{EXPONENTIATION{{RIGHT OPERAND IS REAL NOT INTEGER
6594: *
6595: * HERE FOR NEGATIVE EXPONENT
6596: *
6597: {OEXP8{ERB{019{EXPONENTIATION{{RIGHT OPERAND IS NEGATIVE
6598: {{EJC{{{{
6599: *
6600: * FAILURE IN EXPRESSION EVALUATION
6601: *
6602: * THIS ENTRY POINT IS USED IF THE EVALUATION OF AN
6603: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, FAILS.
6604: * CONTROL IS RETURNED TO AN APPROPRIATE POINT IN EVALX.
6605: *
6606: {O$FEX{ENT{{{{ENTRY POINT
6607: {{BRN{EVLX6{{{JUMP TO FAILURE LOC IN EVALX
6608: {{EJC{{{{
6609: *
6610: * FAILURE DURING EVALUATION OF A COMPLEX OR DIRECT GOTO
6611: *
6612: {O$FIF{ENT{{{{ENTRY POINT
6613: {{ERB{020{GOTO{{EVALUATION FAILURE
6614: {{EJC{{{{
6615: *
6616: * FUNCTION CALL (MORE THAN ONE ARGUMENT)
6617: *
6618: {O$FNC{ENT{{{{ENTRY POINT
6619: {{LCW{R6{{{LOAD NUMBER OF ARGUMENTS
6620: {{LCW{R9{{{LOAD FUNCTION VRBLK POINTER
6621: {{MOV{4*VRFNC(R9){R10{{LOAD FUNCTION POINTER
6622: {{BNE{R6{4*FARGS(R10){CFUNC{USE CENTRAL ROUTINE IF WRONG NUM
6623: {{BRI{(R10){{{JUMP TO FUNCTION IF ARG COUNT OK
6624: {{EJC{{{{
6625: *
6626: * FUNCTION NAME ERROR
6627: *
6628: {O$FNE{ENT{{{{ENTRY POINT
6629: {{LCW{R6{{{GET NEXT CODE WORD
6630: {{BNE{R6{#ORNM${OFNE1{FAIL IF NOT EVALUATING EXPRESSION
6631: {{BZE{4*2(SP){EVLX3{{OK IF EXPR. WAS WANTED BY VALUE
6632: *
6633: * HERE FOR ERROR
6634: *
6635: {OFNE1{ERB{021{FUNCTION{{CALLED BY NAME RETURNED A VALUE
6636: {{EJC{{{{
6637: *
6638: * FUNCTION CALL (SINGLE ARGUMENT)
6639: *
6640: {O$FNS{ENT{{{{ENTRY POINT
6641: {{LCW{R9{{{LOAD FUNCTION VRBLK POINTER
6642: {{MOV{#NUM01{R6{{SET NUMBER OF ARGUMENTS TO ONE
6643: {{MOV{4*VRFNC(R9){R10{{LOAD FUNCTION POINTER
6644: {{BNE{R6{4*FARGS(R10){CFUNC{USE CENTRAL ROUTINE IF WRONG NUM
6645: {{BRI{(R10){{{JUMP TO FUNCTION IF ARG COUNT OK
6646: {{EJC{{{{
6647: * CALL TO UNDEFINED FUNCTION
6648: *
6649: {O$FUN{ENT{{{{ENTRY POINT
6650: {{ERB{022{UNDEFINED{{FUNCTION CALLED
6651: {{EJC{{{{
6652: *
6653: * EXECUTE COMPLEX GOTO
6654: *
6655: {O$GOC{ENT{{{{ENTRY POINT
6656: {{MOV{4*1(SP){R9{{LOAD NAME BASE POINTER
6657: {{BHI{R9{STATE{OGOC1{JUMP IF NOT NATURAL VARIABLE
6658: {{ADD{#4*VRTRA{R9{{ELSE POINT TO VRTRA FIELD
6659: {{BRI{(R9){{{AND JUMP THROUGH IT
6660: *
6661: * HERE IF GOTO OPERAND IS NOT NATURAL VARIABLE
6662: *
6663: {OGOC1{ERB{023{GOTO{{OPERAND IS NOT A NATURAL VARIABLE
6664: {{EJC{{{{
6665: *
6666: * EXECUTE DIRECT GOTO
6667: *
6668: {O$GOD{ENT{{{{ENTRY POINT
6669: {{MOV{(SP){R9{{LOAD OPERAND
6670: {{MOV{(R9){R6{{LOAD FIRST WORD
6671: {{BEQ{R6{#B$CDS{BCDS0{JUMP IF CODE BLOCK TO CODE ROUTINE
6672: {{BEQ{R6{#B$CDC{BCDC0{JUMP IF CODE BLOCK TO CODE ROUTINE
6673: {{ERB{024{GOTO{{OPERAND IN DIRECT GOTO IS NOT CODE
6674: {{EJC{{{{
6675: *
6676: * SET GOTO FAILURE TRAP
6677: *
6678: * THIS ROUTINE IS EXECUTED AT THE START OF A COMPLEX OR
6679: * DIRECT FAILURE GOTO TO TRAP A SUBSEQUENT FAIL (SEE EXFAL)
6680: *
6681: {O$GOF{ENT{{{{ENTRY POINT
6682: {{MOV{FLPTR{R9{{POINT TO FAIL OFFSET ON STACK
6683: {{ICA{(R9){{{POINT FAILURE TO O$FIF WORD
6684: {{ICP{{{{POINT TO NEXT CODE WORD
6685: {{BRN{EXITS{{{EXIT TO CONTINUE
6686: {{EJC{{{{
6687: *
6688: * BINARY DOLLAR (IMMEDIATE ASSIGNMENT)
6689: *
6690: * THE PATTERN BUILT BY BINARY DOLLAR IS A COMPOUND PATTERN.
6691: * SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR
6692: * DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED.
6693: *
6694: {O$IMA{ENT{{{{ENTRY POINT
6695: {{MOV{#P$IMC{R7{{SET PCODE FOR LAST NODE
6696: {{MOV{(SP)+{R8{{POP NAME OFFSET (PARM2)
6697: {{MOV{(SP)+{R9{{POP NAME BASE (PARM1)
6698: {{JSR{PBILD{{{BUILD P$IMC NODE
6699: {{MOV{R9{R10{{SAVE PTR TO NODE
6700: {{MOV{(SP){R9{{LOAD LEFT ARGUMENT
6701: {{JSR{GTPAT{{{CONVERT TO PATTERN
6702: {{ERR{025{IMMEDIATE{{ASSIGNMENT LEFT OPERAND IS NOT PATTERN
6703: {{MOV{R9{(SP){{SAVE PTR TO LEFT OPERAND PATTERN
6704: {{MOV{#P$IMA{R7{{SET PCODE FOR FIRST NODE
6705: {{JSR{PBILD{{{BUILD P$IMA NODE
6706: {{MOV{(SP)+{4*PTHEN(R9){{SET LEFT OPERAND AS P$IMA SUCCESSOR
6707: {{JSR{PCONC{{{CONCATENATE TO FORM FINAL PATTERN
6708: {{BRN{EXIXR{{{ALL DONE
6709: {{EJC{{{{
6710: *
6711: * INDIRECTION (BY NAME)
6712: *
6713: {O$INN{ENT{{{{ENTRY POINT
6714: {{MNZ{R7{{{SET FLAG FOR RESULT BY NAME
6715: {{BRN{INDIR{{{JUMP TO COMMON ROUTINE
6716: {{EJC{{{{
6717: *
6718: * INTERROGATION
6719: *
6720: {O$INT{ENT{{{{ENTRY POINT
6721: {{MOV{#NULLS{(SP){{REPLACE OPERAND WITH NULL
6722: {{BRN{EXITS{{{EXIT FOR NEXT CODE WORD
6723: {{EJC{{{{
6724: *
6725: * INDIRECTION (BY VALUE)
6726: *
6727: {O$INV{ENT{{{{ENTRY POINT
6728: {{ZER{R7{{{SET FLAG FOR BY VALUE
6729: {{BRN{INDIR{{{JUMP TO COMMON ROUTINE
6730: {{EJC{{{{
6731: *
6732: * KEYWORD REFERENCE (BY NAME)
6733: *
6734: {O$KWN{ENT{{{{ENTRY POINT
6735: {{JSR{KWNAM{{{GET KEYWORD NAME
6736: {{BRN{EXNAM{{{EXIT WITH RESULT NAME
6737: {{EJC{{{{
6738: *
6739: * KEYWORD REFERENCE (BY VALUE)
6740: *
6741: {O$KWV{ENT{{{{ENTRY POINT
6742: {{JSR{KWNAM{{{GET KEYWORD NAME
6743: {{MOV{R9{DNAMP{{DELETE KVBLK
6744: {{JSR{ACESS{{{ACCESS VALUE
6745: {{PPM{EXNUL{{{DUMMY (UNUSED) FAILURE RETURN
6746: {{BRN{EXIXR{{{JUMP WITH VALUE IN XR
6747: {{EJC{{{{
6748: *
6749: * LOAD EXPRESSION BY NAME
6750: *
6751: {O$LEX{ENT{{{{ENTRY POINT
6752: {{MOV{#4*EVSI${R6{{SET SIZE OF EVBLK
6753: {{JSR{ALLOC{{{ALLOCATE SPACE FOR EVBLK
6754: {{MOV{#B$EVT{(R9){{SET TYPE WORD
6755: {{MOV{#TRBEV{4*EVVAR(R9){{SET DUMMY TRBLK POINTER
6756: {{LCW{R6{{{LOAD EXBLK POINTER
6757: {{MOV{R6{4*EVEXP(R9){{SET EXBLK POINTER
6758: {{MOV{R9{R10{{MOVE NAME BASE TO PROPER REG
6759: {{MOV{#4*EVVAR{R6{{SET NAME OFFSET = ZERO
6760: {{BRN{EXNAM{{{EXIT WITH NAME IN (XL,WA)
6761: {{EJC{{{{
6762: *
6763: * LOAD PATTERN VALUE
6764: *
6765: {O$LPT{ENT{{{{ENTRY POINT
6766: {{LCW{R9{{{LOAD PATTERN POINTER
6767: {{BRN{EXIXR{{{STACK PTR AND OBEY NEXT CODE WORD
6768: {{EJC{{{{
6769: *
6770: * LOAD VARIABLE NAME
6771: *
6772: {O$LVN{ENT{{{{ENTRY POINT
6773: {{LCW{R6{{{LOAD VRBLK POINTER
6774: {{MOV{R6{-(SP){{STACK VRBLK PTR (NAME BASE)
6775: {{MOV{#4*VRVAL{-(SP){{STACK NAME OFFSET
6776: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK
6777: {{EJC{{{{
6778: *
6779: * BINARY ASTERISK (MULTIPLICATION)
6780: *
6781: {O$MLT{ENT{{{{ENTRY POINT
6782: {{JSR{ARITH{{{FETCH ARITHMETIC OPERANDS
6783: {{ERR{026{MULTIPLICATION{{LEFT OPERAND IS NOT NUMERIC
6784: {{ERR{027{MULTIPLICATION{{RIGHT OPERAND IS NOT NUMERIC
6785: {{PPM{OMLT1{{{JUMP IF REAL OPERANDS
6786: *
6787: * HERE TO MULTIPLY TWO INTEGERS
6788: *
6789: {{MLI{4*ICVAL(R10){{{MULTIPLY LEFT OPERAND BY RIGHT
6790: {{INO{EXINT{{{RETURN INTEGER IF NO OVERFLOW
6791: {{ERB{028{MULTIPLICATION{{CAUSED INTEGER OVERFLOW
6792: *
6793: * HERE TO MULTIPLY TWO REALS
6794: *
6795: {OMLT1{MLR{4*RCVAL(R10){{{MULTIPLY LEFT OPERAND BY RIGHT
6796: {{RNO{EXREA{{{RETURN REAL IF NO OVERFLOW
6797: {{ERB{263{MULTIPLICATION{{CAUSED REAL OVERFLOW
6798: {{EJC{{{{
6799: *
6800: * NAME REFERENCE
6801: *
6802: {O$NAM{ENT{{{{ENTRY POINT
6803: {{MOV{#4*NMSI${R6{{SET LENGTH OF NMBLK
6804: {{JSR{ALLOC{{{ALLOCATE NMBLK
6805: {{MOV{#B$NML{(R9){{SET NAME BLOCK CODE
6806: {{MOV{(SP)+{4*NMOFS(R9){{SET NAME OFFSET FROM OPERAND
6807: {{MOV{(SP)+{4*NMBAS(R9){{SET NAME BASE FROM OPERAND
6808: {{BRN{EXIXR{{{EXIT WITH RESULT IN XR
6809: {{EJC{{{{
6810: *
6811: * NEGATION
6812: *
6813: * INITIAL ENTRY
6814: *
6815: {O$NTA{ENT{{{{ENTRY POINT
6816: {{LCW{R6{{{LOAD NEW FAILURE OFFSET
6817: {{MOV{FLPTR{-(SP){{STACK OLD FAILURE POINTER
6818: {{MOV{R6{-(SP){{STACK NEW FAILURE OFFSET
6819: {{MOV{SP{FLPTR{{SET NEW FAILURE POINTER
6820: {{BRN{EXITS{{{JUMP TO CONTINUE EXECUTION
6821: *
6822: * ENTRY AFTER SUCCESSFUL EVALUATION OF OPERAND
6823: *
6824: {O$NTB{ENT{{{{ENTRY POINT
6825: {{MOV{4*2(SP){FLPTR{{RESTORE OLD FAILURE POINTER
6826: {{BRN{EXFAL{{{AND FAIL
6827: *
6828: * ENTRY FOR FAILURE DURING OPERAND EVALUATION
6829: *
6830: {O$NTC{ENT{{{{ENTRY POINT
6831: {{ICA{SP{{{POP FAILURE OFFSET
6832: {{MOV{(SP)+{FLPTR{{RESTORE OLD FAILURE POINTER
6833: {{BRN{EXNUL{{{EXIT GIVING NULL RESULT
6834: {{EJC{{{{
6835: *
6836: * USE OF UNDEFINED OPERATOR
6837: *
6838: {O$OUN{ENT{{{{ENTRY POINT
6839: {{ERB{029{UNDEFINED{{OPERATOR REFERENCED
6840: {{EJC{{{{
6841: *
6842: * BINARY DOT (PATTERN ASSIGNMENT)
6843: *
6844: * THE PATTERN BUILT BY BINARY DOT IS A COMPOUND PATTERN.
6845: * SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR
6846: * DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED.
6847: *
6848: {O$PAS{ENT{{{{ENTRY POINT
6849: {{MOV{#P$PAC{R7{{LOAD PCODE FOR P$PAC NODE
6850: {{MOV{(SP)+{R8{{LOAD NAME OFFSET (PARM2)
6851: {{MOV{(SP)+{R9{{LOAD NAME BASE (PARM1)
6852: {{JSR{PBILD{{{BUILD P$PAC NODE
6853: {{MOV{R9{R10{{SAVE PTR TO NODE
6854: {{MOV{(SP){R9{{LOAD LEFT OPERAND
6855: {{JSR{GTPAT{{{CONVERT TO PATTERN
6856: {{ERR{030{PATTERN{{ASSIGNMENT LEFT OPERAND IS NOT PATTERN
6857: {{MOV{R9{(SP){{SAVE PTR TO LEFT OPERAND PATTERN
6858: {{MOV{#P$PAA{R7{{SET PCODE FOR P$PAA NODE
6859: {{JSR{PBILD{{{BUILD P$PAA NODE
6860: {{MOV{(SP)+{4*PTHEN(R9){{SET LEFT OPERAND AS P$PAA SUCCESSOR
6861: {{JSR{PCONC{{{CONCATENATE TO FORM FINAL PATTERN
6862: {{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD
6863: {{EJC{{{{
6864: *
6865: * PATTERN MATCH (BY NAME, FOR REPLACEMENT)
6866: *
6867: {O$PMN{ENT{{{{ENTRY POINT
6868: {{ZER{R7{{{SET TYPE CODE FOR MATCH BY NAME
6869: {{BRN{MATCH{{{JUMP TO ROUTINE TO START MATCH
6870: {{EJC{{{{
6871: *
6872: * PATTERN MATCH (STATEMENT)
6873: *
6874: * O$PMS IS USED IN PLACE OF O$PMV WHEN THE PATTERN MATCH
6875: * OCCURS AT THE OUTER (STATEMENT) LEVEL SINCE IN THIS
6876: * CASE THE SUBSTRING VALUE NEED NOT BE CONSTRUCTED.
6877: *
6878: {O$PMS{ENT{{{{ENTRY POINT
6879: {{MOV{#NUM02{R7{{SET FLAG FOR STATEMENT TO MATCH
6880: {{BRN{MATCH{{{JUMP TO ROUTINE TO START MATCH
6881: {{EJC{{{{
6882: *
6883: * PATTERN MATCH (BY VALUE)
6884: *
6885: {O$PMV{ENT{{{{ENTRY POINT
6886: {{MOV{#NUM01{R7{{SET TYPE CODE FOR VALUE MATCH
6887: {{BRN{MATCH{{{JUMP TO ROUTINE TO START MATCH
6888: {{EJC{{{{
6889: *
6890: * POP TOP ITEM ON STACK
6891: *
6892: {O$POP{ENT{{{{ENTRY POINT
6893: {{ICA{SP{{{POP TOP STACK ENTRY
6894: {{BRN{EXITS{{{OBEY NEXT CODE WORD
6895: {{EJC{{{{
6896: *
6897: * TERMINATE EXECUTION (CODE COMPILED FOR END STATEMENT)
6898: *
6899: {O$STP{ENT{{{{ENTRY POINT
6900: {{BRN{LEND0{{{JUMP TO END CIRCUIT
6901: {{EJC{{{{
6902: *
6903: * RETURN NAME FROM EXPRESSION
6904: * THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN
6905: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS
6906: * A NAME. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX.
6907: *
6908: {O$RNM{ENT{{{{ENTRY POINT
6909: {{BRN{EVLX4{{{RETURN TO EVALX PROCEDURE
6910: {{EJC{{{{
6911: *
6912: * PATTERN REPLACEMENT
6913: *
6914: * WHEN THIS ROUTINE GETS CONTROL, THE FOLLOWING STACK
6915: * ENTRIES HAVE BEEN MADE (SEE END OF MATCH ROUTINE P$NTH)
6916: *
6917: * SUBJECT NAME BASE
6918: * SUBJECT NAME OFFSET
6919: * INITIAL CURSOR VALUE
6920: * FINAL CURSOR VALUE
6921: * SUBJECT POINTER
6922: * (XS) ---------------- REPLACEMENT VALUE
6923: *
6924: {O$RPL{ENT{{{{ENTRY POINT
6925: {{JSR{GTSTG{{{CONVERT REPLACEMENT VAL TO STRING
6926: {{ERR{031{PATTERN{{REPLACEMENT RIGHT OPERAND IS NOT STRING
6927: *
6928: * GET RESULT LENGTH AND ALLOCATE RESULT SCBLK
6929: *
6930: {{MOV{(SP){R10{{LOAD SUBJECT STRING POINTER
6931: {{BEQ{(R10){#B$BCT{ORPL4{BRANCH IF BUFFER ASSIGNMENT
6932: {{ADD{4*SCLEN(R10){R6{{ADD SUBJECT STRING LENGTH
6933: {{ADD{4*2(SP){R6{{ADD STARTING CURSOR
6934: {{SUB{4*1(SP){R6{{MINUS FINAL CURSOR = TOTAL LENGTH
6935: {{BZE{R6{ORPL3{{JUMP IF RESULT IS NULL
6936: {{MOV{R9{-(SP){{RESTACK REPLACEMENT STRING
6937: {{JSR{ALOCS{{{ALLOCATE SCBLK FOR RESULT
6938: {{MOV{4*3(SP){R6{{GET INITIAL CURSOR (PART 1 LEN)
6939: {{MOV{R9{4*3(SP){{STACK RESULT POINTER
6940: {{PSC{R9{{{POINT TO CHARACTERS OF RESULT
6941: *
6942: * MOVE PART 1 (START OF SUBJECT) TO RESULT
6943: *
6944: {{BZE{R6{ORPL1{{JUMP IF FIRST PART IS NULL
6945: {{MOV{4*1(SP){R10{{ELSE POINT TO SUBJECT STRING
6946: {{PLC{R10{{{POINT TO SUBJECT STRING CHARS
6947: {{MVC{{{{MOVE FIRST PART TO RESULT
6948: {{EJC{{{{
6949: * PATTERN REPLACEMENT (CONTINUED)
6950: *
6951: * NOW MOVE IN REPLACEMENT VALUE
6952: *
6953: {ORPL1{MOV{(SP)+{R10{{LOAD REPLACEMENT STRING, POP
6954: {{MOV{4*SCLEN(R10){R6{{LOAD LENGTH
6955: {{BZE{R6{ORPL2{{JUMP IF NULL REPLACEMENT
6956: {{PLC{R10{{{ELSE POINT TO CHARS OF REPLACEMENT
6957: {{MVC{{{{MOVE IN CHARS (PART 2)
6958: *
6959: * NOW MOVE IN REMAINDER OF STRING (PART 3)
6960: *
6961: {ORPL2{MOV{(SP)+{R10{{LOAD SUBJECT STRING POINTER, POP
6962: {{MOV{(SP)+{R8{{LOAD FINAL CURSOR, POP
6963: {{MOV{4*SCLEN(R10){R6{{LOAD SUBJECT STRING LENGTH
6964: {{SUB{R8{R6{{MINUS FINAL CURSOR = PART 3 LENGTH
6965: {{BZE{R6{OASS0{{JUMP TO ASSIGN IF PART 3 IS NULL
6966: {{PLC{R10{R8{{ELSE POINT TO LAST PART OF STRING
6967: {{MVC{{{{MOVE PART 3 TO RESULT
6968: {{BRN{OASS0{{{JUMP TO PERFORM ASSIGNMENT
6969: *
6970: * HERE IF RESULT IS NULL
6971: *
6972: {ORPL3{ADD{#4*NUM02{SP{{POP SUBJECT STR PTR, FINAL CURSOR
6973: {{MOV{#NULLS{(SP){{SET NULL RESULT
6974: {{BRN{OASS0{{{JUMP TO ASSIGN NULL VALUE
6975: *
6976: * HERE FOR BUFFER SUBSTRING ASSIGNMENT
6977: *
6978: {ORPL4{MOV{R9{R10{{COPY SCBLK REPLACEMENT PTR
6979: {{MOV{(SP)+{R9{{UNSTACK BCBLK PTR
6980: {{MOV{(SP)+{R7{{GET FINAL CURSOR VALUE
6981: {{MOV{(SP)+{R6{{GET INITIAL CURSOR
6982: {{SUB{R6{R7{{GET LENGTH IN WB
6983: {{ADD{#4*NUM02{SP{{GET RID OF NAME BASE/OFFSET
6984: {{JSR{INSBF{{{INSERT SUBSTRING
6985: {{PPM{{{{CONVERT FAIL IMPOSSIBLE
6986: {{PPM{EXFAL{{{FAIL IF INSERT FAILS
6987: {{BRN{EXNUL{{{ELSE NULL RESULT
6988: {{EJC{{{{
6989: *
6990: * RETURN VALUE FROM EXPRESSION
6991: *
6992: * THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN
6993: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS
6994: * A VALUE. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX
6995: *
6996: {O$RVL{ENT{{{{ENTRY POINT
6997: {{BRN{EVLX3{{{RETURN TO EVALX PROCEDURE
6998: {{EJC{{{{
6999: *
7000: * SELECTION
7001: *
7002: * INITIAL ENTRY
7003: *
7004: {O$SLA{ENT{{{{ENTRY POINT
7005: {{LCW{R6{{{LOAD NEW FAILURE OFFSET
7006: {{MOV{FLPTR{-(SP){{STACK OLD FAILURE POINTER
7007: {{MOV{R6{-(SP){{STACK NEW FAILURE OFFSET
7008: {{MOV{SP{FLPTR{{SET NEW FAILURE POINTER
7009: {{BRN{EXITS{{{JUMP TO EXECUTE FIRST ALTERNATIVE
7010: *
7011: * ENTRY AFTER SUCCESSFUL EVALUATION OF ALTERNATIVE
7012: *
7013: {O$SLB{ENT{{{{ENTRY POINT
7014: {{MOV{(SP)+{R9{{LOAD RESULT
7015: {{ICA{SP{{{POP FAIL OFFSET
7016: {{MOV{(SP){FLPTR{{RESTORE OLD FAILURE POINTER
7017: {{MOV{R9{(SP){{RESTACK RESULT
7018: {{LCW{R6{{{LOAD NEW CODE OFFSET
7019: {{ADD{R$COD{R6{{POINT TO ABSOLUTE CODE LOCATION
7020: {{LCP{R6{{{SET NEW CODE POINTER
7021: {{BRN{EXITS{{{JUMP TO CONTINUE PAST SELECTION
7022: *
7023: * ENTRY AT START OF SUBSEQUENT ALTERNATIVES
7024: *
7025: {O$SLC{ENT{{{{ENTRY POINT
7026: {{LCW{R6{{{LOAD NEW FAIL OFFSET
7027: {{MOV{R6{(SP){{STORE NEW FAIL OFFSET
7028: {{BRN{EXITS{{{JUMP TO EXECUTE NEXT ALTERNATIVE
7029: *
7030: * ENTRY AT START OF LAST ALTERNATIVE
7031: *
7032: {O$SLD{ENT{{{{ENTRY POINT
7033: {{ICA{SP{{{POP FAILURE OFFSET
7034: {{MOV{(SP)+{FLPTR{{RESTORE OLD FAILURE POINTER
7035: {{BRN{EXITS{{{JUMP TO EXECUTE LAST ALTERNATIVE
7036: {{EJC{{{{
7037: *
7038: * BINARY MINUS (SUBTRACTION)
7039: *
7040: {O$SUB{ENT{{{{ENTRY POINT
7041: {{JSR{ARITH{{{FETCH ARITHMETIC OPERANDS
7042: {{ERR{032{SUBTRACTION{{LEFT OPERAND IS NOT NUMERIC
7043: {{ERR{033{SUBTRACTION{{RIGHT OPERAND IS NOT NUMERIC
7044: {{PPM{OSUB1{{{JUMP IF REAL OPERANDS
7045: *
7046: * HERE TO SUBTRACT TWO INTEGERS
7047: *
7048: {{SBI{4*ICVAL(R10){{{SUBTRACT RIGHT OPERAND FROM LEFT
7049: {{INO{EXINT{{{RETURN INTEGER IF NO OVERFLOW
7050: {{ERB{034{SUBTRACTION{{CAUSED INTEGER OVERFLOW
7051: *
7052: * HERE TO SUBTRACT TWO REALS
7053: *
7054: {OSUB1{SBR{4*RCVAL(R10){{{SUBTRACT RIGHT OPERAND FROM LEFT
7055: {{RNO{EXREA{{{RETURN REAL IF NO OVERFLOW
7056: {{ERB{264{SUBTRACTION{{CAUSED REAL OVERFLOW
7057: {{EJC{{{{
7058: *
7059: * DUMMY OPERATOR TO RETURN CONTROL TO TRXEQ PROCEDURE
7060: *
7061: {O$TXR{ENT{{{{ENTRY POINT
7062: {{BRN{TRXQ1{{{JUMP INTO TRXEQ PROCEDURE
7063: {{EJC{{{{
7064: *
7065: * UNEXPECTED FAILURE
7066: *
7067: * NOTE THAT IF A SETEXIT TRAP IS OPERATING THEN
7068: * TRANSFER TO SYSTEM LABEL CONTINUE
7069: * WILL RESULT IN LOOPING HERE. DIFFICULT TO AVOID EXCEPT
7070: * WITH A CONSIDERABLE OVERHEAD WHICH IS NOT WORTHWHILE OR
7071: * ELSE BY A TECHNIQUE SUCH AS SETTING KVERL TO ZERO.
7072: *
7073: {O$UNF{ENT{{{{ENTRY POINT
7074: {{ERB{035{UNEXPECTED{{FAILURE IN -NOFAIL MODE
7075: {{TTL{S{{{P I T B O L -- SNOBOL4 BUILTIN LABEL ROUTINES
7076: *
7077: * THE FOLLOWING SECTION CONTAINS THE ROUTINES FOR LABELS
7078: * WHICH HAVE A PREDEFINED MEANING IN SNOBOL4.
7079: *
7080: * CONTROL IS PASSED DIRECTLY TO THE LABEL NAME ENTRY POINT.
7081: *
7082: * ENTRY NAMES ARE OF THE FORM L$XXX WHERE XXX IS THE THREE
7083: * LETTER VARIABLE NAME IDENTIFIER.
7084: *
7085: * ENTRIES ARE IN ALPHABETICAL ORDER
7086: {{EJC{{{{
7087: *
7088: * ABORT
7089: *
7090: {L$ABO{ENT{{{{ENTRY POINT
7091: *
7092: * MERGE HERE IF EXECUTION TERMINATES IN ERROR
7093: *
7094: {LABO1{MOV{KVERT{R6{{LOAD ERROR CODE
7095: {{BZE{R6{LABO2{{JUMP IF NO ERROR HAS OCCURED
7096: {{JSR{SYSAX{{{CALL AFTER EXECUTION PROC (REG04)
7097: {{JSR{PRTPG{{{ELSE EJECT PRINTER
7098: {{JSR{ERMSG{{{PRINT ERROR MESSAGE
7099: {{ZER{R9{{{INDICATE NO MESSAGE TO PRINT
7100: {{BRN{STOPR{{{JUMP TO ROUTINE TO STOP RUN
7101: *
7102: * HERE IF NO ERROR HAD OCCURED
7103: *
7104: {LABO2{ERB{036{GOTO{{ABORT WITH NO PRECEDING ERROR
7105: {{EJC{{{{
7106: *
7107: * CONTINUE
7108: *
7109: {L$CNT{ENT{{{{ENTRY POINT
7110: *
7111: * MERGE HERE AFTER EXECUTION ERROR
7112: *
7113: {LCNT1{MOV{R$CNT{R9{{LOAD CONTINUATION CODE BLOCK PTR
7114: {{BZE{R9{LCNT2{{JUMP IF NO PREVIOUS ERROR
7115: {{ZER{R$CNT{{{CLEAR FLAG
7116: {{MOV{R9{R$COD{{ELSE STORE AS NEW CODE BLOCK PTR
7117: {{ADD{STXOF{R9{{ADD FAILURE OFFSET
7118: {{LCP{R9{{{LOAD CODE POINTER
7119: {{MOV{FLPTR{SP{{RESET STACK POINTER
7120: {{BRN{EXITS{{{JUMP TO TAKE INDICATED FAILURE
7121: *
7122: * HERE IF NO PREVIOUS ERROR
7123: *
7124: {LCNT2{ERB{037{GOTO{{CONTINUE WITH NO PRECEDING ERROR
7125: {{EJC{{{{
7126: *
7127: * END
7128: *
7129: {L$END{ENT{{{{ENTRY POINT
7130: *
7131: * MERGE HERE FROM END CODE CIRCUIT
7132: *
7133: {LEND0{MOV{#ENDMS{R9{{POINT TO MESSAGE /NORMAL TERM../
7134: {{BRN{STOPR{{{JUMP TO ROUTINE TO STOP RUN
7135: {{EJC{{{{
7136: *
7137: * FRETURN
7138: *
7139: {L$FRT{ENT{{{{ENTRY POINT
7140: {{MOV{#SCFRT{R6{{POINT TO STRING /FRETURN/
7141: {{BRN{RETRN{{{JUMP TO COMMON RETURN ROUTINE
7142: {{EJC{{{{
7143: *
7144: * NRETURN
7145: *
7146: {L$NRT{ENT{{{{ENTRY POINT
7147: {{MOV{#SCNRT{R6{{POINT TO STRING /NRETURN/
7148: {{BRN{RETRN{{{JUMP TO COMMON RETURN ROUTINE
7149: {{EJC{{{{
7150: *
7151: * RETURN
7152: *
7153: {L$RTN{ENT{{{{ENTRY POINT
7154: {{MOV{#SCRTN{R6{{POINT TO STRING /RETURN/
7155: {{BRN{RETRN{{{JUMP TO COMMON RETURN ROUTINE
7156: {{EJC{{{{
7157: *
7158: * UNDEFINED LABEL
7159: *
7160: {L$UND{ENT{{{{ENTRY POINT
7161: {{ERB{038{GOTO{{UNDEFINED LABEL
7162: {{TTL{S{{{P I T B O L -- BLOCK ACTION ROUTINES
7163: *
7164: * THE FIRST WORD OF EVERY BLOCK IN DYNAMIC STORAGE AND THE
7165: * VRGET, VRSTO AND VRTRA FIELDS OF A VRBLK CONTAIN A
7166: * POINTER TO AN ENTRY POINT IN THE PROGRAM. ALL SUCH ENTRY
7167: * POINTS ARE IN THE FOLLOWING SECTION EXCEPT THOSE FOR
7168: * PATTERN BLOCKS WHICH ARE IN THE PATTERN MATCHING SEGMENT
7169: * LATER ON (LABELS OF THE FORM P$XXX), AND DOPE VECTORS
7170: * (D$XXX) WHICH ARE IN THE DOPE VECTOR SECTION FOLLOWING
7171: * THE PATTERN ROUTINES (DOPE VECTORS ARE USED FOR CMBLKS).
7172: *
7173: * THE ENTRY POINTS IN THIS SECTION HAVE LABELS OF THE
7174: * FORM B$XXY WHERE XX IS THE TWO CHARACTER BLOCK TYPE FOR
7175: * THE CORRESPONDING BLOCK AND Y IS ANY LETTER.
7176: *
7177: * IN SOME CASES, THE POINTERS SERVE NO OTHER PURPOSE THAN
7178: * TO IDENTIFY THE BLOCK TYPE. IN THIS CASE THE ROUTINE
7179: * IS NEVER EXECUTED AND THUS NO CODE IS ASSEMBLED.
7180: *
7181: * FOR EACH OF THESE ENTRY POINTS CORRESPONDING TO A BLOCK
7182: * AN ENTRY POINT IDENTIFICATION IS ASSEMBLED (BL$XX).
7183: *
7184: * THE EXACT ENTRY CONDITIONS DEPEND ON THE MANNER IN
7185: * WHICH THE ROUTINE IS ACCESSED AND ARE DOCUMENTED WITH
7186: * THE INDIVIDUAL ROUTINES AS REQUIRED.
7187: *
7188: * THE ORDER OF THESE ROUTINES IS ALPHABETICAL WITH THE
7189: * FOLLOWING EXCEPTIONS.
7190: *
7191: * THE ROUTINES FOR SEBLK AND EXBLK ENTRIES OCCUR FIRST SO
7192: * THAT EXPRESSIONS CAN BE QUICKLY IDENTIFIED FROM THE FACT
7193: * THAT THEIR ROUTINES LIE BEFORE THE SYMBOL B$E$$.
7194: *
7195: * THESE ARE IMMEDIATELY FOLLOWED BY THE ROUTINE FOR A TRBLK
7196: * SO THAT THE TEST AGAINST THE SYMBOL B$T$$ CHECKS FOR
7197: * TRAPPED VALUES OR EXPRESSION VALUES (SEE PROCEDURE EVALP)
7198: *
7199: * THE PATTERN ROUTINES LIE AFTER THIS SECTION SO THAT
7200: * PATTERNS ARE IDENTIFIED WITH ROUTINES STARTING AT OR
7201: * AFTER THE INITIAL INSTRUCTION IN THESE ROUTINES (P$AAA).
7202: *
7203: * THE SYMBOL B$AAA DEFINES THE FIRST LOCATION FOR BLOCK
7204: * ROUTINES AND THE SYMBOL P$YYY (AT THE END OF THE PATTERN
7205: * MATCH ROUTINES SECTION) DEFINES THE LAST SUCH ENTRY POINT
7206: *
7207: {B$AAA{ENT{BL$$I{{{ENTRY POINT OF FIRST BLOCK ROUTINE
7208: {{EJC{{{{
7209: *
7210: * EXBLK
7211: *
7212: * THE ROUTINE FOR AN EXBLK LOADS THE EXPRESSION ONTO
7213: * THE STACK AS A VALUE.
7214: *
7215: * (XR) POINTER TO EXBLK
7216: *
7217: {B$EXL{ENT{BL$EX{{{ENTRY POINT (EXBLK)
7218: {{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD
7219: {{EJC{{{{
7220: *
7221: * SEBLK
7222: *
7223: * THE ROUTINE FOR SEBLK IS ACCESSED FROM THE GENERATED
7224: * CODE TO LOAD THE EXPRESSION VALUE ONTO THE STACK.
7225: *
7226: {B$SEL{ENT{BL$SE{{{ENTRY POINT (SEBLK)
7227: {{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD
7228: *
7229: * DEFINE SYMBOL WHICH MARKS END OF ENTRIES FOR EXPRESSIONS
7230: *
7231: {B$E$${ENT{BL$$I{{{ENTRY POINT
7232: {{EJC{{{{
7233: *
7234: * TRBLK
7235: *
7236: * THE ROUTINE FOR A TRBLK IS NEVER EXECUTED
7237: *
7238: {B$TRT{ENT{BL$TR{{{ENTRY POINT (TRBLK)
7239: *
7240: * DEFINE SYMBOL MARKING END OF TRAP AND EXPRESSION BLOCKS
7241: *
7242: {B$T$${ENT{BL$$I{{{END OF TRBLK,SEBLK,EXBLK ENTRIES
7243: {{EJC{{{{
7244: *
7245: * ARBLK
7246: *
7247: * THE ROUTINE FOR ARBLK IS NEVER EXECUTED
7248: *
7249: {B$ART{ENT{BL$AR{{{ENTRY POINT (ARBLK)
7250: {{EJC{{{{
7251: *
7252: * BCBLK
7253: *
7254: * THE ROUTINE FOR A BCBLK IS NEVER EXECUTED
7255: *
7256: * (XR) POINTER TO BCBLK
7257: *
7258: {B$BCT{ENT{BL$BC{{{ENTRY POINT (BCBLK)
7259: {{EJC{{{{
7260: *
7261: * BFBLK
7262: *
7263: * THE ROUTINE FOR A BFBLK IS NEVER EXECUTED
7264: *
7265: * (XR) POINTER TO BFBLK
7266: *
7267: {B$BFT{ENT{BL$BF{{{ENTRY POINT (BFBLK)
7268: {{EJC{{{{
7269: *
7270: * CCBLK
7271: *
7272: * THE ROUTINE FOR CCBLK IS NEVER ENTERED
7273: *
7274: {B$CCT{ENT{BL$CC{{{ENTRY POINT (CCBLK)
7275: {{EJC{{{{
7276: *
7277: * CDBLK
7278: *
7279: * THE CDBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE.
7280: * THERE ARE TWO CASES DEPENDING ON THE FORM OF CDFAL.
7281: *
7282: * ENTRY FOR COMPLEX FAILURE CODE AT CDFAL
7283: *
7284: * (XR) POINTER TO CDBLK
7285: *
7286: {B$CDC{ENT{BL$CD{{{ENTRY POINT (CDBLK)
7287: {BCDC0{MOV{FLPTR{SP{{POP GARBAGE OFF STACK
7288: {{MOV{4*CDFAL(R9){(SP){{SET FAILURE OFFSET
7289: {{BRN{STMGO{{{ENTER STMT
7290: {{EJC{{{{
7291: *
7292: * CDBLK (CONTINUED)
7293: *
7294: * ENTRY FOR SIMPLE FAILURE CODE AT CDFAL
7295: *
7296: * (XR) POINTER TO CDBLK
7297: *
7298: {B$CDS{ENT{BL$CD{{{ENTRY POINT (CDBLK)
7299: {BCDS0{MOV{FLPTR{SP{{POP GARBAGE OFF STACK
7300: {{MOV{#4*CDFAL{(SP){{SET FAILURE OFFSET
7301: {{BRN{STMGO{{{ENTER STMT
7302: {{EJC{{{{
7303: *
7304: * CMBLK
7305: *
7306: * THE ROUTINE FOR A CMBLK IS NEVER EXECUTED
7307: *
7308: {B$CMT{ENT{BL$CM{{{ENTRY POINT (CMBLK)
7309: {{EJC{{{{
7310: *
7311: * CTBLK
7312: *
7313: * THE ROUTINE FOR A CTBLK IS NEVER EXECUTED
7314: *
7315: {B$CTT{ENT{BL$CT{{{ENTRY POINT (CTBLK)
7316: {{EJC{{{{
7317: *
7318: * DFBLK
7319: *
7320: * THE ROUTINE FOR A DFBLK IS ACCESSED FROM THE O$FNC ENTRY
7321: * TO CALL A DATATYPE FUNCTION AND BUILD A PDBLK.
7322: *
7323: * (XL) POINTER TO DFBLK
7324: *
7325: {B$DFC{ENT{BL$DF{{{ENTRY POINT
7326: {{MOV{4*DFPDL(R10){R6{{LOAD LENGTH OF PDBLK
7327: {{JSR{ALLOC{{{ALLOCATE PDBLK
7328: {{MOV{#B$PDT{(R9){{STORE TYPE WORD
7329: {{MOV{R10{4*PDDFP(R9){{STORE DFBLK POINTER
7330: {{MOV{R9{R8{{SAVE POINTER TO PDBLK
7331: {{ADD{R6{R9{{POINT PAST PDBLK
7332: {{LCT{R6{4*FARGS(R10){{SET TO COUNT FIELDS
7333: *
7334: * LOOP TO ACQUIRE FIELD VALUES FROM STACK
7335: *
7336: {BDFC1{MOV{(SP)+{-(R9){{MOVE A FIELD VALUE
7337: {{BCT{R6{BDFC1{{LOOP TILL ALL MOVED
7338: {{MOV{R8{R9{{RECALL POINTER TO PDBLK
7339: {{BRN{EXSID{{{EXIT SETTING ID FIELD
7340: {{EJC{{{{
7341: *
7342: * EFBLK
7343: *
7344: * THE ROUTINE FOR AN EFBLK IS PASSED CONTROL FORM THE O$FNC
7345: * ENTRY TO CALL AN EXTERNAL FUNCTION.
7346: *
7347: * (XL) POINTER TO EFBLK
7348: *
7349: {B$EFC{ENT{BL$EF{{{ENTRY POINT (EFBLK)
7350: {{MOV{4*FARGS(R10){R8{{LOAD NUMBER OF ARGUMENTS
7351: {{WTB{R8{{{CONVERT TO OFFSET
7352: {{MOV{R10{-(SP){{SAVE POINTER TO EFBLK
7353: {{MOV{SP{R10{{COPY POINTER TO ARGUMENTS
7354: *
7355: * LOOP TO CONVERT ARGUMENTS
7356: *
7357: {BEFC1{ICA{R10{{{POINT TO NEXT ENTRY
7358: {{MOV{(SP){R9{{LOAD POINTER TO EFBLK
7359: {{DCA{R8{{{DECREMENT EFTAR OFFSET
7360: {{ADD{R8{R9{{POINT TO NEXT EFTAR ENTRY
7361: {{MOV{4*EFTAR(R9){R9{{LOAD EFTAR ENTRY
7362: {{BSW{R9{4{{SWITCH ON TYPE
7363: {{IFF{0{BEFC7{{NO CONVERSION NEEDED
7364: {{IFF{1{BEFC2{{STRING
7365: {{IFF{2{BEFC3{{INTEGER
7366: {{IFF{3{BEFC4{{REAL
7367: {{ESW{{{{END OF SWITCH ON TYPE
7368: *
7369: * HERE TO CONVERT TO STRING
7370: *
7371: {BEFC2{MOV{(R10){-(SP){{STACK ARG PTR
7372: {{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING
7373: {{ERR{039{EXTERNAL{{FUNCTION ARGUMENT IS NOT STRING
7374: {{BRN{BEFC6{{{JUMP TO MERGE
7375: {{EJC{{{{
7376: *
7377: * EFBLK (CONTINUED)
7378: *
7379: * HERE TO CONVERT AN INTEGER
7380: *
7381: {BEFC3{MOV{(R10){R9{{LOAD NEXT ARGUMENT
7382: {{MOV{R8{BEFOF{{SAVE OFFSET
7383: {{JSR{GTINT{{{CONVERT TO INTEGER
7384: {{ERR{040{EXTERNAL{{FUNCTION ARGUMENT IS NOT INTEGER
7385: {{BRN{BEFC5{{{MERGE WITH REAL CASE
7386: *
7387: * HERE TO CONVERT A REAL
7388: *
7389: {BEFC4{MOV{(R10){R9{{LOAD NEXT ARGUMENT
7390: {{MOV{R8{BEFOF{{SAVE OFFSET
7391: {{JSR{GTREA{{{CONVERT TO REAL
7392: {{ERR{265{EXTERNAL{{FUNCTION ARGUMENT IS NOT REAL
7393: *
7394: * INTEGER CASE MERGES HERE
7395: *
7396: {BEFC5{MOV{BEFOF{R8{{RESTORE OFFSET
7397: *
7398: * STRING MERGES HERE
7399: *
7400: {BEFC6{MOV{R9{(R10){{STORE CONVERTED RESULT
7401: *
7402: * NO CONVERSION MERGES HERE
7403: *
7404: {BEFC7{BNZ{R8{BEFC1{{LOOP BACK IF MORE TO GO
7405: *
7406: * HERE AFTER CONVERTING ALL THE ARGUMENTS
7407: *
7408: {{MOV{(SP)+{R10{{RESTORE EFBLK POINTER
7409: {{MOV{4*FARGS(R10){R6{{GET NUMBER OF ARGS
7410: {{JSR{SYSEX{{{CALL ROUTINE TO CALL EXTERNAL FNC
7411: {{PPM{EXFAL{{{FAIL IF FAILURE
7412: {{EJC{{{{
7413: *
7414: * EFBLK (CONTINUED)
7415: *
7416: * RETURN HERE WITH RESULT IN XR
7417: *
7418: * FIRST DEFEND AGAINST NON-STANDARD NULL STRING RETURNED
7419: *
7420: {{MOV{4*EFRSL(R10){R7{{GET RESULT TYPE ID
7421: {{BNZ{R7{BEFA8{{BRANCH IF NOT UNCONVERTED
7422: {{BNE{(R9){#B$SCL{BEFC8{JUMP IF NOT A STRING
7423: {{BZE{4*SCLEN(R9){EXNUL{{RETURN NULL IF NULL
7424: *
7425: * HERE IF CONVERTED RESULT TO CHECK FOR NULL STRING
7426: *
7427: {BEFA8{BNE{R7{#NUM01{BEFC8{JUMP IF NOT A STRING
7428: {{BZE{4*SCLEN(R9){EXNUL{{RETURN NULL IF NULL
7429: *
7430: * RETURN IF RESULT IS IN DYNAMIC STORAGE
7431: *
7432: {BEFC8{BLT{R9{DNAMB{BEFC9{JUMP IF NOT IN DYNAMIC STORAGE
7433: {{BLE{R9{DNAMP{EXIXR{RETURN RESULT IF ALREADY DYNAMIC
7434: *
7435: * HERE WE COPY A RESULT INTO THE DYNAMIC REGION
7436: *
7437: {BEFC9{MOV{(R9){R6{{GET POSSIBLE TYPE WORD
7438: {{BZE{R7{BEF11{{JUMP IF UNCONVERTED RESULT
7439: {{MOV{#B$SCL{R6{{STRING
7440: {{BEQ{R7{#NUM01{BEF10{YES JUMP
7441: {{MOV{#B$ICL{R6{{INTEGER
7442: {{BEQ{R7{#NUM02{BEF10{YES JUMP
7443: {{MOV{#B$RCL{R6{{REAL
7444: *
7445: * STORE TYPE WORD IN RESULT
7446: *
7447: {BEF10{MOV{R6{(R9){{STORED BEFORE COPYING TO DYNAMIC
7448: *
7449: * MERGE FOR UNCONVERTED RESULT
7450: *
7451: {BEF11{JSR{BLKLN{{{GET LENGTH OF BLOCK
7452: {{MOV{R9{R10{{COPY ADDRESS OF OLD BLOCK
7453: {{JSR{ALLOC{{{ALLOCATE DYNAMIC BLOCK SAME SIZE
7454: {{MOV{R9{-(SP){{SET POINTER TO NEW BLOCK AS RESULT
7455: {{MVW{{{{COPY OLD BLOCK TO DYNAMIC BLOCK
7456: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK
7457: {{EJC{{{{
7458: *
7459: * EVBLK
7460: *
7461: * THE ROUTINE FOR AN EVBLK IS NEVER EXECUTED
7462: *
7463: {B$EVT{ENT{BL$EV{{{ENTRY POINT (EVBLK)
7464: {{EJC{{{{
7465: *
7466: * FFBLK
7467: *
7468: * THE ROUTINE FOR AN FFBLK IS EXECUTED FROM THE O$FNC ENTRY
7469: * TO CALL A FIELD FUNCTION AND EXTRACT A FIELD VALUE/NAME.
7470: *
7471: * (XL) POINTER TO FFBLK
7472: *
7473: {B$FFC{ENT{BL$FF{{{ENTRY POINT (FFBLK)
7474: {{MOV{R10{R9{{COPY FFBLK POINTER
7475: {{LCW{R8{{{LOAD NEXT CODE WORD
7476: {{MOV{(SP){R10{{LOAD PDBLK POINTER
7477: {{BNE{(R10){#B$PDT{BFFC2{JUMP IF NOT PDBLK AT ALL
7478: {{MOV{4*PDDFP(R10){R6{{LOAD DFBLK POINTER FROM PDBLK
7479: *
7480: * LOOP TO FIND CORRECT FFBLK FOR THIS PDBLK
7481: *
7482: {BFFC1{BEQ{R6{4*FFDFP(R9){BFFC3{JUMP IF THIS IS THE CORRECT FFBLK
7483: {{MOV{4*FFNXT(R9){R9{{ELSE LINK TO NEXT FFBLK ON CHAIN
7484: {{BNZ{R9{BFFC1{{LOOP BACK IF ANOTHER ENTRY TO CHECK
7485: *
7486: * HERE FOR BAD ARGUMENT
7487: *
7488: {BFFC2{ERB{041{FIELD{{FUNCTION ARGUMENT IS WRONG DATATYPE
7489: {{EJC{{{{
7490: *
7491: * FFBLK (CONTINUED)
7492: *
7493: * HERE AFTER LOCATING CORRECT FFBLK
7494: *
7495: {BFFC3{MOV{4*FFOFS(R9){R6{{LOAD FIELD OFFSET
7496: {{BEQ{R8{#OFNE${BFFC5{JUMP IF CALLED BY NAME
7497: {{ADD{R6{R10{{ELSE POINT TO VALUE FIELD
7498: {{MOV{(R10){R9{{LOAD VALUE
7499: {{BNE{(R9){#B$TRT{BFFC4{JUMP IF NOT TRAPPED
7500: {{SUB{R6{R10{{ELSE RESTORE NAME BASE,OFFSET
7501: {{MOV{R8{(SP){{SAVE NEXT CODE WORD OVER PDBLK PTR
7502: {{JSR{ACESS{{{ACCESS VALUE
7503: {{PPM{EXFAL{{{FAIL IF ACCESS FAILS
7504: {{MOV{(SP){R8{{RESTORE NEXT CODE WORD
7505: *
7506: * HERE AFTER GETTING VALUE IN (XR)
7507: *
7508: {BFFC4{MOV{R9{(SP){{STORE VALUE ON STACK (OVER PDBLK)
7509: {{MOV{R8{R9{{COPY NEXT CODE WORD
7510: {{MOV{(R9){R10{{LOAD ENTRY ADDRESS
7511: {{BRI{R10{{{JUMP TO ROUTINE FOR NEXT CODE WORD
7512: *
7513: * HERE IF CALLED BY NAME
7514: *
7515: {BFFC5{MOV{R6{-(SP){{STORE NAME OFFSET (BASE IS SET)
7516: {{BRN{EXITS{{{EXIT WITH NAME ON STACK
7517: {{EJC{{{{
7518: *
7519: * ICBLK
7520: *
7521: * THE ROUTINE FOR ICBLK IS EXECUTED FROM THE GENERATED
7522: * CODE TO LOAD AN INTEGER VALUE ONTO THE STACK.
7523: *
7524: * (XR) POINTER TO ICBLK
7525: *
7526: {B$ICL{ENT{BL$IC{{{ENTRY POINT (ICBLK)
7527: {{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD
7528: {{EJC{{{{
7529: *
7530: * KVBLK
7531: *
7532: * THE ROUTINE FOR A KVBLK IS NEVER EXECUTED.
7533: *
7534: {B$KVT{ENT{BL$KV{{{ENTRY POINT (KVBLK)
7535: {{EJC{{{{
7536: *
7537: * NMBLK
7538: *
7539: * THE ROUTINE FOR A NMBLK IS EXECUTED FROM THE GENERATED
7540: * CODE FOR THE CASE OF LOADING A NAME ONTO THE STACK
7541: * WHERE THE NAME IS THAT OF A NATURAL VARIABLE WHICH CAN
7542: * BE PREEVALUATED AT COMPILE TIME.
7543: *
7544: * (XR) POINTER TO NMBLK
7545: *
7546: {B$NML{ENT{BL$NM{{{ENTRY POINT (NMBLK)
7547: {{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD
7548: {{EJC{{{{
7549: *
7550: * PDBLK
7551: *
7552: * THE ROUTINE FOR A PDBLK IS NEVER EXECUTED
7553: *
7554: {B$PDT{ENT{BL$PD{{{ENTRY POINT (PDBLK)
7555: {{EJC{{{{
7556: *
7557: * PFBLK
7558: *
7559: * THE ROUTINE FOR A PFBLK IS EXECUTED FROM THE ENTRY O$FNC
7560: * TO CALL A PROGRAM DEFINED FUNCTION.
7561: *
7562: * (XL) POINTER TO PFBLK
7563: *
7564: * THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING
7565: * CONTROL TO THE PROGRAM DEFINED FUNCTION.
7566: *
7567: * SAVED VALUE OF FIRST ARGUMENT
7568: * .
7569: * SAVED VALUE OF LAST ARGUMENT
7570: * SAVED VALUE OF FIRST LOCAL
7571: * .
7572: * SAVED VALUE OF LAST LOCAL
7573: * SAVED VALUE OF FUNCTION NAME
7574: * SAVED CODE BLOCK PTR (R$COD)
7575: * SAVED CODE POINTER (-R$COD)
7576: * SAVED VALUE OF FLPRT
7577: * SAVED VALUE OF FLPTR
7578: * POINTER TO PFBLK
7579: * FLPTR --------------- ZERO (TO BE OVERWRITTEN WITH OFFS)
7580: *
7581: {B$PFC{ENT{BL$PF{{{ENTRY POINT (PFBLK)
7582: {{MOV{R10{BPFPF{{SAVE PFBLK PTR (NEED NOT BE RELOC)
7583: {{MOV{R10{R9{{COPY FOR THE MOMENT
7584: {{MOV{4*PFVBL(R9){R10{{POINT TO VRBLK FOR FUNCTION
7585: *
7586: * LOOP TO FIND OLD VALUE OF FUNCTION
7587: *
7588: {BPF01{MOV{R10{R7{{SAVE POINTER
7589: {{MOV{4*VRVAL(R10){R10{{LOAD VALUE
7590: {{BEQ{(R10){#B$TRT{BPF01{LOOP IF TRBLK
7591: *
7592: * SET VALUE TO NULL AND SAVE OLD FUNCTION VALUE
7593: *
7594: {{MOV{R10{BPFSV{{SAVE OLD VALUE
7595: {{MOV{R7{R10{{POINT BACK TO BLOCK WITH VALUE
7596: {{MOV{#NULLS{4*VRVAL(R10){{SET VALUE TO NULL
7597: {{MOV{4*FARGS(R9){R6{{LOAD NUMBER OF ARGUMENTS
7598: {{ADD{#4*PFARG{R9{{POINT TO PFARG ENTRIES
7599: {{BZE{R6{BPF04{{JUMP IF NO ARGUMENTS
7600: {{MOV{SP{R10{{PTR TO LAST ARG
7601: {{WTB{R6{{{CONVERT NO. OF ARGS TO BYTES OFFSET
7602: {{ADD{R6{R10{{POINT BEFORE FIRST ARG
7603: {{MOV{R10{BPFXT{{REMEMBER ARG POINTER
7604: {{EJC{{{{
7605: *
7606: * PFBLK (CONTINUED)
7607: *
7608: * LOOP TO SAVE OLD ARGUMENT VALUES AND SET NEW ONES
7609: *
7610: {BPF02{MOV{(R9)+{R10{{LOAD VRBLK PTR FOR NEXT ARGUMENT
7611: *
7612: * LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE
7613: *
7614: {BPF03{MOV{R10{R8{{SAVE POINTER
7615: {{MOV{4*VRVAL(R10){R10{{LOAD NEXT VALUE
7616: {{BEQ{(R10){#B$TRT{BPF03{LOOP BACK IF TRBLK
7617: *
7618: * SAVE OLD VALUE AND GET NEW VALUE
7619: *
7620: {{MOV{R10{R6{{KEEP OLD VALUE
7621: {{MOV{BPFXT{R10{{POINT BEFORE NEXT STACKED ARG
7622: {{MOV{-(R10){R7{{LOAD ARGUMENT (NEW VALUE)
7623: {{MOV{R6{(R10){{SAVE OLD VALUE
7624: {{MOV{R10{BPFXT{{KEEP ARG PTR FOR NEXT TIME
7625: {{MOV{R8{R10{{POINT BACK TO BLOCK WITH VALUE
7626: {{MOV{R7{4*VRVAL(R10){{SET NEW VALUE
7627: {{BNE{SP{BPFXT{BPF02{LOOP IF NOT ALL DONE
7628: *
7629: * NOW PROCESS LOCALS
7630: *
7631: {BPF04{MOV{BPFPF{R10{{RESTORE PFBLK POINTER
7632: {{MOV{4*PFNLO(R10){R6{{LOAD NUMBER OF LOCALS
7633: {{BZE{R6{BPF07{{JUMP IF NO LOCALS
7634: {{MOV{#NULLS{R7{{GET NULL CONSTANT
7635: {{LCT{R6{R6{{SET LOCAL COUNTER
7636: *
7637: * LOOP TO PROCESS LOCALS
7638: *
7639: {BPF05{MOV{(R9)+{R10{{LOAD VRBLK PTR FOR NEXT LOCAL
7640: *
7641: * LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE
7642: *
7643: {BPF06{MOV{R10{R8{{SAVE POINTER
7644: {{MOV{4*VRVAL(R10){R10{{LOAD NEXT VALUE
7645: {{BEQ{(R10){#B$TRT{BPF06{LOOP BACK IF TRBLK
7646: *
7647: * SAVE OLD VALUE AND SET NULL AS NEW VALUE
7648: *
7649: {{MOV{R10{-(SP){{STACK OLD VALUE
7650: {{MOV{R8{R10{{POINT BACK TO BLOCK WITH VALUE
7651: {{MOV{R7{4*VRVAL(R10){{SET NULL AS NEW VALUE
7652: {{BCT{R6{BPF05{{LOOP TILL ALL LOCALS PROCESSED
7653: {{EJC{{{{
7654: *
7655: * PFBLK (CONTINUED)
7656: *
7657: * HERE AFTER PROCESSING ARGUMENTS AND LOCALS
7658: *
7659: {BPF07{ZER{R9{{{ZERO REG XR IN CASE
7660: {{BZE{KVPFL{BPF7C{{SKIP IF PROFILING IS OFF
7661: {{BEQ{KVPFL{#NUM02{BPF7A{BRANCH ON TYPE OF PROFILE
7662: *
7663: * HERE IF &PROFILE = 1
7664: *
7665: {{JSR{SYSTM{{{GET CURRENT TIME
7666: {{STI{PFETM{{{SAVE FOR A SEC
7667: {{SBI{PFSTM{{{FIND TIME USED BY CALLER
7668: {{JSR{ICBLD{{{BUILD INTO AN ICBLK
7669: {{LDI{PFETM{{{RELOAD CURRENT TIME
7670: {{BRN{BPF7B{{{MERGE
7671: *
7672: * HERE IF &PROFILE = 2
7673: *
7674: {BPF7A{LDI{PFSTM{{{GET START TIME OF CALLING STMT
7675: {{JSR{ICBLD{{{ASSEMBLE AN ICBLK ROUND IT
7676: {{JSR{SYSTM{{{GET NOW TIME
7677: *
7678: * BOTH TYPES OF PROFILE MERGE HERE
7679: *
7680: {BPF7B{STI{PFSTM{{{SET START TIME OF 1ST FUNC STMT
7681: {{MNZ{PFFNC{{{FLAG FUNCTION ENTRY
7682: *
7683: * NO PROFILING MERGES HERE
7684: *
7685: {BPF7C{MOV{R9{-(SP){{STACK ICBLK PTR (OR ZERO)
7686: {{MOV{R$COD{R6{{LOAD OLD CODE BLOCK POINTER
7687: {{SCP{R7{{{GET CODE POINTER
7688: {{SUB{R6{R7{{MAKE CODE POINTER INTO OFFSET
7689: {{MOV{BPFPF{R10{{RECALL PFBLK POINTER
7690: {{MOV{BPFSV{-(SP){{STACK OLD VALUE OF FUNCTION NAME
7691: {{MOV{R6{-(SP){{STACK CODE BLOCK POINTER
7692: {{MOV{R7{-(SP){{STACK CODE OFFSET
7693: {{MOV{FLPRT{-(SP){{STACK OLD FLPRT
7694: {{MOV{FLPTR{-(SP){{STACK OLD FAILURE POINTER
7695: {{MOV{R10{-(SP){{STACK POINTER TO PFBLK
7696: {{ZER{-(SP){{{DUMMY ZERO ENTRY FOR FAIL RETURN
7697: {{CHK{{{{CHECK FOR STACK OVERFLOW
7698: {{MOV{SP{FLPTR{{SET NEW FAIL RETURN VALUE
7699: {{MOV{SP{FLPRT{{SET NEW FLPRT
7700: {{MOV{KVTRA{R6{{LOAD TRACE VALUE
7701: {{ADD{KVFTR{R6{{ADD FTRACE VALUE
7702: {{BNZ{R6{BPF09{{JUMP IF TRACING POSSIBLE
7703: {{ICV{KVFNC{{{ELSE BUMP FNCLEVEL
7704: *
7705: * HERE TO ACTUALLY JUMP TO FUNCTION
7706: *
7707: {BPF08{MOV{4*PFCOD(R10){R9{{POINT TO CODE
7708: {{BRI{(R9){{{OFF TO EXECUTE FUNCTION
7709: *
7710: * HERE IF TRACING IS POSSIBLE
7711: *
7712: {BPF09{MOV{4*PFCTR(R10){R9{{LOAD POSSIBLE CALL TRACE TRBLK
7713: {{MOV{4*PFVBL(R10){R10{{LOAD VRBLK POINTER FOR FUNCTION
7714: {{MOV{#4*VRVAL{R6{{SET NAME OFFSET FOR VARIABLE
7715: {{BZE{KVTRA{BPF10{{JUMP IF TRACE MODE IS OFF
7716: {{BZE{R9{BPF10{{OR IF THERE IS NO CALL TRACE
7717: *
7718: * HERE IF CALL TRACED
7719: *
7720: {{DCV{KVTRA{{{DECREMENT TRACE COUNT
7721: {{BZE{4*TRFNC(R9){BPF11{{JUMP IF PRINT TRACE
7722: {{JSR{TRXEQ{{{EXECUTE FUNCTION TYPE TRACE
7723: {{EJC{{{{
7724: *
7725: * PFBLK (CONTINUED)
7726: *
7727: * HERE TO TEST FOR FTRACE TRACE
7728: *
7729: {BPF10{BZE{KVFTR{BPF16{{JUMP IF FTRACE IS OFF
7730: {{DCV{KVFTR{{{ELSE DECREMENT FTRACE
7731: *
7732: * HERE FOR PRINT TRACE
7733: *
7734: {BPF11{JSR{PRTSN{{{PRINT STATEMENT NUMBER
7735: {{JSR{PRTNM{{{PRINT FUNCTION NAME
7736: {{MOV{#CH$PP{R6{{LOAD LEFT PAREN
7737: {{JSR{PRTCH{{{PRINT LEFT PAREN
7738: {{MOV{4*1(SP){R10{{RECOVER PFBLK POINTER
7739: {{BZE{4*FARGS(R10){BPF15{{SKIP IF NO ARGUMENTS
7740: {{ZER{R7{{{ELSE SET ARGUMENT COUNTER
7741: {{BRN{BPF13{{{JUMP INTO LOOP
7742: *
7743: * LOOP TO PRINT ARGUMENT VALUES
7744: *
7745: {BPF12{MOV{#CH$CM{R6{{LOAD COMMA
7746: {{JSR{PRTCH{{{PRINT TO SEPARATE FROM LAST ARG
7747: *
7748: * MERGE HERE FIRST TIME (NO COMMA REQUIRED)
7749: *
7750: {BPF13{MOV{R7{(SP){{SAVE ARG CTR (OVER FAILOFFS IS OK)
7751: {{WTB{R7{{{CONVERT TO BYTE OFFSET
7752: {{ADD{R7{R10{{POINT TO NEXT ARGUMENT POINTER
7753: {{MOV{4*PFARG(R10){R9{{LOAD NEXT ARGUMENT VRBLK PTR
7754: {{SUB{R7{R10{{RESTORE PFBLK POINTER
7755: {{MOV{4*VRVAL(R9){R9{{LOAD NEXT VALUE
7756: {{JSR{PRTVL{{{PRINT ARGUMENT VALUE
7757: {{EJC{{{{
7758: *
7759: * HERE AFTER DEALING WITH ONE ARGUMENT
7760: *
7761: {{MOV{(SP){R7{{RESTORE ARGUMENT COUNTER
7762: {{ICV{R7{{{INCREMENT ARGUMENT COUNTER
7763: {{BLT{R7{4*FARGS(R10){BPF12{LOOP IF MORE TO PRINT
7764: *
7765: * MERGE HERE IN NO ARGS CASE TO PRINT PAREN
7766: *
7767: {BPF15{MOV{#CH$RP{R6{{LOAD RIGHT PAREN
7768: {{JSR{PRTCH{{{PRINT TO TERMINATE OUTPUT
7769: {{JSR{PRTNL{{{TERMINATE PRINT LINE
7770: *
7771: * MERGE HERE TO EXIT WITH TEST FOR FNCLEVEL TRACE
7772: *
7773: {BPF16{ICV{KVFNC{{{INCREMENT FNCLEVEL
7774: {{MOV{R$FNC{R10{{LOAD PTR TO POSSIBLE TRBLK
7775: {{JSR{KTREX{{{CALL KEYWORD TRACE ROUTINE
7776: *
7777: * CALL FUNCTION AFTER TRACE TESTS COMPLETE
7778: *
7779: {{MOV{4*1(SP){R10{{RESTORE PFBLK POINTER
7780: {{BRN{BPF08{{{JUMP BACK TO EXECUTE FUNCTION
7781: {{EJC{{{{
7782: *
7783: * RCBLK
7784: *
7785: * THE ROUTINE FOR AN RCBLK IS EXECUTED FROM THE GENERATED
7786: * CODE TO LOAD A REAL VALUE ONTO THE STACK.
7787: *
7788: * (XR) POINTER TO RCBLK
7789: *
7790: {B$RCL{ENT{BL$RC{{{ENTRY POINT (RCBLK)
7791: {{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD
7792: {{EJC{{{{
7793: *
7794: * SCBLK
7795: *
7796: * THE ROUTINE FOR AN SCBLK IS EXECUTED FROM THE GENERATED
7797: * CODE TO LOAD A STRING VALUE ONTO THE STACK.
7798: *
7799: * (XR) POINTER TO SCBLK
7800: *
7801: {B$SCL{ENT{BL$SC{{{ENTRY POINT (SCBLK)
7802: {{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD
7803: {{EJC{{{{
7804: *
7805: * TBBLK
7806: *
7807: * THE ROUTINE FOR A TBBLK IS NEVER EXECUTED
7808: *
7809: {B$TBT{ENT{BL$TB{{{ENTRY POINT (TBBLK)
7810: {{EJC{{{{
7811: *
7812: * TEBLK
7813: *
7814: * THE ROUTINE FOR A TEBLK IS NEVER EXECUTED
7815: *
7816: {B$TET{ENT{BL$TE{{{ENTRY POINT (TEBLK)
7817: {{EJC{{{{
7818: *
7819: * VCBLK
7820: *
7821: * THE ROUTINE FOR A VCBLK IS NEVER EXECUTED
7822: *
7823: {B$VCT{ENT{BL$VC{{{ENTRY POINT (VCBLK)
7824: {{EJC{{{{
7825: *
7826: * VRBLK
7827: *
7828: * THE VRBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE.
7829: * THERE ARE SIX ENTRIES FOR VRBLK COVERING VARIOUS CASES
7830: *
7831: {B$VR${ENT{BL$$I{{{MARK START OF VRBLK ENTRY POINTS
7832: *
7833: * ENTRY FOR VRGET (TRAPPED CASE). THIS ROUTINE IS CALLED
7834: * FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE.
7835: * THIS ENTRY POINT IS USED IF AN ACCESS TRACE OR INPUT
7836: * ASSOCIATION IS CURRENTLY ACTIVE.
7837: *
7838: * (XR) POINTER TO VRGET FIELD OF VRBLK
7839: *
7840: {B$VRA{ENT{BL$$I{{{ENTRY POINT
7841: {{MOV{R9{R10{{COPY NAME BASE (VRGET = 0)
7842: {{MOV{#4*VRVAL{R6{{SET NAME OFFSET
7843: {{JSR{ACESS{{{ACCESS VALUE
7844: {{PPM{EXFAL{{{FAIL IF ACCESS FAILS
7845: {{BRN{EXIXR{{{ELSE EXIT WITH RESULT IN XR
7846: {{EJC{{{{
7847: *
7848: * VRBLK (CONTINUED)
7849: *
7850: * ENTRY FOR VRSTO (ERROR CASE. THIS ROUTINE IS CALLED FROM
7851: * THE EXECUTED CODE FOR AN ATTEMPT TO MODIFY THE VALUE
7852: * OF A PROTECTED (PATTERN VALUED) NATURAL VARIABLE.
7853: *
7854: {B$VRE{ENT{{{{ENTRY POINT
7855: {{ERB{042{ATTEMPT{{TO CHANGE VALUE OF PROTECTED VARIABLE
7856: {{EJC{{{{
7857: *
7858: * VRBLK (CONTINUED)
7859: *
7860: * ENTRY FOR VRTRA (UNTRAPPED CASE). THIS ROUTINE IS CALLED
7861: * FROM THE EXECUTED CODE TO TRANSFER TO A LABEL.
7862: *
7863: * (XR) POINTER TO VRTRA FIELD OF VRBLK
7864: *
7865: {B$VRG{ENT{{{{ENTRY POINT
7866: {{MOV{4*VRLBO(R9){R9{{LOAD CODE POINTER
7867: {{MOV{(R9){R10{{LOAD ENTRY ADDRESS
7868: {{BRI{R10{{{JUMP TO ROUTINE FOR NEXT CODE WORD
7869: {{EJC{{{{
7870: *
7871: * VRBLK (CONTINUED)
7872: *
7873: * ENTRY FOR VRGET (UNTRAPPED CASE). THIS ROUTINE IS CALLED
7874: * FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE.
7875: *
7876: * (XR) POINTS TO VRGET FIELD OF VRBLK
7877: *
7878: {B$VRL{ENT{{{{ENTRY POINT
7879: {{MOV{4*VRVAL(R9){-(SP){{LOAD VALUE ONTO STACK (VRGET = 0)
7880: {{BRN{EXITS{{{OBEY NEXT CODE WORD
7881: {{EJC{{{{
7882: *
7883: * VRBLK (CONTINUED)
7884: *
7885: * ENTRY FOR VRSTO (UNTRAPPED CASE). THIS ROUTINE IS CALLED
7886: * FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE.
7887: *
7888: * (XR) POINTER TO VRSTO FIELD OF VRBLK
7889: *
7890: {B$VRS{ENT{{{{ENTRY POINT
7891: {{MOV{(SP){4*VRVLO(R9){{STORE VALUE, LEAVE ON STACK
7892: {{BRN{EXITS{{{OBEY NEXT CODE WORD
7893: {{EJC{{{{
7894: *
7895: * VRBLK (CONTINUED)
7896: *
7897: * VRTRA (TRAPPED CASE). THIS ROUTINE IS CALLED FROM THE
7898: * GENERATED CODE TO TRANSFER TO A LABEL WHEN A LABEL
7899: * TRACE IS CURRENTLY ACTIVE.
7900: *
7901: {B$VRT{ENT{{{{ENTRY POINT
7902: {{SUB{#4*VRTRA{R9{{POINT BACK TO START OF VRBLK
7903: {{MOV{R9{R10{{COPY VRBLK POINTER
7904: {{MOV{#4*VRVAL{R6{{SET NAME OFFSET
7905: {{MOV{4*VRLBL(R10){R9{{LOAD POINTER TO TRBLK
7906: {{BZE{KVTRA{BVRT2{{JUMP IF TRACE IS OFF
7907: {{DCV{KVTRA{{{ELSE DECREMENT TRACE COUNT
7908: {{BZE{4*TRFNC(R9){BVRT1{{JUMP IF PRINT TRACE CASE
7909: {{JSR{TRXEQ{{{ELSE EXECUTE FULL TRACE
7910: {{BRN{BVRT2{{{MERGE TO JUMP TO LABEL
7911: *
7912: * HERE FOR PRINT TRACE -- PRINT COLON ( LABEL NAME )
7913: *
7914: {BVRT1{JSR{PRTSN{{{PRINT STATEMENT NUMBER
7915: {{MOV{R10{R9{{COPY VRBLK POINTER
7916: {{MOV{#CH$CL{R6{{COLON
7917: {{JSR{PRTCH{{{PRINT IT
7918: {{MOV{#CH$PP{R6{{LEFT PAREN
7919: {{JSR{PRTCH{{{PRINT IT
7920: {{JSR{PRTVN{{{PRINT LABEL NAME
7921: {{MOV{#CH$RP{R6{{RIGHT PAREN
7922: {{JSR{PRTCH{{{PRINT IT
7923: {{JSR{PRTNL{{{TERMINATE LINE
7924: {{MOV{4*VRLBL(R10){R9{{POINT BACK TO TRBLK
7925: *
7926: * MERGE HERE TO JUMP TO LABEL
7927: *
7928: {BVRT2{MOV{4*TRLBL(R9){R9{{LOAD POINTER TO ACTUAL CODE
7929: {{BRI{(R9){{{EXECUTE STATEMENT AT LABEL
7930: {{EJC{{{{
7931: *
7932: * VRBLK (CONTINUED)
7933: *
7934: * ENTRY FOR VRSTO (TRAPPED CASE). THIS ROUTINE IS CALLED
7935: * FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE.
7936: * THIS ENTRY IS USED WHEN A VALUE TRACE OR OUTPUT
7937: * ASSOCIATION IS CURRENTLY ACTIVE.
7938: *
7939: * (XR) POINTER TO VRSTO FIELD OF VRBLK
7940: *
7941: {B$VRV{ENT{{{{ENTRY POINT
7942: {{MOV{(SP){R7{{LOAD VALUE (LEAVE COPY ON STACK)
7943: {{SUB{#4*VRSTO{R9{{POINT TO VRBLK
7944: {{MOV{R9{R10{{COPY VRBLK POINTER
7945: {{MOV{#4*VRVAL{R6{{SET OFFSET
7946: {{JSR{ASIGN{{{CALL ASSIGNMENT ROUTINE
7947: {{PPM{EXFAL{{{FAIL IF ASSIGNMENT FAILS
7948: {{BRN{EXITS{{{ELSE RETURN WITH RESULT ON STACK
7949: {{EJC{{{{
7950: *
7951: * XNBLK
7952: *
7953: * THE ROUTINE FOR AN XNBLK IS NEVER EXECUTED
7954: *
7955: {B$XNT{ENT{BL$XN{{{ENTRY POINT (XNBLK)
7956: {{EJC{{{{
7957: *
7958: * XRBLK
7959: *
7960: * THE ROUTINE FOR AN XRBLK IS NEVER EXECUTED
7961: *
7962: {B$XRT{ENT{BL$XR{{{ENTRY POINT (XRBLK)
7963: *
7964: * MARK ENTRY ADDRESS PAST LAST BLOCK ACTION ROUTINE
7965: *
7966: {B$YYY{ENT{BL$$I{{{LAST BLOCK ROUTINE ENTRY POINT
7967: {{TTL{S{{{P I T B O L -- PATTERN MATCHING ROUTINES
7968: *
7969: * THE FOLLOWING SECTION CONSISTS OF THE PATTERN MATCHING
7970: * ROUTINES. ALL PATTERN NODES CONTAIN A POINTER (PCODE)
7971: * TO ONE OF THE ROUTINES IN THIS SECTION (P$XXX).
7972: *
7973: * NOTE THAT THIS SECTION FOLLOWS THE B$XXX ROUTINES TO
7974: * ENABLE A FAST TEST FOR THE PATTERN DATATYPE.
7975: *
7976: {P$AAA{ENT{BL$$I{{{ENTRY TO MARK FIRST PATTERN
7977: *
7978: *
7979: * THE ENTRY CONDITIONS TO THE MATCH ROUTINE ARE AS FOLLOWS
7980: * (SEE O$PMN, O$PMV, O$PMS AND PROCEDURE MATCH).
7981: *
7982: * STACK CONTENTS.
7983: *
7984: * NAME BASE (O$PMN ONLY)
7985: * NAME OFFSET (O$PMN ONLY)
7986: * TYPE (0-O$PMN, 1-O$PMV, 2-O$PMS)
7987: * PMHBS --------------- INITIAL CURSOR (ZERO)
7988: * INITIAL NODE POINTER
7989: * XS ------------------ =NDABO (ANCHORED), =NDUNA (UNANCH)
7990: *
7991: * REGISTER VALUES.
7992: *
7993: * (XS) SET AS SHOWN IN STACK DIAGRAM
7994: * (XR) POINTER TO INITIAL PATTERN NODE
7995: * (WB) INITIAL CURSOR (ZERO)
7996: *
7997: * GLOBAL PATTERN VALUES
7998: *
7999: * R$PMS POINTER TO SUBJECT STRING SCBLK
8000: * PMSSL LENGTH OF SUBJECT STRING IN CHARS
8001: * PMDFL DOT FLAG, INITIALLY ZERO
8002: * PMHBS SET AS SHOWN IN STACK DIAGRAM
8003: *
8004: * CONTROL IS PASSED BY BRANCHING THROUGH THE PCODE
8005: * FIELD OF THE INITIAL PATTERN NODE (BRI (XR)).
8006: {{EJC{{{{
8007: *
8008: * DESCRIPTION OF ALGORITHM
8009: *
8010: * A PATTERN STRUCTURE IS REPRESENTED AS A LINKED GRAPH
8011: * OF NODES WITH THE FOLLOWING STRUCTURE.
8012: *
8013: * +------------------------------------+
8014: * I PCODE I
8015: * +------------------------------------+
8016: * I PTHEN I
8017: * +------------------------------------+
8018: * I PARM1 I
8019: * +------------------------------------+
8020: * I PARM2 I
8021: * +------------------------------------+
8022: *
8023: * PCODE IS A POINTER TO THE ROUTINE WHICH WILL PERFORM
8024: * THE MATCH OF THIS PARTICULAR NODE TYPE.
8025: *
8026: * PTHEN IS A POINTER TO THE SUCCESSOR NODE. I.E. THE NODE
8027: * TO BE MATCHED IF THE ATTEMPT TO MATCH THIS NODE SUCCEEDS.
8028: * IF THIS IS THE LAST NODE OF THE PATTERN PTHEN POINTS
8029: * TO THE DUMMY NODE NDNTH WHICH INITIATES PATTERN EXIT.
8030: *
8031: * PARM1, PARM2 ARE PARAMETERS WHOSE USE VARIES WITH THE
8032: * PARTICULAR NODE. THEY ARE ONLY PRESENT IF REQUIRED.
8033: *
8034: * ALTERNATIVES ARE HANDLED WITH THE SPECIAL ALTERNATIVE
8035: * NODE WHOSE PARAMETER POINTS TO THE NODE TO BE MATCHED
8036: * IF THERE IS A FAILURE ON THE SUCCESSOR PATH.
8037: *
8038: * THE FOLLOWING EXAMPLE ILLUSTRATES THE MANNER IN WHICH
8039: * THE STRUCTURE IS BUILT UP. THE PATTERN IS
8040: *
8041: * (A / B / C) (D / E) WHERE / IS ALTERNATION
8042: *
8043: * IN THE DIAGRAM, THE NODE MARKED + REPRESENTS AN
8044: * ALTERNATIVE NODE AND THE DOTTED LINE FROM A + NODE
8045: * REPRESENTS THE PARAMETER POINTER TO THE ALTERNATIVE.
8046: *
8047: * +---+ +---+ +---+ +---+
8048: * I + I-----I A I-----I + I-----I D I-----
8049: * +---+ +---+ I +---+ +---+
8050: * . I .
8051: * . I .
8052: * +---+ +---+ I +---+
8053: * I + I-----I B I--I I E I-----
8054: * +---+ +---+ I +---+
8055: * . I
8056: * . I
8057: * +---+ I
8058: * I C I------------I
8059: * +---+
8060: {{EJC{{{{
8061: *
8062: * DURING THE MATCH, THE REGISTERS ARE USED AS FOLLOWS.
8063: *
8064: * (XR) POINTS TO THE CURRENT NODE
8065: * (XL) SCRATCH
8066: * (XS) MAIN STACK POINTER
8067: * (WB) CURSOR (NUMBER OF CHARS MATCHED)
8068: * (WA,WC) SCRATCH
8069: *
8070: * TO KEEP TRACK OF ALTERNATIVES, THE MAIN STACK IS USED AS
8071: * A HISTORY STACK AND CONTAINS TWO WORD ENTRIES.
8072: *
8073: * WORD 1 SAVED CURSOR VALUE
8074: * WORD 2 NODE TO MATCH ON FAILURE
8075: *
8076: * WHEN A FAILURE OCCURS, THE MOST RECENT ENTRY ON THIS
8077: * STACK IS POPPED OFF TO RESTORE THE CURSOR AND POINT
8078: * TO THE NODE TO BE MATCHED AS AN ALTERNATIVE. THE ENTRY
8079: * AT THE BOTTOM OF THE STACK POINTS TO THE FOLLOWING
8080: * SPECIAL NODES DEPENDING ON THE SCAN MODE.
8081: *
8082: * ANCHORED MODE THE BOTTOM ENTRY POINTS TO THE
8083: * SPECIAL NODE NDABO WHICH CAUSES AN
8084: * ABORT. THE CURSOR VALUE STORED
8085: * WITH THIS ENTRY IS ALWAYS ZERO.
8086: *
8087: * UNANCHORED MODE THE BOTTOM ENTRY POINTS TO THE
8088: * SPECIAL NODE NDUNA WHICH MOVES THE
8089: * ANCHOR POINT AND RESTARTS THE MATCH
8090: * THE CURSOR SAVED WITH THIS ENTRY
8091: * IS THE NUMBER OF CHARACTERS WHICH
8092: * LIE BEFORE THE INITIAL ANCHOR POINT
8093: * (I.E. THE NUMBER OF ANCHOR MOVES).
8094: * THIS ENTRY IS THREE WORDS LONG AND
8095: * ALSO CONTAINS THE INITIAL PATTERN.
8096: *
8097: * ENTRIES ARE MADE ON THIS HISTORY STACK BY ALTERNATIVE
8098: * NODES AND BY SOME SPECIAL COMPOUD PATTERNS AS DESCRIBED
8099: * LATER ON. THE FOLLOWING GLOBAL LOCATIONS ARE USED DURING
8100: * PATTERN MATCHING.
8101: *
8102: * R$PMS POINTER TO SUBJECT STRING
8103: * PMSSL LENGTH OF SUBJECT STRING
8104: * PMDFL FLAG SET NON-ZERO FOR DOT PATTERNS
8105: * PMHBS BASE PTR FOR CURRENT HISTORY STACK
8106: *
8107: * THE FOLLOWING EXIT POINTS ARE AVAILABLE TO MATCH ROUTINES
8108: *
8109: * SUCCP SUCCESS IN MATCHING CURRENT NODE
8110: * FAILP FAILURE IN MATCHING CURRENT NODE
8111: {{EJC{{{{
8112: *
8113: * COMPOUND PATTERNS
8114: *
8115: * SOME PATTERNS HAVE IMPLICIT ALTERNATIVES AND THEIR
8116: * REPRESENTATION IN THE PATTERN STRUCTURE CONSISTS OF A
8117: * LINKED SET OF NODES AS INDICATED BY THESE DIAGRAMS.
8118: *
8119: * AS BEFORE, THE + REPRESENTS AN ALTERNATIVE NODE AND
8120: * THE DOTTED LINE FROM A + NODE IS THE PARAMETER POINTER
8121: * TO THE ALTERNATIVE PATTERN.
8122: *
8123: * ARB
8124: * ---
8125: *
8126: * +---+ THIS NODE (P$ARB) MATCHES NULL
8127: * I B I----- AND STACKS CURSOR, SUCCESSOR PTR,
8128: * +---+ CURSOR (COPY) AND A PTR TO NDARC.
8129: *
8130: *
8131: *
8132: *
8133: * BAL
8134: * ---
8135: *
8136: * +---+ THE P$BAL NODE SCANS A BALANCED
8137: * I B I----- STRING AND THEN STACKS A POINTER
8138: * +---+ TO ITSELF ON THE HISTORY STACK.
8139: {{EJC{{{{
8140: *
8141: * COMPOUND PATTERN STRUCTURES (CONTINUED)
8142: *
8143: *
8144: * ARBNO
8145: * -----
8146: *
8147: * +---+ THIS ALTERNATIVE NODE MATCHES NULL
8148: * +----I + I----- THE FIRST TIME AND STACKS A POINTER
8149: * I +---+ TO THE ARGUMENT PATTERN X.
8150: * I .
8151: * I .
8152: * I +---+ NODE (P$ABA) TO STACK CURSOR
8153: * I I A I AND HISTORY STACK BASE PTR.
8154: * I +---+
8155: * I I
8156: * I I
8157: * I +---+ THIS IS THE ARGUMENT PATTERN. AS
8158: * I I X I INDICATED, THE SUCCESSOR OF THE
8159: * I +---+ PATTERN IS THE P$ABC NODE
8160: * I I
8161: * I I
8162: * I +---+ THIS NODE (P$ABC) POPS PMHBS,
8163: * +----I C I STACKS OLD PMHBS AND PTR TO NDABD
8164: * +---+ (UNLESS OPTIMISATION HAS OCCURRED)
8165: *
8166: * STRUCTURE AND EXECUTION OF THIS PATTERN RESEMBLE THOSE OF
8167: * RECURSIVE PATTERN MATCHING AND IMMEDIATE ASSIGNMENT.
8168: * THE ALTERNATIVE NODE AT THE HEAD OF THE STRUCTURE MATCHES
8169: * NULL INITIALLY BUT ON SUBSEQUENT FAILURE ENSURES ATTEMPT
8170: * TO MATCH THE ARGUMENT. BEFORE THE ARGUMENT IS MATCHED
8171: * P$ABA STACKS THE CURSOR,PMHBS AND A PTR TO P$ABB. IF
8172: * THE ARGUMENT CANT BE MATCHED , P$ABB REMOVES THIS SPECIAL
8173: * STACK ENTRY AND FAILS.
8174: * IF ARGUMENT IS MATCHED , P$ABC RESTORES THE OUTER PMHBS
8175: * VALUE (SAVED BY P$ABA) . THEN IF THE ARGUMENT HAS LEFT
8176: * ALTERNATIVES ON STACK IT STACKS THE INNER VALUE OF PMHBS
8177: * AND A PTR TO NDABD. IF ARGUMENT LEFT NOTHING ON THE STACK
8178: * IT OPTIMISES BY REMOVING ITEMS STACKED BY P$ABA. FINALLY
8179: * A CHECK IS MADE THAT ARGUMENT MATCHED MORE THAN THE NULL
8180: * STRING (CHECK IS INTENDED TO PREVENT USELESS LOOPING).
8181: * IF SO THE SUCCESSOR IS AGAIN THE ALTERNATIVE NODE AT THE
8182: * HEAD OF THE STRUCTURE , ENSURING A POSSIBLE EXTRA ATTEMPT
8183: * TO MATCH THE ARG IF NECESSARY. IF NOT , THE SUCCESSOR TO
8184: * ALTERNATIVE IS TAKEN SO AS TO TERMINATE THE LOOP. P$ABD
8185: * RESTORES INNER PMHBS PTR AND FAILS , THUS TRYING TO MATCH
8186: * ALTERNATIVES LEFT BY THE ARBNO ARGUMENT.
8187: {{EJC{{{{
8188: *
8189: * COMPOUND PATTERN STRUCTURES (CONTINUED)
8190: *
8191: * BREAKX
8192: * ------
8193: *
8194: * +---+ THIS NODE IS A BREAK NODE FOR
8195: * +----I B I THE ARGUMENT TO BREAKX, IDENTICAL
8196: * I +---+ TO AN ORDINARY BREAK NODE.
8197: * I I
8198: * I I
8199: * I +---+ THIS ALTERNATIVE NODE STACKS A
8200: * I I + I----- POINTER TO THE BREAKX NODE TO
8201: * I +---+ ALLOW FOR SUBSEQUENT FAILURE
8202: * I .
8203: * I .
8204: * I +---+ THIS IS THE BREAKX NODE ITSELF. IT
8205: * +----I X I MATCHES ONE CHARACTER AND THEN
8206: * +---+ PROCEEDS BACK TO THE BREAK NODE.
8207: *
8208: *
8209: *
8210: *
8211: * FENCE
8212: * -----
8213: *
8214: * +---+ THE FENCE NODE MATCHES NULL AND
8215: * I F I----- STACKS A POINTER TO NODE NDABO TO
8216: * +---+ ABORT ON A SUBSEQUENT REMATCH
8217: *
8218: *
8219: *
8220: *
8221: * SUCCEED
8222: * -------
8223: *
8224: * +---+ THE NODE FOR SUCCEED MATCHES NULL
8225: * I S I----- AND STACKS A POINTER TO ITSELF
8226: * +---+ TO REPEAT THE MATCH ON A FAILURE.
8227: {{EJC{{{{
8228: *
8229: * COMPOUND PATTERNS (CONTINUED)
8230: *
8231: * BINARY DOT (PATTERN ASSIGNMENT)
8232: * -------------------------------
8233: *
8234: * +---+ THIS NODE (P$PAA) SAVES THE CURRENT
8235: * I A I CURSOR AND A POINTER TO THE
8236: * +---+ SPECIAL NODE NDPAB ON THE STACK.
8237: * I
8238: * I
8239: * +---+ THIS IS THE STRUCTURE FOR THE
8240: * I X I PATTERN LEFT ARGUMENT OF THE
8241: * +---+ PATTERN ASSIGNMENT CALL.
8242: * I
8243: * I
8244: * +---+ THIS NODE (P$PAC) SAVES THE CURSOR,
8245: * I C I----- A PTR TO ITSELF, THE CURSOR (COPY)
8246: * +---+ AND A PTR TO NDPAD ON THE STACK.
8247: *
8248: *
8249: * THE FUNCTION OF THE MATCH ROUTINE FOR NDPAB (P$PAB)
8250: * IS SIMPLY TO UNSTACK ITSELF AND FAIL BACK ONTO THE STACK.
8251: *
8252: * THE MATCH ROUTINE FOR P$PAC ALSO SETS THE GLOBAL PATTERN
8253: * FLAG PMDFL NON-ZERO TO INDICATE THAT PATTERN ASSIGNMENTS
8254: * MAY HAVE OCCURED IN THE PATTERN MATCH
8255: *
8256: * IF PMDFL IS SET AT THE END OF THE MATCH (SEE P$NTH), THE
8257: * HISTORY STACK IS SCANNED FOR MATCHING NDPAB-NDPAD PAIRS
8258: * AND THE CORRESPONDING PATTERN ASSIGNMENTS ARE EXECUTED.
8259: *
8260: * THE FUNCTION OF THE MATCH ROUTINE FOR NDPAD (P$PAD)
8261: * IS SIMPLY TO REMOVE ITS ENTRY FROM THE STACK AND FAIL.
8262: * THIS INCLUDES REMOVING THE SPECIAL NODE POINTER STORED
8263: * IN ADDITION TO THE STANDARD TWO ENTRIES ON THE STACK.
8264: {{EJC{{{{
8265: *
8266: * COMPOUNT PATTERN STRUCTURES (CONTINUED)
8267: *
8268: * FENCE (FUNCTION)
8269: * ----------------
8270: *
8271: * +---+ THIS NODE (P$FNA) SAVES THE
8272: * I A I CURRENT HISTORY STACK AND A
8273: * +---+ POINTER TO NDFNB ON THE STACK.
8274: * I
8275: * I
8276: * +---+ THIS IS THE PATTERN STRUCTURE
8277: * I X I GIVEN AS THE ARGUMENT TO THE
8278: * +---+ FENCE FUNCTION.
8279: * I
8280: * I
8281: * +---+ THIS NODE P$FNC RESTORES THE OUTER
8282: * I C I HISTORY STACK PTR SAVED IN P$FNA,
8283: * +---+ AND STACKS THE INNER STACK BASE
8284: * PTR AND A POINTER TO NDFND ON THE
8285: * STACK.
8286: *
8287: * NDFNB (F$FNB) SIMPLY IS THE FAILURE EXIT FOR PATTERN
8288: * ARGUMENT FAILURE, AND IT POPS ITSELF AND FAILS ONTO THE
8289: * STACK.
8290: *
8291: * THE MATCH ROUTINE P$FNC ALLOWS FOR AN OPTIMIZATION WHEN
8292: * THE FENCE PATTERN LEAVES NO ALTERNATIVES. IN THIS CASE,
8293: * THE NDFNB ENTRY IS POPPED, AND THE MATCH CONTINUES.
8294: *
8295: * NDFND (P$FND) IS ENTERED WHEN THE PATTERN FAILS AFTER
8296: * GOING THROUGH A NON-OPTIMIZED P$FNC, AND IT POPS THE
8297: * STACK BACK PAST THE INNTER STACK BASE CREATED BY P$FNA
8298: {{EJC{{{{
8299: *
8300: * COMPOUND PATTERNS (CONTINUED)
8301: *
8302: * EXPRESSION PATTERNS (RECURSIVE PATTERN MATCHES)
8303: * -----------------------------------------------
8304: *
8305: * INITIAL ENTRY FOR A PATTERN NODE IS TO THE ROUTINE P$EXA.
8306: * IF THE EVALUATED RESULT OF THE EXPRESSION IS ITSELF A
8307: * PATTERN, THEN THE FOLLOWING STEPS ARE TAKEN TO ARRANGE
8308: * FOR PROPER RECURSIVE PROCESSING.
8309: *
8310: * 1) A POINTER TO THE CURRENT NODE (THE P$EXA NODE) IS
8311: * STORED ON THE HISTORY STACK WITH A DUMMY CURSOR.
8312: *
8313: * 2) A SPECIAL HISTORY STACK ENTRY IS MADE IN WHICH THE
8314: * NODE POINTER POINTS TO NDEXB, AND THE CURSOR VALUE
8315: * IS THE SAVED VALUE OF PMHBS ON ENTRY TO THIS NODE.
8316: * THE MATCH ROUTINE FOR NDEXB (P$EXB) RESTORES PMHBS
8317: * FROM THIS CURSOR ENTRY, POPS OFF THE P$EXA NODE
8318: * POINTER AND FAILS.
8319: *
8320: * 3) THE RESULTING HISTORY STACK POINTER IS SAVED IN
8321: * PMHBS TO ESTABLISH A NEW LEVEL OF HISTORY STACK.
8322: *
8323: * AFTER MATCHING A PATTERN, THE END OF MATCH ROUTINE GETS
8324: * CONTROL (P$NTH). THIS ROUTINE PROCEEDS AS FOLLOWS.
8325: *
8326: * 1) LOAD THE CURRENT VALUE OF PMHBS AND RECOGNIZE THE
8327: * OUTER LEVEL CASE BY THE FACT THAT THE ASSOCIATED
8328: * CURSOR IN THIS CASE IS THE PATTERN MATCH TYPE CODE
8329: * WHICH IS LESS THAN 3. TERMINATE THE MATCH IN THIS
8330: * CASE AND CONTINUE EXECUTION OF THE PROGRAM.
8331: *
8332: * 2) OTHERWISE MAKE A SPECIAL HISTORY STACK ENTRY IN
8333: * WHICH THE NODE POINTER POINTS TO THE SPECIAL NODE
8334: * NDEXC AND THE CURSOR IS THE CURRENT VALUE OF PMHBS.
8335: * THE MATCH ROUTINE FOR NDEXC (P$EXC) RESETS PMHBS TO
8336: * THIS (INNER) VALUE AND AND THEN FAILS.
8337: *
8338: * 3) USING THE HISTORY STACK ENTRY MADE ON STARTING THE
8339: * EXPRESSION (ACCESSIBLE WITH THE CURRENT VALUE OF
8340: * PMHBS), RESTORE THE P$EXA NODE POINTER AND THE OLD
8341: * PMHBS SETTING. TAKE THE SUCCESSOR AND CONTINUE.
8342: *
8343: * AN OPTIMIZATION IS POSSIBLE IF THE EXPRESSION PATTERN
8344: * MAKES NO ENTRIES ON THE HISTORY STACK. IN THIS CASE,
8345: * INSTEAD OF BUILDING THE P$EXC NODE IN STEP 2, IT IS MORE
8346: * EFFICIENT TO SIMPLY POP OFF THE P$EXB ENTRY AND ITS
8347: * ASSOCIATED NODE POINTER. THE EFFECT IS THE SAME.
8348: {{EJC{{{{
8349: *
8350: * COMPOUND PATTERNS (CONTINUED)
8351: *
8352: * BINARY DOLLAR (IMMEDIATE ASSIGNMENT)
8353: * ------------------------------------
8354: *
8355: * +---+ THIS NODE (P$IMA) STACKS THE CURSOR
8356: * I A I PMHBS AND A PTR TO NDIMB AND RESETS
8357: * +---+ THE STACK PTR PMHBS.
8358: * I
8359: * I
8360: * +---+ THIS IS THE LEFT STRUCTURE FOR THE
8361: * I X I PATTERN LEFT ARGUMENT OF THE
8362: * +---+ IMMEDIATE ASSIGNMENT CALL.
8363: * I
8364: * I
8365: * +---+ THIS NODE (P$IMC) PERFORMS THE
8366: * I C I----- ASSIGNMENT, POPS PMHBS AND STACKS
8367: * +---+ THE OLD PMHBS AND A PTR TO NDIMD.
8368: *
8369: *
8370: * THE STRUCTURE AND EXECUTION OF THIS PATTERN ARE SIMILAR
8371: * TO THOSE OF THE RECURSIVE EXPRESSION PATTERN MATCHING.
8372: *
8373: * THE MATCH ROUTINE FOR NDIMB (P$IMB) RESTORES THE OUTER
8374: * LEVEL VALUE OF PMHBS, UNSTACKS THE SAVED CURSOR AND FAILS
8375: *
8376: * THE MATCH ROUTINE P$IMC USES THE CURRENT VALUE OF PMHBS
8377: * TO LOCATE THE P$IMB ENTRY. THIS ENTRY IS USED TO MAKE
8378: * THE ASSIGNMENT AND RESTORE THE OUTER LEVEL VALUE OF
8379: * PMHBS. FINALLY, THE INNER LEVEL VALUE OF PMHBS AND A
8380: * POINTER TO THE SPECIAL NODE NDIMD ARE STACKED.
8381: *
8382: * THE MATCH ROUTINE FOR NDIMD (P$IMD) RESTORES THE INNER
8383: * LEVEL VALUE OF PMHBS AND FAILS BACK INTO THE STACK.
8384: *
8385: * AN OPTIMIZATION OCCURS IF THE INNER PATTERN MAKES NO
8386: * ENTRIES ON THE HISTORY STACK. IN THIS CASE, P$IMC POPS
8387: * THE P$IMB ENTRY INSTEAD OF MAKING A P$IMD ENTRY.
8388: {{EJC{{{{
8389: *
8390: * ARBNO
8391: *
8392: * SEE COMPOUND PATTERNS SECTION FOR STUCTURE AND
8393: * ALGORITHM FOR MATCHING THIS NODE TYPE.
8394: *
8395: * NO PARAMETERS
8396: *
8397: {P$ABA{ENT{BL$P0{{{P0BLK
8398: {{MOV{R7{-(SP){{STACK CURSOR
8399: {{MOV{R9{-(SP){{STACK DUMMY NODE PTR
8400: {{MOV{PMHBS{-(SP){{STACK OLD STACK BASE PTR
8401: {{MOV{#NDABB{-(SP){{STACK PTR TO NODE NDABB
8402: {{MOV{SP{PMHBS{{STORE NEW STACK BASE PTR
8403: {{BRN{SUCCP{{{SUCCEED
8404: {{EJC{{{{
8405: *
8406: * ARBNO (REMOVE P$ABA SPECIAL STACK ENTRY)
8407: *
8408: * NO PARAMETERS (DUMMY PATTERN)
8409: *
8410: {P$ABB{ENT{{{{ENTRY POINT
8411: {{MOV{R7{PMHBS{{RESTORE HISTORY STACK BASE PTR
8412: {{BRN{FLPOP{{{FAIL AND POP DUMMY NODE PTR
8413: {{EJC{{{{
8414: *
8415: * ARBNO (CHECK IF ARG MATCHED NULL STRING)
8416: *
8417: * NO PARAMETERS (DUMMY PATTERN)
8418: *
8419: {P$ABC{ENT{BL$P0{{{P0BLK
8420: {{MOV{PMHBS{R10{{KEEP P$ABB STACK BASE
8421: {{MOV{4*3(R10){R6{{LOAD INITIAL CURSOR
8422: {{MOV{4*1(R10){PMHBS{{RESTORE OUTER STACK BASE PTR
8423: {{BEQ{R10{SP{PABC1{JUMP IF NO HISTORY STACK ENTRIES
8424: {{MOV{R10{-(SP){{ELSE SAVE INNER PMHBS ENTRY
8425: {{MOV{#NDABD{-(SP){{STACK PTR TO SPECIAL NODE NDABD
8426: {{BRN{PABC2{{{MERGE
8427: *
8428: * OPTIMISE CASE OF NO EXTRA ENTRIES ON STACK FROM ARBNO ARG
8429: *
8430: {PABC1{ADD{#4*NUM04{SP{{REMOVE NDABB ENTRY AND CURSOR
8431: *
8432: * MERGE TO CHECK FOR MATCHING OF NULL STRING
8433: *
8434: {PABC2{BNE{R6{R7{SUCCP{ALLOW FURTHER ATTEMPT IF NON-NULL
8435: {{MOV{4*PTHEN(R9){R9{{BYPASS ALTERNATIVE NODE SO AS TO ..
8436: {{BRN{SUCCP{{{... REFUSE FURTHER MATCH ATTEMPTS
8437: {{EJC{{{{
8438: *
8439: * ARBNO (TRY FOR ALTERNATIVES IN ARBNO ARGUMENT)
8440: *
8441: * NO PARAMETERS (DUMMY PATTERN)
8442: *
8443: {P$ABD{ENT{{{{ENTRY POINT
8444: {{MOV{R7{PMHBS{{RESTORE INNER STACK BASE PTR
8445: {{BRN{FAILP{{{AND FAIL
8446: {{EJC{{{{
8447: *
8448: * ABORT
8449: *
8450: * NO PARAMETERS
8451: *
8452: {P$ABO{ENT{BL$P0{{{P0BLK
8453: {{BRN{EXFAL{{{SIGNAL STATEMENT FAILURE
8454: {{EJC{{{{
8455: *
8456: * ALTERNATION
8457: *
8458: * PARM1 ALTERNATIVE NODE
8459: *
8460: {P$ALT{ENT{BL$P1{{{P1BLK
8461: {{MOV{R7{-(SP){{STACK CURSOR
8462: {{MOV{4*PARM1(R9){-(SP){{STACK POINTER TO ALTERNATIVE
8463: {{CHK{{{{CHECK FOR STACK OVERFLOW
8464: {{BRN{SUCCP{{{IF ALL OK, THEN SUCCEED
8465: {{EJC{{{{
8466: *
8467: * ANY (ONE CHARACTER ARGUMENT) (1-CHAR STRING ALSO)
8468: *
8469: * PARM1 CHARACTER ARGUMENT
8470: *
8471: {P$ANS{ENT{BL$P1{{{P1BLK
8472: {{BEQ{R7{PMSSL{FAILP{FAIL IF NO CHARS LEFT
8473: {{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING
8474: {{PLC{R10{R7{{POINT TO CURRENT CHARACTER
8475: {{LCH{R6{(R10){{LOAD CURRENT CHARACTER
8476: {{BNE{R6{4*PARM1(R9){FAILP{FAIL IF NO MATCH
8477: {{ICV{R7{{{ELSE BUMP CURSOR
8478: {{BRN{SUCCP{{{AND SUCCEED
8479: {{EJC{{{{
8480: *
8481: * ANY (MULTI-CHARACTER ARGUMENT CASE)
8482: *
8483: * PARM1 POINTER TO CTBLK
8484: * PARM2 BIT MASK TO SELECT BIT IN CTBLK
8485: *
8486: {P$ANY{ENT{BL$P2{{{P2BLK
8487: *
8488: * EXPRESSION ARGUMENT CASE MERGES HERE
8489: *
8490: {PANY1{BEQ{R7{PMSSL{FAILP{FAIL IF NO CHARACTERS LEFT
8491: {{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING
8492: {{PLC{R10{R7{{GET CHAR PTR TO CURRENT CHARACTER
8493: {{LCH{R6{(R10){{LOAD CURRENT CHARACTER
8494: {{MOV{4*PARM1(R9){R10{{POINT TO CTBLK
8495: {{WTB{R6{{{CHANGE TO BYTE OFFSET
8496: {{ADD{R6{R10{{POINT TO ENTRY IN CTBLK
8497: {{MOV{4*CTCHS(R10){R6{{LOAD WORD FROM CTBLK
8498: {{ANB{4*PARM2(R9){R6{{AND WITH SELECTED BIT
8499: {{ZRB{R6{FAILP{{FAIL IF NO MATCH
8500: {{ICV{R7{{{ELSE BUMP CURSOR
8501: {{BRN{SUCCP{{{AND SUCCEED
8502: {{EJC{{{{
8503: *
8504: * ANY (EXPRESSION ARGUMENT)
8505: *
8506: * PARM1 EXPRESSION POINTER
8507: *
8508: {P$AYD{ENT{BL$P1{{{P1BLK
8509: {{JSR{EVALS{{{EVALUATE STRING ARGUMENT
8510: {{ERR{043{ANY{{EVALUATED ARGUMENT IS NOT STRING
8511: {{PPM{FAILP{{{FAIL IF EVALUATION FAILURE
8512: {{PPM{PANY1{{{MERGE MULTI-CHAR CASE IF OK
8513: {{EJC{{{{
8514: *
8515: * P$ARB INITIAL ARB MATCH
8516: *
8517: * NO PARAMETERS
8518: *
8519: * THE P$ARB NODE IS PART OF A COMPOUND PATTERN STRUCTURE
8520: * FOR AN ARB PATTERN (SEE DESCRIPTION OF COMPOUND PATTERNS)
8521: *
8522: {P$ARB{ENT{BL$P0{{{P0BLK
8523: {{MOV{4*PTHEN(R9){R9{{LOAD SUCCESSOR POINTER
8524: {{MOV{R7{-(SP){{STACK DUMMY CURSOR
8525: {{MOV{R9{-(SP){{STACK SUCCESSOR POINTER
8526: {{MOV{R7{-(SP){{STACK CURSOR
8527: {{MOV{#NDARC{-(SP){{STACK PTR TO SPECIAL NODE NDARC
8528: {{BRI{(R9){{{EXECUTE NEXT NODE MATCHING NULL
8529: {{EJC{{{{
8530: *
8531: * P$ARC EXTEND ARB MATCH
8532: *
8533: * NO PARAMETERS (DUMMY PATTERN)
8534: *
8535: {P$ARC{ENT{{{{ENTRY POINT
8536: {{BEQ{R7{PMSSL{FLPOP{FAIL AND POP STACK TO SUCCESSOR
8537: {{ICV{R7{{{ELSE BUMP CURSOR
8538: {{MOV{R7{-(SP){{STACK UPDATED CURSOR
8539: {{MOV{R9{-(SP){{RESTACK POINTER TO NDARC NODE
8540: {{MOV{4*2(SP){R9{{LOAD SUCCESSOR POINTER
8541: {{BRI{(R9){{{OFF TO REEXECUTE SUCCESSOR NODE
8542: {{EJC{{{{
8543: *
8544: * BAL
8545: *
8546: * NO PARAMETERS
8547: *
8548: * THE P$BAL NODE IS PART OF THE COMPOUND STRUCTURE BUILT
8549: * FOR BAL (SEE SECTION ON COMPOUND PATTERNS).
8550: *
8551: {P$BAL{ENT{BL$P0{{{P0BLK
8552: {{ZER{R8{{{ZERO PARENTHESES LEVEL COUNTER
8553: {{MOV{R$PMS{R10{{POINT TO SUBJECT STRING
8554: {{PLC{R10{R7{{POINT TO CURRENT CHARACTER
8555: {{BRN{PBAL2{{{JUMP INTO SCAN LOOP
8556: *
8557: * LOOP TO SCAN OUT CHARACTERS
8558: *
8559: {PBAL1{LCH{R6{(R10)+{{LOAD NEXT CHARACTER, BUMP POINTER
8560: {{ICV{R7{{{PUSH CURSOR FOR CHARACTER
8561: {{BEQ{R6{#CH$PP{PBAL3{JUMP IF LEFT PAREN
8562: {{BEQ{R6{#CH$RP{PBAL4{JUMP IF RIGHT PAREN
8563: {{BZE{R8{PBAL5{{ELSE SUCCEED IF AT OUTER LEVEL
8564: *
8565: * HERE AFTER PROCESSING ONE CHARACTER
8566: *
8567: {PBAL2{BNE{R7{PMSSL{PBAL1{LOOP BACK UNLESS END OF STRING
8568: {{BRN{FAILP{{{IN WHICH CASE, FAIL
8569: *
8570: * HERE ON LEFT PAREN
8571: *
8572: {PBAL3{ICV{R8{{{BUMP PAREN LEVEL
8573: {{BRN{PBAL2{{{LOOP BACK TO CHECK END OF STRING
8574: *
8575: * HERE FOR RIGHT PAREN
8576: *
8577: {PBAL4{BZE{R8{FAILP{{FAIL IF NO MATCHING LEFT PAREN
8578: {{DCV{R8{{{ELSE DECREMENT LEVEL COUNTER
8579: {{BNZ{R8{PBAL2{{LOOP BACK IF NOT AT OUTER LEVEL
8580: *
8581: * HERE AFTER SUCCESSFULLY SCANNING A BALANCED STRING
8582: *
8583: {PBAL5{MOV{R7{-(SP){{STACK CURSOR
8584: {{MOV{R9{-(SP){{STACK PTR TO BAL NODE FOR EXTEND
8585: {{BRN{SUCCP{{{AND SUCCEED
8586: {{EJC{{{{
8587: *
8588: * BREAK (EXPRESSION ARGUMENT)
8589: *
8590: * PARM1 EXPRESSION POINTER
8591: *
8592: {P$BKD{ENT{BL$P1{{{P1BLK
8593: {{JSR{EVALS{{{EVALUATE STRING EXPRESSION
8594: {{ERR{044{BREAK{{EVALUATED ARGUMENT IS NOT STRING
8595: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS
8596: {{PPM{PBRK1{{{MERGE WITH MULTI-CHAR CASE IF OK
8597: {{EJC{{{{
8598: *
8599: * BREAK (ONE CHARACTER ARGUMENT)
8600: *
8601: * PARM1 CHARACTER ARGUMENT
8602: *
8603: {P$BKS{ENT{BL$P1{{{P1BLK
8604: {{MOV{PMSSL{R8{{GET SUBJECT STRING LENGTH
8605: {{SUB{R7{R8{{GET NUMBER OF CHARACTERS LEFT
8606: {{BZE{R8{FAILP{{FAIL IF NO CHARACTERS LEFT
8607: {{LCT{R8{R8{{SET COUNTER FOR CHARS LEFT
8608: {{MOV{R$PMS{R10{{POINT TO SUBJECT STRING
8609: {{PLC{R10{R7{{POINT TO CURRENT CHARACTER
8610: *
8611: * LOOP TO SCAN TILL BREAK CHARACTER FOUND
8612: *
8613: {PBKS1{LCH{R6{(R10)+{{LOAD NEXT CHAR, BUMP POINTER
8614: {{BEQ{R6{4*PARM1(R9){SUCCP{SUCCEED IF BREAK CHARACTER FOUND
8615: {{ICV{R7{{{ELSE PUSH CURSOR
8616: {{BCT{R8{PBKS1{{LOOP BACK IF MORE TO GO
8617: {{BRN{FAILP{{{FAIL IF END OF STRING, NO BREAK CHR
8618: {{EJC{{{{
8619: *
8620: * BREAK (MULTI-CHARACTER ARGUMENT)
8621: *
8622: * PARM1 POINTER TO CTBLK
8623: * PARM2 BIT MASK TO SELECT BIT COLUMN
8624: *
8625: {P$BRK{ENT{BL$P2{{{P2BLK
8626: *
8627: * EXPRESSION ARGUMENT MERGES HERE
8628: *
8629: {PBRK1{MOV{PMSSL{R8{{LOAD SUBJECT STRING LENGTH
8630: {{SUB{R7{R8{{GET NUMBER OF CHARACTERS LEFT
8631: {{BZE{R8{FAILP{{FAIL IF NO CHARACTERS LEFT
8632: {{LCT{R8{R8{{SET COUNTER FOR CHARACTERS LEFT
8633: {{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING
8634: {{PLC{R10{R7{{POINT TO CURRENT CHARACTER
8635: {{MOV{R9{PSAVE{{SAVE NODE POINTER
8636: *
8637: * LOOP TO SEARCH FOR BREAK CHARACTER
8638: *
8639: {PBRK2{LCH{R6{(R10)+{{LOAD NEXT CHAR, BUMP POINTER
8640: {{MOV{4*PARM1(R9){R9{{LOAD POINTER TO CTBLK
8641: {{WTB{R6{{{CONVERT TO BYTE OFFSET
8642: {{ADD{R6{R9{{POINT TO CTBLK ENTRY
8643: {{MOV{4*CTCHS(R9){R6{{LOAD CTBLK WORD
8644: {{MOV{PSAVE{R9{{RESTORE NODE POINTER
8645: {{ANB{4*PARM2(R9){R6{{AND WITH SELECTED BIT
8646: {{NZB{R6{SUCCP{{SUCCEED IF BREAK CHARACTER FOUND
8647: {{ICV{R7{{{ELSE PUSH CURSOR
8648: {{BCT{R8{PBRK2{{LOOP BACK UNLESS END OF STRING
8649: {{BRN{FAILP{{{FAIL IF END OF STRING, NO BREAK CHR
8650: {{EJC{{{{
8651: *
8652: * BREAKX (EXTENSION)
8653: *
8654: * THIS IS THE ENTRY WHICH CAUSES AN EXTENSION OF A BREAKX
8655: * MATCH WHEN FAILURE OCCURS. SEE SECTION ON COMPOUND
8656: * PATTERNS FOR FULL DETAILS OF BREAKX MATCHING.
8657: *
8658: * NO PARAMETERS
8659: *
8660: {P$BKX{ENT{BL$P0{{{P0BLK
8661: {{ICV{R7{{{STEP CURSOR PAST PREVIOUS BREAK CHR
8662: {{BRN{SUCCP{{{SUCCEED TO REMATCH BREAK
8663: {{EJC{{{{
8664: *
8665: * BREAKX (EXPRESSION ARGUMENT)
8666: *
8667: * SEE SECTION ON COMPOUND PATTERNS FOR FULL STRUCTURE OF
8668: * BREAKX PATTERN. THE ACTUAL CHARACTER MATCHING USES A
8669: * BREAK NODE. HOWEVER, THE ENTRY FOR THE EXPRESSION
8670: * ARGUMENT CASE IS SEPARATED TO GET PROPER ERROR MESSAGES.
8671: *
8672: * PARM1 EXPRESSION POINTER
8673: *
8674: {P$BXD{ENT{BL$P1{{{P1BLK
8675: {{JSR{EVALS{{{EVALUATE STRING ARGUMENT
8676: {{ERR{045{BREAKX{{EVALUATED ARGUMENT IS NOT STRING
8677: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS
8678: {{PPM{PBRK1{{{MERGE WITH BREAK IF ALL OK
8679: {{EJC{{{{
8680: *
8681: * CURSOR ASSIGNMENT
8682: *
8683: * PARM1 NAME BASE
8684: * PARM2 NAME OFFSET
8685: *
8686: {P$CAS{ENT{BL$P2{{{P2BLK
8687: {{MOV{R9{-(SP){{SAVE NODE POINTER
8688: {{MOV{R7{-(SP){{SAVE CURSOR
8689: {{MOV{4*PARM1(R9){R10{{LOAD NAME BASE
8690: {{MTI{R7{{{LOAD CURSOR AS INTEGER
8691: {{MOV{4*PARM2(R9){R7{{LOAD NAME OFFSET
8692: {{JSR{ICBLD{{{GET ICBLK FOR CURSOR VALUE
8693: {{MOV{R7{R6{{MOVE NAME OFFSET
8694: {{MOV{R9{R7{{MOVE VALUE TO ASSIGN
8695: {{JSR{ASINP{{{PERFORM ASSIGNMENT
8696: {{PPM{FLPOP{{{FAIL ON ASSIGNMENT FAILURE
8697: {{MOV{(SP)+{R7{{ELSE RESTORE CURSOR
8698: {{MOV{(SP)+{R9{{RESTORE NODE POINTER
8699: {{BRN{SUCCP{{{AND SUCCEED MATCHING NULL
8700: {{EJC{{{{
8701: *
8702: * EXPRESSION NODE (P$EXA, INITIAL ENTRY)
8703: *
8704: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
8705: * ALGORITHMS FOR HANDLING EXPRESSION NODES.
8706: *
8707: * PARM1 EXPRESSION POINTER
8708: *
8709: {P$EXA{ENT{BL$P1{{{P1BLK
8710: {{JSR{EVALP{{{EVALUATE EXPRESSION
8711: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS
8712: {{BLO{R6{#P$AAA{PEXA1{JUMP IF RESULT IS NOT A PATTERN
8713: *
8714: * HERE IF RESULT OF EXPRESSION IS A PATTERN
8715: *
8716: {{MOV{R7{-(SP){{STACK DUMMY CURSOR
8717: {{MOV{R9{-(SP){{STACK PTR TO P$EXA NODE
8718: {{MOV{PMHBS{-(SP){{STACK HISTORY STACK BASE PTR
8719: {{MOV{#NDEXB{-(SP){{STACK PTR TO SPECIAL NODE NDEXB
8720: {{MOV{SP{PMHBS{{STORE NEW STACK BASE POINTER
8721: {{MOV{R10{R9{{COPY NODE POINTER
8722: {{BRI{(R9){{{MATCH FIRST NODE IN EXPRESSION PAT
8723: *
8724: * HERE IF RESULT OF EXPRESSION IS NOT A PATTERN
8725: *
8726: {PEXA1{BEQ{R6{#B$SCL{PEXA2{JUMP IF IT IS ALREADY A STRING
8727: {{MOV{R10{-(SP){{ELSE STACK RESULT
8728: {{MOV{R9{R10{{SAVE NODE POINTER
8729: {{JSR{GTSTG{{{CONVERT RESULT TO STRING
8730: {{ERR{046{EXPRESSION{{DOES NOT EVALUATE TO PATTERN
8731: {{MOV{R9{R8{{COPY STRING POINTER
8732: {{MOV{R10{R9{{RESTORE NODE POINTER
8733: {{MOV{R8{R10{{COPY STRING POINTER AGAIN
8734: *
8735: * MERGE HERE WITH STRING POINTER IN XL
8736: *
8737: {PEXA2{BZE{4*SCLEN(R10){SUCCP{{JUST SUCCEED IF NULL STRING
8738: {{BRN{PSTR1{{{ELSE MERGE WITH STRING CIRCUIT
8739: {{EJC{{{{
8740: *
8741: * EXPRESSION NODE (P$EXB, REMOVE NDEXB ENTRY)
8742: *
8743: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
8744: * ALGORITHMS FOR HANDLING EXPRESSION NODES.
8745: *
8746: * NO PARAMETERS (DUMMY PATTERN)
8747: *
8748: {P$EXB{ENT{{{{ENTRY POINT
8749: {{MOV{R7{PMHBS{{RESTORE OUTER LEVEL STACK POINTER
8750: {{BRN{FLPOP{{{FAIL AND POP P$EXA NODE PTR
8751: {{EJC{{{{
8752: *
8753: * EXPRESSION NODE (P$EXC, REMOVE NDEXC ENTRY)
8754: *
8755: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
8756: * ALGORITHMS FOR HANDLING EXPRESSION NODES.
8757: *
8758: * NO PARAMETERS (DUMMY PATTERN)
8759: *
8760: {P$EXC{ENT{{{{ENTRY POINT
8761: {{MOV{R7{PMHBS{{RESTORE INNER STACK BASE POINTER
8762: {{BRN{FAILP{{{AND FAIL INTO EXPR PATTERN ALTERNVS
8763: {{EJC{{{{
8764: *
8765: * FAIL
8766: *
8767: * NO PARAMETERS
8768: *
8769: {P$FAL{ENT{BL$P0{{{P0BLK
8770: {{BRN{FAILP{{{JUST SIGNAL FAILURE
8771: {{EJC{{{{
8772: *
8773: * FENCE
8774: *
8775: * SEE COMPOUND PATTERNS SECTION FOR THE STRUCTURE AND
8776: * ALGORITHM FOR MATCHING THIS NODE TYPE.
8777: *
8778: * NO PARAMETERS
8779: *
8780: {P$FEN{ENT{BL$P0{{{P0BLK
8781: {{MOV{R7{-(SP){{STACK DUMMY CURSOR
8782: {{MOV{#NDABO{-(SP){{STACK PTR TO ABORT NODE
8783: {{BRN{SUCCP{{{AND SUCCEED MATCHING NULL
8784: {{EJC{{{{
8785: *
8786: * FENCE (FUNCTION)
8787: *
8788: * SEE COMPOUND PATTERNS COMMENTS AT START OF THIS SECTION
8789: * FOR DETAILS OF SCHEME
8790: *
8791: * NO PARAMETERS
8792: *
8793: {P$FNA{ENT{BL$P0{{{P0BLK
8794: {{MOV{PMHBS{-(SP){{STACK CURRENT HISTORY STACK BASE
8795: {{MOV{#NDFNB{-(SP){{STACK INDIR PTR TO P$FNB (FAILURE)
8796: {{MOV{SP{PMHBS{{BEGIN NEW HISTORY STACK
8797: {{BRN{SUCCP{{{SUCCEED
8798: {{EJC{{{{
8799: *
8800: * FENCE (FUNCTION) (RESET HISTORY STACK AND FAIL)
8801: *
8802: * NO PARAMETERS (DUMMY PATTERN)
8803: *
8804: {P$FNB{ENT{BL$P0{{{P0BLK
8805: {{MOV{R7{PMHBS{{RESTORE OUTER PMHBS STACK BASE
8806: {{BRN{FAILP{{{...AND FAIL
8807: {{EJC{{{{
8808: *
8809: * FENCE (FUNCTION) (MAKE FENCE TRAP ENTRY ON STACK)
8810: *
8811: * NO PARAMETERS (DUMMY PATTERN)
8812: *
8813: {P$FNC{ENT{BL$P0{{{P0BLK
8814: {{MOV{PMHBS{R10{{GET INNER STACK BASE PTR
8815: {{MOV{4*NUM01(R10){PMHBS{{RESTORE OUTER STACK BASE
8816: {{BEQ{R10{SP{PFNC1{OPTIMIZE IF NO ALTERNATIVES
8817: {{MOV{R10{-(SP){{ELSE STACK INNER STACK BASE
8818: {{MOV{#NDFND{-(SP){{STACK PTR TO NDFND
8819: {{BRN{SUCCP{{{SUCCEED
8820: *
8821: * HERE WHEN FENCE FUNCTION LEFT NOTHING ON THE STACK
8822: *
8823: {PFNC1{ADD{#4*NUM02{SP{{POP OFF P$FNB ENTRY
8824: {{BRN{SUCCP{{{SUCCEED
8825: {{EJC{{{{
8826: *
8827: * FENCE (FUNCTION) (SKIP PAST ALTERNATIVES ON FAILURE)
8828: *
8829: * NO PARAMETERS (DUMMY PATTERN)
8830: *
8831: {P$FND{ENT{BL$P0{{{P0BLK
8832: {{MOV{R7{SP{{POP STACK TO FENCE() HISTORY BASE
8833: {{BRN{FLPOP{{{POP BASE ENTRY AND FAIL
8834: {{EJC{{{{
8835: *
8836: * IMMEDIATE ASSIGNMENT (INITIAL ENTRY, SAVE CURRENT CURSOR)
8837: *
8838: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
8839: * STRUCTURE AND ALGORITHM FOR MATCHING THIS NODE TYPE.
8840: *
8841: * NO PARAMETERS
8842: *
8843: {P$IMA{ENT{BL$P0{{{P0BLK
8844: {{MOV{R7{-(SP){{STACK CURSOR
8845: {{MOV{R9{-(SP){{STACK DUMMY NODE POINTER
8846: {{MOV{PMHBS{-(SP){{STACK OLD STACK BASE POINTER
8847: {{MOV{#NDIMB{-(SP){{STACK PTR TO SPECIAL NODE NDIMB
8848: {{MOV{SP{PMHBS{{STORE NEW STACK BASE POINTER
8849: {{BRN{SUCCP{{{AND SUCCEED
8850: {{EJC{{{{
8851: *
8852: * IMMEDIATE ASSIGNMENT (REMOVE CURSOR MARK ENTRY)
8853: *
8854: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
8855: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
8856: *
8857: * NO PARAMETERS (DUMMY PATTERN)
8858: *
8859: {P$IMB{ENT{{{{ENTRY POINT
8860: {{MOV{R7{PMHBS{{RESTORE HISTORY STACK BASE PTR
8861: {{BRN{FLPOP{{{FAIL AND POP DUMMY NODE PTR
8862: {{EJC{{{{
8863: *
8864: * IMMEDIATE ASSIGNMENT (PERFORM ACTUAL ASSIGNMENT)
8865: *
8866: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
8867: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
8868: *
8869: * PARM1 NAME BASE OF VARIABLE
8870: * PARM2 NAME OFFSET OF VARIABLE
8871: *
8872: {P$IMC{ENT{BL$P2{{{P2BLK
8873: {{MOV{PMHBS{R10{{LOAD POINTER TO P$IMB ENTRY
8874: {{MOV{R7{R6{{COPY FINAL CURSOR
8875: {{MOV{4*3(R10){R7{{LOAD INITIAL CURSOR
8876: {{MOV{4*1(R10){PMHBS{{RESTORE OUTER STACK BASE POINTER
8877: {{BEQ{R10{SP{PIMC1{JUMP IF NO HISTORY STACK ENTRIES
8878: {{MOV{R10{-(SP){{ELSE SAVE INNER PMHBS POINTER
8879: {{MOV{#NDIMD{-(SP){{AND A PTR TO SPECIAL NODE NDIMD
8880: {{BRN{PIMC2{{{MERGE
8881: *
8882: * HERE IF NO ENTRIES MADE ON HISTORY STACK
8883: *
8884: {PIMC1{ADD{#4*NUM04{SP{{REMOVE NDIMB ENTRY AND CURSOR
8885: *
8886: * MERGE HERE TO PERFORM ASSIGNMENT
8887: *
8888: {PIMC2{MOV{R6{-(SP){{SAVE CURRENT (FINAL) CURSOR
8889: {{MOV{R9{-(SP){{SAVE CURRENT NODE POINTER
8890: {{MOV{R$PMS{R10{{POINT TO SUBJECT STRING
8891: {{SUB{R7{R6{{COMPUTE SUBSTRING LENGTH
8892: {{JSR{SBSTR{{{BUILD SUBSTRING
8893: {{MOV{R9{R7{{MOVE RESULT
8894: {{MOV{(SP){R9{{RELOAD NODE POINTER
8895: {{MOV{4*PARM1(R9){R10{{LOAD NAME BASE
8896: {{MOV{4*PARM2(R9){R6{{LOAD NAME OFFSET
8897: {{JSR{ASINP{{{PERFORM ASSIGNMENT
8898: {{PPM{FLPOP{{{FAIL IF ASSIGNMENT FAILS
8899: {{MOV{(SP)+{R9{{ELSE RESTORE NODE POINTER
8900: {{MOV{(SP)+{R7{{RESTORE CURSOR
8901: {{BRN{SUCCP{{{AND SUCCEED
8902: {{EJC{{{{
8903: *
8904: * IMMEDIATE ASSIGNMENT (REMOVE NDIMD ENTRY ON FAILURE)
8905: *
8906: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
8907: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
8908: *
8909: * NO PARAMETERS (DUMMY PATTERN)
8910: *
8911: {P$IMD{ENT{{{{ENTRY POINT
8912: {{MOV{R7{PMHBS{{RESTORE INNER STACK BASE POINTER
8913: {{BRN{FAILP{{{AND FAIL
8914: {{EJC{{{{
8915: *
8916: * LEN (INTEGER ARGUMENT)
8917: *
8918: * PARM1 INTEGER ARGUMENT
8919: *
8920: {P$LEN{ENT{BL$P1{{{P1BLK
8921: *
8922: * EXPRESSION ARGUMENT CASE MERGES HERE
8923: *
8924: {PLEN1{ADD{4*PARM1(R9){R7{{PUSH CURSOR INDICATED AMOUNT
8925: {{BLE{R7{PMSSL{SUCCP{SUCCEED IF NOT OFF END
8926: {{BRN{FAILP{{{ELSE FAIL
8927: {{EJC{{{{
8928: *
8929: * LEN (EXPRESSION ARGUMENT)
8930: *
8931: * PARM1 EXPRESSION POINTER
8932: *
8933: {P$LND{ENT{BL$P1{{{P1BLK
8934: {{JSR{EVALI{{{EVALUATE INTEGER ARGUMENT
8935: {{ERR{047{LEN{{EVALUATED ARGUMENT IS NOT INTEGER
8936: {{ERR{048{LEN{{EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
8937: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS
8938: {{PPM{PLEN1{{{MERGE WITH NORMAL CIRCUIT IF OK
8939: {{EJC{{{{
8940: *
8941: * NOTANY (EXPRESSION ARGUMENT)
8942: *
8943: * PARM1 EXPRESSION POINTER
8944: *
8945: {P$NAD{ENT{BL$P1{{{P1BLK
8946: {{JSR{EVALS{{{EVALUATE STRING ARGUMENT
8947: {{ERR{049{NOTANY{{EVALUATED ARGUMENT IS NOT STRING
8948: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS
8949: {{PPM{PNAY1{{{MERGE WITH MULTI-CHAR CASE IF OK
8950: {{EJC{{{{
8951: *
8952: * NOTANY (ONE CHARACTER ARGUMENT)
8953: *
8954: * PARM1 CHARACTER ARGUMENT
8955: *
8956: {P$NAS{ENT{BL$P1{{{ENTRY POINT
8957: {{BEQ{R7{PMSSL{FAILP{FAIL IF NO CHARS LEFT
8958: {{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING
8959: {{PLC{R10{R7{{POINT TO CURRENT CHARACTER IN STRIN
8960: {{LCH{R6{(R10){{LOAD CURRENT CHARACTER
8961: {{BEQ{R6{4*PARM1(R9){FAILP{FAIL IF MATCH
8962: {{ICV{R7{{{ELSE BUMP CURSOR
8963: {{BRN{SUCCP{{{AND SUCCEED
8964: {{EJC{{{{
8965: *
8966: * NOTANY (MULTI-CHARACTER STRING ARGUMENT)
8967: *
8968: * PARM1 POINTER TO CTBLK
8969: * PARM2 BIT MASK TO SELECT BIT COLUMN
8970: *
8971: {P$NAY{ENT{BL$P2{{{P2BLK
8972: *
8973: * EXPRESSION ARGUMENT CASE MERGES HERE
8974: *
8975: {PNAY1{BEQ{R7{PMSSL{FAILP{FAIL IF NO CHARACTERS LEFT
8976: {{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING
8977: {{PLC{R10{R7{{POINT TO CURRENT CHARACTER
8978: {{LCH{R6{(R10){{LOAD CURRENT CHARACTER
8979: {{WTB{R6{{{CONVERT TO BYTE OFFSET
8980: {{MOV{4*PARM1(R9){R10{{LOAD POINTER TO CTBLK
8981: {{ADD{R6{R10{{POINT TO ENTRY IN CTBLK
8982: {{MOV{4*CTCHS(R10){R6{{LOAD ENTRY FROM CTBLK
8983: {{ANB{4*PARM2(R9){R6{{AND WITH SELECTED BIT
8984: {{NZB{R6{FAILP{{FAIL IF CHARACTER IS MATCHED
8985: {{ICV{R7{{{ELSE BUMP CURSOR
8986: {{BRN{SUCCP{{{AND SUCCEED
8987: {{EJC{{{{
8988: *
8989: * END OF PATTERN MATCH
8990: *
8991: * THIS ROUTINE IS ENTERED ON SUCCESSFUL COMPLETION.
8992: * SEE DESCRIPTION OF EXPRESSION PATTERNS IN COMPOUND
8993: * PATTERN SECTION FOR HANDLING OF RECURSION IN MATCHING.
8994: *
8995: * NO PARAMETERS (DUMMY PATTERN)
8996: *
8997: {P$NTH{ENT{{{{ENTRY POINT
8998: {{MOV{PMHBS{R10{{LOAD POINTER TO BASE OF STACK
8999: {{MOV{4*1(R10){R6{{LOAD SAVED PMHBS (OR PATTERN TYPE)
9000: {{BLE{R6{#NUM02{PNTH2{JUMP IF OUTER LEVEL (PATTERN TYPE)
9001: *
9002: * HERE WE ARE AT THE END OF MATCHING AN EXPRESSION PATTERN
9003: *
9004: {{MOV{R6{PMHBS{{RESTORE OUTER STACK BASE POINTER
9005: {{MOV{4*2(R10){R9{{RESTORE POINTER TO P$EXA NODE
9006: {{BEQ{R10{SP{PNTH1{JUMP IF NO HISTORY STACK ENTRIES
9007: {{MOV{R10{-(SP){{ELSE STACK INNER STACK BASE PTR
9008: {{MOV{#NDEXC{-(SP){{STACK PTR TO SPECIAL NODE NDEXC
9009: {{BRN{SUCCP{{{AND SUCCEED
9010: *
9011: * HERE IF NO HISTORY STACK ENTRIES DURING PATTERN
9012: *
9013: {PNTH1{ADD{#4*NUM04{SP{{REMOVE P$EXB ENTRY AND NODE PTR
9014: {{BRN{SUCCP{{{AND SUCCEED
9015: *
9016: * HERE IF END OF MATCH AT OUTER LEVEL
9017: *
9018: {PNTH2{MOV{R7{PMSSL{{SAVE FINAL CURSOR IN SAFE PLACE
9019: {{BZE{PMDFL{PNTH6{{JUMP IF NO PATTERN ASSIGNMENTS
9020: {{EJC{{{{
9021: *
9022: * END OF PATTERN MATCH (CONTINUED)
9023: *
9024: * NOW WE MUST PERFORM PATTERN ASSIGNMENTS. THIS IS DONE BY
9025: * SCANNING THE HISTORY STACK FOR MATCHING NDPAB-NDPAD PAIRS
9026: *
9027: {PNTH3{DCA{R10{{{POINT PAST CURSOR ENTRY
9028: {{MOV{-(R10){R6{{LOAD NODE POINTER
9029: {{BEQ{R6{#NDPAD{PNTH4{JUMP IF NDPAD ENTRY
9030: {{BNE{R6{#NDPAB{PNTH5{JUMP IF NOT NDPAB ENTRY
9031: *
9032: * HERE FOR NDPAB ENTRY, STACK INITIAL CURSOR
9033: * NOTE THAT THERE MUST BE MORE ENTRIES ON THE STACK.
9034: *
9035: {{MOV{4*1(R10){-(SP){{STACK INITIAL CURSOR
9036: {{CHK{{{{CHECK FOR STACK OVERFLOW
9037: {{BRN{PNTH3{{{LOOP BACK IF OK
9038: *
9039: * HERE FOR NDPAD ENTRY. THE STARTING CURSOR FROM THE
9040: * MATCHING NDPAD ENTRY IS NOW THE TOP STACK ENTRY.
9041: *
9042: {PNTH4{MOV{4*1(R10){R6{{LOAD FINAL CURSOR
9043: {{MOV{(SP){R7{{LOAD INITIAL CURSOR FROM STACK
9044: {{MOV{R10{(SP){{SAVE HISTORY STACK SCAN PTR
9045: {{SUB{R7{R6{{COMPUTE LENGTH OF STRING
9046: *
9047: * BUILD SUBSTRING AND PERFORM ASSIGNMENT
9048: *
9049: {{MOV{R$PMS{R10{{POINT TO SUBJECT STRING
9050: {{JSR{SBSTR{{{CONSTRUCT SUBSTRING
9051: {{MOV{R9{R7{{COPY SUBSTRING POINTER
9052: {{MOV{(SP){R10{{RELOAD HISTORY STACK SCAN PTR
9053: {{MOV{4*2(R10){R10{{LOAD POINTER TO P$PAC NODE WITH NAM
9054: {{MOV{4*PARM2(R10){R6{{LOAD NAME OFFSET
9055: {{MOV{4*PARM1(R10){R10{{LOAD NAME BASE
9056: {{JSR{ASINP{{{PERFORM ASSIGNMENT
9057: {{PPM{EXFAL{{{MATCH FAILS IF NAME EVAL FAILS
9058: {{MOV{(SP)+{R10{{ELSE RESTORE HISTORY STACK PTR
9059: {{EJC{{{{
9060: *
9061: * END OF PATTERN MATCH (CONTINUED)
9062: *
9063: * HERE CHECK FOR END OF ENTRIES
9064: *
9065: {PNTH5{BNE{R10{SP{PNTH3{LOOP IF MORE ENTRIES TO SCAN
9066: *
9067: * HERE AFTER DEALING WITH PATTERN ASSIGNMENTS
9068: *
9069: {PNTH6{MOV{PMHBS{SP{{WIPE OUT HISTORY STACK
9070: {{MOV{(SP)+{R7{{LOAD INITIAL CURSOR
9071: {{MOV{(SP)+{R8{{LOAD MATCH TYPE CODE
9072: {{MOV{PMSSL{R6{{LOAD FINAL CURSOR VALUE
9073: {{MOV{R$PMS{R10{{POINT TO SUBJECT STRING
9074: {{ZER{R$PMS{{{CLEAR SUBJECT STRING PTR FOR GBCOL
9075: {{BZE{R8{PNTH7{{JUMP IF CALL BY NAME
9076: {{BEQ{R8{#NUM02{EXITS{EXIT IF STATEMENT LEVEL CALL
9077: *
9078: * HERE WE HAVE A CALL BY VALUE, BUILD SUBSTRING
9079: *
9080: {{SUB{R7{R6{{COMPUTE LENGTH OF STRING
9081: {{JSR{SBSTR{{{BUILD SUBSTRING
9082: {{BRN{EXIXR{{{AND EXIT WITH SUBSTRING VALUE
9083: *
9084: * HERE FOR CALL BY NAME, MAKE STACK ENTRIES FOR O$RPL
9085: *
9086: {PNTH7{MOV{R7{-(SP){{STACK INITIAL CURSOR
9087: {{MOV{R6{-(SP){{STACK FINAL CURSOR
9088: {{BZE{R$PMB{PNTH8{{SKIP IF SUBJECT NOT BUFFER
9089: {{MOV{R$PMB{R10{{ELSE GET PTR TO BCBLK INSTEAD
9090: *
9091: * HERE WITH XL POINTING TO SCBLK OR BCBLK
9092: *
9093: {PNTH8{MOV{R10{-(SP){{STACK SUBJECT POINTER
9094: {{BRN{EXITS{{{EXIT WITH SPECIAL ENTRY ON STACK
9095: {{EJC{{{{
9096: *
9097: * POS (INTEGER ARGUMENT)
9098: *
9099: * PARM1 INTEGER ARGUMENT
9100: *
9101: {P$POS{ENT{BL$P1{{{P1BLK
9102: *
9103: * EXPRESSION ARGUMENT CASE MERGES HERE
9104: *
9105: {PPOS1{BEQ{R7{4*PARM1(R9){SUCCP{SUCCEED IF AT RIGHT LOCATION
9106: {{BRN{FAILP{{{ELSE FAIL
9107: {{EJC{{{{
9108: *
9109: * POS (EXPRESSION ARGUMENT)
9110: *
9111: * PARM1 EXPRESSION POINTER
9112: *
9113: {P$PSD{ENT{BL$P1{{{P1BLK
9114: {{JSR{EVALI{{{EVALUATE INTEGER ARGUMENT
9115: {{ERR{050{POS{{EVALUATED ARGUMENT IS NOT INTEGER
9116: {{ERR{051{POS{{EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
9117: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS
9118: {{PPM{PPOS1{{{MERGE WITH NORMAL CASE IF OK
9119: {{EJC{{{{
9120: *
9121: * PATTERN ASSIGNMENT (INITIAL ENTRY, SAVE CURSOR)
9122: *
9123: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
9124: * ALGORITHMS FOR MATCHING THIS NODE TYPE.
9125: *
9126: * NO PARAMETERS
9127: *
9128: {P$PAA{ENT{BL$P0{{{P0BLK
9129: {{MOV{R7{-(SP){{STACK INITIAL CURSOR
9130: {{MOV{#NDPAB{-(SP){{STACK PTR TO NDPAB SPECIAL NODE
9131: {{BRN{SUCCP{{{AND SUCCEED MATCHING NULL
9132: {{EJC{{{{
9133: *
9134: * PATTERN ASSIGNMENT (REMOVE SAVED CURSOR)
9135: *
9136: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
9137: * ALGORITHMS FOR MATCHING THIS NODE TYPE.
9138: *
9139: * NO PARAMETERS (DUMMY PATTERN)
9140: *
9141: {P$PAB{ENT{{{{ENTRY POINT
9142: {{BRN{FAILP{{{JUST FAIL (ENTRY IS ALREADY POPPED)
9143: {{EJC{{{{
9144: *
9145: * PATTERN ASSIGNMENT (END OF MATCH, MAKE ASSIGN ENTRY)
9146: *
9147: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
9148: * ALGORITHMS FOR MATCHING THIS NODE TYPE.
9149: *
9150: * PARM1 NAME BASE OF VARIABLE
9151: * PARM2 NAME OFFSET OF VARIABLE
9152: *
9153: {P$PAC{ENT{BL$P2{{{P2BLK
9154: {{MOV{R7{-(SP){{STACK DUMMY CURSOR VALUE
9155: {{MOV{R9{-(SP){{STACK POINTER TO P$PAC NODE
9156: {{MOV{R7{-(SP){{STACK FINAL CURSOR
9157: {{MOV{#NDPAD{-(SP){{STACK PTR TO SPECIAL NDPAD NODE
9158: {{MNZ{PMDFL{{{SET DOT FLAG NON-ZERO
9159: {{BRN{SUCCP{{{AND SUCCEED
9160: {{EJC{{{{
9161: *
9162: * PATTERN ASSIGNMENT (REMOVE ASSIGN ENTRY)
9163: *
9164: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
9165: * ALGORITHMS FOR MATCHING THIS NODE TYPE.
9166: *
9167: * NO PARAMETERS (DUMMY NODE)
9168: *
9169: {P$PAD{ENT{{{{ENTRY POINT
9170: {{BRN{FLPOP{{{FAIL AND REMOVE P$PAC NODE
9171: {{EJC{{{{
9172: *
9173: * REM
9174: *
9175: * NO PARAMETERS
9176: *
9177: {P$REM{ENT{BL$P0{{{P0BLK
9178: {{MOV{PMSSL{R7{{POINT CURSOR TO END OF STRING
9179: {{BRN{SUCCP{{{AND SUCCEED
9180: {{EJC{{{{
9181: *
9182: * RPOS (EXPRESSION ARGUMENT)
9183: *
9184: * PARM1 EXPRESSION POINTER
9185: *
9186: {P$RPD{ENT{BL$P1{{{P1BLK
9187: {{JSR{EVALI{{{EVALUATE INTEGER ARGUMENT
9188: {{ERR{052{RPOS{{EVALUATED ARGUMENT IS NOT INTEGER
9189: {{ERR{053{RPOS{{EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
9190: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS
9191: {{PPM{PRPS1{{{MERGE WITH NORMAL CASE IF OK
9192: {{EJC{{{{
9193: *
9194: * RPOS (INTEGER ARGUMENT)
9195: *
9196: * PARM1 INTEGER ARGUMENT
9197: *
9198: {P$RPS{ENT{BL$P1{{{P1BLK
9199: *
9200: * EXPRESSION ARGUMENT CASE MERGES HERE
9201: *
9202: {PRPS1{MOV{PMSSL{R8{{GET LENGTH OF STRING
9203: {{SUB{R7{R8{{GET NUMBER OF CHARACTERS REMAINING
9204: {{BEQ{R8{4*PARM1(R9){SUCCP{SUCCEED IF AT RIGHT LOCATION
9205: {{BRN{FAILP{{{ELSE FAIL
9206: {{EJC{{{{
9207: *
9208: * RTAB (INTEGER ARGUMENT)
9209: *
9210: * PARM1 INTEGER ARGUMENT
9211: *
9212: {P$RTB{ENT{BL$P1{{{P1BLK
9213: *
9214: * EXPRESSION ARGUMENT CASE MERGES HERE
9215: *
9216: {PRTB1{MOV{R7{R8{{SAVE INITIAL CURSOR
9217: {{MOV{PMSSL{R7{{POINT TO END OF STRING
9218: {{BLT{R7{4*PARM1(R9){FAILP{FAIL IF STRING NOT LONG ENOUGH
9219: {{SUB{4*PARM1(R9){R7{{ELSE SET NEW CURSOR
9220: {{BGE{R7{R8{SUCCP{AND SUCCEED IF NOT TOO FAR ALREADY
9221: {{BRN{FAILP{{{IN WHICH CASE, FAIL
9222: {{EJC{{{{
9223: *
9224: * RTAB (EXPRESSION ARGUMENT)
9225: *
9226: * PARM1 EXPRESSION POINTER
9227: *
9228: {P$RTD{ENT{BL$P1{{{P1BLK
9229: {{JSR{EVALI{{{EVALUATE INTEGER ARGUMENT
9230: {{ERR{054{RTAB{{EVALUATED ARGUMENT IS NOT INTEGER
9231: {{ERR{055{RTAB{{EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
9232: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS
9233: {{PPM{PRTB1{{{MERGE WITH NORMAL CASE IF SUCCESS
9234: {{EJC{{{{
9235: *
9236: * SPAN (EXPRESSION ARGUMENT)
9237: *
9238: * PARM1 EXPRESSION POINTER
9239: *
9240: {P$SPD{ENT{BL$P1{{{P1BLK
9241: {{JSR{EVALS{{{EVALUATE STRING ARGUMENT
9242: {{ERR{056{SPAN{{EVALUATED ARGUMENT IS NOT STRING
9243: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS
9244: {{PPM{PSPN1{{{MERGE WITH MULTI-CHAR CASE IF OK
9245: {{EJC{{{{
9246: *
9247: * SPAN (MULTI-CHARACTER ARGUMENT CASE)
9248: *
9249: * PARM1 POINTER TO CTBLK
9250: * PARM2 BIT MASK TO SELECT BIT COLUMN
9251: *
9252: {P$SPN{ENT{BL$P2{{{P2BLK
9253: *
9254: * EXPRESSION ARGUMENT CASE MERGES HERE
9255: *
9256: {PSPN1{MOV{PMSSL{R8{{COPY SUBJECT STRING LENGTH
9257: {{SUB{R7{R8{{CALCULATE NUMBER OF CHARACTERS LEFT
9258: {{BZE{R8{FAILP{{FAIL IF NO CHARACTERS LEFT
9259: {{MOV{R$PMS{R10{{POINT TO SUBJECT STRING
9260: {{PLC{R10{R7{{POINT TO CURRENT CHARACTER
9261: {{MOV{R7{PSAVC{{SAVE INITIAL CURSOR
9262: {{MOV{R9{PSAVE{{SAVE NODE POINTER
9263: {{LCT{R8{R8{{SET COUNTER FOR CHARS LEFT
9264: *
9265: * LOOP TO SCAN MATCHING CHARACTERS
9266: *
9267: {PSPN2{LCH{R6{(R10)+{{LOAD NEXT CHARACTER, BUMP POINTER
9268: {{WTB{R6{{{CONVERT TO BYTE OFFSET
9269: {{MOV{4*PARM1(R9){R9{{POINT TO CTBLK
9270: {{ADD{R6{R9{{POINT TO CTBLK ENTRY
9271: {{MOV{4*CTCHS(R9){R6{{LOAD CTBLK ENTRY
9272: {{MOV{PSAVE{R9{{RESTORE NODE POINTER
9273: {{ANB{4*PARM2(R9){R6{{AND WITH SELECTED BIT
9274: {{ZRB{R6{PSPN3{{JUMP IF NO MATCH
9275: {{ICV{R7{{{ELSE PUSH CURSOR
9276: {{BCT{R8{PSPN2{{LOOP BACK UNLESS END OF STRING
9277: *
9278: * HERE AFTER SCANNING MATCHING CHARACTERS
9279: *
9280: {PSPN3{BNE{R7{PSAVC{SUCCP{SUCCEED IF CHARS MATCHED
9281: {{BRN{FAILP{{{ELSE FAIL IF NULL STRING MATCHED
9282: {{EJC{{{{
9283: *
9284: * SPAN (ONE CHARACTER ARGUMENT)
9285: *
9286: * PARM1 CHARACTER ARGUMENT
9287: *
9288: {P$SPS{ENT{BL$P1{{{P1BLK
9289: {{MOV{PMSSL{R8{{GET SUBJECT STRING LENGTH
9290: {{SUB{R7{R8{{CALCULATE NUMBER OF CHARACTERS LEFT
9291: {{BZE{R8{FAILP{{FAIL IF NO CHARACTERS LEFT
9292: {{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING
9293: {{PLC{R10{R7{{POINT TO CURRENT CHARACTER
9294: {{MOV{R7{PSAVC{{SAVE INITIAL CURSOR
9295: {{LCT{R8{R8{{SET COUNTER FOR CHARACTERS LEFT
9296: *
9297: * LOOP TO SCAN MATCHING CHARACTERS
9298: *
9299: {PSPS1{LCH{R6{(R10)+{{LOAD NEXT CHARACTER, BUMP POINTER
9300: {{BNE{R6{4*PARM1(R9){PSPS2{JUMP IF NO MATCH
9301: {{ICV{R7{{{ELSE PUSH CURSOR
9302: {{BCT{R8{PSPS1{{AND LOOP UNLESS END OF STRING
9303: *
9304: * HERE AFTER SCANNING MATCHING CHARACTERS
9305: *
9306: {PSPS2{BNE{R7{PSAVC{SUCCP{SUCCEED IF CHARS MATCHED
9307: {{BRN{FAILP{{{FAIL IF NULL STRING MATCHED
9308: {{EJC{{{{
9309: *
9310: * MULTI-CHARACTER STRING
9311: *
9312: * NOTE THAT ONE CHARACTER STRINGS USE THE CIRCUIT FOR
9313: * ONE CHARACTER ANY ARGUMENTS (P$AN1).
9314: *
9315: * PARM1 POINTER TO SCBLK FOR STRING ARG
9316: *
9317: {P$STR{ENT{BL$P1{{{P1BLK
9318: {{MOV{4*PARM1(R9){R10{{GET POINTER TO STRING
9319: *
9320: * MERGE HERE AFTER EVALUATING EXPRESSION WITH STRING VALUE
9321: *
9322: {PSTR1{MOV{R9{PSAVE{{SAVE NODE POINTER
9323: {{MOV{R$PMS{R9{{LOAD SUBJECT STRING POINTER
9324: {{PLC{R9{R7{{POINT TO CURRENT CHARACTER
9325: {{ADD{4*SCLEN(R10){R7{{COMPUTE NEW CURSOR POSITION
9326: {{BGT{R7{PMSSL{FAILP{FAIL IF PAST END OF STRING
9327: {{MOV{R7{PSAVC{{SAVE UPDATED CURSOR
9328: {{MOV{4*SCLEN(R10){R6{{GET NUMBER OF CHARS TO COMPARE
9329: {{PLC{R10{{{POINT TO CHARS OF TEST STRING
9330: {{CMC{FAILP{FAILP{{COMPARE, FAIL IF NOT EQUAL
9331: {{MOV{PSAVE{R9{{IF ALL MATCHED, RESTORE NODE PTR
9332: {{MOV{PSAVC{R7{{RESTORE UPDATED CURSOR
9333: {{BRN{SUCCP{{{AND SUCCEED
9334: {{EJC{{{{
9335: *
9336: * SUCCEED
9337: *
9338: * SEE SECTION ON COMPOUND PATTERNS FOR DETAILS OF THE
9339: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE
9340: *
9341: * NO PARAMETERS
9342: *
9343: {P$SUC{ENT{BL$P0{{{P0BLK
9344: {{MOV{R7{-(SP){{STACK CURSOR
9345: {{MOV{R9{-(SP){{STACK POINTER TO THIS NODE
9346: {{BRN{SUCCP{{{SUCCEED MATCHING NULL
9347: {{EJC{{{{
9348: *
9349: * TAB (INTEGER ARGUMENT)
9350: *
9351: * PARM1 INTEGER ARGUMENT
9352: *
9353: {P$TAB{ENT{BL$P1{{{P1BLK
9354: *
9355: * EXPRESSION ARGUMENT CASE MERGES HERE
9356: *
9357: {PTAB1{BGT{R7{4*PARM1(R9){FAILP{FAIL IF TOO FAR ALREADY
9358: {{MOV{4*PARM1(R9){R7{{ELSE SET NEW CURSOR POSITION
9359: {{BLE{R7{PMSSL{SUCCP{SUCCEED IF NOT OFF END
9360: {{BRN{FAILP{{{ELSE FAIL
9361: {{EJC{{{{
9362: *
9363: * TAB (EXPRESSION ARGUMENT)
9364: *
9365: * PARM1 EXPRESSION POINTER
9366: *
9367: {P$TBD{ENT{BL$P1{{{P1BLK
9368: {{JSR{EVALI{{{EVALUATE INTEGER ARGUMENT
9369: {{ERR{057{TAB{{EVALUATED ARGUMENT IS NOT INTEGER
9370: {{ERR{058{TAB{{EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
9371: {{PPM{FAILP{{{FAIL IF EVALUATION FAILS
9372: {{PPM{PTAB1{{{MERGE WITH NORMAL CASE IF OK
9373: {{EJC{{{{
9374: *
9375: * ANCHOR MOVEMENT
9376: *
9377: * NO PARAMETERS (DUMMY NODE)
9378: *
9379: {P$UNA{ENT{{{{ENTRY POINT
9380: {{MOV{R7{R9{{COPY INITIAL PATTERN NODE POINTER
9381: {{MOV{(SP){R7{{GET INITIAL CURSOR
9382: {{BEQ{R7{PMSSL{EXFAL{MATCH FAILS IF AT END OF STRING
9383: {{ICV{R7{{{ELSE INCREMENT CURSOR
9384: {{MOV{R7{(SP){{STORE INCREMENTED CURSOR
9385: {{MOV{R9{-(SP){{RESTACK INITIAL NODE PTR
9386: {{MOV{#NDUNA{-(SP){{RESTACK UNANCHORED NODE
9387: {{BRI{(R9){{{REMATCH FIRST NODE
9388: {{EJC{{{{
9389: *
9390: * END OF PATTERN MATCH ROUTINES
9391: *
9392: * THE FOLLOWING ENTRY POINT MARKS THE END OF THE PATTERN
9393: * MATCHING ROUTINES AND ALSO THE END OF THE ENTRY POINTS
9394: * REFERENCED FROM THE FIRST WORD OF BLOCKS IN DYNAMIC STORE
9395: *
9396: {P$YYY{ENT{BL$$I{{{MARK LAST ENTRY IN PATTERN SECTION
9397: {{TTL{S{{{P I T B O L -- PREDEFINED SNOBOL4 FUNCTIONS
9398: *
9399: * THE FOLLOWING SECTION CONTAINS CODING FOR FUNCTIONS
9400: * WHICH ARE PREDEFINED AND AVAILABLE AT THE SNOBOL LEVEL.
9401: *
9402: * THESE ROUTINES RECEIVE CONTROL DIRECTLY FROM THE CODE OR
9403: * INDIRECTLY THROUGH THE O$FNC, O$FNS OR CFUNC ROUTINES.
9404: * IN BOTH CASES THE CONDITIONS ON ENTRY ARE AS FOLLOWS
9405: *
9406: * THE ARGUMENTS ARE ON THE STACK. THE NUMBER OF ARGUMENTS
9407: * HAS BEEN ADJUSTED TO CORRESPOND TO THE SVBLK SVNAR FIELD.
9408: *
9409: * IN CERTAIN FUNCTIONS THE DIRECT CALL IS NOT PERMITTED
9410: * AND IN THESE INSTANCES WE ALSO HAVE.
9411: *
9412: * (WA) ACTUAL NUMBER OF ARGUMENTS IN CALL
9413: *
9414: * CONTROL RETURNS BY PLACING THE FUNCTION RESULT VALUE ON
9415: * ON THE STACK AND CONTINUING EXECUTION WITH THE NEXT
9416: * WORD FROM THE GENERATED CODE.
9417: *
9418: * THE NAMES OF THE ENTRY POINTS OF THESE FUNCTIONS ARE OF
9419: * THE FORM S$XXX WHERE XXX IS THE THREE LETTER CODE FOR
9420: * THE SYSTEM VARIABLE NAME. THE FUNCTIONS ARE IN ORDER
9421: * ALPHABETICALLY BY THEIR ENTRY NAMES.
9422: {{EJC{{{{
9423: *
9424: * ANY
9425: *
9426: {S$ANY{ENT{{{{ENTRY POINT
9427: {{MOV{#P$ANS{R7{{SET PCODE FOR SINGLE CHAR CASE
9428: {{MOV{#P$ANY{R10{{PCODE FOR MULTI-CHAR CASE
9429: {{MOV{#P$AYD{R8{{PCODE FOR EXPRESSION CASE
9430: {{JSR{PATST{{{CALL COMMON ROUTINE TO BUILD NODE
9431: {{ERR{059{ANY{{ARGUMENT IS NOT STRING OR EXPRESSION
9432: {{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD
9433: {{EJC{{{{
9434: *
9435: * APPEND
9436: *
9437: {S$APN{ENT{{{{ENTRY POINT
9438: {{MOV{(SP)+{R10{{GET APPEND ARGUMENT
9439: {{MOV{(SP)+{R9{{GET BCBLK
9440: {{BEQ{(R9){#B$BCT{SAPN1{OK IF FIRST ARG IS BCBLK
9441: {{ERB{275{APPEND{{FIRST ARGUMENT IS NOT BUFFER
9442: *
9443: * HERE TO DO THE APPEND
9444: *
9445: {SAPN1{JSR{APNDB{{{DO THE APPEND
9446: {{ERR{276{APPEND{{SECOND ARGUMENT IS NOT STRING
9447: {{PPM{EXFAL{{{NO ROOM - FAIL
9448: {{BRN{EXNUL{{{EXIT WITH NULL RESULT
9449: {{EJC{{{{
9450: *
9451: * APPLY
9452: *
9453: * APPLY DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT
9454: * WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED.
9455: *
9456: {S$APP{ENT{{{{ENTRY POINT
9457: {{BZE{R6{SAPP3{{JUMP IF NO ARGUMENTS
9458: {{DCV{R6{{{ELSE GET APPLIED FUNC ARG COUNT
9459: {{MOV{R6{R7{{COPY
9460: {{WTB{R7{{{CONVERT TO BYTES
9461: {{MOV{SP{R10{{COPY STACK POINTER
9462: {{ADD{R7{R10{{POINT TO FUNCTION ARGUMENT ON STACK
9463: {{MOV{(R10){R9{{LOAD FUNCTION PTR (APPLY 1ST ARG)
9464: {{BZE{R6{SAPP2{{JUMP IF NO ARGS FOR APPLIED FUNC
9465: {{LCT{R7{R6{{ELSE SET COUNTER FOR LOOP
9466: *
9467: * LOOP TO MOVE ARGUMENTS UP ON STACK
9468: *
9469: {SAPP1{DCA{R10{{{POINT TO NEXT ARGUMENT
9470: {{MOV{(R10){4*1(R10){{MOVE ARGUMENT UP
9471: {{BCT{R7{SAPP1{{LOOP TILL ALL MOVED
9472: *
9473: * MERGE HERE TO CALL FUNCTION (WA = NUMBER OF ARGUMENTS)
9474: *
9475: {SAPP2{ICA{SP{{{ADJUST STACK PTR FOR APPLY 1ST ARG
9476: {{JSR{GTNVR{{{GET VARIABLE BLOCK ADDR FOR FUNC
9477: {{PPM{SAPP3{{{JUMP IF NOT NATURAL VARIABLE
9478: {{MOV{4*VRFNC(R9){R10{{ELSE POINT TO FUNCTION BLOCK
9479: {{BRN{CFUNC{{{GO CALL APPLIED FUNCTION
9480: *
9481: * HERE FOR INVALID FIRST ARGUMENT
9482: *
9483: {SAPP3{ERB{060{APPLY{{FIRST ARG IS NOT NATURAL VARIABLE NAME
9484: {{EJC{{{{
9485: *
9486: * ARBNO
9487: *
9488: * ARBNO BUILDS A COMPOUND PATTERN. SEE DESCRIPTION AT
9489: * START OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED.
9490: *
9491: {S$ABN{ENT{{{{ENTRY POINT
9492: {{ZER{R9{{{SET PARM1 = 0 FOR THE MOMENT
9493: {{MOV{#P$ALT{R7{{SET PCODE FOR ALTERNATIVE NODE
9494: {{JSR{PBILD{{{BUILD ALTERNATIVE NODE
9495: {{MOV{R9{R10{{SAVE PTR TO ALTERNATIVE PATTERN
9496: {{MOV{#P$ABC{R7{{PCODE FOR P$ABC
9497: {{ZER{R9{{{P0BLK
9498: {{JSR{PBILD{{{BUILD P$ABC NODE
9499: {{MOV{R10{4*PTHEN(R9){{PUT ALTERNATIVE NODE AS SUCCESSOR
9500: {{MOV{R10{R6{{REMEMBER ALTERNATIVE NODE POINTER
9501: {{MOV{R9{R10{{COPY P$ABC NODE PTR
9502: {{MOV{(SP){R9{{LOAD ARBNO ARGUMENT
9503: {{MOV{R6{(SP){{STACK ALTERNATIVE NODE POINTER
9504: {{JSR{GTPAT{{{GET ARBNO ARGUMENT AS PATTERN
9505: {{ERR{061{ARBNO{{ARGUMENT IS NOT PATTERN
9506: {{JSR{PCONC{{{CONCAT ARG WITH P$ABC NODE
9507: {{MOV{R9{R10{{REMEMBER PTR TO CONCD PATTERNS
9508: {{MOV{#P$ABA{R7{{PCODE FOR P$ABA
9509: {{ZER{R9{{{P0BLK
9510: {{JSR{PBILD{{{BUILD P$ABA NODE
9511: {{MOV{R10{4*PTHEN(R9){{CONCATENATE NODES
9512: {{MOV{(SP){R10{{RECALL PTR TO ALTERNATIVE NODE
9513: {{MOV{R9{4*PARM1(R10){{POINT ALTERNATIVE BACK TO ARGUMENT
9514: {{BRN{EXITS{{{JUMP FOR NEXT CODE WORD
9515: {{EJC{{{{
9516: *
9517: * ARG
9518: *
9519: {S$ARG{ENT{{{{ENTRY POINT
9520: {{JSR{GTSMI{{{GET SECOND ARG AS SMALL INTEGER
9521: {{ERR{062{ARG{{SECOND ARGUMENT IS NOT INTEGER
9522: {{PPM{EXFAL{{{FAIL IF OUT OF RANGE OR NEGATIVE
9523: {{MOV{R9{R6{{SAVE ARGUMENT NUMBER
9524: {{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT
9525: {{JSR{GTNVR{{{LOCATE VRBLK
9526: {{PPM{SARG1{{{JUMP IF NOT NATURAL VARIABLE
9527: {{MOV{4*VRFNC(R9){R9{{ELSE LOAD FUNCTION BLOCK POINTER
9528: {{BNE{(R9){#B$PFC{SARG1{JUMP IF NOT PROGRAM DEFINED
9529: {{BZE{R6{EXFAL{{FAIL IF ARG NUMBER IS ZERO
9530: {{BGT{R6{4*FARGS(R9){EXFAL{FAIL IF ARG NUMBER IS TOO LARGE
9531: {{WTB{R6{{{ELSE CONVERT TO BYTE OFFSET
9532: {{ADD{R6{R9{{POINT TO ARGUMENT SELECTED
9533: {{MOV{4*PFAGB(R9){R9{{LOAD ARGUMENT VRBLK POINTER
9534: {{BRN{EXVNM{{{EXIT TO BUILD NMBLK
9535: *
9536: * HERE IF 1ST ARGUMENT IS BAD
9537: *
9538: {SARG1{ERB{063{ARG{{FIRST ARGUMENT IS NOT PROGRAM FUNCTION NAME
9539: {{EJC{{{{
9540: *
9541: * ARRAY
9542: *
9543: {S$ARR{ENT{{{{ENTRY POINT
9544: {{MOV{(SP)+{R10{{LOAD INITIAL ELEMENT VALUE
9545: {{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT
9546: {{JSR{GTINT{{{CONVERT FIRST ARG TO INTEGER
9547: {{PPM{SAR02{{{JUMP IF NOT INTEGER
9548: *
9549: * HERE FOR INTEGER FIRST ARGUMENT, BUILD VCBLK
9550: *
9551: {{LDI{4*ICVAL(R9){{{LOAD INTEGER VALUE
9552: {{ILE{SAR10{{{JUMP IF ZERO OR NEG (BAD DIMENSION)
9553: {{MFI{R6{SAR11{{ELSE CONVERT TO ONE WORD, TEST OVFL
9554: {{LCT{R7{R6{{COPY ELEMENTS FOR LOOP LATER ON
9555: {{ADD{#VCSI${R6{{ADD SPACE FOR STANDARD FIELDS
9556: {{WTB{R6{{{CONVERT LENGTH TO BYTES
9557: {{BGE{R6{MXLEN{SAR11{FAIL IF TOO LARGE
9558: {{JSR{ALLOC{{{ALLOCATE SPACE FOR VCBLK
9559: {{MOV{#B$VCT{(R9){{STORE TYPE WORD
9560: {{MOV{R6{4*VCLEN(R9){{SET LENGTH
9561: {{MOV{R10{R8{{COPY DEFAULT VALUE
9562: {{MOV{R9{R10{{COPY VCBLK POINTER
9563: {{ADD{#4*VCVLS{R10{{POINT TO FIRST ELEMENT VALUE
9564: *
9565: * LOOP TO SET VECTOR ELEMENTS TO DEFAULT VALUE
9566: *
9567: {SAR01{MOV{R8{(R10)+{{STORE ONE VALUE
9568: {{BCT{R7{SAR01{{LOOP TILL ALL STORED
9569: {{BRN{EXSID{{{EXIT SETTING IDVAL
9570: {{EJC{{{{
9571: *
9572: * ARRAY (CONTINUED)
9573: *
9574: * HERE IF FIRST ARGUMENT IS NOT AN INTEGER
9575: *
9576: {SAR02{MOV{R9{-(SP){{REPLACE ARGUMENT ON STACK
9577: {{JSR{XSCNI{{{INITIALIZE SCAN OF FIRST ARGUMENT
9578: {{ERR{064{ARRAY{{FIRST ARGUMENT IS NOT INTEGER OR STRING
9579: {{PPM{EXNUL{{{DUMMY (UNUSED) NULL STRING EXIT
9580: {{MOV{R$XSC{-(SP){{SAVE PROTOTYPE POINTER
9581: {{MOV{R10{-(SP){{SAVE DEFAULT VALUE
9582: {{ZER{ARCDM{{{ZERO COUNT OF DIMENSIONS
9583: {{ZER{ARPTR{{{ZERO OFFSET TO INDICATE PASS ONE
9584: {{LDI{INTV1{{{LOAD INTEGER ONE
9585: {{STI{ARNEL{{{INITIALIZE ELEMENT COUNT
9586: *
9587: * THE FOLLOWING CODE IS EXECUTED TWICE. THE FIRST TIME
9588: * (ARPTR EQ 0), IT IS USED TO COUNT THE NUMBER OF ELEMENTS
9589: * AND NUMBER OF DIMENSIONS. THE SECOND TIME (ARPTR GT 0) IS
9590: * USED TO ACTUALLY FILL IN THE DIM,LBD FIELDS OF THE ARBLK.
9591: *
9592: {SAR03{LDI{INTV1{{{LOAD ONE AS DEFAULT LOW BOUND
9593: {{STI{ARSVL{{{SAVE AS LOW BOUND
9594: {{MOV{#CH$CL{R8{{SET DELIMITER ONE = COLON
9595: {{MOV{#CH$CM{R10{{SET DELIMITER TWO = COMMA
9596: {{JSR{XSCAN{{{SCAN NEXT BOUND
9597: {{BNE{R6{#NUM01{SAR04{JUMP IF NOT COLON
9598: *
9599: * HERE WE HAVE A COLON ENDING A LOW BOUND
9600: *
9601: {{JSR{GTINT{{{CONVERT LOW BOUND
9602: {{ERR{065{ARRAY{{FIRST ARGUMENT LOWER BOUND IS NOT INTEGER
9603: {{LDI{4*ICVAL(R9){{{LOAD VALUE OF LOW BOUND
9604: {{STI{ARSVL{{{STORE LOW BOUND VALUE
9605: {{MOV{#CH$CM{R8{{SET DELIMITER ONE = COMMA
9606: {{MOV{R8{R10{{AND DELIMITER TWO = COMMA
9607: {{JSR{XSCAN{{{SCAN HIGH BOUND
9608: {{EJC{{{{
9609: *
9610: * ARRAY (CONTINUED)
9611: *
9612: * MERGE HERE TO PROCESS UPPER BOUND
9613: *
9614: {SAR04{JSR{GTINT{{{CONVERT HIGH BOUND TO INTEGER
9615: {{ERR{066{ARRAY{{FIRST ARGUMENT UPPER BOUND IS NOT INTEGER
9616: {{LDI{4*ICVAL(R9){{{GET HIGH BOUND
9617: {{SBI{ARSVL{{{SUBTRACT LOWER BOUND
9618: {{IOV{SAR10{{{BAD DIMENSION IF OVERFLOW
9619: {{ILT{SAR10{{{BAD DIMENSION IF NEGATIVE
9620: {{ADI{INTV1{{{ADD 1 TO GET DIMENSION
9621: {{IOV{SAR10{{{BAD DIMENSION IF OVERFLOW
9622: {{MOV{ARPTR{R10{{LOAD OFFSET (ALSO PASS INDICATOR)
9623: {{BZE{R10{SAR05{{JUMP IF FIRST PASS
9624: *
9625: * HERE IN SECOND PASS TO STORE LBD AND DIM IN ARBLK
9626: *
9627: {{ADD{(SP){R10{{POINT TO CURRENT LOCATION IN ARBLK
9628: {{STI{4*CFP$I(R10){{{STORE DIMENSION
9629: {{LDI{ARSVL{{{LOAD LOW BOUND
9630: {{STI{(R10){{{STORE LOW BOUND
9631: {{ADD{#4*ARDMS{ARPTR{{BUMP OFFSET TO NEXT BOUNDS
9632: {{BRN{SAR06{{{JUMP TO CHECK FOR END OF BOUNDS
9633: *
9634: * HERE IN PASS 1
9635: *
9636: {SAR05{ICV{ARCDM{{{BUMP DIMENSION COUNT
9637: {{MLI{ARNEL{{{MULTIPLY DIMENSION BY COUNT SO FAR
9638: {{IOV{SAR11{{{TOO LARGE IF OVERFLOW
9639: {{STI{ARNEL{{{ELSE STORE UPDATED ELEMENT COUNT
9640: *
9641: * MERGE HERE AFTER PROCESSING ONE SET OF BOUNDS
9642: *
9643: {SAR06{BNZ{R6{SAR03{{LOOP BACK UNLESS END OF BOUNDS
9644: {{BNZ{ARPTR{SAR09{{JUMP IF END OF PASS 2
9645: {{EJC{{{{
9646: *
9647: * ARRAY (CONTINUED)
9648: *
9649: * HERE AT END OF PASS ONE, BUILD ARBLK
9650: *
9651: {{LDI{ARNEL{{{GET NUMBER OF ELEMENTS
9652: {{MFI{R7{SAR11{{GET AS ADDR INTEGER, TEST OVFLO
9653: {{WTB{R7{{{ELSE CONVERT TO LENGTH IN BYTES
9654: {{MOV{#4*ARSI${R6{{SET SIZE OF STANDARD FIELDS
9655: {{LCT{R8{ARCDM{{SET DIMENSION COUNT TO CONTROL LOOP
9656: *
9657: * LOOP TO ALLOW SPACE FOR DIMENSIONS
9658: *
9659: {SAR07{ADD{#4*ARDMS{R6{{ALLOW SPACE FOR ONE SET OF BOUNDS
9660: {{BCT{R8{SAR07{{LOOP BACK TILL ALL ACCOUNTED FOR
9661: {{MOV{R6{R10{{SAVE SIZE (=AROFS)
9662: *
9663: * NOW ALLOCATE SPACE FOR ARBLK
9664: *
9665: {{ADD{R7{R6{{ADD SPACE FOR ELEMENTS
9666: {{ICA{R6{{{ALLOW FOR ARPRO PROTOTYPE FIELD
9667: {{BGE{R6{MXLEN{SAR11{FAIL IF TOO LARGE
9668: {{JSR{ALLOC{{{ELSE ALLOCATE ARBLK
9669: {{MOV{(SP){R7{{LOAD DEFAULT VALUE
9670: {{MOV{R9{(SP){{SAVE ARBLK POINTER
9671: {{MOV{R6{R8{{SAVE LENGTH IN BYTES
9672: {{BTW{R6{{{CONVERT LENGTH BACK TO WORDS
9673: {{LCT{R6{R6{{SET COUNTER TO CONTROL LOOP
9674: *
9675: * LOOP TO CLEAR ENTIRE ARBLK TO DEFAULT VALUE
9676: *
9677: {SAR08{MOV{R7{(R9)+{{SET ONE WORD
9678: {{BCT{R6{SAR08{{LOOP TILL ALL SET
9679: {{EJC{{{{
9680: *
9681: * ARRAY (CONTINUED)
9682: *
9683: * NOW SET INITIAL FIELDS OF ARBLK
9684: *
9685: {{MOV{(SP)+{R9{{RELOAD ARBLK POINTER
9686: {{MOV{(SP){R7{{LOAD PROTOTYPE
9687: {{MOV{#B$ART{(R9){{SET TYPE WORD
9688: {{MOV{R8{4*ARLEN(R9){{STORE LENGTH IN BYTES
9689: {{ZER{4*IDVAL(R9){{{ZERO ID TILL WE GET IT BUILT
9690: {{MOV{R10{4*AROFS(R9){{SET PROTOTYPE FIELD PTR
9691: {{MOV{ARCDM{4*ARNDM(R9){{SET NUMBER OF DIMENSIONS
9692: {{MOV{R9{R8{{SAVE ARBLK POINTER
9693: {{ADD{R10{R9{{POINT TO PROTOTYPE FIELD
9694: {{MOV{R7{(R9){{STORE PROTOTYPE PTR IN ARBLK
9695: {{MOV{#4*ARLBD{ARPTR{{SET OFFSET FOR PASS 2 BOUNDS SCAN
9696: {{MOV{R7{R$XSC{{RESET STRING POINTER FOR XSCAN
9697: {{MOV{R8{(SP){{STORE ARBLK POINTER ON STACK
9698: {{ZER{XSOFS{{{RESET OFFSET PTR TO START OF STRING
9699: {{BRN{SAR03{{{JUMP BACK TO RESCAN BOUNDS
9700: *
9701: * HERE AFTER FILLING IN BOUNDS INFORMATION (END PASS TWO)
9702: *
9703: {SAR09{MOV{(SP)+{R9{{RELOAD POINTER TO ARBLK
9704: {{BRN{EXSID{{{EXIT SETTING IDVAL
9705: *
9706: * HERE FOR BAD DIMENSION
9707: *
9708: {SAR10{ERB{067{ARRAY{{DIMENSION IS ZERO,NEGATIVE OR OUT OF RANGE
9709: *
9710: * HERE IF ARRAY IS TOO LARGE
9711: *
9712: {SAR11{ERB{068{ARRAY{{SIZE EXCEEDS MAXIMUM PERMITTED
9713: {{EJC{{{{
9714: *
9715: * BUFFER
9716: *
9717: {S$BUF{ENT{{{{ENTRY POINT
9718: {{MOV{(SP)+{R10{{GET INITIAL VALUE
9719: {{MOV{(SP)+{R9{{GET REQUESTED ALLOCATION
9720: {{JSR{GTINT{{{CONVERT TO INTEGER
9721: {{ERR{269{BUFFER{{FIRST ARGUMENT IS NOT INTEGER
9722: {{LDI{4*ICVAL(R9){{{GET VALUE
9723: {{ILE{SBF01{{{BRANCH IF NEGATIVE OR ZERO
9724: {{MFI{R6{SBF02{{MOVE WITH OVERFLOW CHECK
9725: {{JSR{ALOBF{{{ALLOCATE THE BUFFER
9726: {{JSR{APNDB{{{COPY IT IN
9727: {{ERR{270{BUFFER{{SECOND ARGUMENT IS NOT STRING OR BUFFER
9728: {{ERR{271{BUFFER{{INITIAL VALUE TOO BIG FOR ALLOCATION
9729: {{BRN{EXSID{{{EXIT SETTING IDVAL
9730: *
9731: * HERE FOR INVALID ALLOCATION SIZE
9732: *
9733: {SBF01{ERB{272{BUFFER{{FIRST ARGUMENT IS NOT POSITIVE
9734: *
9735: * HERE FOR ALLOCATION SIZE INTEGER OVERFLOW
9736: *
9737: {SBF02{ERB{273{BUFFER{{SIZE IS TOO BIG
9738: {{EJC{{{{
9739: *
9740: * BREAK
9741: *
9742: {S$BRK{ENT{{{{ENTRY POINT
9743: {{MOV{#P$BKS{R7{{SET PCODE FOR SINGLE CHAR CASE
9744: {{MOV{#P$BRK{R10{{PCODE FOR MULTI-CHAR CASE
9745: {{MOV{#P$BKD{R8{{PCODE FOR EXPRESSION CASE
9746: {{JSR{PATST{{{CALL COMMON ROUTINE TO BUILD NODE
9747: {{ERR{069{BREAK{{ARGUMENT IS NOT STRING OR EXPRESSION
9748: {{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD
9749: {{EJC{{{{
9750: *
9751: * BREAKX
9752: *
9753: * BREAKX IS A COMPOUND PATTERN. SEE DESCRIPTION AT START
9754: * OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED.
9755: *
9756: {S$BKX{ENT{{{{ENTRY POINT
9757: {{MOV{#P$BKS{R7{{PCODE FOR SINGLE CHAR ARGUMENT
9758: {{MOV{#P$BRK{R10{{PCODE FOR MULTI-CHAR ARGUMENT
9759: {{MOV{#P$BXD{R8{{PCODE FOR EXPRESSION CASE
9760: {{JSR{PATST{{{CALL COMMON ROUTINE TO BUILD NODE
9761: {{ERR{070{BREAKX{{ARGUMENT IS NOT STRING OR EXPRESSION
9762: *
9763: * NOW HOOK BREAKX NODE ON AT FRONT END
9764: *
9765: {{MOV{R9{-(SP){{SAVE PTR TO BREAK NODE
9766: {{MOV{#P$BKX{R7{{SET PCODE FOR BREAKX NODE
9767: {{JSR{PBILD{{{BUILD IT
9768: {{MOV{(SP){4*PTHEN(R9){{SET BREAK NODE AS SUCCESSOR
9769: {{MOV{#P$ALT{R7{{SET PCODE FOR ALTERNATION NODE
9770: {{JSR{PBILD{{{BUILD (PARM1=ALT=BREAKX NODE)
9771: {{MOV{R9{R6{{SAVE PTR TO ALTERNATION NODE
9772: {{MOV{(SP){R9{{POINT TO BREAK NODE
9773: {{MOV{R6{4*PTHEN(R9){{SET ALTERNATE NODE AS SUCCESSOR
9774: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK
9775: {{EJC{{{{
9776: *
9777: * CHAR
9778: *
9779: {S$CHR{ENT{{{{ENTRY POINT
9780: {{JSR{GTSMI{{{CONVERT ARG TO INTEGER
9781: {{ERR{281{CHAR{{ARGUMENT NOT INTEGER
9782: {{PPM{SCHR1{{{TOO BIG ERROR EXIT
9783: {{BGE{R8{#CFP$A{SCHR1{SEE IF OUT OF RANGE OF HOST SET
9784: {{MOV{#NUM01{R6{{IF NOT SET SCBLK ALLOCATION
9785: {{MOV{R8{R7{{SAVE CHAR CODE
9786: {{JSR{ALOCS{{{ALLOCATE 1 BAU SCBLK
9787: {{MOV{R9{R10{{COPY SCBLK POINTER
9788: {{PSC{R10{{{GET SET TO STUFF CHAR
9789: {{SCH{R7{(R10)+{{STUFF IT
9790: {{ZER{R10{{{CLEAR SLOP IN XL
9791: {{BRN{EXIXR{{{EXIT WITH SCBLK POINTER
9792: *
9793: * HERE IF CHAR ARGUMENT IS OUT OF RANGE
9794: *
9795: {SCHR1{ERB{282{CHAR{{ARGUMENT NOT IN RANGE
9796: {{EJC{{{{
9797: *
9798: * CLEAR
9799: *
9800: {S$CLR{ENT{{{{ENTRY POINT
9801: {{JSR{XSCNI{{{INITIALIZE TO SCAN ARGUMENT
9802: {{ERR{071{CLEAR{{ARGUMENT IS NOT STRING
9803: {{PPM{SCLR2{{{JUMP IF NULL
9804: *
9805: * LOOP TO SCAN OUT NAMES IN FIRST ARGUMENT. VARIABLES IN
9806: * THE LIST ARE FALGGED BY SETTING VRGET OF VRBLK TO ZERO.
9807: *
9808: {SCLR1{MOV{#CH$CM{R8{{SET DELIMITER ONE = COMMA
9809: {{MOV{R8{R10{{DELIMITER TWO = COMMA
9810: {{JSR{XSCAN{{{SCAN NEXT VARIABLE NAME
9811: {{JSR{GTNVR{{{LOCATE VRBLK
9812: {{ERR{072{CLEAR{{ARGUMENT HAS NULL VARIABLE NAME
9813: {{ZER{4*VRGET(R9){{{ELSE FLAG BY ZEROING VRGET FIELD
9814: {{BNZ{R6{SCLR1{{LOOP BACK IF STOPPED BY COMMA
9815: *
9816: * HERE AFTER FLAGGING VARIABLES IN ARGUMENT LIST
9817: *
9818: {SCLR2{MOV{HSHTB{R7{{POINT TO START OF HASH TABLE
9819: *
9820: * LOOP THROUGH SLOTS IN HASH TABLE
9821: *
9822: {SCLR3{BEQ{R7{HSHTE{EXNUL{EXIT RETURNING NULL IF NONE LEFT
9823: {{MOV{R7{R9{{ELSE COPY SLOT POINTER
9824: {{ICA{R7{{{BUMP SLOT POINTER
9825: {{SUB{#4*VRNXT{R9{{SET OFFSET TO MERGE INTO LOOP
9826: *
9827: * LOOP THROUGH VRBLKS ON ONE HASH CHAIN
9828: *
9829: {SCLR4{MOV{4*VRNXT(R9){R9{{POINT TO NEXT VRBLK ON CHAIN
9830: {{BZE{R9{SCLR3{{JUMP FOR NEXT BUCKET IF CHAIN END
9831: {{BNZ{4*VRGET(R9){SCLR5{{JUMP IF NOT FLAGGED
9832: {{EJC{{{{
9833: *
9834: * CLEAR (CONTINUED)
9835: *
9836: * HERE FOR FLAGGED VARIABLE, DO NOT SET VALUE TO NULL
9837: *
9838: {{JSR{SETVR{{{FOR FLAGGED VAR, RESTORE VRGET
9839: {{BRN{SCLR4{{{AND LOOP BACK FOR NEXT VRBLK
9840: *
9841: * HERE TO SET VALUE OF A VARIABLE TO NULL
9842: * PRROTECTED VARIABLES (ARB, ETC) ARE EXEMPT
9843: *
9844: {SCLR5{BEQ{4*VRSTO(R9){#B$VRE{SCLR4{CHECK FOR PROTECTED VARIABLE (REG05)
9845: {{MOV{R9{R10{{COPY VRBLK POINTER (REG05)
9846: *
9847: * LOOP TO LOCATE VALUE AT END OF POSSIBLE TRBLK CHAIN
9848: *
9849: {SCLR6{MOV{R10{R6{{SAVE BLOCK POINTER
9850: {{MOV{4*VRVAL(R10){R10{{LOAD NEXT VALUE FIELD
9851: {{BEQ{(R10){#B$TRT{SCLR6{LOOP BACK IF TRAPPED
9852: *
9853: * NOW STORE THE NULL VALUE
9854: *
9855: {{MOV{R6{R10{{RESTORE BLOCK POINTER
9856: {{MOV{#NULLS{4*VRVAL(R10){{STORE NULL CONSTANT VALUE
9857: {{BRN{SCLR4{{{LOOP BACK FOR NEXT VRBLK
9858: {{EJC{{{{
9859: *
9860: * CODE
9861: *
9862: {S$COD{ENT{{{{ENTRY POINT
9863: {{MOV{(SP)+{R9{{LOAD ARGUMENT
9864: {{JSR{GTCOD{{{CONVERT TO CODE
9865: {{PPM{EXFAL{{{FAIL IF CONVERSION IS IMPOSSIBLE
9866: {{BRN{EXIXR{{{ELSE RETURN CODE AS RESULT
9867: {{EJC{{{{
9868: *
9869: * COLLECT
9870: *
9871: {S$COL{ENT{{{{ENTRY POINT
9872: {{MOV{(SP)+{R9{{LOAD ARGUMENT
9873: {{JSR{GTINT{{{CONVERT TO INTEGER
9874: {{ERR{073{COLLECT{{ARGUMENT IS NOT INTEGER
9875: {{LDI{4*ICVAL(R9){{{LOAD COLLECT ARGUMENT
9876: {{STI{CLSVI{{{SAVE COLLECT ARGUMENT
9877: {{ZER{R7{{{SET NO MOVE UP
9878: {{JSR{GBCOL{{{PERFORM GARBAGE COLLECTION
9879: {{MOV{DNAME{R6{{POINT TO END OF MEMORY
9880: {{SUB{DNAMP{R6{{SUBTRACT NEXT LOCATION
9881: {{BTW{R6{{{CONVERT BYTES TO WORDS
9882: {{MTI{R6{{{CONVERT WORDS AVAILABLE AS INTEGER
9883: {{SBI{CLSVI{{{SUBTRACT ARGUMENT
9884: {{IOV{EXFAL{{{FAIL IF OVERFLOW
9885: {{ILT{EXFAL{{{FAIL IF NOT ENOUGH
9886: {{ADI{CLSVI{{{ELSE RECOMPUTE AVAILABLE
9887: {{BRN{EXINT{{{AND EXIT WITH INTEGER RESULT
9888: {{EJC{{{{
9889: *
9890: * CONVERT
9891: *
9892: {S$CNV{ENT{{{{ENTRY POINT
9893: {{JSR{GTSTG{{{CONVERT SECOND ARGUMENT TO STRING
9894: {{ERR{074{CONVERT{{SECOND ARGUMENT IS NOT STRING
9895: {{JSR{FLSTG{{{FOLD LOWER CASE TO UPPER CASE
9896: {{MOV{(SP){R10{{LOAD FIRST ARGUMENT
9897: {{BNE{(R10){#B$PDT{SCV01{JUMP IF NOT PROGRAM DEFINED
9898: *
9899: * HERE FOR PROGRAM DEFINED DATATYPE
9900: *
9901: {{MOV{4*PDDFP(R10){R10{{POINT TO DFBLK
9902: {{MOV{4*DFNAM(R10){R10{{LOAD DATATYPE NAME
9903: {{JSR{IDENT{{{COMPARE WITH SECOND ARG
9904: {{PPM{EXITS{{{EXIT IF IDENT WITH ARG AS RESULT
9905: {{BRN{EXFAL{{{ELSE FAIL
9906: *
9907: * HERE IF NOT PROGRAM DEFINED DATATYPE
9908: *
9909: {SCV01{MOV{R9{-(SP){{SAVE STRING ARGUMENT
9910: {{MOV{#SVCTB{R10{{POINT TO TABLE OF NAMES TO COMPARE
9911: {{ZER{R7{{{INITIALIZE COUNTER
9912: {{MOV{R6{R8{{SAVE LENGTH OF ARGUMENT STRING
9913: *
9914: * LOOP THROUGH TABLE ENTRIES
9915: *
9916: {SCV02{MOV{(R10)+{R9{{LOAD NEXT TABLE ENTRY, BUMP POINTER
9917: {{BZE{R9{EXFAL{{FAIL IF ZERO MARKING END OF LIST
9918: {{BNE{R8{4*SCLEN(R9){SCV05{JUMP IF WRONG LENGTH
9919: {{MOV{R10{CNVTP{{ELSE STORE TABLE POINTER
9920: {{PLC{R9{{{POINT TO CHARS OF TABLE ENTRY
9921: {{MOV{(SP){R10{{LOAD POINTER TO STRING ARGUMENT
9922: {{PLC{R10{{{POINT TO CHARS OF STRING ARG
9923: {{MOV{R8{R6{{SET NUMBER OF CHARS TO COMPARE
9924: {{CMC{SCV04{SCV04{{COMPARE, JUMP IF NO MATCH
9925: {{EJC{{{{
9926: *
9927: * CONVERT (CONTINUED)
9928: *
9929: * HERE WE HAVE A MATCH
9930: *
9931: {SCV03{MOV{R7{R10{{COPY ENTRY NUMBER
9932: {{ICA{SP{{{POP STRING ARG OFF STACK
9933: {{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT
9934: {{BSW{R10{CNVTT{{JUMP TO APPROPRIATE ROUTINE
9935: {{IFF{0{SCV06{{STRING
9936: {{IFF{1{SCV07{{INTEGER
9937: {{IFF{2{SCV09{{NAME
9938: {{IFF{3{SCV10{{PATTERN
9939: {{IFF{4{SCV11{{ARRAY
9940: {{IFF{5{SCV19{{TABLE
9941: {{IFF{6{SCV25{{EXPRESSION
9942: {{IFF{7{SCV26{{CODE
9943: {{IFF{8{SCV27{{NUMERIC
9944: {{IFF{CNVRT{SCV08{{REAL
9945: {{IFF{CNVBT{SCV28{{BUFFER
9946: {{ESW{{{{END OF SWITCH TABLE
9947: *
9948: * HERE IF NO MATCH WITH TABLE ENTRY
9949: *
9950: {SCV04{MOV{CNVTP{R10{{RESTORE TABLE POINTER, MERGE
9951: *
9952: * MERGE HERE IF LENGTHS DID NOT MATCH
9953: *
9954: {SCV05{ICV{R7{{{BUMP ENTRY NUMBER
9955: {{BRN{SCV02{{{LOOP BACK TO CHECK NEXT ENTRY
9956: *
9957: * HERE TO CONVERT TO STRING
9958: *
9959: {SCV06{MOV{R9{-(SP){{REPLACE STRING ARGUMENT ON STACK
9960: {{JSR{GTSTG{{{CONVERT TO STRING
9961: {{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE
9962: {{BRN{EXIXR{{{ELSE RETURN STRING
9963: {{EJC{{{{
9964: *
9965: * CONVERT (CONTINUED)
9966: *
9967: * HERE TO CONVERT TO INTEGER
9968: *
9969: {SCV07{JSR{GTINT{{{CONVERT TO INTEGER
9970: {{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE
9971: {{BRN{EXIXR{{{ELSE RETURN INTEGER
9972: *
9973: * HERE TO CONVERT TO REAL
9974: *
9975: {SCV08{JSR{GTREA{{{CONVERT TO REAL
9976: {{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE
9977: {{BRN{EXIXR{{{ELSE RETURN REAL
9978: *
9979: * HERE TO CONVERT TO NAME
9980: *
9981: {SCV09{BEQ{(R9){#B$NML{EXIXR{RETURN IF ALREADY A NAME
9982: {{JSR{GTNVR{{{ELSE TRY STRING TO NAME CONVERT
9983: {{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE
9984: {{BRN{EXVNM{{{ELSE EXIT BUILDING NMBLK FOR VRBLK
9985: *
9986: * HERE TO CONVERT TO PATTERN
9987: *
9988: {SCV10{JSR{GTPAT{{{CONVERT TO PATTERN
9989: {{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE
9990: {{BRN{EXIXR{{{ELSE RETURN PATTERN
9991: *
9992: * CONVERT TO ARRAY
9993: *
9994: {SCV11{JSR{GTARR{{{GET AN ARRAY
9995: {{PPM{EXFAL{{{FAIL IF NOT CONVERTIBLE
9996: {{BRN{EXSID{{{EXIT SETTING ID FIELD
9997: *
9998: * CONVERT TO TABLE
9999: *
10000: {SCV19{MOV{(R9){R6{{LOAD FIRST WORD OF BLOCK
10001: {{MOV{R9{-(SP){{REPLACE ARBLK POINTER ON STACK
10002: {{BEQ{R6{#B$TBT{EXITS{RETURN ARG IF ALREADY A TABLE
10003: {{BNE{R6{#B$ART{EXFAL{ELSE FAIL IF NOT AN ARRAY
10004: {{EJC{{{{
10005: *
10006: * CONVERT (CONTINUED)
10007: *
10008: * HERE TO CONVERT AN ARRAY TO TABLE
10009: *
10010: {{BNE{4*ARNDM(R9){#NUM02{EXFAL{FAIL IF NOT 2-DIM ARRAY
10011: {{LDI{4*ARDM2(R9){{{LOAD DIM 2
10012: {{SBI{INTV2{{{SUBTRACT 2 TO COMPARE
10013: {{INE{EXFAL{{{FAIL IF DIM2 NOT 2
10014: *
10015: * HERE WE HAVE AN ARBLK OF THE RIGHT SHAPE
10016: *
10017: {{LDI{4*ARDIM(R9){{{LOAD DIM 1 (NUMBER OF ELEMENTS)
10018: {{MFI{R6{{{GET AS ONE WORD INTEGER
10019: {{LCT{R7{R6{{COPY TO CONTROL LOOP
10020: {{ADD{#TBSI${R6{{ADD SPACE FOR STANDARD FIELDS
10021: {{WTB{R6{{{CONVERT LENGTH TO BYTES
10022: {{JSR{ALLOC{{{ALLOCATE SPACE FOR TBBLK
10023: {{MOV{R9{R8{{COPY TBBLK POINTER
10024: {{MOV{R9{-(SP){{SAVE TBBLK POINTER
10025: {{MOV{#B$TBT{(R9)+{{STORE TYPE WORD
10026: {{ZER{(R9)+{{{STORE ZERO FOR IDVAL FOR NOW
10027: {{MOV{R6{(R9)+{{STORE LENGTH
10028: {{MOV{#NULLS{(R9)+{{NULL INITIAL LOOKUP VALUE
10029: *
10030: * LOOP TO INITIALIZE BUCKET PTRS TO POINT TO TABLE
10031: *
10032: {SCV20{MOV{R8{(R9)+{{SET BUCKET PTR TO POINT TO TBBLK
10033: {{BCT{R7{SCV20{{LOOP TILL ALL INITIALIZED
10034: {{MOV{#4*ARVL2{R7{{SET OFFSET TO FIRST ARBLK ELEMENT
10035: *
10036: * LOOP TO COPY ELEMENTS FROM ARRAY TO TABLE
10037: *
10038: {SCV21{MOV{4*1(SP){R10{{POINT TO ARBLK
10039: {{BEQ{R7{4*ARLEN(R10){SCV24{JUMP IF ALL MOVED
10040: {{ADD{R7{R10{{ELSE POINT TO CURRENT LOCATION
10041: {{ADD{#4*NUM02{R7{{BUMP OFFSET
10042: {{MOV{(R10){R9{{LOAD SUBSCRIPT NAME
10043: {{DCA{R10{{{ADJUST PTR TO MERGE (TRVAL=1+1)
10044: {{EJC{{{{
10045: *
10046: * CONVERT (CONTINUED)
10047: *
10048: * LOOP TO CHASE DOWN TRBLK CHAIN FOR VALUE
10049: *
10050: {SCV22{MOV{4*TRVAL(R10){R10{{POINT TO NEXT VALUE
10051: {{BEQ{(R10){#B$TRT{SCV22{LOOP BACK IF TRAPPED
10052: *
10053: * HERE WITH NAME IN XR, VALUE IN XL
10054: *
10055: {SCV23{MOV{R10{-(SP){{STACK VALUE
10056: {{MOV{4*1(SP){R10{{LOAD TBBLK POINTER
10057: {{JSR{TFIND{{{BUILD TEBLK (NOTE WB GT 0 BY NAME)
10058: {{PPM{EXFAL{{{FAIL IF ACESS FAILS
10059: {{MOV{(SP)+{4*TEVAL(R10){{STORE VALUE IN TEBLK
10060: {{BRN{SCV21{{{LOOP BACK FOR NEXT ELEMENT
10061: *
10062: * HERE AFTER MOVING ALL ELEMENTS TO TBBLK
10063: *
10064: {SCV24{MOV{(SP)+{R9{{LOAD TBBLK POINTER
10065: {{ICA{SP{{{POP ARBLK POINTER
10066: {{BRN{EXSID{{{EXIT SETTING IDVAL
10067: *
10068: * CONVERT TO EXPRESSION
10069: *
10070: {SCV25{JSR{GTEXP{{{CONVERT TO EXPRESSION
10071: {{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE
10072: {{BRN{EXIXR{{{ELSE RETURN EXPRESSION
10073: *
10074: * CONVERT TO CODE
10075: *
10076: {SCV26{JSR{GTCOD{{{CONVERT TO CODE
10077: {{PPM{EXFAL{{{FAIL IF CONVERSION IS NOT POSSIBLE
10078: {{BRN{EXIXR{{{ELSE RETURN CODE
10079: *
10080: * CONVERT TO NUMERIC
10081: *
10082: {SCV27{JSR{GTNUM{{{CONVERT TO NUMERIC
10083: {{PPM{EXFAL{{{FAIL IF UNCONVERTIBLE
10084: {{BRN{EXIXR{{{RETURN NUMBER
10085: {{EJC{{{{
10086: *
10087: * CONVERT TO BUFFER
10088: *
10089: {SCV28{MOV{R9{-(SP){{STACK STRING FOR PROCEDURE
10090: {{JSR{GTSTG{{{CONVERT TO STRING
10091: {{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE
10092: {{MOV{R9{R10{{SAVE STRING POINTER
10093: {{JSR{ALOBF{{{ALLOCATE BUFFER OF SAME SIZE
10094: {{JSR{APNDB{{{COPY IN THE STRING
10095: {{PPM{{{{ALREADY STRING - CANT FAIL TO CNV
10096: {{PPM{{{{MUST BE ENOUGH ROOM
10097: {{BRN{EXSID{{{EXIT SETTING IDVAL FIELD
10098: {{EJC{{{{
10099: *
10100: * COPY
10101: *
10102: {S$COP{ENT{{{{ENTRY POINT
10103: {{JSR{COPYB{{{COPY THE BLOCK
10104: {{PPM{EXITS{{{RETURN IF NO IDVAL FIELD
10105: {{BRN{EXSID{{{EXIT SETTING ID VALUE
10106: {{EJC{{{{
10107: *
10108: * DATA
10109: *
10110: {S$DAT{ENT{{{{ENTRY POINT
10111: {{JSR{XSCNI{{{PREPARE TO SCAN ARGUMENT
10112: {{ERR{075{DATA{{ARGUMENT IS NOT STRING
10113: {{ERR{076{DATA{{ARGUMENT IS NULL
10114: *
10115: * SCAN OUT DATATYPE NAME
10116: *
10117: {{MOV{#CH$PP{R8{{DELIMITER ONE = LEFT PAREN
10118: {{MOV{R8{R10{{DELIMITER TWO = LEFT PAREN
10119: {{JSR{XSCAN{{{SCAN DATATYPE NAME
10120: {{BNZ{R6{SDAT1{{SKIP IF LEFT PAREN FOUND
10121: {{ERB{077{DATA{{ARGUMENT IS MISSING A LEFT PAREN
10122: *
10123: * HERE AFTER SCANNING DATATYPE NAME
10124: *
10125: {SDAT1{MOV{4*SCLEN(R9){R6{{GET LENGTH
10126: {{JSR{FLSTG{{{FOLD LOWER CASE TO UPPER CASE
10127: {{MOV{R9{R10{{SAVE NAME PTR
10128: {{MOV{4*SCLEN(R9){R6{{GET LENGTH
10129: {{CTB{R6{SCSI${{COMPUTE SPACE NEEDED
10130: {{JSR{ALOST{{{REQUEST STATIC STORE FOR NAME
10131: {{MOV{R9{-(SP){{SAVE DATATYPE NAME
10132: {{MVW{{{{COPY NAME TO STATIC
10133: {{MOV{(SP){R9{{GET NAME PTR
10134: {{ZER{R10{{{SCRUB DUD REGISTER
10135: {{JSR{GTNVR{{{LOCATE VRBLK FOR DATATYPE NAME
10136: {{ERR{078{DATA{{ARGUMENT HAS NULL DATATYPE NAME
10137: {{MOV{R9{DATDV{{SAVE VRBLK POINTER FOR DATATYPE
10138: {{MOV{SP{DATXS{{STORE STARTING STACK VALUE
10139: {{ZER{R7{{{ZERO COUNT OF FIELD NAMES
10140: *
10141: * LOOP TO SCAN FIELD NAMES AND STACK VRBLK POINTERS
10142: *
10143: {SDAT2{MOV{#CH$RP{R8{{DELIMITER ONE = RIGHT PAREN
10144: {{MOV{#CH$CM{R10{{DELIMITER TWO = COMMA
10145: {{JSR{XSCAN{{{SCAN NEXT FIELD NAME
10146: {{BNZ{R6{SDAT3{{JUMP IF DELIMITER FOUND
10147: {{ERB{079{DATA{{ARGUMENT IS MISSING A RIGHT PAREN
10148: *
10149: * HERE AFTER SCANNING OUT ONE FIELD NAME
10150: *
10151: {SDAT3{JSR{GTNVR{{{LOCATE VRBLK FOR FIELD NAME
10152: {{ERR{080{DATA{{ARGUMENT HAS NULL FIELD NAME
10153: {{MOV{R9{-(SP){{STACK VRBLK POINTER
10154: {{ICV{R7{{{INCREMENT COUNTER
10155: {{BEQ{R6{#NUM02{SDAT2{LOOP BACK IF STOPPED BY COMMA
10156: {{EJC{{{{
10157: *
10158: * DATA (CONTINUED)
10159: *
10160: * NOW BUILD THE DFBLK
10161: *
10162: {{MOV{#DFSI${R6{{SET SIZE OF DFBLK STANDARD FIELDS
10163: {{ADD{R7{R6{{ADD NUMBER OF FIELDS
10164: {{WTB{R6{{{CONVERT LENGTH TO BYTES
10165: {{MOV{R7{R8{{PRESERVE NO. OF FIELDS
10166: {{JSR{ALOST{{{ALLOCATE SPACE FOR DFBLK
10167: {{MOV{R8{R7{{GET NO OF FIELDS
10168: {{MOV{DATXS{R10{{POINT TO START OF STACK
10169: {{MOV{(R10){R8{{LOAD DATATYPE NAME
10170: {{MOV{R9{(R10){{SAVE DFBLK POINTER ON STACK
10171: {{MOV{#B$DFC{(R9)+{{STORE TYPE WORD
10172: {{MOV{R7{(R9)+{{STORE NUMBER OF FIELDS (FARGS)
10173: {{MOV{R6{(R9)+{{STORE LENGTH (DFLEN)
10174: {{SUB{#4*PDDFS{R6{{COMPUTE PDBLK LENGTH (FOR DFPDL)
10175: {{MOV{R6{(R9)+{{STORE PDBLK LENGTH (DFPDL)
10176: {{MOV{R8{(R9)+{{STORE DATATYPE NAME (DFNAM)
10177: {{LCT{R8{R7{{COPY NUMBER OF FIELDS
10178: *
10179: * LOOP TO MOVE FIELD NAME VRBLK POINTERS TO DFBLK
10180: *
10181: {SDAT4{MOV{-(R10){(R9)+{{MOVE ONE FIELD NAME VRBLK POINTER
10182: {{BCT{R8{SDAT4{{LOOP TILL ALL MOVED
10183: *
10184: * NOW DEFINE THE DATATYPE FUNCTION
10185: *
10186: {{MOV{R6{R8{{COPY LENGTH OF PDBLK FOR LATER LOOP
10187: {{MOV{DATDV{R9{{POINT TO VRBLK
10188: {{MOV{DATXS{R10{{POINT BACK ON STACK
10189: {{MOV{(R10){R10{{LOAD DFBLK POINTER
10190: {{JSR{DFFNC{{{DEFINE FUNCTION
10191: {{EJC{{{{
10192: *
10193: * DATA (CONTINUED)
10194: *
10195: * LOOP TO BUILD FFBLKS
10196: *
10197: *
10198: * NOTICE THAT THE FFBLKS ARE CONSTRUCTED IN REVERSE ORDER
10199: * SO THAT THE REQUIRED OFFSETS CAN BE OBTAINED FROM
10200: * SUCCESSIVE DECREMENTATION OF THE PDBLK LENGTH (IN WC).
10201: *
10202: {SDAT5{MOV{#4*FFSI${R6{{SET LENGTH OF FFBLK
10203: {{JSR{ALLOC{{{ALLOCATE SPACE FOR FFBLK
10204: {{MOV{#B$FFC{(R9){{SET TYPE WORD
10205: {{MOV{#NUM01{4*FARGS(R9){{STORE FARGS (ALWAYS ONE)
10206: {{MOV{DATXS{R10{{POINT BACK ON STACK
10207: {{MOV{(R10){4*FFDFP(R9){{COPY DFBLK PTR TO FFBLK
10208: {{DCA{R8{{{DECREMENT OLD DFPDL TO GET NEXT OFS
10209: {{MOV{R8{4*FFOFS(R9){{SET OFFSET TO THIS FIELD
10210: {{ZER{4*FFNXT(R9){{{TENTATIVELY SET ZERO FORWARD PTR
10211: {{MOV{R9{R10{{COPY FFBLK POINTER FOR DFFNC
10212: {{MOV{(SP){R9{{LOAD VRBLK POINTER FOR FIELD
10213: {{MOV{4*VRFNC(R9){R9{{LOAD CURRENT FUNCTION POINTER
10214: {{BNE{(R9){#B$FFC{SDAT6{SKIP IF NOT CURRENTLY A FIELD FUNC
10215: *
10216: * HERE WE MUST CHAIN AN OLD FFBLK PTR TO PRESERVE IT IN THE
10217: * CASE OF MULTIPLE FIELD FUNCTIONS WITH THE SAME NAME
10218: *
10219: {{MOV{R9{4*FFNXT(R10){{LINK NEW FFBLK TO PREVIOUS CHAIN
10220: *
10221: * MERGE HERE TO DEFINE FIELD FUNCTION
10222: *
10223: {SDAT6{MOV{(SP)+{R9{{LOAD VRBLK POINTER
10224: {{JSR{DFFNC{{{DEFINE FIELD FUNCTION
10225: {{BNE{SP{DATXS{SDAT5{LOOP BACK TILL ALL DONE
10226: {{ICA{SP{{{POP DFBLK POINTER
10227: {{BRN{EXNUL{{{RETURN WITH NULL RESULT
10228: {{EJC{{{{
10229: *
10230: * DATATYPE
10231: *
10232: {S$DTP{ENT{{{{ENTRY POINT
10233: {{MOV{(SP)+{R9{{LOAD ARGUMENT
10234: {{JSR{DTYPE{{{GET DATATYPE
10235: {{BRN{EXIXR{{{AND RETURN IT AS RESULT
10236: {{EJC{{{{
10237: *
10238: * DATE
10239: *
10240: {S$DTE{ENT{{{{ENTRY POINT
10241: {{JSR{SYSDT{{{CALL SYSTEM DATE ROUTINE
10242: {{MOV{4*1(R10){R6{{LOAD LENGTH FOR SBSTR
10243: {{BZE{R6{EXNUL{{RETURN NULL IF LENGTH IS ZERO
10244: {{ZER{R7{{{SET ZERO OFFSET
10245: {{JSR{SBSTR{{{USE SBSTR TO BUILD SCBLK
10246: {{BRN{EXIXR{{{RETURN DATE STRING
10247: {{EJC{{{{
10248: *
10249: * DEFINE
10250: *
10251: {S$DEF{ENT{{{{ENTRY POINT
10252: {{MOV{(SP)+{R9{{LOAD SECOND ARGUMENT
10253: {{ZER{DEFLB{{{ZERO LABEL POINTER IN CASE NULL
10254: {{BEQ{R9{#NULLS{SDF01{JUMP IF NULL SECOND ARGUMENT
10255: {{JSR{GTNVR{{{ELSE FIND VRBLK FOR LABEL
10256: {{PPM{SDF13{{{JUMP IF NOT A VARIABLE NAME
10257: {{MOV{R9{DEFLB{{ELSE SET SPECIFIED ENTRY
10258: *
10259: * SCAN FUNCTION NAME
10260: *
10261: {SDF01{JSR{XSCNI{{{PREPARE TO SCAN FIRST ARGUMENT
10262: {{ERR{081{DEFINE{{FIRST ARGUMENT IS NOT STRING
10263: {{ERR{082{DEFINE{{FIRST ARGUMENT IS NULL
10264: {{MOV{#CH$PP{R8{{DELIMITER ONE = LEFT PAREN
10265: {{MOV{R8{R10{{DELIMITER TWO = LEFT PAREN
10266: {{JSR{XSCAN{{{SCAN OUT FUNCTION NAME
10267: {{BNZ{R6{SDF02{{JUMP IF LEFT PAREN FOUND
10268: {{ERB{083{DEFINE{{FIRST ARGUMENT IS MISSING A LEFT PAREN
10269: *
10270: * HERE AFTER SCANNING OUT FUNCTION NAME
10271: *
10272: {SDF02{JSR{GTNVR{{{GET VARIABLE NAME
10273: {{ERR{084{DEFINE{{FIRST ARGUMENT HAS NULL FUNCTION NAME
10274: {{MOV{R9{DEFVR{{SAVE VRBLK POINTER FOR FUNCTION NAM
10275: {{ZER{R7{{{ZERO COUNT OF ARGUMENTS
10276: {{MOV{SP{DEFXS{{SAVE INITIAL STACK POINTER
10277: {{BNZ{DEFLB{SDF03{{JUMP IF SECOND ARGUMENT GIVEN
10278: {{MOV{R9{DEFLB{{ELSE DEFAULT IS FUNCTION NAME
10279: *
10280: * LOOP TO SCAN ARGUMENT NAMES AND STACK VRBLK POINTERS
10281: *
10282: {SDF03{MOV{#CH$RP{R8{{DELIMITER ONE = RIGHT PAREN
10283: {{MOV{#CH$CM{R10{{DELIMITER TWO = COMMA
10284: {{JSR{XSCAN{{{SCAN OUT NEXT ARGUMENT NAME
10285: {{BNZ{R6{SDF04{{SKIP IF DELIMITER FOUND
10286: {{ERB{085{NULL{{ARG NAME OR MISSING ) IN DEFINE FIRST ARG.
10287: {{EJC{{{{
10288: *
10289: * DEFINE (CONTINUED)
10290: *
10291: * HERE AFTER SCANNING AN ARGUMENT NAME
10292: *
10293: {SDF04{BNE{R9{#NULLS{SDF05{SKIP IF NON-NULL
10294: {{BZE{R7{SDF06{{IGNORE NULL IF CASE OF NO ARGUMENTS
10295: *
10296: * HERE AFTER DEALING WITH THE CASE OF NO ARGUMENTS
10297: *
10298: {SDF05{JSR{GTNVR{{{GET VRBLK POINTER
10299: {{PPM{SDF03{{{LOOP BACK TO IGNORE NULL NAME
10300: {{MOV{R9{-(SP){{STACK ARGUMENT VRBLK POINTER
10301: {{ICV{R7{{{INCREMENT COUNTER
10302: {{BEQ{R6{#NUM02{SDF03{LOOP BACK IF STOPPED BY A COMMA
10303: *
10304: * HERE AFTER SCANNING OUT FUNCTION ARGUMENT NAMES
10305: *
10306: {SDF06{MOV{R7{DEFNA{{SAVE NUMBER OF ARGUMENTS
10307: {{ZER{R7{{{ZERO COUNT OF LOCALS
10308: *
10309: * LOOP TO SCAN LOCAL NAMES AND STACK VRBLK POINTERS
10310: *
10311: {SDF07{MOV{#CH$CM{R8{{SET DELIMITER ONE = COMMA
10312: {{MOV{R8{R10{{SET DELIMITER TWO = COMMA
10313: {{JSR{XSCAN{{{SCAN OUT NEXT LOCAL NAME
10314: {{BNE{R9{#NULLS{SDF08{SKIP IF NON-NULL
10315: {{BZE{R7{SDF09{{IGNORE NULL IF CASE OF NO LOCALS
10316: *
10317: * HERE AFTER SCANNING OUT A LOCAL NAME
10318: *
10319: {SDF08{JSR{GTNVR{{{GET VRBLK POINTER
10320: {{PPM{SDF07{{{LOOP BACK TO IGNORE NULL NAME
10321: {{ICV{R7{{{IF OK, INCREMENT COUNT
10322: {{MOV{R9{-(SP){{STACK VRBLK POINTER
10323: {{BNZ{R6{SDF07{{LOOP BACK IF STOPPED BY A COMMA
10324: {{EJC{{{{
10325: *
10326: * DEFINE (CONTINUED)
10327: *
10328: * HERE AFTER SCANNING LOCALS, BUILD PFBLK
10329: *
10330: {SDF09{MOV{R7{R6{{COPY COUNT OF LOCALS
10331: {{ADD{DEFNA{R6{{ADD NUMBER OF ARGUMENTS
10332: {{MOV{R6{R8{{SET SUM ARGS+LOCALS AS LOOP COUNT
10333: {{ADD{#PFSI${R6{{ADD SPACE FOR STANDARD FIELDS
10334: {{WTB{R6{{{CONVERT LENGTH TO BYTES
10335: {{JSR{ALLOC{{{ALLOCATE SPACE FOR PFBLK
10336: {{MOV{R9{R10{{SAVE POINTER TO PFBLK
10337: {{MOV{#B$PFC{(R9)+{{STORE FIRST WORD
10338: {{MOV{DEFNA{(R9)+{{STORE NUMBER OF ARGUMENTS
10339: {{MOV{R6{(R9)+{{STORE LENGTH (PFLEN)
10340: {{MOV{DEFVR{(R9)+{{STORE VRBLK PTR FOR FUNCTION NAME
10341: {{MOV{R7{(R9)+{{STORE NUMBER OF LOCALS
10342: {{ZER{(R9)+{{{DEAL WITH LABEL LATER
10343: {{ZER{(R9)+{{{ZERO PFCTR
10344: {{ZER{(R9)+{{{ZERO PFRTR
10345: {{BZE{R8{SDF11{{SKIP IF NO ARGS OR LOCALS
10346: {{MOV{R10{R6{{KEEP PFBLK POINTER
10347: {{MOV{DEFXS{R10{{POINT BEFORE ARGUMENTS
10348: {{LCT{R8{R8{{GET COUNT OF ARGS+LOCALS FOR LOOP
10349: *
10350: * LOOP TO MOVE LOCALS AND ARGS TO PFBLK
10351: *
10352: {SDF10{MOV{-(R10){(R9)+{{STORE ONE ENTRY AND BUMP POINTERS
10353: {{BCT{R8{SDF10{{LOOP TILL ALL STORED
10354: {{MOV{R6{R10{{RECOVER PFBLK POINTER
10355: {{EJC{{{{
10356: *
10357: * DEFINE (CONTINUED)
10358: *
10359: * NOW DEAL WITH LABEL
10360: *
10361: {SDF11{MOV{DEFXS{SP{{POP STACK
10362: {{MOV{DEFLB{R9{{POINT TO VRBLK FOR LABEL
10363: {{MOV{4*VRLBL(R9){R9{{LOAD LABEL POINTER
10364: {{BNE{(R9){#B$TRT{SDF12{SKIP IF NOT TRAPPED
10365: {{MOV{4*TRLBL(R9){R9{{ELSE POINT TO REAL LABEL
10366: *
10367: * HERE AFTER LOCATING REAL LABEL POINTER
10368: *
10369: {SDF12{BEQ{R9{#STNDL{SDF13{JUMP IF LABEL IS NOT DEFINED
10370: {{MOV{R9{4*PFCOD(R10){{ELSE STORE LABEL POINTER
10371: {{MOV{DEFVR{R9{{POINT BACK TO VRBLK FOR FUNCTION
10372: {{JSR{DFFNC{{{DEFINE FUNCTION
10373: {{BRN{EXNUL{{{AND EXIT RETURNING NULL
10374: *
10375: * HERE FOR ERRONEOUS LABEL
10376: *
10377: {SDF13{ERB{086{DEFINE{{FUNCTION ENTRY POINT IS NOT DEFINED LABEL
10378: {{EJC{{{{
10379: *
10380: * DETACH
10381: *
10382: {S$DET{ENT{{{{ENTRY POINT
10383: {{MOV{(SP)+{R9{{LOAD ARGUMENT
10384: {{JSR{GTVAR{{{LOCATE VARIABLE
10385: {{ERR{087{DETACH{{ARGUMENT IS NOT APPROPRIATE NAME
10386: {{JSR{DTACH{{{DETACH I/O ASSOCIATION FROM NAME
10387: {{BRN{EXNUL{{{RETURN NULL RESULT
10388: {{EJC{{{{
10389: *
10390: * DIFFER
10391: *
10392: {S$DIF{ENT{{{{ENTRY POINT
10393: {{MOV{(SP)+{R9{{LOAD SECOND ARGUMENT
10394: {{MOV{(SP)+{R10{{LOAD FIRST ARGUMENT
10395: {{JSR{IDENT{{{CALL IDENT COMPARISON ROUTINE
10396: {{PPM{EXFAL{{{FAIL IF IDENT
10397: {{BRN{EXNUL{{{RETURN NULL IF DIFFER
10398: {{EJC{{{{
10399: *
10400: * DUMP
10401: *
10402: {S$DMP{ENT{{{{ENTRY POINT
10403: {{JSR{GTSMI{{{LOAD DUMP ARG AS SMALL INTEGER
10404: {{ERR{088{DUMP{{ARGUMENT IS NOT INTEGER
10405: {{ERR{089{DUMP{{ARGUMENT IS NEGATIVE OR TOO LARGE
10406: {{JSR{DUMPR{{{ELSE CALL DUMP ROUTINE
10407: {{BRN{EXNUL{{{AND RETURN NULL AS RESULT
10408: {{EJC{{{{
10409: *
10410: * DUPL
10411: *
10412: {S$DUP{ENT{{{{ENTRY POINT
10413: {{JSR{GTSMI{{{GET SECOND ARGUMENT AS SMALL INTEGE
10414: {{ERR{090{DUPL{{SECOND ARGUMENT IS NOT INTEGER
10415: {{PPM{SDUP7{{{JUMP IF NEGATIVE OT TOO BIG
10416: {{MOV{R9{R7{{SAVE DUPLICATION FACTOR
10417: {{JSR{GTSTG{{{GET FIRST ARG AS STRING
10418: {{PPM{SDUP4{{{JUMP IF NOT A STRING
10419: *
10420: * HERE FOR CASE OF DUPLICATION OF A STRING
10421: *
10422: {{MTI{R6{{{ACQUIRE LENGTH AS INTEGER
10423: {{STI{DUPSI{{{SAVE FOR THE MOMENT
10424: {{MTI{R7{{{GET DUPLICATION FACTOR AS INTEGER
10425: {{MLI{DUPSI{{{FORM PRODUCT
10426: {{IOV{SDUP3{{{JUMP IF OVERFLOW
10427: {{IEQ{EXNUL{{{RETURN NULL IF RESULT LENGTH = 0
10428: {{MFI{R6{SDUP3{{GET AS ADDR INTEGER, CHECK OVFLO
10429: *
10430: * MERGE HERE WITH RESULT LENGTH IN WA
10431: *
10432: {SDUP1{MOV{R9{R10{{SAVE STRING POINTER
10433: {{JSR{ALOCS{{{ALLOCATE SPACE FOR STRING
10434: {{MOV{R9{-(SP){{SAVE AS RESULT POINTER
10435: {{MOV{R10{R8{{SAVE POINTER TO ARGUMENT STRING
10436: {{PSC{R9{{{PREPARE TO STORE CHARS OF RESULT
10437: {{LCT{R7{R7{{SET COUNTER TO CONTROL LOOP
10438: *
10439: * LOOP THROUGH DUPLICATIONS
10440: *
10441: {SDUP2{MOV{R8{R10{{POINT BACK TO ARGUMENT STRING
10442: {{MOV{4*SCLEN(R10){R6{{GET NUMBER OF CHARACTERS
10443: {{PLC{R10{{{POINT TO CHARS IN ARGUMENT STRING
10444: {{MVC{{{{MOVE CHARACTERS TO RESULT STRING
10445: {{BCT{R7{SDUP2{{LOOP TILL ALL DUPLICATIONS DONE
10446: {{BRN{EXITS{{{THEN EXIT FOR NEXT CODE WORD
10447: {{EJC{{{{
10448: *
10449: * DUPL (CONTINUED)
10450: *
10451: * HERE IF TOO LARGE, SET MAX LENGTH AND LET ALOCS CATCH IT
10452: *
10453: {SDUP3{MOV{DNAME{R6{{SET IMPOSSIBLE LENGTH FOR ALOCS
10454: {{BRN{SDUP1{{{MERGE BACK
10455: *
10456: * HERE IF NOT A STRING
10457: *
10458: {SDUP4{JSR{GTPAT{{{CONVERT ARGUMENT TO PATTERN
10459: {{ERR{091{DUPL{{FIRST ARGUMENT IS NOT STRING OR PATTERN
10460: *
10461: * HERE TO DUPLICATE A PATTERN ARGUMENT
10462: *
10463: {{MOV{R9{-(SP){{STORE PATTERN ON STACK
10464: {{MOV{#NDNTH{R9{{START OFF WITH NULL PATTERN
10465: {{BZE{R7{SDUP6{{NULL PATTERN IS RESULT IF DUPFAC=0
10466: {{MOV{R7{-(SP){{PRESERVE LOOP COUNT
10467: *
10468: * LOOP TO DUPLICATE BY SUCCESSIVE CONCATENATION
10469: *
10470: {SDUP5{MOV{R9{R10{{COPY CURRENT VALUE AS RIGHT ARGUMNT
10471: {{MOV{4*1(SP){R9{{GET A NEW COPY OF LEFT
10472: {{JSR{PCONC{{{CONCATENATE
10473: {{DCV{(SP){{{COUNT DOWN
10474: {{BNZ{(SP){SDUP5{{LOOP
10475: {{ICA{SP{{{POP LOOP COUNT
10476: *
10477: * HERE TO EXIT AFTER CONSTRUCTING PATTERN
10478: *
10479: {SDUP6{MOV{R9{(SP){{STORE RESULT ON STACK
10480: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK
10481: *
10482: * FAIL IF SECOND ARG IS OUT OF RANGE
10483: *
10484: {SDUP7{ICA{SP{{{POP FIRST ARGUMENT
10485: {{BRN{EXFAL{{{FAIL
10486: {{EJC{{{{
10487: *
10488: * EJECT
10489: *
10490: {S$EJC{ENT{{{{ENTRY POINT
10491: {{JSR{IOFCB{{{CALL FCBLK ROUTINE
10492: {{ERR{092{EJECT{{ARGUMENT IS NOT A SUITABLE NAME
10493: {{PPM{SEJC1{{{NULL ARGUMENT
10494: {{JSR{SYSEF{{{CALL EJECT FILE FUNCTION
10495: {{ERR{093{EJECT{{FILE DOES NOT EXIST
10496: {{ERR{094{EJECT{{FILE DOES NOT PERMIT PAGE EJECT
10497: {{ERR{095{EJECT{{CAUSED NON-RECOVERABLE OUTPUT ERROR
10498: {{BRN{EXNUL{{{RETURN NULL AS RESULT
10499: *
10500: * HERE TO EJECT STANDARD OUTPUT FILE
10501: *
10502: {SEJC1{JSR{SYSEP{{{CALL ROUTINE TO EJECT PRINTER
10503: {{BRN{EXNUL{{{EXIT WITH NULL RESULT
10504: {{EJC{{{{
10505: *
10506: * ENDFILE
10507: *
10508: {S$ENF{ENT{{{{ENTRY POINT
10509: {{JSR{IOFCB{{{CALL FCBLK ROUTINE
10510: {{ERR{096{ENDFILE{{ARGUMENT IS NOT A SUITABLE NAME
10511: {{ERR{097{ENDFILE{{ARGUMENT IS NULL
10512: {{JSR{SYSEN{{{CALL ENDFILE ROUTINE
10513: {{ERR{098{ENDFILE{{FILE DOES NOT EXIST
10514: {{ERR{099{ENDFILE{{FILE DOES NOT PERMIT ENDFILE
10515: {{ERR{100{ENDFILE{{CAUSED NON-RECOVERABLE OUTPUT ERROR
10516: {{MOV{R10{R7{{REMEMBER VRBLK PTR FROM IOFCB CALL
10517: *
10518: * LOOP TO FIND TRTRF BLOCK
10519: *
10520: {SENF1{MOV{R10{R9{{COPY POINTER
10521: {{MOV{4*TRVAL(R9){R9{{CHAIN ALONG
10522: {{BNE{(R9){#B$TRT{EXNUL{SKIP OUT IF CHAIN END
10523: {{BNE{4*TRTYP(R9){#TRTFC{SENF1{LOOP IF NOT FOUND
10524: {{MOV{4*TRVAL(R9){4*TRVAL(R10){{REMOVE TRTRF
10525: {{MOV{4*TRTRF(R9){ENFCH{{POINT TO HEAD OF IOCHN
10526: {{MOV{4*TRFPT(R9){R8{{POINT TO FCBLK
10527: {{MOV{R7{R9{{FILEARG1 VRBLK FROM IOFCB
10528: {{JSR{SETVR{{{RESET IT
10529: {{MOV{#R$FCB{R10{{PTR TO HEAD OF FCBLK CHAIN
10530: {{SUB{#4*NUM02{R10{{ADJUST READY TO ENTER LOOP
10531: *
10532: * FIND FCBLK
10533: *
10534: {SENF2{MOV{R10{R9{{COPY PTR
10535: {{MOV{4*2(R10){R10{{GET NEXT LINK
10536: {{BZE{R10{SENF4{{STOP IF CHAIN END
10537: {{BEQ{4*3(R10){R8{SENF3{JUMP IF FCBLK FOUND
10538: {{BRN{SENF2{{{LOOP
10539: *
10540: * REMOVE FCBLK
10541: *
10542: {SENF3{MOV{4*2(R10){4*2(R9){{DELETE FCBLK FROM CHAIN
10543: *
10544: * LOOP WHICH DETACHES ALL VBLS ON IOCHN CHAIN
10545: *
10546: {SENF4{MOV{ENFCH{R10{{GET CHAIN HEAD
10547: {{BZE{R10{EXNUL{{FINISHED IF CHAIN END
10548: {{MOV{4*TRTRF(R10){ENFCH{{CHAIN ALONG
10549: {{MOV{4*IONMO(R10){R6{{NAME OFFSET
10550: {{MOV{4*IONMB(R10){R10{{NAME BASE
10551: {{JSR{DTACH{{{DETACH NAME
10552: {{BRN{SENF4{{{LOOP TILL DONE
10553: {{EJC{{{{
10554: *
10555: * EQ
10556: *
10557: {S$EQF{ENT{{{{ENTRY POINT
10558: {{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE
10559: {{ERR{101{EQ{{FIRST ARGUMENT IS NOT NUMERIC
10560: {{ERR{102{EQ{{SECOND ARGUMENT IS NOT NUMERIC
10561: {{PPM{EXFAL{{{FAIL IF LT
10562: {{PPM{EXNUL{{{RETURN NULL IF EQ
10563: {{PPM{EXFAL{{{FAIL IF GT
10564: {{EJC{{{{
10565: *
10566: * EVAL
10567: *
10568: {S$EVL{ENT{{{{ENTRY POINT
10569: {{MOV{(SP)+{R9{{LOAD ARGUMENT
10570: {{JSR{GTEXP{{{CONVERT TO EXPRESSION
10571: {{ERR{103{EVAL{{ARGUMENT IS NOT EXPRESSION
10572: {{LCW{R8{{{LOAD NEXT CODE WORD
10573: {{BNE{R8{#OFNE${SEVL1{JUMP IF CALLED BY VALUE
10574: {{SCP{R10{{{COPY CODE POINTER
10575: {{MOV{(R10){R6{{GET NEXT CODE WORD
10576: {{BNE{R6{#ORNM${SEVL2{BY NAME UNLESS EXPRESSION
10577: {{BNZ{4*1(SP){SEVL2{{JUMP IF BY NAME
10578: *
10579: * HERE IF CALLED BY VALUE
10580: *
10581: {SEVL1{ZER{R7{{{SET FLAG FOR BY VALUE
10582: {{MOV{R8{-(SP){{SAVE CODE WORD
10583: {{JSR{EVALX{{{EVALUATE EXPRESSION BY VALUE
10584: {{PPM{EXFAL{{{FAIL IF EVALUATION FAILS
10585: {{MOV{R9{R10{{COPY RESULT
10586: {{MOV{(SP){R9{{RELOAD NEXT CODE WORD
10587: {{MOV{R10{(SP){{STACK RESULT
10588: {{BRI{(R9){{{JUMP TO EXECUTE NEXT CODE WORD
10589: *
10590: * HERE IF CALLED BY NAME
10591: *
10592: {SEVL2{MOV{#NUM01{R7{{SET FLAG FOR BY NAME
10593: {{JSR{EVALX{{{EVALUATE EXPRESSION BY NAME
10594: {{PPM{EXFAL{{{FAIL IF EVALUATION FAILS
10595: {{BRN{EXNAM{{{EXIT WITH NAME
10596: {{EJC{{{{
10597: *
10598: * EXIT
10599: *
10600: {S$EXT{ENT{{{{ENTRY POINT
10601: {{ZER{R7{{{CLEAR AMOUNT OF STATIC SHIFT
10602: {{JSR{GBCOL{{{COMPACT MEMORY BY COLLECTING
10603: {{JSR{GTSTG{{{CONVERT ARG TO STRING
10604: {{ERR{104{EXIT{{ARGUMENT IS NOT SUITABLE INTEGER OR STRING
10605: {{MOV{R9{R10{{COPY STRING PTR
10606: {{JSR{GTINT{{{CHECK IT IS INTEGER
10607: {{PPM{SEXT1{{{SKIP IF UNCONVERTIBLE
10608: {{ZER{R10{{{NOTE IT IS INTEGER
10609: {{LDI{4*ICVAL(R9){{{GET INTEGER ARG
10610: {{MOV{R$FCB{R7{{GET FCBLK CHAIN HEADER
10611: *
10612: * MERGE TO CALL OSINT EXIT ROUTINE
10613: *
10614: {SEXT1{MOV{#HEADV{R9{{POINT TO V.V STRING
10615: {{JSR{SYSXI{{{CALL EXTERNAL ROUTINE
10616: {{ERR{105{EXIT{{ACTION NOT AVAILABLE IN THIS IMPLEMENTATION
10617: {{ERR{106{EXIT{{ACTION CAUSED IRRECOVERABLE ERROR
10618: {{IEQ{EXNUL{{{RETURN IF ARGUMENT 0
10619: {{ZER{GBCNT{{{RESUMING EXECUTION SO RESET
10620: {{IGT{SEXT2{{{SKIP IF POSITIVE
10621: {{NGI{{{{MAKE POSITIVE
10622: *
10623: * CHECK FOR OPTION RESPECIFICATION
10624: *
10625: {SEXT2{MFI{R8{{{GET VALUE IN WORK REG
10626: {{BEQ{R8{#NUM03{SEXT3{SKIP IF WAS 3
10627: {{MOV{R8{-(SP){{SAVE VALUE
10628: {{ZER{R8{{{SET TO READ OPTIONS
10629: {{JSR{PRPAR{{{READ SYSPP OPTIONS
10630: {{MOV{(SP)+{R8{{RESTORE VALUE
10631: *
10632: * DEAL WITH HEADER OPTION (FIDDLED BY PRPAR)
10633: *
10634: {SEXT3{MNZ{HEADP{{{ASSUME NO HEADERS
10635: {{BNE{R8{#NUM01{SEXT4{SKIP IF NOT 1
10636: {{ZER{HEADP{{{REQUEST HEADER PRINTING
10637: *
10638: * ALMOST READY TO RESUME RUNNING
10639: *
10640: {SEXT4{JSR{SYSTM{{{GET EXECUTION TIME START (SGD11)
10641: {{STI{TIMSX{{{SAVE AS INITIAL TIME
10642: {{LDI{KVSTC{{{RESET TO ENSURE ...
10643: {{STI{KVSTL{{{... CORRECT EXECUTION STATS
10644: {{BRN{EXNUL{{{RESUME EXECUTION
10645: {{EJC{{{{
10646: *
10647: * FIELD
10648: *
10649: {S$FLD{ENT{{{{ENTRY POINT
10650: {{JSR{GTSMI{{{GET SECOND ARGUMENT (FIELD NUMBER)
10651: {{ERR{107{FIELD{{SECOND ARGUMENT IS NOT INTEGER
10652: {{PPM{EXFAL{{{FAIL IF OUT OF RANGE
10653: {{MOV{R9{R7{{ELSE SAVE INTEGER VALUE
10654: {{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT
10655: {{JSR{GTNVR{{{POINT TO VRBLK
10656: {{PPM{SFLD1{{{JUMP (ERROR) IF NOT VARIABLE NAME
10657: {{MOV{4*VRFNC(R9){R9{{ELSE POINT TO FUNCTION BLOCK
10658: {{BNE{(R9){#B$DFC{SFLD1{ERROR IF NOT DATATYPE FUNCTION
10659: *
10660: * HERE IF FIRST ARGUMENT IS A DATATYPE FUNCTION NAME
10661: *
10662: {{BZE{R7{EXFAL{{FAIL IF ARGUMENT NUMBER IS ZERO
10663: {{BGT{R7{4*FARGS(R9){EXFAL{FAIL IF TOO LARGE
10664: {{WTB{R7{{{ELSE CONVERT TO BYTE OFFSET
10665: {{ADD{R7{R9{{POINT TO FIELD NAME
10666: {{MOV{4*DFFLB(R9){R9{{LOAD VRBLK POINTER
10667: {{BRN{EXVNM{{{EXIT TO BUILD NMBLK
10668: *
10669: * HERE FOR BAD FIRST ARGUMENT
10670: *
10671: {SFLD1{ERB{108{FIELD{{FIRST ARGUMENT IS NOT DATATYPE NAME
10672: {{EJC{{{{
10673: *
10674: * FENCE
10675: *
10676: {S$FNC{ENT{{{{ENTRY POINT
10677: {{MOV{#P$FNC{R7{{SET PCODE FOR P$FNC
10678: {{ZER{R9{{{P0BLK
10679: {{JSR{PBILD{{{BUILD P$FNC NODE
10680: {{MOV{R9{R10{{SAVE POINTER TO IT
10681: {{MOV{(SP)+{R9{{GET ARGUMENT
10682: {{JSR{GTPAT{{{CONVERT TO PATTERN
10683: {{ERR{259{FENCE{{ARGUMENT IS NOT PATTERN
10684: {{JSR{PCONC{{{CONCATENATE TO P$FNC NODE
10685: {{MOV{R9{R10{{SAVE PTR TO CONCATENATED PATTERN
10686: {{MOV{#P$FNA{R7{{SET FOR P$FNA PCODE
10687: {{ZER{R9{{{P0BLK
10688: {{JSR{PBILD{{{CONSTRUCT P$FNA NODE
10689: {{MOV{R10{4*PTHEN(R9){{SET PATTERN AS PTHEN
10690: {{MOV{R9{-(SP){{SET AS RESULT
10691: {{BRN{EXITS{{{DO NEXT CODE WORD
10692: {{EJC{{{{
10693: *
10694: * GE
10695: *
10696: {S$GEF{ENT{{{{ENTRY POINT
10697: {{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE
10698: {{ERR{109{GE{{FIRST ARGUMENT IS NOT NUMERIC
10699: {{ERR{110{GE{{SECOND ARGUMENT IS NOT NUMERIC
10700: {{PPM{EXFAL{{{FAIL IF LT
10701: {{PPM{EXNUL{{{RETURN NULL IF EQ
10702: {{PPM{EXNUL{{{RETURN NULL IF GT
10703: {{EJC{{{{
10704: *
10705: * GT
10706: *
10707: {S$GTF{ENT{{{{ENTRY POINT
10708: {{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE
10709: {{ERR{111{GT{{FIRST ARGUMENT IS NOT NUMERIC
10710: {{ERR{112{GT{{SECOND ARGUMENT IS NOT NUMERIC
10711: {{PPM{EXFAL{{{FAIL IF LT
10712: {{PPM{EXFAL{{{FAIL IF EQ
10713: {{PPM{EXNUL{{{RETURN NULL IF GT
10714: {{EJC{{{{
10715: *
10716: * HOST
10717: *
10718: {S$HST{ENT{{{{ENTRY POINT
10719: {{MOV{(SP)+{R9{{GET THIRD ARG
10720: {{MOV{(SP)+{R10{{GET SECOND ARG
10721: {{MOV{(SP)+{R6{{GET FIRST ARG
10722: {{JSR{SYSHS{{{ENTER SYSHS ROUTINE
10723: {{ERR{254{ERRONEOUS{{ARGUMENT FOR HOST
10724: {{ERR{255{ERROR{{DURING EXECUTION OF HOST
10725: {{PPM{SHST1{{{STORE HOST STRING
10726: {{PPM{EXNUL{{{RETURN NULL RESULT
10727: {{PPM{EXIXR{{{RETURN XR
10728: {{PPM{EXFAL{{{FAIL RETURN
10729: *
10730: * RETURN HOST STRING
10731: *
10732: {SHST1{BZE{R10{EXNUL{{NULL STRING IF SYSHS UNCOOPERATIVE
10733: {{MOV{4*SCLEN(R10){R6{{LENGTH
10734: {{ZER{R7{{{ZERO OFFSET
10735: {{JSR{SBSTR{{{BUILD COPY OF STRING
10736: {{MOV{R9{-(SP){{STACK THE RESULT
10737: {{BRN{EXITS{{{RETURN RESULT ON STACK
10738: {{EJC{{{{
10739: *
10740: * IDENT
10741: *
10742: {S$IDN{ENT{{{{ENTRY POINT
10743: {{MOV{(SP)+{R9{{LOAD SECOND ARGUMENT
10744: {{MOV{(SP)+{R10{{LOAD FIRST ARGUMENT
10745: {{JSR{IDENT{{{CALL IDENT COMPARISON ROUTINE
10746: {{PPM{EXNUL{{{RETURN NULL IF IDENT
10747: {{BRN{EXFAL{{{FAIL IF DIFFER
10748: {{EJC{{{{
10749: *
10750: * INPUT
10751: *
10752: {S$INP{ENT{{{{ENTRY POINT
10753: {{ZER{R7{{{INPUT FLAG
10754: {{JSR{IOPUT{{{CALL INPUT/OUTPUT ASSOC. ROUTINE
10755: {{ERR{113{INPUT{{THIRD ARGUMENT IS NOT A STRING
10756: {{ERR{114{INAPPROPRIATE{{SECOND ARGUMENT FOR INPUT
10757: {{ERR{115{INAPPROPRIATE{{FIRST ARGUMENT FOR INPUT
10758: {{ERR{116{INAPPROPRIATE{{FILE SPECIFICATION FOR INPUT
10759: {{PPM{EXFAL{{{FAIL IF FILE DOES NOT EXIST
10760: {{ERR{117{INPUT{{FILE CANNOT BE READ
10761: {{BRN{EXNUL{{{RETURN NULL STRING
10762: {{EJC{{{{
10763: *
10764: * INSERT
10765: *
10766: {S$INS{ENT{{{{ENTRY POINT
10767: {{MOV{(SP)+{R10{{GET STRING ARG
10768: {{JSR{GTSMI{{{GET REPLACE LENGTH
10769: {{ERR{277{INSERT{{THIRD ARGUMENT NOT INTEGER
10770: {{PPM{EXFAL{{{FAIL IF OUT OF RANGE
10771: {{MOV{R8{R7{{COPY TO PROPER REG
10772: {{JSR{GTSMI{{{GET REPLACE POSITION
10773: {{ERR{278{INSERT{{SECOND ARGUMENT NOT INTEGER
10774: {{PPM{EXFAL{{{FAIL IF OUT OF RANGE
10775: {{BZE{R8{EXFAL{{FAIL IF ZERO
10776: {{DCV{R8{{{DECREMENT TO GET OFFSET
10777: {{MOV{R8{R6{{PUT IN PROPER REGISTER
10778: {{MOV{(SP)+{R9{{GET BUFFER
10779: {{BEQ{(R9){#B$BCT{SINS1{PRESS ON IF TYPE OK
10780: {{ERB{279{INSERT{{FIRST ARGUMENT NOT BUFFER
10781: *
10782: * HERE WHEN EVERYTHING LOADED UP
10783: *
10784: {SINS1{JSR{INSBF{{{CALL TO INSERT
10785: {{ERR{280{INSERT{{FOURTH ARGUMENT NOT A STRING
10786: {{PPM{EXFAL{{{FAIL IF OUT OF RANGE
10787: {{BRN{EXNUL{{{ELSE OK - EXIT WITH NULL
10788: {{EJC{{{{
10789: *
10790: * INTEGER
10791: *
10792: {S$INT{ENT{{{{ENTRY POINT
10793: {{MOV{(SP)+{R9{{LOAD ARGUMENT
10794: {{JSR{GTNUM{{{CONVERT TO NUMERIC
10795: {{PPM{EXFAL{{{FAIL IF NON-NUMERIC
10796: {{BEQ{R6{#B$ICL{EXNUL{RETURN NULL IF INTEGER
10797: {{BRN{EXFAL{{{FAIL IF REAL
10798: {{EJC{{{{
10799: *
10800: * ITEM
10801: *
10802: * ITEM DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT
10803: * WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED.
10804: *
10805: {S$ITM{ENT{{{{ENTRY POINT
10806: *
10807: * DEAL WITH CASE OF NO ARGS
10808: *
10809: {{BNZ{R6{SITM1{{JUMP IF AT LEAST ONE ARG
10810: {{MOV{#NULLS{-(SP){{ELSE SUPPLY GARBAGE NULL ARG
10811: {{MOV{#NUM01{R6{{AND FIX ARGUMENT COUNT
10812: *
10813: * CHECK FOR NAME/VALUE CASES
10814: *
10815: {SITM1{SCP{R9{{{GET CURRENT CODE POINTER
10816: {{MOV{(R9){R10{{LOAD NEXT CODE WORD
10817: {{DCV{R6{{{GET NUMBER OF SUBSCRIPTS
10818: {{MOV{R6{R9{{COPY FOR ARREF
10819: {{BEQ{R10{#OFNE${SITM2{JUMP IF CALLED BY NAME
10820: *
10821: * HERE IF CALLED BY VALUE
10822: *
10823: {{ZER{R7{{{SET CODE FOR CALL BY VALUE
10824: {{BRN{ARREF{{{OFF TO ARRAY REFERENCE ROUTINE
10825: *
10826: * HERE FOR CALL BY NAME
10827: *
10828: {SITM2{MNZ{R7{{{SET CODE FOR CALL BY NAME
10829: {{LCW{R6{{{LOAD AND IGNORE OFNE$ CALL
10830: {{BRN{ARREF{{{OFF TO ARRAY REFERENCE ROUTINE
10831: {{EJC{{{{
10832: *
10833: * LE
10834: *
10835: {S$LEF{ENT{{{{ENTRY POINT
10836: {{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE
10837: {{ERR{118{LE{{FIRST ARGUMENT IS NOT NUMERIC
10838: {{ERR{119{LE{{SECOND ARGUMENT IS NOT NUMERIC
10839: {{PPM{EXNUL{{{RETURN NULL IF LT
10840: {{PPM{EXNUL{{{RETURN NULL IF EQ
10841: {{PPM{EXFAL{{{FAIL IF GT
10842: {{EJC{{{{
10843: *
10844: * LEN
10845: *
10846: {S$LEN{ENT{{{{ENTRY POINT
10847: {{MOV{#P$LEN{R7{{SET PCODE FOR INTEGER ARG CASE
10848: {{MOV{#P$LND{R6{{SET PCODE FOR EXPR ARG CASE
10849: {{JSR{PATIN{{{CALL COMMON ROUTINE TO BUILD NODE
10850: {{ERR{120{LEN{{ARGUMENT IS NOT INTEGER OR EXPRESSION
10851: {{ERR{121{LEN{{ARGUMENT IS NEGATIVE OR TOO LARGE
10852: {{BRN{EXIXR{{{RETURN PATTERN NODE
10853: {{EJC{{{{
10854: *
10855: * LEQ
10856: *
10857: {S$LEQ{ENT{{{{ENTRY POINT
10858: {{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE
10859: {{ERR{122{LEQ{{FIRST ARGUMENT IS NOT STRING
10860: {{ERR{123{LEQ{{SECOND ARGUMENT IS NOT STRING
10861: {{PPM{EXFAL{{{FAIL IF LLT
10862: {{PPM{EXNUL{{{RETURN NULL IF LEQ
10863: {{PPM{EXFAL{{{FAIL IF LGT
10864: {{EJC{{{{
10865: *
10866: * LGE
10867: *
10868: {S$LGE{ENT{{{{ENTRY POINT
10869: {{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE
10870: {{ERR{124{LGE{{FIRST ARGUMENT IS NOT STRING
10871: {{ERR{125{LGE{{SECOND ARGUMENT IS NOT STRING
10872: {{PPM{EXFAL{{{FAIL IF LLT
10873: {{PPM{EXNUL{{{RETURN NULL IF LEQ
10874: {{PPM{EXNUL{{{RETURN NULL IF LGT
10875: {{EJC{{{{
10876: *
10877: * LGT
10878: *
10879: {S$LGT{ENT{{{{ENTRY POINT
10880: {{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE
10881: {{ERR{126{LGT{{FIRST ARGUMENT IS NOT STRING
10882: {{ERR{127{LGT{{SECOND ARGUMENT IS NOT STRING
10883: {{PPM{EXFAL{{{FAIL IF LLT
10884: {{PPM{EXFAL{{{FAIL IF LEQ
10885: {{PPM{EXNUL{{{RETURN NULL IF LGT
10886: {{EJC{{{{
10887: *
10888: * LLE
10889: *
10890: {S$LLE{ENT{{{{ENTRY POINT
10891: {{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE
10892: {{ERR{128{LLE{{FIRST ARGUMENT IS NOT STRING
10893: {{ERR{129{LLE{{SECOND ARGUMENT IS NOT STRING
10894: {{PPM{EXNUL{{{RETURN NULL IF LLT
10895: {{PPM{EXNUL{{{RETURN NULL IF LEQ
10896: {{PPM{EXFAL{{{FAIL IF LGT
10897: {{EJC{{{{
10898: *
10899: * LLT
10900: *
10901: {S$LLT{ENT{{{{ENTRY POINT
10902: {{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE
10903: {{ERR{130{LLT{{FIRST ARGUMENT IS NOT STRING
10904: {{ERR{131{LLT{{SECOND ARGUMENT IS NOT STRING
10905: {{PPM{EXNUL{{{RETURN NULL IF LLT
10906: {{PPM{EXFAL{{{FAIL IF LEQ
10907: {{PPM{EXFAL{{{FAIL IF LGT
10908: {{EJC{{{{
10909: *
10910: * LNE
10911: *
10912: {S$LNE{ENT{{{{ENTRY POINT
10913: {{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE
10914: {{ERR{132{LNE{{FIRST ARGUMENT IS NOT STRING
10915: {{ERR{133{LNE{{SECOND ARGUMENT IS NOT STRING
10916: {{PPM{EXNUL{{{RETURN NULL IF LLT
10917: {{PPM{EXFAL{{{FAIL IF LEQ
10918: {{PPM{EXNUL{{{RETURN NULL IF LGT
10919: {{EJC{{{{
10920: *
10921: * LOCAL
10922: *
10923: {S$LOC{ENT{{{{ENTRY POINT
10924: {{JSR{GTSMI{{{GET SECOND ARGUMENT (LOCAL NUMBER)
10925: {{ERR{134{LOCAL{{SECOND ARGUMENT IS NOT INTEGER
10926: {{PPM{EXFAL{{{FAIL IF OUT OF RANGE
10927: {{MOV{R9{R7{{SAVE LOCAL NUMBER
10928: {{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT
10929: {{JSR{GTNVR{{{POINT TO VRBLK
10930: {{PPM{SLOC1{{{JUMP IF NOT VARIABLE NAME
10931: {{MOV{4*VRFNC(R9){R9{{ELSE LOAD FUNCTION POINTER
10932: {{BNE{(R9){#B$PFC{SLOC1{JUMP IF NOT PROGRAM DEFINED
10933: *
10934: * HERE IF WE HAVE A PROGRAM DEFINED FUNCTION NAME
10935: *
10936: {{BZE{R7{EXFAL{{FAIL IF SECOND ARG IS ZERO
10937: {{BGT{R7{4*PFNLO(R9){EXFAL{OR TOO LARGE
10938: {{ADD{4*FARGS(R9){R7{{ELSE ADJUST OFFSET TO INCLUDE ARGS
10939: {{WTB{R7{{{CONVERT TO BYTES
10940: {{ADD{R7{R9{{POINT TO LOCAL POINTER
10941: {{MOV{4*PFAGB(R9){R9{{LOAD VRBLK POINTER
10942: {{BRN{EXVNM{{{EXIT BUILDING NMBLK
10943: *
10944: * HERE IF FIRST ARGUMENT IS NO GOOD
10945: *
10946: {SLOC1{ERB{135{LOCAL{{FIRST ARG IS NOT A PROGRAM FUNCTION NAME
10947: {{EJC{{{{
10948: *
10949: * LOAD
10950: *
10951: {S$LOD{ENT{{{{ENTRY POINT
10952: {{JSR{GTSTG{{{LOAD LIBRARY NAME
10953: {{ERR{136{LOAD{{SECOND ARGUMENT IS NOT STRING
10954: {{MOV{R9{R10{{SAVE LIBRARY NAME
10955: {{JSR{XSCNI{{{PREPARE TO SCAN FIRST ARGUMENT
10956: {{ERR{137{LOAD{{FIRST ARGUMENT IS NOT STRING
10957: {{ERR{138{LOAD{{FIRST ARGUMENT IS NULL
10958: {{MOV{R10{-(SP){{STACK LIBRARY NAME
10959: {{MOV{#CH$PP{R8{{SET DELIMITER ONE = LEFT PAREN
10960: {{MOV{R8{R10{{SET DELIMITER TWO = LEFT PAREN
10961: {{JSR{XSCAN{{{SCAN FUNCTION NAME
10962: {{MOV{R9{-(SP){{SAVE PTR TO FUNCTION NAME
10963: {{BNZ{R6{SLOD1{{JUMP IF LEFT PAREN FOUND
10964: {{ERB{139{LOAD{{FIRST ARGUMENT IS MISSING A LEFT PAREN
10965: *
10966: * HERE AFTER SUCCESSFULLY SCANNING FUNCTION NAME
10967: *
10968: {SLOD1{JSR{GTNVR{{{LOCATE VRBLK
10969: {{ERR{140{LOAD{{FIRST ARGUMENT HAS NULL FUNCTION NAME
10970: {{MOV{R9{LODFN{{SAVE VRBLK POINTER
10971: {{ZER{LODNA{{{ZERO COUNT OF ARGUMENTS
10972: *
10973: * LOOP TO SCAN ARGUMENT DATATYPE NAMES
10974: *
10975: {SLOD2{MOV{#CH$RP{R8{{DELIMITER ONE IS RIGHT PAREN
10976: {{MOV{#CH$CM{R10{{DELIMITER TWO IS COMMA
10977: {{JSR{XSCAN{{{SCAN NEXT ARGUMENT NAME
10978: {{ICV{LODNA{{{BUMP ARGUMENT COUNT
10979: {{BNZ{R6{SLOD3{{JUMP IF OK DELIMITER WAS FOUND
10980: {{ERB{141{LOAD{{FIRST ARGUMENT IS MISSING A RIGHT PAREN
10981: {{EJC{{{{
10982: *
10983: * LOAD (CONTINUED)
10984: *
10985: * COME HERE TO ANALYZE THE DATATYPE POINTER IN (XR). THIS
10986: * CODE IS USED BOTH FOR ARGUMENTS (WA=1,2) AND FOR THE
10987: * RESULT DATATYPE (WITH WA SET TO ZERO).
10988: *
10989: {SLOD3{MOV{R9{-(SP){{STACK DATATYPE NAME POINTER
10990: {{MOV{#NUM01{R7{{SET STRING CODE IN CASE
10991: {{MOV{#SCSTR{R10{{POINT TO /STRING/
10992: {{JSR{IDENT{{{CHECK FOR MATCH
10993: {{PPM{SLOD4{{{JUMP IF MATCH
10994: {{MOV{(SP){R9{{ELSE RELOAD NAME
10995: {{ADD{R7{R7{{SET CODE FOR INTEGER (2)
10996: {{MOV{#SCINT{R10{{POINT TO /INTEGER/
10997: {{JSR{IDENT{{{CHECK FOR MATCH
10998: {{PPM{SLOD4{{{JUMP IF MATCH
10999: {{MOV{(SP){R9{{ELSE RELOAD STRING POINTER
11000: {{ICV{R7{{{SET CODE FOR REAL (3)
11001: {{MOV{#SCREA{R10{{POINT TO /REAL/
11002: {{JSR{IDENT{{{CHECK FOR MATCH
11003: {{PPM{SLOD4{{{JUMP IF MATCH
11004: {{ZER{R7{{{ELSE GET CODE FOR NO CONVERT
11005: *
11006: * MERGE HERE WITH PROPER DATATYPE CODE IN WB
11007: *
11008: {SLOD4{MOV{R7{(SP){{STORE CODE ON STACK
11009: {{BEQ{R6{#NUM02{SLOD2{LOOP BACK IF ARG STOPPED BY COMMA
11010: {{BZE{R6{SLOD5{{JUMP IF THAT WAS THE RESULT TYPE
11011: *
11012: * HERE WE SCAN OUT THE RESULT TYPE (ARG STOPPED BY ) )
11013: *
11014: {{MOV{MXLEN{R8{{SET DUMMY (IMPOSSIBLE) DELIMITER 1
11015: {{MOV{R8{R10{{AND DELIMITER TWO
11016: {{JSR{XSCAN{{{SCAN RESULT NAME
11017: {{ZER{R6{{{SET CODE FOR PROCESSING RESULT
11018: {{BRN{SLOD3{{{JUMP BACK TO PROCESS RESULT NAME
11019: {{EJC{{{{
11020: *
11021: * LOAD (CONTINUED)
11022: *
11023: * HERE AFTER PROCESSING ALL ARGS AND RESULT
11024: *
11025: {SLOD5{MOV{LODNA{R6{{GET NUMBER OF ARGUMENTS
11026: {{MOV{R6{R8{{COPY FOR LATER
11027: {{WTB{R6{{{CONVERT LENGTH TO BYTES
11028: {{ADD{#4*EFSI${R6{{ADD SPACE FOR STANDARD FIELDS
11029: {{JSR{ALLOC{{{ALLOCATE EFBLK
11030: {{MOV{#B$EFC{(R9){{SET TYPE WORD
11031: {{MOV{R8{4*FARGS(R9){{SET NUMBER OF ARGUMENTS
11032: {{ZER{4*EFUSE(R9){{{SET USE COUNT (DFFNC WILL SET TO 1)
11033: {{ZER{4*EFCOD(R9){{{ZERO CODE POINTER FOR NOW
11034: {{MOV{(SP)+{4*EFRSL(R9){{STORE RESULT TYPE CODE
11035: {{MOV{LODFN{4*EFVAR(R9){{STORE FUNCTION VRBLK POINTER
11036: {{MOV{R6{4*EFLEN(R9){{STORE EFBLK LENGTH
11037: {{MOV{R9{R7{{SAVE EFBLK POINTER
11038: {{ADD{R6{R9{{POINT PAST END OF EFBLK
11039: {{LCT{R8{R8{{SET NUMBER OF ARGUMENTS FOR LOOP
11040: *
11041: * LOOP TO SET ARGUMENT TYPE CODES FROM STACK
11042: *
11043: {SLOD6{MOV{(SP)+{-(R9){{STORE ONE TYPE CODE FROM STACK
11044: {{BCT{R8{SLOD6{{LOOP TILL ALL STORED
11045: *
11046: * NOW LOAD THE EXTERNAL FUNCTION AND PERFORM DEFINITION
11047: *
11048: {{MOV{(SP)+{R9{{LOAD FUNCTION STRING NAME
11049: {{MOV{(SP){R10{{LOAD LIBRARY NAME
11050: {{MOV{R7{(SP){{STORE EFBLK POINTER
11051: {{JSR{SYSLD{{{CALL FUNCTION TO LOAD EXTERNAL FUNC
11052: {{ERR{142{LOAD{{FUNCTION DOES NOT EXIST
11053: {{ERR{143{LOAD{{FUNCTION CAUSED INPUT ERROR DURING LOAD
11054: {{MOV{(SP)+{R10{{RECALL EFBLK POINTER
11055: {{MOV{R9{4*EFCOD(R10){{STORE CODE POINTER
11056: {{MOV{LODFN{R9{{POINT TO VRBLK FOR FUNCTION
11057: {{JSR{DFFNC{{{PERFORM FUNCTION DEFINITION
11058: {{BRN{EXNUL{{{RETURN NULL RESULT
11059: {{EJC{{{{
11060: *
11061: * LPAD
11062: *
11063: {S$LPD{ENT{{{{ENTRY POINT
11064: {{JSR{GTSTG{{{GET PAD CHARACTER
11065: {{ERR{144{LPAD{{THIRD ARGUMENT NOT A STRING
11066: {{PLC{R9{{{POINT TO CHARACTER (NULL IS BLANK)
11067: {{LCH{R7{(R9){{LOAD PAD CHARACTER
11068: {{JSR{GTSMI{{{GET PAD LENGTH
11069: {{ERR{145{LPAD{{SECOND ARGUMENT IS NOT INTEGER
11070: {{PPM{SLPD3{{{SKIP IF NEGATIVE OR LARGE
11071: *
11072: * MERGE TO CHECK FIRST ARG
11073: *
11074: {SLPD1{JSR{GTSTG{{{GET FIRST ARGUMENT (STRING TO PAD)
11075: {{ERR{146{LPAD{{FIRST ARGUMENT IS NOT STRING
11076: {{BGE{R6{R8{EXIXR{RETURN 1ST ARG IF TOO LONG TO PAD
11077: {{MOV{R9{R10{{ELSE MOVE PTR TO STRING TO PAD
11078: *
11079: * NOW WE ARE READY FOR THE PAD
11080: *
11081: * (XL) POINTER TO STRING TO PAD
11082: * (WB) PAD CHARACTER
11083: * (WC) LENGTH TO PAD STRING TO
11084: *
11085: {{MOV{R8{R6{{COPY LENGTH
11086: {{JSR{ALOCS{{{ALLOCATE SCBLK FOR NEW STRING
11087: {{MOV{R9{-(SP){{SAVE AS RESULT
11088: {{MOV{4*SCLEN(R10){R6{{LOAD LENGTH OF ARGUMENT
11089: {{SUB{R6{R8{{CALCULATE NUMBER OF PAD CHARACTERS
11090: {{PSC{R9{{{POINT TO CHARS IN RESULT STRING
11091: {{LCT{R8{R8{{SET COUNTER FOR PAD LOOP
11092: *
11093: * LOOP TO PERFORM PAD
11094: *
11095: {SLPD2{SCH{R7{(R9)+{{STORE PAD CHARACTER, BUMP PTR
11096: {{BCT{R8{SLPD2{{LOOP TILL ALL PAD CHARS STORED
11097: {{CSC{R9{{{COMPLETE STORE CHARACTERS
11098: *
11099: * NOW COPY STRING
11100: *
11101: {{BZE{R6{EXITS{{EXIT IF NULL STRING
11102: {{PLC{R10{{{ELSE POINT TO CHARS IN ARGUMENT
11103: {{MVC{{{{MOVE CHARACTERS TO RESULT STRING
11104: {{BRN{EXITS{{{JUMP FOR NEXT CODE WORD
11105: *
11106: * HERE IF 2ND ARG IS NEGATIVE OR LARGE
11107: *
11108: {SLPD3{ZER{R8{{{ZERO PAD COUNT
11109: {{BRN{SLPD1{{{MERGE
11110: {{EJC{{{{
11111: *
11112: * LT
11113: *
11114: {S$LTF{ENT{{{{ENTRY POINT
11115: {{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE
11116: {{ERR{147{LT{{FIRST ARGUMENT IS NOT NUMERIC
11117: {{ERR{148{LT{{SECOND ARGUMENT IS NOT NUMERIC
11118: {{PPM{EXNUL{{{RETURN NULL IF LT
11119: {{PPM{EXFAL{{{FAIL IF EQ
11120: {{PPM{EXFAL{{{FAIL IF GT
11121: {{EJC{{{{
11122: *
11123: * NE
11124: *
11125: {S$NEF{ENT{{{{ENTRY POINT
11126: {{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE
11127: {{ERR{149{NE{{FIRST ARGUMENT IS NOT NUMERIC
11128: {{ERR{150{NE{{SECOND ARGUMENT IS NOT NUMERIC
11129: {{PPM{EXNUL{{{RETURN NULL IF LT
11130: {{PPM{EXFAL{{{FAIL IF EQ
11131: {{PPM{EXNUL{{{RETURN NULL IF GT
11132: {{EJC{{{{
11133: *
11134: * NOTANY
11135: *
11136: {S$NAY{ENT{{{{ENTRY POINT
11137: {{MOV{#P$NAS{R7{{SET PCODE FOR SINGLE CHAR ARG
11138: {{MOV{#P$NAY{R10{{PCODE FOR MULTI-CHAR ARG
11139: {{MOV{#P$NAD{R8{{SET PCODE FOR EXPR ARG
11140: {{JSR{PATST{{{CALL COMMON ROUTINE TO BUILD NODE
11141: {{ERR{151{NOTANY{{ARGUMENT IS NOT STRING OR EXPRESSION
11142: {{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD
11143: {{EJC{{{{
11144: *
11145: * OPSYN
11146: *
11147: {S$OPS{ENT{{{{ENTRY POINT
11148: {{JSR{GTSMI{{{LOAD THIRD ARGUMENT
11149: {{ERR{152{OPSYN{{THIRD ARGUMENT IS NOT INTEGER
11150: {{ERR{153{OPSYN{{THIRD ARGUMENT IS NEGATIVE OR TOO LARGE
11151: {{MOV{R8{R7{{IF OK, SAVE THIRD ARGUMNET
11152: {{MOV{(SP)+{R9{{LOAD SECOND ARGUMENT
11153: {{JSR{GTNVR{{{LOCATE VARIABLE BLOCK
11154: {{ERR{154{OPSYN{{SECOND ARG IS NOT NATURAL VARIABLE NAME
11155: {{MOV{4*VRFNC(R9){R10{{IF OK, LOAD FUNCTION BLOCK POINTER
11156: {{BNZ{R7{SOPS2{{JUMP IF OPERATOR OPSYN CASE
11157: *
11158: * HERE FOR FUNCTION OPSYN (THIRD ARG ZERO)
11159: *
11160: {{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT
11161: {{JSR{GTNVR{{{GET VRBLK POINTER
11162: {{ERR{155{OPSYN{{FIRST ARG IS NOT NATURAL VARIABLE NAME
11163: *
11164: * MERGE HERE TO PERFORM FUNCTION DEFINITION
11165: *
11166: {SOPS1{JSR{DFFNC{{{CALL FUNCTION DEFINER
11167: {{BRN{EXNUL{{{EXIT WITH NULL RESULT
11168: *
11169: * HERE FOR OPERATOR OPSYN (THIRD ARG NON-ZERO)
11170: *
11171: {SOPS2{JSR{GTSTG{{{GET OPERATOR NAME
11172: {{PPM{SOPS5{{{JUMP IF NOT STRING
11173: {{BNE{R6{#NUM01{SOPS5{ERROR IF NOT ONE CHAR LONG
11174: {{PLC{R9{{{ELSE POINT TO CHARACTER
11175: {{LCH{R8{(R9){{LOAD CHARACTER NAME
11176: {{EJC{{{{
11177: *
11178: * OPSYN (CONTINUED)
11179: *
11180: * NOW SET TO SEARCH FOR MATCHING UNARY OR BINARY OPERATOR
11181: * NAME AS APPROPRIATE. NOTE THAT THERE ARE =OPBUN UNDEFINED
11182: * BINARY OPERATORS AND =OPUUN UNDEFINED UNARY OPERATORS.
11183: *
11184: {{MOV{#R$UUB{R6{{POINT TO UNOP POINTERS IN CASE
11185: {{MOV{#OPNSU{R9{{POINT TO NAMES OF UNARY OPERATORS
11186: {{ADD{#OPBUN{R7{{ADD NO. OF UNDEFINED BINARY OPS
11187: {{BEQ{R7{#OPUUN{SOPS3{JUMP IF UNOP (THIRD ARG WAS 1)
11188: {{MOV{#R$UBA{R6{{ELSE POINT TO BINARY OPERATOR PTRS
11189: {{MOV{#OPSNB{R9{{POINT TO NAMES OF BINARY OPERATORS
11190: {{MOV{#OPBUN{R7{{SET NUMBER OF UNDEFINED BINOPS
11191: *
11192: * MERGE HERE TO CHECK LIST (WB = NUMBER TO CHECK)
11193: *
11194: {SOPS3{LCT{R7{R7{{SET COUNTER TO CONTROL LOOP
11195: *
11196: * LOOP TO SEARCH FOR NAME MATCH
11197: *
11198: {SOPS4{BEQ{R8{(R9){SOPS6{JUMP IF NAMES MATCH
11199: {{ICA{R6{{{ELSE PUSH POINTER TO FUNCTION PTR
11200: {{ICA{R9{{{BUMP POINTER
11201: {{BCT{R7{SOPS4{{LOOP BACK TILL ALL CHECKED
11202: *
11203: * HERE IF BAD OPERATOR NAME
11204: *
11205: {SOPS5{ERB{156{OPSYN{{FIRST ARG IS NOT CORRECT OPERATOR NAME
11206: *
11207: * COME HERE ON FINDING A MATCH IN THE OPERATOR NAME TABLE
11208: *
11209: {SOPS6{MOV{R6{R9{{COPY POINTER TO FUNCTION BLOCK PTR
11210: {{SUB{#4*VRFNC{R9{{MAKE IT LOOK LIKE DUMMY VRBLK
11211: {{BRN{SOPS1{{{MERGE BACK TO DEFINE OPERATOR
11212: {{EJC{{{{
11213: *
11214: * OUTPUT
11215: *
11216: {S$OUP{ENT{{{{ENTRY POINT
11217: {{MOV{#NUM03{R7{{OUTPUT FLAG
11218: {{JSR{IOPUT{{{CALL INPUT/OUTPUT ASSOC. ROUTINE
11219: {{ERR{157{OUTPUT{{THIRD ARGUMENT IS NOT A STRING
11220: {{ERR{158{INAPPROPRIATE{{SECOND ARGUMENT FOR OUTPUT
11221: {{ERR{159{INAPPROPRIATE{{FIRST ARGUMENT FOR OUTPUT
11222: {{ERR{160{INAPPROPRIATE{{FILE SPECIFICATION FOR OUTPUT
11223: {{PPM{EXFAL{{{FAIL IF FILE DOES NOT EXIST
11224: {{ERR{161{OUTPUT{{FILE CANNOT BE WRITTEN TO
11225: {{BRN{EXNUL{{{RETURN NULL STRING
11226: {{EJC{{{{
11227: *
11228: * POS
11229: *
11230: {S$POS{ENT{{{{ENTRY POINT
11231: {{MOV{#P$POS{R7{{SET PCODE FOR INTEGER ARG CASE
11232: {{MOV{#P$PSD{R6{{SET PCODE FOR EXPRESSION ARG CASE
11233: {{JSR{PATIN{{{CALL COMMON ROUTINE TO BUILD NODE
11234: {{ERR{162{POS{{ARGUMENT IS NOT INTEGER OR EXPRESSION
11235: {{ERR{163{POS{{ARGUMENT IS NEGATIVE OR TOO LARGE
11236: {{BRN{EXIXR{{{RETURN PATTERN NODE
11237: {{EJC{{{{
11238: *
11239: * PROTOTYPE
11240: *
11241: {S$PRO{ENT{{{{ENTRY POINT
11242: {{MOV{(SP)+{R9{{LOAD ARGUMENT
11243: {{MOV{4*TBLEN(R9){R7{{LENGTH IF TABLE, VECTOR (=VCLEN)
11244: {{BTW{R7{{{CONVERT TO WORDS
11245: {{MOV{(R9){R6{{LOAD TYPE WORD OF ARGUMENT BLOCK
11246: {{BEQ{R6{#B$ART{SPRO4{JUMP IF ARRAY
11247: {{BEQ{R6{#B$TBT{SPRO1{JUMP IF TABLE
11248: {{BEQ{R6{#B$VCT{SPRO3{JUMP IF VECTOR
11249: {{BEQ{R6{#B$BCT{SPR05{JUMP IF BUFFER
11250: {{ERB{164{PROTOTYPE{{ARGUMENT IS NOT VALID OBJECT
11251: *
11252: * HERE FOR TABLE
11253: *
11254: {SPRO1{SUB{#TBSI${R7{{SUBTRACT STANDARD FIELDS
11255: *
11256: * MERGE FOR VECTOR
11257: *
11258: {SPRO2{MTI{R7{{{CONVERT TO INTEGER
11259: {{BRN{EXINT{{{EXIT WITH INTEGER RESULT
11260: *
11261: * HERE FOR VECTOR
11262: *
11263: {SPRO3{SUB{#VCSI${R7{{SUBTRACT STANDARD FIELDS
11264: {{BRN{SPRO2{{{MERGE
11265: *
11266: * HERE FOR ARRAY
11267: *
11268: {SPRO4{ADD{4*AROFS(R9){R9{{POINT TO PROTOTYPE FIELD
11269: {{MOV{(R9){R9{{LOAD PROTOTYPE
11270: {{BRN{EXIXR{{{RETURN PROTOTYPE AS RESULT
11271: *
11272: * HERE FOR BUFFER
11273: *
11274: {SPR05{MOV{4*BCBUF(R9){R9{{POINT TO BFBLK
11275: {{MTI{4*BFALC(R9){{{LOAD ALLOCATED LENGTH
11276: {{BRN{EXINT{{{EXIT WITH INTEGER ALLOCATION
11277: {{EJC{{{{
11278: *
11279: * REMDR
11280: *
11281: {S$RMD{ENT{{{{ENTRY POINT
11282: {{ZER{R7{{{SET POSITIVE FLAG
11283: {{MOV{(SP){R9{{LOAD SECOND ARGUMENT
11284: {{JSR{GTINT{{{CONVERT TO INTEGER
11285: {{ERR{165{REMDR{{SECOND ARGUMENT IS NOT INTEGER
11286: {{JSR{ARITH{{{CONVERT ARGS
11287: {{PPM{SRM01{{{FIRST ARG NOT INTEGER
11288: {{PPM{{{{SECOND ARG CHECKED ABOVE
11289: {{PPM{SRM01{{{FIRST ARG REAL
11290: {{LDI{4*ICVAL(R9){{{LOAD LEFT ARGUMENT VALUE
11291: {{RMI{4*ICVAL(R10){{{GET REMAINDER
11292: {{INO{EXINT{{{JUMP IF NO OVERFLOW
11293: {{ERB{167{REMDR{{CAUSED INTEGER OVERFLOW
11294: *
11295: * FAIL FIRST ARGUMENT
11296: *
11297: {SRM01{ERB{166{REMDR{{FIRST ARGUMENT IS NOT INTEGER
11298: {{EJC{{{{
11299: *
11300: * REPLACE
11301: *
11302: * THE ACTUAL REPLACE OPERATION USES AN SCBLK WHOSE CFP$A
11303: * CHARS CONTAIN THE TRANSLATED VERSIONS OF ALL THE CHARS.
11304: * THE TABLE POINTER IS REMEMBERED FROM CALL TO CALL AND
11305: * THE TABLE IS ONLY BUILT WHEN THE ARGUMENTS CHANGE.
11306: *
11307: {S$RPL{ENT{{{{ENTRY POINT
11308: {{JSR{GTSTG{{{LOAD THIRD ARGUMENT AS STRING
11309: {{ERR{168{REPLACE{{THIRD ARGUMENT IS NOT STRING
11310: {{MOV{R9{R10{{SAVE THIRD ARG PTR
11311: {{JSR{GTSTG{{{GET SECOND ARGUMENT
11312: {{ERR{169{REPLACE{{SECOND ARGUMENT IS NOT STRING
11313: *
11314: * CHECK TO SEE IF THIS IS THE SAME TABLE AS LAST TIME
11315: *
11316: {{BNE{R9{R$RA2{SRPL1{JUMP IF 2ND ARGUMENT DIFFERENT
11317: {{BEQ{R10{R$RA3{SRPL4{JUMP IF ARGS SAME AS LAST TIME
11318: *
11319: * HERE WE BUILD A NEW REPLACE TABLE (NOTE WA = 2ND ARG LEN)
11320: *
11321: {SRPL1{MOV{4*SCLEN(R10){R7{{LOAD 3RD ARGUMENT LENGTH
11322: {{BNE{R6{R7{SRPL5{JUMP IF ARGUMENTS NOT SAME LENGTH
11323: {{BZE{R7{SRPL5{{JUMP IF NULL 2ND ARGUMENT
11324: {{MOV{R10{R$RA3{{SAVE THIRD ARG FOR NEXT TIME IN
11325: {{MOV{R9{R$RA2{{SAVE SECOND ARG FOR NEXT TIME IN
11326: {{MOV{KVALP{R10{{POINT TO ALPHABET STRING
11327: {{MOV{4*SCLEN(R10){R6{{LOAD ALPHABET SCBLK LENGTH
11328: {{MOV{R$RPT{R9{{POINT TO CURRENT TABLE (IF ANY)
11329: {{BNZ{R9{SRPL2{{JUMP IF WE ALREADY HAVE A TABLE
11330: *
11331: * HERE WE ALLOCATE A NEW TABLE
11332: *
11333: {{JSR{ALOCS{{{ALLOCATE NEW TABLE
11334: {{MOV{R8{R6{{KEEP SCBLK LENGTH
11335: {{MOV{R9{R$RPT{{SAVE TABLE POINTER FOR NEXT TIME
11336: *
11337: * MERGE HERE WITH POINTER TO NEW TABLE BLOCK IN (XR)
11338: *
11339: {SRPL2{CTB{R6{SCSI${{COMPUTE LENGTH OF SCBLK
11340: {{MVW{{{{COPY TO GET INITIAL TABLE VALUES
11341: {{EJC{{{{
11342: *
11343: * REPLACE (CONTINUED)
11344: *
11345: * NOW WE MUST PLUG SELECTED ENTRIES AS REQUIRED. NOTE THAT
11346: * WE ARE SHORT OF INDEX REGISTERS FOR THE FOLLOWING LOOP.
11347: * HENCE THE NEED TO REPEATEDLY RE-INITIALISE CHAR PTR XL
11348: *
11349: {{MOV{R$RA2{R10{{POINT TO SECOND ARGUMENT
11350: {{LCT{R7{R7{{NUMBER OF CHARS TO PLUG
11351: {{ZER{R8{{{ZERO CHAR OFFSET
11352: {{MOV{R$RA3{R9{{POINT TO 3RD ARG
11353: {{PLC{R9{{{GET CHAR PTR FOR 3RD ARG
11354: *
11355: * LOOP TO PLUG CHARS
11356: *
11357: {SRPL3{MOV{R$RA2{R10{{POINT TO 2ND ARG
11358: {{PLC{R10{R8{{POINT TO NEXT CHAR
11359: {{ICV{R8{{{INCREMENT OFFSET
11360: {{LCH{R6{(R10){{GET NEXT CHAR
11361: {{MOV{R$RPT{R10{{POINT TO TRANSLATE TABLE
11362: {{PSC{R10{R6{{CONVERT CHAR TO OFFSET INTO TABLE
11363: {{LCH{R6{(R9)+{{GET TRANSLATED CHAR
11364: {{SCH{R6{(R10){{STORE IN TABLE
11365: {{CSC{R10{{{COMPLETE STORE CHARACTERS
11366: {{BCT{R7{SRPL3{{LOOP TILL DONE
11367: {{EJC{{{{
11368: *
11369: * REPLACE (CONTINUED)
11370: *
11371: * HERE TO PERFORM TRANSLATE
11372: *
11373: {SRPL4{JSR{GTSTG{{{GET FIRST ARGUMENT
11374: {{ERR{170{REPLACE{{FIRST ARGUMENT IS NOT STRING
11375: {{BZE{R6{EXNUL{{RETURN NULL IF NULL ARGUMENT
11376: {{MOV{R9{R10{{COPY POINTER
11377: {{MOV{R6{R8{{SAVE LENGTH
11378: {{CTB{R6{SCHAR{{GET SCBLK LENGTH
11379: {{JSR{ALLOC{{{ALLOCATE SPACE FOR COPY
11380: {{MOV{R9{R7{{SAVE ADDRESS OF COPY
11381: {{MVW{{{{MOVE SCBLK CONTENTS TO COPY
11382: {{MOV{R$RPT{R9{{POINT TO REPLACE TABLE
11383: {{PLC{R9{{{POINT TO CHARS OF TABLE
11384: {{MOV{R7{R10{{POINT TO STRING TO TRANSLATE
11385: {{PLC{R10{{{POINT TO CHARS OF STRING
11386: {{MOV{R8{R6{{SET NUMBER OF CHARS TO TRANSLATE
11387: {{TRC{{{{PERFORM TRANSLATION
11388: {{MOV{R7{-(SP){{STACK NEW STRING AS RESULT
11389: {{BRN{EXITS{{{RETURN WITH RESULT ON STACK
11390: *
11391: * ERROR POINT
11392: *
11393: {SRPL5{ERB{171{NULL{{OR UNEQUALLY LONG 2ND, 3RD ARGS TO REPLACE
11394: {{EJC{{{{
11395: *
11396: * REWIND
11397: *
11398: {S$REW{ENT{{{{ENTRY POINT
11399: {{JSR{IOFCB{{{CALL FCBLK ROUTINE
11400: {{ERR{172{REWIND{{ARGUMENT IS NOT A SUITABLE NAME
11401: {{ERR{173{REWIND{{ARGUMENT IS NULL
11402: {{JSR{SYSRW{{{CALL SYSTEM REWIND FUNCTION
11403: {{ERR{174{REWIND{{FILE DOES NOT EXIST
11404: {{ERR{175{REWIND{{FILE DOES NOT PERMIT REWIND
11405: {{ERR{176{REWIND{{CAUSED NON-RECOVERABLE ERROR
11406: {{BRN{EXNUL{{{EXIT WITH NULL RESULT IF NO ERROR
11407: {{EJC{{{{
11408: *
11409: * REVERSE
11410: *
11411: {S$RVS{ENT{{{{ENTRY POINT
11412: {{JSR{GTSTG{{{LOAD STRING ARGUMENT
11413: {{ERR{177{REVERSE{{ARGUMENT IS NOT STRING
11414: {{BZE{R6{EXIXR{{RETURN ARGUMENT IF NULL
11415: {{MOV{R9{R10{{ELSE SAVE POINTER TO STRING ARG
11416: {{JSR{ALOCS{{{ALLOCATE SPACE FOR NEW SCBLK
11417: {{MOV{R9{-(SP){{STORE SCBLK PTR ON STACK AS RESULT
11418: {{PSC{R9{{{PREPARE TO STORE IN NEW SCBLK
11419: {{PLC{R10{R8{{POINT PAST LAST CHAR IN ARGUMENT
11420: {{LCT{R8{R8{{SET LOOP COUNTER
11421: *
11422: * LOOP TO MOVE CHARS IN REVERSE ORDER
11423: *
11424: {SRVS1{LCH{R7{-(R10){{LOAD NEXT CHAR FROM ARGUMENT
11425: {{SCH{R7{(R9)+{{STORE IN RESULT
11426: {{BCT{R8{SRVS1{{LOOP TILL ALL MOVED
11427: {{CSC{R9{{{COMPLETE STORE CHARACTERS
11428: {{BRN{EXITS{{{AND THEN JUMP FOR NEXT CODE WORD
11429: {{EJC{{{{
11430: *
11431: * RPAD
11432: *
11433: {S$RPD{ENT{{{{ENTRY POINT
11434: {{JSR{GTSTG{{{GET PAD CHARACTER
11435: {{ERR{178{RPAD{{THIRD ARGUMENT IS NOT STRING
11436: {{PLC{R9{{{POINT TO CHARACTER (NULL IS BLANK)
11437: {{LCH{R7{(R9){{LOAD PAD CHARACTER
11438: {{JSR{GTSMI{{{GET PAD LENGTH
11439: {{ERR{179{RPAD{{SECOND ARGUMENT IS NOT INTEGER
11440: {{PPM{SRPD3{{{SKIP IF NEGATIVE OR LARGE
11441: *
11442: * MERGE TO CHECK FIRST ARG.
11443: *
11444: {SRPD1{JSR{GTSTG{{{GET FIRST ARGUMENT (STRING TO PAD)
11445: {{ERR{180{RPAD{{FIRST ARGUMENT IS NOT STRING
11446: {{BGE{R6{R8{EXIXR{RETURN 1ST ARG IF TOO LONG TO PAD
11447: {{MOV{R9{R10{{ELSE MOVE PTR TO STRING TO PAD
11448: *
11449: * NOW WE ARE READY FOR THE PAD
11450: *
11451: * (XL) POINTER TO STRING TO PAD
11452: * (WB) PAD CHARACTER
11453: * (WC) LENGTH TO PAD STRING TO
11454: *
11455: {{MOV{R8{R6{{COPY LENGTH
11456: {{JSR{ALOCS{{{ALLOCATE SCBLK FOR NEW STRING
11457: {{MOV{R9{-(SP){{SAVE AS RESULT
11458: {{MOV{4*SCLEN(R10){R6{{LOAD LENGTH OF ARGUMENT
11459: {{SUB{R6{R8{{CALCULATE NUMBER OF PAD CHARACTERS
11460: {{PSC{R9{{{POINT TO CHARS IN RESULT STRING
11461: {{LCT{R8{R8{{SET COUNTER FOR PAD LOOP
11462: *
11463: * COPY ARGUMENT STRING
11464: *
11465: {{BZE{R6{SRPD2{{JUMP IF ARGUMENT IS NULL
11466: {{PLC{R10{{{ELSE POINT TO ARGUMENT CHARS
11467: {{MVC{{{{MOVE CHARACTERS TO RESULT STRING
11468: *
11469: * LOOP TO SUPPLY PAD CHARACTERS
11470: *
11471: {SRPD2{SCH{R7{(R9)+{{STORE PAD CHARACTER, BUMP PTR
11472: {{BCT{R8{SRPD2{{LOOP TILL ALL PAD CHARS STORED
11473: {{CSC{R9{{{COMPLETE CHARACTER STORING
11474: {{BRN{EXITS{{{AND EXIT FOR NEXT WORD
11475: *
11476: * HERE IF 2ND ARG IS NEGATIVE OR LARGE
11477: *
11478: {SRPD3{ZER{R8{{{ZERO PAD COUNT
11479: {{BRN{SRPD1{{{MERGE
11480: {{EJC{{{{
11481: *
11482: * RTAB
11483: *
11484: {S$RTB{ENT{{{{ENTRY POINT
11485: {{MOV{#P$RTB{R7{{SET PCODE FOR INTEGER ARG CASE
11486: {{MOV{#P$RTD{R6{{SET PCODE FOR EXPRESSION ARG CASE
11487: {{JSR{PATIN{{{CALL COMMON ROUTINE TO BUILD NODE
11488: {{ERR{181{RTAB{{ARGUMENT IS NOT INTEGER OR EXPRESSION
11489: {{ERR{182{RTAB{{ARGUMENT IS NEGATIVE OR TOO LARGE
11490: {{BRN{EXIXR{{{RETURN PATTERN NODE
11491: {{EJC{{{{
11492: *
11493: * SET
11494: *
11495: {S$SET{ENT{{{{ENTRY POINT
11496: {{MOV{(SP)+{R$IO2{{SAVE THIRD ARG
11497: {{MOV{(SP)+{R$IO1{{SAVE SECOND ARG
11498: {{JSR{IOFCB{{{CALL FCBLK ROUTINE
11499: {{ERR{291{SET{{FIRST ARGUMENT IS NOT A SUITABLE NAME
11500: {{ERR{292{SET{{FIRST ARGUMENT IS NULL
11501: {{MOV{R$IO1{R7{{LOAD SECOND ARG
11502: {{MOV{R$IO2{R8{{LOAD THIRD ARG
11503: {{JSR{SYSST{{{CALL SYSTEM SET ROUTINE
11504: {{ERR{293{INAPPROPRIATE{{SECOND ARGUMENT TO SET
11505: {{ERR{294{INAPPROPRIATE{{THIRD ARGUMENT TO SET
11506: {{ERR{295{SET{{FILE DOES NOT EXIST
11507: {{ERR{296{SET{{FILE DOES NOT PERMIT SETTING FILE POINTER
11508: {{ERR{297{SET{{CAUSED NON-RECOVERABLE I/O ERROR
11509: {{BRN{EXNUL{{{OTHERWISEW RETURN NULL
11510: {{EJC{{{{
11511: *
11512: * TAB
11513: *
11514: {S$TAB{ENT{{{{ENTRY POINT
11515: {{MOV{#P$TAB{R7{{SET PCODE FOR INTEGER ARG CASE
11516: {{MOV{#P$TBD{R6{{SET PCODE FOR EXPRESSION ARG CASE
11517: {{JSR{PATIN{{{CALL COMMON ROUTINE TO BUILD NODE
11518: {{ERR{183{TAB{{ARGUMENT IS NOT INTEGER OR EXPRESSION
11519: {{ERR{184{TAB{{ARGUMENT IS NEGATIVE OR TOO LARGE
11520: {{BRN{EXIXR{{{RETURN PATTERN NODE
11521: {{EJC{{{{
11522: *
11523: * RPOS
11524: *
11525: {S$RPS{ENT{{{{ENTRY POINT
11526: {{MOV{#P$RPS{R7{{SET PCODE FOR INTEGER ARG CASE
11527: {{MOV{#P$RPD{R6{{SET PCODE FOR EXPRESSION ARG CASE
11528: {{JSR{PATIN{{{CALL COMMON ROUTINE TO BUILD NODE
11529: {{ERR{185{RPOS{{ARGUMENT IS NOT INTEGER OR EXPRESSION
11530: {{ERR{186{RPOS{{ARGUMENT IS NEGATIVE OR TOO LARGE
11531: {{BRN{EXIXR{{{RETURN PATTERN NODE
11532: {{EJC{{{{
11533: *
11534: * RSORT
11535: *
11536: {S$RSR{ENT{{{{ENTRY POINT
11537: {{MNZ{R6{{{MARK AS RSORT
11538: {{JSR{SORTA{{{CALL SORT ROUTINE
11539: {{BRN{EXSID{{{RETURN, SETTING IDVAL
11540: {{EJC{{{{
11541: *
11542: * SETEXIT
11543: *
11544: {S$STX{ENT{{{{ENTRY POINT
11545: {{MOV{(SP)+{R9{{LOAD ARGUMENT
11546: {{MOV{STXVR{R6{{LOAD OLD VRBLK POINTER
11547: {{ZER{R10{{{LOAD ZERO IN CASE NULL ARG
11548: {{BEQ{R9{#NULLS{SSTX1{JUMP IF NULL ARGUMENT (RESET CALL)
11549: {{JSR{GTNVR{{{ELSE GET SPECIFIED VRBLK
11550: {{PPM{SSTX2{{{JUMP IF NOT NATURAL VARIABLE
11551: {{MOV{4*VRLBL(R9){R10{{ELSE LOAD LABEL
11552: {{BEQ{R10{#STNDL{SSTX2{JUMP IF LABEL IS NOT DEFINED
11553: {{BNE{(R10){#B$TRT{SSTX1{JUMP IF NOT TRAPPED
11554: {{MOV{4*TRLBL(R10){R10{{ELSE LOAD PTR TO REAL LABEL CODE
11555: *
11556: * HERE TO SET/RESET SETEXIT TRAP
11557: *
11558: {SSTX1{MOV{R9{STXVR{{STORE NEW VRBLK POINTER (OR NULL)
11559: {{MOV{R10{R$SXC{{STORE NEW CODE PTR (OR ZERO)
11560: {{BEQ{R6{#NULLS{EXNUL{RETURN NULL IF NULL RESULT
11561: {{MOV{R6{R9{{ELSE COPY VRBLK POINTER
11562: {{BRN{EXVNM{{{AND RETURN BUILDING NMBLK
11563: *
11564: * HERE IF BAD ARGUMENT
11565: *
11566: {SSTX2{ERB{187{SETEXIT{{ARGUMENT IS NOT LABEL NAME OR NULL
11567: {{EJC{{{{
11568: *
11569: * SORT
11570: *
11571: {S$SRT{ENT{{{{ENTRY POINT
11572: {{ZER{R6{{{MARK AS SORT
11573: {{JSR{SORTA{{{CALL SORT ROUTINE
11574: {{BRN{EXSID{{{RETURN, SETTING IDVAL
11575: {{EJC{{{{
11576: *
11577: * SPAN
11578: *
11579: {S$SPN{ENT{{{{ENTRY POINT
11580: {{MOV{#P$SPS{R7{{SET PCODE FOR SINGLE CHAR ARG
11581: {{MOV{#P$SPN{R10{{SET PCODE FOR MULTI-CHAR ARG
11582: {{MOV{#P$SPD{R8{{SET PCODE FOR EXPRESSION ARG
11583: {{JSR{PATST{{{CALL COMMON ROUTINE TO BUILD NODE
11584: {{ERR{188{SPAN{{ARGUMENT IS NOT STRING OR EXPRESSION
11585: {{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD
11586: {{EJC{{{{
11587: *
11588: * SIZE
11589: *
11590: {S$SI${ENT{{{{ENTRY POINT
11591: {{MOV{(SP){R9{{LOAD ARGUMENT
11592: {{BNE{(R9){#B$BCT{SSI$1{BRANCH IF NOT BUFFER
11593: {{ICA{SP{{{ELSE POP ARGUMENT
11594: {{MTI{4*BCLEN(R9){{{LOAD DEFINED LENGTH
11595: {{BRN{EXINT{{{EXIT WITH INTEGER
11596: *
11597: * HERE IF NOT BUFFER
11598: *
11599: {SSI$1{JSR{GTSTG{{{LOAD STRING ARGUMENT
11600: {{ERR{189{SIZE{{ARGUMENT IS NOT STRING
11601: {{MTI{R6{{{LOAD LENGTH AS INTEGER
11602: {{BRN{EXINT{{{EXIT WITH INTEGER RESULT
11603: {{EJC{{{{
11604: *
11605: * STOPTR
11606: *
11607: {S$STT{ENT{{{{ENTRY POINT
11608: {{ZER{R10{{{INDICATE STOPTR CASE
11609: {{JSR{TRACE{{{CALL TRACE PROCEDURE
11610: {{ERR{190{STOPTR{{FIRST ARGUMENT IS NOT APPROPRIATE NAME
11611: {{ERR{191{STOPTR{{SECOND ARGUMENT IS NOT TRACE TYPE
11612: {{BRN{EXNUL{{{RETURN NULL
11613: {{EJC{{{{
11614: *
11615: * SUBSTR
11616: *
11617: {S$SUB{ENT{{{{ENTRY POINT
11618: {{JSR{GTSMI{{{LOAD THIRD ARGUMENT
11619: {{ERR{192{SUBSTR{{THIRD ARGUMENT IS NOT INTEGER
11620: {{PPM{EXFAL{{{JUMP IF NEGATIVE OR TOO LARGE
11621: {{MOV{R9{SBSSV{{SAVE THIRD ARGUMENT
11622: {{JSR{GTSMI{{{LOAD SECOND ARGUMENT
11623: {{ERR{193{SUBSTR{{SECOND ARGUMENT IS NOT INTEGER
11624: {{PPM{EXFAL{{{JUMP IF OUT OF RANGE
11625: {{MOV{R9{R7{{SAVE SECOND ARGUMENT
11626: {{BZE{R7{EXFAL{{JUMP IF SECOND ARGUMENT ZERO
11627: {{DCV{R7{{{ELSE DECREMENT FOR ONES ORIGIN
11628: {{MOV{(SP){R10{{GET FIRST ARG PTR
11629: {{BNE{(R10){#B$BCT{SSUBA{BRANCH IF NOT BUFFER
11630: {{MOV{4*BCBUF(R10){R9{{GET BFBLK PTR
11631: {{MOV{4*BCLEN(R10){R6{{GET LENGTH
11632: {{BRN{SSUBB{{{MERGE
11633: *
11634: * HERE IF NOT BUFFER TO GET STRING
11635: *
11636: {SSUBA{JSR{GTSTG{{{LOAD FIRST ARGUMENT
11637: {{ERR{194{SUBSTR{{FIRST ARGUMENT IS NOT STRING
11638: *
11639: * MERGE WITH BFBLK OR SCBLK PTR IN XR. WA HAS LENGTH
11640: *
11641: {SSUBB{MOV{SBSSV{R8{{RELOAD THIRD ARGUMENT
11642: {{BNZ{R8{SSUB1{{SKIP IF THIRD ARG GIVEN
11643: {{MOV{R6{R8{{ELSE GET STRING LENGTH
11644: {{BGT{R7{R8{EXFAL{FAIL IF IMPROPER
11645: {{SUB{R7{R8{{REDUCE BY OFFSET TO START
11646: *
11647: * MERGE
11648: *
11649: {SSUB1{MOV{R6{R10{{SAVE STRING LENGTH
11650: {{MOV{R8{R6{{SET LENGTH OF SUBSTRING
11651: {{ADD{R7{R8{{ADD 2ND ARG TO 3RD ARG
11652: {{BGT{R8{R10{EXFAL{JUMP IF IMPROPER SUBSTRING
11653: {{MOV{R9{R10{{COPY POINTER TO FIRST ARG
11654: {{JSR{SBSTR{{{BUILD SUBSTRING
11655: {{BRN{EXIXR{{{AND JUMP FOR NEXT CODE WORD
11656: {{EJC{{{{
11657: *
11658: * TABLE
11659: *
11660: {S$TBL{ENT{{{{ENTRY POINT
11661: {{MOV{(SP)+{R10{{GET INITIAL LOOKUP VALUE
11662: {{ICA{SP{{{POP SECOND ARGUMENT
11663: {{JSR{GTSMI{{{LOAD ARGUMENT
11664: {{ERR{195{TABLE{{ARGUMENT IS NOT INTEGER
11665: {{ERR{196{TABLE{{ARGUMENT IS OUT OF RANGE
11666: {{BNZ{R8{STBL1{{JUMP IF NON-ZERO
11667: {{MOV{#TBNBK{R8{{ELSE SUPPLY DEFAULT VALUE
11668: *
11669: * MERGE HERE WITH NUMBER OF HEADERS IN WA
11670: *
11671: {STBL1{MOV{R8{R6{{COPY NUMBER OF HEADERS
11672: {{ADD{#TBSI${R6{{ADJUST FOR STANDARD FIELDS
11673: {{WTB{R6{{{CONVERT LENGTH TO BYTES
11674: {{JSR{ALLOC{{{ALLOCATE SPACE FOR TBBLK
11675: {{MOV{R9{R7{{COPY POINTER TO TBBLK
11676: {{MOV{#B$TBT{(R9)+{{STORE TYPE WORD
11677: {{ZER{(R9)+{{{ZERO ID FOR THE MOMENT
11678: {{MOV{R6{(R9)+{{STORE LENGTH (TBLEN)
11679: {{MOV{R10{(R9)+{{STORE INITIAL LOOKUP VALUE
11680: {{LCT{R8{R8{{SET LOOP COUNTER (NUM HEADERS)
11681: *
11682: * LOOP TO INITIALIZE ALL BUCKET POINTERS
11683: *
11684: {STBL2{MOV{R7{(R9)+{{STORE TBBLK PTR IN BUCKET HEADER
11685: {{BCT{R8{STBL2{{LOOP TILL ALL STORED
11686: {{MOV{R7{R9{{RECALL POINTER TO TBBLK
11687: {{BRN{EXSID{{{EXIT SETTING IDVAL
11688: {{EJC{{{{
11689: *
11690: * TIME
11691: *
11692: {S$TIM{ENT{{{{ENTRY POINT
11693: {{JSR{SYSTM{{{GET TIMER VALUE
11694: {{SBI{TIMSX{{{SUBTRACT STARTING TIME
11695: {{BRN{EXINT{{{EXIT WITH INTEGER VALUE
11696: {{EJC{{{{
11697: *
11698: * TRACE
11699: *
11700: {S$TRA{ENT{{{{ENTRY POINT
11701: {{BEQ{4*3(SP){#NULLS{STR03{JUMP IF FIRST ARGUMENT IS NULL
11702: {{MOV{(SP)+{R9{{LOAD FOURTH ARGUMENT
11703: {{ZER{R10{{{TENTATIVELY SET ZERO POINTER
11704: {{BEQ{R9{#NULLS{STR02{JUMP IF 4TH ARGUMENT IS NULL
11705: {{JSR{GTNVR{{{ELSE POINT TO VRBLK
11706: {{PPM{STR01{{{JUMP IF NOT VARIABLE NAME
11707: {{MOV{4*VRFNC(R9){R10{{ELSE LOAD FUNCTION POINTER
11708: {{BNE{R10{#STNDF{STR02{JUMP IF FUNCTION IS DEFINED
11709: *
11710: * HERE FOR BAD FOURTH ARGUMENT
11711: *
11712: {STR01{ERB{197{TRACE{{FOURTH ARG IS NOT FUNCTION NAME OR NULL
11713: *
11714: * HERE WITH FUNCTION POINTER IN XL
11715: *
11716: {STR02{MOV{(SP)+{R9{{LOAD THIRD ARGUMENT (TAG)
11717: {{ZER{R7{{{SET ZERO AS TRTYP VALUE FOR NOW
11718: {{JSR{TRBLD{{{BUILD TRBLK FOR TRACE CALL
11719: {{MOV{R9{R10{{MOVE TRBLK POINTER FOR TRACE
11720: {{JSR{TRACE{{{CALL TRACE PROCEDURE
11721: {{ERR{198{TRACE{{FIRST ARGUMENT IS NOT APPROPRIATE NAME
11722: {{ERR{199{TRACE{{SECOND ARGUMENT IS NOT TRACE TYPE
11723: {{BRN{EXNUL{{{RETURN NULL
11724: *
11725: * HERE TO CALL SYSTEM TRACE TOGGLE ROUTINE
11726: *
11727: {STR03{JSR{SYSTT{{{CALL IT
11728: {{ADD{#4*NUM04{SP{{POP TRACE ARGUMENTS
11729: {{BRN{EXNUL{{{RETURN
11730: {{EJC{{{{
11731: *
11732: * TRIM
11733: *
11734: {S$TRM{ENT{{{{ENTRY POINT
11735: {{JSR{GTSTG{{{LOAD ARGUMENT AS STRING
11736: {{ERR{200{TRIM{{ARGUMENT IS NOT STRING
11737: {{BZE{R6{EXNUL{{RETURN NULL IF ARGUMENT IS NULL
11738: {{MOV{R9{R10{{COPY STRING POINTER
11739: {{CTB{R6{SCHAR{{GET BLOCK LENGTH
11740: {{JSR{ALLOC{{{ALLOCATE COPY SAME SIZE
11741: {{MOV{R9{R7{{SAVE POINTER TO COPY
11742: {{MVW{{{{COPY OLD STRING BLOCK TO NEW
11743: {{MOV{R7{R9{{RESTORE PTR TO NEW BLOCK
11744: {{JSR{TRIMR{{{TRIM BLANKS (WB IS NON-ZERO)
11745: {{BRN{EXIXR{{{EXIT WITH RESULT IN XR
11746: {{EJC{{{{
11747: *
11748: * UNLOAD
11749: *
11750: {S$UNL{ENT{{{{ENTRY POINT
11751: {{MOV{(SP)+{R9{{LOAD ARGUMENT
11752: {{JSR{GTNVR{{{POINT TO VRBLK
11753: {{ERR{201{UNLOAD{{ARGUMENT IS NOT NATURAL VARIABLE NAME
11754: {{MOV{#STNDF{R10{{GET PTR TO UNDEFINED FUNCTION
11755: {{JSR{DFFNC{{{UNDEFINE NAMED FUNCTION
11756: {{BRN{EXNUL{{{RETURN NULL AS RESULT
11757: {{TTL{S{{{P I T B O L -- UTILITY PROCEDURES
11758: *
11759: * THE FOLLOWING SECTION CONTAINS PROCEDURES WHICH ARE
11760: * USED FOR VARIOUS PURPOSES THROUGHOUT THE SYSTEM.
11761: *
11762: * EACH PROCEDURE IS PRECEDED BY A DESCRIPTION OF THE
11763: * CALLING SEQUENCE. USUALLY THE ARGUMENTS ARE IN REGISTERS
11764: * BUT ARGUMENTS CAN ALSO OCCUR ON THE STACK AND AS
11765: * PARAMETERS ASSEMBLED AFTER THE JSR INSTRUCTION.
11766: *
11767: * THE FOLLOWING CONSIDERATIONS APPLY TO THESE DESCRIPTIONS.
11768: *
11769: * 1) THE STACK POINTER (XS) IS NOT CHANGED UNLESS THE
11770: * CHANGE IS EXPLICITLY DOCUMENTED IN THE CALL.
11771: *
11772: * 2) REGISTERS WHOSE ENTRY VALUES ARE NOT MENTIONED
11773: * MAY CONTAIN ANY VALUE EXCEPT THAT XL,XR MAY ONLY
11774: * CONTAIN PROPER (COLLECTABLE) POINTER VALUES.
11775: * THIS CONDITION ON XR MEANS THAT THE CALLED ROUTINE
11776: * MAY IF IT CHOOSES PRESERVE XR BY STACKING.
11777: *
11778: * 3) REGISTERS NOT MENTIONED ON EXIT CONTAIN THE SAME
11779: * VALUES AS THEY DID ON ENTRY EXCEPT THAT VALUES IN
11780: * XR,XL MAY HAVE BEEN RELOCATED BY THE COLLECTOR.
11781: *
11782: * 4) REGISTERS WHICH ARE DESTROYED ON EXIT MAY CONTAIN
11783: * ANY VALUE EXCEPT THAT VALUES IN XL,XR ARE PROPER
11784: * (COLLECTABLE) POINTERS.
11785: *
11786: * 5) THE CODE POINTER REGISTER POINTS TO THE CURRENT
11787: * CODE LOCATION ON ENTRY AND IS UNCHANGED ON EXIT.
11788: *
11789: * IN THE ABOVE DESCRIPTION, A COLLECTABLE POINTER IS ONE
11790: * WHICH EITHER POINTS OUTSIDE THE DYNAMIC REGION OR
11791: * POINTS TO THE START OF A BLOCK IN THE DYNAMIC REGION.
11792: *
11793: * IN THOSE CASES WHERE THE CALLING SEQUENCE CONTAINS
11794: * PARAMETERS WHICH ARE USED AS ALTERNATE RETURN POINTS,
11795: * THESE PARAMETERS MAY BE REPLACED BY ERROR CODES
11796: * ASSEMBLED WITH THE ERR INSTRUCTION. THIS WILL RESULT
11797: * IN THE POSTING OF THE ERROR IF THE RETURN IS TAKEN.
11798: *
11799: * THE PROCEDURES ALL HAVE NAMES CONSISTING OF FIVE LETTERS
11800: * AND ARE IN ALPHABETICAL ORDER BY THEIR NAMES.
11801: {{EJC{{{{
11802: *
11803: * ACESS - ACCESS VARIABLE VALUE WITH TRACE/INPUT CHECKS
11804: *
11805: * ACESS LOADS THE VALUE OF A VARIABLE. TRACE AND INPUT
11806: * ASSOCIATIONS ARE TESTED FOR AND EXECUTED AS REQUIRED.
11807: * ACESS ALSO HANDLES THE SPECIAL CASES OF PSEUDO-VARIABLES.
11808: *
11809: * (XL) VARIABLE NAME BASE
11810: * (WA) VARIABLE NAME OFFSET
11811: * JSR ACESS CALL TO ACCESS VALUE
11812: * PPM LOC TRANSFER LOC IF ACCESS FAILURE
11813: * (XR) VARIABLE VALUE
11814: * (WA,WB,WC) DESTROYED
11815: * (XL,RA) DESTROYED
11816: *
11817: * FAILURE CAN OCCUR IF AN INPUT ASSOCIATION CAUSES AN END
11818: * OF FILE CONDITION OR IF THE EVALUATION OF AN EXPRESSION
11819: * ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS.
11820: *
11821: {ACESS{PRC{R{1{{ENTRY POINT (RECURSIVE)
11822: {{MOV{R10{R9{{COPY NAME BASE
11823: {{ADD{R6{R9{{POINT TO VARIABLE LOCATION
11824: {{MOV{(R9){R9{{LOAD VARIABLE VALUE
11825: *
11826: * LOOP HERE TO CHECK FOR SUCCESSIVE TRBLKS
11827: *
11828: {ACS02{BNE{(R9){#B$TRT{ACS18{JUMP IF NOT TRAPPED
11829: *
11830: * HERE IF TRAPPED
11831: *
11832: {{BEQ{R9{#TRBKV{ACS12{JUMP IF KEYWORD VARIABLE
11833: {{BNE{R9{#TRBEV{ACS05{JUMP IF NOT EXPRESSION VARIABLE
11834: *
11835: * HERE FOR EXPRESSION VARIABLE, EVALUATE VARIABLE
11836: *
11837: {{MOV{4*EVEXP(R10){R9{{LOAD EXPRESSION POINTER
11838: {{ZER{R7{{{EVALUATE BY VALUE
11839: {{JSR{EVALX{{{EVALUATE EXPRESSION
11840: {{PPM{ACS04{{{JUMP IF EVALUATION FAILURE
11841: {{BRN{ACS02{{{CHECK VALUE FOR MORE TRBLKS
11842: {{EJC{{{{
11843: *
11844: * ACESS (CONTINUED)
11845: *
11846: * HERE ON READING END OF FILE
11847: *
11848: {ACS03{ADD{#4*NUM03{SP{{POP TRBLK PTR, NAME BASE AND OFFSET
11849: {{MOV{R9{DNAMP{{POP UNUSED SCBLK
11850: *
11851: * MERGE HERE WHEN EVALUATION OF EXPRESSION FAILS
11852: *
11853: {ACS04{EXI{1{{{TAKE ALTERNATE (FAILURE) RETURN
11854: *
11855: * HERE IF NOT KEYWORD OR EXPRESSION VARIABLE
11856: *
11857: {ACS05{MOV{4*TRTYP(R9){R7{{LOAD TRAP TYPE CODE
11858: {{BNZ{R7{ACS10{{JUMP IF NOT INPUT ASSOCIATION
11859: {{BZE{KVINP{ACS09{{IGNORE INPUT ASSOC IF INPUT IS OFF
11860: *
11861: * HERE FOR INPUT ASSOCIATION
11862: *
11863: {{MOV{R10{-(SP){{STACK NAME BASE
11864: {{MOV{R6{-(SP){{STACK NAME OFFSET
11865: {{MOV{R9{-(SP){{STACK TRBLK POINTER
11866: {{MOV{4*TRFPT(R9){R10{{GET FILE CTRL BLK PTR OR ZERO
11867: {{BNZ{R10{ACS06{{JUMP IF NOT STANDARD INPUT FILE
11868: {{BEQ{4*TRTER(R9){#V$TER{ACS21{JUMP IF TERMINAL
11869: *
11870: * HERE TO READ FROM STANDARD INPUT FILE
11871: *
11872: {{MOV{CSWIN{R6{{LENGTH FOR READ BUFFER
11873: {{JSR{ALOCS{{{BUILD STRING OF APPROPRIATE LENGTH
11874: {{JSR{SYSRD{{{READ NEXT STANDARD INPUT IMAGE
11875: {{PPM{ACS03{{{JUMP TO FAIL EXIT IF END OF FILE
11876: {{BRN{ACS07{{{ELSE MERGE WITH OTHER FILE CASE
11877: *
11878: * HERE FOR INPUT FROM OTHER THAN STANDARD INPUT FILE
11879: *
11880: {ACS06{MOV{R10{R6{{FCBLK PTR
11881: {{JSR{SYSIL{{{GET INPUT RECORD MAX LENGTH (TO WA)
11882: {{JSR{ALOCS{{{ALLOCATE STRING OF CORRECT SIZE
11883: {{MOV{R10{R6{{FCBLK PTR
11884: {{JSR{SYSIN{{{CALL SYSTEM INPUT ROUTINE
11885: {{PPM{ACS03{{{JUMP TO FAIL EXIT IF END OF FILE
11886: {{PPM{ACS22{{{ERROR
11887: {{PPM{ACS23{{{ERROR
11888: {{EJC{{{{
11889: *
11890: * ACESS (CONTINUED)
11891: *
11892: * MERGE HERE AFTER OBTAINING INPUT RECORD
11893: *
11894: {ACS07{MOV{KVTRM{R7{{LOAD TRIM INDICATOR
11895: {{JSR{TRIMR{{{TRIM RECORD AS REQUIRED
11896: {{MOV{R9{R7{{COPY RESULT POINTER
11897: {{MOV{(SP){R9{{RELOAD POINTER TO TRBLK
11898: *
11899: * LOOP TO CHASE TO END OF TRBLK CHAIN AND STORE VALUE
11900: *
11901: {ACS08{MOV{R9{R10{{SAVE POINTER TO THIS TRBLK
11902: {{MOV{4*TRNXT(R9){R9{{LOAD FORWARD POINTER
11903: {{BEQ{(R9){#B$TRT{ACS08{LOOP IF THIS IS ANOTHER TRBLK
11904: {{MOV{R7{4*TRNXT(R10){{ELSE STORE RESULT AT END OF CHAIN
11905: {{MOV{(SP)+{R9{{RESTORE INITIAL TRBLK POINTER
11906: {{MOV{(SP)+{R6{{RESTORE NAME OFFSET
11907: {{MOV{(SP)+{R10{{RESTORE NAME BASE POINTER
11908: *
11909: * COME HERE TO MOVE TO NEXT TRBLK
11910: *
11911: {ACS09{MOV{4*TRNXT(R9){R9{{LOAD FORWARD PTR TO NEXT VALUE
11912: {{BRN{ACS02{{{BACK TO CHECK IF TRAPPED
11913: *
11914: * HERE TO CHECK FOR ACCESS TRACE TRBLK
11915: *
11916: {ACS10{BNE{R7{#TRTAC{ACS09{LOOP BACK IF NOT ACCESS TRACE
11917: {{BZE{KVTRA{ACS09{{IGNORE ACCESS TRACE IF TRACE OFF
11918: {{DCV{KVTRA{{{ELSE DECREMENT TRACE COUNT
11919: {{BZE{4*TRFNC(R9){ACS11{{JUMP IF PRINT TRACE
11920: {{EJC{{{{
11921: *
11922: * ACESS (CONTINUED)
11923: *
11924: * HERE FOR FULL FUNCTION TRACE
11925: *
11926: {{JSR{TRXEQ{{{CALL ROUTINE TO EXECUTE TRACE
11927: {{BRN{ACS09{{{JUMP FOR NEXT TRBLK
11928: *
11929: * HERE FOR CASE OF PRINT TRACE
11930: *
11931: {ACS11{JSR{PRTSN{{{PRINT STATEMENT NUMBER
11932: {{JSR{PRTNV{{{PRINT NAME = VALUE
11933: {{BRN{ACS09{{{JUMP BACK FOR NEXT TRBLK
11934: *
11935: * HERE FOR KEYWORD VARIABLE
11936: *
11937: {ACS12{MOV{4*KVNUM(R10){R9{{LOAD KEYWORD NUMBER
11938: {{BGE{R9{#K$V$${ACS14{JUMP IF NOT ONE WORD VALUE
11939: {{MTI{L^KVABE(R9){{{ELSE LOAD VALUE AS INTEGER
11940: *
11941: * COMMON EXIT WITH KEYWORD VALUE AS INTEGER IN (IA)
11942: *
11943: {ACS13{JSR{ICBLD{{{BUILD ICBLK
11944: {{BRN{ACS18{{{JUMP TO EXIT
11945: *
11946: * HERE IF NOT ONE WORD KEYWORD VALUE
11947: *
11948: {ACS14{BGE{R9{#K$S$${ACS15{JUMP IF SPECIAL CASE
11949: {{SUB{#K$V$${R9{{ELSE GET OFFSET
11950: {{ADD{#NDABO{R9{{POINT TO PATTERN VALUE
11951: {{BRN{ACS18{{{JUMP TO EXIT
11952: *
11953: * HERE IF SPECIAL KEYWORD CASE
11954: *
11955: {ACS15{MOV{KVRTN{R10{{LOAD RTNTYPE IN CASE
11956: {{LDI{KVSTL{{{LOAD STLIMIT IN CASE
11957: {{SUB{#K$S$${R9{{GET CASE NUMBER
11958: {{BSW{R9{5{{SWITCH ON KEYWORD NUMBER
11959: {{IFF{K$$AL{ACS16{{JUMP IF ALPHABET
11960: {{IFF{K$$RT{ACS17{{RTNTYPE
11961: {{IFF{K$$SC{ACS19{{STCOUNT
11962: {{IFF{K$$ET{ACS20{{ERRTEXT
11963: {{IFF{K$$SL{ACS13{{STLIMIT
11964: {{ESW{{{{END SWITCH ON KEYWORD NUMBER
11965: {{EJC{{{{
11966: *
11967: * ACESS (CONTINUED)
11968: *
11969: * ALPHABET
11970: *
11971: {ACS16{MOV{KVALP{R10{{LOAD POINTER TO ALPHABET STRING
11972: *
11973: * RTNTYPE MERGES HERE
11974: *
11975: {ACS17{MOV{R10{R9{{COPY STRING PTR TO PROPER REG
11976: *
11977: * COMMON RETURN POINT
11978: *
11979: {ACS18{EXI{{{{RETURN TO ACESS CALLER
11980: *
11981: * HERE FOR STCOUNT (IA HAS STLIMIT)
11982: *
11983: {ACS19{SBI{KVSTC{{{STCOUNT = LIMIT - LEFT
11984: {{BRN{ACS13{{{MERGE BACK WITH INTEGER RESULT
11985: *
11986: * ERRTEXT
11987: *
11988: {ACS20{MOV{R$ETX{R9{{GET ERRTEXT STRING
11989: {{BRN{ACS18{{{MERGE WITH RESULT
11990: *
11991: * HERE TO READ A RECORD FROM TERMINAL
11992: *
11993: {ACS21{MOV{#RILEN{R6{{BUFFER LENGTH
11994: {{JSR{ALOCS{{{ALLOCATE BUFFER
11995: {{JSR{SYSRI{{{READ RECORD
11996: {{PPM{ACS03{{{ENDFILE
11997: {{BRN{ACS07{{{MERGE WITH RECORD READ
11998: *
11999: * ERROR RETURNS
12000: *
12001: {ACS22{MOV{R9{DNAMP{{POP UNUSED SCBLK
12002: {{ERB{202{INPUT{{FROM FILE CAUSED NON-RECOVERABLE ERROR
12003: *
12004: {ACS23{MOV{R9{DNAMP{{POP UNUSED SCBLK
12005: {{ERB{203{INPUT{{FILE RECORD HAS INCORRECT FORMAT
12006: {{ENP{{{{END PROCEDURE ACESS
12007: {{EJC{{{{
12008: *
12009: * ACOMP -- COMPARE TWO ARITHMETIC VALUES
12010: *
12011: * 1(XS) FIRST ARGUMENT
12012: * 0(XS) SECOND ARGUMENT
12013: * JSR ACOMP CALL TO COMPARE VALUES
12014: * PPM LOC TRANSFER LOC IF ARG1 IS NON-NUMERIC
12015: * PPM LOC TRANSFER LOC IF ARG2 IS NON-NUMERIC
12016: * PPM LOC TRANSFER LOC FOR ARG1 LT ARG2
12017: * PPM LOC TRANSFER LOC FOR ARG1 EQ ARG2
12018: * PPM LOC TRANSFER LOC FOR ARG1 GT ARG2
12019: * (NORMAL RETURN IS NEVER GIVEN)
12020: * (WA,WB,WC,IA,RA) DESTROYED
12021: * (XL,XR) DESTROYED
12022: *
12023: {ACOMP{PRC{N{5{{ENTRY POINT
12024: {{JSR{ARITH{{{LOAD ARITHMETIC OPERANDS
12025: {{PPM{ACMP7{{{JUMP IF FIRST ARG NON-NUMERIC
12026: {{PPM{ACMP8{{{JUMP IF SECOND ARG NON-NUMERIC
12027: {{PPM{ACMP4{{{JUMP IF REAL ARGUMENTS
12028: *
12029: * HERE FOR INTEGER ARGUMENTS
12030: *
12031: {{SBI{4*ICVAL(R10){{{SUBTRACT TO COMPARE
12032: {{IOV{ACMP3{{{JUMP IF OVERFLOW
12033: {{ILT{ACMP5{{{ELSE JUMP IF ARG1 LT ARG2
12034: {{IEQ{ACMP2{{{JUMP IF ARG1 EQ ARG2
12035: *
12036: * HERE IF ARG1 GT ARG2
12037: *
12038: {ACMP1{EXI{5{{{TAKE GT EXIT
12039: *
12040: * HERE IF ARG1 EQ ARG2
12041: *
12042: {ACMP2{EXI{4{{{TAKE EQ EXIT
12043: {{EJC{{{{
12044: *
12045: * ACOMP (CONTINUED)
12046: *
12047: * HERE FOR INTEGER OVERFLOW ON SUBTRACT
12048: *
12049: {ACMP3{LDI{4*ICVAL(R10){{{LOAD SECOND ARGUMENT
12050: {{ILT{ACMP1{{{GT IF NEGATIVE
12051: {{BRN{ACMP5{{{ELSE LT
12052: *
12053: * HERE FOR REAL OPERANDS
12054: *
12055: {ACMP4{SBR{4*RCVAL(R10){{{SUBTRACT TO COMPARE
12056: {{ROV{ACMP6{{{JUMP IF OVERFLOW
12057: {{RGT{ACMP1{{{ELSE JUMP IF ARG1 GT
12058: {{REQ{ACMP2{{{JUMP IF ARG1 EQ ARG2
12059: *
12060: * HERE IF ARG1 LT ARG2
12061: *
12062: {ACMP5{EXI{3{{{TAKE LT EXIT
12063: *
12064: * HERE IF OVERFLOW ON REAL SUBTRACTION
12065: *
12066: {ACMP6{LDR{4*RCVAL(R10){{{RELOAD ARG2
12067: {{RLT{ACMP1{{{GT IF NEGATIVE
12068: {{BRN{ACMP5{{{ELSE LT
12069: *
12070: * HERE IF ARG1 NON-NUMERIC
12071: *
12072: {ACMP7{EXI{1{{{TAKE ERROR EXIT
12073: *
12074: * HERE IF ARG2 NON-NUMERIC
12075: *
12076: {ACMP8{EXI{2{{{TAKE ERROR EXIT
12077: {{ENP{{{{END PROCEDURE ACOMP
12078: {{EJC{{{{
12079: *
12080: * ALLOC ALLOCATE BLOCK OF DYNAMIC STORAGE
12081: *
12082: * (WA) LENGTH REQUIRED IN BYTES
12083: * JSR ALLOC CALL TO ALLOCATE BLOCK
12084: * (XR) POINTER TO ALLOCATED BLOCK
12085: *
12086: * A POSSIBLE ALTERNATIVE TO AOV .. AND FOLLOWING STMT IS -
12087: * MOV DNAME,XR . SUB WA,XR . BLO XR,DNAMP,ALOC2 .
12088: * MOV DNAMP,XR . ADD WA,XR
12089: *
12090: {ALLOC{PRC{E{0{{ENTRY POINT
12091: *
12092: * COMMON EXIT POINT
12093: *
12094: {ALOC1{MOV{DNAMP{R9{{POINT TO NEXT AVAILABLE LOC
12095: {{AOV{R6{R9{ALOC2{POINT PAST ALLOCATED BLOCK
12096: {{BGT{R9{DNAME{ALOC2{JUMP IF NOT ENOUGH ROOM
12097: {{MOV{R9{DNAMP{{STORE NEW POINTER
12098: {{SUB{R6{R9{{POINT BACK TO START OF ALLOCATED BK
12099: {{EXI{{{{RETURN TO CALLER
12100: *
12101: * HERE IF INSUFFICIENT ROOM, TRY A GARBAGE COLLECTION
12102: *
12103: {ALOC2{MOV{R7{ALLSV{{SAVE WB
12104: {{ZER{R7{{{SET NO UPWARD MOVE FOR GBCOL
12105: {{JSR{GBCOL{{{GARBAGE COLLECT
12106: *
12107: * SEE IF ROOM AFTER GBCOL OR SYSMM CALL
12108: *
12109: {ALOC3{MOV{DNAMP{R9{{POINT TO FIRST AVAILABLE LOC
12110: {{AOV{R6{R9{ALC3A{POINT PAST NEW BLOCK
12111: {{BLO{R9{DNAME{ALOC4{JUMP IF THERE IS ROOM NOW
12112: *
12113: * FAILED AGAIN, SEE IF WE CAN GET MORE CORE
12114: *
12115: {ALC3A{JSR{SYSMM{{{TRY TO GET MORE MEMORY
12116: {{WTB{R9{{{CONVERT TO BAUS (SGD05)
12117: {{ADD{R9{DNAME{{BUMP PTR BY AMOUNT OBTAINED
12118: {{BNZ{R9{ALOC3{{JUMP IF GOT MORE CORE
12119: {{ADD{RSMEM{DNAME{{GET THE RESERVE MEMORY
12120: {{ZER{RSMEM{{{ONLY PERMISSIBLE ONCE
12121: {{ICV{ERRFT{{{FATAL ERROR
12122: {{ERB{204{MEMORY{{OVERFLOW
12123: {{EJC{{{{
12124: *
12125: * HERE AFTER SUCCESSFUL GARBAGE COLLECTION
12126: *
12127: {ALOC4{STI{ALLIA{{{SAVE IA
12128: {{MOV{DNAME{R7{{GET DYNAMIC END ADRS
12129: {{SUB{DNAMP{R7{{COMPUTE FREE STORE
12130: {{BTW{R7{{{CONVERT BYTES TO WORDS
12131: {{MTI{R7{{{PUT FREE STORE IN IA
12132: {{MLI{ALFSF{{{MULTIPLY BY FREE STORE FACTOR
12133: {{IOV{ALOC5{{{JUMP IF OVERFLOWED
12134: {{MOV{DNAME{R7{{DYNAMIC END ADRS
12135: {{SUB{DNAMB{R7{{COMPUTE TOTAL AMOUNT OF DYNAMIC
12136: {{BTW{R7{{{CONVERT TO WORDS
12137: {{MOV{R7{ALDYN{{STORE IT
12138: {{SBI{ALDYN{{{SUBTRACT FROM SCALED UP FREE STORE
12139: {{IGT{ALOC5{{{JUMP IF SUFFICIENT FREE STORE
12140: {{JSR{SYSMM{{{TRY TO GET MORE STORE
12141: {{WTB{R9{{{CONVERT TO BAUS (SGD05)
12142: {{ADD{R9{DNAME{{ADJUST DYNAMIC END ADRS
12143: *
12144: * MERGE TO RESTORE IA AND WB
12145: *
12146: {ALOC5{LDI{ALLIA{{{RECOVER IA
12147: {{MOV{ALLSV{R7{{RESTORE WB
12148: {{BRN{ALOC1{{{JUMP BACK TO EXIT
12149: {{ENP{{{{END PROCEDURE ALLOC
12150: {{EJC{{{{
12151: *
12152: * ALOBF -- ALLOCATE BUFFER
12153: *
12154: * THIS ROUTINES ALLOCATES A NEW BUFFER. AS THE BFBLK
12155: * AND BCBLK COME IN PAIRS, BOTH ARE ALLOCATED HERE,
12156: * AND XR POINTS TO THE BCBLK ON RETURN. THE BFBLK
12157: * AND BCBLK ARE SET TO THE NULL BUFFER, AND THE IDVAL
12158: * IS ZERO ON RETURN.
12159: *
12160: * (WA) BUFFER SIZE IN CHARACTERS
12161: * JSR ALOBF CALL TO CREATE BUFFER
12162: * (XR) BCBLK PTR
12163: * (WA,WB) DESTROYED
12164: *
12165: {ALOBF{PRC{E{0{{ENTRY POINT
12166: {{MOV{R6{R7{{HANG ONTO ALLOCATION SIZE
12167: {{CTB{R6{BFSI${{GET TOTAL BLOCK SIZE
12168: {{BGE{R6{MXLEN{ALB01{CHECK FOR MAXLEN EXCEEDED
12169: {{ADD{#4*BCSI${R6{{ADD IN ALLOCATION FOR BCBLK
12170: {{JSR{ALLOC{{{ALLOCATE FRAME
12171: {{MOV{#B$BCT{(R9){{SET TYPE
12172: {{ZER{4*IDVAL(R9){{{NO ID YET
12173: {{ZER{4*BCLEN(R9){{{NO DEFINED LENGTH
12174: {{MOV{R10{R6{{SAVE XL
12175: {{MOV{R9{R10{{COPY BCBLK PTR
12176: {{ADD{#4*BCSI${R10{{BIAS PAST PARTIALLY BUILT BCBLK
12177: {{MOV{#B$BFT{(R10){{SET BFBLK TYPE WORD
12178: {{MOV{R7{4*BFALC(R10){{SET ALLOCATED SIZE
12179: {{MOV{R10{4*BCBUF(R9){{SET POINTER IN BCBLK
12180: {{ZER{4*BFCHR(R10){{{CLEAR FIRST WORD (NULL PAD)
12181: {{MOV{R6{R10{{RESTORE ENTRY XL
12182: {{EXI{{{{RETURN TO CALLER
12183: *
12184: * HERE FOR MXLEN EXCEEDED
12185: *
12186: {ALB01{ERB{274{REQUESTED{{BUFFER ALLOCATION EXCEEDS MXLEN
12187: {{ENP{{{{END PROCEDURE ALOBF
12188: {{EJC{{{{
12189: *
12190: * ALOCS -- ALLOCATE STRING BLOCK
12191: *
12192: * ALOCS IS USED TO BUILD A FRAME FOR A STRING BLOCK INTO
12193: * WHICH THE ACTUAL CHARACTERS ARE PLACED BY THE CALLER.
12194: * ALL STRINGS ARE CREATED WITH A CALL TO ALOCS (THE
12195: * EXCEPTIONS OCCUR IN TRIMR AND S$RPL PROCEDURES).
12196: *
12197: * (WA) LENGTH OF STRING TO BE ALLOCATED
12198: * JSR ALOCS CALL TO ALLOCATE SCBLK
12199: * (XR) POINTER TO RESULTING SCBLK
12200: * (WA) DESTROYED
12201: * (WC) CHARACTER COUNT (ENTRY VALUE OF WA)
12202: *
12203: * THE RESULTING SCBLK HAS THE TYPE WORD AND THE LENGTH
12204: * FILLED IN AND THE LAST WORD IS CLEARED TO ZERO CHARACTERS
12205: * TO ENSURE CORRECT RIGHT PADDING OF THE FINAL WORD.
12206: *
12207: {ALOCS{PRC{E{0{{ENTRY POINT
12208: {{BGT{R6{KVMXL{ALCS2{JUMP IF LENGTH EXCEEEDS MAXLENGTH
12209: {{MOV{R6{R8{{ELSE COPY LENGTH
12210: {{CTB{R6{SCSI${{COMPUTE LENGTH OF SCBLK IN BYTES
12211: {{MOV{DNAMP{R9{{POINT TO NEXT AVAILABLE LOCATION
12212: {{AOV{R6{R9{ALCS0{POINT PAST BLOCK
12213: {{BLO{R9{DNAME{ALCS1{JUMP IF THERE IS ROOM
12214: *
12215: * INSUFFICIENT MEMORY
12216: *
12217: {ALCS0{ZER{R9{{{ELSE CLEAR GARBAGE XR VALUE
12218: {{JSR{ALLOC{{{AND USE STANDARD ALLOCATOR
12219: {{ADD{R6{R9{{POINT PAST END OF BLOCK TO MERGE
12220: *
12221: * MERGE HERE WITH XR POINTING BEYOND NEW BLOCK
12222: *
12223: {ALCS1{MOV{R9{DNAMP{{SET UPDATED STORAGE POINTER
12224: {{ZER{-(R9){{{STORE ZERO CHARS IN LAST WORD
12225: {{DCA{R6{{{DECREMENT LENGTH
12226: {{SUB{R6{R9{{POINT BACK TO START OF BLOCK
12227: {{MOV{#B$SCL{(R9){{SET TYPE WORD
12228: {{MOV{R8{4*SCLEN(R9){{STORE LENGTH IN CHARS
12229: {{EXI{{{{RETURN TO ALOCS CALLER
12230: *
12231: * COME HERE IF STRING IS TOO LONG
12232: *
12233: {ALCS2{ERB{205{STRING{{LENGTH EXCEEDS VALUE OF MAXLNGTH KEYWORD
12234: {{ENP{{{{END PROCEDURE ALOCS
12235: {{EJC{{{{
12236: *
12237: * ALOST -- ALLOCATE SPACE IN STATIC REGION
12238: *
12239: * (WA) LENGTH REQUIRED IN BYTES
12240: * JSR ALOST CALL TO ALLOCATE SPACE
12241: * (XR) POINTER TO ALLOCATED BLOCK
12242: * (WB) DESTROYED
12243: *
12244: * NOTE THAT THE CODING ENSURES THAT THE RESULTING VALUE
12245: * OF STATE IS ALWAYS LESS THAN DNAMB. THIS FACT IS USED
12246: * IN TESTING A VARIABLE NAME FOR BEING IN THE STATIC REGION
12247: *
12248: {ALOST{PRC{E{0{{ENTRY POINT
12249: *
12250: * MERGE BACK HERE AFTER ALLOCATING NEW CHUNK
12251: *
12252: {ALST1{MOV{STATE{R9{{POINT TO CURRENT END OF AREA
12253: {{AOV{R6{R9{ALST2{POINT BEYOND PROPOSED BLOCK
12254: {{BGE{R9{DNAMB{ALST2{JUMP IF OVERLAP WITH DYNAMIC AREA
12255: {{MOV{R9{STATE{{ELSE STORE NEW POINTER
12256: {{SUB{R6{R9{{POINT BACK TO START OF BLOCK
12257: {{EXI{{{{RETURN TO ALOST CALLER
12258: *
12259: * HERE IF NO ROOM, PREPARE TO MOVE DYNAMIC STORAGE UP
12260: *
12261: {ALST2{MOV{R6{ALSTA{{SAVE WA
12262: {{BGE{R6{#4*E$STS{ALST3{SKIP IF REQUESTED CHUNK IS LARGE
12263: {{MOV{#4*E$STS{R6{{ELSE SET TO GET LARGE ENOUGH CHUNK
12264: *
12265: * HERE WITH AMOUNT TO MOVE UP IN WA
12266: *
12267: {ALST3{JSR{ALLOC{{{ALLOCATE BLOCK TO ENSURE ROOM
12268: {{MOV{R9{DNAMP{{AND DELETE IT
12269: {{MOV{R6{R7{{COPY MOVE UP AMOUNT
12270: {{JSR{GBCOL{{{CALL GBCOL TO MOVE DYNAMIC AREA UP
12271: {{MOV{ALSTA{R6{{RESTORE WA
12272: {{BRN{ALST1{{{LOOP BACK TO TRY AGAIN
12273: {{ENP{{{{END PROCEDURE ALOST
12274: {{EJC{{{{
12275: *
12276: * APNDB -- APPEND STRING TO BUFFER
12277: *
12278: * THIS ROUTINE IS USED BY BUFFER HANDLING ROUTINES TO
12279: * APPEND DATA TO AN EXISTING BFBLK.
12280: *
12281: * (XR) EXISTING BCBLK TO BE APPENDED
12282: * (XL) CONVERTABLE TO STRING
12283: * JSR APNDB CALL TO APPEND TO BUFFER
12284: * PPM LOC THREAD IF (XL) CANT BE CONVERTED
12285: * PPM LOC IF NOT ENOUGH ROOM
12286: * (WA,WB) DESTROYED
12287: *
12288: * IF MORE CHARACTERS ARE SPECIFIED THAN CAN BE INSERTED,
12289: * THEN NO ACTION IS TAKEN AND THE SECOND RETURN IS TAKEN.
12290: *
12291: {APNDB{PRC{E{2{{ENTRY POINT
12292: {{MOV{4*BCLEN(R9){R6{{LOAD OFFSET TO INSERT
12293: {{ZER{R7{{{REPLACE SECTION IS NULL
12294: {{JSR{INSBF{{{CALL TO INSERT AT END
12295: {{PPM{APN01{{{CONVERT ERROR
12296: {{PPM{APN02{{{NO ROOM
12297: {{EXI{{{{RETURN TO CALLER
12298: *
12299: * HERE TO TAKE CONVERT FAILURE EXIT
12300: *
12301: {APN01{EXI{1{{{RETURN TO CALLER ALTERNATE
12302: *
12303: * HERE FOR NO FIT EXIT
12304: *
12305: {APN02{EXI{2{{{ALTERNATE EXIT TO CALLER
12306: {{ENP{{{{END PROCEDURE APNDB
12307: {{EJC{{{{
12308: *
12309: * ARITH -- FETCH ARITHMETIC OPERANDS
12310: *
12311: * ARITH IS USED BY FUNCTIONS AND OPERATORS WHICH EXPECT
12312: * TWO NUMERIC ARGUMENTS (OPERANDS) WHICH MUST BOTH BE
12313: * INTEGER OR BOTH BE REAL. ARITH FETCHES TWO ARGUMENTS FROM
12314: * THE STACK AND PERFORMS ANY NECESSARY CONVERSIONS.
12315: *
12316: * 1(XS) FIRST ARGUMENT (LEFT OPERAND)
12317: * 0(XS) SECOND ARGUMENT (RIGHT OPERAND)
12318: * JSR ARITH CALL TO FETCH NUMERIC ARGUMENTS
12319: * PPM LOC TRANSFER LOC FOR OPND 1 NON-NUMERIC
12320: * PPM LOC TRANSFER LOC FOR OPND 2 NON-NUMERIC
12321: * PPM LOC TRANSFER LOC FOR REAL OPERANDS
12322: *
12323: * FOR INTEGER ARGS, CONTROL RETURNS PAST THE PARAMETERS
12324: *
12325: * (IA) LEFT OPERAND VALUE
12326: * (XR) PTR TO ICBLK FOR LEFT OPERAND
12327: * (XL) PTR TO ICBLK FOR RIGHT OPERAND
12328: * (XS) POPPED TWICE
12329: * (WA,WB,RA) DESTROYED
12330: *
12331: * FOR REAL ARGUMENTS, CONTROL RETURNS TO THE LOCATION
12332: * SPECIFIED BY THE THIRD PARAMETER.
12333: *
12334: * (RA) LEFT OPERAND VALUE
12335: * (XR) PTR TO RCBLK FOR LEFT OPERAND
12336: * (XL) PTR TO RCBLK FOR RIGHT OPERAND
12337: * (WA,WB,WC) DESTROYED
12338: * (XS) POPPED TWICE
12339: {{EJC{{{{
12340: *
12341: * ARITH (CONTINUED)
12342: *
12343: * ENTRY POINT
12344: *
12345: {ARITH{PRC{N{3{{ENTRY POINT
12346: {{MOV{(SP)+{R10{{LOAD RIGHT OPERAND
12347: {{MOV{(SP)+{R9{{LOAD LEFT OPERAND
12348: {{MOV{(R10){R6{{GET RIGHT OPERAND TYPE WORD
12349: {{BEQ{R6{#B$ICL{ARTH1{JUMP IF INTEGER
12350: {{BEQ{R6{#B$RCL{ARTH4{JUMP IF REAL
12351: {{MOV{R9{-(SP){{ELSE REPLACE LEFT ARG ON STACK
12352: {{MOV{R10{R9{{COPY LEFT ARG POINTER
12353: {{JSR{GTNUM{{{CONVERT TO NUMERIC
12354: {{PPM{ARTH6{{{JUMP IF UNCONVERTIBLE
12355: {{MOV{R9{R10{{ELSE COPY CONVERTED RESULT
12356: {{MOV{(R10){R6{{GET RIGHT OPERAND TYPE WORD
12357: {{MOV{(SP)+{R9{{RELOAD LEFT ARGUMENT
12358: {{BEQ{R6{#B$RCL{ARTH4{JUMP IF RIGHT ARG IS REAL
12359: *
12360: * HERE IF RIGHT ARG IS AN INTEGER
12361: *
12362: {ARTH1{BNE{(R9){#B$ICL{ARTH3{JUMP IF LEFT ARG NOT INTEGER
12363: *
12364: * EXIT FOR INTEGER CASE
12365: *
12366: {ARTH2{LDI{4*ICVAL(R9){{{LOAD LEFT OPERAND VALUE
12367: {{EXI{{{{RETURN TO ARITH CALLER
12368: *
12369: * HERE FOR RIGHT OPERAND INTEGER, LEFT OPERAND NOT
12370: *
12371: {ARTH3{JSR{GTNUM{{{CONVERT LEFT ARG TO NUMERIC
12372: {{PPM{ARTH7{{{JUMP IF NOT CONVERTIBLE
12373: {{BEQ{R6{#B$ICL{ARTH2{JUMP BACK IF INTEGER-INTEGER
12374: *
12375: * HERE WE MUST CONVERT REAL-INTEGER TO REAL-REAL
12376: *
12377: {{MOV{R9{-(SP){{PUT LEFT ARG BACK ON STACK
12378: {{LDI{4*ICVAL(R10){{{LOAD RIGHT ARGUMENT VALUE
12379: {{ITR{{{{CONVERT TO REAL
12380: {{JSR{RCBLD{{{GET REAL BLOCK FOR RIGHT ARG, MERGE
12381: {{MOV{R9{R10{{COPY RIGHT ARG PTR
12382: {{MOV{(SP)+{R9{{LOAD LEFT ARGUMENT
12383: {{BRN{ARTH5{{{MERGE FOR REAL-REAL CASE
12384: {{EJC{{{{
12385: *
12386: * ARITH (CONTINUED)
12387: *
12388: * HERE IF RIGHT ARGUMENT IS REAL
12389: *
12390: {ARTH4{BEQ{(R9){#B$RCL{ARTH5{JUMP IF LEFT ARG REAL
12391: {{JSR{GTREA{{{ELSE CONVERT TO REAL
12392: {{PPM{ARTH7{{{ERROR IF UNCONVERTIBLE
12393: *
12394: * HERE FOR REAL-REAL
12395: *
12396: {ARTH5{LDR{4*RCVAL(R9){{{LOAD LEFT OPERAND VALUE
12397: {{EXI{3{{{TAKE REAL-REAL EXIT
12398: *
12399: * HERE FOR ERROR CONVERTING RIGHT ARGUMENT
12400: *
12401: {ARTH6{ICA{SP{{{POP UNWANTED LEFT ARG
12402: {{EXI{2{{{TAKE APPROPRIATE ERROR EXIT
12403: *
12404: * HERE FOR ERROR CONVERTING LEFT OPERAND
12405: *
12406: {ARTH7{EXI{1{{{TAKE APPROPRIATE ERROR RETURN
12407: {{ENP{{{{END PROCEDURE ARITH
12408: {{EJC{{{{
12409: *
12410: * ASIGN -- PERFORM ASSIGNMENT
12411: *
12412: * ASIGN PERFORMS THE ASSIGNMENT OF A VALUE TO A VARIABLE
12413: * WITH APPROPRIATE CHECKS FOR OUTPUT ASSOCIATIONS AND
12414: * VALUE TRACE ASSOCIATIONS WHICH ARE EXECUTED AS REQUIRED.
12415: * ASIGN ALSO HANDLES THE SPECIAL CASES OF ASSIGNMENT TO
12416: * PATTERN AND EXPRESSION VARIABLES.
12417: *
12418: * (WB) VALUE TO BE ASSIGNED
12419: * (XL) BASE POINTER FOR VARIABLE
12420: * (WA) OFFSET FOR VARIABLE
12421: * JSR ASIGN CALL TO ASSIGN VALUE TO VARIABLE
12422: * PPM LOC TRANSFER LOC FOR FAILURE
12423: * (XR,XL,WA,WB,WC) DESTROYED
12424: * (RA) DESTROYED
12425: *
12426: * FAILURE OCCURS IF THE EVALUATION OF AN EXPRESSION
12427: * ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS.
12428: *
12429: {ASIGN{PRC{R{1{{ENTRY POINT (RECURSIVE)
12430: *
12431: * MERGE BACK HERE TO ASSIGN RESULT TO EXPRESSION VARIABLE.
12432: *
12433: {ASG01{ADD{R6{R10{{POINT TO VARIABLE VALUE
12434: {{MOV{(R10){R9{{LOAD VARIABLE VALUE
12435: {{BEQ{(R9){#B$TRT{ASG02{JUMP IF TRAPPED
12436: {{MOV{R7{(R10){{ELSE PERFORM ASSIGNMENT
12437: {{ZER{R10{{{CLEAR GARBAGE VALUE IN XL
12438: {{EXI{{{{AND RETURN TO ASIGN CALLER
12439: *
12440: * HERE IF VALUE IS TRAPPED
12441: *
12442: {ASG02{SUB{R6{R10{{RESTORE NAME BASE
12443: {{BEQ{R9{#TRBKV{ASG14{JUMP IF KEYWORD VARIABLE
12444: {{BNE{R9{#TRBEV{ASG04{JUMP IF NOT EXPRESSION VARIABLE
12445: *
12446: * HERE FOR ASSIGNMENT TO EXPRESSION VARIABLE
12447: *
12448: {{MOV{4*EVEXP(R10){R9{{POINT TO EXPRESSION
12449: {{MOV{R7{-(SP){{STORE VALUE TO ASSIGN ON STACK
12450: {{MOV{#NUM01{R7{{SET FOR EVALUATION BY NAME
12451: {{JSR{EVALX{{{EVALUATE EXPRESSION BY NAME
12452: {{PPM{ASG03{{{JUMP IF EVALUATION FAILS
12453: {{MOV{(SP)+{R7{{ELSE RELOAD VALUE TO ASSIGN
12454: {{BRN{ASG01{{{LOOP BACK TO PERFORM ASSIGNMENT
12455: {{EJC{{{{
12456: *
12457: * ASIGN (CONTINUED)
12458: *
12459: * HERE FOR FAILURE DURING EXPRESSION EVALUATION
12460: *
12461: {ASG03{ICA{SP{{{REMOVE STACKED VALUE ENTRY
12462: {{EXI{1{{{TAKE FAILURE EXIT
12463: *
12464: * HERE IF NOT KEYWORD OR EXPRESSION VARIABLE
12465: *
12466: {ASG04{MOV{R9{-(SP){{SAVE PTR TO FIRST TRBLK
12467: *
12468: * LOOP TO CHASE DOWN TRBLK CHAIN AND ASSIGN VALUE AT END
12469: *
12470: {ASG05{MOV{R9{R8{{SAVE PTR TO THIS TRBLK
12471: {{MOV{4*TRNXT(R9){R9{{POINT TO NEXT TRBLK
12472: {{BEQ{(R9){#B$TRT{ASG05{LOOP BACK IF ANOTHER TRBLK
12473: {{MOV{R8{R9{{ELSE POINT BACK TO LAST TRBLK
12474: {{MOV{R7{4*TRVAL(R9){{STORE VALUE AT END OF CHAIN
12475: {{MOV{(SP)+{R9{{RESTORE PTR TO FIRST TRBLK
12476: *
12477: * LOOP TO PROCESS TRBLK ENTRIES ON CHAIN
12478: *
12479: {ASG06{MOV{4*TRTYP(R9){R7{{LOAD TYPE CODE OF TRBLK
12480: {{BEQ{R7{#TRTVL{ASG08{JUMP IF VALUE TRACE
12481: {{BEQ{R7{#TRTOU{ASG10{JUMP IF OUTPUT ASSOCIATION
12482: *
12483: * HERE TO MOVE TO NEXT TRBLK ON CHAIN
12484: *
12485: {ASG07{MOV{4*TRNXT(R9){R9{{POINT TO NEXT TRBLK ON CHAIN
12486: {{BEQ{(R9){#B$TRT{ASG06{LOOP BACK IF ANOTHER TRBLK
12487: {{EXI{{{{ELSE END OF CHAIN, RETURN TO CALLER
12488: *
12489: * HERE TO PROCESS VALUE TRACE
12490: *
12491: {ASG08{BZE{KVTRA{ASG07{{IGNORE VALUE TRACE IF TRACE OFF
12492: {{DCV{KVTRA{{{ELSE DECREMENT TRACE COUNT
12493: {{BZE{4*TRFNC(R9){ASG09{{JUMP IF PRINT TRACE
12494: {{JSR{TRXEQ{{{ELSE EXECUTE FUNCTION TRACE
12495: {{BRN{ASG07{{{AND LOOP BACK
12496: {{EJC{{{{
12497: *
12498: * ASIGN (CONTINUED)
12499: *
12500: * HERE FOR PRINT TRACE
12501: *
12502: {ASG09{JSR{PRTSN{{{PRINT STATEMENT NUMBER
12503: {{JSR{PRTNV{{{PRINT NAME = VALUE
12504: {{BRN{ASG07{{{LOOP BACK FOR NEXT TRBLK
12505: *
12506: * HERE FOR OUTPUT ASSOCIATION
12507: *
12508: {ASG10{BZE{KVOUP{ASG07{{IGNORE OUTPUT ASSOC IF OUTPUT OFF
12509: {{MOV{R9{R10{{ELSE COPY TRBLK POINTER
12510: {{MOV{4*TRVAL(R8){-(SP){{STACK VALUE TO OUTPUT (SGD01)
12511: {{JSR{GTSTG{{{CONVERT TO STRING
12512: {{PPM{ASG12{{{GET DATATYPE NAME IF UNCONVERTIBLE
12513: *
12514: * MERGE WITH STRING FOR OUTPUT
12515: *
12516: {ASG11{MOV{4*TRFPT(R10){R6{{FCBLK PTR
12517: {{BZE{R6{ASG13{{JUMP IF STANDARD OUTPUT FILE
12518: *
12519: * HERE FOR OUTPUT TO NON-STANDARD OUTPUT FILE
12520: *
12521: {{JSR{SYSOU{{{CALL SYSTEM OUTPUT ROUTINE
12522: {{ERR{206{OUTPUT{{CAUSED FILE OVERFLOW
12523: {{ERR{207{OUTPUT{{CAUSED NON-RECOVERABLE ERROR
12524: {{EXI{{{{ELSE ALL DONE, RETURN TO CALLER
12525: *
12526: * IF NOT PRINTABLE, GET DATATYPE NAME INSTEAD
12527: *
12528: {ASG12{JSR{DTYPE{{{CALL DATATYPE ROUTINE
12529: {{BRN{ASG11{{{MERGE
12530: *
12531: * HERE TO PRINT A STRING ON THE PRINTER
12532: *
12533: {ASG13{JSR{PRTST{{{PRINT STRING VALUE
12534: {{BEQ{4*TRTER(R10){#V$TER{ASG20{JUMP IF TERMINAL OUTPUT
12535: {{JSR{PRTNL{{{END OF LINE
12536: {{EXI{{{{RETURN TO CALLER
12537: {{EJC{{{{
12538: *
12539: * ASIGN (CONTINUED)
12540: *
12541: * HERE FOR KEYWORD ASSIGNMENT
12542: *
12543: {ASG14{MOV{4*KVNUM(R10){R10{{LOAD KEYWORD NUMBER
12544: {{BEQ{R10{#K$ETX{ASG19{JUMP IF ERRTEXT
12545: {{MOV{R7{R9{{COPY VALUE TO BE ASSIGNED
12546: {{JSR{GTINT{{{CONVERT TO INTEGER
12547: {{ERR{208{KEYWORD{{VALUE ASSIGNED IS NOT INTEGER
12548: {{LDI{4*ICVAL(R9){{{ELSE LOAD VALUE
12549: {{BEQ{R10{#K$STL{ASG16{JUMP IF SPECIAL CASE OF STLIMIT
12550: {{MFI{R6{ASG18{{ELSE GET ADDR INTEGER, TEST OVFLOW
12551: {{BGE{R6{MXLEN{ASG18{FAIL IF TOO LARGE
12552: {{BEQ{R10{#K$ERT{ASG17{JUMP IF SPECIAL CASE OF ERRTYPE
12553: {{BEQ{R10{#K$PFL{ASG21{JUMP IF SPECIAL CASE OF PROFILE
12554: {{BLT{R10{#K$P$${ASG15{JUMP UNLESS PROTECTED
12555: {{ERB{209{KEYWORD{{IN ASSIGNMENT IS PROTECTED
12556: *
12557: * HERE TO DO ASSIGNMENT IF NOT PROTECTED
12558: *
12559: {ASG15{MOV{R6{L^KVABE(R10){{STORE NEW VALUE
12560: {{EXI{{{{RETURN TO ASIGN CALLER
12561: *
12562: * HERE FOR SPECIAL CASE OF STLIMIT
12563: *
12564: * SINCE STCOUNT IS MAINTAINED AS (STLIMIT-STCOUNT)
12565: * IT IS ALSO NECESSARY TO MODIFY STCOUNT APPROPRIATELY.
12566: *
12567: {ASG16{SBI{KVSTL{{{SUBTRACT OLD LIMIT
12568: {{ADI{KVSTC{{{ADD OLD COUNTER
12569: {{STI{KVSTC{{{STORE NEW COUNTER VALUE
12570: {{LDI{4*ICVAL(R9){{{RELOAD NEW LIMIT VALUE
12571: {{STI{KVSTL{{{STORE NEW LIMIT VALUE
12572: {{EXI{{{{RETURN TO ASIGN CALLER
12573: *
12574: * HERE FOR SPECIAL CASE OF ERRTYPE
12575: *
12576: {ASG17{BLE{R6{#NINI9{ERROR{OK TO SIGNAL IF IN RANGE
12577: *
12578: * HERE IF VALUE ASSIGNED IS OUT OF RANGE
12579: *
12580: {ASG18{ERB{210{KEYWORD{{VALUE ASSIGNED IS NEGATIVE OR TOO LARGE
12581: *
12582: * HERE FOR SPECIAL CASE OF ERRTEXT
12583: *
12584: {ASG19{MOV{R7{-(SP){{STACK VALUE
12585: {{JSR{GTSTG{{{CONVERT TO STRING
12586: {{ERR{211{VALUE{{ASSIGNED TO KEYWORD ERRTEXT NOT A STRING
12587: {{MOV{R9{R$ETX{{MAKE ASSIGNMENT
12588: {{EXI{{{{RETURN TO CALLER
12589: *
12590: * PRINT STRING TO TERMINAL
12591: *
12592: {ASG20{JSR{PRTTR{{{PRINT
12593: {{EXI{{{{RETURN
12594: *
12595: * HERE FOR KEYWORD PROFILE
12596: *
12597: {ASG21{BGT{R6{#NUM02{ASG18{MOAN IF NOT 0,1, OR 2
12598: {{BZE{R6{ASG15{{JUST ASSIGN IF ZERO
12599: {{BZE{PFDMP{ASG22{{BRANCH IF FIRST ASSIGNMENT
12600: {{BEQ{R6{PFDMP{ASG23{ALSO IF SAME VALUE AS BEFORE
12601: {{ERB{268{INCONSISTENT{{VALUE ASSIGNED TO KEYWORD PROFILE
12602: *
12603: {ASG22{MOV{R6{PFDMP{{NOTE VALUE ON FIRST ASSIGNMENT
12604: {ASG23{JSR{SYSTM{{{GET THE TIME
12605: {{STI{PFSTM{{{FUDGE SOME KIND OF START TIME
12606: {{BRN{ASG15{{{AND GO ASSIGN
12607: {{ENP{{{{END PROCEDURE ASIGN
12608: {{EJC{{{{
12609: *
12610: * ASINP -- ASSIGN DURING PATTERN MATCH
12611: *
12612: * ASINP IS LIKE ASIGN AND HAS A SIMILAR CALLING SEQUENCE
12613: * AND EFFECT. THE DIFFERENCE IS THAT THE GLOBAL PATTERN
12614: * VARIABLES ARE SAVED AND RESTORED IF REQUIRED.
12615: *
12616: * (XL) BASE POINTER FOR VARIABLE
12617: * (WA) OFFSET FOR VARIABLE
12618: * (WB) VALUE TO BE ASSIGNED
12619: * JSR ASINP CALL TO ASSIGN VALUE TO VARIABLE
12620: * PPM LOC TRANSFER LOC IF FAILURE
12621: * (XR,XL) DESTROYED
12622: * (WA,WB,WC,RA) DESTROYED
12623: *
12624: {ASINP{PRC{R{1{{ENTRY POINT, RECURSIVE
12625: {{ADD{R6{R10{{POINT TO VARIABLE
12626: {{MOV{(R10){R9{{LOAD CURRENT CONTENTS
12627: {{BEQ{(R9){#B$TRT{ASNP1{JUMP IF TRAPPED
12628: {{MOV{R7{(R10){{ELSE PERFORM ASSIGNMENT
12629: {{ZER{R10{{{CLEAR GARBAGE VALUE IN XL
12630: {{EXI{{{{RETURN TO ASINP CALLER
12631: *
12632: * HERE IF VARIABLE IS TRAPPED
12633: *
12634: {ASNP1{SUB{R6{R10{{RESTORE BASE POINTER
12635: {{MOV{PMSSL{-(SP){{STACK SUBJECT STRING LENGTH
12636: {{MOV{PMHBS{-(SP){{STACK HISTORY STACK BASE PTR
12637: {{MOV{R$PMS{-(SP){{STACK SUBJECT STRING POINTER
12638: {{MOV{PMDFL{-(SP){{STACK DOT FLAG
12639: {{JSR{ASIGN{{{CALL FULL-BLOWN ASSIGNMENT ROUTINE
12640: {{PPM{ASNP2{{{JUMP IF FAILURE
12641: {{MOV{(SP)+{PMDFL{{RESTORE DOT FLAG
12642: {{MOV{(SP)+{R$PMS{{RESTORE SUBJECT STRING POINTER
12643: {{MOV{(SP)+{PMHBS{{RESTORE HISTORY STACK BASE POINTER
12644: {{MOV{(SP)+{PMSSL{{RESTORE SUBJECT STRING LENGTH
12645: {{EXI{{{{RETURN TO ASINP CALLER
12646: *
12647: * HERE IF FAILURE IN ASIGN CALL
12648: *
12649: {ASNP2{MOV{(SP)+{PMDFL{{RESTORE DOT FLAG
12650: {{MOV{(SP)+{R$PMS{{RESTORE SUBJECT STRING POINTER
12651: {{MOV{(SP)+{PMHBS{{RESTORE HISTORY STACK BASE POINTER
12652: {{MOV{(SP)+{PMSSL{{RESTORE SUBJECT STRING LENGTH
12653: {{EXI{1{{{TAKE FAILURE EXIT
12654: {{ENP{{{{END PROCEDURE ASINP
12655: {{EJC{{{{
12656: *
12657: * BLKLN -- DETERMINE LENGTH OF BLOCK
12658: *
12659: * BLKLN DETERMINES THE LENGTH OF A BLOCK IN DYNAMIC STORE.
12660: *
12661: * (WA) FIRST WORD OF BLOCK
12662: * (XR) POINTER TO BLOCK
12663: * JSR BLKLN CALL TO GET BLOCK LENGTH
12664: * (WA) LENGTH OF BLOCK IN BYTES
12665: * (XL) DESTROYED
12666: *
12667: * BLKLN IS USED BY THE GARBAGE COLLECTOR AND IS NOT
12668: * PERMITTED TO CALL GBCOL DIRECTLY OR INDIRECTLY.
12669: *
12670: * THE FIRST WORD STORED IN THE BLOCK (I.E. AT XR) MAY
12671: * BE ANYTHING, BUT THE CONTENTS OF WA MUST BE CORRECT.
12672: *
12673: {BLKLN{PRC{E{0{{ENTRY POINT
12674: {{MOV{R6{R10{{COPY FIRST WORD
12675: {{LEI{R10{{{GET ENTRY ID (BL$XX)
12676: {{BSW{R10{BL$$${BLN00{SWITCH ON BLOCK TYPE
12677: {{IFF{BL$AR{BLN01{{ARBLK
12678: {{IFF{BL$BC{BLN04{{BCBLK
12679: {{IFF{BL$CD{BLN01{{CDBLK
12680: {{IFF{BL$EX{BLN01{{EXBLK
12681: {{IFF{BL$IC{BLN07{{ICBLK
12682: {{IFF{BL$NM{BLN03{{NMBLK
12683: {{IFF{BL$P0{BLN02{{P0BLK
12684: {{IFF{BL$P1{BLN03{{P1BLK
12685: {{IFF{BL$P2{BLN04{{P2BLK
12686: {{IFF{BL$RC{BLN09{{RCBLK
12687: {{IFF{BL$SC{BLN10{{SCBLK
12688: {{IFF{BL$SE{BLN02{{SEBLK
12689: {{IFF{BL$TB{BLN01{{TBBLK
12690: {{IFF{BL$VC{BLN01{{VCBLK
12691: {{IFF{DUMMY{BLN00{{
12692: {{IFF{DUMMY{BLN00{{
12693: {{IFF{BL$PD{BLN08{{PDBLK
12694: {{IFF{BL$TR{BLN05{{TRBLK
12695: {{IFF{BL$BF{BLN11{{BFBLK
12696: {{IFF{DUMMY{BLN00{{
12697: {{IFF{DUMMY{BLN00{{
12698: {{IFF{BL$CT{BLN06{{CTBLK
12699: {{IFF{BL$DF{BLN01{{DFBLK
12700: {{IFF{BL$EF{BLN01{{EFBLK
12701: {{IFF{BL$EV{BLN03{{EVBLK
12702: {{IFF{BL$FF{BLN05{{FFBLK
12703: {{IFF{BL$KV{BLN03{{KVBLK
12704: {{IFF{BL$PF{BLN01{{PFBLK
12705: {{IFF{BL$TE{BLN04{{TEBLK
12706: {{ESW{{{{END OF JUMP TABLE ON BLOCK TYPE
12707: {{EJC{{{{
12708: *
12709: * BLKLN (CONTINUED)
12710: *
12711: * HERE FOR BLOCKS WITH LENGTH IN SECOND WORD
12712: *
12713: {BLN00{MOV{4*1(R9){R6{{LOAD LENGTH
12714: {{EXI{{{{RETURN TO BLKLN CALLER
12715: *
12716: * HERE FOR LENGTH IN THIRD WORD (AR,CD,DF,EF,EX,PF,TB,VC)
12717: *
12718: {BLN01{MOV{4*2(R9){R6{{LOAD LENGTH FROM THIRD WORD
12719: {{EXI{{{{RETURN TO BLKLN CALLER
12720: *
12721: * HERE FOR TWO WORD BLOCKS (P0,SE)
12722: *
12723: {BLN02{MOV{#4*NUM02{R6{{LOAD LENGTH (TWO WORDS)
12724: {{EXI{{{{RETURN TO BLKLN CALLER
12725: *
12726: * HERE FOR THREE WORD BLOCKS (NM,P1,EV,KV)
12727: *
12728: {BLN03{MOV{#4*NUM03{R6{{LOAD LENGTH (THREE WORDS)
12729: {{EXI{{{{RETURN TO BLKLN CALLER
12730: *
12731: * HERE FOR FOUR WORD BLOCKS (P2,TE,BC)
12732: *
12733: {BLN04{MOV{#4*NUM04{R6{{LOAD LENGTH (FOUR WORDS)
12734: {{EXI{{{{RETURN TO BLKLN CALLER
12735: *
12736: * HERE FOR FIVE WORD BLOCKS (FF,TR)
12737: *
12738: {BLN05{MOV{#4*NUM05{R6{{LOAD LENGTH
12739: {{EXI{{{{RETURN TO BLKLN CALLER
12740: {{EJC{{{{
12741: *
12742: * BLKLN (CONTINUED)
12743: *
12744: * HERE FOR CTBLK
12745: *
12746: {BLN06{MOV{#4*CTSI${R6{{SET SIZE OF CTBLK
12747: {{EXI{{{{RETURN TO BLKLN CALLER
12748: *
12749: * HERE FOR ICBLK
12750: *
12751: {BLN07{MOV{#4*ICSI${R6{{SET SIZE OF ICBLK
12752: {{EXI{{{{RETURN TO BLKLN CALLER
12753: *
12754: * HERE FOR PDBLK
12755: *
12756: {BLN08{MOV{4*PDDFP(R9){R10{{POINT TO DFBLK
12757: {{MOV{4*DFPDL(R10){R6{{LOAD PDBLK LENGTH FROM DFBLK
12758: {{EXI{{{{RETURN TO BLKLN CALLER
12759: *
12760: * HERE FOR RCBLK
12761: *
12762: {BLN09{MOV{#4*RCSI${R6{{SET SIZE OF RCBLK
12763: {{EXI{{{{RETURN TO BLKLN CALLER
12764: *
12765: * HERE FOR SCBLK
12766: *
12767: {BLN10{MOV{4*SCLEN(R9){R6{{LOAD LENGTH IN CHARACTERS
12768: {{CTB{R6{SCSI${{CALCULATE LENGTH IN BYTES
12769: {{EXI{{{{RETURN TO BLKLN CALLER
12770: *
12771: * HERE FOR BFBLK
12772: *
12773: {BLN11{MOV{4*BFALC(R9){R6{{GET ALLOCATION IN BYTES
12774: {{CTB{R6{BFSI${{CALCULATE LENGTH IN BYTES
12775: {{EXI{{{{RETURN TO BLKLN CALLER
12776: {{ENP{{{{END PROCEDURE BLKLN
12777: {{EJC{{{{
12778: *
12779: * COPYB -- COPY A BLOCK
12780: *
12781: * (XS) BLOCK TO BE COPIED
12782: * JSR COPYB CALL TO COPY BLOCK
12783: * PPM LOC RETURN IF BLOCK HAS NO IDVAL FIELD
12784: * NORMAL RETURN IF IDVAL FIELD
12785: * (XR) COPY OF BLOCK
12786: * (XS) POPPED
12787: * (XL,WA,WB,WC) DESTROYED
12788: *
12789: {COPYB{PRC{N{1{{ENTRY POINT
12790: {{MOV{(SP){R9{{LOAD ARGUMENT
12791: {{BEQ{R9{#NULLS{COP10{RETURN ARGUMENT IF IT IS NULL
12792: {{MOV{(R9){R6{{ELSE LOAD TYPE WORD
12793: {{MOV{R6{R7{{COPY TYPE WORD
12794: {{JSR{BLKLN{{{GET LENGTH OF ARGUMENT BLOCK
12795: {{MOV{R9{R10{{COPY POINTER
12796: {{JSR{ALLOC{{{ALLOCATE BLOCK OF SAME SIZE
12797: {{MOV{R9{(SP){{STORE POINTER TO COPY
12798: {{MVW{{{{COPY CONTENTS OF OLD BLOCK TO NEW
12799: {{MOV{(SP){R9{{RELOAD POINTER TO START OF COPY
12800: {{BEQ{R7{#B$TBT{COP05{JUMP IF TABLE
12801: {{BEQ{R7{#B$VCT{COP01{JUMP IF VECTOR
12802: {{BEQ{R7{#B$PDT{COP01{JUMP IF PROGRAM DEFINED
12803: {{BEQ{R7{#B$BCT{COP11{JUMP IF BUFFER
12804: {{BNE{R7{#B$ART{COP10{RETURN COPY IF NOT ARRAY
12805: *
12806: * HERE FOR ARRAY (ARBLK)
12807: *
12808: {{ADD{4*AROFS(R9){R9{{POINT TO PROTOTYPE FIELD
12809: {{BRN{COP02{{{JUMP TO MERGE
12810: *
12811: * HERE FOR VECTOR, PROGRAM DEFINED
12812: *
12813: {COP01{ADD{#4*PDFLD{R9{{POINT TO PDFLD = VCVLS
12814: *
12815: * MERGE HERE FOR ARBLK, VCBLK, PDBLK TO DELETE TRAP
12816: * BLOCKS FROM ALL VALUE FIELDS (THE COPY IS UNTRAPPED)
12817: *
12818: {COP02{MOV{(R9){R10{{LOAD NEXT POINTER
12819: *
12820: * LOOP TO GET VALUE AT END OF TRBLK CHAIN
12821: *
12822: {COP03{BNE{(R10){#B$TRT{COP04{JUMP IF NOT TRAPPED
12823: {{MOV{4*TRVAL(R10){R10{{ELSE POINT TO NEXT VALUE
12824: {{BRN{COP03{{{AND LOOP BACK
12825: {{EJC{{{{
12826: *
12827: * COPYB (CONTINUED)
12828: *
12829: * HERE WITH UNTRAPPED VALUE IN XL
12830: *
12831: {COP04{MOV{R10{(R9)+{{STORE REAL VALUE, BUMP POINTER
12832: {{BNE{R9{DNAMP{COP02{LOOP BACK IF MORE TO GO
12833: {{BRN{COP09{{{ELSE JUMP TO EXIT
12834: *
12835: * HERE TO COPY A TABLE
12836: *
12837: {COP05{ZER{4*IDVAL(R9){{{ZERO ID TO STOP DUMP BLOWING UP
12838: {{MOV{#4*TESI${R6{{SET SIZE OF TEBLK
12839: {{MOV{#4*TBBUK{R8{{SET INITIAL OFFSET
12840: *
12841: * LOOP THROUGH BUCKETS IN TABLE
12842: *
12843: {COP06{MOV{(SP){R9{{LOAD TABLE POINTER
12844: {{BEQ{R8{4*TBLEN(R9){COP09{JUMP TO EXIT IF ALL DONE
12845: {{ADD{R8{R9{{ELSE POINT TO NEXT BUCKET HEADER
12846: {{ICA{R8{{{BUMP OFFSET
12847: {{SUB{#4*TENXT{R9{{SUBTRACT LINK OFFSET TO MERGE
12848: *
12849: * LOOP THROUGH TEBLKS ON ONE CHAIN
12850: *
12851: {COP07{MOV{4*TENXT(R9){R10{{LOAD POINTER TO NEXT TEBLK
12852: {{MOV{(SP){4*TENXT(R9){{SET END OF CHAIN POINTER IN CASE
12853: {{BEQ{(R10){#B$TBT{COP06{BACK FOR NEXT BUCKET IF CHAIN END
12854: {{MOV{R9{-(SP){{ELSE STACK PTR TO PREVIOUS BLOCK
12855: {{MOV{#4*TESI${R6{{SET SIZE OF TEBLK
12856: {{JSR{ALLOC{{{ALLOCATE NEW TEBLK
12857: {{MOV{R9{R7{{SAVE PTR TO NEW TEBLK
12858: {{MVW{{{{COPY OLD TEBLK TO NEW TEBLK
12859: {{MOV{R7{R9{{RESTORE POINTER TO NEW TEBLK
12860: {{MOV{(SP)+{R10{{RESTORE POINTER TO PREVIOUS BLOCK
12861: {{MOV{R9{4*TENXT(R10){{LINK NEW BLOCK TO PREVIOUS
12862: {{MOV{R9{R10{{COPY POINTER TO NEW BLOCK
12863: *
12864: * LOOP TO SET REAL VALUE AFTER REMOVING TRAP CHAIN
12865: *
12866: {COP08{MOV{4*TEVAL(R10){R10{{LOAD VALUE
12867: {{BEQ{(R10){#B$TRT{COP08{LOOP BACK IF TRAPPED
12868: {{MOV{R10{4*TEVAL(R9){{STORE UNTRAPPED VALUE IN TEBLK
12869: {{BRN{COP07{{{BACK FOR NEXT TEBLK
12870: *
12871: * COMMON EXIT POINT
12872: *
12873: {COP09{MOV{(SP)+{R9{{LOAD POINTER TO BLOCK
12874: {{EXI{{{{RETURN
12875: *
12876: * ALTERNATIVE RETURN
12877: *
12878: {COP10{EXI{1{{{RETURN
12879: {{EJC{{{{
12880: *
12881: * HERE TO COPY BUFFER
12882: *
12883: {COP11{MOV{4*BCBUF(R9){R10{{GET BFBLK PTR
12884: {{MOV{4*BFALC(R10){R6{{GET ALLOCATION
12885: {{CTB{R6{BFSI${{SET TOTAL SIZE
12886: {{MOV{R9{R10{{SAVE BCBLK PTR
12887: {{JSR{ALLOC{{{ALLOCATE BFBLK
12888: {{MOV{4*BCBUF(R10){R7{{GET OLD BFBLK
12889: {{MOV{R9{4*BCBUF(R10){{SET POINTER TO NEW BFBLK
12890: {{MOV{R7{R10{{POINT TO OLD BFBLK
12891: {{MVW{{{{COPY BFBLK TOO
12892: {{ZER{R10{{{CLEAR RUBBISH PTR
12893: {{BRN{COP09{{{BRANCH TO EXIT
12894: {{ENP{{{{END PROCEDURE COPYB
12895: *
12896: * CDGCG -- GENERATE CODE FOR COMPLEX GOTO
12897: *
12898: * USED BY CMPIL TO PROCESS COMPLEX GOTO TREE
12899: *
12900: * (WB) MUST BE COLLECTABLE
12901: * (XR) EXPRESSION POINTER
12902: * JSR CDGCG CALL TO GENERATE COMPLEX GOTO
12903: * (XL,XR,WA) DESTROYED
12904: *
12905: {CDGCG{PRC{E{0{{ENTRY POINT
12906: {{MOV{4*CMOPN(R9){R10{{GET UNARY GOTO OPERATOR
12907: {{MOV{4*CMROP(R9){R9{{POINT TO GOTO OPERAND
12908: {{BEQ{R10{#OPDVD{CDGC2{JUMP IF DIRECT GOTO
12909: {{JSR{CDGNM{{{GENERATE OPND BY NAME IF NOT DIRECT
12910: *
12911: * RETURN POINT
12912: *
12913: {CDGC1{MOV{R10{R6{{GOTO OPERATOR
12914: {{JSR{CDWRD{{{GENERATE IT
12915: {{EXI{{{{RETURN TO CALLER
12916: *
12917: * DIRECT GOTO
12918: *
12919: {CDGC2{JSR{CDGVL{{{GENERATE OPERAND BY VALUE
12920: {{BRN{CDGC1{{{MERGE TO RETURN
12921: {{ENP{{{{END PROCEDURE CDGCG
12922: {{EJC{{{{
12923: *
12924: * CDGEX -- BUILD EXPRESSION BLOCK
12925: *
12926: * CDGEX IS PASSED A POINTER TO AN EXPRESSION TREE (SEE
12927: * EXPAN) AND RETURNS AN EXPRESSION (SEBLK OR EXBLK).
12928: *
12929: * (WC) SOME COLLECTABLE VALUE
12930: * (WB) INTEGER IN RANGE 0 LE X LE MXLEN
12931: * (XL) PTR TO EXPRESSION TREE
12932: * JSR CDGEX CALL TO BUILD EXPRESSION
12933: * (XR) PTR TO SEBLK OR EXBLK
12934: * (XL,WA,WB) DESTROYED
12935: *
12936: {CDGEX{PRC{R{0{{ENTRY POINT, RECURSIVE
12937: {{BLO{(R10){#B$VR${CDGX1{JUMP IF NOT VARIABLE
12938: *
12939: * HERE FOR NATURAL VARIABLE, BUILD SEBLK
12940: *
12941: {{MOV{#4*SESI${R6{{SET SIZE OF SEBLK
12942: {{JSR{ALLOC{{{ALLOCATE SPACE FOR SEBLK
12943: {{MOV{#B$SEL{(R9){{SET TYPE WORD
12944: {{MOV{R10{4*SEVAR(R9){{STORE VRBLK POINTER
12945: {{EXI{{{{RETURN TO CDGEX CALLER
12946: *
12947: * HERE IF NOT VARIABLE, BUILD EXBLK
12948: *
12949: {CDGX1{MOV{R10{R9{{COPY TREE POINTER
12950: {{MOV{R8{-(SP){{SAVE WC
12951: {{MOV{CWCOF{R10{{SAVE CURRENT OFFSET
12952: {{MOV{(R9){R6{{GET TYPE WORD
12953: {{BNE{R6{#B$CMT{CDGX2{CALL BY VALUE IF NOT CMBLK
12954: {{BGE{4*CMTYP(R9){#C$$NM{CDGX2{JUMP IF CMBLK ONLY BY VALUE
12955: {{EJC{{{{
12956: *
12957: * CDGEX (CONTINUED)
12958: *
12959: * HERE IF EXPRESSION CAN BE EVALUATED BY NAME
12960: *
12961: {{JSR{CDGNM{{{GENERATE CODE BY NAME
12962: {{MOV{#ORNM${R6{{LOAD RETURN BY NAME WORD
12963: {{BRN{CDGX3{{{MERGE WITH VALUE CASE
12964: *
12965: * HERE IF EXPRESSION CAN ONLY BE EVALUATED BY VALUE
12966: *
12967: {CDGX2{JSR{CDGVL{{{GENERATE CODE BY VALUE
12968: {{MOV{#ORVL${R6{{LOAD RETURN BY VALUE WORD
12969: *
12970: * MERGE HERE TO CONSTRUCT EXBLK
12971: *
12972: {CDGX3{JSR{CDWRD{{{GENERATE RETURN WORD
12973: {{JSR{EXBLD{{{BUILD EXBLK
12974: {{MOV{(SP)+{R8{{RESTORE WC
12975: {{EXI{{{{RETURN TO CDGEX CALLER
12976: {{ENP{{{{END PROCEDURE CDGEX
12977: {{EJC{{{{
12978: *
12979: * CDGNM -- GENERATE CODE BY NAME
12980: *
12981: * CDGNM IS CALLED DURING THE COMPILATION PROCESS TO
12982: * GENERATE CODE BY NAME FOR AN EXPRESSION. SEE CDBLK
12983: * DESCRIPTION FOR DETAILS OF CODE GENERATED. THE INPUT
12984: * TO CDGNM IS AN EXPRESSION TREE AS GENERATED BY EXPAN.
12985: *
12986: * CDGNM IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING
12987: * RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS.
12988: *
12989: * (WB) INTEGER IN RANGE 0 LE N LE DNAMB
12990: * (XR) PTR TO TREE GENERATED BY EXPAN
12991: * (WC) CONSTANT FLAG (SEE BELOW)
12992: * JSR CDGNM CALL TO GENERATE CODE BY NAME
12993: * (XR,WA) DESTROYED
12994: * (WC) SET NON-ZERO IF NON-CONSTANT
12995: *
12996: * WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE
12997: * EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE
12998: * EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED.
12999: *
13000: * THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD).
13001: *
13002: {CDGNM{PRC{R{0{{ENTRY POINT, RECURSIVE
13003: {{MOV{R10{-(SP){{SAVE ENTRY XL
13004: {{MOV{R7{-(SP){{SAVE ENTRY WB
13005: {{CHK{{{{CHECK FOR STACK OVERFLOW
13006: {{MOV{(R9){R6{{LOAD TYPE WORD
13007: {{BEQ{R6{#B$CMT{CGN04{JUMP IF CMBLK
13008: {{BHI{R6{#B$VR${CGN02{JUMP IF SIMPLE VARIABLE
13009: *
13010: * MERGE HERE FOR OPERAND YIELDING VALUE (E.G. CONSTANT)
13011: *
13012: {CGN01{ERB{212{SYNTAX{{ERROR. VALUE USED WHERE NAME IS REQUIRED
13013: *
13014: * HERE FOR NATURAL VARIABLE REFERENCE
13015: *
13016: {CGN02{MOV{#OLVN${R6{{LOAD VARIABLE LOAD CALL
13017: {{JSR{CDWRD{{{GENERATE IT
13018: {{MOV{R9{R6{{COPY VRBLK POINTER
13019: {{JSR{CDWRD{{{GENERATE VRBLK POINTER
13020: {{EJC{{{{
13021: *
13022: * CDGNM (CONTINUED)
13023: *
13024: * HERE TO EXIT WITH WC SET CORRECTLY
13025: *
13026: {CGN03{MOV{(SP)+{R7{{RESTORE ENTRY WB
13027: {{MOV{(SP)+{R10{{RESTORE ENTRY XL
13028: {{EXI{{{{RETURN TO CDGNM CALLER
13029: *
13030: * HERE FOR CMBLK
13031: *
13032: {CGN04{MOV{R9{R10{{COPY CMBLK POINTER
13033: {{MOV{4*CMTYP(R9){R9{{LOAD CMBLK TYPE
13034: {{BGE{R9{#C$$NM{CGN01{ERROR IF NOT NAME OPERAND
13035: {{BSW{R9{C$$NM{{ELSE SWITCH ON TYPE
13036: {{IFF{C$ARR{CGN05{{ARRAY REFERENCE
13037: {{IFF{C$FNC{CGN08{{FUNCTION CALL
13038: {{IFF{C$DEF{CGN09{{DEFERRED EXPRESSION
13039: {{IFF{C$IND{CGN10{{INDIRECT REFERENCE
13040: {{IFF{C$KEY{CGN11{{KEYWORD REFERENCE
13041: {{IFF{C$UBO{CGN08{{UNDEFINED BINARY OP
13042: {{IFF{C$UUO{CGN08{{UNDEFINED UNARY OP
13043: {{ESW{{{{END SWITCH ON CMBLK TYPE
13044: *
13045: * HERE TO GENERATE CODE FOR ARRAY REFERENCE
13046: *
13047: {CGN05{MOV{#4*CMOPN{R7{{POINT TO ARRAY OPERAND
13048: *
13049: * LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS
13050: *
13051: {CGN06{JSR{CMGEN{{{GENERATE CODE FOR NEXT OPERAND
13052: {{MOV{4*CMLEN(R10){R8{{LOAD LENGTH OF CMBLK
13053: {{BLT{R7{R8{CGN06{LOOP TILL ALL GENERATED
13054: *
13055: * GENERATE APPROPRIATE ARRAY CALL
13056: *
13057: {{MOV{#OAON${R6{{LOAD ONE-SUBSCRIPT CASE CALL
13058: {{BEQ{R8{#4*CMAR1{CGN07{JUMP TO EXIT IF ONE SUBSCRIPT CASE
13059: {{MOV{#OAMN${R6{{ELSE LOAD MULTI-SUBSCRIPT CASE CALL
13060: {{JSR{CDWRD{{{GENERATE CALL
13061: {{MOV{R8{R6{{COPY CMBLK LENGTH
13062: {{BTW{R6{{{CONVERT TO WORDS
13063: {{SUB{#CMVLS{R6{{CALCULATE NUMBER OF SUBSCRIPTS
13064: {{EJC{{{{
13065: *
13066: * CDGNM (CONTINUED)
13067: *
13068: * HERE TO EXIT GENERATING WORD (NON-CONSTANT)
13069: *
13070: {CGN07{MNZ{R8{{{SET RESULT NON-CONSTANT
13071: {{JSR{CDWRD{{{GENERATE WORD
13072: {{BRN{CGN03{{{BACK TO EXIT
13073: *
13074: * HERE TO GENERATE CODE FOR FUNCTIONS AND UNDEFINED OPRS
13075: *
13076: {CGN08{MOV{R10{R9{{COPY CMBLK POINTER
13077: {{JSR{CDGVL{{{GEN CODE BY VALUE FOR CALL
13078: {{MOV{#OFNE${R6{{GET EXTRA CALL FOR BY NAME
13079: {{BRN{CGN07{{{BACK TO GENERATE AND EXIT
13080: *
13081: * HERE TO GENERATE CODE FOR DEFERED EXPRESSION
13082: *
13083: {CGN09{MOV{4*CMROP(R10){R9{{CHECK IF VARIABLE
13084: {{BHI{(R9){#B$VR${CGN02{TREAT *VARIABLE AS SIMPLE VAR
13085: {{MOV{R9{R10{{COPY PTR TO EXPRESSION TREE
13086: {{JSR{CDGEX{{{ELSE BUILD EXBLK
13087: {{MOV{#OLEX${R6{{SET CALL TO LOAD EXPR BY NAME
13088: {{JSR{CDWRD{{{GENERATE IT
13089: {{MOV{R9{R6{{COPY EXBLK POINTER
13090: {{JSR{CDWRD{{{GENERATE EXBLK POINTER
13091: {{BRN{CGN03{{{BACK TO EXIT
13092: *
13093: * HERE TO GENERATE CODE FOR INDIRECT REFERENCE
13094: *
13095: {CGN10{MOV{4*CMROP(R10){R9{{GET OPERAND
13096: {{JSR{CDGVL{{{GENERATE CODE BY VALUE FOR IT
13097: {{MOV{#OINN${R6{{LOAD CALL FOR INDIRECT BY NAME
13098: {{BRN{CGN12{{{MERGE
13099: *
13100: * HERE TO GENERATE CODE FOR KEYWORD REFERENCE
13101: *
13102: {CGN11{MOV{4*CMROP(R10){R9{{GET OPERAND
13103: {{JSR{CDGNM{{{GENERATE CODE BY NAME FOR IT
13104: {{MOV{#OKWN${R6{{LOAD CALL FOR KEYWORD BY NAME
13105: *
13106: * KEYWORD, INDIRECT MERGE HERE
13107: *
13108: {CGN12{JSR{CDWRD{{{GENERATE CODE FOR OPERATOR
13109: {{BRN{CGN03{{{EXIT
13110: {{ENP{{{{END PROCEDURE CDGNM
13111: {{EJC{{{{
13112: *
13113: * CDGVL -- GENERATE CODE BY VALUE
13114: *
13115: * CDGVL IS CALLED DURING THE COMPILATION PROCESS TO
13116: * GENERATE CODE BY VALUE FOR AN EXPRESSION. SEE CDBLK
13117: * DESCRIPTION FOR DETAILS OF THE CODE GENERATED. THE INPUT
13118: * TO CDGVL IS AN EXPRESSION TREE AS GENERATED BY EXPAN.
13119: *
13120: * CDGVL IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING
13121: * RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS.
13122: *
13123: * (WB) INTEGER IN RANGE 0 LE N LE DNAMB
13124: * (XR) PTR TO TREE GENERATED BY EXPAN
13125: * (WC) CONSTANT FLAG (SEE BELOW)
13126: * JSR CDGVL CALL TO GENERATE CODE BY VALUE
13127: * (XR,WA) DESTROYED
13128: * (WC) SET NON-ZERO IF NON-CONSTANT
13129: *
13130: * WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE
13131: * EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE
13132: * EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED.
13133: *
13134: * IF WC IS NON-ZERO ON ENTRY, THEN PREEVALUATION IS NOT
13135: * ALLOWED REGARDLESS OF THE NATURE OF THE OPERAND.
13136: *
13137: * THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD).
13138: *
13139: {CDGVL{PRC{R{0{{ENTRY POINT, RECURSIVE
13140: {{MOV{(R9){R6{{LOAD TYPE WORD
13141: {{BEQ{R6{#B$CMT{CGV01{JUMP IF CMBLK
13142: {{BLT{R6{#B$VRA{CGV00{JUMP IF ICBLK, RCBLK, SCBLK
13143: {{BNZ{4*VRLEN(R9){CGVL0{{JUMP IF NOT SYSTEM VARIABLE
13144: {{MOV{R9{-(SP){{STACK XR
13145: {{MOV{4*VRSVP(R9){R9{{POINT TO SVBLK
13146: {{MOV{4*SVBIT(R9){R6{{GET SVBLK PROPERTY BITS
13147: {{MOV{(SP)+{R9{{RECOVER XR
13148: {{ANB{BTCKW{R6{{CHECK IF CONSTANT KEYWORD
13149: {{NZB{R6{CGV00{{JUMP IF CONSTANT KEYWORD
13150: *
13151: * HERE FOR VARIABLE VALUE REFERENCE
13152: *
13153: {CGVL0{MNZ{R8{{{INDICATE NON-CONSTANT VALUE
13154: *
13155: * MERGE HERE FOR SIMPLE CONSTANT (ICBLK,RCBLK,SCBLK)
13156: * AND FOR VARIABLES CORRESPONDING TO CONSTANT KEYWORDS.
13157: *
13158: {CGV00{MOV{R9{R6{{COPY PTR TO VAR OR CONSTANT
13159: {{JSR{CDWRD{{{GENERATE AS CODE WORD
13160: {{EXI{{{{RETURN TO CALLER
13161: {{EJC{{{{
13162: *
13163: * CDGVL (CONTINUED)
13164: *
13165: * HERE FOR TREE NODE (CMBLK)
13166: *
13167: {CGV01{MOV{R7{-(SP){{SAVE ENTRY WB
13168: {{MOV{R10{-(SP){{SAVE ENTRY XL
13169: {{MOV{R8{-(SP){{SAVE ENTRY CONSTANT FLAG
13170: {{MOV{CWCOF{-(SP){{SAVE INITIAL CODE OFFSET
13171: {{CHK{{{{CHECK FOR STACK OVERFLOW
13172: *
13173: * PREPARE TO GENERATE CODE FOR CMBLK. WC IS SET TO THE
13174: * VALUE OF CSWNO (ZERO IF -OPTIMISE, 1 IF -NOOPT) TO
13175: * START WITH AND IS RESET NON-ZERO FOR ANY NON-CONSTANT
13176: * CODE GENERATED. IF IT IS STILL ZERO AFTER GENERATING ALL
13177: * THE CMBLK CODE, THEN ITS VALUE IS COMPUTED AS THE RESULT.
13178: *
13179: {{MOV{R9{R10{{COPY CMBLK POINTER
13180: {{MOV{4*CMTYP(R9){R9{{LOAD CMBLK TYPE
13181: {{MOV{CSWNO{R8{{RESET CONSTANT FLAG
13182: {{BLE{R9{#C$PR${CGV02{JUMP IF NOT PREDICATE VALUE
13183: {{MNZ{R8{{{ELSE FORCE NON-CONSTANT CASE
13184: *
13185: * HERE WITH WC SET APPROPRIATELY
13186: *
13187: {CGV02{BSW{R9{C$$NV{{SWITCH TO APPROPRIATE GENERATOR
13188: {{IFF{C$ARR{CGV03{{ARRAY REFERENCE
13189: {{IFF{C$FNC{CGV05{{FUNCTION CALL
13190: {{IFF{C$DEF{CGV14{{DEFERRED EXPRESSION
13191: {{IFF{C$IND{CGV31{{INDIRECT REFERENCE
13192: {{IFF{C$KEY{CGV27{{KEYWORD REFERENCE
13193: {{IFF{C$UBO{CGV29{{UNDEFINED BINOP
13194: {{IFF{C$UUO{CGV30{{UNDEFINED UNOP
13195: {{IFF{C$BVL{CGV18{{BINOPS WITH VAL OPDS
13196: {{IFF{C$UVL{CGV19{{UNOPS WITH VALU OPND
13197: {{IFF{C$ALT{CGV18{{ALTERNATION
13198: {{IFF{C$CNC{CGV24{{CONCATENATION
13199: {{IFF{C$CNP{CGV24{{CONCATENATION (NOT PATTERN MATCH)
13200: {{IFF{C$UNM{CGV27{{UNOPS WITH NAME OPND
13201: {{IFF{C$BVN{CGV26{{BINARY $ AND .
13202: {{IFF{C$ASS{CGV21{{ASSIGNMENT
13203: {{IFF{C$INT{CGV31{{INTERROGATION
13204: {{IFF{C$NEG{CGV28{{NEGATION
13205: {{IFF{C$SEL{CGV15{{SELECTION
13206: {{IFF{C$PMT{CGV18{{PATTERN MATCH
13207: {{ESW{{{{END SWITCH ON CMBLK TYPE
13208: {{EJC{{{{
13209: *
13210: * CDGVL (CONTINUED)
13211: *
13212: * HERE TO GENERATE CODE FOR ARRAY REFERENCE
13213: *
13214: {CGV03{MOV{#4*CMOPN{R7{{SET OFFSET TO ARRAY OPERAND
13215: *
13216: * LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS
13217: *
13218: {CGV04{JSR{CMGEN{{{GEN VALUE CODE FOR NEXT OPERAND
13219: {{MOV{4*CMLEN(R10){R8{{LOAD CMBLK LENGTH
13220: {{BLT{R7{R8{CGV04{LOOP BACK IF MORE TO GO
13221: *
13222: * GENERATE CALL TO APPROPRIATE ARRAY REFERENCE ROUTINE
13223: *
13224: {{MOV{#OAOV${R6{{SET ONE SUBSCRIPT CALL IN CASE
13225: {{BEQ{R8{#4*CMAR1{CGV32{JUMP TO EXIT IF 1-SUB CASE
13226: {{MOV{#OAMV${R6{{ELSE SET CALL FOR MULTI-SUBSCRIPTS
13227: {{JSR{CDWRD{{{GENERATE CALL
13228: {{MOV{R8{R6{{COPY LENGTH OF CMBLK
13229: {{SUB{#4*CMVLS{R6{{SUBTRACT STANDARD LENGTH
13230: {{BTW{R6{{{GET NUMBER OF WORDS
13231: {{BRN{CGV32{{{JUMP TO GENERATE SUBSCRIPT COUNT
13232: *
13233: * HERE TO GENERATE CODE FOR FUNCTION CALL
13234: *
13235: {CGV05{MOV{#4*CMVLS{R7{{SET OFFSET TO FIRST ARGUMENT
13236: *
13237: * LOOP TO GENERATE CODE FOR ARGUMENTS
13238: *
13239: {CGV06{BEQ{R7{4*CMLEN(R10){CGV07{JUMP IF ALL GENERATED
13240: {{JSR{CMGEN{{{ELSE GEN VALUE CODE FOR NEXT ARG
13241: {{BRN{CGV06{{{BACK TO GENERATE NEXT ARGUMENT
13242: *
13243: * HERE TO GENERATE ACTUAL FUNCTION CALL
13244: *
13245: {CGV07{SUB{#4*CMVLS{R7{{GET NUMBER OF ARG PTRS (BYTES)
13246: {{BTW{R7{{{CONVERT BYTES TO WORDS
13247: {{MOV{4*CMOPN(R10){R9{{LOAD FUNCTION VRBLK POINTER
13248: {{BNZ{4*VRLEN(R9){CGV12{{JUMP IF NOT SYSTEM FUNCTION
13249: {{MOV{4*VRSVP(R9){R10{{LOAD SVBLK PTR IF SYSTEM VAR
13250: {{MOV{4*SVBIT(R10){R6{{LOAD BIT MASK
13251: {{ANB{BTFFC{R6{{TEST FOR FAST FUNCTION CALL ALLOWED
13252: {{ZRB{R6{CGV12{{JUMP IF NOT
13253: {{EJC{{{{
13254: *
13255: * CDGVL (CONTINUED)
13256: *
13257: * HERE IF FAST FUNCTION CALL IS ALLOWED
13258: *
13259: {{MOV{4*SVBIT(R10){R6{{RELOAD BIT INDICATORS
13260: {{ANB{BTPRE{R6{{TEST FOR PREEVALUATION OK
13261: {{NZB{R6{CGV08{{JUMP IF PREEVALUATION PERMITTED
13262: {{MNZ{R8{{{ELSE SET RESULT NON-CONSTANT
13263: *
13264: * TEST FOR CORRECT NUMBER OF ARGS FOR FAST CALL
13265: *
13266: {CGV08{MOV{4*VRFNC(R9){R10{{LOAD PTR TO SVFNC FIELD
13267: {{MOV{4*FARGS(R10){R6{{LOAD SVNAR FIELD VALUE
13268: {{BEQ{R6{R7{CGV11{JUMP IF ARGUMENT COUNT IS CORRECT
13269: {{BHI{R6{R7{CGV09{JUMP IF TOO FEW ARGUMENTS GIVEN
13270: *
13271: * HERE IF TOO MANY ARGUMENTS, PREPARE TO GENERATE O$POPS
13272: *
13273: {{SUB{R6{R7{{GET NUMBER OF EXTRA ARGS
13274: {{LCT{R7{R7{{SET AS COUNT TO CONTROL LOOP
13275: {{MOV{#OPOP${R6{{SET POP CALL
13276: {{BRN{CGV10{{{JUMP TO COMMON LOOP
13277: *
13278: * HERE IF TOO FEW ARGUMENTS, PREPARE TO GENERATE NULLS
13279: *
13280: {CGV09{SUB{R7{R6{{GET NUMBER OF MISSING ARGUMENTS
13281: {{LCT{R7{R6{{LOAD AS COUNT TO CONTROL LOOP
13282: {{MOV{#NULLS{R6{{LOAD PTR TO NULL CONSTANT
13283: *
13284: * LOOP TO GENERATE CALLS TO FIX ARGUMENT COUNT
13285: *
13286: {CGV10{JSR{CDWRD{{{GENERATE ONE CALL
13287: {{BCT{R7{CGV10{{LOOP TILL ALL GENERATED
13288: *
13289: * HERE AFTER ADJUSTING ARG COUNT AS REQUIRED
13290: *
13291: {CGV11{MOV{R10{R6{{COPY POINTER TO SVFNC FIELD
13292: {{BRN{CGV36{{{JUMP TO GENERATE CALL
13293: {{EJC{{{{
13294: *
13295: * CDGVL (CONTINUED)
13296: *
13297: * COME HERE IF FAST CALL IS NOT PERMITTED
13298: *
13299: {CGV12{MOV{#OFNS${R6{{SET ONE ARG CALL IN CASE
13300: {{BEQ{R7{#NUM01{CGV13{JUMP IF ONE ARG CASE
13301: {{MOV{#OFNC${R6{{ELSE LOAD CALL FOR MORE THAN 1 ARG
13302: {{JSR{CDWRD{{{GENERATE IT
13303: {{MOV{R7{R6{{COPY ARGUMENT COUNT
13304: *
13305: * ONE ARG CASE MERGES HERE
13306: *
13307: {CGV13{JSR{CDWRD{{{GENERATE =O$FNS OR ARG COUNT
13308: {{MOV{R9{R6{{COPY VRBLK POINTER
13309: {{BRN{CGV32{{{JUMP TO GENERATE VRBLK PTR
13310: *
13311: * HERE FOR DEFERRED EXPRESSION
13312: *
13313: {CGV14{MOV{4*CMROP(R10){R10{{POINT TO EXPRESSION TREE
13314: {{JSR{CDGEX{{{BUILD EXBLK OR SEBLK
13315: {{MOV{R9{R6{{COPY BLOCK PTR
13316: {{JSR{CDWRD{{{GENERATE PTR TO EXBLK OR SEBLK
13317: {{BRN{CGV34{{{JUMP TO EXIT, CONSTANT TEST
13318: *
13319: * HERE TO GENERATE CODE FOR SELECTION
13320: *
13321: {CGV15{ZER{-(SP){{{ZERO PTR TO CHAIN OF FORWARD JUMPS
13322: {{ZER{-(SP){{{ZERO PTR TO PREV O$SLC FORWARD PTR
13323: {{MOV{#4*CMVLS{R7{{POINT TO FIRST ALTERNATIVE
13324: {{MOV{#OSLA${R6{{SET INITIAL CODE WORD
13325: *
13326: * 0(XS) IS THE OFFSET TO THE PREVIOUS WORD
13327: * WHICH REQUIRES FILLING IN WITH AN
13328: * OFFSET TO THE FOLLOWING O$SLC,O$SLD
13329: *
13330: * 1(XS) IS THE HEAD OF A CHAIN OF OFFSET
13331: * POINTERS INDICATING THOSE LOCATIONS
13332: * TO BE FILLED WITH OFFSETS PAST
13333: * THE END OF ALL THE ALTERNATIVES
13334: *
13335: {CGV16{JSR{CDWRD{{{GENERATE O$SLC (O$SLA FIRST TIME)
13336: {{MOV{CWCOF{(SP){{SET CURRENT LOC AS PTR TO FILL IN
13337: {{JSR{CDWRD{{{GENERATE GARBAGE WORD THERE FOR NOW
13338: {{JSR{CMGEN{{{GEN VALUE CODE FOR ALTERNATIVE
13339: {{MOV{#OSLB${R6{{LOAD O$SLB POINTER
13340: {{JSR{CDWRD{{{GENERATE O$SLB CALL
13341: {{MOV{4*1(SP){R6{{LOAD OLD CHAIN PTR
13342: {{MOV{CWCOF{4*1(SP){{SET CURRENT LOC AS NEW CHAIN HEAD
13343: {{JSR{CDWRD{{{GENERATE FORWARD CHAIN LINK
13344: {{EJC{{{{
13345: *
13346: * CDGVL (CONTINUED)
13347: *
13348: * NOW TO FILL IN THE SKIP OFFSET TO O$SLC,O$SLD
13349: *
13350: {{MOV{(SP){R9{{LOAD OFFSET TO WORD TO PLUG
13351: {{ADD{R$CCB{R9{{POINT TO ACTUAL LOCATION TO PLUG
13352: {{MOV{CWCOF{(R9){{PLUG PROPER OFFSET IN
13353: {{MOV{#OSLC${R6{{LOAD O$SLC PTR FOR NEXT ALTERNATIVE
13354: {{MOV{R7{R9{{COPY OFFSET (DESTROY GARBAGE XR)
13355: {{ICA{R9{{{BUMP EXTRA TIME FOR TEST
13356: {{BLT{R9{4*CMLEN(R10){CGV16{LOOP BACK IF NOT LAST ALTERNATIVE
13357: *
13358: * HERE TO GENERATE CODE FOR LAST ALTERNATIVE
13359: *
13360: {{MOV{#OSLD${R6{{GET HEADER CALL
13361: {{JSR{CDWRD{{{GENERATE O$SLD CALL
13362: {{JSR{CMGEN{{{GENERATE CODE FOR LAST ALTERNATIVE
13363: {{ICA{SP{{{POP OFFSET PTR
13364: {{MOV{(SP)+{R9{{LOAD CHAIN PTR
13365: *
13366: * LOOP TO PLUG OFFSETS PAST STRUCTURE
13367: *
13368: {CGV17{ADD{R$CCB{R9{{MAKE NEXT PTR ABSOLUTE
13369: {{MOV{(R9){R6{{LOAD FORWARD PTR
13370: {{MOV{CWCOF{(R9){{PLUG REQUIRED OFFSET
13371: {{MOV{R6{R9{{COPY FORWARD PTR
13372: {{BNZ{R6{CGV17{{LOOP BACK IF MORE TO GO
13373: {{BRN{CGV33{{{ELSE JUMP TO EXIT (NOT CONSTANT)
13374: *
13375: * HERE FOR BINARY OPS WITH VALUE OPERANDS
13376: *
13377: {CGV18{MOV{4*CMLOP(R10){R9{{LOAD LEFT OPERAND POINTER
13378: {{JSR{CDGVL{{{GEN VALUE CODE FOR LEFT OPERAND
13379: *
13380: * HERE FOR UNARY OPS WITH VALUE OPERAND (BINOPS MERGE)
13381: *
13382: {CGV19{MOV{4*CMROP(R10){R9{{LOAD RIGHT (ONLY) OPERAND PTR
13383: {{JSR{CDGVL{{{GEN CODE BY VALUE
13384: {{EJC{{{{
13385: *
13386: * CDGVL (CONTINUED)
13387: *
13388: * MERGE HERE TO GENERATE OPERATOR CALL FROM CMOPN FIELD
13389: *
13390: {CGV20{MOV{4*CMOPN(R10){R6{{LOAD OPERATOR CALL POINTER
13391: {{BRN{CGV36{{{JUMP TO GENERATE IT WITH CONS TEST
13392: *
13393: * HERE FOR ASSIGNMENT
13394: *
13395: {CGV21{MOV{4*CMLOP(R10){R9{{LOAD LEFT OPERAND POINTER
13396: {{BLO{(R9){#B$VR${CGV22{JUMP IF NOT VARIABLE
13397: *
13398: * HERE FOR ASSIGNMENT TO SIMPLE VARIABLE
13399: *
13400: {{MOV{4*CMROP(R10){R9{{LOAD RIGHT OPERAND PTR
13401: {{JSR{CDGVL{{{GENERATE CODE BY VALUE
13402: {{MOV{4*CMLOP(R10){R6{{RELOAD LEFT OPERAND VRBLK PTR
13403: {{ADD{#4*VRSTO{R6{{POINT TO VRSTO FIELD
13404: {{BRN{CGV32{{{JUMP TO GENERATE STORE PTR
13405: *
13406: * HERE IF NOT SIMPLE VARIABLE ASSIGNMENT
13407: *
13408: {CGV22{JSR{EXPAP{{{TEST FOR PATTERN MATCH ON LEFT SIDE
13409: {{PPM{CGV23{{{JUMP IF NOT PATTERN MATCH
13410: *
13411: * HERE FOR PATTERN REPLACEMENT
13412: *
13413: {{MOV{4*CMROP(R9){4*CMLOP(R10){{SAVE PATTERN PTR IN SAFE PLACE
13414: {{MOV{4*CMLOP(R9){R9{{LOAD SUBJECT PTR
13415: {{JSR{CDGNM{{{GEN CODE BY NAME FOR SUBJECT
13416: {{MOV{4*CMLOP(R10){R9{{LOAD PATTERN PTR
13417: {{JSR{CDGVL{{{GEN CODE BY VALUE FOR PATTERN
13418: {{MOV{#OPMN${R6{{LOAD MATCH BY NAME CALL
13419: {{JSR{CDWRD{{{GENERATE IT
13420: {{MOV{4*CMROP(R10){R9{{LOAD REPLACEMENT VALUE PTR
13421: {{JSR{CDGVL{{{GEN CODE BY VALUE
13422: {{MOV{#ORPL${R6{{LOAD REPLACE CALL
13423: {{BRN{CGV32{{{JUMP TO GEN AND EXIT (NOT CONSTANT)
13424: *
13425: * HERE FOR ASSIGNMENT TO COMPLEX VARIABLE
13426: *
13427: {CGV23{MNZ{R8{{{INHIBIT PRE-EVALUATION
13428: {{JSR{CDGNM{{{GEN CODE BY NAME FOR LEFT SIDE
13429: {{BRN{CGV31{{{MERGE WITH UNOP CIRCUIT
13430: {{EJC{{{{
13431: *
13432: * CDGVL (CONTINUED)
13433: *
13434: * HERE FOR CONCATENATION
13435: *
13436: {CGV24{MOV{4*CMLOP(R10){R9{{LOAD LEFT OPERAND PTR
13437: {{BNE{(R9){#B$CMT{CGV18{ORDINARY BINOP IF NOT CMBLK
13438: {{MOV{4*CMTYP(R9){R7{{LOAD CMBLK TYPE CODE
13439: {{BEQ{R7{#C$INT{CGV25{SPECIAL CASE IF INTERROGATION
13440: {{BEQ{R7{#C$NEG{CGV25{OR NEGATION
13441: {{BNE{R7{#C$FNC{CGV18{ELSE ORDINARY BINOP IF NOT FUNCTION
13442: {{MOV{4*CMOPN(R9){R9{{ELSE LOAD FUNCTION VRBLK PTR
13443: {{BNZ{4*VRLEN(R9){CGV18{{ORDINARY BINOP IF NOT SYSTEM VAR
13444: {{MOV{4*VRSVP(R9){R9{{ELSE POINT TO SVBLK
13445: {{MOV{4*SVBIT(R9){R6{{LOAD BIT INDICATORS
13446: {{ANB{BTPRD{R6{{TEST FOR PREDICATE FUNCTION
13447: {{ZRB{R6{CGV18{{ORDINARY BINOP IF NOT
13448: *
13449: * HERE IF LEFT ARG OF CONCATENATION IS PREDICATE FUNCTION
13450: *
13451: {CGV25{MOV{4*CMLOP(R10){R9{{RELOAD LEFT ARG
13452: {{JSR{CDGVL{{{GEN CODE BY VALUE
13453: {{MOV{#OPOP${R6{{LOAD POP CALL
13454: {{JSR{CDWRD{{{GENERATE IT
13455: {{MOV{4*CMROP(R10){R9{{LOAD RIGHT OPERAND
13456: {{JSR{CDGVL{{{GEN CODE BY VALUE AS RESULT CODE
13457: {{BRN{CGV33{{{EXIT (NOT CONSTANT)
13458: *
13459: * HERE TO GENERATE CODE FOR PATTERN, IMMEDIATE ASSIGNMENT
13460: *
13461: {CGV26{MOV{4*CMLOP(R10){R9{{LOAD LEFT OPERAND
13462: {{JSR{CDGVL{{{GEN CODE BY VALUE, MERGE
13463: *
13464: * HERE FOR UNOPS WITH ARG BY NAME (BINARY $ . MERGE)
13465: *
13466: {CGV27{MOV{4*CMROP(R10){R9{{LOAD RIGHT OPERAND PTR
13467: {{JSR{CDGNM{{{GEN CODE BY NAME FOR RIGHT ARG
13468: {{MOV{4*CMOPN(R10){R9{{GET OPERATOR CODE WORD
13469: {{BNE{(R9){#O$KWV{CGV20{GEN CALL UNLESS KEYWORD VALUE
13470: {{EJC{{{{
13471: *
13472: * CDGVL (CONTINUED)
13473: *
13474: * HERE FOR KEYWORD BY VALUE. THIS IS CONSTANT ONLY IF
13475: * THE OPERAND IS ONE OF THE SPECIAL SYSTEM VARIABLES WITH
13476: * THE SVCKW BIT SET TO INDICATE A CONSTANT KEYWORD VALUE.
13477: * NOTE THAT THE ONLY CONSTANT OPERAND BY NAME IS A VARIABLE
13478: *
13479: {{BNZ{R8{CGV20{{GEN CALL IF NON-CONSTANT (NOT VAR)
13480: {{MNZ{R8{{{ELSE SET NON-CONSTANT IN CASE
13481: {{MOV{4*CMROP(R10){R9{{LOAD PTR TO OPERAND VRBLK
13482: {{BNZ{4*VRLEN(R9){CGV20{{GEN (NON-CONSTANT) IF NOT SYS VAR
13483: {{MOV{4*VRSVP(R9){R9{{ELSE LOAD PTR TO SVBLK
13484: {{MOV{4*SVBIT(R9){R6{{LOAD BIT MASK
13485: {{ANB{BTCKW{R6{{TEST FOR CONSTANT KEYWORD
13486: {{ZRB{R6{CGV20{{GO GEN IF NOT CONSTANT
13487: {{ZER{R8{{{ELSE SET RESULT CONSTANT
13488: {{BRN{CGV20{{{AND JUMP BACK TO GENERATE CALL
13489: *
13490: * HERE TO GENERATE CODE FOR NEGATION
13491: *
13492: {CGV28{MOV{#ONTA${R6{{GET INITIAL WORD
13493: {{JSR{CDWRD{{{GENERATE IT
13494: {{MOV{CWCOF{R7{{SAVE NEXT OFFSET
13495: {{JSR{CDWRD{{{GENERATE GUNK WORD FOR NOW
13496: {{MOV{4*CMROP(R10){R9{{LOAD RIGHT OPERAND PTR
13497: {{JSR{CDGVL{{{GEN CODE BY VALUE
13498: {{MOV{#ONTB${R6{{LOAD END OF EVALUATION CALL
13499: {{JSR{CDWRD{{{GENERATE IT
13500: {{MOV{R7{R9{{COPY OFFSET TO WORD TO PLUG
13501: {{ADD{R$CCB{R9{{POINT TO ACTUAL WORD TO PLUG
13502: {{MOV{CWCOF{(R9){{PLUG WORD WITH CURRENT OFFSET
13503: {{MOV{#ONTC${R6{{LOAD FINAL CALL
13504: {{BRN{CGV32{{{JUMP TO GENERATE IT (NOT CONSTANT)
13505: *
13506: * HERE TO GENERATE CODE FOR UNDEFINED BINARY OPERATOR
13507: *
13508: {CGV29{MOV{4*CMLOP(R10){R9{{LOAD LEFT OPERAND PTR
13509: {{JSR{CDGVL{{{GENERATE CODE BY VALUE
13510: {{EJC{{{{
13511: *
13512: * CDGVL (CONTINUED)
13513: *
13514: * HERE TO GENERATE CODE FOR UNDEFINED UNARY OPERATOR
13515: *
13516: {CGV30{MOV{#C$UO${R7{{SET UNOP CODE + 1
13517: {{SUB{4*CMTYP(R10){R7{{SET NUMBER OF ARGS (1 OR 2)
13518: *
13519: * MERGE HERE FOR UNDEFINED OPERATORS
13520: *
13521: {{MOV{4*CMROP(R10){R9{{LOAD RIGHT (ONLY) OPERAND POINTER
13522: {{JSR{CDGVL{{{GEN VALUE CODE FOR RIGHT OPERAND
13523: {{MOV{4*CMOPN(R10){R9{{LOAD POINTER TO OPERATOR DV
13524: {{MOV{4*DVOPN(R9){R9{{LOAD POINTER OFFSET
13525: {{WTB{R9{{{CONVERT WORD OFFSET TO BYTES
13526: {{ADD{#R$UBA{R9{{POINT TO PROPER FUNCTION PTR
13527: {{SUB{#4*VRFNC{R9{{SET STANDARD FUNCTION OFFSET
13528: {{BRN{CGV12{{{MERGE WITH FUNCTION CALL CIRCUIT
13529: *
13530: * HERE TO GENERATE CODE FOR INTERROGATION, INDIRECTION
13531: *
13532: {CGV31{MNZ{R8{{{SET NON CONSTANT
13533: {{BRN{CGV19{{{MERGE
13534: *
13535: * HERE TO EXIT GENERATING A WORD, RESULT NOT CONSTANT
13536: *
13537: {CGV32{JSR{CDWRD{{{GENERATE WORD, MERGE
13538: *
13539: * HERE TO EXIT WITH NO WORD GENERATED, NOT CONSTANT
13540: *
13541: {CGV33{MNZ{R8{{{INDICATE RESULT IS NOT CONSTANT
13542: *
13543: * COMMON EXIT POINT
13544: *
13545: {CGV34{ICA{SP{{{POP INITIAL CODE OFFSET
13546: {{MOV{(SP)+{R6{{RESTORE OLD CONSTANT FLAG
13547: {{MOV{(SP)+{R10{{RESTORE ENTRY XL
13548: {{MOV{(SP)+{R7{{RESTORE ENTRY WB
13549: {{BNZ{R8{CGV35{{JUMP IF NOT CONSTANT
13550: {{MOV{R6{R8{{ELSE RESTORE ENTRY CONSTANT FLAG
13551: *
13552: * HERE TO RETURN AFTER DEALING WITH WC SETTING
13553: *
13554: {CGV35{EXI{{{{RETURN TO CDGVL CALLER
13555: *
13556: * EXIT HERE TO GENERATE WORD AND TEST FOR CONSTANT
13557: *
13558: {CGV36{JSR{CDWRD{{{GENERATE WORD
13559: {{BNZ{R8{CGV34{{JUMP TO EXIT IF NOT CONSTANT
13560: {{EJC{{{{
13561: *
13562: * CDGVL (CONTINUED)
13563: *
13564: * HERE TO PREEVALUATE CONSTANT SUB-EXPRESSION
13565: *
13566: {{MOV{#ORVL${R6{{LOAD CALL TO RETURN VALUE
13567: {{JSR{CDWRD{{{GENERATE IT
13568: {{MOV{(SP){R10{{LOAD INITIAL CODE OFFSET
13569: {{JSR{EXBLD{{{BUILD EXBLK FOR EXPRESSION
13570: {{ZER{R7{{{SET TO EVALUATE BY VALUE
13571: {{JSR{EVALX{{{EVALUATE EXPRESSION
13572: {{PPM{{{{SHOULD NOT FAIL
13573: {{MOV{(R9){R6{{LOAD TYPE WORD OF RESULT
13574: {{BLO{R6{#P$AAA{CGV37{JUMP IF NOT PATTERN
13575: {{MOV{#OLPT${R6{{ELSE LOAD SPECIAL PATTERN LOAD CALL
13576: {{JSR{CDWRD{{{GENERATE IT
13577: *
13578: * MERGE HERE TO GENERATE POINTER TO RESULTING CONSTANT
13579: *
13580: {CGV37{MOV{R9{R6{{COPY CONSTANT POINTER
13581: {{JSR{CDWRD{{{GENERATE PTR
13582: {{ZER{R8{{{SET RESULT CONSTANT
13583: {{BRN{CGV34{{{JUMP BACK TO EXIT
13584: {{ENP{{{{END PROCEDURE CDGVL
13585: {{EJC{{{{
13586: *
13587: * CDWRD -- GENERATE ONE WORD OF CODE
13588: *
13589: * CDWRD WRITES ONE WORD INTO THE CURRENT CODE BLOCK UNDER
13590: * CONSTRUCTION. A NEW, LARGER, BLOCK IS ALLOCATED IF THERE
13591: * IS INSUFFICIENT ROOM IN THE CURRENT BLOCK. CDWRD ENSURES
13592: * THAT THERE ARE AT LEAST THREE WORDS LEFT IN THE BLOCK
13593: * AFTER ENTERING THE NEW WORD. THIS GUARANTEES THAT ANY
13594: * EXTRA SPACE AT THE END CAN BE SPLIT OFF AS A CCBLK.
13595: *
13596: * (WA) WORD TO BE GENERATED
13597: * JSR CDWRD CALL TO GENERATE WORD
13598: *
13599: {CDWRD{PRC{E{0{{ENTRY POINT
13600: {{MOV{R9{-(SP){{SAVE ENTRY XR
13601: {{MOV{R6{-(SP){{SAVE CODE WORD TO BE GENERATED
13602: *
13603: * MERGE BACK HERE AFTER ALLOCATING LARGER BLOCK
13604: *
13605: {CDWD1{MOV{R$CCB{R9{{LOAD PTR TO CCBLK BEING BUILT
13606: {{BNZ{R9{CDWD2{{JUMP IF BLOCK ALLOCATED
13607: *
13608: * HERE WE ALLOCATE AN ENTIRELY FRESH BLOCK
13609: *
13610: {{MOV{#4*E$CBS{R6{{LOAD INITIAL LENGTH
13611: {{JSR{ALLOC{{{ALLOCATE CCBLK
13612: {{MOV{#B$CCT{(R9){{STORE TYPE WORD
13613: {{MOV{#4*CCCOD{CWCOF{{SET INITIAL OFFSET
13614: {{MOV{R6{4*CCLEN(R9){{STORE BLOCK LENGTH
13615: {{MOV{R9{R$CCB{{STORE PTR TO NEW BLOCK
13616: *
13617: * HERE WE HAVE A BLOCK WE CAN USE
13618: *
13619: {CDWD2{MOV{CWCOF{R6{{LOAD CURRENT OFFSET
13620: {{ADD{#4*NUM04{R6{{ADJUST FOR TEST (FOUR WORDS)
13621: {{BLO{R6{4*CCLEN(R9){CDWD4{JUMP IF ROOM IN THIS BLOCK
13622: *
13623: * HERE IF NO ROOM IN CURRENT BLOCK
13624: *
13625: {{BGE{R6{MXLEN{CDWD5{JUMP IF ALREADY AT MAX SIZE
13626: {{ADD{#4*E$CBS{R6{{ELSE GET NEW SIZE
13627: {{MOV{R10{-(SP){{SAVE ENTRY XL
13628: {{MOV{R9{R10{{COPY POINTER
13629: {{BLT{R6{MXLEN{CDWD3{JUMP IF NOT TOO LARGE
13630: {{MOV{MXLEN{R6{{ELSE RESET TO MAX ALLOWED SIZE
13631: {{EJC{{{{
13632: *
13633: * CDWRD (CONTINUED)
13634: *
13635: * HERE WITH NEW BLOCK SIZE IN WA
13636: *
13637: {CDWD3{JSR{ALLOC{{{ALLOCATE NEW BLOCK
13638: {{MOV{R9{R$CCB{{STORE POINTER TO NEW BLOCK
13639: {{MOV{#B$CCT{(R9)+{{STORE TYPE WORD IN NEW BLOCK
13640: {{MOV{R6{(R9)+{{STORE BLOCK LENGTH
13641: {{ADD{#4*CCUSE{R10{{POINT TO CCUSE,CCCOD FIELDS IN OLD
13642: {{MOV{(R10){R6{{LOAD CCUSE VALUE
13643: {{MVW{{{{COPY USEFUL WORDS FROM OLD BLOCK
13644: {{MOV{(SP)+{R10{{RESTORE XL
13645: {{BRN{CDWD1{{{MERGE BACK TO TRY AGAIN
13646: *
13647: * HERE WITH ROOM IN CURRENT BLOCK
13648: *
13649: {CDWD4{MOV{CWCOF{R6{{LOAD CURRENT OFFSET
13650: {{ICA{R6{{{GET NEW OFFSET
13651: {{MOV{R6{CWCOF{{STORE NEW OFFSET
13652: {{MOV{R6{4*CCUSE(R9){{STORE IN CCBLK FOR GBCOL
13653: {{DCA{R6{{{RESTORE PTR TO THIS WORD
13654: {{ADD{R6{R9{{POINT TO CURRENT ENTRY
13655: {{MOV{(SP)+{R6{{RELOAD WORD TO GENERATE
13656: {{MOV{R6{(R9){{STORE WORD IN BLOCK
13657: {{MOV{(SP)+{R9{{RESTORE ENTRY XR
13658: {{EXI{{{{RETURN TO CALLER
13659: *
13660: * HERE IF COMPILED CODE IS TOO LONG FOR CDBLK
13661: *
13662: {CDWD5{ERB{213{SYNTAX{{ERROR. STATEMENT IS TOO COMPLICATED.
13663: {{ENP{{{{END PROCEDURE CDWRD
13664: {{EJC{{{{
13665: *
13666: * CMGEN -- GENERATE CODE FOR CMBLK PTR
13667: *
13668: * CMGEN IS A SUBSIDIARY PROCEDURE USED TO GENERATE VALUE
13669: * CODE FOR A CMBLK PTR FROM THE MAIN CODE GENERATORS.
13670: *
13671: * (XL) CMBLK POINTER
13672: * (WB) OFFSET TO POINTER IN CMBLK
13673: * JSR CMGEN CALL TO GENERATE CODE
13674: * (XR,WA) DESTROYED
13675: * (WB) BUMPED BY ONE WORD
13676: *
13677: {CMGEN{PRC{R{0{{ENTRY POINT, RECURSIVE
13678: {{MOV{R10{R9{{COPY CMBLK POINTER
13679: {{ADD{R7{R9{{POINT TO CMBLK POINTER
13680: {{MOV{(R9){R9{{LOAD CMBLK POINTER
13681: {{JSR{CDGVL{{{GENERATE CODE BY VALUE
13682: {{ICA{R7{{{BUMP OFFSET
13683: {{EXI{{{{RETURN TO CALLER
13684: {{ENP{{{{END PROCEDURE CMGEN
13685: {{EJC{{{{
13686: *
13687: * CMPIL (COMPILE SOURCE CODE)
13688: *
13689: * CMPIL IS USED TO CONVERT SNOBOL4 SOURCE CODE TO INTERNAL
13690: * FORM (SEE CDBLK FORMAT). IT IS USED BOTH FOR THE INITIAL
13691: * COMPILE AND AT RUN TIME BY THE CODE AND CONVERT FUNCTIONS
13692: * THIS PROCEDURE HAS CONTROL FOR THE ENTIRE DURATION OF
13693: * INITIAL COMPILATION. AN ERROR IN ANY PROCEDURE CALLED
13694: * DURING COMPILATION WILL LEAD FIRST TO THE ERROR SECTION
13695: * AND ULTIMATELY BACK HERE FOR RESUMED COMPILATION. THE
13696: * RE-ENTRY POINTS AFTER AN ERROR ARE SPECIALLY LABELLED -
13697: *
13698: * CMPCE RESUME AFTER CONTROL CARD ERROR
13699: * CMPLE RESUME AFTER LABEL ERROR
13700: * CMPSE RESUME AFTER STATEMENT ERROR
13701: *
13702: * JSR CMPIL CALL TO COMPILE CODE
13703: * (XR) PTR TO CDBLK FOR ENTRY STATEMENT
13704: * (XL,WA,WB,WC,RA) DESTROYED
13705: *
13706: * THE FOLLOWING GLOBAL VARIABLES ARE REFERENCED
13707: *
13708: * CMPSN NUMBER OF NEXT STATEMENT
13709: * TO BE COMPILED.
13710: *
13711: * CSWXX CONTROL CARD SWITCH VALUES ARE
13712: * CHANGED WHEN RELEVANT CONTROL
13713: * CARDS ARE MET.
13714: *
13715: * CWCOF OFFSET TO NEXT WORD IN CODE BLOCK
13716: * BEING BUILT (SEE CDWRD).
13717: *
13718: * LSTSN NUMBER OF STATEMENT MOST RECENTLY
13719: * COMPILED (INITIALLY SET TO ZERO).
13720: *
13721: * R$CIM CURRENT (INITIAL) COMPILER IMAGE
13722: * (ZERO FOR INITIAL COMPILE CALL)
13723: *
13724: * R$CNI USED TO POINT TO FOLLOWING IMAGE.
13725: * (SEE READR PROCEDURE).
13726: *
13727: * SCNGO GOTO SWITCH FOR SCANE PROCEDURE
13728: *
13729: * SCNIL LENGTH OF CURRENT IMAGE EXCLUDING
13730: * CHARACTERS REMOVED BY -INPUT.
13731: *
13732: * SCNPT CURRENT SCAN OFFSET, SEE SCANE.
13733: *
13734: * SCNRS RESCAN SWITCH FOR SCANE PROCEDURE.
13735: *
13736: * SCNSE OFFSET (IN R$CIM) OF MOST RECENTLY
13737: * SCANNED ELEMENT. SET ZERO IF NOT
13738: * CURRENTLY SCANNING ITEMS
13739: {{EJC{{{{
13740: *
13741: * CMPIL (CONTINUED)
13742: *
13743: * STAGE STGIC INITIAL COMPILE IN PROGRESS
13744: * STGXC CODE/CONVERT COMPILE
13745: * STGEV BUILDING EXBLK FOR EVAL
13746: * STGXT EXECUTE TIME (OUTSIDE COMPILE)
13747: * STGCE INITIAL COMPILE AFTER END LINE
13748: * STGXE EXECUTE COMPILE AFTER END LINE
13749: *
13750: * CMPIL ALSO USES A FIXED NUMBER OF LOCATIONS ON THE
13751: * MAIN STACK AS FOLLOWS. (THE DEFINITIONS OF THE ACTUAL
13752: * OFFSETS ARE IN THE DEFINITIONS SECTION).
13753: *
13754: * CMSTM(XS) POINTER TO EXPAN TREE FOR BODY OF
13755: * STATEMENT (SEE EXPAN PROCEDURE).
13756: *
13757: * CMSGO(XS) POINTER TO TREE REPRESENTATION OF
13758: * SUCCESS GOTO (SEE PROCEDURE SCNGO)9
13759: * ZERO IF NO SUCCESS GOTO IS GIVEN
13760: *
13761: * CMFGO(XS) LIKE CMSGO FOR FAILURE GOTO.
13762: *
13763: * CMCGO(XS) SET NON-ZERO ONLY IF THERE IS A
13764: * CONDITIONAL GOTO. USED FOR -FAIL,
13765: * -NOFAIL CODE GENERATION.
13766: *
13767: * CMPCD(XS) POINTER TO CDBLK FOR PREVIOUS
13768: * STATEMENT. ZERO FOR 1ST STATEMENT.
13769: *
13770: * CMFFP(XS) SET NON-ZERO IF CDFAL IN PREVIOUS
13771: * CDBLK NEEDS FILLING WITH FORWARD
13772: * POINTER, ELSE SET TO ZERO.
13773: *
13774: * CMFFC(XS) SAME AS CMFFP FOR CURRENT CDBLK
13775: *
13776: * CMSOP(XS) OFFSET TO WORD IN PREVIOUS CDBLK
13777: * TO BE FILLED IN WITH FORWARD PTR
13778: * TO NEXT CDBLK FOR SUCCESS GOTO.
13779: * ZERO IF NO FILL IN IS REQUIRED.
13780: *
13781: * CMSOC(XS) SAME AS CMSOP FOR CURRENT CDBLK.
13782: *
13783: * CMLBL(XS) POINTER TO VRBLK FOR LABEL OF
13784: * CURRENT STATEMENT. ZERO IF NO LABEL
13785: *
13786: * CMTRA(XS) POINTER TO CDBLK FOR ENTRY STMNT.
13787: {{EJC{{{{
13788: *
13789: * CMPIL (CONTINUED)
13790: *
13791: * ENTRY POINT
13792: *
13793: {CMPIL{PRC{E{0{{ENTRY POINT
13794: {{LCT{R7{#CMNEN{{SET NUMBER OF STACK WORK LOCATIONS
13795: *
13796: * LOOP TO INITIALIZE STACK WORKING LOCATIONS
13797: *
13798: {CMP00{ZER{-(SP){{{STORE A ZERO, MAKE ONE ENTRY
13799: {{BCT{R7{CMP00{{LOOP BACK UNTIL ALL SET
13800: {{MOV{SP{CMPXS{{SAVE STACK POINTER FOR ERROR SEC
13801: {{SSS{CMPSS{{{SAVE S-R STACK POINTER IF ANY
13802: *
13803: * LOOP THROUGH STATEMENTS
13804: *
13805: {CMP01{MOV{SCNPT{R7{{SET SCAN POINTER OFFSET
13806: {{MOV{R7{SCNSE{{SET START OF ELEMENT LOCATION
13807: {{MOV{#OCER${R6{{POINT TO COMPILE ERROR CALL
13808: {{JSR{CDWRD{{{GENERATE AS TEMPORARY CDFAL
13809: {{BLT{R7{SCNIL{CMP04{JUMP IF CHARS LEFT ON THIS IMAGE
13810: *
13811: * LOOP HERE AFTER COMMENT OR CONTROL CARD
13812: * ALSO SPECIAL ENTRY AFTER CONTROL CARD ERROR
13813: *
13814: {CMPCE{ZER{R9{{{CLEAR POSSIBLE GARBAGE XR VALUE
13815: {{BNE{STAGE{#STGIC{CMP02{SKIP UNLESS INITIAL COMPILE
13816: {{JSR{READR{{{READ NEXT INPUT IMAGE
13817: {{BZE{R9{CMP09{{JUMP IF NO INPUT AVAILABLE
13818: {{JSR{NEXTS{{{ACQUIRE NEXT SOURCE IMAGE
13819: {{MOV{CMPSN{LSTSN{{STORE STMT NO FOR USE BY LISTR
13820: {{ZER{SCNPT{{{RESET SCAN POINTER
13821: {{BRN{CMP04{{{GO PROCESS IMAGE
13822: *
13823: * FOR EXECUTE TIME COMPILE, PERMIT EMBEDDED CONTROL CARDS
13824: * AND COMMENTS (BY SKIPPING TO NEXT SEMI-COLON)
13825: *
13826: {CMP02{MOV{R$CIM{R9{{GET CURRENT IMAGE
13827: {{MOV{SCNPT{R7{{GET CURRENT OFFSET
13828: {{PLC{R9{R7{{PREPARE TO GET CHARS
13829: *
13830: * SKIP TO SEMI-COLON
13831: *
13832: {CMP03{LCH{R8{(R9)+{{GET CHAR
13833: {{ICV{SCNPT{{{ADVANCE OFFSET
13834: {{BEQ{R8{#CH$SM{CMP04{SKIP IF SEMI-COLON FOUND
13835: {{BLT{SCNPT{SCNIL{CMP03{LOOP IF MORE CHARS
13836: {{ZER{R9{{{CLEAR GARBAGE XR VALUE
13837: {{BRN{CMP09{{{END OF IMAGE
13838: {{EJC{{{{
13839: *
13840: * CMPIL (CONTINUED)
13841: *
13842: * HERE WITH IMAGE AVAILABLE TO SCAN. NOTE THAT IF THE INPUT
13843: * STRING IS NULL, THEN EVERYTHING IS OK SINCE NULL IS
13844: * ACTUALLY ASSEMBLED AS A WORD OF BLANKS.
13845: *
13846: {CMP04{MOV{R$CIM{R9{{POINT TO CURRENT IMAGE
13847: {{MOV{SCNPT{R7{{LOAD CURRENT OFFSET
13848: {{MOV{R7{R6{{COPY FOR LABEL SCAN
13849: {{PLC{R9{R7{{POINT TO FIRST CHARACTER
13850: {{LCH{R8{(R9)+{{LOAD FIRST CHARACTER
13851: {{BEQ{R8{#CH$SM{CMP12{NO LABEL IF SEMICOLON
13852: {{BEQ{R8{#CH$AS{CMPCE{LOOP BACK IF COMMENT CARD
13853: {{BEQ{R8{#CH$MN{CMP32{JUMP IF CONTROL CARD
13854: {{MOV{R$CIM{R$CMP{{ABOUT TO DESTROY R$CIM
13855: {{MOV{#CMLAB{R10{{POINT TO LABEL WORK STRING
13856: {{MOV{R10{R$CIM{{SCANE IS TO SCAN WORK STRING
13857: {{PSC{R10{{{POINT TO FIRST CHARACTER POSITION
13858: {{SCH{R8{(R10)+{{STORE CHAR JUST LOADED
13859: {{MOV{#CH$SM{R8{{GET A SEMICOLON
13860: {{SCH{R8{(R10){{STORE AFTER FIRST CHAR
13861: {{CSC{R10{{{FINISHED CHARACTER STORING
13862: {{ZER{R10{{{CLEAR POINTER
13863: {{ZER{SCNPT{{{START AT FIRST CHARACTER
13864: {{MOV{SCNIL{-(SP){{PRESERVE IMAGE LENGTH
13865: {{MOV{#NUM02{SCNIL{{READ 2 CHARS AT MOST
13866: {{JSR{SCANE{{{SCAN FIRST CHAR FOR TYPE
13867: {{MOV{(SP)+{SCNIL{{RESTORE IMAGE LENGTH
13868: {{MOV{R10{R8{{NOTE RETURN CODE
13869: {{MOV{R$CMP{R10{{GET OLD R$CIM
13870: {{MOV{R10{R$CIM{{PUT IT BACK
13871: {{MOV{R7{SCNPT{{REINSTATE OFFSET
13872: {{BNZ{SCNBL{CMP12{{BLANK SEEN - CANT BE LABEL
13873: {{MOV{R10{R9{{POINT TO CURRENT IMAGE
13874: {{PLC{R9{R7{{POINT TO FIRST CHAR AGAIN
13875: {{BEQ{R8{#T$VAR{CMP06{OK IF LETTER
13876: {{BEQ{R8{#T$CON{CMP06{OK IF DIGIT
13877: *
13878: * DROP IN OR JUMP FROM ERROR SECTION IF SCANE FAILED
13879: *
13880: {CMPLE{MOV{R$CMP{R$CIM{{POINT TO BAD LINE
13881: {{ERB{214{BAD{{LABEL OR MISPLACED CONTINUATION LINE
13882: *
13883: * LOOP TO SCAN LABEL
13884: *
13885: {CMP05{BEQ{R8{#CH$SM{CMP07{SKIP IF SEMICOLON
13886: {{ICV{R6{{{BUMP OFFSET
13887: {{BEQ{R6{SCNIL{CMP07{JUMP IF END OF IMAGE (LABEL END)
13888: {{EJC{{{{
13889: *
13890: * CMPIL (CONTINUED)
13891: *
13892: * ENTER LOOP AT THIS POINT
13893: *
13894: {CMP06{LCH{R8{(R9)+{{ELSE LOAD NEXT CHARACTER
13895: {{BEQ{R8{#CH$HT{CMP07{JUMP IF HORIZONTAL TAB
13896: {{BNE{R8{#CH$BL{CMP05{LOOP BACK IF NON-BLANK
13897: *
13898: * HERE AFTER SCANNING OUT LABEL
13899: *
13900: {CMP07{MOV{R6{SCNPT{{SAVE UPDATED SCAN OFFSET
13901: {{SUB{R7{R6{{GET LENGTH OF LABEL
13902: {{BZE{R6{CMP12{{SKIP IF LABEL LENGTH ZERO
13903: {{ZER{R9{{{CLEAR GARBAGE XR VALUE
13904: {{JSR{SBSTR{{{BUILD SCBLK FOR LABEL NAME
13905: {{JSR{GTNVR{{{LOCATE/CONTRUCT VRBLK
13906: {{PPM{{{{DUMMY (IMPOSSIBLE) ERROR RETURN
13907: {{MOV{R9{4*CMLBL(SP){{STORE LABEL POINTER
13908: {{BNZ{4*VRLEN(R9){CMP11{{JUMP IF NOT SYSTEM LABEL
13909: {{BNE{4*VRSVP(R9){#V$END{CMP11{JUMP IF NOT END LABEL
13910: *
13911: * HERE FOR END LABEL SCANNED OUT
13912: *
13913: {{ADD{#STGND{STAGE{{ADJUST STAGE APPROPRIATELY
13914: {{JSR{SCANE{{{SCAN OUT NEXT ELEMENT
13915: {{BEQ{R10{#T$SMC{CMP10{JUMP IF END OF IMAGE
13916: {{BNE{R10{#T$VAR{CMP08{ELSE ERROR IF NOT VARIABLE
13917: *
13918: * HERE CHECK FOR VALID INITIAL TRANSFER
13919: *
13920: {{BEQ{4*VRLBL(R9){#STNDL{CMP08{JUMP IF NOT DEFINED (ERROR)
13921: {{MOV{4*VRLBL(R9){4*CMTRA(SP){{ELSE SET INITIAL ENTRY POINTER
13922: {{JSR{SCANE{{{SCAN NEXT ELEMENT
13923: {{BEQ{R10{#T$SMC{CMP10{JUMP IF OK (END OF IMAGE)
13924: *
13925: * HERE FOR BAD TRANSFER LABEL
13926: *
13927: {CMP08{ERB{215{SYNTAX{{ERROR. UNDEFINED OR ERRONEOUS ENTRY LABEL
13928: *
13929: * HERE FOR END OF INPUT (NO END LABEL DETECTED)
13930: *
13931: {CMP09{ADD{#STGND{STAGE{{ADJUST STAGE APPROPRIATELY
13932: {{BEQ{STAGE{#STGXE{CMP10{JUMP IF CODE CALL (OK)
13933: {{ERB{216{SYNTAX{{ERROR. MISSING END LINE
13934: *
13935: * HERE AFTER PROCESSING END LINE (MERGE HERE ON END ERROR)
13936: *
13937: {CMP10{MOV{#OSTP${R6{{SET STOP CALL POINTER
13938: {{JSR{CDWRD{{{GENERATE AS STATEMENT CALL
13939: {{BRN{CMPSE{{{JUMP TO GENERATE AS FAILURE
13940: {{EJC{{{{
13941: *
13942: * CMPIL (CONTINUED)
13943: *
13944: * HERE AFTER PROCESSING LABEL OTHER THAN END
13945: *
13946: {CMP11{BNE{STAGE{#STGIC{CMP12{JUMP IF CODE CALL - REDEF. OK
13947: {{BEQ{4*VRLBL(R9){#STNDL{CMP12{ELSE CHECK FOR REDEFINITION
13948: {{ZER{4*CMLBL(SP){{{LEAVE FIRST LABEL DECLN UNDISTURBED
13949: {{ERB{217{SYNTAX{{ERROR. DUPLICATE LABEL
13950: *
13951: * HERE AFTER DEALING WITH LABEL
13952: *
13953: {CMP12{ZER{R7{{{SET FLAG FOR STATEMENT BODY
13954: {{JSR{EXPAN{{{GET TREE FOR STATEMENT BODY
13955: {{MOV{R9{4*CMSTM(SP){{STORE FOR LATER USE
13956: {{ZER{4*CMSGO(SP){{{CLEAR SUCCESS GOTO POINTER
13957: {{ZER{4*CMFGO(SP){{{CLEAR FAILURE GOTO POINTER
13958: {{ZER{4*CMCGO(SP){{{CLEAR CONDITIONAL GOTO FLAG
13959: {{JSR{SCANE{{{SCAN NEXT ELEMENT
13960: {{BNE{R10{#T$COL{CMP18{JUMP IT NOT COLON (NO GOTO)
13961: *
13962: * LOOP TO PROCESS GOTO FIELDS
13963: *
13964: {CMP13{MNZ{SCNGO{{{SET GOTO FLAG
13965: {{JSR{SCANE{{{SCAN NEXT ELEMENT
13966: {{BEQ{R10{#T$SMC{CMP31{JUMP IF NO FIELDS LEFT
13967: {{BEQ{R10{#T$SGO{CMP14{JUMP IF S FOR SUCCESS GOTO
13968: {{BEQ{R10{#T$FGO{CMP16{JUMP IF F FOR FAILURE GOTO
13969: *
13970: * HERE FOR UNCONDITIONAL GOTO (I.E. NOT F OR S)
13971: *
13972: {{MNZ{SCNRS{{{SET TO RESCAN ELEMENT NOT F,S
13973: {{JSR{SCNGF{{{SCAN OUT GOTO FIELD
13974: {{BNZ{4*CMFGO(SP){CMP17{{ERROR IF FGOTO ALREADY
13975: {{MOV{R9{4*CMFGO(SP){{ELSE SET AS FGOTO
13976: {{BRN{CMP15{{{MERGE WITH SGOTO CIRCUIT
13977: *
13978: * HERE FOR SUCCESS GOTO
13979: *
13980: {CMP14{JSR{SCNGF{{{SCAN SUCCESS GOTO FIELD
13981: {{MOV{#NUM01{4*CMCGO(SP){{SET CONDITIONAL GOTO FLAG
13982: *
13983: * UNCONTIONAL GOTO MERGES HERE
13984: *
13985: {CMP15{BNZ{4*CMSGO(SP){CMP17{{ERROR IF SGOTO ALREADY GIVEN
13986: {{MOV{R9{4*CMSGO(SP){{ELSE SET SGOTO
13987: {{BRN{CMP13{{{LOOP BACK FOR NEXT GOTO FIELD
13988: *
13989: * HERE FOR FAILURE GOTO
13990: *
13991: {CMP16{JSR{SCNGF{{{SCAN GOTO FIELD
13992: {{MOV{#NUM01{4*CMCGO(SP){{SET CONDITONAL GOTO FLAG
13993: {{BNZ{4*CMFGO(SP){CMP17{{ERROR IF FGOTO ALREADY GIVEN
13994: {{MOV{R9{4*CMFGO(SP){{ELSE STORE FGOTO POINTER
13995: {{BRN{CMP13{{{LOOP BACK FOR NEXT FIELD
13996: {{EJC{{{{
13997: *
13998: * CMPIL (CONTINUED)
13999: *
14000: * HERE FOR DUPLICATED GOTO FIELD
14001: *
14002: {CMP17{ERB{218{SYNTAX{{ERROR. DUPLICATED GOTO FIELD
14003: *
14004: * HERE TO GENERATE CODE
14005: *
14006: {CMP18{ZER{SCNSE{{{STOP POSITIONAL ERROR FLAGS
14007: {{MOV{4*CMSTM(SP){R9{{LOAD TREE PTR FOR STATEMENT BODY
14008: {{ZER{R7{{{COLLECTABLE VALUE FOR WB FOR CDGVL
14009: {{ZER{R8{{{RESET CONSTANT FLAG FOR CDGVL
14010: {{JSR{EXPAP{{{TEST FOR PATTERN MATCH
14011: {{PPM{CMP19{{{JUMP IF NOT PATTERN MATCH
14012: {{MOV{#OPMS${4*CMOPN(R9){{ELSE SET PATTERN MATCH POINTER
14013: {{MOV{#C$PMT{4*CMTYP(R9){{
14014: *
14015: * HERE AFTER DEALING WITH SPECIAL PATTERN MATCH CASE
14016: *
14017: {CMP19{JSR{CDGVL{{{GENERATE CODE FOR BODY OF STATEMENT
14018: {{MOV{4*CMSGO(SP){R9{{LOAD SGOTO POINTER
14019: {{MOV{R9{R6{{COPY IT
14020: {{BZE{R9{CMP21{{JUMP IF NO SUCCESS GOTO
14021: {{ZER{4*CMSOC(SP){{{CLEAR SUCCESS OFFSET FILLIN PTR
14022: {{BHI{R9{STATE{CMP20{JUMP IF COMPLEX GOTO
14023: *
14024: * HERE FOR SIMPLE SUCCESS GOTO (LABEL)
14025: *
14026: {{ADD{#4*VRTRA{R6{{POINT TO VRTRA FIELD AS REQUIRED
14027: {{JSR{CDWRD{{{GENERATE SUCCESS GOTO
14028: {{BRN{CMP22{{{JUMP TO DEAL WITH FGOTO
14029: *
14030: * HERE FOR COMPLEX SUCCESS GOTO
14031: *
14032: {CMP20{BEQ{R9{4*CMFGO(SP){CMP22{NO CODE IF SAME AS FGOTO
14033: {{ZER{R7{{{ELSE SET OK VALUE FOR CDGVL IN WB
14034: {{JSR{CDGCG{{{GENERATE CODE FOR SUCCESS GOTO
14035: {{BRN{CMP22{{{JUMP TO DEAL WITH FGOTO
14036: *
14037: * HERE FOR NO SUCCESS GOTO
14038: *
14039: {CMP21{MOV{CWCOF{4*CMSOC(SP){{SET SUCCESS FILL IN OFFSET
14040: {{MOV{#OCER${R6{{POINT TO COMPILE ERROR CALL
14041: {{JSR{CDWRD{{{GENERATE AS TEMPORARY VALUE
14042: {{EJC{{{{
14043: *
14044: * CMPIL (CONTINUED)
14045: *
14046: * HERE TO DEAL WITH FAILURE GOTO
14047: *
14048: {CMP22{MOV{4*CMFGO(SP){R9{{LOAD FAILURE GOTO POINTER
14049: {{MOV{R9{R6{{COPY IT
14050: {{ZER{4*CMFFC(SP){{{SET NO FILL IN REQUIRED YET
14051: {{BZE{R9{CMP23{{JUMP IF NO FAILURE GOTO GIVEN
14052: {{ADD{#4*VRTRA{R6{{POINT TO VRTRA FIELD IN CASE
14053: {{BLO{R9{STATE{CMPSE{JUMP TO GEN IF SIMPLE FGOTO
14054: *
14055: * HERE FOR COMPLEX FAILURE GOTO
14056: *
14057: {{MOV{CWCOF{R7{{SAVE OFFSET TO O$GOF CALL
14058: {{MOV{#OGOF${R6{{POINT TO FAILURE GOTO CALL
14059: {{JSR{CDWRD{{{GENERATE
14060: {{MOV{#OFIF${R6{{POINT TO FAIL IN FAIL WORD
14061: {{JSR{CDWRD{{{GENERATE
14062: {{JSR{CDGCG{{{GENERATE CODE FOR FAILURE GOTO
14063: {{MOV{R7{R6{{COPY OFFSET TO O$GOF FOR CDFAL
14064: {{MOV{#B$CDC{R7{{SET COMPLEX CASE CDTYP
14065: {{BRN{CMP25{{{JUMP TO BUILD CDBLK
14066: *
14067: * HERE IF NO FAILURE GOTO GIVEN
14068: *
14069: {CMP23{MOV{#OUNF${R6{{LOAD UNEXPECTED FAILURE CALL IN CAS
14070: {{MOV{CSWFL{R8{{GET -NOFAIL FLAG
14071: {{ORB{4*CMCGO(SP){R8{{CHECK IF CONDITIONAL GOTO
14072: {{ZRB{R8{CMPSE{{JUMP IF -NOFAIL AND NO COND. GOTO
14073: {{MNZ{4*CMFFC(SP){{{ELSE SET FILL IN FLAG
14074: {{MOV{#OCER${R6{{AND SET COMPILE ERROR FOR TEMPORARY
14075: *
14076: * MERGE HERE WITH CDFAL VALUE IN WA, SIMPLE CDBLK
14077: * ALSO SPECIAL ENTRY AFTER STATEMENT ERROR
14078: *
14079: {CMPSE{MOV{#B$CDS{R7{{SET CDTYP FOR SIMPLE CASE
14080: {{EJC{{{{
14081: *
14082: * CMPIL (CONTINUED)
14083: *
14084: * MERGE HERE TO BUILD CDBLK
14085: *
14086: * (WA) CDFAL VALUE TO BE GENERATED
14087: * (WB) CDTYP VALUE TO BE GENERATED
14088: *
14089: * AT THIS STAGE, WE CHOP OFF AN APPROPRIATE CHUNK OF THE
14090: * CURRENT CCBLK AND CONVERT IT INTO A CDBLK. THE REMAINDER
14091: * OF THE CCBLK IS REFORMATTED TO BE THE NEW CCBLK.
14092: *
14093: {CMP25{MOV{R$CCB{R9{{POINT TO CCBLK
14094: {{MOV{4*CMLBL(SP){R10{{GET POSSIBLE LABEL POINTER
14095: {{BZE{R10{CMP26{{SKIP IF NO LABEL
14096: {{ZER{4*CMLBL(SP){{{CLEAR FLAG FOR NEXT STATEMENT
14097: {{MOV{R9{4*VRLBL(R10){{PUT CDBLK PTR IN VRBLK LABEL FIELD
14098: *
14099: * MERGE AFTER DOING LABEL
14100: *
14101: {CMP26{MOV{R7{(R9){{SET TYPE WORD FOR NEW CDBLK
14102: {{MOV{R6{4*CDFAL(R9){{SET FAILURE WORD
14103: {{MOV{R9{R10{{COPY POINTER TO CCBLK
14104: {{MOV{4*CCUSE(R9){R7{{LOAD LENGTH GEN (= NEW CDLEN)
14105: {{MOV{4*CCLEN(R9){R8{{LOAD TOTAL CCBLK LENGTH
14106: {{ADD{R7{R10{{POINT PAST CDBLK
14107: {{SUB{R7{R8{{GET LENGTH LEFT FOR CHOP OFF
14108: {{MOV{#B$CCT{(R10){{SET TYPE CODE FOR NEW CCBLK AT END
14109: {{MOV{#4*CCCOD{4*CCUSE(R10){{SET INITIAL CODE OFFSET
14110: {{MOV{#4*CCCOD{CWCOF{{REINITIALISE CWCOF
14111: {{MOV{R8{4*CCLEN(R10){{SET NEW LENGTH
14112: {{MOV{R10{R$CCB{{SET NEW CCBLK POINTER
14113: {{MOV{CMPSN{4*CDSTM(R9){{SET STATEMENT NUMBER
14114: {{ICV{CMPSN{{{BUMP STATEMENT NUMBER
14115: *
14116: * SET POINTERS IN PREVIOUS CODE BLOCK AS REQUIRED
14117: *
14118: {{MOV{4*CMPCD(SP){R10{{LOAD PTR TO PREVIOUS CDBLK
14119: {{BZE{4*CMFFP(SP){CMP27{{JUMP IF NO FAILURE FILL IN REQUIRED
14120: {{MOV{R9{4*CDFAL(R10){{ELSE SET FAILURE PTR IN PREVIOUS
14121: *
14122: * HERE TO DEAL WITH SUCCESS FORWARD POINTER
14123: *
14124: {CMP27{MOV{4*CMSOP(SP){R6{{LOAD SUCCESS OFFSET
14125: {{BZE{R6{CMP28{{JUMP IF NO FILL IN REQUIRED
14126: {{ADD{R6{R10{{ELSE POINT TO FILL IN LOCATION
14127: {{MOV{R9{(R10){{STORE FORWARD POINTER
14128: {{ZER{R10{{{CLEAR GARBAGE XL VALUE
14129: {{EJC{{{{
14130: *
14131: * CMPIL (CONTINUED)
14132: *
14133: * NOW SET FILL IN POINTERS FOR THIS STATEMENT
14134: *
14135: {CMP28{MOV{4*CMFFC(SP){4*CMFFP(SP){{COPY FAILURE FILL IN FLAG
14136: {{MOV{4*CMSOC(SP){4*CMSOP(SP){{COPY SUCCESS FILL IN OFFSET
14137: {{MOV{R9{4*CMPCD(SP){{SAVE PTR TO THIS CDBLK
14138: {{BNZ{4*CMTRA(SP){CMP29{{JUMP IF INITIAL ENTRY ALREADY SET
14139: {{MOV{R9{4*CMTRA(SP){{ELSE SET PTR HERE AS DEFAULT
14140: *
14141: * HERE AFTER COMPILING ONE STATEMENT
14142: *
14143: {CMP29{BLT{STAGE{#STGCE{CMP01{JUMP IF NOT END LINE JUST DONE
14144: {{BZE{CSWLS{CMP30{{SKIP IF -NOLIST
14145: {{JSR{LISTR{{{LIST LAST LINE
14146: *
14147: * RETURN
14148: *
14149: {CMP30{MOV{4*CMTRA(SP){R9{{LOAD INITIAL ENTRY CDBLK POINTER
14150: {{ADD{#4*CMNEN{SP{{POP WORK LOCATIONS OFF STACK
14151: {{EXI{{{{AND RETURN TO CMPIL CALLER
14152: *
14153: * HERE AT END OF GOTO FIELD
14154: *
14155: {CMP31{MOV{4*CMFGO(SP){R7{{GET FAIL GOTO
14156: {{ORB{4*CMSGO(SP){R7{{OR IN SUCCESS GOTO
14157: {{BNZ{R7{CMP18{{OK IF NON-NULL FIELD
14158: {{ERB{219{SYNTAX{{ERROR. EMPTY GOTO FIELD
14159: *
14160: * CONTROL CARD FOUND
14161: *
14162: {CMP32{ICV{R7{{{POINT PAST CH$MN
14163: {{JSR{CNCRD{{{PROCESS CONTROL CARD
14164: {{ZER{SCNSE{{{CLEAR START OF ELEMENT LOC.
14165: {{BRN{CMPCE{{{LOOP FOR NEXT STATEMENT
14166: {{ENP{{{{END PROCEDURE CMPIL
14167: {{EJC{{{{
14168: *
14169: * CNCRD -- CONTROL CARD PROCESSOR
14170: *
14171: * CALLED TO DEAL WITH CONTROL CARDS
14172: *
14173: * R$CIM POINTS TO CURRENT IMAGE
14174: * (WB) OFFSET TO 1ST CHAR OF CONTROL CARD
14175: * JSR CNCRD CALL TO PROCESS CONTROL CARDS
14176: * (XL,XR,WA,WB,WC,IA) DESTROYED
14177: *
14178: {CNCRD{PRC{E{0{{ENTRY POINT
14179: {{MOV{R7{SCNPT{{OFFSET FOR CONTROL CARD SCAN
14180: {{MOV{#CCNOC{R6{{NUMBER OF CHARS FOR COMPARISON
14181: {{CTW{R6{0{{CONVERT TO WORD COUNT
14182: {{MOV{R6{CNSWC{{SAVE WORD COUNT
14183: *
14184: * LOOP HERE IF MORE THAN ONE CONTROL CARD
14185: *
14186: {CNC01{BGE{SCNPT{SCNIL{CNC09{RETURN IF END OF IMAGE
14187: {{MOV{R$CIM{R9{{POINT TO IMAGE
14188: {{PLC{R9{SCNPT{{CHAR PTR FOR FIRST CHAR
14189: {{LCH{R6{(R9)+{{GET FIRST CHAR
14190: {{FLC{R6{{{FOLD TO UPPER CASE
14191: {{BEQ{R6{#CH$LI{CNC07{SPECIAL CASE OF -INXXX
14192: {{MNZ{SCNCC{{{SET FLAG FOR SCANE
14193: {{JSR{SCANE{{{SCAN CARD NAME
14194: {{ZER{SCNCC{{{CLEAR SCANE FLAG
14195: {{BNZ{R10{CNC06{{FAIL UNLESS CONTROL CARD NAME
14196: {{MOV{#CCNOC{R6{{NO. OF CHARS TO BE COMPARED
14197: {{BLT{4*SCLEN(R9){R6{CNC06{FAIL IF TOO FEW CHARS
14198: {{MOV{R9{R10{{POINT TO CONTROL CARD NAME
14199: {{ZER{R7{{{ZERO OFFSET FOR SUBSTRING
14200: {{JSR{SBSTR{{{EXTRACT SUBSTRING FOR COMPARISON
14201: {{MOV{4*SCLEN(R9){R6{{RELOAD LENGTH
14202: {{JSR{FLSTG{{{FOLD TO UPPER CASE
14203: {{MOV{R9{CNSCC{{KEEP CONTROL CARD SUBSTRING PTR
14204: {{MOV{#CCNMS{R9{{POINT TO LIST OF STANDARD NAMES
14205: {{ZER{R7{{{INITIALISE NAME OFFSET
14206: {{LCT{R8{#CC$NC{{NUMBER OF STANDARD NAMES
14207: *
14208: * TRY TO MATCH NAME
14209: *
14210: {CNC02{MOV{CNSCC{R10{{POINT TO NAME
14211: {{LCT{R6{CNSWC{{COUNTER FOR INNER LOOP
14212: {{BRN{CNC04{{{JUMP INTO LOOP
14213: *
14214: * INNER LOOP TO MATCH CARD NAME CHARS
14215: *
14216: {CNC03{ICA{R9{{{BUMP STANDARD NAMES PTR
14217: {{ICA{R10{{{BUMP NAME POINTER
14218: *
14219: * HERE TO INITIATE THE LOOP
14220: *
14221: {CNC04{CNE{4*SCHAR(R10){(R9){CNC05{COMP. UP TO CFP$C CHARS AT ONCE
14222: {{BCT{R6{CNC03{{LOOP IF MORE WORDS TO COMPARE
14223: {{EJC{{{{
14224: *
14225: * CNCRD (CONTINUED)
14226: *
14227: * MATCHED - BRANCH ON CARD OFFSET
14228: *
14229: {{MOV{R7{R10{{GET NAME OFFSET
14230: {{BSW{R10{CC$NC{{SWITCH
14231: {{IFF{CC$CA{CNC37{{-CASE
14232: {{IFF{CC$DO{CNC10{{-DOUBLE
14233: {{IFF{CC$DU{CNC11{{-DUMP
14234: {{IFF{CC$EJ{CNC12{{-EJECT
14235: {{IFF{CC$ER{CNC13{{-ERRORS
14236: {{IFF{CC$EX{CNC14{{-EXECUTE
14237: {{IFF{CC$FA{CNC15{{-FAIL
14238: {{IFF{CC$LI{CNC16{{-LIST
14239: {{IFF{CC$NR{CNC17{{-NOERRORS
14240: {{IFF{CC$NX{CNC18{{-NOEXECUTE
14241: {{IFF{CC$NF{CNC19{{-NOFAIL
14242: {{IFF{CC$NL{CNC20{{-NOLIST
14243: {{IFF{CC$NO{CNC21{{-NOOPT
14244: {{IFF{CC$NP{CNC22{{-NOPRINT
14245: {{IFF{CC$OP{CNC24{{-OPTIMISE
14246: {{IFF{CC$PR{CNC25{{-PRINT
14247: {{IFF{CC$SI{CNC27{{-SINGLE
14248: {{IFF{CC$SP{CNC28{{-SPACE
14249: {{IFF{CC$ST{CNC31{{-STITLE
14250: {{IFF{CC$TI{CNC32{{-TITLE
14251: {{IFF{CC$TR{CNC36{{-TRACE
14252: {{ESW{{{{END SWITCH
14253: *
14254: * NOT MATCHED YET. ALIGN STD NAMES PTR AND TRY AGAIN
14255: *
14256: {CNC05{ICA{R9{{{BUMP STANDARD NAMES PTR
14257: {{BCT{R6{CNC05{{LOOP
14258: {{ICV{R7{{{BUMP NAMES OFFSET
14259: {{BCT{R8{CNC02{{CONTINUE IF MORE NAMES
14260: *
14261: * INVALID CONTROL CARD NAME
14262: *
14263: {CNC06{ERB{247{INVALID{{CONTROL CARD
14264: *
14265: * SPECIAL PROCESSING FOR -INXXX
14266: *
14267: {CNC07{LCH{R6{(R9){{GET NEXT CHAR
14268: {{FLC{R6{{{FOLD TO UPPER CASE
14269: {{BNE{R6{#CH$LN{CNC06{FAIL IF NOT LETTER N
14270: {{ADD{#NUM02{SCNPT{{BUMP OFFSET PAST -IN
14271: {{JSR{SCANE{{{SCAN INTEGER AFTER -IN
14272: {{MOV{R9{-(SP){{STACK SCANNED ITEM
14273: {{JSR{GTSMI{{{CHECK IF INTEGER
14274: {{PPM{CNC06{{{FAIL IF NOT INTEGER
14275: {{PPM{CNC06{{{FAIL IF NEGATIVE OR LARGE
14276: {{MOV{R9{CSWIN{{KEEP INTEGER
14277: {{EJC{{{{
14278: *
14279: * CNCRD (CONTINUED)
14280: *
14281: * CHECK FOR MORE CONTROL CARDS BEFORE RETURNING
14282: *
14283: {CNC08{MOV{SCNPT{R6{{PRESERVE IN CASE XEQ TIME COMPILE
14284: {{JSR{SCANE{{{LOOK FOR COMMA
14285: {{BEQ{R10{#T$CMA{CNC01{LOOP IF COMMA FOUND
14286: {{MOV{R6{SCNPT{{RESTORE SCNPT IN CASE XEQ TIME
14287: *
14288: * RETURN POINT
14289: *
14290: {CNC09{EXI{{{{RETURN
14291: *
14292: * -DOUBLE
14293: *
14294: {CNC10{MNZ{CSWDB{{{SET SWITCH
14295: {{BRN{CNC08{{{MERGE
14296: *
14297: * -DUMP
14298: * THIS IS USED FOR SYSTEM DEBUGGING . IT HAS THE EFFECT OF
14299: * PRODUCING A CORE DUMP AT COMPILATION TIME
14300: *
14301: {CNC11{JSR{SYSDM{{{CALL DUMPER
14302: {{BRN{CNC09{{{FINISHED
14303: *
14304: * -EJECT
14305: *
14306: {CNC12{BZE{CSWLS{CNC09{{RETURN IF -NOLIST
14307: {{JSR{PRTPS{{{EJECT
14308: {{JSR{LISTT{{{LIST TITLE
14309: {{BRN{CNC09{{{FINISHED
14310: *
14311: * -ERRORS
14312: *
14313: {CNC13{ZER{CSWER{{{CLEAR SWITCH
14314: {{BRN{CNC08{{{MERGE
14315: *
14316: * -EXECUTE
14317: *
14318: {CNC14{ZER{CSWEX{{{CLEAR SWITCH
14319: {{BRN{CNC08{{{MERGE
14320: *
14321: * -FAIL
14322: *
14323: {CNC15{MNZ{CSWFL{{{SET SWITCH
14324: {{BRN{CNC08{{{MERGE
14325: *
14326: * -LIST
14327: *
14328: {CNC16{MNZ{CSWLS{{{SET SWITCH
14329: {{BEQ{STAGE{#STGIC{CNC08{DONE IF COMPILE TIME
14330: *
14331: * LIST CODE LINE IF EXECUTE TIME COMPILE
14332: *
14333: {{ZER{LSTPF{{{PERMIT LISTING
14334: {{JSR{LISTR{{{LIST LINE
14335: {{BRN{CNC08{{{MERGE
14336: {{EJC{{{{
14337: *
14338: * CNCRD (CONTINUED)
14339: *
14340: * -NOERRORS
14341: *
14342: {CNC17{MNZ{CSWER{{{SET SWITCH
14343: {{BRN{CNC08{{{MERGE
14344: *
14345: * -NOEXECUTE
14346: *
14347: {CNC18{MNZ{CSWEX{{{SET SWITCH
14348: {{BRN{CNC08{{{MERGE
14349: *
14350: * -NOFAIL
14351: *
14352: {CNC19{ZER{CSWFL{{{CLEAR SWITCH
14353: {{BRN{CNC08{{{MERGE
14354: *
14355: * -NOLIST
14356: *
14357: {CNC20{ZER{CSWLS{{{CLEAR SWITCH
14358: {{BRN{CNC08{{{MERGE
14359: *
14360: * -NOOPTIMISE
14361: *
14362: {CNC21{MNZ{CSWNO{{{SET SWITCH
14363: {{BRN{CNC08{{{MERGE
14364: *
14365: * -NOPRINT
14366: *
14367: {CNC22{ZER{CSWPR{{{CLEAR SWITCH
14368: {{BRN{CNC08{{{MERGE
14369: *
14370: * -OPTIMISE
14371: *
14372: {CNC24{ZER{CSWNO{{{CLEAR SWITCH
14373: {{BRN{CNC08{{{MERGE
14374: *
14375: * -PRINT
14376: *
14377: {CNC25{MNZ{CSWPR{{{SET SWITCH
14378: {{BRN{CNC08{{{MERGE
14379: {{EJC{{{{
14380: *
14381: * CNCRD (CONTINUED)
14382: *
14383: * -SINGLE
14384: *
14385: {CNC27{ZER{CSWDB{{{CLEAR SWITCH
14386: {{BRN{CNC08{{{MERGE
14387: *
14388: * -SPACE
14389: *
14390: {CNC28{BZE{CSWLS{CNC09{{RETURN IF -NOLIST
14391: {{JSR{SCANE{{{SCAN INTEGER AFTER -SPACE
14392: {{MOV{#NUM01{R8{{1 SPACE IN CASE
14393: {{BEQ{R9{#T$SMC{CNC29{JUMP IF NO INTEGER
14394: {{MOV{R9{-(SP){{STACK IT
14395: {{JSR{GTSMI{{{CHECK INTEGER
14396: {{PPM{CNC06{{{FAIL IF NOT INTEGER
14397: {{PPM{CNC06{{{FAIL IF NEGATIVE OR LARGE
14398: {{BNZ{R8{CNC29{{JUMP IF NON ZERO
14399: {{MOV{#NUM01{R8{{ELSE 1 SPACE
14400: *
14401: * MERGE WITH COUNT OF LINES TO SKIP
14402: *
14403: {CNC29{ADD{R8{LSTLC{{BUMP LINE COUNT
14404: {{LCT{R8{R8{{CONVERT TO LOOP COUNTER
14405: {{BLT{LSTLC{LSTNP{CNC30{JUMP IF FITS ON PAGE
14406: {{JSR{PRTPS{{{EJECT
14407: {{JSR{LISTT{{{LIST TITLE
14408: {{BRN{CNC09{{{MERGE
14409: *
14410: * SKIP LINES
14411: *
14412: {CNC30{JSR{PRTNL{{{PRINT A BLANK
14413: {{BCT{R8{CNC30{{LOOP
14414: {{BRN{CNC09{{{MERGE
14415: {{EJC{{{{
14416: *
14417: * CNCRD (CONTINUED)
14418: *
14419: * -STITL
14420: *
14421: {CNC31{MOV{#R$STL{CNR$T{{PTR TO R$STL
14422: {{BRN{CNC33{{{MERGE
14423: *
14424: * -TITLE
14425: *
14426: {CNC32{MOV{#NULLS{R$STL{{CLEAR SUBTITLE
14427: {{MOV{#R$TTL{CNR$T{{PTR TO R$TTL
14428: *
14429: * COMMON PROCESSING FOR -TITLE, -STITL
14430: *
14431: {CNC33{MOV{#NULLS{R9{{NULL IN CASE NEEDED
14432: {{MNZ{CNTTL{{{SET FLAG FOR NEXT LISTR CALL
14433: {{MOV{#CCOFS{R7{{OFFSET TO TITLE/SUBTITLE
14434: {{MOV{SCNIL{R6{{INPUT IMAGE LENGTH
14435: {{BLO{R6{R7{CNC34{JUMP IF NO CHARS LEFT
14436: {{SUB{R7{R6{{NO OF CHARS TO EXTRACT
14437: {{MOV{R$CIM{R10{{POINT TO IMAGE
14438: {{JSR{SBSTR{{{GET TITLE/SUBTITLE
14439: *
14440: * STORE TITLE/SUBTITLE
14441: *
14442: {CNC34{MOV{CNR$T{R10{{POINT TO STORAGE LOCATION
14443: {{MOV{R9{(R10){{STORE TITLE/SUBTITLE
14444: {{BEQ{R10{#R$STL{CNC09{RETURN IF STITL
14445: {{BNZ{PRECL{CNC09{{RETURN IF EXTENDED LISTING
14446: {{BZE{PRICH{CNC09{{RETURN IF REGULAR PRINTER
14447: {{MOV{4*SCLEN(R9){R10{{GET LENGTH OF TITLE
14448: {{MOV{R10{R6{{COPY IT
14449: {{BZE{R10{CNC35{{JUMP IF NULL
14450: {{ADD{#NUM10{R10{{INCREMENT
14451: {{BHI{R10{PRLEN{CNC09{USE DEFAULT LSTP0 VAL IF TOO LONG
14452: {{ADD{#NUM04{R6{{POINT JUST PAST TITLE
14453: *
14454: * STORE OFFSET TO PAGE NN MESSAGE FOR SHORT TITLE
14455: *
14456: {CNC35{MOV{R6{LSTPO{{STORE OFFSET
14457: {{BRN{CNC09{{{RETURN
14458: *
14459: * -TRACE
14460: * PROVIDED FOR SYSTEM DEBUGGING. TOGGLES THE SYSTEM LABEL
14461: * TRACE SWITCH AT COMPILE TIME
14462: *
14463: {CNC36{JSR{SYSTT{{{TOGGLE SWITCH
14464: {{BRN{CNC08{{{MERGE
14465: *
14466: * -CASE
14467: * SETS VALUE OF KVCAS SO THAT NAMES ARE FOLDED OR NOT
14468: * DURING COMPILATION.
14469: *
14470: {CNC37{JSR{SCANE{{{SCAN INTEGER AFTER -CASE
14471: {{ZER{R8{{{GET 0 IN CASE NONE THERE
14472: {{BEQ{R10{#T$SMC{CNC38{SKIP IF NO INTEGER
14473: {{MOV{R9{-(SP){{STACK IT
14474: {{JSR{GTSMI{{{CHECK INTEGER
14475: {{PPM{CNC06{{{FAIL IF NOT INTEGER
14476: {{PPM{CNC06{{{FAIL IF NEGATIVE OR TOO LARGE
14477: {CNC38{MOV{R8{KVCAS{{STORE NEW CASE VALUE
14478: {{BRN{CNC09{{{MERGE
14479: {{ENP{{{{END PROCEDURE CNCRD
14480: {{EJC{{{{
14481: *
14482: * DFFNC -- DEFINE FUNCTION
14483: *
14484: * DFFNC IS CALLED WHENEVER A NEW FUNCTION IS ASSIGNED TO
14485: * A VARIABLE. IT DEALS WITH EXTERNAL FUNCTION USE COUNTS.
14486: *
14487: * (XR) POINTER TO VRBLK
14488: * (XL) POINTER TO NEW FUNCTION BLOCK
14489: * JSR DFFNC CALL TO DEFINE FUNCTION
14490: * (WA,WB) DESTROYED
14491: *
14492: {DFFNC{PRC{E{0{{ENTRY POINT
14493: {{BNE{(R10){#B$EFC{DFFN1{SKIP IF NEW FUNCTION NOT EXTERNAL
14494: {{ICV{4*EFUSE(R10){{{ELSE INCREMENT ITS USE COUNT
14495: *
14496: * HERE AFTER DEALING WITH NEW FUNCTION USE COUNT
14497: *
14498: {DFFN1{MOV{R9{R6{{SAVE VRBLK POINTER
14499: {{MOV{4*VRFNC(R9){R9{{LOAD OLD FUNCTION POINTER
14500: {{BNE{(R9){#B$EFC{DFFN2{JUMP IF OLD FUNCTION NOT EXTERNAL
14501: {{MOV{4*EFUSE(R9){R7{{ELSE GET USE COUNT
14502: {{DCV{R7{{{DECREMENT
14503: {{MOV{R7{4*EFUSE(R9){{STORE DECREMENTED VALUE
14504: {{BNZ{R7{DFFN2{{JUMP IF USE COUNT STILL NON-ZERO
14505: {{JSR{SYSUL{{{ELSE CALL SYSTEM UNLOAD FUNCTION
14506: *
14507: * HERE AFTER DEALING WITH OLD FUNCTION USE COUNT
14508: *
14509: {DFFN2{MOV{R6{R9{{RESTORE VRBLK POINTER
14510: {{MOV{R10{R6{{COPY FUNCTION BLOCK PTR
14511: {{BLT{R9{#R$YYY{DFFN3{SKIP CHECKS IF OPSYN OP DEFINITION
14512: {{BNZ{4*VRLEN(R9){DFFN3{{JUMP IF NOT SYSTEM VARIABLE
14513: *
14514: * FOR SYSTEM VARIABLE, CHECK FOR ILLEGAL REDEFINITION
14515: *
14516: {{MOV{4*VRSVP(R9){R10{{POINT TO SVBLK
14517: {{MOV{4*SVBIT(R10){R7{{LOAD BIT INDICATORS
14518: {{ANB{BTFNC{R7{{IS IT A SYSTEM FUNCTION
14519: {{ZRB{R7{DFFN3{{REDEF OK IF NOT
14520: {{ERB{248{ATTEMPTED{{REDEFINITION OF SYSTEM FUNCTION
14521: *
14522: * HERE IF REDEFINITION IS PERMITTED
14523: *
14524: {DFFN3{MOV{R6{4*VRFNC(R9){{STORE NEW FUNCTION POINTER
14525: {{MOV{R6{R10{{RESTORE FUNCTION BLOCK POINTER
14526: {{EXI{{{{RETURN TO DFFNC CALLER
14527: {{ENP{{{{END PROCEDURE DFFNC
14528: {{EJC{{{{
14529: *
14530: * DTACH -- DETACH I/O ASSOCIATED NAMES
14531: *
14532: * DETACHES TRBLKS FROM I/O ASSOCIATED VARIABLES, REMOVES
14533: * ENTRY FROM IOCHN CHAIN ATTACHED TO FILEARG1 VRBLK AND MAY
14534: * REMOVE VRBLK ACCESS AND STORE TRAPS.
14535: * INPUT, OUTPUT, TERMINAL ARE HANDLED SPECIALLY.
14536: *
14537: * (XL) I/O ASSOC. VBL NAME BASE PTR
14538: * (WA) OFFSET TO NAME
14539: * JSR DTACH CALL FOR DETACH OPERATION
14540: * (XL,XR,WA,WB,WC) DESTROYED
14541: *
14542: {DTACH{PRC{E{0{{ENTRY POINT
14543: {{MOV{R10{DTCNB{{STORE NAME BASE (GBCOL NOT CALLED)
14544: {{ADD{R6{R10{{POINT TO NAME LOCATION
14545: {{MOV{R10{DTCNM{{STORE IT
14546: *
14547: * LOOP TO SEARCH FOR I/O TRBLK
14548: *
14549: {DTCH1{MOV{R10{R9{{COPY NAME POINTER
14550: *
14551: * CONTINUE AFTER BLOCK DELETION
14552: *
14553: {DTCH2{MOV{(R10){R10{{POINT TO NEXT VALUE
14554: {{BNE{(R10){#B$TRT{DTCH6{JUMP AT CHAIN END
14555: {{MOV{4*TRTYP(R10){R6{{GET TRAP BLOCK TYPE
14556: {{BEQ{R6{#TRTIN{DTCH3{JUMP IF INPUT
14557: {{BEQ{R6{#TRTOU{DTCH3{JUMP IF OUTPUT
14558: {{ADD{#4*TRNXT{R10{{POINT TO NEXT LINK
14559: {{BRN{DTCH1{{{LOOP
14560: *
14561: * DELETE AN OLD ASSOCIATION
14562: *
14563: {DTCH3{MOV{4*TRVAL(R10){(R9){{DELETE TRBLK
14564: {{MOV{R10{R6{{DUMP XL ...
14565: {{MOV{R9{R7{{... AND XR
14566: {{MOV{4*TRTRF(R10){R10{{POINT TO TRTRF TRAP BLOCK
14567: {{BZE{R10{DTCH5{{JUMP IF NO IOCHN
14568: {{BNE{(R10){#B$TRT{DTCH5{JUMP IF INPUT, OUTPUT, TERMINAL
14569: *
14570: * LOOP TO SEARCH IOCHN CHAIN FOR NAME PTR
14571: *
14572: {DTCH4{MOV{R10{R9{{REMEMBER LINK PTR
14573: {{MOV{4*TRTRF(R10){R10{{POINT TO NEXT LINK
14574: {{BZE{R10{DTCH5{{JUMP IF END OF CHAIN
14575: {{MOV{4*IONMB(R10){R8{{GET NAME BASE
14576: {{ADD{4*IONMO(R10){R8{{ADD OFFSET
14577: {{BNE{R8{DTCNM{DTCH4{LOOP IF NO MATCH
14578: {{MOV{4*TRTRF(R10){4*TRTRF(R9){{REMOVE NAME FROM CHAIN
14579: {{EJC{{{{
14580: *
14581: * DTACH (CONTINUED)
14582: *
14583: * PREPARE TO RESUME I/O TRBLK SCAN
14584: *
14585: {DTCH5{MOV{R6{R10{{RECOVER XL ...
14586: {{MOV{R7{R9{{... AND XR
14587: {{ADD{#4*TRVAL{R10{{POINT TO VALUE FIELD
14588: {{BRN{DTCH2{{{CONTINUE
14589: *
14590: * EXIT POINT
14591: *
14592: {DTCH6{MOV{DTCNB{R9{{POSSIBLE VRBLK PTR
14593: {{JSR{SETVR{{{RESET VRBLK IF NECESSARY
14594: {{EXI{{{{RETURN
14595: {{ENP{{{{END PROCEDURE DTACH
14596: {{EJC{{{{
14597: *
14598: * DTYPE -- GET DATATYPE NAME
14599: *
14600: * (XR) OBJECT WHOSE DATATYPE IS REQUIRED
14601: * JSR DTYPE CALL TO GET DATATYPE
14602: * (XR) RESULT DATATYPE
14603: *
14604: {DTYPE{PRC{E{0{{ENTRY POINT
14605: {{BEQ{(R9){#B$PDT{DTYP1{JUMP IF PROG.DEFINED
14606: {{MOV{(R9){R9{{LOAD TYPE WORD
14607: {{LEI{R9{{{GET ENTRY POINT ID (BLOCK CODE)
14608: {{WTB{R9{{{CONVERT TO BYTE OFFSET
14609: {{MOV{L^SCNMT(R9){R9{{LOAD TABLE ENTRY
14610: {{EXI{{{{EXIT TO DTYPE CALLER
14611: *
14612: * HERE IF PROGRAM DEFINED
14613: *
14614: {DTYP1{MOV{4*PDDFP(R9){R9{{POINT TO DFBLK
14615: {{MOV{4*DFNAM(R9){R9{{GET DATATYPE NAME FROM DFBLK
14616: {{EXI{{{{RETURN TO DTYPE CALLER
14617: {{ENP{{{{END PROCEDURE DTYPE
14618: {{EJC{{{{
14619: *
14620: * DUMPR -- PRINT DUMP OF STORAGE
14621: *
14622: * (XR) DUMP ARGUMENT (SEE BELOW)
14623: * JSR DUMPR CALL TO PRINT DUMP
14624: * (XR,XL) DESTROYED
14625: * (WA,WB,WC,RA) DESTROYED
14626: *
14627: * THE DUMP ARGUMENT HAS THE FOLLOWING SIGNIFICANCE
14628: *
14629: * DMARG = 0 NO DUMP PRINTED
14630: * DMARG = 1 PARTIAL DUMP (NAT VARS, KEYWORDS)
14631: * DMARG EQ 2 FULL DUMP (INCL ARRAYS ETC.)
14632: * DMARG GE 3 CORE DUMP
14633: *
14634: * SINCE DUMPR SCRAMBLES STORE, IT IS NOT PERMISSIBLE TO
14635: * COLLECT IN MID-DUMP. HENCE A COLLECT IS DONE INITIALLY
14636: * AND THEN IF STORE RUNS OUT AN ERROR MESSAGE IS PRODUCED.
14637: *
14638: {DUMPR{PRC{E{0{{ENTRY POINT
14639: {{BZE{R9{DMP28{{SKIP DUMP IF ARGUMENT IS ZERO
14640: {{BGT{R9{#NUM02{DMP29{JUMP IF CORE DUMP REQUIRED
14641: {{ZER{R10{{{CLEAR XL
14642: {{ZER{R7{{{ZERO MOVE OFFSET
14643: {{MOV{R9{DMARG{{SAVE DUMP ARGUMENT
14644: {{JSR{GBCOL{{{COLLECT GARBAGE
14645: {{JSR{PRTPG{{{EJECT PRINTER
14646: {{MOV{#DMHDV{R9{{POINT TO HEADING FOR VARIABLES
14647: {{JSR{PRTST{{{PRINT IT
14648: {{JSR{PRTNL{{{TERMINATE PRINT LINE
14649: {{JSR{PRTNL{{{AND PRINT A BLANK LINE
14650: *
14651: * FIRST ALL NATURAL VARIABLE BLOCKS (VRBLK) WHOSE VALUES
14652: * ARE NON-NULL ARE LINKED IN LEXICAL ORDER USING DMVCH AS
14653: * THE CHAIN HEAD AND CHAINING THROUGH THE VRGET FIELDS.
14654: * NOTE THAT THIS SCRAMBLES STORE IF THE PROCESS IS
14655: * INTERRUPTED BEFORE COMPLETION E.G. BY EXCEEDING TIME OR
14656: * PRINT LIMITS. SINCE THE SUBSEQUENT CORE DUMPS AND
14657: * FAILURES IF EXECUTION IS RESUMED ARE VERY CONFUSING, THE
14658: * EXECUTION TIME ERROR ROUTINE CHECKS FOR THIS EVENT AND
14659: * ATTEMPTS AN UNSCRAMBLE. SIMILAR PRECAUTIONS SHOULD BE
14660: * OBSERVED IF TRANSLATE TIME DUMPING IS IMPLEMENTED.
14661: *
14662: {{ZER{DMVCH{{{SET NULL CHAIN TO START
14663: {{MOV{HSHTB{R6{{POINT TO HASH TABLE
14664: *
14665: * LOOP THROUGH HEADERS IN HASH TABLE
14666: *
14667: {DMP00{MOV{R6{R9{{COPY HASH BUCKET POINTER
14668: {{ICA{R6{{{BUMP POINTER
14669: {{SUB{#4*VRNXT{R9{{SET OFFSET TO MERGE
14670: *
14671: * LOOP THROUGH VRBLKS ON ONE CHAIN
14672: *
14673: {DMP01{MOV{4*VRNXT(R9){R9{{POINT TO NEXT VRBLK ON CHAIN
14674: {{BZE{R9{DMP09{{JUMP IF END OF THIS HASH CHAIN
14675: {{MOV{R9{R10{{ELSE COPY VRBLK POINTER
14676: {{EJC{{{{
14677: *
14678: * DUMPR (CONTINUED)
14679: *
14680: * LOOP TO FIND VALUE AND SKIP IF NULL
14681: *
14682: {DMP02{MOV{4*VRVAL(R10){R10{{LOAD VALUE
14683: {{BEQ{R10{#NULLS{DMP01{LOOP FOR NEXT VRBLK IF NULL VALUE
14684: {{BEQ{(R10){#B$TRT{DMP02{LOOP BACK IF VALUE IS TRAPPED
14685: *
14686: * NON-NULL VALUE, PREPARE TO SEARCH CHAIN
14687: *
14688: {{MOV{R9{R8{{SAVE VRBLK POINTER
14689: {{ADD{#4*VRSOF{R9{{ADJUST PTR TO BE LIKE SCBLK PTR
14690: {{BNZ{4*SCLEN(R9){DMP03{{JUMP IF NON-SYSTEM VARIABLE
14691: {{MOV{4*VRSVO(R9){R9{{ELSE LOAD PTR TO NAME IN SVBLK
14692: *
14693: * HERE WITH NAME POINTER FOR NEW BLOCK IN XR
14694: *
14695: {DMP03{MOV{R9{R7{{SAVE POINTER TO CHARS
14696: {{MOV{R6{DMPSV{{SAVE HASH BUCKET POINTER
14697: {{MOV{#DMVCH{R6{{POINT TO CHAIN HEAD
14698: *
14699: * LOOP TO SEARCH CHAIN FOR CORRECT INSERTION POINT
14700: *
14701: {DMP04{MOV{R6{DMPCH{{SAVE CHAIN POINTER
14702: {{MOV{R6{R10{{COPY IT
14703: {{MOV{(R10){R9{{LOAD POINTER TO NEXT ENTRY
14704: {{BZE{R9{DMP08{{JUMP IF END OF CHAIN TO INSERT
14705: {{ADD{#4*VRSOF{R9{{ELSE GET NAME PTR FOR CHAINED VRBLK
14706: {{BNZ{4*SCLEN(R9){DMP05{{JUMP IF NOT SYSTEM VARIABLE
14707: {{MOV{4*VRSVO(R9){R9{{ELSE POINT TO NAME IN SVBLK
14708: *
14709: * HERE PREPARE TO COMPARE THE NAMES
14710: *
14711: * (WA) SCRATCH
14712: * (WB) POINTER TO STRING OF ENTERING VRBLK
14713: * (WC) POINTER TO ENTERING VRBLK
14714: * (XR) POINTER TO STRING OF CURRENT BLOCK
14715: * (XL) SCRATCH
14716: *
14717: {DMP05{MOV{R7{R10{{POINT TO ENTERING VRBLK STRING
14718: {{MOV{4*SCLEN(R10){R6{{LOAD ITS LENGTH
14719: {{PLC{R10{{{POINT TO CHARS OF ENTERING STRING
14720: {{BHI{R6{4*SCLEN(R9){DMP06{JUMP IF ENTERING LENGTH HIGH
14721: {{PLC{R9{{{ELSE POINT TO CHARS OF OLD STRING
14722: {{CMC{DMP08{DMP07{{COMPARE, INSERT IF NEW IS LLT OLD
14723: {{BRN{DMP08{{{OR IF LEQ (WE HAD SHORTER LENGTH)
14724: *
14725: * HERE WHEN NEW LENGTH IS LONGER THAN OLD LENGTH
14726: *
14727: {DMP06{MOV{4*SCLEN(R9){R6{{LOAD SHORTER LENGTH
14728: {{PLC{R9{{{POINT TO CHARS OF OLD STRING
14729: {{CMC{DMP08{DMP07{{COMPARE, INSERT IF NEW ONE LOW
14730: {{EJC{{{{
14731: *
14732: * DUMPR (CONTINUED)
14733: *
14734: * HERE WE MOVE OUT ON THE CHAIN
14735: *
14736: {DMP07{MOV{DMPCH{R10{{COPY CHAIN POINTER
14737: {{MOV{(R10){R6{{MOVE TO NEXT ENTRY ON CHAIN
14738: {{BRN{DMP04{{{LOOP BACK
14739: *
14740: * HERE AFTER LOCATING THE PROPER INSERTION POINT
14741: *
14742: {DMP08{MOV{DMPCH{R10{{COPY CHAIN POINTER
14743: {{MOV{DMPSV{R6{{RESTORE HASH BUCKET POINTER
14744: {{MOV{R8{R9{{RESTORE VRBLK POINTER
14745: {{MOV{(R10){4*VRGET(R9){{LINK VRBLK TO REST OF CHAIN
14746: {{MOV{R9{(R10){{LINK VRBLK INTO CURRENT CHAIN LOC
14747: {{BRN{DMP01{{{LOOP BACK FOR NEXT VRBLK
14748: *
14749: * HERE AFTER PROCESSING ALL VRBLKS ON ONE CHAIN
14750: *
14751: {DMP09{BNE{R6{HSHTE{DMP00{LOOP BACK IF MORE BUCKETS TO GO
14752: *
14753: * LOOP TO GENERATE DUMP OF NATURAL VARIABLE VALUES
14754: *
14755: {DMP10{MOV{DMVCH{R9{{LOAD POINTER TO NEXT ENTRY ON CHAIN
14756: {{BZE{R9{DMP11{{JUMP IF END OF CHAIN
14757: {{MOV{(R9){DMVCH{{ELSE UPDATE CHAIN PTR TO NEXT ENTRY
14758: {{JSR{SETVR{{{RESTORE VRGET FIELD
14759: {{MOV{R9{R10{{COPY VRBLK POINTER (NAME BASE)
14760: {{MOV{#4*VRVAL{R6{{SET OFFSET FOR VRBLK NAME
14761: {{JSR{PRTNV{{{PRINT NAME = VALUE
14762: {{BRN{DMP10{{{LOOP BACK TILL ALL PRINTED
14763: *
14764: * PREPARE TO PRINT KEYWORDS
14765: *
14766: {DMP11{JSR{PRTNL{{{PRINT BLANK LINE
14767: {{JSR{PRTNL{{{AND ANOTHER
14768: {{MOV{#DMHDK{R9{{POINT TO KEYWORD HEADING
14769: {{JSR{PRTST{{{PRINT HEADING
14770: {{JSR{PRTNL{{{END LINE
14771: {{JSR{PRTNL{{{PRINT ONE BLANK LINE
14772: {{MOV{#VDMKW{R10{{POINT TO LIST OF KEYWORD SVBLK PTRS
14773: {{EJC{{{{
14774: *
14775: * DUMPR (CONTINUED)
14776: *
14777: * LOOP TO DUMP KEYWORD VALUES
14778: *
14779: {DMP12{MOV{(R10)+{R9{{LOAD NEXT SVBLK PTR FROM TABLE
14780: {{BZE{R9{DMP13{{JUMP IF END OF LIST
14781: {{MOV{#CH$AM{R6{{LOAD AMPERSAND
14782: {{JSR{PRTCH{{{PRINT AMPERSAND
14783: {{JSR{PRTST{{{PRINT KEYWORD NAME
14784: {{MOV{4*SVLEN(R9){R6{{LOAD NAME LENGTH FROM SVBLK
14785: {{CTB{R6{SVCHS{{GET LENGTH OF NAME
14786: {{ADD{R6{R9{{POINT TO SVKNM FIELD
14787: {{MOV{(R9){DMPKN{{STORE IN DUMMY KVBLK
14788: {{MOV{#TMBEB{R9{{POINT TO BLANK-EQUAL-BLANK
14789: {{JSR{PRTST{{{PRINT IT
14790: {{MOV{R10{DMPSV{{SAVE TABLE POINTER
14791: {{MOV{#DMPKB{R10{{POINT TO DUMMY KVBLK
14792: {{MOV{#4*KVVAR{R6{{SET ZERO OFFSET
14793: {{JSR{ACESS{{{GET KEYWORD VALUE
14794: {{PPM{{{{FAILURE IS IMPOSSIBLE
14795: {{JSR{PRTVL{{{PRINT KEYWORD VALUE
14796: {{JSR{PRTNL{{{TERMINATE PRINT LINE
14797: {{MOV{DMPSV{R10{{RESTORE TABLE POINTER
14798: {{BRN{DMP12{{{LOOP BACK TILL ALL PRINTED
14799: *
14800: * HERE AFTER COMPLETING PARTIAL DUMP
14801: *
14802: {DMP13{BEQ{DMARG{#NUM01{DMP27{EXIT IF PARTIAL DUMP COMPLETE
14803: {{MOV{DNAMB{R9{{ELSE POINT TO FIRST DYNAMIC BLOCK
14804: *
14805: * LOOP THROUGH BLOCKS IN DYNAMIC STORAGE
14806: *
14807: {DMP14{BEQ{R9{DNAMP{DMP27{JUMP IF END OF USED REGION
14808: {{MOV{(R9){R6{{ELSE LOAD FIRST WORD OF BLOCK
14809: {{BEQ{R6{#B$VCT{DMP16{JUMP IF VECTOR
14810: {{BEQ{R6{#B$ART{DMP17{JUMP IF ARRAY
14811: {{BEQ{R6{#B$PDT{DMP18{JUMP IF PROGRAM DEFINED
14812: {{BEQ{R6{#B$TBT{DMP19{JUMP IF TABLE
14813: {{BEQ{R6{#B$BCT{DMP30{JUMP IF BUFFER
14814: *
14815: * MERGE HERE TO MOVE TO NEXT BLOCK
14816: *
14817: {DMP15{JSR{BLKLN{{{GET LENGTH OF BLOCK
14818: {{ADD{R6{R9{{POINT PAST THIS BLOCK
14819: {{BRN{DMP14{{{LOOP BACK FOR NEXT BLOCK
14820: {{EJC{{{{
14821: *
14822: * DUMPR (CONTINUED)
14823: *
14824: * HERE FOR VECTOR
14825: *
14826: {DMP16{MOV{#4*VCVLS{R7{{SET OFFSET TO FIRST VALUE
14827: {{BRN{DMP19{{{JUMP TO MERGE
14828: *
14829: * HERE FOR ARRAY
14830: *
14831: {DMP17{MOV{4*AROFS(R9){R7{{SET OFFSET TO ARPRO FIELD
14832: {{ICA{R7{{{BUMP TO GET OFFSET TO VALUES
14833: {{BRN{DMP19{{{JUMP TO MERGE
14834: *
14835: * HERE FOR PROGRAM DEFINED
14836: *
14837: {DMP18{MOV{#4*PDFLD{R7{{POINT TO VALUES, MERGE
14838: *
14839: * HERE FOR TABLE (OTHERS MERGE)
14840: *
14841: {DMP19{BZE{4*IDVAL(R9){DMP15{{IGNORE BLOCK IF ZERO ID VALUE
14842: {{JSR{BLKLN{{{ELSE GET BLOCK LENGTH
14843: {{MOV{R9{R10{{COPY BLOCK POINTER
14844: {{MOV{R6{DMPSV{{SAVE LENGTH
14845: {{MOV{R7{R6{{COPY OFFSET TO FIRST VALUE
14846: {{JSR{PRTNL{{{PRINT BLANK LINE
14847: {{MOV{R6{DMPSA{{PRESERVE OFFSET
14848: {{JSR{PRTVL{{{PRINT BLOCK VALUE (FOR TITLE)
14849: {{MOV{DMPSA{R6{{RECOVER OFFSET
14850: {{JSR{PRTNL{{{END PRINT LINE
14851: {{BEQ{(R9){#B$TBT{DMP22{JUMP IF TABLE
14852: {{DCA{R6{{{POINT BEFORE FIRST WORD
14853: *
14854: * LOOP TO PRINT CONTENTS OF ARRAY, VECTOR, OR PROGRAM DEF
14855: *
14856: {DMP20{MOV{R10{R9{{COPY BLOCK POINTER
14857: {{ICA{R6{{{BUMP OFFSET
14858: {{ADD{R6{R9{{POINT TO NEXT VALUE
14859: {{BEQ{R6{DMPSV{DMP14{EXIT IF END (XR PAST BLOCK)
14860: {{SUB{#4*VRVAL{R9{{SUBTRACT OFFSET TO MERGE INTO LOOP
14861: *
14862: * LOOP TO FIND VALUE AND IGNORE NULLS
14863: *
14864: {DMP21{MOV{4*VRVAL(R9){R9{{LOAD NEXT VALUE
14865: {{BEQ{R9{#NULLS{DMP20{LOOP BACK IF NULL VALUE
14866: {{BEQ{(R9){#B$TRT{DMP21{LOOP BACK IF TRAPPED
14867: {{JSR{PRTNV{{{ELSE PRINT NAME = VALUE
14868: {{BRN{DMP20{{{LOOP BACK FOR NEXT FIELD
14869: {{EJC{{{{
14870: *
14871: * DUMPR (CONTINUED)
14872: *
14873: * HERE TO DUMP A TABLE
14874: *
14875: {DMP22{MOV{#4*TBBUK{R8{{SET OFFSET TO FIRST BUCKET
14876: {{MOV{#4*TEVAL{R6{{SET NAME OFFSET FOR ALL TEBLKS
14877: *
14878: * LOOP THROUGH TABLE BUCKETS
14879: *
14880: {DMP23{MOV{R10{-(SP){{SAVE TBBLK POINTER
14881: {{ADD{R8{R10{{POINT TO NEXT BUCKET HEADER
14882: {{ICA{R8{{{BUMP BUCKET OFFSET
14883: {{SUB{#4*TENXT{R10{{SUBTRACT OFFSET TO MERGE INTO LOOP
14884: *
14885: * LOOP TO PROCESS TEBLKS ON ONE CHAIN
14886: *
14887: {DMP24{MOV{4*TENXT(R10){R10{{POINT TO NEXT TEBLK
14888: {{BEQ{R10{(SP){DMP26{JUMP IF END OF CHAIN
14889: {{MOV{R10{R9{{ELSE COPY TEBLK POINTER
14890: *
14891: * LOOP TO FIND VALUE AND IGNORE IF NULL
14892: *
14893: {DMP25{MOV{4*TEVAL(R9){R9{{LOAD NEXT VALUE
14894: {{BEQ{R9{#NULLS{DMP24{IGNORE IF NULL VALUE
14895: {{BEQ{(R9){#B$TRT{DMP25{LOOP BACK IF TRAPPED
14896: {{MOV{R8{DMPSV{{ELSE SAVE OFFSET POINTER
14897: {{JSR{PRTNV{{{PRINT NAME = VALUE
14898: {{MOV{DMPSV{R8{{RELOAD OFFSET
14899: {{BRN{DMP24{{{LOOP BACK FOR NEXT TEBLK
14900: *
14901: * HERE TO MOVE TO NEXT HASH CHAIN
14902: *
14903: {DMP26{MOV{(SP)+{R10{{RESTORE TBBLK POINTER
14904: {{BNE{R8{4*TBLEN(R10){DMP23{LOOP BACK IF MORE BUCKETS TO GO
14905: {{MOV{R10{R9{{ELSE COPY TABLE POINTER
14906: {{ADD{R8{R9{{POINT TO FOLLOWING BLOCK
14907: {{BRN{DMP14{{{LOOP BACK TO PROCESS NEXT BLOCK
14908: *
14909: * HERE AFTER COMPLETING DUMP
14910: *
14911: {DMP27{JSR{PRTPG{{{EJECT PRINTER
14912: *
14913: * MERGE HERE IF NO DUMP GIVEN (DMARG=0)
14914: *
14915: {DMP28{EXI{{{{RETURN TO DUMP CALLER
14916: *
14917: * CALL SYSTEM CORE DUMP ROUTINE
14918: *
14919: {DMP29{JSR{SYSDM{{{CALL IT
14920: {{BRN{DMP28{{{RETURN
14921: {{EJC{{{{
14922: *
14923: * DUMPR (CONTINUED)
14924: *
14925: * HERE TO DUMP BUFFER BLOCK
14926: *
14927: {DMP30{JSR{PRTNL{{{PRINT BLANK LINE
14928: {{JSR{PRTVL{{{PRINT VALUE ID FOR TITLE
14929: {{JSR{PRTNL{{{FORCE NEW LINE
14930: {{MOV{#CH$DQ{R6{{LOAD DOUBLE QUOTE
14931: {{JSR{PRTCH{{{PRINT IT
14932: {{MOV{4*BCLEN(R9){R8{{LOAD DEFINED LENGTH
14933: {{BZE{R8{DMP32{{SKIP CHARACTERS IF NONE
14934: {{LCT{R8{R8{{LOAD COUNT FOR LOOP
14935: {{MOV{R9{R7{{SAVE BCBLK PTR
14936: {{MOV{4*BCBUF(R9){R9{{POINT TO BFBLK
14937: {{PLC{R9{{{GET SET TO LOAD CHARACTERS
14938: *
14939: * LOOP HERE STUFFING CHARACTERS IN OUTPUT STREAM
14940: *
14941: {DMP31{LCH{R6{(R9)+{{GET NEXT CHARACTER
14942: {{JSR{PRTCH{{{STUFF IT
14943: {{BCT{R8{DMP31{{BRANCH FOR NEXT ONE
14944: {{MOV{R7{R9{{RESTORE BCBLK POINTER
14945: *
14946: * MERGE TO STUFF CLOSING QUOTE MARK
14947: *
14948: {DMP32{MOV{#CH$DQ{R6{{STUFF QUOTE
14949: {{JSR{PRTCH{{{PRINT IT
14950: {{JSR{PRTNL{{{PRINT NEW LINE
14951: {{MOV{(R9){R6{{GET FIRST WD FOR BLKLN
14952: {{BRN{DMP15{{{MERGE TO GET NEXT BLOCK
14953: {{ENP{{{{END PROCEDURE DUMPR
14954: {{EJC{{{{
14955: *
14956: * ERMSG -- PRINT ERROR CODE AND ERROR MESSAGE
14957: *
14958: * KVERT ERROR CODE
14959: * JSR ERMSG CALL TO PRINT MESSAGE
14960: * (XR,XL,WA,WB,WC,IA) DESTROYED
14961: *
14962: {ERMSG{PRC{E{0{{ENTRY POINT
14963: {{JSR{PRTIS{{{PRINT ERROR PTR OR BLANK LINE
14964: {{MOV{KVERT{R6{{LOAD ERROR CODE
14965: {{MOV{#ERMMS{R9{{POINT TO ERROR MESSAGE /ERROR/
14966: {{JSR{PRTST{{{PRINT IT
14967: {{JSR{ERTEX{{{GET ERROR MESSAGE TEXT
14968: {{ADD{#THSND{R6{{BUMP ERROR CODE FOR PRINT
14969: {{MTI{R6{{{FAIL CODE IN INT ACC
14970: {{JSR{PRTIN{{{PRINT CODE (NOW HAVE ERROR1XXX)
14971: {{MOV{PRBUF{R10{{POINT TO PRINT BUFFER
14972: {{PSC{R10{#NUM05{{POINT TO THE 1
14973: {{MOV{#CH$BL{R6{{LOAD A BLANK
14974: {{SCH{R6{(R10){{STORE BLANK OVER 1 (ERROR XXX)
14975: {{CSC{R10{{{COMPLETE STORE CHARACTERS
14976: {{ZER{R10{{{CLEAR GARBAGE POINTER IN XL
14977: {{MOV{R9{R6{{KEEP ERROR TEXT
14978: {{MOV{#ERMNS{R9{{POINT TO / -- /
14979: {{JSR{PRTST{{{PRINT IT
14980: {{MOV{R6{R9{{GET ERROR TEXT AGAIN
14981: {{JSR{PRTST{{{PRINT ERROR MESSAGE TEXT
14982: {{JSR{PRTIS{{{PRINT LINE
14983: {{JSR{PRTIS{{{PRINT BLANK LINE
14984: {{EXI{{{{RETURN TO ERMSG CALLER
14985: {{ENP{{{{END PROCEDURE ERMSG
14986: {{EJC{{{{
14987: *
14988: * ERTEX -- GET ERROR MESSAGE TEXT
14989: *
14990: * (WA) ERROR CODE
14991: * JSR ERTEX CALL TO GET ERROR TEXT
14992: * (XR) PTR TO ERROR TEXT IN DYNAMIC
14993: * (R$ETX) COPY OF PTR TO ERROR TEXT
14994: * (XL,WC,IA) DESTROYED
14995: *
14996: {ERTEX{PRC{E{0{{ENTRY POINT
14997: {{MOV{R6{ERTWA{{SAVE WA
14998: {{MOV{R7{ERTWB{{SAVE WB
14999: {{JSR{SYSEM{{{GET FAILURE MESSAGE TEXT
15000: {{MOV{R9{R10{{COPY POINTER TO IT
15001: {{MOV{4*SCLEN(R9){R6{{GET LENGTH OF STRING
15002: {{BZE{R6{ERT02{{JUMP IF NULL
15003: {{ZER{R7{{{OFFSET OF ZERO
15004: {{JSR{SBSTR{{{COPY INTO DYNAMIC STORE
15005: {{MOV{R9{R$ETX{{STORE FOR RELOCATION
15006: *
15007: * RETURN
15008: *
15009: {ERT01{MOV{ERTWB{R7{{RESTORE WB
15010: {{MOV{ERTWA{R6{{RESTORE WA
15011: {{EXI{{{{RETURN TO CALLER
15012: *
15013: * RETURN ERRTEXT CONTENTS INSTEAD OF NULL
15014: *
15015: {ERT02{MOV{R$ETX{R9{{GET ERRTEXT
15016: {{BRN{ERT01{{{RETURN
15017: {{ENP{{{{
15018: {{EJC{{{{
15019: *
15020: * EVALI -- EVALUATE INTEGER ARGUMENT
15021: *
15022: * EVALI IS USED BY PATTERN PRIMITIVES LEN,TAB,RTAB,POS,RPOS
15023: * WHEN THEIR ARGUMENT IS AN EXPRESSION VALUE.
15024: *
15025: * (XR) NODE POINTER
15026: * (WB) CURSOR
15027: * JSR EVALI CALL TO EVALUATE INTEGER
15028: * PPM LOC TRANSFER LOC FOR NON-INTEGER ARG
15029: * PPM LOC TRANSFER LOC FOR OUT OF RANGE ARG
15030: * PPM LOC TRANSFER LOC FOR EVALUATION FAILURE
15031: * PPM LOC TRANSFER LOC FOR SUCCESSFUL EVAL
15032: * (THE NORMAL RETURN IS NEVER TAKEN)
15033: * (XR) PTR TO NODE WITH INTEGER ARGUMENT
15034: * (WC,XL,RA) DESTROYED
15035: *
15036: * ON RETURN, THE NODE POINTED TO HAS THE INTEGER ARGUMENT
15037: * IN PARM1 AND THE PROPER SUCCESSOR POINTER IN PTHEN.
15038: * THIS ALLOWS MERGING WITH THE NORMAL (INTEGER ARG) CASE.
15039: *
15040: {EVALI{PRC{R{4{{ENTRY POINT (RECURSIVE)
15041: {{JSR{EVALP{{{EVALUATE EXPRESSION
15042: {{PPM{EVLI1{{{JUMP ON FAILURE
15043: {{MOV{R10{-(SP){{STACK RESULT FOR GTSMI
15044: {{MOV{4*PTHEN(R9){R10{{LOAD SUCCESSOR POINTER
15045: {{JSR{GTSMI{{{CONVERT ARG TO SMALL INTEGER
15046: {{PPM{EVLI2{{{JUMP IF NOT INTEGER
15047: {{PPM{EVLI3{{{JUMP IF OUT OF RANGE
15048: {{MOV{R9{EVLIV{{STORE RESULT IN SPECIAL DUMMY NODE
15049: {{MOV{R10{EVLIS{{STORE SUCCESSOR POINTER
15050: {{MOV{#EVLIN{R9{{POINT TO DUMMY NODE WITH RESULT
15051: {{EXI{4{{{TAKE SUCCESSFUL EXIT
15052: *
15053: * HERE IF EVALUATION FAILS
15054: *
15055: {EVLI1{EXI{3{{{TAKE FAILURE RETURN
15056: *
15057: * HERE IF ARGUMENT IS NOT INTEGER
15058: *
15059: {EVLI2{EXI{1{{{TAKE NON-INTEGER ERROR EXIT
15060: *
15061: * HERE IF ARGUMENT IS OUT OF RANGE
15062: *
15063: {EVLI3{EXI{2{{{TAKE OUT-OF-RANGE ERROR EXIT
15064: {{ENP{{{{END PROCEDURE EVALI
15065: {{EJC{{{{
15066: *
15067: * EVALP -- EVALUATE EXPRESSION DURING PATTERN MATCH
15068: *
15069: * EVALP IS USED TO EVALUATE AN EXPRESSION (BY VALUE) DURING
15070: * A PATTERN MATCH. THE EFFECT IS LIKE EVALX, BUT PATTERN
15071: * VARIABLES ARE STACKED AND RESTORED IF NECESSARY.
15072: *
15073: * EVALP ALSO DIFFERS FROM EVALX IN THAT IF THE RESULT IS
15074: * AN EXPRESSION IT IS REEVALUATED. THIS OCCURS REPEATEDLY.
15075: *
15076: * (XR) NODE POINTER
15077: * (WB) PATTERN MATCH CURSOR
15078: * JSR EVALP CALL TO EVALUATE EXPRESSION
15079: * PPM LOC TRANSFER LOC IF EVALUATION FAILS
15080: * (XL) RESULT
15081: * (WA) FIRST WORD OF RESULT BLOCK
15082: * (XR,WB) DESTROYED (FAILURE CASE ONLY)
15083: * (WC,RA) DESTROYED
15084: *
15085: * THE EXPRESSION POINTER IS STORED IN PARM1 OF THE NODE
15086: *
15087: * CONTROL RETURNS TO FAILP ON FAILURE OF EVALUATION
15088: *
15089: {EVALP{PRC{R{1{{ENTRY POINT (RECURSIVE)
15090: {{MOV{4*PARM1(R9){R10{{LOAD EXPRESSION POINTER
15091: {{BEQ{(R10){#B$EXL{EVLP1{JUMP IF EXBLK CASE
15092: *
15093: * HERE FOR CASE OF SEBLK
15094: *
15095: * WE CAN GIVE A FAST RETURN IF THE VALUE OF THE VRBLK IS
15096: * NOT AN EXPRESSION AND IS NOT TRAPPED.
15097: *
15098: {{MOV{4*SEVAR(R10){R10{{LOAD VRBLK POINTER
15099: {{MOV{4*VRVAL(R10){R10{{LOAD VALUE OF VRBLK
15100: {{MOV{(R10){R6{{LOAD FIRST WORD OF VALUE
15101: {{BHI{R6{#B$T$${EVLP3{JUMP IF NOT SEBLK, TRBLK OR EXBLK
15102: *
15103: * HERE FOR EXBLK OR SEBLK WITH EXPR VALUE OR TRAPPED VALUE
15104: *
15105: {EVLP1{MOV{R9{-(SP){{STACK NODE POINTER
15106: {{MOV{R7{-(SP){{STACK CURSOR
15107: {{MOV{R$PMS{-(SP){{STACK SUBJECT STRING POINTER
15108: {{MOV{PMSSL{-(SP){{STACK SUBJECT STRING LENGTH
15109: {{MOV{PMDFL{-(SP){{STACK DOT FLAG
15110: {{MOV{PMHBS{-(SP){{STACK HISTORY STACK BASE POINTER
15111: {{MOV{4*PARM1(R9){R9{{LOAD EXPRESSION POINTER
15112: {{EJC{{{{
15113: *
15114: * EVALP (CONTINUED)
15115: *
15116: * LOOP BACK HERE TO REEVALUATE EXPRESSION RESULT
15117: *
15118: {EVLP2{ZER{R7{{{SET FLAG FOR BY VALUE
15119: {{JSR{EVALX{{{EVALUATE EXPRESSION
15120: {{PPM{EVLP4{{{JUMP ON FAILURE
15121: {{MOV{(R9){R6{{ELSE LOAD FIRST WORD OF VALUE
15122: {{BLO{R6{#B$E$${EVLP2{LOOP BACK TO REEVALUATE EXPRESSION
15123: *
15124: * HERE TO RESTORE PATTERN VALUES AFTER SUCCESSFUL EVAL
15125: *
15126: {{MOV{R9{R10{{COPY RESULT POINTER
15127: {{MOV{(SP)+{PMHBS{{RESTORE HISTORY STACK BASE POINTER
15128: {{MOV{(SP)+{PMDFL{{RESTORE DOT FLAG
15129: {{MOV{(SP)+{PMSSL{{RESTORE SUBJECT STRING LENGTH
15130: {{MOV{(SP)+{R$PMS{{RESTORE SUBJECT STRING POINTER
15131: {{MOV{(SP)+{R7{{RESTORE CURSOR
15132: {{MOV{(SP)+{R9{{RESTORE NODE POINTER
15133: *
15134: * COMMON EXIT POINT
15135: *
15136: {EVLP3{EXI{{{{RETURN TO EVALP CALLER
15137: *
15138: * HERE FOR FAILURE DURING EVALUATION
15139: *
15140: {EVLP4{MOV{(SP)+{PMHBS{{RESTORE HISTORY STACK BASE POINTER
15141: {{MOV{(SP)+{PMDFL{{RESTORE DOT FLAG
15142: {{MOV{(SP)+{PMSSL{{RESTORE SUBJECT STRING LENGTH
15143: {{MOV{(SP)+{R$PMS{{RESTORE SUBJECT STRING POINTER
15144: {{ADD{#4*NUM02{SP{{REMOVE NODE PTR, CURSOR
15145: {{EXI{1{{{TAKE FAILURE EXIT
15146: {{ENP{{{{END PROCEDURE EVALP
15147: {{EJC{{{{
15148: *
15149: * EVALS -- EVALUATE STRING ARGUMENT
15150: *
15151: * EVALS IS USED BY SPAN, ANY, NOTANY, BREAK, BREAKX WHEN
15152: * THEY ARE PASSED AN EXPRESSION ARGUMENT.
15153: *
15154: * (XR) NODE POINTER
15155: * (WB) CURSOR
15156: * JSR EVALS CALL TO EVALUATE STRING
15157: * PPM LOC TRANSFER LOC FOR NON-STRING ARG
15158: * PPM LOC TRANSFER LOC FOR EVALUATION FAILURE
15159: * PPM LOC TRANSFER LOC FOR SUCCESSFUL EVAL
15160: * (THE NORMAL RETURN IS NEVER TAKEN)
15161: * (XR) PTR TO NODE WITH PARMS SET
15162: * (XL,WC,RA) DESTROYED
15163: *
15164: * ON RETURN, THE NODE POINTED TO HAS A CHARACTER TABLE
15165: * POINTER IN PARM1 AND A BIT MASK IN PARM2. THE PROPER
15166: * SUCCESSOR IS STORED IN PTHEN OF THIS NODE. THUS IT IS
15167: * OK FOR MERGING WITH THE NORMAL (MULTI-CHAR STRING) CASE.
15168: *
15169: {EVALS{PRC{R{3{{ENTRY POINT (RECURSIVE)
15170: {{JSR{EVALP{{{EVALUATE EXPRESSION
15171: {{PPM{EVLS1{{{JUMP IF EVALUATION FAILS
15172: {{MOV{4*PTHEN(R9){-(SP){{SAVE SUCCESSOR POINTER
15173: {{MOV{R7{-(SP){{SAVE CURSOR
15174: {{MOV{R10{-(SP){{STACK RESULT PTR FOR PATST
15175: {{ZER{R7{{{DUMMY PCODE FOR ONE CHAR STRING
15176: {{ZER{R8{{{DUMMY PCODE FOR EXPRESSION ARG
15177: {{MOV{#P$BRK{R10{{APPROPRIATE PCODE FOR OUR USE
15178: {{JSR{PATST{{{CALL ROUTINE TO BUILD NODE
15179: {{PPM{EVLS2{{{JUMP IF NOT STRING
15180: {{MOV{(SP)+{R7{{RESTORE CURSOR
15181: {{MOV{(SP)+{4*PTHEN(R9){{STORE SUCCESSOR POINTER
15182: {{EXI{3{{{TAKE SUCCESS RETURN
15183: *
15184: * HERE IF EVALUATION FAILS
15185: *
15186: {EVLS1{EXI{2{{{TAKE FAILURE RETURN
15187: *
15188: * HERE IF ARGUMENT IS NOT STRING
15189: *
15190: {EVLS2{ADD{#4*NUM02{SP{{POP SUCCESSOR AND CURSOR
15191: {{EXI{1{{{TAKE NON-STRING ERROR EXIT
15192: {{ENP{{{{END PROCEDURE EVALS
15193: {{EJC{{{{
15194: *
15195: * EVALX -- EVALUATE EXPRESSION
15196: *
15197: * EVALX IS CALLED TO EVALUATE AN EXPRESSION
15198: *
15199: * (XR) POINTER TO EXBLK OR SEBLK
15200: * (WB) 0 IF BY VALUE, 1 IF BY NAME
15201: * JSR EVALX CALL TO EVALUATE EXPRESSION
15202: * PPM LOC TRANSFER LOC IF EVALUATION FAILS
15203: * (XR) RESULT IF CALLED BY VALUE
15204: * (XL,WA) RESULT NAME BASE,OFFSET IF BY NAME
15205: * (XR) DESTROYED (NAME CASE ONLY)
15206: * (XL,WA) DESTROYED (VALUE CASE ONLY)
15207: * (WB,WC,RA) DESTROYED
15208: *
15209: {EVALX{PRC{R{1{{ENTRY POINT, RECURSIVE
15210: {{BEQ{(R9){#B$EXL{EVLX2{JUMP IF EXBLK CASE
15211: *
15212: * HERE FOR SEBLK
15213: *
15214: {{MOV{4*SEVAR(R9){R10{{LOAD VRBLK POINTER (NAME BASE)
15215: {{MOV{#4*VRVAL{R6{{SET NAME OFFSET
15216: {{BNZ{R7{EVLX1{{JUMP IF CALLED BY NAME
15217: {{JSR{ACESS{{{CALL ROUTINE TO ACCESS VALUE
15218: {{PPM{EVLX9{{{JUMP IF FAILURE ON ACCESS
15219: *
15220: * MERGE HERE TO EXIT FOR SEBLK CASE
15221: *
15222: {EVLX1{EXI{{{{RETURN TO EVALX CALLER
15223: {{EJC{{{{
15224: *
15225: * EVALX (CONTINUED)
15226: *
15227: * HERE FOR FULL EXPRESSION (EXBLK) CASE
15228: *
15229: * IF AN ERROR OCCURS IN THE EXPRESSION CODE AT EXECUTION
15230: * TIME, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
15231: * WITHOUT RETURNING TO THIS ROUTINE.
15232: * THE FOLLOWING ENTRIES ARE MADE ON THE STACK BEFORE
15233: * GIVING CONTROL TO THE EXPRESSION CODE
15234: *
15235: * EVALX RETURN POINT
15236: * SAVED VALUE OF R$COD
15237: * CODE POINTER (-R$COD)
15238: * SAVED VALUE OF FLPTR
15239: * 0 IF BY VALUE, 1 IF BY NAME
15240: * FLPTR --------------- *EXFLC, FAIL OFFSET IN EXBLK
15241: *
15242: {EVLX2{SCP{R8{{{GET CODE POINTER
15243: {{MOV{R$COD{R6{{LOAD CODE BLOCK POINTER
15244: {{SUB{R6{R8{{GET CODE POINTER AS OFFSET
15245: {{MOV{R6{-(SP){{STACK OLD CODE BLOCK POINTER
15246: {{MOV{R8{-(SP){{STACK RELATIVE CODE OFFSET
15247: {{MOV{FLPTR{-(SP){{STACK OLD FAILURE POINTER
15248: {{MOV{R7{-(SP){{STACK NAME/VALUE INDICATOR
15249: {{MOV{#4*EXFLC{-(SP){{STACK NEW FAIL OFFSET
15250: {{MOV{FLPTR{GTCEF{{KEEP IN CASE OF ERROR
15251: {{MOV{R$COD{R$GTC{{KEEP CODE BLOCK POINTER SIMILARLY
15252: {{MOV{SP{FLPTR{{SET NEW FAILURE POINTER
15253: {{MOV{R9{R$COD{{SET NEW CODE BLOCK POINTER
15254: {{MOV{KVSTN{4*EXSTM(R9){{REMEMBER STMNT NUMBER
15255: {{ADD{#4*EXCOD{R9{{POINT TO FIRST CODE WORD
15256: {{LCP{R9{{{SET CODE POINTER
15257: {{BNE{STAGE{#STGXT{EXITS{JUMP IF NOT EXECUTION TIME
15258: {{MOV{#STGEE{STAGE{{EVALUATING EXPRESSION
15259: {{BRN{EXITS{{{JUMP TO EXECUTE FIRST CODE WORD
15260: {{EJC{{{{
15261: *
15262: * EVALX (CONTINUED)
15263: *
15264: * COME HERE IF SUCCESSFUL RETURN BY VALUE (SEE O$RVL)
15265: *
15266: {EVLX3{MOV{(SP)+{R9{{LOAD VALUE
15267: {{BZE{4*1(SP){EVLX5{{JUMP IF CALLED BY VALUE
15268: {{ERB{249{EXPRESSION{{EVALUATED BY NAME RETURNED VALUE
15269: *
15270: * HERE FOR EXPRESSION RETURNING BY NAME (SEE O$RNM)
15271: *
15272: {EVLX4{MOV{(SP)+{R6{{LOAD NAME OFFSET
15273: {{MOV{(SP)+{R10{{LOAD NAME BASE
15274: {{BNZ{4*1(SP){EVLX5{{JUMP IF CALLED BY NAME
15275: {{JSR{ACESS{{{ELSE ACCESS VALUE FIRST
15276: {{PPM{EVLX6{{{JUMP IF FAILURE DURING ACCESS
15277: *
15278: * HERE AFTER LOADING CORRECT RESULT INTO XR OR XL,WA
15279: *
15280: {EVLX5{ZER{R7{{{NOTE SUCCESSFUL
15281: {{BRN{EVLX7{{{MERGE
15282: *
15283: * HERE FOR FAILURE IN EXPRESSION EVALUATION (SEE O$FEX)
15284: *
15285: {EVLX6{MNZ{R7{{{NOTE UNSUCCESSFUL
15286: *
15287: * RESTORE ENVIRONMENT
15288: *
15289: {EVLX7{BNE{STAGE{#STGEE{EVLX8{SKIP IF WAS NOT PREVIOUSLY XT
15290: {{MOV{#STGXT{STAGE{{EXECUTE TIME
15291: *
15292: * MERGE WITH STAGE SET UP
15293: *
15294: {EVLX8{ADD{#4*NUM02{SP{{POP NAME/VALUE INDICATOR, *EXFAL
15295: {{MOV{(SP)+{FLPTR{{RESTORE OLD FAILURE POINTER
15296: {{MOV{(SP)+{R8{{LOAD CODE OFFSET
15297: {{ADD{(SP){R8{{MAKE CODE POINTER ABSOLUTE
15298: {{MOV{(SP)+{R$COD{{RESTORE OLD CODE BLOCK POINTER
15299: {{LCP{R8{{{RESTORE OLD CODE POINTER
15300: {{BZE{R7{EVLX1{{JUMP FOR SUCCESSFUL RETURN
15301: *
15302: * MERGE HERE FOR FAILURE IN SEBLK CASE
15303: *
15304: {EVLX9{EXI{1{{{TAKE FAILURE EXIT
15305: {{ENP{{{{END OF PROCEDURE EVALX
15306: {{EJC{{{{
15307: *
15308: * EXBLD -- BUILD EXBLK
15309: *
15310: * EXBLD IS USED TO BUILD AN EXPRESSION BLOCK FROM THE
15311: * CODE COMPILED MOST RECENTLY IN THE CURRENT CCBLK.
15312: *
15313: * (XL) OFFSET IN CCBLK TO START OF CODE
15314: * (WB) INTEGER IN RANGE 0 LE N LE MXLEN
15315: * JSR EXBLD CALL TO BUILD EXBLK
15316: * (XR) PTR TO CONSTRUCTED EXBLK
15317: * (WA,WB,XL) DESTROYED
15318: *
15319: {EXBLD{PRC{E{0{{ENTRY POINT
15320: {{MOV{R10{R6{{COPY OFFSET TO START OF CODE
15321: {{SUB{#4*EXCOD{R6{{CALC REDUCTION IN OFFSET IN EXBLK
15322: {{MOV{R6{-(SP){{STACK FOR LATER
15323: {{MOV{CWCOF{R6{{LOAD FINAL OFFSET
15324: {{SUB{R10{R6{{COMPUTE LENGTH OF CODE
15325: {{ADD{#4*EXSI${R6{{ADD SPACE FOR STANDARD FIELDS
15326: {{JSR{ALLOC{{{ALLOCATE SPACE FOR EXBLK
15327: {{MOV{R9{-(SP){{SAVE POINTER TO EXBLK
15328: {{MOV{#B$EXL{4*EXTYP(R9){{STORE TYPE WORD
15329: {{ZER{4*EXSTM(R9){{{ZEROISE STMNT NUMBER FIELD
15330: {{MOV{R6{4*EXLEN(R9){{STORE LENGTH
15331: {{MOV{#OFEX${4*EXFLC(R9){{STORE FAILURE WORD
15332: {{ADD{#4*EXSI${R9{{SET XR FOR SYSMW
15333: {{MOV{R10{CWCOF{{RESET OFFSET TO START OF CODE
15334: {{ADD{R$CCB{R10{{POINT TO START OF CODE
15335: {{SUB{#4*EXSI${R6{{LENGTH OF CODE TO MOVE
15336: {{MOV{R6{-(SP){{STACK LENGTH OF CODE
15337: {{MVW{{{{MOVE CODE TO EXBLK
15338: {{MOV{(SP)+{R6{{GET LENGTH OF CODE
15339: {{BTW{R6{{{CONVERT BYTE COUNT TO WORD COUNT
15340: {{LCT{R6{R6{{PREPARE COUNTER FOR LOOP
15341: {{MOV{(SP){R10{{COPY EXBLK PTR, DONT UNSTACK
15342: {{ADD{#4*EXCOD{R10{{POINT TO CODE ITSELF
15343: {{MOV{4*1(SP){R7{{GET REDUCTION IN OFFSET
15344: *
15345: * THIS LOOP SEARCHES FOR NEGATION AND SELECTION CODE SO
15346: * THAT THE OFFSETS COMPUTED WHILST CODE WAS IN CODE BLOCK
15347: * CAN BE TRANSFORMED TO REDUCED VALUES APPLICABLE IN AN
15348: * EXBLK.
15349: *
15350: {EXBL1{MOV{(R10)+{R9{{GET NEXT CODE WORD
15351: {{BEQ{R9{#OSLA${EXBL3{JUMP IF SELECTION FOUND
15352: {{BEQ{R9{#ONTA${EXBL3{JUMP IF NEGATION FOUND
15353: {{BCT{R6{EXBL1{{LOOP TO END OF CODE
15354: *
15355: * NO SELECTION FOUND OR MERGE TO EXIT ON TERMINATION
15356: *
15357: {EXBL2{MOV{(SP)+{R9{{POP EXBLK PTR INTO XR
15358: {{MOV{(SP)+{R10{{POP REDUCTION CONSTANT
15359: {{EXI{{{{RETURN TO CALLER
15360: {{EJC{{{{
15361: *
15362: * EXBLD (CONTINUED)
15363: *
15364: * SELECTION OR NEGATION FOUND
15365: * REDUCE THE OFFSETS AS NEEDED. OFFSETS OCCUR IN WORDS
15366: * FOLLOWING CODE WORDS -
15367: * =ONTA$, =OSLA$, =OSLB$, =OSLC$
15368: *
15369: {EXBL3{SUB{R7{(R10)+{{ADJUST OFFSET
15370: {{BCT{R6{EXBL4{{DECREMENT COUNT
15371: *
15372: {EXBL4{BCT{R6{EXBL5{{DECREMENT COUNT
15373: *
15374: * CONTINUE SEARCH FOR MORE OFFSETS
15375: *
15376: {EXBL5{MOV{(R10)+{R9{{GET NEXT CODE WORD
15377: {{BEQ{R9{#OSLA${EXBL3{JUMP IF OFFSET FOUND
15378: {{BEQ{R9{#OSLB${EXBL3{JUMP IF OFFSET FOUND
15379: {{BEQ{R9{#OSLC${EXBL3{JUMP IF OFFSET FOUND
15380: {{BEQ{R9{#ONTA${EXBL3{JUMP IF OFFSET FOUND
15381: {{BCT{R6{EXBL5{{LOOP
15382: {{BRN{EXBL2{{{MERGE TO RETURN
15383: {{ENP{{{{END PROCEDURE EXBLD
15384: {{EJC{{{{
15385: *
15386: * EXPAN -- ANALYZE EXPRESSION
15387: *
15388: * THE EXPRESSION ANALYZER (EXPAN) PROCEDURE IS USED TO SCAN
15389: * AN EXPRESSION AND CONVERT IT INTO A TREE REPRESENTATION.
15390: * SEE DESCRIPTIONS OF CMBLK, CUBLK, CBBLK IN THE STRUCTURES
15391: * SECTION FOR DETAILED FORMAT OF TREE BLOCKS.
15392: *
15393: * THE ANALYZER USES A SIMPLE PRECEDENCE SCHEME IN WHICH
15394: * OPERANDS AND OPERATORS ARE PLACED ON A SINGLE STACK
15395: * AND CONDENSATIONS ARE MADE WHEN LOW PRECEDENCE OPERATORS
15396: * ARE STACKED AFTER A HIGHER PRECEDENCE OPERATOR. A GLOBAL
15397: * VARIABLE (IN WB) KEEPS TRACK OF THE LEVEL AS FOLLOWS.
15398: *
15399: * 0 SCANNING OUTER LEVEL OF STATEMENT OR EXPRESSION
15400: * 1 SCANNING OUTER LEVEL OF NORMAL GOTO
15401: * 2 SCANNING OUTER LEVEL OF DIRECT GOTO
15402: * 3 SCANNING INSIDE ARRAY BRACKETS
15403: * 4 SCANNING INSIDE GROUPING PARENTHESES
15404: * 5 SCANNING INSIDE FUNCTION PARENTHESES
15405: *
15406: * THIS VARIABLE IS SAVED ON THE STACK ON ENCOUNTERING A
15407: * GROUPING AND RESTORED AT THE END OF THE GROUPING.
15408: *
15409: * ANOTHER GLOBAL VARIABLE (IN WC) COUNTS THE NUMBER OF
15410: * ITEMS AT ONE GROUPING LEVEL AND IS INCREMENTED FOR EACH
15411: * COMMA ENCOUNTERED. IT IS STACKED WITH THE LEVEL INDICATOR
15412: *
15413: * THE SCAN IS CONTROLLED BY A THREE STATE FINITE MACHINE.
15414: * A GLOBAL VARIABLE STORED IN WA IS THE CURRENT STATE.
15415: *
15416: * WA=0 NOTHING SCANNED AT THIS LEVEL
15417: * WA=1 OPERAND EXPECTED
15418: * WA=2 OPERATOR EXPECTED
15419: *
15420: * (WB) CALL TYPE (SEE BELOW)
15421: * JSR EXPAN CALL TO ANALYZE EXPRESSION
15422: * (XR) POINTER TO RESULTING TREE
15423: * (XL,WA,WB,WC,RA) DESTROYED
15424: *
15425: * THE ENTRY VALUE OF WB INDICATES THE CALL TYPE AS FOLLOWS.
15426: *
15427: * 0 SCANNING EITHER THE MAIN BODY OF A STATEMENT OR THE
15428: * TEXT OF AN EXPRESSION (FROM EVAL CALL). VALID
15429: * TERMINATORS ARE COLON, SEMICOLON. THE RESCAN FLAG IS
15430: * SET TO RETURN THE TERMINATOR ON THE NEXT SCANE CALL.
15431: *
15432: * 1 SCANNING A NORMAL GOTO. THE ONLY VALID
15433: * TERMINATOR IS A RIGHT PAREN.
15434: *
15435: * 2 SCANNING A DIRECT GOTO. THE ONLY VALID
15436: * TERMINATOR IS A RIGHT BRACKET.
15437: {{EJC{{{{
15438: *
15439: * EXPAN (CONTINUED)
15440: *
15441: * ENTRY POINT
15442: *
15443: {EXPAN{PRC{E{0{{ENTRY POINT
15444: {{ZER{-(SP){{{SET TOP OF STACK INDICATOR
15445: {{ZER{R6{{{SET INITIAL STATE TO ZERO
15446: {{ZER{R8{{{ZERO COUNTER VALUE
15447: *
15448: * LOOP HERE FOR SUCCESSIVE ENTRIES
15449: *
15450: {EXP01{JSR{SCANE{{{SCAN NEXT ELEMENT
15451: {{ADD{R6{R10{{ADD STATE TO SYNTAX CODE
15452: {{BSW{R10{T$NES{{SWITCH ON ELEMENT TYPE/STATE
15453: {{IFF{T$UO0{EXP27{{UNOP, S=0
15454: {{IFF{T$UO1{EXP27{{UNOP, S=1
15455: {{IFF{T$UO2{EXP04{{UNOP, S=2
15456: {{IFF{T$LP0{EXP06{{LEFT PAREN, S=0
15457: {{IFF{T$LP1{EXP06{{LEFT PAREN, S=1
15458: {{IFF{T$LP2{EXP04{{LEFT PAREN, S=2
15459: {{IFF{T$LB0{EXP08{{LEFT BRKT, S=0
15460: {{IFF{T$LB1{EXP08{{LEFT BRKT, S=1
15461: {{IFF{T$LB2{EXP09{{LEFT BRKT, S=2
15462: {{IFF{T$CM0{EXP02{{COMMA, S=0
15463: {{IFF{T$CM1{EXP05{{COMMA, S=1
15464: {{IFF{T$CM2{EXP11{{COMMA, S=2
15465: {{IFF{T$FN0{EXP10{{FUNCTION, S=0
15466: {{IFF{T$FN1{EXP10{{FUNCTION, S=1
15467: {{IFF{T$FN2{EXP04{{FUNCTION, S=2
15468: {{IFF{T$VA0{EXP03{{VARIABLE, S=0
15469: {{IFF{T$VA1{EXP03{{VARIABLE, STATE ONE
15470: {{IFF{T$VA2{EXP04{{VARIABLE, S=2
15471: {{IFF{T$CO0{EXP03{{CONSTANT, S=0
15472: {{IFF{T$CO1{EXP03{{CONSTANT, S=1
15473: {{IFF{T$CO2{EXP04{{CONSTANT, S=2
15474: {{IFF{T$BO0{EXP05{{BINOP, S=0
15475: {{IFF{T$BO1{EXP05{{BINOP, S=1
15476: {{IFF{T$BO2{EXP26{{BINOP, S=2
15477: {{IFF{T$RP0{EXP02{{RIGHT PAREN, S=0
15478: {{IFF{T$RP1{EXP05{{RIGHT PAREN, S=1
15479: {{IFF{T$RP2{EXP12{{RIGHT PAREN, S=2
15480: {{IFF{T$RB0{EXP02{{RIGHT BRKT, S=0
15481: {{IFF{T$RB1{EXP05{{RIGHT BRKT, S=1
15482: {{IFF{T$RB2{EXP18{{RIGHT BRKT, S=2
15483: {{IFF{T$CL0{EXP02{{COLON, S=0
15484: {{IFF{T$CL1{EXP05{{COLON, S=1
15485: {{IFF{T$CL2{EXP19{{COLON, S=2
15486: {{IFF{T$SM0{EXP02{{SEMICOLON, S=0
15487: {{IFF{T$SM1{EXP05{{SEMICOLON, S=1
15488: {{IFF{T$SM2{EXP19{{SEMICOLON, S=2
15489: {{ESW{{{{END SWITCH ON ELEMENT TYPE/STATE
15490: {{EJC{{{{
15491: *
15492: * EXPAN (CONTINUED)
15493: *
15494: * HERE FOR RBR,RPR,COL,SMC,CMA IN STATE 0
15495: *
15496: * SET TO RESCAN THE TERMINATOR ENCOUNTERED AND CREATE
15497: * A NULL CONSTANT (CASE OF OMITTED NULL)
15498: *
15499: {EXP02{MNZ{SCNRS{{{SET TO RESCAN ELEMENT
15500: {{MOV{#NULLS{R9{{POINT TO NULL, MERGE
15501: *
15502: * HERE FOR VAR OR CON IN STATES 0,1
15503: *
15504: * STACK THE VARIABLE/CONSTANT AND SET STATE=2
15505: *
15506: {EXP03{MOV{R9{-(SP){{STACK POINTER TO OPERAND
15507: {{MOV{#NUM02{R6{{SET STATE 2
15508: {{BRN{EXP01{{{JUMP FOR NEXT ELEMENT
15509: *
15510: * HERE FOR VAR,CON,LPR,FNC,UOP IN STATE 2
15511: *
15512: * WE RESCAN THE ELEMENT AND CREATE A CONCATENATION OPERATOR
15513: * THIS IS THE CASE OF THE BLANK CONCATENATION OPERATOR.
15514: *
15515: {EXP04{MNZ{SCNRS{{{SET TO RESCAN ELEMENT
15516: {{MOV{#OPDVC{R9{{POINT TO CONCAT OPERATOR DV
15517: {{BZE{R7{EXP4A{{OK IF AT TOP LEVEL
15518: {{MOV{#OPDVP{R9{{ELSE POINT TO UNMISTAKABLE CONCAT.
15519: *
15520: * MERGE HERE WHEN XR SET UP WITH PROPER CONCATENATION DVBLK
15521: *
15522: {EXP4A{BNZ{SCNBL{EXP26{{MERGE BOP IF BLANKS, ELSE ERROR
15523: {{DCV{SCNSE{{{ADJUST START OF ELEMENT LOCATION
15524: {{ERB{220{SYNTAX{{ERROR. MISSING OPERATOR
15525: *
15526: * HERE FOR CMA,RPR,RBR,COL,SMC,BOP(S=1) BOP(S=0)
15527: *
15528: * THIS IS AN ERRONOUS CONTRUCTION
15529: *
15530: {EXP05{DCV{SCNSE{{{ADJUST START OF ELEMENT LOCATION
15531: {{ERB{221{SYNTAX{{ERROR. MISSING OPERAND
15532: *
15533: * HERE FOR LPR (S=0,1)
15534: *
15535: {EXP06{MOV{#NUM04{R10{{SET NEW LEVEL INDICATOR
15536: {{ZER{R9{{{SET ZERO VALUE FOR CMOPN
15537: {{EJC{{{{
15538: *
15539: * EXPAN (CONTINUED)
15540: *
15541: * MERGE HERE TO STORE OLD LEVEL ON STACK AND START NEW ONE
15542: *
15543: {EXP07{MOV{R9{-(SP){{STACK CMOPN VALUE
15544: {{MOV{R8{-(SP){{STACK OLD COUNTER
15545: {{MOV{R7{-(SP){{STACK OLD LEVEL INDICATOR
15546: {{CHK{{{{CHECK FOR STACK OVERFLOW
15547: {{ZER{R6{{{SET NEW STATE TO ZERO
15548: {{MOV{R10{R7{{SET NEW LEVEL INDICATOR
15549: {{MOV{#NUM01{R8{{INITIALIZE NEW COUNTER
15550: {{BRN{EXP01{{{JUMP TO SCAN NEXT ELEMENT
15551: *
15552: * HERE FOR LBR (S=0,1)
15553: *
15554: * THIS IS AN ILLEGAL USE OF LEFT BRACKET
15555: *
15556: {EXP08{ERB{222{SYNTAX{{ERROR. INVALID USE OF LEFT BRACKET
15557: *
15558: * HERE FOR LBR (S=2)
15559: *
15560: * SET NEW LEVEL AND START TO SCAN SUBSCRIPTS
15561: *
15562: {EXP09{MOV{(SP)+{R9{{LOAD ARRAY PTR FOR CMOPN
15563: {{MOV{#NUM03{R10{{SET NEW LEVEL INDICATOR
15564: {{BRN{EXP07{{{JUMP TO STACK OLD AND START NEW
15565: *
15566: * HERE FOR FNC (S=0,1)
15567: *
15568: * STACK OLD LEVEL AND START TO SCAN ARGUMENTS
15569: *
15570: {EXP10{MOV{#NUM05{R10{{SET NEW LEV INDIC (XR=VRBLK=CMOPN)
15571: {{BRN{EXP07{{{JUMP TO STACK OLD AND START NEW
15572: *
15573: * HERE FOR CMA (S=2)
15574: *
15575: * INCREMENT ARGUMENT COUNT AND CONTINUE
15576: *
15577: {EXP11{ICV{R8{{{INCREMENT COUNTER
15578: {{JSR{EXPDM{{{DUMP OPERATORS AT THIS LEVEL
15579: {{ZER{-(SP){{{SET NEW LEVEL FOR PARAMETER
15580: {{ZER{R6{{{SET NEW STATE
15581: {{BGT{R7{#NUM02{EXP01{LOOP BACK UNLESS OUTER LEVEL
15582: {{ERB{223{SYNTAX{{ERROR. INVALID USE OF COMMA
15583: {{EJC{{{{
15584: *
15585: * EXPAN (CONTINUED)
15586: *
15587: * HERE FOR RPR (S=2)
15588: *
15589: * AT OUTER LEVEL IN A NORMAL GOTO THIS IS A TERMINATOR
15590: * OTHERWISE IT MUST TERMINATE A FUNCTION OR GROUPING
15591: *
15592: {EXP12{BEQ{R7{#NUM01{EXP20{END OF NORMAL GOTO
15593: {{BEQ{R7{#NUM05{EXP13{END OF FUNCTION ARGUMENTS
15594: {{BEQ{R7{#NUM04{EXP14{END OF GROUPING / SELECTION
15595: {{ERB{224{SYNTAX{{ERROR. UNBALANCED RIGHT PARENTHESIS
15596: *
15597: * HERE AT END OF FUNCTION ARGUMENTS
15598: *
15599: {EXP13{MOV{#C$FNC{R10{{SET CMTYP VALUE FOR FUNCTION
15600: {{BRN{EXP15{{{JUMP TO BUILD CMBLK
15601: *
15602: * HERE FOR END OF GROUPING
15603: *
15604: {EXP14{BEQ{R8{#NUM01{EXP17{JUMP IF END OF GROUPING
15605: {{MOV{#C$SEL{R10{{ELSE SET CMTYP FOR SELECTION
15606: *
15607: * MERGE HERE TO BUILD CMBLK FOR LEVEL JUST SCANNED AND
15608: * TO POP UP TO THE PREVIOUS SCAN LEVEL BEFORE CONTINUING.
15609: *
15610: {EXP15{JSR{EXPDM{{{DUMP OPERATORS AT THIS LEVEL
15611: {{MOV{R8{R6{{COPY COUNT
15612: {{ADD{#CMVLS{R6{{ADD FOR STANDARD FIELDS AT START
15613: {{WTB{R6{{{CONVERT LENGTH TO BYTES
15614: {{JSR{ALLOC{{{ALLOCATE SPACE FOR CMBLK
15615: {{MOV{#B$CMT{(R9){{STORE TYPE CODE FOR CMBLK
15616: {{MOV{R10{4*CMTYP(R9){{STORE CMBLK NODE TYPE INDICATOR
15617: {{MOV{R6{4*CMLEN(R9){{STORE LENGTH
15618: {{ADD{R6{R9{{POINT PAST END OF BLOCK
15619: {{LCT{R8{R8{{SET LOOP COUNTER
15620: *
15621: * LOOP TO MOVE REMAINING WORDS TO CMBLK
15622: *
15623: {EXP16{MOV{(SP)+{-(R9){{MOVE ONE OPERAND PTR FROM STACK
15624: {{MOV{(SP)+{R7{{POP TO OLD LEVEL INDICATOR
15625: {{BCT{R8{EXP16{{LOOP TILL ALL MOVED
15626: {{EJC{{{{
15627: *
15628: * EXPAN (CONTINUED)
15629: *
15630: * COMPLETE CMBLK AND STACK POINTER TO IT ON STACK
15631: *
15632: {{SUB{#4*CMVLS{R9{{POINT BACK TO START OF BLOCK
15633: {{MOV{(SP)+{R8{{RESTORE OLD COUNTER
15634: {{MOV{(SP){4*CMOPN(R9){{STORE OPERAND PTR IN CMBLK
15635: {{MOV{R9{(SP){{STACK CMBLK POINTER
15636: {{MOV{#NUM02{R6{{SET NEW STATE
15637: {{BRN{EXP01{{{BACK FOR NEXT ELEMENT
15638: *
15639: * HERE AT END OF A PARENTHESIZED EXPRESSION
15640: *
15641: {EXP17{JSR{EXPDM{{{DUMP OPERATORS AT THIS LEVEL
15642: {{MOV{(SP)+{R9{{RESTORE XR
15643: {{MOV{(SP)+{R7{{RESTORE OUTER LEVEL
15644: {{MOV{(SP)+{R8{{RESTORE OUTER COUNT
15645: {{MOV{R9{(SP){{STORE OPND OVER UNUSED CMOPN VAL
15646: {{MOV{#NUM02{R6{{SET NEW STATE
15647: {{BRN{EXP01{{{BACK FOR NEXT ELE8ENT
15648: *
15649: * HERE FOR RBR (S=2)
15650: *
15651: * AT OUTER LEVEL IN A DIRECT GOTO, THIS IS A TERMINATOR.
15652: * OTHERWISE IT MUST TERMINATE A SUBSCRIPT LIST.
15653: *
15654: {EXP18{MOV{#C$ARR{R10{{SET CMTYP FOR ARRAY REFERENCE
15655: {{BEQ{R7{#NUM03{EXP15{JUMP TO BUILD CMBLK IF END ARRAYREF
15656: {{BEQ{R7{#NUM02{EXP20{JUMP IF END OF DIRECT GOTO
15657: {{ERB{225{SYNTAX{{ERROR. UNBALANCED RIGHT BRACKET
15658: {{EJC{{{{
15659: *
15660: * EXPAN (CONTINUED)
15661: *
15662: * HERE FOR COL,SMC (S=2)
15663: *
15664: * ERROR UNLESS TERMINATING STATEMENT BODY AT OUTER LEVEL
15665: *
15666: {EXP19{MNZ{SCNRS{{{RESCAN TERMINATOR
15667: {{MOV{R7{R10{{COPY LEVEL INDICATOR
15668: {{BSW{R10{6{{SWITCH ON LEVEL INDICATOR
15669: {{IFF{0{EXP20{{NORMAL OUTER LEVEL
15670: {{IFF{1{EXP22{{FAIL IF NORMAL GOTO
15671: {{IFF{2{EXP23{{FAIL IF DIRECT GOTO
15672: {{IFF{3{EXP24{{FAIL ARRAY BRACKETS
15673: {{IFF{4{EXP21{{FAIL IF IN GROUPING
15674: {{IFF{5{EXP21{{FAIL FUNCTION ARGS
15675: {{ESW{{{{END SWITCH ON LEVEL
15676: *
15677: * HERE AT NORMAL END OF EXPRESSION
15678: *
15679: {EXP20{JSR{EXPDM{{{DUMP REMAINING OPERATORS
15680: {{MOV{(SP)+{R9{{LOAD TREE POINTER
15681: {{ICA{SP{{{POP OFF BOTTOM OF STACK MARKER
15682: {{EXI{{{{RETURN TO EXPAN CALLER
15683: *
15684: * MISSING RIGHT PAREN
15685: *
15686: {EXP21{ERB{226{SYNTAX{{ERROR. MISSING RIGHT PAREN
15687: *
15688: * MISSING RIGHT PAREN IN GOTO FIELD
15689: *
15690: {EXP22{ERB{227{SYNTAX{{ERROR. RIGHT PAREN MISSING FROM GOTO
15691: *
15692: * MISSING BRACKET IN GOTO
15693: *
15694: {EXP23{ERB{228{SYNTAX{{ERROR. RIGHT BRACKET MISSING FROM GOTO
15695: *
15696: * MISSING ARRAY BRACKET
15697: *
15698: {EXP24{ERB{229{SYNTAX{{ERROR. MISSING RIGHT ARRAY BRACKET
15699: {{EJC{{{{
15700: *
15701: * EXPAN (CONTINUED)
15702: *
15703: * LOOP HERE WHEN AN OPERATOR CAUSES AN OPERATOR DUMP
15704: *
15705: {EXP25{MOV{R9{EXPSV{{
15706: {{JSR{EXPOP{{{POP ONE OPERATOR
15707: {{MOV{EXPSV{R9{{RESTORE OP DV POINTER AND MERGE
15708: *
15709: * HERE FOR BOP (S=2)
15710: *
15711: * REMOVE OPERATORS (CONDENSE) FROM STACK UNTIL NO MORE
15712: * LEFT AT THIS LEVEL OR TOP ONE HAS LOWER PRECEDENCE.
15713: * LOOP HERE TILL THIS CONDITION IS MET.
15714: *
15715: {EXP26{MOV{4*1(SP){R10{{LOAD OPERATOR DVPTR FROM STACK
15716: {{BLE{R10{#NUM05{EXP27{JUMP IF BOTTOM OF STACK LEVEL
15717: {{BLT{4*DVRPR(R9){4*DVLPR(R10){EXP25{ELSE POP IF NEW PREC IS LO
15718: *
15719: * HERE FOR UOP (S=0,1)
15720: *
15721: * BINARY OPERATOR MERGES AFTER PRECEDENCE CHECK
15722: *
15723: * THE OPERATOR DV IS STORED ON THE STACK AND THE SCAN
15724: * CONTINUES AFTER SETTING THE SCAN STATE TO ONE.
15725: *
15726: {EXP27{MOV{R9{-(SP){{STACK OPERATOR DVPTR ON STACK
15727: {{CHK{{{{CHECK FOR STACK OVERFLOW
15728: {{MOV{#NUM01{R6{{SET NEW STATE
15729: {{BNE{R9{#OPDVS{EXP01{BACK FOR NEXT ELEMENT UNLESS =
15730: *
15731: * HERE FOR SPECIAL CASE OF BINARY =. THE SYNTAX ALLOWS A
15732: * NULL RIGHT ARGUMENT FOR THIS OPERATOR TO BE LEFT
15733: * OUT. ACCORDINGLY WE RESET TO STATE ZERO TO GET PROPER
15734: * ACTION ON A TERMINATOR (SUPPLY A NULL CONSTANT).
15735: *
15736: {{ZER{R6{{{SET STATE ZERO
15737: {{BRN{EXP01{{{JUMP FOR NEXT ELEMENT
15738: {{ENP{{{{END PROCEDURE EXPAN
15739: {{EJC{{{{
15740: *
15741: * EXPAP -- TEST FOR PATTERN MATCH TREE
15742: *
15743: * EXPAP IS PASSED AN EXPRESSION TREE TO DETERMINE IF IT
15744: * IS A PATTERN MATCH. THE FOLLOWING ARE RECOGIZED AS
15745: * MATCHES IN THE CONTEXT OF THIS CALL.
15746: *
15747: * 1) AN EXPLICIT USE OF BINARY QUESTION MARK
15748: * 2) A CONCATENATION
15749: * 3) AN ALTERNATION WHOSE LEFT OPERAND IS A CONCATENATION
15750: *
15751: * (XR) PTR TO EXPAN TREE
15752: * JSR EXPAP CALL TO TEST FOR PATTERN MATCH
15753: * PPM LOC TRANSFER LOC IF NOT A PATTERN MATCH
15754: * (WA) DESTROYED
15755: * (XR) UNCHANGED (IF NOT MATCH)
15756: * (XR) PTR TO BINARY OPERATOR BLK IF MATCH
15757: *
15758: {EXPAP{PRC{E{1{{ENTRY POINT
15759: {{MOV{R10{-(SP){{SAVE XL
15760: {{BNE{(R9){#B$CMT{EXPP2{NO MATCH IF NOT COMPLEX
15761: {{MOV{4*CMTYP(R9){R6{{ELSE LOAD TYPE CODE
15762: {{BEQ{R6{#C$CNC{EXPP1{CONCATENATION IS A MATCH
15763: {{BEQ{R6{#C$PMT{EXPP1{BINARY QUESTION MARK IS A MATCH
15764: {{BNE{R6{#C$ALT{EXPP2{ELSE NOT MATCH UNLESS ALTERNATION
15765: *
15766: * HERE FOR ALTERNATION. CHANGE (A B) / C TO A QM (B / C)
15767: *
15768: {{MOV{4*CMLOP(R9){R10{{LOAD LEFT OPERAND POINTER
15769: {{BNE{(R10){#B$CMT{EXPP2{NOT MATCH IF LEFT OPND NOT COMPLEX
15770: {{BNE{4*CMTYP(R10){#C$CNC{EXPP2{NOT MATCH IF LEFT OP NOT CONC
15771: {{MOV{4*CMROP(R10){4*CMLOP(R9){{XR POINTS TO (B / C)
15772: {{MOV{R9{4*CMROP(R10){{SET XL OPNDS TO A, (B / C)
15773: {{MOV{R10{R9{{POINT TO THIS ALTERED NODE
15774: *
15775: * EXIT HERE FOR PATTERN MATCH
15776: *
15777: {EXPP1{MOV{(SP)+{R10{{RESTORE ENTRY XL
15778: {{EXI{{{{GIVE PATTERN MATCH RETURN
15779: *
15780: * EXIT HERE IF NOT PATTERN MATCH
15781: *
15782: {EXPP2{MOV{(SP)+{R10{{RESTORE ENTRY XL
15783: {{EXI{1{{{GIVE NON-MATCH RETURN
15784: {{ENP{{{{END PROCEDURE EXPAP
15785: {{EJC{{{{
15786: *
15787: * EXPDM -- DUMP OPERATORS AT CURRENT LEVEL (FOR EXPAN)
15788: *
15789: * EXPDM USES EXPOP TO CONDENSE ALL OPERATORS AT THIS SYNTAX
15790: * LEVEL. THE STACK BOTTOM IS RECOGNIZED FROM THE LEVEL
15791: * VALUE WHICH IS SAVED ON THE TOP OF THE STACK.
15792: *
15793: * JSR EXPDM CALL TO DUMP OPERATORS
15794: * (XS) POPPED AS REQUIRED
15795: * (XR,WA) DESTROYED
15796: *
15797: {EXPDM{PRC{N{0{{ENTRY POINT
15798: {{MOV{R10{R$EXS{{SAVE XL VALUE
15799: *
15800: * LOOP TO DUMP OPERATORS
15801: *
15802: {EXDM1{BLE{4*1(SP){#NUM05{EXDM2{JUMP IF STACK BOTTOM (SAVED LEVEL
15803: {{JSR{EXPOP{{{ELSE POP ONE OPERATOR
15804: {{BRN{EXDM1{{{AND LOOP BACK
15805: *
15806: * HERE AFTER POPPING ALL OPERATORS
15807: *
15808: {EXDM2{MOV{R$EXS{R10{{RESTORE XL
15809: {{ZER{R$EXS{{{RELEASE SAVE LOCATION
15810: {{EXI{{{{RETURN TO EXPDM CALLER
15811: {{ENP{{{{END PROCEDURE EXPDM
15812: {{EJC{{{{
15813: *
15814: * EXPOP-- POP OPERATOR (FOR EXPAN)
15815: *
15816: * EXPOP IS USED BY THE EXPAN ROUTINE TO CONDENSE ONE
15817: * OPERATOR FROM THE TOP OF THE SYNTAX STACK. AN APPROPRIATE
15818: * CMBLK IS BUILT FOR THE OPERATOR (UNARY OR BINARY) AND A
15819: * POINTER TO THIS CMBLK IS STACKED.
15820: *
15821: * EXPOP IS ALSO USED BY SCNGF (GOTO FIELD SCAN) PROCEDURE
15822: *
15823: * JSR EXPOP CALL TO POP OPERATOR
15824: * (XS) POPPED APPROPRIATELY
15825: * (XR,XL,WA) DESTROYED
15826: *
15827: {EXPOP{PRC{N{0{{ENTRY POINT
15828: {{MOV{4*1(SP){R9{{LOAD OPERATOR DV POINTER
15829: {{BEQ{4*DVLPR(R9){#LLUNO{EXPO2{JUMP IF UNARY
15830: *
15831: * HERE FOR BINARY OPERATOR
15832: *
15833: {{MOV{#4*CMBS${R6{{SET SIZE OF BINARY OPERATOR CMBLK
15834: {{JSR{ALLOC{{{ALLOCATE SPACE FOR CMBLK
15835: {{MOV{(SP)+{4*CMROP(R9){{POP AND STORE RIGHT OPERAND PTR
15836: {{MOV{(SP)+{R10{{POP AND LOAD OPERATOR DV PTR
15837: {{MOV{(SP){4*CMLOP(R9){{STORE LEFT OPERAND POINTER
15838: *
15839: * COMMON EXIT POINT
15840: *
15841: {EXPO1{MOV{#B$CMT{(R9){{STORE TYPE CODE FOR CMBLK
15842: {{MOV{4*DVTYP(R10){4*CMTYP(R9){{STORE CMBLK NODE TYPE CODE
15843: {{MOV{R10{4*CMOPN(R9){{STORE DVPTR (=PTR TO DAC O$XXX)
15844: {{MOV{R6{4*CMLEN(R9){{STORE CMBLK LENGTH
15845: {{MOV{R9{(SP){{STORE RESULTING NODE PTR ON STACK
15846: {{EXI{{{{RETURN TO EXPOP CALLER
15847: *
15848: * HERE FOR UNARY OPERATOR
15849: *
15850: {EXPO2{MOV{#4*CMUS${R6{{SET SIZE OF UNARY OPERATOR CMBLK
15851: {{JSR{ALLOC{{{ALLOCATE SPACE FOR CMBLK
15852: {{MOV{(SP)+{4*CMROP(R9){{POP AND STORE OPERAND POINTER
15853: {{MOV{(SP){R10{{LOAD OPERATOR DV POINTER
15854: {{BRN{EXPO1{{{MERGE BACK TO EXIT
15855: {{ENP{{{{END PROCEDURE EXPOP
15856: {{EJC{{{{
15857: *
15858: * FLSTG -- FOLD STRING TO UPPER CASE
15859: *
15860: * FLSTG FOLDS A CHARACTER STRING CONTAINING LOWER CASE
15861: * CHARACCTERS TO ONE CONTAINING UPPER CASE CHARACTERS.
15862: * FOLDING IS ONLY DONE IF &CASE (KVCAS) IS NOT ZERO.
15863: *
15864: * (XR) STRING ARGUMENT
15865: * (WA) LENGTH OF STRING
15866: * JSR FLSTG CALL TO FOLD STRING
15867: * (XR) RESULT STRING (POSSIBLY ORIGINAL)
15868: * (WC) DESTROYED
15869: *
15870: {FLSTG{PRC{R{0{{ENTRY POINT
15871: {{BZE{KVCAS{FST99{{SKIP IF &CASE IS 0
15872: {{MOV{R10{-(SP){{SAVE XL ACROSS CALL
15873: {{MOV{R9{-(SP){{SAVE ORIGINAL SCBLK PTR
15874: {{JSR{ALOCS{{{ALLOCATE NEW STRING BLOCK
15875: {{MOV{(SP){R10{{POINT TO ORIGINAL SCBLK
15876: {{MOV{R9{-(SP){{SAVE POINTER TO NEW SCBLK
15877: {{PLC{R10{{{POINT TO ORIGINAL CHARS
15878: {{PLC{R9{{{POINT TO NEW CHARS
15879: {{ZER{-(SP){{{INIT DID FOLD FLAG
15880: {{LCT{R8{R8{{LOAD LOOP COUNTER
15881: {FST01{LCH{R6{(R10)+{{LOAD CHARACTER
15882: {{BGT{#CH$$A{R6{FST02{SKIP IF LESS THAN LC A
15883: {{BGT{R6{#CH$$${FST02{SKIP IF GREATER THAN LC Z
15884: {{FLC{R6{{{FOLD CHARACTER TO UPPER CASE
15885: {{MNZ{(SP){{{SET DID FOLD CHARACTER FLAG
15886: {FST02{SCH{R6{(R9)+{{STORE (POSSIBLY FOLDED) CHARACTER
15887: {{BCT{R8{FST01{{LOOP THRU ENTIRE STRING
15888: {{CSC{R9{{{COMPLETE STORE CHARACTERS
15889: {{BNZ{(SP)+{FST10{{SKIP IF FOLDING DONE
15890: {{MOV{(SP)+{DNAMP{{DO NOT NEED NEW SCBLK
15891: {{MOV{(SP)+{R9{{RETURN ORIGINAL SCBLK
15892: {{BRN{FST20{{{MERGE BELOW
15893: {FST10{MOV{(SP)+{R9{{RETURN NEW SCBLK
15894: {{ICA{SP{{{THROW AWAY ORIGINAL SCBLK POINTER
15895: {FST20{MOV{4*SCLEN(R9){R6{{RELOAD STRING LENGTH
15896: {{MOV{(SP)+{R10{{RESTORE XL
15897: {FST99{EXI{{{{RETURN
15898: {{ENP{{{{
15899: {{EJC{{{{
15900: *
15901: * GBCOL -- PERFORM GARBAGE COLLECTION
15902: *
15903: * GBCOL PERFORMS A GARBAGE COLLECTION ON THE DYNAMIC REGION
15904: * ALL BLOCKS WHICH ARE NO LONGER IN USE ARE ELIMINATED
15905: * BY MOVING BLOCKS WHICH ARE IN USE DOWN AND RESETTING
15906: * DNAMP, THE POINTER TO THE NEXT AVAILABLE LOCATION.
15907: *
15908: * (WB) MOVE OFFSET (SEE BELOW)
15909: * JSR GBCOL CALL TO COLLECT GARBAGE
15910: * (XR) DESTROYED
15911: *
15912: * THE FOLLOWING CONDITIONS MUST BE MET AT THE TIME WHEN
15913: * GBCOL IS CALLED.
15914: *
15915: * 1) ALL POINTERS TO BLOCKS IN THE DYNAMIC AREA MUST BE
15916: * ACCESSIBLE TO THE GARBAGE COLLECTOR. THIS MEANS
15917: * THAT THEY MUST OCCUR IN ONE OF THE FOLLOWING.
15918: *
15919: * A) MAIN STACK, WITH CURRENT TOP
15920: * ELEMENT BEING INDICATED BY XS
15921: *
15922: * B) IN RELOCATABLE FIELDS OF VRBLKS.
15923: *
15924: * C) IN REGISTER XL AT THE TIME OF CALL
15925: *
15926: * E) IN THE SPECIAL REGION OF WORKING
15927: * STORAGE WHERE NAMES BEGIN WITH R$.
15928: *
15929: * 2) ALL POINTERS MUST POINT TO THE START OF BLOCKS WITH
15930: * THE SOLE EXCEPTION OF THE CONTENTS OF THE CODE
15931: * POINTER REGISTER WHICH POINTS INTO THE R$COD BLOCK.
15932: *
15933: * 3) NO LOCATION WHICH APPEARS TO CONTAIN A POINTER
15934: * INTO THE DYNAMIC REGION MAY OCCUR UNLESS IT IS IN
15935: * FACT A POINTER TO THE START OF THE BLOCK. HOWEVER
15936: * POINTERS OUTSIDE THIS AREA MAY OCCUR AND WILL
15937: * NOT BE CHANGED BY THE GARBAGE COLLECTOR.
15938: * IT IS ESPECIALLY IMPORTANT TO MAKE SURE THAT XL
15939: * DOES NOT CONTAIN A GARBAGE VALUE FROM SOME PROCESS
15940: * CARRIED OUT BEFORE THE CALL TO THE COLLECTOR.
15941: *
15942: * GBCOL HAS THE CAPABILITY OF MOVING THE FINAL COMPACTED
15943: * RESULT UP IN MEMORY (WITH ADDRESSES ADJUSTED ACCORDINGLY)
15944: * THIS IS USED TO ADD SPACE TO THE STATIC REGION. THE
15945: * ENTRY VALUE OF WB IS THE NUMBER OF BYTES TO MOVE UP.
15946: * THE CALLER MUST GUARANTEE THAT THERE IS ENOUGH ROOM.
15947: * FURTHERMORE THE VALUE IN WB IF IT IS NON-ZERO, MUST BE AT
15948: * LEAST 256 SO THAT THE MWB INSTRUCTION CONDITIONS ARE MET.
15949: {{EJC{{{{
15950: *
15951: * GBCOL (CONTINUED)
15952: *
15953: * THE ALGORITHM, WHICH IS A MODIFICATION OF THE LISP-2
15954: * GARBAGE COLLECTOR DEVISED BY R.DEWAR AND K.BELCHER
15955: * TAKES THREE PASSES AS FOLLOWS.
15956: *
15957: * 1) ALL POINTERS IN MEMORY ARE SCANNED AND BLOCKS IN USE
15958: * DETERMINED FROM THIS SCAN. NOTE THAT THIS PROCEDURE
15959: * IS RECURSIVE AND USES THE MAIN STACK FOR LINKAGE.
15960: * THE MARKING PROCESS IS THUS SIMILAR TO THAT USED IN
15961: * A STANDARD LISP COLLECTOR. HOWEVER THE METHOD OF
15962: * ACTUALLY MARKING THE BLOCKS IS DIFFERENT.
15963: *
15964: * THE FIRST FIELD OF A BLOCK NORMALLY CONTAINS A
15965: * CODE ENTRY POINT POINTER. SUCH AN ENTRY POINTER
15966: * CAN BE DISTINGUISHED FROM THE ADDRESS OF ANY POINTER
15967: * TO BE PROCESSED BY THE COLLECTOR. DURING GARBAGE
15968: * COLLECTION, THIS WORD IS USED TO BUILD A BACK CHAIN
15969: * OF POINTERS THROUGH FIELDS WHICH POINT TO THE BLOCK.
15970: * THE END OF THE CHAIN IS MARKED BY THE OCCURENCE
15971: * OF THE WORD WHICH USED TO BE IN THE FIRST WORD OF
15972: * THE BLOCK. THIS BACKCHAIN SERVES BOTH AS A MARK
15973: * INDICATING THAT THE BLOCK IS IN USE AND AS A LIST OF
15974: * REFERENCES FOR THE RELOCATION PHASE.
15975: *
15976: * 2) STORAGE IS SCANNED SEQUENTIALLY TO DISCOVER WHICH
15977: * BLOCKS ARE CURRENTLY IN USE AS INDICATED BY THE
15978: * PRESENCE OF A BACKCHAIN. TWO POINTERS ARE MAINTAINED
15979: * ONE SCANS THROUGH LOOKING AT EACH BLOCK. THE OTHER
15980: * IS INCREMENTED ONLY FOR BLOCKS FOUND TO BE IN USE.
15981: * IN THIS WAY, THE EVENTUAL LOCATION OF EACH BLOCK CAN
15982: * BE DETERMINED WITHOUT ACTUALLY MOVING ANY BLOCKS.
15983: * AS EACH BLOCK WHICH IS IN USE IS PROCESSED, THE BACK
15984: * CHAIN IS USED TO RESET ALL POINTERS WHICH POINT TO
15985: * THIS BLOCK TO CONTAIN ITS NEW ADDRESS, I.E. THE
15986: * ADDRESS IT WILL OCCUPY AFTER THE BLOCKS ARE MOVED.
15987: * THE FIRST WORD OF THE BLOCK, TAKEN FROM THE END OF
15988: * THE CHAIN IS RESTORED AT THIS POINT.
15989: *
15990: * DURING PASS 2, THE COLLECTOR BUILDS BLOCKS WHICH
15991: * DESCRIBE THE REGIONS OF STORAGE WHICH ARE TO BE
15992: * MOVED IN THE THIRD PASS. THERE IS ONE DESCRIPTOR FOR
15993: * EACH CONTIGUOUS SET OF GOOD BLOCKS. THE DESCRIPTOR
15994: * IS BUILT JUST BEHIND THE BLOCK TO BE MOVED AND
15995: * CONTAINS A POINTER TO THE NEXT BLOCK AND THE NUMBER
15996: * OF WORDS TO BE MOVED.
15997: *
15998: * 3) IN THE THIRD AND FINAL PASS, THE MOVE DESCRIPTOR
15999: * BLOCKS BUILT IN PASS TWO ARE USED TO ACTUALLY MOVE
16000: * THE BLOCKS DOWN TO THE BOTTOM OF THE DYNAMIC REGION.
16001: * THE COLLECTION IS THEN COMPLETE AND THE NEXT
16002: * AVAILABLE LOCATION POINTER IS RESET.
16003: {{EJC{{{{
16004: *
16005: * GBCOL (CONTINUED)
16006: *
16007: {GBCOL{PRC{E{0{{ENTRY POINT
16008: {{BNZ{DMVCH{GBC14{{FAIL IF IN MID-DUMP
16009: {{MNZ{GBCFL{{{NOTE GBCOL ENTERED
16010: {{MOV{R6{GBSVA{{SAVE ENTRY WA
16011: {{MOV{R7{GBSVB{{SAVE ENTRY WB
16012: {{MOV{R8{GBSVC{{SAVE ENTRY WC
16013: {{MOV{R10{-(SP){{SAVE ENTRY XL
16014: {{SCP{R6{{{GET CODE POINTER VALUE
16015: {{SUB{R$COD{R6{{MAKE RELATIVE
16016: {{LCP{R6{{{AND RESTORE
16017: *
16018: * PROCESS STACK ENTRIES
16019: *
16020: {{MOV{SP{R9{{POINT TO STACK FRONT
16021: {{MOV{STBAS{R10{{POINT PAST END OF STACK
16022: {{BGE{R10{R9{GBC00{OK IF D-STACK
16023: {{MOV{R10{R9{{REVERSE IF ...
16024: {{MOV{SP{R10{{... U-STACK
16025: *
16026: * PROCESS THE STACK
16027: *
16028: {GBC00{JSR{GBCPF{{{PROCESS POINTERS ON STACK
16029: *
16030: * PROCESS SPECIAL WORK LOCATIONS
16031: *
16032: {{MOV{#R$AAA{R9{{POINT TO START OF RELOCATABLE LOCS
16033: {{MOV{#R$YYY{R10{{POINT PAST END OF RELOCATABLE LOCS
16034: {{JSR{GBCPF{{{PROCESS WORK FIELDS
16035: *
16036: * PREPARE TO PROCESS VARIABLE BLOCKS
16037: *
16038: {{MOV{HSHTB{R6{{POINT TO FIRST HASH SLOT POINTER
16039: *
16040: * LOOP THROUGH HASH SLOTS
16041: *
16042: {GBC01{MOV{R6{R10{{POINT TO NEXT SLOT
16043: {{ICA{R6{{{BUMP BUCKET POINTER
16044: {{MOV{R6{GBCNM{{SAVE BUCKET POINTER
16045: {{EJC{{{{
16046: *
16047: * GBCOL (CONTINUED)
16048: *
16049: * LOOP THROUGH VARIABLES ON ONE HASH CHAIN
16050: *
16051: {GBC02{MOV{(R10){R9{{LOAD PTR TO NEXT VRBLK
16052: {{BZE{R9{GBC03{{JUMP IF END OF CHAIN
16053: {{MOV{R9{R10{{ELSE COPY VRBLK POINTER
16054: {{ADD{#4*VRVAL{R9{{POINT TO FIRST RELOC FLD
16055: {{ADD{#4*VRNXT{R10{{POINT PAST LAST (AND TO LINK PTR)
16056: {{JSR{GBCPF{{{PROCESS RELOC FIELDS IN VRBLK
16057: {{BRN{GBC02{{{LOOP BACK FOR NEXT BLOCK
16058: *
16059: * HERE AT END OF ONE HASH CHAIN
16060: *
16061: {GBC03{MOV{GBCNM{R6{{RESTORE BUCKET POINTER
16062: {{BNE{R6{HSHTE{GBC01{LOOP BACK IF MORE BUCKETS TO GO
16063: {{EJC{{{{
16064: *
16065: * GBCOL (CONTINUED)
16066: *
16067: * NOW WE ARE READY TO START PASS TWO. REGISTERS ARE USED
16068: * AS FOLLOWS IN PASS TWO.
16069: *
16070: * (XR) SCANS THROUGH ALL BLOCKS
16071: * (WC) POINTER TO EVENTUAL LOCATION
16072: *
16073: * THE MOVE DESCRIPTION BLOCKS BUILT IN THIS PASS HAVE
16074: * THE FOLLOWING FORMAT.
16075: *
16076: * WORD 1 POINTER TO NEXT MOVE BLOCK,
16077: * ZERO IF END OF CHAIN OF BLOCKS
16078: *
16079: * WORD 2 LENGTH OF BLOCKS TO BE MOVED IN
16080: * BYTES. SET TO THE ADDRESS OF THE
16081: * FIRST BYTE WHILE ACTUALLY SCANNING
16082: * THE BLOCKS.
16083: *
16084: * THE FIRST ENTRY ON THIS CHAIN IS A SPECIAL ENTRY
16085: * CONSISTING OF THE TWO WORDS GBCNM AND GBCNS. AFTER
16086: * BUILDING THE CHAIN OF MOVE DESCRIPTORS, GBCNM POINTS TO
16087: * THE FIRST REAL MOVE BLOCK, AND GBCNS IS THE LENGTH OF
16088: * BLOCKS IN USE AT THE START OF STORAGE WHICH NEED NOT
16089: * BE MOVED SINCE THEY ARE IN THE CORRECT POSITION.
16090: *
16091: {GBC04{MOV{DNAMB{R9{{POINT TO FIRST BLOCK
16092: {{MOV{R9{R8{{SET AS FIRST EVENTUAL LOCATION
16093: {{ADD{GBSVB{R8{{ADD OFFSET FOR EVENTUAL MOVE UP
16094: {{ZER{GBCNM{{{CLEAR INITIAL FORWARD POINTER
16095: {{MOV{#GBCNM{GBCLM{{INITIALIZE PTR TO LAST MOVE BLOCK
16096: {{MOV{R9{GBCNS{{INITIALIZE FIRST ADDRESS
16097: *
16098: * LOOP THROUGH A SERIES OF BLOCKS IN USE
16099: *
16100: {GBC05{BEQ{R9{DNAMP{GBC07{JUMP IF END OF USED REGION
16101: {{MOV{(R9){R6{{ELSE GET FIRST WORD
16102: {{BHI{R6{#P$YYY{GBC06{SKIP IF NOT ENTRY PTR (IN USE)
16103: {{BHI{R6{#B$AAA{GBC07{JUMP IF ENTRY POINTER (UNUSED)
16104: *
16105: * HERE FOR BLOCK IN USE, LOOP TO RELOCATE REFERENCES
16106: *
16107: {GBC06{MOV{R6{R10{{COPY POINTER
16108: {{MOV{(R10){R6{{LOAD FORWARD POINTER
16109: {{MOV{R8{(R10){{RELOCATE REFERENCE
16110: {{BHI{R6{#P$YYY{GBC06{LOOP BACK IF NOT END OF CHAIN
16111: {{BLO{R6{#B$AAA{GBC06{LOOP BACK IF NOT END OF CHAIN
16112: {{EJC{{{{
16113: *
16114: * GBCOL (CONTINUED)
16115: *
16116: * AT END OF CHAIN, RESTORE FIRST WORD AND BUMP PAST
16117: *
16118: {{MOV{R6{(R9){{RESTORE FIRST WORD
16119: {{JSR{BLKLN{{{GET LENGTH OF THIS BLOCK
16120: {{ADD{R6{R9{{BUMP ACTUAL POINTER
16121: {{ADD{R6{R8{{BUMP EVENTUAL POINTER
16122: {{BRN{GBC05{{{LOOP BACK FOR NEXT BLOCK
16123: *
16124: * HERE AT END OF A SERIES OF BLOCKS IN USE
16125: *
16126: {GBC07{MOV{R9{R6{{COPY POINTER PAST LAST BLOCK
16127: {{MOV{GBCLM{R10{{POINT TO PREVIOUS MOVE BLOCK
16128: {{SUB{4*1(R10){R6{{SUBTRACT STARTING ADDRESS
16129: {{MOV{R6{4*1(R10){{STORE LENGTH OF BLOCK TO BE MOVED
16130: *
16131: * LOOP THROUGH A SERIES OF BLOCKS NOT IN USE
16132: *
16133: {GBC08{BEQ{R9{DNAMP{GBC10{JUMP IF END OF USED REGION
16134: {{MOV{(R9){R6{{ELSE LOAD FIRST WORD OF NEXT BLOCK
16135: {{BHI{R6{#P$YYY{GBC09{JUMP IF IN USE
16136: {{BLO{R6{#B$AAA{GBC09{JUMP IF IN USE
16137: {{JSR{BLKLN{{{ELSE GET LENGTH OF NEXT BLOCK
16138: {{ADD{R6{R9{{PUSH POINTER
16139: {{BRN{GBC08{{{AND LOOP BACK
16140: *
16141: * HERE FOR A BLOCK IN USE AFTER PROCESSING A SERIES OF
16142: * BLOCKS WHICH WERE NOT IN USE, BUILD NEW MOVE BLOCK.
16143: *
16144: {GBC09{SUB{#4*NUM02{R9{{POINT 2 WORDS BEHIND FOR MOVE BLOCK
16145: {{MOV{GBCLM{R10{{POINT TO PREVIOUS MOVE BLOCK
16146: {{MOV{R9{(R10){{SET FORWARD PTR IN PREVIOUS BLOCK
16147: {{ZER{(R9){{{ZERO FORWARD PTR OF NEW BLOCK
16148: {{MOV{R9{GBCLM{{REMEMBER ADDRESS OF THIS BLOCK
16149: {{MOV{R9{R10{{COPY PTR TO MOVE BLOCK
16150: {{ADD{#4*NUM02{R9{{POINT BACK TO BLOCK IN USE
16151: {{MOV{R9{4*1(R10){{STORE STARTING ADDRESS
16152: {{BRN{GBC06{{{JUMP TO PROCESS BLOCK IN USE
16153: {{EJC{{{{
16154: *
16155: * GBCOL (CONTINUED)
16156: *
16157: * HERE FOR PASS THREE -- ACTUALLY MOVE THE BLOCKS DOWN
16158: *
16159: * (XL) POINTER TO OLD LOCATION
16160: * (XR) POINTER TO NEW LOCATION
16161: *
16162: {GBC10{MOV{DNAMB{R9{{POINT TO START OF STORAGE
16163: {{ADD{GBCNS{R9{{BUMP PAST UNMOVED BLOCKS AT START
16164: *
16165: * LOOP THROUGH MOVE DESCRIPTORS
16166: *
16167: {GBC11{MOV{GBCNM{R10{{POINT TO NEXT MOVE BLOCK
16168: {{BZE{R10{GBC12{{JUMP IF END OF CHAIN
16169: {{MOV{(R10)+{GBCNM{{MOVE POINTER DOWN CHAIN
16170: {{MOV{(R10)+{R6{{GET LENGTH TO MOVE
16171: {{MVW{{{{PERFORM MOVE
16172: {{BRN{GBC11{{{LOOP BACK
16173: *
16174: * NOW TEST FOR MOVE UP
16175: *
16176: {GBC12{MOV{R9{DNAMP{{SET NEXT AVAILABLE LOC PTR
16177: {{MOV{GBSVB{R7{{RELOAD MOVE OFFSET
16178: {{BZE{R7{GBC13{{JUMP IF NO MOVE REQUIRED
16179: {{MOV{R9{R10{{ELSE COPY OLD TOP OF CORE
16180: {{ADD{R7{R9{{POINT TO NEW TOP OF CORE
16181: {{MOV{R9{DNAMP{{SAVE NEW TOP OF CORE POINTER
16182: {{MOV{R10{R6{{COPY OLD TOP
16183: {{SUB{DNAMB{R6{{MINUS OLD BOTTOM = LENGTH
16184: {{ADD{R7{DNAMB{{BUMP BOTTOM TO GET NEW VALUE
16185: {{MWB{{{{PERFORM MOVE (BACKWARDS)
16186: *
16187: * MERGE HERE TO EXIT
16188: *
16189: {GBC13{MOV{GBSVA{R6{{RESTORE WA
16190: {{SCP{R8{{{GET CODE POINTER
16191: {{ADD{R$COD{R8{{MAKE ABSOLUTE AGAIN
16192: {{LCP{R8{{{AND REPLACE ABSOLUTE VALUE
16193: {{MOV{GBSVC{R8{{RESTORE WC
16194: {{MOV{(SP)+{R10{{RESTORE ENTRY XL
16195: {{ICV{GBCNT{{{INCREMENT COUNT OF COLLECTIONS
16196: {{ZER{R9{{{CLEAR GARBAGE VALUE IN XR
16197: {{ZER{GBCFL{{{NOTE EXIT FROM GBCOL
16198: {{EXI{{{{EXIT TO GBCOL CALLER
16199: *
16200: * GARBAGE COLLECTION NOT ALLOWED WHILST DUMPING
16201: *
16202: {GBC14{ICV{ERRFT{{{FATAL ERROR
16203: {{ERB{250{INSUFFICIENT{{MEMORY TO COMPLETE DUMP
16204: {{ENP{{{{END PROCEDURE GBCOL
16205: {{EJC{{{{
16206: *
16207: * GBCPF -- PROCESS FIELDS FOR GARBAGE COLLECTOR
16208: *
16209: * THIS PROCEDURE IS USED BY THE GARBAGE COLLECTOR TO
16210: * PROCESS FIELDS IN PASS ONE. SEE GBCOL FOR FULL DETAILS.
16211: *
16212: * (XR) PTR TO FIRST LOCATION TO PROCESS
16213: * (XL) PTR PAST LAST LOCATION TO PROCESS
16214: * JSR GBCPF CALL TO PROCESS FIELDS
16215: * (XR,WA,WB,WC,IA) DESTROYED
16216: *
16217: * NOTE THAT ALTHOUGH THIS PROCEDURE USES A RECURSIVE
16218: * APPROACH, IT CONTROLS ITS OWN STACK AND IS NOT RECURSIVE.
16219: *
16220: {GBCPF{PRC{E{0{{ENTRY POINT
16221: {{ZER{-(SP){{{SET ZERO TO MARK BOTTOM OF STACK
16222: {{MOV{R10{-(SP){{SAVE END POINTER
16223: *
16224: * MERGE HERE TO GO DOWN A LEVEL AND START A NEW LOOP
16225: *
16226: * 1(XS) NEXT LVL FIELD PTR (0 AT OUTER LVL)
16227: * 0(XS) PTR PAST LAST FIELD TO PROCESS
16228: * (XR) PTR TO FIRST FIELD TO PROCESS
16229: *
16230: * LOOP TO PROCESS SUCCESSIVE FIELDS
16231: *
16232: {GPF01{MOV{(R9){R10{{LOAD FIELD CONTENTS
16233: {{MOV{R9{R8{{SAVE FIELD POINTER
16234: {{BLT{R10{DNAMB{GPF02{JUMP IF NOT PTR INTO DYNAMIC AREA
16235: {{BGE{R10{DNAMP{GPF02{JUMP IF NOT PTR INTO DYNAMIC AREA
16236: *
16237: * HERE WE HAVE A PTR TO A BLOCK IN THE DYNAMIC AREA.
16238: * LINK THIS FIELD ONTO THE REFERENCE BACKCHAIN.
16239: *
16240: {{MOV{(R10){R6{{LOAD PTR TO CHAIN (OR ENTRY PTR)
16241: {{MOV{R9{(R10){{SET THIS FIELD AS NEW HEAD OF CHAIN
16242: {{MOV{R6{(R9){{SET FORWARD POINTER
16243: *
16244: * NOW SEE IF THIS BLOCK HAS BEEN PROCESSED BEFORE
16245: *
16246: {{BHI{R6{#P$YYY{GPF02{JUMP IF ALREADY PROCESSED
16247: {{BHI{R6{#B$AAA{GPF03{JUMP IF NOT ALREADY PROCESSED
16248: *
16249: * HERE TO MOVE TO NEXT FIELD
16250: *
16251: {GPF02{MOV{R8{R9{{RESTORE FIELD POINTER
16252: {{ICA{R9{{{BUMP TO NEXT FIELD
16253: {{BNE{R9{(SP){GPF01{LOOP BACK IF MORE TO GO
16254: {{EJC{{{{
16255: *
16256: * GBCPF (CONTINUED)
16257: *
16258: * HERE WE POP UP A LEVEL AFTER FINISHING A BLOCK
16259: *
16260: {{MOV{(SP)+{R10{{RESTORE POINTER PAST END
16261: {{MOV{(SP)+{R8{{RESTORE BLOCK POINTER
16262: {{BNZ{R8{GPF02{{CONTINUE LOOP UNLESS OUTER LEVL
16263: {{EXI{{{{RETURN TO CALLER IF OUTER LEVEL
16264: *
16265: * HERE TO PROCESS AN ACTIVE BLOCK WHICH HAS NOT BEEN DONE
16266: *
16267: {GPF03{MOV{R10{R9{{COPY BLOCK POINTER
16268: {{MOV{R6{R10{{COPY FIRST WORD OF BLOCK
16269: {{LEI{R10{{{LOAD ENTRY POINT ID (BL$XX)
16270: *
16271: * BLOCK TYPE SWITCH. NOTE THAT BLOCKS WITH NO RELOCATABLE
16272: * FIELDS JUST RETURN TO GPF02 HERE TO CONTINE TO NEXT FLD.
16273: *
16274: {{BSW{R10{BL$$${{SWITCH ON BLOCK TYPE
16275: {{IFF{BL$AR{GPF06{{ARBLK
16276: {{IFF{BL$BC{GPF18{{BCBLK
16277: {{IFF{BL$CD{GPF08{{CDBLK
16278: {{IFF{BL$EX{GPF17{{EXBLK
16279: {{IFF{BL$IC{GPF02{{ICBLK
16280: {{IFF{BL$NM{GPF10{{NMBLK
16281: {{IFF{BL$P0{GPF10{{P0BLK
16282: {{IFF{BL$P1{GPF12{{P1BLK
16283: {{IFF{BL$P2{GPF12{{P2BLK
16284: {{IFF{BL$RC{GPF02{{RCBLK
16285: {{IFF{BL$SC{GPF02{{SCBLK
16286: {{IFF{BL$SE{GPF02{{SEBLK
16287: {{IFF{BL$TB{GPF08{{TBBLK
16288: {{IFF{BL$VC{GPF08{{VCBLK
16289: {{IFF{BL$XN{GPF02{{XNBLK
16290: {{IFF{BL$XR{GPF09{{XRBLK
16291: {{IFF{BL$PD{GPF13{{PDBLK
16292: {{IFF{BL$TR{GPF16{{TRBLK
16293: {{IFF{BL$BF{GPF02{{BFBLK
16294: {{IFF{BL$CC{GPF07{{CCBLK
16295: {{IFF{BL$CM{GPF04{{CMBLK
16296: {{IFF{BL$CT{GPF02{{CTBLK
16297: {{IFF{BL$DF{GPF02{{DFBLK
16298: {{IFF{BL$EF{GPF02{{EFBLK
16299: {{IFF{BL$EV{GPF10{{EVBLK
16300: {{IFF{BL$FF{GPF11{{FFBLK
16301: {{IFF{BL$KV{GPF02{{KVBLK
16302: {{IFF{BL$PF{GPF14{{PFBLK
16303: {{IFF{BL$TE{GPF15{{TEBLK
16304: {{ESW{{{{END OF JUMP TABLE
16305: {{EJC{{{{
16306: *
16307: * GBCPF (CONTINUED)
16308: *
16309: * CMBLK
16310: *
16311: {GPF04{MOV{4*CMLEN(R9){R6{{LOAD LENGTH
16312: {{MOV{#4*CMTYP{R7{{SET OFFSET
16313: *
16314: * HERE TO PUSH DOWN TO NEW LEVEL
16315: *
16316: * (WC) FIELD PTR AT PREVIOUS LEVEL
16317: * (XR) PTR TO NEW BLOCK
16318: * (WA) LENGTH (RELOC FLDS + FLDS AT START)
16319: * (WB) OFFSET TO FIRST RELOC FIELD
16320: *
16321: {GPF05{ADD{R9{R6{{POINT PAST LAST RELOC FIELD
16322: {{ADD{R7{R9{{POINT TO FIRST RELOC FIELD
16323: {{MOV{R8{-(SP){{STACK OLD FIELD POINTER
16324: {{MOV{R6{-(SP){{STACK NEW LIMIT POINTER
16325: {{CHK{{{{CHECK FOR STACK OVERFLOW
16326: {{BRN{GPF01{{{IF OK, BACK TO PROCESS
16327: *
16328: * ARBLK
16329: *
16330: {GPF06{MOV{4*ARLEN(R9){R6{{LOAD LENGTH
16331: {{MOV{4*AROFS(R9){R7{{SET OFFSET TO 1ST RELOC FLD (ARPRO)
16332: {{BRN{GPF05{{{ALL SET
16333: *
16334: * CCBLK
16335: *
16336: {GPF07{MOV{4*CCUSE(R9){R6{{SET LENGTH IN USE
16337: {{MOV{#4*CCUSE{R7{{1ST WORD (MAKE SURE AT LEAST ONE)
16338: {{BRN{GPF05{{{ALL SET
16339: {{EJC{{{{
16340: *
16341: * GBCPF (CONTINUED)
16342: *
16343: * CDBLK, TBBLK, VCBLK
16344: *
16345: {GPF08{MOV{4*OFFS2(R9){R6{{LOAD LENGTH
16346: {{MOV{#4*OFFS3{R7{{SET OFFSET
16347: {{BRN{GPF05{{{JUMP BACK
16348: *
16349: * XRBLK
16350: *
16351: {GPF09{MOV{4*XRLEN(R9){R6{{LOAD LENGTH
16352: {{MOV{#4*XRPTR{R7{{SET OFFSET
16353: {{BRN{GPF05{{{JUMP BACK
16354: *
16355: * EVBLK, NMBLK, P0BLK
16356: *
16357: {GPF10{MOV{#4*OFFS2{R6{{POINT PAST SECOND FIELD
16358: {{MOV{#4*OFFS1{R7{{OFFSET IS ONE (ONLY RELOC FLD IS 2)
16359: {{BRN{GPF05{{{ALL SET
16360: *
16361: * FFBLK
16362: *
16363: {GPF11{MOV{#4*FFOFS{R6{{SET LENGTH
16364: {{MOV{#4*FFNXT{R7{{SET OFFSET
16365: {{BRN{GPF05{{{ALL SET
16366: *
16367: * P1BLK, P2BLK
16368: *
16369: {GPF12{MOV{#4*PARM2{R6{{LENGTH (PARM2 IS NON-RELOCATABLE)
16370: {{MOV{#4*PTHEN{R7{{SET OFFSET
16371: {{BRN{GPF05{{{ALL SET
16372: {{EJC{{{{
16373: *
16374: * GBCPF (CONTINUED)
16375: *
16376: * PDBLK
16377: *
16378: {GPF13{MOV{4*PDDFP(R9){R10{{LOAD PTR TO DFBLK
16379: {{MOV{4*DFPDL(R10){R6{{GET PDBLK LENGTH
16380: {{MOV{#4*PDFLD{R7{{SET OFFSET
16381: {{BRN{GPF05{{{ALL SET
16382: *
16383: * PFBLK
16384: *
16385: {GPF14{MOV{#4*PFARG{R6{{LENGTH PAST LAST RELOC
16386: {{MOV{#4*PFCOD{R7{{OFFSET TO FIRST RELOC
16387: {{BRN{GPF05{{{ALL SET
16388: *
16389: * TEBLK
16390: *
16391: {GPF15{MOV{#4*TESI${R6{{SET LENGTH
16392: {{MOV{#4*TESUB{R7{{AND OFFSET
16393: {{BRN{GPF05{{{ALL SET
16394: *
16395: * TRBLK
16396: *
16397: {GPF16{MOV{#4*TRSI${R6{{SET LENGTH
16398: {{MOV{#4*TRVAL{R7{{AND OFFSET
16399: {{BRN{GPF05{{{ALL SET
16400: *
16401: * EXBLK
16402: *
16403: {GPF17{MOV{4*EXLEN(R9){R6{{LOAD LENGTH
16404: {{MOV{#4*EXFLC{R7{{SET OFFSET
16405: {{BRN{GPF05{{{JUMP BACK
16406: *
16407: * BCBLK
16408: *
16409: {GPF18{MOV{#4*BCSI${R6{{SET LENGTH
16410: {{MOV{#4*BCBUF{R7{{AND OFFSET
16411: {{BRN{GPF05{{{ALL SET
16412: {{ENP{{{{END PROCEDURE GBCPF
16413: {{EJC{{{{
16414: *
16415: * GTARR -- GET ARRAY
16416: *
16417: * GTARR IS PASSED AN OBJECT AND RETURNS AN ARRAY IF POSSIBL
16418: *
16419: * (XR) VALUE TO BE CONVERTED
16420: * JSR GTARR CALL TO GET ARRAY
16421: * PPM LOC TRANSFER LOC FOR CONVERT IMPOSSIBLE
16422: * (XR) RESULTING ARRAY
16423: * (XL,WA,WB,WC) DESTROYED
16424: *
16425: {GTARR{PRC{E{1{{ENTRY POINT
16426: {{MOV{(R9){R6{{LOAD TYPE WORD
16427: {{BEQ{R6{#B$ART{GTAR8{EXIT IF ALREADY AN ARRAY
16428: {{BEQ{R6{#B$VCT{GTAR8{EXIT IF ALREADY AN ARRAY
16429: {{BNE{R6{#B$TBT{GTA9A{ELSE FAIL IF NOT A TABLE (SGD02)
16430: *
16431: * HERE WE CONVERT A TABLE TO AN ARRAY
16432: *
16433: {{MOV{R9{-(SP){{REPLACE TBBLK POINTER ON STACK
16434: {{ZER{R9{{{SIGNAL FIRST PASS
16435: {{ZER{R7{{{ZERO NON-NULL ELEMENT COUNT
16436: *
16437: * THE FOLLOWING CODE IS EXECUTED TWICE. ON THE FIRST PASS,
16438: * SIGNALLED BY XR=0, THE NUMBER OF NON-NULL ELEMENTS IN
16439: * THE TABLE IS COUNTED IN WB. IN THE SECOND PASS, WHERE
16440: * XR IS A POINTER INTO THE ARBLK, THE NAME AND VALUE ARE
16441: * ENTERED INTO THE CURRENT ARBLK LOCATION.
16442: *
16443: {GTAR1{MOV{(SP){R10{{POINT TO TABLE
16444: {{ADD{4*TBLEN(R10){R10{{POINT PAST LAST BUCKET
16445: {{SUB{#4*TBBUK{R10{{SET FIRST BUCKET OFFSET
16446: {{MOV{R10{R6{{COPY ADJUSTED POINTER
16447: *
16448: * LOOP THROUGH BUCKETS IN TABLE BLOCK
16449: * NEXT THREE LINES OF CODE RELY ON TENXT HAVING A VALUE
16450: * 1 LESS THAN TBBUK.
16451: *
16452: {GTAR2{MOV{R6{R10{{COPY BUCKET POINTER
16453: {{DCA{R6{{{DECREMENT BUCKET POINTER
16454: *
16455: * LOOP THROUGH TEBLKS ON ONE BUCKET CHAIN
16456: *
16457: {GTAR3{MOV{4*TENXT(R10){R10{{POINT TO NEXT TEBLK
16458: {{BEQ{R10{(SP){GTAR6{JUMP IF CHAIN END (TBBLK PTR)
16459: {{MOV{R10{CNVTP{{ELSE SAVE TEBLK POINTER
16460: *
16461: * LOOP TO FIND VALUE DOWN TRBLK CHAIN
16462: *
16463: {GTAR4{MOV{4*TEVAL(R10){R10{{LOAD VALUE
16464: {{BEQ{(R10){#B$TRT{GTAR4{LOOP TILL VALUE FOUND
16465: {{MOV{R10{R8{{COPY VALUE
16466: {{MOV{CNVTP{R10{{RESTORE TEBLK POINTER
16467: {{EJC{{{{
16468: *
16469: * GTARR (CONTINUED)
16470: *
16471: * NOW CHECK FOR NULL AND TEST CASES
16472: *
16473: {{BEQ{R8{#NULLS{GTAR3{LOOP BACK TO IGNORE NULL VALUE
16474: {{BNZ{R9{GTAR5{{JUMP IF SECOND PASS
16475: {{ICV{R7{{{FOR THE FIRST PASS, BUMP COUNT
16476: {{BRN{GTAR3{{{AND LOOP BACK FOR NEXT TEBLK
16477: *
16478: * HERE IN SECOND PASS
16479: *
16480: {GTAR5{MOV{4*TESUB(R10){(R9)+{{STORE SUBSCRIPT NAME
16481: {{MOV{R8{(R9)+{{STORE VALUE IN ARBLK
16482: {{BRN{GTAR3{{{LOOP BACK FOR NEXT TEBLK
16483: *
16484: * HERE AFTER SCANNING TEBLKS ON ONE CHAIN
16485: *
16486: {GTAR6{BNE{R6{(SP){GTAR2{LOOP BACK IF MORE BUCKETS TO GO
16487: {{BNZ{R9{GTAR7{{ELSE JUMP IF SECOND PASS
16488: *
16489: * HERE AFTER COUNTING NON-NULL ELEMENTS
16490: *
16491: {{BZE{R7{GTAR9{{FAIL IF NO NON-NULL ELEMENTS
16492: {{MOV{R7{R6{{ELSE COPY COUNT
16493: {{ADD{R7{R6{{DOUBLE (TWO WORDS/ELEMENT)
16494: {{ADD{#ARVL2{R6{{ADD SPACE FOR STANDARD FIELDS
16495: {{WTB{R6{{{CONVERT LENGTH TO BYTES
16496: {{BGE{R6{MXLEN{GTAR9{FAIL IF TOO LONG FOR ARRAY
16497: {{JSR{ALLOC{{{ELSE ALLOCATE SPACE FOR ARBLK
16498: {{MOV{#B$ART{(R9){{STORE TYPE WORD
16499: {{ZER{4*IDVAL(R9){{{ZERO ID FOR THE MOMENT
16500: {{MOV{R6{4*ARLEN(R9){{STORE LENGTH
16501: {{MOV{#NUM02{4*ARNDM(R9){{SET DIMENSIONS = 2
16502: {{LDI{INTV1{{{GET INTEGER ONE
16503: {{STI{4*ARLBD(R9){{{STORE AS LBD 1
16504: {{STI{4*ARLB2(R9){{{STORE AS LBD 2
16505: {{LDI{INTV2{{{LOAD INTEGER TWO
16506: {{STI{4*ARDM2(R9){{{STORE AS DIM 2
16507: {{MTI{R7{{{GET ELEMENT COUNT AS INTEGER
16508: {{STI{4*ARDIM(R9){{{STORE AS DIM 1
16509: {{ZER{4*ARPR2(R9){{{ZERO PROTOTYPE FIELD FOR NOW
16510: {{MOV{#4*ARPR2{4*AROFS(R9){{SET OFFSET FIELD (SIGNAL PASS 2)
16511: {{MOV{R9{R7{{SAVE ARBLK POINTER
16512: {{ADD{#4*ARVL2{R9{{POINT TO FIRST ELEMENT LOCATION
16513: {{BRN{GTAR1{{{JUMP BACK TO FILL IN ELEMENTS
16514: {{EJC{{{{
16515: *
16516: * GTARR (CONTINUED)
16517: *
16518: * HERE AFTER FILLING IN ELEMENT VALUES
16519: *
16520: {GTAR7{MOV{R7{R9{{RESTORE ARBLK POINTER
16521: {{MOV{R7{(SP){{STORE AS RESULT
16522: *
16523: * NOW WE NEED THE ARRAY PROTOTYPE WHICH IS OF THE FORM NN,2
16524: * THIS IS OBTAINED BY BUILDING THE STRING FOR NN02 AND
16525: * CHANGING THE ZERO TO A COMMA BEFORE STORING IT.
16526: *
16527: {{LDI{4*ARDIM(R9){{{GET NUMBER OF ELEMENTS (NN)
16528: {{MLI{INTVH{{{MULTIPLY BY 100
16529: {{ADI{INTV2{{{ADD 2 (NN02)
16530: {{JSR{ICBLD{{{BUILD INTEGER
16531: {{MOV{R9{-(SP){{STORE PTR FOR GTSTG
16532: {{JSR{GTSTG{{{CONVERT TO STRING
16533: {{PPM{{{{CONVERT FAIL IS IMPOSSIBLE
16534: {{MOV{R9{R10{{COPY STRING POINTER
16535: {{MOV{(SP)+{R9{{RELOAD ARBLK POINTER
16536: {{MOV{R10{4*ARPR2(R9){{STORE PROTOTYPE PTR (NN02)
16537: {{SUB{#NUM02{R6{{ADJUST LENGTH TO POINT TO ZERO
16538: {{PSC{R10{R6{{POINT TO ZERO
16539: {{MOV{#CH$CM{R7{{LOAD A COMMA
16540: {{SCH{R7{(R10){{STORE A COMMA OVER THE ZERO
16541: {{CSC{R10{{{COMPLETE STORE CHARACTERS
16542: *
16543: * NORMAL RETURN
16544: *
16545: {GTAR8{EXI{{{{RETURN TO CALLER
16546: *
16547: * NON-CONVERSION RETURN
16548: *
16549: {GTAR9{MOV{(SP)+{R9{{RESTORE STACK FOR CONV ERR (SGD02)
16550: *
16551: * MERGE TO TAKE CONVERT ERROR WHEN STACK ADJUSTED OK
16552: *
16553: {GTA9A{EXI{1{{{RETURN
16554: {{ENP{{{{PROCEDURE GTARR
16555: {{EJC{{{{
16556: *
16557: * GTCOD -- CONVERT TO CODE
16558: *
16559: * (XR) OBJECT TO BE CONVERTED
16560: * JSR GTCOD CALL TO CONVERT TO CODE
16561: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
16562: * (XR) POINTER TO RESULTING CDBLK
16563: * (XL,WA,WB,WC,RA) DESTROYED
16564: *
16565: * IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE-
16566: * EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
16567: * WITHOUT RETURNING TO THIS ROUTINE.
16568: *
16569: {GTCOD{PRC{E{1{{ENTRY POINT
16570: {{BEQ{(R9){#B$CDS{GTCD1{JUMP IF ALREADY CODE
16571: {{BEQ{(R9){#B$CDC{GTCD1{JUMP IF ALREADY CODE
16572: *
16573: * HERE WE MUST GENERATE A CDBLK BY COMPILATION
16574: *
16575: {{MOV{R9{-(SP){{STACK ARGUMENT FOR GTSTG
16576: {{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING
16577: {{PPM{GTCD2{{{JUMP IF NON-CONVERTIBLE
16578: {{MOV{FLPTR{GTCEF{{SAVE FAIL PTR IN CASE OF ERROR
16579: {{MOV{R$COD{R$GTC{{ALSO SAVE CODE PTR
16580: {{MOV{R9{R$CIM{{ELSE SET IMAGE POINTER
16581: {{MOV{R6{SCNIL{{SET IMAGE LENGTH
16582: {{ZER{SCNPT{{{SET SCAN POINTER
16583: {{MOV{#STGXC{STAGE{{SET STAGE FOR EXECUTE COMPILE
16584: {{MOV{CMPSN{LSTSN{{IN CASE LISTR CALLED
16585: {{JSR{CMPIL{{{COMPILE STRING
16586: {{MOV{#STGXT{STAGE{{RESET STAGE FOR EXECUTE TIME
16587: {{ZER{R$CIM{{{CLEAR IMAGE
16588: *
16589: * MERGE HERE IF NO CONVERT REQUIRED
16590: *
16591: {GTCD1{EXI{{{{GIVE NORMAL GTCOD RETURN
16592: *
16593: * HERE IF UNCONVERTIBLE
16594: *
16595: {GTCD2{EXI{1{{{GIVE ERROR RETURN
16596: {{ENP{{{{END PROCEDURE GTCOD
16597: {{EJC{{{{
16598: *
16599: * GTEXP -- CONVERT TO EXPRESSION
16600: *
16601: * (XR) INPUT VALUE TO BE CONVERTED
16602: * JSR GTEXP CALL TO CONVERT TO EXPRESSION
16603: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
16604: * (XR) POINTER TO RESULT EXBLK OR SEBLK
16605: * (XL,WA,WB,WC,RA) DESTROYED
16606: *
16607: * IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE-
16608: * EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
16609: * WITHOUT RETURNING TO THIS ROUTINE.
16610: *
16611: {GTEXP{PRC{E{1{{ENTRY POINT
16612: {{BLO{(R9){#B$E$${GTEX1{JUMP IF ALREADY AN EXPRESSION
16613: {{MOV{R9{-(SP){{STORE ARGUMENT FOR GTSTG
16614: {{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING
16615: {{PPM{GTEX2{{{JUMP IF UNCONVERTIBLE
16616: *
16617: * CHECK THE LAST CHARACTER OF THE STRING FOR COLON OR
16618: * SEMICOLON. THESE CHARACTERS CAN LEGITIMATELY END AN
16619: * EXPRESSION IN OPEN CODE, SO EXPAN WILL NOT DETECT THEM
16620: * AS ERRORS, BUT THEY ARE INVALID AS TERMINATORS FOR A
16621: * STRING THAT IS BEING CONVERTED TO EXPRESSION FORM.
16622: *
16623: {{MOV{R9{R10{{COPY INPUT STRING POINTER (REG06)
16624: {{PLC{R10{R6{{POINT ONE PAST THE STRING END (REG06)
16625: {{LCH{R10{-(R10){{FETCH THE LAST CHARACTER (REG06)
16626: {{BEQ{R10{#CH$CL{GTEX2{ERROR IF IT IS A SEMICOLON (REG06)
16627: {{BEQ{R10{#CH$SM{GTEX2{OR IF IT IS A COLON (REG06)
16628: *
16629: * HERE WE CONVERT A STRING BY COMPILATION
16630: *
16631: {{MOV{R9{R$CIM{{SET INPUT IMAGE POINTER
16632: {{ZER{SCNPT{{{SET SCAN POINTER
16633: {{MOV{R6{SCNIL{{SET INPUT IMAGE LENGTH
16634: {{ZER{R7{{{SET CODE FOR NORMAL SCAN
16635: {{MOV{FLPTR{GTCEF{{SAVE FAIL PTR IN CASE OF ERROR
16636: {{MOV{R$COD{R$GTC{{ALSO SAVE CODE PTR
16637: {{MOV{#STGEV{STAGE{{ADJUST STAGE FOR COMPILE
16638: {{MOV{#T$UOK{SCNTP{{INDICATE UNARY OPERATOR ACCEPTABLE
16639: {{JSR{EXPAN{{{BUILD TREE FOR EXPRESSION
16640: {{ZER{SCNRS{{{RESET RESCAN FLAG
16641: {{BNE{SCNPT{SCNIL{GTEX2{ERROR IF NOT END OF IMAGE
16642: {{ZER{R7{{{SET OK VALUE FOR CDGEX CALL
16643: {{MOV{R9{R10{{COPY TREE POINTER
16644: {{JSR{CDGEX{{{BUILD EXPRESSION BLOCK
16645: {{ZER{R$CIM{{{CLEAR POINTER
16646: {{MOV{#STGXT{STAGE{{RESTORE STAGE FOR EXECUTE TIME
16647: *
16648: * MERGE HERE IF NO CONVERSION REQUIRED
16649: *
16650: {GTEX1{EXI{{{{RETURN TO GTEXP CALLER
16651: *
16652: * HERE IF UNCONVERTIBLE
16653: *
16654: {GTEX2{EXI{1{{{TAKE ERROR EXIT
16655: {{ENP{{{{END PROCEDURE GTEXP
16656: {{EJC{{{{
16657: *
16658: * GTINT -- GET INTEGER VALUE
16659: *
16660: * GTINT IS PASSED AN OBJECT AND RETURNS AN INTEGER AFTER
16661: * PERFORMING ANY NECESSARY CONVERSIONS.
16662: *
16663: * (XR) VALUE TO BE CONVERTED
16664: * JSR GTINT CALL TO CONVERT TO INTEGER
16665: * PPM LOC TRANSFER LOC FOR CONVERT IMPOSSIBLE
16666: * (XR) RESULTING INTEGER
16667: * (WC,RA) DESTROYED
16668: * (WA,WB) DESTROYED (ONLY ON CONVERSION ERR)
16669: * (XR) UNCHANGED (ON CONVERT ERROR)
16670: *
16671: {GTINT{PRC{E{1{{ENTRY POINT
16672: {{BEQ{(R9){#B$ICL{GTIN2{JUMP IF ALREADY AN INTEGER
16673: {{MOV{R6{GTINA{{ELSE SAVE WA
16674: {{MOV{R7{GTINB{{SAVE WB
16675: {{JSR{GTNUM{{{CONVERT TO NUMERIC
16676: {{PPM{GTIN3{{{JUMP IF UNCONVERTIBLE
16677: {{BEQ{R6{#B$ICL{GTIN1{JUMP IF INTEGER
16678: *
16679: * HERE WE CONVERT A REAL TO INTEGER
16680: *
16681: {{LDR{4*RCVAL(R9){{{LOAD REAL VALUE
16682: {{RTI{GTIN3{{{CONVERT TO INTEGER (ERR IF OVFLOW)
16683: {{JSR{ICBLD{{{IF OK BUILD ICBLK
16684: *
16685: * HERE AFTER SUCCESSFUL CONVERSION TO INTEGER
16686: *
16687: {GTIN1{MOV{GTINA{R6{{RESTORE WA
16688: {{MOV{GTINB{R7{{RESTORE WB
16689: *
16690: * COMMON EXIT POINT
16691: *
16692: {GTIN2{EXI{{{{RETURN TO GTINT CALLER
16693: *
16694: * HERE ON CONVERSION ERROR
16695: *
16696: {GTIN3{EXI{1{{{TAKE CONVERT ERROR EXIT
16697: {{ENP{{{{END PROCEDURE GTINT
16698: {{EJC{{{{
16699: *
16700: * GTNUM -- GET NUMERIC VALUE
16701: *
16702: * GTNUM IS GIVEN AN OBJECT AND RETURNS EITHER AN INTEGER
16703: * OR A REAL, PERFORMING ANY NECESSARY CONVERSIONS.
16704: *
16705: * (XR) OBJECT TO BE CONVERTED
16706: * JSR GTNUM CALL TO CONVERT TO NUMERIC
16707: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
16708: * (XR) POINTER TO RESULT (INT OR REAL)
16709: * (WA) FIRST WORD OF RESULT BLOCK
16710: * (WB,WC,RA) DESTROYED
16711: * (XR) UNCHANGED (ON CONVERT ERROR)
16712: *
16713: {GTNUM{PRC{E{1{{ENTRY POINT
16714: {{MOV{(R9){R6{{LOAD FIRST WORD OF BLOCK
16715: {{BEQ{R6{#B$ICL{GTN34{JUMP IF INTEGER (NO CONVERSION)
16716: {{BEQ{R6{#B$RCL{GTN34{JUMP IF REAL (NO CONVERSION)
16717: *
16718: * AT THIS POINT THE ONLY POSSIBILITY IS TO CONVERT A STRING
16719: * TO AN INTEGER OR REAL AS APPROPRIATE.
16720: *
16721: {{MOV{R9{-(SP){{STACK ARGUMENT IN CASE CONVERT ERR
16722: {{MOV{R9{-(SP){{STACK ARGUMENT FOR GTSTG
16723: {{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING
16724: {{PPM{GTN36{{{JUMP IF UNCONVERTIBLE
16725: *
16726: * INITIALIZE NUMERIC CONVERSION
16727: *
16728: {{LDI{INTV0{{{INITIALIZE INTEGER RESULT TO ZERO
16729: {{BZE{R6{GTN32{{JUMP TO EXIT WITH ZERO IF NULL
16730: {{LCT{R6{R6{{SET BCT COUNTER FOR FOLLOWING LOOPS
16731: {{ZER{GTNNF{{{TENTATIVELY INDICATE RESULT +
16732: {{STI{GTNEX{{{INITIALISE EXPONENT TO ZERO
16733: {{ZER{GTNSC{{{ZERO SCALE IN CASE REAL
16734: {{ZER{GTNDF{{{RESET FLAG FOR DEC POINT FOUND
16735: {{ZER{GTNRD{{{RESET FLAG FOR DIGITS FOUND
16736: {{LDR{REAV0{{{ZERO REAL ACCUM IN CASE REAL
16737: {{PLC{R9{{{POINT TO ARGUMENT CHARACTERS
16738: *
16739: * MERGE BACK HERE AFTER IGNORING LEADING BLANK
16740: *
16741: {GTN01{LCH{R7{(R9)+{{LOAD FIRST CHARACTER
16742: {{BLT{R7{#CH$D0{GTN02{JUMP IF NOT DIGIT
16743: {{BLE{R7{#CH$D9{GTN06{JUMP IF FIRST CHAR IS A DIGIT
16744: {{EJC{{{{
16745: *
16746: * GTNUM (CONTINUED)
16747: *
16748: * HERE IF FIRST DIGIT IS NON-DIGIT
16749: *
16750: {GTN02{BNE{R7{#CH$BL{GTN03{JUMP IF NON-BLANK
16751: {GTNA2{BCT{R6{GTN01{{ELSE DECR COUNT AND LOOP BACK
16752: {{BRN{GTN07{{{JUMP TO RETURN ZERO IF ALL BLANKS
16753: *
16754: * HERE FOR FIRST CHARACTER NON-BLANK, NON-DIGIT
16755: *
16756: {GTN03{BEQ{R7{#CH$PL{GTN04{JUMP IF PLUS SIGN
16757: {{BEQ{R7{#CH$HT{GTNA2{HORIZONTAL TAB EQUIV TO BLANK
16758: {{BNE{R7{#CH$MN{GTN12{JUMP IF NOT MINUS (MAY BE REAL)
16759: {{MNZ{GTNNF{{{IF MINUS SIGN, SET NEGATIVE FLAG
16760: *
16761: * MERGE HERE AFTER PROCESSING SIGN
16762: *
16763: {GTN04{BCT{R6{GTN05{{JUMP IF CHARS LEFT
16764: {{BRN{GTN36{{{ELSE ERROR
16765: *
16766: * LOOP TO FETCH CHARACTERS OF AN INTEGER
16767: *
16768: {GTN05{LCH{R7{(R9)+{{LOAD NEXT CHARACTER
16769: {{BLT{R7{#CH$D0{GTN08{JUMP IF NOT A DIGIT
16770: {{BGT{R7{#CH$D9{GTN08{JUMP IF NOT A DIGIT
16771: *
16772: * MERGE HERE FOR FIRST DIGIT
16773: *
16774: {GTN06{STI{GTNSI{{{SAVE CURRENT VALUE
16775: {{CVM{GTN35{{{CURRENT*10-(NEW DIG) JUMP IF OVFLOW
16776: {{MNZ{GTNRD{{{SET DIGIT READ FLAG
16777: {{BCT{R6{GTN05{{ELSE LOOP BACK IF MORE CHARS
16778: *
16779: * HERE TO EXIT WITH CONVERTED INTEGER VALUE
16780: *
16781: {GTN07{BNZ{GTNNF{GTN32{{JUMP IF NEGATIVE (ALL SET)
16782: {{NGI{{{{ELSE NEGATE
16783: {{INO{GTN32{{{JUMP IF NO OVERFLOW
16784: {{BRN{GTN36{{{ELSE SIGNAL ERROR
16785: {{EJC{{{{
16786: *
16787: * GTNUM (CONTINUED)
16788: *
16789: * HERE FOR A NON-DIGIT CHARACTER WHILE ATTEMPTING TO
16790: * CONVERT AN INTEGER, CHECK FOR TRAILING BLANKS OR REAL.
16791: *
16792: {GTN08{BEQ{R7{#CH$BL{GTNA9{JUMP IF A BLANK
16793: {{BEQ{R7{#CH$HT{GTNA9{JUMP IF HORIZONTAL TAB
16794: {{ITR{{{{ELSE CONVERT INTEGER TO REAL
16795: {{NGR{{{{NEGATE TO GET POSITIVE VALUE
16796: {{BRN{GTN12{{{JUMP TO TRY FOR REAL
16797: *
16798: * HERE WE SCAN OUT BLANKS TO END OF STRING
16799: *
16800: {GTN09{LCH{R7{(R9)+{{GET NEXT CHAR
16801: {{BEQ{R7{#CH$HT{GTNA9{JUMP IF HORIZONTAL TAB
16802: {{BNE{R7{#CH$BL{GTN36{ERROR IF NON-BLANK
16803: {GTNA9{BCT{R6{GTN09{{LOOP BACK IF MORE CHARS TO CHECK
16804: {{BRN{GTN07{{{RETURN INTEGER IF ALL BLANKS
16805: *
16806: * LOOP TO COLLECT MANTISSA OF REAL
16807: *
16808: {GTN10{LCH{R7{(R9)+{{LOAD NEXT CHARACTER
16809: {{BLT{R7{#CH$D0{GTN12{JUMP IF NON-NUMERIC
16810: {{BGT{R7{#CH$D9{GTN12{JUMP IF NON-NUMERIC
16811: *
16812: * MERGE HERE TO COLLECT FIRST REAL DIGIT
16813: *
16814: {GTN11{SUB{#CH$D0{R7{{CONVERT DIGIT TO NUMBER
16815: {{MLR{REAVT{{{MULTIPLY REAL BY 10.0
16816: {{ROV{GTN36{{{CONVERT ERROR IF OVERFLOW
16817: {{STR{GTNSR{{{SAVE RESULT
16818: {{MTI{R7{{{GET NEW DIGIT AS INTEGER
16819: {{ITR{{{{CONVERT NEW DIGIT TO REAL
16820: {{ADR{GTNSR{{{ADD TO GET NEW TOTAL
16821: {{ADD{GTNDF{GTNSC{{INCREMENT SCALE IF AFTER DEC POINT
16822: {{MNZ{GTNRD{{{SET DIGIT FOUND FLAG
16823: {{BCT{R6{GTN10{{LOOP BACK IF MORE CHARS
16824: {{BRN{GTN22{{{ELSE JUMP TO SCALE
16825: {{EJC{{{{
16826: *
16827: * GTNUM (CONTINUED)
16828: *
16829: * HERE IF NON-DIGIT FOUND WHILE COLLECTING A REAL
16830: *
16831: {GTN12{BNE{R7{#CH$DT{GTN13{JUMP IF NOT DEC POINT
16832: {{BNZ{GTNDF{GTN36{{IF DEC POINT, ERROR IF ONE ALREADY
16833: {{MOV{#NUM01{GTNDF{{ELSE SET FLAG FOR DEC POINT
16834: {{BCT{R6{GTN10{{LOOP BACK IF MORE CHARS
16835: {{BRN{GTN22{{{ELSE JUMP TO SCALE
16836: *
16837: * HERE IF NOT DECIMAL POINT
16838: *
16839: {GTN13{BEQ{R7{#CH$LE{GTN15{JUMP IF E FOR EXPONENT
16840: {{BEQ{R7{#CH$LD{GTN15{JUMP IF D FOR EXPONENT
16841: {{BEQ{R7{#CH$$E{GTN15{JUMP IF E FOR EXPONENT
16842: {{BEQ{R7{#CH$$D{GTN15{JUMP IF D FOR EXPONENT
16843: *
16844: * HERE CHECK FOR TRAILING BLANKS
16845: *
16846: {GTN14{BEQ{R7{#CH$BL{GTNB4{JUMP IF BLANK
16847: {{BEQ{R7{#CH$HT{GTNB4{JUMP IF HORIZONTAL TAB
16848: {{BRN{GTN36{{{ERROR IF NON-BLANK
16849: *
16850: {GTNB4{LCH{R7{(R9)+{{GET NEXT CHARACTER
16851: {{BCT{R6{GTN14{{LOOP BACK TO CHECK IF MORE
16852: {{BRN{GTN22{{{ELSE JUMP TO SCALE
16853: *
16854: * HERE TO READ AND PROCESS AN EXPONENT
16855: *
16856: {GTN15{ZER{GTNES{{{SET EXPONENT SIGN POSITIVE
16857: {{LDI{INTV0{{{INITIALIZE EXPONENT TO ZERO
16858: {{MNZ{GTNDF{{{RESET NO DEC POINT INDICATION
16859: {{BCT{R6{GTN16{{JUMP SKIPPING PAST E OR D
16860: {{BRN{GTN36{{{ERROR IF NULL EXPONENT
16861: *
16862: * CHECK FOR EXPONENT SIGN
16863: *
16864: {GTN16{LCH{R7{(R9)+{{LOAD FIRST EXPONENT CHARACTER
16865: {{BEQ{R7{#CH$PL{GTN17{JUMP IF PLUS SIGN
16866: {{BNE{R7{#CH$MN{GTN19{ELSE JUMP IF NOT MINUS SIGN
16867: {{MNZ{GTNES{{{SET SIGN NEGATIVE IF MINUS SIGN
16868: *
16869: * MERGE HERE AFTER PROCESSING EXPONENT SIGN
16870: *
16871: {GTN17{BCT{R6{GTN18{{JUMP IF CHARS LEFT
16872: {{BRN{GTN36{{{ELSE ERROR
16873: *
16874: * LOOP TO CONVERT EXPONENT DIGITS
16875: *
16876: {GTN18{LCH{R7{(R9)+{{LOAD NEXT CHARACTER
16877: {{EJC{{{{
16878: *
16879: * GTNUM (CONTINUED)
16880: *
16881: * MERGE HERE FOR FIRST EXPONENT DIGIT
16882: *
16883: {GTN19{BLT{R7{#CH$D0{GTN20{JUMP IF NOT DIGIT
16884: {{BGT{R7{#CH$D9{GTN20{JUMP IF NOT DIGIT
16885: {{CVM{GTN36{{{ELSE CURRENT*10, SUBTRACT NEW DIGIT
16886: {{BCT{R6{GTN18{{LOOP BACK IF MORE CHARS
16887: {{BRN{GTN21{{{JUMP IF EXPONENT FIELD IS EXHAUSTED
16888: *
16889: * HERE TO CHECK FOR TRAILING BLANKS AFTER EXPONENT
16890: *
16891: {GTN20{BEQ{R7{#CH$BL{GTNC0{JUMP IF BLANK
16892: {{BEQ{R7{#CH$HT{GTNC0{JUMP IF HORIZONTAL TAB
16893: {{BRN{GTN36{{{ERROR IF NON-BLANK
16894: *
16895: {GTNC0{LCH{R7{(R9)+{{GET NEXT CHARACTER
16896: {{BCT{R6{GTN20{{LOOP BACK TILL ALL BLANKS SCANNED
16897: *
16898: * MERGE HERE AFTER COLLECTING EXPONENT
16899: *
16900: {GTN21{STI{GTNEX{{{SAVE COLLECTED EXPONENT
16901: {{BNZ{GTNES{GTN22{{JUMP IF IT WAS NEGATIVE
16902: {{NGI{{{{ELSE COMPLEMENT
16903: {{IOV{GTN36{{{ERROR IF OVERFLOW
16904: {{STI{GTNEX{{{AND STORE POSITIVE EXPONENT
16905: *
16906: * MERGE HERE WITH EXPONENT (0 IF NONE GIVEN)
16907: *
16908: {GTN22{BZE{GTNRD{GTN36{{ERROR IF NOT DIGITS COLLECTED
16909: {{BZE{GTNDF{GTN36{{ERROR IF NO EXPONENT OR DEC POINT
16910: {{MTI{GTNSC{{{ELSE LOAD SCALE AS INTEGER
16911: {{SBI{GTNEX{{{SUBTRACT EXPONENT
16912: {{IOV{GTN36{{{ERROR IF OVERFLOW
16913: {{ILT{GTN26{{{JUMP IF WE MUST SCALE UP
16914: *
16915: * HERE WE HAVE A NEGATIVE EXPONENT, SO SCALE DOWN
16916: *
16917: {{MFI{R6{GTN36{{LOAD SCALE FACTOR, ERR IF OVFLOW
16918: *
16919: * LOOP TO SCALE DOWN IN STEPS OF 10**10
16920: *
16921: {GTN23{BLE{R6{#NUM10{GTN24{JUMP IF 10 OR LESS TO GO
16922: {{DVR{REATT{{{ELSE DIVIDE BY 10**10
16923: {{SUB{#NUM10{R6{{DECREMENT SCALE
16924: {{BRN{GTN23{{{AND LOOP BACK
16925: {{EJC{{{{
16926: *
16927: * GTNUM (CONTINUED)
16928: *
16929: * HERE SCALE REST OF WAY FROM POWERS OF TEN TABLE
16930: *
16931: {GTN24{BZE{R6{GTN30{{JUMP IF SCALED
16932: {{LCT{R7{#CFP$R{{ELSE GET INDEXING FACTOR
16933: {{MOV{#REAV1{R9{{POINT TO POWERS OF TEN TABLE
16934: {{WTB{R6{{{CONVERT REMAINING SCALE TO BYTE OFS
16935: *
16936: * LOOP TO POINT TO POWERS OF TEN TABLE ENTRY
16937: *
16938: {GTN25{ADD{R6{R9{{BUMP POINTER
16939: {{BCT{R7{GTN25{{ONCE FOR EACH VALUE WORD
16940: {{DVR{(R9){{{SCALE DOWN AS REQUIRED
16941: {{BRN{GTN30{{{AND JUMP
16942: *
16943: * COME HERE TO SCALE RESULT UP (POSITIVE EXPONENT)
16944: *
16945: {GTN26{NGI{{{{GET ABSOLUTE VALUE OF EXPONENT
16946: {{IOV{GTN36{{{ERROR IF OVERFLOW
16947: {{MFI{R6{GTN36{{ACQUIRE SCALE, ERROR IF OVFLOW
16948: *
16949: * LOOP TO SCALE UP IN STEPS OF 10**10
16950: *
16951: {GTN27{BLE{R6{#NUM10{GTN28{JUMP IF 10 OR LESS TO GO
16952: {{MLR{REATT{{{ELSE MULTIPLY BY 10**10
16953: {{ROV{GTN36{{{ERROR IF OVERFLOW
16954: {{SUB{#NUM10{R6{{ELSE DECREMENT SCALE
16955: {{BRN{GTN27{{{AND LOOP BACK
16956: *
16957: * HERE TO SCALE UP REST OF WAY WITH TABLE
16958: *
16959: {GTN28{BZE{R6{GTN30{{JUMP IF SCALED
16960: {{LCT{R7{#CFP$R{{ELSE GET INDEXING FACTOR
16961: {{MOV{#REAV1{R9{{POINT TO POWERS OF TEN TABLE
16962: {{WTB{R6{{{CONVERT REMAINING SCALE TO BYTE OFS
16963: *
16964: * LOOP TO POINT TO PROPER ENTRY IN POWERS OF TEN TABLE
16965: *
16966: {GTN29{ADD{R6{R9{{BUMP POINTER
16967: {{BCT{R7{GTN29{{ONCE FOR EACH WORD IN VALUE
16968: {{MLR{(R9){{{SCALE UP
16969: {{ROV{GTN36{{{ERROR IF OVERFLOW
16970: {{EJC{{{{
16971: *
16972: * GTNUM (CONTINUED)
16973: *
16974: * HERE WITH REAL VALUE SCALED AND READY EXCEPT FOR SIGN
16975: *
16976: {GTN30{BZE{GTNNF{GTN31{{JUMP IF POSITIVE
16977: {{NGR{{{{ELSE NEGATE
16978: *
16979: * HERE WITH PROPERLY SIGNED REAL VALUE IN (RA)
16980: *
16981: {GTN31{JSR{RCBLD{{{BUILD REAL BLOCK
16982: {{BRN{GTN33{{{MERGE TO EXIT
16983: *
16984: * HERE WITH PROPERLY SIGNED INTEGER VALUE IN (IA)
16985: *
16986: {GTN32{JSR{ICBLD{{{BUILD ICBLK
16987: *
16988: * REAL MERGES HERE
16989: *
16990: {GTN33{MOV{(R9){R6{{LOAD FIRST WORD OF RESULT BLOCK
16991: {{ICA{SP{{{POP ARGUMENT OFF STACK
16992: *
16993: * COMMON EXIT POINT
16994: *
16995: {GTN34{EXI{{{{RETURN TO GTNUM CALLER
16996: *
16997: * COME HERE IF OVERFLOW OCCURS DURING COLLECTION OF INTEGER
16998: *
16999: {GTN35{LDI{GTNSI{{{RELOAD INTEGER SO FAR
17000: {{ITR{{{{CONVERT TO REAL
17001: {{NGR{{{{MAKE VALUE POSITIVE
17002: {{BRN{GTN11{{{MERGE WITH REAL CIRCUIT
17003: *
17004: * HERE FOR UNCONVERTIBLE TO STRING OR CONVERSION ERROR
17005: *
17006: {GTN36{MOV{(SP)+{R9{{RELOAD ORIGINAL ARGUMENT
17007: {{EXI{1{{{TAKE CONVERT-ERROR EXIT
17008: {{ENP{{{{END PROCEDURE GTNUM
17009: {{EJC{{{{
17010: *
17011: * GTNVR -- CONVERT TO NATURAL VARIABLE
17012: *
17013: * GTNVR LOCATES A VARIABLE BLOCK (VRBLK) GIVEN EITHER AN
17014: * APPROPRIATE NAME (NMBLK) OR A NON-NULL STRING (SCBLK).
17015: *
17016: * (XR) ARGUMENT
17017: * JSR GTNVR CALL TO CONVERT TO NATURAL VARIABLE
17018: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
17019: * (XR) POINTER TO VRBLK
17020: * (WA,WB) DESTROYED (CONVERSION ERROR ONLY)
17021: * (WC) DESTROYED
17022: *
17023: {GTNVR{PRC{E{1{{ENTRY POINT
17024: {{BNE{(R9){#B$NML{GNV02{JUMP IF NOT NAME
17025: {{MOV{4*NMBAS(R9){R9{{ELSE LOAD NAME BASE IF NAME
17026: {{BLO{R9{STATE{GNV07{SKIP IF VRBLK (IN STATIC REGION)
17027: *
17028: * COMMON ERROR EXIT
17029: *
17030: {GNV01{EXI{1{{{TAKE CONVERT-ERROR EXIT
17031: *
17032: * HERE IF NOT NAME
17033: *
17034: {GNV02{MOV{R6{GNVSA{{SAVE WA
17035: {{MOV{R7{GNVSB{{SAVE WB
17036: {{MOV{R9{-(SP){{STACK ARGUMENT FOR GTSTG
17037: {{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING
17038: {{PPM{GNV01{{{JUMP IF CONVERSION ERROR
17039: {{BZE{R6{GNV01{{NULL STRING IS AN ERROR
17040: {{JSR{FLSTG{{{FOLD LOWER CASE TO UPPER CASE
17041: {{MOV{R10{-(SP){{SAVE XL
17042: {{MOV{R9{-(SP){{STACK STRING PTR FOR LATER
17043: {{MOV{R9{R7{{COPY STRING POINTER
17044: {{ADD{#4*SCHAR{R7{{POINT TO CHARACTERS OF STRING
17045: {{MOV{R7{GNVST{{SAVE POINTER TO CHARACTERS
17046: {{MOV{R6{R7{{COPY LENGTH
17047: {{CTW{R7{0{{GET NUMBER OF WORDS IN NAME
17048: {{MOV{R7{GNVNW{{SAVE FOR LATER
17049: {{JSR{HASHS{{{COMPUTE HASH INDEX FOR STRING
17050: {{RMI{HSHNB{{{COMPUTE HASH OFFSET BY TAKING MOD
17051: {{MFI{R8{{{GET AS OFFSET
17052: {{WTB{R8{{{CONVERT OFFSET TO BYTES
17053: {{ADD{HSHTB{R8{{POINT TO PROPER HASH CHAIN
17054: {{SUB{#4*VRNXT{R8{{SUBTRACT OFFSET TO MERGE INTO LOOP
17055: {{EJC{{{{
17056: *
17057: * GTNVR (CONTINUED)
17058: *
17059: * LOOP TO SEARCH HASH CHAIN
17060: *
17061: {GNV03{MOV{R8{R10{{COPY HASH CHAIN POINTER
17062: {{MOV{4*VRNXT(R10){R10{{POINT TO NEXT VRBLK ON CHAIN
17063: {{BZE{R10{GNV08{{JUMP IF END OF CHAIN
17064: {{MOV{R10{R8{{SAVE POINTER TO THIS VRBLK
17065: {{BNZ{4*VRLEN(R10){GNV04{{JUMP IF NOT SYSTEM VARIABLE
17066: {{MOV{4*VRSVP(R10){R10{{ELSE POINT TO SVBLK
17067: {{SUB{#4*VRSOF{R10{{ADJUST OFFSET FOR MERGE
17068: *
17069: * MERGE HERE WITH STRING PTR (LIKE VRBLK) IN XL
17070: *
17071: {GNV04{BNE{R6{4*VRLEN(R10){GNV03{BACK FOR NEXT VRBLK IF LENGTHS NE
17072: {{ADD{#4*VRCHS{R10{{ELSE POINT TO CHARS OF CHAIN ENTRY
17073: {{LCT{R7{GNVNW{{GET WORD COUNTER TO CONTROL LOOP
17074: {{MOV{GNVST{R9{{POINT TO CHARS OF NEW NAME
17075: *
17076: * LOOP TO COMPARE CHARACTERS OF THE TWO NAMES
17077: *
17078: {GNV05{CNE{(R9){(R10){GNV03{JUMP IF NO MATCH FOR NEXT VRBLK
17079: {{ICA{R9{{{BUMP NEW NAME POINTER
17080: {{ICA{R10{{{BUMP VRBLK IN CHAIN NAME POINTER
17081: {{BCT{R7{GNV05{{ELSE LOOP TILL ALL COMPARED
17082: {{MOV{R8{R9{{WE HAVE FOUND A MATCH, GET VRBLK
17083: *
17084: * EXIT POINT AFTER FINDING VRBLK OR BUILDING NEW ONE
17085: *
17086: {GNV06{MOV{GNVSA{R6{{RESTORE WA
17087: {{MOV{GNVSB{R7{{RESTORE WB
17088: {{ICA{SP{{{POP STRING POINTER
17089: {{MOV{(SP)+{R10{{RESTORE XL
17090: *
17091: * COMMON EXIT POINT
17092: *
17093: {GNV07{EXI{{{{RETURN TO GTNVR CALLER
17094: *
17095: * NOT FOUND, PREPARE TO SEARCH SYSTEM VARIABLE TABLE
17096: *
17097: {GNV08{ZER{R9{{{CLEAR GARBAGE XR POINTER
17098: {{MOV{R8{GNVHE{{SAVE PTR TO END OF HASH CHAIN
17099: {{BGT{R6{#NUM09{GNV14{CANNOT BE SYSTEM VAR IF LENGTH GT 9
17100: {{MOV{R6{R10{{ELSE COPY LENGTH
17101: {{WTB{R10{{{CONVERT TO BYTE OFFSET
17102: {{MOV{L^VSRCH(R10){R10{{POINT TO FIRST SVBLK OF THIS LENGTH
17103: {{EJC{{{{
17104: *
17105: * GTNVR (CONTINUED)
17106: *
17107: * LOOP TO SEARCH ENTRIES IN STANDARD VARIABLE TABLE
17108: *
17109: {GNV09{MOV{R10{GNVSP{{SAVE TABLE POINTER
17110: {{MOV{(R10)+{R8{{LOAD SVBIT BIT STRING
17111: {{MOV{(R10)+{R7{{LOAD LENGTH FROM TABLE ENTRY
17112: {{BNE{R6{R7{GNV14{JUMP IF END OF RIGHT LENGTH ENTIRES
17113: {{LCT{R7{GNVNW{{GET WORD COUNTER TO CONTROL LOOP
17114: {{MOV{GNVST{R9{{POINT TO CHARS OF NEW NAME
17115: *
17116: * LOOP TO CHECK FOR MATCHING NAMES
17117: *
17118: {GNV10{CNE{(R9){(R10){GNV11{JUMP IF NAME MISMATCH
17119: {{ICA{R9{{{ELSE BUMP NEW NAME POINTER
17120: {{ICA{R10{{{BUMP SVBLK POINTER
17121: {{BCT{R7{GNV10{{ELSE LOOP UNTIL ALL CHECKED
17122: *
17123: * HERE WE HAVE A MATCH IN THE STANDARD VARIABLE TABLE
17124: *
17125: {{ZER{R8{{{SET VRLEN VALUE ZERO
17126: {{MOV{#4*VRSI${R6{{SET STANDARD SIZE
17127: {{BRN{GNV15{{{JUMP TO BUILD VRBLK
17128: *
17129: * HERE IF NO MATCH WITH TABLE ENTRY IN SVBLKS TABLE
17130: *
17131: {GNV11{ICA{R10{{{BUMP PAST WORD OF CHARS
17132: {{BCT{R7{GNV11{{LOOP BACK IF MORE TO GO
17133: {{RSH{R8{SVNBT{{REMOVE UNINTERESTING BITS
17134: *
17135: * LOOP TO BUMP TABLE PTR FOR EACH FLAGGED WORD
17136: *
17137: {GNV12{MOV{BITS1{R7{{LOAD BIT TO TEST
17138: {{ANB{R8{R7{{TEST FOR WORD PRESENT
17139: {{ZRB{R7{GNV13{{JUMP IF NOT PRESENT
17140: {{ICA{R10{{{ELSE BUMP TABLE POINTER
17141: *
17142: * HERE AFTER DEALING WITH ONE WORD (ONE BIT)
17143: *
17144: {GNV13{RSH{R8{1{{REMOVE BIT ALREADY PROCESSED
17145: {{NZB{R8{GNV12{{LOOP BACK IF MORE BITS TO TEST
17146: {{BRN{GNV09{{{ELSE LOOP BACK FOR NEXT SVBLK
17147: *
17148: * HERE IF NOT SYSTEM VARIABLE
17149: *
17150: {GNV14{MOV{R6{R8{{COPY VRLEN VALUE
17151: {{MOV{#VRCHS{R6{{LOAD STANDARD SIZE -CHARS
17152: {{ADD{GNVNW{R6{{ADJUST FOR CHARS OF NAME
17153: {{WTB{R6{{{CONVERT LENGTH TO BYTES
17154: {{EJC{{{{
17155: *
17156: * GTNVR (CONTINUED)
17157: *
17158: * MERGE HERE TO BUILD VRBLK
17159: *
17160: {GNV15{JSR{ALOST{{{ALLOCATE SPACE FOR VRBLK (STATIC)
17161: {{MOV{R9{R7{{SAVE VRBLK POINTER
17162: {{MOV{#STNVR{R10{{POINT TO MODEL VARIABLE BLOCK
17163: {{MOV{#4*VRLEN{R6{{SET LENGTH OF STANDARD FIELDS
17164: {{MVW{{{{SET INITIAL FIELDS OF NEW BLOCK
17165: {{MOV{GNVHE{R10{{LOAD POINTER TO END OF HASH CHAIN
17166: {{MOV{R7{4*VRNXT(R10){{ADD NEW BLOCK TO END OF CHAIN
17167: {{MOV{R8{(R9)+{{SET VRLEN FIELD, BUMP PTR
17168: {{MOV{GNVNW{R6{{GET LENGTH IN WORDS
17169: {{WTB{R6{{{CONVERT TO LENGTH IN BYTES
17170: {{BZE{R8{GNV16{{JUMP IF SYSTEM VARIABLE
17171: *
17172: * HERE FOR NON-SYSTEM VARIABLE -- SET CHARS OF NAME
17173: *
17174: {{MOV{(SP){R10{{POINT BACK TO STRING NAME
17175: {{ADD{#4*SCHAR{R10{{POINT TO CHARS OF NAME
17176: {{MVW{{{{MOVE CHARACTERS INTO PLACE
17177: {{MOV{R7{R9{{RESTORE VRBLK POINTER
17178: {{BRN{GNV06{{{JUMP BACK TO EXIT
17179: *
17180: * HERE FOR SYSTEM VARIABLE CASE TO FILL IN FIELDS WHERE
17181: * NECESSARY FROM THE FIELDS PRESENT IN THE SVBLK.
17182: *
17183: {GNV16{MOV{GNVSP{R10{{LOAD POINTER TO SVBLK
17184: {{MOV{R10{(R9){{SET SVBLK PTR IN VRBLK
17185: {{MOV{R7{R9{{RESTORE VRBLK POINTER
17186: {{MOV{4*SVBIT(R10){R7{{LOAD BIT INDICATORS
17187: {{ADD{#4*SVCHS{R10{{POINT TO CHARACTERS OF NAME
17188: {{ADD{R6{R10{{POINT PAST CHARACTERS
17189: *
17190: * SKIP PAST KEYWORD NUMBER (SVKNM) IF PRESENT
17191: *
17192: {{MOV{BTKNM{R8{{LOAD TEST BIT
17193: {{ANB{R7{R8{{AND TO TEST
17194: {{ZRB{R8{GNV17{{JUMP IF NO KEYWORD NUMBER
17195: {{ICA{R10{{{ELSE BUMP POINTER
17196: {{EJC{{{{
17197: *
17198: * GTNVR (CONTINUED)
17199: *
17200: * HERE TEST FOR FUNCTION (SVFNC AND SVNAR)
17201: *
17202: {GNV17{MOV{BTFNC{R8{{GET TEST BIT
17203: {{ANB{R7{R8{{AND TO TEST
17204: {{ZRB{R8{GNV18{{SKIP IF NO SYSTEM FUNCTION
17205: {{MOV{R10{4*VRFNC(R9){{ELSE POINT VRFNC TO SVFNC FIELD
17206: {{ADD{#4*NUM02{R10{{AND BUMP PAST SVFNC, SVNAR FIELDS
17207: *
17208: * NOW TEST FOR LABEL (SVLBL)
17209: *
17210: {GNV18{MOV{BTLBL{R8{{GET TEST BIT
17211: {{ANB{R7{R8{{AND TO TEST
17212: {{ZRB{R8{GNV19{{JUMP IF BIT IS OFF (NO SYSTEM LABL)
17213: {{MOV{R10{4*VRLBL(R9){{ELSE POINT VRLBL TO SVLBL FIELD
17214: {{ICA{R10{{{BUMP PAST SVLBL FIELD
17215: *
17216: * NOW TEST FOR VALUE (SVVAL)
17217: *
17218: {GNV19{MOV{BTVAL{R8{{LOAD TEST BIT
17219: {{ANB{R7{R8{{AND TO TEST
17220: {{ZRB{R8{GNV06{{ALL DONE IF NO VALUE
17221: {{MOV{(R10){4*VRVAL(R9){{ELSE SET INITIAL VALUE
17222: {{MOV{#B$VRE{4*VRSTO(R9){{SET ERROR STORE ACCESS
17223: {{BRN{GNV06{{{MERGE BACK TO EXIT TO CALLER
17224: {{ENP{{{{END PROCEDURE GTNVR
17225: {{EJC{{{{
17226: *
17227: * GTPAT -- GET PATTERN
17228: *
17229: * GTPAT IS PASSED AN OBJECT IN (XR) AND RETURNS A
17230: * PATTERN AFTER PERFORMING ANY NECESSARY CONVERSIONS
17231: *
17232: * (XR) INPUT ARGUMENT
17233: * JSR GTPAT CALL TO CONVERT TO PATTERN
17234: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
17235: * (XR) RESULTING PATTERN
17236: * (WA) DESTROYED
17237: * (WB) DESTROYED (ONLY ON CONVERT ERROR)
17238: * (XR) UNCHANGED (ONLY ON CONVERT ERROR)
17239: *
17240: {GTPAT{PRC{E{1{{ENTRY POINT
17241: {{BHI{(R9){#P$AAA{GTPT5{JUMP IF PATTERN ALREADY
17242: *
17243: * HERE IF NOT PATTERN, TRY FOR STRING
17244: *
17245: {{MOV{R7{GTPSB{{SAVE WB
17246: {{MOV{R9{-(SP){{STACK ARGUMENT FOR GTSTG
17247: {{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING
17248: {{PPM{GTPT2{{{JUMP IF IMPOSSIBLE
17249: *
17250: * HERE WE HAVE A STRING
17251: *
17252: {{BNZ{R6{GTPT1{{JUMP IF NON-NULL
17253: *
17254: * HERE FOR NULL STRING. GENERATE POINTER TO NULL PATTERN.
17255: *
17256: {{MOV{#NDNTH{R9{{POINT TO NOTHEN NODE
17257: {{BRN{GTPT4{{{JUMP TO EXIT
17258: {{EJC{{{{
17259: *
17260: * GTPAT (CONTINUED)
17261: *
17262: * HERE FOR NON-NULL STRING
17263: *
17264: {GTPT1{MOV{#P$STR{R7{{LOAD PCODE FOR MULTI-CHAR STRING
17265: {{BNE{R6{#NUM01{GTPT3{JUMP IF MULTI-CHAR STRING
17266: *
17267: * HERE FOR ONE CHARACTER STRING, SHARE ONE CHARACTER ANY
17268: *
17269: {{PLC{R9{{{POINT TO CHARACTER
17270: {{LCH{R6{(R9){{LOAD CHARACTER
17271: {{MOV{R6{R9{{SET AS PARM1
17272: {{MOV{#P$ANS{R7{{POINT TO PCODE FOR 1-CHAR ANY
17273: {{BRN{GTPT3{{{JUMP TO BUILD NODE
17274: *
17275: * HERE IF ARGUMENT IS NOT CONVERTIBLE TO STRING
17276: *
17277: {GTPT2{MOV{#P$EXA{R7{{SET PCODE FOR EXPRESSION IN CASE
17278: {{BLO{(R9){#B$E$${GTPT3{JUMP TO BUILD NODE IF EXPRESSION
17279: *
17280: * HERE WE HAVE AN ERROR (CONVERSION IMPOSSIBLE)
17281: *
17282: {{EXI{1{{{TAKE CONVERT ERROR EXIT
17283: *
17284: * MERGE HERE TO BUILD NODE FOR STRING OR EXPRESSION
17285: *
17286: {GTPT3{JSR{PBILD{{{CALL ROUTINE TO BUILD PATTERN NODE
17287: *
17288: * COMMON EXIT AFTER SUCCESSFUL CONVERSION
17289: *
17290: {GTPT4{MOV{GTPSB{R7{{RESTORE WB
17291: *
17292: * MERGE HERE TO EXIT OF NO CONVERSION REQUIRED
17293: *
17294: {GTPT5{EXI{{{{RETURN TO GTPAT CALLER
17295: {{ENP{{{{END PROCEDURE GTPAT
17296: {{EJC{{{{
17297: *
17298: * GTREA -- GET REAL VALUE
17299: *
17300: * GTREA IS PASSED AN OBJECT AND RETURNS A REAL VALUE
17301: * PERFORMING ANY NECESSARY CONVERSIONS.
17302: *
17303: * (XR) OBJECT TO BE CONVERTED
17304: * JSR GTREA CALL TO CONVERT OBJECT TO REAL
17305: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
17306: * (XR) POINTER TO RESULTING REAL
17307: * (WA,WB,WC,RA) DESTROYED
17308: * (XR) UNCHANGED (CONVERT ERROR ONLY)
17309: *
17310: {GTREA{PRC{E{1{{ENTRY POINT
17311: {{MOV{(R9){R6{{GET FIRST WORD OF BLOCK
17312: {{BEQ{R6{#B$RCL{GTRE2{JUMP IF REAL
17313: {{JSR{GTNUM{{{ELSE CONVERT ARGUMENT TO NUMERIC
17314: {{PPM{GTRE3{{{JUMP IF UNCONVERTIBLE
17315: {{BEQ{R6{#B$RCL{GTRE2{JUMP IF REAL WAS RETURNED
17316: *
17317: * HERE FOR CASE OF AN INTEGER TO CONVERT TO REAL
17318: *
17319: {GTRE1{LDI{4*ICVAL(R9){{{LOAD INTEGER
17320: {{ITR{{{{CONVERT TO REAL
17321: {{JSR{RCBLD{{{BUILD RCBLK
17322: *
17323: * EXIT WITH REAL
17324: *
17325: {GTRE2{EXI{{{{RETURN TO GTREA CALLER
17326: *
17327: * HERE ON CONVERSION ERROR
17328: *
17329: {GTRE3{EXI{1{{{TAKE CONVERT ERROR EXIT
17330: {{ENP{{{{END PROCEDURE GTREA
17331: {{EJC{{{{
17332: *
17333: * GTSMI -- GET SMALL INTEGER
17334: *
17335: * GTSMI IS PASSED A SNOBOL OBJECT AND RETURNS AN ADDRESS
17336: * INTEGER IN THE RANGE (0 LE N LE DNAMB). SUCH A VALUE CAN
17337: * ONLY BE DERIVED FROM AN INTEGER IN THE APPROPRIATE RANGE.
17338: * SMALL INTEGERS NEVER APPEAR AS SNOBOL VALUES. HOWEVER,
17339: * THEY ARE USED INTERNALLY FOR A VARIETY OF PURPOSES.
17340: *
17341: * -(XS) ARGUMENT TO CONVERT (ON STACK)
17342: * JSR GTSMI CALL TO CONVERT TO SMALL INTEGER
17343: * PPM LOC TRANSFER LOC FOR NOT INTEGER
17344: * PPM LOC TRANSFER LOC FOR LT 0, GT DNAMB
17345: * (XR,WC) RESULTING SMALL INT (TWO COPIES)
17346: * (XS) POPPED
17347: * (RA) DESTROYED
17348: * (WA,WB) DESTROYED (ON CONVERT ERROR ONLY)
17349: * (XR) INPUT ARG (CONVERT ERROR ONLY)
17350: *
17351: {GTSMI{PRC{N{2{{ENTRY POINT
17352: {{MOV{(SP)+{R9{{LOAD ARGUMENT
17353: {{BEQ{(R9){#B$ICL{GTSM1{SKIP IF ALREADY AN INTEGER
17354: *
17355: * HERE IF NOT AN INTEGER
17356: *
17357: {{JSR{GTINT{{{CONVERT ARGUMENT TO INTEGER
17358: {{PPM{GTSM2{{{JUMP IF CONVERT IS IMPOSSIBLE
17359: *
17360: * MERGE HERE WITH INTEGER
17361: *
17362: {GTSM1{LDI{4*ICVAL(R9){{{LOAD INTEGER VALUE
17363: {{MFI{R8{GTSM3{{MOVE AS ONE WORD, JUMP IF OVFLOW
17364: {{BGT{R8{MXLEN{GTSM3{OR IF TOO SMALL
17365: {{MOV{R8{R9{{COPY RESULT TO XR
17366: {{EXI{{{{RETURN TO GTSMI CALLER
17367: *
17368: * HERE IF UNCONVERTIBLE TO INTEGER
17369: *
17370: {GTSM2{EXI{1{{{TAKE NON-INTEGER ERROR EXIT
17371: *
17372: * HERE IF OUT OF RANGE
17373: *
17374: {GTSM3{EXI{2{{{TAKE OUT-OF-RANGE ERROR EXIT
17375: {{ENP{{{{END PROCEDURE GTSMI
17376: {{EJC{{{{
17377: *
17378: * GTSTG -- GET STRING
17379: *
17380: * GTSTG IS PASSED AN OBJECT AND RETURNS A STRING WITH
17381: * ANY NECESSARY CONVERSIONS PERFORMED.
17382: *
17383: * -(XS) INPUT ARGUMENT (ON STACK)
17384: * JSR GTSTG CALL TO CONVERT TO STRING
17385: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
17386: * (XR) POINTER TO RESULTING STRING
17387: * (WA) LENGTH OF STRING IN CHARACTERS
17388: * (XS) POPPED
17389: * (RA) DESTROYED
17390: * (XR) INPUT ARG (CONVERT ERROR ONLY)
17391: *
17392: {GTSTG{PRC{N{1{{ENTRY POINT
17393: {{MOV{(SP)+{R9{{LOAD ARGUMENT, POP STACK
17394: {{BEQ{(R9){#B$SCL{GTS30{JUMP IF ALREADY A STRING
17395: *
17396: * HERE IF NOT A STRING ALREADY
17397: *
17398: {GTS01{MOV{R9{-(SP){{RESTACK ARGUMENT IN CASE ERROR
17399: {{MOV{R10{-(SP){{SAVE XL
17400: {{MOV{R7{GTSVB{{SAVE WB
17401: {{MOV{R8{GTSVC{{SAVE WC
17402: {{MOV{(R9){R6{{LOAD FIRST WORD OF BLOCK
17403: {{BEQ{R6{#B$ICL{GTS05{JUMP TO CONVERT INTEGER
17404: {{BEQ{R6{#B$RCL{GTS10{JUMP TO CONVERT REAL
17405: {{BEQ{R6{#B$NML{GTS03{JUMP TO CONVERT NAME
17406: {{BEQ{R6{#B$BCT{GTS32{JUMP TO CONVERT BUFFER
17407: *
17408: * HERE ON CONVERSION ERROR
17409: *
17410: {GTS02{MOV{(SP)+{R10{{RESTORE XL
17411: {{MOV{(SP)+{R9{{RELOAD INPUT ARGUMENT
17412: {{EXI{1{{{TAKE CONVERT ERROR EXIT
17413: {{EJC{{{{
17414: *
17415: * GTSTG (CONTINUED)
17416: *
17417: * HERE TO CONVERT A NAME (ONLY POSSIBLE IF NATURAL VAR)
17418: *
17419: {GTS03{MOV{4*NMBAS(R9){R10{{LOAD NAME BASE
17420: {{BHI{R10{STATE{GTS02{ERROR IF NOT NATURAL VAR (STATIC)
17421: {{ADD{#4*VRSOF{R10{{ELSE POINT TO POSSIBLE STRING NAME
17422: {{MOV{4*SCLEN(R10){R6{{LOAD LENGTH
17423: {{BNZ{R6{GTS04{{JUMP IF NOT SYSTEM VARIABLE
17424: {{MOV{4*VRSVO(R10){R10{{ELSE POINT TO SVBLK
17425: {{MOV{4*SVLEN(R10){R6{{AND LOAD NAME LENGTH
17426: *
17427: * MERGE HERE WITH STRING IN XR, LENGTH IN WA
17428: *
17429: {GTS04{ZER{R7{{{SET OFFSET TO ZERO
17430: {{JSR{SBSTR{{{USE SBSTR TO COPY STRING
17431: {{BRN{GTS29{{{JUMP TO EXIT
17432: *
17433: * COME HERE TO CONVERT AN INTEGER
17434: *
17435: {GTS05{LDI{4*ICVAL(R9){{{LOAD INTEGER VALUE
17436: {{MOV{#NUM01{GTSSF{{SET SIGN FLAG NEGATIVE
17437: {{ILT{GTS06{{{SKIP IF INTEGER IS NEGATIVE
17438: {{NGI{{{{ELSE NEGATE INTEGER
17439: {{ZER{GTSSF{{{AND RESET NEGATIVE FLAG
17440: {{EJC{{{{
17441: *
17442: * GTSTG (CONTINUED)
17443: *
17444: * HERE WITH SIGN FLAG SET AND SIGN FORCED NEGATIVE AS
17445: * REQUIRED BY THE CVD INSTRUCTION.
17446: *
17447: {GTS06{MOV{GTSWK{R9{{POINT TO RESULT WORK AREA
17448: {{MOV{#NSTMX{R7{{INITIALIZE COUNTER TO MAX LENGTH
17449: {{PSC{R9{R7{{PREPARE TO STORE (RIGHT-LEFT)
17450: *
17451: * LOOP TO CONVERT DIGITS INTO WORK AREA
17452: *
17453: {GTS07{CVD{{{{CONVERT ONE DIGIT INTO WA
17454: {{SCH{R6{-(R9){{STORE IN WORK AREA
17455: {{DCV{R7{{{DECREMENT COUNTER
17456: {{INE{GTS07{{{LOOP IF MORE DIGITS TO GO
17457: {{CSC{R9{{{COMPLETE STORE CHARACTERS
17458: *
17459: * MERGE HERE AFTER CONVERTING INTEGER OR REAL INTO WORK
17460: * AREA. WB IS SET TO NSTMX - (NUMBER OF CHARS IN RESULT).
17461: *
17462: {GTS08{MOV{#NSTMX{R6{{GET MAX NUMBER OF CHARACTERS
17463: {{SUB{R7{R6{{COMPUTE LENGTH OF RESULT
17464: {{MOV{R6{R10{{REMEMBER LENGTH FOR MOVE LATER ON
17465: {{ADD{GTSSF{R6{{ADD ONE FOR NEGATIVE SIGN IF NEEDED
17466: {{JSR{ALOCS{{{ALLOCATE STRING FOR RESULT
17467: {{MOV{R9{R8{{SAVE RESULT POINTER FOR THE MOMENT
17468: {{PSC{R9{{{POINT TO CHARS OF RESULT BLOCK
17469: {{BZE{GTSSF{GTS09{{SKIP IF POSITIVE
17470: {{MOV{#CH$MN{R6{{ELSE LOAD NEGATIVE SIGN
17471: {{SCH{R6{(R9)+{{AND STORE IT
17472: {{CSC{R9{{{COMPLETE STORE CHARACTERS
17473: *
17474: * HERE AFTER DEALING WITH SIGN
17475: *
17476: {GTS09{MOV{R10{R6{{RECALL LENGTH TO MOVE
17477: {{MOV{GTSWK{R10{{POINT TO RESULT WORK AREA
17478: {{PLC{R10{R7{{POINT TO FIRST RESULT CHARACTER
17479: {{MVC{{{{MOVE CHARS TO RESULT STRING
17480: {{MOV{R8{R9{{RESTORE RESULT POINTER
17481: {{BRN{GTS29{{{JUMP TO EXIT
17482: {{EJC{{{{
17483: *
17484: * GTSTG (CONTINUED)
17485: *
17486: * HERE TO CONVERT A REAL
17487: *
17488: {GTS10{LDR{4*RCVAL(R9){{{LOAD REAL
17489: {{ZER{GTSSF{{{RESET NEGATIVE FLAG
17490: {{REQ{GTS31{{{SKIP IF ZERO
17491: {{RGE{GTS11{{{JUMP IF REAL IS POSITIVE
17492: {{MOV{#NUM01{GTSSF{{ELSE SET NEGATIVE FLAG
17493: {{NGR{{{{AND GET ABSOLUTE VALUE OF REAL
17494: *
17495: * NOW SCALE THE REAL TO THE RANGE (0.1 LE X LT 1.0)
17496: *
17497: {GTS11{LDI{INTV0{{{INITIALIZE EXPONENT TO ZERO
17498: *
17499: * LOOP TO SCALE UP IN STEPS OF 10**10
17500: *
17501: {GTS12{STR{GTSRS{{{SAVE REAL VALUE
17502: {{SBR{REAP1{{{SUBTRACT 0.1 TO COMPARE
17503: {{RGE{GTS13{{{JUMP IF SCALE UP NOT REQUIRED
17504: {{LDR{GTSRS{{{ELSE RELOAD VALUE
17505: {{MLR{REATT{{{MULTIPLY BY 10**10
17506: {{SBI{INTVT{{{DECREMENT EXPONENT BY 10
17507: {{BRN{GTS12{{{LOOP BACK TO TEST AGAIN
17508: *
17509: * TEST FOR SCALE DOWN REQUIRED
17510: *
17511: {GTS13{LDR{GTSRS{{{RELOAD VALUE
17512: {{SBR{REAV1{{{SUBTRACT 1.0
17513: {{RLT{GTS17{{{JUMP IF NO SCALE DOWN REQUIRED
17514: {{LDR{GTSRS{{{ELSE RELOAD VALUE
17515: *
17516: * LOOP TO SCALE DOWN IN STEPS OF 10**10
17517: *
17518: {GTS14{SBR{REATT{{{SUBTRACT 10**10 TO COMPARE
17519: {{RLT{GTS15{{{JUMP IF LARGE STEP NOT REQUIRED
17520: {{LDR{GTSRS{{{ELSE RESTORE VALUE
17521: {{DVR{REATT{{{DIVIDE BY 10**10
17522: {{STR{GTSRS{{{STORE NEW VALUE
17523: {{ADI{INTVT{{{INCREMENT EXPONENT BY 10
17524: {{BRN{GTS14{{{LOOP BACK
17525: {{EJC{{{{
17526: *
17527: * GTSTG (CONTINUED)
17528: *
17529: * AT THIS POINT WE HAVE (1.0 LE X LT 10**10)
17530: * COMPLETE SCALING WITH POWERS OF TEN TABLE
17531: *
17532: {GTS15{MOV{#REAV1{R9{{POINT TO POWERS OF TEN TABLE
17533: *
17534: * LOOP TO LOCATE CORRECT ENTRY IN TABLE
17535: *
17536: {GTS16{LDR{GTSRS{{{RELOAD VALUE
17537: {{ADI{INTV1{{{INCREMENT EXPONENT
17538: {{ADD{#4*CFP$R{R9{{POINT TO NEXT ENTRY IN TABLE
17539: {{SBR{(R9){{{SUBTRACT IT TO COMPARE
17540: {{RGE{GTS16{{{LOOP TILL WE FIND A LARGER ENTRY
17541: {{LDR{GTSRS{{{THEN RELOAD THE VALUE
17542: {{DVR{(R9){{{AND COMPLETE SCALING
17543: {{STR{GTSRS{{{STORE VALUE
17544: *
17545: * WE ARE NOW SCALED, SO ROUND BY ADDING 0.5 * 10**(-CFP$S)
17546: *
17547: {GTS17{LDR{GTSRS{{{GET VALUE AGAIN
17548: {{ADR{GTSRN{{{ADD ROUNDING FACTOR
17549: {{STR{GTSRS{{{STORE RESULT
17550: *
17551: * THE ROUNDING OPERATION MAY HAVE PUSHED US UP PAST
17552: * 1.0 AGAIN, SO CHECK ONE MORE TIME.
17553: *
17554: {{SBR{REAV1{{{SUBTRACT 1.0 TO COMPARE
17555: {{RLT{GTS18{{{SKIP IF OK
17556: {{ADI{INTV1{{{ELSE INCREMENT EXPONENT
17557: {{LDR{GTSRS{{{RELOAD VALUE
17558: {{DVR{REAVT{{{DIVIDE BY 10.0 TO RESCALE
17559: {{BRN{GTS19{{{JUMP TO MERGE
17560: *
17561: * HERE IF ROUNDING DID NOT MUCK UP SCALING
17562: *
17563: {GTS18{LDR{GTSRS{{{RELOAD ROUNDED VALUE
17564: {{EJC{{{{
17565: *
17566: * GTSTG (CONTINUED)
17567: *
17568: * NOW WE HAVE COMPLETED THE SCALING AS FOLLOWS
17569: *
17570: * (IA) SIGNED EXPONENT
17571: * (RA) SCALED REAL (ABSOLUTE VALUE)
17572: *
17573: * IF THE EXPONENT IS NEGATIVE OR GREATER THAN CFP$S, THEN
17574: * WE CONVERT THE NUMBER IN THE FORM.
17575: *
17576: * (NEG SIGN) 0 . (CPF$S DIGITS) E (EXP SIGN) (EXP DIGITS)
17577: *
17578: * IF THE EXPONENT IS POSITIVE AND LESS THAN OR EQUAL TO
17579: * CFP$S, THE NUMBER IS CONVERTED IN THE FORM.
17580: *
17581: * (NEG SIGN) (EXPONENT DIGITS) . (CFP$S-EXPONENT DIGITS)
17582: *
17583: * IN BOTH CASES, THE FORMATS OBTAINED FROM THE ABOVE
17584: * RULES ARE MODIFIED BY DELETING TRAILING ZEROS AFTER THE
17585: * DECIMAL POINT. THERE ARE NO LEADING ZEROS IN THE EXPONENT
17586: * AND THE EXPONENT SIGN IS ALWAYS PRESENT.
17587: *
17588: {GTS19{MOV{#CFP$S{R10{{SET NUM DEC DIGITS = CFP$S
17589: {{MOV{#CH$MN{GTSES{{SET EXPONENT SIGN NEGATIVE
17590: {{ILT{GTS21{{{ALL SET IF EXPONENT IS NEGATIVE
17591: {{MFI{R6{{{ELSE FETCH EXPONENT
17592: {{BLE{R6{#CFP$S{GTS20{SKIP IF WE CAN USE SPECIAL FORMAT
17593: {{MTI{R6{{{ELSE RESTORE EXPONENT
17594: {{NGI{{{{SET NEGATIVE FOR CVD
17595: {{MOV{#CH$PL{GTSES{{SET PLUS SIGN FOR EXPONENT SIGN
17596: {{BRN{GTS21{{{JUMP TO GENERATE EXPONENT
17597: *
17598: * HERE IF WE CAN USE THE FORMAT WITHOUT AN EXPONENT
17599: *
17600: {GTS20{SUB{R6{R10{{COMPUTE DIGITS AFTER DECIMAL POINT
17601: {{LDI{INTV0{{{RESET EXPONENT TO ZERO
17602: {{EJC{{{{
17603: *
17604: * GTSTG (CONTINUED)
17605: *
17606: * MERGE HERE AS FOLLOWS
17607: *
17608: * (IA) EXPONENT ABSOLUTE VALUE
17609: * GTSES CHARACTER FOR EXPONENT SIGN
17610: * (RA) POSITIVE FRACTION
17611: * (XL) NUMBER OF DIGITS AFTER DEC POINT
17612: *
17613: {GTS21{MOV{GTSWK{R9{{POINT TO WORK AREA
17614: {{MOV{#NSTMX{R7{{SET CHARACTER CTR TO MAX LENGTH
17615: {{PSC{R9{R7{{PREPARE TO STORE (RIGHT TO LEFT)
17616: {{IEQ{GTS23{{{SKIP EXPONENT IF IT IS ZERO
17617: *
17618: * LOOP TO GENERATE DIGITS OF EXPONENT
17619: *
17620: {GTS22{CVD{{{{CONVERT A DIGIT INTO WA
17621: {{SCH{R6{-(R9){{STORE IN WORK AREA
17622: {{DCV{R7{{{DECREMENT COUNTER
17623: {{INE{GTS22{{{LOOP BACK IF MORE DIGITS TO GO
17624: *
17625: * HERE GENERATE EXPONENT SIGN AND E
17626: *
17627: {{MOV{GTSES{R6{{LOAD EXPONENT SIGN
17628: {{SCH{R6{-(R9){{STORE IN WORK AREA
17629: {{MOV{#CH$LE{R6{{GET CHARACTER LETTER E
17630: {{SCH{R6{-(R9){{STORE IN WORK AREA
17631: {{SUB{#NUM02{R7{{DECREMENT COUNTER FOR SIGN AND E
17632: *
17633: * HERE TO GENERATE THE FRACTION
17634: *
17635: {GTS23{MLR{GTSSC{{{CONVERT REAL TO INTEGER (10**CFP$S)
17636: {{RTI{{{{GET INTEGER (OVERFLOW IMPOSSIBLE)
17637: {{NGI{{{{NEGATE AS REQUIRED BY CVD
17638: *
17639: * LOOP TO SUPPRESS TRAILING ZEROS
17640: *
17641: {GTS24{BZE{R10{GTS27{{JUMP IF NO DIGITS LEFT TO DO
17642: {{CVD{{{{ELSE CONVERT ONE DIGIT
17643: {{BNE{R6{#CH$D0{GTS26{JUMP IF NOT A ZERO
17644: {{DCV{R10{{{DECREMENT COUNTER
17645: {{BRN{GTS24{{{LOOP BACK FOR NEXT DIGIT
17646: {{EJC{{{{
17647: *
17648: * GTSTG (CONTINUED)
17649: *
17650: * LOOP TO GENERATE DIGITS AFTER DECIMAL POINT
17651: *
17652: {GTS25{CVD{{{{CONVERT A DIGIT INTO WA
17653: *
17654: * MERGE HERE FIRST TIME
17655: *
17656: {GTS26{SCH{R6{-(R9){{STORE DIGIT
17657: {{DCV{R7{{{DECREMENT COUNTER
17658: {{DCV{R10{{{DECREMENT COUNTER
17659: {{BNZ{R10{GTS25{{LOOP BACK IF MORE TO GO
17660: *
17661: * HERE GENERATE THE DECIMAL POINT
17662: *
17663: {GTS27{MOV{#CH$DT{R6{{LOAD DECIMAL POINT
17664: {{SCH{R6{-(R9){{STORE IN WORK AREA
17665: {{DCV{R7{{{DECREMENT COUNTER
17666: *
17667: * HERE GENERATE THE DIGITS BEFORE THE DECIMAL POINT
17668: *
17669: {GTS28{CVD{{{{CONVERT A DIGIT INTO WA
17670: {{SCH{R6{-(R9){{STORE IN WORK AREA
17671: {{DCV{R7{{{DECREMENT COUNTER
17672: {{INE{GTS28{{{LOOP BACK IF MORE TO GO
17673: {{CSC{R9{{{COMPLETE STORE CHARACTERS
17674: {{BRN{GTS08{{{ELSE JUMP BACK TO EXIT
17675: *
17676: * EXIT POINT AFTER SUCCESSFUL CONVERSION
17677: *
17678: {GTS29{MOV{(SP)+{R10{{RESTORE XL
17679: {{ICA{SP{{{POP ARGUMENT
17680: {{MOV{GTSVB{R7{{RESTORE WB
17681: {{MOV{GTSVC{R8{{RESTORE WC
17682: *
17683: * MERGE HERE IF NO CONVERSION REQUIRED
17684: *
17685: {GTS30{MOV{4*SCLEN(R9){R6{{LOAD STRING LENGTH
17686: {{EXI{{{{RETURN TO CALLER
17687: *
17688: * HERE TO RETURN STRING FOR REAL ZERO
17689: *
17690: {GTS31{MOV{#SCRE0{R10{{POINT TO STRING
17691: {{MOV{#NUM02{R6{{2 CHARS
17692: {{ZER{R7{{{ZERO OFFSET
17693: {{JSR{SBSTR{{{COPY STRING
17694: {{BRN{GTS29{{{RETURN
17695: {{EJC{{{{
17696: *
17697: * HERE TO CONVERT A BUFFER BLOCK
17698: *
17699: {GTS32{MOV{R9{R10{{COPY ARG PTR
17700: {{MOV{4*BCLEN(R10){R6{{GET SIZE TO ALLOCATE
17701: {{BZE{R6{GTS33{{IF NULL THEN RETURN NULL
17702: {{JSR{ALOCS{{{ALLOCATE STRING FRAME
17703: {{MOV{R9{R7{{SAVE STRING PTR
17704: {{MOV{4*SCLEN(R9){R6{{GET LENGTH TO MOVE
17705: {{CTB{R6{0{{GET AS MULTIPLE OF WORD SIZE
17706: {{MOV{4*BCBUF(R10){R10{{POINT TO BFBLK
17707: {{ADD{#4*SCSI${R9{{POINT TO START OF CHARACTER AREA
17708: {{ADD{#4*BFSI${R10{{POINT TO START OF BUFFER CHARS
17709: {{MVW{{{{COPY WORDS
17710: {{MOV{R7{R9{{RESTORE SCBLK PTR
17711: {{BRN{GTS29{{{EXIT WITH SCBLK
17712: *
17713: * HERE WHEN NULL BUFFER IS BEING CONVERTED
17714: *
17715: {GTS33{MOV{#NULLS{R9{{POINT TO NULL
17716: {{BRN{GTS29{{{EXIT WITH NULL
17717: {{ENP{{{{END PROCEDURE GTSTG
17718: {{EJC{{{{
17719: *
17720: * GTVAR -- GET VARIABLE FOR I/O/TRACE ASSOCIATION
17721: *
17722: * GTVAR IS USED TO POINT TO AN ACTUAL VARIABLE LOCATION
17723: * FOR THE DETACH,INPUT,OUTPUT,TRACE,STOPTR SYSTEM FUNCTIONS
17724: *
17725: * (XR) ARGUMENT TO FUNCTION
17726: * JSR GTVAR CALL TO LOCATE VARIABLE POINTER
17727: * PPM LOC TRANSFER LOC IF NOT OK VARIABLE
17728: * (XL,WA) NAME BASE,OFFSET OF VARIABLE
17729: * (XR,RA) DESTROYED
17730: * (WB,WC) DESTROYED (CONVERT ERROR ONLY)
17731: * (XR) INPUT ARG (CONVERT ERROR ONLY)
17732: *
17733: {GTVAR{PRC{E{1{{ENTRY POINT
17734: {{BNE{(R9){#B$NML{GTVR2{JUMP IF NOT A NAME
17735: {{MOV{4*NMOFS(R9){R6{{ELSE LOAD NAME OFFSET
17736: {{MOV{4*NMBAS(R9){R10{{LOAD NAME BASE
17737: {{BEQ{(R10){#B$EVT{GTVR1{ERROR IF EXPRESSION VARIABLE
17738: {{BNE{(R10){#B$KVT{GTVR3{ALL OK IF NOT KEYWORD VARIABLE
17739: *
17740: * HERE ON CONVERSION ERROR
17741: *
17742: {GTVR1{EXI{1{{{TAKE CONVERT ERROR EXIT
17743: *
17744: * HERE IF NOT A NAME, TRY CONVERT TO NATURAL VARIABLE
17745: *
17746: {GTVR2{MOV{R8{GTVRC{{SAVE WC
17747: {{JSR{GTNVR{{{LOCATE VRBLK IF POSSIBLE
17748: {{PPM{GTVR1{{{JUMP IF CONVERT ERROR
17749: {{MOV{R9{R10{{ELSE COPY VRBLK NAME BASE
17750: {{MOV{#4*VRVAL{R6{{AND SET OFFSET
17751: {{MOV{GTVRC{R8{{RESTORE WC
17752: *
17753: * HERE FOR NAME OBTAINED
17754: *
17755: {GTVR3{BHI{R10{STATE{GTVR4{ALL OK IF NOT NATURAL VARIABLE
17756: {{BEQ{4*VRSTO(R10){#B$VRE{GTVR1{ERROR IF PROTECTED VARIABLE
17757: *
17758: * COMMON EXIT POINT
17759: *
17760: {GTVR4{EXI{{{{RETURN TO CALLER
17761: {{ENP{{{{END PROCEDURE GTVAR
17762: {{EJC{{{{
17763: *
17764: * HASHS -- COMPUTE HASH INDEX FOR STRING
17765: *
17766: * HASHS IS USED TO CONVERT A STRING TO A UNIQUE INTEGER
17767: * VALUE. THE RESULTING HASH VALUE IS A POSITIVE INTEGER
17768: * IN THE RANGE 0 TO CFP$M
17769: *
17770: * (XR) STRING TO BE HASHED
17771: * JSR HASHS CALL TO HASH STRING
17772: * (IA) HASH VALUE
17773: * (XR,WB,WC) DESTROYED
17774: *
17775: * THE HASH FUNCTION USED IS AS FOLLOWS.
17776: *
17777: * START WITH THE LENGTH OF THE STRING (SGD07)
17778: *
17779: * TAKE THE FIRST E$HNW WORDS OF THE CHARACTERS FROM
17780: * THE STRING OR ALL THE WORDS IF FEWER THAN E$HNW.
17781: *
17782: * COMPUTE THE EXCLUSIVE OR OF ALL THESE WORDS TREATING
17783: * THEM AS ONE WORD BIT STRING VALUES.
17784: *
17785: * MOVE THE RESULT AS AN INTEGER WITH THE MTI INSTRUCTION.
17786: *
17787: {HASHS{PRC{E{0{{ENTRY POINT
17788: {{MOV{4*SCLEN(R9){R8{{LOAD STRING LENGTH IN CHARACTERS
17789: {{MOV{R8{R7{{INITIALIZE WITH LENGTH
17790: {{BZE{R8{HSHS3{{JUMP IF NULL STRING
17791: {{CTW{R8{0{{ELSE GET NUMBER OF WORDS OF CHARS
17792: {{ADD{#4*SCHAR{R9{{POINT TO CHARACTERS OF STRING
17793: {{BLO{R8{#E$HNW{HSHS1{USE WHOLE STRING IF SHORT
17794: {{MOV{#E$HNW{R8{{ELSE SET TO INVOLVE FIRST E$HNW WDS
17795: *
17796: * HERE WITH COUNT OF WORDS TO CHECK IN WC
17797: *
17798: {HSHS1{LCT{R8{R8{{SET COUNTER TO CONTROL LOOP
17799: *
17800: * LOOP TO COMPUTE EXCLUSIVE OR
17801: *
17802: {HSHS2{XOB{(R9)+{R7{{EXCLUSIVE OR NEXT WORD OF CHARS
17803: {{BCT{R8{HSHS2{{LOOP TILL ALL PROCESSED
17804: *
17805: * MERGE HERE WITH EXCLUSIVE OR IN WB
17806: *
17807: {HSHS3{ZGB{R7{{{ZEROISE UNDEFINED BITS
17808: {{ANB{BITSM{R7{{ENSURE IN RANGE 0 TO CFP$M
17809: {{MTI{R7{{{MOVE RESULT AS INTEGER
17810: {{ZER{R9{{{CLEAR GARBAGE VALUE IN XR
17811: {{EXI{{{{RETURN TO HASHS CALLER
17812: {{ENP{{{{END PROCEDURE HASHS
17813: {{EJC{{{{
17814: *
17815: * ICBLD -- BUILD INTEGER BLOCK
17816: *
17817: * (IA) INTEGER VALUE FOR ICBLK
17818: * JSR ICBLD CALL TO BUILD INTEGER BLOCK
17819: * (XR) POINTER TO RESULT ICBLK
17820: * (WA) DESTROYED
17821: *
17822: {ICBLD{PRC{E{0{{ENTRY POINT
17823: {{MFI{R9{ICBL1{{COPY SMALL INTEGERS
17824: {{BLE{R9{#NUM02{ICBL3{JUMP IF 0,1 OR 2
17825: *
17826: * CONSTRUCT ICBLK
17827: *
17828: {ICBL1{MOV{DNAMP{R9{{LOAD POINTER TO NEXT AVAILABLE LOC
17829: {{ADD{#4*ICSI${R9{{POINT PAST NEW ICBLK
17830: {{BLO{R9{DNAME{ICBL2{JUMP IF THERE IS ROOM
17831: {{MOV{#4*ICSI${R6{{ELSE LOAD LENGTH OF ICBLK
17832: {{JSR{ALLOC{{{USE STANDARD ALLOCATOR TO GET BLOCK
17833: {{ADD{R6{R9{{POINT PAST BLOCK TO MERGE
17834: *
17835: * MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED
17836: *
17837: {ICBL2{MOV{R9{DNAMP{{SET NEW POINTER
17838: {{SUB{#4*ICSI${R9{{POINT BACK TO START OF BLOCK
17839: {{MOV{#B$ICL{(R9){{STORE TYPE WORD
17840: {{STI{4*ICVAL(R9){{{STORE INTEGER VALUE IN ICBLK
17841: {{EXI{{{{RETURN TO ICBLD CALLER
17842: *
17843: * OPTIMISE BY NOT BUILDING ICBLKS FOR SMALL INTEGERS
17844: *
17845: {ICBL3{WTB{R9{{{CONVERT INTEGER TO OFFSET
17846: {{MOV{L^INTAB(R9){R9{{POINT TO PRE-BUILT ICBLK
17847: {{EXI{{{{RETURN
17848: {{ENP{{{{END PROCEDURE ICBLD
17849: {{EJC{{{{
17850: *
17851: * IDENT -- COMPARE TWO VALUES
17852: *
17853: * IDENT COMPARES TWO VALUES IN THE SENSE OF THE IDENT
17854: * DIFFER FUNCTIONS AVAILABLE AT THE SNOBOL LEVEL.
17855: *
17856: * (XR) FIRST ARGUMENT
17857: * (XL) SECOND ARGUMENT
17858: * JSR IDENT CALL TO COMPARE ARGUMENTS
17859: * PPM LOC TRANSFER LOC IF IDENT
17860: * (NORMAL RETURN IF DIFFER)
17861: * (XR,XL,WC,RA) DESTROYED
17862: *
17863: {IDENT{PRC{E{1{{ENTRY POINT
17864: {{BEQ{R9{R10{IDEN7{JUMP IF SAME POINTER (IDENT)
17865: {{MOV{(R9){R8{{ELSE LOAD ARG 1 TYPE WORD
17866: {{BNE{R8{(R10){IDEN1{DIFFER IF ARG 2 TYPE WORD DIFFER
17867: {{BEQ{R8{#B$SCL{IDEN2{JUMP IF STRINGS
17868: {{BEQ{R8{#B$ICL{IDEN4{JUMP IF INTEGERS
17869: {{BEQ{R8{#B$RCL{IDEN5{JUMP IF REALS
17870: {{BEQ{R8{#B$NML{IDEN6{JUMP IF NAMES
17871: *
17872: * FOR ALL OTHER DATATYPES, MUST BE DIFFER IF XR NE XL
17873: *
17874: * MERGE HERE FOR DIFFER
17875: *
17876: {IDEN1{EXI{{{{TAKE DIFFER EXIT
17877: *
17878: * HERE FOR STRINGS, IDENT ONLY IF LENGTHS AND CHARS SAME
17879: *
17880: {IDEN2{MOV{4*SCLEN(R9){R8{{LOAD ARG 1 LENGTH
17881: {{BNE{R8{4*SCLEN(R10){IDEN1{DIFFER IF LENGTHS DIFFER
17882: {{CTW{R8{0{{GET NUMBER OF WORDS IN STRINGS
17883: {{ADD{#4*SCHAR{R9{{POINT TO CHARS OF ARG 1
17884: {{ADD{#4*SCHAR{R10{{POINT TO CHARS OF ARG 2
17885: {{LCT{R8{R8{{SET LOOP COUNTER
17886: *
17887: * LOOP TO COMPARE CHARACTERS. NOTE THAT WA CANNOT BE ZERO
17888: * SINCE ALL NULL STRINGS POINT TO NULLS AND GIVE XL=XR.
17889: *
17890: {IDEN3{CNE{(R9){(R10){IDEN8{DIFFER IF CHARS DO NOT MATCH
17891: {{ICA{R9{{{ELSE BUMP ARG ONE POINTER
17892: {{ICA{R10{{{BUMP ARG TWO POINTER
17893: {{BCT{R8{IDEN3{{LOOP BACK TILL ALL CHECKED
17894: {{EJC{{{{
17895: *
17896: * IDENT (CONTINUED)
17897: *
17898: * HERE TO EXIT FOR CASE OF TWO IDENT STRINGS
17899: *
17900: {{ZER{R10{{{CLEAR GARBAGE VALUE IN XL
17901: {{ZER{R9{{{CLEAR GARBAGE VALUE IN XR
17902: {{EXI{1{{{TAKE IDENT EXIT
17903: *
17904: * HERE FOR INTEGERS, IDENT IF SAME VALUES
17905: *
17906: {IDEN4{LDI{4*ICVAL(R9){{{LOAD ARG 1
17907: {{SBI{4*ICVAL(R10){{{SUBTRACT ARG 2 TO COMPARE
17908: {{IOV{IDEN1{{{DIFFER IF OVERFLOW
17909: {{INE{IDEN1{{{DIFFER IF RESULT IS NOT ZERO
17910: {{EXI{1{{{TAKE IDENT EXIT
17911: *
17912: * HERE FOR REALS, IDENT IF SAME VALUES
17913: *
17914: {IDEN5{LDR{4*RCVAL(R9){{{LOAD ARG 1
17915: {{SBR{4*RCVAL(R10){{{SUBTRACT ARG 2 TO COMPARE
17916: {{ROV{IDEN1{{{DIFFER IF OVERFLOW
17917: {{RNE{IDEN1{{{DIFFER IF RESULT IS NOT ZERO
17918: {{EXI{1{{{TAKE IDENT EXIT
17919: *
17920: * HERE FOR NAMES, IDENT IF BASES AND OFFSETS SAME
17921: *
17922: {IDEN6{BNE{4*NMOFS(R9){4*NMOFS(R10){IDEN1{DIFFER IF DIFFERENT OFFSET
17923: {{BNE{4*NMBAS(R9){4*NMBAS(R10){IDEN1{DIFFER IF DIFFERENT BASE
17924: *
17925: * MERGE HERE TO SIGNAL IDENT FOR IDENTICAL POINTERS
17926: *
17927: {IDEN7{EXI{1{{{TAKE IDENT EXIT
17928: *
17929: * HERE FOR DIFFER STRINGS
17930: *
17931: {IDEN8{ZER{R9{{{CLEAR GARBAGE PTR IN XR
17932: {{ZER{R10{{{CLEAR GARBAGE PTR IN XL
17933: {{EXI{{{{RETURN TO CALLER (DIFFER)
17934: {{ENP{{{{END PROCEDURE IDENT
17935: {{EJC{{{{
17936: *
17937: * INOUT - USED TO INITIALISE INPUT AND OUTPUT VARIABLES
17938: *
17939: * (XL) POINTER TO VBL NAME STRING
17940: * (WB) TRBLK TYPE
17941: * JSR INOUT CALL TO PERFORM INITIALISATION
17942: * (XL) VRBLK PTR
17943: * (XR) TRBLK PTR
17944: * (WA,WC) DESTROYED
17945: *
17946: * NOTE THAT TRTER (= TRTRF) FIELD OF STANDARD I/O VARIABLES
17947: * POINTS TO CORRESPONDING SVBLK NOT TO A TRBLK AS IS THE
17948: * CASE FOR ORDINARY VARIABLES.
17949: *
17950: {INOUT{PRC{E{0{{ENTRY POINT
17951: {{MOV{R7{-(SP){{STACK TRBLK TYPE
17952: {{MOV{4*SCLEN(R10){R6{{GET NAME LENGTH
17953: {{ZER{R7{{{POINT TO START OF NAME
17954: {{JSR{SBSTR{{{BUILD A PROPER SCBLK
17955: {{JSR{GTNVR{{{BUILD VRBLK
17956: {{PPM{{{{NO ERROR RETURN
17957: {{MOV{R9{R8{{SAVE VRBLK POINTER
17958: {{MOV{(SP)+{R7{{GET TRTER FIELD
17959: {{ZER{R10{{{ZERO TRFPT
17960: {{JSR{TRBLD{{{BUILD TRBLK
17961: {{MOV{R8{R10{{RECALL VRBLK POINTER
17962: {{MOV{4*VRSVP(R10){4*TRTER(R9){{STORE SVBLK POINTER
17963: {{MOV{R9{4*VRVAL(R10){{STORE TRBLK PTR IN VRBLK
17964: {{MOV{#B$VRA{4*VRGET(R10){{SET TRAPPED ACCESS
17965: {{MOV{#B$VRV{4*VRSTO(R10){{SET TRAPPED STORE
17966: {{EXI{{{{RETURN TO CALLER
17967: {{ENP{{{{END PROCEDURE INOUT
17968: {{EJC{{{{
17969: *
17970: * INSBF -- INSERT STRING IN BUFFER
17971: *
17972: * THIS ROUTINE WILL REPLACE A SECTION OF A BUFFER WITH THE
17973: * CONTENTS OF A GIVEN STRING. IF THE LENGTH OF THE
17974: * SECTION TO BE REPLACED IS DIFFERENT THAN THE LENGTH OF
17975: * THE GIVEN STRING, AND THE REPLACEMENT IS NOT AN APPEND,
17976: * THEN THE UPPER SECTION OF THE BUFFER IS SHIFTED UP OR
17977: * DOWN TO CREATE THE PROPER SPACE FOR THE INSERT.
17978: *
17979: * (XR) POINTER TO BFBLK
17980: * (XL) OBJECT WHICH IS STRING CONVERTABLE
17981: * (WA) OFFSET OF START OF INSERT IN (XR)
17982: * (WB) LENGTH OF SECTION IN (XR) REPLACED
17983: * JSR INSBF CALL TO INSERT CHARACTERS IN BUFFER
17984: * PPM LOC THREAD IF (XR) NOT CONVERTABLE
17985: * PPM LOC THREAD IF INSERT NOT POSSIBLE
17986: *
17987: * THE SECOND ALTERNATE EXIT IS TAKEN IF THE INSERT WOULD
17988: * OVERFLOW THE BUFFER, OR IF THE INSERT IS OUT PAST THE
17989: * DEFINED END OF THE BUFFER AS GIVEN.
17990: *
17991: {INSBF{PRC{E{2{{ENTRY POINT
17992: {{MOV{R6{INSSA{{SAVE ENTRY WA
17993: {{MOV{R7{INSSB{{SAVE ENTRY WB
17994: {{MOV{R8{INSSC{{SAVE ENTRY WC
17995: {{ADD{R7{R6{{ADD TO GET OFFSET PAST REPLACE PART
17996: {{MOV{R6{INSAB{{SAVE WA+WB
17997: {{MOV{4*BCLEN(R9){R8{{GET CURRENT DEFINED LENGTH
17998: {{BGT{INSSA{R8{INS07{FAIL IF START OFFSET TOO BIG
17999: {{BGT{R6{R8{INS07{FAIL IF FINAL OFFSET TOO BIG
18000: {{MOV{R10{-(SP){{SAVE ENTRY XL
18001: {{MOV{R9{-(SP){{SAVE BCBLK PTR
18002: {{MOV{R10{-(SP){{STACK AGAIN FOR GTSTG
18003: {{JSR{GTSTG{{{CALL TO CONVERT TO STRING
18004: {{PPM{INS05{{{TAKE STRING CONVERT ERR EXIT
18005: {{MOV{R9{R10{{SAVE STRING PTR
18006: {{MOV{(SP){R9{{RESTORE BCBLK PTR
18007: {{ADD{R8{R6{{ADD BUFFER LEN TO STRING LEN
18008: {{SUB{INSSB{R6{{BIAS OUT COMPONENT BEING REPLACED
18009: {{MOV{4*BCBUF(R9){R9{{POINT TO BFBLK
18010: {{BGT{R6{4*BFALC(R9){INS06{FAIL IF RESULT EXCEEDS ALLOCATION
18011: {{MOV{(SP){R9{{RESTORE BCBLK PTR
18012: {{MOV{R8{R6{{GET BUFFER LENGTH
18013: {{SUB{INSAB{R6{{SUBTRACT TO GET SHIFT LENGTH
18014: {{ADD{4*SCLEN(R10){R8{{ADD LENGTH OF NEW
18015: {{SUB{INSSB{R8{{SUBTRACT OLD TO GET TOTAL NEW LEN
18016: {{MOV{4*BCLEN(R9){R7{{GET OLD BCLEN
18017: {{MOV{R8{4*BCLEN(R9){{STUFF NEW LENGTH
18018: {{BZE{R6{INS04{{SKIP SHIFT IF NOTHING TO DO
18019: {{BEQ{INSSB{4*SCLEN(R10){INS04{SKIP SHIFT IF LENGTHS MATCH
18020: {{MOV{4*BCBUF(R9){R9{{POINT TO BFBLK
18021: {{MOV{R10{-(SP){{SAVE SCBLK PTR
18022: {{BLO{INSSB{4*SCLEN(R10){INS01{BRN IF SHFT IS FOR MORE ROOM
18023: {{EJC{{{{
18024: *
18025: * INSBF (CONTINUED)
18026: *
18027: * WE ARE SHIFTING THE UPPER SEGMENT DOWN TO COMPACT
18028: * THE BUFFER. (THE STRING LENGTH IS SMALLER THAN THE
18029: * SEGMENT BEING REPLACED.) REGISTERS ARE SET AS:
18030: *
18031: * (WA) MOVE (SHIFT DOWN) LENGTH
18032: * (WB) OLD BCLEN
18033: * (WC) NEW BCLEN
18034: * (XR) BFBLK PTR
18035: * (XL),(XS) SCBLK PTR
18036: *
18037: {{MOV{INSSA{R7{{GET OFFSET TO INSERT
18038: {{ADD{4*SCLEN(R10){R7{{ADD INSERT LENGTH TO GET DEST OFF
18039: {{MOV{R9{R10{{MAKE COPY
18040: {{PLC{R10{INSAB{{PREPARE SOURCE FOR MOVE
18041: {{PSC{R9{R7{{PREPARE DESTINATION REG FOR MOVE
18042: {{MVC{{{{MOVE EM OUT
18043: {{BRN{INS02{{{BRANCH TO PAD
18044: *
18045: * WE ARE SHIFTING THE UPPER SEGMENT UP TO EXPAND
18046: * THE BUFFER. (THE STRING LENGTH IS LARGER THAN THE
18047: * SEGMENT BEING REPLACED.)
18048: *
18049: {INS01{MOV{R9{R10{{COPY BFBLK PTR
18050: {{PLC{R10{R7{{SET SOURCE REG FOR MOVE BACKWARDS
18051: {{PSC{R9{R8{{SET DESTINATION PTR FOR MOVE
18052: {{MCB{{{{MOVE BACKWARDS (POSSIBLE OVERLAP)
18053: *
18054: * MERGE HERE AFTER MOVE TO ADJUST PADDING AT NEW BUFFER END
18055: *
18056: {INS02{MOV{(SP)+{R10{{RESTORE SCBLK PTR
18057: {{MOV{R8{R6{{COPY NEW BUFFER END
18058: {{CTB{R6{0{{ROUND OUT
18059: {{SUB{R8{R6{{SUBTRACT TO GET REMAINDER
18060: {{BZE{R6{INS04{{NO PAD IF ALREADY EVEN BOUNDARY
18061: {{MOV{(SP){R9{{GET BCBLK PTR
18062: {{MOV{4*BCBUF(R9){R9{{GET BFBLK PTR
18063: {{PSC{R9{R8{{PREPARE TO PAD
18064: {{ZER{R7{{{CLEAR WB
18065: {{LCT{R6{R6{{LOAD LOOP COUNT
18066: *
18067: * LOOP HERE TO STUFF PAD CHARACTERS
18068: *
18069: {INS03{SCH{R7{(R9)+{{STUFF ZERO PAD
18070: {{BCT{R6{INS03{{BRANCH FOR MORE
18071: {{EJC{{{{
18072: *
18073: * INSBF (CONTINUED)
18074: *
18075: * MERGE HERE WHEN PADDING OK. NOW COPY IN THE INSERT
18076: * STRING TO THE HOLE.
18077: *
18078: {INS04{MOV{(SP){R9{{GET BCBLK PTR
18079: {{MOV{4*BCBUF(R9){R9{{GET BFBLK PTR
18080: {{MOV{4*SCLEN(R10){R6{{GET MOVE LENGTH
18081: {{PLC{R10{{{PREPARE TO COPY FROM FIRST CHAR
18082: {{PSC{R9{INSSA{{PREPARE TO STORE IN HOLE
18083: {{MVC{{{{COPY THE CHARACTERS
18084: {{MOV{(SP)+{R9{{RESTORE ENTRY XR
18085: {{MOV{(SP)+{R10{{RESTORE ENTRY XL
18086: {{MOV{INSSA{R6{{RESTORE ENTRY WA
18087: {{MOV{INSSB{R7{{RESTORE ENTRY WB
18088: {{MOV{INSSC{R8{{RESTORE ENTRY WC
18089: {{EXI{{{{RETURN TO CALLER
18090: *
18091: * HERE TO TAKE STRING CONVERT ERROR EXIT
18092: *
18093: {INS05{MOV{(SP)+{R9{{RESTORE ENTRY XR
18094: {{MOV{(SP)+{R10{{RESTORE ENTRY XL
18095: {{MOV{INSSA{R6{{RESTORE ENTRY WA
18096: {{MOV{INSSB{R7{{RESTORE ENTRY WB
18097: {{MOV{INSSC{R8{{RESTORE ENTRY WC
18098: {{EXI{1{{{ALTERNATE EXIT
18099: *
18100: * HERE FOR INVALID OFFSET OR LENGTH
18101: *
18102: {INS06{MOV{(SP)+{R9{{RESTORE ENTRY XR
18103: {{MOV{(SP)+{R10{{RESTORE ENTRY XL
18104: *
18105: * MERGE FOR LENGTH FAILURE EXIT WITH STACK SET
18106: *
18107: {INS07{MOV{INSSA{R6{{RESTORE ENTRY WA
18108: {{MOV{INSSB{R7{{RESTORE ENTRY WB
18109: {{MOV{INSSC{R8{{RESTORE ENTRY WC
18110: {{EXI{2{{{ALTERNATE EXIT
18111: {{ENP{{{{END PROCEDURE INSBF
18112: {{EJC{{{{
18113: *
18114: * IOFCB -- GET INPUT/OUTPUT FCBLK POINTER
18115: *
18116: * USED BY ENDFILE, EJECT AND REWIND TO FIND THE FCBLK
18117: * (IF ANY) CORRESPONDING TO THEIR ARGUMENT.
18118: *
18119: * -(XS) ARGUMENT
18120: * JSR IOFCB CALL TO FIND FCBLK
18121: * PPM LOC ARG IS AN UNSUITABLE NAME
18122: * PPM LOC ARG IS NULL STRING
18123: * (XS) POPPED
18124: * (XL) PTR TO FILEARG1 VRBLK
18125: * (XR) ARGUMENT
18126: * (WA) FCBLK PTR OR 0
18127: * (WB) DESTROYED
18128: *
18129: {IOFCB{PRC{N{2{{ENTRY POINT
18130: {{JSR{GTSTG{{{GET ARG AS STRING
18131: {{PPM{IOFC2{{{FAIL
18132: {{MOV{R9{R10{{COPY STRING PTR
18133: {{JSR{GTNVR{{{GET AS NATURAL VARIABLE
18134: {{PPM{IOFC3{{{FAIL IF NULL
18135: {{MOV{R10{R7{{COPY STRING POINTER AGAIN
18136: {{MOV{R9{R10{{COPY VRBLK PTR FOR RETURN
18137: {{ZER{R6{{{IN CASE NO TRBLK FOUND
18138: *
18139: * LOOP TO FIND FILE ARG1 TRBLK
18140: *
18141: {IOFC1{MOV{4*VRVAL(R9){R9{{GET POSSIBLE TRBLK PTR
18142: {{BNE{(R9){#B$TRT{IOFC2{FAIL IF END OF CHAIN
18143: {{BNE{4*TRTYP(R9){#TRTFC{IOFC1{LOOP IF NOT FILE ARG TRBLK
18144: {{MOV{4*TRFPT(R9){R6{{GET FCBLK PTR
18145: {{MOV{R7{R9{{COPY ARG
18146: {{EXI{{{{RETURN
18147: *
18148: * FAIL RETURN
18149: *
18150: {IOFC2{EXI{1{{{FAIL
18151: *
18152: * NULL ARG
18153: *
18154: {IOFC3{EXI{2{{{NULL ARG RETURN
18155: {{ENP{{{{END PROCEDURE IOFCB
18156: {{EJC{{{{
18157: *
18158: * IOPPF -- PROCESS FILEARG2 FOR IOPUT
18159: *
18160: * (R$XSC) FILEARG2 PTR
18161: * JSR IOPPF CALL TO PROCESS FILEARG2
18162: * (XL) FILEARG1 PTR
18163: * (XR) FILE ARG2 PTR
18164: * -(XS)..-(XS) FIELDS EXTRACTED FROM FILEARG2
18165: * (WC) NO. OF FIELDS EXTRACTED
18166: * (WB) INPUT/OUTPUT FLAG
18167: * (WA) FCBLK PTR OR 0
18168: *
18169: {IOPPF{PRC{N{0{{ENTRY POINT
18170: {{ZER{R7{{{TO COUNT FIELDS EXTRACTED
18171: *
18172: * LOOP TO EXTRACT FIELDS
18173: *
18174: {IOPP1{MOV{#IODEL{R10{{GET DELIMITER
18175: {{MOV{R10{R8{{COPY IT
18176: {{JSR{XSCAN{{{GET NEXT FIELD
18177: {{MOV{R9{-(SP){{STACK IT
18178: {{ICV{R7{{{INCREMENT COUNT
18179: {{BNZ{R6{IOPP1{{LOOP
18180: {{MOV{R7{R8{{COUNT OF FIELDS
18181: {{MOV{IOPTT{R7{{I/O MARKER
18182: {{MOV{R$IOF{R6{{FCBLK PTR OR 0
18183: {{MOV{R$IO2{R9{{FILE ARG2 PTR
18184: {{MOV{R$IO1{R10{{FILEARG1
18185: {{EXI{{{{RETURN
18186: {{ENP{{{{END PROCEDURE IOPPF
18187: {{EJC{{{{
18188: *
18189: * IOPUT -- ROUTINE USED BY INPUT AND OUTPUT
18190: *
18191: * IOPUT SETS UP INPUT/OUTPUT ASSOCIATIONS. IT BUILDS
18192: * SUCH TRACE AND FILE CONTROL BLOCKS AS ARE NECESSARY AND
18193: * CALLS SYSFC,SYSIO TO PERFORM CHECKS ON THE
18194: * ARGUMENTS AND TO OPEN THE FILES.
18195: *
18196: * +-----------+ +---------------+ +-----------+
18197: * +-.I I I I------.I =B$XRT I
18198: * I +-----------+ +---------------+ +-----------+
18199: * I / / (R$FCB) I *4 I
18200: * I / / +-----------+
18201: * I +-----------+ +---------------+ I I-
18202: * I I NAME +--.I =B$TRT I +-----------+
18203: * I / / +---------------+ I I
18204: * I (FIRST ARG) I =TRTIN/=TRTOU I +-----------+
18205: * I +---------------+ I
18206: * I I VALUE I I
18207: * I +---------------+ I
18208: * I I(TRTRF) 0 OR I--+ I
18209: * I +---------------+ I I
18210: * I I(TRFPT) 0 OR I----+ I
18211: * I +---------------+ I I I
18212: * I (I/O TRBLK) I I I
18213: * I +-----------+ I I I
18214: * I I I I I I
18215: * I +-----------+ I I I
18216: * I I I I I I
18217: * I +-----------+ +---------------+ I I I
18218: * I I +--.I =B$TRT I.-+ I I
18219: * I +-----------+ +---------------+ I I
18220: * I / / I =TRTFC I I I
18221: * I / / +---------------+ I I
18222: * I (FILEARG1 I VALUE I I I
18223: * I VRBLK) +---------------+ I I
18224: * I I(TRTRF) 0 OR I--+ I .
18225: * I +---------------+ I . +-----------+
18226: * I I(TRFPT) 0 OR I------./ FCBLK /
18227: * I +---------------+ I +-----------+
18228: * I (TRTRF) I
18229: * I I
18230: * I I
18231: * I +---------------+ I
18232: * I I =B$XRT I.-+
18233: * I +---------------+
18234: * I I *5 I
18235: * I +---------------+
18236: * +------------------I I
18237: * +---------------+ +-----------+
18238: * I(TRTRF) O OR I------.I =B$XRT I
18239: * +---------------+ +-----------+
18240: * I NAME OFFSET I I ETC I
18241: * +---------------+
18242: * (IOCHN - CHAIN OF NAME POINTERS)
18243: {{EJC{{{{
18244: *
18245: * IOPUT (CONTINUED)
18246: *
18247: * NO ADDITIONAL TRAP BLOCKS ARE USED FOR STANDARD INPUT/OUT
18248: * FILES. OTHERWISE AN I/O TRAP BLOCK IS ATTACHED TO SECOND
18249: * ARG (FILEARG1) VRBLK. SEE DIAGRAM ABOVE FOR DETAILS OF
18250: * THE STRUCTURE BUILT.
18251: *
18252: * -(XS) 1ST ARG (VBL TO BE ASSOCIATED)
18253: * -(XS) 2ND ARG (FILE ARG1)
18254: * -(XS) 3RD ARG (FILE ARG2)
18255: * (WB) 0 FOR INPUT, 3 FOR OUTPUT ASSOC.
18256: * JSR IOPUT CALL FOR INPUT/OUTPUT ASSOCIATION
18257: * PPM LOC 3RD ARG NOT A STRING
18258: * PPM LOC 2ND ARG NOT A SUITABLE NAME
18259: * PPM LOC 1ST ARG NOT A SUITABLE NAME
18260: * PPM LOC INAPPROPRIATE FILE SPEC FOR I/O
18261: * PPM LOC I/O FILE DOES NOT EXIST
18262: * PPM LOC I/O FILE CANNOT BE READ/WRITTEN
18263: * (XS) POPPED
18264: * (XL,XR,WA,WB,WC) DESTROYED
18265: *
18266: {IOPUT{PRC{N{6{{ENTRY POINT
18267: {{ZER{R$IOT{{{IN CASE NO TRTRF BLOCK USED
18268: {{ZER{R$IOF{{{IN CASE NO FCBLK ALOCATED
18269: {{MOV{R7{IOPTT{{STORE I/O TRACE TYPE
18270: {{JSR{XSCNI{{{PREPARE TO SCAN FILEARG2
18271: {{PPM{IOP13{{{FAIL
18272: {{PPM{IOPA0{{{NULL FILE ARG2
18273: *
18274: {IOPA0{MOV{R9{R$IO2{{KEEP FILE ARG2
18275: {{MOV{R6{R10{{COPY LENGTH
18276: {{JSR{GTSTG{{{CONVERT FILEARG1 TO STRING
18277: {{PPM{IOP14{{{FAIL
18278: {{MOV{R9{R$IO1{{KEEP FILEARG1 PTR
18279: {{JSR{GTNVR{{{CONVERT TO NATURAL VARIABLE
18280: {{PPM{IOP00{{{JUMP IF NULL
18281: {{BRN{IOP04{{{JUMP TO PROCESS NON-NULL ARGS
18282: *
18283: * NULL FILEARG1
18284: *
18285: {IOP00{BZE{R10{IOP01{{SKIP IF BOTH ARGS NULL
18286: {{JSR{IOPPF{{{PROCESS FILEARG2
18287: {{JSR{SYSFC{{{CALL FOR FILEARG2 CHECK
18288: {{PPM{IOP16{{{FAIL
18289: {{BRN{IOP11{{{COMPLETE FILE ASSOCIATION
18290: {{EJC{{{{
18291: *
18292: * IOPUT (CONTINUED)
18293: *
18294: * HERE WITH 0 OR FCBLK PTR IN (XL)
18295: *
18296: {IOP01{MOV{IOPTT{R7{{GET TRACE TYPE
18297: {{MOV{R$IOT{R9{{GET 0 OR TRTRF PTR
18298: {{JSR{TRBLD{{{BUILD TRBLK
18299: {{MOV{R9{R8{{COPY TRBLK POINTER
18300: {{MOV{(SP)+{R9{{GET VARIABLE FROM STACK
18301: {{JSR{GTVAR{{{POINT TO VARIABLE
18302: {{PPM{IOP15{{{FAIL
18303: {{MOV{R10{R$ION{{SAVE NAME POINTER
18304: {{MOV{R10{R9{{COPY NAME POINTER
18305: {{ADD{R6{R9{{POINT TO VARIABLE
18306: {{SUB{#4*VRVAL{R9{{SUBTRACT OFFSET,MERGE INTO LOOP
18307: *
18308: * LOOP TO END OF TRBLK CHAIN IF ANY
18309: *
18310: {IOP02{MOV{R9{R10{{COPY BLK PTR
18311: {{MOV{4*VRVAL(R9){R9{{LOAD PTR TO NEXT TRBLK
18312: {{BNE{(R9){#B$TRT{IOP03{JUMP IF NOT TRAPPED
18313: {{BNE{4*TRTYP(R9){IOPTT{IOP02{LOOP IF NOT SAME ASSOCN
18314: {{MOV{4*TRNXT(R9){R9{{GET VALUE AND DELETE OLD TRBLK
18315: *
18316: * IOPUT (CONTINUED)
18317: *
18318: * STORE NEW ASSOCIATION
18319: *
18320: {IOP03{MOV{R8{4*VRVAL(R10){{LINK TO THIS TRBLK
18321: {{MOV{R8{R10{{COPY POINTER
18322: {{MOV{R9{4*TRNXT(R10){{STORE VALUE IN TRBLK
18323: {{MOV{R$ION{R9{{RESTORE POSSIBLE VRBLK POINTER
18324: {{MOV{R6{R7{{KEEP OFFSET TO NAME
18325: {{JSR{SETVR{{{IF VRBLK, SET VRGET,VRSTO
18326: {{MOV{R$IOT{R9{{GET 0 OR TRTRF PTR
18327: {{BNZ{R9{IOP19{{JUMP IF TRTRF BLOCK EXISTS
18328: {{EXI{{{{RETURN TO CALLER
18329: *
18330: * NON STANDARD FILE
18331: * SEE IF AN FCBLK HAS ALREADY BEEN ALLOCATED.
18332: *
18333: {IOP04{ZER{R6{{{IN CASE NO FCBLK FOUND
18334: {{EJC{{{{
18335: *
18336: * IOPUT (CONTINUED)
18337: *
18338: * SEARCH POSSIBLE TRBLK CHAIN TO PICK UP THE FCBLK
18339: *
18340: {IOP05{MOV{R9{R7{{REMEMBER BLK PTR
18341: {{MOV{4*VRVAL(R9){R9{{CHAIN ALONG
18342: {{BNE{(R9){#B$TRT{IOP06{JUMP IF END OF TRBLK CHAIN
18343: {{BNE{4*TRTYP(R9){#TRTFC{IOP05{LOOP IF MORE TO GO
18344: {{MOV{R9{R$IOT{{POINT TO FILE ARG1 TRBLK
18345: {{MOV{4*TRFPT(R9){R6{{GET FCBLK PTR FROM TRBLK
18346: *
18347: * WA = 0 OR FCBLK PTR
18348: * WB = PTR TO PRECEDING BLK TO WHICH ANY TRTRF BLOCK
18349: * FOR FILE ARG1 MUST BE CHAINED.
18350: *
18351: {IOP06{MOV{R6{R$IOF{{KEEP POSSIBLE FCBLK PTR
18352: {{MOV{R7{R$IOP{{KEEP PRECEDING BLK PTR
18353: {{JSR{IOPPF{{{PROCESS FILEARG2
18354: {{JSR{SYSFC{{{SEE IF FCBLK REQUIRED
18355: {{PPM{IOP16{{{FAIL
18356: {{BZE{R6{IOP12{{SKIP IF NO NEW FCBLK WANTED
18357: {{BLT{R8{#NUM02{IOP6A{JUMP IF FCBLK IN DYNAMIC
18358: {{JSR{ALOST{{{GET IT IN STATIC
18359: {{BRN{IOP6B{{{SKIP
18360: *
18361: * OBTAIN FCBLK IN DYNAMIC
18362: *
18363: {IOP6A{JSR{ALLOC{{{GET SPACE FOR FCBLK
18364: *
18365: * MERGE
18366: *
18367: {IOP6B{MOV{R9{R10{{POINT TO FCBLK
18368: {{MOV{R6{R7{{COPY ITS LENGTH
18369: {{BTW{R7{{{GET COUNT AS WORDS (SGD APR80)
18370: {{LCT{R7{R7{{LOOP COUNTER
18371: *
18372: * CLEAR FCBLK
18373: *
18374: {IOP07{ZER{(R9)+{{{CLEAR A WORD
18375: {{BCT{R7{IOP07{{LOOP
18376: {{BEQ{R8{#NUM02{IOP09{SKIP IF IN STATIC - DONT SET FIELDS
18377: {{MOV{#B$XNT{(R10){{STORE XNBLK CODE IN CASE
18378: {{MOV{R6{4*1(R10){{STORE LENGTH
18379: {{BNZ{R8{IOP09{{JUMP IF XNBLK WANTED
18380: {{MOV{#B$XRT{(R10){{XRBLK CODE REQUESTED
18381: *
18382: {{EJC{{{{
18383: * IOPUT (CONTINUED)
18384: *
18385: * COMPLETE FCBLK INITIALISATION
18386: *
18387: {IOP09{MOV{R$IOT{R9{{GET POSSIBLE TRBLK PTR
18388: {{MOV{R10{R$IOF{{STORE FCBLK PTR
18389: {{BNZ{R9{IOP10{{JUMP IF TRBLK ALREADY FOUND
18390: *
18391: * A NEW TRBLK IS NEEDED
18392: *
18393: {{MOV{#TRTFC{R7{{TRTYP FOR FCBLK TRAP BLK
18394: {{JSR{TRBLD{{{MAKE THE BLOCK
18395: {{MOV{R9{R$IOT{{COPY TRTRF PTR
18396: {{MOV{R$IOP{R10{{POINT TO PRECEDING BLK
18397: {{MOV{4*VRVAL(R10){4*VRVAL(R9){{COPY VALUE FIELD TO TRBLK
18398: {{MOV{R9{4*VRVAL(R10){{LINK NEW TRBLK INTO CHAIN
18399: {{MOV{R10{R9{{POINT TO PREDECESSOR BLK
18400: {{JSR{SETVR{{{SET TRACE INTERCEPTS
18401: {{MOV{4*VRVAL(R9){R9{{RECOVER TRBLK PTR
18402: *
18403: * XR IS PTR TO TRBLK, XL IS FCBLK PTR OR 0
18404: *
18405: {IOP10{MOV{R$IOF{4*TRFPT(R9){{STORE FCBLK PTR
18406: *
18407: * CALL SYSIO TO COMPLETE FILE ACCESSING
18408: *
18409: {IOP11{MOV{R$IOF{R6{{COPY FCBLK PTR OR 0
18410: {{MOV{IOPTT{R7{{GET INPUT/OUTPUT FLAG
18411: {{MOV{R$IO2{R9{{GET FILE ARG2
18412: {{MOV{R$IO1{R10{{GET FILE ARG1
18413: {{JSR{SYSIO{{{ASSOCIATE TO THE FILE
18414: {{PPM{IOP17{{{FAIL
18415: {{PPM{IOP18{{{FAIL
18416: {{BNZ{R$IOT{IOP01{{NOT STD INPUT IF NON-NULL TRTRF BLK
18417: {{BNZ{IOPTT{IOP01{{JUMP IF OUTPUT
18418: {{BZE{R8{IOP01{{NO CHANGE TO STANDARD READ LENGTH
18419: {{MOV{R8{CSWIN{{STORE NEW READ LENGTH FOR STD FILE
18420: {{BRN{IOP01{{{MERGE TO FINISH THE TASK
18421: *
18422: * SYSFC MAY HAVE RETURNED A POINTER TO A PRIVATE FCBLK
18423: *
18424: {IOP12{BNZ{R10{IOP09{{JUMP IF PRIVATE FCBLK
18425: {{BRN{IOP11{{{FINISH THE ASSOCIATION
18426: *
18427: * FAILURE RETURNS
18428: *
18429: {IOP13{EXI{1{{{3RD ARG NOT A STRING
18430: {IOP14{EXI{2{{{2ND ARG UNSUITABLE
18431: {IOP15{EXI{3{{{1ST ARG UNSUITABLE
18432: {IOP16{EXI{4{{{FILE SPEC WRONG
18433: {IOP17{EXI{5{{{I/O FILE DOES NOT EXIST
18434: {IOP18{EXI{6{{{I/O FILE CANNOT BE READ/WRITTEN
18435: {{EJC{{{{
18436: *
18437: * IOPUT (CONTINUED)
18438: *
18439: * ADD TO IOCHN CHAIN OF ASSSOCIATED VARIABLES UNLESS ALREAD
18440: * PRESENT.
18441: *
18442: {IOP19{MOV{R$ION{R8{{WC = NAME BASE, WB = NAME OFFSET
18443: *
18444: * SEARCH LOOP
18445: *
18446: {IOP20{MOV{4*TRTRF(R9){R9{{NEXT LINK OF CHAIN
18447: {{BZE{R9{IOP21{{NOT FOUND
18448: {{BNE{R8{4*IONMB(R9){IOP20{NO MATCH
18449: {{BEQ{R7{4*IONMO(R9){IOP22{EXIT IF MATCHED
18450: {{BRN{IOP20{{{LOOP
18451: *
18452: * NOT FOUND
18453: *
18454: {IOP21{MOV{#4*NUM05{R6{{SPACE NEEDED
18455: {{JSR{ALLOC{{{GET IT
18456: {{MOV{#B$XRT{(R9){{STORE XRBLK CODE
18457: {{MOV{R6{4*1(R9){{STORE LENGTH
18458: {{MOV{R8{4*IONMB(R9){{STORE NAME BASE
18459: {{MOV{R7{4*IONMO(R9){{STORE NAME OFFSET
18460: {{MOV{R$IOT{R10{{POINT TO TRTRF BLK
18461: {{MOV{4*TRTRF(R10){R6{{GET PTR FIELD CONTENTS
18462: {{MOV{R9{4*TRTRF(R10){{STORE PTR TO NEW BLOCK
18463: {{MOV{R6{4*TRTRF(R9){{COMPLETE THE LINKING
18464: *
18465: * INSERT FCBLK ON FCBLK CHAIN FOR SYSEJ, SYSXI
18466: *
18467: {IOP22{BZE{R$IOF{IOP25{{SKIP IF NO FCBLK
18468: {{MOV{R$FCB{R10{{PTR TO HEAD OF EXISTING CHAIN
18469: *
18470: * SEE IF FCBLK ALREADY ON CHAIN
18471: *
18472: {IOP23{BZE{R10{IOP24{{NOT ON IF END OF CHAIN
18473: {{BEQ{4*3(R10){R$IOF{IOP25{DONT DUPLICATE IF FIND IT
18474: {{MOV{4*2(R10){R10{{GET NEXT LINK
18475: {{BRN{IOP23{{{LOOP
18476: *
18477: * NOT FOUND SO ADD AN ENTRY FOR THIS FCBLK
18478: *
18479: {IOP24{MOV{#4*NUM04{R6{{SPACE NEEDED
18480: {{JSR{ALLOC{{{GET IT
18481: {{MOV{#B$XRT{(R9){{STORE BLOCK CODE
18482: {{MOV{R6{4*1(R9){{STORE LENGTH
18483: {{MOV{R$FCB{4*2(R9){{STORE PREVIOUS LINK IN THIS NODE
18484: {{MOV{R$IOF{4*3(R9){{STORE FCBLK PTR
18485: {{MOV{R9{R$FCB{{INSERT NODE INTO FCBLK CHAIN
18486: *
18487: * RETURN
18488: *
18489: {IOP25{EXI{{{{RETURN TO CALLER
18490: {{ENP{{{{END PROCEDURE IOPUT
18491: {{EJC{{{{
18492: *
18493: * KTREX -- EXECUTE KEYWORD TRACE
18494: *
18495: * KTREX IS USED TO EXECUTE A POSSIBLE KEYWORD TRACE. IT
18496: * INCLUDES THE TEST ON TRACE AND TESTS FOR TRACE ACTIVE.
18497: *
18498: * (XL) PTR TO TRBLK (OR 0 IF UNTRACED)
18499: * JSR KTREX CALL TO EXECUTE KEYWORD TRACE
18500: * (XL,WA,WB,WC) DESTROYED
18501: * (RA) DESTROYED
18502: *
18503: {KTREX{PRC{R{0{{ENTRY POINT (RECURSIVE)
18504: {{BZE{R10{KTRX3{{IMMEDIATE EXIT IF KEYWORD UNTRACED
18505: {{BZE{KVTRA{KTRX3{{IMMEDIATE EXIT IF TRACE = 0
18506: {{DCV{KVTRA{{{ELSE DECREMENT TRACE
18507: {{MOV{R9{-(SP){{SAVE XR
18508: {{MOV{R10{R9{{COPY TRBLK POINTER
18509: {{MOV{4*TRKVR(R9){R10{{LOAD VRBLK POINTER (NMBAS)
18510: {{MOV{#4*VRVAL{R6{{SET NAME OFFSET
18511: {{BZE{4*TRFNC(R9){KTRX1{{JUMP IF PRINT TRACE
18512: {{JSR{TRXEQ{{{ELSE EXECUTE FULL TRACE
18513: {{BRN{KTRX2{{{AND JUMP TO EXIT
18514: *
18515: * HERE FOR PRINT TRACE
18516: *
18517: {KTRX1{MOV{R10{-(SP){{STACK VRBLK PTR FOR KWNAM
18518: {{MOV{R6{-(SP){{STACK OFFSET FOR KWNAM
18519: {{JSR{PRTSN{{{PRINT STATEMENT NUMBER
18520: {{MOV{#CH$AM{R6{{LOAD AMPERSAND
18521: {{JSR{PRTCH{{{PRINT AMPERSAND
18522: {{JSR{PRTNM{{{PRINT KEYWORD NAME
18523: {{MOV{#TMBEB{R9{{POINT TO BLANK-EQUAL-BLANK
18524: {{JSR{PRTST{{{PRINT BLANK-EQUAL-BLANK
18525: {{JSR{KWNAM{{{GET KEYWORD PSEUDO-VARIABLE NAME
18526: {{MOV{R9{DNAMP{{RESET PTR TO DELETE KVBLK
18527: {{JSR{ACESS{{{GET KEYWORD VALUE
18528: {{PPM{{{{FAILURE IS IMPOSSIBLE
18529: {{JSR{PRTVL{{{PRINT KEYWORD VALUE
18530: {{JSR{PRTNL{{{TERMINATE PRINT LINE
18531: *
18532: * HERE TO EXIT AFTER COMPLETING TRACE
18533: *
18534: {KTRX2{MOV{(SP)+{R9{{RESTORE ENTRY XR
18535: *
18536: * MERGE HERE TO EXIT IF NO TRACE REQUIRED
18537: *
18538: {KTRX3{EXI{{{{RETURN TO KTREX CALLER
18539: {{ENP{{{{END PROCEDURE KTREX
18540: {{EJC{{{{
18541: *
18542: * KWNAM -- GET PSEUDO-VARIABLE NAME FOR KEYWORD
18543: *
18544: * 1(XS) NAME BASE FOR VRBLK
18545: * 0(XS) OFFSET (SHOULD BE *VRVAL)
18546: * JSR KWNAM CALL TO GET PSEUDO-VARIABLE NAME
18547: * (XS) POPPED TWICE
18548: * (XL,WA) RESULTING PSEUDO-VARIABLE NAME
18549: * (XR,WA,WB) DESTROYED
18550: *
18551: {KWNAM{PRC{N{0{{ENTRY POINT
18552: {{ICA{SP{{{IGNORE NAME OFFSET
18553: {{MOV{(SP)+{R9{{LOAD NAME BASE
18554: {{BGE{R9{STATE{KWNM1{JUMP IF NOT NATURAL VARIABLE NAME
18555: {{BNZ{4*VRLEN(R9){KWNM1{{ERROR IF NOT SYSTEM VARIABLE
18556: {{MOV{4*VRSVP(R9){R9{{ELSE POINT TO SVBLK
18557: {{MOV{4*SVBIT(R9){R6{{LOAD BIT MASK
18558: {{ANB{BTKNM{R6{{AND WITH KEYWORD BIT
18559: {{ZRB{R6{KWNM1{{ERROR IF NO KEYWORD ASSOCIATION
18560: {{MOV{4*SVLEN(R9){R6{{ELSE LOAD NAME LENGTH IN CHARACTERS
18561: {{CTB{R6{SVCHS{{COMPUTE OFFSET TO FIELD WE WANT
18562: {{ADD{R6{R9{{POINT TO SVKNM FIELD
18563: {{MOV{(R9){R7{{LOAD SVKNM VALUE
18564: {{MOV{#4*KVSI${R6{{SET SIZE OF KVBLK
18565: {{JSR{ALLOC{{{ALLOCATE KVBLK
18566: {{MOV{#B$KVT{(R9){{STORE TYPE WORD
18567: {{MOV{R7{4*KVNUM(R9){{STORE KEYWORD NUMBER
18568: {{MOV{#TRBKV{4*KVVAR(R9){{SET DUMMY TRBLK POINTER
18569: {{MOV{R9{R10{{COPY KVBLK POINTER
18570: {{MOV{#4*KVVAR{R6{{SET PROPER OFFSET
18571: {{EXI{{{{RETURN TO KVNAM CALLER
18572: *
18573: * HERE IF NOT KEYWORD NAME
18574: *
18575: {KWNM1{ERB{251{KEYWORD{{OPERAND IS NOT NAME OF DEFINED KEYWORD
18576: {{ENP{{{{END PROCEDURE KWNAM
18577: {{EJC{{{{
18578: *
18579: * LCOMP-- COMPARE TWO STRINGS LEXICALLY
18580: *
18581: * 1(XS) FIRST ARGUMENT
18582: * 0(XS) SECOND ARGUMENT
18583: * JSR LCOMP CALL TO COMPARE ARUMENTS
18584: * PPM LOC TRANSFER LOC FOR ARG1 NOT STRING
18585: * PPM LOC TRANSFER LOC FOR ARG2 NOT STRING
18586: * PPM LOC TRANSFER LOC IF ARG1 LLT ARG2
18587: * PPM LOC TRANSFER LOC IF ARG1 LEQ ARG2
18588: * PPM LOC TRANSFER LOC IF ARG1 LGT ARG2
18589: * (THE NORMAL RETURN IS NEVER TAKEN)
18590: * (XS) POPPED TWICE
18591: * (XR,XL) DESTROYED
18592: * (WA,WB,WC,RA) DESTROYED
18593: *
18594: {LCOMP{PRC{N{5{{ENTRY POINT
18595: {{JSR{GTSTG{{{CONVERT SECOND ARG TO STRING
18596: {{PPM{LCMP6{{{JUMP IF SECOND ARG NOT STRING
18597: {{MOV{R9{R10{{ELSE SAVE POINTER
18598: {{MOV{R6{R7{{AND LENGTH
18599: {{JSR{GTSTG{{{CONVERT FIRST ARGUMENT TO STRING
18600: {{PPM{LCMP5{{{JUMP IF NOT STRING
18601: {{MOV{R6{R8{{SAVE ARG 1 LENGTH
18602: {{PLC{R9{{{POINT TO CHARS OF ARG 1
18603: {{PLC{R10{{{POINT TO CHARS OF ARG 2
18604: {{BLO{R6{R7{LCMP1{JUMP IF ARG 1 LENGTH IS SMALLER
18605: {{MOV{R7{R6{{ELSE SET ARG 2 LENGTH AS SMALLER
18606: *
18607: * HERE WITH SMALLER LENGTH IN (WA)
18608: *
18609: {LCMP1{CMC{LCMP4{LCMP3{{COMPARE STRINGS, JUMP IF UNEQUAL
18610: {{BNE{R7{R8{LCMP2{IF EQUAL, JUMP IF LENGTHS UNEQUAL
18611: {{EXI{4{{{ELSE IDENTICAL STRINGS, LEQ EXIT
18612: {{EJC{{{{
18613: *
18614: * LCOMP (CONTINUED)
18615: *
18616: * HERE IF INITIAL STRINGS IDENTICAL, BUT LENGTHS UNEQUAL
18617: *
18618: {LCMP2{BHI{R8{R7{LCMP4{JUMP IF ARG 1 LENGTH GT ARG 2 LENG
18619: *
18620: * HERE IF FIRST ARG LLT SECOND ARG
18621: *
18622: {LCMP3{EXI{3{{{TAKE LLT EXIT
18623: *
18624: * HERE IF FIRST ARG LGT SECOND ARG
18625: *
18626: {LCMP4{EXI{5{{{TAKE LGT EXIT
18627: *
18628: * HERE IF FIRST ARG IS NOT A STRING
18629: *
18630: {LCMP5{EXI{1{{{TAKE BAD FIRST ARG EXIT
18631: *
18632: * HERE FOR SECOND ARG NOT A STRING
18633: *
18634: {LCMP6{EXI{2{{{TAKE BAD SECOND ARG ERROR EXIT
18635: {{ENP{{{{END PROCEDURE LCOMP
18636: {{EJC{{{{
18637: *
18638: * LISTR -- LIST SOURCE LINE
18639: *
18640: * LISTR IS USED TO LIST A SOURCE LINE DURING THE INITIAL
18641: * COMPILATION. IT IS CALLED FROM SCANE AND SCANL.
18642: *
18643: * JSR LISTR CALL TO LIST LINE
18644: * (XR,XL,WA,WB,WC) DESTROYED
18645: *
18646: * GLOBAL LOCATIONS USED BY LISTR
18647: *
18648: * ERLST IF LISTING ON ACCOUNT OF AN ERROR
18649: *
18650: * LSTLC COUNT LINES ON CURRENT PAGE
18651: *
18652: * LSTNP MAX NUMBER OF LINES/PAGE
18653: *
18654: * LSTPF SET NON-ZERO IF THE CURRENT SOURCE
18655: * LINE HAS BEEN LISTED, ELSE ZERO.
18656: *
18657: * LSTPG COMPILER LISTING PAGE NUMBER
18658: *
18659: * LSTSN SET IF STMNT NUM TO BE LISTED
18660: *
18661: * R$CIM POINTER TO CURRENT INPUT LINE.
18662: *
18663: * R$TTL TITLE FOR SOURCE LISTING
18664: *
18665: * R$STL PTR TO SUB-TITLE STRING
18666: *
18667: * ENTRY POINT
18668: *
18669: {LISTR{PRC{E{0{{ENTRY POINT
18670: {{BNZ{CNTTL{LIST5{{JUMP IF -TITLE OR -STITL
18671: {{BNZ{LSTPF{LIST4{{IMMEDIATE EXIT IF ALREADY LISTED
18672: {{BGE{LSTLC{LSTNP{LIST6{JUMP IF NO ROOM
18673: *
18674: * HERE AFTER PRINTING TITLE (IF NEEDED)
18675: *
18676: {LIST0{MOV{R$CIM{R9{{LOAD POINTER TO CURRENT IMAGE
18677: {{PLC{R9{{{POINT TO CHARACTERS
18678: {{LCH{R6{(R9){{LOAD FIRST CHARACTER
18679: {{MOV{LSTSN{R9{{LOAD STATEMENT NUMBER
18680: {{BZE{R9{LIST2{{JUMP IF NO STATEMENT NUMBER
18681: {{MTI{R9{{{ELSE GET STMNT NUMBER AS INTEGER
18682: {{BNE{STAGE{#STGIC{LIST1{SKIP IF EXECUTE TIME
18683: {{BEQ{R6{#CH$AS{LIST2{NO STMNT NUMBER LIST IF COMMENT
18684: {{BEQ{R6{#CH$MN{LIST2{NO STMNT NO. IF CONTROL CARD
18685: *
18686: * PRINT STATEMENT NUMBER
18687: *
18688: {LIST1{JSR{PRTIN{{{ELSE PRINT STATEMENT NUMBER
18689: {{ZER{LSTSN{{{AND CLEAR FOR NEXT TIME IN
18690: {{EJC{{{{
18691: *
18692: * LISTR (CONTINUED)
18693: *
18694: * MERGE HERE AFTER PRINTING STATEMENT NUMBER (IF REQUIRED)
18695: *
18696: {LIST2{MOV{#STNPD{PROFS{{POINT PAST STATEMENT NUMBER
18697: {{MOV{R$CIM{R9{{LOAD POINTER TO CURRENT IMAGE
18698: {{JSR{PRTST{{{PRINT IT
18699: {{ICV{LSTLC{{{BUMP LINE COUNTER
18700: {{BNZ{ERLST{LIST3{{JUMP IF ERROR COPY TO INT.CH.
18701: {{JSR{PRTNL{{{TERMINATE LINE
18702: {{BZE{CSWDB{LIST3{{JUMP IF -SINGLE MODE
18703: {{JSR{PRTNL{{{ELSE ADD A BLANK LINE
18704: {{ICV{LSTLC{{{AND BUMP LINE COUNTER
18705: *
18706: * HERE AFTER PRINTING SOURCE IMAGE
18707: *
18708: {LIST3{MNZ{LSTPF{{{SET FLAG FOR LINE PRINTED
18709: *
18710: * MERGE HERE TO EXIT
18711: *
18712: {LIST4{EXI{{{{RETURN TO LISTR CALLER
18713: *
18714: * PRINT TITLE AFTER -TITLE OR -STITL CARD
18715: *
18716: {LIST5{ZER{CNTTL{{{CLEAR FLAG
18717: *
18718: * EJECT TO NEW PAGE AND LIST TITLE
18719: *
18720: {LIST6{JSR{PRTPS{{{EJECT
18721: {{BZE{PRICH{LIST7{{SKIP IF LISTING TO REGULAR PRINTER
18722: {{BEQ{R$TTL{#NULLS{LIST0{TERMINAL LISTING OMITS NULL TITLE
18723: *
18724: * LIST TITLE
18725: *
18726: {LIST7{JSR{LISTT{{{LIST TITLE
18727: {{BRN{LIST0{{{MERGE
18728: {{ENP{{{{END PROCEDURE LISTR
18729: {{EJC{{{{
18730: *
18731: * LISTT -- LIST TITLE AND SUBTITLE
18732: *
18733: * USED DURING COMPILATION TO PRINT PAGE HEADING
18734: *
18735: * JSR LISTT CALL TO LIST TITLE
18736: * (XR,WA) DESTROYED
18737: *
18738: {LISTT{PRC{E{0{{ENTRY POINT
18739: {{MOV{R$TTL{R9{{POINT TO SOURCE LISTING TITLE
18740: {{JSR{PRTST{{{PRINT TITLE
18741: {{MOV{LSTPO{PROFS{{SET OFFSET
18742: {{MOV{#LSTMS{R9{{SET PAGE MESSAGE
18743: {{JSR{PRTST{{{PRINT PAGE MESSAGE
18744: {{ICV{LSTPG{{{BUMP PAGE NUMBER
18745: {{MTI{LSTPG{{{LOAD PAGE NUMBER AS INTEGER
18746: {{JSR{PRTIN{{{PRINT PAGE NUMBER
18747: {{JSR{PRTNL{{{TERMINATE TITLE LINE
18748: {{ADD{#NUM02{LSTLC{{COUNT TITLE LINE AND BLANK LINE
18749: *
18750: * PRINT SUB-TITLE (IF ANY)
18751: *
18752: {{MOV{R$STL{R9{{LOAD POINTER TO SUB-TITLE
18753: {{BZE{R9{LSTT1{{JUMP IF NO SUB-TITLE
18754: {{JSR{PRTST{{{ELSE PRINT SUB-TITLE
18755: {{JSR{PRTNL{{{TERMINATE LINE
18756: {{ICV{LSTLC{{{BUMP LINE COUNT
18757: *
18758: * RETURN POINT
18759: *
18760: {LSTT1{JSR{PRTNL{{{PRINT A BLANK LINE
18761: {{EXI{{{{RETURN TO CALLER
18762: {{ENP{{{{END PROCEDURE LISTT
18763: {{EJC{{{{
18764: *
18765: * NEXTS -- ACQUIRE NEXT SOURCE IMAGE
18766: *
18767: * NEXTS IS USED TO ACQUIRE THE NEXT SOURCE IMAGE AT COMPILE
18768: * TIME. IT ASSUMES THAT A PRIOR CALL TO READR HAS INPUT
18769: * A LINE IMAGE (SEE PROCEDURE READR). BEFORE THE CURRENT
18770: * IMAGE IS FINALLY LOST IT MAY BE LISTED HERE.
18771: *
18772: * JSR NEXTS CALL TO ACQUIRE NEXT INPUT LINE
18773: * (XR,XL,WA,WB,WC) DESTROYED
18774: *
18775: * GLOBAL VALUES AFFECTED
18776: *
18777: * R$CNI ON INPUT, NEXT IMAGE. ON
18778: * EXIT RESET TO ZERO
18779: *
18780: * R$CIM ON EXIT, SET TO POINT TO IMAGE
18781: *
18782: * SCNIL INPUT IMAGE LENGTH ON EXIT
18783: *
18784: * SCNSE RESET TO ZERO ON EXIT
18785: *
18786: * LSTPF SET ON EXIT IF LINE IS LISTED
18787: *
18788: {NEXTS{PRC{E{0{{ENTRY POINT
18789: {{BZE{CSWLS{NXTS2{{JUMP IF -NOLIST
18790: {{MOV{R$CIM{R9{{POINT TO IMAGE
18791: {{BZE{R9{NXTS2{{JUMP IF NO IMAGE
18792: {{PLC{R9{{{GET CHAR PTR
18793: {{LCH{R6{(R9){{GET FIRST CHAR
18794: {{BNE{R6{#CH$MN{NXTS1{JUMP IF NOT CTRL CARD
18795: {{BZE{CSWPR{NXTS2{{JUMP IF -NOPRINT
18796: *
18797: * HERE TO CALL LISTER
18798: *
18799: {NXTS1{JSR{LISTR{{{LIST LINE
18800: *
18801: * HERE AFTER POSSIBLE LISTING
18802: *
18803: {NXTS2{MOV{R$CNI{R9{{POINT TO NEXT IMAGE
18804: {{MOV{R9{R$CIM{{SET AS NEXT IMAGE
18805: {{ZER{R$CNI{{{CLEAR NEXT IMAGE POINTER
18806: {{MOV{4*SCLEN(R9){R6{{GET INPUT IMAGE LENGTH
18807: {{MOV{CSWIN{R7{{GET MAX ALLOWABLE LENGTH
18808: {{BLO{R6{R7{NXTS3{SKIP IF NOT TOO LONG
18809: {{MOV{R7{R6{{ELSE TRUNCATE
18810: *
18811: * HERE WITH LENGTH IN (WA)
18812: *
18813: {NXTS3{MOV{R6{SCNIL{{USE AS RECORD LENGTH
18814: {{ZER{SCNSE{{{RESET SCNSE
18815: {{ZER{LSTPF{{{SET LINE NOT LISTED YET
18816: {{EXI{{{{RETURN TO NEXTS CALLER
18817: {{ENP{{{{END PROCEDURE NEXTS
18818: {{EJC{{{{
18819: *
18820: * PATIN -- PATTERN CONSTRUCTION FOR LEN,POS,RPOS,TAB,RTAB
18821: *
18822: * THESE PATTERN TYPES ALL GENERATE A SIMILAR NODE TYPE. SO
18823: * THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION
18824: * FOR ACTUAL ENTRY POINTS FOR THESE FIVE FUNCTIONS.
18825: *
18826: * (WA) PCODE FOR EXPRESSION ARG CASE
18827: * (WB) PCODE FOR INTEGER ARG CASE
18828: * JSR PATIN CALL TO BUILD PATTERN NODE
18829: * PPM LOC TRANSFER LOC FOR NOT INTEGER OR EXP
18830: * PPM LOC TRANSFER LOC FOR INT OUT OF RANGE
18831: * (XR) POINTER TO CONSTRUCTED NODE
18832: * (XL,WA,WB,WC,IA) DESTROYED
18833: *
18834: {PATIN{PRC{N{2{{ENTRY POINT
18835: {{MOV{R6{R10{{PRESERVE EXPRESSION ARG PCODE
18836: {{JSR{GTSMI{{{TRY TO CONVERT ARG AS SMALL INTEGER
18837: {{PPM{PTIN2{{{JUMP IF NOT INTEGER
18838: {{PPM{PTIN3{{{JUMP IF OUT OF RANGE
18839: *
18840: * COMMON SUCCESSFUL EXIT POINT
18841: *
18842: {PTIN1{JSR{PBILD{{{BUILD PATTERN NODE
18843: {{EXI{{{{RETURN TO CALLER
18844: *
18845: * HERE IF ARGUMENT IS NOT AN INTEGER
18846: *
18847: {PTIN2{MOV{R10{R7{{COPY EXPR ARG CASE PCODE
18848: {{BLO{(R9){#B$E$${PTIN1{ALL OK IF EXPRESSION ARG
18849: {{EXI{1{{{ELSE TAKE ERROR EXIT FOR WRONG TYPE
18850: *
18851: * HERE FOR ERROR OF OUT OF RANGE INTEGER ARGUMENT
18852: *
18853: {PTIN3{EXI{2{{{TAKE OUT-OF-RANGE ERROR EXIT
18854: {{ENP{{{{END PROCEDURE PATIN
18855: {{EJC{{{{
18856: *
18857: * PATST -- PATTERN CONSTRUCTION FOR ANY,NOTANY,
18858: * BREAK,SPAN AND BREAKX PATTERN FUNCTIONS.
18859: *
18860: * THESE PATTERN FUNCTIONS BUILD SIMILAR TYPES OF NODES AND
18861: * THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION
18862: * FOR ACTUAL ENTRY POINTS FOR THESE FIVE PATTERN FUNCTIONS.
18863: *
18864: * 0(XS) STRING ARGUMENT
18865: * (WB) PCODE FOR ONE CHAR ARGUMENT
18866: * (XL) PCODE FOR MULTI-CHAR ARGUMENT
18867: * (WC) PCODE FOR EXPRESSION ARGUMENT
18868: * JSR PATST CALL TO BUILD NODE
18869: * PPM LOC TRANSFER LOC IF NOT STRING OR EXPR
18870: * (XS) POPPED PAST STRING ARGUMENT
18871: * (XR) POINTER TO CONSTRUCTED NODE
18872: * (XL) DESTROYED
18873: * (WA,WB,WC,RA) DESTROYED
18874: *
18875: * NOTE THAT THERE IS A SPECIAL CALL TO PATST IN THE EVALS
18876: * PROCEDURE WITH A SLIGHTLY DIFFERENT FORM. SEE EVALS
18877: * FOR DETAILS OF THE FORM OF THIS CALL.
18878: *
18879: {PATST{PRC{N{1{{ENTRY POINT
18880: {{JSR{GTSTG{{{CONVERT ARGUMENT AS STRING
18881: {{PPM{PATS7{{{JUMP IF NOT STRING
18882: {{BNE{R6{#NUM01{PATS2{JUMP IF NOT ONE CHAR STRING
18883: *
18884: * HERE FOR ONE CHAR STRING CASE
18885: *
18886: {{BZE{R7{PATS2{{TREAT AS MULTI-CHAR IF EVALS CALL
18887: {{PLC{R9{{{POINT TO CHARACTER
18888: {{LCH{R9{(R9){{LOAD CHARACTER
18889: *
18890: * COMMON EXIT POINT AFTER SUCCESSFUL CONSTRUCTION
18891: *
18892: {PATS1{JSR{PBILD{{{CALL ROUTINE TO BUILD NODE
18893: {{EXI{{{{RETURN TO PATST CALLER
18894: {{EJC{{{{
18895: *
18896: * PATST (CONTINUED)
18897: *
18898: * HERE FOR MULTI-CHARACTER STRING CASE
18899: *
18900: {PATS2{MOV{R10{-(SP){{SAVE MULTI-CHAR PCODE
18901: {{MOV{R9{-(SP){{SAVE STRING POINTER
18902: {{MOV{CTMSK{R8{{LOAD CURRENT MASK BIT
18903: {{LSH{R8{1{{SHIFT TO NEXT POSITION
18904: {{NZB{R8{PATS4{{SKIP IF POSITION LEFT IN THIS TBL
18905: *
18906: * HERE WE MUST ALLOCATE A NEW CHARACTER TABLE
18907: *
18908: {{MOV{#4*CTSI${R6{{SET SIZE OF CTBLK
18909: {{JSR{ALLOC{{{ALLOCATE CTBLK
18910: {{MOV{R9{R$CTP{{STORE PTR TO NEW CTBLK
18911: {{MOV{#B$CTT{(R9)+{{STORE TYPE CODE, BUMP PTR
18912: {{LCT{R7{#CFP$A{{SET NUMBER OF WORDS TO CLEAR
18913: {{MOV{BITS0{R8{{LOAD ALL ZERO BITS
18914: *
18915: * LOOP TO CLEAR ALL BITS IN TABLE TO ZEROS
18916: *
18917: {PATS3{MOV{R8{(R9)+{{MOVE WORD OF ZERO BITS
18918: {{BCT{R7{PATS3{{LOOP TILL ALL CLEARED
18919: {{MOV{BITS1{R8{{SET INITIAL BIT POSITION
18920: *
18921: * MERGE HERE WITH BIT POSITION AVAILABLE
18922: *
18923: {PATS4{MOV{R8{CTMSK{{SAVE PARM2 (NEW BIT POSITION)
18924: {{MOV{(SP)+{R10{{RESTORE POINTER TO ARGUMENT STRING
18925: {{MOV{4*SCLEN(R10){R7{{LOAD STRING LENGTH
18926: {{BZE{R7{PATS6{{JUMP IF NULL STRING CASE
18927: {{LCT{R7{R7{{ELSE SET LOOP COUNTER
18928: {{PLC{R10{{{POINT TO CHARACTERS IN ARGUMENT
18929: {{EJC{{{{
18930: *
18931: * PATST (CONTINUED)
18932: *
18933: * LOOP TO SET BITS IN COLUMN OF TABLE
18934: *
18935: {PATS5{LCH{R6{(R10)+{{LOAD NEXT CHARACTER
18936: {{WTB{R6{{{CONVERT TO BYTE OFFSET
18937: {{MOV{R$CTP{R9{{POINT TO CTBLK
18938: {{ADD{R6{R9{{POINT TO CTBLK ENTRY
18939: {{MOV{R8{R6{{COPY BIT MASK
18940: {{ORB{4*CTCHS(R9){R6{{OR IN BITS ALREADY SET
18941: {{MOV{R6{4*CTCHS(R9){{STORE RESULTING BIT STRING
18942: {{BCT{R7{PATS5{{LOOP TILL ALL BITS SET
18943: *
18944: * COMPLETE PROCESSING FOR MUTI-CHAR STRING CASE
18945: *
18946: {PATS6{MOV{R$CTP{R9{{LOAD CTBLK PTR AS PARM1 FOR PBILD
18947: {{ZER{R10{{{CLEAR GARBAGE PTR IN XL
18948: {{MOV{(SP)+{R7{{LOAD PCODE FOR MULTI-CHAR STR CASE
18949: {{BRN{PATS1{{{BACK TO EXIT (WC=BITSTRING=PARM2)
18950: *
18951: * HERE IF ARGUMENT IS NOT A STRING
18952: *
18953: * NOTE THAT THE CALL FROM EVALS CANNOT PASS AN EXPRESSION
18954: * SINCE EVALP ALWAYS REEVALUATES EXPRESSIONS.
18955: *
18956: {PATS7{MOV{R8{R7{{SET PCODE FOR EXPRESSION ARGUMENT
18957: {{BLO{(R9){#B$E$${PATS1{JUMP TO EXIT IF EXPRESSION ARG
18958: {{EXI{1{{{ELSE TAKE WRONG TYPE ERROR EXIT
18959: {{ENP{{{{END PROCEDURE PATST
18960: {{EJC{{{{
18961: *
18962: * PBILD -- BUILD PATTERN NODE
18963: *
18964: * (XR) PARM1 (ONLY IF REQUIRED)
18965: * (WB) PCODE FOR NODE
18966: * (WC) PARM2 (ONLY IF REQUIRED)
18967: * JSR PBILD CALL TO BUILD NODE
18968: * (XR) POINTER TO CONSTRUCTED NODE
18969: * (WA) DESTROYED
18970: *
18971: {PBILD{PRC{E{0{{ENTRY POINT
18972: {{MOV{R9{-(SP){{STACK POSSIBLE PARM1
18973: {{MOV{R7{R9{{COPY PCODE
18974: {{LEI{R9{{{LOAD ENTRY POINT ID (BL$PX)
18975: {{BEQ{R9{#BL$P1{PBLD1{JUMP IF ONE PARAMETER
18976: {{BEQ{R9{#BL$P0{PBLD3{JUMP IF NO PARAMETERS
18977: *
18978: * HERE FOR TWO PARAMETER CASE
18979: *
18980: {{MOV{#4*PCSI${R6{{SET SIZE OF P2BLK
18981: {{JSR{ALLOC{{{ALLOCATE BLOCK
18982: {{MOV{R8{4*PARM2(R9){{STORE SECOND PARAMETER
18983: {{BRN{PBLD2{{{MERGE WITH ONE PARM CASE
18984: *
18985: * HERE FOR ONE PARAMETER CASE
18986: *
18987: {PBLD1{MOV{#4*PBSI${R6{{SET SIZE OF P1BLK
18988: {{JSR{ALLOC{{{ALLOCATE NODE
18989: *
18990: * MERGE HERE FROM TWO PARM CASE
18991: *
18992: {PBLD2{MOV{(SP){4*PARM1(R9){{STORE FIRST PARAMETER
18993: {{BRN{PBLD4{{{MERGE WITH NO PARAMETER CASE
18994: *
18995: * HERE FOR CASE OF NO PARAMETERS
18996: *
18997: {PBLD3{MOV{#4*PASI${R6{{SET SIZE OF P0BLK
18998: {{JSR{ALLOC{{{ALLOCATE NODE
18999: *
19000: * MERGE HERE FROM OTHER CASES
19001: *
19002: {PBLD4{MOV{R7{(R9){{STORE PCODE
19003: {{ICA{SP{{{POP FIRST PARAMETER
19004: {{MOV{#NDNTH{4*PTHEN(R9){{SET NOTHEN SUCCESSOR POINTER
19005: {{EXI{{{{RETURN TO PBILD CALLER
19006: {{ENP{{{{END PROCEDURE PBILD
19007: {{EJC{{{{
19008: *
19009: * PCONC -- CONCATENATE TWO PATTERNS
19010: *
19011: * (XL) PTR TO RIGHT PATTERN
19012: * (XR) PTR TO LEFT PATTERN
19013: * JSR PCONC CALL TO CONCATENATE PATTERNS
19014: * (XR) PTR TO CONCATENATED PATTERN
19015: * (XL,WA,WB,WC) DESTROYED
19016: *
19017: *
19018: * TO CONCATENATE TWO PATTERNS, ALL SUCCESSORS IN THE LEFT
19019: * PATTERN WHICH POINT TO THE NOTHEN NODE MUST BE CHANGED TO
19020: * POINT TO THE RIGHT PATTERN. HOWEVER, THIS MODIFICATION
19021: * MUST BE PERFORMED ON A COPY OF THE LEFT ARGUMENT RATHER
19022: * THAN THE LEFT ARGUMENT ITSELF, SINCE THE LEFT ARGUMENT
19023: * MAY BE POINTED TO BY SOME OTHER VARIABLE VALUE.
19024: *
19025: * ACCORDINGLY, IT IS NECESSARY TO COPY THE LEFT ARGUMENT.
19026: * THIS IS NOT A TRIVIAL PROCESS SINCE WE MUST AVOID COPYING
19027: * NODES MORE THAN ONCE AND THE PATTERN IS A GRAPH STRUCTURE
19028: * THE FOLLOWING ALGORITHM IS EMPLOYED.
19029: *
19030: * THE STACK IS USED TO STORE A LIST OF NODES WHICH
19031: * HAVE ALREADY BEEN COPIED. THE FORMAT OF THE ENTRIES ON
19032: * THIS LIST CONSISTS OF A TWO WORD BLOCK. THE FIRST WORD
19033: * IS THE OLD ADDRESS AND THE SECOND WORD IS THE ADDRESS
19034: * OF THE COPY. THIS LIST IS SEARCHED BY THE PCOPY
19035: * ROUTINE TO AVOID MAKING DUPLICATE COPIES. A TRICK IS
19036: * USED TO ACCOMPLISH THE CONCATENATION AT THE SAME TIME.
19037: * A SPECIAL ENTRY IS MADE TO START WITH ON THE STACK. THIS
19038: * ENTRY RECORDS THAT THE NOTHEN NODE HAS BEEN COPIED
19039: * ALREADY AND THE ADDRESS OF ITS COPY IS THE RIGHT PATTERN.
19040: * THIS AUTOMATICALLY PERFORMS THE CORRECT REPLACEMENTS.
19041: *
19042: {PCONC{PRC{E{0{{ENTRY POINT
19043: {{ZER{-(SP){{{MAKE ROOM FOR ONE ENTRY AT BOTTOM
19044: {{MOV{SP{R8{{STORE POINTER TO START OF LIST
19045: {{MOV{#NDNTH{-(SP){{STACK NOTHEN NODE AS OLD NODE
19046: {{MOV{R10{-(SP){{STORE RIGHT ARG AS COPY OF NOTHEN
19047: {{MOV{SP{R10{{INITIALIZE POINTER TO STACK ENTRIES
19048: {{JSR{PCOPY{{{COPY FIRST NODE OF LEFT ARG
19049: {{MOV{R6{4*2(R10){{STORE AS RESULT UNDER LIST
19050: {{EJC{{{{
19051: *
19052: * PCONC (CONTINUED)
19053: *
19054: * THE FOLLOWING LOOP SCANS ENTRIES IN THE LIST AND MAKES
19055: * SURE THAT THEIR SUCCESSORS HAVE BEEN COPIED.
19056: *
19057: {PCNC1{BEQ{R10{SP{PCNC2{JUMP IF ALL ENTRIES PROCESSED
19058: {{MOV{-(R10){R9{{ELSE LOAD NEXT OLD ADDRESS
19059: {{MOV{4*PTHEN(R9){R9{{LOAD POINTER TO SUCCESSOR
19060: {{JSR{PCOPY{{{COPY SUCCESSOR NODE
19061: {{MOV{-(R10){R9{{LOAD POINTER TO NEW NODE (COPY)
19062: {{MOV{R6{4*PTHEN(R9){{STORE PTR TO NEW SUCCESSOR
19063: *
19064: * NOW CHECK FOR SPECIAL CASE OF ALTERNATION NODE WHERE
19065: * PARM1 POINTS TO A NODE AND MUST BE COPIED LIKE PTHEN.
19066: *
19067: {{BNE{(R9){#P$ALT{PCNC1{LOOP BACK IF NOT
19068: {{MOV{4*PARM1(R9){R9{{ELSE LOAD POINTER TO ALTERNATIVE
19069: {{JSR{PCOPY{{{COPY IT
19070: {{MOV{(R10){R9{{RESTORE PTR TO NEW NODE
19071: {{MOV{R6{4*PARM1(R9){{STORE PTR TO COPIED ALTERNATIVE
19072: {{BRN{PCNC1{{{LOOP BACK FOR NEXT ENTRY
19073: *
19074: * HERE AT END OF COPY PROCESS
19075: *
19076: {PCNC2{MOV{R8{SP{{RESTORE STACK POINTER
19077: {{MOV{(SP)+{R9{{LOAD POINTER TO COPY
19078: {{EXI{{{{RETURN TO PCONC CALLER
19079: {{ENP{{{{END PROCEDURE PCONC
19080: {{EJC{{{{
19081: *
19082: * PCOPY -- COPY A PATTERN NODE
19083: *
19084: * PCOPY IS CALLED FROM THE PCONC PROCEDURE TO COPY A SINGLE
19085: * PATTERN NODE. THE COPY IS ONLY CARRIED OUT IF THE NODE
19086: * HAS NOT BEEN COPIED ALREADY.
19087: *
19088: * (XR) POINTER TO NODE TO BE COPIED
19089: * (XT) PTR TO CURRENT LOC IN COPY LIST
19090: * (WC) POINTER TO LIST OF COPIED NODES
19091: * JSR PCOPY CALL TO COPY A NODE
19092: * (WA) POINTER TO COPY
19093: * (WB,XR) DESTROYED
19094: *
19095: {PCOPY{PRC{N{0{{ENTRY POINT
19096: {{MOV{R10{R7{{SAVE XT
19097: {{MOV{R8{R10{{POINT TO START OF LIST
19098: *
19099: * LOOP TO SEARCH LIST OF NODES COPIED ALREADY
19100: *
19101: {PCOP1{DCA{R10{{{POINT TO NEXT ENTRY ON LIST
19102: {{BEQ{R9{(R10){PCOP2{JUMP IF MATCH
19103: {{DCA{R10{{{ELSE SKIP OVER COPIED ADDRESS
19104: {{BNE{R10{SP{PCOP1{LOOP BACK IF MORE TO TEST
19105: *
19106: * HERE IF NOT IN LIST, PERFORM COPY
19107: *
19108: {{MOV{(R9){R6{{LOAD FIRST WORD OF BLOCK
19109: {{JSR{BLKLN{{{GET LENGTH OF BLOCK
19110: {{MOV{R9{R10{{SAVE POINTER TO OLD NODE
19111: {{JSR{ALLOC{{{ALLOCATE SPACE FOR COPY
19112: {{MOV{R10{-(SP){{STORE OLD ADDRESS ON LIST
19113: {{MOV{R9{-(SP){{STORE NEW ADDRESS ON LIST
19114: {{CHK{{{{CHECK FOR STACK OVERFLOW
19115: {{MVW{{{{MOVE WORDS FROM OLD BLOCK TO COPY
19116: {{MOV{(SP){R6{{LOAD POINTER TO COPY
19117: {{BRN{PCOP3{{{JUMP TO EXIT
19118: *
19119: * HERE IF WE FIND ENTRY IN LIST
19120: *
19121: {PCOP2{MOV{-(R10){R6{{LOAD ADDRESS OF COPY FROM LIST
19122: *
19123: * COMMON EXIT POINT
19124: *
19125: {PCOP3{MOV{R7{R10{{RESTORE XT
19126: {{EXI{{{{RETURN TO PCOPY CALLER
19127: {{ENP{{{{END PROCEDURE PCOPY
19128: {{EJC{{{{
19129: *
19130: * PRFLR -- PRINT PROFILE
19131: * PRFLR IS CALLED TO PRINT THE CONTENTS OF THE PROFILE
19132: * TABLE IN A FAIRLY READABLE TABULAR FORMAT.
19133: *
19134: * JSR PRFLR CALL TO PRINT PROFILE
19135: * (WA,IA) DESTROYED
19136: *
19137: {PRFLR{PRC{E{0{{
19138: {{BZE{PFDMP{PRFL4{{NO PRINTING IF NO PROFILING DONE
19139: {{MOV{R9{-(SP){{PRESERVE ENTRY XR
19140: {{MOV{R7{PFSVW{{AND ALSO WB
19141: {{JSR{PRTPG{{{EJECT
19142: {{MOV{#PFMS1{R9{{LOAD MSG /PROGRAM PROFILE/
19143: {{JSR{PRTST{{{AND PRINT IT
19144: {{JSR{PRTNL{{{FOLLOWED BY NEWLINE
19145: {{JSR{PRTNL{{{AND ANOTHER
19146: {{MOV{#PFMS2{R9{{POINT TO FIRST HDR
19147: {{JSR{PRTST{{{PRINT IT
19148: {{JSR{PRTNL{{{NEW LINE
19149: {{MOV{#PFMS3{R9{{SECOND HDR
19150: {{JSR{PRTST{{{PRINT IT
19151: {{JSR{PRTNL{{{NEW LINE
19152: {{JSR{PRTNL{{{AND ANOTHER BLANK LINE
19153: {{ZER{R7{{{INITIAL STMT COUNT
19154: {{MOV{PFTBL{R9{{POINT TO TABLE ORIGIN
19155: {{ADD{#4*NUM02{R9{{BIAS PAST XNBLK HEADER (SGD07)
19156: *
19157: * LOOP HERE TO PRINT SUCCESSIVE ENTRIES
19158: *
19159: {PRFL1{ICV{R7{{{BUMP STMT NR
19160: {{LDI{(R9){{{LOAD NR OF EXECUTIONS
19161: {{IEQ{PRFL3{{{NO PRINTING IF ZERO
19162: {{MOV{#PFPD1{PROFS{{POINT WHERE TO PRINT
19163: {{JSR{PRTIN{{{AND PRINT IT
19164: {{ZER{PROFS{{{BACK TO START OF LINE
19165: {{MTI{R7{{{LOAD STMT NR
19166: {{JSR{PRTIN{{{PRINT IT THERE
19167: {{MOV{#PFPD2{PROFS{{AND PAD PAST COUNT
19168: {{LDI{4*CFP$I(R9){{{LOAD TOTAL EXEC TIME
19169: {{JSR{PRTIN{{{PRINT THAT TOO
19170: {{LDI{4*CFP$I(R9){{{RELOAD TIME
19171: {{MLI{INTTH{{{CONVERT TO MICROSEC
19172: {{IOV{PRFL2{{{OMIT NEXT BIT IF OVERFLOW
19173: {{DVI{(R9){{{DIVIDE BY EXECUTIONS
19174: {{MOV{#PFPD3{PROFS{{PAD LAST PRINT
19175: {{JSR{PRTIN{{{AND PRINT MCSEC/EXECN
19176: *
19177: * MERGE AFTER PRINTING TIME
19178: *
19179: {PRFL2{JSR{PRTNL{{{THATS ANOTHER LINE
19180: *
19181: * HERE TO GO TO NEXT ENTRY
19182: *
19183: {PRFL3{ADD{#4*PF$I2{R9{{BUMP INDEX PTR (SGD07)
19184: {{BLT{R7{PFNTE{PRFL1{LOOP IF MORE STMTS
19185: {{MOV{(SP)+{R9{{RESTORE CALLERS XR
19186: {{MOV{PFSVW{R7{{AND WB TOO
19187: *
19188: * HERE TO EXIT
19189: *
19190: {PRFL4{EXI{{{{RETURN
19191: {{ENP{{{{END OF PRFLR
19192: {{EJC{{{{
19193: *
19194: * PRFLU -- UPDATE AN ENTRY IN THE PROFILE TABLE
19195: *
19196: * ON ENTRY, KVSTN CONTAINS NR OF STMT TO PROFILE
19197: *
19198: * JSR PRFLU CALL TO UPDATE ENTRY
19199: * (IA) DESTROYED
19200: *
19201: {PRFLU{PRC{E{0{{
19202: {{BNZ{PFFNC{PFLU4{{SKIP IF JUST ENTERED FUNCTION
19203: {{MOV{R9{-(SP){{PRESERVE ENTRY XR
19204: {{MOV{R6{PFSVW{{SAVE WA (SGD07)
19205: {{BNZ{PFTBL{PFLU2{{BRANCH IF TABLE ALLOCATED
19206: *
19207: * HERE IF SPACE FOR PROFILE TABLE NOT YET ALLOCATED.
19208: * CALCULATE SIZE NEEDED, ALLOCATE A STATIC XNBLK, AND
19209: * INITIALIZE IT ALL TO ZERO.
19210: * THE TIME TAKEN FOR THIS WILL BE ATTRIBUTED TO THE CURRENT
19211: * STATEMENT (ASSIGNMENT TO KEYWD PROFILE), BUT SINCE THE
19212: * TIMING FOR THIS STATEMENT IS UP THE POLE ANYWAY, THIS
19213: * DOESNT REALLY MATTER...
19214: *
19215: {{SUB{#NUM01{PFNTE{{ADJUST FOR EXTRA COUNT (SGD07)
19216: {{MTI{PFI2A{{{CONVRT ENTRY SIZE TO INT
19217: {{STI{PFSTE{{{AND STORE SAFELY FOR LATER
19218: {{MTI{PFNTE{{{LOAD TABLE LENGTH AS INTEGER
19219: {{MLI{PFSTE{{{MULTIPLY BY ENTRY SIZE
19220: {{MFI{R6{{{GET BACK ADDRESS-STYLE
19221: {{ADD{#NUM02{R6{{ADD ON 2 WORD OVERHEAD
19222: {{WTB{R6{{{CONVERT THE WHOLE LOT TO BYTES
19223: {{JSR{ALOST{{{GIMME THE SPACE
19224: {{MOV{R9{PFTBL{{SAVE BLOCK POINTER
19225: {{MOV{#B$XNT{(R9)+{{PUT BLOCK TYPE AND ...
19226: {{MOV{R6{(R9)+{{... LENGTH INTO HEADER
19227: {{MFI{R6{{{GET BACK NR OF WDS IN DATA AREA
19228: {{LCT{R6{R6{{LOAD THE COUNTER
19229: *
19230: * LOOP HERE TO ZERO THE BLOCK DATA
19231: *
19232: {PFLU1{ZER{(R9)+{{{BLANK A WORD
19233: {{BCT{R6{PFLU1{{AND ALLLLLLL THE REST
19234: *
19235: * END OF ALLOCATION. MERGE BACK INTO ROUTINE
19236: *
19237: {PFLU2{MTI{KVSTN{{{LOAD NR OF STMT JUST ENDED
19238: {{SBI{INTV1{{{MAKE INTO INDEX OFFSET
19239: {{MLI{PFSTE{{{MAKE OFFSET OF TABLE ENTRY
19240: {{MFI{R6{{{CONVERT TO ADDRESS
19241: {{WTB{R6{{{GET AS BAUS
19242: {{ADD{#4*NUM02{R6{{OFFSET INCLUDES TABLE HEADER
19243: {{MOV{PFTBL{R9{{GET TABLE START
19244: {{BGE{R6{4*NUM01(R9){PFLU3{IF OUT OF TABLE, SKIP IT
19245: {{ADD{R6{R9{{ELSE POINT TO ENTRY
19246: {{LDI{(R9){{{GET NR OF EXECUTIONS SO FAR
19247: {{ADI{INTV1{{{NUDGE UP ONE
19248: {{STI{(R9){{{AND PUT BACK
19249: {{JSR{SYSTM{{{GET TIME NOW
19250: {{STI{PFETM{{{STASH ENDING TIME
19251: {{SBI{PFSTM{{{SUBTRACT START TIME
19252: {{ADI{4*CFP$I(R9){{{ADD CUMULATIVE TIME SO FAR
19253: {{STI{4*CFP$I(R9){{{AND PUT BACK NEW TOTAL
19254: {{LDI{PFETM{{{LOAD END TIME OF THIS STMT ...
19255: {{STI{PFSTM{{{... WHICH IS START TIME OF NEXT
19256: *
19257: * MERGE HERE TO EXIT
19258: *
19259: {PFLU3{MOV{(SP)+{R9{{RESTORE CALLERS XR
19260: {{MOV{PFSVW{R6{{RESTORE SAVED REG
19261: {{EXI{{{{AND RETURN
19262: *
19263: * HERE IF PROFILE IS SUPPRESSED BECAUSE A PROGRAM DEFINED
19264: * FUNCTION IS ABOUT TO BE ENTERED, AND SO THE CURRENT STMT
19265: * HAS NOT YET FINISHED
19266: *
19267: {PFLU4{ZER{PFFNC{{{RESET THE CONDITION FLAG
19268: {{EXI{{{{AND IMMEDIATE RETURN
19269: {{ENP{{{{END OF PROCEDURE PRFLU
19270: {{EJC{{{{
19271: *
19272: * PRPAR - PROCESS PRINT PARAMETERS
19273: *
19274: * (WC) IF NONZERO ASSOCIATE TERMINAL ONLY
19275: * JSR PRPAR CALL TO PROCESS PRINT PARAMETERS
19276: * (XL,XR,WA,WB,WC) DESTROYED
19277: *
19278: * SINCE MEMORY ALLOCATION IS UNDECIDED ON INITIAL CALL,
19279: * TERMINAL CANNOT BE ASSOCIATED. THE ENTRY WITH WC NON-ZERO
19280: * IS PROVIDED SO A LATER CALL CAN BE MADE TO COMPLETE THIS.
19281: *
19282: {PRPAR{PRC{E{0{{ENTRY POINT
19283: {{BNZ{R8{PRPA7{{JUMP TO ASSOCIATE TERMINAL
19284: {{JSR{SYSPP{{{GET PRINT PARAMETERS
19285: {{BNZ{R7{PRPA1{{JUMP IF LINES/PAGE SPECIFIED
19286: {{MOV{#CFP$M{R7{{ELSE USE A LARGE VALUE
19287: {{RSH{R7{1{{BUT NOT TOO LARGE
19288: *
19289: * STORE LINE COUNT/PAGE
19290: *
19291: {PRPA1{MOV{R7{LSTNP{{STORE NUMBER OF LINES/PAGE
19292: {{MOV{R7{LSTLC{{PRETEND PAGE IS FULL INITIALLY
19293: {{ZER{LSTPG{{{CLEAR PAGE NUMBER
19294: {{MOV{PRLEN{R7{{GET PRIOR LENGTH IF ANY
19295: {{BZE{R7{PRPA2{{SKIP IF NO LENGTH
19296: {{BGT{R6{R7{PRPA3{SKIP STORING IF TOO BIG
19297: *
19298: * STORE PRINT BUFFER LENGTH
19299: *
19300: {PRPA2{MOV{R6{PRLEN{{STORE VALUE
19301: *
19302: * PROCESS BITS OPTIONS
19303: *
19304: {PRPA3{MOV{BITS3{R7{{BIT 3 MASK
19305: {{ANB{R8{R7{{GET -NOLIST BIT
19306: {{ZRB{R7{PRPA4{{SKIP IF CLEAR
19307: {{ZER{CSWLS{{{SET -NOLIST
19308: *
19309: * CHECK IF FAIL REPORTS GOTO INTERACTIVE CHANNEL
19310: *
19311: {PRPA4{MOV{BITS1{R7{{BIT 1 MASK
19312: {{ANB{R8{R7{{GET BIT
19313: {{MOV{R7{ERICH{{STORE INT. CHAN. ERROR FLAG
19314: {{MOV{BITS2{R7{{BIT 2 MASK
19315: {{ANB{R8{R7{{GET BIT
19316: {{MOV{R7{PRICH{{FLAG FOR STD PRINTER ON INT. CHAN.
19317: {{MOV{BITS4{R7{{BIT 4 MASK
19318: {{ANB{R8{R7{{GET BIT
19319: {{MOV{R7{CPSTS{{FLAG FOR COMPILE STATS SUPPRESSN.
19320: {{MOV{BITS5{R7{{BIT 5 MASK
19321: {{ANB{R8{R7{{GET BIT
19322: {{MOV{R7{EXSTS{{FLAG FOR EXEC STATS SUPPRESSION
19323: {{EJC{{{{
19324: *
19325: * PRPAR (CONTINUED)
19326: *
19327: {{MOV{BITS6{R7{{BIT 6 MASK
19328: {{ANB{R8{R7{{GET BIT
19329: {{MOV{R7{PRECL{{EXTENDED/COMPACT LISTING FLAG
19330: {{SUB{#NUM08{R6{{POINT 8 CHARS FROM LINE END
19331: {{ZRB{R7{PRPA5{{JUMP IF NOT EXTENDED
19332: {{MOV{R6{LSTPO{{STORE FOR LISTING PAGE HEADINGS
19333: *
19334: * CONTINUE OPTION PROCESSING
19335: *
19336: {PRPA5{MOV{BITS7{R7{{BIT 7 MASK
19337: {{ANB{R8{R7{{GET BIT 7
19338: {{MOV{R7{CSWEX{{SET -NOEXECUTE IF NON-ZERO
19339: {{MOV{BIT10{R7{{BIT 10 MASK
19340: {{ANB{R8{R7{{GET BIT 10
19341: {{MOV{R7{HEADP{{PRETEND PRINTED TO OMIT HEADERS
19342: {{MOV{BITS9{R7{{BIT 9 MASK
19343: {{ANB{R8{R7{{GET BIT 9
19344: {{MOV{R7{PRSTO{{KEEP IT AS STD LISTING OPTION
19345: {{ZRB{R7{PRPA6{{SKIP IF CLEAR
19346: {{MOV{PRLEN{R6{{GET PRINT BUFFER LENGTH
19347: {{SUB{#NUM08{R6{{POINT 8 CHARS FROM LINE END
19348: {{MOV{R6{LSTPO{{STORE PAGE OFFSET
19349: *
19350: * CHECK FOR TERMINAL
19351: *
19352: {PRPA6{ANB{BITS8{R8{{SEE IF TERMINAL TO BE ACTIVATED
19353: {{BNZ{R8{PRPA7{{JUMP IF TERMINAL REQUIRED
19354: {{BZE{INITR{PRPA8{{JUMP IF NO TERMINAL TO DETACH
19355: {{MOV{#V$TER{R10{{PTR TO /TERMINAL/
19356: {{JSR{GTNVR{{{GET VRBLK POINTER
19357: {{PPM{{{{CANT FAIL
19358: {{MOV{#NULLS{4*VRVAL(R9){{CLEAR VALUE OF TERMINAL
19359: {{JSR{SETVR{{{REMOVE ASSOCIATION
19360: {{BRN{PRPA8{{{RETURN
19361: *
19362: * ASSOCIATE TERMINAL
19363: *
19364: {PRPA7{MNZ{INITR{{{NOTE TERMINAL ASSOCIATED
19365: {{BZE{DNAMB{PRPA8{{CANT IF MEMORY NOT ORGANISED
19366: {{MOV{#V$TER{R10{{POINT TO TERMINAL STRING
19367: {{MOV{#TRTOU{R7{{OUTPUT TRACE TYPE
19368: {{JSR{INOUT{{{ATTACH OUTPUT TRBLK TO VRBLK
19369: {{MOV{R9{-(SP){{STACK TRBLK PTR
19370: {{MOV{#V$TER{R10{{POINT TO TERMINAL STRING
19371: {{MOV{#TRTIN{R7{{INPUT TRACE TYPE
19372: {{JSR{INOUT{{{ATTACH INPUT TRACE BLK
19373: {{MOV{(SP)+{4*VRVAL(R9){{ADD OUTPUT TRBLK TO CHAIN
19374: *
19375: * RETURN POINT
19376: *
19377: {PRPA8{EXI{{{{RETURN
19378: {{ENP{{{{END PROCEDURE PRPAR
19379: {{EJC{{{{
19380: *
19381: * PRTCH -- PRINT A CHARACTER
19382: *
19383: * PRTCH IS USED TO PRINT A SINGLE CHARACTER
19384: *
19385: * (WA) CHARACTER TO BE PRINTED
19386: * JSR PRTCH CALL TO PRINT CHARACTER
19387: *
19388: {PRTCH{PRC{E{0{{ENTRY POINT
19389: {{MOV{R9{-(SP){{SAVE XR
19390: {{BNE{PROFS{PRLEN{PRCH1{JUMP IF ROOM IN BUFFER
19391: {{JSR{PRTNL{{{ELSE PRINT THIS LINE
19392: *
19393: * HERE AFTER MAKING SURE WE HAVE ROOM
19394: *
19395: {PRCH1{MOV{PRBUF{R9{{POINT TO PRINT BUFFER
19396: {{PSC{R9{PROFS{{POINT TO NEXT CHARACTER LOCATION
19397: {{SCH{R6{(R9){{STORE NEW CHARACTER
19398: {{CSC{R9{{{COMPLETE STORE CHARACTERS
19399: {{ICV{PROFS{{{BUMP POINTER
19400: {{MOV{(SP)+{R9{{RESTORE ENTRY XR
19401: {{EXI{{{{RETURN TO PRTCH CALLER
19402: {{ENP{{{{END PROCEDURE PRTCH
19403: {{EJC{{{{
19404: *
19405: * PRTIC -- PRINT TO INTERACTIVE CHANNEL
19406: *
19407: * PRTIC IS CALLED TO PRINT THE CONTENTS OF THE STANDARD
19408: * PRINT BUFFER TO THE INTERACTIVE CHANNEL. IT IS ONLY
19409: * CALLED AFTER PRTST HAS SET UP THE STRING FOR PRINTING.
19410: * IT DOES NOT CLEAR THE BUFFER.
19411: *
19412: * JSR PRTIC CALL FOR PRINT
19413: * (WA,WB) DESTROYED
19414: *
19415: {PRTIC{PRC{E{0{{ENTRY POINT
19416: {{MOV{R9{-(SP){{SAVE XR
19417: {{MOV{PRBUF{R9{{POINT TO BUFFER
19418: {{MOV{PROFS{R6{{NO OF CHARS
19419: {{JSR{SYSPI{{{PRINT
19420: {{PPM{PRTC2{{{FAIL RETURN
19421: *
19422: * RETURN
19423: *
19424: {PRTC1{MOV{(SP)+{R9{{RESTORE XR
19425: {{EXI{{{{RETURN
19426: *
19427: * ERROR OCCURED
19428: *
19429: {PRTC2{ZER{ERICH{{{PREVENT LOOPING
19430: {{ERB{252{ERROR{{ON PRINTING TO INTERACTIVE CHANNEL
19431: {{BRN{PRTC1{{{RETURN
19432: {{ENP{{{{PROCEDURE PRTIC
19433: {{EJC{{{{
19434: *
19435: * PRTIS -- PRINT TO INTERACTIVE AND STANDARD PRINTER
19436: *
19437: * PRTIS PUTS A LINE FROM THE PRINT BUFFER ONTO THE
19438: * INTERACTIVE CHANNEL (IF ANY) AND THE STANDARD PRINTER.
19439: * IT ALWAYS PRINTS TO THE STANDARD PRINTER BUT DOES
19440: * NOT DUPLICATE LINES IF THE STANDARD PRINTER IS
19441: * INTERACTIVE. IT CLEARS DOWN THE PRINT BUFFER.
19442: *
19443: * JSR PRTIS CALL FOR PRINTING
19444: * (WA,WB) DESTROYED
19445: *
19446: {PRTIS{PRC{E{0{{ENTRY POINT
19447: {{BNZ{PRICH{PRTS1{{JUMP IF STANDARD PRINTER IS INT.CH.
19448: {{BZE{ERICH{PRTS1{{SKIP IF NOT DOING INT. ERROR REPS.
19449: {{JSR{PRTIC{{{PRINT TO INTERACTIVE CHANNEL
19450: *
19451: * MERGE AND EXIT
19452: *
19453: {PRTS1{JSR{PRTNL{{{PRINT TO STANDARD PRINTER
19454: {{EXI{{{{RETURN
19455: {{ENP{{{{END PROCEDURE PRTIS
19456: {{EJC{{{{
19457: *
19458: * PRTIN -- PRINT AN INTEGER
19459: *
19460: * PRTIN PRINTS THE INTEGER VALUE WHICH IS IN THE INTEGER
19461: * ACCUMULATOR. BLOCKS BUILT IN DYNAMIC STORAGE
19462: * DURING THIS PROCESS ARE IMMEDIATELY DELETED.
19463: *
19464: * (IA) INTEGER VALUE TO BE PRINTED
19465: * JSR PRTIN CALL TO PRINT INTEGER
19466: * (IA,RA) DESTROYED
19467: *
19468: {PRTIN{PRC{E{0{{ENTRY POINT
19469: {{MOV{R9{-(SP){{SAVE XR
19470: {{JSR{ICBLD{{{BUILD INTEGER BLOCK
19471: {{BLO{R9{DNAMB{PRTI1{JUMP IF ICBLK BELOW DYNAMIC
19472: {{BHI{R9{DNAMP{PRTI1{JUMP IF ABOVE DYNAMIC
19473: {{MOV{R9{DNAMP{{IMMEDIATELY DELETE IT
19474: *
19475: * DELETE ICBLK FROM DYNAMIC STORE
19476: *
19477: {PRTI1{MOV{R9{-(SP){{STACK PTR FOR GTSTG
19478: {{JSR{GTSTG{{{CONVERT TO STRING
19479: {{PPM{{{{CONVERT ERROR IS IMPOSSIBLE
19480: {{MOV{R9{DNAMP{{RESET POINTER TO DELETE SCBLK
19481: {{JSR{PRTST{{{PRINT INTEGER STRING
19482: {{MOV{(SP)+{R9{{RESTORE ENTRY XR
19483: {{EXI{{{{RETURN TO PRTIN CALLER
19484: {{ENP{{{{END PROCEDURE PRTIN
19485: {{EJC{{{{
19486: *
19487: * PRTMI -- PRINT MESSAGE AND INTEGER
19488: *
19489: * PRTMI IS USED TO PRINT MESSAGES TOGETHER WITH AN INTEGER
19490: * VALUE STARTING IN COLUMN 15 (USED BY THE ROUTINES AT
19491: * THE END OF COMPILATION).
19492: *
19493: * JSR PRTMI CALL TO PRINT MESSAGE AND INTEGER
19494: *
19495: {PRTMI{PRC{E{0{{ENTRY POINT
19496: {{JSR{PRTST{{{PRINT STRING MESSAGE
19497: {{MOV{#PRTMF{PROFS{{SET OFFSET TO COL 15
19498: {{JSR{PRTIN{{{PRINT INTEGER
19499: {{JSR{PRTNL{{{PRINT LINE
19500: {{EXI{{{{RETURN TO PRTMI CALLER
19501: {{ENP{{{{END PROCEDURE PRTMI
19502: {{EJC{{{{
19503: *
19504: * PRTMX -- AS PRTMI WITH EXTRA COPY TO INTERACTIVE CHAN.
19505: *
19506: * JSR PRTMX CALL FOR PRINTING
19507: * (WA,WB) DESTROYED
19508: *
19509: {PRTMX{PRC{E{0{{ENTRY POINT
19510: {{JSR{PRTST{{{PRINT STRING MESSAGE
19511: {{MOV{#PRTMF{PROFS{{SET PTR TO COLUMN 15
19512: {{JSR{PRTIN{{{PRINT INTEGER
19513: {{JSR{PRTIS{{{PRINT LINE
19514: {{EXI{{{{RETURN
19515: {{ENP{{{{END PROCEDURE PRTMX
19516: {{EJC{{{{
19517: *
19518: * PRTNL -- PRINT NEW LINE (END PRINT LINE)
19519: *
19520: * PRTNL PRINTS THE CONTENTS OF THE PRINT BUFFER, RESETS
19521: * THE BUFFER TO ALL BLANKS AND RESETS THE PRINT POINTER.
19522: *
19523: * JSR PRTNL CALL TO PRINT LINE
19524: *
19525: {PRTNL{PRC{R{0{{ENTRY POINT
19526: {{BNZ{HEADP{PRNL0{{WERE HEADERS PRINTED
19527: {{JSR{PRTPS{{{NO - PRINT THEM
19528: *
19529: * CALL SYSPR
19530: *
19531: {PRNL0{MOV{R9{-(SP){{SAVE ENTRY XR
19532: {{MOV{R6{PRTSA{{SAVE WA
19533: {{MOV{R7{PRTSB{{SAVE WB
19534: {{MOV{PRBUF{R9{{LOAD POINTER TO BUFFER
19535: {{MOV{PROFS{R6{{LOAD NUMBER OF CHARS IN BUFFER
19536: {{JSR{SYSPR{{{CALL SYSTEM PRINT ROUTINE
19537: {{PPM{PRNL2{{{JUMP IF FAILED
19538: {{LCT{R6{PRLNW{{LOAD LENGTH OF BUFFER IN WORDS
19539: {{ADD{#4*SCHAR{R9{{POINT TO CHARS OF BUFFER
19540: {{MOV{NULLW{R7{{GET WORD OF BLANKS
19541: *
19542: * LOOP TO BLANK BUFFER
19543: *
19544: {PRNL1{MOV{R7{(R9)+{{STORE WORD OF BLANKS, BUMP PTR
19545: {{BCT{R6{PRNL1{{LOOP TILL ALL BLANKED
19546: *
19547: * EXIT POINT
19548: *
19549: {{MOV{PRTSB{R7{{RESTORE WB
19550: {{MOV{PRTSA{R6{{RESTORE WA
19551: {{MOV{(SP)+{R9{{RESTORE ENTRY XR
19552: {{ZER{PROFS{{{RESET PRINT BUFFER POINTER
19553: {{EXI{{{{RETURN TO PRTNL CALLER
19554: *
19555: * FILE FULL OR NO OUTPUT FILE FOR LOAD MODULE
19556: *
19557: {PRNL2{BNZ{PRTEF{PRNL3{{JUMP IF NOT FIRST TIME
19558: {{MNZ{PRTEF{{{MARK FIRST OCCURRENCE
19559: {{ERB{253{PRINT{{LIMIT EXCEEDED ON STANDARD OUTPUT CHANNEL
19560: *
19561: * STOP AT ONCE
19562: *
19563: {PRNL3{MOV{#NINI8{R7{{ENDING CODE
19564: {{MOV{KVSTN{R6{{STATEMENT NUMBER
19565: {{JSR{SYSEJ{{{STOP
19566: {{ENP{{{{END PROCEDURE PRTNL
19567: {{EJC{{{{
19568: *
19569: * PRTNM -- PRINT VARIABLE NAME
19570: *
19571: * PRTNM IS USED TO PRINT A CHARACTER REPRESENTATION OF THE
19572: * NAME OF A VARIABLE (NOT A VALUE OF DATATYPE NAME)
19573: * NAMES OF PSEUDO-VARIABLES MAY NOT BE PASSED TO PRTNM.
19574: *
19575: * (XL) NAME BASE
19576: * (WA) NAME OFFSET
19577: * JSR PRTNM CALL TO PRINT NAME
19578: * (WB,WC,RA) DESTROYED
19579: *
19580: {PRTNM{PRC{R{0{{ENTRY POINT (RECURSIVE, SEE PRTVL)
19581: {{MOV{R6{-(SP){{SAVE WA (OFFSET IS COLLECTABLE)
19582: {{MOV{R9{-(SP){{SAVE ENTRY XR
19583: {{MOV{R10{-(SP){{SAVE NAME BASE
19584: {{BHI{R10{STATE{PRN02{JUMP IF NOT NATURAL VARIABLE
19585: *
19586: * HERE FOR NATURAL VARIABLE NAME, RECOGNIZED BY THE FACT
19587: * THAT THE NAME BASE POINTS INTO THE STATIC AREA.
19588: *
19589: {{MOV{R10{R9{{POINT TO VRBLK
19590: {{JSR{PRTVN{{{PRINT NAME OF VARIABLE
19591: *
19592: * COMMON EXIT POINT
19593: *
19594: {PRN01{MOV{(SP)+{R10{{RESTORE NAME BASE
19595: {{MOV{(SP)+{R9{{RESTORE ENTRY VALUE OF XR
19596: {{MOV{(SP)+{R6{{RESTORE WA
19597: {{EXI{{{{RETURN TO PRTNM CALLER
19598: *
19599: * HERE FOR CASE OF NON-NATURAL VARIABLE
19600: *
19601: {PRN02{MOV{R6{R7{{COPY NAME OFFSET
19602: {{BNE{(R10){#B$PDT{PRN03{JUMP IF ARRAY OR TABLE
19603: *
19604: * FOR PROGRAM DEFINED DATATYPE, PRT FLD NAME, LEFT PAREN
19605: *
19606: {{MOV{4*PDDFP(R10){R9{{LOAD POINTER TO DFBLK
19607: {{ADD{R6{R9{{ADD NAME OFFSET
19608: {{MOV{4*PDFOF(R9){R9{{LOAD VRBLK POINTER FOR FIELD
19609: {{JSR{PRTVN{{{PRINT FIELD NAME
19610: {{MOV{#CH$PP{R6{{LOAD LEFT PAREN
19611: {{JSR{PRTCH{{{PRINT CHARACTER
19612: {{EJC{{{{
19613: *
19614: * PRTNM (CONTINUED)
19615: *
19616: * NOW WE PRINT AN IDENTIFYING NAME FOR THE OBJECT IF ONE
19617: * CAN BE FOUND. THE FOLLOWING CODE SEARCHES FOR A NATURAL
19618: * VARIABLE WHICH CONTAINS THIS OBJECT AS VALUE. IF SUCH A
19619: * VARIABLE IS FOUND, ITS NAME IS PRINTED, ELSE THE VALUE
19620: * OF THE OBJECT (AS PRINTED BY PRTVL) IS USED INSTEAD.
19621: *
19622: * FIRST WE POINT TO THE PARENT TBBLK IF THIS IS THE CASE OF
19623: * A TABLE ELEMENT. TO DO THIS, CHASE DOWN THE TRNXT CHAIN.
19624: *
19625: {PRN03{BNE{(R10){#B$TET{PRN04{JUMP IF WE GOT THERE (OR NOT TE)
19626: {{MOV{4*TENXT(R10){R10{{ELSE MOVE OUT ON CHAIN
19627: {{BRN{PRN03{{{AND LOOP BACK
19628: *
19629: * NOW WE ARE READY FOR THE SEARCH. TO SPEED THINGS UP IN
19630: * THE CASE OF CALLS FROM DUMP WHERE THE SAME NAME BASE
19631: * WILL OCCUR REPEATEDLY WHILE DUMPING AN ARRAY OR TABLE,
19632: * WE REMEMBER THE LAST VRBLK POINTER FOUND IN PRNMV. SO
19633: * FIRST CHECK TO SEE IF WE HAVE THIS ONE AGAIN.
19634: *
19635: {PRN04{MOV{PRNMV{R9{{POINT TO VRBLK WE FOUND LAST TIME
19636: {{MOV{HSHTB{R6{{POINT TO HASH TABLE IN CASE NOT
19637: {{BRN{PRN07{{{JUMP INTO SEARCH FOR SPECIAL CHECK
19638: *
19639: * LOOP THROUGH HASH SLOTS
19640: *
19641: {PRN05{MOV{R6{R9{{COPY SLOT POINTER
19642: {{ICA{R6{{{BUMP SLOT POINTER
19643: {{SUB{#4*VRNXT{R9{{INTRODUCE STANDARD VRBLK OFFSET
19644: *
19645: * LOOP THROUGH VRBLKS ON ONE HASH CHAIN
19646: *
19647: {PRN06{MOV{4*VRNXT(R9){R9{{POINT TO NEXT VRBLK ON HASH CHAIN
19648: *
19649: * MERGE HERE FIRST TIME TO CHECK BLOCK WE FOUND LAST TIME
19650: *
19651: {PRN07{MOV{R9{R8{{COPY VRBLK POINTER
19652: {{BZE{R8{PRN09{{JUMP IF CHAIN END (OR PRNMV ZERO)
19653: {{EJC{{{{
19654: *
19655: * PRTNM (CONTINUED)
19656: *
19657: * LOOP TO FIND VALUE (CHASE DOWN POSSIBLE TRBLK CHAIN)
19658: *
19659: {PRN08{MOV{4*VRVAL(R9){R9{{LOAD VALUE
19660: {{BEQ{(R9){#B$TRT{PRN08{LOOP IF THAT WAS A TRBLK
19661: *
19662: * NOW WE HAVE THE VALUE, IS THIS THE BLOCK WE WANT
19663: *
19664: {{BEQ{R9{R10{PRN10{JUMP IF THIS MATCHES THE NAME BASE
19665: {{MOV{R8{R9{{ELSE POINT BACK TO THAT VRBLK
19666: {{BRN{PRN06{{{AND LOOP BACK
19667: *
19668: * HERE TO MOVE TO NEXT HASH SLOT
19669: *
19670: {PRN09{BLT{R6{HSHTE{PRN05{LOOP BACK IF MORE TO GO
19671: {{MOV{R10{R9{{ELSE NOT FOUND, COPY VALUE POINTER
19672: {{JSR{PRTVL{{{PRINT VALUE
19673: {{BRN{PRN11{{{AND MERGE AHEAD
19674: *
19675: * HERE WHEN WE FIND A MATCHING ENTRY
19676: *
19677: {PRN10{MOV{R8{R9{{COPY VRBLK POINTER
19678: {{MOV{R9{PRNMV{{SAVE FOR NEXT TIME IN
19679: {{JSR{PRTVN{{{PRINT VARIABLE NAME
19680: *
19681: * MERGE HERE IF NO ENTRY FOUND
19682: *
19683: {PRN11{MOV{(R10){R8{{LOAD FIRST WORD OF NAME BASE
19684: {{BNE{R8{#B$PDT{PRN13{JUMP IF NOT PROGRAM DEFINED
19685: *
19686: * FOR PROGRAM DEFINED DATATYPE, ADD RIGHT PAREN AND EXIT
19687: *
19688: {{MOV{#CH$RP{R6{{LOAD RIGHT PAREN, MERGE
19689: *
19690: * MERGE HERE TO PRINT FINAL RIGHT PAREN OR BRACKET
19691: *
19692: {PRN12{JSR{PRTCH{{{PRINT FINAL CHARACTER
19693: {{MOV{R7{R6{{RESTORE NAME OFFSET
19694: {{BRN{PRN01{{{MERGE BACK TO EXIT
19695: {{EJC{{{{
19696: *
19697: * PRTNM (CONTINUED)
19698: *
19699: * HERE FOR ARRAY OR TABLE
19700: *
19701: {PRN13{MOV{#CH$BB{R6{{LOAD LEFT BRACKET
19702: {{JSR{PRTCH{{{AND PRINT IT
19703: {{MOV{(SP){R10{{RESTORE BLOCK POINTER
19704: {{MOV{(R10){R8{{LOAD TYPE WORD AGAIN
19705: {{BNE{R8{#B$TET{PRN15{JUMP IF NOT TABLE
19706: *
19707: * HERE FOR TABLE, PRINT SUBSCRIPT VALUE
19708: *
19709: {{MOV{4*TESUB(R10){R9{{LOAD SUBSCRIPT VALUE
19710: {{MOV{R7{R10{{SAVE NAME OFFSET
19711: {{JSR{PRTVL{{{PRINT SUBSCRIPT VALUE
19712: {{MOV{R10{R7{{RESTORE NAME OFFSET
19713: *
19714: * MERGE HERE FROM ARRAY CASE TO PRINT RIGHT BRACKET
19715: *
19716: {PRN14{MOV{#CH$RB{R6{{LOAD RIGHT BRACKET
19717: {{BRN{PRN12{{{MERGE BACK TO PRINT IT
19718: *
19719: * HERE FOR ARRAY OR VECTOR, TO PRINT SUBSCRIPT(S)
19720: *
19721: {PRN15{MOV{R7{R6{{COPY NAME OFFSET
19722: {{BTW{R6{{{CONVERT TO WORDS
19723: {{BEQ{R8{#B$ART{PRN16{JUMP IF ARBLK
19724: *
19725: * HERE FOR VECTOR
19726: *
19727: {{SUB{#VCVLB{R6{{ADJUST FOR STANDARD FIELDS
19728: {{MTI{R6{{{MOVE TO INTEGER ACCUM
19729: {{JSR{PRTIN{{{PRINT LINEAR SUBSCRIPT
19730: {{BRN{PRN14{{{MERGE BACK FOR RIGHT BRACKET
19731: {{EJC{{{{
19732: *
19733: * PRTNM (CONTINUED)
19734: *
19735: * HERE FOR ARRAY. FIRST CALCULATE ABSOLUTE SUBSCRIPT
19736: * OFFSETS BY SUCCESSIVE DIVISIONS BY THE DIMENSION VALUES.
19737: * THIS MUST BE DONE RIGHT TO LEFT SINCE THE ELEMENTS ARE
19738: * STORED ROW-WISE. THE SUBSCRIPTS ARE STACKED AS INTEGERS.
19739: *
19740: {PRN16{MOV{4*AROFS(R10){R8{{LOAD LENGTH OF BOUNDS INFO
19741: {{ICA{R8{{{ADJUST FOR ARPRO FIELD
19742: {{BTW{R8{{{CONVERT TO WORDS
19743: {{SUB{R8{R6{{GET LINEAR ZERO-ORIGIN SUBSCRIPT
19744: {{MTI{R6{{{GET INTEGER VALUE
19745: {{LCT{R6{4*ARNDM(R10){{SET NUM OF DIMENSIONS AS LOOP COUNT
19746: {{ADD{4*AROFS(R10){R10{{POINT PAST BOUNDS INFORMATION
19747: {{SUB{#4*ARLBD{R10{{SET OK OFFSET FOR PROPER PTR LATER
19748: *
19749: * LOOP TO STACK SUBSCRIPT OFFSETS
19750: *
19751: {PRN17{SUB{#4*ARDMS{R10{{POINT TO NEXT SET OF BOUNDS
19752: {{STI{PRNSI{{{SAVE CURRENT OFFSET
19753: {{RMI{4*ARDIM(R10){{{GET REMAINDER ON DIVIDING BY DIMENS
19754: {{MFI{-(SP){{{STORE ON STACK (ONE WORD)
19755: {{LDI{PRNSI{{{RELOAD ARGUMENT
19756: {{DVI{4*ARDIM(R10){{{DIVIDE TO GET QUOTIENT
19757: {{BCT{R6{PRN17{{LOOP TILL ALL STACKED
19758: {{ZER{R9{{{SET OFFSET TO FIRST SET OF BOUNDS
19759: {{LCT{R7{4*ARNDM(R10){{LOAD COUNT OF DIMS TO CONTROL LOOP
19760: {{BRN{PRN19{{{JUMP INTO PRINT LOOP
19761: *
19762: * LOOP TO PRINT SUBSCRIPTS FROM STACK ADJUSTING BY ADDING
19763: * THE APPROPRIATE LOW BOUND VALUE FROM THE ARBLK
19764: *
19765: {PRN18{MOV{#CH$CM{R6{{LOAD A COMMA
19766: {{JSR{PRTCH{{{PRINT IT
19767: *
19768: * MERGE HERE FIRST TIME IN (NO COMMA REQUIRED)
19769: *
19770: {PRN19{MTI{(SP)+{{{LOAD SUBSCRIPT OFFSET AS INTEGER
19771: {{ADD{R9{R10{{POINT TO CURRENT LBD
19772: {{ADI{4*ARLBD(R10){{{ADD LBD TO GET SIGNED SUBSCRIPT
19773: {{SUB{R9{R10{{POINT BACK TO START OF ARBLK
19774: {{JSR{PRTIN{{{PRINT SUBSCRIPT
19775: {{ADD{#4*ARDMS{R9{{BUMP OFFSET TO NEXT BOUNDS
19776: {{BCT{R7{PRN18{{LOOP BACK TILL ALL PRINTED
19777: {{BRN{PRN14{{{MERGE BACK TO PRINT RIGHT BRACKET
19778: {{ENP{{{{END PROCEDURE PRTNM
19779: {{EJC{{{{
19780: *
19781: * PRTNV -- PRINT NAME VALUE
19782: *
19783: * PRTNV IS USED BY THE TRACE AND DUMP ROUTINES TO PRINT
19784: * A LINE OF THE FORM
19785: *
19786: * NAME = VALUE
19787: *
19788: * NOTE THAT THE NAME INVOLVED CAN NEVER BE A PSEUDO-VAR
19789: *
19790: * (XL) NAME BASE
19791: * (WA) NAME OFFSET
19792: * JSR PRTNV CALL TO PRINT NAME = VALUE
19793: * (WB,WC,RA) DESTROYED
19794: *
19795: {PRTNV{PRC{E{0{{ENTRY POINT
19796: {{JSR{PRTNM{{{PRINT ARGUMENT NAME
19797: {{MOV{R9{-(SP){{SAVE ENTRY XR
19798: {{MOV{R6{-(SP){{SAVE NAME OFFSET (COLLECTABLE)
19799: {{MOV{#TMBEB{R9{{POINT TO BLANK EQUAL BLANK
19800: {{JSR{PRTST{{{PRINT IT
19801: {{MOV{R10{R9{{COPY NAME BASE
19802: {{ADD{R6{R9{{POINT TO VALUE
19803: {{MOV{(R9){R9{{LOAD VALUE POINTER
19804: {{JSR{PRTVL{{{PRINT VALUE
19805: {{JSR{PRTNL{{{TERMINATE LINE
19806: {{MOV{(SP)+{R6{{RESTORE NAME OFFSET
19807: {{MOV{(SP)+{R9{{RESTORE ENTRY XR
19808: {{EXI{{{{RETURN TO CALLER
19809: {{ENP{{{{END PROCEDURE PRTNV
19810: {{EJC{{{{
19811: *
19812: * PRTPG -- PRINT A PAGE THROW
19813: *
19814: * PRINTS A PAGE THROW OR A FEW BLANK LINES ON THE STANDARD
19815: * LISTING CHANNEL DEPENDING ON THE LISTING OPTIONS CHOSEN.
19816: *
19817: * JSR PRTPG CALL FOR PAGE EJECT
19818: *
19819: {PRTPG{PRC{E{0{{ENTRY POINT
19820: {{BEQ{STAGE{#STGXT{PRP01{JUMP IF EXECUTION TIME
19821: {{BZE{LSTLC{PRP06{{RETURN IF TOP OF PAGE ALREADY
19822: {{ZER{LSTLC{{{CLEAR LINE COUNT
19823: *
19824: * CHECK TYPE OF LISTING
19825: *
19826: {PRP01{MOV{R9{-(SP){{PRESERVE XR
19827: {{BNZ{PRSTD{PRP02{{EJECT IF FLAG SET
19828: {{BNZ{PRICH{PRP03{{JUMP IF INTERACTIVE LISTING CHANNEL
19829: {{BZE{PRECL{PRP03{{JUMP IF COMPACT LISTING
19830: *
19831: * PERFORM AN EJECT
19832: *
19833: {PRP02{JSR{SYSEP{{{EJECT
19834: {{BRN{PRP04{{{MERGE
19835: *
19836: * COMPACT OR INTERACTIVE CHANNEL LISTING. CANT PRINT
19837: * BLANKS UNTIL CHECK MADE FOR HEADERS PRINTED AND FLAG SET.
19838: *
19839: *
19840: {PRP03{MOV{HEADP{R9{{REMEMBER HEADP
19841: {{MNZ{HEADP{{{SET TO AVOID REPEATED PRTPG CALLS
19842: {{JSR{PRTNL{{{PRINT BLANK LINE
19843: {{JSR{PRTNL{{{PRINT BLANK LINE
19844: {{JSR{PRTNL{{{PRINT BLANK LINE
19845: {{MOV{#NUM03{LSTLC{{COUNT BLANK LINES
19846: {{MOV{R9{HEADP{{RESTORE HEADER FLAG
19847: {{EJC{{{{
19848: *
19849: * PRPTG (CONTINUED)
19850: *
19851: * PRINT THE HEADING
19852: *
19853: {PRP04{BNZ{HEADP{PRP05{{JUMP IF HEADER LISTED
19854: {{MNZ{HEADP{{{MARK HEADERS PRINTED
19855: {{MOV{R10{-(SP){{KEEP XL
19856: {{MOV{#HEADR{R9{{POINT TO LISTING HEADER
19857: {{JSR{PRTST{{{PLACE IT
19858: {{JSR{SYSID{{{GET SYSTEM IDENTIFICATION
19859: {{JSR{PRTST{{{APPEND EXTRA CHARS
19860: {{JSR{PRTNL{{{PRINT IT
19861: {{MOV{R10{R9{{EXTRA HEADER LINE
19862: {{JSR{PRTST{{{PLACE IT
19863: {{JSR{PRTNL{{{PRINT IT
19864: {{JSR{PRTNL{{{PRINT A BLANK
19865: {{JSR{PRTNL{{{AND ANOTHER
19866: {{ADD{#NUM04{LSTLC{{FOUR HEADER LINES PRINTED
19867: {{MOV{(SP)+{R10{{RESTORE XL
19868: *
19869: * MERGE IF HEADER NOT PRINTED
19870: *
19871: {PRP05{MOV{(SP)+{R9{{RESTORE XR
19872: *
19873: * RETURN
19874: *
19875: {PRP06{EXI{{{{RETURN
19876: {{ENP{{{{END PROCEDURE PRTPG
19877: {{EJC{{{{
19878: *
19879: * PRTPS - PRINT PAGE WITH TEST FOR STANDARD LISTING OPTION
19880: *
19881: * IF THE STANDARD LISTING OPTION IS SELECTED, INSIST THAT
19882: * AN EJECT BE DONE
19883: *
19884: * JSR PRTPS CALL FOR EJECT
19885: *
19886: {PRTPS{PRC{E{0{{ENTRY POINT
19887: {{MOV{PRSTO{PRSTD{{COPY OPTION FLAG
19888: {{JSR{PRTPG{{{PRINT PAGE
19889: {{ZER{PRSTD{{{CLEAR FLAG
19890: {{EXI{{{{RETURN
19891: {{ENP{{{{END PROCEDURE PRTPS
19892: {{EJC{{{{
19893: *
19894: * PRTSN -- PRINT STATEMENT NUMBER
19895: *
19896: * PRTSN IS USED TO INITIATE A PRINT TRACE LINE BY PRINTING
19897: * ASTERISKS AND THE CURRENT STATEMENT NUMBER. THE ACTUAL
19898: * FORMAT OF THE OUTPUT GENERATED IS.
19899: *
19900: * ***NNNNN**** III.....IIII
19901: *
19902: * NNNNN IS THE STATEMENT NUMBER WITH LEADING ZEROS REPLACED
19903: * BY ASTERISKS (E.G. *******9****)
19904: *
19905: * III...III REPRESENTS A VARIABLE LENGTH OUTPUT CONSISTING
19906: * OF A NUMBER OF LETTER I CHARACTERS EQUAL TO FNCLEVEL.
19907: *
19908: * JSR PRTSN CALL TO PRINT STATEMENT NUMBER
19909: * (WC) DESTROYED
19910: *
19911: {PRTSN{PRC{E{0{{ENTRY POINT
19912: {{MOV{R9{-(SP){{SAVE ENTRY XR
19913: {{MOV{R6{PRSNA{{SAVE ENTRY WA
19914: {{MOV{#TMASB{R9{{POINT TO ASTERISKS
19915: {{JSR{PRTST{{{PRINT ASTERISKS
19916: {{MOV{#NUM04{PROFS{{POINT INTO MIDDLE OF ASTERISKS
19917: {{MTI{KVSTN{{{LOAD STATEMENT NUMBER AS INTEGER
19918: {{JSR{PRTIN{{{PRINT INTEGER STATEMENT NUMBER
19919: {{MOV{#PRSNF{PROFS{{POINT PAST ASTERISKS PLUS BLANK
19920: {{MOV{KVFNC{R9{{GET FNCLEVEL
19921: {{MOV{#CH$LI{R6{{SET LETTER I
19922: *
19923: * LOOP TO GENERATE LETTER I FNCLEVEL TIMES
19924: *
19925: {PRSN1{BZE{R9{PRSN2{{JUMP IF ALL SET
19926: {{JSR{PRTCH{{{ELSE PRINT AN I
19927: {{DCV{R9{{{DECREMENT COUNTER
19928: {{BRN{PRSN1{{{LOOP BACK
19929: *
19930: * MERRE WITH ALL LETTER I CHARACTERS GENERATED
19931: *
19932: {PRSN2{MOV{#CH$BL{R6{{GET BLANK
19933: {{JSR{PRTCH{{{PRINT BLANK
19934: {{MOV{PRSNA{R6{{RESTORE ENTRY WA
19935: {{MOV{(SP)+{R9{{RESTORE ENTRY XR
19936: {{EXI{{{{RETURN TO PRTSN CALLER
19937: {{ENP{{{{END PROCEDURE PRTSN
19938: {{EJC{{{{
19939: *
19940: * PRTST -- PRINT STRING
19941: *
19942: * PRTST PLACES A STRING OF CHARACTERS IN THE PRINT BUFFER
19943: *
19944: * SEE PRTNL FOR GLOBAL LOCATIONS USED
19945: *
19946: * NOTE THAT THE FIRST WORD OF THE BLOCK (NORMALLY B$SCL)
19947: * IS NOT USED AND NEED NOT BE SET CORRECTLY (SEE PRTVN)
19948: *
19949: * (XR) STRING TO BE PRINTED
19950: * JSR PRTST CALL TO PRINT STRING
19951: * (PROFS) UPDATED PAST CHARS PLACED
19952: *
19953: {PRTST{PRC{R{0{{ENTRY POINT
19954: {{BNZ{HEADP{PRST0{{WERE HEADERS PRINTED
19955: {{JSR{PRTPS{{{NO - PRINT THEM
19956: *
19957: * CALL SYSPR
19958: *
19959: {PRST0{MOV{R6{PRSVA{{SAVE WA
19960: {{MOV{R7{PRSVB{{SAVE WB
19961: {{ZER{R7{{{SET CHARS PRINTED COUNT TO ZERO
19962: *
19963: * LOOP TO PRINT SUCCESSIVE LINES FOR LONG STRING
19964: *
19965: {PRST1{MOV{4*SCLEN(R9){R6{{LOAD STRING LENGTH
19966: {{SUB{R7{R6{{SUBTRACT COUNT OF CHARS ALREADY OUT
19967: {{BZE{R6{PRST4{{JUMP TO EXIT IF NONE LEFT
19968: {{MOV{R10{-(SP){{ELSE STACK ENTRY XL
19969: {{MOV{R9{-(SP){{SAVE ARGUMENT
19970: {{MOV{R9{R10{{COPY FOR EVENTUAL MOVE
19971: {{MOV{PRLEN{R9{{LOAD PRINT BUFFER LENGTH
19972: {{SUB{PROFS{R9{{GET CHARS LEFT IN PRINT BUFFER
19973: {{BNZ{R9{PRST2{{SKIP IF ROOM LEFT ON THIS LINE
19974: {{JSR{PRTNL{{{ELSE PRINT THIS LINE
19975: {{MOV{PRLEN{R9{{AND SET FULL WIDTH AVAILABLE
19976: {{EJC{{{{
19977: *
19978: * PRTST (CONTINUED)
19979: *
19980: * HERE WITH CHARS TO PRINT AND SOME ROOM IN BUFFER
19981: *
19982: {PRST2{BLO{R6{R9{PRST3{JUMP IF ROOM FOR REST OF STRING
19983: {{MOV{R9{R6{{ELSE SET TO FILL LINE
19984: *
19985: * MERGE HERE WITH CHARACTER COUNT IN WA
19986: *
19987: {PRST3{MOV{PRBUF{R9{{POINT TO PRINT BUFFER
19988: {{PLC{R10{R7{{POINT TO LOCATION IN STRING
19989: {{PSC{R9{PROFS{{POINT TO LOCATION IN BUFFER
19990: {{ADD{R6{R7{{BUMP STRING CHARS COUNT
19991: {{ADD{R6{PROFS{{BUMP BUFFER POINTER
19992: {{MOV{R7{PRSVC{{PRESERVE CHAR COUNTER
19993: {{MVC{{{{MOVE CHARACTERS TO BUFFER
19994: {{MOV{PRSVC{R7{{RECOVER CHAR COUNTER
19995: {{MOV{(SP)+{R9{{RESTORE ARGUMENT POINTER
19996: {{MOV{(SP)+{R10{{RESTORE ENTRY XL
19997: {{BRN{PRST1{{{LOOP BACK TO TEST FOR MORE
19998: *
19999: * HERE TO EXIT AFTER PRINTING STRING
20000: *
20001: {PRST4{MOV{PRSVB{R7{{RESTORE ENTRY WB
20002: {{MOV{PRSVA{R6{{RESTORE ENTRY WA
20003: {{EXI{{{{RETURN TO PRTST CALLER
20004: {{ENP{{{{END PROCEDURE PRTST
20005: {{EJC{{{{
20006: *
20007: * PRTTR -- PRINT TO TERMINAL
20008: *
20009: * CALLED TO PRINT CONTENTS OF STANDARD PRINT BUFFER TO
20010: * ONLINE TERMINAL. CLEARS BUFFER DOWN AND RESETS PROFS.
20011: *
20012: * JSR PRTTR CALL FOR PRINT
20013: * (WA,WB) DESTROYED
20014: *
20015: {PRTTR{PRC{E{0{{ENTRY POINT
20016: {{MOV{R9{-(SP){{SAVE XR
20017: {{JSR{PRTIC{{{PRINT BUFFER CONTENTS
20018: {{MOV{PRBUF{R9{{POINT TO PRINT BFR TO CLEAR IT
20019: {{LCT{R6{PRLNW{{GET BUFFER LENGTH
20020: {{ADD{#4*SCHAR{R9{{POINT PAST SCBLK HEADER
20021: {{MOV{NULLW{R7{{GET BLANKS
20022: *
20023: * LOOP TO CLEAR BUFFER
20024: *
20025: {PRTT1{MOV{R7{(R9)+{{CLEAR A WORD
20026: {{BCT{R6{PRTT1{{LOOP
20027: {{ZER{PROFS{{{RESET PROFS
20028: {{MOV{(SP)+{R9{{RESTORE XR
20029: {{EXI{{{{RETURN
20030: {{ENP{{{{END PROCEDURE PRTTR
20031: {{EJC{{{{
20032: *
20033: * PRTVL -- PRINT A VALUE
20034: *
20035: * PRTVL PLACES AN APPROPRIATE CHARACTER REPRESENTATION OF
20036: * A DATA VALUE IN THE PRINT BUFFER FOR DUMP/TRACE USE.
20037: *
20038: * (XR) VALUE TO BE PRINTED
20039: * JSR PRTVL CALL TO PRINT VALUE
20040: * (WA,WB,WC,RA) DESTROYED
20041: *
20042: {PRTVL{PRC{R{0{{ENTRY POINT, RECURSIVE
20043: {{MOV{R10{-(SP){{SAVE ENTRY XL
20044: {{MOV{R9{-(SP){{SAVE ARGUMENT
20045: {{CHK{{{{CHECK FOR STACK OVERFLOW
20046: *
20047: * LOOP BACK HERE AFTER FINDING A TRAP BLOCK (TRBLK)
20048: *
20049: {PRV01{MOV{4*IDVAL(R9){PRVSI{{COPY IDVAL (IF ANY)
20050: {{MOV{(R9){R10{{LOAD FIRST WORD OF BLOCK
20051: {{LEI{R10{{{LOAD ENTRY POINT ID
20052: {{BSW{R10{BL$$T{PRV02{SWITCH ON BLOCK TYPE
20053: {{IFF{BL$AR{PRV05{{ARBLK
20054: {{IFF{BL$BC{PRV15{{BCBLK
20055: {{IFF{DUMMY{PRV02{{
20056: {{IFF{DUMMY{PRV02{{
20057: {{IFF{BL$IC{PRV08{{ICBLK
20058: {{IFF{BL$NM{PRV09{{NMBLK
20059: {{IFF{DUMMY{PRV02{{
20060: {{IFF{DUMMY{PRV02{{
20061: {{IFF{DUMMY{PRV02{{
20062: {{IFF{BL$RC{PRV08{{RCBLK
20063: {{IFF{BL$SC{PRV11{{SCBLK
20064: {{IFF{BL$SE{PRV12{{SEBLK
20065: {{IFF{BL$TB{PRV13{{TBBLK
20066: {{IFF{BL$VC{PRV13{{VCBLK
20067: {{IFF{DUMMY{PRV02{{
20068: {{IFF{DUMMY{PRV02{{
20069: {{IFF{BL$PD{PRV10{{PDBLK
20070: {{IFF{BL$TR{PRV04{{TRBLK
20071: {{ESW{{{{END OF SWITCH ON BLOCK TYPE
20072: *
20073: * HERE FOR BLOCKS FOR WHICH WE JUST PRINT DATATYPE NAME
20074: *
20075: {PRV02{JSR{DTYPE{{{GET DATATYPE NAME
20076: {{JSR{PRTST{{{PRINT DATATYPE NAME
20077: *
20078: * COMMON EXIT POINT
20079: *
20080: {PRV03{MOV{(SP)+{R9{{RELOAD ARGUMENT
20081: {{MOV{(SP)+{R10{{RESTORE XL
20082: {{EXI{{{{RETURN TO PRTVL CALLER
20083: *
20084: * HERE FOR TRBLK
20085: *
20086: {PRV04{MOV{4*TRVAL(R9){R9{{LOAD REAL VALUE
20087: {{BRN{PRV01{{{AND LOOP BACK
20088: {{EJC{{{{
20089: *
20090: * PRTVL (CONTINUED)
20091: *
20092: * HERE FOR ARRAY (ARBLK)
20093: *
20094: * PRINT ARRAY ( PROTOTYPE ) BLANK NUMBER IDVAL
20095: *
20096: {PRV05{MOV{R9{R10{{PRESERVE ARGUMENT
20097: {{MOV{#SCARR{R9{{POINT TO DATATYPE NAME (ARRAY)
20098: {{JSR{PRTST{{{PRINT IT
20099: {{MOV{#CH$PP{R6{{LOAD LEFT PAREN
20100: {{JSR{PRTCH{{{PRINT LEFT PAREN
20101: {{ADD{4*AROFS(R10){R10{{POINT TO PROTOTYPE
20102: {{MOV{(R10){R9{{LOAD PROTOTYPE
20103: {{JSR{PRTST{{{PRINT PROTOTYPE
20104: *
20105: * VCBLK, TBBLK, BCBLK MERGE HERE FOR ) BLANK NUMBER IDVAL
20106: *
20107: {PRV06{MOV{#CH$RP{R6{{LOAD RIGHT PAREN
20108: {{JSR{PRTCH{{{PRINT RIGHT PAREN
20109: *
20110: * PDBLK MERGES HERE TO PRINT BLANK NUMBER IDVAL
20111: *
20112: {PRV07{MOV{#CH$BL{R6{{LOAD BLANK
20113: {{JSR{PRTCH{{{PRINT IT
20114: {{MOV{#CH$NM{R6{{LOAD NUMBER SIGN
20115: {{JSR{PRTCH{{{PRINT IT
20116: {{MTI{PRVSI{{{GET IDVAL
20117: {{JSR{PRTIN{{{PRINT ID NUMBER
20118: {{BRN{PRV03{{{BACK TO EXIT
20119: *
20120: * HERE FOR INTEGER (ICBLK), REAL (RCBLK)
20121: *
20122: * PRINT CHARACTER REPRESENTATION OF VALUE
20123: *
20124: {PRV08{MOV{R9{-(SP){{STACK ARGUMENT FOR GTSTG
20125: {{JSR{GTSTG{{{CONVERT TO STRING
20126: {{PPM{{{{ERROR RETURN IS IMPOSSIBLE
20127: {{JSR{PRTST{{{PRINT THE STRING
20128: {{MOV{R9{DNAMP{{DELETE GARBAGE STRING FROM STORAGE
20129: {{BRN{PRV03{{{BACK TO EXIT
20130: {{EJC{{{{
20131: *
20132: * PRTVL (CONTINUED)
20133: *
20134: * NAME (NMBLK)
20135: *
20136: * FOR PSEUDO-VARIABLE, JUST PRINT DATATYPE NAME (NAME)
20137: * FOR ALL OTHER NAMES, PRINT DOT FOLLOWED BY NAME REP
20138: *
20139: {PRV09{MOV{4*NMBAS(R9){R10{{LOAD NAME BASE
20140: {{MOV{(R10){R6{{LOAD FIRST WORD OF BLOCK
20141: {{BEQ{R6{#B$KVT{PRV02{JUST PRINT NAME IF KEYWORD
20142: {{BEQ{R6{#B$EVT{PRV02{JUST PRINT NAME IF EXPRESSION VAR
20143: {{MOV{#CH$DT{R6{{ELSE GET DOT
20144: {{JSR{PRTCH{{{AND PRINT IT
20145: {{MOV{4*NMOFS(R9){R6{{LOAD NAME OFFSET
20146: {{JSR{PRTNM{{{PRINT NAME
20147: {{BRN{PRV03{{{BACK TO EXIT
20148: *
20149: * PROGRAM DATATYPE (PDBLK)
20150: *
20151: * PRINT DATATYPE NAME CH$BL CH$NM IDVAL
20152: *
20153: {PRV10{JSR{DTYPE{{{GET DATATYPE NAME
20154: {{JSR{PRTST{{{PRINT DATATYPE NAME
20155: {{BRN{PRV07{{{MERGE BACK TO PRINT ID
20156: *
20157: * HERE FOR STRING (SCBLK)
20158: *
20159: * PRINT QUOTE STRING-CHARACTERS QUOTE
20160: *
20161: {PRV11{MOV{#CH$SQ{R6{{LOAD SINGLE QUOTE
20162: {{JSR{PRTCH{{{PRINT QUOTE
20163: {{JSR{PRTST{{{PRINT STRING VALUE
20164: {{JSR{PRTCH{{{PRINT ANOTHER QUOTE
20165: {{BRN{PRV03{{{BACK TO EXIT
20166: {{EJC{{{{
20167: *
20168: * PRTVL (CONTINUED)
20169: *
20170: * HERE FOR SIMPLE EXPRESSION (SEBLK)
20171: *
20172: * PRINT ASTERISK VARIABLE-NAME
20173: *
20174: {PRV12{MOV{#CH$AS{R6{{LOAD ASTERISK
20175: {{JSR{PRTCH{{{PRINT ASTERISK
20176: {{MOV{4*SEVAR(R9){R9{{LOAD VARIABLE POINTER
20177: {{JSR{PRTVN{{{PRINT VARIABLE NAME
20178: {{BRN{PRV03{{{JUMP BACK TO EXIT
20179: *
20180: * HERE FOR TABLE (TBBLK) AND ARRAY (VCBLK)
20181: *
20182: * PRINT DATATYPE ( PROTOTYPE ) BLANK NUMBER IDVAL
20183: *
20184: {PRV13{MOV{R9{R10{{PRESERVE ARGUMENT
20185: {{JSR{DTYPE{{{GET DATATYPE NAME
20186: {{JSR{PRTST{{{PRINT DATATYPE NAME
20187: {{MOV{#CH$PP{R6{{LOAD LEFT PAREN
20188: {{JSR{PRTCH{{{PRINT LEFT PAREN
20189: {{MOV{4*TBLEN(R10){R6{{LOAD LENGTH OF BLOCK (=VCLEN)
20190: {{BTW{R6{{{CONVERT TO WORD COUNT
20191: {{SUB{#TBSI${R6{{ALLOW FOR STANDARD FIELDS
20192: {{BEQ{(R10){#B$TBT{PRV14{JUMP IF TABLE
20193: {{ADD{#VCTBD{R6{{FOR VCBLK, ADJUST SIZE
20194: *
20195: * PRINT PROTOTYPE
20196: *
20197: {PRV14{MTI{R6{{{MOVE AS INTEGER
20198: {{JSR{PRTIN{{{PRINT INTEGER PROTOTYPE
20199: {{BRN{PRV06{{{MERGE BACK FOR REST
20200: {{EJC{{{{
20201: *
20202: * PRTVL (CONTINUED)
20203: *
20204: * HERE FOR BUFFER (BCBLK)
20205: *
20206: {PRV15{MOV{R9{R10{{PRESERVE ARGUMENT
20207: {{MOV{#SCBUF{R9{{POINT TO DATATYPE NAME (BUFFER)
20208: {{JSR{PRTST{{{PRINT IT
20209: {{MOV{#CH$PP{R6{{LOAD LEFT PAREN
20210: {{JSR{PRTCH{{{PRINT LEFT PAREN
20211: {{MOV{4*BCBUF(R10){R9{{POINT TO BFBLK
20212: {{MTI{4*BFALC(R9){{{LOAD ALLOCATION SIZE
20213: {{JSR{PRTIN{{{PRINT IT
20214: {{MOV{#CH$CM{R6{{LOAD COMMA
20215: {{JSR{PRTCH{{{PRINT IT
20216: {{MTI{4*BCLEN(R10){{{LOAD DEFINED LENGTH
20217: {{JSR{PRTIN{{{PRINT IT
20218: {{BRN{PRV06{{{MERGE TO FINISH UP
20219: {{ENP{{{{END PROCEDURE PRTVL
20220: {{EJC{{{{
20221: *
20222: * PRTVN -- PRINT NATURAL VARIABLE NAME
20223: *
20224: * PRTVN PRINTS THE NAME OF A NATURAL VARIABLE
20225: *
20226: * (XR) POINTER TO VRBLK
20227: * JSR PRTVN CALL TO PRINT VARIABLE NAME
20228: *
20229: {PRTVN{PRC{E{0{{ENTRY POINT
20230: {{MOV{R9{-(SP){{STACK VRBLK POINTER
20231: {{ADD{#4*VRSOF{R9{{POINT TO POSSIBLE STRING NAME
20232: {{BNZ{4*SCLEN(R9){PRVN1{{JUMP IF NOT SYSTEM VARIABLE
20233: {{MOV{4*VRSVO(R9){R9{{POINT TO SVBLK WITH NAME
20234: *
20235: * MERGE HERE WITH DUMMY SCBLK POINTER IN XR
20236: *
20237: {PRVN1{JSR{PRTST{{{PRINT STRING NAME OF VARIABLE
20238: {{MOV{(SP)+{R9{{RESTORE VRBLK POINTER
20239: {{EXI{{{{RETURN TO PRTVN CALLER
20240: {{ENP{{{{END PROCEDURE PRTVN
20241: {{EJC{{{{
20242: *
20243: * RCBLD -- BUILD A REAL BLOCK
20244: *
20245: * (RA) REAL VALUE FOR RCBLK
20246: * JSR RCBLD CALL TO BUILD REAL BLOCK
20247: * (XR) POINTER TO RESULT RCBLK
20248: * (WA) DESTROYED
20249: *
20250: {RCBLD{PRC{E{0{{ENTRY POINT
20251: {{MOV{DNAMP{R9{{LOAD POINTER TO NEXT AVAILABLE LOC
20252: {{ADD{#4*RCSI${R9{{POINT PAST NEW RCBLK
20253: {{BLO{R9{DNAME{RCBL1{JUMP IF THERE IS ROOM
20254: {{MOV{#4*RCSI${R6{{ELSE LOAD RCBLK LENGTH
20255: {{JSR{ALLOC{{{USE STANDARD ALLOCATOR TO GET BLOCK
20256: {{ADD{R6{R9{{POINT PAST BLOCK TO MERGE
20257: *
20258: * MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED
20259: *
20260: {RCBL1{MOV{R9{DNAMP{{SET NEW POINTER
20261: {{SUB{#4*RCSI${R9{{POINT BACK TO START OF BLOCK
20262: {{MOV{#B$RCL{(R9){{STORE TYPE WORD
20263: {{STR{4*RCVAL(R9){{{STORE REAL VALUE IN RCBLK
20264: {{EXI{{{{RETURN TO RCBLD CALLER
20265: {{ENP{{{{END PROCEDURE RCBLD
20266: {{EJC{{{{
20267: *
20268: * READR -- READ NEXT SOURCE IMAGE AT COMPILE TIME
20269: *
20270: * READR IS USED TO READ THE NEXT SOURCE IMAGE. TO PROCESS
20271: * CONTINUATION CARDS PROPERLY, THE COMPILER MUST READ ONE
20272: * LINE AHEAD. THUS READR DOES NOT DESTROY THE CURRENT IMAGE
20273: * SEE ALSO THE NEXTS ROUTINE WHICH ACTUALLY GETS THE IMAGE.
20274: *
20275: * JSR READR CALL TO READ NEXT IMAGE
20276: * (XR) PTR TO NEXT IMAGE (0 IF NONE)
20277: * (R$CNI) COPY OF POINTER
20278: * (WA,WB,WC,XL) DESTROYED
20279: *
20280: {READR{PRC{E{0{{ENTRY POINT
20281: {{MOV{R$CNI{R9{{GET PTR TO NEXT IMAGE
20282: {{BNZ{R9{READ3{{EXIT IF ALREADY READ
20283: {{BNE{STAGE{#STGIC{READ3{EXIT IF NOT INITIAL COMPILE
20284: {{MOV{CSWIN{R6{{MAX READ LENGTH
20285: {{JSR{ALOCS{{{ALLOCATE BUFFER
20286: {{JSR{SYSRD{{{READ INPUT IMAGE
20287: {{PPM{READ4{{{JUMP IF END OF FILE
20288: {{MNZ{R7{{{SET TRIMR TO PERFORM TRIM
20289: {{BLE{4*SCLEN(R9){CSWIN{READ1{USE SMALLER OF STRING LNTH ..
20290: {{MOV{CSWIN{4*SCLEN(R9){{... AND XXX OF -INXXX
20291: *
20292: * PERFORM THE TRIM
20293: *
20294: {READ1{JSR{TRIMR{{{TRIM TRAILING BLANKS
20295: *
20296: * MERGE HERE AFTER READ
20297: *
20298: {READ2{MOV{R9{R$CNI{{STORE COPY OF POINTER
20299: *
20300: * MERGE HERE IF NO READ ATTEMPTED
20301: *
20302: {READ3{EXI{{{{RETURN TO READR CALLER
20303: *
20304: * HERE ON END OF FILE
20305: *
20306: {READ4{MOV{R9{DNAMP{{POP UNUSED SCBLK
20307: {{ZER{R9{{{ZERO PTR AS RESULT
20308: {{BRN{READ2{{{MERGE
20309: {{ENP{{{{END PROCEDURE READR
20310: {{EJC{{{{
20311: *
20312: * SBSTR -- BUILD A SUBSTRING
20313: *
20314: * (XL) PTR TO SCBLK/BFBLK WITH CHARS
20315: * (WA) NUMBER OF CHARS IN SUBSTRING
20316: * (WB) OFFSET TO FIRST CHAR IN SCBLK
20317: * JSR SBSTR CALL TO BUILD SUBSTRING
20318: * (XR) PTR TO NEW SCBLK WITH SUBSTRING
20319: * (XL) ZERO
20320: * (WA,WB,WC,XL,IA) DESTROYED
20321: *
20322: * NOTE THAT SBSTR IS CALLED WITH A DUMMY STRING POINTER
20323: * (POINTING INTO A VRBLK OR SVBLK) TO COPY THE NAME OF A
20324: * VARIABLE AS A STANDARD STRING VALUE.
20325: *
20326: {SBSTR{PRC{E{0{{ENTRY POINT
20327: {{BZE{R6{SBST2{{JUMP IF NULL SUBSTRING
20328: {{JSR{ALOCS{{{ELSE ALLOCATE SCBLK
20329: {{MOV{R8{R6{{MOVE NUMBER OF CHARACTERS
20330: {{MOV{R9{R8{{SAVE PTR TO NEW SCBLK
20331: {{PLC{R10{R7{{PREPARE TO LOAD CHARS FROM OLD BLK
20332: {{PSC{R9{{{PREPARE TO STORE CHARS IN NEW BLK
20333: {{MVC{{{{MOVE CHARACTERS TO NEW STRING
20334: {{MOV{R8{R9{{THEN RESTORE SCBLK POINTER
20335: *
20336: * RETURN POINT
20337: *
20338: {SBST1{ZER{R10{{{CLEAR GARBAGE POINTER IN XL
20339: {{EXI{{{{RETURN TO SBSTR CALLER
20340: *
20341: * HERE FOR NULL SUBSTRING
20342: *
20343: {SBST2{MOV{#NULLS{R9{{SET NULL STRING AS RESULT
20344: {{BRN{SBST1{{{RETURN
20345: {{ENP{{{{END PROCEDURE SBSTR
20346: {{EJC{{{{
20347: *
20348: * SCANE -- SCAN AN ELEMENT
20349: *
20350: * SCANE IS CALLED AT COMPILE TIME (BY EXPAN ,CMPIL,CNCRD)
20351: * TO SCAN ONE ELEMENT FROM THE INPUT IMAGE.
20352: *
20353: * (SCNCC) NON-ZERO IF CALLED FROM CNCRD
20354: * JSR SCANE CALL TO SCAN ELEMENT
20355: * (XR) RESULT POINTER (SEE BELOW)
20356: * (XL) SYNTAX TYPE CODE (T$XXX)
20357: *
20358: * THE FOLLOWING GLOBAL LOCATIONS ARE USED.
20359: *
20360: * R$CIM POINTER TO STRING BLOCK (SCBLK)
20361: * FOR CURRENT INPUT IMAGE.
20362: *
20363: * R$CNI POINTER TO NEXT INPUT IMAGE STRING
20364: * POINTER (ZERO IF NONE).
20365: *
20366: * R$SCP SAVE POINTER (EXIT XR) FROM LAST
20367: * CALL IN CASE RESCAN IS SET.
20368: *
20369: * SCNBL THIS LOCATION IS SET NON-ZERO ON
20370: * EXIT IF SCANE SCANNED PAST BLANKS
20371: * BEFORE LOCATING THE CURRENT ELEMENT
20372: * THE END OF A LINE COUNTS AS BLANKS.
20373: *
20374: * SCNCC CNCRD SETS THIS NON-ZERO TO SCAN
20375: * CONTROL CARD NAMES AND CLEARS IT
20376: * ON RETURN
20377: *
20378: * SCNIL LENGTH OF CURRENT INPUT IMAGE
20379: *
20380: * SCNGO IF SET NON-ZERO ON ENTRY, F AND S
20381: * ARE RETURNED AS SEPARATE SYNTAX
20382: * TYPES (NOT LETTERS) (GOTO PRO-
20383: * CESSING). SCNGO IS RESET ON EXIT.
20384: *
20385: * SCNPT OFFSET TO CURRENT LOC IN R$CIM
20386: *
20387: * SCNRS IF SET NON-ZERO ON ENTRY, SCANE
20388: * RETURNS THE SAME RESULT AS ON THE
20389: * LAST CALL (RESCAN). SCNRS IS RESET
20390: * ON EXIT FROM ANY CALL TO SCANE.
20391: *
20392: * SCNTP SAVE SYNTAX TYPE FROM LAST
20393: * CALL (IN CASE RESCAN IS SET).
20394: {{EJC{{{{
20395: *
20396: * SCANE (CONTINUED)
20397: *
20398: *
20399: *
20400: * ELEMENT SCANNED XL XR
20401: * --------------- -- --
20402: *
20403: * CONTROL CARD NAME 0 POINTER TO SCBLK FOR NAME
20404: *
20405: * UNARY OPERATOR T$UOP PTR TO OPERATOR DVBLK
20406: *
20407: * LEFT PAREN T$LPR T$LPR
20408: *
20409: * LEFT BRACKET T$LBR T$LBR
20410: *
20411: * COMMA T$CMA T$CMA
20412: *
20413: * FUNCTION CALL T$FNC PTR TO FUNCTION VRBLK
20414: *
20415: * VARIABLE T$VAR PTR TO VRBLK
20416: *
20417: * STRING CONSTANT T$CON PTR TO SCBLK
20418: *
20419: * INTEGER CONSTANT T$CON PTR TO ICBLK
20420: *
20421: * REAL CONSTANT T$CON PTR TO RCBLK
20422: *
20423: * BINARY OPERATOR T$BOP PTR TO OPERATOR DVBLK
20424: *
20425: * RIGHT PAREN T$RPR T$RPR
20426: *
20427: * RIGHT BRACKET T$RBR T$RBR
20428: *
20429: * COLON T$COL T$COL
20430: *
20431: * SEMI-COLON T$SMC T$SMC
20432: *
20433: * F (SCNGO NE 0) T$FGO T$FGO
20434: *
20435: * S (SCNGO NE 0) T$SGO T$SGO
20436: {{EJC{{{{
20437: *
20438: * SCANE (CONTINUED)
20439: *
20440: * ENTRY POINT
20441: *
20442: {SCANE{PRC{E{0{{ENTRY POINT
20443: {{ZER{SCNBL{{{RESET BLANKS FLAG
20444: {{MOV{R6{SCNSA{{SAVE WA
20445: {{MOV{R7{SCNSB{{SAVE WB
20446: {{MOV{R8{SCNSC{{SAVE WC
20447: {{BZE{SCNRS{SCN03{{JUMP IF NO RESCAN
20448: *
20449: * HERE FOR RESCAN REQUEST
20450: *
20451: {{MOV{SCNTP{R10{{SET PREVIOUS RETURNED SCAN TYPE
20452: {{MOV{R$SCP{R9{{SET PREVIOUS RETURNED POINTER
20453: {{ZER{SCNRS{{{RESET RESCAN SWITCH
20454: {{BRN{SCN13{{{JUMP TO EXIT
20455: *
20456: * COME HERE TO READ NEW IMAGE TO TEST FOR CONTINUATION
20457: *
20458: {SCN01{JSR{READR{{{READ NEXT IMAGE
20459: {{MOV{#4*DVUBS{R7{{SET WB FOR NOT READING NAME
20460: {{BZE{R9{SCN30{{TREAT AS SEMI-COLON IF NONE
20461: {{PLC{R9{{{ELSE POINT TO FIRST CHARACTER
20462: {{LCH{R8{(R9){{LOAD FIRST CHARACTER
20463: {{BEQ{R8{#CH$DT{SCN02{JUMP IF DOT FOR CONTINUATION
20464: {{BNE{R8{#CH$PL{SCN30{ELSE TREAT AS SEMICOLON UNLESS PLUS
20465: *
20466: * HERE FOR CONTINUATION LINE
20467: *
20468: {SCN02{JSR{NEXTS{{{ACQUIRE NEXT SOURCE IMAGE
20469: {{MOV{#NUM01{SCNPT{{SET SCAN POINTER PAST CONTINUATION
20470: {{MNZ{SCNBL{{{SET BLANKS FLAG
20471: {{EJC{{{{
20472: *
20473: * SCANE (CONTINUED)
20474: *
20475: * MERGE HERE TO SCAN NEXT ELEMENT ON CURRENT LINE
20476: *
20477: {SCN03{MOV{SCNPT{R6{{LOAD CURRENT OFFSET
20478: {{BEQ{R6{SCNIL{SCN01{CHECK CONTINUATION IF END
20479: {{MOV{R$CIM{R10{{POINT TO CURRENT LINE
20480: {{PLC{R10{R6{{POINT TO CURRENT CHARACTER
20481: {{MOV{R6{SCNSE{{SET START OF ELEMENT LOCATION
20482: {{MOV{#OPDVS{R8{{POINT TO OPERATOR DV LIST
20483: {{MOV{#4*DVUBS{R7{{SET CONSTANT FOR OPERATOR CIRCUIT
20484: {{BRN{SCN06{{{START SCANNING
20485: *
20486: * LOOP HERE TO IGNORE LEADING BLANKS AND TABS
20487: *
20488: {SCN05{BZE{R7{SCN10{{JUMP IF TRAILING
20489: {{ICV{SCNSE{{{INCREMENT START OF ELEMENT
20490: {{BEQ{R6{SCNIL{SCN01{JUMP IF END OF IMAGE
20491: {{MNZ{SCNBL{{{NOTE BLANKS SEEN
20492: *
20493: * THE FOLLOWING JUMP IS USED REPEATEDLY FOR SCANNING OUT
20494: * THE CHARACTERS OF A NUMERIC CONSTANT OR VARIABLE NAME.
20495: * THE REGISTERS ARE USED AS FOLLOWS.
20496: *
20497: * (XR) SCRATCH
20498: * (XL) PTR TO NEXT CHARACTER
20499: * (WA) CURRENT SCAN OFFSET
20500: * (WB) *DVUBS (0 IF SCANNING NAME,CONST)
20501: * (WC) =OPDVS (0 IF SCANNING CONSTANT)
20502: *
20503: {SCN06{LCH{R9{(R10)+{{GET NEXT CHARACTER
20504: {{ICV{R6{{{BUMP SCAN OFFSET
20505: {{MOV{R6{SCNPT{{STORE OFFSET PAST CHAR SCANNED
20506: {{BLO{#CFP$U{R9{SCN07{QUICK CHECK FOR OTHER CHAR
20507: {{BSW{R9{CFP$U{SCN07{SWITCH ON SCANNED CHARACTER
20508: *
20509: * SWITCH TABLE FOR SWITCH ON CHARACTER
20510: *
20511: {{EJC{{{{
20512: *
20513: * SCANE (CONTINUED)
20514: *
20515: {{EJC{{{{
20516: *
20517: * SCANE (CONTINUED)
20518: *
20519: {{IFF{DUMMY{SCN07{{
20520: {{IFF{DUMMY{SCN07{{
20521: {{IFF{DUMMY{SCN07{{
20522: {{IFF{DUMMY{SCN07{{
20523: {{IFF{DUMMY{SCN07{{
20524: {{IFF{DUMMY{SCN07{{
20525: {{IFF{DUMMY{SCN07{{
20526: {{IFF{DUMMY{SCN07{{
20527: {{IFF{DUMMY{SCN07{{
20528: {{IFF{CH$HT{SCN05{{HORIZONTAL TAB
20529: {{IFF{DUMMY{SCN07{{
20530: {{IFF{DUMMY{SCN07{{
20531: {{IFF{DUMMY{SCN07{{
20532: {{IFF{DUMMY{SCN07{{
20533: {{IFF{DUMMY{SCN07{{
20534: {{IFF{DUMMY{SCN07{{
20535: {{IFF{DUMMY{SCN07{{
20536: {{IFF{DUMMY{SCN07{{
20537: {{IFF{DUMMY{SCN07{{
20538: {{IFF{DUMMY{SCN07{{
20539: {{IFF{DUMMY{SCN07{{
20540: {{IFF{DUMMY{SCN07{{
20541: {{IFF{DUMMY{SCN07{{
20542: {{IFF{DUMMY{SCN07{{
20543: {{IFF{DUMMY{SCN07{{
20544: {{IFF{DUMMY{SCN07{{
20545: {{IFF{DUMMY{SCN07{{
20546: {{IFF{DUMMY{SCN07{{
20547: {{IFF{DUMMY{SCN07{{
20548: {{IFF{DUMMY{SCN07{{
20549: {{IFF{DUMMY{SCN07{{
20550: {{IFF{DUMMY{SCN07{{
20551: {{IFF{CH$BL{SCN05{{BLANK
20552: {{IFF{CH$EX{SCN37{{EXCLAMATION MARK
20553: {{IFF{CH$DQ{SCN17{{DOUBLE QUOTE
20554: {{IFF{CH$NM{SCN41{{NUMBER SIGN
20555: {{IFF{CH$DL{SCN36{{DOLLAR
20556: {{IFF{CH$PC{SCN38{{PERCENT
20557: {{IFF{CH$AM{SCN44{{AMPERSAND
20558: {{IFF{CH$SQ{SCN16{{SINGLE QUOTE
20559: {{IFF{CH$PP{SCN25{{LEFT PAREN
20560: {{IFF{CH$RP{SCN26{{RIGHT PAREN
20561: {{IFF{CH$AS{SCN49{{ASTERISK
20562: {{IFF{CH$PL{SCN33{{PLUS
20563: {{IFF{CH$CM{SCN31{{COMMA
20564: {{IFF{CH$MN{SCN34{{MINUS
20565: {{IFF{CH$DT{SCN32{{DOT
20566: {{IFF{CH$SL{SCN40{{SLASH
20567: {{IFF{CH$D0{SCN08{{DIGIT 0
20568: {{IFF{CH$D1{SCN08{{DIGIT 1
20569: {{IFF{CH$D2{SCN08{{DIGIT 2
20570: {{IFF{CH$D3{SCN08{{DIGIT 3
20571: {{IFF{CH$D4{SCN08{{DIGIT 4
20572: {{IFF{CH$D5{SCN08{{DIGIT 5
20573: {{IFF{CH$D6{SCN08{{DIGIT 6
20574: {{IFF{CH$D7{SCN08{{DIGIT 7
20575: {{IFF{CH$D8{SCN08{{DIGIT 8
20576: {{IFF{CH$D9{SCN08{{DIGIT 9
20577: {{IFF{CH$CL{SCN29{{COLON
20578: {{IFF{CH$SM{SCN30{{SEMI-COLON
20579: {{IFF{CH$BB{SCN28{{LEFT BRACKET
20580: {{IFF{CH$EQ{SCN46{{EQUAL
20581: {{IFF{CH$RB{SCN27{{RIGHT BRACKET
20582: {{IFF{CH$QU{SCN45{{QUESTION MARK
20583: {{IFF{CH$AT{SCN42{{AT
20584: {{IFF{CH$LA{SCN09{{LETTER A
20585: {{IFF{CH$LB{SCN09{{LETTER B
20586: {{IFF{CH$LC{SCN09{{LETTER C
20587: {{IFF{CH$LD{SCN09{{LETTER D
20588: {{IFF{CH$LE{SCN09{{LETTER E
20589: {{IFF{CH$LF{SCN20{{LETTER F
20590: {{IFF{CH$LG{SCN09{{LETTER G
20591: {{IFF{CH$LH{SCN09{{LETTER H
20592: {{IFF{CH$LI{SCN09{{LETTER I
20593: {{IFF{CH$LJ{SCN09{{LETTER J
20594: {{IFF{CH$LK{SCN09{{LETTER K
20595: {{IFF{CH$LL{SCN09{{LETTER L
20596: {{IFF{CH$LM{SCN09{{LETTER M
20597: {{IFF{CH$LN{SCN09{{LETTER N
20598: {{IFF{CH$LO{SCN09{{LETTER O
20599: {{IFF{CH$LP{SCN09{{LETTER P
20600: {{IFF{CH$LQ{SCN09{{LETTER Q
20601: {{IFF{CH$LR{SCN09{{LETTER R
20602: {{IFF{CH$LS{SCN21{{LETTER S
20603: {{IFF{CH$LT{SCN09{{LETTER T
20604: {{IFF{CH$LU{SCN09{{LETTER U
20605: {{IFF{CH$LV{SCN09{{LETTER V
20606: {{IFF{CH$LW{SCN09{{LETTER W
20607: {{IFF{CH$LX{SCN09{{LETTER X
20608: {{IFF{CH$LY{SCN09{{LETTER Y
20609: {{IFF{CH$L${SCN09{{LETTER Z
20610: {{IFF{CH$OB{SCN28{{LEFT BRACKET
20611: {{IFF{DUMMY{SCN07{{
20612: {{IFF{CH$CB{SCN27{{RIGHT BRACKET
20613: {{IFF{DUMMY{SCN07{{
20614: {{IFF{CH$UN{SCN24{{UNDERLINE
20615: {{IFF{DUMMY{SCN07{{
20616: {{IFF{CH$$A{SCN09{{SHIFTED A
20617: {{IFF{CH$$B{SCN09{{SHIFTED B
20618: {{IFF{CH$$C{SCN09{{SHIFTED C
20619: {{IFF{CH$$D{SCN09{{SHIFTED D
20620: {{IFF{CH$$E{SCN09{{SHIFTED E
20621: {{IFF{CH$$F{SCN20{{SHIFTED F
20622: {{IFF{CH$$G{SCN09{{SHIFTED G
20623: {{IFF{CH$$H{SCN09{{SHIFTED H
20624: {{IFF{CH$$I{SCN09{{SHIFTED I
20625: {{IFF{CH$$J{SCN09{{SHIFTED J
20626: {{IFF{CH$$K{SCN09{{SHIFTED K
20627: {{IFF{CH$$L{SCN09{{SHIFTED L
20628: {{IFF{CH$$M{SCN09{{SHIFTED M
20629: {{IFF{CH$$N{SCN09{{SHIFTED N
20630: {{IFF{CH$$O{SCN09{{SHIFTED O
20631: {{IFF{CH$$P{SCN09{{SHIFTED P
20632: {{IFF{CH$$Q{SCN09{{SHIFTED Q
20633: {{IFF{CH$$R{SCN09{{SHIFTED R
20634: {{IFF{CH$$S{SCN21{{SHIFTED S
20635: {{IFF{CH$$T{SCN09{{SHIFTED T
20636: {{IFF{CH$$U{SCN09{{SHIFTED U
20637: {{IFF{CH$$V{SCN09{{SHIFTED V
20638: {{IFF{CH$$W{SCN09{{SHIFTED W
20639: {{IFF{CH$$X{SCN09{{SHIFTED X
20640: {{IFF{CH$$Y{SCN09{{SHIFTED Y
20641: {{IFF{CH$$${SCN09{{SHIFTED Z
20642: {{IFF{DUMMY{SCN07{{
20643: {{IFF{CH$BR{SCN43{{VERTICAL BAR
20644: {{IFF{DUMMY{SCN07{{
20645: {{IFF{CH$NT{SCN35{{NOT
20646: {{IFF{DUMMY{SCN07{{
20647: {{ESW{{{{END SWITCH ON CHARACTER
20648: *
20649: * HERE FOR ILLEGAL CHARACTER (UNDERLINE MERGES)
20650: *
20651: {SCN07{BZE{R7{SCN10{{JUMP IF SCANNING NAME OR CONSTANT
20652: {{ERB{230{SYNTAX{{ERROR. ILLEGAL CHARACTER
20653: {{EJC{{{{
20654: *
20655: * SCANE (CONTINUED)
20656: *
20657: * HERE FOR DIGITS 0-9
20658: *
20659: {SCN08{BZE{R7{SCN09{{KEEP SCANNING IF NAME/CONSTANT
20660: {{ZER{R8{{{ELSE SET FLAG FOR SCANNING CONSTANT
20661: *
20662: * HERE FOR LETTER. LOOP HERE WHEN SCANNING NAME/CONSTANT
20663: *
20664: {SCN09{BEQ{R6{SCNIL{SCN11{JUMP IF END OF IMAGE
20665: {{ZER{R7{{{SET FLAG FOR SCANNING NAME/CONST
20666: {{BRN{SCN06{{{MERGE BACK TO CONTINUE SCAN
20667: *
20668: * COME HERE FOR DELIMITER ENDING NAME OR CONSTANT
20669: *
20670: {SCN10{DCV{R6{{{RESET OFFSET TO POINT TO DELIMITER
20671: *
20672: * COME HERE AFTER FINISHING SCAN OF NAME OR CONSTANT
20673: *
20674: {SCN11{MOV{R6{SCNPT{{STORE UPDATED SCAN OFFSET
20675: {{MOV{SCNSE{R7{{POINT TO START OF ELEMENT
20676: {{SUB{R7{R6{{GET NUMBER OF CHARACTERS
20677: {{MOV{R$CIM{R10{{POINT TO LINE IMAGE
20678: {{BNZ{R8{SCN15{{JUMP IF NAME
20679: *
20680: * HERE AFTER SCANNING OUT NUMERIC CONSTANT
20681: *
20682: {{JSR{SBSTR{{{GET STRING FOR CONSTANT
20683: {{MOV{R9{DNAMP{{DELETE FROM STORAGE (NOT NEEDED)
20684: {{JSR{GTNUM{{{CONVERT TO NUMERIC
20685: {{PPM{SCN14{{{JUMP IF CONVERSION FAILURE
20686: *
20687: * MERGE HERE TO EXIT WITH CONSTANT
20688: *
20689: {SCN12{MOV{#T$CON{R10{{SET RESULT TYPE OF CONSTANT
20690: {{EJC{{{{
20691: *
20692: * SCANE (CONTINUED)
20693: *
20694: * COMMON EXIT POINT (XR,XL) SET
20695: *
20696: {SCN13{MOV{SCNSA{R6{{RESTORE WA
20697: {{MOV{SCNSB{R7{{RESTORE WB
20698: {{MOV{SCNSC{R8{{RESTORE WC
20699: {{MOV{R9{R$SCP{{SAVE XR IN CASE RESCAN
20700: {{MOV{R10{SCNTP{{SAVE XL IN CASE RESCAN
20701: {{ZER{SCNGO{{{RESET POSSIBLE GOTO FLAG
20702: {{EXI{{{{RETURN TO SCANE CALLER
20703: *
20704: * HERE IF CONVERSION ERROR ON NUMERIC ITEM
20705: *
20706: {SCN14{ERB{231{SYNTAX{{ERROR. INVALID NUMERIC ITEM
20707: *
20708: * HERE AFTER SCANNING OUT VARIABLE NAME
20709: *
20710: {SCN15{JSR{SBSTR{{{BUILD STRING NAME OF VARIABLE
20711: {{BNZ{SCNCC{SCN13{{RETURN IF CNCRD CALL
20712: {{JSR{GTNVR{{{LOCATE/BUILD VRBLK
20713: {{PPM{{{{DUMMY (UNUSED) ERROR RETURN
20714: {{MOV{#T$VAR{R10{{SET TYPE AS VARIABLE
20715: {{BRN{SCN13{{{BACK TO EXIT
20716: *
20717: * HERE FOR SINGLE QUOTE (START OF STRING CONSTANT)
20718: *
20719: {SCN16{BZE{R7{SCN10{{TERMINATOR IF SCANNING NAME OR CNST
20720: {{MOV{#CH$SQ{R7{{SET TERMINATOR AS SINGLE QUOTE
20721: {{BRN{SCN18{{{MERGE
20722: *
20723: * HERE FOR DOUBLE QUOTE (START OF STRING CONSTANT)
20724: *
20725: {SCN17{BZE{R7{SCN10{{TERMINATOR IF SCANNING NAME OR CNST
20726: {{MOV{#CH$DQ{R7{{SET DOUBLE QUOTE TERMINATOR, MERGE
20727: *
20728: * LOOP TO SCAN OUT STRING CONSTANT
20729: *
20730: {SCN18{BEQ{R6{SCNIL{SCN19{ERROR IF END OF IMAGE
20731: {{LCH{R8{(R10)+{{ELSE LOAD NEXT CHARACTER
20732: {{ICV{R6{{{BUMP OFFSET
20733: {{BNE{R8{R7{SCN18{LOOP BACK IF NOT TERMINATOR
20734: {{EJC{{{{
20735: *
20736: * SCANE (CONTINUED)
20737: *
20738: * HERE AFTER SCANNING OUT STRING CONSTANT
20739: *
20740: {{MOV{SCNPT{R7{{POINT TO FIRST CHARACTER
20741: {{MOV{R6{SCNPT{{SAVE OFFSET PAST FINAL QUOTE
20742: {{DCV{R6{{{POINT BACK PAST LAST CHARACTER
20743: {{SUB{R7{R6{{GET NUMBER OF CHARACTERS
20744: {{MOV{R$CIM{R10{{POINT TO INPUT IMAGE
20745: {{JSR{SBSTR{{{BUILD SUBSTRING VALUE
20746: {{BRN{SCN12{{{BACK TO EXIT WITH CONSTANT RESULT
20747: *
20748: * HERE IF NO MATCHING QUOTE FOUND
20749: *
20750: {SCN19{MOV{R6{SCNPT{{SET UPDATED SCAN POINTER
20751: {{ERB{232{SYNTAX{{ERROR. UNMATCHED STRING QUOTE
20752: *
20753: * HERE FOR F (POSSIBLE FAILURE GOTO)
20754: *
20755: {SCN20{MOV{#T$FGO{R9{{SET RETURN CODE FOR FAIL GOTO
20756: {{BRN{SCN22{{{JUMP TO MERGE
20757: *
20758: * HERE FOR S (POSSIBLE SUCCESS GOTO)
20759: *
20760: {SCN21{MOV{#T$SGO{R9{{SET SUCCESS GOTO AS RETURN CODE
20761: *
20762: * SPECIAL GOTO CASES MERGE HERE
20763: *
20764: {SCN22{BZE{SCNGO{SCN09{{TREAT AS NORMAL LETTER IF NOT GOTO
20765: *
20766: * MERGE HERE FOR SPECIAL CHARACTER EXIT
20767: *
20768: {SCN23{BZE{R7{SCN10{{JUMP IF END OF NAME/CONSTANT
20769: {{MOV{R9{R10{{ELSE COPY CODE
20770: {{BRN{SCN13{{{AND JUMP TO EXIT
20771: *
20772: * HERE FOR UNDERLINE
20773: *
20774: {SCN24{BZE{R7{SCN09{{PART OF NAME IF SCANNING NAME
20775: {{BRN{SCN07{{{ELSE ILLEGAL
20776: {{EJC{{{{
20777: *
20778: * SCANE (CONTINUED)
20779: *
20780: * HERE FOR LEFT PAREN
20781: *
20782: {SCN25{MOV{#T$LPR{R9{{SET LEFT PAREN RETURN CODE
20783: {{BNZ{R7{SCN23{{RETURN LEFT PAREN UNLESS NAME
20784: {{BZE{R8{SCN10{{DELIMITER IF SCANNING CONSTANT
20785: *
20786: * HERE FOR LEFT PAREN AFTER NAME (FUNCTION CALL)
20787: *
20788: {{MOV{SCNSE{R7{{POINT TO START OF NAME
20789: {{MOV{R6{SCNPT{{SET POINTER PAST LEFT PAREN
20790: {{DCV{R6{{{POINT BACK PAST LAST CHAR OF NAME
20791: {{SUB{R7{R6{{GET NAME LENGTH
20792: {{MOV{R$CIM{R10{{POINT TO INPUT IMAGE
20793: {{JSR{SBSTR{{{GET STRING NAME FOR FUNCTION
20794: {{JSR{GTNVR{{{LOCATE/BUILD VRBLK
20795: {{PPM{{{{DUMMY (UNUSED) ERROR RETURN
20796: {{MOV{#T$FNC{R10{{SET CODE FOR FUNCTION CALL
20797: {{BRN{SCN13{{{BACK TO EXIT
20798: *
20799: * PROCESSING FOR SPECIAL CHARACTERS
20800: *
20801: {SCN26{MOV{#T$RPR{R9{{RIGHT PAREN, SET CODE
20802: {{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT
20803: *
20804: {SCN27{MOV{#T$RBR{R9{{RIGHT BRACKET, SET CODE
20805: {{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT
20806: *
20807: {SCN28{MOV{#T$LBR{R9{{LEFT BRACKET, SET CODE
20808: {{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT
20809: *
20810: {SCN29{MOV{#T$COL{R9{{COLON, SET CODE
20811: {{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT
20812: *
20813: {SCN30{MOV{#T$SMC{R9{{SEMI-COLON, SET CODE
20814: {{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT
20815: *
20816: {SCN31{MOV{#T$CMA{R9{{COMMA, SET CODE
20817: {{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT
20818: {{EJC{{{{
20819: *
20820: * SCANE (CONTINUED)
20821: *
20822: * HERE FOR OPERATORS. ON ENTRY, WC POINTS TO THE TABLE OF
20823: * OPERATOR DOPE VECTORS AND WB IS THE INCREMENT TO STEP
20824: * TO THE NEXT PAIR (BINARY/UNARY) OF DOPE VECTORS IN THE
20825: * LIST. ON REACHING SCN46, THE POINTER HAS BEEN ADJUSTED TO
20826: * POINT TO THE APPROPRIATE PAIR OF DOPE VECTORS.
20827: * THE FIRST THREE ENTRIES ARE SPECIAL SINCE THEY CAN OCCUR
20828: * AS PART OF A VARIABLE NAME (.) OR CONSTANT (.+-).
20829: *
20830: {SCN32{BZE{R7{SCN09{{DOT CAN BE PART OF NAME OR CONSTANT
20831: {{ADD{R7{R8{{ELSE BUMP POINTER
20832: *
20833: {SCN33{BZE{R8{SCN09{{PLUS CAN BE PART OF CONSTANT
20834: {{BZE{R7{SCN48{{PLUS CANNOT BE PART OF NAME
20835: {{ADD{R7{R8{{ELSE BUMP POINTER
20836: *
20837: {SCN34{BZE{R8{SCN09{{MINUS CAN BE PART OF CONSTANT
20838: {{BZE{R7{SCN48{{MINUS CANNOT BE PART OF NAME
20839: {{ADD{R7{R8{{ELSE BUMP POINTER
20840: *
20841: {SCN35{ADD{R7{R8{{NOT
20842: {SCN36{ADD{R7{R8{{DOLLAR
20843: {SCN37{ADD{R7{R8{{EXCLAMATION
20844: {SCN38{ADD{R7{R8{{PERCENT
20845: {SCN39{ADD{R7{R8{{ASTERISK
20846: {SCN40{ADD{R7{R8{{SLASH
20847: {SCN41{ADD{R7{R8{{NUMBER SIGN
20848: {SCN42{ADD{R7{R8{{AT SIGN
20849: {SCN43{ADD{R7{R8{{VERTICAL BAR
20850: {SCN44{ADD{R7{R8{{AMPERSAND
20851: {SCN45{ADD{R7{R8{{QUESTION MARK
20852: *
20853: * ALL OPERATORS COME HERE (EQUAL MERGES DIRECTLY)
20854: * (WC) POINTS TO THE BINARY/UNARY PAIR OF OPERATOR DVBLKS.
20855: *
20856: {SCN46{BZE{R7{SCN10{{OPERATOR TERMINATES NAME/CONSTANT
20857: {{MOV{R8{R9{{ELSE COPY DV POINTER
20858: {{LCH{R8{(R10){{LOAD NEXT CHARACTER
20859: {{MOV{#T$BOP{R10{{SET BINARY OP IN CASE
20860: {{BEQ{R6{SCNIL{SCN47{SHOULD BE BINARY IF IMAGE END
20861: {{BEQ{R8{#CH$BL{SCN47{SHOULD BE BINARY IF FOLLOWED BY BLK
20862: {{BEQ{R8{#CH$HT{SCN47{JUMP IF HORIZONTAL TAB
20863: {{BEQ{R8{#CH$SM{SCN47{SEMICOLON CAN IMMEDIATELY FOLLOW =
20864: *
20865: * HERE FOR UNARY OPERATOR
20866: *
20867: {{ADD{#4*DVBS${R9{{POINT TO DV FOR UNARY OP
20868: {{MOV{#T$UOP{R10{{SET TYPE FOR UNARY OPERATOR
20869: {{BLE{SCNTP{#T$UOK{SCN13{OK UNARY IF OK PRECEDING ELEMENT
20870: {{EJC{{{{
20871: *
20872: * SCANE (CONTINUED)
20873: *
20874: * MERGE HERE TO REQUIRE PRECEDING BLANKS
20875: *
20876: {SCN47{BNZ{SCNBL{SCN13{{ALL OK IF PRECEDING BLANKS, EXIT
20877: *
20878: * FAIL OPERATOR IN THIS POSITION
20879: *
20880: {SCN48{ERB{233{SYNTAX{{ERROR. INVALID USE OF OPERATOR
20881: *
20882: * HERE FOR ASTERISK, COULD BE ** SUBSTITUTE FOR EXCLAMATION
20883: *
20884: {SCN49{BZE{R7{SCN10{{END OF NAME IF SCANNING NAME
20885: {{BEQ{R6{SCNIL{SCN39{NOT ** IF * AT IMAGE END
20886: {{MOV{R6{R9{{ELSE SAVE OFFSET PAST FIRST *
20887: {{MOV{R6{SCNOF{{SAVE ANOTHER COPY
20888: {{LCH{R6{(R10)+{{LOAD NEXT CHARACTER
20889: {{BNE{R6{#CH$AS{SCN50{NOT ** IF NEXT CHAR NOT *
20890: {{ICV{R9{{{ELSE STEP OFFSET PAST SECOND *
20891: {{BEQ{R9{SCNIL{SCN51{OK EXCLAM IF END OF IMAGE
20892: {{LCH{R6{(R10){{ELSE LOAD NEXT CHARACTER
20893: {{BEQ{R6{#CH$BL{SCN51{EXCLAMATION IF BLANK
20894: {{BEQ{R6{#CH$HT{SCN51{EXCLAMATION IF HORIZONTAL TAB
20895: *
20896: * UNARY *
20897: *
20898: {SCN50{MOV{SCNOF{R6{{RECOVER STORED OFFSET
20899: {{MOV{R$CIM{R10{{POINT TO LINE AGAIN
20900: {{PLC{R10{R6{{POINT TO CURRENT CHAR
20901: {{BRN{SCN39{{{MERGE WITH UNARY *
20902: *
20903: * HERE FOR ** AS SUBSTITUTE FOR EXCLAMATION
20904: *
20905: {SCN51{MOV{R9{SCNPT{{SAVE SCAN POINTER PAST 2ND *
20906: {{MOV{R9{R6{{COPY SCAN POINTER
20907: {{BRN{SCN37{{{MERGE WITH EXCLAMATION
20908: {{ENP{{{{END PROCEDURE SCANE
20909: {{EJC{{{{
20910: *
20911: * SCNGF -- SCAN GOTO FIELD
20912: *
20913: * SCNGF IS CALLED FROM CMPIL TO SCAN AND ANALYZE A GOTO
20914: * FIELD INCLUDING THE SURROUNDING BRACKETS OR PARENTHESES.
20915: * FOR A NORMAL GOTO, THE RESULT RETURNED IS EITHER A VRBLK
20916: * POINTER FOR A SIMPLE LABEL OPERAND, OR A POINTER TO AN
20917: * EXPRESSION TREE WITH A SPECIAL OUTER UNARY OPERATOR
20918: * (O$GOC). FOR A DIRECT GOTO, THE RESULT RETURNED IS A
20919: * POINTER TO AN EXPRESSION TREE WITH THE SPECIAL OUTER
20920: * UNARY OPERATOR O$GOD.
20921: *
20922: * JSR SCNGF CALL TO SCAN GOTO FIELD
20923: * (XR) RESULT (SEE ABOVE)
20924: * (XL,WA,WB,WC) DESTROYED
20925: *
20926: {SCNGF{PRC{E{0{{ENTRY POINT
20927: {{JSR{SCANE{{{SCAN INITIAL ELEMENT
20928: {{BEQ{R10{#T$LPR{SCNG1{SKIP IF LEFT PAREN (NORMAL GOTO)
20929: {{BEQ{R10{#T$LBR{SCNG2{SKIP IF LEFT BRACKET (DIRECT GOTO)
20930: {{ERB{234{SYNTAX{{ERROR. GOTO FIELD INCORRECT
20931: *
20932: * HERE FOR LEFT PAREN (NORMAL GOTO)
20933: *
20934: {SCNG1{MOV{#NUM01{R7{{SET EXPAN FLAG FOR NORMAL GOTO
20935: {{JSR{EXPAN{{{ANALYZE GOTO FIELD
20936: {{MOV{#OPDVN{R6{{POINT TO OPDV FOR COMPLEX GOTO
20937: {{BLE{R9{STATB{SCNG3{JUMP IF NOT IN STATIC (SGD15)
20938: {{BLO{R9{STATE{SCNG4{JUMP TO EXIT IF SIMPLE LABEL NAME
20939: {{BRN{SCNG3{{{COMPLEX GOTO - MERGE
20940: *
20941: * HERE FOR LEFT BRACKET (DIRECT GOTO)
20942: *
20943: {SCNG2{MOV{#NUM02{R7{{SET EXPAN FLAG FOR DIRECT GOTO
20944: {{JSR{EXPAN{{{SCAN GOTO FIELD
20945: {{MOV{#OPDVD{R6{{SET OPDV POINTER FOR DIRECT GOTO
20946: {{EJC{{{{
20947: *
20948: * SCNGF (CONTINUED)
20949: *
20950: * MERGE HERE TO BUILD OUTER UNARY OPERATOR BLOCK
20951: *
20952: {SCNG3{MOV{R6{-(SP){{STACK OPERATOR DV POINTER
20953: {{MOV{R9{-(SP){{STACK POINTER TO EXPRESSION TREE
20954: {{JSR{EXPOP{{{POP OPERATOR OFF
20955: {{MOV{(SP)+{R9{{RELOAD NEW EXPRESSION TREE POINTER
20956: *
20957: * COMMON EXIT POINT
20958: *
20959: {SCNG4{EXI{{{{RETURN TO CALLER
20960: {{ENP{{{{END PROCEDURE SCNGF
20961: {{EJC{{{{
20962: *
20963: * SETVR -- SET VRGET,VRSTO FIELDS OF VRBLK
20964: *
20965: * SETVR SETS THE PROPER VALUES IN THE VRGET AND VRSTO
20966: * FIELDS OF A VRBLK. IT IS CALLED WHENEVER TRBLKS ARE
20967: * ADDED OR SUBTRACTED (TRACE,STOPTR,INPUT,OUTPUT,DETACH)
20968: *
20969: * (XR) POINTER TO VRBLK
20970: * JSR SETVR CALL TO SET FIELDS
20971: * (XL,WA) DESTROYED
20972: *
20973: * NOTE THAT SETVR IGNORES THE CALL IF XR DOES NOT POINT
20974: * INTO THE STATIC REGION (I.E. IS SOME OTHER NAME BASE)
20975: *
20976: {SETVR{PRC{E{0{{ENTRY POINT
20977: {{BHI{R9{STATE{SETV1{EXIT IF NOT NATURAL VARIABLE
20978: *
20979: * HERE IF WE HAVE A VRBLK
20980: *
20981: {{MOV{R9{R10{{COPY VRBLK POINTER
20982: {{MOV{#B$VRL{4*VRGET(R9){{STORE NORMAL GET VALUE
20983: {{BEQ{4*VRSTO(R9){#B$VRE{SETV1{SKIP IF PROTECTED VARIABLE
20984: {{MOV{#B$VRS{4*VRSTO(R9){{STORE NORMAL STORE VALUE
20985: {{MOV{4*VRVAL(R10){R10{{POINT TO NEXT ENTRY ON CHAIN
20986: {{BNE{(R10){#B$TRT{SETV1{JUMP IF END OF TRBLK CHAIN
20987: {{MOV{#B$VRA{4*VRGET(R9){{STORE TRAPPED ROUTINE ADDRESS
20988: {{MOV{#B$VRV{4*VRSTO(R9){{SET TRAPPED ROUTINE ADDRESS
20989: *
20990: * MERGE HERE TO EXIT TO CALLER
20991: *
20992: {SETV1{EXI{{{{RETURN TO SETVR CALLER
20993: {{ENP{{{{END PROCEDURE SETVR
20994: {{EJC{{{{
20995: *
20996: * SORTA -- SORT ARRAY
20997: *
20998: * ROUTINE TO SORT AN ARRAY OR TABLE ON SAME BASIS AS IN
20999: * SITBOL. A TABLE IS CONVERTED TO AN ARRAY, LEAVING TWO
21000: * DIMENSIONAL ARRAYS AND VECTORS AS CASES TO BE CONSIDERED.
21001: * WHOLE ROWS OF ARRAYS ARE PERMUTED ACCORDING TO THE
21002: * ORDERING OF THE KEYS THEY CONTAIN, AND THE STRIDE
21003: * REFERRED TO, IS THE THE LENGTH OF A ROW. IT IS ONE
21004: * FOR A VECTOR.
21005: * THE SORT USED IS HEAPSORT, FUNDAMENTALS OF DATA STRUCTURE
21006: * HOROWITZ AND SAHNI, PITMAN 1977, PAGE 347.
21007: * IT IS AN ORDER N*LOG(N) ALGORITHM. IN ORDER
21008: * TO MAKE IT STABLE, COMPARANDS MAY NOT COMPARE EQUAL. THIS
21009: * IS ACHIEVED BY SORTING A COPY ARRAY (REFERRED TO AS THE
21010: * SORT ARRAY) CONTAINING AT ITS HIGH ADDRESS END, BYTE
21011: * OFFSETS TO THE ROWS TO BE SORTED HELD IN THE ORIGINAL
21012: * ARRAY (REFERRED TO AS THE KEY ARRAY). SORTC, THE
21013: * COMPARISON ROUTINE, ACCESSES THE KEYS THROUGH THESE
21014: * OFFSETS AND IN THE CASE OF EQUALITY, RESOLVES IT BY
21015: * COMPARING THE OFFSETS THEMSELVES. THE SORT PERMUTES THE
21016: * OFFSETS WHICH ARE THEN USED IN A FINAL OPERATION TO COPY
21017: * THE ACTUAL ITEMS INTO THE NEW ARRAY IN SORTED ORDER.
21018: * REFERENCES TO ZEROTH ITEM ARE TO NOTIONAL ITEM
21019: * PRECEDING FIRST ACTUAL ITEM.
21020: * REVERSE SORTING FOR RSORT IS DONE BY HAVING THE LESS THAN
21021: * TEST FOR KEYS EFFECTIVELY BE REPLACED BY A
21022: * GREATER THAN TEST.
21023: *
21024: * 1(XS) FIRST ARG - ARRAY OR TABLE
21025: * 0(XS) 2ND ARG - INDEX OR PDTYPE NAME
21026: * (WA) 0 , NON-ZERO FOR SORT , RSORT
21027: * JSR SORTA CALL TO SORT ARRAY
21028: * (XR) SORTED ARRAY
21029: * (XL,WA,WB,WC) DESTROYED
21030: {{EJC{{{{
21031: *
21032: * SORTA (CONTINUED)
21033: *
21034: {SORTA{PRC{N{0{{ENTRY POINT
21035: {{MOV{R6{SRTSR{{SORT/RSORT INDICATOR
21036: {{MOV{#4*NUM01{SRTST{{DEFAULT STRIDE OF 1
21037: {{ZER{SRTOF{{{DEFAULT ZERO OFFSET TO SORT KEY
21038: {{MOV{#NULLS{SRTDF{{CLEAR DATATYPE FIELD NAME
21039: {{MOV{(SP)+{R$SXR{{UNSTACK ARGUMENT 2
21040: {{MOV{(SP)+{R9{{GET FIRST ARGUMENT
21041: {{JSR{GTARR{{{CONVERT TO ARRAY
21042: {{PPM{SRT16{{{FAIL
21043: {{MOV{R9{-(SP){{STACK PTR TO RESULTING KEY ARRAY
21044: {{MOV{R9{-(SP){{ANOTHER COPY FOR COPYB
21045: {{JSR{COPYB{{{GET COPY ARRAY FOR SORTING INTO
21046: {{PPM{{{{CANT FAIL
21047: {{MOV{R9{-(SP){{STACK POINTER TO SORT ARRAY
21048: {{MOV{R$SXR{R9{{GET SECOND ARG
21049: {{MOV{4*1(SP){R10{{GET PTR TO KEY ARRAY
21050: {{BNE{(R10){#B$VCT{SRT02{JUMP IF ARBLK
21051: {{BEQ{R9{#NULLS{SRT01{JUMP IF NULL SECOND ARG
21052: {{JSR{GTNVR{{{GET VRBLK PTR FOR IT
21053: {{ERR{257{ERRONEOUS{{2ND ARG IN SORT/RSORT OF VECTOR
21054: {{MOV{R9{SRTDF{{STORE DATATYPE FIELD NAME VRBLK
21055: *
21056: * COMPUTE N AND OFFSET TO ITEM A(0) IN VECTOR CASE
21057: *
21058: {SRT01{MOV{#4*VCLEN{R8{{OFFSET TO A(0)
21059: {{MOV{#4*VCVLS{R7{{OFFSET TO FIRST ITEM
21060: {{MOV{4*VCLEN(R10){R6{{GET BLOCK LENGTH
21061: {{SUB{#4*VCSI${R6{{GET NO. OF ENTRIES, N (IN BYTES)
21062: {{BRN{SRT04{{{MERGE
21063: *
21064: * HERE FOR ARRAY
21065: *
21066: {SRT02{LDI{4*ARDIM(R10){{{GET POSSIBLE DIMENSION
21067: {{MFI{R6{{{CONVERT TO SHORT INTEGER
21068: {{WTB{R6{{{FURTHER CONVERT TO BAUS
21069: {{MOV{#4*ARVLS{R7{{OFFSET TO FIRST VALUE IF ONE
21070: {{MOV{#4*ARPRO{R8{{OFFSET BEFORE VALUES IF ONE DIM.
21071: {{BEQ{4*ARNDM(R10){#NUM01{SRT04{JUMP IN FACT IF ONE DIM.
21072: {{BNE{4*ARNDM(R10){#NUM02{SRT16{FAIL UNLESS TWO DIMENS
21073: {{LDI{4*ARLB2(R10){{{GET LOWER BOUND 2 AS DEFAULT
21074: {{BEQ{R9{#NULLS{SRT03{JUMP IF DEFAULT SECOND ARG
21075: {{JSR{GTINT{{{CONVERT TO INTEGER
21076: {{PPM{SRT17{{{FAIL
21077: {{LDI{4*ICVAL(R9){{{GET ACTUAL INTEGER VALUE
21078: {{EJC{{{{
21079: *
21080: * SORTA (CONTINUED)
21081: *
21082: * HERE WITH SORT COLUMN INDEX IN IA IN ARRAY CASE
21083: *
21084: {SRT03{SBI{4*ARLB2(R10){{{SUBTRACT LOW BOUND
21085: {{IOV{SRT17{{{FAIL IF OVERFLOW
21086: {{ILT{SRT17{{{FAIL IF BELOW LOW BOUND
21087: {{SBI{4*ARDM2(R10){{{CHECK AGAINST DIMENSION
21088: {{IGE{SRT17{{{FAIL IF TOO LARGE
21089: {{ADI{4*ARDM2(R10){{{RESTORE VALUE
21090: {{MFI{R6{{{GET AS SMALL INTEGER
21091: {{WTB{R6{{{OFFSET WITHIN ROW TO KEY
21092: {{MOV{R6{SRTOF{{KEEP OFFSET
21093: {{LDI{4*ARDM2(R10){{{SECOND DIMENSION IS ROW LENGTH
21094: {{MFI{R6{{{CONVERT TO SHORT INTEGER
21095: {{MOV{R6{R9{{COPY ROW LENGTH
21096: {{WTB{R6{{{CONVERT TO BYTES
21097: {{MOV{R6{SRTST{{STORE AS STRIDE
21098: {{LDI{4*ARDIM(R10){{{GET NUMBER OF ROWS
21099: {{MFI{R6{{{AS A SHORT INTEGER
21100: {{WTB{R6{{{CONVERT N TO BAUS
21101: {{MOV{4*ARLEN(R10){R8{{OFFSET PAST ARRAY END
21102: {{SUB{R6{R8{{ADJUST, GIVING SPACE FOR N OFFSETS
21103: {{DCA{R8{{{POINT TO A(0)
21104: {{MOV{4*AROFS(R10){R7{{OFFSET TO WORD BEFORE FIRST ITEM
21105: {{ICA{R7{{{OFFSET TO FIRST ITEM
21106: *
21107: * SEPARATE PRE-PROCESSING FOR ARRAYS AND VECTORS DONE.
21108: * TO SIMPLIFY LATER KEY COMPARISONS, REMOVAL OF ANY TRBLK
21109: * TRAP BLOCKS FROM ENTRIES IN KEY ARRAY IS EFFECTED.
21110: *
21111: * (XL) = 1(XS) = POINTER TO KEY ARRAY
21112: * (XS) = POINTER TO SORT ARRAY
21113: * WA = NUMBER OF ITEMS, N (CONVERTED TO BYTES).
21114: * WB = OFFSET TO FIRST ITEM OF ARRAYS.
21115: * WC = OFFSET TO A(0)
21116: *
21117: {SRT04{BLE{R6{#4*NUM01{SRT15{RETURN IF ONLY A SINGLE ITEM
21118: {{MOV{R6{SRTSN{{STORE NUMBER OF ITEMS (IN BAUS)
21119: {{MOV{R8{SRTSO{{STORE OFFSET TO A(0)
21120: {{MOV{4*ARLEN(R10){R8{{LENGTH OF ARRAY OR VEC (=VCLEN)
21121: {{ADD{R10{R8{{POINT PAST END OF ARRAY OR VECTOR
21122: {{MOV{R7{SRTSF{{STORE OFFSET TO FIRST ROW
21123: {{ADD{R7{R10{{POINT TO FIRST ITEM IN KEY ARRAY
21124: *
21125: * LOOP THROUGH ARRAY
21126: *
21127: {SRT05{MOV{(R10){R9{{GET AN ENTRY
21128: *
21129: * HUNT ALONG TRBLK CHAIN
21130: *
21131: {SRT06{BNE{(R9){#B$TRT{SRT07{JUMP OUT IF NOT TRBLK
21132: {{MOV{4*TRVAL(R9){R9{{GET VALUE FIELD
21133: {{BRN{SRT06{{{LOOP
21134: {{EJC{{{{
21135: *
21136: * SORTA (CONTINUED)
21137: *
21138: * XR IS VALUE FROM END OF CHAIN
21139: *
21140: {SRT07{MOV{R9{(R10)+{{STORE AS ARRAY ENTRY
21141: {{BLT{R10{R8{SRT05{LOOP IF NOT DONE
21142: {{MOV{(SP){R10{{GET ADRS OF SORT ARRAY
21143: {{MOV{SRTSF{R9{{INITIAL OFFSET TO FIRST KEY
21144: {{MOV{SRTST{R7{{GET STRIDE
21145: {{ADD{SRTSO{R10{{OFFSET TO A(0)
21146: {{ICA{R10{{{POINT TO A(1)
21147: {{MOV{SRTSN{R8{{GET N
21148: {{BTW{R8{{{CONVERT FROM BYTES
21149: {{MOV{R8{SRTNR{{STORE AS ROW COUNT
21150: {{LCT{R8{R8{{LOOP COUNTER
21151: *
21152: * STORE KEY OFFSETS AT TOP OF SORT ARRAY
21153: *
21154: {SRT08{MOV{R9{(R10)+{{STORE AN OFFSET
21155: {{ADD{R7{R9{{BUMP OFFSET BY STRIDE
21156: {{BCT{R8{SRT08{{LOOP THROUGH ROWS
21157: *
21158: * PERFORM THE SORT ON OFFSETS IN SORT ARRAY.
21159: *
21160: * (SRTSN) NUMBER OF ITEMS TO SORT, N (BYTES)
21161: * (SRTSO) OFFSET TO A(0)
21162: *
21163: {SRT09{MOV{SRTSN{R6{{GET N
21164: {{MOV{SRTNR{R8{{GET NUMBER OF ROWS
21165: {{RSH{R8{1{{I = N / 2 (WC=I, INDEX INTO ARRAY)
21166: {{WTB{R8{{{CONVERT BACK TO BYTES
21167: *
21168: * LOOP TO FORM INITIAL HEAP
21169: *
21170: {SRT10{JSR{SORTH{{{SORTH(I,N)
21171: {{DCA{R8{{{I = I - 1
21172: {{BNZ{R8{SRT10{{LOOP IF I GT 0
21173: {{MOV{R6{R8{{I = N
21174: *
21175: * SORTING LOOP. AT THIS POINT, A(1) IS THE LARGEST
21176: * ITEM, SINCE ALGORITHM INITIALISES IT AS, AND THEN MAINTAI
21177: * IT AS, ROOT OF TREE.
21178: *
21179: {SRT11{DCA{R8{{{I = I - 1 (N - 1 INITIALLY)
21180: {{BZE{R8{SRT12{{JUMP IF DONE
21181: {{MOV{(SP){R9{{GET SORT ARRAY ADDRESS
21182: {{ADD{SRTSO{R9{{POINT TO A(0)
21183: {{MOV{R9{R10{{A(0) ADDRESS
21184: {{ADD{R8{R10{{A(I) ADDRESS
21185: {{MOV{4*1(R10){R7{{COPY A(I+1)
21186: {{MOV{4*1(R9){4*1(R10){{MOVE A(1) TO A(I+1)
21187: {{MOV{R7{4*1(R9){{COMPLETE EXCHANGE OF A(1), A(I+1)
21188: {{MOV{R8{R6{{N = I FOR SORTH
21189: {{MOV{#4*NUM01{R8{{I = 1 FOR SORTH
21190: {{JSR{SORTH{{{SORTH(1,N)
21191: {{MOV{R6{R8{{RESTORE WC
21192: {{BRN{SRT11{{{LOOP
21193: {{EJC{{{{
21194: *
21195: * SORTA (CONTINUED)
21196: *
21197: * OFFSETS HAVE BEEN PERMUTED INTO REQUIRED ORDER BY SORT.
21198: * COPY ARRAY ELEMENTS OVER THEM.
21199: *
21200: {SRT12{MOV{(SP){R10{{BASE ADRS OF KEY ARRAY
21201: {{MOV{R10{R8{{COPY IT
21202: {{ADD{SRTSO{R8{{OFFSET OF A(0)
21203: {{ADD{SRTSF{R10{{ADRS OF FIRST ROW OF SORT ARRAY
21204: {{MOV{SRTST{R7{{GET STRIDE
21205: {{BTW{R7{{{CONVERT TO WORDS
21206: *
21207: * COPYING LOOP FOR SUCCESSIVE ITEMS. SORTED OFFSETS ARE
21208: * HELD AT END OF SORT ARRAY.
21209: *
21210: {SRT13{ICA{R8{{{ADRS OF NEXT OF SORTED OFFSETS
21211: {{MOV{R8{R9{{COPY IT FOR ACCESS
21212: {{MOV{(R9){R9{{GET OFFSET
21213: {{ADD{4*1(SP){R9{{ADD KEY ARRAY BASE ADRS
21214: {{LCT{R6{R7{{GET COUNT OF WORDS IN ROW
21215: *
21216: * COPY A COMPLETE ROW
21217: *
21218: {SRT14{MOV{(R9)+{(R10)+{{MOVE A WORD
21219: {{BCT{R6{SRT14{{LOOP
21220: {{DCV{SRTNR{{{DECREMENT ROW COUNT
21221: {{BNZ{SRTNR{SRT13{{REPEAT TILL ALL ROWS DONE
21222: *
21223: * RETURN POINT
21224: *
21225: {SRT15{MOV{(SP)+{R9{{POP RESULT ARRAY PTR
21226: {{ICA{SP{{{POP KEY ARRAY PTR
21227: {{ZER{R$SXL{{{CLEAR JUNK
21228: {{ZER{R$SXR{{{CLEAR JUNK
21229: {{EXI{{{{RETURN
21230: *
21231: * ERROR POINT
21232: *
21233: {SRT16{ERB{256{SORT/RSORT{{1ST ARG NOT SUITABLE ARRAY OR TABLE
21234: {SRT17{ERB{258{SORT/RSORT{{2ND ARG OUT OF RANGE OR NON-INTEGER
21235: {{ENP{{{{END PROCUDURE SORTA
21236: {{EJC{{{{
21237: *
21238: * SORTC -- COMPARE SORT KEYS
21239: *
21240: * COMPARE TWO SORT KEYS GIVEN THEIR OFFSETS. IF
21241: * EQUAL, COMPARE KEY OFFSETS TO GIVE STABLE SORT.
21242: * NOTE THAT IF SRTSR IS NON-ZERO (REQUEST FOR REVERSE
21243: * SORT), THE QUOTED RETURNS ARE INVERTED.
21244: * FOR OBJECTS OF DIFFERING DATATYPES, THE ENTRY POINT
21245: * IDENTIFICATIONS ARE COMPARED.
21246: *
21247: * (XL) BASE ADRS FOR KEYS
21248: * (WA) OFFSET TO KEY 1 ITEM
21249: * (WB) OFFSET TO KEY 2 ITEM
21250: * (SRTSR) ZERO/NON-ZERO FOR SORT/RSORT
21251: * (SRTOF) OFFSET WITHIN ROW TO COMPARANDS
21252: * JSR SORTC CALL TO COMPARE KEYS
21253: * PPM LOC KEY1 LESS THAN KEY2
21254: * NORMAL RETURN, KEY1 GT THAN KEY2
21255: * (XL,XR,WA,WB) DESTROYED
21256: *
21257: {SORTC{PRC{E{1{{ENTRY POINT
21258: {{MOV{R6{SRTS1{{SAVE OFFSET 1
21259: {{MOV{R7{SRTS2{{SAVE OFFSET 2
21260: {{MOV{R8{SRTSC{{SAVE WC
21261: {{ADD{SRTOF{R10{{ADD OFFSET TO COMPARAND FIELD
21262: {{MOV{R10{R9{{COPY BASE + OFFSET
21263: {{ADD{R6{R10{{ADD KEY1 OFFSET
21264: {{ADD{R7{R9{{ADD KEY2 OFFSET
21265: {{MOV{(R10){R10{{GET KEY1
21266: {{MOV{(R9){R9{{GET KEY2
21267: {{BNE{SRTDF{#NULLS{SRC11{JUMP IF DATATYPE FIELD NAME USED
21268: {{EJC{{{{
21269: *
21270: * SORTC (CONTINUED)
21271: *
21272: * MERGE AFTER DEALING WITH FIELD NAME. TRY FOR STRINGS.
21273: *
21274: {SRC01{MOV{(R10){R8{{GET TYPE CODE
21275: {{BNE{R8{(R9){SRC02{SKIP IF NOT SAME DATATYPE
21276: {{BEQ{R8{#B$SCL{SRC09{JUMP IF BOTH STRINGS
21277: *
21278: * NOW TRY FOR NUMERIC
21279: *
21280: {SRC02{MOV{R10{R$SXL{{KEEP ARG1
21281: {{MOV{R9{R$SXR{{KEEP ARG2
21282: {{MOV{R10{-(SP){{STACK
21283: {{MOV{R9{-(SP){{ARGS
21284: {{JSR{ACOMP{{{COMPARE OBJECTS
21285: {{PPM{SRC10{{{NOT NUMERIC
21286: {{PPM{SRC10{{{NOT NUMERIC
21287: {{PPM{SRC03{{{KEY1 LESS
21288: {{PPM{SRC08{{{KEYS EQUAL
21289: {{PPM{SRC05{{{KEY1 GREATER
21290: *
21291: * RETURN IF KEY1 SMALLER (SORT), GREATER (RSORT)
21292: *
21293: {SRC03{BNZ{SRTSR{SRC06{{JUMP IF RSORT
21294: *
21295: {SRC04{MOV{SRTSC{R8{{RESTORE WC
21296: {{EXI{1{{{RETURN
21297: *
21298: * RETURN IF KEY1 GREATER (SORT), SMALLER (RSORT)
21299: *
21300: {SRC05{BNZ{SRTSR{SRC04{{JUMP IF RSORT
21301: *
21302: {SRC06{MOV{SRTSC{R8{{RESTORE WC
21303: {{EXI{{{{RETURN
21304: *
21305: * KEYS ARE OF SAME DATATYPE
21306: *
21307: {SRC07{BLT{R10{R9{SRC03{ITEM FIRST CREATED IS LESS
21308: {{BGT{R10{R9{SRC05{ADDRESSES RISE IN ORDER OF CREATION
21309: *
21310: * DROP THROUGH OR MERGE FOR IDENTICAL OR EQUAL OBJECTS
21311: *
21312: {SRC08{BLT{SRTS1{SRTS2{SRC04{TEST OFFSETS OR KEY ADDRSS INSTEAD
21313: {{BRN{SRC06{{{OFFSET 1 GREATER
21314: {{EJC{{{{
21315: *
21316: * SORTC (CONTINUED)
21317: *
21318: * STRINGS
21319: *
21320: {SRC09{MOV{R10{-(SP){{STACK
21321: {{MOV{R9{-(SP){{ARGS
21322: {{JSR{LCOMP{{{COMPARE OBJECTS
21323: {{PPM{{{{CANT
21324: {{PPM{{{{FAIL
21325: {{PPM{SRC03{{{KEY1 LESS
21326: {{PPM{SRC08{{{KEYS EQUAL
21327: {{PPM{SRC05{{{KEY1 GREATER
21328: *
21329: * ARITHMETIC COMPARISON FAILED - RECOVER ARGS
21330: *
21331: {SRC10{MOV{R$SXL{R10{{GET ARG1
21332: {{MOV{R$SXR{R9{{GET ARG2
21333: {{MOV{(R10){R8{{GET TYPE OF KEY1
21334: {{BEQ{R8{(R9){SRC07{JUMP IF KEYS OF SAME TYPE
21335: {{MOV{R8{R10{{GET BLOCK TYPE WORD
21336: {{MOV{(R9){R9{{GET BLOCK TYPE WORD
21337: {{LEI{R10{{{ENTRY POINT ID FOR KEY1
21338: {{LEI{R9{{{ENTRY POINT ID FOR KEY2
21339: {{BGT{R10{R9{SRC05{JUMP IF KEY1 GT KEY2
21340: {{BRN{SRC03{{{KEY1 LT KEY2
21341: *
21342: * DATATYPE FIELD NAME USED
21343: *
21344: {SRC11{JSR{SORTF{{{CALL ROUTINE TO FIND FIELD 1
21345: {{MOV{R10{-(SP){{STACK ITEM POINTER
21346: {{MOV{R9{R10{{GET KEY2
21347: {{JSR{SORTF{{{FIND FIELD 2
21348: {{MOV{R10{R9{{PLACE AS KEY2
21349: {{MOV{(SP)+{R10{{RECOVER KEY1
21350: {{BRN{SRC01{{{MERGE
21351: {{ENP{{{{PROCEDURE SORTC
21352: {{EJC{{{{
21353: *
21354: * SORTF -- FIND FIELD FOR SORTC
21355: *
21356: * ROUTINE USED BY SORTC TO OBTAIN ITEM CORRESPONDING
21357: * TO A GIVEN FIELD NAME, IF THIS EXISTS, IN A PROGRAMMER
21358: * DEFINED OBJECT PASSED AS ARGUMENT.
21359: * IF SUCH A MATCH OCCURS, RECORD IS KEPT OF DATATYPE
21360: * NAME, FIELD NAME AND OFFSET TO FIELD IN ORDER TO
21361: * SHORT-CIRCUIT LATER SEARCHES ON SAME TYPE. NOTE THAT
21362: * DFBLKS ARE STORED IN STATIC AND HENCE CANNOT BE MOVED.
21363: *
21364: * (SRTDF) VRBLK POINTER OF FIELD NAME
21365: * (XL) POSSIBLE PDBLK POINTER
21366: * JSR SORTF CALL TO SEARCH FOR FIELD NAME
21367: * (XL) ITEM FOUND OR ORIGINAL PDBLK PTR
21368: * (WC) DESTROYED
21369: *
21370: {SORTF{PRC{E{0{{ENTRY POINT
21371: {{BNE{(R10){#B$PDT{SRTF3{RETURN IF NOT PDBLK
21372: {{MOV{R9{-(SP){{KEEP XR
21373: {{MOV{SRTFD{R9{{GET POSSIBLE FORMER DFBLK PTR
21374: {{BZE{R9{SRTF4{{JUMP IF NOT
21375: {{BNE{R9{4*PDDFP(R10){SRTF4{JUMP IF NOT RIGHT DATATYPE
21376: {{BNE{SRTDF{SRTFF{SRTF4{JUMP IF NOT RIGHT FIELD NAME
21377: {{ADD{SRTFO{R10{{ADD OFFSET TO REQUIRED FIELD
21378: *
21379: * HERE WITH XL POINTING TO FOUND FIELD
21380: *
21381: {SRTF1{MOV{(R10){R10{{GET ITEM FROM FIELD
21382: *
21383: * RETURN POINT
21384: *
21385: {SRTF2{MOV{(SP)+{R9{{RESTORE XR
21386: *
21387: {SRTF3{EXI{{{{RETURN
21388: {{EJC{{{{
21389: *
21390: * SORTF (CONTINUED)
21391: *
21392: * CONDUCT A SEARCH
21393: *
21394: {SRTF4{MOV{R10{R9{{COPY ORIGINAL POINTER
21395: {{MOV{4*PDDFP(R9){R9{{POINT TO DFBLK
21396: {{MOV{R9{SRTFD{{KEEP A COPY
21397: {{MOV{4*FARGS(R9){R8{{GET NUMBER OF FIELDS
21398: {{WTB{R8{{{CONVERT TO BYTES
21399: {{ADD{4*DFLEN(R9){R9{{POINT PAST LAST FIELD
21400: *
21401: * LOOP TO FIND NAME IN PDFBLK
21402: *
21403: {SRTF5{DCA{R8{{{COUNT DOWN
21404: {{DCA{R9{{{POINT IN FRONT
21405: {{BEQ{(R9){SRTDF{SRTF6{SKIP OUT IF FOUND
21406: {{BNZ{R8{SRTF5{{LOOP
21407: {{BRN{SRTF2{{{RETURN - NOT FOUND
21408: *
21409: * FOUND
21410: *
21411: {SRTF6{MOV{(R9){SRTFF{{KEEP FIELD NAME PTR
21412: {{ADD{#4*PDFLD{R8{{ADD OFFSET TO FIRST FIELD
21413: {{MOV{R8{SRTFO{{STORE AS FIELD OFFSET
21414: {{ADD{R8{R10{{POINT TO FIELD
21415: {{BRN{SRTF1{{{RETURN
21416: {{ENP{{{{PROCEDURE SORTF
21417: {{EJC{{{{
21418: *
21419: * SORTH -- HEAP ROUTINE FOR SORTA
21420: *
21421: * THIS ROUTINE CONSTRUCTS A HEAP FROM ELEMENTS OF ARRAY, A.
21422: * IN THIS APPLICATION, THE ELEMENTS ARE OFFSETS TO KEYS IN
21423: * A KEY ARRAY.
21424: *
21425: * (XS) POINTER TO SORT ARRAY BASE
21426: * 1(XS) POINTER TO KEY ARRAY BASE
21427: * (WA) MAX ARRAY INDEX, N (IN BYTES)
21428: * (WC) OFFSET J IN A TO ROOT (IN *1 TO *N)
21429: * JSR SORTH CALL SORTH(J,N) TO MAKE HEAP
21430: * (XL,XR,WB) DESTROYED
21431: *
21432: {SORTH{PRC{N{0{{ENTRY POINT
21433: {{MOV{R6{SRTSN{{SAVE N
21434: {{MOV{R8{SRTWC{{KEEP WC
21435: {{MOV{(SP){R10{{SORT ARRAY BASE ADRS
21436: {{ADD{SRTSO{R10{{ADD OFFSET TO A(0)
21437: {{ADD{R8{R10{{POINT TO A(J)
21438: {{MOV{(R10){SRTRT{{GET OFFSET TO ROOT
21439: {{ADD{R8{R8{{DOUBLE J - CANT EXCEED N
21440: *
21441: * LOOP TO MOVE DOWN TREE USING DOUBLED INDEX J
21442: *
21443: {SRH01{BGT{R8{SRTSN{SRH03{DONE IF J GT N
21444: {{BEQ{R8{SRTSN{SRH02{SKIP IF J EQUALS N
21445: {{MOV{(SP){R9{{SORT ARRAY BASE ADRS
21446: {{MOV{4*1(SP){R10{{KEY ARRAY BASE ADRS
21447: {{ADD{SRTSO{R9{{POINT TO A(0)
21448: {{ADD{R8{R9{{ADRS OF A(J)
21449: {{MOV{4*1(R9){R6{{GET A(J+1)
21450: {{MOV{(R9){R7{{GET A(J)
21451: *
21452: * COMPARE SONS. (WA) RIGHT SON, (WB) LEFT SON
21453: *
21454: {{JSR{SORTC{{{COMPARE KEYS - LT(A(J+1),A(J))
21455: {{PPM{SRH02{{{A(J+1) LT A(J)
21456: {{ICA{R8{{{POINT TO GREATER SON, A(J+1)
21457: {{EJC{{{{
21458: *
21459: * SORTH (CONTINUED)
21460: *
21461: * COMPARE ROOT WITH GREATER SON
21462: *
21463: {SRH02{MOV{4*1(SP){R10{{KEY ARRAY BASE ADRS
21464: {{MOV{(SP){R9{{GET SORT ARRAY ADDRESS
21465: {{ADD{SRTSO{R9{{ADRS OF A(0)
21466: {{MOV{R9{R7{{COPY THIS ADRS
21467: {{ADD{R8{R9{{ADRS OF GREATER SON, A(J)
21468: {{MOV{(R9){R6{{GET A(J)
21469: {{MOV{R7{R9{{POINT BACK TO A(0)
21470: {{MOV{SRTRT{R7{{GET ROOT
21471: {{JSR{SORTC{{{COMPARE THEM - LT(A(J),ROOT)
21472: {{PPM{SRH03{{{FATHER EXCEEDS SONS - DONE
21473: {{MOV{(SP){R9{{GET SORT ARRAY ADRS
21474: {{ADD{SRTSO{R9{{POINT TO A(0)
21475: {{MOV{R9{R10{{COPY IT
21476: {{MOV{R8{R6{{COPY J
21477: {{BTW{R8{{{CONVERT TO WORDS
21478: {{RSH{R8{1{{GET J/2
21479: {{WTB{R8{{{CONVERT BACK TO BYTES
21480: {{ADD{R6{R10{{POINT TO A(J)
21481: {{ADD{R8{R9{{ADRS OF A(J/2)
21482: {{MOV{(R10){(R9){{A(J/2) = A(J)
21483: {{MOV{R6{R8{{RECOVER J
21484: {{AOV{R8{R8{SRH03{J = J*2. DONE IF TOO BIG
21485: {{BRN{SRH01{{{LOOP
21486: *
21487: * FINISH BY COPYING ROOT OFFSET BACK INTO ARRAY
21488: *
21489: {SRH03{BTW{R8{{{CONVERT TO WORDS
21490: {{RSH{R8{1{{J = J/2
21491: {{WTB{R8{{{CONVERT BACK TO BYTES
21492: {{MOV{(SP){R9{{SORT ARRAY ADRS
21493: {{ADD{SRTSO{R9{{ADRS OF A(0)
21494: {{ADD{R8{R9{{ADRS OF A(J/2)
21495: {{MOV{SRTRT{(R9){{A(J/2) = ROOT
21496: {{MOV{SRTSN{R6{{RESTORE WA
21497: {{MOV{SRTWC{R8{{RESTORE WC
21498: {{EXI{{{{RETURN
21499: {{ENP{{{{END PROCEDURE SORTH
21500: {{EJC{{{{
21501: {{EJC{{{{
21502: *
21503: * TFIND -- LOCATE TABLE ELEMENT
21504: *
21505: * (XR) SUBSCRIPT VALUE FOR ELEMENT
21506: * (XL) POINTER TO TABLE
21507: * (WB) ZERO BY VALUE, NON-ZERO BY NAME
21508: * JSR TFIND CALL TO LOCATE ELEMENT
21509: * PPM LOC TRANSFER LOCATION IF ACCESS FAILS
21510: * (XR) ELEMENT VALUE (IF BY VALUE)
21511: * (XR) DESTROYED (IF BY NAME)
21512: * (XL,WA) TEBLK NAME (IF BY NAME)
21513: * (XL,WA) DESTROYED (IF BY VALUE)
21514: * (WC,RA) DESTROYED
21515: *
21516: * NOTE THAT IF A CALL BY VALUE SPECIFIES A NON-EXISTENT
21517: * SUBSCRIPT, NULL IS RETURNED WITHOUT BUILDING A NEW TEBLK.
21518: *
21519: {TFIND{PRC{E{1{{ENTRY POINT
21520: {{MOV{R7{-(SP){{SAVE NAME/VALUE INDICATOR
21521: {{MOV{R9{-(SP){{SAVE SUBSCRIPT VALUE
21522: {{MOV{R10{-(SP){{SAVE TABLE POINTER
21523: {{MOV{4*TBLEN(R10){R6{{LOAD LENGTH OF TBBLK
21524: {{BTW{R6{{{CONVERT TO WORD COUNT
21525: {{SUB{#TBBUK{R6{{GET NUMBER OF BUCKETS
21526: {{MTI{R6{{{CONVERT TO INTEGER VALUE
21527: {{STI{TFNSI{{{SAVE FOR LATER
21528: {{MOV{(R9){R10{{LOAD FIRST WORD OF SUBSCRIPT
21529: {{LEI{R10{{{LOAD BLOCK ENTRY ID (BL$XX)
21530: {{BSW{R10{BL$$D{TFN00{SWITCH ON BLOCK TYPE
21531: {{IFF{DUMMY{TFN00{{
21532: {{IFF{DUMMY{TFN00{{
21533: {{IFF{DUMMY{TFN00{{
21534: {{IFF{DUMMY{TFN00{{
21535: {{IFF{BL$IC{TFN02{{JUMP IF INTEGER
21536: {{IFF{BL$NM{TFN04{{JUMP IF NAME
21537: {{IFF{BL$P0{TFN03{{JUMP IF PATTERN
21538: {{IFF{BL$P1{TFN03{{JUMP IF PATTERN
21539: {{IFF{BL$P2{TFN03{{JUMP IF PATTERN
21540: {{IFF{BL$RC{TFN02{{REAL
21541: {{IFF{BL$SC{TFN05{{JUMP IF STRING
21542: {{IFF{DUMMY{TFN00{{
21543: {{IFF{DUMMY{TFN00{{
21544: {{IFF{DUMMY{TFN00{{
21545: {{IFF{DUMMY{TFN00{{
21546: {{IFF{DUMMY{TFN00{{
21547: {{IFF{DUMMY{TFN00{{
21548: {{ESW{{{{END SWITCH ON BLOCK TYPE
21549: *
21550: * HERE FOR BLOCKS FOR WHICH WE USE THE SECOND WORD OF THE
21551: * BLOCK AS THE HASH SOURCE (SEE BLOCK FORMATS FOR DETAILS).
21552: *
21553: {TFN00{MOV{4*1(R9){R6{{LOAD SECOND WORD
21554: *
21555: * MERGE HERE WITH ONE WORD HASH SOURCE IN WA
21556: *
21557: {TFN01{MTI{R6{{{CONVERT TO INTEGER
21558: {{BRN{TFN06{{{JUMP TO MERGE
21559: {{EJC{{{{
21560: *
21561: * TFIND (CONTINUED)
21562: *
21563: * HERE FOR INTEGER OR REAL
21564: *
21565: {TFN02{LDI{4*1(R9){{{LOAD VALUE AS HASH SOURCE
21566: {{IGE{TFN06{{{OK IF POSITIVE OR ZERO
21567: {{NGI{{{{MAKE POSITIVE
21568: {{IOV{TFN06{{{CLEAR POSSIBLE OVERFLOW
21569: {{BRN{TFN06{{{MERGE
21570: *
21571: * FOR PATTERN, USE FIRST WORD (PCODE) AS SOURCE
21572: *
21573: {TFN03{MOV{(R9){R6{{LOAD FIRST WORD AS HASH SOURCE
21574: {{BRN{TFN01{{{MERGE BACK
21575: *
21576: * FOR NAME, USE OFFSET AS HASH SOURCE
21577: *
21578: {TFN04{MOV{4*NMOFS(R9){R6{{LOAD OFFSET AS HASH SOURCE
21579: {{BRN{TFN01{{{MERGE BACK
21580: *
21581: * HERE FOR STRING
21582: *
21583: {TFN05{JSR{HASHS{{{CALL ROUTINE TO COMPUTE HASH
21584: *
21585: * MERGE HERE WITH HASH SOURCE IN (IA)
21586: *
21587: {TFN06{RMI{TFNSI{{{COMPUTE HASH INDEX BY REMAINDERING
21588: {{MFI{R8{{{GET AS ONE WORD INTEGER
21589: {{WTB{R8{{{CONVERT TO BYTE OFFSET
21590: {{MOV{(SP){R10{{GET TABLE PTR AGAIN
21591: {{ADD{R8{R10{{POINT TO PROPER BUCKET
21592: {{MOV{4*TBBUK(R10){R9{{LOAD FIRST TEBLK POINTER
21593: {{BEQ{R9{(SP){TFN10{JUMP IF NO TEBLKS ON CHAIN
21594: *
21595: * LOOP THROUGH TEBLKS ON HASH CHAIN
21596: *
21597: {TFN07{MOV{R9{R7{{SAVE TEBLK POINTER
21598: {{MOV{4*TESUB(R9){R9{{LOAD SUBSCRIPT VALUE
21599: {{MOV{4*1(SP){R10{{LOAD INPUT ARGUMENT SUBSCRIPT VAL
21600: {{JSR{IDENT{{{COMPARE THEM
21601: {{PPM{TFN08{{{JUMP IF EQUAL (IDENT)
21602: *
21603: * HERE IF NO MATCH WITH THAT TEBLK
21604: *
21605: {{MOV{R7{R10{{RESTORE TEBLK POINTER
21606: {{MOV{4*TENXT(R10){R9{{POINT TO NEXT TEBLK ON CHAIN
21607: {{BNE{R9{(SP){TFN07{JUMP IF THERE IS ONE
21608: *
21609: * HERE IF NO MATCH WITH ANY TEBLK ON CHAIN
21610: *
21611: {{MOV{#4*TENXT{R8{{SET OFFSET TO LINK FIELD (XL BASE)
21612: {{BRN{TFN11{{{JUMP TO MERGE
21613: {{EJC{{{{
21614: *
21615: * TFIND (CONTINUED)
21616: *
21617: * HERE WE HAVE FOUND A MATCHING ELEMENT
21618: *
21619: {TFN08{MOV{R7{R10{{RESTORE TEBLK POINTER
21620: {{MOV{#4*TEVAL{R6{{SET TEBLK NAME OFFSET
21621: {{MOV{4*2(SP){R7{{RESTORE NAME/VALUE INDICATOR
21622: {{BNZ{R7{TFN09{{JUMP IF CALLED BY NAME
21623: {{JSR{ACESS{{{ELSE GET VALUE
21624: {{PPM{TFN12{{{JUMP IF REFERENCE FAILS
21625: {{ZER{R7{{{RESTORE NAME/VALUE INDICATOR
21626: *
21627: * COMMON EXIT FOR ENTRY FOUND
21628: *
21629: {TFN09{ADD{#4*NUM03{SP{{POP STACK ENTRIES
21630: {{EXI{{{{RETURN TO TFIND CALLER
21631: *
21632: * HERE IF NO TEBLKS ON THE HASH CHAIN
21633: *
21634: {TFN10{ADD{#4*TBBUK{R8{{GET OFFSET TO BUCKET PTR
21635: {{MOV{(SP){R10{{SET TBBLK PTR AS BASE
21636: *
21637: * MERGE HERE WITH (XL,WC) BASE,OFFSET OF FINAL LINK
21638: *
21639: {TFN11{MOV{(SP){R9{{TBBLK POINTER
21640: {{MOV{4*TBINV(R9){R9{{LOAD DEFAULT VALUE IN CASE
21641: {{MOV{4*2(SP){R7{{LOAD NAME/VALUE INDICATOR
21642: {{BZE{R7{TFN09{{EXIT WITH DEFAULT IF VALUE CALL
21643: *
21644: * HERE WE MUST BUILD A NEW TEBLK
21645: *
21646: {{MOV{#4*TESI${R6{{SET SIZE OF TEBLK
21647: {{JSR{ALLOC{{{ALLOCATE TEBLK
21648: {{ADD{R8{R10{{POINT TO HASH LINK
21649: {{MOV{R9{(R10){{LINK NEW TEBLK AT END OF CHAIN
21650: {{MOV{#B$TET{(R9){{STORE TYPE WORD
21651: {{MOV{#NULLS{4*TEVAL(R9){{SET NULL AS INITIAL VALUE
21652: {{MOV{(SP)+{4*TENXT(R9){{SET TBBLK PTR TO MARK END OF CHAIN
21653: {{MOV{(SP)+{4*TESUB(R9){{STORE SUBSCRIPT VALUE
21654: {{ICA{SP{{{POP PAST NAME/VALUE INDICATOR
21655: {{MOV{R9{R10{{COPY TEBLK POINTER (NAME BASE)
21656: {{MOV{#4*TEVAL{R6{{SET OFFSET
21657: {{EXI{{{{RETURN TO CALLER WITH NEW TEBLK
21658: *
21659: * ACESS FAIL RETURN
21660: *
21661: {TFN12{EXI{1{{{ALTERNATIVE RETURN
21662: {{ENP{{{{END PROCEDURE TFIND
21663: {{EJC{{{{
21664: *
21665: * TRACE -- SET/RESET A TRACE ASSOCIATION
21666: *
21667: * THIS PROCEDURE IS SHARED BY TRACE AND STOPTR TO
21668: * EITHER INITIATE OR STOP A TRACE RESPECTIVELY.
21669: *
21670: * (XL) TRBLK PTR (TRACE) OR ZERO (STOPTR)
21671: * 1(XS) FIRST ARGUMENT (NAME)
21672: * 0(XS) SECOND ARGUMENT (TRACE TYPE)
21673: * JSR TRACE CALL TO SET/RESET TRACE
21674: * PPM LOC TRANSFER LOC IF 1ST ARG IS BAD NAME
21675: * PPM LOC TRANSFER LOC IF 2ND ARG IS BAD TYPE
21676: * (XS) POPPED
21677: * (XL,XR,WA,WB,WC,IA) DESTROYED
21678: *
21679: {TRACE{PRC{N{2{{ENTRY POINT
21680: {{JSR{GTSTG{{{GET TRACE TYPE STRING
21681: {{PPM{TRC15{{{JUMP IF NOT STRING
21682: {{PLC{R9{{{ELSE POINT TO STRING
21683: {{LCH{R6{(R9){{LOAD FIRST CHARACTER
21684: {{FLC{R6{{{FOLD TO UPPER CASE
21685: {{MOV{(SP){R9{{LOAD NAME ARGUMENT
21686: {{MOV{R10{(SP){{STACK TRBLK PTR OR ZERO
21687: {{MOV{#TRTAC{R8{{SET TRTYP FOR ACCESS TRACE
21688: {{BEQ{R6{#CH$LA{TRC10{JUMP IF A (ACCESS)
21689: {{MOV{#TRTVL{R8{{SET TRTYP FOR VALUE TRACE
21690: {{BEQ{R6{#CH$LV{TRC10{JUMP IF V (VALUE)
21691: {{BZE{R6{TRC10{{JUMP IF BLANK (VALUE)
21692: *
21693: * HERE FOR L,K,F,C,R
21694: *
21695: {{BEQ{R6{#CH$LF{TRC01{JUMP IF F (FUNCTION)
21696: {{BEQ{R6{#CH$LR{TRC01{JUMP IF R (RETURN)
21697: {{BEQ{R6{#CH$LL{TRC03{JUMP IF L (LABEL)
21698: {{BEQ{R6{#CH$LK{TRC06{JUMP IF K (KEYWORD)
21699: {{BNE{R6{#CH$LC{TRC15{ELSE ERROR IF NOT C (CALL)
21700: *
21701: * HERE FOR F,C,R
21702: *
21703: {TRC01{JSR{GTNVR{{{POINT TO VRBLK FOR NAME
21704: {{PPM{TRC16{{{JUMP IF BAD NAME
21705: {{ICA{SP{{{POP STACK
21706: {{MOV{4*VRFNC(R9){R9{{POINT TO FUNCTION BLOCK
21707: {{BNE{(R9){#B$PFC{TRC17{ERROR IF NOT PROGRAM FUNCTION
21708: {{BEQ{R6{#CH$LR{TRC02{JUMP IF R (RETURN)
21709: {{EJC{{{{
21710: *
21711: * TRACE (CONTINUED)
21712: *
21713: * HERE FOR F,C TO SET/RESET CALL TRACE
21714: *
21715: {{MOV{R10{4*PFCTR(R9){{SET/RESET CALL TRACE
21716: {{BEQ{R6{#CH$LC{EXNUL{EXIT WITH NULL IF C (CALL)
21717: *
21718: * HERE FOR F,R TO SET/RESET RETURN TRACE
21719: *
21720: {TRC02{MOV{R10{4*PFRTR(R9){{SET/RESET RETURN TRACE
21721: {{EXI{{{{RETURN
21722: *
21723: * HERE FOR L TO SET/RESET LABEL TRACE
21724: *
21725: {TRC03{JSR{GTNVR{{{POINT TO VRBLK
21726: {{PPM{TRC16{{{JUMP IF BAD NAME
21727: {{MOV{4*VRLBL(R9){R10{{LOAD LABEL POINTER
21728: {{BNE{(R10){#B$TRT{TRC04{JUMP IF NO OLD TRACE
21729: {{MOV{4*TRLBL(R10){R10{{ELSE DELETE OLD TRACE ASSOCIATION
21730: *
21731: * HERE WITH OLD LABEL TRACE ASSOCIATION DELETED
21732: *
21733: {TRC04{BEQ{R10{#STNDL{TRC16{ERROR IF UNDEFINED LABEL
21734: {{MOV{(SP)+{R7{{GET TRBLK PTR AGAIN
21735: {{BZE{R7{TRC05{{JUMP IF STOPTR CASE
21736: {{MOV{R7{4*VRLBL(R9){{ELSE SET NEW TRBLK POINTER
21737: {{MOV{#B$VRT{4*VRTRA(R9){{SET LABEL TRACE ROUTINE ADDRESS
21738: {{MOV{R7{R9{{COPY TRBLK POINTER
21739: {{MOV{R10{4*TRLBL(R9){{STORE REAL LABEL IN TRBLK
21740: {{EXI{{{{RETURN
21741: *
21742: * HERE FOR STOPTR CASE FOR LABEL
21743: *
21744: {TRC05{MOV{R10{4*VRLBL(R9){{STORE LABEL PTR BACK IN VRBLK
21745: {{MOV{#B$VRG{4*VRTRA(R9){{STORE NORMAL TRANSFER ADDRESS
21746: {{EXI{{{{RETURN
21747: {{EJC{{{{
21748: *
21749: * TRACE (CONTINUED)
21750: *
21751: * HERE FOR K (KEYWORD)
21752: *
21753: {TRC06{JSR{GTNVR{{{POINT TO VRBLK
21754: {{PPM{TRC16{{{ERROR IF NOT NATURAL VAR
21755: {{BNZ{4*VRLEN(R9){TRC16{{ERROR IF NOT SYSTEM VAR
21756: {{ICA{SP{{{POP STACK
21757: {{BZE{R10{TRC07{{JUMP IF STOPTR CASE
21758: {{MOV{R9{4*TRKVR(R10){{STORE VRBLK PTR IN TRBLK FOR KTREX
21759: *
21760: * MERGE HERE WITH TRBLK SET UP IN WB (OR ZERO)
21761: *
21762: {TRC07{MOV{4*VRSVP(R9){R9{{POINT TO SVBLK
21763: {{BEQ{R9{#V$ERT{TRC08{JUMP IF ERRTYPE
21764: {{BEQ{R9{#V$STC{TRC09{JUMP IF STCOUNT
21765: {{BNE{R9{#V$FNC{TRC17{ELSE ERROR IF NOT FNCLEVEL
21766: *
21767: * FNCLEVEL
21768: *
21769: {{MOV{R10{R$FNC{{SET/RESET FNCLEVEL TRACE
21770: {{EXI{{{{RETURN
21771: *
21772: * ERRTYPE
21773: *
21774: {TRC08{MOV{R10{R$ERT{{SET/RESET ERRTYPE TRACE
21775: {{EXI{{{{RETURN
21776: *
21777: * STCOUNT
21778: *
21779: {TRC09{MOV{R10{R$STC{{SET/RESET STCOUNT TRACE
21780: {{EXI{{{{RETURN
21781: {{EJC{{{{
21782: *
21783: * TRACE (CONTINUED)
21784: *
21785: * A,V MERGE HERE WITH TRTYP VALUE IN WC
21786: *
21787: {TRC10{JSR{GTVAR{{{LOCATE VARIABLE
21788: {{PPM{TRC16{{{ERROR IF NOT APPROPRIATE NAME
21789: {{MOV{(SP)+{R7{{GET NEW TRBLK PTR AGAIN
21790: {{ADD{R10{R6{{POINT TO VARIABLE LOCATION
21791: {{MOV{R6{R9{{COPY VARIABLE POINTER
21792: *
21793: * LOOP TO SEARCH TRBLK CHAIN
21794: *
21795: {TRC11{MOV{(R9){R10{{POINT TO NEXT ENTRY
21796: {{BNE{(R10){#B$TRT{TRC13{JUMP IF NOT TRBLK
21797: {{BLT{R8{4*TRTYP(R10){TRC13{JUMP IF TOO FAR OUT ON CHAIN
21798: {{BEQ{R8{4*TRTYP(R10){TRC12{JUMP IF THIS MATCHES OUR TYPE
21799: {{ADD{#4*TRNXT{R10{{ELSE POINT TO LINK FIELD
21800: {{MOV{R10{R9{{COPY POINTER
21801: {{BRN{TRC11{{{AND LOOP BACK
21802: *
21803: * HERE TO DELETE AN OLD TRBLK OF THE TYPE WE WERE GIVEN
21804: *
21805: {TRC12{MOV{4*TRNXT(R10){R10{{GET PTR TO NEXT BLOCK OR VALUE
21806: {{MOV{R10{(R9){{STORE TO DELETE THIS TRBLK
21807: *
21808: * HERE AFTER DELETING ANY OLD ASSOCIATION OF THIS TYPE
21809: *
21810: {TRC13{BZE{R7{TRC14{{JUMP IF STOPTR CASE
21811: {{MOV{R7{(R9){{ELSE LINK NEW TRBLK IN
21812: {{MOV{R7{R9{{COPY TRBLK POINTER
21813: {{MOV{R10{4*TRNXT(R9){{STORE FORWARD POINTER
21814: {{MOV{R8{4*TRTYP(R9){{STORE APPROPRIATE TRAP TYPE CODE
21815: *
21816: * HERE TO MAKE SURE VRGET,VRSTO ARE SET PROPERLY
21817: *
21818: {TRC14{MOV{R6{R9{{RECALL POSSIBLE VRBLK POINTER
21819: {{SUB{#4*VRVAL{R9{{POINT BACK TO VRBLK
21820: {{JSR{SETVR{{{SET FIELDS IF VRBLK
21821: {{EXI{{{{RETURN
21822: *
21823: * HERE FOR BAD TRACE TYPE
21824: *
21825: {TRC15{EXI{2{{{TAKE BAD TRACE TYPE ERROR EXIT
21826: *
21827: * POP STACK BEFORE FAILING
21828: *
21829: {TRC16{ICA{SP{{{POP STACK
21830: *
21831: * HERE FOR BAD NAME ARGUMENT
21832: *
21833: {TRC17{EXI{1{{{TAKE BAD NAME ERROR EXIT
21834: {{ENP{{{{END PROCEDURE TRACE
21835: {{EJC{{{{
21836: *
21837: * TRBLD -- BUILD TRBLK
21838: *
21839: * TRBLK IS USED BY THE INPUT, OUTPUT AND TRACE FUNCTIONS
21840: * TO CONSTRUCT A TRBLK (TRAP BLOCK)
21841: *
21842: * (XR) TRTAG OR TRTER
21843: * (XL) TRFNC OR TRFPT
21844: * (WB) TRTYP
21845: * JSR TRBLD CALL TO BUILD TRBLK
21846: * (XR) POINTER TO TRBLK
21847: * (WA) DESTROYED
21848: *
21849: {TRBLD{PRC{E{0{{ENTRY POINT
21850: {{MOV{R9{-(SP){{STACK TRTAG (OR TRFNM)
21851: {{MOV{#4*TRSI${R6{{SET SIZE OF TRBLK
21852: {{JSR{ALLOC{{{ALLOCATE TRBLK
21853: {{MOV{#B$TRT{(R9){{STORE FIRST WORD
21854: {{MOV{R10{4*TRFNC(R9){{STORE TRFNC (OR TRFPT)
21855: {{MOV{(SP)+{4*TRTAG(R9){{STORE TRTAG (OR TRFNM)
21856: {{MOV{R7{4*TRTYP(R9){{STORE TYPE
21857: {{MOV{#NULLS{4*TRVAL(R9){{FOR NOW, A NULL VALUE
21858: {{EXI{{{{RETURN TO CALLER
21859: {{ENP{{{{END PROCEDURE TRBLD
21860: {{EJC{{{{
21861: *
21862: * TRIMR -- TRIM TRAILING BLANKS
21863: *
21864: * TRIMR IS PASSED A POINTER TO AN SCBLK WHICH MUST BE THE
21865: * LAST BLOCK IN DYNAMIC STORAGE. TRAILING BLANKS ARE
21866: * TRIMMED OFF AND THE DYNAMIC STORAGE POINTER RESET TO
21867: * THE END OF THE (POSSIBLY) SHORTENED BLOCK.
21868: *
21869: * (WB) NON-ZERO TO TRIM TRAILING BLANKS
21870: * (XR) POINTER TO STRING TO TRIM
21871: * JSR TRIMR CALL TO TRIM STRING
21872: * (XR) POINTER TO TRIMMED STRING
21873: * (XL,WA,WB,WC) DESTROYED
21874: *
21875: * THE CALL WITH WB ZERO STILL PERFORMS THE END ZERO PAD
21876: * AND DNAMP READJUSTMENT. IT IS USED FROM ACESS IF KVTRM=0.
21877: *
21878: {TRIMR{PRC{E{0{{ENTRY POINT
21879: {{MOV{R9{R10{{COPY STRING POINTER
21880: {{MOV{4*SCLEN(R9){R6{{LOAD STRING LENGTH
21881: {{BZE{R6{TRIM2{{JUMP IF NULL INPUT
21882: {{PLC{R10{R6{{ELSE POINT PAST LAST CHARACTER
21883: {{BZE{R7{TRIM3{{JUMP IF NO TRIM
21884: {{MOV{#CH$BL{R8{{LOAD BLANK CHARACTER
21885: *
21886: * LOOP THROUGH CHARACTERS FROM RIGHT TO LEFT
21887: *
21888: {TRIM0{LCH{R7{-(R10){{LOAD NEXT CHARACTER
21889: {{BEQ{R7{#CH$HT{TRIM1{JUMP IF HORIZONTAL TAB
21890: {{BNE{R7{R8{TRIM3{JUMP IF NON-BLANK FOUND
21891: {TRIM1{DCV{R6{{{ELSE DECREMENT CHARACTER COUNT
21892: {{BNZ{R6{TRIM0{{LOOP BACK IF MORE TO CHECK
21893: *
21894: * HERE IF RESULT IS NULL (NULL OR ALL-BLANK INPUT)
21895: *
21896: {TRIM2{MOV{R9{DNAMP{{WIPE OUT INPUT STRING BLOCK
21897: {{MOV{#NULLS{R9{{LOAD NULL RESULT
21898: {{BRN{TRIM5{{{MERGE TO EXIT
21899: {{EJC{{{{
21900: *
21901: * TRIMR (CONTINUED)
21902: *
21903: * HERE WITH NON-BLANK FOUND (MERGE FOR NO TRIM)
21904: *
21905: {TRIM3{MOV{R6{4*SCLEN(R9){{SET NEW LENGTH
21906: {{MOV{R9{R10{{COPY STRING POINTER
21907: {{PSC{R10{R6{{READY FOR STORING BLANKS
21908: {{CTB{R6{SCHAR{{GET LENGTH OF BLOCK IN BYTES
21909: {{ADD{R9{R6{{POINT PAST NEW BLOCK
21910: {{MOV{R6{DNAMP{{SET NEW TOP OF STORAGE POINTER
21911: {{LCT{R6{#CFP$C{{GET COUNT OF CHARS IN WORD
21912: {{ZER{R8{{{SET BLANK CHAR
21913: *
21914: * LOOP TO ZERO PAD LAST WORD OF CHARACTERS
21915: *
21916: {TRIM4{SCH{R8{(R10)+{{STORE ZERO CHARACTER
21917: {{BCT{R6{TRIM4{{LOOP BACK TILL ALL STORED
21918: {{CSC{R10{{{COMPLETE STORE CHARACTERS
21919: *
21920: * COMMON EXIT POINT
21921: *
21922: {TRIM5{ZER{R10{{{CLEAR GARBAGE XL POINTER
21923: {{EXI{{{{RETURN TO CALLER
21924: {{ENP{{{{END PROCEDURE TRIMR
21925: {{EJC{{{{
21926: *
21927: * TRXEQ -- EXECUTE FUNCTION TYPE TRACE
21928: *
21929: * TRXEQ IS USED TO EXECUTE A TRACE WHEN A FOURTH ARGUMENT
21930: * HAS BEEN SUPPLIED. TRACE HAS ALREADY BEEN DECREMENTED.
21931: *
21932: * (XR) POINTER TO TRBLK
21933: * (XL,WA) NAME BASE,OFFSET FOR VARIABLE
21934: * JSR TRXEQ CALL TO EXECUTE TRACE
21935: * (WB,WC,RA) DESTROYED
21936: *
21937: * THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING
21938: * CONTROL TO THE TRACE FUNCTION USING THE CFUNC ROUTINE.
21939: *
21940: * TRXEQ RETURN POINT WORD(S)
21941: * SAVED VALUE OF TRACE KEYWORD
21942: * TRBLK POINTER
21943: * NAME BASE
21944: * NAME OFFSET
21945: * SAVED VALUE OF R$COD
21946: * SAVED CODE PTR (-R$COD)
21947: * SAVED VALUE OF FLPTR
21948: * FLPTR --------------- ZERO (DUMMY FAIL OFFSET)
21949: * NMBLK FOR VARIABLE NAME
21950: * XS ------------------ TRACE TAG
21951: *
21952: * R$COD AND THE CODE PTR ARE SET TO DUMMY VALUES WHICH
21953: * CAUSE CONTROL TO RETURN TO THE TRXEQ PROCEDURE ON SUCCESS
21954: * OR FAILURE (TRXEQ IGNORES A FAILURE CONDITION).
21955: *
21956: {TRXEQ{PRC{R{0{{ENTRY POINT (RECURSIVE)
21957: {{MOV{R$COD{R8{{LOAD CODE BLOCK POINTER
21958: {{SCP{R7{{{GET CURRENT CODE POINTER
21959: {{SUB{R8{R7{{MAKE CODE POINTER INTO OFFSET
21960: {{MOV{KVTRA{-(SP){{STACK TRACE KEYWORD VALUE
21961: {{MOV{R9{-(SP){{STACK TRBLK POINTER
21962: {{MOV{R10{-(SP){{STACK NAME BASE
21963: {{MOV{R6{-(SP){{STACK NAME OFFSET
21964: {{MOV{R8{-(SP){{STACK CODE BLOCK POINTER
21965: {{MOV{R7{-(SP){{STACK CODE POINTER OFFSET
21966: {{MOV{FLPTR{-(SP){{STACK OLD FAILURE POINTER
21967: {{ZER{-(SP){{{SET DUMMY FAIL OFFSET
21968: {{MOV{SP{FLPTR{{SET NEW FAILURE POINTER
21969: {{ZER{KVTRA{{{RESET TRACE KEYWORD TO ZERO
21970: {{MOV{#TRXDC{R8{{LOAD NEW (DUMMY) CODE BLK POINTER
21971: {{MOV{R8{R$COD{{SET AS CODE BLOCK POINTER
21972: {{LCP{R8{{{AND NEW CODE POINTER
21973: {{EJC{{{{
21974: *
21975: * TRXEQ (CONTINUED)
21976: *
21977: * NOW PREPARE ARGUMENTS FOR FUNCTION
21978: *
21979: {{MOV{R6{R7{{SAVE NAME OFFSET
21980: {{MOV{#4*NMSI${R6{{LOAD NMBLK SIZE
21981: {{JSR{ALLOC{{{ALLOCATE SPACE FOR NMBLK
21982: {{MOV{#B$NML{(R9){{SET TYPE WORD
21983: {{MOV{R10{4*NMBAS(R9){{STORE NAME BASE
21984: {{MOV{R7{4*NMOFS(R9){{STORE NAME OFFSET
21985: {{MOV{4*6(SP){R10{{RELOAD POINTER TO TRBLK
21986: {{MOV{R9{-(SP){{STACK NMBLK POINTER (1ST ARGUMENT)
21987: {{MOV{4*TRTAG(R10){-(SP){{STACK TRACE TAG (2ND ARGUMENT)
21988: {{MOV{4*TRFNC(R10){R10{{LOAD TRACE FUNCTION POINTER
21989: {{MOV{#NUM02{R6{{SET NUMBER OF ARGUMENTS TO TWO
21990: {{BRN{CFUNC{{{JUMP TO CALL FUNCTION
21991: *
21992: * SEE O$TXR FOR DETAILS OF RETURN TO THIS POINT
21993: *
21994: {TRXQ1{MOV{FLPTR{SP{{POINT BACK TO OUR STACK ENTRIES
21995: {{ICA{SP{{{POP OFF GARBAGE FAIL OFFSET
21996: {{MOV{(SP)+{FLPTR{{RESTORE OLD FAILURE POINTER
21997: {{MOV{(SP)+{R7{{RELOAD CODE OFFSET
21998: {{MOV{(SP)+{R8{{LOAD OLD CODE BASE POINTER
21999: {{MOV{R8{R9{{COPY CDBLK POINTER
22000: {{MOV{4*CDSTM(R9){KVSTN{{RESTORE STMNT NO
22001: {{MOV{(SP)+{R6{{RELOAD NAME OFFSET
22002: {{MOV{(SP)+{R10{{RELOAD NAME BASE
22003: {{MOV{(SP)+{R9{{RELOAD TRBLK POINTER
22004: {{MOV{(SP)+{KVTRA{{RESTORE TRACE KEYWORD VALUE
22005: {{ADD{R8{R7{{RECOMPUTE ABSOLUTE CODE POINTER
22006: {{LCP{R7{{{RESTORE CODE POINTER
22007: {{MOV{R8{R$COD{{AND CODE BLOCK POINTER
22008: {{EXI{{{{RETURN TO TRXEQ CALLER
22009: {{ENP{{{{END PROCEDURE TRXEQ
22010: {{EJC{{{{
22011: *
22012: * XSCAN -- EXECUTION FUNCTION ARGUMENT SCAN
22013: *
22014: * XSCAN SCANS OUT ONE TOKEN IN A PROTOTYPE ARGUMENT IN
22015: * ARRAY,CLEAR,DATA,DEFINE,LOAD FUNCTION CALLS. XSCAN
22016: * CALLS MUST BE PRECEDED BY A CALL TO THE INITIALIZATION
22017: * PROCEDURE XSCNI. THE FOLLOWING VARIABLES ARE USED.
22018: *
22019: * R$XSC POINTER TO SCBLK FOR FUNCTION ARG
22020: * XSOFS OFFSET (NUM CHARS SCANNED SO FAR)
22021: *
22022: * (WC) DELIMITER ONE (CH$XX)
22023: * (XL) DELIMITER TWO (CH$XX)
22024: * JSR XSCAN CALL TO SCAN NEXT ITEM
22025: * (XR) POINTER TO SCBLK FOR TOKEN SCANNED
22026: * (WA) COMPLETION CODE (SEE BELOW)
22027: * (WC,XL) DESTROYED
22028: *
22029: * THE SCAN STARTS FROM THE CURRENT POSITION AND CONTINUES
22030: * UNTIL ONE OF THE FOLLOWING THREE CONDITIONS OCCURS.
22031: *
22032: * 1) DELIMITER ONE IS ENCOUNTERED (WA SET TO 1)
22033: *
22034: * 2) DELIMITER TWO ENCOUNTERED (WA SET TO 2)
22035: *
22036: * 3) END OF STRING ENCOUNTERED (WA SET TO 0)
22037: *
22038: * THE RESULT IS A STRING CONTAINING ALL CHARACTERS SCANNED
22039: * UP TO BUT NOT INCLUDING ANY DELIMITER CHARACTER.
22040: * THE POINTER IS LEFT POINTING PAST THE DELIMITER.
22041: *
22042: * IF ONLY ONE DELIMITER IS TO BE DETECTED, DELIMITER ONE
22043: * AND DELIMITER TWO SHOULD BE SET TO THE SAME VALUE.
22044: *
22045: * IN THE CASE WHERE THE END OF STRING IS ENCOUNTERED, THE
22046: * STRING INCLUDES ALL THE CHARACTERS TO THE END OF THE
22047: * STRING. NO FURTHER CALLS CAN BE MADE TO XSCAN UNTIL
22048: * XSCNI IS CALLED TO INITIALIZE A NEW ARGUMENT SCAN
22049: {{EJC{{{{
22050: *
22051: * XSCAN (CONTINUED)
22052: *
22053: {XSCAN{PRC{E{0{{ENTRY POINT
22054: {{MOV{R7{XSCWB{{PRESERVE WB
22055: {{MOV{R$XSC{R9{{POINT TO ARGUMENT STRING
22056: {{MOV{4*SCLEN(R9){R6{{LOAD STRING LENGTH
22057: {{MOV{XSOFS{R7{{LOAD CURRENT OFFSET
22058: {{SUB{R7{R6{{GET NUMBER OF REMAINING CHARACTERS
22059: {{BZE{R6{XSCN2{{JUMP IF NO CHARACTERS LEFT
22060: {{PLC{R9{R7{{POINT TO CURRENT CHARACTER
22061: *
22062: * LOOP TO SEARCH FOR DELIMITER
22063: *
22064: {XSCN1{LCH{R7{(R9)+{{LOAD NEXT CHARACTER
22065: {{BEQ{R7{R8{XSCN3{JUMP IF DELIMITER ONE FOUND
22066: {{BEQ{R7{R10{XSCN4{JUMP IF DELIMITER TWO FOUND
22067: {{DCV{R6{{{DECREMENT COUNT OF CHARS LEFT
22068: {{BNZ{R6{XSCN1{{LOOP BACK IF MORE CHARS TO GO
22069: *
22070: * HERE FOR RUNOUT
22071: *
22072: {XSCN2{MOV{R$XSC{R10{{POINT TO STRING BLOCK
22073: {{MOV{4*SCLEN(R10){R6{{GET STRING LENGTH
22074: {{MOV{XSOFS{R7{{LOAD OFFSET
22075: {{SUB{R7{R6{{GET SUBSTRING LENGTH
22076: {{ZER{R$XSC{{{CLEAR STRING PTR FOR COLLECTOR
22077: {{ZER{XSCRT{{{SET ZERO (RUNOUT) RETURN CODE
22078: {{BRN{XSCN6{{{JUMP TO EXIT
22079: {{EJC{{{{
22080: *
22081: * XSCAN (CONTINUED)
22082: *
22083: * HERE IF DELIMITER ONE FOUND
22084: *
22085: {XSCN3{MOV{#NUM01{XSCRT{{SET RETURN CODE
22086: {{BRN{XSCN5{{{JUMP TO MERGE
22087: *
22088: * HERE IF DELIMITER TWO FOUND
22089: *
22090: {XSCN4{MOV{#NUM02{XSCRT{{SET RETURN CODE
22091: *
22092: * MERGE HERE AFTER DETECTING A DELIMITER
22093: *
22094: {XSCN5{MOV{R$XSC{R10{{RELOAD POINTER TO STRING
22095: {{MOV{4*SCLEN(R10){R8{{GET ORIGINAL LENGTH OF STRING
22096: {{SUB{R6{R8{{MINUS CHARS LEFT = CHARS SCANNED
22097: {{MOV{R8{R6{{MOVE TO REG FOR SBSTR
22098: {{MOV{XSOFS{R7{{SET OFFSET
22099: {{SUB{R7{R6{{COMPUTE LENGTH FOR SBSTR
22100: {{ICV{R8{{{ADJUST NEW CURSOR PAST DELIMITER
22101: {{MOV{R8{XSOFS{{STORE NEW OFFSET
22102: *
22103: * COMMON EXIT POINT
22104: *
22105: {XSCN6{ZER{R9{{{CLEAR GARBAGE CHARACTER PTR IN XR
22106: {{JSR{SBSTR{{{BUILD SUB-STRING
22107: {{MOV{XSCRT{R6{{LOAD RETURN CODE
22108: {{MOV{XSCWB{R7{{RESTORE WB
22109: {{EXI{{{{RETURN TO XSCAN CALLER
22110: {{ENP{{{{END PROCEDURE XSCAN
22111: {{EJC{{{{
22112: *
22113: * XSCNI -- EXECUTION FUNCTION ARGUMENT SCAN
22114: *
22115: * XSCNI INITIALIZES THE SCAN USED FOR PROTOTYPE ARGUMENTS
22116: * IN THE CLEAR, DEFINE, LOAD, DATA, ARRAY FUNCTIONS. SEE
22117: * XSCAN FOR THE PROCEDURE WHICH IS USED AFTER THIS CALL.
22118: *
22119: * -(XS) ARGUMENT TO BE SCANNED (ON STACK)
22120: * JSR XSCNI CALL TO SCAN ARGUMENT
22121: * PPM LOC TRANSFER LOC IF ARG IS NOT STRING
22122: * PPM LOC TRANSFER LOC IF ARGUMENT IS NULL
22123: * (XS) POPPED
22124: * (XR,R$XSC) ARGUMENT (SCBLK PTR)
22125: * (WA) ARGUMENT LENGTH
22126: * (IA,RA) DESTROYED
22127: *
22128: {XSCNI{PRC{N{2{{ENTRY POINT
22129: {{JSR{GTSTG{{{FETCH ARGUMENT AS STRING
22130: {{PPM{XSCI1{{{JUMP IF NOT CONVERTIBLE
22131: {{MOV{R9{R$XSC{{ELSE STORE SCBLK PTR FOR XSCAN
22132: {{ZER{XSOFS{{{SET OFFSET TO ZERO
22133: {{BZE{R6{XSCI2{{JUMP IF NULL STRING
22134: {{EXI{{{{RETURN TO XSCNI CALLER
22135: *
22136: * HERE IF ARGUMENT IS NOT A STRING
22137: *
22138: {XSCI1{EXI{1{{{TAKE NOT-STRING ERROR EXIT
22139: *
22140: * HERE FOR NULL STRING
22141: *
22142: {XSCI2{EXI{2{{{TAKE NULL-STRING ERROR EXIT
22143: {{ENP{{{{END PROCEDURE XSCNI
22144: {{TTL{S{{{P I T B O L -- UTILITY ROUTINES
22145: *
22146: * THE FOLLOWING SECTION CONTAINS UTILITY ROUTINES USED FOR
22147: * VARIOUS PURPOSES THROUGHOUT THE SYSTEM. THESE DIFFER
22148: * FROM THE PROCEDURES IN THE UTILITY PROCEDURES SECTION IN
22149: * THEY ARE NOT IN PROCEDURE FORM AND THEY DO NOT RETURN
22150: * TO THEIR CALLERS. THEY ARE ACCESSED WITH A BRANCH TYPE
22151: * INSTRUCTION AFTER SETTING THE REGISTERS TO APPROPRIATE
22152: * PARAMETER VALUES.
22153: *
22154: * THE REGISTER VALUES REQUIRED FOR EACH ROUTINE ARE
22155: * DOCUMENTED AT THE START OF EACH ROUTINE. REGISTERS NOT
22156: * MENTIONED MAY CONTAIN ANY VALUES EXCEPT THAT XR,XL
22157: * CAN ONLY CONTAIN PROPER COLLECTABLE POINTERS.
22158: *
22159: * SOME OF THESE ROUTINES WILL TOLERATE GARBAGE POINTERS
22160: * IN XL,XR ON ENTRY. THIS IS ALWAYS DOCUMENTED AND IN
22161: * EACH CASE, THE ROUTINE CLEARS THESE GARBAGE VALUES BEFORE
22162: * EXITING AFTER COMPLETING ITS TASK.
22163: *
22164: * THE ROUTINES HAVE NAMES CONSISTING OF FIVE LETTERS
22165: * AND ARE ASSEMBLED IN ALPHABETICAL ORDER.
22166: {{EJC{{{{
22167: * ARREF -- ARRAY REFERENCE
22168: *
22169: * (XL) MAY BE NON-COLLECTABLE
22170: * (XR) NUMBER OF SUBSCRIPTS
22171: * (WB) SET ZERO/NONZERO FOR VALUE/NAME
22172: * THE VALUE IN WB MUST BE COLLECTABLE
22173: * STACK SUBSCRIPTS AND ARRAY OPERAND
22174: * BRN ARREF JUMP TO CALL FUNCTION
22175: *
22176: * ARREF CONTINUES BY EXECUTING THE NEXT CODE WORD WITH
22177: * THE RESULT NAME OR VALUE PLACED ON TOP OF THE STACK.
22178: * TO DEAL WITH THE PROBLEM OF ACCESSING SUBSCRIPTS IN THE
22179: * ORDER OF STACKING, XL IS USED AS A SUBSCRIPT POINTER
22180: * WORKING BELOW THE STACK POINTER.
22181: *
22182: {ARREF{RTN{{{{
22183: {{MOV{R9{R6{{COPY NUMBER OF SUBSCRIPTS
22184: {{MOV{SP{R10{{POINT TO STACK FRONT
22185: {{WTB{R9{{{CONVERT TO BYTE OFFSET
22186: {{ADD{R9{R10{{POINT TO ARRAY OPERAND ON STACK
22187: {{ICA{R10{{{FINAL VALUE FOR STACK POPPING
22188: {{MOV{R10{ARFXS{{KEEP FOR LATER
22189: {{MOV{-(R10){R9{{LOAD ARRAY OPERAND POINTER
22190: {{MOV{R9{R$ARF{{KEEP ARRAY POINTER
22191: {{MOV{R10{R9{{SAVE POINTER TO SUBSCRIPTS
22192: {{MOV{R$ARF{R10{{POINT XL TO POSSIBLE VCBLK OR TBBLK
22193: {{MOV{(R10){R8{{LOAD FIRST WORD
22194: {{BEQ{R8{#B$ART{ARF01{JUMP IF ARBLK
22195: {{BEQ{R8{#B$VCT{ARF07{JUMP IF VCBLK
22196: {{BEQ{R8{#B$TBT{ARF10{JUMP IF TBBLK
22197: {{ERB{235{SUBSCRIPTED{{OPERAND IS NOT TABLE OR ARRAY
22198: *
22199: * HERE FOR ARRAY (ARBLK)
22200: *
22201: {ARF01{BNE{R6{4*ARNDM(R10){ARF09{JUMP IF WRONG NUMBER OF DIMS
22202: {{LDI{INTV0{{{GET INITIAL SUBSCRIPT OF ZERO
22203: {{MOV{R9{R10{{POINT BEFORE SUBSCRIPTS
22204: {{ZER{R6{{{INITIAL OFFSET TO BOUNDS
22205: {{BRN{ARF03{{{JUMP INTO LOOP
22206: *
22207: * LOOP TO COMPUTE SUBSCRIPTS BY MULTIPLICATIONS
22208: *
22209: {ARF02{MLI{4*ARDM2(R9){{{MULTIPLY TOTAL BY NEXT DIMENSION
22210: *
22211: * MERGE HERE FIRST TIME
22212: *
22213: {ARF03{MOV{-(R10){R9{{LOAD NEXT SUBSCRIPT
22214: {{STI{ARFSI{{{SAVE CURRENT SUBSCRIPT
22215: {{LDI{4*ICVAL(R9){{{LOAD INTEGER VALUE IN CASE
22216: {{BEQ{(R9){#B$ICL{ARF04{JUMP IF IT WAS AN INTEGER
22217: {{EJC{{{{
22218: *
22219: * ARREF (CONTINUED)
22220: *
22221: *
22222: {{JSR{GTINT{{{CONVERT TO INTEGER
22223: {{PPM{ARF12{{{JUMP IF NOT INTEGER
22224: {{LDI{4*ICVAL(R9){{{IF OK, LOAD INTEGER VALUE
22225: *
22226: * HERE WITH INTEGER SUBSCRIPT IN (IA)
22227: *
22228: {ARF04{MOV{R$ARF{R9{{POINT TO ARRAY
22229: {{ADD{R6{R9{{OFFSET TO NEXT BOUNDS
22230: {{SBI{4*ARLBD(R9){{{SUBTRACT LOW BOUND TO COMPARE
22231: {{IOV{ARF13{{{OUT OF RANGE FAIL IF OVERFLOW
22232: {{ILT{ARF13{{{OUT OF RANGE FAIL IF TOO SMALL
22233: {{SBI{4*ARDIM(R9){{{SUBTRACT DIMENSION
22234: {{IGE{ARF13{{{OUT OF RANGE FAIL IF TOO LARGE
22235: {{ADI{4*ARDIM(R9){{{ELSE RESTORE SUBSCRIPT OFFSET
22236: {{ADI{ARFSI{{{ADD TO CURRENT TOTAL
22237: {{ADD{#4*ARDMS{R6{{POINT TO NEXT BOUNDS
22238: {{BNE{R10{SP{ARF02{LOOP BACK IF MORE TO GO
22239: *
22240: * HERE WITH INTEGER SUBSCRIPT COMPUTED
22241: *
22242: {{MFI{R6{{{GET AS ONE WORD INTEGER
22243: {{WTB{R6{{{CONVERT TO OFFSET
22244: {{MOV{R$ARF{R10{{POINT TO ARBLK
22245: {{ADD{4*AROFS(R10){R6{{ADD OFFSET PAST BOUNDS
22246: {{ICA{R6{{{ADJUST FOR ARPRO FIELD
22247: {{BNZ{R7{ARF08{{EXIT WITH NAME IF NAME CALL
22248: *
22249: * MERGE HERE TO GET VALUE FOR VALUE CALL
22250: *
22251: {ARF05{JSR{ACESS{{{GET VALUE
22252: {{PPM{ARF13{{{FAIL IF ACESS FAILS
22253: *
22254: * RETURN VALUE
22255: *
22256: {ARF06{MOV{ARFXS{SP{{POP STACK ENTRIES
22257: {{ZER{R$ARF{{{FINISHED WITH ARRAY POINTER
22258: {{BRN{EXIXR{{{EXIT WITH VALUE IN XR
22259: {{EJC{{{{
22260: *
22261: * ARREF (CONTINUED)
22262: *
22263: * HERE FOR VECTOR
22264: *
22265: {ARF07{BNE{R6{#NUM01{ARF09{ERROR IF MORE THAN 1 SUBSCRIPT
22266: {{MOV{(SP){R9{{ELSE LOAD SUBSCRIPT
22267: {{JSR{GTINT{{{CONVERT TO INTEGER
22268: {{PPM{ARF12{{{ERROR IF NOT INTEGER
22269: {{LDI{4*ICVAL(R9){{{ELSE LOAD INTEGER VALUE
22270: {{SBI{INTV1{{{SUBTRACT FOR ONES OFFSET
22271: {{MFI{R6{ARF13{{GET SUBSCRIPT AS ONE WORD
22272: {{ADD{#VCVLS{R6{{ADD OFFSET FOR STANDARD FIELDS
22273: {{WTB{R6{{{CONVERT OFFSET TO BYTES
22274: {{BGE{R6{4*VCLEN(R10){ARF13{FAIL IF OUT OF RANGE SUBSCRIPT
22275: {{BZE{R7{ARF05{{BACK TO GET VALUE IF VALUE CALL
22276: *
22277: * RETURN NAME
22278: *
22279: {ARF08{MOV{ARFXS{SP{{POP STACK ENTRIES
22280: {{ZER{R$ARF{{{FINISHED WITH ARRAY POINTER
22281: {{BRN{EXNAM{{{ELSE EXIT WITH NAME
22282: *
22283: * HERE IF SUBSCRIPT COUNT IS WRONG
22284: *
22285: {ARF09{ERB{236{ARRAY{{REFERENCED WITH WRONG NUMBER OF SUBSCRIPTS
22286: *
22287: * TABLE
22288: *
22289: {ARF10{BNE{R6{#NUM01{ARF11{ERROR IF MORE THAN 1 SUBSCRIPT
22290: {{MOV{(SP){R9{{ELSE LOAD SUBSCRIPT
22291: {{JSR{TFIND{{{CALL TABLE SEARCH ROUTINE
22292: {{PPM{ARF13{{{FAIL IF FAILED
22293: {{BNZ{R7{ARF08{{EXIT WITH NAME IF NAME CALL
22294: {{BRN{ARF06{{{ELSE EXIT WITH VALUE
22295: *
22296: * HERE FOR BAD TABLE REFERENCE
22297: *
22298: {ARF11{ERB{237{TABLE{{REFERENCED WITH MORE THAN ONE SUBSCRIPT
22299: *
22300: * HERE FOR BAD SUBSCRIPT
22301: *
22302: {ARF12{ERB{238{ARRAY{{SUBSCRIPT IS NOT INTEGER
22303: *
22304: * HERE TO SIGNAL FAILURE
22305: *
22306: {ARF13{ZER{R$ARF{{{FINISHED WITH ARRAY POINTER
22307: {{BRN{EXFAL{{{FAIL
22308: {{EJC{{{{
22309: *
22310: * CFUNC -- CALL A FUNCTION
22311: *
22312: * CFUNC IS USED TO CALL A SNOBOL LEVEL FUNCTION. IT IS
22313: * USED BY THE APPLY FUNCTION (S$APP), THE FUNCTION
22314: * TRACE ROUTINE (TRXEQ) AND THE MAIN FUNCTION CALL ENTRY
22315: * (O$FNC, O$FNS). IN THE LATTER CASES, CFUNC IS USED ONLY
22316: * IF THE NUMBER OF ARGUMENTS IS INCORRECT.
22317: *
22318: * (XL) POINTER TO FUNCTION BLOCK
22319: * (WA) ACTUAL NUMBER OF ARGUMENTS
22320: * (XS) POINTS TO STACKED ARGUMENTS
22321: * BRN CFUNC JUMP TO CALL FUNCTION
22322: *
22323: * CFUNC CONTINUES BY EXECUTING THE FUNCTION
22324: *
22325: {CFUNC{RTN{{{{
22326: {{BLT{R6{4*FARGS(R10){CFNC1{JUMP IF TOO FEW ARGUMENTS
22327: {{BEQ{R6{4*FARGS(R10){CFNC3{JUMP IF CORRECT NUMBER OF ARGS
22328: *
22329: * HERE IF TOO MANY ARGUMENTS SUPPLIED, POP THEM OFF
22330: *
22331: {{MOV{R6{R7{{COPY ACTUAL NUMBER
22332: {{SUB{4*FARGS(R10){R7{{GET NUMBER OF EXTRA ARGS
22333: {{WTB{R7{{{CONVERT TO BYTES
22334: {{ADD{R7{SP{{POP OFF UNWANTED ARGUMENTS
22335: {{BRN{CFNC3{{{JUMP TO GO OFF TO FUNCTION
22336: *
22337: * HERE IF TOO FEW ARGUMENTS
22338: *
22339: {CFNC1{MOV{4*FARGS(R10){R7{{LOAD REQUIRED NUMBER OF ARGUMENTS
22340: {{BEQ{R7{#NINI9{CFNC3{JUMP IF CASE OF VAR NUM OF ARGS
22341: {{SUB{R6{R7{{CALCULATE NUMBER MISSING
22342: {{LCT{R7{R7{{SET COUNTER TO CONTROL LOOP
22343: *
22344: * LOOP TO SUPPLY EXTRA NULL ARGUMENTS
22345: *
22346: {CFNC2{MOV{#NULLS{-(SP){{STACK A NULL ARGUMENT
22347: {{BCT{R7{CFNC2{{LOOP TILL PROPER NUMBER STACKED
22348: *
22349: * MERGE HERE TO JUMP TO FUNCTION
22350: *
22351: {CFNC3{BRI{(R10){{{JUMP THROUGH FCODE FIELD
22352: {{EJC{{{{
22353: *
22354: * EXFAL -- EXIT SIGNALLING SNOBOL FAILURE
22355: *
22356: * (XL,XR) MAY BE NON-COLLECTABLE
22357: * BRN EXFAL JUMP TO FAIL
22358: *
22359: * EXFAL CONTINUES BY EXECUTING THE APPROPRIATE FAIL GOTO
22360: *
22361: {EXFAL{RTN{{{{
22362: {{MOV{FLPTR{SP{{POP STACK
22363: {{MOV{(SP){R9{{LOAD FAILURE OFFSET
22364: {{ADD{R$COD{R9{{POINT TO FAILURE CODE LOCATION
22365: {{LCP{R9{{{SET CODE POINTER
22366: {{BRN{EXITS{{{DO NEXT CODE WORD
22367: {{EJC{{{{
22368: *
22369: * EXINT -- EXIT WITH INTEGER RESULT
22370: *
22371: * (XL,XR) MAY BE NONCOLLECTABLE
22372: * (IA) INTEGER VALUE
22373: * BRN EXINT JUMP TO EXIT WITH INTEGER
22374: *
22375: * EXINT CONTINUES BY EXECUTING THE NEXT CODE WORD
22376: * WHICH IT DOES BY FALLING THROUGH TO EXIXR
22377: *
22378: {EXINT{RTN{{{{
22379: {{JSR{ICBLD{{{BUILD ICBLK
22380: {{EJC{{{{
22381: * EXIXR -- EXIT WITH RESULT IN (XR)
22382: *
22383: * (XR) RESULT
22384: * (XL) MAY BE NON-COLLECTABLE
22385: * BRN EXIXR JUMP TO EXIT WITH RESULT IN (XR)
22386: *
22387: * EXIXR CONTINUES BY EXECUTING THE NEXT CODE WORD
22388: * WHICH IT DOES BY FALLING THROUGH TO EXITS.
22389: {EXIXR{RTN{{{{
22390: *
22391: {{MOV{R9{-(SP){{STACK RESULT
22392: *
22393: *
22394: * EXITS -- EXIT WITH RESULT IF ANY STACKED
22395: *
22396: * (XR,XL) MAY BE NON-COLLECTABLE
22397: *
22398: * BRN EXITS ENTER EXITS ROUTINE
22399: *
22400: {EXITS{RTN{{{{
22401: {{LCW{R9{{{LOAD NEXT CODE WORD
22402: {{MOV{(R9){R10{{LOAD ENTRY ADDRESS
22403: {{BRI{R10{{{JUMP TO EXECUTE NEXT CODE WORD
22404: {{EJC{{{{
22405: *
22406: * EXNAM -- EXIT WITH NAME IN (XL,WA)
22407: *
22408: * (XL) NAME BASE
22409: * (WA) NAME OFFSET
22410: * (XR) MAY BE NON-COLLECTABLE
22411: * BRN EXNAM JUMP TO EXIT WITH NAME IN (XL,WA)
22412: *
22413: * EXNAM CONTINUES BY EXECUTING THE NEXT CODE WORD
22414: *
22415: {EXNAM{RTN{{{{
22416: {{MOV{R10{-(SP){{STACK NAME BASE
22417: {{MOV{R6{-(SP){{STACK NAME OFFSET
22418: {{BRN{EXITS{{{DO NEXT CODE WORD
22419: {{EJC{{{{
22420: *
22421: * EXNUL -- EXIT WITH NULL RESULT
22422: *
22423: * (XL,XR) MAY BE NON-COLLECTABLE
22424: * BRN EXNUL JUMP TO EXIT WITH NULL VALUE
22425: *
22426: * EXNUL CONTINUES BY EXECUTING THE NEXT CODE WORD
22427: *
22428: {EXNUL{RTN{{{{
22429: {{MOV{#NULLS{-(SP){{STACK NULL VALUE
22430: {{BRN{EXITS{{{DO NEXT CODE WORD
22431: {{EJC{{{{
22432: *
22433: * EXREA -- EXIT WITH REAL RESULT
22434: *
22435: * (XL,XR) MAY BE NON-COLLECTABLE
22436: * (RA) REAL VALUE
22437: * BRN EXREA JUMP TO EXIT WITH REAL VALUE
22438: *
22439: * EXREA CONTINUES BY EXECUTING THE NEXT CODE WORD
22440: *
22441: {EXREA{RTN{{{{
22442: {{JSR{RCBLD{{{BUILD RCBLK
22443: {{BRN{EXIXR{{{JUMP TO EXIT WITH RESULT IN XR
22444: {{EJC{{{{
22445: *
22446: * EXSID -- EXIT SETTING ID FIELD
22447: *
22448: * EXSID IS USED TO EXIT AFTER BUILDING ANY OF THE FOLLOWING
22449: * BLOCKS (ARBLK, TBBLK, PDBLK, VCBLK). IT SETS THE IDVAL.
22450: *
22451: * (XR) PTR TO BLOCK WITH IDVAL FIELD
22452: * (XL) MAY BE NON-COLLECTABLE
22453: * BRN EXSID JUMP TO EXIT AFTER SETTING ID FIELD
22454: *
22455: * EXSID CONTINUES BY EXECUTING THE NEXT CODE WORD
22456: *
22457: {EXSID{RTN{{{{
22458: {{MOV{CURID{R6{{LOAD CURRENT ID VALUE
22459: {{BNE{R6{#CFP$M{EXSI1{JUMP IF NO OVERFLOW
22460: {{ZER{R6{{{ELSE RESET FOR WRAPAROUND
22461: *
22462: * HERE WITH OLD IDVAL IN WA
22463: *
22464: {EXSI1{ICV{R6{{{BUMP ID VALUE
22465: {{MOV{R6{CURID{{STORE FOR NEXT TIME
22466: {{MOV{R6{4*IDVAL(R9){{STORE ID VALUE
22467: {{BRN{EXIXR{{{EXIT WITH RESULT IN (XR)
22468: {{EJC{{{{
22469: *
22470: * EXVNM -- EXIT WITH NAME OF VARIABLE
22471: *
22472: * EXVNM EXITS AFTER STACKING A VALUE WHICH IS A NMBLK
22473: * REFERENCING THE NAME OF A GIVEN NATURAL VARIABLE.
22474: *
22475: * (XR) VRBLK POINTER
22476: * (XL) MAY BE NON-COLLECTABLE
22477: * BRN EXVNM EXIT WITH VRBLK POINTER IN XR
22478: *
22479: {EXVNM{RTN{{{{
22480: {{MOV{R9{R10{{COPY NAME BASE POINTER
22481: {{MOV{#4*NMSI${R6{{SET SIZE OF NMBLK
22482: {{JSR{ALLOC{{{ALLOCATE NMBLK
22483: {{MOV{#B$NML{(R9){{STORE TYPE WORD
22484: {{MOV{R10{4*NMBAS(R9){{STORE NAME BASE
22485: {{MOV{#4*VRVAL{4*NMOFS(R9){{STORE NAME OFFSET
22486: {{BRN{EXIXR{{{EXIT WITH RESULT IN XR
22487: {{EJC{{{{
22488: *
22489: * FLPOP -- FAIL AND POP IN PATTERN MATCHING
22490: *
22491: * FLPOP POPS THE NODE AND CURSOR ON THE STACK AND THEN
22492: * DROPS THROUGH INTO FAILP TO CAUSE PATTERN FAILURE
22493: *
22494: * (XL,XR) MAY BE NON-COLLECTABLE
22495: * BRN FLPOP JUMP TO FAIL AND POP STACK
22496: *
22497: {FLPOP{RTN{{{{
22498: {{ADD{#4*NUM02{SP{{POP TWO ENTRIES OFF STACK
22499: {{EJC{{{{
22500: *
22501: * FAILP -- FAILURE IN MATCHING PATTERN NODE
22502: *
22503: * FAILP IS USED AFTER FAILING TO MATCH A PATTERN NODE.
22504: * SEE PATTERN MATCH ROUTINES FOR DETAILS OF USE.
22505: *
22506: * (XL,XR) MAY BE NON-COLLECTABLE
22507: * BRN FAILP SIGNAL FAILURE TO MATCH
22508: *
22509: * FAILP CONTINUES BY MATCHING AN ALTERNATIVE FROM THE STACK
22510: *
22511: {FAILP{RTN{{{{
22512: {{MOV{(SP)+{R9{{LOAD ALTERNATIVE NODE POINTER
22513: {{MOV{(SP)+{R7{{RESTORE OLD CURSOR
22514: {{MOV{(R9){R10{{LOAD PCODE ENTRY POINTER
22515: {{BRI{R10{{{JUMP TO EXECUTE CODE FOR NODE
22516: {{EJC{{{{
22517: *
22518: * INDIR -- COMPUTE INDIRECT REFERENCE
22519: *
22520: * (WB) NONZERO/ZERO FOR BY NAME/VALUE
22521: * BRN INDIR JUMP TO GET INDIRECT REF ON STACK
22522: *
22523: * INDIR CONTINUES BY EXECUTING THE NEXT CODE WORD
22524: *
22525: {INDIR{RTN{{{{
22526: {{MOV{(SP)+{R9{{LOAD ARGUMENT
22527: {{BEQ{(R9){#B$NML{INDR2{JUMP IF A NAME
22528: {{JSR{GTNVR{{{ELSE CONVERT TO VARIABLE
22529: {{ERR{239{INDIRECTION{{OPERAND IS NOT NAME
22530: {{BZE{R7{INDR1{{SKIP IF BY VALUE
22531: {{MOV{R9{-(SP){{ELSE STACK VRBLK PTR
22532: {{MOV{#4*VRVAL{-(SP){{STACK NAME OFFSET
22533: {{BRN{EXITS{{{EXIT WITH RESULT ON STACK
22534: *
22535: * HERE TO GET VALUE OF NATURAL VARIABLE
22536: *
22537: {INDR1{BRI{(R9){{{JUMP THROUGH VRGET FIELD OF VRBLK
22538: *
22539: * HERE IF OPERAND IS A NAME
22540: *
22541: {INDR2{MOV{4*NMBAS(R9){R10{{LOAD NAME BASE
22542: {{MOV{4*NMOFS(R9){R6{{LOAD NAME OFFSET
22543: {{BNZ{R7{EXNAM{{EXIT IF CALLED BY NAME
22544: {{JSR{ACESS{{{ELSE GET VALUE FIRST
22545: {{PPM{EXFAL{{{FAIL IF ACCESS FAILS
22546: {{BRN{EXIXR{{{ELSE RETURN WITH VALUE IN XR
22547: {{EJC{{{{
22548: *
22549: * MATCH -- INITIATE PATTERN MATCH
22550: *
22551: * (WB) MATCH TYPE CODE
22552: * BRN MATCH JUMP TO INITIATE PATTERN MATCH
22553: *
22554: * MATCH CONTINUES BY EXECUTING THE PATTERN MATCH. SEE
22555: * PATTERN MATCH ROUTINES (P$XXX) FOR FULL DETAILS.
22556: *
22557: {MATCH{RTN{{{{
22558: {{MOV{(SP)+{R9{{LOAD PATTERN OPERAND
22559: {{JSR{GTPAT{{{CONVERT TO PATTERN
22560: {{ERR{240{PATTERN{{MATCH RIGHT OPERAND IS NOT PATTERN
22561: {{MOV{R9{R10{{IF OK, SAVE PATTERN POINTER
22562: {{BNZ{R7{MTCH1{{JUMP IF NOT MATCH BY NAME
22563: {{MOV{(SP){R6{{ELSE LOAD NAME OFFSET
22564: {{MOV{R10{-(SP){{SAVE PATTERN POINTER
22565: {{MOV{4*2(SP){R10{{LOAD NAME BASE
22566: {{JSR{ACESS{{{ACCESS SUBJECT VALUE
22567: {{PPM{EXFAL{{{FAIL IF ACCESS FAILS
22568: {{MOV{(SP){R10{{RESTORE PATTERN POINTER
22569: {{MOV{R9{(SP){{STACK SUBJECT STRING VAL FOR MERGE
22570: {{ZER{R7{{{RESTORE TYPE CODE
22571: *
22572: * MERGE HERE WITH SUBJECT VALUE ON STACK
22573: *
22574: {MTCH1{MOV{(SP){R9{{LOAD SUBJECT VALUE
22575: {{ZER{R$PMB{{{ASSUME NOT A BUFFER
22576: {{BNE{(R9){#B$BCT{MTCHA{BRANCH IF NOT
22577: {{ICA{SP{{{ELSE POP VALUE
22578: {{MOV{R9{R$PMB{{SAVE POINTER
22579: {{MOV{4*BCLEN(R9){R6{{GET DEFINED LENGTH
22580: {{MOV{4*BCBUF(R9){R9{{POINT TO BFBLK
22581: {{BRN{MTCHB{{{
22582: *
22583: * HERE IF NOT BUFFER TO CONVERT TO STRING
22584: *
22585: {MTCHA{JSR{GTSTG{{{NOT BUFFER - CONVERT TO STRING
22586: {{ERR{241{PATTERN{{MATCH LEFT OPERAND IS NOT STRING
22587: *
22588: * MERGE WITH BUFFER OR STRING
22589: *
22590: {MTCHB{MOV{R9{R$PMS{{IF OK, STORE SUBJECT STRING POINTER
22591: {{MOV{R6{PMSSL{{AND LENGTH
22592: {{MOV{R7{-(SP){{STACK MATCH TYPE CODE
22593: {{ZER{-(SP){{{STACK INITIAL CURSOR (ZERO)
22594: {{ZER{R7{{{SET INITIAL CURSOR
22595: {{MOV{SP{PMHBS{{SET HISTORY STACK BASE PTR
22596: {{ZER{PMDFL{{{RESET PATTERN ASSIGNMENT FLAG
22597: {{MOV{R10{R9{{SET INITIAL NODE POINTER
22598: {{BNZ{KVANC{MTCH2{{JUMP IF ANCHORED
22599: *
22600: * HERE FOR UNANCHORED
22601: *
22602: {{MOV{R9{-(SP){{STACK INITIAL NODE POINTER
22603: {{MOV{#NDUNA{-(SP){{STACK POINTER TO ANCHOR MOVE NODE
22604: {{BRI{(R9){{{START MATCH OF FIRST NODE
22605: *
22606: * HERE IN ANCHORED MODE
22607: *
22608: {MTCH2{ZER{-(SP){{{DUMMY CURSOR VALUE
22609: {{MOV{#NDABO{-(SP){{STACK POINTER TO ABORT NODE
22610: {{BRI{(R9){{{START MATCH OF FIRST NODE
22611: {{EJC{{{{
22612: *
22613: * RETRN -- RETURN FROM FUNCTION
22614: *
22615: * (WA) STRING POINTER FOR RETURN TYPE
22616: * BRN RETRN JUMP TO RETURN FROM (SNOBOL) FUNC
22617: *
22618: * RETRN CONTINUES BY EXECUTING THE CODE AT THE RETURN POINT
22619: * THE STACK IS CLEANED OF ANY GARBAGE LEFT BY OTHER
22620: * ROUTINES WHICH MAY HAVE ALTERED FLPTR SINCE FUNCTION
22621: * ENTRY BY USING FLPRT, RESERVED FOR USE ONLY BY
22622: * FUNCTION CALL AND RETURN.
22623: *
22624: {RETRN{RTN{{{{
22625: {{BNZ{KVFNC{RTN01{{JUMP IF NOT LEVEL ZERO
22626: {{ERB{242{FUNCTION{{RETURN FROM LEVEL ZERO
22627: *
22628: * HERE IF NOT LEVEL ZERO RETURN
22629: *
22630: {RTN01{MOV{FLPRT{SP{{POP STACK
22631: {{ICA{SP{{{REMOVE FAILURE OFFSET
22632: {{MOV{(SP)+{R9{{POP PFBLK POINTER
22633: {{MOV{(SP)+{FLPTR{{POP FAILURE POINTER
22634: {{MOV{(SP)+{FLPRT{{POP OLD FLPRT
22635: {{MOV{(SP)+{R7{{POP CODE POINTER OFFSET
22636: {{MOV{(SP)+{R8{{POP OLD CODE BLOCK POINTER
22637: {{ADD{R8{R7{{MAKE OLD CODE POINTER ABSOLUTE
22638: {{LCP{R7{{{RESTORE OLD CODE POINTER
22639: {{MOV{R8{R$COD{{RESTORE OLD CODE BLOCK POINTER
22640: {{DCV{KVFNC{{{DECREMENT FUNCTION LEVEL
22641: {{MOV{KVTRA{R7{{LOAD TRACE
22642: {{ADD{KVFTR{R7{{ADD FTRACE
22643: {{BZE{R7{RTN06{{JUMP IF NO TRACING POSSIBLE
22644: *
22645: * HERE IF THERE MAY BE A TRACE
22646: *
22647: {{MOV{R6{-(SP){{SAVE FUNCTION RETURN TYPE
22648: {{MOV{R9{-(SP){{SAVE PFBLK POINTER
22649: {{MOV{R6{KVRTN{{SET RTNTYPE FOR TRACE FUNCTION
22650: {{MOV{R$FNC{R10{{LOAD FNCLEVEL TRBLK PTR (IF ANY)
22651: {{JSR{KTREX{{{EXECUTE POSSIBLE FNCLEVEL TRACE
22652: {{MOV{4*PFVBL(R9){R10{{LOAD VRBLK PTR (SGD13)
22653: {{BZE{KVTRA{RTN02{{JUMP IF TRACE IS OFF
22654: {{MOV{4*PFRTR(R9){R9{{ELSE LOAD RETURN TRACE TRBLK PTR
22655: {{BZE{R9{RTN02{{JUMP IF NOT RETURN TRACED
22656: {{DCV{KVTRA{{{ELSE DECREMENT TRACE COUNT
22657: {{BZE{4*TRFNC(R9){RTN03{{JUMP IF PRINT TRACE
22658: {{MOV{#4*VRVAL{R6{{ELSE SET NAME OFFSET
22659: {{MOV{4*1(SP){KVRTN{{MAKE SURE RTNTYPE IS SET RIGHT
22660: {{JSR{TRXEQ{{{EXECUTE FULL TRACE
22661: {{EJC{{{{
22662: *
22663: * RETRN (CONTINUED)
22664: *
22665: * HERE TO TEST FOR FTRACE
22666: *
22667: {RTN02{BZE{KVFTR{RTN05{{JUMP IF FTRACE IS OFF
22668: {{DCV{KVFTR{{{ELSE DECREMENT FTRACE
22669: *
22670: * HERE FOR PRINT TRACE OF FUNCTION RETURN
22671: *
22672: {RTN03{JSR{PRTSN{{{PRINT STATEMENT NUMBER
22673: {{MOV{4*1(SP){R9{{LOAD RETURN TYPE
22674: {{JSR{PRTST{{{PRINT IT
22675: {{MOV{#CH$BL{R6{{LOAD BLANK
22676: {{JSR{PRTCH{{{PRINT IT
22677: {{MOV{(SP){R10{{LOAD PFBLK PTR
22678: {{MOV{4*PFVBL(R10){R10{{LOAD FUNCTION VRBLK PTR
22679: {{MOV{#4*VRVAL{R6{{SET VRBLK NAME OFFSET
22680: {{BNE{R9{#SCFRT{RTN04{JUMP IF NOT FRETURN CASE
22681: *
22682: * FOR FRETURN, JUST PRINT FUNCTION NAME
22683: *
22684: {{JSR{PRTNM{{{PRINT NAME
22685: {{JSR{PRTNL{{{TERMINATE PRINT LINE
22686: {{BRN{RTN05{{{MERGE
22687: *
22688: * HERE FOR RETURN OR NRETURN, PRINT FUNCTION NAME = VALUE
22689: *
22690: {RTN04{JSR{PRTNV{{{PRINT NAME = VALUE
22691: *
22692: * HERE AFTER COMPLETING TRACE
22693: *
22694: {RTN05{MOV{(SP)+{R9{{POP PFBLK POINTER
22695: {{MOV{(SP)+{R6{{POP RETURN TYPE STRING
22696: *
22697: * MERGE HERE IF NO TRACE REQUIRED
22698: *
22699: {RTN06{MOV{R6{KVRTN{{SET RTNTYPE KEYWORD
22700: {{MOV{4*PFVBL(R9){R10{{LOAD POINTER TO FN VRBLK
22701: {{EJC{{{{
22702: * RETRN (CONTINUED)
22703: *
22704: * GET VALUE OF FUNCTION
22705: *
22706: {RTN07{MOV{R10{RTNBP{{SAVE BLOCK POINTER
22707: {{MOV{4*VRVAL(R10){R10{{LOAD VALUE
22708: {{BEQ{(R10){#B$TRT{RTN07{LOOP BACK IF TRAPPED
22709: {{MOV{R10{RTNFV{{ELSE SAVE FUNCTION RESULT VALUE
22710: {{MOV{(SP)+{RTNSV{{SAVE ORIGINAL FUNCTION VALUE
22711: {{MOV{(SP)+{R10{{POP SAVED POINTER
22712: {{BZE{R10{RTN7C{{NO ACTION IF NONE
22713: {{BZE{KVPFL{RTN7C{{JUMP IF NO PROFILING
22714: {{JSR{PRFLU{{{ELSE PROFILE LAST FUNC STMT
22715: {{BEQ{KVPFL{#NUM02{RTN7A{BRANCH ON VALUE OF PROFILE KEYWD
22716: *
22717: * HERE IF &PROFILE = 1. START TIME MUST BE FRIGGED TO
22718: * APPEAR EARLIER THAN IT ACTUALLY IS, BY AMOUNT USED BEFORE
22719: * THE CALL.
22720: *
22721: {{LDI{PFSTM{{{LOAD CURRENT TIME
22722: {{SBI{4*ICVAL(R10){{{FRIG BY SUBTRACTING SAVED AMOUNT
22723: {{BRN{RTN7B{{{AND MERGE
22724: *
22725: * HERE IF &PROFILE = 2
22726: *
22727: {RTN7A{LDI{4*ICVAL(R10){{{LOAD SAVED TIME
22728: *
22729: * BOTH PROFILE TYPES MERGE HERE
22730: *
22731: {RTN7B{STI{PFSTM{{{STORE BACK CORRECT START TIME
22732: *
22733: * MERGE HERE IF NO PROFILING
22734: *
22735: {RTN7C{MOV{4*FARGS(R9){R7{{GET NUMBER OF ARGS
22736: {{ADD{4*PFNLO(R9){R7{{ADD NUMBER OF LOCALS
22737: {{BZE{R7{RTN10{{JUMP IF NO ARGS/LOCALS
22738: {{LCT{R7{R7{{ELSE SET LOOP COUNTER
22739: {{ADD{4*PFLEN(R9){R9{{AND POINT TO END OF PFBLK
22740: *
22741: * LOOP TO RESTORE FUNCTIONS AND LOCALS
22742: *
22743: {RTN08{MOV{-(R9){R10{{LOAD NEXT VRBLK POINTER
22744: *
22745: * LOOP TO FIND VALUE BLOCK
22746: *
22747: {RTN09{MOV{R10{R6{{SAVE BLOCK POINTER
22748: {{MOV{4*VRVAL(R10){R10{{LOAD POINTER TO NEXT VALUE
22749: {{BEQ{(R10){#B$TRT{RTN09{LOOP BACK IF TRAPPED
22750: {{MOV{R6{R10{{ELSE RESTORE LAST BLOCK POINTER
22751: {{MOV{(SP)+{4*VRVAL(R10){{RESTORE OLD VARIABLE VALUE
22752: {{BCT{R7{RTN08{{LOOP TILL ALL PROCESSED
22753: *
22754: * NOW RESTORE FUNCTION VALUE AND EXIT
22755: *
22756: {RTN10{MOV{RTNBP{R10{{RESTORE PTR TO LAST FUNCTION BLOCK
22757: {{MOV{RTNSV{4*VRVAL(R10){{RESTORE OLD FUNCTION VALUE
22758: {{MOV{RTNFV{R9{{RELOAD FUNCTION RESULT
22759: {{MOV{R$COD{R10{{POINT TO NEW CODE BLOCK
22760: {{MOV{KVSTN{KVLST{{SET LASTNO FROM STNO
22761: {{MOV{4*CDSTM(R10){KVSTN{{RESET PROPER STNO VALUE
22762: {{MOV{KVRTN{R6{{LOAD RETURN TYPE
22763: {{BEQ{R6{#SCRTN{EXIXR{EXIT WITH RESULT IN XR IF RETURN
22764: {{BEQ{R6{#SCFRT{EXFAL{FAIL IF FRETURN
22765: {{EJC{{{{
22766: *
22767: * RETRN (CONTINUED)
22768: *
22769: * HERE FOR NRETURN
22770: *
22771: {{BEQ{(R9){#B$NML{RTN11{JUMP IF IS A NAME
22772: {{JSR{GTNVR{{{ELSE TRY CONVERT TO VARIABLE NAME
22773: {{ERR{243{FUNCTION{{RESULT IN NRETURN IS NOT NAME
22774: {{MOV{R9{R10{{IF OK, COPY VRBLK (NAME BASE) PTR
22775: {{MOV{#4*VRVAL{R6{{SET NAME OFFSET
22776: {{BRN{RTN12{{{AND MERGE
22777: *
22778: * HERE IF RETURNED RESULT IS A NAME
22779: *
22780: {RTN11{MOV{4*NMBAS(R9){R10{{LOAD NAME BASE
22781: {{MOV{4*NMOFS(R9){R6{{LOAD NAME OFFSET
22782: *
22783: * MERGE HERE WITH RETURNED NAME IN (XL,WA)
22784: *
22785: {RTN12{MOV{R10{R9{{PRESERVE XL
22786: {{LCW{R7{{{LOAD NEXT WORD
22787: {{MOV{R9{R10{{RESTORE XL
22788: {{BEQ{R7{#OFNE${EXNAM{EXIT IF CALLED BY NAME
22789: {{MOV{R7{-(SP){{ELSE SAVE CODE WORD
22790: {{JSR{ACESS{{{GET VALUE
22791: {{PPM{EXFAL{{{FAIL IF ACCESS FAILS
22792: {{MOV{R9{R10{{IF OK, COPY RESULT
22793: {{MOV{(SP){R9{{RELOAD NEXT CODE WORD
22794: {{MOV{R10{(SP){{STORE RESULT ON STACK
22795: {{MOV{(R9){R10{{LOAD ROUTINE ADDRESS
22796: {{BRI{R10{{{JUMP TO EXECUTE NEXT CODE WORD
22797: {{EJC{{{{
22798: *
22799: * STCOV -- SIGNAL STATEMENT COUNTER OVERFLOW
22800: *
22801: * BRN STCOV JUMP TO SIGNAL STATEMENT COUNT OFLO
22802: *
22803: * PERMIT UP TO 10 MORE STATEMENTS TO BE OBEYED SO THAT
22804: * SETEXIT TRAP CAN REGAIN CONTROL.
22805: * STCOV CONTINUES BY ISSUING THE ERROR MESSAGE
22806: *
22807: {STCOV{RTN{{{{
22808: {{ICV{ERRFT{{{FATAL ERROR
22809: {{LDI{INTVT{{{GET 10
22810: {{ADI{KVSTL{{{ADD TO FORMER LIMIT
22811: {{STI{KVSTL{{{STORE AS NEW STLIMIT
22812: {{LDI{INTVT{{{GET 10
22813: {{STI{KVSTC{{{SET AS NEW COUNT
22814: {{ERB{244{STATEMENT{{COUNT EXCEEDS VALUE OF STLIMIT KEYWORD
22815: {{EJC{{{{
22816: *
22817: * STMGO -- START EXECUTION OF NEW STATEMENT
22818: *
22819: * (XR) POINTER TO CDBLK FOR NEW STATEMENT
22820: * BRN STMGO JUMP TO EXECUTE NEW STATEMENT
22821: *
22822: * STMGO CONTINUES BY EXECUTING THE NEXT STATEMENT
22823: *
22824: {STMGO{RTN{{{{
22825: {{MOV{R9{R$COD{{SET NEW CODE BLOCK POINTER
22826: {{BZE{KVPFL{STGO1{{SKIP IF NO PROFILING
22827: {{JSR{PRFLU{{{ELSE PROFILE THE STATEMENT
22828: {STGO1{MOV{KVSTN{KVLST{{SET LASTNO
22829: {{MOV{4*CDSTM(R9){KVSTN{{SET STNO
22830: {{ADD{#4*CDCOD{R9{{POINT TO FIRST CODE WORD
22831: {{LCP{R9{{{SET CODE POINTER
22832: {{LDI{KVSTC{{{GET STMT COUNT
22833: {{ILT{EXITS{{{OMIT COUNTING IF NEGATIVE
22834: {{IEQ{STCOV{{{FAIL IF STLIMIT REACHED
22835: {{SBI{INTV1{{{DECREMENT
22836: {{STI{KVSTC{{{REPLACE IT
22837: {{BZE{R$STC{EXITS{{EXIT IF NO STCOUNT TRACE
22838: *
22839: * HERE FOR STCOUNT TRACE
22840: *
22841: {{ZER{R9{{{CLEAR GARBAGE VALUE IN XR
22842: {{MOV{R$STC{R10{{LOAD POINTER TO STCOUNT TRBLK
22843: {{JSR{KTREX{{{EXECUTE KEYWORD TRACE
22844: {{BRN{EXITS{{{AND THEN EXIT FOR NEXT CODE WORD
22845: {{EJC{{{{
22846: *
22847: * STOPR -- TERMINATE RUN
22848: *
22849: * (XR) POINTS TO ENDING MESSAGE
22850: * BRN STOPR JUMP TO TERMINATE RUN
22851: *
22852: * TERMINATE RUN AND PRINT STATISTICS. ON ENTRY XR POINTS
22853: * TO ENDING MESSAGE OR IS ZERO IF MESSAGE PRINTED ALREADY.
22854: *
22855: {STOPR{RTN{{{{
22856: {{BZE{R9{STPRA{{SKIP IF SYSAX ALREADY CALLED (REG04)
22857: {{JSR{SYSAX{{{CALL AFTER EXECUTION PROC
22858: {STPRA{ADD{RSMEM{DNAME{{USE THE RESERVE MEMORY
22859: {{BNE{R9{#ENDMS{STPR0{SKIP IF NOT NORMAL END MESSAGE
22860: {{BNZ{EXSTS{STPR3{{SKIP IF EXEC STATS SUPPRESSED
22861: {{ZER{ERICH{{{CLEAR ERRORS TO INT.CH. FLAG
22862: *
22863: * LOOK TO SEE IF AN ENDING MESSAGE IS SUPPLIED
22864: *
22865: {STPR0{JSR{PRTPG{{{EJECT PRINTER
22866: {{BZE{R9{STPR1{{SKIP IF NO MESSAGE
22867: {{JSR{PRTST{{{PRINT MESSAGE
22868: *
22869: * MERGE HERE IF NO MESSAGE TO PRINT
22870: *
22871: {STPR1{JSR{PRTIS{{{PRINT BLANK LINE
22872: {{MTI{KVSTN{{{GET STATEMENT NUMBER
22873: {{MOV{#STPM1{R9{{POINT TO MESSAGE /IN STATEMENT XXX/
22874: {{JSR{PRTMX{{{PRINT IT
22875: {{JSR{SYSTM{{{GET CURRENT TIME
22876: {{SBI{TIMSX{{{MINUS START TIME = ELAPSED EXEC TIM
22877: {{STI{STPTI{{{SAVE FOR LATER
22878: {{MOV{#STPM3{R9{{POINT TO MSG /EXECUTION TIME MSEC /
22879: {{JSR{PRTMX{{{PRINT IT
22880: {{LDI{KVSTL{{{GET STATEMENT LIMIT
22881: {{ILT{STPR2{{{SKIP IF NEGATIVE
22882: {{SBI{KVSTC{{{MINUS COUNTER = COUNT
22883: {{STI{STPSI{{{SAVE
22884: {{MOV{#STPM2{R9{{POINT TO MESSAGE /STMTS EXECUTED/
22885: {{JSR{PRTMX{{{PRINT IT
22886: {{LDI{STPTI{{{RELOAD ELAPSED TIME
22887: {{MLI{INTTH{{{*1000 (MICROSECS)
22888: {{IOV{STPR2{{{JUMP IF WE CANNOT COMPUTE
22889: {{DVI{STPSI{{{DIVIDE BY STATEMENT COUNT
22890: {{IOV{STPR2{{{JUMP IF OVERFLOW
22891: {{MOV{#STPM4{R9{{POINT TO MSG (MCSEC PER STATEMENT /
22892: {{JSR{PRTMX{{{PRINT IT
22893: {{EJC{{{{
22894: *
22895: * STOPR (CONTINUED)
22896: *
22897: * MERGE TO SKIP MESSAGE (OVERFLOW OR NEGATIVE STLIMIT)
22898: *
22899: {STPR2{MTI{GBCNT{{{LOAD COUNT OF COLLECTIONS
22900: {{MOV{#STPM5{R9{{POINT TO MESSAGE /REGENERATIONS /
22901: {{JSR{PRTMX{{{PRINT IT
22902: {{JSR{PRTIS{{{ONE MORE BLANK FOR LUCK
22903: *
22904: * CHECK IF DUMP REQUESTED
22905: *
22906: {STPR3{JSR{PRFLR{{{PRINT PROFILE IF WANTED
22907: *
22908: {{MOV{KVDMP{R9{{LOAD DUMP KEYWORD
22909: {{JSR{DUMPR{{{EXECUTE DUMP IF REQUESTED
22910: {{MOV{R$FCB{R10{{GET FCBLK CHAIN HEAD
22911: {{MOV{KVABE{R6{{LOAD ABEND VALUE
22912: {{MOV{KVCOD{R7{{LOAD CODE VALUE
22913: {{JSR{SYSEJ{{{EXIT TO SYSTEM
22914: {{EJC{{{{
22915: *
22916: * SUCCP -- SIGNAL SUCCESSFUL MATCH OF A PATTERN NODE
22917: *
22918: * SEE PATTERN MATCH ROUTINES FOR DETAILS
22919: *
22920: * (XR) CURRENT NODE
22921: * (WB) CURRENT CURSOR
22922: * (XL) MAY BE NON-COLLECTABLE
22923: * BRN SUCCP SIGNAL SUCCESSFUL PATTERN MATCH
22924: *
22925: * SUCCP CONTINUES BY MATCHING THE SUCCESSOR NODE
22926: *
22927: {SUCCP{RTN{{{{
22928: {{MOV{4*PTHEN(R9){R9{{LOAD SUCCESSOR NODE
22929: {{MOV{(R9){R10{{LOAD NODE CODE ENTRY ADDRESS
22930: {{BRI{R10{{{JUMP TO MATCH SUCCESSOR NODE
22931: {{EJC{{{{
22932: *
22933: * SYSAB -- PRINT /ABNORMAL END/ AND TERMINATE
22934: *
22935: {SYSAB{RTN{{{{
22936: {{MOV{#ENDAB{R9{{POINT TO MESSAGE
22937: {{MOV{#NUM01{KVABE{{SET ABEND FLAG
22938: {{JSR{PRTNL{{{SKIP TO NEW LINE
22939: {{BRN{STOPR{{{JUMP TO PACK UP
22940: {{EJC{{{{
22941: *
22942: * SYSTU -- PRINT /TIME UP/ AND TERMINATE
22943: *
22944: {SYSTU{RTN{{{{
22945: {{MOV{#ENDTU{R9{{POINT TO MESSAGE
22946: {{MOV{STRTU{R6{{GET CHARS /TU/
22947: {{MOV{R6{KVCOD{{PUT IN KVCOD
22948: {{MOV{TIMUP{R6{{CHECK STATE OF TIMEUP SWITCH
22949: {{MNZ{TIMUP{{{SET SWITCH
22950: {{BNZ{R6{STOPR{{STOP RUN IF ALREADY SET
22951: {{ERB{245{TRANSLATION/EXECUTION{{TIME EXPIRED
22952: {{TTL{S{{{P I T B O L -- STACK OVERFLOW SECTION
22953: *
22954: * CONTROL COMES HERE IF THE MAIN STACK OVERFLOWS
22955: *
22956: {{SEC{{{{START OF STACK OVERFLOW SECTION
22957: *
22958: {{ICV{ERRFT{{{FATAL ERROR
22959: {{MOV{FLPTR{SP{{POP STACK TO AVOID MORE FAILS
22960: {{BNZ{GBCFL{STAK1{{JUMP IF GARBAGE COLLECTING
22961: {{ERB{246{STACK{{OVERFLOW
22962: *
22963: * NO CHANCE OF RECOVERY IN MID GARBAGE COLLECTION
22964: *
22965: {STAK1{MOV{#ENDSO{R9{{POINT TO MESSAGE
22966: {{ZER{KVDMP{{{MEMORY IS UNDUMPABLE
22967: {{BRN{STOPR{{{GIVE UP
22968: {{TTL{S{{{P I T B O L -- ERROR SECTION
22969: *
22970: * THIS SECTION OF CODE IS ENTERED WHENEVER A PROCEDURE
22971: * RETURN VIA AN ERR PARAMETER OR AN ERB OPCODE IS OBEYED.
22972: *
22973: * (WA) IS THE ERROR CODE
22974: *
22975: * THE GLOBAL VARIABLE STAGE INDICATES THE POINT AT WHICH
22976: * THE ERROR OCCURED AS FOLLOWS.
22977: *
22978: * STAGE=STGIC ERROR DURING INITIAL COMPILE
22979: *
22980: * STAGE=STGXC ERROR DURING COMPILE AT EXECUTE
22981: * TIME (CODE, CONVERT FUNCTION CALLS)
22982: *
22983: * STAGE=STGEV ERROR DURING COMPILATION OF
22984: * EXPRESSION AT EXECUTION TIME
22985: * (EVAL, CONVERT FUNCTION CALL).
22986: *
22987: * STAGE=STGXT ERROR AT EXECUTE TIME. COMPILER
22988: * NOT ACTIVE.
22989: *
22990: * STAGE=STGCE ERROR DURING INITIAL COMPILE AFTER
22991: * SCANNING OUT THE END LINE.
22992: *
22993: * STAGE=STGXE ERROR DURING COMPILE AT EXECUTE
22994: * TIME AFTER SCANNING END LINE.
22995: *
22996: * STAGE=STGEE ERROR DURING EXPRESSION EVALUATION
22997: *
22998: {{SEC{{{{START OF ERROR SECTION
22999: *
23000: {ERROR{BEQ{R$CIM{#CMLAB{CMPLE{JUMP IF ERROR IN SCANNING LABEL
23001: {{MOV{R6{KVERT{{SAVE ERROR CODE
23002: {{ZER{SCNRS{{{RESET RESCAN SWITCH FOR SCANE
23003: {{ZER{SCNGO{{{RESET GOTO SWITCH FOR SCANE
23004: {{MOV{STAGE{R9{{LOAD CURRENT STAGE
23005: {{BSW{R9{STGNO{{JUMP TO APPROPRIATE ERROR CIRCUIT
23006: {{IFF{STGIC{ERR01{{INITIAL COMPILE
23007: {{IFF{STGXC{ERR04{{EXECUTE TIME COMPILE
23008: {{IFF{STGEV{ERR04{{EVAL COMPILING EXPR.
23009: {{IFF{STGXT{ERR05{{EXECUTE TIME
23010: {{IFF{STGCE{ERR01{{COMPILE - AFTER END
23011: {{IFF{STGXE{ERR04{{XEQ COMPILE-PAST END
23012: {{IFF{STGEE{ERR04{{EVAL EVALUATING EXPR
23013: {{ESW{{{{END SWITCH ON ERROR TYPE
23014: {{EJC{{{{
23015: *
23016: * ERROR DURING INITIAL COMPILE
23017: *
23018: * THE ERROR MESSAGE IS PRINTED AS PART OF THE COMPILER
23019: * OUTPUT. THIS PRINTOUT INCLUDES THE OFFENDING LINE (IF NOT
23020: * PRINTED ALREADY) AND AN ERROR FLAG UNDER THE APPROPRIATE
23021: * COLUMN AS INDICATED BY SCNSE UNLESS SCNSE IS SET TO ZERO.
23022: *
23023: * AFTER PRINTING THE MESSAGE, THE GENERATED CODE IS
23024: * MODIFIED TO AN ERROR CALL AND CONTROL IS RETURNED TO
23025: * THE CMPIL PROCEDURE AFTER RESETTING THE STACK POINTER.
23026: *
23027: * IF THE ERROR OCCURS AFTER THE END LINE, CONTROL RETURNS
23028: * IN A SLIGHTLY DIFFERENT MANNER TO ENSURE PROPER CLEANUP.
23029: *
23030: {ERR01{MOV{CMPXS{SP{{RESET STACK POINTER
23031: {{SSL{CMPSS{{{RESTORE S-R STACK PTR FOR CMPIL
23032: {{BNZ{ERRSP{ERR03{{JUMP IF ERROR SUPPRESS FLAG SET
23033: {{MOV{ERICH{ERLST{{SET FLAG FOR LISTR
23034: {{JSR{LISTR{{{LIST LINE
23035: {{JSR{PRTIS{{{TERMINATE LISTING
23036: {{ZER{ERLST{{{CLEAR LISTR FLAG
23037: {{MOV{SCNSE{R6{{LOAD SCAN ELEMENT OFFSET
23038: {{BZE{R6{ERR02{{SKIP IF NOT SET
23039: {{LCT{R7{R6{{LOOP COUNTER
23040: {{ICV{R6{{{INCREASE FOR CH$EX
23041: {{JSR{ALOCS{{{STRING BLOCK FOR ERROR FLAG
23042: {{MOV{R9{R6{{REMEMBER STRING PTR
23043: {{PSC{R9{{{READY FOR CHARACTER STORING
23044: {{MOV{R$CIM{R10{{POINT TO BAD STATEMENT
23045: {{PLC{R10{{{READY TO GET CHARS
23046: *
23047: * LOOP TO REPLACE ALL CHARS BUT TABS BY BLANKS
23048: *
23049: {ERRA1{LCH{R8{(R10)+{{GET NEXT CHAR
23050: {{BEQ{R8{#CH$HT{ERRA2{SKIP IF TAB
23051: {{MOV{#CH$BL{R8{{GET A BLANK
23052: {{EJC{{{{
23053: *
23054: * MERGE TO STORE BLANK OR TAB IN ERROR LINE
23055: *
23056: {ERRA2{SCH{R8{(R9)+{{STORE CHAR
23057: {{BCT{R7{ERRA1{{LOOP
23058: {{MOV{#CH$EX{R10{{EXCLAMATION MARK
23059: {{SCH{R10{(R9){{STORE AT END OF ERROR LINE
23060: {{CSC{R9{{{END OF SCH LOOP
23061: {{MOV{#STNPD{PROFS{{ALLOW FOR STATEMENT NUMBER
23062: {{MOV{R6{R9{{POINT TO ERROR LINE
23063: {{JSR{PRTST{{{PRINT ERROR LINE
23064: *
23065: * HERE AFTER PLACING ERROR FLAG AS REQUIRED
23066: *
23067: {ERR02{JSR{ERMSG{{{GENERATE FLAG AND ERROR MESSAGE
23068: {{ADD{#NUM03{LSTLC{{BUMP PAGE CTR FOR BLANK, ERROR, BLK
23069: {{ZER{R9{{{IN CASE OF FATAL ERROR
23070: {{BHI{ERRFT{#NUM03{STOPR{PACK UP IF SEVERAL FATALS
23071: *
23072: * COUNT ERROR, INHIBIT EXECUTION IF REQUIRED
23073: *
23074: {{ICV{CMERC{{{BUMP ERROR COUNT
23075: {{ADD{CSWER{NOXEQ{{INHIBIT XEQ IF -NOERRORS
23076: {{BNE{STAGE{#STGIC{CMP10{SPECIAL RETURN IF AFTER END LINE
23077: {{EJC{{{{
23078: *
23079: * LOOP TO SCAN TO END OF STATEMENT
23080: *
23081: {ERR03{MOV{R$CIM{R9{{POINT TO START OF IMAGE
23082: {{PLC{R9{{{POINT TO FIRST CHAR
23083: {{LCH{R9{(R9){{GET FIRST CHAR
23084: {{BEQ{R9{#CH$MN{CMPCE{JUMP IF ERROR IN CONTROL CARD
23085: {{ZER{SCNRS{{{CLEAR RESCAN FLAG
23086: {{MNZ{ERRSP{{{SET ERROR SUPPRESS FLAG
23087: {{JSR{SCANE{{{SCAN NEXT ELEMENT
23088: {{BNE{R10{#T$SMC{ERR03{LOOP BACK IF NOT STATEMENT END
23089: {{ZER{ERRSP{{{CLEAR ERROR SUPPRESS FLAG
23090: *
23091: * GENERATE ERROR CALL IN CODE AND RETURN TO CMPIL
23092: *
23093: {{MOV{#4*CDCOD{CWCOF{{RESET OFFSET IN CCBLK
23094: {{MOV{#OCER${R6{{LOAD COMPILE ERROR CALL
23095: {{JSR{CDWRD{{{GENERATE IT
23096: {{MOV{CWCOF{4*CMSOC(SP){{SET SUCCESS FILL IN OFFSET
23097: {{MNZ{4*CMFFC(SP){{{SET FAILURE FILL IN FLAG
23098: {{JSR{CDWRD{{{GENERATE SUCC. FILL IN WORD
23099: {{BRN{CMPSE{{{MERGE TO GENERATE ERROR AS CDFAL
23100: *
23101: * ERROR DURING EXECUTE TIME COMPILE OR EXPRESSION EVALUATIO
23102: *
23103: * EXECUTE TIME COMPILATION IS INITIATED THROUGH GTCOD OR
23104: * GTEXP WHICH ARE CALLED BY COMPILE, CODE OR EVAL.
23105: * BEFORE CAUSING STATEMENT FAILURE THROUGH EXFAL IT IS
23106: * HELPFUL TO SET KEYWORD ERRTEXT AND FOR GENERALITY
23107: * THESE ERRORS MAY BE HANDLED BY THE SETEXIT MECHANISM.
23108: *
23109: {ERR04{ZER{R$CCB{{{FORGET GARBAGE CODE BLOCK
23110: {{SSL{INISS{{{RESTORE MAIN PROG S-R STACK PTR
23111: {{JSR{ERTEX{{{GET FAIL MESSAGE TEXT
23112: {{DCA{SP{{{ENSURE STACK OK ON LOOP START
23113: *
23114: * POP STACK UNTIL FIND FLPTR FOR MOST DEEPLY NESTED PROG.
23115: * DEFINED FUNCTION CALL OR CALL OF EVAL / CODE.
23116: *
23117: {ERRA4{ICA{SP{{{POP STACK
23118: {{BEQ{SP{FLPRT{ERRC4{JUMP IF PROG DEFINED FN CALL FOUND
23119: {{BNE{SP{GTCEF{ERRA4{LOOP IF NOT EVAL OR CODE CALL YET
23120: {{MOV{#STGXT{STAGE{{RE-SET STAGE FOR EXECUTE
23121: {{MOV{R$GTC{R$COD{{RECOVER CODE PTR
23122: {{MOV{SP{FLPTR{{RESTORE FAIL POINTER
23123: {{ZER{R$CIM{{{FORGET POSSIBLE IMAGE
23124: *
23125: * TEST ERRLIMIT
23126: *
23127: {ERRB4{BNZ{KVERL{ERR07{{JUMP IF ERRLIMIT NON-ZERO
23128: {{BRN{EXFAL{{{FAIL
23129: *
23130: * RETURN FROM PROG. DEFINED FUNCTION IS OUTSTANDING
23131: *
23132: {ERRC4{MOV{FLPTR{SP{{RESTORE STACK FROM FLPTR
23133: {{BRN{ERRB4{{{MERGE
23134: {{EJC{{{{
23135: *
23136: * ERROR AT EXECUTE TIME.
23137: *
23138: * THE ACTION TAKEN ON AN ERROR IS AS FOLLOWS.
23139: *
23140: * IF ERRLIMIT KEYWORD IS ZERO, AN ABORT IS SIGNALLED,
23141: * SEE CODING FOR SYSTEM LABEL ABORT AT L$ABO.
23142: *
23143: * OTHERWISE, ERRLIMIT IS DECREMENTED AND AN ERRTYPE TRACE
23144: * GENERATED IF REQUIRED. CONTROL RETURNS EITHER VIA A JUMP
23145: * TO CONTINUE (TO TAKE THE FAILURE EXIT) OR A SPECIFIED
23146: * SETEXIT TRAP IS EXECUTED AND CONTROL PASSES TO THE TRAP.
23147: * IF 3 OR MORE FATAL ERRORS OCCUR AN ABORT IS SIGNALLED
23148: * REGARDLESS OF ERRLIMIT AND SETEXIT - LOOPING IS ALL TOO
23149: * PROBABLE OTHERWISE. FATAL ERRORS INCLUDE STACK OVERFLOW
23150: * AND EXCEEDING STLIMIT.
23151: *
23152: {ERR05{SSL{INISS{{{RESTORE MAIN PROG S-R STACK PTR
23153: {{BNZ{DMVCH{ERR08{{JUMP IF IN MID-DUMP
23154: *
23155: * MERGE HERE FROM ERR08
23156: *
23157: {ERR06{BZE{KVERL{LABO1{{ABORT IF ERRLIMIT IS ZERO
23158: {{JSR{ERTEX{{{GET FAIL MESSAGE TEXT
23159: *
23160: * MERGE FROM ERR04
23161: *
23162: {ERR07{BGE{ERRFT{#NUM03{LABO1{ABORT IF TOO MANY FATAL ERRORS
23163: {{DCV{KVERL{{{DECREMENT ERRLIMIT
23164: {{MOV{R$ERT{R10{{LOAD ERRTYPE TRACE POINTER
23165: {{JSR{KTREX{{{GENERATE ERRTYPE TRACE IF REQUIRED
23166: {{MOV{R$COD{R$CNT{{SET CDBLK PTR FOR CONTINUATION
23167: {{MOV{FLPTR{R9{{SET PTR TO FAILURE OFFSET
23168: {{MOV{(R9){STXOF{{SAVE FAILURE OFFSET FOR CONTINUE
23169: {{MOV{R$SXC{R9{{LOAD SETEXIT CDBLK POINTER
23170: {{BZE{R9{LCNT1{{CONTINUE IF NO SETEXIT TRAP
23171: {{ZER{R$SXC{{{ELSE RESET TRAP
23172: {{MOV{#NULLS{STXVR{{RESET SETEXIT ARG TO NULL
23173: {{MOV{(R9){R10{{LOAD PTR TO CODE BLOCK ROUTINE
23174: {{BRI{R10{{{EXECUTE FIRST TRAP STATEMENT
23175: *
23176: * INTERRUPTED PARTLY THROUGH A DUMP WHILST STORE IS IN A
23177: * MESS SO DO A TIDY UP OPERATION. SEE DUMPR FOR DETAILS.
23178: *
23179: {ERR08{MOV{DMVCH{R9{{CHAIN HEAD FOR AFFECTED VRBLKS
23180: {{BZE{R9{ERR06{{DONE IF ZERO
23181: {{MOV{(R9){DMVCH{{SET NEXT LINK AS CHAIN HEAD
23182: {{JSR{SETVR{{{RESTORE VRGET FIELD
23183: {{BRN{ERR08{{{LOOP THROUGH CHAIN
23184: {{TTL{S{{{P I T B O L -- HERE ENDETH THE CODE
23185: *
23186: * END OF ASSEMBLY
23187: *
23188: {{END{{{{END MACRO-SPITBOL ASSEMBLY
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.