|
|
1.1 root 1: TTL S P I T B O L - REVISION HISTORY
2: EJC
3: * R E V I S I O N H I S T O R Y
4: * -------------------------------
5: *
6: *
7: * VERSION 3.5B (FEB 81... - SGD PATCHES)
8: * -----------------------------------
9: *
10: * SGD03 - ADDITION OF .CNCI AND SYSCI (INT->STRING
11: * SYSTEM ROUTINE OPTION)
12: * SGD04 - (06-MAY-1981) MODIFIED INILN TO 132
13: * SGD05 - (13-MAY-1981) INSERTED MISSING WTB AFTER SYSMM
14: * CALLS
15: * SGD06 - (25-MAY-1981) MERGED IN PROFILER PATCHES
16: * (NOT MARKED)
17: * SGD07 - (25-MAY-1981) MUCHO PATCHES TO PROFILER (MARKED,
18: * BUT BEST JUST TO EXTRACT ENMASSE)
19: * SGD08 - (25-MAY-1981) USE STRING LENGTH IN HASHS
20: * SGD09 - (25-MAY-1981) FIXED SERIOUS PARSER PROBLEM
21: * RELATING TO (X Y) ON LINE BEING VIEWED AS PATTERN
22: * MATCH. FIXED BY ADDITION OF NEW CMTYP VALUE
23: * C$CNP (CONCATENATION - NOT PATTERN MATCH)
24: * SGD10 - (01-AUG-1981) FIXED EXIT(N) RESPECIFICATION CODE
25: * TO PROPERLY OBSERVE HEADER SEMANTICS ON RETURN.
26: * SGD11 - (07-AUG-1981) BYPASS PRTPG CALL AT INITIALIZATION
27: * FOLLOWING COMPILATION IF NO OUTPUT GENERATED.
28: * THIS PREVENTS OUTPUT FILES CONSISTING OF THE
29: * HEADERS AND A FEW BLANK LINES WHEN THERE IS NO
30: * SOURCE LISTING AND NO COMPILATION STATS.
31: * ALSO FIX TIMSX INITIALIZATION IN SAME CODE.
32: * SGD12 - (17-AUG-1981) B$EFC CODE DID NOT CHECK FOR
33: * UNCONVERTED RESULT RETURNING NULL STRING. FIXED.
34: * SGDBF - ( NOV-1981) ADDED BUFFER TYPE AND SYMBOL CNBF
35: * SGD13 - (03-MAR-1982) LOAD PFVBL FIELD IN RETRN FOR
36: * RETURN TRACING. THIS WAS CAUSING BUG ON RETURN
37: * TRACES THAT TRIED TO ACCESS THE VARIABLE NAME
38: * SGD14 - ADDED CHAR FUNCTION. CHAR(N) RETURNS NTH
39: * CHARACTER OF HOST MACHINE CHARACTER SET.
40: * NOT CONDITIONALIZED OR MARKED.
41: * SGD15 - FIXED PROBLEM RELATING TO COMPILATION OF GOTO
42: * FIELDS CONTAINING SMALL INTEGERS (IN CONST SEC).
43: *
44: * REG01 - (XX-AUG-82)
45: * ADDED CFP$U TO EASE TRANSLATION ON SMALLER
46: * SYSTEMS - CONDITIONAL .CUCF
47: * ADDED LOWER CASE SUPPORT - CONDITIONAL .CULC
48: * ADDED SET I/O FUNCTION - CONDITIONAL .CUST
49: *
50: * REG02 - (XX-SEP-82)
51: * CHANGED INILN AND AND INILS TO 258
52: *
53: * REG03 - (XX-OCT-82)
54: * CONDITIONALIZED THE PAGE EJECT AFTER CALL TO SYSBX
55: * AND ADDED ANOTHER BEFORE CALL TO SYSBX, SO THAT,
56: * IF DESIRED BY THE IMPLEMENTOR, STANDARD OUTPUT
57: * WILL REFLECT ASSIGNMENTS MADE BY EXECUTING PROGRAM
58: * ONLY. CONDITIONAL .CUEJ CONTROLS - IF DEFINED
59: * EJECT IS BEFORE CALL TO SYSBX.
60: *
61: * REG04 - (XX-NOV-82)
62: * FIXED DIFFICULTIES WITH LISTINGS DURING EXECUTION
63: * WHEN NO LISTING GENERATED DURING COMPILATION.
64: *
65: * -LIST TO CODE() CAUSED BOMB. FIX IS TO RESET
66: * R$TTL AND R$STL TO NULLS NOT 0 AFTER COMPILATION.
67: * (LISTR AND LISTT EXPECT NULLS)
68: *
69: * WHEN LISTING AND STATISTICS ROUTED TO DIFFERENT
70: * FILE THAN EXECUTION OUTPUT, ERROR MESSAGE IS SENT
71: * TO EXECUTION OUTPUT (AND GETS SEPARATED FROM
72: * ... IN STATEMENT ... MSG). LABO1 CALLS SYSAX AND
73: * STOPR DOES NOT CALL SYSAX IF ENTERED FROM LABO1.
74: *
75: * REG05 - (XX-NOV-82)
76: * PREVENT CLEAR() FROM CLOBBERING PROTECTED VARIABLES
77: * AT LABEL SCLR5.
78: *
79: * REG06 - (XX-NOV-82)
80: * FIXED GTEXP FROM ACCEPTING TRAILING SEMICOLON OR
81: * COLON. NOT LEGAL WAY TO END AN EXPRESSION.
82: *
83: * VERSION 3.5A (OCT 79 - SGD PATCHES)
84: * -----------------------------------
85: *
86: * SGD01 - PATCH IN ASIGN TO FIX MULTIPLE TRAP BLOCK PROBLEM
87: * (ASG10+2)
88: * SGD02 - PATCH IN GTARR TO FIX NULL CONVERT (GTAR9+0)
89: *
90: TTL S P I T B O L -- BASIC INFORMATION
91: EJC
92: *
93: * GENERAL STRUCTURE
94: * -----------------
95: *
96: * THIS PROGRAM IS A TRANSLATOR FOR A VERSION OF THE SNOBOL4
97: * PROGRAMMING LANGUAGE. LANGUAGE DETAILS ARE CONTAINED IN
98: * THE MANUAL MACRO SPITBOL BY DEWAR AND MCCANN, TECHNICAL
99: * REPORT 90, UNIVERSITY OF LEEDS 1976. THE LANGUAGE
100: * IS IDENTICAL TO THAT IMPLEMENTED BY THE BTL TRANSLATOR
101: * (R. E. GRISWOLD ET AL.) WITH THE FOLLOWING EXCEPTIONS.
102: *
103: * 1) REDEFINITION OF STANDARD SYSTEM FUNCTIONS AND
104: * OPERATORS IS NOT PERMITTED.
105: *
106: * 2) THE VALUE FUNCTION IS NOT PROVIDED.
107: *
108: * 3) ACCESS TRACING IS PROVIDED IN ADDITION TO THE
109: * OTHER STANDARD TRACE MODES.
110: *
111: * 4) THE KEYWORD STFCOUNT IS NOT PROVIDED.
112: *
113: * 5) THE KEYWORD FULLSCAN IS NOT PROVIDED AND ALL PATTERN
114: * MATCHING TAKES PLACE IN FULLSCAN MODE (I.E. WITH NO
115: * HEURISTICS APPLIED).
116: *
117: * 6) A SERIES OF EXPRESSIONS SEPARATED BY COMMAS MAY
118: * BE GROUPED WITHIN PARENTHESES TO PROVIDE A SELECTION
119: * CAPABILITY. THE SEMANTICS ARE THAT THE SELECTION
120: * ASSUMES THE VALUE OF THE FIRST EXPRESSION WITHIN IT
121: * WHICH SUCCEEDS AS THEY ARE EVALUATED FROM THE LEFT.
122: * IF NO EXPRESSION SUCCEEDS THE ENTIRE STATEMENT FAILS
123: *
124: * 7) AN EXPLICIT PATTERN MATCHING OPERATOR IS PROVIDED.
125: * THIS IS THE BINARY QUERY (SEE GIMPEL SIGPLAN OCT 74)
126: *
127: * 8) THE ASSIGNMENT OPERATOR IS INTRODUCED AS IN THE
128: * GIMPEL REFERENCE.
129: *
130: * 9) THE EXIT FUNCTION IS PROVIDED FOR GENERATING LOAD
131: * MODULES - CF. GIMPELS SITBOL.
132: *
133: *
134: * THE METHOD USED IN THIS PROGRAM IS TO TRANSLATE THE
135: * SOURCE CODE INTO AN INTERNAL PSEUDO-CODE (SEE FOLLOWING
136: * SECTION). AN INTERPRETOR IS THEN USED TO EXECUTE THIS
137: * GENERATED PSEUDO-CODE. THE NATURE OF THE SNOBOL4 LANGUAGE
138: * IS SUCH THAT THE LATTER TASK IS MUCH MORE COMPLEX THAN
139: * THE ACTUAL TRANSLATION PHASE. ACCORDINGLY, NEARLY ALL THE
140: * CODE IN THE PROGRAM SECTION IS CONCERNED WITH THE ACTUAL
141: * EXECUTION OF THE SNOBOL4 PROGRAM.
142: EJC
143: *
144: * INTERPRETIVE CODE FORMAT
145: * ------------------------
146: *
147: * THE INTERPRETIVE PSEUDO-CODE CONSISTS OF A SERIES OF
148: * ADDRESS POINTERS. THE EXACT FORMAT OF THE CODE IS
149: * DESCRIBED IN CONNECTION WITH THE CDBLK FORMAT. THE
150: * PURPOSE OF THIS SECTION IS TO GIVE GENERAL INSIGHT INTO
151: * THE INTERPRETIVE APPROACH INVOLVED.
152: *
153: * THE BASIC FORM OF THE CODE IS RELATED TO REVERSE POLISH.
154: * IN OTHER WORDS, THE OPERANDS PRECEDE THE OPERATORS WHICH
155: * ARE ZERO ADDRESS OPERATORS. THERE ARE SOME EXCEPTIONS TO
156: * THESE RULES, NOTABLY THE UNARY NOT OPERATOR AND THE
157: * SELECTION CONSTRUCTION WHICH CLEARLY REQUIRE ADVANCE
158: * KNOWLEDGE OF THE OPERATOR INVOLVED.
159: *
160: * THE OPERANDS ARE MOVED TO THE TOP OF THE MAIN STACK AND
161: * THE OPERATORS ARE APPLIED TO THE TOP STACK ENTRIES. LIKE
162: * OTHER VERSIONS OF SPITBOL, THIS PROCESSOR DEPENDS ON
163: * KNOWING WHETHER OPERANDS ARE REQUIRED BY NAME OR BY VALUE
164: * AND MOVES THE APPROPRIATE OBJECT TO THE STACK. THUS NO
165: * NAME/VALUE CHECKS ARE INCLUDED IN THE OPERATOR CIRCUITS.
166: *
167: * THE ACTUAL POINTERS IN THE CODE POINT TO A BLOCK WHOSE
168: * FIRST WORD IS THE ADDRESS OF THE INTERPRETOR ROUTINE
169: * TO BE EXECUTED FOR THE CODE WORD.
170: *
171: * IN THE CASE OF OPERATORS, THE POINTER IS TO A WORD WHICH
172: * CONTAINS THE ADDRESS OF THE OPERATOR TO BE EXECUTED. IN
173: * THE CASE OF OPERANDS SUCH AS CONSTANTS, THE POINTER IS TO
174: * THE OPERAND ITSELF. ACCORDINGLY, ALL OPERANDS CONTAIN
175: * A FIELD WHICH POINTS TO THE ROUTINE TO LOAD THE VALUE OF
176: * THE OPERAND ONTO THE STACK. IN THE CASE OF A VARIABLE,
177: * THERE ARE THREE SUCH POINTERS. ONE TO LOAD THE VALUE,
178: * ONE TO STORE THE VALUE AND A THIRD TO JUMP TO THE LABEL.
179: *
180: * THE HANDLING OF FAILURE RETURNS DESERVES SPECIAL COMMENT.
181: * THE LOCATION FLPTR CONTAINS THE POINTER TO THE LOCATION
182: * ON THE MAIN STACK WHICH CONTAINS THE FAILURE RETURN
183: * WHICH IS IN THE FORM OF A BYTE OFFSET IN THE CURRENT
184: * CODE BLOCK (CDBLK OR EXBLK). WHEN A FAILURE OCCURS, THE
185: * STACK IS POPPED AS INDICATED BY THE SETTING OF FLPTR AND
186: * CONTROL IS PASSED TO THE APPROPRIATE LOCATION IN THE
187: * CURRENT CODE BLOCK WITH THE STACK POINTER POINTING TO THE
188: * FAILURE OFFSET ON THE STACK AND FLPTR UNCHANGED.
189: EJC
190: *
191: * INTERNAL DATA REPRESENTATIONS
192: * -----------------------------
193: *
194: * REPRESENTATION OF VALUES
195: *
196: * A VALUE IS REPRESENTED BY A POINTER TO A BLOCK WHICH
197: * DESCRIBES THE TYPE AND PARTICULARS OF THE DATA VALUE.
198: * IN GENERAL, A VARIABLE IS A LOCATION CONTAINING SUCH A
199: * POINTER (ALTHOUGH IN THE CASE OF TRACE ASSOCIATIONS THIS
200: * IS MODIFIED, SEE DESCRIPTION OF TRBLK).
201: *
202: * THE FOLLOWING IS A LIST OF POSSIBLE DATATYPES SHOWING THE
203: * TYPE OF BLOCK USED TO HOLD THE VALUE. THE DETAILS OF
204: * EACH BLOCK FORMAT ARE GIVEN LATER.
205: *
206: * DATATYPE BLOCK TYPE
207: * -------- ----------
208: *
209: *
210: * ARRAY ARBLK OR VCBLK
211: *
212: * CODE CDBLK
213: *
214: * EXPRESSION EXBLK OR SEBLK
215: *
216: * INTEGER ICBLK
217: *
218: * NAME NMBLK
219: *
220: * PATTERN P0BLK OR P1BLK OR P2BLK
221: *
222: * REAL RCBLK
223: *
224: * STRING SCBLK
225: *
226: * TABLE TBBLK
227: *
228: * PROGRAM DATATYPE PDBLK
229: EJC
230: *
231: * REPRESENTATION OF VARIABLES
232: * ---------------------------
233: *
234: * DURING THE COURSE OF EVALUATING EXPRESSIONS, IT IS
235: * NECESSARY TO GENERATE NAMES OF VARIABLES (FOR EXAMPLE
236: * ON THE LEFT SIDE OF A BINARY EQUALS OPERATOR). THESE ARE
237: * NOT TO BE CONFUSED WITH OBJECTS OF DATATYPE NAME WHICH
238: * ARE IN FACT VALUES.
239: *
240: * FROM A LOGICAL POINT OF VIEW, SUCH NAMES COULD BE SIMPLY
241: * REPRESENTED BY A POINTER TO THE APPROPRIATE VALUE CELL.
242: * HOWEVER IN THE CASE OF ARRAYS AND PROGRAM DEFINED
243: * DATATYPES, THIS WOULD VIOLATE THE RULE THAT THERE MUST BE
244: * NO POINTERS INTO THE MIDDLE OF A BLOCK IN DYNAMIC STORE.
245: * ACCORDINGLY, A NAME IS ALWAYS REPRESENTED BY A BASE AND
246: * OFFSET. THE BASE POINTS TO THE START OF THE BLOCK
247: * CONTAINING THE VARIABLE VALUE AND THE OFFSET IS THE
248: * OFFSET WITHIN THIS BLOCK IN BYTES. THUS THE ADDRESS
249: * OF THE ACTUAL VARIABLE IS DETERMINED BY ADDING THE BASE
250: * AND OFFSET VALUES.
251: *
252: * THE FOLLOWING ARE THE INSTANCES OF VARIABLES REPRESENTED
253: * IN THIS MANNER.
254: *
255: * 1) NATURAL VARIABLE BASE IS PTR TO VRBLK
256: * OFFSET IS *VRVAL
257: *
258: * 2) TABLE ELEMENT BASE IS PTR TO TEBLK
259: * OFFSET IS *TEVAL
260: *
261: * 3) ARRAY ELEMENT BASE IS PTR TO ARBLK
262: * OFFSET IS OFFSET TO ELEMENT
263: *
264: * 4) VECTOR ELEMENT BASE IS PTR TO VCBLK
265: * OFFSET IS OFFSET TO ELEMENT
266: *
267: * 5) PROG DEF DTP BASE IS PTR TO PDBLK
268: * OFFSET IS OFFSET TO FIELD VALUE
269: *
270: * IN ADDITION THERE ARE TWO CASES OF OBJECTS WHICH ARE
271: * LIKE VARIABLES BUT CANNOT BE HANDLED IN THIS MANNER.
272: * THESE ARE CALLED PSEUDO-VARIABLES AND ARE REPRESENTED
273: * WITH A SPECIAL BASE POINTER AS FOLLOWS=
274: *
275: * EXPRESSION VARIABLE PTR TO EVBLK (SEE EVBLK)
276: *
277: * KEYWORD VARIABLE PTR TO KVBLK (SEE KVBLK)
278: *
279: * PSEUDO-VARIABLES ARE HANDLED AS SPECIAL CASES BY THE
280: * ACCESS PROCEDURE (ACESS) AND THE ASSIGNMENT PROCEDURE
281: * (ASIGN). SEE THESE TWO PROCEDURES FOR DETAILS.
282: EJC
283: *
284: * ORGANIZATION OF DATA AREA
285: * -------------------------
286: *
287: *
288: * THE DATA AREA IS DIVIDED INTO TWO REGIONS.
289: *
290: * STATIC AREA
291: *
292: * THE STATIC AREA BUILDS UP FROM THE BOTTOM AND CONTAINS
293: * DATA AREAS WHICH ARE ALLOCATED DYNAMICALLY BUT ARE NEVER
294: * DELETED OR MOVED AROUND. THE MACRO-PROGRAM ITSELF
295: * USES THE STATIC AREA FOR THE FOLLOWING.
296: *
297: * 1) ALL VARIABLE BLOCKS (VRBLK).
298: *
299: * 2) THE HASH TABLE FOR VARIABLE BLOCKS.
300: *
301: * 3) MISCELLANEOUS BUFFERS AND WORK AREAS (SEE PROGRAM
302: * INITIALIZATION SECTION).
303: *
304: * IN ADDITION, THE SYSTEM PROCEDURES MAY USE THIS AREA FOR
305: * INPUT/OUTPUT BUFFERS, EXTERNAL FUNCTIONS ETC. SPACE IN
306: * THE STATIC REGION IS ALLOCATED BY CALLING PROCEDURE ALOST
307: *
308: * THE FOLLOWING GLOBAL VARIABLES DEFINE THE CURRENT
309: * LOCATION AND SIZE OF THE STATIC AREA.
310: *
311: * STATB ADDRESS OF START OF STATIC AREA
312: * STATE ADDRESS+1 OF LAST WORD IN AREA.
313: *
314: * THE MINIMUM SIZE OF STATIC IS GIVEN APPROXIMATELY BY
315: * 12 + *E$HNB + *E$STS + SPACE FOR ALPHABET STRING
316: * AND STANDARD PRINT BUFFER.
317: EJC
318: *
319: * DYNAMIC AREA
320: *
321: * THE DYNAMIC AREA IS BUILT UPWARDS IN MEMORY AFTER THE
322: * STATIC REGION. DATA IN THIS AREA MUST ALL BE IN STANDARD
323: * BLOCK FORMATS SO THAT IT CAN BE PROCESSED BY THE GARBAGE
324: * COLLECTOR (PROCEDURE GBCOL). GBCOL COMPACTS BLOCKS DOWN
325: * IN THIS REGION AS REQUIRED BY SPACE EXHAUSTION AND CAN
326: * ALSO MOVE ALL BLOCKS UP TO ALLOW FOR EXPANSION OF THE
327: * STATIC REGION.
328: * WITH THE EXCEPTION OF TABLES AND ARRAYS, NO SPITBOL
329: * OBJECT ONCE BUILT IN DYNAMIC MEMORY IS EVER SUBSEQUENTLY
330: * MODIFIED. OBSERVING THIS RULE NECESSITATES A COPYING
331: * ACTION DURING STRING AND PATTERN CONCATENATION.
332: *
333: * GARBAGE COLLECTION IS FUNDAMENTAL TO THE ALLOCATION OF
334: * SPACE FOR VALUES. SPITBOL USES A VERY EFFICIENT GARBAGE
335: * COLLECTOR WHICH INSISTS THAT POINTERS INTO DYNAMIC STORE
336: * SHOULD BE IDENTIFIABLE WITHOUT USE OF BIT TABLES,
337: * MARKER BITS ETC. TO SATISFY THIS REQUIREMENT, DYNAMIC
338: * MEMORY MUST NOT START AT TOO LOW AN ADDRESS AND LENGTHS
339: * OF ARRAYS, TABLES, STRINGS, CODE AND EXPRESSION BLOCKS
340: * MAY NOT EXCEED THE NUMERICAL VALUE OF THE LOWEST DYNAMIC
341: * ADDRESS. TO AVOID EITHER PENALIZING USERS WITH MODEST
342: * REQUIREMENTS OR RESTRICTING THOSE WITH GREATER NEEDS ON
343: * HOST SYSTEMS WHERE DYNAMIC MEMORY IS ALLOCATED IN LOW
344: * ADDRESSES, THE MINIMUM DYNAMIC ADDRESS MAY BE SPECIFIED
345: * SUFFICIENTLY HIGH TO PERMIT ARBITRARILY LARGE SPITBOL
346: * OBJECTS TO BE CREATED ( WITH THE POSSIBILITY IN EXTREME
347: * CASES OF WASTING LARGE AMOUNTS OF MEMORY BELOW THE
348: * START ADDRESS). THIS MINIMUM VALUE IS MADE AVAILABLE
349: * IN VARIABLE MXLEN BY A SYSTEM ROUTINE, SYSMX.
350: * ALTERNATIVELY SYSMX MAY INDICATE THAT A
351: * DEFAULT MAY BE USED IN WHICH DYNAMIC IS PLACED
352: * AT THE LOWEST POSSIBLE ADDRESS FOLLOWING STATIC.
353: *
354: * THE FOLLOWING GLOBAL WORK CELLS DEFINE THE LOCATION AND
355: * LENGTH OF THE DYNAMIC AREA.
356: *
357: * DNAMB START OF DYNAMIC AREA
358: * DNAMP NEXT AVAILABLE LOCATION
359: * DNAME LAST AVAILABLE LOCATION + 1
360: *
361: * DNAMB IS ALWAYS HIGHER THAN STATE SINCE THE ALOST
362: * PROCEDURE MAINTAINS SOME EXPANSION SPACE ABOVE STATE.
363: * *** DNAMB MUST NEVER BE PERMITTED TO HAVE A VALUE LESS
364: * THAN THAT IN MXLEN ***
365: *
366: * SPACE IN THE DYNAMIC REGION IS ALLOCATED BY THE ALLOC
367: * PROCEDURE. THE DYNAMIC REGION MAY BE USED BY SYSTEM
368: * PROCEDURES PROVIDED THAT ALL THE RULES ARE OBEYED.
369: EJC
370: *
371: * REGISTER USAGE
372: * --------------
373: *
374: * (CP) CODE POINTER REGISTER. USED TO
375: * HOLD A POINTER TO THE CURRENT
376: * LOCATION IN THE INTERPRETIVE PSEUDO
377: * CODE (I.E. PTR INTO A CDBLK).
378: *
379: * (XL,XR) GENERAL INDEX REGISTERS. USUALLY
380: * USED TO HOLD POINTERS TO BLOCKS IN
381: * DYNAMIC STORAGE. AN IMPORTANT
382: * RESTRICTION IS THAT THE VALUE IN
383: * XL MUST BE COLLECTABLE FOR
384: * A GARBAGE COLLECT CALL. A VALUE
385: * IS COLLECTABLE IF IT EITHER POINTS
386: * OUTSIDE THE DYNAMIC AREA, OR IF IT
387: * POINTS TO THE START OF A BLOCK IN
388: * THE DYNAMIC AREA.
389: *
390: * (XS) STACK POINTER. USED TO POINT TO
391: * THE STACK FRONT. THE STACK MAY
392: * BUILD UP OR DOWN AND IS USED
393: * TO STACK SUBROUTINE RETURN POINTS
394: * AND OTHER RECURSIVELY SAVED DATA.
395: *
396: * (XT) AN ALTERNATIVE NAME FOR XL DURING
397: * ITS USE IN ACCESSING STACKED ITEMS.
398: *
399: * (WA,WB,WC) GENERAL WORK REGISTERS. CANNOT BE
400: * USED FOR INDEXING, BUT MAY HOLD
401: * VARIOUS TYPES OF DATA.
402: *
403: * (IA) USED FOR ALL SIGNED INTEGER
404: * ARITHMETIC, BOTH THAT USED BY THE
405: * TRANSLATOR AND THAT ARISING FROM
406: * USE OF SNOBOL4 ARITHMETIC OPERATORS
407: *
408: * (RA) REAL ACCUMULATOR. USED FOR ALL
409: * FLOATING POINT ARITHMETIC.
410: EJC
411: *
412: * SPITBOL CONDITIONAL ASSEMBLY SYMBOLS
413: * ------------------------------------
414: *
415: * IN THE SPITBOL TRANSLATOR, THE FOLLOWING CONDITIONAL
416: * ASSEMBLY SYMBOLS ARE REFERRED TO. TO INCORPORATE THE
417: * FEATURES REFERRED TO, THE MINIMAL SOURCE SHOULD BE
418: * PREFACED BY SUITABLE CONDITIONAL ASSEMBLY SYMBOL
419: * DEFINITIONS.
420: * IN ALL CASES IT IS PERMISSIBLE TO DEFAULT THE DEFINITIONS
421: * IN WHICH CASE THE ADDITIONAL FEATURES WILL BE OMITTED
422: * FROM THE TARGET CODE.
423: *
424: * .CASL DEFINE TO INCLUDE 26 SHIFTED LETTRS
425: * .CAHT DEFINE TO INCLUDE HORIZONTAL TAB
426: * .CAVT DEFINE TO INCLUDE VERTICAL TAB
427: * .CIOD IF DEFINED, DEFAULT DELIMITER IS
428: * NOT USED IN PROCESSING 3RD ARG OF
429: * INPUT() AND OUTPUT()
430: * .CNBT DEFINE TO OMIT BATCH INITIALISATION
431: * .CNCI DEFINE TO ENABLE SYSCI ROUTINE
432: * .CNEX DEFINE TO OMIT EXIT() CODE.
433: * .CNLD DEFINE TO OMIT LOAD() CODE.
434: * .CNPF DEFINE TO OMIT PROFILE STUFF
435: * .CNRA DEFINE TO OMIT ALL REAL ARITHMETIC
436: * .CNSR DEFINE TO OMIT SORT, RSORT
437: * .CSAX DEFINE IF SYSAX IS TO BE CALLED
438: * .CSN6 DEFINE TO PAD STMT NOS TO 6 CHARS
439: * .CSN8 DEFINE TO PAD STMT NOS TO 8 CHARS
440: * .CUCF DEFINE TO INCLUDE CFP$U
441: * .CULC DEFINE TO INCLUDE &CASE (LC NAMES)
442: * .CUST DEFINE TO INCLUDE SET() CODE
443: TTL S P I T B O L -- PROCEDURES SECTION
444: *
445: * THIS SECTION STARTS WITH DESCRIPTIONS OF THE OPERATING
446: * SYSTEM DEPENDENT PROCEDURES WHICH ARE USED BY THE SPITBOL
447: * TRANSLATOR. ALL SUCH PROCEDURES HAVE FIVE LETTER NAMES
448: * BEGINNING WITH SYS. THEY ARE LISTED IN ALPHABETICAL
449: * ORDER.
450: * ALL PROCEDURES HAVE A SPECIFICATION CONSISTING OF A
451: * MODEL CALL, PRECEDED BY A POSSIBLY EMPTY LIST OF REGISTER
452: * CONTENTS GIVING PARAMETERS AVAILABLE TO THE PROCEDURE AND
453: * FOLLOWED BY A POSSIBLY EMPTY LIST OF REGISTER CONTENTS
454: * REQUIRED ON RETURN FROM THE CALL OR WHICH MAY HAVE HAD
455: * THEIR CONTENTS DESTROYED. ONLY THOSE REGISTERS EXPLICITLY
456: * MENTIONED IN THE LIST AFTER THE CALL MAY HAVE THEIR
457: * VALUES CHANGED.
458: * THE SEGMENT OF CODE PROVIDING THE EXTERNAL PROCEDURES IS
459: * CONVENIENTLY REFERRED TO AS OSINT (OPERATING SYSTEM
460: * INTERFACE). THE SYSXX PROCEDURES IT CONTAINS PROVIDE
461: * FACILITIES NOT USUALLY AVAILABLE AS PRIMITIVES IN
462: * ASSEMBLY LANGUAGES. FOR PARTICULAR TARGET MACHINES,
463: * IMPLEMENTORS MAY CHOOSE FOR SOME MINIMAL OPCODES WHICH
464: * DO NOT HAVE REASONABLY DIRECT TRANSLATIONS, TO USE CALLS
465: * OF ADDITIONAL PROCEDURES WHICH THEY PROVIDE IN OSINT.
466: * E.G. MWB OR TRC MIGHT BE TRANSLATED AS JSR SYSMB,
467: * JSR SYSTC IN SOME IMPLEMENTATIONS.
468: *
469: * IN THE DESCRIPTIONS, REFERENCE IS MADE TO --BLK
470: * FORMATS (-- = A PAIR OF LETTERS). SEE THE SPITBOL
471: * DEFINITIONS SECTION FOR DETAILED DESCRIPTIONS OF ALL
472: * SUCH BLOCK FORMATS EXCEPT FCBLK FOR WHICH SYSFC SHOULD
473: * BE CONSULTED.
474: *
475: * SECTION 0 CONTAINS INP,INR SPECIFICATIONS OF INTERNAL
476: * PROCEDURES,ROUTINES. THIS GIVES A SINGLE PASS TRANSLATOR
477: * INFORMATION MAKING IT EASY TO GENERATE ALTERNATIVE CALLS
478: * IN THE TRANSLATION OF JSR-S FOR PROCEDURES OF DIFFERENT
479: * TYPES IF THIS PROVES NECESSARY.
480: *
481: SEC START OF PROCEDURES SECTION
482: EJC
483: *
484: * SYSAX -- AFTER EXECUTION
485: *
486: SYSAX EXP DEFINE EXTERNAL ENTRY POINT
487: *
488: * IF THE CONDITIONAL ASSEMBLY SYMBOL .CSAX IS DEFINED,
489: * THIS ROUTINE IS CALLED IMMEDIATELY AFTER EXECUTION AND
490: * BEFORE PRINTING OF EXECUTION STATISTICS OR DUMP OUTPUT.
491: * PURPOSE OF CALL IS FOR IMPLEMENTOR TO DETERMINE AND
492: * IF THE CALL IS NOT REQUIRED IT WILL BE OMITTED IF .CSAX
493: * IS UNDEFINED. IN THIS CASE SYSAX NEED NOT BE CODED.
494: *
495: * JSR SYSAX CALL AFTER EXECUTION
496: EJC
497: *
498: * SYSBX -- BEFORE EXECUTION
499: *
500: SYSBX EXP DEFINE EXTERNAL ENTRY POINT
501: *
502: * CALLED AFTER INITIAL SPITBOL COMPILATION AND BEFORE
503: * COMMENCING EXECUTION IN CASE OSINT NEEDS
504: * TO ASSIGN FILES OR PERFORM OTHER NECESSARY SERVICES.
505: * OSINT MAY ALSO CHOOSE TO SEND A MESSAGE TO ONLINE
506: * TERMINAL (IF ANY) INDICATING THAT EXECUTION IS STARTING.
507: *
508: * JSR SYSBX CALL BEFORE EXECUTION STARTS
509: EJC
510: *
511: * SYSDC -- DATE CHECK
512: *
513: SYSDC EXP DEFINE EXTERNAL ENTRY POINT
514: *
515: * SYSDC IS CALLED TO CHECK THAT THE EXPIRY DATE FOR A TRIAL
516: * VERSION OF SPITBOL IS UNEXPIRED.
517: *
518: * JSR SYSDC CALL TO CHECK DATE
519: * RETURN ONLY IF DATE IS OK
520: EJC
521: *
522: * SYSDM -- DUMP CORE
523: *
524: SYSDM EXP DEFINE EXTERNAL ENTRY POINT
525: *
526: * SYSDM IS CALLED BY A SPITBOL PROGRAM CALL OF DUMP(N) WITH
527: * N GE 3. ITS PURPOSE IS TO PROVIDE A CORE DUMP.
528: * N COULD HOLD AN ENCODING OF THE START ADRS FOR DUMP AND
529: * AMOUNT TO BE DUMPED E.G. N = 256*A + S , S = START ADRS
530: * IN KILOWORDS, A = KILOWORDS TO DUMP
531: *
532: * (XR) PARAMETER N OF CALL DUMP(N)
533: * JSR SYSDM CALL TO ENTER ROUTINE
534: EJC
535: *
536: * SYSDT -- GET CURRENT DATE
537: *
538: SYSDT EXP DEFINE EXTERNAL ENTRY POINT
539: *
540: * SYSDT IS USED TO OBTAIN THE CURRENT DATE. THE DATE IS
541: * RETURNED AS A CHARACTER STRING IN ANY FORMAT APPROPRIATE
542: * TO THE OPERATING SYSTEM IN USE. IT MAY ALSO CONTAIN THE
543: * CURRENT TIME OF DAY. SYSDT IS USED TO IMPLEMENT THE
544: * SNOBOL4 FUNCTION DATE.
545: *
546: * JSR SYSDT CALL TO GET DATE
547: * (XL) POINTER TO BLOCK CONTAINING DATE
548: *
549: * THE FORMAT OF THE BLOCK IS LIKE AN SCBLK EXCEPT THAT
550: * THE FIRST WORD NEED NOT BE SET. THE RESULT IS COPIED
551: * INTO SPITBOL DYNAMIC MEMORY ON RETURN.
552: EJC
553: *
554: * SYSEF -- EJECT FILE
555: *
556: SYSEF EXP DEFINE EXTERNAL ENTRY POINT
557: *
558: * SYSEF IS USED TO WRITE A PAGE EJECT TO A NAMED FILE. IT
559: * MAY ONLY BE USED FOR FILES WHERE THIS CONCEPT MAKES
560: * SENSE. NOTE THAT SYSEF IS NOT NORMALLY USED FOR THE
561: * STANDARD OUTPUT FILE (SEE SYSEP).
562: *
563: * (WA) PTR TO FCBLK OR ZERO
564: * (XR) EJECT ARGUMENT (SCBLK PTR)
565: * JSR SYSEF CALL TO EJECT FILE
566: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST
567: * PPM LOC RETURN HERE IF INAPPROPRIATE FILE
568: * PPM LOC RETURN HERE IF I/O ERROR
569: EJC
570: *
571: * SYSEJ -- END OF JOB
572: *
573: SYSEJ EXP DEFINE EXTERNAL ENTRY POINT
574: *
575: * SYSEJ IS CALLED ONCE AT THE END OF EXECUTION TO
576: * TERMINATE THE RUN. THE SIGNIFICANCE OF THE ABEND AND
577: * CODE VALUES IS SYSTEM DEPENDENT. IN GENERAL, THE CODE
578: * VALUE SHOULD BE MADE AVAILABLE FOR TESTING, AND THE
579: * ABEND VALUE SHOULD CAUSE SOME POST-MORTEM ACTION SUCH AS
580: * A DUMP. NOTE THAT SYSEJ DOES NOT RETURN TO ITS CALLER.
581: * SEE SYSXI FOR DETAILS OF FCBLK CHAIN
582: *
583: * (WA) VALUE OF ABEND KEYWORD
584: * (WB) VALUE OF CODE KEYWORD
585: * (XL) O OR PTR TO HEAD OF FCBLK CHAIN
586: * JSR SYSEJ CALL TO END JOB
587: *
588: * THE FOLLOWING SPECIAL VALUES ARE USED AS CODES IN (WB)
589: * 999 EXECUTION SUPPRESSED
590: * 998 STANDARD OUTPUT FILE FULL OR UNAVAILABLE IN A SYSXI
591: * LOAD MODULE. IN THESE CASES (WA) CONTAINS THE NUMBER
592: * OF THE STATEMENT CAUSING PREMATURE TERMINATION.
593: EJC
594: *
595: * SYSEM -- GET ERROR MESSAGE TEXT
596: *
597: SYSEM EXP DEFINE EXTERNAL ENTRY POINT
598: *
599: * SYSEM IS USED TO OBTAIN THE TEXT OF ERR, ERB CALLS IN THE
600: * SOURCE PROGRAM GIVEN THE ERROR CODE NUMBER. IT IS ALLOWED
601: * TO RETURN A NULL STRING IF THIS FACILITY IS UNAVAILABLE.
602: *
603: * (WA) ERROR CODE NUMBER
604: * JSR SYSEM CALL TO GET TEXT
605: * (XR) TEXT OF MESSAGE
606: *
607: * THE RETURNED VALUE IS A POINTER TO A BLOCK IN SCBLK
608: * FORMAT EXCEPT THAT THE FIRST WORD NEED NOT BE SET. THE
609: * STRING IS COPIED INTO DYNAMIC MEMORY ON RETURN.
610: * IF THE NULL STRING IS RETURNED EITHER BECAUSE SYSEM DOES
611: * NOT PROVIDE ERROR MESSAGE TEXTS OR BECAUSE WA IS OUT OF
612: * RANGE, SPITBOL WILL PRINT THE STRING STORED IN ERRTEXT
613: * KEYWORD.
614: EJC
615: *
616: * SYSEN -- ENDFILE
617: *
618: SYSEN EXP DEFINE EXTERNAL ENTRY POINT
619: *
620: * SYSEN IS USED TO IMPLEMENT THE SNOBOL4 FUNCTION ENDFILE.
621: * THE MEANING IS SYSTEM DEPENDENT. IN GENERAL, ENDFILE
622: * IMPLIES THAT NO FURTHER I/O OPERATIONS WILL BE PERFORMED,
623: * BUT DOES NOT GUARANTEE THIS TO BE THE CASE. THE FILE
624: * SHOULD BE CLOSED AFTER THE CALL, A SUBSEQUENT READ
625: * OR WRITE MAY REOPEN THE FILE AT THE START OR IT MAY BE
626: * NECESSARY TO REOPEN THE FILE VIA SYSIO.
627: *
628: * (WA) PTR TO FCBLK OR ZERO
629: * (XR) ENDFILE ARGUMENT (SCBLK PTR)
630: * JSR SYSEN CALL TO ENDFILE
631: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST
632: * PPM LOC RETURN HERE IF ENDFILE NOT ALLOWED
633: * PPM LOC RETURN HERE IF I/O ERROR
634: * (WA,WB) DESTROYED
635: *
636: * THE SECOND ERROR RETURN IS USED FOR FILES FOR WHICH
637: * ENDFILE IS NOT PERMITTED. FOR EXAMPLE, IT MAY BE EXPECTED
638: * THAT THE STANDARD INPUT AND OUTPUT FILES ARE IN THIS
639: * CATEGORY.
640: EJC
641: *
642: * SYSEP -- EJECT PRINTER PAGE
643: *
644: SYSEP EXP DEFINE EXTERNAL ENTRY POINT
645: *
646: * SYSEP IS CALLED TO PERFORM A PAGE EJECT ON THE STANDARD
647: * PRINTER OUTPUT FILE (CORRESPONDING TO SYSPR OUTPUT).
648: *
649: * JSR SYSEP CALL TO EJECT PRINTER OUTPUT
650: EJC
651: *
652: * SYSEX -- CALL EXTERNAL FUNCTION
653: *
654: SYSEX EXP DEFINE EXTERNAL ENTRY POINT
655: *
656: * SYSEX IS CALLED TO PASS CONTROL TO AN EXTERNAL FUNCTION
657: * PREVIOUSLY LOADED WITH A CALL TO SYSLD.
658: *
659: * (XS) POINTER TO ARGUMENTS ON STACK
660: * (XL) POINTER TO CONTROL BLOCK (EFBLK)
661: * (WA) NUMBER OF ARGUMENTS ON STACK
662: * JSR SYSEX CALL TO PASS CONTROL TO FUNCTION
663: * PPM LOC RETURN HERE IF FUNCTION CALL FAILS
664: * (XS) POPPED PAST ARGUMENTS
665: * (XR) RESULT RETURNED
666: *
667: * THE ARGUMENTS ARE STORED ON THE STACK WITH
668: * THE LAST ARGUMENT AT 0(XS). ON RETURN, XS
669: * IS POPPED PAST THE ARGUMENTS.
670: *
671: * THE FORM OF THE ARGUMENTS AS PASSED IS THAT USED IN THE
672: * SPITBOL TRANSLATOR (SEE DEFINITIONS AND DATA STRUCTURES
673: * SECTION). THE CONTROL BLOCK FORMAT IS ALSO DESCRIBED
674: * (UNDER EFBLK) IN THIS SECTION.
675: *
676: * THERE ARE TWO WAYS OF RETURNING A RESULT.
677: *
678: * 1) RETURN A POINTER TO A BLOCK IN DYNAMIC STORAGE. THIS
679: * BLOCK MUST BE IN EXACTLY CORRECT FORMAT, INCLUDING
680: * THE FIRST WORD. ONLY FUNCTIONS WRITTEN WITH INTIMATE
681: * KNOWLEDGE OF THE SYSTEM WILL RETURN IN THIS WAY.
682: *
683: * 2) STRING, INTEGER AND REAL RESULTS MAY BE RETURNED BY
684: * POINTING TO A PSEUDO-BLOCK OUTSIDE DYNAMIC MEMORY.
685: * THIS BLOCK IS IN ICBLK, RCBLK OR SCBLK FORMAT EXCEPT
686: * THAT THE FIRST WORD WILL BE OVERWRITTEN
687: * BY A TYPE WORD ON RETURN AND SO NEED NOT
688: * BE CORRECTLY SET. SUCH A RESULT IS
689: * COPIED INTO MAIN STORAGE BEFORE PROCEEDING.
690: * UNCONVERTED RESULTS MAY SIMILARLY BE RETURNED IN A
691: * PSEUDO-BLOCK WHICH IS IN CORRECT FORMAT INCLUDING
692: * TYPE WORD RECOGNISABLE BY GARBAGE COLLECTOR SINCE
693: * BLOCK IS COPIED INTO DYNAMIC MEMORY.
694: EJC
695: *
696: * SYSFC -- FILE CONTROL BLOCK ROUTINE
697: *
698: SYSFC EXP DEFINE EXTERNAL ENTRY POINT
699: *
700: * SEE ALSO SYSIO
701: * INPUT AND OUTPUT HAVE 3 ARGUMENTS REFERRED TO AS SHOWN
702: * INPUT(VARIABLE NAME,FILE ARG1,FILE ARG2)
703: * OUTPUT(VARIABLE NAME,FILE ARG1,FILE ARG2)
704: * FILE ARG1 MAY BE AN INTEGER OR STRING USED TO IDENTIFY
705: * AN I/O CHANNEL. IT IS CONVERTED TO A STRING FOR CHECKING.
706: * THE EXACT SIGNIFICANCE OF FILE ARG2
707: * IS NOT RIGOROUSLY PRESCRIBED BUT TO IMPROVE PORTABILITY,
708: * THE SCHEME DESCRIBED IN THE SPITBOL USER MANUAL
709: * SHOULD BE ADOPTED WHEN POSSIBLE. THE PREFERRED FORM IS
710: * A STRING $F$,R$R$,C$C$,I$I$,...,Z$Z$ WHERE
711: * $F$ IS AN OPTIONAL FILE NAME WHICH IS PLACED FIRST.
712: * REMAINING ITEMS MAY BE OMITTED OR INCLUDED IN ANY ORDER.
713: * $R$ IS MAXIMUM RECORD LENGTH
714: * $C$ IS A CARRIAGE CONTROL CHARACTER OR CHARACTER STRING
715: * $I$ IS SOME FORM OF CHANNEL IDENTIFICATION USED IN THE
716: * ABSENCE OF $F$ TO ASSOCIATE THE VARIABLE
717: * WITH A FILE ALLOCATED DYNAMICALLY BY JCL COMMANDS AT
718: * SPITBOL LOAD TIME.
719: * ,...,Z$Z$ ARE ADDITIONAL FIELDS.
720: * IF , (COMMA) CANNOT BE USED AS A DELIMITER, .CIOD
721: * SHOULD BE DEFINED TO INTRODUCE BY CONDITIONAL ASSEMBLY
722: * ANOTHER DELIMITER (SEE
723: * IODEL EQU *
724: * EARLY IN DEFINITIONS SECTION).
725: * SYSFC IS CALLED WHEN A VARIABLE IS INPUT OR OUTPUT
726: * ASSOCIATED TO CHECK FILE ARG1 AND FILE ARG2 AND
727: * TO REPORT WHETHER AN FCBLK (FILE CONTROL
728: * BLOCK) IS NECESSARY AND IF SO WHAT SIZE IT SHOULD BE.
729: * THIS MAKES IT POSSIBLE FOR SPITBOL RATHER THAN OSINT TO
730: * ALLOCATE SUCH A BLOCK IN DYNAMIC MEMORY IF REQUIRED
731: * OR ALTERNATIVELY IN STATIC MEMORY.
732: * THE SIGNIFICANCE OF AN FCBLK , IF ONE IS REQUESTED, IS
733: * ENTIRELY UP TO THE SYSTEM INTERFACE. THE ONLY RESTRICTION
734: * IS THAT IF THE FCBLK SHOULD APPEAR TO LIE IN DYNAMIC
735: * MEMORY , POINTERS TO IT SHOULD BE PROPER POINTERS TO
736: * THE START OF A RECOGNISABLE AND GARBAGE COLLECTABLE
737: * BLOCK (THIS CONDITION WILL BE MET IF SYSFC REQUESTS
738: * SPITBOL TO PROVIDE AN FCBLK).
739: * AN OPTION IS PROVIDED FOR OSINT TO RETURN A POINTER IN
740: * XL TO AN FCBLK WHICH IT PRIVATELY ALLOCATED. THIS PTR
741: * WILL BE MADE AVAILABLE WHEN I/O OCCURS LATER.
742: * PRIVATE FCBLKS MAY HAVE ARBITRARY CONTENTS AND SPITBOL
743: * STORES NOTHING IN THEM.
744: EJC
745: * THE REQUESTED SIZE FOR AN FCBLK IN DYNAMIC MEMORY
746: * SHOULD ALLOW A 2 WORD OVERHEAD FOR BLOCK TYPE AND
747: * LENGTH FIELDS. INFORMATION SUBSEQUENTLY STORED IN THE
748: * REMAINING WORDS MAY BE ARBITRARY IF AN XNBLK (EXTERNAL
749: * NON-RELOCATABLE BLOCK) IS REQUESTED. IF THE REQUEST IS
750: * FOR AN XRBLK (EXTERNAL RELOCATABLE BLOCK) THE
751: * CONTENTS OF WORDS SHOULD BE COLLECTABLE (I.E. ANY
752: * APPARENT POINTERS INTO DYNAMIC SHOULD BE GENUINE BLOCK
753: * POINTERS). THESE RESTRICTIONS DO NOT APPLY IF AN FCBLK
754: * IS ALLOCATED OUTSIDE DYNAMIC OR IS NOT ALLOCATED AT ALL.
755: * IF AN FCBLK IS REQUESTED, ITS FIELDS WILL BE INITIALISED
756: * TO ZERO BEFORE ENTRY TO SYSIO WITH THE EXCEPTION OF
757: * WORDS 0 AND 1 IN WHICH THE BLOCK TYPE AND LENGTH
758: * FIELDS ARE PLACED FOR FCBLKS IN DYNAMIC MEMORY ONLY.
759: * FOR THE POSSIBLE USE OF SYSEJ AND SYSXI, IF FCBLKS
760: * ARE USED, A CHAIN IS BUILT SO THAT THEY MAY ALL BE
761: * FOUND - SEE SYSXI FOR DETAILS.
762: * IF BOTH FILE ARG1 AND FILE ARG2 ARE NULL, CALLS OF SYSFC
763: * AND SYSIO ARE OMITTED.
764: * IF FILE ARG1 IS NULL (STANDARD INPUT/OUTPUT FILE), SYSFC
765: * IS CALLED TO CHECK NON-NULL FILE ARG2 BUT ANY REQUEST
766: * FOR AN FCBLK WILL BE IGNORED, SINCE SPITBOL HANDLES THE
767: * STANDARD FILES SPECIALLY AND CANNOT READILY KEEP FCBLK
768: * POINTERS FOR THEM.
769: * FILEARG1 IS TYPE CHECKED BY SPITBOL SO FURTHER CHECKING
770: * MAY BE UNNECCESSARY IN MANY IMPLEMENTATIONS.
771: * FILE ARG2 IS PASSED SO THAT SYSFC MAY ANALYSE AND
772: * CHECK IT. HOWEVER TO ASSIST IN THIS, SPITBOL ALSO PASSES
773: * ON THE STACK THE COMPONENTS OF THIS ARGUMENT WITH
774: * FILE NAME, $F$ (OTHERWISE NULL) EXTRACTED AND STACKED
775: * FIRST.
776: * THE OTHER FIELDS, IF ANY, ARE EXTRACTED AS SUBSTRINGS,
777: * POINTERS TO THEM ARE STACKED AND A COUNT OF ALL ITEMS
778: * STACKED IS PLACED IN WC. IF AN FCBLK WAS EARLIER
779: * ALLOCATED AND POINTED TO VIA FILE ARG1, SYSFC IS ALSO
780: * PASSED A POINTER TO THIS FCBLK.
781: *
782: * (XL) FILE ARG1 SCBLK PTR (2ND ARG)
783: * (XR) FILEARG2 (3RD ARG) OR NULL
784: * -(XS)...-(XS) SCBLKS FOR $F$,$R$,$C$,...
785: * (WC) NO. OF STACKED SCBLKS ABOVE
786: * (WA) EXISTING FILE ARG1 FCBLK PTR OR 0
787: * (WB) 0/3 FOR INPUT/OUTPUT ASSOCN
788: * JSR SYSFC CALL TO CHECK NEED FOR FCBLK
789: * PPM LOC INVALID FILE ARGUMENT
790: * (XS) POPPED (WC) TIMES
791: * (WA NON ZERO) BYTE SIZE OF REQUESTED FCBLK
792: * (WA=0,XL NON ZERO) PRIVATE FCBLK PTR IN XL
793: * (WA=XL=0) NO FCBLK WANTED, NO PRIVATE FCBLK
794: * (WC) 0/1/2 REQUEST ALLOC OF XRBLK/XNBLK
795: * /STATIC BLOCK FOR USE AS FCBLK
796: * (WB) DESTROYED
797: EJC
798: *
799: * SYSHS -- GIVE ACCESS TO HOST COMPUTER FEATURES
800: *
801: SYSHS EXP DEFINE EXTERNAL ENTRY POINT
802: *
803: * PROVIDES MEANS FOR IMPLEMENTING SPECIAL FEATURES
804: * ON DIFFERENT HOST COMPUTERS. THE ONLY DEFINED ENTRY IS
805: * THAT WHERE ALL ARGUMENTS ARE NULL IN WHICH CASE SYSHS
806: * RETURNS AN SCBLK CONTAINING NAME OF COMPUTER,
807: * NAME OF OPERATING SYSTEM AND NAME OF SITE SEPARATED BY
808: * COLONS. THE SCBLK NEED NOT HAVE A CORRECT FIRST FIELD
809: * AS THIS IS SUPPLIED ON COPYING STRING TO DYNAMIC MEMORY.
810: * SPITBOL DOES NO ARGUMENT CHECKING BUT DOES PROVIDE A
811: * SINGLE ERROR RETURN FOR ARGUMENTS CHECKED AS ERRONEOUS
812: * BY OSINT. IT ALSO PROVIDES A SINGLE EXECUTION ERROR
813: * RETURN. IF THESE ARE INADEQUATE, USE MAY BE MADE OF THE
814: * MINIMAL ERROR SECTION DIRECT AS DESCRIBED IN MINIMAL
815: * DOCUMENTATION, SECTION 10.
816: * SEVERAL NON-ERROR RETURNS ARE PROVIDED. THE FIRST
817: * CORRESPONDS TO THE DEFINED ENTRY OR, FOR IMPLEMENTATION
818: * DEFINED ENTRIES, ANY STRING MAY BE RETURNED. THE OTHERS
819: * PERMIT RESPECTIVELY, RETURN A NULL RESULT, RETURN WITH A
820: * RESULT TO BE STACKED WHICH IS POINTED AT BY XR, AND A
821: * RETURN CAUSING SPITBOL STATEMENT FAILURE. IF A RETURNED
822: * RESULT IS IN DYNAMIC MEMORY IT MUST OBEY GARBAGE
823: * COLLECTOR RULES. THE ONLY RESULTS COPIED ON RETURN
824: * ARE STRINGS RETURNED VIA PPM LOC3 RETURN.
825: *
826: * (WA) ARGUMENT 1
827: * (XL) ARGUMENT 2
828: * (XR) ARGUMENT 3
829: * JSR SYSHS CALL TO GET HOST INFORMATION
830: * PPM LOC1 ERRONEOUS ARG
831: * PPM LOC2 EXECUTION ERROR
832: * PPM LOC3 SCBLK PTR IN XL OR 0 IF UNAVAILABLE
833: * PPM LOC4 RETURN A NULL RESULT
834: * PPM LOC5 RETURN RESULT IN XR
835: * PPM LOC6 CAUSE STATEMENT FAILURE
836: EJC
837: *
838: * SYSID -- RETURN SYSTEM IDENTIFICATION
839: *
840: SYSID EXP DEFINE EXTERNAL ENTRY POINT
841: *
842: * THIS ROUTINE SHOULD RETURN STRINGS TO HEAD THE STANDARD
843: * PRINTER OUTPUT. THE FIRST STRING WILL BE APPENDED TO
844: * A HEADING LINE OF THE FORM
845: * MACRO SPITBOL VERSION V.V
846: * SUPPLIED BY SPITBOL ITSELF. V.V ARE DIGITS GIVING THE
847: * MAJOR VERSION NUMBER AND GENERALLY AT LEAST A MINOR
848: * VERSION NUMBER RELATING TO OSINT SHOULD BE SUPPLIED TO
849: * GIVE SAY
850: * MACRO SPITBOL VERSION V.V(M.M)
851: * THE SECOND STRING SHOULD IDENTIFY AT LEAST THE MACHINE
852: * AND OPERATING SYSTEM. PREFERABLY IT SHOULD INCLUDE
853: * THE DATE AND TIME OF THE RUN.
854: * OPTIONALLY THE STRINGS MAY INCLUDE SITE NAME OF THE
855: * THE IMPLEMENTOR AND/OR MACHINE ON WHICH RUN TAKES PLACE,
856: * UNIQUE SITE OR COPY NUMBER AND OTHER INFORMATION AS
857: * APPROPRIATE WITHOUT MAKING IT SO LONG AS TO BE A
858: * NUISANCE TO USERS.
859: * THE FIRST WORDS OF THE SCBLKS POINTED AT NEED NOT BE
860: * CORRECTLY SET.
861: *
862: * JSR SYSID CALL FOR SYSTEM IDENTIFICATION
863: * (XR) SCBLK PTR FOR ADDITION TO HEADER
864: * (XL) PTR TO SECOND HEADER SCBLK
865: EJC
866: *
867: * SYSIL -- GET INPUT RECORD LENGTH
868: *
869: SYSIL EXP DEFINE EXTERNAL ENTRY POINT
870: *
871: * SYSIL IS USED TO GET THE LENGTH OF THE NEXT INPUT RECORD
872: * FROM A FILE PREVIOUSLY INPUT ASSOCIATED WITH A SYSIO
873: * CALL. THE LENGTH RETURNED IS USED TO ESTABLISH A BUFFER
874: * FOR A SUBSEQUENT SYSIN CALL.
875: *
876: * (WA) PTR TO FCBLK OR ZERO
877: * JSR SYSIL CALL TO GET RECORD LENGTH
878: * (WA) LENGTH OR ZERO IF FILE CLOSED
879: *
880: * NO HARM IS DONE IF THE VALUE RETURNED IS TOO LONG SINCE
881: * UNUSED SPACE WILL BE RECLAIMED AFTER THE SYSIN CALL.
882: *
883: * NOTE THAT IT IS THE SYSIL CALL (NOT THE SYSIO CALL) WHICH
884: * CAUSES THE FILE TO BE OPENED AS REQUIRED FOR THE FIRST
885: * RECORD INPUT FROM THE FILE.
886: EJC
887: *
888: * SYSIN -- READ INPUT RECORD
889: *
890: SYSIN EXP DEFINE EXTERNAL ENTRY POINT
891: *
892: * SYSIN IS USED TO READ A RECORD FROM THE FILE WHICH WAS
893: * REFERENCED IN A PRIOR CALL TO SYSIL (I.E. THESE CALLS
894: * ALWAYS OCCUR IN PAIRS). THE BUFFER PROVIDED IS AN
895: * SCBLK FOR A STRING OF LENGTH SET FROM THE SYSIL CALL.
896: * IF THE ACTUAL LENGTH READ IS LESS THAN THIS, THE LENGTH
897: * FIELD OF THE SCBLK MUST BE MODIFIED BEFORE RETURNING
898: * UNLESS BUFFER IS RIGHT PADDED WITH ZEROES.
899: * IT IS ALSO PERMISSIBLE TO TAKE ANY OF THE ALTERNATIVE
900: * RETURNS AFTER SCBLK LENGTH HAS BEEN MODIFIED.
901: *
902: * (WA) PTR TO FCBLK OR ZERO
903: * (XR) POINTER TO BUFFER (SCBLK PTR)
904: * JSR SYSIN CALL TO READ RECORD
905: * PPM LOC ENDFILE OR NO I/P FILE AFTER SYSXI
906: * PPM LOC RETURN HERE IF I/O ERROR
907: * PPM LOC RETURN HERE IF RECORD FORMAT ERROR
908: * (WA,WB,WC) DESTROYED
909: EJC
910: *
911: * SYSIO -- INPUT/OUTPUT FILE ASSOCIATION
912: *
913: SYSIO EXP DEFINE EXTERNAL ENTRY POINT
914: *
915: * SEE ALSO SYSFC.
916: * SYSIO IS CALLED IN RESPONSE TO A SNOBOL4 INPUT OR OUTPUT
917: * FUNCTION CALL EXCEPT WHEN FILE ARG1 AND FILE ARG2
918: * ARE BOTH NULL.
919: * ITS CALL ALWAYS FOLLOWS IMMEDIATELY AFTER A CALL
920: * OF SYSFC. IF SYSFC REQUESTED ALLOCATION
921: * OF AN FCBLK, ITS ADDRESS WILL BE IN WA.
922: * FOR INPUT FILES, NON-ZERO VALUES OF $R$ SHOULD BE
923: * COPIED TO WC FOR USE IN ALLOCATING INPUT BUFFERS. IF $R$
924: * IS DEFAULTED OR NOT IMPLEMENTED, WC SHOULD BE ZEROISED.
925: * ONCE A FILE HAS BEEN OPENED, SUBSEQUENT INPUT(),OUTPUT()
926: * CALLS IN WHICH THE SECOND ARGUMENT IS IDENTICAL WITH THAT
927: * IN A PREVIOUS CALL, MERELY ASSOCIATE THE ADDITIONAL
928: * VARIABLE NAME (FIRST ARGUMENT) TO THE FILE AND DO NOT
929: * RESULT IN RE-OPENING THE FILE.
930: * IN SUBSEQUENT ASSOCIATED ACCESSES TO THE FILE A POINTER
931: * TO ANY FCBLK ALLOCATED WILL BE MADE AVAILABLE.
932: *
933: * (XL) FILE ARG1 SCBLK PTR (2ND ARG)
934: * (XR) FILE ARG2 SCBLK PTR (3RD ARG)
935: * (WA) FCBLK PTR (0 IF NONE)
936: * (WB) 0 FOR INPUT, 3 FOR OUTPUT
937: * JSR SYSIO CALL TO ASSOCIATE FILE
938: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST
939: * PPM LOC RETURN IF INPUT/OUTPUT NOT ALLOWED
940: * (XL) FCBLK POINTER (0 IF NONE)
941: * (WC) 0 (FOR DEFAULT) OR MAX RECORD LNGTH
942: * (WA,WB) DESTROYED
943: *
944: * THE SECOND ERROR RETURN IS USED IF THE FILE NAMED EXISTS
945: * BUT INPUT/OUTPUT FROM THE FILE IS NOT ALLOWED. FOR
946: * EXAMPLE, THE STANDARD OUTPUT FILE MAY BE IN THIS CATEGORY
947: * AS REGARDS INPUT ASSOCIATION.
948: EJC
949: *
950: * SYSLD -- LOAD EXTERNAL FUNCTION
951: *
952: SYSLD EXP DEFINE EXTERNAL ENTRY POINT
953: *
954: * SYSLD IS CALLED IN RESPONSE TO THE USE OF THE SNOBOL4
955: * LOAD FUNCTION. THE NAMED FUNCTION IS LOADED (WHATEVER
956: * THIS MEANS), AND A POINTER IS RETURNED. THE POINTER WILL
957: * BE USED ON SUBSEQUENT CALLS TO THE FUNCTION (SEE SYSEX).
958: *
959: * (XR) POINTER TO FUNCTION NAME (SCBLK)
960: * (XL) POINTER TO LIBRARY NAME (SCBLK)
961: * JSR SYSLD CALL TO LOAD FUNCTION
962: * PPM LOC RETURN HERE IF FUNC DOES NOT EXIST
963: * PPM LOC RETURN HERE IF I/O ERROR
964: * (XR) POINTER TO LOADED CODE
965: *
966: * THE SIGNIFICANCE OF THE POINTER RETURNED IS UP TO THE
967: * SYSTEM INTERFACE ROUTINE. THE ONLY RESTRICTION IS THAT
968: * IF THE POINTER IS WITHIN DYNAMIC STORAGE, IT MUST BE
969: * A PROPER BLOCK POINTER.
970: EJC
971: *
972: * SYSMM -- GET MORE MEMORY
973: *
974: SYSMM EXP DEFINE EXTERNAL ENTRY POINT
975: *
976: * SYSMM IS CALLED IN AN ATTEMPT TO ALLOCATE MORE DYNAMIC
977: * MEMORY. THIS MEMORY MUST BE ALLOCATED CONTIGUOUSLY WITH
978: * THE CURRENT DYNAMIC DATA AREA.
979: *
980: * THE AMOUNT ALLOCATED IS UP TO THE SYSTEM TO DECIDE. ANY
981: * VALUE IS ACCEPTABLE INCLUDING ZERO IF ALLOCATION IS
982: * IMPOSSIBLE.
983: *
984: * JSR SYSMM CALL TO GET MORE MEMORY
985: * (XR) NUMBER OF ADDITIONAL WORDS OBTAINED
986: EJC
987: *
988: * SYSMX -- SUPPLY MXLEN
989: *
990: SYSMX EXP DEFINE EXTERNAL ENTRY POINT
991: *
992: * BECAUSE OF THE METHOD OF GARBAGE COLLECTION, NO SPITBOL
993: * OBJECT IS ALLOWED TO OCCUPY MORE BYTES OF MEMORY THAN
994: * THE INTEGER GIVING THE LOWEST ADDRESS OF DYNAMIC
995: * (GARBAGE COLLECTABLE) MEMORY. MXLEN IS THE NAME USED TO
996: * REFER TO THIS MAXIMUM LENGTH OF AN OBJECT AND FOR MOST
997: * USERS OF MOST IMPLEMENTATIONS, PROVIDED DYNAMIC MEMORY
998: * STARTS AT AN ADDRESS OF AT LEAST A FEW THOUSAND WORDS,
999: * THERE IS NO PROBLEM.
1000: * IF THE DEFAULT STARTING ADDRESS IS LESS THAN SAY 10000 OR
1001: * 20000, THEN A LOAD TIME OPTION SHOULD BE PROVIDED WHERE A
1002: * USER CAN REQUEST THAT HE BE ABLE TO CREATE LARGER
1003: * OBJECTS. THIS ROUTINE INFORMS SPITBOL OF THIS REQUEST IF
1004: * ANY. THE VALUE RETURNED IS EITHER AN INTEGER
1005: * REPRESENTING THE DESIRED VALUE OF MXLEN (AND HENCE THE
1006: * MINIMUM DYNAMIC STORE ADDRESS WHICH MAY RESULT IN
1007: * NON-USE OF SOME STORE) OR ZERO IF A DEFAULT IS ACCEPTABLE
1008: * IN WHICH MXLEN IS SET TO THE LOWEST ADDRESS ALLOCATED
1009: * TO DYNAMIC STORE BEFORE COMPILATION STARTS.
1010: * IF A NON-ZERO VALUE IS RETURNED, THIS IS USED FOR KEYWORD
1011: * MAXLNGTH. OTHERWISE THE INITIAL LOW ADDRESS OF DYNAMIC
1012: * MEMORY IS USED FOR THIS KEYWORD.
1013: *
1014: * JSR SYSMX CALL TO GET MXLEN
1015: * (WA) EITHER MXLEN OR 0 FOR DEFAULT
1016: EJC
1017: *
1018: * SYSOU -- OUTPUT RECORD
1019: *
1020: SYSOU EXP DEFINE EXTERNAL ENTRY POINT
1021: *
1022: * SYSOU IS USED TO WRITE A RECORD TO A FILE PREVIOUSLY
1023: * ASSOCIATED WITH A SYSIO CALL.
1024: *
1025: * (WA) PTR TO FCBLK OR ZERO
1026: * (XR) RECORD TO BE WRITTEN (SCBLK)
1027: * JSR SYSOU CALL TO OUTPUT RECORD
1028: * PPM LOC FILE FULL OR NO FILE AFTER SYSXI
1029: * PPM LOC RETURN HERE IF I/O ERROR
1030: * (WA,WB,WC) DESTROYED
1031: *
1032: * NOTE THAT IT IS THE SYSOU CALL (NOT THE SYSIO CALL) WHICH
1033: * CAUSES THE FILE TO BE OPENED AS REQUIRED FOR THE FIRST
1034: * RECORD OUTPUT TO THE FILE.
1035: EJC
1036: *
1037: * SYSPI -- PRINT ON INTERACTIVE CHANNEL
1038: *
1039: SYSPI EXP DEFINE EXTERNAL ENTRY POINT
1040: *
1041: * IF SPITBOL IS RUN FROM AN ONLINE TERMINAL, OSINT CAN
1042: * REQUEST THAT MESSAGES SUCH AS COPIES OF COMPILATION
1043: * ERRORS BE SENT TO THE TERMINAL (SEE SYSPP). IF RELEVANT
1044: * REPLY WAS MADE BY SYSPP THEN SYSPI IS CALLED TO SEND SUCH
1045: * MESSAGES TO THE INTERACTIVE CHANNEL.
1046: * SYSPI IS ALSO USED FOR SENDING OUTPUT TO THE TERMINAL
1047: * THROUGH THE SPECIAL VARIABLE NAME, TERMINAL.
1048: *
1049: * (XR) PTR TO LINE BUFFER (SCBLK)
1050: * (WA) LINE LENGTH
1051: * JSR SYSPI CALL TO PRINT LINE
1052: * PPM LOC FAILURE RETURN
1053: * (WA,WB) DESTROYED
1054: EJC
1055: *
1056: * SYSPP -- OBTAIN PRINT PARAMETERS
1057: *
1058: SYSPP EXP DEFINE EXTERNAL ENTRY POINT
1059: *
1060: * SYSPP IS CALLED ONCE DURING COMPILATION TO OBTAIN
1061: * PARAMETERS REQUIRED FOR CORRECT PRINTED OUTPUT FORMAT
1062: * AND TO SELECT OTHER OPTIONS. IT MAY ALSO BE CALLED AGAIN
1063: * AFTER SYSXI WHEN A LOAD MODULE IS RESUMED. IN THIS
1064: * CASE THE VALUE RETURNED IN WA MAY BE LESS THAN OR EQUAL
1065: * TO THAT RETURNED IN INITIAL CALL BUT MAY NOT BE
1066: * GREATER.
1067: * THE INFORMATION RETURNED IS -
1068: * 1. LINE LENGTH IN CHARS FOR STANDARD PRINT FILE
1069: * 2. NO OF LINES/PAGE. 0 IS PREFERABLE FOR A NON-PAGED
1070: * DEVICE (E.G. ONLINE TERMINAL) IN WHICH CASE LISTING
1071: * PAGE THROWS ARE SUPPRESSED AND PAGE HEADERS
1072: * RESULTING FROM -TITLE,-STITL LINES ARE KEPT SHORT.
1073: * 3. AN INITIAL -NOLIST OPTION TO SUPPRESS LISTING UNLESS
1074: * THE PROGRAM CONTAINS AN EXPLICIT -LIST.
1075: * 4. OPTIONS TO SUPPRESS LISTING OF COMPILATION AND/OR
1076: * EXECUTION STATS (USEFUL FOR ESTABLISHED PROGRAMS) -
1077: * COMBINED WITH 3. GIVES POSSIBILITY OF LISTING
1078: * FILE NEVER BEING OPENED.
1079: * 5. OPTION TO HAVE COPIES OF ERRORS SENT TO AN
1080: * INTERACTIVE CHANNEL IN ADDITION TO STANDARD PRINTER.
1081: * 6. OPTION TO KEEP PAGE HEADERS SHORT (E.G. IF LISTING
1082: * TO AN ONLINE TERMINAL).
1083: * 7. AN OPTION TO CHOOSE EXTENDED OR COMPACT LISTING
1084: * FORMAT. IN THE FORMER A PAGE EJECT AND IN THE LATTER
1085: * A FEW LINE FEEDS PRECEDE THE PRINTING OF EACH
1086: * OF-- LISTING, COMPILATION STATISTICS, EXECUTION
1087: * OUTPUT AND EXECUTION STATISTICS.
1088: * 8. AN OPTION TO SUPPRESS EXECUTION AS THOUGH A
1089: * -NOEXECUTE CARD WERE SUPPLIED.
1090: * 9. AN OPTION TO REQUEST THAT NAME /TERMINAL/ BE PRE-
1091: * ASSOCIATED TO AN ONLINE TERMINAL VIA SYSPI AND SYSRI
1092: * 10. AN INTERMEDIATE (STANDARD) LISTING OPTION REQUIRING
1093: * THAT PAGE EJECTS OCCUR IN SOURCE LISTINGS. REDUNDANT
1094: * IF EXTENDED OPTION CHOSEN BUT PARTIALLY EXTENDS
1095: * COMPACT OPTION.
1096: * 11. OPTION TO SUPPRESS SYSID IDENTIFICATION.
1097: *
1098: * JSR SYSPP CALL TO GET PRINT PARAMETERS
1099: * (WA) PRINT LINE LENGTH IN CHARS
1100: * (WB) NUMBER OF LINES/PAGE
1101: * (WC) BITS VALUE ...JIHGFEDCBA WHERE
1102: * A = 1 TO SEND ERROR COPY TO INT.CH.
1103: * B = 1 MEANS STD PRINTER IS INT. CH.
1104: * C = 1 FOR -NOLIST OPTION
1105: * D = 1 TO SUPPRESS COMPILN. STATS
1106: * E = 1 TO SUPPRESS EXECN. STATS
1107: * F = 1/0 FOR EXTNDED/COMPACT LISTING
1108: * G = 1 FOR -NOEXECUTE
1109: * H = 1 PRE-ASSOCIATE /TERMINAL/
1110: * I = 1 FOR STANDARD LISTING OPTION.
1111: * J = 1 SUPPRESSES LISTING HEADER
1112: EJC
1113: *
1114: * SYSPR -- PRINT LINE ON STANDARD OUTPUT FILE
1115: *
1116: SYSPR EXP DEFINE EXTERNAL ENTRY POINT
1117: *
1118: * SYSPR IS USED TO PRINT A SINGLE LINE ON THE STANDARD
1119: * OUTPUT FILE.
1120: *
1121: * (XR) POINTER TO LINE BUFFER (SCBLK)
1122: * (WA) LINE LENGTH
1123: * JSR SYSPR CALL TO PRINT LINE
1124: * PPM LOC TOO MUCH O/P OR NO FILE AFTER SYSXI
1125: * (WA,WB) DESTROYED
1126: *
1127: * THE BUFFER POINTED TO IS THE LENGTH OBTAINED FROM THE
1128: * SYSPP CALL AND IS FILLED OUT WITH TRAILING BLANKS. THE
1129: * VALUE IN WA IS THE ACTUAL LINE LENGTH WHICH MAY BE LESS
1130: * THAN THE MAXIMUM LINE LENGTH POSSIBLE. THERE IS NO SPACE
1131: * CONTROL ASSOCIATED WITH THE LINE, ALL LINES ARE PRINTED
1132: * SINGLE SPACED. NOTE THAT NULL LINES (WA=0) ARE POSSIBLE
1133: * IN WHICH CASE A BLANK LINE IS TO BE PRINTED.
1134: *
1135: * THE ERROR EXIT IS USED FOR SYSTEMS WHICH LIMIT THE AMOUNT
1136: * OF PRINTED OUTPUT. IF POSSIBLE, PRINTING SHOULD BE
1137: * PERMITTED AFTER THIS CONDITION HAS BEEN SIGNALLED ONCE TO
1138: * ALLOW FOR DUMP AND OTHER DIAGNOSTIC INFORMATION.
1139: * ASSUMING THIS TO BE POSSIBLE, SPITBOL MAY MAKE MORE SYSPR
1140: * CALLS. IF THE ERROR RETURN OCCURS ANOTHER TIME, EXECUTION
1141: * IS TERMINATED BY A CALL OF SYSEJ WITH ENDING CODE 998.
1142: EJC
1143: *
1144: * SYSRD -- READ RECORD FROM STANDARD INPUT FILE
1145: *
1146: SYSRD EXP DEFINE EXTERNAL ENTRY POINT
1147: *
1148: * SYSRD IS USED TO READ A RECORD FROM THE STANDARD INPUT
1149: * FILE. THE BUFFER PROVIDED IS AN SCBLK FOR A STRING THE
1150: * LENGTH OF WHICH IN CHARACTERS IS GIVEN IN WC, THIS
1151: * CORRESPONDING TO THE MAXIMUM LENGTH OF STRING WHICH
1152: * SPITBOL IS PREPARED TO RECEIVE. AT COMPILE TIME IT
1153: * CORRESPONDS TO XXX IN THE MOST RECENT -INXXX CARD
1154: * (DEFAULT 72) AND AT EXECUTION TIME TO THE MOST RECENT
1155: * ,R$R$ (RECORD LENGTH) IN THE THIRD ARG OF AN INPUT()
1156: * STATEMENT FOR THE STANDARD INPUT FILE (DEFAULT 80).
1157: * IF FEWER THAN (WC) CHARACTERS ARE READ, THE LENGTH
1158: * FIELD OF THE SCBLK MUST BE ADJUSTED BEFORE RETURNING
1159: * UNLESS THE BUFFER IS RIGHT PADDED WITH ZEROES.
1160: * IT IS ALSO PERMISSIBLE TO TAKE THE ALTERNATIVE RETURN
1161: * AFTER SUCH AN ADJUSTMENT HAS BEEN MADE.
1162: * SPITBOL MAY CONTINUE TO MAKE CALLS AFTER AN ENDFILE
1163: * RETURN SO THIS ROUTINE SHOULD BE PREPARED TO MAKE
1164: * REPEATED ENDFILE RETURNS.
1165: *
1166: * (XR) POINTER TO BUFFER (SCBLK PTR)
1167: * (WC) LENGTH OF BUFFER IN CHARACTERS
1168: * JSR SYSRD CALL TO READ LINE
1169: * PPM LOC ENDFILE OR NO I/P FILE AFTER SYSXI
1170: * (WA,WB,WC) DESTROYED
1171: EJC
1172: *
1173: * SYSRI -- READ RECORD FROM INTERACTIVE CHANNEL
1174: *
1175: SYSRI EXP DEFINE EXTERNAL ENTRY POINT
1176: *
1177: * READS A RECORD FROM ONLINE TERMINAL FOR SPITBOL VARIABLE,
1178: * TERMINAL. IF ONLINE TERMINAL IS UNAVAILABLE THEN CODE THE
1179: * ENDFILE RETURN ONLY.
1180: * THE BUFFER PROVIDED IS OF LENGTH 120 CHARACTERS. SYSRI
1181: * SHOULD REPLACE THE COUNT IN THE SECOND WORD OF THE SCBLK
1182: * BY THE ACTUAL CHARACTER COUNT UNLESS BUFFER IS RIGHT
1183: * PADDED WITH ZEROES.
1184: * IT IS ALSO PERMISSIBLE TO TAKE THE ALTERNATIVE
1185: * RETURN AFTER ADJUSTING THE COUNT.
1186: * THE END OF FILE RETURN MAY BE USED IF THIS MAKES
1187: * SENSE ON THE TARGET MACHINE (E.G. IF THERE IS AN
1188: * EOF CHARACTER.)
1189: *
1190: * (XR) PTR TO 120 CHAR BUFFER (SCBLK PTR)
1191: * JSR SYSRI CALL TO READ LINE FROM TERMINAL
1192: * PPM LOC END OF FILE RETURN
1193: * (WA,WB,WC) MAY BE DESTROYED
1194: EJC
1195: *
1196: * SYSRW -- REWIND FILE
1197: *
1198: SYSRW EXP DEFINE EXTERNAL ENTRY POINT
1199: *
1200: * SYSRW IS USED TO REWIND A FILE I.E. REPOSITION THE FILE
1201: * AT THE START BEFORE THE FIRST RECORD. THE FILE SHOULD BE
1202: * CLOSED AND THE NEXT READ OR WRITE CALL WILL OPEN THE
1203: * FILE AT THE START.
1204: *
1205: * (WA) PTR TO FCBLK OR ZERO
1206: * (XR) REWIND ARG (SCBLK PTR)
1207: * JSR SYSRW CALL TO REWIND FILE
1208: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST
1209: * PPM LOC RETURN HERE IF REWIND NOT ALLOWED
1210: * PPM LOC RETURN HERE IF I/O ERROR
1211: EJC
1212: *
1213: * SYSST -- SET FILE POINTER
1214: *
1215: SYSST EXP DEFINE EXTERNAL ENTRY POINT
1216: *
1217: * SYSST IS CALLED TO CHANGE THE POSITION OF A FILE
1218: * POINTER. THIS IS ACCOMPLISHED IN A SYSTEM DEPENDENT
1219: * MANNER, AND THUS THE 2ND AND 3RD ARGUMENTS ARE PASSED
1220: * UNCONVERTED.
1221: *
1222: * (WA) FCBLK POINTER
1223: * (WB) 2ND ARGUMENT
1224: * (WC) 3RD ARGUMENT
1225: * JSR SYSST CALL TO SET FILE POINTER
1226: * PPM LOC RETURN HERE IF INVALID 2ND ARG
1227: * PPM LOC RETURN HERE IF INVALID 3RD ARG
1228: * PPM LOC RETURN HERE IF FILE DOES NOT EXIST
1229: * PPM LOC RETURN HERE IF SET NOT ALLOWED
1230: * PPM LOC RETURN HERE IF I/O ERROR
1231: *
1232: EJC
1233: *
1234: * SYSTM -- GET EXECUTION TIME SO FAR
1235: *
1236: SYSTM EXP DEFINE EXTERNAL ENTRY POINT
1237: *
1238: * SYSTM IS USED TO OBTAIN THE AMOUNT OF EXECUTION TIME
1239: * USED SO FAR SINCE SPITBOL WAS GIVEN CONTROL. THE UNITS
1240: * ARE DESCRIBED AS MILLISECONDS IN THE SPITBOL OUTPUT, BUT
1241: * THE EXACT MEANING IS SYSTEM DEPENDENT. WHERE APPROPRIATE,
1242: * THIS VALUE SHOULD RELATE TO PROCESSOR RATHER THAN CLOCK
1243: * TIMING VALUES.
1244: *
1245: * JSR SYSTM CALL TO GET TIMER VALUE
1246: * (IA) TIME SO FAR IN MILLISECONDS
1247: EJC
1248: *
1249: * SYSTT -- TRACE TOGGLE
1250: *
1251: SYSTT EXP DEFINE EXTERNAL ENTRY POINT
1252: *
1253: * CALLED BY SPITBOL FUNCTION TRACE() WITH NO ARGS TO
1254: * TOGGLE THE SYSTEM TRACE SWITCH. THIS PERMITS TRACING OF
1255: * LABELS IN SPITBOL CODE TO BE TURNED ON OR OFF.
1256: *
1257: * JSR SYSTT CALL TO TOGGLE TRACE SWITCH
1258: EJC
1259: *
1260: * SYSUL -- UNLOAD EXTERNAL FUNCTION
1261: *
1262: SYSUL EXP DEFINE EXTERNAL ENTRY POINT
1263: *
1264: * SYSUL IS USED TO UNLOAD A FUNCTION PREVIOUSLY
1265: * LOADED WITH A CALL TO SYSLD.
1266: *
1267: * (XR) PTR TO CONTROL BLOCK (EFBLK)
1268: * JSR SYSUL CALL TO UNLOAD FUNCTION
1269: *
1270: * THE FUNCTION CANNOT BE CALLED FOLLOWING A SYSUL CALL
1271: * UNTIL ANOTHER SYSLD CALL IS MADE FOR THE SAME FUNCTION.
1272: *
1273: * THE EFBLK CONTAINS THE FUNCTION CODE POINTER AND ALSO A
1274: * POINTER TO THE VRBLK CONTAINING THE FUNCTION NAME (SEE
1275: * DEFINITIONS AND DATA STRUCTURES SECTION).
1276: EJC
1277: *
1278: * SYSXI -- EXIT TO PRODUCE LOAD MODULE
1279: *
1280: SYSXI EXP DEFINE EXTERNAL ENTRY POINT
1281: *
1282: * WHEN SYSXI IS CALLED, XL CONTAINS EITHER A STRING POINTER
1283: * OR ZERO. IN THE FORMER CASE, THE STRING GIVES THE
1284: * CHARACTER NAME OF A PROGRAM. THE INTENTION IS THAT
1285: * SPITBOL EXECUTION SHOULD BE TERMINATED FORTHWITH AND
1286: * THE NAMED PROGRAM LOADED AND EXECUTED. THIS TYPE OF CHAIN
1287: * EXECUTION IS VERY SYSTEM DEPENDENT AND IMPLEMENTORS MAY
1288: * CHOOSE TO OMIT IT OR FIND IT IMPOSSIBLE TO PROVIDE.
1289: * IF (XL) IS ZERO,IA CONTAINS ONE OF THE FOLLOWING INTEGERS
1290: *
1291: * -1, -2, -3
1292: * CREATE IF POSSIBLE A LOAD MODULE CONTAINING ONLY THE
1293: * IMPURE AREA OF MEMORY WHICH NEEDS TO BE LOADED WITH
1294: * A COMPATIBLE PURE SEGMENT FOR SUBSEQUENT EXECUTIONS.
1295: * VERSION NUMBERS TO CHECK COMPATIBILITY SHOULD BE
1296: * KEPT IN BOTH SEGMENTS AND CHECKED ON LOADING.
1297: * TO ASSIST WITH THIS CHECK, (XR) ON ENTRY IS A
1298: * POINTER TO AN SCBLK CONTAINING THE SPITBOL MAJOR
1299: * VERSION NUMBER V.V (SEE SYSID).
1300: *
1301: * 0 IF POSSIBLE, RETURN CONTROL TO JOB CONTROL
1302: * COMMAND LEVEL. THE EFFECT IF AVAILABLE WILL BE
1303: * SYSTEM DEPENDENT.
1304: *
1305: * +1, +2, +3
1306: * CREATE IF POSSIBLE A LOAD MODULE FROM ALL OF
1307: * MEMORY. IT SHOULD BE POSSIBLE TO LOAD AND EXECUTE
1308: * THIS MODULE DIRECTLY.
1309: *
1310: * IN THE CASE OF SAVED LOAD MODULES, THE STATUS OF OPEN
1311: * FILES IS NOT PRESERVED AND IMPLEMENTORS MAY CHOOSE TO
1312: * OFFER MEANS OF ATTACHING FILES BEFORE EXECUTION OF LOAD
1313: * MODULES STARTS OR LEAVE IT TO THE USER TO INCLUDE
1314: * SUITABLE INPUT(), OUTPUT() CALLS IN HIS PROGRAM.
1315: * SYSXI SHOULD MAKE A NOTE THAT NO I/O CHANNELS,
1316: * INCLUDING STANDARD FILES, HAVE FILES ATTACHED SO THAT
1317: * CALLS OF SYSIN, SYSOU, SYSPR, SYSRD SHOULD FAIL UNLESS
1318: * NEW ASSOCIATIONS ARE MADE FOR THE LOAD MODULE.
1319: * AT LEAST IN THE CASE OF THE STANDARD OUTPUT FILE, IT IS
1320: * RECOMMENDED THAT EITHER THE USER BE REQUIRED TO ATTACH
1321: * A FILE OR THAT A DEFAULT FILE IS ATTACHED, SINCE THE
1322: * PROBLEM OF ERROR MESSAGES GENERATED BY THE LOAD MODULE
1323: * IS OTHERWISE SEVERE. AS A LAST RESORT, IF SPITBOL
1324: * ATTEMPTS TO WRITE TO THE STANDARD OUTPUT FILE AND GETS A
1325: * REPLY INDICATING THAT SUCH OUPUT IS UNACCEPTABLE IT STOPS
1326: * BY USING AN ENTRY TO SYSEJ WITH ENDING CODE 998.
1327: * AS DESCRIBED BELOW, PASSING OF SOME ARGUMENTS MAKES IT
1328: * CLEAR THAT LOAD MODULE WILL USE A STANDARD OUTPUT FILE.
1329: *
1330: * IF USE IS MADE OF FCBLKS FOR I/O ASSOCIATION, SPITBOL
1331: * BUILDS A CHAIN SO THAT THOSE IN USE MAY BE FOUND IN SYSXI
1332: * AND SYSEJ. THE NODES ARE 4 WORDS LONG. THIRD WORD
1333: * CONTAINS LINK TO NEXT NODE OR 0, FOURTH WORD CONTAINS
1334: * FCBLK POINTER.
1335: EJC
1336: *
1337: * SYSXI (CONTINUED)
1338: *
1339: * (XL) ZERO OR SCBLK PTR
1340: * (XR) PTR TO V.V SCBLK
1341: * (IA) SIGNED INTEGER ARGUMENT
1342: * (WB) 0 OR PTR TO HEAD OF FCBLK CHAIN
1343: * JSR SYSXI CALL TO EXIT
1344: * PPM LOC REQUESTED ACTION NOT POSSIBLE
1345: * PPM LOC ACTION CAUSED IRRECOVERABLE ERROR
1346: * (REGISTERS) SHOULD BE PRESERVED OVER CALL
1347: *
1348: * LOADING AND RUNNING THE LOAD MODULE OR RETURNING FROM
1349: * JCL COMMAND LEVEL CAUSES EXECUTION TO RESUME AT THE POINT
1350: * AFTER THE ERROR RETURNS WHICH FOLLOW THE CALL OF SYSXI.
1351: * THE VALUE PASSED AS EXIT ARGUMENT IS USED TO INDICATE
1352: * OPTIONS REQUIRED ON RESUMPTION OF LOAD MODULE.
1353: * +1 OR -1 REQUIRE THAT ON RESUMPTION, SYSID AND SYSPP BE
1354: * CALLED AND A HEADING PRINTED ON THE STANDARD OUTPUT FILE.
1355: * +2 OR -2 INDICATE THAT SYSPP WILL BE CALLED BUT NOT SYSID
1356: * AND NO HEADING WILL BE PUT ON STANDARD OUTPUT FILE.
1357: * ABOVE OPTIONS HAVE THE OBVIOUS IMPLICATION THAT A
1358: * STANDARD O/P FILE MUST BE PROVIDED FOR THE LOAD MODULE.
1359: * +3 OR -3 INDICATE CALLS OF NEITHER SYSID NOR SYSPP
1360: * AND NO HEADING WILL BE PLACED ON STANDARD OUTPUT FILE.
1361: * NO RETURN FROM SYSXI IS POSSIBLE IF ANOTHER PROGRAM
1362: * IS LOADED AND ENTERED.
1363: EJC
1364: *
1365: * INTRODUCE THE INTERNAL PROCEDURES.
1366: *
1367: ACESS INP R,1
1368: ACOMP INP N,5
1369: ALLOC INP E,0
1370: ALOBF INP E,0
1371: ALOCS INP E,0
1372: ALOST INP E,0
1373: APNDB INP E,2
1374: ARITH INP N,3
1375: ASIGN INP R,1
1376: ASINP INP R,1
1377: BLKLN INP E,0
1378: CDGCG INP E,0
1379: CDGEX INP R,0
1380: CDGNM INP R,0
1381: CDGVL INP R,0
1382: CDWRD INP E,0
1383: CMGEN INP R,0
1384: CMPIL INP E,0
1385: CNCRD INP E,0
1386: COPYB INP N,1
1387: DFFNC INP E,0
1388: DTACH INP E,0
1389: DTYPE INP E,0
1390: DUMPR INP E,0
1391: ERMSG INP E,0
1392: ERTEX INP E,0
1393: EVALI INP R,4
1394: EVALP INP R,1
1395: EVALS INP R,3
1396: EVALX INP R,1
1397: EXBLD INP E,0
1398: EXPAN INP E,0
1399: EXPAP INP E,1
1400: EXPDM INP N,0
1401: EXPOP INP N,0
1402: FLSTG INP R,0
1403: GBCOL INP E,0
1404: GBCPF INP E,0
1405: GTARR INP E,1
1406: EJC
1407: GTCOD INP E,1
1408: GTEXP INP E,1
1409: GTINT INP E,1
1410: GTNUM INP E,1
1411: GTNVR INP E,1
1412: GTPAT INP E,1
1413: GTREA INP E,1
1414: GTSMI INP N,2
1415: GTSTG INP N,1
1416: GTVAR INP E,1
1417: HASHS INP E,0
1418: ICBLD INP E,0
1419: IDENT INP E,1
1420: INOUT INP E,0
1421: INSBF INP E,2
1422: IOFCB INP N,2
1423: IOPPF INP N,0
1424: IOPUT INP N,6
1425: KTREX INP R,0
1426: KWNAM INP N,0
1427: LCOMP INP N,5
1428: LISTR INP E,0
1429: LISTT INP E,0
1430: NEXTS INP E,0
1431: PATIN INP N,2
1432: PATST INP N,1
1433: PBILD INP E,0
1434: PCONC INP E,0
1435: PCOPY INP N,0
1436: PRFLR INP E,0
1437: PRFLU INP E,0
1438: PRPAR INP E,0
1439: PRTCH INP E,0
1440: PRTIC INP E,0
1441: PRTIS INP E,0
1442: PRTIN INP E,0
1443: PRTMI INP E,0
1444: PRTMX INP E,0
1445: PRTNL INP R,0
1446: PRTNM INP R,0
1447: PRTNV INP E,0
1448: PRTPG INP E,0
1449: PRTPS INP E,0
1450: PRTSN INP E,0
1451: PRTST INP R,0
1452: EJC
1453: PRTTR INP E,0
1454: PRTVL INP R,0
1455: PRTVN INP E,0
1456: RCBLD INP E,0
1457: READR INP E,0
1458: SBSTR INP E,0
1459: SCANE INP E,0
1460: SCNGF INP E,0
1461: SETVR INP E,0
1462: SORTA INP N,0
1463: SORTC INP E,1
1464: SORTF INP E,0
1465: SORTH INP E,0
1466: TFIND INP E,1
1467: TRACE INP N,2
1468: TRBLD INP E,0
1469: TRIMR INP E,0
1470: TRXEQ INP R,0
1471: XSCAN INP E,0
1472: XSCNI INP N,2
1473: *
1474: * INTRODUCE THE INTERNAL ROUTINES
1475: *
1476: ARREF INR
1477: CFUNC INR
1478: EXFAL INR
1479: EXINT INR
1480: EXITS INR
1481: EXIXR INR
1482: EXNAM INR
1483: EXNUL INR
1484: EXREA INR
1485: EXSID INR
1486: EXVNM INR
1487: FAILP INR
1488: FLPOP INR
1489: INDIR INR
1490: MATCH INR
1491: RETRN INR
1492: STCOV INR
1493: STMGO INR
1494: STOPR INR
1495: SUCCP INR
1496: SYSAB INR
1497: SYSTU INR
1498: TTL S P I T B O L -- DEFINITIONS AND DATA STRUCTURES
1499: SEC START OF DEFINITIONS SECTION
1500: *
1501: * DEFINITIONS OF MACHINE PARAMETERS
1502: *
1503: * THE MINIMAL TRANSLATOR SHOULD SUPPLY APPROPRIATE VALUES
1504: * FOR THE PARTICULAR TARGET MACHINE FOR ALL THE
1505: * EQU *
1506: * DEFINITIONS GIVEN AT THE START OF THIS SECTION.
1507: *
1508: CFP$A EQU * NUMBER OF CHARACTERS IN ALPHABET
1509: *
1510: CFP$B EQU * BYTES/WORD ADDRESSING FACTOR
1511: *
1512: CFP$C EQU * NUMBER OF CHARACTERS PER WORD
1513: *
1514: CFP$F EQU * OFFSET IN BYTES TO CHARS IN
1515: * SCBLK. SEE SCBLK FORMAT.
1516: *
1517: CFP$I EQU * NUMBER OF WORDS IN INTEGER CONSTANT
1518: *
1519: CFP$M EQU * MAX POSITIVE INTEGER IN ONE WORD
1520: *
1521: CFP$N EQU * NUMBER OF BITS IN ONE WORD
1522: *
1523: * THE FOLLOWING DEFINITIONS REQUIRE THE SUPPLY OF EITHER
1524: * A SINGLE PARAMETER IF REAL ARITHMETIC IS OMITTED OR
1525: * THREE PARAMETERS IF REAL ARITHMETIC IS INCLUDED.
1526: *
1527: *
1528: CFP$R EQU * NUMBER OF WORDS IN REAL CONSTANT
1529: *
1530: CFP$S EQU * NUMBER OF SIG DIGS FOR REAL OUTPUT
1531: *
1532: CFP$X EQU * MAX DIGITS IN REAL EXPONENT
1533: *
1534: MXDGS EQU CFP$S+CFP$X MAX DIGITS IN REAL NUMBER
1535: *
1536: NSTMX EQU MXDGS+5 MAX SPACE FOR REAL (FOR +0.E+)
1537: *
1538: * THE FOLLOWING DEFINITION FOR CFP$U SUPPLIES A REALISTIC
1539: * UPPER BOUND ON THE SIZE OF THE ALPHABET. CFP$U IS USED
1540: * TO SAVE SPACE IN THE SCANE BSW-IFF-ESW TABLE AND TO EASE
1541: * TRANSLATION STORAGE REQUIREMENTS.
1542: *
1543: CFP$U EQU * REALISTIC UPPER BOUND ON ALPHABET
1544: EJC
1545: *
1546: * ENVIRONMENT PARAMETERS
1547: *
1548: * THE SPITBOL PROGRAM IS ESSENTIALLY INDEPENDENT OF
1549: * THE DEFINITIONS OF THESE PARAMETERS. HOWEVER, THE
1550: * EFFICIENCY OF THE SYSTEM MAY BE AFFECTED. CONSEQUENTLY,
1551: * THESE PARAMETERS MAY REQUIRE TUNING FOR A GIVEN VERSION
1552: * THE VALUES GIVEN IN COMMENTS HAVE BEEN SUCCESSFULLY USED.
1553: *
1554: * E$SRS IS THE NUMBER OF WORDS TO RESERVE AT THE END OF
1555: * STORAGE FOR END OF RUN PROCESSING. IT SHOULD BE
1556: * SET AS SMALL AS POSSIBLE WITHOUT CAUSING MEMORY OVERFLOW
1557: * IN CRITICAL SITUATIONS (E.G. MEMORY OVERFLOW TERMINATION)
1558: * AND SHOULD THUS RESERVE SUFFICIENT SPACE AT LEAST FOR
1559: * AN SCBLK CONTAINING SAY 30 CHARACTERS.
1560: *
1561: E$SRS EQU * 30 WORDS
1562: *
1563: * E$STS IS THE NUMBER OF WORDS GRABBED IN A CHUNK WHEN
1564: * STORAGE IS ALLOCATED IN THE STATIC REGION. THE MINIMUM
1565: * PERMITTED VALUE IS 256/CFP$B. LARGER VALUES WILL LEAD
1566: * TO INCREASED EFFICIENCY AT THE COST OF WASTING MEMORY.
1567: *
1568: E$STS EQU * 500 WORDS
1569: *
1570: * E$CBS IS THE SIZE OF CODE BLOCK ALLOCATED INITIALLY AND
1571: * THE EXPANSION INCREMENT IF OVERFLOW OCCURS. IF THIS VALUE
1572: * IS TOO SMALL OR TOO LARGE, EXCESSIVE GARBAGE COLLECTIONS
1573: * WILL OCCUR DURING COMPILATION AND MEMORY MAY BE LOST
1574: * IN THE CASE OF A TOO LARGE VALUE.
1575: *
1576: E$CBS EQU * 500 WORDS
1577: *
1578: * E$HNB IS THE NUMBER OF BUCKET HEADERS IN THE VARIABLE
1579: * HASH TABLE. IT SHOULD ALWAYS BE ODD. LARGER VALUES WILL
1580: * SPEED UP COMPILATION AND INDIRECT REFERENCES AT THE
1581: * EXPENSE OF ADDITIONAL STORAGE FOR THE HASH TABLE ITSELF.
1582: *
1583: E$HNB EQU * 127 BUCKET HEADERS
1584: *
1585: * E$HNW IS THE MAXIMUM NUMBER OF WORDS OF A STRING
1586: * NAME WHICH PARTICIPATE IN THE STRING HASH ALGORITHM.
1587: * LARGER VALUES GIVE A BETTER HASH AT THE EXPENSE OF TAKING
1588: * LONGER TO COMPUTE THE HASH. THERE IS SOME OPTIMAL VALUE.
1589: *
1590: E$HNW EQU * 6 WORDS
1591: *
1592: * E$FSP . IF THE AMOUNT OF FREE SPACE LEFT AFTER A GARBAGE
1593: * COLLECTION IS SMALL COMPARED TO THE TOTAL AMOUNT OF SPACE
1594: * IN USE GARBAGE COLLECTOR THRASHING IS LIKELY TO OCCUR AS
1595: * THIS SPACE IS USED UP. E$FSP IS A MEASURE OF THE
1596: * MINIMUM PERCENTAGE OF DYNAMIC MEMORY LEFT AS FREE SPACE
1597: * BEFORE THE SYSTEM ROUTINE SYSMM IS CALLED TO TRY TO
1598: * OBTAIN MORE MEMORY.
1599: *
1600: E$FSP EQU * 15 PERCENT
1601: EJC
1602: *
1603: * DEFINITIONS OF CODES FOR LETTERS
1604: *
1605: CH$LA EQU * LETTER A
1606: CH$LB EQU * LETTER B
1607: CH$LC EQU * LETTER C
1608: CH$LD EQU * LETTER D
1609: CH$LE EQU * LETTER E
1610: CH$LF EQU * LETTER F
1611: CH$LG EQU * LETTER G
1612: CH$LH EQU * LETTER H
1613: CH$LI EQU * LETTER I
1614: CH$LJ EQU * LETTER J
1615: CH$LK EQU * LETTER K
1616: CH$LL EQU * LETTER L
1617: CH$LM EQU * LETTER M
1618: CH$LN EQU * LETTER N
1619: CH$LO EQU * LETTER O
1620: CH$LP EQU * LETTER P
1621: CH$LQ EQU * LETTER Q
1622: CH$LR EQU * LETTER R
1623: CH$LS EQU * LETTER S
1624: CH$LT EQU * LETTER T
1625: CH$LU EQU * LETTER U
1626: CH$LV EQU * LETTER V
1627: CH$LW EQU * LETTER W
1628: CH$LX EQU * LETTER X
1629: CH$LY EQU * LETTER Y
1630: CH$L$ EQU * LETTER Z
1631: *
1632: * DEFINITIONS OF CODES FOR DIGITS
1633: *
1634: CH$D0 EQU * DIGIT 0
1635: CH$D1 EQU * DIGIT 1
1636: CH$D2 EQU * DIGIT 2
1637: CH$D3 EQU * DIGIT 3
1638: CH$D4 EQU * DIGIT 4
1639: CH$D5 EQU * DIGIT 5
1640: CH$D6 EQU * DIGIT 6
1641: CH$D7 EQU * DIGIT 7
1642: CH$D8 EQU * DIGIT 8
1643: CH$D9 EQU * DIGIT 9
1644: EJC
1645: *
1646: * DEFINITIONS OF CODES FOR SPECIAL CHARACTERS
1647: *
1648: * THE NAMES OF THESE CHARACTERS ARE RELATED TO THEIR
1649: * ORIGINAL REPRESENTATION IN THE EBCDIC SET CORRESPONDING
1650: * TO THE DESCRIPTION IN STANDARD SNOBOL4 MANUALS AND TEXTS.
1651: *
1652: CH$AM EQU * KEYWORD OPERATOR (AMPERSAND)
1653: CH$AS EQU * MULTIPLICATION SYMBOL (ASTERISK)
1654: CH$AT EQU * CURSOR POSITION OPERATOR (AT)
1655: CH$BB EQU * LEFT ARRAY BRACKET (LESS THAN)
1656: CH$BL EQU * BLANK
1657: CH$BR EQU * ALTERNATION OPERATOR (VERTICAL BAR)
1658: CH$CL EQU * GOTO SYMBOL (COLON)
1659: CH$CM EQU * COMMA
1660: CH$DL EQU * INDIRECTION OPERATOR (DOLLAR)
1661: CH$DT EQU * NAME OPERATOR (DOT)
1662: CH$DQ EQU * DOUBLE QUOTE
1663: CH$EQ EQU * EQUAL SIGN
1664: CH$EX EQU * EXPONENTIATION OPERATOR (EXCLM)
1665: CH$MN EQU * MINUS SIGN
1666: CH$NM EQU * NUMBER SIGN
1667: CH$NT EQU * NEGATION OPERATOR (NOT)
1668: CH$PC EQU * PERCENT
1669: CH$PL EQU * PLUS SIGN
1670: CH$PP EQU * LEFT PARENTHESIS
1671: CH$RB EQU * RIGHT ARRAY BRACKET (GRTR THAN)
1672: CH$RP EQU * RIGHT PARENTHESIS
1673: CH$QU EQU * INTERROGATION OPERATOR (QUESTION)
1674: CH$SL EQU * SLASH
1675: CH$SM EQU * SEMICOLON
1676: CH$SQ EQU * SINGLE QUOTE
1677: CH$UN EQU * SPECIAL IDENTIFIER CHAR (UNDERLINE)
1678: CH$OB EQU * OPENING BRACKET
1679: CH$CB EQU * CLOSING BRACKET
1680: EJC
1681: *
1682: * REMAINING CHARS ARE OPTIONAL ADDITIONS TO THE STANDARDS.
1683: *
1684: * TAB CHARACTERS - SYNTACTICALLY EQUIVALENT TO BLANK
1685: *
1686: CH$HT EQU * HORIZONTAL TAB
1687: *
1688: * LOWER CASE OR SHIFTED CASE ALPHABETIC CHARS
1689: *
1690: CH$$A EQU * SHIFTED A
1691: CH$$B EQU * SHIFTED B
1692: CH$$C EQU * SHIFTED C
1693: CH$$D EQU * SHIFTED D
1694: CH$$E EQU * SHIFTED E
1695: CH$$F EQU * SHIFTED F
1696: CH$$G EQU * SHIFTED G
1697: CH$$H EQU * SHIFTED H
1698: CH$$I EQU * SHIFTED I
1699: CH$$J EQU * SHIFTED J
1700: CH$$K EQU * SHIFTED K
1701: CH$$L EQU * SHIFTED L
1702: CH$$M EQU * SHIFTED M
1703: CH$$N EQU * SHIFTED N
1704: CH$$O EQU * SHIFTED O
1705: CH$$P EQU * SHIFTED P
1706: CH$$Q EQU * SHIFTED Q
1707: CH$$R EQU * SHIFTED R
1708: CH$$S EQU * SHIFTED S
1709: CH$$T EQU * SHIFTED T
1710: CH$$U EQU * SHIFTED U
1711: CH$$V EQU * SHIFTED V
1712: CH$$W EQU * SHIFTED W
1713: CH$$X EQU * SHIFTED X
1714: CH$$Y EQU * SHIFTED Y
1715: CH$$$ EQU * SHIFTED Z
1716: * IF A DELIMITER OTHER THAN CH$CM MUST BE USED IN
1717: * THE THIRD ARGUMENT OF INPUT(),OUTPUT() THEN .CIOD SHOULD
1718: * BE DEFINED AND A PARAMETER SUPPLIED FOR IODEL.
1719: *
1720: IODEL EQU *
1721: EJC
1722: *
1723: * DATA BLOCK FORMATS AND DEFINITIONS
1724: *
1725: * THE FOLLOWING SECTIONS DESCRIBE THE DETAILED FORMAT OF
1726: * ALL POSSIBLE DATA BLOCKS IN STATIC AND DYNAMIC MEMORY.
1727: *
1728: * EVERY BLOCK HAS A NAME OF THE FORM XXBLK WHERE XX IS A
1729: * UNIQUE TWO CHARACTER IDENTIFIER. THE FIRST WORD OF EVERY
1730: * BLOCK MUST CONTAIN A POINTER TO A PROGRAM LOCATION IN THE
1731: * INTERPRETOR WHICH IS IMMEDIATELY PRECEDED BY AN ADDRESS
1732: * CONSTANT CONTAINING THE VALUE BL$XX WHERE XX IS THE BLOCK
1733: * IDENTIFIER. THIS PROVIDES A UNIFORM MECHANISM FOR
1734: * DISTINGUISHING BETWEEN THE VARIOUS BLOCK TYPES.
1735: *
1736: * IN SOME CASES, THE CONTENTS OF THE FIRST WORD IS CONSTANT
1737: * FOR A GIVEN BLOCK TYPE AND MERELY SERVES AS A POINTER
1738: * TO THE IDENTIFYING ADDRESS CONSTANT. HOWEVER, IN OTHER
1739: * CASES THERE ARE SEVERAL POSSIBILITIES FOR THE FIRST
1740: * WORD IN WHICH CASE EACH OF THE SEVERAL PROGRAM ENTRY
1741: * POINTS MUST BE PRECEDED BY THE APPROPRIATE CONSTANT.
1742: *
1743: * IN EACH BLOCK, SOME OF THE FIELDS ARE RELOCATABLE. THIS
1744: * MEANS THAT THEY MAY CONTAIN A POINTER TO ANOTHER BLOCK
1745: * IN THE DYNAMIC AREA. (TO BE MORE PRECISE, IF THEY CONTAIN
1746: * A POINTER WITHIN THE DYNAMIC AREA, THEN IT IS A POINTER
1747: * TO A BLOCK). SUCH FIELDS MUST BE MODIFIED BY THE GARBAGE
1748: * COLLECTOR (PROCEDURE GBCOL) WHENEVER BLOCKS ARE COMPACTED
1749: * IN THE DYNAMIC REGION. THE GARBAGE COLLECTOR (ACTUALLY
1750: * PROCEDURE GBCPF) REQUIRES THAT ALL SUCH RELOCATABLE
1751: * FIELDS IN A BLOCK MUST BE CONTIGUOUS.
1752: EJC
1753: *
1754: * THE DESCRIPTION FORMAT USES THE FOLLOWING SCHEME.
1755: *
1756: * 1) BLOCK TITLE AND TWO CHARACTER IDENTIFIER
1757: *
1758: * 2) DESCRIPTION OF BASIC USE OF BLOCK AND INDICATION
1759: * OF CIRCUMSTANCES UNDER WHICH IT IS CONSTRUCTED.
1760: *
1761: * 3) PICTURE OF THE BLOCK FORMAT. IN THESE PICTURES LOW
1762: * MEMORY ADDRESSES ARE AT THE TOP OF THE PAGE. FIXED
1763: * LENGTH FIELDS ARE SURROUNDED BY I (LETTER I). FIELDS
1764: * WHICH ARE FIXED LENGTH BUT WHOSE LENGTH IS DEPENDENT
1765: * ON A CONFIGURATION PARAMETER ARE SURROUNDED BY *
1766: * (ASTERISK). VARIABLE LENGTH FIELDS ARE SURROUNDED
1767: * BY / (SLASH).
1768: *
1769: * 4) DEFINITION OF SYMBOLIC OFFSETS TO FIELDS IN
1770: * BLOCK AND OF THE SIZE OF THE BLOCK IF FIXED LENGTH
1771: * OR OF THE SIZE OF THE FIXED LENGTH FIELDS IF THE
1772: * BLOCK IS VARIABLE LENGTH.
1773: * NOTE THAT SOME ROUTINES SUCH AS GBCPF ASSUME
1774: * CERTAIN OFFSETS ARE EQUAL. THE DEFINITIONS
1775: * GIVEN HERE ENFORCE THIS. MAKE CHANGES TO
1776: * THEM ONLY WITH DUE CARE.
1777: *
1778: * DEFINITIONS OF COMMON OFFSETS
1779: *
1780: OFFS1 EQU 1
1781: OFFS2 EQU 2
1782: OFFS3 EQU 3
1783: *
1784: * 5) DETAILED COMMENTS ON THE SIGNIFICANCE AND FORMATS
1785: * OF THE VARIOUS FIELDS.
1786: *
1787: * THE ORDER IS ALPHABETICAL BY IDENTIFICATION CODE.
1788: EJC
1789: *
1790: * DEFINITIONS OF BLOCK CODES
1791: *
1792: * THIS TABLE PROVIDES A UNIQUE IDENTIFICATION CODE FOR
1793: * EACH SEPARATE BLOCK TYPE. THE FIRST WORD OF A BLOCK IN
1794: * THE DYNAMIC AREA ALWAYS CONTAINS THE ADDRESS OF A PROGRAM
1795: * ENTRY POINT. THE BLOCK CODE IS USED AS THE ENTRY POINT ID
1796: * THE ORDER OF THESE CODES DICTATES THE ORDER OF THE TABLE
1797: * USED BY THE DATATYPE FUNCTION (SCNMT IN THE CONSTANT SEC)
1798: *
1799: * BLOCK CODES FOR ACCESSIBLE DATATYPES
1800: *
1801: BL$AR EQU 0 ARBLK ARRAY
1802: BL$BC EQU BL$AR+1 BCBLK BUFFER
1803: BL$CD EQU BL$BC+1 CDBLK CODE
1804: BL$EX EQU BL$CD+1 EXBLK EXPRESSION
1805: BL$IC EQU BL$EX+1 ICBLK INTEGER
1806: BL$NM EQU BL$IC+1 NMBLK NAME
1807: BL$P0 EQU BL$NM+1 P0BLK PATTERN
1808: BL$P1 EQU BL$P0+1 P1BLK PATTERN
1809: BL$P2 EQU BL$P1+1 P2BLK PATTERN
1810: BL$RC EQU BL$P2+1 RCBLK REAL
1811: BL$SC EQU BL$RC+1 SCBLK STRING
1812: BL$SE EQU BL$SC+1 SEBLK EXPRESSION
1813: BL$TB EQU BL$SE+1 TBBLK TABLE
1814: BL$VC EQU BL$TB+1 VCBLK ARRAY
1815: BL$XN EQU BL$VC+1 XNBLK EXTERNAL
1816: BL$XR EQU BL$XN+1 XRBLK EXTERNAL
1817: BL$PD EQU BL$XR+1 PDBLK PROGRAM DEFINED DATATYPE
1818: *
1819: BL$$D EQU BL$PD+1 NUMBER OF BLOCK CODES FOR DATA
1820: *
1821: * OTHER BLOCK CODES
1822: *
1823: BL$TR EQU BL$PD+1 TRBLK
1824: BL$BF EQU BL$TR+1 BFBLK
1825: BL$CC EQU BL$BF+1 CCBLK
1826: BL$CM EQU BL$CC+1 CMBLK
1827: BL$CT EQU BL$CM+1 CTBLK
1828: BL$DF EQU BL$CT+1 DFBLK
1829: BL$EF EQU BL$DF+1 EFBLK
1830: BL$EV EQU BL$EF+1 EVBLK
1831: BL$FF EQU BL$EV+1 FFBLK
1832: BL$KV EQU BL$FF+1 KVBLK
1833: BL$PF EQU BL$KV+1 PFBLK
1834: BL$TE EQU BL$PF+1 TEBLK
1835: *
1836: BL$$I EQU 0 DEFAULT IDENTIFICATION CODE
1837: BL$$T EQU BL$TR+1 CODE FOR DATA OR TRACE BLOCK
1838: BL$$$ EQU BL$TE+1 NUMBER OF BLOCK CODES
1839: EJC
1840: *
1841: * FIELD REFERENCES
1842: *
1843: * REFERENCES TO THE FIELDS OF DATA BLOCKS ARE SYMBOLIC
1844: * (I.E. USE THE SYMBOLIC OFFSETS) WITH THE FOLLOWING
1845: * EXCEPTIONS.
1846: *
1847: * 1) REFERENCES TO THE FIRST WORD ARE USUALLY NOT
1848: * SYMBOLIC SINCE THEY USE THE (X) OPERAND FORMAT.
1849: *
1850: * 2) THE CODE WHICH CONSTRUCTS A BLOCK IS OFTEN NOT
1851: * SYMBOLIC AND SHOULD BE CHANGED IF THE CORRESPONDING
1852: * BLOCK FORMAT IS MODIFIED.
1853: *
1854: * 3) THE PLC AND PSC INSTRUCTIONS IMPLY AN OFFSET
1855: * CORRESPONDING TO THE DEFINITION OF CFP$F.
1856: *
1857: * 4) THERE ARE NON-SYMBOLIC REFERENCES (EASILY CHANGED)
1858: * IN THE GARBAGE COLLECTOR (PROCEDURES GBCPF, BLKLN).
1859: *
1860: * 5) THE FIELDS IDVAL, FARGS APPEAR IN SEVERAL BLOCKS
1861: * AND ANY CHANGES MUST BE MADE IN PARALLEL TO ALL
1862: * BLOCKS CONTAINING THE FIELDS. THE ACTUAL REFERENCES
1863: * TO THESE FIELDS ARE SYMBOLIC WITH THE ABOVE
1864: * LISTED EXCEPTIONS.
1865: *
1866: * 6) SEVERAL SPOTS IN THE CODE ASSUME THAT THE
1867: * DEFINITIONS OF THE FIELDS VRVAL, TEVAL, TRNXT ARE
1868: * THE SAME (THESE ARE SECTIONS OF CODE WHICH SEARCH
1869: * OUT ALONG A TRBLK CHAIN FROM A VARIABLE).
1870: *
1871: * 7) REFERENCES TO THE FIELDS OF AN ARRAY BLOCK IN THE
1872: * ARRAY REFERENCE ROUTINE ARREF ARE NON-SYMBOLIC.
1873: *
1874: * APART FROM THE EXCEPTIONS LISTED, REFERENCES ARE SYMBOLIC
1875: * AS FAR AS POSSIBLE AND MODIFYING THE ORDER OR NUMBER
1876: * OF FIELDS WILL NOT REQUIRE CHANGES.
1877: EJC
1878: *
1879: * COMMON FIELDS FOR FUNCTION BLOCKS
1880: *
1881: * BLOCKS WHICH REPRESENT CALLABLE FUNCTIONS HAVE TWO
1882: * COMMON FIELDS AT THE START OF THE BLOCK AS FOLLOWS.
1883: *
1884: * +------------------------------------+
1885: * I FCODE I
1886: * +------------------------------------+
1887: * I FARGS I
1888: * +------------------------------------+
1889: * / /
1890: * / REST OF FUNCTION BLOCK /
1891: * / /
1892: * +------------------------------------+
1893: *
1894: FCODE EQU 0 POINTER TO CODE FOR FUNCTION
1895: FARGS EQU 1 NUMBER OF ARGUMENTS
1896: *
1897: * FCODE IS A POINTER TO THE LOCATION IN THE INTERPRETOR
1898: * PROGRAM WHICH PROCESSES THIS TYPE OF FUNCTION CALL.
1899: *
1900: * FARGS IS THE EXPECTED NUMBER OF ARGUMENTS. THE ACTUAL
1901: * NUMBER OF ARGUMENTS IS ADJUSTED TO THIS AMOUNT BY
1902: * DELETING EXTRA ARGUMENTS OR SUPPLYING TRAILING NULLS
1903: * FOR MISSING ONES BEFORE TRANSFERRING THOUGH FCODE.
1904: * A VALUE OF 999 MAY BE USED IN THIS FIELD TO INDICATE A
1905: * VARIABLE NUMBER OF ARGUMENTS (SEE SVBLK FIELD SVNAR).
1906: *
1907: * THE BLOCK TYPES WHICH FOLLOW THIS SCHEME ARE.
1908: *
1909: * FFBLK FIELD FUNCTION
1910: * DFBLK DATATYPE FUNCTION
1911: * PFBLK PROGRAM DEFINED FUNCTION
1912: * EFBLK EXTERNAL LOADED FUNCTION
1913: EJC
1914: *
1915: * IDENTIFICATION FIELD
1916: *
1917: *
1918: * ID FIELD
1919: *
1920: * CERTAIN PROGRAM ACCESSIBLE OBJECTS (THOSE WHICH CONTAIN
1921: * OTHER DATA VALUES AND CAN BE COPIED) ARE GIVEN A UNIQUE
1922: * IDENTIFICATION NUMBER (SEE EXSID). THIS ID VALUE IS AN
1923: * ADDRESS INTEGER VALUE WHICH IS ALWAYS STORED IN WORD TWO.
1924: *
1925: IDVAL EQU 1 ID VALUE FIELD
1926: *
1927: * THE BLOCKS CONTAINING AN IDVAL FIELD ARE.
1928: *
1929: * ARBLK ARRAY
1930: * BCBLK BUFFER CONTROL BLOCK
1931: * PDBLK PROGRAM DEFINED DATATYPE
1932: * TBBLK TABLE
1933: * VCBLK VECTOR BLOCK (ARRAY)
1934: *
1935: * NOTE THAT A ZERO IDVAL MEANS THAT THE BLOCK IS ONLY
1936: * HALF BUILT AND SHOULD NOT BE DUMPED (SEE DUMPR).
1937: EJC
1938: *
1939: * ARRAY BLOCK (ARBLK)
1940: *
1941: * AN ARRAY BLOCK REPRESENTS AN ARRAY VALUE OTHER THAN ONE
1942: * WITH ONE DIMENSION WHOSE LOWER BOUND IS ONE (SEE VCBLK).
1943: * AN ARBLK IS BUILT WITH A CALL TO THE FUNCTIONS CONVERT
1944: * (S$CNV) OR ARRAY (S$ARR).
1945: *
1946: * +------------------------------------+
1947: * I ARTYP I
1948: * +------------------------------------+
1949: * I IDVAL I
1950: * +------------------------------------+
1951: * I ARLEN I
1952: * +------------------------------------+
1953: * I AROFS I
1954: * +------------------------------------+
1955: * I ARNDM I
1956: * +------------------------------------+
1957: * * ARLBD *
1958: * +------------------------------------+
1959: * * ARDIM *
1960: * +------------------------------------+
1961: * * *
1962: * * ABOVE 2 FLDS REPEATED FOR EACH DIM *
1963: * * *
1964: * +------------------------------------+
1965: * I ARPRO I
1966: * +------------------------------------+
1967: * / /
1968: * / ARVLS /
1969: * / /
1970: * +------------------------------------+
1971: EJC
1972: *
1973: * ARRAY BLOCK (CONTINUED)
1974: *
1975: ARTYP EQU 0 POINTER TO DUMMY ROUTINE B$ART
1976: ARLEN EQU IDVAL+1 LENGTH OF ARBLK IN BYTES
1977: AROFS EQU ARLEN+1 OFFSET IN ARBLK TO ARPRO FIELD
1978: ARNDM EQU AROFS+1 NUMBER OF DIMENSIONS
1979: ARLBD EQU ARNDM+1 LOW BOUND (FIRST SUBSCRIPT)
1980: ARDIM EQU ARLBD+CFP$I DIMENSION (FIRST SUBSCRIPT)
1981: ARLB2 EQU ARDIM+CFP$I LOW BOUND (SECOND SUBSCRIPT)
1982: ARDM2 EQU ARLB2+CFP$I DIMENSION (SECOND SUBSCRIPT)
1983: ARPRO EQU ARDIM+CFP$I ARRAY PROTOTYPE (ONE DIMENSION)
1984: ARVLS EQU ARPRO+1 START OF VALUES (ONE DIMENSION)
1985: ARPR2 EQU ARDM2+CFP$I ARRAY PROTOTYPE (TWO DIMENSIONS)
1986: ARVL2 EQU ARPR2+1 START OF VALUES (TWO DIMENSIONS)
1987: ARSI$ EQU ARLBD NUMBER OF STANDARD FIELDS IN BLOCK
1988: ARDMS EQU ARLB2-ARLBD SIZE OF INFO FOR ONE SET OF BOUNDS
1989: *
1990: * THE BOUNDS AND DIMENSION FIELDS ARE SIGNED INTEGER
1991: * VALUES AND EACH OCCUPY CFP$I WORDS IN THE ARBLK.
1992: *
1993: * THE LENGTH OF AN ARBLK IN BYTES MAY NOT EXCEED MXLEN.
1994: * THIS IS REQUIRED TO KEEP NAME OFFSETS GARBAGE COLLECTABLE
1995: *
1996: * THE ACTUAL VALUES ARE ARRANGED IN ROW-WISE ORDER AND
1997: * CAN CONTAIN A DATA POINTER OR A POINTER TO A TRBLK.
1998: *
1999: * BUFFER CONTROL BLOCK (BCBLK)
2000: *
2001: * A BCBLK IS BUILT FOR EVERY BFBLK.
2002: *
2003: * +------------------------------------+
2004: * I BCTYP I
2005: * +------------------------------------+
2006: * I IDVAL I
2007: * +------------------------------------+
2008: * I BCLEN I
2009: * +------------------------------------+
2010: * I BCBUF I
2011: * +------------------------------------+
2012: *
2013: BCTYP EQU 0 PTR TO DUMMY ROUTINE B$BCT
2014: BCLEN EQU IDVAL+1 DEFINED BUFFER LENGTH
2015: BCBUF EQU BCLEN+1 PTR TO BFBLK
2016: BCSI$ EQU BCBUF+1 SIZE OF BCBLK
2017: *
2018: * A BCBLK IS AN INDIRECT CONTROL HEADER FOR BFBLK.
2019: * THE REASON FOR NOT STORING THIS DATA DIRECTLY
2020: * IN THE RELATED BFBLK IS SO THAT THE BFBLK CAN
2021: * MAINTAIN THE SAME SKELETAL STRUCTURE AS AN SCBLK
2022: * THUS FACILITATING TRANSPARENT STRING OPERATIONS
2023: * (FOR THE MOST PART). SPECIFICALLY, CFP$F IS THE
2024: * SAME FOR A BFBLK AS FOR AN SCBLK. BY CONVENTION,
2025: * WHEREEVER A BUFFER VALUE IS EMPLOYED, THE BCBLK
2026: * IS POINTED TO.
2027: *
2028: * THE CORRESPONDING BFBLK IS POINTED TO BY THE
2029: * BCBUF POINTER IN THE BCBLK.
2030: *
2031: * BCLEN IS THE CURRENT DEFINED SIZE OF THE CHARACTER
2032: * ARRAY IN THE BFBLK. CHARACTERS FOLLOWING THE OFFSET
2033: * OF BCLEN ARE UNDEFINED.
2034: *
2035: EJC
2036: *
2037: * STRING BUFFER BLOCK (BFBLK)
2038: *
2039: * A BFBLK IS BUILT BY A CALL TO BUFFER(...)
2040: *
2041: * +------------------------------------+
2042: * I BFTYP I
2043: * +------------------------------------+
2044: * I BFALC I
2045: * +------------------------------------+
2046: * / /
2047: * / BFCHR /
2048: * / /
2049: * +------------------------------------+
2050: *
2051: BFTYP EQU 0 PTR TO DUMMY ROUTINE B$BFT
2052: BFALC EQU BFTYP+1 ALLOCATED SIZE OF BUFFER
2053: BFCHR EQU BFALC+1 CHARACTERS OF STRING
2054: BFSI$ EQU BFCHR SIZE OF STANDARD FIELDS IN BFBLK
2055: *
2056: * THE CHARACTERS IN THE BUFFER ARE STORED LEFT JUSTIFIED.
2057: * THE FINAL WORD OF DEFINED CHARACTERS IS ALWAYS ZERO
2058: * (CHARACTER) PADDED. ANY TRAILING ALLOCATION PAST THE
2059: * WORD CONTAINING THE LAST CHARACTER CONTAINS
2060: * UNPREDICTABLE CONTENTS AND IS NEVER REFERENCED.
2061: *
2062: * NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING
2063: * IS GIVEN BY CFP$F, AS WITH AN SCBLK. HOWEVER, THE
2064: * OFFSET WHICH IS OCCUPIED BY THE LENGTH FOR AN SCBLK
2065: * IS THE TOTAL CHAR SPACE FOR BFBLKS, AND ROUTINES WHICH
2066: * DEAL WITH BOTH MUST ACCOUNT FOR THIS DIFFERENCE.
2067: *
2068: * THE VALUE OF BFALC MAY NOT EXCEED MXLEN. THE VALUE OF
2069: * BCLEN IS ALWAYS LESS THAN OR EQUAL TO BFALC.
2070: *
2071: EJC
2072: *
2073: * CODE CONSTRUCTION BLOCK (CCBLK)
2074: *
2075: * AT ANY ONE MOMENT THERE IS AT MOST ONE CCBLK INTO
2076: * WHICH THE COMPILER IS CURRENTLY STORING CODE (CDWRD).
2077: *
2078: * +------------------------------------+
2079: * I CCTYP I
2080: * +------------------------------------+
2081: * I CCLEN I
2082: * +------------------------------------+
2083: * I CCUSE I
2084: * +------------------------------------+
2085: * / /
2086: * / CCCOD /
2087: * / /
2088: * +------------------------------------+
2089: *
2090: CCTYP EQU 0 POINTER TO DUMMY ROUTINE B$CCT
2091: CCLEN EQU CCTYP+1 LENGTH OF CCBLK IN BYTES
2092: CCUSE EQU CCLEN+1 OFFSET PAST LAST USED WORD (BYTES)
2093: CCCOD EQU CCUSE+1 START OF GENERATED CODE IN BLOCK
2094: *
2095: * THE REASON THAT THE CCBLK IS A SEPARATE BLOCK TYPE FROM
2096: * THE USUAL CDBLK IS THAT THE GARBAGE COLLECTOR MUST
2097: * ONLY PROCESS THOSE FIELDS WHICH HAVE BEEN SET (SEE GBCPF)
2098: EJC
2099: *
2100: * CODE BLOCK (CDBLK)
2101: *
2102: * A CODE BLOCK IS BUILT FOR EACH STATEMENT COMPILED DURING
2103: * THE INITIAL COMPILATION OR BY SUBSEQUENT CALLS TO CODE.
2104: *
2105: * +------------------------------------+
2106: * I CDJMP I
2107: * +------------------------------------+
2108: * I CDSTM I
2109: * +------------------------------------+
2110: * I CDLEN I
2111: * +------------------------------------+
2112: * I CDFAL I
2113: * +------------------------------------+
2114: * / /
2115: * / CDCOD /
2116: * / /
2117: * +------------------------------------+
2118: *
2119: CDJMP EQU 0 PTR TO ROUTINE TO EXECUTE STATEMENT
2120: CDSTM EQU CDJMP+1 STATEMENT NUMBER
2121: CDLEN EQU OFFS2 LENGTH OF CDBLK IN BYTES
2122: CDFAL EQU OFFS3 FAILURE EXIT (SEE BELOW)
2123: CDCOD EQU CDFAL+1 EXECUTABLE PSEUDO-CODE
2124: CDSI$ EQU CDCOD NUMBER OF STANDARD FIELDS IN CDBLK
2125: *
2126: * CDSTM IS THE STATEMENT NUMBER OF THE CURRENT STATEMENT.
2127: *
2128: * CDJMP, CDFAL ARE SET AS FOLLOWS.
2129: *
2130: * 1) IF THE FAILURE EXIT IS THE NEXT STATEMENT
2131: *
2132: * CDJMP = B$CDS
2133: * CDFAL = PTR TO CDBLK FOR NEXT STATEMENT
2134: *
2135: * 2) IF THE FAILURE EXIT IS A SIMPLE LABEL NAME
2136: *
2137: * CDJMP = B$CDS
2138: * CDFAL IS A PTR TO THE VRTRA FIELD OF THE VRBLK
2139: *
2140: * 3) IF THERE IS NO FAILURE EXIT (-NOFAIL MODE)
2141: *
2142: * CDJMP = B$CDS
2143: * CDFAL = O$UNF
2144: *
2145: * 4) IF THE FAILURE EXIT IS COMPLEX OR DIRECT
2146: *
2147: * CDJMP = B$CDC
2148: * CDFAL IS THE OFFSET TO THE O$GOF WORD
2149: EJC
2150: *
2151: * CODE BLOCK (CONTINUED)
2152: *
2153: * CDCOD IS THE START OF THE ACTUAL CODE. FIRST WE DESCRIBE
2154: * THE CODE GENERATED FOR AN EXPRESSION. IN AN EXPRESSION,
2155: * ELEMENTS ARE FETCHED BY NAME OR BY VALUE. FOR EXAMPLE,
2156: * THE BINARY EQUAL OPERATOR FETCHES ITS LEFT ARGUMENT
2157: * BY NAME AND ITS RIGHT ARGUMENT BY VALUE. THESE TWO
2158: * CASES GENERATE QUITE DIFFERENT CODE AND ARE DESCRIBED
2159: * SEPARATELY. FIRST WE CONSIDER THE CODE BY VALUE CASE.
2160: *
2161: * GENERATION OF CODE BY VALUE FOR EXPRESSIONS ELEMENTS.
2162: *
2163: * EXPRESSION POINTER TO EXBLK OR SEBLK
2164: *
2165: * INTEGER CONSTANT POINTER TO ICBLK
2166: *
2167: * NULL CONSTANT POINTER TO NULLS
2168: *
2169: * PATTERN (RESULTING FROM PREEVALUATION)
2170: * =O$LPT
2171: * POINTER TO P0BLK,P1BLK OR P2BLK
2172: *
2173: * REAL CONSTANT POINTER TO RCBLK
2174: *
2175: * STRING CONSTANT POINTER TO SCBLK
2176: *
2177: * VARIABLE POINTER TO VRGET FIELD OF VRBLK
2178: *
2179: * ADDITION VALUE CODE FOR LEFT OPERAND
2180: * VALUE CODE FOR RIGHT OPERAND
2181: * =O$ADD
2182: *
2183: * AFFIRMATION VALUE CODE FOR OPERAND
2184: * =O$AFF
2185: *
2186: * ALTERNATION VALUE CODE FOR LEFT OPERAND
2187: * VALUE CODE FOR RIGHT OPERAND
2188: * =O$ALT
2189: *
2190: * ARRAY REFERENCE (CASE OF ONE SUBSCRIPT)
2191: * VALUE CODE FOR ARRAY OPERAND
2192: * VALUE CODE FOR SUBSCRIPT OPERAND
2193: * =O$AOV
2194: *
2195: * (CASE OF MORE THAN ONE SUBSCRIPT)
2196: * VALUE CODE FOR ARRAY OPERAND
2197: * VALUE CODE FOR FIRST SUBSCRIPT
2198: * VALUE CODE FOR SECOND SUBSCRIPT
2199: * ...
2200: * VALUE CODE FOR LAST SUBSCRIPT
2201: * =O$AMV
2202: * NUMBER OF SUBSCRIPTS
2203: EJC
2204: *
2205: * CODE BLOCK (CONTINUED)
2206: *
2207: * ASSIGNMENT (TO NATURAL VARIABLE)
2208: * VALUE CODE FOR RIGHT OPERAND
2209: * POINTER TO VRSTO FIELD OF VRBLK
2210: *
2211: * (TO ANY OTHER VARIABLE)
2212: * NAME CODE FOR LEFT OPERAND
2213: * VALUE CODE FOR RIGHT OPERAND
2214: * =O$ASS
2215: *
2216: * COMPILE ERROR =O$CER
2217: *
2218: *
2219: * COMPLEMENTATION VALUE CODE FOR OPERAND
2220: * =O$COM
2221: *
2222: * CONCATENATION (CASE OF PRED FUNC LEFT OPERAND)
2223: * VALUE CODE FOR LEFT OPERAND
2224: * =O$POP
2225: * VALUE CODE FOR RIGHT OPERAND
2226: *
2227: * (ALL OTHER CASES)
2228: * VALUE CODE FOR LEFT OPERAND
2229: * VALUE CODE FOR RIGHT OPERAND
2230: * =O$CNC
2231: *
2232: * CURSOR ASSIGNMENT NAME CODE FOR OPERAND
2233: * =O$CAS
2234: *
2235: * DIVISION VALUE CODE FOR LEFT OPERAND
2236: * VALUE CODE FOR RIGHT OPERAND
2237: * =O$DVD
2238: *
2239: * EXPONENTIATION VALUE CODE FOR LEFT OPERAND
2240: * VALUE CODE FOR RIGHT OPERAND
2241: * =O$EXP
2242: *
2243: * FUNCTION CALL (CASE OF CALL TO SYSTEM FUNCTION)
2244: * VALUE CODE FOR FIRST ARGUMENT
2245: * VALUE CODE FOR SECOND ARGUMENT
2246: * ...
2247: * VALUE CODE FOR LAST ARGUMENT
2248: * POINTER TO SVFNC FIELD OF SVBLK
2249: *
2250: EJC
2251: *
2252: * CODE BLOCK (CONTINUED)
2253: *
2254: * FUNCTION CALL (CASE OF NON-SYSTEM FUNCTION 1 ARG)
2255: * VALUE CODE FOR ARGUMENT
2256: * =O$FNS
2257: * POINTER TO VRBLK FOR FUNCTION
2258: *
2259: * (NON-SYSTEM FUNCTION, GT 1 ARG)
2260: * VALUE CODE FOR FIRST ARGUMENT
2261: * VALUE CODE FOR SECOND ARGUMENT
2262: * ...
2263: * VALUE CODE FOR LAST ARGUMENT
2264: * =O$FNC
2265: * NUMBER OF ARGUMENTS
2266: * POINTER TO VRBLK FOR FUNCTION
2267: *
2268: * IMMEDIATE ASSIGNMENT VALUE CODE FOR LEFT OPERAND
2269: * NAME CODE FOR RIGHT OPERAND
2270: * =O$IMA
2271: *
2272: * INDIRECTION VALUE CODE FOR OPERAND
2273: * =O$INV
2274: *
2275: * INTERROGATION VALUE CODE FOR OPERAND
2276: * =O$INT
2277: *
2278: * KEYWORD REFERENCE NAME CODE FOR OPERAND
2279: * =O$KWV
2280: *
2281: * MULTIPLICATION VALUE CODE FOR LEFT OPERAND
2282: * VALUE CODE FOR RIGHT OPERAND
2283: * =O$MLT
2284: *
2285: * NAME REFERENCE (NATURAL VARIABLE CASE)
2286: * POINTER TO NMBLK FOR NAME
2287: *
2288: * (ALL OTHER CASES)
2289: * NAME CODE FOR OPERAND
2290: * =O$NAM
2291: *
2292: * NEGATION =O$NTA
2293: * CDBLK OFFSET OF O$NTC WORD
2294: * VALUE CODE FOR OPERAND
2295: * =O$NTB
2296: * =O$NTC
2297: EJC
2298: *
2299: * CODE BLOCK (CONTINUED)
2300: *
2301: * PATTERN ASSIGNMENT VALUE CODE FOR LEFT OPERAND
2302: * NAME CODE FOR RIGHT OPERAND
2303: * =O$PAS
2304: *
2305: * PATTERN MATCH VALUE CODE FOR LEFT OPERAND
2306: * VALUE CODE FOR RIGHT OPERAND
2307: * =O$PMV
2308: *
2309: * PATTERN REPLACEMENT NAME CODE FOR SUBJECT
2310: * VALUE CODE FOR PATTERN
2311: * =O$PMN
2312: * VALUE CODE FOR REPLACEMENT
2313: * =O$RPL
2314: *
2315: * SELECTION (FOR FIRST ALTERNATIVE)
2316: * =O$SLA
2317: * CDBLK OFFSET TO NEXT O$SLC WORD
2318: * VALUE CODE FOR FIRST ALTERNATIVE
2319: * =O$SLB
2320: * CDBLK OFFSET PAST ALTERNATIVES
2321: *
2322: * (FOR SUBSEQUENT ALTERNATIVES)
2323: * =O$SLC
2324: * CDBLK OFFSET TO NEXT O$SLC,O$SLD
2325: * VALUE CODE FOR ALTERNATIVE
2326: * =O$SLB
2327: * OFFSET IN CDBLK PAST ALTERNATIVES
2328: *
2329: * (FOR LAST ALTERNATIVE)
2330: * =O$SLD
2331: * VALUE CODE FOR LAST ALTERNATIVE
2332: *
2333: * SUBTRACTION VALUE CODE FOR LEFT OPERAND
2334: * VALUE CODE FOR RIGHT OPERAND
2335: * =O$SUB
2336: EJC
2337: *
2338: * CODE BLOCK (CONTINUED)
2339: *
2340: * GENERATION OF CODE BY NAME FOR EXPRESSION ELEMENTS.
2341: *
2342: * VARIABLE =O$LVN
2343: * POINTER TO VRBLK
2344: *
2345: * EXPRESSION (CASE OF *NATURAL VARIABLE)
2346: * =O$LVN
2347: * POINTER TO VRBLK
2348: *
2349: * (ALL OTHER CASES)
2350: * =O$LEX
2351: * POINTER TO EXBLK
2352: *
2353: *
2354: * ARRAY REFERENCE (CASE OF ONE SUBSCRIPT)
2355: * VALUE CODE FOR ARRAY OPERAND
2356: * VALUE CODE FOR SUBSCRIPT OPERAND
2357: * =O$AON
2358: *
2359: * (CASE OF MORE THAN ONE SUBSCRIPT)
2360: * VALUE CODE FOR ARRAY OPERAND
2361: * VALUE CODE FOR FIRST SUBSCRIPT
2362: * VALUE CODE FOR SECOND SUBSCRIPT
2363: * ...
2364: * VALUE CODE FOR LAST SUBSCRIPT
2365: * =O$AMN
2366: * NUMBER OF SUBSCRIPTS
2367: *
2368: * COMPILE ERROR =O$CER
2369: *
2370: * FUNCTION CALL (SAME CODE AS FOR VALUE CALL)
2371: * =O$FNE
2372: *
2373: * INDIRECTION VALUE CODE FOR OPERAND
2374: * =O$INN
2375: *
2376: * KEYWORD REFERENCE NAME CODE FOR OPERAND
2377: * =O$KWN
2378: *
2379: * ANY OTHER OPERAND IS AN ERROR IN A NAME POSITION
2380: *
2381: * NOTE THAT IN THIS DESCRIPTION, =O$XXX REFERS TO THE
2382: * GENERATION OF A WORD CONTAINING THE ADDRESS OF ANOTHER
2383: * WORD WHICH CONTAINS THE ENTRY POINT ADDRESS O$XXX.
2384: EJC
2385: *
2386: * CODE BLOCK (CONTINUED)
2387: *
2388: * NOW WE CONSIDER THE OVERALL STRUCTURE OF THE CODE BLOCK
2389: * FOR A STATEMENT WITH POSSIBLE GOTO FIELDS.
2390: *
2391: * FIRST COMES THE CODE FOR THE STATEMENT BODY.
2392: * THE STATEMENT BODY IS AN EXPRESSION TO BE EVALUATED
2393: * BY VALUE ALTHOUGH THE VALUE IS NOT ACTUALLY REQUIRED.
2394: * NORMAL VALUE CODE IS GENERATED FOR THE BODY OF THE
2395: * STATEMENT EXCEPT IN THE CASE OF A PATTERN MATCH BY
2396: * VALUE, IN WHICH CASE THE FOLLOWING IS GENERATED.
2397: *
2398: * VALUE CODE FOR LEFT OPERAND
2399: * VALUE CODE FOR RIGHT OPERAND
2400: * =O$PMS
2401: *
2402: * NEXT WE HAVE THE CODE FOR THE SUCCESS GOTO. THERE ARE
2403: * SEVERAL CASES AS FOLLOWS.
2404: *
2405: * 1) NO SUCCESS GOTO PTR TO CDBLK FOR NEXT STATEMENT
2406: *
2407: * 2) SIMPLE LABEL PTR TO VRTRA FIELD OF VRBLK
2408: *
2409: * 3) COMPLEX GOTO (CODE BY NAME FOR GOTO OPERAND)
2410: * =O$GOC
2411: *
2412: * 4) DIRECT GOTO (CODE BY VALUE FOR GOTO OPERAND)
2413: * =O$GOD
2414: *
2415: * FOLLOWING THIS WE GENERATE CODE FOR THE FAILURE GOTO IF
2416: * IT IS DIRECT OR IF IT IS COMPLEX, SIMPLE FAILURE GOTOS
2417: * HAVING BEEN HANDLED BY AN APPROPRIATE SETTING OF THE
2418: * CDFAL FIELD OF THE CDBLK. THE GENERATED CODE IS ONE
2419: * OF THE FOLLOWING.
2420: *
2421: * 1) COMPLEX FGOTO =O$FIF
2422: * =O$GOF
2423: * NAME CODE FOR GOTO OPERAND
2424: * =O$GOC
2425: *
2426: * 2) DIRECT FGOTO =O$FIF
2427: * =O$GOF
2428: * VALUE CODE FOR GOTO OPERAND
2429: * =O$GOD
2430: *
2431: * AN OPTIMIZATION OCCURS IF THE SUCCESS AND FAILURE GOTOS
2432: * ARE IDENTICAL AND EITHER COMPLEX OR DIRECT. IN THIS CASE,
2433: * NO CODE IS GENERATED FOR THE SUCCESS GOTO AND CONTROL
2434: * IS ALLOWED TO FALL INTO THE FAILURE GOTO ON SUCCESS.
2435: EJC
2436: *
2437: * COMPILER BLOCK (CMBLK)
2438: *
2439: * A COMPILER BLOCK (CMBLK) IS BUILT BY EXPAN TO REPRESENT
2440: * ONE NODE OF A TREE STRUCTURED EXPRESSION REPRESENTATION.
2441: *
2442: * +------------------------------------+
2443: * I CMIDN I
2444: * +------------------------------------+
2445: * I CMLEN I
2446: * +------------------------------------+
2447: * I CMTYP I
2448: * +------------------------------------+
2449: * I CMOPN I
2450: * +------------------------------------+
2451: * / CMVLS OR CMROP /
2452: * / /
2453: * / CMLOP /
2454: * / /
2455: * +------------------------------------+
2456: *
2457: CMIDN EQU 0 POINTER TO DUMMY ROUTINE B$CMT
2458: CMLEN EQU CMIDN+1 LENGTH OF CMBLK IN BYTES
2459: CMTYP EQU CMLEN+1 TYPE (C$XXX, SEE LIST BELOW)
2460: CMOPN EQU CMTYP+1 OPERAND POINTER (SEE BELOW)
2461: CMVLS EQU CMOPN+1 OPERAND VALUE POINTERS (SEE BELOW)
2462: CMROP EQU CMVLS RIGHT (ONLY) OPERATOR OPERAND
2463: CMLOP EQU CMVLS+1 LEFT OPERATOR OPERAND
2464: CMSI$ EQU CMVLS NUMBER OF STANDARD FIELDS IN CMBLK
2465: CMUS$ EQU CMSI$+1 SIZE OF UNARY OPERATOR CMBLK
2466: CMBS$ EQU CMSI$+2 SIZE OF BINARY OPERATOR CMBLK
2467: CMAR1 EQU CMVLS+1 ARRAY SUBSCRIPT POINTERS
2468: *
2469: * THE CMOPN AND CMVLS FIELDS ARE SET AS FOLLOWS
2470: *
2471: * ARRAY REFERENCE CMOPN = PTR TO ARRAY OPERAND
2472: * CMVLS = PTRS TO SUBSCRIPT OPERANDS
2473: *
2474: * FUNCTION CALL CMOPN = PTR TO VRBLK FOR FUNCTION
2475: * CMVLS = PTRS TO ARGUMENT OPERANDS
2476: *
2477: * SELECTION CMOPN = ZERO
2478: * CMVLS = PTRS TO ALTERNATE OPERANDS
2479: *
2480: * UNARY OPERATOR CMOPN = PTR TO OPERATOR DVBLK
2481: * CMROP = PTR TO OPERAND
2482: *
2483: * BINARY OPERATOR CMOPN = PTR TO OPERATOR DVBLK
2484: * CMROP = PTR TO RIGHT OPERAND
2485: * CMLOP = PTR TO LEFT OPERAND
2486: EJC
2487: *
2488: * CMTYP IS SET TO INDICATE THE TYPE OF EXPRESSION ELEMENT
2489: * AS SHOWN BY THE FOLLOWING TABLE OF DEFINITIONS.
2490: *
2491: C$ARR EQU 0 ARRAY REFERENCE
2492: C$FNC EQU C$ARR+1 FUNCTION CALL
2493: C$DEF EQU C$FNC+1 DEFERRED EXPRESSION (UNARY *)
2494: C$IND EQU C$DEF+1 INDIRECTION (UNARY $)
2495: C$KEY EQU C$IND+1 KEYWORD REFERENCE (UNARY AMPERSAND)
2496: C$UBO EQU C$KEY+1 UNDEFINED BINARY OPERATOR
2497: C$UUO EQU C$UBO+1 UNDEFINED UNARY OPERATOR
2498: C$UO$ EQU C$UUO+1 TEST VALUE (=C$UUO+1=C$UBO+2)
2499: C$$NM EQU C$UUO+1 NUMBER OF CODES FOR NAME OPERANDS
2500: *
2501: * THE REMAINING TYPES INDICATE EXPRESSION ELEMENTS WHICH
2502: * CAN ONLY BE EVALUATED BY VALUE (NOT BY NAME).
2503: *
2504: C$BVL EQU C$UUO+1 BINARY OP WITH VALUE OPERANDS
2505: C$UVL EQU C$BVL+1 UNARY OPERATOR WITH VALUE OPERAND
2506: C$ALT EQU C$UVL+1 ALTERNATION (BINARY BAR)
2507: C$CNC EQU C$ALT+1 CONCATENATION
2508: C$CNP EQU C$CNC+1 CONCATENATION, NOT PATTERN MATCH
2509: C$UNM EQU C$CNP+1 UNARY OP WITH NAME OPERAND
2510: C$BVN EQU C$UNM+1 BINARY OP (OPERANDS BY VALUE, NAME)
2511: C$ASS EQU C$BVN+1 ASSIGNMENT
2512: C$INT EQU C$ASS+1 INTERROGATION
2513: C$NEG EQU C$INT+1 NEGATION (UNARY NOT)
2514: C$SEL EQU C$NEG+1 SELECTION
2515: C$PMT EQU C$SEL+1 PATTERN MATCH
2516: *
2517: C$PR$ EQU C$BVN LAST PREEVALUABLE CODE
2518: C$$NV EQU C$PMT+1 NUMBER OF DIFFERENT CMBLK TYPES
2519: EJC
2520: *
2521: * CHARACTER TABLE BLOCK (CTBLK)
2522: *
2523: * A CHARACTER TABLE BLOCK IS USED TO HOLD LOGICAL CHARACTER
2524: * TABLES FOR USE WITH ANY,NOTANY,SPAN,BREAK,BREAKX
2525: * PATTERNS. EACH CHARACTER TABLE CAN BE USED TO STORE
2526: * CFP$N DISTINCT TABLES AS BIT COLUMNS. A BIT COLUMN
2527: * ALLOCATED FOR EACH ARGUMENT OF MORE THAN ONE CHARACTER
2528: * IN LENGTH TO ONE OF THE ABOVE LISTED PATTERN PRIMITIVES.
2529: *
2530: * +------------------------------------+
2531: * I CTTYP I
2532: * +------------------------------------+
2533: * * *
2534: * * *
2535: * * CTCHS *
2536: * * *
2537: * * *
2538: * +------------------------------------+
2539: *
2540: CTTYP EQU 0 POINTER TO DUMMY ROUTINE B$CTT
2541: CTCHS EQU CTTYP+1 START OF CHARACTER TABLE WORDS
2542: CTSI$ EQU CTCHS+CFP$A NUMBER OF WORDS IN CTBLK
2543: *
2544: * CTCHS IS CFP$A WORDS LONG AND CONSISTS OF A ONE WORD
2545: * BIT STRING VALUE FOR EACH POSSIBLE CHARACTER IN THE
2546: * INTERNAL ALPHABET. EACH OF THE CFP$N POSSIBLE BITS IN
2547: * A BITSTRING IS USED TO FORM A COLUMN OF BIT INDICATORS.
2548: * A BIT IS SET ON IF THE CHARACTER IS IN THE TABLE AND OFF
2549: * IF THE CHARACTER IS NOT PRESENT.
2550: EJC
2551: *
2552: * DATATYPE FUNCTION BLOCK (DFBLK)
2553: *
2554: * A DATATYPE FUNCTION IS USED TO CONTROL THE CONSTRUCTION
2555: * OF A PROGRAM DEFINED DATATYPE OBJECT. A CALL TO THE
2556: * SYSTEM FUNCTION DATA BUILDS A DFBLK FOR THE DATATYPE NAME
2557: *
2558: * NOTE THAT THESE BLOCKS ARE BUILT IN STATIC BECAUSE PDBLK
2559: * LENGTH IS GOT FROM DFLEN FIELD. IF DFBLK WAS IN DYNAMIC
2560: * STORE THIS WOULD CAUSE TROUBLE DURING PASS TWO OF GARBAGE
2561: * COLLECTION. SCBLK REFERRED TO BY DFNAM FIELD IS ALSO PUT
2562: * IN STATIC SO THAT THERE ARE NO RELOC. FIELDS. THIS CUTS
2563: * GARBAGE COLLECTION TASK APPRECIABLY FOR PDBLKS WHICH ARE
2564: * LIKELY TO BE PRESENT IN LARGE NUMBERS.
2565: *
2566: * +------------------------------------+
2567: * I FCODE I
2568: * +------------------------------------+
2569: * I FARGS I
2570: * +------------------------------------+
2571: * I DFLEN I
2572: * +------------------------------------+
2573: * I DFPDL I
2574: * +------------------------------------+
2575: * I DFNAM I
2576: * +------------------------------------+
2577: * / /
2578: * / DFFLD /
2579: * / /
2580: * +------------------------------------+
2581: *
2582: DFLEN EQU FARGS+1 LENGTH OF DFBLK IN BYTES
2583: DFPDL EQU DFLEN+1 LENGTH OF CORRESPONDING PDBLK
2584: DFNAM EQU DFPDL+1 POINTER TO SCBLK FOR DATATYPE NAME
2585: DFFLD EQU DFNAM+1 START OF VRBLK PTRS FOR FIELD NAMES
2586: DFFLB EQU DFFLD-1 OFFSET BEHIND DFFLD FOR FIELD FUNC
2587: DFSI$ EQU DFFLD NUMBER OF STANDARD FIELDS IN DFBLK
2588: *
2589: * THE FCODE FIELD POINTS TO THE ROUTINE B$DFC
2590: *
2591: * FARGS (THE NUMBER OF ARGUMENTS) IS THE NUMBER OF FIELDS.
2592: EJC
2593: *
2594: * DOPE VECTOR BLOCK (DVBLK)
2595: *
2596: * A DOPE VECTOR IS ASSEMBLED FOR EACH POSSIBLE OPERATOR IN
2597: * THE SNOBOL4 LANGUAGE AS PART OF THE CONSTANT SECTION.
2598: *
2599: * +------------------------------------+
2600: * I DVOPN I
2601: * +------------------------------------+
2602: * I DVTYP I
2603: * +------------------------------------+
2604: * I DVLPR I
2605: * +------------------------------------+
2606: * I DVRPR I
2607: * +------------------------------------+
2608: *
2609: DVOPN EQU 0 ENTRY ADDRESS (PTR TO O$XXX)
2610: DVTYP EQU DVOPN+1 TYPE CODE (C$XXX, SEE CMBLK)
2611: DVLPR EQU DVTYP+1 LEFT PRECEDENCE (LLXXX, SEE BELOW)
2612: DVRPR EQU DVLPR+1 RIGHT PRECEDENCE (RRXXX, SEE BELOW)
2613: DVUS$ EQU DVLPR+1 SIZE OF UNARY OPERATOR DV
2614: DVBS$ EQU DVRPR+1 SIZE OF BINARY OPERATOR DV
2615: DVUBS EQU DVUS$+DVBS$ SIZE OF UNOP + BINOP (SEE SCANE)
2616: *
2617: * THE CONTENTS OF THE DVTYP FIELD IS COPIED INTO THE CMTYP
2618: * FIELD OF THE CMBLK FOR THE OPERATOR IF IT IS USED.
2619: *
2620: * THE CMOPN FIELD OF AN OPERATOR CMBLK POINTS TO THE DVBLK
2621: * ITSELF, PROVIDING THE REQUIRED ENTRY ADDRESS POINTER PTR.
2622: *
2623: * FOR NORMALLY UNDEFINED OPERATORS, THE DVOPN (AND CMOPN)
2624: * FIELDS CONTAIN A WORD OFFSET FROM R$UBA OF THE FUNCTION
2625: * BLOCK POINTER FOR THE OPERATOR (INSTEAD OF O$XXX PTR).
2626: * FOR CERTAIN SPECIAL OPERATORS, THE DVOPN FIELD IS NOT
2627: * REQUIRED AT ALL AND IS ASSEMBLED AS ZERO.
2628: *
2629: * THE LEFT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO
2630: * THE LEFT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS THE
2631: * PRECEDENCE OF THE OPERATOR TOWARDS ITS RIGHT OPERAND.
2632: *
2633: * THE RIGHT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO
2634: * THE RIGHT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS
2635: * THE PRECEDENCE OF THE OPERATOR TOWARDS ITS LEFT OPERAND.
2636: *
2637: * HIGHER PRECEDENCE VALUES CORRESPOND TO A TIGHTER BINDING
2638: * CAPABILITY. THUS WE HAVE THE LEFT PRECEDENCE LOWER
2639: * (HIGHER) THAN THE RIGHT PRECEDENCE FOR RIGHT (LEFT)
2640: * ASSOCIATIVE BINARY OPERATORS.
2641: *
2642: * THE LEFT PRECEDENCE OF UNARY OPERATORS IS SET TO AN
2643: * ARBITRARY HIGH VALUE. THE RIGHT VALUE IS NOT REQUIRED AND
2644: * CONSEQUENTLY THE DVRPR FIELD IS OMITTED FOR UNARY OPS.
2645: EJC
2646: *
2647: * TABLE OF OPERATOR PRECEDENCE VALUES
2648: *
2649: RRASS EQU 10 RIGHT EQUAL
2650: LLASS EQU 00 LEFT EQUAL
2651: RRPMT EQU 20 RIGHT QUESTION MARK
2652: LLPMT EQU 30 LEFT QUESTION MARK
2653: RRAMP EQU 40 RIGHT AMPERSAND
2654: LLAMP EQU 50 LEFT AMPERSAND
2655: RRALT EQU 70 RIGHT VERTICAL BAR
2656: LLALT EQU 60 LEFT VERTICAL BAR
2657: RRCNC EQU 90 RIGHT BLANK
2658: LLCNC EQU 80 LEFT BLANK
2659: RRATS EQU 110 RIGHT AT
2660: LLATS EQU 100 LEFT AT
2661: RRPLM EQU 120 RIGHT PLUS, MINUS
2662: LLPLM EQU 130 LEFT PLUS, MINUS
2663: RRNUM EQU 140 RIGHT NUMBER
2664: LLNUM EQU 150 LEFT NUMBER
2665: RRDVD EQU 160 RIGHT SLASH
2666: LLDVD EQU 170 LEFT SLASH
2667: RRMLT EQU 180 RIGHT ASTERISK
2668: LLMLT EQU 190 LEFT ASTERISK
2669: RRPCT EQU 200 RIGHT PERCENT
2670: LLPCT EQU 210 LEFT PERCENT
2671: RREXP EQU 230 RIGHT EXCLAMATION
2672: LLEXP EQU 220 LEFT EXCLAMATION
2673: RRDLD EQU 240 RIGHT DOLLAR, DOT
2674: LLDLD EQU 250 LEFT DOLLAR, DOT
2675: RRNOT EQU 270 RIGHT NOT
2676: LLNOT EQU 260 LEFT NOT
2677: LLUNO EQU 999 LEFT ALL UNARY OPERATORS
2678: *
2679: * PRECEDENCES ARE THE SAME AS IN BTL SNOBOL4 WITH THE
2680: * FOLLOWING EXCEPTIONS.
2681: *
2682: * 1) BINARY QUESTION MARK IS LOWERED AND MADE LEFT ASSOC-
2683: * IATIVE TO REFLECT ITS NEW USE FOR PATTERN MATCHING.
2684: *
2685: * 2) ALTERNATION AND CONCATENATION ARE MADE RIGHT
2686: * ASSOCIATIVE FOR GREATER EFFICIENCY IN PATTERN
2687: * CONSTRUCTION AND MATCHING RESPECTIVELY. THIS CHANGE
2688: * IS TRANSPARENT TO THE SNOBOL4 PROGRAMMER.
2689: *
2690: * 3) THE EQUAL SIGN HAS BEEN ADDED AS A LOW PRECEDENCE
2691: * OPERATOR WHICH IS RIGHT ASSOCIATIVE TO REFLECT ITS
2692: * MORE GENERAL USAGE IN THIS VERSION OF SNOBOL4.
2693: EJC
2694: *
2695: * EXTERNAL FUNCTION BLOCK (EFBLK)
2696: *
2697: * AN EXTERNAL FUNCTION BLOCK IS USED TO CONTROL THE CALLING
2698: * OF AN EXTERNAL FUNCTION. IT IS BUILT BY A CALL TO LOAD.
2699: *
2700: * +------------------------------------+
2701: * I FCODE I
2702: * +------------------------------------+
2703: * I FARGS I
2704: * +------------------------------------+
2705: * I EFLEN I
2706: * +------------------------------------+
2707: * I EFUSE I
2708: * +------------------------------------+
2709: * I EFCOD I
2710: * +------------------------------------+
2711: * I EFVAR I
2712: * +------------------------------------+
2713: * I EFRSL I
2714: * +------------------------------------+
2715: * / /
2716: * / EFTAR /
2717: * / /
2718: * +------------------------------------+
2719: *
2720: EFLEN EQU FARGS+1 LENGTH OF EFBLK IN BYTES
2721: EFUSE EQU EFLEN+1 USE COUNT (FOR OPSYN)
2722: EFCOD EQU EFUSE+1 PTR TO CODE (FROM SYSLD)
2723: EFVAR EQU EFCOD+1 PTR TO ASSOCIATED VRBLK
2724: EFRSL EQU EFVAR+1 RESULT TYPE (SEE BELOW)
2725: EFTAR EQU EFRSL+1 ARGUMENT TYPES (SEE BELOW)
2726: EFSI$ EQU EFTAR NUMBER OF STANDARD FIELDS IN EFBLK
2727: *
2728: * THE FCODE FIELD POINTS TO THE ROUTINE B$EFC.
2729: *
2730: * EFUSE IS USED TO KEEP TRACK OF MULTIPLE USE WHEN OPSYN
2731: * IS EMPLOYED. THE FUNCTION IS AUTOMATICALLY UNLOADED
2732: * WHEN THERE ARE NO MORE REFERENCES TO THE FUNCTION.
2733: *
2734: * EFRSL AND EFTAR ARE TYPE CODES AS FOLLOWS.
2735: *
2736: * 0 TYPE IS UNCONVERTED
2737: * 1 TYPE IS STRING
2738: * 2 TYPE IS INTEGER
2739: * 3 TYPE IS REAL
2740: EJC
2741: *
2742: * EXPRESSION VARIABLE BLOCK (EVBLK)
2743: *
2744: * IN THIS VERSION OF SPITBOL, AN EXPRESSION CAN BE USED IN
2745: * ANY POSITION WHICH WOULD NORMALLY EXPECT A NAME (FOR
2746: * EXAMPLE ON THE LEFT SIDE OF EQUALS OR AS THE RIGHT
2747: * ARGUMENT OF BINARY DOT). THIS CORRESPONDS TO THE CREATION
2748: * OF A PSEUDO-VARIABLE WHICH IS REPRESENTED BY A POINTER TO
2749: * AN EXPRESSION VARIABLE BLOCK AS FOLLOWS.
2750: *
2751: * +------------------------------------+
2752: * I EVTYP I
2753: * +------------------------------------+
2754: * I EVEXP I
2755: * +------------------------------------+
2756: * I EVVAR I
2757: * +------------------------------------+
2758: *
2759: EVTYP EQU 0 POINTER TO DUMMY ROUTINE B$EVT
2760: EVEXP EQU EVTYP+1 POINTER TO EXBLK FOR EXPRESSION
2761: EVVAR EQU EVEXP+1 POINTER TO TRBEV DUMMY TRBLK
2762: EVSI$ EQU EVVAR+1 SIZE OF EVBLK
2763: *
2764: * THE NAME OF AN EXPRESSION VARIABLE IS REPRESENTED BY A
2765: * BASE POINTER TO THE EVBLK AND AN OFFSET OF EVVAR. THIS
2766: * VALUE APPEARS TO BE TRAPPED BY THE DUMMY TRBEV BLOCK.
2767: *
2768: * NOTE THAT THERE IS NO NEED TO ALLOW FOR THE CASE OF AN
2769: * EXPRESSION VARIABLE WHICH REFERENCES AN SEBLK SINCE A
2770: * VARIABLE WHICH IS OF THE FORM *VAR IS EQUIVALENT TO VAR.
2771: EJC
2772: *
2773: * EXPRESSION BLOCK (EXBLK)
2774: *
2775: * AN EXPRESSION BLOCK IS BUILT FOR EACH EXPRESSION
2776: * REFERENCED IN A PROGRAM OR CREATED BY EVAL OR CONVERT
2777: * DURING EXECUTION OF A PROGRAM.
2778: *
2779: * +------------------------------------+
2780: * I EXTYP I
2781: * +------------------------------------+
2782: * I EXSTM I
2783: * +------------------------------------+
2784: * I EXLEN I
2785: * +------------------------------------+
2786: * I EXFLC I
2787: * +------------------------------------+
2788: * / /
2789: * / EXCOD /
2790: * / /
2791: * +------------------------------------+
2792: *
2793: EXTYP EQU 0 PTR TO ROUTINE B$EXL TO LOAD EXPR
2794: EXSTM EQU CDSTM STORES STMNT NO. DURING EVALUATION
2795: EXLEN EQU EXSTM+1 LENGTH OF EXBLK IN BYTES
2796: EXFLC EQU EXLEN+1 FAILURE CODE (=O$FEX)
2797: EXCOD EQU EXFLC+1 PSEUDO-CODE FOR EXPRESSION
2798: EXSI$ EQU EXCOD NUMBER OF STANDARD FIELDS IN EXBLK
2799: *
2800: * THERE ARE TWO CASES FOR EXCOD DEPENDING ON WHETHER THE
2801: * EXPRESSION CAN BE EVALUATED BY NAME (SEE DESCRIPTION
2802: * OF CDBLK FOR DETAILS OF CODE FOR EXPRESSIONS).
2803: *
2804: * IF THE EXPRESSION CAN BE EVALUATED BY NAME WE HAVE.
2805: *
2806: * (CODE FOR EXPR BY NAME)
2807: * =O$RNM
2808: *
2809: * IF THE EXPRESSION CAN ONLY BE EVALUATED BY VALUE.
2810: *
2811: * (CODE FOR EXPR BY VALUE)
2812: * =O$RVL
2813: EJC
2814: *
2815: * FIELD FUNCTION BLOCK (FFBLK)
2816: *
2817: * A FIELD FUNCTION BLOCK IS USED TO CONTROL THE SELECTION
2818: * OF A FIELD FROM A PROGRAM DEFINED DATATYPE BLOCK.
2819: * A CALL TO DATA CREATES AN FFBLK FOR EACH FIELD.
2820: *
2821: * +------------------------------------+
2822: * I FCODE I
2823: * +------------------------------------+
2824: * I FARGS I
2825: * +------------------------------------+
2826: * I FFDFP I
2827: * +------------------------------------+
2828: * I FFNXT I
2829: * +------------------------------------+
2830: * I FFOFS I
2831: * +------------------------------------+
2832: *
2833: FFDFP EQU FARGS+1 POINTER TO ASSOCIATED DFBLK
2834: FFNXT EQU FFDFP+1 PTR TO NEXT FFBLK ON CHAIN OR ZERO
2835: FFOFS EQU FFNXT+1 OFFSET (BYTES) TO FIELD IN PDBLK
2836: FFSI$ EQU FFOFS+1 SIZE OF FFBLK IN WORDS
2837: *
2838: * THE FCODE FIELD POINTS TO THE ROUTINE B$FFC.
2839: *
2840: * FARGS ALWAYS CONTAINS ONE.
2841: *
2842: * FFDFP IS USED TO VERIFY THAT THE CORRECT PROGRAM DEFINED
2843: * DATATYPE IS BEING ACCESSED BY THIS CALL.
2844: * FFDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC
2845: *
2846: * FFOFS IS USED TO SELECT THE APPROPRIATE FIELD. NOTE THAT
2847: * IT IS AN ACTUAL OFFSET (NOT A FIELD NUMBER)
2848: *
2849: * FFNXT IS USED TO POINT TO THE NEXT FFBLK OF THE SAME NAME
2850: * IN THE CASE WHERE THERE ARE SEVERAL FIELDS OF THE SAME
2851: * NAME FOR DIFFERENT DATATYPES. ZERO MARKS THE END OF CHAIN
2852: EJC
2853: *
2854: * INTEGER CONSTANT BLOCK (ICBLK)
2855: *
2856: * AN ICBLK IS CREATED FOR EVERY INTEGER REFERENCED OR
2857: * CREATED BY A PROGRAM. NOTE HOWEVER THAT CERTAIN INTERNAL
2858: * INTEGER VALUES ARE STORED AS ADDRESSES (E.G. THE LENGTH
2859: * FIELD IN A STRING CONSTANT BLOCK)
2860: *
2861: * +------------------------------------+
2862: * I ICGET I
2863: * +------------------------------------+
2864: * * ICVAL *
2865: * +------------------------------------+
2866: *
2867: ICGET EQU 0 PTR TO ROUTINE B$ICL TO LOAD INT
2868: ICVAL EQU ICGET+1 INTEGER VALUE
2869: ICSI$ EQU ICVAL+CFP$I SIZE OF ICBLK
2870: *
2871: * THE LENGTH OF THE ICVAL FIELD IS CFP$I.
2872: EJC
2873: *
2874: * KEYWORD VARIABLE BLOCK (KVBLK)
2875: *
2876: * A KVBLK IS USED TO REPRESENT A KEYWORD PSEUDO-VARIABLE.
2877: * A KVBLK IS BUILT FOR EACH KEYWORD REFERENCE (KWNAM).
2878: *
2879: * +------------------------------------+
2880: * I KVTYP I
2881: * +------------------------------------+
2882: * I KVVAR I
2883: * +------------------------------------+
2884: * I KVNUM I
2885: * +------------------------------------+
2886: *
2887: KVTYP EQU 0 POINTER TO DUMMY ROUTINE B$KVT
2888: KVVAR EQU KVTYP+1 POINTER TO DUMMY BLOCK TRBKV
2889: KVNUM EQU KVVAR+1 KEYWORD NUMBER
2890: KVSI$ EQU KVNUM+1 SIZE OF KVBLK
2891: *
2892: * THE NAME OF A KEYWORD VARIABLE IS REPRESENTED BY A
2893: * BASE POINTER TO THE KVBLK AND AN OFFSET OF KVVAR. THE
2894: * VALUE APPEARS TO BE TRAPPED BY THE POINTER TO TRBKV.
2895: EJC
2896: *
2897: * NAME BLOCK (NMBLK)
2898: *
2899: * A NAME BLOCK IS USED WHEREVER A NAME MUST BE STORED AS
2900: * A VALUE FOLLOWING USE OF THE UNARY DOT OPERATOR.
2901: *
2902: * +------------------------------------+
2903: * I NMTYP I
2904: * +------------------------------------+
2905: * I NMBAS I
2906: * +------------------------------------+
2907: * I NMOFS I
2908: * +------------------------------------+
2909: *
2910: NMTYP EQU 0 PTR TO ROUTINE B$NML TO LOAD NAME
2911: NMBAS EQU NMTYP+1 BASE POINTER FOR VARIABLE
2912: NMOFS EQU NMBAS+1 OFFSET FOR VARIABLE
2913: NMSI$ EQU NMOFS+1 SIZE OF NMBLK
2914: *
2915: * THE ACTUAL FIELD REPRESENTING THE CONTENTS OF THE NAME
2916: * IS FOUND NMOFS BYTES PAST THE ADDRESS IN NMBAS.
2917: *
2918: * THE NAME IS SPLIT INTO BASE AND OFFSET FORM TO AVOID
2919: * CREATION OF A POINTER INTO THE MIDDLE OF A BLOCK WHICH
2920: * COULD NOT BE HANDLED PROPERLY BY THE GARBAGE COLLECTOR.
2921: *
2922: * A NAME MAY BE BUILT FOR ANY VARIABLE (SEE SECTION ON
2923: * REPRESENTATIONS OF VARIABLES) THIS INCLUDES THE
2924: * CASES OF PSEUDO-VARIABLES.
2925: EJC
2926: *
2927: * PATTERN BLOCK, NO PARAMETERS (P0BLK)
2928: *
2929: * A P0BLK IS USED TO REPRESENT PATTERN NODES WHICH DO
2930: * NOT REQUIRE THE USE OF ANY PARAMETER VALUES.
2931: *
2932: * +------------------------------------+
2933: * I PCODE I
2934: * +------------------------------------+
2935: * I PTHEN I
2936: * +------------------------------------+
2937: *
2938: PCODE EQU 0 PTR TO MATCH ROUTINE (P$XXX)
2939: PTHEN EQU PCODE+1 POINTER TO SUBSEQUENT NODE
2940: PASI$ EQU PTHEN+1 SIZE OF P0BLK
2941: *
2942: * PTHEN POINTS TO THE PATTERN BLOCK FOR THE SUBSEQUENT
2943: * NODE TO BE MATCHED. THIS IS A POINTER TO THE PATTERN
2944: * BLOCK NDNTH IF THERE IS NO SUBSEQUENT (END OF PATTERN)
2945: *
2946: * PCODE IS A POINTER TO THE MATCH ROUTINE FOR THE NODE.
2947: EJC
2948: *
2949: * PATTERN BLOCK (ONE PARAMETER)
2950: *
2951: * A P1BLK IS USED TO REPRESENT PATTERN NODES WHICH
2952: * REQUIRE ONE PARAMETER VALUE.
2953: *
2954: * +------------------------------------+
2955: * I PCODE I
2956: * +------------------------------------+
2957: * I PTHEN I
2958: * +------------------------------------+
2959: * I PARM1 I
2960: * +------------------------------------+
2961: *
2962: PARM1 EQU PTHEN+1 FIRST PARAMETER VALUE
2963: PBSI$ EQU PARM1+1 SIZE OF P1BLK IN WORDS
2964: *
2965: * SEE P0BLK FOR DEFINITIONS OF PCODE, PTHEN
2966: *
2967: * PARM1 CONTAINS A PARAMETER VALUE USED IN MATCHING THE
2968: * NODE. FOR EXAMPLE, IN A LEN PATTERN, IT IS THE INTEGER
2969: * ARGUMENT TO LEN. THE DETAILS OF THE USE OF THE PARAMETER
2970: * FIELD ARE INCLUDED IN THE DESCRIPTION OF THE INDIVIDUAL
2971: * MATCH ROUTINES. PARM1 IS ALWAYS AN ADDRESS POINTER WHICH
2972: * IS PROCESSED BY THE GARBAGE COLLECTOR.
2973: EJC
2974: *
2975: * PATTERN BLOCK (TWO PARAMETERS)
2976: *
2977: * A P2BLK IS USED TO REPRESENT PATTERN NODES WHICH
2978: * REQUIRE TWO PARAMETER VALUES.
2979: *
2980: * +------------------------------------+
2981: * I PCODE I
2982: * +------------------------------------+
2983: * I PTHEN I
2984: * +------------------------------------+
2985: * I PARM1 I
2986: * +------------------------------------+
2987: * I PARM2 I
2988: * +------------------------------------+
2989: *
2990: PARM2 EQU PARM1+1 SECOND PARAMETER VALUE
2991: PCSI$ EQU PARM2+1 SIZE OF P2BLK IN WORDS
2992: *
2993: * SEE P1BLK FOR DEFINITIONS OF PCODE, PTHEN, PARM1
2994: *
2995: * PARM2 IS A PARAMETER WHICH PERFORMS THE SAME SORT OF
2996: * FUNCTION AS PARM1 (SEE DESCRIPTION OF P1BLK).
2997: *
2998: * PARM2 IS A NON-RELOCATABLE FIELD AND IS NOT
2999: * PROCESSED BY THE GARBAGE COLLECTOR. ACCORDINGLY, IT MAY
3000: * NOT CONTAIN A POINTER TO A BLOCK IN DYNAMIC MEMORY.
3001: EJC
3002: *
3003: * PROGRAM-DEFINED DATATYPE BLOCK
3004: *
3005: * A PDBLK REPRESENTS THE DATA ITEM FORMED BY A CALL TO A
3006: * DATATYPE FUNCTION AS DEFINED BY THE SYSTEM FUNCTION DATA.
3007: *
3008: * +------------------------------------+
3009: * I PDTYP I
3010: * +------------------------------------+
3011: * I IDVAL I
3012: * +------------------------------------+
3013: * I PDDFP I
3014: * +------------------------------------+
3015: * / /
3016: * / PDFLD /
3017: * / /
3018: * +------------------------------------+
3019: *
3020: PDTYP EQU 0 PTR TO DUMMY ROUTINE B$PDT
3021: PDDFP EQU IDVAL+1 PTR TO ASSOCIATED DFBLK
3022: PDFLD EQU PDDFP+1 START OF FIELD VALUE POINTERS
3023: PDFOF EQU DFFLD-PDFLD DIFFERENCE IN OFFSET TO FIELD PTRS
3024: PDSI$ EQU PDFLD SIZE OF STANDARD FIELDS IN PDBLK
3025: PDDFS EQU DFSI$-PDSI$ DIFFERENCE IN DFBLK, PDBLK SIZES
3026: *
3027: * THE PDDFP POINTER MAY BE USED TO DETERMINE THE DATATYPE
3028: * AND THE NAMES OF THE FIELDS IF REQUIRED. THE DFBLK ALSO
3029: * CONTAINS THE LENGTH OF THE PDBLK IN BYTES (FIELD DFPDL).
3030: * PDDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC
3031: *
3032: * PDFLD VALUES ARE STORED IN ORDER FROM LEFT TO RIGHT.
3033: * THEY CONTAIN VALUES OR POINTERS TO TRBLK CHAINS.
3034: EJC
3035: *
3036: * PROGRAM DEFINED FUNCTION BLOCK (PFBLK)
3037: *
3038: * A PFBLK IS CREATED FOR EACH CALL TO THE DEFINE FUNCTION
3039: * AND A POINTER TO THE PFBLK PLACED IN THE PROPER VRBLK.
3040: *
3041: * +------------------------------------+
3042: * I FCODE I
3043: * +------------------------------------+
3044: * I FARGS I
3045: * +------------------------------------+
3046: * I PFLEN I
3047: * +------------------------------------+
3048: * I PFVBL I
3049: * +------------------------------------+
3050: * I PFNLO I
3051: * +------------------------------------+
3052: * I PFCOD I
3053: * +------------------------------------+
3054: * I PFCTR I
3055: * +------------------------------------+
3056: * I PFRTR I
3057: * +------------------------------------+
3058: * / /
3059: * / PFARG /
3060: * / /
3061: * +------------------------------------+
3062: *
3063: PFLEN EQU FARGS+1 LENGTH OF PFBLK IN BYTES
3064: PFVBL EQU PFLEN+1 POINTER TO VRBLK FOR FUNCTION NAME
3065: PFNLO EQU PFVBL+1 NUMBER OF LOCALS
3066: PFCOD EQU PFNLO+1 PTR TO CDBLK FOR FIRST STATEMENT
3067: PFCTR EQU PFCOD+1 TRBLK PTR IF CALL TRACED ELSE 0
3068: PFRTR EQU PFCTR+1 TRBLK PTR IF RETURN TRACED ELSE 0
3069: PFARG EQU PFRTR+1 VRBLK PTRS FOR ARGUMENTS AND LOCALS
3070: PFAGB EQU PFARG-1 OFFSET BEHIND PFARG FOR ARG, LOCAL
3071: PFSI$ EQU PFARG NUMBER OF STANDARD FIELDS IN PFBLK
3072: *
3073: * THE FCODE FIELD POINTS TO THE ROUTINE B$PFC.
3074: *
3075: * PFARG IS STORED IN THE FOLLOWING ORDER.
3076: *
3077: * ARGUMENTS (LEFT TO RIGHT)
3078: * LOCALS (LEFT TO RIGHT)
3079: EJC
3080: *
3081: * REAL CONSTANT BLOCK (RCBLK)
3082: *
3083: * AN RCBLK IS CREATED FOR EVERY REAL REFERENCED OR
3084: * CREATED BY A PROGRAM.
3085: *
3086: * +------------------------------------+
3087: * I RCGET I
3088: * +------------------------------------+
3089: * * RCVAL *
3090: * +------------------------------------+
3091: *
3092: RCGET EQU 0 PTR TO ROUTINE B$RCL TO LOAD REAL
3093: RCVAL EQU RCGET+1 REAL VALUE
3094: RCSI$ EQU RCVAL+CFP$R SIZE OF RCBLK
3095: *
3096: * THE LENGTH OF THE RCVAL FIELD IS CFP$R.
3097: EJC
3098: *
3099: * STRING CONSTANT BLOCK (SCBLK)
3100: *
3101: * AN SCBLK IS BUILT FOR EVERY STRING REFERENCED OR CREATED
3102: * BY A PROGRAM.
3103: *
3104: * +------------------------------------+
3105: * I SCGET I
3106: * +------------------------------------+
3107: * I SCLEN I
3108: * +------------------------------------+
3109: * / /
3110: * / SCHAR /
3111: * / /
3112: * +------------------------------------+
3113: *
3114: SCGET EQU 0 PTR TO ROUTINE B$SCL TO LOAD STRING
3115: SCLEN EQU SCGET+1 LENGTH OF STRING IN CHARACTERS
3116: SCHAR EQU SCLEN+1 CHARACTERS OF STRING
3117: SCSI$ EQU SCHAR SIZE OF STANDARD FIELDS IN SCBLK
3118: *
3119: * THE CHARACTERS OF THE STRING ARE STORED LEFT JUSTIFIED.
3120: * THE FINAL WORD IS PADDED ON THE RIGHT WITH ZEROS.
3121: * (I.E. THE CHARACTER WHOSE INTERNAL CODE IS ZERO).
3122: *
3123: * THE VALUE OF SCLEN MAY NOT EXCEED MXLEN. THIS ENSURES
3124: * THAT CHARACTER OFFSETS (E.G. THE PATTERN MATCH CURSOR)
3125: * CAN BE CORRECTLY PROCESSED BY THE GARBAGE COLLECTOR.
3126: *
3127: * NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING
3128: * IS GIVEN IN BYTES BY CFP$F AND THAT THIS VALUE IS
3129: * AUTOMATICALLY ALLOWED FOR IN PLC, PSC.
3130: * NOTE THAT FOR A SPITBOL SCBLK, THE VALUE OF CFP$F
3131: * IS GIVEN BY CFP$B*SCHAR.
3132: EJC
3133: *
3134: * SIMPLE EXPRESSION BLOCK (SEBLK)
3135: *
3136: * AN SEBLK IS USED TO REPRESENT AN EXPRESSION OF THE FORM
3137: * *(NATURAL VARIABLE). ALL OTHER EXPRESSIONS ARE EXBLKS.
3138: *
3139: * +------------------------------------+
3140: * I SETYP I
3141: * +------------------------------------+
3142: * I SEVAR I
3143: * +------------------------------------+
3144: *
3145: SETYP EQU 0 PTR TO ROUTINE B$SEL TO LOAD EXPR
3146: SEVAR EQU SETYP+1 PTR TO VRBLK FOR VARIABLE
3147: SESI$ EQU SEVAR+1 LENGTH OF SEBLK IN WORDS
3148: EJC
3149: *
3150: * STANDARD VARIABLE BLOCK (SVBLK)
3151: *
3152: * AN SVBLK IS ASSEMBLED IN THE CONSTANT SECTION FOR EACH
3153: * VARIABLE WHICH SATISFIES ONE OF THE FOLLOWING CONDITIONS.
3154: *
3155: * 1) IT IS THE NAME OF A SYSTEM FUNCTION
3156: * 2) IT HAS AN INITIAL VALUE
3157: * 3) IT HAS A KEYWORD ASSOCIATION
3158: * 4) IT HAS A STANDARD I/O ASSOCIATION
3159: * 6) IT HAS A STANDARD LABEL ASSOCIATION
3160: *
3161: * IF VRBLKS ARE CONSTRUCTED FOR ANY OF THESE VARIABLES,
3162: * THEN THE VRSVP FIELD POINTS TO THE SVBLK (SEE VRBLK)
3163: *
3164: * +------------------------------------+
3165: * I SVBIT I
3166: * +------------------------------------+
3167: * I SVLEN I
3168: * +------------------------------------+
3169: * I SVCHS I
3170: * +------------------------------------+
3171: * I SVKNM I
3172: * +------------------------------------+
3173: * I SVFNC I
3174: * +------------------------------------+
3175: * I SVNAR I
3176: * +------------------------------------+
3177: * I SVLBL I
3178: * +------------------------------------+
3179: * I SVVAL I
3180: * +------------------------------------+
3181: EJC
3182: *
3183: * STANDARD VARIABLE BLOCK (CONTINUED)
3184: *
3185: SVBIT EQU 0 BIT STRING INDICATING ATTRIBUTES
3186: SVLEN EQU 1 (=SCLEN) LENGTH OF NAME IN CHARS
3187: SVCHS EQU 2 (=SCHAR) CHARACTERS OF NAME
3188: SVSI$ EQU 2 NUMBER OF STANDARD FIELDS IN SVBLK
3189: SVPRE EQU 1 SET IF PREEVALUATION PERMITTED
3190: SVFFC EQU SVPRE+SVPRE SET ON IF FAST CALL PERMITTED
3191: SVCKW EQU SVFFC+SVFFC SET ON IF KEYWORD VALUE CONSTANT
3192: SVPRD EQU SVCKW+SVCKW SET ON IF PREDICATE FUNCTION
3193: SVNBT EQU 4 NUMBER OF BITS TO RIGHT OF SVKNM
3194: SVKNM EQU SVPRD+SVPRD SET ON IF KEYWORD ASSOCIATION
3195: SVFNC EQU SVKNM+SVKNM SET ON IF SYSTEM FUNCTION
3196: SVNAR EQU SVFNC+SVFNC SET ON IF SYSTEM FUNCTION
3197: SVLBL EQU SVNAR+SVNAR SET ON IF SYSTEM LABEL
3198: SVVAL EQU SVLBL+SVLBL SET ON IF PREDEFINED VALUE
3199: *
3200: * NOTE THAT THE LAST FIVE BITS CORRESPOND IN ORDER
3201: * TO THE FIELDS WHICH ARE PRESENT (SEE PROCEDURE GTNVR).
3202: *
3203: * THE FOLLOWING DEFINITIONS ARE USED IN THE SVBLK TABLE
3204: *
3205: SVFNF EQU SVFNC+SVNAR FUNCTION WITH NO FAST CALL
3206: SVFNN EQU SVFNF+SVFFC FUNCTION WITH FAST CALL, NO PREEVAL
3207: SVFNP EQU SVFNN+SVPRE FUNCTION ALLOWING PREEVALUATION
3208: SVFPR EQU SVFNN+SVPRD PREDICATE FUNCTION
3209: SVFNK EQU SVFNN+SVKNM NO PREEVAL FUNC + KEYWORD
3210: SVKWV EQU SVKNM+SVVAL KEYWORD + VALUE
3211: SVKWC EQU SVCKW+SVKNM KEYWORD WITH CONSTANT VALUE
3212: SVKVC EQU SVKWV+SVCKW CONSTANT KEYWORD + VALUE
3213: SVKVL EQU SVKVC+SVLBL CONSTANT KEYWORD + VALUE + LABEL
3214: SVFPK EQU SVFNP+SVKVC PREEVAL FCN + CONST KEYWD + VAL
3215: *
3216: * THE SVPRE BIT ALLOWS THE COMPILER TO PREEVALUATE A CALL
3217: * TO THE ASSOCIATED SYSTEM FUNCTION IF ALL THE ARGUMENTS
3218: * ARE THEMSELVES CONSTANTS. FUNCTIONS IN THIS CATEGORY
3219: * MUST HAVE NO SIDE EFFECTS AND MUST NEVER CAUSE FAILURE.
3220: * THE CALL MAY GENERATE AN ERROR CONDITION.
3221: *
3222: * THE SVFFC BIT ALLOWS THE COMPILER TO GENERATE THE SPECIAL
3223: * FAST CALL AFTER ADJUSTING THE NUMBER OF ARGUMENTS. ONLY
3224: * THE ITEM AND APPLY FUNCTIONS FALL OUTSIDE THIS CATEGORY.
3225: *
3226: * THE SVCKW BIT IS SET IF THE ASSOCIATED KEYWORD VALUE IS
3227: * A CONSTANT, THUS ALLOWING PREEVALUATION FOR A VALUE CALL.
3228: *
3229: * THE SVPRD BIT IS SET ON FOR ALL PREDICATE FUNCTIONS TO
3230: * ENABLE THE SPECIAL CONCATENATION CODE OPTIMIZATION.
3231: EJC
3232: *
3233: * SVBLK (CONTINUED)
3234: *
3235: * SVKNM KEYWORD NUMBER
3236: *
3237: * SVKNM IS PRESENT ONLY FOR A STANDARD KEYWORD ASSOC.
3238: * IT CONTAINS A KEYWORD NUMBER AS DEFINED BY THE
3239: * KEYWORD NUMBER TABLE GIVEN LATER ON.
3240: *
3241: * SVFNC SYSTEM FUNCTION POINTER
3242: *
3243: * SVFNC IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC.
3244: * IT IS A POINTER TO THE ACTUAL CODE FOR THE SYSTEM
3245: * FUNCTION. THE GENERATED CODE FOR A FAST CALL IS A
3246: * POINTER TO THE SVFNC FIELD OF THE SVBLK FOR THE
3247: * FUNCTION. THE VRFNC FIELD OF THE VRBLK POINTS TO
3248: * THIS SAME FIELD, IN WHICH CASE, IT SERVES AS THE
3249: * FCODE FIELD FOR THE FUNCTION CALL.
3250: *
3251: * SVNAR NUMBER OF FUNCTION ARGUMENTS
3252: *
3253: * SVNAR IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC.
3254: * IT IS THE NUMBER OF ARGUMENTS REQUIRED FOR A CALL
3255: * TO THE SYSTEM FUNCTION. THE COMPILER USES THIS
3256: * VALUE TO ADJUST THE NUMBER OF ARGUMENTS IN A FAST
3257: * CALL AND IN THE CASE OF A FUNCTION CALLED THROUGH
3258: * THE VRFNC FIELD OF THE VRBLK, THE SVNAR FIELD
3259: * SERVES AS THE FARGS FIELD FOR O$FNC. A SPECIAL
3260: * CASE OCCURS IF THIS VALUE IS SET TO 999. THIS IS
3261: * USED TO INDICATE THAT THE FUNCTION HAS A VARIABLE
3262: * NUMBER OF ARGUMENTS AND CAUSES O$FNC TO PASS CONTROL
3263: * WITHOUT ADJUSTING THE ARGUMENT COUNT. THE ONLY
3264: * PREDEFINED FUNCTIONS USING THIS ARE APPLY AND ITEM.
3265: *
3266: * SVLBL SYSTEM LABEL POINTER
3267: *
3268: * SVLBL IS PRESENT ONLY FOR A STANDARD LABEL ASSOC.
3269: * IT IS A POINTER TO A SYSTEM LABEL ROUTINE (L$XXX).
3270: * THE VRLBL FIELD OF THE CORRESPONDING VRBLK POINTS TO
3271: * THE SVLBL FIELD OF THE SVBLK.
3272: *
3273: * SVVAL SYSTEM VALUE POINTER
3274: *
3275: * SVVAL IS PRESENT ONLY FOR A STANDARD VALUE.
3276: * IT IS A POINTER TO THE PATTERN NODE (NDXXX) WHICH
3277: * IS THE STANDARD INITIAL VALUE OF THE VARIABLE.
3278: * THIS VALUE IS COPIED TO THE VRVAL FIELD OF THE VRBLK
3279: EJC
3280: *
3281: * SVBLK (CONTINUED)
3282: *
3283: * KEYWORD NUMBER TABLE
3284: *
3285: * THE FOLLOWING TABLE GIVES SYMBOLIC NAMES FOR KEYWORD
3286: * NUMBERS. THESE VALUES ARE STORED IN THE SVKNM FIELD OF
3287: * SVBLKS AND IN THE KVNUM FIELD OF KVBLKS. SEE ALSO
3288: * PROCEDURES ASIGN, ACESS AND KWNAM.
3289: *
3290: * UNPROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES
3291: *
3292: K$ABE EQU 0 ABEND
3293: K$ANC EQU K$ABE+CFP$B ANCHOR
3294: K$CAS EQU K$ANC+CFP$B CASE
3295: K$COD EQU K$CAS+CFP$B CODE
3296: K$DMP EQU K$COD+CFP$B DUMP
3297: K$ERL EQU K$DMP+CFP$B ERRLIMIT
3298: K$ERT EQU K$ERL+CFP$B ERRTYPE
3299: K$FTR EQU K$ERT+CFP$B FTRACE
3300: K$INP EQU K$FTR+CFP$B INPUT
3301: K$MXL EQU K$INP+CFP$B MAXLENGTH
3302: K$OUP EQU K$MXL+CFP$B OUTPUT
3303: K$PFL EQU K$OUP+CFP$B PROFILE
3304: K$TRA EQU K$PFL+CFP$B TRACE
3305: K$TRM EQU K$TRA+CFP$B TRIM
3306: *
3307: * PROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES
3308: *
3309: K$FNC EQU K$TRM+CFP$B FNCLEVEL
3310: K$LST EQU K$FNC+CFP$B LASTNO
3311: K$STN EQU K$LST+CFP$B STNO
3312: *
3313: * KEYWORDS WITH CONSTANT PATTERN VALUES
3314: *
3315: K$ABO EQU K$STN+CFP$B ABORT
3316: K$ARB EQU K$ABO+PASI$ ARB
3317: K$BAL EQU K$ARB+PASI$ BAL
3318: K$FAL EQU K$BAL+PASI$ FAIL
3319: K$FEN EQU K$FAL+PASI$ FENCE
3320: K$REM EQU K$FEN+PASI$ REM
3321: K$SUC EQU K$REM+PASI$ SUCCEED
3322: EJC
3323: *
3324: * KEYWORD NUMBER TABLE (CONTINUED)
3325: *
3326: * SPECIAL KEYWORDS
3327: *
3328: K$ALP EQU K$SUC+1 ALPHABET
3329: K$RTN EQU K$ALP+1 RTNTYPE
3330: K$STC EQU K$RTN+1 STCOUNT
3331: K$ETX EQU K$STC+1 ERRTEXT
3332: K$STL EQU K$ETX+1 STLIMIT
3333: *
3334: * RELATIVE OFFSETS OF SPECIAL KEYWORDS
3335: *
3336: K$$AL EQU K$ALP-K$ALP ALPHABET
3337: K$$RT EQU K$RTN-K$ALP RTNTYPE
3338: K$$SC EQU K$STC-K$ALP STCOUNT
3339: K$$ET EQU K$ETX-K$ALP ERRTEXT
3340: K$$SL EQU K$STL-K$ALP STLIMIT
3341: *
3342: * SYMBOLS USED IN ASIGN AND ACESS PROCEDURES
3343: *
3344: K$P$$ EQU K$FNC FIRST PROTECTED KEYWORD
3345: K$V$$ EQU K$ABO FIRST KEYWORD WITH CONSTANT VALUE
3346: K$S$$ EQU K$ALP FIRST KEYWORD WITH SPECIAL ACESS
3347: EJC
3348: *
3349: * FORMAT OF A TABLE BLOCK (TBBLK)
3350: *
3351: * A TABLE BLOCK IS USED TO REPRESENT A TABLE VALUE.
3352: * IT IS BUILT BY A CALL TO THE TABLE OR CONVERT FUNCTIONS.
3353: *
3354: * +------------------------------------+
3355: * I TBTYP I
3356: * +------------------------------------+
3357: * I IDVAL I
3358: * +------------------------------------+
3359: * I TBLEN I
3360: * +------------------------------------+
3361: * +------------------------------------+
3362: * I TBINV I
3363: * +------------------------------------+
3364: * / /
3365: * / TBBUK /
3366: * / /
3367: * +------------------------------------+
3368: *
3369: TBTYP EQU 0 POINTER TO DUMMY ROUTINE B$TBT
3370: TBLEN EQU OFFS2 LENGTH OF TBBLK IN BYTES
3371: TBINV EQU OFFS3 DEFAULT INITIAL LOOKUP VALUE
3372: TBBUK EQU TBINV+1 START OF HASH BUCKET POINTERS
3373: TBSI$ EQU TBBUK SIZE OF STANDARD FIELDS IN TBBLK
3374: TBNBK EQU 11 DEFAULT NO. OF BUCKETS
3375: *
3376: * THE TABLE BLOCK IS A HASH TABLE WHICH POINTS TO CHAINS
3377: * OF TABLE ELEMENT BLOCKS REPRESENTING THE ELEMENTS
3378: * IN THE TABLE WHICH HASH INTO THE SAME BUCKET.
3379: *
3380: * TBBUK ENTRIES EITHER POINT TO THE FIRST TEBLK ON THE
3381: * CHAIN OR THEY POINT TO THE TBBLK ITSELF TO INDICATE THE
3382: * END OF THE CHAIN.
3383: EJC
3384: *
3385: * TABLE ELEMENT BLOCK (TEBLK)
3386: *
3387: * A TABLE ELEMENT IS USED TO REPRESENT A SINGLE ENTRY IN
3388: * A TABLE (SEE DESCRIPTION OF TBBLK FORMAT FOR HASH TABLE)
3389: *
3390: * +------------------------------------+
3391: * I TETYP I
3392: * +------------------------------------+
3393: * I TESUB I
3394: * +------------------------------------+
3395: * I TEVAL I
3396: * +------------------------------------+
3397: * I TENXT I
3398: * +------------------------------------+
3399: *
3400: TETYP EQU 0 POINTER TO DUMMY ROUTINE B$TET
3401: TESUB EQU TETYP+1 SUBSCRIPT VALUE
3402: TEVAL EQU TESUB+1 (=VRVAL) TABLE ELEMENT VALUE
3403: TENXT EQU TEVAL+1 LINK TO NEXT TEBLK
3404: * SEE S$CNV WHERE RELATION IS ASSUMED WITH TENXT AND TBBUK
3405: TESI$ EQU TENXT+1 SIZE OF TEBLK IN WORDS
3406: *
3407: * TENXT POINTS TO THE NEXT TEBLK ON THE HASH CHAIN FROM THE
3408: * TBBUK CHAIN FOR THIS HASH INDEX. AT THE END OF THE CHAIN,
3409: * TENXT POINTS BACK TO THE START OF THE TBBLK.
3410: *
3411: * TEVAL CONTAINS A DATA POINTER OR A TRBLK POINTER.
3412: *
3413: * TESUB CONTAINS A DATA POINTER.
3414: EJC
3415: *
3416: * TRAP BLOCK (TRBLK)
3417: *
3418: * A TRAP BLOCK IS USED TO REPRESENT A TRACE OR INPUT OR
3419: * OUTPUT ASSOCIATION IN RESPONSE TO A CALL TO THE TRACE
3420: * INPUT OR OUTPUT SYSTEM FUNCTIONS. SEE BELOW FOR DETAILS
3421: *
3422: * +------------------------------------+
3423: * I TRIDN I
3424: * +------------------------------------+
3425: * I TRTYP I
3426: * +------------------------------------+
3427: * I TRVAL OR TRLBL OR TRNXT OR TRKVR I
3428: * +------------------------------------+
3429: * I TRTAG OR TRTER OR TRTRF I
3430: * +------------------------------------+
3431: * I TRFNC OR TRFPT I
3432: * +------------------------------------+
3433: *
3434: TRIDN EQU 0 POINTER TO DUMMY ROUTINE B$TRT
3435: TRTYP EQU TRIDN+1 TRAP TYPE CODE
3436: TRVAL EQU TRTYP+1 VALUE OF TRAPPED VARIABLE (=VRVAL)
3437: TRNXT EQU TRVAL PTR TO NEXT TRBLK ON TRBLK CHAIN
3438: TRLBL EQU TRVAL PTR TO ACTUAL LABEL (TRACED LABEL)
3439: TRKVR EQU TRVAL VRBLK POINTER FOR KEYWORD TRACE
3440: TRTAG EQU TRVAL+1 TRACE TAG
3441: TRTER EQU TRTAG PTR TO TERMINAL VRBLK OR NULL
3442: TRTRF EQU TRTAG PTR TO TRBLK HOLDING FCBLK PTR
3443: TRFNC EQU TRTAG+1 TRACE FUNCTION VRBLK (ZERO IF NONE)
3444: TRFPT EQU TRFNC FCBLK PTR FOR SYSIO
3445: TRSI$ EQU TRFNC+1 NUMBER OF WORDS IN TRBLK
3446: *
3447: TRTIN EQU 0 TRACE TYPE FOR INPUT ASSOCIATION
3448: TRTAC EQU TRTIN+1 TRACE TYPE FOR ACCESS TRACE
3449: TRTVL EQU TRTAC+1 TRACE TYPE FOR VALUE TRACE
3450: TRTOU EQU TRTVL+1 TRACE TYPE FOR OUTPUT ASSOCIATION
3451: TRTFC EQU TRTOU+1 TRACE TYPE FOR FCBLK IDENTIFICATION
3452: EJC
3453: *
3454: * TRAP BLOCK (CONTINUED)
3455: *
3456: * VARIABLE INPUT ASSOCIATION
3457: *
3458: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
3459: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
3460: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
3461: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
3462: *
3463: * TRTYP IS SET TO TRTIN
3464: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
3465: * TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS
3466: * FOR INPUT, TERMINAL, ELSE IT IS NULL.
3467: * TRTRF POINTS TO THE TRAP BLOCK WHICH IN TURN POINTS
3468: * TO AN FCBLK USED FOR I/O ASSOCIATION.
3469: * TRFPT IS THE FCBLK PTR RETURNED BY SYSIO.
3470: *
3471: * VARIABLE ACCESS TRACE ASSOCIATION
3472: *
3473: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
3474: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
3475: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
3476: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
3477: *
3478: * TRTYP IS SET TO TRTAC
3479: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
3480: * TRTAG IS THE TRACE TAG (0 IF NONE)
3481: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
3482: *
3483: * VARIABLE VALUE TRACE ASSOCIATION
3484: *
3485: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
3486: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
3487: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
3488: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
3489: *
3490: * TRTYP IS SET TO TRTVL
3491: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
3492: * TRTAG IS THE TRACE TAG (0 IF NONE)
3493: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
3494: EJC
3495: * TRAP BLOCK (CONTINUED)
3496: *
3497: * VARIABLE OUTPUT ASSOCIATION
3498: *
3499: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
3500: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
3501: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
3502: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
3503: *
3504: * TRTYP IS SET TO TRTOU
3505: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
3506: * TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS
3507: * FOR OUTPUT, TERMINAL, ELSE IT IS NULL.
3508: * TRTRF POINTS TO THE TRAP BLOCK WHICH IN TURN POINTS
3509: * TO AN FCBLK USED FOR I/O ASSOCIATION.
3510: * TRFPT IS THE FCBLK PTR RETURNED BY SYSIO.
3511: *
3512: * FUNCTION CALL TRACE
3513: *
3514: * THE PFCTR FIELD OF THE CORRESPONDING PFBLK IS SET
3515: * TO POINT TO A TRBLK.
3516: *
3517: * TRTYP IS SET TO TRTIN
3518: * TRNXT IS ZERO
3519: * TRTAG IS THE TRACE TAG (0 IF NONE)
3520: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
3521: *
3522: * FUNCTION RETURN TRACE
3523: *
3524: * THE PFRTR FIELD OF THE CORRESPONDING PFBLK IS SET
3525: * TO POINT TO A TRBLK
3526: *
3527: * TRTYP IS SET TO TRTIN
3528: * TRNXT IS ZERO
3529: * TRTAG IS THE TRACE TAG (0 IF NONE)
3530: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
3531: *
3532: * LABEL TRACE
3533: *
3534: * THE VRLBL OF THE VRBLK FOR THE LABEL IS
3535: * CHANGED TO POINT TO A TRBLK AND THE VRTRA FIELD IS
3536: * SET TO B$VRT TO ACTIVATE THE CHECK.
3537: *
3538: * TRTYP IS SET TO TRTIN
3539: * TRLBL POINTS TO THE ACTUAL LABEL (CDBLK) VALUE
3540: * TRTAG IS THE TRACE TAG (0 IF NONE)
3541: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
3542: EJC
3543: *
3544: * TRAP BLOCK (CONTINUED)
3545: *
3546: * KEYWORD TRACE
3547: *
3548: * KEYWORDS WHICH CAN BE TRACED POSSESS A UNIQUE
3549: * LOCATION WHICH IS ZERO IF THERE IS NO TRACE AND
3550: * POINTS TO A TRBLK IF THERE IS A TRACE. THE LOCATIONS
3551: * ARE AS FOLLOWS.
3552: *
3553: * R$ERT ERRTYPE
3554: * R$FNC FNCLEVEL
3555: * R$STC STCOUNT
3556: *
3557: * THE FORMAT OF THE TRBLK IS AS FOLLOWS.
3558: *
3559: * TRTYP IS SET TO TRTIN
3560: * TRKVR IS A POINTER TO THE VRBLK FOR THE KEYWORD
3561: * TRTAG IS THE TRACE TAG (0 IF NONE)
3562: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
3563: *
3564: * INPUT/OUTPUT FILE ARG1 TRAP BLOCK
3565: *
3566: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
3567: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE OF
3568: * A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
3569: * CONTAIN =B$VRA AND =B$VRV. THIS TRAP BLOCK IS USED
3570: * TO HOLD A POINTER TO THE FCBLK WHICH AN
3571: * IMPLEMENTATION MAY REQUEST TO HOLD INFORMATION
3572: * ABOUT A FILE.
3573: *
3574: * TRTYP IS SET TO TRTFC
3575: * TRNEXT POINTS TO NEXT TRBLK OR TRVAL IS VARIABLE VAL
3576: * TRFNM IS 0
3577: * TRFPT IS THE FCBLK POINTER.
3578: *
3579: * NOTE THAT WHEN MULTIPLE TRAPS ARE SET ON A VARIABLE
3580: * THE ORDER IS IN ASCENDING VALUE OF TRTYP FIELD.
3581: *
3582: * INPUT ASSOCIATION (IF PRESENT)
3583: * ACCESS TRACE (IF PRESENT)
3584: * VALUE TRACE (IF PRESENT)
3585: * OUTPUT ASSOCIATION (IF PRESENT)
3586: *
3587: * THE ACTUAL VALUE OF THE VARIABLE IS STORED IN THE TRVAL
3588: * FIELD OF THE LAST TRBLK ON THE CHAIN.
3589: *
3590: * THIS IMPLEMENTATION DOES NOT PERMIT TRACE OR I/O
3591: * ASSOCIATIONS TO ANY OF THE PSEUDO-VARIABLES.
3592: EJC
3593: *
3594: * VECTOR BLOCK (VCBLK)
3595: *
3596: * A VCBLK IS USED TO REPRESENT AN ARRAY VALUE WHICH HAS
3597: * ONE DIMENSION WHOSE LOWER BOUND IS ONE. ALL OTHER ARRAYS
3598: * ARE REPRESENTED BY ARBLKS. A VCBLK IS CREATED BY THE
3599: * SYSTEM FUNCTION ARRAY (S$ARR) WHEN PASSED AN INTEGER ARG.
3600: *
3601: * +------------------------------------+
3602: * I VCTYP I
3603: * +------------------------------------+
3604: * I IDVAL I
3605: * +------------------------------------+
3606: * I VCLEN I
3607: * +------------------------------------+
3608: * I VCVLS I
3609: * +------------------------------------+
3610: *
3611: VCTYP EQU 0 POINTER TO DUMMY ROUTINE B$VCT
3612: VCLEN EQU OFFS2 LENGTH OF VCBLK IN BYTES
3613: VCVLS EQU OFFS3 START OF VECTOR VALUES
3614: VCSI$ EQU VCVLS SIZE OF STANDARD FIELDS IN VCBLK
3615: VCVLB EQU VCVLS-1 OFFSET ONE WORD BEHIND VCVLS
3616: VCTBD EQU TBSI$-VCSI$ DIFFERENCE IN SIZES - SEE PRTVL
3617: *
3618: * VCVLS ARE EITHER DATA POINTERS OR TRBLK POINTERS
3619: *
3620: * THE DIMENSION CAN BE DEDUCED FROM VCLEN.
3621: EJC
3622: *
3623: * VARIABLE BLOCK (VRBLK)
3624: *
3625: * A VARIABLE BLOCK IS BUILT IN THE STATIC MEMORY AREA
3626: * FOR EVERY VARIABLE REFERENCED OR CREATED BY A PROGRAM.
3627: *
3628: * NOTE THAT SINCE THESE BLOCKS ONLY OCCUR IN THE STATIC
3629: * REGION, IT IS PERMISSIBLE TO POINT TO ANY WORD IN
3630: * THE BLOCK AND THIS IS USED TO PROVIDE THREE DISTINCT
3631: * ACCESS POINTS FROM THE GENERATED CODE AS FOLLOWS.
3632: *
3633: * 1) POINT TO VRGET (FIRST WORD OF VRBLK) TO LOAD THE
3634: * VALUE OF THE VARIABLE ONTO THE MAIN STACK.
3635: *
3636: * 2) POINT TO VRSTO (SECOND WORD OF VRBLK) TO STORE THE
3637: * TOP STACK ELEMENT AS THE VALUE OF THE VARIABLE.
3638: *
3639: * 3) POINT TO VRTRA (FOURTH WORD OF VRBLK) TO JUMP TO
3640: * THE LABEL ASSOCIATED WITH THE VARIABLE NAME.
3641: *
3642: * +------------------------------------+
3643: * I VRGET I
3644: * +------------------------------------+
3645: * I VRSTO I
3646: * +------------------------------------+
3647: * I VRVAL I
3648: * +------------------------------------+
3649: * I VRTRA I
3650: * +------------------------------------+
3651: * I VRLBL I
3652: * +------------------------------------+
3653: * I VRFNC I
3654: * +------------------------------------+
3655: * I VRNXT I
3656: * +------------------------------------+
3657: * I VRLEN I
3658: * +------------------------------------+
3659: * / /
3660: * / VRCHS = VRSVP /
3661: * / /
3662: * +------------------------------------+
3663: EJC
3664: *
3665: * VARIABLE BLOCK (CONTINUED)
3666: *
3667: VRGET EQU 0 POINTER TO ROUTINE TO LOAD VALUE
3668: VRSTO EQU VRGET+1 POINTER TO ROUTINE TO STORE VALUE
3669: VRVAL EQU VRSTO+1 VARIABLE VALUE
3670: VRVLO EQU VRVAL-VRSTO OFFSET TO VALUE FROM STORE FIELD
3671: VRTRA EQU VRVAL+1 POINTER TO ROUTINE TO JUMP TO LABEL
3672: VRLBL EQU VRTRA+1 POINTER TO CODE FOR LABEL
3673: VRLBO EQU VRLBL-VRTRA OFFSET TO LABEL FROM TRANSFER FIELD
3674: VRFNC EQU VRLBL+1 POINTER TO FUNCTION BLOCK
3675: VRNXT EQU VRFNC+1 POINTER TO NEXT VRBLK ON HASH CHAIN
3676: VRLEN EQU VRNXT+1 LENGTH OF NAME (OR ZERO)
3677: VRCHS EQU VRLEN+1 CHARACTERS OF NAME (VRLEN GT 0)
3678: VRSVP EQU VRLEN+1 PTR TO SVBLK (VRLEN EQ 0)
3679: VRSI$ EQU VRCHS+1 NUMBER OF STANDARD FIELDS IN VRBLK
3680: VRSOF EQU VRLEN-SCLEN OFFSET TO DUMMY SCBLK FOR NAME
3681: VRSVO EQU VRSVP-VRSOF PSEUDO-OFFSET TO VRSVP FIELD
3682: *
3683: * VRGET = B$VRL IF NOT INPUT ASSOCIATED OR ACCESS TRACED
3684: * VRGET = B$VRA IF INPUT ASSOCIATED OR ACCESS TRACED
3685: *
3686: * VRSTO = B$VRS IF NOT OUTPUT ASSOCIATED OR VALUE TRACED
3687: * VRSTO = B$VRV IF OUTPUT ASSOCIATED OR VALUE TRACED
3688: * VRSTO = B$VRE IF VALUE IS PROTECTED PATTERN VALUE
3689: *
3690: * VRVAL POINTS TO THE APPROPRIATE VALUE UNLESS THE
3691: * VARIABLE IS I/O/TRACE ASSOCIATED IN WHICH CASE, VRVAL
3692: * POINTS TO AN APPROPRIATE TRBLK (TRAP BLOCK) CHAIN.
3693: *
3694: * VRTRA = B$VRG IF THE LABEL IS NOT TRACED
3695: * VRTRA = B$VRT IF THE LABEL IS TRACED
3696: *
3697: * VRLBL POINTS TO A CDBLK IF THERE IS A LABEL
3698: * VRLBL POINTS TO THE SVBLK SVLBL FIELD FOR A SYSTEM LABEL
3699: * VRLBL POINTS TO STNDL FOR AN UNDEFINED LABEL
3700: * VRLBL POINTS TO A TRBLK IF THE LABEL IS TRACED
3701: *
3702: * VRFNC POINTS TO A FFBLK FOR A FIELD FUNCTION
3703: * VRFNC POINTS TO A DFBLK FOR A DATATYPE FUNCTION
3704: * VRFNC POINTS TO A PFBLK FOR A PROGRAM DEFINED FUNCTION
3705: * VRFNC POINTS TO A EFBLK FOR AN EXTERNAL LOADED FUNCTION
3706: * VRFNC POINTS TO SVFNC (SVBLK) FOR A SYSTEM FUNCTION
3707: * VRFNC POINTS TO STNDF IF THE FUNCTION IS UNDEFINED
3708: *
3709: * VRNXT POINTS TO THE NEXT VRBLK ON THIS CHAIN UNLESS
3710: * THIS IS THE END OF THE CHAIN IN WHICH CASE IT IS ZERO.
3711: *
3712: * VRLEN IS THE NAME LENGTH FOR A NON-SYSTEM VARIABLE.
3713: * VRLEN IS ZERO FOR A SYSTEM VARIABLE.
3714: *
3715: * VRCHS IS THE NAME (LJRZ) IF VRLEN IS NON-ZERO.
3716: * VRSVP IS A PTR TO THE SVBLK IF VRLEN IS ZERO.
3717: EJC
3718: *
3719: * FORMAT OF A NON-RELOCATABLE EXTERNAL BLOCK (XNBLK)
3720: *
3721: * AN XNBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL)
3722: * DATA VALUE. THE BLOCK CONTAINS NO POINTERS TO OTHER
3723: * RELOCATABLE BLOCKS. AN XNBLK IS USED BY EXTERNAL FUNCTION
3724: * PROCESSING OR POSSIBLY FOR SYSTEM I/O ROUTINES ETC.
3725: * THE MACRO-SYSTEM ITSELF DOES NOT USE XNBLKS.
3726: * THIS TYPE OF BLOCK MAY BE USED AS A FILE CONTROL BLOCK.
3727: * SEE SYSFC,SYSIN,SYSOU,S$INP,S$OUP FOR DETAILS.
3728: *
3729: * +------------------------------------+
3730: * I XNTYP I
3731: * +------------------------------------+
3732: * I XNLEN I
3733: * +------------------------------------+
3734: * / /
3735: * / XNDTA /
3736: * / /
3737: * +------------------------------------+
3738: *
3739: XNTYP EQU 0 POINTER TO DUMMY ROUTINE B$XNT
3740: XNLEN EQU XNTYP+1 LENGTH OF XNBLK IN BYTES
3741: XNDTA EQU XNLEN+1 DATA WORDS
3742: XNSI$ EQU XNDTA SIZE OF STANDARD FIELDS IN XNBLK
3743: *
3744: * NOTE THAT THE TERM NON-RELOCATABLE REFERS TO THE CONTENTS
3745: * AND NOT THE BLOCK ITSELF. AN XNBLK CAN BE MOVED AROUND IF
3746: * IT IS BUILT IN THE DYNAMIC MEMORY AREA.
3747: EJC
3748: *
3749: * RELOCATABLE EXTERNAL BLOCK (XRBLK)
3750: *
3751: * AN XRBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL)
3752: * DATA VALUE. THE DATA AREA IN THIS BLOCK CONSISTS ONLY
3753: * OF ADDRESS VALUES AND ANY ADDRESSES POINTING INTO THE
3754: * DYNAMIC MEMORY AREA MUST POINT TO THE START OF OTHER
3755: * DATA BLOCKS. SEE ALSO DESCRIPTION OF XNBLK.
3756: * THIS TYPE OF BLOCK MAY BE USED AS A FILE CONTROL BLOCK.
3757: * SEE SYSFC,SYSIN,SYSOU,S$INP,S$OUP FOR DETAILS.
3758: *
3759: * +------------------------------------+
3760: * I XRTYP I
3761: * +------------------------------------+
3762: * I XRLEN I
3763: * +------------------------------------+
3764: * / /
3765: * / XRPTR /
3766: * / /
3767: * +------------------------------------+
3768: *
3769: XRTYP EQU 0 POINTER TO DUMMY ROUTINE B$XRT
3770: XRLEN EQU XRTYP+1 LENGTH OF XRBLK IN BYTES
3771: XRPTR EQU XRLEN+1 START OF ADDRESS POINTERS
3772: XRSI$ EQU XRPTR SIZE OF STANDARD FIELDS IN XRBLK
3773: EJC
3774: *
3775: * S$CNV (CONVERT) FUNCTION SWITCH CONSTANTS. THE VALUES
3776: * ARE TIED TO THE ORDER OF THE ENTRIES IN THE SVCTB TABLE
3777: * AND HENCE TO THE BRANCH TABLE IN S$CNV.
3778: *
3779: CNVST EQU 8 MAX STANDARD TYPE CODE FOR CONVERT
3780: CNVRT EQU CNVST+1 CONVERT CODE FOR REALS
3781: CNVBT EQU CNVRT+1 CONVERT CODE FOR BUFFER
3782: CNVTT EQU CNVBT+1 BSW CODE FOR CONVERT
3783: *
3784: * INPUT IMAGE LENGTH
3785: *
3786: INILN EQU 132 DEFAULT IMAGE LENGTH FOR COMPILER
3787: INILS EQU 80 IMAGE LENGTH IF -SEQU IN EFFECT
3788: *
3789: IONMB EQU 2 NAME BASE USED FOR IOCHN IN SYSIO
3790: IONMO EQU 4 NAME OFFSET USED FOR IOCHN IN SYSIO
3791: *
3792: * IN GENERAL, MEANINGFUL MNEMONICS SHOULD BE USED FOR
3793: * OFFSETS. HOWEVER FOR SMALL INTEGERS USED OFTEN IN
3794: * LITERALS THE FOLLOWING GENERAL DEFINITIONS ARE PROVIDED.
3795: *
3796: NUM01 EQU 1
3797: NUM02 EQU 2
3798: NUM03 EQU 3
3799: NUM04 EQU 4
3800: NUM05 EQU 5
3801: NUM06 EQU 6
3802: NUM07 EQU 7
3803: NUM08 EQU 8
3804: NUM09 EQU 9
3805: NUM10 EQU 10
3806: NINI8 EQU 998
3807: NINI9 EQU 999
3808: THSND EQU 1000
3809: EJC
3810: *
3811: * NUMBERS OF UNDEFINED SPITBOL OPERATORS
3812: *
3813: OPBUN EQU 5 NO. OF BINARY UNDEFINED OPS
3814: OPUUN EQU 6 NO OF UNARY UNDEFINED OPS
3815: *
3816: * OFFSETS USED IN PRTSN, PRTMI AND ACESS
3817: *
3818: PRSNF EQU 13 OFFSET USED IN PRTSN
3819: PRTMF EQU 15 OFFSET TO COL 15 (PRTMI)
3820: RILEN EQU 120 BUFFER LENGTH FOR SYSRI
3821: *
3822: * CODES FOR STAGES OF PROCESSING
3823: *
3824: STGIC EQU 0 INITIAL COMPILE
3825: STGXC EQU STGIC+1 EXECUTION COMPILE (CODE)
3826: STGEV EQU STGXC+1 EXPRESSION EVAL DURING EXECUTION
3827: STGXT EQU STGEV+1 EXECUTION TIME
3828: STGCE EQU STGXT+1 INITIAL COMPILE AFTER END LINE
3829: STGXE EQU STGCE+1 EXEC. COMPILE AFTER END LINE
3830: STGND EQU STGCE-STGIC DIFFERENCE IN STAGE AFTER END
3831: STGEE EQU STGXE+1 EVAL EVALUATING EXPRESSION
3832: STGNO EQU STGEE+1 NUMBER OF CODES
3833: EJC
3834: *
3835: *
3836: * STATEMENT NUMBER PAD COUNT FOR LISTR
3837: *
3838: STNPD EQU 8 STATEMENT NO. PAD COUNT
3839: *
3840: * SYNTAX TYPE CODES
3841: *
3842: * THESE CODES ARE RETURNED FROM THE SCANE PROCEDURE.
3843: *
3844: * THEY ARE SPACED 3 APART FOR THE BENEFIT OF EXPAN.
3845: *
3846: T$UOP EQU 0 UNARY OPERATOR
3847: T$LPR EQU T$UOP+3 LEFT PAREN
3848: T$LBR EQU T$LPR+3 LEFT BRACKET
3849: T$CMA EQU T$LBR+3 COMMA
3850: T$FNC EQU T$CMA+3 FUNCTION CALL
3851: T$VAR EQU T$FNC+3 VARIABLE
3852: T$CON EQU T$VAR+3 CONSTANT
3853: T$BOP EQU T$CON+3 BINARY OPERATOR
3854: T$RPR EQU T$BOP+3 RIGHT PAREN
3855: T$RBR EQU T$RPR+3 RIGHT BRACKET
3856: T$COL EQU T$RBR+3 COLON
3857: T$SMC EQU T$COL+3 SEMI-COLON
3858: *
3859: * THE FOLLOWING DEFINITIONS ARE USED ONLY IN THE GOTO FIELD
3860: *
3861: T$FGO EQU T$SMC+1 FAILURE GOTO
3862: T$SGO EQU T$FGO+1 SUCCESS GOTO
3863: *
3864: * THE ABOVE CODES ARE GROUPED SO THAT CODES FOR ELEMENTS
3865: * WHICH CAN LEGITIMATELY IMMEDIATELY PRECEDE A UNARY
3866: * OPERATOR COME FIRST TO FACILITATE OPERATOR SYNTAX CHECK.
3867: *
3868: T$UOK EQU T$FNC LAST CODE OK BEFORE UNARY OPERATOR
3869: EJC
3870: *
3871: * DEFINITIONS OF VALUES FOR EXPAN JUMP TABLE
3872: *
3873: T$UO0 EQU T$UOP+0 UNARY OPERATOR, STATE ZERO
3874: T$UO1 EQU T$UOP+1 UNARY OPERATOR, STATE ONE
3875: T$UO2 EQU T$UOP+2 UNARY OPERATOR, STATE TWO
3876: T$LP0 EQU T$LPR+0 LEFT PAREN, STATE ZERO
3877: T$LP1 EQU T$LPR+1 LEFT PAREN, STATE ONE
3878: T$LP2 EQU T$LPR+2 LEFT PAREN, STATE TWO
3879: T$LB0 EQU T$LBR+0 LEFT BRACKET, STATE ZERO
3880: T$LB1 EQU T$LBR+1 LEFT BRACKET, STATE ONE
3881: T$LB2 EQU T$LBR+2 LEFT BRACKET, STATE TWO
3882: T$CM0 EQU T$CMA+0 COMMA, STATE ZERO
3883: T$CM1 EQU T$CMA+1 COMMA, STATE ONE
3884: T$CM2 EQU T$CMA+2 COMMA, STATE TWO
3885: T$FN0 EQU T$FNC+0 FUNCTION CALL, STATE ZERO
3886: T$FN1 EQU T$FNC+1 FUNCTION CALL, STATE ONE
3887: T$FN2 EQU T$FNC+2 FUNCTION CALL, STATE TWO
3888: T$VA0 EQU T$VAR+0 VARIABLE, STATE ZERO
3889: T$VA1 EQU T$VAR+1 VARIABLE, STATE ONE
3890: T$VA2 EQU T$VAR+2 VARIABLE, STATE TWO
3891: T$CO0 EQU T$CON+0 CONSTANT, STATE ZERO
3892: T$CO1 EQU T$CON+1 CONSTANT, STATE ONE
3893: T$CO2 EQU T$CON+2 CONSTANT, STATE TWO
3894: T$BO0 EQU T$BOP+0 BINARY OPERATOR, STATE ZERO
3895: T$BO1 EQU T$BOP+1 BINARY OPERATOR, STATE ONE
3896: T$BO2 EQU T$BOP+2 BINARY OPERATOR, STATE TWO
3897: T$RP0 EQU T$RPR+0 RIGHT PAREN, STATE ZERO
3898: T$RP1 EQU T$RPR+1 RIGHT PAREN, STATE ONE
3899: T$RP2 EQU T$RPR+2 RIGHT PAREN, STATE TWO
3900: T$RB0 EQU T$RBR+0 RIGHT BRACKET, STATE ZERO
3901: T$RB1 EQU T$RBR+1 RIGHT BRACKET, STATE ONE
3902: T$RB2 EQU T$RBR+2 RIGHT BRACKET, STATE TWO
3903: T$CL0 EQU T$COL+0 COLON, STATE ZERO
3904: T$CL1 EQU T$COL+1 COLON, STATE ONE
3905: T$CL2 EQU T$COL+2 COLON, STATE TWO
3906: T$SM0 EQU T$SMC+0 SEMICOLON, STATE ZERO
3907: T$SM1 EQU T$SMC+1 SEMICOLON, STATE ONE
3908: T$SM2 EQU T$SMC+2 SEMICOLON, STATE TWO
3909: *
3910: T$NES EQU T$SM2+1 NUMBER OF ENTRIES IN BRANCH TABLE
3911: EJC
3912: *
3913: * DEFINITION OF OFFSETS USED IN CONTROL CARD PROCESSING
3914: *
3915: CC$CA EQU 0 -CASE
3916: CC$DO EQU CC$CA+1 -DOUBLE
3917: CC$DU EQU CC$DO+1 -DUMP
3918: CC$EJ EQU CC$DU+1 -EJECT
3919: CC$ER EQU CC$EJ+1 -ERRORS
3920: CC$EX EQU CC$ER+1 -EXECUTE
3921: CC$FA EQU CC$EX+1 -FAIL
3922: CC$LI EQU CC$FA+1 -LIST
3923: CC$NR EQU CC$LI+1 -NOERRORS
3924: CC$NX EQU CC$NR+1 -NOEXECUTE
3925: CC$NF EQU CC$NX+1 -NOFAIL
3926: CC$NL EQU CC$NF+1 -NOLIST
3927: CC$NO EQU CC$NL+1 -NOOPT
3928: CC$NP EQU CC$NO+1 -NOPRINT
3929: CC$OP EQU CC$NP+1 -OPTIMISE
3930: CC$PR EQU CC$OP+1 -PRINT
3931: CC$SI EQU CC$PR+1 -SINGLE
3932: CC$SP EQU CC$SI+1 -SPACE
3933: CC$ST EQU CC$SP+1 -STITL
3934: CC$TI EQU CC$ST+1 -TITLE
3935: CC$TR EQU CC$TI+1 -TRACE
3936: CC$NC EQU CC$TR+1 NUMBER OF CONTROL CARDS
3937: CCNOC EQU 4 NO. OF CHARS INCLUDED IN MATCH
3938: CCOFS EQU 7 OFFSET TO START OF TITLE/SUBTITLE
3939: EJC
3940: *
3941: * DEFINITIONS OF STACK OFFSETS USED IN CMPIL PROCEDURE
3942: *
3943: * SEE DESCRIPTION AT START OF CMPIL PROCEDURE FOR DETAILS
3944: * OF USE OF THESE LOCATIONS ON THE STACK.
3945: *
3946: CMSTM EQU 0 TREE FOR STATEMENT BODY
3947: CMSGO EQU CMSTM+1 TREE FOR SUCCESS GOTO
3948: CMFGO EQU CMSGO+1 TREE FOR FAIL GOTO
3949: CMCGO EQU CMFGO+1 CONDITIONAL GOTO FLAG
3950: CMPCD EQU CMCGO+1 PREVIOUS CDBLK POINTER
3951: CMFFP EQU CMPCD+1 FAILURE FILL IN FLAG FOR PREVIOUS
3952: CMFFC EQU CMFFP+1 FAILURE FILL IN FLAG FOR CURRENT
3953: CMSOP EQU CMFFC+1 SUCCESS FILL IN OFFSET FOR PREVIOUS
3954: CMSOC EQU CMSOP+1 SUCCESS FILL IN OFFSET FOR CURRENT
3955: CMLBL EQU CMSOC+1 PTR TO VRBLK FOR CURRENT LABEL
3956: CMTRA EQU CMLBL+1 PTR TO ENTRY CDBLK
3957: *
3958: CMNEN EQU CMTRA+1 COUNT OF STACK ENTRIES FOR CMPIL
3959: *
3960: * A FEW CONSTANTS USED BY THE PROFILER
3961: PFPD1 EQU 8 PAD POSITIONS ...
3962: PFPD2 EQU 20 ... FOR PROFILE ...
3963: PFPD3 EQU 32 ... PRINTOUT
3964: PF$I2 EQU CFP$I+CFP$I SIZE OF TABLE ENTRY (2 INTS)
3965: *
3966: TTL S P I T B O L -- CONSTANT SECTION
3967: *
3968: * THIS SECTION CONSISTS ENTIRELY OF ASSEMBLED CONSTANTS.
3969: *
3970: * ALL LABEL NAMES ARE FIVE LETTERS. THE ORDER IS
3971: * APPROXIMATELY ALPHABETICAL, BUT IN SOME CASES (ALWAYS
3972: * DOCUMENTED), CONSTANTS MUST BE PLACED IN SOME SPECIAL
3973: * ORDER WHICH MUST NOT BE DISTURBED.
3974: *
3975: * IT MUST ALSO BE REMEMBERED THAT THERE IS A REQUIREMENT
3976: * FOR NO FORWARD REFERENCES WHICH ALSO DISTURBS THE
3977: * ALPHABETICAL ORDER IN SOME CASES.
3978: *
3979: SEC START OF CONSTANT SECTION
3980: *
3981: * FREE STORE PERCENTAGE (USED BY ALLOC)
3982: *
3983: ALFSP DAC E$FSP FREE STORE PERCENTAGE
3984: *
3985: * BIT CONSTANTS FOR GENERAL USE
3986: *
3987: BITS0 DBC 0 ALL ZERO BITS
3988: BITS1 DBC 1 ONE BIT IN LOW ORDER POSITION
3989: BITS2 DBC 2 BIT IN POSITION 2
3990: BITS3 DBC 4 BIT IN POSITION 3
3991: BITS4 DBC 8 BIT IN POSITION 4
3992: BITS5 DBC 16 BIT IN POSITION 5
3993: BITS6 DBC 32 BIT IN POSITION 6
3994: BITS7 DBC 64 BIT IN POSITION 7
3995: BITS8 DBC 128 BIT IN POSITION 8
3996: BITS9 DBC 256 BIT IN POSITION 9
3997: BIT10 DBC 512 BIT IN POSITION 10
3998: BITSM DBC CFP$M MASK FOR MAX INTEGER
3999: *
4000: * BIT CONSTANTS FOR SVBLK (SVBIT FIELD) TESTS
4001: *
4002: BTFNC DBC SVFNC BIT TO TEST FOR FUNCTION
4003: BTKNM DBC SVKNM BIT TO TEST FOR KEYWORD NUMBER
4004: BTLBL DBC SVLBL BIT TO TEST FOR LABEL
4005: BTFFC DBC SVFFC BIT TO TEST FOR FAST CALL
4006: BTCKW DBC SVCKW BIT TO TEST FOR CONSTANT KEYWORD
4007: BTPRD DBC SVPRD BIT TO TEST FOR PREDICATE FUNCTION
4008: BTPRE DBC SVPRE BIT TO TEST FOR PREEVALUATION
4009: BTVAL DBC SVVAL BIT TO TEST FOR VALUE
4010: EJC
4011: *
4012: * LIST OF NAMES USED FOR CONTROL CARD PROCESSING
4013: *
4014: CCNMS DTC /CASE/
4015: DTC /DOUB/
4016: DTC /DUMP/
4017: DTC /EJEC/
4018: DTC /ERRO/
4019: DTC /EXEC/
4020: DTC /FAIL/
4021: DTC /LIST/
4022: DTC /NOER/
4023: DTC /NOEX/
4024: DTC /NOFA/
4025: DTC /NOLI/
4026: DTC /NOOP/
4027: DTC /NOPR/
4028: DTC /OPTI/
4029: DTC /PRIN/
4030: DTC /SING/
4031: DTC /SPAC/
4032: DTC /STIT/
4033: DTC /TITL/
4034: DTC /TRAC/
4035: *
4036: * HEADER MESSAGES FOR DUMPR PROCEDURE (SCBLK FORMAT)
4037: *
4038: DMHDK DAC B$SCL DUMP OF KEYWORD VALUES
4039: DAC 22
4040: DTC /DUMP OF KEYWORD VALUES/
4041: *
4042: DMHDV DAC B$SCL DUMP OF NATURAL VARIABLES
4043: DAC 25
4044: DTC /DUMP OF NATURAL VARIABLES/
4045: EJC
4046: *
4047: * MESSAGE TEXT FOR COMPILATION STATISTICS
4048: *
4049: ENCM1 DAC B$SCL
4050: DAC 10
4051: DTC /STORE USED/
4052: *
4053: ENCM2 DAC B$SCL
4054: DAC 10
4055: DTC /STORE LEFT/
4056: *
4057: ENCM3 DAC B$SCL
4058: DAC 11
4059: DTC /COMP ERRORS/
4060: *
4061: ENCM4 DAC B$SCL
4062: DAC 14
4063: DTC /COMP TIME-MSEC/
4064: *
4065: ENCM5 DAC B$SCL EXECUTION SUPPRESSED
4066: DAC 20
4067: DTC /EXECUTION SUPPRESSED/
4068: *
4069: * STRING CONSTANT FOR ABNORMAL END
4070: *
4071: ENDAB DAC B$SCL
4072: DAC 12
4073: DTC /ABNORMAL END/
4074: EJC
4075: *
4076: * MEMORY OVERFLOW DURING INITIALISATION
4077: *
4078: ENDMO DAC B$SCL
4079: ENDML DAC 15
4080: DTC /MEMORY OVERFLOW/
4081: *
4082: * STRING CONSTANT FOR MESSAGE ISSUED BY L$END
4083: *
4084: ENDMS DAC B$SCL
4085: DAC 10
4086: DTC /NORMAL END/
4087: *
4088: * FAIL MESSAGE FOR STACK FAIL SECTION
4089: *
4090: ENDSO DAC B$SCL STACK OVERFLOW IN GARBAGE COLLECTOR
4091: DAC 36
4092: DTC /STACK OVERFLOW IN GARBAGE COLLECTION/
4093: *
4094: * STRING CONSTANT FOR TIME UP
4095: *
4096: ENDTU DAC B$SCL
4097: DAC 15
4098: DTC /ERROR - TIME UP/
4099: EJC
4100: *
4101: * STRING CONSTANT FOR ERROR MESSAGE (ERROR SECTION)
4102: *
4103: ERMMS DAC B$SCL ERROR
4104: DAC 5
4105: DTC /ERROR/
4106: *
4107: ERMNS DAC B$SCL STRING / -- /
4108: DAC 4
4109: DTC / -- /
4110: *
4111: * STRING CONSTANT FOR PAGE NUMBERING
4112: *
4113: LSTMS DAC B$SCL PAGE
4114: DAC 5
4115: DTC /PAGE /
4116: *
4117: * LISTING HEADER MESSAGE
4118: *
4119: HEADR DAC B$SCL
4120: DAC 25
4121: DTC /MACRO SPITBOL VERSION 3.5/
4122: *
4123: HEADV DAC B$SCL FOR EXIT() VERSION NO. CHECK
4124: DAC 3
4125: DTC /3.5/
4126: *
4127: * INTEGER CONSTANTS FOR GENERAL USE
4128: * ICBLD OPTIMISATION USES THE FIRST THREE.
4129: *
4130: INT$R DAC B$ICL
4131: INTV0 DIC +0 0
4132: INTON DAC B$ICL
4133: INTV1 DIC +1 1
4134: INTTW DAC B$ICL
4135: INTV2 DIC +2 2
4136: INTVT DIC +10 10
4137: INTVH DIC +100 100
4138: INTTH DIC +1000 1000
4139: *
4140: * TABLE USED IN ICBLD OPTIMISATION
4141: *
4142: INTAB DAC INT$R POINTER TO 0
4143: DAC INTON POINTER TO 1
4144: DAC INTTW POINTER TO 2
4145: EJC
4146: *
4147: * SPECIAL PATTERN NODES. THE FOLLOWING PATTERN NODES
4148: * CONSIST SIMPLY OF A PCODE POINTER, SEE MATCH ROUTINES
4149: * (P$XXX) FOR FULL DETAILS OF THEIR USE AND FORMAT).
4150: *
4151: NDABB DAC P$ABB ARBNO
4152: NDABD DAC P$ABD ARBNO
4153: NDARC DAC P$ARC ARB
4154: NDEXB DAC P$EXB EXPRESSION
4155: NDFNB DAC P$FNB FENCE()
4156: NDFND DAC P$FND FENCE()
4157: NDEXC DAC P$EXC EXPRESSION
4158: NDIMB DAC P$IMB IMMEDIATE ASSIGNMENT
4159: NDIMD DAC P$IMD IMMEDIATE ASSIGNMENT
4160: NDNTH DAC P$NTH PATTERN END (NULL PATTERN)
4161: NDPAB DAC P$PAB PATTERN ASSIGNMENT
4162: NDPAD DAC P$PAD PATTERN ASSIGNMENT
4163: NDUNA DAC P$UNA ANCHOR POINT MOVEMENT
4164: *
4165: * KEYWORD CONSTANT PATTERN NODES. THE FOLLOWING NODES ARE
4166: * USED AS THE VALUES OF PATTERN KEYWORDS AND THE INITIAL
4167: * VALUES OF THE CORRESPONDING NATURAL VARIABLES. ALL
4168: * NODES ARE IN P0BLK FORMAT AND THE ORDER IS TIED TO THE
4169: * DEFINITIONS OF CORRESPONDING K$XXX SYMBOLS.
4170: *
4171: NDABO DAC P$ABO ABORT
4172: DAC NDNTH
4173: NDARB DAC P$ARB ARB
4174: DAC NDNTH
4175: NDBAL DAC P$BAL BAL
4176: DAC NDNTH
4177: NDFAL DAC P$FAL FAIL
4178: DAC NDNTH
4179: NDFEN DAC P$FEN FENCE
4180: DAC NDNTH
4181: NDREM DAC P$REM REM
4182: DAC NDNTH
4183: NDSUC DAC P$SUC SUCCEED
4184: DAC NDNTH
4185: *
4186: * NULL STRING. ALL NULL VALUES POINT TO THIS STRING. THE
4187: * SVCHS FIELD CONTAINS A BLANK TO PROVIDE FOR EASY DEFAULT
4188: * PROCESSING IN TRACE, STOPTR, LPAD AND RPAD.
4189: * NULLW CONTAINS 10 BLANKS WHICH ENSURES AN ALL BLANK WORD
4190: * BUT FOR VERY EXCEPTIONAL MACHINES.
4191: *
4192: NULLS DAC B$SCL NULL STRING VALUE
4193: DAC 0 SCLEN = 0
4194: NULLW DTC / /
4195: EJC
4196: *
4197: * OPERATOR DOPE VECTORS (SEE DVBLK FORMAT)
4198: *
4199: OPDVC DAC O$CNC CONCATENATION
4200: DAC C$CNC
4201: DAC LLCNC
4202: DAC RRCNC
4203: *
4204: * OPDVS IS USED WHEN SCANNING BELOW THE TOP LEVEL TO
4205: * INSURE THAT THE CONCATENATION WILL NOT BE LATER
4206: * MISTAKEN FOR PATTERN MATCHING
4207: *
4208: OPDVP DAC O$CNC CONCATENATION - NOT PATTERN MATCH
4209: DAC C$CNP
4210: DAC LLCNC
4211: DAC RRCNC
4212: *
4213: * NOTE THAT THE ORDER OF THE REMAINING ENTRIES IS TIED TO
4214: * THE ORDER OF THE CODING IN THE SCANE PROCEDURE.
4215: *
4216: OPDVS DAC O$ASS ASSIGNMENT
4217: DAC C$ASS
4218: DAC LLASS
4219: DAC RRASS
4220: *
4221: DAC 6 UNARY EQUAL
4222: DAC C$UUO
4223: DAC LLUNO
4224: *
4225: DAC O$PMV PATTERN MATCH
4226: DAC C$PMT
4227: DAC LLPMT
4228: DAC RRPMT
4229: *
4230: DAC O$INT INTERROGATION
4231: DAC C$UVL
4232: DAC LLUNO
4233: *
4234: DAC 1 BINARY AMPERSAND
4235: DAC C$UBO
4236: DAC LLAMP
4237: DAC RRAMP
4238: *
4239: DAC O$KWV KEYWORD REFERENCE
4240: DAC C$KEY
4241: DAC LLUNO
4242: *
4243: DAC O$ALT ALTERNATION
4244: DAC C$ALT
4245: DAC LLALT
4246: DAC RRALT
4247: EJC
4248: *
4249: * OPERATOR DOPE VECTORS (CONTINUED)
4250: *
4251: DAC 5 UNARY VERTICAL BAR
4252: DAC C$UUO
4253: DAC LLUNO
4254: *
4255: DAC 0 BINARY AT
4256: DAC C$UBO
4257: DAC LLATS
4258: DAC RRATS
4259: *
4260: DAC O$CAS CURSOR ASSIGNMENT
4261: DAC C$UNM
4262: DAC LLUNO
4263: *
4264: DAC 2 BINARY NUMBER SIGN
4265: DAC C$UBO
4266: DAC LLNUM
4267: DAC RRNUM
4268: *
4269: DAC 7 UNARY NUMBER SIGN
4270: DAC C$UUO
4271: DAC LLUNO
4272: *
4273: DAC O$DVD DIVISION
4274: DAC C$BVL
4275: DAC LLDVD
4276: DAC RRDVD
4277: *
4278: DAC 9 UNARY SLASH
4279: DAC C$UUO
4280: DAC LLUNO
4281: *
4282: DAC O$MLT MULTIPLICATION
4283: DAC C$BVL
4284: DAC LLMLT
4285: DAC RRMLT
4286: EJC
4287: *
4288: * OPERATOR DOPE VECTORS (CONTINUED)
4289: *
4290: DAC 0 DEFERRED EXPRESSION
4291: DAC C$DEF
4292: DAC LLUNO
4293: *
4294: DAC 3 BINARY PERCENT
4295: DAC C$UBO
4296: DAC LLPCT
4297: DAC RRPCT
4298: *
4299: DAC 8 UNARY PERCENT
4300: DAC C$UUO
4301: DAC LLUNO
4302: *
4303: DAC O$EXP EXPONENTIATION
4304: DAC C$BVL
4305: DAC LLEXP
4306: DAC RREXP
4307: *
4308: DAC 10 UNARY EXCLAMATION
4309: DAC C$UUO
4310: DAC LLUNO
4311: *
4312: DAC O$IMA IMMEDIATE ASSIGNMENT
4313: DAC C$BVN
4314: DAC LLDLD
4315: DAC RRDLD
4316: *
4317: DAC O$INV INDIRECTION
4318: DAC C$IND
4319: DAC LLUNO
4320: *
4321: DAC 4 BINARY NOT
4322: DAC C$UBO
4323: DAC LLNOT
4324: DAC RRNOT
4325: *
4326: DAC 0 NEGATION
4327: DAC C$NEG
4328: DAC LLUNO
4329: EJC
4330: *
4331: * OPERATOR DOPE VECTORS (CONTINUED)
4332: *
4333: DAC O$SUB SUBTRACTION
4334: DAC C$BVL
4335: DAC LLPLM
4336: DAC RRPLM
4337: *
4338: DAC O$COM COMPLEMENTATION
4339: DAC C$UVL
4340: DAC LLUNO
4341: *
4342: DAC O$ADD ADDITION
4343: DAC C$BVL
4344: DAC LLPLM
4345: DAC RRPLM
4346: *
4347: DAC O$AFF AFFIRMATION
4348: DAC C$UVL
4349: DAC LLUNO
4350: *
4351: DAC O$PAS PATTERN ASSIGNMENT
4352: DAC C$BVN
4353: DAC LLDLD
4354: DAC RRDLD
4355: *
4356: DAC O$NAM NAME REFERENCE
4357: DAC C$UNM
4358: DAC LLUNO
4359: *
4360: * SPECIAL DVS FOR GOTO OPERATORS (SEE PROCEDURE SCNGF)
4361: *
4362: OPDVD DAC O$GOD DIRECT GOTO
4363: DAC C$UVL
4364: DAC LLUNO
4365: *
4366: OPDVN DAC O$GOC COMPLEX NORMAL GOTO
4367: DAC C$UNM
4368: DAC LLUNO
4369: EJC
4370: *
4371: * OPERATOR ENTRY ADDRESS POINTERS, USED IN CODE
4372: *
4373: OAMN$ DAC O$AMN ARRAY REF (MULTI-SUBS BY VALUE)
4374: OAMV$ DAC O$AMV ARRAY REF (MULTI-SUBS BY VALUE)
4375: OAON$ DAC O$AON ARRAY REF (ONE SUB BY NAME)
4376: OAOV$ DAC O$AOV ARRAY REF (ONE SUB BY VALUE)
4377: OCER$ DAC O$CER COMPILATION ERROR
4378: OFEX$ DAC O$FEX FAILURE IN EXPRESSION EVALUATION
4379: OFIF$ DAC O$FIF FAILURE DURING GOTO EVALUATION
4380: OFNC$ DAC O$FNC FUNCTION CALL (MORE THAN ONE ARG)
4381: OFNE$ DAC O$FNE FUNCTION NAME ERROR
4382: OFNS$ DAC O$FNS FUNCTION CALL (SINGLE ARGUMENT)
4383: OGOF$ DAC O$GOF SET GOTO FAILURE TRAP
4384: OINN$ DAC O$INN INDIRECTION BY NAME
4385: OKWN$ DAC O$KWN KEYWORD REFERENCE BY NAME
4386: OLEX$ DAC O$LEX LOAD EXPRESSION BY NAME
4387: OLPT$ DAC O$LPT LOAD PATTERN
4388: OLVN$ DAC O$LVN LOAD VARIABLE NAME
4389: ONTA$ DAC O$NTA NEGATION, FIRST ENTRY
4390: ONTB$ DAC O$NTB NEGATION, SECOND ENTRY
4391: ONTC$ DAC O$NTC NEGATION, THIRD ENTRY
4392: OPMN$ DAC O$PMN PATTERN MATCH BY NAME
4393: OPMS$ DAC O$PMS PATTERN MATCH (STATEMENT)
4394: OPOP$ DAC O$POP POP TOP STACK ITEM
4395: ORNM$ DAC O$RNM RETURN NAME FROM EXPRESSION
4396: ORPL$ DAC O$RPL PATTERN REPLACEMENT
4397: ORVL$ DAC O$RVL RETURN VALUE FROM EXPRESSION
4398: OSLA$ DAC O$SLA SELECTION, FIRST ENTRY
4399: OSLB$ DAC O$SLB SELECTION, SECOND ENTRY
4400: OSLC$ DAC O$SLC SELECTION, THIRD ENTRY
4401: OSLD$ DAC O$SLD SELECTION, FOURTH ENTRY
4402: OSTP$ DAC O$STP STOP EXECUTION
4403: OUNF$ DAC O$UNF UNEXPECTED FAILURE
4404: EJC
4405: *
4406: * TABLE OF NAMES OF UNDEFINED BINARY OPERATORS FOR OPSYN
4407: *
4408: OPSNB DAC CH$AT AT
4409: DAC CH$AM AMPERSAND
4410: DAC CH$NM NUMBER
4411: DAC CH$PC PERCENT
4412: DAC CH$NT NOT
4413: *
4414: * TABLE OF NAMES OF UNDEFINED UNARY OPERATORS FOR OPSYN
4415: *
4416: OPNSU DAC CH$BR VERTICAL BAR
4417: DAC CH$EQ EQUAL
4418: DAC CH$NM NUMBER
4419: DAC CH$PC PERCENT
4420: DAC CH$SL SLASH
4421: DAC CH$EX EXCLAMATION
4422: *
4423: * ADDRESS CONST CONTAINING PROFILE TABLE ENTRY SIZE
4424: *
4425: PFI2A DAC PF$I2
4426: *
4427: * PROFILER MESSAGE STRINGS
4428: *
4429: PFMS1 DAC B$SCL
4430: DAC 15
4431: DTC /PROGRAM PROFILE/
4432: PFMS2 DAC B$SCL
4433: DAC 42
4434: DTC /STMT NUMBER OF -- EXECUTION TIME --/
4435: PFMS3 DAC B$SCL
4436: DAC 47
4437: DTC /NUMBER EXECUTIONS TOTAL(MSEC) PER EXCN(MCSEC)/
4438: *
4439: *
4440: * REAL CONSTANTS FOR GENERAL USE. NOTE THAT THE CONSTANTS
4441: * STARTING AT REAV1 FORM A POWERS OF TEN TABLE (GTSTG)
4442: *
4443: REAV0 DRC +0.0 0.0
4444: REAP1 DRC +0.1 0.1
4445: REAP5 DRC +0.5 0.5
4446: REAV1 DRC +1.0 10**0
4447: REAVT DRC +1.0E+1 10**1
4448: DRC +1.0E+2 10**2
4449: DRC +1.0E+3 10**3
4450: DRC +1.0E+4 10**4
4451: DRC +1.0E+5 10**5
4452: DRC +1.0E+6 10**6
4453: DRC +1.0E+7 10**7
4454: DRC +1.0E+8 10**8
4455: DRC +1.0E+9 10**9
4456: REATT DRC +1.0E+10 10**10
4457: EJC
4458: *
4459: * STRING CONSTANTS (SCBLK FORMAT) FOR DTYPE PROCEDURE
4460: *
4461: SCARR DAC B$SCL ARRAY
4462: DAC 5
4463: DTC /ARRAY/
4464: *
4465: SCBUF DAC B$SCL BUFFER
4466: DAC 6
4467: DTC /BUFFER/
4468: *
4469: SCCOD DAC B$SCL CODE
4470: DAC 4
4471: DTC /CODE/
4472: *
4473: SCEXP DAC B$SCL EXPRESSION
4474: DAC 10
4475: DTC /EXPRESSION/
4476: *
4477: SCEXT DAC B$SCL EXTERNAL
4478: DAC 8
4479: DTC /EXTERNAL/
4480: *
4481: SCINT DAC B$SCL INTEGER
4482: DAC 7
4483: DTC /INTEGER/
4484: *
4485: SCNAM DAC B$SCL NAME
4486: DAC 4
4487: DTC /NAME/
4488: *
4489: SCNUM DAC B$SCL NUMERIC
4490: DAC 7
4491: DTC /NUMERIC/
4492: *
4493: SCPAT DAC B$SCL PATTERN
4494: DAC 7
4495: DTC /PATTERN/
4496: *
4497: SCREA DAC B$SCL REAL
4498: DAC 4
4499: DTC /REAL/
4500: *
4501: SCSTR DAC B$SCL STRING
4502: DAC 6
4503: DTC /STRING/
4504: *
4505: SCTAB DAC B$SCL TABLE
4506: DAC 5
4507: DTC /TABLE/
4508: EJC
4509: *
4510: * STRING CONSTANTS (SCBLK FORMAT) FOR KVRTN (SEE RETRN)
4511: *
4512: SCFRT DAC B$SCL FRETURN
4513: DAC 7
4514: DTC /FRETURN/
4515: *
4516: SCNRT DAC B$SCL NRETURN
4517: DAC 7
4518: DTC /NRETURN/
4519: *
4520: SCRTN DAC B$SCL RETURN
4521: DAC 6
4522: DTC /RETURN/
4523: *
4524: * DATATYPE NAME TABLE FOR DTYPE PROCEDURE. THE ORDER OF
4525: * THESE ENTRIES IS TIED TO THE B$XXX DEFINITIONS FOR BLOCKS
4526: *
4527: SCNMT DAC SCARR ARBLK ARRAY
4528: DAC SCBUF BFBLK BUFFER
4529: DAC SCCOD CDBLK CODE
4530: DAC SCEXP EXBLK EXPRESSION
4531: DAC SCINT ICBLK INTEGER
4532: DAC SCNAM NMBLK NAME
4533: DAC SCPAT P0BLK PATTERN
4534: DAC SCPAT P1BLK PATTERN
4535: DAC SCPAT P2BLK PATTERN
4536: DAC SCREA RCBLK REAL
4537: DAC SCSTR SCBLK STRING
4538: DAC SCEXP SEBLK EXPRESSION
4539: DAC SCTAB TBBLK TABLE
4540: DAC SCARR VCBLK ARRAY
4541: DAC SCEXT XNBLK EXTERNAL
4542: DAC SCEXT XRBLK EXTERNAL
4543: *
4544: * STRING CONSTANT FOR REAL ZERO
4545: *
4546: SCRE0 DAC B$SCL
4547: DAC 2
4548: DTC /0./
4549: EJC
4550: *
4551: * USED TO RE-INITIALISE KVSTL
4552: *
4553: STLIM DIC +50000 DEFAULT STATEMENT LIMIT
4554: *
4555: * DUMMY FUNCTION BLOCK USED FOR UNDEFINED FUNCTIONS
4556: *
4557: STNDF DAC O$FUN PTR TO UNDEFINED FUNCTION ERR CALL
4558: DAC 0 DUMMY FARGS COUNT FOR CALL CIRCUIT
4559: *
4560: * DUMMY CODE BLOCK USED FOR UNDEFINED LABELS
4561: *
4562: STNDL DAC L$UND CODE PTR POINTS TO UNDEFINED LBL
4563: *
4564: * DUMMY OPERATOR BLOCK USED FOR UNDEFINED OPERATORS
4565: *
4566: STNDO DAC O$OUN PTR TO UNDEFINED OPERATOR ERR CALL
4567: DAC 0 DUMMY FARGS COUNT FOR CALL CIRCUIT
4568: *
4569: * STANDARD VARIABLE BLOCK. THIS BLOCK IS USED TO INITIALIZE
4570: * THE FIRST SEVEN FIELDS OF A NEWLY CONSTRUCTED VRBLK.
4571: * ITS FORMAT IS TIED TO THE VRBLK DEFINITIONS (SEE GTNVR).
4572: *
4573: STNVR DAC B$VRL VRGET
4574: DAC B$VRS VRSTO
4575: DAC NULLS VRVAL
4576: DAC B$VRG VRTRA
4577: DAC STNDL VRLBL
4578: DAC STNDF VRFNC
4579: DAC 0 VRNXT
4580: EJC
4581: *
4582: * MESSAGES USED IN END OF RUN PROCESSING (STOPR)
4583: *
4584: STPM1 DAC B$SCL IN STATEMENT
4585: DAC 12
4586: DTC /IN STATEMENT/
4587: *
4588: STPM2 DAC B$SCL
4589: DAC 14
4590: DTC /STMTS EXECUTED/
4591: *
4592: STPM3 DAC B$SCL
4593: DAC 13
4594: DTC /RUN TIME-MSEC/
4595: *
4596: STPM4 DAC B$SCL
4597: DAC 12
4598: DTC $MCSEC / STMT$
4599: *
4600: STPM5 DAC B$SCL
4601: DAC 13
4602: DTC /REGENERATIONS/
4603: *
4604: * CHARS FOR /TU/ ENDING CODE
4605: *
4606: STRTU DTC /TU/
4607: *
4608: * TABLE USED BY CONVERT FUNCTION TO CHECK DATATYPE NAME
4609: * THE ENTRIES ARE ORDERED TO CORRESPOND TO BRANCH TABLE
4610: * IN S$CNV
4611: *
4612: SVCTB DAC SCSTR STRING
4613: DAC SCINT INTEGER
4614: DAC SCNAM NAME
4615: DAC SCPAT PATTERN
4616: DAC SCARR ARRAY
4617: DAC SCTAB TABLE
4618: DAC SCEXP EXPRESSION
4619: DAC SCCOD CODE
4620: DAC SCNUM NUMERIC
4621: DAC SCREA REAL
4622: DAC SCBUF BUFFER
4623: DAC 0 ZERO MARKS END OF LIST
4624: EJC
4625: *
4626: * MESSAGES (SCBLK FORMAT) USED BY TRACE PROCEDURES
4627: *
4628: *
4629: TMASB DAC B$SCL ASTERISKS FOR TRACE STATEMENT NO
4630: DAC 13
4631: DTC /************ /
4632:
4633: *
4634: TMBEB DAC B$SCL BLANK-EQUAL-BLANK
4635: DAC 3
4636: DTC / = /
4637: *
4638: * DUMMY TRBLK FOR EXPRESSION VARIABLE
4639: *
4640: TRBEV DAC B$TRT DUMMY TRBLK
4641: *
4642: * DUMMY TRBLK FOR KEYWORD VARIABLE
4643: *
4644: TRBKV DAC B$TRT DUMMY TRBLK
4645: *
4646: * DUMMY CODE BLOCK TO RETURN CONTROL TO TRXEQ PROCEDURE
4647: *
4648: TRXDR DAC O$TXR BLOCK POINTS TO RETURN ROUTINE
4649: TRXDC DAC TRXDR POINTER TO BLOCK
4650: EJC
4651: *
4652: * STANDARD VARIABLE BLOCKS
4653: *
4654: * SEE SVBLK FORMAT FOR FULL DETAILS OF THE FORMAT. THE
4655: * VRBLKS ARE ORDERED BY LENGTH AND WITHIN EACH LENGTH THE
4656: * ORDER IS ALPHABETICAL BY NAME OF THE VARIABLE.
4657: *
4658: V$EQF DBC SVFPR EQ
4659: DAC 2
4660: DTC /EQ/
4661: DAC S$EQF
4662: DAC 2
4663: *
4664: V$GEF DBC SVFPR GE
4665: DAC 2
4666: DTC /GE/
4667: DAC S$GEF
4668: DAC 2
4669: *
4670: V$GTF DBC SVFPR GT
4671: DAC 2
4672: DTC /GT/
4673: DAC S$GTF
4674: DAC 2
4675: *
4676: V$LEF DBC SVFPR LE
4677: DAC 2
4678: DTC /LE/
4679: DAC S$LEF
4680: DAC 2
4681: *
4682: V$LTF DBC SVFPR LT
4683: DAC 2
4684: DTC /LT/
4685: DAC S$LTF
4686: DAC 2
4687: *
4688: V$NEF DBC SVFPR NE
4689: DAC 2
4690: DTC /NE/
4691: DAC S$NEF
4692: DAC 2
4693: *
4694: V$ANY DBC SVFNP ANY
4695: DAC 3
4696: DTC /ANY/
4697: DAC S$ANY
4698: DAC 1
4699: *
4700: V$ARB DBC SVKVC ARB
4701: DAC 3
4702: DTC /ARB/
4703: DAC K$ARB
4704: DAC NDARB
4705: EJC
4706: *
4707: * STANDARD VARIABLE BLOCKS (CONTINUED)
4708: *
4709: V$ARG DBC SVFNN ARG
4710: DAC 3
4711: DTC /ARG/
4712: DAC S$ARG
4713: DAC 2
4714: *
4715: V$BAL DBC SVKVC BAL
4716: DAC 3
4717: DTC /BAL/
4718: DAC K$BAL
4719: DAC NDBAL
4720: *
4721: V$END DBC SVLBL END
4722: DAC 3
4723: DTC /END/
4724: DAC L$END
4725: *
4726: V$LEN DBC SVFNP LEN
4727: DAC 3
4728: DTC /LEN/
4729: DAC S$LEN
4730: DAC 1
4731: *
4732: V$LEQ DBC SVFPR LEQ
4733: DAC 3
4734: DTC /LEQ/
4735: DAC S$LEQ
4736: DAC 2
4737: *
4738: V$LGE DBC SVFPR LGE
4739: DAC 3
4740: DTC /LGE/
4741: DAC S$LGE
4742: DAC 2
4743: *
4744: V$LGT DBC SVFPR LGT
4745: DAC 3
4746: DTC /LGT/
4747: DAC S$LGT
4748: DAC 2
4749: *
4750: V$LLE DBC SVFPR LLE
4751: DAC 3
4752: DTC /LLE/
4753: DAC S$LLE
4754: DAC 2
4755: EJC
4756: *
4757: * STANDARD VARIABLE BLOCKS (CONTINUED)
4758: *
4759: V$LLT DBC SVFPR LLT
4760: DAC 3
4761: DTC /LLT/
4762: DAC S$LLT
4763: DAC 2
4764: *
4765: V$LNE DBC SVFPR LNE
4766: DAC 3
4767: DTC /LNE/
4768: DAC S$LNE
4769: DAC 2
4770: *
4771: V$POS DBC SVFNP POS
4772: DAC 3
4773: DTC /POS/
4774: DAC S$POS
4775: DAC 1
4776: *
4777: V$REM DBC SVKVC REM
4778: DAC 3
4779: DTC /REM/
4780: DAC K$REM
4781: DAC NDREM
4782: *
4783: V$SET DBC SVFNN SET
4784: DAC 3
4785: DTC /SET/
4786: DAC S$SET
4787: DAC 3
4788: *
4789: V$TAB DBC SVFNP TAB
4790: DAC 3
4791: DTC /TAB/
4792: DAC S$TAB
4793: DAC 1
4794: *
4795: V$CAS DBC SVKNM CASE
4796: DAC 4
4797: DTC /CASE/
4798: DAC K$CAS
4799: *
4800: V$CHR DBC SVFNP CHAR
4801: DAC 4
4802: DTC /CHAR/
4803: DAC S$CHR
4804: DAC 1
4805: *
4806: V$COD DBC SVFNK CODE
4807: DAC 4
4808: DTC /CODE/
4809: DAC K$COD
4810: DAC S$COD
4811: DAC 1
4812: *
4813: V$COP DBC SVFNN COPY
4814: DAC 4
4815: DTC /COPY/
4816: DAC S$COP
4817: DAC 1
4818: EJC
4819: *
4820: * STANDARD VARIABLE BLOCKS (CONTINUED)
4821: *
4822: V$DAT DBC SVFNN DATA
4823: DAC 4
4824: DTC /DATA/
4825: DAC S$DAT
4826: DAC 1
4827: *
4828: V$DTE DBC SVFNN DATE
4829: DAC 4
4830: DTC /DATE/
4831: DAC S$DTE
4832: DAC 0
4833: *
4834: V$DMP DBC SVFNK DUMP
4835: DAC 4
4836: DTC /DUMP/
4837: DAC K$DMP
4838: DAC S$DMP
4839: DAC 1
4840: *
4841: V$DUP DBC SVFNN DUPL
4842: DAC 4
4843: DTC /DUPL/
4844: DAC S$DUP
4845: DAC 2
4846: *
4847: V$EVL DBC SVFNN EVAL
4848: DAC 4
4849: DTC /EVAL/
4850: DAC S$EVL
4851: DAC 1
4852: *
4853: V$EXT DBC SVFNN EXIT
4854: DAC 4
4855: DTC /EXIT/
4856: DAC S$EXT
4857: DAC 1
4858: *
4859: V$FAL DBC SVKVC FAIL
4860: DAC 4
4861: DTC /FAIL/
4862: DAC K$FAL
4863: DAC NDFAL
4864: *
4865: V$HST DBC SVFNN HOST
4866: DAC 4
4867: DTC /HOST/
4868: DAC S$HST
4869: DAC 3
4870: EJC
4871: *
4872: * STANDARD VARIABLE BLOCKS (CONTINUED)
4873: *
4874: V$ITM DBC SVFNF ITEM
4875: DAC 4
4876: DTC /ITEM/
4877: DAC S$ITM
4878: DAC 999
4879: *
4880: V$LOD DBC SVFNN LOAD
4881: DAC 4
4882: DTC /LOAD/
4883: DAC S$LOD
4884: DAC 2
4885: *
4886: V$LPD DBC SVFNP LPAD
4887: DAC 4
4888: DTC /LPAD/
4889: DAC S$LPD
4890: DAC 3
4891: *
4892: V$RPD DBC SVFNP RPAD
4893: DAC 4
4894: DTC /RPAD/
4895: DAC S$RPD
4896: DAC 3
4897: *
4898: V$RPS DBC SVFNP RPOS
4899: DAC 4
4900: DTC /RPOS/
4901: DAC S$RPS
4902: DAC 1
4903: *
4904: V$RTB DBC SVFNP RTAB
4905: DAC 4
4906: DTC /RTAB/
4907: DAC S$RTB
4908: DAC 1
4909: *
4910: V$SI$ DBC SVFNP SIZE
4911: DAC 4
4912: DTC /SIZE/
4913: DAC S$SI$
4914: DAC 1
4915: *
4916: *
4917: V$SRT DBC SVFNN SORT
4918: DAC 4
4919: DTC /SORT/
4920: DAC S$SRT
4921: DAC 2
4922: V$SPN DBC SVFNP SPAN
4923: DAC 4
4924: DTC /SPAN/
4925: DAC S$SPN
4926: DAC 1
4927: EJC
4928: *
4929: * STANDARD VARIABLE BLOCKS (CONTINUED)
4930: *
4931: V$STN DBC SVKNM STNO
4932: DAC 4
4933: DTC /STNO/
4934: DAC K$STN
4935: *
4936: V$TIM DBC SVFNN TIME
4937: DAC 4
4938: DTC /TIME/
4939: DAC S$TIM
4940: DAC 0
4941: *
4942: V$TRM DBC SVFNK TRIM
4943: DAC 4
4944: DTC /TRIM/
4945: DAC K$TRM
4946: DAC S$TRM
4947: DAC 1
4948: *
4949: V$ABE DBC SVKNM ABEND
4950: DAC 5
4951: DTC /ABEND/
4952: DAC K$ABE
4953: *
4954: V$ABO DBC SVKVL ABORT
4955: DAC 5
4956: DTC /ABORT/
4957: DAC K$ABO
4958: DAC L$ABO
4959: DAC NDABO
4960: *
4961: V$APP DBC SVFNF APPLY
4962: DAC 5
4963: DTC /APPLY/
4964: DAC S$APP
4965: DAC 999
4966: *
4967: V$ABN DBC SVFNP ARBNO
4968: DAC 5
4969: DTC /ARBNO/
4970: DAC S$ABN
4971: DAC 1
4972: *
4973: V$ARR DBC SVFNN ARRAY
4974: DAC 5
4975: DTC /ARRAY/
4976: DAC S$ARR
4977: DAC 2
4978: EJC
4979: *
4980: * STANDARD VARIABLE BLOCKS (CONTINUED)
4981: *
4982: V$BRK DBC SVFNP BREAK
4983: DAC 5
4984: DTC /BREAK/
4985: DAC S$BRK
4986: DAC 1
4987: *
4988: V$CLR DBC SVFNN CLEAR
4989: DAC 5
4990: DTC /CLEAR/
4991: DAC S$CLR
4992: DAC 1
4993: *
4994: V$EJC DBC SVFNN EJECT
4995: DAC 5
4996: DTC /EJECT/
4997: DAC S$EJC
4998: DAC 1
4999: *
5000: V$FEN DBC SVFPK FENCE
5001: DAC 5
5002: DTC /FENCE/
5003: DAC K$FEN
5004: DAC S$FNC
5005: DAC 1
5006: DAC NDFEN
5007: *
5008: V$FLD DBC SVFNN FIELD
5009: DAC 5
5010: DTC /FIELD/
5011: DAC S$FLD
5012: DAC 2
5013: *
5014: V$IDN DBC SVFPR IDENT
5015: DAC 5
5016: DTC /IDENT/
5017: DAC S$IDN
5018: DAC 2
5019: *
5020: V$INP DBC SVFNK INPUT
5021: DAC 5
5022: DTC /INPUT/
5023: DAC K$INP
5024: DAC S$INP
5025: DAC 3
5026: *
5027: V$LOC DBC SVFNN LOCAL
5028: DAC 5
5029: DTC /LOCAL/
5030: DAC S$LOC
5031: DAC 2
5032: EJC
5033: *
5034: * STANDARD VARIABLE BLOCKS (CONTINUED)
5035: *
5036: V$OPS DBC SVFNN OPSYN
5037: DAC 5
5038: DTC /OPSYN/
5039: DAC S$OPS
5040: DAC 3
5041: *
5042: V$RMD DBC SVFNP REMDR
5043: DAC 5
5044: DTC /REMDR/
5045: DAC S$RMD
5046: DAC 2
5047: *
5048: V$RSR DBC SVFNN RSORT
5049: DAC 5
5050: DTC /RSORT/
5051: DAC S$RSR
5052: DAC 2
5053: *
5054: V$TBL DBC SVFNN TABLE
5055: DAC 5
5056: DTC /TABLE/
5057: DAC S$TBL
5058: DAC 3
5059: *
5060: V$TRA DBC SVFNK TRACE
5061: DAC 5
5062: DTC /TRACE/
5063: DAC K$TRA
5064: DAC S$TRA
5065: DAC 4
5066: *
5067: V$ANC DBC SVKNM ANCHOR
5068: DAC 6
5069: DTC /ANCHOR/
5070: DAC K$ANC
5071: *
5072: V$APN DBC SVFNN
5073: DAC 6
5074: DTC /APPEND/
5075: DAC S$APN
5076: DAC 2
5077: *
5078: V$BKX DBC SVFNP BREAKX
5079: DAC 6
5080: DTC /BREAKX/
5081: DAC S$BKX
5082: DAC 1
5083: *
5084: V$BUF DBC SVFNN BUFFER
5085: DAC 6
5086: DTC /BUFFER/
5087: DAC S$BUF
5088: DAC 2
5089: *
5090: V$DEF DBC SVFNN DEFINE
5091: DAC 6
5092: DTC /DEFINE/
5093: DAC S$DEF
5094: DAC 2
5095: *
5096: V$DET DBC SVFNN DETACH
5097: DAC 6
5098: DTC /DETACH/
5099: DAC S$DET
5100: DAC 1
5101: EJC
5102: *
5103: * STANDARD VARIABLE BLOCKS (CONTINUED)
5104: *
5105: V$DIF DBC SVFPR DIFFER
5106: DAC 6
5107: DTC /DIFFER/
5108: DAC S$DIF
5109: DAC 2
5110: *
5111: V$FTR DBC SVKNM FTRACE
5112: DAC 6
5113: DTC /FTRACE/
5114: DAC K$FTR
5115: *
5116: V$INS DBC SVFNN INSERT
5117: DAC 6
5118: DTC /INSERT/
5119: DAC S$INS
5120: DAC 4
5121: *
5122: V$LST DBC SVKNM LASTNO
5123: DAC 6
5124: DTC /LASTNO/
5125: DAC K$LST
5126: *
5127: V$NAY DBC SVFNP NOTANY
5128: DAC 6
5129: DTC /NOTANY/
5130: DAC S$NAY
5131: DAC 1
5132: *
5133: V$OUP DBC SVFNK OUTPUT
5134: DAC 6
5135: DTC /OUTPUT/
5136: DAC K$OUP
5137: DAC S$OUP
5138: DAC 3
5139: *
5140: V$RET DBC SVLBL RETURN
5141: DAC 6
5142: DTC /RETURN/
5143: DAC L$RTN
5144: *
5145: V$REW DBC SVFNN REWIND
5146: DAC 6
5147: DTC /REWIND/
5148: DAC S$REW
5149: DAC 1
5150: *
5151: V$STT DBC SVFNN STOPTR
5152: DAC 6
5153: DTC /STOPTR/
5154: DAC S$STT
5155: DAC 2
5156: EJC
5157: *
5158: * STANDARD VARIABLE BLOCKS (CONTINUED)
5159: *
5160: V$SUB DBC SVFNN SUBSTR
5161: DAC 6
5162: DTC /SUBSTR/
5163: DAC S$SUB
5164: DAC 3
5165: *
5166: V$UNL DBC SVFNN UNLOAD
5167: DAC 6
5168: DTC /UNLOAD/
5169: DAC S$UNL
5170: DAC 1
5171: *
5172: V$COL DBC SVFNN COLLECT
5173: DAC 7
5174: DTC /COLLECT/
5175: DAC S$COL
5176: DAC 1
5177: *
5178: V$CNV DBC SVFNN CONVERT
5179: DAC 7
5180: DTC /CONVERT/
5181: DAC S$CNV
5182: DAC 2
5183: *
5184: V$ENF DBC SVFNN ENDFILE
5185: DAC 7
5186: DTC /ENDFILE/
5187: DAC S$ENF
5188: DAC 1
5189: *
5190: V$ETX DBC SVKNM ERRTEXT
5191: DAC 7
5192: DTC /ERRTEXT/
5193: DAC K$ETX
5194: *
5195: V$ERT DBC SVKNM ERRTYPE
5196: DAC 7
5197: DTC /ERRTYPE/
5198: DAC K$ERT
5199: *
5200: V$FRT DBC SVLBL FRETURN
5201: DAC 7
5202: DTC /FRETURN/
5203: DAC L$FRT
5204: *
5205: V$INT DBC SVFPR INTEGER
5206: DAC 7
5207: DTC /INTEGER/
5208: DAC S$INT
5209: DAC 1
5210: *
5211: V$NRT DBC SVLBL NRETURN
5212: DAC 7
5213: DTC /NRETURN/
5214: DAC L$NRT
5215: EJC
5216: *
5217: * STANDARD VARIABLE BLOCKS (CONTINUED)
5218: *
5219: *
5220: V$PFL DBC SVKNM PROFILE
5221: DAC 7
5222: DTC /PROFILE/
5223: DAC K$PFL
5224: *
5225: V$RPL DBC SVFNP REPLACE
5226: DAC 7
5227: DTC /REPLACE/
5228: DAC S$RPL
5229: DAC 3
5230: *
5231: V$RVS DBC SVFNP REVERSE
5232: DAC 7
5233: DTC /REVERSE/
5234: DAC S$RVS
5235: DAC 1
5236: *
5237: V$RTN DBC SVKNM RTNTYPE
5238: DAC 7
5239: DTC /RTNTYPE/
5240: DAC K$RTN
5241: *
5242: V$STX DBC SVFNN SETEXIT
5243: DAC 7
5244: DTC /SETEXIT/
5245: DAC S$STX
5246: DAC 1
5247: *
5248: V$STC DBC SVKNM STCOUNT
5249: DAC 7
5250: DTC /STCOUNT/
5251: DAC K$STC
5252: *
5253: V$STL DBC SVKNM STLIMIT
5254: DAC 7
5255: DTC /STLIMIT/
5256: DAC K$STL
5257: *
5258: V$SUC DBC SVKVC SUCCEED
5259: DAC 7
5260: DTC /SUCCEED/
5261: DAC K$SUC
5262: DAC NDSUC
5263: *
5264: V$ALP DBC SVKWC ALPHABET
5265: DAC 8
5266: DTC /ALPHABET/
5267: DAC K$ALP
5268: *
5269: V$CNT DBC SVLBL CONTINUE
5270: DAC 8
5271: DTC /CONTINUE/
5272: DAC L$CNT
5273: EJC
5274: *
5275: * STANDARD VARIABLE BLOCKS (CONTINUED)
5276: *
5277: V$DTP DBC SVFNP DATATYPE
5278: DAC 8
5279: DTC /DATATYPE/
5280: DAC S$DTP
5281: DAC 1
5282: *
5283: V$ERL DBC SVKNM ERRLIMIT
5284: DAC 8
5285: DTC /ERRLIMIT/
5286: DAC K$ERL
5287: *
5288: V$FNC DBC SVKNM FNCLEVEL
5289: DAC 8
5290: DTC /FNCLEVEL/
5291: DAC K$FNC
5292: *
5293: V$MXL DBC SVKNM MAXLNGTH
5294: DAC 8
5295: DTC /MAXLNGTH/
5296: DAC K$MXL
5297: *
5298: V$TER DBC 0 TERMINAL
5299: DAC 8
5300: DTC /TERMINAL/
5301: DAC 0
5302: *
5303: V$PRO DBC SVFNN PROTOTYPE
5304: DAC 9
5305: DTC /PROTOTYPE/
5306: DAC S$PRO
5307: DAC 1
5308: *
5309: DBC 0 DUMMY ENTRY TO END LIST
5310: DAC 10 LENGTH GT 9 (PROTOTYPE)
5311: EJC
5312: *
5313: * LIST OF SVBLK POINTERS FOR KEYWORDS TO BE DUMPED. THE
5314: * LIST IS IN THE ORDER WHICH APPEARS ON THE DUMP OUTPUT.
5315: *
5316: VDMKW DAC V$ANC ANCHOR
5317: DAC V$CAS CCASE
5318: DAC V$COD CODE
5319: DAC V$DMP DUMP
5320: DAC V$ERL ERRLIMIT
5321: DAC V$ETX ERRTEXT
5322: DAC V$ERT ERRTYPE
5323: DAC V$FNC FNCLEVEL
5324: DAC V$FTR FTRACE
5325: DAC V$INP INPUT
5326: DAC V$LST LASTNO
5327: DAC V$MXL MAXLENGTH
5328: DAC V$OUP OUTPUT
5329: DAC V$PFL PROFILE
5330: DAC V$RTN RTNTYPE
5331: DAC V$STC STCOUNT
5332: DAC V$STL STLIMIT
5333: DAC V$STN STNO
5334: DAC V$TRA TRACE
5335: DAC V$TRM TRIM
5336: DAC 0 END OF LIST
5337: *
5338: * TABLE USED BY GTNVR TO SEARCH SVBLK LISTS
5339: *
5340: VSRCH DAC 0 DUMMY ENTRY TO GET PROPER INDEXING
5341: DAC V$EQF START OF 1 CHAR VARIABLES (NONE)
5342: DAC V$EQF START OF 2 CHAR VARIABLES
5343: DAC V$ANY START OF 3 CHAR VARIABLES
5344: DAC V$CAS START OF 4 CHAR VARIABLES
5345: DAC V$ABE START OF 5 CHAR VARIABLES
5346: DAC V$ANC START OF 6 CHAR VARIABLES
5347: DAC V$COL START OF 7 CHAR VARIABLES
5348: DAC V$ALP START OF 8 CHAR VARIABLES
5349: DAC V$PRO START OF 9 CHAR VARIABLES
5350: TTL S P I T B O L -- WORKING STORAGE SECTION
5351: *
5352: * THE WORKING STORAGE SECTION CONTAINS AREAS WHICH ARE
5353: * CHANGED DURING EXECUTION OF THE PROGRAM. THE VALUE
5354: * ASSEMBLED IS THE INITIAL VALUE BEFORE EXECUTION STARTS.
5355: *
5356: * ALL THESE AREAS ARE FIXED LENGTH AREAS. VARIABLE LENGTH
5357: * DATA IS STORED IN THE STATIC OR DYNAMIC REGIONS OF THE
5358: * ALLOCATED DATA AREAS.
5359: *
5360: * THE VALUES IN THIS AREA ARE DESCRIBED EITHER AS WORK
5361: * AREAS OR AS GLOBAL VALUES. A WORK AREA IS USED IN AN
5362: * EPHEMERAL MANNER AND THE VALUE IS NOT SAVED FROM ONE
5363: * ENTRY INTO A ROUTINE TO ANOTHER. A GLOBAL VALUE IS A
5364: * LESS TEMPORARY LOCATION WHOSE VALUE IS SAVED FROM ONE
5365: * CALL TO ANOTHER.
5366: *
5367: * A GENERAL PART OF THE APPROACH IN THIS PROGRAM IS NOT
5368: * TO OVERLAP WORK AREAS BETWEEN PROCEDURES EVEN THOUGH A
5369: * SMALL AMOUNT OF SPACE COULD BE SAVED. SUCH OVERLAP IS
5370: * CONSIDERED A SOURCE OF PROGRAM ERRORS AND DECREASES THE
5371: * INFORMATION LEFT BEHIND AFTER A SYSTEM CRASH OF ANY KIND.
5372: *
5373: * THE NAMES OF THESE LOCATIONS ARE LABELS WITH FIVE LETTER
5374: * (A-Y,$) NAMES. AS FAR AS POSSIBLE THE ORDER IS KEPT
5375: * ALPHABETICAL BY THESE NAMES BUT IN SOME CASES THERE
5376: * ARE SLIGHT DEPARTURES CAUSED BY OTHER ORDER REQUIREMENTS.
5377: *
5378: * UNLESS OTHERWISE DOCUMENTED, THE ORDER OF WORK AREAS
5379: * DOES NOT AFFECT THE EXECUTION OF THE SPITBOL PROGRAM.
5380: *
5381: SEC START OF WORKING STORAGE SECTION
5382: EJC
5383: *
5384: * THIS AREA IS NOT CLEARED BY INITIAL CODE
5385: *
5386: CMLAB DAC B$SCL STRING USED TO CHECK LABEL LEGALITY
5387: DAC 2
5388: DTC / /
5389: *
5390: * LABEL TO MARK START OF WORK AREA
5391: *
5392: AAAAA DAC 0
5393: *
5394: * WORK AREAS FOR ALLOC PROCEDURE
5395: *
5396: ALDYN DAC 0 AMOUNT OF DYNAMIC STORE
5397: ALFSF DIC +0 FACTOR IN FREE STORE PCNTAGE CHECK
5398: ALLIA DIC +0 DUMP IA
5399: ALLSV DAC 0 SAVE WB IN ALLOC
5400: *
5401: * WORK AREAS FOR ALOST PROCEDURE
5402: *
5403: ALSTA DAC 0 SAVE WA IN ALOST
5404: *
5405: * SAVE AREAS FOR ARRAY FUNCTION (S$ARR)
5406: *
5407: ARCDM DAC 0 COUNT DIMENSIONS
5408: ARNEL DIC +0 COUNT ELEMENTS
5409: ARPTR DAC 0 OFFSET PTR INTO ARBLK
5410: ARSVL DIC +0 SAVE INTEGER LOW BOUND
5411: EJC
5412: * WORK AREAS FOR ARREF ROUTINE
5413: *
5414: ARFSI DIC +0 SAVE CURRENT EVOLVING SUBSCRIPT
5415: ARFXS DAC 0 SAVE BASE STACK POINTER
5416: *
5417: * WORK AREAS FOR B$EFC BLOCK ROUTINE
5418: *
5419: BEFOF DAC 0 SAVE OFFSET PTR INTO EFBLK
5420: *
5421: * WORK AREAS FOR B$PFC BLOCK ROUTINE
5422: *
5423: BPFPF DAC 0 SAVE PFBLK POINTER
5424: BPFSV DAC 0 SAVE OLD FUNCTION VALUE
5425: BPFXT DAC 0 POINTER TO STACKED ARGUMENTS
5426: *
5427: * SAVE AREAS FOR COLLECT FUNCTION (S$COL)
5428: *
5429: CLSVI DIC +0 SAVE INTEGER ARGUMENT
5430: *
5431: * GLOBAL VALUES FOR CMPIL PROCEDURE
5432: *
5433: CMERC DAC 0 COUNT OF INITIAL COMPILE ERRORS
5434: CMPXS DAC 0 SAVE STACK PTR IN CASE OF ERRORS
5435: CMPSN DAC 1 NUMBER OF NEXT STATEMENT TO COMPILE
5436: CMPSS DAC 0 SAVE SUBROUTINE STACK PTR
5437: *
5438: * WORK AREA FOR CNCRD
5439: *
5440: CNSCC DAC 0 POINTER TO CONTROL CARD STRING
5441: CNSWC DAC 0 WORD COUNT
5442: CNR$T DAC 0 POINTER TO R$TTL OR R$STL
5443: CNTTL DAC 0 FLAG FOR -TITLE, -STITL
5444: *
5445: * WORK AREAS FOR CONVERT FUNCTION (S$CNV)
5446: *
5447: CNVTP DAC 0 SAVE PTR INTO SCVTB
5448: *
5449: * FLAG FOR SUPPRESSION OF COMPILATION STATISTICS.
5450: *
5451: CPSTS DAC 0 SUPPRESS COMP. STATS IF NON ZERO
5452: *
5453: * GLOBAL VALUES FOR CONTROL CARD SWITCHES
5454: *
5455: CSWDB DAC 0 0/1 FOR -SINGLE/-DOUBLE
5456: CSWER DAC 0 0/1 FOR -ERRORS/-NOERRORS
5457: CSWEX DAC 0 0/1 FOR -EXECUTE/-NOEXECUTE
5458: CSWFL DAC 1 0/1 FOR -NOFAIL/-FAIL
5459: CSWIN DAC INILN XXX FOR -INXXX
5460: CSWLS DAC 1 0/1 FOR -NOLIST/-LIST
5461: CSWNO DAC 0 0/1 FOR -OPTIMISE/-NOOPT
5462: CSWPR DAC 0 0/1 FOR -NOPRINT/-PRINT
5463: *
5464: * GLOBAL LOCATION USED BY PATST PROCEDURE
5465: *
5466: CTMSK DBC 0 LAST BIT POSITION USED IN R$CTP
5467: CURID DAC 0 CURRENT ID VALUE
5468: EJC
5469: *
5470: * GLOBAL VALUE FOR CDWRD PROCEDURE
5471: *
5472: CWCOF DAC 0 NEXT WORD OFFSET IN CURRENT CCBLK
5473: *
5474: * WORK AREAS FOR DATA FUNCTION (S$DAT)
5475: *
5476: DATDV DAC 0 SAVE VRBLK PTR FOR DATATYPE NAME
5477: DATXS DAC 0 SAVE INITIAL STACK POINTER
5478: *
5479: * WORK AREAS FOR DEFINE FUNCTION (S$DEF)
5480: *
5481: DEFLB DAC 0 SAVE VRBLK PTR FOR LABEL
5482: DEFNA DAC 0 COUNT FUNCTION ARGUMENTS
5483: DEFVR DAC 0 SAVE VRBLK PTR FOR FUNCTION NAME
5484: DEFXS DAC 0 SAVE INITIAL STACK POINTER
5485: *
5486: * WORK AREAS FOR DUMPR PROCEDURE
5487: *
5488: DMARG DAC 0 DUMP ARGUMENT
5489: DMPKB DAC B$KVT DUMMY KVBLK FOR USE IN DUMPR
5490: DMPKT DAC TRBKV KVVAR TRBLK POINTER
5491: DMPKN DAC 0 KEYWORD NUMBER (MUST FOLLOW DMPKB)
5492: DMPSA DAC 0 PRESERVE WA OVER PRTVL CALL
5493: DMPSV DAC 0 GENERAL SCRATCH SAVE
5494: DMVCH DAC 0 CHAIN POINTER FOR VARIABLE BLOCKS
5495: DMPCH DAC 0 SAVE SORTED VRBLK CHAIN POINTER
5496: *
5497: * GLOBAL LOCATIONS FOR DYNAMIC STORAGE POINTERS
5498: *
5499: DNAMB DAC 0 START OF DYNAMIC AREA
5500: DNAMP DAC 0 NEXT AVAILABLE LOC IN DYNAMIC AREA
5501: DNAME DAC 0 END OF AVAILABLE DYNAMIC AREA
5502: *
5503: * WORK AREA FOR DTACH
5504: *
5505: DTCNB DAC 0 NAME BASE
5506: DTCNM DAC 0 NAME PTR
5507: *
5508: * WORK AREAS FOR DUPL FUNCTION (S$DUP)
5509: *
5510: DUPSI DIC +0 STORE INTEGER STRING LENGTH
5511: *
5512: * WORK AREA FOR ENDFILE (S$ENF)
5513: *
5514: ENFCH DAC 0 FOR IOCHN CHAIN HEAD
5515: *
5516: * WORK AREA FOR ERROR PROCESSING.
5517: *
5518: ERICH DAC 0 COPY ERROR REPORTS TO INT.CHAN IF 1
5519: ERLST DAC 0 FOR LISTR WHEN ERRORS GO TO INT.CH.
5520: ERRFT DAC 0 FATAL ERROR FLAG
5521: ERRSP DAC 0 ERROR SUPPRESSION FLAG
5522: EJC
5523: *
5524: * DUMP AREA FOR ERTEX
5525: *
5526: ERTWA DAC 0 SAVE WA
5527: ERTWB DAC 0 SAVE WB
5528: *
5529: * GLOBAL VALUES FOR EVALI
5530: *
5531: EVLIN DAC P$LEN DUMMY PATTERN BLOCK PCODE
5532: EVLIS DAC 0 POINTER TO SUBSEQUENT NODE
5533: EVLIV DAC 0 VALUE OF PARAMETER
5534: * WORK AREA FOR EXPAN
5535: *
5536: EXPSV DAC 0 SAVE OP DOPE VECTOR POINTER
5537: *
5538: * FLAG FOR SUPPRESSION OF EXECUTION STATS
5539: *
5540: EXSTS DAC 0 SUPPRESS EXEC STATS IF SET
5541: *
5542: * GLOBAL VALUES FOR EXFAL AND RETURN
5543: *
5544: FLPRT DAC 0 LOCATION OF FAIL OFFSET FOR RETURN
5545: FLPTR DAC 0 LOCATION OF FAILURE OFFSET ON STACK
5546: *
5547: * WORK AREAS FOR GBCOL PROCEDURE
5548: *
5549: GBCFL DAC 0 GARBAGE COLLECTOR ACTIVE FLAG
5550: GBCLM DAC 0 POINTER TO LAST MOVE BLOCK (PASS 3)
5551: GBCNM DAC 0 DUMMY FIRST MOVE BLOCK
5552: GBCNS DAC 0 REST OF DUMMY BLOCK (FOLLOWS GBCNM)
5553: GBSVA DAC 0 SAVE WA
5554: GBSVB DAC 0 SAVE WB
5555: GBSVC DAC 0 SAVE WC
5556: *
5557: * GLOBAL LOCATION TO COUNT GARBAGE COLLECTIONS (GBCOL)
5558: *
5559: GBCNT DAC 0 COUNT OF GARBAGE COLLECTIONS
5560: *
5561: * WORK AREAS FOR GTNVR PROCEDURE
5562: *
5563: GNVHE DAC 0 PTR TO END OF HASH CHAIN
5564: GNVNW DAC 0 NUMBER OF WORDS IN STRING NAME
5565: GNVSA DAC 0 SAVE WA
5566: GNVSB DAC 0 SAVE WB
5567: GNVSP DAC 0 POINTER INTO VSRCH TABLE
5568: GNVST DAC 0 POINTER TO CHARS OF STRING
5569: *
5570: * GLOBAL VALUE FOR GTCOD AND GTEXP
5571: *
5572: GTCEF DAC 0 SAVE FAIL PTR IN CASE OF ERROR
5573: *
5574: * WORK AREAS FOR GTINT
5575: *
5576: GTINA DAC 0 SAVE WA
5577: GTINB DAC 0 SAVE WB
5578: EJC
5579: *
5580: * WORK AREAS FOR GTNUM PROCEDURE
5581: *
5582: GTNNF DAC 0 ZERO/NONZERO FOR RESULT +/-
5583: GTNSI DIC +0 GENERAL INTEGER SAVE
5584: GTNDF DAC 0 0/1 FOR DEC POINT SO FAR NO/YES
5585: GTNES DAC 0 ZERO/NONZERO EXPONENT +/-
5586: GTNEX DIC +0 REAL EXPONENT
5587: GTNSC DAC 0 SCALE (PLACES AFTER POINT)
5588: GTNSR DRC +0.0 GENERAL REAL SAVE
5589: GTNRD DAC 0 FLAG FOR OK REAL NUMBER
5590: *
5591: * WORK AREAS FOR GTPAT PROCEDURE
5592: *
5593: GTPSB DAC 0 SAVE WB
5594: *
5595: * WORK AREAS FOR GTSTG PROCEDURE
5596: *
5597: GTSSF DAC 0 0/1 FOR RESULT +/-
5598: GTSVC DAC 0 SAVE WC
5599: GTSVB DAC 0 SAVE WB
5600: GTSWK DAC 0 PTR TO WORK AREA FOR GTSTG
5601: GTSES DAC 0 CHAR + OR - FOR EXPONENT +/-
5602: GTSRS DRC +0.0 GENERAL REAL SAVE
5603: *
5604: * GLOBAL LOCATIONS (CONSTANTS) FOR GTSTG PROCEDURE
5605: *
5606: GTSRN DRC +0.0 ROUNDING FACTOR 0.5*10**-CFP$S
5607: GTSSC DRC +0.0 SCALING VALUE 10**CFP$S
5608: *
5609: * WORK AREAS FOR GTVAR PROCEDURE
5610: *
5611: GTVRC DAC 0 SAVE WC
5612: *
5613: * FLAG FOR HEADER PRINTING
5614: *
5615: HEADP DAC 0 HEADER PRINTED FLAG
5616: *
5617: * GLOBAL VALUES FOR VARIABLE HASH TABLE
5618: *
5619: HSHNB DIC +0 NUMBER OF HASH BUCKETS
5620: HSHTB DAC 0 POINTER TO START OF VRBLK HASH TABL
5621: HSHTE DAC 0 POINTER PAST END OF VRBLK HASH TABL
5622: *
5623: * WORK AREA FOR INIT
5624: *
5625: INISS DAC 0 SAVE SUBROUTINE STACK PTR
5626: INITR DAC 0 SAVE TERMINAL FLAG
5627: *
5628: * SAVE AREA FOR INSBF
5629: *
5630: INSAB DAC 0 ENTRY WA + ENTRY WB
5631: INSSA DAC 0 SAVE ENTRY WA
5632: INSSB DAC 0 SAVE ENTRY WB
5633: INSSC DAC 0 SAVE ENTRY WC
5634: *
5635: * WORK AREAS FOR IOPUT
5636: *
5637: IOPTT DAC 0 TYPE OF ASSOCIATION
5638: EJC
5639: *
5640: * GLOBAL VALUES FOR KEYWORD VALUES WHICH ARE STORED AS ONE
5641: * WORD INTEGERS. THESE VALUES MUST BE ASSEMBLED IN THE
5642: * FOLLOWING ORDER (AS DICTATED BY K$XXX DEFINITION VALUES).
5643: *
5644: KVABE DAC 0 ABEND
5645: KVANC DAC 0 ANCHOR
5646: KVCAS DAC 0 CASE
5647: KVCOD DAC 0 CODE
5648: KVDMP DAC 0 DUMP
5649: KVERL DAC 0 ERRLIMIT
5650: KVERT DAC 0 ERRTYPE
5651: KVFTR DAC 0 FTRACE
5652: KVINP DAC 1 INPUT
5653: KVMXL DAC 5000 MAXLENGTH
5654: KVOUP DAC 1 OUTPUT
5655: KVPFL DAC 0 PROFILE
5656: KVTRA DAC 0 TRACE
5657: KVTRM DAC 0 TRIM
5658: KVFNC DAC 0 FNCLEVEL
5659: KVLST DAC 0 LASTNO
5660: KVSTN DAC 0 STNO
5661: *
5662: * GLOBAL VALUES FOR OTHER KEYWORDS
5663: *
5664: KVALP DAC 0 ALPHABET
5665: KVRTN DAC NULLS RTNTYPE (SCBLK POINTER)
5666: KVSTL DIC +50000 STLIMIT
5667: KVSTC DIC +50000 STCOUNT (COUNTS DOWN FROM STLIMIT)
5668: *
5669: * WORK AREAS FOR LOAD FUNCTION
5670: *
5671: LODFN DAC 0 POINTER TO VRBLK FOR FUNC NAME
5672: LODNA DAC 0 COUNT NUMBER OF ARGUMENTS
5673: *
5674: * GLOBAL VALUES FOR LISTR PROCEDURE
5675: *
5676: LSTLC DAC 0 COUNT LINES ON SOURCE LIST PAGE
5677: LSTNP DAC 0 MAX NUMBER OF LINES ON PAGE
5678: LSTPF DAC 1 SET NONZERO IF CURRENT IMAGE LISTED
5679: LSTPG DAC 0 CURRENT SOURCE LIST PAGE NUMBER
5680: LSTPO DAC 0 OFFSET TO PAGE NNN MESSAGE
5681: LSTSN DAC 0 REMEMBER LAST STMNUM LISTED
5682: *
5683: * MAXIMUM SIZE OF SPITBOL OBJECTS
5684: *
5685: MXLEN DAC 0 INITIALISED BY SYSMX CALL
5686: *
5687: * EXECUTION CONTROL VARIABLE
5688: *
5689: NOXEQ DAC 0 SET NON-ZERO TO INHIBIT EXECUTION
5690: *
5691: * PROFILER GLOBAL VALUES AND WORK LOCATIONS
5692: *
5693: PFDMP DAC 0 SET NON-0 IF &PROFILE SET NON-0
5694: PFFNC DAC 0 SET NON-0 IF FUNCT JUST ENTERED
5695: PFSTM DIC +0 TO STORE STARTING TIME OF STMT
5696: PFETM DIC +0 TO STORE ENDING TIME OF STMT
5697: PFSVW DAC 0 TO SAVE A W-REG
5698: PFTBL DAC 0 GETS ADRS OF (IMAG) TABLE BASE
5699: PFNTE DAC 0 NR OF TABLE ENTRIES
5700: PFSTE DIC +0 GETS INT REP OF TABLE ENTRY SIZE
5701: *
5702: EJC
5703: *
5704: * GLOBAL VALUES USED IN PATTERN MATCH ROUTINES
5705: *
5706: PMDFL DAC 0 PATTERN ASSIGNMENT FLAG
5707: PMHBS DAC 0 HISTORY STACK BASE POINTER
5708: PMSSL DAC 0 LENGTH OF SUBJECT STRING IN CHARS
5709: *
5710: * FLAGS USED FOR STANDARD FILE LISTING OPTIONS
5711: *
5712: PRICH DAC 0 PRINTER ON INTERACTIVE CHANNEL
5713: PRSTD DAC 0 TESTED BY PRTPG
5714: PRSTO DAC 0 STANDARD LISTING OPTION FLAG
5715: *
5716: * GLOBAL VALUE FOR PRTNM PROCEDURE
5717: *
5718: PRNMV DAC 0 VRBLK PTR FROM LAST NAME SEARCH
5719: *
5720: * WORK AREAS FOR PRTNM PROCEDURE
5721: *
5722: PRNSI DIC +0 SCRATCH INTEGER LOC
5723: *
5724: * WORK AREAS FOR PRTSN PROCEDURE
5725: *
5726: PRSNA DAC 0 SAVE WA
5727: *
5728: * GLOBAL VALUES FOR PRINT PROCEDURES
5729: *
5730: PRBUF DAC 0 PTR TO PRINT BFR IN STATIC
5731: PRECL DAC 0 EXTENDED/COMPACT LISTING FLAG
5732: PRLEN DAC 0 LENGTH OF PRINT BUFFER IN CHARS
5733: PRLNW DAC 0 LENGTH OF PRINT BUFFER IN WORDS
5734: PROFS DAC 0 OFFSET TO NEXT LOCATION IN PRBUF
5735: PRTEF DAC 0 ENDFILE FLAG
5736: *
5737: * WORK AREAS FOR PRTST PROCEDURE
5738: *
5739: PRSVA DAC 0 SAVE WA
5740: PRSVB DAC 0 SAVE WB
5741: PRSVC DAC 0 SAVE CHAR COUNTER
5742: *
5743: * WORK AREA FOR PRTNL
5744: *
5745: PRTSA DAC 0 SAVE WA
5746: PRTSB DAC 0 SAVE WB
5747: *
5748: * WORK AREA FOR PRTVL
5749: *
5750: PRVSI DAC 0 SAVE IDVAL
5751: *
5752: * WORK AREAS FOR PATTERN MATCH ROUTINES
5753: *
5754: PSAVE DAC 0 TEMPORARY SAVE FOR CURRENT NODE PTR
5755: PSAVC DAC 0 SAVE CURSOR IN P$SPN, P$STR
5756: EJC
5757: *
5758: * AMOUNT OF MEMORY RESERVED FOR END OF EXECUTION
5759: *
5760: RSMEM DAC 0 RESERVE MEMORY
5761: *
5762: * WORK AREAS FOR RETRN ROUTINE
5763: *
5764: RTNBP DAC 0 TO SAVE A BLOCK POINTER
5765: RTNFV DAC 0 NEW FUNCTION VALUE (RESULT)
5766: RTNSV DAC 0 OLD FUNCTION VALUE (SAVED VALUE)
5767: *
5768: * RELOCATABLE GLOBAL VALUES
5769: *
5770: * ALL THE POINTERS IN THIS SECTION CAN POINT TO BLOCKS IN
5771: * THE DYNAMIC STORAGE AREA AND MUST BE RELOCATED BY THE
5772: * GARBAGE COLLECTOR. THEY ARE IDENTIFIED BY R$XXX NAMES.
5773: *
5774: R$AAA DAC 0 START OF RELOCATABLE VALUES
5775: R$ARF DAC 0 ARRAY BLOCK POINTER FOR ARREF
5776: R$CCB DAC 0 PTR TO CCBLK BEING BUILT (CDWRD)
5777: R$CIM DAC 0 PTR TO CURRENT COMPILER INPUT STR
5778: R$CMP DAC 0 COPY OF R$CIM USED IN CMPIL
5779: R$CNI DAC 0 PTR TO NEXT COMPILER INPUT STRING
5780: R$CNT DAC 0 CDBLK POINTER FOR SETEXIT CONTINUE
5781: R$COD DAC 0 POINTER TO CURRENT CDBLK OR EXBLK
5782: R$CTP DAC 0 PTR TO CURRENT CTBLK FOR PATST
5783: R$ERT DAC 0 TRBLK POINTER FOR ERRTYPE TRACE
5784: R$ETX DAC NULLS POINTER TO ERRTEXT STRING
5785: R$EXS DAC 0 = SAVE XL IN EXPDM
5786: R$FCB DAC 0 FCBLK CHAIN HEAD
5787: R$FNC DAC 0 TRBLK POINTER FOR FNCLEVEL TRACE
5788: R$GTC DAC 0 KEEP CODE PTR FOR GTCOD,GTEXP
5789: R$IO1 DAC 0 FILE ARG1 FOR IOPUT
5790: R$IO2 DAC 0 FILE ARG2 FOR IOPUT
5791: R$IOF DAC 0 FCBLK PTR OR 0
5792: R$ION DAC 0 NAME BASE PTR
5793: R$IOP DAC 0 PREDECESSOR BLOCK PTR FOR IOPUT
5794: R$IOT DAC 0 TRBLK PTR FOR IOPUT
5795: R$PMB DAC 0 BUFFER PTR IN PATTERN MATCH
5796: R$PMS DAC 0 SUBJECT STRING PTR IN PATTERN MATCH
5797: R$RA2 DAC 0 REPLACE SECOND ARGUMENT LAST TIME
5798: R$RA3 DAC 0 REPLACE THIRD ARGUMENT LAST TIME
5799: R$RPT DAC 0 PTR TO CTBLK REPLACE TABLE LAST USD
5800: R$SCP DAC 0 SAVE POINTER FROM LAST SCANE CALL
5801: R$SXL DAC 0 PRESERVE XL IN SORTC
5802: R$SXR DAC 0 PRESERVE XR IN SORTA/SORTC
5803: R$STC DAC 0 TRBLK POINTER FOR STCOUNT TRACE
5804: R$STL DAC 0 SOURCE LISTING SUB-TITLE
5805: R$SXC DAC 0 CODE (CDBLK) PTR FOR SETEXIT TRAP
5806: R$TTL DAC NULLS SOURCE LISTING TITLE
5807: R$XSC DAC 0 STRING POINTER FOR XSCAN
5808: EJC
5809: *
5810: * THE REMAINING POINTERS IN THIS LIST ARE USED TO POINT
5811: * TO FUNCTION BLOCKS FOR NORMALLY UNDEFINED OPERATORS.
5812: *
5813: R$UBA DAC STNDO BINARY AT
5814: R$UBM DAC STNDO BINARY AMPERSAND
5815: R$UBN DAC STNDO BINARY NUMBER SIGN
5816: R$UBP DAC STNDO BINARY PERCENT
5817: R$UBT DAC STNDO BINARY NOT
5818: R$UUB DAC STNDO UNARY VERTICAL BAR
5819: R$UUE DAC STNDO UNARY EQUAL
5820: R$UUN DAC STNDO UNARY NUMBER SIGN
5821: R$UUP DAC STNDO UNARY PERCENT
5822: R$UUS DAC STNDO UNARY SLASH
5823: R$UUX DAC STNDO UNARY EXCLAMATION
5824: R$YYY DAC 0 LAST RELOCATABLE LOCATION
5825: *
5826: * WORK AREAS FOR SUBSTR FUNCTION (S$SUB)
5827: *
5828: SBSSV DAC 0 SAVE THIRD ARGUMENT
5829: *
5830: * GLOBAL LOCATIONS USED IN SCAN PROCEDURE
5831: *
5832: SCNBL DAC 0 SET NON-ZERO IF SCANNED PAST BLANKS
5833: SCNCC DAC 0 NON-ZERO TO SCAN CONTROL CARD NAME
5834: SCNGO DAC 0 SET NON-ZERO TO SCAN GOTO FIELD
5835: SCNIL DAC 0 LENGTH OF CURRENT INPUT IMAGE
5836: SCNPT DAC 0 POINTER TO NEXT LOCATION IN R$CIM
5837: SCNRS DAC 0 SET NON-ZERO TO SIGNAL RESCAN
5838: SCNTP DAC 0 SAVE SYNTAX TYPE FROM LAST CALL
5839: *
5840: * WORK AREAS FOR SCAN PROCEDURE
5841: *
5842: SCNSA DAC 0 SAVE WA
5843: SCNSB DAC 0 SAVE WB
5844: SCNSC DAC 0 SAVE WC
5845: SCNSE DAC 0 START OF CURRENT ELEMENT
5846: SCNOF DAC 0 SAVE OFFSET
5847: EJC
5848: *
5849: * WORK AREA USED BY SORTA, SORTC, SORTF, SORTH
5850: *
5851: SRTDF DAC 0 DATATYPE FIELD NAME
5852: SRTFD DAC 0 FOUND DFBLK ADDRESS
5853: SRTFF DAC 0 FOUND FIELD NAME
5854: SRTFO DAC 0 OFFSET TO FIELD NAME
5855: SRTNR DAC 0 NUMBER OF ROWS
5856: SRTOF DAC 0 OFFSET WITHIN ROW TO SORT KEY
5857: SRTRT DAC 0 ROOT OFFSET
5858: SRTS1 DAC 0 SAVE OFFSET 1
5859: SRTS2 DAC 0 SAVE OFFSET 2
5860: SRTSC DAC 0 SAVE WC
5861: SRTSF DAC 0 SORT ARRAY FIRST ROW OFFSET
5862: SRTSN DAC 0 SAVE N
5863: SRTSO DAC 0 OFFSET TO A(0)
5864: SRTSR DAC 0 0 , NON-ZERO FOR SORT, RSORT
5865: SRTST DAC 0 STRIDE FROM ONE ROW TO NEXT
5866: SRTWC DAC 0 DUMP WC
5867: *
5868: * GLOBAL VALUE FOR INDICATING STAGE (SEE ERROR SECTION)
5869: *
5870: STAGE DAC 0 INITIAL VALUE = INITIAL COMPILE
5871: *
5872: * GLOBAL VALUES DEFINING EXTENT OF STATIC AREA (ALOST)
5873: *
5874: STATB DAC 0 START OF STATIC AREA
5875: STATE DAC 0 END OF STATIC AREA
5876: EJC
5877: *
5878: * GLOBAL STACK POINTER
5879: *
5880: STBAS DAC 0 POINTER PAST STACK BASE
5881: *
5882: * WORK AREAS FOR STOPR ROUTINE
5883: *
5884: STPSI DIC +0 SAVE VALUE OF STCOUNT
5885: STPTI DIC +0 SAVE TIME ELAPSED
5886: *
5887: * GLOBAL VALUES FOR SETEXIT FUNCTION (S$STX)
5888: *
5889: STXOF DAC 0 FAILURE OFFSET
5890: STXVR DAC NULLS VRBLK POINTER OR NULL
5891: *
5892: * WORK AREAS FOR TFIND PROCEDURE
5893: *
5894: TFNSI DIC +0 NUMBER OF HEADERS
5895: *
5896: * GLOBAL VALUE FOR TIME KEEPING
5897: *
5898: TIMSX DIC +0 TIME AT START OF EXECUTION
5899: TIMUP DAC 0 SET WHEN TIME UP OCCURS
5900: *
5901: * WORK AREAS FOR XSCAN PROCEDURE
5902: *
5903: XSCRT DAC 0 SAVE RETURN CODE
5904: XSCWB DAC 0 SAVE REGISTER WB
5905: *
5906: * GLOBAL VALUES FOR XSCAN AND XSCNI PROCEDURES
5907: *
5908: XSOFS DAC 0 OFFSET TO CURRENT LOCATION IN R$XSC
5909: *
5910: * LABEL TO MARK END OF WORK AREA
5911: *
5912: YYYYY DAC 0
5913: TTL S P I T B O L -- INITIALIZATION
5914: *
5915: * INITIALISATION
5916: * THE FOLLOWING SECTION RECEIVES CONTROL FROM THE SYSTEM
5917: * AT THE START OF A RUN WITH THE REGISTERS SET AS FOLLOWS.
5918: *
5919: * (XS) POINTS PAST STACK BASE
5920: * (XR) POINTS TO FIRST WORD OF DATA AREA
5921: * (XL) POINTS TO LAST WORD OF DATA AREA
5922: *
5923: SEC START OF PROGRAM SECTION
5924: JSR SYSTM INITIALISE TIMER
5925: *
5926: * INITIALISE WORK AREA (ESSENTIAL FOR BATCHED RUNS)
5927: *
5928: MOV XR,WB PRESERVE XR
5929: MOV =YYYYY,WA POINT TO END OF WORK AREA
5930: SUB =AAAAA,WA GET LENGTH OF WORK AREA
5931: BTW WA CONVERT TO WORDS
5932: LCT WA,WA COUNT FOR LOOP
5933: MOV =AAAAA,XR SET UP INDEX REGISTER
5934: *
5935: * CLEAR WORK SPACE
5936: *
5937: INI01 ZER (XR)+ CLEAR A WORD
5938: BCT WA,INI01 LOOP TILL DONE
5939: MOV =STNDO,WA UNDEFINED OPERATORS POINTER
5940: MOV =R$YYY,WC POINT TO TABLE END
5941: SUB =R$UBA,WC LENGTH OF UNDEF. OPERATORS TABLE
5942: BTW WC CONVERT TO WORDS
5943: LCT WC,WC LOOP COUNTER
5944: MOV =R$UBA,XR SET UP XR
5945: *
5946: * SET CORRECT VALUE INTO UNDEFINED OPERATORS TABLE
5947: *
5948: INI02 MOV WA,(XR)+ STORE VALUE
5949: BCT WC,INI02 LOOP TILL ALL DONE
5950: MOV =NUM01,WA GET A 1
5951: MOV WA,CMPSN STATEMENT NO
5952: MOV WA,CSWFL NOFAIL
5953: MOV WA,CSWLS LIST
5954: MOV WA,KVINP INPUT
5955: MOV WA,KVOUP OUTPUT
5956: MOV WA,LSTPF NOTHING FOR LISTR YET
5957: MOV =INILN,WA INPUT IMAGE LENGTH
5958: MOV WA,CSWIN -IN72
5959: MOV =B$KVT,DMPKB DUMP
5960: MOV =TRBKV,DMPKT DUMP
5961: MOV =P$LEN,EVLIN EVAL
5962: EJC
5963: MOV =NULLS,WA GET NULLSTRING POINTER
5964: MOV WA,KVRTN RETURN
5965: MOV WA,R$ETX ERRTEXT
5966: MOV WA,R$TTL TITLE FOR LISTING
5967: MOV WA,STXVR SETEXIT
5968: STI TIMSX STORE TIME IN CORRECT PLACE
5969: LDI STLIM GET DEFAULT STLIMIT
5970: STI KVSTL STATEMENT LIMIT
5971: STI KVSTC STATEMENT COUNT
5972: MOV WB,STATB STORE START ADRS OF STATIC
5973: MOV *E$SRS,RSMEM RESERVE MEMORY
5974: MOV XS,STBAS STORE STACK BASE
5975: SSS INISS SAVE S-R STACK PTR
5976: *
5977: * NOW CONVERT FREE STORE PERCENTAGE TO A SUITABLE FACTOR
5978: * FOR EASY TESTING IN ALLOC ROUTINE.
5979: *
5980: LDI INTVH GET 100
5981: DVI ALFSP FORM 100 / ALFSP
5982: STI ALFSF STORE THE FACTOR
5983: *
5984: * INITIALIZE VALUES FOR REAL CONVERSION ROUTINE
5985: *
5986: LCT WB,=CFP$S LOAD COUNTER FOR SIGNIFICANT DIGITS
5987: LDR REAV1 LOAD 1.0
5988: *
5989: * LOOP TO COMPUTE 10**(MAX NUMBER SIGNIFICANT DIGITS)
5990: *
5991: INI03 MLR REAVT * 10.0
5992: BCT WB,INI03 LOOP TILL DONE
5993: STR GTSSC STORE 10**(MAX SIG DIGITS)
5994: LDR REAP5 LOAD 0.5
5995: DVR GTSSC COMPUTE 0.5*10**(MAX SIG DIGITS)
5996: STR GTSRN STORE AS ROUNDING BIAS
5997: ZER WC SET TO READ PARAMETERS
5998: JSR PRPAR READ THEM
5999: EJC
6000: *
6001: * NOW COMPUTE STARTING ADDRESS FOR DYNAMIC STORE AND IF
6002: * NECESSARY REQUEST MORE MEMORY.
6003: *
6004: SUB *E$SRS,XL ALLOW FOR RESERVE MEMORY
6005: MOV PRLEN,WA GET PRINT BUFFER LENGTH
6006: ADD =CFP$A,WA ADD NO. OF CHARS IN ALPHABET
6007: ADD =NSTMX,WA ADD CHARS FOR GTSTG BFR
6008: CTB WA,8 CONVERT TO BYTES, ALLOWING A MARGIN
6009: MOV STATB,XR POINT TO STATIC BASE
6010: ADD WA,XR INCREMENT FOR ABOVE BUFFERS
6011: ADD *E$HNB,XR INCREMENT FOR HASH TABLE
6012: ADD *E$STS,XR BUMP FOR INITIAL STATIC BLOCK
6013: JSR SYSMX GET MXLEN
6014: MOV WA,KVMXL PROVISIONALLY STORE AS MAXLNGTH
6015: MOV WA,MXLEN AND AS MXLEN
6016: BGT XR,WA,INI06 SKIP IF STATIC HI EXCEEDS MXLEN
6017: MOV WA,XR USE MXLEN INSTEAD
6018: ICA XR MAKE BIGGER THAN MXLEN
6019: *
6020: * HERE TO STORE VALUES WHICH MARK INITIAL DIVISION
6021: * OF DATA AREA INTO STATIC AND DYNAMIC
6022: *
6023: INI06 MOV XR,DNAMB DYNAMIC BASE ADRS
6024: MOV XR,DNAMP DYNAMIC PTR
6025: BNZ WA,INI07 SKIP IF NON-ZERO MXLEN
6026: DCA XR POINT A WORD IN FRONT
6027: MOV XR,KVMXL USE AS MAXLNGTH
6028: MOV XR,MXLEN AND AS MXLEN
6029: EJC
6030: *
6031: * LOOP HERE IF NECESSARY TILL ENOUGH MEMORY OBTAINED
6032: * SO THAT DNAME IS ABOVE DNAMB
6033: *
6034: INI07 MOV XL,DNAME STORE DYNAMIC END ADDRESS
6035: BLT DNAMB,XL,INI09 SKIP IF HIGH ENOUGH
6036: JSR SYSMM REQUEST MORE MEMORY
6037: WTB XR GET AS BAUS (SGD05)
6038: ADD XR,XL BUMP BY AMOUNT OBTAINED
6039: BNZ XR,INI07 TRY AGAIN
6040: MOV =ENDMO,XR POINT TO FAILURE MESSAGE
6041: MOV ENDML,WA MESSAGE LENGTH
6042: JSR SYSPR PRINT IT (PRTST NOT YET USABLE)
6043: PPM SHOULD NOT FAIL
6044: JSR SYSEJ PACK UP (STOPR NOT YET USABLE)
6045: *
6046: * INITIALISE PRINT BUFFER WITH BLANK WORDS
6047: *
6048: INI09 MOV PRLEN,WC NO. OF CHARS IN PRINT BFR
6049: MOV STATB,XR POINT TO STATIC AGAIN
6050: MOV XR,PRBUF PRINT BFR IS PUT AT STATIC START
6051: MOV =B$SCL,(XR)+ STORE STRING TYPE CODE
6052: MOV WC,(XR)+ AND STRING LENGTH
6053: CTW WC,0 GET NUMBER OF WORDS IN BUFFER
6054: MOV WC,PRLNW STORE FOR BUFFER CLEAR
6055: LCT WC,WC WORDS TO CLEAR
6056: *
6057: * LOOP TO CLEAR BUFFER
6058: *
6059: INI10 MOV NULLW,(XR)+ STORE BLANK
6060: BCT WC,INI10 LOOP
6061: *
6062: * INITIALIZE NUMBER OF HASH HEADERS
6063: *
6064: MOV =E$HNB,WA GET NUMBER OF HASH HEADERS
6065: MTI WA CONVERT TO INTEGER
6066: STI HSHNB STORE FOR USE BY GTNVR PROCEDURE
6067: LCT WA,WA COUNTER FOR CLEARING HASH TABLE
6068: MOV XR,HSHTB POINTER TO HASH TABLE
6069: *
6070: * LOOP TO CLEAR HASH TABLE
6071: *
6072: INI11 ZER (XR)+ BLANK A WORD
6073: BCT WA,INI11 LOOP
6074: MOV XR,HSHTE END OF HASH TABLE ADRS IS KEPT
6075: *
6076: * ALLOCATE WORK AREA FOR GTSTG CONVERSION PROCEDURE
6077: *
6078: MOV =NSTMX,WA GET MAX NUM CHARS IN OUTPUT NUMBER
6079: CTB WA,SCSI$ NO OF BYTES NEEDED
6080: MOV XR,GTSWK STORE BFR ADRS
6081: ADD WA,XR BUMP FOR WORK BFR
6082: EJC
6083: *
6084: * BUILD ALPHABET STRING FOR ALPHABET KEYWORD AND REPLACE
6085: *
6086: MOV XR,KVALP SAVE ALPHABET POINTER
6087: MOV =B$SCL,(XR) STRING BLK TYPE
6088: MOV =CFP$A,WC NO OF CHARS IN ALPHABET
6089: MOV WC,SCLEN(XR) STORE AS STRING LENGTH
6090: MOV WC,WB COPY CHAR COUNT
6091: CTB WB,SCSI$ NO. OF BYTES NEEDED
6092: ADD XR,WB CURRENT END ADDRESS FOR STATIC
6093: MOV WB,STATE STORE STATIC END ADRS
6094: LCT WC,WC LOOP COUNTER
6095: PSC XR POINT TO CHARS OF STRING
6096: ZER WB SET INITIAL CHARACTER VALUE
6097: *
6098: * LOOP TO ENTER CHARACTER CODES IN ORDER
6099: *
6100: INI12 SCH WB,(XR)+ STORE NEXT CODE
6101: ICV WB BUMP CODE VALUE
6102: BCT WC,INI12 LOOP TILL ALL STORED
6103: CSC XR COMPLETE STORE CHARACTERS
6104: *
6105: * INITIALIZE VARIABLE BLOCKS FOR INPUT AND OUTPUT
6106: *
6107: MOV =V$INP,XL POINT TO STRING /INPUT/
6108: MOV =TRTIN,WB TRBLK TYPE FOR INPUT
6109: JSR INOUT PERFORM INPUT ASSOCIATION
6110: MOV =V$OUP,XL POINT TO STRING /OUTPUT/
6111: MOV =TRTOU,WB TRBLK TYPE FOR OUTPUT
6112: JSR INOUT PERFORM OUTPUT ASSOCIATION
6113: MOV INITR,WC TERMINAL FLAG
6114: BZE WC,INI13 SKIP IF NO TERMINAL
6115: JSR PRPAR ASSOCIATE TERMINAL
6116: EJC
6117: *
6118: * CHECK FOR EXPIRY DATE
6119: *
6120: INI13 JSR SYSDC CALL DATE CHECK
6121: MOV XS,FLPTR IN CASE STACK OVERFLOWS IN COMPILER
6122: *
6123: * NOW COMPILE SOURCE INPUT CODE
6124: *
6125: JSR CMPIL CALL COMPILER
6126: MOV XR,R$COD SET PTR TO FIRST CODE BLOCK
6127: MOV =NULLS,R$TTL FORGET TITLE (REG04)
6128: MOV =NULLS,R$STL FORGET SUB-TITLE (REG04)
6129: ZER R$CIM FORGET COMPILER INPUT IMAGE
6130: ZER XL CLEAR DUD VALUE
6131: ZER WB DONT SHIFT DYNAMIC STORE UP
6132: JSR GBCOL CLEAR GARBAGE LEFT FROM COMPILE
6133: BNZ CPSTS,INIX0 SKIP IF NO LISTING OF COMP STATS
6134: JSR PRTPG EJECT PAGE
6135: *
6136: * PRINT COMPILE STATISTICS
6137: *
6138: MOV DNAMP,WA NEXT AVAILABLE LOC
6139: SUB STATB,WA MINUS START
6140: BTW WA CONVERT TO WORDS
6141: MTI WA CONVERT TO INTEGER
6142: MOV =ENCM1,XR POINT TO /MEMORY USED (WORDS)/
6143: JSR PRTMI PRINT MESSAGE
6144: MOV DNAME,WA END OF MEMORY
6145: SUB DNAMP,WA MINUS NEXT AVAILABLE LOC
6146: BTW WA CONVERT TO WORDS
6147: MTI WA CONVERT TO INTEGER
6148: MOV =ENCM2,XR POINT TO /MEMORY AVAILABLE (WORDS)/
6149: JSR PRTMI PRINT LINE
6150: MTI CMERC GET COUNT OF ERRORS AS INTEGER
6151: MOV =ENCM3,XR POINT TO /COMPILE ERRORS/
6152: JSR PRTMI PRINT IT
6153: MTI GBCNT GARBAGE COLLECTION COUNT
6154: SBI INTV1 ADJUST FOR UNAVOIDABLE COLLECT
6155: MOV =STPM5,XR POINT TO /STORAGE REGENERATIONS/
6156: JSR PRTMI PRINT GBCOL COUNT
6157: JSR SYSTM GET TIME
6158: SBI TIMSX GET COMPILATION TIME
6159: MOV =ENCM4,XR POINT TO COMPILATION TIME (MSEC)/
6160: JSR PRTMI PRINT MESSAGE
6161: ADD =NUM05,LSTLC BUMP LINE COUNT
6162: BZE HEADP,INIX0 NO EJECT IF NOTHING PRINTED (SDG11)
6163: JSR PRTPG EJECT PRINTER
6164: EJC
6165: *
6166: * PREPARE NOW TO START EXECUTION
6167: *
6168: * SET DEFAULT INPUT RECORD LENGTH
6169: *
6170: INIX0 BGT CSWIN,=INILN,INIX1 SKIP IF NOT DEFAULT -IN72 USED
6171: MOV =INILS,CSWIN ELSE USE DEFAULT RECORD LENGTH
6172: *
6173: * RESET TIMER
6174: *
6175: INIX1 JSR SYSTM GET TIME AGAIN
6176: STI TIMSX STORE FOR END RUN PROCESSING
6177: ADD CSWEX,NOXEQ ADD -NOEXECUTE FLAG
6178: BNZ NOXEQ,INIX2 JUMP IF EXECUTION SUPPRESSED
6179: ZER GBCNT INITIALISE COLLECT COUNT
6180: JSR SYSBX CALL BEFORE STARTING EXECUTION
6181: *
6182: * MERGE WHEN LISTING FILE SET FOR EXECUTION
6183: *
6184: INIY0 MNZ HEADP MARK HEADERS OUT REGARDLESS
6185: ZER -(XS) SET FAILURE LOCATION ON STACK
6186: MOV XS,FLPTR SAVE PTR TO FAILURE OFFSET WORD
6187: MOV R$COD,XR LOAD PTR TO ENTRY CODE BLOCK
6188: MOV =STGXT,STAGE SET STAGE FOR EXECUTE TIME
6189: MOV CMPSN,PFNTE COPY STMTS COMPILED COUNT IN CASE
6190: JSR SYSTM TIME YET AGAIN
6191: STI PFSTM
6192: BRI (XR) START XEQ WITH FIRST STATEMENT
6193: *
6194: * HERE IF EXECUTION IS SUPPRESSED
6195: *
6196: INIX2 JSR PRTNL PRINT A BLANK LINE
6197: MOV =ENCM5,XR POINT TO /EXECUTION SUPPRESSED/
6198: JSR PRTST PRINT STRING
6199: JSR PRTNL OUTPUT LINE
6200: ZER WA SET ABEND VALUE TO ZERO
6201: MOV =NINI9,WB SET SPECIAL CODE VALUE
6202: JSR SYSEJ END OF JOB, EXIT TO SYSTEM
6203: TTL S P I T B O L -- SNOBOL4 OPERATOR ROUTINES
6204: *
6205: * THIS SECTION INCLUDES ALL ROUTINES WHICH CAN BE ACCESSED
6206: * DIRECTLY FROM THE GENERATED CODE EXCEPT SYSTEM FUNCTIONS.
6207: *
6208: * ALL ROUTINES IN THIS SECTION START WITH A LABEL OF THE
6209: * FORM O$XXX WHERE XXX IS THREE LETTERS. THE GENERATED CODE
6210: * CONTAINS A POINTER TO THE APPROPRIATE ENTRY LABEL.
6211: *
6212: * SINCE THE GENERAL FORM OF THE GENERATED CODE CONSISTS OF
6213: * POINTERS TO BLOCKS WHOSE FIRST WORD IS THE ADDRESS OF THE
6214: * ACTUAL ENTRY POINT LABEL (O$XXX).
6215: *
6216: * THESE ROUTINES ARE IN ALPHABETICAL ORDER BY THEIR
6217: * ENTRY LABEL NAMES (I.E. BY THE XXX OF THE O$XXX NAME)
6218: *
6219: * THESE ROUTINES RECEIVE CONTROL AS FOLLOWS
6220: *
6221: * (CP) POINTER TO NEXT CODE WORD
6222: * (XS) CURRENT STACK POINTER
6223: EJC
6224: *
6225: * BINARY PLUS (ADDITION)
6226: *
6227: O$ADD ENT ENTRY POINT
6228: JSR ARITH FETCH ARITHMETIC OPERANDS
6229: ERR 001,ADDITION LEFT OPERAND IS NOT NUMERIC
6230: ERR 002,ADDITION RIGHT OPERAND IS NOT NUMERIC
6231: PPM OADD1 JUMP IF REAL OPERANDS
6232: *
6233: * HERE TO ADD TWO INTEGERS
6234: *
6235: ADI ICVAL(XL) ADD RIGHT OPERAND TO LEFT
6236: INO EXINT RETURN INTEGER IF NO OVERFLOW
6237: ERB 003,ADDITION CAUSED INTEGER OVERFLOW
6238: *
6239: * HERE TO ADD TWO REALS
6240: *
6241: OADD1 ADR RCVAL(XL) ADD RIGHT OPERAND TO LEFT
6242: RNO EXREA RETURN REAL IF NO OVERFLOW
6243: ERB 261,ADDITION CAUSED REAL OVERFLOW
6244: EJC
6245: *
6246: * UNARY PLUS (AFFIRMATION)
6247: *
6248: O$AFF ENT ENTRY POINT
6249: MOV (XS)+,XR LOAD OPERAND
6250: JSR GTNUM CONVERT TO NUMERIC
6251: ERR 004,AFFIRMATION OPERAND IS NOT NUMERIC
6252: BRN EXIXR RETURN IF CONVERTED TO NUMERIC
6253: EJC
6254: *
6255: * BINARY BAR (ALTERNATION)
6256: *
6257: O$ALT ENT ENTRY POINT
6258: MOV (XS)+,XR LOAD RIGHT OPERAND
6259: JSR GTPAT CONVERT TO PATTERN
6260: ERR 005,ALTERNATION RIGHT OPERAND IS NOT PATTERN
6261: *
6262: * MERGE HERE FROM SPECIAL (LEFT ALTERNATION) CASE
6263: *
6264: OALT1 MOV =P$ALT,WB SET PCODE FOR ALTERNATIVE NODE
6265: JSR PBILD BUILD ALTERNATIVE NODE
6266: MOV XR,XL SAVE ADDRESS OF ALTERNATIVE NODE
6267: MOV (XS)+,XR LOAD LEFT OPERAND
6268: JSR GTPAT CONVERT TO PATTERN
6269: ERR 006,ALTERNATION LEFT OPERAND IS NOT PATTERN
6270: BEQ XR,=P$ALT,OALT2 JUMP IF LEFT ARG IS ALTERNATION
6271: MOV XR,PTHEN(XL) SET LEFT OPERAND AS SUCCESSOR
6272: MOV XL,XR MOVE RESULT TO PROPER REGISTER
6273: BRN EXIXR JUMP FOR NEXT CODE WORD
6274: *
6275: * COME HERE IF LEFT ARGUMENT IS ITSELF AN ALTERNATION
6276: *
6277: * THE RESULT IS MORE EFFICIENT IF WE MAKE THE REPLACEMENT
6278: *
6279: * (A / B) / C = A / (B / C)
6280: *
6281: OALT2 MOV PARM1(XR),PTHEN(XL) BUILD THE (B / C) NODE
6282: MOV PTHEN(XR),-(XS) SET A AS NEW LEFT ARG
6283: MOV XL,XR SET (B / C) AS NEW RIGHT ARG
6284: BRN OALT1 MERGE BACK TO BUILD A / (B / C)
6285: EJC
6286: *
6287: * ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY NAME)
6288: *
6289: O$AMN ENT ENTRY POINT
6290: LCW XR LOAD NUMBER OF SUBSCRIPTS
6291: MOV XR,WB SET FLAG FOR BY NAME
6292: BRN ARREF JUMP TO ARRAY REFERENCE ROUTINE
6293: EJC
6294: *
6295: * ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY VALUE)
6296: *
6297: O$AMV ENT ENTRY POINT
6298: LCW XR LOAD NUMBER OF SUBSCRIPTS
6299: ZER WB SET FLAG FOR BY VALUE
6300: BRN ARREF JUMP TO ARRAY REFERENCE ROUTINE
6301: EJC
6302: *
6303: * ARRAY REFERENCE (ONE SUBSCRIPT, BY NAME)
6304: *
6305: O$AON ENT ENTRY POINT
6306: MOV (XS),XR LOAD SUBSCRIPT VALUE
6307: MOV 1(XS),XL LOAD ARRAY VALUE
6308: MOV (XL),WA LOAD FIRST WORD OF ARRAY OPERAND
6309: BEQ WA,=B$VCT,OAON2 JUMP IF VECTOR REFERENCE
6310: BEQ WA,=B$TBT,OAON3 JUMP IF TABLE REFERENCE
6311: *
6312: * HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE
6313: *
6314: OAON1 MOV =NUM01,XR SET NUMBER OF SUBSCRIPTS TO ONE
6315: MOV XR,WB SET FLAG FOR BY NAME
6316: BRN ARREF JUMP TO ARRAY REFERENCE ROUTINE
6317: *
6318: * HERE IF WE HAVE A VECTOR REFERENCE
6319: *
6320: OAON2 BNE (XR),=B$ICL,OAON1 USE LONG ROUTINE IF NOT INTEGER
6321: LDI ICVAL(XR) LOAD INTEGER SUBSCRIPT VALUE
6322: MFI WA,EXFAL COPY AS ADDRESS INT, FAIL IF OVFLO
6323: BZE WA,EXFAL FAIL IF ZERO
6324: ADD =VCVLB,WA COMPUTE OFFSET IN WORDS
6325: WTB WA CONVERT TO BYTES
6326: MOV WA,(XS) COMPLETE NAME ON STACK
6327: BLT WA,VCLEN(XL),EXITS EXIT IF SUBSCRIPT NOT TOO LARGE
6328: BRN EXFAL ELSE FAIL
6329: *
6330: * HERE FOR TABLE REFERENCE
6331: *
6332: OAON3 MNZ WB SET FLAG FOR NAME REFERENCE
6333: JSR TFIND LOCATE/CREATE TABLE ELEMENT
6334: PPM EXFAL FAIL IF ACCESS FAILS
6335: MOV XL,1(XS) STORE NAME BASE ON STACK
6336: MOV WA,(XS) STORE NAME OFFSET ON STACK
6337: BRN EXITS EXIT WITH RESULT ON STACK
6338: EJC
6339: *
6340: * ARRAY REFERENCE (ONE SUBSCRIPT, BY VALUE)
6341: *
6342: O$AOV ENT ENTRY POINT
6343: MOV (XS)+,XR LOAD SUBSCRIPT VALUE
6344: MOV (XS)+,XL LOAD ARRAY VALUE
6345: MOV (XL),WA LOAD FIRST WORD OF ARRAY OPERAND
6346: BEQ WA,=B$VCT,OAOV2 JUMP IF VECTOR REFERENCE
6347: BEQ WA,=B$TBT,OAOV3 JUMP IF TABLE REFERENCE
6348: *
6349: * HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE
6350: *
6351: OAOV1 MOV XL,-(XS) RESTACK ARRAY VALUE
6352: MOV XR,-(XS) RESTACK SUBSCRIPT
6353: MOV =NUM01,XR SET NUMBER OF SUBSCRIPTS TO ONE
6354: ZER WB SET FLAG FOR VALUE CALL
6355: BRN ARREF JUMP TO ARRAY REFERENCE ROUTINE
6356: *
6357: * HERE IF WE HAVE A VECTOR REFERENCE
6358: *
6359: OAOV2 BNE (XR),=B$ICL,OAOV1 USE LONG ROUTINE IF NOT INTEGER
6360: LDI ICVAL(XR) LOAD INTEGER SUBSCRIPT VALUE
6361: MFI WA,EXFAL MOVE AS ONE WORD INT, FAIL IF OVFLO
6362: BZE WA,EXFAL FAIL IF ZERO
6363: ADD =VCVLB,WA COMPUTE OFFSET IN WORDS
6364: WTB WA CONVERT TO BYTES
6365: BGE WA,VCLEN(XL),EXFAL FAIL IF SUBSCRIPT TOO LARGE
6366: JSR ACESS ACCESS VALUE
6367: PPM EXFAL FAIL IF ACCESS FAILS
6368: BRN EXIXR ELSE RETURN VALUE TO CALLER
6369: *
6370: * HERE FOR TABLE REFERENCE BY VALUE
6371: *
6372: OAOV3 ZER WB SET FLAG FOR VALUE REFERENCE
6373: JSR TFIND CALL TABLE SEARCH ROUTINE
6374: PPM EXFAL FAIL IF ACCESS FAILS
6375: BRN EXIXR EXIT WITH RESULT IN XR
6376: EJC
6377: *
6378: * ASSIGNMENT
6379: *
6380: O$ASS ENT ENTRY POINT
6381: *
6382: * O$RPL (PATTERN REPLACEMENT) MERGES HERE
6383: *
6384: OASS0 MOV (XS)+,WB LOAD VALUE TO BE ASSIGNED
6385: MOV (XS)+,WA LOAD NAME OFFSET
6386: MOV (XS),XL LOAD NAME BASE
6387: MOV WB,(XS) STORE ASSIGNED VALUE AS RESULT
6388: JSR ASIGN PERFORM ASSIGNMENT
6389: PPM EXFAL FAIL IF ASSIGNMENT FAILS
6390: BRN EXITS EXIT WITH RESULT ON STACK
6391: EJC
6392: *
6393: * COMPILATION ERROR
6394: *
6395: O$CER ENT ENTRY POINT
6396: ERB 007,COMPILATION ERROR ENCOUNTERED DURING EXECUTION
6397: EJC
6398: *
6399: * UNARY AT (CURSOR ASSIGNMENT)
6400: *
6401: O$CAS ENT ENTRY POINT
6402: MOV (XS)+,WC LOAD NAME OFFSET (PARM2)
6403: MOV (XS)+,XR LOAD NAME BASE (PARM1)
6404: MOV =P$CAS,WB SET PCODE FOR CURSOR ASSIGNMENT
6405: JSR PBILD BUILD NODE
6406: BRN EXIXR JUMP FOR NEXT CODE WORD
6407: EJC
6408: *
6409: * CONCATENATION
6410: *
6411: O$CNC ENT ENTRY POINT
6412: MOV (XS),XR LOAD RIGHT ARGUMENT
6413: BEQ XR,=NULLS,OCNC3 JUMP IF RIGHT ARG IS NULL
6414: MOV 1(XS),XL LOAD LEFT ARGUMENT
6415: BEQ XL,=NULLS,OCNC4 JUMP IF LEFT ARGUMENT IS NULL
6416: MOV =B$SCL,WA GET CONSTANT TO TEST FOR STRING
6417: BNE WA,(XL),OCNC2 JUMP IF LEFT ARG NOT A STRING
6418: BNE WA,(XR),OCNC2 JUMP IF RIGHT ARG NOT A STRING
6419: *
6420: * MERGE HERE TO CONCATENATE TWO STRINGS
6421: *
6422: OCNC1 MOV SCLEN(XL),WA LOAD LEFT ARGUMENT LENGTH
6423: ADD SCLEN(XR),WA COMPUTE RESULT LENGTH
6424: JSR ALOCS ALLOCATE SCBLK FOR RESULT
6425: MOV XR,1(XS) STORE RESULT PTR OVER LEFT ARGUMENT
6426: PSC XR PREPARE TO STORE CHARS OF RESULT
6427: MOV SCLEN(XL),WA GET NUMBER OF CHARS IN LEFT ARG
6428: PLC XL PREPARE TO LOAD LEFT ARG CHARS
6429: MVC MOVE CHARACTERS OF LEFT ARGUMENT
6430: MOV (XS)+,XL LOAD RIGHT ARG POINTER, POP STACK
6431: MOV SCLEN(XL),WA LOAD NUMBER OF CHARS IN RIGHT ARG
6432: PLC XL PREPARE TO LOAD RIGHT ARG CHARS
6433: MVC MOVE CHARACTERS OF RIGHT ARGUMENT
6434: BRN EXITS EXIT WITH RESULT ON STACK
6435: *
6436: * COME HERE IF ARGUMENTS ARE NOT BOTH STRINGS
6437: *
6438: OCNC2 JSR GTSTG CONVERT RIGHT ARG TO STRING
6439: PPM OCNC5 JUMP IF RIGHT ARG IS NOT STRING
6440: MOV XR,XL SAVE RIGHT ARG PTR
6441: JSR GTSTG CONVERT LEFT ARG TO STRING
6442: PPM OCNC6 JUMP IF LEFT ARG IS NOT A STRING
6443: MOV XR,-(XS) STACK LEFT ARGUMENT
6444: MOV XL,-(XS) STACK RIGHT ARGUMENT
6445: MOV XR,XL MOVE LEFT ARG TO PROPER REG
6446: MOV (XS),XR MOVE RIGHT ARG TO PROPER REG
6447: BRN OCNC1 MERGE BACK TO CONCATENATE STRINGS
6448: EJC
6449: *
6450: * CONCATENATION (CONTINUED)
6451: *
6452: * COME HERE FOR NULL RIGHT ARGUMENT
6453: *
6454: OCNC3 ICA XS REMOVE RIGHT ARG FROM STACK
6455: BRN EXITS RETURN WITH LEFT ARGUMENT ON STACK
6456: *
6457: * HERE FOR NULL LEFT ARGUMENT
6458: *
6459: OCNC4 ICA XS UNSTACK ONE ARGUMENT
6460: MOV XR,(XS) STORE RIGHT ARGUMENT
6461: BRN EXITS EXIT WITH RESULT ON STACK
6462: *
6463: * HERE IF RIGHT ARGUMENT IS NOT A STRING
6464: *
6465: OCNC5 MOV XR,XL MOVE RIGHT ARGUMENT PTR
6466: MOV (XS)+,XR LOAD LEFT ARG POINTER
6467: *
6468: * MERGE HERE WHEN LEFT ARGUMENT IS NOT A STRING
6469: *
6470: OCNC6 JSR GTPAT CONVERT LEFT ARG TO PATTERN
6471: ERR 008,CONCATENATION LEFT OPND IS NOT STRING OR PATTERN
6472: MOV XR,-(XS) SAVE RESULT ON STACK
6473: MOV XL,XR POINT TO RIGHT OPERAND
6474: JSR GTPAT CONVERT TO PATTERN
6475: ERR 009,CONCATENATION RIGHT OPD IS NOT STRING OR PATTERN
6476: MOV XR,XL MOVE FOR PCONC
6477: MOV (XS)+,XR RELOAD LEFT OPERAND PTR
6478: JSR PCONC CONCATENATE PATTERNS
6479: BRN EXIXR EXIT WITH RESULT IN XR
6480: EJC
6481: *
6482: * COMPLEMENTATION
6483: *
6484: O$COM ENT ENTRY POINT
6485: MOV (XS)+,XR LOAD OPERAND
6486: MOV (XR),WA LOAD TYPE WORD
6487: *
6488: * MERGE BACK HERE AFTER CONVERSION
6489: *
6490: OCOM1 BEQ WA,=B$ICL,OCOM2 JUMP IF INTEGER
6491: BEQ WA,=B$RCL,OCOM3 JUMP IF REAL
6492: JSR GTNUM ELSE CONVERT TO NUMERIC
6493: ERR 010,COMPLEMENTATION OPERAND IS NOT NUMERIC
6494: BRN OCOM1 BACK TO CHECK CASES
6495: *
6496: * HERE TO COMPLEMENT INTEGER
6497: *
6498: OCOM2 LDI ICVAL(XR) LOAD INTEGER VALUE
6499: NGI NEGATE
6500: INO EXINT RETURN INTEGER IF NO OVERFLOW
6501: ERB 011,COMPLEMENTATION CAUSED INTEGER OVERFLOW
6502: *
6503: * HERE TO COMPLEMENT REAL
6504: *
6505: OCOM3 LDR RCVAL(XR) LOAD REAL VALUE
6506: NGR NEGATE
6507: BRN EXREA RETURN REAL RESULT
6508: EJC
6509: *
6510: * BINARY SLASH (DIVISION)
6511: *
6512: O$DVD ENT ENTRY POINT
6513: JSR ARITH FETCH ARITHMETIC OPERANDS
6514: ERR 012,DIVISION LEFT OPERAND IS NOT NUMERIC
6515: ERR 013,DIVISION RIGHT OPERAND IS NOT NUMERIC
6516: PPM ODVD2 JUMP IF REAL OPERANDS
6517: *
6518: * HERE TO DIVIDE TWO INTEGERS
6519: *
6520: DVI ICVAL(XL) DIVIDE LEFT OPERAND BY RIGHT
6521: INO EXINT RESULT OK IF NO OVERFLOW
6522: ERB 014,DIVISION CAUSED INTEGER OVERFLOW
6523: *
6524: * HERE TO DIVIDE TWO REALS
6525: *
6526: ODVD2 DVR RCVAL(XL) DIVIDE LEFT OPERAND BY RIGHT
6527: RNO EXREA RETURN REAL IF NO OVERFLOW
6528: ERB 262,DIVISION CAUSED REAL OVERFLOW
6529: EJC
6530: *
6531: * EXPONENTIATION
6532: *
6533: O$EXP ENT ENTRY POINT
6534: MOV (XS)+,XR LOAD EXPONENT
6535: JSR GTNUM CONVERT TO NUMBER
6536: ERR 015,EXPONENTIATION RIGHT OPERAND IS NOT NUMERIC
6537: BNE WA,=B$ICL,OEXP7 JUMP IF REAL
6538: MOV XR,XL MOVE EXPONENT
6539: MOV (XS)+,XR LOAD BASE
6540: JSR GTNUM CONVERT TO NUMERIC
6541: ERR 016,EXPONENTIATION LEFT OPERAND IS NOT NUMERIC
6542: LDI ICVAL(XL) LOAD EXPONENT
6543: ILT OEXP8 ERROR IF NEGATIVE EXPONENT
6544: BEQ WA,=B$RCL,OEXP3 JUMP IF BASE IS REAL
6545: *
6546: * HERE TO EXPONENTIATE AN INTEGER
6547: *
6548: MFI WA,OEXP2 CONVERT EXPONENT TO 1 WORD INTEGER
6549: LCT WA,WA SET LOOP COUNTER
6550: LDI INTV1 LOAD INITIAL VALUE OF 1
6551: BNZ WA,OEXP1 JUMP IF NON-ZERO EXPONENT
6552: INE EXINT GIVE ZERO AS RESULT FOR NONZERO**0
6553: BRN OEXP4 ELSE ERROR OF 0**0
6554: *
6555: * LOOP TO PERFORM EXPONENTIATION
6556: *
6557: OEXP1 MLI ICVAL(XR) MULTIPLY BY BASE
6558: IOV OEXP2 JUMP IF OVERFLOW
6559: BCT WA,OEXP1 LOOP BACK TILL COMPUTATION COMPLETE
6560: BRN EXINT THEN RETURN INTEGER RESULT
6561: *
6562: * HERE IF INTEGER OVERFLOW
6563: *
6564: OEXP2 ERB 017,EXPONENTIATION CAUSED INTEGER OVERFLOW
6565: EJC
6566: *
6567: * EXPONENTIATION (CONTINUED)
6568: *
6569: * HERE TO EXPONENTIATE A REAL
6570: *
6571: OEXP3 MFI WA,OEXP6 CONVERT EXPONENT TO ONE WORD
6572: LCT WA,WA SET LOOP COUNTER
6573: LDR REAV1 LOAD 1.0 AS INITIAL VALUE
6574: BNZ WA,OEXP5 JUMP IF NON-ZERO EXPONENT
6575: RNE EXREA RETURN 1.0 IF NONZERO**ZERO
6576: *
6577: * HERE FOR ERROR OF 0**0 OR 0.0**0
6578: *
6579: OEXP4 ERB 018,EXPONENTIATION RESULT IS UNDEFINED
6580: *
6581: * LOOP TO PERFORM EXPONENTIATION
6582: *
6583: OEXP5 MLR RCVAL(XR) MULTIPLY BY BASE
6584: ROV OEXP6 JUMP IF OVERFLOW
6585: BCT WA,OEXP5 LOOP TILL COMPUTATION COMPLETE
6586: BRN EXREA THEN RETURN REAL RESULT
6587: *
6588: * HERE IF REAL OVERFLOW
6589: *
6590: OEXP6 ERB 266,EXPONENTIATION CAUSED REAL OVERFLOW
6591: *
6592: * HERE IF REAL EXPONENT
6593: *
6594: OEXP7 ERB 267,EXPONENTIATION RIGHT OPERAND IS REAL NOT INTEGER
6595: *
6596: * HERE FOR NEGATIVE EXPONENT
6597: *
6598: OEXP8 ERB 019,EXPONENTIATION RIGHT OPERAND IS NEGATIVE
6599: EJC
6600: *
6601: * FAILURE IN EXPRESSION EVALUATION
6602: *
6603: * THIS ENTRY POINT IS USED IF THE EVALUATION OF AN
6604: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, FAILS.
6605: * CONTROL IS RETURNED TO AN APPROPRIATE POINT IN EVALX.
6606: *
6607: O$FEX ENT ENTRY POINT
6608: BRN EVLX6 JUMP TO FAILURE LOC IN EVALX
6609: EJC
6610: *
6611: * FAILURE DURING EVALUATION OF A COMPLEX OR DIRECT GOTO
6612: *
6613: O$FIF ENT ENTRY POINT
6614: ERB 020,GOTO EVALUATION FAILURE
6615: EJC
6616: *
6617: * FUNCTION CALL (MORE THAN ONE ARGUMENT)
6618: *
6619: O$FNC ENT ENTRY POINT
6620: LCW WA LOAD NUMBER OF ARGUMENTS
6621: LCW XR LOAD FUNCTION VRBLK POINTER
6622: MOV VRFNC(XR),XL LOAD FUNCTION POINTER
6623: BNE WA,FARGS(XL),CFUNC USE CENTRAL ROUTINE IF WRONG NUM
6624: BRI (XL) JUMP TO FUNCTION IF ARG COUNT OK
6625: EJC
6626: *
6627: * FUNCTION NAME ERROR
6628: *
6629: O$FNE ENT ENTRY POINT
6630: LCW WA GET NEXT CODE WORD
6631: BNE WA,=ORNM$,OFNE1 FAIL IF NOT EVALUATING EXPRESSION
6632: BZE 2(XS),EVLX3 OK IF EXPR. WAS WANTED BY VALUE
6633: *
6634: * HERE FOR ERROR
6635: *
6636: OFNE1 ERB 021,FUNCTION CALLED BY NAME RETURNED A VALUE
6637: EJC
6638: *
6639: * FUNCTION CALL (SINGLE ARGUMENT)
6640: *
6641: O$FNS ENT ENTRY POINT
6642: LCW XR LOAD FUNCTION VRBLK POINTER
6643: MOV =NUM01,WA SET NUMBER OF ARGUMENTS TO ONE
6644: MOV VRFNC(XR),XL LOAD FUNCTION POINTER
6645: BNE WA,FARGS(XL),CFUNC USE CENTRAL ROUTINE IF WRONG NUM
6646: BRI (XL) JUMP TO FUNCTION IF ARG COUNT OK
6647: EJC
6648: * CALL TO UNDEFINED FUNCTION
6649: *
6650: O$FUN ENT ENTRY POINT
6651: ERB 022,UNDEFINED FUNCTION CALLED
6652: EJC
6653: *
6654: * EXECUTE COMPLEX GOTO
6655: *
6656: O$GOC ENT ENTRY POINT
6657: MOV 1(XS),XR LOAD NAME BASE POINTER
6658: BHI XR,STATE,OGOC1 JUMP IF NOT NATURAL VARIABLE
6659: ADD *VRTRA,XR ELSE POINT TO VRTRA FIELD
6660: BRI (XR) AND JUMP THROUGH IT
6661: *
6662: * HERE IF GOTO OPERAND IS NOT NATURAL VARIABLE
6663: *
6664: OGOC1 ERB 023,GOTO OPERAND IS NOT A NATURAL VARIABLE
6665: EJC
6666: *
6667: * EXECUTE DIRECT GOTO
6668: *
6669: O$GOD ENT ENTRY POINT
6670: MOV (XS),XR LOAD OPERAND
6671: MOV (XR),WA LOAD FIRST WORD
6672: BEQ WA,=B$CDS,BCDS0 JUMP IF CODE BLOCK TO CODE ROUTINE
6673: BEQ WA,=B$CDC,BCDC0 JUMP IF CODE BLOCK TO CODE ROUTINE
6674: ERB 024,GOTO OPERAND IN DIRECT GOTO IS NOT CODE
6675: EJC
6676: *
6677: * SET GOTO FAILURE TRAP
6678: *
6679: * THIS ROUTINE IS EXECUTED AT THE START OF A COMPLEX OR
6680: * DIRECT FAILURE GOTO TO TRAP A SUBSEQUENT FAIL (SEE EXFAL)
6681: *
6682: O$GOF ENT ENTRY POINT
6683: MOV FLPTR,XR POINT TO FAIL OFFSET ON STACK
6684: ICA (XR) POINT FAILURE TO O$FIF WORD
6685: ICP POINT TO NEXT CODE WORD
6686: BRN EXITS EXIT TO CONTINUE
6687: EJC
6688: *
6689: * BINARY DOLLAR (IMMEDIATE ASSIGNMENT)
6690: *
6691: * THE PATTERN BUILT BY BINARY DOLLAR IS A COMPOUND PATTERN.
6692: * SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR
6693: * DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED.
6694: *
6695: O$IMA ENT ENTRY POINT
6696: MOV =P$IMC,WB SET PCODE FOR LAST NODE
6697: MOV (XS)+,WC POP NAME OFFSET (PARM2)
6698: MOV (XS)+,XR POP NAME BASE (PARM1)
6699: JSR PBILD BUILD P$IMC NODE
6700: MOV XR,XL SAVE PTR TO NODE
6701: MOV (XS),XR LOAD LEFT ARGUMENT
6702: JSR GTPAT CONVERT TO PATTERN
6703: ERR 025,IMMEDIATE ASSIGNMENT LEFT OPERAND IS NOT PATTERN
6704: MOV XR,(XS) SAVE PTR TO LEFT OPERAND PATTERN
6705: MOV =P$IMA,WB SET PCODE FOR FIRST NODE
6706: JSR PBILD BUILD P$IMA NODE
6707: MOV (XS)+,PTHEN(XR) SET LEFT OPERAND AS P$IMA SUCCESSOR
6708: JSR PCONC CONCATENATE TO FORM FINAL PATTERN
6709: BRN EXIXR ALL DONE
6710: EJC
6711: *
6712: * INDIRECTION (BY NAME)
6713: *
6714: O$INN ENT ENTRY POINT
6715: MNZ WB SET FLAG FOR RESULT BY NAME
6716: BRN INDIR JUMP TO COMMON ROUTINE
6717: EJC
6718: *
6719: * INTERROGATION
6720: *
6721: O$INT ENT ENTRY POINT
6722: MOV =NULLS,(XS) REPLACE OPERAND WITH NULL
6723: BRN EXITS EXIT FOR NEXT CODE WORD
6724: EJC
6725: *
6726: * INDIRECTION (BY VALUE)
6727: *
6728: O$INV ENT ENTRY POINT
6729: ZER WB SET FLAG FOR BY VALUE
6730: BRN INDIR JUMP TO COMMON ROUTINE
6731: EJC
6732: *
6733: * KEYWORD REFERENCE (BY NAME)
6734: *
6735: O$KWN ENT ENTRY POINT
6736: JSR KWNAM GET KEYWORD NAME
6737: BRN EXNAM EXIT WITH RESULT NAME
6738: EJC
6739: *
6740: * KEYWORD REFERENCE (BY VALUE)
6741: *
6742: O$KWV ENT ENTRY POINT
6743: JSR KWNAM GET KEYWORD NAME
6744: MOV XR,DNAMP DELETE KVBLK
6745: JSR ACESS ACCESS VALUE
6746: PPM EXNUL DUMMY (UNUSED) FAILURE RETURN
6747: BRN EXIXR JUMP WITH VALUE IN XR
6748: EJC
6749: *
6750: * LOAD EXPRESSION BY NAME
6751: *
6752: O$LEX ENT ENTRY POINT
6753: MOV *EVSI$,WA SET SIZE OF EVBLK
6754: JSR ALLOC ALLOCATE SPACE FOR EVBLK
6755: MOV =B$EVT,(XR) SET TYPE WORD
6756: MOV =TRBEV,EVVAR(XR) SET DUMMY TRBLK POINTER
6757: LCW WA LOAD EXBLK POINTER
6758: MOV WA,EVEXP(XR) SET EXBLK POINTER
6759: MOV XR,XL MOVE NAME BASE TO PROPER REG
6760: MOV *EVVAR,WA SET NAME OFFSET = ZERO
6761: BRN EXNAM EXIT WITH NAME IN (XL,WA)
6762: EJC
6763: *
6764: * LOAD PATTERN VALUE
6765: *
6766: O$LPT ENT ENTRY POINT
6767: LCW XR LOAD PATTERN POINTER
6768: BRN EXIXR STACK PTR AND OBEY NEXT CODE WORD
6769: EJC
6770: *
6771: * LOAD VARIABLE NAME
6772: *
6773: O$LVN ENT ENTRY POINT
6774: LCW WA LOAD VRBLK POINTER
6775: MOV WA,-(XS) STACK VRBLK PTR (NAME BASE)
6776: MOV *VRVAL,-(XS) STACK NAME OFFSET
6777: BRN EXITS EXIT WITH RESULT ON STACK
6778: EJC
6779: *
6780: * BINARY ASTERISK (MULTIPLICATION)
6781: *
6782: O$MLT ENT ENTRY POINT
6783: JSR ARITH FETCH ARITHMETIC OPERANDS
6784: ERR 026,MULTIPLICATION LEFT OPERAND IS NOT NUMERIC
6785: ERR 027,MULTIPLICATION RIGHT OPERAND IS NOT NUMERIC
6786: PPM OMLT1 JUMP IF REAL OPERANDS
6787: *
6788: * HERE TO MULTIPLY TWO INTEGERS
6789: *
6790: MLI ICVAL(XL) MULTIPLY LEFT OPERAND BY RIGHT
6791: INO EXINT RETURN INTEGER IF NO OVERFLOW
6792: ERB 028,MULTIPLICATION CAUSED INTEGER OVERFLOW
6793: *
6794: * HERE TO MULTIPLY TWO REALS
6795: *
6796: OMLT1 MLR RCVAL(XL) MULTIPLY LEFT OPERAND BY RIGHT
6797: RNO EXREA RETURN REAL IF NO OVERFLOW
6798: ERB 263,MULTIPLICATION CAUSED REAL OVERFLOW
6799: EJC
6800: *
6801: * NAME REFERENCE
6802: *
6803: O$NAM ENT ENTRY POINT
6804: MOV *NMSI$,WA SET LENGTH OF NMBLK
6805: JSR ALLOC ALLOCATE NMBLK
6806: MOV =B$NML,(XR) SET NAME BLOCK CODE
6807: MOV (XS)+,NMOFS(XR) SET NAME OFFSET FROM OPERAND
6808: MOV (XS)+,NMBAS(XR) SET NAME BASE FROM OPERAND
6809: BRN EXIXR EXIT WITH RESULT IN XR
6810: EJC
6811: *
6812: * NEGATION
6813: *
6814: * INITIAL ENTRY
6815: *
6816: O$NTA ENT ENTRY POINT
6817: LCW WA LOAD NEW FAILURE OFFSET
6818: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER
6819: MOV WA,-(XS) STACK NEW FAILURE OFFSET
6820: MOV XS,FLPTR SET NEW FAILURE POINTER
6821: BRN EXITS JUMP TO CONTINUE EXECUTION
6822: *
6823: * ENTRY AFTER SUCCESSFUL EVALUATION OF OPERAND
6824: *
6825: O$NTB ENT ENTRY POINT
6826: MOV 2(XS),FLPTR RESTORE OLD FAILURE POINTER
6827: BRN EXFAL AND FAIL
6828: *
6829: * ENTRY FOR FAILURE DURING OPERAND EVALUATION
6830: *
6831: O$NTC ENT ENTRY POINT
6832: ICA XS POP FAILURE OFFSET
6833: MOV (XS)+,FLPTR RESTORE OLD FAILURE POINTER
6834: BRN EXNUL EXIT GIVING NULL RESULT
6835: EJC
6836: *
6837: * USE OF UNDEFINED OPERATOR
6838: *
6839: O$OUN ENT ENTRY POINT
6840: ERB 029,UNDEFINED OPERATOR REFERENCED
6841: EJC
6842: *
6843: * BINARY DOT (PATTERN ASSIGNMENT)
6844: *
6845: * THE PATTERN BUILT BY BINARY DOT IS A COMPOUND PATTERN.
6846: * SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR
6847: * DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED.
6848: *
6849: O$PAS ENT ENTRY POINT
6850: MOV =P$PAC,WB LOAD PCODE FOR P$PAC NODE
6851: MOV (XS)+,WC LOAD NAME OFFSET (PARM2)
6852: MOV (XS)+,XR LOAD NAME BASE (PARM1)
6853: JSR PBILD BUILD P$PAC NODE
6854: MOV XR,XL SAVE PTR TO NODE
6855: MOV (XS),XR LOAD LEFT OPERAND
6856: JSR GTPAT CONVERT TO PATTERN
6857: ERR 030,PATTERN ASSIGNMENT LEFT OPERAND IS NOT PATTERN
6858: MOV XR,(XS) SAVE PTR TO LEFT OPERAND PATTERN
6859: MOV =P$PAA,WB SET PCODE FOR P$PAA NODE
6860: JSR PBILD BUILD P$PAA NODE
6861: MOV (XS)+,PTHEN(XR) SET LEFT OPERAND AS P$PAA SUCCESSOR
6862: JSR PCONC CONCATENATE TO FORM FINAL PATTERN
6863: BRN EXIXR JUMP FOR NEXT CODE WORD
6864: EJC
6865: *
6866: * PATTERN MATCH (BY NAME, FOR REPLACEMENT)
6867: *
6868: O$PMN ENT ENTRY POINT
6869: ZER WB SET TYPE CODE FOR MATCH BY NAME
6870: BRN MATCH JUMP TO ROUTINE TO START MATCH
6871: EJC
6872: *
6873: * PATTERN MATCH (STATEMENT)
6874: *
6875: * O$PMS IS USED IN PLACE OF O$PMV WHEN THE PATTERN MATCH
6876: * OCCURS AT THE OUTER (STATEMENT) LEVEL SINCE IN THIS
6877: * CASE THE SUBSTRING VALUE NEED NOT BE CONSTRUCTED.
6878: *
6879: O$PMS ENT ENTRY POINT
6880: MOV =NUM02,WB SET FLAG FOR STATEMENT TO MATCH
6881: BRN MATCH JUMP TO ROUTINE TO START MATCH
6882: EJC
6883: *
6884: * PATTERN MATCH (BY VALUE)
6885: *
6886: O$PMV ENT ENTRY POINT
6887: MOV =NUM01,WB SET TYPE CODE FOR VALUE MATCH
6888: BRN MATCH JUMP TO ROUTINE TO START MATCH
6889: EJC
6890: *
6891: * POP TOP ITEM ON STACK
6892: *
6893: O$POP ENT ENTRY POINT
6894: ICA XS POP TOP STACK ENTRY
6895: BRN EXITS OBEY NEXT CODE WORD
6896: EJC
6897: *
6898: * TERMINATE EXECUTION (CODE COMPILED FOR END STATEMENT)
6899: *
6900: O$STP ENT ENTRY POINT
6901: BRN LEND0 JUMP TO END CIRCUIT
6902: EJC
6903: *
6904: * RETURN NAME FROM EXPRESSION
6905: * THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN
6906: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS
6907: * A NAME. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX.
6908: *
6909: O$RNM ENT ENTRY POINT
6910: BRN EVLX4 RETURN TO EVALX PROCEDURE
6911: EJC
6912: *
6913: * PATTERN REPLACEMENT
6914: *
6915: * WHEN THIS ROUTINE GETS CONTROL, THE FOLLOWING STACK
6916: * ENTRIES HAVE BEEN MADE (SEE END OF MATCH ROUTINE P$NTH)
6917: *
6918: * SUBJECT NAME BASE
6919: * SUBJECT NAME OFFSET
6920: * INITIAL CURSOR VALUE
6921: * FINAL CURSOR VALUE
6922: * SUBJECT POINTER
6923: * (XS) ---------------- REPLACEMENT VALUE
6924: *
6925: O$RPL ENT ENTRY POINT
6926: JSR GTSTG CONVERT REPLACEMENT VAL TO STRING
6927: ERR 031,PATTERN REPLACEMENT RIGHT OPERAND IS NOT STRING
6928: *
6929: * GET RESULT LENGTH AND ALLOCATE RESULT SCBLK
6930: *
6931: MOV (XS),XL LOAD SUBJECT STRING POINTER
6932: BEQ (XL),=B$BCT,ORPL4 BRANCH IF BUFFER ASSIGNMENT
6933: ADD SCLEN(XL),WA ADD SUBJECT STRING LENGTH
6934: ADD 2(XS),WA ADD STARTING CURSOR
6935: SUB 1(XS),WA MINUS FINAL CURSOR = TOTAL LENGTH
6936: BZE WA,ORPL3 JUMP IF RESULT IS NULL
6937: MOV XR,-(XS) RESTACK REPLACEMENT STRING
6938: JSR ALOCS ALLOCATE SCBLK FOR RESULT
6939: MOV 3(XS),WA GET INITIAL CURSOR (PART 1 LEN)
6940: MOV XR,3(XS) STACK RESULT POINTER
6941: PSC XR POINT TO CHARACTERS OF RESULT
6942: *
6943: * MOVE PART 1 (START OF SUBJECT) TO RESULT
6944: *
6945: BZE WA,ORPL1 JUMP IF FIRST PART IS NULL
6946: MOV 1(XS),XL ELSE POINT TO SUBJECT STRING
6947: PLC XL POINT TO SUBJECT STRING CHARS
6948: MVC MOVE FIRST PART TO RESULT
6949: EJC
6950: * PATTERN REPLACEMENT (CONTINUED)
6951: *
6952: * NOW MOVE IN REPLACEMENT VALUE
6953: *
6954: ORPL1 MOV (XS)+,XL LOAD REPLACEMENT STRING, POP
6955: MOV SCLEN(XL),WA LOAD LENGTH
6956: BZE WA,ORPL2 JUMP IF NULL REPLACEMENT
6957: PLC XL ELSE POINT TO CHARS OF REPLACEMENT
6958: MVC MOVE IN CHARS (PART 2)
6959: *
6960: * NOW MOVE IN REMAINDER OF STRING (PART 3)
6961: *
6962: ORPL2 MOV (XS)+,XL LOAD SUBJECT STRING POINTER, POP
6963: MOV (XS)+,WC LOAD FINAL CURSOR, POP
6964: MOV SCLEN(XL),WA LOAD SUBJECT STRING LENGTH
6965: SUB WC,WA MINUS FINAL CURSOR = PART 3 LENGTH
6966: BZE WA,OASS0 JUMP TO ASSIGN IF PART 3 IS NULL
6967: PLC XL,WC ELSE POINT TO LAST PART OF STRING
6968: MVC MOVE PART 3 TO RESULT
6969: BRN OASS0 JUMP TO PERFORM ASSIGNMENT
6970: *
6971: * HERE IF RESULT IS NULL
6972: *
6973: ORPL3 ADD *NUM02,XS POP SUBJECT STR PTR, FINAL CURSOR
6974: MOV =NULLS,(XS) SET NULL RESULT
6975: BRN OASS0 JUMP TO ASSIGN NULL VALUE
6976: *
6977: * HERE FOR BUFFER SUBSTRING ASSIGNMENT
6978: *
6979: ORPL4 MOV XR,XL COPY SCBLK REPLACEMENT PTR
6980: MOV (XS)+,XR UNSTACK BCBLK PTR
6981: MOV (XS)+,WB GET FINAL CURSOR VALUE
6982: MOV (XS)+,WA GET INITIAL CURSOR
6983: SUB WA,WB GET LENGTH IN WB
6984: ADD *NUM02,XS GET RID OF NAME BASE/OFFSET
6985: JSR INSBF INSERT SUBSTRING
6986: PPM CONVERT FAIL IMPOSSIBLE
6987: PPM EXFAL FAIL IF INSERT FAILS
6988: BRN EXNUL ELSE NULL RESULT
6989: EJC
6990: *
6991: * RETURN VALUE FROM EXPRESSION
6992: *
6993: * THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN
6994: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS
6995: * A VALUE. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX
6996: *
6997: O$RVL ENT ENTRY POINT
6998: BRN EVLX3 RETURN TO EVALX PROCEDURE
6999: EJC
7000: *
7001: * SELECTION
7002: *
7003: * INITIAL ENTRY
7004: *
7005: O$SLA ENT ENTRY POINT
7006: LCW WA LOAD NEW FAILURE OFFSET
7007: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER
7008: MOV WA,-(XS) STACK NEW FAILURE OFFSET
7009: MOV XS,FLPTR SET NEW FAILURE POINTER
7010: BRN EXITS JUMP TO EXECUTE FIRST ALTERNATIVE
7011: *
7012: * ENTRY AFTER SUCCESSFUL EVALUATION OF ALTERNATIVE
7013: *
7014: O$SLB ENT ENTRY POINT
7015: MOV (XS)+,XR LOAD RESULT
7016: ICA XS POP FAIL OFFSET
7017: MOV (XS),FLPTR RESTORE OLD FAILURE POINTER
7018: MOV XR,(XS) RESTACK RESULT
7019: LCW WA LOAD NEW CODE OFFSET
7020: ADD R$COD,WA POINT TO ABSOLUTE CODE LOCATION
7021: LCP WA SET NEW CODE POINTER
7022: BRN EXITS JUMP TO CONTINUE PAST SELECTION
7023: *
7024: * ENTRY AT START OF SUBSEQUENT ALTERNATIVES
7025: *
7026: O$SLC ENT ENTRY POINT
7027: LCW WA LOAD NEW FAIL OFFSET
7028: MOV WA,(XS) STORE NEW FAIL OFFSET
7029: BRN EXITS JUMP TO EXECUTE NEXT ALTERNATIVE
7030: *
7031: * ENTRY AT START OF LAST ALTERNATIVE
7032: *
7033: O$SLD ENT ENTRY POINT
7034: ICA XS POP FAILURE OFFSET
7035: MOV (XS)+,FLPTR RESTORE OLD FAILURE POINTER
7036: BRN EXITS JUMP TO EXECUTE LAST ALTERNATIVE
7037: EJC
7038: *
7039: * BINARY MINUS (SUBTRACTION)
7040: *
7041: O$SUB ENT ENTRY POINT
7042: JSR ARITH FETCH ARITHMETIC OPERANDS
7043: ERR 032,SUBTRACTION LEFT OPERAND IS NOT NUMERIC
7044: ERR 033,SUBTRACTION RIGHT OPERAND IS NOT NUMERIC
7045: PPM OSUB1 JUMP IF REAL OPERANDS
7046: *
7047: * HERE TO SUBTRACT TWO INTEGERS
7048: *
7049: SBI ICVAL(XL) SUBTRACT RIGHT OPERAND FROM LEFT
7050: INO EXINT RETURN INTEGER IF NO OVERFLOW
7051: ERB 034,SUBTRACTION CAUSED INTEGER OVERFLOW
7052: *
7053: * HERE TO SUBTRACT TWO REALS
7054: *
7055: OSUB1 SBR RCVAL(XL) SUBTRACT RIGHT OPERAND FROM LEFT
7056: RNO EXREA RETURN REAL IF NO OVERFLOW
7057: ERB 264,SUBTRACTION CAUSED REAL OVERFLOW
7058: EJC
7059: *
7060: * DUMMY OPERATOR TO RETURN CONTROL TO TRXEQ PROCEDURE
7061: *
7062: O$TXR ENT ENTRY POINT
7063: BRN TRXQ1 JUMP INTO TRXEQ PROCEDURE
7064: EJC
7065: *
7066: * UNEXPECTED FAILURE
7067: *
7068: * NOTE THAT IF A SETEXIT TRAP IS OPERATING THEN
7069: * TRANSFER TO SYSTEM LABEL CONTINUE
7070: * WILL RESULT IN LOOPING HERE. DIFFICULT TO AVOID EXCEPT
7071: * WITH A CONSIDERABLE OVERHEAD WHICH IS NOT WORTHWHILE OR
7072: * ELSE BY A TECHNIQUE SUCH AS SETTING KVERL TO ZERO.
7073: *
7074: O$UNF ENT ENTRY POINT
7075: ERB 035,UNEXPECTED FAILURE IN -NOFAIL MODE
7076: TTL S P I T B O L -- SNOBOL4 BUILTIN LABEL ROUTINES
7077: *
7078: * THE FOLLOWING SECTION CONTAINS THE ROUTINES FOR LABELS
7079: * WHICH HAVE A PREDEFINED MEANING IN SNOBOL4.
7080: *
7081: * CONTROL IS PASSED DIRECTLY TO THE LABEL NAME ENTRY POINT.
7082: *
7083: * ENTRY NAMES ARE OF THE FORM L$XXX WHERE XXX IS THE THREE
7084: * LETTER VARIABLE NAME IDENTIFIER.
7085: *
7086: * ENTRIES ARE IN ALPHABETICAL ORDER
7087: EJC
7088: *
7089: * ABORT
7090: *
7091: L$ABO ENT ENTRY POINT
7092: *
7093: * MERGE HERE IF EXECUTION TERMINATES IN ERROR
7094: *
7095: LABO1 MOV KVERT,WA LOAD ERROR CODE
7096: BZE WA,LABO2 JUMP IF NO ERROR HAS OCCURED
7097: JSR SYSAX CALL AFTER EXECUTION PROC (REG04)
7098: JSR PRTPG ELSE EJECT PRINTER
7099: JSR ERMSG PRINT ERROR MESSAGE
7100: ZER XR INDICATE NO MESSAGE TO PRINT
7101: BRN STOPR JUMP TO ROUTINE TO STOP RUN
7102: *
7103: * HERE IF NO ERROR HAD OCCURED
7104: *
7105: LABO2 ERB 036,GOTO ABORT WITH NO PRECEDING ERROR
7106: EJC
7107: *
7108: * CONTINUE
7109: *
7110: L$CNT ENT ENTRY POINT
7111: *
7112: * MERGE HERE AFTER EXECUTION ERROR
7113: *
7114: LCNT1 MOV R$CNT,XR LOAD CONTINUATION CODE BLOCK PTR
7115: BZE XR,LCNT2 JUMP IF NO PREVIOUS ERROR
7116: ZER R$CNT CLEAR FLAG
7117: MOV XR,R$COD ELSE STORE AS NEW CODE BLOCK PTR
7118: ADD STXOF,XR ADD FAILURE OFFSET
7119: LCP XR LOAD CODE POINTER
7120: MOV FLPTR,XS RESET STACK POINTER
7121: BRN EXITS JUMP TO TAKE INDICATED FAILURE
7122: *
7123: * HERE IF NO PREVIOUS ERROR
7124: *
7125: LCNT2 ERB 037,GOTO CONTINUE WITH NO PRECEDING ERROR
7126: EJC
7127: *
7128: * END
7129: *
7130: L$END ENT ENTRY POINT
7131: *
7132: * MERGE HERE FROM END CODE CIRCUIT
7133: *
7134: LEND0 MOV =ENDMS,XR POINT TO MESSAGE /NORMAL TERM../
7135: BRN STOPR JUMP TO ROUTINE TO STOP RUN
7136: EJC
7137: *
7138: * FRETURN
7139: *
7140: L$FRT ENT ENTRY POINT
7141: MOV =SCFRT,WA POINT TO STRING /FRETURN/
7142: BRN RETRN JUMP TO COMMON RETURN ROUTINE
7143: EJC
7144: *
7145: * NRETURN
7146: *
7147: L$NRT ENT ENTRY POINT
7148: MOV =SCNRT,WA POINT TO STRING /NRETURN/
7149: BRN RETRN JUMP TO COMMON RETURN ROUTINE
7150: EJC
7151: *
7152: * RETURN
7153: *
7154: L$RTN ENT ENTRY POINT
7155: MOV =SCRTN,WA POINT TO STRING /RETURN/
7156: BRN RETRN JUMP TO COMMON RETURN ROUTINE
7157: EJC
7158: *
7159: * UNDEFINED LABEL
7160: *
7161: L$UND ENT ENTRY POINT
7162: ERB 038,GOTO UNDEFINED LABEL
7163: TTL S P I T B O L -- BLOCK ACTION ROUTINES
7164: *
7165: * THE FIRST WORD OF EVERY BLOCK IN DYNAMIC STORAGE AND THE
7166: * VRGET, VRSTO AND VRTRA FIELDS OF A VRBLK CONTAIN A
7167: * POINTER TO AN ENTRY POINT IN THE PROGRAM. ALL SUCH ENTRY
7168: * POINTS ARE IN THE FOLLOWING SECTION EXCEPT THOSE FOR
7169: * PATTERN BLOCKS WHICH ARE IN THE PATTERN MATCHING SEGMENT
7170: * LATER ON (LABELS OF THE FORM P$XXX), AND DOPE VECTORS
7171: * (D$XXX) WHICH ARE IN THE DOPE VECTOR SECTION FOLLOWING
7172: * THE PATTERN ROUTINES (DOPE VECTORS ARE USED FOR CMBLKS).
7173: *
7174: * THE ENTRY POINTS IN THIS SECTION HAVE LABELS OF THE
7175: * FORM B$XXY WHERE XX IS THE TWO CHARACTER BLOCK TYPE FOR
7176: * THE CORRESPONDING BLOCK AND Y IS ANY LETTER.
7177: *
7178: * IN SOME CASES, THE POINTERS SERVE NO OTHER PURPOSE THAN
7179: * TO IDENTIFY THE BLOCK TYPE. IN THIS CASE THE ROUTINE
7180: * IS NEVER EXECUTED AND THUS NO CODE IS ASSEMBLED.
7181: *
7182: * FOR EACH OF THESE ENTRY POINTS CORRESPONDING TO A BLOCK
7183: * AN ENTRY POINT IDENTIFICATION IS ASSEMBLED (BL$XX).
7184: *
7185: * THE EXACT ENTRY CONDITIONS DEPEND ON THE MANNER IN
7186: * WHICH THE ROUTINE IS ACCESSED AND ARE DOCUMENTED WITH
7187: * THE INDIVIDUAL ROUTINES AS REQUIRED.
7188: *
7189: * THE ORDER OF THESE ROUTINES IS ALPHABETICAL WITH THE
7190: * FOLLOWING EXCEPTIONS.
7191: *
7192: * THE ROUTINES FOR SEBLK AND EXBLK ENTRIES OCCUR FIRST SO
7193: * THAT EXPRESSIONS CAN BE QUICKLY IDENTIFIED FROM THE FACT
7194: * THAT THEIR ROUTINES LIE BEFORE THE SYMBOL B$E$$.
7195: *
7196: * THESE ARE IMMEDIATELY FOLLOWED BY THE ROUTINE FOR A TRBLK
7197: * SO THAT THE TEST AGAINST THE SYMBOL B$T$$ CHECKS FOR
7198: * TRAPPED VALUES OR EXPRESSION VALUES (SEE PROCEDURE EVALP)
7199: *
7200: * THE PATTERN ROUTINES LIE AFTER THIS SECTION SO THAT
7201: * PATTERNS ARE IDENTIFIED WITH ROUTINES STARTING AT OR
7202: * AFTER THE INITIAL INSTRUCTION IN THESE ROUTINES (P$AAA).
7203: *
7204: * THE SYMBOL B$AAA DEFINES THE FIRST LOCATION FOR BLOCK
7205: * ROUTINES AND THE SYMBOL P$YYY (AT THE END OF THE PATTERN
7206: * MATCH ROUTINES SECTION) DEFINES THE LAST SUCH ENTRY POINT
7207: *
7208: B$AAA ENT BL$$I ENTRY POINT OF FIRST BLOCK ROUTINE
7209: EJC
7210: *
7211: * EXBLK
7212: *
7213: * THE ROUTINE FOR AN EXBLK LOADS THE EXPRESSION ONTO
7214: * THE STACK AS A VALUE.
7215: *
7216: * (XR) POINTER TO EXBLK
7217: *
7218: B$EXL ENT BL$EX ENTRY POINT (EXBLK)
7219: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD
7220: EJC
7221: *
7222: * SEBLK
7223: *
7224: * THE ROUTINE FOR SEBLK IS ACCESSED FROM THE GENERATED
7225: * CODE TO LOAD THE EXPRESSION VALUE ONTO THE STACK.
7226: *
7227: B$SEL ENT BL$SE ENTRY POINT (SEBLK)
7228: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD
7229: *
7230: * DEFINE SYMBOL WHICH MARKS END OF ENTRIES FOR EXPRESSIONS
7231: *
7232: B$E$$ ENT BL$$I ENTRY POINT
7233: EJC
7234: *
7235: * TRBLK
7236: *
7237: * THE ROUTINE FOR A TRBLK IS NEVER EXECUTED
7238: *
7239: B$TRT ENT BL$TR ENTRY POINT (TRBLK)
7240: *
7241: * DEFINE SYMBOL MARKING END OF TRAP AND EXPRESSION BLOCKS
7242: *
7243: B$T$$ ENT BL$$I END OF TRBLK,SEBLK,EXBLK ENTRIES
7244: EJC
7245: *
7246: * ARBLK
7247: *
7248: * THE ROUTINE FOR ARBLK IS NEVER EXECUTED
7249: *
7250: B$ART ENT BL$AR ENTRY POINT (ARBLK)
7251: EJC
7252: *
7253: * BCBLK
7254: *
7255: * THE ROUTINE FOR A BCBLK IS NEVER EXECUTED
7256: *
7257: * (XR) POINTER TO BCBLK
7258: *
7259: B$BCT ENT BL$BC ENTRY POINT (BCBLK)
7260: EJC
7261: *
7262: * BFBLK
7263: *
7264: * THE ROUTINE FOR A BFBLK IS NEVER EXECUTED
7265: *
7266: * (XR) POINTER TO BFBLK
7267: *
7268: B$BFT ENT BL$BF ENTRY POINT (BFBLK)
7269: EJC
7270: *
7271: * CCBLK
7272: *
7273: * THE ROUTINE FOR CCBLK IS NEVER ENTERED
7274: *
7275: B$CCT ENT BL$CC ENTRY POINT (CCBLK)
7276: EJC
7277: *
7278: * CDBLK
7279: *
7280: * THE CDBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE.
7281: * THERE ARE TWO CASES DEPENDING ON THE FORM OF CDFAL.
7282: *
7283: * ENTRY FOR COMPLEX FAILURE CODE AT CDFAL
7284: *
7285: * (XR) POINTER TO CDBLK
7286: *
7287: B$CDC ENT BL$CD ENTRY POINT (CDBLK)
7288: BCDC0 MOV FLPTR,XS POP GARBAGE OFF STACK
7289: MOV CDFAL(XR),(XS) SET FAILURE OFFSET
7290: BRN STMGO ENTER STMT
7291: EJC
7292: *
7293: * CDBLK (CONTINUED)
7294: *
7295: * ENTRY FOR SIMPLE FAILURE CODE AT CDFAL
7296: *
7297: * (XR) POINTER TO CDBLK
7298: *
7299: B$CDS ENT BL$CD ENTRY POINT (CDBLK)
7300: BCDS0 MOV FLPTR,XS POP GARBAGE OFF STACK
7301: MOV *CDFAL,(XS) SET FAILURE OFFSET
7302: BRN STMGO ENTER STMT
7303: EJC
7304: *
7305: * CMBLK
7306: *
7307: * THE ROUTINE FOR A CMBLK IS NEVER EXECUTED
7308: *
7309: B$CMT ENT BL$CM ENTRY POINT (CMBLK)
7310: EJC
7311: *
7312: * CTBLK
7313: *
7314: * THE ROUTINE FOR A CTBLK IS NEVER EXECUTED
7315: *
7316: B$CTT ENT BL$CT ENTRY POINT (CTBLK)
7317: EJC
7318: *
7319: * DFBLK
7320: *
7321: * THE ROUTINE FOR A DFBLK IS ACCESSED FROM THE O$FNC ENTRY
7322: * TO CALL A DATATYPE FUNCTION AND BUILD A PDBLK.
7323: *
7324: * (XL) POINTER TO DFBLK
7325: *
7326: B$DFC ENT BL$DF ENTRY POINT
7327: MOV DFPDL(XL),WA LOAD LENGTH OF PDBLK
7328: JSR ALLOC ALLOCATE PDBLK
7329: MOV =B$PDT,(XR) STORE TYPE WORD
7330: MOV XL,PDDFP(XR) STORE DFBLK POINTER
7331: MOV XR,WC SAVE POINTER TO PDBLK
7332: ADD WA,XR POINT PAST PDBLK
7333: LCT WA,FARGS(XL) SET TO COUNT FIELDS
7334: *
7335: * LOOP TO ACQUIRE FIELD VALUES FROM STACK
7336: *
7337: BDFC1 MOV (XS)+,-(XR) MOVE A FIELD VALUE
7338: BCT WA,BDFC1 LOOP TILL ALL MOVED
7339: MOV WC,XR RECALL POINTER TO PDBLK
7340: BRN EXSID EXIT SETTING ID FIELD
7341: EJC
7342: *
7343: * EFBLK
7344: *
7345: * THE ROUTINE FOR AN EFBLK IS PASSED CONTROL FORM THE O$FNC
7346: * ENTRY TO CALL AN EXTERNAL FUNCTION.
7347: *
7348: * (XL) POINTER TO EFBLK
7349: *
7350: B$EFC ENT BL$EF ENTRY POINT (EFBLK)
7351: MOV FARGS(XL),WC LOAD NUMBER OF ARGUMENTS
7352: WTB WC CONVERT TO OFFSET
7353: MOV XL,-(XS) SAVE POINTER TO EFBLK
7354: MOV XS,XT COPY POINTER TO ARGUMENTS
7355: *
7356: * LOOP TO CONVERT ARGUMENTS
7357: *
7358: BEFC1 ICA XT POINT TO NEXT ENTRY
7359: MOV (XS),XR LOAD POINTER TO EFBLK
7360: DCA WC DECREMENT EFTAR OFFSET
7361: ADD WC,XR POINT TO NEXT EFTAR ENTRY
7362: MOV EFTAR(XR),XR LOAD EFTAR ENTRY
7363: BSW XR,4 SWITCH ON TYPE
7364: IFF 0,BEFC7 NO CONVERSION NEEDED
7365: IFF 1,BEFC2 STRING
7366: IFF 2,BEFC3 INTEGER
7367: IFF 3,BEFC4 REAL
7368: ESW END OF SWITCH ON TYPE
7369: *
7370: * HERE TO CONVERT TO STRING
7371: *
7372: BEFC2 MOV (XT),-(XS) STACK ARG PTR
7373: JSR GTSTG CONVERT ARGUMENT TO STRING
7374: ERR 039,EXTERNAL FUNCTION ARGUMENT IS NOT STRING
7375: BRN BEFC6 JUMP TO MERGE
7376: EJC
7377: *
7378: * EFBLK (CONTINUED)
7379: *
7380: * HERE TO CONVERT AN INTEGER
7381: *
7382: BEFC3 MOV (XT),XR LOAD NEXT ARGUMENT
7383: MOV WC,BEFOF SAVE OFFSET
7384: JSR GTINT CONVERT TO INTEGER
7385: ERR 040,EXTERNAL FUNCTION ARGUMENT IS NOT INTEGER
7386: BRN BEFC5 MERGE WITH REAL CASE
7387: *
7388: * HERE TO CONVERT A REAL
7389: *
7390: BEFC4 MOV (XT),XR LOAD NEXT ARGUMENT
7391: MOV WC,BEFOF SAVE OFFSET
7392: JSR GTREA CONVERT TO REAL
7393: ERR 265,EXTERNAL FUNCTION ARGUMENT IS NOT REAL
7394: *
7395: * INTEGER CASE MERGES HERE
7396: *
7397: BEFC5 MOV BEFOF,WC RESTORE OFFSET
7398: *
7399: * STRING MERGES HERE
7400: *
7401: BEFC6 MOV XR,(XT) STORE CONVERTED RESULT
7402: *
7403: * NO CONVERSION MERGES HERE
7404: *
7405: BEFC7 BNZ WC,BEFC1 LOOP BACK IF MORE TO GO
7406: *
7407: * HERE AFTER CONVERTING ALL THE ARGUMENTS
7408: *
7409: MOV (XS)+,XL RESTORE EFBLK POINTER
7410: MOV FARGS(XL),WA GET NUMBER OF ARGS
7411: JSR SYSEX CALL ROUTINE TO CALL EXTERNAL FNC
7412: PPM EXFAL FAIL IF FAILURE
7413: EJC
7414: *
7415: * EFBLK (CONTINUED)
7416: *
7417: * RETURN HERE WITH RESULT IN XR
7418: *
7419: * FIRST DEFEND AGAINST NON-STANDARD NULL STRING RETURNED
7420: *
7421: MOV EFRSL(XL),WB GET RESULT TYPE ID
7422: BNZ WB,BEFA8 BRANCH IF NOT UNCONVERTED
7423: BNE (XR),=B$SCL,BEFC8 JUMP IF NOT A STRING
7424: BZE SCLEN(XR),EXNUL RETURN NULL IF NULL
7425: *
7426: * HERE IF CONVERTED RESULT TO CHECK FOR NULL STRING
7427: *
7428: BEFA8 BNE WB,=NUM01,BEFC8 JUMP IF NOT A STRING
7429: BZE SCLEN(XR),EXNUL RETURN NULL IF NULL
7430: *
7431: * RETURN IF RESULT IS IN DYNAMIC STORAGE
7432: *
7433: BEFC8 BLT XR,DNAMB,BEFC9 JUMP IF NOT IN DYNAMIC STORAGE
7434: BLE XR,DNAMP,EXIXR RETURN RESULT IF ALREADY DYNAMIC
7435: *
7436: * HERE WE COPY A RESULT INTO THE DYNAMIC REGION
7437: *
7438: BEFC9 MOV (XR),WA GET POSSIBLE TYPE WORD
7439: BZE WB,BEF11 JUMP IF UNCONVERTED RESULT
7440: MOV =B$SCL,WA STRING
7441: BEQ WB,=NUM01,BEF10 YES JUMP
7442: MOV =B$ICL,WA INTEGER
7443: BEQ WB,=NUM02,BEF10 YES JUMP
7444: MOV =B$RCL,WA REAL
7445: *
7446: * STORE TYPE WORD IN RESULT
7447: *
7448: BEF10 MOV WA,(XR) STORED BEFORE COPYING TO DYNAMIC
7449: *
7450: * MERGE FOR UNCONVERTED RESULT
7451: *
7452: BEF11 JSR BLKLN GET LENGTH OF BLOCK
7453: MOV XR,XL COPY ADDRESS OF OLD BLOCK
7454: JSR ALLOC ALLOCATE DYNAMIC BLOCK SAME SIZE
7455: MOV XR,-(XS) SET POINTER TO NEW BLOCK AS RESULT
7456: MVW COPY OLD BLOCK TO DYNAMIC BLOCK
7457: BRN EXITS EXIT WITH RESULT ON STACK
7458: EJC
7459: *
7460: * EVBLK
7461: *
7462: * THE ROUTINE FOR AN EVBLK IS NEVER EXECUTED
7463: *
7464: B$EVT ENT BL$EV ENTRY POINT (EVBLK)
7465: EJC
7466: *
7467: * FFBLK
7468: *
7469: * THE ROUTINE FOR AN FFBLK IS EXECUTED FROM THE O$FNC ENTRY
7470: * TO CALL A FIELD FUNCTION AND EXTRACT A FIELD VALUE/NAME.
7471: *
7472: * (XL) POINTER TO FFBLK
7473: *
7474: B$FFC ENT BL$FF ENTRY POINT (FFBLK)
7475: MOV XL,XR COPY FFBLK POINTER
7476: LCW WC LOAD NEXT CODE WORD
7477: MOV (XS),XL LOAD PDBLK POINTER
7478: BNE (XL),=B$PDT,BFFC2 JUMP IF NOT PDBLK AT ALL
7479: MOV PDDFP(XL),WA LOAD DFBLK POINTER FROM PDBLK
7480: *
7481: * LOOP TO FIND CORRECT FFBLK FOR THIS PDBLK
7482: *
7483: BFFC1 BEQ WA,FFDFP(XR),BFFC3 JUMP IF THIS IS THE CORRECT FFBLK
7484: MOV FFNXT(XR),XR ELSE LINK TO NEXT FFBLK ON CHAIN
7485: BNZ XR,BFFC1 LOOP BACK IF ANOTHER ENTRY TO CHECK
7486: *
7487: * HERE FOR BAD ARGUMENT
7488: *
7489: BFFC2 ERB 041,FIELD FUNCTION ARGUMENT IS WRONG DATATYPE
7490: EJC
7491: *
7492: * FFBLK (CONTINUED)
7493: *
7494: * HERE AFTER LOCATING CORRECT FFBLK
7495: *
7496: BFFC3 MOV FFOFS(XR),WA LOAD FIELD OFFSET
7497: BEQ WC,=OFNE$,BFFC5 JUMP IF CALLED BY NAME
7498: ADD WA,XL ELSE POINT TO VALUE FIELD
7499: MOV (XL),XR LOAD VALUE
7500: BNE (XR),=B$TRT,BFFC4 JUMP IF NOT TRAPPED
7501: SUB WA,XL ELSE RESTORE NAME BASE,OFFSET
7502: MOV WC,(XS) SAVE NEXT CODE WORD OVER PDBLK PTR
7503: JSR ACESS ACCESS VALUE
7504: PPM EXFAL FAIL IF ACCESS FAILS
7505: MOV (XS),WC RESTORE NEXT CODE WORD
7506: *
7507: * HERE AFTER GETTING VALUE IN (XR)
7508: *
7509: BFFC4 MOV XR,(XS) STORE VALUE ON STACK (OVER PDBLK)
7510: MOV WC,XR COPY NEXT CODE WORD
7511: MOV (XR),XL LOAD ENTRY ADDRESS
7512: BRI XL JUMP TO ROUTINE FOR NEXT CODE WORD
7513: *
7514: * HERE IF CALLED BY NAME
7515: *
7516: BFFC5 MOV WA,-(XS) STORE NAME OFFSET (BASE IS SET)
7517: BRN EXITS EXIT WITH NAME ON STACK
7518: EJC
7519: *
7520: * ICBLK
7521: *
7522: * THE ROUTINE FOR ICBLK IS EXECUTED FROM THE GENERATED
7523: * CODE TO LOAD AN INTEGER VALUE ONTO THE STACK.
7524: *
7525: * (XR) POINTER TO ICBLK
7526: *
7527: B$ICL ENT BL$IC ENTRY POINT (ICBLK)
7528: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD
7529: EJC
7530: *
7531: * KVBLK
7532: *
7533: * THE ROUTINE FOR A KVBLK IS NEVER EXECUTED.
7534: *
7535: B$KVT ENT BL$KV ENTRY POINT (KVBLK)
7536: EJC
7537: *
7538: * NMBLK
7539: *
7540: * THE ROUTINE FOR A NMBLK IS EXECUTED FROM THE GENERATED
7541: * CODE FOR THE CASE OF LOADING A NAME ONTO THE STACK
7542: * WHERE THE NAME IS THAT OF A NATURAL VARIABLE WHICH CAN
7543: * BE PREEVALUATED AT COMPILE TIME.
7544: *
7545: * (XR) POINTER TO NMBLK
7546: *
7547: B$NML ENT BL$NM ENTRY POINT (NMBLK)
7548: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD
7549: EJC
7550: *
7551: * PDBLK
7552: *
7553: * THE ROUTINE FOR A PDBLK IS NEVER EXECUTED
7554: *
7555: B$PDT ENT BL$PD ENTRY POINT (PDBLK)
7556: EJC
7557: *
7558: * PFBLK
7559: *
7560: * THE ROUTINE FOR A PFBLK IS EXECUTED FROM THE ENTRY O$FNC
7561: * TO CALL A PROGRAM DEFINED FUNCTION.
7562: *
7563: * (XL) POINTER TO PFBLK
7564: *
7565: * THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING
7566: * CONTROL TO THE PROGRAM DEFINED FUNCTION.
7567: *
7568: * SAVED VALUE OF FIRST ARGUMENT
7569: * .
7570: * SAVED VALUE OF LAST ARGUMENT
7571: * SAVED VALUE OF FIRST LOCAL
7572: * .
7573: * SAVED VALUE OF LAST LOCAL
7574: * SAVED VALUE OF FUNCTION NAME
7575: * SAVED CODE BLOCK PTR (R$COD)
7576: * SAVED CODE POINTER (-R$COD)
7577: * SAVED VALUE OF FLPRT
7578: * SAVED VALUE OF FLPTR
7579: * POINTER TO PFBLK
7580: * FLPTR --------------- ZERO (TO BE OVERWRITTEN WITH OFFS)
7581: *
7582: B$PFC ENT BL$PF ENTRY POINT (PFBLK)
7583: MOV XL,BPFPF SAVE PFBLK PTR (NEED NOT BE RELOC)
7584: MOV XL,XR COPY FOR THE MOMENT
7585: MOV PFVBL(XR),XL POINT TO VRBLK FOR FUNCTION
7586: *
7587: * LOOP TO FIND OLD VALUE OF FUNCTION
7588: *
7589: BPF01 MOV XL,WB SAVE POINTER
7590: MOV VRVAL(XL),XL LOAD VALUE
7591: BEQ (XL),=B$TRT,BPF01 LOOP IF TRBLK
7592: *
7593: * SET VALUE TO NULL AND SAVE OLD FUNCTION VALUE
7594: *
7595: MOV XL,BPFSV SAVE OLD VALUE
7596: MOV WB,XL POINT BACK TO BLOCK WITH VALUE
7597: MOV =NULLS,VRVAL(XL) SET VALUE TO NULL
7598: MOV FARGS(XR),WA LOAD NUMBER OF ARGUMENTS
7599: ADD *PFARG,XR POINT TO PFARG ENTRIES
7600: BZE WA,BPF04 JUMP IF NO ARGUMENTS
7601: MOV XS,XT PTR TO LAST ARG
7602: WTB WA CONVERT NO. OF ARGS TO BYTES OFFSET
7603: ADD WA,XT POINT BEFORE FIRST ARG
7604: MOV XT,BPFXT REMEMBER ARG POINTER
7605: EJC
7606: *
7607: * PFBLK (CONTINUED)
7608: *
7609: * LOOP TO SAVE OLD ARGUMENT VALUES AND SET NEW ONES
7610: *
7611: BPF02 MOV (XR)+,XL LOAD VRBLK PTR FOR NEXT ARGUMENT
7612: *
7613: * LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE
7614: *
7615: BPF03 MOV XL,WC SAVE POINTER
7616: MOV VRVAL(XL),XL LOAD NEXT VALUE
7617: BEQ (XL),=B$TRT,BPF03 LOOP BACK IF TRBLK
7618: *
7619: * SAVE OLD VALUE AND GET NEW VALUE
7620: *
7621: MOV XL,WA KEEP OLD VALUE
7622: MOV BPFXT,XT POINT BEFORE NEXT STACKED ARG
7623: MOV -(XT),WB LOAD ARGUMENT (NEW VALUE)
7624: MOV WA,(XT) SAVE OLD VALUE
7625: MOV XT,BPFXT KEEP ARG PTR FOR NEXT TIME
7626: MOV WC,XL POINT BACK TO BLOCK WITH VALUE
7627: MOV WB,VRVAL(XL) SET NEW VALUE
7628: BNE XS,BPFXT,BPF02 LOOP IF NOT ALL DONE
7629: *
7630: * NOW PROCESS LOCALS
7631: *
7632: BPF04 MOV BPFPF,XL RESTORE PFBLK POINTER
7633: MOV PFNLO(XL),WA LOAD NUMBER OF LOCALS
7634: BZE WA,BPF07 JUMP IF NO LOCALS
7635: MOV =NULLS,WB GET NULL CONSTANT
7636: LCT WA,WA SET LOCAL COUNTER
7637: *
7638: * LOOP TO PROCESS LOCALS
7639: *
7640: BPF05 MOV (XR)+,XL LOAD VRBLK PTR FOR NEXT LOCAL
7641: *
7642: * LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE
7643: *
7644: BPF06 MOV XL,WC SAVE POINTER
7645: MOV VRVAL(XL),XL LOAD NEXT VALUE
7646: BEQ (XL),=B$TRT,BPF06 LOOP BACK IF TRBLK
7647: *
7648: * SAVE OLD VALUE AND SET NULL AS NEW VALUE
7649: *
7650: MOV XL,-(XS) STACK OLD VALUE
7651: MOV WC,XL POINT BACK TO BLOCK WITH VALUE
7652: MOV WB,VRVAL(XL) SET NULL AS NEW VALUE
7653: BCT WA,BPF05 LOOP TILL ALL LOCALS PROCESSED
7654: EJC
7655: *
7656: * PFBLK (CONTINUED)
7657: *
7658: * HERE AFTER PROCESSING ARGUMENTS AND LOCALS
7659: *
7660: BPF07 ZER XR ZERO REG XR IN CASE
7661: BZE KVPFL,BPF7C SKIP IF PROFILING IS OFF
7662: BEQ KVPFL,=NUM02,BPF7A BRANCH ON TYPE OF PROFILE
7663: *
7664: * HERE IF &PROFILE = 1
7665: *
7666: JSR SYSTM GET CURRENT TIME
7667: STI PFETM SAVE FOR A SEC
7668: SBI PFSTM FIND TIME USED BY CALLER
7669: JSR ICBLD BUILD INTO AN ICBLK
7670: LDI PFETM RELOAD CURRENT TIME
7671: BRN BPF7B MERGE
7672: *
7673: * HERE IF &PROFILE = 2
7674: *
7675: BPF7A LDI PFSTM GET START TIME OF CALLING STMT
7676: JSR ICBLD ASSEMBLE AN ICBLK ROUND IT
7677: JSR SYSTM GET NOW TIME
7678: *
7679: * BOTH TYPES OF PROFILE MERGE HERE
7680: *
7681: BPF7B STI PFSTM SET START TIME OF 1ST FUNC STMT
7682: MNZ PFFNC FLAG FUNCTION ENTRY
7683: *
7684: * NO PROFILING MERGES HERE
7685: *
7686: BPF7C MOV XR,-(XS) STACK ICBLK PTR (OR ZERO)
7687: MOV R$COD,WA LOAD OLD CODE BLOCK POINTER
7688: SCP WB GET CODE POINTER
7689: SUB WA,WB MAKE CODE POINTER INTO OFFSET
7690: MOV BPFPF,XL RECALL PFBLK POINTER
7691: MOV BPFSV,-(XS) STACK OLD VALUE OF FUNCTION NAME
7692: MOV WA,-(XS) STACK CODE BLOCK POINTER
7693: MOV WB,-(XS) STACK CODE OFFSET
7694: MOV FLPRT,-(XS) STACK OLD FLPRT
7695: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER
7696: MOV XL,-(XS) STACK POINTER TO PFBLK
7697: ZER -(XS) DUMMY ZERO ENTRY FOR FAIL RETURN
7698: CHK CHECK FOR STACK OVERFLOW
7699: MOV XS,FLPTR SET NEW FAIL RETURN VALUE
7700: MOV XS,FLPRT SET NEW FLPRT
7701: MOV KVTRA,WA LOAD TRACE VALUE
7702: ADD KVFTR,WA ADD FTRACE VALUE
7703: BNZ WA,BPF09 JUMP IF TRACING POSSIBLE
7704: ICV KVFNC ELSE BUMP FNCLEVEL
7705: *
7706: * HERE TO ACTUALLY JUMP TO FUNCTION
7707: *
7708: BPF08 MOV PFCOD(XL),XR POINT TO CODE
7709: BRI (XR) OFF TO EXECUTE FUNCTION
7710: *
7711: * HERE IF TRACING IS POSSIBLE
7712: *
7713: BPF09 MOV PFCTR(XL),XR LOAD POSSIBLE CALL TRACE TRBLK
7714: MOV PFVBL(XL),XL LOAD VRBLK POINTER FOR FUNCTION
7715: MOV *VRVAL,WA SET NAME OFFSET FOR VARIABLE
7716: BZE KVTRA,BPF10 JUMP IF TRACE MODE IS OFF
7717: BZE XR,BPF10 OR IF THERE IS NO CALL TRACE
7718: *
7719: * HERE IF CALL TRACED
7720: *
7721: DCV KVTRA DECREMENT TRACE COUNT
7722: BZE TRFNC(XR),BPF11 JUMP IF PRINT TRACE
7723: JSR TRXEQ EXECUTE FUNCTION TYPE TRACE
7724: EJC
7725: *
7726: * PFBLK (CONTINUED)
7727: *
7728: * HERE TO TEST FOR FTRACE TRACE
7729: *
7730: BPF10 BZE KVFTR,BPF16 JUMP IF FTRACE IS OFF
7731: DCV KVFTR ELSE DECREMENT FTRACE
7732: *
7733: * HERE FOR PRINT TRACE
7734: *
7735: BPF11 JSR PRTSN PRINT STATEMENT NUMBER
7736: JSR PRTNM PRINT FUNCTION NAME
7737: MOV =CH$PP,WA LOAD LEFT PAREN
7738: JSR PRTCH PRINT LEFT PAREN
7739: MOV 1(XS),XL RECOVER PFBLK POINTER
7740: BZE FARGS(XL),BPF15 SKIP IF NO ARGUMENTS
7741: ZER WB ELSE SET ARGUMENT COUNTER
7742: BRN BPF13 JUMP INTO LOOP
7743: *
7744: * LOOP TO PRINT ARGUMENT VALUES
7745: *
7746: BPF12 MOV =CH$CM,WA LOAD COMMA
7747: JSR PRTCH PRINT TO SEPARATE FROM LAST ARG
7748: *
7749: * MERGE HERE FIRST TIME (NO COMMA REQUIRED)
7750: *
7751: BPF13 MOV WB,(XS) SAVE ARG CTR (OVER FAILOFFS IS OK)
7752: WTB WB CONVERT TO BYTE OFFSET
7753: ADD WB,XL POINT TO NEXT ARGUMENT POINTER
7754: MOV PFARG(XL),XR LOAD NEXT ARGUMENT VRBLK PTR
7755: SUB WB,XL RESTORE PFBLK POINTER
7756: MOV VRVAL(XR),XR LOAD NEXT VALUE
7757: JSR PRTVL PRINT ARGUMENT VALUE
7758: EJC
7759: *
7760: * HERE AFTER DEALING WITH ONE ARGUMENT
7761: *
7762: MOV (XS),WB RESTORE ARGUMENT COUNTER
7763: ICV WB INCREMENT ARGUMENT COUNTER
7764: BLT WB,FARGS(XL),BPF12 LOOP IF MORE TO PRINT
7765: *
7766: * MERGE HERE IN NO ARGS CASE TO PRINT PAREN
7767: *
7768: BPF15 MOV =CH$RP,WA LOAD RIGHT PAREN
7769: JSR PRTCH PRINT TO TERMINATE OUTPUT
7770: JSR PRTNL TERMINATE PRINT LINE
7771: *
7772: * MERGE HERE TO EXIT WITH TEST FOR FNCLEVEL TRACE
7773: *
7774: BPF16 ICV KVFNC INCREMENT FNCLEVEL
7775: MOV R$FNC,XL LOAD PTR TO POSSIBLE TRBLK
7776: JSR KTREX CALL KEYWORD TRACE ROUTINE
7777: *
7778: * CALL FUNCTION AFTER TRACE TESTS COMPLETE
7779: *
7780: MOV 1(XS),XL RESTORE PFBLK POINTER
7781: BRN BPF08 JUMP BACK TO EXECUTE FUNCTION
7782: EJC
7783: *
7784: * RCBLK
7785: *
7786: * THE ROUTINE FOR AN RCBLK IS EXECUTED FROM THE GENERATED
7787: * CODE TO LOAD A REAL VALUE ONTO THE STACK.
7788: *
7789: * (XR) POINTER TO RCBLK
7790: *
7791: B$RCL ENT BL$RC ENTRY POINT (RCBLK)
7792: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD
7793: EJC
7794: *
7795: * SCBLK
7796: *
7797: * THE ROUTINE FOR AN SCBLK IS EXECUTED FROM THE GENERATED
7798: * CODE TO LOAD A STRING VALUE ONTO THE STACK.
7799: *
7800: * (XR) POINTER TO SCBLK
7801: *
7802: B$SCL ENT BL$SC ENTRY POINT (SCBLK)
7803: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD
7804: EJC
7805: *
7806: * TBBLK
7807: *
7808: * THE ROUTINE FOR A TBBLK IS NEVER EXECUTED
7809: *
7810: B$TBT ENT BL$TB ENTRY POINT (TBBLK)
7811: EJC
7812: *
7813: * TEBLK
7814: *
7815: * THE ROUTINE FOR A TEBLK IS NEVER EXECUTED
7816: *
7817: B$TET ENT BL$TE ENTRY POINT (TEBLK)
7818: EJC
7819: *
7820: * VCBLK
7821: *
7822: * THE ROUTINE FOR A VCBLK IS NEVER EXECUTED
7823: *
7824: B$VCT ENT BL$VC ENTRY POINT (VCBLK)
7825: EJC
7826: *
7827: * VRBLK
7828: *
7829: * THE VRBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE.
7830: * THERE ARE SIX ENTRIES FOR VRBLK COVERING VARIOUS CASES
7831: *
7832: B$VR$ ENT BL$$I MARK START OF VRBLK ENTRY POINTS
7833: *
7834: * ENTRY FOR VRGET (TRAPPED CASE). THIS ROUTINE IS CALLED
7835: * FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE.
7836: * THIS ENTRY POINT IS USED IF AN ACCESS TRACE OR INPUT
7837: * ASSOCIATION IS CURRENTLY ACTIVE.
7838: *
7839: * (XR) POINTER TO VRGET FIELD OF VRBLK
7840: *
7841: B$VRA ENT BL$$I ENTRY POINT
7842: MOV XR,XL COPY NAME BASE (VRGET = 0)
7843: MOV *VRVAL,WA SET NAME OFFSET
7844: JSR ACESS ACCESS VALUE
7845: PPM EXFAL FAIL IF ACCESS FAILS
7846: BRN EXIXR ELSE EXIT WITH RESULT IN XR
7847: EJC
7848: *
7849: * VRBLK (CONTINUED)
7850: *
7851: * ENTRY FOR VRSTO (ERROR CASE. THIS ROUTINE IS CALLED FROM
7852: * THE EXECUTED CODE FOR AN ATTEMPT TO MODIFY THE VALUE
7853: * OF A PROTECTED (PATTERN VALUED) NATURAL VARIABLE.
7854: *
7855: B$VRE ENT ENTRY POINT
7856: ERB 042,ATTEMPT TO CHANGE VALUE OF PROTECTED VARIABLE
7857: EJC
7858: *
7859: * VRBLK (CONTINUED)
7860: *
7861: * ENTRY FOR VRTRA (UNTRAPPED CASE). THIS ROUTINE IS CALLED
7862: * FROM THE EXECUTED CODE TO TRANSFER TO A LABEL.
7863: *
7864: * (XR) POINTER TO VRTRA FIELD OF VRBLK
7865: *
7866: B$VRG ENT ENTRY POINT
7867: MOV VRLBO(XR),XR LOAD CODE POINTER
7868: MOV (XR),XL LOAD ENTRY ADDRESS
7869: BRI XL JUMP TO ROUTINE FOR NEXT CODE WORD
7870: EJC
7871: *
7872: * VRBLK (CONTINUED)
7873: *
7874: * ENTRY FOR VRGET (UNTRAPPED CASE). THIS ROUTINE IS CALLED
7875: * FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE.
7876: *
7877: * (XR) POINTS TO VRGET FIELD OF VRBLK
7878: *
7879: B$VRL ENT ENTRY POINT
7880: MOV VRVAL(XR),-(XS) LOAD VALUE ONTO STACK (VRGET = 0)
7881: BRN EXITS OBEY NEXT CODE WORD
7882: EJC
7883: *
7884: * VRBLK (CONTINUED)
7885: *
7886: * ENTRY FOR VRSTO (UNTRAPPED CASE). THIS ROUTINE IS CALLED
7887: * FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE.
7888: *
7889: * (XR) POINTER TO VRSTO FIELD OF VRBLK
7890: *
7891: B$VRS ENT ENTRY POINT
7892: MOV (XS),VRVLO(XR) STORE VALUE, LEAVE ON STACK
7893: BRN EXITS OBEY NEXT CODE WORD
7894: EJC
7895: *
7896: * VRBLK (CONTINUED)
7897: *
7898: * VRTRA (TRAPPED CASE). THIS ROUTINE IS CALLED FROM THE
7899: * GENERATED CODE TO TRANSFER TO A LABEL WHEN A LABEL
7900: * TRACE IS CURRENTLY ACTIVE.
7901: *
7902: B$VRT ENT ENTRY POINT
7903: SUB *VRTRA,XR POINT BACK TO START OF VRBLK
7904: MOV XR,XL COPY VRBLK POINTER
7905: MOV *VRVAL,WA SET NAME OFFSET
7906: MOV VRLBL(XL),XR LOAD POINTER TO TRBLK
7907: BZE KVTRA,BVRT2 JUMP IF TRACE IS OFF
7908: DCV KVTRA ELSE DECREMENT TRACE COUNT
7909: BZE TRFNC(XR),BVRT1 JUMP IF PRINT TRACE CASE
7910: JSR TRXEQ ELSE EXECUTE FULL TRACE
7911: BRN BVRT2 MERGE TO JUMP TO LABEL
7912: *
7913: * HERE FOR PRINT TRACE -- PRINT COLON ( LABEL NAME )
7914: *
7915: BVRT1 JSR PRTSN PRINT STATEMENT NUMBER
7916: MOV XL,XR COPY VRBLK POINTER
7917: MOV =CH$CL,WA COLON
7918: JSR PRTCH PRINT IT
7919: MOV =CH$PP,WA LEFT PAREN
7920: JSR PRTCH PRINT IT
7921: JSR PRTVN PRINT LABEL NAME
7922: MOV =CH$RP,WA RIGHT PAREN
7923: JSR PRTCH PRINT IT
7924: JSR PRTNL TERMINATE LINE
7925: MOV VRLBL(XL),XR POINT BACK TO TRBLK
7926: *
7927: * MERGE HERE TO JUMP TO LABEL
7928: *
7929: BVRT2 MOV TRLBL(XR),XR LOAD POINTER TO ACTUAL CODE
7930: BRI (XR) EXECUTE STATEMENT AT LABEL
7931: EJC
7932: *
7933: * VRBLK (CONTINUED)
7934: *
7935: * ENTRY FOR VRSTO (TRAPPED CASE). THIS ROUTINE IS CALLED
7936: * FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE.
7937: * THIS ENTRY IS USED WHEN A VALUE TRACE OR OUTPUT
7938: * ASSOCIATION IS CURRENTLY ACTIVE.
7939: *
7940: * (XR) POINTER TO VRSTO FIELD OF VRBLK
7941: *
7942: B$VRV ENT ENTRY POINT
7943: MOV (XS),WB LOAD VALUE (LEAVE COPY ON STACK)
7944: SUB *VRSTO,XR POINT TO VRBLK
7945: MOV XR,XL COPY VRBLK POINTER
7946: MOV *VRVAL,WA SET OFFSET
7947: JSR ASIGN CALL ASSIGNMENT ROUTINE
7948: PPM EXFAL FAIL IF ASSIGNMENT FAILS
7949: BRN EXITS ELSE RETURN WITH RESULT ON STACK
7950: EJC
7951: *
7952: * XNBLK
7953: *
7954: * THE ROUTINE FOR AN XNBLK IS NEVER EXECUTED
7955: *
7956: B$XNT ENT BL$XN ENTRY POINT (XNBLK)
7957: EJC
7958: *
7959: * XRBLK
7960: *
7961: * THE ROUTINE FOR AN XRBLK IS NEVER EXECUTED
7962: *
7963: B$XRT ENT BL$XR ENTRY POINT (XRBLK)
7964: *
7965: * MARK ENTRY ADDRESS PAST LAST BLOCK ACTION ROUTINE
7966: *
7967: B$YYY ENT BL$$I LAST BLOCK ROUTINE ENTRY POINT
7968: TTL S P I T B O L -- PATTERN MATCHING ROUTINES
7969: *
7970: * THE FOLLOWING SECTION CONSISTS OF THE PATTERN MATCHING
7971: * ROUTINES. ALL PATTERN NODES CONTAIN A POINTER (PCODE)
7972: * TO ONE OF THE ROUTINES IN THIS SECTION (P$XXX).
7973: *
7974: * NOTE THAT THIS SECTION FOLLOWS THE B$XXX ROUTINES TO
7975: * ENABLE A FAST TEST FOR THE PATTERN DATATYPE.
7976: *
7977: P$AAA ENT BL$$I ENTRY TO MARK FIRST PATTERN
7978: *
7979: *
7980: * THE ENTRY CONDITIONS TO THE MATCH ROUTINE ARE AS FOLLOWS
7981: * (SEE O$PMN, O$PMV, O$PMS AND PROCEDURE MATCH).
7982: *
7983: * STACK CONTENTS.
7984: *
7985: * NAME BASE (O$PMN ONLY)
7986: * NAME OFFSET (O$PMN ONLY)
7987: * TYPE (0-O$PMN, 1-O$PMV, 2-O$PMS)
7988: * PMHBS --------------- INITIAL CURSOR (ZERO)
7989: * INITIAL NODE POINTER
7990: * XS ------------------ =NDABO (ANCHORED), =NDUNA (UNANCH)
7991: *
7992: * REGISTER VALUES.
7993: *
7994: * (XS) SET AS SHOWN IN STACK DIAGRAM
7995: * (XR) POINTER TO INITIAL PATTERN NODE
7996: * (WB) INITIAL CURSOR (ZERO)
7997: *
7998: * GLOBAL PATTERN VALUES
7999: *
8000: * R$PMS POINTER TO SUBJECT STRING SCBLK
8001: * PMSSL LENGTH OF SUBJECT STRING IN CHARS
8002: * PMDFL DOT FLAG, INITIALLY ZERO
8003: * PMHBS SET AS SHOWN IN STACK DIAGRAM
8004: *
8005: * CONTROL IS PASSED BY BRANCHING THROUGH THE PCODE
8006: * FIELD OF THE INITIAL PATTERN NODE (BRI (XR)).
8007: EJC
8008: *
8009: * DESCRIPTION OF ALGORITHM
8010: *
8011: * A PATTERN STRUCTURE IS REPRESENTED AS A LINKED GRAPH
8012: * OF NODES WITH THE FOLLOWING STRUCTURE.
8013: *
8014: * +------------------------------------+
8015: * I PCODE I
8016: * +------------------------------------+
8017: * I PTHEN I
8018: * +------------------------------------+
8019: * I PARM1 I
8020: * +------------------------------------+
8021: * I PARM2 I
8022: * +------------------------------------+
8023: *
8024: * PCODE IS A POINTER TO THE ROUTINE WHICH WILL PERFORM
8025: * THE MATCH OF THIS PARTICULAR NODE TYPE.
8026: *
8027: * PTHEN IS A POINTER TO THE SUCCESSOR NODE. I.E. THE NODE
8028: * TO BE MATCHED IF THE ATTEMPT TO MATCH THIS NODE SUCCEEDS.
8029: * IF THIS IS THE LAST NODE OF THE PATTERN PTHEN POINTS
8030: * TO THE DUMMY NODE NDNTH WHICH INITIATES PATTERN EXIT.
8031: *
8032: * PARM1, PARM2 ARE PARAMETERS WHOSE USE VARIES WITH THE
8033: * PARTICULAR NODE. THEY ARE ONLY PRESENT IF REQUIRED.
8034: *
8035: * ALTERNATIVES ARE HANDLED WITH THE SPECIAL ALTERNATIVE
8036: * NODE WHOSE PARAMETER POINTS TO THE NODE TO BE MATCHED
8037: * IF THERE IS A FAILURE ON THE SUCCESSOR PATH.
8038: *
8039: * THE FOLLOWING EXAMPLE ILLUSTRATES THE MANNER IN WHICH
8040: * THE STRUCTURE IS BUILT UP. THE PATTERN IS
8041: *
8042: * (A / B / C) (D / E) WHERE / IS ALTERNATION
8043: *
8044: * IN THE DIAGRAM, THE NODE MARKED + REPRESENTS AN
8045: * ALTERNATIVE NODE AND THE DOTTED LINE FROM A + NODE
8046: * REPRESENTS THE PARAMETER POINTER TO THE ALTERNATIVE.
8047: *
8048: * +---+ +---+ +---+ +---+
8049: * I + I-----I A I-----I + I-----I D I-----
8050: * +---+ +---+ I +---+ +---+
8051: * . I .
8052: * . I .
8053: * +---+ +---+ I +---+
8054: * I + I-----I B I--I I E I-----
8055: * +---+ +---+ I +---+
8056: * . I
8057: * . I
8058: * +---+ I
8059: * I C I------------I
8060: * +---+
8061: EJC
8062: *
8063: * DURING THE MATCH, THE REGISTERS ARE USED AS FOLLOWS.
8064: *
8065: * (XR) POINTS TO THE CURRENT NODE
8066: * (XL) SCRATCH
8067: * (XS) MAIN STACK POINTER
8068: * (WB) CURSOR (NUMBER OF CHARS MATCHED)
8069: * (WA,WC) SCRATCH
8070: *
8071: * TO KEEP TRACK OF ALTERNATIVES, THE MAIN STACK IS USED AS
8072: * A HISTORY STACK AND CONTAINS TWO WORD ENTRIES.
8073: *
8074: * WORD 1 SAVED CURSOR VALUE
8075: * WORD 2 NODE TO MATCH ON FAILURE
8076: *
8077: * WHEN A FAILURE OCCURS, THE MOST RECENT ENTRY ON THIS
8078: * STACK IS POPPED OFF TO RESTORE THE CURSOR AND POINT
8079: * TO THE NODE TO BE MATCHED AS AN ALTERNATIVE. THE ENTRY
8080: * AT THE BOTTOM OF THE STACK POINTS TO THE FOLLOWING
8081: * SPECIAL NODES DEPENDING ON THE SCAN MODE.
8082: *
8083: * ANCHORED MODE THE BOTTOM ENTRY POINTS TO THE
8084: * SPECIAL NODE NDABO WHICH CAUSES AN
8085: * ABORT. THE CURSOR VALUE STORED
8086: * WITH THIS ENTRY IS ALWAYS ZERO.
8087: *
8088: * UNANCHORED MODE THE BOTTOM ENTRY POINTS TO THE
8089: * SPECIAL NODE NDUNA WHICH MOVES THE
8090: * ANCHOR POINT AND RESTARTS THE MATCH
8091: * THE CURSOR SAVED WITH THIS ENTRY
8092: * IS THE NUMBER OF CHARACTERS WHICH
8093: * LIE BEFORE THE INITIAL ANCHOR POINT
8094: * (I.E. THE NUMBER OF ANCHOR MOVES).
8095: * THIS ENTRY IS THREE WORDS LONG AND
8096: * ALSO CONTAINS THE INITIAL PATTERN.
8097: *
8098: * ENTRIES ARE MADE ON THIS HISTORY STACK BY ALTERNATIVE
8099: * NODES AND BY SOME SPECIAL COMPOUD PATTERNS AS DESCRIBED
8100: * LATER ON. THE FOLLOWING GLOBAL LOCATIONS ARE USED DURING
8101: * PATTERN MATCHING.
8102: *
8103: * R$PMS POINTER TO SUBJECT STRING
8104: * PMSSL LENGTH OF SUBJECT STRING
8105: * PMDFL FLAG SET NON-ZERO FOR DOT PATTERNS
8106: * PMHBS BASE PTR FOR CURRENT HISTORY STACK
8107: *
8108: * THE FOLLOWING EXIT POINTS ARE AVAILABLE TO MATCH ROUTINES
8109: *
8110: * SUCCP SUCCESS IN MATCHING CURRENT NODE
8111: * FAILP FAILURE IN MATCHING CURRENT NODE
8112: EJC
8113: *
8114: * COMPOUND PATTERNS
8115: *
8116: * SOME PATTERNS HAVE IMPLICIT ALTERNATIVES AND THEIR
8117: * REPRESENTATION IN THE PATTERN STRUCTURE CONSISTS OF A
8118: * LINKED SET OF NODES AS INDICATED BY THESE DIAGRAMS.
8119: *
8120: * AS BEFORE, THE + REPRESENTS AN ALTERNATIVE NODE AND
8121: * THE DOTTED LINE FROM A + NODE IS THE PARAMETER POINTER
8122: * TO THE ALTERNATIVE PATTERN.
8123: *
8124: * ARB
8125: * ---
8126: *
8127: * +---+ THIS NODE (P$ARB) MATCHES NULL
8128: * I B I----- AND STACKS CURSOR, SUCCESSOR PTR,
8129: * +---+ CURSOR (COPY) AND A PTR TO NDARC.
8130: *
8131: *
8132: *
8133: *
8134: * BAL
8135: * ---
8136: *
8137: * +---+ THE P$BAL NODE SCANS A BALANCED
8138: * I B I----- STRING AND THEN STACKS A POINTER
8139: * +---+ TO ITSELF ON THE HISTORY STACK.
8140: EJC
8141: *
8142: * COMPOUND PATTERN STRUCTURES (CONTINUED)
8143: *
8144: *
8145: * ARBNO
8146: * -----
8147: *
8148: * +---+ THIS ALTERNATIVE NODE MATCHES NULL
8149: * +----I + I----- THE FIRST TIME AND STACKS A POINTER
8150: * I +---+ TO THE ARGUMENT PATTERN X.
8151: * I .
8152: * I .
8153: * I +---+ NODE (P$ABA) TO STACK CURSOR
8154: * I I A I AND HISTORY STACK BASE PTR.
8155: * I +---+
8156: * I I
8157: * I I
8158: * I +---+ THIS IS THE ARGUMENT PATTERN. AS
8159: * I I X I INDICATED, THE SUCCESSOR OF THE
8160: * I +---+ PATTERN IS THE P$ABC NODE
8161: * I I
8162: * I I
8163: * I +---+ THIS NODE (P$ABC) POPS PMHBS,
8164: * +----I C I STACKS OLD PMHBS AND PTR TO NDABD
8165: * +---+ (UNLESS OPTIMISATION HAS OCCURRED)
8166: *
8167: * STRUCTURE AND EXECUTION OF THIS PATTERN RESEMBLE THOSE OF
8168: * RECURSIVE PATTERN MATCHING AND IMMEDIATE ASSIGNMENT.
8169: * THE ALTERNATIVE NODE AT THE HEAD OF THE STRUCTURE MATCHES
8170: * NULL INITIALLY BUT ON SUBSEQUENT FAILURE ENSURES ATTEMPT
8171: * TO MATCH THE ARGUMENT. BEFORE THE ARGUMENT IS MATCHED
8172: * P$ABA STACKS THE CURSOR,PMHBS AND A PTR TO P$ABB. IF
8173: * THE ARGUMENT CANT BE MATCHED , P$ABB REMOVES THIS SPECIAL
8174: * STACK ENTRY AND FAILS.
8175: * IF ARGUMENT IS MATCHED , P$ABC RESTORES THE OUTER PMHBS
8176: * VALUE (SAVED BY P$ABA) . THEN IF THE ARGUMENT HAS LEFT
8177: * ALTERNATIVES ON STACK IT STACKS THE INNER VALUE OF PMHBS
8178: * AND A PTR TO NDABD. IF ARGUMENT LEFT NOTHING ON THE STACK
8179: * IT OPTIMISES BY REMOVING ITEMS STACKED BY P$ABA. FINALLY
8180: * A CHECK IS MADE THAT ARGUMENT MATCHED MORE THAN THE NULL
8181: * STRING (CHECK IS INTENDED TO PREVENT USELESS LOOPING).
8182: * IF SO THE SUCCESSOR IS AGAIN THE ALTERNATIVE NODE AT THE
8183: * HEAD OF THE STRUCTURE , ENSURING A POSSIBLE EXTRA ATTEMPT
8184: * TO MATCH THE ARG IF NECESSARY. IF NOT , THE SUCCESSOR TO
8185: * ALTERNATIVE IS TAKEN SO AS TO TERMINATE THE LOOP. P$ABD
8186: * RESTORES INNER PMHBS PTR AND FAILS , THUS TRYING TO MATCH
8187: * ALTERNATIVES LEFT BY THE ARBNO ARGUMENT.
8188: EJC
8189: *
8190: * COMPOUND PATTERN STRUCTURES (CONTINUED)
8191: *
8192: * BREAKX
8193: * ------
8194: *
8195: * +---+ THIS NODE IS A BREAK NODE FOR
8196: * +----I B I THE ARGUMENT TO BREAKX, IDENTICAL
8197: * I +---+ TO AN ORDINARY BREAK NODE.
8198: * I I
8199: * I I
8200: * I +---+ THIS ALTERNATIVE NODE STACKS A
8201: * I I + I----- POINTER TO THE BREAKX NODE TO
8202: * I +---+ ALLOW FOR SUBSEQUENT FAILURE
8203: * I .
8204: * I .
8205: * I +---+ THIS IS THE BREAKX NODE ITSELF. IT
8206: * +----I X I MATCHES ONE CHARACTER AND THEN
8207: * +---+ PROCEEDS BACK TO THE BREAK NODE.
8208: *
8209: *
8210: *
8211: *
8212: * FENCE
8213: * -----
8214: *
8215: * +---+ THE FENCE NODE MATCHES NULL AND
8216: * I F I----- STACKS A POINTER TO NODE NDABO TO
8217: * +---+ ABORT ON A SUBSEQUENT REMATCH
8218: *
8219: *
8220: *
8221: *
8222: * SUCCEED
8223: * -------
8224: *
8225: * +---+ THE NODE FOR SUCCEED MATCHES NULL
8226: * I S I----- AND STACKS A POINTER TO ITSELF
8227: * +---+ TO REPEAT THE MATCH ON A FAILURE.
8228: EJC
8229: *
8230: * COMPOUND PATTERNS (CONTINUED)
8231: *
8232: * BINARY DOT (PATTERN ASSIGNMENT)
8233: * -------------------------------
8234: *
8235: * +---+ THIS NODE (P$PAA) SAVES THE CURRENT
8236: * I A I CURSOR AND A POINTER TO THE
8237: * +---+ SPECIAL NODE NDPAB ON THE STACK.
8238: * I
8239: * I
8240: * +---+ THIS IS THE STRUCTURE FOR THE
8241: * I X I PATTERN LEFT ARGUMENT OF THE
8242: * +---+ PATTERN ASSIGNMENT CALL.
8243: * I
8244: * I
8245: * +---+ THIS NODE (P$PAC) SAVES THE CURSOR,
8246: * I C I----- A PTR TO ITSELF, THE CURSOR (COPY)
8247: * +---+ AND A PTR TO NDPAD ON THE STACK.
8248: *
8249: *
8250: * THE FUNCTION OF THE MATCH ROUTINE FOR NDPAB (P$PAB)
8251: * IS SIMPLY TO UNSTACK ITSELF AND FAIL BACK ONTO THE STACK.
8252: *
8253: * THE MATCH ROUTINE FOR P$PAC ALSO SETS THE GLOBAL PATTERN
8254: * FLAG PMDFL NON-ZERO TO INDICATE THAT PATTERN ASSIGNMENTS
8255: * MAY HAVE OCCURED IN THE PATTERN MATCH
8256: *
8257: * IF PMDFL IS SET AT THE END OF THE MATCH (SEE P$NTH), THE
8258: * HISTORY STACK IS SCANNED FOR MATCHING NDPAB-NDPAD PAIRS
8259: * AND THE CORRESPONDING PATTERN ASSIGNMENTS ARE EXECUTED.
8260: *
8261: * THE FUNCTION OF THE MATCH ROUTINE FOR NDPAD (P$PAD)
8262: * IS SIMPLY TO REMOVE ITS ENTRY FROM THE STACK AND FAIL.
8263: * THIS INCLUDES REMOVING THE SPECIAL NODE POINTER STORED
8264: * IN ADDITION TO THE STANDARD TWO ENTRIES ON THE STACK.
8265: EJC
8266: *
8267: * COMPOUNT PATTERN STRUCTURES (CONTINUED)
8268: *
8269: * FENCE (FUNCTION)
8270: * ----------------
8271: *
8272: * +---+ THIS NODE (P$FNA) SAVES THE
8273: * I A I CURRENT HISTORY STACK AND A
8274: * +---+ POINTER TO NDFNB ON THE STACK.
8275: * I
8276: * I
8277: * +---+ THIS IS THE PATTERN STRUCTURE
8278: * I X I GIVEN AS THE ARGUMENT TO THE
8279: * +---+ FENCE FUNCTION.
8280: * I
8281: * I
8282: * +---+ THIS NODE P$FNC RESTORES THE OUTER
8283: * I C I HISTORY STACK PTR SAVED IN P$FNA,
8284: * +---+ AND STACKS THE INNER STACK BASE
8285: * PTR AND A POINTER TO NDFND ON THE
8286: * STACK.
8287: *
8288: * NDFNB (F$FNB) SIMPLY IS THE FAILURE EXIT FOR PATTERN
8289: * ARGUMENT FAILURE, AND IT POPS ITSELF AND FAILS ONTO THE
8290: * STACK.
8291: *
8292: * THE MATCH ROUTINE P$FNC ALLOWS FOR AN OPTIMIZATION WHEN
8293: * THE FENCE PATTERN LEAVES NO ALTERNATIVES. IN THIS CASE,
8294: * THE NDFNB ENTRY IS POPPED, AND THE MATCH CONTINUES.
8295: *
8296: * NDFND (P$FND) IS ENTERED WHEN THE PATTERN FAILS AFTER
8297: * GOING THROUGH A NON-OPTIMIZED P$FNC, AND IT POPS THE
8298: * STACK BACK PAST THE INNTER STACK BASE CREATED BY P$FNA
8299: EJC
8300: *
8301: * COMPOUND PATTERNS (CONTINUED)
8302: *
8303: * EXPRESSION PATTERNS (RECURSIVE PATTERN MATCHES)
8304: * -----------------------------------------------
8305: *
8306: * INITIAL ENTRY FOR A PATTERN NODE IS TO THE ROUTINE P$EXA.
8307: * IF THE EVALUATED RESULT OF THE EXPRESSION IS ITSELF A
8308: * PATTERN, THEN THE FOLLOWING STEPS ARE TAKEN TO ARRANGE
8309: * FOR PROPER RECURSIVE PROCESSING.
8310: *
8311: * 1) A POINTER TO THE CURRENT NODE (THE P$EXA NODE) IS
8312: * STORED ON THE HISTORY STACK WITH A DUMMY CURSOR.
8313: *
8314: * 2) A SPECIAL HISTORY STACK ENTRY IS MADE IN WHICH THE
8315: * NODE POINTER POINTS TO NDEXB, AND THE CURSOR VALUE
8316: * IS THE SAVED VALUE OF PMHBS ON ENTRY TO THIS NODE.
8317: * THE MATCH ROUTINE FOR NDEXB (P$EXB) RESTORES PMHBS
8318: * FROM THIS CURSOR ENTRY, POPS OFF THE P$EXA NODE
8319: * POINTER AND FAILS.
8320: *
8321: * 3) THE RESULTING HISTORY STACK POINTER IS SAVED IN
8322: * PMHBS TO ESTABLISH A NEW LEVEL OF HISTORY STACK.
8323: *
8324: * AFTER MATCHING A PATTERN, THE END OF MATCH ROUTINE GETS
8325: * CONTROL (P$NTH). THIS ROUTINE PROCEEDS AS FOLLOWS.
8326: *
8327: * 1) LOAD THE CURRENT VALUE OF PMHBS AND RECOGNIZE THE
8328: * OUTER LEVEL CASE BY THE FACT THAT THE ASSOCIATED
8329: * CURSOR IN THIS CASE IS THE PATTERN MATCH TYPE CODE
8330: * WHICH IS LESS THAN 3. TERMINATE THE MATCH IN THIS
8331: * CASE AND CONTINUE EXECUTION OF THE PROGRAM.
8332: *
8333: * 2) OTHERWISE MAKE A SPECIAL HISTORY STACK ENTRY IN
8334: * WHICH THE NODE POINTER POINTS TO THE SPECIAL NODE
8335: * NDEXC AND THE CURSOR IS THE CURRENT VALUE OF PMHBS.
8336: * THE MATCH ROUTINE FOR NDEXC (P$EXC) RESETS PMHBS TO
8337: * THIS (INNER) VALUE AND AND THEN FAILS.
8338: *
8339: * 3) USING THE HISTORY STACK ENTRY MADE ON STARTING THE
8340: * EXPRESSION (ACCESSIBLE WITH THE CURRENT VALUE OF
8341: * PMHBS), RESTORE THE P$EXA NODE POINTER AND THE OLD
8342: * PMHBS SETTING. TAKE THE SUCCESSOR AND CONTINUE.
8343: *
8344: * AN OPTIMIZATION IS POSSIBLE IF THE EXPRESSION PATTERN
8345: * MAKES NO ENTRIES ON THE HISTORY STACK. IN THIS CASE,
8346: * INSTEAD OF BUILDING THE P$EXC NODE IN STEP 2, IT IS MORE
8347: * EFFICIENT TO SIMPLY POP OFF THE P$EXB ENTRY AND ITS
8348: * ASSOCIATED NODE POINTER. THE EFFECT IS THE SAME.
8349: EJC
8350: *
8351: * COMPOUND PATTERNS (CONTINUED)
8352: *
8353: * BINARY DOLLAR (IMMEDIATE ASSIGNMENT)
8354: * ------------------------------------
8355: *
8356: * +---+ THIS NODE (P$IMA) STACKS THE CURSOR
8357: * I A I PMHBS AND A PTR TO NDIMB AND RESETS
8358: * +---+ THE STACK PTR PMHBS.
8359: * I
8360: * I
8361: * +---+ THIS IS THE LEFT STRUCTURE FOR THE
8362: * I X I PATTERN LEFT ARGUMENT OF THE
8363: * +---+ IMMEDIATE ASSIGNMENT CALL.
8364: * I
8365: * I
8366: * +---+ THIS NODE (P$IMC) PERFORMS THE
8367: * I C I----- ASSIGNMENT, POPS PMHBS AND STACKS
8368: * +---+ THE OLD PMHBS AND A PTR TO NDIMD.
8369: *
8370: *
8371: * THE STRUCTURE AND EXECUTION OF THIS PATTERN ARE SIMILAR
8372: * TO THOSE OF THE RECURSIVE EXPRESSION PATTERN MATCHING.
8373: *
8374: * THE MATCH ROUTINE FOR NDIMB (P$IMB) RESTORES THE OUTER
8375: * LEVEL VALUE OF PMHBS, UNSTACKS THE SAVED CURSOR AND FAILS
8376: *
8377: * THE MATCH ROUTINE P$IMC USES THE CURRENT VALUE OF PMHBS
8378: * TO LOCATE THE P$IMB ENTRY. THIS ENTRY IS USED TO MAKE
8379: * THE ASSIGNMENT AND RESTORE THE OUTER LEVEL VALUE OF
8380: * PMHBS. FINALLY, THE INNER LEVEL VALUE OF PMHBS AND A
8381: * POINTER TO THE SPECIAL NODE NDIMD ARE STACKED.
8382: *
8383: * THE MATCH ROUTINE FOR NDIMD (P$IMD) RESTORES THE INNER
8384: * LEVEL VALUE OF PMHBS AND FAILS BACK INTO THE STACK.
8385: *
8386: * AN OPTIMIZATION OCCURS IF THE INNER PATTERN MAKES NO
8387: * ENTRIES ON THE HISTORY STACK. IN THIS CASE, P$IMC POPS
8388: * THE P$IMB ENTRY INSTEAD OF MAKING A P$IMD ENTRY.
8389: EJC
8390: *
8391: * ARBNO
8392: *
8393: * SEE COMPOUND PATTERNS SECTION FOR STUCTURE AND
8394: * ALGORITHM FOR MATCHING THIS NODE TYPE.
8395: *
8396: * NO PARAMETERS
8397: *
8398: P$ABA ENT BL$P0 P0BLK
8399: MOV WB,-(XS) STACK CURSOR
8400: MOV XR,-(XS) STACK DUMMY NODE PTR
8401: MOV PMHBS,-(XS) STACK OLD STACK BASE PTR
8402: MOV =NDABB,-(XS) STACK PTR TO NODE NDABB
8403: MOV XS,PMHBS STORE NEW STACK BASE PTR
8404: BRN SUCCP SUCCEED
8405: EJC
8406: *
8407: * ARBNO (REMOVE P$ABA SPECIAL STACK ENTRY)
8408: *
8409: * NO PARAMETERS (DUMMY PATTERN)
8410: *
8411: P$ABB ENT ENTRY POINT
8412: MOV WB,PMHBS RESTORE HISTORY STACK BASE PTR
8413: BRN FLPOP FAIL AND POP DUMMY NODE PTR
8414: EJC
8415: *
8416: * ARBNO (CHECK IF ARG MATCHED NULL STRING)
8417: *
8418: * NO PARAMETERS (DUMMY PATTERN)
8419: *
8420: P$ABC ENT BL$P0 P0BLK
8421: MOV PMHBS,XT KEEP P$ABB STACK BASE
8422: MOV 3(XT),WA LOAD INITIAL CURSOR
8423: MOV 1(XT),PMHBS RESTORE OUTER STACK BASE PTR
8424: BEQ XT,XS,PABC1 JUMP IF NO HISTORY STACK ENTRIES
8425: MOV XT,-(XS) ELSE SAVE INNER PMHBS ENTRY
8426: MOV =NDABD,-(XS) STACK PTR TO SPECIAL NODE NDABD
8427: BRN PABC2 MERGE
8428: *
8429: * OPTIMISE CASE OF NO EXTRA ENTRIES ON STACK FROM ARBNO ARG
8430: *
8431: PABC1 ADD *NUM04,XS REMOVE NDABB ENTRY AND CURSOR
8432: *
8433: * MERGE TO CHECK FOR MATCHING OF NULL STRING
8434: *
8435: PABC2 BNE WA,WB,SUCCP ALLOW FURTHER ATTEMPT IF NON-NULL
8436: MOV PTHEN(XR),XR BYPASS ALTERNATIVE NODE SO AS TO ..
8437: BRN SUCCP ... REFUSE FURTHER MATCH ATTEMPTS
8438: EJC
8439: *
8440: * ARBNO (TRY FOR ALTERNATIVES IN ARBNO ARGUMENT)
8441: *
8442: * NO PARAMETERS (DUMMY PATTERN)
8443: *
8444: P$ABD ENT ENTRY POINT
8445: MOV WB,PMHBS RESTORE INNER STACK BASE PTR
8446: BRN FAILP AND FAIL
8447: EJC
8448: *
8449: * ABORT
8450: *
8451: * NO PARAMETERS
8452: *
8453: P$ABO ENT BL$P0 P0BLK
8454: BRN EXFAL SIGNAL STATEMENT FAILURE
8455: EJC
8456: *
8457: * ALTERNATION
8458: *
8459: * PARM1 ALTERNATIVE NODE
8460: *
8461: P$ALT ENT BL$P1 P1BLK
8462: MOV WB,-(XS) STACK CURSOR
8463: MOV PARM1(XR),-(XS) STACK POINTER TO ALTERNATIVE
8464: CHK CHECK FOR STACK OVERFLOW
8465: BRN SUCCP IF ALL OK, THEN SUCCEED
8466: EJC
8467: *
8468: * ANY (ONE CHARACTER ARGUMENT) (1-CHAR STRING ALSO)
8469: *
8470: * PARM1 CHARACTER ARGUMENT
8471: *
8472: P$ANS ENT BL$P1 P1BLK
8473: BEQ WB,PMSSL,FAILP FAIL IF NO CHARS LEFT
8474: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING
8475: PLC XL,WB POINT TO CURRENT CHARACTER
8476: LCH WA,(XL) LOAD CURRENT CHARACTER
8477: BNE WA,PARM1(XR),FAILP FAIL IF NO MATCH
8478: ICV WB ELSE BUMP CURSOR
8479: BRN SUCCP AND SUCCEED
8480: EJC
8481: *
8482: * ANY (MULTI-CHARACTER ARGUMENT CASE)
8483: *
8484: * PARM1 POINTER TO CTBLK
8485: * PARM2 BIT MASK TO SELECT BIT IN CTBLK
8486: *
8487: P$ANY ENT BL$P2 P2BLK
8488: *
8489: * EXPRESSION ARGUMENT CASE MERGES HERE
8490: *
8491: PANY1 BEQ WB,PMSSL,FAILP FAIL IF NO CHARACTERS LEFT
8492: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING
8493: PLC XL,WB GET CHAR PTR TO CURRENT CHARACTER
8494: LCH WA,(XL) LOAD CURRENT CHARACTER
8495: MOV PARM1(XR),XL POINT TO CTBLK
8496: WTB WA CHANGE TO BYTE OFFSET
8497: ADD WA,XL POINT TO ENTRY IN CTBLK
8498: MOV CTCHS(XL),WA LOAD WORD FROM CTBLK
8499: ANB PARM2(XR),WA AND WITH SELECTED BIT
8500: ZRB WA,FAILP FAIL IF NO MATCH
8501: ICV WB ELSE BUMP CURSOR
8502: BRN SUCCP AND SUCCEED
8503: EJC
8504: *
8505: * ANY (EXPRESSION ARGUMENT)
8506: *
8507: * PARM1 EXPRESSION POINTER
8508: *
8509: P$AYD ENT BL$P1 P1BLK
8510: JSR EVALS EVALUATE STRING ARGUMENT
8511: ERR 043,ANY EVALUATED ARGUMENT IS NOT STRING
8512: PPM FAILP FAIL IF EVALUATION FAILURE
8513: PPM PANY1 MERGE MULTI-CHAR CASE IF OK
8514: EJC
8515: *
8516: * P$ARB INITIAL ARB MATCH
8517: *
8518: * NO PARAMETERS
8519: *
8520: * THE P$ARB NODE IS PART OF A COMPOUND PATTERN STRUCTURE
8521: * FOR AN ARB PATTERN (SEE DESCRIPTION OF COMPOUND PATTERNS)
8522: *
8523: P$ARB ENT BL$P0 P0BLK
8524: MOV PTHEN(XR),XR LOAD SUCCESSOR POINTER
8525: MOV WB,-(XS) STACK DUMMY CURSOR
8526: MOV XR,-(XS) STACK SUCCESSOR POINTER
8527: MOV WB,-(XS) STACK CURSOR
8528: MOV =NDARC,-(XS) STACK PTR TO SPECIAL NODE NDARC
8529: BRI (XR) EXECUTE NEXT NODE MATCHING NULL
8530: EJC
8531: *
8532: * P$ARC EXTEND ARB MATCH
8533: *
8534: * NO PARAMETERS (DUMMY PATTERN)
8535: *
8536: P$ARC ENT ENTRY POINT
8537: BEQ WB,PMSSL,FLPOP FAIL AND POP STACK TO SUCCESSOR
8538: ICV WB ELSE BUMP CURSOR
8539: MOV WB,-(XS) STACK UPDATED CURSOR
8540: MOV XR,-(XS) RESTACK POINTER TO NDARC NODE
8541: MOV 2(XS),XR LOAD SUCCESSOR POINTER
8542: BRI (XR) OFF TO REEXECUTE SUCCESSOR NODE
8543: EJC
8544: *
8545: * BAL
8546: *
8547: * NO PARAMETERS
8548: *
8549: * THE P$BAL NODE IS PART OF THE COMPOUND STRUCTURE BUILT
8550: * FOR BAL (SEE SECTION ON COMPOUND PATTERNS).
8551: *
8552: P$BAL ENT BL$P0 P0BLK
8553: ZER WC ZERO PARENTHESES LEVEL COUNTER
8554: MOV R$PMS,XL POINT TO SUBJECT STRING
8555: PLC XL,WB POINT TO CURRENT CHARACTER
8556: BRN PBAL2 JUMP INTO SCAN LOOP
8557: *
8558: * LOOP TO SCAN OUT CHARACTERS
8559: *
8560: PBAL1 LCH WA,(XL)+ LOAD NEXT CHARACTER, BUMP POINTER
8561: ICV WB PUSH CURSOR FOR CHARACTER
8562: BEQ WA,=CH$PP,PBAL3 JUMP IF LEFT PAREN
8563: BEQ WA,=CH$RP,PBAL4 JUMP IF RIGHT PAREN
8564: BZE WC,PBAL5 ELSE SUCCEED IF AT OUTER LEVEL
8565: *
8566: * HERE AFTER PROCESSING ONE CHARACTER
8567: *
8568: PBAL2 BNE WB,PMSSL,PBAL1 LOOP BACK UNLESS END OF STRING
8569: BRN FAILP IN WHICH CASE, FAIL
8570: *
8571: * HERE ON LEFT PAREN
8572: *
8573: PBAL3 ICV WC BUMP PAREN LEVEL
8574: BRN PBAL2 LOOP BACK TO CHECK END OF STRING
8575: *
8576: * HERE FOR RIGHT PAREN
8577: *
8578: PBAL4 BZE WC,FAILP FAIL IF NO MATCHING LEFT PAREN
8579: DCV WC ELSE DECREMENT LEVEL COUNTER
8580: BNZ WC,PBAL2 LOOP BACK IF NOT AT OUTER LEVEL
8581: *
8582: * HERE AFTER SUCCESSFULLY SCANNING A BALANCED STRING
8583: *
8584: PBAL5 MOV WB,-(XS) STACK CURSOR
8585: MOV XR,-(XS) STACK PTR TO BAL NODE FOR EXTEND
8586: BRN SUCCP AND SUCCEED
8587: EJC
8588: *
8589: * BREAK (EXPRESSION ARGUMENT)
8590: *
8591: * PARM1 EXPRESSION POINTER
8592: *
8593: P$BKD ENT BL$P1 P1BLK
8594: JSR EVALS EVALUATE STRING EXPRESSION
8595: ERR 044,BREAK EVALUATED ARGUMENT IS NOT STRING
8596: PPM FAILP FAIL IF EVALUATION FAILS
8597: PPM PBRK1 MERGE WITH MULTI-CHAR CASE IF OK
8598: EJC
8599: *
8600: * BREAK (ONE CHARACTER ARGUMENT)
8601: *
8602: * PARM1 CHARACTER ARGUMENT
8603: *
8604: P$BKS ENT BL$P1 P1BLK
8605: MOV PMSSL,WC GET SUBJECT STRING LENGTH
8606: SUB WB,WC GET NUMBER OF CHARACTERS LEFT
8607: BZE WC,FAILP FAIL IF NO CHARACTERS LEFT
8608: LCT WC,WC SET COUNTER FOR CHARS LEFT
8609: MOV R$PMS,XL POINT TO SUBJECT STRING
8610: PLC XL,WB POINT TO CURRENT CHARACTER
8611: *
8612: * LOOP TO SCAN TILL BREAK CHARACTER FOUND
8613: *
8614: PBKS1 LCH WA,(XL)+ LOAD NEXT CHAR, BUMP POINTER
8615: BEQ WA,PARM1(XR),SUCCP SUCCEED IF BREAK CHARACTER FOUND
8616: ICV WB ELSE PUSH CURSOR
8617: BCT WC,PBKS1 LOOP BACK IF MORE TO GO
8618: BRN FAILP FAIL IF END OF STRING, NO BREAK CHR
8619: EJC
8620: *
8621: * BREAK (MULTI-CHARACTER ARGUMENT)
8622: *
8623: * PARM1 POINTER TO CTBLK
8624: * PARM2 BIT MASK TO SELECT BIT COLUMN
8625: *
8626: P$BRK ENT BL$P2 P2BLK
8627: *
8628: * EXPRESSION ARGUMENT MERGES HERE
8629: *
8630: PBRK1 MOV PMSSL,WC LOAD SUBJECT STRING LENGTH
8631: SUB WB,WC GET NUMBER OF CHARACTERS LEFT
8632: BZE WC,FAILP FAIL IF NO CHARACTERS LEFT
8633: LCT WC,WC SET COUNTER FOR CHARACTERS LEFT
8634: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING
8635: PLC XL,WB POINT TO CURRENT CHARACTER
8636: MOV XR,PSAVE SAVE NODE POINTER
8637: *
8638: * LOOP TO SEARCH FOR BREAK CHARACTER
8639: *
8640: PBRK2 LCH WA,(XL)+ LOAD NEXT CHAR, BUMP POINTER
8641: MOV PARM1(XR),XR LOAD POINTER TO CTBLK
8642: WTB WA CONVERT TO BYTE OFFSET
8643: ADD WA,XR POINT TO CTBLK ENTRY
8644: MOV CTCHS(XR),WA LOAD CTBLK WORD
8645: MOV PSAVE,XR RESTORE NODE POINTER
8646: ANB PARM2(XR),WA AND WITH SELECTED BIT
8647: NZB WA,SUCCP SUCCEED IF BREAK CHARACTER FOUND
8648: ICV WB ELSE PUSH CURSOR
8649: BCT WC,PBRK2 LOOP BACK UNLESS END OF STRING
8650: BRN FAILP FAIL IF END OF STRING, NO BREAK CHR
8651: EJC
8652: *
8653: * BREAKX (EXTENSION)
8654: *
8655: * THIS IS THE ENTRY WHICH CAUSES AN EXTENSION OF A BREAKX
8656: * MATCH WHEN FAILURE OCCURS. SEE SECTION ON COMPOUND
8657: * PATTERNS FOR FULL DETAILS OF BREAKX MATCHING.
8658: *
8659: * NO PARAMETERS
8660: *
8661: P$BKX ENT BL$P0 P0BLK
8662: ICV WB STEP CURSOR PAST PREVIOUS BREAK CHR
8663: BRN SUCCP SUCCEED TO REMATCH BREAK
8664: EJC
8665: *
8666: * BREAKX (EXPRESSION ARGUMENT)
8667: *
8668: * SEE SECTION ON COMPOUND PATTERNS FOR FULL STRUCTURE OF
8669: * BREAKX PATTERN. THE ACTUAL CHARACTER MATCHING USES A
8670: * BREAK NODE. HOWEVER, THE ENTRY FOR THE EXPRESSION
8671: * ARGUMENT CASE IS SEPARATED TO GET PROPER ERROR MESSAGES.
8672: *
8673: * PARM1 EXPRESSION POINTER
8674: *
8675: P$BXD ENT BL$P1 P1BLK
8676: JSR EVALS EVALUATE STRING ARGUMENT
8677: ERR 045,BREAKX EVALUATED ARGUMENT IS NOT STRING
8678: PPM FAILP FAIL IF EVALUATION FAILS
8679: PPM PBRK1 MERGE WITH BREAK IF ALL OK
8680: EJC
8681: *
8682: * CURSOR ASSIGNMENT
8683: *
8684: * PARM1 NAME BASE
8685: * PARM2 NAME OFFSET
8686: *
8687: P$CAS ENT BL$P2 P2BLK
8688: MOV XR,-(XS) SAVE NODE POINTER
8689: MOV WB,-(XS) SAVE CURSOR
8690: MOV PARM1(XR),XL LOAD NAME BASE
8691: MTI WB LOAD CURSOR AS INTEGER
8692: MOV PARM2(XR),WB LOAD NAME OFFSET
8693: JSR ICBLD GET ICBLK FOR CURSOR VALUE
8694: MOV WB,WA MOVE NAME OFFSET
8695: MOV XR,WB MOVE VALUE TO ASSIGN
8696: JSR ASINP PERFORM ASSIGNMENT
8697: PPM FLPOP FAIL ON ASSIGNMENT FAILURE
8698: MOV (XS)+,WB ELSE RESTORE CURSOR
8699: MOV (XS)+,XR RESTORE NODE POINTER
8700: BRN SUCCP AND SUCCEED MATCHING NULL
8701: EJC
8702: *
8703: * EXPRESSION NODE (P$EXA, INITIAL ENTRY)
8704: *
8705: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
8706: * ALGORITHMS FOR HANDLING EXPRESSION NODES.
8707: *
8708: * PARM1 EXPRESSION POINTER
8709: *
8710: P$EXA ENT BL$P1 P1BLK
8711: JSR EVALP EVALUATE EXPRESSION
8712: PPM FAILP FAIL IF EVALUATION FAILS
8713: BLO WA,=P$AAA,PEXA1 JUMP IF RESULT IS NOT A PATTERN
8714: *
8715: * HERE IF RESULT OF EXPRESSION IS A PATTERN
8716: *
8717: MOV WB,-(XS) STACK DUMMY CURSOR
8718: MOV XR,-(XS) STACK PTR TO P$EXA NODE
8719: MOV PMHBS,-(XS) STACK HISTORY STACK BASE PTR
8720: MOV =NDEXB,-(XS) STACK PTR TO SPECIAL NODE NDEXB
8721: MOV XS,PMHBS STORE NEW STACK BASE POINTER
8722: MOV XL,XR COPY NODE POINTER
8723: BRI (XR) MATCH FIRST NODE IN EXPRESSION PAT
8724: *
8725: * HERE IF RESULT OF EXPRESSION IS NOT A PATTERN
8726: *
8727: PEXA1 BEQ WA,=B$SCL,PEXA2 JUMP IF IT IS ALREADY A STRING
8728: MOV XL,-(XS) ELSE STACK RESULT
8729: MOV XR,XL SAVE NODE POINTER
8730: JSR GTSTG CONVERT RESULT TO STRING
8731: ERR 046,EXPRESSION DOES NOT EVALUATE TO PATTERN
8732: MOV XR,WC COPY STRING POINTER
8733: MOV XL,XR RESTORE NODE POINTER
8734: MOV WC,XL COPY STRING POINTER AGAIN
8735: *
8736: * MERGE HERE WITH STRING POINTER IN XL
8737: *
8738: PEXA2 BZE SCLEN(XL),SUCCP JUST SUCCEED IF NULL STRING
8739: BRN PSTR1 ELSE MERGE WITH STRING CIRCUIT
8740: EJC
8741: *
8742: * EXPRESSION NODE (P$EXB, REMOVE NDEXB ENTRY)
8743: *
8744: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
8745: * ALGORITHMS FOR HANDLING EXPRESSION NODES.
8746: *
8747: * NO PARAMETERS (DUMMY PATTERN)
8748: *
8749: P$EXB ENT ENTRY POINT
8750: MOV WB,PMHBS RESTORE OUTER LEVEL STACK POINTER
8751: BRN FLPOP FAIL AND POP P$EXA NODE PTR
8752: EJC
8753: *
8754: * EXPRESSION NODE (P$EXC, REMOVE NDEXC ENTRY)
8755: *
8756: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
8757: * ALGORITHMS FOR HANDLING EXPRESSION NODES.
8758: *
8759: * NO PARAMETERS (DUMMY PATTERN)
8760: *
8761: P$EXC ENT ENTRY POINT
8762: MOV WB,PMHBS RESTORE INNER STACK BASE POINTER
8763: BRN FAILP AND FAIL INTO EXPR PATTERN ALTERNVS
8764: EJC
8765: *
8766: * FAIL
8767: *
8768: * NO PARAMETERS
8769: *
8770: P$FAL ENT BL$P0 P0BLK
8771: BRN FAILP JUST SIGNAL FAILURE
8772: EJC
8773: *
8774: * FENCE
8775: *
8776: * SEE COMPOUND PATTERNS SECTION FOR THE STRUCTURE AND
8777: * ALGORITHM FOR MATCHING THIS NODE TYPE.
8778: *
8779: * NO PARAMETERS
8780: *
8781: P$FEN ENT BL$P0 P0BLK
8782: MOV WB,-(XS) STACK DUMMY CURSOR
8783: MOV =NDABO,-(XS) STACK PTR TO ABORT NODE
8784: BRN SUCCP AND SUCCEED MATCHING NULL
8785: EJC
8786: *
8787: * FENCE (FUNCTION)
8788: *
8789: * SEE COMPOUND PATTERNS COMMENTS AT START OF THIS SECTION
8790: * FOR DETAILS OF SCHEME
8791: *
8792: * NO PARAMETERS
8793: *
8794: P$FNA ENT BL$P0 P0BLK
8795: MOV PMHBS,-(XS) STACK CURRENT HISTORY STACK BASE
8796: MOV =NDFNB,-(XS) STACK INDIR PTR TO P$FNB (FAILURE)
8797: MOV XS,PMHBS BEGIN NEW HISTORY STACK
8798: BRN SUCCP SUCCEED
8799: EJC
8800: *
8801: * FENCE (FUNCTION) (RESET HISTORY STACK AND FAIL)
8802: *
8803: * NO PARAMETERS (DUMMY PATTERN)
8804: *
8805: P$FNB ENT BL$P0 P0BLK
8806: MOV WB,PMHBS RESTORE OUTER PMHBS STACK BASE
8807: BRN FAILP ...AND FAIL
8808: EJC
8809: *
8810: * FENCE (FUNCTION) (MAKE FENCE TRAP ENTRY ON STACK)
8811: *
8812: * NO PARAMETERS (DUMMY PATTERN)
8813: *
8814: P$FNC ENT BL$P0 P0BLK
8815: MOV PMHBS,XT GET INNER STACK BASE PTR
8816: MOV NUM01(XT),PMHBS RESTORE OUTER STACK BASE
8817: BEQ XT,XS,PFNC1 OPTIMIZE IF NO ALTERNATIVES
8818: MOV XT,-(XS) ELSE STACK INNER STACK BASE
8819: MOV =NDFND,-(XS) STACK PTR TO NDFND
8820: BRN SUCCP SUCCEED
8821: *
8822: * HERE WHEN FENCE FUNCTION LEFT NOTHING ON THE STACK
8823: *
8824: PFNC1 ADD *NUM02,XS POP OFF P$FNB ENTRY
8825: BRN SUCCP SUCCEED
8826: EJC
8827: *
8828: * FENCE (FUNCTION) (SKIP PAST ALTERNATIVES ON FAILURE)
8829: *
8830: * NO PARAMETERS (DUMMY PATTERN)
8831: *
8832: P$FND ENT BL$P0 P0BLK
8833: MOV WB,XS POP STACK TO FENCE() HISTORY BASE
8834: BRN FLPOP POP BASE ENTRY AND FAIL
8835: EJC
8836: *
8837: * IMMEDIATE ASSIGNMENT (INITIAL ENTRY, SAVE CURRENT CURSOR)
8838: *
8839: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
8840: * STRUCTURE AND ALGORITHM FOR MATCHING THIS NODE TYPE.
8841: *
8842: * NO PARAMETERS
8843: *
8844: P$IMA ENT BL$P0 P0BLK
8845: MOV WB,-(XS) STACK CURSOR
8846: MOV XR,-(XS) STACK DUMMY NODE POINTER
8847: MOV PMHBS,-(XS) STACK OLD STACK BASE POINTER
8848: MOV =NDIMB,-(XS) STACK PTR TO SPECIAL NODE NDIMB
8849: MOV XS,PMHBS STORE NEW STACK BASE POINTER
8850: BRN SUCCP AND SUCCEED
8851: EJC
8852: *
8853: * IMMEDIATE ASSIGNMENT (REMOVE CURSOR MARK ENTRY)
8854: *
8855: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
8856: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
8857: *
8858: * NO PARAMETERS (DUMMY PATTERN)
8859: *
8860: P$IMB ENT ENTRY POINT
8861: MOV WB,PMHBS RESTORE HISTORY STACK BASE PTR
8862: BRN FLPOP FAIL AND POP DUMMY NODE PTR
8863: EJC
8864: *
8865: * IMMEDIATE ASSIGNMENT (PERFORM ACTUAL ASSIGNMENT)
8866: *
8867: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
8868: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
8869: *
8870: * PARM1 NAME BASE OF VARIABLE
8871: * PARM2 NAME OFFSET OF VARIABLE
8872: *
8873: P$IMC ENT BL$P2 P2BLK
8874: MOV PMHBS,XT LOAD POINTER TO P$IMB ENTRY
8875: MOV WB,WA COPY FINAL CURSOR
8876: MOV 3(XT),WB LOAD INITIAL CURSOR
8877: MOV 1(XT),PMHBS RESTORE OUTER STACK BASE POINTER
8878: BEQ XT,XS,PIMC1 JUMP IF NO HISTORY STACK ENTRIES
8879: MOV XT,-(XS) ELSE SAVE INNER PMHBS POINTER
8880: MOV =NDIMD,-(XS) AND A PTR TO SPECIAL NODE NDIMD
8881: BRN PIMC2 MERGE
8882: *
8883: * HERE IF NO ENTRIES MADE ON HISTORY STACK
8884: *
8885: PIMC1 ADD *NUM04,XS REMOVE NDIMB ENTRY AND CURSOR
8886: *
8887: * MERGE HERE TO PERFORM ASSIGNMENT
8888: *
8889: PIMC2 MOV WA,-(XS) SAVE CURRENT (FINAL) CURSOR
8890: MOV XR,-(XS) SAVE CURRENT NODE POINTER
8891: MOV R$PMS,XL POINT TO SUBJECT STRING
8892: SUB WB,WA COMPUTE SUBSTRING LENGTH
8893: JSR SBSTR BUILD SUBSTRING
8894: MOV XR,WB MOVE RESULT
8895: MOV (XS),XR RELOAD NODE POINTER
8896: MOV PARM1(XR),XL LOAD NAME BASE
8897: MOV PARM2(XR),WA LOAD NAME OFFSET
8898: JSR ASINP PERFORM ASSIGNMENT
8899: PPM FLPOP FAIL IF ASSIGNMENT FAILS
8900: MOV (XS)+,XR ELSE RESTORE NODE POINTER
8901: MOV (XS)+,WB RESTORE CURSOR
8902: BRN SUCCP AND SUCCEED
8903: EJC
8904: *
8905: * IMMEDIATE ASSIGNMENT (REMOVE NDIMD ENTRY ON FAILURE)
8906: *
8907: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
8908: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
8909: *
8910: * NO PARAMETERS (DUMMY PATTERN)
8911: *
8912: P$IMD ENT ENTRY POINT
8913: MOV WB,PMHBS RESTORE INNER STACK BASE POINTER
8914: BRN FAILP AND FAIL
8915: EJC
8916: *
8917: * LEN (INTEGER ARGUMENT)
8918: *
8919: * PARM1 INTEGER ARGUMENT
8920: *
8921: P$LEN ENT BL$P1 P1BLK
8922: *
8923: * EXPRESSION ARGUMENT CASE MERGES HERE
8924: *
8925: PLEN1 ADD PARM1(XR),WB PUSH CURSOR INDICATED AMOUNT
8926: BLE WB,PMSSL,SUCCP SUCCEED IF NOT OFF END
8927: BRN FAILP ELSE FAIL
8928: EJC
8929: *
8930: * LEN (EXPRESSION ARGUMENT)
8931: *
8932: * PARM1 EXPRESSION POINTER
8933: *
8934: P$LND ENT BL$P1 P1BLK
8935: JSR EVALI EVALUATE INTEGER ARGUMENT
8936: ERR 047,LEN EVALUATED ARGUMENT IS NOT INTEGER
8937: ERR 048,LEN EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
8938: PPM FAILP FAIL IF EVALUATION FAILS
8939: PPM PLEN1 MERGE WITH NORMAL CIRCUIT IF OK
8940: EJC
8941: *
8942: * NOTANY (EXPRESSION ARGUMENT)
8943: *
8944: * PARM1 EXPRESSION POINTER
8945: *
8946: P$NAD ENT BL$P1 P1BLK
8947: JSR EVALS EVALUATE STRING ARGUMENT
8948: ERR 049,NOTANY EVALUATED ARGUMENT IS NOT STRING
8949: PPM FAILP FAIL IF EVALUATION FAILS
8950: PPM PNAY1 MERGE WITH MULTI-CHAR CASE IF OK
8951: EJC
8952: *
8953: * NOTANY (ONE CHARACTER ARGUMENT)
8954: *
8955: * PARM1 CHARACTER ARGUMENT
8956: *
8957: P$NAS ENT BL$P1 ENTRY POINT
8958: BEQ WB,PMSSL,FAILP FAIL IF NO CHARS LEFT
8959: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING
8960: PLC XL,WB POINT TO CURRENT CHARACTER IN STRIN
8961: LCH WA,(XL) LOAD CURRENT CHARACTER
8962: BEQ WA,PARM1(XR),FAILP FAIL IF MATCH
8963: ICV WB ELSE BUMP CURSOR
8964: BRN SUCCP AND SUCCEED
8965: EJC
8966: *
8967: * NOTANY (MULTI-CHARACTER STRING ARGUMENT)
8968: *
8969: * PARM1 POINTER TO CTBLK
8970: * PARM2 BIT MASK TO SELECT BIT COLUMN
8971: *
8972: P$NAY ENT BL$P2 P2BLK
8973: *
8974: * EXPRESSION ARGUMENT CASE MERGES HERE
8975: *
8976: PNAY1 BEQ WB,PMSSL,FAILP FAIL IF NO CHARACTERS LEFT
8977: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING
8978: PLC XL,WB POINT TO CURRENT CHARACTER
8979: LCH WA,(XL) LOAD CURRENT CHARACTER
8980: WTB WA CONVERT TO BYTE OFFSET
8981: MOV PARM1(XR),XL LOAD POINTER TO CTBLK
8982: ADD WA,XL POINT TO ENTRY IN CTBLK
8983: MOV CTCHS(XL),WA LOAD ENTRY FROM CTBLK
8984: ANB PARM2(XR),WA AND WITH SELECTED BIT
8985: NZB WA,FAILP FAIL IF CHARACTER IS MATCHED
8986: ICV WB ELSE BUMP CURSOR
8987: BRN SUCCP AND SUCCEED
8988: EJC
8989: *
8990: * END OF PATTERN MATCH
8991: *
8992: * THIS ROUTINE IS ENTERED ON SUCCESSFUL COMPLETION.
8993: * SEE DESCRIPTION OF EXPRESSION PATTERNS IN COMPOUND
8994: * PATTERN SECTION FOR HANDLING OF RECURSION IN MATCHING.
8995: *
8996: * NO PARAMETERS (DUMMY PATTERN)
8997: *
8998: P$NTH ENT ENTRY POINT
8999: MOV PMHBS,XT LOAD POINTER TO BASE OF STACK
9000: MOV 1(XT),WA LOAD SAVED PMHBS (OR PATTERN TYPE)
9001: BLE WA,=NUM02,PNTH2 JUMP IF OUTER LEVEL (PATTERN TYPE)
9002: *
9003: * HERE WE ARE AT THE END OF MATCHING AN EXPRESSION PATTERN
9004: *
9005: MOV WA,PMHBS RESTORE OUTER STACK BASE POINTER
9006: MOV 2(XT),XR RESTORE POINTER TO P$EXA NODE
9007: BEQ XT,XS,PNTH1 JUMP IF NO HISTORY STACK ENTRIES
9008: MOV XT,-(XS) ELSE STACK INNER STACK BASE PTR
9009: MOV =NDEXC,-(XS) STACK PTR TO SPECIAL NODE NDEXC
9010: BRN SUCCP AND SUCCEED
9011: *
9012: * HERE IF NO HISTORY STACK ENTRIES DURING PATTERN
9013: *
9014: PNTH1 ADD *NUM04,XS REMOVE P$EXB ENTRY AND NODE PTR
9015: BRN SUCCP AND SUCCEED
9016: *
9017: * HERE IF END OF MATCH AT OUTER LEVEL
9018: *
9019: PNTH2 MOV WB,PMSSL SAVE FINAL CURSOR IN SAFE PLACE
9020: BZE PMDFL,PNTH6 JUMP IF NO PATTERN ASSIGNMENTS
9021: EJC
9022: *
9023: * END OF PATTERN MATCH (CONTINUED)
9024: *
9025: * NOW WE MUST PERFORM PATTERN ASSIGNMENTS. THIS IS DONE BY
9026: * SCANNING THE HISTORY STACK FOR MATCHING NDPAB-NDPAD PAIRS
9027: *
9028: PNTH3 DCA XT POINT PAST CURSOR ENTRY
9029: MOV -(XT),WA LOAD NODE POINTER
9030: BEQ WA,=NDPAD,PNTH4 JUMP IF NDPAD ENTRY
9031: BNE WA,=NDPAB,PNTH5 JUMP IF NOT NDPAB ENTRY
9032: *
9033: * HERE FOR NDPAB ENTRY, STACK INITIAL CURSOR
9034: * NOTE THAT THERE MUST BE MORE ENTRIES ON THE STACK.
9035: *
9036: MOV 1(XT),-(XS) STACK INITIAL CURSOR
9037: CHK CHECK FOR STACK OVERFLOW
9038: BRN PNTH3 LOOP BACK IF OK
9039: *
9040: * HERE FOR NDPAD ENTRY. THE STARTING CURSOR FROM THE
9041: * MATCHING NDPAD ENTRY IS NOW THE TOP STACK ENTRY.
9042: *
9043: PNTH4 MOV 1(XT),WA LOAD FINAL CURSOR
9044: MOV (XS),WB LOAD INITIAL CURSOR FROM STACK
9045: MOV XT,(XS) SAVE HISTORY STACK SCAN PTR
9046: SUB WB,WA COMPUTE LENGTH OF STRING
9047: *
9048: * BUILD SUBSTRING AND PERFORM ASSIGNMENT
9049: *
9050: MOV R$PMS,XL POINT TO SUBJECT STRING
9051: JSR SBSTR CONSTRUCT SUBSTRING
9052: MOV XR,WB COPY SUBSTRING POINTER
9053: MOV (XS),XT RELOAD HISTORY STACK SCAN PTR
9054: MOV 2(XT),XL LOAD POINTER TO P$PAC NODE WITH NAM
9055: MOV PARM2(XL),WA LOAD NAME OFFSET
9056: MOV PARM1(XL),XL LOAD NAME BASE
9057: JSR ASINP PERFORM ASSIGNMENT
9058: PPM EXFAL MATCH FAILS IF NAME EVAL FAILS
9059: MOV (XS)+,XT ELSE RESTORE HISTORY STACK PTR
9060: EJC
9061: *
9062: * END OF PATTERN MATCH (CONTINUED)
9063: *
9064: * HERE CHECK FOR END OF ENTRIES
9065: *
9066: PNTH5 BNE XT,XS,PNTH3 LOOP IF MORE ENTRIES TO SCAN
9067: *
9068: * HERE AFTER DEALING WITH PATTERN ASSIGNMENTS
9069: *
9070: PNTH6 MOV PMHBS,XS WIPE OUT HISTORY STACK
9071: MOV (XS)+,WB LOAD INITIAL CURSOR
9072: MOV (XS)+,WC LOAD MATCH TYPE CODE
9073: MOV PMSSL,WA LOAD FINAL CURSOR VALUE
9074: MOV R$PMS,XL POINT TO SUBJECT STRING
9075: ZER R$PMS CLEAR SUBJECT STRING PTR FOR GBCOL
9076: BZE WC,PNTH7 JUMP IF CALL BY NAME
9077: BEQ WC,=NUM02,EXITS EXIT IF STATEMENT LEVEL CALL
9078: *
9079: * HERE WE HAVE A CALL BY VALUE, BUILD SUBSTRING
9080: *
9081: SUB WB,WA COMPUTE LENGTH OF STRING
9082: JSR SBSTR BUILD SUBSTRING
9083: BRN EXIXR AND EXIT WITH SUBSTRING VALUE
9084: *
9085: * HERE FOR CALL BY NAME, MAKE STACK ENTRIES FOR O$RPL
9086: *
9087: PNTH7 MOV WB,-(XS) STACK INITIAL CURSOR
9088: MOV WA,-(XS) STACK FINAL CURSOR
9089: BZE R$PMB,PNTH8 SKIP IF SUBJECT NOT BUFFER
9090: MOV R$PMB,XL ELSE GET PTR TO BCBLK INSTEAD
9091: *
9092: * HERE WITH XL POINTING TO SCBLK OR BCBLK
9093: *
9094: PNTH8 MOV XL,-(XS) STACK SUBJECT POINTER
9095: BRN EXITS EXIT WITH SPECIAL ENTRY ON STACK
9096: EJC
9097: *
9098: * POS (INTEGER ARGUMENT)
9099: *
9100: * PARM1 INTEGER ARGUMENT
9101: *
9102: P$POS ENT BL$P1 P1BLK
9103: *
9104: * EXPRESSION ARGUMENT CASE MERGES HERE
9105: *
9106: PPOS1 BEQ WB,PARM1(XR),SUCCP SUCCEED IF AT RIGHT LOCATION
9107: BRN FAILP ELSE FAIL
9108: EJC
9109: *
9110: * POS (EXPRESSION ARGUMENT)
9111: *
9112: * PARM1 EXPRESSION POINTER
9113: *
9114: P$PSD ENT BL$P1 P1BLK
9115: JSR EVALI EVALUATE INTEGER ARGUMENT
9116: ERR 050,POS EVALUATED ARGUMENT IS NOT INTEGER
9117: ERR 051,POS EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
9118: PPM FAILP FAIL IF EVALUATION FAILS
9119: PPM PPOS1 MERGE WITH NORMAL CASE IF OK
9120: EJC
9121: *
9122: * PATTERN ASSIGNMENT (INITIAL ENTRY, SAVE CURSOR)
9123: *
9124: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
9125: * ALGORITHMS FOR MATCHING THIS NODE TYPE.
9126: *
9127: * NO PARAMETERS
9128: *
9129: P$PAA ENT BL$P0 P0BLK
9130: MOV WB,-(XS) STACK INITIAL CURSOR
9131: MOV =NDPAB,-(XS) STACK PTR TO NDPAB SPECIAL NODE
9132: BRN SUCCP AND SUCCEED MATCHING NULL
9133: EJC
9134: *
9135: * PATTERN ASSIGNMENT (REMOVE SAVED CURSOR)
9136: *
9137: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
9138: * ALGORITHMS FOR MATCHING THIS NODE TYPE.
9139: *
9140: * NO PARAMETERS (DUMMY PATTERN)
9141: *
9142: P$PAB ENT ENTRY POINT
9143: BRN FAILP JUST FAIL (ENTRY IS ALREADY POPPED)
9144: EJC
9145: *
9146: * PATTERN ASSIGNMENT (END OF MATCH, MAKE ASSIGN ENTRY)
9147: *
9148: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
9149: * ALGORITHMS FOR MATCHING THIS NODE TYPE.
9150: *
9151: * PARM1 NAME BASE OF VARIABLE
9152: * PARM2 NAME OFFSET OF VARIABLE
9153: *
9154: P$PAC ENT BL$P2 P2BLK
9155: MOV WB,-(XS) STACK DUMMY CURSOR VALUE
9156: MOV XR,-(XS) STACK POINTER TO P$PAC NODE
9157: MOV WB,-(XS) STACK FINAL CURSOR
9158: MOV =NDPAD,-(XS) STACK PTR TO SPECIAL NDPAD NODE
9159: MNZ PMDFL SET DOT FLAG NON-ZERO
9160: BRN SUCCP AND SUCCEED
9161: EJC
9162: *
9163: * PATTERN ASSIGNMENT (REMOVE ASSIGN ENTRY)
9164: *
9165: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
9166: * ALGORITHMS FOR MATCHING THIS NODE TYPE.
9167: *
9168: * NO PARAMETERS (DUMMY NODE)
9169: *
9170: P$PAD ENT ENTRY POINT
9171: BRN FLPOP FAIL AND REMOVE P$PAC NODE
9172: EJC
9173: *
9174: * REM
9175: *
9176: * NO PARAMETERS
9177: *
9178: P$REM ENT BL$P0 P0BLK
9179: MOV PMSSL,WB POINT CURSOR TO END OF STRING
9180: BRN SUCCP AND SUCCEED
9181: EJC
9182: *
9183: * RPOS (EXPRESSION ARGUMENT)
9184: *
9185: * PARM1 EXPRESSION POINTER
9186: *
9187: P$RPD ENT BL$P1 P1BLK
9188: JSR EVALI EVALUATE INTEGER ARGUMENT
9189: ERR 052,RPOS EVALUATED ARGUMENT IS NOT INTEGER
9190: ERR 053,RPOS EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
9191: PPM FAILP FAIL IF EVALUATION FAILS
9192: PPM PRPS1 MERGE WITH NORMAL CASE IF OK
9193: EJC
9194: *
9195: * RPOS (INTEGER ARGUMENT)
9196: *
9197: * PARM1 INTEGER ARGUMENT
9198: *
9199: P$RPS ENT BL$P1 P1BLK
9200: *
9201: * EXPRESSION ARGUMENT CASE MERGES HERE
9202: *
9203: PRPS1 MOV PMSSL,WC GET LENGTH OF STRING
9204: SUB WB,WC GET NUMBER OF CHARACTERS REMAINING
9205: BEQ WC,PARM1(XR),SUCCP SUCCEED IF AT RIGHT LOCATION
9206: BRN FAILP ELSE FAIL
9207: EJC
9208: *
9209: * RTAB (INTEGER ARGUMENT)
9210: *
9211: * PARM1 INTEGER ARGUMENT
9212: *
9213: P$RTB ENT BL$P1 P1BLK
9214: *
9215: * EXPRESSION ARGUMENT CASE MERGES HERE
9216: *
9217: PRTB1 MOV WB,WC SAVE INITIAL CURSOR
9218: MOV PMSSL,WB POINT TO END OF STRING
9219: BLT WB,PARM1(XR),FAILP FAIL IF STRING NOT LONG ENOUGH
9220: SUB PARM1(XR),WB ELSE SET NEW CURSOR
9221: BGE WB,WC,SUCCP AND SUCCEED IF NOT TOO FAR ALREADY
9222: BRN FAILP IN WHICH CASE, FAIL
9223: EJC
9224: *
9225: * RTAB (EXPRESSION ARGUMENT)
9226: *
9227: * PARM1 EXPRESSION POINTER
9228: *
9229: P$RTD ENT BL$P1 P1BLK
9230: JSR EVALI EVALUATE INTEGER ARGUMENT
9231: ERR 054,RTAB EVALUATED ARGUMENT IS NOT INTEGER
9232: ERR 055,RTAB EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
9233: PPM FAILP FAIL IF EVALUATION FAILS
9234: PPM PRTB1 MERGE WITH NORMAL CASE IF SUCCESS
9235: EJC
9236: *
9237: * SPAN (EXPRESSION ARGUMENT)
9238: *
9239: * PARM1 EXPRESSION POINTER
9240: *
9241: P$SPD ENT BL$P1 P1BLK
9242: JSR EVALS EVALUATE STRING ARGUMENT
9243: ERR 056,SPAN EVALUATED ARGUMENT IS NOT STRING
9244: PPM FAILP FAIL IF EVALUATION FAILS
9245: PPM PSPN1 MERGE WITH MULTI-CHAR CASE IF OK
9246: EJC
9247: *
9248: * SPAN (MULTI-CHARACTER ARGUMENT CASE)
9249: *
9250: * PARM1 POINTER TO CTBLK
9251: * PARM2 BIT MASK TO SELECT BIT COLUMN
9252: *
9253: P$SPN ENT BL$P2 P2BLK
9254: *
9255: * EXPRESSION ARGUMENT CASE MERGES HERE
9256: *
9257: PSPN1 MOV PMSSL,WC COPY SUBJECT STRING LENGTH
9258: SUB WB,WC CALCULATE NUMBER OF CHARACTERS LEFT
9259: BZE WC,FAILP FAIL IF NO CHARACTERS LEFT
9260: MOV R$PMS,XL POINT TO SUBJECT STRING
9261: PLC XL,WB POINT TO CURRENT CHARACTER
9262: MOV WB,PSAVC SAVE INITIAL CURSOR
9263: MOV XR,PSAVE SAVE NODE POINTER
9264: LCT WC,WC SET COUNTER FOR CHARS LEFT
9265: *
9266: * LOOP TO SCAN MATCHING CHARACTERS
9267: *
9268: PSPN2 LCH WA,(XL)+ LOAD NEXT CHARACTER, BUMP POINTER
9269: WTB WA CONVERT TO BYTE OFFSET
9270: MOV PARM1(XR),XR POINT TO CTBLK
9271: ADD WA,XR POINT TO CTBLK ENTRY
9272: MOV CTCHS(XR),WA LOAD CTBLK ENTRY
9273: MOV PSAVE,XR RESTORE NODE POINTER
9274: ANB PARM2(XR),WA AND WITH SELECTED BIT
9275: ZRB WA,PSPN3 JUMP IF NO MATCH
9276: ICV WB ELSE PUSH CURSOR
9277: BCT WC,PSPN2 LOOP BACK UNLESS END OF STRING
9278: *
9279: * HERE AFTER SCANNING MATCHING CHARACTERS
9280: *
9281: PSPN3 BNE WB,PSAVC,SUCCP SUCCEED IF CHARS MATCHED
9282: BRN FAILP ELSE FAIL IF NULL STRING MATCHED
9283: EJC
9284: *
9285: * SPAN (ONE CHARACTER ARGUMENT)
9286: *
9287: * PARM1 CHARACTER ARGUMENT
9288: *
9289: P$SPS ENT BL$P1 P1BLK
9290: MOV PMSSL,WC GET SUBJECT STRING LENGTH
9291: SUB WB,WC CALCULATE NUMBER OF CHARACTERS LEFT
9292: BZE WC,FAILP FAIL IF NO CHARACTERS LEFT
9293: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING
9294: PLC XL,WB POINT TO CURRENT CHARACTER
9295: MOV WB,PSAVC SAVE INITIAL CURSOR
9296: LCT WC,WC SET COUNTER FOR CHARACTERS LEFT
9297: *
9298: * LOOP TO SCAN MATCHING CHARACTERS
9299: *
9300: PSPS1 LCH WA,(XL)+ LOAD NEXT CHARACTER, BUMP POINTER
9301: BNE WA,PARM1(XR),PSPS2 JUMP IF NO MATCH
9302: ICV WB ELSE PUSH CURSOR
9303: BCT WC,PSPS1 AND LOOP UNLESS END OF STRING
9304: *
9305: * HERE AFTER SCANNING MATCHING CHARACTERS
9306: *
9307: PSPS2 BNE WB,PSAVC,SUCCP SUCCEED IF CHARS MATCHED
9308: BRN FAILP FAIL IF NULL STRING MATCHED
9309: EJC
9310: *
9311: * MULTI-CHARACTER STRING
9312: *
9313: * NOTE THAT ONE CHARACTER STRINGS USE THE CIRCUIT FOR
9314: * ONE CHARACTER ANY ARGUMENTS (P$AN1).
9315: *
9316: * PARM1 POINTER TO SCBLK FOR STRING ARG
9317: *
9318: P$STR ENT BL$P1 P1BLK
9319: MOV PARM1(XR),XL GET POINTER TO STRING
9320: *
9321: * MERGE HERE AFTER EVALUATING EXPRESSION WITH STRING VALUE
9322: *
9323: PSTR1 MOV XR,PSAVE SAVE NODE POINTER
9324: MOV R$PMS,XR LOAD SUBJECT STRING POINTER
9325: PLC XR,WB POINT TO CURRENT CHARACTER
9326: ADD SCLEN(XL),WB COMPUTE NEW CURSOR POSITION
9327: BGT WB,PMSSL,FAILP FAIL IF PAST END OF STRING
9328: MOV WB,PSAVC SAVE UPDATED CURSOR
9329: MOV SCLEN(XL),WA GET NUMBER OF CHARS TO COMPARE
9330: PLC XL POINT TO CHARS OF TEST STRING
9331: CMC FAILP,FAILP COMPARE, FAIL IF NOT EQUAL
9332: MOV PSAVE,XR IF ALL MATCHED, RESTORE NODE PTR
9333: MOV PSAVC,WB RESTORE UPDATED CURSOR
9334: BRN SUCCP AND SUCCEED
9335: EJC
9336: *
9337: * SUCCEED
9338: *
9339: * SEE SECTION ON COMPOUND PATTERNS FOR DETAILS OF THE
9340: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE
9341: *
9342: * NO PARAMETERS
9343: *
9344: P$SUC ENT BL$P0 P0BLK
9345: MOV WB,-(XS) STACK CURSOR
9346: MOV XR,-(XS) STACK POINTER TO THIS NODE
9347: BRN SUCCP SUCCEED MATCHING NULL
9348: EJC
9349: *
9350: * TAB (INTEGER ARGUMENT)
9351: *
9352: * PARM1 INTEGER ARGUMENT
9353: *
9354: P$TAB ENT BL$P1 P1BLK
9355: *
9356: * EXPRESSION ARGUMENT CASE MERGES HERE
9357: *
9358: PTAB1 BGT WB,PARM1(XR),FAILP FAIL IF TOO FAR ALREADY
9359: MOV PARM1(XR),WB ELSE SET NEW CURSOR POSITION
9360: BLE WB,PMSSL,SUCCP SUCCEED IF NOT OFF END
9361: BRN FAILP ELSE FAIL
9362: EJC
9363: *
9364: * TAB (EXPRESSION ARGUMENT)
9365: *
9366: * PARM1 EXPRESSION POINTER
9367: *
9368: P$TBD ENT BL$P1 P1BLK
9369: JSR EVALI EVALUATE INTEGER ARGUMENT
9370: ERR 057,TAB EVALUATED ARGUMENT IS NOT INTEGER
9371: ERR 058,TAB EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
9372: PPM FAILP FAIL IF EVALUATION FAILS
9373: PPM PTAB1 MERGE WITH NORMAL CASE IF OK
9374: EJC
9375: *
9376: * ANCHOR MOVEMENT
9377: *
9378: * NO PARAMETERS (DUMMY NODE)
9379: *
9380: P$UNA ENT ENTRY POINT
9381: MOV WB,XR COPY INITIAL PATTERN NODE POINTER
9382: MOV (XS),WB GET INITIAL CURSOR
9383: BEQ WB,PMSSL,EXFAL MATCH FAILS IF AT END OF STRING
9384: ICV WB ELSE INCREMENT CURSOR
9385: MOV WB,(XS) STORE INCREMENTED CURSOR
9386: MOV XR,-(XS) RESTACK INITIAL NODE PTR
9387: MOV =NDUNA,-(XS) RESTACK UNANCHORED NODE
9388: BRI (XR) REMATCH FIRST NODE
9389: EJC
9390: *
9391: * END OF PATTERN MATCH ROUTINES
9392: *
9393: * THE FOLLOWING ENTRY POINT MARKS THE END OF THE PATTERN
9394: * MATCHING ROUTINES AND ALSO THE END OF THE ENTRY POINTS
9395: * REFERENCED FROM THE FIRST WORD OF BLOCKS IN DYNAMIC STORE
9396: *
9397: P$YYY ENT BL$$I MARK LAST ENTRY IN PATTERN SECTION
9398: TTL S P I T B O L -- PREDEFINED SNOBOL4 FUNCTIONS
9399: *
9400: * THE FOLLOWING SECTION CONTAINS CODING FOR FUNCTIONS
9401: * WHICH ARE PREDEFINED AND AVAILABLE AT THE SNOBOL LEVEL.
9402: *
9403: * THESE ROUTINES RECEIVE CONTROL DIRECTLY FROM THE CODE OR
9404: * INDIRECTLY THROUGH THE O$FNC, O$FNS OR CFUNC ROUTINES.
9405: * IN BOTH CASES THE CONDITIONS ON ENTRY ARE AS FOLLOWS
9406: *
9407: * THE ARGUMENTS ARE ON THE STACK. THE NUMBER OF ARGUMENTS
9408: * HAS BEEN ADJUSTED TO CORRESPOND TO THE SVBLK SVNAR FIELD.
9409: *
9410: * IN CERTAIN FUNCTIONS THE DIRECT CALL IS NOT PERMITTED
9411: * AND IN THESE INSTANCES WE ALSO HAVE.
9412: *
9413: * (WA) ACTUAL NUMBER OF ARGUMENTS IN CALL
9414: *
9415: * CONTROL RETURNS BY PLACING THE FUNCTION RESULT VALUE ON
9416: * ON THE STACK AND CONTINUING EXECUTION WITH THE NEXT
9417: * WORD FROM THE GENERATED CODE.
9418: *
9419: * THE NAMES OF THE ENTRY POINTS OF THESE FUNCTIONS ARE OF
9420: * THE FORM S$XXX WHERE XXX IS THE THREE LETTER CODE FOR
9421: * THE SYSTEM VARIABLE NAME. THE FUNCTIONS ARE IN ORDER
9422: * ALPHABETICALLY BY THEIR ENTRY NAMES.
9423: EJC
9424: *
9425: * ANY
9426: *
9427: S$ANY ENT ENTRY POINT
9428: MOV =P$ANS,WB SET PCODE FOR SINGLE CHAR CASE
9429: MOV =P$ANY,XL PCODE FOR MULTI-CHAR CASE
9430: MOV =P$AYD,WC PCODE FOR EXPRESSION CASE
9431: JSR PATST CALL COMMON ROUTINE TO BUILD NODE
9432: ERR 059,ANY ARGUMENT IS NOT STRING OR EXPRESSION
9433: BRN EXIXR JUMP FOR NEXT CODE WORD
9434: EJC
9435: *
9436: * APPEND
9437: *
9438: S$APN ENT ENTRY POINT
9439: MOV (XS)+,XL GET APPEND ARGUMENT
9440: MOV (XS)+,XR GET BCBLK
9441: BEQ (XR),=B$BCT,SAPN1 OK IF FIRST ARG IS BCBLK
9442: ERB 275,APPEND FIRST ARGUMENT IS NOT BUFFER
9443: *
9444: * HERE TO DO THE APPEND
9445: *
9446: SAPN1 JSR APNDB DO THE APPEND
9447: ERR 276,APPEND SECOND ARGUMENT IS NOT STRING
9448: PPM EXFAL NO ROOM - FAIL
9449: BRN EXNUL EXIT WITH NULL RESULT
9450: EJC
9451: *
9452: * APPLY
9453: *
9454: * APPLY DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT
9455: * WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED.
9456: *
9457: S$APP ENT ENTRY POINT
9458: BZE WA,SAPP3 JUMP IF NO ARGUMENTS
9459: DCV WA ELSE GET APPLIED FUNC ARG COUNT
9460: MOV WA,WB COPY
9461: WTB WB CONVERT TO BYTES
9462: MOV XS,XT COPY STACK POINTER
9463: ADD WB,XT POINT TO FUNCTION ARGUMENT ON STACK
9464: MOV (XT),XR LOAD FUNCTION PTR (APPLY 1ST ARG)
9465: BZE WA,SAPP2 JUMP IF NO ARGS FOR APPLIED FUNC
9466: LCT WB,WA ELSE SET COUNTER FOR LOOP
9467: *
9468: * LOOP TO MOVE ARGUMENTS UP ON STACK
9469: *
9470: SAPP1 DCA XT POINT TO NEXT ARGUMENT
9471: MOV (XT),1(XT) MOVE ARGUMENT UP
9472: BCT WB,SAPP1 LOOP TILL ALL MOVED
9473: *
9474: * MERGE HERE TO CALL FUNCTION (WA = NUMBER OF ARGUMENTS)
9475: *
9476: SAPP2 ICA XS ADJUST STACK PTR FOR APPLY 1ST ARG
9477: JSR GTNVR GET VARIABLE BLOCK ADDR FOR FUNC
9478: PPM SAPP3 JUMP IF NOT NATURAL VARIABLE
9479: MOV VRFNC(XR),XL ELSE POINT TO FUNCTION BLOCK
9480: BRN CFUNC GO CALL APPLIED FUNCTION
9481: *
9482: * HERE FOR INVALID FIRST ARGUMENT
9483: *
9484: SAPP3 ERB 060,APPLY FIRST ARG IS NOT NATURAL VARIABLE NAME
9485: EJC
9486: *
9487: * ARBNO
9488: *
9489: * ARBNO BUILDS A COMPOUND PATTERN. SEE DESCRIPTION AT
9490: * START OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED.
9491: *
9492: S$ABN ENT ENTRY POINT
9493: ZER XR SET PARM1 = 0 FOR THE MOMENT
9494: MOV =P$ALT,WB SET PCODE FOR ALTERNATIVE NODE
9495: JSR PBILD BUILD ALTERNATIVE NODE
9496: MOV XR,XL SAVE PTR TO ALTERNATIVE PATTERN
9497: MOV =P$ABC,WB PCODE FOR P$ABC
9498: ZER XR P0BLK
9499: JSR PBILD BUILD P$ABC NODE
9500: MOV XL,PTHEN(XR) PUT ALTERNATIVE NODE AS SUCCESSOR
9501: MOV XL,WA REMEMBER ALTERNATIVE NODE POINTER
9502: MOV XR,XL COPY P$ABC NODE PTR
9503: MOV (XS),XR LOAD ARBNO ARGUMENT
9504: MOV WA,(XS) STACK ALTERNATIVE NODE POINTER
9505: JSR GTPAT GET ARBNO ARGUMENT AS PATTERN
9506: ERR 061,ARBNO ARGUMENT IS NOT PATTERN
9507: JSR PCONC CONCAT ARG WITH P$ABC NODE
9508: MOV XR,XL REMEMBER PTR TO CONCD PATTERNS
9509: MOV =P$ABA,WB PCODE FOR P$ABA
9510: ZER XR P0BLK
9511: JSR PBILD BUILD P$ABA NODE
9512: MOV XL,PTHEN(XR) CONCATENATE NODES
9513: MOV (XS),XL RECALL PTR TO ALTERNATIVE NODE
9514: MOV XR,PARM1(XL) POINT ALTERNATIVE BACK TO ARGUMENT
9515: BRN EXITS JUMP FOR NEXT CODE WORD
9516: EJC
9517: *
9518: * ARG
9519: *
9520: S$ARG ENT ENTRY POINT
9521: JSR GTSMI GET SECOND ARG AS SMALL INTEGER
9522: ERR 062,ARG SECOND ARGUMENT IS NOT INTEGER
9523: PPM EXFAL FAIL IF OUT OF RANGE OR NEGATIVE
9524: MOV XR,WA SAVE ARGUMENT NUMBER
9525: MOV (XS)+,XR LOAD FIRST ARGUMENT
9526: JSR GTNVR LOCATE VRBLK
9527: PPM SARG1 JUMP IF NOT NATURAL VARIABLE
9528: MOV VRFNC(XR),XR ELSE LOAD FUNCTION BLOCK POINTER
9529: BNE (XR),=B$PFC,SARG1 JUMP IF NOT PROGRAM DEFINED
9530: BZE WA,EXFAL FAIL IF ARG NUMBER IS ZERO
9531: BGT WA,FARGS(XR),EXFAL FAIL IF ARG NUMBER IS TOO LARGE
9532: WTB WA ELSE CONVERT TO BYTE OFFSET
9533: ADD WA,XR POINT TO ARGUMENT SELECTED
9534: MOV PFAGB(XR),XR LOAD ARGUMENT VRBLK POINTER
9535: BRN EXVNM EXIT TO BUILD NMBLK
9536: *
9537: * HERE IF 1ST ARGUMENT IS BAD
9538: *
9539: SARG1 ERB 063,ARG FIRST ARGUMENT IS NOT PROGRAM FUNCTION NAME
9540: EJC
9541: *
9542: * ARRAY
9543: *
9544: S$ARR ENT ENTRY POINT
9545: MOV (XS)+,XL LOAD INITIAL ELEMENT VALUE
9546: MOV (XS)+,XR LOAD FIRST ARGUMENT
9547: JSR GTINT CONVERT FIRST ARG TO INTEGER
9548: PPM SAR02 JUMP IF NOT INTEGER
9549: *
9550: * HERE FOR INTEGER FIRST ARGUMENT, BUILD VCBLK
9551: *
9552: LDI ICVAL(XR) LOAD INTEGER VALUE
9553: ILE SAR10 JUMP IF ZERO OR NEG (BAD DIMENSION)
9554: MFI WA,SAR11 ELSE CONVERT TO ONE WORD, TEST OVFL
9555: LCT WB,WA COPY ELEMENTS FOR LOOP LATER ON
9556: ADD =VCSI$,WA ADD SPACE FOR STANDARD FIELDS
9557: WTB WA CONVERT LENGTH TO BYTES
9558: BGE WA,MXLEN,SAR11 FAIL IF TOO LARGE
9559: JSR ALLOC ALLOCATE SPACE FOR VCBLK
9560: MOV =B$VCT,(XR) STORE TYPE WORD
9561: MOV WA,VCLEN(XR) SET LENGTH
9562: MOV XL,WC COPY DEFAULT VALUE
9563: MOV XR,XL COPY VCBLK POINTER
9564: ADD *VCVLS,XL POINT TO FIRST ELEMENT VALUE
9565: *
9566: * LOOP TO SET VECTOR ELEMENTS TO DEFAULT VALUE
9567: *
9568: SAR01 MOV WC,(XL)+ STORE ONE VALUE
9569: BCT WB,SAR01 LOOP TILL ALL STORED
9570: BRN EXSID EXIT SETTING IDVAL
9571: EJC
9572: *
9573: * ARRAY (CONTINUED)
9574: *
9575: * HERE IF FIRST ARGUMENT IS NOT AN INTEGER
9576: *
9577: SAR02 MOV XR,-(XS) REPLACE ARGUMENT ON STACK
9578: JSR XSCNI INITIALIZE SCAN OF FIRST ARGUMENT
9579: ERR 064,ARRAY FIRST ARGUMENT IS NOT INTEGER OR STRING
9580: PPM EXNUL DUMMY (UNUSED) NULL STRING EXIT
9581: MOV R$XSC,-(XS) SAVE PROTOTYPE POINTER
9582: MOV XL,-(XS) SAVE DEFAULT VALUE
9583: ZER ARCDM ZERO COUNT OF DIMENSIONS
9584: ZER ARPTR ZERO OFFSET TO INDICATE PASS ONE
9585: LDI INTV1 LOAD INTEGER ONE
9586: STI ARNEL INITIALIZE ELEMENT COUNT
9587: *
9588: * THE FOLLOWING CODE IS EXECUTED TWICE. THE FIRST TIME
9589: * (ARPTR EQ 0), IT IS USED TO COUNT THE NUMBER OF ELEMENTS
9590: * AND NUMBER OF DIMENSIONS. THE SECOND TIME (ARPTR GT 0) IS
9591: * USED TO ACTUALLY FILL IN THE DIM,LBD FIELDS OF THE ARBLK.
9592: *
9593: SAR03 LDI INTV1 LOAD ONE AS DEFAULT LOW BOUND
9594: STI ARSVL SAVE AS LOW BOUND
9595: MOV =CH$CL,WC SET DELIMITER ONE = COLON
9596: MOV =CH$CM,XL SET DELIMITER TWO = COMMA
9597: JSR XSCAN SCAN NEXT BOUND
9598: BNE WA,=NUM01,SAR04 JUMP IF NOT COLON
9599: *
9600: * HERE WE HAVE A COLON ENDING A LOW BOUND
9601: *
9602: JSR GTINT CONVERT LOW BOUND
9603: ERR 065,ARRAY FIRST ARGUMENT LOWER BOUND IS NOT INTEGER
9604: LDI ICVAL(XR) LOAD VALUE OF LOW BOUND
9605: STI ARSVL STORE LOW BOUND VALUE
9606: MOV =CH$CM,WC SET DELIMITER ONE = COMMA
9607: MOV WC,XL AND DELIMITER TWO = COMMA
9608: JSR XSCAN SCAN HIGH BOUND
9609: EJC
9610: *
9611: * ARRAY (CONTINUED)
9612: *
9613: * MERGE HERE TO PROCESS UPPER BOUND
9614: *
9615: SAR04 JSR GTINT CONVERT HIGH BOUND TO INTEGER
9616: ERR 066,ARRAY FIRST ARGUMENT UPPER BOUND IS NOT INTEGER
9617: LDI ICVAL(XR) GET HIGH BOUND
9618: SBI ARSVL SUBTRACT LOWER BOUND
9619: IOV SAR10 BAD DIMENSION IF OVERFLOW
9620: ILT SAR10 BAD DIMENSION IF NEGATIVE
9621: ADI INTV1 ADD 1 TO GET DIMENSION
9622: IOV SAR10 BAD DIMENSION IF OVERFLOW
9623: MOV ARPTR,XL LOAD OFFSET (ALSO PASS INDICATOR)
9624: BZE XL,SAR05 JUMP IF FIRST PASS
9625: *
9626: * HERE IN SECOND PASS TO STORE LBD AND DIM IN ARBLK
9627: *
9628: ADD (XS),XL POINT TO CURRENT LOCATION IN ARBLK
9629: STI CFP$I(XL) STORE DIMENSION
9630: LDI ARSVL LOAD LOW BOUND
9631: STI (XL) STORE LOW BOUND
9632: ADD *ARDMS,ARPTR BUMP OFFSET TO NEXT BOUNDS
9633: BRN SAR06 JUMP TO CHECK FOR END OF BOUNDS
9634: *
9635: * HERE IN PASS 1
9636: *
9637: SAR05 ICV ARCDM BUMP DIMENSION COUNT
9638: MLI ARNEL MULTIPLY DIMENSION BY COUNT SO FAR
9639: IOV SAR11 TOO LARGE IF OVERFLOW
9640: STI ARNEL ELSE STORE UPDATED ELEMENT COUNT
9641: *
9642: * MERGE HERE AFTER PROCESSING ONE SET OF BOUNDS
9643: *
9644: SAR06 BNZ WA,SAR03 LOOP BACK UNLESS END OF BOUNDS
9645: BNZ ARPTR,SAR09 JUMP IF END OF PASS 2
9646: EJC
9647: *
9648: * ARRAY (CONTINUED)
9649: *
9650: * HERE AT END OF PASS ONE, BUILD ARBLK
9651: *
9652: LDI ARNEL GET NUMBER OF ELEMENTS
9653: MFI WB,SAR11 GET AS ADDR INTEGER, TEST OVFLO
9654: WTB WB ELSE CONVERT TO LENGTH IN BYTES
9655: MOV *ARSI$,WA SET SIZE OF STANDARD FIELDS
9656: LCT WC,ARCDM SET DIMENSION COUNT TO CONTROL LOOP
9657: *
9658: * LOOP TO ALLOW SPACE FOR DIMENSIONS
9659: *
9660: SAR07 ADD *ARDMS,WA ALLOW SPACE FOR ONE SET OF BOUNDS
9661: BCT WC,SAR07 LOOP BACK TILL ALL ACCOUNTED FOR
9662: MOV WA,XL SAVE SIZE (=AROFS)
9663: *
9664: * NOW ALLOCATE SPACE FOR ARBLK
9665: *
9666: ADD WB,WA ADD SPACE FOR ELEMENTS
9667: ICA WA ALLOW FOR ARPRO PROTOTYPE FIELD
9668: BGE WA,MXLEN,SAR11 FAIL IF TOO LARGE
9669: JSR ALLOC ELSE ALLOCATE ARBLK
9670: MOV (XS),WB LOAD DEFAULT VALUE
9671: MOV XR,(XS) SAVE ARBLK POINTER
9672: MOV WA,WC SAVE LENGTH IN BYTES
9673: BTW WA CONVERT LENGTH BACK TO WORDS
9674: LCT WA,WA SET COUNTER TO CONTROL LOOP
9675: *
9676: * LOOP TO CLEAR ENTIRE ARBLK TO DEFAULT VALUE
9677: *
9678: SAR08 MOV WB,(XR)+ SET ONE WORD
9679: BCT WA,SAR08 LOOP TILL ALL SET
9680: EJC
9681: *
9682: * ARRAY (CONTINUED)
9683: *
9684: * NOW SET INITIAL FIELDS OF ARBLK
9685: *
9686: MOV (XS)+,XR RELOAD ARBLK POINTER
9687: MOV (XS),WB LOAD PROTOTYPE
9688: MOV =B$ART,(XR) SET TYPE WORD
9689: MOV WC,ARLEN(XR) STORE LENGTH IN BYTES
9690: ZER IDVAL(XR) ZERO ID TILL WE GET IT BUILT
9691: MOV XL,AROFS(XR) SET PROTOTYPE FIELD PTR
9692: MOV ARCDM,ARNDM(XR) SET NUMBER OF DIMENSIONS
9693: MOV XR,WC SAVE ARBLK POINTER
9694: ADD XL,XR POINT TO PROTOTYPE FIELD
9695: MOV WB,(XR) STORE PROTOTYPE PTR IN ARBLK
9696: MOV *ARLBD,ARPTR SET OFFSET FOR PASS 2 BOUNDS SCAN
9697: MOV WB,R$XSC RESET STRING POINTER FOR XSCAN
9698: MOV WC,(XS) STORE ARBLK POINTER ON STACK
9699: ZER XSOFS RESET OFFSET PTR TO START OF STRING
9700: BRN SAR03 JUMP BACK TO RESCAN BOUNDS
9701: *
9702: * HERE AFTER FILLING IN BOUNDS INFORMATION (END PASS TWO)
9703: *
9704: SAR09 MOV (XS)+,XR RELOAD POINTER TO ARBLK
9705: BRN EXSID EXIT SETTING IDVAL
9706: *
9707: * HERE FOR BAD DIMENSION
9708: *
9709: SAR10 ERB 067,ARRAY DIMENSION IS ZERO,NEGATIVE OR OUT OF RANGE
9710: *
9711: * HERE IF ARRAY IS TOO LARGE
9712: *
9713: SAR11 ERB 068,ARRAY SIZE EXCEEDS MAXIMUM PERMITTED
9714: EJC
9715: *
9716: * BUFFER
9717: *
9718: S$BUF ENT ENTRY POINT
9719: MOV (XS)+,XL GET INITIAL VALUE
9720: MOV (XS)+,XR GET REQUESTED ALLOCATION
9721: JSR GTINT CONVERT TO INTEGER
9722: ERR 269,BUFFER FIRST ARGUMENT IS NOT INTEGER
9723: LDI ICVAL(XR) GET VALUE
9724: ILE SBF01 BRANCH IF NEGATIVE OR ZERO
9725: MFI WA,SBF02 MOVE WITH OVERFLOW CHECK
9726: JSR ALOBF ALLOCATE THE BUFFER
9727: JSR APNDB COPY IT IN
9728: ERR 270,BUFFER SECOND ARGUMENT IS NOT STRING OR BUFFER
9729: ERR 271,BUFFER INITIAL VALUE TOO BIG FOR ALLOCATION
9730: BRN EXSID EXIT SETTING IDVAL
9731: *
9732: * HERE FOR INVALID ALLOCATION SIZE
9733: *
9734: SBF01 ERB 272,BUFFER FIRST ARGUMENT IS NOT POSITIVE
9735: *
9736: * HERE FOR ALLOCATION SIZE INTEGER OVERFLOW
9737: *
9738: SBF02 ERB 273,BUFFER SIZE IS TOO BIG
9739: EJC
9740: *
9741: * BREAK
9742: *
9743: S$BRK ENT ENTRY POINT
9744: MOV =P$BKS,WB SET PCODE FOR SINGLE CHAR CASE
9745: MOV =P$BRK,XL PCODE FOR MULTI-CHAR CASE
9746: MOV =P$BKD,WC PCODE FOR EXPRESSION CASE
9747: JSR PATST CALL COMMON ROUTINE TO BUILD NODE
9748: ERR 069,BREAK ARGUMENT IS NOT STRING OR EXPRESSION
9749: BRN EXIXR JUMP FOR NEXT CODE WORD
9750: EJC
9751: *
9752: * BREAKX
9753: *
9754: * BREAKX IS A COMPOUND PATTERN. SEE DESCRIPTION AT START
9755: * OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED.
9756: *
9757: S$BKX ENT ENTRY POINT
9758: MOV =P$BKS,WB PCODE FOR SINGLE CHAR ARGUMENT
9759: MOV =P$BRK,XL PCODE FOR MULTI-CHAR ARGUMENT
9760: MOV =P$BXD,WC PCODE FOR EXPRESSION CASE
9761: JSR PATST CALL COMMON ROUTINE TO BUILD NODE
9762: ERR 070,BREAKX ARGUMENT IS NOT STRING OR EXPRESSION
9763: *
9764: * NOW HOOK BREAKX NODE ON AT FRONT END
9765: *
9766: MOV XR,-(XS) SAVE PTR TO BREAK NODE
9767: MOV =P$BKX,WB SET PCODE FOR BREAKX NODE
9768: JSR PBILD BUILD IT
9769: MOV (XS),PTHEN(XR) SET BREAK NODE AS SUCCESSOR
9770: MOV =P$ALT,WB SET PCODE FOR ALTERNATION NODE
9771: JSR PBILD BUILD (PARM1=ALT=BREAKX NODE)
9772: MOV XR,WA SAVE PTR TO ALTERNATION NODE
9773: MOV (XS),XR POINT TO BREAK NODE
9774: MOV WA,PTHEN(XR) SET ALTERNATE NODE AS SUCCESSOR
9775: BRN EXITS EXIT WITH RESULT ON STACK
9776: EJC
9777: *
9778: * CHAR
9779: *
9780: S$CHR ENT ENTRY POINT
9781: JSR GTSMI CONVERT ARG TO INTEGER
9782: ERR 281,CHAR ARGUMENT NOT INTEGER
9783: PPM SCHR1 TOO BIG ERROR EXIT
9784: BGE WC,=CFP$A,SCHR1 SEE IF OUT OF RANGE OF HOST SET
9785: MOV =NUM01,WA IF NOT SET SCBLK ALLOCATION
9786: MOV WC,WB SAVE CHAR CODE
9787: JSR ALOCS ALLOCATE 1 BAU SCBLK
9788: MOV XR,XL COPY SCBLK POINTER
9789: PSC XL GET SET TO STUFF CHAR
9790: SCH WB,(XL)+ STUFF IT
9791: ZER XL CLEAR SLOP IN XL
9792: BRN EXIXR EXIT WITH SCBLK POINTER
9793: *
9794: * HERE IF CHAR ARGUMENT IS OUT OF RANGE
9795: *
9796: SCHR1 ERB 282,CHAR ARGUMENT NOT IN RANGE
9797: EJC
9798: *
9799: * CLEAR
9800: *
9801: S$CLR ENT ENTRY POINT
9802: JSR XSCNI INITIALIZE TO SCAN ARGUMENT
9803: ERR 071,CLEAR ARGUMENT IS NOT STRING
9804: PPM SCLR2 JUMP IF NULL
9805: *
9806: * LOOP TO SCAN OUT NAMES IN FIRST ARGUMENT. VARIABLES IN
9807: * THE LIST ARE FALGGED BY SETTING VRGET OF VRBLK TO ZERO.
9808: *
9809: SCLR1 MOV =CH$CM,WC SET DELIMITER ONE = COMMA
9810: MOV WC,XL DELIMITER TWO = COMMA
9811: JSR XSCAN SCAN NEXT VARIABLE NAME
9812: JSR GTNVR LOCATE VRBLK
9813: ERR 072,CLEAR ARGUMENT HAS NULL VARIABLE NAME
9814: ZER VRGET(XR) ELSE FLAG BY ZEROING VRGET FIELD
9815: BNZ WA,SCLR1 LOOP BACK IF STOPPED BY COMMA
9816: *
9817: * HERE AFTER FLAGGING VARIABLES IN ARGUMENT LIST
9818: *
9819: SCLR2 MOV HSHTB,WB POINT TO START OF HASH TABLE
9820: *
9821: * LOOP THROUGH SLOTS IN HASH TABLE
9822: *
9823: SCLR3 BEQ WB,HSHTE,EXNUL EXIT RETURNING NULL IF NONE LEFT
9824: MOV WB,XR ELSE COPY SLOT POINTER
9825: ICA WB BUMP SLOT POINTER
9826: SUB *VRNXT,XR SET OFFSET TO MERGE INTO LOOP
9827: *
9828: * LOOP THROUGH VRBLKS ON ONE HASH CHAIN
9829: *
9830: SCLR4 MOV VRNXT(XR),XR POINT TO NEXT VRBLK ON CHAIN
9831: BZE XR,SCLR3 JUMP FOR NEXT BUCKET IF CHAIN END
9832: BNZ VRGET(XR),SCLR5 JUMP IF NOT FLAGGED
9833: EJC
9834: *
9835: * CLEAR (CONTINUED)
9836: *
9837: * HERE FOR FLAGGED VARIABLE, DO NOT SET VALUE TO NULL
9838: *
9839: JSR SETVR FOR FLAGGED VAR, RESTORE VRGET
9840: BRN SCLR4 AND LOOP BACK FOR NEXT VRBLK
9841: *
9842: * HERE TO SET VALUE OF A VARIABLE TO NULL
9843: * PRROTECTED VARIABLES (ARB, ETC) ARE EXEMPT
9844: *
9845: SCLR5 BEQ VRSTO(XR),=B$VRE,SCLR4 CHECK FOR PROTECTED VARIABLE (REG05)
9846: MOV XR,XL COPY VRBLK POINTER (REG05)
9847: *
9848: * LOOP TO LOCATE VALUE AT END OF POSSIBLE TRBLK CHAIN
9849: *
9850: SCLR6 MOV XL,WA SAVE BLOCK POINTER
9851: MOV VRVAL(XL),XL LOAD NEXT VALUE FIELD
9852: BEQ (XL),=B$TRT,SCLR6 LOOP BACK IF TRAPPED
9853: *
9854: * NOW STORE THE NULL VALUE
9855: *
9856: MOV WA,XL RESTORE BLOCK POINTER
9857: MOV =NULLS,VRVAL(XL) STORE NULL CONSTANT VALUE
9858: BRN SCLR4 LOOP BACK FOR NEXT VRBLK
9859: EJC
9860: *
9861: * CODE
9862: *
9863: S$COD ENT ENTRY POINT
9864: MOV (XS)+,XR LOAD ARGUMENT
9865: JSR GTCOD CONVERT TO CODE
9866: PPM EXFAL FAIL IF CONVERSION IS IMPOSSIBLE
9867: BRN EXIXR ELSE RETURN CODE AS RESULT
9868: EJC
9869: *
9870: * COLLECT
9871: *
9872: S$COL ENT ENTRY POINT
9873: MOV (XS)+,XR LOAD ARGUMENT
9874: JSR GTINT CONVERT TO INTEGER
9875: ERR 073,COLLECT ARGUMENT IS NOT INTEGER
9876: LDI ICVAL(XR) LOAD COLLECT ARGUMENT
9877: STI CLSVI SAVE COLLECT ARGUMENT
9878: ZER WB SET NO MOVE UP
9879: JSR GBCOL PERFORM GARBAGE COLLECTION
9880: MOV DNAME,WA POINT TO END OF MEMORY
9881: SUB DNAMP,WA SUBTRACT NEXT LOCATION
9882: BTW WA CONVERT BYTES TO WORDS
9883: MTI WA CONVERT WORDS AVAILABLE AS INTEGER
9884: SBI CLSVI SUBTRACT ARGUMENT
9885: IOV EXFAL FAIL IF OVERFLOW
9886: ILT EXFAL FAIL IF NOT ENOUGH
9887: ADI CLSVI ELSE RECOMPUTE AVAILABLE
9888: BRN EXINT AND EXIT WITH INTEGER RESULT
9889: EJC
9890: *
9891: * CONVERT
9892: *
9893: S$CNV ENT ENTRY POINT
9894: JSR GTSTG CONVERT SECOND ARGUMENT TO STRING
9895: ERR 074,CONVERT SECOND ARGUMENT IS NOT STRING
9896: JSR FLSTG FOLD LOWER CASE TO UPPER CASE
9897: MOV (XS),XL LOAD FIRST ARGUMENT
9898: BNE (XL),=B$PDT,SCV01 JUMP IF NOT PROGRAM DEFINED
9899: *
9900: * HERE FOR PROGRAM DEFINED DATATYPE
9901: *
9902: MOV PDDFP(XL),XL POINT TO DFBLK
9903: MOV DFNAM(XL),XL LOAD DATATYPE NAME
9904: JSR IDENT COMPARE WITH SECOND ARG
9905: PPM EXITS EXIT IF IDENT WITH ARG AS RESULT
9906: BRN EXFAL ELSE FAIL
9907: *
9908: * HERE IF NOT PROGRAM DEFINED DATATYPE
9909: *
9910: SCV01 MOV XR,-(XS) SAVE STRING ARGUMENT
9911: MOV =SVCTB,XL POINT TO TABLE OF NAMES TO COMPARE
9912: ZER WB INITIALIZE COUNTER
9913: MOV WA,WC SAVE LENGTH OF ARGUMENT STRING
9914: *
9915: * LOOP THROUGH TABLE ENTRIES
9916: *
9917: SCV02 MOV (XL)+,XR LOAD NEXT TABLE ENTRY, BUMP POINTER
9918: BZE XR,EXFAL FAIL IF ZERO MARKING END OF LIST
9919: BNE WC,SCLEN(XR),SCV05 JUMP IF WRONG LENGTH
9920: MOV XL,CNVTP ELSE STORE TABLE POINTER
9921: PLC XR POINT TO CHARS OF TABLE ENTRY
9922: MOV (XS),XL LOAD POINTER TO STRING ARGUMENT
9923: PLC XL POINT TO CHARS OF STRING ARG
9924: MOV WC,WA SET NUMBER OF CHARS TO COMPARE
9925: CMC SCV04,SCV04 COMPARE, JUMP IF NO MATCH
9926: EJC
9927: *
9928: * CONVERT (CONTINUED)
9929: *
9930: * HERE WE HAVE A MATCH
9931: *
9932: SCV03 MOV WB,XL COPY ENTRY NUMBER
9933: ICA XS POP STRING ARG OFF STACK
9934: MOV (XS)+,XR LOAD FIRST ARGUMENT
9935: BSW XL,CNVTT JUMP TO APPROPRIATE ROUTINE
9936: IFF 0,SCV06 STRING
9937: IFF 1,SCV07 INTEGER
9938: IFF 2,SCV09 NAME
9939: IFF 3,SCV10 PATTERN
9940: IFF 4,SCV11 ARRAY
9941: IFF 5,SCV19 TABLE
9942: IFF 6,SCV25 EXPRESSION
9943: IFF 7,SCV26 CODE
9944: IFF 8,SCV27 NUMERIC
9945: IFF CNVRT,SCV08 REAL
9946: IFF CNVBT,SCV28 BUFFER
9947: ESW END OF SWITCH TABLE
9948: *
9949: * HERE IF NO MATCH WITH TABLE ENTRY
9950: *
9951: SCV04 MOV CNVTP,XL RESTORE TABLE POINTER, MERGE
9952: *
9953: * MERGE HERE IF LENGTHS DID NOT MATCH
9954: *
9955: SCV05 ICV WB BUMP ENTRY NUMBER
9956: BRN SCV02 LOOP BACK TO CHECK NEXT ENTRY
9957: *
9958: * HERE TO CONVERT TO STRING
9959: *
9960: SCV06 MOV XR,-(XS) REPLACE STRING ARGUMENT ON STACK
9961: JSR GTSTG CONVERT TO STRING
9962: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE
9963: BRN EXIXR ELSE RETURN STRING
9964: EJC
9965: *
9966: * CONVERT (CONTINUED)
9967: *
9968: * HERE TO CONVERT TO INTEGER
9969: *
9970: SCV07 JSR GTINT CONVERT TO INTEGER
9971: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE
9972: BRN EXIXR ELSE RETURN INTEGER
9973: *
9974: * HERE TO CONVERT TO REAL
9975: *
9976: SCV08 JSR GTREA CONVERT TO REAL
9977: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE
9978: BRN EXIXR ELSE RETURN REAL
9979: *
9980: * HERE TO CONVERT TO NAME
9981: *
9982: SCV09 BEQ (XR),=B$NML,EXIXR RETURN IF ALREADY A NAME
9983: JSR GTNVR ELSE TRY STRING TO NAME CONVERT
9984: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE
9985: BRN EXVNM ELSE EXIT BUILDING NMBLK FOR VRBLK
9986: *
9987: * HERE TO CONVERT TO PATTERN
9988: *
9989: SCV10 JSR GTPAT CONVERT TO PATTERN
9990: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE
9991: BRN EXIXR ELSE RETURN PATTERN
9992: *
9993: * CONVERT TO ARRAY
9994: *
9995: SCV11 JSR GTARR GET AN ARRAY
9996: PPM EXFAL FAIL IF NOT CONVERTIBLE
9997: BRN EXSID EXIT SETTING ID FIELD
9998: *
9999: * CONVERT TO TABLE
10000: *
10001: SCV19 MOV (XR),WA LOAD FIRST WORD OF BLOCK
10002: MOV XR,-(XS) REPLACE ARBLK POINTER ON STACK
10003: BEQ WA,=B$TBT,EXITS RETURN ARG IF ALREADY A TABLE
10004: BNE WA,=B$ART,EXFAL ELSE FAIL IF NOT AN ARRAY
10005: EJC
10006: *
10007: * CONVERT (CONTINUED)
10008: *
10009: * HERE TO CONVERT AN ARRAY TO TABLE
10010: *
10011: BNE ARNDM(XR),=NUM02,EXFAL FAIL IF NOT 2-DIM ARRAY
10012: LDI ARDM2(XR) LOAD DIM 2
10013: SBI INTV2 SUBTRACT 2 TO COMPARE
10014: INE EXFAL FAIL IF DIM2 NOT 2
10015: *
10016: * HERE WE HAVE AN ARBLK OF THE RIGHT SHAPE
10017: *
10018: LDI ARDIM(XR) LOAD DIM 1 (NUMBER OF ELEMENTS)
10019: MFI WA GET AS ONE WORD INTEGER
10020: LCT WB,WA COPY TO CONTROL LOOP
10021: ADD =TBSI$,WA ADD SPACE FOR STANDARD FIELDS
10022: WTB WA CONVERT LENGTH TO BYTES
10023: JSR ALLOC ALLOCATE SPACE FOR TBBLK
10024: MOV XR,WC COPY TBBLK POINTER
10025: MOV XR,-(XS) SAVE TBBLK POINTER
10026: MOV =B$TBT,(XR)+ STORE TYPE WORD
10027: ZER (XR)+ STORE ZERO FOR IDVAL FOR NOW
10028: MOV WA,(XR)+ STORE LENGTH
10029: MOV =NULLS,(XR)+ NULL INITIAL LOOKUP VALUE
10030: *
10031: * LOOP TO INITIALIZE BUCKET PTRS TO POINT TO TABLE
10032: *
10033: SCV20 MOV WC,(XR)+ SET BUCKET PTR TO POINT TO TBBLK
10034: BCT WB,SCV20 LOOP TILL ALL INITIALIZED
10035: MOV *ARVL2,WB SET OFFSET TO FIRST ARBLK ELEMENT
10036: *
10037: * LOOP TO COPY ELEMENTS FROM ARRAY TO TABLE
10038: *
10039: SCV21 MOV 1(XS),XL POINT TO ARBLK
10040: BEQ WB,ARLEN(XL),SCV24 JUMP IF ALL MOVED
10041: ADD WB,XL ELSE POINT TO CURRENT LOCATION
10042: ADD *NUM02,WB BUMP OFFSET
10043: MOV (XL),XR LOAD SUBSCRIPT NAME
10044: DCA XL ADJUST PTR TO MERGE (TRVAL=1+1)
10045: EJC
10046: *
10047: * CONVERT (CONTINUED)
10048: *
10049: * LOOP TO CHASE DOWN TRBLK CHAIN FOR VALUE
10050: *
10051: SCV22 MOV TRVAL(XL),XL POINT TO NEXT VALUE
10052: BEQ (XL),=B$TRT,SCV22 LOOP BACK IF TRAPPED
10053: *
10054: * HERE WITH NAME IN XR, VALUE IN XL
10055: *
10056: SCV23 MOV XL,-(XS) STACK VALUE
10057: MOV 1(XS),XL LOAD TBBLK POINTER
10058: JSR TFIND BUILD TEBLK (NOTE WB GT 0 BY NAME)
10059: PPM EXFAL FAIL IF ACESS FAILS
10060: MOV (XS)+,TEVAL(XL) STORE VALUE IN TEBLK
10061: BRN SCV21 LOOP BACK FOR NEXT ELEMENT
10062: *
10063: * HERE AFTER MOVING ALL ELEMENTS TO TBBLK
10064: *
10065: SCV24 MOV (XS)+,XR LOAD TBBLK POINTER
10066: ICA XS POP ARBLK POINTER
10067: BRN EXSID EXIT SETTING IDVAL
10068: *
10069: * CONVERT TO EXPRESSION
10070: *
10071: SCV25 JSR GTEXP CONVERT TO EXPRESSION
10072: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE
10073: BRN EXIXR ELSE RETURN EXPRESSION
10074: *
10075: * CONVERT TO CODE
10076: *
10077: SCV26 JSR GTCOD CONVERT TO CODE
10078: PPM EXFAL FAIL IF CONVERSION IS NOT POSSIBLE
10079: BRN EXIXR ELSE RETURN CODE
10080: *
10081: * CONVERT TO NUMERIC
10082: *
10083: SCV27 JSR GTNUM CONVERT TO NUMERIC
10084: PPM EXFAL FAIL IF UNCONVERTIBLE
10085: BRN EXIXR RETURN NUMBER
10086: EJC
10087: *
10088: * CONVERT TO BUFFER
10089: *
10090: SCV28 MOV XR,-(XS) STACK STRING FOR PROCEDURE
10091: JSR GTSTG CONVERT TO STRING
10092: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE
10093: MOV XR,XL SAVE STRING POINTER
10094: JSR ALOBF ALLOCATE BUFFER OF SAME SIZE
10095: JSR APNDB COPY IN THE STRING
10096: PPM ALREADY STRING - CANT FAIL TO CNV
10097: PPM MUST BE ENOUGH ROOM
10098: BRN EXSID EXIT SETTING IDVAL FIELD
10099: EJC
10100: *
10101: * COPY
10102: *
10103: S$COP ENT ENTRY POINT
10104: JSR COPYB COPY THE BLOCK
10105: PPM EXITS RETURN IF NO IDVAL FIELD
10106: BRN EXSID EXIT SETTING ID VALUE
10107: EJC
10108: *
10109: * DATA
10110: *
10111: S$DAT ENT ENTRY POINT
10112: JSR XSCNI PREPARE TO SCAN ARGUMENT
10113: ERR 075,DATA ARGUMENT IS NOT STRING
10114: ERR 076,DATA ARGUMENT IS NULL
10115: *
10116: * SCAN OUT DATATYPE NAME
10117: *
10118: MOV =CH$PP,WC DELIMITER ONE = LEFT PAREN
10119: MOV WC,XL DELIMITER TWO = LEFT PAREN
10120: JSR XSCAN SCAN DATATYPE NAME
10121: BNZ WA,SDAT1 SKIP IF LEFT PAREN FOUND
10122: ERB 077,DATA ARGUMENT IS MISSING A LEFT PAREN
10123: *
10124: * HERE AFTER SCANNING DATATYPE NAME
10125: *
10126: SDAT1 MOV SCLEN(XR),WA GET LENGTH
10127: JSR FLSTG FOLD LOWER CASE TO UPPER CASE
10128: MOV XR,XL SAVE NAME PTR
10129: MOV SCLEN(XR),WA GET LENGTH
10130: CTB WA,SCSI$ COMPUTE SPACE NEEDED
10131: JSR ALOST REQUEST STATIC STORE FOR NAME
10132: MOV XR,-(XS) SAVE DATATYPE NAME
10133: MVW COPY NAME TO STATIC
10134: MOV (XS),XR GET NAME PTR
10135: ZER XL SCRUB DUD REGISTER
10136: JSR GTNVR LOCATE VRBLK FOR DATATYPE NAME
10137: ERR 078,DATA ARGUMENT HAS NULL DATATYPE NAME
10138: MOV XR,DATDV SAVE VRBLK POINTER FOR DATATYPE
10139: MOV XS,DATXS STORE STARTING STACK VALUE
10140: ZER WB ZERO COUNT OF FIELD NAMES
10141: *
10142: * LOOP TO SCAN FIELD NAMES AND STACK VRBLK POINTERS
10143: *
10144: SDAT2 MOV =CH$RP,WC DELIMITER ONE = RIGHT PAREN
10145: MOV =CH$CM,XL DELIMITER TWO = COMMA
10146: JSR XSCAN SCAN NEXT FIELD NAME
10147: BNZ WA,SDAT3 JUMP IF DELIMITER FOUND
10148: ERB 079,DATA ARGUMENT IS MISSING A RIGHT PAREN
10149: *
10150: * HERE AFTER SCANNING OUT ONE FIELD NAME
10151: *
10152: SDAT3 JSR GTNVR LOCATE VRBLK FOR FIELD NAME
10153: ERR 080,DATA ARGUMENT HAS NULL FIELD NAME
10154: MOV XR,-(XS) STACK VRBLK POINTER
10155: ICV WB INCREMENT COUNTER
10156: BEQ WA,=NUM02,SDAT2 LOOP BACK IF STOPPED BY COMMA
10157: EJC
10158: *
10159: * DATA (CONTINUED)
10160: *
10161: * NOW BUILD THE DFBLK
10162: *
10163: MOV =DFSI$,WA SET SIZE OF DFBLK STANDARD FIELDS
10164: ADD WB,WA ADD NUMBER OF FIELDS
10165: WTB WA CONVERT LENGTH TO BYTES
10166: MOV WB,WC PRESERVE NO. OF FIELDS
10167: JSR ALOST ALLOCATE SPACE FOR DFBLK
10168: MOV WC,WB GET NO OF FIELDS
10169: MOV DATXS,XT POINT TO START OF STACK
10170: MOV (XT),WC LOAD DATATYPE NAME
10171: MOV XR,(XT) SAVE DFBLK POINTER ON STACK
10172: MOV =B$DFC,(XR)+ STORE TYPE WORD
10173: MOV WB,(XR)+ STORE NUMBER OF FIELDS (FARGS)
10174: MOV WA,(XR)+ STORE LENGTH (DFLEN)
10175: SUB *PDDFS,WA COMPUTE PDBLK LENGTH (FOR DFPDL)
10176: MOV WA,(XR)+ STORE PDBLK LENGTH (DFPDL)
10177: MOV WC,(XR)+ STORE DATATYPE NAME (DFNAM)
10178: LCT WC,WB COPY NUMBER OF FIELDS
10179: *
10180: * LOOP TO MOVE FIELD NAME VRBLK POINTERS TO DFBLK
10181: *
10182: SDAT4 MOV -(XT),(XR)+ MOVE ONE FIELD NAME VRBLK POINTER
10183: BCT WC,SDAT4 LOOP TILL ALL MOVED
10184: *
10185: * NOW DEFINE THE DATATYPE FUNCTION
10186: *
10187: MOV WA,WC COPY LENGTH OF PDBLK FOR LATER LOOP
10188: MOV DATDV,XR POINT TO VRBLK
10189: MOV DATXS,XT POINT BACK ON STACK
10190: MOV (XT),XL LOAD DFBLK POINTER
10191: JSR DFFNC DEFINE FUNCTION
10192: EJC
10193: *
10194: * DATA (CONTINUED)
10195: *
10196: * LOOP TO BUILD FFBLKS
10197: *
10198: *
10199: * NOTICE THAT THE FFBLKS ARE CONSTRUCTED IN REVERSE ORDER
10200: * SO THAT THE REQUIRED OFFSETS CAN BE OBTAINED FROM
10201: * SUCCESSIVE DECREMENTATION OF THE PDBLK LENGTH (IN WC).
10202: *
10203: SDAT5 MOV *FFSI$,WA SET LENGTH OF FFBLK
10204: JSR ALLOC ALLOCATE SPACE FOR FFBLK
10205: MOV =B$FFC,(XR) SET TYPE WORD
10206: MOV =NUM01,FARGS(XR) STORE FARGS (ALWAYS ONE)
10207: MOV DATXS,XT POINT BACK ON STACK
10208: MOV (XT),FFDFP(XR) COPY DFBLK PTR TO FFBLK
10209: DCA WC DECREMENT OLD DFPDL TO GET NEXT OFS
10210: MOV WC,FFOFS(XR) SET OFFSET TO THIS FIELD
10211: ZER FFNXT(XR) TENTATIVELY SET ZERO FORWARD PTR
10212: MOV XR,XL COPY FFBLK POINTER FOR DFFNC
10213: MOV (XS),XR LOAD VRBLK POINTER FOR FIELD
10214: MOV VRFNC(XR),XR LOAD CURRENT FUNCTION POINTER
10215: BNE (XR),=B$FFC,SDAT6 SKIP IF NOT CURRENTLY A FIELD FUNC
10216: *
10217: * HERE WE MUST CHAIN AN OLD FFBLK PTR TO PRESERVE IT IN THE
10218: * CASE OF MULTIPLE FIELD FUNCTIONS WITH THE SAME NAME
10219: *
10220: MOV XR,FFNXT(XL) LINK NEW FFBLK TO PREVIOUS CHAIN
10221: *
10222: * MERGE HERE TO DEFINE FIELD FUNCTION
10223: *
10224: SDAT6 MOV (XS)+,XR LOAD VRBLK POINTER
10225: JSR DFFNC DEFINE FIELD FUNCTION
10226: BNE XS,DATXS,SDAT5 LOOP BACK TILL ALL DONE
10227: ICA XS POP DFBLK POINTER
10228: BRN EXNUL RETURN WITH NULL RESULT
10229: EJC
10230: *
10231: * DATATYPE
10232: *
10233: S$DTP ENT ENTRY POINT
10234: MOV (XS)+,XR LOAD ARGUMENT
10235: JSR DTYPE GET DATATYPE
10236: BRN EXIXR AND RETURN IT AS RESULT
10237: EJC
10238: *
10239: * DATE
10240: *
10241: S$DTE ENT ENTRY POINT
10242: JSR SYSDT CALL SYSTEM DATE ROUTINE
10243: MOV 1(XL),WA LOAD LENGTH FOR SBSTR
10244: BZE WA,EXNUL RETURN NULL IF LENGTH IS ZERO
10245: ZER WB SET ZERO OFFSET
10246: JSR SBSTR USE SBSTR TO BUILD SCBLK
10247: BRN EXIXR RETURN DATE STRING
10248: EJC
10249: *
10250: * DEFINE
10251: *
10252: S$DEF ENT ENTRY POINT
10253: MOV (XS)+,XR LOAD SECOND ARGUMENT
10254: ZER DEFLB ZERO LABEL POINTER IN CASE NULL
10255: BEQ XR,=NULLS,SDF01 JUMP IF NULL SECOND ARGUMENT
10256: JSR GTNVR ELSE FIND VRBLK FOR LABEL
10257: PPM SDF13 JUMP IF NOT A VARIABLE NAME
10258: MOV XR,DEFLB ELSE SET SPECIFIED ENTRY
10259: *
10260: * SCAN FUNCTION NAME
10261: *
10262: SDF01 JSR XSCNI PREPARE TO SCAN FIRST ARGUMENT
10263: ERR 081,DEFINE FIRST ARGUMENT IS NOT STRING
10264: ERR 082,DEFINE FIRST ARGUMENT IS NULL
10265: MOV =CH$PP,WC DELIMITER ONE = LEFT PAREN
10266: MOV WC,XL DELIMITER TWO = LEFT PAREN
10267: JSR XSCAN SCAN OUT FUNCTION NAME
10268: BNZ WA,SDF02 JUMP IF LEFT PAREN FOUND
10269: ERB 083,DEFINE FIRST ARGUMENT IS MISSING A LEFT PAREN
10270: *
10271: * HERE AFTER SCANNING OUT FUNCTION NAME
10272: *
10273: SDF02 JSR GTNVR GET VARIABLE NAME
10274: ERR 084,DEFINE FIRST ARGUMENT HAS NULL FUNCTION NAME
10275: MOV XR,DEFVR SAVE VRBLK POINTER FOR FUNCTION NAM
10276: ZER WB ZERO COUNT OF ARGUMENTS
10277: MOV XS,DEFXS SAVE INITIAL STACK POINTER
10278: BNZ DEFLB,SDF03 JUMP IF SECOND ARGUMENT GIVEN
10279: MOV XR,DEFLB ELSE DEFAULT IS FUNCTION NAME
10280: *
10281: * LOOP TO SCAN ARGUMENT NAMES AND STACK VRBLK POINTERS
10282: *
10283: SDF03 MOV =CH$RP,WC DELIMITER ONE = RIGHT PAREN
10284: MOV =CH$CM,XL DELIMITER TWO = COMMA
10285: JSR XSCAN SCAN OUT NEXT ARGUMENT NAME
10286: BNZ WA,SDF04 SKIP IF DELIMITER FOUND
10287: ERB 085,NULL ARG NAME OR MISSING ) IN DEFINE FIRST ARG.
10288: EJC
10289: *
10290: * DEFINE (CONTINUED)
10291: *
10292: * HERE AFTER SCANNING AN ARGUMENT NAME
10293: *
10294: SDF04 BNE XR,=NULLS,SDF05 SKIP IF NON-NULL
10295: BZE WB,SDF06 IGNORE NULL IF CASE OF NO ARGUMENTS
10296: *
10297: * HERE AFTER DEALING WITH THE CASE OF NO ARGUMENTS
10298: *
10299: SDF05 JSR GTNVR GET VRBLK POINTER
10300: PPM SDF03 LOOP BACK TO IGNORE NULL NAME
10301: MOV XR,-(XS) STACK ARGUMENT VRBLK POINTER
10302: ICV WB INCREMENT COUNTER
10303: BEQ WA,=NUM02,SDF03 LOOP BACK IF STOPPED BY A COMMA
10304: *
10305: * HERE AFTER SCANNING OUT FUNCTION ARGUMENT NAMES
10306: *
10307: SDF06 MOV WB,DEFNA SAVE NUMBER OF ARGUMENTS
10308: ZER WB ZERO COUNT OF LOCALS
10309: *
10310: * LOOP TO SCAN LOCAL NAMES AND STACK VRBLK POINTERS
10311: *
10312: SDF07 MOV =CH$CM,WC SET DELIMITER ONE = COMMA
10313: MOV WC,XL SET DELIMITER TWO = COMMA
10314: JSR XSCAN SCAN OUT NEXT LOCAL NAME
10315: BNE XR,=NULLS,SDF08 SKIP IF NON-NULL
10316: BZE WB,SDF09 IGNORE NULL IF CASE OF NO LOCALS
10317: *
10318: * HERE AFTER SCANNING OUT A LOCAL NAME
10319: *
10320: SDF08 JSR GTNVR GET VRBLK POINTER
10321: PPM SDF07 LOOP BACK TO IGNORE NULL NAME
10322: ICV WB IF OK, INCREMENT COUNT
10323: MOV XR,-(XS) STACK VRBLK POINTER
10324: BNZ WA,SDF07 LOOP BACK IF STOPPED BY A COMMA
10325: EJC
10326: *
10327: * DEFINE (CONTINUED)
10328: *
10329: * HERE AFTER SCANNING LOCALS, BUILD PFBLK
10330: *
10331: SDF09 MOV WB,WA COPY COUNT OF LOCALS
10332: ADD DEFNA,WA ADD NUMBER OF ARGUMENTS
10333: MOV WA,WC SET SUM ARGS+LOCALS AS LOOP COUNT
10334: ADD =PFSI$,WA ADD SPACE FOR STANDARD FIELDS
10335: WTB WA CONVERT LENGTH TO BYTES
10336: JSR ALLOC ALLOCATE SPACE FOR PFBLK
10337: MOV XR,XL SAVE POINTER TO PFBLK
10338: MOV =B$PFC,(XR)+ STORE FIRST WORD
10339: MOV DEFNA,(XR)+ STORE NUMBER OF ARGUMENTS
10340: MOV WA,(XR)+ STORE LENGTH (PFLEN)
10341: MOV DEFVR,(XR)+ STORE VRBLK PTR FOR FUNCTION NAME
10342: MOV WB,(XR)+ STORE NUMBER OF LOCALS
10343: ZER (XR)+ DEAL WITH LABEL LATER
10344: ZER (XR)+ ZERO PFCTR
10345: ZER (XR)+ ZERO PFRTR
10346: BZE WC,SDF11 SKIP IF NO ARGS OR LOCALS
10347: MOV XL,WA KEEP PFBLK POINTER
10348: MOV DEFXS,XT POINT BEFORE ARGUMENTS
10349: LCT WC,WC GET COUNT OF ARGS+LOCALS FOR LOOP
10350: *
10351: * LOOP TO MOVE LOCALS AND ARGS TO PFBLK
10352: *
10353: SDF10 MOV -(XT),(XR)+ STORE ONE ENTRY AND BUMP POINTERS
10354: BCT WC,SDF10 LOOP TILL ALL STORED
10355: MOV WA,XL RECOVER PFBLK POINTER
10356: EJC
10357: *
10358: * DEFINE (CONTINUED)
10359: *
10360: * NOW DEAL WITH LABEL
10361: *
10362: SDF11 MOV DEFXS,XS POP STACK
10363: MOV DEFLB,XR POINT TO VRBLK FOR LABEL
10364: MOV VRLBL(XR),XR LOAD LABEL POINTER
10365: BNE (XR),=B$TRT,SDF12 SKIP IF NOT TRAPPED
10366: MOV TRLBL(XR),XR ELSE POINT TO REAL LABEL
10367: *
10368: * HERE AFTER LOCATING REAL LABEL POINTER
10369: *
10370: SDF12 BEQ XR,=STNDL,SDF13 JUMP IF LABEL IS NOT DEFINED
10371: MOV XR,PFCOD(XL) ELSE STORE LABEL POINTER
10372: MOV DEFVR,XR POINT BACK TO VRBLK FOR FUNCTION
10373: JSR DFFNC DEFINE FUNCTION
10374: BRN EXNUL AND EXIT RETURNING NULL
10375: *
10376: * HERE FOR ERRONEOUS LABEL
10377: *
10378: SDF13 ERB 086,DEFINE FUNCTION ENTRY POINT IS NOT DEFINED LABEL
10379: EJC
10380: *
10381: * DETACH
10382: *
10383: S$DET ENT ENTRY POINT
10384: MOV (XS)+,XR LOAD ARGUMENT
10385: JSR GTVAR LOCATE VARIABLE
10386: ERR 087,DETACH ARGUMENT IS NOT APPROPRIATE NAME
10387: JSR DTACH DETACH I/O ASSOCIATION FROM NAME
10388: BRN EXNUL RETURN NULL RESULT
10389: EJC
10390: *
10391: * DIFFER
10392: *
10393: S$DIF ENT ENTRY POINT
10394: MOV (XS)+,XR LOAD SECOND ARGUMENT
10395: MOV (XS)+,XL LOAD FIRST ARGUMENT
10396: JSR IDENT CALL IDENT COMPARISON ROUTINE
10397: PPM EXFAL FAIL IF IDENT
10398: BRN EXNUL RETURN NULL IF DIFFER
10399: EJC
10400: *
10401: * DUMP
10402: *
10403: S$DMP ENT ENTRY POINT
10404: JSR GTSMI LOAD DUMP ARG AS SMALL INTEGER
10405: ERR 088,DUMP ARGUMENT IS NOT INTEGER
10406: ERR 089,DUMP ARGUMENT IS NEGATIVE OR TOO LARGE
10407: JSR DUMPR ELSE CALL DUMP ROUTINE
10408: BRN EXNUL AND RETURN NULL AS RESULT
10409: EJC
10410: *
10411: * DUPL
10412: *
10413: S$DUP ENT ENTRY POINT
10414: JSR GTSMI GET SECOND ARGUMENT AS SMALL INTEGE
10415: ERR 090,DUPL SECOND ARGUMENT IS NOT INTEGER
10416: PPM SDUP7 JUMP IF NEGATIVE OT TOO BIG
10417: MOV XR,WB SAVE DUPLICATION FACTOR
10418: JSR GTSTG GET FIRST ARG AS STRING
10419: PPM SDUP4 JUMP IF NOT A STRING
10420: *
10421: * HERE FOR CASE OF DUPLICATION OF A STRING
10422: *
10423: MTI WA ACQUIRE LENGTH AS INTEGER
10424: STI DUPSI SAVE FOR THE MOMENT
10425: MTI WB GET DUPLICATION FACTOR AS INTEGER
10426: MLI DUPSI FORM PRODUCT
10427: IOV SDUP3 JUMP IF OVERFLOW
10428: IEQ EXNUL RETURN NULL IF RESULT LENGTH = 0
10429: MFI WA,SDUP3 GET AS ADDR INTEGER, CHECK OVFLO
10430: *
10431: * MERGE HERE WITH RESULT LENGTH IN WA
10432: *
10433: SDUP1 MOV XR,XL SAVE STRING POINTER
10434: JSR ALOCS ALLOCATE SPACE FOR STRING
10435: MOV XR,-(XS) SAVE AS RESULT POINTER
10436: MOV XL,WC SAVE POINTER TO ARGUMENT STRING
10437: PSC XR PREPARE TO STORE CHARS OF RESULT
10438: LCT WB,WB SET COUNTER TO CONTROL LOOP
10439: *
10440: * LOOP THROUGH DUPLICATIONS
10441: *
10442: SDUP2 MOV WC,XL POINT BACK TO ARGUMENT STRING
10443: MOV SCLEN(XL),WA GET NUMBER OF CHARACTERS
10444: PLC XL POINT TO CHARS IN ARGUMENT STRING
10445: MVC MOVE CHARACTERS TO RESULT STRING
10446: BCT WB,SDUP2 LOOP TILL ALL DUPLICATIONS DONE
10447: BRN EXITS THEN EXIT FOR NEXT CODE WORD
10448: EJC
10449: *
10450: * DUPL (CONTINUED)
10451: *
10452: * HERE IF TOO LARGE, SET MAX LENGTH AND LET ALOCS CATCH IT
10453: *
10454: SDUP3 MOV DNAME,WA SET IMPOSSIBLE LENGTH FOR ALOCS
10455: BRN SDUP1 MERGE BACK
10456: *
10457: * HERE IF NOT A STRING
10458: *
10459: SDUP4 JSR GTPAT CONVERT ARGUMENT TO PATTERN
10460: ERR 091,DUPL FIRST ARGUMENT IS NOT STRING OR PATTERN
10461: *
10462: * HERE TO DUPLICATE A PATTERN ARGUMENT
10463: *
10464: MOV XR,-(XS) STORE PATTERN ON STACK
10465: MOV =NDNTH,XR START OFF WITH NULL PATTERN
10466: BZE WB,SDUP6 NULL PATTERN IS RESULT IF DUPFAC=0
10467: MOV WB,-(XS) PRESERVE LOOP COUNT
10468: *
10469: * LOOP TO DUPLICATE BY SUCCESSIVE CONCATENATION
10470: *
10471: SDUP5 MOV XR,XL COPY CURRENT VALUE AS RIGHT ARGUMNT
10472: MOV 1(XS),XR GET A NEW COPY OF LEFT
10473: JSR PCONC CONCATENATE
10474: DCV (XS) COUNT DOWN
10475: BNZ (XS),SDUP5 LOOP
10476: ICA XS POP LOOP COUNT
10477: *
10478: * HERE TO EXIT AFTER CONSTRUCTING PATTERN
10479: *
10480: SDUP6 MOV XR,(XS) STORE RESULT ON STACK
10481: BRN EXITS EXIT WITH RESULT ON STACK
10482: *
10483: * FAIL IF SECOND ARG IS OUT OF RANGE
10484: *
10485: SDUP7 ICA XS POP FIRST ARGUMENT
10486: BRN EXFAL FAIL
10487: EJC
10488: *
10489: * EJECT
10490: *
10491: S$EJC ENT ENTRY POINT
10492: JSR IOFCB CALL FCBLK ROUTINE
10493: ERR 092,EJECT ARGUMENT IS NOT A SUITABLE NAME
10494: PPM SEJC1 NULL ARGUMENT
10495: JSR SYSEF CALL EJECT FILE FUNCTION
10496: ERR 093,EJECT FILE DOES NOT EXIST
10497: ERR 094,EJECT FILE DOES NOT PERMIT PAGE EJECT
10498: ERR 095,EJECT CAUSED NON-RECOVERABLE OUTPUT ERROR
10499: BRN EXNUL RETURN NULL AS RESULT
10500: *
10501: * HERE TO EJECT STANDARD OUTPUT FILE
10502: *
10503: SEJC1 JSR SYSEP CALL ROUTINE TO EJECT PRINTER
10504: BRN EXNUL EXIT WITH NULL RESULT
10505: EJC
10506: *
10507: * ENDFILE
10508: *
10509: S$ENF ENT ENTRY POINT
10510: JSR IOFCB CALL FCBLK ROUTINE
10511: ERR 096,ENDFILE ARGUMENT IS NOT A SUITABLE NAME
10512: ERR 097,ENDFILE ARGUMENT IS NULL
10513: JSR SYSEN CALL ENDFILE ROUTINE
10514: ERR 098,ENDFILE FILE DOES NOT EXIST
10515: ERR 099,ENDFILE FILE DOES NOT PERMIT ENDFILE
10516: ERR 100,ENDFILE CAUSED NON-RECOVERABLE OUTPUT ERROR
10517: MOV XL,WB REMEMBER VRBLK PTR FROM IOFCB CALL
10518: *
10519: * LOOP TO FIND TRTRF BLOCK
10520: *
10521: SENF1 MOV XL,XR COPY POINTER
10522: MOV TRVAL(XR),XR CHAIN ALONG
10523: BNE (XR),=B$TRT,EXNUL SKIP OUT IF CHAIN END
10524: BNE TRTYP(XR),=TRTFC,SENF1 LOOP IF NOT FOUND
10525: MOV TRVAL(XR),TRVAL(XL) REMOVE TRTRF
10526: MOV TRTRF(XR),ENFCH POINT TO HEAD OF IOCHN
10527: MOV TRFPT(XR),WC POINT TO FCBLK
10528: MOV WB,XR FILEARG1 VRBLK FROM IOFCB
10529: JSR SETVR RESET IT
10530: MOV =R$FCB,XL PTR TO HEAD OF FCBLK CHAIN
10531: SUB *NUM02,XL ADJUST READY TO ENTER LOOP
10532: *
10533: * FIND FCBLK
10534: *
10535: SENF2 MOV XL,XR COPY PTR
10536: MOV 2(XL),XL GET NEXT LINK
10537: BZE XL,SENF4 STOP IF CHAIN END
10538: BEQ 3(XL),WC,SENF3 JUMP IF FCBLK FOUND
10539: BRN SENF2 LOOP
10540: *
10541: * REMOVE FCBLK
10542: *
10543: SENF3 MOV 2(XL),2(XR) DELETE FCBLK FROM CHAIN
10544: *
10545: * LOOP WHICH DETACHES ALL VBLS ON IOCHN CHAIN
10546: *
10547: SENF4 MOV ENFCH,XL GET CHAIN HEAD
10548: BZE XL,EXNUL FINISHED IF CHAIN END
10549: MOV TRTRF(XL),ENFCH CHAIN ALONG
10550: MOV IONMO(XL),WA NAME OFFSET
10551: MOV IONMB(XL),XL NAME BASE
10552: JSR DTACH DETACH NAME
10553: BRN SENF4 LOOP TILL DONE
10554: EJC
10555: *
10556: * EQ
10557: *
10558: S$EQF ENT ENTRY POINT
10559: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE
10560: ERR 101,EQ FIRST ARGUMENT IS NOT NUMERIC
10561: ERR 102,EQ SECOND ARGUMENT IS NOT NUMERIC
10562: PPM EXFAL FAIL IF LT
10563: PPM EXNUL RETURN NULL IF EQ
10564: PPM EXFAL FAIL IF GT
10565: EJC
10566: *
10567: * EVAL
10568: *
10569: S$EVL ENT ENTRY POINT
10570: MOV (XS)+,XR LOAD ARGUMENT
10571: JSR GTEXP CONVERT TO EXPRESSION
10572: ERR 103,EVAL ARGUMENT IS NOT EXPRESSION
10573: LCW WC LOAD NEXT CODE WORD
10574: BNE WC,=OFNE$,SEVL1 JUMP IF CALLED BY VALUE
10575: SCP XL COPY CODE POINTER
10576: MOV (XL),WA GET NEXT CODE WORD
10577: BNE WA,=ORNM$,SEVL2 BY NAME UNLESS EXPRESSION
10578: BNZ 1(XS),SEVL2 JUMP IF BY NAME
10579: *
10580: * HERE IF CALLED BY VALUE
10581: *
10582: SEVL1 ZER WB SET FLAG FOR BY VALUE
10583: MOV WC,-(XS) SAVE CODE WORD
10584: JSR EVALX EVALUATE EXPRESSION BY VALUE
10585: PPM EXFAL FAIL IF EVALUATION FAILS
10586: MOV XR,XL COPY RESULT
10587: MOV (XS),XR RELOAD NEXT CODE WORD
10588: MOV XL,(XS) STACK RESULT
10589: BRI (XR) JUMP TO EXECUTE NEXT CODE WORD
10590: *
10591: * HERE IF CALLED BY NAME
10592: *
10593: SEVL2 MOV =NUM01,WB SET FLAG FOR BY NAME
10594: JSR EVALX EVALUATE EXPRESSION BY NAME
10595: PPM EXFAL FAIL IF EVALUATION FAILS
10596: BRN EXNAM EXIT WITH NAME
10597: EJC
10598: *
10599: * EXIT
10600: *
10601: S$EXT ENT ENTRY POINT
10602: ZER WB CLEAR AMOUNT OF STATIC SHIFT
10603: JSR GBCOL COMPACT MEMORY BY COLLECTING
10604: JSR GTSTG CONVERT ARG TO STRING
10605: ERR 104,EXIT ARGUMENT IS NOT SUITABLE INTEGER OR STRING
10606: MOV XR,XL COPY STRING PTR
10607: JSR GTINT CHECK IT IS INTEGER
10608: PPM SEXT1 SKIP IF UNCONVERTIBLE
10609: ZER XL NOTE IT IS INTEGER
10610: LDI ICVAL(XR) GET INTEGER ARG
10611: MOV R$FCB,WB GET FCBLK CHAIN HEADER
10612: *
10613: * MERGE TO CALL OSINT EXIT ROUTINE
10614: *
10615: SEXT1 MOV =HEADV,XR POINT TO V.V STRING
10616: JSR SYSXI CALL EXTERNAL ROUTINE
10617: ERR 105,EXIT ACTION NOT AVAILABLE IN THIS IMPLEMENTATION
10618: ERR 106,EXIT ACTION CAUSED IRRECOVERABLE ERROR
10619: IEQ EXNUL RETURN IF ARGUMENT 0
10620: ZER GBCNT RESUMING EXECUTION SO RESET
10621: IGT SEXT2 SKIP IF POSITIVE
10622: NGI MAKE POSITIVE
10623: *
10624: * CHECK FOR OPTION RESPECIFICATION
10625: *
10626: SEXT2 MFI WC GET VALUE IN WORK REG
10627: BEQ WC,=NUM03,SEXT3 SKIP IF WAS 3
10628: MOV WC,-(XS) SAVE VALUE
10629: ZER WC SET TO READ OPTIONS
10630: JSR PRPAR READ SYSPP OPTIONS
10631: MOV (XS)+,WC RESTORE VALUE
10632: *
10633: * DEAL WITH HEADER OPTION (FIDDLED BY PRPAR)
10634: *
10635: SEXT3 MNZ HEADP ASSUME NO HEADERS
10636: BNE WC,=NUM01,SEXT4 SKIP IF NOT 1
10637: ZER HEADP REQUEST HEADER PRINTING
10638: *
10639: * ALMOST READY TO RESUME RUNNING
10640: *
10641: SEXT4 JSR SYSTM GET EXECUTION TIME START (SGD11)
10642: STI TIMSX SAVE AS INITIAL TIME
10643: LDI KVSTC RESET TO ENSURE ...
10644: STI KVSTL ... CORRECT EXECUTION STATS
10645: BRN EXNUL RESUME EXECUTION
10646: EJC
10647: *
10648: * FIELD
10649: *
10650: S$FLD ENT ENTRY POINT
10651: JSR GTSMI GET SECOND ARGUMENT (FIELD NUMBER)
10652: ERR 107,FIELD SECOND ARGUMENT IS NOT INTEGER
10653: PPM EXFAL FAIL IF OUT OF RANGE
10654: MOV XR,WB ELSE SAVE INTEGER VALUE
10655: MOV (XS)+,XR LOAD FIRST ARGUMENT
10656: JSR GTNVR POINT TO VRBLK
10657: PPM SFLD1 JUMP (ERROR) IF NOT VARIABLE NAME
10658: MOV VRFNC(XR),XR ELSE POINT TO FUNCTION BLOCK
10659: BNE (XR),=B$DFC,SFLD1 ERROR IF NOT DATATYPE FUNCTION
10660: *
10661: * HERE IF FIRST ARGUMENT IS A DATATYPE FUNCTION NAME
10662: *
10663: BZE WB,EXFAL FAIL IF ARGUMENT NUMBER IS ZERO
10664: BGT WB,FARGS(XR),EXFAL FAIL IF TOO LARGE
10665: WTB WB ELSE CONVERT TO BYTE OFFSET
10666: ADD WB,XR POINT TO FIELD NAME
10667: MOV DFFLB(XR),XR LOAD VRBLK POINTER
10668: BRN EXVNM EXIT TO BUILD NMBLK
10669: *
10670: * HERE FOR BAD FIRST ARGUMENT
10671: *
10672: SFLD1 ERB 108,FIELD FIRST ARGUMENT IS NOT DATATYPE NAME
10673: EJC
10674: *
10675: * FENCE
10676: *
10677: S$FNC ENT ENTRY POINT
10678: MOV =P$FNC,WB SET PCODE FOR P$FNC
10679: ZER XR P0BLK
10680: JSR PBILD BUILD P$FNC NODE
10681: MOV XR,XL SAVE POINTER TO IT
10682: MOV (XS)+,XR GET ARGUMENT
10683: JSR GTPAT CONVERT TO PATTERN
10684: ERR 259,FENCE ARGUMENT IS NOT PATTERN
10685: JSR PCONC CONCATENATE TO P$FNC NODE
10686: MOV XR,XL SAVE PTR TO CONCATENATED PATTERN
10687: MOV =P$FNA,WB SET FOR P$FNA PCODE
10688: ZER XR P0BLK
10689: JSR PBILD CONSTRUCT P$FNA NODE
10690: MOV XL,PTHEN(XR) SET PATTERN AS PTHEN
10691: MOV XR,-(XS) SET AS RESULT
10692: BRN EXITS DO NEXT CODE WORD
10693: EJC
10694: *
10695: * GE
10696: *
10697: S$GEF ENT ENTRY POINT
10698: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE
10699: ERR 109,GE FIRST ARGUMENT IS NOT NUMERIC
10700: ERR 110,GE SECOND ARGUMENT IS NOT NUMERIC
10701: PPM EXFAL FAIL IF LT
10702: PPM EXNUL RETURN NULL IF EQ
10703: PPM EXNUL RETURN NULL IF GT
10704: EJC
10705: *
10706: * GT
10707: *
10708: S$GTF ENT ENTRY POINT
10709: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE
10710: ERR 111,GT FIRST ARGUMENT IS NOT NUMERIC
10711: ERR 112,GT SECOND ARGUMENT IS NOT NUMERIC
10712: PPM EXFAL FAIL IF LT
10713: PPM EXFAL FAIL IF EQ
10714: PPM EXNUL RETURN NULL IF GT
10715: EJC
10716: *
10717: * HOST
10718: *
10719: S$HST ENT ENTRY POINT
10720: MOV (XS)+,XR GET THIRD ARG
10721: MOV (XS)+,XL GET SECOND ARG
10722: MOV (XS)+,WA GET FIRST ARG
10723: JSR SYSHS ENTER SYSHS ROUTINE
10724: ERR 254,ERRONEOUS ARGUMENT FOR HOST
10725: ERR 255,ERROR DURING EXECUTION OF HOST
10726: PPM SHST1 STORE HOST STRING
10727: PPM EXNUL RETURN NULL RESULT
10728: PPM EXIXR RETURN XR
10729: PPM EXFAL FAIL RETURN
10730: *
10731: * RETURN HOST STRING
10732: *
10733: SHST1 BZE XL,EXNUL NULL STRING IF SYSHS UNCOOPERATIVE
10734: MOV SCLEN(XL),WA LENGTH
10735: ZER WB ZERO OFFSET
10736: JSR SBSTR BUILD COPY OF STRING
10737: MOV XR,-(XS) STACK THE RESULT
10738: BRN EXITS RETURN RESULT ON STACK
10739: EJC
10740: *
10741: * IDENT
10742: *
10743: S$IDN ENT ENTRY POINT
10744: MOV (XS)+,XR LOAD SECOND ARGUMENT
10745: MOV (XS)+,XL LOAD FIRST ARGUMENT
10746: JSR IDENT CALL IDENT COMPARISON ROUTINE
10747: PPM EXNUL RETURN NULL IF IDENT
10748: BRN EXFAL FAIL IF DIFFER
10749: EJC
10750: *
10751: * INPUT
10752: *
10753: S$INP ENT ENTRY POINT
10754: ZER WB INPUT FLAG
10755: JSR IOPUT CALL INPUT/OUTPUT ASSOC. ROUTINE
10756: ERR 113,INPUT THIRD ARGUMENT IS NOT A STRING
10757: ERR 114,INAPPROPRIATE SECOND ARGUMENT FOR INPUT
10758: ERR 115,INAPPROPRIATE FIRST ARGUMENT FOR INPUT
10759: ERR 116,INAPPROPRIATE FILE SPECIFICATION FOR INPUT
10760: PPM EXFAL FAIL IF FILE DOES NOT EXIST
10761: ERR 117,INPUT FILE CANNOT BE READ
10762: BRN EXNUL RETURN NULL STRING
10763: EJC
10764: *
10765: * INSERT
10766: *
10767: S$INS ENT ENTRY POINT
10768: MOV (XS)+,XL GET STRING ARG
10769: JSR GTSMI GET REPLACE LENGTH
10770: ERR 277,INSERT THIRD ARGUMENT NOT INTEGER
10771: PPM EXFAL FAIL IF OUT OF RANGE
10772: MOV WC,WB COPY TO PROPER REG
10773: JSR GTSMI GET REPLACE POSITION
10774: ERR 278,INSERT SECOND ARGUMENT NOT INTEGER
10775: PPM EXFAL FAIL IF OUT OF RANGE
10776: BZE WC,EXFAL FAIL IF ZERO
10777: DCV WC DECREMENT TO GET OFFSET
10778: MOV WC,WA PUT IN PROPER REGISTER
10779: MOV (XS)+,XR GET BUFFER
10780: BEQ (XR),=B$BCT,SINS1 PRESS ON IF TYPE OK
10781: ERB 279,INSERT FIRST ARGUMENT NOT BUFFER
10782: *
10783: * HERE WHEN EVERYTHING LOADED UP
10784: *
10785: SINS1 JSR INSBF CALL TO INSERT
10786: ERR 280,INSERT FOURTH ARGUMENT NOT A STRING
10787: PPM EXFAL FAIL IF OUT OF RANGE
10788: BRN EXNUL ELSE OK - EXIT WITH NULL
10789: EJC
10790: *
10791: * INTEGER
10792: *
10793: S$INT ENT ENTRY POINT
10794: MOV (XS)+,XR LOAD ARGUMENT
10795: JSR GTNUM CONVERT TO NUMERIC
10796: PPM EXFAL FAIL IF NON-NUMERIC
10797: BEQ WA,=B$ICL,EXNUL RETURN NULL IF INTEGER
10798: BRN EXFAL FAIL IF REAL
10799: EJC
10800: *
10801: * ITEM
10802: *
10803: * ITEM DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT
10804: * WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED.
10805: *
10806: S$ITM ENT ENTRY POINT
10807: *
10808: * DEAL WITH CASE OF NO ARGS
10809: *
10810: BNZ WA,SITM1 JUMP IF AT LEAST ONE ARG
10811: MOV =NULLS,-(XS) ELSE SUPPLY GARBAGE NULL ARG
10812: MOV =NUM01,WA AND FIX ARGUMENT COUNT
10813: *
10814: * CHECK FOR NAME/VALUE CASES
10815: *
10816: SITM1 SCP XR GET CURRENT CODE POINTER
10817: MOV (XR),XL LOAD NEXT CODE WORD
10818: DCV WA GET NUMBER OF SUBSCRIPTS
10819: MOV WA,XR COPY FOR ARREF
10820: BEQ XL,=OFNE$,SITM2 JUMP IF CALLED BY NAME
10821: *
10822: * HERE IF CALLED BY VALUE
10823: *
10824: ZER WB SET CODE FOR CALL BY VALUE
10825: BRN ARREF OFF TO ARRAY REFERENCE ROUTINE
10826: *
10827: * HERE FOR CALL BY NAME
10828: *
10829: SITM2 MNZ WB SET CODE FOR CALL BY NAME
10830: LCW WA LOAD AND IGNORE OFNE$ CALL
10831: BRN ARREF OFF TO ARRAY REFERENCE ROUTINE
10832: EJC
10833: *
10834: * LE
10835: *
10836: S$LEF ENT ENTRY POINT
10837: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE
10838: ERR 118,LE FIRST ARGUMENT IS NOT NUMERIC
10839: ERR 119,LE SECOND ARGUMENT IS NOT NUMERIC
10840: PPM EXNUL RETURN NULL IF LT
10841: PPM EXNUL RETURN NULL IF EQ
10842: PPM EXFAL FAIL IF GT
10843: EJC
10844: *
10845: * LEN
10846: *
10847: S$LEN ENT ENTRY POINT
10848: MOV =P$LEN,WB SET PCODE FOR INTEGER ARG CASE
10849: MOV =P$LND,WA SET PCODE FOR EXPR ARG CASE
10850: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE
10851: ERR 120,LEN ARGUMENT IS NOT INTEGER OR EXPRESSION
10852: ERR 121,LEN ARGUMENT IS NEGATIVE OR TOO LARGE
10853: BRN EXIXR RETURN PATTERN NODE
10854: EJC
10855: *
10856: * LEQ
10857: *
10858: S$LEQ ENT ENTRY POINT
10859: JSR LCOMP CALL STRING COMPARISON ROUTINE
10860: ERR 122,LEQ FIRST ARGUMENT IS NOT STRING
10861: ERR 123,LEQ SECOND ARGUMENT IS NOT STRING
10862: PPM EXFAL FAIL IF LLT
10863: PPM EXNUL RETURN NULL IF LEQ
10864: PPM EXFAL FAIL IF LGT
10865: EJC
10866: *
10867: * LGE
10868: *
10869: S$LGE ENT ENTRY POINT
10870: JSR LCOMP CALL STRING COMPARISON ROUTINE
10871: ERR 124,LGE FIRST ARGUMENT IS NOT STRING
10872: ERR 125,LGE SECOND ARGUMENT IS NOT STRING
10873: PPM EXFAL FAIL IF LLT
10874: PPM EXNUL RETURN NULL IF LEQ
10875: PPM EXNUL RETURN NULL IF LGT
10876: EJC
10877: *
10878: * LGT
10879: *
10880: S$LGT ENT ENTRY POINT
10881: JSR LCOMP CALL STRING COMPARISON ROUTINE
10882: ERR 126,LGT FIRST ARGUMENT IS NOT STRING
10883: ERR 127,LGT SECOND ARGUMENT IS NOT STRING
10884: PPM EXFAL FAIL IF LLT
10885: PPM EXFAL FAIL IF LEQ
10886: PPM EXNUL RETURN NULL IF LGT
10887: EJC
10888: *
10889: * LLE
10890: *
10891: S$LLE ENT ENTRY POINT
10892: JSR LCOMP CALL STRING COMPARISON ROUTINE
10893: ERR 128,LLE FIRST ARGUMENT IS NOT STRING
10894: ERR 129,LLE SECOND ARGUMENT IS NOT STRING
10895: PPM EXNUL RETURN NULL IF LLT
10896: PPM EXNUL RETURN NULL IF LEQ
10897: PPM EXFAL FAIL IF LGT
10898: EJC
10899: *
10900: * LLT
10901: *
10902: S$LLT ENT ENTRY POINT
10903: JSR LCOMP CALL STRING COMPARISON ROUTINE
10904: ERR 130,LLT FIRST ARGUMENT IS NOT STRING
10905: ERR 131,LLT SECOND ARGUMENT IS NOT STRING
10906: PPM EXNUL RETURN NULL IF LLT
10907: PPM EXFAL FAIL IF LEQ
10908: PPM EXFAL FAIL IF LGT
10909: EJC
10910: *
10911: * LNE
10912: *
10913: S$LNE ENT ENTRY POINT
10914: JSR LCOMP CALL STRING COMPARISON ROUTINE
10915: ERR 132,LNE FIRST ARGUMENT IS NOT STRING
10916: ERR 133,LNE SECOND ARGUMENT IS NOT STRING
10917: PPM EXNUL RETURN NULL IF LLT
10918: PPM EXFAL FAIL IF LEQ
10919: PPM EXNUL RETURN NULL IF LGT
10920: EJC
10921: *
10922: * LOCAL
10923: *
10924: S$LOC ENT ENTRY POINT
10925: JSR GTSMI GET SECOND ARGUMENT (LOCAL NUMBER)
10926: ERR 134,LOCAL SECOND ARGUMENT IS NOT INTEGER
10927: PPM EXFAL FAIL IF OUT OF RANGE
10928: MOV XR,WB SAVE LOCAL NUMBER
10929: MOV (XS)+,XR LOAD FIRST ARGUMENT
10930: JSR GTNVR POINT TO VRBLK
10931: PPM SLOC1 JUMP IF NOT VARIABLE NAME
10932: MOV VRFNC(XR),XR ELSE LOAD FUNCTION POINTER
10933: BNE (XR),=B$PFC,SLOC1 JUMP IF NOT PROGRAM DEFINED
10934: *
10935: * HERE IF WE HAVE A PROGRAM DEFINED FUNCTION NAME
10936: *
10937: BZE WB,EXFAL FAIL IF SECOND ARG IS ZERO
10938: BGT WB,PFNLO(XR),EXFAL OR TOO LARGE
10939: ADD FARGS(XR),WB ELSE ADJUST OFFSET TO INCLUDE ARGS
10940: WTB WB CONVERT TO BYTES
10941: ADD WB,XR POINT TO LOCAL POINTER
10942: MOV PFAGB(XR),XR LOAD VRBLK POINTER
10943: BRN EXVNM EXIT BUILDING NMBLK
10944: *
10945: * HERE IF FIRST ARGUMENT IS NO GOOD
10946: *
10947: SLOC1 ERB 135,LOCAL FIRST ARG IS NOT A PROGRAM FUNCTION NAME
10948: EJC
10949: *
10950: * LOAD
10951: *
10952: S$LOD ENT ENTRY POINT
10953: JSR GTSTG LOAD LIBRARY NAME
10954: ERR 136,LOAD SECOND ARGUMENT IS NOT STRING
10955: MOV XR,XL SAVE LIBRARY NAME
10956: JSR XSCNI PREPARE TO SCAN FIRST ARGUMENT
10957: ERR 137,LOAD FIRST ARGUMENT IS NOT STRING
10958: ERR 138,LOAD FIRST ARGUMENT IS NULL
10959: MOV XL,-(XS) STACK LIBRARY NAME
10960: MOV =CH$PP,WC SET DELIMITER ONE = LEFT PAREN
10961: MOV WC,XL SET DELIMITER TWO = LEFT PAREN
10962: JSR XSCAN SCAN FUNCTION NAME
10963: MOV XR,-(XS) SAVE PTR TO FUNCTION NAME
10964: BNZ WA,SLOD1 JUMP IF LEFT PAREN FOUND
10965: ERB 139,LOAD FIRST ARGUMENT IS MISSING A LEFT PAREN
10966: *
10967: * HERE AFTER SUCCESSFULLY SCANNING FUNCTION NAME
10968: *
10969: SLOD1 JSR GTNVR LOCATE VRBLK
10970: ERR 140,LOAD FIRST ARGUMENT HAS NULL FUNCTION NAME
10971: MOV XR,LODFN SAVE VRBLK POINTER
10972: ZER LODNA ZERO COUNT OF ARGUMENTS
10973: *
10974: * LOOP TO SCAN ARGUMENT DATATYPE NAMES
10975: *
10976: SLOD2 MOV =CH$RP,WC DELIMITER ONE IS RIGHT PAREN
10977: MOV =CH$CM,XL DELIMITER TWO IS COMMA
10978: JSR XSCAN SCAN NEXT ARGUMENT NAME
10979: ICV LODNA BUMP ARGUMENT COUNT
10980: BNZ WA,SLOD3 JUMP IF OK DELIMITER WAS FOUND
10981: ERB 141,LOAD FIRST ARGUMENT IS MISSING A RIGHT PAREN
10982: EJC
10983: *
10984: * LOAD (CONTINUED)
10985: *
10986: * COME HERE TO ANALYZE THE DATATYPE POINTER IN (XR). THIS
10987: * CODE IS USED BOTH FOR ARGUMENTS (WA=1,2) AND FOR THE
10988: * RESULT DATATYPE (WITH WA SET TO ZERO).
10989: *
10990: SLOD3 MOV XR,-(XS) STACK DATATYPE NAME POINTER
10991: MOV =NUM01,WB SET STRING CODE IN CASE
10992: MOV =SCSTR,XL POINT TO /STRING/
10993: JSR IDENT CHECK FOR MATCH
10994: PPM SLOD4 JUMP IF MATCH
10995: MOV (XS),XR ELSE RELOAD NAME
10996: ADD WB,WB SET CODE FOR INTEGER (2)
10997: MOV =SCINT,XL POINT TO /INTEGER/
10998: JSR IDENT CHECK FOR MATCH
10999: PPM SLOD4 JUMP IF MATCH
11000: MOV (XS),XR ELSE RELOAD STRING POINTER
11001: ICV WB SET CODE FOR REAL (3)
11002: MOV =SCREA,XL POINT TO /REAL/
11003: JSR IDENT CHECK FOR MATCH
11004: PPM SLOD4 JUMP IF MATCH
11005: ZER WB ELSE GET CODE FOR NO CONVERT
11006: *
11007: * MERGE HERE WITH PROPER DATATYPE CODE IN WB
11008: *
11009: SLOD4 MOV WB,(XS) STORE CODE ON STACK
11010: BEQ WA,=NUM02,SLOD2 LOOP BACK IF ARG STOPPED BY COMMA
11011: BZE WA,SLOD5 JUMP IF THAT WAS THE RESULT TYPE
11012: *
11013: * HERE WE SCAN OUT THE RESULT TYPE (ARG STOPPED BY ) )
11014: *
11015: MOV MXLEN,WC SET DUMMY (IMPOSSIBLE) DELIMITER 1
11016: MOV WC,XL AND DELIMITER TWO
11017: JSR XSCAN SCAN RESULT NAME
11018: ZER WA SET CODE FOR PROCESSING RESULT
11019: BRN SLOD3 JUMP BACK TO PROCESS RESULT NAME
11020: EJC
11021: *
11022: * LOAD (CONTINUED)
11023: *
11024: * HERE AFTER PROCESSING ALL ARGS AND RESULT
11025: *
11026: SLOD5 MOV LODNA,WA GET NUMBER OF ARGUMENTS
11027: MOV WA,WC COPY FOR LATER
11028: WTB WA CONVERT LENGTH TO BYTES
11029: ADD *EFSI$,WA ADD SPACE FOR STANDARD FIELDS
11030: JSR ALLOC ALLOCATE EFBLK
11031: MOV =B$EFC,(XR) SET TYPE WORD
11032: MOV WC,FARGS(XR) SET NUMBER OF ARGUMENTS
11033: ZER EFUSE(XR) SET USE COUNT (DFFNC WILL SET TO 1)
11034: ZER EFCOD(XR) ZERO CODE POINTER FOR NOW
11035: MOV (XS)+,EFRSL(XR) STORE RESULT TYPE CODE
11036: MOV LODFN,EFVAR(XR) STORE FUNCTION VRBLK POINTER
11037: MOV WA,EFLEN(XR) STORE EFBLK LENGTH
11038: MOV XR,WB SAVE EFBLK POINTER
11039: ADD WA,XR POINT PAST END OF EFBLK
11040: LCT WC,WC SET NUMBER OF ARGUMENTS FOR LOOP
11041: *
11042: * LOOP TO SET ARGUMENT TYPE CODES FROM STACK
11043: *
11044: SLOD6 MOV (XS)+,-(XR) STORE ONE TYPE CODE FROM STACK
11045: BCT WC,SLOD6 LOOP TILL ALL STORED
11046: *
11047: * NOW LOAD THE EXTERNAL FUNCTION AND PERFORM DEFINITION
11048: *
11049: MOV (XS)+,XR LOAD FUNCTION STRING NAME
11050: MOV (XS),XL LOAD LIBRARY NAME
11051: MOV WB,(XS) STORE EFBLK POINTER
11052: JSR SYSLD CALL FUNCTION TO LOAD EXTERNAL FUNC
11053: ERR 142,LOAD FUNCTION DOES NOT EXIST
11054: ERR 143,LOAD FUNCTION CAUSED INPUT ERROR DURING LOAD
11055: MOV (XS)+,XL RECALL EFBLK POINTER
11056: MOV XR,EFCOD(XL) STORE CODE POINTER
11057: MOV LODFN,XR POINT TO VRBLK FOR FUNCTION
11058: JSR DFFNC PERFORM FUNCTION DEFINITION
11059: BRN EXNUL RETURN NULL RESULT
11060: EJC
11061: *
11062: * LPAD
11063: *
11064: S$LPD ENT ENTRY POINT
11065: JSR GTSTG GET PAD CHARACTER
11066: ERR 144,LPAD THIRD ARGUMENT NOT A STRING
11067: PLC XR POINT TO CHARACTER (NULL IS BLANK)
11068: LCH WB,(XR) LOAD PAD CHARACTER
11069: JSR GTSMI GET PAD LENGTH
11070: ERR 145,LPAD SECOND ARGUMENT IS NOT INTEGER
11071: PPM SLPD3 SKIP IF NEGATIVE OR LARGE
11072: *
11073: * MERGE TO CHECK FIRST ARG
11074: *
11075: SLPD1 JSR GTSTG GET FIRST ARGUMENT (STRING TO PAD)
11076: ERR 146,LPAD FIRST ARGUMENT IS NOT STRING
11077: BGE WA,WC,EXIXR RETURN 1ST ARG IF TOO LONG TO PAD
11078: MOV XR,XL ELSE MOVE PTR TO STRING TO PAD
11079: *
11080: * NOW WE ARE READY FOR THE PAD
11081: *
11082: * (XL) POINTER TO STRING TO PAD
11083: * (WB) PAD CHARACTER
11084: * (WC) LENGTH TO PAD STRING TO
11085: *
11086: MOV WC,WA COPY LENGTH
11087: JSR ALOCS ALLOCATE SCBLK FOR NEW STRING
11088: MOV XR,-(XS) SAVE AS RESULT
11089: MOV SCLEN(XL),WA LOAD LENGTH OF ARGUMENT
11090: SUB WA,WC CALCULATE NUMBER OF PAD CHARACTERS
11091: PSC XR POINT TO CHARS IN RESULT STRING
11092: LCT WC,WC SET COUNTER FOR PAD LOOP
11093: *
11094: * LOOP TO PERFORM PAD
11095: *
11096: SLPD2 SCH WB,(XR)+ STORE PAD CHARACTER, BUMP PTR
11097: BCT WC,SLPD2 LOOP TILL ALL PAD CHARS STORED
11098: CSC XR COMPLETE STORE CHARACTERS
11099: *
11100: * NOW COPY STRING
11101: *
11102: BZE WA,EXITS EXIT IF NULL STRING
11103: PLC XL ELSE POINT TO CHARS IN ARGUMENT
11104: MVC MOVE CHARACTERS TO RESULT STRING
11105: BRN EXITS JUMP FOR NEXT CODE WORD
11106: *
11107: * HERE IF 2ND ARG IS NEGATIVE OR LARGE
11108: *
11109: SLPD3 ZER WC ZERO PAD COUNT
11110: BRN SLPD1 MERGE
11111: EJC
11112: *
11113: * LT
11114: *
11115: S$LTF ENT ENTRY POINT
11116: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE
11117: ERR 147,LT FIRST ARGUMENT IS NOT NUMERIC
11118: ERR 148,LT SECOND ARGUMENT IS NOT NUMERIC
11119: PPM EXNUL RETURN NULL IF LT
11120: PPM EXFAL FAIL IF EQ
11121: PPM EXFAL FAIL IF GT
11122: EJC
11123: *
11124: * NE
11125: *
11126: S$NEF ENT ENTRY POINT
11127: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE
11128: ERR 149,NE FIRST ARGUMENT IS NOT NUMERIC
11129: ERR 150,NE SECOND ARGUMENT IS NOT NUMERIC
11130: PPM EXNUL RETURN NULL IF LT
11131: PPM EXFAL FAIL IF EQ
11132: PPM EXNUL RETURN NULL IF GT
11133: EJC
11134: *
11135: * NOTANY
11136: *
11137: S$NAY ENT ENTRY POINT
11138: MOV =P$NAS,WB SET PCODE FOR SINGLE CHAR ARG
11139: MOV =P$NAY,XL PCODE FOR MULTI-CHAR ARG
11140: MOV =P$NAD,WC SET PCODE FOR EXPR ARG
11141: JSR PATST CALL COMMON ROUTINE TO BUILD NODE
11142: ERR 151,NOTANY ARGUMENT IS NOT STRING OR EXPRESSION
11143: BRN EXIXR JUMP FOR NEXT CODE WORD
11144: EJC
11145: *
11146: * OPSYN
11147: *
11148: S$OPS ENT ENTRY POINT
11149: JSR GTSMI LOAD THIRD ARGUMENT
11150: ERR 152,OPSYN THIRD ARGUMENT IS NOT INTEGER
11151: ERR 153,OPSYN THIRD ARGUMENT IS NEGATIVE OR TOO LARGE
11152: MOV WC,WB IF OK, SAVE THIRD ARGUMNET
11153: MOV (XS)+,XR LOAD SECOND ARGUMENT
11154: JSR GTNVR LOCATE VARIABLE BLOCK
11155: ERR 154,OPSYN SECOND ARG IS NOT NATURAL VARIABLE NAME
11156: MOV VRFNC(XR),XL IF OK, LOAD FUNCTION BLOCK POINTER
11157: BNZ WB,SOPS2 JUMP IF OPERATOR OPSYN CASE
11158: *
11159: * HERE FOR FUNCTION OPSYN (THIRD ARG ZERO)
11160: *
11161: MOV (XS)+,XR LOAD FIRST ARGUMENT
11162: JSR GTNVR GET VRBLK POINTER
11163: ERR 155,OPSYN FIRST ARG IS NOT NATURAL VARIABLE NAME
11164: *
11165: * MERGE HERE TO PERFORM FUNCTION DEFINITION
11166: *
11167: SOPS1 JSR DFFNC CALL FUNCTION DEFINER
11168: BRN EXNUL EXIT WITH NULL RESULT
11169: *
11170: * HERE FOR OPERATOR OPSYN (THIRD ARG NON-ZERO)
11171: *
11172: SOPS2 JSR GTSTG GET OPERATOR NAME
11173: PPM SOPS5 JUMP IF NOT STRING
11174: BNE WA,=NUM01,SOPS5 ERROR IF NOT ONE CHAR LONG
11175: PLC XR ELSE POINT TO CHARACTER
11176: LCH WC,(XR) LOAD CHARACTER NAME
11177: EJC
11178: *
11179: * OPSYN (CONTINUED)
11180: *
11181: * NOW SET TO SEARCH FOR MATCHING UNARY OR BINARY OPERATOR
11182: * NAME AS APPROPRIATE. NOTE THAT THERE ARE =OPBUN UNDEFINED
11183: * BINARY OPERATORS AND =OPUUN UNDEFINED UNARY OPERATORS.
11184: *
11185: MOV =R$UUB,WA POINT TO UNOP POINTERS IN CASE
11186: MOV =OPNSU,XR POINT TO NAMES OF UNARY OPERATORS
11187: ADD =OPBUN,WB ADD NO. OF UNDEFINED BINARY OPS
11188: BEQ WB,=OPUUN,SOPS3 JUMP IF UNOP (THIRD ARG WAS 1)
11189: MOV =R$UBA,WA ELSE POINT TO BINARY OPERATOR PTRS
11190: MOV =OPSNB,XR POINT TO NAMES OF BINARY OPERATORS
11191: MOV =OPBUN,WB SET NUMBER OF UNDEFINED BINOPS
11192: *
11193: * MERGE HERE TO CHECK LIST (WB = NUMBER TO CHECK)
11194: *
11195: SOPS3 LCT WB,WB SET COUNTER TO CONTROL LOOP
11196: *
11197: * LOOP TO SEARCH FOR NAME MATCH
11198: *
11199: SOPS4 BEQ WC,(XR),SOPS6 JUMP IF NAMES MATCH
11200: ICA WA ELSE PUSH POINTER TO FUNCTION PTR
11201: ICA XR BUMP POINTER
11202: BCT WB,SOPS4 LOOP BACK TILL ALL CHECKED
11203: *
11204: * HERE IF BAD OPERATOR NAME
11205: *
11206: SOPS5 ERB 156,OPSYN FIRST ARG IS NOT CORRECT OPERATOR NAME
11207: *
11208: * COME HERE ON FINDING A MATCH IN THE OPERATOR NAME TABLE
11209: *
11210: SOPS6 MOV WA,XR COPY POINTER TO FUNCTION BLOCK PTR
11211: SUB *VRFNC,XR MAKE IT LOOK LIKE DUMMY VRBLK
11212: BRN SOPS1 MERGE BACK TO DEFINE OPERATOR
11213: EJC
11214: *
11215: * OUTPUT
11216: *
11217: S$OUP ENT ENTRY POINT
11218: MOV =NUM03,WB OUTPUT FLAG
11219: JSR IOPUT CALL INPUT/OUTPUT ASSOC. ROUTINE
11220: ERR 157,OUTPUT THIRD ARGUMENT IS NOT A STRING
11221: ERR 158,INAPPROPRIATE SECOND ARGUMENT FOR OUTPUT
11222: ERR 159,INAPPROPRIATE FIRST ARGUMENT FOR OUTPUT
11223: ERR 160,INAPPROPRIATE FILE SPECIFICATION FOR OUTPUT
11224: PPM EXFAL FAIL IF FILE DOES NOT EXIST
11225: ERR 161,OUTPUT FILE CANNOT BE WRITTEN TO
11226: BRN EXNUL RETURN NULL STRING
11227: EJC
11228: *
11229: * POS
11230: *
11231: S$POS ENT ENTRY POINT
11232: MOV =P$POS,WB SET PCODE FOR INTEGER ARG CASE
11233: MOV =P$PSD,WA SET PCODE FOR EXPRESSION ARG CASE
11234: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE
11235: ERR 162,POS ARGUMENT IS NOT INTEGER OR EXPRESSION
11236: ERR 163,POS ARGUMENT IS NEGATIVE OR TOO LARGE
11237: BRN EXIXR RETURN PATTERN NODE
11238: EJC
11239: *
11240: * PROTOTYPE
11241: *
11242: S$PRO ENT ENTRY POINT
11243: MOV (XS)+,XR LOAD ARGUMENT
11244: MOV TBLEN(XR),WB LENGTH IF TABLE, VECTOR (=VCLEN)
11245: BTW WB CONVERT TO WORDS
11246: MOV (XR),WA LOAD TYPE WORD OF ARGUMENT BLOCK
11247: BEQ WA,=B$ART,SPRO4 JUMP IF ARRAY
11248: BEQ WA,=B$TBT,SPRO1 JUMP IF TABLE
11249: BEQ WA,=B$VCT,SPRO3 JUMP IF VECTOR
11250: BEQ WA,=B$BCT,SPR05 JUMP IF BUFFER
11251: ERB 164,PROTOTYPE ARGUMENT IS NOT VALID OBJECT
11252: *
11253: * HERE FOR TABLE
11254: *
11255: SPRO1 SUB =TBSI$,WB SUBTRACT STANDARD FIELDS
11256: *
11257: * MERGE FOR VECTOR
11258: *
11259: SPRO2 MTI WB CONVERT TO INTEGER
11260: BRN EXINT EXIT WITH INTEGER RESULT
11261: *
11262: * HERE FOR VECTOR
11263: *
11264: SPRO3 SUB =VCSI$,WB SUBTRACT STANDARD FIELDS
11265: BRN SPRO2 MERGE
11266: *
11267: * HERE FOR ARRAY
11268: *
11269: SPRO4 ADD AROFS(XR),XR POINT TO PROTOTYPE FIELD
11270: MOV (XR),XR LOAD PROTOTYPE
11271: BRN EXIXR RETURN PROTOTYPE AS RESULT
11272: *
11273: * HERE FOR BUFFER
11274: *
11275: SPR05 MOV BCBUF(XR),XR POINT TO BFBLK
11276: MTI BFALC(XR) LOAD ALLOCATED LENGTH
11277: BRN EXINT EXIT WITH INTEGER ALLOCATION
11278: EJC
11279: *
11280: * REMDR
11281: *
11282: S$RMD ENT ENTRY POINT
11283: ZER WB SET POSITIVE FLAG
11284: MOV (XS),XR LOAD SECOND ARGUMENT
11285: JSR GTINT CONVERT TO INTEGER
11286: ERR 165,REMDR SECOND ARGUMENT IS NOT INTEGER
11287: JSR ARITH CONVERT ARGS
11288: PPM SRM01 FIRST ARG NOT INTEGER
11289: PPM SECOND ARG CHECKED ABOVE
11290: PPM SRM01 FIRST ARG REAL
11291: LDI ICVAL(XR) LOAD LEFT ARGUMENT VALUE
11292: RMI ICVAL(XL) GET REMAINDER
11293: INO EXINT JUMP IF NO OVERFLOW
11294: ERB 167,REMDR CAUSED INTEGER OVERFLOW
11295: *
11296: * FAIL FIRST ARGUMENT
11297: *
11298: SRM01 ERB 166,REMDR FIRST ARGUMENT IS NOT INTEGER
11299: EJC
11300: *
11301: * REPLACE
11302: *
11303: * THE ACTUAL REPLACE OPERATION USES AN SCBLK WHOSE CFP$A
11304: * CHARS CONTAIN THE TRANSLATED VERSIONS OF ALL THE CHARS.
11305: * THE TABLE POINTER IS REMEMBERED FROM CALL TO CALL AND
11306: * THE TABLE IS ONLY BUILT WHEN THE ARGUMENTS CHANGE.
11307: *
11308: S$RPL ENT ENTRY POINT
11309: JSR GTSTG LOAD THIRD ARGUMENT AS STRING
11310: ERR 168,REPLACE THIRD ARGUMENT IS NOT STRING
11311: MOV XR,XL SAVE THIRD ARG PTR
11312: JSR GTSTG GET SECOND ARGUMENT
11313: ERR 169,REPLACE SECOND ARGUMENT IS NOT STRING
11314: *
11315: * CHECK TO SEE IF THIS IS THE SAME TABLE AS LAST TIME
11316: *
11317: BNE XR,R$RA2,SRPL1 JUMP IF 2ND ARGUMENT DIFFERENT
11318: BEQ XL,R$RA3,SRPL4 JUMP IF ARGS SAME AS LAST TIME
11319: *
11320: * HERE WE BUILD A NEW REPLACE TABLE (NOTE WA = 2ND ARG LEN)
11321: *
11322: SRPL1 MOV SCLEN(XL),WB LOAD 3RD ARGUMENT LENGTH
11323: BNE WA,WB,SRPL5 JUMP IF ARGUMENTS NOT SAME LENGTH
11324: BZE WB,SRPL5 JUMP IF NULL 2ND ARGUMENT
11325: MOV XL,R$RA3 SAVE THIRD ARG FOR NEXT TIME IN
11326: MOV XR,R$RA2 SAVE SECOND ARG FOR NEXT TIME IN
11327: MOV KVALP,XL POINT TO ALPHABET STRING
11328: MOV SCLEN(XL),WA LOAD ALPHABET SCBLK LENGTH
11329: MOV R$RPT,XR POINT TO CURRENT TABLE (IF ANY)
11330: BNZ XR,SRPL2 JUMP IF WE ALREADY HAVE A TABLE
11331: *
11332: * HERE WE ALLOCATE A NEW TABLE
11333: *
11334: JSR ALOCS ALLOCATE NEW TABLE
11335: MOV WC,WA KEEP SCBLK LENGTH
11336: MOV XR,R$RPT SAVE TABLE POINTER FOR NEXT TIME
11337: *
11338: * MERGE HERE WITH POINTER TO NEW TABLE BLOCK IN (XR)
11339: *
11340: SRPL2 CTB WA,SCSI$ COMPUTE LENGTH OF SCBLK
11341: MVW COPY TO GET INITIAL TABLE VALUES
11342: EJC
11343: *
11344: * REPLACE (CONTINUED)
11345: *
11346: * NOW WE MUST PLUG SELECTED ENTRIES AS REQUIRED. NOTE THAT
11347: * WE ARE SHORT OF INDEX REGISTERS FOR THE FOLLOWING LOOP.
11348: * HENCE THE NEED TO REPEATEDLY RE-INITIALISE CHAR PTR XL
11349: *
11350: MOV R$RA2,XL POINT TO SECOND ARGUMENT
11351: LCT WB,WB NUMBER OF CHARS TO PLUG
11352: ZER WC ZERO CHAR OFFSET
11353: MOV R$RA3,XR POINT TO 3RD ARG
11354: PLC XR GET CHAR PTR FOR 3RD ARG
11355: *
11356: * LOOP TO PLUG CHARS
11357: *
11358: SRPL3 MOV R$RA2,XL POINT TO 2ND ARG
11359: PLC XL,WC POINT TO NEXT CHAR
11360: ICV WC INCREMENT OFFSET
11361: LCH WA,(XL) GET NEXT CHAR
11362: MOV R$RPT,XL POINT TO TRANSLATE TABLE
11363: PSC XL,WA CONVERT CHAR TO OFFSET INTO TABLE
11364: LCH WA,(XR)+ GET TRANSLATED CHAR
11365: SCH WA,(XL) STORE IN TABLE
11366: CSC XL COMPLETE STORE CHARACTERS
11367: BCT WB,SRPL3 LOOP TILL DONE
11368: EJC
11369: *
11370: * REPLACE (CONTINUED)
11371: *
11372: * HERE TO PERFORM TRANSLATE
11373: *
11374: SRPL4 JSR GTSTG GET FIRST ARGUMENT
11375: ERR 170,REPLACE FIRST ARGUMENT IS NOT STRING
11376: BZE WA,EXNUL RETURN NULL IF NULL ARGUMENT
11377: MOV XR,XL COPY POINTER
11378: MOV WA,WC SAVE LENGTH
11379: CTB WA,SCHAR GET SCBLK LENGTH
11380: JSR ALLOC ALLOCATE SPACE FOR COPY
11381: MOV XR,WB SAVE ADDRESS OF COPY
11382: MVW MOVE SCBLK CONTENTS TO COPY
11383: MOV R$RPT,XR POINT TO REPLACE TABLE
11384: PLC XR POINT TO CHARS OF TABLE
11385: MOV WB,XL POINT TO STRING TO TRANSLATE
11386: PLC XL POINT TO CHARS OF STRING
11387: MOV WC,WA SET NUMBER OF CHARS TO TRANSLATE
11388: TRC PERFORM TRANSLATION
11389: MOV WB,-(XS) STACK NEW STRING AS RESULT
11390: BRN EXITS RETURN WITH RESULT ON STACK
11391: *
11392: * ERROR POINT
11393: *
11394: SRPL5 ERB 171,NULL OR UNEQUALLY LONG 2ND, 3RD ARGS TO REPLACE
11395: EJC
11396: *
11397: * REWIND
11398: *
11399: S$REW ENT ENTRY POINT
11400: JSR IOFCB CALL FCBLK ROUTINE
11401: ERR 172,REWIND ARGUMENT IS NOT A SUITABLE NAME
11402: ERR 173,REWIND ARGUMENT IS NULL
11403: JSR SYSRW CALL SYSTEM REWIND FUNCTION
11404: ERR 174,REWIND FILE DOES NOT EXIST
11405: ERR 175,REWIND FILE DOES NOT PERMIT REWIND
11406: ERR 176,REWIND CAUSED NON-RECOVERABLE ERROR
11407: BRN EXNUL EXIT WITH NULL RESULT IF NO ERROR
11408: EJC
11409: *
11410: * REVERSE
11411: *
11412: S$RVS ENT ENTRY POINT
11413: JSR GTSTG LOAD STRING ARGUMENT
11414: ERR 177,REVERSE ARGUMENT IS NOT STRING
11415: BZE WA,EXIXR RETURN ARGUMENT IF NULL
11416: MOV XR,XL ELSE SAVE POINTER TO STRING ARG
11417: JSR ALOCS ALLOCATE SPACE FOR NEW SCBLK
11418: MOV XR,-(XS) STORE SCBLK PTR ON STACK AS RESULT
11419: PSC XR PREPARE TO STORE IN NEW SCBLK
11420: PLC XL,WC POINT PAST LAST CHAR IN ARGUMENT
11421: LCT WC,WC SET LOOP COUNTER
11422: *
11423: * LOOP TO MOVE CHARS IN REVERSE ORDER
11424: *
11425: SRVS1 LCH WB,-(XL) LOAD NEXT CHAR FROM ARGUMENT
11426: SCH WB,(XR)+ STORE IN RESULT
11427: BCT WC,SRVS1 LOOP TILL ALL MOVED
11428: CSC XR COMPLETE STORE CHARACTERS
11429: BRN EXITS AND THEN JUMP FOR NEXT CODE WORD
11430: EJC
11431: *
11432: * RPAD
11433: *
11434: S$RPD ENT ENTRY POINT
11435: JSR GTSTG GET PAD CHARACTER
11436: ERR 178,RPAD THIRD ARGUMENT IS NOT STRING
11437: PLC XR POINT TO CHARACTER (NULL IS BLANK)
11438: LCH WB,(XR) LOAD PAD CHARACTER
11439: JSR GTSMI GET PAD LENGTH
11440: ERR 179,RPAD SECOND ARGUMENT IS NOT INTEGER
11441: PPM SRPD3 SKIP IF NEGATIVE OR LARGE
11442: *
11443: * MERGE TO CHECK FIRST ARG.
11444: *
11445: SRPD1 JSR GTSTG GET FIRST ARGUMENT (STRING TO PAD)
11446: ERR 180,RPAD FIRST ARGUMENT IS NOT STRING
11447: BGE WA,WC,EXIXR RETURN 1ST ARG IF TOO LONG TO PAD
11448: MOV XR,XL ELSE MOVE PTR TO STRING TO PAD
11449: *
11450: * NOW WE ARE READY FOR THE PAD
11451: *
11452: * (XL) POINTER TO STRING TO PAD
11453: * (WB) PAD CHARACTER
11454: * (WC) LENGTH TO PAD STRING TO
11455: *
11456: MOV WC,WA COPY LENGTH
11457: JSR ALOCS ALLOCATE SCBLK FOR NEW STRING
11458: MOV XR,-(XS) SAVE AS RESULT
11459: MOV SCLEN(XL),WA LOAD LENGTH OF ARGUMENT
11460: SUB WA,WC CALCULATE NUMBER OF PAD CHARACTERS
11461: PSC XR POINT TO CHARS IN RESULT STRING
11462: LCT WC,WC SET COUNTER FOR PAD LOOP
11463: *
11464: * COPY ARGUMENT STRING
11465: *
11466: BZE WA,SRPD2 JUMP IF ARGUMENT IS NULL
11467: PLC XL ELSE POINT TO ARGUMENT CHARS
11468: MVC MOVE CHARACTERS TO RESULT STRING
11469: *
11470: * LOOP TO SUPPLY PAD CHARACTERS
11471: *
11472: SRPD2 SCH WB,(XR)+ STORE PAD CHARACTER, BUMP PTR
11473: BCT WC,SRPD2 LOOP TILL ALL PAD CHARS STORED
11474: CSC XR COMPLETE CHARACTER STORING
11475: BRN EXITS AND EXIT FOR NEXT WORD
11476: *
11477: * HERE IF 2ND ARG IS NEGATIVE OR LARGE
11478: *
11479: SRPD3 ZER WC ZERO PAD COUNT
11480: BRN SRPD1 MERGE
11481: EJC
11482: *
11483: * RTAB
11484: *
11485: S$RTB ENT ENTRY POINT
11486: MOV =P$RTB,WB SET PCODE FOR INTEGER ARG CASE
11487: MOV =P$RTD,WA SET PCODE FOR EXPRESSION ARG CASE
11488: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE
11489: ERR 181,RTAB ARGUMENT IS NOT INTEGER OR EXPRESSION
11490: ERR 182,RTAB ARGUMENT IS NEGATIVE OR TOO LARGE
11491: BRN EXIXR RETURN PATTERN NODE
11492: EJC
11493: *
11494: * SET
11495: *
11496: S$SET ENT ENTRY POINT
11497: MOV (XS)+,R$IO2 SAVE THIRD ARG
11498: MOV (XS)+,R$IO1 SAVE SECOND ARG
11499: JSR IOFCB CALL FCBLK ROUTINE
11500: ERR 291,SET FIRST ARGUMENT IS NOT A SUITABLE NAME
11501: ERR 292,SET FIRST ARGUMENT IS NULL
11502: MOV R$IO1,WB LOAD SECOND ARG
11503: MOV R$IO2,WC LOAD THIRD ARG
11504: JSR SYSST CALL SYSTEM SET ROUTINE
11505: ERR 293,INAPPROPRIATE SECOND ARGUMENT TO SET
11506: ERR 294,INAPPROPRIATE THIRD ARGUMENT TO SET
11507: ERR 295,SET FILE DOES NOT EXIST
11508: ERR 296,SET FILE DOES NOT PERMIT SETTING FILE POINTER
11509: ERR 297,SET CAUSED NON-RECOVERABLE I/O ERROR
11510: BRN EXNUL OTHERWISEW RETURN NULL
11511: EJC
11512: *
11513: * TAB
11514: *
11515: S$TAB ENT ENTRY POINT
11516: MOV =P$TAB,WB SET PCODE FOR INTEGER ARG CASE
11517: MOV =P$TBD,WA SET PCODE FOR EXPRESSION ARG CASE
11518: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE
11519: ERR 183,TAB ARGUMENT IS NOT INTEGER OR EXPRESSION
11520: ERR 184,TAB ARGUMENT IS NEGATIVE OR TOO LARGE
11521: BRN EXIXR RETURN PATTERN NODE
11522: EJC
11523: *
11524: * RPOS
11525: *
11526: S$RPS ENT ENTRY POINT
11527: MOV =P$RPS,WB SET PCODE FOR INTEGER ARG CASE
11528: MOV =P$RPD,WA SET PCODE FOR EXPRESSION ARG CASE
11529: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE
11530: ERR 185,RPOS ARGUMENT IS NOT INTEGER OR EXPRESSION
11531: ERR 186,RPOS ARGUMENT IS NEGATIVE OR TOO LARGE
11532: BRN EXIXR RETURN PATTERN NODE
11533: EJC
11534: *
11535: * RSORT
11536: *
11537: S$RSR ENT ENTRY POINT
11538: MNZ WA MARK AS RSORT
11539: JSR SORTA CALL SORT ROUTINE
11540: BRN EXSID RETURN, SETTING IDVAL
11541: EJC
11542: *
11543: * SETEXIT
11544: *
11545: S$STX ENT ENTRY POINT
11546: MOV (XS)+,XR LOAD ARGUMENT
11547: MOV STXVR,WA LOAD OLD VRBLK POINTER
11548: ZER XL LOAD ZERO IN CASE NULL ARG
11549: BEQ XR,=NULLS,SSTX1 JUMP IF NULL ARGUMENT (RESET CALL)
11550: JSR GTNVR ELSE GET SPECIFIED VRBLK
11551: PPM SSTX2 JUMP IF NOT NATURAL VARIABLE
11552: MOV VRLBL(XR),XL ELSE LOAD LABEL
11553: BEQ XL,=STNDL,SSTX2 JUMP IF LABEL IS NOT DEFINED
11554: BNE (XL),=B$TRT,SSTX1 JUMP IF NOT TRAPPED
11555: MOV TRLBL(XL),XL ELSE LOAD PTR TO REAL LABEL CODE
11556: *
11557: * HERE TO SET/RESET SETEXIT TRAP
11558: *
11559: SSTX1 MOV XR,STXVR STORE NEW VRBLK POINTER (OR NULL)
11560: MOV XL,R$SXC STORE NEW CODE PTR (OR ZERO)
11561: BEQ WA,=NULLS,EXNUL RETURN NULL IF NULL RESULT
11562: MOV WA,XR ELSE COPY VRBLK POINTER
11563: BRN EXVNM AND RETURN BUILDING NMBLK
11564: *
11565: * HERE IF BAD ARGUMENT
11566: *
11567: SSTX2 ERB 187,SETEXIT ARGUMENT IS NOT LABEL NAME OR NULL
11568: EJC
11569: *
11570: * SORT
11571: *
11572: S$SRT ENT ENTRY POINT
11573: ZER WA MARK AS SORT
11574: JSR SORTA CALL SORT ROUTINE
11575: BRN EXSID RETURN, SETTING IDVAL
11576: EJC
11577: *
11578: * SPAN
11579: *
11580: S$SPN ENT ENTRY POINT
11581: MOV =P$SPS,WB SET PCODE FOR SINGLE CHAR ARG
11582: MOV =P$SPN,XL SET PCODE FOR MULTI-CHAR ARG
11583: MOV =P$SPD,WC SET PCODE FOR EXPRESSION ARG
11584: JSR PATST CALL COMMON ROUTINE TO BUILD NODE
11585: ERR 188,SPAN ARGUMENT IS NOT STRING OR EXPRESSION
11586: BRN EXIXR JUMP FOR NEXT CODE WORD
11587: EJC
11588: *
11589: * SIZE
11590: *
11591: S$SI$ ENT ENTRY POINT
11592: MOV (XS),XR LOAD ARGUMENT
11593: BNE (XR),=B$BCT,SSI$1 BRANCH IF NOT BUFFER
11594: ICA XS ELSE POP ARGUMENT
11595: MTI BCLEN(XR) LOAD DEFINED LENGTH
11596: BRN EXINT EXIT WITH INTEGER
11597: *
11598: * HERE IF NOT BUFFER
11599: *
11600: SSI$1 JSR GTSTG LOAD STRING ARGUMENT
11601: ERR 189,SIZE ARGUMENT IS NOT STRING
11602: MTI WA LOAD LENGTH AS INTEGER
11603: BRN EXINT EXIT WITH INTEGER RESULT
11604: EJC
11605: *
11606: * STOPTR
11607: *
11608: S$STT ENT ENTRY POINT
11609: ZER XL INDICATE STOPTR CASE
11610: JSR TRACE CALL TRACE PROCEDURE
11611: ERR 190,STOPTR FIRST ARGUMENT IS NOT APPROPRIATE NAME
11612: ERR 191,STOPTR SECOND ARGUMENT IS NOT TRACE TYPE
11613: BRN EXNUL RETURN NULL
11614: EJC
11615: *
11616: * SUBSTR
11617: *
11618: S$SUB ENT ENTRY POINT
11619: JSR GTSMI LOAD THIRD ARGUMENT
11620: ERR 192,SUBSTR THIRD ARGUMENT IS NOT INTEGER
11621: PPM EXFAL JUMP IF NEGATIVE OR TOO LARGE
11622: MOV XR,SBSSV SAVE THIRD ARGUMENT
11623: JSR GTSMI LOAD SECOND ARGUMENT
11624: ERR 193,SUBSTR SECOND ARGUMENT IS NOT INTEGER
11625: PPM EXFAL JUMP IF OUT OF RANGE
11626: MOV XR,WB SAVE SECOND ARGUMENT
11627: BZE WB,EXFAL JUMP IF SECOND ARGUMENT ZERO
11628: DCV WB ELSE DECREMENT FOR ONES ORIGIN
11629: MOV (XS),XL GET FIRST ARG PTR
11630: BNE (XL),=B$BCT,SSUBA BRANCH IF NOT BUFFER
11631: MOV BCBUF(XL),XR GET BFBLK PTR
11632: MOV BCLEN(XL),WA GET LENGTH
11633: BRN SSUBB MERGE
11634: *
11635: * HERE IF NOT BUFFER TO GET STRING
11636: *
11637: SSUBA JSR GTSTG LOAD FIRST ARGUMENT
11638: ERR 194,SUBSTR FIRST ARGUMENT IS NOT STRING
11639: *
11640: * MERGE WITH BFBLK OR SCBLK PTR IN XR. WA HAS LENGTH
11641: *
11642: SSUBB MOV SBSSV,WC RELOAD THIRD ARGUMENT
11643: BNZ WC,SSUB1 SKIP IF THIRD ARG GIVEN
11644: MOV WA,WC ELSE GET STRING LENGTH
11645: BGT WB,WC,EXFAL FAIL IF IMPROPER
11646: SUB WB,WC REDUCE BY OFFSET TO START
11647: *
11648: * MERGE
11649: *
11650: SSUB1 MOV WA,XL SAVE STRING LENGTH
11651: MOV WC,WA SET LENGTH OF SUBSTRING
11652: ADD WB,WC ADD 2ND ARG TO 3RD ARG
11653: BGT WC,XL,EXFAL JUMP IF IMPROPER SUBSTRING
11654: MOV XR,XL COPY POINTER TO FIRST ARG
11655: JSR SBSTR BUILD SUBSTRING
11656: BRN EXIXR AND JUMP FOR NEXT CODE WORD
11657: EJC
11658: *
11659: * TABLE
11660: *
11661: S$TBL ENT ENTRY POINT
11662: MOV (XS)+,XL GET INITIAL LOOKUP VALUE
11663: ICA XS POP SECOND ARGUMENT
11664: JSR GTSMI LOAD ARGUMENT
11665: ERR 195,TABLE ARGUMENT IS NOT INTEGER
11666: ERR 196,TABLE ARGUMENT IS OUT OF RANGE
11667: BNZ WC,STBL1 JUMP IF NON-ZERO
11668: MOV =TBNBK,WC ELSE SUPPLY DEFAULT VALUE
11669: *
11670: * MERGE HERE WITH NUMBER OF HEADERS IN WA
11671: *
11672: STBL1 MOV WC,WA COPY NUMBER OF HEADERS
11673: ADD =TBSI$,WA ADJUST FOR STANDARD FIELDS
11674: WTB WA CONVERT LENGTH TO BYTES
11675: JSR ALLOC ALLOCATE SPACE FOR TBBLK
11676: MOV XR,WB COPY POINTER TO TBBLK
11677: MOV =B$TBT,(XR)+ STORE TYPE WORD
11678: ZER (XR)+ ZERO ID FOR THE MOMENT
11679: MOV WA,(XR)+ STORE LENGTH (TBLEN)
11680: MOV XL,(XR)+ STORE INITIAL LOOKUP VALUE
11681: LCT WC,WC SET LOOP COUNTER (NUM HEADERS)
11682: *
11683: * LOOP TO INITIALIZE ALL BUCKET POINTERS
11684: *
11685: STBL2 MOV WB,(XR)+ STORE TBBLK PTR IN BUCKET HEADER
11686: BCT WC,STBL2 LOOP TILL ALL STORED
11687: MOV WB,XR RECALL POINTER TO TBBLK
11688: BRN EXSID EXIT SETTING IDVAL
11689: EJC
11690: *
11691: * TIME
11692: *
11693: S$TIM ENT ENTRY POINT
11694: JSR SYSTM GET TIMER VALUE
11695: SBI TIMSX SUBTRACT STARTING TIME
11696: BRN EXINT EXIT WITH INTEGER VALUE
11697: EJC
11698: *
11699: * TRACE
11700: *
11701: S$TRA ENT ENTRY POINT
11702: BEQ 3(XS),=NULLS,STR03 JUMP IF FIRST ARGUMENT IS NULL
11703: MOV (XS)+,XR LOAD FOURTH ARGUMENT
11704: ZER XL TENTATIVELY SET ZERO POINTER
11705: BEQ XR,=NULLS,STR02 JUMP IF 4TH ARGUMENT IS NULL
11706: JSR GTNVR ELSE POINT TO VRBLK
11707: PPM STR01 JUMP IF NOT VARIABLE NAME
11708: MOV VRFNC(XR),XL ELSE LOAD FUNCTION POINTER
11709: BNE XL,=STNDF,STR02 JUMP IF FUNCTION IS DEFINED
11710: *
11711: * HERE FOR BAD FOURTH ARGUMENT
11712: *
11713: STR01 ERB 197,TRACE FOURTH ARG IS NOT FUNCTION NAME OR NULL
11714: *
11715: * HERE WITH FUNCTION POINTER IN XL
11716: *
11717: STR02 MOV (XS)+,XR LOAD THIRD ARGUMENT (TAG)
11718: ZER WB SET ZERO AS TRTYP VALUE FOR NOW
11719: JSR TRBLD BUILD TRBLK FOR TRACE CALL
11720: MOV XR,XL MOVE TRBLK POINTER FOR TRACE
11721: JSR TRACE CALL TRACE PROCEDURE
11722: ERR 198,TRACE FIRST ARGUMENT IS NOT APPROPRIATE NAME
11723: ERR 199,TRACE SECOND ARGUMENT IS NOT TRACE TYPE
11724: BRN EXNUL RETURN NULL
11725: *
11726: * HERE TO CALL SYSTEM TRACE TOGGLE ROUTINE
11727: *
11728: STR03 JSR SYSTT CALL IT
11729: ADD *NUM04,XS POP TRACE ARGUMENTS
11730: BRN EXNUL RETURN
11731: EJC
11732: *
11733: * TRIM
11734: *
11735: S$TRM ENT ENTRY POINT
11736: JSR GTSTG LOAD ARGUMENT AS STRING
11737: ERR 200,TRIM ARGUMENT IS NOT STRING
11738: BZE WA,EXNUL RETURN NULL IF ARGUMENT IS NULL
11739: MOV XR,XL COPY STRING POINTER
11740: CTB WA,SCHAR GET BLOCK LENGTH
11741: JSR ALLOC ALLOCATE COPY SAME SIZE
11742: MOV XR,WB SAVE POINTER TO COPY
11743: MVW COPY OLD STRING BLOCK TO NEW
11744: MOV WB,XR RESTORE PTR TO NEW BLOCK
11745: JSR TRIMR TRIM BLANKS (WB IS NON-ZERO)
11746: BRN EXIXR EXIT WITH RESULT IN XR
11747: EJC
11748: *
11749: * UNLOAD
11750: *
11751: S$UNL ENT ENTRY POINT
11752: MOV (XS)+,XR LOAD ARGUMENT
11753: JSR GTNVR POINT TO VRBLK
11754: ERR 201,UNLOAD ARGUMENT IS NOT NATURAL VARIABLE NAME
11755: MOV =STNDF,XL GET PTR TO UNDEFINED FUNCTION
11756: JSR DFFNC UNDEFINE NAMED FUNCTION
11757: BRN EXNUL RETURN NULL AS RESULT
11758: TTL S P I T B O L -- UTILITY PROCEDURES
11759: *
11760: * THE FOLLOWING SECTION CONTAINS PROCEDURES WHICH ARE
11761: * USED FOR VARIOUS PURPOSES THROUGHOUT THE SYSTEM.
11762: *
11763: * EACH PROCEDURE IS PRECEDED BY A DESCRIPTION OF THE
11764: * CALLING SEQUENCE. USUALLY THE ARGUMENTS ARE IN REGISTERS
11765: * BUT ARGUMENTS CAN ALSO OCCUR ON THE STACK AND AS
11766: * PARAMETERS ASSEMBLED AFTER THE JSR INSTRUCTION.
11767: *
11768: * THE FOLLOWING CONSIDERATIONS APPLY TO THESE DESCRIPTIONS.
11769: *
11770: * 1) THE STACK POINTER (XS) IS NOT CHANGED UNLESS THE
11771: * CHANGE IS EXPLICITLY DOCUMENTED IN THE CALL.
11772: *
11773: * 2) REGISTERS WHOSE ENTRY VALUES ARE NOT MENTIONED
11774: * MAY CONTAIN ANY VALUE EXCEPT THAT XL,XR MAY ONLY
11775: * CONTAIN PROPER (COLLECTABLE) POINTER VALUES.
11776: * THIS CONDITION ON XR MEANS THAT THE CALLED ROUTINE
11777: * MAY IF IT CHOOSES PRESERVE XR BY STACKING.
11778: *
11779: * 3) REGISTERS NOT MENTIONED ON EXIT CONTAIN THE SAME
11780: * VALUES AS THEY DID ON ENTRY EXCEPT THAT VALUES IN
11781: * XR,XL MAY HAVE BEEN RELOCATED BY THE COLLECTOR.
11782: *
11783: * 4) REGISTERS WHICH ARE DESTROYED ON EXIT MAY CONTAIN
11784: * ANY VALUE EXCEPT THAT VALUES IN XL,XR ARE PROPER
11785: * (COLLECTABLE) POINTERS.
11786: *
11787: * 5) THE CODE POINTER REGISTER POINTS TO THE CURRENT
11788: * CODE LOCATION ON ENTRY AND IS UNCHANGED ON EXIT.
11789: *
11790: * IN THE ABOVE DESCRIPTION, A COLLECTABLE POINTER IS ONE
11791: * WHICH EITHER POINTS OUTSIDE THE DYNAMIC REGION OR
11792: * POINTS TO THE START OF A BLOCK IN THE DYNAMIC REGION.
11793: *
11794: * IN THOSE CASES WHERE THE CALLING SEQUENCE CONTAINS
11795: * PARAMETERS WHICH ARE USED AS ALTERNATE RETURN POINTS,
11796: * THESE PARAMETERS MAY BE REPLACED BY ERROR CODES
11797: * ASSEMBLED WITH THE ERR INSTRUCTION. THIS WILL RESULT
11798: * IN THE POSTING OF THE ERROR IF THE RETURN IS TAKEN.
11799: *
11800: * THE PROCEDURES ALL HAVE NAMES CONSISTING OF FIVE LETTERS
11801: * AND ARE IN ALPHABETICAL ORDER BY THEIR NAMES.
11802: EJC
11803: *
11804: * ACESS - ACCESS VARIABLE VALUE WITH TRACE/INPUT CHECKS
11805: *
11806: * ACESS LOADS THE VALUE OF A VARIABLE. TRACE AND INPUT
11807: * ASSOCIATIONS ARE TESTED FOR AND EXECUTED AS REQUIRED.
11808: * ACESS ALSO HANDLES THE SPECIAL CASES OF PSEUDO-VARIABLES.
11809: *
11810: * (XL) VARIABLE NAME BASE
11811: * (WA) VARIABLE NAME OFFSET
11812: * JSR ACESS CALL TO ACCESS VALUE
11813: * PPM LOC TRANSFER LOC IF ACCESS FAILURE
11814: * (XR) VARIABLE VALUE
11815: * (WA,WB,WC) DESTROYED
11816: * (XL,RA) DESTROYED
11817: *
11818: * FAILURE CAN OCCUR IF AN INPUT ASSOCIATION CAUSES AN END
11819: * OF FILE CONDITION OR IF THE EVALUATION OF AN EXPRESSION
11820: * ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS.
11821: *
11822: ACESS PRC R,1 ENTRY POINT (RECURSIVE)
11823: MOV XL,XR COPY NAME BASE
11824: ADD WA,XR POINT TO VARIABLE LOCATION
11825: MOV (XR),XR LOAD VARIABLE VALUE
11826: *
11827: * LOOP HERE TO CHECK FOR SUCCESSIVE TRBLKS
11828: *
11829: ACS02 BNE (XR),=B$TRT,ACS18 JUMP IF NOT TRAPPED
11830: *
11831: * HERE IF TRAPPED
11832: *
11833: BEQ XR,=TRBKV,ACS12 JUMP IF KEYWORD VARIABLE
11834: BNE XR,=TRBEV,ACS05 JUMP IF NOT EXPRESSION VARIABLE
11835: *
11836: * HERE FOR EXPRESSION VARIABLE, EVALUATE VARIABLE
11837: *
11838: MOV EVEXP(XL),XR LOAD EXPRESSION POINTER
11839: ZER WB EVALUATE BY VALUE
11840: JSR EVALX EVALUATE EXPRESSION
11841: PPM ACS04 JUMP IF EVALUATION FAILURE
11842: BRN ACS02 CHECK VALUE FOR MORE TRBLKS
11843: EJC
11844: *
11845: * ACESS (CONTINUED)
11846: *
11847: * HERE ON READING END OF FILE
11848: *
11849: ACS03 ADD *NUM03,XS POP TRBLK PTR, NAME BASE AND OFFSET
11850: MOV XR,DNAMP POP UNUSED SCBLK
11851: *
11852: * MERGE HERE WHEN EVALUATION OF EXPRESSION FAILS
11853: *
11854: ACS04 EXI 1 TAKE ALTERNATE (FAILURE) RETURN
11855: *
11856: * HERE IF NOT KEYWORD OR EXPRESSION VARIABLE
11857: *
11858: ACS05 MOV TRTYP(XR),WB LOAD TRAP TYPE CODE
11859: BNZ WB,ACS10 JUMP IF NOT INPUT ASSOCIATION
11860: BZE KVINP,ACS09 IGNORE INPUT ASSOC IF INPUT IS OFF
11861: *
11862: * HERE FOR INPUT ASSOCIATION
11863: *
11864: MOV XL,-(XS) STACK NAME BASE
11865: MOV WA,-(XS) STACK NAME OFFSET
11866: MOV XR,-(XS) STACK TRBLK POINTER
11867: MOV TRFPT(XR),XL GET FILE CTRL BLK PTR OR ZERO
11868: BNZ XL,ACS06 JUMP IF NOT STANDARD INPUT FILE
11869: BEQ TRTER(XR),=V$TER,ACS21 JUMP IF TERMINAL
11870: *
11871: * HERE TO READ FROM STANDARD INPUT FILE
11872: *
11873: MOV CSWIN,WA LENGTH FOR READ BUFFER
11874: JSR ALOCS BUILD STRING OF APPROPRIATE LENGTH
11875: JSR SYSRD READ NEXT STANDARD INPUT IMAGE
11876: PPM ACS03 JUMP TO FAIL EXIT IF END OF FILE
11877: BRN ACS07 ELSE MERGE WITH OTHER FILE CASE
11878: *
11879: * HERE FOR INPUT FROM OTHER THAN STANDARD INPUT FILE
11880: *
11881: ACS06 MOV XL,WA FCBLK PTR
11882: JSR SYSIL GET INPUT RECORD MAX LENGTH (TO WA)
11883: JSR ALOCS ALLOCATE STRING OF CORRECT SIZE
11884: MOV XL,WA FCBLK PTR
11885: JSR SYSIN CALL SYSTEM INPUT ROUTINE
11886: PPM ACS03 JUMP TO FAIL EXIT IF END OF FILE
11887: PPM ACS22 ERROR
11888: PPM ACS23 ERROR
11889: EJC
11890: *
11891: * ACESS (CONTINUED)
11892: *
11893: * MERGE HERE AFTER OBTAINING INPUT RECORD
11894: *
11895: ACS07 MOV KVTRM,WB LOAD TRIM INDICATOR
11896: JSR TRIMR TRIM RECORD AS REQUIRED
11897: MOV XR,WB COPY RESULT POINTER
11898: MOV (XS),XR RELOAD POINTER TO TRBLK
11899: *
11900: * LOOP TO CHASE TO END OF TRBLK CHAIN AND STORE VALUE
11901: *
11902: ACS08 MOV XR,XL SAVE POINTER TO THIS TRBLK
11903: MOV TRNXT(XR),XR LOAD FORWARD POINTER
11904: BEQ (XR),=B$TRT,ACS08 LOOP IF THIS IS ANOTHER TRBLK
11905: MOV WB,TRNXT(XL) ELSE STORE RESULT AT END OF CHAIN
11906: MOV (XS)+,XR RESTORE INITIAL TRBLK POINTER
11907: MOV (XS)+,WA RESTORE NAME OFFSET
11908: MOV (XS)+,XL RESTORE NAME BASE POINTER
11909: *
11910: * COME HERE TO MOVE TO NEXT TRBLK
11911: *
11912: ACS09 MOV TRNXT(XR),XR LOAD FORWARD PTR TO NEXT VALUE
11913: BRN ACS02 BACK TO CHECK IF TRAPPED
11914: *
11915: * HERE TO CHECK FOR ACCESS TRACE TRBLK
11916: *
11917: ACS10 BNE WB,=TRTAC,ACS09 LOOP BACK IF NOT ACCESS TRACE
11918: BZE KVTRA,ACS09 IGNORE ACCESS TRACE IF TRACE OFF
11919: DCV KVTRA ELSE DECREMENT TRACE COUNT
11920: BZE TRFNC(XR),ACS11 JUMP IF PRINT TRACE
11921: EJC
11922: *
11923: * ACESS (CONTINUED)
11924: *
11925: * HERE FOR FULL FUNCTION TRACE
11926: *
11927: JSR TRXEQ CALL ROUTINE TO EXECUTE TRACE
11928: BRN ACS09 JUMP FOR NEXT TRBLK
11929: *
11930: * HERE FOR CASE OF PRINT TRACE
11931: *
11932: ACS11 JSR PRTSN PRINT STATEMENT NUMBER
11933: JSR PRTNV PRINT NAME = VALUE
11934: BRN ACS09 JUMP BACK FOR NEXT TRBLK
11935: *
11936: * HERE FOR KEYWORD VARIABLE
11937: *
11938: ACS12 MOV KVNUM(XL),XR LOAD KEYWORD NUMBER
11939: BGE XR,=K$V$$,ACS14 JUMP IF NOT ONE WORD VALUE
11940: MTI KVABE(XR) ELSE LOAD VALUE AS INTEGER
11941: *
11942: * COMMON EXIT WITH KEYWORD VALUE AS INTEGER IN (IA)
11943: *
11944: ACS13 JSR ICBLD BUILD ICBLK
11945: BRN ACS18 JUMP TO EXIT
11946: *
11947: * HERE IF NOT ONE WORD KEYWORD VALUE
11948: *
11949: ACS14 BGE XR,=K$S$$,ACS15 JUMP IF SPECIAL CASE
11950: SUB =K$V$$,XR ELSE GET OFFSET
11951: ADD =NDABO,XR POINT TO PATTERN VALUE
11952: BRN ACS18 JUMP TO EXIT
11953: *
11954: * HERE IF SPECIAL KEYWORD CASE
11955: *
11956: ACS15 MOV KVRTN,XL LOAD RTNTYPE IN CASE
11957: LDI KVSTL LOAD STLIMIT IN CASE
11958: SUB =K$S$$,XR GET CASE NUMBER
11959: BSW XR,5 SWITCH ON KEYWORD NUMBER
11960: IFF K$$AL,ACS16 JUMP IF ALPHABET
11961: IFF K$$RT,ACS17 RTNTYPE
11962: IFF K$$SC,ACS19 STCOUNT
11963: IFF K$$SL,ACS13 STLIMIT
11964: IFF K$$ET,ACS20 ERRTEXT
11965: ESW END SWITCH ON KEYWORD NUMBER
11966: EJC
11967: *
11968: * ACESS (CONTINUED)
11969: *
11970: * ALPHABET
11971: *
11972: ACS16 MOV KVALP,XL LOAD POINTER TO ALPHABET STRING
11973: *
11974: * RTNTYPE MERGES HERE
11975: *
11976: ACS17 MOV XL,XR COPY STRING PTR TO PROPER REG
11977: *
11978: * COMMON RETURN POINT
11979: *
11980: ACS18 EXI RETURN TO ACESS CALLER
11981: *
11982: * HERE FOR STCOUNT (IA HAS STLIMIT)
11983: *
11984: ACS19 SBI KVSTC STCOUNT = LIMIT - LEFT
11985: BRN ACS13 MERGE BACK WITH INTEGER RESULT
11986: *
11987: * ERRTEXT
11988: *
11989: ACS20 MOV R$ETX,XR GET ERRTEXT STRING
11990: BRN ACS18 MERGE WITH RESULT
11991: *
11992: * HERE TO READ A RECORD FROM TERMINAL
11993: *
11994: ACS21 MOV =RILEN,WA BUFFER LENGTH
11995: JSR ALOCS ALLOCATE BUFFER
11996: JSR SYSRI READ RECORD
11997: PPM ACS03 ENDFILE
11998: BRN ACS07 MERGE WITH RECORD READ
11999: *
12000: * ERROR RETURNS
12001: *
12002: ACS22 MOV XR,DNAMP POP UNUSED SCBLK
12003: ERB 202,INPUT FROM FILE CAUSED NON-RECOVERABLE ERROR
12004: *
12005: ACS23 MOV XR,DNAMP POP UNUSED SCBLK
12006: ERB 203,INPUT FILE RECORD HAS INCORRECT FORMAT
12007: ENP END PROCEDURE ACESS
12008: EJC
12009: *
12010: * ACOMP -- COMPARE TWO ARITHMETIC VALUES
12011: *
12012: * 1(XS) FIRST ARGUMENT
12013: * 0(XS) SECOND ARGUMENT
12014: * JSR ACOMP CALL TO COMPARE VALUES
12015: * PPM LOC TRANSFER LOC IF ARG1 IS NON-NUMERIC
12016: * PPM LOC TRANSFER LOC IF ARG2 IS NON-NUMERIC
12017: * PPM LOC TRANSFER LOC FOR ARG1 LT ARG2
12018: * PPM LOC TRANSFER LOC FOR ARG1 EQ ARG2
12019: * PPM LOC TRANSFER LOC FOR ARG1 GT ARG2
12020: * (NORMAL RETURN IS NEVER GIVEN)
12021: * (WA,WB,WC,IA,RA) DESTROYED
12022: * (XL,XR) DESTROYED
12023: *
12024: ACOMP PRC N,5 ENTRY POINT
12025: JSR ARITH LOAD ARITHMETIC OPERANDS
12026: PPM ACMP7 JUMP IF FIRST ARG NON-NUMERIC
12027: PPM ACMP8 JUMP IF SECOND ARG NON-NUMERIC
12028: PPM ACMP4 JUMP IF REAL ARGUMENTS
12029: *
12030: * HERE FOR INTEGER ARGUMENTS
12031: *
12032: SBI ICVAL(XL) SUBTRACT TO COMPARE
12033: IOV ACMP3 JUMP IF OVERFLOW
12034: ILT ACMP5 ELSE JUMP IF ARG1 LT ARG2
12035: IEQ ACMP2 JUMP IF ARG1 EQ ARG2
12036: *
12037: * HERE IF ARG1 GT ARG2
12038: *
12039: ACMP1 EXI 5 TAKE GT EXIT
12040: *
12041: * HERE IF ARG1 EQ ARG2
12042: *
12043: ACMP2 EXI 4 TAKE EQ EXIT
12044: EJC
12045: *
12046: * ACOMP (CONTINUED)
12047: *
12048: * HERE FOR INTEGER OVERFLOW ON SUBTRACT
12049: *
12050: ACMP3 LDI ICVAL(XL) LOAD SECOND ARGUMENT
12051: ILT ACMP1 GT IF NEGATIVE
12052: BRN ACMP5 ELSE LT
12053: *
12054: * HERE FOR REAL OPERANDS
12055: *
12056: ACMP4 SBR RCVAL(XL) SUBTRACT TO COMPARE
12057: ROV ACMP6 JUMP IF OVERFLOW
12058: RGT ACMP1 ELSE JUMP IF ARG1 GT
12059: REQ ACMP2 JUMP IF ARG1 EQ ARG2
12060: *
12061: * HERE IF ARG1 LT ARG2
12062: *
12063: ACMP5 EXI 3 TAKE LT EXIT
12064: *
12065: * HERE IF OVERFLOW ON REAL SUBTRACTION
12066: *
12067: ACMP6 LDR RCVAL(XL) RELOAD ARG2
12068: RLT ACMP1 GT IF NEGATIVE
12069: BRN ACMP5 ELSE LT
12070: *
12071: * HERE IF ARG1 NON-NUMERIC
12072: *
12073: ACMP7 EXI 1 TAKE ERROR EXIT
12074: *
12075: * HERE IF ARG2 NON-NUMERIC
12076: *
12077: ACMP8 EXI 2 TAKE ERROR EXIT
12078: ENP END PROCEDURE ACOMP
12079: EJC
12080: *
12081: * ALLOC ALLOCATE BLOCK OF DYNAMIC STORAGE
12082: *
12083: * (WA) LENGTH REQUIRED IN BYTES
12084: * JSR ALLOC CALL TO ALLOCATE BLOCK
12085: * (XR) POINTER TO ALLOCATED BLOCK
12086: *
12087: * A POSSIBLE ALTERNATIVE TO AOV .. AND FOLLOWING STMT IS -
12088: * MOV DNAME,XR . SUB WA,XR . BLO XR,DNAMP,ALOC2 .
12089: * MOV DNAMP,XR . ADD WA,XR
12090: *
12091: ALLOC PRC E,0 ENTRY POINT
12092: *
12093: * COMMON EXIT POINT
12094: *
12095: ALOC1 MOV DNAMP,XR POINT TO NEXT AVAILABLE LOC
12096: AOV WA,XR,ALOC2 POINT PAST ALLOCATED BLOCK
12097: BGT XR,DNAME,ALOC2 JUMP IF NOT ENOUGH ROOM
12098: MOV XR,DNAMP STORE NEW POINTER
12099: SUB WA,XR POINT BACK TO START OF ALLOCATED BK
12100: EXI RETURN TO CALLER
12101: *
12102: * HERE IF INSUFFICIENT ROOM, TRY A GARBAGE COLLECTION
12103: *
12104: ALOC2 MOV WB,ALLSV SAVE WB
12105: ZER WB SET NO UPWARD MOVE FOR GBCOL
12106: JSR GBCOL GARBAGE COLLECT
12107: *
12108: * SEE IF ROOM AFTER GBCOL OR SYSMM CALL
12109: *
12110: ALOC3 MOV DNAMP,XR POINT TO FIRST AVAILABLE LOC
12111: AOV WA,XR,ALC3A POINT PAST NEW BLOCK
12112: BLO XR,DNAME,ALOC4 JUMP IF THERE IS ROOM NOW
12113: *
12114: * FAILED AGAIN, SEE IF WE CAN GET MORE CORE
12115: *
12116: ALC3A JSR SYSMM TRY TO GET MORE MEMORY
12117: WTB XR CONVERT TO BAUS (SGD05)
12118: ADD XR,DNAME BUMP PTR BY AMOUNT OBTAINED
12119: BNZ XR,ALOC3 JUMP IF GOT MORE CORE
12120: ADD RSMEM,DNAME GET THE RESERVE MEMORY
12121: ZER RSMEM ONLY PERMISSIBLE ONCE
12122: ICV ERRFT FATAL ERROR
12123: ERB 204,MEMORY OVERFLOW
12124: EJC
12125: *
12126: * HERE AFTER SUCCESSFUL GARBAGE COLLECTION
12127: *
12128: ALOC4 STI ALLIA SAVE IA
12129: MOV DNAME,WB GET DYNAMIC END ADRS
12130: SUB DNAMP,WB COMPUTE FREE STORE
12131: BTW WB CONVERT BYTES TO WORDS
12132: MTI WB PUT FREE STORE IN IA
12133: MLI ALFSF MULTIPLY BY FREE STORE FACTOR
12134: IOV ALOC5 JUMP IF OVERFLOWED
12135: MOV DNAME,WB DYNAMIC END ADRS
12136: SUB DNAMB,WB COMPUTE TOTAL AMOUNT OF DYNAMIC
12137: BTW WB CONVERT TO WORDS
12138: MOV WB,ALDYN STORE IT
12139: SBI ALDYN SUBTRACT FROM SCALED UP FREE STORE
12140: IGT ALOC5 JUMP IF SUFFICIENT FREE STORE
12141: JSR SYSMM TRY TO GET MORE STORE
12142: WTB XR CONVERT TO BAUS (SGD05)
12143: ADD XR,DNAME ADJUST DYNAMIC END ADRS
12144: *
12145: * MERGE TO RESTORE IA AND WB
12146: *
12147: ALOC5 LDI ALLIA RECOVER IA
12148: MOV ALLSV,WB RESTORE WB
12149: BRN ALOC1 JUMP BACK TO EXIT
12150: ENP END PROCEDURE ALLOC
12151: EJC
12152: *
12153: * ALOBF -- ALLOCATE BUFFER
12154: *
12155: * THIS ROUTINES ALLOCATES A NEW BUFFER. AS THE BFBLK
12156: * AND BCBLK COME IN PAIRS, BOTH ARE ALLOCATED HERE,
12157: * AND XR POINTS TO THE BCBLK ON RETURN. THE BFBLK
12158: * AND BCBLK ARE SET TO THE NULL BUFFER, AND THE IDVAL
12159: * IS ZERO ON RETURN.
12160: *
12161: * (WA) BUFFER SIZE IN CHARACTERS
12162: * JSR ALOBF CALL TO CREATE BUFFER
12163: * (XR) BCBLK PTR
12164: * (WA,WB) DESTROYED
12165: *
12166: ALOBF PRC E,0 ENTRY POINT
12167: MOV WA,WB HANG ONTO ALLOCATION SIZE
12168: CTB WA,BFSI$ GET TOTAL BLOCK SIZE
12169: BGE WA,MXLEN,ALB01 CHECK FOR MAXLEN EXCEEDED
12170: ADD *BCSI$,WA ADD IN ALLOCATION FOR BCBLK
12171: JSR ALLOC ALLOCATE FRAME
12172: MOV =B$BCT,(XR) SET TYPE
12173: ZER IDVAL(XR) NO ID YET
12174: ZER BCLEN(XR) NO DEFINED LENGTH
12175: MOV XL,WA SAVE XL
12176: MOV XR,XL COPY BCBLK PTR
12177: ADD *BCSI$,XL BIAS PAST PARTIALLY BUILT BCBLK
12178: MOV =B$BFT,(XL) SET BFBLK TYPE WORD
12179: MOV WB,BFALC(XL) SET ALLOCATED SIZE
12180: MOV XL,BCBUF(XR) SET POINTER IN BCBLK
12181: ZER BFCHR(XL) CLEAR FIRST WORD (NULL PAD)
12182: MOV WA,XL RESTORE ENTRY XL
12183: EXI RETURN TO CALLER
12184: *
12185: * HERE FOR MXLEN EXCEEDED
12186: *
12187: ALB01 ERB 274,REQUESTED BUFFER ALLOCATION EXCEEDS MXLEN
12188: ENP END PROCEDURE ALOBF
12189: EJC
12190: *
12191: * ALOCS -- ALLOCATE STRING BLOCK
12192: *
12193: * ALOCS IS USED TO BUILD A FRAME FOR A STRING BLOCK INTO
12194: * WHICH THE ACTUAL CHARACTERS ARE PLACED BY THE CALLER.
12195: * ALL STRINGS ARE CREATED WITH A CALL TO ALOCS (THE
12196: * EXCEPTIONS OCCUR IN TRIMR AND S$RPL PROCEDURES).
12197: *
12198: * (WA) LENGTH OF STRING TO BE ALLOCATED
12199: * JSR ALOCS CALL TO ALLOCATE SCBLK
12200: * (XR) POINTER TO RESULTING SCBLK
12201: * (WA) DESTROYED
12202: * (WC) CHARACTER COUNT (ENTRY VALUE OF WA)
12203: *
12204: * THE RESULTING SCBLK HAS THE TYPE WORD AND THE LENGTH
12205: * FILLED IN AND THE LAST WORD IS CLEARED TO ZERO CHARACTERS
12206: * TO ENSURE CORRECT RIGHT PADDING OF THE FINAL WORD.
12207: *
12208: ALOCS PRC E,0 ENTRY POINT
12209: BGT WA,KVMXL,ALCS2 JUMP IF LENGTH EXCEEEDS MAXLENGTH
12210: MOV WA,WC ELSE COPY LENGTH
12211: CTB WA,SCSI$ COMPUTE LENGTH OF SCBLK IN BYTES
12212: MOV DNAMP,XR POINT TO NEXT AVAILABLE LOCATION
12213: AOV WA,XR,ALCS0 POINT PAST BLOCK
12214: BLO XR,DNAME,ALCS1 JUMP IF THERE IS ROOM
12215: *
12216: * INSUFFICIENT MEMORY
12217: *
12218: ALCS0 ZER XR ELSE CLEAR GARBAGE XR VALUE
12219: JSR ALLOC AND USE STANDARD ALLOCATOR
12220: ADD WA,XR POINT PAST END OF BLOCK TO MERGE
12221: *
12222: * MERGE HERE WITH XR POINTING BEYOND NEW BLOCK
12223: *
12224: ALCS1 MOV XR,DNAMP SET UPDATED STORAGE POINTER
12225: ZER -(XR) STORE ZERO CHARS IN LAST WORD
12226: DCA WA DECREMENT LENGTH
12227: SUB WA,XR POINT BACK TO START OF BLOCK
12228: MOV =B$SCL,(XR) SET TYPE WORD
12229: MOV WC,SCLEN(XR) STORE LENGTH IN CHARS
12230: EXI RETURN TO ALOCS CALLER
12231: *
12232: * COME HERE IF STRING IS TOO LONG
12233: *
12234: ALCS2 ERB 205,STRING LENGTH EXCEEDS VALUE OF MAXLNGTH KEYWORD
12235: ENP END PROCEDURE ALOCS
12236: EJC
12237: *
12238: * ALOST -- ALLOCATE SPACE IN STATIC REGION
12239: *
12240: * (WA) LENGTH REQUIRED IN BYTES
12241: * JSR ALOST CALL TO ALLOCATE SPACE
12242: * (XR) POINTER TO ALLOCATED BLOCK
12243: * (WB) DESTROYED
12244: *
12245: * NOTE THAT THE CODING ENSURES THAT THE RESULTING VALUE
12246: * OF STATE IS ALWAYS LESS THAN DNAMB. THIS FACT IS USED
12247: * IN TESTING A VARIABLE NAME FOR BEING IN THE STATIC REGION
12248: *
12249: ALOST PRC E,0 ENTRY POINT
12250: *
12251: * MERGE BACK HERE AFTER ALLOCATING NEW CHUNK
12252: *
12253: ALST1 MOV STATE,XR POINT TO CURRENT END OF AREA
12254: AOV WA,XR,ALST2 POINT BEYOND PROPOSED BLOCK
12255: BGE XR,DNAMB,ALST2 JUMP IF OVERLAP WITH DYNAMIC AREA
12256: MOV XR,STATE ELSE STORE NEW POINTER
12257: SUB WA,XR POINT BACK TO START OF BLOCK
12258: EXI RETURN TO ALOST CALLER
12259: *
12260: * HERE IF NO ROOM, PREPARE TO MOVE DYNAMIC STORAGE UP
12261: *
12262: ALST2 MOV WA,ALSTA SAVE WA
12263: BGE WA,*E$STS,ALST3 SKIP IF REQUESTED CHUNK IS LARGE
12264: MOV *E$STS,WA ELSE SET TO GET LARGE ENOUGH CHUNK
12265: *
12266: * HERE WITH AMOUNT TO MOVE UP IN WA
12267: *
12268: ALST3 JSR ALLOC ALLOCATE BLOCK TO ENSURE ROOM
12269: MOV XR,DNAMP AND DELETE IT
12270: MOV WA,WB COPY MOVE UP AMOUNT
12271: JSR GBCOL CALL GBCOL TO MOVE DYNAMIC AREA UP
12272: MOV ALSTA,WA RESTORE WA
12273: BRN ALST1 LOOP BACK TO TRY AGAIN
12274: ENP END PROCEDURE ALOST
12275: EJC
12276: *
12277: * APNDB -- APPEND STRING TO BUFFER
12278: *
12279: * THIS ROUTINE IS USED BY BUFFER HANDLING ROUTINES TO
12280: * APPEND DATA TO AN EXISTING BFBLK.
12281: *
12282: * (XR) EXISTING BCBLK TO BE APPENDED
12283: * (XL) CONVERTABLE TO STRING
12284: * JSR APNDB CALL TO APPEND TO BUFFER
12285: * PPM LOC THREAD IF (XL) CANT BE CONVERTED
12286: * PPM LOC IF NOT ENOUGH ROOM
12287: * (WA,WB) DESTROYED
12288: *
12289: * IF MORE CHARACTERS ARE SPECIFIED THAN CAN BE INSERTED,
12290: * THEN NO ACTION IS TAKEN AND THE SECOND RETURN IS TAKEN.
12291: *
12292: APNDB PRC E,2 ENTRY POINT
12293: MOV BCLEN(XR),WA LOAD OFFSET TO INSERT
12294: ZER WB REPLACE SECTION IS NULL
12295: JSR INSBF CALL TO INSERT AT END
12296: PPM APN01 CONVERT ERROR
12297: PPM APN02 NO ROOM
12298: EXI RETURN TO CALLER
12299: *
12300: * HERE TO TAKE CONVERT FAILURE EXIT
12301: *
12302: APN01 EXI 1 RETURN TO CALLER ALTERNATE
12303: *
12304: * HERE FOR NO FIT EXIT
12305: *
12306: APN02 EXI 2 ALTERNATE EXIT TO CALLER
12307: ENP END PROCEDURE APNDB
12308: EJC
12309: *
12310: * ARITH -- FETCH ARITHMETIC OPERANDS
12311: *
12312: * ARITH IS USED BY FUNCTIONS AND OPERATORS WHICH EXPECT
12313: * TWO NUMERIC ARGUMENTS (OPERANDS) WHICH MUST BOTH BE
12314: * INTEGER OR BOTH BE REAL. ARITH FETCHES TWO ARGUMENTS FROM
12315: * THE STACK AND PERFORMS ANY NECESSARY CONVERSIONS.
12316: *
12317: * 1(XS) FIRST ARGUMENT (LEFT OPERAND)
12318: * 0(XS) SECOND ARGUMENT (RIGHT OPERAND)
12319: * JSR ARITH CALL TO FETCH NUMERIC ARGUMENTS
12320: * PPM LOC TRANSFER LOC FOR OPND 1 NON-NUMERIC
12321: * PPM LOC TRANSFER LOC FOR OPND 2 NON-NUMERIC
12322: * PPM LOC TRANSFER LOC FOR REAL OPERANDS
12323: *
12324: * FOR INTEGER ARGS, CONTROL RETURNS PAST THE PARAMETERS
12325: *
12326: * (IA) LEFT OPERAND VALUE
12327: * (XR) PTR TO ICBLK FOR LEFT OPERAND
12328: * (XL) PTR TO ICBLK FOR RIGHT OPERAND
12329: * (XS) POPPED TWICE
12330: * (WA,WB,RA) DESTROYED
12331: *
12332: * FOR REAL ARGUMENTS, CONTROL RETURNS TO THE LOCATION
12333: * SPECIFIED BY THE THIRD PARAMETER.
12334: *
12335: * (RA) LEFT OPERAND VALUE
12336: * (XR) PTR TO RCBLK FOR LEFT OPERAND
12337: * (XL) PTR TO RCBLK FOR RIGHT OPERAND
12338: * (WA,WB,WC) DESTROYED
12339: * (XS) POPPED TWICE
12340: EJC
12341: *
12342: * ARITH (CONTINUED)
12343: *
12344: * ENTRY POINT
12345: *
12346: ARITH PRC N,3 ENTRY POINT
12347: MOV (XS)+,XL LOAD RIGHT OPERAND
12348: MOV (XS)+,XR LOAD LEFT OPERAND
12349: MOV (XL),WA GET RIGHT OPERAND TYPE WORD
12350: BEQ WA,=B$ICL,ARTH1 JUMP IF INTEGER
12351: BEQ WA,=B$RCL,ARTH4 JUMP IF REAL
12352: MOV XR,-(XS) ELSE REPLACE LEFT ARG ON STACK
12353: MOV XL,XR COPY LEFT ARG POINTER
12354: JSR GTNUM CONVERT TO NUMERIC
12355: PPM ARTH6 JUMP IF UNCONVERTIBLE
12356: MOV XR,XL ELSE COPY CONVERTED RESULT
12357: MOV (XL),WA GET RIGHT OPERAND TYPE WORD
12358: MOV (XS)+,XR RELOAD LEFT ARGUMENT
12359: BEQ WA,=B$RCL,ARTH4 JUMP IF RIGHT ARG IS REAL
12360: *
12361: * HERE IF RIGHT ARG IS AN INTEGER
12362: *
12363: ARTH1 BNE (XR),=B$ICL,ARTH3 JUMP IF LEFT ARG NOT INTEGER
12364: *
12365: * EXIT FOR INTEGER CASE
12366: *
12367: ARTH2 LDI ICVAL(XR) LOAD LEFT OPERAND VALUE
12368: EXI RETURN TO ARITH CALLER
12369: *
12370: * HERE FOR RIGHT OPERAND INTEGER, LEFT OPERAND NOT
12371: *
12372: ARTH3 JSR GTNUM CONVERT LEFT ARG TO NUMERIC
12373: PPM ARTH7 JUMP IF NOT CONVERTIBLE
12374: BEQ WA,=B$ICL,ARTH2 JUMP BACK IF INTEGER-INTEGER
12375: *
12376: * HERE WE MUST CONVERT REAL-INTEGER TO REAL-REAL
12377: *
12378: MOV XR,-(XS) PUT LEFT ARG BACK ON STACK
12379: LDI ICVAL(XL) LOAD RIGHT ARGUMENT VALUE
12380: ITR CONVERT TO REAL
12381: JSR RCBLD GET REAL BLOCK FOR RIGHT ARG, MERGE
12382: MOV XR,XL COPY RIGHT ARG PTR
12383: MOV (XS)+,XR LOAD LEFT ARGUMENT
12384: BRN ARTH5 MERGE FOR REAL-REAL CASE
12385: EJC
12386: *
12387: * ARITH (CONTINUED)
12388: *
12389: * HERE IF RIGHT ARGUMENT IS REAL
12390: *
12391: ARTH4 BEQ (XR),=B$RCL,ARTH5 JUMP IF LEFT ARG REAL
12392: JSR GTREA ELSE CONVERT TO REAL
12393: PPM ARTH7 ERROR IF UNCONVERTIBLE
12394: *
12395: * HERE FOR REAL-REAL
12396: *
12397: ARTH5 LDR RCVAL(XR) LOAD LEFT OPERAND VALUE
12398: EXI 3 TAKE REAL-REAL EXIT
12399: *
12400: * HERE FOR ERROR CONVERTING RIGHT ARGUMENT
12401: *
12402: ARTH6 ICA XS POP UNWANTED LEFT ARG
12403: EXI 2 TAKE APPROPRIATE ERROR EXIT
12404: *
12405: * HERE FOR ERROR CONVERTING LEFT OPERAND
12406: *
12407: ARTH7 EXI 1 TAKE APPROPRIATE ERROR RETURN
12408: ENP END PROCEDURE ARITH
12409: EJC
12410: *
12411: * ASIGN -- PERFORM ASSIGNMENT
12412: *
12413: * ASIGN PERFORMS THE ASSIGNMENT OF A VALUE TO A VARIABLE
12414: * WITH APPROPRIATE CHECKS FOR OUTPUT ASSOCIATIONS AND
12415: * VALUE TRACE ASSOCIATIONS WHICH ARE EXECUTED AS REQUIRED.
12416: * ASIGN ALSO HANDLES THE SPECIAL CASES OF ASSIGNMENT TO
12417: * PATTERN AND EXPRESSION VARIABLES.
12418: *
12419: * (WB) VALUE TO BE ASSIGNED
12420: * (XL) BASE POINTER FOR VARIABLE
12421: * (WA) OFFSET FOR VARIABLE
12422: * JSR ASIGN CALL TO ASSIGN VALUE TO VARIABLE
12423: * PPM LOC TRANSFER LOC FOR FAILURE
12424: * (XR,XL,WA,WB,WC) DESTROYED
12425: * (RA) DESTROYED
12426: *
12427: * FAILURE OCCURS IF THE EVALUATION OF AN EXPRESSION
12428: * ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS.
12429: *
12430: ASIGN PRC R,1 ENTRY POINT (RECURSIVE)
12431: *
12432: * MERGE BACK HERE TO ASSIGN RESULT TO EXPRESSION VARIABLE.
12433: *
12434: ASG01 ADD WA,XL POINT TO VARIABLE VALUE
12435: MOV (XL),XR LOAD VARIABLE VALUE
12436: BEQ (XR),=B$TRT,ASG02 JUMP IF TRAPPED
12437: MOV WB,(XL) ELSE PERFORM ASSIGNMENT
12438: ZER XL CLEAR GARBAGE VALUE IN XL
12439: EXI AND RETURN TO ASIGN CALLER
12440: *
12441: * HERE IF VALUE IS TRAPPED
12442: *
12443: ASG02 SUB WA,XL RESTORE NAME BASE
12444: BEQ XR,=TRBKV,ASG14 JUMP IF KEYWORD VARIABLE
12445: BNE XR,=TRBEV,ASG04 JUMP IF NOT EXPRESSION VARIABLE
12446: *
12447: * HERE FOR ASSIGNMENT TO EXPRESSION VARIABLE
12448: *
12449: MOV EVEXP(XL),XR POINT TO EXPRESSION
12450: MOV WB,-(XS) STORE VALUE TO ASSIGN ON STACK
12451: MOV =NUM01,WB SET FOR EVALUATION BY NAME
12452: JSR EVALX EVALUATE EXPRESSION BY NAME
12453: PPM ASG03 JUMP IF EVALUATION FAILS
12454: MOV (XS)+,WB ELSE RELOAD VALUE TO ASSIGN
12455: BRN ASG01 LOOP BACK TO PERFORM ASSIGNMENT
12456: EJC
12457: *
12458: * ASIGN (CONTINUED)
12459: *
12460: * HERE FOR FAILURE DURING EXPRESSION EVALUATION
12461: *
12462: ASG03 ICA XS REMOVE STACKED VALUE ENTRY
12463: EXI 1 TAKE FAILURE EXIT
12464: *
12465: * HERE IF NOT KEYWORD OR EXPRESSION VARIABLE
12466: *
12467: ASG04 MOV XR,-(XS) SAVE PTR TO FIRST TRBLK
12468: *
12469: * LOOP TO CHASE DOWN TRBLK CHAIN AND ASSIGN VALUE AT END
12470: *
12471: ASG05 MOV XR,WC SAVE PTR TO THIS TRBLK
12472: MOV TRNXT(XR),XR POINT TO NEXT TRBLK
12473: BEQ (XR),=B$TRT,ASG05 LOOP BACK IF ANOTHER TRBLK
12474: MOV WC,XR ELSE POINT BACK TO LAST TRBLK
12475: MOV WB,TRVAL(XR) STORE VALUE AT END OF CHAIN
12476: MOV (XS)+,XR RESTORE PTR TO FIRST TRBLK
12477: *
12478: * LOOP TO PROCESS TRBLK ENTRIES ON CHAIN
12479: *
12480: ASG06 MOV TRTYP(XR),WB LOAD TYPE CODE OF TRBLK
12481: BEQ WB,=TRTVL,ASG08 JUMP IF VALUE TRACE
12482: BEQ WB,=TRTOU,ASG10 JUMP IF OUTPUT ASSOCIATION
12483: *
12484: * HERE TO MOVE TO NEXT TRBLK ON CHAIN
12485: *
12486: ASG07 MOV TRNXT(XR),XR POINT TO NEXT TRBLK ON CHAIN
12487: BEQ (XR),=B$TRT,ASG06 LOOP BACK IF ANOTHER TRBLK
12488: EXI ELSE END OF CHAIN, RETURN TO CALLER
12489: *
12490: * HERE TO PROCESS VALUE TRACE
12491: *
12492: ASG08 BZE KVTRA,ASG07 IGNORE VALUE TRACE IF TRACE OFF
12493: DCV KVTRA ELSE DECREMENT TRACE COUNT
12494: BZE TRFNC(XR),ASG09 JUMP IF PRINT TRACE
12495: JSR TRXEQ ELSE EXECUTE FUNCTION TRACE
12496: BRN ASG07 AND LOOP BACK
12497: EJC
12498: *
12499: * ASIGN (CONTINUED)
12500: *
12501: * HERE FOR PRINT TRACE
12502: *
12503: ASG09 JSR PRTSN PRINT STATEMENT NUMBER
12504: JSR PRTNV PRINT NAME = VALUE
12505: BRN ASG07 LOOP BACK FOR NEXT TRBLK
12506: *
12507: * HERE FOR OUTPUT ASSOCIATION
12508: *
12509: ASG10 BZE KVOUP,ASG07 IGNORE OUTPUT ASSOC IF OUTPUT OFF
12510: MOV XR,XL ELSE COPY TRBLK POINTER
12511: MOV TRVAL(WC),-(XS) STACK VALUE TO OUTPUT (SGD01)
12512: JSR GTSTG CONVERT TO STRING
12513: PPM ASG12 GET DATATYPE NAME IF UNCONVERTIBLE
12514: *
12515: * MERGE WITH STRING FOR OUTPUT
12516: *
12517: ASG11 MOV TRFPT(XL),WA FCBLK PTR
12518: BZE WA,ASG13 JUMP IF STANDARD OUTPUT FILE
12519: *
12520: * HERE FOR OUTPUT TO NON-STANDARD OUTPUT FILE
12521: *
12522: JSR SYSOU CALL SYSTEM OUTPUT ROUTINE
12523: ERR 206,OUTPUT CAUSED FILE OVERFLOW
12524: ERR 207,OUTPUT CAUSED NON-RECOVERABLE ERROR
12525: EXI ELSE ALL DONE, RETURN TO CALLER
12526: *
12527: * IF NOT PRINTABLE, GET DATATYPE NAME INSTEAD
12528: *
12529: ASG12 JSR DTYPE CALL DATATYPE ROUTINE
12530: BRN ASG11 MERGE
12531: *
12532: * HERE TO PRINT A STRING ON THE PRINTER
12533: *
12534: ASG13 JSR PRTST PRINT STRING VALUE
12535: BEQ TRTER(XL),=V$TER,ASG20 JUMP IF TERMINAL OUTPUT
12536: JSR PRTNL END OF LINE
12537: EXI RETURN TO CALLER
12538: EJC
12539: *
12540: * ASIGN (CONTINUED)
12541: *
12542: * HERE FOR KEYWORD ASSIGNMENT
12543: *
12544: ASG14 MOV KVNUM(XL),XL LOAD KEYWORD NUMBER
12545: BEQ XL,=K$ETX,ASG19 JUMP IF ERRTEXT
12546: MOV WB,XR COPY VALUE TO BE ASSIGNED
12547: JSR GTINT CONVERT TO INTEGER
12548: ERR 208,KEYWORD VALUE ASSIGNED IS NOT INTEGER
12549: LDI ICVAL(XR) ELSE LOAD VALUE
12550: BEQ XL,=K$STL,ASG16 JUMP IF SPECIAL CASE OF STLIMIT
12551: MFI WA,ASG18 ELSE GET ADDR INTEGER, TEST OVFLOW
12552: BGE WA,MXLEN,ASG18 FAIL IF TOO LARGE
12553: BEQ XL,=K$ERT,ASG17 JUMP IF SPECIAL CASE OF ERRTYPE
12554: BEQ XL,=K$PFL,ASG21 JUMP IF SPECIAL CASE OF PROFILE
12555: BLT XL,=K$P$$,ASG15 JUMP UNLESS PROTECTED
12556: ERB 209,KEYWORD IN ASSIGNMENT IS PROTECTED
12557: *
12558: * HERE TO DO ASSIGNMENT IF NOT PROTECTED
12559: *
12560: ASG15 MOV WA,KVABE(XL) STORE NEW VALUE
12561: EXI RETURN TO ASIGN CALLER
12562: *
12563: * HERE FOR SPECIAL CASE OF STLIMIT
12564: *
12565: * SINCE STCOUNT IS MAINTAINED AS (STLIMIT-STCOUNT)
12566: * IT IS ALSO NECESSARY TO MODIFY STCOUNT APPROPRIATELY.
12567: *
12568: ASG16 SBI KVSTL SUBTRACT OLD LIMIT
12569: ADI KVSTC ADD OLD COUNTER
12570: STI KVSTC STORE NEW COUNTER VALUE
12571: LDI ICVAL(XR) RELOAD NEW LIMIT VALUE
12572: STI KVSTL STORE NEW LIMIT VALUE
12573: EXI RETURN TO ASIGN CALLER
12574: *
12575: * HERE FOR SPECIAL CASE OF ERRTYPE
12576: *
12577: ASG17 BLE WA,=NINI9,ERROR OK TO SIGNAL IF IN RANGE
12578: *
12579: * HERE IF VALUE ASSIGNED IS OUT OF RANGE
12580: *
12581: ASG18 ERB 210,KEYWORD VALUE ASSIGNED IS NEGATIVE OR TOO LARGE
12582: *
12583: * HERE FOR SPECIAL CASE OF ERRTEXT
12584: *
12585: ASG19 MOV WB,-(XS) STACK VALUE
12586: JSR GTSTG CONVERT TO STRING
12587: ERR 211,VALUE ASSIGNED TO KEYWORD ERRTEXT NOT A STRING
12588: MOV XR,R$ETX MAKE ASSIGNMENT
12589: EXI RETURN TO CALLER
12590: *
12591: * PRINT STRING TO TERMINAL
12592: *
12593: ASG20 JSR PRTTR PRINT
12594: EXI RETURN
12595: *
12596: * HERE FOR KEYWORD PROFILE
12597: *
12598: ASG21 BGT WA,=NUM02,ASG18 MOAN IF NOT 0,1, OR 2
12599: BZE WA,ASG15 JUST ASSIGN IF ZERO
12600: BZE PFDMP,ASG22 BRANCH IF FIRST ASSIGNMENT
12601: BEQ WA,PFDMP,ASG23 ALSO IF SAME VALUE AS BEFORE
12602: ERB 268,INCONSISTENT VALUE ASSIGNED TO KEYWORD PROFILE
12603: *
12604: ASG22 MOV WA,PFDMP NOTE VALUE ON FIRST ASSIGNMENT
12605: ASG23 JSR SYSTM GET THE TIME
12606: STI PFSTM FUDGE SOME KIND OF START TIME
12607: BRN ASG15 AND GO ASSIGN
12608: ENP END PROCEDURE ASIGN
12609: EJC
12610: *
12611: * ASINP -- ASSIGN DURING PATTERN MATCH
12612: *
12613: * ASINP IS LIKE ASIGN AND HAS A SIMILAR CALLING SEQUENCE
12614: * AND EFFECT. THE DIFFERENCE IS THAT THE GLOBAL PATTERN
12615: * VARIABLES ARE SAVED AND RESTORED IF REQUIRED.
12616: *
12617: * (XL) BASE POINTER FOR VARIABLE
12618: * (WA) OFFSET FOR VARIABLE
12619: * (WB) VALUE TO BE ASSIGNED
12620: * JSR ASINP CALL TO ASSIGN VALUE TO VARIABLE
12621: * PPM LOC TRANSFER LOC IF FAILURE
12622: * (XR,XL) DESTROYED
12623: * (WA,WB,WC,RA) DESTROYED
12624: *
12625: ASINP PRC R,1 ENTRY POINT, RECURSIVE
12626: ADD WA,XL POINT TO VARIABLE
12627: MOV (XL),XR LOAD CURRENT CONTENTS
12628: BEQ (XR),=B$TRT,ASNP1 JUMP IF TRAPPED
12629: MOV WB,(XL) ELSE PERFORM ASSIGNMENT
12630: ZER XL CLEAR GARBAGE VALUE IN XL
12631: EXI RETURN TO ASINP CALLER
12632: *
12633: * HERE IF VARIABLE IS TRAPPED
12634: *
12635: ASNP1 SUB WA,XL RESTORE BASE POINTER
12636: MOV PMSSL,-(XS) STACK SUBJECT STRING LENGTH
12637: MOV PMHBS,-(XS) STACK HISTORY STACK BASE PTR
12638: MOV R$PMS,-(XS) STACK SUBJECT STRING POINTER
12639: MOV PMDFL,-(XS) STACK DOT FLAG
12640: JSR ASIGN CALL FULL-BLOWN ASSIGNMENT ROUTINE
12641: PPM ASNP2 JUMP IF FAILURE
12642: MOV (XS)+,PMDFL RESTORE DOT FLAG
12643: MOV (XS)+,R$PMS RESTORE SUBJECT STRING POINTER
12644: MOV (XS)+,PMHBS RESTORE HISTORY STACK BASE POINTER
12645: MOV (XS)+,PMSSL RESTORE SUBJECT STRING LENGTH
12646: EXI RETURN TO ASINP CALLER
12647: *
12648: * HERE IF FAILURE IN ASIGN CALL
12649: *
12650: ASNP2 MOV (XS)+,PMDFL RESTORE DOT FLAG
12651: MOV (XS)+,R$PMS RESTORE SUBJECT STRING POINTER
12652: MOV (XS)+,PMHBS RESTORE HISTORY STACK BASE POINTER
12653: MOV (XS)+,PMSSL RESTORE SUBJECT STRING LENGTH
12654: EXI 1 TAKE FAILURE EXIT
12655: ENP END PROCEDURE ASINP
12656: EJC
12657: *
12658: * BLKLN -- DETERMINE LENGTH OF BLOCK
12659: *
12660: * BLKLN DETERMINES THE LENGTH OF A BLOCK IN DYNAMIC STORE.
12661: *
12662: * (WA) FIRST WORD OF BLOCK
12663: * (XR) POINTER TO BLOCK
12664: * JSR BLKLN CALL TO GET BLOCK LENGTH
12665: * (WA) LENGTH OF BLOCK IN BYTES
12666: * (XL) DESTROYED
12667: *
12668: * BLKLN IS USED BY THE GARBAGE COLLECTOR AND IS NOT
12669: * PERMITTED TO CALL GBCOL DIRECTLY OR INDIRECTLY.
12670: *
12671: * THE FIRST WORD STORED IN THE BLOCK (I.E. AT XR) MAY
12672: * BE ANYTHING, BUT THE CONTENTS OF WA MUST BE CORRECT.
12673: *
12674: BLKLN PRC E,0 ENTRY POINT
12675: MOV WA,XL COPY FIRST WORD
12676: LEI XL GET ENTRY ID (BL$XX)
12677: BSW XL,BL$$$,BLN00 SWITCH ON BLOCK TYPE
12678: IFF BL$AR,BLN01 ARBLK
12679: IFF BL$BC,BLN04 BCBLK
12680: IFF BL$BF,BLN11 BFBLK
12681: IFF BL$CD,BLN01 CDBLK
12682: IFF BL$DF,BLN01 DFBLK
12683: IFF BL$EF,BLN01 EFBLK
12684: IFF BL$EX,BLN01 EXBLK
12685: IFF BL$PF,BLN01 PFBLK
12686: IFF BL$TB,BLN01 TBBLK
12687: IFF BL$VC,BLN01 VCBLK
12688: IFF BL$EV,BLN03 EVBLK
12689: IFF BL$KV,BLN03 KVBLK
12690: IFF BL$P0,BLN02 P0BLK
12691: IFF BL$SE,BLN02 SEBLK
12692: IFF BL$NM,BLN03 NMBLK
12693: IFF BL$P1,BLN03 P1BLK
12694: IFF BL$P2,BLN04 P2BLK
12695: IFF BL$TE,BLN04 TEBLK
12696: IFF BL$FF,BLN05 FFBLK
12697: IFF BL$TR,BLN05 TRBLK
12698: IFF BL$CT,BLN06 CTBLK
12699: IFF BL$IC,BLN07 ICBLK
12700: IFF BL$PD,BLN08 PDBLK
12701: IFF BL$RC,BLN09 RCBLK
12702: IFF BL$SC,BLN10 SCBLK
12703: ESW END OF JUMP TABLE ON BLOCK TYPE
12704: EJC
12705: *
12706: * BLKLN (CONTINUED)
12707: *
12708: * HERE FOR BLOCKS WITH LENGTH IN SECOND WORD
12709: *
12710: BLN00 MOV 1(XR),WA LOAD LENGTH
12711: EXI RETURN TO BLKLN CALLER
12712: *
12713: * HERE FOR LENGTH IN THIRD WORD (AR,CD,DF,EF,EX,PF,TB,VC)
12714: *
12715: BLN01 MOV 2(XR),WA LOAD LENGTH FROM THIRD WORD
12716: EXI RETURN TO BLKLN CALLER
12717: *
12718: * HERE FOR TWO WORD BLOCKS (P0,SE)
12719: *
12720: BLN02 MOV *NUM02,WA LOAD LENGTH (TWO WORDS)
12721: EXI RETURN TO BLKLN CALLER
12722: *
12723: * HERE FOR THREE WORD BLOCKS (NM,P1,EV,KV)
12724: *
12725: BLN03 MOV *NUM03,WA LOAD LENGTH (THREE WORDS)
12726: EXI RETURN TO BLKLN CALLER
12727: *
12728: * HERE FOR FOUR WORD BLOCKS (P2,TE,BC)
12729: *
12730: BLN04 MOV *NUM04,WA LOAD LENGTH (FOUR WORDS)
12731: EXI RETURN TO BLKLN CALLER
12732: *
12733: * HERE FOR FIVE WORD BLOCKS (FF,TR)
12734: *
12735: BLN05 MOV *NUM05,WA LOAD LENGTH
12736: EXI RETURN TO BLKLN CALLER
12737: EJC
12738: *
12739: * BLKLN (CONTINUED)
12740: *
12741: * HERE FOR CTBLK
12742: *
12743: BLN06 MOV *CTSI$,WA SET SIZE OF CTBLK
12744: EXI RETURN TO BLKLN CALLER
12745: *
12746: * HERE FOR ICBLK
12747: *
12748: BLN07 MOV *ICSI$,WA SET SIZE OF ICBLK
12749: EXI RETURN TO BLKLN CALLER
12750: *
12751: * HERE FOR PDBLK
12752: *
12753: BLN08 MOV PDDFP(XR),XL POINT TO DFBLK
12754: MOV DFPDL(XL),WA LOAD PDBLK LENGTH FROM DFBLK
12755: EXI RETURN TO BLKLN CALLER
12756: *
12757: * HERE FOR RCBLK
12758: *
12759: BLN09 MOV *RCSI$,WA SET SIZE OF RCBLK
12760: EXI RETURN TO BLKLN CALLER
12761: *
12762: * HERE FOR SCBLK
12763: *
12764: BLN10 MOV SCLEN(XR),WA LOAD LENGTH IN CHARACTERS
12765: CTB WA,SCSI$ CALCULATE LENGTH IN BYTES
12766: EXI RETURN TO BLKLN CALLER
12767: *
12768: * HERE FOR BFBLK
12769: *
12770: BLN11 MOV BFALC(XR),WA GET ALLOCATION IN BYTES
12771: CTB WA,BFSI$ CALCULATE LENGTH IN BYTES
12772: EXI RETURN TO BLKLN CALLER
12773: ENP END PROCEDURE BLKLN
12774: EJC
12775: *
12776: * COPYB -- COPY A BLOCK
12777: *
12778: * (XS) BLOCK TO BE COPIED
12779: * JSR COPYB CALL TO COPY BLOCK
12780: * PPM LOC RETURN IF BLOCK HAS NO IDVAL FIELD
12781: * NORMAL RETURN IF IDVAL FIELD
12782: * (XR) COPY OF BLOCK
12783: * (XS) POPPED
12784: * (XL,WA,WB,WC) DESTROYED
12785: *
12786: COPYB PRC N,1 ENTRY POINT
12787: MOV (XS),XR LOAD ARGUMENT
12788: BEQ XR,=NULLS,COP10 RETURN ARGUMENT IF IT IS NULL
12789: MOV (XR),WA ELSE LOAD TYPE WORD
12790: MOV WA,WB COPY TYPE WORD
12791: JSR BLKLN GET LENGTH OF ARGUMENT BLOCK
12792: MOV XR,XL COPY POINTER
12793: JSR ALLOC ALLOCATE BLOCK OF SAME SIZE
12794: MOV XR,(XS) STORE POINTER TO COPY
12795: MVW COPY CONTENTS OF OLD BLOCK TO NEW
12796: MOV (XS),XR RELOAD POINTER TO START OF COPY
12797: BEQ WB,=B$TBT,COP05 JUMP IF TABLE
12798: BEQ WB,=B$VCT,COP01 JUMP IF VECTOR
12799: BEQ WB,=B$PDT,COP01 JUMP IF PROGRAM DEFINED
12800: BEQ WB,=B$BCT,COP11 JUMP IF BUFFER
12801: BNE WB,=B$ART,COP10 RETURN COPY IF NOT ARRAY
12802: *
12803: * HERE FOR ARRAY (ARBLK)
12804: *
12805: ADD AROFS(XR),XR POINT TO PROTOTYPE FIELD
12806: BRN COP02 JUMP TO MERGE
12807: *
12808: * HERE FOR VECTOR, PROGRAM DEFINED
12809: *
12810: COP01 ADD *PDFLD,XR POINT TO PDFLD = VCVLS
12811: *
12812: * MERGE HERE FOR ARBLK, VCBLK, PDBLK TO DELETE TRAP
12813: * BLOCKS FROM ALL VALUE FIELDS (THE COPY IS UNTRAPPED)
12814: *
12815: COP02 MOV (XR),XL LOAD NEXT POINTER
12816: *
12817: * LOOP TO GET VALUE AT END OF TRBLK CHAIN
12818: *
12819: COP03 BNE (XL),=B$TRT,COP04 JUMP IF NOT TRAPPED
12820: MOV TRVAL(XL),XL ELSE POINT TO NEXT VALUE
12821: BRN COP03 AND LOOP BACK
12822: EJC
12823: *
12824: * COPYB (CONTINUED)
12825: *
12826: * HERE WITH UNTRAPPED VALUE IN XL
12827: *
12828: COP04 MOV XL,(XR)+ STORE REAL VALUE, BUMP POINTER
12829: BNE XR,DNAMP,COP02 LOOP BACK IF MORE TO GO
12830: BRN COP09 ELSE JUMP TO EXIT
12831: *
12832: * HERE TO COPY A TABLE
12833: *
12834: COP05 ZER IDVAL(XR) ZERO ID TO STOP DUMP BLOWING UP
12835: MOV *TESI$,WA SET SIZE OF TEBLK
12836: MOV *TBBUK,WC SET INITIAL OFFSET
12837: *
12838: * LOOP THROUGH BUCKETS IN TABLE
12839: *
12840: COP06 MOV (XS),XR LOAD TABLE POINTER
12841: BEQ WC,TBLEN(XR),COP09 JUMP TO EXIT IF ALL DONE
12842: ADD WC,XR ELSE POINT TO NEXT BUCKET HEADER
12843: ICA WC BUMP OFFSET
12844: SUB *TENXT,XR SUBTRACT LINK OFFSET TO MERGE
12845: *
12846: * LOOP THROUGH TEBLKS ON ONE CHAIN
12847: *
12848: COP07 MOV TENXT(XR),XL LOAD POINTER TO NEXT TEBLK
12849: MOV (XS),TENXT(XR) SET END OF CHAIN POINTER IN CASE
12850: BEQ (XL),=B$TBT,COP06 BACK FOR NEXT BUCKET IF CHAIN END
12851: MOV XR,-(XS) ELSE STACK PTR TO PREVIOUS BLOCK
12852: MOV *TESI$,WA SET SIZE OF TEBLK
12853: JSR ALLOC ALLOCATE NEW TEBLK
12854: MOV XR,WB SAVE PTR TO NEW TEBLK
12855: MVW COPY OLD TEBLK TO NEW TEBLK
12856: MOV WB,XR RESTORE POINTER TO NEW TEBLK
12857: MOV (XS)+,XL RESTORE POINTER TO PREVIOUS BLOCK
12858: MOV XR,TENXT(XL) LINK NEW BLOCK TO PREVIOUS
12859: MOV XR,XL COPY POINTER TO NEW BLOCK
12860: *
12861: * LOOP TO SET REAL VALUE AFTER REMOVING TRAP CHAIN
12862: *
12863: COP08 MOV TEVAL(XL),XL LOAD VALUE
12864: BEQ (XL),=B$TRT,COP08 LOOP BACK IF TRAPPED
12865: MOV XL,TEVAL(XR) STORE UNTRAPPED VALUE IN TEBLK
12866: BRN COP07 BACK FOR NEXT TEBLK
12867: *
12868: * COMMON EXIT POINT
12869: *
12870: COP09 MOV (XS)+,XR LOAD POINTER TO BLOCK
12871: EXI RETURN
12872: *
12873: * ALTERNATIVE RETURN
12874: *
12875: COP10 EXI 1 RETURN
12876: EJC
12877: *
12878: * HERE TO COPY BUFFER
12879: *
12880: COP11 MOV BCBUF(XR),XL GET BFBLK PTR
12881: MOV BFALC(XL),WA GET ALLOCATION
12882: CTB WA,BFSI$ SET TOTAL SIZE
12883: MOV XR,XL SAVE BCBLK PTR
12884: JSR ALLOC ALLOCATE BFBLK
12885: MOV BCBUF(XL),WB GET OLD BFBLK
12886: MOV XR,BCBUF(XL) SET POINTER TO NEW BFBLK
12887: MOV WB,XL POINT TO OLD BFBLK
12888: MVW COPY BFBLK TOO
12889: ZER XL CLEAR RUBBISH PTR
12890: BRN COP09 BRANCH TO EXIT
12891: ENP END PROCEDURE COPYB
12892: *
12893: * CDGCG -- GENERATE CODE FOR COMPLEX GOTO
12894: *
12895: * USED BY CMPIL TO PROCESS COMPLEX GOTO TREE
12896: *
12897: * (WB) MUST BE COLLECTABLE
12898: * (XR) EXPRESSION POINTER
12899: * JSR CDGCG CALL TO GENERATE COMPLEX GOTO
12900: * (XL,XR,WA) DESTROYED
12901: *
12902: CDGCG PRC E,0 ENTRY POINT
12903: MOV CMOPN(XR),XL GET UNARY GOTO OPERATOR
12904: MOV CMROP(XR),XR POINT TO GOTO OPERAND
12905: BEQ XL,=OPDVD,CDGC2 JUMP IF DIRECT GOTO
12906: JSR CDGNM GENERATE OPND BY NAME IF NOT DIRECT
12907: *
12908: * RETURN POINT
12909: *
12910: CDGC1 MOV XL,WA GOTO OPERATOR
12911: JSR CDWRD GENERATE IT
12912: EXI RETURN TO CALLER
12913: *
12914: * DIRECT GOTO
12915: *
12916: CDGC2 JSR CDGVL GENERATE OPERAND BY VALUE
12917: BRN CDGC1 MERGE TO RETURN
12918: ENP END PROCEDURE CDGCG
12919: EJC
12920: *
12921: * CDGEX -- BUILD EXPRESSION BLOCK
12922: *
12923: * CDGEX IS PASSED A POINTER TO AN EXPRESSION TREE (SEE
12924: * EXPAN) AND RETURNS AN EXPRESSION (SEBLK OR EXBLK).
12925: *
12926: * (WC) SOME COLLECTABLE VALUE
12927: * (WB) INTEGER IN RANGE 0 LE X LE MXLEN
12928: * (XL) PTR TO EXPRESSION TREE
12929: * JSR CDGEX CALL TO BUILD EXPRESSION
12930: * (XR) PTR TO SEBLK OR EXBLK
12931: * (XL,WA,WB) DESTROYED
12932: *
12933: CDGEX PRC R,0 ENTRY POINT, RECURSIVE
12934: BLO (XL),=B$VR$,CDGX1 JUMP IF NOT VARIABLE
12935: *
12936: * HERE FOR NATURAL VARIABLE, BUILD SEBLK
12937: *
12938: MOV *SESI$,WA SET SIZE OF SEBLK
12939: JSR ALLOC ALLOCATE SPACE FOR SEBLK
12940: MOV =B$SEL,(XR) SET TYPE WORD
12941: MOV XL,SEVAR(XR) STORE VRBLK POINTER
12942: EXI RETURN TO CDGEX CALLER
12943: *
12944: * HERE IF NOT VARIABLE, BUILD EXBLK
12945: *
12946: CDGX1 MOV XL,XR COPY TREE POINTER
12947: MOV WC,-(XS) SAVE WC
12948: MOV CWCOF,XL SAVE CURRENT OFFSET
12949: MOV (XR),WA GET TYPE WORD
12950: BNE WA,=B$CMT,CDGX2 CALL BY VALUE IF NOT CMBLK
12951: BGE CMTYP(XR),=C$$NM,CDGX2 JUMP IF CMBLK ONLY BY VALUE
12952: EJC
12953: *
12954: * CDGEX (CONTINUED)
12955: *
12956: * HERE IF EXPRESSION CAN BE EVALUATED BY NAME
12957: *
12958: JSR CDGNM GENERATE CODE BY NAME
12959: MOV =ORNM$,WA LOAD RETURN BY NAME WORD
12960: BRN CDGX3 MERGE WITH VALUE CASE
12961: *
12962: * HERE IF EXPRESSION CAN ONLY BE EVALUATED BY VALUE
12963: *
12964: CDGX2 JSR CDGVL GENERATE CODE BY VALUE
12965: MOV =ORVL$,WA LOAD RETURN BY VALUE WORD
12966: *
12967: * MERGE HERE TO CONSTRUCT EXBLK
12968: *
12969: CDGX3 JSR CDWRD GENERATE RETURN WORD
12970: JSR EXBLD BUILD EXBLK
12971: MOV (XS)+,WC RESTORE WC
12972: EXI RETURN TO CDGEX CALLER
12973: ENP END PROCEDURE CDGEX
12974: EJC
12975: *
12976: * CDGNM -- GENERATE CODE BY NAME
12977: *
12978: * CDGNM IS CALLED DURING THE COMPILATION PROCESS TO
12979: * GENERATE CODE BY NAME FOR AN EXPRESSION. SEE CDBLK
12980: * DESCRIPTION FOR DETAILS OF CODE GENERATED. THE INPUT
12981: * TO CDGNM IS AN EXPRESSION TREE AS GENERATED BY EXPAN.
12982: *
12983: * CDGNM IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING
12984: * RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS.
12985: *
12986: * (WB) INTEGER IN RANGE 0 LE N LE DNAMB
12987: * (XR) PTR TO TREE GENERATED BY EXPAN
12988: * (WC) CONSTANT FLAG (SEE BELOW)
12989: * JSR CDGNM CALL TO GENERATE CODE BY NAME
12990: * (XR,WA) DESTROYED
12991: * (WC) SET NON-ZERO IF NON-CONSTANT
12992: *
12993: * WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE
12994: * EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE
12995: * EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED.
12996: *
12997: * THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD).
12998: *
12999: CDGNM PRC R,0 ENTRY POINT, RECURSIVE
13000: MOV XL,-(XS) SAVE ENTRY XL
13001: MOV WB,-(XS) SAVE ENTRY WB
13002: CHK CHECK FOR STACK OVERFLOW
13003: MOV (XR),WA LOAD TYPE WORD
13004: BEQ WA,=B$CMT,CGN04 JUMP IF CMBLK
13005: BHI WA,=B$VR$,CGN02 JUMP IF SIMPLE VARIABLE
13006: *
13007: * MERGE HERE FOR OPERAND YIELDING VALUE (E.G. CONSTANT)
13008: *
13009: CGN01 ERB 212,SYNTAX ERROR. VALUE USED WHERE NAME IS REQUIRED
13010: *
13011: * HERE FOR NATURAL VARIABLE REFERENCE
13012: *
13013: CGN02 MOV =OLVN$,WA LOAD VARIABLE LOAD CALL
13014: JSR CDWRD GENERATE IT
13015: MOV XR,WA COPY VRBLK POINTER
13016: JSR CDWRD GENERATE VRBLK POINTER
13017: EJC
13018: *
13019: * CDGNM (CONTINUED)
13020: *
13021: * HERE TO EXIT WITH WC SET CORRECTLY
13022: *
13023: CGN03 MOV (XS)+,WB RESTORE ENTRY WB
13024: MOV (XS)+,XL RESTORE ENTRY XL
13025: EXI RETURN TO CDGNM CALLER
13026: *
13027: * HERE FOR CMBLK
13028: *
13029: CGN04 MOV XR,XL COPY CMBLK POINTER
13030: MOV CMTYP(XR),XR LOAD CMBLK TYPE
13031: BGE XR,=C$$NM,CGN01 ERROR IF NOT NAME OPERAND
13032: BSW XR,C$$NM ELSE SWITCH ON TYPE
13033: IFF C$ARR,CGN05 ARRAY REFERENCE
13034: IFF C$FNC,CGN08 FUNCTION CALL
13035: IFF C$DEF,CGN09 DEFERRED EXPRESSION
13036: IFF C$IND,CGN10 INDIRECT REFERENCE
13037: IFF C$KEY,CGN11 KEYWORD REFERENCE
13038: IFF C$UBO,CGN08 UNDEFINED BINARY OP
13039: IFF C$UUO,CGN08 UNDEFINED UNARY OP
13040: ESW END SWITCH ON CMBLK TYPE
13041: *
13042: * HERE TO GENERATE CODE FOR ARRAY REFERENCE
13043: *
13044: CGN05 MOV *CMOPN,WB POINT TO ARRAY OPERAND
13045: *
13046: * LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS
13047: *
13048: CGN06 JSR CMGEN GENERATE CODE FOR NEXT OPERAND
13049: MOV CMLEN(XL),WC LOAD LENGTH OF CMBLK
13050: BLT WB,WC,CGN06 LOOP TILL ALL GENERATED
13051: *
13052: * GENERATE APPROPRIATE ARRAY CALL
13053: *
13054: MOV =OAON$,WA LOAD ONE-SUBSCRIPT CASE CALL
13055: BEQ WC,*CMAR1,CGN07 JUMP TO EXIT IF ONE SUBSCRIPT CASE
13056: MOV =OAMN$,WA ELSE LOAD MULTI-SUBSCRIPT CASE CALL
13057: JSR CDWRD GENERATE CALL
13058: MOV WC,WA COPY CMBLK LENGTH
13059: BTW WA CONVERT TO WORDS
13060: SUB =CMVLS,WA CALCULATE NUMBER OF SUBSCRIPTS
13061: EJC
13062: *
13063: * CDGNM (CONTINUED)
13064: *
13065: * HERE TO EXIT GENERATING WORD (NON-CONSTANT)
13066: *
13067: CGN07 MNZ WC SET RESULT NON-CONSTANT
13068: JSR CDWRD GENERATE WORD
13069: BRN CGN03 BACK TO EXIT
13070: *
13071: * HERE TO GENERATE CODE FOR FUNCTIONS AND UNDEFINED OPRS
13072: *
13073: CGN08 MOV XL,XR COPY CMBLK POINTER
13074: JSR CDGVL GEN CODE BY VALUE FOR CALL
13075: MOV =OFNE$,WA GET EXTRA CALL FOR BY NAME
13076: BRN CGN07 BACK TO GENERATE AND EXIT
13077: *
13078: * HERE TO GENERATE CODE FOR DEFERED EXPRESSION
13079: *
13080: CGN09 MOV CMROP(XL),XR CHECK IF VARIABLE
13081: BHI (XR),=B$VR$,CGN02 TREAT *VARIABLE AS SIMPLE VAR
13082: MOV XR,XL COPY PTR TO EXPRESSION TREE
13083: JSR CDGEX ELSE BUILD EXBLK
13084: MOV =OLEX$,WA SET CALL TO LOAD EXPR BY NAME
13085: JSR CDWRD GENERATE IT
13086: MOV XR,WA COPY EXBLK POINTER
13087: JSR CDWRD GENERATE EXBLK POINTER
13088: BRN CGN03 BACK TO EXIT
13089: *
13090: * HERE TO GENERATE CODE FOR INDIRECT REFERENCE
13091: *
13092: CGN10 MOV CMROP(XL),XR GET OPERAND
13093: JSR CDGVL GENERATE CODE BY VALUE FOR IT
13094: MOV =OINN$,WA LOAD CALL FOR INDIRECT BY NAME
13095: BRN CGN12 MERGE
13096: *
13097: * HERE TO GENERATE CODE FOR KEYWORD REFERENCE
13098: *
13099: CGN11 MOV CMROP(XL),XR GET OPERAND
13100: JSR CDGNM GENERATE CODE BY NAME FOR IT
13101: MOV =OKWN$,WA LOAD CALL FOR KEYWORD BY NAME
13102: *
13103: * KEYWORD, INDIRECT MERGE HERE
13104: *
13105: CGN12 JSR CDWRD GENERATE CODE FOR OPERATOR
13106: BRN CGN03 EXIT
13107: ENP END PROCEDURE CDGNM
13108: EJC
13109: *
13110: * CDGVL -- GENERATE CODE BY VALUE
13111: *
13112: * CDGVL IS CALLED DURING THE COMPILATION PROCESS TO
13113: * GENERATE CODE BY VALUE FOR AN EXPRESSION. SEE CDBLK
13114: * DESCRIPTION FOR DETAILS OF THE CODE GENERATED. THE INPUT
13115: * TO CDGVL IS AN EXPRESSION TREE AS GENERATED BY EXPAN.
13116: *
13117: * CDGVL IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING
13118: * RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS.
13119: *
13120: * (WB) INTEGER IN RANGE 0 LE N LE DNAMB
13121: * (XR) PTR TO TREE GENERATED BY EXPAN
13122: * (WC) CONSTANT FLAG (SEE BELOW)
13123: * JSR CDGVL CALL TO GENERATE CODE BY VALUE
13124: * (XR,WA) DESTROYED
13125: * (WC) SET NON-ZERO IF NON-CONSTANT
13126: *
13127: * WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE
13128: * EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE
13129: * EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED.
13130: *
13131: * IF WC IS NON-ZERO ON ENTRY, THEN PREEVALUATION IS NOT
13132: * ALLOWED REGARDLESS OF THE NATURE OF THE OPERAND.
13133: *
13134: * THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD).
13135: *
13136: CDGVL PRC R,0 ENTRY POINT, RECURSIVE
13137: MOV (XR),WA LOAD TYPE WORD
13138: BEQ WA,=B$CMT,CGV01 JUMP IF CMBLK
13139: BLT WA,=B$VRA,CGV00 JUMP IF ICBLK, RCBLK, SCBLK
13140: BNZ VRLEN(XR),CGVL0 JUMP IF NOT SYSTEM VARIABLE
13141: MOV XR,-(XS) STACK XR
13142: MOV VRSVP(XR),XR POINT TO SVBLK
13143: MOV SVBIT(XR),WA GET SVBLK PROPERTY BITS
13144: MOV (XS)+,XR RECOVER XR
13145: ANB BTCKW,WA CHECK IF CONSTANT KEYWORD
13146: NZB WA,CGV00 JUMP IF CONSTANT KEYWORD
13147: *
13148: * HERE FOR VARIABLE VALUE REFERENCE
13149: *
13150: CGVL0 MNZ WC INDICATE NON-CONSTANT VALUE
13151: *
13152: * MERGE HERE FOR SIMPLE CONSTANT (ICBLK,RCBLK,SCBLK)
13153: * AND FOR VARIABLES CORRESPONDING TO CONSTANT KEYWORDS.
13154: *
13155: CGV00 MOV XR,WA COPY PTR TO VAR OR CONSTANT
13156: JSR CDWRD GENERATE AS CODE WORD
13157: EXI RETURN TO CALLER
13158: EJC
13159: *
13160: * CDGVL (CONTINUED)
13161: *
13162: * HERE FOR TREE NODE (CMBLK)
13163: *
13164: CGV01 MOV WB,-(XS) SAVE ENTRY WB
13165: MOV XL,-(XS) SAVE ENTRY XL
13166: MOV WC,-(XS) SAVE ENTRY CONSTANT FLAG
13167: MOV CWCOF,-(XS) SAVE INITIAL CODE OFFSET
13168: CHK CHECK FOR STACK OVERFLOW
13169: *
13170: * PREPARE TO GENERATE CODE FOR CMBLK. WC IS SET TO THE
13171: * VALUE OF CSWNO (ZERO IF -OPTIMISE, 1 IF -NOOPT) TO
13172: * START WITH AND IS RESET NON-ZERO FOR ANY NON-CONSTANT
13173: * CODE GENERATED. IF IT IS STILL ZERO AFTER GENERATING ALL
13174: * THE CMBLK CODE, THEN ITS VALUE IS COMPUTED AS THE RESULT.
13175: *
13176: MOV XR,XL COPY CMBLK POINTER
13177: MOV CMTYP(XR),XR LOAD CMBLK TYPE
13178: MOV CSWNO,WC RESET CONSTANT FLAG
13179: BLE XR,=C$PR$,CGV02 JUMP IF NOT PREDICATE VALUE
13180: MNZ WC ELSE FORCE NON-CONSTANT CASE
13181: *
13182: * HERE WITH WC SET APPROPRIATELY
13183: *
13184: CGV02 BSW XR,C$$NV SWITCH TO APPROPRIATE GENERATOR
13185: IFF C$ARR,CGV03 ARRAY REFERENCE
13186: IFF C$FNC,CGV05 FUNCTION CALL
13187: IFF C$DEF,CGV14 DEFERRED EXPRESSION
13188: IFF C$SEL,CGV15 SELECTION
13189: IFF C$IND,CGV31 INDIRECT REFERENCE
13190: IFF C$KEY,CGV27 KEYWORD REFERENCE
13191: IFF C$UBO,CGV29 UNDEFINED BINOP
13192: IFF C$UUO,CGV30 UNDEFINED UNOP
13193: IFF C$BVL,CGV18 BINOPS WITH VAL OPDS
13194: IFF C$ALT,CGV18 ALTERNATION
13195: IFF C$UVL,CGV19 UNOPS WITH VALU OPND
13196: IFF C$ASS,CGV21 ASSIGNMENT
13197: IFF C$CNC,CGV24 CONCATENATION
13198: IFF C$CNP,CGV24 CONCATENATION (NOT PATTERN MATCH)
13199: IFF C$UNM,CGV27 UNOPS WITH NAME OPND
13200: IFF C$BVN,CGV26 BINARY $ AND .
13201: IFF C$INT,CGV31 INTERROGATION
13202: IFF C$NEG,CGV28 NEGATION
13203: IFF C$PMT,CGV18 PATTERN MATCH
13204: ESW END SWITCH ON CMBLK TYPE
13205: EJC
13206: *
13207: * CDGVL (CONTINUED)
13208: *
13209: * HERE TO GENERATE CODE FOR ARRAY REFERENCE
13210: *
13211: CGV03 MOV *CMOPN,WB SET OFFSET TO ARRAY OPERAND
13212: *
13213: * LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS
13214: *
13215: CGV04 JSR CMGEN GEN VALUE CODE FOR NEXT OPERAND
13216: MOV CMLEN(XL),WC LOAD CMBLK LENGTH
13217: BLT WB,WC,CGV04 LOOP BACK IF MORE TO GO
13218: *
13219: * GENERATE CALL TO APPROPRIATE ARRAY REFERENCE ROUTINE
13220: *
13221: MOV =OAOV$,WA SET ONE SUBSCRIPT CALL IN CASE
13222: BEQ WC,*CMAR1,CGV32 JUMP TO EXIT IF 1-SUB CASE
13223: MOV =OAMV$,WA ELSE SET CALL FOR MULTI-SUBSCRIPTS
13224: JSR CDWRD GENERATE CALL
13225: MOV WC,WA COPY LENGTH OF CMBLK
13226: SUB *CMVLS,WA SUBTRACT STANDARD LENGTH
13227: BTW WA GET NUMBER OF WORDS
13228: BRN CGV32 JUMP TO GENERATE SUBSCRIPT COUNT
13229: *
13230: * HERE TO GENERATE CODE FOR FUNCTION CALL
13231: *
13232: CGV05 MOV *CMVLS,WB SET OFFSET TO FIRST ARGUMENT
13233: *
13234: * LOOP TO GENERATE CODE FOR ARGUMENTS
13235: *
13236: CGV06 BEQ WB,CMLEN(XL),CGV07 JUMP IF ALL GENERATED
13237: JSR CMGEN ELSE GEN VALUE CODE FOR NEXT ARG
13238: BRN CGV06 BACK TO GENERATE NEXT ARGUMENT
13239: *
13240: * HERE TO GENERATE ACTUAL FUNCTION CALL
13241: *
13242: CGV07 SUB *CMVLS,WB GET NUMBER OF ARG PTRS (BYTES)
13243: BTW WB CONVERT BYTES TO WORDS
13244: MOV CMOPN(XL),XR LOAD FUNCTION VRBLK POINTER
13245: BNZ VRLEN(XR),CGV12 JUMP IF NOT SYSTEM FUNCTION
13246: MOV VRSVP(XR),XL LOAD SVBLK PTR IF SYSTEM VAR
13247: MOV SVBIT(XL),WA LOAD BIT MASK
13248: ANB BTFFC,WA TEST FOR FAST FUNCTION CALL ALLOWED
13249: ZRB WA,CGV12 JUMP IF NOT
13250: EJC
13251: *
13252: * CDGVL (CONTINUED)
13253: *
13254: * HERE IF FAST FUNCTION CALL IS ALLOWED
13255: *
13256: MOV SVBIT(XL),WA RELOAD BIT INDICATORS
13257: ANB BTPRE,WA TEST FOR PREEVALUATION OK
13258: NZB WA,CGV08 JUMP IF PREEVALUATION PERMITTED
13259: MNZ WC ELSE SET RESULT NON-CONSTANT
13260: *
13261: * TEST FOR CORRECT NUMBER OF ARGS FOR FAST CALL
13262: *
13263: CGV08 MOV VRFNC(XR),XL LOAD PTR TO SVFNC FIELD
13264: MOV FARGS(XL),WA LOAD SVNAR FIELD VALUE
13265: BEQ WA,WB,CGV11 JUMP IF ARGUMENT COUNT IS CORRECT
13266: BHI WA,WB,CGV09 JUMP IF TOO FEW ARGUMENTS GIVEN
13267: *
13268: * HERE IF TOO MANY ARGUMENTS, PREPARE TO GENERATE O$POPS
13269: *
13270: SUB WA,WB GET NUMBER OF EXTRA ARGS
13271: LCT WB,WB SET AS COUNT TO CONTROL LOOP
13272: MOV =OPOP$,WA SET POP CALL
13273: BRN CGV10 JUMP TO COMMON LOOP
13274: *
13275: * HERE IF TOO FEW ARGUMENTS, PREPARE TO GENERATE NULLS
13276: *
13277: CGV09 SUB WB,WA GET NUMBER OF MISSING ARGUMENTS
13278: LCT WB,WA LOAD AS COUNT TO CONTROL LOOP
13279: MOV =NULLS,WA LOAD PTR TO NULL CONSTANT
13280: *
13281: * LOOP TO GENERATE CALLS TO FIX ARGUMENT COUNT
13282: *
13283: CGV10 JSR CDWRD GENERATE ONE CALL
13284: BCT WB,CGV10 LOOP TILL ALL GENERATED
13285: *
13286: * HERE AFTER ADJUSTING ARG COUNT AS REQUIRED
13287: *
13288: CGV11 MOV XL,WA COPY POINTER TO SVFNC FIELD
13289: BRN CGV36 JUMP TO GENERATE CALL
13290: EJC
13291: *
13292: * CDGVL (CONTINUED)
13293: *
13294: * COME HERE IF FAST CALL IS NOT PERMITTED
13295: *
13296: CGV12 MOV =OFNS$,WA SET ONE ARG CALL IN CASE
13297: BEQ WB,=NUM01,CGV13 JUMP IF ONE ARG CASE
13298: MOV =OFNC$,WA ELSE LOAD CALL FOR MORE THAN 1 ARG
13299: JSR CDWRD GENERATE IT
13300: MOV WB,WA COPY ARGUMENT COUNT
13301: *
13302: * ONE ARG CASE MERGES HERE
13303: *
13304: CGV13 JSR CDWRD GENERATE =O$FNS OR ARG COUNT
13305: MOV XR,WA COPY VRBLK POINTER
13306: BRN CGV32 JUMP TO GENERATE VRBLK PTR
13307: *
13308: * HERE FOR DEFERRED EXPRESSION
13309: *
13310: CGV14 MOV CMROP(XL),XL POINT TO EXPRESSION TREE
13311: JSR CDGEX BUILD EXBLK OR SEBLK
13312: MOV XR,WA COPY BLOCK PTR
13313: JSR CDWRD GENERATE PTR TO EXBLK OR SEBLK
13314: BRN CGV34 JUMP TO EXIT, CONSTANT TEST
13315: *
13316: * HERE TO GENERATE CODE FOR SELECTION
13317: *
13318: CGV15 ZER -(XS) ZERO PTR TO CHAIN OF FORWARD JUMPS
13319: ZER -(XS) ZERO PTR TO PREV O$SLC FORWARD PTR
13320: MOV *CMVLS,WB POINT TO FIRST ALTERNATIVE
13321: MOV =OSLA$,WA SET INITIAL CODE WORD
13322: *
13323: * 0(XS) IS THE OFFSET TO THE PREVIOUS WORD
13324: * WHICH REQUIRES FILLING IN WITH AN
13325: * OFFSET TO THE FOLLOWING O$SLC,O$SLD
13326: *
13327: * 1(XS) IS THE HEAD OF A CHAIN OF OFFSET
13328: * POINTERS INDICATING THOSE LOCATIONS
13329: * TO BE FILLED WITH OFFSETS PAST
13330: * THE END OF ALL THE ALTERNATIVES
13331: *
13332: CGV16 JSR CDWRD GENERATE O$SLC (O$SLA FIRST TIME)
13333: MOV CWCOF,(XS) SET CURRENT LOC AS PTR TO FILL IN
13334: JSR CDWRD GENERATE GARBAGE WORD THERE FOR NOW
13335: JSR CMGEN GEN VALUE CODE FOR ALTERNATIVE
13336: MOV =OSLB$,WA LOAD O$SLB POINTER
13337: JSR CDWRD GENERATE O$SLB CALL
13338: MOV 1(XS),WA LOAD OLD CHAIN PTR
13339: MOV CWCOF,1(XS) SET CURRENT LOC AS NEW CHAIN HEAD
13340: JSR CDWRD GENERATE FORWARD CHAIN LINK
13341: EJC
13342: *
13343: * CDGVL (CONTINUED)
13344: *
13345: * NOW TO FILL IN THE SKIP OFFSET TO O$SLC,O$SLD
13346: *
13347: MOV (XS),XR LOAD OFFSET TO WORD TO PLUG
13348: ADD R$CCB,XR POINT TO ACTUAL LOCATION TO PLUG
13349: MOV CWCOF,(XR) PLUG PROPER OFFSET IN
13350: MOV =OSLC$,WA LOAD O$SLC PTR FOR NEXT ALTERNATIVE
13351: MOV WB,XR COPY OFFSET (DESTROY GARBAGE XR)
13352: ICA XR BUMP EXTRA TIME FOR TEST
13353: BLT XR,CMLEN(XL),CGV16 LOOP BACK IF NOT LAST ALTERNATIVE
13354: *
13355: * HERE TO GENERATE CODE FOR LAST ALTERNATIVE
13356: *
13357: MOV =OSLD$,WA GET HEADER CALL
13358: JSR CDWRD GENERATE O$SLD CALL
13359: JSR CMGEN GENERATE CODE FOR LAST ALTERNATIVE
13360: ICA XS POP OFFSET PTR
13361: MOV (XS)+,XR LOAD CHAIN PTR
13362: *
13363: * LOOP TO PLUG OFFSETS PAST STRUCTURE
13364: *
13365: CGV17 ADD R$CCB,XR MAKE NEXT PTR ABSOLUTE
13366: MOV (XR),WA LOAD FORWARD PTR
13367: MOV CWCOF,(XR) PLUG REQUIRED OFFSET
13368: MOV WA,XR COPY FORWARD PTR
13369: BNZ WA,CGV17 LOOP BACK IF MORE TO GO
13370: BRN CGV33 ELSE JUMP TO EXIT (NOT CONSTANT)
13371: *
13372: * HERE FOR BINARY OPS WITH VALUE OPERANDS
13373: *
13374: CGV18 MOV CMLOP(XL),XR LOAD LEFT OPERAND POINTER
13375: JSR CDGVL GEN VALUE CODE FOR LEFT OPERAND
13376: *
13377: * HERE FOR UNARY OPS WITH VALUE OPERAND (BINOPS MERGE)
13378: *
13379: CGV19 MOV CMROP(XL),XR LOAD RIGHT (ONLY) OPERAND PTR
13380: JSR CDGVL GEN CODE BY VALUE
13381: EJC
13382: *
13383: * CDGVL (CONTINUED)
13384: *
13385: * MERGE HERE TO GENERATE OPERATOR CALL FROM CMOPN FIELD
13386: *
13387: CGV20 MOV CMOPN(XL),WA LOAD OPERATOR CALL POINTER
13388: BRN CGV36 JUMP TO GENERATE IT WITH CONS TEST
13389: *
13390: * HERE FOR ASSIGNMENT
13391: *
13392: CGV21 MOV CMLOP(XL),XR LOAD LEFT OPERAND POINTER
13393: BLO (XR),=B$VR$,CGV22 JUMP IF NOT VARIABLE
13394: *
13395: * HERE FOR ASSIGNMENT TO SIMPLE VARIABLE
13396: *
13397: MOV CMROP(XL),XR LOAD RIGHT OPERAND PTR
13398: JSR CDGVL GENERATE CODE BY VALUE
13399: MOV CMLOP(XL),WA RELOAD LEFT OPERAND VRBLK PTR
13400: ADD *VRSTO,WA POINT TO VRSTO FIELD
13401: BRN CGV32 JUMP TO GENERATE STORE PTR
13402: *
13403: * HERE IF NOT SIMPLE VARIABLE ASSIGNMENT
13404: *
13405: CGV22 JSR EXPAP TEST FOR PATTERN MATCH ON LEFT SIDE
13406: PPM CGV23 JUMP IF NOT PATTERN MATCH
13407: *
13408: * HERE FOR PATTERN REPLACEMENT
13409: *
13410: MOV CMROP(XR),CMLOP(XL) SAVE PATTERN PTR IN SAFE PLACE
13411: MOV CMLOP(XR),XR LOAD SUBJECT PTR
13412: JSR CDGNM GEN CODE BY NAME FOR SUBJECT
13413: MOV CMLOP(XL),XR LOAD PATTERN PTR
13414: JSR CDGVL GEN CODE BY VALUE FOR PATTERN
13415: MOV =OPMN$,WA LOAD MATCH BY NAME CALL
13416: JSR CDWRD GENERATE IT
13417: MOV CMROP(XL),XR LOAD REPLACEMENT VALUE PTR
13418: JSR CDGVL GEN CODE BY VALUE
13419: MOV =ORPL$,WA LOAD REPLACE CALL
13420: BRN CGV32 JUMP TO GEN AND EXIT (NOT CONSTANT)
13421: *
13422: * HERE FOR ASSIGNMENT TO COMPLEX VARIABLE
13423: *
13424: CGV23 MNZ WC INHIBIT PRE-EVALUATION
13425: JSR CDGNM GEN CODE BY NAME FOR LEFT SIDE
13426: BRN CGV31 MERGE WITH UNOP CIRCUIT
13427: EJC
13428: *
13429: * CDGVL (CONTINUED)
13430: *
13431: * HERE FOR CONCATENATION
13432: *
13433: CGV24 MOV CMLOP(XL),XR LOAD LEFT OPERAND PTR
13434: BNE (XR),=B$CMT,CGV18 ORDINARY BINOP IF NOT CMBLK
13435: MOV CMTYP(XR),WB LOAD CMBLK TYPE CODE
13436: BEQ WB,=C$INT,CGV25 SPECIAL CASE IF INTERROGATION
13437: BEQ WB,=C$NEG,CGV25 OR NEGATION
13438: BNE WB,=C$FNC,CGV18 ELSE ORDINARY BINOP IF NOT FUNCTION
13439: MOV CMOPN(XR),XR ELSE LOAD FUNCTION VRBLK PTR
13440: BNZ VRLEN(XR),CGV18 ORDINARY BINOP IF NOT SYSTEM VAR
13441: MOV VRSVP(XR),XR ELSE POINT TO SVBLK
13442: MOV SVBIT(XR),WA LOAD BIT INDICATORS
13443: ANB BTPRD,WA TEST FOR PREDICATE FUNCTION
13444: ZRB WA,CGV18 ORDINARY BINOP IF NOT
13445: *
13446: * HERE IF LEFT ARG OF CONCATENATION IS PREDICATE FUNCTION
13447: *
13448: CGV25 MOV CMLOP(XL),XR RELOAD LEFT ARG
13449: JSR CDGVL GEN CODE BY VALUE
13450: MOV =OPOP$,WA LOAD POP CALL
13451: JSR CDWRD GENERATE IT
13452: MOV CMROP(XL),XR LOAD RIGHT OPERAND
13453: JSR CDGVL GEN CODE BY VALUE AS RESULT CODE
13454: BRN CGV33 EXIT (NOT CONSTANT)
13455: *
13456: * HERE TO GENERATE CODE FOR PATTERN, IMMEDIATE ASSIGNMENT
13457: *
13458: CGV26 MOV CMLOP(XL),XR LOAD LEFT OPERAND
13459: JSR CDGVL GEN CODE BY VALUE, MERGE
13460: *
13461: * HERE FOR UNOPS WITH ARG BY NAME (BINARY $ . MERGE)
13462: *
13463: CGV27 MOV CMROP(XL),XR LOAD RIGHT OPERAND PTR
13464: JSR CDGNM GEN CODE BY NAME FOR RIGHT ARG
13465: MOV CMOPN(XL),XR GET OPERATOR CODE WORD
13466: BNE (XR),=O$KWV,CGV20 GEN CALL UNLESS KEYWORD VALUE
13467: EJC
13468: *
13469: * CDGVL (CONTINUED)
13470: *
13471: * HERE FOR KEYWORD BY VALUE. THIS IS CONSTANT ONLY IF
13472: * THE OPERAND IS ONE OF THE SPECIAL SYSTEM VARIABLES WITH
13473: * THE SVCKW BIT SET TO INDICATE A CONSTANT KEYWORD VALUE.
13474: * NOTE THAT THE ONLY CONSTANT OPERAND BY NAME IS A VARIABLE
13475: *
13476: BNZ WC,CGV20 GEN CALL IF NON-CONSTANT (NOT VAR)
13477: MNZ WC ELSE SET NON-CONSTANT IN CASE
13478: MOV CMROP(XL),XR LOAD PTR TO OPERAND VRBLK
13479: BNZ VRLEN(XR),CGV20 GEN (NON-CONSTANT) IF NOT SYS VAR
13480: MOV VRSVP(XR),XR ELSE LOAD PTR TO SVBLK
13481: MOV SVBIT(XR),WA LOAD BIT MASK
13482: ANB BTCKW,WA TEST FOR CONSTANT KEYWORD
13483: ZRB WA,CGV20 GO GEN IF NOT CONSTANT
13484: ZER WC ELSE SET RESULT CONSTANT
13485: BRN CGV20 AND JUMP BACK TO GENERATE CALL
13486: *
13487: * HERE TO GENERATE CODE FOR NEGATION
13488: *
13489: CGV28 MOV =ONTA$,WA GET INITIAL WORD
13490: JSR CDWRD GENERATE IT
13491: MOV CWCOF,WB SAVE NEXT OFFSET
13492: JSR CDWRD GENERATE GUNK WORD FOR NOW
13493: MOV CMROP(XL),XR LOAD RIGHT OPERAND PTR
13494: JSR CDGVL GEN CODE BY VALUE
13495: MOV =ONTB$,WA LOAD END OF EVALUATION CALL
13496: JSR CDWRD GENERATE IT
13497: MOV WB,XR COPY OFFSET TO WORD TO PLUG
13498: ADD R$CCB,XR POINT TO ACTUAL WORD TO PLUG
13499: MOV CWCOF,(XR) PLUG WORD WITH CURRENT OFFSET
13500: MOV =ONTC$,WA LOAD FINAL CALL
13501: BRN CGV32 JUMP TO GENERATE IT (NOT CONSTANT)
13502: *
13503: * HERE TO GENERATE CODE FOR UNDEFINED BINARY OPERATOR
13504: *
13505: CGV29 MOV CMLOP(XL),XR LOAD LEFT OPERAND PTR
13506: JSR CDGVL GENERATE CODE BY VALUE
13507: EJC
13508: *
13509: * CDGVL (CONTINUED)
13510: *
13511: * HERE TO GENERATE CODE FOR UNDEFINED UNARY OPERATOR
13512: *
13513: CGV30 MOV =C$UO$,WB SET UNOP CODE + 1
13514: SUB CMTYP(XL),WB SET NUMBER OF ARGS (1 OR 2)
13515: *
13516: * MERGE HERE FOR UNDEFINED OPERATORS
13517: *
13518: MOV CMROP(XL),XR LOAD RIGHT (ONLY) OPERAND POINTER
13519: JSR CDGVL GEN VALUE CODE FOR RIGHT OPERAND
13520: MOV CMOPN(XL),XR LOAD POINTER TO OPERATOR DV
13521: MOV DVOPN(XR),XR LOAD POINTER OFFSET
13522: WTB XR CONVERT WORD OFFSET TO BYTES
13523: ADD =R$UBA,XR POINT TO PROPER FUNCTION PTR
13524: SUB *VRFNC,XR SET STANDARD FUNCTION OFFSET
13525: BRN CGV12 MERGE WITH FUNCTION CALL CIRCUIT
13526: *
13527: * HERE TO GENERATE CODE FOR INTERROGATION, INDIRECTION
13528: *
13529: CGV31 MNZ WC SET NON CONSTANT
13530: BRN CGV19 MERGE
13531: *
13532: * HERE TO EXIT GENERATING A WORD, RESULT NOT CONSTANT
13533: *
13534: CGV32 JSR CDWRD GENERATE WORD, MERGE
13535: *
13536: * HERE TO EXIT WITH NO WORD GENERATED, NOT CONSTANT
13537: *
13538: CGV33 MNZ WC INDICATE RESULT IS NOT CONSTANT
13539: *
13540: * COMMON EXIT POINT
13541: *
13542: CGV34 ICA XS POP INITIAL CODE OFFSET
13543: MOV (XS)+,WA RESTORE OLD CONSTANT FLAG
13544: MOV (XS)+,XL RESTORE ENTRY XL
13545: MOV (XS)+,WB RESTORE ENTRY WB
13546: BNZ WC,CGV35 JUMP IF NOT CONSTANT
13547: MOV WA,WC ELSE RESTORE ENTRY CONSTANT FLAG
13548: *
13549: * HERE TO RETURN AFTER DEALING WITH WC SETTING
13550: *
13551: CGV35 EXI RETURN TO CDGVL CALLER
13552: *
13553: * EXIT HERE TO GENERATE WORD AND TEST FOR CONSTANT
13554: *
13555: CGV36 JSR CDWRD GENERATE WORD
13556: BNZ WC,CGV34 JUMP TO EXIT IF NOT CONSTANT
13557: EJC
13558: *
13559: * CDGVL (CONTINUED)
13560: *
13561: * HERE TO PREEVALUATE CONSTANT SUB-EXPRESSION
13562: *
13563: MOV =ORVL$,WA LOAD CALL TO RETURN VALUE
13564: JSR CDWRD GENERATE IT
13565: MOV (XS),XL LOAD INITIAL CODE OFFSET
13566: JSR EXBLD BUILD EXBLK FOR EXPRESSION
13567: ZER WB SET TO EVALUATE BY VALUE
13568: JSR EVALX EVALUATE EXPRESSION
13569: PPM SHOULD NOT FAIL
13570: MOV (XR),WA LOAD TYPE WORD OF RESULT
13571: BLO WA,=P$AAA,CGV37 JUMP IF NOT PATTERN
13572: MOV =OLPT$,WA ELSE LOAD SPECIAL PATTERN LOAD CALL
13573: JSR CDWRD GENERATE IT
13574: *
13575: * MERGE HERE TO GENERATE POINTER TO RESULTING CONSTANT
13576: *
13577: CGV37 MOV XR,WA COPY CONSTANT POINTER
13578: JSR CDWRD GENERATE PTR
13579: ZER WC SET RESULT CONSTANT
13580: BRN CGV34 JUMP BACK TO EXIT
13581: ENP END PROCEDURE CDGVL
13582: EJC
13583: *
13584: * CDWRD -- GENERATE ONE WORD OF CODE
13585: *
13586: * CDWRD WRITES ONE WORD INTO THE CURRENT CODE BLOCK UNDER
13587: * CONSTRUCTION. A NEW, LARGER, BLOCK IS ALLOCATED IF THERE
13588: * IS INSUFFICIENT ROOM IN THE CURRENT BLOCK. CDWRD ENSURES
13589: * THAT THERE ARE AT LEAST THREE WORDS LEFT IN THE BLOCK
13590: * AFTER ENTERING THE NEW WORD. THIS GUARANTEES THAT ANY
13591: * EXTRA SPACE AT THE END CAN BE SPLIT OFF AS A CCBLK.
13592: *
13593: * (WA) WORD TO BE GENERATED
13594: * JSR CDWRD CALL TO GENERATE WORD
13595: *
13596: CDWRD PRC E,0 ENTRY POINT
13597: MOV XR,-(XS) SAVE ENTRY XR
13598: MOV WA,-(XS) SAVE CODE WORD TO BE GENERATED
13599: *
13600: * MERGE BACK HERE AFTER ALLOCATING LARGER BLOCK
13601: *
13602: CDWD1 MOV R$CCB,XR LOAD PTR TO CCBLK BEING BUILT
13603: BNZ XR,CDWD2 JUMP IF BLOCK ALLOCATED
13604: *
13605: * HERE WE ALLOCATE AN ENTIRELY FRESH BLOCK
13606: *
13607: MOV *E$CBS,WA LOAD INITIAL LENGTH
13608: JSR ALLOC ALLOCATE CCBLK
13609: MOV =B$CCT,(XR) STORE TYPE WORD
13610: MOV *CCCOD,CWCOF SET INITIAL OFFSET
13611: MOV WA,CCLEN(XR) STORE BLOCK LENGTH
13612: MOV XR,R$CCB STORE PTR TO NEW BLOCK
13613: *
13614: * HERE WE HAVE A BLOCK WE CAN USE
13615: *
13616: CDWD2 MOV CWCOF,WA LOAD CURRENT OFFSET
13617: ADD *NUM04,WA ADJUST FOR TEST (FOUR WORDS)
13618: BLO WA,CCLEN(XR),CDWD4 JUMP IF ROOM IN THIS BLOCK
13619: *
13620: * HERE IF NO ROOM IN CURRENT BLOCK
13621: *
13622: BGE WA,MXLEN,CDWD5 JUMP IF ALREADY AT MAX SIZE
13623: ADD *E$CBS,WA ELSE GET NEW SIZE
13624: MOV XL,-(XS) SAVE ENTRY XL
13625: MOV XR,XL COPY POINTER
13626: BLT WA,MXLEN,CDWD3 JUMP IF NOT TOO LARGE
13627: MOV MXLEN,WA ELSE RESET TO MAX ALLOWED SIZE
13628: EJC
13629: *
13630: * CDWRD (CONTINUED)
13631: *
13632: * HERE WITH NEW BLOCK SIZE IN WA
13633: *
13634: CDWD3 JSR ALLOC ALLOCATE NEW BLOCK
13635: MOV XR,R$CCB STORE POINTER TO NEW BLOCK
13636: MOV =B$CCT,(XR)+ STORE TYPE WORD IN NEW BLOCK
13637: MOV WA,(XR)+ STORE BLOCK LENGTH
13638: ADD *CCUSE,XL POINT TO CCUSE,CCCOD FIELDS IN OLD
13639: MOV (XL),WA LOAD CCUSE VALUE
13640: MVW COPY USEFUL WORDS FROM OLD BLOCK
13641: MOV (XS)+,XL RESTORE XL
13642: BRN CDWD1 MERGE BACK TO TRY AGAIN
13643: *
13644: * HERE WITH ROOM IN CURRENT BLOCK
13645: *
13646: CDWD4 MOV CWCOF,WA LOAD CURRENT OFFSET
13647: ICA WA GET NEW OFFSET
13648: MOV WA,CWCOF STORE NEW OFFSET
13649: MOV WA,CCUSE(XR) STORE IN CCBLK FOR GBCOL
13650: DCA WA RESTORE PTR TO THIS WORD
13651: ADD WA,XR POINT TO CURRENT ENTRY
13652: MOV (XS)+,WA RELOAD WORD TO GENERATE
13653: MOV WA,(XR) STORE WORD IN BLOCK
13654: MOV (XS)+,XR RESTORE ENTRY XR
13655: EXI RETURN TO CALLER
13656: *
13657: * HERE IF COMPILED CODE IS TOO LONG FOR CDBLK
13658: *
13659: CDWD5 ERB 213,SYNTAX ERROR. STATEMENT IS TOO COMPLICATED.
13660: ENP END PROCEDURE CDWRD
13661: EJC
13662: *
13663: * CMGEN -- GENERATE CODE FOR CMBLK PTR
13664: *
13665: * CMGEN IS A SUBSIDIARY PROCEDURE USED TO GENERATE VALUE
13666: * CODE FOR A CMBLK PTR FROM THE MAIN CODE GENERATORS.
13667: *
13668: * (XL) CMBLK POINTER
13669: * (WB) OFFSET TO POINTER IN CMBLK
13670: * JSR CMGEN CALL TO GENERATE CODE
13671: * (XR,WA) DESTROYED
13672: * (WB) BUMPED BY ONE WORD
13673: *
13674: CMGEN PRC R,0 ENTRY POINT, RECURSIVE
13675: MOV XL,XR COPY CMBLK POINTER
13676: ADD WB,XR POINT TO CMBLK POINTER
13677: MOV (XR),XR LOAD CMBLK POINTER
13678: JSR CDGVL GENERATE CODE BY VALUE
13679: ICA WB BUMP OFFSET
13680: EXI RETURN TO CALLER
13681: ENP END PROCEDURE CMGEN
13682: EJC
13683: *
13684: * CMPIL (COMPILE SOURCE CODE)
13685: *
13686: * CMPIL IS USED TO CONVERT SNOBOL4 SOURCE CODE TO INTERNAL
13687: * FORM (SEE CDBLK FORMAT). IT IS USED BOTH FOR THE INITIAL
13688: * COMPILE AND AT RUN TIME BY THE CODE AND CONVERT FUNCTIONS
13689: * THIS PROCEDURE HAS CONTROL FOR THE ENTIRE DURATION OF
13690: * INITIAL COMPILATION. AN ERROR IN ANY PROCEDURE CALLED
13691: * DURING COMPILATION WILL LEAD FIRST TO THE ERROR SECTION
13692: * AND ULTIMATELY BACK HERE FOR RESUMED COMPILATION. THE
13693: * RE-ENTRY POINTS AFTER AN ERROR ARE SPECIALLY LABELLED -
13694: *
13695: * CMPCE RESUME AFTER CONTROL CARD ERROR
13696: * CMPLE RESUME AFTER LABEL ERROR
13697: * CMPSE RESUME AFTER STATEMENT ERROR
13698: *
13699: * JSR CMPIL CALL TO COMPILE CODE
13700: * (XR) PTR TO CDBLK FOR ENTRY STATEMENT
13701: * (XL,WA,WB,WC,RA) DESTROYED
13702: *
13703: * THE FOLLOWING GLOBAL VARIABLES ARE REFERENCED
13704: *
13705: * CMPSN NUMBER OF NEXT STATEMENT
13706: * TO BE COMPILED.
13707: *
13708: * CSWXX CONTROL CARD SWITCH VALUES ARE
13709: * CHANGED WHEN RELEVANT CONTROL
13710: * CARDS ARE MET.
13711: *
13712: * CWCOF OFFSET TO NEXT WORD IN CODE BLOCK
13713: * BEING BUILT (SEE CDWRD).
13714: *
13715: * LSTSN NUMBER OF STATEMENT MOST RECENTLY
13716: * COMPILED (INITIALLY SET TO ZERO).
13717: *
13718: * R$CIM CURRENT (INITIAL) COMPILER IMAGE
13719: * (ZERO FOR INITIAL COMPILE CALL)
13720: *
13721: * R$CNI USED TO POINT TO FOLLOWING IMAGE.
13722: * (SEE READR PROCEDURE).
13723: *
13724: * SCNGO GOTO SWITCH FOR SCANE PROCEDURE
13725: *
13726: * SCNIL LENGTH OF CURRENT IMAGE EXCLUDING
13727: * CHARACTERS REMOVED BY -INPUT.
13728: *
13729: * SCNPT CURRENT SCAN OFFSET, SEE SCANE.
13730: *
13731: * SCNRS RESCAN SWITCH FOR SCANE PROCEDURE.
13732: *
13733: * SCNSE OFFSET (IN R$CIM) OF MOST RECENTLY
13734: * SCANNED ELEMENT. SET ZERO IF NOT
13735: * CURRENTLY SCANNING ITEMS
13736: EJC
13737: *
13738: * CMPIL (CONTINUED)
13739: *
13740: * STAGE STGIC INITIAL COMPILE IN PROGRESS
13741: * STGXC CODE/CONVERT COMPILE
13742: * STGEV BUILDING EXBLK FOR EVAL
13743: * STGXT EXECUTE TIME (OUTSIDE COMPILE)
13744: * STGCE INITIAL COMPILE AFTER END LINE
13745: * STGXE EXECUTE COMPILE AFTER END LINE
13746: *
13747: * CMPIL ALSO USES A FIXED NUMBER OF LOCATIONS ON THE
13748: * MAIN STACK AS FOLLOWS. (THE DEFINITIONS OF THE ACTUAL
13749: * OFFSETS ARE IN THE DEFINITIONS SECTION).
13750: *
13751: * CMSTM(XS) POINTER TO EXPAN TREE FOR BODY OF
13752: * STATEMENT (SEE EXPAN PROCEDURE).
13753: *
13754: * CMSGO(XS) POINTER TO TREE REPRESENTATION OF
13755: * SUCCESS GOTO (SEE PROCEDURE SCNGO)9
13756: * ZERO IF NO SUCCESS GOTO IS GIVEN
13757: *
13758: * CMFGO(XS) LIKE CMSGO FOR FAILURE GOTO.
13759: *
13760: * CMCGO(XS) SET NON-ZERO ONLY IF THERE IS A
13761: * CONDITIONAL GOTO. USED FOR -FAIL,
13762: * -NOFAIL CODE GENERATION.
13763: *
13764: * CMPCD(XS) POINTER TO CDBLK FOR PREVIOUS
13765: * STATEMENT. ZERO FOR 1ST STATEMENT.
13766: *
13767: * CMFFP(XS) SET NON-ZERO IF CDFAL IN PREVIOUS
13768: * CDBLK NEEDS FILLING WITH FORWARD
13769: * POINTER, ELSE SET TO ZERO.
13770: *
13771: * CMFFC(XS) SAME AS CMFFP FOR CURRENT CDBLK
13772: *
13773: * CMSOP(XS) OFFSET TO WORD IN PREVIOUS CDBLK
13774: * TO BE FILLED IN WITH FORWARD PTR
13775: * TO NEXT CDBLK FOR SUCCESS GOTO.
13776: * ZERO IF NO FILL IN IS REQUIRED.
13777: *
13778: * CMSOC(XS) SAME AS CMSOP FOR CURRENT CDBLK.
13779: *
13780: * CMLBL(XS) POINTER TO VRBLK FOR LABEL OF
13781: * CURRENT STATEMENT. ZERO IF NO LABEL
13782: *
13783: * CMTRA(XS) POINTER TO CDBLK FOR ENTRY STMNT.
13784: EJC
13785: *
13786: * CMPIL (CONTINUED)
13787: *
13788: * ENTRY POINT
13789: *
13790: CMPIL PRC E,0 ENTRY POINT
13791: LCT WB,=CMNEN SET NUMBER OF STACK WORK LOCATIONS
13792: *
13793: * LOOP TO INITIALIZE STACK WORKING LOCATIONS
13794: *
13795: CMP00 ZER -(XS) STORE A ZERO, MAKE ONE ENTRY
13796: BCT WB,CMP00 LOOP BACK UNTIL ALL SET
13797: MOV XS,CMPXS SAVE STACK POINTER FOR ERROR SEC
13798: SSS CMPSS SAVE S-R STACK POINTER IF ANY
13799: *
13800: * LOOP THROUGH STATEMENTS
13801: *
13802: CMP01 MOV SCNPT,WB SET SCAN POINTER OFFSET
13803: MOV WB,SCNSE SET START OF ELEMENT LOCATION
13804: MOV =OCER$,WA POINT TO COMPILE ERROR CALL
13805: JSR CDWRD GENERATE AS TEMPORARY CDFAL
13806: BLT WB,SCNIL,CMP04 JUMP IF CHARS LEFT ON THIS IMAGE
13807: *
13808: * LOOP HERE AFTER COMMENT OR CONTROL CARD
13809: * ALSO SPECIAL ENTRY AFTER CONTROL CARD ERROR
13810: *
13811: CMPCE ZER XR CLEAR POSSIBLE GARBAGE XR VALUE
13812: BNE STAGE,=STGIC,CMP02 SKIP UNLESS INITIAL COMPILE
13813: JSR READR READ NEXT INPUT IMAGE
13814: BZE XR,CMP09 JUMP IF NO INPUT AVAILABLE
13815: JSR NEXTS ACQUIRE NEXT SOURCE IMAGE
13816: MOV CMPSN,LSTSN STORE STMT NO FOR USE BY LISTR
13817: ZER SCNPT RESET SCAN POINTER
13818: BRN CMP04 GO PROCESS IMAGE
13819: *
13820: * FOR EXECUTE TIME COMPILE, PERMIT EMBEDDED CONTROL CARDS
13821: * AND COMMENTS (BY SKIPPING TO NEXT SEMI-COLON)
13822: *
13823: CMP02 MOV R$CIM,XR GET CURRENT IMAGE
13824: MOV SCNPT,WB GET CURRENT OFFSET
13825: PLC XR,WB PREPARE TO GET CHARS
13826: *
13827: * SKIP TO SEMI-COLON
13828: *
13829: CMP03 LCH WC,(XR)+ GET CHAR
13830: ICV SCNPT ADVANCE OFFSET
13831: BEQ WC,=CH$SM,CMP04 SKIP IF SEMI-COLON FOUND
13832: BLT SCNPT,SCNIL,CMP03 LOOP IF MORE CHARS
13833: ZER XR CLEAR GARBAGE XR VALUE
13834: BRN CMP09 END OF IMAGE
13835: EJC
13836: *
13837: * CMPIL (CONTINUED)
13838: *
13839: * HERE WITH IMAGE AVAILABLE TO SCAN. NOTE THAT IF THE INPUT
13840: * STRING IS NULL, THEN EVERYTHING IS OK SINCE NULL IS
13841: * ACTUALLY ASSEMBLED AS A WORD OF BLANKS.
13842: *
13843: CMP04 MOV R$CIM,XR POINT TO CURRENT IMAGE
13844: MOV SCNPT,WB LOAD CURRENT OFFSET
13845: MOV WB,WA COPY FOR LABEL SCAN
13846: PLC XR,WB POINT TO FIRST CHARACTER
13847: LCH WC,(XR)+ LOAD FIRST CHARACTER
13848: BEQ WC,=CH$SM,CMP12 NO LABEL IF SEMICOLON
13849: BEQ WC,=CH$AS,CMPCE LOOP BACK IF COMMENT CARD
13850: BEQ WC,=CH$MN,CMP32 JUMP IF CONTROL CARD
13851: MOV R$CIM,R$CMP ABOUT TO DESTROY R$CIM
13852: MOV =CMLAB,XL POINT TO LABEL WORK STRING
13853: MOV XL,R$CIM SCANE IS TO SCAN WORK STRING
13854: PSC XL POINT TO FIRST CHARACTER POSITION
13855: SCH WC,(XL)+ STORE CHAR JUST LOADED
13856: MOV =CH$SM,WC GET A SEMICOLON
13857: SCH WC,(XL) STORE AFTER FIRST CHAR
13858: CSC XL FINISHED CHARACTER STORING
13859: ZER XL CLEAR POINTER
13860: ZER SCNPT START AT FIRST CHARACTER
13861: MOV SCNIL,-(XS) PRESERVE IMAGE LENGTH
13862: MOV =NUM02,SCNIL READ 2 CHARS AT MOST
13863: JSR SCANE SCAN FIRST CHAR FOR TYPE
13864: MOV (XS)+,SCNIL RESTORE IMAGE LENGTH
13865: MOV XL,WC NOTE RETURN CODE
13866: MOV R$CMP,XL GET OLD R$CIM
13867: MOV XL,R$CIM PUT IT BACK
13868: MOV WB,SCNPT REINSTATE OFFSET
13869: BNZ SCNBL,CMP12 BLANK SEEN - CANT BE LABEL
13870: MOV XL,XR POINT TO CURRENT IMAGE
13871: PLC XR,WB POINT TO FIRST CHAR AGAIN
13872: BEQ WC,=T$VAR,CMP06 OK IF LETTER
13873: BEQ WC,=T$CON,CMP06 OK IF DIGIT
13874: *
13875: * DROP IN OR JUMP FROM ERROR SECTION IF SCANE FAILED
13876: *
13877: CMPLE MOV R$CMP,R$CIM POINT TO BAD LINE
13878: ERB 214,BAD LABEL OR MISPLACED CONTINUATION LINE
13879: *
13880: * LOOP TO SCAN LABEL
13881: *
13882: CMP05 BEQ WC,=CH$SM,CMP07 SKIP IF SEMICOLON
13883: ICV WA BUMP OFFSET
13884: BEQ WA,SCNIL,CMP07 JUMP IF END OF IMAGE (LABEL END)
13885: EJC
13886: *
13887: * CMPIL (CONTINUED)
13888: *
13889: * ENTER LOOP AT THIS POINT
13890: *
13891: CMP06 LCH WC,(XR)+ ELSE LOAD NEXT CHARACTER
13892: BEQ WC,=CH$HT,CMP07 JUMP IF HORIZONTAL TAB
13893: BNE WC,=CH$BL,CMP05 LOOP BACK IF NON-BLANK
13894: *
13895: * HERE AFTER SCANNING OUT LABEL
13896: *
13897: CMP07 MOV WA,SCNPT SAVE UPDATED SCAN OFFSET
13898: SUB WB,WA GET LENGTH OF LABEL
13899: BZE WA,CMP12 SKIP IF LABEL LENGTH ZERO
13900: ZER XR CLEAR GARBAGE XR VALUE
13901: JSR SBSTR BUILD SCBLK FOR LABEL NAME
13902: JSR GTNVR LOCATE/CONTRUCT VRBLK
13903: PPM DUMMY (IMPOSSIBLE) ERROR RETURN
13904: MOV XR,CMLBL(XS) STORE LABEL POINTER
13905: BNZ VRLEN(XR),CMP11 JUMP IF NOT SYSTEM LABEL
13906: BNE VRSVP(XR),=V$END,CMP11 JUMP IF NOT END LABEL
13907: *
13908: * HERE FOR END LABEL SCANNED OUT
13909: *
13910: ADD =STGND,STAGE ADJUST STAGE APPROPRIATELY
13911: JSR SCANE SCAN OUT NEXT ELEMENT
13912: BEQ XL,=T$SMC,CMP10 JUMP IF END OF IMAGE
13913: BNE XL,=T$VAR,CMP08 ELSE ERROR IF NOT VARIABLE
13914: *
13915: * HERE CHECK FOR VALID INITIAL TRANSFER
13916: *
13917: BEQ VRLBL(XR),=STNDL,CMP08 JUMP IF NOT DEFINED (ERROR)
13918: MOV VRLBL(XR),CMTRA(XS) ELSE SET INITIAL ENTRY POINTER
13919: JSR SCANE SCAN NEXT ELEMENT
13920: BEQ XL,=T$SMC,CMP10 JUMP IF OK (END OF IMAGE)
13921: *
13922: * HERE FOR BAD TRANSFER LABEL
13923: *
13924: CMP08 ERB 215,SYNTAX ERROR. UNDEFINED OR ERRONEOUS ENTRY LABEL
13925: *
13926: * HERE FOR END OF INPUT (NO END LABEL DETECTED)
13927: *
13928: CMP09 ADD =STGND,STAGE ADJUST STAGE APPROPRIATELY
13929: BEQ STAGE,=STGXE,CMP10 JUMP IF CODE CALL (OK)
13930: ERB 216,SYNTAX ERROR. MISSING END LINE
13931: *
13932: * HERE AFTER PROCESSING END LINE (MERGE HERE ON END ERROR)
13933: *
13934: CMP10 MOV =OSTP$,WA SET STOP CALL POINTER
13935: JSR CDWRD GENERATE AS STATEMENT CALL
13936: BRN CMPSE JUMP TO GENERATE AS FAILURE
13937: EJC
13938: *
13939: * CMPIL (CONTINUED)
13940: *
13941: * HERE AFTER PROCESSING LABEL OTHER THAN END
13942: *
13943: CMP11 BNE STAGE,=STGIC,CMP12 JUMP IF CODE CALL - REDEF. OK
13944: BEQ VRLBL(XR),=STNDL,CMP12 ELSE CHECK FOR REDEFINITION
13945: ZER CMLBL(XS) LEAVE FIRST LABEL DECLN UNDISTURBED
13946: ERB 217,SYNTAX ERROR. DUPLICATE LABEL
13947: *
13948: * HERE AFTER DEALING WITH LABEL
13949: *
13950: CMP12 ZER WB SET FLAG FOR STATEMENT BODY
13951: JSR EXPAN GET TREE FOR STATEMENT BODY
13952: MOV XR,CMSTM(XS) STORE FOR LATER USE
13953: ZER CMSGO(XS) CLEAR SUCCESS GOTO POINTER
13954: ZER CMFGO(XS) CLEAR FAILURE GOTO POINTER
13955: ZER CMCGO(XS) CLEAR CONDITIONAL GOTO FLAG
13956: JSR SCANE SCAN NEXT ELEMENT
13957: BNE XL,=T$COL,CMP18 JUMP IT NOT COLON (NO GOTO)
13958: *
13959: * LOOP TO PROCESS GOTO FIELDS
13960: *
13961: CMP13 MNZ SCNGO SET GOTO FLAG
13962: JSR SCANE SCAN NEXT ELEMENT
13963: BEQ XL,=T$SMC,CMP31 JUMP IF NO FIELDS LEFT
13964: BEQ XL,=T$SGO,CMP14 JUMP IF S FOR SUCCESS GOTO
13965: BEQ XL,=T$FGO,CMP16 JUMP IF F FOR FAILURE GOTO
13966: *
13967: * HERE FOR UNCONDITIONAL GOTO (I.E. NOT F OR S)
13968: *
13969: MNZ SCNRS SET TO RESCAN ELEMENT NOT F,S
13970: JSR SCNGF SCAN OUT GOTO FIELD
13971: BNZ CMFGO(XS),CMP17 ERROR IF FGOTO ALREADY
13972: MOV XR,CMFGO(XS) ELSE SET AS FGOTO
13973: BRN CMP15 MERGE WITH SGOTO CIRCUIT
13974: *
13975: * HERE FOR SUCCESS GOTO
13976: *
13977: CMP14 JSR SCNGF SCAN SUCCESS GOTO FIELD
13978: MOV =NUM01,CMCGO(XS) SET CONDITIONAL GOTO FLAG
13979: *
13980: * UNCONTIONAL GOTO MERGES HERE
13981: *
13982: CMP15 BNZ CMSGO(XS),CMP17 ERROR IF SGOTO ALREADY GIVEN
13983: MOV XR,CMSGO(XS) ELSE SET SGOTO
13984: BRN CMP13 LOOP BACK FOR NEXT GOTO FIELD
13985: *
13986: * HERE FOR FAILURE GOTO
13987: *
13988: CMP16 JSR SCNGF SCAN GOTO FIELD
13989: MOV =NUM01,CMCGO(XS) SET CONDITONAL GOTO FLAG
13990: BNZ CMFGO(XS),CMP17 ERROR IF FGOTO ALREADY GIVEN
13991: MOV XR,CMFGO(XS) ELSE STORE FGOTO POINTER
13992: BRN CMP13 LOOP BACK FOR NEXT FIELD
13993: EJC
13994: *
13995: * CMPIL (CONTINUED)
13996: *
13997: * HERE FOR DUPLICATED GOTO FIELD
13998: *
13999: CMP17 ERB 218,SYNTAX ERROR. DUPLICATED GOTO FIELD
14000: *
14001: * HERE TO GENERATE CODE
14002: *
14003: CMP18 ZER SCNSE STOP POSITIONAL ERROR FLAGS
14004: MOV CMSTM(XS),XR LOAD TREE PTR FOR STATEMENT BODY
14005: ZER WB COLLECTABLE VALUE FOR WB FOR CDGVL
14006: ZER WC RESET CONSTANT FLAG FOR CDGVL
14007: JSR EXPAP TEST FOR PATTERN MATCH
14008: PPM CMP19 JUMP IF NOT PATTERN MATCH
14009: MOV =OPMS$,CMOPN(XR) ELSE SET PATTERN MATCH POINTER
14010: MOV =C$PMT,CMTYP(XR)
14011: *
14012: * HERE AFTER DEALING WITH SPECIAL PATTERN MATCH CASE
14013: *
14014: CMP19 JSR CDGVL GENERATE CODE FOR BODY OF STATEMENT
14015: MOV CMSGO(XS),XR LOAD SGOTO POINTER
14016: MOV XR,WA COPY IT
14017: BZE XR,CMP21 JUMP IF NO SUCCESS GOTO
14018: ZER CMSOC(XS) CLEAR SUCCESS OFFSET FILLIN PTR
14019: BHI XR,STATE,CMP20 JUMP IF COMPLEX GOTO
14020: *
14021: * HERE FOR SIMPLE SUCCESS GOTO (LABEL)
14022: *
14023: ADD *VRTRA,WA POINT TO VRTRA FIELD AS REQUIRED
14024: JSR CDWRD GENERATE SUCCESS GOTO
14025: BRN CMP22 JUMP TO DEAL WITH FGOTO
14026: *
14027: * HERE FOR COMPLEX SUCCESS GOTO
14028: *
14029: CMP20 BEQ XR,CMFGO(XS),CMP22 NO CODE IF SAME AS FGOTO
14030: ZER WB ELSE SET OK VALUE FOR CDGVL IN WB
14031: JSR CDGCG GENERATE CODE FOR SUCCESS GOTO
14032: BRN CMP22 JUMP TO DEAL WITH FGOTO
14033: *
14034: * HERE FOR NO SUCCESS GOTO
14035: *
14036: CMP21 MOV CWCOF,CMSOC(XS) SET SUCCESS FILL IN OFFSET
14037: MOV =OCER$,WA POINT TO COMPILE ERROR CALL
14038: JSR CDWRD GENERATE AS TEMPORARY VALUE
14039: EJC
14040: *
14041: * CMPIL (CONTINUED)
14042: *
14043: * HERE TO DEAL WITH FAILURE GOTO
14044: *
14045: CMP22 MOV CMFGO(XS),XR LOAD FAILURE GOTO POINTER
14046: MOV XR,WA COPY IT
14047: ZER CMFFC(XS) SET NO FILL IN REQUIRED YET
14048: BZE XR,CMP23 JUMP IF NO FAILURE GOTO GIVEN
14049: ADD *VRTRA,WA POINT TO VRTRA FIELD IN CASE
14050: BLO XR,STATE,CMPSE JUMP TO GEN IF SIMPLE FGOTO
14051: *
14052: * HERE FOR COMPLEX FAILURE GOTO
14053: *
14054: MOV CWCOF,WB SAVE OFFSET TO O$GOF CALL
14055: MOV =OGOF$,WA POINT TO FAILURE GOTO CALL
14056: JSR CDWRD GENERATE
14057: MOV =OFIF$,WA POINT TO FAIL IN FAIL WORD
14058: JSR CDWRD GENERATE
14059: JSR CDGCG GENERATE CODE FOR FAILURE GOTO
14060: MOV WB,WA COPY OFFSET TO O$GOF FOR CDFAL
14061: MOV =B$CDC,WB SET COMPLEX CASE CDTYP
14062: BRN CMP25 JUMP TO BUILD CDBLK
14063: *
14064: * HERE IF NO FAILURE GOTO GIVEN
14065: *
14066: CMP23 MOV =OUNF$,WA LOAD UNEXPECTED FAILURE CALL IN CAS
14067: MOV CSWFL,WC GET -NOFAIL FLAG
14068: ORB CMCGO(XS),WC CHECK IF CONDITIONAL GOTO
14069: ZRB WC,CMPSE JUMP IF -NOFAIL AND NO COND. GOTO
14070: MNZ CMFFC(XS) ELSE SET FILL IN FLAG
14071: MOV =OCER$,WA AND SET COMPILE ERROR FOR TEMPORARY
14072: *
14073: * MERGE HERE WITH CDFAL VALUE IN WA, SIMPLE CDBLK
14074: * ALSO SPECIAL ENTRY AFTER STATEMENT ERROR
14075: *
14076: CMPSE MOV =B$CDS,WB SET CDTYP FOR SIMPLE CASE
14077: EJC
14078: *
14079: * CMPIL (CONTINUED)
14080: *
14081: * MERGE HERE TO BUILD CDBLK
14082: *
14083: * (WA) CDFAL VALUE TO BE GENERATED
14084: * (WB) CDTYP VALUE TO BE GENERATED
14085: *
14086: * AT THIS STAGE, WE CHOP OFF AN APPROPRIATE CHUNK OF THE
14087: * CURRENT CCBLK AND CONVERT IT INTO A CDBLK. THE REMAINDER
14088: * OF THE CCBLK IS REFORMATTED TO BE THE NEW CCBLK.
14089: *
14090: CMP25 MOV R$CCB,XR POINT TO CCBLK
14091: MOV CMLBL(XS),XL GET POSSIBLE LABEL POINTER
14092: BZE XL,CMP26 SKIP IF NO LABEL
14093: ZER CMLBL(XS) CLEAR FLAG FOR NEXT STATEMENT
14094: MOV XR,VRLBL(XL) PUT CDBLK PTR IN VRBLK LABEL FIELD
14095: *
14096: * MERGE AFTER DOING LABEL
14097: *
14098: CMP26 MOV WB,(XR) SET TYPE WORD FOR NEW CDBLK
14099: MOV WA,CDFAL(XR) SET FAILURE WORD
14100: MOV XR,XL COPY POINTER TO CCBLK
14101: MOV CCUSE(XR),WB LOAD LENGTH GEN (= NEW CDLEN)
14102: MOV CCLEN(XR),WC LOAD TOTAL CCBLK LENGTH
14103: ADD WB,XL POINT PAST CDBLK
14104: SUB WB,WC GET LENGTH LEFT FOR CHOP OFF
14105: MOV =B$CCT,(XL) SET TYPE CODE FOR NEW CCBLK AT END
14106: MOV *CCCOD,CCUSE(XL) SET INITIAL CODE OFFSET
14107: MOV *CCCOD,CWCOF REINITIALISE CWCOF
14108: MOV WC,CCLEN(XL) SET NEW LENGTH
14109: MOV XL,R$CCB SET NEW CCBLK POINTER
14110: MOV CMPSN,CDSTM(XR) SET STATEMENT NUMBER
14111: ICV CMPSN BUMP STATEMENT NUMBER
14112: *
14113: * SET POINTERS IN PREVIOUS CODE BLOCK AS REQUIRED
14114: *
14115: MOV CMPCD(XS),XL LOAD PTR TO PREVIOUS CDBLK
14116: BZE CMFFP(XS),CMP27 JUMP IF NO FAILURE FILL IN REQUIRED
14117: MOV XR,CDFAL(XL) ELSE SET FAILURE PTR IN PREVIOUS
14118: *
14119: * HERE TO DEAL WITH SUCCESS FORWARD POINTER
14120: *
14121: CMP27 MOV CMSOP(XS),WA LOAD SUCCESS OFFSET
14122: BZE WA,CMP28 JUMP IF NO FILL IN REQUIRED
14123: ADD WA,XL ELSE POINT TO FILL IN LOCATION
14124: MOV XR,(XL) STORE FORWARD POINTER
14125: ZER XL CLEAR GARBAGE XL VALUE
14126: EJC
14127: *
14128: * CMPIL (CONTINUED)
14129: *
14130: * NOW SET FILL IN POINTERS FOR THIS STATEMENT
14131: *
14132: CMP28 MOV CMFFC(XS),CMFFP(XS) COPY FAILURE FILL IN FLAG
14133: MOV CMSOC(XS),CMSOP(XS) COPY SUCCESS FILL IN OFFSET
14134: MOV XR,CMPCD(XS) SAVE PTR TO THIS CDBLK
14135: BNZ CMTRA(XS),CMP29 JUMP IF INITIAL ENTRY ALREADY SET
14136: MOV XR,CMTRA(XS) ELSE SET PTR HERE AS DEFAULT
14137: *
14138: * HERE AFTER COMPILING ONE STATEMENT
14139: *
14140: CMP29 BLT STAGE,=STGCE,CMP01 JUMP IF NOT END LINE JUST DONE
14141: BZE CSWLS,CMP30 SKIP IF -NOLIST
14142: JSR LISTR LIST LAST LINE
14143: *
14144: * RETURN
14145: *
14146: CMP30 MOV CMTRA(XS),XR LOAD INITIAL ENTRY CDBLK POINTER
14147: ADD *CMNEN,XS POP WORK LOCATIONS OFF STACK
14148: EXI AND RETURN TO CMPIL CALLER
14149: *
14150: * HERE AT END OF GOTO FIELD
14151: *
14152: CMP31 MOV CMFGO(XS),WB GET FAIL GOTO
14153: ORB CMSGO(XS),WB OR IN SUCCESS GOTO
14154: BNZ WB,CMP18 OK IF NON-NULL FIELD
14155: ERB 219,SYNTAX ERROR. EMPTY GOTO FIELD
14156: *
14157: * CONTROL CARD FOUND
14158: *
14159: CMP32 ICV WB POINT PAST CH$MN
14160: JSR CNCRD PROCESS CONTROL CARD
14161: ZER SCNSE CLEAR START OF ELEMENT LOC.
14162: BRN CMPCE LOOP FOR NEXT STATEMENT
14163: ENP END PROCEDURE CMPIL
14164: EJC
14165: *
14166: * CNCRD -- CONTROL CARD PROCESSOR
14167: *
14168: * CALLED TO DEAL WITH CONTROL CARDS
14169: *
14170: * R$CIM POINTS TO CURRENT IMAGE
14171: * (WB) OFFSET TO 1ST CHAR OF CONTROL CARD
14172: * JSR CNCRD CALL TO PROCESS CONTROL CARDS
14173: * (XL,XR,WA,WB,WC,IA) DESTROYED
14174: *
14175: CNCRD PRC E,0 ENTRY POINT
14176: MOV WB,SCNPT OFFSET FOR CONTROL CARD SCAN
14177: MOV =CCNOC,WA NUMBER OF CHARS FOR COMPARISON
14178: CTW WA,0 CONVERT TO WORD COUNT
14179: MOV WA,CNSWC SAVE WORD COUNT
14180: *
14181: * LOOP HERE IF MORE THAN ONE CONTROL CARD
14182: *
14183: CNC01 BGE SCNPT,SCNIL,CNC09 RETURN IF END OF IMAGE
14184: MOV R$CIM,XR POINT TO IMAGE
14185: PLC XR,SCNPT CHAR PTR FOR FIRST CHAR
14186: LCH WA,(XR)+ GET FIRST CHAR
14187: FLC WA FOLD TO UPPER CASE
14188: BEQ WA,=CH$LI,CNC07 SPECIAL CASE OF -INXXX
14189: MNZ SCNCC SET FLAG FOR SCANE
14190: JSR SCANE SCAN CARD NAME
14191: ZER SCNCC CLEAR SCANE FLAG
14192: BNZ XL,CNC06 FAIL UNLESS CONTROL CARD NAME
14193: MOV =CCNOC,WA NO. OF CHARS TO BE COMPARED
14194: BLT SCLEN(XR),WA,CNC06 FAIL IF TOO FEW CHARS
14195: MOV XR,XL POINT TO CONTROL CARD NAME
14196: ZER WB ZERO OFFSET FOR SUBSTRING
14197: JSR SBSTR EXTRACT SUBSTRING FOR COMPARISON
14198: MOV SCLEN(XR),WA RELOAD LENGTH
14199: JSR FLSTG FOLD TO UPPER CASE
14200: MOV XR,CNSCC KEEP CONTROL CARD SUBSTRING PTR
14201: MOV =CCNMS,XR POINT TO LIST OF STANDARD NAMES
14202: ZER WB INITIALISE NAME OFFSET
14203: LCT WC,=CC$NC NUMBER OF STANDARD NAMES
14204: *
14205: * TRY TO MATCH NAME
14206: *
14207: CNC02 MOV CNSCC,XL POINT TO NAME
14208: LCT WA,CNSWC COUNTER FOR INNER LOOP
14209: BRN CNC04 JUMP INTO LOOP
14210: *
14211: * INNER LOOP TO MATCH CARD NAME CHARS
14212: *
14213: CNC03 ICA XR BUMP STANDARD NAMES PTR
14214: ICA XL BUMP NAME POINTER
14215: *
14216: * HERE TO INITIATE THE LOOP
14217: *
14218: CNC04 CNE SCHAR(XL),(XR),CNC05 COMP. UP TO CFP$C CHARS AT ONCE
14219: BCT WA,CNC03 LOOP IF MORE WORDS TO COMPARE
14220: EJC
14221: *
14222: * CNCRD (CONTINUED)
14223: *
14224: * MATCHED - BRANCH ON CARD OFFSET
14225: *
14226: MOV WB,XL GET NAME OFFSET
14227: BSW XL,CC$NC SWITCH
14228: IFF CC$CA,CNC37 -CASE
14229: IFF CC$DO,CNC10 -DOUBLE
14230: IFF CC$DU,CNC11 -DUMP
14231: IFF CC$EJ,CNC12 -EJECT
14232: IFF CC$ER,CNC13 -ERRORS
14233: IFF CC$EX,CNC14 -EXECUTE
14234: IFF CC$FA,CNC15 -FAIL
14235: IFF CC$LI,CNC16 -LIST
14236: IFF CC$NR,CNC17 -NOERRORS
14237: IFF CC$NX,CNC18 -NOEXECUTE
14238: IFF CC$NF,CNC19 -NOFAIL
14239: IFF CC$NL,CNC20 -NOLIST
14240: IFF CC$NO,CNC21 -NOOPT
14241: IFF CC$NP,CNC22 -NOPRINT
14242: IFF CC$OP,CNC24 -OPTIMISE
14243: IFF CC$PR,CNC25 -PRINT
14244: IFF CC$SI,CNC27 -SINGLE
14245: IFF CC$SP,CNC28 -SPACE
14246: IFF CC$ST,CNC31 -STITLE
14247: IFF CC$TI,CNC32 -TITLE
14248: IFF CC$TR,CNC36 -TRACE
14249: ESW END SWITCH
14250: *
14251: * NOT MATCHED YET. ALIGN STD NAMES PTR AND TRY AGAIN
14252: *
14253: CNC05 ICA XR BUMP STANDARD NAMES PTR
14254: BCT WA,CNC05 LOOP
14255: ICV WB BUMP NAMES OFFSET
14256: BCT WC,CNC02 CONTINUE IF MORE NAMES
14257: *
14258: * INVALID CONTROL CARD NAME
14259: *
14260: CNC06 ERB 247,INVALID CONTROL CARD
14261: *
14262: * SPECIAL PROCESSING FOR -INXXX
14263: *
14264: CNC07 LCH WA,(XR) GET NEXT CHAR
14265: FLC WA FOLD TO UPPER CASE
14266: BNE WA,=CH$LN,CNC06 FAIL IF NOT LETTER N
14267: ADD =NUM02,SCNPT BUMP OFFSET PAST -IN
14268: JSR SCANE SCAN INTEGER AFTER -IN
14269: MOV XR,-(XS) STACK SCANNED ITEM
14270: JSR GTSMI CHECK IF INTEGER
14271: PPM CNC06 FAIL IF NOT INTEGER
14272: PPM CNC06 FAIL IF NEGATIVE OR LARGE
14273: MOV XR,CSWIN KEEP INTEGER
14274: EJC
14275: *
14276: * CNCRD (CONTINUED)
14277: *
14278: * CHECK FOR MORE CONTROL CARDS BEFORE RETURNING
14279: *
14280: CNC08 MOV SCNPT,WA PRESERVE IN CASE XEQ TIME COMPILE
14281: JSR SCANE LOOK FOR COMMA
14282: BEQ XL,=T$CMA,CNC01 LOOP IF COMMA FOUND
14283: MOV WA,SCNPT RESTORE SCNPT IN CASE XEQ TIME
14284: *
14285: * RETURN POINT
14286: *
14287: CNC09 EXI RETURN
14288: *
14289: * -DOUBLE
14290: *
14291: CNC10 MNZ CSWDB SET SWITCH
14292: BRN CNC08 MERGE
14293: *
14294: * -DUMP
14295: * THIS IS USED FOR SYSTEM DEBUGGING . IT HAS THE EFFECT OF
14296: * PRODUCING A CORE DUMP AT COMPILATION TIME
14297: *
14298: CNC11 JSR SYSDM CALL DUMPER
14299: BRN CNC09 FINISHED
14300: *
14301: * -EJECT
14302: *
14303: CNC12 BZE CSWLS,CNC09 RETURN IF -NOLIST
14304: JSR PRTPS EJECT
14305: JSR LISTT LIST TITLE
14306: BRN CNC09 FINISHED
14307: *
14308: * -ERRORS
14309: *
14310: CNC13 ZER CSWER CLEAR SWITCH
14311: BRN CNC08 MERGE
14312: *
14313: * -EXECUTE
14314: *
14315: CNC14 ZER CSWEX CLEAR SWITCH
14316: BRN CNC08 MERGE
14317: *
14318: * -FAIL
14319: *
14320: CNC15 MNZ CSWFL SET SWITCH
14321: BRN CNC08 MERGE
14322: *
14323: * -LIST
14324: *
14325: CNC16 MNZ CSWLS SET SWITCH
14326: BEQ STAGE,=STGIC,CNC08 DONE IF COMPILE TIME
14327: *
14328: * LIST CODE LINE IF EXECUTE TIME COMPILE
14329: *
14330: ZER LSTPF PERMIT LISTING
14331: JSR LISTR LIST LINE
14332: BRN CNC08 MERGE
14333: EJC
14334: *
14335: * CNCRD (CONTINUED)
14336: *
14337: * -NOERRORS
14338: *
14339: CNC17 MNZ CSWER SET SWITCH
14340: BRN CNC08 MERGE
14341: *
14342: * -NOEXECUTE
14343: *
14344: CNC18 MNZ CSWEX SET SWITCH
14345: BRN CNC08 MERGE
14346: *
14347: * -NOFAIL
14348: *
14349: CNC19 ZER CSWFL CLEAR SWITCH
14350: BRN CNC08 MERGE
14351: *
14352: * -NOLIST
14353: *
14354: CNC20 ZER CSWLS CLEAR SWITCH
14355: BRN CNC08 MERGE
14356: *
14357: * -NOOPTIMISE
14358: *
14359: CNC21 MNZ CSWNO SET SWITCH
14360: BRN CNC08 MERGE
14361: *
14362: * -NOPRINT
14363: *
14364: CNC22 ZER CSWPR CLEAR SWITCH
14365: BRN CNC08 MERGE
14366: *
14367: * -OPTIMISE
14368: *
14369: CNC24 ZER CSWNO CLEAR SWITCH
14370: BRN CNC08 MERGE
14371: *
14372: * -PRINT
14373: *
14374: CNC25 MNZ CSWPR SET SWITCH
14375: BRN CNC08 MERGE
14376: EJC
14377: *
14378: * CNCRD (CONTINUED)
14379: *
14380: * -SINGLE
14381: *
14382: CNC27 ZER CSWDB CLEAR SWITCH
14383: BRN CNC08 MERGE
14384: *
14385: * -SPACE
14386: *
14387: CNC28 BZE CSWLS,CNC09 RETURN IF -NOLIST
14388: JSR SCANE SCAN INTEGER AFTER -SPACE
14389: MOV =NUM01,WC 1 SPACE IN CASE
14390: BEQ XR,=T$SMC,CNC29 JUMP IF NO INTEGER
14391: MOV XR,-(XS) STACK IT
14392: JSR GTSMI CHECK INTEGER
14393: PPM CNC06 FAIL IF NOT INTEGER
14394: PPM CNC06 FAIL IF NEGATIVE OR LARGE
14395: BNZ WC,CNC29 JUMP IF NON ZERO
14396: MOV =NUM01,WC ELSE 1 SPACE
14397: *
14398: * MERGE WITH COUNT OF LINES TO SKIP
14399: *
14400: CNC29 ADD WC,LSTLC BUMP LINE COUNT
14401: LCT WC,WC CONVERT TO LOOP COUNTER
14402: BLT LSTLC,LSTNP,CNC30 JUMP IF FITS ON PAGE
14403: JSR PRTPS EJECT
14404: JSR LISTT LIST TITLE
14405: BRN CNC09 MERGE
14406: *
14407: * SKIP LINES
14408: *
14409: CNC30 JSR PRTNL PRINT A BLANK
14410: BCT WC,CNC30 LOOP
14411: BRN CNC09 MERGE
14412: EJC
14413: *
14414: * CNCRD (CONTINUED)
14415: *
14416: * -STITL
14417: *
14418: CNC31 MOV =R$STL,CNR$T PTR TO R$STL
14419: BRN CNC33 MERGE
14420: *
14421: * -TITLE
14422: *
14423: CNC32 MOV =NULLS,R$STL CLEAR SUBTITLE
14424: MOV =R$TTL,CNR$T PTR TO R$TTL
14425: *
14426: * COMMON PROCESSING FOR -TITLE, -STITL
14427: *
14428: CNC33 MOV =NULLS,XR NULL IN CASE NEEDED
14429: MNZ CNTTL SET FLAG FOR NEXT LISTR CALL
14430: MOV =CCOFS,WB OFFSET TO TITLE/SUBTITLE
14431: MOV SCNIL,WA INPUT IMAGE LENGTH
14432: BLO WA,WB,CNC34 JUMP IF NO CHARS LEFT
14433: SUB WB,WA NO OF CHARS TO EXTRACT
14434: MOV R$CIM,XL POINT TO IMAGE
14435: JSR SBSTR GET TITLE/SUBTITLE
14436: *
14437: * STORE TITLE/SUBTITLE
14438: *
14439: CNC34 MOV CNR$T,XL POINT TO STORAGE LOCATION
14440: MOV XR,(XL) STORE TITLE/SUBTITLE
14441: BEQ XL,=R$STL,CNC09 RETURN IF STITL
14442: BNZ PRECL,CNC09 RETURN IF EXTENDED LISTING
14443: BZE PRICH,CNC09 RETURN IF REGULAR PRINTER
14444: MOV SCLEN(XR),XL GET LENGTH OF TITLE
14445: MOV XL,WA COPY IT
14446: BZE XL,CNC35 JUMP IF NULL
14447: ADD =NUM10,XL INCREMENT
14448: BHI XL,PRLEN,CNC09 USE DEFAULT LSTP0 VAL IF TOO LONG
14449: ADD =NUM04,WA POINT JUST PAST TITLE
14450: *
14451: * STORE OFFSET TO PAGE NN MESSAGE FOR SHORT TITLE
14452: *
14453: CNC35 MOV WA,LSTPO STORE OFFSET
14454: BRN CNC09 RETURN
14455: *
14456: * -TRACE
14457: * PROVIDED FOR SYSTEM DEBUGGING. TOGGLES THE SYSTEM LABEL
14458: * TRACE SWITCH AT COMPILE TIME
14459: *
14460: CNC36 JSR SYSTT TOGGLE SWITCH
14461: BRN CNC08 MERGE
14462: *
14463: * -CASE
14464: * SETS VALUE OF KVCAS SO THAT NAMES ARE FOLDED OR NOT
14465: * DURING COMPILATION.
14466: *
14467: CNC37 JSR SCANE SCAN INTEGER AFTER -CASE
14468: ZER WC GET 0 IN CASE NONE THERE
14469: BEQ XL,=T$SMC,CNC38 SKIP IF NO INTEGER
14470: MOV XR,-(XS) STACK IT
14471: JSR GTSMI CHECK INTEGER
14472: PPM CNC06 FAIL IF NOT INTEGER
14473: PPM CNC06 FAIL IF NEGATIVE OR TOO LARGE
14474: CNC38 MOV WC,KVCAS STORE NEW CASE VALUE
14475: BRN CNC09 MERGE
14476: ENP END PROCEDURE CNCRD
14477: EJC
14478: *
14479: * DFFNC -- DEFINE FUNCTION
14480: *
14481: * DFFNC IS CALLED WHENEVER A NEW FUNCTION IS ASSIGNED TO
14482: * A VARIABLE. IT DEALS WITH EXTERNAL FUNCTION USE COUNTS.
14483: *
14484: * (XR) POINTER TO VRBLK
14485: * (XL) POINTER TO NEW FUNCTION BLOCK
14486: * JSR DFFNC CALL TO DEFINE FUNCTION
14487: * (WA,WB) DESTROYED
14488: *
14489: DFFNC PRC E,0 ENTRY POINT
14490: BNE (XL),=B$EFC,DFFN1 SKIP IF NEW FUNCTION NOT EXTERNAL
14491: ICV EFUSE(XL) ELSE INCREMENT ITS USE COUNT
14492: *
14493: * HERE AFTER DEALING WITH NEW FUNCTION USE COUNT
14494: *
14495: DFFN1 MOV XR,WA SAVE VRBLK POINTER
14496: MOV VRFNC(XR),XR LOAD OLD FUNCTION POINTER
14497: BNE (XR),=B$EFC,DFFN2 JUMP IF OLD FUNCTION NOT EXTERNAL
14498: MOV EFUSE(XR),WB ELSE GET USE COUNT
14499: DCV WB DECREMENT
14500: MOV WB,EFUSE(XR) STORE DECREMENTED VALUE
14501: BNZ WB,DFFN2 JUMP IF USE COUNT STILL NON-ZERO
14502: JSR SYSUL ELSE CALL SYSTEM UNLOAD FUNCTION
14503: *
14504: * HERE AFTER DEALING WITH OLD FUNCTION USE COUNT
14505: *
14506: DFFN2 MOV WA,XR RESTORE VRBLK POINTER
14507: MOV XL,WA COPY FUNCTION BLOCK PTR
14508: BLT XR,=R$YYY,DFFN3 SKIP CHECKS IF OPSYN OP DEFINITION
14509: BNZ VRLEN(XR),DFFN3 JUMP IF NOT SYSTEM VARIABLE
14510: *
14511: * FOR SYSTEM VARIABLE, CHECK FOR ILLEGAL REDEFINITION
14512: *
14513: MOV VRSVP(XR),XL POINT TO SVBLK
14514: MOV SVBIT(XL),WB LOAD BIT INDICATORS
14515: ANB BTFNC,WB IS IT A SYSTEM FUNCTION
14516: ZRB WB,DFFN3 REDEF OK IF NOT
14517: ERB 248,ATTEMPTED REDEFINITION OF SYSTEM FUNCTION
14518: *
14519: * HERE IF REDEFINITION IS PERMITTED
14520: *
14521: DFFN3 MOV WA,VRFNC(XR) STORE NEW FUNCTION POINTER
14522: MOV WA,XL RESTORE FUNCTION BLOCK POINTER
14523: EXI RETURN TO DFFNC CALLER
14524: ENP END PROCEDURE DFFNC
14525: EJC
14526: *
14527: * DTACH -- DETACH I/O ASSOCIATED NAMES
14528: *
14529: * DETACHES TRBLKS FROM I/O ASSOCIATED VARIABLES, REMOVES
14530: * ENTRY FROM IOCHN CHAIN ATTACHED TO FILEARG1 VRBLK AND MAY
14531: * REMOVE VRBLK ACCESS AND STORE TRAPS.
14532: * INPUT, OUTPUT, TERMINAL ARE HANDLED SPECIALLY.
14533: *
14534: * (XL) I/O ASSOC. VBL NAME BASE PTR
14535: * (WA) OFFSET TO NAME
14536: * JSR DTACH CALL FOR DETACH OPERATION
14537: * (XL,XR,WA,WB,WC) DESTROYED
14538: *
14539: DTACH PRC E,0 ENTRY POINT
14540: MOV XL,DTCNB STORE NAME BASE (GBCOL NOT CALLED)
14541: ADD WA,XL POINT TO NAME LOCATION
14542: MOV XL,DTCNM STORE IT
14543: *
14544: * LOOP TO SEARCH FOR I/O TRBLK
14545: *
14546: DTCH1 MOV XL,XR COPY NAME POINTER
14547: *
14548: * CONTINUE AFTER BLOCK DELETION
14549: *
14550: DTCH2 MOV (XL),XL POINT TO NEXT VALUE
14551: BNE (XL),=B$TRT,DTCH6 JUMP AT CHAIN END
14552: MOV TRTYP(XL),WA GET TRAP BLOCK TYPE
14553: BEQ WA,=TRTIN,DTCH3 JUMP IF INPUT
14554: BEQ WA,=TRTOU,DTCH3 JUMP IF OUTPUT
14555: ADD *TRNXT,XL POINT TO NEXT LINK
14556: BRN DTCH1 LOOP
14557: *
14558: * DELETE AN OLD ASSOCIATION
14559: *
14560: DTCH3 MOV TRVAL(XL),(XR) DELETE TRBLK
14561: MOV XL,WA DUMP XL ...
14562: MOV XR,WB ... AND XR
14563: MOV TRTRF(XL),XL POINT TO TRTRF TRAP BLOCK
14564: BZE XL,DTCH5 JUMP IF NO IOCHN
14565: BNE (XL),=B$TRT,DTCH5 JUMP IF INPUT, OUTPUT, TERMINAL
14566: *
14567: * LOOP TO SEARCH IOCHN CHAIN FOR NAME PTR
14568: *
14569: DTCH4 MOV XL,XR REMEMBER LINK PTR
14570: MOV TRTRF(XL),XL POINT TO NEXT LINK
14571: BZE XL,DTCH5 JUMP IF END OF CHAIN
14572: MOV IONMB(XL),WC GET NAME BASE
14573: ADD IONMO(XL),WC ADD OFFSET
14574: BNE WC,DTCNM,DTCH4 LOOP IF NO MATCH
14575: MOV TRTRF(XL),TRTRF(XR) REMOVE NAME FROM CHAIN
14576: EJC
14577: *
14578: * DTACH (CONTINUED)
14579: *
14580: * PREPARE TO RESUME I/O TRBLK SCAN
14581: *
14582: DTCH5 MOV WA,XL RECOVER XL ...
14583: MOV WB,XR ... AND XR
14584: ADD *TRVAL,XL POINT TO VALUE FIELD
14585: BRN DTCH2 CONTINUE
14586: *
14587: * EXIT POINT
14588: *
14589: DTCH6 MOV DTCNB,XR POSSIBLE VRBLK PTR
14590: JSR SETVR RESET VRBLK IF NECESSARY
14591: EXI RETURN
14592: ENP END PROCEDURE DTACH
14593: EJC
14594: *
14595: * DTYPE -- GET DATATYPE NAME
14596: *
14597: * (XR) OBJECT WHOSE DATATYPE IS REQUIRED
14598: * JSR DTYPE CALL TO GET DATATYPE
14599: * (XR) RESULT DATATYPE
14600: *
14601: DTYPE PRC E,0 ENTRY POINT
14602: BEQ (XR),=B$PDT,DTYP1 JUMP IF PROG.DEFINED
14603: MOV (XR),XR LOAD TYPE WORD
14604: LEI XR GET ENTRY POINT ID (BLOCK CODE)
14605: WTB XR CONVERT TO BYTE OFFSET
14606: MOV SCNMT(XR),XR LOAD TABLE ENTRY
14607: EXI EXIT TO DTYPE CALLER
14608: *
14609: * HERE IF PROGRAM DEFINED
14610: *
14611: DTYP1 MOV PDDFP(XR),XR POINT TO DFBLK
14612: MOV DFNAM(XR),XR GET DATATYPE NAME FROM DFBLK
14613: EXI RETURN TO DTYPE CALLER
14614: ENP END PROCEDURE DTYPE
14615: EJC
14616: *
14617: * DUMPR -- PRINT DUMP OF STORAGE
14618: *
14619: * (XR) DUMP ARGUMENT (SEE BELOW)
14620: * JSR DUMPR CALL TO PRINT DUMP
14621: * (XR,XL) DESTROYED
14622: * (WA,WB,WC,RA) DESTROYED
14623: *
14624: * THE DUMP ARGUMENT HAS THE FOLLOWING SIGNIFICANCE
14625: *
14626: * DMARG = 0 NO DUMP PRINTED
14627: * DMARG = 1 PARTIAL DUMP (NAT VARS, KEYWORDS)
14628: * DMARG EQ 2 FULL DUMP (INCL ARRAYS ETC.)
14629: * DMARG GE 3 CORE DUMP
14630: *
14631: * SINCE DUMPR SCRAMBLES STORE, IT IS NOT PERMISSIBLE TO
14632: * COLLECT IN MID-DUMP. HENCE A COLLECT IS DONE INITIALLY
14633: * AND THEN IF STORE RUNS OUT AN ERROR MESSAGE IS PRODUCED.
14634: *
14635: DUMPR PRC E,0 ENTRY POINT
14636: BZE XR,DMP28 SKIP DUMP IF ARGUMENT IS ZERO
14637: BGT XR,=NUM02,DMP29 JUMP IF CORE DUMP REQUIRED
14638: ZER XL CLEAR XL
14639: ZER WB ZERO MOVE OFFSET
14640: MOV XR,DMARG SAVE DUMP ARGUMENT
14641: JSR GBCOL COLLECT GARBAGE
14642: JSR PRTPG EJECT PRINTER
14643: MOV =DMHDV,XR POINT TO HEADING FOR VARIABLES
14644: JSR PRTST PRINT IT
14645: JSR PRTNL TERMINATE PRINT LINE
14646: JSR PRTNL AND PRINT A BLANK LINE
14647: *
14648: * FIRST ALL NATURAL VARIABLE BLOCKS (VRBLK) WHOSE VALUES
14649: * ARE NON-NULL ARE LINKED IN LEXICAL ORDER USING DMVCH AS
14650: * THE CHAIN HEAD AND CHAINING THROUGH THE VRGET FIELDS.
14651: * NOTE THAT THIS SCRAMBLES STORE IF THE PROCESS IS
14652: * INTERRUPTED BEFORE COMPLETION E.G. BY EXCEEDING TIME OR
14653: * PRINT LIMITS. SINCE THE SUBSEQUENT CORE DUMPS AND
14654: * FAILURES IF EXECUTION IS RESUMED ARE VERY CONFUSING, THE
14655: * EXECUTION TIME ERROR ROUTINE CHECKS FOR THIS EVENT AND
14656: * ATTEMPTS AN UNSCRAMBLE. SIMILAR PRECAUTIONS SHOULD BE
14657: * OBSERVED IF TRANSLATE TIME DUMPING IS IMPLEMENTED.
14658: *
14659: ZER DMVCH SET NULL CHAIN TO START
14660: MOV HSHTB,WA POINT TO HASH TABLE
14661: *
14662: * LOOP THROUGH HEADERS IN HASH TABLE
14663: *
14664: DMP00 MOV WA,XR COPY HASH BUCKET POINTER
14665: ICA WA BUMP POINTER
14666: SUB *VRNXT,XR SET OFFSET TO MERGE
14667: *
14668: * LOOP THROUGH VRBLKS ON ONE CHAIN
14669: *
14670: DMP01 MOV VRNXT(XR),XR POINT TO NEXT VRBLK ON CHAIN
14671: BZE XR,DMP09 JUMP IF END OF THIS HASH CHAIN
14672: MOV XR,XL ELSE COPY VRBLK POINTER
14673: EJC
14674: *
14675: * DUMPR (CONTINUED)
14676: *
14677: * LOOP TO FIND VALUE AND SKIP IF NULL
14678: *
14679: DMP02 MOV VRVAL(XL),XL LOAD VALUE
14680: BEQ XL,=NULLS,DMP01 LOOP FOR NEXT VRBLK IF NULL VALUE
14681: BEQ (XL),=B$TRT,DMP02 LOOP BACK IF VALUE IS TRAPPED
14682: *
14683: * NON-NULL VALUE, PREPARE TO SEARCH CHAIN
14684: *
14685: MOV XR,WC SAVE VRBLK POINTER
14686: ADD *VRSOF,XR ADJUST PTR TO BE LIKE SCBLK PTR
14687: BNZ SCLEN(XR),DMP03 JUMP IF NON-SYSTEM VARIABLE
14688: MOV VRSVO(XR),XR ELSE LOAD PTR TO NAME IN SVBLK
14689: *
14690: * HERE WITH NAME POINTER FOR NEW BLOCK IN XR
14691: *
14692: DMP03 MOV XR,WB SAVE POINTER TO CHARS
14693: MOV WA,DMPSV SAVE HASH BUCKET POINTER
14694: MOV =DMVCH,WA POINT TO CHAIN HEAD
14695: *
14696: * LOOP TO SEARCH CHAIN FOR CORRECT INSERTION POINT
14697: *
14698: DMP04 MOV WA,DMPCH SAVE CHAIN POINTER
14699: MOV WA,XL COPY IT
14700: MOV (XL),XR LOAD POINTER TO NEXT ENTRY
14701: BZE XR,DMP08 JUMP IF END OF CHAIN TO INSERT
14702: ADD *VRSOF,XR ELSE GET NAME PTR FOR CHAINED VRBLK
14703: BNZ SCLEN(XR),DMP05 JUMP IF NOT SYSTEM VARIABLE
14704: MOV VRSVO(XR),XR ELSE POINT TO NAME IN SVBLK
14705: *
14706: * HERE PREPARE TO COMPARE THE NAMES
14707: *
14708: * (WA) SCRATCH
14709: * (WB) POINTER TO STRING OF ENTERING VRBLK
14710: * (WC) POINTER TO ENTERING VRBLK
14711: * (XR) POINTER TO STRING OF CURRENT BLOCK
14712: * (XL) SCRATCH
14713: *
14714: DMP05 MOV WB,XL POINT TO ENTERING VRBLK STRING
14715: MOV SCLEN(XL),WA LOAD ITS LENGTH
14716: PLC XL POINT TO CHARS OF ENTERING STRING
14717: BHI WA,SCLEN(XR),DMP06 JUMP IF ENTERING LENGTH HIGH
14718: PLC XR ELSE POINT TO CHARS OF OLD STRING
14719: CMC DMP08,DMP07 COMPARE, INSERT IF NEW IS LLT OLD
14720: BRN DMP08 OR IF LEQ (WE HAD SHORTER LENGTH)
14721: *
14722: * HERE WHEN NEW LENGTH IS LONGER THAN OLD LENGTH
14723: *
14724: DMP06 MOV SCLEN(XR),WA LOAD SHORTER LENGTH
14725: PLC XR POINT TO CHARS OF OLD STRING
14726: CMC DMP08,DMP07 COMPARE, INSERT IF NEW ONE LOW
14727: EJC
14728: *
14729: * DUMPR (CONTINUED)
14730: *
14731: * HERE WE MOVE OUT ON THE CHAIN
14732: *
14733: DMP07 MOV DMPCH,XL COPY CHAIN POINTER
14734: MOV (XL),WA MOVE TO NEXT ENTRY ON CHAIN
14735: BRN DMP04 LOOP BACK
14736: *
14737: * HERE AFTER LOCATING THE PROPER INSERTION POINT
14738: *
14739: DMP08 MOV DMPCH,XL COPY CHAIN POINTER
14740: MOV DMPSV,WA RESTORE HASH BUCKET POINTER
14741: MOV WC,XR RESTORE VRBLK POINTER
14742: MOV (XL),VRGET(XR) LINK VRBLK TO REST OF CHAIN
14743: MOV XR,(XL) LINK VRBLK INTO CURRENT CHAIN LOC
14744: BRN DMP01 LOOP BACK FOR NEXT VRBLK
14745: *
14746: * HERE AFTER PROCESSING ALL VRBLKS ON ONE CHAIN
14747: *
14748: DMP09 BNE WA,HSHTE,DMP00 LOOP BACK IF MORE BUCKETS TO GO
14749: *
14750: * LOOP TO GENERATE DUMP OF NATURAL VARIABLE VALUES
14751: *
14752: DMP10 MOV DMVCH,XR LOAD POINTER TO NEXT ENTRY ON CHAIN
14753: BZE XR,DMP11 JUMP IF END OF CHAIN
14754: MOV (XR),DMVCH ELSE UPDATE CHAIN PTR TO NEXT ENTRY
14755: JSR SETVR RESTORE VRGET FIELD
14756: MOV XR,XL COPY VRBLK POINTER (NAME BASE)
14757: MOV *VRVAL,WA SET OFFSET FOR VRBLK NAME
14758: JSR PRTNV PRINT NAME = VALUE
14759: BRN DMP10 LOOP BACK TILL ALL PRINTED
14760: *
14761: * PREPARE TO PRINT KEYWORDS
14762: *
14763: DMP11 JSR PRTNL PRINT BLANK LINE
14764: JSR PRTNL AND ANOTHER
14765: MOV =DMHDK,XR POINT TO KEYWORD HEADING
14766: JSR PRTST PRINT HEADING
14767: JSR PRTNL END LINE
14768: JSR PRTNL PRINT ONE BLANK LINE
14769: MOV =VDMKW,XL POINT TO LIST OF KEYWORD SVBLK PTRS
14770: EJC
14771: *
14772: * DUMPR (CONTINUED)
14773: *
14774: * LOOP TO DUMP KEYWORD VALUES
14775: *
14776: DMP12 MOV (XL)+,XR LOAD NEXT SVBLK PTR FROM TABLE
14777: BZE XR,DMP13 JUMP IF END OF LIST
14778: MOV =CH$AM,WA LOAD AMPERSAND
14779: JSR PRTCH PRINT AMPERSAND
14780: JSR PRTST PRINT KEYWORD NAME
14781: MOV SVLEN(XR),WA LOAD NAME LENGTH FROM SVBLK
14782: CTB WA,SVCHS GET LENGTH OF NAME
14783: ADD WA,XR POINT TO SVKNM FIELD
14784: MOV (XR),DMPKN STORE IN DUMMY KVBLK
14785: MOV =TMBEB,XR POINT TO BLANK-EQUAL-BLANK
14786: JSR PRTST PRINT IT
14787: MOV XL,DMPSV SAVE TABLE POINTER
14788: MOV =DMPKB,XL POINT TO DUMMY KVBLK
14789: MOV *KVVAR,WA SET ZERO OFFSET
14790: JSR ACESS GET KEYWORD VALUE
14791: PPM FAILURE IS IMPOSSIBLE
14792: JSR PRTVL PRINT KEYWORD VALUE
14793: JSR PRTNL TERMINATE PRINT LINE
14794: MOV DMPSV,XL RESTORE TABLE POINTER
14795: BRN DMP12 LOOP BACK TILL ALL PRINTED
14796: *
14797: * HERE AFTER COMPLETING PARTIAL DUMP
14798: *
14799: DMP13 BEQ DMARG,=NUM01,DMP27 EXIT IF PARTIAL DUMP COMPLETE
14800: MOV DNAMB,XR ELSE POINT TO FIRST DYNAMIC BLOCK
14801: *
14802: * LOOP THROUGH BLOCKS IN DYNAMIC STORAGE
14803: *
14804: DMP14 BEQ XR,DNAMP,DMP27 JUMP IF END OF USED REGION
14805: MOV (XR),WA ELSE LOAD FIRST WORD OF BLOCK
14806: BEQ WA,=B$VCT,DMP16 JUMP IF VECTOR
14807: BEQ WA,=B$ART,DMP17 JUMP IF ARRAY
14808: BEQ WA,=B$PDT,DMP18 JUMP IF PROGRAM DEFINED
14809: BEQ WA,=B$TBT,DMP19 JUMP IF TABLE
14810: BEQ WA,=B$BCT,DMP30 JUMP IF BUFFER
14811: *
14812: * MERGE HERE TO MOVE TO NEXT BLOCK
14813: *
14814: DMP15 JSR BLKLN GET LENGTH OF BLOCK
14815: ADD WA,XR POINT PAST THIS BLOCK
14816: BRN DMP14 LOOP BACK FOR NEXT BLOCK
14817: EJC
14818: *
14819: * DUMPR (CONTINUED)
14820: *
14821: * HERE FOR VECTOR
14822: *
14823: DMP16 MOV *VCVLS,WB SET OFFSET TO FIRST VALUE
14824: BRN DMP19 JUMP TO MERGE
14825: *
14826: * HERE FOR ARRAY
14827: *
14828: DMP17 MOV AROFS(XR),WB SET OFFSET TO ARPRO FIELD
14829: ICA WB BUMP TO GET OFFSET TO VALUES
14830: BRN DMP19 JUMP TO MERGE
14831: *
14832: * HERE FOR PROGRAM DEFINED
14833: *
14834: DMP18 MOV *PDFLD,WB POINT TO VALUES, MERGE
14835: *
14836: * HERE FOR TABLE (OTHERS MERGE)
14837: *
14838: DMP19 BZE IDVAL(XR),DMP15 IGNORE BLOCK IF ZERO ID VALUE
14839: JSR BLKLN ELSE GET BLOCK LENGTH
14840: MOV XR,XL COPY BLOCK POINTER
14841: MOV WA,DMPSV SAVE LENGTH
14842: MOV WB,WA COPY OFFSET TO FIRST VALUE
14843: JSR PRTNL PRINT BLANK LINE
14844: MOV WA,DMPSA PRESERVE OFFSET
14845: JSR PRTVL PRINT BLOCK VALUE (FOR TITLE)
14846: MOV DMPSA,WA RECOVER OFFSET
14847: JSR PRTNL END PRINT LINE
14848: BEQ (XR),=B$TBT,DMP22 JUMP IF TABLE
14849: DCA WA POINT BEFORE FIRST WORD
14850: *
14851: * LOOP TO PRINT CONTENTS OF ARRAY, VECTOR, OR PROGRAM DEF
14852: *
14853: DMP20 MOV XL,XR COPY BLOCK POINTER
14854: ICA WA BUMP OFFSET
14855: ADD WA,XR POINT TO NEXT VALUE
14856: BEQ WA,DMPSV,DMP14 EXIT IF END (XR PAST BLOCK)
14857: SUB *VRVAL,XR SUBTRACT OFFSET TO MERGE INTO LOOP
14858: *
14859: * LOOP TO FIND VALUE AND IGNORE NULLS
14860: *
14861: DMP21 MOV VRVAL(XR),XR LOAD NEXT VALUE
14862: BEQ XR,=NULLS,DMP20 LOOP BACK IF NULL VALUE
14863: BEQ (XR),=B$TRT,DMP21 LOOP BACK IF TRAPPED
14864: JSR PRTNV ELSE PRINT NAME = VALUE
14865: BRN DMP20 LOOP BACK FOR NEXT FIELD
14866: EJC
14867: *
14868: * DUMPR (CONTINUED)
14869: *
14870: * HERE TO DUMP A TABLE
14871: *
14872: DMP22 MOV *TBBUK,WC SET OFFSET TO FIRST BUCKET
14873: MOV *TEVAL,WA SET NAME OFFSET FOR ALL TEBLKS
14874: *
14875: * LOOP THROUGH TABLE BUCKETS
14876: *
14877: DMP23 MOV XL,-(XS) SAVE TBBLK POINTER
14878: ADD WC,XL POINT TO NEXT BUCKET HEADER
14879: ICA WC BUMP BUCKET OFFSET
14880: SUB *TENXT,XL SUBTRACT OFFSET TO MERGE INTO LOOP
14881: *
14882: * LOOP TO PROCESS TEBLKS ON ONE CHAIN
14883: *
14884: DMP24 MOV TENXT(XL),XL POINT TO NEXT TEBLK
14885: BEQ XL,(XS),DMP26 JUMP IF END OF CHAIN
14886: MOV XL,XR ELSE COPY TEBLK POINTER
14887: *
14888: * LOOP TO FIND VALUE AND IGNORE IF NULL
14889: *
14890: DMP25 MOV TEVAL(XR),XR LOAD NEXT VALUE
14891: BEQ XR,=NULLS,DMP24 IGNORE IF NULL VALUE
14892: BEQ (XR),=B$TRT,DMP25 LOOP BACK IF TRAPPED
14893: MOV WC,DMPSV ELSE SAVE OFFSET POINTER
14894: JSR PRTNV PRINT NAME = VALUE
14895: MOV DMPSV,WC RELOAD OFFSET
14896: BRN DMP24 LOOP BACK FOR NEXT TEBLK
14897: *
14898: * HERE TO MOVE TO NEXT HASH CHAIN
14899: *
14900: DMP26 MOV (XS)+,XL RESTORE TBBLK POINTER
14901: BNE WC,TBLEN(XL),DMP23 LOOP BACK IF MORE BUCKETS TO GO
14902: MOV XL,XR ELSE COPY TABLE POINTER
14903: ADD WC,XR POINT TO FOLLOWING BLOCK
14904: BRN DMP14 LOOP BACK TO PROCESS NEXT BLOCK
14905: *
14906: * HERE AFTER COMPLETING DUMP
14907: *
14908: DMP27 JSR PRTPG EJECT PRINTER
14909: *
14910: * MERGE HERE IF NO DUMP GIVEN (DMARG=0)
14911: *
14912: DMP28 EXI RETURN TO DUMP CALLER
14913: *
14914: * CALL SYSTEM CORE DUMP ROUTINE
14915: *
14916: DMP29 JSR SYSDM CALL IT
14917: BRN DMP28 RETURN
14918: EJC
14919: *
14920: * DUMPR (CONTINUED)
14921: *
14922: * HERE TO DUMP BUFFER BLOCK
14923: *
14924: DMP30 JSR PRTNL PRINT BLANK LINE
14925: JSR PRTVL PRINT VALUE ID FOR TITLE
14926: JSR PRTNL FORCE NEW LINE
14927: MOV =CH$DQ,WA LOAD DOUBLE QUOTE
14928: JSR PRTCH PRINT IT
14929: MOV BCLEN(XR),WC LOAD DEFINED LENGTH
14930: BZE WC,DMP32 SKIP CHARACTERS IF NONE
14931: LCT WC,WC LOAD COUNT FOR LOOP
14932: MOV XR,WB SAVE BCBLK PTR
14933: MOV BCBUF(XR),XR POINT TO BFBLK
14934: PLC XR GET SET TO LOAD CHARACTERS
14935: *
14936: * LOOP HERE STUFFING CHARACTERS IN OUTPUT STREAM
14937: *
14938: DMP31 LCH WA,(XR)+ GET NEXT CHARACTER
14939: JSR PRTCH STUFF IT
14940: BCT WC,DMP31 BRANCH FOR NEXT ONE
14941: MOV WB,XR RESTORE BCBLK POINTER
14942: *
14943: * MERGE TO STUFF CLOSING QUOTE MARK
14944: *
14945: DMP32 MOV =CH$DQ,WA STUFF QUOTE
14946: JSR PRTCH PRINT IT
14947: JSR PRTNL PRINT NEW LINE
14948: MOV (XR),WA GET FIRST WD FOR BLKLN
14949: BRN DMP15 MERGE TO GET NEXT BLOCK
14950: ENP END PROCEDURE DUMPR
14951: EJC
14952: *
14953: * ERMSG -- PRINT ERROR CODE AND ERROR MESSAGE
14954: *
14955: * KVERT ERROR CODE
14956: * JSR ERMSG CALL TO PRINT MESSAGE
14957: * (XR,XL,WA,WB,WC,IA) DESTROYED
14958: *
14959: ERMSG PRC E,0 ENTRY POINT
14960: JSR PRTIS PRINT ERROR PTR OR BLANK LINE
14961: MOV KVERT,WA LOAD ERROR CODE
14962: MOV =ERMMS,XR POINT TO ERROR MESSAGE /ERROR/
14963: JSR PRTST PRINT IT
14964: JSR ERTEX GET ERROR MESSAGE TEXT
14965: ADD =THSND,WA BUMP ERROR CODE FOR PRINT
14966: MTI WA FAIL CODE IN INT ACC
14967: JSR PRTIN PRINT CODE (NOW HAVE ERROR1XXX)
14968: MOV PRBUF,XL POINT TO PRINT BUFFER
14969: PSC XL,=NUM05 POINT TO THE 1
14970: MOV =CH$BL,WA LOAD A BLANK
14971: SCH WA,(XL) STORE BLANK OVER 1 (ERROR XXX)
14972: CSC XL COMPLETE STORE CHARACTERS
14973: ZER XL CLEAR GARBAGE POINTER IN XL
14974: MOV XR,WA KEEP ERROR TEXT
14975: MOV =ERMNS,XR POINT TO / -- /
14976: JSR PRTST PRINT IT
14977: MOV WA,XR GET ERROR TEXT AGAIN
14978: JSR PRTST PRINT ERROR MESSAGE TEXT
14979: JSR PRTIS PRINT LINE
14980: JSR PRTIS PRINT BLANK LINE
14981: EXI RETURN TO ERMSG CALLER
14982: ENP END PROCEDURE ERMSG
14983: EJC
14984: *
14985: * ERTEX -- GET ERROR MESSAGE TEXT
14986: *
14987: * (WA) ERROR CODE
14988: * JSR ERTEX CALL TO GET ERROR TEXT
14989: * (XR) PTR TO ERROR TEXT IN DYNAMIC
14990: * (R$ETX) COPY OF PTR TO ERROR TEXT
14991: * (XL,WC,IA) DESTROYED
14992: *
14993: ERTEX PRC E,0 ENTRY POINT
14994: MOV WA,ERTWA SAVE WA
14995: MOV WB,ERTWB SAVE WB
14996: JSR SYSEM GET FAILURE MESSAGE TEXT
14997: MOV XR,XL COPY POINTER TO IT
14998: MOV SCLEN(XR),WA GET LENGTH OF STRING
14999: BZE WA,ERT02 JUMP IF NULL
15000: ZER WB OFFSET OF ZERO
15001: JSR SBSTR COPY INTO DYNAMIC STORE
15002: MOV XR,R$ETX STORE FOR RELOCATION
15003: *
15004: * RETURN
15005: *
15006: ERT01 MOV ERTWB,WB RESTORE WB
15007: MOV ERTWA,WA RESTORE WA
15008: EXI RETURN TO CALLER
15009: *
15010: * RETURN ERRTEXT CONTENTS INSTEAD OF NULL
15011: *
15012: ERT02 MOV R$ETX,XR GET ERRTEXT
15013: BRN ERT01 RETURN
15014: ENP
15015: EJC
15016: *
15017: * EVALI -- EVALUATE INTEGER ARGUMENT
15018: *
15019: * EVALI IS USED BY PATTERN PRIMITIVES LEN,TAB,RTAB,POS,RPOS
15020: * WHEN THEIR ARGUMENT IS AN EXPRESSION VALUE.
15021: *
15022: * (XR) NODE POINTER
15023: * (WB) CURSOR
15024: * JSR EVALI CALL TO EVALUATE INTEGER
15025: * PPM LOC TRANSFER LOC FOR NON-INTEGER ARG
15026: * PPM LOC TRANSFER LOC FOR OUT OF RANGE ARG
15027: * PPM LOC TRANSFER LOC FOR EVALUATION FAILURE
15028: * PPM LOC TRANSFER LOC FOR SUCCESSFUL EVAL
15029: * (THE NORMAL RETURN IS NEVER TAKEN)
15030: * (XR) PTR TO NODE WITH INTEGER ARGUMENT
15031: * (WC,XL,RA) DESTROYED
15032: *
15033: * ON RETURN, THE NODE POINTED TO HAS THE INTEGER ARGUMENT
15034: * IN PARM1 AND THE PROPER SUCCESSOR POINTER IN PTHEN.
15035: * THIS ALLOWS MERGING WITH THE NORMAL (INTEGER ARG) CASE.
15036: *
15037: EVALI PRC R,4 ENTRY POINT (RECURSIVE)
15038: JSR EVALP EVALUATE EXPRESSION
15039: PPM EVLI1 JUMP ON FAILURE
15040: MOV XL,-(XS) STACK RESULT FOR GTSMI
15041: MOV PTHEN(XR),XL LOAD SUCCESSOR POINTER
15042: JSR GTSMI CONVERT ARG TO SMALL INTEGER
15043: PPM EVLI2 JUMP IF NOT INTEGER
15044: PPM EVLI3 JUMP IF OUT OF RANGE
15045: MOV XR,EVLIV STORE RESULT IN SPECIAL DUMMY NODE
15046: MOV XL,EVLIS STORE SUCCESSOR POINTER
15047: MOV =EVLIN,XR POINT TO DUMMY NODE WITH RESULT
15048: EXI 4 TAKE SUCCESSFUL EXIT
15049: *
15050: * HERE IF EVALUATION FAILS
15051: *
15052: EVLI1 EXI 3 TAKE FAILURE RETURN
15053: *
15054: * HERE IF ARGUMENT IS NOT INTEGER
15055: *
15056: EVLI2 EXI 1 TAKE NON-INTEGER ERROR EXIT
15057: *
15058: * HERE IF ARGUMENT IS OUT OF RANGE
15059: *
15060: EVLI3 EXI 2 TAKE OUT-OF-RANGE ERROR EXIT
15061: ENP END PROCEDURE EVALI
15062: EJC
15063: *
15064: * EVALP -- EVALUATE EXPRESSION DURING PATTERN MATCH
15065: *
15066: * EVALP IS USED TO EVALUATE AN EXPRESSION (BY VALUE) DURING
15067: * A PATTERN MATCH. THE EFFECT IS LIKE EVALX, BUT PATTERN
15068: * VARIABLES ARE STACKED AND RESTORED IF NECESSARY.
15069: *
15070: * EVALP ALSO DIFFERS FROM EVALX IN THAT IF THE RESULT IS
15071: * AN EXPRESSION IT IS REEVALUATED. THIS OCCURS REPEATEDLY.
15072: *
15073: * (XR) NODE POINTER
15074: * (WB) PATTERN MATCH CURSOR
15075: * JSR EVALP CALL TO EVALUATE EXPRESSION
15076: * PPM LOC TRANSFER LOC IF EVALUATION FAILS
15077: * (XL) RESULT
15078: * (WA) FIRST WORD OF RESULT BLOCK
15079: * (XR,WB) DESTROYED (FAILURE CASE ONLY)
15080: * (WC,RA) DESTROYED
15081: *
15082: * THE EXPRESSION POINTER IS STORED IN PARM1 OF THE NODE
15083: *
15084: * CONTROL RETURNS TO FAILP ON FAILURE OF EVALUATION
15085: *
15086: EVALP PRC R,1 ENTRY POINT (RECURSIVE)
15087: MOV PARM1(XR),XL LOAD EXPRESSION POINTER
15088: BEQ (XL),=B$EXL,EVLP1 JUMP IF EXBLK CASE
15089: *
15090: * HERE FOR CASE OF SEBLK
15091: *
15092: * WE CAN GIVE A FAST RETURN IF THE VALUE OF THE VRBLK IS
15093: * NOT AN EXPRESSION AND IS NOT TRAPPED.
15094: *
15095: MOV SEVAR(XL),XL LOAD VRBLK POINTER
15096: MOV VRVAL(XL),XL LOAD VALUE OF VRBLK
15097: MOV (XL),WA LOAD FIRST WORD OF VALUE
15098: BHI WA,=B$T$$,EVLP3 JUMP IF NOT SEBLK, TRBLK OR EXBLK
15099: *
15100: * HERE FOR EXBLK OR SEBLK WITH EXPR VALUE OR TRAPPED VALUE
15101: *
15102: EVLP1 MOV XR,-(XS) STACK NODE POINTER
15103: MOV WB,-(XS) STACK CURSOR
15104: MOV R$PMS,-(XS) STACK SUBJECT STRING POINTER
15105: MOV PMSSL,-(XS) STACK SUBJECT STRING LENGTH
15106: MOV PMDFL,-(XS) STACK DOT FLAG
15107: MOV PMHBS,-(XS) STACK HISTORY STACK BASE POINTER
15108: MOV PARM1(XR),XR LOAD EXPRESSION POINTER
15109: EJC
15110: *
15111: * EVALP (CONTINUED)
15112: *
15113: * LOOP BACK HERE TO REEVALUATE EXPRESSION RESULT
15114: *
15115: EVLP2 ZER WB SET FLAG FOR BY VALUE
15116: JSR EVALX EVALUATE EXPRESSION
15117: PPM EVLP4 JUMP ON FAILURE
15118: MOV (XR),WA ELSE LOAD FIRST WORD OF VALUE
15119: BLO WA,=B$E$$,EVLP2 LOOP BACK TO REEVALUATE EXPRESSION
15120: *
15121: * HERE TO RESTORE PATTERN VALUES AFTER SUCCESSFUL EVAL
15122: *
15123: MOV XR,XL COPY RESULT POINTER
15124: MOV (XS)+,PMHBS RESTORE HISTORY STACK BASE POINTER
15125: MOV (XS)+,PMDFL RESTORE DOT FLAG
15126: MOV (XS)+,PMSSL RESTORE SUBJECT STRING LENGTH
15127: MOV (XS)+,R$PMS RESTORE SUBJECT STRING POINTER
15128: MOV (XS)+,WB RESTORE CURSOR
15129: MOV (XS)+,XR RESTORE NODE POINTER
15130: *
15131: * COMMON EXIT POINT
15132: *
15133: EVLP3 EXI RETURN TO EVALP CALLER
15134: *
15135: * HERE FOR FAILURE DURING EVALUATION
15136: *
15137: EVLP4 MOV (XS)+,PMHBS RESTORE HISTORY STACK BASE POINTER
15138: MOV (XS)+,PMDFL RESTORE DOT FLAG
15139: MOV (XS)+,PMSSL RESTORE SUBJECT STRING LENGTH
15140: MOV (XS)+,R$PMS RESTORE SUBJECT STRING POINTER
15141: ADD *NUM02,XS REMOVE NODE PTR, CURSOR
15142: EXI 1 TAKE FAILURE EXIT
15143: ENP END PROCEDURE EVALP
15144: EJC
15145: *
15146: * EVALS -- EVALUATE STRING ARGUMENT
15147: *
15148: * EVALS IS USED BY SPAN, ANY, NOTANY, BREAK, BREAKX WHEN
15149: * THEY ARE PASSED AN EXPRESSION ARGUMENT.
15150: *
15151: * (XR) NODE POINTER
15152: * (WB) CURSOR
15153: * JSR EVALS CALL TO EVALUATE STRING
15154: * PPM LOC TRANSFER LOC FOR NON-STRING ARG
15155: * PPM LOC TRANSFER LOC FOR EVALUATION FAILURE
15156: * PPM LOC TRANSFER LOC FOR SUCCESSFUL EVAL
15157: * (THE NORMAL RETURN IS NEVER TAKEN)
15158: * (XR) PTR TO NODE WITH PARMS SET
15159: * (XL,WC,RA) DESTROYED
15160: *
15161: * ON RETURN, THE NODE POINTED TO HAS A CHARACTER TABLE
15162: * POINTER IN PARM1 AND A BIT MASK IN PARM2. THE PROPER
15163: * SUCCESSOR IS STORED IN PTHEN OF THIS NODE. THUS IT IS
15164: * OK FOR MERGING WITH THE NORMAL (MULTI-CHAR STRING) CASE.
15165: *
15166: EVALS PRC R,3 ENTRY POINT (RECURSIVE)
15167: JSR EVALP EVALUATE EXPRESSION
15168: PPM EVLS1 JUMP IF EVALUATION FAILS
15169: MOV PTHEN(XR),-(XS) SAVE SUCCESSOR POINTER
15170: MOV WB,-(XS) SAVE CURSOR
15171: MOV XL,-(XS) STACK RESULT PTR FOR PATST
15172: ZER WB DUMMY PCODE FOR ONE CHAR STRING
15173: ZER WC DUMMY PCODE FOR EXPRESSION ARG
15174: MOV =P$BRK,XL APPROPRIATE PCODE FOR OUR USE
15175: JSR PATST CALL ROUTINE TO BUILD NODE
15176: PPM EVLS2 JUMP IF NOT STRING
15177: MOV (XS)+,WB RESTORE CURSOR
15178: MOV (XS)+,PTHEN(XR) STORE SUCCESSOR POINTER
15179: EXI 3 TAKE SUCCESS RETURN
15180: *
15181: * HERE IF EVALUATION FAILS
15182: *
15183: EVLS1 EXI 2 TAKE FAILURE RETURN
15184: *
15185: * HERE IF ARGUMENT IS NOT STRING
15186: *
15187: EVLS2 ADD *NUM02,XS POP SUCCESSOR AND CURSOR
15188: EXI 1 TAKE NON-STRING ERROR EXIT
15189: ENP END PROCEDURE EVALS
15190: EJC
15191: *
15192: * EVALX -- EVALUATE EXPRESSION
15193: *
15194: * EVALX IS CALLED TO EVALUATE AN EXPRESSION
15195: *
15196: * (XR) POINTER TO EXBLK OR SEBLK
15197: * (WB) 0 IF BY VALUE, 1 IF BY NAME
15198: * JSR EVALX CALL TO EVALUATE EXPRESSION
15199: * PPM LOC TRANSFER LOC IF EVALUATION FAILS
15200: * (XR) RESULT IF CALLED BY VALUE
15201: * (XL,WA) RESULT NAME BASE,OFFSET IF BY NAME
15202: * (XR) DESTROYED (NAME CASE ONLY)
15203: * (XL,WA) DESTROYED (VALUE CASE ONLY)
15204: * (WB,WC,RA) DESTROYED
15205: *
15206: EVALX PRC R,1 ENTRY POINT, RECURSIVE
15207: BEQ (XR),=B$EXL,EVLX2 JUMP IF EXBLK CASE
15208: *
15209: * HERE FOR SEBLK
15210: *
15211: MOV SEVAR(XR),XL LOAD VRBLK POINTER (NAME BASE)
15212: MOV *VRVAL,WA SET NAME OFFSET
15213: BNZ WB,EVLX1 JUMP IF CALLED BY NAME
15214: JSR ACESS CALL ROUTINE TO ACCESS VALUE
15215: PPM EVLX9 JUMP IF FAILURE ON ACCESS
15216: *
15217: * MERGE HERE TO EXIT FOR SEBLK CASE
15218: *
15219: EVLX1 EXI RETURN TO EVALX CALLER
15220: EJC
15221: *
15222: * EVALX (CONTINUED)
15223: *
15224: * HERE FOR FULL EXPRESSION (EXBLK) CASE
15225: *
15226: * IF AN ERROR OCCURS IN THE EXPRESSION CODE AT EXECUTION
15227: * TIME, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
15228: * WITHOUT RETURNING TO THIS ROUTINE.
15229: * THE FOLLOWING ENTRIES ARE MADE ON THE STACK BEFORE
15230: * GIVING CONTROL TO THE EXPRESSION CODE
15231: *
15232: * EVALX RETURN POINT
15233: * SAVED VALUE OF R$COD
15234: * CODE POINTER (-R$COD)
15235: * SAVED VALUE OF FLPTR
15236: * 0 IF BY VALUE, 1 IF BY NAME
15237: * FLPTR --------------- *EXFLC, FAIL OFFSET IN EXBLK
15238: *
15239: EVLX2 SCP WC GET CODE POINTER
15240: MOV R$COD,WA LOAD CODE BLOCK POINTER
15241: SUB WA,WC GET CODE POINTER AS OFFSET
15242: MOV WA,-(XS) STACK OLD CODE BLOCK POINTER
15243: MOV WC,-(XS) STACK RELATIVE CODE OFFSET
15244: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER
15245: MOV WB,-(XS) STACK NAME/VALUE INDICATOR
15246: MOV *EXFLC,-(XS) STACK NEW FAIL OFFSET
15247: MOV FLPTR,GTCEF KEEP IN CASE OF ERROR
15248: MOV R$COD,R$GTC KEEP CODE BLOCK POINTER SIMILARLY
15249: MOV XS,FLPTR SET NEW FAILURE POINTER
15250: MOV XR,R$COD SET NEW CODE BLOCK POINTER
15251: MOV KVSTN,EXSTM(XR) REMEMBER STMNT NUMBER
15252: ADD *EXCOD,XR POINT TO FIRST CODE WORD
15253: LCP XR SET CODE POINTER
15254: BNE STAGE,=STGXT,EXITS JUMP IF NOT EXECUTION TIME
15255: MOV =STGEE,STAGE EVALUATING EXPRESSION
15256: BRN EXITS JUMP TO EXECUTE FIRST CODE WORD
15257: EJC
15258: *
15259: * EVALX (CONTINUED)
15260: *
15261: * COME HERE IF SUCCESSFUL RETURN BY VALUE (SEE O$RVL)
15262: *
15263: EVLX3 MOV (XS)+,XR LOAD VALUE
15264: BZE 1(XS),EVLX5 JUMP IF CALLED BY VALUE
15265: ERB 249,EXPRESSION EVALUATED BY NAME RETURNED VALUE
15266: *
15267: * HERE FOR EXPRESSION RETURNING BY NAME (SEE O$RNM)
15268: *
15269: EVLX4 MOV (XS)+,WA LOAD NAME OFFSET
15270: MOV (XS)+,XL LOAD NAME BASE
15271: BNZ 1(XS),EVLX5 JUMP IF CALLED BY NAME
15272: JSR ACESS ELSE ACCESS VALUE FIRST
15273: PPM EVLX6 JUMP IF FAILURE DURING ACCESS
15274: *
15275: * HERE AFTER LOADING CORRECT RESULT INTO XR OR XL,WA
15276: *
15277: EVLX5 ZER WB NOTE SUCCESSFUL
15278: BRN EVLX7 MERGE
15279: *
15280: * HERE FOR FAILURE IN EXPRESSION EVALUATION (SEE O$FEX)
15281: *
15282: EVLX6 MNZ WB NOTE UNSUCCESSFUL
15283: *
15284: * RESTORE ENVIRONMENT
15285: *
15286: EVLX7 BNE STAGE,=STGEE,EVLX8 SKIP IF WAS NOT PREVIOUSLY XT
15287: MOV =STGXT,STAGE EXECUTE TIME
15288: *
15289: * MERGE WITH STAGE SET UP
15290: *
15291: EVLX8 ADD *NUM02,XS POP NAME/VALUE INDICATOR, *EXFAL
15292: MOV (XS)+,FLPTR RESTORE OLD FAILURE POINTER
15293: MOV (XS)+,WC LOAD CODE OFFSET
15294: ADD (XS),WC MAKE CODE POINTER ABSOLUTE
15295: MOV (XS)+,R$COD RESTORE OLD CODE BLOCK POINTER
15296: LCP WC RESTORE OLD CODE POINTER
15297: BZE WB,EVLX1 JUMP FOR SUCCESSFUL RETURN
15298: *
15299: * MERGE HERE FOR FAILURE IN SEBLK CASE
15300: *
15301: EVLX9 EXI 1 TAKE FAILURE EXIT
15302: ENP END OF PROCEDURE EVALX
15303: EJC
15304: *
15305: * EXBLD -- BUILD EXBLK
15306: *
15307: * EXBLD IS USED TO BUILD AN EXPRESSION BLOCK FROM THE
15308: * CODE COMPILED MOST RECENTLY IN THE CURRENT CCBLK.
15309: *
15310: * (XL) OFFSET IN CCBLK TO START OF CODE
15311: * (WB) INTEGER IN RANGE 0 LE N LE MXLEN
15312: * JSR EXBLD CALL TO BUILD EXBLK
15313: * (XR) PTR TO CONSTRUCTED EXBLK
15314: * (WA,WB,XL) DESTROYED
15315: *
15316: EXBLD PRC E,0 ENTRY POINT
15317: MOV XL,WA COPY OFFSET TO START OF CODE
15318: SUB *EXCOD,WA CALC REDUCTION IN OFFSET IN EXBLK
15319: MOV WA,-(XS) STACK FOR LATER
15320: MOV CWCOF,WA LOAD FINAL OFFSET
15321: SUB XL,WA COMPUTE LENGTH OF CODE
15322: ADD *EXSI$,WA ADD SPACE FOR STANDARD FIELDS
15323: JSR ALLOC ALLOCATE SPACE FOR EXBLK
15324: MOV XR,-(XS) SAVE POINTER TO EXBLK
15325: MOV =B$EXL,EXTYP(XR) STORE TYPE WORD
15326: ZER EXSTM(XR) ZEROISE STMNT NUMBER FIELD
15327: MOV WA,EXLEN(XR) STORE LENGTH
15328: MOV =OFEX$,EXFLC(XR) STORE FAILURE WORD
15329: ADD *EXSI$,XR SET XR FOR SYSMW
15330: MOV XL,CWCOF RESET OFFSET TO START OF CODE
15331: ADD R$CCB,XL POINT TO START OF CODE
15332: SUB *EXSI$,WA LENGTH OF CODE TO MOVE
15333: MOV WA,-(XS) STACK LENGTH OF CODE
15334: MVW MOVE CODE TO EXBLK
15335: MOV (XS)+,WA GET LENGTH OF CODE
15336: BTW WA CONVERT BYTE COUNT TO WORD COUNT
15337: LCT WA,WA PREPARE COUNTER FOR LOOP
15338: MOV (XS),XL COPY EXBLK PTR, DONT UNSTACK
15339: ADD *EXCOD,XL POINT TO CODE ITSELF
15340: MOV 1(XS),WB GET REDUCTION IN OFFSET
15341: *
15342: * THIS LOOP SEARCHES FOR NEGATION AND SELECTION CODE SO
15343: * THAT THE OFFSETS COMPUTED WHILST CODE WAS IN CODE BLOCK
15344: * CAN BE TRANSFORMED TO REDUCED VALUES APPLICABLE IN AN
15345: * EXBLK.
15346: *
15347: EXBL1 MOV (XL)+,XR GET NEXT CODE WORD
15348: BEQ XR,=OSLA$,EXBL3 JUMP IF SELECTION FOUND
15349: BEQ XR,=ONTA$,EXBL3 JUMP IF NEGATION FOUND
15350: BCT WA,EXBL1 LOOP TO END OF CODE
15351: *
15352: * NO SELECTION FOUND OR MERGE TO EXIT ON TERMINATION
15353: *
15354: EXBL2 MOV (XS)+,XR POP EXBLK PTR INTO XR
15355: MOV (XS)+,XL POP REDUCTION CONSTANT
15356: EXI RETURN TO CALLER
15357: EJC
15358: *
15359: * EXBLD (CONTINUED)
15360: *
15361: * SELECTION OR NEGATION FOUND
15362: * REDUCE THE OFFSETS AS NEEDED. OFFSETS OCCUR IN WORDS
15363: * FOLLOWING CODE WORDS -
15364: * =ONTA$, =OSLA$, =OSLB$, =OSLC$
15365: *
15366: EXBL3 SUB WB,(XL)+ ADJUST OFFSET
15367: BCT WA,EXBL4 DECREMENT COUNT
15368: *
15369: EXBL4 BCT WA,EXBL5 DECREMENT COUNT
15370: *
15371: * CONTINUE SEARCH FOR MORE OFFSETS
15372: *
15373: EXBL5 MOV (XL)+,XR GET NEXT CODE WORD
15374: BEQ XR,=OSLA$,EXBL3 JUMP IF OFFSET FOUND
15375: BEQ XR,=OSLB$,EXBL3 JUMP IF OFFSET FOUND
15376: BEQ XR,=OSLC$,EXBL3 JUMP IF OFFSET FOUND
15377: BEQ XR,=ONTA$,EXBL3 JUMP IF OFFSET FOUND
15378: BCT WA,EXBL5 LOOP
15379: BRN EXBL2 MERGE TO RETURN
15380: ENP END PROCEDURE EXBLD
15381: EJC
15382: *
15383: * EXPAN -- ANALYZE EXPRESSION
15384: *
15385: * THE EXPRESSION ANALYZER (EXPAN) PROCEDURE IS USED TO SCAN
15386: * AN EXPRESSION AND CONVERT IT INTO A TREE REPRESENTATION.
15387: * SEE DESCRIPTIONS OF CMBLK, CUBLK, CBBLK IN THE STRUCTURES
15388: * SECTION FOR DETAILED FORMAT OF TREE BLOCKS.
15389: *
15390: * THE ANALYZER USES A SIMPLE PRECEDENCE SCHEME IN WHICH
15391: * OPERANDS AND OPERATORS ARE PLACED ON A SINGLE STACK
15392: * AND CONDENSATIONS ARE MADE WHEN LOW PRECEDENCE OPERATORS
15393: * ARE STACKED AFTER A HIGHER PRECEDENCE OPERATOR. A GLOBAL
15394: * VARIABLE (IN WB) KEEPS TRACK OF THE LEVEL AS FOLLOWS.
15395: *
15396: * 0 SCANNING OUTER LEVEL OF STATEMENT OR EXPRESSION
15397: * 1 SCANNING OUTER LEVEL OF NORMAL GOTO
15398: * 2 SCANNING OUTER LEVEL OF DIRECT GOTO
15399: * 3 SCANNING INSIDE ARRAY BRACKETS
15400: * 4 SCANNING INSIDE GROUPING PARENTHESES
15401: * 5 SCANNING INSIDE FUNCTION PARENTHESES
15402: *
15403: * THIS VARIABLE IS SAVED ON THE STACK ON ENCOUNTERING A
15404: * GROUPING AND RESTORED AT THE END OF THE GROUPING.
15405: *
15406: * ANOTHER GLOBAL VARIABLE (IN WC) COUNTS THE NUMBER OF
15407: * ITEMS AT ONE GROUPING LEVEL AND IS INCREMENTED FOR EACH
15408: * COMMA ENCOUNTERED. IT IS STACKED WITH THE LEVEL INDICATOR
15409: *
15410: * THE SCAN IS CONTROLLED BY A THREE STATE FINITE MACHINE.
15411: * A GLOBAL VARIABLE STORED IN WA IS THE CURRENT STATE.
15412: *
15413: * WA=0 NOTHING SCANNED AT THIS LEVEL
15414: * WA=1 OPERAND EXPECTED
15415: * WA=2 OPERATOR EXPECTED
15416: *
15417: * (WB) CALL TYPE (SEE BELOW)
15418: * JSR EXPAN CALL TO ANALYZE EXPRESSION
15419: * (XR) POINTER TO RESULTING TREE
15420: * (XL,WA,WB,WC,RA) DESTROYED
15421: *
15422: * THE ENTRY VALUE OF WB INDICATES THE CALL TYPE AS FOLLOWS.
15423: *
15424: * 0 SCANNING EITHER THE MAIN BODY OF A STATEMENT OR THE
15425: * TEXT OF AN EXPRESSION (FROM EVAL CALL). VALID
15426: * TERMINATORS ARE COLON, SEMICOLON. THE RESCAN FLAG IS
15427: * SET TO RETURN THE TERMINATOR ON THE NEXT SCANE CALL.
15428: *
15429: * 1 SCANNING A NORMAL GOTO. THE ONLY VALID
15430: * TERMINATOR IS A RIGHT PAREN.
15431: *
15432: * 2 SCANNING A DIRECT GOTO. THE ONLY VALID
15433: * TERMINATOR IS A RIGHT BRACKET.
15434: EJC
15435: *
15436: * EXPAN (CONTINUED)
15437: *
15438: * ENTRY POINT
15439: *
15440: EXPAN PRC E,0 ENTRY POINT
15441: ZER -(XS) SET TOP OF STACK INDICATOR
15442: ZER WA SET INITIAL STATE TO ZERO
15443: ZER WC ZERO COUNTER VALUE
15444: *
15445: * LOOP HERE FOR SUCCESSIVE ENTRIES
15446: *
15447: EXP01 JSR SCANE SCAN NEXT ELEMENT
15448: ADD WA,XL ADD STATE TO SYNTAX CODE
15449: BSW XL,T$NES SWITCH ON ELEMENT TYPE/STATE
15450: IFF T$VA0,EXP03 VARIABLE, S=0
15451: IFF T$VA1,EXP03 VARIABLE, STATE ONE
15452: IFF T$VA2,EXP04 VARIABLE, S=2
15453: IFF T$CO0,EXP03 CONSTANT, S=0
15454: IFF T$CO1,EXP03 CONSTANT, S=1
15455: IFF T$CO2,EXP04 CONSTANT, S=2
15456: IFF T$LP0,EXP06 LEFT PAREN, S=0
15457: IFF T$LP1,EXP06 LEFT PAREN, S=1
15458: IFF T$LP2,EXP04 LEFT PAREN, S=2
15459: IFF T$FN0,EXP10 FUNCTION, S=0
15460: IFF T$FN1,EXP10 FUNCTION, S=1
15461: IFF T$FN2,EXP04 FUNCTION, S=2
15462: IFF T$RP0,EXP02 RIGHT PAREN, S=0
15463: IFF T$RP1,EXP05 RIGHT PAREN, S=1
15464: IFF T$RP2,EXP12 RIGHT PAREN, S=2
15465: IFF T$LB0,EXP08 LEFT BRKT, S=0
15466: IFF T$LB1,EXP08 LEFT BRKT, S=1
15467: IFF T$LB2,EXP09 LEFT BRKT, S=2
15468: IFF T$RB0,EXP02 RIGHT BRKT, S=0
15469: IFF T$RB1,EXP05 RIGHT BRKT, S=1
15470: IFF T$RB2,EXP18 RIGHT BRKT, S=2
15471: IFF T$UO0,EXP27 UNOP, S=0
15472: IFF T$UO1,EXP27 UNOP, S=1
15473: IFF T$UO2,EXP04 UNOP, S=2
15474: IFF T$BO0,EXP05 BINOP, S=0
15475: IFF T$BO1,EXP05 BINOP, S=1
15476: IFF T$BO2,EXP26 BINOP, S=2
15477: IFF T$CM0,EXP02 COMMA, S=0
15478: IFF T$CM1,EXP05 COMMA, S=1
15479: IFF T$CM2,EXP11 COMMA, S=2
15480: IFF T$CL0,EXP02 COLON, S=0
15481: IFF T$CL1,EXP05 COLON, S=1
15482: IFF T$CL2,EXP19 COLON, S=2
15483: IFF T$SM0,EXP02 SEMICOLON, S=0
15484: IFF T$SM1,EXP05 SEMICOLON, S=1
15485: IFF T$SM2,EXP19 SEMICOLON, S=2
15486: ESW END SWITCH ON ELEMENT TYPE/STATE
15487: EJC
15488: *
15489: * EXPAN (CONTINUED)
15490: *
15491: * HERE FOR RBR,RPR,COL,SMC,CMA IN STATE 0
15492: *
15493: * SET TO RESCAN THE TERMINATOR ENCOUNTERED AND CREATE
15494: * A NULL CONSTANT (CASE OF OMITTED NULL)
15495: *
15496: EXP02 MNZ SCNRS SET TO RESCAN ELEMENT
15497: MOV =NULLS,XR POINT TO NULL, MERGE
15498: *
15499: * HERE FOR VAR OR CON IN STATES 0,1
15500: *
15501: * STACK THE VARIABLE/CONSTANT AND SET STATE=2
15502: *
15503: EXP03 MOV XR,-(XS) STACK POINTER TO OPERAND
15504: MOV =NUM02,WA SET STATE 2
15505: BRN EXP01 JUMP FOR NEXT ELEMENT
15506: *
15507: * HERE FOR VAR,CON,LPR,FNC,UOP IN STATE 2
15508: *
15509: * WE RESCAN THE ELEMENT AND CREATE A CONCATENATION OPERATOR
15510: * THIS IS THE CASE OF THE BLANK CONCATENATION OPERATOR.
15511: *
15512: EXP04 MNZ SCNRS SET TO RESCAN ELEMENT
15513: MOV =OPDVC,XR POINT TO CONCAT OPERATOR DV
15514: BZE WB,EXP4A OK IF AT TOP LEVEL
15515: MOV =OPDVP,XR ELSE POINT TO UNMISTAKABLE CONCAT.
15516: *
15517: * MERGE HERE WHEN XR SET UP WITH PROPER CONCATENATION DVBLK
15518: *
15519: EXP4A BNZ SCNBL,EXP26 MERGE BOP IF BLANKS, ELSE ERROR
15520: DCV SCNSE ADJUST START OF ELEMENT LOCATION
15521: ERB 220,SYNTAX ERROR. MISSING OPERATOR
15522: *
15523: * HERE FOR CMA,RPR,RBR,COL,SMC,BOP(S=1) BOP(S=0)
15524: *
15525: * THIS IS AN ERRONOUS CONTRUCTION
15526: *
15527: EXP05 DCV SCNSE ADJUST START OF ELEMENT LOCATION
15528: ERB 221,SYNTAX ERROR. MISSING OPERAND
15529: *
15530: * HERE FOR LPR (S=0,1)
15531: *
15532: EXP06 MOV =NUM04,XL SET NEW LEVEL INDICATOR
15533: ZER XR SET ZERO VALUE FOR CMOPN
15534: EJC
15535: *
15536: * EXPAN (CONTINUED)
15537: *
15538: * MERGE HERE TO STORE OLD LEVEL ON STACK AND START NEW ONE
15539: *
15540: EXP07 MOV XR,-(XS) STACK CMOPN VALUE
15541: MOV WC,-(XS) STACK OLD COUNTER
15542: MOV WB,-(XS) STACK OLD LEVEL INDICATOR
15543: CHK CHECK FOR STACK OVERFLOW
15544: ZER WA SET NEW STATE TO ZERO
15545: MOV XL,WB SET NEW LEVEL INDICATOR
15546: MOV =NUM01,WC INITIALIZE NEW COUNTER
15547: BRN EXP01 JUMP TO SCAN NEXT ELEMENT
15548: *
15549: * HERE FOR LBR (S=0,1)
15550: *
15551: * THIS IS AN ILLEGAL USE OF LEFT BRACKET
15552: *
15553: EXP08 ERB 222,SYNTAX ERROR. INVALID USE OF LEFT BRACKET
15554: *
15555: * HERE FOR LBR (S=2)
15556: *
15557: * SET NEW LEVEL AND START TO SCAN SUBSCRIPTS
15558: *
15559: EXP09 MOV (XS)+,XR LOAD ARRAY PTR FOR CMOPN
15560: MOV =NUM03,XL SET NEW LEVEL INDICATOR
15561: BRN EXP07 JUMP TO STACK OLD AND START NEW
15562: *
15563: * HERE FOR FNC (S=0,1)
15564: *
15565: * STACK OLD LEVEL AND START TO SCAN ARGUMENTS
15566: *
15567: EXP10 MOV =NUM05,XL SET NEW LEV INDIC (XR=VRBLK=CMOPN)
15568: BRN EXP07 JUMP TO STACK OLD AND START NEW
15569: *
15570: * HERE FOR CMA (S=2)
15571: *
15572: * INCREMENT ARGUMENT COUNT AND CONTINUE
15573: *
15574: EXP11 ICV WC INCREMENT COUNTER
15575: JSR EXPDM DUMP OPERATORS AT THIS LEVEL
15576: ZER -(XS) SET NEW LEVEL FOR PARAMETER
15577: ZER WA SET NEW STATE
15578: BGT WB,=NUM02,EXP01 LOOP BACK UNLESS OUTER LEVEL
15579: ERB 223,SYNTAX ERROR. INVALID USE OF COMMA
15580: EJC
15581: *
15582: * EXPAN (CONTINUED)
15583: *
15584: * HERE FOR RPR (S=2)
15585: *
15586: * AT OUTER LEVEL IN A NORMAL GOTO THIS IS A TERMINATOR
15587: * OTHERWISE IT MUST TERMINATE A FUNCTION OR GROUPING
15588: *
15589: EXP12 BEQ WB,=NUM01,EXP20 END OF NORMAL GOTO
15590: BEQ WB,=NUM05,EXP13 END OF FUNCTION ARGUMENTS
15591: BEQ WB,=NUM04,EXP14 END OF GROUPING / SELECTION
15592: ERB 224,SYNTAX ERROR. UNBALANCED RIGHT PARENTHESIS
15593: *
15594: * HERE AT END OF FUNCTION ARGUMENTS
15595: *
15596: EXP13 MOV =C$FNC,XL SET CMTYP VALUE FOR FUNCTION
15597: BRN EXP15 JUMP TO BUILD CMBLK
15598: *
15599: * HERE FOR END OF GROUPING
15600: *
15601: EXP14 BEQ WC,=NUM01,EXP17 JUMP IF END OF GROUPING
15602: MOV =C$SEL,XL ELSE SET CMTYP FOR SELECTION
15603: *
15604: * MERGE HERE TO BUILD CMBLK FOR LEVEL JUST SCANNED AND
15605: * TO POP UP TO THE PREVIOUS SCAN LEVEL BEFORE CONTINUING.
15606: *
15607: EXP15 JSR EXPDM DUMP OPERATORS AT THIS LEVEL
15608: MOV WC,WA COPY COUNT
15609: ADD =CMVLS,WA ADD FOR STANDARD FIELDS AT START
15610: WTB WA CONVERT LENGTH TO BYTES
15611: JSR ALLOC ALLOCATE SPACE FOR CMBLK
15612: MOV =B$CMT,(XR) STORE TYPE CODE FOR CMBLK
15613: MOV XL,CMTYP(XR) STORE CMBLK NODE TYPE INDICATOR
15614: MOV WA,CMLEN(XR) STORE LENGTH
15615: ADD WA,XR POINT PAST END OF BLOCK
15616: LCT WC,WC SET LOOP COUNTER
15617: *
15618: * LOOP TO MOVE REMAINING WORDS TO CMBLK
15619: *
15620: EXP16 MOV (XS)+,-(XR) MOVE ONE OPERAND PTR FROM STACK
15621: MOV (XS)+,WB POP TO OLD LEVEL INDICATOR
15622: BCT WC,EXP16 LOOP TILL ALL MOVED
15623: EJC
15624: *
15625: * EXPAN (CONTINUED)
15626: *
15627: * COMPLETE CMBLK AND STACK POINTER TO IT ON STACK
15628: *
15629: SUB *CMVLS,XR POINT BACK TO START OF BLOCK
15630: MOV (XS)+,WC RESTORE OLD COUNTER
15631: MOV (XS),CMOPN(XR) STORE OPERAND PTR IN CMBLK
15632: MOV XR,(XS) STACK CMBLK POINTER
15633: MOV =NUM02,WA SET NEW STATE
15634: BRN EXP01 BACK FOR NEXT ELEMENT
15635: *
15636: * HERE AT END OF A PARENTHESIZED EXPRESSION
15637: *
15638: EXP17 JSR EXPDM DUMP OPERATORS AT THIS LEVEL
15639: MOV (XS)+,XR RESTORE XR
15640: MOV (XS)+,WB RESTORE OUTER LEVEL
15641: MOV (XS)+,WC RESTORE OUTER COUNT
15642: MOV XR,(XS) STORE OPND OVER UNUSED CMOPN VAL
15643: MOV =NUM02,WA SET NEW STATE
15644: BRN EXP01 BACK FOR NEXT ELE8ENT
15645: *
15646: * HERE FOR RBR (S=2)
15647: *
15648: * AT OUTER LEVEL IN A DIRECT GOTO, THIS IS A TERMINATOR.
15649: * OTHERWISE IT MUST TERMINATE A SUBSCRIPT LIST.
15650: *
15651: EXP18 MOV =C$ARR,XL SET CMTYP FOR ARRAY REFERENCE
15652: BEQ WB,=NUM03,EXP15 JUMP TO BUILD CMBLK IF END ARRAYREF
15653: BEQ WB,=NUM02,EXP20 JUMP IF END OF DIRECT GOTO
15654: ERB 225,SYNTAX ERROR. UNBALANCED RIGHT BRACKET
15655: EJC
15656: *
15657: * EXPAN (CONTINUED)
15658: *
15659: * HERE FOR COL,SMC (S=2)
15660: *
15661: * ERROR UNLESS TERMINATING STATEMENT BODY AT OUTER LEVEL
15662: *
15663: EXP19 MNZ SCNRS RESCAN TERMINATOR
15664: MOV WB,XL COPY LEVEL INDICATOR
15665: BSW XL,6 SWITCH ON LEVEL INDICATOR
15666: IFF 0,EXP20 NORMAL OUTER LEVEL
15667: IFF 1,EXP22 FAIL IF NORMAL GOTO
15668: IFF 2,EXP23 FAIL IF DIRECT GOTO
15669: IFF 3,EXP24 FAIL ARRAY BRACKETS
15670: IFF 4,EXP21 FAIL IF IN GROUPING
15671: IFF 5,EXP21 FAIL FUNCTION ARGS
15672: ESW END SWITCH ON LEVEL
15673: *
15674: * HERE AT NORMAL END OF EXPRESSION
15675: *
15676: EXP20 JSR EXPDM DUMP REMAINING OPERATORS
15677: MOV (XS)+,XR LOAD TREE POINTER
15678: ICA XS POP OFF BOTTOM OF STACK MARKER
15679: EXI RETURN TO EXPAN CALLER
15680: *
15681: * MISSING RIGHT PAREN
15682: *
15683: EXP21 ERB 226,SYNTAX ERROR. MISSING RIGHT PAREN
15684: *
15685: * MISSING RIGHT PAREN IN GOTO FIELD
15686: *
15687: EXP22 ERB 227,SYNTAX ERROR. RIGHT PAREN MISSING FROM GOTO
15688: *
15689: * MISSING BRACKET IN GOTO
15690: *
15691: EXP23 ERB 228,SYNTAX ERROR. RIGHT BRACKET MISSING FROM GOTO
15692: *
15693: * MISSING ARRAY BRACKET
15694: *
15695: EXP24 ERB 229,SYNTAX ERROR. MISSING RIGHT ARRAY BRACKET
15696: EJC
15697: *
15698: * EXPAN (CONTINUED)
15699: *
15700: * LOOP HERE WHEN AN OPERATOR CAUSES AN OPERATOR DUMP
15701: *
15702: EXP25 MOV XR,EXPSV
15703: JSR EXPOP POP ONE OPERATOR
15704: MOV EXPSV,XR RESTORE OP DV POINTER AND MERGE
15705: *
15706: * HERE FOR BOP (S=2)
15707: *
15708: * REMOVE OPERATORS (CONDENSE) FROM STACK UNTIL NO MORE
15709: * LEFT AT THIS LEVEL OR TOP ONE HAS LOWER PRECEDENCE.
15710: * LOOP HERE TILL THIS CONDITION IS MET.
15711: *
15712: EXP26 MOV 1(XS),XL LOAD OPERATOR DVPTR FROM STACK
15713: BLE XL,=NUM05,EXP27 JUMP IF BOTTOM OF STACK LEVEL
15714: BLT DVRPR(XR),DVLPR(XL),EXP25 ELSE POP IF NEW PREC IS LO
15715: *
15716: * HERE FOR UOP (S=0,1)
15717: *
15718: * BINARY OPERATOR MERGES AFTER PRECEDENCE CHECK
15719: *
15720: * THE OPERATOR DV IS STORED ON THE STACK AND THE SCAN
15721: * CONTINUES AFTER SETTING THE SCAN STATE TO ONE.
15722: *
15723: EXP27 MOV XR,-(XS) STACK OPERATOR DVPTR ON STACK
15724: CHK CHECK FOR STACK OVERFLOW
15725: MOV =NUM01,WA SET NEW STATE
15726: BNE XR,=OPDVS,EXP01 BACK FOR NEXT ELEMENT UNLESS =
15727: *
15728: * HERE FOR SPECIAL CASE OF BINARY =. THE SYNTAX ALLOWS A
15729: * NULL RIGHT ARGUMENT FOR THIS OPERATOR TO BE LEFT
15730: * OUT. ACCORDINGLY WE RESET TO STATE ZERO TO GET PROPER
15731: * ACTION ON A TERMINATOR (SUPPLY A NULL CONSTANT).
15732: *
15733: ZER WA SET STATE ZERO
15734: BRN EXP01 JUMP FOR NEXT ELEMENT
15735: ENP END PROCEDURE EXPAN
15736: EJC
15737: *
15738: * EXPAP -- TEST FOR PATTERN MATCH TREE
15739: *
15740: * EXPAP IS PASSED AN EXPRESSION TREE TO DETERMINE IF IT
15741: * IS A PATTERN MATCH. THE FOLLOWING ARE RECOGIZED AS
15742: * MATCHES IN THE CONTEXT OF THIS CALL.
15743: *
15744: * 1) AN EXPLICIT USE OF BINARY QUESTION MARK
15745: * 2) A CONCATENATION
15746: * 3) AN ALTERNATION WHOSE LEFT OPERAND IS A CONCATENATION
15747: *
15748: * (XR) PTR TO EXPAN TREE
15749: * JSR EXPAP CALL TO TEST FOR PATTERN MATCH
15750: * PPM LOC TRANSFER LOC IF NOT A PATTERN MATCH
15751: * (WA) DESTROYED
15752: * (XR) UNCHANGED (IF NOT MATCH)
15753: * (XR) PTR TO BINARY OPERATOR BLK IF MATCH
15754: *
15755: EXPAP PRC E,1 ENTRY POINT
15756: MOV XL,-(XS) SAVE XL
15757: BNE (XR),=B$CMT,EXPP2 NO MATCH IF NOT COMPLEX
15758: MOV CMTYP(XR),WA ELSE LOAD TYPE CODE
15759: BEQ WA,=C$CNC,EXPP1 CONCATENATION IS A MATCH
15760: BEQ WA,=C$PMT,EXPP1 BINARY QUESTION MARK IS A MATCH
15761: BNE WA,=C$ALT,EXPP2 ELSE NOT MATCH UNLESS ALTERNATION
15762: *
15763: * HERE FOR ALTERNATION. CHANGE (A B) / C TO A QM (B / C)
15764: *
15765: MOV CMLOP(XR),XL LOAD LEFT OPERAND POINTER
15766: BNE (XL),=B$CMT,EXPP2 NOT MATCH IF LEFT OPND NOT COMPLEX
15767: BNE CMTYP(XL),=C$CNC,EXPP2 NOT MATCH IF LEFT OP NOT CONC
15768: MOV CMROP(XL),CMLOP(XR) XR POINTS TO (B / C)
15769: MOV XR,CMROP(XL) SET XL OPNDS TO A, (B / C)
15770: MOV XL,XR POINT TO THIS ALTERED NODE
15771: *
15772: * EXIT HERE FOR PATTERN MATCH
15773: *
15774: EXPP1 MOV (XS)+,XL RESTORE ENTRY XL
15775: EXI GIVE PATTERN MATCH RETURN
15776: *
15777: * EXIT HERE IF NOT PATTERN MATCH
15778: *
15779: EXPP2 MOV (XS)+,XL RESTORE ENTRY XL
15780: EXI 1 GIVE NON-MATCH RETURN
15781: ENP END PROCEDURE EXPAP
15782: EJC
15783: *
15784: * EXPDM -- DUMP OPERATORS AT CURRENT LEVEL (FOR EXPAN)
15785: *
15786: * EXPDM USES EXPOP TO CONDENSE ALL OPERATORS AT THIS SYNTAX
15787: * LEVEL. THE STACK BOTTOM IS RECOGNIZED FROM THE LEVEL
15788: * VALUE WHICH IS SAVED ON THE TOP OF THE STACK.
15789: *
15790: * JSR EXPDM CALL TO DUMP OPERATORS
15791: * (XS) POPPED AS REQUIRED
15792: * (XR,WA) DESTROYED
15793: *
15794: EXPDM PRC N,0 ENTRY POINT
15795: MOV XL,R$EXS SAVE XL VALUE
15796: *
15797: * LOOP TO DUMP OPERATORS
15798: *
15799: EXDM1 BLE 1(XS),=NUM05,EXDM2 JUMP IF STACK BOTTOM (SAVED LEVEL
15800: JSR EXPOP ELSE POP ONE OPERATOR
15801: BRN EXDM1 AND LOOP BACK
15802: *
15803: * HERE AFTER POPPING ALL OPERATORS
15804: *
15805: EXDM2 MOV R$EXS,XL RESTORE XL
15806: ZER R$EXS RELEASE SAVE LOCATION
15807: EXI RETURN TO EXPDM CALLER
15808: ENP END PROCEDURE EXPDM
15809: EJC
15810: *
15811: * EXPOP-- POP OPERATOR (FOR EXPAN)
15812: *
15813: * EXPOP IS USED BY THE EXPAN ROUTINE TO CONDENSE ONE
15814: * OPERATOR FROM THE TOP OF THE SYNTAX STACK. AN APPROPRIATE
15815: * CMBLK IS BUILT FOR THE OPERATOR (UNARY OR BINARY) AND A
15816: * POINTER TO THIS CMBLK IS STACKED.
15817: *
15818: * EXPOP IS ALSO USED BY SCNGF (GOTO FIELD SCAN) PROCEDURE
15819: *
15820: * JSR EXPOP CALL TO POP OPERATOR
15821: * (XS) POPPED APPROPRIATELY
15822: * (XR,XL,WA) DESTROYED
15823: *
15824: EXPOP PRC N,0 ENTRY POINT
15825: MOV 1(XS),XR LOAD OPERATOR DV POINTER
15826: BEQ DVLPR(XR),=LLUNO,EXPO2 JUMP IF UNARY
15827: *
15828: * HERE FOR BINARY OPERATOR
15829: *
15830: MOV *CMBS$,WA SET SIZE OF BINARY OPERATOR CMBLK
15831: JSR ALLOC ALLOCATE SPACE FOR CMBLK
15832: MOV (XS)+,CMROP(XR) POP AND STORE RIGHT OPERAND PTR
15833: MOV (XS)+,XL POP AND LOAD OPERATOR DV PTR
15834: MOV (XS),CMLOP(XR) STORE LEFT OPERAND POINTER
15835: *
15836: * COMMON EXIT POINT
15837: *
15838: EXPO1 MOV =B$CMT,(XR) STORE TYPE CODE FOR CMBLK
15839: MOV DVTYP(XL),CMTYP(XR) STORE CMBLK NODE TYPE CODE
15840: MOV XL,CMOPN(XR) STORE DVPTR (=PTR TO DAC O$XXX)
15841: MOV WA,CMLEN(XR) STORE CMBLK LENGTH
15842: MOV XR,(XS) STORE RESULTING NODE PTR ON STACK
15843: EXI RETURN TO EXPOP CALLER
15844: *
15845: * HERE FOR UNARY OPERATOR
15846: *
15847: EXPO2 MOV *CMUS$,WA SET SIZE OF UNARY OPERATOR CMBLK
15848: JSR ALLOC ALLOCATE SPACE FOR CMBLK
15849: MOV (XS)+,CMROP(XR) POP AND STORE OPERAND POINTER
15850: MOV (XS),XL LOAD OPERATOR DV POINTER
15851: BRN EXPO1 MERGE BACK TO EXIT
15852: ENP END PROCEDURE EXPOP
15853: EJC
15854: *
15855: * FLSTG -- FOLD STRING TO UPPER CASE
15856: *
15857: * FLSTG FOLDS A CHARACTER STRING CONTAINING LOWER CASE
15858: * CHARACCTERS TO ONE CONTAINING UPPER CASE CHARACTERS.
15859: * FOLDING IS ONLY DONE IF &CASE (KVCAS) IS NOT ZERO.
15860: *
15861: * (XR) STRING ARGUMENT
15862: * (WA) LENGTH OF STRING
15863: * JSR FLSTG CALL TO FOLD STRING
15864: * (XR) RESULT STRING (POSSIBLY ORIGINAL)
15865: * (WC) DESTROYED
15866: *
15867: FLSTG PRC R,0 ENTRY POINT
15868: BZE KVCAS,FST99 SKIP IF &CASE IS 0
15869: MOV XL,-(XS) SAVE XL ACROSS CALL
15870: MOV XR,-(XS) SAVE ORIGINAL SCBLK PTR
15871: JSR ALOCS ALLOCATE NEW STRING BLOCK
15872: MOV (XS),XL POINT TO ORIGINAL SCBLK
15873: MOV XR,-(XS) SAVE POINTER TO NEW SCBLK
15874: PLC XL POINT TO ORIGINAL CHARS
15875: PLC XR POINT TO NEW CHARS
15876: ZER -(XS) INIT DID FOLD FLAG
15877: LCT WC,WC LOAD LOOP COUNTER
15878: FST01 LCH WA,(XL)+ LOAD CHARACTER
15879: BGT =CH$$A,WA,FST02 SKIP IF LESS THAN LC A
15880: BGT WA,=CH$$$,FST02 SKIP IF GREATER THAN LC Z
15881: FLC WA FOLD CHARACTER TO UPPER CASE
15882: MNZ (XS) SET DID FOLD CHARACTER FLAG
15883: FST02 SCH WA,(XR)+ STORE (POSSIBLY FOLDED) CHARACTER
15884: BCT WC,FST01 LOOP THRU ENTIRE STRING
15885: CSC XR COMPLETE STORE CHARACTERS
15886: BNZ (XS)+,FST10 SKIP IF FOLDING DONE
15887: MOV (XS)+,DNAMP DO NOT NEED NEW SCBLK
15888: MOV (XS)+,XR RETURN ORIGINAL SCBLK
15889: BRN FST20 MERGE BELOW
15890: FST10 MOV (XS)+,XR RETURN NEW SCBLK
15891: ICA XS THROW AWAY ORIGINAL SCBLK POINTER
15892: FST20 MOV SCLEN(XR),WA RELOAD STRING LENGTH
15893: MOV (XS)+,XL RESTORE XL
15894: FST99 EXI RETURN
15895: ENP
15896: EJC
15897: *
15898: * GBCOL -- PERFORM GARBAGE COLLECTION
15899: *
15900: * GBCOL PERFORMS A GARBAGE COLLECTION ON THE DYNAMIC REGION
15901: * ALL BLOCKS WHICH ARE NO LONGER IN USE ARE ELIMINATED
15902: * BY MOVING BLOCKS WHICH ARE IN USE DOWN AND RESETTING
15903: * DNAMP, THE POINTER TO THE NEXT AVAILABLE LOCATION.
15904: *
15905: * (WB) MOVE OFFSET (SEE BELOW)
15906: * JSR GBCOL CALL TO COLLECT GARBAGE
15907: * (XR) DESTROYED
15908: *
15909: * THE FOLLOWING CONDITIONS MUST BE MET AT THE TIME WHEN
15910: * GBCOL IS CALLED.
15911: *
15912: * 1) ALL POINTERS TO BLOCKS IN THE DYNAMIC AREA MUST BE
15913: * ACCESSIBLE TO THE GARBAGE COLLECTOR. THIS MEANS
15914: * THAT THEY MUST OCCUR IN ONE OF THE FOLLOWING.
15915: *
15916: * A) MAIN STACK, WITH CURRENT TOP
15917: * ELEMENT BEING INDICATED BY XS
15918: *
15919: * B) IN RELOCATABLE FIELDS OF VRBLKS.
15920: *
15921: * C) IN REGISTER XL AT THE TIME OF CALL
15922: *
15923: * E) IN THE SPECIAL REGION OF WORKING
15924: * STORAGE WHERE NAMES BEGIN WITH R$.
15925: *
15926: * 2) ALL POINTERS MUST POINT TO THE START OF BLOCKS WITH
15927: * THE SOLE EXCEPTION OF THE CONTENTS OF THE CODE
15928: * POINTER REGISTER WHICH POINTS INTO THE R$COD BLOCK.
15929: *
15930: * 3) NO LOCATION WHICH APPEARS TO CONTAIN A POINTER
15931: * INTO THE DYNAMIC REGION MAY OCCUR UNLESS IT IS IN
15932: * FACT A POINTER TO THE START OF THE BLOCK. HOWEVER
15933: * POINTERS OUTSIDE THIS AREA MAY OCCUR AND WILL
15934: * NOT BE CHANGED BY THE GARBAGE COLLECTOR.
15935: * IT IS ESPECIALLY IMPORTANT TO MAKE SURE THAT XL
15936: * DOES NOT CONTAIN A GARBAGE VALUE FROM SOME PROCESS
15937: * CARRIED OUT BEFORE THE CALL TO THE COLLECTOR.
15938: *
15939: * GBCOL HAS THE CAPABILITY OF MOVING THE FINAL COMPACTED
15940: * RESULT UP IN MEMORY (WITH ADDRESSES ADJUSTED ACCORDINGLY)
15941: * THIS IS USED TO ADD SPACE TO THE STATIC REGION. THE
15942: * ENTRY VALUE OF WB IS THE NUMBER OF BYTES TO MOVE UP.
15943: * THE CALLER MUST GUARANTEE THAT THERE IS ENOUGH ROOM.
15944: * FURTHERMORE THE VALUE IN WB IF IT IS NON-ZERO, MUST BE AT
15945: * LEAST 256 SO THAT THE MWB INSTRUCTION CONDITIONS ARE MET.
15946: EJC
15947: *
15948: * GBCOL (CONTINUED)
15949: *
15950: * THE ALGORITHM, WHICH IS A MODIFICATION OF THE LISP-2
15951: * GARBAGE COLLECTOR DEVISED BY R.DEWAR AND K.BELCHER
15952: * TAKES THREE PASSES AS FOLLOWS.
15953: *
15954: * 1) ALL POINTERS IN MEMORY ARE SCANNED AND BLOCKS IN USE
15955: * DETERMINED FROM THIS SCAN. NOTE THAT THIS PROCEDURE
15956: * IS RECURSIVE AND USES THE MAIN STACK FOR LINKAGE.
15957: * THE MARKING PROCESS IS THUS SIMILAR TO THAT USED IN
15958: * A STANDARD LISP COLLECTOR. HOWEVER THE METHOD OF
15959: * ACTUALLY MARKING THE BLOCKS IS DIFFERENT.
15960: *
15961: * THE FIRST FIELD OF A BLOCK NORMALLY CONTAINS A
15962: * CODE ENTRY POINT POINTER. SUCH AN ENTRY POINTER
15963: * CAN BE DISTINGUISHED FROM THE ADDRESS OF ANY POINTER
15964: * TO BE PROCESSED BY THE COLLECTOR. DURING GARBAGE
15965: * COLLECTION, THIS WORD IS USED TO BUILD A BACK CHAIN
15966: * OF POINTERS THROUGH FIELDS WHICH POINT TO THE BLOCK.
15967: * THE END OF THE CHAIN IS MARKED BY THE OCCURENCE
15968: * OF THE WORD WHICH USED TO BE IN THE FIRST WORD OF
15969: * THE BLOCK. THIS BACKCHAIN SERVES BOTH AS A MARK
15970: * INDICATING THAT THE BLOCK IS IN USE AND AS A LIST OF
15971: * REFERENCES FOR THE RELOCATION PHASE.
15972: *
15973: * 2) STORAGE IS SCANNED SEQUENTIALLY TO DISCOVER WHICH
15974: * BLOCKS ARE CURRENTLY IN USE AS INDICATED BY THE
15975: * PRESENCE OF A BACKCHAIN. TWO POINTERS ARE MAINTAINED
15976: * ONE SCANS THROUGH LOOKING AT EACH BLOCK. THE OTHER
15977: * IS INCREMENTED ONLY FOR BLOCKS FOUND TO BE IN USE.
15978: * IN THIS WAY, THE EVENTUAL LOCATION OF EACH BLOCK CAN
15979: * BE DETERMINED WITHOUT ACTUALLY MOVING ANY BLOCKS.
15980: * AS EACH BLOCK WHICH IS IN USE IS PROCESSED, THE BACK
15981: * CHAIN IS USED TO RESET ALL POINTERS WHICH POINT TO
15982: * THIS BLOCK TO CONTAIN ITS NEW ADDRESS, I.E. THE
15983: * ADDRESS IT WILL OCCUPY AFTER THE BLOCKS ARE MOVED.
15984: * THE FIRST WORD OF THE BLOCK, TAKEN FROM THE END OF
15985: * THE CHAIN IS RESTORED AT THIS POINT.
15986: *
15987: * DURING PASS 2, THE COLLECTOR BUILDS BLOCKS WHICH
15988: * DESCRIBE THE REGIONS OF STORAGE WHICH ARE TO BE
15989: * MOVED IN THE THIRD PASS. THERE IS ONE DESCRIPTOR FOR
15990: * EACH CONTIGUOUS SET OF GOOD BLOCKS. THE DESCRIPTOR
15991: * IS BUILT JUST BEHIND THE BLOCK TO BE MOVED AND
15992: * CONTAINS A POINTER TO THE NEXT BLOCK AND THE NUMBER
15993: * OF WORDS TO BE MOVED.
15994: *
15995: * 3) IN THE THIRD AND FINAL PASS, THE MOVE DESCRIPTOR
15996: * BLOCKS BUILT IN PASS TWO ARE USED TO ACTUALLY MOVE
15997: * THE BLOCKS DOWN TO THE BOTTOM OF THE DYNAMIC REGION.
15998: * THE COLLECTION IS THEN COMPLETE AND THE NEXT
15999: * AVAILABLE LOCATION POINTER IS RESET.
16000: EJC
16001: *
16002: * GBCOL (CONTINUED)
16003: *
16004: GBCOL PRC E,0 ENTRY POINT
16005: BNZ DMVCH,GBC14 FAIL IF IN MID-DUMP
16006: MNZ GBCFL NOTE GBCOL ENTERED
16007: MOV WA,GBSVA SAVE ENTRY WA
16008: MOV WB,GBSVB SAVE ENTRY WB
16009: MOV WC,GBSVC SAVE ENTRY WC
16010: MOV XL,-(XS) SAVE ENTRY XL
16011: SCP WA GET CODE POINTER VALUE
16012: SUB R$COD,WA MAKE RELATIVE
16013: LCP WA AND RESTORE
16014: *
16015: * PROCESS STACK ENTRIES
16016: *
16017: MOV XS,XR POINT TO STACK FRONT
16018: MOV STBAS,XL POINT PAST END OF STACK
16019: BGE XL,XR,GBC00 OK IF D-STACK
16020: MOV XL,XR REVERSE IF ...
16021: MOV XS,XL ... U-STACK
16022: *
16023: * PROCESS THE STACK
16024: *
16025: GBC00 JSR GBCPF PROCESS POINTERS ON STACK
16026: *
16027: * PROCESS SPECIAL WORK LOCATIONS
16028: *
16029: MOV =R$AAA,XR POINT TO START OF RELOCATABLE LOCS
16030: MOV =R$YYY,XL POINT PAST END OF RELOCATABLE LOCS
16031: JSR GBCPF PROCESS WORK FIELDS
16032: *
16033: * PREPARE TO PROCESS VARIABLE BLOCKS
16034: *
16035: MOV HSHTB,WA POINT TO FIRST HASH SLOT POINTER
16036: *
16037: * LOOP THROUGH HASH SLOTS
16038: *
16039: GBC01 MOV WA,XL POINT TO NEXT SLOT
16040: ICA WA BUMP BUCKET POINTER
16041: MOV WA,GBCNM SAVE BUCKET POINTER
16042: EJC
16043: *
16044: * GBCOL (CONTINUED)
16045: *
16046: * LOOP THROUGH VARIABLES ON ONE HASH CHAIN
16047: *
16048: GBC02 MOV (XL),XR LOAD PTR TO NEXT VRBLK
16049: BZE XR,GBC03 JUMP IF END OF CHAIN
16050: MOV XR,XL ELSE COPY VRBLK POINTER
16051: ADD *VRVAL,XR POINT TO FIRST RELOC FLD
16052: ADD *VRNXT,XL POINT PAST LAST (AND TO LINK PTR)
16053: JSR GBCPF PROCESS RELOC FIELDS IN VRBLK
16054: BRN GBC02 LOOP BACK FOR NEXT BLOCK
16055: *
16056: * HERE AT END OF ONE HASH CHAIN
16057: *
16058: GBC03 MOV GBCNM,WA RESTORE BUCKET POINTER
16059: BNE WA,HSHTE,GBC01 LOOP BACK IF MORE BUCKETS TO GO
16060: EJC
16061: *
16062: * GBCOL (CONTINUED)
16063: *
16064: * NOW WE ARE READY TO START PASS TWO. REGISTERS ARE USED
16065: * AS FOLLOWS IN PASS TWO.
16066: *
16067: * (XR) SCANS THROUGH ALL BLOCKS
16068: * (WC) POINTER TO EVENTUAL LOCATION
16069: *
16070: * THE MOVE DESCRIPTION BLOCKS BUILT IN THIS PASS HAVE
16071: * THE FOLLOWING FORMAT.
16072: *
16073: * WORD 1 POINTER TO NEXT MOVE BLOCK,
16074: * ZERO IF END OF CHAIN OF BLOCKS
16075: *
16076: * WORD 2 LENGTH OF BLOCKS TO BE MOVED IN
16077: * BYTES. SET TO THE ADDRESS OF THE
16078: * FIRST BYTE WHILE ACTUALLY SCANNING
16079: * THE BLOCKS.
16080: *
16081: * THE FIRST ENTRY ON THIS CHAIN IS A SPECIAL ENTRY
16082: * CONSISTING OF THE TWO WORDS GBCNM AND GBCNS. AFTER
16083: * BUILDING THE CHAIN OF MOVE DESCRIPTORS, GBCNM POINTS TO
16084: * THE FIRST REAL MOVE BLOCK, AND GBCNS IS THE LENGTH OF
16085: * BLOCKS IN USE AT THE START OF STORAGE WHICH NEED NOT
16086: * BE MOVED SINCE THEY ARE IN THE CORRECT POSITION.
16087: *
16088: GBC04 MOV DNAMB,XR POINT TO FIRST BLOCK
16089: MOV XR,WC SET AS FIRST EVENTUAL LOCATION
16090: ADD GBSVB,WC ADD OFFSET FOR EVENTUAL MOVE UP
16091: ZER GBCNM CLEAR INITIAL FORWARD POINTER
16092: MOV =GBCNM,GBCLM INITIALIZE PTR TO LAST MOVE BLOCK
16093: MOV XR,GBCNS INITIALIZE FIRST ADDRESS
16094: *
16095: * LOOP THROUGH A SERIES OF BLOCKS IN USE
16096: *
16097: GBC05 BEQ XR,DNAMP,GBC07 JUMP IF END OF USED REGION
16098: MOV (XR),WA ELSE GET FIRST WORD
16099: BHI WA,=P$YYY,GBC06 SKIP IF NOT ENTRY PTR (IN USE)
16100: BHI WA,=B$AAA,GBC07 JUMP IF ENTRY POINTER (UNUSED)
16101: *
16102: * HERE FOR BLOCK IN USE, LOOP TO RELOCATE REFERENCES
16103: *
16104: GBC06 MOV WA,XL COPY POINTER
16105: MOV (XL),WA LOAD FORWARD POINTER
16106: MOV WC,(XL) RELOCATE REFERENCE
16107: BHI WA,=P$YYY,GBC06 LOOP BACK IF NOT END OF CHAIN
16108: BLO WA,=B$AAA,GBC06 LOOP BACK IF NOT END OF CHAIN
16109: EJC
16110: *
16111: * GBCOL (CONTINUED)
16112: *
16113: * AT END OF CHAIN, RESTORE FIRST WORD AND BUMP PAST
16114: *
16115: MOV WA,(XR) RESTORE FIRST WORD
16116: JSR BLKLN GET LENGTH OF THIS BLOCK
16117: ADD WA,XR BUMP ACTUAL POINTER
16118: ADD WA,WC BUMP EVENTUAL POINTER
16119: BRN GBC05 LOOP BACK FOR NEXT BLOCK
16120: *
16121: * HERE AT END OF A SERIES OF BLOCKS IN USE
16122: *
16123: GBC07 MOV XR,WA COPY POINTER PAST LAST BLOCK
16124: MOV GBCLM,XL POINT TO PREVIOUS MOVE BLOCK
16125: SUB 1(XL),WA SUBTRACT STARTING ADDRESS
16126: MOV WA,1(XL) STORE LENGTH OF BLOCK TO BE MOVED
16127: *
16128: * LOOP THROUGH A SERIES OF BLOCKS NOT IN USE
16129: *
16130: GBC08 BEQ XR,DNAMP,GBC10 JUMP IF END OF USED REGION
16131: MOV (XR),WA ELSE LOAD FIRST WORD OF NEXT BLOCK
16132: BHI WA,=P$YYY,GBC09 JUMP IF IN USE
16133: BLO WA,=B$AAA,GBC09 JUMP IF IN USE
16134: JSR BLKLN ELSE GET LENGTH OF NEXT BLOCK
16135: ADD WA,XR PUSH POINTER
16136: BRN GBC08 AND LOOP BACK
16137: *
16138: * HERE FOR A BLOCK IN USE AFTER PROCESSING A SERIES OF
16139: * BLOCKS WHICH WERE NOT IN USE, BUILD NEW MOVE BLOCK.
16140: *
16141: GBC09 SUB *NUM02,XR POINT 2 WORDS BEHIND FOR MOVE BLOCK
16142: MOV GBCLM,XL POINT TO PREVIOUS MOVE BLOCK
16143: MOV XR,(XL) SET FORWARD PTR IN PREVIOUS BLOCK
16144: ZER (XR) ZERO FORWARD PTR OF NEW BLOCK
16145: MOV XR,GBCLM REMEMBER ADDRESS OF THIS BLOCK
16146: MOV XR,XL COPY PTR TO MOVE BLOCK
16147: ADD *NUM02,XR POINT BACK TO BLOCK IN USE
16148: MOV XR,1(XL) STORE STARTING ADDRESS
16149: BRN GBC06 JUMP TO PROCESS BLOCK IN USE
16150: EJC
16151: *
16152: * GBCOL (CONTINUED)
16153: *
16154: * HERE FOR PASS THREE -- ACTUALLY MOVE THE BLOCKS DOWN
16155: *
16156: * (XL) POINTER TO OLD LOCATION
16157: * (XR) POINTER TO NEW LOCATION
16158: *
16159: GBC10 MOV DNAMB,XR POINT TO START OF STORAGE
16160: ADD GBCNS,XR BUMP PAST UNMOVED BLOCKS AT START
16161: *
16162: * LOOP THROUGH MOVE DESCRIPTORS
16163: *
16164: GBC11 MOV GBCNM,XL POINT TO NEXT MOVE BLOCK
16165: BZE XL,GBC12 JUMP IF END OF CHAIN
16166: MOV (XL)+,GBCNM MOVE POINTER DOWN CHAIN
16167: MOV (XL)+,WA GET LENGTH TO MOVE
16168: MVW PERFORM MOVE
16169: BRN GBC11 LOOP BACK
16170: *
16171: * NOW TEST FOR MOVE UP
16172: *
16173: GBC12 MOV XR,DNAMP SET NEXT AVAILABLE LOC PTR
16174: MOV GBSVB,WB RELOAD MOVE OFFSET
16175: BZE WB,GBC13 JUMP IF NO MOVE REQUIRED
16176: MOV XR,XL ELSE COPY OLD TOP OF CORE
16177: ADD WB,XR POINT TO NEW TOP OF CORE
16178: MOV XR,DNAMP SAVE NEW TOP OF CORE POINTER
16179: MOV XL,WA COPY OLD TOP
16180: SUB DNAMB,WA MINUS OLD BOTTOM = LENGTH
16181: ADD WB,DNAMB BUMP BOTTOM TO GET NEW VALUE
16182: MWB PERFORM MOVE (BACKWARDS)
16183: *
16184: * MERGE HERE TO EXIT
16185: *
16186: GBC13 MOV GBSVA,WA RESTORE WA
16187: SCP WC GET CODE POINTER
16188: ADD R$COD,WC MAKE ABSOLUTE AGAIN
16189: LCP WC AND REPLACE ABSOLUTE VALUE
16190: MOV GBSVC,WC RESTORE WC
16191: MOV (XS)+,XL RESTORE ENTRY XL
16192: ICV GBCNT INCREMENT COUNT OF COLLECTIONS
16193: ZER XR CLEAR GARBAGE VALUE IN XR
16194: ZER GBCFL NOTE EXIT FROM GBCOL
16195: EXI EXIT TO GBCOL CALLER
16196: *
16197: * GARBAGE COLLECTION NOT ALLOWED WHILST DUMPING
16198: *
16199: GBC14 ICV ERRFT FATAL ERROR
16200: ERB 250,INSUFFICIENT MEMORY TO COMPLETE DUMP
16201: ENP END PROCEDURE GBCOL
16202: EJC
16203: *
16204: * GBCPF -- PROCESS FIELDS FOR GARBAGE COLLECTOR
16205: *
16206: * THIS PROCEDURE IS USED BY THE GARBAGE COLLECTOR TO
16207: * PROCESS FIELDS IN PASS ONE. SEE GBCOL FOR FULL DETAILS.
16208: *
16209: * (XR) PTR TO FIRST LOCATION TO PROCESS
16210: * (XL) PTR PAST LAST LOCATION TO PROCESS
16211: * JSR GBCPF CALL TO PROCESS FIELDS
16212: * (XR,WA,WB,WC,IA) DESTROYED
16213: *
16214: * NOTE THAT ALTHOUGH THIS PROCEDURE USES A RECURSIVE
16215: * APPROACH, IT CONTROLS ITS OWN STACK AND IS NOT RECURSIVE.
16216: *
16217: GBCPF PRC E,0 ENTRY POINT
16218: ZER -(XS) SET ZERO TO MARK BOTTOM OF STACK
16219: MOV XL,-(XS) SAVE END POINTER
16220: *
16221: * MERGE HERE TO GO DOWN A LEVEL AND START A NEW LOOP
16222: *
16223: * 1(XS) NEXT LVL FIELD PTR (0 AT OUTER LVL)
16224: * 0(XS) PTR PAST LAST FIELD TO PROCESS
16225: * (XR) PTR TO FIRST FIELD TO PROCESS
16226: *
16227: * LOOP TO PROCESS SUCCESSIVE FIELDS
16228: *
16229: GPF01 MOV (XR),XL LOAD FIELD CONTENTS
16230: MOV XR,WC SAVE FIELD POINTER
16231: BLT XL,DNAMB,GPF02 JUMP IF NOT PTR INTO DYNAMIC AREA
16232: BGE XL,DNAMP,GPF02 JUMP IF NOT PTR INTO DYNAMIC AREA
16233: *
16234: * HERE WE HAVE A PTR TO A BLOCK IN THE DYNAMIC AREA.
16235: * LINK THIS FIELD ONTO THE REFERENCE BACKCHAIN.
16236: *
16237: MOV (XL),WA LOAD PTR TO CHAIN (OR ENTRY PTR)
16238: MOV XR,(XL) SET THIS FIELD AS NEW HEAD OF CHAIN
16239: MOV WA,(XR) SET FORWARD POINTER
16240: *
16241: * NOW SEE IF THIS BLOCK HAS BEEN PROCESSED BEFORE
16242: *
16243: BHI WA,=P$YYY,GPF02 JUMP IF ALREADY PROCESSED
16244: BHI WA,=B$AAA,GPF03 JUMP IF NOT ALREADY PROCESSED
16245: *
16246: * HERE TO MOVE TO NEXT FIELD
16247: *
16248: GPF02 MOV WC,XR RESTORE FIELD POINTER
16249: ICA XR BUMP TO NEXT FIELD
16250: BNE XR,(XS),GPF01 LOOP BACK IF MORE TO GO
16251: EJC
16252: *
16253: * GBCPF (CONTINUED)
16254: *
16255: * HERE WE POP UP A LEVEL AFTER FINISHING A BLOCK
16256: *
16257: MOV (XS)+,XL RESTORE POINTER PAST END
16258: MOV (XS)+,WC RESTORE BLOCK POINTER
16259: BNZ WC,GPF02 CONTINUE LOOP UNLESS OUTER LEVL
16260: EXI RETURN TO CALLER IF OUTER LEVEL
16261: *
16262: * HERE TO PROCESS AN ACTIVE BLOCK WHICH HAS NOT BEEN DONE
16263: *
16264: GPF03 MOV XL,XR COPY BLOCK POINTER
16265: MOV WA,XL COPY FIRST WORD OF BLOCK
16266: LEI XL LOAD ENTRY POINT ID (BL$XX)
16267: *
16268: * BLOCK TYPE SWITCH. NOTE THAT BLOCKS WITH NO RELOCATABLE
16269: * FIELDS JUST RETURN TO GPF02 HERE TO CONTINE TO NEXT FLD.
16270: *
16271: BSW XL,BL$$$ SWITCH ON BLOCK TYPE
16272: IFF BL$AR,GPF06 ARBLK
16273: IFF BL$BC,GPF18 BCBLK
16274: IFF BL$BF,GPF02 BFBLK
16275: IFF BL$CC,GPF07 CCBLK
16276: IFF BL$CD,GPF08 CDBLK
16277: IFF BL$CM,GPF04 CMBLK
16278: IFF BL$DF,GPF02 DFBLK
16279: IFF BL$EV,GPF10 EVBLK
16280: IFF BL$EX,GPF17 EXBLK
16281: IFF BL$FF,GPF11 FFBLK
16282: IFF BL$NM,GPF10 NMBLK
16283: IFF BL$P0,GPF10 P0BLK
16284: IFF BL$P1,GPF12 P1BLK
16285: IFF BL$P2,GPF12 P2BLK
16286: IFF BL$PD,GPF13 PDBLK
16287: IFF BL$PF,GPF14 PFBLK
16288: IFF BL$TB,GPF08 TBBLK
16289: IFF BL$TE,GPF15 TEBLK
16290: IFF BL$TR,GPF16 TRBLK
16291: IFF BL$VC,GPF08 VCBLK
16292: IFF BL$XR,GPF09 XRBLK
16293: IFF BL$CT,GPF02 CTBLK
16294: IFF BL$EF,GPF02 EFBLK
16295: IFF BL$IC,GPF02 ICBLK
16296: IFF BL$KV,GPF02 KVBLK
16297: IFF BL$RC,GPF02 RCBLK
16298: IFF BL$SC,GPF02 SCBLK
16299: IFF BL$SE,GPF02 SEBLK
16300: IFF BL$XN,GPF02 XNBLK
16301: ESW END OF JUMP TABLE
16302: EJC
16303: *
16304: * GBCPF (CONTINUED)
16305: *
16306: * CMBLK
16307: *
16308: GPF04 MOV CMLEN(XR),WA LOAD LENGTH
16309: MOV *CMTYP,WB SET OFFSET
16310: *
16311: * HERE TO PUSH DOWN TO NEW LEVEL
16312: *
16313: * (WC) FIELD PTR AT PREVIOUS LEVEL
16314: * (XR) PTR TO NEW BLOCK
16315: * (WA) LENGTH (RELOC FLDS + FLDS AT START)
16316: * (WB) OFFSET TO FIRST RELOC FIELD
16317: *
16318: GPF05 ADD XR,WA POINT PAST LAST RELOC FIELD
16319: ADD WB,XR POINT TO FIRST RELOC FIELD
16320: MOV WC,-(XS) STACK OLD FIELD POINTER
16321: MOV WA,-(XS) STACK NEW LIMIT POINTER
16322: CHK CHECK FOR STACK OVERFLOW
16323: BRN GPF01 IF OK, BACK TO PROCESS
16324: *
16325: * ARBLK
16326: *
16327: GPF06 MOV ARLEN(XR),WA LOAD LENGTH
16328: MOV AROFS(XR),WB SET OFFSET TO 1ST RELOC FLD (ARPRO)
16329: BRN GPF05 ALL SET
16330: *
16331: * CCBLK
16332: *
16333: GPF07 MOV CCUSE(XR),WA SET LENGTH IN USE
16334: MOV *CCUSE,WB 1ST WORD (MAKE SURE AT LEAST ONE)
16335: BRN GPF05 ALL SET
16336: EJC
16337: *
16338: * GBCPF (CONTINUED)
16339: *
16340: * CDBLK, TBBLK, VCBLK
16341: *
16342: GPF08 MOV OFFS2(XR),WA LOAD LENGTH
16343: MOV *OFFS3,WB SET OFFSET
16344: BRN GPF05 JUMP BACK
16345: *
16346: * XRBLK
16347: *
16348: GPF09 MOV XRLEN(XR),WA LOAD LENGTH
16349: MOV *XRPTR,WB SET OFFSET
16350: BRN GPF05 JUMP BACK
16351: *
16352: * EVBLK, NMBLK, P0BLK
16353: *
16354: GPF10 MOV *OFFS2,WA POINT PAST SECOND FIELD
16355: MOV *OFFS1,WB OFFSET IS ONE (ONLY RELOC FLD IS 2)
16356: BRN GPF05 ALL SET
16357: *
16358: * FFBLK
16359: *
16360: GPF11 MOV *FFOFS,WA SET LENGTH
16361: MOV *FFNXT,WB SET OFFSET
16362: BRN GPF05 ALL SET
16363: *
16364: * P1BLK, P2BLK
16365: *
16366: GPF12 MOV *PARM2,WA LENGTH (PARM2 IS NON-RELOCATABLE)
16367: MOV *PTHEN,WB SET OFFSET
16368: BRN GPF05 ALL SET
16369: EJC
16370: *
16371: * GBCPF (CONTINUED)
16372: *
16373: * PDBLK
16374: *
16375: GPF13 MOV PDDFP(XR),XL LOAD PTR TO DFBLK
16376: MOV DFPDL(XL),WA GET PDBLK LENGTH
16377: MOV *PDFLD,WB SET OFFSET
16378: BRN GPF05 ALL SET
16379: *
16380: * PFBLK
16381: *
16382: GPF14 MOV *PFARG,WA LENGTH PAST LAST RELOC
16383: MOV *PFCOD,WB OFFSET TO FIRST RELOC
16384: BRN GPF05 ALL SET
16385: *
16386: * TEBLK
16387: *
16388: GPF15 MOV *TESI$,WA SET LENGTH
16389: MOV *TESUB,WB AND OFFSET
16390: BRN GPF05 ALL SET
16391: *
16392: * TRBLK
16393: *
16394: GPF16 MOV *TRSI$,WA SET LENGTH
16395: MOV *TRVAL,WB AND OFFSET
16396: BRN GPF05 ALL SET
16397: *
16398: * EXBLK
16399: *
16400: GPF17 MOV EXLEN(XR),WA LOAD LENGTH
16401: MOV *EXFLC,WB SET OFFSET
16402: BRN GPF05 JUMP BACK
16403: *
16404: * BCBLK
16405: *
16406: GPF18 MOV *BCSI$,WA SET LENGTH
16407: MOV *BCBUF,WB AND OFFSET
16408: BRN GPF05 ALL SET
16409: ENP END PROCEDURE GBCPF
16410: EJC
16411: *
16412: * GTARR -- GET ARRAY
16413: *
16414: * GTARR IS PASSED AN OBJECT AND RETURNS AN ARRAY IF POSSIBL
16415: *
16416: * (XR) VALUE TO BE CONVERTED
16417: * JSR GTARR CALL TO GET ARRAY
16418: * PPM LOC TRANSFER LOC FOR CONVERT IMPOSSIBLE
16419: * (XR) RESULTING ARRAY
16420: * (XL,WA,WB,WC) DESTROYED
16421: *
16422: GTARR PRC E,1 ENTRY POINT
16423: MOV (XR),WA LOAD TYPE WORD
16424: BEQ WA,=B$ART,GTAR8 EXIT IF ALREADY AN ARRAY
16425: BEQ WA,=B$VCT,GTAR8 EXIT IF ALREADY AN ARRAY
16426: BNE WA,=B$TBT,GTA9A ELSE FAIL IF NOT A TABLE (SGD02)
16427: *
16428: * HERE WE CONVERT A TABLE TO AN ARRAY
16429: *
16430: MOV XR,-(XS) REPLACE TBBLK POINTER ON STACK
16431: ZER XR SIGNAL FIRST PASS
16432: ZER WB ZERO NON-NULL ELEMENT COUNT
16433: *
16434: * THE FOLLOWING CODE IS EXECUTED TWICE. ON THE FIRST PASS,
16435: * SIGNALLED BY XR=0, THE NUMBER OF NON-NULL ELEMENTS IN
16436: * THE TABLE IS COUNTED IN WB. IN THE SECOND PASS, WHERE
16437: * XR IS A POINTER INTO THE ARBLK, THE NAME AND VALUE ARE
16438: * ENTERED INTO THE CURRENT ARBLK LOCATION.
16439: *
16440: GTAR1 MOV (XS),XL POINT TO TABLE
16441: ADD TBLEN(XL),XL POINT PAST LAST BUCKET
16442: SUB *TBBUK,XL SET FIRST BUCKET OFFSET
16443: MOV XL,WA COPY ADJUSTED POINTER
16444: *
16445: * LOOP THROUGH BUCKETS IN TABLE BLOCK
16446: * NEXT THREE LINES OF CODE RELY ON TENXT HAVING A VALUE
16447: * 1 LESS THAN TBBUK.
16448: *
16449: GTAR2 MOV WA,XL COPY BUCKET POINTER
16450: DCA WA DECREMENT BUCKET POINTER
16451: *
16452: * LOOP THROUGH TEBLKS ON ONE BUCKET CHAIN
16453: *
16454: GTAR3 MOV TENXT(XL),XL POINT TO NEXT TEBLK
16455: BEQ XL,(XS),GTAR6 JUMP IF CHAIN END (TBBLK PTR)
16456: MOV XL,CNVTP ELSE SAVE TEBLK POINTER
16457: *
16458: * LOOP TO FIND VALUE DOWN TRBLK CHAIN
16459: *
16460: GTAR4 MOV TEVAL(XL),XL LOAD VALUE
16461: BEQ (XL),=B$TRT,GTAR4 LOOP TILL VALUE FOUND
16462: MOV XL,WC COPY VALUE
16463: MOV CNVTP,XL RESTORE TEBLK POINTER
16464: EJC
16465: *
16466: * GTARR (CONTINUED)
16467: *
16468: * NOW CHECK FOR NULL AND TEST CASES
16469: *
16470: BEQ WC,=NULLS,GTAR3 LOOP BACK TO IGNORE NULL VALUE
16471: BNZ XR,GTAR5 JUMP IF SECOND PASS
16472: ICV WB FOR THE FIRST PASS, BUMP COUNT
16473: BRN GTAR3 AND LOOP BACK FOR NEXT TEBLK
16474: *
16475: * HERE IN SECOND PASS
16476: *
16477: GTAR5 MOV TESUB(XL),(XR)+ STORE SUBSCRIPT NAME
16478: MOV WC,(XR)+ STORE VALUE IN ARBLK
16479: BRN GTAR3 LOOP BACK FOR NEXT TEBLK
16480: *
16481: * HERE AFTER SCANNING TEBLKS ON ONE CHAIN
16482: *
16483: GTAR6 BNE WA,(XS),GTAR2 LOOP BACK IF MORE BUCKETS TO GO
16484: BNZ XR,GTAR7 ELSE JUMP IF SECOND PASS
16485: *
16486: * HERE AFTER COUNTING NON-NULL ELEMENTS
16487: *
16488: BZE WB,GTAR9 FAIL IF NO NON-NULL ELEMENTS
16489: MOV WB,WA ELSE COPY COUNT
16490: ADD WB,WA DOUBLE (TWO WORDS/ELEMENT)
16491: ADD =ARVL2,WA ADD SPACE FOR STANDARD FIELDS
16492: WTB WA CONVERT LENGTH TO BYTES
16493: BGE WA,MXLEN,GTAR9 FAIL IF TOO LONG FOR ARRAY
16494: JSR ALLOC ELSE ALLOCATE SPACE FOR ARBLK
16495: MOV =B$ART,(XR) STORE TYPE WORD
16496: ZER IDVAL(XR) ZERO ID FOR THE MOMENT
16497: MOV WA,ARLEN(XR) STORE LENGTH
16498: MOV =NUM02,ARNDM(XR) SET DIMENSIONS = 2
16499: LDI INTV1 GET INTEGER ONE
16500: STI ARLBD(XR) STORE AS LBD 1
16501: STI ARLB2(XR) STORE AS LBD 2
16502: LDI INTV2 LOAD INTEGER TWO
16503: STI ARDM2(XR) STORE AS DIM 2
16504: MTI WB GET ELEMENT COUNT AS INTEGER
16505: STI ARDIM(XR) STORE AS DIM 1
16506: ZER ARPR2(XR) ZERO PROTOTYPE FIELD FOR NOW
16507: MOV *ARPR2,AROFS(XR) SET OFFSET FIELD (SIGNAL PASS 2)
16508: MOV XR,WB SAVE ARBLK POINTER
16509: ADD *ARVL2,XR POINT TO FIRST ELEMENT LOCATION
16510: BRN GTAR1 JUMP BACK TO FILL IN ELEMENTS
16511: EJC
16512: *
16513: * GTARR (CONTINUED)
16514: *
16515: * HERE AFTER FILLING IN ELEMENT VALUES
16516: *
16517: GTAR7 MOV WB,XR RESTORE ARBLK POINTER
16518: MOV WB,(XS) STORE AS RESULT
16519: *
16520: * NOW WE NEED THE ARRAY PROTOTYPE WHICH IS OF THE FORM NN,2
16521: * THIS IS OBTAINED BY BUILDING THE STRING FOR NN02 AND
16522: * CHANGING THE ZERO TO A COMMA BEFORE STORING IT.
16523: *
16524: LDI ARDIM(XR) GET NUMBER OF ELEMENTS (NN)
16525: MLI INTVH MULTIPLY BY 100
16526: ADI INTV2 ADD 2 (NN02)
16527: JSR ICBLD BUILD INTEGER
16528: MOV XR,-(XS) STORE PTR FOR GTSTG
16529: JSR GTSTG CONVERT TO STRING
16530: PPM CONVERT FAIL IS IMPOSSIBLE
16531: MOV XR,XL COPY STRING POINTER
16532: MOV (XS)+,XR RELOAD ARBLK POINTER
16533: MOV XL,ARPR2(XR) STORE PROTOTYPE PTR (NN02)
16534: SUB =NUM02,WA ADJUST LENGTH TO POINT TO ZERO
16535: PSC XL,WA POINT TO ZERO
16536: MOV =CH$CM,WB LOAD A COMMA
16537: SCH WB,(XL) STORE A COMMA OVER THE ZERO
16538: CSC XL COMPLETE STORE CHARACTERS
16539: *
16540: * NORMAL RETURN
16541: *
16542: GTAR8 EXI RETURN TO CALLER
16543: *
16544: * NON-CONVERSION RETURN
16545: *
16546: GTAR9 MOV (XS)+,XR RESTORE STACK FOR CONV ERR (SGD02)
16547: *
16548: * MERGE TO TAKE CONVERT ERROR WHEN STACK ADJUSTED OK
16549: *
16550: GTA9A EXI 1 RETURN
16551: ENP PROCEDURE GTARR
16552: EJC
16553: *
16554: * GTCOD -- CONVERT TO CODE
16555: *
16556: * (XR) OBJECT TO BE CONVERTED
16557: * JSR GTCOD CALL TO CONVERT TO CODE
16558: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
16559: * (XR) POINTER TO RESULTING CDBLK
16560: * (XL,WA,WB,WC,RA) DESTROYED
16561: *
16562: * IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE-
16563: * EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
16564: * WITHOUT RETURNING TO THIS ROUTINE.
16565: *
16566: GTCOD PRC E,1 ENTRY POINT
16567: BEQ (XR),=B$CDS,GTCD1 JUMP IF ALREADY CODE
16568: BEQ (XR),=B$CDC,GTCD1 JUMP IF ALREADY CODE
16569: *
16570: * HERE WE MUST GENERATE A CDBLK BY COMPILATION
16571: *
16572: MOV XR,-(XS) STACK ARGUMENT FOR GTSTG
16573: JSR GTSTG CONVERT ARGUMENT TO STRING
16574: PPM GTCD2 JUMP IF NON-CONVERTIBLE
16575: MOV FLPTR,GTCEF SAVE FAIL PTR IN CASE OF ERROR
16576: MOV R$COD,R$GTC ALSO SAVE CODE PTR
16577: MOV XR,R$CIM ELSE SET IMAGE POINTER
16578: MOV WA,SCNIL SET IMAGE LENGTH
16579: ZER SCNPT SET SCAN POINTER
16580: MOV =STGXC,STAGE SET STAGE FOR EXECUTE COMPILE
16581: MOV CMPSN,LSTSN IN CASE LISTR CALLED
16582: JSR CMPIL COMPILE STRING
16583: MOV =STGXT,STAGE RESET STAGE FOR EXECUTE TIME
16584: ZER R$CIM CLEAR IMAGE
16585: *
16586: * MERGE HERE IF NO CONVERT REQUIRED
16587: *
16588: GTCD1 EXI GIVE NORMAL GTCOD RETURN
16589: *
16590: * HERE IF UNCONVERTIBLE
16591: *
16592: GTCD2 EXI 1 GIVE ERROR RETURN
16593: ENP END PROCEDURE GTCOD
16594: EJC
16595: *
16596: * GTEXP -- CONVERT TO EXPRESSION
16597: *
16598: * (XR) INPUT VALUE TO BE CONVERTED
16599: * JSR GTEXP CALL TO CONVERT TO EXPRESSION
16600: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
16601: * (XR) POINTER TO RESULT EXBLK OR SEBLK
16602: * (XL,WA,WB,WC,RA) DESTROYED
16603: *
16604: * IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE-
16605: * EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
16606: * WITHOUT RETURNING TO THIS ROUTINE.
16607: *
16608: GTEXP PRC E,1 ENTRY POINT
16609: BLO (XR),=B$E$$,GTEX1 JUMP IF ALREADY AN EXPRESSION
16610: MOV XR,-(XS) STORE ARGUMENT FOR GTSTG
16611: JSR GTSTG CONVERT ARGUMENT TO STRING
16612: PPM GTEX2 JUMP IF UNCONVERTIBLE
16613: *
16614: * CHECK THE LAST CHARACTER OF THE STRING FOR COLON OR
16615: * SEMICOLON. THESE CHARACTERS CAN LEGITIMATELY END AN
16616: * EXPRESSION IN OPEN CODE, SO EXPAN WILL NOT DETECT THEM
16617: * AS ERRORS, BUT THEY ARE INVALID AS TERMINATORS FOR A
16618: * STRING THAT IS BEING CONVERTED TO EXPRESSION FORM.
16619: *
16620: MOV XR,XL COPY INPUT STRING POINTER (REG06)
16621: PLC XL,WA POINT ONE PAST THE STRING END (REG06)
16622: LCH XL,-(XL) FETCH THE LAST CHARACTER (REG06)
16623: BEQ XL,=CH$CL,GTEX2 ERROR IF IT IS A SEMICOLON (REG06)
16624: BEQ XL,=CH$SM,GTEX2 OR IF IT IS A COLON (REG06)
16625: *
16626: * HERE WE CONVERT A STRING BY COMPILATION
16627: *
16628: MOV XR,R$CIM SET INPUT IMAGE POINTER
16629: ZER SCNPT SET SCAN POINTER
16630: MOV WA,SCNIL SET INPUT IMAGE LENGTH
16631: ZER WB SET CODE FOR NORMAL SCAN
16632: MOV FLPTR,GTCEF SAVE FAIL PTR IN CASE OF ERROR
16633: MOV R$COD,R$GTC ALSO SAVE CODE PTR
16634: MOV =STGEV,STAGE ADJUST STAGE FOR COMPILE
16635: MOV =T$UOK,SCNTP INDICATE UNARY OPERATOR ACCEPTABLE
16636: JSR EXPAN BUILD TREE FOR EXPRESSION
16637: ZER SCNRS RESET RESCAN FLAG
16638: BNE SCNPT,SCNIL,GTEX2 ERROR IF NOT END OF IMAGE
16639: ZER WB SET OK VALUE FOR CDGEX CALL
16640: MOV XR,XL COPY TREE POINTER
16641: JSR CDGEX BUILD EXPRESSION BLOCK
16642: ZER R$CIM CLEAR POINTER
16643: MOV =STGXT,STAGE RESTORE STAGE FOR EXECUTE TIME
16644: *
16645: * MERGE HERE IF NO CONVERSION REQUIRED
16646: *
16647: GTEX1 EXI RETURN TO GTEXP CALLER
16648: *
16649: * HERE IF UNCONVERTIBLE
16650: *
16651: GTEX2 EXI 1 TAKE ERROR EXIT
16652: ENP END PROCEDURE GTEXP
16653: EJC
16654: *
16655: * GTINT -- GET INTEGER VALUE
16656: *
16657: * GTINT IS PASSED AN OBJECT AND RETURNS AN INTEGER AFTER
16658: * PERFORMING ANY NECESSARY CONVERSIONS.
16659: *
16660: * (XR) VALUE TO BE CONVERTED
16661: * JSR GTINT CALL TO CONVERT TO INTEGER
16662: * PPM LOC TRANSFER LOC FOR CONVERT IMPOSSIBLE
16663: * (XR) RESULTING INTEGER
16664: * (WC,RA) DESTROYED
16665: * (WA,WB) DESTROYED (ONLY ON CONVERSION ERR)
16666: * (XR) UNCHANGED (ON CONVERT ERROR)
16667: *
16668: GTINT PRC E,1 ENTRY POINT
16669: BEQ (XR),=B$ICL,GTIN2 JUMP IF ALREADY AN INTEGER
16670: MOV WA,GTINA ELSE SAVE WA
16671: MOV WB,GTINB SAVE WB
16672: JSR GTNUM CONVERT TO NUMERIC
16673: PPM GTIN3 JUMP IF UNCONVERTIBLE
16674: BEQ WA,=B$ICL,GTIN1 JUMP IF INTEGER
16675: *
16676: * HERE WE CONVERT A REAL TO INTEGER
16677: *
16678: LDR RCVAL(XR) LOAD REAL VALUE
16679: RTI GTIN3 CONVERT TO INTEGER (ERR IF OVFLOW)
16680: JSR ICBLD IF OK BUILD ICBLK
16681: *
16682: * HERE AFTER SUCCESSFUL CONVERSION TO INTEGER
16683: *
16684: GTIN1 MOV GTINA,WA RESTORE WA
16685: MOV GTINB,WB RESTORE WB
16686: *
16687: * COMMON EXIT POINT
16688: *
16689: GTIN2 EXI RETURN TO GTINT CALLER
16690: *
16691: * HERE ON CONVERSION ERROR
16692: *
16693: GTIN3 EXI 1 TAKE CONVERT ERROR EXIT
16694: ENP END PROCEDURE GTINT
16695: EJC
16696: *
16697: * GTNUM -- GET NUMERIC VALUE
16698: *
16699: * GTNUM IS GIVEN AN OBJECT AND RETURNS EITHER AN INTEGER
16700: * OR A REAL, PERFORMING ANY NECESSARY CONVERSIONS.
16701: *
16702: * (XR) OBJECT TO BE CONVERTED
16703: * JSR GTNUM CALL TO CONVERT TO NUMERIC
16704: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
16705: * (XR) POINTER TO RESULT (INT OR REAL)
16706: * (WA) FIRST WORD OF RESULT BLOCK
16707: * (WB,WC,RA) DESTROYED
16708: * (XR) UNCHANGED (ON CONVERT ERROR)
16709: *
16710: GTNUM PRC E,1 ENTRY POINT
16711: MOV (XR),WA LOAD FIRST WORD OF BLOCK
16712: BEQ WA,=B$ICL,GTN34 JUMP IF INTEGER (NO CONVERSION)
16713: BEQ WA,=B$RCL,GTN34 JUMP IF REAL (NO CONVERSION)
16714: *
16715: * AT THIS POINT THE ONLY POSSIBILITY IS TO CONVERT A STRING
16716: * TO AN INTEGER OR REAL AS APPROPRIATE.
16717: *
16718: MOV XR,-(XS) STACK ARGUMENT IN CASE CONVERT ERR
16719: MOV XR,-(XS) STACK ARGUMENT FOR GTSTG
16720: JSR GTSTG CONVERT ARGUMENT TO STRING
16721: PPM GTN36 JUMP IF UNCONVERTIBLE
16722: *
16723: * INITIALIZE NUMERIC CONVERSION
16724: *
16725: LDI INTV0 INITIALIZE INTEGER RESULT TO ZERO
16726: BZE WA,GTN32 JUMP TO EXIT WITH ZERO IF NULL
16727: LCT WA,WA SET BCT COUNTER FOR FOLLOWING LOOPS
16728: ZER GTNNF TENTATIVELY INDICATE RESULT +
16729: STI GTNEX INITIALISE EXPONENT TO ZERO
16730: ZER GTNSC ZERO SCALE IN CASE REAL
16731: ZER GTNDF RESET FLAG FOR DEC POINT FOUND
16732: ZER GTNRD RESET FLAG FOR DIGITS FOUND
16733: LDR REAV0 ZERO REAL ACCUM IN CASE REAL
16734: PLC XR POINT TO ARGUMENT CHARACTERS
16735: *
16736: * MERGE BACK HERE AFTER IGNORING LEADING BLANK
16737: *
16738: GTN01 LCH WB,(XR)+ LOAD FIRST CHARACTER
16739: BLT WB,=CH$D0,GTN02 JUMP IF NOT DIGIT
16740: BLE WB,=CH$D9,GTN06 JUMP IF FIRST CHAR IS A DIGIT
16741: EJC
16742: *
16743: * GTNUM (CONTINUED)
16744: *
16745: * HERE IF FIRST DIGIT IS NON-DIGIT
16746: *
16747: GTN02 BNE WB,=CH$BL,GTN03 JUMP IF NON-BLANK
16748: GTNA2 BCT WA,GTN01 ELSE DECR COUNT AND LOOP BACK
16749: BRN GTN07 JUMP TO RETURN ZERO IF ALL BLANKS
16750: *
16751: * HERE FOR FIRST CHARACTER NON-BLANK, NON-DIGIT
16752: *
16753: GTN03 BEQ WB,=CH$PL,GTN04 JUMP IF PLUS SIGN
16754: BEQ WB,=CH$HT,GTNA2 HORIZONTAL TAB EQUIV TO BLANK
16755: BNE WB,=CH$MN,GTN12 JUMP IF NOT MINUS (MAY BE REAL)
16756: MNZ GTNNF IF MINUS SIGN, SET NEGATIVE FLAG
16757: *
16758: * MERGE HERE AFTER PROCESSING SIGN
16759: *
16760: GTN04 BCT WA,GTN05 JUMP IF CHARS LEFT
16761: BRN GTN36 ELSE ERROR
16762: *
16763: * LOOP TO FETCH CHARACTERS OF AN INTEGER
16764: *
16765: GTN05 LCH WB,(XR)+ LOAD NEXT CHARACTER
16766: BLT WB,=CH$D0,GTN08 JUMP IF NOT A DIGIT
16767: BGT WB,=CH$D9,GTN08 JUMP IF NOT A DIGIT
16768: *
16769: * MERGE HERE FOR FIRST DIGIT
16770: *
16771: GTN06 STI GTNSI SAVE CURRENT VALUE
16772: CVM GTN35 CURRENT*10-(NEW DIG) JUMP IF OVFLOW
16773: MNZ GTNRD SET DIGIT READ FLAG
16774: BCT WA,GTN05 ELSE LOOP BACK IF MORE CHARS
16775: *
16776: * HERE TO EXIT WITH CONVERTED INTEGER VALUE
16777: *
16778: GTN07 BNZ GTNNF,GTN32 JUMP IF NEGATIVE (ALL SET)
16779: NGI ELSE NEGATE
16780: INO GTN32 JUMP IF NO OVERFLOW
16781: BRN GTN36 ELSE SIGNAL ERROR
16782: EJC
16783: *
16784: * GTNUM (CONTINUED)
16785: *
16786: * HERE FOR A NON-DIGIT CHARACTER WHILE ATTEMPTING TO
16787: * CONVERT AN INTEGER, CHECK FOR TRAILING BLANKS OR REAL.
16788: *
16789: GTN08 BEQ WB,=CH$BL,GTNA9 JUMP IF A BLANK
16790: BEQ WB,=CH$HT,GTNA9 JUMP IF HORIZONTAL TAB
16791: ITR ELSE CONVERT INTEGER TO REAL
16792: NGR NEGATE TO GET POSITIVE VALUE
16793: BRN GTN12 JUMP TO TRY FOR REAL
16794: *
16795: * HERE WE SCAN OUT BLANKS TO END OF STRING
16796: *
16797: GTN09 LCH WB,(XR)+ GET NEXT CHAR
16798: BEQ WB,=CH$HT,GTNA9 JUMP IF HORIZONTAL TAB
16799: BNE WB,=CH$BL,GTN36 ERROR IF NON-BLANK
16800: GTNA9 BCT WA,GTN09 LOOP BACK IF MORE CHARS TO CHECK
16801: BRN GTN07 RETURN INTEGER IF ALL BLANKS
16802: *
16803: * LOOP TO COLLECT MANTISSA OF REAL
16804: *
16805: GTN10 LCH WB,(XR)+ LOAD NEXT CHARACTER
16806: BLT WB,=CH$D0,GTN12 JUMP IF NON-NUMERIC
16807: BGT WB,=CH$D9,GTN12 JUMP IF NON-NUMERIC
16808: *
16809: * MERGE HERE TO COLLECT FIRST REAL DIGIT
16810: *
16811: GTN11 SUB =CH$D0,WB CONVERT DIGIT TO NUMBER
16812: MLR REAVT MULTIPLY REAL BY 10.0
16813: ROV GTN36 CONVERT ERROR IF OVERFLOW
16814: STR GTNSR SAVE RESULT
16815: MTI WB GET NEW DIGIT AS INTEGER
16816: ITR CONVERT NEW DIGIT TO REAL
16817: ADR GTNSR ADD TO GET NEW TOTAL
16818: ADD GTNDF,GTNSC INCREMENT SCALE IF AFTER DEC POINT
16819: MNZ GTNRD SET DIGIT FOUND FLAG
16820: BCT WA,GTN10 LOOP BACK IF MORE CHARS
16821: BRN GTN22 ELSE JUMP TO SCALE
16822: EJC
16823: *
16824: * GTNUM (CONTINUED)
16825: *
16826: * HERE IF NON-DIGIT FOUND WHILE COLLECTING A REAL
16827: *
16828: GTN12 BNE WB,=CH$DT,GTN13 JUMP IF NOT DEC POINT
16829: BNZ GTNDF,GTN36 IF DEC POINT, ERROR IF ONE ALREADY
16830: MOV =NUM01,GTNDF ELSE SET FLAG FOR DEC POINT
16831: BCT WA,GTN10 LOOP BACK IF MORE CHARS
16832: BRN GTN22 ELSE JUMP TO SCALE
16833: *
16834: * HERE IF NOT DECIMAL POINT
16835: *
16836: GTN13 BEQ WB,=CH$LE,GTN15 JUMP IF E FOR EXPONENT
16837: BEQ WB,=CH$LD,GTN15 JUMP IF D FOR EXPONENT
16838: BEQ WB,=CH$$E,GTN15 JUMP IF E FOR EXPONENT
16839: BEQ WB,=CH$$D,GTN15 JUMP IF D FOR EXPONENT
16840: *
16841: * HERE CHECK FOR TRAILING BLANKS
16842: *
16843: GTN14 BEQ WB,=CH$BL,GTNB4 JUMP IF BLANK
16844: BEQ WB,=CH$HT,GTNB4 JUMP IF HORIZONTAL TAB
16845: BRN GTN36 ERROR IF NON-BLANK
16846: *
16847: GTNB4 LCH WB,(XR)+ GET NEXT CHARACTER
16848: BCT WA,GTN14 LOOP BACK TO CHECK IF MORE
16849: BRN GTN22 ELSE JUMP TO SCALE
16850: *
16851: * HERE TO READ AND PROCESS AN EXPONENT
16852: *
16853: GTN15 ZER GTNES SET EXPONENT SIGN POSITIVE
16854: LDI INTV0 INITIALIZE EXPONENT TO ZERO
16855: MNZ GTNDF RESET NO DEC POINT INDICATION
16856: BCT WA,GTN16 JUMP SKIPPING PAST E OR D
16857: BRN GTN36 ERROR IF NULL EXPONENT
16858: *
16859: * CHECK FOR EXPONENT SIGN
16860: *
16861: GTN16 LCH WB,(XR)+ LOAD FIRST EXPONENT CHARACTER
16862: BEQ WB,=CH$PL,GTN17 JUMP IF PLUS SIGN
16863: BNE WB,=CH$MN,GTN19 ELSE JUMP IF NOT MINUS SIGN
16864: MNZ GTNES SET SIGN NEGATIVE IF MINUS SIGN
16865: *
16866: * MERGE HERE AFTER PROCESSING EXPONENT SIGN
16867: *
16868: GTN17 BCT WA,GTN18 JUMP IF CHARS LEFT
16869: BRN GTN36 ELSE ERROR
16870: *
16871: * LOOP TO CONVERT EXPONENT DIGITS
16872: *
16873: GTN18 LCH WB,(XR)+ LOAD NEXT CHARACTER
16874: EJC
16875: *
16876: * GTNUM (CONTINUED)
16877: *
16878: * MERGE HERE FOR FIRST EXPONENT DIGIT
16879: *
16880: GTN19 BLT WB,=CH$D0,GTN20 JUMP IF NOT DIGIT
16881: BGT WB,=CH$D9,GTN20 JUMP IF NOT DIGIT
16882: CVM GTN36 ELSE CURRENT*10, SUBTRACT NEW DIGIT
16883: BCT WA,GTN18 LOOP BACK IF MORE CHARS
16884: BRN GTN21 JUMP IF EXPONENT FIELD IS EXHAUSTED
16885: *
16886: * HERE TO CHECK FOR TRAILING BLANKS AFTER EXPONENT
16887: *
16888: GTN20 BEQ WB,=CH$BL,GTNC0 JUMP IF BLANK
16889: BEQ WB,=CH$HT,GTNC0 JUMP IF HORIZONTAL TAB
16890: BRN GTN36 ERROR IF NON-BLANK
16891: *
16892: GTNC0 LCH WB,(XR)+ GET NEXT CHARACTER
16893: BCT WA,GTN20 LOOP BACK TILL ALL BLANKS SCANNED
16894: *
16895: * MERGE HERE AFTER COLLECTING EXPONENT
16896: *
16897: GTN21 STI GTNEX SAVE COLLECTED EXPONENT
16898: BNZ GTNES,GTN22 JUMP IF IT WAS NEGATIVE
16899: NGI ELSE COMPLEMENT
16900: IOV GTN36 ERROR IF OVERFLOW
16901: STI GTNEX AND STORE POSITIVE EXPONENT
16902: *
16903: * MERGE HERE WITH EXPONENT (0 IF NONE GIVEN)
16904: *
16905: GTN22 BZE GTNRD,GTN36 ERROR IF NOT DIGITS COLLECTED
16906: BZE GTNDF,GTN36 ERROR IF NO EXPONENT OR DEC POINT
16907: MTI GTNSC ELSE LOAD SCALE AS INTEGER
16908: SBI GTNEX SUBTRACT EXPONENT
16909: IOV GTN36 ERROR IF OVERFLOW
16910: ILT GTN26 JUMP IF WE MUST SCALE UP
16911: *
16912: * HERE WE HAVE A NEGATIVE EXPONENT, SO SCALE DOWN
16913: *
16914: MFI WA,GTN36 LOAD SCALE FACTOR, ERR IF OVFLOW
16915: *
16916: * LOOP TO SCALE DOWN IN STEPS OF 10**10
16917: *
16918: GTN23 BLE WA,=NUM10,GTN24 JUMP IF 10 OR LESS TO GO
16919: DVR REATT ELSE DIVIDE BY 10**10
16920: SUB =NUM10,WA DECREMENT SCALE
16921: BRN GTN23 AND LOOP BACK
16922: EJC
16923: *
16924: * GTNUM (CONTINUED)
16925: *
16926: * HERE SCALE REST OF WAY FROM POWERS OF TEN TABLE
16927: *
16928: GTN24 BZE WA,GTN30 JUMP IF SCALED
16929: LCT WB,=CFP$R ELSE GET INDEXING FACTOR
16930: MOV =REAV1,XR POINT TO POWERS OF TEN TABLE
16931: WTB WA CONVERT REMAINING SCALE TO BYTE OFS
16932: *
16933: * LOOP TO POINT TO POWERS OF TEN TABLE ENTRY
16934: *
16935: GTN25 ADD WA,XR BUMP POINTER
16936: BCT WB,GTN25 ONCE FOR EACH VALUE WORD
16937: DVR (XR) SCALE DOWN AS REQUIRED
16938: BRN GTN30 AND JUMP
16939: *
16940: * COME HERE TO SCALE RESULT UP (POSITIVE EXPONENT)
16941: *
16942: GTN26 NGI GET ABSOLUTE VALUE OF EXPONENT
16943: IOV GTN36 ERROR IF OVERFLOW
16944: MFI WA,GTN36 ACQUIRE SCALE, ERROR IF OVFLOW
16945: *
16946: * LOOP TO SCALE UP IN STEPS OF 10**10
16947: *
16948: GTN27 BLE WA,=NUM10,GTN28 JUMP IF 10 OR LESS TO GO
16949: MLR REATT ELSE MULTIPLY BY 10**10
16950: ROV GTN36 ERROR IF OVERFLOW
16951: SUB =NUM10,WA ELSE DECREMENT SCALE
16952: BRN GTN27 AND LOOP BACK
16953: *
16954: * HERE TO SCALE UP REST OF WAY WITH TABLE
16955: *
16956: GTN28 BZE WA,GTN30 JUMP IF SCALED
16957: LCT WB,=CFP$R ELSE GET INDEXING FACTOR
16958: MOV =REAV1,XR POINT TO POWERS OF TEN TABLE
16959: WTB WA CONVERT REMAINING SCALE TO BYTE OFS
16960: *
16961: * LOOP TO POINT TO PROPER ENTRY IN POWERS OF TEN TABLE
16962: *
16963: GTN29 ADD WA,XR BUMP POINTER
16964: BCT WB,GTN29 ONCE FOR EACH WORD IN VALUE
16965: MLR (XR) SCALE UP
16966: ROV GTN36 ERROR IF OVERFLOW
16967: EJC
16968: *
16969: * GTNUM (CONTINUED)
16970: *
16971: * HERE WITH REAL VALUE SCALED AND READY EXCEPT FOR SIGN
16972: *
16973: GTN30 BZE GTNNF,GTN31 JUMP IF POSITIVE
16974: NGR ELSE NEGATE
16975: *
16976: * HERE WITH PROPERLY SIGNED REAL VALUE IN (RA)
16977: *
16978: GTN31 JSR RCBLD BUILD REAL BLOCK
16979: BRN GTN33 MERGE TO EXIT
16980: *
16981: * HERE WITH PROPERLY SIGNED INTEGER VALUE IN (IA)
16982: *
16983: GTN32 JSR ICBLD BUILD ICBLK
16984: *
16985: * REAL MERGES HERE
16986: *
16987: GTN33 MOV (XR),WA LOAD FIRST WORD OF RESULT BLOCK
16988: ICA XS POP ARGUMENT OFF STACK
16989: *
16990: * COMMON EXIT POINT
16991: *
16992: GTN34 EXI RETURN TO GTNUM CALLER
16993: *
16994: * COME HERE IF OVERFLOW OCCURS DURING COLLECTION OF INTEGER
16995: *
16996: GTN35 LDI GTNSI RELOAD INTEGER SO FAR
16997: ITR CONVERT TO REAL
16998: NGR MAKE VALUE POSITIVE
16999: BRN GTN11 MERGE WITH REAL CIRCUIT
17000: *
17001: * HERE FOR UNCONVERTIBLE TO STRING OR CONVERSION ERROR
17002: *
17003: GTN36 MOV (XS)+,XR RELOAD ORIGINAL ARGUMENT
17004: EXI 1 TAKE CONVERT-ERROR EXIT
17005: ENP END PROCEDURE GTNUM
17006: EJC
17007: *
17008: * GTNVR -- CONVERT TO NATURAL VARIABLE
17009: *
17010: * GTNVR LOCATES A VARIABLE BLOCK (VRBLK) GIVEN EITHER AN
17011: * APPROPRIATE NAME (NMBLK) OR A NON-NULL STRING (SCBLK).
17012: *
17013: * (XR) ARGUMENT
17014: * JSR GTNVR CALL TO CONVERT TO NATURAL VARIABLE
17015: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
17016: * (XR) POINTER TO VRBLK
17017: * (WA,WB) DESTROYED (CONVERSION ERROR ONLY)
17018: * (WC) DESTROYED
17019: *
17020: GTNVR PRC E,1 ENTRY POINT
17021: BNE (XR),=B$NML,GNV02 JUMP IF NOT NAME
17022: MOV NMBAS(XR),XR ELSE LOAD NAME BASE IF NAME
17023: BLO XR,STATE,GNV07 SKIP IF VRBLK (IN STATIC REGION)
17024: *
17025: * COMMON ERROR EXIT
17026: *
17027: GNV01 EXI 1 TAKE CONVERT-ERROR EXIT
17028: *
17029: * HERE IF NOT NAME
17030: *
17031: GNV02 MOV WA,GNVSA SAVE WA
17032: MOV WB,GNVSB SAVE WB
17033: MOV XR,-(XS) STACK ARGUMENT FOR GTSTG
17034: JSR GTSTG CONVERT ARGUMENT TO STRING
17035: PPM GNV01 JUMP IF CONVERSION ERROR
17036: BZE WA,GNV01 NULL STRING IS AN ERROR
17037: JSR FLSTG FOLD LOWER CASE TO UPPER CASE
17038: MOV XL,-(XS) SAVE XL
17039: MOV XR,-(XS) STACK STRING PTR FOR LATER
17040: MOV XR,WB COPY STRING POINTER
17041: ADD *SCHAR,WB POINT TO CHARACTERS OF STRING
17042: MOV WB,GNVST SAVE POINTER TO CHARACTERS
17043: MOV WA,WB COPY LENGTH
17044: CTW WB,0 GET NUMBER OF WORDS IN NAME
17045: MOV WB,GNVNW SAVE FOR LATER
17046: JSR HASHS COMPUTE HASH INDEX FOR STRING
17047: RMI HSHNB COMPUTE HASH OFFSET BY TAKING MOD
17048: MFI WC GET AS OFFSET
17049: WTB WC CONVERT OFFSET TO BYTES
17050: ADD HSHTB,WC POINT TO PROPER HASH CHAIN
17051: SUB *VRNXT,WC SUBTRACT OFFSET TO MERGE INTO LOOP
17052: EJC
17053: *
17054: * GTNVR (CONTINUED)
17055: *
17056: * LOOP TO SEARCH HASH CHAIN
17057: *
17058: GNV03 MOV WC,XL COPY HASH CHAIN POINTER
17059: MOV VRNXT(XL),XL POINT TO NEXT VRBLK ON CHAIN
17060: BZE XL,GNV08 JUMP IF END OF CHAIN
17061: MOV XL,WC SAVE POINTER TO THIS VRBLK
17062: BNZ VRLEN(XL),GNV04 JUMP IF NOT SYSTEM VARIABLE
17063: MOV VRSVP(XL),XL ELSE POINT TO SVBLK
17064: SUB *VRSOF,XL ADJUST OFFSET FOR MERGE
17065: *
17066: * MERGE HERE WITH STRING PTR (LIKE VRBLK) IN XL
17067: *
17068: GNV04 BNE WA,VRLEN(XL),GNV03 BACK FOR NEXT VRBLK IF LENGTHS NE
17069: ADD *VRCHS,XL ELSE POINT TO CHARS OF CHAIN ENTRY
17070: LCT WB,GNVNW GET WORD COUNTER TO CONTROL LOOP
17071: MOV GNVST,XR POINT TO CHARS OF NEW NAME
17072: *
17073: * LOOP TO COMPARE CHARACTERS OF THE TWO NAMES
17074: *
17075: GNV05 CNE (XR),(XL),GNV03 JUMP IF NO MATCH FOR NEXT VRBLK
17076: ICA XR BUMP NEW NAME POINTER
17077: ICA XL BUMP VRBLK IN CHAIN NAME POINTER
17078: BCT WB,GNV05 ELSE LOOP TILL ALL COMPARED
17079: MOV WC,XR WE HAVE FOUND A MATCH, GET VRBLK
17080: *
17081: * EXIT POINT AFTER FINDING VRBLK OR BUILDING NEW ONE
17082: *
17083: GNV06 MOV GNVSA,WA RESTORE WA
17084: MOV GNVSB,WB RESTORE WB
17085: ICA XS POP STRING POINTER
17086: MOV (XS)+,XL RESTORE XL
17087: *
17088: * COMMON EXIT POINT
17089: *
17090: GNV07 EXI RETURN TO GTNVR CALLER
17091: *
17092: * NOT FOUND, PREPARE TO SEARCH SYSTEM VARIABLE TABLE
17093: *
17094: GNV08 ZER XR CLEAR GARBAGE XR POINTER
17095: MOV WC,GNVHE SAVE PTR TO END OF HASH CHAIN
17096: BGT WA,=NUM09,GNV14 CANNOT BE SYSTEM VAR IF LENGTH GT 9
17097: MOV WA,XL ELSE COPY LENGTH
17098: WTB XL CONVERT TO BYTE OFFSET
17099: MOV VSRCH(XL),XL POINT TO FIRST SVBLK OF THIS LENGTH
17100: EJC
17101: *
17102: * GTNVR (CONTINUED)
17103: *
17104: * LOOP TO SEARCH ENTRIES IN STANDARD VARIABLE TABLE
17105: *
17106: GNV09 MOV XL,GNVSP SAVE TABLE POINTER
17107: MOV (XL)+,WC LOAD SVBIT BIT STRING
17108: MOV (XL)+,WB LOAD LENGTH FROM TABLE ENTRY
17109: BNE WA,WB,GNV14 JUMP IF END OF RIGHT LENGTH ENTIRES
17110: LCT WB,GNVNW GET WORD COUNTER TO CONTROL LOOP
17111: MOV GNVST,XR POINT TO CHARS OF NEW NAME
17112: *
17113: * LOOP TO CHECK FOR MATCHING NAMES
17114: *
17115: GNV10 CNE (XR),(XL),GNV11 JUMP IF NAME MISMATCH
17116: ICA XR ELSE BUMP NEW NAME POINTER
17117: ICA XL BUMP SVBLK POINTER
17118: BCT WB,GNV10 ELSE LOOP UNTIL ALL CHECKED
17119: *
17120: * HERE WE HAVE A MATCH IN THE STANDARD VARIABLE TABLE
17121: *
17122: ZER WC SET VRLEN VALUE ZERO
17123: MOV *VRSI$,WA SET STANDARD SIZE
17124: BRN GNV15 JUMP TO BUILD VRBLK
17125: *
17126: * HERE IF NO MATCH WITH TABLE ENTRY IN SVBLKS TABLE
17127: *
17128: GNV11 ICA XL BUMP PAST WORD OF CHARS
17129: BCT WB,GNV11 LOOP BACK IF MORE TO GO
17130: RSH WC,SVNBT REMOVE UNINTERESTING BITS
17131: *
17132: * LOOP TO BUMP TABLE PTR FOR EACH FLAGGED WORD
17133: *
17134: GNV12 MOV BITS1,WB LOAD BIT TO TEST
17135: ANB WC,WB TEST FOR WORD PRESENT
17136: ZRB WB,GNV13 JUMP IF NOT PRESENT
17137: ICA XL ELSE BUMP TABLE POINTER
17138: *
17139: * HERE AFTER DEALING WITH ONE WORD (ONE BIT)
17140: *
17141: GNV13 RSH WC,1 REMOVE BIT ALREADY PROCESSED
17142: NZB WC,GNV12 LOOP BACK IF MORE BITS TO TEST
17143: BRN GNV09 ELSE LOOP BACK FOR NEXT SVBLK
17144: *
17145: * HERE IF NOT SYSTEM VARIABLE
17146: *
17147: GNV14 MOV WA,WC COPY VRLEN VALUE
17148: MOV =VRCHS,WA LOAD STANDARD SIZE -CHARS
17149: ADD GNVNW,WA ADJUST FOR CHARS OF NAME
17150: WTB WA CONVERT LENGTH TO BYTES
17151: EJC
17152: *
17153: * GTNVR (CONTINUED)
17154: *
17155: * MERGE HERE TO BUILD VRBLK
17156: *
17157: GNV15 JSR ALOST ALLOCATE SPACE FOR VRBLK (STATIC)
17158: MOV XR,WB SAVE VRBLK POINTER
17159: MOV =STNVR,XL POINT TO MODEL VARIABLE BLOCK
17160: MOV *VRLEN,WA SET LENGTH OF STANDARD FIELDS
17161: MVW SET INITIAL FIELDS OF NEW BLOCK
17162: MOV GNVHE,XL LOAD POINTER TO END OF HASH CHAIN
17163: MOV WB,VRNXT(XL) ADD NEW BLOCK TO END OF CHAIN
17164: MOV WC,(XR)+ SET VRLEN FIELD, BUMP PTR
17165: MOV GNVNW,WA GET LENGTH IN WORDS
17166: WTB WA CONVERT TO LENGTH IN BYTES
17167: BZE WC,GNV16 JUMP IF SYSTEM VARIABLE
17168: *
17169: * HERE FOR NON-SYSTEM VARIABLE -- SET CHARS OF NAME
17170: *
17171: MOV (XS),XL POINT BACK TO STRING NAME
17172: ADD *SCHAR,XL POINT TO CHARS OF NAME
17173: MVW MOVE CHARACTERS INTO PLACE
17174: MOV WB,XR RESTORE VRBLK POINTER
17175: BRN GNV06 JUMP BACK TO EXIT
17176: *
17177: * HERE FOR SYSTEM VARIABLE CASE TO FILL IN FIELDS WHERE
17178: * NECESSARY FROM THE FIELDS PRESENT IN THE SVBLK.
17179: *
17180: GNV16 MOV GNVSP,XL LOAD POINTER TO SVBLK
17181: MOV XL,(XR) SET SVBLK PTR IN VRBLK
17182: MOV WB,XR RESTORE VRBLK POINTER
17183: MOV SVBIT(XL),WB LOAD BIT INDICATORS
17184: ADD *SVCHS,XL POINT TO CHARACTERS OF NAME
17185: ADD WA,XL POINT PAST CHARACTERS
17186: *
17187: * SKIP PAST KEYWORD NUMBER (SVKNM) IF PRESENT
17188: *
17189: MOV BTKNM,WC LOAD TEST BIT
17190: ANB WB,WC AND TO TEST
17191: ZRB WC,GNV17 JUMP IF NO KEYWORD NUMBER
17192: ICA XL ELSE BUMP POINTER
17193: EJC
17194: *
17195: * GTNVR (CONTINUED)
17196: *
17197: * HERE TEST FOR FUNCTION (SVFNC AND SVNAR)
17198: *
17199: GNV17 MOV BTFNC,WC GET TEST BIT
17200: ANB WB,WC AND TO TEST
17201: ZRB WC,GNV18 SKIP IF NO SYSTEM FUNCTION
17202: MOV XL,VRFNC(XR) ELSE POINT VRFNC TO SVFNC FIELD
17203: ADD *NUM02,XL AND BUMP PAST SVFNC, SVNAR FIELDS
17204: *
17205: * NOW TEST FOR LABEL (SVLBL)
17206: *
17207: GNV18 MOV BTLBL,WC GET TEST BIT
17208: ANB WB,WC AND TO TEST
17209: ZRB WC,GNV19 JUMP IF BIT IS OFF (NO SYSTEM LABL)
17210: MOV XL,VRLBL(XR) ELSE POINT VRLBL TO SVLBL FIELD
17211: ICA XL BUMP PAST SVLBL FIELD
17212: *
17213: * NOW TEST FOR VALUE (SVVAL)
17214: *
17215: GNV19 MOV BTVAL,WC LOAD TEST BIT
17216: ANB WB,WC AND TO TEST
17217: ZRB WC,GNV06 ALL DONE IF NO VALUE
17218: MOV (XL),VRVAL(XR) ELSE SET INITIAL VALUE
17219: MOV =B$VRE,VRSTO(XR) SET ERROR STORE ACCESS
17220: BRN GNV06 MERGE BACK TO EXIT TO CALLER
17221: ENP END PROCEDURE GTNVR
17222: EJC
17223: *
17224: * GTPAT -- GET PATTERN
17225: *
17226: * GTPAT IS PASSED AN OBJECT IN (XR) AND RETURNS A
17227: * PATTERN AFTER PERFORMING ANY NECESSARY CONVERSIONS
17228: *
17229: * (XR) INPUT ARGUMENT
17230: * JSR GTPAT CALL TO CONVERT TO PATTERN
17231: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
17232: * (XR) RESULTING PATTERN
17233: * (WA) DESTROYED
17234: * (WB) DESTROYED (ONLY ON CONVERT ERROR)
17235: * (XR) UNCHANGED (ONLY ON CONVERT ERROR)
17236: *
17237: GTPAT PRC E,1 ENTRY POINT
17238: BHI (XR),=P$AAA,GTPT5 JUMP IF PATTERN ALREADY
17239: *
17240: * HERE IF NOT PATTERN, TRY FOR STRING
17241: *
17242: MOV WB,GTPSB SAVE WB
17243: MOV XR,-(XS) STACK ARGUMENT FOR GTSTG
17244: JSR GTSTG CONVERT ARGUMENT TO STRING
17245: PPM GTPT2 JUMP IF IMPOSSIBLE
17246: *
17247: * HERE WE HAVE A STRING
17248: *
17249: BNZ WA,GTPT1 JUMP IF NON-NULL
17250: *
17251: * HERE FOR NULL STRING. GENERATE POINTER TO NULL PATTERN.
17252: *
17253: MOV =NDNTH,XR POINT TO NOTHEN NODE
17254: BRN GTPT4 JUMP TO EXIT
17255: EJC
17256: *
17257: * GTPAT (CONTINUED)
17258: *
17259: * HERE FOR NON-NULL STRING
17260: *
17261: GTPT1 MOV =P$STR,WB LOAD PCODE FOR MULTI-CHAR STRING
17262: BNE WA,=NUM01,GTPT3 JUMP IF MULTI-CHAR STRING
17263: *
17264: * HERE FOR ONE CHARACTER STRING, SHARE ONE CHARACTER ANY
17265: *
17266: PLC XR POINT TO CHARACTER
17267: LCH WA,(XR) LOAD CHARACTER
17268: MOV WA,XR SET AS PARM1
17269: MOV =P$ANS,WB POINT TO PCODE FOR 1-CHAR ANY
17270: BRN GTPT3 JUMP TO BUILD NODE
17271: *
17272: * HERE IF ARGUMENT IS NOT CONVERTIBLE TO STRING
17273: *
17274: GTPT2 MOV =P$EXA,WB SET PCODE FOR EXPRESSION IN CASE
17275: BLO (XR),=B$E$$,GTPT3 JUMP TO BUILD NODE IF EXPRESSION
17276: *
17277: * HERE WE HAVE AN ERROR (CONVERSION IMPOSSIBLE)
17278: *
17279: EXI 1 TAKE CONVERT ERROR EXIT
17280: *
17281: * MERGE HERE TO BUILD NODE FOR STRING OR EXPRESSION
17282: *
17283: GTPT3 JSR PBILD CALL ROUTINE TO BUILD PATTERN NODE
17284: *
17285: * COMMON EXIT AFTER SUCCESSFUL CONVERSION
17286: *
17287: GTPT4 MOV GTPSB,WB RESTORE WB
17288: *
17289: * MERGE HERE TO EXIT OF NO CONVERSION REQUIRED
17290: *
17291: GTPT5 EXI RETURN TO GTPAT CALLER
17292: ENP END PROCEDURE GTPAT
17293: EJC
17294: *
17295: * GTREA -- GET REAL VALUE
17296: *
17297: * GTREA IS PASSED AN OBJECT AND RETURNS A REAL VALUE
17298: * PERFORMING ANY NECESSARY CONVERSIONS.
17299: *
17300: * (XR) OBJECT TO BE CONVERTED
17301: * JSR GTREA CALL TO CONVERT OBJECT TO REAL
17302: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
17303: * (XR) POINTER TO RESULTING REAL
17304: * (WA,WB,WC,RA) DESTROYED
17305: * (XR) UNCHANGED (CONVERT ERROR ONLY)
17306: *
17307: GTREA PRC E,1 ENTRY POINT
17308: MOV (XR),WA GET FIRST WORD OF BLOCK
17309: BEQ WA,=B$RCL,GTRE2 JUMP IF REAL
17310: JSR GTNUM ELSE CONVERT ARGUMENT TO NUMERIC
17311: PPM GTRE3 JUMP IF UNCONVERTIBLE
17312: BEQ WA,=B$RCL,GTRE2 JUMP IF REAL WAS RETURNED
17313: *
17314: * HERE FOR CASE OF AN INTEGER TO CONVERT TO REAL
17315: *
17316: GTRE1 LDI ICVAL(XR) LOAD INTEGER
17317: ITR CONVERT TO REAL
17318: JSR RCBLD BUILD RCBLK
17319: *
17320: * EXIT WITH REAL
17321: *
17322: GTRE2 EXI RETURN TO GTREA CALLER
17323: *
17324: * HERE ON CONVERSION ERROR
17325: *
17326: GTRE3 EXI 1 TAKE CONVERT ERROR EXIT
17327: ENP END PROCEDURE GTREA
17328: EJC
17329: *
17330: * GTSMI -- GET SMALL INTEGER
17331: *
17332: * GTSMI IS PASSED A SNOBOL OBJECT AND RETURNS AN ADDRESS
17333: * INTEGER IN THE RANGE (0 LE N LE DNAMB). SUCH A VALUE CAN
17334: * ONLY BE DERIVED FROM AN INTEGER IN THE APPROPRIATE RANGE.
17335: * SMALL INTEGERS NEVER APPEAR AS SNOBOL VALUES. HOWEVER,
17336: * THEY ARE USED INTERNALLY FOR A VARIETY OF PURPOSES.
17337: *
17338: * -(XS) ARGUMENT TO CONVERT (ON STACK)
17339: * JSR GTSMI CALL TO CONVERT TO SMALL INTEGER
17340: * PPM LOC TRANSFER LOC FOR NOT INTEGER
17341: * PPM LOC TRANSFER LOC FOR LT 0, GT DNAMB
17342: * (XR,WC) RESULTING SMALL INT (TWO COPIES)
17343: * (XS) POPPED
17344: * (RA) DESTROYED
17345: * (WA,WB) DESTROYED (ON CONVERT ERROR ONLY)
17346: * (XR) INPUT ARG (CONVERT ERROR ONLY)
17347: *
17348: GTSMI PRC N,2 ENTRY POINT
17349: MOV (XS)+,XR LOAD ARGUMENT
17350: BEQ (XR),=B$ICL,GTSM1 SKIP IF ALREADY AN INTEGER
17351: *
17352: * HERE IF NOT AN INTEGER
17353: *
17354: JSR GTINT CONVERT ARGUMENT TO INTEGER
17355: PPM GTSM2 JUMP IF CONVERT IS IMPOSSIBLE
17356: *
17357: * MERGE HERE WITH INTEGER
17358: *
17359: GTSM1 LDI ICVAL(XR) LOAD INTEGER VALUE
17360: MFI WC,GTSM3 MOVE AS ONE WORD, JUMP IF OVFLOW
17361: BGT WC,MXLEN,GTSM3 OR IF TOO SMALL
17362: MOV WC,XR COPY RESULT TO XR
17363: EXI RETURN TO GTSMI CALLER
17364: *
17365: * HERE IF UNCONVERTIBLE TO INTEGER
17366: *
17367: GTSM2 EXI 1 TAKE NON-INTEGER ERROR EXIT
17368: *
17369: * HERE IF OUT OF RANGE
17370: *
17371: GTSM3 EXI 2 TAKE OUT-OF-RANGE ERROR EXIT
17372: ENP END PROCEDURE GTSMI
17373: EJC
17374: *
17375: * GTSTG -- GET STRING
17376: *
17377: * GTSTG IS PASSED AN OBJECT AND RETURNS A STRING WITH
17378: * ANY NECESSARY CONVERSIONS PERFORMED.
17379: *
17380: * -(XS) INPUT ARGUMENT (ON STACK)
17381: * JSR GTSTG CALL TO CONVERT TO STRING
17382: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
17383: * (XR) POINTER TO RESULTING STRING
17384: * (WA) LENGTH OF STRING IN CHARACTERS
17385: * (XS) POPPED
17386: * (RA) DESTROYED
17387: * (XR) INPUT ARG (CONVERT ERROR ONLY)
17388: *
17389: GTSTG PRC N,1 ENTRY POINT
17390: MOV (XS)+,XR LOAD ARGUMENT, POP STACK
17391: BEQ (XR),=B$SCL,GTS30 JUMP IF ALREADY A STRING
17392: *
17393: * HERE IF NOT A STRING ALREADY
17394: *
17395: GTS01 MOV XR,-(XS) RESTACK ARGUMENT IN CASE ERROR
17396: MOV XL,-(XS) SAVE XL
17397: MOV WB,GTSVB SAVE WB
17398: MOV WC,GTSVC SAVE WC
17399: MOV (XR),WA LOAD FIRST WORD OF BLOCK
17400: BEQ WA,=B$ICL,GTS05 JUMP TO CONVERT INTEGER
17401: BEQ WA,=B$RCL,GTS10 JUMP TO CONVERT REAL
17402: BEQ WA,=B$NML,GTS03 JUMP TO CONVERT NAME
17403: BEQ WA,=B$BCT,GTS32 JUMP TO CONVERT BUFFER
17404: *
17405: * HERE ON CONVERSION ERROR
17406: *
17407: GTS02 MOV (XS)+,XL RESTORE XL
17408: MOV (XS)+,XR RELOAD INPUT ARGUMENT
17409: EXI 1 TAKE CONVERT ERROR EXIT
17410: EJC
17411: *
17412: * GTSTG (CONTINUED)
17413: *
17414: * HERE TO CONVERT A NAME (ONLY POSSIBLE IF NATURAL VAR)
17415: *
17416: GTS03 MOV NMBAS(XR),XL LOAD NAME BASE
17417: BHI XL,STATE,GTS02 ERROR IF NOT NATURAL VAR (STATIC)
17418: ADD *VRSOF,XL ELSE POINT TO POSSIBLE STRING NAME
17419: MOV SCLEN(XL),WA LOAD LENGTH
17420: BNZ WA,GTS04 JUMP IF NOT SYSTEM VARIABLE
17421: MOV VRSVO(XL),XL ELSE POINT TO SVBLK
17422: MOV SVLEN(XL),WA AND LOAD NAME LENGTH
17423: *
17424: * MERGE HERE WITH STRING IN XR, LENGTH IN WA
17425: *
17426: GTS04 ZER WB SET OFFSET TO ZERO
17427: JSR SBSTR USE SBSTR TO COPY STRING
17428: BRN GTS29 JUMP TO EXIT
17429: *
17430: * COME HERE TO CONVERT AN INTEGER
17431: *
17432: GTS05 LDI ICVAL(XR) LOAD INTEGER VALUE
17433: MOV =NUM01,GTSSF SET SIGN FLAG NEGATIVE
17434: ILT GTS06 SKIP IF INTEGER IS NEGATIVE
17435: NGI ELSE NEGATE INTEGER
17436: ZER GTSSF AND RESET NEGATIVE FLAG
17437: EJC
17438: *
17439: * GTSTG (CONTINUED)
17440: *
17441: * HERE WITH SIGN FLAG SET AND SIGN FORCED NEGATIVE AS
17442: * REQUIRED BY THE CVD INSTRUCTION.
17443: *
17444: GTS06 MOV GTSWK,XR POINT TO RESULT WORK AREA
17445: MOV =NSTMX,WB INITIALIZE COUNTER TO MAX LENGTH
17446: PSC XR,WB PREPARE TO STORE (RIGHT-LEFT)
17447: *
17448: * LOOP TO CONVERT DIGITS INTO WORK AREA
17449: *
17450: GTS07 CVD CONVERT ONE DIGIT INTO WA
17451: SCH WA,-(XR) STORE IN WORK AREA
17452: DCV WB DECREMENT COUNTER
17453: INE GTS07 LOOP IF MORE DIGITS TO GO
17454: CSC XR COMPLETE STORE CHARACTERS
17455: *
17456: * MERGE HERE AFTER CONVERTING INTEGER OR REAL INTO WORK
17457: * AREA. WB IS SET TO NSTMX - (NUMBER OF CHARS IN RESULT).
17458: *
17459: GTS08 MOV =NSTMX,WA GET MAX NUMBER OF CHARACTERS
17460: SUB WB,WA COMPUTE LENGTH OF RESULT
17461: MOV WA,XL REMEMBER LENGTH FOR MOVE LATER ON
17462: ADD GTSSF,WA ADD ONE FOR NEGATIVE SIGN IF NEEDED
17463: JSR ALOCS ALLOCATE STRING FOR RESULT
17464: MOV XR,WC SAVE RESULT POINTER FOR THE MOMENT
17465: PSC XR POINT TO CHARS OF RESULT BLOCK
17466: BZE GTSSF,GTS09 SKIP IF POSITIVE
17467: MOV =CH$MN,WA ELSE LOAD NEGATIVE SIGN
17468: SCH WA,(XR)+ AND STORE IT
17469: CSC XR COMPLETE STORE CHARACTERS
17470: *
17471: * HERE AFTER DEALING WITH SIGN
17472: *
17473: GTS09 MOV XL,WA RECALL LENGTH TO MOVE
17474: MOV GTSWK,XL POINT TO RESULT WORK AREA
17475: PLC XL,WB POINT TO FIRST RESULT CHARACTER
17476: MVC MOVE CHARS TO RESULT STRING
17477: MOV WC,XR RESTORE RESULT POINTER
17478: BRN GTS29 JUMP TO EXIT
17479: EJC
17480: *
17481: * GTSTG (CONTINUED)
17482: *
17483: * HERE TO CONVERT A REAL
17484: *
17485: GTS10 LDR RCVAL(XR) LOAD REAL
17486: ZER GTSSF RESET NEGATIVE FLAG
17487: REQ GTS31 SKIP IF ZERO
17488: RGE GTS11 JUMP IF REAL IS POSITIVE
17489: MOV =NUM01,GTSSF ELSE SET NEGATIVE FLAG
17490: NGR AND GET ABSOLUTE VALUE OF REAL
17491: *
17492: * NOW SCALE THE REAL TO THE RANGE (0.1 LE X LT 1.0)
17493: *
17494: GTS11 LDI INTV0 INITIALIZE EXPONENT TO ZERO
17495: *
17496: * LOOP TO SCALE UP IN STEPS OF 10**10
17497: *
17498: GTS12 STR GTSRS SAVE REAL VALUE
17499: SBR REAP1 SUBTRACT 0.1 TO COMPARE
17500: RGE GTS13 JUMP IF SCALE UP NOT REQUIRED
17501: LDR GTSRS ELSE RELOAD VALUE
17502: MLR REATT MULTIPLY BY 10**10
17503: SBI INTVT DECREMENT EXPONENT BY 10
17504: BRN GTS12 LOOP BACK TO TEST AGAIN
17505: *
17506: * TEST FOR SCALE DOWN REQUIRED
17507: *
17508: GTS13 LDR GTSRS RELOAD VALUE
17509: SBR REAV1 SUBTRACT 1.0
17510: RLT GTS17 JUMP IF NO SCALE DOWN REQUIRED
17511: LDR GTSRS ELSE RELOAD VALUE
17512: *
17513: * LOOP TO SCALE DOWN IN STEPS OF 10**10
17514: *
17515: GTS14 SBR REATT SUBTRACT 10**10 TO COMPARE
17516: RLT GTS15 JUMP IF LARGE STEP NOT REQUIRED
17517: LDR GTSRS ELSE RESTORE VALUE
17518: DVR REATT DIVIDE BY 10**10
17519: STR GTSRS STORE NEW VALUE
17520: ADI INTVT INCREMENT EXPONENT BY 10
17521: BRN GTS14 LOOP BACK
17522: EJC
17523: *
17524: * GTSTG (CONTINUED)
17525: *
17526: * AT THIS POINT WE HAVE (1.0 LE X LT 10**10)
17527: * COMPLETE SCALING WITH POWERS OF TEN TABLE
17528: *
17529: GTS15 MOV =REAV1,XR POINT TO POWERS OF TEN TABLE
17530: *
17531: * LOOP TO LOCATE CORRECT ENTRY IN TABLE
17532: *
17533: GTS16 LDR GTSRS RELOAD VALUE
17534: ADI INTV1 INCREMENT EXPONENT
17535: ADD *CFP$R,XR POINT TO NEXT ENTRY IN TABLE
17536: SBR (XR) SUBTRACT IT TO COMPARE
17537: RGE GTS16 LOOP TILL WE FIND A LARGER ENTRY
17538: LDR GTSRS THEN RELOAD THE VALUE
17539: DVR (XR) AND COMPLETE SCALING
17540: STR GTSRS STORE VALUE
17541: *
17542: * WE ARE NOW SCALED, SO ROUND BY ADDING 0.5 * 10**(-CFP$S)
17543: *
17544: GTS17 LDR GTSRS GET VALUE AGAIN
17545: ADR GTSRN ADD ROUNDING FACTOR
17546: STR GTSRS STORE RESULT
17547: *
17548: * THE ROUNDING OPERATION MAY HAVE PUSHED US UP PAST
17549: * 1.0 AGAIN, SO CHECK ONE MORE TIME.
17550: *
17551: SBR REAV1 SUBTRACT 1.0 TO COMPARE
17552: RLT GTS18 SKIP IF OK
17553: ADI INTV1 ELSE INCREMENT EXPONENT
17554: LDR GTSRS RELOAD VALUE
17555: DVR REAVT DIVIDE BY 10.0 TO RESCALE
17556: BRN GTS19 JUMP TO MERGE
17557: *
17558: * HERE IF ROUNDING DID NOT MUCK UP SCALING
17559: *
17560: GTS18 LDR GTSRS RELOAD ROUNDED VALUE
17561: EJC
17562: *
17563: * GTSTG (CONTINUED)
17564: *
17565: * NOW WE HAVE COMPLETED THE SCALING AS FOLLOWS
17566: *
17567: * (IA) SIGNED EXPONENT
17568: * (RA) SCALED REAL (ABSOLUTE VALUE)
17569: *
17570: * IF THE EXPONENT IS NEGATIVE OR GREATER THAN CFP$S, THEN
17571: * WE CONVERT THE NUMBER IN THE FORM.
17572: *
17573: * (NEG SIGN) 0 . (CPF$S DIGITS) E (EXP SIGN) (EXP DIGITS)
17574: *
17575: * IF THE EXPONENT IS POSITIVE AND LESS THAN OR EQUAL TO
17576: * CFP$S, THE NUMBER IS CONVERTED IN THE FORM.
17577: *
17578: * (NEG SIGN) (EXPONENT DIGITS) . (CFP$S-EXPONENT DIGITS)
17579: *
17580: * IN BOTH CASES, THE FORMATS OBTAINED FROM THE ABOVE
17581: * RULES ARE MODIFIED BY DELETING TRAILING ZEROS AFTER THE
17582: * DECIMAL POINT. THERE ARE NO LEADING ZEROS IN THE EXPONENT
17583: * AND THE EXPONENT SIGN IS ALWAYS PRESENT.
17584: *
17585: GTS19 MOV =CFP$S,XL SET NUM DEC DIGITS = CFP$S
17586: MOV =CH$MN,GTSES SET EXPONENT SIGN NEGATIVE
17587: ILT GTS21 ALL SET IF EXPONENT IS NEGATIVE
17588: MFI WA ELSE FETCH EXPONENT
17589: BLE WA,=CFP$S,GTS20 SKIP IF WE CAN USE SPECIAL FORMAT
17590: MTI WA ELSE RESTORE EXPONENT
17591: NGI SET NEGATIVE FOR CVD
17592: MOV =CH$PL,GTSES SET PLUS SIGN FOR EXPONENT SIGN
17593: BRN GTS21 JUMP TO GENERATE EXPONENT
17594: *
17595: * HERE IF WE CAN USE THE FORMAT WITHOUT AN EXPONENT
17596: *
17597: GTS20 SUB WA,XL COMPUTE DIGITS AFTER DECIMAL POINT
17598: LDI INTV0 RESET EXPONENT TO ZERO
17599: EJC
17600: *
17601: * GTSTG (CONTINUED)
17602: *
17603: * MERGE HERE AS FOLLOWS
17604: *
17605: * (IA) EXPONENT ABSOLUTE VALUE
17606: * GTSES CHARACTER FOR EXPONENT SIGN
17607: * (RA) POSITIVE FRACTION
17608: * (XL) NUMBER OF DIGITS AFTER DEC POINT
17609: *
17610: GTS21 MOV GTSWK,XR POINT TO WORK AREA
17611: MOV =NSTMX,WB SET CHARACTER CTR TO MAX LENGTH
17612: PSC XR,WB PREPARE TO STORE (RIGHT TO LEFT)
17613: IEQ GTS23 SKIP EXPONENT IF IT IS ZERO
17614: *
17615: * LOOP TO GENERATE DIGITS OF EXPONENT
17616: *
17617: GTS22 CVD CONVERT A DIGIT INTO WA
17618: SCH WA,-(XR) STORE IN WORK AREA
17619: DCV WB DECREMENT COUNTER
17620: INE GTS22 LOOP BACK IF MORE DIGITS TO GO
17621: *
17622: * HERE GENERATE EXPONENT SIGN AND E
17623: *
17624: MOV GTSES,WA LOAD EXPONENT SIGN
17625: SCH WA,-(XR) STORE IN WORK AREA
17626: MOV =CH$LE,WA GET CHARACTER LETTER E
17627: SCH WA,-(XR) STORE IN WORK AREA
17628: SUB =NUM02,WB DECREMENT COUNTER FOR SIGN AND E
17629: *
17630: * HERE TO GENERATE THE FRACTION
17631: *
17632: GTS23 MLR GTSSC CONVERT REAL TO INTEGER (10**CFP$S)
17633: RTI GET INTEGER (OVERFLOW IMPOSSIBLE)
17634: NGI NEGATE AS REQUIRED BY CVD
17635: *
17636: * LOOP TO SUPPRESS TRAILING ZEROS
17637: *
17638: GTS24 BZE XL,GTS27 JUMP IF NO DIGITS LEFT TO DO
17639: CVD ELSE CONVERT ONE DIGIT
17640: BNE WA,=CH$D0,GTS26 JUMP IF NOT A ZERO
17641: DCV XL DECREMENT COUNTER
17642: BRN GTS24 LOOP BACK FOR NEXT DIGIT
17643: EJC
17644: *
17645: * GTSTG (CONTINUED)
17646: *
17647: * LOOP TO GENERATE DIGITS AFTER DECIMAL POINT
17648: *
17649: GTS25 CVD CONVERT A DIGIT INTO WA
17650: *
17651: * MERGE HERE FIRST TIME
17652: *
17653: GTS26 SCH WA,-(XR) STORE DIGIT
17654: DCV WB DECREMENT COUNTER
17655: DCV XL DECREMENT COUNTER
17656: BNZ XL,GTS25 LOOP BACK IF MORE TO GO
17657: *
17658: * HERE GENERATE THE DECIMAL POINT
17659: *
17660: GTS27 MOV =CH$DT,WA LOAD DECIMAL POINT
17661: SCH WA,-(XR) STORE IN WORK AREA
17662: DCV WB DECREMENT COUNTER
17663: *
17664: * HERE GENERATE THE DIGITS BEFORE THE DECIMAL POINT
17665: *
17666: GTS28 CVD CONVERT A DIGIT INTO WA
17667: SCH WA,-(XR) STORE IN WORK AREA
17668: DCV WB DECREMENT COUNTER
17669: INE GTS28 LOOP BACK IF MORE TO GO
17670: CSC XR COMPLETE STORE CHARACTERS
17671: BRN GTS08 ELSE JUMP BACK TO EXIT
17672: *
17673: * EXIT POINT AFTER SUCCESSFUL CONVERSION
17674: *
17675: GTS29 MOV (XS)+,XL RESTORE XL
17676: ICA XS POP ARGUMENT
17677: MOV GTSVB,WB RESTORE WB
17678: MOV GTSVC,WC RESTORE WC
17679: *
17680: * MERGE HERE IF NO CONVERSION REQUIRED
17681: *
17682: GTS30 MOV SCLEN(XR),WA LOAD STRING LENGTH
17683: EXI RETURN TO CALLER
17684: *
17685: * HERE TO RETURN STRING FOR REAL ZERO
17686: *
17687: GTS31 MOV =SCRE0,XL POINT TO STRING
17688: MOV =NUM02,WA 2 CHARS
17689: ZER WB ZERO OFFSET
17690: JSR SBSTR COPY STRING
17691: BRN GTS29 RETURN
17692: EJC
17693: *
17694: * HERE TO CONVERT A BUFFER BLOCK
17695: *
17696: GTS32 MOV XR,XL COPY ARG PTR
17697: MOV BCLEN(XL),WA GET SIZE TO ALLOCATE
17698: BZE WA,GTS33 IF NULL THEN RETURN NULL
17699: JSR ALOCS ALLOCATE STRING FRAME
17700: MOV XR,WB SAVE STRING PTR
17701: MOV SCLEN(XR),WA GET LENGTH TO MOVE
17702: CTB WA,0 GET AS MULTIPLE OF WORD SIZE
17703: MOV BCBUF(XL),XL POINT TO BFBLK
17704: ADD *SCSI$,XR POINT TO START OF CHARACTER AREA
17705: ADD *BFSI$,XL POINT TO START OF BUFFER CHARS
17706: MVW COPY WORDS
17707: MOV WB,XR RESTORE SCBLK PTR
17708: BRN GTS29 EXIT WITH SCBLK
17709: *
17710: * HERE WHEN NULL BUFFER IS BEING CONVERTED
17711: *
17712: GTS33 MOV =NULLS,XR POINT TO NULL
17713: BRN GTS29 EXIT WITH NULL
17714: ENP END PROCEDURE GTSTG
17715: EJC
17716: *
17717: * GTVAR -- GET VARIABLE FOR I/O/TRACE ASSOCIATION
17718: *
17719: * GTVAR IS USED TO POINT TO AN ACTUAL VARIABLE LOCATION
17720: * FOR THE DETACH,INPUT,OUTPUT,TRACE,STOPTR SYSTEM FUNCTIONS
17721: *
17722: * (XR) ARGUMENT TO FUNCTION
17723: * JSR GTVAR CALL TO LOCATE VARIABLE POINTER
17724: * PPM LOC TRANSFER LOC IF NOT OK VARIABLE
17725: * (XL,WA) NAME BASE,OFFSET OF VARIABLE
17726: * (XR,RA) DESTROYED
17727: * (WB,WC) DESTROYED (CONVERT ERROR ONLY)
17728: * (XR) INPUT ARG (CONVERT ERROR ONLY)
17729: *
17730: GTVAR PRC E,1 ENTRY POINT
17731: BNE (XR),=B$NML,GTVR2 JUMP IF NOT A NAME
17732: MOV NMOFS(XR),WA ELSE LOAD NAME OFFSET
17733: MOV NMBAS(XR),XL LOAD NAME BASE
17734: BEQ (XL),=B$EVT,GTVR1 ERROR IF EXPRESSION VARIABLE
17735: BNE (XL),=B$KVT,GTVR3 ALL OK IF NOT KEYWORD VARIABLE
17736: *
17737: * HERE ON CONVERSION ERROR
17738: *
17739: GTVR1 EXI 1 TAKE CONVERT ERROR EXIT
17740: *
17741: * HERE IF NOT A NAME, TRY CONVERT TO NATURAL VARIABLE
17742: *
17743: GTVR2 MOV WC,GTVRC SAVE WC
17744: JSR GTNVR LOCATE VRBLK IF POSSIBLE
17745: PPM GTVR1 JUMP IF CONVERT ERROR
17746: MOV XR,XL ELSE COPY VRBLK NAME BASE
17747: MOV *VRVAL,WA AND SET OFFSET
17748: MOV GTVRC,WC RESTORE WC
17749: *
17750: * HERE FOR NAME OBTAINED
17751: *
17752: GTVR3 BHI XL,STATE,GTVR4 ALL OK IF NOT NATURAL VARIABLE
17753: BEQ VRSTO(XL),=B$VRE,GTVR1 ERROR IF PROTECTED VARIABLE
17754: *
17755: * COMMON EXIT POINT
17756: *
17757: GTVR4 EXI RETURN TO CALLER
17758: ENP END PROCEDURE GTVAR
17759: EJC
17760: *
17761: * HASHS -- COMPUTE HASH INDEX FOR STRING
17762: *
17763: * HASHS IS USED TO CONVERT A STRING TO A UNIQUE INTEGER
17764: * VALUE. THE RESULTING HASH VALUE IS A POSITIVE INTEGER
17765: * IN THE RANGE 0 TO CFP$M
17766: *
17767: * (XR) STRING TO BE HASHED
17768: * JSR HASHS CALL TO HASH STRING
17769: * (IA) HASH VALUE
17770: * (XR,WB,WC) DESTROYED
17771: *
17772: * THE HASH FUNCTION USED IS AS FOLLOWS.
17773: *
17774: * START WITH THE LENGTH OF THE STRING (SGD07)
17775: *
17776: * TAKE THE FIRST E$HNW WORDS OF THE CHARACTERS FROM
17777: * THE STRING OR ALL THE WORDS IF FEWER THAN E$HNW.
17778: *
17779: * COMPUTE THE EXCLUSIVE OR OF ALL THESE WORDS TREATING
17780: * THEM AS ONE WORD BIT STRING VALUES.
17781: *
17782: * MOVE THE RESULT AS AN INTEGER WITH THE MTI INSTRUCTION.
17783: *
17784: HASHS PRC E,0 ENTRY POINT
17785: MOV SCLEN(XR),WC LOAD STRING LENGTH IN CHARACTERS
17786: MOV WC,WB INITIALIZE WITH LENGTH
17787: BZE WC,HSHS3 JUMP IF NULL STRING
17788: CTW WC,0 ELSE GET NUMBER OF WORDS OF CHARS
17789: ADD *SCHAR,XR POINT TO CHARACTERS OF STRING
17790: BLO WC,=E$HNW,HSHS1 USE WHOLE STRING IF SHORT
17791: MOV =E$HNW,WC ELSE SET TO INVOLVE FIRST E$HNW WDS
17792: *
17793: * HERE WITH COUNT OF WORDS TO CHECK IN WC
17794: *
17795: HSHS1 LCT WC,WC SET COUNTER TO CONTROL LOOP
17796: *
17797: * LOOP TO COMPUTE EXCLUSIVE OR
17798: *
17799: HSHS2 XOB (XR)+,WB EXCLUSIVE OR NEXT WORD OF CHARS
17800: BCT WC,HSHS2 LOOP TILL ALL PROCESSED
17801: *
17802: * MERGE HERE WITH EXCLUSIVE OR IN WB
17803: *
17804: HSHS3 ZGB WB ZEROISE UNDEFINED BITS
17805: ANB BITSM,WB ENSURE IN RANGE 0 TO CFP$M
17806: MTI WB MOVE RESULT AS INTEGER
17807: ZER XR CLEAR GARBAGE VALUE IN XR
17808: EXI RETURN TO HASHS CALLER
17809: ENP END PROCEDURE HASHS
17810: EJC
17811: *
17812: * ICBLD -- BUILD INTEGER BLOCK
17813: *
17814: * (IA) INTEGER VALUE FOR ICBLK
17815: * JSR ICBLD CALL TO BUILD INTEGER BLOCK
17816: * (XR) POINTER TO RESULT ICBLK
17817: * (WA) DESTROYED
17818: *
17819: ICBLD PRC E,0 ENTRY POINT
17820: MFI XR,ICBL1 COPY SMALL INTEGERS
17821: BLE XR,=NUM02,ICBL3 JUMP IF 0,1 OR 2
17822: *
17823: * CONSTRUCT ICBLK
17824: *
17825: ICBL1 MOV DNAMP,XR LOAD POINTER TO NEXT AVAILABLE LOC
17826: ADD *ICSI$,XR POINT PAST NEW ICBLK
17827: BLO XR,DNAME,ICBL2 JUMP IF THERE IS ROOM
17828: MOV *ICSI$,WA ELSE LOAD LENGTH OF ICBLK
17829: JSR ALLOC USE STANDARD ALLOCATOR TO GET BLOCK
17830: ADD WA,XR POINT PAST BLOCK TO MERGE
17831: *
17832: * MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED
17833: *
17834: ICBL2 MOV XR,DNAMP SET NEW POINTER
17835: SUB *ICSI$,XR POINT BACK TO START OF BLOCK
17836: MOV =B$ICL,(XR) STORE TYPE WORD
17837: STI ICVAL(XR) STORE INTEGER VALUE IN ICBLK
17838: EXI RETURN TO ICBLD CALLER
17839: *
17840: * OPTIMISE BY NOT BUILDING ICBLKS FOR SMALL INTEGERS
17841: *
17842: ICBL3 WTB XR CONVERT INTEGER TO OFFSET
17843: MOV INTAB(XR),XR POINT TO PRE-BUILT ICBLK
17844: EXI RETURN
17845: ENP END PROCEDURE ICBLD
17846: EJC
17847: *
17848: * IDENT -- COMPARE TWO VALUES
17849: *
17850: * IDENT COMPARES TWO VALUES IN THE SENSE OF THE IDENT
17851: * DIFFER FUNCTIONS AVAILABLE AT THE SNOBOL LEVEL.
17852: *
17853: * (XR) FIRST ARGUMENT
17854: * (XL) SECOND ARGUMENT
17855: * JSR IDENT CALL TO COMPARE ARGUMENTS
17856: * PPM LOC TRANSFER LOC IF IDENT
17857: * (NORMAL RETURN IF DIFFER)
17858: * (XR,XL,WC,RA) DESTROYED
17859: *
17860: IDENT PRC E,1 ENTRY POINT
17861: BEQ XR,XL,IDEN7 JUMP IF SAME POINTER (IDENT)
17862: MOV (XR),WC ELSE LOAD ARG 1 TYPE WORD
17863: BNE WC,(XL),IDEN1 DIFFER IF ARG 2 TYPE WORD DIFFER
17864: BEQ WC,=B$SCL,IDEN2 JUMP IF STRINGS
17865: BEQ WC,=B$ICL,IDEN4 JUMP IF INTEGERS
17866: BEQ WC,=B$RCL,IDEN5 JUMP IF REALS
17867: BEQ WC,=B$NML,IDEN6 JUMP IF NAMES
17868: *
17869: * FOR ALL OTHER DATATYPES, MUST BE DIFFER IF XR NE XL
17870: *
17871: * MERGE HERE FOR DIFFER
17872: *
17873: IDEN1 EXI TAKE DIFFER EXIT
17874: *
17875: * HERE FOR STRINGS, IDENT ONLY IF LENGTHS AND CHARS SAME
17876: *
17877: IDEN2 MOV SCLEN(XR),WC LOAD ARG 1 LENGTH
17878: BNE WC,SCLEN(XL),IDEN1 DIFFER IF LENGTHS DIFFER
17879: CTW WC,0 GET NUMBER OF WORDS IN STRINGS
17880: ADD *SCHAR,XR POINT TO CHARS OF ARG 1
17881: ADD *SCHAR,XL POINT TO CHARS OF ARG 2
17882: LCT WC,WC SET LOOP COUNTER
17883: *
17884: * LOOP TO COMPARE CHARACTERS. NOTE THAT WA CANNOT BE ZERO
17885: * SINCE ALL NULL STRINGS POINT TO NULLS AND GIVE XL=XR.
17886: *
17887: IDEN3 CNE (XR),(XL),IDEN8 DIFFER IF CHARS DO NOT MATCH
17888: ICA XR ELSE BUMP ARG ONE POINTER
17889: ICA XL BUMP ARG TWO POINTER
17890: BCT WC,IDEN3 LOOP BACK TILL ALL CHECKED
17891: EJC
17892: *
17893: * IDENT (CONTINUED)
17894: *
17895: * HERE TO EXIT FOR CASE OF TWO IDENT STRINGS
17896: *
17897: ZER XL CLEAR GARBAGE VALUE IN XL
17898: ZER XR CLEAR GARBAGE VALUE IN XR
17899: EXI 1 TAKE IDENT EXIT
17900: *
17901: * HERE FOR INTEGERS, IDENT IF SAME VALUES
17902: *
17903: IDEN4 LDI ICVAL(XR) LOAD ARG 1
17904: SBI ICVAL(XL) SUBTRACT ARG 2 TO COMPARE
17905: IOV IDEN1 DIFFER IF OVERFLOW
17906: INE IDEN1 DIFFER IF RESULT IS NOT ZERO
17907: EXI 1 TAKE IDENT EXIT
17908: *
17909: * HERE FOR REALS, IDENT IF SAME VALUES
17910: *
17911: IDEN5 LDR RCVAL(XR) LOAD ARG 1
17912: SBR RCVAL(XL) SUBTRACT ARG 2 TO COMPARE
17913: ROV IDEN1 DIFFER IF OVERFLOW
17914: RNE IDEN1 DIFFER IF RESULT IS NOT ZERO
17915: EXI 1 TAKE IDENT EXIT
17916: *
17917: * HERE FOR NAMES, IDENT IF BASES AND OFFSETS SAME
17918: *
17919: IDEN6 BNE NMOFS(XR),NMOFS(XL),IDEN1 DIFFER IF DIFFERENT OFFSET
17920: BNE NMBAS(XR),NMBAS(XL),IDEN1 DIFFER IF DIFFERENT BASE
17921: *
17922: * MERGE HERE TO SIGNAL IDENT FOR IDENTICAL POINTERS
17923: *
17924: IDEN7 EXI 1 TAKE IDENT EXIT
17925: *
17926: * HERE FOR DIFFER STRINGS
17927: *
17928: IDEN8 ZER XR CLEAR GARBAGE PTR IN XR
17929: ZER XL CLEAR GARBAGE PTR IN XL
17930: EXI RETURN TO CALLER (DIFFER)
17931: ENP END PROCEDURE IDENT
17932: EJC
17933: *
17934: * INOUT - USED TO INITIALISE INPUT AND OUTPUT VARIABLES
17935: *
17936: * (XL) POINTER TO VBL NAME STRING
17937: * (WB) TRBLK TYPE
17938: * JSR INOUT CALL TO PERFORM INITIALISATION
17939: * (XL) VRBLK PTR
17940: * (XR) TRBLK PTR
17941: * (WA,WC) DESTROYED
17942: *
17943: * NOTE THAT TRTER (= TRTRF) FIELD OF STANDARD I/O VARIABLES
17944: * POINTS TO CORRESPONDING SVBLK NOT TO A TRBLK AS IS THE
17945: * CASE FOR ORDINARY VARIABLES.
17946: *
17947: INOUT PRC E,0 ENTRY POINT
17948: MOV WB,-(XS) STACK TRBLK TYPE
17949: MOV SCLEN(XL),WA GET NAME LENGTH
17950: ZER WB POINT TO START OF NAME
17951: JSR SBSTR BUILD A PROPER SCBLK
17952: JSR GTNVR BUILD VRBLK
17953: PPM NO ERROR RETURN
17954: MOV XR,WC SAVE VRBLK POINTER
17955: MOV (XS)+,WB GET TRTER FIELD
17956: ZER XL ZERO TRFPT
17957: JSR TRBLD BUILD TRBLK
17958: MOV WC,XL RECALL VRBLK POINTER
17959: MOV VRSVP(XL),TRTER(XR) STORE SVBLK POINTER
17960: MOV XR,VRVAL(XL) STORE TRBLK PTR IN VRBLK
17961: MOV =B$VRA,VRGET(XL) SET TRAPPED ACCESS
17962: MOV =B$VRV,VRSTO(XL) SET TRAPPED STORE
17963: EXI RETURN TO CALLER
17964: ENP END PROCEDURE INOUT
17965: EJC
17966: *
17967: * INSBF -- INSERT STRING IN BUFFER
17968: *
17969: * THIS ROUTINE WILL REPLACE A SECTION OF A BUFFER WITH THE
17970: * CONTENTS OF A GIVEN STRING. IF THE LENGTH OF THE
17971: * SECTION TO BE REPLACED IS DIFFERENT THAN THE LENGTH OF
17972: * THE GIVEN STRING, AND THE REPLACEMENT IS NOT AN APPEND,
17973: * THEN THE UPPER SECTION OF THE BUFFER IS SHIFTED UP OR
17974: * DOWN TO CREATE THE PROPER SPACE FOR THE INSERT.
17975: *
17976: * (XR) POINTER TO BFBLK
17977: * (XL) OBJECT WHICH IS STRING CONVERTABLE
17978: * (WA) OFFSET OF START OF INSERT IN (XR)
17979: * (WB) LENGTH OF SECTION IN (XR) REPLACED
17980: * JSR INSBF CALL TO INSERT CHARACTERS IN BUFFER
17981: * PPM LOC THREAD IF (XR) NOT CONVERTABLE
17982: * PPM LOC THREAD IF INSERT NOT POSSIBLE
17983: *
17984: * THE SECOND ALTERNATE EXIT IS TAKEN IF THE INSERT WOULD
17985: * OVERFLOW THE BUFFER, OR IF THE INSERT IS OUT PAST THE
17986: * DEFINED END OF THE BUFFER AS GIVEN.
17987: *
17988: INSBF PRC E,2 ENTRY POINT
17989: MOV WA,INSSA SAVE ENTRY WA
17990: MOV WB,INSSB SAVE ENTRY WB
17991: MOV WC,INSSC SAVE ENTRY WC
17992: ADD WB,WA ADD TO GET OFFSET PAST REPLACE PART
17993: MOV WA,INSAB SAVE WA+WB
17994: MOV BCLEN(XR),WC GET CURRENT DEFINED LENGTH
17995: BGT INSSA,WC,INS07 FAIL IF START OFFSET TOO BIG
17996: BGT WA,WC,INS07 FAIL IF FINAL OFFSET TOO BIG
17997: MOV XL,-(XS) SAVE ENTRY XL
17998: MOV XR,-(XS) SAVE BCBLK PTR
17999: MOV XL,-(XS) STACK AGAIN FOR GTSTG
18000: JSR GTSTG CALL TO CONVERT TO STRING
18001: PPM INS05 TAKE STRING CONVERT ERR EXIT
18002: MOV XR,XL SAVE STRING PTR
18003: MOV (XS),XR RESTORE BCBLK PTR
18004: ADD WC,WA ADD BUFFER LEN TO STRING LEN
18005: SUB INSSB,WA BIAS OUT COMPONENT BEING REPLACED
18006: MOV BCBUF(XR),XR POINT TO BFBLK
18007: BGT WA,BFALC(XR),INS06 FAIL IF RESULT EXCEEDS ALLOCATION
18008: MOV (XS),XR RESTORE BCBLK PTR
18009: MOV WC,WA GET BUFFER LENGTH
18010: SUB INSAB,WA SUBTRACT TO GET SHIFT LENGTH
18011: ADD SCLEN(XL),WC ADD LENGTH OF NEW
18012: SUB INSSB,WC SUBTRACT OLD TO GET TOTAL NEW LEN
18013: MOV BCLEN(XR),WB GET OLD BCLEN
18014: MOV WC,BCLEN(XR) STUFF NEW LENGTH
18015: BZE WA,INS04 SKIP SHIFT IF NOTHING TO DO
18016: BEQ INSSB,SCLEN(XL),INS04 SKIP SHIFT IF LENGTHS MATCH
18017: MOV BCBUF(XR),XR POINT TO BFBLK
18018: MOV XL,-(XS) SAVE SCBLK PTR
18019: BLO INSSB,SCLEN(XL),INS01 BRN IF SHFT IS FOR MORE ROOM
18020: EJC
18021: *
18022: * INSBF (CONTINUED)
18023: *
18024: * WE ARE SHIFTING THE UPPER SEGMENT DOWN TO COMPACT
18025: * THE BUFFER. (THE STRING LENGTH IS SMALLER THAN THE
18026: * SEGMENT BEING REPLACED.) REGISTERS ARE SET AS:
18027: *
18028: * (WA) MOVE (SHIFT DOWN) LENGTH
18029: * (WB) OLD BCLEN
18030: * (WC) NEW BCLEN
18031: * (XR) BFBLK PTR
18032: * (XL),(XS) SCBLK PTR
18033: *
18034: MOV INSSA,WB GET OFFSET TO INSERT
18035: ADD SCLEN(XL),WB ADD INSERT LENGTH TO GET DEST OFF
18036: MOV XR,XL MAKE COPY
18037: PLC XL,INSAB PREPARE SOURCE FOR MOVE
18038: PSC XR,WB PREPARE DESTINATION REG FOR MOVE
18039: MVC MOVE EM OUT
18040: BRN INS02 BRANCH TO PAD
18041: *
18042: * WE ARE SHIFTING THE UPPER SEGMENT UP TO EXPAND
18043: * THE BUFFER. (THE STRING LENGTH IS LARGER THAN THE
18044: * SEGMENT BEING REPLACED.)
18045: *
18046: INS01 MOV XR,XL COPY BFBLK PTR
18047: PLC XL,WB SET SOURCE REG FOR MOVE BACKWARDS
18048: PSC XR,WC SET DESTINATION PTR FOR MOVE
18049: MCB MOVE BACKWARDS (POSSIBLE OVERLAP)
18050: *
18051: * MERGE HERE AFTER MOVE TO ADJUST PADDING AT NEW BUFFER END
18052: *
18053: INS02 MOV (XS)+,XL RESTORE SCBLK PTR
18054: MOV WC,WA COPY NEW BUFFER END
18055: CTB WA,0 ROUND OUT
18056: SUB WC,WA SUBTRACT TO GET REMAINDER
18057: BZE WA,INS04 NO PAD IF ALREADY EVEN BOUNDARY
18058: MOV (XS),XR GET BCBLK PTR
18059: MOV BCBUF(XR),XR GET BFBLK PTR
18060: PSC XR,WC PREPARE TO PAD
18061: ZER WB CLEAR WB
18062: LCT WA,WA LOAD LOOP COUNT
18063: *
18064: * LOOP HERE TO STUFF PAD CHARACTERS
18065: *
18066: INS03 SCH WB,(XR)+ STUFF ZERO PAD
18067: BCT WA,INS03 BRANCH FOR MORE
18068: EJC
18069: *
18070: * INSBF (CONTINUED)
18071: *
18072: * MERGE HERE WHEN PADDING OK. NOW COPY IN THE INSERT
18073: * STRING TO THE HOLE.
18074: *
18075: INS04 MOV (XS),XR GET BCBLK PTR
18076: MOV BCBUF(XR),XR GET BFBLK PTR
18077: MOV SCLEN(XL),WA GET MOVE LENGTH
18078: PLC XL PREPARE TO COPY FROM FIRST CHAR
18079: PSC XR,INSSA PREPARE TO STORE IN HOLE
18080: MVC COPY THE CHARACTERS
18081: MOV (XS)+,XR RESTORE ENTRY XR
18082: MOV (XS)+,XL RESTORE ENTRY XL
18083: MOV INSSA,WA RESTORE ENTRY WA
18084: MOV INSSB,WB RESTORE ENTRY WB
18085: MOV INSSC,WC RESTORE ENTRY WC
18086: EXI RETURN TO CALLER
18087: *
18088: * HERE TO TAKE STRING CONVERT ERROR EXIT
18089: *
18090: INS05 MOV (XS)+,XR RESTORE ENTRY XR
18091: MOV (XS)+,XL RESTORE ENTRY XL
18092: MOV INSSA,WA RESTORE ENTRY WA
18093: MOV INSSB,WB RESTORE ENTRY WB
18094: MOV INSSC,WC RESTORE ENTRY WC
18095: EXI 1 ALTERNATE EXIT
18096: *
18097: * HERE FOR INVALID OFFSET OR LENGTH
18098: *
18099: INS06 MOV (XS)+,XR RESTORE ENTRY XR
18100: MOV (XS)+,XL RESTORE ENTRY XL
18101: *
18102: * MERGE FOR LENGTH FAILURE EXIT WITH STACK SET
18103: *
18104: INS07 MOV INSSA,WA RESTORE ENTRY WA
18105: MOV INSSB,WB RESTORE ENTRY WB
18106: MOV INSSC,WC RESTORE ENTRY WC
18107: EXI 2 ALTERNATE EXIT
18108: ENP END PROCEDURE INSBF
18109: EJC
18110: *
18111: * IOFCB -- GET INPUT/OUTPUT FCBLK POINTER
18112: *
18113: * USED BY ENDFILE, EJECT AND REWIND TO FIND THE FCBLK
18114: * (IF ANY) CORRESPONDING TO THEIR ARGUMENT.
18115: *
18116: * -(XS) ARGUMENT
18117: * JSR IOFCB CALL TO FIND FCBLK
18118: * PPM LOC ARG IS AN UNSUITABLE NAME
18119: * PPM LOC ARG IS NULL STRING
18120: * (XS) POPPED
18121: * (XL) PTR TO FILEARG1 VRBLK
18122: * (XR) ARGUMENT
18123: * (WA) FCBLK PTR OR 0
18124: * (WB) DESTROYED
18125: *
18126: IOFCB PRC N,2 ENTRY POINT
18127: JSR GTSTG GET ARG AS STRING
18128: PPM IOFC2 FAIL
18129: MOV XR,XL COPY STRING PTR
18130: JSR GTNVR GET AS NATURAL VARIABLE
18131: PPM IOFC3 FAIL IF NULL
18132: MOV XL,WB COPY STRING POINTER AGAIN
18133: MOV XR,XL COPY VRBLK PTR FOR RETURN
18134: ZER WA IN CASE NO TRBLK FOUND
18135: *
18136: * LOOP TO FIND FILE ARG1 TRBLK
18137: *
18138: IOFC1 MOV VRVAL(XR),XR GET POSSIBLE TRBLK PTR
18139: BNE (XR),=B$TRT,IOFC2 FAIL IF END OF CHAIN
18140: BNE TRTYP(XR),=TRTFC,IOFC1 LOOP IF NOT FILE ARG TRBLK
18141: MOV TRFPT(XR),WA GET FCBLK PTR
18142: MOV WB,XR COPY ARG
18143: EXI RETURN
18144: *
18145: * FAIL RETURN
18146: *
18147: IOFC2 EXI 1 FAIL
18148: *
18149: * NULL ARG
18150: *
18151: IOFC3 EXI 2 NULL ARG RETURN
18152: ENP END PROCEDURE IOFCB
18153: EJC
18154: *
18155: * IOPPF -- PROCESS FILEARG2 FOR IOPUT
18156: *
18157: * (R$XSC) FILEARG2 PTR
18158: * JSR IOPPF CALL TO PROCESS FILEARG2
18159: * (XL) FILEARG1 PTR
18160: * (XR) FILE ARG2 PTR
18161: * -(XS)..-(XS) FIELDS EXTRACTED FROM FILEARG2
18162: * (WC) NO. OF FIELDS EXTRACTED
18163: * (WB) INPUT/OUTPUT FLAG
18164: * (WA) FCBLK PTR OR 0
18165: *
18166: IOPPF PRC N,0 ENTRY POINT
18167: ZER WB TO COUNT FIELDS EXTRACTED
18168: *
18169: * LOOP TO EXTRACT FIELDS
18170: *
18171: IOPP1 MOV =IODEL,XL GET DELIMITER
18172: MOV XL,WC COPY IT
18173: JSR XSCAN GET NEXT FIELD
18174: MOV XR,-(XS) STACK IT
18175: ICV WB INCREMENT COUNT
18176: BNZ WA,IOPP1 LOOP
18177: MOV WB,WC COUNT OF FIELDS
18178: MOV IOPTT,WB I/O MARKER
18179: MOV R$IOF,WA FCBLK PTR OR 0
18180: MOV R$IO2,XR FILE ARG2 PTR
18181: MOV R$IO1,XL FILEARG1
18182: EXI RETURN
18183: ENP END PROCEDURE IOPPF
18184: EJC
18185: *
18186: * IOPUT -- ROUTINE USED BY INPUT AND OUTPUT
18187: *
18188: * IOPUT SETS UP INPUT/OUTPUT ASSOCIATIONS. IT BUILDS
18189: * SUCH TRACE AND FILE CONTROL BLOCKS AS ARE NECESSARY AND
18190: * CALLS SYSFC,SYSIO TO PERFORM CHECKS ON THE
18191: * ARGUMENTS AND TO OPEN THE FILES.
18192: *
18193: * +-----------+ +---------------+ +-----------+
18194: * +-.I I I I------.I =B$XRT I
18195: * I +-----------+ +---------------+ +-----------+
18196: * I / / (R$FCB) I *4 I
18197: * I / / +-----------+
18198: * I +-----------+ +---------------+ I I-
18199: * I I NAME +--.I =B$TRT I +-----------+
18200: * I / / +---------------+ I I
18201: * I (FIRST ARG) I =TRTIN/=TRTOU I +-----------+
18202: * I +---------------+ I
18203: * I I VALUE I I
18204: * I +---------------+ I
18205: * I I(TRTRF) 0 OR I--+ I
18206: * I +---------------+ I I
18207: * I I(TRFPT) 0 OR I----+ I
18208: * I +---------------+ I I I
18209: * I (I/O TRBLK) I I I
18210: * I +-----------+ I I I
18211: * I I I I I I
18212: * I +-----------+ I I I
18213: * I I I I I I
18214: * I +-----------+ +---------------+ I I I
18215: * I I +--.I =B$TRT I.-+ I I
18216: * I +-----------+ +---------------+ I I
18217: * I / / I =TRTFC I I I
18218: * I / / +---------------+ I I
18219: * I (FILEARG1 I VALUE I I I
18220: * I VRBLK) +---------------+ I I
18221: * I I(TRTRF) 0 OR I--+ I .
18222: * I +---------------+ I . +-----------+
18223: * I I(TRFPT) 0 OR I------./ FCBLK /
18224: * I +---------------+ I +-----------+
18225: * I (TRTRF) I
18226: * I I
18227: * I I
18228: * I +---------------+ I
18229: * I I =B$XRT I.-+
18230: * I +---------------+
18231: * I I *5 I
18232: * I +---------------+
18233: * +------------------I I
18234: * +---------------+ +-----------+
18235: * I(TRTRF) O OR I------.I =B$XRT I
18236: * +---------------+ +-----------+
18237: * I NAME OFFSET I I ETC I
18238: * +---------------+
18239: * (IOCHN - CHAIN OF NAME POINTERS)
18240: EJC
18241: *
18242: * IOPUT (CONTINUED)
18243: *
18244: * NO ADDITIONAL TRAP BLOCKS ARE USED FOR STANDARD INPUT/OUT
18245: * FILES. OTHERWISE AN I/O TRAP BLOCK IS ATTACHED TO SECOND
18246: * ARG (FILEARG1) VRBLK. SEE DIAGRAM ABOVE FOR DETAILS OF
18247: * THE STRUCTURE BUILT.
18248: *
18249: * -(XS) 1ST ARG (VBL TO BE ASSOCIATED)
18250: * -(XS) 2ND ARG (FILE ARG1)
18251: * -(XS) 3RD ARG (FILE ARG2)
18252: * (WB) 0 FOR INPUT, 3 FOR OUTPUT ASSOC.
18253: * JSR IOPUT CALL FOR INPUT/OUTPUT ASSOCIATION
18254: * PPM LOC 3RD ARG NOT A STRING
18255: * PPM LOC 2ND ARG NOT A SUITABLE NAME
18256: * PPM LOC 1ST ARG NOT A SUITABLE NAME
18257: * PPM LOC INAPPROPRIATE FILE SPEC FOR I/O
18258: * PPM LOC I/O FILE DOES NOT EXIST
18259: * PPM LOC I/O FILE CANNOT BE READ/WRITTEN
18260: * (XS) POPPED
18261: * (XL,XR,WA,WB,WC) DESTROYED
18262: *
18263: IOPUT PRC N,6 ENTRY POINT
18264: ZER R$IOT IN CASE NO TRTRF BLOCK USED
18265: ZER R$IOF IN CASE NO FCBLK ALOCATED
18266: MOV WB,IOPTT STORE I/O TRACE TYPE
18267: JSR XSCNI PREPARE TO SCAN FILEARG2
18268: PPM IOP13 FAIL
18269: PPM IOPA0 NULL FILE ARG2
18270: *
18271: IOPA0 MOV XR,R$IO2 KEEP FILE ARG2
18272: MOV WA,XL COPY LENGTH
18273: JSR GTSTG CONVERT FILEARG1 TO STRING
18274: PPM IOP14 FAIL
18275: MOV XR,R$IO1 KEEP FILEARG1 PTR
18276: JSR GTNVR CONVERT TO NATURAL VARIABLE
18277: PPM IOP00 JUMP IF NULL
18278: BRN IOP04 JUMP TO PROCESS NON-NULL ARGS
18279: *
18280: * NULL FILEARG1
18281: *
18282: IOP00 BZE XL,IOP01 SKIP IF BOTH ARGS NULL
18283: JSR IOPPF PROCESS FILEARG2
18284: JSR SYSFC CALL FOR FILEARG2 CHECK
18285: PPM IOP16 FAIL
18286: BRN IOP11 COMPLETE FILE ASSOCIATION
18287: EJC
18288: *
18289: * IOPUT (CONTINUED)
18290: *
18291: * HERE WITH 0 OR FCBLK PTR IN (XL)
18292: *
18293: IOP01 MOV IOPTT,WB GET TRACE TYPE
18294: MOV R$IOT,XR GET 0 OR TRTRF PTR
18295: JSR TRBLD BUILD TRBLK
18296: MOV XR,WC COPY TRBLK POINTER
18297: MOV (XS)+,XR GET VARIABLE FROM STACK
18298: JSR GTVAR POINT TO VARIABLE
18299: PPM IOP15 FAIL
18300: MOV XL,R$ION SAVE NAME POINTER
18301: MOV XL,XR COPY NAME POINTER
18302: ADD WA,XR POINT TO VARIABLE
18303: SUB *VRVAL,XR SUBTRACT OFFSET,MERGE INTO LOOP
18304: *
18305: * LOOP TO END OF TRBLK CHAIN IF ANY
18306: *
18307: IOP02 MOV XR,XL COPY BLK PTR
18308: MOV VRVAL(XR),XR LOAD PTR TO NEXT TRBLK
18309: BNE (XR),=B$TRT,IOP03 JUMP IF NOT TRAPPED
18310: BNE TRTYP(XR),IOPTT,IOP02 LOOP IF NOT SAME ASSOCN
18311: MOV TRNXT(XR),XR GET VALUE AND DELETE OLD TRBLK
18312: *
18313: * IOPUT (CONTINUED)
18314: *
18315: * STORE NEW ASSOCIATION
18316: *
18317: IOP03 MOV WC,VRVAL(XL) LINK TO THIS TRBLK
18318: MOV WC,XL COPY POINTER
18319: MOV XR,TRNXT(XL) STORE VALUE IN TRBLK
18320: MOV R$ION,XR RESTORE POSSIBLE VRBLK POINTER
18321: MOV WA,WB KEEP OFFSET TO NAME
18322: JSR SETVR IF VRBLK, SET VRGET,VRSTO
18323: MOV R$IOT,XR GET 0 OR TRTRF PTR
18324: BNZ XR,IOP19 JUMP IF TRTRF BLOCK EXISTS
18325: EXI RETURN TO CALLER
18326: *
18327: * NON STANDARD FILE
18328: * SEE IF AN FCBLK HAS ALREADY BEEN ALLOCATED.
18329: *
18330: IOP04 ZER WA IN CASE NO FCBLK FOUND
18331: EJC
18332: *
18333: * IOPUT (CONTINUED)
18334: *
18335: * SEARCH POSSIBLE TRBLK CHAIN TO PICK UP THE FCBLK
18336: *
18337: IOP05 MOV XR,WB REMEMBER BLK PTR
18338: MOV VRVAL(XR),XR CHAIN ALONG
18339: BNE (XR),=B$TRT,IOP06 JUMP IF END OF TRBLK CHAIN
18340: BNE TRTYP(XR),=TRTFC,IOP05 LOOP IF MORE TO GO
18341: MOV XR,R$IOT POINT TO FILE ARG1 TRBLK
18342: MOV TRFPT(XR),WA GET FCBLK PTR FROM TRBLK
18343: *
18344: * WA = 0 OR FCBLK PTR
18345: * WB = PTR TO PRECEDING BLK TO WHICH ANY TRTRF BLOCK
18346: * FOR FILE ARG1 MUST BE CHAINED.
18347: *
18348: IOP06 MOV WA,R$IOF KEEP POSSIBLE FCBLK PTR
18349: MOV WB,R$IOP KEEP PRECEDING BLK PTR
18350: JSR IOPPF PROCESS FILEARG2
18351: JSR SYSFC SEE IF FCBLK REQUIRED
18352: PPM IOP16 FAIL
18353: BZE WA,IOP12 SKIP IF NO NEW FCBLK WANTED
18354: BLT WC,=NUM02,IOP6A JUMP IF FCBLK IN DYNAMIC
18355: JSR ALOST GET IT IN STATIC
18356: BRN IOP6B SKIP
18357: *
18358: * OBTAIN FCBLK IN DYNAMIC
18359: *
18360: IOP6A JSR ALLOC GET SPACE FOR FCBLK
18361: *
18362: * MERGE
18363: *
18364: IOP6B MOV XR,XL POINT TO FCBLK
18365: MOV WA,WB COPY ITS LENGTH
18366: BTW WB GET COUNT AS WORDS (SGD APR80)
18367: LCT WB,WB LOOP COUNTER
18368: *
18369: * CLEAR FCBLK
18370: *
18371: IOP07 ZER (XR)+ CLEAR A WORD
18372: BCT WB,IOP07 LOOP
18373: BEQ WC,=NUM02,IOP09 SKIP IF IN STATIC - DONT SET FIELDS
18374: MOV =B$XNT,(XL) STORE XNBLK CODE IN CASE
18375: MOV WA,1(XL) STORE LENGTH
18376: BNZ WC,IOP09 JUMP IF XNBLK WANTED
18377: MOV =B$XRT,(XL) XRBLK CODE REQUESTED
18378: *
18379: EJC
18380: * IOPUT (CONTINUED)
18381: *
18382: * COMPLETE FCBLK INITIALISATION
18383: *
18384: IOP09 MOV R$IOT,XR GET POSSIBLE TRBLK PTR
18385: MOV XL,R$IOF STORE FCBLK PTR
18386: BNZ XR,IOP10 JUMP IF TRBLK ALREADY FOUND
18387: *
18388: * A NEW TRBLK IS NEEDED
18389: *
18390: MOV =TRTFC,WB TRTYP FOR FCBLK TRAP BLK
18391: JSR TRBLD MAKE THE BLOCK
18392: MOV XR,R$IOT COPY TRTRF PTR
18393: MOV R$IOP,XL POINT TO PRECEDING BLK
18394: MOV VRVAL(XL),VRVAL(XR) COPY VALUE FIELD TO TRBLK
18395: MOV XR,VRVAL(XL) LINK NEW TRBLK INTO CHAIN
18396: MOV XL,XR POINT TO PREDECESSOR BLK
18397: JSR SETVR SET TRACE INTERCEPTS
18398: MOV VRVAL(XR),XR RECOVER TRBLK PTR
18399: *
18400: * XR IS PTR TO TRBLK, XL IS FCBLK PTR OR 0
18401: *
18402: IOP10 MOV R$IOF,TRFPT(XR) STORE FCBLK PTR
18403: *
18404: * CALL SYSIO TO COMPLETE FILE ACCESSING
18405: *
18406: IOP11 MOV R$IOF,WA COPY FCBLK PTR OR 0
18407: MOV IOPTT,WB GET INPUT/OUTPUT FLAG
18408: MOV R$IO2,XR GET FILE ARG2
18409: MOV R$IO1,XL GET FILE ARG1
18410: JSR SYSIO ASSOCIATE TO THE FILE
18411: PPM IOP17 FAIL
18412: PPM IOP18 FAIL
18413: BNZ R$IOT,IOP01 NOT STD INPUT IF NON-NULL TRTRF BLK
18414: BNZ IOPTT,IOP01 JUMP IF OUTPUT
18415: BZE WC,IOP01 NO CHANGE TO STANDARD READ LENGTH
18416: MOV WC,CSWIN STORE NEW READ LENGTH FOR STD FILE
18417: BRN IOP01 MERGE TO FINISH THE TASK
18418: *
18419: * SYSFC MAY HAVE RETURNED A POINTER TO A PRIVATE FCBLK
18420: *
18421: IOP12 BNZ XL,IOP09 JUMP IF PRIVATE FCBLK
18422: BRN IOP11 FINISH THE ASSOCIATION
18423: *
18424: * FAILURE RETURNS
18425: *
18426: IOP13 EXI 1 3RD ARG NOT A STRING
18427: IOP14 EXI 2 2ND ARG UNSUITABLE
18428: IOP15 EXI 3 1ST ARG UNSUITABLE
18429: IOP16 EXI 4 FILE SPEC WRONG
18430: IOP17 EXI 5 I/O FILE DOES NOT EXIST
18431: IOP18 EXI 6 I/O FILE CANNOT BE READ/WRITTEN
18432: EJC
18433: *
18434: * IOPUT (CONTINUED)
18435: *
18436: * ADD TO IOCHN CHAIN OF ASSSOCIATED VARIABLES UNLESS ALREAD
18437: * PRESENT.
18438: *
18439: IOP19 MOV R$ION,WC WC = NAME BASE, WB = NAME OFFSET
18440: *
18441: * SEARCH LOOP
18442: *
18443: IOP20 MOV TRTRF(XR),XR NEXT LINK OF CHAIN
18444: BZE XR,IOP21 NOT FOUND
18445: BNE WC,IONMB(XR),IOP20 NO MATCH
18446: BEQ WB,IONMO(XR),IOP22 EXIT IF MATCHED
18447: BRN IOP20 LOOP
18448: *
18449: * NOT FOUND
18450: *
18451: IOP21 MOV *NUM05,WA SPACE NEEDED
18452: JSR ALLOC GET IT
18453: MOV =B$XRT,(XR) STORE XRBLK CODE
18454: MOV WA,1(XR) STORE LENGTH
18455: MOV WC,IONMB(XR) STORE NAME BASE
18456: MOV WB,IONMO(XR) STORE NAME OFFSET
18457: MOV R$IOT,XL POINT TO TRTRF BLK
18458: MOV TRTRF(XL),WA GET PTR FIELD CONTENTS
18459: MOV XR,TRTRF(XL) STORE PTR TO NEW BLOCK
18460: MOV WA,TRTRF(XR) COMPLETE THE LINKING
18461: *
18462: * INSERT FCBLK ON FCBLK CHAIN FOR SYSEJ, SYSXI
18463: *
18464: IOP22 BZE R$IOF,IOP25 SKIP IF NO FCBLK
18465: MOV R$FCB,XL PTR TO HEAD OF EXISTING CHAIN
18466: *
18467: * SEE IF FCBLK ALREADY ON CHAIN
18468: *
18469: IOP23 BZE XL,IOP24 NOT ON IF END OF CHAIN
18470: BEQ 3(XL),R$IOF,IOP25 DONT DUPLICATE IF FIND IT
18471: MOV 2(XL),XL GET NEXT LINK
18472: BRN IOP23 LOOP
18473: *
18474: * NOT FOUND SO ADD AN ENTRY FOR THIS FCBLK
18475: *
18476: IOP24 MOV *NUM04,WA SPACE NEEDED
18477: JSR ALLOC GET IT
18478: MOV =B$XRT,(XR) STORE BLOCK CODE
18479: MOV WA,1(XR) STORE LENGTH
18480: MOV R$FCB,2(XR) STORE PREVIOUS LINK IN THIS NODE
18481: MOV R$IOF,3(XR) STORE FCBLK PTR
18482: MOV XR,R$FCB INSERT NODE INTO FCBLK CHAIN
18483: *
18484: * RETURN
18485: *
18486: IOP25 EXI RETURN TO CALLER
18487: ENP END PROCEDURE IOPUT
18488: EJC
18489: *
18490: * KTREX -- EXECUTE KEYWORD TRACE
18491: *
18492: * KTREX IS USED TO EXECUTE A POSSIBLE KEYWORD TRACE. IT
18493: * INCLUDES THE TEST ON TRACE AND TESTS FOR TRACE ACTIVE.
18494: *
18495: * (XL) PTR TO TRBLK (OR 0 IF UNTRACED)
18496: * JSR KTREX CALL TO EXECUTE KEYWORD TRACE
18497: * (XL,WA,WB,WC) DESTROYED
18498: * (RA) DESTROYED
18499: *
18500: KTREX PRC R,0 ENTRY POINT (RECURSIVE)
18501: BZE XL,KTRX3 IMMEDIATE EXIT IF KEYWORD UNTRACED
18502: BZE KVTRA,KTRX3 IMMEDIATE EXIT IF TRACE = 0
18503: DCV KVTRA ELSE DECREMENT TRACE
18504: MOV XR,-(XS) SAVE XR
18505: MOV XL,XR COPY TRBLK POINTER
18506: MOV TRKVR(XR),XL LOAD VRBLK POINTER (NMBAS)
18507: MOV *VRVAL,WA SET NAME OFFSET
18508: BZE TRFNC(XR),KTRX1 JUMP IF PRINT TRACE
18509: JSR TRXEQ ELSE EXECUTE FULL TRACE
18510: BRN KTRX2 AND JUMP TO EXIT
18511: *
18512: * HERE FOR PRINT TRACE
18513: *
18514: KTRX1 MOV XL,-(XS) STACK VRBLK PTR FOR KWNAM
18515: MOV WA,-(XS) STACK OFFSET FOR KWNAM
18516: JSR PRTSN PRINT STATEMENT NUMBER
18517: MOV =CH$AM,WA LOAD AMPERSAND
18518: JSR PRTCH PRINT AMPERSAND
18519: JSR PRTNM PRINT KEYWORD NAME
18520: MOV =TMBEB,XR POINT TO BLANK-EQUAL-BLANK
18521: JSR PRTST PRINT BLANK-EQUAL-BLANK
18522: JSR KWNAM GET KEYWORD PSEUDO-VARIABLE NAME
18523: MOV XR,DNAMP RESET PTR TO DELETE KVBLK
18524: JSR ACESS GET KEYWORD VALUE
18525: PPM FAILURE IS IMPOSSIBLE
18526: JSR PRTVL PRINT KEYWORD VALUE
18527: JSR PRTNL TERMINATE PRINT LINE
18528: *
18529: * HERE TO EXIT AFTER COMPLETING TRACE
18530: *
18531: KTRX2 MOV (XS)+,XR RESTORE ENTRY XR
18532: *
18533: * MERGE HERE TO EXIT IF NO TRACE REQUIRED
18534: *
18535: KTRX3 EXI RETURN TO KTREX CALLER
18536: ENP END PROCEDURE KTREX
18537: EJC
18538: *
18539: * KWNAM -- GET PSEUDO-VARIABLE NAME FOR KEYWORD
18540: *
18541: * 1(XS) NAME BASE FOR VRBLK
18542: * 0(XS) OFFSET (SHOULD BE *VRVAL)
18543: * JSR KWNAM CALL TO GET PSEUDO-VARIABLE NAME
18544: * (XS) POPPED TWICE
18545: * (XL,WA) RESULTING PSEUDO-VARIABLE NAME
18546: * (XR,WA,WB) DESTROYED
18547: *
18548: KWNAM PRC N,0 ENTRY POINT
18549: ICA XS IGNORE NAME OFFSET
18550: MOV (XS)+,XR LOAD NAME BASE
18551: BGE XR,STATE,KWNM1 JUMP IF NOT NATURAL VARIABLE NAME
18552: BNZ VRLEN(XR),KWNM1 ERROR IF NOT SYSTEM VARIABLE
18553: MOV VRSVP(XR),XR ELSE POINT TO SVBLK
18554: MOV SVBIT(XR),WA LOAD BIT MASK
18555: ANB BTKNM,WA AND WITH KEYWORD BIT
18556: ZRB WA,KWNM1 ERROR IF NO KEYWORD ASSOCIATION
18557: MOV SVLEN(XR),WA ELSE LOAD NAME LENGTH IN CHARACTERS
18558: CTB WA,SVCHS COMPUTE OFFSET TO FIELD WE WANT
18559: ADD WA,XR POINT TO SVKNM FIELD
18560: MOV (XR),WB LOAD SVKNM VALUE
18561: MOV *KVSI$,WA SET SIZE OF KVBLK
18562: JSR ALLOC ALLOCATE KVBLK
18563: MOV =B$KVT,(XR) STORE TYPE WORD
18564: MOV WB,KVNUM(XR) STORE KEYWORD NUMBER
18565: MOV =TRBKV,KVVAR(XR) SET DUMMY TRBLK POINTER
18566: MOV XR,XL COPY KVBLK POINTER
18567: MOV *KVVAR,WA SET PROPER OFFSET
18568: EXI RETURN TO KVNAM CALLER
18569: *
18570: * HERE IF NOT KEYWORD NAME
18571: *
18572: KWNM1 ERB 251,KEYWORD OPERAND IS NOT NAME OF DEFINED KEYWORD
18573: ENP END PROCEDURE KWNAM
18574: EJC
18575: *
18576: * LCOMP-- COMPARE TWO STRINGS LEXICALLY
18577: *
18578: * 1(XS) FIRST ARGUMENT
18579: * 0(XS) SECOND ARGUMENT
18580: * JSR LCOMP CALL TO COMPARE ARUMENTS
18581: * PPM LOC TRANSFER LOC FOR ARG1 NOT STRING
18582: * PPM LOC TRANSFER LOC FOR ARG2 NOT STRING
18583: * PPM LOC TRANSFER LOC IF ARG1 LLT ARG2
18584: * PPM LOC TRANSFER LOC IF ARG1 LEQ ARG2
18585: * PPM LOC TRANSFER LOC IF ARG1 LGT ARG2
18586: * (THE NORMAL RETURN IS NEVER TAKEN)
18587: * (XS) POPPED TWICE
18588: * (XR,XL) DESTROYED
18589: * (WA,WB,WC,RA) DESTROYED
18590: *
18591: LCOMP PRC N,5 ENTRY POINT
18592: JSR GTSTG CONVERT SECOND ARG TO STRING
18593: PPM LCMP6 JUMP IF SECOND ARG NOT STRING
18594: MOV XR,XL ELSE SAVE POINTER
18595: MOV WA,WB AND LENGTH
18596: JSR GTSTG CONVERT FIRST ARGUMENT TO STRING
18597: PPM LCMP5 JUMP IF NOT STRING
18598: MOV WA,WC SAVE ARG 1 LENGTH
18599: PLC XR POINT TO CHARS OF ARG 1
18600: PLC XL POINT TO CHARS OF ARG 2
18601: BLO WA,WB,LCMP1 JUMP IF ARG 1 LENGTH IS SMALLER
18602: MOV WB,WA ELSE SET ARG 2 LENGTH AS SMALLER
18603: *
18604: * HERE WITH SMALLER LENGTH IN (WA)
18605: *
18606: LCMP1 CMC LCMP4,LCMP3 COMPARE STRINGS, JUMP IF UNEQUAL
18607: BNE WB,WC,LCMP2 IF EQUAL, JUMP IF LENGTHS UNEQUAL
18608: EXI 4 ELSE IDENTICAL STRINGS, LEQ EXIT
18609: EJC
18610: *
18611: * LCOMP (CONTINUED)
18612: *
18613: * HERE IF INITIAL STRINGS IDENTICAL, BUT LENGTHS UNEQUAL
18614: *
18615: LCMP2 BHI WC,WB,LCMP4 JUMP IF ARG 1 LENGTH GT ARG 2 LENG
18616: *
18617: * HERE IF FIRST ARG LLT SECOND ARG
18618: *
18619: LCMP3 EXI 3 TAKE LLT EXIT
18620: *
18621: * HERE IF FIRST ARG LGT SECOND ARG
18622: *
18623: LCMP4 EXI 5 TAKE LGT EXIT
18624: *
18625: * HERE IF FIRST ARG IS NOT A STRING
18626: *
18627: LCMP5 EXI 1 TAKE BAD FIRST ARG EXIT
18628: *
18629: * HERE FOR SECOND ARG NOT A STRING
18630: *
18631: LCMP6 EXI 2 TAKE BAD SECOND ARG ERROR EXIT
18632: ENP END PROCEDURE LCOMP
18633: EJC
18634: *
18635: * LISTR -- LIST SOURCE LINE
18636: *
18637: * LISTR IS USED TO LIST A SOURCE LINE DURING THE INITIAL
18638: * COMPILATION. IT IS CALLED FROM SCANE AND SCANL.
18639: *
18640: * JSR LISTR CALL TO LIST LINE
18641: * (XR,XL,WA,WB,WC) DESTROYED
18642: *
18643: * GLOBAL LOCATIONS USED BY LISTR
18644: *
18645: * ERLST IF LISTING ON ACCOUNT OF AN ERROR
18646: *
18647: * LSTLC COUNT LINES ON CURRENT PAGE
18648: *
18649: * LSTNP MAX NUMBER OF LINES/PAGE
18650: *
18651: * LSTPF SET NON-ZERO IF THE CURRENT SOURCE
18652: * LINE HAS BEEN LISTED, ELSE ZERO.
18653: *
18654: * LSTPG COMPILER LISTING PAGE NUMBER
18655: *
18656: * LSTSN SET IF STMNT NUM TO BE LISTED
18657: *
18658: * R$CIM POINTER TO CURRENT INPUT LINE.
18659: *
18660: * R$TTL TITLE FOR SOURCE LISTING
18661: *
18662: * R$STL PTR TO SUB-TITLE STRING
18663: *
18664: * ENTRY POINT
18665: *
18666: LISTR PRC E,0 ENTRY POINT
18667: BNZ CNTTL,LIST5 JUMP IF -TITLE OR -STITL
18668: BNZ LSTPF,LIST4 IMMEDIATE EXIT IF ALREADY LISTED
18669: BGE LSTLC,LSTNP,LIST6 JUMP IF NO ROOM
18670: *
18671: * HERE AFTER PRINTING TITLE (IF NEEDED)
18672: *
18673: LIST0 MOV R$CIM,XR LOAD POINTER TO CURRENT IMAGE
18674: PLC XR POINT TO CHARACTERS
18675: LCH WA,(XR) LOAD FIRST CHARACTER
18676: MOV LSTSN,XR LOAD STATEMENT NUMBER
18677: BZE XR,LIST2 JUMP IF NO STATEMENT NUMBER
18678: MTI XR ELSE GET STMNT NUMBER AS INTEGER
18679: BNE STAGE,=STGIC,LIST1 SKIP IF EXECUTE TIME
18680: BEQ WA,=CH$AS,LIST2 NO STMNT NUMBER LIST IF COMMENT
18681: BEQ WA,=CH$MN,LIST2 NO STMNT NO. IF CONTROL CARD
18682: *
18683: * PRINT STATEMENT NUMBER
18684: *
18685: LIST1 JSR PRTIN ELSE PRINT STATEMENT NUMBER
18686: ZER LSTSN AND CLEAR FOR NEXT TIME IN
18687: EJC
18688: *
18689: * LISTR (CONTINUED)
18690: *
18691: * MERGE HERE AFTER PRINTING STATEMENT NUMBER (IF REQUIRED)
18692: *
18693: LIST2 MOV =STNPD,PROFS POINT PAST STATEMENT NUMBER
18694: MOV R$CIM,XR LOAD POINTER TO CURRENT IMAGE
18695: JSR PRTST PRINT IT
18696: ICV LSTLC BUMP LINE COUNTER
18697: BNZ ERLST,LIST3 JUMP IF ERROR COPY TO INT.CH.
18698: JSR PRTNL TERMINATE LINE
18699: BZE CSWDB,LIST3 JUMP IF -SINGLE MODE
18700: JSR PRTNL ELSE ADD A BLANK LINE
18701: ICV LSTLC AND BUMP LINE COUNTER
18702: *
18703: * HERE AFTER PRINTING SOURCE IMAGE
18704: *
18705: LIST3 MNZ LSTPF SET FLAG FOR LINE PRINTED
18706: *
18707: * MERGE HERE TO EXIT
18708: *
18709: LIST4 EXI RETURN TO LISTR CALLER
18710: *
18711: * PRINT TITLE AFTER -TITLE OR -STITL CARD
18712: *
18713: LIST5 ZER CNTTL CLEAR FLAG
18714: *
18715: * EJECT TO NEW PAGE AND LIST TITLE
18716: *
18717: LIST6 JSR PRTPS EJECT
18718: BZE PRICH,LIST7 SKIP IF LISTING TO REGULAR PRINTER
18719: BEQ R$TTL,=NULLS,LIST0 TERMINAL LISTING OMITS NULL TITLE
18720: *
18721: * LIST TITLE
18722: *
18723: LIST7 JSR LISTT LIST TITLE
18724: BRN LIST0 MERGE
18725: ENP END PROCEDURE LISTR
18726: EJC
18727: *
18728: * LISTT -- LIST TITLE AND SUBTITLE
18729: *
18730: * USED DURING COMPILATION TO PRINT PAGE HEADING
18731: *
18732: * JSR LISTT CALL TO LIST TITLE
18733: * (XR,WA) DESTROYED
18734: *
18735: LISTT PRC E,0 ENTRY POINT
18736: MOV R$TTL,XR POINT TO SOURCE LISTING TITLE
18737: JSR PRTST PRINT TITLE
18738: MOV LSTPO,PROFS SET OFFSET
18739: MOV =LSTMS,XR SET PAGE MESSAGE
18740: JSR PRTST PRINT PAGE MESSAGE
18741: ICV LSTPG BUMP PAGE NUMBER
18742: MTI LSTPG LOAD PAGE NUMBER AS INTEGER
18743: JSR PRTIN PRINT PAGE NUMBER
18744: JSR PRTNL TERMINATE TITLE LINE
18745: ADD =NUM02,LSTLC COUNT TITLE LINE AND BLANK LINE
18746: *
18747: * PRINT SUB-TITLE (IF ANY)
18748: *
18749: MOV R$STL,XR LOAD POINTER TO SUB-TITLE
18750: BZE XR,LSTT1 JUMP IF NO SUB-TITLE
18751: JSR PRTST ELSE PRINT SUB-TITLE
18752: JSR PRTNL TERMINATE LINE
18753: ICV LSTLC BUMP LINE COUNT
18754: *
18755: * RETURN POINT
18756: *
18757: LSTT1 JSR PRTNL PRINT A BLANK LINE
18758: EXI RETURN TO CALLER
18759: ENP END PROCEDURE LISTT
18760: EJC
18761: *
18762: * NEXTS -- ACQUIRE NEXT SOURCE IMAGE
18763: *
18764: * NEXTS IS USED TO ACQUIRE THE NEXT SOURCE IMAGE AT COMPILE
18765: * TIME. IT ASSUMES THAT A PRIOR CALL TO READR HAS INPUT
18766: * A LINE IMAGE (SEE PROCEDURE READR). BEFORE THE CURRENT
18767: * IMAGE IS FINALLY LOST IT MAY BE LISTED HERE.
18768: *
18769: * JSR NEXTS CALL TO ACQUIRE NEXT INPUT LINE
18770: * (XR,XL,WA,WB,WC) DESTROYED
18771: *
18772: * GLOBAL VALUES AFFECTED
18773: *
18774: * R$CNI ON INPUT, NEXT IMAGE. ON
18775: * EXIT RESET TO ZERO
18776: *
18777: * R$CIM ON EXIT, SET TO POINT TO IMAGE
18778: *
18779: * SCNIL INPUT IMAGE LENGTH ON EXIT
18780: *
18781: * SCNSE RESET TO ZERO ON EXIT
18782: *
18783: * LSTPF SET ON EXIT IF LINE IS LISTED
18784: *
18785: NEXTS PRC E,0 ENTRY POINT
18786: BZE CSWLS,NXTS2 JUMP IF -NOLIST
18787: MOV R$CIM,XR POINT TO IMAGE
18788: BZE XR,NXTS2 JUMP IF NO IMAGE
18789: PLC XR GET CHAR PTR
18790: LCH WA,(XR) GET FIRST CHAR
18791: BNE WA,=CH$MN,NXTS1 JUMP IF NOT CTRL CARD
18792: BZE CSWPR,NXTS2 JUMP IF -NOPRINT
18793: *
18794: * HERE TO CALL LISTER
18795: *
18796: NXTS1 JSR LISTR LIST LINE
18797: *
18798: * HERE AFTER POSSIBLE LISTING
18799: *
18800: NXTS2 MOV R$CNI,XR POINT TO NEXT IMAGE
18801: MOV XR,R$CIM SET AS NEXT IMAGE
18802: ZER R$CNI CLEAR NEXT IMAGE POINTER
18803: MOV SCLEN(XR),WA GET INPUT IMAGE LENGTH
18804: MOV CSWIN,WB GET MAX ALLOWABLE LENGTH
18805: BLO WA,WB,NXTS3 SKIP IF NOT TOO LONG
18806: MOV WB,WA ELSE TRUNCATE
18807: *
18808: * HERE WITH LENGTH IN (WA)
18809: *
18810: NXTS3 MOV WA,SCNIL USE AS RECORD LENGTH
18811: ZER SCNSE RESET SCNSE
18812: ZER LSTPF SET LINE NOT LISTED YET
18813: EXI RETURN TO NEXTS CALLER
18814: ENP END PROCEDURE NEXTS
18815: EJC
18816: *
18817: * PATIN -- PATTERN CONSTRUCTION FOR LEN,POS,RPOS,TAB,RTAB
18818: *
18819: * THESE PATTERN TYPES ALL GENERATE A SIMILAR NODE TYPE. SO
18820: * THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION
18821: * FOR ACTUAL ENTRY POINTS FOR THESE FIVE FUNCTIONS.
18822: *
18823: * (WA) PCODE FOR EXPRESSION ARG CASE
18824: * (WB) PCODE FOR INTEGER ARG CASE
18825: * JSR PATIN CALL TO BUILD PATTERN NODE
18826: * PPM LOC TRANSFER LOC FOR NOT INTEGER OR EXP
18827: * PPM LOC TRANSFER LOC FOR INT OUT OF RANGE
18828: * (XR) POINTER TO CONSTRUCTED NODE
18829: * (XL,WA,WB,WC,IA) DESTROYED
18830: *
18831: PATIN PRC N,2 ENTRY POINT
18832: MOV WA,XL PRESERVE EXPRESSION ARG PCODE
18833: JSR GTSMI TRY TO CONVERT ARG AS SMALL INTEGER
18834: PPM PTIN2 JUMP IF NOT INTEGER
18835: PPM PTIN3 JUMP IF OUT OF RANGE
18836: *
18837: * COMMON SUCCESSFUL EXIT POINT
18838: *
18839: PTIN1 JSR PBILD BUILD PATTERN NODE
18840: EXI RETURN TO CALLER
18841: *
18842: * HERE IF ARGUMENT IS NOT AN INTEGER
18843: *
18844: PTIN2 MOV XL,WB COPY EXPR ARG CASE PCODE
18845: BLO (XR),=B$E$$,PTIN1 ALL OK IF EXPRESSION ARG
18846: EXI 1 ELSE TAKE ERROR EXIT FOR WRONG TYPE
18847: *
18848: * HERE FOR ERROR OF OUT OF RANGE INTEGER ARGUMENT
18849: *
18850: PTIN3 EXI 2 TAKE OUT-OF-RANGE ERROR EXIT
18851: ENP END PROCEDURE PATIN
18852: EJC
18853: *
18854: * PATST -- PATTERN CONSTRUCTION FOR ANY,NOTANY,
18855: * BREAK,SPAN AND BREAKX PATTERN FUNCTIONS.
18856: *
18857: * THESE PATTERN FUNCTIONS BUILD SIMILAR TYPES OF NODES AND
18858: * THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION
18859: * FOR ACTUAL ENTRY POINTS FOR THESE FIVE PATTERN FUNCTIONS.
18860: *
18861: * 0(XS) STRING ARGUMENT
18862: * (WB) PCODE FOR ONE CHAR ARGUMENT
18863: * (XL) PCODE FOR MULTI-CHAR ARGUMENT
18864: * (WC) PCODE FOR EXPRESSION ARGUMENT
18865: * JSR PATST CALL TO BUILD NODE
18866: * PPM LOC TRANSFER LOC IF NOT STRING OR EXPR
18867: * (XS) POPPED PAST STRING ARGUMENT
18868: * (XR) POINTER TO CONSTRUCTED NODE
18869: * (XL) DESTROYED
18870: * (WA,WB,WC,RA) DESTROYED
18871: *
18872: * NOTE THAT THERE IS A SPECIAL CALL TO PATST IN THE EVALS
18873: * PROCEDURE WITH A SLIGHTLY DIFFERENT FORM. SEE EVALS
18874: * FOR DETAILS OF THE FORM OF THIS CALL.
18875: *
18876: PATST PRC N,1 ENTRY POINT
18877: JSR GTSTG CONVERT ARGUMENT AS STRING
18878: PPM PATS7 JUMP IF NOT STRING
18879: BNE WA,=NUM01,PATS2 JUMP IF NOT ONE CHAR STRING
18880: *
18881: * HERE FOR ONE CHAR STRING CASE
18882: *
18883: BZE WB,PATS2 TREAT AS MULTI-CHAR IF EVALS CALL
18884: PLC XR POINT TO CHARACTER
18885: LCH XR,(XR) LOAD CHARACTER
18886: *
18887: * COMMON EXIT POINT AFTER SUCCESSFUL CONSTRUCTION
18888: *
18889: PATS1 JSR PBILD CALL ROUTINE TO BUILD NODE
18890: EXI RETURN TO PATST CALLER
18891: EJC
18892: *
18893: * PATST (CONTINUED)
18894: *
18895: * HERE FOR MULTI-CHARACTER STRING CASE
18896: *
18897: PATS2 MOV XL,-(XS) SAVE MULTI-CHAR PCODE
18898: MOV XR,-(XS) SAVE STRING POINTER
18899: MOV CTMSK,WC LOAD CURRENT MASK BIT
18900: LSH WC,1 SHIFT TO NEXT POSITION
18901: NZB WC,PATS4 SKIP IF POSITION LEFT IN THIS TBL
18902: *
18903: * HERE WE MUST ALLOCATE A NEW CHARACTER TABLE
18904: *
18905: MOV *CTSI$,WA SET SIZE OF CTBLK
18906: JSR ALLOC ALLOCATE CTBLK
18907: MOV XR,R$CTP STORE PTR TO NEW CTBLK
18908: MOV =B$CTT,(XR)+ STORE TYPE CODE, BUMP PTR
18909: LCT WB,=CFP$A SET NUMBER OF WORDS TO CLEAR
18910: MOV BITS0,WC LOAD ALL ZERO BITS
18911: *
18912: * LOOP TO CLEAR ALL BITS IN TABLE TO ZEROS
18913: *
18914: PATS3 MOV WC,(XR)+ MOVE WORD OF ZERO BITS
18915: BCT WB,PATS3 LOOP TILL ALL CLEARED
18916: MOV BITS1,WC SET INITIAL BIT POSITION
18917: *
18918: * MERGE HERE WITH BIT POSITION AVAILABLE
18919: *
18920: PATS4 MOV WC,CTMSK SAVE PARM2 (NEW BIT POSITION)
18921: MOV (XS)+,XL RESTORE POINTER TO ARGUMENT STRING
18922: MOV SCLEN(XL),WB LOAD STRING LENGTH
18923: BZE WB,PATS6 JUMP IF NULL STRING CASE
18924: LCT WB,WB ELSE SET LOOP COUNTER
18925: PLC XL POINT TO CHARACTERS IN ARGUMENT
18926: EJC
18927: *
18928: * PATST (CONTINUED)
18929: *
18930: * LOOP TO SET BITS IN COLUMN OF TABLE
18931: *
18932: PATS5 LCH WA,(XL)+ LOAD NEXT CHARACTER
18933: WTB WA CONVERT TO BYTE OFFSET
18934: MOV R$CTP,XR POINT TO CTBLK
18935: ADD WA,XR POINT TO CTBLK ENTRY
18936: MOV WC,WA COPY BIT MASK
18937: ORB CTCHS(XR),WA OR IN BITS ALREADY SET
18938: MOV WA,CTCHS(XR) STORE RESULTING BIT STRING
18939: BCT WB,PATS5 LOOP TILL ALL BITS SET
18940: *
18941: * COMPLETE PROCESSING FOR MUTI-CHAR STRING CASE
18942: *
18943: PATS6 MOV R$CTP,XR LOAD CTBLK PTR AS PARM1 FOR PBILD
18944: ZER XL CLEAR GARBAGE PTR IN XL
18945: MOV (XS)+,WB LOAD PCODE FOR MULTI-CHAR STR CASE
18946: BRN PATS1 BACK TO EXIT (WC=BITSTRING=PARM2)
18947: *
18948: * HERE IF ARGUMENT IS NOT A STRING
18949: *
18950: * NOTE THAT THE CALL FROM EVALS CANNOT PASS AN EXPRESSION
18951: * SINCE EVALP ALWAYS REEVALUATES EXPRESSIONS.
18952: *
18953: PATS7 MOV WC,WB SET PCODE FOR EXPRESSION ARGUMENT
18954: BLO (XR),=B$E$$,PATS1 JUMP TO EXIT IF EXPRESSION ARG
18955: EXI 1 ELSE TAKE WRONG TYPE ERROR EXIT
18956: ENP END PROCEDURE PATST
18957: EJC
18958: *
18959: * PBILD -- BUILD PATTERN NODE
18960: *
18961: * (XR) PARM1 (ONLY IF REQUIRED)
18962: * (WB) PCODE FOR NODE
18963: * (WC) PARM2 (ONLY IF REQUIRED)
18964: * JSR PBILD CALL TO BUILD NODE
18965: * (XR) POINTER TO CONSTRUCTED NODE
18966: * (WA) DESTROYED
18967: *
18968: PBILD PRC E,0 ENTRY POINT
18969: MOV XR,-(XS) STACK POSSIBLE PARM1
18970: MOV WB,XR COPY PCODE
18971: LEI XR LOAD ENTRY POINT ID (BL$PX)
18972: BEQ XR,=BL$P1,PBLD1 JUMP IF ONE PARAMETER
18973: BEQ XR,=BL$P0,PBLD3 JUMP IF NO PARAMETERS
18974: *
18975: * HERE FOR TWO PARAMETER CASE
18976: *
18977: MOV *PCSI$,WA SET SIZE OF P2BLK
18978: JSR ALLOC ALLOCATE BLOCK
18979: MOV WC,PARM2(XR) STORE SECOND PARAMETER
18980: BRN PBLD2 MERGE WITH ONE PARM CASE
18981: *
18982: * HERE FOR ONE PARAMETER CASE
18983: *
18984: PBLD1 MOV *PBSI$,WA SET SIZE OF P1BLK
18985: JSR ALLOC ALLOCATE NODE
18986: *
18987: * MERGE HERE FROM TWO PARM CASE
18988: *
18989: PBLD2 MOV (XS),PARM1(XR) STORE FIRST PARAMETER
18990: BRN PBLD4 MERGE WITH NO PARAMETER CASE
18991: *
18992: * HERE FOR CASE OF NO PARAMETERS
18993: *
18994: PBLD3 MOV *PASI$,WA SET SIZE OF P0BLK
18995: JSR ALLOC ALLOCATE NODE
18996: *
18997: * MERGE HERE FROM OTHER CASES
18998: *
18999: PBLD4 MOV WB,(XR) STORE PCODE
19000: ICA XS POP FIRST PARAMETER
19001: MOV =NDNTH,PTHEN(XR) SET NOTHEN SUCCESSOR POINTER
19002: EXI RETURN TO PBILD CALLER
19003: ENP END PROCEDURE PBILD
19004: EJC
19005: *
19006: * PCONC -- CONCATENATE TWO PATTERNS
19007: *
19008: * (XL) PTR TO RIGHT PATTERN
19009: * (XR) PTR TO LEFT PATTERN
19010: * JSR PCONC CALL TO CONCATENATE PATTERNS
19011: * (XR) PTR TO CONCATENATED PATTERN
19012: * (XL,WA,WB,WC) DESTROYED
19013: *
19014: *
19015: * TO CONCATENATE TWO PATTERNS, ALL SUCCESSORS IN THE LEFT
19016: * PATTERN WHICH POINT TO THE NOTHEN NODE MUST BE CHANGED TO
19017: * POINT TO THE RIGHT PATTERN. HOWEVER, THIS MODIFICATION
19018: * MUST BE PERFORMED ON A COPY OF THE LEFT ARGUMENT RATHER
19019: * THAN THE LEFT ARGUMENT ITSELF, SINCE THE LEFT ARGUMENT
19020: * MAY BE POINTED TO BY SOME OTHER VARIABLE VALUE.
19021: *
19022: * ACCORDINGLY, IT IS NECESSARY TO COPY THE LEFT ARGUMENT.
19023: * THIS IS NOT A TRIVIAL PROCESS SINCE WE MUST AVOID COPYING
19024: * NODES MORE THAN ONCE AND THE PATTERN IS A GRAPH STRUCTURE
19025: * THE FOLLOWING ALGORITHM IS EMPLOYED.
19026: *
19027: * THE STACK IS USED TO STORE A LIST OF NODES WHICH
19028: * HAVE ALREADY BEEN COPIED. THE FORMAT OF THE ENTRIES ON
19029: * THIS LIST CONSISTS OF A TWO WORD BLOCK. THE FIRST WORD
19030: * IS THE OLD ADDRESS AND THE SECOND WORD IS THE ADDRESS
19031: * OF THE COPY. THIS LIST IS SEARCHED BY THE PCOPY
19032: * ROUTINE TO AVOID MAKING DUPLICATE COPIES. A TRICK IS
19033: * USED TO ACCOMPLISH THE CONCATENATION AT THE SAME TIME.
19034: * A SPECIAL ENTRY IS MADE TO START WITH ON THE STACK. THIS
19035: * ENTRY RECORDS THAT THE NOTHEN NODE HAS BEEN COPIED
19036: * ALREADY AND THE ADDRESS OF ITS COPY IS THE RIGHT PATTERN.
19037: * THIS AUTOMATICALLY PERFORMS THE CORRECT REPLACEMENTS.
19038: *
19039: PCONC PRC E,0 ENTRY POINT
19040: ZER -(XS) MAKE ROOM FOR ONE ENTRY AT BOTTOM
19041: MOV XS,WC STORE POINTER TO START OF LIST
19042: MOV =NDNTH,-(XS) STACK NOTHEN NODE AS OLD NODE
19043: MOV XL,-(XS) STORE RIGHT ARG AS COPY OF NOTHEN
19044: MOV XS,XT INITIALIZE POINTER TO STACK ENTRIES
19045: JSR PCOPY COPY FIRST NODE OF LEFT ARG
19046: MOV WA,2(XT) STORE AS RESULT UNDER LIST
19047: EJC
19048: *
19049: * PCONC (CONTINUED)
19050: *
19051: * THE FOLLOWING LOOP SCANS ENTRIES IN THE LIST AND MAKES
19052: * SURE THAT THEIR SUCCESSORS HAVE BEEN COPIED.
19053: *
19054: PCNC1 BEQ XT,XS,PCNC2 JUMP IF ALL ENTRIES PROCESSED
19055: MOV -(XT),XR ELSE LOAD NEXT OLD ADDRESS
19056: MOV PTHEN(XR),XR LOAD POINTER TO SUCCESSOR
19057: JSR PCOPY COPY SUCCESSOR NODE
19058: MOV -(XT),XR LOAD POINTER TO NEW NODE (COPY)
19059: MOV WA,PTHEN(XR) STORE PTR TO NEW SUCCESSOR
19060: *
19061: * NOW CHECK FOR SPECIAL CASE OF ALTERNATION NODE WHERE
19062: * PARM1 POINTS TO A NODE AND MUST BE COPIED LIKE PTHEN.
19063: *
19064: BNE (XR),=P$ALT,PCNC1 LOOP BACK IF NOT
19065: MOV PARM1(XR),XR ELSE LOAD POINTER TO ALTERNATIVE
19066: JSR PCOPY COPY IT
19067: MOV (XT),XR RESTORE PTR TO NEW NODE
19068: MOV WA,PARM1(XR) STORE PTR TO COPIED ALTERNATIVE
19069: BRN PCNC1 LOOP BACK FOR NEXT ENTRY
19070: *
19071: * HERE AT END OF COPY PROCESS
19072: *
19073: PCNC2 MOV WC,XS RESTORE STACK POINTER
19074: MOV (XS)+,XR LOAD POINTER TO COPY
19075: EXI RETURN TO PCONC CALLER
19076: ENP END PROCEDURE PCONC
19077: EJC
19078: *
19079: * PCOPY -- COPY A PATTERN NODE
19080: *
19081: * PCOPY IS CALLED FROM THE PCONC PROCEDURE TO COPY A SINGLE
19082: * PATTERN NODE. THE COPY IS ONLY CARRIED OUT IF THE NODE
19083: * HAS NOT BEEN COPIED ALREADY.
19084: *
19085: * (XR) POINTER TO NODE TO BE COPIED
19086: * (XT) PTR TO CURRENT LOC IN COPY LIST
19087: * (WC) POINTER TO LIST OF COPIED NODES
19088: * JSR PCOPY CALL TO COPY A NODE
19089: * (WA) POINTER TO COPY
19090: * (WB,XR) DESTROYED
19091: *
19092: PCOPY PRC N,0 ENTRY POINT
19093: MOV XT,WB SAVE XT
19094: MOV WC,XT POINT TO START OF LIST
19095: *
19096: * LOOP TO SEARCH LIST OF NODES COPIED ALREADY
19097: *
19098: PCOP1 DCA XT POINT TO NEXT ENTRY ON LIST
19099: BEQ XR,(XT),PCOP2 JUMP IF MATCH
19100: DCA XT ELSE SKIP OVER COPIED ADDRESS
19101: BNE XT,XS,PCOP1 LOOP BACK IF MORE TO TEST
19102: *
19103: * HERE IF NOT IN LIST, PERFORM COPY
19104: *
19105: MOV (XR),WA LOAD FIRST WORD OF BLOCK
19106: JSR BLKLN GET LENGTH OF BLOCK
19107: MOV XR,XL SAVE POINTER TO OLD NODE
19108: JSR ALLOC ALLOCATE SPACE FOR COPY
19109: MOV XL,-(XS) STORE OLD ADDRESS ON LIST
19110: MOV XR,-(XS) STORE NEW ADDRESS ON LIST
19111: CHK CHECK FOR STACK OVERFLOW
19112: MVW MOVE WORDS FROM OLD BLOCK TO COPY
19113: MOV (XS),WA LOAD POINTER TO COPY
19114: BRN PCOP3 JUMP TO EXIT
19115: *
19116: * HERE IF WE FIND ENTRY IN LIST
19117: *
19118: PCOP2 MOV -(XT),WA LOAD ADDRESS OF COPY FROM LIST
19119: *
19120: * COMMON EXIT POINT
19121: *
19122: PCOP3 MOV WB,XT RESTORE XT
19123: EXI RETURN TO PCOPY CALLER
19124: ENP END PROCEDURE PCOPY
19125: EJC
19126: *
19127: * PRFLR -- PRINT PROFILE
19128: * PRFLR IS CALLED TO PRINT THE CONTENTS OF THE PROFILE
19129: * TABLE IN A FAIRLY READABLE TABULAR FORMAT.
19130: *
19131: * JSR PRFLR CALL TO PRINT PROFILE
19132: * (WA,IA) DESTROYED
19133: *
19134: PRFLR PRC E,0
19135: BZE PFDMP,PRFL4 NO PRINTING IF NO PROFILING DONE
19136: MOV XR,-(XS) PRESERVE ENTRY XR
19137: MOV WB,PFSVW AND ALSO WB
19138: JSR PRTPG EJECT
19139: MOV =PFMS1,XR LOAD MSG /PROGRAM PROFILE/
19140: JSR PRTST AND PRINT IT
19141: JSR PRTNL FOLLOWED BY NEWLINE
19142: JSR PRTNL AND ANOTHER
19143: MOV =PFMS2,XR POINT TO FIRST HDR
19144: JSR PRTST PRINT IT
19145: JSR PRTNL NEW LINE
19146: MOV =PFMS3,XR SECOND HDR
19147: JSR PRTST PRINT IT
19148: JSR PRTNL NEW LINE
19149: JSR PRTNL AND ANOTHER BLANK LINE
19150: ZER WB INITIAL STMT COUNT
19151: MOV PFTBL,XR POINT TO TABLE ORIGIN
19152: ADD *NUM02,XR BIAS PAST XNBLK HEADER (SGD07)
19153: *
19154: * LOOP HERE TO PRINT SUCCESSIVE ENTRIES
19155: *
19156: PRFL1 ICV WB BUMP STMT NR
19157: LDI (XR) LOAD NR OF EXECUTIONS
19158: IEQ PRFL3 NO PRINTING IF ZERO
19159: MOV =PFPD1,PROFS POINT WHERE TO PRINT
19160: JSR PRTIN AND PRINT IT
19161: ZER PROFS BACK TO START OF LINE
19162: MTI WB LOAD STMT NR
19163: JSR PRTIN PRINT IT THERE
19164: MOV =PFPD2,PROFS AND PAD PAST COUNT
19165: LDI CFP$I(XR) LOAD TOTAL EXEC TIME
19166: JSR PRTIN PRINT THAT TOO
19167: LDI CFP$I(XR) RELOAD TIME
19168: MLI INTTH CONVERT TO MICROSEC
19169: IOV PRFL2 OMIT NEXT BIT IF OVERFLOW
19170: DVI (XR) DIVIDE BY EXECUTIONS
19171: MOV =PFPD3,PROFS PAD LAST PRINT
19172: JSR PRTIN AND PRINT MCSEC/EXECN
19173: *
19174: * MERGE AFTER PRINTING TIME
19175: *
19176: PRFL2 JSR PRTNL THATS ANOTHER LINE
19177: *
19178: * HERE TO GO TO NEXT ENTRY
19179: *
19180: PRFL3 ADD *PF$I2,XR BUMP INDEX PTR (SGD07)
19181: BLT WB,PFNTE,PRFL1 LOOP IF MORE STMTS
19182: MOV (XS)+,XR RESTORE CALLERS XR
19183: MOV PFSVW,WB AND WB TOO
19184: *
19185: * HERE TO EXIT
19186: *
19187: PRFL4 EXI RETURN
19188: ENP END OF PRFLR
19189: EJC
19190: *
19191: * PRFLU -- UPDATE AN ENTRY IN THE PROFILE TABLE
19192: *
19193: * ON ENTRY, KVSTN CONTAINS NR OF STMT TO PROFILE
19194: *
19195: * JSR PRFLU CALL TO UPDATE ENTRY
19196: * (IA) DESTROYED
19197: *
19198: PRFLU PRC E,0
19199: BNZ PFFNC,PFLU4 SKIP IF JUST ENTERED FUNCTION
19200: MOV XR,-(XS) PRESERVE ENTRY XR
19201: MOV WA,PFSVW SAVE WA (SGD07)
19202: BNZ PFTBL,PFLU2 BRANCH IF TABLE ALLOCATED
19203: *
19204: * HERE IF SPACE FOR PROFILE TABLE NOT YET ALLOCATED.
19205: * CALCULATE SIZE NEEDED, ALLOCATE A STATIC XNBLK, AND
19206: * INITIALIZE IT ALL TO ZERO.
19207: * THE TIME TAKEN FOR THIS WILL BE ATTRIBUTED TO THE CURRENT
19208: * STATEMENT (ASSIGNMENT TO KEYWD PROFILE), BUT SINCE THE
19209: * TIMING FOR THIS STATEMENT IS UP THE POLE ANYWAY, THIS
19210: * DOESNT REALLY MATTER...
19211: *
19212: SUB =NUM01,PFNTE ADJUST FOR EXTRA COUNT (SGD07)
19213: MTI PFI2A CONVRT ENTRY SIZE TO INT
19214: STI PFSTE AND STORE SAFELY FOR LATER
19215: MTI PFNTE LOAD TABLE LENGTH AS INTEGER
19216: MLI PFSTE MULTIPLY BY ENTRY SIZE
19217: MFI WA GET BACK ADDRESS-STYLE
19218: ADD =NUM02,WA ADD ON 2 WORD OVERHEAD
19219: WTB WA CONVERT THE WHOLE LOT TO BYTES
19220: JSR ALOST GIMME THE SPACE
19221: MOV XR,PFTBL SAVE BLOCK POINTER
19222: MOV =B$XNT,(XR)+ PUT BLOCK TYPE AND ...
19223: MOV WA,(XR)+ ... LENGTH INTO HEADER
19224: MFI WA GET BACK NR OF WDS IN DATA AREA
19225: LCT WA,WA LOAD THE COUNTER
19226: *
19227: * LOOP HERE TO ZERO THE BLOCK DATA
19228: *
19229: PFLU1 ZER (XR)+ BLANK A WORD
19230: BCT WA,PFLU1 AND ALLLLLLL THE REST
19231: *
19232: * END OF ALLOCATION. MERGE BACK INTO ROUTINE
19233: *
19234: PFLU2 MTI KVSTN LOAD NR OF STMT JUST ENDED
19235: SBI INTV1 MAKE INTO INDEX OFFSET
19236: MLI PFSTE MAKE OFFSET OF TABLE ENTRY
19237: MFI WA CONVERT TO ADDRESS
19238: WTB WA GET AS BAUS
19239: ADD *NUM02,WA OFFSET INCLUDES TABLE HEADER
19240: MOV PFTBL,XR GET TABLE START
19241: BGE WA,NUM01(XR),PFLU3 IF OUT OF TABLE, SKIP IT
19242: ADD WA,XR ELSE POINT TO ENTRY
19243: LDI (XR) GET NR OF EXECUTIONS SO FAR
19244: ADI INTV1 NUDGE UP ONE
19245: STI (XR) AND PUT BACK
19246: JSR SYSTM GET TIME NOW
19247: STI PFETM STASH ENDING TIME
19248: SBI PFSTM SUBTRACT START TIME
19249: ADI CFP$I(XR) ADD CUMULATIVE TIME SO FAR
19250: STI CFP$I(XR) AND PUT BACK NEW TOTAL
19251: LDI PFETM LOAD END TIME OF THIS STMT ...
19252: STI PFSTM ... WHICH IS START TIME OF NEXT
19253: *
19254: * MERGE HERE TO EXIT
19255: *
19256: PFLU3 MOV (XS)+,XR RESTORE CALLERS XR
19257: MOV PFSVW,WA RESTORE SAVED REG
19258: EXI AND RETURN
19259: *
19260: * HERE IF PROFILE IS SUPPRESSED BECAUSE A PROGRAM DEFINED
19261: * FUNCTION IS ABOUT TO BE ENTERED, AND SO THE CURRENT STMT
19262: * HAS NOT YET FINISHED
19263: *
19264: PFLU4 ZER PFFNC RESET THE CONDITION FLAG
19265: EXI AND IMMEDIATE RETURN
19266: ENP END OF PROCEDURE PRFLU
19267: EJC
19268: *
19269: * PRPAR - PROCESS PRINT PARAMETERS
19270: *
19271: * (WC) IF NONZERO ASSOCIATE TERMINAL ONLY
19272: * JSR PRPAR CALL TO PROCESS PRINT PARAMETERS
19273: * (XL,XR,WA,WB,WC) DESTROYED
19274: *
19275: * SINCE MEMORY ALLOCATION IS UNDECIDED ON INITIAL CALL,
19276: * TERMINAL CANNOT BE ASSOCIATED. THE ENTRY WITH WC NON-ZERO
19277: * IS PROVIDED SO A LATER CALL CAN BE MADE TO COMPLETE THIS.
19278: *
19279: PRPAR PRC E,0 ENTRY POINT
19280: BNZ WC,PRPA7 JUMP TO ASSOCIATE TERMINAL
19281: JSR SYSPP GET PRINT PARAMETERS
19282: BNZ WB,PRPA1 JUMP IF LINES/PAGE SPECIFIED
19283: MOV =CFP$M,WB ELSE USE A LARGE VALUE
19284: RSH WB,1 BUT NOT TOO LARGE
19285: *
19286: * STORE LINE COUNT/PAGE
19287: *
19288: PRPA1 MOV WB,LSTNP STORE NUMBER OF LINES/PAGE
19289: MOV WB,LSTLC PRETEND PAGE IS FULL INITIALLY
19290: ZER LSTPG CLEAR PAGE NUMBER
19291: MOV PRLEN,WB GET PRIOR LENGTH IF ANY
19292: BZE WB,PRPA2 SKIP IF NO LENGTH
19293: BGT WA,WB,PRPA3 SKIP STORING IF TOO BIG
19294: *
19295: * STORE PRINT BUFFER LENGTH
19296: *
19297: PRPA2 MOV WA,PRLEN STORE VALUE
19298: *
19299: * PROCESS BITS OPTIONS
19300: *
19301: PRPA3 MOV BITS3,WB BIT 3 MASK
19302: ANB WC,WB GET -NOLIST BIT
19303: ZRB WB,PRPA4 SKIP IF CLEAR
19304: ZER CSWLS SET -NOLIST
19305: *
19306: * CHECK IF FAIL REPORTS GOTO INTERACTIVE CHANNEL
19307: *
19308: PRPA4 MOV BITS1,WB BIT 1 MASK
19309: ANB WC,WB GET BIT
19310: MOV WB,ERICH STORE INT. CHAN. ERROR FLAG
19311: MOV BITS2,WB BIT 2 MASK
19312: ANB WC,WB GET BIT
19313: MOV WB,PRICH FLAG FOR STD PRINTER ON INT. CHAN.
19314: MOV BITS4,WB BIT 4 MASK
19315: ANB WC,WB GET BIT
19316: MOV WB,CPSTS FLAG FOR COMPILE STATS SUPPRESSN.
19317: MOV BITS5,WB BIT 5 MASK
19318: ANB WC,WB GET BIT
19319: MOV WB,EXSTS FLAG FOR EXEC STATS SUPPRESSION
19320: EJC
19321: *
19322: * PRPAR (CONTINUED)
19323: *
19324: MOV BITS6,WB BIT 6 MASK
19325: ANB WC,WB GET BIT
19326: MOV WB,PRECL EXTENDED/COMPACT LISTING FLAG
19327: SUB =NUM08,WA POINT 8 CHARS FROM LINE END
19328: ZRB WB,PRPA5 JUMP IF NOT EXTENDED
19329: MOV WA,LSTPO STORE FOR LISTING PAGE HEADINGS
19330: *
19331: * CONTINUE OPTION PROCESSING
19332: *
19333: PRPA5 MOV BITS7,WB BIT 7 MASK
19334: ANB WC,WB GET BIT 7
19335: MOV WB,CSWEX SET -NOEXECUTE IF NON-ZERO
19336: MOV BIT10,WB BIT 10 MASK
19337: ANB WC,WB GET BIT 10
19338: MOV WB,HEADP PRETEND PRINTED TO OMIT HEADERS
19339: MOV BITS9,WB BIT 9 MASK
19340: ANB WC,WB GET BIT 9
19341: MOV WB,PRSTO KEEP IT AS STD LISTING OPTION
19342: ZRB WB,PRPA6 SKIP IF CLEAR
19343: MOV PRLEN,WA GET PRINT BUFFER LENGTH
19344: SUB =NUM08,WA POINT 8 CHARS FROM LINE END
19345: MOV WA,LSTPO STORE PAGE OFFSET
19346: *
19347: * CHECK FOR TERMINAL
19348: *
19349: PRPA6 ANB BITS8,WC SEE IF TERMINAL TO BE ACTIVATED
19350: BNZ WC,PRPA7 JUMP IF TERMINAL REQUIRED
19351: BZE INITR,PRPA8 JUMP IF NO TERMINAL TO DETACH
19352: MOV =V$TER,XL PTR TO /TERMINAL/
19353: JSR GTNVR GET VRBLK POINTER
19354: PPM CANT FAIL
19355: MOV =NULLS,VRVAL(XR) CLEAR VALUE OF TERMINAL
19356: JSR SETVR REMOVE ASSOCIATION
19357: BRN PRPA8 RETURN
19358: *
19359: * ASSOCIATE TERMINAL
19360: *
19361: PRPA7 MNZ INITR NOTE TERMINAL ASSOCIATED
19362: BZE DNAMB,PRPA8 CANT IF MEMORY NOT ORGANISED
19363: MOV =V$TER,XL POINT TO TERMINAL STRING
19364: MOV =TRTOU,WB OUTPUT TRACE TYPE
19365: JSR INOUT ATTACH OUTPUT TRBLK TO VRBLK
19366: MOV XR,-(XS) STACK TRBLK PTR
19367: MOV =V$TER,XL POINT TO TERMINAL STRING
19368: MOV =TRTIN,WB INPUT TRACE TYPE
19369: JSR INOUT ATTACH INPUT TRACE BLK
19370: MOV (XS)+,VRVAL(XR) ADD OUTPUT TRBLK TO CHAIN
19371: *
19372: * RETURN POINT
19373: *
19374: PRPA8 EXI RETURN
19375: ENP END PROCEDURE PRPAR
19376: EJC
19377: *
19378: * PRTCH -- PRINT A CHARACTER
19379: *
19380: * PRTCH IS USED TO PRINT A SINGLE CHARACTER
19381: *
19382: * (WA) CHARACTER TO BE PRINTED
19383: * JSR PRTCH CALL TO PRINT CHARACTER
19384: *
19385: PRTCH PRC E,0 ENTRY POINT
19386: MOV XR,-(XS) SAVE XR
19387: BNE PROFS,PRLEN,PRCH1 JUMP IF ROOM IN BUFFER
19388: JSR PRTNL ELSE PRINT THIS LINE
19389: *
19390: * HERE AFTER MAKING SURE WE HAVE ROOM
19391: *
19392: PRCH1 MOV PRBUF,XR POINT TO PRINT BUFFER
19393: PSC XR,PROFS POINT TO NEXT CHARACTER LOCATION
19394: SCH WA,(XR) STORE NEW CHARACTER
19395: CSC XR COMPLETE STORE CHARACTERS
19396: ICV PROFS BUMP POINTER
19397: MOV (XS)+,XR RESTORE ENTRY XR
19398: EXI RETURN TO PRTCH CALLER
19399: ENP END PROCEDURE PRTCH
19400: EJC
19401: *
19402: * PRTIC -- PRINT TO INTERACTIVE CHANNEL
19403: *
19404: * PRTIC IS CALLED TO PRINT THE CONTENTS OF THE STANDARD
19405: * PRINT BUFFER TO THE INTERACTIVE CHANNEL. IT IS ONLY
19406: * CALLED AFTER PRTST HAS SET UP THE STRING FOR PRINTING.
19407: * IT DOES NOT CLEAR THE BUFFER.
19408: *
19409: * JSR PRTIC CALL FOR PRINT
19410: * (WA,WB) DESTROYED
19411: *
19412: PRTIC PRC E,0 ENTRY POINT
19413: MOV XR,-(XS) SAVE XR
19414: MOV PRBUF,XR POINT TO BUFFER
19415: MOV PROFS,WA NO OF CHARS
19416: JSR SYSPI PRINT
19417: PPM PRTC2 FAIL RETURN
19418: *
19419: * RETURN
19420: *
19421: PRTC1 MOV (XS)+,XR RESTORE XR
19422: EXI RETURN
19423: *
19424: * ERROR OCCURED
19425: *
19426: PRTC2 ZER ERICH PREVENT LOOPING
19427: ERB 252,ERROR ON PRINTING TO INTERACTIVE CHANNEL
19428: BRN PRTC1 RETURN
19429: ENP PROCEDURE PRTIC
19430: EJC
19431: *
19432: * PRTIS -- PRINT TO INTERACTIVE AND STANDARD PRINTER
19433: *
19434: * PRTIS PUTS A LINE FROM THE PRINT BUFFER ONTO THE
19435: * INTERACTIVE CHANNEL (IF ANY) AND THE STANDARD PRINTER.
19436: * IT ALWAYS PRINTS TO THE STANDARD PRINTER BUT DOES
19437: * NOT DUPLICATE LINES IF THE STANDARD PRINTER IS
19438: * INTERACTIVE. IT CLEARS DOWN THE PRINT BUFFER.
19439: *
19440: * JSR PRTIS CALL FOR PRINTING
19441: * (WA,WB) DESTROYED
19442: *
19443: PRTIS PRC E,0 ENTRY POINT
19444: BNZ PRICH,PRTS1 JUMP IF STANDARD PRINTER IS INT.CH.
19445: BZE ERICH,PRTS1 SKIP IF NOT DOING INT. ERROR REPS.
19446: JSR PRTIC PRINT TO INTERACTIVE CHANNEL
19447: *
19448: * MERGE AND EXIT
19449: *
19450: PRTS1 JSR PRTNL PRINT TO STANDARD PRINTER
19451: EXI RETURN
19452: ENP END PROCEDURE PRTIS
19453: EJC
19454: *
19455: * PRTIN -- PRINT AN INTEGER
19456: *
19457: * PRTIN PRINTS THE INTEGER VALUE WHICH IS IN THE INTEGER
19458: * ACCUMULATOR. BLOCKS BUILT IN DYNAMIC STORAGE
19459: * DURING THIS PROCESS ARE IMMEDIATELY DELETED.
19460: *
19461: * (IA) INTEGER VALUE TO BE PRINTED
19462: * JSR PRTIN CALL TO PRINT INTEGER
19463: * (IA,RA) DESTROYED
19464: *
19465: PRTIN PRC E,0 ENTRY POINT
19466: MOV XR,-(XS) SAVE XR
19467: JSR ICBLD BUILD INTEGER BLOCK
19468: BLO XR,DNAMB,PRTI1 JUMP IF ICBLK BELOW DYNAMIC
19469: BHI XR,DNAMP,PRTI1 JUMP IF ABOVE DYNAMIC
19470: MOV XR,DNAMP IMMEDIATELY DELETE IT
19471: *
19472: * DELETE ICBLK FROM DYNAMIC STORE
19473: *
19474: PRTI1 MOV XR,-(XS) STACK PTR FOR GTSTG
19475: JSR GTSTG CONVERT TO STRING
19476: PPM CONVERT ERROR IS IMPOSSIBLE
19477: MOV XR,DNAMP RESET POINTER TO DELETE SCBLK
19478: JSR PRTST PRINT INTEGER STRING
19479: MOV (XS)+,XR RESTORE ENTRY XR
19480: EXI RETURN TO PRTIN CALLER
19481: ENP END PROCEDURE PRTIN
19482: EJC
19483: *
19484: * PRTMI -- PRINT MESSAGE AND INTEGER
19485: *
19486: * PRTMI IS USED TO PRINT MESSAGES TOGETHER WITH AN INTEGER
19487: * VALUE STARTING IN COLUMN 15 (USED BY THE ROUTINES AT
19488: * THE END OF COMPILATION).
19489: *
19490: * JSR PRTMI CALL TO PRINT MESSAGE AND INTEGER
19491: *
19492: PRTMI PRC E,0 ENTRY POINT
19493: JSR PRTST PRINT STRING MESSAGE
19494: MOV =PRTMF,PROFS SET OFFSET TO COL 15
19495: JSR PRTIN PRINT INTEGER
19496: JSR PRTNL PRINT LINE
19497: EXI RETURN TO PRTMI CALLER
19498: ENP END PROCEDURE PRTMI
19499: EJC
19500: *
19501: * PRTMX -- AS PRTMI WITH EXTRA COPY TO INTERACTIVE CHAN.
19502: *
19503: * JSR PRTMX CALL FOR PRINTING
19504: * (WA,WB) DESTROYED
19505: *
19506: PRTMX PRC E,0 ENTRY POINT
19507: JSR PRTST PRINT STRING MESSAGE
19508: MOV =PRTMF,PROFS SET PTR TO COLUMN 15
19509: JSR PRTIN PRINT INTEGER
19510: JSR PRTIS PRINT LINE
19511: EXI RETURN
19512: ENP END PROCEDURE PRTMX
19513: EJC
19514: *
19515: * PRTNL -- PRINT NEW LINE (END PRINT LINE)
19516: *
19517: * PRTNL PRINTS THE CONTENTS OF THE PRINT BUFFER, RESETS
19518: * THE BUFFER TO ALL BLANKS AND RESETS THE PRINT POINTER.
19519: *
19520: * JSR PRTNL CALL TO PRINT LINE
19521: *
19522: PRTNL PRC R,0 ENTRY POINT
19523: BNZ HEADP,PRNL0 WERE HEADERS PRINTED
19524: JSR PRTPS NO - PRINT THEM
19525: *
19526: * CALL SYSPR
19527: *
19528: PRNL0 MOV XR,-(XS) SAVE ENTRY XR
19529: MOV WA,PRTSA SAVE WA
19530: MOV WB,PRTSB SAVE WB
19531: MOV PRBUF,XR LOAD POINTER TO BUFFER
19532: MOV PROFS,WA LOAD NUMBER OF CHARS IN BUFFER
19533: JSR SYSPR CALL SYSTEM PRINT ROUTINE
19534: PPM PRNL2 JUMP IF FAILED
19535: LCT WA,PRLNW LOAD LENGTH OF BUFFER IN WORDS
19536: ADD *SCHAR,XR POINT TO CHARS OF BUFFER
19537: MOV NULLW,WB GET WORD OF BLANKS
19538: *
19539: * LOOP TO BLANK BUFFER
19540: *
19541: PRNL1 MOV WB,(XR)+ STORE WORD OF BLANKS, BUMP PTR
19542: BCT WA,PRNL1 LOOP TILL ALL BLANKED
19543: *
19544: * EXIT POINT
19545: *
19546: MOV PRTSB,WB RESTORE WB
19547: MOV PRTSA,WA RESTORE WA
19548: MOV (XS)+,XR RESTORE ENTRY XR
19549: ZER PROFS RESET PRINT BUFFER POINTER
19550: EXI RETURN TO PRTNL CALLER
19551: *
19552: * FILE FULL OR NO OUTPUT FILE FOR LOAD MODULE
19553: *
19554: PRNL2 BNZ PRTEF,PRNL3 JUMP IF NOT FIRST TIME
19555: MNZ PRTEF MARK FIRST OCCURRENCE
19556: ERB 253,PRINT LIMIT EXCEEDED ON STANDARD OUTPUT CHANNEL
19557: *
19558: * STOP AT ONCE
19559: *
19560: PRNL3 MOV =NINI8,WB ENDING CODE
19561: MOV KVSTN,WA STATEMENT NUMBER
19562: JSR SYSEJ STOP
19563: ENP END PROCEDURE PRTNL
19564: EJC
19565: *
19566: * PRTNM -- PRINT VARIABLE NAME
19567: *
19568: * PRTNM IS USED TO PRINT A CHARACTER REPRESENTATION OF THE
19569: * NAME OF A VARIABLE (NOT A VALUE OF DATATYPE NAME)
19570: * NAMES OF PSEUDO-VARIABLES MAY NOT BE PASSED TO PRTNM.
19571: *
19572: * (XL) NAME BASE
19573: * (WA) NAME OFFSET
19574: * JSR PRTNM CALL TO PRINT NAME
19575: * (WB,WC,RA) DESTROYED
19576: *
19577: PRTNM PRC R,0 ENTRY POINT (RECURSIVE, SEE PRTVL)
19578: MOV WA,-(XS) SAVE WA (OFFSET IS COLLECTABLE)
19579: MOV XR,-(XS) SAVE ENTRY XR
19580: MOV XL,-(XS) SAVE NAME BASE
19581: BHI XL,STATE,PRN02 JUMP IF NOT NATURAL VARIABLE
19582: *
19583: * HERE FOR NATURAL VARIABLE NAME, RECOGNIZED BY THE FACT
19584: * THAT THE NAME BASE POINTS INTO THE STATIC AREA.
19585: *
19586: MOV XL,XR POINT TO VRBLK
19587: JSR PRTVN PRINT NAME OF VARIABLE
19588: *
19589: * COMMON EXIT POINT
19590: *
19591: PRN01 MOV (XS)+,XL RESTORE NAME BASE
19592: MOV (XS)+,XR RESTORE ENTRY VALUE OF XR
19593: MOV (XS)+,WA RESTORE WA
19594: EXI RETURN TO PRTNM CALLER
19595: *
19596: * HERE FOR CASE OF NON-NATURAL VARIABLE
19597: *
19598: PRN02 MOV WA,WB COPY NAME OFFSET
19599: BNE (XL),=B$PDT,PRN03 JUMP IF ARRAY OR TABLE
19600: *
19601: * FOR PROGRAM DEFINED DATATYPE, PRT FLD NAME, LEFT PAREN
19602: *
19603: MOV PDDFP(XL),XR LOAD POINTER TO DFBLK
19604: ADD WA,XR ADD NAME OFFSET
19605: MOV PDFOF(XR),XR LOAD VRBLK POINTER FOR FIELD
19606: JSR PRTVN PRINT FIELD NAME
19607: MOV =CH$PP,WA LOAD LEFT PAREN
19608: JSR PRTCH PRINT CHARACTER
19609: EJC
19610: *
19611: * PRTNM (CONTINUED)
19612: *
19613: * NOW WE PRINT AN IDENTIFYING NAME FOR THE OBJECT IF ONE
19614: * CAN BE FOUND. THE FOLLOWING CODE SEARCHES FOR A NATURAL
19615: * VARIABLE WHICH CONTAINS THIS OBJECT AS VALUE. IF SUCH A
19616: * VARIABLE IS FOUND, ITS NAME IS PRINTED, ELSE THE VALUE
19617: * OF THE OBJECT (AS PRINTED BY PRTVL) IS USED INSTEAD.
19618: *
19619: * FIRST WE POINT TO THE PARENT TBBLK IF THIS IS THE CASE OF
19620: * A TABLE ELEMENT. TO DO THIS, CHASE DOWN THE TRNXT CHAIN.
19621: *
19622: PRN03 BNE (XL),=B$TET,PRN04 JUMP IF WE GOT THERE (OR NOT TE)
19623: MOV TENXT(XL),XL ELSE MOVE OUT ON CHAIN
19624: BRN PRN03 AND LOOP BACK
19625: *
19626: * NOW WE ARE READY FOR THE SEARCH. TO SPEED THINGS UP IN
19627: * THE CASE OF CALLS FROM DUMP WHERE THE SAME NAME BASE
19628: * WILL OCCUR REPEATEDLY WHILE DUMPING AN ARRAY OR TABLE,
19629: * WE REMEMBER THE LAST VRBLK POINTER FOUND IN PRNMV. SO
19630: * FIRST CHECK TO SEE IF WE HAVE THIS ONE AGAIN.
19631: *
19632: PRN04 MOV PRNMV,XR POINT TO VRBLK WE FOUND LAST TIME
19633: MOV HSHTB,WA POINT TO HASH TABLE IN CASE NOT
19634: BRN PRN07 JUMP INTO SEARCH FOR SPECIAL CHECK
19635: *
19636: * LOOP THROUGH HASH SLOTS
19637: *
19638: PRN05 MOV WA,XR COPY SLOT POINTER
19639: ICA WA BUMP SLOT POINTER
19640: SUB *VRNXT,XR INTRODUCE STANDARD VRBLK OFFSET
19641: *
19642: * LOOP THROUGH VRBLKS ON ONE HASH CHAIN
19643: *
19644: PRN06 MOV VRNXT(XR),XR POINT TO NEXT VRBLK ON HASH CHAIN
19645: *
19646: * MERGE HERE FIRST TIME TO CHECK BLOCK WE FOUND LAST TIME
19647: *
19648: PRN07 MOV XR,WC COPY VRBLK POINTER
19649: BZE WC,PRN09 JUMP IF CHAIN END (OR PRNMV ZERO)
19650: EJC
19651: *
19652: * PRTNM (CONTINUED)
19653: *
19654: * LOOP TO FIND VALUE (CHASE DOWN POSSIBLE TRBLK CHAIN)
19655: *
19656: PRN08 MOV VRVAL(XR),XR LOAD VALUE
19657: BEQ (XR),=B$TRT,PRN08 LOOP IF THAT WAS A TRBLK
19658: *
19659: * NOW WE HAVE THE VALUE, IS THIS THE BLOCK WE WANT
19660: *
19661: BEQ XR,XL,PRN10 JUMP IF THIS MATCHES THE NAME BASE
19662: MOV WC,XR ELSE POINT BACK TO THAT VRBLK
19663: BRN PRN06 AND LOOP BACK
19664: *
19665: * HERE TO MOVE TO NEXT HASH SLOT
19666: *
19667: PRN09 BLT WA,HSHTE,PRN05 LOOP BACK IF MORE TO GO
19668: MOV XL,XR ELSE NOT FOUND, COPY VALUE POINTER
19669: JSR PRTVL PRINT VALUE
19670: BRN PRN11 AND MERGE AHEAD
19671: *
19672: * HERE WHEN WE FIND A MATCHING ENTRY
19673: *
19674: PRN10 MOV WC,XR COPY VRBLK POINTER
19675: MOV XR,PRNMV SAVE FOR NEXT TIME IN
19676: JSR PRTVN PRINT VARIABLE NAME
19677: *
19678: * MERGE HERE IF NO ENTRY FOUND
19679: *
19680: PRN11 MOV (XL),WC LOAD FIRST WORD OF NAME BASE
19681: BNE WC,=B$PDT,PRN13 JUMP IF NOT PROGRAM DEFINED
19682: *
19683: * FOR PROGRAM DEFINED DATATYPE, ADD RIGHT PAREN AND EXIT
19684: *
19685: MOV =CH$RP,WA LOAD RIGHT PAREN, MERGE
19686: *
19687: * MERGE HERE TO PRINT FINAL RIGHT PAREN OR BRACKET
19688: *
19689: PRN12 JSR PRTCH PRINT FINAL CHARACTER
19690: MOV WB,WA RESTORE NAME OFFSET
19691: BRN PRN01 MERGE BACK TO EXIT
19692: EJC
19693: *
19694: * PRTNM (CONTINUED)
19695: *
19696: * HERE FOR ARRAY OR TABLE
19697: *
19698: PRN13 MOV =CH$BB,WA LOAD LEFT BRACKET
19699: JSR PRTCH AND PRINT IT
19700: MOV (XS),XL RESTORE BLOCK POINTER
19701: MOV (XL),WC LOAD TYPE WORD AGAIN
19702: BNE WC,=B$TET,PRN15 JUMP IF NOT TABLE
19703: *
19704: * HERE FOR TABLE, PRINT SUBSCRIPT VALUE
19705: *
19706: MOV TESUB(XL),XR LOAD SUBSCRIPT VALUE
19707: MOV WB,XL SAVE NAME OFFSET
19708: JSR PRTVL PRINT SUBSCRIPT VALUE
19709: MOV XL,WB RESTORE NAME OFFSET
19710: *
19711: * MERGE HERE FROM ARRAY CASE TO PRINT RIGHT BRACKET
19712: *
19713: PRN14 MOV =CH$RB,WA LOAD RIGHT BRACKET
19714: BRN PRN12 MERGE BACK TO PRINT IT
19715: *
19716: * HERE FOR ARRAY OR VECTOR, TO PRINT SUBSCRIPT(S)
19717: *
19718: PRN15 MOV WB,WA COPY NAME OFFSET
19719: BTW WA CONVERT TO WORDS
19720: BEQ WC,=B$ART,PRN16 JUMP IF ARBLK
19721: *
19722: * HERE FOR VECTOR
19723: *
19724: SUB =VCVLB,WA ADJUST FOR STANDARD FIELDS
19725: MTI WA MOVE TO INTEGER ACCUM
19726: JSR PRTIN PRINT LINEAR SUBSCRIPT
19727: BRN PRN14 MERGE BACK FOR RIGHT BRACKET
19728: EJC
19729: *
19730: * PRTNM (CONTINUED)
19731: *
19732: * HERE FOR ARRAY. FIRST CALCULATE ABSOLUTE SUBSCRIPT
19733: * OFFSETS BY SUCCESSIVE DIVISIONS BY THE DIMENSION VALUES.
19734: * THIS MUST BE DONE RIGHT TO LEFT SINCE THE ELEMENTS ARE
19735: * STORED ROW-WISE. THE SUBSCRIPTS ARE STACKED AS INTEGERS.
19736: *
19737: PRN16 MOV AROFS(XL),WC LOAD LENGTH OF BOUNDS INFO
19738: ICA WC ADJUST FOR ARPRO FIELD
19739: BTW WC CONVERT TO WORDS
19740: SUB WC,WA GET LINEAR ZERO-ORIGIN SUBSCRIPT
19741: MTI WA GET INTEGER VALUE
19742: LCT WA,ARNDM(XL) SET NUM OF DIMENSIONS AS LOOP COUNT
19743: ADD AROFS(XL),XL POINT PAST BOUNDS INFORMATION
19744: SUB *ARLBD,XL SET OK OFFSET FOR PROPER PTR LATER
19745: *
19746: * LOOP TO STACK SUBSCRIPT OFFSETS
19747: *
19748: PRN17 SUB *ARDMS,XL POINT TO NEXT SET OF BOUNDS
19749: STI PRNSI SAVE CURRENT OFFSET
19750: RMI ARDIM(XL) GET REMAINDER ON DIVIDING BY DIMENS
19751: MFI -(XS) STORE ON STACK (ONE WORD)
19752: LDI PRNSI RELOAD ARGUMENT
19753: DVI ARDIM(XL) DIVIDE TO GET QUOTIENT
19754: BCT WA,PRN17 LOOP TILL ALL STACKED
19755: ZER XR SET OFFSET TO FIRST SET OF BOUNDS
19756: LCT WB,ARNDM(XL) LOAD COUNT OF DIMS TO CONTROL LOOP
19757: BRN PRN19 JUMP INTO PRINT LOOP
19758: *
19759: * LOOP TO PRINT SUBSCRIPTS FROM STACK ADJUSTING BY ADDING
19760: * THE APPROPRIATE LOW BOUND VALUE FROM THE ARBLK
19761: *
19762: PRN18 MOV =CH$CM,WA LOAD A COMMA
19763: JSR PRTCH PRINT IT
19764: *
19765: * MERGE HERE FIRST TIME IN (NO COMMA REQUIRED)
19766: *
19767: PRN19 MTI (XS)+ LOAD SUBSCRIPT OFFSET AS INTEGER
19768: ADD XR,XL POINT TO CURRENT LBD
19769: ADI ARLBD(XL) ADD LBD TO GET SIGNED SUBSCRIPT
19770: SUB XR,XL POINT BACK TO START OF ARBLK
19771: JSR PRTIN PRINT SUBSCRIPT
19772: ADD *ARDMS,XR BUMP OFFSET TO NEXT BOUNDS
19773: BCT WB,PRN18 LOOP BACK TILL ALL PRINTED
19774: BRN PRN14 MERGE BACK TO PRINT RIGHT BRACKET
19775: ENP END PROCEDURE PRTNM
19776: EJC
19777: *
19778: * PRTNV -- PRINT NAME VALUE
19779: *
19780: * PRTNV IS USED BY THE TRACE AND DUMP ROUTINES TO PRINT
19781: * A LINE OF THE FORM
19782: *
19783: * NAME = VALUE
19784: *
19785: * NOTE THAT THE NAME INVOLVED CAN NEVER BE A PSEUDO-VAR
19786: *
19787: * (XL) NAME BASE
19788: * (WA) NAME OFFSET
19789: * JSR PRTNV CALL TO PRINT NAME = VALUE
19790: * (WB,WC,RA) DESTROYED
19791: *
19792: PRTNV PRC E,0 ENTRY POINT
19793: JSR PRTNM PRINT ARGUMENT NAME
19794: MOV XR,-(XS) SAVE ENTRY XR
19795: MOV WA,-(XS) SAVE NAME OFFSET (COLLECTABLE)
19796: MOV =TMBEB,XR POINT TO BLANK EQUAL BLANK
19797: JSR PRTST PRINT IT
19798: MOV XL,XR COPY NAME BASE
19799: ADD WA,XR POINT TO VALUE
19800: MOV (XR),XR LOAD VALUE POINTER
19801: JSR PRTVL PRINT VALUE
19802: JSR PRTNL TERMINATE LINE
19803: MOV (XS)+,WA RESTORE NAME OFFSET
19804: MOV (XS)+,XR RESTORE ENTRY XR
19805: EXI RETURN TO CALLER
19806: ENP END PROCEDURE PRTNV
19807: EJC
19808: *
19809: * PRTPG -- PRINT A PAGE THROW
19810: *
19811: * PRINTS A PAGE THROW OR A FEW BLANK LINES ON THE STANDARD
19812: * LISTING CHANNEL DEPENDING ON THE LISTING OPTIONS CHOSEN.
19813: *
19814: * JSR PRTPG CALL FOR PAGE EJECT
19815: *
19816: PRTPG PRC E,0 ENTRY POINT
19817: BEQ STAGE,=STGXT,PRP01 JUMP IF EXECUTION TIME
19818: BZE LSTLC,PRP06 RETURN IF TOP OF PAGE ALREADY
19819: ZER LSTLC CLEAR LINE COUNT
19820: *
19821: * CHECK TYPE OF LISTING
19822: *
19823: PRP01 MOV XR,-(XS) PRESERVE XR
19824: BNZ PRSTD,PRP02 EJECT IF FLAG SET
19825: BNZ PRICH,PRP03 JUMP IF INTERACTIVE LISTING CHANNEL
19826: BZE PRECL,PRP03 JUMP IF COMPACT LISTING
19827: *
19828: * PERFORM AN EJECT
19829: *
19830: PRP02 JSR SYSEP EJECT
19831: BRN PRP04 MERGE
19832: *
19833: * COMPACT OR INTERACTIVE CHANNEL LISTING. CANT PRINT
19834: * BLANKS UNTIL CHECK MADE FOR HEADERS PRINTED AND FLAG SET.
19835: *
19836: *
19837: PRP03 MOV HEADP,XR REMEMBER HEADP
19838: MNZ HEADP SET TO AVOID REPEATED PRTPG CALLS
19839: JSR PRTNL PRINT BLANK LINE
19840: JSR PRTNL PRINT BLANK LINE
19841: JSR PRTNL PRINT BLANK LINE
19842: MOV =NUM03,LSTLC COUNT BLANK LINES
19843: MOV XR,HEADP RESTORE HEADER FLAG
19844: EJC
19845: *
19846: * PRPTG (CONTINUED)
19847: *
19848: * PRINT THE HEADING
19849: *
19850: PRP04 BNZ HEADP,PRP05 JUMP IF HEADER LISTED
19851: MNZ HEADP MARK HEADERS PRINTED
19852: MOV XL,-(XS) KEEP XL
19853: MOV =HEADR,XR POINT TO LISTING HEADER
19854: JSR PRTST PLACE IT
19855: JSR SYSID GET SYSTEM IDENTIFICATION
19856: JSR PRTST APPEND EXTRA CHARS
19857: JSR PRTNL PRINT IT
19858: MOV XL,XR EXTRA HEADER LINE
19859: JSR PRTST PLACE IT
19860: JSR PRTNL PRINT IT
19861: JSR PRTNL PRINT A BLANK
19862: JSR PRTNL AND ANOTHER
19863: ADD =NUM04,LSTLC FOUR HEADER LINES PRINTED
19864: MOV (XS)+,XL RESTORE XL
19865: *
19866: * MERGE IF HEADER NOT PRINTED
19867: *
19868: PRP05 MOV (XS)+,XR RESTORE XR
19869: *
19870: * RETURN
19871: *
19872: PRP06 EXI RETURN
19873: ENP END PROCEDURE PRTPG
19874: EJC
19875: *
19876: * PRTPS - PRINT PAGE WITH TEST FOR STANDARD LISTING OPTION
19877: *
19878: * IF THE STANDARD LISTING OPTION IS SELECTED, INSIST THAT
19879: * AN EJECT BE DONE
19880: *
19881: * JSR PRTPS CALL FOR EJECT
19882: *
19883: PRTPS PRC E,0 ENTRY POINT
19884: MOV PRSTO,PRSTD COPY OPTION FLAG
19885: JSR PRTPG PRINT PAGE
19886: ZER PRSTD CLEAR FLAG
19887: EXI RETURN
19888: ENP END PROCEDURE PRTPS
19889: EJC
19890: *
19891: * PRTSN -- PRINT STATEMENT NUMBER
19892: *
19893: * PRTSN IS USED TO INITIATE A PRINT TRACE LINE BY PRINTING
19894: * ASTERISKS AND THE CURRENT STATEMENT NUMBER. THE ACTUAL
19895: * FORMAT OF THE OUTPUT GENERATED IS.
19896: *
19897: * ***NNNNN**** III.....IIII
19898: *
19899: * NNNNN IS THE STATEMENT NUMBER WITH LEADING ZEROS REPLACED
19900: * BY ASTERISKS (E.G. *******9****)
19901: *
19902: * III...III REPRESENTS A VARIABLE LENGTH OUTPUT CONSISTING
19903: * OF A NUMBER OF LETTER I CHARACTERS EQUAL TO FNCLEVEL.
19904: *
19905: * JSR PRTSN CALL TO PRINT STATEMENT NUMBER
19906: * (WC) DESTROYED
19907: *
19908: PRTSN PRC E,0 ENTRY POINT
19909: MOV XR,-(XS) SAVE ENTRY XR
19910: MOV WA,PRSNA SAVE ENTRY WA
19911: MOV =TMASB,XR POINT TO ASTERISKS
19912: JSR PRTST PRINT ASTERISKS
19913: MOV =NUM04,PROFS POINT INTO MIDDLE OF ASTERISKS
19914: MTI KVSTN LOAD STATEMENT NUMBER AS INTEGER
19915: JSR PRTIN PRINT INTEGER STATEMENT NUMBER
19916: MOV =PRSNF,PROFS POINT PAST ASTERISKS PLUS BLANK
19917: MOV KVFNC,XR GET FNCLEVEL
19918: MOV =CH$LI,WA SET LETTER I
19919: *
19920: * LOOP TO GENERATE LETTER I FNCLEVEL TIMES
19921: *
19922: PRSN1 BZE XR,PRSN2 JUMP IF ALL SET
19923: JSR PRTCH ELSE PRINT AN I
19924: DCV XR DECREMENT COUNTER
19925: BRN PRSN1 LOOP BACK
19926: *
19927: * MERRE WITH ALL LETTER I CHARACTERS GENERATED
19928: *
19929: PRSN2 MOV =CH$BL,WA GET BLANK
19930: JSR PRTCH PRINT BLANK
19931: MOV PRSNA,WA RESTORE ENTRY WA
19932: MOV (XS)+,XR RESTORE ENTRY XR
19933: EXI RETURN TO PRTSN CALLER
19934: ENP END PROCEDURE PRTSN
19935: EJC
19936: *
19937: * PRTST -- PRINT STRING
19938: *
19939: * PRTST PLACES A STRING OF CHARACTERS IN THE PRINT BUFFER
19940: *
19941: * SEE PRTNL FOR GLOBAL LOCATIONS USED
19942: *
19943: * NOTE THAT THE FIRST WORD OF THE BLOCK (NORMALLY B$SCL)
19944: * IS NOT USED AND NEED NOT BE SET CORRECTLY (SEE PRTVN)
19945: *
19946: * (XR) STRING TO BE PRINTED
19947: * JSR PRTST CALL TO PRINT STRING
19948: * (PROFS) UPDATED PAST CHARS PLACED
19949: *
19950: PRTST PRC R,0 ENTRY POINT
19951: BNZ HEADP,PRST0 WERE HEADERS PRINTED
19952: JSR PRTPS NO - PRINT THEM
19953: *
19954: * CALL SYSPR
19955: *
19956: PRST0 MOV WA,PRSVA SAVE WA
19957: MOV WB,PRSVB SAVE WB
19958: ZER WB SET CHARS PRINTED COUNT TO ZERO
19959: *
19960: * LOOP TO PRINT SUCCESSIVE LINES FOR LONG STRING
19961: *
19962: PRST1 MOV SCLEN(XR),WA LOAD STRING LENGTH
19963: SUB WB,WA SUBTRACT COUNT OF CHARS ALREADY OUT
19964: BZE WA,PRST4 JUMP TO EXIT IF NONE LEFT
19965: MOV XL,-(XS) ELSE STACK ENTRY XL
19966: MOV XR,-(XS) SAVE ARGUMENT
19967: MOV XR,XL COPY FOR EVENTUAL MOVE
19968: MOV PRLEN,XR LOAD PRINT BUFFER LENGTH
19969: SUB PROFS,XR GET CHARS LEFT IN PRINT BUFFER
19970: BNZ XR,PRST2 SKIP IF ROOM LEFT ON THIS LINE
19971: JSR PRTNL ELSE PRINT THIS LINE
19972: MOV PRLEN,XR AND SET FULL WIDTH AVAILABLE
19973: EJC
19974: *
19975: * PRTST (CONTINUED)
19976: *
19977: * HERE WITH CHARS TO PRINT AND SOME ROOM IN BUFFER
19978: *
19979: PRST2 BLO WA,XR,PRST3 JUMP IF ROOM FOR REST OF STRING
19980: MOV XR,WA ELSE SET TO FILL LINE
19981: *
19982: * MERGE HERE WITH CHARACTER COUNT IN WA
19983: *
19984: PRST3 MOV PRBUF,XR POINT TO PRINT BUFFER
19985: PLC XL,WB POINT TO LOCATION IN STRING
19986: PSC XR,PROFS POINT TO LOCATION IN BUFFER
19987: ADD WA,WB BUMP STRING CHARS COUNT
19988: ADD WA,PROFS BUMP BUFFER POINTER
19989: MOV WB,PRSVC PRESERVE CHAR COUNTER
19990: MVC MOVE CHARACTERS TO BUFFER
19991: MOV PRSVC,WB RECOVER CHAR COUNTER
19992: MOV (XS)+,XR RESTORE ARGUMENT POINTER
19993: MOV (XS)+,XL RESTORE ENTRY XL
19994: BRN PRST1 LOOP BACK TO TEST FOR MORE
19995: *
19996: * HERE TO EXIT AFTER PRINTING STRING
19997: *
19998: PRST4 MOV PRSVB,WB RESTORE ENTRY WB
19999: MOV PRSVA,WA RESTORE ENTRY WA
20000: EXI RETURN TO PRTST CALLER
20001: ENP END PROCEDURE PRTST
20002: EJC
20003: *
20004: * PRTTR -- PRINT TO TERMINAL
20005: *
20006: * CALLED TO PRINT CONTENTS OF STANDARD PRINT BUFFER TO
20007: * ONLINE TERMINAL. CLEARS BUFFER DOWN AND RESETS PROFS.
20008: *
20009: * JSR PRTTR CALL FOR PRINT
20010: * (WA,WB) DESTROYED
20011: *
20012: PRTTR PRC E,0 ENTRY POINT
20013: MOV XR,-(XS) SAVE XR
20014: JSR PRTIC PRINT BUFFER CONTENTS
20015: MOV PRBUF,XR POINT TO PRINT BFR TO CLEAR IT
20016: LCT WA,PRLNW GET BUFFER LENGTH
20017: ADD *SCHAR,XR POINT PAST SCBLK HEADER
20018: MOV NULLW,WB GET BLANKS
20019: *
20020: * LOOP TO CLEAR BUFFER
20021: *
20022: PRTT1 MOV WB,(XR)+ CLEAR A WORD
20023: BCT WA,PRTT1 LOOP
20024: ZER PROFS RESET PROFS
20025: MOV (XS)+,XR RESTORE XR
20026: EXI RETURN
20027: ENP END PROCEDURE PRTTR
20028: EJC
20029: *
20030: * PRTVL -- PRINT A VALUE
20031: *
20032: * PRTVL PLACES AN APPROPRIATE CHARACTER REPRESENTATION OF
20033: * A DATA VALUE IN THE PRINT BUFFER FOR DUMP/TRACE USE.
20034: *
20035: * (XR) VALUE TO BE PRINTED
20036: * JSR PRTVL CALL TO PRINT VALUE
20037: * (WA,WB,WC,RA) DESTROYED
20038: *
20039: PRTVL PRC R,0 ENTRY POINT, RECURSIVE
20040: MOV XL,-(XS) SAVE ENTRY XL
20041: MOV XR,-(XS) SAVE ARGUMENT
20042: CHK CHECK FOR STACK OVERFLOW
20043: *
20044: * LOOP BACK HERE AFTER FINDING A TRAP BLOCK (TRBLK)
20045: *
20046: PRV01 MOV IDVAL(XR),PRVSI COPY IDVAL (IF ANY)
20047: MOV (XR),XL LOAD FIRST WORD OF BLOCK
20048: LEI XL LOAD ENTRY POINT ID
20049: BSW XL,BL$$T,PRV02 SWITCH ON BLOCK TYPE
20050: IFF BL$TR,PRV04 TRBLK
20051: IFF BL$AR,PRV05 ARBLK
20052: IFF BL$IC,PRV08 ICBLK
20053: IFF BL$NM,PRV09 NMBLK
20054: IFF BL$PD,PRV10 PDBLK
20055: IFF BL$RC,PRV08 RCBLK
20056: IFF BL$SC,PRV11 SCBLK
20057: IFF BL$SE,PRV12 SEBLK
20058: IFF BL$TB,PRV13 TBBLK
20059: IFF BL$VC,PRV13 VCBLK
20060: IFF BL$BC,PRV15 BCBLK
20061: ESW END OF SWITCH ON BLOCK TYPE
20062: *
20063: * HERE FOR BLOCKS FOR WHICH WE JUST PRINT DATATYPE NAME
20064: *
20065: PRV02 JSR DTYPE GET DATATYPE NAME
20066: JSR PRTST PRINT DATATYPE NAME
20067: *
20068: * COMMON EXIT POINT
20069: *
20070: PRV03 MOV (XS)+,XR RELOAD ARGUMENT
20071: MOV (XS)+,XL RESTORE XL
20072: EXI RETURN TO PRTVL CALLER
20073: *
20074: * HERE FOR TRBLK
20075: *
20076: PRV04 MOV TRVAL(XR),XR LOAD REAL VALUE
20077: BRN PRV01 AND LOOP BACK
20078: EJC
20079: *
20080: * PRTVL (CONTINUED)
20081: *
20082: * HERE FOR ARRAY (ARBLK)
20083: *
20084: * PRINT ARRAY ( PROTOTYPE ) BLANK NUMBER IDVAL
20085: *
20086: PRV05 MOV XR,XL PRESERVE ARGUMENT
20087: MOV =SCARR,XR POINT TO DATATYPE NAME (ARRAY)
20088: JSR PRTST PRINT IT
20089: MOV =CH$PP,WA LOAD LEFT PAREN
20090: JSR PRTCH PRINT LEFT PAREN
20091: ADD AROFS(XL),XL POINT TO PROTOTYPE
20092: MOV (XL),XR LOAD PROTOTYPE
20093: JSR PRTST PRINT PROTOTYPE
20094: *
20095: * VCBLK, TBBLK, BCBLK MERGE HERE FOR ) BLANK NUMBER IDVAL
20096: *
20097: PRV06 MOV =CH$RP,WA LOAD RIGHT PAREN
20098: JSR PRTCH PRINT RIGHT PAREN
20099: *
20100: * PDBLK MERGES HERE TO PRINT BLANK NUMBER IDVAL
20101: *
20102: PRV07 MOV =CH$BL,WA LOAD BLANK
20103: JSR PRTCH PRINT IT
20104: MOV =CH$NM,WA LOAD NUMBER SIGN
20105: JSR PRTCH PRINT IT
20106: MTI PRVSI GET IDVAL
20107: JSR PRTIN PRINT ID NUMBER
20108: BRN PRV03 BACK TO EXIT
20109: *
20110: * HERE FOR INTEGER (ICBLK), REAL (RCBLK)
20111: *
20112: * PRINT CHARACTER REPRESENTATION OF VALUE
20113: *
20114: PRV08 MOV XR,-(XS) STACK ARGUMENT FOR GTSTG
20115: JSR GTSTG CONVERT TO STRING
20116: PPM ERROR RETURN IS IMPOSSIBLE
20117: JSR PRTST PRINT THE STRING
20118: MOV XR,DNAMP DELETE GARBAGE STRING FROM STORAGE
20119: BRN PRV03 BACK TO EXIT
20120: EJC
20121: *
20122: * PRTVL (CONTINUED)
20123: *
20124: * NAME (NMBLK)
20125: *
20126: * FOR PSEUDO-VARIABLE, JUST PRINT DATATYPE NAME (NAME)
20127: * FOR ALL OTHER NAMES, PRINT DOT FOLLOWED BY NAME REP
20128: *
20129: PRV09 MOV NMBAS(XR),XL LOAD NAME BASE
20130: MOV (XL),WA LOAD FIRST WORD OF BLOCK
20131: BEQ WA,=B$KVT,PRV02 JUST PRINT NAME IF KEYWORD
20132: BEQ WA,=B$EVT,PRV02 JUST PRINT NAME IF EXPRESSION VAR
20133: MOV =CH$DT,WA ELSE GET DOT
20134: JSR PRTCH AND PRINT IT
20135: MOV NMOFS(XR),WA LOAD NAME OFFSET
20136: JSR PRTNM PRINT NAME
20137: BRN PRV03 BACK TO EXIT
20138: *
20139: * PROGRAM DATATYPE (PDBLK)
20140: *
20141: * PRINT DATATYPE NAME CH$BL CH$NM IDVAL
20142: *
20143: PRV10 JSR DTYPE GET DATATYPE NAME
20144: JSR PRTST PRINT DATATYPE NAME
20145: BRN PRV07 MERGE BACK TO PRINT ID
20146: *
20147: * HERE FOR STRING (SCBLK)
20148: *
20149: * PRINT QUOTE STRING-CHARACTERS QUOTE
20150: *
20151: PRV11 MOV =CH$SQ,WA LOAD SINGLE QUOTE
20152: JSR PRTCH PRINT QUOTE
20153: JSR PRTST PRINT STRING VALUE
20154: JSR PRTCH PRINT ANOTHER QUOTE
20155: BRN PRV03 BACK TO EXIT
20156: EJC
20157: *
20158: * PRTVL (CONTINUED)
20159: *
20160: * HERE FOR SIMPLE EXPRESSION (SEBLK)
20161: *
20162: * PRINT ASTERISK VARIABLE-NAME
20163: *
20164: PRV12 MOV =CH$AS,WA LOAD ASTERISK
20165: JSR PRTCH PRINT ASTERISK
20166: MOV SEVAR(XR),XR LOAD VARIABLE POINTER
20167: JSR PRTVN PRINT VARIABLE NAME
20168: BRN PRV03 JUMP BACK TO EXIT
20169: *
20170: * HERE FOR TABLE (TBBLK) AND ARRAY (VCBLK)
20171: *
20172: * PRINT DATATYPE ( PROTOTYPE ) BLANK NUMBER IDVAL
20173: *
20174: PRV13 MOV XR,XL PRESERVE ARGUMENT
20175: JSR DTYPE GET DATATYPE NAME
20176: JSR PRTST PRINT DATATYPE NAME
20177: MOV =CH$PP,WA LOAD LEFT PAREN
20178: JSR PRTCH PRINT LEFT PAREN
20179: MOV TBLEN(XL),WA LOAD LENGTH OF BLOCK (=VCLEN)
20180: BTW WA CONVERT TO WORD COUNT
20181: SUB =TBSI$,WA ALLOW FOR STANDARD FIELDS
20182: BEQ (XL),=B$TBT,PRV14 JUMP IF TABLE
20183: ADD =VCTBD,WA FOR VCBLK, ADJUST SIZE
20184: *
20185: * PRINT PROTOTYPE
20186: *
20187: PRV14 MTI WA MOVE AS INTEGER
20188: JSR PRTIN PRINT INTEGER PROTOTYPE
20189: BRN PRV06 MERGE BACK FOR REST
20190: EJC
20191: *
20192: * PRTVL (CONTINUED)
20193: *
20194: * HERE FOR BUFFER (BCBLK)
20195: *
20196: PRV15 MOV XR,XL PRESERVE ARGUMENT
20197: MOV =SCBUF,XR POINT TO DATATYPE NAME (BUFFER)
20198: JSR PRTST PRINT IT
20199: MOV =CH$PP,WA LOAD LEFT PAREN
20200: JSR PRTCH PRINT LEFT PAREN
20201: MOV BCBUF(XL),XR POINT TO BFBLK
20202: MTI BFALC(XR) LOAD ALLOCATION SIZE
20203: JSR PRTIN PRINT IT
20204: MOV =CH$CM,WA LOAD COMMA
20205: JSR PRTCH PRINT IT
20206: MTI BCLEN(XL) LOAD DEFINED LENGTH
20207: JSR PRTIN PRINT IT
20208: BRN PRV06 MERGE TO FINISH UP
20209: ENP END PROCEDURE PRTVL
20210: EJC
20211: *
20212: * PRTVN -- PRINT NATURAL VARIABLE NAME
20213: *
20214: * PRTVN PRINTS THE NAME OF A NATURAL VARIABLE
20215: *
20216: * (XR) POINTER TO VRBLK
20217: * JSR PRTVN CALL TO PRINT VARIABLE NAME
20218: *
20219: PRTVN PRC E,0 ENTRY POINT
20220: MOV XR,-(XS) STACK VRBLK POINTER
20221: ADD *VRSOF,XR POINT TO POSSIBLE STRING NAME
20222: BNZ SCLEN(XR),PRVN1 JUMP IF NOT SYSTEM VARIABLE
20223: MOV VRSVO(XR),XR POINT TO SVBLK WITH NAME
20224: *
20225: * MERGE HERE WITH DUMMY SCBLK POINTER IN XR
20226: *
20227: PRVN1 JSR PRTST PRINT STRING NAME OF VARIABLE
20228: MOV (XS)+,XR RESTORE VRBLK POINTER
20229: EXI RETURN TO PRTVN CALLER
20230: ENP END PROCEDURE PRTVN
20231: EJC
20232: *
20233: * RCBLD -- BUILD A REAL BLOCK
20234: *
20235: * (RA) REAL VALUE FOR RCBLK
20236: * JSR RCBLD CALL TO BUILD REAL BLOCK
20237: * (XR) POINTER TO RESULT RCBLK
20238: * (WA) DESTROYED
20239: *
20240: RCBLD PRC E,0 ENTRY POINT
20241: MOV DNAMP,XR LOAD POINTER TO NEXT AVAILABLE LOC
20242: ADD *RCSI$,XR POINT PAST NEW RCBLK
20243: BLO XR,DNAME,RCBL1 JUMP IF THERE IS ROOM
20244: MOV *RCSI$,WA ELSE LOAD RCBLK LENGTH
20245: JSR ALLOC USE STANDARD ALLOCATOR TO GET BLOCK
20246: ADD WA,XR POINT PAST BLOCK TO MERGE
20247: *
20248: * MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED
20249: *
20250: RCBL1 MOV XR,DNAMP SET NEW POINTER
20251: SUB *RCSI$,XR POINT BACK TO START OF BLOCK
20252: MOV =B$RCL,(XR) STORE TYPE WORD
20253: STR RCVAL(XR) STORE REAL VALUE IN RCBLK
20254: EXI RETURN TO RCBLD CALLER
20255: ENP END PROCEDURE RCBLD
20256: EJC
20257: *
20258: * READR -- READ NEXT SOURCE IMAGE AT COMPILE TIME
20259: *
20260: * READR IS USED TO READ THE NEXT SOURCE IMAGE. TO PROCESS
20261: * CONTINUATION CARDS PROPERLY, THE COMPILER MUST READ ONE
20262: * LINE AHEAD. THUS READR DOES NOT DESTROY THE CURRENT IMAGE
20263: * SEE ALSO THE NEXTS ROUTINE WHICH ACTUALLY GETS THE IMAGE.
20264: *
20265: * JSR READR CALL TO READ NEXT IMAGE
20266: * (XR) PTR TO NEXT IMAGE (0 IF NONE)
20267: * (R$CNI) COPY OF POINTER
20268: * (WA,WB,WC,XL) DESTROYED
20269: *
20270: READR PRC E,0 ENTRY POINT
20271: MOV R$CNI,XR GET PTR TO NEXT IMAGE
20272: BNZ XR,READ3 EXIT IF ALREADY READ
20273: BNE STAGE,=STGIC,READ3 EXIT IF NOT INITIAL COMPILE
20274: MOV CSWIN,WA MAX READ LENGTH
20275: JSR ALOCS ALLOCATE BUFFER
20276: JSR SYSRD READ INPUT IMAGE
20277: PPM READ4 JUMP IF END OF FILE
20278: MNZ WB SET TRIMR TO PERFORM TRIM
20279: BLE SCLEN(XR),CSWIN,READ1 USE SMALLER OF STRING LNTH ..
20280: MOV CSWIN,SCLEN(XR) ... AND XXX OF -INXXX
20281: *
20282: * PERFORM THE TRIM
20283: *
20284: READ1 JSR TRIMR TRIM TRAILING BLANKS
20285: *
20286: * MERGE HERE AFTER READ
20287: *
20288: READ2 MOV XR,R$CNI STORE COPY OF POINTER
20289: *
20290: * MERGE HERE IF NO READ ATTEMPTED
20291: *
20292: READ3 EXI RETURN TO READR CALLER
20293: *
20294: * HERE ON END OF FILE
20295: *
20296: READ4 MOV XR,DNAMP POP UNUSED SCBLK
20297: ZER XR ZERO PTR AS RESULT
20298: BRN READ2 MERGE
20299: ENP END PROCEDURE READR
20300: EJC
20301: *
20302: * SBSTR -- BUILD A SUBSTRING
20303: *
20304: * (XL) PTR TO SCBLK/BFBLK WITH CHARS
20305: * (WA) NUMBER OF CHARS IN SUBSTRING
20306: * (WB) OFFSET TO FIRST CHAR IN SCBLK
20307: * JSR SBSTR CALL TO BUILD SUBSTRING
20308: * (XR) PTR TO NEW SCBLK WITH SUBSTRING
20309: * (XL) ZERO
20310: * (WA,WB,WC,XL,IA) DESTROYED
20311: *
20312: * NOTE THAT SBSTR IS CALLED WITH A DUMMY STRING POINTER
20313: * (POINTING INTO A VRBLK OR SVBLK) TO COPY THE NAME OF A
20314: * VARIABLE AS A STANDARD STRING VALUE.
20315: *
20316: SBSTR PRC E,0 ENTRY POINT
20317: BZE WA,SBST2 JUMP IF NULL SUBSTRING
20318: JSR ALOCS ELSE ALLOCATE SCBLK
20319: MOV WC,WA MOVE NUMBER OF CHARACTERS
20320: MOV XR,WC SAVE PTR TO NEW SCBLK
20321: PLC XL,WB PREPARE TO LOAD CHARS FROM OLD BLK
20322: PSC XR PREPARE TO STORE CHARS IN NEW BLK
20323: MVC MOVE CHARACTERS TO NEW STRING
20324: MOV WC,XR THEN RESTORE SCBLK POINTER
20325: *
20326: * RETURN POINT
20327: *
20328: SBST1 ZER XL CLEAR GARBAGE POINTER IN XL
20329: EXI RETURN TO SBSTR CALLER
20330: *
20331: * HERE FOR NULL SUBSTRING
20332: *
20333: SBST2 MOV =NULLS,XR SET NULL STRING AS RESULT
20334: BRN SBST1 RETURN
20335: ENP END PROCEDURE SBSTR
20336: EJC
20337: *
20338: * SCANE -- SCAN AN ELEMENT
20339: *
20340: * SCANE IS CALLED AT COMPILE TIME (BY EXPAN ,CMPIL,CNCRD)
20341: * TO SCAN ONE ELEMENT FROM THE INPUT IMAGE.
20342: *
20343: * (SCNCC) NON-ZERO IF CALLED FROM CNCRD
20344: * JSR SCANE CALL TO SCAN ELEMENT
20345: * (XR) RESULT POINTER (SEE BELOW)
20346: * (XL) SYNTAX TYPE CODE (T$XXX)
20347: *
20348: * THE FOLLOWING GLOBAL LOCATIONS ARE USED.
20349: *
20350: * R$CIM POINTER TO STRING BLOCK (SCBLK)
20351: * FOR CURRENT INPUT IMAGE.
20352: *
20353: * R$CNI POINTER TO NEXT INPUT IMAGE STRING
20354: * POINTER (ZERO IF NONE).
20355: *
20356: * R$SCP SAVE POINTER (EXIT XR) FROM LAST
20357: * CALL IN CASE RESCAN IS SET.
20358: *
20359: * SCNBL THIS LOCATION IS SET NON-ZERO ON
20360: * EXIT IF SCANE SCANNED PAST BLANKS
20361: * BEFORE LOCATING THE CURRENT ELEMENT
20362: * THE END OF A LINE COUNTS AS BLANKS.
20363: *
20364: * SCNCC CNCRD SETS THIS NON-ZERO TO SCAN
20365: * CONTROL CARD NAMES AND CLEARS IT
20366: * ON RETURN
20367: *
20368: * SCNIL LENGTH OF CURRENT INPUT IMAGE
20369: *
20370: * SCNGO IF SET NON-ZERO ON ENTRY, F AND S
20371: * ARE RETURNED AS SEPARATE SYNTAX
20372: * TYPES (NOT LETTERS) (GOTO PRO-
20373: * CESSING). SCNGO IS RESET ON EXIT.
20374: *
20375: * SCNPT OFFSET TO CURRENT LOC IN R$CIM
20376: *
20377: * SCNRS IF SET NON-ZERO ON ENTRY, SCANE
20378: * RETURNS THE SAME RESULT AS ON THE
20379: * LAST CALL (RESCAN). SCNRS IS RESET
20380: * ON EXIT FROM ANY CALL TO SCANE.
20381: *
20382: * SCNTP SAVE SYNTAX TYPE FROM LAST
20383: * CALL (IN CASE RESCAN IS SET).
20384: EJC
20385: *
20386: * SCANE (CONTINUED)
20387: *
20388: *
20389: *
20390: * ELEMENT SCANNED XL XR
20391: * --------------- -- --
20392: *
20393: * CONTROL CARD NAME 0 POINTER TO SCBLK FOR NAME
20394: *
20395: * UNARY OPERATOR T$UOP PTR TO OPERATOR DVBLK
20396: *
20397: * LEFT PAREN T$LPR T$LPR
20398: *
20399: * LEFT BRACKET T$LBR T$LBR
20400: *
20401: * COMMA T$CMA T$CMA
20402: *
20403: * FUNCTION CALL T$FNC PTR TO FUNCTION VRBLK
20404: *
20405: * VARIABLE T$VAR PTR TO VRBLK
20406: *
20407: * STRING CONSTANT T$CON PTR TO SCBLK
20408: *
20409: * INTEGER CONSTANT T$CON PTR TO ICBLK
20410: *
20411: * REAL CONSTANT T$CON PTR TO RCBLK
20412: *
20413: * BINARY OPERATOR T$BOP PTR TO OPERATOR DVBLK
20414: *
20415: * RIGHT PAREN T$RPR T$RPR
20416: *
20417: * RIGHT BRACKET T$RBR T$RBR
20418: *
20419: * COLON T$COL T$COL
20420: *
20421: * SEMI-COLON T$SMC T$SMC
20422: *
20423: * F (SCNGO NE 0) T$FGO T$FGO
20424: *
20425: * S (SCNGO NE 0) T$SGO T$SGO
20426: EJC
20427: *
20428: * SCANE (CONTINUED)
20429: *
20430: * ENTRY POINT
20431: *
20432: SCANE PRC E,0 ENTRY POINT
20433: ZER SCNBL RESET BLANKS FLAG
20434: MOV WA,SCNSA SAVE WA
20435: MOV WB,SCNSB SAVE WB
20436: MOV WC,SCNSC SAVE WC
20437: BZE SCNRS,SCN03 JUMP IF NO RESCAN
20438: *
20439: * HERE FOR RESCAN REQUEST
20440: *
20441: MOV SCNTP,XL SET PREVIOUS RETURNED SCAN TYPE
20442: MOV R$SCP,XR SET PREVIOUS RETURNED POINTER
20443: ZER SCNRS RESET RESCAN SWITCH
20444: BRN SCN13 JUMP TO EXIT
20445: *
20446: * COME HERE TO READ NEW IMAGE TO TEST FOR CONTINUATION
20447: *
20448: SCN01 JSR READR READ NEXT IMAGE
20449: MOV *DVUBS,WB SET WB FOR NOT READING NAME
20450: BZE XR,SCN30 TREAT AS SEMI-COLON IF NONE
20451: PLC XR ELSE POINT TO FIRST CHARACTER
20452: LCH WC,(XR) LOAD FIRST CHARACTER
20453: BEQ WC,=CH$DT,SCN02 JUMP IF DOT FOR CONTINUATION
20454: BNE WC,=CH$PL,SCN30 ELSE TREAT AS SEMICOLON UNLESS PLUS
20455: *
20456: * HERE FOR CONTINUATION LINE
20457: *
20458: SCN02 JSR NEXTS ACQUIRE NEXT SOURCE IMAGE
20459: MOV =NUM01,SCNPT SET SCAN POINTER PAST CONTINUATION
20460: MNZ SCNBL SET BLANKS FLAG
20461: EJC
20462: *
20463: * SCANE (CONTINUED)
20464: *
20465: * MERGE HERE TO SCAN NEXT ELEMENT ON CURRENT LINE
20466: *
20467: SCN03 MOV SCNPT,WA LOAD CURRENT OFFSET
20468: BEQ WA,SCNIL,SCN01 CHECK CONTINUATION IF END
20469: MOV R$CIM,XL POINT TO CURRENT LINE
20470: PLC XL,WA POINT TO CURRENT CHARACTER
20471: MOV WA,SCNSE SET START OF ELEMENT LOCATION
20472: MOV =OPDVS,WC POINT TO OPERATOR DV LIST
20473: MOV *DVUBS,WB SET CONSTANT FOR OPERATOR CIRCUIT
20474: BRN SCN06 START SCANNING
20475: *
20476: * LOOP HERE TO IGNORE LEADING BLANKS AND TABS
20477: *
20478: SCN05 BZE WB,SCN10 JUMP IF TRAILING
20479: ICV SCNSE INCREMENT START OF ELEMENT
20480: BEQ WA,SCNIL,SCN01 JUMP IF END OF IMAGE
20481: MNZ SCNBL NOTE BLANKS SEEN
20482: *
20483: * THE FOLLOWING JUMP IS USED REPEATEDLY FOR SCANNING OUT
20484: * THE CHARACTERS OF A NUMERIC CONSTANT OR VARIABLE NAME.
20485: * THE REGISTERS ARE USED AS FOLLOWS.
20486: *
20487: * (XR) SCRATCH
20488: * (XL) PTR TO NEXT CHARACTER
20489: * (WA) CURRENT SCAN OFFSET
20490: * (WB) *DVUBS (0 IF SCANNING NAME,CONST)
20491: * (WC) =OPDVS (0 IF SCANNING CONSTANT)
20492: *
20493: SCN06 LCH XR,(XL)+ GET NEXT CHARACTER
20494: ICV WA BUMP SCAN OFFSET
20495: MOV WA,SCNPT STORE OFFSET PAST CHAR SCANNED
20496: BLO =CFP$U,XR,SCN07 QUICK CHECK FOR OTHER CHAR
20497: BSW XR,CFP$U,SCN07 SWITCH ON SCANNED CHARACTER
20498: *
20499: * SWITCH TABLE FOR SWITCH ON CHARACTER
20500: *
20501: IFF CH$BL,SCN05 BLANK
20502: IFF CH$HT,SCN05 HORIZONTAL TAB
20503: IFF CH$D0,SCN08 DIGIT 0
20504: IFF CH$D1,SCN08 DIGIT 1
20505: IFF CH$D2,SCN08 DIGIT 2
20506: IFF CH$D3,SCN08 DIGIT 3
20507: IFF CH$D4,SCN08 DIGIT 4
20508: IFF CH$D5,SCN08 DIGIT 5
20509: IFF CH$D6,SCN08 DIGIT 6
20510: IFF CH$D7,SCN08 DIGIT 7
20511: IFF CH$D8,SCN08 DIGIT 8
20512: IFF CH$D9,SCN08 DIGIT 9
20513: EJC
20514: *
20515: * SCANE (CONTINUED)
20516: *
20517: IFF CH$LA,SCN09 LETTER A
20518: IFF CH$LB,SCN09 LETTER B
20519: IFF CH$LC,SCN09 LETTER C
20520: IFF CH$LD,SCN09 LETTER D
20521: IFF CH$LE,SCN09 LETTER E
20522: IFF CH$LG,SCN09 LETTER G
20523: IFF CH$LH,SCN09 LETTER H
20524: IFF CH$LI,SCN09 LETTER I
20525: IFF CH$LJ,SCN09 LETTER J
20526: IFF CH$LK,SCN09 LETTER K
20527: IFF CH$LL,SCN09 LETTER L
20528: IFF CH$LM,SCN09 LETTER M
20529: IFF CH$LN,SCN09 LETTER N
20530: IFF CH$LO,SCN09 LETTER O
20531: IFF CH$LP,SCN09 LETTER P
20532: IFF CH$LQ,SCN09 LETTER Q
20533: IFF CH$LR,SCN09 LETTER R
20534: IFF CH$LT,SCN09 LETTER T
20535: IFF CH$LU,SCN09 LETTER U
20536: IFF CH$LV,SCN09 LETTER V
20537: IFF CH$LW,SCN09 LETTER W
20538: IFF CH$LX,SCN09 LETTER X
20539: IFF CH$LY,SCN09 LETTER Y
20540: IFF CH$L$,SCN09 LETTER Z
20541: IFF CH$$A,SCN09 SHIFTED A
20542: IFF CH$$B,SCN09 SHIFTED B
20543: IFF CH$$C,SCN09 SHIFTED C
20544: IFF CH$$D,SCN09 SHIFTED D
20545: IFF CH$$E,SCN09 SHIFTED E
20546: IFF CH$$F,SCN20 SHIFTED F
20547: IFF CH$$G,SCN09 SHIFTED G
20548: IFF CH$$H,SCN09 SHIFTED H
20549: IFF CH$$I,SCN09 SHIFTED I
20550: IFF CH$$J,SCN09 SHIFTED J
20551: IFF CH$$K,SCN09 SHIFTED K
20552: IFF CH$$L,SCN09 SHIFTED L
20553: IFF CH$$M,SCN09 SHIFTED M
20554: IFF CH$$N,SCN09 SHIFTED N
20555: IFF CH$$O,SCN09 SHIFTED O
20556: IFF CH$$P,SCN09 SHIFTED P
20557: IFF CH$$Q,SCN09 SHIFTED Q
20558: IFF CH$$R,SCN09 SHIFTED R
20559: IFF CH$$S,SCN21 SHIFTED S
20560: IFF CH$$T,SCN09 SHIFTED T
20561: IFF CH$$U,SCN09 SHIFTED U
20562: IFF CH$$V,SCN09 SHIFTED V
20563: IFF CH$$W,SCN09 SHIFTED W
20564: IFF CH$$X,SCN09 SHIFTED X
20565: IFF CH$$Y,SCN09 SHIFTED Y
20566: IFF CH$$$,SCN09 SHIFTED Z
20567: EJC
20568: *
20569: * SCANE (CONTINUED)
20570: *
20571: IFF CH$SQ,SCN16 SINGLE QUOTE
20572: IFF CH$DQ,SCN17 DOUBLE QUOTE
20573: IFF CH$LF,SCN20 LETTER F
20574: IFF CH$LS,SCN21 LETTER S
20575: IFF CH$UN,SCN24 UNDERLINE
20576: IFF CH$PP,SCN25 LEFT PAREN
20577: IFF CH$RP,SCN26 RIGHT PAREN
20578: IFF CH$RB,SCN27 RIGHT BRACKET
20579: IFF CH$BB,SCN28 LEFT BRACKET
20580: IFF CH$CB,SCN27 RIGHT BRACKET
20581: IFF CH$OB,SCN28 LEFT BRACKET
20582: IFF CH$CL,SCN29 COLON
20583: IFF CH$SM,SCN30 SEMI-COLON
20584: IFF CH$CM,SCN31 COMMA
20585: IFF CH$DT,SCN32 DOT
20586: IFF CH$PL,SCN33 PLUS
20587: IFF CH$MN,SCN34 MINUS
20588: IFF CH$NT,SCN35 NOT
20589: IFF CH$DL,SCN36 DOLLAR
20590: IFF CH$EX,SCN37 EXCLAMATION MARK
20591: IFF CH$PC,SCN38 PERCENT
20592: IFF CH$SL,SCN40 SLASH
20593: IFF CH$NM,SCN41 NUMBER SIGN
20594: IFF CH$AT,SCN42 AT
20595: IFF CH$BR,SCN43 VERTICAL BAR
20596: IFF CH$AM,SCN44 AMPERSAND
20597: IFF CH$QU,SCN45 QUESTION MARK
20598: IFF CH$EQ,SCN46 EQUAL
20599: IFF CH$AS,SCN49 ASTERISK
20600: ESW END SWITCH ON CHARACTER
20601: *
20602: * HERE FOR ILLEGAL CHARACTER (UNDERLINE MERGES)
20603: *
20604: SCN07 BZE WB,SCN10 JUMP IF SCANNING NAME OR CONSTANT
20605: ERB 230,SYNTAX ERROR. ILLEGAL CHARACTER
20606: EJC
20607: *
20608: * SCANE (CONTINUED)
20609: *
20610: * HERE FOR DIGITS 0-9
20611: *
20612: SCN08 BZE WB,SCN09 KEEP SCANNING IF NAME/CONSTANT
20613: ZER WC ELSE SET FLAG FOR SCANNING CONSTANT
20614: *
20615: * HERE FOR LETTER. LOOP HERE WHEN SCANNING NAME/CONSTANT
20616: *
20617: SCN09 BEQ WA,SCNIL,SCN11 JUMP IF END OF IMAGE
20618: ZER WB SET FLAG FOR SCANNING NAME/CONST
20619: BRN SCN06 MERGE BACK TO CONTINUE SCAN
20620: *
20621: * COME HERE FOR DELIMITER ENDING NAME OR CONSTANT
20622: *
20623: SCN10 DCV WA RESET OFFSET TO POINT TO DELIMITER
20624: *
20625: * COME HERE AFTER FINISHING SCAN OF NAME OR CONSTANT
20626: *
20627: SCN11 MOV WA,SCNPT STORE UPDATED SCAN OFFSET
20628: MOV SCNSE,WB POINT TO START OF ELEMENT
20629: SUB WB,WA GET NUMBER OF CHARACTERS
20630: MOV R$CIM,XL POINT TO LINE IMAGE
20631: BNZ WC,SCN15 JUMP IF NAME
20632: *
20633: * HERE AFTER SCANNING OUT NUMERIC CONSTANT
20634: *
20635: JSR SBSTR GET STRING FOR CONSTANT
20636: MOV XR,DNAMP DELETE FROM STORAGE (NOT NEEDED)
20637: JSR GTNUM CONVERT TO NUMERIC
20638: PPM SCN14 JUMP IF CONVERSION FAILURE
20639: *
20640: * MERGE HERE TO EXIT WITH CONSTANT
20641: *
20642: SCN12 MOV =T$CON,XL SET RESULT TYPE OF CONSTANT
20643: EJC
20644: *
20645: * SCANE (CONTINUED)
20646: *
20647: * COMMON EXIT POINT (XR,XL) SET
20648: *
20649: SCN13 MOV SCNSA,WA RESTORE WA
20650: MOV SCNSB,WB RESTORE WB
20651: MOV SCNSC,WC RESTORE WC
20652: MOV XR,R$SCP SAVE XR IN CASE RESCAN
20653: MOV XL,SCNTP SAVE XL IN CASE RESCAN
20654: ZER SCNGO RESET POSSIBLE GOTO FLAG
20655: EXI RETURN TO SCANE CALLER
20656: *
20657: * HERE IF CONVERSION ERROR ON NUMERIC ITEM
20658: *
20659: SCN14 ERB 231,SYNTAX ERROR. INVALID NUMERIC ITEM
20660: *
20661: * HERE AFTER SCANNING OUT VARIABLE NAME
20662: *
20663: SCN15 JSR SBSTR BUILD STRING NAME OF VARIABLE
20664: BNZ SCNCC,SCN13 RETURN IF CNCRD CALL
20665: JSR GTNVR LOCATE/BUILD VRBLK
20666: PPM DUMMY (UNUSED) ERROR RETURN
20667: MOV =T$VAR,XL SET TYPE AS VARIABLE
20668: BRN SCN13 BACK TO EXIT
20669: *
20670: * HERE FOR SINGLE QUOTE (START OF STRING CONSTANT)
20671: *
20672: SCN16 BZE WB,SCN10 TERMINATOR IF SCANNING NAME OR CNST
20673: MOV =CH$SQ,WB SET TERMINATOR AS SINGLE QUOTE
20674: BRN SCN18 MERGE
20675: *
20676: * HERE FOR DOUBLE QUOTE (START OF STRING CONSTANT)
20677: *
20678: SCN17 BZE WB,SCN10 TERMINATOR IF SCANNING NAME OR CNST
20679: MOV =CH$DQ,WB SET DOUBLE QUOTE TERMINATOR, MERGE
20680: *
20681: * LOOP TO SCAN OUT STRING CONSTANT
20682: *
20683: SCN18 BEQ WA,SCNIL,SCN19 ERROR IF END OF IMAGE
20684: LCH WC,(XL)+ ELSE LOAD NEXT CHARACTER
20685: ICV WA BUMP OFFSET
20686: BNE WC,WB,SCN18 LOOP BACK IF NOT TERMINATOR
20687: EJC
20688: *
20689: * SCANE (CONTINUED)
20690: *
20691: * HERE AFTER SCANNING OUT STRING CONSTANT
20692: *
20693: MOV SCNPT,WB POINT TO FIRST CHARACTER
20694: MOV WA,SCNPT SAVE OFFSET PAST FINAL QUOTE
20695: DCV WA POINT BACK PAST LAST CHARACTER
20696: SUB WB,WA GET NUMBER OF CHARACTERS
20697: MOV R$CIM,XL POINT TO INPUT IMAGE
20698: JSR SBSTR BUILD SUBSTRING VALUE
20699: BRN SCN12 BACK TO EXIT WITH CONSTANT RESULT
20700: *
20701: * HERE IF NO MATCHING QUOTE FOUND
20702: *
20703: SCN19 MOV WA,SCNPT SET UPDATED SCAN POINTER
20704: ERB 232,SYNTAX ERROR. UNMATCHED STRING QUOTE
20705: *
20706: * HERE FOR F (POSSIBLE FAILURE GOTO)
20707: *
20708: SCN20 MOV =T$FGO,XR SET RETURN CODE FOR FAIL GOTO
20709: BRN SCN22 JUMP TO MERGE
20710: *
20711: * HERE FOR S (POSSIBLE SUCCESS GOTO)
20712: *
20713: SCN21 MOV =T$SGO,XR SET SUCCESS GOTO AS RETURN CODE
20714: *
20715: * SPECIAL GOTO CASES MERGE HERE
20716: *
20717: SCN22 BZE SCNGO,SCN09 TREAT AS NORMAL LETTER IF NOT GOTO
20718: *
20719: * MERGE HERE FOR SPECIAL CHARACTER EXIT
20720: *
20721: SCN23 BZE WB,SCN10 JUMP IF END OF NAME/CONSTANT
20722: MOV XR,XL ELSE COPY CODE
20723: BRN SCN13 AND JUMP TO EXIT
20724: *
20725: * HERE FOR UNDERLINE
20726: *
20727: SCN24 BZE WB,SCN09 PART OF NAME IF SCANNING NAME
20728: BRN SCN07 ELSE ILLEGAL
20729: EJC
20730: *
20731: * SCANE (CONTINUED)
20732: *
20733: * HERE FOR LEFT PAREN
20734: *
20735: SCN25 MOV =T$LPR,XR SET LEFT PAREN RETURN CODE
20736: BNZ WB,SCN23 RETURN LEFT PAREN UNLESS NAME
20737: BZE WC,SCN10 DELIMITER IF SCANNING CONSTANT
20738: *
20739: * HERE FOR LEFT PAREN AFTER NAME (FUNCTION CALL)
20740: *
20741: MOV SCNSE,WB POINT TO START OF NAME
20742: MOV WA,SCNPT SET POINTER PAST LEFT PAREN
20743: DCV WA POINT BACK PAST LAST CHAR OF NAME
20744: SUB WB,WA GET NAME LENGTH
20745: MOV R$CIM,XL POINT TO INPUT IMAGE
20746: JSR SBSTR GET STRING NAME FOR FUNCTION
20747: JSR GTNVR LOCATE/BUILD VRBLK
20748: PPM DUMMY (UNUSED) ERROR RETURN
20749: MOV =T$FNC,XL SET CODE FOR FUNCTION CALL
20750: BRN SCN13 BACK TO EXIT
20751: *
20752: * PROCESSING FOR SPECIAL CHARACTERS
20753: *
20754: SCN26 MOV =T$RPR,XR RIGHT PAREN, SET CODE
20755: BRN SCN23 TAKE SPECIAL CHARACTER EXIT
20756: *
20757: SCN27 MOV =T$RBR,XR RIGHT BRACKET, SET CODE
20758: BRN SCN23 TAKE SPECIAL CHARACTER EXIT
20759: *
20760: SCN28 MOV =T$LBR,XR LEFT BRACKET, SET CODE
20761: BRN SCN23 TAKE SPECIAL CHARACTER EXIT
20762: *
20763: SCN29 MOV =T$COL,XR COLON, SET CODE
20764: BRN SCN23 TAKE SPECIAL CHARACTER EXIT
20765: *
20766: SCN30 MOV =T$SMC,XR SEMI-COLON, SET CODE
20767: BRN SCN23 TAKE SPECIAL CHARACTER EXIT
20768: *
20769: SCN31 MOV =T$CMA,XR COMMA, SET CODE
20770: BRN SCN23 TAKE SPECIAL CHARACTER EXIT
20771: EJC
20772: *
20773: * SCANE (CONTINUED)
20774: *
20775: * HERE FOR OPERATORS. ON ENTRY, WC POINTS TO THE TABLE OF
20776: * OPERATOR DOPE VECTORS AND WB IS THE INCREMENT TO STEP
20777: * TO THE NEXT PAIR (BINARY/UNARY) OF DOPE VECTORS IN THE
20778: * LIST. ON REACHING SCN46, THE POINTER HAS BEEN ADJUSTED TO
20779: * POINT TO THE APPROPRIATE PAIR OF DOPE VECTORS.
20780: * THE FIRST THREE ENTRIES ARE SPECIAL SINCE THEY CAN OCCUR
20781: * AS PART OF A VARIABLE NAME (.) OR CONSTANT (.+-).
20782: *
20783: SCN32 BZE WB,SCN09 DOT CAN BE PART OF NAME OR CONSTANT
20784: ADD WB,WC ELSE BUMP POINTER
20785: *
20786: SCN33 BZE WC,SCN09 PLUS CAN BE PART OF CONSTANT
20787: BZE WB,SCN48 PLUS CANNOT BE PART OF NAME
20788: ADD WB,WC ELSE BUMP POINTER
20789: *
20790: SCN34 BZE WC,SCN09 MINUS CAN BE PART OF CONSTANT
20791: BZE WB,SCN48 MINUS CANNOT BE PART OF NAME
20792: ADD WB,WC ELSE BUMP POINTER
20793: *
20794: SCN35 ADD WB,WC NOT
20795: SCN36 ADD WB,WC DOLLAR
20796: SCN37 ADD WB,WC EXCLAMATION
20797: SCN38 ADD WB,WC PERCENT
20798: SCN39 ADD WB,WC ASTERISK
20799: SCN40 ADD WB,WC SLASH
20800: SCN41 ADD WB,WC NUMBER SIGN
20801: SCN42 ADD WB,WC AT SIGN
20802: SCN43 ADD WB,WC VERTICAL BAR
20803: SCN44 ADD WB,WC AMPERSAND
20804: SCN45 ADD WB,WC QUESTION MARK
20805: *
20806: * ALL OPERATORS COME HERE (EQUAL MERGES DIRECTLY)
20807: * (WC) POINTS TO THE BINARY/UNARY PAIR OF OPERATOR DVBLKS.
20808: *
20809: SCN46 BZE WB,SCN10 OPERATOR TERMINATES NAME/CONSTANT
20810: MOV WC,XR ELSE COPY DV POINTER
20811: LCH WC,(XL) LOAD NEXT CHARACTER
20812: MOV =T$BOP,XL SET BINARY OP IN CASE
20813: BEQ WA,SCNIL,SCN47 SHOULD BE BINARY IF IMAGE END
20814: BEQ WC,=CH$BL,SCN47 SHOULD BE BINARY IF FOLLOWED BY BLK
20815: BEQ WC,=CH$HT,SCN47 JUMP IF HORIZONTAL TAB
20816: BEQ WC,=CH$SM,SCN47 SEMICOLON CAN IMMEDIATELY FOLLOW =
20817: *
20818: * HERE FOR UNARY OPERATOR
20819: *
20820: ADD *DVBS$,XR POINT TO DV FOR UNARY OP
20821: MOV =T$UOP,XL SET TYPE FOR UNARY OPERATOR
20822: BLE SCNTP,=T$UOK,SCN13 OK UNARY IF OK PRECEDING ELEMENT
20823: EJC
20824: *
20825: * SCANE (CONTINUED)
20826: *
20827: * MERGE HERE TO REQUIRE PRECEDING BLANKS
20828: *
20829: SCN47 BNZ SCNBL,SCN13 ALL OK IF PRECEDING BLANKS, EXIT
20830: *
20831: * FAIL OPERATOR IN THIS POSITION
20832: *
20833: SCN48 ERB 233,SYNTAX ERROR. INVALID USE OF OPERATOR
20834: *
20835: * HERE FOR ASTERISK, COULD BE ** SUBSTITUTE FOR EXCLAMATION
20836: *
20837: SCN49 BZE WB,SCN10 END OF NAME IF SCANNING NAME
20838: BEQ WA,SCNIL,SCN39 NOT ** IF * AT IMAGE END
20839: MOV WA,XR ELSE SAVE OFFSET PAST FIRST *
20840: MOV WA,SCNOF SAVE ANOTHER COPY
20841: LCH WA,(XL)+ LOAD NEXT CHARACTER
20842: BNE WA,=CH$AS,SCN50 NOT ** IF NEXT CHAR NOT *
20843: ICV XR ELSE STEP OFFSET PAST SECOND *
20844: BEQ XR,SCNIL,SCN51 OK EXCLAM IF END OF IMAGE
20845: LCH WA,(XL) ELSE LOAD NEXT CHARACTER
20846: BEQ WA,=CH$BL,SCN51 EXCLAMATION IF BLANK
20847: BEQ WA,=CH$HT,SCN51 EXCLAMATION IF HORIZONTAL TAB
20848: *
20849: * UNARY *
20850: *
20851: SCN50 MOV SCNOF,WA RECOVER STORED OFFSET
20852: MOV R$CIM,XL POINT TO LINE AGAIN
20853: PLC XL,WA POINT TO CURRENT CHAR
20854: BRN SCN39 MERGE WITH UNARY *
20855: *
20856: * HERE FOR ** AS SUBSTITUTE FOR EXCLAMATION
20857: *
20858: SCN51 MOV XR,SCNPT SAVE SCAN POINTER PAST 2ND *
20859: MOV XR,WA COPY SCAN POINTER
20860: BRN SCN37 MERGE WITH EXCLAMATION
20861: ENP END PROCEDURE SCANE
20862: EJC
20863: *
20864: * SCNGF -- SCAN GOTO FIELD
20865: *
20866: * SCNGF IS CALLED FROM CMPIL TO SCAN AND ANALYZE A GOTO
20867: * FIELD INCLUDING THE SURROUNDING BRACKETS OR PARENTHESES.
20868: * FOR A NORMAL GOTO, THE RESULT RETURNED IS EITHER A VRBLK
20869: * POINTER FOR A SIMPLE LABEL OPERAND, OR A POINTER TO AN
20870: * EXPRESSION TREE WITH A SPECIAL OUTER UNARY OPERATOR
20871: * (O$GOC). FOR A DIRECT GOTO, THE RESULT RETURNED IS A
20872: * POINTER TO AN EXPRESSION TREE WITH THE SPECIAL OUTER
20873: * UNARY OPERATOR O$GOD.
20874: *
20875: * JSR SCNGF CALL TO SCAN GOTO FIELD
20876: * (XR) RESULT (SEE ABOVE)
20877: * (XL,WA,WB,WC) DESTROYED
20878: *
20879: SCNGF PRC E,0 ENTRY POINT
20880: JSR SCANE SCAN INITIAL ELEMENT
20881: BEQ XL,=T$LPR,SCNG1 SKIP IF LEFT PAREN (NORMAL GOTO)
20882: BEQ XL,=T$LBR,SCNG2 SKIP IF LEFT BRACKET (DIRECT GOTO)
20883: ERB 234,SYNTAX ERROR. GOTO FIELD INCORRECT
20884: *
20885: * HERE FOR LEFT PAREN (NORMAL GOTO)
20886: *
20887: SCNG1 MOV =NUM01,WB SET EXPAN FLAG FOR NORMAL GOTO
20888: JSR EXPAN ANALYZE GOTO FIELD
20889: MOV =OPDVN,WA POINT TO OPDV FOR COMPLEX GOTO
20890: BLE XR,STATB,SCNG3 JUMP IF NOT IN STATIC (SGD15)
20891: BLO XR,STATE,SCNG4 JUMP TO EXIT IF SIMPLE LABEL NAME
20892: BRN SCNG3 COMPLEX GOTO - MERGE
20893: *
20894: * HERE FOR LEFT BRACKET (DIRECT GOTO)
20895: *
20896: SCNG2 MOV =NUM02,WB SET EXPAN FLAG FOR DIRECT GOTO
20897: JSR EXPAN SCAN GOTO FIELD
20898: MOV =OPDVD,WA SET OPDV POINTER FOR DIRECT GOTO
20899: EJC
20900: *
20901: * SCNGF (CONTINUED)
20902: *
20903: * MERGE HERE TO BUILD OUTER UNARY OPERATOR BLOCK
20904: *
20905: SCNG3 MOV WA,-(XS) STACK OPERATOR DV POINTER
20906: MOV XR,-(XS) STACK POINTER TO EXPRESSION TREE
20907: JSR EXPOP POP OPERATOR OFF
20908: MOV (XS)+,XR RELOAD NEW EXPRESSION TREE POINTER
20909: *
20910: * COMMON EXIT POINT
20911: *
20912: SCNG4 EXI RETURN TO CALLER
20913: ENP END PROCEDURE SCNGF
20914: EJC
20915: *
20916: * SETVR -- SET VRGET,VRSTO FIELDS OF VRBLK
20917: *
20918: * SETVR SETS THE PROPER VALUES IN THE VRGET AND VRSTO
20919: * FIELDS OF A VRBLK. IT IS CALLED WHENEVER TRBLKS ARE
20920: * ADDED OR SUBTRACTED (TRACE,STOPTR,INPUT,OUTPUT,DETACH)
20921: *
20922: * (XR) POINTER TO VRBLK
20923: * JSR SETVR CALL TO SET FIELDS
20924: * (XL,WA) DESTROYED
20925: *
20926: * NOTE THAT SETVR IGNORES THE CALL IF XR DOES NOT POINT
20927: * INTO THE STATIC REGION (I.E. IS SOME OTHER NAME BASE)
20928: *
20929: SETVR PRC E,0 ENTRY POINT
20930: BHI XR,STATE,SETV1 EXIT IF NOT NATURAL VARIABLE
20931: *
20932: * HERE IF WE HAVE A VRBLK
20933: *
20934: MOV XR,XL COPY VRBLK POINTER
20935: MOV =B$VRL,VRGET(XR) STORE NORMAL GET VALUE
20936: BEQ VRSTO(XR),=B$VRE,SETV1 SKIP IF PROTECTED VARIABLE
20937: MOV =B$VRS,VRSTO(XR) STORE NORMAL STORE VALUE
20938: MOV VRVAL(XL),XL POINT TO NEXT ENTRY ON CHAIN
20939: BNE (XL),=B$TRT,SETV1 JUMP IF END OF TRBLK CHAIN
20940: MOV =B$VRA,VRGET(XR) STORE TRAPPED ROUTINE ADDRESS
20941: MOV =B$VRV,VRSTO(XR) SET TRAPPED ROUTINE ADDRESS
20942: *
20943: * MERGE HERE TO EXIT TO CALLER
20944: *
20945: SETV1 EXI RETURN TO SETVR CALLER
20946: ENP END PROCEDURE SETVR
20947: EJC
20948: *
20949: * SORTA -- SORT ARRAY
20950: *
20951: * ROUTINE TO SORT AN ARRAY OR TABLE ON SAME BASIS AS IN
20952: * SITBOL. A TABLE IS CONVERTED TO AN ARRAY, LEAVING TWO
20953: * DIMENSIONAL ARRAYS AND VECTORS AS CASES TO BE CONSIDERED.
20954: * WHOLE ROWS OF ARRAYS ARE PERMUTED ACCORDING TO THE
20955: * ORDERING OF THE KEYS THEY CONTAIN, AND THE STRIDE
20956: * REFERRED TO, IS THE THE LENGTH OF A ROW. IT IS ONE
20957: * FOR A VECTOR.
20958: * THE SORT USED IS HEAPSORT, FUNDAMENTALS OF DATA STRUCTURE
20959: * HOROWITZ AND SAHNI, PITMAN 1977, PAGE 347.
20960: * IT IS AN ORDER N*LOG(N) ALGORITHM. IN ORDER
20961: * TO MAKE IT STABLE, COMPARANDS MAY NOT COMPARE EQUAL. THIS
20962: * IS ACHIEVED BY SORTING A COPY ARRAY (REFERRED TO AS THE
20963: * SORT ARRAY) CONTAINING AT ITS HIGH ADDRESS END, BYTE
20964: * OFFSETS TO THE ROWS TO BE SORTED HELD IN THE ORIGINAL
20965: * ARRAY (REFERRED TO AS THE KEY ARRAY). SORTC, THE
20966: * COMPARISON ROUTINE, ACCESSES THE KEYS THROUGH THESE
20967: * OFFSETS AND IN THE CASE OF EQUALITY, RESOLVES IT BY
20968: * COMPARING THE OFFSETS THEMSELVES. THE SORT PERMUTES THE
20969: * OFFSETS WHICH ARE THEN USED IN A FINAL OPERATION TO COPY
20970: * THE ACTUAL ITEMS INTO THE NEW ARRAY IN SORTED ORDER.
20971: * REFERENCES TO ZEROTH ITEM ARE TO NOTIONAL ITEM
20972: * PRECEDING FIRST ACTUAL ITEM.
20973: * REVERSE SORTING FOR RSORT IS DONE BY HAVING THE LESS THAN
20974: * TEST FOR KEYS EFFECTIVELY BE REPLACED BY A
20975: * GREATER THAN TEST.
20976: *
20977: * 1(XS) FIRST ARG - ARRAY OR TABLE
20978: * 0(XS) 2ND ARG - INDEX OR PDTYPE NAME
20979: * (WA) 0 , NON-ZERO FOR SORT , RSORT
20980: * JSR SORTA CALL TO SORT ARRAY
20981: * (XR) SORTED ARRAY
20982: * (XL,WA,WB,WC) DESTROYED
20983: EJC
20984: *
20985: * SORTA (CONTINUED)
20986: *
20987: SORTA PRC N,0 ENTRY POINT
20988: MOV WA,SRTSR SORT/RSORT INDICATOR
20989: MOV *NUM01,SRTST DEFAULT STRIDE OF 1
20990: ZER SRTOF DEFAULT ZERO OFFSET TO SORT KEY
20991: MOV =NULLS,SRTDF CLEAR DATATYPE FIELD NAME
20992: MOV (XS)+,R$SXR UNSTACK ARGUMENT 2
20993: MOV (XS)+,XR GET FIRST ARGUMENT
20994: JSR GTARR CONVERT TO ARRAY
20995: PPM SRT16 FAIL
20996: MOV XR,-(XS) STACK PTR TO RESULTING KEY ARRAY
20997: MOV XR,-(XS) ANOTHER COPY FOR COPYB
20998: JSR COPYB GET COPY ARRAY FOR SORTING INTO
20999: PPM CANT FAIL
21000: MOV XR,-(XS) STACK POINTER TO SORT ARRAY
21001: MOV R$SXR,XR GET SECOND ARG
21002: MOV 1(XS),XL GET PTR TO KEY ARRAY
21003: BNE (XL),=B$VCT,SRT02 JUMP IF ARBLK
21004: BEQ XR,=NULLS,SRT01 JUMP IF NULL SECOND ARG
21005: JSR GTNVR GET VRBLK PTR FOR IT
21006: ERR 257,ERRONEOUS 2ND ARG IN SORT/RSORT OF VECTOR
21007: MOV XR,SRTDF STORE DATATYPE FIELD NAME VRBLK
21008: *
21009: * COMPUTE N AND OFFSET TO ITEM A(0) IN VECTOR CASE
21010: *
21011: SRT01 MOV *VCLEN,WC OFFSET TO A(0)
21012: MOV *VCVLS,WB OFFSET TO FIRST ITEM
21013: MOV VCLEN(XL),WA GET BLOCK LENGTH
21014: SUB *VCSI$,WA GET NO. OF ENTRIES, N (IN BYTES)
21015: BRN SRT04 MERGE
21016: *
21017: * HERE FOR ARRAY
21018: *
21019: SRT02 LDI ARDIM(XL) GET POSSIBLE DIMENSION
21020: MFI WA CONVERT TO SHORT INTEGER
21021: WTB WA FURTHER CONVERT TO BAUS
21022: MOV *ARVLS,WB OFFSET TO FIRST VALUE IF ONE
21023: MOV *ARPRO,WC OFFSET BEFORE VALUES IF ONE DIM.
21024: BEQ ARNDM(XL),=NUM01,SRT04 JUMP IN FACT IF ONE DIM.
21025: BNE ARNDM(XL),=NUM02,SRT16 FAIL UNLESS TWO DIMENS
21026: LDI ARLB2(XL) GET LOWER BOUND 2 AS DEFAULT
21027: BEQ XR,=NULLS,SRT03 JUMP IF DEFAULT SECOND ARG
21028: JSR GTINT CONVERT TO INTEGER
21029: PPM SRT17 FAIL
21030: LDI ICVAL(XR) GET ACTUAL INTEGER VALUE
21031: EJC
21032: *
21033: * SORTA (CONTINUED)
21034: *
21035: * HERE WITH SORT COLUMN INDEX IN IA IN ARRAY CASE
21036: *
21037: SRT03 SBI ARLB2(XL) SUBTRACT LOW BOUND
21038: IOV SRT17 FAIL IF OVERFLOW
21039: ILT SRT17 FAIL IF BELOW LOW BOUND
21040: SBI ARDM2(XL) CHECK AGAINST DIMENSION
21041: IGE SRT17 FAIL IF TOO LARGE
21042: ADI ARDM2(XL) RESTORE VALUE
21043: MFI WA GET AS SMALL INTEGER
21044: WTB WA OFFSET WITHIN ROW TO KEY
21045: MOV WA,SRTOF KEEP OFFSET
21046: LDI ARDM2(XL) SECOND DIMENSION IS ROW LENGTH
21047: MFI WA CONVERT TO SHORT INTEGER
21048: MOV WA,XR COPY ROW LENGTH
21049: WTB WA CONVERT TO BYTES
21050: MOV WA,SRTST STORE AS STRIDE
21051: LDI ARDIM(XL) GET NUMBER OF ROWS
21052: MFI WA AS A SHORT INTEGER
21053: WTB WA CONVERT N TO BAUS
21054: MOV ARLEN(XL),WC OFFSET PAST ARRAY END
21055: SUB WA,WC ADJUST, GIVING SPACE FOR N OFFSETS
21056: DCA WC POINT TO A(0)
21057: MOV AROFS(XL),WB OFFSET TO WORD BEFORE FIRST ITEM
21058: ICA WB OFFSET TO FIRST ITEM
21059: *
21060: * SEPARATE PRE-PROCESSING FOR ARRAYS AND VECTORS DONE.
21061: * TO SIMPLIFY LATER KEY COMPARISONS, REMOVAL OF ANY TRBLK
21062: * TRAP BLOCKS FROM ENTRIES IN KEY ARRAY IS EFFECTED.
21063: *
21064: * (XL) = 1(XS) = POINTER TO KEY ARRAY
21065: * (XS) = POINTER TO SORT ARRAY
21066: * WA = NUMBER OF ITEMS, N (CONVERTED TO BYTES).
21067: * WB = OFFSET TO FIRST ITEM OF ARRAYS.
21068: * WC = OFFSET TO A(0)
21069: *
21070: SRT04 BLE WA,*NUM01,SRT15 RETURN IF ONLY A SINGLE ITEM
21071: MOV WA,SRTSN STORE NUMBER OF ITEMS (IN BAUS)
21072: MOV WC,SRTSO STORE OFFSET TO A(0)
21073: MOV ARLEN(XL),WC LENGTH OF ARRAY OR VEC (=VCLEN)
21074: ADD XL,WC POINT PAST END OF ARRAY OR VECTOR
21075: MOV WB,SRTSF STORE OFFSET TO FIRST ROW
21076: ADD WB,XL POINT TO FIRST ITEM IN KEY ARRAY
21077: *
21078: * LOOP THROUGH ARRAY
21079: *
21080: SRT05 MOV (XL),XR GET AN ENTRY
21081: *
21082: * HUNT ALONG TRBLK CHAIN
21083: *
21084: SRT06 BNE (XR),=B$TRT,SRT07 JUMP OUT IF NOT TRBLK
21085: MOV TRVAL(XR),XR GET VALUE FIELD
21086: BRN SRT06 LOOP
21087: EJC
21088: *
21089: * SORTA (CONTINUED)
21090: *
21091: * XR IS VALUE FROM END OF CHAIN
21092: *
21093: SRT07 MOV XR,(XL)+ STORE AS ARRAY ENTRY
21094: BLT XL,WC,SRT05 LOOP IF NOT DONE
21095: MOV (XS),XL GET ADRS OF SORT ARRAY
21096: MOV SRTSF,XR INITIAL OFFSET TO FIRST KEY
21097: MOV SRTST,WB GET STRIDE
21098: ADD SRTSO,XL OFFSET TO A(0)
21099: ICA XL POINT TO A(1)
21100: MOV SRTSN,WC GET N
21101: BTW WC CONVERT FROM BYTES
21102: MOV WC,SRTNR STORE AS ROW COUNT
21103: LCT WC,WC LOOP COUNTER
21104: *
21105: * STORE KEY OFFSETS AT TOP OF SORT ARRAY
21106: *
21107: SRT08 MOV XR,(XL)+ STORE AN OFFSET
21108: ADD WB,XR BUMP OFFSET BY STRIDE
21109: BCT WC,SRT08 LOOP THROUGH ROWS
21110: *
21111: * PERFORM THE SORT ON OFFSETS IN SORT ARRAY.
21112: *
21113: * (SRTSN) NUMBER OF ITEMS TO SORT, N (BYTES)
21114: * (SRTSO) OFFSET TO A(0)
21115: *
21116: SRT09 MOV SRTSN,WA GET N
21117: MOV SRTNR,WC GET NUMBER OF ROWS
21118: RSH WC,1 I = N / 2 (WC=I, INDEX INTO ARRAY)
21119: WTB WC CONVERT BACK TO BYTES
21120: *
21121: * LOOP TO FORM INITIAL HEAP
21122: *
21123: SRT10 JSR SORTH SORTH(I,N)
21124: DCA WC I = I - 1
21125: BNZ WC,SRT10 LOOP IF I GT 0
21126: MOV WA,WC I = N
21127: *
21128: * SORTING LOOP. AT THIS POINT, A(1) IS THE LARGEST
21129: * ITEM, SINCE ALGORITHM INITIALISES IT AS, AND THEN MAINTAI
21130: * IT AS, ROOT OF TREE.
21131: *
21132: SRT11 DCA WC I = I - 1 (N - 1 INITIALLY)
21133: BZE WC,SRT12 JUMP IF DONE
21134: MOV (XS),XR GET SORT ARRAY ADDRESS
21135: ADD SRTSO,XR POINT TO A(0)
21136: MOV XR,XL A(0) ADDRESS
21137: ADD WC,XL A(I) ADDRESS
21138: MOV 1(XL),WB COPY A(I+1)
21139: MOV 1(XR),1(XL) MOVE A(1) TO A(I+1)
21140: MOV WB,1(XR) COMPLETE EXCHANGE OF A(1), A(I+1)
21141: MOV WC,WA N = I FOR SORTH
21142: MOV *NUM01,WC I = 1 FOR SORTH
21143: JSR SORTH SORTH(1,N)
21144: MOV WA,WC RESTORE WC
21145: BRN SRT11 LOOP
21146: EJC
21147: *
21148: * SORTA (CONTINUED)
21149: *
21150: * OFFSETS HAVE BEEN PERMUTED INTO REQUIRED ORDER BY SORT.
21151: * COPY ARRAY ELEMENTS OVER THEM.
21152: *
21153: SRT12 MOV (XS),XL BASE ADRS OF KEY ARRAY
21154: MOV XL,WC COPY IT
21155: ADD SRTSO,WC OFFSET OF A(0)
21156: ADD SRTSF,XL ADRS OF FIRST ROW OF SORT ARRAY
21157: MOV SRTST,WB GET STRIDE
21158: BTW WB CONVERT TO WORDS
21159: *
21160: * COPYING LOOP FOR SUCCESSIVE ITEMS. SORTED OFFSETS ARE
21161: * HELD AT END OF SORT ARRAY.
21162: *
21163: SRT13 ICA WC ADRS OF NEXT OF SORTED OFFSETS
21164: MOV WC,XR COPY IT FOR ACCESS
21165: MOV (XR),XR GET OFFSET
21166: ADD 1(XS),XR ADD KEY ARRAY BASE ADRS
21167: LCT WA,WB GET COUNT OF WORDS IN ROW
21168: *
21169: * COPY A COMPLETE ROW
21170: *
21171: SRT14 MOV (XR)+,(XL)+ MOVE A WORD
21172: BCT WA,SRT14 LOOP
21173: DCV SRTNR DECREMENT ROW COUNT
21174: BNZ SRTNR,SRT13 REPEAT TILL ALL ROWS DONE
21175: *
21176: * RETURN POINT
21177: *
21178: SRT15 MOV (XS)+,XR POP RESULT ARRAY PTR
21179: ICA XS POP KEY ARRAY PTR
21180: ZER R$SXL CLEAR JUNK
21181: ZER R$SXR CLEAR JUNK
21182: EXI RETURN
21183: *
21184: * ERROR POINT
21185: *
21186: SRT16 ERB 256,SORT/RSORT 1ST ARG NOT SUITABLE ARRAY OR TABLE
21187: SRT17 ERB 258,SORT/RSORT 2ND ARG OUT OF RANGE OR NON-INTEGER
21188: ENP END PROCUDURE SORTA
21189: EJC
21190: *
21191: * SORTC -- COMPARE SORT KEYS
21192: *
21193: * COMPARE TWO SORT KEYS GIVEN THEIR OFFSETS. IF
21194: * EQUAL, COMPARE KEY OFFSETS TO GIVE STABLE SORT.
21195: * NOTE THAT IF SRTSR IS NON-ZERO (REQUEST FOR REVERSE
21196: * SORT), THE QUOTED RETURNS ARE INVERTED.
21197: * FOR OBJECTS OF DIFFERING DATATYPES, THE ENTRY POINT
21198: * IDENTIFICATIONS ARE COMPARED.
21199: *
21200: * (XL) BASE ADRS FOR KEYS
21201: * (WA) OFFSET TO KEY 1 ITEM
21202: * (WB) OFFSET TO KEY 2 ITEM
21203: * (SRTSR) ZERO/NON-ZERO FOR SORT/RSORT
21204: * (SRTOF) OFFSET WITHIN ROW TO COMPARANDS
21205: * JSR SORTC CALL TO COMPARE KEYS
21206: * PPM LOC KEY1 LESS THAN KEY2
21207: * NORMAL RETURN, KEY1 GT THAN KEY2
21208: * (XL,XR,WA,WB) DESTROYED
21209: *
21210: SORTC PRC E,1 ENTRY POINT
21211: MOV WA,SRTS1 SAVE OFFSET 1
21212: MOV WB,SRTS2 SAVE OFFSET 2
21213: MOV WC,SRTSC SAVE WC
21214: ADD SRTOF,XL ADD OFFSET TO COMPARAND FIELD
21215: MOV XL,XR COPY BASE + OFFSET
21216: ADD WA,XL ADD KEY1 OFFSET
21217: ADD WB,XR ADD KEY2 OFFSET
21218: MOV (XL),XL GET KEY1
21219: MOV (XR),XR GET KEY2
21220: BNE SRTDF,=NULLS,SRC11 JUMP IF DATATYPE FIELD NAME USED
21221: EJC
21222: *
21223: * SORTC (CONTINUED)
21224: *
21225: * MERGE AFTER DEALING WITH FIELD NAME. TRY FOR STRINGS.
21226: *
21227: SRC01 MOV (XL),WC GET TYPE CODE
21228: BNE WC,(XR),SRC02 SKIP IF NOT SAME DATATYPE
21229: BEQ WC,=B$SCL,SRC09 JUMP IF BOTH STRINGS
21230: *
21231: * NOW TRY FOR NUMERIC
21232: *
21233: SRC02 MOV XL,R$SXL KEEP ARG1
21234: MOV XR,R$SXR KEEP ARG2
21235: MOV XL,-(XS) STACK
21236: MOV XR,-(XS) ARGS
21237: JSR ACOMP COMPARE OBJECTS
21238: PPM SRC10 NOT NUMERIC
21239: PPM SRC10 NOT NUMERIC
21240: PPM SRC03 KEY1 LESS
21241: PPM SRC08 KEYS EQUAL
21242: PPM SRC05 KEY1 GREATER
21243: *
21244: * RETURN IF KEY1 SMALLER (SORT), GREATER (RSORT)
21245: *
21246: SRC03 BNZ SRTSR,SRC06 JUMP IF RSORT
21247: *
21248: SRC04 MOV SRTSC,WC RESTORE WC
21249: EXI 1 RETURN
21250: *
21251: * RETURN IF KEY1 GREATER (SORT), SMALLER (RSORT)
21252: *
21253: SRC05 BNZ SRTSR,SRC04 JUMP IF RSORT
21254: *
21255: SRC06 MOV SRTSC,WC RESTORE WC
21256: EXI RETURN
21257: *
21258: * KEYS ARE OF SAME DATATYPE
21259: *
21260: SRC07 BLT XL,XR,SRC03 ITEM FIRST CREATED IS LESS
21261: BGT XL,XR,SRC05 ADDRESSES RISE IN ORDER OF CREATION
21262: *
21263: * DROP THROUGH OR MERGE FOR IDENTICAL OR EQUAL OBJECTS
21264: *
21265: SRC08 BLT SRTS1,SRTS2,SRC04 TEST OFFSETS OR KEY ADDRSS INSTEAD
21266: BRN SRC06 OFFSET 1 GREATER
21267: EJC
21268: *
21269: * SORTC (CONTINUED)
21270: *
21271: * STRINGS
21272: *
21273: SRC09 MOV XL,-(XS) STACK
21274: MOV XR,-(XS) ARGS
21275: JSR LCOMP COMPARE OBJECTS
21276: PPM CANT
21277: PPM FAIL
21278: PPM SRC03 KEY1 LESS
21279: PPM SRC08 KEYS EQUAL
21280: PPM SRC05 KEY1 GREATER
21281: *
21282: * ARITHMETIC COMPARISON FAILED - RECOVER ARGS
21283: *
21284: SRC10 MOV R$SXL,XL GET ARG1
21285: MOV R$SXR,XR GET ARG2
21286: MOV (XL),WC GET TYPE OF KEY1
21287: BEQ WC,(XR),SRC07 JUMP IF KEYS OF SAME TYPE
21288: MOV WC,XL GET BLOCK TYPE WORD
21289: MOV (XR),XR GET BLOCK TYPE WORD
21290: LEI XL ENTRY POINT ID FOR KEY1
21291: LEI XR ENTRY POINT ID FOR KEY2
21292: BGT XL,XR,SRC05 JUMP IF KEY1 GT KEY2
21293: BRN SRC03 KEY1 LT KEY2
21294: *
21295: * DATATYPE FIELD NAME USED
21296: *
21297: SRC11 JSR SORTF CALL ROUTINE TO FIND FIELD 1
21298: MOV XL,-(XS) STACK ITEM POINTER
21299: MOV XR,XL GET KEY2
21300: JSR SORTF FIND FIELD 2
21301: MOV XL,XR PLACE AS KEY2
21302: MOV (XS)+,XL RECOVER KEY1
21303: BRN SRC01 MERGE
21304: ENP PROCEDURE SORTC
21305: EJC
21306: *
21307: * SORTF -- FIND FIELD FOR SORTC
21308: *
21309: * ROUTINE USED BY SORTC TO OBTAIN ITEM CORRESPONDING
21310: * TO A GIVEN FIELD NAME, IF THIS EXISTS, IN A PROGRAMMER
21311: * DEFINED OBJECT PASSED AS ARGUMENT.
21312: * IF SUCH A MATCH OCCURS, RECORD IS KEPT OF DATATYPE
21313: * NAME, FIELD NAME AND OFFSET TO FIELD IN ORDER TO
21314: * SHORT-CIRCUIT LATER SEARCHES ON SAME TYPE. NOTE THAT
21315: * DFBLKS ARE STORED IN STATIC AND HENCE CANNOT BE MOVED.
21316: *
21317: * (SRTDF) VRBLK POINTER OF FIELD NAME
21318: * (XL) POSSIBLE PDBLK POINTER
21319: * JSR SORTF CALL TO SEARCH FOR FIELD NAME
21320: * (XL) ITEM FOUND OR ORIGINAL PDBLK PTR
21321: * (WC) DESTROYED
21322: *
21323: SORTF PRC E,0 ENTRY POINT
21324: BNE (XL),=B$PDT,SRTF3 RETURN IF NOT PDBLK
21325: MOV XR,-(XS) KEEP XR
21326: MOV SRTFD,XR GET POSSIBLE FORMER DFBLK PTR
21327: BZE XR,SRTF4 JUMP IF NOT
21328: BNE XR,PDDFP(XL),SRTF4 JUMP IF NOT RIGHT DATATYPE
21329: BNE SRTDF,SRTFF,SRTF4 JUMP IF NOT RIGHT FIELD NAME
21330: ADD SRTFO,XL ADD OFFSET TO REQUIRED FIELD
21331: *
21332: * HERE WITH XL POINTING TO FOUND FIELD
21333: *
21334: SRTF1 MOV (XL),XL GET ITEM FROM FIELD
21335: *
21336: * RETURN POINT
21337: *
21338: SRTF2 MOV (XS)+,XR RESTORE XR
21339: *
21340: SRTF3 EXI RETURN
21341: EJC
21342: *
21343: * SORTF (CONTINUED)
21344: *
21345: * CONDUCT A SEARCH
21346: *
21347: SRTF4 MOV XL,XR COPY ORIGINAL POINTER
21348: MOV PDDFP(XR),XR POINT TO DFBLK
21349: MOV XR,SRTFD KEEP A COPY
21350: MOV FARGS(XR),WC GET NUMBER OF FIELDS
21351: WTB WC CONVERT TO BYTES
21352: ADD DFLEN(XR),XR POINT PAST LAST FIELD
21353: *
21354: * LOOP TO FIND NAME IN PDFBLK
21355: *
21356: SRTF5 DCA WC COUNT DOWN
21357: DCA XR POINT IN FRONT
21358: BEQ (XR),SRTDF,SRTF6 SKIP OUT IF FOUND
21359: BNZ WC,SRTF5 LOOP
21360: BRN SRTF2 RETURN - NOT FOUND
21361: *
21362: * FOUND
21363: *
21364: SRTF6 MOV (XR),SRTFF KEEP FIELD NAME PTR
21365: ADD *PDFLD,WC ADD OFFSET TO FIRST FIELD
21366: MOV WC,SRTFO STORE AS FIELD OFFSET
21367: ADD WC,XL POINT TO FIELD
21368: BRN SRTF1 RETURN
21369: ENP PROCEDURE SORTF
21370: EJC
21371: *
21372: * SORTH -- HEAP ROUTINE FOR SORTA
21373: *
21374: * THIS ROUTINE CONSTRUCTS A HEAP FROM ELEMENTS OF ARRAY, A.
21375: * IN THIS APPLICATION, THE ELEMENTS ARE OFFSETS TO KEYS IN
21376: * A KEY ARRAY.
21377: *
21378: * (XS) POINTER TO SORT ARRAY BASE
21379: * 1(XS) POINTER TO KEY ARRAY BASE
21380: * (WA) MAX ARRAY INDEX, N (IN BYTES)
21381: * (WC) OFFSET J IN A TO ROOT (IN *1 TO *N)
21382: * JSR SORTH CALL SORTH(J,N) TO MAKE HEAP
21383: * (XL,XR,WB) DESTROYED
21384: *
21385: SORTH PRC N,0 ENTRY POINT
21386: MOV WA,SRTSN SAVE N
21387: MOV WC,SRTWC KEEP WC
21388: MOV (XS),XL SORT ARRAY BASE ADRS
21389: ADD SRTSO,XL ADD OFFSET TO A(0)
21390: ADD WC,XL POINT TO A(J)
21391: MOV (XL),SRTRT GET OFFSET TO ROOT
21392: ADD WC,WC DOUBLE J - CANT EXCEED N
21393: *
21394: * LOOP TO MOVE DOWN TREE USING DOUBLED INDEX J
21395: *
21396: SRH01 BGT WC,SRTSN,SRH03 DONE IF J GT N
21397: BEQ WC,SRTSN,SRH02 SKIP IF J EQUALS N
21398: MOV (XS),XR SORT ARRAY BASE ADRS
21399: MOV 1(XS),XL KEY ARRAY BASE ADRS
21400: ADD SRTSO,XR POINT TO A(0)
21401: ADD WC,XR ADRS OF A(J)
21402: MOV 1(XR),WA GET A(J+1)
21403: MOV (XR),WB GET A(J)
21404: *
21405: * COMPARE SONS. (WA) RIGHT SON, (WB) LEFT SON
21406: *
21407: JSR SORTC COMPARE KEYS - LT(A(J+1),A(J))
21408: PPM SRH02 A(J+1) LT A(J)
21409: ICA WC POINT TO GREATER SON, A(J+1)
21410: EJC
21411: *
21412: * SORTH (CONTINUED)
21413: *
21414: * COMPARE ROOT WITH GREATER SON
21415: *
21416: SRH02 MOV 1(XS),XL KEY ARRAY BASE ADRS
21417: MOV (XS),XR GET SORT ARRAY ADDRESS
21418: ADD SRTSO,XR ADRS OF A(0)
21419: MOV XR,WB COPY THIS ADRS
21420: ADD WC,XR ADRS OF GREATER SON, A(J)
21421: MOV (XR),WA GET A(J)
21422: MOV WB,XR POINT BACK TO A(0)
21423: MOV SRTRT,WB GET ROOT
21424: JSR SORTC COMPARE THEM - LT(A(J),ROOT)
21425: PPM SRH03 FATHER EXCEEDS SONS - DONE
21426: MOV (XS),XR GET SORT ARRAY ADRS
21427: ADD SRTSO,XR POINT TO A(0)
21428: MOV XR,XL COPY IT
21429: MOV WC,WA COPY J
21430: BTW WC CONVERT TO WORDS
21431: RSH WC,1 GET J/2
21432: WTB WC CONVERT BACK TO BYTES
21433: ADD WA,XL POINT TO A(J)
21434: ADD WC,XR ADRS OF A(J/2)
21435: MOV (XL),(XR) A(J/2) = A(J)
21436: MOV WA,WC RECOVER J
21437: AOV WC,WC,SRH03 J = J*2. DONE IF TOO BIG
21438: BRN SRH01 LOOP
21439: *
21440: * FINISH BY COPYING ROOT OFFSET BACK INTO ARRAY
21441: *
21442: SRH03 BTW WC CONVERT TO WORDS
21443: RSH WC,1 J = J/2
21444: WTB WC CONVERT BACK TO BYTES
21445: MOV (XS),XR SORT ARRAY ADRS
21446: ADD SRTSO,XR ADRS OF A(0)
21447: ADD WC,XR ADRS OF A(J/2)
21448: MOV SRTRT,(XR) A(J/2) = ROOT
21449: MOV SRTSN,WA RESTORE WA
21450: MOV SRTWC,WC RESTORE WC
21451: EXI RETURN
21452: ENP END PROCEDURE SORTH
21453: EJC
21454: EJC
21455: *
21456: * TFIND -- LOCATE TABLE ELEMENT
21457: *
21458: * (XR) SUBSCRIPT VALUE FOR ELEMENT
21459: * (XL) POINTER TO TABLE
21460: * (WB) ZERO BY VALUE, NON-ZERO BY NAME
21461: * JSR TFIND CALL TO LOCATE ELEMENT
21462: * PPM LOC TRANSFER LOCATION IF ACCESS FAILS
21463: * (XR) ELEMENT VALUE (IF BY VALUE)
21464: * (XR) DESTROYED (IF BY NAME)
21465: * (XL,WA) TEBLK NAME (IF BY NAME)
21466: * (XL,WA) DESTROYED (IF BY VALUE)
21467: * (WC,RA) DESTROYED
21468: *
21469: * NOTE THAT IF A CALL BY VALUE SPECIFIES A NON-EXISTENT
21470: * SUBSCRIPT, NULL IS RETURNED WITHOUT BUILDING A NEW TEBLK.
21471: *
21472: TFIND PRC E,1 ENTRY POINT
21473: MOV WB,-(XS) SAVE NAME/VALUE INDICATOR
21474: MOV XR,-(XS) SAVE SUBSCRIPT VALUE
21475: MOV XL,-(XS) SAVE TABLE POINTER
21476: MOV TBLEN(XL),WA LOAD LENGTH OF TBBLK
21477: BTW WA CONVERT TO WORD COUNT
21478: SUB =TBBUK,WA GET NUMBER OF BUCKETS
21479: MTI WA CONVERT TO INTEGER VALUE
21480: STI TFNSI SAVE FOR LATER
21481: MOV (XR),XL LOAD FIRST WORD OF SUBSCRIPT
21482: LEI XL LOAD BLOCK ENTRY ID (BL$XX)
21483: BSW XL,BL$$D,TFN00 SWITCH ON BLOCK TYPE
21484: IFF BL$IC,TFN02 JUMP IF INTEGER
21485: IFF BL$RC,TFN02 REAL
21486: IFF BL$P0,TFN03 JUMP IF PATTERN
21487: IFF BL$P1,TFN03 JUMP IF PATTERN
21488: IFF BL$P2,TFN03 JUMP IF PATTERN
21489: IFF BL$NM,TFN04 JUMP IF NAME
21490: IFF BL$SC,TFN05 JUMP IF STRING
21491: ESW END SWITCH ON BLOCK TYPE
21492: *
21493: * HERE FOR BLOCKS FOR WHICH WE USE THE SECOND WORD OF THE
21494: * BLOCK AS THE HASH SOURCE (SEE BLOCK FORMATS FOR DETAILS).
21495: *
21496: TFN00 MOV 1(XR),WA LOAD SECOND WORD
21497: *
21498: * MERGE HERE WITH ONE WORD HASH SOURCE IN WA
21499: *
21500: TFN01 MTI WA CONVERT TO INTEGER
21501: BRN TFN06 JUMP TO MERGE
21502: EJC
21503: *
21504: * TFIND (CONTINUED)
21505: *
21506: * HERE FOR INTEGER OR REAL
21507: *
21508: TFN02 LDI 1(XR) LOAD VALUE AS HASH SOURCE
21509: IGE TFN06 OK IF POSITIVE OR ZERO
21510: NGI MAKE POSITIVE
21511: IOV TFN06 CLEAR POSSIBLE OVERFLOW
21512: BRN TFN06 MERGE
21513: *
21514: * FOR PATTERN, USE FIRST WORD (PCODE) AS SOURCE
21515: *
21516: TFN03 MOV (XR),WA LOAD FIRST WORD AS HASH SOURCE
21517: BRN TFN01 MERGE BACK
21518: *
21519: * FOR NAME, USE OFFSET AS HASH SOURCE
21520: *
21521: TFN04 MOV NMOFS(XR),WA LOAD OFFSET AS HASH SOURCE
21522: BRN TFN01 MERGE BACK
21523: *
21524: * HERE FOR STRING
21525: *
21526: TFN05 JSR HASHS CALL ROUTINE TO COMPUTE HASH
21527: *
21528: * MERGE HERE WITH HASH SOURCE IN (IA)
21529: *
21530: TFN06 RMI TFNSI COMPUTE HASH INDEX BY REMAINDERING
21531: MFI WC GET AS ONE WORD INTEGER
21532: WTB WC CONVERT TO BYTE OFFSET
21533: MOV (XS),XL GET TABLE PTR AGAIN
21534: ADD WC,XL POINT TO PROPER BUCKET
21535: MOV TBBUK(XL),XR LOAD FIRST TEBLK POINTER
21536: BEQ XR,(XS),TFN10 JUMP IF NO TEBLKS ON CHAIN
21537: *
21538: * LOOP THROUGH TEBLKS ON HASH CHAIN
21539: *
21540: TFN07 MOV XR,WB SAVE TEBLK POINTER
21541: MOV TESUB(XR),XR LOAD SUBSCRIPT VALUE
21542: MOV 1(XS),XL LOAD INPUT ARGUMENT SUBSCRIPT VAL
21543: JSR IDENT COMPARE THEM
21544: PPM TFN08 JUMP IF EQUAL (IDENT)
21545: *
21546: * HERE IF NO MATCH WITH THAT TEBLK
21547: *
21548: MOV WB,XL RESTORE TEBLK POINTER
21549: MOV TENXT(XL),XR POINT TO NEXT TEBLK ON CHAIN
21550: BNE XR,(XS),TFN07 JUMP IF THERE IS ONE
21551: *
21552: * HERE IF NO MATCH WITH ANY TEBLK ON CHAIN
21553: *
21554: MOV *TENXT,WC SET OFFSET TO LINK FIELD (XL BASE)
21555: BRN TFN11 JUMP TO MERGE
21556: EJC
21557: *
21558: * TFIND (CONTINUED)
21559: *
21560: * HERE WE HAVE FOUND A MATCHING ELEMENT
21561: *
21562: TFN08 MOV WB,XL RESTORE TEBLK POINTER
21563: MOV *TEVAL,WA SET TEBLK NAME OFFSET
21564: MOV 2(XS),WB RESTORE NAME/VALUE INDICATOR
21565: BNZ WB,TFN09 JUMP IF CALLED BY NAME
21566: JSR ACESS ELSE GET VALUE
21567: PPM TFN12 JUMP IF REFERENCE FAILS
21568: ZER WB RESTORE NAME/VALUE INDICATOR
21569: *
21570: * COMMON EXIT FOR ENTRY FOUND
21571: *
21572: TFN09 ADD *NUM03,XS POP STACK ENTRIES
21573: EXI RETURN TO TFIND CALLER
21574: *
21575: * HERE IF NO TEBLKS ON THE HASH CHAIN
21576: *
21577: TFN10 ADD *TBBUK,WC GET OFFSET TO BUCKET PTR
21578: MOV (XS),XL SET TBBLK PTR AS BASE
21579: *
21580: * MERGE HERE WITH (XL,WC) BASE,OFFSET OF FINAL LINK
21581: *
21582: TFN11 MOV (XS),XR TBBLK POINTER
21583: MOV TBINV(XR),XR LOAD DEFAULT VALUE IN CASE
21584: MOV 2(XS),WB LOAD NAME/VALUE INDICATOR
21585: BZE WB,TFN09 EXIT WITH DEFAULT IF VALUE CALL
21586: *
21587: * HERE WE MUST BUILD A NEW TEBLK
21588: *
21589: MOV *TESI$,WA SET SIZE OF TEBLK
21590: JSR ALLOC ALLOCATE TEBLK
21591: ADD WC,XL POINT TO HASH LINK
21592: MOV XR,(XL) LINK NEW TEBLK AT END OF CHAIN
21593: MOV =B$TET,(XR) STORE TYPE WORD
21594: MOV =NULLS,TEVAL(XR) SET NULL AS INITIAL VALUE
21595: MOV (XS)+,TENXT(XR) SET TBBLK PTR TO MARK END OF CHAIN
21596: MOV (XS)+,TESUB(XR) STORE SUBSCRIPT VALUE
21597: ICA XS POP PAST NAME/VALUE INDICATOR
21598: MOV XR,XL COPY TEBLK POINTER (NAME BASE)
21599: MOV *TEVAL,WA SET OFFSET
21600: EXI RETURN TO CALLER WITH NEW TEBLK
21601: *
21602: * ACESS FAIL RETURN
21603: *
21604: TFN12 EXI 1 ALTERNATIVE RETURN
21605: ENP END PROCEDURE TFIND
21606: EJC
21607: *
21608: * TRACE -- SET/RESET A TRACE ASSOCIATION
21609: *
21610: * THIS PROCEDURE IS SHARED BY TRACE AND STOPTR TO
21611: * EITHER INITIATE OR STOP A TRACE RESPECTIVELY.
21612: *
21613: * (XL) TRBLK PTR (TRACE) OR ZERO (STOPTR)
21614: * 1(XS) FIRST ARGUMENT (NAME)
21615: * 0(XS) SECOND ARGUMENT (TRACE TYPE)
21616: * JSR TRACE CALL TO SET/RESET TRACE
21617: * PPM LOC TRANSFER LOC IF 1ST ARG IS BAD NAME
21618: * PPM LOC TRANSFER LOC IF 2ND ARG IS BAD TYPE
21619: * (XS) POPPED
21620: * (XL,XR,WA,WB,WC,IA) DESTROYED
21621: *
21622: TRACE PRC N,2 ENTRY POINT
21623: JSR GTSTG GET TRACE TYPE STRING
21624: PPM TRC15 JUMP IF NOT STRING
21625: PLC XR ELSE POINT TO STRING
21626: LCH WA,(XR) LOAD FIRST CHARACTER
21627: FLC WA FOLD TO UPPER CASE
21628: MOV (XS),XR LOAD NAME ARGUMENT
21629: MOV XL,(XS) STACK TRBLK PTR OR ZERO
21630: MOV =TRTAC,WC SET TRTYP FOR ACCESS TRACE
21631: BEQ WA,=CH$LA,TRC10 JUMP IF A (ACCESS)
21632: MOV =TRTVL,WC SET TRTYP FOR VALUE TRACE
21633: BEQ WA,=CH$LV,TRC10 JUMP IF V (VALUE)
21634: BZE WA,TRC10 JUMP IF BLANK (VALUE)
21635: *
21636: * HERE FOR L,K,F,C,R
21637: *
21638: BEQ WA,=CH$LF,TRC01 JUMP IF F (FUNCTION)
21639: BEQ WA,=CH$LR,TRC01 JUMP IF R (RETURN)
21640: BEQ WA,=CH$LL,TRC03 JUMP IF L (LABEL)
21641: BEQ WA,=CH$LK,TRC06 JUMP IF K (KEYWORD)
21642: BNE WA,=CH$LC,TRC15 ELSE ERROR IF NOT C (CALL)
21643: *
21644: * HERE FOR F,C,R
21645: *
21646: TRC01 JSR GTNVR POINT TO VRBLK FOR NAME
21647: PPM TRC16 JUMP IF BAD NAME
21648: ICA XS POP STACK
21649: MOV VRFNC(XR),XR POINT TO FUNCTION BLOCK
21650: BNE (XR),=B$PFC,TRC17 ERROR IF NOT PROGRAM FUNCTION
21651: BEQ WA,=CH$LR,TRC02 JUMP IF R (RETURN)
21652: EJC
21653: *
21654: * TRACE (CONTINUED)
21655: *
21656: * HERE FOR F,C TO SET/RESET CALL TRACE
21657: *
21658: MOV XL,PFCTR(XR) SET/RESET CALL TRACE
21659: BEQ WA,=CH$LC,EXNUL EXIT WITH NULL IF C (CALL)
21660: *
21661: * HERE FOR F,R TO SET/RESET RETURN TRACE
21662: *
21663: TRC02 MOV XL,PFRTR(XR) SET/RESET RETURN TRACE
21664: EXI RETURN
21665: *
21666: * HERE FOR L TO SET/RESET LABEL TRACE
21667: *
21668: TRC03 JSR GTNVR POINT TO VRBLK
21669: PPM TRC16 JUMP IF BAD NAME
21670: MOV VRLBL(XR),XL LOAD LABEL POINTER
21671: BNE (XL),=B$TRT,TRC04 JUMP IF NO OLD TRACE
21672: MOV TRLBL(XL),XL ELSE DELETE OLD TRACE ASSOCIATION
21673: *
21674: * HERE WITH OLD LABEL TRACE ASSOCIATION DELETED
21675: *
21676: TRC04 BEQ XL,=STNDL,TRC16 ERROR IF UNDEFINED LABEL
21677: MOV (XS)+,WB GET TRBLK PTR AGAIN
21678: BZE WB,TRC05 JUMP IF STOPTR CASE
21679: MOV WB,VRLBL(XR) ELSE SET NEW TRBLK POINTER
21680: MOV =B$VRT,VRTRA(XR) SET LABEL TRACE ROUTINE ADDRESS
21681: MOV WB,XR COPY TRBLK POINTER
21682: MOV XL,TRLBL(XR) STORE REAL LABEL IN TRBLK
21683: EXI RETURN
21684: *
21685: * HERE FOR STOPTR CASE FOR LABEL
21686: *
21687: TRC05 MOV XL,VRLBL(XR) STORE LABEL PTR BACK IN VRBLK
21688: MOV =B$VRG,VRTRA(XR) STORE NORMAL TRANSFER ADDRESS
21689: EXI RETURN
21690: EJC
21691: *
21692: * TRACE (CONTINUED)
21693: *
21694: * HERE FOR K (KEYWORD)
21695: *
21696: TRC06 JSR GTNVR POINT TO VRBLK
21697: PPM TRC16 ERROR IF NOT NATURAL VAR
21698: BNZ VRLEN(XR),TRC16 ERROR IF NOT SYSTEM VAR
21699: ICA XS POP STACK
21700: BZE XL,TRC07 JUMP IF STOPTR CASE
21701: MOV XR,TRKVR(XL) STORE VRBLK PTR IN TRBLK FOR KTREX
21702: *
21703: * MERGE HERE WITH TRBLK SET UP IN WB (OR ZERO)
21704: *
21705: TRC07 MOV VRSVP(XR),XR POINT TO SVBLK
21706: BEQ XR,=V$ERT,TRC08 JUMP IF ERRTYPE
21707: BEQ XR,=V$STC,TRC09 JUMP IF STCOUNT
21708: BNE XR,=V$FNC,TRC17 ELSE ERROR IF NOT FNCLEVEL
21709: *
21710: * FNCLEVEL
21711: *
21712: MOV XL,R$FNC SET/RESET FNCLEVEL TRACE
21713: EXI RETURN
21714: *
21715: * ERRTYPE
21716: *
21717: TRC08 MOV XL,R$ERT SET/RESET ERRTYPE TRACE
21718: EXI RETURN
21719: *
21720: * STCOUNT
21721: *
21722: TRC09 MOV XL,R$STC SET/RESET STCOUNT TRACE
21723: EXI RETURN
21724: EJC
21725: *
21726: * TRACE (CONTINUED)
21727: *
21728: * A,V MERGE HERE WITH TRTYP VALUE IN WC
21729: *
21730: TRC10 JSR GTVAR LOCATE VARIABLE
21731: PPM TRC16 ERROR IF NOT APPROPRIATE NAME
21732: MOV (XS)+,WB GET NEW TRBLK PTR AGAIN
21733: ADD XL,WA POINT TO VARIABLE LOCATION
21734: MOV WA,XR COPY VARIABLE POINTER
21735: *
21736: * LOOP TO SEARCH TRBLK CHAIN
21737: *
21738: TRC11 MOV (XR),XL POINT TO NEXT ENTRY
21739: BNE (XL),=B$TRT,TRC13 JUMP IF NOT TRBLK
21740: BLT WC,TRTYP(XL),TRC13 JUMP IF TOO FAR OUT ON CHAIN
21741: BEQ WC,TRTYP(XL),TRC12 JUMP IF THIS MATCHES OUR TYPE
21742: ADD *TRNXT,XL ELSE POINT TO LINK FIELD
21743: MOV XL,XR COPY POINTER
21744: BRN TRC11 AND LOOP BACK
21745: *
21746: * HERE TO DELETE AN OLD TRBLK OF THE TYPE WE WERE GIVEN
21747: *
21748: TRC12 MOV TRNXT(XL),XL GET PTR TO NEXT BLOCK OR VALUE
21749: MOV XL,(XR) STORE TO DELETE THIS TRBLK
21750: *
21751: * HERE AFTER DELETING ANY OLD ASSOCIATION OF THIS TYPE
21752: *
21753: TRC13 BZE WB,TRC14 JUMP IF STOPTR CASE
21754: MOV WB,(XR) ELSE LINK NEW TRBLK IN
21755: MOV WB,XR COPY TRBLK POINTER
21756: MOV XL,TRNXT(XR) STORE FORWARD POINTER
21757: MOV WC,TRTYP(XR) STORE APPROPRIATE TRAP TYPE CODE
21758: *
21759: * HERE TO MAKE SURE VRGET,VRSTO ARE SET PROPERLY
21760: *
21761: TRC14 MOV WA,XR RECALL POSSIBLE VRBLK POINTER
21762: SUB *VRVAL,XR POINT BACK TO VRBLK
21763: JSR SETVR SET FIELDS IF VRBLK
21764: EXI RETURN
21765: *
21766: * HERE FOR BAD TRACE TYPE
21767: *
21768: TRC15 EXI 2 TAKE BAD TRACE TYPE ERROR EXIT
21769: *
21770: * POP STACK BEFORE FAILING
21771: *
21772: TRC16 ICA XS POP STACK
21773: *
21774: * HERE FOR BAD NAME ARGUMENT
21775: *
21776: TRC17 EXI 1 TAKE BAD NAME ERROR EXIT
21777: ENP END PROCEDURE TRACE
21778: EJC
21779: *
21780: * TRBLD -- BUILD TRBLK
21781: *
21782: * TRBLK IS USED BY THE INPUT, OUTPUT AND TRACE FUNCTIONS
21783: * TO CONSTRUCT A TRBLK (TRAP BLOCK)
21784: *
21785: * (XR) TRTAG OR TRTER
21786: * (XL) TRFNC OR TRFPT
21787: * (WB) TRTYP
21788: * JSR TRBLD CALL TO BUILD TRBLK
21789: * (XR) POINTER TO TRBLK
21790: * (WA) DESTROYED
21791: *
21792: TRBLD PRC E,0 ENTRY POINT
21793: MOV XR,-(XS) STACK TRTAG (OR TRFNM)
21794: MOV *TRSI$,WA SET SIZE OF TRBLK
21795: JSR ALLOC ALLOCATE TRBLK
21796: MOV =B$TRT,(XR) STORE FIRST WORD
21797: MOV XL,TRFNC(XR) STORE TRFNC (OR TRFPT)
21798: MOV (XS)+,TRTAG(XR) STORE TRTAG (OR TRFNM)
21799: MOV WB,TRTYP(XR) STORE TYPE
21800: MOV =NULLS,TRVAL(XR) FOR NOW, A NULL VALUE
21801: EXI RETURN TO CALLER
21802: ENP END PROCEDURE TRBLD
21803: EJC
21804: *
21805: * TRIMR -- TRIM TRAILING BLANKS
21806: *
21807: * TRIMR IS PASSED A POINTER TO AN SCBLK WHICH MUST BE THE
21808: * LAST BLOCK IN DYNAMIC STORAGE. TRAILING BLANKS ARE
21809: * TRIMMED OFF AND THE DYNAMIC STORAGE POINTER RESET TO
21810: * THE END OF THE (POSSIBLY) SHORTENED BLOCK.
21811: *
21812: * (WB) NON-ZERO TO TRIM TRAILING BLANKS
21813: * (XR) POINTER TO STRING TO TRIM
21814: * JSR TRIMR CALL TO TRIM STRING
21815: * (XR) POINTER TO TRIMMED STRING
21816: * (XL,WA,WB,WC) DESTROYED
21817: *
21818: * THE CALL WITH WB ZERO STILL PERFORMS THE END ZERO PAD
21819: * AND DNAMP READJUSTMENT. IT IS USED FROM ACESS IF KVTRM=0.
21820: *
21821: TRIMR PRC E,0 ENTRY POINT
21822: MOV XR,XL COPY STRING POINTER
21823: MOV SCLEN(XR),WA LOAD STRING LENGTH
21824: BZE WA,TRIM2 JUMP IF NULL INPUT
21825: PLC XL,WA ELSE POINT PAST LAST CHARACTER
21826: BZE WB,TRIM3 JUMP IF NO TRIM
21827: MOV =CH$BL,WC LOAD BLANK CHARACTER
21828: *
21829: * LOOP THROUGH CHARACTERS FROM RIGHT TO LEFT
21830: *
21831: TRIM0 LCH WB,-(XL) LOAD NEXT CHARACTER
21832: BEQ WB,=CH$HT,TRIM1 JUMP IF HORIZONTAL TAB
21833: BNE WB,WC,TRIM3 JUMP IF NON-BLANK FOUND
21834: TRIM1 DCV WA ELSE DECREMENT CHARACTER COUNT
21835: BNZ WA,TRIM0 LOOP BACK IF MORE TO CHECK
21836: *
21837: * HERE IF RESULT IS NULL (NULL OR ALL-BLANK INPUT)
21838: *
21839: TRIM2 MOV XR,DNAMP WIPE OUT INPUT STRING BLOCK
21840: MOV =NULLS,XR LOAD NULL RESULT
21841: BRN TRIM5 MERGE TO EXIT
21842: EJC
21843: *
21844: * TRIMR (CONTINUED)
21845: *
21846: * HERE WITH NON-BLANK FOUND (MERGE FOR NO TRIM)
21847: *
21848: TRIM3 MOV WA,SCLEN(XR) SET NEW LENGTH
21849: MOV XR,XL COPY STRING POINTER
21850: PSC XL,WA READY FOR STORING BLANKS
21851: CTB WA,SCHAR GET LENGTH OF BLOCK IN BYTES
21852: ADD XR,WA POINT PAST NEW BLOCK
21853: MOV WA,DNAMP SET NEW TOP OF STORAGE POINTER
21854: LCT WA,=CFP$C GET COUNT OF CHARS IN WORD
21855: ZER WC SET BLANK CHAR
21856: *
21857: * LOOP TO ZERO PAD LAST WORD OF CHARACTERS
21858: *
21859: TRIM4 SCH WC,(XL)+ STORE ZERO CHARACTER
21860: BCT WA,TRIM4 LOOP BACK TILL ALL STORED
21861: CSC XL COMPLETE STORE CHARACTERS
21862: *
21863: * COMMON EXIT POINT
21864: *
21865: TRIM5 ZER XL CLEAR GARBAGE XL POINTER
21866: EXI RETURN TO CALLER
21867: ENP END PROCEDURE TRIMR
21868: EJC
21869: *
21870: * TRXEQ -- EXECUTE FUNCTION TYPE TRACE
21871: *
21872: * TRXEQ IS USED TO EXECUTE A TRACE WHEN A FOURTH ARGUMENT
21873: * HAS BEEN SUPPLIED. TRACE HAS ALREADY BEEN DECREMENTED.
21874: *
21875: * (XR) POINTER TO TRBLK
21876: * (XL,WA) NAME BASE,OFFSET FOR VARIABLE
21877: * JSR TRXEQ CALL TO EXECUTE TRACE
21878: * (WB,WC,RA) DESTROYED
21879: *
21880: * THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING
21881: * CONTROL TO THE TRACE FUNCTION USING THE CFUNC ROUTINE.
21882: *
21883: * TRXEQ RETURN POINT WORD(S)
21884: * SAVED VALUE OF TRACE KEYWORD
21885: * TRBLK POINTER
21886: * NAME BASE
21887: * NAME OFFSET
21888: * SAVED VALUE OF R$COD
21889: * SAVED CODE PTR (-R$COD)
21890: * SAVED VALUE OF FLPTR
21891: * FLPTR --------------- ZERO (DUMMY FAIL OFFSET)
21892: * NMBLK FOR VARIABLE NAME
21893: * XS ------------------ TRACE TAG
21894: *
21895: * R$COD AND THE CODE PTR ARE SET TO DUMMY VALUES WHICH
21896: * CAUSE CONTROL TO RETURN TO THE TRXEQ PROCEDURE ON SUCCESS
21897: * OR FAILURE (TRXEQ IGNORES A FAILURE CONDITION).
21898: *
21899: TRXEQ PRC R,0 ENTRY POINT (RECURSIVE)
21900: MOV R$COD,WC LOAD CODE BLOCK POINTER
21901: SCP WB GET CURRENT CODE POINTER
21902: SUB WC,WB MAKE CODE POINTER INTO OFFSET
21903: MOV KVTRA,-(XS) STACK TRACE KEYWORD VALUE
21904: MOV XR,-(XS) STACK TRBLK POINTER
21905: MOV XL,-(XS) STACK NAME BASE
21906: MOV WA,-(XS) STACK NAME OFFSET
21907: MOV WC,-(XS) STACK CODE BLOCK POINTER
21908: MOV WB,-(XS) STACK CODE POINTER OFFSET
21909: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER
21910: ZER -(XS) SET DUMMY FAIL OFFSET
21911: MOV XS,FLPTR SET NEW FAILURE POINTER
21912: ZER KVTRA RESET TRACE KEYWORD TO ZERO
21913: MOV =TRXDC,WC LOAD NEW (DUMMY) CODE BLK POINTER
21914: MOV WC,R$COD SET AS CODE BLOCK POINTER
21915: LCP WC AND NEW CODE POINTER
21916: EJC
21917: *
21918: * TRXEQ (CONTINUED)
21919: *
21920: * NOW PREPARE ARGUMENTS FOR FUNCTION
21921: *
21922: MOV WA,WB SAVE NAME OFFSET
21923: MOV *NMSI$,WA LOAD NMBLK SIZE
21924: JSR ALLOC ALLOCATE SPACE FOR NMBLK
21925: MOV =B$NML,(XR) SET TYPE WORD
21926: MOV XL,NMBAS(XR) STORE NAME BASE
21927: MOV WB,NMOFS(XR) STORE NAME OFFSET
21928: MOV 6(XS),XL RELOAD POINTER TO TRBLK
21929: MOV XR,-(XS) STACK NMBLK POINTER (1ST ARGUMENT)
21930: MOV TRTAG(XL),-(XS) STACK TRACE TAG (2ND ARGUMENT)
21931: MOV TRFNC(XL),XL LOAD TRACE FUNCTION POINTER
21932: MOV =NUM02,WA SET NUMBER OF ARGUMENTS TO TWO
21933: BRN CFUNC JUMP TO CALL FUNCTION
21934: *
21935: * SEE O$TXR FOR DETAILS OF RETURN TO THIS POINT
21936: *
21937: TRXQ1 MOV FLPTR,XS POINT BACK TO OUR STACK ENTRIES
21938: ICA XS POP OFF GARBAGE FAIL OFFSET
21939: MOV (XS)+,FLPTR RESTORE OLD FAILURE POINTER
21940: MOV (XS)+,WB RELOAD CODE OFFSET
21941: MOV (XS)+,WC LOAD OLD CODE BASE POINTER
21942: MOV WC,XR COPY CDBLK POINTER
21943: MOV CDSTM(XR),KVSTN RESTORE STMNT NO
21944: MOV (XS)+,WA RELOAD NAME OFFSET
21945: MOV (XS)+,XL RELOAD NAME BASE
21946: MOV (XS)+,XR RELOAD TRBLK POINTER
21947: MOV (XS)+,KVTRA RESTORE TRACE KEYWORD VALUE
21948: ADD WC,WB RECOMPUTE ABSOLUTE CODE POINTER
21949: LCP WB RESTORE CODE POINTER
21950: MOV WC,R$COD AND CODE BLOCK POINTER
21951: EXI RETURN TO TRXEQ CALLER
21952: ENP END PROCEDURE TRXEQ
21953: EJC
21954: *
21955: * XSCAN -- EXECUTION FUNCTION ARGUMENT SCAN
21956: *
21957: * XSCAN SCANS OUT ONE TOKEN IN A PROTOTYPE ARGUMENT IN
21958: * ARRAY,CLEAR,DATA,DEFINE,LOAD FUNCTION CALLS. XSCAN
21959: * CALLS MUST BE PRECEDED BY A CALL TO THE INITIALIZATION
21960: * PROCEDURE XSCNI. THE FOLLOWING VARIABLES ARE USED.
21961: *
21962: * R$XSC POINTER TO SCBLK FOR FUNCTION ARG
21963: * XSOFS OFFSET (NUM CHARS SCANNED SO FAR)
21964: *
21965: * (WC) DELIMITER ONE (CH$XX)
21966: * (XL) DELIMITER TWO (CH$XX)
21967: * JSR XSCAN CALL TO SCAN NEXT ITEM
21968: * (XR) POINTER TO SCBLK FOR TOKEN SCANNED
21969: * (WA) COMPLETION CODE (SEE BELOW)
21970: * (WC,XL) DESTROYED
21971: *
21972: * THE SCAN STARTS FROM THE CURRENT POSITION AND CONTINUES
21973: * UNTIL ONE OF THE FOLLOWING THREE CONDITIONS OCCURS.
21974: *
21975: * 1) DELIMITER ONE IS ENCOUNTERED (WA SET TO 1)
21976: *
21977: * 2) DELIMITER TWO ENCOUNTERED (WA SET TO 2)
21978: *
21979: * 3) END OF STRING ENCOUNTERED (WA SET TO 0)
21980: *
21981: * THE RESULT IS A STRING CONTAINING ALL CHARACTERS SCANNED
21982: * UP TO BUT NOT INCLUDING ANY DELIMITER CHARACTER.
21983: * THE POINTER IS LEFT POINTING PAST THE DELIMITER.
21984: *
21985: * IF ONLY ONE DELIMITER IS TO BE DETECTED, DELIMITER ONE
21986: * AND DELIMITER TWO SHOULD BE SET TO THE SAME VALUE.
21987: *
21988: * IN THE CASE WHERE THE END OF STRING IS ENCOUNTERED, THE
21989: * STRING INCLUDES ALL THE CHARACTERS TO THE END OF THE
21990: * STRING. NO FURTHER CALLS CAN BE MADE TO XSCAN UNTIL
21991: * XSCNI IS CALLED TO INITIALIZE A NEW ARGUMENT SCAN
21992: EJC
21993: *
21994: * XSCAN (CONTINUED)
21995: *
21996: XSCAN PRC E,0 ENTRY POINT
21997: MOV WB,XSCWB PRESERVE WB
21998: MOV R$XSC,XR POINT TO ARGUMENT STRING
21999: MOV SCLEN(XR),WA LOAD STRING LENGTH
22000: MOV XSOFS,WB LOAD CURRENT OFFSET
22001: SUB WB,WA GET NUMBER OF REMAINING CHARACTERS
22002: BZE WA,XSCN2 JUMP IF NO CHARACTERS LEFT
22003: PLC XR,WB POINT TO CURRENT CHARACTER
22004: *
22005: * LOOP TO SEARCH FOR DELIMITER
22006: *
22007: XSCN1 LCH WB,(XR)+ LOAD NEXT CHARACTER
22008: BEQ WB,WC,XSCN3 JUMP IF DELIMITER ONE FOUND
22009: BEQ WB,XL,XSCN4 JUMP IF DELIMITER TWO FOUND
22010: DCV WA DECREMENT COUNT OF CHARS LEFT
22011: BNZ WA,XSCN1 LOOP BACK IF MORE CHARS TO GO
22012: *
22013: * HERE FOR RUNOUT
22014: *
22015: XSCN2 MOV R$XSC,XL POINT TO STRING BLOCK
22016: MOV SCLEN(XL),WA GET STRING LENGTH
22017: MOV XSOFS,WB LOAD OFFSET
22018: SUB WB,WA GET SUBSTRING LENGTH
22019: ZER R$XSC CLEAR STRING PTR FOR COLLECTOR
22020: ZER XSCRT SET ZERO (RUNOUT) RETURN CODE
22021: BRN XSCN6 JUMP TO EXIT
22022: EJC
22023: *
22024: * XSCAN (CONTINUED)
22025: *
22026: * HERE IF DELIMITER ONE FOUND
22027: *
22028: XSCN3 MOV =NUM01,XSCRT SET RETURN CODE
22029: BRN XSCN5 JUMP TO MERGE
22030: *
22031: * HERE IF DELIMITER TWO FOUND
22032: *
22033: XSCN4 MOV =NUM02,XSCRT SET RETURN CODE
22034: *
22035: * MERGE HERE AFTER DETECTING A DELIMITER
22036: *
22037: XSCN5 MOV R$XSC,XL RELOAD POINTER TO STRING
22038: MOV SCLEN(XL),WC GET ORIGINAL LENGTH OF STRING
22039: SUB WA,WC MINUS CHARS LEFT = CHARS SCANNED
22040: MOV WC,WA MOVE TO REG FOR SBSTR
22041: MOV XSOFS,WB SET OFFSET
22042: SUB WB,WA COMPUTE LENGTH FOR SBSTR
22043: ICV WC ADJUST NEW CURSOR PAST DELIMITER
22044: MOV WC,XSOFS STORE NEW OFFSET
22045: *
22046: * COMMON EXIT POINT
22047: *
22048: XSCN6 ZER XR CLEAR GARBAGE CHARACTER PTR IN XR
22049: JSR SBSTR BUILD SUB-STRING
22050: MOV XSCRT,WA LOAD RETURN CODE
22051: MOV XSCWB,WB RESTORE WB
22052: EXI RETURN TO XSCAN CALLER
22053: ENP END PROCEDURE XSCAN
22054: EJC
22055: *
22056: * XSCNI -- EXECUTION FUNCTION ARGUMENT SCAN
22057: *
22058: * XSCNI INITIALIZES THE SCAN USED FOR PROTOTYPE ARGUMENTS
22059: * IN THE CLEAR, DEFINE, LOAD, DATA, ARRAY FUNCTIONS. SEE
22060: * XSCAN FOR THE PROCEDURE WHICH IS USED AFTER THIS CALL.
22061: *
22062: * -(XS) ARGUMENT TO BE SCANNED (ON STACK)
22063: * JSR XSCNI CALL TO SCAN ARGUMENT
22064: * PPM LOC TRANSFER LOC IF ARG IS NOT STRING
22065: * PPM LOC TRANSFER LOC IF ARGUMENT IS NULL
22066: * (XS) POPPED
22067: * (XR,R$XSC) ARGUMENT (SCBLK PTR)
22068: * (WA) ARGUMENT LENGTH
22069: * (IA,RA) DESTROYED
22070: *
22071: XSCNI PRC N,2 ENTRY POINT
22072: JSR GTSTG FETCH ARGUMENT AS STRING
22073: PPM XSCI1 JUMP IF NOT CONVERTIBLE
22074: MOV XR,R$XSC ELSE STORE SCBLK PTR FOR XSCAN
22075: ZER XSOFS SET OFFSET TO ZERO
22076: BZE WA,XSCI2 JUMP IF NULL STRING
22077: EXI RETURN TO XSCNI CALLER
22078: *
22079: * HERE IF ARGUMENT IS NOT A STRING
22080: *
22081: XSCI1 EXI 1 TAKE NOT-STRING ERROR EXIT
22082: *
22083: * HERE FOR NULL STRING
22084: *
22085: XSCI2 EXI 2 TAKE NULL-STRING ERROR EXIT
22086: ENP END PROCEDURE XSCNI
22087: TTL S P I T B O L -- UTILITY ROUTINES
22088: *
22089: * THE FOLLOWING SECTION CONTAINS UTILITY ROUTINES USED FOR
22090: * VARIOUS PURPOSES THROUGHOUT THE SYSTEM. THESE DIFFER
22091: * FROM THE PROCEDURES IN THE UTILITY PROCEDURES SECTION IN
22092: * THEY ARE NOT IN PROCEDURE FORM AND THEY DO NOT RETURN
22093: * TO THEIR CALLERS. THEY ARE ACCESSED WITH A BRANCH TYPE
22094: * INSTRUCTION AFTER SETTING THE REGISTERS TO APPROPRIATE
22095: * PARAMETER VALUES.
22096: *
22097: * THE REGISTER VALUES REQUIRED FOR EACH ROUTINE ARE
22098: * DOCUMENTED AT THE START OF EACH ROUTINE. REGISTERS NOT
22099: * MENTIONED MAY CONTAIN ANY VALUES EXCEPT THAT XR,XL
22100: * CAN ONLY CONTAIN PROPER COLLECTABLE POINTERS.
22101: *
22102: * SOME OF THESE ROUTINES WILL TOLERATE GARBAGE POINTERS
22103: * IN XL,XR ON ENTRY. THIS IS ALWAYS DOCUMENTED AND IN
22104: * EACH CASE, THE ROUTINE CLEARS THESE GARBAGE VALUES BEFORE
22105: * EXITING AFTER COMPLETING ITS TASK.
22106: *
22107: * THE ROUTINES HAVE NAMES CONSISTING OF FIVE LETTERS
22108: * AND ARE ASSEMBLED IN ALPHABETICAL ORDER.
22109: EJC
22110: * ARREF -- ARRAY REFERENCE
22111: *
22112: * (XL) MAY BE NON-COLLECTABLE
22113: * (XR) NUMBER OF SUBSCRIPTS
22114: * (WB) SET ZERO/NONZERO FOR VALUE/NAME
22115: * THE VALUE IN WB MUST BE COLLECTABLE
22116: * STACK SUBSCRIPTS AND ARRAY OPERAND
22117: * BRN ARREF JUMP TO CALL FUNCTION
22118: *
22119: * ARREF CONTINUES BY EXECUTING THE NEXT CODE WORD WITH
22120: * THE RESULT NAME OR VALUE PLACED ON TOP OF THE STACK.
22121: * TO DEAL WITH THE PROBLEM OF ACCESSING SUBSCRIPTS IN THE
22122: * ORDER OF STACKING, XL IS USED AS A SUBSCRIPT POINTER
22123: * WORKING BELOW THE STACK POINTER.
22124: *
22125: ARREF RTN
22126: MOV XR,WA COPY NUMBER OF SUBSCRIPTS
22127: MOV XS,XT POINT TO STACK FRONT
22128: WTB XR CONVERT TO BYTE OFFSET
22129: ADD XR,XT POINT TO ARRAY OPERAND ON STACK
22130: ICA XT FINAL VALUE FOR STACK POPPING
22131: MOV XT,ARFXS KEEP FOR LATER
22132: MOV -(XT),XR LOAD ARRAY OPERAND POINTER
22133: MOV XR,R$ARF KEEP ARRAY POINTER
22134: MOV XT,XR SAVE POINTER TO SUBSCRIPTS
22135: MOV R$ARF,XL POINT XL TO POSSIBLE VCBLK OR TBBLK
22136: MOV (XL),WC LOAD FIRST WORD
22137: BEQ WC,=B$ART,ARF01 JUMP IF ARBLK
22138: BEQ WC,=B$VCT,ARF07 JUMP IF VCBLK
22139: BEQ WC,=B$TBT,ARF10 JUMP IF TBBLK
22140: ERB 235,SUBSCRIPTED OPERAND IS NOT TABLE OR ARRAY
22141: *
22142: * HERE FOR ARRAY (ARBLK)
22143: *
22144: ARF01 BNE WA,ARNDM(XL),ARF09 JUMP IF WRONG NUMBER OF DIMS
22145: LDI INTV0 GET INITIAL SUBSCRIPT OF ZERO
22146: MOV XR,XT POINT BEFORE SUBSCRIPTS
22147: ZER WA INITIAL OFFSET TO BOUNDS
22148: BRN ARF03 JUMP INTO LOOP
22149: *
22150: * LOOP TO COMPUTE SUBSCRIPTS BY MULTIPLICATIONS
22151: *
22152: ARF02 MLI ARDM2(XR) MULTIPLY TOTAL BY NEXT DIMENSION
22153: *
22154: * MERGE HERE FIRST TIME
22155: *
22156: ARF03 MOV -(XT),XR LOAD NEXT SUBSCRIPT
22157: STI ARFSI SAVE CURRENT SUBSCRIPT
22158: LDI ICVAL(XR) LOAD INTEGER VALUE IN CASE
22159: BEQ (XR),=B$ICL,ARF04 JUMP IF IT WAS AN INTEGER
22160: EJC
22161: *
22162: * ARREF (CONTINUED)
22163: *
22164: *
22165: JSR GTINT CONVERT TO INTEGER
22166: PPM ARF12 JUMP IF NOT INTEGER
22167: LDI ICVAL(XR) IF OK, LOAD INTEGER VALUE
22168: *
22169: * HERE WITH INTEGER SUBSCRIPT IN (IA)
22170: *
22171: ARF04 MOV R$ARF,XR POINT TO ARRAY
22172: ADD WA,XR OFFSET TO NEXT BOUNDS
22173: SBI ARLBD(XR) SUBTRACT LOW BOUND TO COMPARE
22174: IOV ARF13 OUT OF RANGE FAIL IF OVERFLOW
22175: ILT ARF13 OUT OF RANGE FAIL IF TOO SMALL
22176: SBI ARDIM(XR) SUBTRACT DIMENSION
22177: IGE ARF13 OUT OF RANGE FAIL IF TOO LARGE
22178: ADI ARDIM(XR) ELSE RESTORE SUBSCRIPT OFFSET
22179: ADI ARFSI ADD TO CURRENT TOTAL
22180: ADD *ARDMS,WA POINT TO NEXT BOUNDS
22181: BNE XT,XS,ARF02 LOOP BACK IF MORE TO GO
22182: *
22183: * HERE WITH INTEGER SUBSCRIPT COMPUTED
22184: *
22185: MFI WA GET AS ONE WORD INTEGER
22186: WTB WA CONVERT TO OFFSET
22187: MOV R$ARF,XL POINT TO ARBLK
22188: ADD AROFS(XL),WA ADD OFFSET PAST BOUNDS
22189: ICA WA ADJUST FOR ARPRO FIELD
22190: BNZ WB,ARF08 EXIT WITH NAME IF NAME CALL
22191: *
22192: * MERGE HERE TO GET VALUE FOR VALUE CALL
22193: *
22194: ARF05 JSR ACESS GET VALUE
22195: PPM ARF13 FAIL IF ACESS FAILS
22196: *
22197: * RETURN VALUE
22198: *
22199: ARF06 MOV ARFXS,XS POP STACK ENTRIES
22200: ZER R$ARF FINISHED WITH ARRAY POINTER
22201: BRN EXIXR EXIT WITH VALUE IN XR
22202: EJC
22203: *
22204: * ARREF (CONTINUED)
22205: *
22206: * HERE FOR VECTOR
22207: *
22208: ARF07 BNE WA,=NUM01,ARF09 ERROR IF MORE THAN 1 SUBSCRIPT
22209: MOV (XS),XR ELSE LOAD SUBSCRIPT
22210: JSR GTINT CONVERT TO INTEGER
22211: PPM ARF12 ERROR IF NOT INTEGER
22212: LDI ICVAL(XR) ELSE LOAD INTEGER VALUE
22213: SBI INTV1 SUBTRACT FOR ONES OFFSET
22214: MFI WA,ARF13 GET SUBSCRIPT AS ONE WORD
22215: ADD =VCVLS,WA ADD OFFSET FOR STANDARD FIELDS
22216: WTB WA CONVERT OFFSET TO BYTES
22217: BGE WA,VCLEN(XL),ARF13 FAIL IF OUT OF RANGE SUBSCRIPT
22218: BZE WB,ARF05 BACK TO GET VALUE IF VALUE CALL
22219: *
22220: * RETURN NAME
22221: *
22222: ARF08 MOV ARFXS,XS POP STACK ENTRIES
22223: ZER R$ARF FINISHED WITH ARRAY POINTER
22224: BRN EXNAM ELSE EXIT WITH NAME
22225: *
22226: * HERE IF SUBSCRIPT COUNT IS WRONG
22227: *
22228: ARF09 ERB 236,ARRAY REFERENCED WITH WRONG NUMBER OF SUBSCRIPTS
22229: *
22230: * TABLE
22231: *
22232: ARF10 BNE WA,=NUM01,ARF11 ERROR IF MORE THAN 1 SUBSCRIPT
22233: MOV (XS),XR ELSE LOAD SUBSCRIPT
22234: JSR TFIND CALL TABLE SEARCH ROUTINE
22235: PPM ARF13 FAIL IF FAILED
22236: BNZ WB,ARF08 EXIT WITH NAME IF NAME CALL
22237: BRN ARF06 ELSE EXIT WITH VALUE
22238: *
22239: * HERE FOR BAD TABLE REFERENCE
22240: *
22241: ARF11 ERB 237,TABLE REFERENCED WITH MORE THAN ONE SUBSCRIPT
22242: *
22243: * HERE FOR BAD SUBSCRIPT
22244: *
22245: ARF12 ERB 238,ARRAY SUBSCRIPT IS NOT INTEGER
22246: *
22247: * HERE TO SIGNAL FAILURE
22248: *
22249: ARF13 ZER R$ARF FINISHED WITH ARRAY POINTER
22250: BRN EXFAL FAIL
22251: EJC
22252: *
22253: * CFUNC -- CALL A FUNCTION
22254: *
22255: * CFUNC IS USED TO CALL A SNOBOL LEVEL FUNCTION. IT IS
22256: * USED BY THE APPLY FUNCTION (S$APP), THE FUNCTION
22257: * TRACE ROUTINE (TRXEQ) AND THE MAIN FUNCTION CALL ENTRY
22258: * (O$FNC, O$FNS). IN THE LATTER CASES, CFUNC IS USED ONLY
22259: * IF THE NUMBER OF ARGUMENTS IS INCORRECT.
22260: *
22261: * (XL) POINTER TO FUNCTION BLOCK
22262: * (WA) ACTUAL NUMBER OF ARGUMENTS
22263: * (XS) POINTS TO STACKED ARGUMENTS
22264: * BRN CFUNC JUMP TO CALL FUNCTION
22265: *
22266: * CFUNC CONTINUES BY EXECUTING THE FUNCTION
22267: *
22268: CFUNC RTN
22269: BLT WA,FARGS(XL),CFNC1 JUMP IF TOO FEW ARGUMENTS
22270: BEQ WA,FARGS(XL),CFNC3 JUMP IF CORRECT NUMBER OF ARGS
22271: *
22272: * HERE IF TOO MANY ARGUMENTS SUPPLIED, POP THEM OFF
22273: *
22274: MOV WA,WB COPY ACTUAL NUMBER
22275: SUB FARGS(XL),WB GET NUMBER OF EXTRA ARGS
22276: WTB WB CONVERT TO BYTES
22277: ADD WB,XS POP OFF UNWANTED ARGUMENTS
22278: BRN CFNC3 JUMP TO GO OFF TO FUNCTION
22279: *
22280: * HERE IF TOO FEW ARGUMENTS
22281: *
22282: CFNC1 MOV FARGS(XL),WB LOAD REQUIRED NUMBER OF ARGUMENTS
22283: BEQ WB,=NINI9,CFNC3 JUMP IF CASE OF VAR NUM OF ARGS
22284: SUB WA,WB CALCULATE NUMBER MISSING
22285: LCT WB,WB SET COUNTER TO CONTROL LOOP
22286: *
22287: * LOOP TO SUPPLY EXTRA NULL ARGUMENTS
22288: *
22289: CFNC2 MOV =NULLS,-(XS) STACK A NULL ARGUMENT
22290: BCT WB,CFNC2 LOOP TILL PROPER NUMBER STACKED
22291: *
22292: * MERGE HERE TO JUMP TO FUNCTION
22293: *
22294: CFNC3 BRI (XL) JUMP THROUGH FCODE FIELD
22295: EJC
22296: *
22297: * EXFAL -- EXIT SIGNALLING SNOBOL FAILURE
22298: *
22299: * (XL,XR) MAY BE NON-COLLECTABLE
22300: * BRN EXFAL JUMP TO FAIL
22301: *
22302: * EXFAL CONTINUES BY EXECUTING THE APPROPRIATE FAIL GOTO
22303: *
22304: EXFAL RTN
22305: MOV FLPTR,XS POP STACK
22306: MOV (XS),XR LOAD FAILURE OFFSET
22307: ADD R$COD,XR POINT TO FAILURE CODE LOCATION
22308: LCP XR SET CODE POINTER
22309: BRN EXITS DO NEXT CODE WORD
22310: EJC
22311: *
22312: * EXINT -- EXIT WITH INTEGER RESULT
22313: *
22314: * (XL,XR) MAY BE NONCOLLECTABLE
22315: * (IA) INTEGER VALUE
22316: * BRN EXINT JUMP TO EXIT WITH INTEGER
22317: *
22318: * EXINT CONTINUES BY EXECUTING THE NEXT CODE WORD
22319: * WHICH IT DOES BY FALLING THROUGH TO EXIXR
22320: *
22321: EXINT RTN
22322: JSR ICBLD BUILD ICBLK
22323: EJC
22324: * EXIXR -- EXIT WITH RESULT IN (XR)
22325: *
22326: * (XR) RESULT
22327: * (XL) MAY BE NON-COLLECTABLE
22328: * BRN EXIXR JUMP TO EXIT WITH RESULT IN (XR)
22329: *
22330: * EXIXR CONTINUES BY EXECUTING THE NEXT CODE WORD
22331: * WHICH IT DOES BY FALLING THROUGH TO EXITS.
22332: EXIXR RTN
22333: *
22334: MOV XR,-(XS) STACK RESULT
22335: *
22336: *
22337: * EXITS -- EXIT WITH RESULT IF ANY STACKED
22338: *
22339: * (XR,XL) MAY BE NON-COLLECTABLE
22340: *
22341: * BRN EXITS ENTER EXITS ROUTINE
22342: *
22343: EXITS RTN
22344: LCW XR LOAD NEXT CODE WORD
22345: MOV (XR),XL LOAD ENTRY ADDRESS
22346: BRI XL JUMP TO EXECUTE NEXT CODE WORD
22347: EJC
22348: *
22349: * EXNAM -- EXIT WITH NAME IN (XL,WA)
22350: *
22351: * (XL) NAME BASE
22352: * (WA) NAME OFFSET
22353: * (XR) MAY BE NON-COLLECTABLE
22354: * BRN EXNAM JUMP TO EXIT WITH NAME IN (XL,WA)
22355: *
22356: * EXNAM CONTINUES BY EXECUTING THE NEXT CODE WORD
22357: *
22358: EXNAM RTN
22359: MOV XL,-(XS) STACK NAME BASE
22360: MOV WA,-(XS) STACK NAME OFFSET
22361: BRN EXITS DO NEXT CODE WORD
22362: EJC
22363: *
22364: * EXNUL -- EXIT WITH NULL RESULT
22365: *
22366: * (XL,XR) MAY BE NON-COLLECTABLE
22367: * BRN EXNUL JUMP TO EXIT WITH NULL VALUE
22368: *
22369: * EXNUL CONTINUES BY EXECUTING THE NEXT CODE WORD
22370: *
22371: EXNUL RTN
22372: MOV =NULLS,-(XS) STACK NULL VALUE
22373: BRN EXITS DO NEXT CODE WORD
22374: EJC
22375: *
22376: * EXREA -- EXIT WITH REAL RESULT
22377: *
22378: * (XL,XR) MAY BE NON-COLLECTABLE
22379: * (RA) REAL VALUE
22380: * BRN EXREA JUMP TO EXIT WITH REAL VALUE
22381: *
22382: * EXREA CONTINUES BY EXECUTING THE NEXT CODE WORD
22383: *
22384: EXREA RTN
22385: JSR RCBLD BUILD RCBLK
22386: BRN EXIXR JUMP TO EXIT WITH RESULT IN XR
22387: EJC
22388: *
22389: * EXSID -- EXIT SETTING ID FIELD
22390: *
22391: * EXSID IS USED TO EXIT AFTER BUILDING ANY OF THE FOLLOWING
22392: * BLOCKS (ARBLK, TBBLK, PDBLK, VCBLK). IT SETS THE IDVAL.
22393: *
22394: * (XR) PTR TO BLOCK WITH IDVAL FIELD
22395: * (XL) MAY BE NON-COLLECTABLE
22396: * BRN EXSID JUMP TO EXIT AFTER SETTING ID FIELD
22397: *
22398: * EXSID CONTINUES BY EXECUTING THE NEXT CODE WORD
22399: *
22400: EXSID RTN
22401: MOV CURID,WA LOAD CURRENT ID VALUE
22402: BNE WA,=CFP$M,EXSI1 JUMP IF NO OVERFLOW
22403: ZER WA ELSE RESET FOR WRAPAROUND
22404: *
22405: * HERE WITH OLD IDVAL IN WA
22406: *
22407: EXSI1 ICV WA BUMP ID VALUE
22408: MOV WA,CURID STORE FOR NEXT TIME
22409: MOV WA,IDVAL(XR) STORE ID VALUE
22410: BRN EXIXR EXIT WITH RESULT IN (XR)
22411: EJC
22412: *
22413: * EXVNM -- EXIT WITH NAME OF VARIABLE
22414: *
22415: * EXVNM EXITS AFTER STACKING A VALUE WHICH IS A NMBLK
22416: * REFERENCING THE NAME OF A GIVEN NATURAL VARIABLE.
22417: *
22418: * (XR) VRBLK POINTER
22419: * (XL) MAY BE NON-COLLECTABLE
22420: * BRN EXVNM EXIT WITH VRBLK POINTER IN XR
22421: *
22422: EXVNM RTN
22423: MOV XR,XL COPY NAME BASE POINTER
22424: MOV *NMSI$,WA SET SIZE OF NMBLK
22425: JSR ALLOC ALLOCATE NMBLK
22426: MOV =B$NML,(XR) STORE TYPE WORD
22427: MOV XL,NMBAS(XR) STORE NAME BASE
22428: MOV *VRVAL,NMOFS(XR) STORE NAME OFFSET
22429: BRN EXIXR EXIT WITH RESULT IN XR
22430: EJC
22431: *
22432: * FLPOP -- FAIL AND POP IN PATTERN MATCHING
22433: *
22434: * FLPOP POPS THE NODE AND CURSOR ON THE STACK AND THEN
22435: * DROPS THROUGH INTO FAILP TO CAUSE PATTERN FAILURE
22436: *
22437: * (XL,XR) MAY BE NON-COLLECTABLE
22438: * BRN FLPOP JUMP TO FAIL AND POP STACK
22439: *
22440: FLPOP RTN
22441: ADD *NUM02,XS POP TWO ENTRIES OFF STACK
22442: EJC
22443: *
22444: * FAILP -- FAILURE IN MATCHING PATTERN NODE
22445: *
22446: * FAILP IS USED AFTER FAILING TO MATCH A PATTERN NODE.
22447: * SEE PATTERN MATCH ROUTINES FOR DETAILS OF USE.
22448: *
22449: * (XL,XR) MAY BE NON-COLLECTABLE
22450: * BRN FAILP SIGNAL FAILURE TO MATCH
22451: *
22452: * FAILP CONTINUES BY MATCHING AN ALTERNATIVE FROM THE STACK
22453: *
22454: FAILP RTN
22455: MOV (XS)+,XR LOAD ALTERNATIVE NODE POINTER
22456: MOV (XS)+,WB RESTORE OLD CURSOR
22457: MOV (XR),XL LOAD PCODE ENTRY POINTER
22458: BRI XL JUMP TO EXECUTE CODE FOR NODE
22459: EJC
22460: *
22461: * INDIR -- COMPUTE INDIRECT REFERENCE
22462: *
22463: * (WB) NONZERO/ZERO FOR BY NAME/VALUE
22464: * BRN INDIR JUMP TO GET INDIRECT REF ON STACK
22465: *
22466: * INDIR CONTINUES BY EXECUTING THE NEXT CODE WORD
22467: *
22468: INDIR RTN
22469: MOV (XS)+,XR LOAD ARGUMENT
22470: BEQ (XR),=B$NML,INDR2 JUMP IF A NAME
22471: JSR GTNVR ELSE CONVERT TO VARIABLE
22472: ERR 239,INDIRECTION OPERAND IS NOT NAME
22473: BZE WB,INDR1 SKIP IF BY VALUE
22474: MOV XR,-(XS) ELSE STACK VRBLK PTR
22475: MOV *VRVAL,-(XS) STACK NAME OFFSET
22476: BRN EXITS EXIT WITH RESULT ON STACK
22477: *
22478: * HERE TO GET VALUE OF NATURAL VARIABLE
22479: *
22480: INDR1 BRI (XR) JUMP THROUGH VRGET FIELD OF VRBLK
22481: *
22482: * HERE IF OPERAND IS A NAME
22483: *
22484: INDR2 MOV NMBAS(XR),XL LOAD NAME BASE
22485: MOV NMOFS(XR),WA LOAD NAME OFFSET
22486: BNZ WB,EXNAM EXIT IF CALLED BY NAME
22487: JSR ACESS ELSE GET VALUE FIRST
22488: PPM EXFAL FAIL IF ACCESS FAILS
22489: BRN EXIXR ELSE RETURN WITH VALUE IN XR
22490: EJC
22491: *
22492: * MATCH -- INITIATE PATTERN MATCH
22493: *
22494: * (WB) MATCH TYPE CODE
22495: * BRN MATCH JUMP TO INITIATE PATTERN MATCH
22496: *
22497: * MATCH CONTINUES BY EXECUTING THE PATTERN MATCH. SEE
22498: * PATTERN MATCH ROUTINES (P$XXX) FOR FULL DETAILS.
22499: *
22500: MATCH RTN
22501: MOV (XS)+,XR LOAD PATTERN OPERAND
22502: JSR GTPAT CONVERT TO PATTERN
22503: ERR 240,PATTERN MATCH RIGHT OPERAND IS NOT PATTERN
22504: MOV XR,XL IF OK, SAVE PATTERN POINTER
22505: BNZ WB,MTCH1 JUMP IF NOT MATCH BY NAME
22506: MOV (XS),WA ELSE LOAD NAME OFFSET
22507: MOV XL,-(XS) SAVE PATTERN POINTER
22508: MOV 2(XS),XL LOAD NAME BASE
22509: JSR ACESS ACCESS SUBJECT VALUE
22510: PPM EXFAL FAIL IF ACCESS FAILS
22511: MOV (XS),XL RESTORE PATTERN POINTER
22512: MOV XR,(XS) STACK SUBJECT STRING VAL FOR MERGE
22513: ZER WB RESTORE TYPE CODE
22514: *
22515: * MERGE HERE WITH SUBJECT VALUE ON STACK
22516: *
22517: MTCH1 MOV (XS),XR LOAD SUBJECT VALUE
22518: ZER R$PMB ASSUME NOT A BUFFER
22519: BNE (XR),=B$BCT,MTCHA BRANCH IF NOT
22520: ICA XS ELSE POP VALUE
22521: MOV XR,R$PMB SAVE POINTER
22522: MOV BCLEN(XR),WA GET DEFINED LENGTH
22523: MOV BCBUF(XR),XR POINT TO BFBLK
22524: BRN MTCHB
22525: *
22526: * HERE IF NOT BUFFER TO CONVERT TO STRING
22527: *
22528: MTCHA JSR GTSTG NOT BUFFER - CONVERT TO STRING
22529: ERR 241,PATTERN MATCH LEFT OPERAND IS NOT STRING
22530: *
22531: * MERGE WITH BUFFER OR STRING
22532: *
22533: MTCHB MOV XR,R$PMS IF OK, STORE SUBJECT STRING POINTER
22534: MOV WA,PMSSL AND LENGTH
22535: MOV WB,-(XS) STACK MATCH TYPE CODE
22536: ZER -(XS) STACK INITIAL CURSOR (ZERO)
22537: ZER WB SET INITIAL CURSOR
22538: MOV XS,PMHBS SET HISTORY STACK BASE PTR
22539: ZER PMDFL RESET PATTERN ASSIGNMENT FLAG
22540: MOV XL,XR SET INITIAL NODE POINTER
22541: BNZ KVANC,MTCH2 JUMP IF ANCHORED
22542: *
22543: * HERE FOR UNANCHORED
22544: *
22545: MOV XR,-(XS) STACK INITIAL NODE POINTER
22546: MOV =NDUNA,-(XS) STACK POINTER TO ANCHOR MOVE NODE
22547: BRI (XR) START MATCH OF FIRST NODE
22548: *
22549: * HERE IN ANCHORED MODE
22550: *
22551: MTCH2 ZER -(XS) DUMMY CURSOR VALUE
22552: MOV =NDABO,-(XS) STACK POINTER TO ABORT NODE
22553: BRI (XR) START MATCH OF FIRST NODE
22554: EJC
22555: *
22556: * RETRN -- RETURN FROM FUNCTION
22557: *
22558: * (WA) STRING POINTER FOR RETURN TYPE
22559: * BRN RETRN JUMP TO RETURN FROM (SNOBOL) FUNC
22560: *
22561: * RETRN CONTINUES BY EXECUTING THE CODE AT THE RETURN POINT
22562: * THE STACK IS CLEANED OF ANY GARBAGE LEFT BY OTHER
22563: * ROUTINES WHICH MAY HAVE ALTERED FLPTR SINCE FUNCTION
22564: * ENTRY BY USING FLPRT, RESERVED FOR USE ONLY BY
22565: * FUNCTION CALL AND RETURN.
22566: *
22567: RETRN RTN
22568: BNZ KVFNC,RTN01 JUMP IF NOT LEVEL ZERO
22569: ERB 242,FUNCTION RETURN FROM LEVEL ZERO
22570: *
22571: * HERE IF NOT LEVEL ZERO RETURN
22572: *
22573: RTN01 MOV FLPRT,XS POP STACK
22574: ICA XS REMOVE FAILURE OFFSET
22575: MOV (XS)+,XR POP PFBLK POINTER
22576: MOV (XS)+,FLPTR POP FAILURE POINTER
22577: MOV (XS)+,FLPRT POP OLD FLPRT
22578: MOV (XS)+,WB POP CODE POINTER OFFSET
22579: MOV (XS)+,WC POP OLD CODE BLOCK POINTER
22580: ADD WC,WB MAKE OLD CODE POINTER ABSOLUTE
22581: LCP WB RESTORE OLD CODE POINTER
22582: MOV WC,R$COD RESTORE OLD CODE BLOCK POINTER
22583: DCV KVFNC DECREMENT FUNCTION LEVEL
22584: MOV KVTRA,WB LOAD TRACE
22585: ADD KVFTR,WB ADD FTRACE
22586: BZE WB,RTN06 JUMP IF NO TRACING POSSIBLE
22587: *
22588: * HERE IF THERE MAY BE A TRACE
22589: *
22590: MOV WA,-(XS) SAVE FUNCTION RETURN TYPE
22591: MOV XR,-(XS) SAVE PFBLK POINTER
22592: MOV WA,KVRTN SET RTNTYPE FOR TRACE FUNCTION
22593: MOV R$FNC,XL LOAD FNCLEVEL TRBLK PTR (IF ANY)
22594: JSR KTREX EXECUTE POSSIBLE FNCLEVEL TRACE
22595: MOV PFVBL(XR),XL LOAD VRBLK PTR (SGD13)
22596: BZE KVTRA,RTN02 JUMP IF TRACE IS OFF
22597: MOV PFRTR(XR),XR ELSE LOAD RETURN TRACE TRBLK PTR
22598: BZE XR,RTN02 JUMP IF NOT RETURN TRACED
22599: DCV KVTRA ELSE DECREMENT TRACE COUNT
22600: BZE TRFNC(XR),RTN03 JUMP IF PRINT TRACE
22601: MOV *VRVAL,WA ELSE SET NAME OFFSET
22602: MOV 1(XS),KVRTN MAKE SURE RTNTYPE IS SET RIGHT
22603: JSR TRXEQ EXECUTE FULL TRACE
22604: EJC
22605: *
22606: * RETRN (CONTINUED)
22607: *
22608: * HERE TO TEST FOR FTRACE
22609: *
22610: RTN02 BZE KVFTR,RTN05 JUMP IF FTRACE IS OFF
22611: DCV KVFTR ELSE DECREMENT FTRACE
22612: *
22613: * HERE FOR PRINT TRACE OF FUNCTION RETURN
22614: *
22615: RTN03 JSR PRTSN PRINT STATEMENT NUMBER
22616: MOV 1(XS),XR LOAD RETURN TYPE
22617: JSR PRTST PRINT IT
22618: MOV =CH$BL,WA LOAD BLANK
22619: JSR PRTCH PRINT IT
22620: MOV 0(XS),XL LOAD PFBLK PTR
22621: MOV PFVBL(XL),XL LOAD FUNCTION VRBLK PTR
22622: MOV *VRVAL,WA SET VRBLK NAME OFFSET
22623: BNE XR,=SCFRT,RTN04 JUMP IF NOT FRETURN CASE
22624: *
22625: * FOR FRETURN, JUST PRINT FUNCTION NAME
22626: *
22627: JSR PRTNM PRINT NAME
22628: JSR PRTNL TERMINATE PRINT LINE
22629: BRN RTN05 MERGE
22630: *
22631: * HERE FOR RETURN OR NRETURN, PRINT FUNCTION NAME = VALUE
22632: *
22633: RTN04 JSR PRTNV PRINT NAME = VALUE
22634: *
22635: * HERE AFTER COMPLETING TRACE
22636: *
22637: RTN05 MOV (XS)+,XR POP PFBLK POINTER
22638: MOV (XS)+,WA POP RETURN TYPE STRING
22639: *
22640: * MERGE HERE IF NO TRACE REQUIRED
22641: *
22642: RTN06 MOV WA,KVRTN SET RTNTYPE KEYWORD
22643: MOV PFVBL(XR),XL LOAD POINTER TO FN VRBLK
22644: EJC
22645: * RETRN (CONTINUED)
22646: *
22647: * GET VALUE OF FUNCTION
22648: *
22649: RTN07 MOV XL,RTNBP SAVE BLOCK POINTER
22650: MOV VRVAL(XL),XL LOAD VALUE
22651: BEQ (XL),=B$TRT,RTN07 LOOP BACK IF TRAPPED
22652: MOV XL,RTNFV ELSE SAVE FUNCTION RESULT VALUE
22653: MOV (XS)+,RTNSV SAVE ORIGINAL FUNCTION VALUE
22654: MOV (XS)+,XL POP SAVED POINTER
22655: BZE XL,RTN7C NO ACTION IF NONE
22656: BZE KVPFL,RTN7C JUMP IF NO PROFILING
22657: JSR PRFLU ELSE PROFILE LAST FUNC STMT
22658: BEQ KVPFL,=NUM02,RTN7A BRANCH ON VALUE OF PROFILE KEYWD
22659: *
22660: * HERE IF &PROFILE = 1. START TIME MUST BE FRIGGED TO
22661: * APPEAR EARLIER THAN IT ACTUALLY IS, BY AMOUNT USED BEFORE
22662: * THE CALL.
22663: *
22664: LDI PFSTM LOAD CURRENT TIME
22665: SBI ICVAL(XL) FRIG BY SUBTRACTING SAVED AMOUNT
22666: BRN RTN7B AND MERGE
22667: *
22668: * HERE IF &PROFILE = 2
22669: *
22670: RTN7A LDI ICVAL(XL) LOAD SAVED TIME
22671: *
22672: * BOTH PROFILE TYPES MERGE HERE
22673: *
22674: RTN7B STI PFSTM STORE BACK CORRECT START TIME
22675: *
22676: * MERGE HERE IF NO PROFILING
22677: *
22678: RTN7C MOV FARGS(XR),WB GET NUMBER OF ARGS
22679: ADD PFNLO(XR),WB ADD NUMBER OF LOCALS
22680: BZE WB,RTN10 JUMP IF NO ARGS/LOCALS
22681: LCT WB,WB ELSE SET LOOP COUNTER
22682: ADD PFLEN(XR),XR AND POINT TO END OF PFBLK
22683: *
22684: * LOOP TO RESTORE FUNCTIONS AND LOCALS
22685: *
22686: RTN08 MOV -(XR),XL LOAD NEXT VRBLK POINTER
22687: *
22688: * LOOP TO FIND VALUE BLOCK
22689: *
22690: RTN09 MOV XL,WA SAVE BLOCK POINTER
22691: MOV VRVAL(XL),XL LOAD POINTER TO NEXT VALUE
22692: BEQ (XL),=B$TRT,RTN09 LOOP BACK IF TRAPPED
22693: MOV WA,XL ELSE RESTORE LAST BLOCK POINTER
22694: MOV (XS)+,VRVAL(XL) RESTORE OLD VARIABLE VALUE
22695: BCT WB,RTN08 LOOP TILL ALL PROCESSED
22696: *
22697: * NOW RESTORE FUNCTION VALUE AND EXIT
22698: *
22699: RTN10 MOV RTNBP,XL RESTORE PTR TO LAST FUNCTION BLOCK
22700: MOV RTNSV,VRVAL(XL) RESTORE OLD FUNCTION VALUE
22701: MOV RTNFV,XR RELOAD FUNCTION RESULT
22702: MOV R$COD,XL POINT TO NEW CODE BLOCK
22703: MOV KVSTN,KVLST SET LASTNO FROM STNO
22704: MOV CDSTM(XL),KVSTN RESET PROPER STNO VALUE
22705: MOV KVRTN,WA LOAD RETURN TYPE
22706: BEQ WA,=SCRTN,EXIXR EXIT WITH RESULT IN XR IF RETURN
22707: BEQ WA,=SCFRT,EXFAL FAIL IF FRETURN
22708: EJC
22709: *
22710: * RETRN (CONTINUED)
22711: *
22712: * HERE FOR NRETURN
22713: *
22714: BEQ (XR),=B$NML,RTN11 JUMP IF IS A NAME
22715: JSR GTNVR ELSE TRY CONVERT TO VARIABLE NAME
22716: ERR 243,FUNCTION RESULT IN NRETURN IS NOT NAME
22717: MOV XR,XL IF OK, COPY VRBLK (NAME BASE) PTR
22718: MOV *VRVAL,WA SET NAME OFFSET
22719: BRN RTN12 AND MERGE
22720: *
22721: * HERE IF RETURNED RESULT IS A NAME
22722: *
22723: RTN11 MOV NMBAS(XR),XL LOAD NAME BASE
22724: MOV NMOFS(XR),WA LOAD NAME OFFSET
22725: *
22726: * MERGE HERE WITH RETURNED NAME IN (XL,WA)
22727: *
22728: RTN12 MOV XL,XR PRESERVE XL
22729: LCW WB LOAD NEXT WORD
22730: MOV XR,XL RESTORE XL
22731: BEQ WB,=OFNE$,EXNAM EXIT IF CALLED BY NAME
22732: MOV WB,-(XS) ELSE SAVE CODE WORD
22733: JSR ACESS GET VALUE
22734: PPM EXFAL FAIL IF ACCESS FAILS
22735: MOV XR,XL IF OK, COPY RESULT
22736: MOV (XS),XR RELOAD NEXT CODE WORD
22737: MOV XL,(XS) STORE RESULT ON STACK
22738: MOV (XR),XL LOAD ROUTINE ADDRESS
22739: BRI XL JUMP TO EXECUTE NEXT CODE WORD
22740: EJC
22741: *
22742: * STCOV -- SIGNAL STATEMENT COUNTER OVERFLOW
22743: *
22744: * BRN STCOV JUMP TO SIGNAL STATEMENT COUNT OFLO
22745: *
22746: * PERMIT UP TO 10 MORE STATEMENTS TO BE OBEYED SO THAT
22747: * SETEXIT TRAP CAN REGAIN CONTROL.
22748: * STCOV CONTINUES BY ISSUING THE ERROR MESSAGE
22749: *
22750: STCOV RTN
22751: ICV ERRFT FATAL ERROR
22752: LDI INTVT GET 10
22753: ADI KVSTL ADD TO FORMER LIMIT
22754: STI KVSTL STORE AS NEW STLIMIT
22755: LDI INTVT GET 10
22756: STI KVSTC SET AS NEW COUNT
22757: ERB 244,STATEMENT COUNT EXCEEDS VALUE OF STLIMIT KEYWORD
22758: EJC
22759: *
22760: * STMGO -- START EXECUTION OF NEW STATEMENT
22761: *
22762: * (XR) POINTER TO CDBLK FOR NEW STATEMENT
22763: * BRN STMGO JUMP TO EXECUTE NEW STATEMENT
22764: *
22765: * STMGO CONTINUES BY EXECUTING THE NEXT STATEMENT
22766: *
22767: STMGO RTN
22768: MOV XR,R$COD SET NEW CODE BLOCK POINTER
22769: BZE KVPFL,STGO1 SKIP IF NO PROFILING
22770: JSR PRFLU ELSE PROFILE THE STATEMENT
22771: STGO1 MOV KVSTN,KVLST SET LASTNO
22772: MOV CDSTM(XR),KVSTN SET STNO
22773: ADD *CDCOD,XR POINT TO FIRST CODE WORD
22774: LCP XR SET CODE POINTER
22775: LDI KVSTC GET STMT COUNT
22776: ILT EXITS OMIT COUNTING IF NEGATIVE
22777: IEQ STCOV FAIL IF STLIMIT REACHED
22778: SBI INTV1 DECREMENT
22779: STI KVSTC REPLACE IT
22780: BZE R$STC,EXITS EXIT IF NO STCOUNT TRACE
22781: *
22782: * HERE FOR STCOUNT TRACE
22783: *
22784: ZER XR CLEAR GARBAGE VALUE IN XR
22785: MOV R$STC,XL LOAD POINTER TO STCOUNT TRBLK
22786: JSR KTREX EXECUTE KEYWORD TRACE
22787: BRN EXITS AND THEN EXIT FOR NEXT CODE WORD
22788: EJC
22789: *
22790: * STOPR -- TERMINATE RUN
22791: *
22792: * (XR) POINTS TO ENDING MESSAGE
22793: * BRN STOPR JUMP TO TERMINATE RUN
22794: *
22795: * TERMINATE RUN AND PRINT STATISTICS. ON ENTRY XR POINTS
22796: * TO ENDING MESSAGE OR IS ZERO IF MESSAGE PRINTED ALREADY.
22797: *
22798: STOPR RTN
22799: BZE XR,STPRA SKIP IF SYSAX ALREADY CALLED (REG04)
22800: JSR SYSAX CALL AFTER EXECUTION PROC
22801: STPRA ADD RSMEM,DNAME USE THE RESERVE MEMORY
22802: BNE XR,=ENDMS,STPR0 SKIP IF NOT NORMAL END MESSAGE
22803: BNZ EXSTS,STPR3 SKIP IF EXEC STATS SUPPRESSED
22804: ZER ERICH CLEAR ERRORS TO INT.CH. FLAG
22805: *
22806: * LOOK TO SEE IF AN ENDING MESSAGE IS SUPPLIED
22807: *
22808: STPR0 JSR PRTPG EJECT PRINTER
22809: BZE XR,STPR1 SKIP IF NO MESSAGE
22810: JSR PRTST PRINT MESSAGE
22811: *
22812: * MERGE HERE IF NO MESSAGE TO PRINT
22813: *
22814: STPR1 JSR PRTIS PRINT BLANK LINE
22815: MTI KVSTN GET STATEMENT NUMBER
22816: MOV =STPM1,XR POINT TO MESSAGE /IN STATEMENT XXX/
22817: JSR PRTMX PRINT IT
22818: JSR SYSTM GET CURRENT TIME
22819: SBI TIMSX MINUS START TIME = ELAPSED EXEC TIM
22820: STI STPTI SAVE FOR LATER
22821: MOV =STPM3,XR POINT TO MSG /EXECUTION TIME MSEC /
22822: JSR PRTMX PRINT IT
22823: LDI KVSTL GET STATEMENT LIMIT
22824: ILT STPR2 SKIP IF NEGATIVE
22825: SBI KVSTC MINUS COUNTER = COUNT
22826: STI STPSI SAVE
22827: MOV =STPM2,XR POINT TO MESSAGE /STMTS EXECUTED/
22828: JSR PRTMX PRINT IT
22829: LDI STPTI RELOAD ELAPSED TIME
22830: MLI INTTH *1000 (MICROSECS)
22831: IOV STPR2 JUMP IF WE CANNOT COMPUTE
22832: DVI STPSI DIVIDE BY STATEMENT COUNT
22833: IOV STPR2 JUMP IF OVERFLOW
22834: MOV =STPM4,XR POINT TO MSG (MCSEC PER STATEMENT /
22835: JSR PRTMX PRINT IT
22836: EJC
22837: *
22838: * STOPR (CONTINUED)
22839: *
22840: * MERGE TO SKIP MESSAGE (OVERFLOW OR NEGATIVE STLIMIT)
22841: *
22842: STPR2 MTI GBCNT LOAD COUNT OF COLLECTIONS
22843: MOV =STPM5,XR POINT TO MESSAGE /REGENERATIONS /
22844: JSR PRTMX PRINT IT
22845: JSR PRTIS ONE MORE BLANK FOR LUCK
22846: *
22847: * CHECK IF DUMP REQUESTED
22848: *
22849: STPR3 JSR PRFLR PRINT PROFILE IF WANTED
22850: *
22851: MOV KVDMP,XR LOAD DUMP KEYWORD
22852: JSR DUMPR EXECUTE DUMP IF REQUESTED
22853: MOV R$FCB,XL GET FCBLK CHAIN HEAD
22854: MOV KVABE,WA LOAD ABEND VALUE
22855: MOV KVCOD,WB LOAD CODE VALUE
22856: JSR SYSEJ EXIT TO SYSTEM
22857: EJC
22858: *
22859: * SUCCP -- SIGNAL SUCCESSFUL MATCH OF A PATTERN NODE
22860: *
22861: * SEE PATTERN MATCH ROUTINES FOR DETAILS
22862: *
22863: * (XR) CURRENT NODE
22864: * (WB) CURRENT CURSOR
22865: * (XL) MAY BE NON-COLLECTABLE
22866: * BRN SUCCP SIGNAL SUCCESSFUL PATTERN MATCH
22867: *
22868: * SUCCP CONTINUES BY MATCHING THE SUCCESSOR NODE
22869: *
22870: SUCCP RTN
22871: MOV PTHEN(XR),XR LOAD SUCCESSOR NODE
22872: MOV (XR),XL LOAD NODE CODE ENTRY ADDRESS
22873: BRI XL JUMP TO MATCH SUCCESSOR NODE
22874: EJC
22875: *
22876: * SYSAB -- PRINT /ABNORMAL END/ AND TERMINATE
22877: *
22878: SYSAB RTN
22879: MOV =ENDAB,XR POINT TO MESSAGE
22880: MOV =NUM01,KVABE SET ABEND FLAG
22881: JSR PRTNL SKIP TO NEW LINE
22882: BRN STOPR JUMP TO PACK UP
22883: EJC
22884: *
22885: * SYSTU -- PRINT /TIME UP/ AND TERMINATE
22886: *
22887: SYSTU RTN
22888: MOV =ENDTU,XR POINT TO MESSAGE
22889: MOV STRTU,WA GET CHARS /TU/
22890: MOV WA,KVCOD PUT IN KVCOD
22891: MOV TIMUP,WA CHECK STATE OF TIMEUP SWITCH
22892: MNZ TIMUP SET SWITCH
22893: BNZ WA,STOPR STOP RUN IF ALREADY SET
22894: ERB 245,TRANSLATION/EXECUTION TIME EXPIRED
22895: TTL S P I T B O L -- STACK OVERFLOW SECTION
22896: *
22897: * CONTROL COMES HERE IF THE MAIN STACK OVERFLOWS
22898: *
22899: SEC START OF STACK OVERFLOW SECTION
22900: *
22901: ICV ERRFT FATAL ERROR
22902: MOV FLPTR,XS POP STACK TO AVOID MORE FAILS
22903: BNZ GBCFL,STAK1 JUMP IF GARBAGE COLLECTING
22904: ERB 246,STACK OVERFLOW
22905: *
22906: * NO CHANCE OF RECOVERY IN MID GARBAGE COLLECTION
22907: *
22908: STAK1 MOV =ENDSO,XR POINT TO MESSAGE
22909: ZER KVDMP MEMORY IS UNDUMPABLE
22910: BRN STOPR GIVE UP
22911: TTL S P I T B O L -- ERROR SECTION
22912: *
22913: * THIS SECTION OF CODE IS ENTERED WHENEVER A PROCEDURE
22914: * RETURN VIA AN ERR PARAMETER OR AN ERB OPCODE IS OBEYED.
22915: *
22916: * (WA) IS THE ERROR CODE
22917: *
22918: * THE GLOBAL VARIABLE STAGE INDICATES THE POINT AT WHICH
22919: * THE ERROR OCCURED AS FOLLOWS.
22920: *
22921: * STAGE=STGIC ERROR DURING INITIAL COMPILE
22922: *
22923: * STAGE=STGXC ERROR DURING COMPILE AT EXECUTE
22924: * TIME (CODE, CONVERT FUNCTION CALLS)
22925: *
22926: * STAGE=STGEV ERROR DURING COMPILATION OF
22927: * EXPRESSION AT EXECUTION TIME
22928: * (EVAL, CONVERT FUNCTION CALL).
22929: *
22930: * STAGE=STGXT ERROR AT EXECUTE TIME. COMPILER
22931: * NOT ACTIVE.
22932: *
22933: * STAGE=STGCE ERROR DURING INITIAL COMPILE AFTER
22934: * SCANNING OUT THE END LINE.
22935: *
22936: * STAGE=STGXE ERROR DURING COMPILE AT EXECUTE
22937: * TIME AFTER SCANNING END LINE.
22938: *
22939: * STAGE=STGEE ERROR DURING EXPRESSION EVALUATION
22940: *
22941: SEC START OF ERROR SECTION
22942: *
22943: ERROR BEQ R$CIM,=CMLAB,CMPLE JUMP IF ERROR IN SCANNING LABEL
22944: MOV WA,KVERT SAVE ERROR CODE
22945: ZER SCNRS RESET RESCAN SWITCH FOR SCANE
22946: ZER SCNGO RESET GOTO SWITCH FOR SCANE
22947: MOV STAGE,XR LOAD CURRENT STAGE
22948: BSW XR,STGNO JUMP TO APPROPRIATE ERROR CIRCUIT
22949: IFF STGIC,ERR01 INITIAL COMPILE
22950: IFF STGXC,ERR04 EXECUTE TIME COMPILE
22951: IFF STGEV,ERR04 EVAL COMPILING EXPR.
22952: IFF STGEE,ERR04 EVAL EVALUATING EXPR
22953: IFF STGXT,ERR05 EXECUTE TIME
22954: IFF STGCE,ERR01 COMPILE - AFTER END
22955: IFF STGXE,ERR04 XEQ COMPILE-PAST END
22956: ESW END SWITCH ON ERROR TYPE
22957: EJC
22958: *
22959: * ERROR DURING INITIAL COMPILE
22960: *
22961: * THE ERROR MESSAGE IS PRINTED AS PART OF THE COMPILER
22962: * OUTPUT. THIS PRINTOUT INCLUDES THE OFFENDING LINE (IF NOT
22963: * PRINTED ALREADY) AND AN ERROR FLAG UNDER THE APPROPRIATE
22964: * COLUMN AS INDICATED BY SCNSE UNLESS SCNSE IS SET TO ZERO.
22965: *
22966: * AFTER PRINTING THE MESSAGE, THE GENERATED CODE IS
22967: * MODIFIED TO AN ERROR CALL AND CONTROL IS RETURNED TO
22968: * THE CMPIL PROCEDURE AFTER RESETTING THE STACK POINTER.
22969: *
22970: * IF THE ERROR OCCURS AFTER THE END LINE, CONTROL RETURNS
22971: * IN A SLIGHTLY DIFFERENT MANNER TO ENSURE PROPER CLEANUP.
22972: *
22973: ERR01 MOV CMPXS,XS RESET STACK POINTER
22974: SSL CMPSS RESTORE S-R STACK PTR FOR CMPIL
22975: BNZ ERRSP,ERR03 JUMP IF ERROR SUPPRESS FLAG SET
22976: MOV ERICH,ERLST SET FLAG FOR LISTR
22977: JSR LISTR LIST LINE
22978: JSR PRTIS TERMINATE LISTING
22979: ZER ERLST CLEAR LISTR FLAG
22980: MOV SCNSE,WA LOAD SCAN ELEMENT OFFSET
22981: BZE WA,ERR02 SKIP IF NOT SET
22982: LCT WB,WA LOOP COUNTER
22983: ICV WA INCREASE FOR CH$EX
22984: JSR ALOCS STRING BLOCK FOR ERROR FLAG
22985: MOV XR,WA REMEMBER STRING PTR
22986: PSC XR READY FOR CHARACTER STORING
22987: MOV R$CIM,XL POINT TO BAD STATEMENT
22988: PLC XL READY TO GET CHARS
22989: *
22990: * LOOP TO REPLACE ALL CHARS BUT TABS BY BLANKS
22991: *
22992: ERRA1 LCH WC,(XL)+ GET NEXT CHAR
22993: BEQ WC,=CH$HT,ERRA2 SKIP IF TAB
22994: MOV =CH$BL,WC GET A BLANK
22995: EJC
22996: *
22997: * MERGE TO STORE BLANK OR TAB IN ERROR LINE
22998: *
22999: ERRA2 SCH WC,(XR)+ STORE CHAR
23000: BCT WB,ERRA1 LOOP
23001: MOV =CH$EX,XL EXCLAMATION MARK
23002: SCH XL,(XR) STORE AT END OF ERROR LINE
23003: CSC XR END OF SCH LOOP
23004: MOV =STNPD,PROFS ALLOW FOR STATEMENT NUMBER
23005: MOV WA,XR POINT TO ERROR LINE
23006: JSR PRTST PRINT ERROR LINE
23007: *
23008: * HERE AFTER PLACING ERROR FLAG AS REQUIRED
23009: *
23010: ERR02 JSR ERMSG GENERATE FLAG AND ERROR MESSAGE
23011: ADD =NUM03,LSTLC BUMP PAGE CTR FOR BLANK, ERROR, BLK
23012: ZER XR IN CASE OF FATAL ERROR
23013: BHI ERRFT,=NUM03,STOPR PACK UP IF SEVERAL FATALS
23014: *
23015: * COUNT ERROR, INHIBIT EXECUTION IF REQUIRED
23016: *
23017: ICV CMERC BUMP ERROR COUNT
23018: ADD CSWER,NOXEQ INHIBIT XEQ IF -NOERRORS
23019: BNE STAGE,=STGIC,CMP10 SPECIAL RETURN IF AFTER END LINE
23020: EJC
23021: *
23022: * LOOP TO SCAN TO END OF STATEMENT
23023: *
23024: ERR03 MOV R$CIM,XR POINT TO START OF IMAGE
23025: PLC XR POINT TO FIRST CHAR
23026: LCH XR,(XR) GET FIRST CHAR
23027: BEQ XR,=CH$MN,CMPCE JUMP IF ERROR IN CONTROL CARD
23028: ZER SCNRS CLEAR RESCAN FLAG
23029: MNZ ERRSP SET ERROR SUPPRESS FLAG
23030: JSR SCANE SCAN NEXT ELEMENT
23031: BNE XL,=T$SMC,ERR03 LOOP BACK IF NOT STATEMENT END
23032: ZER ERRSP CLEAR ERROR SUPPRESS FLAG
23033: *
23034: * GENERATE ERROR CALL IN CODE AND RETURN TO CMPIL
23035: *
23036: MOV *CDCOD,CWCOF RESET OFFSET IN CCBLK
23037: MOV =OCER$,WA LOAD COMPILE ERROR CALL
23038: JSR CDWRD GENERATE IT
23039: MOV CWCOF,CMSOC(XS) SET SUCCESS FILL IN OFFSET
23040: MNZ CMFFC(XS) SET FAILURE FILL IN FLAG
23041: JSR CDWRD GENERATE SUCC. FILL IN WORD
23042: BRN CMPSE MERGE TO GENERATE ERROR AS CDFAL
23043: *
23044: * ERROR DURING EXECUTE TIME COMPILE OR EXPRESSION EVALUATIO
23045: *
23046: * EXECUTE TIME COMPILATION IS INITIATED THROUGH GTCOD OR
23047: * GTEXP WHICH ARE CALLED BY COMPILE, CODE OR EVAL.
23048: * BEFORE CAUSING STATEMENT FAILURE THROUGH EXFAL IT IS
23049: * HELPFUL TO SET KEYWORD ERRTEXT AND FOR GENERALITY
23050: * THESE ERRORS MAY BE HANDLED BY THE SETEXIT MECHANISM.
23051: *
23052: ERR04 ZER R$CCB FORGET GARBAGE CODE BLOCK
23053: SSL INISS RESTORE MAIN PROG S-R STACK PTR
23054: JSR ERTEX GET FAIL MESSAGE TEXT
23055: DCA XS ENSURE STACK OK ON LOOP START
23056: *
23057: * POP STACK UNTIL FIND FLPTR FOR MOST DEEPLY NESTED PROG.
23058: * DEFINED FUNCTION CALL OR CALL OF EVAL / CODE.
23059: *
23060: ERRA4 ICA XS POP STACK
23061: BEQ XS,FLPRT,ERRC4 JUMP IF PROG DEFINED FN CALL FOUND
23062: BNE XS,GTCEF,ERRA4 LOOP IF NOT EVAL OR CODE CALL YET
23063: MOV =STGXT,STAGE RE-SET STAGE FOR EXECUTE
23064: MOV R$GTC,R$COD RECOVER CODE PTR
23065: MOV XS,FLPTR RESTORE FAIL POINTER
23066: ZER R$CIM FORGET POSSIBLE IMAGE
23067: *
23068: * TEST ERRLIMIT
23069: *
23070: ERRB4 BNZ KVERL,ERR07 JUMP IF ERRLIMIT NON-ZERO
23071: BRN EXFAL FAIL
23072: *
23073: * RETURN FROM PROG. DEFINED FUNCTION IS OUTSTANDING
23074: *
23075: ERRC4 MOV FLPTR,XS RESTORE STACK FROM FLPTR
23076: BRN ERRB4 MERGE
23077: EJC
23078: *
23079: * ERROR AT EXECUTE TIME.
23080: *
23081: * THE ACTION TAKEN ON AN ERROR IS AS FOLLOWS.
23082: *
23083: * IF ERRLIMIT KEYWORD IS ZERO, AN ABORT IS SIGNALLED,
23084: * SEE CODING FOR SYSTEM LABEL ABORT AT L$ABO.
23085: *
23086: * OTHERWISE, ERRLIMIT IS DECREMENTED AND AN ERRTYPE TRACE
23087: * GENERATED IF REQUIRED. CONTROL RETURNS EITHER VIA A JUMP
23088: * TO CONTINUE (TO TAKE THE FAILURE EXIT) OR A SPECIFIED
23089: * SETEXIT TRAP IS EXECUTED AND CONTROL PASSES TO THE TRAP.
23090: * IF 3 OR MORE FATAL ERRORS OCCUR AN ABORT IS SIGNALLED
23091: * REGARDLESS OF ERRLIMIT AND SETEXIT - LOOPING IS ALL TOO
23092: * PROBABLE OTHERWISE. FATAL ERRORS INCLUDE STACK OVERFLOW
23093: * AND EXCEEDING STLIMIT.
23094: *
23095: ERR05 SSL INISS RESTORE MAIN PROG S-R STACK PTR
23096: BNZ DMVCH,ERR08 JUMP IF IN MID-DUMP
23097: *
23098: * MERGE HERE FROM ERR08
23099: *
23100: ERR06 BZE KVERL,LABO1 ABORT IF ERRLIMIT IS ZERO
23101: JSR ERTEX GET FAIL MESSAGE TEXT
23102: *
23103: * MERGE FROM ERR04
23104: *
23105: ERR07 BGE ERRFT,=NUM03,LABO1 ABORT IF TOO MANY FATAL ERRORS
23106: DCV KVERL DECREMENT ERRLIMIT
23107: MOV R$ERT,XL LOAD ERRTYPE TRACE POINTER
23108: JSR KTREX GENERATE ERRTYPE TRACE IF REQUIRED
23109: MOV R$COD,R$CNT SET CDBLK PTR FOR CONTINUATION
23110: MOV FLPTR,XR SET PTR TO FAILURE OFFSET
23111: MOV (XR),STXOF SAVE FAILURE OFFSET FOR CONTINUE
23112: MOV R$SXC,XR LOAD SETEXIT CDBLK POINTER
23113: BZE XR,LCNT1 CONTINUE IF NO SETEXIT TRAP
23114: ZER R$SXC ELSE RESET TRAP
23115: MOV =NULLS,STXVR RESET SETEXIT ARG TO NULL
23116: MOV (XR),XL LOAD PTR TO CODE BLOCK ROUTINE
23117: BRI XL EXECUTE FIRST TRAP STATEMENT
23118: *
23119: * INTERRUPTED PARTLY THROUGH A DUMP WHILST STORE IS IN A
23120: * MESS SO DO A TIDY UP OPERATION. SEE DUMPR FOR DETAILS.
23121: *
23122: ERR08 MOV DMVCH,XR CHAIN HEAD FOR AFFECTED VRBLKS
23123: BZE XR,ERR06 DONE IF ZERO
23124: MOV (XR),DMVCH SET NEXT LINK AS CHAIN HEAD
23125: JSR SETVR RESTORE VRGET FIELD
23126: BRN ERR08 LOOP THROUGH CHAIN
23127: TTL S P I T B O L -- HERE ENDETH THE CODE
23128: *
23129: * END OF ASSEMBLY
23130: *
23131: END END MACRO-SPITBOL ASSEMBLY
23132:
23133:
23134:
23135:
23136:
23137:
23138:
23139:
23140:
23141:
23142:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.