|
|
1.1 root 1: * CHANGES [SGD]
2: * -------------
3: * 1. COMMENTED OUT DEFAULT .DEF, .UNDEF AS THESE MACHINE-
4: * DEPENDENT. I SUGGEST AGAIN THAT THESE DO NOT BELONG
5: * IN MINIMAL SOURCE, UNLESS SOMETHING OF THE FORM .*DEF
6: * IS TO BE INCORPORTATED INTO MINIMAL LANGUAGE DEFN.
7: *
8: * 2. NOTED THAT DESCRIPTION OF BEV, BOD MISSING FROM
9: * SBL42.CMT MINIMAL DESCRIPTION, AND DISCUSSION OF
10: * "ODD"/"EVEN" AND REQUIREMENTS PERTAINING THERETO
11: * SEEMS INSUFFICIENT.
12: *
13: * 3. PERMIT CODE KEYWORD TO CONTAIN ANY INTEGER VALUE.
14: * THIS CONSISTS OF REMOVING THE ENFORCED RESTRICTION
15: * IN ASIGN (SEE ASG24), SINCE CODE CONTAINS NO RELOC.
16: * USE OF KEYWORD VALUE (AS IT SHOULDNT). SBL DOC.
17: * MUST BE UPDATED. ADDRESS OF CODE VALUE NOW PASSED TO
18: * OSINT (KVCOD), INSTEAD OF VALUE ITSELF. HENCE OSINT
19: * DOCUMENTATION MUST LIKEWISE BE REVISED. CHANGES
20: * MADE IN KEYWORD DEFINITION TABLES, PROCEDURES ACESS
21: * AND ASIGN SINCE CODE NOW SPECIAL KEYWORD.
22: *
23: * EROSI RETURNS NOW CONTAIN NEW CODE KEYWORD VALUE IN
24: * IA. OSINT DOCUMENTATION MUST BE REVISED.
25: *
26: * INTERESTINGLY, THIS SHOULD PERMIT THE SPITBOL PROGRAM
27: * TO INTERROGATE THE CODE KEYWORD AT THE START OF
28: * EXECUTION TO DETERMINE IF COMPILATION ERRORS
29: * OCCURRED.
30: *
31: * 4. ADD -COPY "FILETAG" CONTROL CARD. -COPY PERMITTED IN
32: * CODE STRINGS. NESTING IS PERMITTED TO ANY LEVEL,
33: * THOUGH OSINT IS FREE TO RESTRICT THE MAXIMUM LEVEL.
34: * NOTE REQUIREMENT FOR FILETAG SPECIFIED AS
35: * STRING CONSTANT SINCE FILETAGS MAY CONTAIN SEMICOLONS.
36: * I HAVE TRIED TO MAKE THIS ENHANCEMENT WITH MINIMUM
37: * (MINIMAL?) AMOUNT OF NEW CODE, SO THE FEATURE IS
38: * NOT CONDITIONALIZED. THE SOLUTION
39: * REQUIRED THE ADDITION OF A NEW BLOCK TYPE (COBLK) TO
40: * BUILD THE INPUT CONTEXT SAVE STACK AS A CHAIN OF
41: * COBLKS. A RECUSIVE SOLUTION ON CMPIL/READR/NEXTS
42: * WOULD HAVE REQUIRED EXTENSIVE MODIFICATIONS AND
43: * SUBSTANTIAL NEW CODE. NOTE THAT FORMS SUCH AS
44: * CODE('-COPY "FILE.SBL"') ARE ACCEPTABLE, WHICH IS
45: * VIEWED AS SIGNIFICANT ENHANCEMENT IN ADDITION TO
46: * COMPILE-TIME INCLUDE.
47: *
48: * TO SUPPORT THIS FEATURE, TWO NEW OSINT ROUTINES ARE
49: * DEFINED, SYSSC (START COPY) AND SYSEC (END COPY) WITH
50: * LOGICS DESCRIBED IN THE .CMT FILE.
51: *
52: * BECAUSE OF ANNOYANCE FACTOR, SOURCE LISTING OF
53: * CODE() INFO VIA -LIST, INCLUDING -COPY INPUT, IS
54: * NO LONGER POSSIBLE. IF THIS IS PERMITTED, THEN
55: * ONE FINDS -COPY INPUT BEING PRINTED ON STD.
56: * OUTPUT CHANNEL (DEPENDING ON STATE OF -LIST),
57: * UNLESS EXPLICIT -NOLIST IS GIVEN.
58: *
59: * 5. THE DOCUMENTATION FOR SYSIO IS INCONSISTENT. IT
60: * SHOWS 0,1,2,3 BEING POSSIBLE INPUTS DEPENDING ON
61: * INPUT/OUTPUT, STD/NONSTD. HOWEVER, IT ALSO APPEARS
62: * (AND IS STATED) THAT SYSIO IS NOT CALLED FOR STD
63: * INPUT/OUTPUT.
64: *
65: * 6. SINCE -PRINT,-NOPRINT REMOVED IN V4, I HAVE
66: * REINSTATED THE CIRCUIT IN NEXTS TO AVOID LISTING
67: * CONTROL CARDS (-COPY FORCES LIST IN CNCRD THOUGH).
68: *
69: * 7. WA NOW CONTAINS THE INITIAL VALUE OF &CODE ON ENTRY
70: * TO SPITBOL.
71: *
72: * 8. ADDED DDC (DEFINE DISPLAY CONSTANT). IS IDENTICAL
73: * TO DTC EXCEPT THAT ON SYSTEMS SUPPORTING LOWER CASE,
74: * THE DISPLAY TEXT CAN BE TRANSLATED WITH A
75: * CASE MIX. FOR EXAMPLE, CAPITALIZE ONLY THE FIRST
76: * LETTER, OR THE FIRST LETTER OF EVERY WORD, OR NO
77: * UPPER CASE (FOR EUNICHS), ETC.
78: *
79: * 9. FIX MINOR OVERSIGHT IN FAILING TO CLEAR R$PMB AT
80: * END OF PATTERN MATCH, THUS LEAVING PTR TO BCBLK
81: * THAT CANNOT BE COLLECTED.
82: *
83: * 10. AFTER CONSULTATION WITH DAVE SHIELDS, IT WAS AGREED
84: * TO REINSTATE ARG,FIELD,ITEM AND LOCAL FUNCTIONS.
85: * COMMENTS WERE RECEIVED THAT REMOVING THEM BREAKS
86: * EXISTING CODE IN DIFFICULT-TO-FIX WAYS, INCLUDING
87: * A NUMBER OF THE UTILITY ROUTINES IN GIMPELS BOOK.
88: * IN ANY EVENT, THESE ARE SNOBOL4 COMPATIBILITY
89: * FUNCTIONS THAT TAKE LITTLE CODE SPACE. AS A
90: * RESULT OF THIS, AND -COPY, ERROR NUMBERS HAVE
91: * BEEN PUSHED BACK OVER THE 255 THRESHOLD, WHICH
92: * SEEMS UNAVOIDABLE UNLESS MAJOR SURGERY IS DONE.
93: *
94: * 11. VERSION ID CHANGED TO V4.3 DUE TO SUBSTANTIAL
95: * CHANGES.
96: *
97: * 12. PERMIT DOLLAR SIGN IN VARIABLE NAMES. MINOR
98: * CHANGE TO OPERATOR TABLE AND SCANE.
99: *
100: * 13. PERMIT BUFFER TYPE FOR LOAD SPECIFICATION. AS
101: * A SIDE-EFFECT, THE CODE FOR BUFFER CONVERSION HAS
102: * BEEN CENTRALIZED IN GTBUF. ALSO FIXED PADDING
103: * BUG IN INSBF RELATED TO ZERO PADDING.
104: *
105: * 14. DOCUMENT THAT SYSIL MUST NEVER REQUEST ZERO BYTES.
106: * DOING SO CAUSES ACESS TO POTENTIALLY CREATE
107: * INVALID MEMORY CAUSING LATER GARBAGE COLLECTOR
108: * PROBLEMS OR MISADJUSTMENTS OF DNAMP, ETC.
109: *
110: * 15. VDIFFER FUNCTION ADDED. VDIFFER(X,Y) RETURNS X
111: * IF DIFFERENT FROM Y. IN MOST CASES IT IS EXPECTED
112: * THAT Y WOULD BE NULL.
113: *
114: SEC FORMAL START OF PROCEDURES SECTION
115: EJC
116: *
117: * SPITBOL CONDITIONAL ASSEMBLY SYMBOLS
118: * ------------------------------------
119: *
120: * IN THE SPITBOL TRANSLATOR, THE FOLLOWING CONDITIONAL
121: * ASSEMBLY SYMBOLS ARE REFERRED TO.
122: * A PARTICULAR SET OF DEFAULT SETTINGS IS GIVEN IN THIS
123: * SOURCE BY USE OF .DEF AND .UNDEF PSEUDO OPS.
124: * A DIFFERENT SELECTION MAY BE MADE BY VARYING THE
125: * DEFINITIONS. AS AN ALTERNATIVE, THIS SECTION MAY BE
126: * COMMENTED OUT AND THE MINIMAL TRANSLATOR PRELOADED WITH
127: * THE SELECTED DEFINITIONS, THUS ALLOWING A MORE DYNAMIC
128: * CHOICE TO BE MADE.
129: * SOME OF THE CONDITIONAL FEATURES CHOOSE AMONGST A VARIETY
130: * OF OPTIONS. OTHERS ARE DEFINED PRINCIPALLY TO ALLOW
131: * OMISSION OF A FEATURE WHICH IS NOT WANTED IN ORDER TO
132: * SAVE MEMORY OR BECAUSE IT CANNOT BE SUPPORTED.
133: * NOTE THAT IF .CPLC OPTION IS CHOSEN, TRANSLATION OF DTC,
134: * ERR, ERB ARGUMENTS SHOULD BE TO LOWER CASE.
135: *
136: *.DEF .CAHT DEFINE TO INCLUDE HORIZONTAL TAB
137: *.DEF .CASL DEFINE TO INCLUDE 26 SHIFTED LETTRS
138: *.DEF .CAVT DEFINE TO INCLUDE VERTICAL TAB
139: *.UNDEF .CEPP DEFINE FOR ODD PARITY ENTRY POINTS
140: *.UNDEF .CNBF DEFINE TO OMIT BUFFER EXTENSION
141: *.UNDEF .CNBT DEFINE TO OMIT BATCH INITIALISATION
142: *.UNDEF .CNEX DEFINE TO OMIT EXIT() CODE
143: *.UNDEF .CNFN DEFINE TO OMIT FENCE() CODE
144: *.UNDEF .CNLD DEFINE TO OMIT LOAD() CODE
145: *.UNDEF .CNPF DEFINE TO OMIT PROFILE CODE
146: *.UNDEF .CNRA DEFINE TO OMIT ALL REAL ARITHMETIC
147: *.UNDEF .CNSR DEFINE TO OMIT SORT, RSORT CODE
148: *.DEF .CPLC DEFINE IF HOST PREFERS LOWER CASE
149: *.UNDEF .CRPP DEFINE FOR ODD PARITY RETURN POINTS
150: *.UNDEF .CS16 DEFINE TO INITIALIZE STLIM TO 32767
151: *.UNDEF .CSAX DEFINE IF SYSAX IS TO BE CALLED
152: *.UNDEF .CSCI DEFINE TO ENABLE SYSCI ROUTINE
153: *.UNDEF .CSCV DEFINE FOR CLU, CUL CASE CONVERSION
154: *.DEF .CSIG DEFINE TO IGNORE CASE OF LETTERS
155: *.UNDEF .CSN6 DEFINE TO PAD STMT NOS TO 6 CHARS
156: *.DEF .CSN8 DEFINE TO PAD STMT NOS TO 8 CHARS
157: *.UNDEF .CTMD DEFINE IF SYSTM UNIT IS DECISECOND
158: .IF .CASL
159: .ELSE
160: .UNDEF .CSIG .CSIG USELESS WITHOUT LC LETTERS
161: .UNDEF .CPLC .CPLC ERRONEOUS WITHOUT LC LETTERS
162: .FI
163: EJC
164: *
165: * ACTUAL PROCESSABLE EXP PROCEDURE DEFINITIONS
166: *
167: .IF .CSAX
168: SYSAX EXP E,0
169: .ELSE
170: .FI
171: SYSBX EXP E,0
172: .IF .CSCI
173: SYSCI EXP E,0
174: .FI
175: SYSDT EXP E,0
176: SYSEC EXP E,2
177: SYSEF EXP E,2
178: SYSEJ EXP E,0
179: SYSEM EXP E,0
180: SYSEN EXP E,2
181: SYSEP EXP E,2
182: .IF .CNLD
183: .ELSE
184: SYSEX EXP E,1
185: .FI
186: SYSHS EXP E,2
187: SYSID EXP E,0
188: SYSIL EXP E,0
189: SYSIN EXP E,2
190: SYSIO EXP E,2
191: .IF .CNLD
192: .ELSE
193: SYSLD EXP E,2
194: .FI
195: SYSMM EXP E,0
196: SYSMX EXP E,0
197: SYSOU EXP E,2
198: SYSPI EXP E,2
199: SYSPP EXP E,0
200: SYSPR EXP E,2
201: SYSRD EXP E,2
202: SYSRI EXP E,2
203: SYSSC EXP E,2
204: .IF .CUST
205: SYSST EXP E,2
206: .FI
207: SYSTM EXP E,0
208: SYSTT EXP E,0
209: .IF .CNLD
210: .ELSE
211: SYSUL EXP E,0
212: .FI
213: .IF .CNEX
214: .ELSE
215: SYSXI EXP E,2
216: .FI
217: EJC
218: * NAME GLOBAL LABELS, INTERNAL PROCEDURES AND ROUTINES.
219: *
220: CMPCE GLB
221: CMPEL GLB
222: CMPLE GLB
223: CMPSE GLB
224: EVLXF GLB
225: EVLXN GLB
226: EVLXV GLB
227: LCNXE GLB
228: TRXQR GLB
229: ACESS INP R,1
230: ACOMP INP N,5
231: ALLOC INP E,0
232: .IF .CNBF
233: .ELSE
234: ALOBF INP E,0
235: .FI
236: ALOCS INP E,0
237: ALOST INP E,0
238: .IF .CNRA
239: ARITH INP N,2
240: .ELSE
241: ARITH INP N,3
242: .FI
243: ASIGN INP R,1
244: ASINP INP R,1
245: BLKLN INP E,0
246: CBLCK INP N,1
247: CDGCG INP E,0
248: CDGEX INP R,0
249: CDGNM INP R,0
250: CDGVL INP R,0
251: CDWRD INP E,0
252: CMGEN INP R,0
253: CMPIL INP E,0
254: CNCRD INP E,0
255: COPND INP E,0
256: DFFNC INP E,0
257: DTYPE INP E,0
258: DUMPR INP E,0
259: ERMSG INP E,0
260: ERTEX INP E,0
261: EVALI INP R,3
262: EVALP INP R,1
263: EVALS INP R,2
264: EVALX INP R,1
265: EXBLD INP E,0
266: EXPAN INP E,0
267: EXPAP INP E,1
268: EXPDM INP N,0
269: EXPOP INP N,0
270: GBCOL INP E,0
271: GBCPF INP E,0
272: GTARR INP E,1
273: .IF .CNBF
274: .ELSE
275: GTBUF INP E,1
276: .FI
277: EJC
278: GTCOD INP E,1
279: GTEXP INP E,1
280: GTINT INP E,1
281: GTNUM INP E,1
282: GTNVR INP E,1
283: GTPAT INP E,1
284: .IF .CNRA
285: .ELSE
286: GTREA INP E,1
287: .FI
288: GTSMI INP N,2
289: GTSTG INP N,1
290: GTVAR INP E,1
291: HASHS INP E,0
292: ICBLD INP E,0
293: IDENT INP E,1
294: INOUT INP E,0
295: .IF .CNBF
296: .ELSE
297: INSBF INP E,2
298: .FI
299: IOFTG INP N,1
300: IOPUT INP N,4
301: KTREX INP R,0
302: KWNAM INP N,0
303: LCOMP INP N,5
304: LISTR INP E,0
305: LISTT INP E,0
306: NEXTS INP E,0
307: PATIN INP N,2
308: PATST INP N,1
309: PBILD INP E,0
310: PCONC INP E,0
311: PCOPY INP N,0
312: .IF .CNPF
313: .ELSE
314: PRFLR INP E,0
315: PRFLU INP E,0
316: .FI
317: PRPAR INP E,0
318: PRTCF INP E,0
319: PRTCH INP E,0
320: PRTFB INP E,0
321: PRTFH INP R,0
322: PRTIN INP E,0
323: PRTMI INP E,0
324: PRTNM INP R,0
325: PRTNV INP E,0
326: PRTPG INP E,0
327: PRTPS INP E,0
328: PRTSF INP E,0
329: PRTSN INP E,0
330: PRTST INP R,0
331: EJC
332: PRTVF INP E,0
333: PRTVL INP R,0
334: PRTVN INP E,0
335: PTTFH INP E,0
336: PTTST INP E,0
337: .IF .CNRA
338: .ELSE
339: RCBLD INP E,0
340: .FI
341: READR INP E,0
342: .IF .CASL
343: SBSCC INP E,0
344: SBSTG INP E,0
345: .FI
346: SBSTR INP E,0
347: SCANE INP E,0
348: SCNGF INP E,0
349: SETVR INP E,0
350: .IF .CNSR
351: .ELSE
352: SORTA INP N,1
353: SORTC INP E,1
354: SORTF INP E,0
355: SORTH INP N,0
356: .FI
357: TFIND INP E,1
358: TRACE INP N,3
359: TRBLD INP E,0
360: TRCHN INP E,1
361: TRIMR INP E,0
362: TRXEQ INP R,0
363: XSCAN INP E,0
364: XSCNI INP N,2
365: ARREF INR
366: CFUNC INR
367: EROSI INR
368: ERROR INR
369: EXFAL INR
370: EXINT INR
371: EXITS INR
372: EXIXR INR
373: EXNAM INR
374: EXNUL INR
375: .IF .CNRA
376: .ELSE
377: EXREA INR
378: .FI
379: EXSID INR
380: EXVNM INR
381: FAILP INR
382: FLPOP INR
383: INDIR INR
384: INITL INR
385: MATCH INR
386: RETRN INR
387: STAKV INR
388: STCOV INR
389: STMGO INR
390: STOPR INR
391: SUCCP INR
392: TTL S P I T B O L -- DEFINITIONS AND DATA STRUCTURES
393: * THIS SECTION CONTAINS ALL SYMBOL DEFINITIONS AND ALSO
394: * PICTURES OF ALL DATA STRUCTURES USED IN THE SYSTEM.
395: *
396: SEC START OF DEFINITIONS SECTION
397: *
398: * DEFINITIONS OF MACHINE PARAMETERS
399: *
400: * THE MINIMAL TRANSLATOR SHOULD SUPPLY APPROPRIATE VALUES
401: * FOR THE PARTICULAR TARGET MACHINE FOR ALL THE
402: * EQU *
403: * DEFINITIONS GIVEN AT THE START OF THIS SECTION.
404: * NOTE THAT EVEN IF CONDITIONAL ASSEMBLY IS USED TO OMIT
405: * SOME FEATURE (E.G. REAL ARITHMETIC) A FULL SET OF CFP$-
406: * VALUES MUST BE SUPPLIED. USE DUMMY VALUES IF GENUINE
407: * ONES ARE NOT NEEDED.
408: *
409: CFP$A EQU * NUMBER OF CHARACTERS IN ALPHABET
410: *
411: CFP$B EQU * BAUS/WORD ADDRESSING FACTOR
412: *
413: CFP$C EQU * NUMBER OF CHARACTERS PER WORD
414: *
415: CFP$F EQU * OFFSET IN BAUS TO CHARS IN
416: * SCBLK. SEE SCBLK FORMAT.
417: *
418: CFP$I EQU * NUMBER OF WORDS IN INTEGER CONSTANT
419: *
420: CFP$M EQU * MAX POSITIVE INTEGER IN ONE WORD
421: *
422: CFP$N EQU * NUMBER OF BITS IN ONE WORD
423: *
424: CFP$R EQU * NUMBER OF WORDS IN REAL CONSTANT
425: *
426: CFP$S EQU * NUMBER OF SIG DIGS FOR REAL OUTPUT
427: *
428: * THE FOLLOWING DEFINITION FOR CFP$U SUPPLIES A REALISTIC
429: * UPPER BOUND ON THE SIZE OF THE ALPHABET. CFP$U IS USED
430: * TO SAVE SPACE IN THE SCANE BSW-IFF-ESW TABLE AND TO EASE
431: * TRANSLATION STORAGE REQUIREMENTS.
432: *
433: CFP$U EQU * REALISTIC UPPER BOUND ON ALPHABET
434: *
435: CFP$X EQU * MAX DIGITS IN REAL EXPONENT
436: *
437: MXDGS EQU CFP$S+CFP$X MAX DIGITS IN REAL NUMBER
438: *
439: NSTMX EQU MXDGS+5 MAX SPACE FOR REAL (FOR +0.E+)
440: EJC
441: *
442: * ENVIRONMENT PARAMETERS
443: *
444: * THE SPITBOL PROGRAM IS ESSENTIALLY INDEPENDENT OF
445: * THE DEFINITIONS OF THESE PARAMETERS. HOWEVER, THE
446: * EFFICIENCY OF THE SYSTEM MAY BE AFFECTED. CONSEQUENTLY,
447: * THESE PARAMETERS MAY REQUIRE TUNING FOR A GIVEN VERSION
448: * THE VALUES GIVEN IN COMMENTS HAVE BEEN SUCCESSFULLY USED.
449: *
450: * E$SRS IS THE NUMBER OF WORDS TO RESERVE AT THE END OF
451: * STORAGE FOR END OF RUN PROCESSING. IT SHOULD BE
452: * SET AS SMALL AS POSSIBLE WITHOUT CAUSING MEMORY OVERFLOW
453: * IN CRITICAL SITUATIONS (E.G. MEMORY OVERFLOW TERMINATION)
454: * AND SHOULD THUS RESERVE SUFFICIENT SPACE AT LEAST FOR
455: * AN SCBLK CONTAINING SAY 30 CHARACTERS.
456: *
457: E$SRS EQU * 30 WORDS
458: *
459: * E$STS IS THE NUMBER OF WORDS GRABBED IN A CHUNK WHEN
460: * STORAGE IS ALLOCATED IN THE STATIC REGION. THE MINIMUM
461: * PERMITTED VALUE IS 256/CFP$B. LARGER VALUES WILL LEAD
462: * TO INCREASED EFFICIENCY AT THE COST OF WASTING MEMORY.
463: *
464: E$STS EQU * 500 WORDS
465: *
466: * E$CBS IS THE SIZE OF CODE BLOCK ALLOCATED INITIALLY AND
467: * THE EXPANSION INCREMENT IF OVERFLOW OCCURS. IF THIS VALUE
468: * IS TOO SMALL OR TOO LARGE, EXCESSIVE GARBAGE COLLECTIONS
469: * WILL OCCUR DURING COMPILATION AND MEMORY MAY BE LOST
470: * IN THE CASE OF A TOO LARGE VALUE.
471: *
472: E$CBS EQU * 500 WORDS
473: *
474: * E$HNB IS THE NUMBER OF BUCKET HEADERS IN THE VARIABLE
475: * HASH TABLE. IT SHOULD ALWAYS BE ODD. LARGER VALUES WILL
476: * SPEED UP COMPILATION AND INDIRECT REFERENCES AT THE
477: * EXPENSE OF ADDITIONAL STORAGE FOR THE HASH TABLE ITSELF.
478: *
479: E$HNB EQU * 127 BUCKET HEADERS
480: *
481: * E$HNW IS THE MAXIMUM NUMBER OF WORDS OF A STRING
482: * NAME WHICH PARTICIPATE IN THE STRING HASH ALGORITHM.
483: * LARGER VALUES GIVE A BETTER HASH AT THE EXPENSE OF TAKING
484: * LONGER TO COMPUTE THE HASH. THERE IS SOME OPTIMAL VALUE.
485: *
486: E$HNW EQU * 6 WORDS
487: *
488: * E$FSP . IF THE AMOUNT OF FREE SPACE LEFT AFTER A GARBAGE
489: * COLLECTION IS SMALL COMPARED TO THE TOTAL AMOUNT OF SPACE
490: * IN USE GARBAGE COLLECTOR THRASHING IS LIKELY TO OCCUR AS
491: * THIS SPACE IS USED UP. E$FSP IS A MEASURE OF THE
492: * MINIMUM PERCENTAGE OF DYNAMIC MEMORY LEFT AS FREE SPACE
493: * BEFORE THE SYSTEM ROUTINE SYSMM IS CALLED TO TRY TO
494: * OBTAIN MORE MEMORY.
495: *
496: E$FSP EQU * 15 PERCENT
497: EJC
498: *
499: * DEFINITIONS OF CODES FOR LETTERS
500: *
501: CH$LA EQU * LETTER A
502: CH$LB EQU * LETTER B
503: CH$LC EQU * LETTER C
504: CH$LD EQU * LETTER D
505: CH$LE EQU * LETTER E
506: CH$LF EQU * LETTER F
507: CH$LG EQU * LETTER G
508: CH$LH EQU * LETTER H
509: CH$LI EQU * LETTER I
510: CH$LJ EQU * LETTER J
511: CH$LK EQU * LETTER K
512: CH$LL EQU * LETTER L
513: CH$LM EQU * LETTER M
514: CH$LN EQU * LETTER N
515: CH$LO EQU * LETTER O
516: CH$LP EQU * LETTER P
517: CH$LQ EQU * LETTER Q
518: CH$LR EQU * LETTER R
519: CH$LS EQU * LETTER S
520: CH$LT EQU * LETTER T
521: CH$LU EQU * LETTER U
522: CH$LV EQU * LETTER V
523: CH$LW EQU * LETTER W
524: CH$LX EQU * LETTER X
525: CH$LY EQU * LETTER Y
526: CH$L$ EQU * LETTER Z
527: *
528: * DEFINITIONS OF CODES FOR DIGITS
529: *
530: CH$D0 EQU * DIGIT 0
531: CH$D1 EQU * DIGIT 1
532: CH$D2 EQU * DIGIT 2
533: CH$D3 EQU * DIGIT 3
534: CH$D4 EQU * DIGIT 4
535: CH$D5 EQU * DIGIT 5
536: CH$D6 EQU * DIGIT 6
537: CH$D7 EQU * DIGIT 7
538: CH$D8 EQU * DIGIT 8
539: CH$D9 EQU * DIGIT 9
540: EJC
541: *
542: * DEFINITIONS OF CODES FOR SPECIAL CHARACTERS
543: *
544: * THE NAMES OF THESE CHARACTERS ARE RELATED TO THEIR
545: * ORIGINAL REPRESENTATION IN THE EBCDIC SET CORRESPONDING
546: * TO THE DESCRIPTION IN STANDARD SNOBOL4 MANUALS AND TEXTS.
547: *
548: CH$AM EQU * KEYWORD OPERATOR (AMPERSAND)
549: CH$AS EQU * MULTIPLICATION SYMBOL (ASTERISK)
550: CH$AT EQU * CURSOR POSITION OPERATOR (AT)
551: CH$BB EQU * LEFT ARRAY BRACKET (LESS THAN)
552: CH$BL EQU * BLANK
553: CH$BR EQU * ALTERNATION OPERATOR (VERTICAL BAR)
554: CH$CL EQU * GOTO SYMBOL (COLON)
555: CH$CM EQU * COMMA
556: CH$DL EQU * INDIRECTION OPERATOR (DOLLAR)
557: CH$DT EQU * NAME OPERATOR (DOT)
558: CH$DQ EQU * DOUBLE QUOTE
559: CH$EQ EQU * EQUAL SIGN
560: CH$EX EQU * EXPONENTIATION OPERATOR (EXCLM)
561: CH$MN EQU * MINUS SIGN
562: CH$NM EQU * NUMBER SIGN
563: CH$NT EQU * NEGATION OPERATOR (NOT)
564: CH$PC EQU * PERCENT
565: CH$PL EQU * PLUS SIGN
566: CH$PP EQU * LEFT PARENTHESIS
567: CH$RB EQU * RIGHT ARRAY BRACKET (GRTR THAN)
568: CH$RP EQU * RIGHT PARENTHESIS
569: CH$QU EQU * INTERROGATION OPERATOR (QUESTION)
570: CH$SL EQU * SLASH
571: CH$SM EQU * SEMICOLON
572: CH$SQ EQU * SINGLE QUOTE
573: CH$UN EQU * SPECIAL IDENTIFIER CHAR (UNDERLINE)
574: CH$OB EQU * OPENING BRACKET
575: CH$CB EQU * CLOSING BRACKET
576: EJC
577: *
578: * REMAINING CHARS ARE OPTIONAL ADDITIONS TO THE STANDARDS.
579: * THEY ARE ALL UNDER CONDITIONAL ASSEMBLY.
580: .IF .CAHT
581: *
582: * TAB CHARACTERS - SYNTACTICALLY EQUIVALENT TO BLANK
583: *
584: CH$HT EQU * HORIZONTAL TAB
585: .FI
586: .IF .CAVT
587: CH$VT EQU * VERTICAL TAB
588: .FI
589: .IF .CASL
590: *
591: * LOWER CASE OR SHIFTED CASE ALPHABETIC CHARS
592: *
593: CH$$A EQU * SHIFTED A
594: CH$$B EQU * SHIFTED B
595: CH$$C EQU * SHIFTED C
596: CH$$D EQU * SHIFTED D
597: CH$$E EQU * SHIFTED E
598: CH$$F EQU * SHIFTED F
599: CH$$G EQU * SHIFTED G
600: CH$$H EQU * SHIFTED H
601: CH$$I EQU * SHIFTED I
602: CH$$J EQU * SHIFTED J
603: CH$$K EQU * SHIFTED K
604: CH$$L EQU * SHIFTED L
605: CH$$M EQU * SHIFTED M
606: CH$$N EQU * SHIFTED N
607: CH$$O EQU * SHIFTED O
608: CH$$P EQU * SHIFTED P
609: CH$$Q EQU * SHIFTED Q
610: CH$$R EQU * SHIFTED R
611: CH$$S EQU * SHIFTED S
612: CH$$T EQU * SHIFTED T
613: CH$$U EQU * SHIFTED U
614: CH$$V EQU * SHIFTED V
615: CH$$W EQU * SHIFTED W
616: CH$$X EQU * SHIFTED X
617: CH$$Y EQU * SHIFTED Y
618: CH$$$ EQU * SHIFTED Z
619: .IF .CASL
620: DFA$A EQU CH$$A-CH$LA DIFF BETWEEN LC AND UC LETTERS
621: .FI
622: .FI
623: EJC
624: *
625: * DATA BLOCK FORMATS AND DEFINITIONS
626: *
627: * THE FOLLOWING SECTIONS DESCRIBE THE DETAILED FORMAT OF
628: * ALL POSSIBLE DATA BLOCKS IN STATIC AND DYNAMIC MEMORY.
629: *
630: * EVERY BLOCK HAS A NAME OF THE FORM XXBLK WHERE XX IS A
631: * UNIQUE TWO CHARACTER IDENTIFIER. THE FIRST WORD OF EVERY
632: * BLOCK MUST CONTAIN A POINTER TO A PROGRAM LOCATION IN THE
633: * INTERPRETOR WHICH IS IMMEDIATELY PRECEDED BY AN ADDRESS
634: * CONSTANT CONTAINING THE VALUE BL$XX WHERE XX IS THE BLOCK
635: * IDENTIFIER. THIS PROVIDES A UNIFORM MECHANISM FOR
636: * DISTINGUISHING BETWEEN THE VARIOUS BLOCK TYPES.
637: *
638: * IN SOME CASES, THE CONTENTS OF THE FIRST WORD IS CONSTANT
639: * FOR A GIVEN BLOCK TYPE AND MERELY SERVES AS A POINTER
640: * TO THE IDENTIFYING ADDRESS CONSTANT. HOWEVER, IN OTHER
641: * CASES THERE ARE SEVERAL POSSIBILITIES FOR THE FIRST
642: * WORD IN WHICH CASE EACH OF THE SEVERAL PROGRAM ENTRY
643: * POINTS MUST BE PRECEDED BY THE APPROPRIATE CONSTANT.
644: *
645: * IN EACH BLOCK, SOME OF THE FIELDS ARE RELOCATABLE. THIS
646: * MEANS THAT THEY MAY CONTAIN A POINTER TO ANOTHER BLOCK
647: * IN THE DYNAMIC AREA. (TO BE MORE PRECISE, IF THEY CONTAIN
648: * A POINTER WITHIN THE DYNAMIC AREA, THEN IT IS A POINTER
649: * TO A BLOCK). SUCH FIELDS MUST BE MODIFIED BY THE GARBAGE
650: * COLLECTOR (PROCEDURE GBCOL) WHENEVER BLOCKS ARE COMPACTED
651: * IN THE DYNAMIC REGION. THE GARBAGE COLLECTOR (ACTUALLY
652: * PROCEDURE GBCPF) REQUIRES THAT ALL SUCH RELOCATABLE
653: * FIELDS IN A BLOCK MUST BE CONTIGUOUS.
654: EJC
655: *
656: * THE DESCRIPTION FORMAT USES THE FOLLOWING SCHEME.
657: *
658: * 1) BLOCK TITLE AND TWO CHARACTER IDENTIFIER
659: *
660: * 2) DESCRIPTION OF BASIC USE OF BLOCK AND INDICATION
661: * OF CIRCUMSTANCES UNDER WHICH IT IS CONSTRUCTED.
662: *
663: * 3) PICTURE OF THE BLOCK FORMAT. IN THESE PICTURES LOW
664: * MEMORY ADDRESSES ARE AT THE TOP OF THE PAGE. FIXED
665: * LENGTH FIELDS ARE SURROUNDED BY I (LETTER I). FIELDS
666: * WHICH ARE FIXED LENGTH BUT WHOSE LENGTH IS DEPENDENT
667: * ON A CONFIGURATION PARAMETER ARE SURROUNDED BY *
668: * (ASTERISK). VARIABLE LENGTH FIELDS ARE SURROUNDED
669: * BY / (SLASH).
670: *
671: * 4) DEFINITION OF SYMBOLIC OFFSETS TO FIELDS IN
672: * BLOCK AND OF THE SIZE OF THE BLOCK IF FIXED LENGTH
673: * OR OF THE SIZE OF THE FIXED LENGTH FIELDS IF THE
674: * BLOCK IS VARIABLE LENGTH.
675: * NOTE THAT SOME ROUTINES SUCH AS GBCPF ASSUME
676: * CERTAIN OFFSETS ARE EQUAL. THE DEFINITIONS
677: * GIVEN HERE ENFORCE THIS. MAKE CHANGES TO
678: * THEM ONLY WITH DUE CARE.
679: *
680: * DEFINITIONS OF COMMON OFFSETS
681: *
682: OFFS1 EQU 1
683: OFFS2 EQU 2
684: OFFS3 EQU 3
685: *
686: * 5) DETAILED COMMENTS ON THE SIGNIFICANCE AND FORMATS
687: * OF THE VARIOUS FIELDS.
688: *
689: * THE ORDER IS ALPHABETICAL BY IDENTIFICATION CODE.
690: EJC
691: *
692: * DEFINITIONS OF BLOCK CODES
693: *
694: * THIS TABLE PROVIDES A UNIQUE IDENTIFICATION CODE FOR
695: * EACH SEPARATE BLOCK TYPE. THE FIRST WORD OF A BLOCK IN
696: * THE DYNAMIC AREA ALWAYS CONTAINS THE ADDRESS OF A PROGRAM
697: * ENTRY POINT. THE BLOCK CODE IS USED AS THE ENTRY POINT ID
698: * THE ORDER OF THESE CODES DICTATES THE ORDER OF THE TABLE
699: * USED BY THE DATATYPE FUNCTION (SCNMT IN THE CONSTANT SEC)
700: *
701: * BLOCK CODES FOR ACCESSIBLE DATATYPES
702: *
703: BL$AR EQU 0 ARBLK ARRAY
704: .IF .CNBF
705: BL$CD EQU BL$AR+1 CDBLK CODE
706: .ELSE
707: BL$BC EQU BL$AR+1 BCBLK BUFFER
708: BL$CD EQU BL$BC+1 CDBLK CODE
709: .FI
710: BL$EX EQU BL$CD+1 EXBLK EXPRESSION
711: BL$IC EQU BL$EX+1 ICBLK INTEGER
712: BL$NM EQU BL$IC+1 NMBLK NAME
713: BL$P0 EQU BL$NM+1 P0BLK PATTERN
714: BL$P1 EQU BL$P0+1 P1BLK PATTERN
715: BL$P2 EQU BL$P1+1 P2BLK PATTERN
716: .IF .CNRA
717: BL$SC EQU BL$P2+1 SCBLK STRING
718: .ELSE
719: BL$RC EQU BL$P2+1 RCBLK REAL
720: BL$SC EQU BL$RC+1 SCBLK STRING
721: .FI
722: BL$SE EQU BL$SC+1 SEBLK EXPRESSION
723: BL$TB EQU BL$SE+1 TBBLK TABLE
724: BL$VC EQU BL$TB+1 VCBLK ARRAY
725: BL$XN EQU BL$VC+1 XNBLK EXTERNAL
726: BL$XR EQU BL$XN+1 XRBLK EXTERNAL
727: BL$PD EQU BL$XR+1 PDBLK PROGRAM DEFINED DATATYPE
728: *
729: BL$$D EQU BL$PD+1 NUMBER OF BLOCK CODES FOR DATA
730: *
731: * OTHER BLOCK CODES
732: *
733: BL$TR EQU BL$PD+1 TRBLK
734: .IF .CNBF
735: BL$CC EQU BL$TR+1 CCBLK
736: .ELSE
737: BL$BF EQU BL$TR+1 BFBLK
738: BL$CC EQU BL$BF+1 CCBLK
739: .FI
740: BL$CM EQU BL$CC+1 CMBLK
741: BL$CO EQU BL$CM+1 COBLK
742: BL$CT EQU BL$CO+1 CTBLK
743: BL$DF EQU BL$CT+1 DFBLK
744: BL$EF EQU BL$DF+1 EFBLK
745: BL$EV EQU BL$EF+1 EVBLK
746: BL$FF EQU BL$EV+1 FFBLK
747: BL$KV EQU BL$FF+1 KVBLK
748: BL$PF EQU BL$KV+1 PFBLK
749: BL$TE EQU BL$PF+1 TEBLK
750: *
751: BL$$I EQU 0 DEFAULT IDENTIFICATION CODE
752: BL$$T EQU BL$TR+1 CODE FOR DATA OR TRACE BLOCK
753: BL$$$ EQU BL$TE+1 NUMBER OF BLOCK CODES
754: EJC
755: *
756: * FIELD REFERENCES
757: *
758: * REFERENCES TO THE FIELDS OF DATA BLOCKS ARE SYMBOLIC
759: * (I.E. USE THE SYMBOLIC OFFSETS) WITH THE FOLLOWING
760: * EXCEPTIONS.
761: *
762: * 1) REFERENCES TO THE FIRST WORD ARE USUALLY NOT
763: * SYMBOLIC SINCE THEY USE THE (X) OPERAND FORMAT.
764: *
765: * 2) THE CODE WHICH CONSTRUCTS A BLOCK IS OFTEN NOT
766: * SYMBOLIC AND SHOULD BE CHANGED IF THE CORRESPONDING
767: * BLOCK FORMAT IS MODIFIED.
768: *
769: * 3) THE PLC AND PSC INSTRUCTIONS IMPLY AN OFFSET
770: * CORRESPONDING TO THE DEFINITION OF CFP$F.
771: *
772: * 4) THERE ARE NON-SYMBOLIC REFERENCES (EASILY CHANGED)
773: * IN THE GARBAGE COLLECTOR (PROCEDURES GBCPF, BLKLN).
774: *
775: * 5) THE FIELDS IDVAL, FARGS APPEAR IN SEVERAL BLOCKS
776: * AND ANY CHANGES MUST BE MADE IN PARALLEL TO ALL
777: * BLOCKS CONTAINING THE FIELDS. THE ACTUAL REFERENCES
778: * TO THESE FIELDS ARE SYMBOLIC WITH THE ABOVE
779: * LISTED EXCEPTIONS.
780: *
781: * 6) SEVERAL SPOTS IN THE CODE ASSUME THAT THE
782: * DEFINITIONS OF THE FIELDS VRVAL, TEVAL, TRNXT ARE
783: * THE SAME (THESE ARE SECTIONS OF CODE WHICH SEARCH
784: * OUT ALONG A TRBLK CHAIN FROM A VARIABLE).
785: *
786: * 7) REFERENCES TO THE FIELDS OF AN ARRAY BLOCK IN THE
787: * ARRAY REFERENCE ROUTINE ARREF ARE NON-SYMBOLIC.
788: *
789: * APART FROM THE EXCEPTIONS LISTED, REFERENCES ARE SYMBOLIC
790: * AS FAR AS POSSIBLE AND MODIFYING THE ORDER OR NUMBER
791: * OF FIELDS WILL NOT REQUIRE CHANGES.
792: EJC
793: *
794: * COMMON FIELDS FOR FUNCTION BLOCKS
795: *
796: * BLOCKS WHICH REPRESENT CALLABLE FUNCTIONS HAVE TWO
797: * COMMON FIELDS AT THE START OF THE BLOCK AS FOLLOWS.
798: *
799: * +------------------------------------+
800: * I FCODE I
801: * +------------------------------------+
802: * I FARGS I
803: * +------------------------------------+
804: * / /
805: * / REST OF FUNCTION BLOCK /
806: * / /
807: * +------------------------------------+
808: *
809: FCODE EQU 0 POINTER TO CODE FOR FUNCTION
810: FARGS EQU 1 NUMBER OF ARGUMENTS
811: *
812: * FCODE IS A POINTER TO THE LOCATION IN THE INTERPRETOR
813: * PROGRAM WHICH PROCESSES THIS TYPE OF FUNCTION CALL.
814: *
815: * FARGS IS THE EXPECTED NUMBER OF ARGUMENTS. THE ACTUAL
816: * NUMBER OF ARGUMENTS IS ADJUSTED TO THIS AMOUNT BY
817: * DELETING EXTRA ARGUMENTS OR SUPPLYING TRAILING NULLS
818: * FOR MISSING ONES BEFORE TRANSFERRING THOUGH FCODE.
819: * A VALUE OF 999 MAY BE USED IN THIS FIELD TO INDICATE A
820: * VARIABLE NUMBER OF ARGUMENTS (SEE SVBLK FIELD SVNAR).
821: *
822: * THE BLOCK TYPES WHICH FOLLOW THIS SCHEME ARE.
823: *
824: * FFBLK FIELD FUNCTION
825: * DFBLK DATATYPE FUNCTION
826: * PFBLK PROGRAM DEFINED FUNCTION
827: * EFBLK EXTERNAL LOADED FUNCTION
828: EJC
829: *
830: * IDENTIFICATION FIELD
831: *
832: *
833: * ID FIELD
834: *
835: * CERTAIN PROGRAM ACCESSIBLE OBJECTS (THOSE WHICH CONTAIN
836: * OTHER DATA VALUES AND CAN BE COPIED) ARE GIVEN A UNIQUE
837: * IDENTIFICATION NUMBER (SEE EXSID). THIS ID VALUE IS AN
838: * ADDRESS INTEGER VALUE WHICH IS ALWAYS STORED IN WORD TWO.
839: *
840: IDVAL EQU 1 ID VALUE FIELD
841: *
842: * THE BLOCKS CONTAINING AN IDVAL FIELD ARE.
843: *
844: * ARBLK ARRAY
845: * PDBLK PROGRAM DEFINED DATATYPE
846: * TBBLK TABLE
847: * VCBLK VECTOR BLOCK (ARRAY)
848: *
849: * NOTE THAT A ZERO IDVAL MEANS THAT THE BLOCK IS ONLY
850: * HALF BUILT AND SHOULD NOT BE DUMPED (SEE DUMPR).
851: EJC
852: *
853: * ARRAY BLOCK (ARBLK)
854: *
855: * AN ARRAY BLOCK REPRESENTS AN ARRAY VALUE OTHER THAN ONE
856: * WITH ONE DIMENSION WHOSE LOWER BOUND IS ONE (SEE VCBLK).
857: * AN ARBLK IS BUILT WITH A CALL TO THE FUNCTIONS CONVERT
858: * (S$CNV) OR ARRAY (S$ARR).
859: *
860: * +------------------------------------+
861: * I ARTYP I
862: * +------------------------------------+
863: * I IDVAL I
864: * +------------------------------------+
865: * I ARLEN I
866: * +------------------------------------+
867: * I AROFS I
868: * +------------------------------------+
869: * I ARNDM I
870: * +------------------------------------+
871: * * ARLBD *
872: * +------------------------------------+
873: * * ARDIM *
874: * +------------------------------------+
875: * * *
876: * * ABOVE 2 FLDS REPEATED FOR EACH DIM *
877: * * *
878: * +------------------------------------+
879: * I ARPRO I
880: * +------------------------------------+
881: * / /
882: * / ARVLS /
883: * / /
884: * +------------------------------------+
885: EJC
886: *
887: * ARRAY BLOCK (CONTINUED)
888: *
889: ARTYP EQU 0 POINTER TO DUMMY ROUTINE B$ART
890: ARLEN EQU IDVAL+1 LENGTH OF ARBLK IN BAUS
891: AROFS EQU ARLEN+1 OFFSET IN ARBLK TO ARPRO FIELD
892: ARNDM EQU AROFS+1 NUMBER OF DIMENSIONS
893: ARLBD EQU ARNDM+1 LOW BOUND (FIRST SUBSCRIPT)
894: ARDIM EQU ARLBD+CFP$I DIMENSION (FIRST SUBSCRIPT)
895: ARLB2 EQU ARDIM+CFP$I LOW BOUND (SECOND SUBSCRIPT)
896: ARDM2 EQU ARLB2+CFP$I DIMENSION (SECOND SUBSCRIPT)
897: ARPRO EQU ARDIM+CFP$I ARRAY PROTOTYPE (ONE DIMENSION)
898: ARVLS EQU ARPRO+1 START OF VALUES (ONE DIMENSION)
899: ARPR2 EQU ARDM2+CFP$I ARRAY PROTOTYPE (TWO DIMENSIONS)
900: ARVL2 EQU ARPR2+1 START OF VALUES (TWO DIMENSIONS)
901: ARSI$ EQU ARLBD NUMBER OF STANDARD FIELDS IN BLOCK
902: ARDMS EQU ARLB2-ARLBD SIZE OF INFO FOR ONE SET OF BOUNDS
903: *
904: * THE BOUNDS AND DIMENSION FIELDS ARE SIGNED INTEGER
905: * VALUES AND EACH OCCUPY CFP$I WORDS IN THE ARBLK.
906: *
907: * THE LENGTH OF AN ARBLK IN BAUS MAY NOT EXCEED MXLEN.
908: * THIS IS REQUIRED TO KEEP NAME OFFSETS GARBAGE COLLECTABLE
909: *
910: * THE ACTUAL VALUES ARE ARRANGED IN ROW-WISE ORDER AND
911: * CAN CONTAIN A DATA POINTER OR A POINTER TO A TRBLK.
912: .IF .CNBF
913: .ELSE
914: EJC
915: * BUFFER CONTROL BLOCK (BCBLK)
916: *
917: * A BCBLK IS BUILT FOR EVERY BFBLK.
918: *
919: * +------------------------------------+
920: * I BCTYP I
921: * +------------------------------------+
922: * I IDVAL I
923: * +------------------------------------+
924: * I BCLEN I
925: * +------------------------------------+
926: * I BCBUF I
927: * +------------------------------------+
928: *
929: BCTYP EQU 0 PTR TO DUMMY ROUTINE B$BCT
930: BCLEN EQU IDVAL+1 DEFINED BUFFER LENGTH
931: BCBUF EQU BCLEN+1 PTR TO BFBLK
932: BCSI$ EQU BCBUF+1 SIZE OF BCBLK
933: *
934: * A BCBLK IS AN INDIRECT CONTROL HEADER FOR BFBLK.
935: * THE REASON FOR NOT STORING THIS DATA DIRECTLY
936: * IN THE RELATED BFBLK IS SO THAT THE BFBLK CAN
937: * MAINTAIN THE SAME SKELETAL STRUCTURE AS AN SCBLK
938: * THUS FACILITATING TRANSPARENT STRING OPERATIONS
939: * (FOR THE MOST PART). SPECIFICALLY, CFP$F IS THE
940: * SAME FOR A BFBLK AS FOR AN SCBLK. BY CONVENTION,
941: * WHEREEVER A BUFFER VALUE IS EMPLOYED, THE BCBLK
942: * IS POINTED TO.
943: *
944: * THE CORRESPONDING BFBLK IS POINTED TO BY THE
945: * BCBUF POINTER IN THE BCBLK.
946: *
947: * BCLEN IS THE CURRENT DEFINED SIZE OF THE CHARACTER
948: * ARRAY IN THE BFBLK. CHARACTERS FOLLOWING THE OFFSET
949: * OF BCLEN ARE UNDEFINED.
950: *
951: EJC
952: *
953: * STRING BUFFER BLOCK (BFBLK)
954: *
955: * A BFBLK IS BUILT BY A CALL TO BUFFER(...)
956: *
957: * +------------------------------------+
958: * I BFTYP I
959: * +------------------------------------+
960: * I BFALC I
961: * +------------------------------------+
962: * / /
963: * / BFCHR /
964: * / /
965: * +------------------------------------+
966: *
967: BFTYP EQU 0 PTR TO DUMMY ROUTINE B$BFT
968: BFALC EQU BFTYP+1 ALLOCATED SIZE OF BUFFER
969: BFCHR EQU BFALC+1 CHARACTERS OF STRING
970: BFSI$ EQU BFCHR SIZE OF STANDARD FIELDS IN BFBLK
971: *
972: * THE CHARACTERS IN THE BUFFER ARE STORED LEFT JUSTIFIED.
973: * THE FINAL WORD OF DEFINED CHARACTERS IS ALWAYS ZERO
974: * (CHARACTER) PADDED. ANY TRAILING ALLOCATION PAST THE
975: * WORD CONTAINING THE LAST CHARACTER CONTAINS
976: * UNPREDICTABLE CONTENTS AND IS NEVER REFERENCED.
977: *
978: * NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING
979: * IS GIVEN BY CFP$F, AS WITH AN SCBLK. HOWEVER, THE
980: * OFFSET WHICH IS OCCUPIED BY THE LENGTH FOR AN SCBLK
981: * IS THE TOTAL CHAR SPACE FOR BFBLKS, AND ROUTINES WHICH
982: * DEAL WITH BOTH MUST ACCOUNT FOR THIS DIFFERENCE.
983: *
984: * THE VALUE OF BFALC MAY NOT EXCEED MXLEN. THE VALUE OF
985: * BCLEN IS ALWAYS LESS THAN OR EQUAL TO BFALC.
986: *
987: .FI
988: EJC
989: *
990: * CODE CONSTRUCTION BLOCK (CCBLK)
991: *
992: * AT ANY ONE MOMENT THERE IS AT MOST ONE CCBLK INTO
993: * WHICH THE COMPILER IS CURRENTLY STORING CODE (CDWRD).
994: *
995: * +------------------------------------+
996: * I CCTYP I
997: * +------------------------------------+
998: * I CCLEN I
999: * +------------------------------------+
1000: * I CCUSE I
1001: * +------------------------------------+
1002: * / /
1003: * / CCCOD /
1004: * / /
1005: * +------------------------------------+
1006: *
1007: CCTYP EQU 0 POINTER TO DUMMY ROUTINE B$CCT
1008: CCLEN EQU CCTYP+1 LENGTH OF CCBLK IN BAUS
1009: CCUSE EQU CCLEN+1 OFFSET PAST LAST USED WORD (BAUS)
1010: CCCOD EQU CCUSE+1 START OF GENERATED CODE IN BLOCK
1011: *
1012: * THE REASON THAT THE CCBLK IS A SEPARATE BLOCK TYPE FROM
1013: * THE USUAL CDBLK IS THAT THE GARBAGE COLLECTOR MUST
1014: * ONLY PROCESS THOSE FIELDS WHICH HAVE BEEN SET (SEE GBCPF)
1015: EJC
1016: *
1017: * CODE BLOCK (CDBLK)
1018: *
1019: * A CODE BLOCK IS BUILT FOR EACH STATEMENT COMPILED DURING
1020: * THE INITIAL COMPILATION OR BY SUBSEQUENT CALLS TO CODE.
1021: *
1022: * +------------------------------------+
1023: * I CDJMP I
1024: * +------------------------------------+
1025: * I CDSTM I
1026: * +------------------------------------+
1027: * I CDLEN I
1028: * +------------------------------------+
1029: * I CDFAL I
1030: * +------------------------------------+
1031: * / /
1032: * / CDCOD /
1033: * / /
1034: * +------------------------------------+
1035: *
1036: CDJMP EQU 0 PTR TO ROUTINE TO EXECUTE STATEMENT
1037: CDSTM EQU CDJMP+1 STATEMENT NUMBER
1038: CDLEN EQU OFFS2 LENGTH OF CDBLK IN BAUS
1039: CDFAL EQU OFFS3 FAILURE EXIT (SEE BELOW)
1040: CDCOD EQU CDFAL+1 EXECUTABLE PSEUDO-CODE
1041: CDSI$ EQU CDCOD NUMBER OF STANDARD FIELDS IN CDBLK
1042: *
1043: * CDSTM IS THE STATEMENT NUMBER OF THE CURRENT STATEMENT.
1044: *
1045: * CDJMP, CDFAL ARE SET AS FOLLOWS.
1046: *
1047: * 1) IF THE FAILURE EXIT IS THE NEXT STATEMENT
1048: *
1049: * CDJMP = B$CDS
1050: * CDFAL = PTR TO CDBLK FOR NEXT STATEMENT
1051: *
1052: * 2) IF THE FAILURE EXIT IS A SIMPLE LABEL NAME
1053: *
1054: * CDJMP = B$CDS
1055: * CDFAL IS A PTR TO THE VRTRA FIELD OF THE VRBLK
1056: *
1057: * 3) IF THERE IS NO FAILURE EXIT (-NOFAIL MODE)
1058: *
1059: * CDJMP = B$CDS
1060: * CDFAL = O$UNF
1061: *
1062: * 4) IF THE FAILURE EXIT IS COMPLEX OR DIRECT
1063: *
1064: * CDJMP = B$CDC
1065: * CDFAL IS THE OFFSET TO THE O$GOF WORD
1066: EJC
1067: *
1068: * CODE BLOCK (CONTINUED)
1069: *
1070: * CDCOD IS THE START OF THE ACTUAL CODE. FIRST WE DESCRIBE
1071: * THE CODE GENERATED FOR AN EXPRESSION. IN AN EXPRESSION,
1072: * ELEMENTS ARE FETCHED BY NAME OR BY VALUE. FOR EXAMPLE,
1073: * THE BINARY EQUAL OPERATOR FETCHES ITS LEFT ARGUMENT
1074: * BY NAME AND ITS RIGHT ARGUMENT BY VALUE. THESE TWO
1075: * CASES GENERATE QUITE DIFFERENT CODE AND ARE DESCRIBED
1076: * SEPARATELY. FIRST WE CONSIDER THE CODE BY VALUE CASE.
1077: *
1078: * GENERATION OF CODE BY VALUE FOR EXPRESSIONS ELEMENTS.
1079: *
1080: * EXPRESSION POINTER TO EXBLK OR SEBLK
1081: *
1082: * INTEGER CONSTANT POINTER TO ICBLK
1083: *
1084: * NULL CONSTANT POINTER TO NULLS
1085: *
1086: * PATTERN (RESULTING FROM PREEVALUATION)
1087: * =O$LPT
1088: * POINTER TO P0BLK,P1BLK OR P2BLK
1089: *
1090: * REAL CONSTANT POINTER TO RCBLK
1091: *
1092: * STRING CONSTANT POINTER TO SCBLK
1093: *
1094: * VARIABLE POINTER TO VRGET FIELD OF VRBLK
1095: *
1096: * ADDITION VALUE CODE FOR LEFT OPERAND
1097: * VALUE CODE FOR RIGHT OPERAND
1098: * =O$ADD
1099: *
1100: * AFFIRMATION VALUE CODE FOR OPERAND
1101: * =O$AFF
1102: *
1103: * ALTERNATION VALUE CODE FOR LEFT OPERAND
1104: * VALUE CODE FOR RIGHT OPERAND
1105: * =O$ALT
1106: *
1107: * ARRAY REFERENCE (CASE OF ONE SUBSCRIPT)
1108: * VALUE CODE FOR ARRAY OPERAND
1109: * VALUE CODE FOR SUBSCRIPT OPERAND
1110: * =O$AOV
1111: *
1112: * (CASE OF MORE THAN ONE SUBSCRIPT)
1113: * VALUE CODE FOR ARRAY OPERAND
1114: * VALUE CODE FOR FIRST SUBSCRIPT
1115: * VALUE CODE FOR SECOND SUBSCRIPT
1116: * ...
1117: * VALUE CODE FOR LAST SUBSCRIPT
1118: * =O$AMV
1119: * NUMBER OF SUBSCRIPTS
1120: EJC
1121: *
1122: * CODE BLOCK (CONTINUED)
1123: *
1124: * ASSIGNMENT (TO NATURAL VARIABLE)
1125: * VALUE CODE FOR RIGHT OPERAND
1126: * POINTER TO VRSTO FIELD OF VRBLK
1127: *
1128: * (TO ANY OTHER VARIABLE)
1129: * NAME CODE FOR LEFT OPERAND
1130: * VALUE CODE FOR RIGHT OPERAND
1131: * =O$ASS
1132: *
1133: * COMPILE ERROR =O$CER
1134: *
1135: *
1136: * COMPLEMENTATION VALUE CODE FOR OPERAND
1137: * =O$COM
1138: *
1139: * CONCATENATION (CASE OF PRED FUNC LEFT OPERAND)
1140: * VALUE CODE FOR LEFT OPERAND
1141: * =O$POP
1142: * VALUE CODE FOR RIGHT OPERAND
1143: *
1144: * (ALL OTHER CASES)
1145: * VALUE CODE FOR LEFT OPERAND
1146: * VALUE CODE FOR RIGHT OPERAND
1147: * =O$CNC
1148: *
1149: * CURSOR ASSIGNMENT NAME CODE FOR OPERAND
1150: * =O$CAS
1151: *
1152: * DIVISION VALUE CODE FOR LEFT OPERAND
1153: * VALUE CODE FOR RIGHT OPERAND
1154: * =O$DVD
1155: *
1156: * EXPONENTIATION VALUE CODE FOR LEFT OPERAND
1157: * VALUE CODE FOR RIGHT OPERAND
1158: * =O$EXP
1159: *
1160: * FUNCTION CALL (CASE OF CALL TO SYSTEM FUNCTION)
1161: * VALUE CODE FOR FIRST ARGUMENT
1162: * VALUE CODE FOR SECOND ARGUMENT
1163: * ...
1164: * VALUE CODE FOR LAST ARGUMENT
1165: * POINTER TO SVFNC FIELD OF SVBLK
1166: *
1167: EJC
1168: *
1169: * CODE BLOCK (CONTINUED)
1170: *
1171: * FUNCTION CALL (CASE OF NON-SYSTEM FUNCTION 1 ARG)
1172: * VALUE CODE FOR ARGUMENT
1173: * =O$FNS
1174: * POINTER TO VRBLK FOR FUNCTION
1175: *
1176: * (NON-SYSTEM FUNCTION, GT 1 ARG)
1177: * VALUE CODE FOR FIRST ARGUMENT
1178: * VALUE CODE FOR SECOND ARGUMENT
1179: * ...
1180: * VALUE CODE FOR LAST ARGUMENT
1181: * =O$FNC
1182: * NUMBER OF ARGUMENTS
1183: * POINTER TO VRBLK FOR FUNCTION
1184: *
1185: * IMMEDIATE ASSIGNMENT VALUE CODE FOR LEFT OPERAND
1186: * NAME CODE FOR RIGHT OPERAND
1187: * =O$IMA
1188: *
1189: * INDIRECTION VALUE CODE FOR OPERAND
1190: * =O$INV
1191: *
1192: * INTERROGATION VALUE CODE FOR OPERAND
1193: * =O$INT
1194: *
1195: * KEYWORD REFERENCE NAME CODE FOR OPERAND
1196: * =O$KWV
1197: *
1198: * MULTIPLICATION VALUE CODE FOR LEFT OPERAND
1199: * VALUE CODE FOR RIGHT OPERAND
1200: * =O$MLT
1201: *
1202: * NAME REFERENCE (NATURAL VARIABLE CASE)
1203: * POINTER TO NMBLK FOR NAME
1204: *
1205: * (ALL OTHER CASES)
1206: * NAME CODE FOR OPERAND
1207: * =O$NAM
1208: *
1209: * NEGATION =O$NTA
1210: * CDBLK OFFSET OF O$NTC WORD
1211: * VALUE CODE FOR OPERAND
1212: * =O$NTB
1213: * =O$NTC
1214: EJC
1215: *
1216: * CODE BLOCK (CONTINUED)
1217: *
1218: * PATTERN ASSIGNMENT VALUE CODE FOR LEFT OPERAND
1219: * NAME CODE FOR RIGHT OPERAND
1220: * =O$PAS
1221: *
1222: * PATTERN MATCH VALUE CODE FOR LEFT OPERAND
1223: * VALUE CODE FOR RIGHT OPERAND
1224: * =O$PMV
1225: *
1226: * PATTERN REPLACEMENT NAME CODE FOR SUBJECT
1227: * VALUE CODE FOR PATTERN
1228: * =O$PMN
1229: * VALUE CODE FOR REPLACEMENT
1230: * =O$RPL
1231: *
1232: * SELECTION (FOR FIRST ALTERNATIVE)
1233: * =O$SLA
1234: * CDBLK OFFSET TO NEXT O$SLC WORD
1235: * VALUE CODE FOR FIRST ALTERNATIVE
1236: * =O$SLB
1237: * CDBLK OFFSET PAST ALTERNATIVES
1238: *
1239: * (FOR SUBSEQUENT ALTERNATIVES)
1240: * =O$SLC
1241: * CDBLK OFFSET TO NEXT O$SLC,O$SLD
1242: * VALUE CODE FOR ALTERNATIVE
1243: * =O$SLB
1244: * OFFSET IN CDBLK PAST ALTERNATIVES
1245: *
1246: * (FOR LAST ALTERNATIVE)
1247: * =O$SLD
1248: * VALUE CODE FOR LAST ALTERNATIVE
1249: *
1250: * SUBTRACTION VALUE CODE FOR LEFT OPERAND
1251: * VALUE CODE FOR RIGHT OPERAND
1252: * =O$SUB
1253: EJC
1254: *
1255: * CODE BLOCK (CONTINUED)
1256: *
1257: * GENERATION OF CODE BY NAME FOR EXPRESSION ELEMENTS.
1258: *
1259: * VARIABLE =O$LVN
1260: * POINTER TO VRBLK
1261: *
1262: * EXPRESSION (CASE OF *NATURAL VARIABLE)
1263: * =O$LVN
1264: * POINTER TO VRBLK
1265: *
1266: * (ALL OTHER CASES)
1267: * =O$LEX
1268: * POINTER TO EXBLK
1269: *
1270: *
1271: * ARRAY REFERENCE (CASE OF ONE SUBSCRIPT)
1272: * VALUE CODE FOR ARRAY OPERAND
1273: * VALUE CODE FOR SUBSCRIPT OPERAND
1274: * =O$AON
1275: *
1276: * (CASE OF MORE THAN ONE SUBSCRIPT)
1277: * VALUE CODE FOR ARRAY OPERAND
1278: * VALUE CODE FOR FIRST SUBSCRIPT
1279: * VALUE CODE FOR SECOND SUBSCRIPT
1280: * ...
1281: * VALUE CODE FOR LAST SUBSCRIPT
1282: * =O$AMN
1283: * NUMBER OF SUBSCRIPTS
1284: *
1285: * COMPILE ERROR =O$CER
1286: *
1287: * FUNCTION CALL (SAME CODE AS FOR VALUE CALL)
1288: * =O$FNE
1289: *
1290: * INDIRECTION VALUE CODE FOR OPERAND
1291: * =O$INN
1292: *
1293: * KEYWORD REFERENCE NAME CODE FOR OPERAND
1294: * =O$KWN
1295: *
1296: * ANY OTHER OPERAND IS AN ERROR IN A NAME POSITION
1297: *
1298: * NOTE THAT IN THIS DESCRIPTION, =O$XXX REFERS TO THE
1299: * GENERATION OF A WORD CONTAINING THE ADDRESS OF ANOTHER
1300: * WORD WHICH CONTAINS THE ENTRY POINT ADDRESS O$XXX.
1301: EJC
1302: *
1303: * CODE BLOCK (CONTINUED)
1304: *
1305: * NOW WE CONSIDER THE OVERALL STRUCTURE OF THE CODE BLOCK
1306: * FOR A STATEMENT WITH POSSIBLE GOTO FIELDS.
1307: *
1308: * FIRST COMES THE CODE FOR THE STATEMENT BODY.
1309: * THE STATEMENT BODY IS AN EXPRESSION TO BE EVALUATED
1310: * BY VALUE ALTHOUGH THE VALUE IS NOT ACTUALLY REQUIRED.
1311: * NORMAL VALUE CODE IS GENERATED FOR THE BODY OF THE
1312: * STATEMENT EXCEPT IN THE CASE OF A PATTERN MATCH BY
1313: * VALUE, IN WHICH CASE THE FOLLOWING IS GENERATED.
1314: *
1315: * VALUE CODE FOR LEFT OPERAND
1316: * VALUE CODE FOR RIGHT OPERAND
1317: * =O$PMS
1318: *
1319: * NEXT WE HAVE THE CODE FOR THE SUCCESS GOTO. THERE ARE
1320: * SEVERAL CASES AS FOLLOWS.
1321: *
1322: * 1) NO SUCCESS GOTO PTR TO CDBLK FOR NEXT STATEMENT
1323: *
1324: * 2) SIMPLE LABEL PTR TO VRTRA FIELD OF VRBLK
1325: *
1326: * 3) COMPLEX GOTO (CODE BY NAME FOR GOTO OPERAND)
1327: * =O$GOC
1328: *
1329: * 4) DIRECT GOTO (CODE BY VALUE FOR GOTO OPERAND)
1330: * =O$GOD
1331: *
1332: * FOLLOWING THIS WE GENERATE CODE FOR THE FAILURE GOTO IF
1333: * IT IS DIRECT OR IF IT IS COMPLEX, SIMPLE FAILURE GOTOS
1334: * HAVING BEEN HANDLED BY AN APPROPRIATE SETTING OF THE
1335: * CDFAL FIELD OF THE CDBLK. THE GENERATED CODE IS ONE
1336: * OF THE FOLLOWING.
1337: *
1338: * 1) COMPLEX FGOTO =O$FIF
1339: * =O$GOF
1340: * NAME CODE FOR GOTO OPERAND
1341: * =O$GOC
1342: *
1343: * 2) DIRECT FGOTO =O$FIF
1344: * =O$GOF
1345: * VALUE CODE FOR GOTO OPERAND
1346: * =O$GOD
1347: *
1348: * AN OPTIMIZATION OCCURS IF THE SUCCESS AND FAILURE GOTOS
1349: * ARE IDENTICAL AND EITHER COMPLEX OR DIRECT. IN THIS CASE,
1350: * NO CODE IS GENERATED FOR THE SUCCESS GOTO AND CONTROL
1351: * IS ALLOWED TO FALL INTO THE FAILURE GOTO ON SUCCESS.
1352: EJC
1353: *
1354: * COMPILER BLOCK (CMBLK)
1355: *
1356: * A COMPILER BLOCK (CMBLK) IS BUILT BY EXPAN TO REPRESENT
1357: * ONE NODE OF A TREE STRUCTURED EXPRESSION REPRESENTATION.
1358: *
1359: * +------------------------------------+
1360: * I CMIDN I
1361: * +------------------------------------+
1362: * I CMLEN I
1363: * +------------------------------------+
1364: * I CMTYP I
1365: * +------------------------------------+
1366: * I CMOPN I
1367: * +------------------------------------+
1368: * / CMVLS OR CMROP /
1369: * / /
1370: * / CMLOP /
1371: * / /
1372: * +------------------------------------+
1373: *
1374: CMIDN EQU 0 POINTER TO DUMMY ROUTINE B$CMT
1375: CMLEN EQU CMIDN+1 LENGTH OF CMBLK IN BAUS
1376: CMTYP EQU CMLEN+1 TYPE (C$XXX, SEE LIST BELOW)
1377: CMOPN EQU CMTYP+1 OPERAND POINTER (SEE BELOW)
1378: CMVLS EQU CMOPN+1 OPERAND VALUE POINTERS (SEE BELOW)
1379: CMROP EQU CMVLS RIGHT (ONLY) OPERATOR OPERAND
1380: CMLOP EQU CMVLS+1 LEFT OPERATOR OPERAND
1381: CMSI$ EQU CMVLS NUMBER OF STANDARD FIELDS IN CMBLK
1382: CMUS$ EQU CMSI$+1 SIZE OF UNARY OPERATOR CMBLK
1383: CMBS$ EQU CMSI$+2 SIZE OF BINARY OPERATOR CMBLK
1384: CMAR1 EQU CMVLS+1 ARRAY SUBSCRIPT POINTERS
1385: *
1386: * THE CMOPN AND CMVLS FIELDS ARE SET AS FOLLOWS
1387: *
1388: * ARRAY REFERENCE CMOPN = PTR TO ARRAY OPERAND
1389: * CMVLS = PTRS TO SUBSCRIPT OPERANDS
1390: *
1391: * FUNCTION CALL CMOPN = PTR TO VRBLK FOR FUNCTION
1392: * CMVLS = PTRS TO ARGUMENT OPERANDS
1393: *
1394: * SELECTION CMOPN = ZERO
1395: * CMVLS = PTRS TO ALTERNATE OPERANDS
1396: *
1397: * UNARY OPERATOR CMOPN = PTR TO OPERATOR DVBLK
1398: * CMROP = PTR TO OPERAND
1399: *
1400: * BINARY OPERATOR CMOPN = PTR TO OPERATOR DVBLK
1401: * CMROP = PTR TO RIGHT OPERAND
1402: * CMLOP = PTR TO LEFT OPERAND
1403: EJC
1404: *
1405: * CMTYP IS SET TO INDICATE THE TYPE OF EXPRESSION ELEMENT
1406: * AS SHOWN BY THE FOLLOWING TABLE OF DEFINITIONS.
1407: *
1408: C$ARR EQU 0 ARRAY REFERENCE
1409: C$FNC EQU C$ARR+1 FUNCTION CALL
1410: C$DEF EQU C$FNC+1 DEFERRED EXPRESSION (UNARY *)
1411: C$IND EQU C$DEF+1 INDIRECTION (UNARY $)
1412: C$KEY EQU C$IND+1 KEYWORD REFERENCE (UNARY AMPERSAND)
1413: C$UBO EQU C$KEY+1 UNDEFINED BINARY OPERATOR
1414: C$UUO EQU C$UBO+1 UNDEFINED UNARY OPERATOR
1415: C$UO$ EQU C$UUO+1 TEST VALUE (=C$UUO+1=C$UBO+2)
1416: C$$NM EQU C$UUO+1 NUMBER OF CODES FOR NAME OPERANDS
1417: *
1418: * THE REMAINING TYPES INDICATE EXPRESSION ELEMENTS WHICH
1419: * CAN ONLY BE EVALUATED BY VALUE (NOT BY NAME).
1420: *
1421: C$BVL EQU C$UUO+1 BINARY OP WITH VALUE OPERANDS
1422: C$UVL EQU C$BVL+1 UNARY OPERATOR WITH VALUE OPERAND
1423: C$ALT EQU C$UVL+1 ALTERNATION (BINARY BAR)
1424: C$CNC EQU C$ALT+1 CONCATENATION
1425: C$CNP EQU C$CNC+1 CONCATENATION, NOT PATTERN MATCH
1426: C$UNM EQU C$CNP+1 UNARY OP WITH NAME OPERAND
1427: C$BVN EQU C$UNM+1 BINARY OP (OPERANDS BY VALUE, NAME)
1428: C$ASS EQU C$BVN+1 ASSIGNMENT
1429: C$INT EQU C$ASS+1 INTERROGATION
1430: C$NEG EQU C$INT+1 NEGATION (UNARY NOT)
1431: C$SEL EQU C$NEG+1 SELECTION
1432: C$PMT EQU C$SEL+1 PATTERN MATCH
1433: *
1434: C$PR$ EQU C$BVN LAST PREEVALUABLE CODE
1435: C$$NV EQU C$PMT+1 NUMBER OF DIFFERENT CMBLK TYPES
1436: EJC
1437: *
1438: * COPY FILE BLOCK (COBLK)
1439: *
1440: * A CHAIN STACK OF COPY BLOCKS IS BUILT FOR EVERY NESTED
1441: * -COPY CONTROL CARD. THE CONTROL BLOCK IS USED TO PRESERVE
1442: * THE INPUT CONTEXT OF THE FILE CONTAINING THE -COPY.
1443: * AS -COPYS ARE ENDED, THESE BLOCKS ARE POPPED OFF THE CHAIN
1444: * AND THE STATE RESTORED. SEE ROUTINES CNCRD, COPND.
1445: *
1446: * +------------------------------------+
1447: * I COTYP I
1448: * +------------------------------------+
1449: * I CONXT I
1450: * +------------------------------------+
1451: * I COIOT I
1452: * +------------------------------------+
1453: * I COTTI I
1454: * +------------------------------------+
1455: * I COCIM I
1456: * +------------------------------------+
1457: * I COSPT I
1458: * +------------------------------------+
1459: * I COSLS I
1460: * +------------------------------------+
1461: * I COSIN I
1462: * +------------------------------------+
1463: * I COSTL I
1464: * +------------------------------------+
1465: *
1466: COTYP EQU 0 POINTER TO DUMMY ROUTINE B$COP
1467: CONXT EQU COTYP+1 POINT TO NEXT (OUTER -COPY) COBLK
1468: COIOT EQU CONXT+1 RECORD IOTAG FOR OSINT
1469: COTTI EQU COIOT+1 RECORD TTINS FLAG
1470: COCIM EQU COTTI+1 RECORD R$CIM COMPILER IMAGE
1471: COSPT EQU COCIM+1 RECORD SCNPT SCAN POINTER
1472: COSLS EQU COSPT+1 RECORD CSWLS LISTING FLAG
1473: COSIN EQU COSLS+1 RECORD CSWIN -INXXX VALUE
1474: COSTL EQU COSIN+1 RECORD R$STL -STITL STRING PTR
1475: COSI$ EQU COSTL+1 SIZE OF COBLK
1476: EJC
1477: *
1478: * CHARACTER TABLE BLOCK (CTBLK)
1479: *
1480: * A CHARACTER TABLE BLOCK IS USED TO HOLD LOGICAL CHARACTER
1481: * TABLES FOR USE WITH ANY,NOTANY,SPAN,BREAK,BREAKX
1482: * PATTERNS. EACH CHARACTER TABLE CAN BE USED TO STORE
1483: * CFP$N DISTINCT TABLES AS BIT COLUMNS. A BIT COLUMN
1484: * ALLOCATED FOR EACH ARGUMENT OF MORE THAN ONE CHARACTER
1485: * IN LENGTH TO ONE OF THE ABOVE LISTED PATTERN PRIMITIVES.
1486: *
1487: * +------------------------------------+
1488: * I CTTYP I
1489: * +------------------------------------+
1490: * * *
1491: * * *
1492: * * CTCHS *
1493: * * *
1494: * * *
1495: * +------------------------------------+
1496: *
1497: CTTYP EQU 0 POINTER TO DUMMY ROUTINE B$CTT
1498: CTCHS EQU CTTYP+1 START OF CHARACTER TABLE WORDS
1499: CTSI$ EQU CTCHS+CFP$A NUMBER OF WORDS IN CTBLK
1500: *
1501: * CTCHS IS CFP$A WORDS LONG AND CONSISTS OF A ONE WORD
1502: * BIT STRING VALUE FOR EACH POSSIBLE CHARACTER IN THE
1503: * INTERNAL ALPHABET. EACH OF THE CFP$N POSSIBLE BITS IN
1504: * A BITSTRING IS USED TO FORM A COLUMN OF BIT INDICATORS.
1505: * A BIT IS SET ON IF THE CHARACTER IS IN THE TABLE AND OFF
1506: * IF THE CHARACTER IS NOT PRESENT.
1507: EJC
1508: *
1509: * DATATYPE FUNCTION BLOCK (DFBLK)
1510: *
1511: * A DATATYPE FUNCTION IS USED TO CONTROL THE CONSTRUCTION
1512: * OF A PROGRAM DEFINED DATATYPE OBJECT. A CALL TO THE
1513: * SYSTEM FUNCTION DATA BUILDS A DFBLK FOR THE DATATYPE NAME
1514: *
1515: * NOTE THAT THESE BLOCKS ARE BUILT IN STATIC BECAUSE PDBLK
1516: * LENGTH IS GOT FROM DFLEN FIELD. IF DFBLK WAS IN DYNAMIC
1517: * STORE THIS WOULD CAUSE TROUBLE DURING PASS TWO OF GARBAGE
1518: * COLLECTION. SCBLK REFERRED TO BY DFNAM FIELD IS ALSO PUT
1519: * IN STATIC SO THAT THERE ARE NO RELOC. FIELDS. THIS CUTS
1520: * GARBAGE COLLECTION TASK APPRECIABLY FOR PDBLKS WHICH ARE
1521: * LIKELY TO BE PRESENT IN LARGE NUMBERS.
1522: *
1523: * +------------------------------------+
1524: * I FCODE I
1525: * +------------------------------------+
1526: * I FARGS I
1527: * +------------------------------------+
1528: * I DFLEN I
1529: * +------------------------------------+
1530: * I DFPDL I
1531: * +------------------------------------+
1532: * I DFNAM I
1533: * +------------------------------------+
1534: * / /
1535: * / DFFLD /
1536: * / /
1537: * +------------------------------------+
1538: *
1539: DFLEN EQU FARGS+1 LENGTH OF DFBLK IN BAUS
1540: DFPDL EQU DFLEN+1 LENGTH OF CORRESPONDING PDBLK
1541: DFNAM EQU DFPDL+1 POINTER TO SCBLK FOR DATATYPE NAME
1542: DFFLD EQU DFNAM+1 START OF VRBLK PTRS FOR FIELD NAMES
1543: DFFLB EQU DFFLD-1 OFFSET BEHIND DFFLD FOR FIELD FUNC
1544: DFSI$ EQU DFFLD NUMBER OF STANDARD FIELDS IN DFBLK
1545: *
1546: * THE FCODE FIELD POINTS TO THE ROUTINE B$DFC
1547: *
1548: * FARGS (THE NUMBER OF ARGUMENTS) IS THE NUMBER OF FIELDS.
1549: EJC
1550: *
1551: * DOPE VECTOR BLOCK (DVBLK)
1552: *
1553: * A DOPE VECTOR IS ASSEMBLED FOR EACH POSSIBLE OPERATOR IN
1554: * THE SNOBOL4 LANGUAGE AS PART OF THE CONSTANT SECTION.
1555: *
1556: * +------------------------------------+
1557: * I DVOPN I
1558: * +------------------------------------+
1559: * I DVTYP I
1560: * +------------------------------------+
1561: * I DVLPR I
1562: * +------------------------------------+
1563: * I DVRPR I
1564: * +------------------------------------+
1565: *
1566: DVOPN EQU 0 ENTRY ADDRESS (PTR TO O$XXX)
1567: DVTYP EQU DVOPN+1 TYPE CODE (C$XXX, SEE CMBLK)
1568: DVLPR EQU DVTYP+1 LEFT PRECEDENCE (LLXXX, SEE BELOW)
1569: DVRPR EQU DVLPR+1 RIGHT PRECEDENCE (RRXXX, SEE BELOW)
1570: DVUS$ EQU DVLPR+1 SIZE OF UNARY OPERATOR DV
1571: DVBS$ EQU DVRPR+1 SIZE OF BINARY OPERATOR DV
1572: DVUBS EQU DVUS$+DVBS$ SIZE OF UNOP + BINOP (SEE SCANE)
1573: *
1574: * THE CONTENTS OF THE DVTYP FIELD IS COPIED INTO THE CMTYP
1575: * FIELD OF THE CMBLK FOR THE OPERATOR IF IT IS USED.
1576: *
1577: * THE CMOPN FIELD OF AN OPERATOR CMBLK POINTS TO THE DVBLK
1578: * ITSELF, PROVIDING THE REQUIRED ENTRY ADDRESS POINTER PTR.
1579: *
1580: * FOR NORMALLY UNDEFINED OPERATORS, THE DVOPN (AND CMOPN)
1581: * FIELDS CONTAIN A WORD OFFSET FROM R$UBA OF THE FUNCTION
1582: * BLOCK POINTER FOR THE OPERATOR (INSTEAD OF O$XXX PTR).
1583: * FOR CERTAIN SPECIAL OPERATORS, THE DVOPN FIELD IS NOT
1584: * REQUIRED AT ALL AND IS ASSEMBLED AS ZERO.
1585: *
1586: * THE LEFT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO
1587: * THE LEFT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS THE
1588: * PRECEDENCE OF THE OPERATOR TOWARDS ITS RIGHT OPERAND.
1589: *
1590: * THE RIGHT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO
1591: * THE RIGHT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS
1592: * THE PRECEDENCE OF THE OPERATOR TOWARDS ITS LEFT OPERAND.
1593: *
1594: * HIGHER PRECEDENCE VALUES CORRESPOND TO A TIGHTER BINDING
1595: * CAPABILITY. THUS WE HAVE THE LEFT PRECEDENCE LOWER
1596: * (HIGHER) THAN THE RIGHT PRECEDENCE FOR RIGHT (LEFT)
1597: * ASSOCIATIVE BINARY OPERATORS.
1598: *
1599: * THE LEFT PRECEDENCE OF UNARY OPERATORS IS SET TO AN
1600: * ARBITRARY HIGH VALUE. THE RIGHT VALUE IS NOT REQUIRED AND
1601: * CONSEQUENTLY THE DVRPR FIELD IS OMITTED FOR UNARY OPS.
1602: EJC
1603: *
1604: * TABLE OF OPERATOR PRECEDENCE VALUES
1605: *
1606: RRASS EQU 10 RIGHT EQUAL
1607: LLASS EQU 00 LEFT EQUAL
1608: RRPMT EQU 20 RIGHT QUESTION MARK
1609: LLPMT EQU 30 LEFT QUESTION MARK
1610: RRAMP EQU 40 RIGHT AMPERSAND
1611: LLAMP EQU 50 LEFT AMPERSAND
1612: RRALT EQU 70 RIGHT VERTICAL BAR
1613: LLALT EQU 60 LEFT VERTICAL BAR
1614: RRCNC EQU 90 RIGHT BLANK
1615: LLCNC EQU 80 LEFT BLANK
1616: RRATS EQU 110 RIGHT AT
1617: LLATS EQU 100 LEFT AT
1618: RRPLM EQU 120 RIGHT PLUS, MINUS
1619: LLPLM EQU 130 LEFT PLUS, MINUS
1620: RRNUM EQU 140 RIGHT NUMBER
1621: LLNUM EQU 150 LEFT NUMBER
1622: RRDVD EQU 160 RIGHT SLASH
1623: LLDVD EQU 170 LEFT SLASH
1624: RRMLT EQU 180 RIGHT ASTERISK
1625: LLMLT EQU 190 LEFT ASTERISK
1626: RRPCT EQU 200 RIGHT PERCENT
1627: LLPCT EQU 210 LEFT PERCENT
1628: RREXP EQU 230 RIGHT EXCLAMATION
1629: LLEXP EQU 220 LEFT EXCLAMATION
1630: RRDLD EQU 240 RIGHT DOLLAR, DOT
1631: LLDLD EQU 250 LEFT DOLLAR, DOT
1632: RRNOT EQU 270 RIGHT NOT
1633: LLNOT EQU 260 LEFT NOT
1634: LLUNO EQU 999 LEFT ALL UNARY OPERATORS
1635: *
1636: * PRECEDENCES ARE THE SAME AS IN BTL SNOBOL4 WITH THE
1637: * FOLLOWING EXCEPTIONS.
1638: *
1639: * 1) BINARY QUESTION MARK IS LOWERED AND MADE LEFT ASSOC-
1640: * IATIVE TO REFLECT ITS NEW USE FOR PATTERN MATCHING.
1641: *
1642: * 2) ALTERNATION AND CONCATENATION ARE MADE RIGHT
1643: * ASSOCIATIVE FOR GREATER EFFICIENCY IN PATTERN
1644: * CONSTRUCTION AND MATCHING RESPECTIVELY. THIS CHANGE
1645: * IS TRANSPARENT TO THE SNOBOL4 PROGRAMMER.
1646: *
1647: * 3) THE EQUAL SIGN HAS BEEN ADDED AS A LOW PRECEDENCE
1648: * OPERATOR WHICH IS RIGHT ASSOCIATIVE TO REFLECT ITS
1649: * MORE GENERAL USAGE IN THIS VERSION OF SNOBOL4.
1650: .IF .CNLD
1651: .ELSE
1652: EJC
1653: *
1654: * EXTERNAL FUNCTION BLOCK (EFBLK)
1655: *
1656: * AN EXTERNAL FUNCTION BLOCK IS USED TO CONTROL THE CALLING
1657: * OF AN EXTERNAL FUNCTION. IT IS BUILT BY A CALL TO LOAD.
1658: *
1659: * +------------------------------------+
1660: * I FCODE I
1661: * +------------------------------------+
1662: * I FARGS I
1663: * +------------------------------------+
1664: * I EFLEN I
1665: * +------------------------------------+
1666: * I EFUSE I
1667: * +------------------------------------+
1668: * I EFCOD I
1669: * +------------------------------------+
1670: * I EFVAR I
1671: * +------------------------------------+
1672: * I EFRSL I
1673: * +------------------------------------+
1674: * / /
1675: * / EFTAR /
1676: * / /
1677: * +------------------------------------+
1678: *
1679: EFLEN EQU FARGS+1 LENGTH OF EFBLK IN BAUS
1680: EFUSE EQU EFLEN+1 USE COUNT (FOR OPSYN)
1681: EFCOD EQU EFUSE+1 PTR TO CODE (FROM SYSLD)
1682: EFVAR EQU EFCOD+1 PTR TO ASSOCIATED VRBLK
1683: EFRSL EQU EFVAR+1 RESULT TYPE (SEE BELOW)
1684: EFTAR EQU EFRSL+1 ARGUMENT TYPES (SEE BELOW)
1685: EFSI$ EQU EFTAR NUMBER OF STANDARD FIELDS IN EFBLK
1686: *
1687: * THE FCODE FIELD POINTS TO THE ROUTINE B$EFC.
1688: *
1689: * EFUSE IS USED TO KEEP TRACK OF MULTIPLE USE WHEN OPSYN
1690: * IS EMPLOYED. THE FUNCTION IS AUTOMATICALLY UNLOADED
1691: * WHEN THERE ARE NO MORE REFERENCES TO THE FUNCTION.
1692: *
1693: * EFRSL AND EFTAR ARE TYPE CODES AS FOLLOWS.
1694: *
1695: * 0 TYPE IS UNCONVERTED
1696: * 1 TYPE IS STRING
1697: * 2 TYPE IS INTEGER
1698: * 3 TYPE IS REAL
1699: * 4 TYPE IS BUFFER
1700: .FI
1701: EJC
1702: *
1703: * EXPRESSION VARIABLE BLOCK (EVBLK)
1704: *
1705: * IN THIS VERSION OF SPITBOL, AN EXPRESSION CAN BE USED IN
1706: * ANY POSITION WHICH WOULD NORMALLY EXPECT A NAME (FOR
1707: * EXAMPLE ON THE LEFT SIDE OF EQUALS OR AS THE RIGHT
1708: * ARGUMENT OF BINARY DOT). THIS CORRESPONDS TO THE CREATION
1709: * OF A PSEUDO-VARIABLE WHICH IS REPRESENTED BY A POINTER TO
1710: * AN EXPRESSION VARIABLE BLOCK AS FOLLOWS.
1711: *
1712: * +------------------------------------+
1713: * I EVTYP I
1714: * +------------------------------------+
1715: * I EVEXP I
1716: * +------------------------------------+
1717: * I EVVAR I
1718: * +------------------------------------+
1719: *
1720: EVTYP EQU 0 POINTER TO DUMMY ROUTINE B$EVT
1721: EVEXP EQU EVTYP+1 POINTER TO EXBLK FOR EXPRESSION
1722: EVVAR EQU EVEXP+1 POINTER TO TRBEV DUMMY TRBLK
1723: EVSI$ EQU EVVAR+1 SIZE OF EVBLK
1724: *
1725: * THE NAME OF AN EXPRESSION VARIABLE IS REPRESENTED BY A
1726: * BASE POINTER TO THE EVBLK AND AN OFFSET OF EVVAR. THIS
1727: * VALUE APPEARS TO BE TRAPPED BY THE DUMMY TRBEV BLOCK.
1728: *
1729: * NOTE THAT THERE IS NO NEED TO ALLOW FOR THE CASE OF AN
1730: * EXPRESSION VARIABLE WHICH REFERENCES AN SEBLK SINCE A
1731: * VARIABLE WHICH IS OF THE FORM *VAR IS EQUIVALENT TO VAR.
1732: EJC
1733: *
1734: * EXPRESSION BLOCK (EXBLK)
1735: *
1736: * AN EXPRESSION BLOCK IS BUILT FOR EACH EXPRESSION
1737: * REFERENCED IN A PROGRAM OR CREATED BY EVAL OR CONVERT
1738: * DURING EXECUTION OF A PROGRAM.
1739: *
1740: * +------------------------------------+
1741: * I EXTYP I
1742: * +------------------------------------+
1743: * I EXSTM I
1744: * +------------------------------------+
1745: * I EXLEN I
1746: * +------------------------------------+
1747: * I EXFLC I
1748: * +------------------------------------+
1749: * / /
1750: * / EXCOD /
1751: * / /
1752: * +------------------------------------+
1753: *
1754: EXTYP EQU 0 PTR TO ROUTINE B$EXL TO LOAD EXPR
1755: EXSTM EQU CDSTM STORES STMNT NO. DURING EVALUATION
1756: EXLEN EQU EXSTM+1 LENGTH OF EXBLK IN BAUS
1757: EXFLC EQU EXLEN+1 FAILURE CODE (=O$FEX)
1758: EXCOD EQU EXFLC+1 PSEUDO-CODE FOR EXPRESSION
1759: EXSI$ EQU EXCOD NUMBER OF STANDARD FIELDS IN EXBLK
1760: *
1761: * THERE ARE TWO CASES FOR EXCOD DEPENDING ON WHETHER THE
1762: * EXPRESSION CAN BE EVALUATED BY NAME (SEE DESCRIPTION
1763: * OF CDBLK FOR DETAILS OF CODE FOR EXPRESSIONS).
1764: *
1765: * IF THE EXPRESSION CAN BE EVALUATED BY NAME WE HAVE.
1766: *
1767: * (CODE FOR EXPR BY NAME)
1768: * =O$RNM
1769: *
1770: * IF THE EXPRESSION CAN ONLY BE EVALUATED BY VALUE.
1771: *
1772: * (CODE FOR EXPR BY VALUE)
1773: * =O$RVL
1774: EJC
1775: *
1776: * FIELD FUNCTION BLOCK (FFBLK)
1777: *
1778: * A FIELD FUNCTION BLOCK IS USED TO CONTROL THE SELECTION
1779: * OF A FIELD FROM A PROGRAM DEFINED DATATYPE BLOCK.
1780: * A CALL TO DATA CREATES AN FFBLK FOR EACH FIELD.
1781: *
1782: * +------------------------------------+
1783: * I FCODE I
1784: * +------------------------------------+
1785: * I FARGS I
1786: * +------------------------------------+
1787: * I FFDFP I
1788: * +------------------------------------+
1789: * I FFNXT I
1790: * +------------------------------------+
1791: * I FFOFS I
1792: * +------------------------------------+
1793: *
1794: FFDFP EQU FARGS+1 POINTER TO ASSOCIATED DFBLK
1795: FFNXT EQU FFDFP+1 PTR TO NEXT FFBLK ON CHAIN OR ZERO
1796: FFOFS EQU FFNXT+1 OFFSET (BAUS) TO FIELD IN PDBLK
1797: FFSI$ EQU FFOFS+1 SIZE OF FFBLK IN WORDS
1798: *
1799: * THE FCODE FIELD POINTS TO THE ROUTINE B$FFC.
1800: *
1801: * FARGS ALWAYS CONTAINS ONE.
1802: *
1803: * FFDFP IS USED TO VERIFY THAT THE CORRECT PROGRAM DEFINED
1804: * DATATYPE IS BEING ACCESSED BY THIS CALL.
1805: * FFDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC
1806: *
1807: * FFOFS IS USED TO SELECT THE APPROPRIATE FIELD. NOTE THAT
1808: * IT IS AN ACTUAL OFFSET (NOT A FIELD NUMBER)
1809: *
1810: * FFNXT IS USED TO POINT TO THE NEXT FFBLK OF THE SAME NAME
1811: * IN THE CASE WHERE THERE ARE SEVERAL FIELDS OF THE SAME
1812: * NAME FOR DIFFERENT DATATYPES. ZERO MARKS THE END OF CHAIN
1813: EJC
1814: *
1815: * INTEGER CONSTANT BLOCK (ICBLK)
1816: *
1817: * AN ICBLK IS CREATED FOR EVERY INTEGER REFERENCED OR
1818: * CREATED BY A PROGRAM. NOTE HOWEVER THAT CERTAIN INTERNAL
1819: * INTEGER VALUES ARE STORED AS ADDRESSES (E.G. THE LENGTH
1820: * FIELD IN A STRING CONSTANT BLOCK)
1821: *
1822: * +------------------------------------+
1823: * I ICGET I
1824: * +------------------------------------+
1825: * * ICVAL *
1826: * +------------------------------------+
1827: *
1828: ICGET EQU 0 PTR TO ROUTINE B$ICL TO LOAD INT
1829: ICVAL EQU ICGET+1 INTEGER VALUE
1830: ICSI$ EQU ICVAL+CFP$I SIZE OF ICBLK
1831: *
1832: * THE LENGTH OF THE ICVAL FIELD IS CFP$I.
1833: EJC
1834: *
1835: * KEYWORD VARIABLE BLOCK (KVBLK)
1836: *
1837: * A KVBLK IS USED TO REPRESENT A KEYWORD PSEUDO-VARIABLE.
1838: * A KVBLK IS BUILT FOR EACH KEYWORD REFERENCE (KWNAM).
1839: *
1840: * +------------------------------------+
1841: * I KVTYP I
1842: * +------------------------------------+
1843: * I KVVAR I
1844: * +------------------------------------+
1845: * I KVNUM I
1846: * +------------------------------------+
1847: *
1848: KVTYP EQU 0 POINTER TO DUMMY ROUTINE B$KVT
1849: KVVAR EQU KVTYP+1 POINTER TO DUMMY BLOCK TRBKV
1850: KVNUM EQU KVVAR+1 KEYWORD NUMBER
1851: KVSI$ EQU KVNUM+1 SIZE OF KVBLK
1852: *
1853: * THE NAME OF A KEYWORD VARIABLE IS REPRESENTED BY A
1854: * BASE POINTER TO THE KVBLK AND AN OFFSET OF KVVAR. THE
1855: * VALUE APPEARS TO BE TRAPPED BY THE POINTER TO TRBKV.
1856: EJC
1857: *
1858: * NAME BLOCK (NMBLK)
1859: *
1860: * A NAME BLOCK IS USED WHEREVER A NAME MUST BE STORED AS
1861: * A VALUE FOLLOWING USE OF THE UNARY DOT OPERATOR.
1862: *
1863: * +------------------------------------+
1864: * I NMTYP I
1865: * +------------------------------------+
1866: * I NMBAS I
1867: * +------------------------------------+
1868: * I NMOFS I
1869: * +------------------------------------+
1870: *
1871: NMTYP EQU 0 PTR TO ROUTINE B$NML TO LOAD NAME
1872: NMBAS EQU NMTYP+1 BASE POINTER FOR VARIABLE
1873: NMOFS EQU NMBAS+1 OFFSET FOR VARIABLE
1874: NMSI$ EQU NMOFS+1 SIZE OF NMBLK
1875: *
1876: * THE ACTUAL FIELD REPRESENTING THE CONTENTS OF THE NAME
1877: * IS FOUND NMOFS BAUS PAST THE ADDRESS IN NMBAS.
1878: *
1879: * THE NAME IS SPLIT INTO BASE AND OFFSET FORM TO AVOID
1880: * CREATION OF A POINTER INTO THE MIDDLE OF A BLOCK WHICH
1881: * COULD NOT BE HANDLED PROPERLY BY THE GARBAGE COLLECTOR.
1882: *
1883: * A NAME MAY BE BUILT FOR ANY VARIABLE (SEE SECTION ON
1884: * REPRESENTATIONS OF VARIABLES) THIS INCLUDES THE
1885: * CASES OF PSEUDO-VARIABLES.
1886: EJC
1887: *
1888: * PATTERN BLOCK, NO PARAMETERS (P0BLK)
1889: *
1890: * A P0BLK IS USED TO REPRESENT PATTERN NODES WHICH DO
1891: * NOT REQUIRE THE USE OF ANY PARAMETER VALUES.
1892: *
1893: * +------------------------------------+
1894: * I PCODE I
1895: * +------------------------------------+
1896: * I PTHEN I
1897: * +------------------------------------+
1898: *
1899: PCODE EQU 0 PTR TO MATCH ROUTINE (P$XXX)
1900: PTHEN EQU PCODE+1 POINTER TO SUBSEQUENT NODE
1901: PASI$ EQU PTHEN+1 SIZE OF P0BLK
1902: *
1903: * PTHEN POINTS TO THE PATTERN BLOCK FOR THE SUBSEQUENT
1904: * NODE TO BE MATCHED. THIS IS A POINTER TO THE PATTERN
1905: * BLOCK NDNTH IF THERE IS NO SUBSEQUENT (END OF PATTERN)
1906: *
1907: * PCODE IS A POINTER TO THE MATCH ROUTINE FOR THE NODE.
1908: EJC
1909: *
1910: * PATTERN BLOCK (ONE PARAMETER)
1911: *
1912: * A P1BLK IS USED TO REPRESENT PATTERN NODES WHICH
1913: * REQUIRE ONE PARAMETER VALUE.
1914: *
1915: * +------------------------------------+
1916: * I PCODE I
1917: * +------------------------------------+
1918: * I PTHEN I
1919: * +------------------------------------+
1920: * I PARM1 I
1921: * +------------------------------------+
1922: *
1923: PARM1 EQU PTHEN+1 FIRST PARAMETER VALUE
1924: PBSI$ EQU PARM1+1 SIZE OF P1BLK IN WORDS
1925: *
1926: * SEE P0BLK FOR DEFINITIONS OF PCODE, PTHEN
1927: *
1928: * PARM1 CONTAINS A PARAMETER VALUE USED IN MATCHING THE
1929: * NODE. FOR EXAMPLE, IN A LEN PATTERN, IT IS THE INTEGER
1930: * ARGUMENT TO LEN. THE DETAILS OF THE USE OF THE PARAMETER
1931: * FIELD ARE INCLUDED IN THE DESCRIPTION OF THE INDIVIDUAL
1932: * MATCH ROUTINES. PARM1 IS ALWAYS AN ADDRESS POINTER WHICH
1933: * IS PROCESSED BY THE GARBAGE COLLECTOR.
1934: EJC
1935: *
1936: * PATTERN BLOCK (TWO PARAMETERS)
1937: *
1938: * A P2BLK IS USED TO REPRESENT PATTERN NODES WHICH
1939: * REQUIRE TWO PARAMETER VALUES.
1940: *
1941: * +------------------------------------+
1942: * I PCODE I
1943: * +------------------------------------+
1944: * I PTHEN I
1945: * +------------------------------------+
1946: * I PARM1 I
1947: * +------------------------------------+
1948: * I PARM2 I
1949: * +------------------------------------+
1950: *
1951: PARM2 EQU PARM1+1 SECOND PARAMETER VALUE
1952: PCSI$ EQU PARM2+1 SIZE OF P2BLK IN WORDS
1953: *
1954: * SEE P1BLK FOR DEFINITIONS OF PCODE, PTHEN, PARM1
1955: *
1956: * PARM2 IS A PARAMETER WHICH PERFORMS THE SAME SORT OF
1957: * FUNCTION AS PARM1 (SEE DESCRIPTION OF P1BLK).
1958: *
1959: * PARM2 IS A NON-RELOCATABLE FIELD AND IS NOT
1960: * PROCESSED BY THE GARBAGE COLLECTOR. ACCORDINGLY, IT MAY
1961: * NOT CONTAIN A POINTER TO A BLOCK IN DYNAMIC MEMORY.
1962: EJC
1963: *
1964: * PROGRAM-DEFINED DATATYPE BLOCK
1965: *
1966: * A PDBLK REPRESENTS THE DATA ITEM FORMED BY A CALL TO A
1967: * DATATYPE FUNCTION AS DEFINED BY THE SYSTEM FUNCTION DATA.
1968: *
1969: * +------------------------------------+
1970: * I PDTYP I
1971: * +------------------------------------+
1972: * I IDVAL I
1973: * +------------------------------------+
1974: * I PDDFP I
1975: * +------------------------------------+
1976: * / /
1977: * / PDFLD /
1978: * / /
1979: * +------------------------------------+
1980: *
1981: PDTYP EQU 0 PTR TO DUMMY ROUTINE B$PDT
1982: PDDFP EQU IDVAL+1 PTR TO ASSOCIATED DFBLK
1983: PDFLD EQU PDDFP+1 START OF FIELD VALUE POINTERS
1984: PDFOF EQU DFFLD-PDFLD DIFFERENCE IN OFFSET TO FIELD PTRS
1985: PDSI$ EQU PDFLD SIZE OF STANDARD FIELDS IN PDBLK
1986: PDDFS EQU DFSI$-PDSI$ DIFFERENCE IN DFBLK, PDBLK SIZES
1987: *
1988: * THE PDDFP POINTER MAY BE USED TO DETERMINE THE DATATYPE
1989: * AND THE NAMES OF THE FIELDS IF REQUIRED. THE DFBLK ALSO
1990: * CONTAINS THE LENGTH OF THE PDBLK IN BAUS (FIELD DFPDL).
1991: * PDDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC
1992: *
1993: * PDFLD VALUES ARE STORED IN ORDER FROM LEFT TO RIGHT.
1994: * THEY CONTAIN VALUES OR POINTERS TO TRBLK CHAINS.
1995: EJC
1996: *
1997: * PROGRAM DEFINED FUNCTION BLOCK (PFBLK)
1998: *
1999: * A PFBLK IS CREATED FOR EACH CALL TO THE DEFINE FUNCTION
2000: * AND A POINTER TO THE PFBLK PLACED IN THE PROPER VRBLK.
2001: *
2002: * +------------------------------------+
2003: * I FCODE I
2004: * +------------------------------------+
2005: * I FARGS I
2006: * +------------------------------------+
2007: * I PFLEN I
2008: * +------------------------------------+
2009: * I PFVBL I
2010: * +------------------------------------+
2011: * I PFNLO I
2012: * +------------------------------------+
2013: * I PFCOD I
2014: * +------------------------------------+
2015: * I PFCTR I
2016: * +------------------------------------+
2017: * I PFRTR I
2018: * +------------------------------------+
2019: * / /
2020: * / PFARG /
2021: * / /
2022: * +------------------------------------+
2023: *
2024: PFLEN EQU FARGS+1 LENGTH OF PFBLK IN BAUS
2025: PFVBL EQU PFLEN+1 POINTER TO VRBLK FOR FUNCTION NAME
2026: PFNLO EQU PFVBL+1 NUMBER OF LOCALS
2027: PFCOD EQU PFNLO+1 PTR TO CDBLK FOR FIRST STATEMENT
2028: PFCTR EQU PFCOD+1 TRBLK PTR IF CALL TRACED ELSE 0
2029: PFRTR EQU PFCTR+1 TRBLK PTR IF RETURN TRACED ELSE 0
2030: PFARG EQU PFRTR+1 VRBLK PTRS FOR ARGUMENTS AND LOCALS
2031: PFAGB EQU PFARG-1 OFFSET BEHIND PFARG FOR ARG,LOCAL
2032: PFSI$ EQU PFARG NUMBER OF STANDARD FIELDS IN PFBLK
2033: *
2034: * THE FCODE FIELD POINTS TO THE ROUTINE B$PFC.
2035: *
2036: * PFARG IS STORED IN THE FOLLOWING ORDER.
2037: *
2038: * ARGUMENTS (LEFT TO RIGHT)
2039: * LOCALS (LEFT TO RIGHT)
2040: .IF .CNRA
2041: .ELSE
2042: EJC
2043: *
2044: * REAL CONSTANT BLOCK (RCBLK)
2045: *
2046: * AN RCBLK IS CREATED FOR EVERY REAL REFERENCED OR
2047: * CREATED BY A PROGRAM.
2048: *
2049: * +------------------------------------+
2050: * I RCGET I
2051: * +------------------------------------+
2052: * * RCVAL *
2053: * +------------------------------------+
2054: *
2055: RCGET EQU 0 PTR TO ROUTINE B$RCL TO LOAD REAL
2056: RCVAL EQU RCGET+1 REAL VALUE
2057: RCSI$ EQU RCVAL+CFP$R SIZE OF RCBLK
2058: *
2059: * THE LENGTH OF THE RCVAL FIELD IS CFP$R.
2060: .FI
2061: EJC
2062: *
2063: * STRING CONSTANT BLOCK (SCBLK)
2064: *
2065: * AN SCBLK IS BUILT FOR EVERY STRING REFERENCED OR CREATED
2066: * BY A PROGRAM.
2067: *
2068: * +------------------------------------+
2069: * I SCGET I
2070: * +------------------------------------+
2071: * I SCLEN I
2072: * +------------------------------------+
2073: * / /
2074: * / SCHAR /
2075: * / /
2076: * +------------------------------------+
2077: *
2078: SCGET EQU 0 PTR TO ROUTINE B$SCL TO LOAD STRING
2079: SCLEN EQU SCGET+1 LENGTH OF STRING IN CHARACTERS
2080: SCHAR EQU SCLEN+1 CHARACTERS OF STRING
2081: SCSI$ EQU SCHAR SIZE OF STANDARD FIELDS IN SCBLK
2082: *
2083: * THE CHARACTERS OF THE STRING ARE STORED LEFT JUSTIFIED.
2084: * THE FINAL WORD IS PADDED ON THE RIGHT WITH ZEROS.
2085: * (I.E. THE CHARACTER WHOSE INTERNAL CODE IS ZERO).
2086: *
2087: * THE VALUE OF SCLEN MAY NOT EXCEED MXLEN. THIS ENSURES
2088: * THAT CHARACTER OFFSETS (E.G. THE PATTERN MATCH CURSOR)
2089: * CAN BE CORRECTLY PROCESSED BY THE GARBAGE COLLECTOR.
2090: *
2091: * NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING
2092: * IS GIVEN IN BAUS BY CFP$F AND THAT THIS VALUE IS
2093: * AUTOMATICALLY ALLOWED FOR IN PLC, PSC.
2094: * NOTE THAT FOR A SPITBOL SCBLK, THE VALUE OF CFP$F
2095: * IS GIVEN BY CFP$B*SCHAR.
2096: EJC
2097: *
2098: * SIMPLE EXPRESSION BLOCK (SEBLK)
2099: *
2100: * AN SEBLK IS USED TO REPRESENT AN EXPRESSION OF THE FORM
2101: * *(NATURAL VARIABLE). ALL OTHER EXPRESSIONS ARE EXBLKS.
2102: *
2103: * +------------------------------------+
2104: * I SETYP I
2105: * +------------------------------------+
2106: * I SEVAR I
2107: * +------------------------------------+
2108: *
2109: SETYP EQU 0 PTR TO ROUTINE B$SEL TO LOAD EXPR
2110: SEVAR EQU SETYP+1 PTR TO VRBLK FOR VARIABLE
2111: SESI$ EQU SEVAR+1 LENGTH OF SEBLK IN WORDS
2112: EJC
2113: *
2114: * STANDARD VARIABLE BLOCK (SVBLK)
2115: *
2116: * AN SVBLK IS ASSEMBLED IN THE CONSTANT SECTION FOR EACH
2117: * VARIABLE WHICH SATISFIES ONE OF THE FOLLOWING CONDITIONS.
2118: *
2119: * 1) IT IS THE NAME OF A SYSTEM FUNCTION
2120: * 2) IT HAS AN INITIAL VALUE
2121: * 3) IT HAS A KEYWORD ASSOCIATION
2122: * 4) IT HAS A STANDARD I/O ASSOCIATION
2123: * 6) IT HAS A STANDARD LABEL ASSOCIATION
2124: *
2125: * IF VRBLKS ARE CONSTRUCTED FOR ANY OF THESE VARIABLES,
2126: * THEN THE VRSVP FIELD POINTS TO THE SVBLK (SEE VRBLK)
2127: *
2128: * +------------------------------------+
2129: * I SVBIT I
2130: * +------------------------------------+
2131: * I SVLEN I
2132: * +------------------------------------+
2133: * / SVCHS /
2134: * +------------------------------------+
2135: * I SVKNM I
2136: * +------------------------------------+
2137: * I SVFNC I
2138: * +------------------------------------+
2139: * I SVNAR I
2140: * +------------------------------------+
2141: * I SVLBL I
2142: * +------------------------------------+
2143: * I SVVAL I
2144: * +------------------------------------+
2145: EJC
2146: *
2147: * STANDARD VARIABLE BLOCK (CONTINUED)
2148: *
2149: SVBIT EQU 0 BIT STRING INDICATING ATTRIBUTES
2150: SVLEN EQU 1 (=SCLEN) LENGTH OF NAME IN CHARS
2151: SVCHS EQU 2 (=SCHAR) CHARACTERS OF NAME
2152: SVSI$ EQU 2 NUMBER OF STANDARD FIELDS IN SVBLK
2153: SVPRE EQU 1 SET IF PREEVALUATION PERMITTED
2154: SVFFC EQU SVPRE+SVPRE SET ON IF FAST CALL PERMITTED
2155: SVCKW EQU SVFFC+SVFFC SET ON IF KEYWORD VALUE CONSTANT
2156: SVPRD EQU SVCKW+SVCKW SET ON IF PREDICATE FUNCTION
2157: SVNBT EQU 4 NUMBER OF BITS TO RIGHT OF SVKNM
2158: SVKNM EQU SVPRD+SVPRD SET ON IF KEYWORD ASSOCIATION
2159: SVFNC EQU SVKNM+SVKNM SET ON IF SYSTEM FUNCTION
2160: SVNAR EQU SVFNC+SVFNC SET ON IF SYSTEM FUNCTION
2161: SVLBL EQU SVNAR+SVNAR SET ON IF SYSTEM LABEL
2162: SVVAL EQU SVLBL+SVLBL SET ON IF PREDEFINED VALUE
2163: *
2164: * NOTE THAT THE LAST FIVE BITS CORRESPOND IN ORDER
2165: * TO THE FIELDS WHICH ARE PRESENT (SEE PROCEDURE GTNVR).
2166: *
2167: * THE FOLLOWING DEFINITIONS ARE USED IN THE SVBLK TABLE
2168: *
2169: SVFNF EQU SVFNC+SVNAR FUNCTION WITH NO FAST CALL
2170: SVFNN EQU SVFNF+SVFFC FUNCTION WITH FAST CALL, NO PREEVAL
2171: SVFNP EQU SVFNN+SVPRE FUNCTION ALLOWING PREEVALUATION
2172: SVFPR EQU SVFNN+SVPRD PREDICATE FUNCTION
2173: SVFNK EQU SVFNN+SVKNM NO PREEVAL FUNC + KEYWORD
2174: SVKWV EQU SVKNM+SVVAL KEYWORD + VALUE
2175: SVKWC EQU SVCKW+SVKNM KEYWORD WITH CONSTANT VALUE
2176: SVKVC EQU SVKWV+SVCKW CONSTANT KEYWORD + VALUE
2177: SVKVL EQU SVKVC+SVLBL CONSTANT KEYWORD + VALUE + LABEL
2178: .IF .CNFN
2179: .ELSE
2180: SVFPK EQU SVFNP+SVKVC PREEVAL FUNC + CONST KEYWD+VAL
2181: .FI
2182: *
2183: * THE SVPRE BIT ALLOWS THE COMPILER TO PREEVALUATE A CALL
2184: * TO THE ASSOCIATED SYSTEM FUNCTION IF ALL THE ARGUMENTS
2185: * ARE THEMSELVES CONSTANTS. FUNCTIONS IN THIS CATEGORY
2186: * MUST HAVE NO SIDE EFFECTS AND MUST NEVER CAUSE FAILURE.
2187: * THE CALL MAY GENERATE AN ERROR CONDITION.
2188: *
2189: * THE SVFFC BIT ALLOWS THE COMPILER TO GENERATE THE SPECIAL
2190: * FAST CALL AFTER ADJUSTING THE NUMBER OF ARGUMENTS. ONLY
2191: * THE APPLY FUNCTION FALLS OUTSIDE THIS CATEGORY.
2192: *
2193: * THE SVCKW BIT IS SET IF THE ASSOCIATED KEYWORD VALUE IS
2194: * A CONSTANT, THUS ALLOWING PREEVALUATION FOR A VALUE CALL.
2195: *
2196: * THE SVPRD BIT IS SET ON FOR ALL PREDICATE FUNCTIONS TO
2197: * ENABLE THE SPECIAL CONCATENATION CODE OPTIMIZATION.
2198: EJC
2199: *
2200: * SVBLK (CONTINUED)
2201: *
2202: * SVKNM KEYWORD NUMBER
2203: *
2204: * SVKNM IS PRESENT ONLY FOR A STANDARD KEYWORD ASSOC.
2205: * IT CONTAINS A KEYWORD NUMBER AS DEFINED BY THE
2206: * KEYWORD NUMBER TABLE GIVEN LATER ON.
2207: *
2208: * SVFNC SYSTEM FUNCTION POINTER
2209: *
2210: * SVFNC IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC.
2211: * IT IS A POINTER TO THE ACTUAL CODE FOR THE SYSTEM
2212: * FUNCTION. THE GENERATED CODE FOR A FAST CALL IS A
2213: * POINTER TO THE SVFNC FIELD OF THE SVBLK FOR THE
2214: * FUNCTION. THE VRFNC FIELD OF THE VRBLK POINTS TO
2215: * THIS SAME FIELD, IN WHICH CASE, IT SERVES AS THE
2216: * FCODE FIELD FOR THE FUNCTION CALL.
2217: *
2218: * SVNAR NUMBER OF FUNCTION ARGUMENTS
2219: *
2220: * SVNAR IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC.
2221: * IT IS THE NUMBER OF ARGUMENTS REQUIRED FOR A CALL
2222: * TO THE SYSTEM FUNCTION. THE COMPILER USES THIS
2223: * VALUE TO ADJUST THE NUMBER OF ARGUMENTS IN A FAST
2224: * CALL AND IN THE CASE OF A FUNCTION CALLED THROUGH
2225: * THE VRFNC FIELD OF THE VRBLK, THE SVNAR FIELD
2226: * SERVES AS THE FARGS FIELD FOR O$FNC. A SPECIAL
2227: * CASE OCCURS IF THIS VALUE IS SET TO 999. THIS IS
2228: * USED TO INDICATE THAT THE FUNCTION HAS A VARIABLE
2229: * NUMBER OF ARGUMENTS AND CAUSES O$FNC TO PASS CONTROL
2230: * WITHOUT ADJUSTING THE ARGUMENT COUNT. THE ONLY
2231: * PREDEFINED FUNCTION USING THIS IS APPLY.
2232: *
2233: * SVLBL SYSTEM LABEL POINTER
2234: *
2235: * SVLBL IS PRESENT ONLY FOR A STANDARD LABEL ASSOC.
2236: * IT IS A POINTER TO A SYSTEM LABEL ROUTINE (L$XXX).
2237: * THE VRLBL FIELD OF THE CORRESPONDING VRBLK POINTS TO
2238: * THE SVLBL FIELD OF THE SVBLK.
2239: *
2240: * SVVAL SYSTEM VALUE POINTER
2241: *
2242: * SVVAL IS PRESENT ONLY FOR A STANDARD VALUE.
2243: * IT IS A POINTER TO THE PATTERN NODE (NDXXX) WHICH
2244: * IS THE STANDARD INITIAL VALUE OF THE VARIABLE.
2245: * THIS VALUE IS COPIED TO THE VRVAL FIELD OF THE VRBLK
2246: EJC
2247: *
2248: * SVBLK (CONTINUED)
2249: *
2250: * KEYWORD NUMBER TABLE
2251: *
2252: * THE FOLLOWING TABLE GIVES SYMBOLIC NAMES FOR KEYWORD
2253: * NUMBERS. THESE VALUES ARE STORED IN THE SVKNM FIELD OF
2254: * SVBLKS AND IN THE KVNUM FIELD OF KVBLKS. SEE ALSO
2255: * PROCEDURES ASIGN, ACESS AND KWNAM.
2256: *
2257: * UNPROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES
2258: *
2259: K$ANC EQU 0 ANCHOR
2260: K$DMP EQU K$ANC+CFP$B DUMP
2261: K$ERL EQU K$DMP+CFP$B ERRLIMIT
2262: K$ERT EQU K$ERL+CFP$B ERRTYPE
2263: K$FTR EQU K$ERT+CFP$B FTRACE
2264: K$INP EQU K$FTR+CFP$B INPUT
2265: K$MXL EQU K$INP+CFP$B MAXLENGTH
2266: K$OUP EQU K$MXL+CFP$B OUTPUT
2267: .IF .CNPF
2268: K$TRA EQU K$OUP+CFP$B TRACE
2269: .ELSE
2270: K$PFL EQU K$OUP+CFP$B PROFILE
2271: K$TRA EQU K$PFL+CFP$B TRACE
2272: .FI
2273: K$TRM EQU K$TRA+CFP$B TRIM
2274: *
2275: * PROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES
2276: *
2277: K$FNC EQU K$TRM+CFP$B FNCLEVEL
2278: K$LST EQU K$FNC+CFP$B LASTNO
2279: K$STN EQU K$LST+CFP$B STNO
2280: *
2281: * KEYWORDS WITH CONSTANT PATTERN VALUES
2282: *
2283: K$ABO EQU K$STN+CFP$B ABORT
2284: K$ARB EQU K$ABO+PASI$ ARB
2285: K$BAL EQU K$ARB+PASI$ BAL
2286: K$FAL EQU K$BAL+PASI$ FAIL
2287: K$FEN EQU K$FAL+PASI$ FENCE
2288: K$REM EQU K$FEN+PASI$ REM
2289: K$SUC EQU K$REM+PASI$ SUCCEED
2290: EJC
2291: *
2292: * KEYWORD NUMBER TABLE (CONTINUED)
2293: *
2294: * SPECIAL KEYWORDS
2295: *
2296: K$ALP EQU K$SUC+1 ALPHABET
2297: K$RTN EQU K$ALP+1 RTNTYPE
2298: K$COD EQU K$RTN+1 CODE
2299: K$STC EQU K$COD+1 STCOUNT
2300: K$ETX EQU K$STC+1 ERRTEXT
2301: K$STL EQU K$ETX+1 STLIMIT
2302: *
2303: * RELATIVE OFFSETS OF SPECIAL KEYWORDS
2304: *
2305: K$$AL EQU K$ALP-K$ALP ALPHABET
2306: K$$RT EQU K$RTN-K$ALP RTNTYPE
2307: K$$CD EQU K$COD-K$ALP CODE
2308: K$$SC EQU K$STC-K$ALP STCOUNT
2309: K$$ET EQU K$ETX-K$ALP ERRTEXT
2310: K$$SL EQU K$STL-K$ALP STLIMIT
2311: *
2312: * SYMBOLS USED IN ASIGN AND ACESS PROCEDURES
2313: *
2314: K$P$$ EQU K$FNC FIRST PROTECTED KEYWORD
2315: K$V$$ EQU K$ABO FIRST KEYWORD WITH CONSTANT VALUE
2316: K$S$$ EQU K$ALP FIRST KEYWORD WITH SPECIAL ACESS
2317: EJC
2318: *
2319: * FORMAT OF A TABLE BLOCK (TBBLK)
2320: *
2321: * A TABLE BLOCK IS USED TO REPRESENT A TABLE VALUE.
2322: * IT IS BUILT BY A CALL TO THE TABLE OR CONVERT FUNCTIONS.
2323: *
2324: * +------------------------------------+
2325: * I TBTYP I
2326: * +------------------------------------+
2327: * I IDVAL I
2328: * +------------------------------------+
2329: * I TBLEN I
2330: * +------------------------------------+
2331: * I TBINV I
2332: * +------------------------------------+
2333: * / /
2334: * / TBBUK /
2335: * / /
2336: * +------------------------------------+
2337: *
2338: TBTYP EQU 0 POINTER TO DUMMY ROUTINE B$TBT
2339: TBLEN EQU OFFS2 LENGTH OF TBBLK IN BAUS
2340: TBINV EQU OFFS3 DEFAULT INITIAL LOOKUP VALUE
2341: TBBUK EQU TBINV+1 START OF HASH BUCKET POINTERS
2342: TBSI$ EQU TBBUK SIZE OF STANDARD FIELDS IN TBBLK
2343: TBNBK EQU 11 DEFAULT NO. OF BUCKETS
2344: *
2345: * THE TABLE BLOCK IS A HASH TABLE WHICH POINTS TO CHAINS
2346: * OF TABLE ELEMENT BLOCKS REPRESENTING THE ELEMENTS
2347: * IN THE TABLE WHICH HASH INTO THE SAME BUCKET.
2348: *
2349: * TBBUK ENTRIES EITHER POINT TO THE FIRST TEBLK ON THE
2350: * CHAIN OR THEY POINT TO THE TBBLK ITSELF TO INDICATE THE
2351: * END OF THE CHAIN.
2352: EJC
2353: *
2354: * TABLE ELEMENT BLOCK (TEBLK)
2355: *
2356: * A TABLE ELEMENT IS USED TO REPRESENT A SINGLE ENTRY IN
2357: * A TABLE (SEE DESCRIPTION OF TBBLK FORMAT FOR HASH TABLE)
2358: *
2359: * +------------------------------------+
2360: * I TETYP I
2361: * +------------------------------------+
2362: * I TESUB I
2363: * +------------------------------------+
2364: * I TEVAL I
2365: * +------------------------------------+
2366: * I TENXT I
2367: * +------------------------------------+
2368: *
2369: TETYP EQU 0 POINTER TO DUMMY ROUTINE B$TET
2370: TESUB EQU TETYP+1 SUBSCRIPT VALUE
2371: TEVAL EQU TESUB+1 (=VRVAL) TABLE ELEMENT VALUE
2372: TENXT EQU TEVAL+1 LINK TO NEXT TEBLK
2373: * SEE S$CNV WHERE RELATION IS ASSUMED WITH TENXT AND TBBUK
2374: TESI$ EQU TENXT+1 SIZE OF TEBLK IN WORDS
2375: *
2376: * TENXT POINTS TO THE NEXT TEBLK ON THE HASH CHAIN FROM THE
2377: * TBBUK CHAIN FOR THIS HASH INDEX. AT THE END OF THE CHAIN,
2378: * TENXT POINTS BACK TO THE START OF THE TBBLK.
2379: *
2380: * TEVAL CONTAINS A DATA POINTER OR A TRBLK POINTER.
2381: *
2382: * TESUB CONTAINS A DATA POINTER.
2383: EJC
2384: *
2385: * TRAP BLOCK (TRBLK)
2386: *
2387: * A TRAP BLOCK IS USED TO REPRESENT A TRACE OR INPUT OR
2388: * OUTPUT ASSOCIATION IN RESPONSE TO A CALL TO THE TRACE
2389: * INPUT OR OUTPUT SYSTEM FUNCTIONS. SEE BELOW FOR DETAILS
2390: *
2391: * +------------------------------------+
2392: * I TRIDN I
2393: * +------------------------------------+
2394: * I TRTYP I
2395: * +------------------------------------+
2396: * I TRVAL OR TRLBL OR TRNXT OR TRKVR I
2397: * +------------------------------------+
2398: * I TRTAG OR TRTER I
2399: * +------------------------------------+
2400: * I TRFNC OR TRTRI I
2401: * +------------------------------------+
2402: *
2403: TRIDN EQU 0 POINTER TO DUMMY ROUTINE B$TRT
2404: TRTYP EQU TRIDN+1 TRAP TYPE CODE
2405: TRVAL EQU TRTYP+1 VALUE OF TRAPPED VARIABLE (=VRVAL)
2406: TRNXT EQU TRVAL PTR TO NEXT TRBLK ON TRBLK CHAIN
2407: TRLBL EQU TRVAL PTR TO ACTUAL LABEL (TRACED LABEL)
2408: TRKVR EQU TRVAL VRBLK POINTER FOR KEYWORD TRACE
2409: TRTAG EQU TRVAL+1 TRACE TAG OR IOTAG
2410: TRTER EQU TRTAG PTR TO TERMINAL VRBLK OR NULL
2411: TRFNC EQU TRTAG+1 TRACE FUNCTION VRBLK (ZERO IF NONE)
2412: TRTRI EQU TRFNC PTR TO TRACE BLOCK HOLDING IOTAG
2413: TRSI$ EQU TRFNC+1 NUMBER OF WORDS IN TRBLK
2414: *
2415: TRTIN EQU 0 TRACE TYPE FOR INPUT ASSOCIATION
2416: TRTAC EQU TRTIN+1 TRACE TYPE FOR ACCESS TRACE
2417: TRTVL EQU TRTAC+1 TRACE TYPE FOR VALUE TRACE
2418: TRTIO EQU TRTVL+1 TRACE TYPE FOR IOTAG TRACE BLOCK
2419: TRTOU EQU TRTIO+1 TRACE TYPE FOR OUTPUT ASSOCIATION
2420: EJC
2421: *
2422: * TRAP BLOCK (CONTINUED)
2423: *
2424: * VARIABLE INPUT ASSOCIATION
2425: *
2426: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
2427: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
2428: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
2429: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
2430: *
2431: * TRTYP IS SET TO TRTIN
2432: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
2433: * TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS
2434: * FOR INPUT, TERMINAL, ELSE IT IS NULL.
2435: * TRTRI IS A PTR TO IOTAG TRBLK FROM SYSIO OR ZERO.
2436: *
2437: * VARIABLE ACCESS TRACE ASSOCIATION
2438: *
2439: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
2440: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
2441: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
2442: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
2443: *
2444: * TRTYP IS SET TO TRTAC
2445: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
2446: * TRTAG IS THE TRACE TAG (0 IF NONE)
2447: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
2448: *
2449: * VARIABLE VALUE TRACE ASSOCIATION
2450: *
2451: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
2452: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
2453: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
2454: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
2455: *
2456: * TRTYP IS SET TO TRTVL
2457: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
2458: * TRTAG IS THE TRACE TAG (0 IF NONE)
2459: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
2460: EJC
2461: * TRAP BLOCK (CONTINUED)
2462: *
2463: * VARIABLE OUTPUT ASSOCIATION
2464: *
2465: * THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
2466: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
2467: * OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
2468: * CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
2469: *
2470: * TRTYP IS SET TO TRTOU
2471: * TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
2472: * TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS
2473: * FOR OUTPUT, TERMINAL, ELSE IT IS NULL.
2474: * TRTRI IS A PTR TO IOTAG TRBLK FROM SYSIO OR ZERO.
2475: *
2476: * FUNCTION CALL TRACE
2477: *
2478: * THE PFCTR FIELD OF THE CORRESPONDING PFBLK IS SET
2479: * TO POINT TO A TRBLK.
2480: *
2481: * TRTYP IS SET TO TRTIN
2482: * TRNXT IS ZERO
2483: * TRTAG IS THE TRACE TAG (0 IF NONE)
2484: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
2485: *
2486: * FUNCTION RETURN TRACE
2487: *
2488: * THE PFRTR FIELD OF THE CORRESPONDING PFBLK IS SET
2489: * TO POINT TO A TRBLK
2490: *
2491: * TRTYP IS SET TO TRTIN
2492: * TRNXT IS ZERO
2493: * TRTAG IS THE TRACE TAG (0 IF NONE)
2494: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
2495: *
2496: * LABEL TRACE
2497: *
2498: * THE VRLBL OF THE VRBLK FOR THE LABEL IS
2499: * CHANGED TO POINT TO A TRBLK AND THE VRTRA FIELD IS
2500: * SET TO B$VRT TO ACTIVATE THE CHECK.
2501: *
2502: * TRTYP IS SET TO TRTIN
2503: * TRLBL POINTS TO THE ACTUAL LABEL (CDBLK) VALUE
2504: * TRTAG IS THE TRACE TAG (0 IF NONE)
2505: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
2506: EJC
2507: *
2508: * TRAP BLOCK (CONTINUED)
2509: *
2510: * KEYWORD TRACE
2511: *
2512: * KEYWORDS WHICH CAN BE TRACED POSSESS A UNIQUE
2513: * LOCATION WHICH IS ZERO IF THERE IS NO TRACE AND
2514: * POINTS TO A TRBLK IF THERE IS A TRACE. THE LOCATIONS
2515: * ARE AS FOLLOWS.
2516: *
2517: * R$ERT ERRTYPE
2518: * R$FNC FNCLEVEL
2519: * R$STC STCOUNT
2520: *
2521: * THE FORMAT OF THE TRBLK IS AS FOLLOWS.
2522: *
2523: * TRTYP IS SET TO TRTIN
2524: * TRKVR IS A POINTER TO THE VRBLK FOR THE KEYWORD
2525: * TRTAG IS THE TRACE TAG (0 IF NONE)
2526: * TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
2527: *
2528: * INPUT/OUTPUT FILETAG TRAP BLOCK (TRTIO)
2529: *
2530: * THE VALUE FIELD OF THE FILETAG VBL POINTS TO A TRBLK
2531: * INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE OF
2532: * A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
2533: * CONTAIN =B$VRA AND =B$VRV. THIS TRAP BLOCK IS USED
2534: * TO HOLD THE IOTAG RETURNED BY A SYSIO CALL
2535: *
2536: * TRTYP IS SET TO TRTIO
2537: * TRNXT POINTS TO NEXT TRBLK OR TRVAL IS VARIABLE VAL
2538: * TRTAG HOLDS THE IOTAG.
2539: *
2540: * NOTE THAT WHEN MULTIPLE TRAPS ARE SET ON A VARIABLE
2541: * THE ORDER IS IN ASCENDING VALUE OF TRTYP FIELD.
2542: *
2543: * INPUT ASSOCIATION (IF PRESENT)
2544: * ACCESS TRACE (IF PRESENT)
2545: * VALUE TRACE (IF PRESENT)
2546: * FILETAG ASSOCIATION (IF PRESENT)
2547: * OUTPUT ASSOCIATION (IF PRESENT)
2548: *
2549: * THE ACTUAL VALUE OF THE VARIABLE IS STORED IN THE TRVAL
2550: * FIELD OF THE LAST TRBLK ON THE CHAIN.
2551: *
2552: * THIS IMPLEMENTATION DOES NOT PERMIT TRACE OR I/O
2553: * ASSOCIATIONS TO ANY OF THE PSEUDO-VARIABLES.
2554: EJC
2555: *
2556: * VECTOR BLOCK (VCBLK)
2557: *
2558: * A VCBLK IS USED TO REPRESENT AN ARRAY VALUE WHICH HAS
2559: * ONE DIMENSION WHOSE LOWER BOUND IS ONE. ALL OTHER ARRAYS
2560: * ARE REPRESENTED BY ARBLKS. A VCBLK IS CREATED BY THE
2561: * SYSTEM FUNCTION ARRAY (S$ARR) WHEN PASSED AN INTEGER ARG.
2562: *
2563: * +------------------------------------+
2564: * I VCTYP I
2565: * +------------------------------------+
2566: * I IDVAL I
2567: * +------------------------------------+
2568: * I VCLEN I
2569: * +------------------------------------+
2570: * I VCVLS I
2571: * +------------------------------------+
2572: *
2573: VCTYP EQU 0 POINTER TO DUMMY ROUTINE B$VCT
2574: VCLEN EQU OFFS2 LENGTH OF VCBLK IN BAUS
2575: VCVLS EQU OFFS3 START OF VECTOR VALUES
2576: VCSI$ EQU VCVLS SIZE OF STANDARD FIELDS IN VCBLK
2577: VCVLB EQU VCVLS-1 OFFSET ONE WORD BEHIND VCVLS
2578: VCTBD EQU TBSI$-VCSI$ DIFFERENCE IN SIZES - SEE PRTVL
2579: *
2580: * VCVLS ARE EITHER DATA POINTERS OR TRBLK POINTERS
2581: *
2582: * THE DIMENSION CAN BE DEDUCED FROM VCLEN.
2583: EJC
2584: *
2585: * VARIABLE BLOCK (VRBLK)
2586: *
2587: * A VARIABLE BLOCK IS BUILT IN THE STATIC MEMORY AREA
2588: * FOR EVERY VARIABLE REFERENCED OR CREATED BY A PROGRAM.
2589: *
2590: * NOTE THAT SINCE THESE BLOCKS ONLY OCCUR IN THE STATIC
2591: * REGION, IT IS PERMISSIBLE TO POINT TO ANY WORD IN
2592: * THE BLOCK AND THIS IS USED TO PROVIDE THREE DISTINCT
2593: * ACCESS POINTS FROM THE GENERATED CODE AS FOLLOWS.
2594: *
2595: * 1) POINT TO VRGET (FIRST WORD OF VRBLK) TO LOAD THE
2596: * VALUE OF THE VARIABLE ONTO THE MAIN STACK.
2597: *
2598: * 2) POINT TO VRSTO (SECOND WORD OF VRBLK) TO STORE THE
2599: * TOP STACK ELEMENT AS THE VALUE OF THE VARIABLE.
2600: *
2601: * 3) POINT TO VRTRA (FOURTH WORD OF VRBLK) TO JUMP TO
2602: * THE LABEL ASSOCIATED WITH THE VARIABLE NAME.
2603: *
2604: * +------------------------------------+
2605: * I VRGET I
2606: * +------------------------------------+
2607: * I VRSTO I
2608: * +------------------------------------+
2609: * I VRVAL I
2610: * +------------------------------------+
2611: * I VRTRA I
2612: * +------------------------------------+
2613: * I VRLBL I
2614: * +------------------------------------+
2615: * I VRFNC I
2616: * +------------------------------------+
2617: * I VRNXT I
2618: * +------------------------------------+
2619: * I VRLEN I
2620: * +------------------------------------+
2621: * / /
2622: * / VRCHS = VRSVP /
2623: * / /
2624: * +------------------------------------+
2625: EJC
2626: *
2627: * VARIABLE BLOCK (CONTINUED)
2628: *
2629: VRGET EQU 0 POINTER TO ROUTINE TO LOAD VALUE
2630: VRSTO EQU VRGET+1 POINTER TO ROUTINE TO STORE VALUE
2631: VRVAL EQU VRSTO+1 VARIABLE VALUE
2632: VRVLO EQU VRVAL-VRSTO OFFSET TO VALUE FROM STORE FIELD
2633: VRTRA EQU VRVAL+1 POINTER TO ROUTINE TO JUMP TO LABEL
2634: VRLBL EQU VRTRA+1 POINTER TO CODE FOR LABEL
2635: VRLBO EQU VRLBL-VRTRA OFFSET TO LABEL FROM TRANSFER FIELD
2636: VRFNC EQU VRLBL+1 POINTER TO FUNCTION BLOCK
2637: VRNXT EQU VRFNC+1 POINTER TO NEXT VRBLK ON HASH CHAIN
2638: VRLEN EQU VRNXT+1 LENGTH OF NAME (OR ZERO)
2639: VRCHS EQU VRLEN+1 CHARACTERS OF NAME (VRLEN GT 0)
2640: VRSVP EQU VRLEN+1 PTR TO SVBLK (VRLEN EQ 0)
2641: VRSI$ EQU VRCHS+1 NUMBER OF STANDARD FIELDS IN VRBLK
2642: VRSOF EQU VRLEN-SCLEN OFFSET TO DUMMY SCBLK FOR NAME
2643: VRSVO EQU VRSVP-VRSOF PSEUDO-OFFSET TO VRSVP FIELD
2644: *
2645: * VRGET = B$VRL IF NOT INPUT ASSOCIATED OR ACCESS TRACED
2646: * VRGET = B$VRA IF INPUT ASSOCIATED OR ACCESS TRACED
2647: *
2648: * VRSTO = B$VRS IF NOT OUTPUT ASSOCIATED OR VALUE TRACED
2649: * VRSTO = B$VRV IF OUTPUT ASSOCIATED OR VALUE TRACED
2650: * VRSTO = B$VRE IF VALUE IS PROTECTED PATTERN VALUE
2651: *
2652: * VRVAL POINTS TO THE APPROPRIATE VALUE UNLESS THE
2653: * VARIABLE IS I/O/TRACE ASSOCIATED IN WHICH CASE, VRVAL
2654: * POINTS TO AN APPROPRIATE TRBLK (TRAP BLOCK) CHAIN.
2655: *
2656: * VRTRA = B$VRG IF THE LABEL IS NOT TRACED
2657: * VRTRA = B$VRT IF THE LABEL IS TRACED
2658: *
2659: * VRLBL POINTS TO A CDBLK IF THERE IS A LABEL
2660: * VRLBL POINTS TO THE SVBLK SVLBL FIELD FOR A SYSTEM LABEL
2661: * VRLBL POINTS TO STNDL FOR AN UNDEFINED LABEL
2662: * VRLBL POINTS TO A TRBLK IF THE LABEL IS TRACED
2663: *
2664: * VRFNC POINTS TO A FFBLK FOR A FIELD FUNCTION
2665: * VRFNC POINTS TO A DFBLK FOR A DATATYPE FUNCTION
2666: * VRFNC POINTS TO A PFBLK FOR A PROGRAM DEFINED FUNCTION
2667: * VRFNC POINTS TO A EFBLK FOR AN EXTERNAL LOADED FUNCTION
2668: * VRFNC POINTS TO SVFNC (SVBLK) FOR A SYSTEM FUNCTION
2669: * VRFNC POINTS TO STNDF IF THE FUNCTION IS UNDEFINED
2670: *
2671: * VRNXT POINTS TO THE NEXT VRBLK ON THIS CHAIN UNLESS
2672: * THIS IS THE END OF THE CHAIN IN WHICH CASE IT IS ZERO.
2673: *
2674: * VRLEN IS THE NAME LENGTH FOR A NON-SYSTEM VARIABLE.
2675: * VRLEN IS ZERO FOR A SYSTEM VARIABLE.
2676: *
2677: * VRCHS IS THE NAME IF VRLEN IS NON-ZERO.
2678: * VRSVP IS A PTR TO THE SVBLK IF VRLEN IS ZERO.
2679: EJC
2680: *
2681: * FORMAT OF A NON-RELOCATABLE EXTERNAL BLOCK (XNBLK)
2682: *
2683: * AN XNBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL)
2684: * DATA VALUE. THE BLOCK CONTAINS NO POINTERS TO OTHER
2685: * RELOCATABLE BLOCKS. AN XNBLK IS USED BY EXTERNAL FUNCTION
2686: * PROCESSING OR POSSIBLY FOR SYSTEM I/O ROUTINES ETC.
2687: * THE MACRO-SYSTEM ITSELF DOES NOT USE XNBLKS.
2688: *
2689: * +------------------------------------+
2690: * I XNTYP I
2691: * +------------------------------------+
2692: * I XNLEN I
2693: * +------------------------------------+
2694: * / /
2695: * / XNDTA /
2696: * / /
2697: * +------------------------------------+
2698: *
2699: XNTYP EQU 0 POINTER TO DUMMY ROUTINE B$XNT
2700: XNLEN EQU XNTYP+1 LENGTH OF XNBLK IN BAUS
2701: XNDTA EQU XNLEN+1 DATA WORDS
2702: XNSI$ EQU XNDTA SIZE OF STANDARD FIELDS IN XNBLK
2703: *
2704: * NOTE THAT THE TERM NON-RELOCATABLE REFERS TO THE CONTENTS
2705: * AND NOT THE BLOCK ITSELF. AN XNBLK CAN BE MOVED AROUND IF
2706: * IT IS BUILT IN THE DYNAMIC MEMORY AREA.
2707: EJC
2708: *
2709: * RELOCATABLE EXTERNAL BLOCK (XRBLK)
2710: *
2711: * AN XRBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL)
2712: * DATA VALUE. THE DATA AREA IN THIS BLOCK CONSISTS ONLY
2713: * OF ADDRESS VALUES AND ANY ADDRESSES POINTING INTO THE
2714: * DYNAMIC MEMORY AREA MUST POINT TO THE START OF OTHER
2715: * DATA BLOCKS. SEE ALSO DESCRIPTION OF XNBLK.
2716: *
2717: * +------------------------------------+
2718: * I XRTYP I
2719: * +------------------------------------+
2720: * I XRLEN I
2721: * +------------------------------------+
2722: * / /
2723: * / XRPTR /
2724: * / /
2725: * +------------------------------------+
2726: *
2727: XRTYP EQU 0 POINTER TO DUMMY ROUTINE B$XRT
2728: XRLEN EQU XRTYP+1 LENGTH OF XRBLK IN BAUS
2729: XRPTR EQU XRLEN+1 START OF ADDRESS POINTERS
2730: XRSI$ EQU XRPTR SIZE OF STANDARD FIELDS IN XRBLK
2731: EJC
2732: *
2733: * S$CNV (CONVERT) FUNCTION SWITCH CONSTANTS. THE VALUES
2734: * ARE TIED TO THE ORDER OF THE ENTRIES IN THE SVCTB TABLE
2735: * AND HENCE TO THE BRANCH TABLE IN S$CNV.
2736: *
2737: CNVST EQU 8 MAX STANDARD TYPE CODE FOR CONVERT
2738: .IF .CNRA
2739: CNVRT EQU CNVST NO REALS - SAME AS STANDARD TYPES
2740: .ELSE
2741: CNVRT EQU CNVST+1 CONVERT CODE FOR REALS
2742: .FI
2743: .IF .CNBF
2744: CNVBT EQU CNVRT NO BUFFERS - SAME AS REAL CODE
2745: .ELSE
2746: CNVBT EQU CNVRT+1 CONVERT CODE FOR BUFFER
2747: .FI
2748: CNVTT EQU CNVBT+1 BSW CODE FOR CONVERT
2749: *
2750: * INPUT IMAGE LENGTH
2751: *
2752: INILN EQU 160 DEFAULT IMAGE LENGTH FOR COMPILER
2753: *
2754: * IN GENERAL, MEANINGFUL MNEMONICS SHOULD BE USED FOR
2755: * OFFSETS. HOWEVER FOR SMALL INTEGERS USED OFTEN IN
2756: * LITERALS THE FOLLOWING GENERAL DEFINITIONS ARE PROVIDED.
2757: *
2758: NUM01 EQU 1
2759: NUM02 EQU 2
2760: NUM03 EQU 3
2761: NUM04 EQU 4
2762: NUM05 EQU 5
2763: NUM06 EQU 6
2764: NUM07 EQU 7
2765: NUM08 EQU 8
2766: NUM09 EQU 9
2767: NUM10 EQU 10
2768: NINI9 EQU 999
2769: THSND EQU 1000
2770: *
2771: * NUMBERS OF UNDEFINED SPITBOL OPERATORS
2772: *
2773: OPBUN EQU 5 NO. OF BINARY UNDEFINED OPS
2774: OPUUN EQU 6 NO OF UNARY UNDEFINED OPS
2775: *
2776: * OFFSETS USED IN PRTSN, PRTMI AND ACESS
2777: *
2778: PRSNF EQU 13 OFFSET USED IN PRTSN
2779: PRTMF EQU 15 OFFSET TO COL 15 (PRTMI)
2780: RILEN EQU 160 BUFFER LENGTH FOR SYSRI
2781: *
2782: * CODES FOR STAGES OF PROCESSING
2783: *
2784: STGIC EQU 0 INITIAL COMPILE
2785: STGXC EQU STGIC+1 EXECUTION COMPILE (CODE)
2786: STGEV EQU STGXC+1 EXPRESSION EVAL DURING EXECUTION
2787: STGXT EQU STGEV+1 EXECUTION TIME
2788: STGCE EQU STGXT+1 INITIAL COMPILE AFTER END LINE
2789: STGXE EQU STGCE+1 EXEC. COMPILE AFTER END LINE
2790: STGND EQU STGCE-STGIC DIFFERENCE IN STAGE AFTER END
2791: STGEE EQU STGXE+1 EVAL EVALUATING EXPRESSION
2792: STGNO EQU STGEE+1 NUMBER OF CODES
2793: EJC
2794: *
2795: *
2796: * STATEMENT NUMBER PAD COUNT FOR LISTR
2797: *
2798: .DEF .CSN5
2799: .IF .CSN6
2800: STNPD EQU 6 STATEMENT NO. PAD COUNT
2801: .UNDEF .CSN5
2802: .FI
2803: .IF .CSN8
2804: STNPD EQU 8 STATEMENT NO. PAD COUNT
2805: .UNDEF .CSN5
2806: .FI
2807: .IF .CSN5
2808: STNPD EQU 5 STATEMENT NO. PAD COUNT
2809: .FI
2810: *
2811: * SYNTAX TYPE CODES
2812: *
2813: * THESE CODES ARE RETURNED FROM THE SCANE PROCEDURE.
2814: *
2815: * THEY ARE SPACED 3 APART FOR THE BENEFIT OF EXPAN.
2816: *
2817: T$UOP EQU 0 UNARY OPERATOR
2818: T$LPR EQU T$UOP+3 LEFT PAREN
2819: T$LBR EQU T$LPR+3 LEFT BRACKET
2820: T$CMA EQU T$LBR+3 COMMA
2821: T$FNC EQU T$CMA+3 FUNCTION CALL
2822: T$VAR EQU T$FNC+3 VARIABLE
2823: T$CON EQU T$VAR+3 CONSTANT
2824: T$BOP EQU T$CON+3 BINARY OPERATOR
2825: T$RPR EQU T$BOP+3 RIGHT PAREN
2826: T$RBR EQU T$RPR+3 RIGHT BRACKET
2827: T$COL EQU T$RBR+3 COLON
2828: T$SMC EQU T$COL+3 SEMI-COLON
2829: *
2830: * THE FOLLOWING DEFINITIONS ARE USED ONLY IN THE GOTO FIELD
2831: *
2832: T$FGO EQU T$SMC+1 FAILURE GOTO
2833: T$SGO EQU T$FGO+1 SUCCESS GOTO
2834: *
2835: * THE ABOVE CODES ARE GROUPED SO THAT CODES FOR ELEMENTS
2836: * WHICH CAN LEGITIMATELY IMMEDIATELY PRECEDE A UNARY
2837: * OPERATOR COME FIRST TO FACILITATE OPERATOR SYNTAX CHECK.
2838: *
2839: T$UOK EQU T$FNC LAST CODE OK BEFORE UNARY OPERATOR
2840: EJC
2841: *
2842: * DEFINITIONS OF VALUES FOR EXPAN JUMP TABLE
2843: *
2844: T$UO0 EQU T$UOP+0 UNARY OPERATOR, STATE ZERO
2845: T$UO1 EQU T$UOP+1 UNARY OPERATOR, STATE ONE
2846: T$UO2 EQU T$UOP+2 UNARY OPERATOR, STATE TWO
2847: T$LP0 EQU T$LPR+0 LEFT PAREN, STATE ZERO
2848: T$LP1 EQU T$LPR+1 LEFT PAREN, STATE ONE
2849: T$LP2 EQU T$LPR+2 LEFT PAREN, STATE TWO
2850: T$LB0 EQU T$LBR+0 LEFT BRACKET, STATE ZERO
2851: T$LB1 EQU T$LBR+1 LEFT BRACKET, STATE ONE
2852: T$LB2 EQU T$LBR+2 LEFT BRACKET, STATE TWO
2853: T$CM0 EQU T$CMA+0 COMMA, STATE ZERO
2854: T$CM1 EQU T$CMA+1 COMMA, STATE ONE
2855: T$CM2 EQU T$CMA+2 COMMA, STATE TWO
2856: T$FN0 EQU T$FNC+0 FUNCTION CALL, STATE ZERO
2857: T$FN1 EQU T$FNC+1 FUNCTION CALL, STATE ONE
2858: T$FN2 EQU T$FNC+2 FUNCTION CALL, STATE TWO
2859: T$VA0 EQU T$VAR+0 VARIABLE, STATE ZERO
2860: T$VA1 EQU T$VAR+1 VARIABLE, STATE ONE
2861: T$VA2 EQU T$VAR+2 VARIABLE, STATE TWO
2862: T$CO0 EQU T$CON+0 CONSTANT, STATE ZERO
2863: T$CO1 EQU T$CON+1 CONSTANT, STATE ONE
2864: T$CO2 EQU T$CON+2 CONSTANT, STATE TWO
2865: T$BO0 EQU T$BOP+0 BINARY OPERATOR, STATE ZERO
2866: T$BO1 EQU T$BOP+1 BINARY OPERATOR, STATE ONE
2867: T$BO2 EQU T$BOP+2 BINARY OPERATOR, STATE TWO
2868: T$RP0 EQU T$RPR+0 RIGHT PAREN, STATE ZERO
2869: T$RP1 EQU T$RPR+1 RIGHT PAREN, STATE ONE
2870: T$RP2 EQU T$RPR+2 RIGHT PAREN, STATE TWO
2871: T$RB0 EQU T$RBR+0 RIGHT BRACKET, STATE ZERO
2872: T$RB1 EQU T$RBR+1 RIGHT BRACKET, STATE ONE
2873: T$RB2 EQU T$RBR+2 RIGHT BRACKET, STATE TWO
2874: T$CL0 EQU T$COL+0 COLON, STATE ZERO
2875: T$CL1 EQU T$COL+1 COLON, STATE ONE
2876: T$CL2 EQU T$COL+2 COLON, STATE TWO
2877: T$SM0 EQU T$SMC+0 SEMICOLON, STATE ZERO
2878: T$SM1 EQU T$SMC+1 SEMICOLON, STATE ONE
2879: T$SM2 EQU T$SMC+2 SEMICOLON, STATE TWO
2880: *
2881: T$NES EQU T$SM2+1 NUMBER OF ENTRIES IN BRANCH TABLE
2882: EJC
2883: *
2884: * DEFINITION OF OFFSETS USED IN CONTROL CARD PROCESSING
2885: *
2886: .IF .CASL
2887: CC$CI EQU 0 -CASEIG
2888: CC$CO EQU CC$CI+1 -COPY
2889: .ELSE
2890: CC$CO EQU 0 -COPY
2891: .FI
2892: CC$EJ EQU CC$CO+1 -EJECT
2893: CC$FA EQU CC$EJ+1 -FAIL
2894: CC$LI EQU CC$FA+1 -LIST
2895: .IF .CASL
2896: CC$NC EQU CC$LI+1 -NOCASEIG
2897: CC$NF EQU CC$NC+1 -NOFAIL
2898: .ELSE
2899: CC$NF EQU CC$LI+1 -NOFAIL
2900: .FI
2901: CC$NL EQU CC$NF+1 -NOLIST
2902: CC$ST EQU CC$NL+1 -STITL
2903: CC$TI EQU CC$ST+1 -TITLE
2904: CC$TR EQU CC$TI+1 -TRACE
2905: CC$CT EQU CC$TR+1 NUMBER OF CONTROL CARDS
2906: CCNOC EQU 4 NO. OF CHARS INCLUDED IN MATCH
2907: CCOFS EQU 7 OFFSET TO START OF TITLE/SUBTITLE
2908: *
2909: * DEFINITIONS OF STACK OFFSETS USED IN CMPIL PROCEDURE
2910: *
2911: * SEE DESCRIPTION AT START OF CMPIL PROCEDURE FOR DETAILS
2912: * OF USE OF THESE LOCATIONS ON THE STACK.
2913: *
2914: CMSTM EQU 0 TREE FOR STATEMENT BODY
2915: CMSGO EQU CMSTM+1 TREE FOR SUCCESS GOTO
2916: CMFGO EQU CMSGO+1 TREE FOR FAIL GOTO
2917: CMCGO EQU CMFGO+1 CONDITIONAL GOTO FLAG
2918: CMPCD EQU CMCGO+1 PREVIOUS CDBLK POINTER
2919: CMFFP EQU CMPCD+1 FAILURE FILL IN FLAG FOR PREVIOUS
2920: CMFFC EQU CMFFP+1 FAILURE FILL IN FLAG FOR CURRENT
2921: CMSOP EQU CMFFC+1 SUCCESS FILL IN OFFSET FOR PREVIOUS
2922: CMSOC EQU CMSOP+1 SUCCESS FILL IN OFFSET FOR CURRENT
2923: CMLBL EQU CMSOC+1 PTR TO VRBLK FOR CURRENT LABEL
2924: CMTRA EQU CMLBL+1 PTR TO ENTRY CDBLK
2925: *
2926: CMNEN EQU CMTRA+1 COUNT OF STACK ENTRIES FOR CMPIL
2927: .IF .CNPF
2928: .ELSE
2929: *
2930: * A FEW CONSTANTS USED BY THE PROFILER
2931: PFPD1 EQU 8 PAD POSITIONS ...
2932: PFPD2 EQU 20 ... FOR PROFILE ...
2933: PFPD3 EQU 32 ... PRINTOUT
2934: PF$I2 EQU CFP$I+CFP$I SIZE OF TABLE ENTRY (2 INTS)
2935: .FI
2936: TTL S P I T B O L -- CONSTANT SECTION
2937: *
2938: * THIS SECTION CONSISTS ENTIRELY OF ASSEMBLED CONSTANTS.
2939: *
2940: * ALL LABEL NAMES ARE FIVE LETTERS. THE ORDER IS
2941: * APPROXIMATELY ALPHABETICAL, BUT IN SOME CASES (ALWAYS
2942: * DOCUMENTED), CONSTANTS MUST BE PLACED IN SOME SPECIAL
2943: * ORDER WHICH MUST NOT BE DISTURBED.
2944: *
2945: * IT MUST ALSO BE REMEMBERED THAT THERE IS A REQUIREMENT
2946: * FOR NO FORWARD REFERENCES WHICH ALSO DISTURBS THE
2947: * ALPHABETICAL ORDER IN SOME CASES.
2948: *
2949: SEC START OF CONSTANT SECTION
2950: *
2951: * FREE STORE PERCENTAGE (USED BY ALLOC)
2952: *
2953: ALFSP DAC E$FSP FREE STORE PERCENTAGE
2954: *
2955: * BIT CONSTANTS FOR GENERAL USE
2956: *
2957: BITS0 DBC 0 ALL ZERO BITS
2958: BITS1 DBC 1 ONE BIT IN LOW ORDER POSITION
2959: BITS2 DBC 2 BIT IN POSITION 2
2960: BITS3 DBC 4 BIT IN POSITION 3
2961: BITS4 DBC 8 BIT IN POSITION 4
2962: BITS5 DBC 16 BIT IN POSITION 5
2963: BITS6 DBC 32 BIT IN POSITION 6
2964: BITS7 DBC 64 BIT IN POSITION 7
2965: BITS8 DBC 128 BIT IN POSITION 8
2966: BITS9 DBC 256 BIT IN POSITION 9
2967: BIT10 DBC 512 BIT IN POSITION 10
2968: BITSM DBC CFP$M MASK FOR MAX INTEGER
2969: *
2970: * BIT CONSTANTS FOR SVBLK (SVBIT FIELD) TESTS
2971: *
2972: BTFNC DBC SVFNC BIT TO TEST FOR FUNCTION
2973: BTKNM DBC SVKNM BIT TO TEST FOR KEYWORD NUMBER
2974: BTLBL DBC SVLBL BIT TO TEST FOR LABEL
2975: BTFFC DBC SVFFC BIT TO TEST FOR FAST CALL
2976: BTCKW DBC SVCKW BIT TO TEST FOR CONSTANT KEYWORD
2977: BTPRD DBC SVPRD BIT TO TEST FOR PREDICATE FUNCTION
2978: BTPRE DBC SVPRE BIT TO TEST FOR PREEVALUATION
2979: BTVAL DBC SVVAL BIT TO TEST FOR VALUE
2980: EJC
2981: *
2982: * LIST OF NAMES USED FOR CONTROL CARD PROCESSING
2983: *
2984: .IF .CASL
2985: CCNMS DTC /CASE/
2986: DTC /COPY/
2987: .ELSE
2988: CCNMS DTC /COPY/
2989: .FI
2990: DTC /EJEC/
2991: DTC /FAIL/
2992: DTC /LIST/
2993: .IF .CASL
2994: DTC /NOCA/
2995: .FI
2996: DTC /NOFA/
2997: DTC /NOLI/
2998: DTC /STIT/
2999: DTC /TITL/
3000: DTC /TRAC/
3001: *
3002: * HEADER MESSAGES FOR DUMPR PROCEDURE (SCBLK FORMAT)
3003: *
3004: DMHDK DAC B$SCL
3005: DAC 22
3006: DDC /DUMP OF KEYWORD VALUES/
3007: *
3008: DMHDV DAC B$SCL
3009: DAC 25
3010: DDC /DUMP OF NATURAL VARIABLES/
3011: *
3012: * MESSAGE TEXT FOR COMPILATION STATISTICS
3013: *
3014: ENCM1 DAC B$SCL
3015: DAC 10
3016: DDC /STORE USED/
3017: *
3018: ENCM2 DAC B$SCL
3019: DAC 10
3020: DDC /STORE LEFT/
3021: *
3022: ENCM3 DAC B$SCL
3023: DAC 11
3024: DDC /COMP ERRORS/
3025: *
3026: ENCM4 DAC B$SCL
3027: DAC 14
3028: .IF .CTMD
3029: DDC /COMP TIME-DSEC/
3030: .ELSE
3031: DDC /COMP TIME-MSEC/
3032: .FI
3033: *
3034: ENCM5 DAC B$SCL
3035: DAC 20
3036: DDC /EXECUTION SUPPRESSED/
3037: EJC
3038: *
3039: * FOR TERMINATION IN COMPILATION
3040: *
3041: ENDIC DAC B$SCL
3042: DAC 14
3043: DDC /IN COMPILATION/
3044: *
3045: * MEMORY OVERFLOW DURING INITIALISATION
3046: *
3047: ENDMO DAC B$SCL
3048: ENDML DAC 15
3049: DDC /MEMORY OVERFLOW/
3050: *
3051: * STRING CONSTANT FOR MESSAGE ISSUED BY L$END
3052: *
3053: ENDMS DAC B$SCL
3054: DAC 10
3055: DDC /NORMAL END/
3056: *
3057: * FAIL MESSAGE FOR STACK FAIL SECTION
3058: *
3059: ENDSO DAC B$SCL
3060: DAC 36
3061: DDC /STACK OVERFLOW IN GARBAGE COLLECTION/
3062: EJC
3063: *
3064: * STRING CONSTANT FOR ERROR MESSAGE (ERROR SECTION)
3065: *
3066: ERMMS DAC B$SCL
3067: DAC 5
3068: DDC /ERROR/
3069: *
3070: ERMNS DAC B$SCL
3071: DAC 4
3072: DTC / -- /
3073: *
3074: *
3075: ERRTF DAC 251 FATAL ERROR CODE - SEE LABEL ERRAF
3076: *
3077: * STRING CONSTANT FOR PAGE NUMBERING
3078: *
3079: LSTMS DAC B$SCL
3080: DAC 5
3081: DDC /PAGE /
3082: *
3083: * LISTING HEADER MESSAGE
3084: *
3085: HEADR DAC B$SCL
3086: DAC 25
3087: DDC /MACRO SPITBOL VERSION 4.3/
3088: *
3089: HEADV DAC B$SCL FOR EXIT() VERSION NO. CHECK
3090: DAC 3
3091: DTC /4.3/
3092: *
3093: * INTEGER CONSTANTS FOR GENERAL USE
3094: * ICBLD OPTIMISATION USES THE FIRST THREE.
3095: *
3096: INT$R DAC B$ICL
3097: INTV0 DIC +0 0
3098: INTON DAC B$ICL
3099: INTV1 DIC +1 1
3100: INTTW DAC B$ICL
3101: INTV2 DIC +2 2
3102: INTVT DIC +10 10
3103: INTVH DIC +100 100
3104: INTTH DIC +1000 1000
3105: *
3106: * TABLE USED IN ICBLD OPTIMISATION
3107: *
3108: INTAB DAC INT$R POINTER TO 0
3109: DAC INTON POINTER TO 1
3110: DAC INTTW POINTER TO 2
3111: EJC
3112: *
3113: * SPECIAL PATTERN NODES. THE FOLLOWING PATTERN NODES
3114: * CONSIST SIMPLY OF A PCODE POINTER, SEE MATCH ROUTINES
3115: * (P$XXX) FOR FULL DETAILS OF THEIR USE AND FORMAT).
3116: *
3117: NDABB DAC P$ABB ARBNO
3118: NDABD DAC P$ABD ARBNO
3119: NDARC DAC P$ARC ARB
3120: NDEXB DAC P$EXB EXPRESSION
3121: NDEXC DAC P$EXC EXPRESSION
3122: .IF .CNFN
3123: .ELSE
3124: NDFNB DAC P$FNB FENCE()
3125: NDFND DAC P$FND FENCE()
3126: .FI
3127: NDIMB DAC P$IMB IMMEDIATE ASSIGNMENT
3128: NDIMD DAC P$IMD IMMEDIATE ASSIGNMENT
3129: NDNTH DAC P$NTH PATTERN END (NULL PATTERN)
3130: NDPAB DAC P$PAB PATTERN ASSIGNMENT
3131: NDPAD DAC P$PAD PATTERN ASSIGNMENT
3132: NDUNA DAC P$UNA ANCHOR POINT MOVEMENT
3133: *
3134: * KEYWORD CONSTANT PATTERN NODES. THE FOLLOWING NODES ARE
3135: * USED AS THE VALUES OF PATTERN KEYWORDS AND THE INITIAL
3136: * VALUES OF THE CORRESPONDING NATURAL VARIABLES. ALL
3137: * NODES ARE IN P0BLK FORMAT AND THE ORDER IS TIED TO THE
3138: * DEFINITIONS OF CORRESPONDING K$XXX SYMBOLS.
3139: *
3140: NDABO DAC P$ABO ABORT
3141: DAC NDNTH
3142: NDARB DAC P$ARB ARB
3143: DAC NDNTH
3144: NDBAL DAC P$BAL BAL
3145: DAC NDNTH
3146: NDFAL DAC P$FAL FAIL
3147: DAC NDNTH
3148: NDFEN DAC P$FEN FENCE
3149: DAC NDNTH
3150: NDREM DAC P$REM REM
3151: DAC NDNTH
3152: NDSUC DAC P$SUC SUCCEED
3153: DAC NDNTH
3154: *
3155: * NULL STRING. ALL NULL VALUES POINT TO THIS STRING. THE
3156: * SVCHS FIELD CONTAINS A BLANK TO PROVIDE FOR EASY DEFAULT
3157: * PROCESSING IN TRACE, STOPTR, LPAD AND RPAD.
3158: * NULLW CONTAINS 10 BLANKS WHICH ENSURES AN ALL BLANK WORD
3159: * BUT FOR VERY EXCEPTIONAL MACHINES.
3160: *
3161: NULLS DAC B$SCL NULL STRING VALUE
3162: DAC 0 SCLEN = 0
3163: NULLW DTC / /
3164: EJC
3165: *
3166: * OPERATOR DOPE VECTORS (SEE DVBLK FORMAT)
3167: *
3168: OPDVC DAC O$CNC CONCATENATION
3169: DAC C$CNC
3170: DAC LLCNC
3171: DAC RRCNC
3172: *
3173: * OPDVP IS USED WHEN SCANNING BELOW TOP LEVEL TO ENSURE
3174: * THE CONCATENATION WILL NOT LATER BE MISTAKEN FOR
3175: * PATTERN MATCHING
3176: *
3177: OPDVP DAC O$CNC PROVEN CONCATENATION
3178: DAC C$CNP
3179: DAC LLCNC
3180: DAC RRCNC
3181: *
3182: * NOTE THAT THE ORDER OF THE REMAINING ENTRIES IS TIED TO
3183: * THE ORDER OF THE CODING IN THE SCANE PROCEDURE.
3184: *
3185: OPDVS DAC O$ASS ASSIGNMENT
3186: DAC C$ASS
3187: DAC LLASS
3188: DAC RRASS
3189: *
3190: DAC 6 UNARY EQUAL
3191: DAC C$UUO
3192: DAC LLUNO
3193: *
3194: DAC O$PMV PATTERN MATCH
3195: DAC C$PMT
3196: DAC LLPMT
3197: DAC RRPMT
3198: *
3199: DAC O$INT INTERROGATION
3200: DAC C$UVL
3201: DAC LLUNO
3202: *
3203: DAC 1 BINARY AMPERSAND
3204: DAC C$UBO
3205: DAC LLAMP
3206: DAC RRAMP
3207: *
3208: DAC O$KWV KEYWORD REFERENCE
3209: DAC C$KEY
3210: DAC LLUNO
3211: *
3212: DAC O$ALT ALTERNATION
3213: DAC C$ALT
3214: DAC LLALT
3215: DAC RRALT
3216: EJC
3217: *
3218: * OPERATOR DOPE VECTORS (CONTINUED)
3219: *
3220: DAC 5 UNARY VERTICAL BAR
3221: DAC C$UUO
3222: DAC LLUNO
3223: *
3224: DAC 0 BINARY AT
3225: DAC C$UBO
3226: DAC LLATS
3227: DAC RRATS
3228: *
3229: DAC O$CAS CURSOR ASSIGNMENT
3230: DAC C$UNM
3231: DAC LLUNO
3232: *
3233: DAC 2 BINARY NUMBER SIGN
3234: DAC C$UBO
3235: DAC LLNUM
3236: DAC RRNUM
3237: *
3238: DAC 7 UNARY NUMBER SIGN
3239: DAC C$UUO
3240: DAC LLUNO
3241: *
3242: DAC O$DVD DIVISION
3243: DAC C$BVL
3244: DAC LLDVD
3245: DAC RRDVD
3246: *
3247: DAC 9 UNARY SLASH
3248: DAC C$UUO
3249: DAC LLUNO
3250: *
3251: DAC O$MLT MULTIPLICATION
3252: DAC C$BVL
3253: DAC LLMLT
3254: DAC RRMLT
3255: EJC
3256: *
3257: * OPERATOR DOPE VECTORS (CONTINUED)
3258: *
3259: DAC 0 DEFERRED EXPRESSION
3260: DAC C$DEF
3261: DAC LLUNO
3262: *
3263: DAC 3 BINARY PERCENT
3264: DAC C$UBO
3265: DAC LLPCT
3266: DAC RRPCT
3267: *
3268: DAC 8 UNARY PERCENT
3269: DAC C$UUO
3270: DAC LLUNO
3271: *
3272: DAC O$EXP EXPONENTIATION
3273: DAC C$BVL
3274: DAC LLEXP
3275: DAC RREXP
3276: *
3277: DAC 10 UNARY EXCLAMATION
3278: DAC C$UUO
3279: DAC LLUNO
3280: *
3281: DAC 4 BINARY NOT
3282: DAC C$UBO
3283: DAC LLNOT
3284: DAC RRNOT
3285: *
3286: DAC 0 NEGATION
3287: DAC C$NEG
3288: DAC LLUNO
3289: EJC
3290: *
3291: * OPERATOR DOPE VECTORS (CONTINUED)
3292: *
3293: DAC O$SUB SUBTRACTION
3294: DAC C$BVL
3295: DAC LLPLM
3296: DAC RRPLM
3297: *
3298: DAC O$COM COMPLEMENTATION
3299: DAC C$UVL
3300: DAC LLUNO
3301: *
3302: DAC O$ADD ADDITION
3303: DAC C$BVL
3304: DAC LLPLM
3305: DAC RRPLM
3306: *
3307: DAC O$AFF AFFIRMATION
3308: DAC C$UVL
3309: DAC LLUNO
3310: *
3311: DAC O$IMA IMMEDIATE ASSIGNMENT
3312: DAC C$BVN
3313: DAC LLDLD
3314: DAC RRDLD
3315: *
3316: DAC O$INV INDIRECTION
3317: DAC C$IND
3318: DAC LLUNO
3319: *
3320: DAC O$PAS PATTERN ASSIGNMENT
3321: DAC C$BVN
3322: DAC LLDLD
3323: DAC RRDLD
3324: *
3325: DAC O$NAM NAME REFERENCE
3326: DAC C$UNM
3327: DAC LLUNO
3328: *
3329: * SPECIAL DVS FOR GOTO OPERATORS (SEE PROCEDURE SCNGF)
3330: *
3331: OPDVD DAC O$GOD DIRECT GOTO
3332: DAC C$UVL
3333: DAC LLUNO
3334: *
3335: OPDVN DAC O$GOC COMPLEX NORMAL GOTO
3336: DAC C$UNM
3337: DAC LLUNO
3338: EJC
3339: *
3340: * OPERATOR ENTRY ADDRESS POINTERS, USED IN CODE
3341: *
3342: OAMN$ DAC O$AMN ARRAY REF (MULTI-SUBS BY VALUE)
3343: OAMV$ DAC O$AMV ARRAY REF (MULTI-SUBS BY VALUE)
3344: OAON$ DAC O$AON ARRAY REF (ONE SUB BY NAME)
3345: OAOV$ DAC O$AOV ARRAY REF (ONE SUB BY VALUE)
3346: OCER$ DAC O$CER COMPILATION ERROR
3347: OFEX$ DAC O$FEX FAILURE IN EXPRESSION EVALUATION
3348: OFIF$ DAC O$FIF FAILURE DURING GOTO EVALUATION
3349: OFNC$ DAC O$FNC FUNCTION CALL (MORE THAN ONE ARG)
3350: OFNE$ DAC O$FNE FUNCTION NAME ERROR
3351: OFNS$ DAC O$FNS FUNCTION CALL (SINGLE ARGUMENT)
3352: OGOF$ DAC O$GOF SET GOTO FAILURE TRAP
3353: OINN$ DAC O$INN INDIRECTION BY NAME
3354: OKWN$ DAC O$KWN KEYWORD REFERENCE BY NAME
3355: OLEX$ DAC O$LEX LOAD EXPRESSION BY NAME
3356: OLPT$ DAC O$LPT LOAD PATTERN
3357: OLVN$ DAC O$LVN LOAD VARIABLE NAME
3358: ONTA$ DAC O$NTA NEGATION, FIRST ENTRY
3359: ONTB$ DAC O$NTB NEGATION, SECOND ENTRY
3360: ONTC$ DAC O$NTC NEGATION, THIRD ENTRY
3361: OPMN$ DAC O$PMN PATTERN MATCH BY NAME
3362: OPMS$ DAC O$PMS PATTERN MATCH (STATEMENT)
3363: OPOP$ DAC O$POP POP TOP STACK ITEM
3364: ORNM$ DAC O$RNM RETURN NAME FROM EXPRESSION
3365: ORPL$ DAC O$RPL PATTERN REPLACEMENT
3366: ORVL$ DAC O$RVL RETURN VALUE FROM EXPRESSION
3367: OSLA$ DAC O$SLA SELECTION, FIRST ENTRY
3368: OSLB$ DAC O$SLB SELECTION, SECOND ENTRY
3369: OSLC$ DAC O$SLC SELECTION, THIRD ENTRY
3370: OSLD$ DAC O$SLD SELECTION, FOURTH ENTRY
3371: OSTP$ DAC O$STP STOP EXECUTION
3372: OUNF$ DAC O$UNF UNEXPECTED FAILURE
3373: EJC
3374: *
3375: * TABLE OF NAMES OF UNDEFINED BINARY OPERATORS FOR OPSYN
3376: *
3377: OPSNB DAC CH$AT AT
3378: DAC CH$AM AMPERSAND
3379: DAC CH$NM NUMBER
3380: DAC CH$PC PERCENT
3381: DAC CH$NT NOT
3382: *
3383: * TABLE OF NAMES OF UNDEFINED UNARY OPERATORS FOR OPSYN
3384: *
3385: OPNSU DAC CH$BR VERTICAL BAR
3386: DAC CH$EQ EQUAL
3387: DAC CH$NM NUMBER
3388: DAC CH$PC PERCENT
3389: DAC CH$SL SLASH
3390: DAC CH$EX EXCLAMATION
3391: .IF .CNPF
3392: .ELSE
3393: *
3394: * ADDRESS CONST CONTAINING PROFILE TABLE ENTRY SIZE
3395: *
3396: PFI2A DAC PF$I2
3397: *
3398: * PROFILER MESSAGE STRINGS
3399: *
3400: PFMS1 DAC B$SCL
3401: DAC 15
3402: DDC /PROGRAM PROFILE/
3403: PFMS2 DAC B$SCL
3404: DAC 42
3405: DDC /STMT NUMBER OF -- EXECUTION TIME --/
3406: PFMS3 DAC B$SCL
3407: DAC 47
3408: DDC /NUMBER EXECUTIONS TOTAL(MSEC) PER EXCN(MCSEC)/
3409: .FI
3410: .IF .CNRA
3411: .ELSE
3412: *
3413: * REAL CONSTANTS FOR GENERAL USE. NOTE THAT THE CONSTANTS
3414: * STARTING AT REAV1 FORM A POWERS OF TEN TABLE (GTSTG)
3415: *
3416: REAV0 DRC +0.0 0.0
3417: REAP1 DRC +0.1 0.1
3418: REAP5 DRC +0.5 0.5
3419: REAV1 DRC +1.0 10**0
3420: REAVT DRC +1.0E+1 10**1
3421: DRC +1.0E+2 10**2
3422: DRC +1.0E+3 10**3
3423: DRC +1.0E+4 10**4
3424: DRC +1.0E+5 10**5
3425: DRC +1.0E+6 10**6
3426: DRC +1.0E+7 10**7
3427: DRC +1.0E+8 10**8
3428: DRC +1.0E+9 10**9
3429: REATT DRC +1.0E+10 10**10
3430: .FI
3431: EJC
3432: *
3433: * STRING CONSTANTS (SCBLK FORMAT) FOR DTYPE PROCEDURE
3434: *
3435: SCARR DAC B$SCL ARRAY
3436: DAC 5
3437: DTC /ARRAY/
3438: .IF .CNBF
3439: .ELSE
3440: *
3441: SCBUF DAC B$SCL
3442: DAC 6
3443: DTC /BUFFER/
3444: .FI
3445: *
3446: SCCOD DAC B$SCL CODE
3447: DAC 4
3448: DTC /CODE/
3449: *
3450: SCEXP DAC B$SCL EXPRESSION
3451: DAC 10
3452: DTC /EXPRESSION/
3453: *
3454: SCEXT DAC B$SCL EXTERNAL
3455: DAC 8
3456: DTC /EXTERNAL/
3457: *
3458: SCINT DAC B$SCL INTEGER
3459: DAC 7
3460: DTC /INTEGER/
3461: *
3462: SCNAM DAC B$SCL NAME
3463: DAC 4
3464: DTC /NAME/
3465: *
3466: SCNUM DAC B$SCL NUMERIC
3467: DAC 7
3468: DTC /NUMERIC/
3469: *
3470: SCPAT DAC B$SCL PATTERN
3471: DAC 7
3472: DTC /PATTERN/
3473: .IF .CNRA
3474: .ELSE
3475: *
3476: SCREA DAC B$SCL REAL
3477: DAC 4
3478: DTC /REAL/
3479: .FI
3480: *
3481: SCSTR DAC B$SCL STRING
3482: DAC 6
3483: DTC /STRING/
3484: *
3485: SCTAB DAC B$SCL TABLE
3486: DAC 5
3487: DTC /TABLE/
3488: EJC
3489: *
3490: * STRING CONSTANTS (SCBLK FORMAT) FOR KVRTN (SEE RETRN)
3491: *
3492: SCFRT DAC B$SCL FRETURN
3493: DAC 7
3494: DTC /FRETURN/
3495: *
3496: SCNRT DAC B$SCL NRETURN
3497: DAC 7
3498: DTC /NRETURN/
3499: *
3500: SCRTN DAC B$SCL RETURN
3501: DAC 6
3502: DTC /RETURN/
3503: *
3504: * DATATYPE NAME TABLE FOR DTYPE PROCEDURE. THE ORDER OF
3505: * THESE ENTRIES IS TIED TO THE B$XXX DEFINITIONS FOR BLOCKS
3506: *
3507: SCNMT DAC SCARR ARBLK ARRAY
3508: .IF .CNBF
3509: .ELSE
3510: DAC SCBUF BFBLK BUFFER
3511: .FI
3512: DAC SCCOD CDBLK CODE
3513: DAC SCEXP EXBLK EXPRESSION
3514: DAC SCINT ICBLK INTEGER
3515: DAC SCNAM NMBLK NAME
3516: DAC SCPAT P0BLK PATTERN
3517: DAC SCPAT P1BLK PATTERN
3518: DAC SCPAT P2BLK PATTERN
3519: .IF .CNRA
3520: .ELSE
3521: DAC SCREA RCBLK REAL
3522: .FI
3523: DAC SCSTR SCBLK STRING
3524: DAC SCEXP SEBLK EXPRESSION
3525: DAC SCTAB TBBLK TABLE
3526: DAC SCARR VCBLK ARRAY
3527: DAC SCEXT XNBLK EXTERNAL
3528: DAC SCEXT XRBLK EXTERNAL
3529: *
3530: .IF .CNRA
3531: .ELSE
3532: * STRING CONSTANT FOR REAL ZERO
3533: *
3534: SCRE0 DAC B$SCL
3535: DAC 2
3536: DTC /0./
3537: .FI
3538: EJC
3539: *
3540: * USED TO RE-INITIALISE KVSTL
3541: *
3542: .IF .CS16
3543: STLIM DIC +32767 DEFAULT STATEMENT LIMIT
3544: .ELSE
3545: STLIM DIC +50000 DEFAULT STATEMENT LIMIT
3546: .FI
3547: *
3548: * DUMMY FUNCTION BLOCK USED FOR UNDEFINED FUNCTIONS
3549: *
3550: STNDF DAC O$FUN PTR TO UNDEFINED FUNCTION ERR CALL
3551: DAC 0 DUMMY FARGS COUNT FOR CALL CIRCUIT
3552: *
3553: * DUMMY CODE BLOCK USED FOR UNDEFINED LABELS
3554: *
3555: STNDL DAC L$UND CODE PTR POINTS TO UNDEFINED LBL
3556: *
3557: * DUMMY OPERATOR BLOCK USED FOR UNDEFINED OPERATORS
3558: *
3559: STNDO DAC O$OUN PTR TO UNDEFINED OPERATOR ERR CALL
3560: DAC 0 DUMMY FARGS COUNT FOR CALL CIRCUIT
3561: *
3562: * STANDARD VARIABLE BLOCK. THIS BLOCK IS USED TO INITIALIZE
3563: * THE FIRST SEVEN FIELDS OF A NEWLY CONSTRUCTED VRBLK.
3564: * ITS FORMAT IS TIED TO THE VRBLK DEFINITIONS (SEE GTNVR).
3565: *
3566: STNVR DAC B$VRL VRGET
3567: DAC B$VRS VRSTO
3568: DAC NULLS VRVAL
3569: DAC B$VRG VRTRA
3570: DAC STNDL VRLBL
3571: DAC STNDF VRFNC
3572: DAC 0 VRNXT
3573: EJC
3574: *
3575: * MESSAGES USED IN END OF RUN PROCESSING (STOPR)
3576: *
3577: STPM1 DAC B$SCL
3578: DAC 12
3579: DDC /IN STATEMENT/
3580: *
3581: STPM2 DAC B$SCL
3582: DAC 14
3583: DDC /STMTS EXECUTED/
3584: *
3585: STPM3 DAC B$SCL
3586: DAC 13
3587: .IF .CTMD
3588: DDC /RUN TIME-DSEC/
3589: .ELSE
3590: DDC /RUN TIME-MSEC/
3591: .FI
3592: *
3593: STPM4 DAC B$SCL
3594: DAC 12
3595: DDC $MCSEC / STMT$
3596: *
3597: STPM5 DAC B$SCL
3598: DAC 13
3599: DDC /REGENERATIONS/
3600: *
3601: * TABLE USED BY CONVERT FUNCTION TO CHECK DATATYPE NAME
3602: * THE ENTRIES ARE ORDERED TO CORRESPOND TO BRANCH TABLE
3603: * IN S$CNV
3604: *
3605: SVCTB DAC SCSTR STRING
3606: DAC SCINT INTEGER
3607: DAC SCNAM NAME
3608: DAC SCPAT PATTERN
3609: DAC SCARR ARRAY
3610: DAC SCTAB TABLE
3611: DAC SCEXP EXPRESSION
3612: DAC SCCOD CODE
3613: DAC SCNUM NUMERIC
3614: .IF .CNRA
3615: .ELSE
3616: DAC SCREA REAL
3617: .FI
3618: .IF .CNBF
3619: .ELSE
3620: DAC SCBUF BUFFER
3621: .FI
3622: DAC 0 ZERO MARKS END OF LIST
3623: EJC
3624: *
3625: * MESSAGES (SCBLK FORMAT) USED BY TRACE PROCEDURES
3626: *
3627: *
3628: TMASB DAC B$SCL
3629: DAC 13
3630: DTC /************ /
3631: *
3632: TMBEB DAC B$SCL
3633: DAC 3
3634: DTC / = /
3635: *
3636: * DUMMY TRBLK FOR EXPRESSION VARIABLE
3637: *
3638: TRBEV DAC B$TRT DUMMY TRBLK
3639: *
3640: * DUMMY TRBLK FOR KEYWORD VARIABLE
3641: *
3642: TRBKV DAC B$TRT DUMMY TRBLK
3643: *
3644: * DUMMY CODE BLOCK TO RETURN CONTROL TO TRXEQ PROCEDURE
3645: *
3646: TRXDR DAC O$TXR BLOCK POINTS TO RETURN ROUTINE
3647: TRXDC DAC TRXDR POINTER TO BLOCK
3648: EJC
3649: *
3650: * STANDARD VARIABLE BLOCKS
3651: *
3652: * SEE SVBLK FORMAT FOR FULL DETAILS OF THE FORMAT. THE
3653: * VRBLKS ARE ORDERED BY LENGTH AND WITHIN EACH LENGTH THE
3654: * ORDER IS ALPHABETICAL BY NAME OF THE VARIABLE.
3655: *
3656: V$EQF DBC SVFPR EQ
3657: DAC 2
3658: DTC /EQ/
3659: DAC S$EQF
3660: DAC 2
3661: *
3662: V$GEF DBC SVFPR GE
3663: DAC 2
3664: DTC /GE/
3665: DAC S$GEF
3666: DAC 2
3667: *
3668: V$GTF DBC SVFPR GT
3669: DAC 2
3670: DTC /GT/
3671: DAC S$GTF
3672: DAC 2
3673: *
3674: V$LEF DBC SVFPR LE
3675: DAC 2
3676: DTC /LE/
3677: DAC S$LEF
3678: DAC 2
3679: *
3680: V$LTF DBC SVFPR LT
3681: DAC 2
3682: DTC /LT/
3683: DAC S$LTF
3684: DAC 2
3685: *
3686: V$NEF DBC SVFPR NE
3687: DAC 2
3688: DTC /NE/
3689: DAC S$NEF
3690: DAC 2
3691: *
3692: V$ANY DBC SVFNP ANY
3693: DAC 3
3694: DTC /ANY/
3695: DAC S$ANY
3696: DAC 1
3697: *
3698: V$ARB DBC SVKVC ARB
3699: DAC 3
3700: DTC /ARB/
3701: DAC K$ARB
3702: DAC NDARB
3703: EJC
3704: *
3705: * STANDARD VARIABLE BLOCKS (CONTINUED)
3706: *
3707: V$ARG DBC SVFNN ARG
3708: DAC 3
3709: DTC /ARG/
3710: DAC S$ARG
3711: DAC 2
3712: *
3713: V$BAL DBC SVKVC BAL
3714: DAC 3
3715: DTC /BAL/
3716: DAC K$BAL
3717: DAC NDBAL
3718: *
3719: V$CTI DBC SVFNP CTI
3720: DAC 3
3721: DTC /CTI/
3722: DAC S$CTI
3723: DAC 1
3724: *
3725: V$END DBC SVLBL END
3726: DAC 3
3727: DTC /END/
3728: DAC L$END
3729: *
3730: V$ITC DBC SVFNN ITC
3731: DAC 3
3732: DTC /ITC/
3733: DAC S$ITC
3734: DAC 1
3735: *
3736: V$LEN DBC SVFNP LEN
3737: DAC 3
3738: DTC /LEN/
3739: DAC S$LEN
3740: DAC 1
3741: *
3742: V$LEQ DBC SVFPR LEQ
3743: DAC 3
3744: DTC /LEQ/
3745: DAC S$LEQ
3746: DAC 2
3747: *
3748: V$LGE DBC SVFPR LGE
3749: DAC 3
3750: DTC /LGE/
3751: DAC S$LGE
3752: DAC 2
3753: *
3754: V$LGT DBC SVFPR LGT
3755: DAC 3
3756: DTC /LGT/
3757: DAC S$LGT
3758: DAC 2
3759: *
3760: V$LLE DBC SVFPR LLE
3761: DAC 3
3762: DTC /LLE/
3763: DAC S$LLE
3764: DAC 2
3765: EJC
3766: *
3767: * STANDARD VARIABLE BLOCKS (CONTINUED)
3768: *
3769: V$LLT DBC SVFPR LLT
3770: DAC 3
3771: DTC /LLT/
3772: DAC S$LLT
3773: DAC 2
3774: *
3775: V$LNE DBC SVFPR LNE
3776: DAC 3
3777: DTC /LNE/
3778: DAC S$LNE
3779: DAC 2
3780: *
3781: V$POS DBC SVFNP POS
3782: DAC 3
3783: DTC /POS/
3784: DAC S$POS
3785: DAC 1
3786: *
3787: V$REM DBC SVKVC REM
3788: DAC 3
3789: DTC /REM/
3790: DAC K$REM
3791: DAC NDREM
3792: .IF .CUST
3793: *
3794: V$SET DBC SVFNN SET
3795: DAC 3
3796: DTC /SET/
3797: DAC S$SET
3798: DAC 3
3799: .FI
3800: *
3801: V$TAB DBC SVFNP TAB
3802: DAC 3
3803: DTC /TAB/
3804: DAC S$TAB
3805: DAC 1
3806: *
3807: V$COD DBC SVFNK CODE
3808: DAC 4
3809: DTC /CODE/
3810: DAC K$COD
3811: DAC S$COD
3812: DAC 1
3813: *
3814: V$COP DBC SVFNN COPY
3815: DAC 4
3816: DTC /COPY/
3817: DAC S$COP
3818: DAC 1
3819: EJC
3820: *
3821: * STANDARD VARIABLE BLOCKS (CONTINUED)
3822: *
3823: V$DAT DBC SVFNN DATA
3824: DAC 4
3825: DTC /DATA/
3826: DAC S$DAT
3827: DAC 1
3828: *
3829: V$DTE DBC SVFNN DATE
3830: DAC 4
3831: DTC /DATE/
3832: DAC S$DTE
3833: DAC 0
3834: *
3835: V$DMP DBC SVFNK DUMP
3836: DAC 4
3837: DTC /DUMP/
3838: DAC K$DMP
3839: DAC S$DMP
3840: DAC 1
3841: *
3842: V$DUP DBC SVFNN DUPL
3843: DAC 4
3844: DTC /DUPL/
3845: DAC S$DUP
3846: DAC 2
3847: *
3848: V$EVL DBC SVFNN EVAL
3849: DAC 4
3850: DTC /EVAL/
3851: DAC S$EVL
3852: DAC 1
3853: .IF .CNEX
3854: .ELSE
3855: *
3856: V$EXT DBC SVFNN EXIT
3857: DAC 4
3858: DTC /EXIT/
3859: DAC S$EXT
3860: DAC 1
3861: .FI
3862: *
3863: V$FAL DBC SVKVC FAIL
3864: DAC 4
3865: DTC /FAIL/
3866: DAC K$FAL
3867: DAC NDFAL
3868: *
3869: V$HST DBC SVFNN HOST
3870: DAC 4
3871: DTC /HOST/
3872: DAC S$HST
3873: DAC 3
3874: EJC
3875: *
3876: * STANDARD VARIABLE BLOCKS (CONTINUED)
3877: *
3878: V$ITM DBC SVFNF ITEM
3879: DAC 4
3880: DTC /ITEM/
3881: DAC S$ITM
3882: DAC 999
3883: .IF .CNLD
3884: .ELSE
3885: *
3886: V$LOD DBC SVFNN LOAD
3887: DAC 4
3888: DTC /LOAD/
3889: DAC S$LOD
3890: DAC 2
3891: .FI
3892: *
3893: V$LPD DBC SVFNP LPAD
3894: DAC 4
3895: DTC /LPAD/
3896: DAC S$LPD
3897: DAC 3
3898: *
3899: V$RPD DBC SVFNP RPAD
3900: DAC 4
3901: DTC /RPAD/
3902: DAC S$RPD
3903: DAC 3
3904: EJC
3905: *
3906: * STANDARD VARIABLE BLOCKS (CONTINUED)
3907: *
3908: *
3909: V$RPS DBC SVFNP RPOS
3910: DAC 4
3911: DTC /RPOS/
3912: DAC S$RPS
3913: DAC 1
3914: *
3915: V$RTB DBC SVFNP RTAB
3916: DAC 4
3917: DTC /RTAB/
3918: DAC S$RTB
3919: DAC 1
3920: *
3921: V$SI$ DBC SVFNP SIZE
3922: DAC 4
3923: DTC /SIZE/
3924: DAC S$SI$
3925: DAC 1
3926: *
3927: .IF .CNSR
3928: .ELSE
3929: *
3930: V$SRT DBC SVFNN SORT
3931: DAC 4
3932: DTC /SORT/
3933: DAC S$SRT
3934: DAC 2
3935: .FI
3936: V$SPN DBC SVFNP SPAN
3937: DAC 4
3938: DTC /SPAN/
3939: DAC S$SPN
3940: DAC 1
3941: EJC
3942: *
3943: * STANDARD VARIABLE BLOCKS (CONTINUED)
3944: *
3945: V$STN DBC SVKNM STNO
3946: DAC 4
3947: DTC /STNO/
3948: DAC K$STN
3949: *
3950: V$TIM DBC SVFNN TIME
3951: DAC 4
3952: DTC /TIME/
3953: DAC S$TIM
3954: DAC 0
3955: *
3956: V$TRM DBC SVFNK TRIM
3957: DAC 4
3958: DTC /TRIM/
3959: DAC K$TRM
3960: DAC S$TRM
3961: DAC 1
3962: *
3963: V$ABO DBC SVKVL ABORT
3964: DAC 5
3965: DTC /ABORT/
3966: DAC K$ABO
3967: DAC L$ABO
3968: DAC NDABO
3969: *
3970: V$APP DBC SVFNF APPLY
3971: DAC 5
3972: DTC /APPLY/
3973: DAC S$APP
3974: DAC 999
3975: *
3976: V$ABN DBC SVFNP ARBNO
3977: DAC 5
3978: DTC /ARBNO/
3979: DAC S$ABN
3980: DAC 1
3981: *
3982: V$ARR DBC SVFNN ARRAY
3983: DAC 5
3984: DTC /ARRAY/
3985: DAC S$ARR
3986: DAC 2
3987: EJC
3988: *
3989: * STANDARD VARIABLE BLOCKS (CONTINUED)
3990: *
3991: V$BRK DBC SVFNP BREAK
3992: DAC 5
3993: DTC /BREAK/
3994: DAC S$BRK
3995: DAC 1
3996: *
3997: V$CLR DBC SVFNN CLEAR
3998: DAC 5
3999: DTC /CLEAR/
4000: DAC S$CLR
4001: DAC 1
4002: *
4003: V$EJC DBC SVFNN EJECT
4004: DAC 5
4005: DTC /EJECT/
4006: DAC S$EJC
4007: DAC 1
4008: *
4009: .IF .CNFN
4010: V$FEN DBC SVKVC FENCE
4011: .ELSE
4012: V$FEN DBC SVFPK FENCE
4013: .FI
4014: DAC 5
4015: DTC /FENCE/
4016: DAC K$FEN
4017: .IF .CNFN
4018: .ELSE
4019: DAC S$FNC
4020: DAC 1
4021: .FI
4022: DAC NDFEN
4023: *
4024: V$FLD DBC SVFNN FIELD
4025: DAC 5
4026: DTC /FIELD/
4027: DAC S$FLD
4028: DAC 2
4029: *
4030: V$IDN DBC SVFPR IDENT
4031: DAC 5
4032: DTC /IDENT/
4033: DAC S$IDN
4034: DAC 2
4035: *
4036: V$INP DBC SVFNK INPUT
4037: DAC 5
4038: DTC /INPUT/
4039: DAC K$INP
4040: DAC S$INP
4041: DAC 3
4042: *
4043: V$LOC DBC SVFNN LOCAL
4044: DAC 5
4045: DTC /LOCAL/
4046: DAC S$LOC
4047: DAC 2
4048: EJC
4049: * STANDARD VARIABLE BLOCKS (CONTINUED)
4050: *
4051: V$OPS DBC SVFNN OPSYN
4052: DAC 5
4053: DTC /OPSYN/
4054: DAC S$OPS
4055: DAC 3
4056: *
4057: V$RMD DBC SVFNP REMDR
4058: DAC 5
4059: DTC /REMDR/
4060: DAC S$RMD
4061: DAC 2
4062: .IF .CNSR
4063: .ELSE
4064: *
4065: V$RSR DBC SVFNN RSORT
4066: DAC 5
4067: DTC /RSORT/
4068: DAC S$RSR
4069: DAC 2
4070: .FI
4071: *
4072: V$TBL DBC SVFNN TABLE
4073: DAC 5
4074: DTC /TABLE/
4075: DAC S$TBL
4076: DAC 3
4077: *
4078: V$TRA DBC SVFNK TRACE
4079: DAC 5
4080: DTC /TRACE/
4081: DAC K$TRA
4082: DAC S$TRA
4083: DAC 4
4084: *
4085: V$ANC DBC SVKNM ANCHOR
4086: DAC 6
4087: DTC /ANCHOR/
4088: DAC K$ANC
4089: EJC
4090: *
4091: * STANDARD VARIABLE BLOCKS (CONTINUED)
4092: *
4093: .IF .CNBF
4094: .ELSE
4095: V$APN DBC SVFNN APPEND
4096: DAC 6
4097: DTC /APPEND/
4098: DAC S$APN
4099: DAC 2
4100: .FI
4101: *
4102: V$BKX DBC SVFNP BREAKX
4103: DAC 6
4104: DTC /BREAKX/
4105: DAC S$BKX
4106: DAC 1
4107: .IF .CNBF
4108: .ELSE
4109: V$BUF DBC SVFNN BUFFER
4110: DAC 6
4111: DTC /BUFFER/
4112: DAC S$BUF
4113: DAC 2
4114: .FI
4115: *
4116: V$DEF DBC SVFNN DEFINE
4117: DAC 6
4118: DTC /DEFINE/
4119: DAC S$DFN
4120: DAC 2
4121: *
4122: V$DET DBC SVFNN DETACH
4123: DAC 6
4124: DTC /DETACH/
4125: DAC S$DET
4126: DAC 1
4127: *
4128: V$DIF DBC SVFPR DIFFER
4129: DAC 6
4130: DTC /DIFFER/
4131: DAC S$DIF
4132: DAC 2
4133: *
4134: V$FTR DBC SVKNM FTRACE
4135: DAC 6
4136: DTC /FTRACE/
4137: DAC K$FTR
4138: EJC
4139: .IF .CNBF
4140: .ELSE
4141: *
4142: V$INS DBC SVFNN INSERT
4143: DAC 6
4144: DTC /INSERT/
4145: DAC S$INS
4146: DAC 4
4147: .FI
4148: *
4149: V$LST DBC SVKNM LASTNO
4150: DAC 6
4151: DTC /LASTNO/
4152: DAC K$LST
4153: *
4154: V$NAY DBC SVFNP NOTANY
4155: DAC 6
4156: DTC /NOTANY/
4157: DAC S$NAY
4158: DAC 1
4159: *
4160: V$OUP DBC SVFNK OUTPUT
4161: DAC 6
4162: DTC /OUTPUT/
4163: DAC K$OUP
4164: DAC S$OUP
4165: DAC 3
4166: *
4167: V$RET DBC SVLBL RETURN
4168: DAC 6
4169: DTC /RETURN/
4170: DAC L$RTN
4171: *
4172: V$STT DBC SVFNN STOPTR
4173: DAC 6
4174: DTC /STOPTR/
4175: DAC S$STT
4176: DAC 2
4177: EJC
4178: *
4179: * STANDARD VARIABLE BLOCKS (CONTINUED)
4180: *
4181: V$SUB DBC SVFNN SUBSTR
4182: DAC 6
4183: DTC /SUBSTR/
4184: DAC S$SUB
4185: DAC 3
4186: *
4187: V$UNL DBC SVFNN UNLOAD
4188: DAC 6
4189: DTC /UNLOAD/
4190: DAC S$UNL
4191: DAC 1
4192: *
4193: V$COL DBC SVFNN COLLECT
4194: DAC 7
4195: DTC /COLLECT/
4196: DAC S$COL
4197: DAC 1
4198: *
4199: V$CNV DBC SVFNN CONVERT
4200: DAC 7
4201: DTC /CONVERT/
4202: DAC S$CVT
4203: DAC 2
4204: *
4205: V$ENF DBC SVFNN ENDFILE
4206: DAC 7
4207: DTC /ENDFILE/
4208: DAC S$ENF
4209: DAC 2
4210: *
4211: V$ETX DBC SVKNM ERRTEXT
4212: DAC 7
4213: DTC /ERRTEXT/
4214: DAC K$ETX
4215: *
4216: V$ERT DBC SVKNM ERRTYPE
4217: DAC 7
4218: DTC /ERRTYPE/
4219: DAC K$ERT
4220: *
4221: V$FRT DBC SVLBL FRETURN
4222: DAC 7
4223: DTC /FRETURN/
4224: DAC L$FRT
4225: *
4226: V$INT DBC SVFPR INTEGER
4227: DAC 7
4228: DTC /INTEGER/
4229: DAC S$INT
4230: DAC 1
4231: *
4232: V$NRT DBC SVLBL NRETURN
4233: DAC 7
4234: DTC /NRETURN/
4235: DAC L$NRT
4236: EJC
4237: *
4238: * STANDARD VARIABLE BLOCKS (CONTINUED)
4239: .IF .CNPF
4240: .ELSE
4241: *
4242: V$PFL DBC SVKNM PROFILE
4243: DAC 7
4244: DTC /PROFILE/
4245: DAC K$PFL
4246: .FI
4247: *
4248: *
4249: V$RPL DBC SVFNP REPLACE
4250: DAC 7
4251: DTC /REPLACE/
4252: DAC S$RPL
4253: DAC 3
4254: *
4255: V$RVS DBC SVFNP REVERSE
4256: DAC 7
4257: DTC /REVERSE/
4258: DAC S$RVS
4259: DAC 1
4260: *
4261: V$RTN DBC SVKNM RTNTYPE
4262: DAC 7
4263: DTC /RTNTYPE/
4264: DAC K$RTN
4265: *
4266: V$STX DBC SVFNN SETEXIT
4267: DAC 7
4268: DTC /SETEXIT/
4269: DAC S$STX
4270: DAC 1
4271: *
4272: V$STC DBC SVKNM STCOUNT
4273: DAC 7
4274: DTC /STCOUNT/
4275: DAC K$STC
4276: *
4277: V$STL DBC SVKNM STLIMIT
4278: DAC 7
4279: DTC /STLIMIT/
4280: DAC K$STL
4281: *
4282: V$SUC DBC SVKVC SUCCEED
4283: DAC 7
4284: DTC /SUCCEED/
4285: DAC K$SUC
4286: DAC NDSUC
4287: *
4288: V$VDF DBC SVFPR VDIFFER
4289: DAC 7
4290: DTC /VDIFFER/
4291: DAC S$VDF
4292: DAC 2
4293: *
4294: V$ALP DBC SVKWC ALPHABET
4295: DAC 8
4296: DTC /ALPHABET/
4297: DAC K$ALP
4298: EJC
4299: *
4300: * STANDARD VARIABLE BLOCKS (CONTINUED)
4301: *
4302: V$CNT DBC SVLBL CONTINUE
4303: DAC 8
4304: DTC /CONTINUE/
4305: DAC L$CNT
4306: *
4307: V$DTP DBC SVFNP DATATYPE
4308: DAC 8
4309: DTC /DATATYPE/
4310: DAC S$DTP
4311: DAC 1
4312: *
4313: V$ERL DBC SVKNM ERRLIMIT
4314: DAC 8
4315: DTC /ERRLIMIT/
4316: DAC K$ERL
4317: *
4318: V$FNC DBC SVKNM FNCLEVEL
4319: DAC 8
4320: DTC /FNCLEVEL/
4321: DAC K$FNC
4322: *
4323: V$MXL DBC SVKNM MAXLNGTH
4324: DAC 8
4325: DTC /MAXLNGTH/
4326: DAC K$MXL
4327: *
4328: V$TER DBC 0 TERMINAL
4329: DAC 8
4330: DTC /TERMINAL/
4331: DAC 0
4332: *
4333: V$PRO DBC SVFNN PROTOTYPE
4334: DAC 9
4335: DTC /PROTOTYPE/
4336: DAC S$PRO
4337: DAC 1
4338: *
4339: DBC 0 DUMMY ENTRY TO END LIST
4340: DAC 10 LENGTH GT 9 (PROTOTYPE)
4341: EJC
4342: *
4343: * LIST OF SVBLK POINTERS FOR KEYWORDS TO BE DUMPED. THE
4344: * LIST IS IN THE ORDER WHICH APPEARS ON THE DUMP OUTPUT.
4345: *
4346: VDMKW DAC V$ANC ANCHOR
4347: DAC V$COD CODE
4348: DAC V$DMP DUMP
4349: DAC V$ERL ERRLIMIT
4350: DAC V$ETX ERRTEXT
4351: DAC V$ERT ERRTYPE
4352: DAC V$FNC FNCLEVEL
4353: DAC V$FTR FTRACE
4354: DAC V$INP INPUT
4355: DAC V$LST LASTNO
4356: DAC V$MXL MAXLENGTH
4357: DAC V$OUP OUTPUT
4358: .IF .CNPF
4359: .ELSE
4360: DAC V$PFL PROFILE
4361: .FI
4362: DAC V$RTN RTNTYPE
4363: DAC V$STC STCOUNT
4364: DAC V$STL STLIMIT
4365: DAC V$STN STNO
4366: DAC V$TRA TRACE
4367: DAC V$TRM TRIM
4368: DAC 0 END OF LIST
4369: *
4370: * TABLE USED BY GTNVR TO SEARCH SVBLK LISTS
4371: *
4372: VSRCH DAC 0 DUMMY ENTRY TO GET PROPER INDEXING
4373: DAC V$EQF START OF 1 CHAR VARIABLES (NONE)
4374: DAC V$EQF START OF 2 CHAR VARIABLES
4375: DAC V$ANY START OF 3 CHAR VARIABLES
4376: DAC V$COD START OF 4 CHAR VARIABLES
4377: DAC V$ABO START OF 5 CHAR VARIABLES
4378: DAC V$ANC START OF 6 CHAR VARIABLES
4379: DAC V$COL START OF 7 CHAR VARIABLES
4380: DAC V$ALP START OF 8 CHAR VARIABLES
4381: DAC V$PRO START OF 9 CHAR VARIABLES
4382: TTL S P I T B O L -- WORKING STORAGE SECTION
4383: *
4384: * THE WORKING STORAGE SECTION CONTAINS AREAS WHICH ARE
4385: * CHANGED DURING EXECUTION OF THE PROGRAM. THE VALUE
4386: * ASSEMBLED IS THE INITIAL VALUE BEFORE EXECUTION STARTS.
4387: *
4388: * ALL THESE AREAS ARE FIXED LENGTH AREAS. VARIABLE LENGTH
4389: * DATA IS STORED IN THE STATIC OR DYNAMIC REGIONS OF THE
4390: * ALLOCATED DATA AREAS.
4391: *
4392: * THE VALUES IN THIS AREA ARE DESCRIBED EITHER AS WORK
4393: * AREAS OR AS GLOBAL VALUES. A WORK AREA IS USED IN AN
4394: * EPHEMERAL MANNER AND THE VALUE IS NOT SAVED FROM ONE
4395: * ENTRY INTO A ROUTINE TO ANOTHER. A GLOBAL VALUE IS A
4396: * LESS TEMPORARY LOCATION WHOSE VALUE IS SAVED FROM ONE
4397: * CALL TO ANOTHER.
4398: *
4399: * A GENERAL PART OF THE APPROACH IN THIS PROGRAM IS NOT
4400: * TO OVERLAP WORK AREAS BETWEEN PROCEDURES EVEN THOUGH A
4401: * SMALL AMOUNT OF SPACE COULD BE SAVED. SUCH OVERLAP IS
4402: * CONSIDERED A SOURCE OF PROGRAM ERRORS AND DECREASES THE
4403: * INFORMATION LEFT BEHIND AFTER A SYSTEM CRASH OF ANY KIND.
4404: *
4405: * THE NAMES OF THESE LOCATIONS ARE LABELS WITH FIVE LETTER
4406: * (A-Y,$) NAMES. AS FAR AS POSSIBLE THE ORDER IS KEPT
4407: * ALPHABETICAL BY THESE NAMES BUT IN SOME CASES THERE
4408: * ARE SLIGHT DEPARTURES CAUSED BY OTHER ORDER REQUIREMENTS.
4409: *
4410: * UNLESS OTHERWISE DOCUMENTED, THE ORDER OF WORK AREAS
4411: * DOES NOT AFFECT THE EXECUTION OF THE SPITBOL PROGRAM.
4412: *
4413: SEC START OF WORKING STORAGE SECTION
4414: EJC
4415: *
4416: * THIS AREA IS NOT CLEARED BY INITIAL CODE
4417: *
4418: CMLAB DAC B$SCL STRING USED TO CHECK LABEL LEGALITY
4419: DAC 2
4420: DTC / /
4421: *
4422: * LABEL TO MARK START OF WORK AREA WHICH IS CLEARED
4423: *
4424: AAAAA DAC 0
4425: *
4426: * WORK AREAS FOR ALLOC PROCEDURE
4427: *
4428: ALDYN DAC 0 AMOUNT OF DYNAMIC STORE
4429: ALFSF DIC +0 FACTOR IN FREE STORE PCNTAGE CHECK
4430: ALLIA DIC +0 DUMP IA
4431: ALLSV DAC 0 SAVE WB IN ALLOC
4432: *
4433: * WORK AREAS FOR ALOST PROCEDURE
4434: *
4435: ALSTA DAC 0 SAVE WA IN ALOST
4436: *
4437: * SAVE AREAS FOR ARRAY FUNCTION (S$ARR)
4438: *
4439: ARCDM DAC 0 COUNT DIMENSIONS
4440: ARNEL DIC +0 COUNT ELEMENTS
4441: ARPTR DAC 0 OFFSET PTR INTO ARBLK
4442: ARSVL DIC +0 SAVE INTEGER LOW BOUND
4443: EJC
4444: * WORK AREAS FOR ARREF ROUTINE
4445: *
4446: ARFSI DIC +0 SAVE CURRENT EVOLVING SUBSCRIPT
4447: ARFXS DAC 0 SAVE BASE STACK POINTER
4448: *
4449: * WORK AREAS FOR B$EFC BLOCK ROUTINE
4450: *
4451: BEFOF DAC 0 SAVE OFFSET PTR INTO EFBLK
4452: *
4453: * WORK AREAS FOR B$PFC BLOCK ROUTINE
4454: *
4455: BPFPF DAC 0 SAVE PFBLK POINTER
4456: BPFSV DAC 0 SAVE OLD FUNCTION VALUE
4457: BPFXT DAC 0 POINTER TO STACKED ARGUMENTS
4458: *
4459: * SAVE AREAS FOR COLLECT FUNCTION (S$COL)
4460: *
4461: CLSVI DIC +0 SAVE INTEGER ARGUMENT
4462: *
4463: * GLOBAL VALUES FOR CMPIL PROCEDURE
4464: *
4465: CMERC DAC 0 COUNT OF INITIAL COMPILE ERRORS
4466: CMPXS DAC 0 SAVE STACK PTR IN CASE OF ERRORS
4467: CMPSN DAC 1 NUMBER OF NEXT STATEMENT TO COMPILE
4468: CMPSS DAC 0 SAVE SUBROUTINE STACK PTR
4469: *
4470: * WORK AREA FOR CNCRD
4471: *
4472: CNSCC DAC 0 POINTER TO CONTROL CARD STRING
4473: CNSWC DAC 0 WORD COUNT
4474: CNR$T DAC 0 POINTER TO R$TTL OR R$STL
4475: CNTTL DAC 0 FLAG FOR -TITLE, -STITL
4476: *
4477: * WORK AREAS FOR CONVERT FUNCTION (S$CNV)
4478: *
4479: CNVTP DAC 0 SAVE PTR INTO SCVTB
4480: *
4481: * FLAG FOR SUPPRESSION OF COMPILATION STATISTICS.
4482: *
4483: CPSTS DAC 0 SUPPRESS COMP. STATS IF NON ZERO
4484: *
4485: * GLOBAL VALUES FOR CONTROL CARD SWITCHES
4486: *
4487: .IF .CASL
4488: CSWCI DAC 0 0/1 FOR -NOCASEIG/CASEIG
4489: .FI
4490: CSWFL DAC 1 0/1 FOR -NOFAIL/-FAIL
4491: CSWIN DAC INILN XXX FOR -INXXX
4492: CSWLS DAC 1 0/1 FOR -NOLIST/-LIST
4493: EJC
4494: *
4495: * GLOBAL LOCATION USED BY PATST PROCEDURE
4496: *
4497: CTMSK DBC 0 LAST BIT POSITION USED IN R$CTP
4498: CURID DAC 0 CURRENT ID VALUE
4499: *
4500: * GLOBAL VALUE FOR CDWRD PROCEDURE
4501: *
4502: CWCOF DAC 0 NEXT WORD OFFSET IN CURRENT CCBLK
4503: *
4504: * WORK AREAS FOR DATA FUNCTION (S$DAT)
4505: *
4506: DATDV DAC 0 SAVE VRBLK PTR FOR DATATYPE NAME
4507: DATXS DAC 0 SAVE INITIAL STACK POINTER
4508: *
4509: * WORK AREAS FOR DEFINE FUNCTION (S$DEF)
4510: *
4511: DEFLB DAC 0 SAVE VRBLK PTR FOR LABEL
4512: DEFNA DAC 0 COUNT FUNCTION ARGUMENTS
4513: DEFVR DAC 0 SAVE VRBLK PTR FOR FUNCTION NAME
4514: DEFXS DAC 0 SAVE INITIAL STACK POINTER
4515: *
4516: * WORK AREAS FOR DUMPR PROCEDURE
4517: *
4518: DMARG DAC 0 DUMP ARGUMENT
4519: DMPKB DAC B$KVT DUMMY KVBLK FOR USE IN DUMPR
4520: DMPKT DAC TRBKV KVVAR TRBLK POINTER
4521: DMPKN DAC 0 KEYWORD NUMBER (MUST FOLLOW DMPKB)
4522: DMPSA DAC 0 PRESERVE WA OVER PRTVL CALL
4523: DMPSV DAC 0 GENERAL SCRATCH SAVE
4524: DMVCH DAC 0 CHAIN POINTER FOR VARIABLE BLOCKS
4525: DMPCH DAC 0 SAVE SORTED VRBLK CHAIN POINTER
4526: *
4527: * GLOBAL LOCATIONS FOR DYNAMIC STORAGE POINTERS
4528: *
4529: DNAMB DAC 0 START OF DYNAMIC AREA
4530: DNAMP DAC 0 NEXT AVAILABLE LOC IN DYNAMIC AREA
4531: DNAME DAC 0 END OF AVAILABLE DYNAMIC AREA
4532: *
4533: * WORK AREAS FOR DUPL FUNCTION (S$DUP)
4534: *
4535: DUPSI DIC +0 STORE INTEGER STRING LENGTH
4536: *
4537: * WORK AREA FOR ENDFILE (S$ENF)
4538: *
4539: ENFCH DAC 0 FOR IOCHN CHAIN HEAD
4540: *
4541: * WORK AREA FOR ERROR PROCESSING.
4542: *
4543: EROSN DAC 0 FLAG FOR SPECIAL EROSI RETURN
4544: ERRFT DAC 0 FATAL ERROR FLAG
4545: ERRSP DAC 0 ERROR SUPPRESSION FLAG
4546: EJC
4547: *
4548: * DUMP AREA FOR ERTEX
4549: *
4550: ERTWA DAC 0 SAVE WA
4551: ERTWB DAC 0 SAVE WB
4552: *
4553: * GLOBAL VALUES FOR EVALI
4554: *
4555: EVLIN DAC P$LEN DUMMY PATTERN BLOCK PCODE
4556: EVLIS DAC 0 POINTER TO SUBSEQUENT NODE
4557: EVLIV DAC 0 VALUE OF PARAMETER
4558: *
4559: * WORK AREA FOR EXPAN
4560: *
4561: EXPSV DAC 0 SAVE OP DOPE VECTOR POINTER
4562: *
4563: * FLAG FOR SUPPRESSION OF EXECUTION STATS
4564: *
4565: EXSTS DAC 0 SUPPRESS EXEC STATS IF SET
4566: *
4567: * GLOBAL VALUES FOR EXFAL AND RETURN
4568: *
4569: FLPRT DAC 0 LOCATION OF FAIL OFFSET FOR RETURN
4570: FLPTR DAC 0 LOCATION OF FAILURE OFFSET ON STACK
4571: *
4572: * WORK AREAS FOR GBCOL PROCEDURE
4573: *
4574: GBCFL DAC 0 GARBAGE COLLECTOR ACTIVE FLAG
4575: GBCLM DAC 0 POINTER TO LAST MOVE BLOCK (PASS 3)
4576: GBCNM DAC 0 DUMMY FIRST MOVE BLOCK
4577: GBCNS DAC 0 REST OF DUMMY BLOCK (FOLLOWS GBCNM)
4578: GBSVA DAC 0 SAVE WA
4579: GBSVB DAC 0 SAVE WB
4580: GBSVC DAC 0 SAVE WC
4581: *
4582: * GLOBAL LOCATION TO COUNT GARBAGE COLLECTIONS (GBCOL)
4583: *
4584: GBCNT DAC 0 COUNT OF GARBAGE COLLECTIONS
4585: *
4586: * WORK AREAS FOR GTNVR PROCEDURE
4587: *
4588: GNVHE DAC 0 PTR TO END OF HASH CHAIN
4589: GNVNW DAC 0 NUMBER OF WORDS IN STRING NAME
4590: GNVSA DAC 0 SAVE WA
4591: GNVSB DAC 0 SAVE WB
4592: GNVSP DAC 0 POINTER INTO VSRCH TABLE
4593: GNVST DAC 0 POINTER TO CHARS OF STRING
4594: *
4595: * GLOBAL VALUE FOR GTCOD AND GTEXP
4596: *
4597: GTCEF DAC 0 SAVE FAIL PTR IN CASE OF ERROR
4598: *
4599: * WORK AREAS FOR GTINT
4600: *
4601: GTINA DAC 0 SAVE WA
4602: GTINB DAC 0 SAVE WB
4603: EJC
4604: *
4605: * WORK AREAS FOR GTNUM PROCEDURE
4606: *
4607: GTNNF DAC 0 ZERO/NONZERO FOR RESULT +/-
4608: GTNSI DIC +0 GENERAL INTEGER SAVE
4609: .IF .CNRA
4610: .ELSE
4611: GTNDF DAC 0 0/1 FOR DEC POINT SO FAR NO/YES
4612: GTNES DAC 0 ZERO/NONZERO EXPONENT +/-
4613: GTNEX DIC +0 REAL EXPONENT
4614: GTNSC DAC 0 SCALE (PLACES AFTER POINT)
4615: GTNSR DRC +0.0 GENERAL REAL SAVE
4616: GTNSV DIC +0 SAVE IA
4617: GTNRD DAC 0 FLAG FOR OK REAL NUMBER
4618: .FI
4619: *
4620: * WORK AREAS FOR GTPAT PROCEDURE
4621: *
4622: GTPSB DAC 0 SAVE WB
4623: *
4624: * WORK AREAS FOR GTSTG PROCEDURE
4625: *
4626: GTSSF DAC 0 0/1 FOR RESULT +/-
4627: GTSVC DAC 0 SAVE WC
4628: GTSVB DAC 0 SAVE WB
4629: GTSWK DAC 0 PTR TO WORK AREA FOR GTSTG
4630: .IF .CNRA
4631: .ELSE
4632: GTSES DAC 0 CHAR + OR - FOR EXPONENT +/-
4633: GTSRS DRC +0.0 GENERAL REAL SAVE
4634: *
4635: * GLOBAL LOCATIONS (CONSTANTS) FOR GTSTG PROCEDURE
4636: *
4637: GTSRN DRC +0.0 ROUNDING FACTOR 0.5*10**-CFP$S
4638: GTSSC DRC +0.0 SCALING VALUE 10**CFP$S
4639: .FI
4640: EJC
4641: *
4642: * WORK AREAS FOR GTVAR PROCEDURE
4643: *
4644: GTVRC DAC 0 SAVE WC
4645: *
4646: * FLAGS FOR HEADER PRINTING
4647: *
4648: HEADN DAC 0 NON-ZERO IF HDRS NOT TO BE PRINTED
4649: HEADP DAC 0 HEADER PRINTED FLAG
4650: *
4651: * GLOBAL VALUES FOR VARIABLE HASH TABLE
4652: *
4653: HSHNB DIC +0 NUMBER OF HASH BUCKETS
4654: HSHTB DAC 0 POINTER TO START OF VRBLK HASH TABL
4655: HSHTE DAC 0 POINTER PAST END OF VRBLK HASH TABL
4656: *
4657: * WORK AREA FOR INIT
4658: *
4659: INICD DIC +0 CODE KWD VAL (NEEDED FOR BATCH)
4660: INISS DAC 0 SAVE SUBROUTINE STACK PTR
4661: INITR DAC 0 SAVE TERMINAL FLAG
4662: .IF .CNBF
4663: .ELSE
4664: *
4665: * SAVE AREA FOR INSBF
4666: *
4667: INSAB DAC 0 ENTRY WA PLUS ENTRY WB
4668: INSBB DAC 0 BFBLK POINTER
4669: INSBC DAC 0 BCBLK POINTER
4670: INSSA DAC 0 SAVE ENTRY WA
4671: INSSB DAC 0 SAVE ENTRY WB
4672: .FI
4673: *
4674: * WORK AREAS FOR IOPUT
4675: *
4676: IOPNF DAC 0 NAME OFFSET
4677: IOPVR DAC 0 FILETAG VRBLK
4678: IOPWA DAC 0 KEEP WA
4679: IOPWB DAC 0 KEEP WB
4680: IOPWC DAC 0 KEEP WC
4681: EJC
4682: *
4683: * GLOBAL VALUES FOR KEYWORD VALUES WHICH ARE STORED AS ONE
4684: * WORD INTEGERS. THESE VALUES MUST BE ASSEMBLED IN THE
4685: * FOLLOWING ORDER (AS DICTATED BY K$XXX DEFINITION VALUES).
4686: *
4687: KVANC DAC 0 ANCHOR
4688: KVDMP DAC 0 DUMP
4689: KVERL DAC 0 ERRLIMIT
4690: KVERT DAC 0 ERRTYPE
4691: KVFTR DAC 0 FTRACE
4692: KVINP DAC 1 INPUT
4693: KVMXL DAC 5000 MAXLENGTH
4694: KVOUP DAC 1 OUTPUT
4695: .IF .CNPF
4696: .ELSE
4697: KVPFL DAC 0 PROFILE
4698: .FI
4699: KVTRA DAC 0 TRACE
4700: KVTRM DAC 0 TRIM
4701: KVFNC DAC 0 FNCLEVEL
4702: KVLST DAC 0 LASTNO
4703: KVSTN DAC 0 STNO
4704: *
4705: * GLOBAL VALUES FOR OTHER KEYWORDS
4706: *
4707: KVALP DAC 0 ALPHABET
4708: KVRTN DAC NULLS RTNTYPE (SCBLK POINTER)
4709: KVCOD DIC 0 CODE
4710: .IF .CS16
4711: KVSTL DIC +32767 STLIMIT
4712: KVSTC DIC +32767 STCOUNT (COUNTS DOWN FROM STLIMIT)
4713: .ELSE
4714: KVSTL DIC +50000 STLIMIT
4715: KVSTC DIC +50000 STCOUNT (COUNTS DOWN FROM STLIMIT)
4716: .FI
4717: .IF .CNLD
4718: .ELSE
4719: *
4720: * WORK AREAS FOR LOAD FUNCTION
4721: *
4722: LODFN DAC 0 POINTER TO VRBLK FOR FUNC NAME
4723: LODNA DAC 0 COUNT NUMBER OF ARGUMENTS
4724: .FI
4725: EJC
4726: *
4727: * GLOBAL VALUES FOR LISTR PROCEDURE
4728: *
4729: LSTLC DAC 0 COUNT LINES ON SOURCE LIST PAGE
4730: LSTNP DAC 0 MAX NUMBER OF LINES ON PAGE
4731: LSTPF DAC 1 SET NONZERO IF CURRENT IMAGE LISTED
4732: LSTPG DAC 0 CURRENT SOURCE LIST PAGE NUMBER
4733: LSTPO DAC 0 OFFSET TO PAGE NNN MESSAGE
4734: LSTSN DAC 0 REMEMBER LAST STMNUM LISTED
4735: *
4736: * MAXIMUM SIZE OF SPITBOL OBJECTS
4737: *
4738: MXLEN DAC 0 INITIALISED BY SYSMX CALL
4739: *
4740: * EXECUTION CONTROL VARIABLE
4741: *
4742: NOXEQ DAC 0 SET NON-ZERO TO INHIBIT EXECUTION
4743: .IF .CNPF
4744: .ELSE
4745: *
4746: * PROFILER GLOBAL VALUES AND WORK LOCATIONS
4747: *
4748: PFDMP DAC 0 SET NON-0 IF PROFILE SET NON-0
4749: PFFNC DAC 0 SET NON-0 IF FUNCT JUST ENTERED
4750: PFSTM DIC +0 TO STORE STARTING TIME OF STMT
4751: PFETM DIC +0 TO STORE ENDING TIME OF STMT
4752: PFSVW DAC 0 TO SAVE A W-REG
4753: PFTBL DAC 0 GETS ADRS OF (IMAG) TABLE BASE
4754: PFNTE DAC 0 NR OF TABLE ENTRIES
4755: PFSTE DIC +0 TABLE ENTRY SIZE IN BAUS
4756: .FI
4757: EJC
4758: *
4759: * GLOBAL VALUES USED IN PATTERN MATCH ROUTINES
4760: *
4761: PMDFL DAC 0 PATTERN ASSIGNMENT FLAG
4762: PMHBS DAC 0 HISTORY STACK BASE POINTER
4763: PMSSL DAC 0 LENGTH OF SUBJECT STRING IN CHARS
4764: *
4765: * GLOBAL VALUE FOR PRTNM PROCEDURE
4766: *
4767: PRNMV DAC 0 VRBLK PTR FROM LAST NAME SEARCH
4768: *
4769: * WORK AREAS FOR PRTNM PROCEDURE
4770: *
4771: PRNSI DIC +0 SCRATCH INTEGER LOC
4772: *
4773: * WORK AREAS FOR PRTSN PROCEDURE
4774: *
4775: PRSNA DAC 0 SAVE WA
4776: *
4777: * GLOBAL VALUES FOR PRINT PROCEDURES
4778: *
4779: PRAVL DAC 0 SET IF PRINT FILE AVAILABLE
4780: PRBLK DAC 0 ADDRESS OF BUFFER BLANKING STRING
4781: PRBUF DAC 0 PTR TO PRINT BFR IN STATIC
4782: PRCHS DAC 0 ADDRESS OF CHARS IN PRINT BUFFER
4783: PRCMV DAC 0 NO. OF BAUS TO MOVE IN BFR CLEARING
4784: PRECL DAC 0 EXTENDED/COMPACT LISTING FLAG
4785: PRLEN DAC 0 LENGTH OF PRINT BUFFER IN CHARS
4786: PROFS DAC 0 OFFSET TO NEXT LOCATION IN PRBUF
4787: PRPUT DAC 0 SET IF CHARS TO BE PUT IN BFR
4788: PRSTD DAC 0 TESTED BY PRTPG
4789: PRSTO DAC 0 STANDARD LISTING OPTION FLAG
4790: PRTEF DAC 0 ENDFILE FLAG
4791: *
4792: * WORK AREAS FOR PRTST, PTTST PROCEDURES
4793: *
4794: PRSVA DAC 0 SAVE WA
4795: PRSVB DAC 0 SAVE WB
4796: PRTVA DAC 0 SAVE WA
4797: PRTVB DAC 0 SAVE WB
4798: *
4799: * WORK AREA FOR PRTVL
4800: *
4801: PRVSI DAC 0 SAVE IDVAL
4802: *
4803: * WORK AREAS FOR PATTERN MATCH ROUTINES
4804: *
4805: PSAVE DAC 0 TEMPORARY SAVE FOR CURRENT NODE PTR
4806: PSAVC DAC 0 SAVE CURSOR IN P$SPN, P$STR
4807: EJC
4808: *
4809: * FLAG TO TELL ERROR THAT WE ARE READING SOURCE LINE
4810: *
4811: RDRER DAC 0 READ-SOURCE-LINE IN PROGRESS FLAG
4812: *
4813: * AMOUNT OF MEMORY RESERVED FOR END OF EXECUTION
4814: *
4815: RSMEM DAC 0 RESERVE MEMORY
4816: *
4817: * WORK AREAS FOR RETRN ROUTINE
4818: *
4819: RTNBP DAC 0 TO SAVE A BLOCK POINTER
4820: RTNFV DAC 0 NEW FUNCTION VALUE (RESULT)
4821: RTNSV DAC 0 OLD FUNCTION VALUE (SAVED VALUE)
4822: *
4823: * RELOCATABLE GLOBAL VALUES
4824: *
4825: * ALL THE POINTERS IN THIS SECTION CAN POINT TO BLOCKS IN
4826: * THE DYNAMIC STORAGE AREA AND MUST BE RELOCATED BY THE
4827: * GARBAGE COLLECTOR. THEY ARE IDENTIFIED BY R$XXX NAMES.
4828: *
4829: R$AAA DAC 0 START OF RELOCATABLE VALUES
4830: R$ARF DAC 0 ARRAY BLOCK POINTER FOR ARREF
4831: R$CCB DAC 0 PTR TO CCBLK BEING BUILT (CDWRD)
4832: R$CIM DAC 0 PTR TO CURRENT COMPILER INPUT STR
4833: R$CMP DAC 0 COPY OF R$CIM USED IN CMPIL
4834: R$CNI DAC 0 PTR TO NEXT COMPILER INPUT STRING
4835: R$CNT DAC 0 CDBLK POINTER FOR SETEXIT CONTINUE
4836: R$COD DAC 0 POINTER TO CURRENT CDBLK OR EXBLK
4837: R$COP DAC 0 PTR TO -COPY CHAIN STACK
4838: R$CTP DAC 0 PTR TO CURRENT CTBLK FOR PATST
4839: R$ERT DAC 0 TRBLK POINTER FOR ERRTYPE TRACE
4840: R$ETX DAC NULLS POINTER TO ERRTEXT STRING
4841: R$EXS DAC 0 = SAVE XL IN EXPDM
4842: R$FNC DAC 0 TRBLK POINTER FOR FNCLEVEL TRACE
4843: R$GTC DAC 0 KEEP CODE PTR FOR GTCOD,GTEXP
4844: R$IO1 DAC 0 FIRST ARGUMENT
4845: R$IOL DAC 0 SECOND ARGUMENT (FILETAG) SCBLK PTR
4846: R$IOR DAC 0 FILEPROPS SCBLK PTR
4847: R$IOT DAC 0 TRTIO TRACE BLK PTR
4848: .IF .CNBF
4849: .ELSE
4850: R$PMB DAC 0 BUFFER PTR IN PATTERN MATCH
4851: .FI
4852: R$PMS DAC 0 SUBJECT STRING PTR IN PATTERN MATCH
4853: R$RA2 DAC 0 REPLACE SECOND ARGUMENT LAST TIME
4854: R$RA3 DAC 0 REPLACE THIRD ARGUMENT LAST TIME
4855: R$RPT DAC 0 PTR TO CTBLK REPLACE TABLE LAST USD
4856: R$SCP DAC 0 SAVE POINTER FROM LAST SCANE CALL
4857: R$SXL DAC 0 PRESERVE XL IN SORTC
4858: R$SXR DAC 0 PRESERVE XR IN SORTA/SORTC
4859: R$STC DAC 0 TRBLK POINTER FOR STCOUNT TRACE
4860: R$STL DAC 0 SOURCE LISTING SUB-TITLE
4861: R$SXC DAC 0 CODE (CDBLK) PTR FOR SETEXIT TRAP
4862: R$TTL DAC NULLS SOURCE LISTING TITLE
4863: R$XSC DAC 0 STRING POINTER FOR XSCAN
4864: EJC
4865: *
4866: * THE REMAINING POINTERS IN THIS LIST ARE USED TO POINT
4867: * TO FUNCTION BLOCKS FOR NORMALLY UNDEFINED OPERATORS.
4868: *
4869: R$UBA DAC STNDO BINARY AT
4870: R$UBM DAC STNDO BINARY AMPERSAND
4871: R$UBN DAC STNDO BINARY NUMBER SIGN
4872: R$UBP DAC STNDO BINARY PERCENT
4873: R$UBT DAC STNDO BINARY NOT
4874: R$UUB DAC STNDO UNARY VERTICAL BAR
4875: R$UUE DAC STNDO UNARY EQUAL
4876: R$UUN DAC STNDO UNARY NUMBER SIGN
4877: R$UUP DAC STNDO UNARY PERCENT
4878: R$UUS DAC STNDO UNARY SLASH
4879: R$UUX DAC STNDO UNARY EXCLAMATION
4880: R$YYY DAC 0 LAST RELOCATABLE LOCATION
4881: *
4882: * WORK AREAS FOR SUBSTR FUNCTION (S$SUB)
4883: *
4884: SBSSV DAC 0 SAVE THIRD ARGUMENT
4885: *
4886: * GLOBAL LOCATIONS USED IN SCAN PROCEDURE
4887: *
4888: SCNBL DAC 0 SET NON-ZERO IF SCANNED PAST BLANKS
4889: SCNCC DAC 0 NON-ZERO TO SCAN CONTROL CARD NAME
4890: SCNGO DAC 0 SET NON-ZERO TO SCAN GOTO FIELD
4891: SCNIL DAC 0 LENGTH OF CURRENT INPUT IMAGE
4892: SCNPT DAC 0 POINTER TO NEXT LOCATION IN R$CIM
4893: SCNRS DAC 0 SET NON-ZERO TO SIGNAL RESCAN
4894: SCNTP DAC 0 SAVE SYNTAX TYPE FROM LAST CALL
4895: *
4896: * WORK AREAS FOR SCAN PROCEDURE
4897: *
4898: SCNSA DAC 0 SAVE WA
4899: SCNSB DAC 0 SAVE WB
4900: SCNSC DAC 0 SAVE WC
4901: SCNSE DAC 0 START OF CURRENT ELEMENT
4902: SCNOF DAC 0 SAVE OFFSET
4903: *
4904: * WORK AREA FOR DETACH PROCEDURE
4905: *
4906: SDETF DAC 0 TRACE BLOCK FLAG
4907: *
4908: * WORK AREA FOR ENDFILE PROCEDURE
4909: *
4910: SENFR DAC 0 SAVE XR
4911: .IF .CNSR
4912: .ELSE
4913: EJC
4914: *
4915: * WORK AREA USED BY SORTA, SORTC, SORTF, SORTH
4916: *
4917: SRTDF DAC 0 DATATYPE FIELD NAME
4918: SRTFD DAC 0 FOUND DFBLK ADDRESS
4919: SRTFF DAC 0 FOUND FIELD NAME
4920: SRTFO DAC 0 OFFSET TO FIELD NAME
4921: SRTNR DAC 0 NUMBER OF ROWS
4922: SRTOF DAC 0 OFFSET WITHIN ROW TO SORT KEY
4923: SRTRT DAC 0 ROOT OFFSET
4924: SRTS1 DAC 0 SAVE OFFSET 1
4925: SRTS2 DAC 0 SAVE OFFSET 2
4926: SRTSC DAC 0 SAVE WC
4927: SRTSF DAC 0 SORT ARRAY FIRST ROW OFFSET
4928: SRTSN DAC 0 SAVE N
4929: SRTSO DAC 0 OFFSET TO A(0)
4930: SRTSR DAC 0 0 , NON-ZERO FOR SORT, RSORT
4931: SRTST DAC 0 STRIDE FROM ONE ROW TO NEXT
4932: SRTWC DAC 0 DUMP WC
4933: .FI
4934: *
4935: * VALUES FOR INDICATING COMPILATION/EXECUTION STAGE
4936: *
4937: STAGE DAC 0 INITIAL VALUE = INITIAL COMPILE
4938: STAGX DAC 0 NON-ZERO IF EXECUTING
4939: *
4940: * GLOBAL VALUES DEFINING EXTENT OF STATIC AREA (ALOST)
4941: *
4942: STATB DAC 0 START OF STATIC AREA
4943: STATE DAC 0 END OF STATIC AREA
4944: EJC
4945: *
4946: * GLOBAL STACK POINTER
4947: *
4948: STBAS DAC 0 POINTER PAST STACK BASE
4949: *
4950: * WORK AREAS FOR STOPR ROUTINE
4951: *
4952: STPSI DIC +0 SAVE VALUE OF STCOUNT
4953: STPTI DIC +0 SAVE TIME ELAPSED
4954: STPXR DAC 0 SAVE XR
4955: *
4956: * GLOBAL VALUES FOR SETEXIT FUNCTION (S$STX)
4957: *
4958: STXOF DAC 0 FAILURE OFFSET
4959: STXVR DAC NULLS VRBLK POINTER OR NULL
4960: *
4961: * WORK AREAS FOR TFIND PROCEDURE
4962: *
4963: TFNSI DIC +0 NUMBER OF HEADERS
4964: *
4965: * GLOBAL VALUE FOR TIME KEEPING
4966: *
4967: TIMSX DIC +0 TIME AT START OF EXECUTION
4968: *
4969: * TERMINAL BUFFER ADDRESSES, FLAGS ETC
4970: *
4971: TTBLK DAC 0 BLANKING STRING ADRS
4972: TTBUF DAC 0 BUFFER ADRS
4973: TTCHS DAC 0 START OF BUFFER CHARACTERS
4974: TTCMV DAC 0 COUNT OF BLANKING CHARS TO MOVE
4975: TTERL DAC 0 ERROR FLAG
4976: TTINS DAC 0 NON-ZERO IF STD INPUT FROM TERML
4977: TTLEN DAC 0 LENGTH OF TERMINAL BUFFER
4978: TTLST DAC 0 COPY STD O/P TO TERML IF SET
4979: TTOFS DAC 0 OFFSET TO POSITION IN TERML BFR
4980: TTOUS DAC 0 SET IF STD OUTPUT TO TERMINAL
4981: *
4982: * WORK AREAS FOR XSCAN PROCEDURE
4983: *
4984: XSCBL DAC 0 COUNT OF TRAILING BLANKS
4985: XSCNB DAC 0 NON-ZERO IF NON-BLANKS SEEN
4986: XSCRT DAC 0 SAVE RETURN CODE
4987: XSCWB DAC 0 SAVE REGISTER WB
4988: *
4989: * GLOBAL VALUES FOR XSCAN AND XSCNI PROCEDURES
4990: *
4991: XSOFS DAC 0 OFFSET TO CURRENT LOCATION IN R$XSC
4992: *
4993: * LABEL TO MARK END OF WORK AREA
4994: *
4995: YYYYY DAC 0
4996: TTL S P I T B O L -- INITIALIZATION
4997: *
4998: * INITIALISATION
4999: * THE FOLLOWING SECTION RECEIVES CONTROL FROM THE SYSTEM
5000: * AT THE START OF A RUN WITH THE REGISTERS SET AS FOLLOWS.
5001: *
5002: * (XS) POINTS PAST STACK BASE
5003: * (XR) POINTS TO FIRST WORD OF DATA AREA
5004: * (XL) POINTS TO LAST WORD OF DATA AREA
5005: * (WA) INITIAL &CODE VALUE
5006: *
5007: SEC START OF PROGRAM SECTION
5008: *
5009: INITL RTN INITIALISATION CODE
5010: MOV WA,INICD SAVE INITIAL CODE KYWD VALUE
5011: .IF .CNBT
5012: MOV XR,STATB START ADDRESS OF STATIC
5013: .ELSE
5014: *
5015: * INITIALISE WORK AREA (ESSENTIAL FOR BATCHED RUNS)
5016: *
5017: MOV XR,WB PRESERVE XR
5018: MOV =YYYYY,WA POINT TO END OF WORK AREA
5019: SUB =AAAAA,WA GET LENGTH OF WORK AREA
5020: BTW WA CONVERT TO WORDS
5021: LCT WA,WA COUNT FOR LOOP
5022: MOV =AAAAA,XR SET UP INDEX REGISTER
5023: *
5024: * CLEAR WORK SPACE
5025: *
5026: INI01 ZER (XR)+ CLEAR A WORD
5027: BCT WA,INI01 LOOP TILL DONE
5028: MOV =STNDO,WA UNDEFINED OPERATORS POINTER
5029: MOV =R$YYY,WC POINT TO TABLE END
5030: SUB =R$UBA,WC LENGTH OF UNDEF. OPERATORS TABLE
5031: BTW WC CONVERT TO WORDS
5032: LCT WC,WC LOOP COUNTER
5033: MOV =R$UBA,XR SET UP XR
5034: *
5035: * SET CORRECT VALUE INTO UNDEFINED OPERATORS TABLE
5036: *
5037: INI02 MOV WA,(XR)+ STORE VALUE
5038: BCT WC,INI02 LOOP TILL ALL DONE
5039: MOV =NUM01,WA GET A 1
5040: MOV WA,CMPSN STATEMENT NO
5041: MOV WA,CSWFL NOFAIL
5042: MOV WA,CSWLS LIST
5043: MOV WA,KVINP INPUT
5044: MOV WA,KVOUP OUTPUT
5045: MOV WA,LSTPF NOTHING FOR LISTR YET
5046: MOV =INILN,WA INPUT IMAGE LENGTH
5047: MOV WA,CSWIN STORE FOR LATER USE
5048: MOV =B$KVT,DMPKB DUMP
5049: MOV =TRBKV,DMPKT DUMP
5050: MOV =P$LEN,EVLIN EVAL
5051: EJC
5052: MOV =NULLS,WA GET NULLSTRING POINTER
5053: MOV WA,KVRTN RETURN
5054: MOV WA,R$ETX ERRTEXT
5055: MOV WA,R$TTL TITLE FOR LISTING
5056: MOV WA,STXVR SETEXIT
5057: LDI STLIM GET DEFAULT STLIMIT
5058: STI KVSTL STATEMENT LIMIT
5059: STI KVSTC STATEMENT COUNT
5060: MOV WB,STATB STORE START ADRS OF STATIC
5061: .FI
5062: .IF .CSIG
5063: MNZ CSWCI -CASEIG
5064: .FI
5065: JSR SYSTM INITIALISE TIMER
5066: STI TIMSX STORE TIME
5067: LDI INICD LOAD INITIAL CODE KWD VALUE
5068: STI KVCOD STORE
5069: MOV *E$SRS,RSMEM RESERVE MEMORY
5070: MOV XS,STBAS STORE STACK BASE
5071: SSS INISS SAVE S-R STACK PTR
5072: *
5073: * NOW CONVERT FREE STORE PERCENTAGE TO A SUITABLE FACTOR
5074: * FOR EASY TESTING IN ALLOC ROUTINE.
5075: *
5076: LDI INTVH GET 100
5077: DVI ALFSP FORM 100 / ALFSP
5078: STI ALFSF STORE THE FACTOR
5079: .IF .CNRA
5080: .ELSE
5081: *
5082: * INITIALIZE VALUES FOR REAL CONVERSION ROUTINE
5083: *
5084: LCT WB,=CFP$S LOAD COUNTER FOR SIGNIFICANT DIGITS
5085: LDR REAV1 LOAD 1.0
5086: *
5087: * LOOP TO COMPUTE 10**(MAX NUMBER SIGNIFICANT DIGITS)
5088: *
5089: INI03 MLR REAVT * 10.0
5090: BCT WB,INI03 LOOP TILL DONE
5091: STR GTSSC STORE 10**(MAX SIG DIGITS)
5092: LDR REAP5 LOAD 0.5
5093: DVR GTSSC COMPUTE 0.5*10**(MAX SIG DIGITS)
5094: STR GTSRN STORE AS ROUNDING BIAS
5095: .FI
5096: ZER WC SET TO READ PARAMETERS
5097: JSR PRPAR READ THEM
5098: EJC
5099: *
5100: * NOW COMPUTE STARTING ADDRESS FOR DYNAMIC STORE AND IF
5101: * NECESSARY REQUEST MORE MEMORY.
5102: *
5103: SUB *E$SRS,XL ALLOW FOR RESERVE MEMORY
5104: MOV PRLEN,WA GET PRINT BUFFER LENGTH
5105: ADD TTLEN,WA ADD TERMINAL BUFFER LENGTH
5106: ADD WA,WA ALLOW FOR EQUALLY BIG BLANK STRINGS
5107: ADD =CFP$A,WA ADD NO. OF CHARS IN ALPHABET
5108: ADD =NSTMX,WA ADD CHARS FOR GTSTG BFR
5109: CTB WA,8 CONVERT TO BAUS, ALLOWING A MARGIN
5110: MOV STATB,XR POINT TO STATIC BASE
5111: ADD WA,XR INCREMENT FOR ABOVE BUFFERS
5112: ADD *E$HNB,XR INCREMENT FOR HASH TABLE
5113: ADD *E$STS,XR BUMP FOR INITIAL STATIC BLOCK
5114: JSR SYSMX GET MXLEN
5115: MOV WA,KVMXL PROVISIONALLY STORE AS MAXLNGTH
5116: MOV WA,MXLEN AND AS MXLEN
5117: BGT XR,WA,INI05 SKIP IF STATIC HI EXCEEDS MXLEN
5118: MOV WA,XR USE MXLEN INSTEAD
5119: ICA XR MAKE BIGGER THAN MXLEN
5120: *
5121: * HERE TO STORE VALUES WHICH MARK INITIAL DIVISION
5122: * OF DATA AREA INTO STATIC AND DYNAMIC
5123: *
5124: INI05 MOV XR,DNAMB DYNAMIC BASE ADRS
5125: MOV XR,DNAMP DYNAMIC PTR
5126: BNZ WA,INI06 SKIP IF NON-ZERO MXLEN
5127: DCA XR POINT A WORD IN FRONT
5128: MOV XR,KVMXL USE AS MAXLNGTH
5129: MOV XR,MXLEN AND AS MXLEN
5130: *
5131: * LOOP HERE IF NECESSARY TILL ENOUGH MEMORY OBTAINED
5132: * SO THAT DNAME IS ABOVE DNAMB
5133: *
5134: INI06 MOV XL,DNAME STORE DYNAMIC END ADDRESS
5135: BLT DNAMB,XL,INI08 SKIP IF HIGH ENOUGH
5136: JSR SYSMM REQUEST MORE MEMORY
5137: WTB XR CONVERT TO BAUS
5138: ADD XR,XL BUMP BY AMOUNT OBTAINED
5139: BNZ XR,INI06 TRY AGAIN
5140: MOV =ENDMO,XR POINT TO FAILURE MESSAGE
5141: MOV ENDML,WC MESSAGE LENGTH
5142: JSR SYSPR PRINT IT (PRTST NOT YET USABLE)
5143: PPM INI07
5144: PPM INI07
5145: *
5146: * EMERGENCY SHUTDOWN
5147: *
5148: INI07 MOV =KVCOD,WA CODE KEYWORD
5149: JSR SYSEJ PACK UP (STOPR NOT YET USABLE)
5150: EJC
5151: *
5152: * INITIALISE PRINT BUFFER WITH BLANK WORDS
5153: *
5154: INI08 MOV PRLEN,WA NO. OF CHARS IN PRINT BFR
5155: MOV STATB,XR POINT TO STATIC AGAIN
5156: MOV XR,PRBUF PRINT BFR IS PUT AT STATIC START
5157: MOV =B$SCL,(XR)+ STORE STRING TYPE CODE
5158: MOV WA,(XR)+ AND STRING LENGTH
5159: MOV XR,PRCHS KEEP ADRS OF BUFFER PROPER
5160: MOV XR,XL COPY IT
5161: CTB WA,0 WORDS NEEDED EXPRESSED IN BAUS
5162: MOV WA,PRCMV KEEP FOR CLEARING BUFFER
5163: MOV XR,PRBLK CONSTRUCT ADRS OF BLANKING STRING
5164: ADD WA,PRBLK ADD OFFSET TO BLANKING STRING
5165: ADD WA,WA CLEAR BOTH BFR AND BLANKING STRING
5166: MOV NULLW,(XR)+ CLEAR FIRST WORD
5167: BZE WA,INI09 SKIP IF NO PRINT BUFFER
5168: DCA WA ADJUST FOR FIRST WORD
5169: MVW PERFORM BLANKING
5170: *
5171: * SET UP TERMINAL BUFFER
5172: *
5173: INI09 MOV TTLEN,WA LENGTH OF TERMINAL BUFFER
5174: MOV XR,TTBUF ADRS OF TERMINAL STRING BUFFER
5175: MOV =B$SCL,(XR)+ STRING TYPE CODE
5176: MOV WA,(XR)+ STRING LENGTH
5177: MOV XR,TTCHS KEEP ADRS OF BUFFER PROPER
5178: MOV XR,XL COPY IT
5179: CTB WA,0 WORDS NEEDED EXPRESSED IN BAUS
5180: MOV WA,TTCMV KEEP FOR CLEARING BUFFER
5181: MOV XR,TTBLK CONSTRUCT ADRS OF BLANKING STRING
5182: ADD WA,TTBLK ADD OFFSET TO BLANKING STRING
5183: ADD WA,WA CLEAR BOTH BFR AND BLANKING STRING
5184: MOV NULLW,(XR)+ CLEAR FIRST WORD
5185: BZE WA,INI10 SKIP IF NO PRINT BUFFER
5186: DCA WA ADJUST FOR FIRST WORD
5187: MVW PERFORM BLANKING
5188: *
5189: * INITIALIZE NUMBER OF HASH HEADERS
5190: *
5191: INI10 MOV =E$HNB,WA GET NUMBER OF HASH HEADERS
5192: MTI WA CONVERT TO INTEGER
5193: STI HSHNB STORE FOR USE BY GTNVR PROCEDURE
5194: LCT WA,WA COUNTER FOR CLEARING HASH TABLE
5195: MOV XR,HSHTB POINTER TO HASH TABLE
5196: *
5197: * LOOP TO CLEAR HASH TABLE
5198: *
5199: INI11 ZER (XR)+ BLANK A WORD
5200: BCT WA,INI11 LOOP
5201: MOV XR,HSHTE END OF HASH TABLE ADRS IS KEPT
5202: *
5203: * ALLOCATE WORK AREA FOR GTSTG CONVERSION PROCEDURE
5204: *
5205: MOV =NSTMX,WA GET MAX NUM CHARS IN OUTPUT NUMBER
5206: CTB WA,SCSI$ NO OF BAUS NEEDED
5207: MOV XR,GTSWK STORE BFR ADRS
5208: ADD WA,XR BUMP FOR WORK BFR
5209: EJC
5210: *
5211: * BUILD ALPHABET STRING FOR ALPHABET KEYWORD AND REPLACE
5212: *
5213: MOV XR,KVALP SAVE ALPHABET POINTER
5214: MOV =B$SCL,(XR) STRING BLK TYPE
5215: MOV =CFP$A,WC NO OF CHARS IN ALPHABET
5216: MOV WC,SCLEN(XR) STORE AS STRING LENGTH
5217: MOV WC,WB COPY CHAR COUNT
5218: CTB WB,SCSI$ NO. OF BAUS NEEDED
5219: ADD XR,WB CURRENT END ADDRESS FOR STATIC
5220: MOV WB,STATE STORE STATIC END ADRS
5221: LCT WC,WC LOOP COUNTER
5222: PSC XR POINT TO CHARS OF STRING
5223: ZER WB SET INITIAL CHARACTER VALUE
5224: *
5225: * LOOP TO ENTER CHARACTER CODES IN ORDER
5226: *
5227: INI12 SCH WB,(XR)+ STORE NEXT CODE
5228: ICV WB BUMP CODE VALUE
5229: BCT WC,INI12 LOOP TILL ALL STORED
5230: CSC XR COMPLETE STORE CHARACTERS
5231: *
5232: * INITIALIZE VARIABLE BLOCKS FOR INPUT OUTPUT TERMINAL
5233: *
5234: MOV =V$INP,XL POINT TO STRING /INPUT/
5235: MOV =TRTIN,WB TRBLK TYPE FOR INPUT
5236: JSR INOUT PERFORM INPUT ASSOCIATION
5237: MOV =V$OUP,XL POINT TO STRING /OUTPUT/
5238: MOV =TRTOU,WB TRBLK TYPE FOR OUTPUT
5239: JSR INOUT PERFORM OUTPUT ASSOCIATION
5240: BZE TTLEN,INI13 SKIP IF NO TERMINAL I/O
5241: MOV =V$TER,XL POINT TO STRING /TERMINAL/
5242: MOV =TRTOU,WB TRTYP FOR OUTPUT
5243: JSR INOUT PERFORM ASSOCIATION
5244: MOV =V$TER,XL
5245: MOV =TRTIN,WB TRTYP FOR INPUT
5246: JSR INOUT PERFORM ASSOCIATION
5247: EJC
5248: *
5249: *
5250: * PREPARE FOR COMPILATION
5251: *
5252: INI13 MOV XS,FLPTR IN CASE STACK OVERFLOWS IN COMPILER
5253: *
5254: * NOW COMPILE SOURCE INPUT CODE
5255: *
5256: JSR CMPIL CALL COMPILER
5257: MOV XR,R$COD SET PTR TO FIRST CODE BLOCK
5258: MOV =NULLS,R$TTL FORGET TITLE
5259: MOV =NULLS,R$STL FORGET SUB-TITLE
5260: ZER R$CIM FORGET COMPILER INPUT IMAGE
5261: ZER XL CLEAR DUD VALUE
5262: ZER WB DONT SHIFT DYNAMIC STORE UP
5263: JSR GBCOL CLEAR GARBAGE LEFT FROM COMPILE
5264: BNZ CPSTS,INIX1 SKIP IF NO LISTING OF COMP STATS
5265: JSR PRTPG EJECT PAGE
5266: *
5267: * PRINT COMPILE STATISTICS
5268: *
5269: MOV DNAMP,WA NEXT AVAILABLE LOC
5270: SUB STATB,WA MINUS START
5271: BTW WA CONVERT TO WORDS
5272: MTI WA CONVERT TO INTEGER
5273: MOV =ENCM1,XR POINT TO /MEMORY USED (WORDS)/
5274: JSR PRTMI PRINT MESSAGE
5275: MOV DNAME,WA END OF MEMORY
5276: SUB DNAMP,WA MINUS NEXT AVAILABLE LOC
5277: BTW WA CONVERT TO WORDS
5278: MTI WA CONVERT TO INTEGER
5279: MOV =ENCM2,XR POINT TO /MEMORY AVAILABLE (WORDS)/
5280: JSR PRTMI PRINT LINE
5281: MTI CMERC GET COUNT OF ERRORS AS INTEGER
5282: MOV =ENCM3,XR POINT TO /COMPILE ERRORS/
5283: JSR PRTMI PRINT IT
5284: MTI GBCNT GARBAGE COLLECTION COUNT
5285: SBI INTV1 ADJUST FOR UNAVOIDABLE COLLECT
5286: MOV =STPM5,XR POINT TO /STORAGE REGENERATIONS/
5287: JSR PRTMI PRINT GBCOL COUNT
5288: JSR SYSTM GET TIME
5289: SBI TIMSX GET COMPILATION TIME
5290: MOV =ENCM4,XR POINT TO COMPILATION TIME (MSEC)/
5291: JSR PRTMI PRINT MESSAGE
5292: ADD =NUM05,LSTLC BUMP LINE COUNT
5293: EJC
5294: *
5295: * PREPARE NOW TO START EXECUTION
5296: *
5297: *
5298: * CHECK FOR NOEXECUTE
5299: *
5300: INIX1 BNZ NOXEQ,INIX3 JUMP IF EXECUTION SUPPRESSED
5301: ZER GBCNT INITIALISE COLLECT COUNT
5302: BZE HEADP,INIX2 SKIP IF NO PRTPG CALLS IN COMPILN
5303: JSR PRTPG EJECT STANDARD PRINTER FILE
5304: *
5305: * INFORM OSINT OF STAGE
5306: *
5307: INIX2 JSR SYSBX CALL BEFORE STARTING EXECUTION
5308: ZER -(XS) SET FAILURE LOCATION ON STACK
5309: MOV XS,FLPTR SAVE PTR TO FAILURE OFFSET WORD
5310: MOV R$COD,XR LOAD PTR TO ENTRY CODE BLOCK
5311: MOV =STGXT,STAGE SET STAGE FOR EXECUTE TIME
5312: JSR SYSTM GET TIME
5313: STI TIMSX STORE FOR END RUN PROCESSING
5314: .IF .CNPF
5315: .ELSE
5316: STI PFSTM STORE TIME FOR PROFILER
5317: MOV CMPSN,PFNTE COPY STATEMENTS COMPILED COUNT
5318: .FI
5319: BRI (XR) START XEQ WITH FIRST STATEMENT
5320: *
5321: * HERE IF EXECUTION IS SUPPRESSED
5322: *
5323: INIX3 JSR PRTFH PRINT A BLANK LINE
5324: MOV =ENCM5,XR POINT TO /EXECUTION SUPPRESSED/
5325: MOV TTERL,TTLST TO FORCE MSG TO TERMINAL
5326: JSR PRTSF PRINT NOEXECUTE MESSAGE
5327: MOV =KVCOD,WA ENDING CODE
5328: JSR SYSEJ END OF JOB, EXIT TO SYSTEM
5329: TTL S P I T B O L -- SNOBOL4 OPERATOR ROUTINES
5330: *
5331: * THIS SECTION INCLUDES ALL ROUTINES WHICH CAN BE ACCESSED
5332: * DIRECTLY FROM THE GENERATED CODE EXCEPT SYSTEM FUNCTIONS.
5333: *
5334: * ALL ROUTINES IN THIS SECTION START WITH A LABEL OF THE
5335: * FORM O$XXX WHERE XXX IS THREE LETTERS. THE GENERATED CODE
5336: * CONTAINS A POINTER TO THE APPROPRIATE ENTRY LABEL.
5337: *
5338: * SINCE THE GENERAL FORM OF THE GENERATED CODE CONSISTS OF
5339: * POINTERS TO BLOCKS WHOSE FIRST WORD IS THE ADDRESS OF THE
5340: * ACTUAL ENTRY POINT LABEL (O$XXX).
5341: *
5342: * THESE ROUTINES ARE IN ALPHABETICAL ORDER BY THEIR
5343: * ENTRY LABEL NAMES (I.E. BY THE XXX OF THE O$XXX NAME)
5344: *
5345: * THESE ROUTINES RECEIVE CONTROL AS FOLLOWS
5346: *
5347: * (CP) POINTER TO NEXT CODE WORD
5348: * (XS) CURRENT STACK POINTER
5349: EJC
5350: *
5351: * BINARY PLUS (ADDITION)
5352: *
5353: O$ADD ENT ENTRY POINT
5354: JSR ARITH FETCH ARITHMETIC OPERANDS
5355: ERR 001,ADDITION LEFT OPERAND IS NOT NUMERIC
5356: ERR 002,ADDITION RIGHT OPERAND IS NOT NUMERIC
5357: .IF .CNRA
5358: .ELSE
5359: PPM OADD1 JUMP IF REAL OPERANDS
5360: .FI
5361: *
5362: * HERE TO ADD TWO INTEGERS
5363: *
5364: ADI ICVAL(XL) ADD RIGHT OPERAND TO LEFT
5365: INO EXINT RETURN INTEGER IF NO OVERFLOW
5366: ERB 003,ADDITION CAUSED INTEGER OVERFLOW
5367: .IF .CNRA
5368: .ELSE
5369: *
5370: * HERE TO ADD TWO REALS
5371: *
5372: OADD1 ADR RCVAL(XL) ADD RIGHT OPERAND TO LEFT
5373: RNO EXREA RETURN REAL IF NO OVERFLOW
5374: ERB 004,ADDITION CAUSED REAL OVERFLOW
5375: .FI
5376: EJC
5377: *
5378: * UNARY PLUS (AFFIRMATION)
5379: *
5380: O$AFF ENT ENTRY POINT
5381: MOV (XS)+,XR LOAD OPERAND
5382: JSR GTNUM CONVERT TO NUMERIC
5383: ERR 005,AFFIRMATION OPERAND IS NOT NUMERIC
5384: BRN EXIXR RETURN IF CONVERTED TO NUMERIC
5385: EJC
5386: *
5387: * BINARY BAR (ALTERNATION)
5388: *
5389: O$ALT ENT ENTRY POINT
5390: MOV (XS)+,XR LOAD RIGHT OPERAND
5391: JSR GTPAT CONVERT TO PATTERN
5392: ERR 006,ALTERNATION RIGHT OPERAND IS NOT PATTERN
5393: *
5394: * MERGE HERE FROM SPECIAL (LEFT ALTERNATION) CASE
5395: *
5396: OALT1 MOV =P$ALT,WB SET PCODE FOR ALTERNATIVE NODE
5397: JSR PBILD BUILD ALTERNATIVE NODE
5398: MOV XR,XL SAVE ADDRESS OF ALTERNATIVE NODE
5399: MOV (XS)+,XR LOAD LEFT OPERAND
5400: JSR GTPAT CONVERT TO PATTERN
5401: ERR 007,ALTERNATION LEFT OPERAND IS NOT PATTERN
5402: BEQ XR,=P$ALT,OALT2 JUMP IF LEFT ARG IS ALTERNATION
5403: MOV XR,PTHEN(XL) SET LEFT OPERAND AS SUCCESSOR
5404: MOV XL,XR MOVE RESULT TO PROPER REGISTER
5405: BRN EXIXR JUMP FOR NEXT CODE WORD
5406: *
5407: * COME HERE IF LEFT ARGUMENT IS ITSELF AN ALTERNATION
5408: *
5409: * THE RESULT IS MORE EFFICIENT IF WE MAKE THE REPLACEMENT
5410: *
5411: * (A / B) / C = A / (B / C)
5412: *
5413: OALT2 MOV PARM1(XR),PTHEN(XL) BUILD THE (B / C) NODE
5414: MOV PTHEN(XR),-(XS) SET A AS NEW LEFT ARG
5415: MOV XL,XR SET (B / C) AS NEW RIGHT ARG
5416: BRN OALT1 MERGE BACK TO BUILD A / (B / C)
5417: EJC
5418: *
5419: * ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY NAME)
5420: *
5421: O$AMN ENT ENTRY POINT
5422: LCW XR LOAD NUMBER OF SUBSCRIPTS
5423: MOV XR,WB SET FLAG FOR BY NAME
5424: BRN ARREF JUMP TO ARRAY REFERENCE ROUTINE
5425: *
5426: * ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY VALUE)
5427: *
5428: O$AMV ENT ENTRY POINT
5429: LCW XR LOAD NUMBER OF SUBSCRIPTS
5430: ZER WB SET FLAG FOR BY VALUE
5431: BRN ARREF JUMP TO ARRAY REFERENCE ROUTINE
5432: *
5433: * ARRAY REFERENCE (ONE SUBSCRIPT, BY NAME)
5434: *
5435: O$AON ENT ENTRY POINT
5436: MOV (XS),XR LOAD SUBSCRIPT VALUE
5437: MOV 1(XS),XL LOAD ARRAY VALUE
5438: MOV (XL),WA LOAD FIRST WORD OF ARRAY OPERAND
5439: BEQ WA,=B$VCT,OAON2 JUMP IF VECTOR REFERENCE
5440: BEQ WA,=B$TBT,OAON3 JUMP IF TABLE REFERENCE
5441: *
5442: * HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE
5443: *
5444: OAON1 MOV =NUM01,XR SET NUMBER OF SUBSCRIPTS TO ONE
5445: MOV XR,WB SET FLAG FOR BY NAME
5446: BRN ARREF JUMP TO ARRAY REFERENCE ROUTINE
5447: *
5448: * HERE IF WE HAVE A VECTOR REFERENCE
5449: *
5450: OAON2 BNE (XR),=B$ICL,OAON1 USE LONG ROUTINE IF NOT INTEGER
5451: LDI ICVAL(XR) LOAD INTEGER SUBSCRIPT VALUE
5452: MFI WA,EXFAL COPY AS ADDRESS INT, FAIL IF OVFLO
5453: BZE WA,EXFAL FAIL IF ZERO
5454: ADD =VCVLB,WA COMPUTE OFFSET IN WORDS
5455: WTB WA CONVERT TO BAUS
5456: MOV WA,(XS) COMPLETE NAME ON STACK
5457: BLT WA,VCLEN(XL),EXITS EXIT IF SUBSCRIPT NOT TOO LARGE
5458: BRN EXFAL ELSE FAIL
5459: *
5460: * HERE FOR TABLE REFERENCE
5461: *
5462: OAON3 MNZ WB SET FLAG FOR NAME REFERENCE
5463: JSR TFIND LOCATE/CREATE TABLE ELEMENT
5464: PPM EXFAL FAIL IF ACCESS FAILS
5465: MOV XL,1(XS) STORE NAME BASE ON STACK
5466: MOV WA,(XS) STORE NAME OFFSET ON STACK
5467: BRN EXITS EXIT WITH RESULT ON STACK
5468: EJC
5469: *
5470: * ARRAY REFERENCE (ONE SUBSCRIPT, BY VALUE)
5471: *
5472: O$AOV ENT ENTRY POINT
5473: MOV (XS)+,XR LOAD SUBSCRIPT VALUE
5474: MOV (XS)+,XL LOAD ARRAY VALUE
5475: MOV (XL),WA LOAD FIRST WORD OF ARRAY OPERAND
5476: BEQ WA,=B$VCT,OAOV2 JUMP IF VECTOR REFERENCE
5477: BEQ WA,=B$TBT,OAOV3 JUMP IF TABLE REFERENCE
5478: *
5479: * HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE
5480: *
5481: OAOV1 MOV XL,-(XS) RESTACK ARRAY VALUE
5482: MOV XR,-(XS) RESTACK SUBSCRIPT
5483: MOV =NUM01,XR SET NUMBER OF SUBSCRIPTS TO ONE
5484: ZER WB SET FLAG FOR VALUE CALL
5485: BRN ARREF JUMP TO ARRAY REFERENCE ROUTINE
5486: *
5487: * HERE IF WE HAVE A VECTOR REFERENCE
5488: *
5489: OAOV2 BNE (XR),=B$ICL,OAOV1 USE LONG ROUTINE IF NOT INTEGER
5490: LDI ICVAL(XR) LOAD INTEGER SUBSCRIPT VALUE
5491: MFI WA,EXFAL MOVE AS ONE WORD INT, FAIL IF OVFLO
5492: BZE WA,EXFAL FAIL IF ZERO
5493: ADD =VCVLB,WA COMPUTE OFFSET IN WORDS
5494: WTB WA CONVERT TO BAUS
5495: BGE WA,VCLEN(XL),EXFAL FAIL IF SUBSCRIPT TOO LARGE
5496: JSR ACESS ACCESS VALUE
5497: PPM EXFAL FAIL IF ACCESS FAILS
5498: BRN EXIXR ELSE RETURN VALUE TO CALLER
5499: *
5500: * HERE FOR TABLE REFERENCE BY VALUE
5501: *
5502: OAOV3 ZER WB SET FLAG FOR VALUE REFERENCE
5503: JSR TFIND CALL TABLE SEARCH ROUTINE
5504: PPM EXFAL FAIL IF ACCESS FAILS
5505: BRN EXIXR EXIT WITH RESULT IN XR
5506: EJC
5507: *
5508: * ASSIGNMENT (O$RPL MERGES)
5509: *
5510: O$ASS ENT ENTRY POINT
5511: MOV (XS)+,WB LOAD VALUE TO BE ASSIGNED
5512: MOV (XS)+,WA LOAD NAME OFFSET
5513: MOV (XS),XL LOAD NAME BASE
5514: MOV WB,(XS) STORE ASSIGNED VALUE AS RESULT
5515: JSR ASIGN PERFORM ASSIGNMENT
5516: PPM EXFAL FAIL IF ASSIGNMENT FAILS
5517: BRN EXITS EXIT WITH RESULT ON STACK
5518: *
5519: * COMPILATION ERROR
5520: *
5521: O$CER ENT ENTRY POINT
5522: ERB 008,COMPILATION ERROR ENCOUNTERED DURING EXECUTION
5523: *
5524: * UNARY AT (CURSOR ASSIGNMENT)
5525: *
5526: O$CAS ENT ENTRY POINT
5527: MOV (XS)+,WC LOAD NAME OFFSET (PARM2)
5528: MOV (XS)+,XR LOAD NAME BASE (PARM1)
5529: MOV =P$CAS,WB SET PCODE FOR CURSOR ASSIGNMENT
5530: JSR PBILD BUILD NODE
5531: BRN EXIXR JUMP FOR NEXT CODE WORD
5532: EJC
5533: *
5534: * CONCATENATION
5535: *
5536: O$CNC ENT ENTRY POINT
5537: MOV (XS),XR LOAD RIGHT ARGUMENT
5538: BEQ XR,=NULLS,OCNC3 JUMP IF RIGHT ARG IS NULL
5539: MOV 1(XS),XL LOAD LEFT ARGUMENT
5540: BEQ XL,=NULLS,OCNC4 JUMP IF LEFT ARGUMENT IS NULL
5541: MOV =B$SCL,WA GET CONSTANT TO TEST FOR STRING
5542: BNE WA,(XL),OCNC2 JUMP IF LEFT ARG NOT A STRING
5543: BNE WA,(XR),OCNC2 JUMP IF RIGHT ARG NOT A STRING
5544: *
5545: * MERGE HERE TO CONCATENATE TWO STRINGS
5546: *
5547: OCNC1 MOV SCLEN(XL),WA LOAD LEFT ARGUMENT LENGTH
5548: ADD SCLEN(XR),WA COMPUTE RESULT LENGTH
5549: JSR ALOCS ALLOCATE SCBLK FOR RESULT
5550: MOV XR,1(XS) STORE RESULT PTR OVER LEFT ARGUMENT
5551: PSC XR PREPARE TO STORE CHARS OF RESULT
5552: MOV SCLEN(XL),WA GET NUMBER OF CHARS IN LEFT ARG
5553: PLC XL PREPARE TO LOAD LEFT ARG CHARS
5554: MVC MOVE CHARACTERS OF LEFT ARGUMENT
5555: MOV (XS)+,XL LOAD RIGHT ARG POINTER, POP STACK
5556: MOV SCLEN(XL),WA LOAD NUMBER OF CHARS IN RIGHT ARG
5557: PLC XL PREPARE TO LOAD RIGHT ARG CHARS
5558: MVC MOVE CHARACTERS OF RIGHT ARGUMENT
5559: BRN EXITS EXIT WITH RESULT ON STACK
5560: *
5561: * COME HERE IF ARGUMENTS ARE NOT BOTH STRINGS
5562: *
5563: OCNC2 JSR GTSTG CONVERT RIGHT ARG TO STRING
5564: PPM OCNC5 JUMP IF RIGHT ARG IS NOT STRING
5565: MOV XR,XL SAVE RIGHT ARG PTR
5566: JSR GTSTG CONVERT LEFT ARG TO STRING
5567: PPM OCNC6 JUMP IF LEFT ARG IS NOT A STRING
5568: MOV XR,-(XS) STACK LEFT ARGUMENT
5569: MOV XL,-(XS) STACK RIGHT ARGUMENT
5570: MOV XR,XL MOVE LEFT ARG TO PROPER REG
5571: MOV (XS),XR MOVE RIGHT ARG TO PROPER REG
5572: BRN OCNC1 MERGE BACK TO CONCATENATE STRINGS
5573: EJC
5574: *
5575: * CONCATENATION (CONTINUED)
5576: *
5577: * COME HERE FOR NULL RIGHT ARGUMENT
5578: *
5579: OCNC3 ICA XS REMOVE RIGHT ARG FROM STACK
5580: BRN EXITS RETURN WITH LEFT ARGUMENT ON STACK
5581: *
5582: * HERE FOR NULL LEFT ARGUMENT
5583: *
5584: OCNC4 ICA XS UNSTACK ONE ARGUMENT
5585: MOV XR,(XS) STORE RIGHT ARGUMENT
5586: BRN EXITS EXIT WITH RESULT ON STACK
5587: *
5588: * HERE IF RIGHT ARGUMENT IS NOT A STRING
5589: *
5590: OCNC5 MOV XR,XL MOVE RIGHT ARGUMENT PTR
5591: MOV (XS)+,XR LOAD LEFT ARG POINTER
5592: *
5593: * MERGE HERE WHEN LEFT ARGUMENT IS NOT A STRING
5594: *
5595: OCNC6 JSR GTPAT CONVERT LEFT ARG TO PATTERN
5596: ERR 009,CONCATENATION LEFT OPND IS NOT STRING OR PATTERN
5597: MOV XR,-(XS) SAVE RESULT ON STACK
5598: MOV XL,XR POINT TO RIGHT OPERAND
5599: JSR GTPAT CONVERT TO PATTERN
5600: ERR 010,CONCATENATION RIGHT OPD IS NOT STRING OR PATTERN
5601: MOV XR,XL MOVE FOR PCONC
5602: MOV (XS)+,XR RELOAD LEFT OPERAND PTR
5603: JSR PCONC CONCATENATE PATTERNS
5604: BRN EXIXR EXIT WITH RESULT IN XR
5605: EJC
5606: *
5607: * COMPLEMENTATION
5608: *
5609: O$COM ENT ENTRY POINT
5610: MOV (XS)+,XR LOAD OPERAND
5611: MOV (XR),WA LOAD TYPE WORD
5612: *
5613: * MERGE BACK HERE AFTER CONVERSION
5614: *
5615: OCOM1 BEQ WA,=B$ICL,OCOM2 JUMP IF INTEGER
5616: .IF .CNRA
5617: .ELSE
5618: BEQ WA,=B$RCL,OCOM3 JUMP IF REAL
5619: .FI
5620: JSR GTNUM ELSE CONVERT TO NUMERIC
5621: ERR 011,COMPLEMENTATION OPERAND IS NOT NUMERIC
5622: BRN OCOM1 BACK TO CHECK CASES
5623: *
5624: * HERE TO COMPLEMENT INTEGER
5625: *
5626: OCOM2 LDI ICVAL(XR) LOAD INTEGER VALUE
5627: NGI NEGATE
5628: INO EXINT RETURN INTEGER IF NO OVERFLOW
5629: ERB 012,COMPLEMENTATION CAUSED INTEGER OVERFLOW
5630: .IF .CNRA
5631: .ELSE
5632: *
5633: * HERE TO COMPLEMENT REAL
5634: *
5635: OCOM3 LDR RCVAL(XR) LOAD REAL VALUE
5636: NGR NEGATE
5637: BRN EXREA RETURN REAL RESULT
5638: .FI
5639: EJC
5640: *
5641: * BINARY SLASH (DIVISION)
5642: *
5643: O$DVD ENT ENTRY POINT
5644: JSR ARITH FETCH ARITHMETIC OPERANDS
5645: ERR 013,DIVISION LEFT OPERAND IS NOT NUMERIC
5646: ERR 014,DIVISION RIGHT OPERAND IS NOT NUMERIC
5647: .IF .CNRA
5648: .ELSE
5649: PPM ODVD2 JUMP IF REAL OPERANDS
5650: .FI
5651: *
5652: * HERE TO DIVIDE TWO INTEGERS
5653: *
5654: DVI ICVAL(XL) DIVIDE LEFT OPERAND BY RIGHT
5655: INO EXINT RESULT OK IF NO OVERFLOW
5656: ERB 015,DIVISION CAUSED INTEGER OVERFLOW
5657: .IF .CNRA
5658: .ELSE
5659: *
5660: * HERE TO DIVIDE TWO REALS
5661: *
5662: ODVD2 DVR RCVAL(XL) DIVIDE LEFT OPERAND BY RIGHT
5663: RNO EXREA RETURN REAL IF NO OVERFLOW
5664: ERB 016,DIVISION CAUSED REAL OVERFLOW
5665: .FI
5666: EJC
5667: *
5668: * EXPONENTIATION
5669: *
5670: O$EXP ENT ENTRY POINT
5671: MOV (XS)+,XR LOAD EXPONENT
5672: JSR GTNUM CONVERT TO NUMBER
5673: ERR 017,EXPONENTIATION RIGHT OPERAND IS NOT NUMERIC
5674: .IF .CNRA
5675: .ELSE
5676: BNE WA,=B$ICL,OEXP7 JUMP IF REAL
5677: .FI
5678: MOV XR,XL MOVE EXPONENT
5679: MOV (XS)+,XR LOAD BASE
5680: JSR GTNUM CONVERT TO NUMERIC
5681: ERR 018,EXPONENTIATION LEFT OPERAND IS NOT NUMERIC
5682: LDI ICVAL(XL) LOAD EXPONENT
5683: ILT OEXP8 ERROR IF NEGATIVE EXPONENT
5684: .IF .CNRA
5685: .ELSE
5686: BEQ WA,=B$RCL,OEXP3 JUMP IF BASE IS REAL
5687: .FI
5688: *
5689: * HERE TO EXPONENTIATE AN INTEGER
5690: *
5691: MFI WA,OEXP2 CONVERT EXPONENT TO 1 WORD INTEGER
5692: LCT WA,WA SET LOOP COUNTER
5693: LDI INTV1 LOAD INITIAL VALUE OF 1
5694: BNZ WA,OEXP1 JUMP IF NON-ZERO EXPONENT
5695: INE EXINT GIVE ZERO AS RESULT FOR NONZERO**0
5696: BRN OEXP4 ELSE ERROR OF 0**0
5697: *
5698: * LOOP TO PERFORM EXPONENTIATION
5699: *
5700: OEXP1 MLI ICVAL(XR) MULTIPLY BY BASE
5701: IOV OEXP2 JUMP IF OVERFLOW
5702: BCT WA,OEXP1 LOOP BACK TILL COMPUTATION COMPLETE
5703: BRN EXINT THEN RETURN INTEGER RESULT
5704: *
5705: * HERE IF INTEGER OVERFLOW
5706: *
5707: OEXP2 ERB 019,EXPONENTIATION CAUSED INTEGER OVERFLOW
5708: EJC
5709: *
5710: * EXPONENTIATION (CONTINUED)
5711: .IF .CNRA
5712: .ELSE
5713: *
5714: * HERE TO EXPONENTIATE A REAL
5715: *
5716: OEXP3 MFI WA,OEXP6 CONVERT EXPONENT TO ONE WORD
5717: LCT WA,WA SET LOOP COUNTER
5718: LDR REAV1 LOAD 1.0 AS INITIAL VALUE
5719: BNZ WA,OEXP5 JUMP IF NON-ZERO EXPONENT
5720: RNE EXREA RETURN 1.0 IF NONZERO**ZERO
5721: .FI
5722: *
5723: * HERE FOR ERROR OF 0**0 OR 0.0**0
5724: *
5725: OEXP4 ERB 020,EXPONENTIATION RESULT IS UNDEFINED
5726: .IF .CNRA
5727: .ELSE
5728: *
5729: * LOOP TO PERFORM EXPONENTIATION
5730: *
5731: OEXP5 MLR RCVAL(XR) MULTIPLY BY BASE
5732: ROV OEXP6 JUMP IF OVERFLOW
5733: BCT WA,OEXP5 LOOP TILL COMPUTATION COMPLETE
5734: BRN EXREA THEN RETURN REAL RESULT
5735: *
5736: * HERE IF REAL OVERFLOW
5737: *
5738: OEXP6 ERB 021,EXPONENTIATION CAUSED REAL OVERFLOW
5739: *
5740: * HERE IF REAL EXPONENT
5741: *
5742: OEXP7 ERB 022,EXPONENTIATION RIGHT OPERAND IS REAL NOT INTEGER
5743: .FI
5744: *
5745: * HERE FOR NEGATIVE EXPONENT
5746: *
5747: OEXP8 ERB 023,EXPONENTIATION RIGHT OPERAND IS NEGATIVE
5748: EJC
5749: *
5750: * FAILURE IN EXPRESSION EVALUATION
5751: *
5752: * THIS ENTRY POINT IS USED IF THE EVALUATION OF AN
5753: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, FAILS.
5754: * CONTROL IS RETURNED TO AN APPROPRIATE POINT IN EVALX.
5755: *
5756: O$FEX ENT ENTRY POINT
5757: JMG EVLXF JUMP TO FAILURE LOC IN EVALX
5758: *
5759: * FAILURE DURING EVALUATION OF A COMPLEX OR DIRECT GOTO
5760: *
5761: O$FIF ENT ENTRY POINT
5762: ERB 024,GOTO EVALUATION FAILURE
5763: *
5764: * FUNCTION CALL (MORE THAN ONE ARGUMENT)
5765: *
5766: O$FNC ENT ENTRY POINT
5767: LCW WA LOAD NUMBER OF ARGUMENTS
5768: LCW XR LOAD FUNCTION VRBLK POINTER
5769: MOV VRFNC(XR),XL LOAD FUNCTION POINTER
5770: BNE WA,FARGS(XL),CFUNC USE CENTRAL ROUTINE IF WRONG NUM
5771: BRI (XL) JUMP TO FUNCTION IF ARG COUNT OK
5772: *
5773: * FUNCTION NAME ERROR
5774: *
5775: O$FNE ENT ENTRY POINT
5776: LCW WA GET NEXT CODE WORD
5777: BNE WA,=ORNM$,OFNE1 FAIL IF NOT EVALUATING EXPRESSION
5778: BNZ 2(XS),OFNE1 FAIL UNLESS EXPRN WANTED BY VALUE
5779: JMG EVLXV JOIN EXPRESSION BY VALUE CODE
5780: *
5781: * HERE FOR ERROR
5782: *
5783: OFNE1 ERB 025,FUNCTION CALLED BY NAME RETURNED A VALUE
5784: *
5785: * FUNCTION CALL (SINGLE ARGUMENT)
5786: *
5787: O$FNS ENT ENTRY POINT
5788: LCW XR LOAD FUNCTION VRBLK POINTER
5789: MOV =NUM01,WA SET NUMBER OF ARGUMENTS TO ONE
5790: MOV VRFNC(XR),XL LOAD FUNCTION POINTER
5791: BNE WA,FARGS(XL),CFUNC USE CENTRAL ROUTINE IF WRONG NUM
5792: BRI (XL) JUMP TO FUNCTION IF ARG COUNT OK
5793: EJC
5794: * CALL TO UNDEFINED FUNCTION
5795: *
5796: O$FUN ENT ENTRY POINT
5797: ERB 026,UNDEFINED FUNCTION CALLED
5798: *
5799: * EXECUTE COMPLEX GOTO
5800: *
5801: O$GOC ENT ENTRY POINT
5802: MOV 1(XS),XR LOAD NAME BASE POINTER
5803: BHI XR,STATE,OGOC1 JUMP IF NOT NATURAL VARIABLE
5804: ADD *VRTRA,XR ELSE POINT TO VRTRA FIELD
5805: BRI (XR) AND JUMP THROUGH IT
5806: *
5807: * HERE IF GOTO OPERAND IS NOT NATURAL VARIABLE
5808: *
5809: OGOC1 ERB 027,GOTO OPERAND IS NOT A NATURAL VARIABLE
5810: *
5811: * EXECUTE DIRECT GOTO
5812: *
5813: O$GOD ENT ENTRY POINT
5814: MOV (XS),XR LOAD OPERAND
5815: MOV (XR),WA LOAD FIRST WORD
5816: BEQ WA,=B$CDC,OGOD1 JUMP IF CODE BLOCK
5817: BEQ WA,=B$CDS,OGOD2 JUMP IF CODE BLOCK
5818: ERB 028,GOTO OPERAND IN DIRECT GOTO IS NOT CODE
5819: *
5820: * CASE OF COMPLEX FAILURE CODE
5821: *
5822: OGOD1 MOV FLPTR,XS POP GARBAGE OFF STACK
5823: MOV CDFAL(XR),(XS) SET NEW FAILURE OFFSET
5824: BRN STMGO JUMP TO EXECUTE CODE
5825: *
5826: * CASE OF SIMPLE FAILURE CODE
5827: *
5828: OGOD2 MOV FLPTR,XS POP GARBAGE OFF STACK
5829: MOV *CDFAL,(XS) SET NEW FAILURE OFFSET
5830: BRN STMGO JUMP TO EXECUTE CODE
5831: *
5832: * SET GOTO FAILURE TRAP
5833: *
5834: * THIS ROUTINE IS EXECUTED AT THE START OF A COMPLEX OR
5835: * DIRECT FAILURE GOTO TO TRAP A SUBSEQUENT FAIL (SEE EXFAL)
5836: *
5837: O$GOF ENT ENTRY POINT
5838: MOV FLPTR,XR POINT TO FAIL OFFSET ON STACK
5839: ICA (XR) POINT FAILURE TO O$FIF WORD
5840: ICP POINT TO NEXT CODE WORD
5841: BRN EXITS EXIT TO CONTINUE
5842: EJC
5843: *
5844: * BINARY DOLLAR (IMMEDIATE ASSIGNMENT)
5845: *
5846: * THE PATTERN BUILT BY BINARY DOLLAR IS A COMPOUND PATTERN.
5847: * SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR
5848: * DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED.
5849: *
5850: O$IMA ENT ENTRY POINT
5851: MOV =P$IMC,WB SET PCODE FOR LAST NODE
5852: MOV (XS)+,WC POP NAME OFFSET (PARM2)
5853: MOV (XS)+,XR POP NAME BASE (PARM1)
5854: JSR PBILD BUILD P$IMC NODE
5855: MOV XR,XL SAVE PTR TO NODE
5856: MOV (XS),XR LOAD LEFT ARGUMENT
5857: JSR GTPAT CONVERT TO PATTERN
5858: ERR 029,IMMEDIATE ASSIGNMENT LEFT OPERAND IS NOT PATTERN
5859: MOV XR,(XS) SAVE PTR TO LEFT OPERAND PATTERN
5860: MOV =P$IMA,WB SET PCODE FOR FIRST NODE
5861: JSR PBILD BUILD P$IMA NODE
5862: MOV (XS)+,PTHEN(XR) SET LEFT OPERAND AS P$IMA SUCCESSOR
5863: JSR PCONC CONCATENATE TO FORM FINAL PATTERN
5864: BRN EXIXR ALL DONE
5865: *
5866: * INDIRECTION (BY NAME)
5867: *
5868: O$INN ENT ENTRY POINT
5869: MNZ WB SET FLAG FOR RESULT BY NAME
5870: BRN INDIR JUMP TO COMMON ROUTINE
5871: *
5872: * INTERROGATION
5873: *
5874: O$INT ENT ENTRY POINT
5875: MOV =NULLS,(XS) REPLACE OPERAND WITH NULL
5876: BRN EXITS EXIT FOR NEXT CODE WORD
5877: *
5878: * INDIRECTION (BY VALUE)
5879: *
5880: O$INV ENT ENTRY POINT
5881: ZER WB SET FLAG FOR BY VALUE
5882: BRN INDIR JUMP TO COMMON ROUTINE
5883: EJC
5884: *
5885: * KEYWORD REFERENCE (BY NAME)
5886: *
5887: O$KWN ENT ENTRY POINT
5888: JSR KWNAM GET KEYWORD NAME
5889: BRN EXNAM EXIT WITH RESULT NAME
5890: *
5891: * KEYWORD REFERENCE (BY VALUE)
5892: *
5893: O$KWV ENT ENTRY POINT
5894: JSR KWNAM GET KEYWORD NAME
5895: MOV XR,DNAMP DELETE KVBLK
5896: JSR ACESS ACCESS VALUE
5897: PPM EXNUL DUMMY (UNUSED) FAILURE RETURN
5898: BRN EXIXR JUMP WITH VALUE IN XR
5899: *
5900: * LOAD EXPRESSION BY NAME
5901: *
5902: O$LEX ENT ENTRY POINT
5903: MOV *EVSI$,WA SET SIZE OF EVBLK
5904: JSR ALLOC ALLOCATE SPACE FOR EVBLK
5905: MOV =B$EVT,(XR) SET TYPE WORD
5906: MOV =TRBEV,EVVAR(XR) SET DUMMY TRBLK POINTER
5907: LCW WA LOAD EXBLK POINTER
5908: MOV WA,EVEXP(XR) SET EXBLK POINTER
5909: MOV XR,XL MOVE NAME BASE TO PROPER REG
5910: MOV *EVVAR,WA SET NAME OFFSET = ZERO
5911: BRN EXNAM EXIT WITH NAME IN (XL,WA)
5912: *
5913: * LOAD PATTERN VALUE
5914: *
5915: O$LPT ENT ENTRY POINT
5916: LCW XR LOAD PATTERN POINTER
5917: BRN EXIXR STACK PTR AND OBEY NEXT CODE WORD
5918: EJC
5919: *
5920: * LOAD VARIABLE NAME
5921: *
5922: O$LVN ENT ENTRY POINT
5923: LCW WA LOAD VRBLK POINTER
5924: MOV WA,-(XS) STACK VRBLK PTR (NAME BASE)
5925: MOV *VRVAL,-(XS) STACK NAME OFFSET
5926: BRN EXITS EXIT WITH RESULT ON STACK
5927: *
5928: * BINARY ASTERISK (MULTIPLICATION)
5929: *
5930: O$MLT ENT ENTRY POINT
5931: JSR ARITH FETCH ARITHMETIC OPERANDS
5932: ERR 030,MULTIPLICATION LEFT OPERAND IS NOT NUMERIC
5933: ERR 031,MULTIPLICATION RIGHT OPERAND IS NOT NUMERIC
5934: .IF .CNRA
5935: .ELSE
5936: PPM OMLT1 JUMP IF REAL OPERANDS
5937: .FI
5938: *
5939: * HERE TO MULTIPLY TWO INTEGERS
5940: *
5941: MLI ICVAL(XL) MULTIPLY LEFT OPERAND BY RIGHT
5942: INO EXINT RETURN INTEGER IF NO OVERFLOW
5943: ERB 032,MULTIPLICATION CAUSED INTEGER OVERFLOW
5944: .IF .CNRA
5945: .ELSE
5946: *
5947: * HERE TO MULTIPLY TWO REALS
5948: *
5949: OMLT1 MLR RCVAL(XL) MULTIPLY LEFT OPERAND BY RIGHT
5950: RNO EXREA RETURN REAL IF NO OVERFLOW
5951: ERB 033,MULTIPLICATION CAUSED REAL OVERFLOW
5952: .FI
5953: *
5954: * NAME REFERENCE
5955: *
5956: O$NAM ENT ENTRY POINT
5957: MOV *NMSI$,WA SET LENGTH OF NMBLK
5958: JSR ALLOC ALLOCATE NMBLK
5959: MOV =B$NML,(XR) SET NAME BLOCK CODE
5960: MOV (XS)+,NMOFS(XR) SET NAME OFFSET FROM OPERAND
5961: MOV (XS)+,NMBAS(XR) SET NAME BASE FROM OPERAND
5962: BRN EXIXR EXIT WITH RESULT IN XR
5963: EJC
5964: *
5965: * NEGATION
5966: *
5967: * INITIAL ENTRY
5968: *
5969: O$NTA ENT ENTRY POINT
5970: LCW WA LOAD NEW FAILURE OFFSET
5971: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER
5972: MOV WA,-(XS) STACK NEW FAILURE OFFSET
5973: MOV XS,FLPTR SET NEW FAILURE POINTER
5974: BRN EXITS JUMP TO CONTINUE EXECUTION
5975: *
5976: * ENTRY AFTER SUCCESSFUL EVALUATION OF OPERAND
5977: *
5978: O$NTB ENT ENTRY POINT
5979: MOV 2(XS),FLPTR RESTORE OLD FAILURE POINTER
5980: BRN EXFAL AND FAIL
5981: *
5982: * ENTRY FOR FAILURE DURING OPERAND EVALUATION
5983: *
5984: O$NTC ENT ENTRY POINT
5985: ICA XS POP FAILURE OFFSET
5986: MOV (XS)+,FLPTR RESTORE OLD FAILURE POINTER
5987: BRN EXNUL EXIT GIVING NULL RESULT
5988: *
5989: * USE OF UNDEFINED OPERATOR
5990: *
5991: O$OUN ENT ENTRY POINT
5992: ERB 034,UNDEFINED OPERATOR REFERENCED
5993: *
5994: * BINARY DOT (PATTERN ASSIGNMENT)
5995: *
5996: * THE PATTERN BUILT BY BINARY DOT IS A COMPOUND PATTERN.
5997: * SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR
5998: * DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED.
5999: *
6000: O$PAS ENT ENTRY POINT
6001: MOV =P$PAC,WB LOAD PCODE FOR P$PAC NODE
6002: MOV (XS)+,WC LOAD NAME OFFSET (PARM2)
6003: MOV (XS)+,XR LOAD NAME BASE (PARM1)
6004: JSR PBILD BUILD P$PAC NODE
6005: MOV XR,XL SAVE PTR TO NODE
6006: MOV (XS),XR LOAD LEFT OPERAND
6007: JSR GTPAT CONVERT TO PATTERN
6008: ERR 035,PATTERN ASSIGNMENT LEFT OPERAND IS NOT PATTERN
6009: MOV XR,(XS) SAVE PTR TO LEFT OPERAND PATTERN
6010: MOV =P$PAA,WB SET PCODE FOR P$PAA NODE
6011: JSR PBILD BUILD P$PAA NODE
6012: MOV (XS)+,PTHEN(XR) SET LEFT OPERAND AS P$PAA SUCCESSOR
6013: JSR PCONC CONCATENATE TO FORM FINAL PATTERN
6014: BRN EXIXR JUMP FOR NEXT CODE WORD
6015: EJC
6016: *
6017: * PATTERN MATCH (BY NAME, FOR REPLACEMENT)
6018: *
6019: O$PMN ENT ENTRY POINT
6020: ZER WB SET TYPE CODE FOR MATCH BY NAME
6021: BRN MATCH JUMP TO ROUTINE TO START MATCH
6022: *
6023: * PATTERN MATCH (STATEMENT)
6024: *
6025: * O$PMS IS USED IN PLACE OF O$PMV WHEN THE PATTERN MATCH
6026: * OCCURS AT THE OUTER (STATEMENT) LEVEL SINCE IN THIS
6027: * CASE THE SUBSTRING VALUE NEED NOT BE CONSTRUCTED.
6028: *
6029: O$PMS ENT ENTRY POINT
6030: MOV =NUM02,WB SET FLAG FOR STATEMENT TO MATCH
6031: BRN MATCH JUMP TO ROUTINE TO START MATCH
6032: *
6033: * PATTERN MATCH (BY VALUE)
6034: *
6035: O$PMV ENT ENTRY POINT
6036: MOV =NUM01,WB SET TYPE CODE FOR VALUE MATCH
6037: BRN MATCH JUMP TO ROUTINE TO START MATCH
6038: *
6039: * POP TOP ITEM ON STACK
6040: *
6041: O$POP ENT ENTRY POINT
6042: ICA XS POP TOP STACK ENTRY
6043: BRN EXITS OBEY NEXT CODE WORD
6044: *
6045: * TERMINATE EXECUTION (CODE COMPILED FOR END STATEMENT)
6046: *
6047: O$STP ENT ENTRY POINT
6048: MOV =ENDMS,XR ENDING MESSAGE
6049: ZER WA NO ERROR CODE
6050: BRN STOPR STOP THE RUN
6051: *
6052: * RETURN NAME FROM EXPRESSION
6053: * THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN
6054: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS
6055: * A NAME. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX.
6056: *
6057: O$RNM ENT ENTRY POINT
6058: JMG EVLXN RETURN TO EVALX PROCEDURE
6059: EJC
6060: *
6061: * PATTERN REPLACEMENT
6062: *
6063: * WHEN THIS ROUTINE GETS CONTROL, THE FOLLOWING STACK
6064: * ENTRIES HAVE BEEN MADE (SEE END OF MATCH ROUTINE P$NTH)
6065: *
6066: * SUBJECT NAME BASE
6067: * SUBJECT NAME OFFSET
6068: * INITIAL CURSOR VALUE
6069: * FINAL CURSOR VALUE
6070: * SUBJECT STRING POINTER
6071: * (XS) ---------------- REPLACEMENT VALUE
6072: *
6073: O$RPL ENT ENTRY POINT
6074: JSR GTSTG CONVERT REPLACEMENT VAL TO STRING
6075: ERR 036,PATTERN REPLACEMENT RIGHT OPERAND IS NOT STRING
6076: *
6077: * GET RESULT LENGTH AND ALLOCATE RESULT SCBLK
6078: *
6079: MOV (XS),XL LOAD SUBJECT STRING POINTER
6080: .IF .CNBF
6081: .ELSE
6082: BEQ (XL),=B$BCT,ORPL5 BRANCH IF BUFFER ASSIGNMENT
6083: .FI
6084: ADD SCLEN(XL),WA ADD SUBJECT STRING LENGTH
6085: ADD 2(XS),WA ADD STARTING CURSOR
6086: SUB 1(XS),WA MINUS FINAL CURSOR = TOTAL LENGTH
6087: BZE WA,ORPL3 JUMP IF RESULT IS NULL
6088: MOV XR,-(XS) RESTACK REPLACEMENT STRING
6089: JSR ALOCS ALLOCATE SCBLK FOR RESULT
6090: MOV 3(XS),WA GET INITIAL CURSOR (PART 1 LEN)
6091: MOV XR,3(XS) STACK RESULT POINTER
6092: PSC XR POINT TO CHARACTERS OF RESULT
6093: *
6094: * MOVE PART 1 (START OF SUBJECT) TO RESULT
6095: *
6096: BZE WA,ORPL1 JUMP IF FIRST PART IS NULL
6097: MOV 1(XS),XL ELSE POINT TO SUBJECT STRING
6098: PLC XL POINT TO SUBJECT STRING CHARS
6099: MVC MOVE FIRST PART TO RESULT
6100: EJC
6101: * PATTERN REPLACEMENT (CONTINUED)
6102: *
6103: * NOW MOVE IN REPLACEMENT VALUE
6104: *
6105: ORPL1 MOV (XS)+,XL LOAD REPLACEMENT STRING, POP
6106: MOV SCLEN(XL),WA LOAD LENGTH
6107: BZE WA,ORPL2 JUMP IF NULL REPLACEMENT
6108: PLC XL ELSE POINT TO CHARS OF REPLACEMENT
6109: MVC MOVE IN CHARS (PART 2)
6110: *
6111: * NOW MOVE IN REMAINDER OF STRING (PART 3)
6112: *
6113: ORPL2 MOV (XS)+,XL LOAD SUBJECT STRING POINTER, POP
6114: MOV (XS)+,WC LOAD FINAL CURSOR, POP
6115: MOV SCLEN(XL),WA LOAD SUBJECT STRING LENGTH
6116: SUB WC,WA MINUS FINAL CURSOR = PART 3 LENGTH
6117: BZE WA,ORPL4 JUMP TO ASSIGN IF PART 3 IS NULL
6118: PLC XL,WC ELSE POINT TO LAST PART OF STRING
6119: MVC MOVE PART 3 TO RESULT
6120: BRN ORPL4 JUMP TO PERFORM ASSIGNMENT
6121: *
6122: * HERE IF RESULT IS NULL
6123: *
6124: ORPL3 ADD *NUM02,XS POP SUBJECT STR PTR, FINAL CURSOR
6125: MOV =NULLS,(XS) SET NULL RESULT
6126: *
6127: * MERGE WITH ASSIGNMENT ROUTINE
6128: *
6129: ORPL4 MOV =O$ASS,XL CONTINUATION ROUTINE
6130: BRI XL ENTER ROUTINE
6131: .IF .CNBF
6132: .ELSE
6133: *
6134: * HERE FOR BUFFER SUBSTRING ASSIGNMENT
6135: *
6136: ORPL5 MOV XR,XL COPY SCBLK REPLACEMENT PTR
6137: MOV (XS)+,XR UNSTACK BCBLK PTR
6138: MOV (XS)+,WB GET FINAL CURSOR VALUE
6139: MOV (XS)+,WA GET INITIAL CURSOR
6140: SUB WA,WB GET LENGTH IN WB
6141: ADD *NUM02,XS GET RID OF NAME BASE/OFFSET
6142: JSR INSBF INSERT SUBSTRING
6143: PPM CONVERT FAIL IMPOSSIBLE
6144: PPM EXFAL FAIL IF INSERT FAILS
6145: BRN EXNUL ELSE NULL RESULT
6146: .FI
6147: EJC
6148: *
6149: * RETURN VALUE FROM EXPRESSION
6150: *
6151: * THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN
6152: * EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS
6153: * A VALUE. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX
6154: *
6155: O$RVL ENT ENTRY POINT
6156: BRN EVLXV RETURN TO EVALX PROCEDURE
6157: EJC
6158: *
6159: * SELECTION
6160: *
6161: * INITIAL ENTRY
6162: *
6163: O$SLA ENT ENTRY POINT
6164: LCW WA LOAD NEW FAILURE OFFSET
6165: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER
6166: MOV WA,-(XS) STACK NEW FAILURE OFFSET
6167: MOV XS,FLPTR SET NEW FAILURE POINTER
6168: BRN EXITS JUMP TO EXECUTE FIRST ALTERNATIVE
6169: *
6170: * ENTRY AFTER SUCCESSFUL EVALUATION OF ALTERNATIVE
6171: *
6172: O$SLB ENT ENTRY POINT
6173: MOV (XS)+,XR LOAD RESULT
6174: ICA XS POP FAIL OFFSET
6175: MOV (XS),FLPTR RESTORE OLD FAILURE POINTER
6176: MOV XR,(XS) RESTACK RESULT
6177: LCW WA LOAD NEW CODE OFFSET
6178: ADD R$COD,WA POINT TO ABSOLUTE CODE LOCATION
6179: LCP WA SET NEW CODE POINTER
6180: BRN EXITS JUMP TO CONTINUE PAST SELECTION
6181: *
6182: * ENTRY AT START OF SUBSEQUENT ALTERNATIVES
6183: *
6184: O$SLC ENT ENTRY POINT
6185: LCW WA LOAD NEW FAIL OFFSET
6186: MOV WA,(XS) STORE NEW FAIL OFFSET
6187: BRN EXITS JUMP TO EXECUTE NEXT ALTERNATIVE
6188: *
6189: * ENTRY AT START OF LAST ALTERNATIVE
6190: *
6191: O$SLD ENT ENTRY POINT
6192: ICA XS POP FAILURE OFFSET
6193: MOV (XS)+,FLPTR RESTORE OLD FAILURE POINTER
6194: BRN EXITS JUMP TO EXECUTE LAST ALTERNATIVE
6195: EJC
6196: *
6197: * BINARY MINUS (SUBTRACTION)
6198: *
6199: O$SUB ENT ENTRY POINT
6200: JSR ARITH FETCH ARITHMETIC OPERANDS
6201: ERR 037,SUBTRACTION LEFT OPERAND IS NOT NUMERIC
6202: ERR 038,SUBTRACTION RIGHT OPERAND IS NOT NUMERIC
6203: .IF .CNRA
6204: .ELSE
6205: PPM OSUB1 JUMP IF REAL OPERANDS
6206: .FI
6207: *
6208: * HERE TO SUBTRACT TWO INTEGERS
6209: *
6210: SBI ICVAL(XL) SUBTRACT RIGHT OPERAND FROM LEFT
6211: INO EXINT RETURN INTEGER IF NO OVERFLOW
6212: ERB 039,SUBTRACTION CAUSED INTEGER OVERFLOW
6213: .IF .CNRA
6214: .ELSE
6215: *
6216: * HERE TO SUBTRACT TWO REALS
6217: *
6218: OSUB1 SBR RCVAL(XL) SUBTRACT RIGHT OPERAND FROM LEFT
6219: RNO EXREA RETURN REAL IF NO OVERFLOW
6220: ERB 040,SUBTRACTION CAUSED REAL OVERFLOW
6221: .FI
6222: *
6223: * DUMMY OPERATOR TO RETURN CONTROL TO TRXEQ PROCEDURE
6224: *
6225: O$TXR ENT ENTRY POINT
6226: JMG TRXQR JUMP INTO TRXEQ PROCEDURE
6227: *
6228: * UNEXPECTED FAILURE
6229: *
6230: * NOTE THAT IF A SETEXIT TRAP IS OPERATING THEN
6231: * TRANSFER TO SYSTEM LABEL CONTINUE
6232: * WILL RESULT IN LOOPING HERE. DIFFICULT TO AVOID EXCEPT
6233: * WITH A CONSIDERABLE OVERHEAD WHICH IS NOT WORTHWHILE OR
6234: * ELSE BY A TECHNIQUE SUCH AS SETTING KVERL TO ZERO.
6235: *
6236: O$UNF ENT ENTRY POINT
6237: ERB 041,UNEXPECTED FAILURE IN -NOFAIL MODE
6238: TTL S P I T B O L -- SNOBOL4 BUILTIN LABEL ROUTINES
6239: *
6240: * THE FOLLOWING SECTION CONTAINS THE ROUTINES FOR LABELS
6241: * WHICH HAVE A PREDEFINED MEANING IN SNOBOL4.
6242: *
6243: * CONTROL IS PASSED DIRECTLY TO THE LABEL NAME ENTRY POINT.
6244: *
6245: * ENTRY NAMES ARE OF THE FORM L$XXX WHERE XXX IS THE THREE
6246: * LETTER VARIABLE NAME IDENTIFIER.
6247: *
6248: * ENTRIES ARE IN ALPHABETICAL ORDER
6249: *
6250: * ABORT
6251: *
6252: L$ABO ENT ENTRY POINT
6253: MOV KVERT,WA LOAD ERROR CODE
6254: ZER XR INDICATE NO ENDING MESSAGE
6255: BNZ WA,STOPR STOP RUN
6256: *
6257: *
6258: * FAIL IF NO ERROR HAD OCCURED
6259: *
6260: ERB 042,GOTO ABORT WITH NO PRECEDING ERROR
6261: *
6262: * CONTINUE
6263: *
6264: L$CNT ENT ENTRY POINT
6265: *
6266: * MERGE HERE AFTER EXECUTION ERROR
6267: *
6268: LCNXE MOV R$CNT,XR LOAD CONTINUATION CODE BLOCK PTR
6269: BZE XR,LCNT1 JUMP IF NO PREVIOUS ERROR
6270: ZER R$CNT CLEAR FLAG
6271: MOV XR,R$COD ELSE STORE AS NEW CODE BLOCK PTR
6272: ADD STXOF,XR ADD FAILURE OFFSET
6273: LCP XR LOAD CODE POINTER
6274: MOV FLPTR,XS RESET STACK POINTER
6275: BRN EXITS JUMP TO TAKE INDICATED FAILURE
6276: *
6277: * HERE IF NO PREVIOUS ERROR
6278: *
6279: LCNT1 ERB 043,GOTO CONTINUE WITH NO PRECEDING ERROR
6280: EJC
6281: *
6282: * END
6283: *
6284: L$END ENT ENTRY POINT
6285: MOV =ENDMS,XR POINT TO MESSAGE /NORMAL TERM../
6286: ZER WA NO ERROR CODE
6287: BRN STOPR JUMP TO ROUTINE TO STOP RUN
6288: *
6289: * FRETURN
6290: *
6291: L$FRT ENT ENTRY POINT
6292: MOV =SCFRT,WA POINT TO STRING /FRETURN/
6293: BRN RETRN JUMP TO COMMON RETURN ROUTINE
6294: *
6295: * NRETURN
6296: *
6297: L$NRT ENT ENTRY POINT
6298: MOV =SCNRT,WA POINT TO STRING /NRETURN/
6299: BRN RETRN JUMP TO COMMON RETURN ROUTINE
6300: *
6301: * RETURN
6302: *
6303: L$RTN ENT ENTRY POINT
6304: MOV =SCRTN,WA POINT TO STRING /RETURN/
6305: BRN RETRN JUMP TO COMMON RETURN ROUTINE
6306: *
6307: * UNDEFINED LABEL
6308: *
6309: L$UND ENT ENTRY POINT
6310: ERB 044,GOTO UNDEFINED LABEL
6311: TTL S P I T B O L -- BLOCK ACTION ROUTINES
6312: *
6313: * THE FIRST WORD OF EVERY BLOCK IN DYNAMIC STORAGE AND THE
6314: * VRGET, VRSTO AND VRTRA FIELDS OF A VRBLK CONTAIN A
6315: * POINTER TO AN ENTRY POINT IN THE PROGRAM. ALL SUCH ENTRY
6316: * POINTS ARE IN THE FOLLOWING SECTION EXCEPT THOSE FOR
6317: * PATTERN BLOCKS WHICH ARE IN THE PATTERN MATCHING SEGMENT
6318: * LATER ON (LABELS OF THE FORM P$XXX), AND DOPE VECTORS
6319: * (D$XXX) WHICH ARE IN THE DOPE VECTOR SECTION FOLLOWING
6320: * THE PATTERN ROUTINES (DOPE VECTORS ARE USED FOR CMBLKS).
6321: *
6322: * THE ENTRY POINTS IN THIS SECTION HAVE LABELS OF THE
6323: * FORM B$XXY WHERE XX IS THE TWO CHARACTER BLOCK TYPE FOR
6324: * THE CORRESPONDING BLOCK AND Y IS ANY LETTER.
6325: *
6326: * IN SOME CASES, THE POINTERS SERVE NO OTHER PURPOSE THAN
6327: * TO IDENTIFY THE BLOCK TYPE. IN THIS CASE THE ROUTINE
6328: * IS NEVER EXECUTED AND THUS NO CODE IS ASSEMBLED.
6329: *
6330: * FOR EACH OF THESE ENTRY POINTS CORRESPONDING TO A BLOCK
6331: * AN ENTRY POINT IDENTIFICATION IS ASSEMBLED (BL$XX).
6332: *
6333: * THE EXACT ENTRY CONDITIONS DEPEND ON THE MANNER IN
6334: * WHICH THE ROUTINE IS ACCESSED AND ARE DOCUMENTED WITH
6335: * THE INDIVIDUAL ROUTINES AS REQUIRED.
6336: *
6337: * THE ORDER OF THESE ROUTINES IS ALPHABETICAL WITH THE
6338: * FOLLOWING EXCEPTIONS.
6339: *
6340: * THE ROUTINES FOR SEBLK AND EXBLK ENTRIES OCCUR FIRST SO
6341: * THAT EXPRESSIONS CAN BE QUICKLY IDENTIFIED FROM THE FACT
6342: * THAT THEIR ROUTINES LIE BEFORE THE SYMBOL B$E$$.
6343: *
6344: * THESE ARE IMMEDIATELY FOLLOWED BY THE ROUTINE FOR A TRBLK
6345: * SO THAT THE TEST AGAINST THE SYMBOL B$T$$ CHECKS FOR
6346: * TRAPPED VALUES OR EXPRESSION VALUES (SEE PROCEDURE EVALP)
6347: *
6348: * THE PATTERN ROUTINES LIE AFTER THIS SECTION SO THAT
6349: * PATTERNS ARE IDENTIFIED WITH ROUTINES STARTING AT OR
6350: * AFTER THE INITIAL INSTRUCTION IN THESE ROUTINES (P$AAA).
6351: *
6352: * THE SYMBOL B$AAA DEFINES THE FIRST LOCATION FOR BLOCK
6353: * ROUTINES AND THE SYMBOL P$YYY (AT THE END OF THE PATTERN
6354: * MATCH ROUTINES SECTION) DEFINES THE LAST SUCH ENTRY POINT
6355: *
6356: B$AAA ENT BL$$I ENTRY POINT OF FIRST BLOCK ROUTINE
6357: EJC
6358: *
6359: * EXBLK
6360: *
6361: * THE ROUTINE FOR AN EXBLK LOADS THE EXPRESSION ONTO
6362: * THE STACK AS A VALUE.
6363: *
6364: * (XR) POINTER TO EXBLK
6365: *
6366: B$EXL ENT BL$EX ENTRY POINT (EXBLK)
6367: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD
6368: *
6369: * SEBLK
6370: *
6371: * THE ROUTINE FOR SEBLK IS ACCESSED FROM THE GENERATED
6372: * CODE TO LOAD THE EXPRESSION VALUE ONTO THE STACK.
6373: *
6374: B$SEL ENT BL$SE ENTRY POINT (SEBLK)
6375: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD
6376: *
6377: * DEFINE SYMBOL WHICH MARKS END OF ENTRIES FOR EXPRESSIONS
6378: *
6379: B$E$$ ENT BL$$I ENTRY POINT
6380: *
6381: * TRBLK
6382: *
6383: * THE ROUTINE FOR A TRBLK IS NEVER EXECUTED
6384: *
6385: B$TRT ENT BL$TR ENTRY POINT (TRBLK)
6386: *
6387: * DEFINE SYMBOL MARKING END OF TRAP AND EXPRESSION BLOCKS
6388: *
6389: B$T$$ ENT BL$$I END OF TRBLK,SEBLK,EXBLK ENTRIES
6390: *
6391: * ARBLK
6392: *
6393: * THE ROUTINE FOR ARBLK IS NEVER EXECUTED
6394: *
6395: B$ART ENT BL$AR ENTRY POINT (ARBLK)
6396: EJC
6397: .IF .CNBF
6398: .ELSE
6399: *
6400: * BCBLK
6401: *
6402: * THE ROUTINE FOR A BCBLK IS NEVER EXECUTED
6403: *
6404: * (XR) POINTER TO BCBLK
6405: *
6406: B$BCT ENT BL$BC ENTRY POINT (BCBLK)
6407: *
6408: * BFBLK
6409: *
6410: * THE ROUTINE FOR A BFBLK IS NEVER EXECUTED
6411: *
6412: * (XR) POINTER TO BFBLK
6413: *
6414: B$BFT ENT BL$BF ENTRY POINT (BFBLK)
6415: EJC
6416: .FI
6417: *
6418: * CCBLK
6419: *
6420: * THE ROUTINE FOR CCBLK IS NEVER ENTERED
6421: *
6422: B$CCT ENT BL$CC ENTRY POINT (CCBLK)
6423: *
6424: * CDBLK
6425: *
6426: * THE CDBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE.
6427: * THERE ARE TWO CASES DEPENDING ON THE FORM OF CDFAL.
6428: *
6429: * ENTRY FOR COMPLEX FAILURE CODE AT CDFAL
6430: *
6431: * (XR) POINTER TO CDBLK
6432: *
6433: B$CDC ENT BL$CD ENTRY POINT (CDBLK)
6434: MOV FLPTR,XS POP GARBAGE OFF STACK
6435: MOV CDFAL(XR),(XS) SET FAILURE OFFSET
6436: BRN STMGO ENTER STMT
6437: *
6438: * ENTRY FOR SIMPLE FAILURE CODE AT CDFAL
6439: *
6440: * (XR) POINTER TO CDBLK
6441: *
6442: B$CDS ENT BL$CD ENTRY POINT (CDBLK)
6443: MOV FLPTR,XS POP GARBAGE OFF STACK
6444: MOV *CDFAL,(XS) SET FAILURE OFFSET
6445: BRN STMGO ENTER STMT
6446: *
6447: * CMBLK
6448: *
6449: * THE ROUTINE FOR A CMBLK IS NEVER EXECUTED
6450: *
6451: B$CMT ENT BL$CM ENTRY POINT (CMBLK)
6452: *
6453: * COBLK
6454: *
6455: * THE ROUTINE FOR A COBLK IS NEVER EXECUTED
6456: *
6457: B$COP ENT BL$CO ENTRY POINT (COBLK)
6458: *
6459: * CTBLK
6460: *
6461: * THE ROUTINE FOR A CTBLK IS NEVER EXECUTED
6462: *
6463: B$CTT ENT BL$CT ENTRY POINT (CTBLK)
6464: EJC
6465: *
6466: * DFBLK
6467: *
6468: * THE ROUTINE FOR A DFBLK IS ACCESSED FROM THE O$FNC ENTRY
6469: * TO CALL A DATATYPE FUNCTION AND BUILD A PDBLK.
6470: *
6471: * (XL) POINTER TO DFBLK
6472: *
6473: B$DFC ENT BL$DF ENTRY POINT
6474: MOV DFPDL(XL),WA LOAD LENGTH OF PDBLK
6475: JSR ALLOC ALLOCATE PDBLK
6476: MOV =B$PDT,(XR) STORE TYPE WORD
6477: MOV XL,PDDFP(XR) STORE DFBLK POINTER
6478: MOV XR,WC SAVE POINTER TO PDBLK
6479: ADD WA,XR POINT PAST PDBLK
6480: LCT WA,FARGS(XL) SET TO COUNT FIELDS
6481: *
6482: * LOOP TO ACQUIRE FIELD VALUES FROM STACK
6483: *
6484: BDFC1 MOV (XS)+,-(XR) MOVE A FIELD VALUE
6485: BCT WA,BDFC1 LOOP TILL ALL MOVED
6486: MOV WC,XR RECALL POINTER TO PDBLK
6487: BRN EXSID EXIT SETTING ID FIELD
6488: .IF .CNLD
6489: .ELSE
6490: EJC
6491: *
6492: * EFBLK
6493: *
6494: * THE ROUTINE FOR AN EFBLK IS PASSED CONTROL FORM THE O$FNC
6495: * ENTRY TO CALL AN EXTERNAL FUNCTION.
6496: *
6497: * (XL) POINTER TO EFBLK
6498: *
6499: B$EFC ENT BL$EF ENTRY POINT (EFBLK)
6500: MOV FARGS(XL),WC LOAD NUMBER OF ARGUMENTS
6501: WTB WC CONVERT TO OFFSET
6502: MOV XL,-(XS) SAVE POINTER TO EFBLK
6503: MOV XS,XT COPY POINTER TO ARGUMENTS
6504: *
6505: * LOOP TO CONVERT ARGUMENTS
6506: *
6507: BEFC1 ICA XT POINT TO NEXT ENTRY
6508: MOV (XS),XR LOAD POINTER TO EFBLK
6509: DCA WC DECREMENT EFTAR OFFSET
6510: ADD WC,XR POINT TO NEXT EFTAR ENTRY
6511: MOV EFTAR(XR),XR LOAD EFTAR ENTRY
6512: BSW XR,5,BEFC7 SWITCH ON EFTAR TYPE
6513: IFF 1,BEFC2 STRING
6514: IFF 2,BEFC3 INTEGER
6515: .IF .CNRA
6516: .ELSE
6517: IFF 3,BEFC4 REAL
6518: .FI
6519: .IF .CNBF
6520: .ELSE
6521: IFF 4,BEFCA BUFFER
6522: .FI
6523: ESW END OF SWITCH ON TYPE
6524: *
6525: * HERE TO CONVERT TO STRING
6526: *
6527: BEFC2 MOV (XT),-(XS) STACK ARG PTR
6528: JSR GTSTG CONVERT ARGUMENT TO STRING
6529: ERR 045,EXTERNAL FUNCTION ARGUMENT IS NOT STRING
6530: BRN BEFC6 JUMP TO MERGE
6531: EJC
6532: *
6533: * EFBLK (CONTINUED)
6534: *
6535: * HERE TO CONVERT AN INTEGER
6536: *
6537: BEFC3 MOV (XT),XR LOAD NEXT ARGUMENT
6538: MOV WC,BEFOF SAVE OFFSET
6539: JSR GTINT CONVERT TO INTEGER
6540: ERR 046,EXTERNAL FUNCTION ARGUMENT IS NOT INTEGER
6541: .IF .CNRA
6542: .ELSE
6543: BRN BEFC5 MERGE WITH REAL CASE
6544: *
6545: * HERE TO CONVERT A REAL
6546: *
6547: BEFC4 MOV (XT),XR LOAD NEXT ARGUMENT
6548: MOV WC,BEFOF SAVE OFFSET
6549: JSR GTREA CONVERT TO REAL
6550: ERR 047,EXTERNAL FUNCTION ARGUMENT IS NOT REAL
6551: *
6552: * INTEGER CASE MERGES HERE
6553: *
6554: .FI
6555: .IF .CNBF
6556: .ELSE
6557: BRN BEFC5 MERGE
6558: *
6559: * HERE TO CONVERT BUFFER
6560: *
6561: BEFCA MOV (XT),XR LOAD ARGUMENT
6562: MOV WC,BEFOF SAVE OFFSET
6563: MOV XL,-(XS) SAVE EFBLK PTR
6564: JSR GTBUF GET A BUFFER
6565: ERR 259,EXTERNAL FUNCTION ARGUMENT IS NOT BUFFER
6566: MOV (XS)+,XL RESTORE EFBLK PTR
6567: *
6568: * INTEGER AND REAL CASE MERGES HERE
6569: *
6570: .FI
6571: BEFC5 MOV BEFOF,WC RESTORE OFFSET
6572: *
6573: * STRING MERGES HERE
6574: *
6575: BEFC6 MOV XR,(XT) STORE CONVERTED RESULT
6576: *
6577: * NO CONVERSION MERGES HERE
6578: *
6579: BEFC7 BNZ WC,BEFC1 LOOP BACK IF MORE TO GO
6580: *
6581: * HERE AFTER CONVERTING ALL THE ARGUMENTS
6582: *
6583: MOV (XS)+,XL RESTORE EFBLK POINTER
6584: MOV FARGS(XL),WA GET NUMBER OF ARGS
6585: JSR SYSEX CALL ROUTINE TO CALL EXTERNAL FNC
6586: PPM EXFAL FAIL IF FAILURE
6587: EJC
6588: *
6589: * EFBLK (CONTINUED)
6590: *
6591: * RETURN HERE WITH RESULT IN XR
6592: *
6593: * FIRST DEFEND AGAINST NON-STANDARD NULL STRING RETURNED
6594: *
6595: MOV EFRSL(XL),WB GET RESULT TYPE
6596: BNZ WB,BEFA8 BRANCH IF NOT UNCONVERTED
6597: BNE (XR),=B$SCL,BEFC8 JUMP IF NOT A STRING
6598: BZE SCLEN(XR),EXNUL RETURN NULL IF NULL
6599: *
6600: * HERE IF CONVERTED RESULT TO CHECK FOR NULL STRING
6601: *
6602: BEFA8 BNE WB,=NUM01,BEFC8 JUMP IF NOT A STRING
6603: BZE SCLEN(XR),EXNUL RETURN NULL IF NULL
6604: *
6605: * RETURN IF RESULT IS IN DYNAMIC STORAGE
6606: *
6607: BEFC8 BLT XR,DNAMB,BEFC9 JUMP IF NOT IN DYNAMIC STORAGE
6608: BLE XR,DNAMP,EXIXR RETURN RESULT IF ALREADY DYNAMIC
6609: *
6610: * HERE WE COPY A RESULT INTO THE DYNAMIC REGION
6611: *
6612: BEFC9 MOV (XR),WA GET POSSIBLE TYPE WORD
6613: BZE WB,BEF11 JUMP IF UNCONVERTED RESULT
6614: MOV =B$SCL,WA STRING
6615: BEQ WB,=NUM01,BEF10 YES JUMP
6616: MOV =B$ICL,WA INTEGER
6617: BEQ WB,=NUM02,BEF10 YES JUMP
6618: .IF .CNRA
6619: .ELSE
6620: MOV =B$RCL,WA REAL
6621: BEQ WB,=NUM03,BEF10 YES JUMP
6622: .FI
6623: .IF .CNBF
6624: .ELSE
6625: MOV =B$BCT,WA BUFFER
6626: BEQ WB,=NUM04,BEF10 YES JUMP
6627: .FI
6628: *
6629: * STORE TYPE WORD IN RESULT
6630: *
6631: BEF10 MOV WA,(XR) STORED BEFORE COPYING TO DYNAMIC
6632: *
6633: * MERGE FOR UNCONVERTED RESULT
6634: *
6635: BEF11 JSR BLKLN GET LENGTH OF BLOCK
6636: MOV XR,XL COPY ADDRESS OF OLD BLOCK
6637: JSR ALLOC ALLOCATE DYNAMIC BLOCK SAME SIZE
6638: MOV XR,-(XS) SET POINTER TO NEW BLOCK AS RESULT
6639: MVW COPY OLD BLOCK TO DYNAMIC BLOCK
6640: BRN EXITS EXIT WITH RESULT ON STACK
6641: .FI
6642: *
6643: * EVBLK
6644: *
6645: * THE ROUTINE FOR AN EVBLK IS NEVER EXECUTED
6646: *
6647: B$EVT ENT BL$EV ENTRY POINT (EVBLK)
6648: EJC
6649: *
6650: * FFBLK
6651: *
6652: * THE ROUTINE FOR AN FFBLK IS EXECUTED FROM THE O$FNC ENTRY
6653: * TO CALL A FIELD FUNCTION AND EXTRACT A FIELD VALUE/NAME.
6654: *
6655: * (XL) POINTER TO FFBLK
6656: *
6657: B$FFC ENT BL$FF ENTRY POINT (FFBLK)
6658: MOV XL,XR COPY FFBLK POINTER
6659: LCW WC LOAD NEXT CODE WORD
6660: MOV (XS),XL LOAD PDBLK POINTER
6661: BNE (XL),=B$PDT,BFFC2 JUMP IF NOT PDBLK AT ALL
6662: MOV PDDFP(XL),WA LOAD DFBLK POINTER FROM PDBLK
6663: *
6664: * LOOP TO FIND CORRECT FFBLK FOR THIS PDBLK
6665: *
6666: BFFC1 BEQ WA,FFDFP(XR),BFFC3 JUMP IF THIS IS THE CORRECT FFBLK
6667: MOV FFNXT(XR),XR ELSE LINK TO NEXT FFBLK ON CHAIN
6668: BNZ XR,BFFC1 LOOP BACK IF ANOTHER ENTRY TO CHECK
6669: *
6670: * HERE FOR BAD ARGUMENT
6671: *
6672: BFFC2 ERB 048,FIELD FUNCTION ARGUMENT IS WRONG DATATYPE
6673: *
6674: * HERE AFTER LOCATING CORRECT FFBLK
6675: *
6676: BFFC3 MOV FFOFS(XR),WA LOAD FIELD OFFSET
6677: BEQ WC,=OFNE$,BFFC5 JUMP IF CALLED BY NAME
6678: ADD WA,XL ELSE POINT TO VALUE FIELD
6679: MOV (XL),XR LOAD VALUE
6680: BNE (XR),=B$TRT,BFFC4 JUMP IF NOT TRAPPED
6681: SUB WA,XL ELSE RESTORE NAME BASE,OFFSET
6682: MOV WC,(XS) SAVE NEXT CODE WORD OVER PDBLK PTR
6683: JSR ACESS ACCESS VALUE
6684: PPM EXFAL FAIL IF ACCESS FAILS
6685: MOV (XS),WC RESTORE NEXT CODE WORD
6686: *
6687: * HERE AFTER GETTING VALUE IN (XR)
6688: *
6689: BFFC4 MOV XR,(XS) STORE VALUE ON STACK (OVER PDBLK)
6690: MOV WC,XR COPY NEXT CODE WORD
6691: MOV (XR),XL LOAD ENTRY ADDRESS
6692: BRI XL JUMP TO ROUTINE FOR NEXT CODE WORD
6693: *
6694: * HERE IF CALLED BY NAME
6695: *
6696: BFFC5 MOV WA,-(XS) STORE NAME OFFSET (BASE IS SET)
6697: BRN EXITS EXIT WITH NAME ON STACK
6698: EJC
6699: *
6700: * ICBLK
6701: *
6702: * THE ROUTINE FOR ICBLK IS EXECUTED FROM THE GENERATED
6703: * CODE TO LOAD AN INTEGER VALUE ONTO THE STACK.
6704: *
6705: * (XR) POINTER TO ICBLK
6706: *
6707: B$ICL ENT BL$IC ENTRY POINT (ICBLK)
6708: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD
6709: *
6710: * KVBLK
6711: *
6712: * THE ROUTINE FOR A KVBLK IS NEVER EXECUTED.
6713: *
6714: B$KVT ENT BL$KV ENTRY POINT (KVBLK)
6715: *
6716: * NMBLK
6717: *
6718: * THE ROUTINE FOR A NMBLK IS EXECUTED FROM THE GENERATED
6719: * CODE FOR THE CASE OF LOADING A NAME ONTO THE STACK
6720: * WHERE THE NAME IS THAT OF A NATURAL VARIABLE WHICH CAN
6721: * BE PREEVALUATED AT COMPILE TIME.
6722: *
6723: * (XR) POINTER TO NMBLK
6724: *
6725: B$NML ENT BL$NM ENTRY POINT (NMBLK)
6726: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD
6727: *
6728: * PDBLK
6729: *
6730: * THE ROUTINE FOR A PDBLK IS NEVER EXECUTED
6731: *
6732: B$PDT ENT BL$PD ENTRY POINT (PDBLK)
6733: EJC
6734: *
6735: * PFBLK
6736: *
6737: * THE ROUTINE FOR A PFBLK IS EXECUTED FROM THE ENTRY O$FNC
6738: * TO CALL A PROGRAM DEFINED FUNCTION.
6739: *
6740: * (XL) POINTER TO PFBLK
6741: *
6742: * THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING
6743: * CONTROL TO THE PROGRAM DEFINED FUNCTION.
6744: *
6745: * SAVED VALUE OF FIRST ARGUMENT
6746: * .
6747: * SAVED VALUE OF LAST ARGUMENT
6748: * SAVED VALUE OF FIRST LOCAL
6749: * .
6750: * SAVED VALUE OF LAST LOCAL
6751: * SAVED VALUE OF FUNCTION NAME
6752: * SAVED CODE BLOCK PTR (R$COD)
6753: * SAVED CODE POINTER (-R$COD)
6754: * SAVED VALUE OF FLPRT
6755: * SAVED VALUE OF FLPTR
6756: * POINTER TO PFBLK
6757: * FLPTR --------------- ZERO (TO BE OVERWRITTEN WITH OFFS)
6758: *
6759: B$PFC ENT BL$PF ENTRY POINT (PFBLK)
6760: MOV XL,BPFPF SAVE PFBLK PTR (NEED NOT BE RELOC)
6761: MOV XL,XR COPY FOR THE MOMENT
6762: MOV PFVBL(XR),XL POINT TO VRBLK FOR FUNCTION
6763: *
6764: * LOOP TO FIND OLD VALUE OF FUNCTION
6765: *
6766: BPF01 MOV XL,WB SAVE POINTER
6767: MOV VRVAL(XL),XL LOAD VALUE
6768: BEQ (XL),=B$TRT,BPF01 LOOP IF TRBLK
6769: *
6770: * SET VALUE TO NULL AND SAVE OLD FUNCTION VALUE
6771: *
6772: MOV XL,BPFSV SAVE OLD VALUE
6773: MOV WB,XL POINT BACK TO BLOCK WITH VALUE
6774: MOV =NULLS,VRVAL(XL) SET VALUE TO NULL
6775: MOV FARGS(XR),WA LOAD NUMBER OF ARGUMENTS
6776: ADD *PFARG,XR POINT TO PFARG ENTRIES
6777: BZE WA,BPF04 JUMP IF NO ARGUMENTS
6778: MOV XS,XT PTR TO LAST ARG
6779: WTB WA CONVERT NO. OF ARGS TO BAUS OFFSET
6780: ADD WA,XT POINT BEFORE FIRST ARG
6781: MOV XT,BPFXT REMEMBER ARG POINTER
6782: EJC
6783: *
6784: * PFBLK (CONTINUED)
6785: *
6786: * LOOP TO SAVE OLD ARGUMENT VALUES AND SET NEW ONES
6787: *
6788: BPF02 MOV (XR)+,XL LOAD VRBLK PTR FOR NEXT ARGUMENT
6789: *
6790: * LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE
6791: *
6792: BPF03 MOV XL,WC SAVE POINTER
6793: MOV VRVAL(XL),XL LOAD NEXT VALUE
6794: BEQ (XL),=B$TRT,BPF03 LOOP BACK IF TRBLK
6795: *
6796: * SAVE OLD VALUE AND GET NEW VALUE
6797: *
6798: MOV XL,WA KEEP OLD VALUE
6799: MOV BPFXT,XT POINT BEFORE NEXT STACKED ARG
6800: MOV -(XT),WB LOAD ARGUMENT (NEW VALUE)
6801: MOV WA,(XT) SAVE OLD VALUE
6802: MOV XT,BPFXT KEEP ARG PTR FOR NEXT TIME
6803: MOV WC,XL POINT BACK TO BLOCK WITH VALUE
6804: MOV WB,VRVAL(XL) SET NEW VALUE
6805: BNE XS,BPFXT,BPF02 LOOP IF NOT ALL DONE
6806: *
6807: * NOW PROCESS LOCALS
6808: *
6809: BPF04 MOV BPFPF,XL RESTORE PFBLK POINTER
6810: MOV PFNLO(XL),WA LOAD NUMBER OF LOCALS
6811: BZE WA,BPF07 JUMP IF NO LOCALS
6812: MOV =NULLS,WB GET NULL CONSTANT
6813: LCT WA,WA SET LOCAL COUNTER
6814: *
6815: * LOOP TO PROCESS LOCALS
6816: *
6817: BPF05 MOV (XR)+,XL LOAD VRBLK PTR FOR NEXT LOCAL
6818: *
6819: * LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE
6820: *
6821: BPF06 MOV XL,WC SAVE POINTER
6822: MOV VRVAL(XL),XL LOAD NEXT VALUE
6823: BEQ (XL),=B$TRT,BPF06 LOOP BACK IF TRBLK
6824: *
6825: * SAVE OLD VALUE AND SET NULL AS NEW VALUE
6826: *
6827: MOV XL,-(XS) STACK OLD VALUE
6828: MOV WC,XL POINT BACK TO BLOCK WITH VALUE
6829: MOV WB,VRVAL(XL) SET NULL AS NEW VALUE
6830: BCT WA,BPF05 LOOP TILL ALL LOCALS PROCESSED
6831: EJC
6832: *
6833: * PFBLK (CONTINUED)
6834: *
6835: * HERE AFTER PROCESSING ARGUMENTS AND LOCALS
6836: *
6837: .IF .CNPF
6838: BPF07 MOV R$COD,WA LOAD OLD CODE BLOCK POINTER
6839: .ELSE
6840: BPF07 ZER XR ZERO REG XR IN CASE
6841: BZE KVPFL,BPF7C SKIP IF PROFILING IS OFF
6842: BEQ KVPFL,=NUM02,BPF7A BRANCH ON TYPE OF PROFILE
6843: *
6844: * HERE IF PROFILE = 1
6845: *
6846: JSR SYSTM GET CURRENT TIME
6847: STI PFETM SAVE FOR A SEC
6848: SBI PFSTM FIND TIME USED BY CALLER
6849: JSR ICBLD BUILD INTO AN ICBLK
6850: LDI PFETM RELOAD CURRENT TIME
6851: BRN BPF7B MERGE
6852: *
6853: * HERE IF PROFILE = 2
6854: *
6855: BPF7A LDI PFSTM GET START TIME OF CALLING STMT
6856: JSR ICBLD ASSEMBLE AN ICBLK ROUND IT
6857: JSR SYSTM GET NOW TIME
6858: *
6859: * BOTH TYPES OF PROFILE MERGE HERE
6860: *
6861: BPF7B STI PFSTM SET START TIME OF 1ST FUNC STMT
6862: MNZ PFFNC FLAG FUNCTION ENTRY
6863: EJC
6864: *
6865: * PFBLK (CONTINUED)
6866: *
6867: * NO PROFILING MERGES HERE
6868: *
6869: BPF7C MOV XR,-(XS) STACK ICBLK PTR (OR ZERO)
6870: MOV R$COD,WA LOAD OLD CODE BLOCK POINTER
6871: .FI
6872: SCP WB GET CODE POINTER
6873: SUB WA,WB MAKE CODE POINTER INTO OFFSET
6874: MOV BPFPF,XL RECALL PFBLK POINTER
6875: MOV BPFSV,-(XS) STACK OLD VALUE OF FUNCTION NAME
6876: MOV WA,-(XS) STACK CODE BLOCK POINTER
6877: MOV WB,-(XS) STACK CODE OFFSET
6878: MOV FLPRT,-(XS) STACK OLD FLPRT
6879: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER
6880: MOV XL,-(XS) STACK POINTER TO PFBLK
6881: ZER -(XS) DUMMY ZERO ENTRY FOR FAIL RETURN
6882: CHK CHECK FOR STACK OVERFLOW
6883: MOV XS,FLPTR SET NEW FAIL RETURN VALUE
6884: MOV XS,FLPRT SET NEW FLPRT
6885: MOV KVTRA,WA LOAD TRACE VALUE
6886: ADD KVFTR,WA ADD FTRACE VALUE
6887: BNZ WA,BPF09 JUMP IF TRACING POSSIBLE
6888: ICV KVFNC ELSE BUMP FNCLEVEL
6889: *
6890: * HERE TO ACTUALLY JUMP TO FUNCTION
6891: *
6892: BPF08 MOV PFCOD(XL),XR POINT TO CODE
6893: BRI (XR) OFF TO EXECUTE FUNCTION
6894: *
6895: * HERE IF TRACING IS POSSIBLE
6896: *
6897: BPF09 MOV PFCTR(XL),XR LOAD POSSIBLE CALL TRACE TRBLK
6898: MOV PFVBL(XL),XL LOAD VRBLK POINTER FOR FUNCTION
6899: MOV *VRVAL,WA SET NAME OFFSET FOR VARIABLE
6900: BZE KVTRA,BPF10 JUMP IF TRACE MODE IS OFF
6901: BZE XR,BPF10 OR IF THERE IS NO CALL TRACE
6902: *
6903: * HERE IF CALL TRACED
6904: *
6905: DCV KVTRA DECREMENT TRACE COUNT
6906: BZE TRFNC(XR),BPF11 JUMP IF PRINT TRACE
6907: JSR TRXEQ EXECUTE FUNCTION TYPE TRACE
6908: EJC
6909: *
6910: * PFBLK (CONTINUED)
6911: *
6912: * HERE TO TEST FOR FTRACE TRACE
6913: *
6914: BPF10 BZE KVFTR,BPF16 JUMP IF FTRACE IS OFF
6915: DCV KVFTR ELSE DECREMENT FTRACE
6916: *
6917: * HERE FOR PRINT TRACE
6918: *
6919: BPF11 JSR PRTSN PRINT STATEMENT NUMBER
6920: JSR PRTNM PRINT FUNCTION NAME
6921: MOV =CH$PP,WA LOAD LEFT PAREN
6922: JSR PRTCH PRINT LEFT PAREN
6923: MOV 1(XS),XL RECOVER PFBLK POINTER
6924: BZE FARGS(XL),BPF15 SKIP IF NO ARGUMENTS
6925: ZER WB ELSE SET ARGUMENT COUNTER
6926: BRN BPF13 JUMP INTO LOOP
6927: *
6928: * LOOP TO PRINT ARGUMENT VALUES
6929: *
6930: BPF12 MOV =CH$CM,WA LOAD COMMA
6931: JSR PRTCH PRINT TO SEPARATE FROM LAST ARG
6932: *
6933: * MERGE HERE FIRST TIME (NO COMMA REQUIRED)
6934: *
6935: BPF13 MOV WB,(XS) SAVE ARG CTR (OVER FAILOFFS IS OK)
6936: WTB WB CONVERT TO BAU OFFSET
6937: ADD WB,XL POINT TO NEXT ARGUMENT POINTER
6938: MOV PFARG(XL),XR LOAD NEXT ARGUMENT VRBLK PTR
6939: SUB WB,XL RESTORE PFBLK POINTER
6940: MOV VRVAL(XR),XR LOAD NEXT VALUE
6941: JSR PRTVL PRINT ARGUMENT VALUE
6942: EJC
6943: *
6944: * HERE AFTER DEALING WITH ONE ARGUMENT
6945: *
6946: MOV (XS),WB RESTORE ARGUMENT COUNTER
6947: ICV WB INCREMENT ARGUMENT COUNTER
6948: BLT WB,FARGS(XL),BPF12 LOOP IF MORE TO PRINT
6949: *
6950: * MERGE HERE IN NO ARGS CASE TO PRINT PAREN
6951: *
6952: BPF15 MOV =CH$RP,WA LOAD RIGHT PAREN
6953: JSR PRTCF PRINT TO TERMINATE OUTPUT
6954: *
6955: * MERGE HERE TO EXIT WITH TEST FOR FNCLEVEL TRACE
6956: *
6957: BPF16 ICV KVFNC INCREMENT FNCLEVEL
6958: MOV R$FNC,XL LOAD PTR TO POSSIBLE TRBLK
6959: JSR KTREX CALL KEYWORD TRACE ROUTINE
6960: *
6961: * CALL FUNCTION AFTER TRACE TESTS COMPLETE
6962: *
6963: MOV 1(XS),XL RESTORE PFBLK POINTER
6964: BRN BPF08 JUMP BACK TO EXECUTE FUNCTION
6965: .IF .CNRA
6966: .ELSE
6967: EJC
6968: *
6969: * RCBLK
6970: *
6971: * THE ROUTINE FOR AN RCBLK IS EXECUTED FROM THE GENERATED
6972: * CODE TO LOAD A REAL VALUE ONTO THE STACK.
6973: *
6974: * (XR) POINTER TO RCBLK
6975: *
6976: B$RCL ENT BL$RC ENTRY POINT (RCBLK)
6977: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD
6978: .FI
6979: *
6980: * SCBLK
6981: *
6982: * THE ROUTINE FOR AN SCBLK IS EXECUTED FROM THE GENERATED
6983: * CODE TO LOAD A STRING VALUE ONTO THE STACK.
6984: *
6985: * (XR) POINTER TO SCBLK
6986: *
6987: B$SCL ENT BL$SC ENTRY POINT (SCBLK)
6988: BRN EXIXR STACK XR AND OBEY NEXT CODE WORD
6989: *
6990: * TBBLK
6991: *
6992: * THE ROUTINE FOR A TBBLK IS NEVER EXECUTED
6993: *
6994: B$TBT ENT BL$TB ENTRY POINT (TBBLK)
6995: *
6996: * TEBLK
6997: *
6998: * THE ROUTINE FOR A TEBLK IS NEVER EXECUTED
6999: *
7000: B$TET ENT BL$TE ENTRY POINT (TEBLK)
7001: *
7002: * VCBLK
7003: *
7004: * THE ROUTINE FOR A VCBLK IS NEVER EXECUTED
7005: *
7006: B$VCT ENT BL$VC ENTRY POINT (VCBLK)
7007: EJC
7008: *
7009: * VRBLK
7010: *
7011: * THE VRBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE.
7012: * THERE ARE SIX ENTRIES FOR VRBLK COVERING VARIOUS CASES
7013: *
7014: B$VR$ ENT BL$$I MARK START OF VRBLK ENTRY POINTS
7015: *
7016: * ENTRY FOR VRGET (TRAPPED CASE). THIS ROUTINE IS CALLED
7017: * FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE.
7018: * THIS ENTRY POINT IS USED IF AN ACCESS TRACE OR INPUT
7019: * ASSOCIATION IS CURRENTLY ACTIVE.
7020: *
7021: * (XR) POINTER TO VRGET FIELD OF VRBLK
7022: *
7023: B$VRA ENT BL$$I ENTRY POINT
7024: MOV XR,XL COPY NAME BASE (VRGET = 0)
7025: MOV *VRVAL,WA SET NAME OFFSET
7026: JSR ACESS ACCESS VALUE
7027: PPM EXFAL FAIL IF ACCESS FAILS
7028: BRN EXIXR ELSE EXIT WITH RESULT IN XR
7029: *
7030: * ENTRY FOR VRSTO (ERROR CASE. THIS ROUTINE IS CALLED FROM
7031: * THE EXECUTED CODE FOR AN ATTEMPT TO MODIFY THE VALUE
7032: * OF A PROTECTED (PATTERN VALUED) NATURAL VARIABLE.
7033: *
7034: B$VRE ENT ENTRY POINT
7035: ERB 049,ATTEMPT TO CHANGE VALUE OF PROTECTED VARIABLE
7036: *
7037: * ENTRY FOR VRTRA (UNTRAPPED CASE). THIS ROUTINE IS CALLED
7038: * FROM THE EXECUTED CODE TO TRANSFER TO A LABEL.
7039: *
7040: * (XR) POINTER TO VRTRA FIELD OF VRBLK
7041: *
7042: B$VRG ENT ENTRY POINT
7043: MOV VRLBO(XR),XR LOAD CODE POINTER
7044: MOV (XR),XL LOAD ENTRY ADDRESS
7045: BRI XL JUMP TO ROUTINE FOR NEXT CODE WORD
7046: *
7047: * ENTRY FOR VRGET (UNTRAPPED CASE). THIS ROUTINE IS CALLED
7048: * FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE.
7049: *
7050: * (XR) POINTS TO VRGET FIELD OF VRBLK
7051: *
7052: B$VRL ENT ENTRY POINT
7053: MOV VRVAL(XR),-(XS) LOAD VALUE ONTO STACK (VRGET = 0)
7054: BRN EXITS OBEY NEXT CODE WORD
7055: EJC
7056: *
7057: * VRBLK (CONTINUED)
7058: *
7059: * ENTRY FOR VRSTO (UNTRAPPED CASE). THIS ROUTINE IS CALLED
7060: * FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE.
7061: *
7062: * (XR) POINTER TO VRSTO FIELD OF VRBLK
7063: *
7064: B$VRS ENT ENTRY POINT
7065: MOV (XS),VRVLO(XR) STORE VALUE, LEAVE ON STACK
7066: BRN EXITS OBEY NEXT CODE WORD
7067: *
7068: * VRTRA (TRAPPED CASE). THIS ROUTINE IS CALLED FROM THE
7069: * GENERATED CODE TO TRANSFER TO A LABEL WHEN A LABEL
7070: * TRACE IS CURRENTLY ACTIVE.
7071: *
7072: B$VRT ENT ENTRY POINT
7073: SUB *VRTRA,XR POINT BACK TO START OF VRBLK
7074: MOV XR,XL COPY VRBLK POINTER
7075: MOV *VRVAL,WA SET NAME OFFSET
7076: MOV VRLBL(XL),XR LOAD POINTER TO TRBLK
7077: BZE KVTRA,BVRT2 JUMP IF TRACE IS OFF
7078: DCV KVTRA ELSE DECREMENT TRACE COUNT
7079: BZE TRFNC(XR),BVRT1 JUMP IF PRINT TRACE CASE
7080: JSR TRXEQ ELSE EXECUTE FULL TRACE
7081: BRN BVRT2 MERGE TO JUMP TO LABEL
7082: *
7083: * HERE FOR PRINT TRACE -- PRINT COLON ( LABEL NAME )
7084: *
7085: BVRT1 JSR PRTSN PRINT STATEMENT NUMBER
7086: MOV XL,XR COPY VRBLK POINTER
7087: MOV =CH$CL,WA COLON
7088: JSR PRTCH PRINT IT
7089: MOV =CH$PP,WA LEFT PAREN
7090: JSR PRTCH PRINT IT
7091: JSR PRTVN PRINT LABEL NAME
7092: MOV =CH$RP,WA RIGHT PAREN
7093: JSR PRTCF PRINT IT
7094: MOV VRLBL(XL),XR POINT BACK TO TRBLK
7095: *
7096: * MERGE HERE TO JUMP TO LABEL
7097: *
7098: BVRT2 MOV TRLBL(XR),XR LOAD POINTER TO ACTUAL CODE
7099: BRI (XR) EXECUTE STATEMENT AT LABEL
7100: EJC
7101: *
7102: * VRBLK (CONTINUED)
7103: *
7104: * ENTRY FOR VRSTO (TRAPPED CASE). THIS ROUTINE IS CALLED
7105: * FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE.
7106: * THIS ENTRY IS USED WHEN A VALUE TRACE OR OUTPUT
7107: * ASSOCIATION IS CURRENTLY ACTIVE.
7108: *
7109: * (XR) POINTER TO VRSTO FIELD OF VRBLK
7110: *
7111: B$VRV ENT ENTRY POINT
7112: MOV (XS),WB LOAD VALUE (LEAVE COPY ON STACK)
7113: SUB *VRSTO,XR POINT TO VRBLK
7114: MOV XR,XL COPY VRBLK POINTER
7115: MOV *VRVAL,WA SET OFFSET
7116: JSR ASIGN CALL ASSIGNMENT ROUTINE
7117: PPM EXFAL FAIL IF ASSIGNMENT FAILS
7118: BRN EXITS ELSE RETURN WITH RESULT ON STACK
7119: EJC
7120: *
7121: * XNBLK
7122: *
7123: * THE ROUTINE FOR AN XNBLK IS NEVER EXECUTED
7124: *
7125: B$XNT ENT BL$XN ENTRY POINT (XNBLK)
7126: *
7127: * XRBLK
7128: *
7129: * THE ROUTINE FOR AN XRBLK IS NEVER EXECUTED
7130: *
7131: B$XRT ENT BL$XR ENTRY POINT (XRBLK)
7132: *
7133: * MARK ENTRY ADDRESS PAST LAST BLOCK ACTION ROUTINE
7134: *
7135: B$YYY ENT BL$$I LAST BLOCK ROUTINE ENTRY POINT
7136: TTL S P I T B O L -- PATTERN MATCHING ROUTINES
7137: *
7138: * THE FOLLOWING SECTION CONSISTS OF THE PATTERN MATCHING
7139: * ROUTINES. ALL PATTERN NODES CONTAIN A POINTER (PCODE)
7140: * TO ONE OF THE ROUTINES IN THIS SECTION (P$XXX).
7141: *
7142: * NOTE THAT THIS SECTION FOLLOWS THE B$XXX ROUTINES TO
7143: * ENABLE A FAST TEST FOR THE PATTERN DATATYPE.
7144: *
7145: P$AAA ENT BL$$I ENTRY TO MARK FIRST PATTERN
7146: *
7147: *
7148: * THE ENTRY CONDITIONS TO THE MATCH ROUTINE ARE AS FOLLOWS
7149: * (SEE O$PMN, O$PMV, O$PMS AND PROCEDURE MATCH).
7150: *
7151: * STACK CONTENTS.
7152: *
7153: * NAME BASE (O$PMN ONLY)
7154: * NAME OFFSET (O$PMN ONLY)
7155: * TYPE (0-O$PMN, 1-O$PMV, 2-O$PMS)
7156: * PMHBS --------------- INITIAL CURSOR (ZERO)
7157: * INITIAL NODE POINTER
7158: * XS ------------------ =NDABO (ANCHORED), =NDUNA (UNANCH)
7159: *
7160: * REGISTER VALUES.
7161: *
7162: * (XS) SET AS SHOWN IN STACK DIAGRAM
7163: * (XR) POINTER TO INITIAL PATTERN NODE
7164: * (WB) INITIAL CURSOR (ZERO)
7165: *
7166: * GLOBAL PATTERN VALUES
7167: *
7168: * R$PMS POINTER TO SUBJECT STRING SCBLK
7169: * PMSSL LENGTH OF SUBJECT STRING IN CHARS
7170: * PMDFL DOT FLAG, INITIALLY ZERO
7171: * PMHBS SET AS SHOWN IN STACK DIAGRAM
7172: *
7173: * CONTROL IS PASSED BY BRANCHING THROUGH THE PCODE
7174: * FIELD OF THE INITIAL PATTERN NODE (BRI (XR)).
7175: EJC
7176: *
7177: * DESCRIPTION OF ALGORITHM
7178: *
7179: * A PATTERN STRUCTURE IS REPRESENTED AS A LINKED GRAPH
7180: * OF NODES WITH THE FOLLOWING STRUCTURE.
7181: *
7182: * +------------------------------------+
7183: * I PCODE I
7184: * +------------------------------------+
7185: * I PTHEN I
7186: * +------------------------------------+
7187: * I PARM1 I
7188: * +------------------------------------+
7189: * I PARM2 I
7190: * +------------------------------------+
7191: *
7192: * PCODE IS A POINTER TO THE ROUTINE WHICH WILL PERFORM
7193: * THE MATCH OF THIS PARTICULAR NODE TYPE.
7194: *
7195: * PTHEN IS A POINTER TO THE SUCCESSOR NODE. I.E. THE NODE
7196: * TO BE MATCHED IF THE ATTEMPT TO MATCH THIS NODE SUCCEEDS.
7197: * IF THIS IS THE LAST NODE OF THE PATTERN PTHEN POINTS
7198: * TO THE DUMMY NODE NDNTH WHICH INITIATES PATTERN EXIT.
7199: *
7200: * PARM1, PARM2 ARE PARAMETERS WHOSE USE VARIES WITH THE
7201: * PARTICULAR NODE. THEY ARE ONLY PRESENT IF REQUIRED.
7202: *
7203: * ALTERNATIVES ARE HANDLED WITH THE SPECIAL ALTERNATIVE
7204: * NODE WHOSE PARAMETER POINTS TO THE NODE TO BE MATCHED
7205: * IF THERE IS A FAILURE ON THE SUCCESSOR PATH.
7206: *
7207: * THE FOLLOWING EXAMPLE ILLUSTRATES THE MANNER IN WHICH
7208: * THE STRUCTURE IS BUILT UP. THE PATTERN IS
7209: *
7210: * (A / B / C) (D / E) WHERE / IS ALTERNATION
7211: *
7212: * IN THE DIAGRAM, THE NODE MARKED + REPRESENTS AN
7213: * ALTERNATIVE NODE AND THE DOTTED LINE FROM A + NODE
7214: * REPRESENTS THE PARAMETER POINTER TO THE ALTERNATIVE.
7215: *
7216: * +---+ +---+ +---+ +---+
7217: * I + I-----I A I-----I + I-----I D I-----
7218: * +---+ +---+ I +---+ +---+
7219: * . I .
7220: * . I .
7221: * +---+ +---+ I +---+
7222: * I + I-----I B I--I I E I-----
7223: * +---+ +---+ I +---+
7224: * . I
7225: * . I
7226: * +---+ I
7227: * I C I------------I
7228: * +---+
7229: EJC
7230: *
7231: * DURING THE MATCH, THE REGISTERS ARE USED AS FOLLOWS.
7232: *
7233: * (XR) POINTS TO THE CURRENT NODE
7234: * (XL) SCRATCH
7235: * (XS) MAIN STACK POINTER
7236: * (WB) CURSOR (NUMBER OF CHARS MATCHED)
7237: * (WA,WC) SCRATCH
7238: *
7239: * TO KEEP TRACK OF ALTERNATIVES, THE MAIN STACK IS USED AS
7240: * A HISTORY STACK AND CONTAINS TWO WORD ENTRIES.
7241: *
7242: * WORD 1 SAVED CURSOR VALUE
7243: * WORD 2 NODE TO MATCH ON FAILURE
7244: *
7245: * WHEN A FAILURE OCCURS, THE MOST RECENT ENTRY ON THIS
7246: * STACK IS POPPED OFF TO RESTORE THE CURSOR AND POINT
7247: * TO THE NODE TO BE MATCHED AS AN ALTERNATIVE. THE ENTRY
7248: * AT THE BOTTOM OF THE STACK POINTS TO THE FOLLOWING
7249: * SPECIAL NODES DEPENDING ON THE SCAN MODE.
7250: *
7251: * ANCHORED MODE THE BOTTOM ENTRY POINTS TO THE
7252: * SPECIAL NODE NDABO WHICH CAUSES AN
7253: * ABORT. THE CURSOR VALUE STORED
7254: * WITH THIS ENTRY IS ALWAYS ZERO.
7255: *
7256: * UNANCHORED MODE THE BOTTOM ENTRY POINTS TO THE
7257: * SPECIAL NODE NDUNA WHICH MOVES THE
7258: * ANCHOR POINT AND RESTARTS THE MATCH
7259: * THE CURSOR SAVED WITH THIS ENTRY
7260: * IS THE NUMBER OF CHARACTERS WHICH
7261: * LIE BEFORE THE INITIAL ANCHOR POINT
7262: * (I.E. THE NUMBER OF ANCHOR MOVES).
7263: * THIS ENTRY IS THREE WORDS LONG AND
7264: * ALSO CONTAINS THE INITIAL PATTERN.
7265: *
7266: * ENTRIES ARE MADE ON THIS HISTORY STACK BY ALTERNATIVE
7267: * NODES AND BY SOME SPECIAL COMPOUD PATTERNS AS DESCRIBED
7268: * LATER ON. THE FOLLOWING GLOBAL LOCATIONS ARE USED DURING
7269: * PATTERN MATCHING.
7270: *
7271: * R$PMS POINTER TO SUBJECT STRING
7272: * PMSSL LENGTH OF SUBJECT STRING
7273: * PMDFL FLAG SET NON-ZERO FOR DOT PATTERNS
7274: * PMHBS BASE PTR FOR CURRENT HISTORY STACK
7275: *
7276: * THE FOLLOWING EXIT POINTS ARE AVAILABLE TO MATCH ROUTINES
7277: *
7278: * SUCCP SUCCESS IN MATCHING CURRENT NODE
7279: * FAILP FAILURE IN MATCHING CURRENT NODE
7280: EJC
7281: *
7282: * COMPOUND PATTERNS
7283: *
7284: * SOME PATTERNS HAVE IMPLICIT ALTERNATIVES AND THEIR
7285: * REPRESENTATION IN THE PATTERN STRUCTURE CONSISTS OF A
7286: * LINKED SET OF NODES AS INDICATED BY THESE DIAGRAMS.
7287: *
7288: * AS BEFORE, THE + REPRESENTS AN ALTERNATIVE NODE AND
7289: * THE DOTTED LINE FROM A + NODE IS THE PARAMETER POINTER
7290: * TO THE ALTERNATIVE PATTERN.
7291: *
7292: * ARB
7293: * ---
7294: *
7295: * +---+ THIS NODE (P$ARB) MATCHES NULL
7296: * I B I----- AND STACKS CURSOR, SUCCESSOR PTR,
7297: * +---+ CURSOR (COPY) AND A PTR TO NDARC.
7298: *
7299: *
7300: *
7301: *
7302: * BAL
7303: * ---
7304: *
7305: * +---+ THE P$BAL NODE SCANS A BALANCED
7306: * I B I----- STRING AND THEN STACKS A POINTER
7307: * +---+ TO ITSELF ON THE HISTORY STACK.
7308: EJC
7309: *
7310: * COMPOUND PATTERN STRUCTURES (CONTINUED)
7311: *
7312: *
7313: * ARBNO
7314: * -----
7315: *
7316: * +---+ THIS ALTERNATIVE NODE MATCHES NULL
7317: * +----I + I----- THE FIRST TIME AND STACKS A POINTER
7318: * I +---+ TO THE ARGUMENT PATTERN X.
7319: * I .
7320: * I .
7321: * I +---+ NODE (P$ABA) TO STACK CURSOR
7322: * I I A I AND HISTORY STACK BASE PTR.
7323: * I +---+
7324: * I I
7325: * I I
7326: * I +---+ THIS IS THE ARGUMENT PATTERN. AS
7327: * I I X I INDICATED, THE SUCCESSOR OF THE
7328: * I +---+ PATTERN IS THE P$ABC NODE
7329: * I I
7330: * I I
7331: * I +---+ THIS NODE (P$ABC) POPS PMHBS,
7332: * +----I C I STACKS OLD PMHBS AND PTR TO NDABD
7333: * +---+ (UNLESS OPTIMISATION HAS OCCURRED)
7334: *
7335: * STRUCTURE AND EXECUTION OF THIS PATTERN RESEMBLE THOSE OF
7336: * RECURSIVE PATTERN MATCHING AND IMMEDIATE ASSIGNMENT.
7337: * THE ALTERNATIVE NODE AT THE HEAD OF THE STRUCTURE MATCHES
7338: * NULL INITIALLY BUT ON SUBSEQUENT FAILURE ENSURES ATTEMPT
7339: * TO MATCH THE ARGUMENT. BEFORE THE ARGUMENT IS MATCHED
7340: * P$ABA STACKS THE CURSOR,PMHBS AND A PTR TO P$ABB. IF
7341: * THE ARGUMENT CANT BE MATCHED , P$ABB REMOVES THIS SPECIAL
7342: * STACK ENTRY AND FAILS.
7343: * IF ARGUMENT IS MATCHED , P$ABC RESTORES THE OUTER PMHBS
7344: * VALUE (SAVED BY P$ABA) . THEN IF THE ARGUMENT HAS LEFT
7345: * ALTERNATIVES ON STACK IT STACKS THE INNER VALUE OF PMHBS
7346: * AND A PTR TO NDABD. IF ARGUMENT LEFT NOTHING ON THE STACK
7347: * IT OPTIMISES BY REMOVING ITEMS STACKED BY P$ABA. FINALLY
7348: * A CHECK IS MADE THAT ARGUMENT MATCHED MORE THAN THE NULL
7349: * STRING (CHECK IS INTENDED TO PREVENT USELESS LOOPING).
7350: * IF SO THE SUCCESSOR IS AGAIN THE ALTERNATIVE NODE AT THE
7351: * HEAD OF THE STRUCTURE , ENSURING A POSSIBLE EXTRA ATTEMPT
7352: * TO MATCH THE ARG IF NECESSARY. IF NOT , THE SUCCESSOR TO
7353: * ALTERNATIVE IS TAKEN SO AS TO TERMINATE THE LOOP. P$ABD
7354: * RESTORES INNER PMHBS PTR AND FAILS , THUS TRYING TO MATCH
7355: * ALTERNATIVES LEFT BY THE ARBNO ARGUMENT.
7356: EJC
7357: *
7358: * COMPOUND PATTERN STRUCTURES (CONTINUED)
7359: *
7360: * BREAKX
7361: * ------
7362: *
7363: * +---+ THIS NODE IS A BREAK NODE FOR
7364: * +----I B I THE ARGUMENT TO BREAKX, IDENTICAL
7365: * I +---+ TO AN ORDINARY BREAK NODE.
7366: * I I
7367: * I I
7368: * I +---+ THIS ALTERNATIVE NODE STACKS A
7369: * I I + I----- POINTER TO THE BREAKX NODE TO
7370: * I +---+ ALLOW FOR SUBSEQUENT FAILURE
7371: * I .
7372: * I .
7373: * I +---+ THIS IS THE BREAKX NODE ITSELF. IT
7374: * +----I X I MATCHES ONE CHARACTER AND THEN
7375: * +---+ PROCEEDS BACK TO THE BREAK NODE.
7376: *
7377: *
7378: *
7379: *
7380: * FENCE
7381: * -----
7382: *
7383: * +---+ THE FENCE NODE MATCHES NULL AND
7384: * I F I----- STACKS A POINTER TO NODE NDABO TO
7385: * +---+ ABORT ON A SUBSEQUENT REMATCH
7386: *
7387: *
7388: *
7389: *
7390: * SUCCEED
7391: * -------
7392: *
7393: * +---+ THE NODE FOR SUCCEED MATCHES NULL
7394: * I S I----- AND STACKS A POINTER TO ITSELF
7395: * +---+ TO REPEAT THE MATCH ON A FAILURE.
7396: EJC
7397: *
7398: * COMPOUND PATTERNS (CONTINUED)
7399: *
7400: * BINARY DOT (PATTERN ASSIGNMENT)
7401: * -------------------------------
7402: *
7403: * +---+ THIS NODE (P$PAA) SAVES THE CURRENT
7404: * I A I CURSOR AND A POINTER TO THE
7405: * +---+ SPECIAL NODE NDPAB ON THE STACK.
7406: * I
7407: * I
7408: * +---+ THIS IS THE STRUCTURE FOR THE
7409: * I X I PATTERN LEFT ARGUMENT OF THE
7410: * +---+ PATTERN ASSIGNMENT CALL.
7411: * I
7412: * I
7413: * +---+ THIS NODE (P$PAC) SAVES THE CURSOR,
7414: * I C I----- A PTR TO ITSELF, THE CURSOR (COPY)
7415: * +---+ AND A PTR TO NDPAD ON THE STACK.
7416: *
7417: *
7418: * THE FUNCTION OF THE MATCH ROUTINE FOR NDPAB (P$PAB)
7419: * IS SIMPLY TO UNSTACK ITSELF AND FAIL BACK ONTO THE STACK.
7420: *
7421: * THE MATCH ROUTINE FOR P$PAC ALSO SETS THE GLOBAL PATTERN
7422: * FLAG PMDFL NON-ZERO TO INDICATE THAT PATTERN ASSIGNMENTS
7423: * MAY HAVE OCCURED IN THE PATTERN MATCH
7424: *
7425: * IF PMDFL IS SET AT THE END OF THE MATCH (SEE P$NTH), THE
7426: * HISTORY STACK IS SCANNED FOR MATCHING NDPAB-NDPAD PAIRS
7427: * AND THE CORRESPONDING PATTERN ASSIGNMENTS ARE EXECUTED.
7428: *
7429: * THE FUNCTION OF THE MATCH ROUTINE FOR NDPAD (P$PAD)
7430: * IS SIMPLY TO REMOVE ITS ENTRY FROM THE STACK AND FAIL.
7431: * THIS INCLUDES REMOVING THE SPECIAL NODE POINTER STORED
7432: * IN ADDITION TO THE STANDARD TWO ENTRIES ON THE STACK.
7433: .IF .CNFN
7434: .ELSE
7435: EJC
7436: *
7437: * FENCE (FUNCTION)
7438: * ----------------
7439: *
7440: * +---+ THIS NODE (P$FNA) SAVES THE
7441: * I A I CURRENT HISTORY STACK AND A
7442: * +---+ POINTER TO NDFNB ON THE STACK.
7443: * I
7444: * I
7445: * +---+ THIS IS THE PATTERN STRUCTURE
7446: * I X I GIVEN AS THE ARGUMENT TO THE
7447: * +---+ FENCE FUNCTION.
7448: * I
7449: * I
7450: * +---+ THIS NODE P$FNC RESTORES THE OUTER
7451: * I C I HISTORY STACK PTR SAVED IN P$FNA,
7452: * +---+ AND STACKS THE INNER STACK BASE
7453: * PTR AND A POINTER TO NDFND ON THE
7454: * STACK.
7455: *
7456: * NDFNB (F$FNB) SIMPLY IS THE FAILURE EXIT FOR PATTERN
7457: * ARGUMENT FAILURE, AND IT POPS ITSELF AND FAILS ONTO THE
7458: * STACK.
7459: *
7460: * THE MATCH ROUTINE P$FNC ALLOWS FOR AN OPTIMIZATION WHEN
7461: * THE FENCE PATTERN LEAVES NO ALTERNATIVES. IN THIS CASE,
7462: * THE NDFNB ENTRY IS POPPED, AND THE MATCH CONTINUES.
7463: *
7464: * NDFND (P$FND) IS ENTERED WHEN THE PATTERN FAILS AFTER
7465: * GOING THROUGH A NON-OPTIMIZED P$FNC, AND IT POPS THE
7466: * STACK BACK PAST THE INNER STACK BASE CREATED BY P$FNA
7467: .FI
7468: EJC
7469: *
7470: * COMPOUND PATTERNS (CONTINUED)
7471: *
7472: * EXPRESSION PATTERNS (RECURSIVE PATTERN MATCHES)
7473: * -----------------------------------------------
7474: *
7475: * INITIAL ENTRY FOR A PATTERN NODE IS TO THE ROUTINE P$EXA.
7476: * IF THE EVALUATED RESULT OF THE EXPRESSION IS ITSELF A
7477: * PATTERN, THEN THE FOLLOWING STEPS ARE TAKEN TO ARRANGE
7478: * FOR PROPER RECURSIVE PROCESSING.
7479: *
7480: * 1) A POINTER TO THE CURRENT NODE (THE P$EXA NODE) IS
7481: * STORED ON THE HISTORY STACK WITH A DUMMY CURSOR.
7482: *
7483: * 2) A SPECIAL HISTORY STACK ENTRY IS MADE IN WHICH THE
7484: * NODE POINTER POINTS TO NDEXB, AND THE CURSOR VALUE
7485: * IS THE SAVED VALUE OF PMHBS ON ENTRY TO THIS NODE.
7486: * THE MATCH ROUTINE FOR NDEXB (P$EXB) RESTORES PMHBS
7487: * FROM THIS CURSOR ENTRY, POPS OFF THE P$EXA NODE
7488: * POINTER AND FAILS.
7489: *
7490: * 3) THE RESULTING HISTORY STACK POINTER IS SAVED IN
7491: * PMHBS TO ESTABLISH A NEW LEVEL OF HISTORY STACK.
7492: *
7493: * AFTER MATCHING A PATTERN, THE END OF MATCH ROUTINE GETS
7494: * CONTROL (P$NTH). THIS ROUTINE PROCEEDS AS FOLLOWS.
7495: *
7496: * 1) LOAD THE CURRENT VALUE OF PMHBS AND RECOGNIZE THE
7497: * OUTER LEVEL CASE BY THE FACT THAT THE ASSOCIATED
7498: * CURSOR IN THIS CASE IS THE PATTERN MATCH TYPE CODE
7499: * WHICH IS LESS THAN 3. TERMINATE THE MATCH IN THIS
7500: * CASE AND CONTINUE EXECUTION OF THE PROGRAM.
7501: *
7502: * 2) OTHERWISE MAKE A SPECIAL HISTORY STACK ENTRY IN
7503: * WHICH THE NODE POINTER POINTS TO THE SPECIAL NODE
7504: * NDEXC AND THE CURSOR IS THE CURRENT VALUE OF PMHBS.
7505: * THE MATCH ROUTINE FOR NDEXC (P$EXC) RESETS PMHBS TO
7506: * THIS (INNER) VALUE AND AND THEN FAILS.
7507: *
7508: * 3) USING THE HISTORY STACK ENTRY MADE ON STARTING THE
7509: * EXPRESSION (ACCESSIBLE WITH THE CURRENT VALUE OF
7510: * PMHBS), RESTORE THE P$EXA NODE POINTER AND THE OLD
7511: * PMHBS SETTING. TAKE THE SUCCESSOR AND CONTINUE.
7512: *
7513: * AN OPTIMIZATION IS POSSIBLE IF THE EXPRESSION PATTERN
7514: * MAKES NO ENTRIES ON THE HISTORY STACK. IN THIS CASE,
7515: * INSTEAD OF BUILDING THE P$EXC NODE IN STEP 2, IT IS MORE
7516: * EFFICIENT TO SIMPLY POP OFF THE P$EXB ENTRY AND ITS
7517: * ASSOCIATED NODE POINTER. THE EFFECT IS THE SAME.
7518: EJC
7519: *
7520: * COMPOUND PATTERNS (CONTINUED)
7521: *
7522: * BINARY DOLLAR (IMMEDIATE ASSIGNMENT)
7523: * ------------------------------------
7524: *
7525: * +---+ THIS NODE (P$IMA) STACKS THE CURSOR
7526: * I A I PMHBS AND A PTR TO NDIMB AND RESETS
7527: * +---+ THE STACK PTR PMHBS.
7528: * I
7529: * I
7530: * +---+ THIS IS THE LEFT STRUCTURE FOR THE
7531: * I X I PATTERN LEFT ARGUMENT OF THE
7532: * +---+ IMMEDIATE ASSIGNMENT CALL.
7533: * I
7534: * I
7535: * +---+ THIS NODE (P$IMC) PERFORMS THE
7536: * I C I----- ASSIGNMENT, POPS PMHBS AND STACKS
7537: * +---+ THE OLD PMHBS AND A PTR TO NDIMD.
7538: *
7539: *
7540: * THE STRUCTURE AND EXECUTION OF THIS PATTERN ARE SIMILAR
7541: * TO THOSE OF THE RECURSIVE EXPRESSION PATTERN MATCHING.
7542: *
7543: * THE MATCH ROUTINE FOR NDIMB (P$IMB) RESTORES THE OUTER
7544: * LEVEL VALUE OF PMHBS, UNSTACKS THE SAVED CURSOR AND FAILS
7545: *
7546: * THE MATCH ROUTINE P$IMC USES THE CURRENT VALUE OF PMHBS
7547: * TO LOCATE THE P$IMB ENTRY. THIS ENTRY IS USED TO MAKE
7548: * THE ASSIGNMENT AND RESTORE THE OUTER LEVEL VALUE OF
7549: * PMHBS. FINALLY, THE INNER LEVEL VALUE OF PMHBS AND A
7550: * POINTER TO THE SPECIAL NODE NDIMD ARE STACKED.
7551: *
7552: * THE MATCH ROUTINE FOR NDIMD (P$IMD) RESTORES THE INNER
7553: * LEVEL VALUE OF PMHBS AND FAILS BACK INTO THE STACK.
7554: *
7555: * AN OPTIMIZATION OCCURS IF THE INNER PATTERN MAKES NO
7556: * ENTRIES ON THE HISTORY STACK. IN THIS CASE, P$IMC POPS
7557: * THE P$IMB ENTRY INSTEAD OF MAKING A P$IMD ENTRY.
7558: EJC
7559: *
7560: * ARBNO
7561: *
7562: * SEE COMPOUND PATTERNS SECTION FOR STUCTURE AND
7563: * ALGORITHM FOR MATCHING THIS NODE TYPE.
7564: *
7565: * NO PARAMETERS
7566: *
7567: P$ABA ENT BL$P0 P0BLK
7568: MOV WB,-(XS) STACK CURSOR
7569: MOV XR,-(XS) STACK DUMMY NODE PTR
7570: MOV PMHBS,-(XS) STACK OLD STACK BASE PTR
7571: MOV =NDABB,-(XS) STACK PTR TO NODE NDABB
7572: MOV XS,PMHBS STORE NEW STACK BASE PTR
7573: BRN SUCCP SUCCEED
7574: *
7575: * ARBNO (REMOVE P$ABA SPECIAL STACK ENTRY)
7576: *
7577: * NO PARAMETERS (DUMMY PATTERN)
7578: *
7579: P$ABB ENT ENTRY POINT
7580: MOV WB,PMHBS RESTORE HISTORY STACK BASE PTR
7581: BRN FLPOP FAIL AND POP DUMMY NODE PTR
7582: *
7583: * ARBNO (CHECK IF ARG MATCHED NULL STRING)
7584: *
7585: * NO PARAMETERS (DUMMY PATTERN)
7586: *
7587: P$ABC ENT BL$P0 P0BLK
7588: MOV PMHBS,XT KEEP P$ABB STACK BASE
7589: MOV 3(XT),WA LOAD INITIAL CURSOR
7590: MOV 1(XT),PMHBS RESTORE OUTER STACK BASE PTR
7591: BEQ XT,XS,PABC1 JUMP IF NO HISTORY STACK ENTRIES
7592: MOV XT,-(XS) ELSE SAVE INNER PMHBS ENTRY
7593: MOV =NDABD,-(XS) STACK PTR TO SPECIAL NODE NDABD
7594: BRN PABC2 MERGE
7595: *
7596: * OPTIMISE CASE OF NO EXTRA ENTRIES ON STACK FROM ARBNO ARG
7597: *
7598: PABC1 ADD *NUM04,XS REMOVE NDABB ENTRY AND CURSOR
7599: *
7600: * MERGE TO CHECK FOR MATCHING OF NULL STRING
7601: *
7602: PABC2 BNE WA,WB,SUCCP ALLOW FURTHER ATTEMPT IF NON-NULL
7603: MOV PTHEN(XR),XR BYPASS ALTERNATIVE NODE SO AS TO ..
7604: BRN SUCCP ... REFUSE FURTHER MATCH ATTEMPTS
7605: *
7606: * ARBNO (TRY FOR ALTERNATIVES IN ARBNO ARGUMENT)
7607: *
7608: * NO PARAMETERS (DUMMY PATTERN)
7609: *
7610: P$ABD ENT ENTRY POINT
7611: MOV WB,PMHBS RESTORE INNER STACK BASE PTR
7612: BRN FAILP AND FAIL
7613: EJC
7614: *
7615: * ABORT
7616: *
7617: * NO PARAMETERS
7618: *
7619: P$ABO ENT BL$P0 P0BLK
7620: BRN EXFAL SIGNAL STATEMENT FAILURE
7621: *
7622: * ALTERNATION
7623: *
7624: * PARM1 ALTERNATIVE NODE
7625: *
7626: P$ALT ENT BL$P1 P1BLK
7627: MOV WB,-(XS) STACK CURSOR
7628: MOV PARM1(XR),-(XS) STACK POINTER TO ALTERNATIVE
7629: CHK CHECK FOR STACK OVERFLOW
7630: BRN SUCCP IF ALL OK, THEN SUCCEED
7631: EJC
7632: *
7633: * ANY (ONE CHARACTER ARGUMENT) (1-CHAR STRING ALSO)
7634: *
7635: * PARM1 CHARACTER ARGUMENT
7636: *
7637: P$ANS ENT BL$P1 P1BLK
7638: BEQ WB,PMSSL,FAILP FAIL IF NO CHARS LEFT
7639: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING
7640: PLC XL,WB POINT TO CURRENT CHARACTER
7641: LCH WA,(XL) LOAD CURRENT CHARACTER
7642: BNE WA,PARM1(XR),FAILP FAIL IF NO MATCH
7643: ICV WB ELSE BUMP CURSOR
7644: BRN SUCCP AND SUCCEED
7645: *
7646: * ANY (MULTI-CHARACTER ARGUMENT CASE)
7647: * EXPRESSION ARGUMENT CASE MERGES
7648: *
7649: * PARM1 POINTER TO CTBLK
7650: * PARM2 BIT MASK TO SELECT BIT IN CTBLK
7651: *
7652: P$ANY ENT BL$P2 P2BLK
7653: BEQ WB,PMSSL,FAILP FAIL IF NO CHARACTERS LEFT
7654: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING
7655: PLC XL,WB GET CHAR PTR TO CURRENT CHARACTER
7656: LCH WA,(XL) LOAD CURRENT CHARACTER
7657: MOV PARM1(XR),XL POINT TO CTBLK
7658: WTB WA CHANGE TO BAU OFFSET
7659: ADD WA,XL POINT TO ENTRY IN CTBLK
7660: MOV CTCHS(XL),WA LOAD WORD FROM CTBLK
7661: ANB PARM2(XR),WA AND WITH SELECTED BIT
7662: ZRB WA,FAILP FAIL IF NO MATCH
7663: ICV WB ELSE BUMP CURSOR
7664: BRN SUCCP AND SUCCEED
7665: *
7666: * ANY (EXPRESSION ARGUMENT)
7667: *
7668: * PARM1 EXPRESSION POINTER
7669: *
7670: P$AYD ENT BL$P1 P1BLK
7671: MOV =P$ANY,WA PCODE FOR NEW NODE
7672: JSR EVALS EVALUATE STRING ARGUMENT
7673: ERR 050,ANY EVALUATED ARGUMENT IS NOT STRING
7674: PPM FAILP FAIL IF EVALUATION FAILURE
7675: BRI XL MERGE MULTI-CHAR CASE IF OK
7676: EJC
7677: *
7678: * P$ARB INITIAL ARB MATCH
7679: *
7680: * NO PARAMETERS
7681: *
7682: * THE P$ARB NODE IS PART OF A COMPOUND PATTERN STRUCTURE
7683: * FOR AN ARB PATTERN (SEE DESCRIPTION OF COMPOUND PATTERNS)
7684: *
7685: P$ARB ENT BL$P0 P0BLK
7686: MOV PTHEN(XR),XR LOAD SUCCESSOR POINTER
7687: MOV WB,-(XS) STACK DUMMY CURSOR
7688: MOV XR,-(XS) STACK SUCCESSOR POINTER
7689: MOV WB,-(XS) STACK CURSOR
7690: MOV =NDARC,-(XS) STACK PTR TO SPECIAL NODE NDARC
7691: BRI (XR) EXECUTE NEXT NODE MATCHING NULL
7692: *
7693: * P$ARC EXTEND ARB MATCH
7694: *
7695: * NO PARAMETERS (DUMMY PATTERN)
7696: *
7697: P$ARC ENT ENTRY POINT
7698: BEQ WB,PMSSL,FLPOP FAIL AND POP STACK TO SUCCESSOR
7699: ICV WB ELSE BUMP CURSOR
7700: MOV WB,-(XS) STACK UPDATED CURSOR
7701: MOV XR,-(XS) RESTACK POINTER TO NDARC NODE
7702: MOV 2(XS),XR LOAD SUCCESSOR POINTER
7703: BRI (XR) OFF TO REEXECUTE SUCCESSOR NODE
7704: EJC
7705: *
7706: * BAL
7707: *
7708: * NO PARAMETERS
7709: *
7710: * THE P$BAL NODE IS PART OF THE COMPOUND STRUCTURE BUILT
7711: * FOR BAL (SEE SECTION ON COMPOUND PATTERNS).
7712: *
7713: P$BAL ENT BL$P0 P0BLK
7714: ZER WC ZERO PARENTHESES LEVEL COUNTER
7715: MOV R$PMS,XL POINT TO SUBJECT STRING
7716: PLC XL,WB POINT TO CURRENT CHARACTER
7717: BRN PBAL2 JUMP INTO SCAN LOOP
7718: *
7719: * LOOP TO SCAN OUT CHARACTERS
7720: *
7721: PBAL1 LCH WA,(XL)+ LOAD NEXT CHARACTER, BUMP POINTER
7722: ICV WB PUSH CURSOR FOR CHARACTER
7723: BEQ WA,=CH$PP,PBAL3 JUMP IF LEFT PAREN
7724: BEQ WA,=CH$RP,PBAL4 JUMP IF RIGHT PAREN
7725: BZE WC,PBAL5 ELSE SUCCEED IF AT OUTER LEVEL
7726: *
7727: * HERE AFTER PROCESSING ONE CHARACTER
7728: *
7729: PBAL2 BNE WB,PMSSL,PBAL1 LOOP BACK UNLESS END OF STRING
7730: BRN FAILP IN WHICH CASE, FAIL
7731: *
7732: * HERE ON LEFT PAREN
7733: *
7734: PBAL3 ICV WC BUMP PAREN LEVEL
7735: BRN PBAL2 LOOP BACK TO CHECK END OF STRING
7736: *
7737: * HERE FOR RIGHT PAREN
7738: *
7739: PBAL4 BZE WC,FAILP FAIL IF NO MATCHING LEFT PAREN
7740: DCV WC ELSE DECREMENT LEVEL COUNTER
7741: BNZ WC,PBAL2 LOOP BACK IF NOT AT OUTER LEVEL
7742: *
7743: * HERE AFTER SUCCESSFULLY SCANNING A BALANCED STRING
7744: *
7745: PBAL5 MOV WB,-(XS) STACK CURSOR
7746: MOV XR,-(XS) STACK PTR TO BAL NODE FOR EXTEND
7747: BRN SUCCP AND SUCCEED
7748: EJC
7749: *
7750: * BREAK (EXPRESSION ARGUMENT)
7751: *
7752: * PARM1 EXPRESSION POINTER
7753: *
7754: P$BKD ENT BL$P1 P1BLK
7755: MOV =P$BRK,WA PCODE FOR NEW NODE
7756: JSR EVALS EVALUATE STRING EXPRESSION
7757: ERR 051,BREAK EVALUATED ARGUMENT IS NOT STRING
7758: PPM FAILP FAIL IF EVALUATION FAILS
7759: BRI XL MERGE WITH MULTI-CHAR CASE IF OK
7760: *
7761: * BREAK (ONE CHARACTER ARGUMENT)
7762: *
7763: * PARM1 CHARACTER ARGUMENT
7764: *
7765: P$BKS ENT BL$P1 P1BLK
7766: MOV PMSSL,WC GET SUBJECT STRING LENGTH
7767: SUB WB,WC GET NUMBER OF CHARACTERS LEFT
7768: BZE WC,FAILP FAIL IF NO CHARACTERS LEFT
7769: LCT WC,WC SET COUNTER FOR CHARS LEFT
7770: MOV R$PMS,XL POINT TO SUBJECT STRING
7771: PLC XL,WB POINT TO CURRENT CHARACTER
7772: *
7773: * LOOP TO SCAN TILL BREAK CHARACTER FOUND
7774: *
7775: PBKS1 LCH WA,(XL)+ LOAD NEXT CHAR, BUMP POINTER
7776: BEQ WA,PARM1(XR),SUCCP SUCCEED IF BREAK CHARACTER FOUND
7777: ICV WB ELSE PUSH CURSOR
7778: BCT WC,PBKS1 LOOP BACK IF MORE TO GO
7779: BRN FAILP FAIL IF END OF STRING, NO BREAK CHR
7780: EJC
7781: *
7782: * BREAK (MULTI-CHARACTER ARGUMENT)
7783: * EXPRESSION ARGUMENT CASE MERGES
7784: *
7785: * PARM1 POINTER TO CTBLK
7786: * PARM2 BIT MASK TO SELECT BIT COLUMN
7787: *
7788: P$BRK ENT BL$P2 P2BLK
7789: MOV PMSSL,WC LOAD SUBJECT STRING LENGTH
7790: SUB WB,WC GET NUMBER OF CHARACTERS LEFT
7791: BZE WC,FAILP FAIL IF NO CHARACTERS LEFT
7792: LCT WC,WC SET COUNTER FOR CHARACTERS LEFT
7793: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING
7794: PLC XL,WB POINT TO CURRENT CHARACTER
7795: MOV XR,PSAVE SAVE NODE POINTER
7796: *
7797: * LOOP TO SEARCH FOR BREAK CHARACTER
7798: *
7799: PBRK2 LCH WA,(XL)+ LOAD NEXT CHAR, BUMP POINTER
7800: MOV PARM1(XR),XR LOAD POINTER TO CTBLK
7801: WTB WA CONVERT TO BAU OFFSET
7802: ADD WA,XR POINT TO CTBLK ENTRY
7803: MOV CTCHS(XR),WA LOAD CTBLK WORD
7804: MOV PSAVE,XR RESTORE NODE POINTER
7805: ANB PARM2(XR),WA AND WITH SELECTED BIT
7806: NZB WA,SUCCP SUCCEED IF BREAK CHARACTER FOUND
7807: ICV WB ELSE PUSH CURSOR
7808: BCT WC,PBRK2 LOOP BACK UNLESS END OF STRING
7809: BRN FAILP FAIL IF END OF STRING, NO BREAK CHR
7810: EJC
7811: *
7812: * BREAKX (EXTENSION)
7813: *
7814: * THIS IS THE ENTRY WHICH CAUSES AN EXTENSION OF A BREAKX
7815: * MATCH WHEN FAILURE OCCURS. SEE SECTION ON COMPOUND
7816: * PATTERNS FOR FULL DETAILS OF BREAKX MATCHING.
7817: *
7818: * NO PARAMETERS
7819: *
7820: P$BKX ENT BL$P0 P0BLK
7821: ICV WB STEP CURSOR PAST PREVIOUS BREAK CHR
7822: BRN SUCCP SUCCEED TO REMATCH BREAK
7823: *
7824: * BREAKX (EXPRESSION ARGUMENT)
7825: *
7826: * SEE SECTION ON COMPOUND PATTERNS FOR FULL STRUCTURE OF
7827: * BREAKX PATTERN. THE ACTUAL CHARACTER MATCHING USES A
7828: * BREAK NODE. HOWEVER, THE ENTRY FOR THE EXPRESSION
7829: * ARGUMENT CASE IS SEPARATED TO GET PROPER ERROR MESSAGES.
7830: *
7831: * PARM1 EXPRESSION POINTER
7832: *
7833: P$BXD ENT BL$P1 P1BLK
7834: MOV =P$BRK,WA PCODE FOR NEW NODE
7835: JSR EVALS EVALUATE STRING ARGUMENT
7836: ERR 052,BREAKX EVALUATED ARGUMENT IS NOT STRING
7837: PPM FAILP FAIL IF EVALUATION FAILS
7838: BRI XL MERGE WITH BREAK IF ALL OK
7839: *
7840: * CURSOR ASSIGNMENT
7841: *
7842: * PARM1 NAME BASE
7843: * PARM2 NAME OFFSET
7844: *
7845: P$CAS ENT BL$P2 P2BLK
7846: MOV XR,-(XS) SAVE NODE POINTER
7847: MOV WB,-(XS) SAVE CURSOR
7848: MOV PARM1(XR),XL LOAD NAME BASE
7849: MTI WB LOAD CURSOR AS INTEGER
7850: MOV PARM2(XR),WB LOAD NAME OFFSET
7851: JSR ICBLD GET ICBLK FOR CURSOR VALUE
7852: MOV WB,WA MOVE NAME OFFSET
7853: MOV XR,WB MOVE VALUE TO ASSIGN
7854: JSR ASINP PERFORM ASSIGNMENT
7855: PPM FLPOP FAIL ON ASSIGNMENT FAILURE
7856: MOV (XS)+,WB ELSE RESTORE CURSOR
7857: MOV (XS)+,XR RESTORE NODE POINTER
7858: BRN SUCCP AND SUCCEED MATCHING NULL
7859: EJC
7860: *
7861: * EXPRESSION NODE (P$EXA, INITIAL ENTRY)
7862: *
7863: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
7864: * ALGORITHMS FOR HANDLING EXPRESSION NODES.
7865: *
7866: * PARM1 EXPRESSION POINTER
7867: *
7868: P$EXA ENT BL$P1 P1BLK
7869: JSR EVALP EVALUATE EXPRESSION
7870: PPM FAILP FAIL IF EVALUATION FAILS
7871: BLO WA,=P$AAA,PEXA1 JUMP IF RESULT IS NOT A PATTERN
7872: *
7873: * HERE IF RESULT OF EXPRESSION IS A PATTERN
7874: *
7875: MOV WB,-(XS) STACK DUMMY CURSOR
7876: MOV XR,-(XS) STACK PTR TO P$EXA NODE
7877: MOV PMHBS,-(XS) STACK HISTORY STACK BASE PTR
7878: MOV =NDEXB,-(XS) STACK PTR TO SPECIAL NODE NDEXB
7879: MOV XS,PMHBS STORE NEW STACK BASE POINTER
7880: MOV XL,XR COPY NODE POINTER
7881: BRI (XR) MATCH FIRST NODE IN EXPRESSION PAT
7882: *
7883: * HERE IF RESULT OF EXPRESSION IS NOT A PATTERN
7884: *
7885: PEXA1 BEQ WA,=B$SCL,PEXA2 JUMP IF IT IS ALREADY A STRING
7886: MOV XL,-(XS) ELSE STACK RESULT
7887: MOV XR,XL SAVE NODE POINTER
7888: JSR GTSTG CONVERT RESULT TO STRING
7889: ERR 053,EXPRESSION DOES NOT EVALUATE TO PATTERN
7890: MOV XR,WC COPY STRING POINTER
7891: MOV XL,XR RESTORE NODE POINTER
7892: MOV WC,XL COPY STRING POINTER AGAIN
7893: *
7894: * MERGE HERE WITH STRING POINTER IN XL
7895: *
7896: PEXA2 BZE SCLEN(XL),SUCCP JUST SUCCEED IF NULL STRING
7897: MOV XR,PSAVE SAVE NODE PTR
7898: MOV R$PMS,XR LOAD SUBJECT STRING PTR
7899: PLC XR,WB POINT TO CURRENT CHAR
7900: ADD SCLEN(XL),WB COMPUTE NEW CURSOR POSITION
7901: BGT WB,PMSSL,FAILP FAIL IF PAST END OF STRING
7902: MOV WB,PSAVC SAVE UPDATED CURSOR
7903: MOV SCLEN(XL),WA NUMBER OF CHARS TO COMPARE
7904: PLC XL POINT TO TEST STRING CHARS
7905: CMC FAILP,FAILP COMPARE, FAIL IF UNEQUAL
7906: MOV PSAVE,XR IF ALL MATCHED, RESTORE NODE PTR
7907: MOV PSAVC,WB RESTORE UPDATED CURSOR
7908: BRN SUCCP AND SUCCEED
7909: EJC
7910: *
7911: * EXPRESSION NODE (P$EXB, REMOVE NDEXB ENTRY)
7912: *
7913: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
7914: * ALGORITHMS FOR HANDLING EXPRESSION NODES.
7915: *
7916: * NO PARAMETERS (DUMMY PATTERN)
7917: *
7918: P$EXB ENT ENTRY POINT
7919: MOV WB,PMHBS RESTORE OUTER LEVEL STACK POINTER
7920: BRN FLPOP FAIL AND POP P$EXA NODE PTR
7921: EJC
7922: *
7923: * EXPRESSION NODE (P$EXC, REMOVE NDEXC ENTRY)
7924: *
7925: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
7926: * ALGORITHMS FOR HANDLING EXPRESSION NODES.
7927: *
7928: * NO PARAMETERS (DUMMY PATTERN)
7929: *
7930: P$EXC ENT ENTRY POINT
7931: MOV WB,PMHBS RESTORE INNER STACK BASE POINTER
7932: BRN FAILP AND FAIL INTO EXPR PATTERN ALTERNVS
7933: *
7934: * FAIL
7935: *
7936: * NO PARAMETERS
7937: *
7938: P$FAL ENT BL$P0 P0BLK
7939: BRN FAILP JUST SIGNAL FAILURE
7940: EJC
7941: * FENCE
7942: *
7943: * SEE COMPOUND PATTERNS SECTION FOR THE STRUCTURE AND
7944: * ALGORITHM FOR MATCHING THIS NODE TYPE.
7945: *
7946: * NO PARAMETERS
7947: *
7948: P$FEN ENT BL$P0 P0BLK
7949: MOV WB,-(XS) STACK DUMMY CURSOR
7950: MOV =NDABO,-(XS) STACK PTR TO ABORT NODE
7951: BRN SUCCP AND SUCCEED MATCHING NULL
7952: .IF .CNFN
7953: .ELSE
7954: *
7955: * FENCE (FUNCTION)
7956: *
7957: * SEE COMPOUND PATTERNS COMMENTS AT START OF THIS SECTION
7958: * FOR DETAILS OF SCHEME
7959: *
7960: * NO PARAMETERS
7961: *
7962: P$FNA ENT BL$P0 P0BLK
7963: MOV PMHBS,-(XS) STACK CURRENT HISTORY STACK BASE
7964: MOV =NDFNB,-(XS) STACK INDIR PTR TO P$FNB (FAILURE)
7965: MOV XS,PMHBS BEGIN NEW HISTORY STACK
7966: BRN SUCCP SUCCEED
7967: *
7968: * FENCE (FUNCTION) (RESET HISTORY STACK AND FAIL)
7969: *
7970: * NO PARAMETERS (DUMMY PATTERN)
7971: *
7972: P$FNB ENT BL$P0 P0BLK
7973: MOV WB,PMHBS RESTORE OUTER PMHBS STACK BASE
7974: BRN FAILP ...AND FAIL
7975: *
7976: * FENCE (FUNCTION) (MAKE FENCE TRAP ENTRY ON STACK)
7977: *
7978: * NO PARAMETERS (DUMMY PATTERN)
7979: *
7980: P$FNC ENT BL$P0 P0BLK
7981: MOV PMHBS,XT GET INNER STACK BASE PTR
7982: MOV NUM01(XT),PMHBS RESTORE OUTER STACK BASE
7983: BEQ XT,XS,PFNC1 OPTIMIZE IF NO ALTERNATIVES
7984: MOV XT,-(XS) ELSE STACK INNER STACK BASE
7985: MOV =NDFND,-(XS) STACK PTR TO NDFND
7986: BRN SUCCP SUCCEED
7987: *
7988: * HERE WHEN FENCE FUNCTION LEFT NOTHING ON THE STACK
7989: *
7990: PFNC1 ADD *NUM02,XS POP OFF P$FNB ENTRY
7991: BRN SUCCP SUCCEED
7992: *
7993: * FENCE (FUNCTION) (SKIP PAST ALTERNATIVES ON FAILURE)
7994: *
7995: * NO PARAMETERS (DUMMY PATTERN)
7996: *
7997: P$FND ENT BL$P0 P0BLK
7998: MOV WB,XS POP STACK TO FENCE() HISTORY BASE
7999: BRN FLPOP POP BASE ENTRY AND FAIL
8000: .FI
8001: EJC
8002: *
8003: * IMMEDIATE ASSIGNMENT (INITIAL ENTRY, SAVE CURRENT CURSOR)
8004: *
8005: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
8006: * STRUCTURE AND ALGORITHM FOR MATCHING THIS NODE TYPE.
8007: *
8008: * NO PARAMETERS
8009: *
8010: P$IMA ENT BL$P0 P0BLK
8011: MOV WB,-(XS) STACK CURSOR
8012: MOV XR,-(XS) STACK DUMMY NODE POINTER
8013: MOV PMHBS,-(XS) STACK OLD STACK BASE POINTER
8014: MOV =NDIMB,-(XS) STACK PTR TO SPECIAL NODE NDIMB
8015: MOV XS,PMHBS STORE NEW STACK BASE POINTER
8016: BRN SUCCP AND SUCCEED
8017: *
8018: * IMMEDIATE ASSIGNMENT (REMOVE CURSOR MARK ENTRY)
8019: *
8020: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
8021: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
8022: *
8023: * NO PARAMETERS (DUMMY PATTERN)
8024: *
8025: P$IMB ENT ENTRY POINT
8026: MOV WB,PMHBS RESTORE HISTORY STACK BASE PTR
8027: BRN FLPOP FAIL AND POP DUMMY NODE PTR
8028: EJC
8029: *
8030: * IMMEDIATE ASSIGNMENT (PERFORM ACTUAL ASSIGNMENT)
8031: *
8032: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
8033: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
8034: *
8035: * PARM1 NAME BASE OF VARIABLE
8036: * PARM2 NAME OFFSET OF VARIABLE
8037: *
8038: P$IMC ENT BL$P2 P2BLK
8039: MOV PMHBS,XT LOAD POINTER TO P$IMB ENTRY
8040: MOV WB,WA COPY FINAL CURSOR
8041: MOV 3(XT),WB LOAD INITIAL CURSOR
8042: MOV 1(XT),PMHBS RESTORE OUTER STACK BASE POINTER
8043: BEQ XT,XS,PIMC1 JUMP IF NO HISTORY STACK ENTRIES
8044: MOV XT,-(XS) ELSE SAVE INNER PMHBS POINTER
8045: MOV =NDIMD,-(XS) AND A PTR TO SPECIAL NODE NDIMD
8046: BRN PIMC2 MERGE
8047: *
8048: * HERE IF NO ENTRIES MADE ON HISTORY STACK
8049: *
8050: PIMC1 ADD *NUM04,XS REMOVE NDIMB ENTRY AND CURSOR
8051: *
8052: * MERGE HERE TO PERFORM ASSIGNMENT
8053: *
8054: PIMC2 MOV WA,-(XS) SAVE CURRENT (FINAL) CURSOR
8055: MOV XR,-(XS) SAVE CURRENT NODE POINTER
8056: MOV R$PMS,XL POINT TO SUBJECT STRING
8057: SUB WB,WA COMPUTE SUBSTRING LENGTH
8058: JSR SBSTR BUILD SUBSTRING
8059: MOV XR,WB MOVE RESULT
8060: MOV (XS),XR RELOAD NODE POINTER
8061: MOV PARM1(XR),XL LOAD NAME BASE
8062: MOV PARM2(XR),WA LOAD NAME OFFSET
8063: JSR ASINP PERFORM ASSIGNMENT
8064: PPM FLPOP FAIL IF ASSIGNMENT FAILS
8065: MOV (XS)+,XR ELSE RESTORE NODE POINTER
8066: MOV (XS)+,WB RESTORE CURSOR
8067: BRN SUCCP AND SUCCEED
8068: *
8069: * IMMEDIATE ASSIGNMENT (REMOVE NDIMD ENTRY ON FAILURE)
8070: *
8071: * SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
8072: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
8073: *
8074: * NO PARAMETERS (DUMMY PATTERN)
8075: *
8076: P$IMD ENT ENTRY POINT
8077: MOV WB,PMHBS RESTORE INNER STACK BASE POINTER
8078: BRN FAILP AND FAIL
8079: EJC
8080: *
8081: * LEN (INTEGER ARGUMENT)
8082: *
8083: * PARM1 INTEGER ARGUMENT
8084: *
8085: P$LEN ENT BL$P1 P1BLK
8086: ADD PARM1(XR),WB PUSH CURSOR INDICATED AMOUNT
8087: BLE WB,PMSSL,SUCCP SUCCEED IF NOT OFF END
8088: BRN FAILP ELSE FAIL
8089: *
8090: * LEN (EXPRESSION ARGUMENT)
8091: *
8092: * PARM1 EXPRESSION POINTER
8093: *
8094: P$LND ENT BL$P1 P1BLK
8095: JSR EVALI EVALUATE INTEGER ARGUMENT
8096: ERR 054,LEN EVALUATED ARGUMENT IS NOT INTEGER
8097: ERR 055,LEN EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
8098: PPM FAILP FAIL IF EVALUATION FAILS
8099: ADD PARM1(XR),WB PUSH CURSOR INDICATED AMOUNT
8100: BLE WB,PMSSL,SUCCP SUCCEED IF NOT OFF END
8101: BRN FAILP ELSE FAIL
8102: EJC
8103: *
8104: * NOTANY (EXPRESSION ARGUMENT)
8105: *
8106: * PARM1 EXPRESSION POINTER
8107: *
8108: P$NAD ENT BL$P1 P1BLK
8109: MOV =P$NAY,WA PCODE FOR NEW NODE
8110: JSR EVALS EVALUATE STRING ARGUMENT
8111: ERR 056,NOTANY EVALUATED ARGUMENT IS NOT STRING
8112: PPM FAILP FAIL IF EVALUATION FAILS
8113: BRI XL MERGE WITH MULTI-CHAR CASE IF OK
8114: EJC
8115: *
8116: * NOTANY (ONE CHARACTER ARGUMENT)
8117: *
8118: * PARM1 CHARACTER ARGUMENT
8119: *
8120: P$NAS ENT BL$P1 ENTRY POINT
8121: BEQ WB,PMSSL,FAILP FAIL IF NO CHARS LEFT
8122: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING
8123: PLC XL,WB POINT TO CURRENT CHARACTER IN STRIN
8124: LCH WA,(XL) LOAD CURRENT CHARACTER
8125: BEQ WA,PARM1(XR),FAILP FAIL IF MATCH
8126: ICV WB ELSE BUMP CURSOR
8127: BRN SUCCP AND SUCCEED
8128: EJC
8129: *
8130: * NOTANY (MULTI-CHARACTER STRING ARGUMENT)
8131: * EXPRESSION ARGUMENT CASE MERGES
8132: *
8133: * PARM1 POINTER TO CTBLK
8134: * PARM2 BIT MASK TO SELECT BIT COLUMN
8135: *
8136: P$NAY ENT BL$P2 P2BLK
8137: BEQ WB,PMSSL,FAILP FAIL IF NO CHARACTERS LEFT
8138: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING
8139: PLC XL,WB POINT TO CURRENT CHARACTER
8140: LCH WA,(XL) LOAD CURRENT CHARACTER
8141: WTB WA CONVERT TO BAU OFFSET
8142: MOV PARM1(XR),XL LOAD POINTER TO CTBLK
8143: ADD WA,XL POINT TO ENTRY IN CTBLK
8144: MOV CTCHS(XL),WA LOAD ENTRY FROM CTBLK
8145: ANB PARM2(XR),WA AND WITH SELECTED BIT
8146: NZB WA,FAILP FAIL IF CHARACTER IS MATCHED
8147: ICV WB ELSE BUMP CURSOR
8148: BRN SUCCP AND SUCCEED
8149: EJC
8150: *
8151: * END OF PATTERN MATCH
8152: *
8153: * THIS ROUTINE IS ENTERED ON SUCCESSFUL COMPLETION.
8154: * SEE DESCRIPTION OF EXPRESSION PATTERNS IN COMPOUND
8155: * PATTERN SECTION FOR HANDLING OF RECURSION IN MATCHING.
8156: *
8157: * NO PARAMETERS (DUMMY PATTERN)
8158: *
8159: P$NTH ENT ENTRY POINT
8160: MOV PMHBS,XT LOAD POINTER TO BASE OF STACK
8161: MOV 1(XT),WA LOAD SAVED PMHBS (OR PATTERN TYPE)
8162: BLE WA,=NUM02,PNTH2 JUMP IF OUTER LEVEL (PATTERN TYPE)
8163: *
8164: * HERE WE ARE AT THE END OF MATCHING AN EXPRESSION PATTERN
8165: *
8166: MOV WA,PMHBS RESTORE OUTER STACK BASE POINTER
8167: MOV 2(XT),XR RESTORE POINTER TO P$EXA NODE
8168: BEQ XT,XS,PNTH1 JUMP IF NO HISTORY STACK ENTRIES
8169: MOV XT,-(XS) ELSE STACK INNER STACK BASE PTR
8170: MOV =NDEXC,-(XS) STACK PTR TO SPECIAL NODE NDEXC
8171: BRN SUCCP AND SUCCEED
8172: *
8173: * HERE IF NO HISTORY STACK ENTRIES DURING PATTERN
8174: *
8175: PNTH1 ADD *NUM04,XS REMOVE P$EXB ENTRY AND NODE PTR
8176: BRN SUCCP AND SUCCEED
8177: *
8178: * HERE IF END OF MATCH AT OUTER LEVEL
8179: *
8180: PNTH2 MOV WB,PMSSL SAVE FINAL CURSOR IN SAFE PLACE
8181: BZE PMDFL,PNTH6 JUMP IF NO PATTERN ASSIGNMENTS
8182: EJC
8183: *
8184: * END OF PATTERN MATCH (CONTINUED)
8185: *
8186: * NOW WE MUST PERFORM PATTERN ASSIGNMENTS. THIS IS DONE BY
8187: * SCANNING THE HISTORY STACK FOR MATCHING NDPAB-NDPAD PAIRS
8188: *
8189: PNTH3 DCA XT POINT PAST CURSOR ENTRY
8190: MOV -(XT),WA LOAD NODE POINTER
8191: BEQ WA,=NDPAD,PNTH4 JUMP IF NDPAD ENTRY
8192: BNE WA,=NDPAB,PNTH5 JUMP IF NOT NDPAB ENTRY
8193: *
8194: * HERE FOR NDPAB ENTRY, STACK INITIAL CURSOR
8195: * NOTE THAT THERE MUST BE MORE ENTRIES ON THE STACK.
8196: *
8197: MOV 1(XT),-(XS) STACK INITIAL CURSOR
8198: CHK CHECK FOR STACK OVERFLOW
8199: BRN PNTH3 LOOP BACK IF OK
8200: *
8201: * HERE FOR NDPAD ENTRY. THE STARTING CURSOR FROM THE
8202: * MATCHING NDPAD ENTRY IS NOW THE TOP STACK ENTRY.
8203: *
8204: PNTH4 MOV 1(XT),WA LOAD FINAL CURSOR
8205: MOV (XS),WB LOAD INITIAL CURSOR FROM STACK
8206: MOV XT,(XS) SAVE HISTORY STACK SCAN PTR
8207: SUB WB,WA COMPUTE LENGTH OF STRING
8208: *
8209: * BUILD SUBSTRING AND PERFORM ASSIGNMENT
8210: *
8211: MOV R$PMS,XL POINT TO SUBJECT STRING
8212: JSR SBSTR CONSTRUCT SUBSTRING
8213: MOV XR,WB COPY SUBSTRING POINTER
8214: MOV (XS),XT RELOAD HISTORY STACK SCAN PTR
8215: MOV 2(XT),XL LOAD POINTER TO P$PAC NODE WITH NAM
8216: MOV PARM2(XL),WA LOAD NAME OFFSET
8217: MOV PARM1(XL),XL LOAD NAME BASE
8218: JSR ASINP PERFORM ASSIGNMENT
8219: PPM EXFAL MATCH FAILS IF NAME EVAL FAILS
8220: MOV (XS)+,XT ELSE RESTORE HISTORY STACK PTR
8221: EJC
8222: *
8223: * END OF PATTERN MATCH (CONTINUED)
8224: *
8225: * HERE CHECK FOR END OF ENTRIES
8226: *
8227: PNTH5 BNE XT,XS,PNTH3 LOOP IF MORE ENTRIES TO SCAN
8228: *
8229: * HERE AFTER DEALING WITH PATTERN ASSIGNMENTS
8230: *
8231: PNTH6 MOV PMHBS,XS WIPE OUT HISTORY STACK
8232: MOV (XS)+,WB LOAD INITIAL CURSOR
8233: MOV (XS)+,WC LOAD MATCH TYPE CODE
8234: MOV PMSSL,WA LOAD FINAL CURSOR VALUE
8235: MOV R$PMS,XL POINT TO SUBJECT STRING
8236: ZER R$PMS CLEAR SUBJECT STRING PTR FOR GBCOL
8237: BZE WC,PNTH7 JUMP IF CALL BY NAME
8238: ZER R$PMB CLEAR POSSIBLE BCBLK PTR FOR GBCOL
8239: BEQ WC,=NUM02,EXITS EXIT IF STATEMENT LEVEL CALL
8240: *
8241: * HERE WE HAVE A CALL BY VALUE, BUILD SUBSTRING
8242: *
8243: SUB WB,WA COMPUTE LENGTH OF STRING
8244: JSR SBSTR BUILD SUBSTRING
8245: BRN EXIXR AND EXIT WITH SUBSTRING VALUE
8246: *
8247: * HERE FOR CALL BY NAME, MAKE STACK ENTRIES FOR O$RPL
8248: *
8249: PNTH7 MOV WB,-(XS) STACK INITIAL CURSOR
8250: MOV WA,-(XS) STACK FINAL CURSOR
8251: .IF .CNBF
8252: MOV XL,-(XS) STACK SUBJECT STRING POINTER
8253: .ELSE
8254: BZE R$PMB,PNTH8 SKIP IF SUBJECT NOT BUFFER
8255: MOV R$PMB,XL ELSE GET PTR TO BCBLK INSTEAD
8256: ZER R$PMB CLEAR BCBLK PTR FOR GBCOL
8257: *
8258: * HERE WITH XL POINTING TO SCBLK OR BCBLK
8259: *
8260: PNTH8 MOV XL,-(XS) STACK SUBJECT POINTER
8261: .FI
8262: BRN EXITS EXIT WITH SPECIAL ENTRY ON STACK
8263: EJC
8264: *
8265: * POS (INTEGER ARGUMENT)
8266: *
8267: * PARM1 INTEGER ARGUMENT
8268: *
8269: P$POS ENT BL$P1 P1BLK
8270: BEQ WB,PARM1(XR),SUCCP SUCCEED IF AT RIGHT LOCATION
8271: BRN FAILP ELSE FAIL
8272: *
8273: * POS (EXPRESSION ARGUMENT)
8274: *
8275: * PARM1 EXPRESSION POINTER
8276: *
8277: P$PSD ENT BL$P1 P1BLK
8278: JSR EVALI EVALUATE INTEGER ARGUMENT
8279: ERR 057,POS EVALUATED ARGUMENT IS NOT INTEGER
8280: ERR 058,POS EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
8281: PPM FAILP FAIL IF EVALUATION FAILS
8282: BEQ WB,PARM1(XR),SUCCP SUCCEED IF AT RIGHT LOCATION
8283: BRN FAILP ELSE FAIL
8284: EJC
8285: *
8286: * PATTERN ASSIGNMENT (INITIAL ENTRY, SAVE CURSOR)
8287: *
8288: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
8289: * ALGORITHMS FOR MATCHING THIS NODE TYPE.
8290: *
8291: * NO PARAMETERS
8292: *
8293: P$PAA ENT BL$P0 P0BLK
8294: MOV WB,-(XS) STACK INITIAL CURSOR
8295: MOV =NDPAB,-(XS) STACK PTR TO NDPAB SPECIAL NODE
8296: BRN SUCCP AND SUCCEED MATCHING NULL
8297: *
8298: * PATTERN ASSIGNMENT (REMOVE SAVED CURSOR)
8299: *
8300: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
8301: * ALGORITHMS FOR MATCHING THIS NODE TYPE.
8302: *
8303: * NO PARAMETERS (DUMMY PATTERN)
8304: *
8305: P$PAB ENT ENTRY POINT
8306: BRN FAILP JUST FAIL (ENTRY IS ALREADY POPPED)
8307: *
8308: * PATTERN ASSIGNMENT (END OF MATCH, MAKE ASSIGN ENTRY)
8309: *
8310: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
8311: * ALGORITHMS FOR MATCHING THIS NODE TYPE.
8312: *
8313: * PARM1 NAME BASE OF VARIABLE
8314: * PARM2 NAME OFFSET OF VARIABLE
8315: *
8316: P$PAC ENT BL$P2 P2BLK
8317: MOV WB,-(XS) STACK DUMMY CURSOR VALUE
8318: MOV XR,-(XS) STACK POINTER TO P$PAC NODE
8319: MOV WB,-(XS) STACK FINAL CURSOR
8320: MOV =NDPAD,-(XS) STACK PTR TO SPECIAL NDPAD NODE
8321: MNZ PMDFL SET DOT FLAG NON-ZERO
8322: BRN SUCCP AND SUCCEED
8323: *
8324: * PATTERN ASSIGNMENT (REMOVE ASSIGN ENTRY)
8325: *
8326: * SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
8327: * ALGORITHMS FOR MATCHING THIS NODE TYPE.
8328: *
8329: * NO PARAMETERS (DUMMY NODE)
8330: *
8331: P$PAD ENT ENTRY POINT
8332: BRN FLPOP FAIL AND REMOVE P$PAC NODE
8333: EJC
8334: *
8335: * REM
8336: *
8337: * NO PARAMETERS
8338: *
8339: P$REM ENT BL$P0 P0BLK
8340: MOV PMSSL,WB POINT CURSOR TO END OF STRING
8341: BRN SUCCP AND SUCCEED
8342: *
8343: * RPOS (EXPRESSION ARGUMENT)
8344: *
8345: * PARM1 EXPRESSION POINTER
8346: *
8347: P$RPD ENT BL$P1 P1BLK
8348: JSR EVALI EVALUATE INTEGER ARGUMENT
8349: ERR 059,RPOS EVALUATED ARGUMENT IS NOT INTEGER
8350: ERR 060,RPOS EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
8351: PPM FAILP FAIL IF EVALUATION FAILS
8352: MOV =P$RPS,XL CONTINUATION ROUTINE
8353: BRI XL ENTER ROUTINE
8354: *
8355: * RPOS (INTEGER ARGUMENT)
8356: * EXPRESSION ARGUMENT CASE MERGES
8357: *
8358: * PARM1 INTEGER ARGUMENT
8359: *
8360: P$RPS ENT BL$P1 P1BLK
8361: MOV PMSSL,WC GET LENGTH OF STRING
8362: SUB WB,WC GET NUMBER OF CHARACTERS REMAINING
8363: BEQ WC,PARM1(XR),SUCCP SUCCEED IF AT RIGHT LOCATION
8364: BRN FAILP ELSE FAIL
8365: EJC
8366: *
8367: * RTAB (INTEGER ARGUMENT)
8368: * EXPRESSION ARGUMENT CASE MERGES
8369: *
8370: * PARM1 INTEGER ARGUMENT
8371: *
8372: P$RTB ENT BL$P1 P1BLK
8373: MOV WB,WC SAVE INITIAL CURSOR
8374: MOV PMSSL,WB POINT TO END OF STRING
8375: BLT WB,PARM1(XR),FAILP FAIL IF STRING NOT LONG ENOUGH
8376: SUB PARM1(XR),WB ELSE SET NEW CURSOR
8377: BGE WB,WC,SUCCP AND SUCCEED IF NOT TOO FAR ALREADY
8378: BRN FAILP IN WHICH CASE, FAIL
8379: *
8380: * RTAB (EXPRESSION ARGUMENT)
8381: *
8382: * PARM1 EXPRESSION POINTER
8383: *
8384: P$RTD ENT BL$P1 P1BLK
8385: JSR EVALI EVALUATE INTEGER ARGUMENT
8386: ERR 061,RTAB EVALUATED ARGUMENT IS NOT INTEGER
8387: ERR 062,RTAB EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
8388: PPM FAILP FAIL IF EVALUATION FAILS
8389: MOV =P$RTB,XL CONTINUATION ROUTINE
8390: BRI XL ENTER ROUTINE
8391: EJC
8392: *
8393: * SPAN (EXPRESSION ARGUMENT)
8394: *
8395: * PARM1 EXPRESSION POINTER
8396: *
8397: P$SPD ENT BL$P1 P1BLK
8398: MOV =P$SPN,WA PCODE FOR NEW NODE
8399: JSR EVALS EVALUATE STRING ARGUMENT
8400: ERR 063,SPAN EVALUATED ARGUMENT IS NOT STRING
8401: PPM FAILP FAIL IF EVALUATION FAILS
8402: BRI XL MERGE WITH MULTI-CHAR CASE IF OK
8403: *
8404: * SPAN (MULTI-CHARACTER ARGUMENT CASE)
8405: * EXPRESSION ARGUMENT CASE MERGES
8406: *
8407: * PARM1 POINTER TO CTBLK
8408: * PARM2 BIT MASK TO SELECT BIT COLUMN
8409: *
8410: P$SPN ENT BL$P2 P2BLK
8411: MOV PMSSL,WC COPY SUBJECT STRING LENGTH
8412: SUB WB,WC CALCULATE NUMBER OF CHARACTERS LEFT
8413: BZE WC,FAILP FAIL IF NO CHARACTERS LEFT
8414: MOV R$PMS,XL POINT TO SUBJECT STRING
8415: PLC XL,WB POINT TO CURRENT CHARACTER
8416: MOV WB,PSAVC SAVE INITIAL CURSOR
8417: MOV XR,PSAVE SAVE NODE POINTER
8418: LCT WC,WC SET COUNTER FOR CHARS LEFT
8419: *
8420: * LOOP TO SCAN MATCHING CHARACTERS
8421: *
8422: PSPN2 LCH WA,(XL)+ LOAD NEXT CHARACTER, BUMP POINTER
8423: WTB WA CONVERT TO BAU OFFSET
8424: MOV PARM1(XR),XR POINT TO CTBLK
8425: ADD WA,XR POINT TO CTBLK ENTRY
8426: MOV CTCHS(XR),WA LOAD CTBLK ENTRY
8427: MOV PSAVE,XR RESTORE NODE POINTER
8428: ANB PARM2(XR),WA AND WITH SELECTED BIT
8429: ZRB WA,PSPN3 JUMP IF NO MATCH
8430: ICV WB ELSE PUSH CURSOR
8431: BCT WC,PSPN2 LOOP BACK UNLESS END OF STRING
8432: *
8433: * HERE AFTER SCANNING MATCHING CHARACTERS
8434: *
8435: PSPN3 BNE WB,PSAVC,SUCCP SUCCEED IF CHARS MATCHED
8436: BRN FAILP ELSE FAIL IF NULL STRING MATCHED
8437: EJC
8438: *
8439: * SPAN (ONE CHARACTER ARGUMENT)
8440: *
8441: * PARM1 CHARACTER ARGUMENT
8442: *
8443: P$SPS ENT BL$P1 P1BLK
8444: MOV PMSSL,WC GET SUBJECT STRING LENGTH
8445: SUB WB,WC CALCULATE NUMBER OF CHARACTERS LEFT
8446: BZE WC,FAILP FAIL IF NO CHARACTERS LEFT
8447: MOV R$PMS,XL ELSE POINT TO SUBJECT STRING
8448: PLC XL,WB POINT TO CURRENT CHARACTER
8449: MOV WB,PSAVC SAVE INITIAL CURSOR
8450: LCT WC,WC SET COUNTER FOR CHARACTERS LEFT
8451: *
8452: * LOOP TO SCAN MATCHING CHARACTERS
8453: *
8454: PSPS1 LCH WA,(XL)+ LOAD NEXT CHARACTER, BUMP POINTER
8455: BNE WA,PARM1(XR),PSPS2 JUMP IF NO MATCH
8456: ICV WB ELSE PUSH CURSOR
8457: BCT WC,PSPS1 AND LOOP UNLESS END OF STRING
8458: *
8459: * HERE AFTER SCANNING MATCHING CHARACTERS
8460: *
8461: PSPS2 BNE WB,PSAVC,SUCCP SUCCEED IF CHARS MATCHED
8462: BRN FAILP FAIL IF NULL STRING MATCHED
8463: *
8464: * MULTI-CHARACTER STRING (MERGE FROM P$EXA)
8465: *
8466: * NOTE THAT ONE CHARACTER STRINGS USE THE CIRCUIT FOR
8467: * ONE CHARACTER ANY ARGUMENTS (P$AN1).
8468: *
8469: * PARM1 POINTER TO SCBLK FOR STRING ARG
8470: *
8471: P$STR ENT BL$P1 P1BLK
8472: MOV PARM1(XR),XL GET POINTER TO STRING
8473: MOV XR,PSAVE SAVE NODE POINTER
8474: MOV R$PMS,XR LOAD SUBJECT STRING POINTER
8475: PLC XR,WB POINT TO CURRENT CHARACTER
8476: ADD SCLEN(XL),WB COMPUTE NEW CURSOR POSITION
8477: BGT WB,PMSSL,FAILP FAIL IF PAST END OF STRING
8478: MOV WB,PSAVC SAVE UPDATED CURSOR
8479: MOV SCLEN(XL),WA GET NUMBER OF CHARS TO COMPARE
8480: PLC XL POINT TO CHARS OF TEST STRING
8481: CMC FAILP,FAILP COMPARE, FAIL IF NOT EQUAL
8482: MOV PSAVE,XR IF ALL MATCHED, RESTORE NODE PTR
8483: MOV PSAVC,WB RESTORE UPDATED CURSOR
8484: BRN SUCCP AND SUCCEED
8485: EJC
8486: *
8487: * SUCCEED
8488: *
8489: * SEE SECTION ON COMPOUND PATTERNS FOR DETAILS OF THE
8490: * STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE
8491: *
8492: * NO PARAMETERS
8493: *
8494: P$SUC ENT BL$P0 P0BLK
8495: MOV WB,-(XS) STACK CURSOR
8496: MOV XR,-(XS) STACK POINTER TO THIS NODE
8497: BRN SUCCP SUCCEED MATCHING NULL
8498: EJC
8499: *
8500: * TAB (INTEGER ARGUMENT)
8501: * EXPRESSION CASE MERGES
8502: *
8503: * PARM1 INTEGER ARGUMENT
8504: *
8505: P$TAB ENT BL$P1 P1BLK
8506: BGT WB,PARM1(XR),FAILP FAIL IF TOO FAR ALREADY
8507: MOV PARM1(XR),WB ELSE SET NEW CURSOR POSITION
8508: BLE WB,PMSSL,SUCCP SUCCEED IF NOT OFF END
8509: BRN FAILP ELSE FAIL
8510: *
8511: * TAB (EXPRESSION ARGUMENT)
8512: *
8513: * PARM1 EXPRESSION POINTER
8514: *
8515: P$TBD ENT BL$P1 P1BLK
8516: JSR EVALI EVALUATE INTEGER ARGUMENT
8517: ERR 064,TAB EVALUATED ARGUMENT IS NOT INTEGER
8518: ERR 065,TAB EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
8519: PPM FAILP FAIL IF EVALUATION FAILS
8520: MOV =P$TAB,XL CONTINUATION ROUTINE
8521: BRI XL ENTER ROUTINE
8522: *
8523: * ANCHOR MOVEMENT
8524: *
8525: * NO PARAMETERS (DUMMY NODE)
8526: *
8527: P$UNA ENT ENTRY POINT
8528: MOV WB,XR COPY INITIAL PATTERN NODE POINTER
8529: MOV (XS),WB GET INITIAL CURSOR
8530: BEQ WB,PMSSL,EXFAL MATCH FAILS IF AT END OF STRING
8531: ICV WB ELSE INCREMENT CURSOR
8532: MOV WB,(XS) STORE INCREMENTED CURSOR
8533: MOV XR,-(XS) RESTACK INITIAL NODE PTR
8534: MOV =NDUNA,-(XS) RESTACK UNANCHORED NODE
8535: BRI (XR) REMATCH FIRST NODE
8536: *
8537: * END OF PATTERN MATCH ROUTINES
8538: *
8539: * THE FOLLOWING ENTRY POINT MARKS THE END OF THE PATTERN
8540: * MATCHING ROUTINES AND ALSO THE END OF THE ENTRY POINTS
8541: * REFERENCED FROM THE FIRST WORD OF BLOCKS IN DYNAMIC STORE
8542: *
8543: P$YYY ENT BL$$I MARK LAST ENTRY IN PATTERN SECTION
8544: TTL S P I T B O L -- PREDEFINED SNOBOL4 FUNCTIONS
8545: *
8546: * THE FOLLOWING SECTION CONTAINS CODING FOR FUNCTIONS
8547: * WHICH ARE PREDEFINED AND AVAILABLE AT THE SNOBOL LEVEL.
8548: *
8549: * THESE ROUTINES RECEIVE CONTROL DIRECTLY FROM THE CODE OR
8550: * INDIRECTLY THROUGH THE O$FNC, O$FNS OR CFUNC ROUTINES.
8551: * IN BOTH CASES THE CONDITIONS ON ENTRY ARE AS FOLLOWS
8552: *
8553: * THE ARGUMENTS ARE ON THE STACK. THE NUMBER OF ARGUMENTS
8554: * HAS BEEN ADJUSTED TO CORRESPOND TO THE SVBLK SVNAR FIELD.
8555: *
8556: * IN CERTAIN FUNCTIONS THE DIRECT CALL IS NOT PERMITTED
8557: * AND IN THESE INSTANCES WE ALSO HAVE.
8558: *
8559: * (WA) ACTUAL NUMBER OF ARGUMENTS IN CALL
8560: *
8561: * CONTROL RETURNS BY PLACING THE FUNCTION RESULT VALUE ON
8562: * ON THE STACK AND CONTINUING EXECUTION WITH THE NEXT
8563: * WORD FROM THE GENERATED CODE.
8564: *
8565: * THE NAMES OF THE ENTRY POINTS OF THESE FUNCTIONS ARE OF
8566: * THE FORM S$XXX WHERE XXX IS THE THREE LETTER CODE FOR
8567: * THE SYSTEM VARIABLE NAME. THE FUNCTIONS ARE IN ORDER
8568: * ALPHABETICALLY BY THEIR ENTRY NAMES.
8569: EJC
8570: *
8571: * ANY
8572: *
8573: S$ANY ENT ENTRY POINT
8574: MOV =P$ANS,WB SET PCODE FOR SINGLE CHAR CASE
8575: MOV =P$ANY,XL PCODE FOR MULTI-CHAR CASE
8576: MOV =P$AYD,WC PCODE FOR EXPRESSION CASE
8577: JSR PATST CALL COMMON ROUTINE TO BUILD NODE
8578: ERR 066,ANY ARGUMENT IS NOT STRING OR EXPRESSION
8579: BRN EXIXR JUMP FOR NEXT CODE WORD
8580: .IF .CNBF
8581: .ELSE
8582: EJC
8583: *
8584: * APPEND
8585: *
8586: S$APN ENT ENTRY POINT
8587: MOV (XS)+,XL GET APPEND ARGUMENT
8588: MOV (XS)+,XR GET BCBLK
8589: BEQ (XR),=B$BCT,SAPN1 OK IF FIRST ARG IS BCBLK
8590: ERB 067,APPEND FIRST ARGUMENT IS NOT BUFFER
8591: *
8592: * HERE TO DO THE APPEND
8593: *
8594: SAPN1 MOV BCLEN(XR),WA OFFSET TO BUFFER END
8595: ZER WB NO CHARS TO BE REPLACED
8596: JSR INSBF DO THE APPEND
8597: ERR 068,APPEND SECOND ARGUMENT IS NOT STRING
8598: PPM EXFAL NO ROOM - FAIL
8599: BRN EXNUL EXIT WITH NULL RESULT
8600: .FI
8601: EJC
8602: *
8603: * APPLY
8604: *
8605: * APPLY DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT
8606: * WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED.
8607: *
8608: S$APP ENT ENTRY POINT
8609: BZE WA,SAPP3 JUMP IF NO ARGUMENTS
8610: DCV WA ELSE GET APPLIED FUNC ARG COUNT
8611: MOV WA,WB COPY
8612: WTB WB CONVERT TO BAUS
8613: MOV XS,XT COPY STACK POINTER
8614: ADD WB,XT POINT TO FUNCTION ARGUMENT ON STACK
8615: MOV (XT),XR LOAD FUNCTION PTR (APPLY 1ST ARG)
8616: BZE WA,SAPP2 JUMP IF NO ARGS FOR APPLIED FUNC
8617: LCT WB,WA ELSE SET COUNTER FOR LOOP
8618: *
8619: * LOOP TO MOVE ARGUMENTS UP ON STACK
8620: *
8621: SAPP1 DCA XT POINT TO NEXT ARGUMENT
8622: MOV (XT),1(XT) MOVE ARGUMENT UP
8623: BCT WB,SAPP1 LOOP TILL ALL MOVED
8624: *
8625: * MERGE HERE TO CALL FUNCTION (WA = NUMBER OF ARGUMENTS)
8626: *
8627: SAPP2 ICA XS ADJUST STACK PTR FOR APPLY 1ST ARG
8628: JSR GTNVR GET VARIABLE BLOCK ADDR FOR FUNC
8629: PPM SAPP3 JUMP IF NOT NATURAL VARIABLE
8630: MOV VRFNC(XR),XL ELSE POINT TO FUNCTION BLOCK
8631: BRN CFUNC GO CALL APPLIED FUNCTION
8632: *
8633: * HERE FOR INVALID FIRST ARGUMENT
8634: *
8635: SAPP3 ERB 069,APPLY FIRST ARG IS NOT NATURAL VARIABLE NAME
8636: EJC
8637: *
8638: * ARBNO
8639: *
8640: * ARBNO BUILDS A COMPOUND PATTERN. SEE DESCRIPTION AT
8641: * START OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED.
8642: *
8643: S$ABN ENT ENTRY POINT
8644: ZER XR SET PARM1 = 0 FOR THE MOMENT
8645: MOV =P$ALT,WB SET PCODE FOR ALTERNATIVE NODE
8646: JSR PBILD BUILD ALTERNATIVE NODE
8647: MOV XR,XL SAVE PTR TO ALTERNATIVE PATTERN
8648: MOV =P$ABC,WB PCODE FOR P$ABC
8649: ZER XR P0BLK
8650: JSR PBILD BUILD P$ABC NODE
8651: MOV XL,PTHEN(XR) PUT ALTERNATIVE NODE AS SUCCESSOR
8652: MOV XL,WA REMEMBER ALTERNATIVE NODE POINTER
8653: MOV XR,XL COPY P$ABC NODE PTR
8654: MOV (XS),XR LOAD ARBNO ARGUMENT
8655: MOV WA,(XS) STACK ALTERNATIVE NODE POINTER
8656: JSR GTPAT GET ARBNO ARGUMENT AS PATTERN
8657: ERR 070,ARBNO ARGUMENT IS NOT PATTERN
8658: JSR PCONC CONCAT ARG WITH P$ABC NODE
8659: MOV XR,XL REMEMBER PTR TO CONCD PATTERNS
8660: MOV =P$ABA,WB PCODE FOR P$ABA
8661: ZER XR P0BLK
8662: JSR PBILD BUILD P$ABA NODE
8663: MOV XL,PTHEN(XR) CONCATENATE NODES
8664: MOV (XS),XL RECALL PTR TO ALTERNATIVE NODE
8665: MOV XR,PARM1(XL) POINT ALTERNATIVE BACK TO ARGUMENT
8666: BRN EXITS JUMP FOR NEXT CODE WORD
8667: EJC
8668: *
8669: * ARG
8670: *
8671: S$ARG ENT ENTRY POINT
8672: JSR GTSMI GET SECOND ARG AS SMALL INTEGER
8673: ERR 253,ARG SECOND ARGUMENT IS NOT INTEGER
8674: PPM EXFAL FAIL IF OUT OF RANGE OR NEGATIVE
8675: MOV XR,WA SAVE ARGUMENT NUMBER
8676: MOV (XS)+,XR LOAD FIRST ARGUMENT
8677: JSR GTNVR LOCATE VRBLK
8678: PPM SARG1 JUMP IF NOT NATURAL VARIABLE
8679: MOV VRFNC(XR),XR ELSE LOAD FUNCTION BLOCK POINTER
8680: BNE (XR),=B$PFC,SARG1 JUMP IF NOT PROGRAM DEFINED
8681: BZE WA,EXFAL FAIL IF ARG NUMBER IS ZERO
8682: BGT WA,FARGS(XR),EXFAL FAIL IF ARG NUMBER IS TOO LARGE
8683: WTB WA ELSE CONVERT TO BYTE OFFSET
8684: ADD WA,XR POINT TO ARGUMENT SELECTED
8685: MOV PFAGB(XR),XR LOAD ARGUMENT VRBLK POINTER
8686: BRN EXVNM EXIT TO BUILD NMBLK
8687: *
8688: * HERE IF 1ST ARGUMENT IS BAD
8689: *
8690: SARG1 ERB 252,ARG FIRST ARGUMENT IS NOT PROGRAM FUNCTION NAME
8691: EJC
8692: *
8693: * ARRAY
8694: *
8695: S$ARR ENT ENTRY POINT
8696: MOV (XS)+,XL LOAD INITIAL ELEMENT VALUE
8697: MOV (XS)+,XR LOAD FIRST ARGUMENT
8698: JSR GTINT CONVERT FIRST ARG TO INTEGER
8699: PPM SAR02 JUMP IF NOT INTEGER
8700: *
8701: * HERE FOR INTEGER FIRST ARGUMENT, BUILD VCBLK
8702: *
8703: LDI ICVAL(XR) LOAD INTEGER VALUE
8704: ILE SAR10 JUMP IF ZERO OR NEG (BAD DIMENSION)
8705: MFI WA,SAR11 ELSE CONVERT TO ONE WORD, TEST OVFL
8706: LCT WB,WA COPY ELEMENTS FOR LOOP LATER ON
8707: ADD =VCSI$,WA ADD SPACE FOR STANDARD FIELDS
8708: WTB WA CONVERT LENGTH TO BAUS
8709: BGE WA,MXLEN,SAR11 FAIL IF TOO LARGE
8710: JSR ALLOC ALLOCATE SPACE FOR VCBLK
8711: MOV =B$VCT,(XR) STORE TYPE WORD
8712: MOV WA,VCLEN(XR) SET LENGTH
8713: MOV XL,WC COPY DEFAULT VALUE
8714: MOV XR,XL COPY VCBLK POINTER
8715: ADD *VCVLS,XL POINT TO FIRST ELEMENT VALUE
8716: *
8717: * LOOP TO SET VECTOR ELEMENTS TO DEFAULT VALUE
8718: *
8719: SAR01 MOV WC,(XL)+ STORE ONE VALUE
8720: BCT WB,SAR01 LOOP TILL ALL STORED
8721: BRN EXSID EXIT SETTING IDVAL
8722: EJC
8723: *
8724: * ARRAY (CONTINUED)
8725: *
8726: * HERE IF FIRST ARGUMENT IS NOT AN INTEGER
8727: *
8728: SAR02 MOV XR,-(XS) REPLACE ARGUMENT ON STACK
8729: JSR XSCNI INITIALIZE SCAN OF FIRST ARGUMENT
8730: ERR 071,ARRAY FIRST ARGUMENT IS NOT INTEGER OR STRING
8731: PPM EXNUL DUMMY (UNUSED) NULL STRING EXIT
8732: MOV R$XSC,-(XS) SAVE PROTOTYPE POINTER
8733: MOV XL,-(XS) SAVE DEFAULT VALUE
8734: ZER ARCDM ZERO COUNT OF DIMENSIONS
8735: ZER ARPTR ZERO OFFSET TO INDICATE PASS ONE
8736: LDI INTV1 LOAD INTEGER ONE
8737: STI ARNEL INITIALIZE ELEMENT COUNT
8738: *
8739: * THE FOLLOWING CODE IS EXECUTED TWICE. THE FIRST TIME
8740: * (ARPTR EQ 0), IT IS USED TO COUNT THE NUMBER OF ELEMENTS
8741: * AND NUMBER OF DIMENSIONS. THE SECOND TIME (ARPTR GT 0) IS
8742: * USED TO ACTUALLY FILL IN THE DIM,LBD FIELDS OF THE ARBLK.
8743: *
8744: SAR03 LDI INTV1 LOAD ONE AS DEFAULT LOW BOUND
8745: STI ARSVL SAVE AS LOW BOUND
8746: MOV =CH$CL,WC SET DELIMITER ONE = COLON
8747: MOV =CH$CM,XL SET DELIMITER TWO = COMMA
8748: JSR XSCAN SCAN NEXT BOUND
8749: BNE WA,=NUM01,SAR04 JUMP IF NOT COLON
8750: *
8751: * HERE WE HAVE A COLON ENDING A LOW BOUND
8752: *
8753: JSR GTINT CONVERT LOW BOUND
8754: ERR 072,ARRAY FIRST ARGUMENT LOWER BOUND IS NOT INTEGER
8755: LDI ICVAL(XR) LOAD VALUE OF LOW BOUND
8756: STI ARSVL STORE LOW BOUND VALUE
8757: MOV =CH$CM,WC SET DELIMITER ONE = COMMA
8758: MOV WC,XL AND DELIMITER TWO = COMMA
8759: JSR XSCAN SCAN HIGH BOUND
8760: EJC
8761: *
8762: * ARRAY (CONTINUED)
8763: *
8764: * MERGE HERE TO PROCESS UPPER BOUND
8765: *
8766: SAR04 BNZ WA,SAR4A SKIP IF DELIMITER 1 OR 2
8767: BNZ XSCNB,SAR10 JUMP IF ILLEGALLY PLACED BLANK
8768: *
8769: * CHECK FOR INTEGER BOUND
8770: *
8771: SAR4A JSR GTINT CONVERT HIGH BOUND TO INTEGER
8772: ERR 073,ARRAY FIRST ARGUMENT UPPER BOUND IS NOT INTEGER
8773: LDI ICVAL(XR) GET HIGH BOUND
8774: SBI ARSVL SUBTRACT LOWER BOUND
8775: IOV SAR10 BAD DIMENSION IF OVERFLOW
8776: ILT SAR10 BAD DIMENSION IF NEGATIVE
8777: ADI INTV1 ADD 1 TO GET DIMENSION
8778: IOV SAR10 BAD DIMENSION IF OVERFLOW
8779: MOV ARPTR,XL LOAD OFFSET (ALSO PASS INDICATOR)
8780: BZE XL,SAR05 JUMP IF FIRST PASS
8781: *
8782: * HERE IN SECOND PASS TO STORE LBD AND DIM IN ARBLK
8783: *
8784: ADD (XS),XL POINT TO CURRENT LOCATION IN ARBLK
8785: STI CFP$I(XL) STORE DIMENSION
8786: LDI ARSVL LOAD LOW BOUND
8787: STI (XL) STORE LOW BOUND
8788: ADD *ARDMS,ARPTR BUMP OFFSET TO NEXT BOUNDS
8789: BRN SAR06 JUMP TO CHECK FOR END OF BOUNDS
8790: *
8791: * HERE IN PASS 1
8792: *
8793: SAR05 ICV ARCDM BUMP DIMENSION COUNT
8794: MLI ARNEL MULTIPLY DIMENSION BY COUNT SO FAR
8795: IOV SAR11 TOO LARGE IF OVERFLOW
8796: STI ARNEL ELSE STORE UPDATED ELEMENT COUNT
8797: *
8798: * MERGE HERE AFTER PROCESSING ONE SET OF BOUNDS
8799: *
8800: SAR06 BNZ WA,SAR03 LOOP BACK UNLESS END OF BOUNDS
8801: BNZ ARPTR,SAR09 JUMP IF END OF PASS 2
8802: EJC
8803: *
8804: * ARRAY (CONTINUED)
8805: *
8806: * HERE AT END OF PASS ONE, BUILD ARBLK
8807: *
8808: LDI ARNEL GET NUMBER OF ELEMENTS
8809: MFI WB,SAR11 GET AS ADDR INTEGER, TEST OVFLO
8810: WTB WB ELSE CONVERT TO LENGTH IN BAUS
8811: MOV *ARSI$,WA SET SIZE OF STANDARD FIELDS
8812: LCT WC,ARCDM SET DIMENSION COUNT TO CONTROL LOOP
8813: *
8814: * LOOP TO ALLOW SPACE FOR DIMENSIONS
8815: *
8816: SAR07 ADD *ARDMS,WA ALLOW SPACE FOR ONE SET OF BOUNDS
8817: BCT WC,SAR07 LOOP BACK TILL ALL ACCOUNTED FOR
8818: MOV WA,XL SAVE SIZE (=AROFS)
8819: *
8820: * NOW ALLOCATE SPACE FOR ARBLK
8821: *
8822: ADD WB,WA ADD SPACE FOR ELEMENTS
8823: ICA WA ALLOW FOR ARPRO PROTOTYPE FIELD
8824: BGE WA,MXLEN,SAR11 FAIL IF TOO LARGE
8825: JSR ALLOC ELSE ALLOCATE ARBLK
8826: MOV (XS),WB LOAD DEFAULT VALUE
8827: MOV XR,(XS) SAVE ARBLK POINTER
8828: MOV WA,WC SAVE LENGTH IN BAUS
8829: BTW WA CONVERT LENGTH BACK TO WORDS
8830: LCT WA,WA SET COUNTER TO CONTROL LOOP
8831: *
8832: * LOOP TO CLEAR ENTIRE ARBLK TO DEFAULT VALUE
8833: *
8834: SAR08 MOV WB,(XR)+ SET ONE WORD
8835: BCT WA,SAR08 LOOP TILL ALL SET
8836: EJC
8837: *
8838: * ARRAY (CONTINUED)
8839: *
8840: * NOW SET INITIAL FIELDS OF ARBLK
8841: *
8842: MOV (XS)+,XR RELOAD ARBLK POINTER
8843: MOV (XS),WB LOAD PROTOTYPE
8844: MOV =B$ART,(XR) SET TYPE WORD
8845: MOV WC,ARLEN(XR) STORE LENGTH IN BAUS
8846: ZER IDVAL(XR) ZERO ID TILL WE GET IT BUILT
8847: MOV XL,AROFS(XR) SET PROTOTYPE FIELD PTR
8848: MOV ARCDM,ARNDM(XR) SET NUMBER OF DIMENSIONS
8849: MOV XR,WC SAVE ARBLK POINTER
8850: ADD XL,XR POINT TO PROTOTYPE FIELD
8851: MOV WB,(XR) STORE PROTOTYPE PTR IN ARBLK
8852: MOV *ARLBD,ARPTR SET OFFSET FOR PASS 2 BOUNDS SCAN
8853: MOV WB,R$XSC RESET STRING POINTER FOR XSCAN
8854: MOV WC,(XS) STORE ARBLK POINTER ON STACK
8855: ZER XSOFS RESET OFFSET PTR TO START OF STRING
8856: BRN SAR03 JUMP BACK TO RESCAN BOUNDS
8857: *
8858: * HERE AFTER FILLING IN BOUNDS INFORMATION (END PASS TWO)
8859: *
8860: SAR09 MOV (XS)+,XR RELOAD POINTER TO ARBLK
8861: BRN EXSID EXIT SETTING IDVAL
8862: *
8863: * HERE FOR BAD DIMENSION
8864: *
8865: SAR10 ERB 074,BAD DIMENSION, ZERO, NEGATIVE OR OUT OF RANGE
8866: *
8867: * HERE IF ARRAY IS TOO LARGE
8868: *
8869: SAR11 ERB 075,ARRAY SIZE EXCEEDS MAXIMUM PERMITTED
8870: EJC
8871: *
8872: * BREAK
8873: *
8874: S$BRK ENT ENTRY POINT
8875: MOV =P$BKS,WB SET PCODE FOR SINGLE CHAR CASE
8876: MOV =P$BRK,XL PCODE FOR MULTI-CHAR CASE
8877: MOV =P$BKD,WC PCODE FOR EXPRESSION CASE
8878: JSR PATST CALL COMMON ROUTINE TO BUILD NODE
8879: ERR 076,BREAK ARGUMENT IS NOT STRING OR EXPRESSION
8880: BRN EXIXR JUMP FOR NEXT CODE WORD
8881: EJC
8882: *
8883: * BREAKX
8884: *
8885: * BREAKX IS A COMPOUND PATTERN. SEE DESCRIPTION AT START
8886: * OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED.
8887: *
8888: S$BKX ENT ENTRY POINT
8889: MOV =P$BKS,WB PCODE FOR SINGLE CHAR ARGUMENT
8890: MOV =P$BRK,XL PCODE FOR MULTI-CHAR ARGUMENT
8891: MOV =P$BXD,WC PCODE FOR EXPRESSION CASE
8892: JSR PATST CALL COMMON ROUTINE TO BUILD NODE
8893: ERR 077,BREAKX ARGUMENT IS NOT STRING OR EXPRESSION
8894: *
8895: * NOW HOOK BREAKX NODE ON AT FRONT END
8896: *
8897: MOV XR,-(XS) SAVE PTR TO BREAK NODE
8898: MOV =P$BKX,WB SET PCODE FOR BREAKX NODE
8899: JSR PBILD BUILD IT
8900: MOV (XS),PTHEN(XR) SET BREAK NODE AS SUCCESSOR
8901: MOV =P$ALT,WB SET PCODE FOR ALTERNATION NODE
8902: JSR PBILD BUILD (PARM1=ALT=BREAKX NODE)
8903: MOV XR,WA SAVE PTR TO ALTERNATION NODE
8904: MOV (XS),XR POINT TO BREAK NODE
8905: MOV WA,PTHEN(XR) SET ALTERNATE NODE AS SUCCESSOR
8906: BRN EXITS EXIT WITH RESULT ON STACK
8907: .IF .CNBF
8908: .ELSE
8909: EJC
8910: *
8911: * BUFFER
8912: *
8913: S$BUF ENT ENTRY POINT
8914: MOV (XS)+,XL GET INITIAL STRING
8915: JSR GTSMI CONVERT MEMORY REQUEST TO INTEGER
8916: ERR 078,BUFFER FIRST ARGUMENT IS NOT INTEGER
8917: PPM SBF01 FAIL IF OUT OF RANGE
8918: MOV WC,WA MOVE LENGTH TO CORRECT REGISTER
8919: JSR ALOBF ALLOCATE THE BUFFER
8920: JSR INSBF COPY INITIAL ARG IN
8921: ERR 079,BUFFER SECOND ARGUMENT IS NOT STRING OR BUFFER
8922: ERR 080,BUFFER INITIAL VALUE TOO BIG FOR ALLOCATION
8923: BRN EXSID EXIT SETTING IDVAL
8924: *
8925: * HERE FOR INVALID ALLOCATION SIZE
8926: *
8927: SBF01 ERB 081,BUFFER FIRST ARGUMENT IS OUT OF RANGE
8928: .FI
8929: EJC
8930: *
8931: * CLEAR
8932: *
8933: S$CLR ENT ENTRY POINT
8934: JSR XSCNI INITIALIZE TO SCAN ARGUMENT
8935: ERR 082,CLEAR ARGUMENT IS NOT STRING
8936: PPM SCLR2 JUMP IF NULL
8937: *
8938: * LOOP TO SCAN OUT NAMES IN FIRST ARGUMENT. VARIABLES IN
8939: * THE LIST ARE FLAGGED BY SETTING VRGET OF VRBLK TO ZERO.
8940: *
8941: SCLR1 MOV =CH$CM,WC SET DELIMITER ONE = COMMA
8942: MOV WC,XL DELIMITER TWO = COMMA
8943: JSR XSCAN SCAN NEXT VARIABLE NAME
8944: JSR GTNVR LOCATE VRBLK
8945: PPM SCLR7 ERRONEOUS NAME
8946: ZER VRGET(XR) ELSE FLAG BY ZEROING VRGET FIELD
8947: BNZ WA,SCLR1 LOOP BACK IF STOPPED BY COMMA
8948: BNZ XSCNB,SCLR7 BADLY PLACED BLANK
8949: *
8950: * HERE AFTER FLAGGING VARIABLES IN ARGUMENT LIST
8951: *
8952: SCLR2 MOV HSHTB,WB POINT TO START OF HASH TABLE
8953: *
8954: * LOOP THROUGH SLOTS IN HASH TABLE
8955: *
8956: SCLR3 BEQ WB,HSHTE,EXNUL EXIT RETURNING NULL IF NONE LEFT
8957: MOV WB,XR ELSE COPY SLOT POINTER
8958: ICA WB BUMP SLOT POINTER
8959: SUB *VRNXT,XR SET OFFSET TO MERGE INTO LOOP
8960: *
8961: * LOOP THROUGH VRBLKS ON ONE HASH CHAIN
8962: *
8963: SCLR4 MOV VRNXT(XR),XR POINT TO NEXT VRBLK ON CHAIN
8964: BZE XR,SCLR3 JUMP FOR NEXT BUCKET IF CHAIN END
8965: BNZ VRGET(XR),SCLR5 JUMP IF NOT FLAGGED
8966: EJC
8967: *
8968: * CLEAR (CONTINUED)
8969: *
8970: * HERE FOR FLAGGED VARIABLE, DO NOT SET VALUE TO NULL
8971: *
8972: JSR SETVR FOR FLAGGED VAR, RESTORE VRGET
8973: BRN SCLR4 AND LOOP BACK FOR NEXT VRBLK
8974: *
8975: * HERE TO SET VALUE OF A VARIABLE TO NULL
8976: * PROTECTED VARIABLES (ARB ETC) ARE EXEMPT
8977: *
8978: SCLR5 BEQ VRSTO(XR),=B$VRE,SCLR4 CHECK FOR PROTECTED VARIABLE
8979: MOV XR,XL COPY VRBLK POINTER
8980: *
8981: * LOOP TO LOCATE VALUE AT END OF POSSIBLE TRBLK CHAIN
8982: *
8983: SCLR6 MOV XL,WA SAVE BLOCK POINTER
8984: MOV VRVAL(XL),XL LOAD NEXT VALUE FIELD
8985: BEQ (XL),=B$TRT,SCLR6 LOOP BACK IF TRAPPED
8986: *
8987: * NOW STORE THE NULL VALUE
8988: *
8989: MOV WA,XL RESTORE BLOCK POINTER
8990: MOV =NULLS,VRVAL(XL) STORE NULL CONSTANT VALUE
8991: BRN SCLR4 LOOP BACK FOR NEXT VRBLK
8992: *
8993: * ERROR POINT
8994: *
8995: SCLR7 ERB 083,NULL VARIABLE NAME OR ILLEGAL BLANK IN CLEAR ARG
8996: EJC
8997: *
8998: * CODE
8999: *
9000: S$COD ENT ENTRY POINT
9001: MOV (XS)+,XR LOAD ARGUMENT
9002: JSR GTCOD CONVERT TO CODE
9003: PPM EXFAL FAIL IF CONVERSION IS IMPOSSIBLE
9004: BRN EXIXR ELSE RETURN CODE AS RESULT
9005: EJC
9006: *
9007: * COLLECT
9008: *
9009: S$COL ENT ENTRY POINT
9010: MOV (XS)+,XR LOAD ARGUMENT
9011: JSR GTINT CONVERT TO INTEGER
9012: ERR 084,COLLECT ARGUMENT IS NOT INTEGER
9013: LDI ICVAL(XR) LOAD COLLECT ARGUMENT
9014: STI CLSVI SAVE COLLECT ARGUMENT
9015: ZER WB SET NO MOVE UP
9016: JSR GBCOL PERFORM GARBAGE COLLECTION
9017: MOV DNAME,WA POINT TO END OF MEMORY
9018: SUB DNAMP,WA SUBTRACT NEXT LOCATION
9019: BTW WA CONVERT BAUS TO WORDS
9020: MTI WA CONVERT WORDS AVAILABLE AS INTEGER
9021: SBI CLSVI SUBTRACT ARGUMENT
9022: IOV EXFAL FAIL IF OVERFLOW
9023: ILT EXFAL FAIL IF NOT ENOUGH
9024: ADI CLSVI ELSE RECOMPUTE AVAILABLE
9025: BRN EXINT AND EXIT WITH INTEGER RESULT
9026: EJC
9027: *
9028: * CONVERT
9029: *
9030: S$CVT ENT ENTRY POINT
9031: JSR GTSTG CONVERT SECOND ARGUMENT TO STRING
9032: ERR 085,CONVERT SECOND ARGUMENT IS NOT STRING
9033: .IF .CASL
9034: MOV XR,XL COPY STRING PTR TO XL
9035: ZER WB ZERO OFFSET
9036: JSR SBSTG CONVERT CASE OF ARG IF NECESSARY
9037: .FI
9038: MOV (XS),XL LOAD FIRST ARGUMENT
9039: BNE (XL),=B$PDT,SCV01 JUMP IF NOT PROGRAM DEFINED
9040: *
9041: * HERE FOR PROGRAM DEFINED DATATYPE
9042: *
9043: MOV PDDFP(XL),XL POINT TO DFBLK
9044: MOV DFNAM(XL),XL LOAD DATATYPE NAME
9045: JSR IDENT COMPARE WITH SECOND ARG
9046: PPM EXITS EXIT IF IDENT WITH ARG AS RESULT
9047: BRN EXFAL ELSE FAIL
9048: *
9049: * HERE IF NOT PROGRAM DEFINED DATATYPE
9050: *
9051: SCV01 MOV XR,-(XS) SAVE STRING ARGUMENT
9052: MOV =SVCTB,XL POINT TO TABLE OF NAMES TO COMPARE
9053: ZER WB INITIALIZE COUNTER
9054: MOV SCLEN(XR),WC SAVE LENGTH OF ARGUMENT STRING
9055: *
9056: * LOOP THROUGH TABLE ENTRIES
9057: *
9058: SCV02 MOV (XL)+,XR LOAD NEXT TABLE ENTRY, BUMP POINTER
9059: BZE XR,EXFAL FAIL IF ZERO MARKING END OF LIST
9060: BNE WC,SCLEN(XR),SCV05 JUMP IF WRONG LENGTH
9061: MOV XL,CNVTP ELSE STORE TABLE POINTER
9062: PLC XR POINT TO CHARS OF TABLE ENTRY
9063: MOV (XS),XL LOAD POINTER TO STRING ARGUMENT
9064: PLC XL POINT TO CHARS OF STRING ARG
9065: MOV WC,WA SET NUMBER OF CHARS TO COMPARE
9066: CMC SCV04,SCV04 COMPARE, JUMP IF NO MATCH
9067: EJC
9068: *
9069: * CONVERT (CONTINUED)
9070: *
9071: * HERE WE HAVE A MATCH
9072: *
9073: SCV03 MOV WB,XL COPY ENTRY NUMBER
9074: ICA XS POP STRING ARG OFF STACK
9075: MOV (XS)+,XR LOAD FIRST ARGUMENT
9076: BSW XL,CNVTT JUMP TO APPROPRIATE ROUTINE
9077: IFF 0,SCV06 STRING
9078: IFF 1,SCV07 INTEGER
9079: IFF 2,SCV09 NAME
9080: IFF 3,SCV10 PATTERN
9081: IFF 4,SCV11 ARRAY
9082: IFF 5,SCV19 TABLE
9083: IFF 6,SCV25 EXPRESSION
9084: IFF 7,SCV26 CODE
9085: IFF 8,SCV27 NUMERIC
9086: .IF .CNRA
9087: .ELSE
9088: IFF 9,SCV08 REAL
9089: .FI
9090: .IF .CNBF
9091: .ELSE
9092: IFF CNVBT,SCV28 BUFFER
9093: .FI
9094: ESW END OF SWITCH TABLE
9095: *
9096: * HERE IF NO MATCH WITH TABLE ENTRY
9097: *
9098: SCV04 MOV CNVTP,XL RESTORE TABLE POINTER, MERGE
9099: *
9100: * MERGE HERE IF LENGTHS DID NOT MATCH
9101: *
9102: SCV05 ICV WB BUMP ENTRY NUMBER
9103: BRN SCV02 LOOP BACK TO CHECK NEXT ENTRY
9104: *
9105: * HERE TO CONVERT TO STRING
9106: *
9107: SCV06 MOV XR,-(XS) REPLACE STRING ARGUMENT ON STACK
9108: JSR GTSTG CONVERT TO STRING
9109: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE
9110: BRN EXIXR ELSE RETURN STRING
9111: EJC
9112: *
9113: * CONVERT (CONTINUED)
9114: *
9115: * HERE TO CONVERT TO INTEGER
9116: *
9117: SCV07 JSR GTINT CONVERT TO INTEGER
9118: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE
9119: BRN EXIXR ELSE RETURN INTEGER
9120: .IF .CNRA
9121: .ELSE
9122: *
9123: * HERE TO CONVERT TO REAL
9124: *
9125: SCV08 JSR GTREA CONVERT TO REAL
9126: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE
9127: BRN EXIXR ELSE RETURN REAL
9128: .FI
9129: *
9130: * HERE TO CONVERT TO NAME
9131: *
9132: SCV09 BEQ (XR),=B$NML,EXIXR RETURN IF ALREADY A NAME
9133: JSR GTNVR ELSE TRY STRING TO NAME CONVERT
9134: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE
9135: BRN EXVNM ELSE EXIT BUILDING NMBLK FOR VRBLK
9136: *
9137: * HERE TO CONVERT TO PATTERN
9138: *
9139: SCV10 JSR GTPAT CONVERT TO PATTERN
9140: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE
9141: BRN EXIXR ELSE RETURN PATTERN
9142: *
9143: * CONVERT TO ARRAY
9144: *
9145: SCV11 JSR GTARR GET AN ARRAY
9146: PPM EXFAL FAIL IF NOT CONVERTIBLE
9147: BRN EXSID EXIT SETTING ID FIELD
9148: *
9149: * CONVERT TO TABLE
9150: *
9151: SCV19 MOV (XR),WA LOAD FIRST WORD OF BLOCK
9152: MOV XR,-(XS) REPLACE ARBLK POINTER ON STACK
9153: BEQ WA,=B$TBT,EXITS RETURN ARG IF ALREADY A TABLE
9154: BNE WA,=B$ART,EXFAL ELSE FAIL IF NOT AN ARRAY
9155: EJC
9156: *
9157: * CONVERT (CONTINUED)
9158: *
9159: * HERE TO CONVERT AN ARRAY TO TABLE
9160: *
9161: BNE ARNDM(XR),=NUM02,EXFAL FAIL IF NOT 2-DIM ARRAY
9162: LDI ARDM2(XR) LOAD DIM 2
9163: SBI INTV2 SUBTRACT 2 TO COMPARE
9164: INE EXFAL FAIL IF DIM2 NOT 2
9165: *
9166: * HERE WE HAVE AN ARBLK OF THE RIGHT SHAPE
9167: *
9168: LDI ARDIM(XR) LOAD DIM 1 (NUMBER OF ELEMENTS)
9169: MFI WA GET AS ONE WORD INTEGER
9170: LCT WB,WA COPY TO CONTROL LOOP
9171: ADD =TBSI$,WA ADD SPACE FOR STANDARD FIELDS
9172: WTB WA CONVERT LENGTH TO BAUS
9173: JSR ALLOC ALLOCATE SPACE FOR TBBLK
9174: MOV XR,WC COPY TBBLK POINTER
9175: MOV XR,-(XS) SAVE TBBLK POINTER
9176: MOV =B$TBT,(XR)+ STORE TYPE WORD
9177: ZER (XR)+ STORE ZERO FOR IDVAL FOR NOW
9178: MOV WA,(XR)+ STORE LENGTH
9179: MOV =NULLS,(XR)+ NULL INITIAL LOOKUP VALUE
9180: *
9181: * LOOP TO INITIALIZE BUCKET PTRS TO POINT TO TABLE
9182: *
9183: SCV20 MOV WC,(XR)+ SET BUCKET PTR TO POINT TO TBBLK
9184: BCT WB,SCV20 LOOP TILL ALL INITIALIZED
9185: MOV *ARVL2,WB SET OFFSET TO FIRST ARBLK ELEMENT
9186: *
9187: * LOOP TO COPY ELEMENTS FROM ARRAY TO TABLE
9188: *
9189: SCV21 MOV 1(XS),XL POINT TO ARBLK
9190: BEQ WB,ARLEN(XL),SCV24 JUMP IF ALL MOVED
9191: ADD WB,XL ELSE POINT TO CURRENT LOCATION
9192: ADD *NUM02,WB BUMP OFFSET
9193: MOV (XL),XR LOAD SUBSCRIPT NAME
9194: DCA XL ADJUST PTR TO MERGE (TRVAL=1+1)
9195: EJC
9196: *
9197: * CONVERT (CONTINUED)
9198: *
9199: * LOOP TO CHASE DOWN TRBLK CHAIN FOR VALUE
9200: *
9201: SCV22 MOV TRVAL(XL),XL POINT TO NEXT VALUE
9202: BEQ (XL),=B$TRT,SCV22 LOOP BACK IF TRAPPED
9203: *
9204: * HERE WITH NAME IN XR, VALUE IN XL
9205: *
9206: SCV23 MOV XL,-(XS) STACK VALUE
9207: MOV 1(XS),XL LOAD TBBLK POINTER
9208: JSR TFIND BUILD TEBLK (NOTE WB GT 0 BY NAME)
9209: PPM EXFAL FAIL IF ACESS FAILS
9210: MOV (XS)+,TEVAL(XL) STORE VALUE IN TEBLK
9211: BRN SCV21 LOOP BACK FOR NEXT ELEMENT
9212: *
9213: * HERE AFTER MOVING ALL ELEMENTS TO TBBLK
9214: *
9215: SCV24 MOV (XS)+,XR LOAD TBBLK POINTER
9216: ICA XS POP ARBLK POINTER
9217: BRN EXSID EXIT SETTING IDVAL
9218: *
9219: * CONVERT TO EXPRESSION
9220: *
9221: SCV25 JSR GTEXP CONVERT TO EXPRESSION
9222: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE
9223: BRN EXIXR ELSE RETURN EXPRESSION
9224: *
9225: * CONVERT TO CODE
9226: *
9227: SCV26 JSR GTCOD CONVERT TO CODE
9228: PPM EXFAL FAIL IF CONVERSION IS NOT POSSIBLE
9229: BRN EXIXR ELSE RETURN CODE
9230: *
9231: * CONVERT TO NUMERIC
9232: *
9233: SCV27 JSR GTNUM CONVERT TO NUMERIC
9234: PPM EXFAL FAIL IF UNCONVERTIBLE
9235: BRN EXIXR RETURN NUMBER
9236: EJC
9237: .IF .CNBF
9238: .ELSE
9239: *
9240: * CONVERT TO BUFFER
9241: *
9242: SCV28 JSR GTBUF CONVERT TO BUFFER
9243: PPM EXFAL FAIL IF CONVERSION NOT POSSIBLE
9244: BRN EXSID EXIT SETTING IDVAL FIELD
9245: .FI
9246: EJC
9247: *
9248: * COPY
9249: *
9250: S$COP ENT ENTRY POINT
9251: JSR CBLCK COPY THE BLOCK
9252: PPM EXITS RETURN IF NO IDVAL FIELD
9253: BRN EXSID EXIT SETTING ID VALUE
9254: *
9255: * CTI
9256: *
9257: S$CTI ENT
9258: LDI INTV0 ZERO IN CASE NULL STRING
9259: JSR GTSTG GET ARG AS A STRING
9260: ERR 086,CTI ARGUMENT IS NOT A STRING
9261: BZE WA,SCT01 SKIP IF NULL
9262: PLC XR PREPARE TO READ THE CHARACTER
9263: LCH WB,(XR) GET THE CHARACTER
9264: MTI WB CONVERT TO INTEGER
9265: ZER XR CLEAR GARBAGE
9266: *
9267: * MAKE ICBLK AND RETURN
9268: *
9269: SCT01 JSR ICBLD BUILD ICBLK
9270: BRN EXIXR RETURN INTEGER RESULT
9271: EJC
9272: *
9273: * DATA
9274: *
9275: S$DAT ENT ENTRY POINT
9276: JSR XSCNI PREPARE TO SCAN ARGUMENT
9277: ERR 087,DATA ARGUMENT IS NOT STRING
9278: ERR 088,DATA ARGUMENT IS NULL
9279: *
9280: * SCAN OUT DATATYPE NAME
9281: *
9282: MOV =CH$PP,WC DELIMITER ONE = LEFT PAREN
9283: MOV WC,XL DELIMITER TWO = LEFT PAREN
9284: JSR XSCAN SCAN DATATYPE NAME
9285: BNZ WA,SDAT1 SKIP IF LEFT PAREN FOUND
9286: ERB 089,DATA ARGUMENT IS MISSING A LEFT PAREN
9287: *
9288: * HERE AFTER SCANNING DATATYPE NAME
9289: *
9290: SDAT1 MOV XR,XL SAVE NAME PTR
9291: MOV SCLEN(XR),WA GET LENGTH
9292: CTB WA,SCSI$ COMPUTE SPACE NEEDED
9293: JSR ALOST REQUEST STATIC STORE FOR NAME
9294: MOV XR,-(XS) SAVE DATATYPE NAME
9295: MVW COPY NAME TO STATIC
9296: MOV (XS),XR GET NAME PTR
9297: ZER XL SCRUB DUD REGISTER
9298: JSR GTNVR LOCATE VRBLK FOR DATATYPE NAME
9299: ERR 090,DATA ARGUMENT HAS NULL DATATYPE NAME
9300: MOV XR,DATDV SAVE VRBLK POINTER FOR DATATYPE
9301: MOV XS,DATXS STORE STARTING STACK VALUE
9302: ZER WB ZERO COUNT OF FIELD NAMES
9303: *
9304: * LOOP TO SCAN FIELD NAMES AND STACK VRBLK POINTERS
9305: *
9306: SDAT2 MOV =CH$RP,WC DELIMITER ONE = RIGHT PAREN
9307: MOV =CH$CM,XL DELIMITER TWO = COMMA
9308: JSR XSCAN SCAN NEXT FIELD NAME
9309: BNZ WA,SDAT3 JUMP IF DELIMITER FOUND
9310: ERB 091,BAD BLANK OR MISSING RIGHT PAREN IN DATA ARG
9311: *
9312: * HERE AFTER SCANNING OUT ONE FIELD NAME
9313: *
9314: SDAT3 JSR GTNVR LOCATE VRBLK FOR FIELD NAME
9315: ERR 092,DATA ARGUMENT HAS NULL FIELD NAME
9316: MOV XR,-(XS) STACK VRBLK POINTER
9317: ICV WB INCREMENT COUNTER
9318: BEQ WA,=NUM02,SDAT2 LOOP BACK IF STOPPED BY COMMA
9319: EJC
9320: *
9321: * DATA (CONTINUED)
9322: *
9323: * NOW BUILD THE DFBLK
9324: *
9325: MOV =DFSI$,WA SET SIZE OF DFBLK STANDARD FIELDS
9326: ADD WB,WA ADD NUMBER OF FIELDS
9327: WTB WA CONVERT LENGTH TO BAUS
9328: MOV WB,WC PRESERVE NO. OF FIELDS
9329: JSR ALOST ALLOCATE SPACE FOR DFBLK
9330: MOV WC,WB GET NO OF FIELDS
9331: MOV DATXS,XT POINT TO START OF STACK
9332: MOV (XT),WC LOAD DATATYPE NAME
9333: MOV XR,(XT) SAVE DFBLK POINTER ON STACK
9334: MOV =B$DFC,(XR)+ STORE TYPE WORD
9335: MOV WB,(XR)+ STORE NUMBER OF FIELDS (FARGS)
9336: MOV WA,(XR)+ STORE LENGTH (DFLEN)
9337: SUB *PDDFS,WA COMPUTE PDBLK LENGTH (FOR DFPDL)
9338: MOV WA,(XR)+ STORE PDBLK LENGTH (DFPDL)
9339: MOV WC,(XR)+ STORE DATATYPE NAME (DFNAM)
9340: LCT WC,WB COPY NUMBER OF FIELDS
9341: *
9342: * LOOP TO MOVE FIELD NAME VRBLK POINTERS TO DFBLK
9343: *
9344: SDAT4 MOV -(XT),(XR)+ MOVE ONE FIELD NAME VRBLK POINTER
9345: BCT WC,SDAT4 LOOP TILL ALL MOVED
9346: *
9347: * NOW DEFINE THE DATATYPE FUNCTION
9348: *
9349: MOV WA,WC COPY LENGTH OF PDBLK FOR LATER LOOP
9350: MOV DATDV,XR POINT TO VRBLK
9351: MOV DATXS,XT POINT BACK ON STACK
9352: MOV (XT),XL LOAD DFBLK POINTER
9353: JSR DFFNC DEFINE FUNCTION
9354: EJC
9355: *
9356: * DATA (CONTINUED)
9357: *
9358: * LOOP TO BUILD FFBLKS
9359: *
9360: *
9361: * NOTICE THAT THE FFBLKS ARE CONSTRUCTED IN REVERSE ORDER
9362: * SO THAT THE REQUIRED OFFSETS CAN BE OBTAINED FROM
9363: * SUCCESSIVE DECREMENTATION OF THE PDBLK LENGTH (IN WC).
9364: *
9365: SDAT5 MOV *FFSI$,WA SET LENGTH OF FFBLK
9366: JSR ALLOC ALLOCATE SPACE FOR FFBLK
9367: MOV =B$FFC,(XR) SET TYPE WORD
9368: MOV =NUM01,FARGS(XR) STORE FARGS (ALWAYS ONE)
9369: MOV DATXS,XT POINT BACK ON STACK
9370: MOV (XT),FFDFP(XR) COPY DFBLK PTR TO FFBLK
9371: DCA WC DECREMENT OLD DFPDL TO GET NEXT OFS
9372: MOV WC,FFOFS(XR) SET OFFSET TO THIS FIELD
9373: ZER FFNXT(XR) TENTATIVELY SET ZERO FORWARD PTR
9374: MOV XR,XL COPY FFBLK POINTER FOR DFFNC
9375: MOV (XS),XR LOAD VRBLK POINTER FOR FIELD
9376: MOV VRFNC(XR),XR LOAD CURRENT FUNCTION POINTER
9377: BNE (XR),=B$FFC,SDAT6 SKIP IF NOT CURRENTLY A FIELD FUNC
9378: *
9379: * HERE WE MUST CHAIN AN OLD FFBLK PTR TO PRESERVE IT IN THE
9380: * CASE OF MULTIPLE FIELD FUNCTIONS WITH THE SAME NAME
9381: *
9382: MOV XR,FFNXT(XL) LINK NEW FFBLK TO PREVIOUS CHAIN
9383: *
9384: * MERGE HERE TO DEFINE FIELD FUNCTION
9385: *
9386: SDAT6 MOV (XS)+,XR LOAD VRBLK POINTER
9387: JSR DFFNC DEFINE FIELD FUNCTION
9388: BNE XS,DATXS,SDAT5 LOOP BACK TILL ALL DONE
9389: ICA XS POP DFBLK POINTER
9390: BRN EXNUL RETURN WITH NULL RESULT
9391: EJC
9392: *
9393: * DATATYPE
9394: *
9395: S$DTP ENT ENTRY POINT
9396: MOV (XS)+,XR LOAD ARGUMENT
9397: JSR DTYPE GET DATATYPE
9398: BRN EXIXR AND RETURN IT AS RESULT
9399: EJC
9400: *
9401: * DATE
9402: *
9403: S$DTE ENT ENTRY POINT
9404: JSR SYSDT CALL SYSTEM DATE ROUTINE
9405: MOV 1(XL),WA LOAD LENGTH FOR SBSTR
9406: BZE WA,EXNUL RETURN NULL IF LENGTH IS ZERO
9407: ZER WB SET ZERO OFFSET
9408: JSR SBSTR USE SBSTR TO BUILD SCBLK
9409: BRN EXIXR RETURN DATE STRING
9410: EJC
9411: *
9412: * DEFINE
9413: *
9414: S$DFN ENT ENTRY POINT
9415: MOV (XS)+,XR LOAD SECOND ARGUMENT
9416: ZER DEFLB ZERO LABEL POINTER IN CASE NULL
9417: BEQ XR,=NULLS,SDF01 JUMP IF NULL SECOND ARGUMENT
9418: JSR GTNVR ELSE FIND VRBLK FOR LABEL
9419: PPM SDF13 JUMP IF NOT A VARIABLE NAME
9420: MOV XR,DEFLB ELSE SET SPECIFIED ENTRY
9421: *
9422: * SCAN FUNCTION NAME
9423: *
9424: SDF01 JSR XSCNI PREPARE TO SCAN FIRST ARGUMENT
9425: ERR 093,DEFINE FIRST ARGUMENT IS NOT STRING
9426: ERR 094,DEFINE FIRST ARGUMENT IS NULL
9427: MOV =CH$PP,WC DELIMITER ONE = LEFT PAREN
9428: MOV WC,XL DELIMITER TWO = LEFT PAREN
9429: JSR XSCAN SCAN OUT FUNCTION NAME
9430: BNZ WA,SDF02 JUMP IF LEFT PAREN FOUND
9431: ERB 095,DEFINE FIRST ARGUMENT IS MISSING A LEFT PAREN
9432: *
9433: * HERE AFTER SCANNING OUT FUNCTION NAME
9434: *
9435: SDF02 JSR GTNVR GET VARIABLE NAME
9436: ERR 096,DEFINE FIRST ARGUMENT HAS NULL FUNCTION NAME
9437: MOV XR,DEFVR SAVE VRBLK POINTER FOR FUNCTION NAM
9438: ZER WB ZERO COUNT OF ARGUMENTS
9439: MOV XS,DEFXS SAVE INITIAL STACK POINTER
9440: BNZ DEFLB,SDF03 JUMP IF SECOND ARGUMENT GIVEN
9441: MOV XR,DEFLB ELSE DEFAULT IS FUNCTION NAME
9442: *
9443: * LOOP TO SCAN ARGUMENT NAMES AND STACK VRBLK POINTERS
9444: *
9445: SDF03 MOV =CH$RP,WC DELIMITER ONE = RIGHT PAREN
9446: MOV =CH$CM,XL DELIMITER TWO = COMMA
9447: JSR XSCAN SCAN OUT NEXT ARGUMENT NAME
9448: BZE WA,SDF14 FAIL IF RUNOUT
9449: JSR GTNVR GET VRBLK POINTER
9450: PPM SDF04 IGNORE NULL NAME
9451: MOV XR,-(XS) STACK ARGUMENT VRBLK POINTER
9452: ICV WB INCREMENT COUNTER
9453: BEQ WA,=NUM02,SDF03 LOOP BACK IF STOPPED BY A COMMA
9454: BRN SDF05 JUMP FOR RIGHT PAREN
9455: EJC
9456: *
9457: * DEFINE (CONTINUED)
9458: *
9459: * NULL ARG FOUND. CONTINUE IF STOPPED BY COMMA
9460: *
9461: SDF04 BEQ WA,=NUM02,SDF03 LOOP IF COMMA
9462: *
9463: * HERE AFTER SCANNING OUT FUNCTION ARGUMENT NAMES
9464: *
9465: SDF05 MOV WB,DEFNA SAVE NUMBER OF ARGUMENTS
9466: ZER WB ZERO COUNT OF LOCALS
9467: *
9468: * LOOP TO SCAN LOCAL NAMES AND STACK VRBLK POINTERS
9469: *
9470: SDF06 MOV =CH$CM,WC SET DELIMITER ONE = COMMA
9471: MOV WC,XL SET DELIMITER TWO = COMMA
9472: JSR XSCAN SCAN OUT NEXT LOCAL NAME
9473: BNZ WA,SDF07 SKIP IF COMMA FOUND
9474: BNZ XSCNB,SDF14 FAIL IF BAD BLANK, OK IF LAST LOC
9475: *
9476: * HERE AFTER SCANNING OUT A LOCAL NAME
9477: *
9478: SDF07 JSR GTNVR GET VRBLK POINTER
9479: PPM SDF08 IGNORE NULL NAME
9480: ICV WB IF OK, INCREMENT COUNT
9481: MOV XR,-(XS) STACK VRBLK POINTER
9482: BNZ WA,SDF06 LOOP BACK IF STOPPED BY A COMMA
9483: BRN SDF09 JUMP FOR END OF STRING
9484: *
9485: * NULL LOCAL
9486: *
9487: SDF08 BNZ WA,SDF06 LOOP IF COMMA AFTER NULL LOCAL
9488: EJC
9489: *
9490: * DEFINE (CONTINUED)
9491: *
9492: * HERE AFTER SCANNING LOCALS, BUILD PFBLK
9493: *
9494: SDF09 MOV WB,WA COPY COUNT OF LOCALS
9495: ADD DEFNA,WA ADD NUMBER OF ARGUMENTS
9496: MOV WA,WC SET SUM ARGS+LOCALS AS LOOP COUNT
9497: ADD =PFSI$,WA ADD SPACE FOR STANDARD FIELDS
9498: WTB WA CONVERT LENGTH TO BAUS
9499: JSR ALLOC ALLOCATE SPACE FOR PFBLK
9500: MOV XR,XL SAVE POINTER TO PFBLK
9501: MOV =B$PFC,(XR)+ STORE FIRST WORD
9502: MOV DEFNA,(XR)+ STORE NUMBER OF ARGUMENTS
9503: MOV WA,(XR)+ STORE LENGTH (PFLEN)
9504: MOV DEFVR,(XR)+ STORE VRBLK PTR FOR FUNCTION NAME
9505: MOV WB,(XR)+ STORE NUMBER OF LOCALS
9506: ZER (XR)+ DEAL WITH LABEL LATER
9507: ZER (XR)+ ZERO PFCTR
9508: ZER (XR)+ ZERO PFRTR
9509: BZE WC,SDF11 SKIP IF NO ARGS OR LOCALS
9510: MOV XL,WA KEEP PFBLK POINTER
9511: MOV DEFXS,XT POINT BEFORE ARGUMENTS
9512: LCT WC,WC GET COUNT OF ARGS+LOCALS FOR LOOP
9513: *
9514: * LOOP TO MOVE LOCALS AND ARGS TO PFBLK
9515: *
9516: SDF10 MOV -(XT),(XR)+ STORE ONE ENTRY AND BUMP POINTERS
9517: BCT WC,SDF10 LOOP TILL ALL STORED
9518: MOV WA,XL RECOVER PFBLK POINTER
9519: EJC
9520: *
9521: * DEFINE (CONTINUED)
9522: *
9523: * NOW DEAL WITH LABEL
9524: *
9525: SDF11 MOV DEFXS,XS POP STACK
9526: MOV DEFLB,XR POINT TO VRBLK FOR LABEL
9527: MOV VRLBL(XR),XR LOAD LABEL POINTER
9528: BNE (XR),=B$TRT,SDF12 SKIP IF NOT TRAPPED
9529: MOV TRLBL(XR),XR ELSE POINT TO REAL LABEL
9530: *
9531: * HERE AFTER LOCATING REAL LABEL POINTER
9532: *
9533: SDF12 BEQ XR,=STNDL,SDF13 JUMP IF LABEL IS NOT DEFINED
9534: MOV XR,PFCOD(XL) ELSE STORE LABEL POINTER
9535: MOV DEFVR,XR POINT BACK TO VRBLK FOR FUNCTION
9536: JSR DFFNC DEFINE FUNCTION
9537: BRN EXNUL AND EXIT RETURNING NULL
9538: *
9539: * HERE FOR ERRONEOUS LABEL
9540: *
9541: SDF13 ERB 097,DEFINE FUNCTION ENTRY POINT IS NOT DEFINED LABEL
9542: *
9543: * ERRONEOUS ARG OR LOCAL
9544: *
9545: SDF14 ERB 098,BAD BLANK OR MISSING RIGHT PAREN IN DEFINE ARG
9546: EJC
9547: *
9548: * DETACH
9549: *
9550: S$DET ENT ENTRY POINT
9551: MOV (XS)+,XR LOAD ARGUMENT
9552: JSR GTVAR LOCATE VARIABLE
9553: ERR 099,DETACH ARGUMENT IS NOT APPROPRIATE NAME
9554: MOV WA,-(XS) KEEP OFFSET
9555: ZER SDETF CLEAR FAIL FLAG
9556: MOV =TRTIN,WB TRACE TYPE
9557: ZER XR REMOVE TRBLK
9558: JSR TRCHN REMOVE ANY INPUT ASSOCIATION
9559: PPM SDET1 SKIP IF NO INPUT TRBLK
9560: MNZ SDETF NOTE TRBLK REMOVED
9561: *
9562: * REPEAT FOR OUTPUT TRBLK
9563: *
9564: SDET1 MOV (XS)+,WA RECOVER OFFSET
9565: MOV =TRTOU,WB TRTYP
9566: JSR TRCHN REMOVE ANY OUTPUT ASSOCIATION
9567: PPM SDET2 SKIP IF NO TRBLK
9568: BRN EXNUL SUCCEED
9569: *
9570: * CHECK AT LEAST ONE TRBLK REMOVED
9571: *
9572: SDET2 BNZ SDETF,EXNUL SUCCEED IF SO
9573: BRN EXFAL ELSE FAIL
9574: EJC
9575: *
9576: * DIFFER
9577: *
9578: S$DIF ENT ENTRY POINT
9579: MOV (XS)+,XR LOAD SECOND ARGUMENT
9580: MOV (XS)+,XL LOAD FIRST ARGUMENT
9581: JSR IDENT CALL IDENT COMPARISON ROUTINE
9582: PPM EXFAL FAIL IF IDENT
9583: BRN EXNUL RETURN NULL IF DIFFER
9584: EJC
9585: *
9586: * DUMP
9587: *
9588: S$DMP ENT ENTRY POINT
9589: JSR GTSMI LOAD DUMP ARG AS SMALL INTEGER
9590: ERR 100,DUMP ARGUMENT IS NOT INTEGER
9591: ERR 101,DUMP ARGUMENT IS NEGATIVE OR TOO LARGE
9592: JSR DUMPR ELSE CALL DUMP ROUTINE
9593: BRN EXNUL AND RETURN NULL AS RESULT
9594: EJC
9595: *
9596: * DUPL
9597: *
9598: S$DUP ENT ENTRY POINT
9599: JSR GTSMI GET SECOND ARGUMENT AS SMALL INTEGE
9600: ERR 102,DUPL SECOND ARGUMENT IS NOT INTEGER
9601: PPM SDUP7 JUMP IF NEGATIVE OT TOO BIG
9602: MOV XR,WB SAVE DUPLICATION FACTOR
9603: JSR GTSTG GET FIRST ARG AS STRING
9604: PPM SDUP4 JUMP IF NOT A STRING
9605: *
9606: * HERE FOR CASE OF DUPLICATION OF A STRING
9607: *
9608: MTI WA ACQUIRE LENGTH AS INTEGER
9609: STI DUPSI SAVE FOR THE MOMENT
9610: MTI WB GET DUPLICATION FACTOR AS INTEGER
9611: MLI DUPSI FORM PRODUCT
9612: IOV SDUP3 JUMP IF OVERFLOW
9613: IEQ EXNUL RETURN NULL IF RESULT LENGTH = 0
9614: MFI WA,SDUP3 GET AS ADDR INTEGER, CHECK OVFLO
9615: *
9616: * MERGE HERE WITH RESULT LENGTH IN WA
9617: *
9618: SDUP1 MOV XR,XL SAVE STRING POINTER
9619: JSR ALOCS ALLOCATE SPACE FOR STRING
9620: MOV XR,-(XS) SAVE AS RESULT POINTER
9621: MOV XL,WC SAVE POINTER TO ARGUMENT STRING
9622: PSC XR PREPARE TO STORE CHARS OF RESULT
9623: LCT WB,WB SET COUNTER TO CONTROL LOOP
9624: *
9625: * LOOP THROUGH DUPLICATIONS
9626: *
9627: SDUP2 MOV WC,XL POINT BACK TO ARGUMENT STRING
9628: MOV SCLEN(XL),WA GET NUMBER OF CHARACTERS
9629: PLC XL POINT TO CHARS IN ARGUMENT STRING
9630: MVC MOVE CHARACTERS TO RESULT STRING
9631: BCT WB,SDUP2 LOOP TILL ALL DUPLICATIONS DONE
9632: BRN EXITS THEN EXIT FOR NEXT CODE WORD
9633: EJC
9634: *
9635: * DUPL (CONTINUED)
9636: *
9637: * HERE IF TOO LARGE, SET MAX LENGTH AND LET ALOCS CATCH IT
9638: *
9639: SDUP3 MOV DNAME,WA SET IMPOSSIBLE LENGTH FOR ALOCS
9640: BRN SDUP1 MERGE BACK
9641: *
9642: * HERE IF NOT A STRING
9643: *
9644: SDUP4 JSR GTPAT CONVERT ARGUMENT TO PATTERN
9645: ERR 103,DUPL FIRST ARGUMENT IS NOT STRING OR PATTERN
9646: *
9647: * HERE TO DUPLICATE A PATTERN ARGUMENT
9648: *
9649: MOV XR,-(XS) STORE PATTERN ON STACK
9650: MOV =NDNTH,XR START OFF WITH NULL PATTERN
9651: BZE WB,SDUP6 NULL PATTERN IS RESULT IF DUPFAC=0
9652: MOV WB,-(XS) PRESERVE LOOP COUNT
9653: *
9654: * LOOP TO DUPLICATE BY SUCCESSIVE CONCATENATION
9655: *
9656: SDUP5 MOV XR,XL COPY CURRENT VALUE AS RIGHT ARGUMNT
9657: MOV 1(XS),XR GET A NEW COPY OF LEFT
9658: JSR PCONC CONCATENATE
9659: DCV (XS) COUNT DOWN
9660: BNZ (XS),SDUP5 LOOP
9661: ICA XS POP LOOP COUNT
9662: *
9663: * HERE TO EXIT AFTER CONSTRUCTING PATTERN
9664: *
9665: SDUP6 MOV XR,(XS) STORE RESULT ON STACK
9666: BRN EXITS EXIT WITH RESULT ON STACK
9667: *
9668: * FAIL IF SECOND ARG IS OUT OF RANGE
9669: *
9670: SDUP7 ICA XS POP FIRST ARGUMENT
9671: BRN EXFAL FAIL
9672: EJC
9673: *
9674: * EJECT
9675: *
9676: S$EJC ENT ENTRY POINT
9677: MOV (XS)+,WB GET ARGUMENT
9678: MOV WB,-(XS) RESTACK IT
9679: JSR GTSTG CONVERT TO STRING
9680: PPM SEJC2 FAIL IF CANT
9681: BZE WA,SEJC1 SKIP IF NULL STRING
9682: MOV WB,-(XS) RESTACK ORIGINAL ARG
9683: JSR IOFTG CALL FILETAG ROUTINE
9684: PPM SEJC2 FAIL
9685: BZE WA,EXFAL FAIL IF NOT ASSOCIATED
9686: JSR SYSEF CALL EJECT FILE FUNCTION
9687: PPM EXFAL FAIL RETURN
9688: PPM EROSI ERROR RETURN
9689: BRN EXNUL RETURN NULL AS RESULT
9690: *
9691: * HERE TO EJECT STANDARD OUTPUT FILE
9692: *
9693: SEJC1 JSR SYSEP CALL ROUTINE TO EJECT PRINTER
9694: PPM EXFAL FAIL RETURN
9695: PPM EROSI ERROR RETURN
9696: BRN EXNUL EXIT WITH NULL RESULT
9697: *
9698: * ERROR POINT
9699: *
9700: SEJC2 ERB 104,EJECT ARGUMENT IS NOT A SUITABLE FILETAG
9701: EJC
9702: *
9703: * ENDFILE
9704: *
9705: S$ENF ENT ENTRY POINT
9706: JSR GTSTG CONVERT SECOND ARG TO STRING
9707: ERR 105,ENDFILE SECOND ARGUMENT IS NOT A STRING
9708: BNZ WA,SENF1 SKIP IF NON NULL SECOND ARG
9709: ZER XR 0 IF NULL
9710: *
9711: * NOW PROCESS FILETAG
9712: *
9713: SENF1 MOV XR,SENFR KEEP SECOND ARG
9714: JSR IOFTG CALL FILETAG PROC (WB = VRBLK PTR)
9715: ERR 106,ENDFILE FIRST ARGUMENT IS NOT A SUITABLE FILETAG
9716: BZE WA,EXFAL FAIL IF NO IOTAG
9717: MOV SENFR,XR RECOVER SECOND ARG
9718: JSR SYSEN CALL ENDFILE ROUTINE
9719: PPM EXFAL FAIL RETURN
9720: PPM EROSI ERROR RETURN
9721: BNZ WA,EXNUL RETURN NULL IF NO FILE CLOSURE
9722: MOV WB,XL POINT TO FILETAG VRBLK
9723: MOV *VRVAL,WA OFFSET TO VALUE FIELD
9724: ZER XR FOR TRBLK REMOVAL
9725: MOV =TRTIO,WB TRTYP
9726: JSR TRCHN REMOVE TRBLK
9727: PPM EXFAL (CANT FAIL HERE)
9728: BRN EXNUL RETURN NULL
9729: EJC
9730: *
9731: * EQ
9732: *
9733: S$EQF ENT ENTRY POINT
9734: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE
9735: ERR 107,EQ FIRST ARGUMENT IS NOT NUMERIC
9736: ERR 108,EQ SECOND ARGUMENT IS NOT NUMERIC
9737: PPM EXFAL FAIL IF LT
9738: PPM EXNUL RETURN NULL IF EQ
9739: PPM EXFAL FAIL IF GT
9740: EJC
9741: *
9742: * EVAL
9743: *
9744: S$EVL ENT ENTRY POINT
9745: MOV (XS)+,XR LOAD ARGUMENT
9746: JSR GTEXP CONVERT TO EXPRESSION
9747: ERR 109,EVAL ARGUMENT IS NOT EXPRESSION
9748: LCW WC LOAD NEXT CODE WORD
9749: BNE WC,=OFNE$,SEVL1 JUMP IF CALLED BY VALUE
9750: SCP XL COPY CODE POINTER
9751: MOV (XL),WA GET NEXT CODE WORD
9752: BNE WA,=ORNM$,SEVL2 BY NAME UNLESS EXPRESSION
9753: BNZ 1(XS),SEVL2 JUMP IF BY NAME
9754: *
9755: * HERE IF CALLED BY VALUE
9756: *
9757: SEVL1 ZER WB SET FLAG FOR BY VALUE
9758: MOV WC,-(XS) SAVE CODE WORD
9759: JSR EVALX EVALUATE EXPRESSION BY VALUE
9760: PPM EXFAL FAIL IF EVALUATION FAILS
9761: MOV XR,XL COPY RESULT
9762: MOV (XS),XR RELOAD NEXT CODE WORD
9763: MOV XL,(XS) STACK RESULT
9764: BRI (XR) JUMP TO EXECUTE NEXT CODE WORD
9765: *
9766: * HERE IF CALLED BY NAME
9767: *
9768: SEVL2 MOV =NUM01,WB SET FLAG FOR BY NAME
9769: JSR EVALX EVALUATE EXPRESSION BY NAME
9770: PPM EXFAL FAIL IF EVALUATION FAILS
9771: BRN EXNAM EXIT WITH NAME
9772: .IF .CNEX
9773: .ELSE
9774: EJC
9775: *
9776: * EXIT
9777: *
9778: S$EXT ENT ENTRY POINT
9779: ZER WB CLEAR AMOUNT OF STATIC SHIFT
9780: JSR GBCOL COMPACT MEMORY BY COLLECTING
9781: JSR GTSTG CONVERT ARG TO STRING
9782: ERR 110,EXIT ARGUMENT IS NOT SUITABLE INTEGER OR STRING
9783: MOV XR,XL COPY STRING PTR
9784: JSR GTINT CHECK IT IS INTEGER
9785: PPM SEXT1 SKIP IF UNCONVERTIBLE
9786: ZER XL NOTE IT IS INTEGER
9787: LDI ICVAL(XR) GET INTEGER ARG
9788: *
9789: * MERGE TO CALL OSINT EXIT ROUTINE
9790: *
9791: SEXT1 MOV =HEADV,XR POINT TO V.V STRING
9792: MOV =KVCOD,WA VALUE OF CODE KEYWORD
9793: JSR SYSXI CALL EXTERNAL ROUTINE
9794: PPM EXFAL FAIL RETURN
9795: PPM EROSI ERROR RETURN
9796: IEQ EXNUL RETURN IF ARGUMENT 0
9797: ZER GBCNT RESUMING EXECUTION SO.
9798: IGT SEXT2 SKIP IF POSITIVE
9799: NGI MAKE POSITIVE
9800: *
9801: * CHECK FOR OPTION RESPECIFICATION
9802: *
9803: SEXT2 MFI WC GET VALUE IN WORK REGISTER
9804: BEQ WC,=NUM03,SEXT3 SKIP IF WAS 3
9805: MOV WC,-(XS) SAVE VALUE
9806: ZER WC SET TO READ OPTIONS
9807: JSR PRPAR READ SYSPP OPTIONS
9808: MOV (XS)+,WA RESTORE VALUE
9809: *
9810: * DEAL WITH HEADER OPTIONS (FIDDLED BY PRPAR)
9811: *
9812: SEXT3 MNZ HEADP ASSUME NO HEADERS
9813: BNE WC,=NUM01,SEXT4 SKIP IF NOT 1
9814: ZER HEADP REQUEST HEADER PRINTING
9815: *
9816: * ALMOST READY TO RESUME RUNNING
9817: *
9818: SEXT4 JSR SYSTM GET RECOMMENCEMENT TIME
9819: STI TIMSX SAVE AS INITIAL TIME
9820: LDI KVSTC RESET TO ENSURE ...
9821: STI KVSTL ... CORRECT EXECUTION STATS
9822: BRN EXNUL RESUME EXECUTION
9823: .FI
9824: .IF .CNFN
9825: .ELSE
9826: EJC
9827: *
9828: * FENCE
9829: *
9830: S$FNC ENT ENTRY POINT
9831: MOV =P$FNC,WB SET PCODE FOR P$FNC
9832: ZER XR P0BLK
9833: JSR PBILD BUILD P$FNC NODE
9834: MOV XR,XL SAVE POINTER TO IT
9835: MOV (XS)+,XR GET ARGUMENT
9836: JSR GTPAT CONVERT TO PATTERN
9837: ERR 180,FENCE ARGUMENT IS NOT PATTERN
9838: JSR PCONC CONCATENATE TO P$FNC NODE
9839: MOV XR,XL SAVE PTR TO CONCATENATED PATTERN
9840: MOV =P$FNA,WB SET FOR P$FNA PCODE
9841: ZER XR P0BLK
9842: JSR PBILD CONSTRUCT P$FNA NODE
9843: MOV XL,PTHEN(XR) SET PATTERN AS PTHEN
9844: MOV XR,-(XS) SET AS RESULT
9845: BRN EXITS DO NEXT CODE WORD
9846: EJC
9847: .FI
9848: *
9849: * FIELD
9850: *
9851: S$FLD ENT ENTRY POINT
9852: JSR GTSMI GET SECOND ARGUMENT (FIELD NUMBER)
9853: ERR 255,FIELD SECOND ARGUMENT IS NOT INTEGER
9854: PPM EXFAL FAIL IF OUT OF RANGE
9855: MOV XR,WB ELSE SAVE INTEGER VALUE
9856: MOV (XS)+,XR LOAD FIRST ARGUMENT
9857: JSR GTNVR POINT TO VRBLK
9858: PPM SFLD1 JUMP (ERROR) IF NOT VARIABLE NAME
9859: MOV VRFNC(XR),XR ELSE POINT TO FUNCTION BLOCK
9860: BNE (XR),=B$DFC,SFLD1 ERROR IF NOT DATATYPE FUNCTION
9861: *
9862: * HERE IF FIRST ARGUMENT IS A DATATYPE FUNCTION NAME
9863: *
9864: BZE WB,EXFAL FAIL IF ARGUMENT NUMBER IS ZERO
9865: BGT WB,FARGS(XR),EXFAL FAIL IF TOO LARGE
9866: WTB WB ELSE CONVERT TO BYTE OFFSET
9867: ADD WB,XR POINT TO FIELD NAME
9868: MOV DFFLB(XR),XR LOAD VRBLK POINTER
9869: BRN EXVNM EXIT TO BUILD NMBLK
9870: *
9871: * HERE FOR BAD FIRST ARGUMENT
9872: *
9873: SFLD1 ERB 254,FIELD FIRST ARGUMENT IS NOT DATATYPE NAME
9874: EJC
9875: *
9876: * GE
9877: *
9878: S$GEF ENT ENTRY POINT
9879: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE
9880: ERR 111,GE FIRST ARGUMENT IS NOT NUMERIC
9881: ERR 112,GE SECOND ARGUMENT IS NOT NUMERIC
9882: PPM EXFAL FAIL IF LT
9883: PPM EXNUL RETURN NULL IF EQ
9884: PPM EXNUL RETURN NULL IF GT
9885: *
9886: * GT
9887: *
9888: S$GTF ENT ENTRY POINT
9889: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE
9890: ERR 113,GT FIRST ARGUMENT IS NOT NUMERIC
9891: ERR 114,GT SECOND ARGUMENT IS NOT NUMERIC
9892: PPM EXFAL FAIL IF LT
9893: PPM EXFAL FAIL IF EQ
9894: PPM EXNUL RETURN NULL IF GT
9895: EJC
9896: *
9897: * HOST
9898: *
9899: S$HST ENT ENTRY POINT
9900: JSR GTSTG CONVERT ARG TO STRING
9901: ERR 115,ERRONEOUS THIRD ARGUMENT FOR HOST
9902: MOV WA,WB KEEP LENGTH
9903: MOV XR,WC KEEP THIRD ARG
9904: JSR GTSTG CONVERT ARG TO STRING
9905: ERR 116,ERRONEOUS SECOND ARGUMENT FOR HOST
9906: ORB WA,WB NON ZERO UNLESS TWO ARGS NULL
9907: MOV XR,XL KEEP SECOND ARG
9908: JSR GTSTG CONVERT ARG TO STRING
9909: ERR 117,ERRONEOUS FIRST ARGUMENT FOR HOST
9910: ORB WA,WB NON ZERO UNLESS ALL ARGS NULL
9911: MOV XR,WA KEEP FIRST ARG
9912: MOV WC,XR GET THIRD ARG
9913: JSR SYSHS CALL SYSHS ROUTINE
9914: PPM EXFAL FAIL RETURN
9915: PPM EROSI ERROR RETURN
9916: MOV SCLEN(XL),WA LENGTH OF RETURNED STRING
9917: ZER WB ZERO OFFSET
9918: JSR SBSTR BUILD COPY OF STRING
9919: MOV XR,-(XS) STACK THE RESULT
9920: BRN EXITS RETURN RESULT ON STACK
9921: EJC
9922: *
9923: * IDENT
9924: *
9925: S$IDN ENT ENTRY POINT
9926: MOV (XS)+,XR LOAD SECOND ARGUMENT
9927: MOV (XS)+,XL LOAD FIRST ARGUMENT
9928: JSR IDENT CALL IDENT COMPARISON ROUTINE
9929: PPM EXNUL RETURN NULL IF IDENT
9930: BRN EXFAL FAIL IF DIFFER
9931: EJC
9932: *
9933: * INPUT
9934: *
9935: S$INP ENT ENTRY POINT
9936: ZER WB INPUT FLAG
9937: JSR IOPUT CALL INPUT/OUTPUT ASSOC. ROUTINE
9938: ERR 118,INPUT THIRD ARGUMENT (FILEPROPS) IS NOT A STRING
9939: ERR 119,INAPPROPRIATE SECOND ARGUMENT (FILETAG) FOR INPUT
9940: ERR 120,INAPPROPRIATE FIRST ARGUMENT FOR INPUT
9941: PPM EXFAL FAIL RETURN
9942: BRN EXNUL RETURN NULL STRING
9943: .IF .CNBF
9944: .ELSE
9945: EJC
9946: *
9947: * INSERT
9948: *
9949: S$INS ENT ENTRY POINT
9950: MOV (XS)+,XL GET STRING ARG
9951: JSR GTSMI GET REPLACE LENGTH
9952: ERR 121,INSERT THIRD ARGUMENT NOT INTEGER
9953: PPM EXFAL FAIL IF OUT OF RANGE
9954: MOV WC,WB COPY TO PROPER REG
9955: JSR GTSMI GET REPLACE POSITION
9956: ERR 122,INSERT SECOND ARGUMENT NOT INTEGER
9957: PPM EXFAL FAIL IF OUT OF RANGE
9958: BZE WC,EXFAL FAIL IF ZERO
9959: DCV WC DECREMENT TO GET OFFSET
9960: MOV WC,WA PUT IN PROPER REGISTER
9961: MOV (XS)+,XR GET BUFFER
9962: BEQ (XR),=B$BCT,SINS1 PRESS ON IF TYPE OK
9963: ERB 123,INSERT FIRST ARGUMENT NOT BUFFER
9964: *
9965: * HERE WHEN EVERYTHING LOADED UP
9966: *
9967: SINS1 JSR INSBF CALL TO INSERT
9968: ERR 124,INSERT FOURTH ARGUMENT NOT A STRING
9969: PPM EXFAL FAIL IF OUT OF RANGE
9970: BRN EXNUL ELSE OK - EXIT WITH NULL
9971: .FI
9972: EJC
9973: *
9974: * INTEGER
9975: *
9976: S$INT ENT ENTRY POINT
9977: MOV (XS)+,XR LOAD ARGUMENT
9978: JSR GTNUM CONVERT TO NUMERIC
9979: PPM EXFAL FAIL IF NON-NUMERIC
9980: BEQ WA,=B$ICL,EXNUL RETURN NULL IF INTEGER
9981: BRN EXFAL FAIL IF REAL
9982: EJC
9983: *
9984: * ITC
9985: *
9986: S$ITC ENT
9987: JSR GTSMI OBTAIN ARG AS AN INTEGER
9988: ERR 125,ITC ARGUMENT IS NOT A SMALL INTEGER
9989: PPM EXFAL FAIL IF OUT OF RANGE
9990: BGE WC,=CFP$A,EXFAL FURTHER RANGE CHECK
9991: MOV WC,WB PRESERVE WC
9992: MOV =NUM01,WA FOR SCBLK REQUEST
9993: JSR ALOCS BUILD STRING BLOCK
9994: MOV XR,XL COPY STRING PTR
9995: PSC XL READY TO STORE CHAR
9996: SCH WB,(XL) STORE IT
9997: ZER XL CLEAR GARBAGE
9998: BRN EXIXR RETURN STRING RESULT
9999: EJC
10000: *
10001: * ITEM
10002: *
10003: * ITEM DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT
10004: * WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED.
10005: *
10006: S$ITM ENT ENTRY POINT
10007: *
10008: * DEAL WITH CASE OF NO ARGS
10009: *
10010: BNZ WA,SITM1 JUMP IF AT LEAST ONE ARG
10011: MOV =NULLS,-(XS) ELSE SUPPLY GARBAGE NULL ARG
10012: MOV =NUM01,WA AND FIX ARGUMENT COUNT
10013: *
10014: * CHECK FOR NAME/VALUE CASES
10015: *
10016: SITM1 SCP XR GET CURRENT CODE POINTER
10017: MOV (XR),XL LOAD NEXT CODE WORD
10018: DCV WA GET NUMBER OF SUBSCRIPTS
10019: MOV WA,XR COPY FOR ARREF
10020: BEQ XL,=OFNE$,SITM2 JUMP IF CALLED BY NAME
10021: *
10022: * HERE IF CALLED BY VALUE
10023: *
10024: ZER WB SET CODE FOR CALL BY VALUE
10025: BRN ARREF OFF TO ARRAY REFERENCE ROUTINE
10026: *
10027: * HERE FOR CALL BY NAME
10028: *
10029: SITM2 MNZ WB SET CODE FOR CALL BY NAME
10030: LCW WA LOAD AND IGNORE OFNE$ CALL
10031: BRN ARREF OFF TO ARRAY REFERENCE ROUTINE
10032: EJC
10033: *
10034: * LE
10035: *
10036: S$LEF ENT ENTRY POINT
10037: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE
10038: ERR 126,LE FIRST ARGUMENT IS NOT NUMERIC
10039: ERR 127,LE SECOND ARGUMENT IS NOT NUMERIC
10040: PPM EXNUL RETURN NULL IF LT
10041: PPM EXNUL RETURN NULL IF EQ
10042: PPM EXFAL FAIL IF GT
10043: EJC
10044: *
10045: * LEN
10046: *
10047: S$LEN ENT ENTRY POINT
10048: MOV =P$LEN,WB SET PCODE FOR INTEGER ARG CASE
10049: MOV =P$LND,WA SET PCODE FOR EXPR ARG CASE
10050: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE
10051: ERR 128,LEN ARGUMENT IS NOT INTEGER OR EXPRESSION
10052: ERR 129,LEN ARGUMENT IS NEGATIVE OR TOO LARGE
10053: BRN EXIXR RETURN PATTERN NODE
10054: EJC
10055: *
10056: * LEQ
10057: *
10058: S$LEQ ENT ENTRY POINT
10059: JSR LCOMP CALL STRING COMPARISON ROUTINE
10060: ERR 130,LEQ FIRST ARGUMENT IS NOT STRING
10061: ERR 131,LEQ SECOND ARGUMENT IS NOT STRING
10062: PPM EXFAL FAIL IF LLT
10063: PPM EXNUL RETURN NULL IF LEQ
10064: PPM EXFAL FAIL IF LGT
10065: EJC
10066: *
10067: * LGE
10068: *
10069: S$LGE ENT ENTRY POINT
10070: JSR LCOMP CALL STRING COMPARISON ROUTINE
10071: ERR 132,LGE FIRST ARGUMENT IS NOT STRING
10072: ERR 133,LGE SECOND ARGUMENT IS NOT STRING
10073: PPM EXFAL FAIL IF LLT
10074: PPM EXNUL RETURN NULL IF LEQ
10075: PPM EXNUL RETURN NULL IF LGT
10076: EJC
10077: *
10078: * LGT
10079: *
10080: S$LGT ENT ENTRY POINT
10081: JSR LCOMP CALL STRING COMPARISON ROUTINE
10082: ERR 134,LGT FIRST ARGUMENT IS NOT STRING
10083: ERR 135,LGT SECOND ARGUMENT IS NOT STRING
10084: PPM EXFAL FAIL IF LLT
10085: PPM EXFAL FAIL IF LEQ
10086: PPM EXNUL RETURN NULL IF LGT
10087: EJC
10088: *
10089: * LLE
10090: *
10091: S$LLE ENT ENTRY POINT
10092: JSR LCOMP CALL STRING COMPARISON ROUTINE
10093: ERR 136,LLE FIRST ARGUMENT IS NOT STRING
10094: ERR 137,LLE SECOND ARGUMENT IS NOT STRING
10095: PPM EXNUL RETURN NULL IF LLT
10096: PPM EXNUL RETURN NULL IF LEQ
10097: PPM EXFAL FAIL IF LGT
10098: EJC
10099: *
10100: * LLT
10101: *
10102: S$LLT ENT ENTRY POINT
10103: JSR LCOMP CALL STRING COMPARISON ROUTINE
10104: ERR 138,LLT FIRST ARGUMENT IS NOT STRING
10105: ERR 139,LLT SECOND ARGUMENT IS NOT STRING
10106: PPM EXNUL RETURN NULL IF LLT
10107: PPM EXFAL FAIL IF LEQ
10108: PPM EXFAL FAIL IF LGT
10109: EJC
10110: *
10111: * LNE
10112: *
10113: S$LNE ENT ENTRY POINT
10114: JSR LCOMP CALL STRING COMPARISON ROUTINE
10115: ERR 140,LNE FIRST ARGUMENT IS NOT STRING
10116: ERR 141,LNE SECOND ARGUMENT IS NOT STRING
10117: PPM EXNUL RETURN NULL IF LLT
10118: PPM EXFAL FAIL IF LEQ
10119: PPM EXNUL RETURN NULL IF LGT
10120: .IF .CNLD
10121: .ELSE
10122: EJC
10123: *
10124: * LOAD
10125: *
10126: S$LOD ENT ENTRY POINT
10127: JSR GTSTG LOAD LIBRARY NAME
10128: ERR 142,LOAD SECOND ARGUMENT IS NOT STRING
10129: MOV XR,XL SAVE LIBRARY NAME
10130: JSR XSCNI PREPARE TO SCAN FIRST ARGUMENT
10131: ERR 143,LOAD FIRST ARGUMENT IS NOT STRING
10132: ERR 144,LOAD FIRST ARGUMENT IS NULL
10133: MOV XL,-(XS) STACK LIBRARY NAME
10134: MOV =CH$PP,WC SET DELIMITER ONE = LEFT PAREN
10135: MOV WC,XL SET DELIMITER TWO = LEFT PAREN
10136: JSR XSCAN SCAN FUNCTION NAME
10137: MOV XR,-(XS) SAVE PTR TO FUNCTION NAME
10138: BNZ WA,SLOD1 JUMP IF LEFT PAREN FOUND
10139: ERB 145,LOAD FIRST ARGUMENT IS MISSING A LEFT PAREN
10140: *
10141: * HERE AFTER SUCCESSFULLY SCANNING FUNCTION NAME
10142: *
10143: SLOD1 JSR GTNVR LOCATE VRBLK
10144: ERR 146,LOAD FIRST ARGUMENT HAS NULL FUNCTION NAME
10145: MOV XR,LODFN SAVE VRBLK POINTER
10146: ZER LODNA ZERO COUNT OF ARGUMENTS
10147: *
10148: * LOOP TO SCAN ARGUMENT DATATYPE NAMES
10149: *
10150: SLOD2 MOV =CH$RP,WC DELIMITER ONE IS RIGHT PAREN
10151: MOV =CH$CM,XL DELIMITER TWO IS COMMA
10152: JSR XSCAN SCAN NEXT ARGUMENT NAME
10153: ICV LODNA BUMP ARGUMENT COUNT
10154: BNZ WA,SLOD3 JUMP IF OK DELIMITER WAS FOUND
10155: ERB 147,BAD BLANK OR MISSING RIGHT PAREN IN LOAD ARG
10156: EJC
10157: *
10158: * LOAD (CONTINUED)
10159: *
10160: * COME HERE TO ANALYZE THE DATATYPE POINTER IN (XR). THIS
10161: * CODE IS USED BOTH FOR ARGUMENTS (WA=1,2) AND FOR THE
10162: * RESULT DATATYPE (WITH WA SET TO ZERO).
10163: *
10164: SLOD3 MOV XR,-(XS) STACK DATATYPE NAME POINTER
10165: MOV =NUM01,WB SET STRING CODE IN CASE (1)
10166: MOV =SCSTR,XL POINT TO /STRING/
10167: JSR IDENT CHECK FOR MATCH
10168: PPM SLOD4 JUMP IF MATCH
10169: MOV (XS),XR ELSE RELOAD NAME
10170: ADD WB,WB SET CODE FOR INTEGER (2)
10171: MOV =SCINT,XL POINT TO /INTEGER/
10172: JSR IDENT CHECK FOR MATCH
10173: PPM SLOD4 JUMP IF MATCH
10174: ICV WB ELSE SET CODE FOR REAL (3)
10175: .IF .CNRA
10176: .ELSE
10177: MOV (XS),XR RELOAD STRING POINTER
10178: MOV =SCREA,XL POINT TO /REAL/
10179: JSR IDENT CHECK FOR MATCH
10180: PPM SLOD4 JUMP IF MATCH
10181: .FI
10182: ICV WB SET CODE FOR BUFFER (4)
10183: .IF .CNBF
10184: .ELSE
10185: MOV (XS),XR RELOAD STRING POINTER
10186: MOV =SCBUF,XL POINT TO /BUFFER/
10187: JSR IDENT CHECK FOR MATCH
10188: PPM SLOD4 JUMP IF MATCH
10189: .FI
10190: ZER WB ELSE GET CODE FOR NO CONVERT
10191: *
10192: * MERGE HERE WITH PROPER DATATYPE CODE IN WB
10193: *
10194: SLOD4 MOV WB,(XS) STORE CODE ON STACK
10195: BEQ WA,=NUM02,SLOD2 LOOP BACK IF ARG STOPPED BY COMMA
10196: BZE WA,SLOD5 JUMP IF THAT WAS THE RESULT TYPE
10197: *
10198: * HERE WE SCAN OUT THE RESULT TYPE (ARG STOPPED BY ) )
10199: *
10200: MOV MXLEN,WC SET DUMMY (IMPOSSIBLE) DELIMITER 1
10201: MOV WC,XL AND DELIMITER TWO
10202: JSR XSCAN SCAN RESULT NAME
10203: ZER WA SET CODE FOR PROCESSING RESULT
10204: BRN SLOD3 JUMP BACK TO PROCESS RESULT NAME
10205: EJC
10206: *
10207: * LOAD (CONTINUED)
10208: *
10209: * HERE AFTER PROCESSING ALL ARGS AND RESULT
10210: *
10211: SLOD5 MOV LODNA,WA GET NUMBER OF ARGUMENTS
10212: MOV WA,WC COPY FOR LATER
10213: WTB WA CONVERT LENGTH TO BAUS
10214: ADD *EFSI$,WA ADD SPACE FOR STANDARD FIELDS
10215: JSR ALLOC ALLOCATE EFBLK
10216: MOV =B$EFC,(XR) SET TYPE WORD
10217: MOV WC,FARGS(XR) SET NUMBER OF ARGUMENTS
10218: ZER EFUSE(XR) SET USE COUNT (DFFNC WILL SET TO 1)
10219: ZER EFCOD(XR) ZERO CODE POINTER FOR NOW
10220: MOV (XS)+,EFRSL(XR) STORE RESULT TYPE CODE
10221: MOV LODFN,EFVAR(XR) STORE FUNCTION VRBLK POINTER
10222: MOV WA,EFLEN(XR) STORE EFBLK LENGTH
10223: MOV XR,WB SAVE EFBLK POINTER
10224: ADD WA,XR POINT PAST END OF EFBLK
10225: LCT WC,WC SET NUMBER OF ARGUMENTS FOR LOOP
10226: *
10227: * LOOP TO SET ARGUMENT TYPE CODES FROM STACK
10228: *
10229: SLOD6 MOV (XS)+,-(XR) STORE ONE TYPE CODE FROM STACK
10230: BCT WC,SLOD6 LOOP TILL ALL STORED
10231: *
10232: * NOW LOAD THE EXTERNAL FUNCTION AND PERFORM DEFINITION
10233: *
10234: MOV (XS)+,XR LOAD FUNCTION STRING NAME
10235: MOV (XS),XL LOAD LIBRARY NAME
10236: MOV WB,(XS) STORE EFBLK POINTER
10237: JSR SYSLD CALL FUNCTION TO LOAD EXTERNAL FUNC
10238: PPM EXFAL FAIL RETURN
10239: PPM EROSI ERROR RETURN
10240: MOV (XS)+,XL RECALL EFBLK POINTER
10241: MOV XR,EFCOD(XL) STORE CODE POINTER
10242: MOV LODFN,XR POINT TO VRBLK FOR FUNCTION
10243: JSR DFFNC PERFORM FUNCTION DEFINITION
10244: BRN EXNUL RETURN NULL RESULT
10245: .FI
10246: EJC
10247: *
10248: * LOCAL
10249: *
10250: S$LOC ENT ENTRY POINT
10251: JSR GTSMI GET SECOND ARGUMENT (LOCAL NUMBER)
10252: ERR 256,LOCAL SECOND ARGUMENT IS NOT INTEGER
10253: PPM EXFAL FAIL IF OUT OF RANGE
10254: MOV XR,WB SAVE LOCAL NUMBER
10255: MOV (XS)+,XR LOAD FIRST ARGUMENT
10256: JSR GTNVR POINT TO VRBLK
10257: PPM SLOC1 JUMP IF NOT VARIABLE NAME
10258: MOV VRFNC(XR),XR ELSE LOAD FUNCTION POINTER
10259: BNE (XR),=B$PFC,SLOC1 JUMP IF NOT PROGRAM DEFINED
10260: *
10261: * HERE IF WE HAVE A PROGRAM DEFINED FUNCTION NAME
10262: *
10263: BZE WB,EXFAL FAIL IF SECOND ARG IS ZERO
10264: BGT WB,PFNLO(XR),EXFAL OR TOO LARGE
10265: ADD FARGS(XR),WB ELSE ADJUST OFFSET TO INCLUDE ARGS
10266: WTB WB CONVERT TO BYTES
10267: ADD WB,XR POINT TO LOCAL POINTER
10268: MOV PFAGB(XR),XR LOAD VRBLK POINTER
10269: BRN EXVNM EXIT BUILDING NMBLK
10270: *
10271: * HERE IF FIRST ARGUMENT IS NO GOOD
10272: *
10273: SLOC1 ERB 257,LOCAL FIRST ARG IS NOT A PROGRAM FUNCTION NAME
10274: EJC
10275: *
10276: * LPAD
10277: *
10278: S$LPD ENT ENTRY POINT
10279: JSR GTSTG GET PAD CHARACTER
10280: ERR 148,LPAD THIRD ARGUMENT NOT A STRING
10281: PLC XR POINT TO CHARACTER (NULL IS BLANK)
10282: LCH WB,(XR) LOAD PAD CHARACTER
10283: JSR GTSMI GET PAD LENGTH
10284: ERR 149,LPAD SECOND ARGUMENT IS NOT INTEGER
10285: PPM SLPD3 SKIP IF NEGATIVE OR LARGE
10286: *
10287: * MERGE TO CHECK FIRST ARG
10288: *
10289: SLPD1 JSR GTSTG GET FIRST ARGUMENT (STRING TO PAD)
10290: ERR 150,LPAD FIRST ARGUMENT IS NOT STRING
10291: BGE WA,WC,EXIXR RETURN 1ST ARG IF TOO LONG TO PAD
10292: MOV XR,XL ELSE MOVE PTR TO STRING TO PAD
10293: *
10294: * NOW WE ARE READY FOR THE PAD
10295: *
10296: * (XL) POINTER TO STRING TO PAD
10297: * (WB) PAD CHARACTER
10298: * (WC) LENGTH TO PAD STRING TO
10299: *
10300: MOV WC,WA COPY LENGTH
10301: JSR ALOCS ALLOCATE SCBLK FOR NEW STRING
10302: MOV XR,-(XS) SAVE AS RESULT
10303: MOV SCLEN(XL),WA LOAD LENGTH OF ARGUMENT
10304: SUB WA,WC CALCULATE NUMBER OF PAD CHARACTERS
10305: PSC XR POINT TO CHARS IN RESULT STRING
10306: LCT WC,WC SET COUNTER FOR PAD LOOP
10307: *
10308: * LOOP TO PERFORM PAD
10309: *
10310: SLPD2 SCH WB,(XR)+ STORE PAD CHARACTER, BUMP PTR
10311: BCT WC,SLPD2 LOOP TILL ALL PAD CHARS STORED
10312: CSC XR COMPLETE STORE CHARACTERS
10313: *
10314: * NOW COPY STRING
10315: *
10316: BZE WA,EXITS EXIT IF NULL STRING
10317: PLC XL ELSE POINT TO CHARS IN ARGUMENT
10318: MVC MOVE CHARACTERS TO RESULT STRING
10319: BRN EXITS JUMP FOR NEXT CODE WORD
10320: *
10321: * HERE IF 2ND ARG IS NEGATIVE OR LARGE
10322: *
10323: SLPD3 ZER WC ZERO PAD COUNT
10324: BRN SLPD1 MERGE
10325: EJC
10326: *
10327: * LT
10328: *
10329: S$LTF ENT ENTRY POINT
10330: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE
10331: ERR 151,LT FIRST ARGUMENT IS NOT NUMERIC
10332: ERR 152,LT SECOND ARGUMENT IS NOT NUMERIC
10333: PPM EXNUL RETURN NULL IF LT
10334: PPM EXFAL FAIL IF EQ
10335: PPM EXFAL FAIL IF GT
10336: EJC
10337: *
10338: * NE
10339: *
10340: S$NEF ENT ENTRY POINT
10341: JSR ACOMP CALL ARITHMETIC COMPARISON ROUTINE
10342: ERR 153,NE FIRST ARGUMENT IS NOT NUMERIC
10343: ERR 154,NE SECOND ARGUMENT IS NOT NUMERIC
10344: PPM EXNUL RETURN NULL IF LT
10345: PPM EXFAL FAIL IF EQ
10346: PPM EXNUL RETURN NULL IF GT
10347: EJC
10348: *
10349: * NOTANY
10350: *
10351: S$NAY ENT ENTRY POINT
10352: MOV =P$NAS,WB SET PCODE FOR SINGLE CHAR ARG
10353: MOV =P$NAY,XL PCODE FOR MULTI-CHAR ARG
10354: MOV =P$NAD,WC SET PCODE FOR EXPR ARG
10355: JSR PATST CALL COMMON ROUTINE TO BUILD NODE
10356: ERR 155,NOTANY ARGUMENT IS NOT STRING OR EXPRESSION
10357: BRN EXIXR JUMP FOR NEXT CODE WORD
10358: EJC
10359: *
10360: * OPSYN
10361: *
10362: S$OPS ENT ENTRY POINT
10363: JSR GTSMI LOAD THIRD ARGUMENT
10364: ERR 156,OPSYN THIRD ARGUMENT IS NOT INTEGER
10365: ERR 157,OPSYN THIRD ARGUMENT IS NEGATIVE OR TOO LARGE
10366: MOV WC,WB IF OK, SAVE THIRD ARGUMNET
10367: MOV (XS)+,XR LOAD SECOND ARGUMENT
10368: JSR GTNVR LOCATE VARIABLE BLOCK
10369: ERR 158,OPSYN SECOND ARG IS NOT NATURAL VARIABLE NAME
10370: MOV VRFNC(XR),XL IF OK, LOAD FUNCTION BLOCK POINTER
10371: BNZ WB,SOPS2 JUMP IF OPERATOR OPSYN CASE
10372: *
10373: * HERE FOR FUNCTION OPSYN (THIRD ARG ZERO)
10374: *
10375: MOV (XS)+,XR LOAD FIRST ARGUMENT
10376: JSR GTNVR GET VRBLK POINTER
10377: ERR 159,OPSYN FIRST ARG IS NOT NATURAL VARIABLE NAME
10378: *
10379: * MERGE HERE TO PERFORM FUNCTION DEFINITION
10380: *
10381: SOPS1 JSR DFFNC CALL FUNCTION DEFINER
10382: BRN EXNUL EXIT WITH NULL RESULT
10383: *
10384: * HERE FOR OPERATOR OPSYN (THIRD ARG NON-ZERO)
10385: *
10386: SOPS2 JSR GTSTG GET OPERATOR NAME
10387: PPM SOPS5 JUMP IF NOT STRING
10388: BNE WA,=NUM01,SOPS5 ERROR IF NOT ONE CHAR LONG
10389: PLC XR ELSE POINT TO CHARACTER
10390: LCH WC,(XR) LOAD CHARACTER NAME
10391: EJC
10392: *
10393: * OPSYN (CONTINUED)
10394: *
10395: * NOW SET TO SEARCH FOR MATCHING UNARY OR BINARY OPERATOR
10396: * NAME AS APPROPRIATE. NOTE THAT THERE ARE =OPBUN UNDEFINED
10397: * BINARY OPERATORS AND =OPUUN UNDEFINED UNARY OPERATORS.
10398: *
10399: MOV =R$UUB,WA POINT TO UNOP POINTERS IN CASE
10400: MOV =OPNSU,XR POINT TO NAMES OF UNARY OPERATORS
10401: ADD =OPBUN,WB ADD NO. OF UNDEFINED BINARY OPS
10402: BEQ WB,=OPUUN,SOPS3 JUMP IF UNOP (THIRD ARG WAS 1)
10403: MOV =R$UBA,WA ELSE POINT TO BINARY OPERATOR PTRS
10404: MOV =OPSNB,XR POINT TO NAMES OF BINARY OPERATORS
10405: MOV =OPBUN,WB SET NUMBER OF UNDEFINED BINOPS
10406: *
10407: * MERGE HERE TO CHECK LIST (WB = NUMBER TO CHECK)
10408: *
10409: SOPS3 LCT WB,WB SET COUNTER TO CONTROL LOOP
10410: *
10411: * LOOP TO SEARCH FOR NAME MATCH
10412: *
10413: SOPS4 BEQ WC,(XR),SOPS6 JUMP IF NAMES MATCH
10414: ICA WA ELSE PUSH POINTER TO FUNCTION PTR
10415: ICA XR BUMP POINTER
10416: BCT WB,SOPS4 LOOP BACK TILL ALL CHECKED
10417: *
10418: * HERE IF BAD OPERATOR NAME
10419: *
10420: SOPS5 ERB 160,OPSYN FIRST ARG IS NOT CORRECT OPERATOR NAME
10421: *
10422: * COME HERE ON FINDING A MATCH IN THE OPERATOR NAME TABLE
10423: *
10424: SOPS6 MOV WA,XR COPY POINTER TO FUNCTION BLOCK PTR
10425: SUB *VRFNC,XR MAKE IT LOOK LIKE DUMMY VRBLK
10426: BRN SOPS1 MERGE BACK TO DEFINE OPERATOR
10427: EJC
10428: *
10429: * OUTPUT
10430: *
10431: S$OUP ENT ENTRY POINT
10432: MOV =NUM02,WB OUTPUT FLAG
10433: JSR IOPUT CALL INPUT/OUTPUT ASSOC. ROUTINE
10434: ERR 161,OUTPUT THIRD ARGUMENT (FILEPROPS) IS NOT A STRING
10435: ERR 162,INAPPROPRIATE SECOND ARGUMENT (FILETAG) FOR OUTPUT
10436: ERR 163,INAPPROPRIATE FIRST ARGUMENT FOR OUTPUT
10437: PPM EXFAL FAIL RETURN
10438: BRN EXNUL RETURN NULL STRING
10439: EJC
10440: *
10441: * POS
10442: *
10443: S$POS ENT ENTRY POINT
10444: MOV =P$POS,WB SET PCODE FOR INTEGER ARG CASE
10445: MOV =P$PSD,WA SET PCODE FOR EXPRESSION ARG CASE
10446: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE
10447: ERR 164,POS ARGUMENT IS NOT INTEGER OR EXPRESSION
10448: ERR 165,POS ARGUMENT IS NEGATIVE OR TOO LARGE
10449: BRN EXIXR RETURN PATTERN NODE
10450: EJC
10451: *
10452: * PROTOTYPE
10453: *
10454: S$PRO ENT ENTRY POINT
10455: MOV (XS)+,XR LOAD ARGUMENT
10456: MOV TBLEN(XR),WB LENGTH IF TABLE, VECTOR (=VCLEN)
10457: BTW WB CONVERT TO WORDS
10458: MOV (XR),WA LOAD TYPE WORD OF ARGUMENT BLOCK
10459: BEQ WA,=B$ART,SPRO4 JUMP IF ARRAY
10460: BEQ WA,=B$TBT,SPRO1 JUMP IF TABLE
10461: BEQ WA,=B$VCT,SPRO3 JUMP IF VECTOR
10462: .IF .CNBF
10463: .ELSE
10464: BEQ WA,=B$BCT,SPR05 JUMP IF BUFFER
10465: .FI
10466: ERB 166,PROTOTYPE ARGUMENT IS NOT TABLE OR ARRAY
10467: *
10468: * HERE FOR TABLE
10469: *
10470: SPRO1 SUB =TBSI$,WB SUBTRACT STANDARD FIELDS
10471: *
10472: * MERGE FOR VECTOR
10473: *
10474: SPRO2 MTI WB CONVERT TO INTEGER
10475: BRN EXINT EXIT WITH INTEGER RESULT
10476: *
10477: * HERE FOR VECTOR
10478: *
10479: SPRO3 SUB =VCSI$,WB SUBTRACT STANDARD FIELDS
10480: BRN SPRO2 MERGE
10481: *
10482: * HERE FOR ARRAY
10483: *
10484: SPRO4 ADD AROFS(XR),XR POINT TO PROTOTYPE FIELD
10485: MOV (XR),XR LOAD PROTOTYPE
10486: BRN EXIXR RETURN PROTOTYPE AS RESULT
10487: .IF .CNBF
10488: .ELSE
10489: *
10490: * HERE FOR BUFFER
10491: *
10492: SPR05 MOV BCBUF(XR),XR POINT TO BFBLK
10493: MTI BFALC(XR) LOAD ALLOCATED LENGTH
10494: BRN EXINT EXIT WITH INTEGER ALLOCATION
10495: .FI
10496: EJC
10497: *
10498: * REMDR
10499: *
10500: S$RMD ENT ENTRY POINT
10501: ZER WB SET POSITIVE FLAG
10502: MOV (XS),XR LOAD SECOND ARGUMENT
10503: JSR GTINT CONVERT TO INTEGER
10504: ERR 167,REMDR SECOND ARGUMENT IS NOT INTEGER
10505: JSR ARITH CONVERT ARGS
10506: PPM SRM01 FIRST ARG NOT INTEGER
10507: PPM SECOND ARG CHECKED ABOVE
10508: .IF .CNRA
10509: .ELSE
10510: PPM SRM01 FIRST ARG REAL
10511: .FI
10512: LDI ICVAL(XR) LOAD LEFT ARGUMENT VALUE
10513: RMI ICVAL(XL) GET REMAINDER
10514: INO EXINT JUMP IF NO OVERFLOW
10515: ERB 168,REMDR CAUSED INTEGER OVERFLOW
10516: *
10517: * FAIL FIRST ARGUMENT
10518: *
10519: SRM01 ERB 169,REMDR FIRST ARGUMENT IS NOT INTEGER
10520: EJC
10521: *
10522: * REPLACE
10523: *
10524: * THE ACTUAL REPLACE OPERATION USES AN SCBLK WHOSE CFP$A
10525: * CHARS CONTAIN THE TRANSLATED VERSIONS OF ALL THE CHARS.
10526: * THE TABLE POINTER IS REMEMBERED FROM CALL TO CALL AND
10527: * THE TABLE IS ONLY BUILT WHEN THE ARGUMENTS CHANGE.
10528: *
10529: S$RPL ENT ENTRY POINT
10530: JSR GTSTG LOAD THIRD ARGUMENT AS STRING
10531: ERR 170,REPLACE THIRD ARGUMENT IS NOT STRING
10532: MOV XR,XL SAVE THIRD ARG PTR
10533: JSR GTSTG GET SECOND ARGUMENT
10534: ERR 171,REPLACE SECOND ARGUMENT IS NOT STRING
10535: *
10536: * CHECK TO SEE IF THIS IS THE SAME TABLE AS LAST TIME
10537: *
10538: BNE XR,R$RA2,SRPL1 JUMP IF 2ND ARGUMENT DIFFERENT
10539: BEQ XL,R$RA3,SRPL4 JUMP IF ARGS SAME AS LAST TIME
10540: *
10541: * HERE WE BUILD A NEW REPLACE TABLE (NOTE WA = 2ND ARG LEN)
10542: *
10543: SRPL1 MOV SCLEN(XL),WB LOAD 3RD ARGUMENT LENGTH
10544: BNE WA,WB,SRPL5 JUMP IF ARGUMENTS NOT SAME LENGTH
10545: BZE WB,SRPL5 JUMP IF NULL 2ND ARGUMENT
10546: MOV XL,R$RA3 SAVE THIRD ARG FOR NEXT TIME IN
10547: MOV XR,R$RA2 SAVE SECOND ARG FOR NEXT TIME IN
10548: MOV KVALP,XL POINT TO ALPHABET STRING
10549: MOV SCLEN(XL),WA LOAD ALPHABET SCBLK LENGTH
10550: MOV R$RPT,XR POINT TO CURRENT TABLE (IF ANY)
10551: BNZ XR,SRPL2 JUMP IF WE ALREADY HAVE A TABLE
10552: *
10553: * HERE WE ALLOCATE A NEW TABLE
10554: *
10555: JSR ALOCS ALLOCATE NEW TABLE
10556: MOV WC,WA KEEP SCBLK LENGTH
10557: MOV XR,R$RPT SAVE TABLE POINTER FOR NEXT TIME
10558: *
10559: * MERGE HERE WITH POINTER TO NEW TABLE BLOCK IN (XR)
10560: *
10561: SRPL2 CTB WA,SCSI$ COMPUTE LENGTH OF SCBLK
10562: MVW COPY TO GET INITIAL TABLE VALUES
10563: EJC
10564: *
10565: * REPLACE (CONTINUED)
10566: *
10567: * NOW WE MUST PLUG SELECTED ENTRIES AS REQUIRED. NOTE THAT
10568: * WE ARE SHORT OF INDEX REGISTERS FOR THE FOLLOWING LOOP.
10569: * HENCE THE NEED TO REPEATEDLY RE-INITIALISE CHAR PTR XL
10570: *
10571: MOV R$RA2,XL POINT TO SECOND ARGUMENT
10572: LCT WB,WB NUMBER OF CHARS TO PLUG
10573: ZER WC ZERO CHAR OFFSET
10574: MOV R$RA3,XR POINT TO 3RD ARG
10575: PLC XR GET CHAR PTR FOR 3RD ARG
10576: *
10577: * LOOP TO PLUG CHARS
10578: *
10579: SRPL3 MOV R$RA2,XL POINT TO 2ND ARG
10580: PLC XL,WC POINT TO NEXT CHAR
10581: ICV WC INCREMENT OFFSET
10582: LCH WA,(XL) GET NEXT CHAR
10583: MOV R$RPT,XL POINT TO TRANSLATE TABLE
10584: PSC XL,WA CONVERT CHAR TO OFFSET INTO TABLE
10585: LCH WA,(XR)+ GET TRANSLATED CHAR
10586: SCH WA,(XL) STORE IN TABLE
10587: CSC XL COMPLETE STORE CHARACTERS
10588: BCT WB,SRPL3 LOOP TILL DONE
10589: EJC
10590: *
10591: * REPLACE (CONTINUED)
10592: *
10593: * HERE TO PERFORM TRANSLATE
10594: *
10595: SRPL4 JSR GTSTG GET FIRST ARGUMENT
10596: ERR 172,REPLACE FIRST ARGUMENT IS NOT STRING
10597: BZE WA,EXNUL RETURN NULL IF NULL ARGUMENT
10598: MOV XR,XL COPY POINTER
10599: MOV WA,WC SAVE LENGTH
10600: CTB WA,SCHAR GET SCBLK LENGTH
10601: JSR ALLOC ALLOCATE SPACE FOR COPY
10602: MOV XR,WB SAVE ADDRESS OF COPY
10603: MVW MOVE SCBLK CONTENTS TO COPY
10604: MOV R$RPT,XR POINT TO REPLACE TABLE
10605: PLC XR POINT TO CHARS OF TABLE
10606: MOV WB,XL POINT TO STRING TO TRANSLATE
10607: PLC XL POINT TO CHARS OF STRING
10608: MOV WC,WA SET NUMBER OF CHARS TO TRANSLATE
10609: TRC PERFORM TRANSLATION
10610: MOV WB,-(XS) STACK NEW STRING AS RESULT
10611: BRN EXITS RETURN WITH RESULT ON STACK
10612: *
10613: * ERROR POINT
10614: *
10615: SRPL5 ERB 173,NULL OR UNEQUALLY LONG 2ND, 3RD ARGS TO REPLACE
10616: EJC
10617: *
10618: * REVERSE
10619: *
10620: S$RVS ENT ENTRY POINT
10621: JSR GTSTG LOAD STRING ARGUMENT
10622: ERR 174,REVERSE ARGUMENT IS NOT STRING
10623: BZE WA,EXIXR RETURN ARGUMENT IF NULL
10624: MOV XR,XL ELSE SAVE POINTER TO STRING ARG
10625: JSR ALOCS ALLOCATE SPACE FOR NEW SCBLK
10626: MOV XR,-(XS) STORE SCBLK PTR ON STACK AS RESULT
10627: PSC XR PREPARE TO STORE IN NEW SCBLK
10628: PLC XL,WC POINT PAST LAST CHAR IN ARGUMENT
10629: LCT WC,WC SET LOOP COUNTER
10630: *
10631: * LOOP TO MOVE CHARS IN REVERSE ORDER
10632: *
10633: SRVS1 LCH WB,-(XL) LOAD NEXT CHAR FROM ARGUMENT
10634: SCH WB,(XR)+ STORE IN RESULT
10635: BCT WC,SRVS1 LOOP TILL ALL MOVED
10636: CSC XR COMPLETE STORE CHARACTERS
10637: BRN EXITS AND THEN JUMP FOR NEXT CODE WORD
10638: EJC
10639: *
10640: * RPAD
10641: *
10642: S$RPD ENT ENTRY POINT
10643: JSR GTSTG GET PAD CHARACTER
10644: ERR 175,RPAD THIRD ARGUMENT IS NOT STRING
10645: PLC XR POINT TO CHARACTER (NULL IS BLANK)
10646: LCH WB,(XR) LOAD PAD CHARACTER
10647: JSR GTSMI GET PAD LENGTH
10648: ERR 176,RPAD SECOND ARGUMENT IS NOT INTEGER
10649: PPM SRPD3 SKIP IF NEGATIVE OR LARGE
10650: *
10651: * MERGE TO CHECK FIRST ARG.
10652: *
10653: SRPD1 JSR GTSTG GET FIRST ARGUMENT (STRING TO PAD)
10654: ERR 177,RPAD FIRST ARGUMENT IS NOT STRING
10655: BGE WA,WC,EXIXR RETURN 1ST ARG IF TOO LONG TO PAD
10656: MOV XR,XL ELSE MOVE PTR TO STRING TO PAD
10657: *
10658: * NOW WE ARE READY FOR THE PAD
10659: *
10660: * (XL) POINTER TO STRING TO PAD
10661: * (WB) PAD CHARACTER
10662: * (WC) LENGTH TO PAD STRING TO
10663: *
10664: MOV WC,WA COPY LENGTH
10665: JSR ALOCS ALLOCATE SCBLK FOR NEW STRING
10666: MOV XR,-(XS) SAVE AS RESULT
10667: MOV SCLEN(XL),WA LOAD LENGTH OF ARGUMENT
10668: SUB WA,WC CALCULATE NUMBER OF PAD CHARACTERS
10669: PSC XR POINT TO CHARS IN RESULT STRING
10670: LCT WC,WC SET COUNTER FOR PAD LOOP
10671: *
10672: * COPY ARGUMENT STRING
10673: *
10674: BZE WA,SRPD2 JUMP IF ARGUMENT IS NULL
10675: PLC XL ELSE POINT TO ARGUMENT CHARS
10676: MVC MOVE CHARACTERS TO RESULT STRING
10677: *
10678: * LOOP TO SUPPLY PAD CHARACTERS
10679: *
10680: SRPD2 SCH WB,(XR)+ STORE PAD CHARACTER, BUMP PTR
10681: BCT WC,SRPD2 LOOP TILL ALL PAD CHARS STORED
10682: CSC XR COMPLETE CHARACTER STORING
10683: BRN EXITS AND EXIT FOR NEXT WORD
10684: *
10685: * HERE IF 2ND ARG IS NEGATIVE OR LARGE
10686: *
10687: SRPD3 ZER WC ZERO PAD COUNT
10688: BRN SRPD1 MERGE
10689: EJC
10690: *
10691: * RTAB
10692: *
10693: S$RTB ENT ENTRY POINT
10694: MOV =P$RTB,WB SET PCODE FOR INTEGER ARG CASE
10695: MOV =P$RTD,WA SET PCODE FOR EXPRESSION ARG CASE
10696: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE
10697: ERR 178,RTAB ARGUMENT IS NOT INTEGER OR EXPRESSION
10698: ERR 179,RTAB ARGUMENT IS NEGATIVE OR TOO LARGE
10699: BRN EXIXR RETURN PATTERN NODE
10700: EJC
10701: .IF .CUST
10702: *
10703: * SET
10704: *
10705: S$SET ENT ENTRY POINT
10706: MOV (XS)+,R$IOL SAVE THIRD ARG
10707: MOV (XS)+,R$IO1 SAVE SECOND ARG
10708: JSR IOFTG CALL IOTAG ROUTINE
10709: ERR 180,SET FIRST ARGUMENT IS NOT A SUITABLE NAME
10710: BZE WA,EXFAL FAIL IF NO IOTAG
10711: MOV R$IO1,WB LOAD SECOND ARG
10712: MOV R$IOL,WC LOAD THIRD ARG
10713: JSR SYSST CALL SYSTEM SET ROUTINE
10714: PPM EXFAL FAILURE RETURN
10715: PPM EROSI ERROR RETURN
10716: BRN EXNUL OTHERWISE RETURN NULL
10717: EJC
10718: .FI
10719: *
10720: * RPOS
10721: *
10722: S$RPS ENT ENTRY POINT
10723: MOV =P$RPS,WB SET PCODE FOR INTEGER ARG CASE
10724: MOV =P$RPD,WA SET PCODE FOR EXPRESSION ARG CASE
10725: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE
10726: ERR 181,RPOS ARGUMENT IS NOT INTEGER OR EXPRESSION
10727: ERR 182,RPOS ARGUMENT IS NEGATIVE OR TOO LARGE
10728: BRN EXIXR RETURN PATTERN NODE
10729: .IF .CNSR
10730: .ELSE
10731: EJC
10732: *
10733: * RSORT
10734: *
10735: S$RSR ENT ENTRY POINT
10736: MNZ WA MARK AS RSORT
10737: JSR SORTA CALL SORT ROUTINE
10738: PPM EXFAL FAIL EMPTY TABLE
10739: BRN EXSID RETURN, SETTING IDVAL
10740: .FI
10741: EJC
10742: *
10743: * SETEXIT
10744: *
10745: S$STX ENT ENTRY POINT
10746: MOV (XS)+,XR LOAD ARGUMENT
10747: MOV STXVR,WA LOAD OLD VRBLK POINTER
10748: ZER XL LOAD ZERO IN CASE NULL ARG
10749: BEQ XR,=NULLS,SSTX1 JUMP IF NULL ARGUMENT (RESET CALL)
10750: JSR GTNVR ELSE GET SPECIFIED VRBLK
10751: PPM SSTX2 JUMP IF NOT NATURAL VARIABLE
10752: MOV VRLBL(XR),XL ELSE LOAD LABEL
10753: BEQ XL,=STNDL,SSTX2 JUMP IF LABEL IS NOT DEFINED
10754: BNE (XL),=B$TRT,SSTX1 JUMP IF NOT TRAPPED
10755: MOV TRLBL(XL),XL ELSE LOAD PTR TO REAL LABEL CODE
10756: *
10757: * HERE TO SET/RESET SETEXIT TRAP
10758: *
10759: SSTX1 MOV XR,STXVR STORE NEW VRBLK POINTER (OR NULL)
10760: MOV XL,R$SXC STORE NEW CODE PTR (OR ZERO)
10761: BEQ WA,=NULLS,EXNUL RETURN NULL IF NULL RESULT
10762: MOV WA,XR ELSE COPY VRBLK POINTER
10763: BRN EXVNM AND RETURN BUILDING NMBLK
10764: *
10765: * HERE IF BAD ARGUMENT
10766: *
10767: SSTX2 ERB 183,SETEXIT ARGUMENT IS NOT LABEL NAME OR NULL
10768: .IF .CNSR
10769: .ELSE
10770: EJC
10771: *
10772: * SORT
10773: *
10774: S$SRT ENT ENTRY POINT
10775: ZER WA MARK AS SORT
10776: JSR SORTA CALL SORT ROUTINE
10777: PPM EXFAL FAIL EMPTY TABLE
10778: BRN EXSID RETURN, SETTING IDVAL
10779: .FI
10780: EJC
10781: *
10782: * SPAN
10783: *
10784: S$SPN ENT ENTRY POINT
10785: MOV =P$SPS,WB SET PCODE FOR SINGLE CHAR ARG
10786: MOV =P$SPN,XL SET PCODE FOR MULTI-CHAR ARG
10787: MOV =P$SPD,WC SET PCODE FOR EXPRESSION ARG
10788: JSR PATST CALL COMMON ROUTINE TO BUILD NODE
10789: ERR 184,SPAN ARGUMENT IS NOT STRING OR EXPRESSION
10790: BRN EXIXR JUMP FOR NEXT CODE WORD
10791: EJC
10792: *
10793: * SIZE
10794: *
10795: S$SI$ ENT ENTRY POINT
10796: .IF .CNBF
10797: JSR GTSTG LOAD STRING ARGUMENT
10798: .ELSE
10799: MOV (XS),XR LOAD ARGUMENT
10800: BNE (XR),=B$BCT,SSI$1 BRANCH IF NOT BUFFER
10801: ICA XS ELSE POP ARGUMENT
10802: MTI BCLEN(XR) LOAD DEFINED LENGTH
10803: BRN EXINT EXIT WITH INTEGER
10804: *
10805: * HERE IF NOT BUFFER
10806: *
10807: SSI$1 JSR GTSTG LOAD STRING ARGUMENT
10808: .FI
10809: ERR 185,SIZE ARGUMENT IS NOT STRING
10810: MTI WA LOAD LENGTH AS INTEGER
10811: BRN EXINT EXIT WITH INTEGER RESULT
10812: EJC
10813: *
10814: * STOPTR
10815: *
10816: S$STT ENT ENTRY POINT
10817: ZER XL INDICATE STOPTR CASE
10818: JSR TRACE CALL TRACE PROCEDURE
10819: ERR 186,STOPTR FIRST ARGUMENT IS NOT APPROPRIATE NAME
10820: ERR 187,STOPTR SECOND ARGUMENT IS NOT TRACE TYPE
10821: PPM EXFAL FAIL RETURN
10822: BRN EXNUL RETURN NULL
10823: EJC
10824: *
10825: * SUBSTR
10826: *
10827: S$SUB ENT ENTRY POINT
10828: JSR GTSMI LOAD THIRD ARGUMENT
10829: ERR 188,SUBSTR THIRD ARGUMENT IS NOT INTEGER
10830: PPM EXFAL JUMP IF NEGATIVE OR TOO LARGE
10831: MOV XR,SBSSV SAVE THIRD ARGUMENT
10832: JSR GTSMI LOAD SECOND ARGUMENT
10833: ERR 189,SUBSTR SECOND ARGUMENT IS NOT INTEGER
10834: PPM EXFAL JUMP IF OUT OF RANGE
10835: MOV XR,WB SAVE SECOND ARGUMENT
10836: BZE WB,EXFAL JUMP IF SECOND ARGUMENT ZERO
10837: DCV WB ELSE DECREMENT FOR ONES ORIGIN
10838: .IF .CNBF
10839: JSR GTSTG LOAD FIRST ARGUMENT
10840: .ELSE
10841: MOV (XS),XL GET FIRST ARG PTR
10842: BNE (XL),=B$BCT,SSUBA BRANCH IF NOT BUFFER
10843: MOV BCBUF(XL),XR GET BFBLK PTR
10844: MOV BCLEN(XL),WA GET LENGTH
10845: BRN SSUBB MERGE
10846: *
10847: * HERE IF NOT BUFFER TO GET STRING
10848: *
10849: SSUBA JSR GTSTG LOAD FIRST ARGUMENT
10850: .FI
10851: ERR 190,SUBSTR FIRST ARGUMENT IS NOT STRING
10852: MOV XR,XL COPY POINTER TO FIRST ARG
10853: .IF .CNBF
10854: MOV SBSSV,WC RELOAD THIRD ARGUMENT
10855: .ELSE
10856: *
10857: * MERGE WITH BFBLK OR SCBLK IN XR, LENGTH IN WA
10858: *
10859: SSUBB MOV SBSSV,WC RELOAD THIRD ARGUMENT
10860: .FI
10861: BNZ WC,SSUB1 SKIP IF THIRD ARG GIVEN
10862: MOV SCLEN(XL),WC ELSE GET STRING LENGTH
10863: BGT WB,WC,EXFAL FAIL IF IMPROPER
10864: SUB WB,WC REDUCE BY OFFSET TO START
10865: *
10866: * MERGE
10867: *
10868: SSUB1 MOV WC,WA SET LENGTH OF SUBSTRING
10869: ADD WB,WC ADD 2ND ARG TO 3RD ARG
10870: BGT WC,SCLEN(XL),EXFAL JUMP IF IMPROPER SUBSTRING
10871: JSR SBSTR BUILD SUBSTRING
10872: BRN EXIXR AND JUMP FOR NEXT CODE WORD
10873: EJC
10874: *
10875: * TAB
10876: *
10877: S$TAB ENT ENTRY POINT
10878: MOV =P$TAB,WB SET PCODE FOR INTEGER ARG CASE
10879: MOV =P$TBD,WA SET PCODE FOR EXPRESSION ARG CASE
10880: JSR PATIN CALL COMMON ROUTINE TO BUILD NODE
10881: ERR 191,TAB ARGUMENT IS NOT INTEGER OR EXPRESSION
10882: ERR 192,TAB ARGUMENT IS NEGATIVE OR TOO LARGE
10883: BRN EXIXR RETURN PATTERN NODE
10884: EJC
10885: *
10886: * TABLE
10887: *
10888: S$TBL ENT ENTRY POINT
10889: MOV (XS)+,XL GET INITIAL LOOKUP VALUE
10890: ICA XS POP SECOND ARGUMENT
10891: JSR GTSMI LOAD ARGUMENT
10892: ERR 193,TABLE ARGUMENT IS NOT INTEGER
10893: ERR 194,TABLE ARGUMENT IS OUT OF RANGE
10894: BNZ WC,STBL1 JUMP IF NON-ZERO
10895: MOV =TBNBK,WC ELSE SUPPLY DEFAULT VALUE
10896: *
10897: * MERGE HERE WITH NUMBER OF HEADERS IN WA
10898: *
10899: STBL1 MOV WC,WA COPY NUMBER OF HEADERS
10900: ADD =TBSI$,WA ADJUST FOR STANDARD FIELDS
10901: WTB WA CONVERT LENGTH TO BAUS
10902: JSR ALLOC ALLOCATE SPACE FOR TBBLK
10903: MOV XR,WB COPY POINTER TO TBBLK
10904: MOV =B$TBT,(XR)+ STORE TYPE WORD
10905: ZER (XR)+ ZERO ID FOR THE MOMENT
10906: MOV WA,(XR)+ STORE LENGTH (TBLEN)
10907: MOV XL,(XR)+ STORE INITIAL LOOKUP VALUE
10908: LCT WC,WC SET LOOP COUNTER (NUM HEADERS)
10909: *
10910: * LOOP TO INITIALIZE ALL BUCKET POINTERS
10911: *
10912: STBL2 MOV WB,(XR)+ STORE TBBLK PTR IN BUCKET HEADER
10913: BCT WC,STBL2 LOOP TILL ALL STORED
10914: MOV WB,XR RECALL POINTER TO TBBLK
10915: BRN EXSID EXIT SETTING IDVAL
10916: EJC
10917: *
10918: * TIME
10919: *
10920: S$TIM ENT ENTRY POINT
10921: JSR SYSTM GET TIMER VALUE
10922: SBI TIMSX SUBTRACT STARTING TIME
10923: BRN EXINT EXIT WITH INTEGER VALUE
10924: EJC
10925: *
10926: * TRACE
10927: *
10928: S$TRA ENT ENTRY POINT
10929: BEQ 3(XS),=NULLS,STR03 JUMP IF FIRST ARGUMENT IS NULL
10930: MOV (XS)+,XR LOAD FOURTH ARGUMENT
10931: ZER XL TENTATIVELY SET ZERO POINTER
10932: BEQ XR,=NULLS,STR02 JUMP IF 4TH ARGUMENT IS NULL
10933: JSR GTNVR ELSE POINT TO VRBLK
10934: PPM STR01 JUMP IF NOT VARIABLE NAME
10935: MOV VRFNC(XR),XL ELSE LOAD FUNCTION POINTER
10936: BNE XL,=STNDF,STR02 JUMP IF FUNCTION IS DEFINED
10937: *
10938: * HERE FOR BAD FOURTH ARGUMENT
10939: *
10940: STR01 ERB 195,TRACE FOURTH ARG IS NOT FUNCTION NAME OR NULL
10941: *
10942: * HERE WITH FUNCTION POINTER IN XL
10943: *
10944: STR02 MOV (XS)+,XR LOAD THIRD ARGUMENT (TAG)
10945: ZER WB SET ZERO AS TRTYP VALUE FOR NOW
10946: JSR TRBLD BUILD TRBLK FOR TRACE CALL
10947: MOV XR,XL MOVE TRBLK POINTER FOR TRACE
10948: JSR TRACE CALL TRACE PROCEDURE
10949: ERR 196,TRACE FIRST ARGUMENT IS NOT APPROPRIATE NAME
10950: ERR 197,TRACE SECOND ARGUMENT IS NOT TRACE TYPE
10951: PPM UNUSED RETURN
10952: BRN EXNUL RETURN NULL
10953: *
10954: * HERE TO CALL SYSTEM TRACE TOGGLE ROUTINE
10955: *
10956: STR03 JSR SYSTT CALL IT
10957: ADD *NUM04,XS POP TRACE ARGUMENTS
10958: BRN EXNUL RETURN
10959: EJC
10960: *
10961: * TRIM
10962: *
10963: S$TRM ENT ENTRY POINT
10964: JSR GTSTG LOAD ARGUMENT AS STRING
10965: ERR 198,TRIM ARGUMENT IS NOT STRING
10966: BZE WA,EXNUL RETURN NULL IF ARGUMENT IS NULL
10967: MOV XR,XL COPY STRING POINTER
10968: CTB WA,SCHAR GET BLOCK LENGTH
10969: JSR ALLOC ALLOCATE COPY SAME SIZE
10970: MOV XR,WB SAVE POINTER TO COPY
10971: MVW COPY OLD STRING BLOCK TO NEW
10972: MOV WB,XR RESTORE PTR TO NEW BLOCK
10973: JSR TRIMR TRIM BLANKS (WB IS NON-ZERO)
10974: BRN EXIXR EXIT WITH RESULT IN XR
10975: EJC
10976: *
10977: * UNLOAD
10978: *
10979: S$UNL ENT ENTRY POINT
10980: MOV (XS)+,XR LOAD ARGUMENT
10981: JSR GTNVR POINT TO VRBLK
10982: ERR 199,UNLOAD ARGUMENT IS NOT NATURAL VARIABLE NAME
10983: MOV =STNDF,XL GET PTR TO UNDEFINED FUNCTION
10984: JSR DFFNC UNDEFINE NAMED FUNCTION
10985: BRN EXNUL RETURN NULL AS RESULT
10986: EJC
10987: *
10988: * VDIFFER
10989: *
10990: S$VDF ENT ENTRY POINT
10991: MOV (XS)+,XR LOAD SECOND ARGUMENT
10992: MOV (XS),XL LOAD FIRST ARGUMENT
10993: JSR IDENT CALL IDENT COMPARISON ROUTINE
10994: PPM EXFAL FAIL IF IDENT
10995: BRN EXITS RETURN FIRST ARG IF DIFFER
10996: TTL S P I T B O L -- UTILITY PROCEDURES
10997: *
10998: * THE FOLLOWING SECTION CONTAINS PROCEDURES WHICH ARE
10999: * USED FOR VARIOUS PURPOSES THROUGHOUT THE SYSTEM.
11000: *
11001: * EACH PROCEDURE IS PRECEDED BY A DESCRIPTION OF THE
11002: * CALLING SEQUENCE. USUALLY THE ARGUMENTS ARE IN REGISTERS
11003: * BUT ARGUMENTS CAN ALSO OCCUR ON THE STACK AND AS
11004: * PARAMETERS ASSEMBLED AFTER THE JSR INSTRUCTION.
11005: *
11006: * THE FOLLOWING CONSIDERATIONS APPLY TO THESE DESCRIPTIONS.
11007: *
11008: * 1) THE STACK POINTER (XS) IS NOT CHANGED UNLESS THE
11009: * CHANGE IS EXPLICITLY DOCUMENTED IN THE CALL.
11010: *
11011: * 2) REGISTERS WHOSE ENTRY VALUES ARE NOT MENTIONED
11012: * MAY CONTAIN ANY VALUE EXCEPT THAT XL,XR MAY ONLY
11013: * CONTAIN PROPER (COLLECTABLE) POINTER VALUES.
11014: * THIS CONDITION ON XR MEANS THAT THE CALLED ROUTINE
11015: * MAY IF IT CHOOSES PRESERVE XR BY STACKING.
11016: *
11017: * 3) REGISTERS NOT MENTIONED ON EXIT CONTAIN THE SAME
11018: * VALUES AS THEY DID ON ENTRY EXCEPT THAT VALUES IN
11019: * XR,XL MAY HAVE BEEN RELOCATED BY THE COLLECTOR.
11020: *
11021: * 4) REGISTERS WHICH ARE DESTROYED ON EXIT MAY CONTAIN
11022: * ANY VALUE EXCEPT THAT VALUES IN XL,XR ARE PROPER
11023: * (COLLECTABLE) POINTERS.
11024: *
11025: * 5) THE CODE POINTER REGISTER POINTS TO THE CURRENT
11026: * CODE LOCATION ON ENTRY AND IS UNCHANGED ON EXIT.
11027: *
11028: * IN THE ABOVE DESCRIPTION, A COLLECTABLE POINTER IS ONE
11029: * WHICH EITHER POINTS OUTSIDE THE DYNAMIC REGION OR
11030: * POINTS TO THE START OF A BLOCK IN THE DYNAMIC REGION.
11031: *
11032: * IN THOSE CASES WHERE THE CALLING SEQUENCE CONTAINS
11033: * PARAMETERS WHICH ARE USED AS ALTERNATE RETURN POINTS,
11034: * THESE PARAMETERS MAY BE REPLACED BY ERROR CODES
11035: * ASSEMBLED WITH THE ERR INSTRUCTION. THIS WILL RESULT
11036: * IN THE POSTING OF THE ERROR IF THE RETURN IS TAKEN.
11037: *
11038: * THE PROCEDURES ALL HAVE NAMES CONSISTING OF FIVE LETTERS
11039: * AND ARE IN ALPHABETICAL ORDER BY THEIR NAMES.
11040: EJC
11041: *
11042: * ACESS - ACCESS VARIABLE VALUE WITH TRACE/INPUT CHECKS
11043: *
11044: * ACESS LOADS THE VALUE OF A VARIABLE. TRACE AND INPUT
11045: * ASSOCIATIONS ARE TESTED FOR AND EXECUTED AS REQUIRED.
11046: * ACESS ALSO HANDLES THE SPECIAL CASES OF PSEUDO-VARIABLES.
11047: *
11048: * (XL) VARIABLE NAME BASE
11049: * (WA) VARIABLE NAME OFFSET
11050: * JSR ACESS CALL TO ACCESS VALUE
11051: * PPM LOC TRANSFER LOC IF ACCESS FAILURE
11052: * (XR) VARIABLE VALUE
11053: * (WA,WB,WC) DESTROYED
11054: * (XL,RA) DESTROYED
11055: *
11056: * FAILURE CAN OCCUR IF AN INPUT ASSOCIATION CAUSES AN END
11057: * OF FILE CONDITION OR IF THE EVALUATION OF AN EXPRESSION
11058: * ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS.
11059: *
11060: ACESS PRC R,1 ENTRY POINT (RECURSIVE)
11061: MOV XL,XR COPY NAME BASE
11062: ADD WA,XR POINT TO VARIABLE LOCATION
11063: MOV (XR),XR LOAD VARIABLE VALUE
11064: *
11065: * LOOP HERE TO CHECK FOR SUCCESSIVE TRBLKS
11066: *
11067: ACS02 BNE (XR),=B$TRT,ACS18 JUMP IF NOT TRAPPED
11068: *
11069: * HERE IF TRAPPED
11070: *
11071: BEQ XR,=TRBKV,ACS12 JUMP IF KEYWORD VARIABLE
11072: BNE XR,=TRBEV,ACS05 JUMP IF NOT EXPRESSION VARIABLE
11073: *
11074: * HERE FOR EXPRESSION VARIABLE, EVALUATE VARIABLE
11075: *
11076: MOV EVEXP(XL),XR LOAD EXPRESSION POINTER
11077: ZER WB EVALUATE BY VALUE
11078: JSR EVALX EVALUATE EXPRESSION
11079: PPM ACS04 JUMP IF EVALUATION FAILURE
11080: BRN ACS02 CHECK VALUE FOR MORE TRBLKS
11081: EJC
11082: *
11083: * ACESS (CONTINUED)
11084: *
11085: * HERE ON READING END OF FILE
11086: *
11087: ACS03 ADD *NUM03,XS POP TRBLK PTR, NAME BASE AND OFFSET
11088: MOV XR,DNAMP POP UNUSED SCBLK
11089: *
11090: * MERGE HERE WHEN EVALUATION OF EXPRESSION FAILS
11091: *
11092: ACS04 EXI 1 TAKE ALTERNATE (FAILURE) RETURN
11093: *
11094: * HERE IF NOT KEYWORD OR EXPRESSION VARIABLE
11095: *
11096: ACS05 MOV TRTYP(XR),WB LOAD TRAP TYPE CODE
11097: BNZ WB,ACS10 JUMP IF NOT INPUT ASSOCIATION
11098: BZE KVINP,ACS09 IGNORE INPUT ASSOC IF INPUT IS OFF
11099: *
11100: * HERE FOR INPUT ASSOCIATION
11101: *
11102: MOV XL,-(XS) STACK NAME BASE
11103: MOV WA,-(XS) STACK NAME OFFSET
11104: MOV XR,-(XS) STACK TRBLK POINTER
11105: MOV TRTRI(XR),XL GET TRTIO BLOCK PTR OR 0
11106: BNZ XL,ACS06 JUMP IF NOT STANDARD INPUT FILE
11107: BEQ TRTER(XR),=V$TER,ACS21 JUMP IF TERMINAL
11108: *
11109: * HERE TO READ FROM STANDARD INPUT FILE
11110: *
11111: MOV CSWIN,WA LENGTH FOR READ BUFFER
11112: JSR ALOCS BUILD STRING OF APPROPRIATE LENGTH
11113: BZE TTINS,ACSA5 SKIP IF NOT TERML STD INPUT
11114: JSR SYSRI READ FROM TERMINAL
11115: PPM ACS03 END FILE
11116: PPM EROSI ERROR
11117: BRN ACS07 MERGE
11118: *
11119: * GENUINE STD INPUT FILE
11120: *
11121: ACSA5 JSR SYSRD READ NEXT STANDARD INPUT IMAGE
11122: PPM ACS03 JUMP TO FAIL EXIT IF END OF FILE
11123: PPM EROSI ERROR RETURN
11124: BRN ACS07 ELSE MERGE WITH OTHER FILE CASE
11125: *
11126: * HERE FOR INPUT FROM OTHER THAN STANDARD INPUT FILE
11127: *
11128: ACS06 MOV TRTAG(XL),WA OBTAIN IOTAG
11129: BZE WA,ACS03 FAIL IF ENDFILE DONE
11130: JSR SYSIL GET INPUT RECORD MAX LENGTH (TO WA)
11131: JSR ALOCS ALLOCATE STRING OF CORRECT SIZE
11132: MOV TRTAG(XL),WA GET IOTAG
11133: JSR SYSIN CALL SYSTEM INPUT ROUTINE
11134: PPM ACS03 JUMP TO FAIL EXIT IF END OF FILE
11135: PPM ACS22 ERROR RETURN
11136: EJC
11137: *
11138: * ACESS (CONTINUED)
11139: *
11140: * MERGE HERE AFTER OBTAINING INPUT RECORD
11141: *
11142: ACS07 MOV KVTRM,WB LOAD TRIM INDICATOR
11143: JSR TRIMR TRIM RECORD AS REQUIRED
11144: MOV XR,WB COPY RESULT POINTER
11145: MOV (XS),XR RELOAD POINTER TO TRBLK
11146: *
11147: * LOOP TO CHASE TO END OF TRBLK CHAIN AND STORE VALUE
11148: *
11149: ACS08 MOV XR,XL SAVE POINTER TO THIS TRBLK
11150: MOV TRNXT(XR),XR LOAD FORWARD POINTER
11151: BEQ (XR),=B$TRT,ACS08 LOOP IF THIS IS ANOTHER TRBLK
11152: MOV WB,TRNXT(XL) ELSE STORE RESULT AT END OF CHAIN
11153: MOV (XS)+,XR RESTORE INITIAL TRBLK POINTER
11154: MOV (XS)+,WA RESTORE NAME OFFSET
11155: MOV (XS)+,XL RESTORE NAME BASE POINTER
11156: *
11157: * COME HERE TO MOVE TO NEXT TRBLK
11158: *
11159: ACS09 MOV TRNXT(XR),XR LOAD FORWARD PTR TO NEXT VALUE
11160: BRN ACS02 BACK TO CHECK IF TRAPPED
11161: *
11162: * HERE TO CHECK FOR ACCESS TRACE TRBLK
11163: *
11164: ACS10 BNE WB,=TRTAC,ACS09 LOOP BACK IF NOT ACCESS TRACE
11165: BZE KVTRA,ACS09 IGNORE ACCESS TRACE IF TRACE OFF
11166: DCV KVTRA ELSE DECREMENT TRACE COUNT
11167: BZE TRFNC(XR),ACS11 JUMP IF PRINT TRACE
11168: EJC
11169: *
11170: * ACESS (CONTINUED)
11171: *
11172: * HERE FOR FULL FUNCTION TRACE
11173: *
11174: JSR TRXEQ CALL ROUTINE TO EXECUTE TRACE
11175: BRN ACS09 JUMP FOR NEXT TRBLK
11176: *
11177: * HERE FOR CASE OF PRINT TRACE
11178: *
11179: ACS11 JSR PRTSN PRINT STATEMENT NUMBER
11180: JSR PRTNV PRINT NAME = VALUE
11181: BRN ACS09 JUMP BACK FOR NEXT TRBLK
11182: *
11183: * HERE FOR KEYWORD VARIABLE
11184: *
11185: ACS12 MOV KVNUM(XL),XR LOAD KEYWORD NUMBER
11186: BGE XR,=K$V$$,ACS14 JUMP IF NOT ONE WORD VALUE
11187: MTI KVANC(XR) ELSE LOAD VALUE AS INTEGER
11188: *
11189: * COMMON EXIT WITH KEYWORD VALUE AS INTEGER IN (IA)
11190: *
11191: ACS13 JSR ICBLD BUILD ICBLK
11192: BRN ACS18 JUMP TO EXIT
11193: *
11194: * HERE IF NOT ONE WORD KEYWORD VALUE
11195: *
11196: ACS14 BGE XR,=K$S$$,ACS15 JUMP IF SPECIAL CASE
11197: SUB =K$V$$,XR ELSE GET OFFSET
11198: WTB XR CONVERT TO OFFSET IN BAUS
11199: ADD =NDABO,XR POINT TO PATTERN VALUE
11200: BRN ACS18 JUMP TO EXIT
11201: *
11202: * HERE IF SPECIAL KEYWORD CASE
11203: *
11204: ACS15 MOV KVRTN,XL LOAD RTNTYPE IN CASE
11205: LDI KVSTL LOAD STLIMIT IN CASE
11206: SUB =K$S$$,XR GET CASE NUMBER
11207: BSW XR,6 SWITCH ON KEYWORD NUMBER
11208: IFF K$$AL,ACS16 JUMP IF ALPHABET
11209: IFF K$$RT,ACS17 RTNTYPE
11210: IFF K$$CD,ACS23 CODE
11211: IFF K$$SC,ACS19 STCOUNT
11212: IFF K$$SL,ACS13 STLIMIT
11213: IFF K$$ET,ACS20 ERRTEXT
11214: ESW END SWITCH ON KEYWORD NUMBER
11215: EJC
11216: *
11217: * ACESS (CONTINUED)
11218: *
11219: * ALPHABET
11220: *
11221: ACS16 MOV KVALP,XL LOAD POINTER TO ALPHABET STRING
11222: *
11223: * RTNTYPE MERGES HERE
11224: *
11225: ACS17 MOV XL,XR COPY STRING PTR TO PROPER REG
11226: *
11227: * COMMON RETURN POINT
11228: *
11229: ACS18 EXI RETURN TO ACESS CALLER
11230: *
11231: * HERE FOR STCOUNT (IA HAS STLIMIT)
11232: *
11233: ACS19 SBI KVSTC STCOUNT = LIMIT - LEFT
11234: BRN ACS13 MERGE BACK WITH INTEGER RESULT
11235: *
11236: * ERRTEXT
11237: *
11238: ACS20 MOV R$ETX,XR GET ERRTEXT STRING
11239: BRN ACS18 MERGE WITH RESULT
11240: *
11241: * HERE TO READ A RECORD FROM TERMINAL
11242: *
11243: ACS21 MOV =RILEN,WA BUFFER LENGTH
11244: JSR ALOCS ALLOCATE BUFFER
11245: JSR SYSRI READ RECORD
11246: PPM ACS03 ENDFILE
11247: PPM EROSI ERROR RETURN
11248: BRN ACS07 MERGE WITH RECORD READ
11249: *
11250: * ERROR RETURN
11251: *
11252: ACS22 MOV XR,DNAMP POP UNUSED SCBLK
11253: BRN EROSI GENERATE ERROR MESSAGE
11254: *
11255: * ACCESS CODE KEYWORD
11256: *
11257: ACS23 LDI KVCOD GET CODE VALUE
11258: BRN ACS13 EXIT
11259: ENP END PROCEDURE ACESS
11260: EJC
11261: *
11262: * ACOMP -- COMPARE TWO ARITHMETIC VALUES
11263: *
11264: * 1(XS) FIRST ARGUMENT
11265: * 0(XS) SECOND ARGUMENT
11266: * JSR ACOMP CALL TO COMPARE VALUES
11267: * PPM LOC TRANSFER LOC IF ARG1 IS NON-NUMERIC
11268: * PPM LOC TRANSFER LOC IF ARG2 IS NON-NUMERIC
11269: * PPM LOC TRANSFER LOC FOR ARG1 LT ARG2
11270: * PPM LOC TRANSFER LOC FOR ARG1 EQ ARG2
11271: * PPM LOC TRANSFER LOC FOR ARG1 GT ARG2
11272: * (NORMAL RETURN IS NEVER GIVEN)
11273: * (WA,WB,WC,IA,RA) DESTROYED
11274: * (XL,XR) DESTROYED
11275: *
11276: ACOMP PRC N,5 ENTRY POINT
11277: JSR ARITH LOAD ARITHMETIC OPERANDS
11278: PPM ACMP7 JUMP IF FIRST ARG NON-NUMERIC
11279: PPM ACMP8 JUMP IF SECOND ARG NON-NUMERIC
11280: .IF .CNRA
11281: .ELSE
11282: PPM ACMP4 JUMP IF REAL ARGUMENTS
11283: .FI
11284: *
11285: * HERE FOR INTEGER ARGUMENTS
11286: *
11287: SBI ICVAL(XL) SUBTRACT TO COMPARE
11288: IOV ACMP3 JUMP IF OVERFLOW
11289: ILT ACMP5 ELSE JUMP IF ARG1 LT ARG2
11290: IEQ ACMP2 JUMP IF ARG1 EQ ARG2
11291: *
11292: * HERE IF ARG1 GT ARG2
11293: *
11294: ACMP1 EXI 5 TAKE GT EXIT
11295: *
11296: * HERE IF ARG1 EQ ARG2
11297: *
11298: ACMP2 EXI 4 TAKE EQ EXIT
11299: EJC
11300: *
11301: * ACOMP (CONTINUED)
11302: *
11303: * HERE FOR INTEGER OVERFLOW ON SUBTRACT
11304: *
11305: ACMP3 LDI ICVAL(XL) LOAD SECOND ARGUMENT
11306: ILT ACMP1 GT IF NEGATIVE
11307: BRN ACMP5 ELSE LT
11308: .IF .CNRA
11309: .ELSE
11310: *
11311: * HERE FOR REAL OPERANDS
11312: *
11313: ACMP4 SBR RCVAL(XL) SUBTRACT TO COMPARE
11314: ROV ACMP6 JUMP IF OVERFLOW
11315: RGT ACMP1 ELSE JUMP IF ARG1 GT
11316: REQ ACMP2 JUMP IF ARG1 EQ ARG2
11317: .FI
11318: *
11319: * HERE IF ARG1 LT ARG2
11320: *
11321: ACMP5 EXI 3 TAKE LT EXIT
11322: .IF .CNRA
11323: .ELSE
11324: *
11325: * HERE IF OVERFLOW ON REAL SUBTRACTION
11326: *
11327: ACMP6 LDR RCVAL(XL) RELOAD ARG2
11328: RLT ACMP1 GT IF NEGATIVE
11329: BRN ACMP5 ELSE LT
11330: .FI
11331: *
11332: * HERE IF ARG1 NON-NUMERIC
11333: *
11334: ACMP7 EXI 1 TAKE ERROR EXIT
11335: *
11336: * HERE IF ARG2 NON-NUMERIC
11337: *
11338: ACMP8 EXI 2 TAKE ERROR EXIT
11339: ENP END PROCEDURE ACOMP
11340: EJC
11341: *
11342: * ALLOC ALLOCATE BLOCK OF DYNAMIC STORAGE
11343: *
11344: * (WA) LENGTH REQUIRED IN BAUS
11345: * JSR ALLOC CALL TO ALLOCATE BLOCK
11346: * (XR) POINTER TO ALLOCATED BLOCK
11347: *
11348: * A POSSIBLE ALTERNATIVE TO AOV .. AND FOLLOWING STMT IS -
11349: * MOV DNAME,XR . SUB WA,XR . BLO XR,DNAMP,ALOC2 .
11350: * MOV DNAMP,XR . ADD WA,XR
11351: *
11352: ALLOC PRC E,0 ENTRY POINT
11353: *
11354: * COMMON EXIT POINT
11355: *
11356: ALOC1 MOV DNAMP,XR POINT TO NEXT AVAILABLE LOC
11357: AOV WA,XR,ALOC2 POINT PAST ALLOCATED BLOCK
11358: BGT XR,DNAME,ALOC2 JUMP IF NOT ENOUGH ROOM
11359: MOV XR,DNAMP STORE NEW POINTER
11360: SUB WA,XR POINT BACK TO START OF ALLOCATED BK
11361: EXI RETURN TO CALLER
11362: *
11363: * HERE IF INSUFFICIENT ROOM, TRY A GARBAGE COLLECTION
11364: *
11365: ALOC2 MOV WB,ALLSV SAVE WB
11366: ZER WB SET NO UPWARD MOVE FOR GBCOL
11367: JSR GBCOL GARBAGE COLLECT
11368: *
11369: * SEE IF ROOM AFTER GBCOL OR SYSMM CALL
11370: *
11371: ALOC3 MOV DNAMP,XR POINT TO FIRST AVAILABLE LOC
11372: AOV WA,XR,ALC3A POINT PAST NEW BLOCK
11373: BLO XR,DNAME,ALOC4 JUMP IF THERE IS ROOM NOW
11374: *
11375: * FAILED AGAIN, SEE IF WE CAN GET MORE CORE
11376: *
11377: ALC3A JSR SYSMM TRY TO GET MORE MEMORY
11378: WTB XR CONVERT TO BAUS
11379: ADD XR,DNAME BUMP PTR BY AMOUNT OBTAINED
11380: BNZ XR,ALOC3 JUMP IF GOT MORE CORE
11381: ADD RSMEM,DNAME GET THE RESERVE MEMORY
11382: ZER RSMEM ONLY PERMISSIBLE ONCE
11383: ICV ERRFT FATAL ERROR
11384: ERB 200,MEMORY OVERFLOW
11385: EJC
11386: *
11387: * HERE AFTER SUCCESSFUL GARBAGE COLLECTION
11388: *
11389: ALOC4 STI ALLIA SAVE IA
11390: MOV DNAME,WB GET DYNAMIC END ADRS
11391: SUB DNAMP,WB COMPUTE FREE STORE
11392: BTW WB CONVERT BAUS TO WORDS
11393: MTI WB PUT FREE STORE IN IA
11394: MLI ALFSF MULTIPLY BY FREE STORE FACTOR
11395: IOV ALOC5 JUMP IF OVERFLOWED
11396: MOV DNAME,WB DYNAMIC END ADRS
11397: SUB DNAMB,WB COMPUTE TOTAL AMOUNT OF DYNAMIC
11398: BTW WB CONVERT TO WORDS
11399: MOV WB,ALDYN STORE IT
11400: SBI ALDYN SUBTRACT FROM SCALED UP FREE STORE
11401: IGT ALOC5 JUMP IF SUFFICIENT FREE STORE
11402: JSR SYSMM TRY TO GET MORE STORE
11403: WTB XR CONVERT TO BAUS
11404: ADD XR,DNAME ADJUST DYNAMIC END ADRS
11405: *
11406: * MERGE TO RESTORE IA AND WB
11407: *
11408: ALOC5 LDI ALLIA RECOVER IA
11409: MOV ALLSV,WB RESTORE WB
11410: BRN ALOC1 JUMP BACK TO EXIT
11411: ENP END PROCEDURE ALLOC
11412: EJC
11413: .IF .CNBF
11414: .ELSE
11415: *
11416: * ALOBF -- ALLOCATE BUFFER
11417: *
11418: * THIS ROUTINES ALLOCATES A NEW BUFFER. AS THE BFBLK
11419: * AND BCBLK COME IN PAIRS, BOTH ARE ALLOCATED HERE,
11420: * AND XR POINTS TO THE BCBLK ON RETURN. THE BFBLK
11421: * AND BCBLK ARE SET TO THE NULL BUFFER, AND THE IDVAL
11422: * IS ZERO ON RETURN.
11423: *
11424: * (WA) BUFFER SIZE IN CHARACTERS
11425: * JSR ALOBF CALL TO CREATE BUFFER
11426: * (WA) 0 (INITIAL OFFSET TO BFBLK CHARS)
11427: * (WB) 0 (INITIAL BCLEN)
11428: * (XR) BCBLK PTR
11429: *
11430: ALOBF PRC E,0 ENTRY POINT
11431: MOV WA,WB HANG ONTO ALLOCATION SIZE
11432: CTB WA,BFSI$ GET TOTAL BLOCK SIZE
11433: BGE WA,MXLEN,ALB01 CHECK FOR MAXLEN EXCEEDED
11434: ADD *BCSI$,WA ADD IN ALLOCATION FOR BCBLK
11435: JSR ALLOC ALLOCATE FRAME
11436: MOV =B$BCT,(XR) SET TYPE
11437: ZER IDVAL(XR) NO ID YET
11438: ZER BCLEN(XR) NO DEFINED LENGTH
11439: MOV XL,WA SAVE XL
11440: MOV XR,XL COPY BCBLK PTR
11441: ADD *BCSI$,XL BIAS PAST PARTIALLY BUILT BCBLK
11442: MOV =B$BFT,(XL) SET BFBLK TYPE WORD
11443: MOV WB,BFALC(XL) SET ALLOCATED SIZE
11444: MOV XL,BCBUF(XR) SET POINTER IN BCBLK
11445: ZER WB CLEAR FOR RETURN
11446: MOV WB,BFCHR(XL) CLEAR FIRST WORD (NULL PAD)
11447: MOV WA,XL RESTORE ENTRY XL
11448: ZER WA CLEAR FOR RETURN
11449: EXI RETURN TO CALLER
11450: *
11451: * HERE FOR MXLEN EXCEEDED
11452: *
11453: ALB01 ERB 201,REQUESTED BUFFER ALLOCATION EXCEEDS MAXLNGTH
11454: ENP END PROCEDURE ALOBF
11455: EJC
11456: .FI
11457: *
11458: * ALOCS -- ALLOCATE STRING BLOCK
11459: *
11460: * ALOCS IS USED TO BUILD A FRAME FOR A STRING BLOCK INTO
11461: * WHICH THE ACTUAL CHARACTERS ARE PLACED BY THE CALLER.
11462: * ALL STRINGS ARE CREATED WITH A CALL TO ALOCS (THE
11463: * EXCEPTIONS OCCUR IN TRIMR AND S$RPL PROCEDURES).
11464: *
11465: * (WA) LENGTH OF STRING TO BE ALLOCATED
11466: * JSR ALOCS CALL TO ALLOCATE SCBLK
11467: * (XR) POINTER TO RESULTING SCBLK
11468: * (WA) DESTROYED
11469: * (WC) CHARACTER COUNT (ENTRY VALUE OF WA)
11470: *
11471: * THE RESULTING SCBLK HAS THE TYPE WORD AND THE LENGTH
11472: * FILLED IN AND THE LAST WORD IS CLEARED TO ZERO CHARACTERS
11473: * TO ENSURE CORRECT RIGHT PADDING OF THE FINAL WORD.
11474: *
11475: ALOCS PRC E,0 ENTRY POINT
11476: BGT WA,KVMXL,ALCS2 JUMP IF LENGTH EXCEEEDS MAXLENGTH
11477: MOV WA,WC ELSE COPY LENGTH
11478: CTB WA,SCSI$ COMPUTE LENGTH OF SCBLK IN BAUS
11479: MOV DNAMP,XR POINT TO NEXT AVAILABLE LOCATION
11480: AOV WA,XR,ALCS0 POINT PAST BLOCK
11481: BLO XR,DNAME,ALCS1 JUMP IF THERE IS ROOM
11482: *
11483: * INSUFFICIENT MEMORY
11484: *
11485: ALCS0 ZER XR ELSE CLEAR GARBAGE XR VALUE
11486: JSR ALLOC AND USE STANDARD ALLOCATOR
11487: ADD WA,XR POINT PAST END OF BLOCK TO MERGE
11488: *
11489: * MERGE HERE WITH XR POINTING BEYOND NEW BLOCK
11490: *
11491: ALCS1 MOV XR,DNAMP SET UPDATED STORAGE POINTER
11492: ZER -(XR) STORE ZERO CHARS IN LAST WORD
11493: DCA WA DECREMENT LENGTH
11494: SUB WA,XR POINT BACK TO START OF BLOCK
11495: MOV =B$SCL,(XR) SET TYPE WORD
11496: MOV WC,SCLEN(XR) STORE LENGTH IN CHARS
11497: EXI RETURN TO ALOCS CALLER
11498: *
11499: * COME HERE IF STRING IS TOO LONG
11500: *
11501: ALCS2 ERB 202,STRING LENGTH EXCEEDS VALUE OF MAXLNGTH KEYWORD
11502: ENP END PROCEDURE ALOCS
11503: EJC
11504: *
11505: * ALOST -- ALLOCATE SPACE IN STATIC REGION
11506: *
11507: * (WA) LENGTH REQUIRED IN BAUS
11508: * JSR ALOST CALL TO ALLOCATE SPACE
11509: * (XR) POINTER TO ALLOCATED BLOCK
11510: * (WB) DESTROYED
11511: *
11512: * NOTE THAT THE CODING ENSURES THAT THE RESULTING VALUE
11513: * OF STATE IS ALWAYS LESS THAN DNAMB. THIS FACT IS USED
11514: * IN TESTING A VARIABLE NAME FOR BEING IN THE STATIC REGION
11515: *
11516: ALOST PRC E,0 ENTRY POINT
11517: *
11518: * MERGE BACK HERE AFTER ALLOCATING NEW CHUNK
11519: *
11520: ALST1 MOV STATE,XR POINT TO CURRENT END OF AREA
11521: AOV WA,XR,ALST2 POINT BEYOND PROPOSED BLOCK
11522: BGE XR,DNAMB,ALST2 JUMP IF OVERLAP WITH DYNAMIC AREA
11523: MOV XR,STATE ELSE STORE NEW POINTER
11524: SUB WA,XR POINT BACK TO START OF BLOCK
11525: EXI RETURN TO ALOST CALLER
11526: *
11527: * HERE IF NO ROOM, PREPARE TO MOVE DYNAMIC STORAGE UP
11528: *
11529: ALST2 MOV WA,ALSTA SAVE WA
11530: BGE WA,*E$STS,ALST3 SKIP IF REQUESTED CHUNK IS LARGE
11531: MOV *E$STS,WA ELSE SET TO GET LARGE ENOUGH CHUNK
11532: *
11533: * HERE WITH AMOUNT TO MOVE UP IN WA
11534: *
11535: ALST3 JSR ALLOC ALLOCATE BLOCK TO ENSURE ROOM
11536: MOV XR,DNAMP AND DELETE IT
11537: MOV WA,WB COPY MOVE UP AMOUNT
11538: JSR GBCOL CALL GBCOL TO MOVE DYNAMIC AREA UP
11539: MOV ALSTA,WA RESTORE WA
11540: BRN ALST1 LOOP BACK TO TRY AGAIN
11541: ENP END PROCEDURE ALOST
11542: EJC
11543: *
11544: * ARITH -- FETCH ARITHMETIC OPERANDS
11545: *
11546: * ARITH IS USED BY FUNCTIONS AND OPERATORS WHICH EXPECT
11547: * TWO NUMERIC ARGUMENTS (OPERANDS) WHICH MUST BOTH BE
11548: * INTEGER OR BOTH BE REAL. ARITH FETCHES TWO ARGUMENTS FROM
11549: * THE STACK AND PERFORMS ANY NECESSARY CONVERSIONS.
11550: *
11551: * 1(XS) FIRST ARGUMENT (LEFT OPERAND)
11552: * 0(XS) SECOND ARGUMENT (RIGHT OPERAND)
11553: * JSR ARITH CALL TO FETCH NUMERIC ARGUMENTS
11554: * PPM LOC TRANSFER LOC FOR OPND 1 NON-NUMERIC
11555: * PPM LOC TRANSFER LOC FOR OPND 2 NON-NUMERIC
11556: .IF .CNRA
11557: .ELSE
11558: * PPM LOC TRANSFER LOC FOR REAL OPERANDS
11559: .FI
11560: *
11561: * FOR INTEGER ARGS, CONTROL RETURNS PAST THE PARAMETERS
11562: *
11563: * (IA) LEFT OPERAND VALUE
11564: * (XR) PTR TO ICBLK FOR LEFT OPERAND
11565: * (XL) PTR TO ICBLK FOR RIGHT OPERAND
11566: * (XS) POPPED TWICE
11567: * (WA,WB,RA) DESTROYED
11568: .IF .CNRA
11569: .ELSE
11570: *
11571: * FOR REAL ARGUMENTS, CONTROL RETURNS TO THE LOCATION
11572: * SPECIFIED BY THE THIRD PARAMETER.
11573: *
11574: * (RA) LEFT OPERAND VALUE
11575: * (XR) PTR TO RCBLK FOR LEFT OPERAND
11576: * (XL) PTR TO RCBLK FOR RIGHT OPERAND
11577: * (WA,WB,WC) DESTROYED
11578: * (XS) POPPED TWICE
11579: .FI
11580: EJC
11581: *
11582: * ARITH (CONTINUED)
11583: *
11584: * ENTRY POINT
11585: *
11586: .IF .CNRA
11587: ARITH PRC N,2 ENTRY POINT
11588: .ELSE
11589: ARITH PRC N,3 ENTRY POINT
11590: .FI
11591: MOV (XS)+,XL LOAD RIGHT OPERAND
11592: MOV (XS)+,XR LOAD LEFT OPERAND
11593: MOV (XL),WA GET RIGHT OPERAND TYPE WORD
11594: BEQ WA,=B$ICL,ARTH1 JUMP IF INTEGER
11595: .IF .CNRA
11596: .ELSE
11597: BEQ WA,=B$RCL,ARTH4 JUMP IF REAL
11598: .FI
11599: MOV XR,-(XS) ELSE REPLACE LEFT ARG ON STACK
11600: MOV XL,XR COPY LEFT ARG POINTER
11601: JSR GTNUM CONVERT TO NUMERIC
11602: PPM ARTH6 JUMP IF UNCONVERTIBLE
11603: MOV XR,XL ELSE COPY CONVERTED RESULT
11604: MOV (XL),WA GET RIGHT OPERAND TYPE WORD
11605: MOV (XS)+,XR RELOAD LEFT ARGUMENT
11606: .IF .CNRA
11607: .ELSE
11608: BEQ WA,=B$RCL,ARTH4 JUMP IF RIGHT ARG IS REAL
11609: .FI
11610: *
11611: * HERE IF RIGHT ARG IS AN INTEGER
11612: *
11613: ARTH1 BNE (XR),=B$ICL,ARTH3 JUMP IF LEFT ARG NOT INTEGER
11614: *
11615: * EXIT FOR INTEGER CASE
11616: *
11617: ARTH2 LDI ICVAL(XR) LOAD LEFT OPERAND VALUE
11618: EXI RETURN TO ARITH CALLER
11619: *
11620: * HERE FOR RIGHT OPERAND INTEGER, LEFT OPERAND NOT
11621: *
11622: ARTH3 JSR GTNUM CONVERT LEFT ARG TO NUMERIC
11623: PPM ARTH7 JUMP IF NOT CONVERTIBLE
11624: BEQ WA,=B$ICL,ARTH2 JUMP BACK IF INTEGER-INTEGER
11625: .IF .CNRA
11626: .ELSE
11627: *
11628: * HERE WE MUST CONVERT REAL-INTEGER TO REAL-REAL
11629: *
11630: MOV XR,-(XS) PUT LEFT ARG BACK ON STACK
11631: LDI ICVAL(XL) LOAD RIGHT ARGUMENT VALUE
11632: ITR CONVERT TO REAL
11633: JSR RCBLD GET REAL BLOCK FOR RIGHT ARG, MERGE
11634: MOV XR,XL COPY RIGHT ARG PTR
11635: MOV (XS)+,XR LOAD LEFT ARGUMENT
11636: BRN ARTH5 MERGE FOR REAL-REAL CASE
11637: EJC
11638: *
11639: * ARITH (CONTINUED)
11640: *
11641: * HERE IF RIGHT ARGUMENT IS REAL
11642: *
11643: ARTH4 BEQ (XR),=B$RCL,ARTH5 JUMP IF LEFT ARG REAL
11644: JSR GTREA ELSE CONVERT TO REAL
11645: PPM ARTH7 ERROR IF UNCONVERTIBLE
11646: *
11647: * HERE FOR REAL-REAL
11648: *
11649: ARTH5 LDR RCVAL(XR) LOAD LEFT OPERAND VALUE
11650: EXI 3 TAKE REAL-REAL EXIT
11651: .FI
11652: *
11653: * HERE FOR ERROR CONVERTING RIGHT ARGUMENT
11654: *
11655: ARTH6 ICA XS POP UNWANTED LEFT ARG
11656: EXI 2 TAKE APPROPRIATE ERROR EXIT
11657: *
11658: * HERE FOR ERROR CONVERTING LEFT OPERAND
11659: *
11660: ARTH7 EXI 1 TAKE APPROPRIATE ERROR RETURN
11661: ENP END PROCEDURE ARITH
11662: EJC
11663: *
11664: * ASIGN -- PERFORM ASSIGNMENT
11665: *
11666: * ASIGN PERFORMS THE ASSIGNMENT OF A VALUE TO A VARIABLE
11667: * WITH APPROPRIATE CHECKS FOR OUTPUT ASSOCIATIONS AND
11668: * VALUE TRACE ASSOCIATIONS WHICH ARE EXECUTED AS REQUIRED.
11669: * ASIGN ALSO HANDLES THE SPECIAL CASES OF ASSIGNMENT TO
11670: * PATTERN AND EXPRESSION VARIABLES.
11671: *
11672: * (WB) VALUE TO BE ASSIGNED
11673: * (XL) BASE POINTER FOR VARIABLE
11674: * (WA) OFFSET FOR VARIABLE
11675: * JSR ASIGN CALL TO ASSIGN VALUE TO VARIABLE
11676: * PPM LOC TRANSFER LOC FOR FAILURE
11677: * (XR,XL,WA,WB,WC) DESTROYED
11678: * (RA) DESTROYED
11679: *
11680: * FAILURE OCCURS IF THE EVALUATION OF AN EXPRESSION
11681: * ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS.
11682: *
11683: ASIGN PRC R,1 ENTRY POINT (RECURSIVE)
11684: *
11685: * MERGE BACK HERE TO ASSIGN RESULT TO EXPRESSION VARIABLE.
11686: *
11687: ASG01 ADD WA,XL POINT TO VARIABLE VALUE
11688: MOV (XL),XR LOAD VARIABLE VALUE
11689: BEQ (XR),=B$TRT,ASG02 JUMP IF TRAPPED
11690: MOV WB,(XL) ELSE PERFORM ASSIGNMENT
11691: ZER XL CLEAR GARBAGE VALUE IN XL
11692: EXI AND RETURN TO ASIGN CALLER
11693: *
11694: * HERE IF VALUE IS TRAPPED
11695: *
11696: ASG02 SUB WA,XL RESTORE NAME BASE
11697: BEQ XR,=TRBKV,ASG14 JUMP IF KEYWORD VARIABLE
11698: BNE XR,=TRBEV,ASG04 JUMP IF NOT EXPRESSION VARIABLE
11699: *
11700: * HERE FOR ASSIGNMENT TO EXPRESSION VARIABLE
11701: *
11702: MOV EVEXP(XL),XR POINT TO EXPRESSION
11703: MOV WB,-(XS) STORE VALUE TO ASSIGN ON STACK
11704: MOV =NUM01,WB SET FOR EVALUATION BY NAME
11705: JSR EVALX EVALUATE EXPRESSION BY NAME
11706: PPM ASG03 JUMP IF EVALUATION FAILS
11707: MOV (XS)+,WB ELSE RELOAD VALUE TO ASSIGN
11708: BRN ASG01 LOOP BACK TO PERFORM ASSIGNMENT
11709: EJC
11710: *
11711: * ASIGN (CONTINUED)
11712: *
11713: * HERE FOR FAILURE RETURNS
11714: *
11715: ASG03 ICA XS REMOVE STACKED VALUE ENTRY
11716: *
11717: ASG3A EXI 1 TAKE FAILURE EXIT
11718: *
11719: * HERE IF NOT KEYWORD OR EXPRESSION VARIABLE
11720: *
11721: ASG04 MOV XR,-(XS) SAVE PTR TO FIRST TRBLK
11722: *
11723: * LOOP TO CHASE DOWN TRBLK CHAIN AND ASSIGN VALUE AT END
11724: *
11725: ASG05 MOV XR,WC SAVE PTR TO THIS TRBLK
11726: MOV TRNXT(XR),XR POINT TO NEXT TRBLK
11727: BEQ (XR),=B$TRT,ASG05 LOOP BACK IF ANOTHER TRBLK
11728: MOV WC,XR ELSE POINT BACK TO LAST TRBLK
11729: MOV WB,TRVAL(XR) STORE VALUE AT END OF CHAIN
11730: MOV (XS)+,XR RESTORE PTR TO FIRST TRBLK
11731: *
11732: * LOOP TO PROCESS TRBLK ENTRIES ON CHAIN
11733: *
11734: ASG06 MOV TRTYP(XR),WB LOAD TYPE CODE OF TRBLK
11735: BEQ WB,=TRTVL,ASG08 JUMP IF VALUE TRACE
11736: BEQ WB,=TRTOU,ASG10 JUMP IF OUTPUT ASSOCIATION
11737: *
11738: * HERE TO MOVE TO NEXT TRBLK ON CHAIN
11739: *
11740: ASG07 MOV TRNXT(XR),XR POINT TO NEXT TRBLK ON CHAIN
11741: BEQ (XR),=B$TRT,ASG06 LOOP BACK IF ANOTHER TRBLK
11742: EXI ELSE END OF CHAIN, RETURN TO CALLER
11743: *
11744: * HERE TO PROCESS VALUE TRACE
11745: *
11746: ASG08 BZE KVTRA,ASG07 IGNORE VALUE TRACE IF TRACE OFF
11747: DCV KVTRA ELSE DECREMENT TRACE COUNT
11748: BZE TRFNC(XR),ASG09 JUMP IF PRINT TRACE
11749: JSR TRXEQ ELSE EXECUTE FUNCTION TRACE
11750: BRN ASG07 AND LOOP BACK
11751: EJC
11752: *
11753: * ASIGN (CONTINUED)
11754: *
11755: * HERE FOR PRINT TRACE
11756: *
11757: ASG09 JSR PRTSN PRINT STATEMENT NUMBER
11758: JSR PRTNV PRINT NAME = VALUE
11759: BRN ASG07 LOOP BACK FOR NEXT TRBLK
11760: *
11761: * HERE FOR OUTPUT ASSOCIATION
11762: *
11763: ASG10 BZE KVOUP,ASG07 IGNORE OUTPUT ASSOC IF OUTPUT OFF
11764: MOV XR,XL ELSE COPY TRBLK POINTER
11765: MOV TRVAL(XR),-(XS) STACK VALUE TO OUTPUT
11766: JSR GTSTG CONVERT TO STRING
11767: PPM ASG12 GET DATATYPE NAME IF UNCONVERTIBLE
11768: *
11769: * MERGE WITH STRING FOR OUTPUT
11770: *
11771: ASG11 MOV TRTRI(XL),WA TRTIO BLK PTR
11772: BZE WA,ASG13 JUMP IF STANDARD OUTPUT FILE
11773: *
11774: * HERE FOR OUTPUT TO NON-STANDARD OUTPUT FILE
11775: *
11776: MOV WA,XL COPY TRTIO BLOCK PTR TO XL
11777: MOV TRTAG(XL),WA GET IOTAG
11778: BZE WA,ASG3A FAIL IF ENDFILE DONE
11779: MOV SCLEN(XR),WC STRING LENGTH
11780: JSR SYSOU CALL SYSTEM OUTPUT ROUTINE
11781: PPM ASG3A FAIL RETURN
11782: PPM EROSI ERROR RETURN
11783: EXI ELSE ALL DONE, RETURN TO CALLER
11784: *
11785: * IF NOT PRINTABLE, GET DATATYPE NAME INSTEAD
11786: *
11787: ASG12 JSR DTYPE CALL DATATYPE ROUTINE
11788: BRN ASG11 MERGE
11789: *
11790: * HERE TO PRINT A STRING
11791: *
11792: ASG13 BEQ TRTER(XL),=V$TER,ASG20 JUMP IF TERMINAL OUTPUT
11793: JSR PRTSF PRINT STRING AND FLUSH BUFFER
11794: EXI RETURN TO CALLER
11795: EJC
11796: *
11797: * ASIGN (CONTINUED)
11798: *
11799: * HERE FOR KEYWORD ASSIGNMENT
11800: *
11801: ASG14 MOV KVNUM(XL),XL LOAD KEYWORD NUMBER
11802: BEQ XL,=K$ETX,ASG19 JUMP IF ERRTEXT
11803: MOV WB,XR COPY VALUE TO BE ASSIGNED
11804: JSR GTINT CONVERT TO INTEGER
11805: ERR 203,KEYWORD VALUE ASSIGNED IS NOT INTEGER
11806: LDI ICVAL(XR) ELSE LOAD VALUE
11807: BEQ XL,=K$STL,ASG16 JUMP IF SPECIAL CASE OF STLIMIT
11808: BEQ XL,=K$COD,ASG24 JUMP IF SPECIAL CASE OF CODE
11809: MFI WA,ASG18 ELSE GET ADDR INTEGER, TEST OVFLOW
11810: BGE WA,MXLEN,ASG18 FAIL IF TOO LARGE
11811: BEQ XL,=K$ERT,ASG17 JUMP IF SPECIAL CASE OF ERRTYPE
11812: .IF .CNPF
11813: .ELSE
11814: BEQ XL,=K$PFL,ASG21 JUMP IF SPECIAL CASE OF PROFILE
11815: .FI
11816: BLT XL,=K$P$$,ASG15 JUMP UNLESS PROTECTED
11817: ERB 204,KEYWORD IN ASSIGNMENT IS PROTECTED
11818: *
11819: * HERE TO DO ASSIGNMENT IF NOT PROTECTED
11820: *
11821: ASG15 MOV WA,KVANC(XL) STORE NEW VALUE
11822: EXI RETURN TO ASIGN CALLER
11823: *
11824: * HERE FOR SPECIAL CASE OF STLIMIT
11825: *
11826: * SINCE STCOUNT IS MAINTAINED AS (STLIMIT-STCOUNT)
11827: * IT IS ALSO NECESSARY TO MODIFY STCOUNT APPROPRIATELY.
11828: *
11829: ASG16 SBI KVSTL SUBTRACT OLD LIMIT
11830: ADI KVSTC ADD OLD COUNTER
11831: STI KVSTC STORE NEW COUNTER VALUE
11832: LDI ICVAL(XR) RELOAD NEW LIMIT VALUE
11833: STI KVSTL STORE NEW LIMIT VALUE
11834: EXI RETURN TO ASIGN CALLER
11835: EJC
11836: *
11837: * ASIGN (CONTINUED)
11838: *
11839: * HERE FOR SPECIAL CASE OF ERRTYPE
11840: *
11841: ASG17 BLE WA,=NINI9,ERROR OK TO SIGNAL IF IN RANGE
11842: *
11843: * HERE IF VALUE ASSIGNED IS OUT OF RANGE
11844: *
11845: ASG18 ERB 205,KEYWORD VALUE ASSIGNED IS NEGATIVE OR TOO LARGE
11846: *
11847: * HERE FOR SPECIAL CASE OF ERRTEXT
11848: *
11849: ASG19 MOV WB,-(XS) STACK VALUE
11850: JSR GTSTG CONVERT TO STRING
11851: ERR 206,VALUE ASSIGNED TO KEYWORD ERRTEXT NOT A STRING
11852: MOV XR,R$ETX MAKE ASSIGNMENT
11853: EXI RETURN TO CALLER
11854: *
11855: * PRINT STRING TO TERMINAL
11856: *
11857: ASG20 JSR PTTST PRINT STRING TO TERMINAL
11858: JSR PTTFH FLUSH TERMINAL BUFFER
11859: EXI RETURN
11860: .IF .CNPF
11861: .ELSE
11862: * HERE FOR KEYWORD PROFILE
11863: *
11864: ASG21 BGT WA,=NUM02,ASG18 MOAN IF NOT 0,1, OR 2
11865: BZE WA,ASG15 JUST ASSIGN IF ZERO
11866: BZE PFDMP,ASG22 BRANCH IF FIRST ASSIGNMENT
11867: BEQ WA,PFDMP,ASG23 ALSO IF SAME VALUE AS BEFORE
11868: ERB 207,INCONSISTENT VALUE ASSIGNED TO KEYWORD PROFILE
11869: *
11870: ASG22 MOV WA,PFDMP NOTE VALUE ON FIRST ASSIGNMENT
11871: ASG23 JSR SYSTM GET THE TIME
11872: STI PFSTM FUDGE SOME KIND OF START TIME
11873: BRN ASG15 AND GO ASSIGN
11874: .FI
11875: *
11876: * HERE FOR KEYWORD ASSIGNMENT TO CODE
11877: *
11878: ASG24 STI KVCOD STORE VALUE
11879: EXI RETURN TO CALLER
11880: ENP END PROCEDURE ASIGN
11881: EJC
11882: *
11883: * ASINP -- ASSIGN DURING PATTERN MATCH
11884: *
11885: * ASINP IS LIKE ASIGN AND HAS A SIMILAR CALLING SEQUENCE
11886: * AND EFFECT. THE DIFFERENCE IS THAT THE GLOBAL PATTERN
11887: * VARIABLES ARE SAVED AND RESTORED IF REQUIRED.
11888: *
11889: * (XL) BASE POINTER FOR VARIABLE
11890: * (WA) OFFSET FOR VARIABLE
11891: * (WB) VALUE TO BE ASSIGNED
11892: * JSR ASINP CALL TO ASSIGN VALUE TO VARIABLE
11893: * PPM LOC TRANSFER LOC IF FAILURE
11894: * (XR,XL) DESTROYED
11895: * (WA,WB,WC,RA) DESTROYED
11896: *
11897: ASINP PRC R,1 ENTRY POINT, RECURSIVE
11898: ADD WA,XL POINT TO VARIABLE
11899: MOV (XL),XR LOAD CURRENT CONTENTS
11900: BEQ (XR),=B$TRT,ASNP1 JUMP IF TRAPPED
11901: MOV WB,(XL) ELSE PERFORM ASSIGNMENT
11902: ZER XL CLEAR GARBAGE VALUE IN XL
11903: EXI RETURN TO ASINP CALLER
11904: *
11905: * HERE IF VARIABLE IS TRAPPED
11906: *
11907: ASNP1 SUB WA,XL RESTORE BASE POINTER
11908: MOV PMSSL,-(XS) STACK SUBJECT STRING LENGTH
11909: MOV PMHBS,-(XS) STACK HISTORY STACK BASE PTR
11910: MOV R$PMS,-(XS) STACK SUBJECT STRING POINTER
11911: MOV PMDFL,-(XS) STACK DOT FLAG
11912: JSR ASIGN CALL FULL-BLOWN ASSIGNMENT ROUTINE
11913: PPM ASNP2 JUMP IF FAILURE
11914: MOV (XS)+,PMDFL RESTORE DOT FLAG
11915: MOV (XS)+,R$PMS RESTORE SUBJECT STRING POINTER
11916: MOV (XS)+,PMHBS RESTORE HISTORY STACK BASE POINTER
11917: MOV (XS)+,PMSSL RESTORE SUBJECT STRING LENGTH
11918: EXI RETURN TO ASINP CALLER
11919: *
11920: * HERE IF FAILURE IN ASIGN CALL
11921: *
11922: ASNP2 MOV (XS)+,PMDFL RESTORE DOT FLAG
11923: MOV (XS)+,R$PMS RESTORE SUBJECT STRING POINTER
11924: MOV (XS)+,PMHBS RESTORE HISTORY STACK BASE POINTER
11925: MOV (XS)+,PMSSL RESTORE SUBJECT STRING LENGTH
11926: EXI 1 TAKE FAILURE EXIT
11927: ENP END PROCEDURE ASINP
11928: EJC
11929: *
11930: * BLKLN -- DETERMINE LENGTH OF BLOCK
11931: *
11932: * BLKLN DETERMINES THE LENGTH OF A BLOCK IN DYNAMIC STORE.
11933: *
11934: * (WA) FIRST WORD OF BLOCK
11935: * (XR) POINTER TO BLOCK
11936: * JSR BLKLN CALL TO GET BLOCK LENGTH
11937: * (WA) LENGTH OF BLOCK IN BAUS
11938: * (XL) DESTROYED
11939: *
11940: * BLKLN IS USED BY THE GARBAGE COLLECTOR AND IS NOT
11941: * PERMITTED TO CALL GBCOL DIRECTLY OR INDIRECTLY.
11942: *
11943: * THE FIRST WORD STORED IN THE BLOCK (I.E. AT XR) MAY
11944: * BE ANYTHING, BUT THE CONTENTS OF WA MUST BE CORRECT.
11945: *
11946: BLKLN PRC E,0 ENTRY POINT
11947: MOV WA,XL COPY FIRST WORD
11948: LEI XL GET ENTRY ID (BL$XX)
11949: BSW XL,BL$$$,BLN00 SWITCH ON BLOCK TYPE
11950: IFF BL$AR,BLN01 ARBLK
11951: IFF BL$CD,BLN01 CDBLK
11952: IFF BL$CO,BLN12 COBLK
11953: IFF BL$DF,BLN01 DFBLK
11954: IFF BL$EF,BLN01 EFBLK
11955: IFF BL$EX,BLN01 EXBLK
11956: IFF BL$PF,BLN01 PFBLK
11957: IFF BL$TB,BLN01 TBBLK
11958: IFF BL$VC,BLN01 VCBLK
11959: IFF BL$EV,BLN03 EVBLK
11960: IFF BL$KV,BLN03 KVBLK
11961: IFF BL$P0,BLN02 P0BLK
11962: IFF BL$SE,BLN02 SEBLK
11963: IFF BL$NM,BLN03 NMBLK
11964: IFF BL$P1,BLN03 P1BLK
11965: IFF BL$P2,BLN04 P2BLK
11966: IFF BL$TE,BLN04 TEBLK
11967: IFF BL$FF,BLN05 FFBLK
11968: IFF BL$TR,BLN05 TRBLK
11969: IFF BL$CT,BLN06 CTBLK
11970: IFF BL$IC,BLN07 ICBLK
11971: IFF BL$PD,BLN08 PDBLK
11972: .IF .CNBF
11973: .ELSE
11974: IFF BL$BC,BLN04 BCBLK
11975: IFF BL$BF,BLN11 BFBLK
11976: .FI
11977: .IF .CNRA
11978: .ELSE
11979: IFF BL$RC,BLN09 RCBLK
11980: .FI
11981: IFF BL$SC,BLN10 SCBLK
11982: ESW END OF JUMP TABLE ON BLOCK TYPE
11983: EJC
11984: *
11985: * BLKLN (CONTINUED)
11986: *
11987: * HERE FOR BLOCKS WITH LENGTH IN SECOND WORD
11988: *
11989: BLN00 MOV 1(XR),WA LOAD LENGTH
11990: EXI RETURN TO BLKLN CALLER
11991: *
11992: * HERE FOR LENGTH IN THIRD WORD (AR,CD,DF,EF,EX,PF,TB,VC)
11993: *
11994: BLN01 MOV 2(XR),WA LOAD LENGTH FROM THIRD WORD
11995: EXI RETURN TO BLKLN CALLER
11996: *
11997: * HERE FOR TWO WORD BLOCKS (P0,SE)
11998: *
11999: BLN02 MOV *NUM02,WA LOAD LENGTH (TWO WORDS)
12000: EXI RETURN TO BLKLN CALLER
12001: *
12002: * HERE FOR THREE WORD BLOCKS (NM,P1,EV,KV)
12003: *
12004: BLN03 MOV *NUM03,WA LOAD LENGTH (THREE WORDS)
12005: EXI RETURN TO BLKLN CALLER
12006: *
12007: * HERE FOR FOUR WORD BLOCKS (P2,TE)
12008: *
12009: BLN04 MOV *NUM04,WA LOAD LENGTH (FOUR WORDS)
12010: EXI RETURN TO BLKLN CALLER
12011: *
12012: * HERE FOR FIVE WORD BLOCKS (FF,TR)
12013: *
12014: BLN05 MOV *NUM05,WA LOAD LENGTH
12015: EXI RETURN TO BLKLN CALLER
12016: EJC
12017: *
12018: * BLKLN (CONTINUED)
12019: *
12020: * HERE FOR CTBLK
12021: *
12022: BLN06 MOV *CTSI$,WA SET SIZE OF CTBLK
12023: EXI RETURN TO BLKLN CALLER
12024: *
12025: * HERE FOR ICBLK
12026: *
12027: BLN07 MOV *ICSI$,WA SET SIZE OF ICBLK
12028: EXI RETURN TO BLKLN CALLER
12029: *
12030: * HERE FOR PDBLK
12031: *
12032: BLN08 MOV PDDFP(XR),XL POINT TO DFBLK
12033: MOV DFPDL(XL),WA LOAD PDBLK LENGTH FROM DFBLK
12034: EXI RETURN TO BLKLN CALLER
12035: .IF .CNRA
12036: .ELSE
12037: *
12038: * HERE FOR RCBLK
12039: *
12040: BLN09 MOV *RCSI$,WA SET SIZE OF RCBLK
12041: EXI RETURN TO BLKLN CALLER
12042: .FI
12043: *
12044: * HERE FOR SCBLK
12045: *
12046: BLN10 MOV SCLEN(XR),WA LOAD LENGTH IN CHARACTERS
12047: CTB WA,SCSI$ CALCULATE LENGTH IN BAUS
12048: EXI RETURN TO BLKLN CALLER
12049: .IF .CNBF
12050: .ELSE
12051: *
12052: * HERE FOR BFBLK
12053: *
12054: BLN11 MOV BFALC(XR),WA GET ALLOCATION IN BAUS
12055: CTB WA,BFSI$ CALCULATE LENGTH IN BAUS
12056: EXI RETURN TO BLKLN CALLER
12057: .FI
12058: *
12059: * HERE FOR COBLK
12060: *
12061: BLN12 MOV *COSI$,WA GET SIZE IN BAUS
12062: EXI RETURN TO BLKLN CALLER
12063: ENP END PROCEDURE BLKLN
12064: EJC
12065: *
12066: * CBLCK -- COPY A BLOCK
12067: *
12068: * (XS) BLOCK TO BE COPIED
12069: * JSR CBLCK CALL TO COPY BLOCK
12070: * PPM LOC RETURN IF BLOCK HAS NO IDVAL FIELD
12071: * NORMAL RETURN IF IDVAL FIELD
12072: * (XR) COPY OF BLOCK
12073: * (XS) POPPED
12074: * (XL,WA,WB,WC) DESTROYED
12075: *
12076: CBLCK PRC N,1 ENTRY POINT
12077: MOV (XS),XR LOAD ARGUMENT
12078: BEQ XR,=NULLS,CBL10 RETURN ARGUMENT IF IT IS NULL
12079: MOV (XR),WA ELSE LOAD TYPE WORD
12080: MOV WA,WB COPY TYPE WORD
12081: JSR BLKLN GET LENGTH OF ARGUMENT BLOCK
12082: MOV XR,XL COPY POINTER
12083: JSR ALLOC ALLOCATE BLOCK OF SAME SIZE
12084: MOV XR,(XS) STORE POINTER TO COPY
12085: MVW COPY CONTENTS OF OLD BLOCK TO NEW
12086: MOV (XS),XR RELOAD POINTER TO START OF COPY
12087: BEQ WB,=B$TBT,CBL05 JUMP IF TABLE
12088: BEQ WB,=B$VCT,CBL01 JUMP IF VECTOR
12089: BEQ WB,=B$PDT,CBL01 JUMP IF PROGRAM DEFINED
12090: .IF .CNBF
12091: .ELSE
12092: BEQ WB,=B$BCT,CBL11 JUMP IF BUFFER
12093: .FI
12094: BNE WB,=B$ART,CBL10 RETURN COPY IF NOT ARRAY
12095: *
12096: * HERE FOR ARRAY (ARBLK)
12097: *
12098: ADD AROFS(XR),XR POINT TO PROTOTYPE FIELD
12099: BRN CBL02 JUMP TO MERGE
12100: *
12101: * HERE FOR VECTOR, PROGRAM DEFINED
12102: *
12103: CBL01 ADD *PDFLD,XR POINT TO PDFLD = VCVLS
12104: *
12105: * MERGE HERE FOR ARBLK, VCBLK, PDBLK TO DELETE TRAP
12106: * BLOCKS FROM ALL VALUE FIELDS (THE COPY IS UNTRAPPED)
12107: *
12108: CBL02 MOV (XR),XL LOAD NEXT POINTER
12109: *
12110: * LOOP TO GET VALUE AT END OF TRBLK CHAIN
12111: *
12112: CBL03 BNE (XL),=B$TRT,CBL04 JUMP IF NOT TRAPPED
12113: MOV TRVAL(XL),XL ELSE POINT TO NEXT VALUE
12114: BRN CBL03 AND LOOP BACK
12115: EJC
12116: *
12117: * CBLCK (CONTINUED)
12118: *
12119: * HERE WITH UNTRAPPED VALUE IN XL
12120: *
12121: CBL04 MOV XL,(XR)+ STORE REAL VALUE, BUMP POINTER
12122: BNE XR,DNAMP,CBL02 LOOP BACK IF MORE TO GO
12123: BRN CBL09 ELSE JUMP TO EXIT
12124: *
12125: * HERE TO COPY A TABLE
12126: *
12127: CBL05 ZER IDVAL(XR) ZERO ID TO STOP DUMP BLOWING UP
12128: MOV *TESI$,WA SET SIZE OF TEBLK
12129: MOV *TBBUK,WC SET INITIAL OFFSET
12130: *
12131: * LOOP THROUGH BUCKETS IN TABLE
12132: *
12133: CBL06 MOV (XS),XR LOAD TABLE POINTER
12134: BEQ WC,TBLEN(XR),CBL09 JUMP TO EXIT IF ALL DONE
12135: ADD WC,XR ELSE POINT TO NEXT BUCKET HEADER
12136: ICA WC BUMP OFFSET
12137: SUB *TENXT,XR SUBTRACT LINK OFFSET TO MERGE
12138: *
12139: * LOOP THROUGH TEBLKS ON ONE CHAIN
12140: *
12141: CBL07 MOV TENXT(XR),XL LOAD POINTER TO NEXT TEBLK
12142: MOV (XS),TENXT(XR) SET END OF CHAIN POINTER IN CASE
12143: BEQ (XL),=B$TBT,CBL06 BACK FOR NEXT BUCKET IF CHAIN END
12144: MOV XR,-(XS) ELSE STACK PTR TO PREVIOUS BLOCK
12145: MOV *TESI$,WA SET SIZE OF TEBLK
12146: JSR ALLOC ALLOCATE NEW TEBLK
12147: MOV XR,WB SAVE PTR TO NEW TEBLK
12148: MVW COPY OLD TEBLK TO NEW TEBLK
12149: MOV WB,XR RESTORE POINTER TO NEW TEBLK
12150: MOV (XS)+,XL RESTORE POINTER TO PREVIOUS BLOCK
12151: MOV XR,TENXT(XL) LINK NEW BLOCK TO PREVIOUS
12152: MOV XR,XL COPY POINTER TO NEW BLOCK
12153: *
12154: * LOOP TO SET REAL VALUE AFTER REMOVING TRAP CHAIN
12155: *
12156: CBL08 MOV TEVAL(XL),XL LOAD VALUE
12157: BEQ (XL),=B$TRT,CBL08 LOOP BACK IF TRAPPED
12158: MOV XL,TEVAL(XR) STORE UNTRAPPED VALUE IN TEBLK
12159: BRN CBL07 BACK FOR NEXT TEBLK
12160: *
12161: * COMMON EXIT POINT
12162: *
12163: CBL09 MOV (XS)+,XR LOAD POINTER TO BLOCK
12164: EXI RETURN
12165: *
12166: * ALTERNATIVE RETURN
12167: *
12168: CBL10 EXI 1 RETURN
12169: .IF .CNBF
12170: .ELSE
12171: EJC
12172: *
12173: * HERE TO COPY BUFFER
12174: *
12175: CBL11 MOV BCBUF(XR),XL GET BFBLK PTR
12176: MOV BFALC(XL),WA GET ALLOCATION
12177: CTB WA,BFSI$ SET TOTAL SIZE
12178: MOV XR,XL SAVE BCBLK PTR
12179: JSR ALLOC ALLOCATE BFBLK
12180: MOV BCBUF(XL),WB GET OLD BFBLK
12181: MOV XR,BCBUF(XL) SET POINTER TO NEW BFBLK
12182: MOV WB,XL POINT TO OLD BFBLK
12183: MVW COPY BFBLK TOO
12184: ZER XL CLEAR RUBBISH PTR
12185: BRN CBL09 BRANCH TO EXIT
12186: .FI
12187: ENP END PROCEDURE CBLCK
12188: EJC
12189: *
12190: * CDGCG -- GENERATE CODE FOR COMPLEX GOTO
12191: *
12192: * USED BY CMPIL TO PROCESS COMPLEX GOTO TREE
12193: *
12194: * (WB) MUST BE COLLECTABLE
12195: * (XR) EXPRESSION POINTER
12196: * JSR CDGCG CALL TO GENERATE COMPLEX GOTO
12197: * (XL,XR,WA) DESTROYED
12198: *
12199: CDGCG PRC E,0 ENTRY POINT
12200: MOV CMOPN(XR),XL GET UNARY GOTO OPERATOR
12201: MOV CMROP(XR),XR POINT TO GOTO OPERAND
12202: BEQ XL,=OPDVD,CDGC2 JUMP IF DIRECT GOTO
12203: JSR CDGNM GENERATE OPND BY NAME IF NOT DIRECT
12204: *
12205: * RETURN POINT
12206: *
12207: CDGC1 MOV XL,WA GOTO OPERATOR
12208: JSR CDWRD GENERATE IT
12209: EXI RETURN TO CALLER
12210: *
12211: * DIRECT GOTO
12212: *
12213: CDGC2 JSR CDGVL GENERATE OPERAND BY VALUE
12214: BRN CDGC1 MERGE TO RETURN
12215: ENP END PROCEDURE CDGCG
12216: EJC
12217: *
12218: * CDGEX -- BUILD EXPRESSION BLOCK
12219: *
12220: * CDGEX IS PASSED A POINTER TO AN EXPRESSION TREE (SEE
12221: * EXPAN) AND RETURNS AN EXPRESSION (SEBLK OR EXBLK).
12222: *
12223: * (WC) SOME COLLECTABLE VALUE
12224: * (WB) INTEGER IN RANGE 0 LE X LE MXLEN
12225: * (XL) PTR TO EXPRESSION TREE
12226: * JSR CDGEX CALL TO BUILD EXPRESSION
12227: * (XR) PTR TO SEBLK OR EXBLK
12228: * (XL,WA,WB) DESTROYED
12229: *
12230: CDGEX PRC R,0 ENTRY POINT, RECURSIVE
12231: BLO (XL),=B$VR$,CDGX1 JUMP IF NOT VARIABLE
12232: *
12233: * HERE FOR NATURAL VARIABLE, BUILD SEBLK
12234: *
12235: MOV *SESI$,WA SET SIZE OF SEBLK
12236: JSR ALLOC ALLOCATE SPACE FOR SEBLK
12237: MOV =B$SEL,(XR) SET TYPE WORD
12238: MOV XL,SEVAR(XR) STORE VRBLK POINTER
12239: EXI RETURN TO CDGEX CALLER
12240: *
12241: * HERE IF NOT VARIABLE, BUILD EXBLK
12242: *
12243: CDGX1 MOV XL,XR COPY TREE POINTER
12244: MOV WC,-(XS) SAVE WC
12245: MOV CWCOF,XL SAVE CURRENT OFFSET
12246: MOV (XR),WA GET TYPE WORD
12247: BNE WA,=B$CMT,CDGX2 CALL BY VALUE IF NOT CMBLK
12248: BGE CMTYP(XR),=C$$NM,CDGX2 JUMP IF CMBLK ONLY BY VALUE
12249: EJC
12250: *
12251: * CDGEX (CONTINUED)
12252: *
12253: * HERE IF EXPRESSION CAN BE EVALUATED BY NAME
12254: *
12255: JSR CDGNM GENERATE CODE BY NAME
12256: MOV =ORNM$,WA LOAD RETURN BY NAME WORD
12257: BRN CDGX3 MERGE WITH VALUE CASE
12258: *
12259: * HERE IF EXPRESSION CAN ONLY BE EVALUATED BY VALUE
12260: *
12261: CDGX2 JSR CDGVL GENERATE CODE BY VALUE
12262: MOV =ORVL$,WA LOAD RETURN BY VALUE WORD
12263: *
12264: * MERGE HERE TO CONSTRUCT EXBLK
12265: *
12266: CDGX3 JSR CDWRD GENERATE RETURN WORD
12267: JSR EXBLD BUILD EXBLK
12268: MOV (XS)+,WC RESTORE WC
12269: EXI RETURN TO CDGEX CALLER
12270: ENP END PROCEDURE CDGEX
12271: EJC
12272: *
12273: * CDGNM -- GENERATE CODE BY NAME
12274: *
12275: * CDGNM IS CALLED DURING THE COMPILATION PROCESS TO
12276: * GENERATE CODE BY NAME FOR AN EXPRESSION. SEE CDBLK
12277: * DESCRIPTION FOR DETAILS OF CODE GENERATED. THE INPUT
12278: * TO CDGNM IS AN EXPRESSION TREE AS GENERATED BY EXPAN.
12279: *
12280: * CDGNM IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING
12281: * RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS.
12282: *
12283: * (WB) INTEGER IN RANGE 0 LE N LE DNAMB
12284: * (XR) PTR TO TREE GENERATED BY EXPAN
12285: * (WC) CONSTANT FLAG (SEE BELOW)
12286: * JSR CDGNM CALL TO GENERATE CODE BY NAME
12287: * (XR,WA) DESTROYED
12288: * (WC) SET NON-ZERO IF NON-CONSTANT
12289: *
12290: * WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE
12291: * EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE
12292: * EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED.
12293: *
12294: * THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD).
12295: *
12296: CDGNM PRC R,0 ENTRY POINT, RECURSIVE
12297: MOV XL,-(XS) SAVE ENTRY XL
12298: MOV WB,-(XS) SAVE ENTRY WB
12299: CHK CHECK FOR STACK OVERFLOW
12300: MOV (XR),WA LOAD TYPE WORD
12301: BEQ WA,=B$CMT,CGN04 JUMP IF CMBLK
12302: BHI WA,=B$VR$,CGN02 JUMP IF SIMPLE VARIABLE
12303: *
12304: * MERGE HERE FOR OPERAND YIELDING VALUE (E.G. CONSTANT)
12305: *
12306: CGN01 ERB 208,SYNTAX ERROR. VALUE USED WHERE NAME IS REQUIRED
12307: *
12308: * HERE FOR NATURAL VARIABLE REFERENCE
12309: *
12310: CGN02 MOV =OLVN$,WA LOAD VARIABLE LOAD CALL
12311: JSR CDWRD GENERATE IT
12312: MOV XR,WA COPY VRBLK POINTER
12313: JSR CDWRD GENERATE VRBLK POINTER
12314: EJC
12315: *
12316: * CDGNM (CONTINUED)
12317: *
12318: * HERE TO EXIT WITH WC SET CORRECTLY
12319: *
12320: CGN03 MOV (XS)+,WB RESTORE ENTRY WB
12321: MOV (XS)+,XL RESTORE ENTRY XL
12322: EXI RETURN TO CDGNM CALLER
12323: *
12324: * HERE FOR CMBLK
12325: *
12326: CGN04 MOV XR,XL COPY CMBLK POINTER
12327: MOV CMTYP(XR),XR LOAD CMBLK TYPE
12328: BGE XR,=C$$NM,CGN01 ERROR IF NOT NAME OPERAND
12329: BSW XR,C$$NM ELSE SWITCH ON TYPE
12330: IFF C$ARR,CGN05 ARRAY REFERENCE
12331: IFF C$FNC,CGN08 FUNCTION CALL
12332: IFF C$DEF,CGN09 DEFERRED EXPRESSION
12333: IFF C$IND,CGN10 INDIRECT REFERENCE
12334: IFF C$KEY,CGN11 KEYWORD REFERENCE
12335: IFF C$UBO,CGN08 UNDEFINED BINARY OP
12336: IFF C$UUO,CGN08 UNDEFINED UNARY OP
12337: ESW END SWITCH ON CMBLK TYPE
12338: *
12339: * HERE TO GENERATE CODE FOR ARRAY REFERENCE
12340: *
12341: CGN05 MOV *CMOPN,WB POINT TO ARRAY OPERAND
12342: *
12343: * LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS
12344: *
12345: CGN06 JSR CMGEN GENERATE CODE FOR NEXT OPERAND
12346: MOV CMLEN(XL),WC LOAD LENGTH OF CMBLK
12347: BLT WB,WC,CGN06 LOOP TILL ALL GENERATED
12348: *
12349: * GENERATE APPROPRIATE ARRAY CALL
12350: *
12351: MOV =OAON$,WA LOAD ONE-SUBSCRIPT CASE CALL
12352: BEQ WC,*CMAR1,CGN07 JUMP TO EXIT IF ONE SUBSCRIPT CASE
12353: MOV =OAMN$,WA ELSE LOAD MULTI-SUBSCRIPT CASE CALL
12354: JSR CDWRD GENERATE CALL
12355: MOV WC,WA COPY CMBLK LENGTH
12356: BTW WA CONVERT TO WORDS
12357: SUB =CMVLS,WA CALCULATE NUMBER OF SUBSCRIPTS
12358: EJC
12359: *
12360: * CDGNM (CONTINUED)
12361: *
12362: * HERE TO EXIT GENERATING WORD (NON-CONSTANT)
12363: *
12364: CGN07 MNZ WC SET RESULT NON-CONSTANT
12365: JSR CDWRD GENERATE WORD
12366: BRN CGN03 BACK TO EXIT
12367: *
12368: * HERE TO GENERATE CODE FOR FUNCTIONS AND UNDEFINED OPRS
12369: *
12370: CGN08 MOV XL,XR COPY CMBLK POINTER
12371: JSR CDGVL GEN CODE BY VALUE FOR CALL
12372: MOV =OFNE$,WA GET EXTRA CALL FOR BY NAME
12373: BRN CGN07 BACK TO GENERATE AND EXIT
12374: *
12375: * HERE TO GENERATE CODE FOR DEFERED EXPRESSION
12376: *
12377: CGN09 MOV CMROP(XL),XR CHECK IF VARIABLE
12378: BHI (XR),=B$VR$,CGN02 TREAT *VARIABLE AS SIMPLE VAR
12379: MOV XR,XL COPY PTR TO EXPRESSION TREE
12380: JSR CDGEX ELSE BUILD EXBLK
12381: MOV =OLEX$,WA SET CALL TO LOAD EXPR BY NAME
12382: JSR CDWRD GENERATE IT
12383: MOV XR,WA COPY EXBLK POINTER
12384: JSR CDWRD GENERATE EXBLK POINTER
12385: BRN CGN03 BACK TO EXIT
12386: *
12387: * HERE TO GENERATE CODE FOR INDIRECT REFERENCE
12388: *
12389: CGN10 MOV CMROP(XL),XR GET OPERAND
12390: JSR CDGVL GENERATE CODE BY VALUE FOR IT
12391: MOV =OINN$,WA LOAD CALL FOR INDIRECT BY NAME
12392: BRN CGN12 MERGE
12393: *
12394: * HERE TO GENERATE CODE FOR KEYWORD REFERENCE
12395: *
12396: CGN11 MOV CMROP(XL),XR GET OPERAND
12397: JSR CDGNM GENERATE CODE BY NAME FOR IT
12398: MOV =OKWN$,WA LOAD CALL FOR KEYWORD BY NAME
12399: *
12400: * KEYWORD, INDIRECT MERGE HERE
12401: *
12402: CGN12 JSR CDWRD GENERATE CODE FOR OPERATOR
12403: BRN CGN03 EXIT
12404: ENP END PROCEDURE CDGNM
12405: EJC
12406: *
12407: * CDGVL -- GENERATE CODE BY VALUE
12408: *
12409: * CDGVL IS CALLED DURING THE COMPILATION PROCESS TO
12410: * GENERATE CODE BY VALUE FOR AN EXPRESSION. SEE CDBLK
12411: * DESCRIPTION FOR DETAILS OF THE CODE GENERATED. THE INPUT
12412: * TO CDGVL IS AN EXPRESSION TREE AS GENERATED BY EXPAN.
12413: *
12414: * CDGVL IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING
12415: * RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS.
12416: *
12417: * (WB) INTEGER IN RANGE 0 LE N LE DNAMB
12418: * (XR) PTR TO TREE GENERATED BY EXPAN
12419: * (WC) CONSTANT FLAG (SEE BELOW)
12420: * JSR CDGVL CALL TO GENERATE CODE BY VALUE
12421: * (XR,WA) DESTROYED
12422: * (WC) SET NON-ZERO IF NON-CONSTANT
12423: *
12424: * WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE
12425: * EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE
12426: * EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED.
12427: *
12428: * IF WC IS NON-ZERO ON ENTRY, THEN PREEVALUATION IS NOT
12429: * ALLOWED REGARDLESS OF THE NATURE OF THE OPERAND.
12430: *
12431: * THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD).
12432: *
12433: CDGVL PRC R,0 ENTRY POINT, RECURSIVE
12434: MOV (XR),WA LOAD TYPE WORD
12435: BEQ WA,=B$CMT,CGV01 JUMP IF CMBLK
12436: BLT WA,=B$VRA,CGV00 JUMP IF ICBLK, RCBLK, SCBLK
12437: *
12438: * HERE FOR VARIABLE VALUE REFERENCE
12439: *
12440: CGVL0 MNZ WC INDICATE NON-CONSTANT VALUE
12441: *
12442: * MERGE HERE FOR SIMPLE CONSTANT (ICBLK,RCBLK,SCBLK)
12443: * AND FOR VARIABLES CORRESPONDING TO CONSTANT KEYWORDS.
12444: *
12445: CGV00 MOV XR,WA COPY PTR TO VAR OR CONSTANT
12446: JSR CDWRD GENERATE AS CODE WORD
12447: EXI RETURN TO CALLER
12448: EJC
12449: *
12450: * CDGVL (CONTINUED)
12451: *
12452: * HERE FOR TREE NODE (CMBLK)
12453: *
12454: CGV01 MOV WB,-(XS) SAVE ENTRY WB
12455: MOV XL,-(XS) SAVE ENTRY XL
12456: MOV WC,-(XS) SAVE ENTRY CONSTANT FLAG
12457: MOV CWCOF,-(XS) SAVE INITIAL CODE OFFSET
12458: CHK CHECK FOR STACK OVERFLOW
12459: *
12460: * PREPARE TO GENERATE CODE FOR CMBLK. WC IS CLEARED TO
12461: * START WITH AND IS RESET NON-ZERO FOR ANY NON-CONSTANT
12462: * CODE GENERATED. IF IT IS STILL ZERO AFTER GENERATING ALL
12463: * THE CMBLK CODE, THEN ITS VALUE IS COMPUTED AS THE RESULT.
12464: *
12465: MOV XR,XL COPY CMBLK POINTER
12466: MOV CMTYP(XR),XR LOAD CMBLK TYPE
12467: ZER WC CLEAR OPTIMISE FLAG
12468: BLE XR,=C$PR$,CGV02 JUMP IF NOT PREDICATE VALUE
12469: MNZ WC ELSE FORCE NON-CONSTANT CASE
12470: *
12471: * HERE WITH WC SET APPROPRIATELY
12472: *
12473: CGV02 BSW XR,C$$NV SWITCH TO APPROPRIATE GENERATOR
12474: IFF C$ARR,CGV03 ARRAY REFERENCE
12475: IFF C$FNC,CGV05 FUNCTION CALL
12476: IFF C$DEF,CGV14 DEFERRED EXPRESSION
12477: IFF C$SEL,CGV15 SELECTION
12478: IFF C$IND,CGV31 INDIRECT REFERENCE
12479: IFF C$KEY,CGV27 KEYWORD REFERENCE
12480: IFF C$UBO,CGV29 UNDEFINED BINOP
12481: IFF C$UUO,CGV30 UNDEFINED UNOP
12482: IFF C$BVL,CGV18 BINOPS WITH VAL OPDS
12483: IFF C$ALT,CGV18 ALTERNATION
12484: IFF C$UVL,CGV19 UNOPS WITH VALU OPND
12485: IFF C$ASS,CGV21 ASSIGNMENT
12486: IFF C$CNC,CGV24 CONCATENATION
12487: IFF C$UNM,CGV27 UNOPS WITH NAME OPND
12488: IFF C$CNP,CGV24 CONCAT. NOT PATTERN
12489: IFF C$BVN,CGV26 BINARY $ AND .
12490: IFF C$INT,CGV31 INTERROGATION
12491: IFF C$NEG,CGV28 NEGATION
12492: IFF C$PMT,CGV18 PATTERN MATCH
12493: ESW END SWITCH ON CMBLK TYPE
12494: EJC
12495: *
12496: * CDGVL (CONTINUED)
12497: *
12498: * HERE TO GENERATE CODE FOR ARRAY REFERENCE
12499: *
12500: CGV03 MOV *CMOPN,WB SET OFFSET TO ARRAY OPERAND
12501: *
12502: * LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS
12503: *
12504: CGV04 JSR CMGEN GEN VALUE CODE FOR NEXT OPERAND
12505: MOV CMLEN(XL),WC LOAD CMBLK LENGTH
12506: BLT WB,WC,CGV04 LOOP BACK IF MORE TO GO
12507: *
12508: * GENERATE CALL TO APPROPRIATE ARRAY REFERENCE ROUTINE
12509: *
12510: MOV =OAOV$,WA SET ONE SUBSCRIPT CALL IN CASE
12511: BEQ WC,*CMAR1,CGV32 JUMP TO EXIT IF 1-SUB CASE
12512: MOV =OAMV$,WA ELSE SET CALL FOR MULTI-SUBSCRIPTS
12513: JSR CDWRD GENERATE CALL
12514: MOV WC,WA COPY LENGTH OF CMBLK
12515: SUB *CMVLS,WA SUBTRACT STANDARD LENGTH
12516: BTW WA GET NUMBER OF WORDS
12517: BRN CGV32 JUMP TO GENERATE SUBSCRIPT COUNT
12518: *
12519: * HERE TO GENERATE CODE FOR FUNCTION CALL
12520: *
12521: CGV05 MOV *CMVLS,WB SET OFFSET TO FIRST ARGUMENT
12522: *
12523: * LOOP TO GENERATE CODE FOR ARGUMENTS
12524: *
12525: CGV06 BEQ WB,CMLEN(XL),CGV07 JUMP IF ALL GENERATED
12526: JSR CMGEN ELSE GEN VALUE CODE FOR NEXT ARG
12527: BRN CGV06 BACK TO GENERATE NEXT ARGUMENT
12528: *
12529: * HERE TO GENERATE ACTUAL FUNCTION CALL
12530: *
12531: CGV07 SUB *CMVLS,WB GET NUMBER OF ARG PTRS (BAUS)
12532: BTW WB CONVERT BAUS TO WORDS
12533: MOV CMOPN(XL),XR LOAD FUNCTION VRBLK POINTER
12534: BNZ VRLEN(XR),CGV12 JUMP IF NOT SYSTEM FUNCTION
12535: MOV VRSVP(XR),XL LOAD SVBLK PTR IF SYSTEM VAR
12536: MOV SVBIT(XL),WA LOAD BIT MASK
12537: ANB BTFFC,WA TEST FOR FAST FUNCTION CALL ALLOWED
12538: ZRB WA,CGV12 JUMP IF NOT
12539: EJC
12540: *
12541: * CDGVL (CONTINUED)
12542: *
12543: * HERE IF FAST FUNCTION CALL IS ALLOWED
12544: *
12545: MOV SVBIT(XL),WA RELOAD BIT INDICATORS
12546: ANB BTPRE,WA TEST FOR PREEVALUATION OK
12547: NZB WA,CGV08 JUMP IF PREEVALUATION PERMITTED
12548: MNZ WC ELSE SET RESULT NON-CONSTANT
12549: *
12550: * TEST FOR CORRECT NUMBER OF ARGS FOR FAST CALL
12551: *
12552: CGV08 MOV VRFNC(XR),XL LOAD PTR TO SVFNC FIELD
12553: MOV FARGS(XL),WA LOAD SVNAR FIELD VALUE
12554: BEQ WA,WB,CGV11 JUMP IF ARGUMENT COUNT IS CORRECT
12555: BHI WA,WB,CGV09 JUMP IF TOO FEW ARGUMENTS GIVEN
12556: *
12557: * HERE IF TOO MANY ARGUMENTS, PREPARE TO GENERATE O$POPS
12558: *
12559: SUB WA,WB GET NUMBER OF EXTRA ARGS
12560: LCT WB,WB SET AS COUNT TO CONTROL LOOP
12561: MOV =OPOP$,WA SET POP CALL
12562: BRN CGV10 JUMP TO COMMON LOOP
12563: *
12564: * HERE IF TOO FEW ARGUMENTS, PREPARE TO GENERATE NULLS
12565: *
12566: CGV09 SUB WB,WA GET NUMBER OF MISSING ARGUMENTS
12567: LCT WB,WA LOAD AS COUNT TO CONTROL LOOP
12568: MOV =NULLS,WA LOAD PTR TO NULL CONSTANT
12569: *
12570: * LOOP TO GENERATE CALLS TO FIX ARGUMENT COUNT
12571: *
12572: CGV10 JSR CDWRD GENERATE ONE CALL
12573: BCT WB,CGV10 LOOP TILL ALL GENERATED
12574: *
12575: * HERE AFTER ADJUSTING ARG COUNT AS REQUIRED
12576: *
12577: CGV11 MOV XL,WA COPY POINTER TO SVFNC FIELD
12578: BRN CGV36 JUMP TO GENERATE CALL
12579: EJC
12580: *
12581: * CDGVL (CONTINUED)
12582: *
12583: * COME HERE IF FAST CALL IS NOT PERMITTED
12584: *
12585: CGV12 MOV =OFNS$,WA SET ONE ARG CALL IN CASE
12586: BEQ WB,=NUM01,CGV13 JUMP IF ONE ARG CASE
12587: MOV =OFNC$,WA ELSE LOAD CALL FOR MORE THAN 1 ARG
12588: JSR CDWRD GENERATE IT
12589: MOV WB,WA COPY ARGUMENT COUNT
12590: *
12591: * ONE ARG CASE MERGES HERE
12592: *
12593: CGV13 JSR CDWRD GENERATE =O$FNS OR ARG COUNT
12594: MOV XR,WA COPY VRBLK POINTER
12595: BRN CGV32 JUMP TO GENERATE VRBLK PTR
12596: *
12597: * HERE FOR DEFERRED EXPRESSION
12598: *
12599: CGV14 MOV CMROP(XL),XL POINT TO EXPRESSION TREE
12600: JSR CDGEX BUILD EXBLK OR SEBLK
12601: MOV XR,WA COPY BLOCK PTR
12602: JSR CDWRD GENERATE PTR TO EXBLK OR SEBLK
12603: BRN CGV34 JUMP TO EXIT, CONSTANT TEST
12604: *
12605: * HERE TO GENERATE CODE FOR SELECTION
12606: *
12607: CGV15 ZER -(XS) ZERO PTR TO CHAIN OF FORWARD JUMPS
12608: ZER -(XS) ZERO PTR TO PREV O$SLC FORWARD PTR
12609: MOV *CMVLS,WB POINT TO FIRST ALTERNATIVE
12610: MOV =OSLA$,WA SET INITIAL CODE WORD
12611: *
12612: * 0(XS) IS THE OFFSET TO THE PREVIOUS WORD
12613: * WHICH REQUIRES FILLING IN WITH AN
12614: * OFFSET TO THE FOLLOWING O$SLC,O$SLD
12615: *
12616: * 1(XS) IS THE HEAD OF A CHAIN OF OFFSET
12617: * POINTERS INDICATING THOSE LOCATIONS
12618: * TO BE FILLED WITH OFFSETS PAST
12619: * THE END OF ALL THE ALTERNATIVES
12620: *
12621: CGV16 JSR CDWRD GENERATE O$SLC (O$SLA FIRST TIME)
12622: MOV CWCOF,(XS) SET CURRENT LOC AS PTR TO FILL IN
12623: JSR CDWRD GENERATE GARBAGE WORD THERE FOR NOW
12624: JSR CMGEN GEN VALUE CODE FOR ALTERNATIVE
12625: MOV =OSLB$,WA LOAD O$SLB POINTER
12626: JSR CDWRD GENERATE O$SLB CALL
12627: MOV 1(XS),WA LOAD OLD CHAIN PTR
12628: MOV CWCOF,1(XS) SET CURRENT LOC AS NEW CHAIN HEAD
12629: JSR CDWRD GENERATE FORWARD CHAIN LINK
12630: EJC
12631: *
12632: * CDGVL (CONTINUED)
12633: *
12634: * NOW TO FILL IN THE SKIP OFFSET TO O$SLC,O$SLD
12635: *
12636: MOV (XS),XR LOAD OFFSET TO WORD TO PLUG
12637: ADD R$CCB,XR POINT TO ACTUAL LOCATION TO PLUG
12638: MOV CWCOF,(XR) PLUG PROPER OFFSET IN
12639: MOV =OSLC$,WA LOAD O$SLC PTR FOR NEXT ALTERNATIVE
12640: MOV WB,XR COPY OFFSET (DESTROY GARBAGE XR)
12641: ICA XR BUMP EXTRA TIME FOR TEST
12642: BLT XR,CMLEN(XL),CGV16 LOOP BACK IF NOT LAST ALTERNATIVE
12643: *
12644: * HERE TO GENERATE CODE FOR LAST ALTERNATIVE
12645: *
12646: MOV =OSLD$,WA GET HEADER CALL
12647: JSR CDWRD GENERATE O$SLD CALL
12648: JSR CMGEN GENERATE CODE FOR LAST ALTERNATIVE
12649: ICA XS POP OFFSET PTR
12650: MOV (XS)+,XR LOAD CHAIN PTR
12651: *
12652: * LOOP TO PLUG OFFSETS PAST STRUCTURE
12653: *
12654: CGV17 ADD R$CCB,XR MAKE NEXT PTR ABSOLUTE
12655: MOV (XR),WA LOAD FORWARD PTR
12656: MOV CWCOF,(XR) PLUG REQUIRED OFFSET
12657: MOV WA,XR COPY FORWARD PTR
12658: BNZ WA,CGV17 LOOP BACK IF MORE TO GO
12659: BRN CGV33 ELSE JUMP TO EXIT (NOT CONSTANT)
12660: *
12661: * HERE FOR BINARY OPS WITH VALUE OPERANDS
12662: *
12663: CGV18 MOV CMLOP(XL),XR LOAD LEFT OPERAND POINTER
12664: JSR CDGVL GEN VALUE CODE FOR LEFT OPERAND
12665: *
12666: * HERE FOR UNARY OPS WITH VALUE OPERAND (BINOPS MERGE)
12667: *
12668: CGV19 MOV CMROP(XL),XR LOAD RIGHT (ONLY) OPERAND PTR
12669: JSR CDGVL GEN CODE BY VALUE
12670: EJC
12671: *
12672: * CDGVL (CONTINUED)
12673: *
12674: * MERGE HERE TO GENERATE OPERATOR CALL FROM CMOPN FIELD
12675: *
12676: CGV20 MOV CMOPN(XL),WA LOAD OPERATOR CALL POINTER
12677: BRN CGV36 JUMP TO GENERATE IT WITH CONS TEST
12678: *
12679: * HERE FOR ASSIGNMENT
12680: *
12681: CGV21 MOV CMLOP(XL),XR LOAD LEFT OPERAND POINTER
12682: BLO (XR),=B$VR$,CGV22 JUMP IF NOT VARIABLE
12683: *
12684: * HERE FOR ASSIGNMENT TO SIMPLE VARIABLE
12685: *
12686: MOV CMROP(XL),XR LOAD RIGHT OPERAND PTR
12687: JSR CDGVL GENERATE CODE BY VALUE
12688: MOV CMLOP(XL),WA RELOAD LEFT OPERAND VRBLK PTR
12689: ADD *VRSTO,WA POINT TO VRSTO FIELD
12690: BRN CGV32 JUMP TO GENERATE STORE PTR
12691: *
12692: * HERE IF NOT SIMPLE VARIABLE ASSIGNMENT
12693: *
12694: CGV22 JSR EXPAP TEST FOR PATTERN MATCH ON LEFT SIDE
12695: PPM CGV23 JUMP IF NOT PATTERN MATCH
12696: *
12697: * HERE FOR PATTERN REPLACEMENT
12698: *
12699: MOV CMROP(XR),CMLOP(XL) SAVE PATTERN PTR IN SAFE PLACE
12700: MOV CMLOP(XR),XR LOAD SUBJECT PTR
12701: JSR CDGNM GEN CODE BY NAME FOR SUBJECT
12702: MOV CMLOP(XL),XR LOAD PATTERN PTR
12703: JSR CDGVL GEN CODE BY VALUE FOR PATTERN
12704: MOV =OPMN$,WA LOAD MATCH BY NAME CALL
12705: JSR CDWRD GENERATE IT
12706: MOV CMROP(XL),XR LOAD REPLACEMENT VALUE PTR
12707: JSR CDGVL GEN CODE BY VALUE
12708: MOV =ORPL$,WA LOAD REPLACE CALL
12709: BRN CGV32 JUMP TO GEN AND EXIT (NOT CONSTANT)
12710: *
12711: * HERE FOR ASSIGNMENT TO COMPLEX VARIABLE
12712: *
12713: CGV23 MNZ WC INHIBIT PRE-EVALUATION
12714: JSR CDGNM GEN CODE BY NAME FOR LEFT SIDE
12715: BRN CGV31 MERGE WITH UNOP CIRCUIT
12716: EJC
12717: *
12718: * CDGVL (CONTINUED)
12719: *
12720: * HERE FOR CONCATENATION
12721: *
12722: CGV24 MOV CMLOP(XL),XR LOAD LEFT OPERAND PTR
12723: BNE (XR),=B$CMT,CGV18 ORDINARY BINOP IF NOT CMBLK
12724: MOV CMTYP(XR),WB LOAD CMBLK TYPE CODE
12725: BEQ WB,=C$INT,CGV25 SPECIAL CASE IF INTERROGATION
12726: BEQ WB,=C$NEG,CGV25 OR NEGATION
12727: BNE WB,=C$FNC,CGV18 ELSE ORDINARY BINOP IF NOT FUNCTION
12728: MOV CMOPN(XR),XR ELSE LOAD FUNCTION VRBLK PTR
12729: BNZ VRLEN(XR),CGV18 ORDINARY BINOP IF NOT SYSTEM VAR
12730: MOV VRSVP(XR),XR ELSE POINT TO SVBLK
12731: MOV SVBIT(XR),WA LOAD BIT INDICATORS
12732: ANB BTPRD,WA TEST FOR PREDICATE FUNCTION
12733: ZRB WA,CGV18 ORDINARY BINOP IF NOT
12734: *
12735: * HERE IF LEFT ARG OF CONCATENATION IS PREDICATE FUNCTION
12736: *
12737: CGV25 MOV CMLOP(XL),XR RELOAD LEFT ARG
12738: JSR CDGVL GEN CODE BY VALUE
12739: MOV =OPOP$,WA LOAD POP CALL
12740: JSR CDWRD GENERATE IT
12741: MOV CMROP(XL),XR LOAD RIGHT OPERAND
12742: JSR CDGVL GEN CODE BY VALUE AS RESULT CODE
12743: BRN CGV33 EXIT (NOT CONSTANT)
12744: *
12745: * HERE TO GENERATE CODE FOR PATTERN, IMMEDIATE ASSIGNMENT
12746: *
12747: CGV26 MOV CMLOP(XL),XR LOAD LEFT OPERAND
12748: JSR CDGVL GEN CODE BY VALUE, MERGE
12749: *
12750: * HERE FOR UNOPS WITH ARG BY NAME (BINARY $ . MERGE)
12751: *
12752: CGV27 MOV CMROP(XL),XR LOAD RIGHT OPERAND PTR
12753: JSR CDGNM GEN CODE BY NAME FOR RIGHT ARG
12754: MOV CMOPN(XL),XR GET OPERATOR CODE WORD
12755: BNE (XR),=O$KWV,CGV20 GEN CALL UNLESS KEYWORD VALUE
12756: EJC
12757: *
12758: * CDGVL (CONTINUED)
12759: *
12760: * HERE FOR KEYWORD BY VALUE. THIS IS CONSTANT ONLY IF
12761: * THE OPERAND IS ONE OF THE SPECIAL SYSTEM VARIABLES WITH
12762: * THE SVCKW BIT SET TO INDICATE A CONSTANT KEYWORD VALUE.
12763: * NOTE THAT THE ONLY CONSTANT OPERAND BY NAME IS A VARIABLE
12764: *
12765: BNZ WC,CGV20 GEN CALL IF NON-CONSTANT (NOT VAR)
12766: MNZ WC ELSE SET NON-CONSTANT IN CASE
12767: MOV CMROP(XL),XR LOAD PTR TO OPERAND VRBLK
12768: BNZ VRLEN(XR),CGV20 GEN (NON-CONSTANT) IF NOT SYS VAR
12769: MOV VRSVP(XR),XR ELSE LOAD PTR TO SVBLK
12770: MOV SVBIT(XR),WA LOAD BIT MASK
12771: ANB BTCKW,WA TEST FOR CONSTANT KEYWORD
12772: ZRB WA,CGV20 GO GEN IF NOT CONSTANT
12773: ZER WC ELSE SET RESULT CONSTANT
12774: BRN CGV20 AND JUMP BACK TO GENERATE CALL
12775: *
12776: * HERE TO GENERATE CODE FOR NEGATION
12777: *
12778: CGV28 MOV =ONTA$,WA GET INITIAL WORD
12779: JSR CDWRD GENERATE IT
12780: MOV CWCOF,WB SAVE NEXT OFFSET
12781: JSR CDWRD GENERATE GUNK WORD FOR NOW
12782: MOV CMROP(XL),XR LOAD RIGHT OPERAND PTR
12783: JSR CDGVL GEN CODE BY VALUE
12784: MOV =ONTB$,WA LOAD END OF EVALUATION CALL
12785: JSR CDWRD GENERATE IT
12786: MOV WB,XR COPY OFFSET TO WORD TO PLUG
12787: ADD R$CCB,XR POINT TO ACTUAL WORD TO PLUG
12788: MOV CWCOF,(XR) PLUG WORD WITH CURRENT OFFSET
12789: MOV =ONTC$,WA LOAD FINAL CALL
12790: BRN CGV32 JUMP TO GENERATE IT (NOT CONSTANT)
12791: *
12792: * HERE TO GENERATE CODE FOR UNDEFINED BINARY OPERATOR
12793: *
12794: CGV29 MOV CMLOP(XL),XR LOAD LEFT OPERAND PTR
12795: JSR CDGVL GENERATE CODE BY VALUE
12796: EJC
12797: *
12798: * CDGVL (CONTINUED)
12799: *
12800: * HERE TO GENERATE CODE FOR UNDEFINED UNARY OPERATOR
12801: *
12802: CGV30 MOV =C$UO$,WB SET UNOP CODE + 1
12803: SUB CMTYP(XL),WB SET NUMBER OF ARGS (1 OR 2)
12804: *
12805: * MERGE HERE FOR UNDEFINED OPERATORS
12806: *
12807: MOV CMROP(XL),XR LOAD RIGHT (ONLY) OPERAND POINTER
12808: JSR CDGVL GEN VALUE CODE FOR RIGHT OPERAND
12809: MOV CMOPN(XL),XR LOAD POINTER TO OPERATOR DV
12810: MOV DVOPN(XR),XR LOAD POINTER OFFSET
12811: WTB XR CONVERT WORD OFFSET TO BAUS
12812: ADD =R$UBA,XR POINT TO PROPER FUNCTION PTR
12813: SUB *VRFNC,XR SET STANDARD FUNCTION OFFSET
12814: BRN CGV12 MERGE WITH FUNCTION CALL CIRCUIT
12815: *
12816: * HERE TO GENERATE CODE FOR INTERROGATION, INDIRECTION
12817: *
12818: CGV31 MNZ WC SET NON CONSTANT
12819: BRN CGV19 MERGE
12820: *
12821: * HERE TO EXIT GENERATING A WORD, RESULT NOT CONSTANT
12822: *
12823: CGV32 JSR CDWRD GENERATE WORD, MERGE
12824: *
12825: * HERE TO EXIT WITH NO WORD GENERATED, NOT CONSTANT
12826: *
12827: CGV33 MNZ WC INDICATE RESULT IS NOT CONSTANT
12828: *
12829: * COMMON EXIT POINT
12830: *
12831: CGV34 ICA XS POP INITIAL CODE OFFSET
12832: MOV (XS)+,WA RESTORE OLD CONSTANT FLAG
12833: MOV (XS)+,XL RESTORE ENTRY XL
12834: MOV (XS)+,WB RESTORE ENTRY WB
12835: BNZ WC,CGV35 JUMP IF NOT CONSTANT
12836: MOV WA,WC ELSE RESTORE ENTRY CONSTANT FLAG
12837: *
12838: * HERE TO RETURN AFTER DEALING WITH WC SETTING
12839: *
12840: CGV35 EXI RETURN TO CDGVL CALLER
12841: *
12842: * EXIT HERE TO GENERATE WORD AND TEST FOR CONSTANT
12843: *
12844: CGV36 JSR CDWRD GENERATE WORD
12845: BNZ WC,CGV34 JUMP TO EXIT IF NOT CONSTANT
12846: EJC
12847: *
12848: * CDGVL (CONTINUED)
12849: *
12850: * HERE TO PREEVALUATE CONSTANT SUB-EXPRESSION
12851: *
12852: MOV =ORVL$,WA LOAD CALL TO RETURN VALUE
12853: JSR CDWRD GENERATE IT
12854: MOV (XS),XL LOAD INITIAL CODE OFFSET
12855: JSR EXBLD BUILD EXBLK FOR EXPRESSION
12856: ZER WB SET TO EVALUATE BY VALUE
12857: JSR EVALX EVALUATE EXPRESSION
12858: PPM SHOULD NOT FAIL
12859: MOV (XR),WA LOAD TYPE WORD OF RESULT
12860: BLO WA,=P$AAA,CGV37 JUMP IF NOT PATTERN
12861: MOV =OLPT$,WA ELSE LOAD SPECIAL PATTERN LOAD CALL
12862: JSR CDWRD GENERATE IT
12863: *
12864: * MERGE HERE TO GENERATE POINTER TO RESULTING CONSTANT
12865: *
12866: CGV37 MOV XR,WA COPY CONSTANT POINTER
12867: JSR CDWRD GENERATE PTR
12868: ZER WC SET RESULT CONSTANT
12869: BRN CGV34 JUMP BACK TO EXIT
12870: ENP END PROCEDURE CDGVL
12871: EJC
12872: *
12873: * CDWRD -- GENERATE ONE WORD OF CODE
12874: *
12875: * CDWRD WRITES ONE WORD INTO THE CURRENT CODE BLOCK UNDER
12876: * CONSTRUCTION. A NEW, LARGER, BLOCK IS ALLOCATED IF THERE
12877: * IS INSUFFICIENT ROOM IN THE CURRENT BLOCK. CDWRD ENSURES
12878: * THAT THERE ARE AT LEAST THREE WORDS LEFT IN THE BLOCK
12879: * AFTER ENTERING THE NEW WORD. THIS GUARANTEES THAT ANY
12880: * EXTRA SPACE AT THE END CAN BE SPLIT OFF AS A CCBLK.
12881: *
12882: * (WA) WORD TO BE GENERATED
12883: * JSR CDWRD CALL TO GENERATE WORD
12884: *
12885: CDWRD PRC E,0 ENTRY POINT
12886: MOV XR,-(XS) SAVE ENTRY XR
12887: MOV WA,-(XS) SAVE CODE WORD TO BE GENERATED
12888: *
12889: * MERGE BACK HERE AFTER ALLOCATING LARGER BLOCK
12890: *
12891: CDWD1 MOV R$CCB,XR LOAD PTR TO CCBLK BEING BUILT
12892: BNZ XR,CDWD2 JUMP IF BLOCK ALLOCATED
12893: *
12894: * HERE WE ALLOCATE AN ENTIRELY FRESH BLOCK
12895: *
12896: MOV *E$CBS,WA LOAD INITIAL LENGTH
12897: JSR ALLOC ALLOCATE CCBLK
12898: MOV =B$CCT,(XR) STORE TYPE WORD
12899: MOV *CCCOD,CWCOF SET INITIAL OFFSET
12900: MOV WA,CCLEN(XR) STORE BLOCK LENGTH
12901: MOV XR,R$CCB STORE PTR TO NEW BLOCK
12902: *
12903: * HERE WE HAVE A BLOCK WE CAN USE
12904: *
12905: CDWD2 MOV CWCOF,WA LOAD CURRENT OFFSET
12906: ADD *NUM04,WA ADJUST FOR TEST (FOUR WORDS)
12907: BLO WA,CCLEN(XR),CDWD4 JUMP IF ROOM IN THIS BLOCK
12908: *
12909: * HERE IF NO ROOM IN CURRENT BLOCK
12910: *
12911: BGE WA,MXLEN,CDWD5 JUMP IF ALREADY AT MAX SIZE
12912: ADD *E$CBS,WA ELSE GET NEW SIZE
12913: MOV XL,-(XS) SAVE ENTRY XL
12914: MOV XR,XL COPY POINTER
12915: BLT WA,MXLEN,CDWD3 JUMP IF NOT TOO LARGE
12916: MOV MXLEN,WA ELSE RESET TO MAX ALLOWED SIZE
12917: EJC
12918: *
12919: * CDWRD (CONTINUED)
12920: *
12921: * HERE WITH NEW BLOCK SIZE IN WA
12922: *
12923: CDWD3 JSR ALLOC ALLOCATE NEW BLOCK
12924: MOV XR,R$CCB STORE POINTER TO NEW BLOCK
12925: MOV =B$CCT,(XR)+ STORE TYPE WORD IN NEW BLOCK
12926: MOV WA,(XR)+ STORE BLOCK LENGTH
12927: ADD *CCUSE,XL POINT TO CCUSE,CCCOD FIELDS IN OLD
12928: MOV (XL),WA LOAD CCUSE VALUE
12929: MVW COPY USEFUL WORDS FROM OLD BLOCK
12930: MOV (XS)+,XL RESTORE XL
12931: BRN CDWD1 MERGE BACK TO TRY AGAIN
12932: *
12933: * HERE WITH ROOM IN CURRENT BLOCK
12934: *
12935: CDWD4 MOV CWCOF,WA LOAD CURRENT OFFSET
12936: ICA WA GET NEW OFFSET
12937: MOV WA,CWCOF STORE NEW OFFSET
12938: MOV WA,CCUSE(XR) STORE IN CCBLK FOR GBCOL
12939: DCA WA RESTORE PTR TO THIS WORD
12940: ADD WA,XR POINT TO CURRENT ENTRY
12941: MOV (XS)+,WA RELOAD WORD TO GENERATE
12942: MOV WA,(XR) STORE WORD IN BLOCK
12943: MOV (XS)+,XR RESTORE ENTRY XR
12944: EXI RETURN TO CALLER
12945: *
12946: * HERE IF COMPILED CODE IS TOO LONG FOR CDBLK
12947: *
12948: CDWD5 ERB 209,SYNTAX ERROR. STATEMENT IS TOO COMPLICATED.
12949: ENP END PROCEDURE CDWRD
12950: EJC
12951: *
12952: * CMGEN -- GENERATE CODE FOR CMBLK PTR
12953: *
12954: * CMGEN IS A SUBSIDIARY PROCEDURE USED TO GENERATE VALUE
12955: * CODE FOR A CMBLK PTR FROM THE MAIN CODE GENERATORS.
12956: *
12957: * (XL) CMBLK POINTER
12958: * (WB) OFFSET TO POINTER IN CMBLK
12959: * JSR CMGEN CALL TO GENERATE CODE
12960: * (XR,WA) DESTROYED
12961: * (WB) BUMPED BY ONE WORD
12962: *
12963: CMGEN PRC R,0 ENTRY POINT, RECURSIVE
12964: MOV XL,XR COPY CMBLK POINTER
12965: ADD WB,XR POINT TO CMBLK POINTER
12966: MOV (XR),XR LOAD CMBLK POINTER
12967: JSR CDGVL GENERATE CODE BY VALUE
12968: ICA WB BUMP OFFSET
12969: EXI RETURN TO CALLER
12970: ENP END PROCEDURE CMGEN
12971: EJC
12972: *
12973: * CMPIL (COMPILE SOURCE CODE)
12974: *
12975: * CMPIL IS USED TO CONVERT SNOBOL4 SOURCE CODE TO INTERNAL
12976: * FORM (SEE CDBLK FORMAT). IT IS USED BOTH FOR THE INITIAL
12977: * COMPILE AND AT RUN TIME BY THE CODE AND CONVERT FUNCTIONS
12978: * THIS PROCEDURE HAS CONTROL FOR THE ENTIRE DURATION OF
12979: * INITIAL COMPILATION. AN ERROR IN ANY PROCEDURE CALLED
12980: * DURING COMPILATION WILL LEAD FIRST TO THE ERROR SECTION
12981: * AND ULTIMATELY BACK HERE FOR RESUMED COMPILATION. THE
12982: * RE-ENTRY POINTS AFTER AN ERROR ARE SPECIALLY LABELLED -
12983: *
12984: * CMPCE RESUME AFTER CONTROL CARD ERROR
12985: * CMPLE RESUME AFTER LABEL ERROR
12986: * CMPSE RESUME AFTER STATEMENT ERROR
12987: *
12988: * JSR CMPIL CALL TO COMPILE CODE
12989: * (XR) PTR TO CDBLK FOR ENTRY STATEMENT
12990: * (XL,WA,WB,WC,RA) DESTROYED
12991: *
12992: * THE FOLLOWING GLOBAL VARIABLES ARE REFERENCED
12993: *
12994: * CMPSN NUMBER OF NEXT STATEMENT
12995: * TO BE COMPILED.
12996: *
12997: * CSWXX CONTROL CARD SWITCH VALUES ARE
12998: * CHANGED WHEN RELEVANT CONTROL
12999: * CARDS ARE MET.
13000: *
13001: * CWCOF OFFSET TO NEXT WORD IN CODE BLOCK
13002: * BEING BUILT (SEE CDWRD).
13003: *
13004: * LSTSN NUMBER OF STATEMENT MOST RECENTLY
13005: * COMPILED (INITIALLY SET TO ZERO).
13006: *
13007: * R$CIM CURRENT (INITIAL) COMPILER IMAGE
13008: * (ZERO FOR INITIAL COMPILE CALL)
13009: *
13010: * R$CNI USED TO POINT TO FOLLOWING IMAGE.
13011: * (SEE READR PROCEDURE).
13012: *
13013: * SCNGO GOTO SWITCH FOR SCANE PROCEDURE
13014: *
13015: * SCNIL LENGTH OF CURRENT IMAGE EXCLUDING
13016: * CHARACTERS REMOVED BY -INPUT.
13017: *
13018: * SCNPT CURRENT SCAN OFFSET, SEE SCANE.
13019: *
13020: * SCNRS RESCAN SWITCH FOR SCANE PROCEDURE.
13021: *
13022: * SCNSE OFFSET (IN R$CIM) OF MOST RECENTLY
13023: * SCANNED ELEMENT. SET ZERO IF NOT
13024: * CURRENTLY SCANNING ITEMS
13025: EJC
13026: *
13027: * CMPIL (CONTINUED)
13028: *
13029: * STAGE STGIC INITIAL COMPILE IN PROGRESS
13030: * STGXC CODE/CONVERT COMPILE
13031: * STGEV BUILDING EXBLK FOR EVAL
13032: * STGXT EXECUTE TIME (OUTSIDE COMPILE)
13033: * STGCE INITIAL COMPILE AFTER END LINE
13034: * STGXE EXECUTE COMPILE AFTER END LINE
13035: *
13036: * CMPIL ALSO USES A FIXED NUMBER OF LOCATIONS ON THE
13037: * MAIN STACK AS FOLLOWS. (THE DEFINITIONS OF THE ACTUAL
13038: * OFFSETS ARE IN THE DEFINITIONS SECTION).
13039: *
13040: * CMSTM(XS) POINTER TO EXPAN TREE FOR BODY OF
13041: * STATEMENT (SEE EXPAN PROCEDURE).
13042: *
13043: * CMSGO(XS) POINTER TO TREE REPRESENTATION OF
13044: * SUCCESS GOTO (SEE PROCEDURE SCNGO)9
13045: * ZERO IF NO SUCCESS GOTO IS GIVEN
13046: *
13047: * CMFGO(XS) LIKE CMSGO FOR FAILURE GOTO.
13048: *
13049: * CMCGO(XS) SET NON-ZERO ONLY IF THERE IS A
13050: * CONDITIONAL GOTO. USED FOR -FAIL,
13051: * -NOFAIL CODE GENERATION.
13052: *
13053: * CMPCD(XS) POINTER TO CDBLK FOR PREVIOUS
13054: * STATEMENT. ZERO FOR 1ST STATEMENT.
13055: *
13056: * CMFFP(XS) SET NON-ZERO IF CDFAL IN PREVIOUS
13057: * CDBLK NEEDS FILLING WITH FORWARD
13058: * POINTER, ELSE SET TO ZERO.
13059: *
13060: * CMFFC(XS) SAME AS CMFFP FOR CURRENT CDBLK
13061: *
13062: * CMSOP(XS) OFFSET TO WORD IN PREVIOUS CDBLK
13063: * TO BE FILLED IN WITH FORWARD PTR
13064: * TO NEXT CDBLK FOR SUCCESS GOTO.
13065: * ZERO IF NO FILL IN IS REQUIRED.
13066: *
13067: * CMSOC(XS) SAME AS CMSOP FOR CURRENT CDBLK.
13068: *
13069: * CMLBL(XS) POINTER TO VRBLK FOR LABEL OF
13070: * CURRENT STATEMENT. ZERO IF NO LABEL
13071: *
13072: * CMTRA(XS) POINTER TO CDBLK FOR ENTRY STMNT.
13073: EJC
13074: *
13075: * CMPIL (CONTINUED)
13076: *
13077: * ENTRY POINT
13078: *
13079: CMPIL PRC E,0 ENTRY POINT
13080: LCT WB,=CMNEN SET NUMBER OF STACK WORK LOCATIONS
13081: *
13082: * LOOP TO INITIALIZE STACK WORKING LOCATIONS
13083: *
13084: CMP00 ZER -(XS) STORE A ZERO, MAKE ONE ENTRY
13085: BCT WB,CMP00 LOOP BACK UNTIL ALL SET
13086: MOV XS,CMPXS SAVE STACK POINTER FOR ERROR SEC
13087: SSS CMPSS SAVE S-R STACK POINTER IF ANY
13088: *
13089: * LOOP THROUGH STATEMENTS
13090: *
13091: CMP01 MOV SCNPT,WB SET SCAN POINTER OFFSET
13092: MOV WB,SCNSE SET START OF ELEMENT LOCATION
13093: MOV =OCER$,WA POINT TO COMPILE ERROR CALL
13094: JSR CDWRD GENERATE AS TEMPORARY CDFAL
13095: BLT WB,SCNIL,CMP04 JUMP IF CHARS LEFT ON THIS IMAGE
13096: *
13097: * LOOP HERE AFTER COMMENT OR CONTROL CARD
13098: * ALSO SPECIAL ENTRY AFTER CONTROL CARD ERROR
13099: *
13100: CMPCE ZER XR CLEAR POSSIBLE GARBAGE XR VALUE
13101: BEQ STAGE,=STGIC,CMPC1 READ IF INITIAL COMPILE
13102: BZE R$COP,CMP02 ELSE SKIP IF NO -COPY IN FORCE
13103: *
13104: * HERE TO ATTEMPT READ (STGIC OR -COPY)
13105: *
13106: CMPC1 JSR READR READ NEXT INPUT IMAGE
13107: BZE XR,CMPC2 JUMP IF NO INPUT AVAILABLE
13108: JSR NEXTS ACQUIRE NEXT SOURCE IMAGE
13109: MOV CMPSN,LSTSN STORE STMT NO FOR USE BY LISTR
13110: ZER SCNPT RESET SCAN POINTER
13111: BRN CMP04 GO PROCESS IMAGE
13112: *
13113: * HERE IF READR HAD NOTHING TO RETURN. IF NOT DURING
13114: * INITIAL COMPILE, THEN MUST BE AT OUTER LEVEL OF -COPY
13115: * IN CODE(). R$CIM HAS BEEN RESTORED TO CODE STRING
13116: * BY COPND SO WE CONTINUE FROM THE -COPY STMT.
13117: *
13118: CMPC2 BEQ STAGE,=STGIC,CMP09 JUMP IF INITIAL COMPILE
13119: *
13120: * FOR EXECUTE TIME COMPILE, PERMIT EMBEDDED CONTROL CARDS
13121: * AND COMMENTS (BY SKIPPING TO NEXT SEMI-COLON)
13122: *
13123: CMP02 MOV R$CIM,XR GET CURRENT IMAGE
13124: MOV SCNPT,WB GET CURRENT OFFSET
13125: PLC XR,WB PREPARE TO GET CHARS
13126: *
13127: * SKIP TO SEMI-COLON
13128: *
13129: CMP03 LCH WC,(XR)+ GET CHAR
13130: ICV SCNPT ADVANCE OFFSET
13131: BEQ WC,=CH$SM,CMP04 SKIP IF SEMI-COLON FOUND
13132: BLT SCNPT,SCNIL,CMP03 LOOP IF MORE CHARS
13133: ZER XR CLEAR GARBAGE XR VALUE
13134: BRN CMP09 END OF IMAGE
13135: EJC
13136: *
13137: * CMPIL (CONTINUED)
13138: *
13139: * HERE WITH IMAGE AVAILABLE TO SCAN. NOTE THAT IF THE INPUT
13140: * STRING IS NULL, THEN EVERYTHING IS OK SINCE NULL IS
13141: * ACTUALLY ASSEMBLED AS A WORD OF BLANKS.
13142: *
13143: CMP04 MOV R$CIM,XR POINT TO CURRENT IMAGE
13144: MOV SCNPT,WB LOAD CURRENT OFFSET
13145: MOV WB,WA COPY FOR LABEL SCAN
13146: PLC XR,WB POINT TO FIRST CHARACTER
13147: LCH WC,(XR)+ LOAD FIRST CHARACTER
13148: BEQ WC,=CH$SM,CMP12 NO LABEL IF SEMICOLON
13149: BEQ WC,=CH$AS,CMPCE LOOP BACK IF COMMENT CARD
13150: BEQ WC,=CH$MN,CMP33 JUMP IF CONTROL CARD
13151: MOV R$CIM,R$CMP ABOUT TO DESTROY R$CIM
13152: MOV =CMLAB,XL POINT TO LABEL WORK STRING
13153: MOV XL,R$CIM SCANE IS TO SCAN WORK STRING
13154: PSC XL POINT TO FIRST CHARACTER POSITION
13155: SCH WC,(XL)+ STORE CHAR JUST LOADED
13156: MOV =CH$SM,WC GET A SEMICOLON
13157: SCH WC,(XL) STORE AFTER FIRST CHAR
13158: CSC XL FINISHED CHARACTER STORING
13159: ZER XL CLEAR POINTER
13160: ZER SCNPT START AT FIRST CHARACTER
13161: MOV SCNIL,-(XS) PRESERVE IMAGE LENGTH
13162: MOV =NUM02,SCNIL READ 2 CHARS AT MOST
13163: JSR SCANE SCAN FIRST CHAR FOR TYPE
13164: MOV (XS)+,SCNIL RESTORE IMAGE LENGTH
13165: MOV XL,WC NOTE RETURN CODE
13166: MOV R$CMP,XL GET OLD R$CIM
13167: MOV XL,R$CIM PUT IT BACK
13168: MOV WB,SCNPT REINSTATE OFFSET
13169: BNZ SCNBL,CMP12 BLANK SEEN - CANT BE LABEL
13170: MOV XL,XR POINT TO CURRENT IMAGE
13171: PLC XR,WB POINT TO FIRST CHAR AGAIN
13172: BEQ WC,=T$VAR,CMP06 OK IF LETTER
13173: BEQ WC,=T$CON,CMP06 OK IF DIGIT
13174: *
13175: * DROP IN OR JUMP FROM ERROR SECTION IF SCANE FAILED
13176: *
13177: CMPLE MOV R$CMP,R$CIM POINT TO BAD LINE
13178: ERB 210,BAD LABEL OR MISPLACED CONTINUATION LINE
13179: *
13180: * LOOP TO SCAN LABEL
13181: *
13182: CMP05 BEQ WC,=CH$SM,CMP07 SKIP IF SEMICOLON
13183: ICV WA BUMP OFFSET
13184: BEQ WA,SCNIL,CMP07 JUMP IF END OF IMAGE (LABEL END)
13185: EJC
13186: *
13187: * CMPIL (CONTINUED)
13188: *
13189: * ENTER LOOP AT THIS POINT
13190: *
13191: CMP06 LCH WC,(XR)+ ELSE LOAD NEXT CHARACTER
13192: .IF .CAHT
13193: BEQ WC,=CH$HT,CMP07 JUMP IF HORIZONTAL TAB
13194: .FI
13195: .IF .CAVT
13196: BEQ WC,=CH$VT,CMP07 JUMP IF VERTICAL TAB
13197: .FI
13198: BNE WC,=CH$BL,CMP05 LOOP BACK IF NON-BLANK
13199: *
13200: * HERE AFTER SCANNING OUT LABEL
13201: *
13202: CMP07 MOV WA,SCNPT SAVE UPDATED SCAN OFFSET
13203: SUB WB,WA GET LENGTH OF LABEL
13204: BZE WA,CMP12 SKIP IF LABEL LENGTH ZERO
13205: ZER XR CLEAR GARBAGE XR VALUE
13206: JSR SBSTR BUILD SCBLK FOR LABEL NAME
13207: JSR GTNVR LOCATE/CONTRUCT VRBLK
13208: PPM DUMMY (IMPOSSIBLE) ERROR RETURN
13209: MOV XR,CMLBL(XS) STORE LABEL POINTER
13210: BNZ VRLEN(XR),CMP11 JUMP IF NOT SYSTEM LABEL
13211: BNE VRSVP(XR),=V$END,CMP11 JUMP IF NOT END LABEL
13212: *
13213: * HERE FOR END LABEL SCANNED OUT
13214: *
13215: ADD =STGND,STAGE ADJUST STAGE APPROPRIATELY
13216: JSR SCANE SCAN OUT NEXT ELEMENT
13217: BEQ XL,=T$SMC,CMPEE JUMP IF END OF IMAGE
13218: BNE XL,=T$VAR,CMP08 ELSE ERROR IF NOT VARIABLE
13219: *
13220: * HERE CHECK FOR VALID INITIAL TRANSFER
13221: *
13222: BEQ VRLBL(XR),=STNDL,CMP08 JUMP IF NOT DEFINED (ERROR)
13223: MOV VRLBL(XR),CMTRA(XS) ELSE SET INITIAL ENTRY POINTER
13224: JSR SCANE SCAN NEXT ELEMENT
13225: BEQ XL,=T$SMC,CMPEE JUMP IF OK (END OF IMAGE)
13226: *
13227: * HERE FOR BAD TRANSFER LABEL
13228: *
13229: CMP08 ERB 211,SYNTAX ERROR. UNDEFINED OR ERRONEOUS ENTRY LABEL
13230: *
13231: * HERE FOR END OF INPUT (NO END LABEL DETECTED)
13232: *
13233: CMP09 ADD =STGND,STAGE ADJUST STAGE APPROPRIATELY
13234: BEQ STAGE,=STGXE,CMPEE JUMP IF CODE CALL (OK)
13235: ERB 212,SYNTAX ERROR. MISSING END LINE
13236: *
13237: * HERE AFTER PROCESSING END LINE (MERGE HERE ON END ERROR)
13238: *
13239: CMPEE MOV =OSTP$,WA SET STOP CALL POINTER
13240: JSR CDWRD GENERATE AS STATEMENT CALL
13241: BRN CMPSE JUMP TO GENERATE AS FAILURE
13242: EJC
13243: *
13244: * CMPIL (CONTINUED)
13245: *
13246: * HERE AFTER PROCESSING LABEL OTHER THAN END
13247: *
13248: CMP11 BNE STAGE,=STGIC,CMP12 JUMP IF CODE CALL - REDEF. OK
13249: BEQ VRLBL(XR),=STNDL,CMP12 ELSE CHECK FOR REDEFINITION
13250: ZER CMLBL(XS) LEAVE FIRST LABEL DECLN UNDISTURBED
13251: ERB 213,SYNTAX ERROR. DUPLICATE LABEL
13252: *
13253: * HERE AFTER DEALING WITH LABEL
13254: *
13255: CMP12 ZER WB SET FLAG FOR STATEMENT BODY
13256: JSR EXPAN GET TREE FOR STATEMENT BODY
13257: MOV XR,CMSTM(XS) STORE FOR LATER USE
13258: ZER CMSGO(XS) CLEAR SUCCESS GOTO POINTER
13259: ZER CMFGO(XS) CLEAR FAILURE GOTO POINTER
13260: ZER CMCGO(XS) CLEAR CONDITIONAL GOTO FLAG
13261: JSR SCANE SCAN NEXT ELEMENT
13262: BNE XL,=T$COL,CMP18 JUMP IT NOT COLON (NO GOTO)
13263: *
13264: * LOOP TO PROCESS GOTO FIELDS
13265: *
13266: CMP13 MNZ SCNGO SET GOTO FLAG
13267: JSR SCANE SCAN NEXT ELEMENT
13268: BEQ XL,=T$SMC,CMP32 JUMP IF NO FIELDS LEFT
13269: BEQ XL,=T$SGO,CMP14 JUMP IF S FOR SUCCESS GOTO
13270: BEQ XL,=T$FGO,CMP16 JUMP IF F FOR FAILURE GOTO
13271: *
13272: * HERE FOR UNCONDITIONAL GOTO (I.E. NOT F OR S)
13273: *
13274: MNZ SCNRS SET TO RESCAN ELEMENT NOT F,S
13275: JSR SCNGF SCAN OUT GOTO FIELD
13276: BNZ CMFGO(XS),CMP17 ERROR IF FGOTO ALREADY
13277: MOV XR,CMFGO(XS) ELSE SET AS FGOTO
13278: BRN CMP15 MERGE WITH SGOTO CIRCUIT
13279: *
13280: * HERE FOR SUCCESS GOTO
13281: *
13282: CMP14 JSR SCNGF SCAN SUCCESS GOTO FIELD
13283: MOV =NUM01,CMCGO(XS) SET CONDITIONAL GOTO FLAG
13284: *
13285: * UNCONTIONAL GOTO MERGES HERE
13286: *
13287: CMP15 BNZ CMSGO(XS),CMP17 ERROR IF SGOTO ALREADY GIVEN
13288: MOV XR,CMSGO(XS) ELSE SET SGOTO
13289: BRN CMP13 LOOP BACK FOR NEXT GOTO FIELD
13290: *
13291: * HERE FOR FAILURE GOTO
13292: *
13293: CMP16 JSR SCNGF SCAN GOTO FIELD
13294: MOV =NUM01,CMCGO(XS) SET CONDITONAL GOTO FLAG
13295: BNZ CMFGO(XS),CMP17 ERROR IF FGOTO ALREADY GIVEN
13296: MOV XR,CMFGO(XS) ELSE STORE FGOTO POINTER
13297: BRN CMP13 LOOP BACK FOR NEXT FIELD
13298: EJC
13299: *
13300: * CMPIL (CONTINUED)
13301: *
13302: * HERE FOR DUPLICATED GOTO FIELD
13303: *
13304: CMP17 ERB 214,SYNTAX ERROR. DUPLICATED GOTO FIELD
13305: *
13306: * HERE TO GENERATE CODE
13307: *
13308: CMP18 ZER SCNSE STOP POSITIONAL ERROR FLAGS
13309: MOV CMSTM(XS),XR LOAD TREE PTR FOR STATEMENT BODY
13310: ZER WB COLLECTABLE VALUE FOR WB FOR CDGVL
13311: ZER WC RESET CONSTANT FLAG FOR CDGVL
13312: JSR EXPAP TEST FOR PATTERN MATCH
13313: PPM CMP19 JUMP IF NOT PATTERN MATCH
13314: MOV =OPMS$,CMOPN(XR) ELSE SET PATTERN MATCH POINTER
13315: MOV =C$PMT,CMTYP(XR)
13316: *
13317: * HERE AFTER DEALING WITH SPECIAL PATTERN MATCH CASE
13318: *
13319: CMP19 JSR CDGVL GENERATE CODE FOR BODY OF STATEMENT
13320: MOV CMSGO(XS),XR LOAD SGOTO POINTER
13321: MOV XR,WA COPY IT
13322: BZE XR,CMP21 JUMP IF NO SUCCESS GOTO
13323: ZER CMSOC(XS) CLEAR SUCCESS OFFSET FILLIN PTR
13324: BHI XR,STATE,CMP20 JUMP IF COMPLEX GOTO
13325: *
13326: * HERE FOR SIMPLE SUCCESS GOTO (LABEL)
13327: *
13328: ADD *VRTRA,WA POINT TO VRTRA FIELD AS REQUIRED
13329: JSR CDWRD GENERATE SUCCESS GOTO
13330: BRN CMP22 JUMP TO DEAL WITH FGOTO
13331: *
13332: * HERE FOR COMPLEX SUCCESS GOTO
13333: *
13334: CMP20 BEQ XR,CMFGO(XS),CMP22 NO CODE IF SAME AS FGOTO
13335: ZER WB ELSE SET OK VALUE FOR CDGVL IN WB
13336: JSR CDGCG GENERATE CODE FOR SUCCESS GOTO
13337: BRN CMP22 JUMP TO DEAL WITH FGOTO
13338: *
13339: * HERE FOR NO SUCCESS GOTO
13340: *
13341: CMP21 MOV CWCOF,CMSOC(XS) SET SUCCESS FILL IN OFFSET
13342: MOV =OCER$,WA POINT TO COMPILE ERROR CALL
13343: JSR CDWRD GENERATE AS TEMPORARY VALUE
13344: EJC
13345: *
13346: * CMPIL (CONTINUED)
13347: *
13348: * HERE TO DEAL WITH FAILURE GOTO
13349: *
13350: CMP22 MOV CMFGO(XS),XR LOAD FAILURE GOTO POINTER
13351: MOV XR,WA COPY IT
13352: ZER CMFFC(XS) SET NO FILL IN REQUIRED YET
13353: BZE XR,CMP23 JUMP IF NO FAILURE GOTO GIVEN
13354: ADD *VRTRA,WA POINT TO VRTRA FIELD IN CASE
13355: BLO XR,STATE,CMPSE JUMP TO GEN IF SIMPLE FGOTO
13356: *
13357: * HERE FOR COMPLEX FAILURE GOTO
13358: *
13359: MOV CWCOF,WB SAVE OFFSET TO O$GOF CALL
13360: MOV =OGOF$,WA POINT TO FAILURE GOTO CALL
13361: JSR CDWRD GENERATE
13362: MOV =OFIF$,WA POINT TO FAIL IN FAIL WORD
13363: JSR CDWRD GENERATE
13364: JSR CDGCG GENERATE CODE FOR FAILURE GOTO
13365: MOV WB,WA COPY OFFSET TO O$GOF FOR CDFAL
13366: MOV =B$CDC,WB SET COMPLEX CASE CDTYP
13367: BRN CMP25 JUMP TO BUILD CDBLK
13368: *
13369: * HERE IF NO FAILURE GOTO GIVEN
13370: *
13371: CMP23 MOV =OUNF$,WA LOAD UNEXPECTED FAILURE CALL IN CAS
13372: MOV CSWFL,WC GET -NOFAIL FLAG
13373: ORB CMCGO(XS),WC CHECK IF CONDITIONAL GOTO
13374: ZRB WC,CMPSE JUMP IF -NOFAIL AND NO COND. GOTO
13375: MNZ CMFFC(XS) ELSE SET FILL IN FLAG
13376: MOV =OCER$,WA AND SET COMPILE ERROR FOR TEMPORARY
13377: *
13378: * MERGE HERE WITH CDFAL VALUE IN WA, SIMPLE CDBLK
13379: * ALSO SPECIAL ENTRY AFTER STATEMENT ERROR
13380: *
13381: CMPSE MOV =B$CDS,WB SET CDTYP FOR SIMPLE CASE
13382: EJC
13383: *
13384: * CMPIL (CONTINUED)
13385: *
13386: * MERGE HERE TO BUILD CDBLK
13387: *
13388: * (WA) CDFAL VALUE TO BE GENERATED
13389: * (WB) CDTYP VALUE TO BE GENERATED
13390: *
13391: * AT THIS STAGE, WE CHOP OFF AN APPROPRIATE CHUNK OF THE
13392: * CURRENT CCBLK AND CONVERT IT INTO A CDBLK. THE REMAINDER
13393: * OF THE CCBLK IS REFORMATTED TO BE THE NEW CCBLK.
13394: *
13395: CMP25 MOV R$CCB,XR POINT TO CCBLK
13396: MOV CMLBL(XS),XL GET POSSIBLE LABEL POINTER
13397: BZE XL,CMP26 SKIP IF NO LABEL
13398: ZER CMLBL(XS) CLEAR FLAG FOR NEXT STATEMENT
13399: MOV XR,VRLBL(XL) PUT CDBLK PTR IN VRBLK LABEL FIELD
13400: *
13401: * MERGE AFTER DOING LABEL
13402: *
13403: CMP26 MOV WB,(XR) SET TYPE WORD FOR NEW CDBLK
13404: MOV WA,CDFAL(XR) SET FAILURE WORD
13405: MOV XR,XL COPY POINTER TO CCBLK
13406: MOV CCUSE(XR),WB LOAD LENGTH GEN (= NEW CDLEN)
13407: MOV CCLEN(XR),WC LOAD TOTAL CCBLK LENGTH
13408: ADD WB,XL POINT PAST CDBLK
13409: SUB WB,WC GET LENGTH LEFT FOR CHOP OFF
13410: MOV =B$CCT,(XL) SET TYPE CODE FOR NEW CCBLK AT END
13411: MOV *CCCOD,CCUSE(XL) SET INITIAL CODE OFFSET
13412: MOV *CCCOD,CWCOF REINITIALISE CWCOF
13413: MOV WC,CCLEN(XL) SET NEW LENGTH
13414: MOV XL,R$CCB SET NEW CCBLK POINTER
13415: MOV CMPSN,CDSTM(XR) SET STATEMENT NUMBER
13416: ICV CMPSN BUMP STATEMENT NUMBER
13417: *
13418: * SET POINTERS IN PREVIOUS CODE BLOCK AS REQUIRED
13419: *
13420: MOV CMPCD(XS),XL LOAD PTR TO PREVIOUS CDBLK
13421: BZE CMFFP(XS),CMP27 JUMP IF NO FAILURE FILL IN REQUIRED
13422: MOV XR,CDFAL(XL) ELSE SET FAILURE PTR IN PREVIOUS
13423: *
13424: * HERE TO DEAL WITH SUCCESS FORWARD POINTER
13425: *
13426: CMP27 MOV CMSOP(XS),WA LOAD SUCCESS OFFSET
13427: BZE WA,CMP28 JUMP IF NO FILL IN REQUIRED
13428: ADD WA,XL ELSE POINT TO FILL IN LOCATION
13429: MOV XR,(XL) STORE FORWARD POINTER
13430: ZER XL CLEAR GARBAGE XL VALUE
13431: EJC
13432: *
13433: * CMPIL (CONTINUED)
13434: *
13435: * NOW SET FILL IN POINTERS FOR THIS STATEMENT
13436: *
13437: CMP28 MOV CMFFC(XS),CMFFP(XS) COPY FAILURE FILL IN FLAG
13438: MOV CMSOC(XS),CMSOP(XS) COPY SUCCESS FILL IN OFFSET
13439: MOV XR,CMPCD(XS) SAVE PTR TO THIS CDBLK
13440: BNZ CMTRA(XS),CMP29 JUMP IF INITIAL ENTRY ALREADY SET
13441: MOV XR,CMTRA(XS) ELSE SET PTR HERE AS DEFAULT
13442: *
13443: * HERE AFTER COMPILING ONE STATEMENT
13444: *
13445: CMP29 BLT STAGE,=STGCE,CMP01 JUMP IF NOT END LINE JUST DONE
13446: BZE CSWLS,CMP30 SKIP IF -NOLIST
13447: JSR LISTR LIST LAST LINE
13448: *
13449: * RETURN
13450: *
13451: CMP30 MOV CMTRA(XS),XR LOAD INITIAL ENTRY CDBLK POINTER
13452: ADD *CMNEN,XS POP WORK LOCATIONS OFF STACK
13453: *
13454: * LOOP TO UNNEST ANY OUTSTANDING -COPY LEVELS
13455: *
13456: CMP31 JSR COPND CALL TO UNNEST -COPY
13457: BNZ R$COP,CMP31 LOOP IF NOT ALL -COPYS CLOSED
13458: EXI RETURN TO CMPIL CALLER
13459: *
13460: * HERE AT END OF GOTO FIELD
13461: *
13462: CMP32 MOV CMFGO(XS),WB GET FAIL GOTO
13463: ORB CMSGO(XS),WB OR IN SUCCESS GOTO
13464: BNZ WB,CMP18 OK IF NON-NULL FIELD
13465: ERB 215,SYNTAX ERROR. EMPTY GOTO FIELD
13466: *
13467: * CONTROL CARD FOUND
13468: *
13469: CMP33 ICV WB POINT PAST CH$MN
13470: JSR CNCRD PROCESS CONTROL CARD
13471: ZER SCNSE CLEAR START OF ELEMENT LOC.
13472: BRN CMPCE LOOP FOR NEXT STATEMENT
13473: ENP END PROCEDURE CMPIL
13474: EJC
13475: *
13476: * CNCRD -- CONTROL CARD PROCESSOR
13477: *
13478: * CALLED TO DEAL WITH CONTROL CARDS
13479: *
13480: * R$CIM POINTS TO CURRENT IMAGE
13481: * (WB) OFFSET TO 1ST CHAR OF CONTROL CARD
13482: * JSR CNCRD CALL TO PROCESS CONTROL CARDS
13483: * (XL,XR,WA,WB,WC,IA) DESTROYED
13484: *
13485: CNCRD PRC E,0 ENTRY POINT
13486: MOV WB,SCNPT OFFSET FOR CONTROL CARD SCAN
13487: MOV =CCNOC,WA NUMBER OF CHARS FOR COMPARISON
13488: CTW WA,0 CONVERT TO WORD COUNT
13489: MOV WA,CNSWC SAVE WORD COUNT
13490: *
13491: * LOOP HERE IF MORE THAN ONE CONTROL CARD
13492: *
13493: CNC01 BGE SCNPT,SCNIL,CNC10 RETURN IF END OF IMAGE
13494: MOV R$CIM,XR POINT TO IMAGE
13495: PLC XR,SCNPT CHAR PTR FOR FIRST CHAR
13496: LCH WA,(XR)+ GET FIRST CHAR
13497: BEQ WA,=CH$LI,CNC07 SPECIAL CASE OF -INXXX
13498: .IF .CASL
13499: BEQ WA,=CH$$I,CNC07 DITTO (LC)
13500: .FI
13501: MNZ SCNCC SET FLAG FOR SCANE
13502: JSR SCANE SCAN CARD NAME
13503: ZER SCNCC CLEAR SCANE FLAG
13504: BNZ XL,CNC06 FAIL UNLESS CONTROL CARD NAME
13505: MOV =CCNOC,WA NO. OF CHARS TO BE COMPARED
13506: BLT SCLEN(XR),WA,CNC06 FAIL IF TOO FEW CHARS
13507: MOV XR,XL POINT TO CONTROL CARD NAME
13508: ZER WB ZERO OFFSET FOR SUBSTRING
13509: .IF .CASL
13510: JSR SBSCC CONVERT CASE BEFORE COMPARISON
13511: .ELSE
13512: JSR SBSTR EXTRACT SUBSTRING FOR COMPARISON
13513: .FI
13514: MOV XR,CNSCC KEEP CONTROL CARD SUBSTRING PTR
13515: MOV =CCNMS,XR POINT TO LIST OF STANDARD NAMES
13516: ZER WB INITIALISE NAME OFFSET
13517: LCT WC,=CC$CT NUMBER OF STANDARD NAMES
13518: *
13519: * TRY TO MATCH NAME
13520: *
13521: CNC02 MOV CNSCC,XL POINT TO NAME
13522: LCT WA,CNSWC COUNTER FOR INNER LOOP
13523: BRN CNC04 JUMP INTO LOOP
13524: *
13525: * INNER LOOP TO MATCH CARD NAME CHARS
13526: *
13527: CNC03 ICA XR BUMP STANDARD NAMES PTR
13528: ICA XL BUMP NAME POINTER
13529: *
13530: * HERE TO INITIATE THE LOOP
13531: *
13532: CNC04 CNE SCHAR(XL),(XR),CNC05 COMP. UP TO CFP$C CHARS AT ONCE
13533: BCT WA,CNC03 LOOP IF MORE WORDS TO COMPARE
13534: EJC
13535: *
13536: * CNCRD (CONTINUED)
13537: *
13538: * MATCHED - BRANCH ON CARD OFFSET
13539: *
13540: MOV WB,XL GET NAME OFFSET
13541: BSW XL,CC$CT SWITCH
13542: .IF .CASL
13543: IFF CC$CI,CNC11 -CASEIG
13544: .FI
13545: IFF CC$CO,CNC23 -COPY
13546: IFF CC$EJ,CNC12 -EJECT
13547: IFF CC$FA,CNC13 -FAIL
13548: IFF CC$LI,CNC14 -LIST
13549: .IF .CASL
13550: IFF CC$NC,CNC15 -NOCASEIG
13551: .FI
13552: IFF CC$NF,CNC16 -NOFAIL
13553: IFF CC$NL,CNC17 -NOLIST
13554: IFF CC$ST,CNC18 -STITLE
13555: IFF CC$TI,CNC19 -TITLE
13556: IFF CC$TR,CNC22 -TRACE
13557: ESW END SWITCH
13558: *
13559: * NOT MATCHED YET. ALIGN STD NAMES PTR AND TRY AGAIN
13560: *
13561: CNC05 ICA XR BUMP STANDARD NAMES PTR
13562: BCT WA,CNC05 LOOP
13563: ICV WB BUMP NAMES OFFSET
13564: BCT WC,CNC02 CONTINUE IF MORE NAMES
13565: *
13566: * INVALID CONTROL CARD NAME
13567: *
13568: CNC06 ERB 216,INVALID CONTROL CARD
13569: *
13570: * SPECIAL PROCESSING FOR -INXXX
13571: *
13572: CNC07 LCH WA,(XR) GET NEXT CHAR
13573: .IF .CASL
13574: BEQ WA,=CH$$N,CNC08 SKIP IF LC N
13575: .FI
13576: BNE WA,=CH$LN,CNC06 FAIL IF NOT LETTER N
13577: .IF .CASL
13578: CNC08 ADD =NUM02,SCNPT BUMP OFFSET PAST -IN
13579: .ELSE
13580: ADD =NUM02,SCNPT BUMP OFFSET PAST -IN
13581: .FI
13582: JSR SCANE SCAN INTEGER AFTER -IN
13583: MOV XR,-(XS) STACK SCANNED ITEM
13584: JSR GTSMI CHECK IF INTEGER
13585: PPM CNC06 FAIL IF NOT INTEGER
13586: PPM CNC06 FAIL IF NEGATIVE OR LARGE
13587: MOV XR,CSWIN KEEP INTEGER
13588: EJC
13589: *
13590: * CNCRD (CONTINUED)
13591: *
13592: * CHECK FOR MORE CONTROL CARDS BEFORE RETURNING
13593: *
13594: CNC09 MOV SCNPT,WA PRESERVE IN CASE XEQ TIME COMPILE
13595: JSR SCANE LOOK FOR COMMA
13596: BEQ XL,=T$CMA,CNC01 LOOP IF COMMA FOUND
13597: MOV WA,SCNPT RESTORE SCNPT IN CASE XEQ TIME
13598: *
13599: * RETURN POINT
13600: *
13601: CNC10 EXI RETURN
13602: .IF .CASL
13603: *
13604: * -CASEIG
13605: *
13606: CNC11 MNZ CSWCI SET SWITCH
13607: BRN CNC09 MERGE
13608: .FI
13609: *
13610: * -EJECT
13611: *
13612: CNC12 BZE CSWLS,CNC10 RETURN IF -NOLIST
13613: JSR PRTPS EJECT
13614: JSR LISTT LIST TITLE
13615: BRN CNC10 FINISHED
13616: *
13617: * -FAIL
13618: *
13619: CNC13 MNZ CSWFL SET SWITCH
13620: BRN CNC09 MERGE
13621: *
13622: * -LIST
13623: *
13624: CNC14 MNZ CSWLS SET SWITCH
13625: BRN CNC09 MERGE
13626: .IF .CASL
13627: *
13628: * -NOCASEIG
13629: *
13630: CNC15 ZER CSWCI CLEAR SWITCH
13631: BRN CNC09 MERGE
13632: .FI
13633: *
13634: * -NOFAIL
13635: *
13636: CNC16 ZER CSWFL CLEAR SWITCH
13637: BRN CNC09 MERGE
13638: EJC
13639: *
13640: * CNCRD (CONTINUED)
13641: *
13642: * -NOLIST
13643: *
13644: CNC17 ZER CSWLS CLEAR SWITCH
13645: BRN CNC09 MERGE
13646: *
13647: * -STITL
13648: *
13649: CNC18 MOV =R$STL,CNR$T PTR TO R$STL
13650: BRN CNC20 MERGE
13651: *
13652: * -TITLE
13653: *
13654: CNC19 MOV =NULLS,R$STL CLEAR SUBTITLE
13655: MOV =R$TTL,CNR$T PTR TO R$TTL
13656: *
13657: * COMMON PROCESSING FOR -TITLE, -STITL
13658: *
13659: CNC20 MOV =NULLS,XR NULL IN CASE NEEDED
13660: MNZ CNTTL SET FLAG FOR NEXT LISTR CALL
13661: MOV =CCOFS,WB OFFSET TO TITLE/SUBTITLE
13662: MOV SCNIL,WA INPUT IMAGE LENGTH
13663: BLO WA,WB,CNC21 JUMP IF NO CHARS LEFT
13664: SUB WB,WA NO OF CHARS TO EXTRACT
13665: MOV R$CIM,XL POINT TO IMAGE
13666: JSR SBSTR GET TITLE/SUBTITLE
13667: *
13668: * STORE TITLE/SUBTITLE
13669: *
13670: CNC21 MOV CNR$T,XL POINT TO STORAGE LOCATION
13671: MOV XR,(XL) STORE TITLE/SUBTITLE
13672: BRN CNC10 RETURN
13673: *
13674: * -TRACE
13675: *
13676: * PROVIDED FOR SYSTEM DEBUGGING. TOGGLES THE SYSTEM LABEL
13677: * TRACE SWITCH AT COMPILE TIME
13678: *
13679: CNC22 JSR SYSTT TOGGLE SWITCH
13680: BRN CNC09 MERGE
13681: *
13682: * -COPY
13683: *
13684: * GET FILETAG AND NOTIFY OSINT THAT WE ARE NESTING
13685: *
13686: CNC23 JSR SCANE GET FILETAG
13687: BNE =T$CON,XL,CNC06 ERR IF NOT CONSTANT
13688: BNE =B$SCL,(XR),CNC06 ERR IF NOT SCBLK
13689: JSR SYSSC CALL TO START COPY
13690: ERR 258,COPY FILE DOES NOT EXIST
13691: PPM EROSI ERROR RETURN (ALWAYS)
13692: MOV WA,WB SAVE IOTAG FROM OSINT
13693: MOV *COSI$,WA GET SIZE OF COPY BLOCK
13694: JSR ALLOC ALLOCATE
13695: MOV =B$COP,COTYP(XR) SET TYPE
13696: MOV R$COP,CONXT(XR) PLACE AT FRONT OF STACK CHN
13697: MOV XR,R$COP SPLICE IT IN
13698: MOV WB,COIOT(XR) SAVE OSINT IOTAG
13699: MOV TTINS,COTTI(XR) SAVE TTINS
13700: ZER TTINS INPUT NOT FROM TERMINAL NOW
13701: MOV R$CIM,COCIM(XR) SAVE R$CIM IN CASE EXEC TIME
13702: MOV SCNPT,COSPT(XR) SAVE SCNPT IN CASE EXEC TIME
13703: MOV CSWLS,COSLS(XR) SAVE LIST FLAG
13704: MOV CSWIN,COSIN(XR) SAVE -INXXX VALUE
13705: MOV R$STL,COSTL(XR) SAVE SUBTITLE
13706: BZE CSWLS,CNC10 NO LIST -COPY IF -NOLIST
13707: JSR LISTR LIST -COPY CARD
13708: BRN CNC10 EXIT
13709: ENP END PROCEDURE CNCRD
13710: EJC
13711: *
13712: * COPND -- END -COPY NESTING
13713: *
13714: * COPND IS CALLED FROM CMPIL AND READR IN ORDER TO
13715: * UNNEST ONE LEVEL OF -COPY AND RESTORE THE PREVIOUS
13716: * INPUT COMPILE STRING. THE COPY BLOCK IS REMOVED
13717: * FROM THE CHAIN AND THE STATE RESTORED FROM IT.
13718: *
13719: * JSR COPND CALL TO END -COPY AT CUR. LEVEL
13720: * (XL,WA,WB,WC) DESTROYED
13721: *
13722: COPND PRC E,0 ENTRY POINT
13723: MOV R$COP,XL GET POINTER TO CURRENT COBLK
13724: BZE XL,COP02 EXIT IF NONE
13725: MOV CONXT(XL),R$COP TAKE OFF CHAIN
13726: MOV COIOT(XL),WA GET IOTAG FOR OSINT
13727: JSR SYSEC CALL TO END COPY
13728: PPM DO NOT USE
13729: PPM EROSI ERROR EXIT
13730: BZE CSWLS,COP01 SKIP LISTING IF -NOLIST
13731: JSR LISTR LIST CURRENT IMAGE
13732: *
13733: * MERGE AFTER POSSIBLE LISTING OF CURRENT IMAGE
13734: *
13735: COP01 MOV COTTI(XL),TTINS RESTORE TERMINAL INPUT FLAG
13736: MOV COSLS(XL),CSWLS RESTORE LISTING STATE
13737: MOV COSPT(XL),SCNPT GET OLD SCAN POINTER
13738: MOV COSIN(XL),CSWIN OLD INPUT IMAGE LENGTH
13739: MOV COSTL(XL),R$STL RESTORE SUBTITLE STRING
13740: MNZ LSTPF THIS IMAGE LISTED IN CNCRD
13741: MOV COCIM(XL),XL GET OLD COMPILER IMAGE SCBLK
13742: MOV XL,R$CIM RESTORE IT
13743: MOV SCLEN(XL),SCNIL SET INPUT IMAGE LENGTH TOO
13744: *
13745: * MERGE TO EXIT
13746: *
13747: COP02 EXI RETURN TO CALLER
13748: ENP END PROCEDURE COPND
13749: EJC
13750: *
13751: * DFFNC -- DEFINE FUNCTION
13752: *
13753: * DFFNC IS CALLED WHENEVER A NEW FUNCTION IS ASSIGNED TO
13754: * A VARIABLE. IT DEALS WITH EXTERNAL FUNCTION USE COUNTS.
13755: *
13756: * (XR) POINTER TO VRBLK
13757: * (XL) POINTER TO NEW FUNCTION BLOCK
13758: * JSR DFFNC CALL TO DEFINE FUNCTION
13759: * (WA,WB) DESTROYED
13760: *
13761: DFFNC PRC E,0 ENTRY POINT
13762: .IF .CNLD
13763: .ELSE
13764: BNE (XL),=B$EFC,DFFN1 SKIP IF NEW FUNCTION NOT EXTERNAL
13765: ICV EFUSE(XL) ELSE INCREMENT ITS USE COUNT
13766: *
13767: * HERE AFTER DEALING WITH NEW FUNCTION USE COUNT
13768: *
13769: DFFN1 MOV XR,WA SAVE VRBLK POINTER
13770: MOV VRFNC(XR),XR LOAD OLD FUNCTION POINTER
13771: BNE (XR),=B$EFC,DFFN2 JUMP IF OLD FUNCTION NOT EXTERNAL
13772: MOV EFUSE(XR),WB ELSE GET USE COUNT
13773: DCV WB DECREMENT
13774: MOV WB,EFUSE(XR) STORE DECREMENTED VALUE
13775: BNZ WB,DFFN2 JUMP IF USE COUNT STILL NON-ZERO
13776: JSR SYSUL ELSE CALL SYSTEM UNLOAD FUNCTION
13777: *
13778: * HERE AFTER DEALING WITH OLD FUNCTION USE COUNT
13779: *
13780: DFFN2 MOV WA,XR RESTORE VRBLK POINTER
13781: .FI
13782: MOV XL,WA COPY FUNCTION BLOCK PTR
13783: BLT XR,=R$YYY,DFFN3 SKIP CHECKS IF OPSYN OP DEFINITION
13784: BNZ VRLEN(XR),DFFN3 JUMP IF NOT SYSTEM VARIABLE
13785: *
13786: * FOR SYSTEM VARIABLE, CHECK FOR ILLEGAL REDEFINITION
13787: *
13788: MOV VRSVP(XR),XL POINT TO SVBLK
13789: MOV SVBIT(XL),WB LOAD BIT INDICATORS
13790: ANB BTFNC,WB IS IT A SYSTEM FUNCTION
13791: ZRB WB,DFFN3 REDEF OK IF NOT
13792: ERB 217,ATTEMPTED REDEFINITION OF SYSTEM FUNCTION
13793: *
13794: * HERE IF REDEFINITION IS PERMITTED
13795: *
13796: DFFN3 MOV WA,VRFNC(XR) STORE NEW FUNCTION POINTER
13797: MOV WA,XL RESTORE FUNCTION BLOCK POINTER
13798: EXI RETURN TO DFFNC CALLER
13799: ENP END PROCEDURE DFFNC
13800: EJC
13801: *
13802: * DTYPE -- GET DATATYPE NAME
13803: *
13804: * (XR) OBJECT WHOSE DATATYPE IS REQUIRED
13805: * JSR DTYPE CALL TO GET DATATYPE
13806: * (XR) RESULT DATATYPE
13807: *
13808: DTYPE PRC E,0 ENTRY POINT
13809: BEQ (XR),=B$PDT,DTYP1 JUMP IF PROG.DEFINED
13810: MOV (XR),XR LOAD TYPE WORD
13811: LEI XR GET ENTRY POINT ID (BLOCK CODE)
13812: WTB XR CONVERT TO BAU OFFSET
13813: MOV SCNMT(XR),XR LOAD TABLE ENTRY
13814: EXI EXIT TO DTYPE CALLER
13815: *
13816: * HERE IF PROGRAM DEFINED
13817: *
13818: DTYP1 MOV PDDFP(XR),XR POINT TO DFBLK
13819: MOV DFNAM(XR),XR GET DATATYPE NAME FROM DFBLK
13820: EXI RETURN TO DTYPE CALLER
13821: ENP END PROCEDURE DTYPE
13822: EJC
13823: *
13824: * DUMPR -- PRINT DUMP OF STORAGE
13825: *
13826: * (XR) DUMP ARGUMENT (SEE BELOW)
13827: * JSR DUMPR CALL TO PRINT DUMP
13828: * (XR,XL) DESTROYED
13829: * (WA,WB,WC,RA) DESTROYED
13830: *
13831: * THE DUMP ARGUMENT HAS THE FOLLOWING SIGNIFICANCE
13832: *
13833: * DMARG = 0 NO DUMP PRINTED
13834: * DMARG = 1 PARTIAL DUMP (NAT VARS, KEYWORDS)
13835: * DMARG GE 2 FULL DUMP (INCL ARRAYS ETC.)
13836: *
13837: * SINCE DUMPR SCRAMBLES STORE, IT IS NOT PERMISSIBLE TO
13838: * COLLECT IN MID-DUMP. HENCE A COLLECT IS DONE INITIALLY
13839: * AND THEN IF STORE RUNS OUT AN ERROR MESSAGE IS PRODUCED.
13840: *
13841: DUMPR PRC E,0 ENTRY POINT
13842: BZE XR,DMP28 SKIP DUMP IF ARGUMENT IS ZERO
13843: ZER XL CLEAR XL
13844: ZER WB ZERO MOVE OFFSET
13845: MOV XR,DMARG SAVE DUMP ARGUMENT
13846: JSR GBCOL COLLECT GARBAGE
13847: JSR PRTPG EJECT PRINTER
13848: MOV =DMHDV,XR POINT TO HEADING FOR VARIABLES
13849: JSR PRTFB PRINT IT
13850: *
13851: * FIRST ALL NATURAL VARIABLE BLOCKS (VRBLK) WHOSE VALUES
13852: * ARE NON-NULL ARE LINKED IN LEXICAL ORDER USING DMVCH AS
13853: * THE CHAIN HEAD AND CHAINING THROUGH THE VRGET FIELDS.
13854: * NOTE THAT THIS SCRAMBLES STORE IF THE PROCESS IS
13855: * INTERRUPTED BEFORE COMPLETION E.G. BY EXCEEDING TIME OR
13856: * PRINT LIMITS. SINCE THE SUBSEQUENT CORE DUMPS AND
13857: * FAILURES IF EXECUTION IS RESUMED ARE VERY CONFUSING, THE
13858: * EXECUTION TIME ERROR ROUTINE CHECKS FOR THIS EVENT AND
13859: * ATTEMPTS AN UNSCRAMBLE. SIMILAR PRECAUTIONS SHOULD BE
13860: * OBSERVED IF TRANSLATE TIME DUMPING IS IMPLEMENTED.
13861: *
13862: ZER DMVCH SET NULL CHAIN TO START
13863: MOV HSHTB,WA POINT TO HASH TABLE
13864: *
13865: * LOOP THROUGH HEADERS IN HASH TABLE
13866: *
13867: DMP00 MOV WA,XR COPY HASH BUCKET POINTER
13868: ICA WA BUMP POINTER
13869: SUB *VRNXT,XR SET OFFSET TO MERGE
13870: *
13871: * LOOP THROUGH VRBLKS ON ONE CHAIN
13872: *
13873: DMP01 MOV VRNXT(XR),XR POINT TO NEXT VRBLK ON CHAIN
13874: BZE XR,DMP09 JUMP IF END OF THIS HASH CHAIN
13875: MOV XR,XL ELSE COPY VRBLK POINTER
13876: EJC
13877: *
13878: * DUMPR (CONTINUED)
13879: *
13880: * LOOP TO FIND VALUE AND SKIP IF NULL
13881: *
13882: DMP02 MOV VRVAL(XL),XL LOAD VALUE
13883: BEQ XL,=NULLS,DMP01 LOOP FOR NEXT VRBLK IF NULL VALUE
13884: BEQ (XL),=B$TRT,DMP02 LOOP BACK IF VALUE IS TRAPPED
13885: *
13886: * NON-NULL VALUE, PREPARE TO SEARCH CHAIN
13887: *
13888: MOV XR,WC SAVE VRBLK POINTER
13889: ADD *VRSOF,XR ADJUST PTR TO BE LIKE SCBLK PTR
13890: BNZ SCLEN(XR),DMP03 JUMP IF NON-SYSTEM VARIABLE
13891: MOV VRSVO(XR),XR ELSE LOAD PTR TO NAME IN SVBLK
13892: *
13893: * HERE WITH NAME POINTER FOR NEW BLOCK IN XR
13894: *
13895: DMP03 MOV XR,WB SAVE POINTER TO CHARS
13896: MOV WA,DMPSV SAVE HASH BUCKET POINTER
13897: MOV =DMVCH,WA POINT TO CHAIN HEAD
13898: *
13899: * LOOP TO SEARCH CHAIN FOR CORRECT INSERTION POINT
13900: *
13901: DMP04 MOV WA,DMPCH SAVE CHAIN POINTER
13902: MOV WA,XL COPY IT
13903: MOV (XL),XR LOAD POINTER TO NEXT ENTRY
13904: BZE XR,DMP08 JUMP IF END OF CHAIN TO INSERT
13905: ADD *VRSOF,XR ELSE GET NAME PTR FOR CHAINED VRBLK
13906: BNZ SCLEN(XR),DMP05 JUMP IF NOT SYSTEM VARIABLE
13907: MOV VRSVO(XR),XR ELSE POINT TO NAME IN SVBLK
13908: *
13909: * HERE PREPARE TO COMPARE THE NAMES
13910: *
13911: * (WA) SCRATCH
13912: * (WB) POINTER TO STRING OF ENTERING VRBLK
13913: * (WC) POINTER TO ENTERING VRBLK
13914: * (XR) POINTER TO STRING OF CURRENT BLOCK
13915: * (XL) SCRATCH
13916: *
13917: DMP05 MOV WB,XL POINT TO ENTERING VRBLK STRING
13918: MOV SCLEN(XL),WA LOAD ITS LENGTH
13919: PLC XL POINT TO CHARS OF ENTERING STRING
13920: BHI WA,SCLEN(XR),DMP06 JUMP IF ENTERING LENGTH HIGH
13921: PLC XR ELSE POINT TO CHARS OF OLD STRING
13922: CMC DMP08,DMP07 COMPARE, INSERT IF NEW IS LLT OLD
13923: BRN DMP08 OR IF LEQ (WE HAD SHORTER LENGTH)
13924: *
13925: * HERE WHEN NEW LENGTH IS LONGER THAN OLD LENGTH
13926: *
13927: DMP06 MOV SCLEN(XR),WA LOAD SHORTER LENGTH
13928: PLC XR POINT TO CHARS OF OLD STRING
13929: CMC DMP08,DMP07 COMPARE, INSERT IF NEW ONE LOW
13930: EJC
13931: *
13932: * DUMPR (CONTINUED)
13933: *
13934: * HERE WE MOVE OUT ON THE CHAIN
13935: *
13936: DMP07 MOV DMPCH,XL COPY CHAIN POINTER
13937: MOV (XL),WA MOVE TO NEXT ENTRY ON CHAIN
13938: BRN DMP04 LOOP BACK
13939: *
13940: * HERE AFTER LOCATING THE PROPER INSERTION POINT
13941: *
13942: DMP08 MOV DMPCH,XL COPY CHAIN POINTER
13943: MOV DMPSV,WA RESTORE HASH BUCKET POINTER
13944: MOV WC,XR RESTORE VRBLK POINTER
13945: MOV (XL),VRGET(XR) LINK VRBLK TO REST OF CHAIN
13946: MOV XR,(XL) LINK VRBLK INTO CURRENT CHAIN LOC
13947: BRN DMP01 LOOP BACK FOR NEXT VRBLK
13948: *
13949: * HERE AFTER PROCESSING ALL VRBLKS ON ONE CHAIN
13950: *
13951: DMP09 BNE WA,HSHTE,DMP00 LOOP BACK IF MORE BUCKETS TO GO
13952: *
13953: * LOOP TO GENERATE DUMP OF NATURAL VARIABLE VALUES
13954: *
13955: DMP10 MOV DMVCH,XR LOAD POINTER TO NEXT ENTRY ON CHAIN
13956: BZE XR,DMP11 JUMP IF END OF CHAIN
13957: MOV (XR),DMVCH ELSE UPDATE CHAIN PTR TO NEXT ENTRY
13958: JSR SETVR RESTORE VRGET FIELD
13959: MOV XR,XL COPY VRBLK POINTER (NAME BASE)
13960: MOV *VRVAL,WA SET OFFSET FOR VRBLK NAME
13961: JSR PRTNV PRINT NAME = VALUE
13962: BRN DMP10 LOOP BACK TILL ALL PRINTED
13963: *
13964: * PREPARE TO PRINT KEYWORDS
13965: *
13966: DMP11 JSR PRTFH PRINT BLANK LINE
13967: JSR PRTFH AND ANOTHER
13968: MOV =DMHDK,XR POINT TO KEYWORD HEADING
13969: JSR PRTFB PRINT HEADING
13970: MOV =VDMKW,XL POINT TO LIST OF KEYWORD SVBLK PTRS
13971: EJC
13972: *
13973: * DUMPR (CONTINUED)
13974: *
13975: * LOOP TO DUMP KEYWORD VALUES
13976: *
13977: DMP12 MOV (XL)+,XR LOAD NEXT SVBLK PTR FROM TABLE
13978: BZE XR,DMP13 JUMP IF END OF LIST
13979: MOV =CH$AM,WA LOAD AMPERSAND
13980: JSR PRTCH PRINT AMPERSAND
13981: JSR PRTST PRINT KEYWORD NAME
13982: MOV SVLEN(XR),WA LOAD NAME LENGTH FROM SVBLK
13983: CTB WA,SVCHS GET LENGTH OF NAME
13984: ADD WA,XR POINT TO SVKNM FIELD
13985: MOV (XR),DMPKN STORE IN DUMMY KVBLK
13986: MOV =TMBEB,XR POINT TO BLANK-EQUAL-BLANK
13987: JSR PRTST PRINT IT
13988: MOV XL,DMPSV SAVE TABLE POINTER
13989: MOV =DMPKB,XL POINT TO DUMMY KVBLK
13990: MOV *KVVAR,WA SET ZERO OFFSET
13991: JSR ACESS GET KEYWORD VALUE
13992: PPM FAILURE IS IMPOSSIBLE
13993: JSR PRTVF PRINT KEYWORD VALUE
13994: MOV DMPSV,XL RESTORE TABLE POINTER
13995: BRN DMP12 LOOP BACK TILL ALL PRINTED
13996: *
13997: * HERE AFTER COMPLETING PARTIAL DUMP
13998: *
13999: DMP13 BEQ DMARG,=NUM01,DMP27 EXIT IF PARTIAL DUMP COMPLETE
14000: MOV DNAMB,XR ELSE POINT TO FIRST DYNAMIC BLOCK
14001: *
14002: * LOOP THROUGH BLOCKS IN DYNAMIC STORAGE
14003: *
14004: DMP14 BEQ XR,DNAMP,DMP27 JUMP IF END OF USED REGION
14005: MOV (XR),WA ELSE LOAD FIRST WORD OF BLOCK
14006: BEQ WA,=B$VCT,DMP16 JUMP IF VECTOR
14007: BEQ WA,=B$ART,DMP17 JUMP IF ARRAY
14008: BEQ WA,=B$PDT,DMP18 JUMP IF PROGRAM DEFINED
14009: BEQ WA,=B$TBT,DMP19 JUMP IF TABLE
14010: .IF .CNBF
14011: .ELSE
14012: BEQ WA,=B$BCT,DMP29 JUMP IF BUFFER
14013: .FI
14014: *
14015: * MERGE HERE TO MOVE TO NEXT BLOCK
14016: *
14017: DMP15 JSR BLKLN GET LENGTH OF BLOCK
14018: ADD WA,XR POINT PAST THIS BLOCK
14019: BRN DMP14 LOOP BACK FOR NEXT BLOCK
14020: EJC
14021: *
14022: * DUMPR (CONTINUED)
14023: *
14024: * HERE FOR VECTOR
14025: *
14026: DMP16 MOV *VCVLS,WB SET OFFSET TO FIRST VALUE
14027: BRN DMP19 JUMP TO MERGE
14028: *
14029: * HERE FOR ARRAY
14030: *
14031: DMP17 MOV AROFS(XR),WB SET OFFSET TO ARPRO FIELD
14032: ICA WB BUMP TO GET OFFSET TO VALUES
14033: BRN DMP19 JUMP TO MERGE
14034: *
14035: * HERE FOR PROGRAM DEFINED
14036: *
14037: DMP18 MOV *PDFLD,WB POINT TO VALUES, MERGE
14038: *
14039: * HERE FOR TABLE (OTHERS MERGE)
14040: *
14041: DMP19 BZE IDVAL(XR),DMP15 IGNORE BLOCK IF ZERO ID VALUE
14042: JSR BLKLN ELSE GET BLOCK LENGTH
14043: MOV XR,XL COPY BLOCK POINTER
14044: MOV WA,DMPSV SAVE LENGTH
14045: MOV WB,WA COPY OFFSET TO FIRST VALUE
14046: JSR PRTFH PRINT BLANK LINE
14047: MOV WA,DMPSA PRESERVE OFFSET
14048: JSR PRTVF PRINT BLOCK VALUE (FOR TITLE)
14049: MOV DMPSA,WA RECOVER OFFSET
14050: BEQ (XR),=B$TBT,DMP22 JUMP IF TABLE
14051: DCA WA POINT BEFORE FIRST WORD
14052: *
14053: * LOOP TO PRINT CONTENTS OF ARRAY, VECTOR, OR PROGRAM DEF
14054: *
14055: DMP20 MOV XL,XR COPY BLOCK POINTER
14056: ICA WA BUMP OFFSET
14057: ADD WA,XR POINT TO NEXT VALUE
14058: BEQ WA,DMPSV,DMP14 EXIT IF END (XR PAST BLOCK)
14059: SUB *VRVAL,XR SUBTRACT OFFSET TO MERGE INTO LOOP
14060: *
14061: * LOOP TO FIND VALUE AND IGNORE NULLS
14062: *
14063: DMP21 MOV VRVAL(XR),XR LOAD NEXT VALUE
14064: BEQ XR,=NULLS,DMP20 LOOP BACK IF NULL VALUE
14065: BEQ (XR),=B$TRT,DMP21 LOOP BACK IF TRAPPED
14066: JSR PRTNV ELSE PRINT NAME = VALUE
14067: BRN DMP20 LOOP BACK FOR NEXT FIELD
14068: EJC
14069: *
14070: * DUMPR (CONTINUED)
14071: *
14072: * HERE TO DUMP A TABLE
14073: *
14074: DMP22 MOV *TBBUK,WC SET OFFSET TO FIRST BUCKET
14075: MOV *TEVAL,WA SET NAME OFFSET FOR ALL TEBLKS
14076: *
14077: * LOOP THROUGH TABLE BUCKETS
14078: *
14079: DMP23 MOV XL,-(XS) SAVE TBBLK POINTER
14080: ADD WC,XL POINT TO NEXT BUCKET HEADER
14081: ICA WC BUMP BUCKET OFFSET
14082: SUB *TENXT,XL SUBTRACT OFFSET TO MERGE INTO LOOP
14083: *
14084: * LOOP TO PROCESS TEBLKS ON ONE CHAIN
14085: *
14086: DMP24 MOV TENXT(XL),XL POINT TO NEXT TEBLK
14087: BEQ XL,(XS),DMP26 JUMP IF END OF CHAIN
14088: MOV XL,XR ELSE COPY TEBLK POINTER
14089: *
14090: * LOOP TO FIND VALUE AND IGNORE IF NULL
14091: *
14092: DMP25 MOV TEVAL(XR),XR LOAD NEXT VALUE
14093: BEQ XR,=NULLS,DMP24 IGNORE IF NULL VALUE
14094: BEQ (XR),=B$TRT,DMP25 LOOP BACK IF TRAPPED
14095: MOV WC,DMPSV ELSE SAVE OFFSET POINTER
14096: JSR PRTNV PRINT NAME = VALUE
14097: MOV DMPSV,WC RELOAD OFFSET
14098: BRN DMP24 LOOP BACK FOR NEXT TEBLK
14099: *
14100: * HERE TO MOVE TO NEXT HASH CHAIN
14101: *
14102: DMP26 MOV (XS)+,XL RESTORE TBBLK POINTER
14103: BNE WC,TBLEN(XL),DMP23 LOOP BACK IF MORE BUCKETS TO GO
14104: MOV XL,XR ELSE COPY TABLE POINTER
14105: ADD WC,XR POINT TO FOLLOWING BLOCK
14106: BRN DMP14 LOOP BACK TO PROCESS NEXT BLOCK
14107: *
14108: * HERE AFTER COMPLETING DUMP
14109: *
14110: DMP27 JSR PRTPG EJECT PRINTER
14111: *
14112: * MERGE HERE IF NO DUMP GIVEN (DMARG=0)
14113: *
14114: DMP28 EXI RETURN TO DUMP CALLER
14115: .IF .CNBF
14116: .ELSE
14117: EJC
14118: *
14119: * DUMPR (CONTINUED)
14120: *
14121: * HERE TO DUMP BUFFER BLOCK
14122: *
14123: DMP29 JSR PRTFH PRINT BLANK LINE
14124: JSR PRTVF PRINT VALUE ID FOR TITLE
14125: MOV =CH$DQ,WA LOAD DOUBLE QUOTE
14126: JSR PRTCH PRINT IT
14127: MOV BCLEN(XR),WC LOAD DEFINED LENGTH
14128: BZE WC,DMP32 SKIP CHARACTERS IF NONE
14129: LCT WC,WC LOAD COUNT FOR LOOP
14130: MOV XR,WB SAVE BCBLK PTR
14131: MOV BCBUF(XR),XR POINT TO BFBLK
14132: PLC XR GET SET TO LOAD CHARACTERS
14133: *
14134: * LOOP HERE STUFFING CHARACTERS IN OUTPUT STREAM
14135: *
14136: DMP31 LCH WA,(XR)+ GET NEXT CHARACTER
14137: JSR PRTCH STUFF IT
14138: BCT WC,DMP31 BRANCH FOR NEXT ONE
14139: MOV WB,XR RESTORE BCBLK POINTER
14140: *
14141: * MERGE TO STUFF CLOSING QUOTE MARK
14142: *
14143: DMP32 MOV =CH$DQ,WA STUFF QUOTE
14144: JSR PRTCF PRINT IT
14145: MOV (XR),WA GET FIRST WD FOR BLKLN
14146: BRN DMP15 MERGE TO GET NEXT BLOCK
14147: .FI
14148: ENP END PROCEDURE DUMPR
14149: EJC
14150: *
14151: * ERMSG -- PRINT ERROR CODE AND ERROR MESSAGE
14152: *
14153: * KVERT ERROR CODE
14154: * JSR ERMSG CALL TO PRINT MESSAGE
14155: * (XR,XL,WA,WB,WC,IA) DESTROYED
14156: *
14157: ERMSG PRC E,0 ENTRY POINT
14158: JSR PRTFH PRINT ERROR PTR OR BLANK LINE
14159: MOV KVERT,WA LOAD ERROR CODE
14160: MOV =ERMMS,XR POINT TO ERROR MESSAGE /ERROR/
14161: JSR PRTST PRINT IT
14162: JSR ERTEX GET ERROR MESSAGE TEXT
14163: ADD =THSND,WA BUMP ERROR CODE FOR PRINT
14164: MTI WA FAIL CODE IN INT ACC
14165: JSR PRTIN PRINT CODE (NOW HAVE ERROR1XXX)
14166: MOV PRBUF,XL POINT TO PRINT BUFFER
14167: PSC XL,=NUM05 POINT TO THE 1
14168: MOV =CH$BL,WA LOAD A BLANK
14169: SCH WA,(XL) STORE BLANK OVER 1 (ERROR XXX)
14170: CSC XL COMPLETE STORE CHARACTERS
14171: ZER XL CLEAR GARBAGE POINTER IN XL
14172: MOV XR,WA KEEP ERROR TEXT
14173: MOV =ERMNS,XR POINT TO / -- /
14174: JSR PRTST PRINT IT
14175: MOV WA,XR GET ERROR TEXT AGAIN
14176: JSR PRTFB PRINT ERROR MESSAGE TEXT
14177: EXI RETURN TO ERMSG CALLER
14178: ENP END PROCEDURE ERMSG
14179: EJC
14180: *
14181: * ERTEX -- GET ERROR MESSAGE TEXT
14182: *
14183: * (WA) ERROR CODE
14184: * JSR ERTEX CALL TO GET ERROR TEXT
14185: * (XR) PTR TO ERROR TEXT IN DYNAMIC
14186: * (R$ETX) COPY OF PTR TO ERROR TEXT
14187: * (XL,WC,IA) DESTROYED
14188: *
14189: ERTEX PRC E,0 ENTRY POINT
14190: MOV WA,ERTWA SAVE WA
14191: MOV WB,ERTWB SAVE WB
14192: BNZ EROSN,ERT03 SKIP IF SPECIAL EROSI RETURN
14193: JSR SYSEM GET FAILURE MESSAGE TEXT
14194: MOV XR,XL COPY POINTER TO IT
14195: MOV SCLEN(XR),WA GET LENGTH OF STRING
14196: BZE WA,ERT02 JUMP IF NULL
14197: ZER WB OFFSET OF ZERO
14198: JSR SBSTR COPY INTO DYNAMIC STORE
14199: MOV XR,R$ETX STORE FOR RELOCATION
14200: *
14201: * RETURN
14202: *
14203: ERT01 MOV ERTWB,WB RESTORE WB
14204: MOV ERTWA,WA RESTORE WA
14205: EXI RETURN TO CALLER
14206: *
14207: * RETURN ERRTEXT CONTENTS INSTEAD OF NULL
14208: *
14209: ERT02 MOV R$ETX,XR GET ERRTEXT
14210: BRN ERT01 RETURN
14211: *
14212: * SPECIAL CASE SET UP BY EROSI RETURN TO AVOID SYSEM CALL
14213: *
14214: ERT03 ZER EROSN CLEAR FLAG
14215: MOV R$ETX,XR GET ERROR MESSAGE TEXT
14216: BRN ERT01 RETURN WITHOUT MAKING SYSEM CALL
14217: ENP
14218: EJC
14219: *
14220: * EVALI -- EVALUATE INTEGER ARGUMENT
14221: *
14222: * EVALI IS USED BY PATTERN PRIMITIVES LEN,TAB,RTAB,POS,RPOS
14223: * WHEN THEIR ARGUMENT IS AN EXPRESSION VALUE.
14224: *
14225: * (XR) NODE POINTER
14226: * (WB) CURSOR
14227: * JSR EVALI CALL TO EVALUATE INTEGER
14228: * PPM LOC TRANSFER LOC FOR NON-INTEGER ARG
14229: * PPM LOC TRANSFER LOC FOR OUT OF RANGE ARG
14230: * PPM LOC TRANSFER LOC FOR EVALUATION FAILURE
14231: * (XR) PTR TO NODE WITH INTEGER ARGUMENT
14232: * (WC,XL,RA) DESTROYED
14233: *
14234: * ON RETURN, THE NODE POINTED TO HAS THE INTEGER ARGUMENT
14235: * IN PARM1 AND THE PROPER SUCCESSOR POINTER IN PTHEN.
14236: * THIS ALLOWS MERGING WITH THE NORMAL (INTEGER ARG) CASE.
14237: *
14238: EVALI PRC R,3 ENTRY POINT (RECURSIVE)
14239: JSR EVALP EVALUATE EXPRESSION
14240: PPM EVLI1 JUMP ON FAILURE
14241: MOV XL,-(XS) STACK RESULT FOR GTSMI
14242: MOV PTHEN(XR),XL LOAD SUCCESSOR POINTER
14243: JSR GTSMI CONVERT ARG TO SMALL INTEGER
14244: PPM EVLI2 JUMP IF NOT INTEGER
14245: PPM EVLI3 JUMP IF OUT OF RANGE
14246: MOV XR,EVLIV STORE RESULT IN SPECIAL DUMMY NODE
14247: MOV XL,EVLIS STORE SUCCESSOR POINTER
14248: MOV =EVLIN,XR POINT TO DUMMY NODE WITH RESULT
14249: EXI SUCCESSFUL RETURN
14250: *
14251: * HERE IF EVALUATION FAILS
14252: *
14253: EVLI1 EXI 3 TAKE FAILURE RETURN
14254: *
14255: * HERE IF ARGUMENT IS NOT INTEGER
14256: *
14257: EVLI2 EXI 1 TAKE NON-INTEGER ERROR EXIT
14258: *
14259: * HERE IF ARGUMENT IS OUT OF RANGE
14260: *
14261: EVLI3 EXI 2 TAKE OUT-OF-RANGE ERROR EXIT
14262: ENP END PROCEDURE EVALI
14263: EJC
14264: *
14265: * EVALP -- EVALUATE EXPRESSION DURING PATTERN MATCH
14266: *
14267: * EVALP IS USED TO EVALUATE AN EXPRESSION (BY VALUE) DURING
14268: * A PATTERN MATCH. THE EFFECT IS LIKE EVALX, BUT PATTERN
14269: * VARIABLES ARE STACKED AND RESTORED IF NECESSARY.
14270: *
14271: * EVALP ALSO DIFFERS FROM EVALX IN THAT IF THE RESULT IS
14272: * AN EXPRESSION IT IS REEVALUATED. THIS OCCURS REPEATEDLY.
14273: *
14274: * (XR) NODE POINTER
14275: * (WB) PATTERN MATCH CURSOR
14276: * JSR EVALP CALL TO EVALUATE EXPRESSION
14277: * PPM LOC TRANSFER LOC IF EVALUATION FAILS
14278: * (XL) RESULT
14279: * (WA) FIRST WORD OF RESULT BLOCK
14280: * (XR,WB) DESTROYED (FAILURE CASE ONLY)
14281: * (WC,RA) DESTROYED
14282: *
14283: * THE EXPRESSION POINTER IS STORED IN PARM1 OF THE NODE
14284: *
14285: * CONTROL RETURNS TO FAILP ON FAILURE OF EVALUATION
14286: *
14287: EVALP PRC R,1 ENTRY POINT (RECURSIVE)
14288: MOV PARM1(XR),XL LOAD EXPRESSION POINTER
14289: BEQ (XL),=B$EXL,EVLP1 JUMP IF EXBLK CASE
14290: *
14291: * HERE FOR CASE OF SEBLK
14292: *
14293: * WE CAN GIVE A FAST RETURN IF THE VALUE OF THE VRBLK IS
14294: * NOT AN EXPRESSION AND IS NOT TRAPPED.
14295: *
14296: MOV SEVAR(XL),XL LOAD VRBLK POINTER
14297: MOV VRVAL(XL),XL LOAD VALUE OF VRBLK
14298: MOV (XL),WA LOAD FIRST WORD OF VALUE
14299: BHI WA,=B$T$$,EVLP3 JUMP IF NOT SEBLK, TRBLK OR EXBLK
14300: *
14301: * HERE FOR EXBLK OR SEBLK WITH EXPR VALUE OR TRAPPED VALUE
14302: *
14303: EVLP1 MOV XR,-(XS) STACK NODE POINTER
14304: MOV WB,-(XS) STACK CURSOR
14305: MOV R$PMS,-(XS) STACK SUBJECT STRING POINTER
14306: MOV PMSSL,-(XS) STACK SUBJECT STRING LENGTH
14307: MOV PMDFL,-(XS) STACK DOT FLAG
14308: MOV PMHBS,-(XS) STACK HISTORY STACK BASE POINTER
14309: MOV PARM1(XR),XR LOAD EXPRESSION POINTER
14310: EJC
14311: *
14312: * EVALP (CONTINUED)
14313: *
14314: * LOOP BACK HERE TO REEVALUATE EXPRESSION RESULT
14315: *
14316: EVLP2 ZER WB SET FLAG FOR BY VALUE
14317: JSR EVALX EVALUATE EXPRESSION
14318: PPM EVLP4 JUMP ON FAILURE
14319: MOV (XR),WA ELSE LOAD FIRST WORD OF VALUE
14320: BLO WA,=B$E$$,EVLP2 LOOP BACK TO REEVALUATE EXPRESSION
14321: *
14322: * HERE TO RESTORE PATTERN VALUES AFTER SUCCESSFUL EVAL
14323: *
14324: MOV XR,XL COPY RESULT POINTER
14325: MOV (XS)+,PMHBS RESTORE HISTORY STACK BASE POINTER
14326: MOV (XS)+,PMDFL RESTORE DOT FLAG
14327: MOV (XS)+,PMSSL RESTORE SUBJECT STRING LENGTH
14328: MOV (XS)+,R$PMS RESTORE SUBJECT STRING POINTER
14329: MOV (XS)+,WB RESTORE CURSOR
14330: MOV (XS)+,XR RESTORE NODE POINTER
14331: *
14332: * COMMON EXIT POINT
14333: *
14334: EVLP3 EXI RETURN TO EVALP CALLER
14335: *
14336: * HERE FOR FAILURE DURING EVALUATION
14337: *
14338: EVLP4 MOV (XS)+,PMHBS RESTORE HISTORY STACK BASE POINTER
14339: MOV (XS)+,PMDFL RESTORE DOT FLAG
14340: MOV (XS)+,PMSSL RESTORE SUBJECT STRING LENGTH
14341: MOV (XS)+,R$PMS RESTORE SUBJECT STRING POINTER
14342: ADD *NUM02,XS REMOVE NODE PTR, CURSOR
14343: EXI 1 TAKE FAILURE EXIT
14344: ENP END PROCEDURE EVALP
14345: EJC
14346: *
14347: * EVALS -- EVALUATE STRING ARGUMENT
14348: *
14349: * EVALS IS USED BY SPAN, ANY, NOTANY, BREAK, BREAKX WHEN
14350: * THEY ARE PASSED AN EXPRESSION ARGUMENT.
14351: *
14352: * (XR) NODE POINTER
14353: * (WA) APPROPRIATE MULTI CHARACTER PCODE
14354: * (WB) CURSOR
14355: * JSR EVALS CALL TO EVALUATE STRING
14356: * PPM LOC TRANSFER LOC FOR NON-STRING ARG
14357: * PPM LOC TRANSFER LOC FOR EVALUATION FAILURE
14358: * (XL) PCODE OF NEW NODE (ENTRY WA)
14359: * (XR) PTR TO NODE WITH PARMS SET
14360: * (WA,WC,RA) DESTROYED
14361: *
14362: * ON RETURN, THE NODE POINTED TO HAS A CHARACTER TABLE
14363: * POINTER IN PARM1 AND A BIT MASK IN PARM2. THE PROPER
14364: * SUCCESSOR IS STORED IN PTHEN OF THIS NODE. THUS IT IS
14365: * OK FOR MERGING WITH THE NORMAL (MULTI-CHAR STRING) CASE.
14366: * THIS IS DONE BY THE USUAL INDIRECT BRANCH THROUGH THE
14367: * PCODE PASSED IN WA.
14368: *
14369: EVALS PRC R,2 ENTRY POINT (RECURSIVE)
14370: MOV WA,-(XS) KEEP PCODE
14371: JSR EVALP EVALUATE EXPRESSION
14372: PPM EVLS1 JUMP IF EVALUATION FAILS
14373: MOV (XS)+,WA RECOVER PCODE
14374: MOV PTHEN(XR),-(XS) SAVE SUCCESSOR POINTER
14375: MOV WB,-(XS) SAVE CURSOR
14376: MOV XL,-(XS) STACK RESULT PTR FOR PATST
14377: ZER WB DUMMY PCODE FOR ONE CHAR STRING
14378: ZER WC DUMMY PCODE FOR EXPRESSION ARG
14379: MOV WA,XL APPROPRIATE PCODE FOR OUR USE
14380: JSR PATST CALL ROUTINE TO BUILD NODE
14381: PPM EVLS2 JUMP IF NOT STRING
14382: MOV (XS)+,WB RESTORE CURSOR
14383: MOV (XS)+,PTHEN(XR) STORE SUCCESSOR POINTER
14384: MOV (XR),XL GET PCODE
14385: EXI TAKE SUCCESS RETURN
14386: *
14387: * HERE IF EVALUATION FAILS
14388: *
14389: EVLS1 MOV (XS)+,WA POP STACK
14390: EXI 2 TAKE FAILURE RETURN
14391: *
14392: * HERE IF ARGUMENT IS NOT STRING
14393: *
14394: EVLS2 ADD *NUM02,XS POP SUCCESSOR AND CURSOR
14395: EXI 1 TAKE NON-STRING ERROR EXIT
14396: ENP END PROCEDURE EVALS
14397: EJC
14398: *
14399: * EVALX -- EVALUATE EXPRESSION
14400: *
14401: * EVALX IS CALLED TO EVALUATE AN EXPRESSION
14402: *
14403: * (XR) POINTER TO EXBLK OR SEBLK
14404: * (WB) 0 IF BY VALUE, 1 IF BY NAME
14405: * JSR EVALX CALL TO EVALUATE EXPRESSION
14406: * PPM LOC TRANSFER LOC IF EVALUATION FAILS
14407: * (XR) RESULT IF CALLED BY VALUE
14408: * (XL,WA) RESULT NAME BASE,OFFSET IF BY NAME
14409: * (XR) DESTROYED (NAME CASE ONLY)
14410: * (XL,WA) DESTROYED (VALUE CASE ONLY)
14411: * (WB,WC,RA) DESTROYED
14412: *
14413: EVALX PRC R,1 ENTRY POINT, RECURSIVE
14414: BEQ (XR),=B$EXL,EVLX2 JUMP IF EXBLK CASE
14415: *
14416: * HERE FOR SEBLK
14417: *
14418: MOV SEVAR(XR),XL LOAD VRBLK POINTER (NAME BASE)
14419: MOV *VRVAL,WA SET NAME OFFSET
14420: BNZ WB,EVLX1 JUMP IF CALLED BY NAME
14421: JSR ACESS CALL ROUTINE TO ACCESS VALUE
14422: PPM EVLX9 JUMP IF FAILURE ON ACCESS
14423: *
14424: * MERGE HERE TO EXIT FOR SEBLK CASE
14425: *
14426: EVLX1 EXI RETURN TO EVALX CALLER
14427: EJC
14428: *
14429: * EVALX (CONTINUED)
14430: *
14431: * HERE FOR FULL EXPRESSION (EXBLK) CASE
14432: *
14433: * IF AN ERROR OCCURS IN THE EXPRESSION CODE AT EXECUTION
14434: * TIME, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
14435: * WITHOUT RETURNING TO THIS ROUTINE.
14436: * THE FOLLOWING ENTRIES ARE MADE ON THE STACK BEFORE
14437: * GIVING CONTROL TO THE EXPRESSION CODE
14438: *
14439: * EVALX RETURN POINT
14440: * SAVED VALUE OF R$COD
14441: * CODE POINTER (-R$COD)
14442: * SAVED VALUE OF FLPTR
14443: * 0 IF BY VALUE, 1 IF BY NAME
14444: * FLPTR --------------- *EXFLC, FAIL OFFSET IN EXBLK
14445: *
14446: EVLX2 SCP WC GET CODE POINTER
14447: MOV R$COD,WA LOAD CODE BLOCK POINTER
14448: SUB WA,WC GET CODE POINTER AS OFFSET
14449: MOV WA,-(XS) STACK OLD CODE BLOCK POINTER
14450: MOV WC,-(XS) STACK RELATIVE CODE OFFSET
14451: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER
14452: MOV WB,-(XS) STACK NAME/VALUE INDICATOR
14453: MOV *EXFLC,-(XS) STACK NEW FAIL OFFSET
14454: MOV FLPTR,GTCEF KEEP IN CASE OF ERROR
14455: MOV R$COD,R$GTC KEEP CODE BLOCK POINTER SIMILARLY
14456: MOV XS,FLPTR SET NEW FAILURE POINTER
14457: MOV XR,R$COD SET NEW CODE BLOCK POINTER
14458: MOV KVSTN,EXSTM(XR) REMEMBER STMNT NUMBER
14459: ADD *EXCOD,XR POINT TO FIRST CODE WORD
14460: LCP XR SET CODE POINTER
14461: BNE STAGE,=STGXT,EXITS JUMP IF NOT EXECUTION TIME
14462: MOV =STGEE,STAGE EVALUATING EXPRESSION
14463: BRN EXITS JUMP TO EXECUTE FIRST CODE WORD
14464: EJC
14465: *
14466: * EVALX (CONTINUED)
14467: *
14468: * COME HERE IF SUCCESSFUL RETURN BY VALUE (SEE O$RVL)
14469: *
14470: EVLXV MOV (XS)+,XR LOAD VALUE
14471: BZE 1(XS),EVLX5 JUMP IF CALLED BY VALUE
14472: ERB 218,EXPRESSION EVALUATED BY NAME RETURNED VALUE
14473: *
14474: * HERE FOR EXPRESSION RETURNING BY NAME (SEE O$RNM)
14475: *
14476: EVLXN MOV (XS)+,WA LOAD NAME OFFSET
14477: MOV (XS)+,XL LOAD NAME BASE
14478: BNZ 1(XS),EVLX5 JUMP IF CALLED BY NAME
14479: JSR ACESS ELSE ACCESS VALUE FIRST
14480: PPM EVLXF JUMP IF FAILURE DURING ACCESS
14481: *
14482: * HERE AFTER LOADING CORRECT RESULT INTO XR OR XL,WA
14483: *
14484: EVLX5 ZER WB NOTE SUCCESSFUL
14485: BRN EVLX7 MERGE
14486: *
14487: * HERE FOR FAILURE IN EXPRESSION EVALUATION (SEE O$FEX)
14488: *
14489: EVLXF MNZ WB NOTE UNSUCCESSFUL
14490: *
14491: * RESTORE ENVIRONMENT
14492: *
14493: EVLX7 BNE STAGE,=STGEE,EVLX8 SKIP IF WAS NOT PREVIOUSLY XT
14494: MOV =STGXT,STAGE EXECUTE TIME
14495: *
14496: * MERGE WITH STAGE SET UP
14497: *
14498: EVLX8 ADD *NUM02,XS POP NAME/VALUE INDICATOR, *EXFAL
14499: MOV (XS)+,FLPTR RESTORE OLD FAILURE POINTER
14500: MOV (XS)+,WC LOAD CODE OFFSET
14501: ADD (XS),WC MAKE CODE POINTER ABSOLUTE
14502: MOV (XS)+,R$COD RESTORE OLD CODE BLOCK POINTER
14503: LCP WC RESTORE OLD CODE POINTER
14504: BZE WB,EVLX1 JUMP FOR SUCCESSFUL RETURN
14505: *
14506: * MERGE HERE FOR FAILURE IN SEBLK CASE
14507: *
14508: EVLX9 EXI 1 TAKE FAILURE EXIT
14509: ENP END OF PROCEDURE EVALX
14510: EJC
14511: *
14512: * EXBLD -- BUILD EXBLK
14513: *
14514: * EXBLD IS USED TO BUILD AN EXPRESSION BLOCK FROM THE
14515: * CODE COMPILED MOST RECENTLY IN THE CURRENT CCBLK.
14516: *
14517: * (XL) OFFSET IN CCBLK TO START OF CODE
14518: * (WB) INTEGER IN RANGE 0 LE N LE MXLEN
14519: * JSR EXBLD CALL TO BUILD EXBLK
14520: * (XR) PTR TO CONSTRUCTED EXBLK
14521: * (WA,WB,XL) DESTROYED
14522: *
14523: EXBLD PRC E,0 ENTRY POINT
14524: MOV XL,WA COPY OFFSET TO START OF CODE
14525: SUB *EXCOD,WA CALC REDUCTION IN OFFSET IN EXBLK
14526: MOV WA,-(XS) STACK FOR LATER
14527: MOV CWCOF,WA LOAD FINAL OFFSET
14528: SUB XL,WA COMPUTE LENGTH OF CODE
14529: ADD *EXSI$,WA ADD SPACE FOR STANDARD FIELDS
14530: JSR ALLOC ALLOCATE SPACE FOR EXBLK
14531: MOV XR,-(XS) SAVE POINTER TO EXBLK
14532: MOV =B$EXL,EXTYP(XR) STORE TYPE WORD
14533: ZER EXSTM(XR) ZEROISE STMNT NUMBER FIELD
14534: MOV WA,EXLEN(XR) STORE LENGTH
14535: MOV =OFEX$,EXFLC(XR) STORE FAILURE WORD
14536: ADD *EXSI$,XR SET XR FOR SYSMW
14537: MOV XL,CWCOF RESET OFFSET TO START OF CODE
14538: ADD R$CCB,XL POINT TO START OF CODE
14539: SUB *EXSI$,WA LENGTH OF CODE TO MOVE
14540: MOV WA,-(XS) STACK LENGTH OF CODE
14541: MVW MOVE CODE TO EXBLK
14542: MOV (XS)+,WA GET LENGTH OF CODE
14543: BTW WA CONVERT BAU COUNT TO WORD COUNT
14544: LCT WA,WA PREPARE COUNTER FOR LOOP
14545: MOV (XS),XL COPY EXBLK PTR, DONT UNSTACK
14546: ADD *EXCOD,XL POINT TO CODE ITSELF
14547: MOV 1(XS),WB GET REDUCTION IN OFFSET
14548: *
14549: * THIS LOOP SEARCHES FOR NEGATION AND SELECTION CODE SO
14550: * THAT THE OFFSETS COMPUTED WHILST CODE WAS IN CODE BLOCK
14551: * CAN BE TRANSFORMED TO REDUCED VALUES APPLICABLE IN AN
14552: * EXBLK.
14553: *
14554: EXBL1 MOV (XL)+,XR GET NEXT CODE WORD
14555: BEQ XR,=OSLA$,EXBL3 JUMP IF SELECTION FOUND
14556: BEQ XR,=ONTA$,EXBL3 JUMP IF NEGATION FOUND
14557: BCT WA,EXBL1 LOOP TO END OF CODE
14558: *
14559: * NO SELECTION FOUND OR MERGE TO EXIT ON TERMINATION
14560: *
14561: EXBL2 MOV (XS)+,XR POP EXBLK PTR INTO XR
14562: MOV (XS)+,XL POP REDUCTION CONSTANT
14563: EXI RETURN TO CALLER
14564: EJC
14565: *
14566: * EXBLD (CONTINUED)
14567: *
14568: * SELECTION OR NEGATION FOUND
14569: * REDUCE THE OFFSETS AS NEEDED. OFFSETS OCCUR IN WORDS
14570: * FOLLOWING CODE WORDS -
14571: * =ONTA$, =OSLA$, =OSLB$, =OSLC$
14572: *
14573: EXBL3 SUB WB,(XL)+ ADJUST OFFSET
14574: BCT WA,EXBL4 DECREMENT COUNT
14575: *
14576: EXBL4 BCT WA,EXBL5 DECREMENT COUNT
14577: *
14578: * CONTINUE SEARCH FOR MORE OFFSETS
14579: *
14580: EXBL5 MOV (XL)+,XR GET NEXT CODE WORD
14581: BEQ XR,=OSLA$,EXBL3 JUMP IF OFFSET FOUND
14582: BEQ XR,=OSLB$,EXBL3 JUMP IF OFFSET FOUND
14583: BEQ XR,=OSLC$,EXBL3 JUMP IF OFFSET FOUND
14584: BEQ XR,=ONTA$,EXBL3 JUMP IF OFFSET FOUND
14585: BCT WA,EXBL5 LOOP
14586: BRN EXBL2 MERGE TO RETURN
14587: ENP END PROCEDURE EXBLD
14588: EJC
14589: *
14590: * EXPAN -- ANALYZE EXPRESSION
14591: *
14592: * THE EXPRESSION ANALYZER (EXPAN) PROCEDURE IS USED TO SCAN
14593: * AN EXPRESSION AND CONVERT IT INTO A TREE REPRESENTATION.
14594: * SEE DESCRIPTIONS OF CMBLK, CUBLK, CBBLK IN THE STRUCTURES
14595: * SECTION FOR DETAILED FORMAT OF TREE BLOCKS.
14596: *
14597: * THE ANALYZER USES A SIMPLE PRECEDENCE SCHEME IN WHICH
14598: * OPERANDS AND OPERATORS ARE PLACED ON A SINGLE STACK
14599: * AND CONDENSATIONS ARE MADE WHEN LOW PRECEDENCE OPERATORS
14600: * ARE STACKED AFTER A HIGHER PRECEDENCE OPERATOR. A GLOBAL
14601: * VARIABLE (IN WB) KEEPS TRACK OF THE LEVEL AS FOLLOWS.
14602: *
14603: * 0 SCANNING OUTER LEVEL OF STATEMENT OR EXPRESSION
14604: * 1 SCANNING OUTER LEVEL OF NORMAL GOTO
14605: * 2 SCANNING OUTER LEVEL OF DIRECT GOTO
14606: * 3 SCANNING INSIDE ARRAY BRACKETS
14607: * 4 SCANNING INSIDE GROUPING PARENTHESES
14608: * 5 SCANNING INSIDE FUNCTION PARENTHESES
14609: *
14610: * THIS VARIABLE IS SAVED ON THE STACK ON ENCOUNTERING A
14611: * GROUPING AND RESTORED AT THE END OF THE GROUPING.
14612: *
14613: * ANOTHER GLOBAL VARIABLE (IN WC) COUNTS THE NUMBER OF
14614: * ITEMS AT ONE GROUPING LEVEL AND IS INCREMENTED FOR EACH
14615: * COMMA ENCOUNTERED. IT IS STACKED WITH THE LEVEL INDICATOR
14616: *
14617: * THE SCAN IS CONTROLLED BY A THREE STATE FINITE MACHINE.
14618: * A GLOBAL VARIABLE STORED IN WA IS THE CURRENT STATE.
14619: *
14620: * WA=0 NOTHING SCANNED AT THIS LEVEL
14621: * WA=1 OPERAND EXPECTED
14622: * WA=2 OPERATOR EXPECTED
14623: *
14624: * (WB) CALL TYPE (SEE BELOW)
14625: * JSR EXPAN CALL TO ANALYZE EXPRESSION
14626: * (XR) POINTER TO RESULTING TREE
14627: * (XL,WA,WB,WC,RA) DESTROYED
14628: *
14629: * THE ENTRY VALUE OF WB INDICATES THE CALL TYPE AS FOLLOWS.
14630: *
14631: * 0 SCANNING EITHER THE MAIN BODY OF A STATEMENT OR THE
14632: * TEXT OF AN EXPRESSION (FROM EVAL CALL). VALID
14633: * TERMINATORS ARE COLON, SEMICOLON. THE RESCAN FLAG IS
14634: * SET TO RETURN THE TERMINATOR ON THE NEXT SCANE CALL.
14635: *
14636: * 1 SCANNING A NORMAL GOTO. THE ONLY VALID
14637: * TERMINATOR IS A RIGHT PAREN.
14638: *
14639: * 2 SCANNING A DIRECT GOTO. THE ONLY VALID
14640: * TERMINATOR IS A RIGHT BRACKET.
14641: EJC
14642: *
14643: * EXPAN (CONTINUED)
14644: *
14645: * ENTRY POINT
14646: *
14647: EXPAN PRC E,0 ENTRY POINT
14648: ZER -(XS) SET TOP OF STACK INDICATOR
14649: ZER WA SET INITIAL STATE TO ZERO
14650: ZER WC ZERO COUNTER VALUE
14651: *
14652: * LOOP HERE FOR SUCCESSIVE ENTRIES
14653: *
14654: EXP01 JSR SCANE SCAN NEXT ELEMENT
14655: ADD WA,XL ADD STATE TO SYNTAX CODE
14656: BSW XL,T$NES SWITCH ON ELEMENT TYPE/STATE
14657: IFF T$VA0,EXP03 VARIABLE, S=0
14658: IFF T$VA1,EXP03 VARIABLE, STATE ONE
14659: IFF T$VA2,EXP04 VARIABLE, S=2
14660: IFF T$CO0,EXP03 CONSTANT, S=0
14661: IFF T$CO1,EXP03 CONSTANT, S=1
14662: IFF T$CO2,EXP04 CONSTANT, S=2
14663: IFF T$LP0,EXP06 LEFT PAREN, S=0
14664: IFF T$LP1,EXP06 LEFT PAREN, S=1
14665: IFF T$LP2,EXP04 LEFT PAREN, S=2
14666: IFF T$FN0,EXP10 FUNCTION, S=0
14667: IFF T$FN1,EXP10 FUNCTION, S=1
14668: IFF T$FN2,EXP04 FUNCTION, S=2
14669: IFF T$RP0,EXP02 RIGHT PAREN, S=0
14670: IFF T$RP1,EXP05 RIGHT PAREN, S=1
14671: IFF T$RP2,EXP12 RIGHT PAREN, S=2
14672: IFF T$LB0,EXP08 LEFT BRKT, S=0
14673: IFF T$LB1,EXP08 LEFT BRKT, S=1
14674: IFF T$LB2,EXP09 LEFT BRKT, S=2
14675: IFF T$RB0,EXP02 RIGHT BRKT, S=0
14676: IFF T$RB1,EXP05 RIGHT BRKT, S=1
14677: IFF T$RB2,EXP18 RIGHT BRKT, S=2
14678: IFF T$UO0,EXP27 UNOP, S=0
14679: IFF T$UO1,EXP27 UNOP, S=1
14680: IFF T$UO2,EXP04 UNOP, S=2
14681: IFF T$BO0,EXP05 BINOP, S=0
14682: IFF T$BO1,EXP05 BINOP, S=1
14683: IFF T$BO2,EXP26 BINOP, S=2
14684: IFF T$CM0,EXP02 COMMA, S=0
14685: IFF T$CM1,EXP05 COMMA, S=1
14686: IFF T$CM2,EXP11 COMMA, S=2
14687: IFF T$CL0,EXP02 COLON, S=0
14688: IFF T$CL1,EXP05 COLON, S=1
14689: IFF T$CL2,EXP19 COLON, S=2
14690: IFF T$SM0,EXP02 SEMICOLON, S=0
14691: IFF T$SM1,EXP05 SEMICOLON, S=1
14692: IFF T$SM2,EXP19 SEMICOLON, S=2
14693: ESW END SWITCH ON ELEMENT TYPE/STATE
14694: EJC
14695: *
14696: * EXPAN (CONTINUED)
14697: *
14698: * HERE FOR RBR,RPR,COL,SMC,CMA IN STATE 0
14699: *
14700: * SET TO RESCAN THE TERMINATOR ENCOUNTERED AND CREATE
14701: * A NULL CONSTANT (CASE OF OMITTED NULL)
14702: *
14703: EXP02 MNZ SCNRS SET TO RESCAN ELEMENT
14704: MOV =NULLS,XR POINT TO NULL, MERGE
14705: *
14706: * HERE FOR VAR OR CON IN STATES 0,1
14707: *
14708: * STACK THE VARIABLE/CONSTANT AND SET STATE=2
14709: *
14710: EXP03 MOV XR,-(XS) STACK POINTER TO OPERAND
14711: MOV =NUM02,WA SET STATE 2
14712: BRN EXP01 JUMP FOR NEXT ELEMENT
14713: *
14714: * HERE FOR VAR,CON,LPR,FNC,UOP IN STATE 2
14715: *
14716: * WE RESCAN THE ELEMENT AND CREATE A CONCATENATION OPERATOR
14717: * THIS IS THE CASE OF THE BLANK CONCATENATION OPERATOR.
14718: *
14719: EXP04 MNZ SCNRS SET TO RESCAN ELEMENT
14720: MOV =OPDVC,XR POINT TO CONCAT OPERATOR DV
14721: BZE WB,EXP4A OK IF AT TOP LEVEL
14722: MOV =OPDVP,XR ELSE POINT TO UNMISTAKEABLE CONCAT
14723: *
14724: * MERGE WITH CORRECT CONCATENATION DVBLK IN XR
14725: *
14726: EXP4A BNZ SCNBL,EXP26 MERGE BOP IF BLANKS, ELSE ERROR
14727: DCV SCNSE ADJUST START OF ELEMENT LOCATION
14728: ERB 219,SYNTAX ERROR. MISSING OPERATOR
14729: *
14730: * HERE FOR CMA,RPR,RBR,COL,SMC,BOP(S=1) BOP(S=0)
14731: *
14732: * THIS IS AN ERRONOUS CONTRUCTION
14733: *
14734: EXP05 DCV SCNSE ADJUST START OF ELEMENT LOCATION
14735: ERB 220,SYNTAX ERROR. MISSING OPERAND
14736: *
14737: * HERE FOR LPR (S=0,1)
14738: *
14739: EXP06 MOV =NUM04,XL SET NEW LEVEL INDICATOR
14740: ZER XR SET ZERO VALUE FOR CMOPN
14741: EJC
14742: *
14743: * EXPAN (CONTINUED)
14744: *
14745: * MERGE HERE TO STORE OLD LEVEL ON STACK AND START NEW ONE
14746: *
14747: EXP07 MOV XR,-(XS) STACK CMOPN VALUE
14748: MOV WC,-(XS) STACK OLD COUNTER
14749: MOV WB,-(XS) STACK OLD LEVEL INDICATOR
14750: CHK CHECK FOR STACK OVERFLOW
14751: ZER WA SET NEW STATE TO ZERO
14752: MOV XL,WB SET NEW LEVEL INDICATOR
14753: MOV =NUM01,WC INITIALIZE NEW COUNTER
14754: BRN EXP01 JUMP TO SCAN NEXT ELEMENT
14755: *
14756: * HERE FOR LBR (S=0,1)
14757: *
14758: * THIS IS AN ILLEGAL USE OF LEFT BRACKET
14759: *
14760: EXP08 ERB 221,SYNTAX ERROR. INVALID USE OF LEFT BRACKET
14761: *
14762: * HERE FOR LBR (S=2)
14763: *
14764: * SET NEW LEVEL AND START TO SCAN SUBSCRIPTS
14765: *
14766: EXP09 MOV (XS)+,XR LOAD ARRAY PTR FOR CMOPN
14767: MOV =NUM03,XL SET NEW LEVEL INDICATOR
14768: BRN EXP07 JUMP TO STACK OLD AND START NEW
14769: *
14770: * HERE FOR FNC (S=0,1)
14771: *
14772: * STACK OLD LEVEL AND START TO SCAN ARGUMENTS
14773: *
14774: EXP10 MOV =NUM05,XL SET NEW LEV INDIC (XR=VRBLK=CMOPN)
14775: BRN EXP07 JUMP TO STACK OLD AND START NEW
14776: *
14777: * HERE FOR CMA (S=2)
14778: *
14779: * INCREMENT ARGUMENT COUNT AND CONTINUE
14780: *
14781: EXP11 ICV WC INCREMENT COUNTER
14782: JSR EXPDM DUMP OPERATORS AT THIS LEVEL
14783: ZER -(XS) SET NEW LEVEL FOR PARAMETER
14784: ZER WA SET NEW STATE
14785: BGT WB,=NUM02,EXP01 LOOP BACK UNLESS OUTER LEVEL
14786: ERB 222,SYNTAX ERROR. INVALID USE OF COMMA
14787: EJC
14788: *
14789: * EXPAN (CONTINUED)
14790: *
14791: * HERE FOR RPR (S=2)
14792: *
14793: * AT OUTER LEVEL IN A NORMAL GOTO THIS IS A TERMINATOR
14794: * OTHERWISE IT MUST TERMINATE A FUNCTION OR GROUPING
14795: *
14796: EXP12 BEQ WB,=NUM01,EXP20 END OF NORMAL GOTO
14797: BEQ WB,=NUM05,EXP13 END OF FUNCTION ARGUMENTS
14798: BEQ WB,=NUM04,EXP14 END OF GROUPING / SELECTION
14799: ERB 223,SYNTAX ERROR. UNBALANCED RIGHT PARENTHESIS
14800: *
14801: * HERE AT END OF FUNCTION ARGUMENTS
14802: *
14803: EXP13 MOV =C$FNC,XL SET CMTYP VALUE FOR FUNCTION
14804: BRN EXP15 JUMP TO BUILD CMBLK
14805: *
14806: * HERE FOR END OF GROUPING
14807: *
14808: EXP14 BEQ WC,=NUM01,EXP17 JUMP IF END OF GROUPING
14809: MOV =C$SEL,XL ELSE SET CMTYP FOR SELECTION
14810: *
14811: * MERGE HERE TO BUILD CMBLK FOR LEVEL JUST SCANNED AND
14812: * TO POP UP TO THE PREVIOUS SCAN LEVEL BEFORE CONTINUING.
14813: *
14814: EXP15 JSR EXPDM DUMP OPERATORS AT THIS LEVEL
14815: MOV WC,WA COPY COUNT
14816: ADD =CMVLS,WA ADD FOR STANDARD FIELDS AT START
14817: WTB WA CONVERT LENGTH TO BAUS
14818: JSR ALLOC ALLOCATE SPACE FOR CMBLK
14819: MOV =B$CMT,(XR) STORE TYPE CODE FOR CMBLK
14820: MOV XL,CMTYP(XR) STORE CMBLK NODE TYPE INDICATOR
14821: MOV WA,CMLEN(XR) STORE LENGTH
14822: ADD WA,XR POINT PAST END OF BLOCK
14823: LCT WC,WC SET LOOP COUNTER
14824: *
14825: * LOOP TO MOVE REMAINING WORDS TO CMBLK
14826: *
14827: EXP16 MOV (XS)+,-(XR) MOVE ONE OPERAND PTR FROM STACK
14828: MOV (XS)+,WB POP TO OLD LEVEL INDICATOR
14829: BCT WC,EXP16 LOOP TILL ALL MOVED
14830: EJC
14831: *
14832: * EXPAN (CONTINUED)
14833: *
14834: * COMPLETE CMBLK AND STACK POINTER TO IT ON STACK
14835: *
14836: SUB *CMVLS,XR POINT BACK TO START OF BLOCK
14837: MOV (XS)+,WC RESTORE OLD COUNTER
14838: MOV (XS),CMOPN(XR) STORE OPERAND PTR IN CMBLK
14839: MOV XR,(XS) STACK CMBLK POINTER
14840: MOV =NUM02,WA SET NEW STATE
14841: BRN EXP01 BACK FOR NEXT ELEMENT
14842: *
14843: * HERE AT END OF A PARENTHESIZED EXPRESSION
14844: *
14845: EXP17 JSR EXPDM DUMP OPERATORS AT THIS LEVEL
14846: MOV (XS)+,XR RESTORE XR
14847: MOV (XS)+,WB RESTORE OUTER LEVEL
14848: MOV (XS)+,WC RESTORE OUTER COUNT
14849: MOV XR,(XS) STORE OPND OVER UNUSED CMOPN VAL
14850: MOV =NUM02,WA SET NEW STATE
14851: BRN EXP01 BACK FOR NEXT ELE8ENT
14852: *
14853: * HERE FOR RBR (S=2)
14854: *
14855: * AT OUTER LEVEL IN A DIRECT GOTO, THIS IS A TERMINATOR.
14856: * OTHERWISE IT MUST TERMINATE A SUBSCRIPT LIST.
14857: *
14858: EXP18 MOV =C$ARR,XL SET CMTYP FOR ARRAY REFERENCE
14859: BEQ WB,=NUM03,EXP15 JUMP TO BUILD CMBLK IF END ARRAYREF
14860: BEQ WB,=NUM02,EXP20 JUMP IF END OF DIRECT GOTO
14861: ERB 224,SYNTAX ERROR. UNBALANCED RIGHT BRACKET
14862: EJC
14863: *
14864: * EXPAN (CONTINUED)
14865: *
14866: * HERE FOR COL,SMC (S=2)
14867: *
14868: * ERROR UNLESS TERMINATING STATEMENT BODY AT OUTER LEVEL
14869: *
14870: EXP19 MNZ SCNRS RESCAN TERMINATOR
14871: MOV WB,XL COPY LEVEL INDICATOR
14872: BSW XL,6 SWITCH ON LEVEL INDICATOR
14873: IFF 0,EXP20 NORMAL OUTER LEVEL
14874: IFF 1,EXP22 FAIL IF NORMAL GOTO
14875: IFF 2,EXP23 FAIL IF DIRECT GOTO
14876: IFF 3,EXP24 FAIL ARRAY BRACKETS
14877: IFF 4,EXP21 FAIL IF IN GROUPING
14878: IFF 5,EXP21 FAIL FUNCTION ARGS
14879: ESW END SWITCH ON LEVEL
14880: *
14881: * HERE AT NORMAL END OF EXPRESSION
14882: *
14883: EXP20 JSR EXPDM DUMP REMAINING OPERATORS
14884: MOV (XS)+,XR LOAD TREE POINTER
14885: ICA XS POP OFF BOTTOM OF STACK MARKER
14886: EXI RETURN TO EXPAN CALLER
14887: *
14888: * MISSING RIGHT PAREN
14889: *
14890: EXP21 ERB 225,SYNTAX ERROR. MISSING RIGHT PAREN
14891: *
14892: * MISSING RIGHT PAREN IN GOTO FIELD
14893: *
14894: EXP22 ERB 226,SYNTAX ERROR. RIGHT PAREN MISSING FROM GOTO
14895: *
14896: * MISSING BRACKET IN GOTO
14897: *
14898: EXP23 ERB 227,SYNTAX ERROR. RIGHT BRACKET MISSING FROM GOTO
14899: *
14900: * MISSING ARRAY BRACKET
14901: *
14902: EXP24 ERB 228,SYNTAX ERROR. MISSING RIGHT ARRAY BRACKET
14903: EJC
14904: *
14905: * EXPAN (CONTINUED)
14906: *
14907: * LOOP HERE WHEN AN OPERATOR CAUSES AN OPERATOR DUMP
14908: *
14909: EXP25 MOV XR,EXPSV
14910: JSR EXPOP POP ONE OPERATOR
14911: MOV EXPSV,XR RESTORE OP DV POINTER AND MERGE
14912: *
14913: * HERE FOR BOP (S=2)
14914: *
14915: * REMOVE OPERATORS (CONDENSE) FROM STACK UNTIL NO MORE
14916: * LEFT AT THIS LEVEL OR TOP ONE HAS LOWER PRECEDENCE.
14917: * LOOP HERE TILL THIS CONDITION IS MET.
14918: *
14919: EXP26 MOV 1(XS),XL LOAD OPERATOR DVPTR FROM STACK
14920: BLE XL,=NUM05,EXP27 JUMP IF BOTTOM OF STACK LEVEL
14921: BLT DVRPR(XR),DVLPR(XL),EXP25 ELSE POP IF NEW PREC IS LO
14922: *
14923: * HERE FOR UOP (S=0,1)
14924: *
14925: * BINARY OPERATOR MERGES AFTER PRECEDENCE CHECK
14926: *
14927: * THE OPERATOR DV IS STORED ON THE STACK AND THE SCAN
14928: * CONTINUES AFTER SETTING THE SCAN STATE TO ONE.
14929: *
14930: EXP27 MOV XR,-(XS) STACK OPERATOR DVPTR ON STACK
14931: CHK CHECK FOR STACK OVERFLOW
14932: MOV =NUM01,WA SET NEW STATE
14933: BNE XR,=OPDVS,EXP01 BACK FOR NEXT ELEMENT UNLESS =
14934: *
14935: * HERE FOR SPECIAL CASE OF BINARY =. THE SYNTAX ALLOWS A
14936: * NULL RIGHT ARGUMENT FOR THIS OPERATOR TO BE LEFT
14937: * OUT. ACCORDINGLY WE RESET TO STATE ZERO TO GET PROPER
14938: * ACTION ON A TERMINATOR (SUPPLY A NULL CONSTANT).
14939: *
14940: ZER WA SET STATE ZERO
14941: BRN EXP01 JUMP FOR NEXT ELEMENT
14942: ENP END PROCEDURE EXPAN
14943: EJC
14944: *
14945: * EXPAP -- TEST FOR PATTERN MATCH TREE
14946: *
14947: * EXPAP IS PASSED AN EXPRESSION TREE TO DETERMINE IF IT
14948: * IS A PATTERN MATCH. THE FOLLOWING ARE RECOGIZED AS
14949: * MATCHES IN THE CONTEXT OF THIS CALL.
14950: *
14951: * 1) AN EXPLICIT USE OF BINARY QUESTION MARK
14952: * 2) A CONCATENATION
14953: * 3) AN ALTERNATION WHOSE LEFT OPERAND IS A CONCATENATION
14954: *
14955: * (XR) PTR TO EXPAN TREE
14956: * JSR EXPAP CALL TO TEST FOR PATTERN MATCH
14957: * PPM LOC TRANSFER LOC IF NOT A PATTERN MATCH
14958: * (WA) DESTROYED
14959: * (XR) UNCHANGED (IF NOT MATCH)
14960: * (XR) PTR TO BINARY OPERATOR BLK IF MATCH
14961: *
14962: EXPAP PRC E,1 ENTRY POINT
14963: MOV XL,-(XS) SAVE XL
14964: BNE (XR),=B$CMT,EXPP2 NO MATCH IF NOT COMPLEX
14965: MOV CMTYP(XR),WA ELSE LOAD TYPE CODE
14966: BEQ WA,=C$CNC,EXPP1 CONCATENATION IS A MATCH
14967: BEQ WA,=C$PMT,EXPP1 BINARY QUESTION MARK IS A MATCH
14968: BNE WA,=C$ALT,EXPP2 ELSE NOT MATCH UNLESS ALTERNATION
14969: *
14970: * HERE FOR ALTERNATION. CHANGE (A B) / C TO A QM (B / C)
14971: *
14972: MOV CMLOP(XR),XL LOAD LEFT OPERAND POINTER
14973: BNE (XL),=B$CMT,EXPP2 NOT MATCH IF LEFT OPND NOT COMPLEX
14974: BNE CMTYP(XL),=C$CNC,EXPP2 NOT MATCH IF LEFT OP NOT CONC
14975: MOV CMROP(XL),CMLOP(XR) XR POINTS TO (B / C)
14976: MOV XR,CMROP(XL) SET XL OPNDS TO A, (B / C)
14977: MOV XL,XR POINT TO THIS ALTERED NODE
14978: *
14979: * EXIT HERE FOR PATTERN MATCH
14980: *
14981: EXPP1 MOV (XS)+,XL RESTORE ENTRY XL
14982: EXI GIVE PATTERN MATCH RETURN
14983: *
14984: * EXIT HERE IF NOT PATTERN MATCH
14985: *
14986: EXPP2 MOV (XS)+,XL RESTORE ENTRY XL
14987: EXI 1 GIVE NON-MATCH RETURN
14988: ENP END PROCEDURE EXPAP
14989: EJC
14990: *
14991: * EXPDM -- DUMP OPERATORS AT CURRENT LEVEL (FOR EXPAN)
14992: *
14993: * EXPDM USES EXPOP TO CONDENSE ALL OPERATORS AT THIS SYNTAX
14994: * LEVEL. THE STACK BOTTOM IS RECOGNIZED FROM THE LEVEL
14995: * VALUE WHICH IS SAVED ON THE TOP OF THE STACK.
14996: *
14997: * JSR EXPDM CALL TO DUMP OPERATORS
14998: * (XS) POPPED AS REQUIRED
14999: * (XR,WA) DESTROYED
15000: *
15001: EXPDM PRC N,0 ENTRY POINT
15002: MOV XL,R$EXS SAVE XL VALUE
15003: *
15004: * LOOP TO DUMP OPERATORS
15005: *
15006: EXDM1 BLE 1(XS),=NUM05,EXDM2 JUMP IF STACK BOTTOM (SAVED LEVEL)
15007: JSR EXPOP ELSE POP ONE OPERATOR
15008: BRN EXDM1 AND LOOP BACK
15009: *
15010: * HERE AFTER POPPING ALL OPERATORS
15011: *
15012: EXDM2 MOV R$EXS,XL RESTORE XL
15013: ZER R$EXS RELEASE SAVE LOCATION
15014: EXI RETURN TO EXPDM CALLER
15015: ENP END PROCEDURE EXPDM
15016: EJC
15017: *
15018: * EXPOP-- POP OPERATOR (FOR EXPAN)
15019: *
15020: * EXPOP IS USED BY THE EXPAN ROUTINE TO CONDENSE ONE
15021: * OPERATOR FROM THE TOP OF THE SYNTAX STACK. AN APPROPRIATE
15022: * CMBLK IS BUILT FOR THE OPERATOR (UNARY OR BINARY) AND A
15023: * POINTER TO THIS CMBLK IS STACKED.
15024: *
15025: * EXPOP IS ALSO USED BY SCNGF (GOTO FIELD SCAN) PROCEDURE
15026: *
15027: * JSR EXPOP CALL TO POP OPERATOR
15028: * (XS) POPPED APPROPRIATELY
15029: * (XR,XL,WA) DESTROYED
15030: *
15031: EXPOP PRC N,0 ENTRY POINT
15032: MOV 1(XS),XR LOAD OPERATOR DV POINTER
15033: BEQ DVLPR(XR),=LLUNO,EXPO2 JUMP IF UNARY
15034: *
15035: * HERE FOR BINARY OPERATOR
15036: *
15037: MOV *CMBS$,WA SET SIZE OF BINARY OPERATOR CMBLK
15038: JSR ALLOC ALLOCATE SPACE FOR CMBLK
15039: MOV (XS)+,CMROP(XR) POP AND STORE RIGHT OPERAND PTR
15040: MOV (XS)+,XL POP AND LOAD OPERATOR DV PTR
15041: MOV (XS),CMLOP(XR) STORE LEFT OPERAND POINTER
15042: *
15043: * COMMON EXIT POINT
15044: *
15045: EXPO1 MOV =B$CMT,(XR) STORE TYPE CODE FOR CMBLK
15046: MOV DVTYP(XL),CMTYP(XR) STORE CMBLK NODE TYPE CODE
15047: MOV XL,CMOPN(XR) STORE DVPTR (=PTR TO DAC O$XXX)
15048: MOV WA,CMLEN(XR) STORE CMBLK LENGTH
15049: MOV XR,(XS) STORE RESULTING NODE PTR ON STACK
15050: EXI RETURN TO EXPOP CALLER
15051: *
15052: * HERE FOR UNARY OPERATOR
15053: *
15054: EXPO2 MOV *CMUS$,WA SET SIZE OF UNARY OPERATOR CMBLK
15055: JSR ALLOC ALLOCATE SPACE FOR CMBLK
15056: MOV (XS)+,CMROP(XR) POP AND STORE OPERAND POINTER
15057: MOV (XS),XL LOAD OPERATOR DV POINTER
15058: BRN EXPO1 MERGE BACK TO EXIT
15059: ENP END PROCEDURE EXPOP
15060: EJC
15061: *
15062: * GBCOL -- PERFORM GARBAGE COLLECTION
15063: *
15064: * GBCOL PERFORMS A GARBAGE COLLECTION ON THE DYNAMIC REGION
15065: * ALL BLOCKS WHICH ARE NO LONGER IN USE ARE ELIMINATED
15066: * BY MOVING BLOCKS WHICH ARE IN USE DOWN AND RESETTING
15067: * DNAMP, THE POINTER TO THE NEXT AVAILABLE LOCATION.
15068: *
15069: * (WB) MOVE OFFSET (SEE BELOW)
15070: * JSR GBCOL CALL TO COLLECT GARBAGE
15071: * (XR) DESTROYED
15072: *
15073: * THE FOLLOWING CONDITIONS MUST BE MET AT THE TIME WHEN
15074: * GBCOL IS CALLED.
15075: *
15076: * 1) ALL POINTERS TO BLOCKS IN THE DYNAMIC AREA MUST BE
15077: * ACCESSIBLE TO THE GARBAGE COLLECTOR. THIS MEANS
15078: * THAT THEY MUST OCCUR IN ONE OF THE FOLLOWING.
15079: *
15080: * A) MAIN STACK, WITH CURRENT TOP
15081: * ELEMENT BEING INDICATED BY XS
15082: *
15083: * B) IN RELOCATABLE FIELDS OF VRBLKS.
15084: *
15085: * C) IN REGISTER XL AT THE TIME OF CALL
15086: *
15087: * E) IN THE SPECIAL REGION OF WORKING
15088: * STORAGE WHERE NAMES BEGIN WITH R$.
15089: *
15090: * 2) ALL POINTERS MUST POINT TO THE START OF BLOCKS WITH
15091: * THE SOLE EXCEPTION OF THE CONTENTS OF THE CODE
15092: * POINTER REGISTER WHICH POINTS INTO THE R$COD BLOCK.
15093: *
15094: * 3) NO LOCATION WHICH APPEARS TO CONTAIN A POINTER
15095: * INTO THE DYNAMIC REGION MAY OCCUR UNLESS IT IS IN
15096: * FACT A POINTER TO THE START OF THE BLOCK. HOWEVER
15097: * POINTERS OUTSIDE THIS AREA MAY OCCUR AND WILL
15098: * NOT BE CHANGED BY THE GARBAGE COLLECTOR.
15099: * IT IS ESPECIALLY IMPORTANT TO MAKE SURE THAT XL
15100: * DOES NOT CONTAIN A GARBAGE VALUE FROM SOME PROCESS
15101: * CARRIED OUT BEFORE THE CALL TO THE COLLECTOR.
15102: *
15103: * GBCOL HAS THE CAPABILITY OF MOVING THE FINAL COMPACTED
15104: * RESULT UP IN MEMORY (WITH ADDRESSES ADJUSTED ACCORDINGLY)
15105: * THIS IS USED TO ADD SPACE TO THE STATIC REGION. THE
15106: * ENTRY VALUE OF WB IS THE NUMBER OF BAUS TO MOVE UP.
15107: * THE CALLER MUST GUARANTEE THAT THERE IS ENOUGH ROOM.
15108: * FURTHERMORE THE VALUE IN WB IF IT IS NON-ZERO, MUST BE AT
15109: * LEAST 256 SO THAT THE MWB INSTRUCTION CONDITIONS ARE MET.
15110: EJC
15111: *
15112: * GBCOL (CONTINUED)
15113: *
15114: * THE ALGORITHM, WHICH IS A MODIFICATION OF THE LISP-2
15115: * GARBAGE COLLECTOR DEVISED BY R.DEWAR AND K.BELCHER
15116: * TAKES THREE PASSES AS FOLLOWS.
15117: *
15118: * 1) ALL POINTERS IN MEMORY ARE SCANNED AND BLOCKS IN USE
15119: * DETERMINED FROM THIS SCAN. NOTE THAT THIS PROCEDURE
15120: * IS RECURSIVE AND USES THE MAIN STACK FOR LINKAGE.
15121: * THE MARKING PROCESS IS THUS SIMILAR TO THAT USED IN
15122: * A STANDARD LISP COLLECTOR. HOWEVER THE METHOD OF
15123: * ACTUALLY MARKING THE BLOCKS IS DIFFERENT.
15124: *
15125: * THE FIRST FIELD OF A BLOCK NORMALLY CONTAINS A
15126: * CODE ENTRY POINT POINTER. SUCH AN ENTRY POINTER
15127: * CAN BE DISTINGUISHED FROM THE ADDRESS OF ANY POINTER
15128: * TO BE PROCESSED BY THE COLLECTOR. DURING GARBAGE
15129: * COLLECTION, THIS WORD IS USED TO BUILD A BACK CHAIN
15130: * OF POINTERS THROUGH FIELDS WHICH POINT TO THE BLOCK.
15131: * THE END OF THE CHAIN IS MARKED BY THE OCCURENCE
15132: * OF THE WORD WHICH USED TO BE IN THE FIRST WORD OF
15133: * THE BLOCK. THIS BACKCHAIN SERVES BOTH AS A MARK
15134: * INDICATING THAT THE BLOCK IS IN USE AND AS A LIST OF
15135: * REFERENCES FOR THE RELOCATION PHASE.
15136: *
15137: * 2) STORAGE IS SCANNED SEQUENTIALLY TO DISCOVER WHICH
15138: * BLOCKS ARE CURRENTLY IN USE AS INDICATED BY THE
15139: * PRESENCE OF A BACKCHAIN. TWO POINTERS ARE MAINTAINED
15140: * ONE SCANS THROUGH LOOKING AT EACH BLOCK. THE OTHER
15141: * IS INCREMENTED ONLY FOR BLOCKS FOUND TO BE IN USE.
15142: * IN THIS WAY, THE EVENTUAL LOCATION OF EACH BLOCK CAN
15143: * BE DETERMINED WITHOUT ACTUALLY MOVING ANY BLOCKS.
15144: * AS EACH BLOCK WHICH IS IN USE IS PROCESSED, THE BACK
15145: * CHAIN IS USED TO RESET ALL POINTERS WHICH POINT TO
15146: * THIS BLOCK TO CONTAIN ITS NEW ADDRESS, I.E. THE
15147: * ADDRESS IT WILL OCCUPY AFTER THE BLOCKS ARE MOVED.
15148: * THE FIRST WORD OF THE BLOCK, TAKEN FROM THE END OF
15149: * THE CHAIN IS RESTORED AT THIS POINT.
15150: *
15151: * DURING PASS 2, THE COLLECTOR BUILDS BLOCKS WHICH
15152: * DESCRIBE THE REGIONS OF STORAGE WHICH ARE TO BE
15153: * MOVED IN THE THIRD PASS. THERE IS ONE DESCRIPTOR FOR
15154: * EACH CONTIGUOUS SET OF GOOD BLOCKS. THE DESCRIPTOR
15155: * IS BUILT JUST BEHIND THE BLOCK TO BE MOVED AND
15156: * CONTAINS A POINTER TO THE NEXT BLOCK AND THE NUMBER
15157: * OF WORDS TO BE MOVED.
15158: *
15159: * 3) IN THE THIRD AND FINAL PASS, THE MOVE DESCRIPTOR
15160: * BLOCKS BUILT IN PASS TWO ARE USED TO ACTUALLY MOVE
15161: * THE BLOCKS DOWN TO THE BOTTOM OF THE DYNAMIC REGION.
15162: * THE COLLECTION IS THEN COMPLETE AND THE NEXT
15163: * AVAILABLE LOCATION POINTER IS RESET.
15164: EJC
15165: *
15166: * GBCOL (CONTINUED)
15167: *
15168: GBCOL PRC E,0 ENTRY POINT
15169: BNZ DMVCH,GBC14 FAIL IF IN MID-DUMP
15170: MNZ GBCFL NOTE GBCOL ENTERED
15171: MOV WA,GBSVA SAVE ENTRY WA
15172: MOV WB,GBSVB SAVE ENTRY WB
15173: MOV WC,GBSVC SAVE ENTRY WC
15174: MOV XL,-(XS) SAVE ENTRY XL
15175: SCP WA GET CODE POINTER VALUE
15176: SUB R$COD,WA MAKE RELATIVE
15177: LCP WA AND RESTORE
15178: *
15179: * PROCESS STACK ENTRIES
15180: *
15181: MOV XS,XR POINT TO STACK FRONT
15182: MOV STBAS,XL POINT PAST END OF STACK
15183: BGE XL,XR,GBC00 OK IF D-STACK
15184: MOV XL,XR REVERSE IF ...
15185: MOV XS,XL ... U-STACK
15186: *
15187: * PROCESS THE STACK
15188: *
15189: GBC00 JSR GBCPF PROCESS POINTERS ON STACK
15190: *
15191: * PROCESS SPECIAL WORK LOCATIONS
15192: *
15193: MOV =R$AAA,XR POINT TO START OF RELOCATABLE LOCS
15194: MOV =R$YYY,XL POINT PAST END OF RELOCATABLE LOCS
15195: JSR GBCPF PROCESS WORK FIELDS
15196: *
15197: * PREPARE TO PROCESS VARIABLE BLOCKS
15198: *
15199: MOV HSHTB,WA POINT TO FIRST HASH SLOT POINTER
15200: *
15201: * LOOP THROUGH HASH SLOTS
15202: *
15203: GBC01 MOV WA,XL POINT TO NEXT SLOT
15204: ICA WA BUMP BUCKET POINTER
15205: MOV WA,GBCNM SAVE BUCKET POINTER
15206: EJC
15207: *
15208: * GBCOL (CONTINUED)
15209: *
15210: * LOOP THROUGH VARIABLES ON ONE HASH CHAIN
15211: *
15212: GBC02 MOV (XL),XR LOAD PTR TO NEXT VRBLK
15213: BZE XR,GBC03 JUMP IF END OF CHAIN
15214: MOV XR,XL ELSE COPY VRBLK POINTER
15215: ADD *VRVAL,XR POINT TO FIRST RELOC FLD
15216: ADD *VRNXT,XL POINT PAST LAST (AND TO LINK PTR)
15217: JSR GBCPF PROCESS RELOC FIELDS IN VRBLK
15218: BRN GBC02 LOOP BACK FOR NEXT BLOCK
15219: *
15220: * HERE AT END OF ONE HASH CHAIN
15221: *
15222: GBC03 MOV GBCNM,WA RESTORE BUCKET POINTER
15223: BNE WA,HSHTE,GBC01 LOOP BACK IF MORE BUCKETS TO GO
15224: EJC
15225: *
15226: * GBCOL (CONTINUED)
15227: *
15228: * NOW WE ARE READY TO START PASS TWO. REGISTERS ARE USED
15229: * AS FOLLOWS IN PASS TWO.
15230: *
15231: * (XR) SCANS THROUGH ALL BLOCKS
15232: * (WC) POINTER TO EVENTUAL LOCATION
15233: *
15234: * THE MOVE DESCRIPTION BLOCKS BUILT IN THIS PASS HAVE
15235: * THE FOLLOWING FORMAT.
15236: *
15237: * WORD 1 POINTER TO NEXT MOVE BLOCK,
15238: * ZERO IF END OF CHAIN OF BLOCKS
15239: *
15240: * WORD 2 LENGTH OF BLOCKS TO BE MOVED IN
15241: * BAUS. SET TO THE ADDRESS OF THE
15242: * FIRST BAU WHILE ACTUALLY SCANNING
15243: * THE BLOCKS.
15244: *
15245: * THE FIRST ENTRY ON THIS CHAIN IS A SPECIAL ENTRY
15246: * CONSISTING OF THE TWO WORDS GBCNM AND GBCNS. AFTER
15247: * BUILDING THE CHAIN OF MOVE DESCRIPTORS, GBCNM POINTS TO
15248: * THE FIRST REAL MOVE BLOCK, AND GBCNS IS THE LENGTH OF
15249: * BLOCKS IN USE AT THE START OF STORAGE WHICH NEED NOT
15250: * BE MOVED SINCE THEY ARE IN THE CORRECT POSITION.
15251: *
15252: GBC04 MOV DNAMB,XR POINT TO FIRST BLOCK
15253: MOV XR,WC SET AS FIRST EVENTUAL LOCATION
15254: ADD GBSVB,WC ADD OFFSET FOR EVENTUAL MOVE UP
15255: ZER GBCNM CLEAR INITIAL FORWARD POINTER
15256: MOV =GBCNM,GBCLM INITIALIZE PTR TO LAST MOVE BLOCK
15257: MOV XR,GBCNS INITIALIZE FIRST ADDRESS
15258: *
15259: * LOOP THROUGH A SERIES OF BLOCKS IN USE
15260: *
15261: GBC05 BEQ XR,DNAMP,GBC07 JUMP IF END OF USED REGION
15262: MOV (XR),WA ELSE GET FIRST WORD
15263: .IF .CEPP
15264: BOD WA,GBC07 JUMP IF ENTRY POINTER (UNUSED)
15265: .ELSE
15266: BHI WA,=P$YYY,GBC06 SKIP IF NOT ENTRY PTR (IN USE)
15267: BHI WA,=B$AAA,GBC07 JUMP IF ENTRY POINTER (UNUSED)
15268: .FI
15269: *
15270: * HERE FOR BLOCK IN USE, LOOP TO RELOCATE REFERENCES
15271: *
15272: GBC06 MOV WA,XL COPY POINTER
15273: MOV (XL),WA LOAD FORWARD POINTER
15274: MOV WC,(XL) RELOCATE REFERENCE
15275: .IF .CEPP
15276: BEV WA,GBC06 LOOP BACK IF NOT END OF CHAIN
15277: .ELSE
15278: BHI WA,=P$YYY,GBC06 LOOP BACK IF NOT END OF CHAIN
15279: BLO WA,=B$AAA,GBC06 LOOP BACK IF NOT END OF CHAIN
15280: .FI
15281: EJC
15282: *
15283: * GBCOL (CONTINUED)
15284: *
15285: * AT END OF CHAIN, RESTORE FIRST WORD AND BUMP PAST
15286: *
15287: MOV WA,(XR) RESTORE FIRST WORD
15288: JSR BLKLN GET LENGTH OF THIS BLOCK
15289: ADD WA,XR BUMP ACTUAL POINTER
15290: ADD WA,WC BUMP EVENTUAL POINTER
15291: BRN GBC05 LOOP BACK FOR NEXT BLOCK
15292: *
15293: * HERE AT END OF A SERIES OF BLOCKS IN USE
15294: *
15295: GBC07 MOV XR,WA COPY POINTER PAST LAST BLOCK
15296: MOV GBCLM,XL POINT TO PREVIOUS MOVE BLOCK
15297: SUB 1(XL),WA SUBTRACT STARTING ADDRESS
15298: MOV WA,1(XL) STORE LENGTH OF BLOCK TO BE MOVED
15299: *
15300: * LOOP THROUGH A SERIES OF BLOCKS NOT IN USE
15301: *
15302: GBC08 BEQ XR,DNAMP,GBC10 JUMP IF END OF USED REGION
15303: MOV (XR),WA ELSE LOAD FIRST WORD OF NEXT BLOCK
15304: .IF .CEPP
15305: BEV WA,GBC09 JUMP IF IN USE
15306: .ELSE
15307: BHI WA,=P$YYY,GBC09 JUMP IF IN USE
15308: BLO WA,=B$AAA,GBC09 JUMP IF IN USE
15309: .FI
15310: JSR BLKLN ELSE GET LENGTH OF NEXT BLOCK
15311: ADD WA,XR PUSH POINTER
15312: BRN GBC08 AND LOOP BACK
15313: *
15314: * HERE FOR A BLOCK IN USE AFTER PROCESSING A SERIES OF
15315: * BLOCKS WHICH WERE NOT IN USE, BUILD NEW MOVE BLOCK.
15316: *
15317: GBC09 SUB *NUM02,XR POINT 2 WORDS BEHIND FOR MOVE BLOCK
15318: MOV GBCLM,XL POINT TO PREVIOUS MOVE BLOCK
15319: MOV XR,(XL) SET FORWARD PTR IN PREVIOUS BLOCK
15320: ZER (XR) ZERO FORWARD PTR OF NEW BLOCK
15321: MOV XR,GBCLM REMEMBER ADDRESS OF THIS BLOCK
15322: MOV XR,XL COPY PTR TO MOVE BLOCK
15323: ADD *NUM02,XR POINT BACK TO BLOCK IN USE
15324: MOV XR,1(XL) STORE STARTING ADDRESS
15325: BRN GBC06 JUMP TO PROCESS BLOCK IN USE
15326: EJC
15327: *
15328: * GBCOL (CONTINUED)
15329: *
15330: * HERE FOR PASS THREE -- ACTUALLY MOVE THE BLOCKS DOWN
15331: *
15332: * (XL) POINTER TO OLD LOCATION
15333: * (XR) POINTER TO NEW LOCATION
15334: *
15335: GBC10 MOV DNAMB,XR POINT TO START OF STORAGE
15336: ADD GBCNS,XR BUMP PAST UNMOVED BLOCKS AT START
15337: *
15338: * LOOP THROUGH MOVE DESCRIPTORS
15339: *
15340: GBC11 MOV GBCNM,XL POINT TO NEXT MOVE BLOCK
15341: BZE XL,GBC12 JUMP IF END OF CHAIN
15342: MOV (XL)+,GBCNM MOVE POINTER DOWN CHAIN
15343: MOV (XL)+,WA GET LENGTH TO MOVE
15344: MVW PERFORM MOVE
15345: BRN GBC11 LOOP BACK
15346: *
15347: * NOW TEST FOR MOVE UP
15348: *
15349: GBC12 MOV XR,DNAMP SET NEXT AVAILABLE LOC PTR
15350: MOV GBSVB,WB RELOAD MOVE OFFSET
15351: BZE WB,GBC13 JUMP IF NO MOVE REQUIRED
15352: MOV XR,XL ELSE COPY OLD TOP OF CORE
15353: ADD WB,XR POINT TO NEW TOP OF CORE
15354: MOV XR,DNAMP SAVE NEW TOP OF CORE POINTER
15355: MOV XL,WA COPY OLD TOP
15356: SUB DNAMB,WA MINUS OLD BOTTOM = LENGTH
15357: ADD WB,DNAMB BUMP BOTTOM TO GET NEW VALUE
15358: MWB PERFORM MOVE (BACKWARDS)
15359: *
15360: * MERGE HERE TO EXIT
15361: *
15362: GBC13 MOV GBSVA,WA RESTORE WA
15363: SCP WC GET CODE POINTER
15364: ADD R$COD,WC MAKE ABSOLUTE AGAIN
15365: LCP WC AND REPLACE ABSOLUTE VALUE
15366: MOV GBSVC,WC RESTORE WC
15367: MOV (XS)+,XL RESTORE ENTRY XL
15368: ICV GBCNT INCREMENT COUNT OF COLLECTIONS
15369: ZER XR CLEAR GARBAGE VALUE IN XR
15370: ZER GBCFL NOTE EXIT FROM GBCOL
15371: EXI EXIT TO GBCOL CALLER
15372: *
15373: * GARBAGE COLLECTION NOT ALLOWED WHILST DUMPING
15374: *
15375: GBC14 ICV ERRFT FATAL ERROR
15376: ERB 229,INSUFFICIENT MEMORY TO COMPLETE DUMP
15377: ENP END PROCEDURE GBCOL
15378: EJC
15379: *
15380: * GBCPF -- PROCESS FIELDS FOR GARBAGE COLLECTOR
15381: *
15382: * THIS PROCEDURE IS USED BY THE GARBAGE COLLECTOR TO
15383: * PROCESS FIELDS IN PASS ONE. SEE GBCOL FOR FULL DETAILS.
15384: *
15385: * (XR) PTR TO FIRST LOCATION TO PROCESS
15386: * (XL) PTR PAST LAST LOCATION TO PROCESS
15387: * JSR GBCPF CALL TO PROCESS FIELDS
15388: * (XR,WA,WB,WC,IA) DESTROYED
15389: *
15390: * NOTE THAT ALTHOUGH THIS PROCEDURE USES A RECURSIVE
15391: * APPROACH, IT CONTROLS ITS OWN STACK AND IS NOT RECURSIVE.
15392: *
15393: GBCPF PRC E,0 ENTRY POINT
15394: ZER -(XS) SET ZERO TO MARK BOTTOM OF STACK
15395: MOV XL,-(XS) SAVE END POINTER
15396: *
15397: * MERGE HERE TO GO DOWN A LEVEL AND START A NEW LOOP
15398: *
15399: * 1(XS) NEXT LVL FIELD PTR (0 AT OUTER LVL)
15400: * 0(XS) PTR PAST LAST FIELD TO PROCESS
15401: * (XR) PTR TO FIRST FIELD TO PROCESS
15402: *
15403: * LOOP TO PROCESS SUCCESSIVE FIELDS
15404: *
15405: GPF01 MOV (XR),XL LOAD FIELD CONTENTS
15406: MOV XR,WC SAVE FIELD POINTER
15407: .IF .CRPP
15408: BOD XL,GPF02 JUMP IF NOT PTR INTO DYNAMIC AREA
15409: .ELSE
15410: .FI
15411: BLT XL,DNAMB,GPF02 JUMP IF NOT PTR INTO DYNAMIC AREA
15412: BGE XL,DNAMP,GPF02 JUMP IF NOT PTR INTO DYNAMIC AREA
15413: *
15414: * HERE WE HAVE A PTR TO A BLOCK IN THE DYNAMIC AREA.
15415: * LINK THIS FIELD ONTO THE REFERENCE BACKCHAIN.
15416: *
15417: MOV (XL),WA LOAD PTR TO CHAIN (OR ENTRY PTR)
15418: MOV XR,(XL) SET THIS FIELD AS NEW HEAD OF CHAIN
15419: MOV WA,(XR) SET FORWARD POINTER
15420: *
15421: * NOW SEE IF THIS BLOCK HAS BEEN PROCESSED BEFORE
15422: *
15423: .IF .CEPP
15424: BOD WA,GPF03 JUMP IF NOT ALREADY PROCESSED
15425: .ELSE
15426: BHI WA,=P$YYY,GPF02 JUMP IF ALREADY PROCESSED
15427: BHI WA,=B$AAA,GPF03 JUMP IF NOT ALREADY PROCESSED
15428: .FI
15429: *
15430: * HERE TO MOVE TO NEXT FIELD
15431: *
15432: GPF02 MOV WC,XR RESTORE FIELD POINTER
15433: ICA XR BUMP TO NEXT FIELD
15434: BNE XR,(XS),GPF01 LOOP BACK IF MORE TO GO
15435: EJC
15436: *
15437: * GBCPF (CONTINUED)
15438: *
15439: * HERE WE POP UP A LEVEL AFTER FINISHING A BLOCK
15440: *
15441: MOV (XS)+,XL RESTORE POINTER PAST END
15442: MOV (XS)+,WC RESTORE BLOCK POINTER
15443: BNZ WC,GPF02 CONTINUE LOOP UNLESS OUTER LEVL
15444: EXI RETURN TO CALLER IF OUTER LEVEL
15445: *
15446: * HERE TO PROCESS AN ACTIVE BLOCK WHICH HAS NOT BEEN DONE
15447: *
15448: GPF03 MOV XL,XR COPY BLOCK POINTER
15449: MOV WA,XL COPY FIRST WORD OF BLOCK
15450: LEI XL LOAD ENTRY POINT ID (BL$XX)
15451: *
15452: * BLOCK TYPE SWITCH. NOTE THAT BLOCKS WITH NO RELOCATABLE
15453: * FIELDS JUST RETURN TO GPF02 HERE TO CONTINE TO NEXT FLD.
15454: *
15455: BSW XL,BL$$$ SWITCH ON BLOCK TYPE
15456: IFF BL$AR,GPF06 ARBLK
15457: .IF .CNBF
15458: .ELSE
15459: IFF BL$BC,GPF18 BCBLK
15460: IFF BL$BF,GPF02 BFBLK
15461: .FI
15462: IFF BL$CC,GPF07 CCBLK
15463: IFF BL$CD,GPF08 CDBLK
15464: IFF BL$CM,GPF04 CMBLK
15465: IFF BL$CO,GPF19 COBLK
15466: IFF BL$DF,GPF02 DFBLK
15467: IFF BL$EV,GPF10 EVBLK
15468: IFF BL$EX,GPF17 EXBLK
15469: IFF BL$FF,GPF11 FFBLK
15470: IFF BL$NM,GPF10 NMBLK
15471: IFF BL$P0,GPF10 P0BLK
15472: IFF BL$P1,GPF12 P1BLK
15473: IFF BL$P2,GPF12 P2BLK
15474: IFF BL$PD,GPF13 PDBLK
15475: IFF BL$PF,GPF14 PFBLK
15476: IFF BL$TB,GPF08 TBBLK
15477: IFF BL$TE,GPF15 TEBLK
15478: IFF BL$TR,GPF16 TRBLK
15479: IFF BL$VC,GPF08 VCBLK
15480: IFF BL$XR,GPF09 XRBLK
15481: IFF BL$CT,GPF02 CTBLK
15482: IFF BL$EF,GPF02 EFBLK
15483: IFF BL$IC,GPF02 ICBLK
15484: IFF BL$KV,GPF02 KVBLK
15485: .IF .CNRA
15486: .ELSE
15487: IFF BL$RC,GPF02 RCBLK
15488: .FI
15489: IFF BL$SC,GPF02 SCBLK
15490: IFF BL$SE,GPF02 SEBLK
15491: IFF BL$XN,GPF02 XNBLK
15492: ESW END OF JUMP TABLE
15493: EJC
15494: *
15495: * GBCPF (CONTINUED)
15496: *
15497: * CMBLK
15498: *
15499: GPF04 MOV CMLEN(XR),WA LOAD LENGTH
15500: MOV *CMTYP,WB SET OFFSET
15501: *
15502: * HERE TO PUSH DOWN TO NEW LEVEL
15503: *
15504: * (WC) FIELD PTR AT PREVIOUS LEVEL
15505: * (XR) PTR TO NEW BLOCK
15506: * (WA) LENGTH (RELOC FLDS + FLDS AT START)
15507: * (WB) OFFSET TO FIRST RELOC FIELD
15508: *
15509: GPF05 ADD XR,WA POINT PAST LAST RELOC FIELD
15510: ADD WB,XR POINT TO FIRST RELOC FIELD
15511: MOV WC,-(XS) STACK OLD FIELD POINTER
15512: MOV WA,-(XS) STACK NEW LIMIT POINTER
15513: CHK CHECK FOR STACK OVERFLOW
15514: BRN GPF01 IF OK, BACK TO PROCESS
15515: *
15516: * ARBLK
15517: *
15518: GPF06 MOV ARLEN(XR),WA LOAD LENGTH
15519: MOV AROFS(XR),WB SET OFFSET TO 1ST RELOC FLD (ARPRO)
15520: BRN GPF05 ALL SET
15521: *
15522: * CCBLK
15523: *
15524: GPF07 MOV CCUSE(XR),WA SET LENGTH IN USE
15525: MOV *CCUSE,WB 1ST WORD (MAKE SURE AT LEAST ONE)
15526: BRN GPF05 ALL SET
15527: EJC
15528: *
15529: * GBCPF (CONTINUED)
15530: *
15531: * CDBLK, TBBLK, VCBLK
15532: *
15533: GPF08 MOV OFFS2(XR),WA LOAD LENGTH
15534: MOV *OFFS3,WB SET OFFSET
15535: BRN GPF05 JUMP BACK
15536: *
15537: * XRBLK
15538: *
15539: GPF09 MOV XRLEN(XR),WA LOAD LENGTH
15540: MOV *XRPTR,WB SET OFFSET
15541: BRN GPF05 JUMP BACK
15542: *
15543: * EVBLK, NMBLK, P0BLK
15544: *
15545: GPF10 MOV *OFFS2,WA POINT PAST SECOND FIELD
15546: MOV *OFFS1,WB OFFSET IS ONE (ONLY RELOC FLD IS 2)
15547: BRN GPF05 ALL SET
15548: *
15549: * FFBLK
15550: *
15551: GPF11 MOV *FFOFS,WA SET LENGTH
15552: MOV *FFNXT,WB SET OFFSET
15553: BRN GPF05 ALL SET
15554: *
15555: * P1BLK, P2BLK
15556: *
15557: GPF12 MOV *PARM2,WA LENGTH (PARM2 IS NON-RELOCATABLE)
15558: MOV *PTHEN,WB SET OFFSET
15559: BRN GPF05 ALL SET
15560: EJC
15561: *
15562: * GBCPF (CONTINUED)
15563: *
15564: * PDBLK
15565: *
15566: GPF13 MOV PDDFP(XR),XL LOAD PTR TO DFBLK
15567: MOV DFPDL(XL),WA GET PDBLK LENGTH
15568: MOV *PDFLD,WB SET OFFSET
15569: BRN GPF05 ALL SET
15570: *
15571: * PFBLK
15572: *
15573: GPF14 MOV *PFARG,WA LENGTH PAST LAST RELOC
15574: MOV *PFCOD,WB OFFSET TO FIRST RELOC
15575: BRN GPF05 ALL SET
15576: *
15577: * TEBLK
15578: *
15579: GPF15 MOV *TESI$,WA SET LENGTH
15580: MOV *TESUB,WB AND OFFSET
15581: BRN GPF05 ALL SET
15582: *
15583: * TRBLK
15584: *
15585: GPF16 MOV *TRSI$,WA SET LENGTH
15586: MOV *TRVAL,WB AND OFFSET
15587: BRN GPF05 ALL SET
15588: *
15589: * EXBLK
15590: *
15591: GPF17 MOV EXLEN(XR),WA LOAD LENGTH
15592: MOV *EXFLC,WB SET OFFSET
15593: BRN GPF05 JUMP BACK
15594: .IF .CNBF
15595: .ELSE
15596: *
15597: * BCBLK
15598: *
15599: GPF18 MOV *BCSI$,WA SET LENGTH
15600: MOV *BCBUF,WB AND OFFSET
15601: BRN GPF05 ALL SET
15602: .FI
15603: *
15604: * COBLK
15605: *
15606: GPF19 MOV *COSI$,WA SET LENGTH
15607: MOV *CONXT,WB AND OFFSET
15608: BRN GPF05 ALL SET
15609: ENP END PROCEDURE GBCPF
15610: .IF .CNBF
15611: .ELSE
15612: EJC
15613: *
15614: * GTBUF -- GET BUFFER
15615: *
15616: * GTBUF IS PASSED AN OBJECT AND RETURNS A BUFFER IF
15617: * POSSIBLE. UNLESS THE OBJECT IS ALREADY A BUFFER,
15618: * THIS INVOLVES A CONVERSION TO STRING AND THEN
15619: * STRING TO BUFFER.
15620: *
15621: * (XR) OBJECT TO BE CONVERTED
15622: * JSR GTBUF CALL TO GET BUFFER
15623: * PPM LOC TRANSFER LOC FOR CONVERT IMPOSSIBLE
15624: * (XR) RESULTING BUFFER
15625: * (XL,WA,WB,WC) DESTROYED
15626: *
15627: GTBUF PRC E,1 ENTRY POINT
15628: BEQ (XR),=B$BCT,GTB01 EXIT IF ALREADY BUFFER
15629: MOV XR,-(XS) STACK TO CONVERT TO STRING
15630: JSR GTSTG CONVERT TO STRING
15631: PPM GTB02 CONVERSION ERROR
15632: MOV XR,XL SAVE STRING POINTER
15633: JSR ALOBF ALLOCATE BUFFER OF SAME SIZE
15634: JSR INSBF COPY IN THE STRING
15635: PPM ALREADY STRING - CANT FAIL TO CNV
15636: PPM MUST BE ENOUGH ROOM
15637: *
15638: * MERGE TO EXIT WITH BUFFER CONTROL BLK IN (XR)
15639: *
15640: GTB01 EXI RETURN TO CALLER
15641: *
15642: * HERE ON CONVERSION FAILURE
15643: *
15644: GTB02 EXI 1 TAKE FAILURE EXIT
15645: ENP
15646: .FI
15647: EJC
15648: *
15649: * GTARR -- GET ARRAY
15650: *
15651: * GTARR IS PASSED AN OBJECT AND RETURNS AN ARRAY IF POSSIBLE
15652: *
15653: * (XR) VALUE TO BE CONVERTED
15654: * JSR GTARR CALL TO GET ARRAY
15655: * PPM LOC TRANSFER LOC FOR CONVERT IMPOSSIBLE
15656: * (XR) RESULTING ARRAY
15657: * (XL,WA,WB,WC) DESTROYED
15658: *
15659: GTARR PRC E,1 ENTRY POINT
15660: MOV (XR),WA LOAD TYPE WORD
15661: BEQ WA,=B$ART,GTAR8 EXIT IF ALREADY AN ARRAY
15662: BEQ WA,=B$VCT,GTAR8 EXIT IF ALREADY AN ARRAY
15663: MOV XR,-(XS) PLACE POSSIBLE TBBLK PTR ON STACK
15664: BNE WA,=B$TBT,GTAR9 ELSE FAIL IF NOT A TABLE
15665: *
15666: * HERE WE CONVERT A TABLE TO AN ARRAY
15667: *
15668: ZER XR SIGNAL FIRST PASS
15669: ZER WB ZERO NON-NULL ELEMENT COUNT
15670: *
15671: * THE FOLLOWING CODE IS EXECUTED TWICE. ON THE FIRST PASS,
15672: * SIGNALLED BY XR=0, THE NUMBER OF NON-NULL ELEMENTS IN
15673: * THE TABLE IS COUNTED IN WB. IN THE SECOND PASS, WHERE
15674: * XR IS A POINTER INTO THE ARBLK, THE NAME AND VALUE ARE
15675: * ENTERED INTO THE CURRENT ARBLK LOCATION.
15676: *
15677: GTAR1 MOV (XS),XL POINT TO TABLE
15678: ADD TBLEN(XL),XL POINT PAST LAST BUCKET
15679: SUB *TBBUK,XL SET FIRST BUCKET OFFSET
15680: MOV XL,WA COPY ADJUSTED POINTER
15681: *
15682: * LOOP THROUGH BUCKETS IN TABLE BLOCK
15683: * NEXT THREE LINES OF CODE RELY ON TENXT HAVING A VALUE
15684: * 1 LESS THAN TBBUK.
15685: *
15686: GTAR2 MOV WA,XL COPY BUCKET POINTER
15687: DCA WA DECREMENT BUCKET POINTER
15688: *
15689: * LOOP THROUGH TEBLKS ON ONE BUCKET CHAIN
15690: *
15691: GTAR3 MOV TENXT(XL),XL POINT TO NEXT TEBLK
15692: BEQ XL,(XS),GTAR6 JUMP IF CHAIN END (TBBLK PTR)
15693: MOV XL,CNVTP ELSE SAVE TEBLK POINTER
15694: *
15695: * LOOP TO FIND VALUE DOWN TRBLK CHAIN
15696: *
15697: GTAR4 MOV TEVAL(XL),XL LOAD VALUE
15698: BEQ (XL),=B$TRT,GTAR4 LOOP TILL VALUE FOUND
15699: MOV XL,WC COPY VALUE
15700: MOV CNVTP,XL RESTORE TEBLK POINTER
15701: EJC
15702: *
15703: * GTARR (CONTINUED)
15704: *
15705: * NOW CHECK FOR NULL AND TEST CASES
15706: *
15707: BEQ WC,=NULLS,GTAR3 LOOP BACK TO IGNORE NULL VALUE
15708: BNZ XR,GTAR5 JUMP IF SECOND PASS
15709: ICV WB FOR THE FIRST PASS, BUMP COUNT
15710: BRN GTAR3 AND LOOP BACK FOR NEXT TEBLK
15711: *
15712: * HERE IN SECOND PASS
15713: *
15714: GTAR5 MOV TESUB(XL),(XR)+ STORE SUBSCRIPT NAME
15715: MOV WC,(XR)+ STORE VALUE IN ARBLK
15716: BRN GTAR3 LOOP BACK FOR NEXT TEBLK
15717: *
15718: * HERE AFTER SCANNING TEBLKS ON ONE CHAIN
15719: *
15720: GTAR6 BNE WA,(XS),GTAR2 LOOP BACK IF MORE BUCKETS TO GO
15721: BNZ XR,GTAR7 ELSE JUMP IF SECOND PASS
15722: *
15723: * HERE AFTER COUNTING NON-NULL ELEMENTS
15724: *
15725: BZE WB,GTAR9 FAIL IF NO NON-NULL ELEMENTS
15726: MOV WB,WA ELSE COPY COUNT
15727: ADD WB,WA DOUBLE (TWO WORDS/ELEMENT)
15728: ADD =ARVL2,WA ADD SPACE FOR STANDARD FIELDS
15729: WTB WA CONVERT LENGTH TO BAUS
15730: BGE WA,MXLEN,GTAR9 FAIL IF TOO LONG FOR ARRAY
15731: JSR ALLOC ELSE ALLOCATE SPACE FOR ARBLK
15732: MOV =B$ART,(XR) STORE TYPE WORD
15733: ZER IDVAL(XR) ZERO ID FOR THE MOMENT
15734: MOV WA,ARLEN(XR) STORE LENGTH
15735: MOV =NUM02,ARNDM(XR) SET DIMENSIONS = 2
15736: LDI INTV1 GET INTEGER ONE
15737: STI ARLBD(XR) STORE AS LBD 1
15738: STI ARLB2(XR) STORE AS LBD 2
15739: LDI INTV2 LOAD INTEGER TWO
15740: STI ARDM2(XR) STORE AS DIM 2
15741: MTI WB GET ELEMENT COUNT AS INTEGER
15742: STI ARDIM(XR) STORE AS DIM 1
15743: ZER ARPR2(XR) ZERO PROTOTYPE FIELD FOR NOW
15744: MOV *ARPR2,AROFS(XR) SET OFFSET FIELD (SIGNAL PASS 2)
15745: MOV XR,WB SAVE ARBLK POINTER
15746: ADD *ARVL2,XR POINT TO FIRST ELEMENT LOCATION
15747: BRN GTAR1 JUMP BACK TO FILL IN ELEMENTS
15748: EJC
15749: *
15750: * GTARR (CONTINUED)
15751: *
15752: * HERE AFTER FILLING IN ELEMENT VALUES
15753: *
15754: GTAR7 MOV WB,XR RESTORE ARBLK POINTER
15755: MOV WB,(XS) STORE AS RESULT
15756: *
15757: * NOW WE NEED THE ARRAY PROTOTYPE WHICH IS OF THE FORM NN,2
15758: * THIS IS OBTAINED BY BUILDING THE STRING FOR NN02 AND
15759: * CHANGING THE ZERO TO A COMMA BEFORE STORING IT.
15760: *
15761: LDI ARDIM(XR) GET NUMBER OF ELEMENTS (NN)
15762: MLI INTVH MULTIPLY BY 100
15763: ADI INTV2 ADD 2 (NN02)
15764: JSR ICBLD BUILD INTEGER
15765: MOV XR,-(XS) STORE PTR FOR GTSTG
15766: JSR GTSTG CONVERT TO STRING
15767: PPM CONVERT FAIL IS IMPOSSIBLE
15768: MOV XR,XL COPY STRING POINTER
15769: MOV (XS)+,XR RELOAD ARBLK POINTER
15770: MOV XL,ARPR2(XR) STORE PROTOTYPE PTR (NN02)
15771: SUB =NUM02,WA ADJUST LENGTH TO POINT TO ZERO
15772: PSC XL,WA POINT TO ZERO
15773: MOV =CH$CM,WB LOAD A COMMA
15774: SCH WB,(XL) STORE A COMMA OVER THE ZERO
15775: CSC XL COMPLETE STORE CHARACTERS
15776: *
15777: * NORMAL RETURN
15778: *
15779: GTAR8 EXI RETURN TO CALLER
15780: *
15781: * NON-CONVERSION RETURN
15782: *
15783: GTAR9 MOV (XS)+,XR CLEAR UP STACK
15784: EXI 1 RETURN
15785: ENP PROCEDURE GTARR
15786: EJC
15787: *
15788: * GTCOD -- CONVERT TO CODE
15789: *
15790: * (XR) OBJECT TO BE CONVERTED
15791: * JSR GTCOD CALL TO CONVERT TO CODE
15792: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
15793: * (XR) POINTER TO RESULTING CDBLK
15794: * (XL,WA,WB,WC,RA) DESTROYED
15795: *
15796: * IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE-
15797: * EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
15798: * WITHOUT RETURNING TO THIS ROUTINE.
15799: *
15800: GTCOD PRC E,1 ENTRY POINT
15801: BEQ (XR),=B$CDS,GTCD1 JUMP IF ALREADY CODE
15802: BEQ (XR),=B$CDC,GTCD1 JUMP IF ALREADY CODE
15803: *
15804: * HERE WE MUST GENERATE A CDBLK BY COMPILATION
15805: *
15806: MOV XR,-(XS) STACK ARGUMENT FOR GTSTG
15807: JSR GTSTG CONVERT ARGUMENT TO STRING
15808: PPM GTCD2 JUMP IF NON-CONVERTIBLE
15809: MOV FLPTR,GTCEF SAVE FAIL PTR IN CASE OF ERROR
15810: MOV R$COD,R$GTC ALSO SAVE CODE PTR
15811: MOV XR,R$CIM ELSE SET IMAGE POINTER
15812: MOV WA,SCNIL SET IMAGE LENGTH
15813: ZER SCNPT SET SCAN POINTER
15814: MOV =STGXC,STAGE SET STAGE FOR EXECUTE COMPILE
15815: MOV CMPSN,LSTSN IN CASE LISTR CALLED
15816: JSR CMPIL COMPILE STRING
15817: MOV =STGXT,STAGE RESET STAGE FOR EXECUTE TIME
15818: ZER R$CIM CLEAR IMAGE
15819: *
15820: * MERGE HERE IF NO CONVERT REQUIRED
15821: *
15822: GTCD1 EXI GIVE NORMAL GTCOD RETURN
15823: *
15824: * HERE IF UNCONVERTIBLE
15825: *
15826: GTCD2 EXI 1 GIVE ERROR RETURN
15827: ENP END PROCEDURE GTCOD
15828: EJC
15829: *
15830: * GTEXP -- CONVERT TO EXPRESSION
15831: *
15832: * (XR) INPUT VALUE TO BE CONVERTED
15833: * JSR GTEXP CALL TO CONVERT TO EXPRESSION
15834: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
15835: * (XR) POINTER TO RESULT EXBLK OR SEBLK
15836: * (XL,WA,WB,WC,RA) DESTROYED
15837: *
15838: * IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE-
15839: * EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
15840: * WITHOUT RETURNING TO THIS ROUTINE.
15841: *
15842: GTEXP PRC E,1 ENTRY POINT
15843: BLO (XR),=B$E$$,GTEX1 JUMP IF ALREADY AN EXPRESSION
15844: MOV XR,-(XS) STORE ARGUMENT FOR GTSTG
15845: JSR GTSTG CONVERT ARGUMENT TO STRING
15846: PPM GTEX2 JUMP IF UNCONVERTIBLE
15847: *
15848: * CHECK THE LAST CHAR OF STRING FOR COLON OR
15849: * SEMICOLON. THEY CAN LEGITIMATELY END AN EXPRESSION
15850: * IN OPEN CODE, SO EXPAN WILL NOT FAIL THEM BUT THEY ARE
15851: * INVALID AS TERMINATORS FOR A STRING WHICH IS TO BE
15852: * CONVERTED TO EXPRESSION FORM.
15853: *
15854: MOV XR,XL COPY ARGUMENT STRING
15855: PLC XL,WA POINT PAST STRING END
15856: LCH XL,-(XL) GET LAST CHAR
15857: BEQ XL,=CH$CL,GTEX2 FAIL IF COLON
15858: BEQ XL,=CH$SM,GTEX2 FAIL IF SEMICOLON
15859: *
15860: * HERE WE CONVERT A STRING BY COMPILATION
15861: *
15862: MOV XR,R$CIM SET INPUT IMAGE POINTER
15863: ZER SCNPT SET SCAN POINTER
15864: MOV WA,SCNIL SET INPUT IMAGE LENGTH
15865: ZER WB SET CODE FOR NORMAL SCAN
15866: MOV FLPTR,GTCEF SAVE FAIL PTR IN CASE OF ERROR
15867: MOV R$COD,R$GTC ALSO SAVE CODE PTR
15868: MOV =STGEV,STAGE ADJUST STAGE FOR COMPILE
15869: MOV =T$UOK,SCNTP INDICATE UNARY OPERATOR ACCEPTABLE
15870: JSR EXPAN BUILD TREE FOR EXPRESSION
15871: ZER SCNRS RESET RESCAN FLAG
15872: BNE SCNPT,SCNIL,GTEX2 ERROR IF NOT END OF IMAGE
15873: ZER WB SET OK VALUE FOR CDGEX CALL
15874: MOV XR,XL COPY TREE POINTER
15875: JSR CDGEX BUILD EXPRESSION BLOCK
15876: ZER R$CIM CLEAR POINTER
15877: MOV =STGXT,STAGE RESTORE STAGE FOR EXECUTE TIME
15878: *
15879: * MERGE HERE IF NO CONVERSION REQUIRED
15880: *
15881: GTEX1 EXI RETURN TO GTEXP CALLER
15882: *
15883: * HERE IF UNCONVERTIBLE
15884: *
15885: GTEX2 EXI 1 TAKE ERROR EXIT
15886: ENP END PROCEDURE GTEXP
15887: EJC
15888: *
15889: * GTINT -- GET INTEGER VALUE
15890: *
15891: * GTINT IS PASSED AN OBJECT AND RETURNS AN INTEGER AFTER
15892: * PERFORMING ANY NECESSARY CONVERSIONS.
15893: *
15894: * (XR) VALUE TO BE CONVERTED
15895: * JSR GTINT CALL TO CONVERT TO INTEGER
15896: * PPM LOC TRANSFER LOC FOR CONVERT IMPOSSIBLE
15897: * (XR) RESULTING INTEGER
15898: * (WC,RA) DESTROYED
15899: * (WA,WB) DESTROYED (ONLY ON CONVERSION ERR)
15900: * (XR) UNCHANGED (ON CONVERT ERROR)
15901: *
15902: GTINT PRC E,1 ENTRY POINT
15903: BEQ (XR),=B$ICL,GTIN2 JUMP IF ALREADY AN INTEGER
15904: MOV WA,GTINA ELSE SAVE WA
15905: MOV WB,GTINB SAVE WB
15906: JSR GTNUM CONVERT TO NUMERIC
15907: PPM GTIN3 JUMP IF UNCONVERTIBLE
15908: .IF .CNRA
15909: .ELSE
15910: BEQ WA,=B$ICL,GTIN1 JUMP IF INTEGER
15911: *
15912: * HERE WE CONVERT A REAL TO INTEGER
15913: *
15914: LDR RCVAL(XR) LOAD REAL VALUE
15915: RTI GTIN3 CONVERT TO INTEGER (ERR IF OVFLOW)
15916: JSR ICBLD IF OK BUILD ICBLK
15917: .FI
15918: *
15919: * HERE AFTER SUCCESSFUL CONVERSION TO INTEGER
15920: *
15921: GTIN1 MOV GTINA,WA RESTORE WA
15922: MOV GTINB,WB RESTORE WB
15923: *
15924: * COMMON EXIT POINT
15925: *
15926: GTIN2 EXI RETURN TO GTINT CALLER
15927: *
15928: * HERE ON CONVERSION ERROR
15929: *
15930: GTIN3 EXI 1 TAKE CONVERT ERROR EXIT
15931: ENP END PROCEDURE GTINT
15932: EJC
15933: *
15934: * GTNUM -- GET NUMERIC VALUE
15935: *
15936: * GTNUM IS GIVEN AN OBJECT AND RETURNS EITHER AN INTEGER
15937: * OR A REAL, PERFORMING ANY NECESSARY CONVERSIONS.
15938: *
15939: * (XR) OBJECT TO BE CONVERTED
15940: * JSR GTNUM CALL TO CONVERT TO NUMERIC
15941: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
15942: * (XR) POINTER TO RESULT (INT OR REAL)
15943: * (WA) FIRST WORD OF RESULT BLOCK
15944: * (WB,WC,RA) DESTROYED
15945: * (XR) UNCHANGED (ON CONVERT ERROR)
15946: *
15947: GTNUM PRC E,1 ENTRY POINT
15948: MOV (XR),WA LOAD FIRST WORD OF BLOCK
15949: BEQ WA,=B$ICL,GTN3A JUMP IF INTEGER (NO CONVERSION)
15950: .IF .CNRA
15951: .ELSE
15952: BEQ WA,=B$RCL,GTN3A JUMP IF REAL (NO CONVERSION)
15953: .FI
15954: *
15955: * AT THIS POINT THE ONLY POSSIBILITY IS TO CONVERT A STRING
15956: * TO AN INTEGER OR REAL AS APPROPRIATE.
15957: *
15958: STI GTNSV SAVE IA
15959: MOV XR,-(XS) STACK ARGUMENT IN CASE CONVERT ERR
15960: MOV XR,-(XS) STACK ARGUMENT FOR GTSTG
15961: JSR GTSTG CONVERT ARGUMENT TO STRING
15962: PPM GTN36 JUMP IF UNCONVERTIBLE
15963: *
15964: * INITIALIZE NUMERIC CONVERSION
15965: *
15966: LDI INTV0 INITIALIZE INTEGER RESULT TO ZERO
15967: BZE WA,GTN32 JUMP TO EXIT WITH ZERO IF NULL
15968: LCT WA,WA SET BCT COUNTER FOR FOLLOWING LOOPS
15969: ZER GTNNF TENTATIVELY INDICATE RESULT +
15970: .IF .CNRA
15971: .ELSE
15972: STI GTNEX INITIALISE EXPONENT TO ZERO
15973: ZER GTNSC ZERO SCALE IN CASE REAL
15974: ZER GTNDF RESET FLAG FOR DEC POINT FOUND
15975: ZER GTNRD RESET FLAG FOR DIGITS FOUND
15976: LDR REAV0 ZERO REAL ACCUM IN CASE REAL
15977: .FI
15978: PLC XR POINT TO ARGUMENT CHARACTERS
15979: *
15980: * MERGE BACK HERE AFTER IGNORING LEADING BLANK
15981: *
15982: GTN01 LCH WB,(XR)+ LOAD FIRST CHARACTER
15983: BLT WB,=CH$D0,GTN02 JUMP IF NOT DIGIT
15984: BLE WB,=CH$D9,GTN06 JUMP IF FIRST CHAR IS A DIGIT
15985: EJC
15986: *
15987: * GTNUM (CONTINUED)
15988: *
15989: * HERE IF FIRST DIGIT IS NON-DIGIT
15990: *
15991: GTN02 BNE WB,=CH$BL,GTN03 JUMP IF NON-BLANK
15992: GTNA2 BCT WA,GTN01 ELSE DECR COUNT AND LOOP BACK
15993: BRN GTN07 JUMP TO RETURN ZERO IF ALL BLANKS
15994: *
15995: * HERE FOR FIRST CHARACTER NON-BLANK, NON-DIGIT
15996: *
15997: GTN03 BEQ WB,=CH$PL,GTN04 JUMP IF PLUS SIGN
15998: .IF .CAHT
15999: BEQ WB,=CH$HT,GTNA2 HORIZONTAL TAB EQUIV TO BLANK
16000: .FI
16001: .IF .CAVT
16002: BEQ WB,=CH$VT,GTNA2 VERTICAL TAB EQUIV TO BLANK
16003: .FI
16004: .IF .CNRA
16005: BNE WB,=CH$MN,GTN36 ELSE FAIL
16006: .ELSE
16007: BNE WB,=CH$MN,GTN12 JUMP IF NOT MINUS (MAY BE REAL)
16008: .FI
16009: MNZ GTNNF IF MINUS SIGN, SET NEGATIVE FLAG
16010: *
16011: * MERGE HERE AFTER PROCESSING SIGN
16012: *
16013: GTN04 BCT WA,GTN05 JUMP IF CHARS LEFT
16014: BRN GTN36 ELSE ERROR
16015: *
16016: * LOOP TO FETCH CHARACTERS OF AN INTEGER
16017: *
16018: GTN05 LCH WB,(XR)+ LOAD NEXT CHARACTER
16019: BLT WB,=CH$D0,GTN08 JUMP IF NOT A DIGIT
16020: BGT WB,=CH$D9,GTN08 JUMP IF NOT A DIGIT
16021: *
16022: * MERGE HERE FOR FIRST DIGIT
16023: *
16024: GTN06 STI GTNSI SAVE CURRENT VALUE
16025: .IF .CNRA
16026: CVM GTN36 CURRENT*10-(NEW DIG) JUMP IF OVFLOW
16027: .ELSE
16028: CVM GTN35 CURRENT*10-(NEW DIG) JUMP IF OVFLOW
16029: MNZ GTNRD SET DIGIT READ FLAG
16030: .FI
16031: BCT WA,GTN05 ELSE LOOP BACK IF MORE CHARS
16032: *
16033: * HERE TO EXIT WITH CONVERTED INTEGER VALUE
16034: *
16035: GTN07 BNZ GTNNF,GTN32 JUMP IF NEGATIVE (ALL SET)
16036: NGI ELSE NEGATE
16037: INO GTN32 JUMP IF NO OVERFLOW
16038: BRN GTN36 ELSE SIGNAL ERROR
16039: EJC
16040: *
16041: * GTNUM (CONTINUED)
16042: *
16043: * HERE FOR A NON-DIGIT CHARACTER WHILE ATTEMPTING TO
16044: * CONVERT AN INTEGER, CHECK FOR TRAILING BLANKS OR REAL.
16045: *
16046: GTN08 BEQ WB,=CH$BL,GTNA9 JUMP IF A BLANK
16047: .IF .CAHT
16048: BEQ WB,=CH$HT,GTNA9 JUMP IF HORIZONTAL TAB
16049: .FI
16050: .IF .CAVT
16051: BEQ WB,=CH$VT,GTNA9 JUMP IF VERTICAL TAB
16052: .FI
16053: .IF .CNRA
16054: BRN GTN36 ERROR
16055: .ELSE
16056: ITR ELSE CONVERT INTEGER TO REAL
16057: NGR NEGATE TO GET POSITIVE VALUE
16058: BRN GTN12 JUMP TO TRY FOR REAL
16059: .FI
16060: *
16061: * HERE WE SCAN OUT BLANKS TO END OF STRING
16062: *
16063: GTN09 LCH WB,(XR)+ GET NEXT CHAR
16064: .IF .CAHT
16065: BEQ WB,=CH$HT,GTNA9 JUMP IF HORIZONTAL TAB
16066: .FI
16067: .IF .CAVT
16068: BEQ WB,=CH$VT,GTNA9 JUMP IF VERTICAL TAB
16069: .FI
16070: BNE WB,=CH$BL,GTN36 ERROR IF NON-BLANK
16071: GTNA9 BCT WA,GTN09 LOOP BACK IF MORE CHARS TO CHECK
16072: BRN GTN07 RETURN INTEGER IF ALL BLANKS
16073: .IF .CNRA
16074: .ELSE
16075: *
16076: * LOOP TO COLLECT MANTISSA OF REAL
16077: *
16078: GTN10 LCH WB,(XR)+ LOAD NEXT CHARACTER
16079: BLT WB,=CH$D0,GTN12 JUMP IF NON-NUMERIC
16080: BGT WB,=CH$D9,GTN12 JUMP IF NON-NUMERIC
16081: *
16082: * MERGE HERE TO COLLECT FIRST REAL DIGIT
16083: *
16084: GTN11 SUB =CH$D0,WB CONVERT DIGIT TO NUMBER
16085: MLR REAVT MULTIPLY REAL BY 10.0
16086: ROV GTN36 CONVERT ERROR IF OVERFLOW
16087: STR GTNSR SAVE RESULT
16088: MTI WB GET NEW DIGIT AS INTEGER
16089: ITR CONVERT NEW DIGIT TO REAL
16090: ADR GTNSR ADD TO GET NEW TOTAL
16091: ADD GTNDF,GTNSC INCREMENT SCALE IF AFTER DEC POINT
16092: MNZ GTNRD SET DIGIT FOUND FLAG
16093: BCT WA,GTN10 LOOP BACK IF MORE CHARS
16094: BRN GTN22 ELSE JUMP TO SCALE
16095: EJC
16096: *
16097: * GTNUM (CONTINUED)
16098: *
16099: * HERE IF NON-DIGIT FOUND WHILE COLLECTING A REAL
16100: *
16101: GTN12 BNE WB,=CH$DT,GTN13 JUMP IF NOT DEC POINT
16102: BNZ GTNDF,GTN36 IF DEC POINT, ERROR IF ONE ALREADY
16103: MOV =NUM01,GTNDF ELSE SET FLAG FOR DEC POINT
16104: BCT WA,GTN10 LOOP BACK IF MORE CHARS
16105: BRN GTN22 ELSE JUMP TO SCALE
16106: *
16107: * HERE IF NOT DECIMAL POINT
16108: *
16109: GTN13 BEQ WB,=CH$LE,GTN15 JUMP IF E FOR EXPONENT
16110: BEQ WB,=CH$LD,GTN15 JUMP IF D FOR EXPONENT
16111: .IF .CASL
16112: BEQ WB,=CH$$E,GTN15 JUMP FOR EXPT
16113: BEQ WB,=CH$$D,GTN15 JUMP FOR EXPT
16114: .FI
16115: *
16116: * HERE CHECK FOR TRAILING BLANKS
16117: *
16118: GTN14 BEQ WB,=CH$BL,GTNB4 JUMP IF BLANK
16119: .IF .CAHT
16120: BEQ WB,=CH$HT,GTNB4 JUMP IF HORIZONTAL TAB
16121: .FI
16122: .IF .CAVT
16123: BEQ WB,=CH$VT,GTNB4 JUMP IF VERTICAL TAB
16124: .FI
16125: BRN GTN36 ERROR IF NON-BLANK
16126: *
16127: GTNB4 LCH WB,(XR)+ GET NEXT CHARACTER
16128: BCT WA,GTN14 LOOP BACK TO CHECK IF MORE
16129: BRN GTN22 ELSE JUMP TO SCALE
16130: *
16131: * HERE TO READ AND PROCESS AN EXPONENT
16132: *
16133: GTN15 ZER GTNES SET EXPONENT SIGN POSITIVE
16134: LDI INTV0 INITIALIZE EXPONENT TO ZERO
16135: MNZ GTNDF RESET NO DEC POINT INDICATION
16136: BCT WA,GTN16 JUMP SKIPPING PAST E OR D
16137: BRN GTN36 ERROR IF NULL EXPONENT
16138: *
16139: * CHECK FOR EXPONENT SIGN
16140: *
16141: GTN16 LCH WB,(XR)+ LOAD FIRST EXPONENT CHARACTER
16142: BEQ WB,=CH$PL,GTN17 JUMP IF PLUS SIGN
16143: BNE WB,=CH$MN,GTN19 ELSE JUMP IF NOT MINUS SIGN
16144: MNZ GTNES SET SIGN NEGATIVE IF MINUS SIGN
16145: *
16146: * MERGE HERE AFTER PROCESSING EXPONENT SIGN
16147: *
16148: GTN17 BCT WA,GTN18 JUMP IF CHARS LEFT
16149: BRN GTN36 ELSE ERROR
16150: *
16151: * LOOP TO CONVERT EXPONENT DIGITS
16152: *
16153: GTN18 LCH WB,(XR)+ LOAD NEXT CHARACTER
16154: EJC
16155: *
16156: * GTNUM (CONTINUED)
16157: *
16158: * MERGE HERE FOR FIRST EXPONENT DIGIT
16159: *
16160: GTN19 BLT WB,=CH$D0,GTN20 JUMP IF NOT DIGIT
16161: BGT WB,=CH$D9,GTN20 JUMP IF NOT DIGIT
16162: CVM GTN36 ELSE CURRENT*10, SUBTRACT NEW DIGIT
16163: BCT WA,GTN18 LOOP BACK IF MORE CHARS
16164: BRN GTN21 JUMP IF EXPONENT FIELD IS EXHAUSTED
16165: *
16166: * HERE TO CHECK FOR TRAILING BLANKS AFTER EXPONENT
16167: *
16168: GTN20 BEQ WB,=CH$BL,GTNC0 JUMP IF BLANK
16169: .IF .CAHT
16170: BEQ WB,=CH$HT,GTNC0 JUMP IF HORIZONTAL TAB
16171: .FI
16172: .IF .CAVT
16173: BEQ WC,=CH$VT,GTNC0 JUMP IF VERTICAL TAB
16174: .FI
16175: BRN GTN36 ERROR IF NON-BLANK
16176: *
16177: GTNC0 LCH WB,(XR)+ GET NEXT CHARACTER
16178: BCT WA,GTN20 LOOP BACK TILL ALL BLANKS SCANNED
16179: *
16180: * MERGE HERE AFTER COLLECTING EXPONENT
16181: *
16182: GTN21 STI GTNEX SAVE COLLECTED EXPONENT
16183: BNZ GTNES,GTN22 JUMP IF IT WAS NEGATIVE
16184: NGI ELSE COMPLEMENT
16185: IOV GTN36 ERROR IF OVERFLOW
16186: STI GTNEX AND STORE POSITIVE EXPONENT
16187: *
16188: * MERGE HERE WITH EXPONENT (0 IF NONE GIVEN)
16189: *
16190: GTN22 BZE GTNRD,GTN36 ERROR IF NOT DIGITS COLLECTED
16191: BZE GTNDF,GTN36 ERROR IF NO EXPONENT OR DEC POINT
16192: MTI GTNSC ELSE LOAD SCALE AS INTEGER
16193: SBI GTNEX SUBTRACT EXPONENT
16194: IOV GTN36 ERROR IF OVERFLOW
16195: ILT GTN26 JUMP IF WE MUST SCALE UP
16196: *
16197: * HERE WE HAVE A NEGATIVE EXPONENT, SO SCALE DOWN
16198: *
16199: MFI WA,GTN36 LOAD SCALE FACTOR, ERR IF OVFLOW
16200: *
16201: * LOOP TO SCALE DOWN IN STEPS OF 10**10
16202: *
16203: GTN23 BLE WA,=NUM10,GTN24 JUMP IF 10 OR LESS TO GO
16204: DVR REATT ELSE DIVIDE BY 10**10
16205: SUB =NUM10,WA DECREMENT SCALE
16206: BRN GTN23 AND LOOP BACK
16207: EJC
16208: *
16209: * GTNUM (CONTINUED)
16210: *
16211: * HERE SCALE REST OF WAY FROM POWERS OF TEN TABLE
16212: *
16213: GTN24 BZE WA,GTN30 JUMP IF SCALED
16214: LCT WB,=CFP$R ELSE GET INDEXING FACTOR
16215: MOV =REAV1,XR POINT TO POWERS OF TEN TABLE
16216: WTB WA CONVERT REMAINING SCALE TO BAU OFS
16217: *
16218: * LOOP TO POINT TO POWERS OF TEN TABLE ENTRY
16219: *
16220: GTN25 ADD WA,XR BUMP POINTER
16221: BCT WB,GTN25 ONCE FOR EACH VALUE WORD
16222: DVR (XR) SCALE DOWN AS REQUIRED
16223: BRN GTN30 AND JUMP
16224: *
16225: * COME HERE TO SCALE RESULT UP (POSITIVE EXPONENT)
16226: *
16227: GTN26 NGI GET ABSOLUTE VALUE OF EXPONENT
16228: IOV GTN36 ERROR IF OVERFLOW
16229: MFI WA,GTN36 ACQUIRE SCALE, ERROR IF OVFLOW
16230: *
16231: * LOOP TO SCALE UP IN STEPS OF 10**10
16232: *
16233: GTN27 BLE WA,=NUM10,GTN28 JUMP IF 10 OR LESS TO GO
16234: MLR REATT ELSE MULTIPLY BY 10**10
16235: ROV GTN36 ERROR IF OVERFLOW
16236: SUB =NUM10,WA ELSE DECREMENT SCALE
16237: BRN GTN27 AND LOOP BACK
16238: *
16239: * HERE TO SCALE UP REST OF WAY WITH TABLE
16240: *
16241: GTN28 BZE WA,GTN30 JUMP IF SCALED
16242: LCT WB,=CFP$R ELSE GET INDEXING FACTOR
16243: MOV =REAV1,XR POINT TO POWERS OF TEN TABLE
16244: WTB WA CONVERT REMAINING SCALE TO BAU OFS
16245: *
16246: * LOOP TO POINT TO PROPER ENTRY IN POWERS OF TEN TABLE
16247: *
16248: GTN29 ADD WA,XR BUMP POINTER
16249: BCT WB,GTN29 ONCE FOR EACH WORD IN VALUE
16250: MLR (XR) SCALE UP
16251: ROV GTN36 ERROR IF OVERFLOW
16252: EJC
16253: *
16254: * GTNUM (CONTINUED)
16255: *
16256: * HERE WITH REAL VALUE SCALED AND READY EXCEPT FOR SIGN
16257: *
16258: GTN30 BZE GTNNF,GTN31 JUMP IF POSITIVE
16259: NGR ELSE NEGATE
16260: *
16261: * HERE WITH PROPERLY SIGNED REAL VALUE IN (RA)
16262: *
16263: GTN31 JSR RCBLD BUILD REAL BLOCK
16264: BRN GTN33 MERGE TO EXIT
16265: .FI
16266: *
16267: * HERE WITH PROPERLY SIGNED INTEGER VALUE IN (IA)
16268: *
16269: GTN32 JSR ICBLD BUILD ICBLK
16270: *
16271: * REAL MERGES HERE
16272: *
16273: GTN33 MOV (XR),WA LOAD FIRST WORD OF RESULT BLOCK
16274: ICA XS POP ARGUMENT OFF STACK
16275: *
16276: * COMMON EXIT POINT
16277: *
16278: GTN34 LDI GTNSV RECOVER IA
16279: GTN3A EXI RETURN TO GTNUM CALLER
16280: .IF .CNRA
16281: .ELSE
16282: *
16283: * COME HERE IF OVERFLOW OCCURS DURING COLLECTION OF INTEGER
16284: *
16285: GTN35 LDI GTNSI RELOAD INTEGER SO FAR
16286: ITR CONVERT TO REAL
16287: NGR MAKE VALUE POSITIVE
16288: BRN GTN11 MERGE WITH REAL CIRCUIT
16289: .FI
16290: *
16291: * HERE FOR UNCONVERTIBLE TO STRING OR CONVERSION ERROR
16292: *
16293: GTN36 MOV (XS)+,XR RELOAD ORIGINAL ARGUMENT
16294: LDI GTNSV RECOVER IA
16295: EXI 1 TAKE CONVERT-ERROR EXIT
16296: ENP END PROCEDURE GTNUM
16297: EJC
16298: *
16299: * GTNVR -- CONVERT TO NATURAL VARIABLE
16300: *
16301: * GTNVR LOCATES A VARIABLE BLOCK (VRBLK) GIVEN EITHER AN
16302: * APPROPRIATE NAME (NMBLK) OR A NON-NULL STRING (SCBLK).
16303: *
16304: * (XR) ARGUMENT
16305: * JSR GTNVR CALL TO CONVERT TO NATURAL VARIABLE
16306: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
16307: * (XR) POINTER TO VRBLK
16308: * (WC) DESTROYED
16309: *
16310: GTNVR PRC E,1 ENTRY POINT
16311: BNE (XR),=B$NML,GNV02 JUMP IF NOT NAME
16312: MOV NMBAS(XR),XR ELSE LOAD NAME BASE IF NAME
16313: BLO XR,STATE,GNV07 SKIP IF VRBLK (IN STATIC REGION)
16314: BRN GNV01 FAIL
16315: *
16316: * RESTORE REGS AND FAIL
16317: *
16318: GNV00 MOV GNVSA,WA RESTORE REGS
16319: MOV GNVSB,WB
16320: *
16321: * COMMON ERROR EXIT
16322: *
16323: GNV01 EXI 1 TAKE CONVERT-ERROR EXIT
16324: *
16325: * HERE IF NOT NAME
16326: *
16327: GNV02 MOV WA,GNVSA SAVE WA
16328: MOV WB,GNVSB SAVE WB
16329: MOV XR,-(XS) STACK ARGUMENT FOR GTSTG
16330: JSR GTSTG CONVERT ARGUMENT TO STRING
16331: PPM GNV00 JUMP IF CONVERSION ERROR
16332: BZE WA,GNV00 NULL STRING IS AN ERROR
16333: MOV XL,-(XS) SAVE XL
16334: .IF .CASL
16335: MOV XR,XL COPY STRING POINTER
16336: ZER WB ZERO OFFSET
16337: JSR SBSTG CONVERT TO PREFERRED CASE
16338: MOV SCLEN(XR),WA RECOVER STRING LENGTH
16339: .FI
16340: MOV XR,-(XS) STACK STRING PTR FOR LATER
16341: MOV XR,WB COPY STRING POINTER
16342: ADD *SCHAR,WB POINT TO CHARACTERS OF STRING
16343: MOV WB,GNVST SAVE POINTER TO CHARACTERS
16344: MOV WA,WB COPY LENGTH
16345: CTW WB,0 GET NUMBER OF WORDS IN NAME
16346: MOV WB,GNVNW SAVE FOR LATER
16347: JSR HASHS COMPUTE HASH INDEX FOR STRING
16348: RMI HSHNB COMPUTE HASH OFFSET BY TAKING MOD
16349: MFI WC GET AS OFFSET
16350: WTB WC CONVERT OFFSET TO BAUS
16351: ADD HSHTB,WC POINT TO PROPER HASH CHAIN
16352: SUB *VRNXT,WC SUBTRACT OFFSET TO MERGE INTO LOOP
16353: EJC
16354: *
16355: * GTNVR (CONTINUED)
16356: *
16357: * LOOP TO SEARCH HASH CHAIN
16358: *
16359: GNV03 MOV WC,XL COPY HASH CHAIN POINTER
16360: MOV VRNXT(XL),XL POINT TO NEXT VRBLK ON CHAIN
16361: BZE XL,GNV08 JUMP IF END OF CHAIN
16362: MOV XL,WC SAVE POINTER TO THIS VRBLK
16363: BNZ VRLEN(XL),GNV04 JUMP IF NOT SYSTEM VARIABLE
16364: MOV VRSVP(XL),XL ELSE POINT TO SVBLK
16365: SUB *VRSOF,XL ADJUST OFFSET FOR MERGE
16366: *
16367: * MERGE HERE WITH STRING PTR (LIKE VRBLK) IN XL
16368: *
16369: GNV04 BNE WA,VRLEN(XL),GNV03 BACK FOR NEXT VRBLK IF LENGTHS NE
16370: ADD *VRCHS,XL ELSE POINT TO CHARS OF CHAIN ENTRY
16371: LCT WB,GNVNW GET WORD COUNTER TO CONTROL LOOP
16372: MOV GNVST,XR POINT TO CHARS OF NEW NAME
16373: *
16374: * LOOP TO COMPARE CHARACTERS OF THE TWO NAMES
16375: *
16376: GNV05 CNE (XR),(XL),GNV03 JUMP IF NO MATCH FOR NEXT VRBLK
16377: ICA XR BUMP NEW NAME POINTER
16378: ICA XL BUMP VRBLK IN CHAIN NAME POINTER
16379: BCT WB,GNV05 ELSE LOOP TILL ALL COMPARED
16380: MOV WC,XR WE HAVE FOUND A MATCH, GET VRBLK
16381: *
16382: * EXIT POINT AFTER FINDING VRBLK OR BUILDING NEW ONE
16383: *
16384: GNV06 MOV GNVSA,WA RESTORE WA
16385: MOV GNVSB,WB RESTORE WB
16386: ICA XS POP STRING POINTER
16387: MOV (XS)+,XL RESTORE XL
16388: *
16389: * COMMON EXIT POINT
16390: *
16391: GNV07 EXI RETURN TO GTNVR CALLER
16392: *
16393: * NOT FOUND, PREPARE TO SEARCH SYSTEM VARIABLE TABLE
16394: *
16395: GNV08 ZER XR CLEAR GARBAGE XR POINTER
16396: MOV WC,GNVHE SAVE PTR TO END OF HASH CHAIN
16397: BGT WA,=NUM09,GNV14 CANNOT BE SYSTEM VAR IF LENGTH GT 9
16398: MOV WA,XL ELSE COPY LENGTH
16399: WTB XL CONVERT TO BAU OFFSET
16400: MOV VSRCH(XL),XL POINT TO FIRST SVBLK OF THIS LENGTH
16401: EJC
16402: *
16403: * GTNVR (CONTINUED)
16404: *
16405: * LOOP TO SEARCH ENTRIES IN STANDARD VARIABLE TABLE
16406: *
16407: GNV09 MOV XL,GNVSP SAVE TABLE POINTER
16408: MOV (XL)+,WC LOAD SVBIT BIT STRING
16409: MOV (XL)+,WB LOAD LENGTH FROM TABLE ENTRY
16410: BNE WA,WB,GNV14 JUMP IF END OF RIGHT LENGTH ENTIRES
16411: LCT WB,GNVNW GET WORD COUNTER TO CONTROL LOOP
16412: MOV GNVST,XR POINT TO CHARS OF NEW NAME
16413: *
16414: * LOOP TO CHECK FOR MATCHING NAMES
16415: *
16416: GNV10 CNE (XR),(XL),GNV11 JUMP IF NAME MISMATCH
16417: ICA XR ELSE BUMP NEW NAME POINTER
16418: ICA XL BUMP SVBLK POINTER
16419: BCT WB,GNV10 ELSE LOOP UNTIL ALL CHECKED
16420: *
16421: * HERE WE HAVE A MATCH IN THE STANDARD VARIABLE TABLE
16422: *
16423: ZER WC SET VRLEN VALUE ZERO
16424: MOV *VRSI$,WA SET STANDARD SIZE
16425: BRN GNV15 JUMP TO BUILD VRBLK
16426: *
16427: * HERE IF NO MATCH WITH TABLE ENTRY IN SVBLKS TABLE
16428: *
16429: GNV11 ICA XL BUMP PAST WORD OF CHARS
16430: BCT WB,GNV11 LOOP BACK IF MORE TO GO
16431: RSH WC,SVNBT REMOVE UNINTERESTING BITS
16432: *
16433: * LOOP TO BUMP TABLE PTR FOR EACH FLAGGED WORD
16434: *
16435: GNV12 MOV BITS1,WB LOAD BIT TO TEST
16436: ANB WC,WB TEST FOR WORD PRESENT
16437: ZRB WB,GNV13 JUMP IF NOT PRESENT
16438: ICA XL ELSE BUMP TABLE POINTER
16439: *
16440: * HERE AFTER DEALING WITH ONE WORD (ONE BIT)
16441: *
16442: GNV13 RSH WC,1 REMOVE BIT ALREADY PROCESSED
16443: NZB WC,GNV12 LOOP BACK IF MORE BITS TO TEST
16444: BRN GNV09 ELSE LOOP BACK FOR NEXT SVBLK
16445: *
16446: * HERE IF NOT SYSTEM VARIABLE
16447: *
16448: GNV14 MOV WA,WC COPY VRLEN VALUE
16449: MOV =VRCHS,WA LOAD STANDARD SIZE -CHARS
16450: ADD GNVNW,WA ADJUST FOR CHARS OF NAME
16451: WTB WA CONVERT LENGTH TO BAUS
16452: EJC
16453: *
16454: * GTNVR (CONTINUED)
16455: *
16456: * MERGE HERE TO BUILD VRBLK
16457: *
16458: GNV15 JSR ALOST ALLOCATE SPACE FOR VRBLK (STATIC)
16459: MOV XR,WB SAVE VRBLK POINTER
16460: MOV =STNVR,XL POINT TO MODEL VARIABLE BLOCK
16461: MOV *VRLEN,WA SET LENGTH OF STANDARD FIELDS
16462: MVW SET INITIAL FIELDS OF NEW BLOCK
16463: MOV GNVHE,XL LOAD POINTER TO END OF HASH CHAIN
16464: MOV WB,VRNXT(XL) ADD NEW BLOCK TO END OF CHAIN
16465: MOV WC,(XR)+ SET VRLEN FIELD, BUMP PTR
16466: MOV GNVNW,WA GET LENGTH IN WORDS
16467: WTB WA CONVERT TO LENGTH IN BAUS
16468: BZE WC,GNV16 JUMP IF SYSTEM VARIABLE
16469: *
16470: * HERE FOR NON-SYSTEM VARIABLE -- SET CHARS OF NAME
16471: *
16472: MOV (XS),XL POINT BACK TO STRING NAME
16473: ADD *SCHAR,XL POINT TO CHARS OF NAME
16474: MVW MOVE CHARACTERS INTO PLACE
16475: MOV WB,XR RESTORE VRBLK POINTER
16476: BRN GNV06 JUMP BACK TO EXIT
16477: *
16478: * HERE FOR SYSTEM VARIABLE CASE TO FILL IN FIELDS WHERE
16479: * NECESSARY FROM THE FIELDS PRESENT IN THE SVBLK.
16480: *
16481: GNV16 MOV GNVSP,XL LOAD POINTER TO SVBLK
16482: MOV XL,(XR) SET SVBLK PTR IN VRBLK
16483: MOV WB,XR RESTORE VRBLK POINTER
16484: MOV SVBIT(XL),WB LOAD BIT INDICATORS
16485: ADD *SVCHS,XL POINT TO CHARACTERS OF NAME
16486: ADD WA,XL POINT PAST CHARACTERS
16487: *
16488: * SKIP PAST KEYWORD NUMBER (SVKNM) IF PRESENT
16489: *
16490: MOV BTKNM,WC LOAD TEST BIT
16491: ANB WB,WC AND TO TEST
16492: ZRB WC,GNV17 JUMP IF NO KEYWORD NUMBER
16493: ICA XL ELSE BUMP POINTER
16494: EJC
16495: *
16496: * GTNVR (CONTINUED)
16497: *
16498: * HERE TEST FOR FUNCTION (SVFNC AND SVNAR)
16499: *
16500: GNV17 MOV BTFNC,WC GET TEST BIT
16501: ANB WB,WC AND TO TEST
16502: ZRB WC,GNV18 SKIP IF NO SYSTEM FUNCTION
16503: MOV XL,VRFNC(XR) ELSE POINT VRFNC TO SVFNC FIELD
16504: ADD *NUM02,XL AND BUMP PAST SVFNC, SVNAR FIELDS
16505: *
16506: * NOW TEST FOR LABEL (SVLBL)
16507: *
16508: GNV18 MOV BTLBL,WC GET TEST BIT
16509: ANB WB,WC AND TO TEST
16510: ZRB WC,GNV19 JUMP IF BIT IS OFF (NO SYSTEM LABL)
16511: MOV XL,VRLBL(XR) ELSE POINT VRLBL TO SVLBL FIELD
16512: ICA XL BUMP PAST SVLBL FIELD
16513: *
16514: * NOW TEST FOR VALUE (SVVAL)
16515: *
16516: GNV19 MOV BTVAL,WC LOAD TEST BIT
16517: ANB WB,WC AND TO TEST
16518: ZRB WC,GNV06 ALL DONE IF NO VALUE
16519: MOV (XL),VRVAL(XR) ELSE SET INITIAL VALUE
16520: MOV =B$VRE,VRSTO(XR) SET ERROR STORE ACCESS
16521: BRN GNV06 MERGE BACK TO EXIT TO CALLER
16522: ENP END PROCEDURE GTNVR
16523: EJC
16524: *
16525: * GTPAT -- GET PATTERN
16526: *
16527: * GTPAT IS PASSED AN OBJECT IN (XR) AND RETURNS A
16528: * PATTERN AFTER PERFORMING ANY NECESSARY CONVERSIONS
16529: *
16530: * (XR) INPUT ARGUMENT
16531: * JSR GTPAT CALL TO CONVERT TO PATTERN
16532: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
16533: * (XR) RESULTING PATTERN
16534: * (WA) DESTROYED
16535: * (WB) DESTROYED (ONLY ON CONVERT ERROR)
16536: * (XR) UNCHANGED (ONLY ON CONVERT ERROR)
16537: *
16538: GTPAT PRC E,1 ENTRY POINT
16539: BHI (XR),=P$AAA,GTPT5 JUMP IF PATTERN ALREADY
16540: *
16541: * HERE IF NOT PATTERN, TRY FOR STRING
16542: *
16543: MOV WB,GTPSB SAVE WB
16544: MOV XR,-(XS) STACK ARGUMENT FOR GTSTG
16545: JSR GTSTG CONVERT ARGUMENT TO STRING
16546: PPM GTPT2 JUMP IF IMPOSSIBLE
16547: *
16548: * HERE WE HAVE A STRING
16549: *
16550: BNZ WA,GTPT1 JUMP IF NON-NULL
16551: *
16552: * HERE FOR NULL STRING. GENERATE POINTER TO NULL PATTERN.
16553: *
16554: MOV =NDNTH,XR POINT TO NOTHEN NODE
16555: BRN GTPT4 JUMP TO EXIT
16556: EJC
16557: *
16558: * GTPAT (CONTINUED)
16559: *
16560: * HERE FOR NON-NULL STRING
16561: *
16562: GTPT1 MOV =P$STR,WB LOAD PCODE FOR MULTI-CHAR STRING
16563: BNE WA,=NUM01,GTPT3 JUMP IF MULTI-CHAR STRING
16564: *
16565: * HERE FOR ONE CHARACTER STRING, SHARE ONE CHARACTER ANY
16566: *
16567: PLC XR POINT TO CHARACTER
16568: LCH WA,(XR) LOAD CHARACTER
16569: MOV WA,XR SET AS PARM1
16570: MOV =P$ANS,WB POINT TO PCODE FOR 1-CHAR ANY
16571: BRN GTPT3 JUMP TO BUILD NODE
16572: *
16573: * HERE IF ARGUMENT IS NOT CONVERTIBLE TO STRING
16574: *
16575: GTPT2 MOV =P$EXA,WB SET PCODE FOR EXPRESSION IN CASE
16576: BLO (XR),=B$E$$,GTPT3 JUMP TO BUILD NODE IF EXPRESSION
16577: *
16578: * HERE WE HAVE AN ERROR (CONVERSION IMPOSSIBLE)
16579: *
16580: EXI 1 TAKE CONVERT ERROR EXIT
16581: *
16582: * MERGE HERE TO BUILD NODE FOR STRING OR EXPRESSION
16583: *
16584: GTPT3 JSR PBILD CALL ROUTINE TO BUILD PATTERN NODE
16585: *
16586: * COMMON EXIT AFTER SUCCESSFUL CONVERSION
16587: *
16588: GTPT4 MOV GTPSB,WB RESTORE WB
16589: *
16590: * MERGE HERE TO EXIT IF NO CONVERSION REQUIRED
16591: *
16592: GTPT5 EXI RETURN TO GTPAT CALLER
16593: ENP END PROCEDURE GTPAT
16594: .IF .CNRA
16595: .ELSE
16596: EJC
16597: *
16598: * GTREA -- GET REAL VALUE
16599: *
16600: * GTREA IS PASSED AN OBJECT AND RETURNS A REAL VALUE
16601: * PERFORMING ANY NECESSARY CONVERSIONS.
16602: *
16603: * (XR) OBJECT TO BE CONVERTED
16604: * JSR GTREA CALL TO CONVERT OBJECT TO REAL
16605: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
16606: * (XR) POINTER TO RESULTING REAL
16607: * (WA,WB,WC,RA) DESTROYED
16608: * (XR) UNCHANGED (CONVERT ERROR ONLY)
16609: *
16610: GTREA PRC E,1 ENTRY POINT
16611: MOV (XR),WA GET FIRST WORD OF BLOCK
16612: BEQ WA,=B$RCL,GTRE2 JUMP IF REAL
16613: JSR GTNUM ELSE CONVERT ARGUMENT TO NUMERIC
16614: PPM GTRE3 JUMP IF UNCONVERTIBLE
16615: BEQ WA,=B$RCL,GTRE2 JUMP IF REAL WAS RETURNED
16616: *
16617: * HERE FOR CASE OF AN INTEGER TO CONVERT TO REAL
16618: *
16619: GTRE1 LDI ICVAL(XR) LOAD INTEGER
16620: ITR CONVERT TO REAL
16621: JSR RCBLD BUILD RCBLK
16622: *
16623: * EXIT WITH REAL
16624: *
16625: GTRE2 EXI RETURN TO GTREA CALLER
16626: *
16627: * HERE ON CONVERSION ERROR
16628: *
16629: GTRE3 EXI 1 TAKE CONVERT ERROR EXIT
16630: ENP END PROCEDURE GTREA
16631: .FI
16632: EJC
16633: *
16634: * GTSMI -- GET SMALL INTEGER
16635: *
16636: * GTSMI IS PASSED A SNOBOL OBJECT AND RETURNS AN ADDRESS
16637: * INTEGER IN THE RANGE (0 LE N LE DNAMB). SUCH A VALUE CAN
16638: * ONLY BE DERIVED FROM AN INTEGER IN THE APPROPRIATE RANGE.
16639: * SMALL INTEGERS NEVER APPEAR AS SNOBOL VALUES. HOWEVER,
16640: * THEY ARE USED INTERNALLY FOR A VARIETY OF PURPOSES.
16641: *
16642: * -(XS) ARGUMENT TO CONVERT (ON STACK)
16643: * JSR GTSMI CALL TO CONVERT TO SMALL INTEGER
16644: * PPM LOC TRANSFER LOC FOR NOT INTEGER
16645: * PPM LOC TRANSFER LOC FOR LT 0, GT DNAMB
16646: * (XR,WC) RESULTING SMALL INT (TWO COPIES)
16647: * (XS) POPPED
16648: * (RA) DESTROYED
16649: * (WA,WB) DESTROYED (ON CONVERT ERROR ONLY)
16650: * (XR) INPUT ARG (CONVERT ERROR ONLY)
16651: *
16652: GTSMI PRC N,2 ENTRY POINT
16653: MOV (XS)+,XR LOAD ARGUMENT
16654: BEQ (XR),=B$ICL,GTSM1 SKIP IF ALREADY AN INTEGER
16655: *
16656: * HERE IF NOT AN INTEGER
16657: *
16658: JSR GTINT CONVERT ARGUMENT TO INTEGER
16659: PPM GTSM2 JUMP IF CONVERT IS IMPOSSIBLE
16660: *
16661: * MERGE HERE WITH INTEGER
16662: *
16663: GTSM1 LDI ICVAL(XR) LOAD INTEGER VALUE
16664: MFI WC,GTSM3 MOVE AS ONE WORD, JUMP IF OVFLOW
16665: BGT WC,MXLEN,GTSM3 OR IF TOO LARGE
16666: MOV WC,XR COPY RESULT TO XR
16667: EXI RETURN TO GTSMI CALLER
16668: *
16669: * HERE IF UNCONVERTIBLE TO INTEGER
16670: *
16671: GTSM2 EXI 1 TAKE NON-INTEGER ERROR EXIT
16672: *
16673: * HERE IF OUT OF RANGE
16674: *
16675: GTSM3 EXI 2 TAKE OUT-OF-RANGE ERROR EXIT
16676: ENP END PROCEDURE GTSMI
16677: EJC
16678: *
16679: * GTSTG -- GET STRING
16680: *
16681: * GTSTG IS PASSED AN OBJECT AND RETURNS A STRING WITH
16682: * ANY NECESSARY CONVERSIONS PERFORMED.
16683: *
16684: * -(XS) INPUT ARGUMENT (ON STACK)
16685: * JSR GTSTG CALL TO CONVERT TO STRING
16686: * PPM LOC TRANSFER LOC IF CONVERT IMPOSSIBLE
16687: * (XR) POINTER TO RESULTING STRING
16688: * (WA) LENGTH OF STRING IN CHARACTERS
16689: * (XS) POPPED
16690: * (RA) DESTROYED
16691: * (XR) INPUT ARG (CONVERT ERROR ONLY)
16692: *
16693: GTSTG PRC N,1 ENTRY POINT
16694: MOV (XS)+,XR LOAD ARGUMENT, POP STACK
16695: BEQ (XR),=B$SCL,GTS30 JUMP IF ALREADY A STRING
16696: *
16697: * HERE IF NOT A STRING ALREADY
16698: *
16699: GTS01 MOV XR,-(XS) RESTACK ARGUMENT IN CASE ERROR
16700: MOV XL,-(XS) SAVE XL
16701: MOV WB,GTSVB SAVE WB
16702: MOV WC,GTSVC SAVE WC
16703: MOV (XR),WA LOAD FIRST WORD OF BLOCK
16704: BEQ WA,=B$ICL,GTS05 JUMP TO CONVERT INTEGER
16705: .IF .CNRA
16706: .ELSE
16707: BEQ WA,=B$RCL,GTS10 JUMP TO CONVERT REAL
16708: .FI
16709: BEQ WA,=B$NML,GTS03 JUMP TO CONVERT NAME
16710: .IF .CNBF
16711: .ELSE
16712: BEQ WA,=B$BCT,GTS32 JUMP TO CONVERT BUFFER
16713: .FI
16714: *
16715: * HERE ON CONVERSION ERROR
16716: *
16717: GTS02 MOV (XS)+,XL RESTORE XL
16718: MOV (XS)+,XR RELOAD INPUT ARGUMENT
16719: EXI 1 TAKE CONVERT ERROR EXIT
16720: EJC
16721: *
16722: * GTSTG (CONTINUED)
16723: *
16724: * HERE TO CONVERT A NAME (ONLY POSSIBLE IF NATURAL VAR)
16725: *
16726: GTS03 MOV NMBAS(XR),XL LOAD NAME BASE
16727: BHI XL,STATE,GTS02 ERROR IF NOT NATURAL VAR (STATIC)
16728: ADD *VRSOF,XL ELSE POINT TO POSSIBLE STRING NAME
16729: MOV SCLEN(XL),WA LOAD LENGTH
16730: BNZ WA,GTS04 JUMP IF NOT SYSTEM VARIABLE
16731: MOV VRSVO(XL),XL ELSE POINT TO SVBLK
16732: MOV SVLEN(XL),WA AND LOAD NAME LENGTH
16733: *
16734: * MERGE HERE WITH STRING IN XR, LENGTH IN WA
16735: *
16736: GTS04 ZER WB SET OFFSET TO ZERO
16737: JSR SBSTR USE SBSTR TO COPY STRING
16738: BRN GTS29 JUMP TO EXIT
16739: *
16740: * COME HERE TO CONVERT AN INTEGER
16741: *
16742: GTS05 LDI ICVAL(XR) LOAD INTEGER VALUE
16743: .IF .CSCI
16744: JSR SYSCI CONVERT INTEGER
16745: MOV SCLEN(XL),WA GET LENGTH
16746: ZER WB ZERO OFFSET FOR SBSTR
16747: JSR SBSTR COPY IN RESULT FROM SYSCI
16748: BRN GTS29 EXIT
16749: .ELSE
16750: MOV =NUM01,GTSSF SET SIGN FLAG NEGATIVE
16751: ILT GTS06 SKIP IF INTEGER IS NEGATIVE
16752: NGI ELSE NEGATE INTEGER
16753: ZER GTSSF AND RESET NEGATIVE FLAG
16754: EJC
16755: *
16756: * GTSTG (CONTINUED)
16757: *
16758: * HERE WITH SIGN FLAG SET AND SIGN FORCED NEGATIVE AS
16759: * REQUIRED BY THE CVD INSTRUCTION.
16760: *
16761: GTS06 MOV GTSWK,XR POINT TO RESULT WORK AREA
16762: MOV =NSTMX,WB INITIALIZE COUNTER TO MAX LENGTH
16763: PSC XR,WB PREPARE TO STORE (RIGHT-LEFT)
16764: *
16765: * LOOP TO CONVERT DIGITS INTO WORK AREA
16766: *
16767: GTS07 CVD CONVERT ONE DIGIT INTO WA
16768: SCH WA,-(XR) STORE IN WORK AREA
16769: DCV WB DECREMENT COUNTER
16770: INE GTS07 LOOP IF MORE DIGITS TO GO
16771: CSC XR COMPLETE STORE CHARACTERS
16772: *
16773: * MERGE HERE AFTER CONVERTING INTEGER OR REAL INTO WORK
16774: * AREA. WB IS SET TO NSTMX - (NUMBER OF CHARS IN RESULT).
16775: *
16776: GTS08 MOV =NSTMX,WA GET MAX NUMBER OF CHARACTERS
16777: SUB WB,WA COMPUTE LENGTH OF RESULT
16778: MOV WA,XL REMEMBER LENGTH FOR MOVE LATER ON
16779: ADD GTSSF,WA ADD ONE FOR NEGATIVE SIGN IF NEEDED
16780: JSR ALOCS ALLOCATE STRING FOR RESULT
16781: MOV XR,WC SAVE RESULT POINTER FOR THE MOMENT
16782: PSC XR POINT TO CHARS OF RESULT BLOCK
16783: BZE GTSSF,GTS09 SKIP IF POSITIVE
16784: MOV =CH$MN,WA ELSE LOAD NEGATIVE SIGN
16785: SCH WA,(XR)+ AND STORE IT
16786: CSC XR COMPLETE STORE CHARACTERS
16787: .FI
16788: *
16789: * HERE AFTER DEALING WITH SIGN
16790: *
16791: GTS09 MOV XL,WA RECALL LENGTH TO MOVE
16792: MOV GTSWK,XL POINT TO RESULT WORK AREA
16793: PLC XL,WB POINT TO FIRST RESULT CHARACTER
16794: MVC MOVE CHARS TO RESULT STRING
16795: MOV WC,XR RESTORE RESULT POINTER
16796: .IF .CNRA
16797: .ELSE
16798: BRN GTS29 JUMP TO EXIT
16799: EJC
16800: *
16801: * GTSTG (CONTINUED)
16802: *
16803: * HERE TO CONVERT A REAL
16804: *
16805: GTS10 LDR RCVAL(XR) LOAD REAL
16806: ZER GTSSF RESET NEGATIVE FLAG
16807: REQ GTS31 SKIP IF ZERO
16808: RGE GTS11 JUMP IF REAL IS POSITIVE
16809: MOV =NUM01,GTSSF ELSE SET NEGATIVE FLAG
16810: NGR AND GET ABSOLUTE VALUE OF REAL
16811: *
16812: * NOW SCALE THE REAL TO THE RANGE (0.1 LE X LT 1.0)
16813: *
16814: GTS11 LDI INTV0 INITIALIZE EXPONENT TO ZERO
16815: *
16816: * LOOP TO SCALE UP IN STEPS OF 10**10
16817: *
16818: GTS12 STR GTSRS SAVE REAL VALUE
16819: SBR REAP1 SUBTRACT 0.1 TO COMPARE
16820: RGE GTS13 JUMP IF SCALE UP NOT REQUIRED
16821: LDR GTSRS ELSE RELOAD VALUE
16822: MLR REATT MULTIPLY BY 10**10
16823: SBI INTVT DECREMENT EXPONENT BY 10
16824: BRN GTS12 LOOP BACK TO TEST AGAIN
16825: *
16826: * TEST FOR SCALE DOWN REQUIRED
16827: *
16828: GTS13 LDR GTSRS RELOAD VALUE
16829: SBR REAV1 SUBTRACT 1.0
16830: RLT GTS17 JUMP IF NO SCALE DOWN REQUIRED
16831: LDR GTSRS ELSE RELOAD VALUE
16832: *
16833: * LOOP TO SCALE DOWN IN STEPS OF 10**10
16834: *
16835: GTS14 SBR REATT SUBTRACT 10**10 TO COMPARE
16836: RLT GTS15 JUMP IF LARGE STEP NOT REQUIRED
16837: LDR GTSRS ELSE RESTORE VALUE
16838: DVR REATT DIVIDE BY 10**10
16839: STR GTSRS STORE NEW VALUE
16840: ADI INTVT INCREMENT EXPONENT BY 10
16841: BRN GTS14 LOOP BACK
16842: EJC
16843: *
16844: * GTSTG (CONTINUED)
16845: *
16846: * AT THIS POINT WE HAVE (1.0 LE X LT 10**10)
16847: * COMPLETE SCALING WITH POWERS OF TEN TABLE
16848: *
16849: GTS15 MOV =REAV1,XR POINT TO POWERS OF TEN TABLE
16850: *
16851: * LOOP TO LOCATE CORRECT ENTRY IN TABLE
16852: *
16853: GTS16 LDR GTSRS RELOAD VALUE
16854: ADI INTV1 INCREMENT EXPONENT
16855: ADD *CFP$R,XR POINT TO NEXT ENTRY IN TABLE
16856: SBR (XR) SUBTRACT IT TO COMPARE
16857: RGE GTS16 LOOP TILL WE FIND A LARGER ENTRY
16858: LDR GTSRS THEN RELOAD THE VALUE
16859: DVR (XR) AND COMPLETE SCALING
16860: STR GTSRS STORE VALUE
16861: *
16862: * WE ARE NOW SCALED, SO ROUND BY ADDING 0.5 * 10**(-CFP$S)
16863: *
16864: GTS17 LDR GTSRS GET VALUE AGAIN
16865: ADR GTSRN ADD ROUNDING FACTOR
16866: STR GTSRS STORE RESULT
16867: *
16868: * THE ROUNDING OPERATION MAY HAVE PUSHED US UP PAST
16869: * 1.0 AGAIN, SO CHECK ONE MORE TIME.
16870: *
16871: SBR REAV1 SUBTRACT 1.0 TO COMPARE
16872: RLT GTS18 SKIP IF OK
16873: ADI INTV1 ELSE INCREMENT EXPONENT
16874: LDR GTSRS RELOAD VALUE
16875: DVR REAVT DIVIDE BY 10.0 TO RESCALE
16876: BRN GTS19 JUMP TO MERGE
16877: *
16878: * HERE IF ROUNDING DID NOT MUCK UP SCALING
16879: *
16880: GTS18 LDR GTSRS RELOAD ROUNDED VALUE
16881: EJC
16882: *
16883: * GTSTG (CONTINUED)
16884: *
16885: * NOW WE HAVE COMPLETED THE SCALING AS FOLLOWS
16886: *
16887: * (IA) SIGNED EXPONENT
16888: * (RA) SCALED REAL (ABSOLUTE VALUE)
16889: *
16890: * IF THE EXPONENT IS NEGATIVE OR GREATER THAN CFP$S, THEN
16891: * WE CONVERT THE NUMBER IN THE FORM.
16892: *
16893: * (NEG SIGN) 0 . (CPF$S DIGITS) E (EXP SIGN) (EXP DIGITS)
16894: *
16895: * IF THE EXPONENT IS POSITIVE AND LESS THAN OR EQUAL TO
16896: * CFP$S, THE NUMBER IS CONVERTED IN THE FORM.
16897: *
16898: * (NEG SIGN) (EXPONENT DIGITS) . (CFP$S-EXPONENT DIGITS)
16899: *
16900: * IN BOTH CASES, THE FORMATS OBTAINED FROM THE ABOVE
16901: * RULES ARE MODIFIED BY DELETING TRAILING ZEROS AFTER THE
16902: * DECIMAL POINT. THERE ARE NO LEADING ZEROS IN THE EXPONENT
16903: * AND THE EXPONENT SIGN IS ALWAYS PRESENT.
16904: *
16905: GTS19 MOV =CFP$S,XL SET NUM DEC DIGITS = CFP$S
16906: MOV =CH$MN,GTSES SET EXPONENT SIGN NEGATIVE
16907: ILT GTS21 ALL SET IF EXPONENT IS NEGATIVE
16908: MFI WA ELSE FETCH EXPONENT
16909: BLE WA,=CFP$S,GTS20 SKIP IF WE CAN USE SPECIAL FORMAT
16910: MTI WA ELSE RESTORE EXPONENT
16911: NGI SET NEGATIVE FOR CVD
16912: MOV =CH$PL,GTSES SET PLUS SIGN FOR EXPONENT SIGN
16913: BRN GTS21 JUMP TO GENERATE EXPONENT
16914: *
16915: * HERE IF WE CAN USE THE FORMAT WITHOUT AN EXPONENT
16916: *
16917: GTS20 SUB WA,XL COMPUTE DIGITS AFTER DECIMAL POINT
16918: LDI INTV0 RESET EXPONENT TO ZERO
16919: EJC
16920: *
16921: * GTSTG (CONTINUED)
16922: *
16923: * MERGE HERE AS FOLLOWS
16924: *
16925: * (IA) EXPONENT ABSOLUTE VALUE
16926: * GTSES CHARACTER FOR EXPONENT SIGN
16927: * (RA) POSITIVE FRACTION
16928: * (XL) NUMBER OF DIGITS AFTER DEC POINT
16929: *
16930: GTS21 MOV GTSWK,XR POINT TO WORK AREA
16931: MOV =NSTMX,WB SET CHARACTER CTR TO MAX LENGTH
16932: PSC XR,WB PREPARE TO STORE (RIGHT TO LEFT)
16933: IEQ GTS23 SKIP EXPONENT IF IT IS ZERO
16934: *
16935: * LOOP TO GENERATE DIGITS OF EXPONENT
16936: *
16937: GTS22 CVD CONVERT A DIGIT INTO WA
16938: SCH WA,-(XR) STORE IN WORK AREA
16939: DCV WB DECREMENT COUNTER
16940: INE GTS22 LOOP BACK IF MORE DIGITS TO GO
16941: *
16942: * HERE GENERATE EXPONENT SIGN AND E
16943: *
16944: MOV GTSES,WA LOAD EXPONENT SIGN
16945: SCH WA,-(XR) STORE IN WORK AREA
16946: .IF .CPLC
16947: MOV =CH$$E,WA GET CHAR LETTER E
16948: .ELSE
16949: MOV =CH$LE,WA GET CHARACTER LETTER E
16950: .FI
16951: SCH WA,-(XR) STORE IN WORK AREA
16952: SUB =NUM02,WB DECREMENT COUNTER FOR SIGN AND E
16953: *
16954: * HERE TO GENERATE THE FRACTION
16955: *
16956: GTS23 MLR GTSSC CONVERT REAL TO INTEGER (10**CFP$S)
16957: RTI GET INTEGER (OVERFLOW IMPOSSIBLE)
16958: NGI NEGATE AS REQUIRED BY CVD
16959: *
16960: * LOOP TO SUPPRESS TRAILING ZEROS
16961: *
16962: GTS24 BZE XL,GTS27 JUMP IF NO DIGITS LEFT TO DO
16963: CVD ELSE CONVERT ONE DIGIT
16964: BNE WA,=CH$D0,GTS26 JUMP IF NOT A ZERO
16965: DCV XL DECREMENT COUNTER
16966: BRN GTS24 LOOP BACK FOR NEXT DIGIT
16967: EJC
16968: *
16969: * GTSTG (CONTINUED)
16970: *
16971: * LOOP TO GENERATE DIGITS AFTER DECIMAL POINT
16972: *
16973: GTS25 CVD CONVERT A DIGIT INTO WA
16974: *
16975: * MERGE HERE FIRST TIME
16976: *
16977: GTS26 SCH WA,-(XR) STORE DIGIT
16978: DCV WB DECREMENT COUNTER
16979: DCV XL DECREMENT COUNTER
16980: BNZ XL,GTS25 LOOP BACK IF MORE TO GO
16981: *
16982: * HERE GENERATE THE DECIMAL POINT
16983: *
16984: GTS27 MOV =CH$DT,WA LOAD DECIMAL POINT
16985: SCH WA,-(XR) STORE IN WORK AREA
16986: DCV WB DECREMENT COUNTER
16987: *
16988: * HERE GENERATE THE DIGITS BEFORE THE DECIMAL POINT
16989: *
16990: GTS28 CVD CONVERT A DIGIT INTO WA
16991: SCH WA,-(XR) STORE IN WORK AREA
16992: DCV WB DECREMENT COUNTER
16993: INE GTS28 LOOP BACK IF MORE TO GO
16994: CSC XR COMPLETE STORE CHARACTERS
16995: BRN GTS08 ELSE JUMP BACK TO EXIT
16996: .FI
16997: *
16998: * EXIT POINT AFTER SUCCESSFUL CONVERSION
16999: *
17000: GTS29 MOV (XS)+,XL RESTORE XL
17001: ICA XS POP ARGUMENT
17002: MOV GTSVB,WB RESTORE WB
17003: MOV GTSVC,WC RESTORE WC
17004: *
17005: * MERGE HERE IF NO CONVERSION REQUIRED
17006: *
17007: GTS30 MOV SCLEN(XR),WA LOAD STRING LENGTH
17008: EXI RETURN TO CALLER
17009: .IF .CNRA
17010: .ELSE
17011: *
17012: * HERE TO RETURN STRING FOR REAL ZERO
17013: *
17014: GTS31 MOV =SCRE0,XL POINT TO STRING
17015: MOV =NUM02,WA 2 CHARS
17016: ZER WB ZERO OFFSET
17017: JSR SBSTR COPY STRING
17018: BRN GTS29 RETURN
17019: .FI
17020: .IF .CNBF
17021: .ELSE
17022: EJC
17023: *
17024: * HERE TO CONVERT A BUFFER BLOCK
17025: *
17026: GTS32 MOV XR,XL COPY ARG PTR
17027: MOV BCLEN(XL),WA GET SIZE TO ALLOCATE
17028: BZE WA,GTS33 IF NULL THEN RETURN NULL
17029: JSR ALOCS ALLOCATE STRING FRAME
17030: MOV XR,WB SAVE STRING PTR
17031: MOV SCLEN(XR),WA GET LENGTH TO MOVE
17032: CTB WA,0 GET AS MULTIPLE OF WORD SIZE
17033: MOV BCBUF(XL),XL POINT TOBFBLK
17034: ADD *SCSI$,XR POINT TO START OF CHARACTER AREA
17035: ADD *BFSI$,XL POINT TO START OF BUFFER CHARS
17036: MVW COPY WORDS
17037: MOV WB,XR RESTORE SCBLK PTR
17038: BRN GTS29 EXIT WITH SCBLK
17039: *
17040: * HERE WHEN NULL BUFFER IS BEING CONVERTED
17041: *
17042: GTS33 MOV =NULLS,XR POINT TO NULL
17043: BRN GTS29 EXIT WITH NULL
17044: .FI
17045: ENP END PROCEDURE GTSTG
17046: EJC
17047: *
17048: * GTVAR -- GET VARIABLE FOR I/O/TRACE ASSOCIATION
17049: *
17050: * GTVAR IS USED TO POINT TO AN ACTUAL VARIABLE LOCATION
17051: * FOR THE DETACH,INPUT,OUTPUT,TRACE,STOPTR SYSTEM FUNCTIONS
17052: *
17053: * (XR) ARGUMENT TO FUNCTION
17054: * JSR GTVAR CALL TO LOCATE VARIABLE POINTER
17055: * PPM LOC TRANSFER LOC IF NOT OK VARIABLE
17056: * (XL,WA) NAME BASE,OFFSET OF VARIABLE
17057: * (XR,RA) DESTROYED
17058: * (WB,WC) DESTROYED (CONVERT ERROR ONLY)
17059: * (XR) INPUT ARG (CONVERT ERROR ONLY)
17060: *
17061: GTVAR PRC E,1 ENTRY POINT
17062: BNE (XR),=B$NML,GTVR2 JUMP IF NOT A NAME
17063: MOV NMOFS(XR),WA ELSE LOAD NAME OFFSET
17064: MOV NMBAS(XR),XL LOAD NAME BASE
17065: BEQ (XL),=B$EVT,GTVR1 ERROR IF EXPRESSION VARIABLE
17066: BNE (XL),=B$KVT,GTVR3 ALL OK IF NOT KEYWORD VARIABLE
17067: *
17068: * HERE ON CONVERSION ERROR
17069: *
17070: GTVR1 EXI 1 TAKE CONVERT ERROR EXIT
17071: *
17072: * HERE IF NOT A NAME, TRY CONVERT TO NATURAL VARIABLE
17073: *
17074: GTVR2 MOV WC,GTVRC SAVE WC
17075: JSR GTNVR LOCATE VRBLK IF POSSIBLE
17076: PPM GTVR1 JUMP IF CONVERT ERROR
17077: MOV XR,XL ELSE COPY VRBLK NAME BASE
17078: MOV *VRVAL,WA AND SET OFFSET
17079: MOV GTVRC,WC RESTORE WC
17080: *
17081: * HERE FOR NAME OBTAINED
17082: *
17083: GTVR3 BHI XL,STATE,GTVR4 ALL OK IF NOT NATURAL VARIABLE
17084: BEQ VRSTO(XL),=B$VRE,GTVR1 ERROR IF PROTECTED VARIABLE
17085: *
17086: * COMMON EXIT POINT
17087: *
17088: GTVR4 EXI RETURN TO CALLER
17089: ENP END PROCEDURE GTVAR
17090: EJC
17091: *
17092: * HASHS -- COMPUTE HASH INDEX FOR STRING
17093: *
17094: * HASHS REPRODUCIBLY MAPS A STRING TO AN INTEGER
17095: * VALUE. THE RESULTING HASH VALUE IS A POSITIVE INTEGER
17096: * IN THE RANGE 0 TO CFP$M
17097: *
17098: * (XR) STRING TO BE HASHED
17099: * JSR HASHS CALL TO HASH STRING
17100: * (IA) HASH VALUE
17101: * (XR,WB,WC) DESTROYED
17102: *
17103: * THE HASH FUNCTION USED IS AS FOLLOWS.
17104: *
17105: * START WITH THE LENGTH OF THE STRING
17106: *
17107: * TAKE THE FIRST E$HNW WORDS OF THE CHARACTERS FROM
17108: * THE STRING OR ALL THE WORDS IF FEWER THAN E$HNW.
17109: *
17110: * COMPUTE THE EXCLUSIVE OR OF ALL THESE WORDS TREATING
17111: * THEM AS ONE WORD BIT STRING VALUES.
17112: *
17113: * MOVE THE RESULT AS AN INTEGER WITH THE MTI INSTRUCTION.
17114: *
17115: HASHS PRC E,0 ENTRY POINT
17116: MOV SCLEN(XR),WC LOAD STRING LENGTH IN CHARACTERS
17117: MOV WC,WB INITIALIZE WITH LENGTH
17118: BZE WC,HSHS3 JUMP IF NULL STRING
17119: CTW WC,0 ELSE GET NUMBER OF WORDS OF CHARS
17120: ADD *SCHAR,XR POINT TO CHARACTERS OF STRING
17121: BLO WC,=E$HNW,HSHS1 USE WHOLE STRING IF SHORT
17122: MOV =E$HNW,WC ELSE SET TO INVOLVE FIRST E$HNW WDS
17123: *
17124: * HERE WITH COUNT OF WORDS TO CHECK IN WC
17125: *
17126: HSHS1 LCT WC,WC SET COUNTER TO CONTROL LOOP
17127: *
17128: * LOOP TO COMPUTE EXCLUSIVE OR
17129: *
17130: HSHS2 XOB (XR)+,WB EXCLUSIVE OR NEXT WORD OF CHARS
17131: BCT WC,HSHS2 LOOP TILL ALL PROCESSED
17132: *
17133: * MERGE HERE WITH EXCLUSIVE OR IN WB
17134: *
17135: HSHS3 ZGB WB ZEROISE UNDEFINED BITS
17136: ANB BITSM,WB ENSURE IN RANGE 0 TO CFP$M
17137: MTI WB MOVE RESULT AS INTEGER
17138: ZER XR CLEAR GARBAGE VALUE IN XR
17139: EXI RETURN TO HASHS CALLER
17140: ENP END PROCEDURE HASHS
17141: EJC
17142: *
17143: * ICBLD -- BUILD INTEGER BLOCK
17144: *
17145: * (IA) INTEGER VALUE FOR ICBLK
17146: * JSR ICBLD CALL TO BUILD INTEGER BLOCK
17147: * (XR) POINTER TO RESULT ICBLK
17148: * (WA) DESTROYED
17149: *
17150: ICBLD PRC E,0 ENTRY POINT
17151: ILT ICBL1 SKIP IF NEGATIVE
17152: SBI INTV2 REDUCE BY TWO
17153: ILE ICBL3 JUMP IF 0 , 1 OR 2
17154: ADI INTV2 RESTORE VALUE
17155: *
17156: * CONSTRUCT ICBLK
17157: *
17158: ICBL1 MOV DNAMP,XR LOAD POINTER TO NEXT AVAILABLE LOC
17159: ADD *ICSI$,XR POINT PAST NEW ICBLK
17160: BLO XR,DNAME,ICBL2 JUMP IF THERE IS ROOM
17161: MOV *ICSI$,WA ELSE LOAD LENGTH OF ICBLK
17162: JSR ALLOC USE STANDARD ALLOCATOR TO GET BLOCK
17163: ADD WA,XR POINT PAST BLOCK TO MERGE
17164: *
17165: * MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED
17166: *
17167: ICBL2 MOV XR,DNAMP SET NEW POINTER
17168: SUB *ICSI$,XR POINT BACK TO START OF BLOCK
17169: MOV =B$ICL,(XR) STORE TYPE WORD
17170: STI ICVAL(XR) STORE INTEGER VALUE IN ICBLK
17171: EXI RETURN TO ICBLD CALLER
17172: *
17173: * OPTIMISE BY NOT BUILDING ICBLKS FOR SMALL INTEGERS
17174: *
17175: ICBL3 ADI INTV2 RESTORE VALUE
17176: MFI XR CONVERT TO SHORT INTEGER
17177: WTB XR CONVERT INTEGER TO OFFSET
17178: MOV INTAB(XR),XR POINT TO PRE-BUILT ICBLK
17179: EXI RETURN
17180: ENP END PROCEDURE ICBLD
17181: EJC
17182: *
17183: * IDENT -- COMPARE TWO VALUES
17184: *
17185: * IDENT COMPARES TWO VALUES IN THE SENSE OF THE IDENT
17186: * DIFFER FUNCTIONS AVAILABLE AT THE SNOBOL LEVEL.
17187: *
17188: * (XR) FIRST ARGUMENT
17189: * (XL) SECOND ARGUMENT
17190: * JSR IDENT CALL TO COMPARE ARGUMENTS
17191: * PPM LOC TRANSFER LOC IF IDENT
17192: * (NORMAL RETURN IF DIFFER)
17193: * (XR,XL,WC,RA) DESTROYED
17194: *
17195: IDENT PRC E,1 ENTRY POINT
17196: BEQ XR,XL,IDEN7 JUMP IF SAME POINTER (IDENT)
17197: MOV (XR),WC ELSE LOAD ARG 1 TYPE WORD
17198: BNE WC,(XL),IDEN1 DIFFER IF ARG 2 TYPE WORD DIFFER
17199: BEQ WC,=B$SCL,IDEN2 JUMP IF STRINGS
17200: BEQ WC,=B$ICL,IDEN4 JUMP IF INTEGERS
17201: .IF .CNRA
17202: .ELSE
17203: BEQ WC,=B$RCL,IDEN5 JUMP IF REALS
17204: .FI
17205: BEQ WC,=B$NML,IDEN6 JUMP IF NAMES
17206: *
17207: * FOR ALL OTHER DATATYPES, MUST BE DIFFER IF XR NE XL
17208: *
17209: * MERGE HERE FOR DIFFER
17210: *
17211: IDEN1 EXI TAKE DIFFER EXIT
17212: *
17213: * HERE FOR STRINGS, IDENT ONLY IF LENGTHS AND CHARS SAME
17214: *
17215: IDEN2 MOV SCLEN(XR),WC LOAD ARG 1 LENGTH
17216: BNE WC,SCLEN(XL),IDEN1 DIFFER IF LENGTHS DIFFER
17217: CTW WC,0 GET NUMBER OF WORDS IN STRINGS
17218: ADD *SCHAR,XR POINT TO CHARS OF ARG 1
17219: ADD *SCHAR,XL POINT TO CHARS OF ARG 2
17220: LCT WC,WC SET LOOP COUNTER
17221: *
17222: * LOOP TO COMPARE CHARACTERS. NOTE THAT WA CANNOT BE ZERO
17223: * SINCE ALL NULL STRINGS POINT TO NULLS AND GIVE XL=XR.
17224: *
17225: IDEN3 CNE (XR),(XL),IDEN8 DIFFER IF CHARS DO NOT MATCH
17226: ICA XR ELSE BUMP ARG ONE POINTER
17227: ICA XL BUMP ARG TWO POINTER
17228: BCT WC,IDEN3 LOOP BACK TILL ALL CHECKED
17229: EJC
17230: *
17231: * IDENT (CONTINUED)
17232: *
17233: * HERE TO EXIT FOR CASE OF TWO IDENT STRINGS
17234: *
17235: ZER XL CLEAR GARBAGE VALUE IN XL
17236: ZER XR CLEAR GARBAGE VALUE IN XR
17237: EXI 1 TAKE IDENT EXIT
17238: *
17239: * HERE FOR INTEGERS, IDENT IF SAME VALUES
17240: *
17241: IDEN4 LDI ICVAL(XR) LOAD ARG 1
17242: SBI ICVAL(XL) SUBTRACT ARG 2 TO COMPARE
17243: IOV IDEN1 DIFFER IF OVERFLOW
17244: INE IDEN1 DIFFER IF RESULT IS NOT ZERO
17245: EXI 1 TAKE IDENT EXIT
17246: .IF .CNRA
17247: .ELSE
17248: *
17249: * HERE FOR REALS, IDENT IF SAME VALUES
17250: *
17251: IDEN5 LDR RCVAL(XR) LOAD ARG 1
17252: SBR RCVAL(XL) SUBTRACT ARG 2 TO COMPARE
17253: ROV IDEN1 DIFFER IF OVERFLOW
17254: RNE IDEN1 DIFFER IF RESULT IS NOT ZERO
17255: EXI 1 TAKE IDENT EXIT
17256: .FI
17257: *
17258: * HERE FOR NAMES, IDENT IF BASES AND OFFSETS SAME
17259: *
17260: IDEN6 BNE NMOFS(XR),NMOFS(XL),IDEN1 DIFFER IF DIFFERENT OFFSET
17261: BNE NMBAS(XR),NMBAS(XL),IDEN1 DIFFER IF DIFFERENT BASE
17262: *
17263: * MERGE HERE TO SIGNAL IDENT FOR IDENTICAL POINTERS
17264: *
17265: IDEN7 EXI 1 TAKE IDENT EXIT
17266: *
17267: * HERE FOR DIFFER STRINGS
17268: *
17269: IDEN8 ZER XR CLEAR GARBAGE PTR IN XR
17270: ZER XL CLEAR GARBAGE PTR IN XL
17271: EXI RETURN TO CALLER (DIFFER)
17272: ENP END PROCEDURE IDENT
17273: EJC
17274: *
17275: * INOUT - USED TO INITIALISE .INPUT .OUTPUT .TERMINAL
17276: *
17277: * (XL) POINTER TO VBL NAME STRING
17278: * (WB) TRBLK TYPE (TRTYP FIELD)
17279: * JSR INOUT CALL TO PERFORM INITIALISATION
17280: * (WA,WC) DESTROYED
17281: *
17282: * NOTE THAT TRTER (= TRTRF) FIELD OF STANDARD I/O VARIABLES
17283: * POINTS TO CORRESPONDING SVBLK NOT TO A TRBLK AS IS THE
17284: * CASE FOR ORDINARY VARIABLES.
17285: *
17286: INOUT PRC E,0 ENTRY POINT
17287: MOV WB,-(XS) STACK TRBLK TYPE
17288: MOV SCLEN(XL),WA GET NAME LENGTH
17289: ZER WB POINT TO START OF NAME
17290: JSR SBSTR BUILD A PROPER SCBLK
17291: JSR GTNVR FIND OR BUILD VRBLK
17292: PPM NO ERROR RETURN
17293: MOV XR,WC SAVE VRBLK POINTER
17294: MOV (XS)+,WB GET TRTYP FIELD
17295: ZER XL ZERO TRTRI
17296: MOV VRSVP(XR),XR GET SVBLK POINTER
17297: JSR TRBLD BUILD TRBLK
17298: MOV WC,XL RECALL VRBLK POINTER
17299: MOV *VRVAL,WA OFFSET TO VALUE FIELD
17300: JSR TRCHN PUT TRBLK IN TRACE CHAIN
17301: PPM CANT FAIL
17302: EXI RETURN TO CALLER
17303: ENP END PROCEDURE INOUT
17304: EJC
17305: .IF .CNBF
17306: .ELSE
17307: *
17308: * INSBF -- INSERT STRING IN BUFFER
17309: *
17310: * THIS ROUTINE WILL REPLACE A SECTION OF A BUFFER WITH THE
17311: * CONTENTS OF A GIVEN STRING. IF THE LENGTH OF THE
17312: * SECTION TO BE REPLACED DIFFERS FROM THAT OF THE
17313: * GIVEN STRING, AND THE REPLACEMENT IS NOT AN APPEND,
17314: * THEN THE UPPER SECTION OF THE BUFFER IS SHIFTED UP OR
17315: * DOWN TO CREATE THE PROPER SPACE FOR THE INSERT.
17316: *
17317: * (XR) POINTER TO BCBLK
17318: * (XL) OBJECT WHICH IS STRING CONVERTIBLE
17319: * (WA) OFFSET OF START OF INSERT IN (XR)
17320: * (WB) LENGTH OF SECTION IN (XR) REPLACED
17321: * JSR INSBF CALL TO INSERT CHARACTERS IN BUFFER
17322: * PPM LOC ERROR IF (XR) NOT CONVERTIBLE
17323: * PPM LOC FAIL IF INSERT NOT POSSIBLE
17324: * (XL,WA,WB,WC) DESTROYED
17325: *
17326: * THE SECOND ALTERNATE EXIT IS TAKEN IF THE INSERT WOULD
17327: * OVERFLOW THE BUFFER, OR IF THE INSERT IS OUT PAST THE
17328: * DEFINED END OF THE BUFFER AS GIVEN.
17329: *
17330: INSBF PRC E,2 ENTRY POINT
17331: MOV WA,INSSA SAVE ENTRY WA
17332: MOV WB,INSSB SAVE ENTRY WB
17333: ADD WB,WA ADD TO GET OFFSET PAST REPLACE PART
17334: MOV WA,INSAB SAVE WA+WB
17335: MOV BCLEN(XR),WC GET CURRENT DEFINED LENGTH
17336: BGT INSSA,WC,INS07 FAIL IF START OFFSET TOO BIG
17337: BGT WA,WC,INS07 FAIL IF FINAL OFFSET TOO BIG
17338: MOV XR,-(XS) SAVE BCBLK PTR
17339: MOV XL,-(XS) STACK STRING POINTER FOR GTSTG
17340: JSR GTSTG CALL TO CONVERT TO STRING
17341: PPM INS06 TAKE STRING CONVERT ERR EXIT
17342: MOV XR,XL SAVE STRING PTR
17343: MOV (XS)+,XR RESTORE BCBLK PTR
17344: MOV XR,INSBC BCBLK PTR - NO DANGER OF GARB COLLN
17345: MOV BCBUF(XR),XR POINT TO BFBLK
17346: MOV XR,INSBB BFBLK PTR - NO DANGER OF GARB COLLN
17347: ADD WC,WA ADD BUFFER LEN TO STRING LEN
17348: SUB INSSB,WA BIAS OUT COMPONENT BEING REPLACED
17349: BGT WA,BFALC(XR),INS07 FAIL IF RESULT EXCEEDS ALLOCATION
17350: MOV INSBC,XR RESTORE BCBLK PTR
17351: MOV WC,WA GET BUFFER LENGTH
17352: SUB INSAB,WA SUBTRACT TO GET SHIFT LENGTH
17353: ADD SCLEN(XL),WC ADD LENGTH OF NEW
17354: SUB INSSB,WC SUBTRACT OLD TO GET TOTAL NEW LEN
17355: MOV BCLEN(XR),WB GET OLD BCLEN
17356: MOV WC,BCLEN(XR) STUFF NEW LENGTH
17357: MOV INSBB,XR POINT TO BFBLK
17358: MOV XL,-(XS) SAVE SCBLK PTR
17359: BZE WA,INS02 SKIP SHIFT IF NOTHING TO DO
17360: BEQ INSSB,SCLEN(XL),INS02 SKIP SHIFT IF LENGTHS MATCH
17361: BLO INSSB,SCLEN(XL),INS01 BRN IF SHIFT IS FOR MORE ROOM
17362: EJC
17363: *
17364: * INSBF (CONTINUED)
17365: *
17366: * WE ARE SHIFTING THE UPPER SEGMENT DOWN TO COMPACT
17367: * THE BUFFER. (THE STRING LENGTH IS SMALLER THAN THE
17368: * SEGMENT BEING REPLACED). REGISTERS ARE SET AS -
17369: *
17370: * (WA) MOVE (SHIFT DOWN) LENGTH
17371: * (WB) OLD BCLEN
17372: * (WC) NEW BCLEN
17373: * (XR) BFBLK PTR
17374: * (XL),(XS) SCBLK PTR
17375: *
17376: MOV INSSA,WB GET OFFSET TO INSERT
17377: ADD SCLEN(XL),WB ADD INSERT LENGTH TO GET DEST OFF
17378: MOV XR,XL MAKE COPY
17379: PLC XL,INSAB PREPARE SOURCE FOR MOVE
17380: PSC XR,WB PREPARE DESTINATION REG FOR MOVE
17381: MVC MOVE EM OUT
17382: BRN INS02 BRANCH TO PAD
17383: *
17384: * WE ARE SHIFTING THE UPPER SEGMENT UP TO EXPAND
17385: * THE BUFFER. (THE STRING LENGTH IS LARGER THAN THE
17386: * SEGMENT BEING REPLACED.)
17387: *
17388: INS01 MOV XR,XL COPY BFBLK PTR
17389: PLC XL,WB SET SOURCE REG FOR MOVE BACKWARDS
17390: PSC XR,WC SET DESTINATION PTR FOR MOVE
17391: MCB MOVE BACKWARDS (POSSIBLE OVERLAP)
17392: *
17393: * MERGE HERE AFTER POSSIBLE MOVE TO ADJUST ZERO FILL AT END
17394: *
17395: INS02 MOV (XS)+,XL RESTORE SCBLK PTR
17396: MOV WC,WA COPY NEW BUFFER END
17397: CTB WA,0 ROUND OUT
17398: BTC WA CONVERT TO CHAR COUNT
17399: SUB WC,WA SUBTRACT TO GET REMAINDER
17400: BZE WA,INS04 NO PAD IF ALREADY EVEN BOUNDARY
17401: MOV INSBB,XR POINT TO BFBLK
17402: PSC XR,WC PREPARE TO PAD
17403: ZER WB CLEAR WB
17404: LCT WA,WA LOAD LOOP COUNT
17405: EJC
17406: *
17407: * INSBF (CONTINUED)
17408: *
17409: * LOOP HERE TO STUFF PAD CHARACTERS
17410: *
17411: INS03 SCH WB,(XR)+ STUFF ZERO PAD
17412: BCT WA,INS03 BRANCH FOR MORE
17413: *
17414: * MERGE HERE WHEN PADDING OK. NOW COPY IN THE INSERT
17415: * STRING TO THE HOLE.
17416: *
17417: INS04 MOV INSBB,XR POINT TO BFBLK
17418: MOV SCLEN(XL),WA GET MOVE LENGTH
17419: BZE WA,INS05 SKIP IF NO CHARS TO INSERT
17420: PLC XL PREPARE TO COPY FROM FIRST CHAR
17421: PSC XR,INSSA PREPARE TO STORE IN HOLE
17422: MVC COPY THE CHARACTERS
17423: *
17424: * SUCCESSFUL RETURN
17425: *
17426: INS05 MOV INSBC,XR RESTORE ENTRY XR
17427: ZER XL CLEAR GARBAGE CHAR POINTER
17428: EXI RETURN TO CALLER
17429: *
17430: * HERE TO TAKE STRING CONVERT ERROR EXIT
17431: *
17432: INS06 ICA XS DISCARD UNWANTED STACK TOP
17433: EXI 1 ALTERNATE EXIT
17434: *
17435: * HERE FOR INVALID OFFSET OR LENGTH
17436: *
17437: INS07 EXI 2 ALTERNATE EXIT
17438: ENP END PROCEDURE INSBF
17439: EJC
17440: .FI
17441: * IOFTG -- GET IOTAG
17442: *
17443: * USED TO FIND THE IOTAG (IF ANY) CORRESPONDING TO THE
17444: * FILETAG ARGUMENT.
17445: *
17446: * -(XS) FILETAG ARGUMENT
17447: * JSR IOFTG CALL TO FIND IOTAG
17448: * PPM LOC ARG IS AN UNSUITABLE FILETAG
17449: * (XS) POPPED
17450: * (XL) PTR TO FILETAG SCBLK
17451: * (XR) PTR TO TRTIO TRACE BLK OR ZERO
17452: * (WA) IOTAG OR ZERO
17453: * (WB) PTR TO FILETAG VRBLK
17454: * (WC) VALUE/0 FOR INTEGER/STRING FILETAG
17455: *
17456: IOFTG PRC N,1 ENTRY POINT
17457: JSR GTSTG GET ARG AS STRING
17458: PPM IOFT4 FAIL
17459: MOV XR,XL COPY STRING PTR
17460: MOV XR,-(XS) STACK STRING
17461: JSR GTSMI TRY CONVERSION TO INTEGER
17462: PPM IOFT5 SKIP IF CANT
17463: PPM IOFT5 SKIP IF CANT
17464: *
17465: * MERGE WITH WC SET UP
17466: *
17467: IOFT1 MOV WC,WB KEEP INTEGER OR ZERO
17468: MOV XL,XR FILETAG STRING TO XR FOR GTNVR CALL
17469: JSR GTNVR FIND VRBLK
17470: PPM IOFT4 SKIP IF NULL STRING
17471: MOV XL,-(XS) KEEP SCBLK PTR
17472: ZER XL IN CASE NO TRTIO BLK FOUND
17473: MOV WB,WC KEEP INTEGER OR ZERO
17474: MOV XR,WB COPY VRBLK PTR FOR RETURN
17475: ZER WA IN CASE NO TRBLK FOUND
17476: *
17477: * LOOP TO FIND FILE ARG1 TRBLK
17478: *
17479: IOFT2 MOV VRVAL(XR),XR GET POSSIBLE TRBLK PTR
17480: BNE (XR),=B$TRT,IOFT3 SKIP IF END OF CHAIN
17481: BNE TRTYP(XR),=TRTIO,IOFT2 LOOP IF NOT FILETAG TRBLK
17482: MOV TRTAG(XR),WA GET IOTAG OR 0
17483: MOV XR,XL TRTIO BLK PTR
17484: *
17485: * RETURN POINT
17486: *
17487: IOFT3 MOV XL,XR TRTIO BLK PTR OR 0
17488: MOV (XS)+,XL RECOVER SCBLK PTR
17489: EXI SUCCESSFUL RETURN
17490: *
17491: * FAIL RETURN
17492: *
17493: IOFT4 EXI 1 FAIL
17494: EJC
17495: *
17496: * NON NUMERIC FILETAG
17497: *
17498: IOFT5 ZER WC NOTE NON NUMERIC
17499: BRN IOFT1 MERGE
17500: ENP END PROCEDURE IOFTG
17501: EJC
17502: *
17503: * IOPUT -- PROCESS INPUT AND OUTPUT ARGUMENTS
17504: *
17505: * IOPUT CHECKS THE ARGUMENTS OF INPUT AND OUTPUT CALLS,
17506: * SETS UP THE REQUIRED ASSOCIATIONS AND CALLS SYSIO TO
17507: * OPEN THE REQUESTED FILES.
17508: *
17509: * -(XS) 1ST ARG (VBL TO BE ASSOCIATED)
17510: * -(XS) 2ND ARG (FILETAG)
17511: * -(XS) 3RD ARG (FILEPROPS)
17512: * (WB) 0 FOR INPUT, 2 FOR OUTPUT ASSOC.
17513: * JSR IOPUT CALL FOR INPUT/OUTPUT ASSOCIATION
17514: * PPM LOC 3RD ARG NOT A STRING
17515: * PPM LOC 2ND ARG NOT A SUITABLE FILETAG
17516: * PPM LOC 1ST ARG NOT A SUITABLE NAME
17517: * PPM LOC FAIL RETURN
17518: * (XS) POPPED
17519: * (XL,XR,WA,WB,WC) DESTROYED
17520: *
17521: EJC
17522: * FIRST ARG NAME
17523: * I I
17524: * +------+
17525: * I I-----+
17526: * +------+ V
17527: * I I +----------------+
17528: * I =B$TRT I
17529: * +----------------+
17530: * I =TRTIN/=TRTOU I
17531: * +----------------+
17532: * I VALUE OR TRCHN +
17533: * +----------------+
17534: * TRTER I I-----+
17535: * +----------------+ V
17536: * TRTRI I 0 I +------+
17537: * +----------------+ I I SVBLK
17538: * I/O TRACE BLOCK +------+
17539: *
17540: * 1. ASSOCIATION TO STANDARD FILES.
17541: *
17542: * FIRST ARG NAME FILETAG VRBLK
17543: * I I I I
17544: * +------+ LK1 +------+ LK2
17545: * I I---+ +---+ I I---+
17546: * +------+ V I V +------+ V
17547: * I I +----------------+ I +----------------+
17548: * I =B$TRT I I I =B$TRT I
17549: * +----------------+ I +----------------+
17550: * I =TRTIN/=TRTOU I I I =TRTIO I
17551: * +----------------+ I +----------------+
17552: * I VALUE OR TRCHN I I I VALUE OR TRCHN I
17553: * +----------------+ I +----------------+
17554: * TRTER I 0 I I I 0 OR IOTAG I TRTAG
17555: * +----------------+ I +----------------+
17556: * TRTRI I I--+ I 0 I TRTRI
17557: * +----------------+ +----------------+
17558: * I/O TRACE BLOCK TRTIO BLOCK
17559: *
17560: * 2. REGULAR CASE.
17561: *
17562: * THE STRUCTURES BUILT FOR I/O ASSOCIATIONS ARE AS SHOWN
17563: * ABOVE. A TRACE BLOCK CHAIN (TRCHN) MAY HOLD ANY OR ALL
17564: * OF THE TYPES, =TRTIN, =TRTOU, =TRTIO, BUT NOT MORE THAN
17565: * ONE BLOCK OF ANY GIVEN TYPE. CASES ARE -
17566: * 1. NO FILETAG OR IOTAG IS USED FOR ASSOCIATING STANDARD
17567: * FILES (SYSRD, SYSPR, TERMINAL). THE I/O TRACE BLOCK
17568: * IS DISTINGUISHED BY A NON-NULL TRTER FIELD POINTING
17569: * TO THE RELEVANT SVBLK (V$INP, V$OUP, V$TER) AND A
17570: * ZERO TRTRI FIELD. FOR TERMINAL, TRBLKS OF BOTH
17571: * INPUT AND OUTPUT TYPE ARE CHAINED FROM THE FIRST ARG
17572: * VIA THE TRCHN FIELD.
17573: * 2. THE I/O TRACE BLOCK FOR THE REGULAR CASE HAS A ZERO
17574: * TRTER FIELD AND A POINTER TO A TRTIO BLOCK IS IN
17575: * THE TRTRI FIELD. THE FILETAG MUST BE A NATURAL
17576: * VARIABLE AND THE TRTIO TRACE BLOCK ATTACHED TO IT
17577: * HOLDS THE IOTAG.
17578: * THE EFFECT OF ENDFILE() IS TO CLEAR IOTAG AND BREAK LK2.
17579: * THE EFFECT OF DETACH() IS TO BREAK LK1.
17580: EJC
17581: IOPUT PRC N,4 ENTRY POINT
17582: MOV WB,IOPWB KEEP ASSOCIATION TYPE FLAG
17583: JSR GTSTG CONVERT THIRD ARG TO STRING
17584: PPM IOP12 FAIL THIRD ARG
17585: BNZ WA,IOP01 SKIP IF NON NULL
17586: ZER XR NOTE NULL ARG
17587: *
17588: * PROCESS SECOND ARG
17589: *
17590: IOP01 MOV XR,R$IOR KEEP FILEPROPS STRING PTR
17591: JSR IOFTG CHECK SECOND ARG
17592: PPM IOP07 FAIL SECOND ARG
17593: MOV XL,R$IOL KEEP SCBLK FOR FILETAG
17594: MOV XR,R$IOT KEEP TRTIO BLK PTR
17595: MOV WA,IOPWA KEEP IOTAG
17596: MOV WB,IOPVR KEEP FILETAG VRBLK PTR
17597: MOV WC,IOPWC KEEP FILETAG VALUE
17598: MOV (XS)+,XR GET FIRST ARG OFF STACK
17599: JSR GTVAR CONVERT TO NAME
17600: PPM IOP13 FAIL FIRST ARG
17601: MOV XL,R$IO1 SAVE FIRST ARG NAME BASE ADRS
17602: MOV WA,IOPNF SAVE FIRST ARG NAME OFFSET
17603: MOV WB,XR FILETAG VRBLK PTR
17604: BNZ VRLEN(XR),IOP02 NOT SPECIAL CASE IF NOT SYS NAME
17605: MOV VRSVP(XR),WC GET SVBLK PTR
17606: MOV =TRTIN,WB IN CASE .INPUT
17607: BEQ WC,=V$INP,IOP06 JUMP IF .INPUT
17608: MOV =TRTOU,WB IN CASE .OUTPUT OR .TERMINAL
17609: BEQ WC,=V$OUP,IOP08 JUMP IF .OUTPUT
17610: BEQ WC,=V$TER,IOP09 JUMP IF .TERMINAL
17611: EJC
17612: *
17613: * NORMAL CASE
17614: *
17615: IOP02 BNZ R$IOT,IOP03 SKIP IF TRTIO BLK EXISTS ALREADY
17616: MOV =TRTIO,WB TRACE BLOCK TYPE WORD
17617: ZER XR ZERO IOTAG WORD
17618: ZER XL ZERO TRTRI FIELD
17619: JSR TRBLD BUILD TRTIO TRBLK
17620: MOV XR,R$IOT SAVE TRTIO BLK PTR
17621: MOV IOPVR,XL GET FILETAG VRBLK
17622: MOV *VRVAL,WA OFFSET TO VALUE FIELD
17623: JSR TRCHN PLACE IN TRBLK CHAIN FOR FILETAG
17624: PPM UNUSED RETURN
17625: *
17626: * MERGE TO BUILD TRBLK FOR FIRST ARG
17627: *
17628: IOP03 MOV =TRTIN,WB IN CASE INPUT
17629: BZE IOPWB,IOP04 SKIP IF SO
17630: MOV =TRTOU,WB IN CASE OUTPUT
17631: *
17632: * BUILD TRACE BLOCK
17633: *
17634: IOP04 ICV IOPWB NOTE NOT STANDARD I/O FILE
17635: MOV R$IOT,XL TRTIO BLK PTR TO TRTRI FIELD
17636: ZER XR ZERO TRTER FIELD
17637: JSR TRBLD BUILD I/O TRACE BLOCK
17638: MOV R$IO1,XL ASSOCIATED VBL NAME BASE
17639: MOV IOPNF,WA NAME OFFSET
17640: JSR TRCHN UPDATE TRACE CHAIN FOR FIRST ARG
17641: PPM UNUSED RETURN
17642: *
17643: * PREPARE FOR AND MAKE SYSIO CALL
17644: *
17645: IOP05 MOV R$IOL,XL FILETAG SCBLK PTR
17646: MOV R$IOR,XR FILEPROPS SCBLK PTR
17647: MOV IOPWA,WA IOTAG OR ZERO
17648: MOV IOPWB,WB ASSOCIATION TYPE NUMBER
17649: MOV IOPWC,WC POSSIBLE FILETAG VALUE
17650: JSR SYSIO CALL SYSTEM ROUTINE TO OPEN FILE
17651: PPM IOP14 FAIL RETURN
17652: PPM EROSI ERROR RETURN
17653: MOV R$IOT,XL TRTIO POINTER
17654: BZE XL,IOP11 DONE IF ZERO
17655: MOV WA,TRTAG(XL) STORE RETURNED IOTAG
17656: BRN IOP11 SUCCEED
17657: EJC
17658: *
17659: * SPECIAL CASE OF .INPUT
17660: *
17661: IOP06 BZE IOPWB,IOP09 FAIL OUTPUT(.X,.INPUT)
17662: *
17663: * BAD FILETAG
17664: *
17665: IOP07 EXI 2 ERRONEOUS SECOND ARG
17666: *
17667: * SPECIAL CASE OF .OUTPUT
17668: *
17669: IOP08 BZE IOPWB,IOP07 FAIL INPUT(.X,.OUTPUT)
17670: *
17671: * SPECIAL CASE OF .TERMINAL AND MERGE FOR OTHERS
17672: *
17673: IOP09 ZER R$IOT NOTE NO TRTIO BLOCK
17674: MOV WC,XR SVBLK PTR FOR TRTER FIELD
17675: ZER XL ZERO TRTRI FIELD
17676: JSR TRBLD BUILD TRBLK
17677: MOV R$IO1,XL ASSOCIATED VBL NAME BASE
17678: MOV IOPNF,WA NAME OFFSET
17679: JSR TRCHN UPDATE TRACE CHAIN FOR ARG 1
17680: PPM UNUSED RETURN
17681: BNE TRTER(XR),=V$TER,IOP10 DONE UNLESS TERMINAL
17682: BNE TRTYP(XR),=TRTOU,IOP10 DONE IF TERM. 2ND TIME ROUND
17683: MOV =V$TER,WC TRTER FIELD
17684: MOV =TRTIN,WB TRTYP FIELD
17685: BRN IOP09 REPEAT LOOP FOR TERMINAL
17686: *
17687: * CHECK SPECIAL CASES FOR NON-NULL THIRD ARGS
17688: *
17689: IOP10 ZER IOPWA NO IOTAG
17690: BNZ R$IOR,IOP05 MERGE ONLY IF FILEPROPS NON-NULL
17691: *
17692: * SUCCESS RETURN
17693: *
17694: IOP11 ZER R$IO1 CLEAR GARBAGE
17695: ZER R$IOL
17696: ZER R$IOR
17697: ZER R$IOT
17698: EXI RETURN TO CALLER
17699: *
17700: * ERROR RETURNS
17701: *
17702: IOP12 EXI 1 ERRONEOUS THIRD ARG
17703: *
17704: IOP13 EXI 3 ERRONEOUS FIRST ARG
17705: *
17706: IOP14 EXI 4 FAIL RETURN FROM SYSIO
17707: ENP END PROCEDURE IOPUT
17708: EJC
17709: *
17710: * KTREX -- EXECUTE KEYWORD TRACE
17711: *
17712: * KTREX IS USED TO EXECUTE A POSSIBLE KEYWORD TRACE. IT
17713: * INCLUDES THE TEST ON TRACE AND TESTS FOR TRACE ACTIVE.
17714: *
17715: * (XL) PTR TO TRBLK (OR 0 IF UNTRACED)
17716: * JSR KTREX CALL TO EXECUTE KEYWORD TRACE
17717: * (XL,WA,WB,WC) DESTROYED
17718: * (RA) DESTROYED
17719: *
17720: KTREX PRC R,0 ENTRY POINT (RECURSIVE)
17721: BZE XL,KTRX3 IMMEDIATE EXIT IF KEYWORD UNTRACED
17722: BZE KVTRA,KTRX3 IMMEDIATE EXIT IF TRACE = 0
17723: DCV KVTRA ELSE DECREMENT TRACE
17724: MOV XR,-(XS) SAVE XR
17725: MOV XL,XR COPY TRBLK POINTER
17726: MOV TRKVR(XR),XL LOAD VRBLK POINTER (NMBAS)
17727: MOV *VRVAL,WA SET NAME OFFSET
17728: BZE TRFNC(XR),KTRX1 JUMP IF PRINT TRACE
17729: JSR TRXEQ ELSE EXECUTE FULL TRACE
17730: BRN KTRX2 AND JUMP TO EXIT
17731: *
17732: * HERE FOR PRINT TRACE
17733: *
17734: KTRX1 MOV XL,-(XS) STACK VRBLK PTR FOR KWNAM
17735: MOV WA,-(XS) STACK OFFSET FOR KWNAM
17736: JSR PRTSN PRINT STATEMENT NUMBER
17737: MOV =CH$AM,WA LOAD AMPERSAND
17738: JSR PRTCH PRINT AMPERSAND
17739: JSR PRTNM PRINT KEYWORD NAME
17740: MOV =TMBEB,XR POINT TO BLANK-EQUAL-BLANK
17741: JSR PRTST PRINT BLANK-EQUAL-BLANK
17742: JSR KWNAM GET KEYWORD PSEUDO-VARIABLE NAME
17743: MOV XR,DNAMP RESET PTR TO DELETE KVBLK
17744: JSR ACESS GET KEYWORD VALUE
17745: PPM FAILURE IS IMPOSSIBLE
17746: JSR PRTVF PRINT KEYWORD VALUE
17747: *
17748: * HERE TO EXIT AFTER COMPLETING TRACE
17749: *
17750: KTRX2 MOV (XS)+,XR RESTORE ENTRY XR
17751: *
17752: * MERGE HERE TO EXIT IF NO TRACE REQUIRED
17753: *
17754: KTRX3 EXI RETURN TO KTREX CALLER
17755: ENP END PROCEDURE KTREX
17756: EJC
17757: *
17758: * KWNAM -- GET PSEUDO-VARIABLE NAME FOR KEYWORD
17759: *
17760: * 1(XS) NAME BASE FOR VRBLK
17761: * 0(XS) OFFSET (SHOULD BE *VRVAL)
17762: * JSR KWNAM CALL TO GET PSEUDO-VARIABLE NAME
17763: * (XS) POPPED TWICE
17764: * (XL,WA) RESULTING PSEUDO-VARIABLE NAME
17765: * (XR,WA,WB) DESTROYED
17766: *
17767: KWNAM PRC N,0 ENTRY POINT
17768: ICA XS IGNORE NAME OFFSET
17769: MOV (XS)+,XR LOAD NAME BASE
17770: BGE XR,STATE,KWNM1 JUMP IF NOT NATURAL VARIABLE NAME
17771: BNZ VRLEN(XR),KWNM1 ERROR IF NOT SYSTEM VARIABLE
17772: MOV VRSVP(XR),XR ELSE POINT TO SVBLK
17773: MOV SVBIT(XR),WA LOAD BIT MASK
17774: ANB BTKNM,WA AND WITH KEYWORD BIT
17775: ZRB WA,KWNM1 ERROR IF NO KEYWORD ASSOCIATION
17776: MOV SVLEN(XR),WA ELSE LOAD NAME LENGTH IN CHARACTERS
17777: CTB WA,SVCHS COMPUTE OFFSET TO FIELD WE WANT
17778: ADD WA,XR POINT TO SVKNM FIELD
17779: MOV (XR),WB LOAD SVKNM VALUE
17780: MOV *KVSI$,WA SET SIZE OF KVBLK
17781: JSR ALLOC ALLOCATE KVBLK
17782: MOV =B$KVT,(XR) STORE TYPE WORD
17783: MOV WB,KVNUM(XR) STORE KEYWORD NUMBER
17784: MOV =TRBKV,KVVAR(XR) SET DUMMY TRBLK POINTER
17785: MOV XR,XL COPY KVBLK POINTER
17786: MOV *KVVAR,WA SET PROPER OFFSET
17787: EXI RETURN TO KVNAM CALLER
17788: *
17789: * HERE IF NOT KEYWORD NAME
17790: *
17791: KWNM1 ERB 230,KEYWORD OPERAND IS NOT NAME OF DEFINED KEYWORD
17792: ENP END PROCEDURE KWNAM
17793: EJC
17794: *
17795: * LCOMP-- COMPARE TWO STRINGS LEXICALLY
17796: *
17797: * 1(XS) FIRST ARGUMENT
17798: * 0(XS) SECOND ARGUMENT
17799: * JSR LCOMP CALL TO COMPARE ARUMENTS
17800: * PPM LOC TRANSFER LOC FOR ARG1 NOT STRING
17801: * PPM LOC TRANSFER LOC FOR ARG2 NOT STRING
17802: * PPM LOC TRANSFER LOC IF ARG1 LLT ARG2
17803: * PPM LOC TRANSFER LOC IF ARG1 LEQ ARG2
17804: * PPM LOC TRANSFER LOC IF ARG1 LGT ARG2
17805: * (THE NORMAL RETURN IS NEVER TAKEN)
17806: * (XS) POPPED TWICE
17807: * (XR,XL) DESTROYED
17808: * (WA,WB,WC,RA) DESTROYED
17809: *
17810: LCOMP PRC N,5 ENTRY POINT
17811: JSR GTSTG CONVERT SECOND ARG TO STRING
17812: PPM LCMP6 JUMP IF SECOND ARG NOT STRING
17813: MOV XR,XL ELSE SAVE POINTER
17814: MOV WA,WB AND LENGTH
17815: JSR GTSTG CONVERT FIRST ARGUMENT TO STRING
17816: PPM LCMP5 JUMP IF NOT STRING
17817: MOV WA,WC SAVE ARG 1 LENGTH
17818: PLC XR POINT TO CHARS OF ARG 1
17819: PLC XL POINT TO CHARS OF ARG 2
17820: BLO WA,WB,LCMP0 JUMP IF ARG 1 LENGTH IS SMALLER
17821: MOV WB,WA ELSE SET ARG 2 LENGTH AS SMALLER
17822: *
17823: * HERE WITH SMALLER LENGTH IN (WA)
17824: *
17825: LCMP0 BZE WA,LCMP1 SKIP IF A NULL ARG
17826: CMC LCMP4,LCMP3 COMPARE STRINGS, JUMP IF UNEQUAL
17827: *
17828: * EQUAL STRINGS OR AT LEAST ONE NULL ARG
17829: *
17830: LCMP1 BNE WB,WC,LCMP2 IF EQUAL, JUMP IF LENGTHS UNEQUAL
17831: EXI 4 ELSE IDENTICAL STRINGS, LEQ EXIT
17832: EJC
17833: *
17834: * LCOMP (CONTINUED)
17835: *
17836: * HERE IF INITIAL STRINGS IDENTICAL, BUT LENGTHS UNEQUAL
17837: *
17838: LCMP2 BHI WC,WB,LCMP4 JUMP IF ARG 1 LENGTH GT ARG 2 LENG
17839: *
17840: * HERE IF FIRST ARG LLT SECOND ARG
17841: *
17842: LCMP3 EXI 3 TAKE LLT EXIT
17843: *
17844: * HERE IF FIRST ARG LGT SECOND ARG
17845: *
17846: LCMP4 EXI 5 TAKE LGT EXIT
17847: *
17848: * HERE IF FIRST ARG IS NOT A STRING
17849: *
17850: LCMP5 EXI 1 TAKE BAD FIRST ARG EXIT
17851: *
17852: * HERE FOR SECOND ARG NOT A STRING
17853: *
17854: LCMP6 EXI 2 TAKE BAD SECOND ARG ERROR EXIT
17855: ENP END PROCEDURE LCOMP
17856: EJC
17857: *
17858: * LISTR -- LIST SOURCE LINE
17859: *
17860: * LISTR IS USED TO LIST A SOURCE LINE DURING THE INITIAL
17861: * COMPILATION. IT IS CALLED FROM SCANE AND SCANL.
17862: *
17863: * JSR LISTR CALL TO LIST LINE
17864: * (XR,XL,WA,WB,WC) DESTROYED
17865: *
17866: * GLOBAL LOCATIONS USED BY LISTR
17867: *
17868: * ERLST IF LISTING ON ACCOUNT OF AN ERROR
17869: *
17870: * LSTLC COUNT LINES ON CURRENT PAGE
17871: *
17872: * LSTNP MAX NUMBER OF LINES/PAGE
17873: *
17874: * LSTPF SET NON-ZERO IF THE CURRENT SOURCE
17875: * LINE HAS BEEN LISTED, ELSE ZERO.
17876: *
17877: * LSTPG COMPILER LISTING PAGE NUMBER
17878: *
17879: * LSTSN SET IF STMNT NUM TO BE LISTED
17880: *
17881: * R$CIM POINTER TO CURRENT INPUT LINE.
17882: *
17883: * R$TTL TITLE FOR SOURCE LISTING
17884: *
17885: * R$STL PTR TO SUB-TITLE STRING
17886: *
17887: * ENTRY POINT
17888: *
17889: LISTR PRC E,0 ENTRY POINT
17890: MOV STAGE,WA GET COMPILER STAGE
17891: BEQ WA,=STGIC,LIST0 LIST OK IF INITIAL COMPILE
17892: BEQ WA,=STGCE,LIST0 LIST OK IF END LINE
17893: BRN LIST4 ELSE NO LISTING OF SOURCE
17894: *
17895: * HERE WHEN STAGE IS OK TO LIST
17896: *
17897: LIST0 BNZ CNTTL,LIST5 JUMP IF -TITLE OR -STITL
17898: BNZ LSTPF,LIST4 IMMEDIATE EXIT IF ALREADY LISTED
17899: BGE LSTLC,LSTNP,LIST6 JUMP IF NO ROOM
17900: *
17901: * HERE AFTER PRINTING TITLE (IF NEEDED)
17902: *
17903: LIST1 MOV R$CIM,XR LOAD POINTER TO CURRENT IMAGE
17904: PLC XR POINT TO CHARACTERS
17905: LCH WA,(XR) LOAD FIRST CHARACTER
17906: MOV LSTSN,XR LOAD STATEMENT NUMBER
17907: BZE XR,LIST2 JUMP IF NO STATEMENT NUMBER
17908: MTI XR ELSE GET STMNT NUMBER AS INTEGER
17909: BEQ WA,=CH$AS,LIST2 NO STMNT NUMBER LIST IF COMMENT
17910: BEQ WA,=CH$MN,LIST2 NO STMNT NO. IF CONTROL CARD
17911: JSR PRTIN ELSE PRINT STATEMENT NUMBER
17912: ZER LSTSN AND CLEAR FOR NEXT TIME IN
17913: EJC
17914: *
17915: * LISTR (CONTINUED)
17916: *
17917: * MERGE HERE AFTER PRINTING STATEMENT NUMBER (IF REQUIRED)
17918: *
17919: LIST2 MOV =STNPD,PROFS POINT PAST STATEMENT NUMBER
17920: MOV R$CIM,XR LOAD POINTER TO CURRENT IMAGE
17921: JSR PRTSF PRINT IT
17922: ICV LSTLC BUMP LINE COUNTER
17923: MNZ LSTPF SET FLAG FOR LINE PRINTED
17924: *
17925: * MERGE HERE TO EXIT
17926: *
17927: LIST4 EXI RETURN TO LISTR CALLER
17928: *
17929: * PRINT TITLE AFTER -TITLE OR -STITL CARD
17930: *
17931: LIST5 ZER CNTTL CLEAR FLAG
17932: *
17933: * EJECT TO NEW PAGE AND LIST TITLE
17934: *
17935: LIST6 JSR PRTPS EJECT
17936: BNZ PRLEN,LIST7 SKIP IF LISTING TO REGULAR PRINTER
17937: BEQ R$TTL,=NULLS,LIST1 TERMINAL LISTING OMITS NULL TITLE
17938: *
17939: * LIST TITLE
17940: *
17941: LIST7 JSR LISTT LIST TITLE
17942: BRN LIST1 MERGE
17943: ENP END PROCEDURE LISTR
17944: EJC
17945: *
17946: * LISTT -- LIST TITLE AND SUBTITLE
17947: *
17948: * USED DURING COMPILATION TO PRINT PAGE HEADING
17949: *
17950: * JSR LISTT CALL TO LIST TITLE
17951: * (XR,WA) DESTROYED
17952: *
17953: LISTT PRC E,0 ENTRY POINT
17954: MOV R$TTL,XR POINT TO SOURCE LISTING TITLE
17955: JSR PRTST PRINT TITLE
17956: MOV LSTPO,PROFS SET OFFSET
17957: MOV =LSTMS,XR SET PAGE MESSAGE
17958: JSR PRTST PRINT PAGE MESSAGE
17959: ICV LSTPG BUMP PAGE NUMBER
17960: MTI LSTPG LOAD PAGE NUMBER AS INTEGER
17961: JSR PRTIN PRINT PAGE NUMBER
17962: JSR PRTFH TERMINATE TITLE LINE
17963: ADD =NUM02,LSTLC COUNT TITLE LINE AND BLANK LINE
17964: *
17965: * PRINT SUB-TITLE (IF ANY)
17966: *
17967: MOV R$STL,XR LOAD POINTER TO SUB-TITLE
17968: BZE XR,LSTT1 JUMP IF NO SUB-TITLE
17969: JSR PRTSF ELSE PRINT SUB-TITLE
17970: ICV LSTLC BUMP LINE COUNT
17971: *
17972: * RETURN POINT
17973: *
17974: LSTT1 JSR PRTFH PRINT A BLANK LINE
17975: EXI RETURN TO CALLER
17976: ENP END PROCEDURE LISTT
17977: EJC
17978: *
17979: * NEXTS -- ACQUIRE NEXT SOURCE IMAGE
17980: *
17981: * NEXTS IS USED TO ACQUIRE THE NEXT SOURCE IMAGE AT COMPILE
17982: * TIME. IT ASSUMES THAT A PRIOR CALL TO READR HAS INPUT
17983: * A LINE IMAGE (SEE PROCEDURE READR). BEFORE THE CURRENT
17984: * IMAGE IS FINALLY LOST IT MAY BE LISTED HERE.
17985: *
17986: * JSR NEXTS CALL TO ACQUIRE NEXT INPUT LINE
17987: * (XR,XL,WA,WB,WC) DESTROYED
17988: *
17989: * GLOBAL VALUES AFFECTED
17990: *
17991: * R$CNI ON INPUT, NEXT IMAGE. ON
17992: * EXIT RESET TO ZERO
17993: *
17994: * R$CIM ON EXIT, SET TO POINT TO IMAGE
17995: *
17996: * SCNIL INPUT IMAGE LENGTH ON EXIT
17997: *
17998: * SCNSE RESET TO ZERO ON EXIT
17999: *
18000: * LSTPF SET ON EXIT IF LINE IS LISTED
18001: *
18002: NEXTS PRC E,0 ENTRY POINT
18003: BZE CSWLS,NXTS1 JUMP IF -NOLIST
18004: MOV R$CIM,XR POINT TO IMAGE
18005: BZE XR,NXTS1 JUMP IF NO IMAGE
18006: PLC XR GET CHAR PTR
18007: LCH WA,(XR) GET FIRST CHAR
18008: BEQ WA,=CH$MN,NXTS1 SKIP LISTING IF CONTROL CARD
18009: JSR LISTR LIST LINE
18010: *
18011: * HERE AFTER POSSIBLE LISTING
18012: *
18013: NXTS1 MOV R$CNI,XR POINT TO NEXT IMAGE
18014: MOV XR,R$CIM SET AS NEXT IMAGE
18015: ZER R$CNI CLEAR NEXT IMAGE POINTER
18016: MOV SCLEN(XR),WA GET INPUT IMAGE LENGTH
18017: MOV CSWIN,WB GET MAX ALLOWABLE LENGTH
18018: BLO WA,WB,NXTS2 SKIP IF NOT TOO LONG
18019: MOV WB,WA ELSE TRUNCATE
18020: *
18021: * HERE WITH LENGTH IN (WA)
18022: *
18023: NXTS2 MOV WA,SCNIL USE AS RECORD LENGTH
18024: ZER SCNSE RESET SCNSE
18025: ZER LSTPF SET LINE NOT LISTED YET
18026: EXI RETURN TO NEXTS CALLER
18027: ENP END PROCEDURE NEXTS
18028: EJC
18029: *
18030: * PATIN -- PATTERN CONSTRUCTION FOR LEN,POS,RPOS,TAB,RTAB
18031: *
18032: * THESE PATTERN TYPES ALL GENERATE A SIMILAR NODE TYPE. SO
18033: * THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION
18034: * FOR ACTUAL ENTRY POINTS FOR THESE FIVE FUNCTIONS.
18035: *
18036: * (WA) PCODE FOR EXPRESSION ARG CASE
18037: * (WB) PCODE FOR INTEGER ARG CASE
18038: * JSR PATIN CALL TO BUILD PATTERN NODE
18039: * PPM LOC TRANSFER LOC FOR NOT INTEGER OR EXP
18040: * PPM LOC TRANSFER LOC FOR INT OUT OF RANGE
18041: * (XR) POINTER TO CONSTRUCTED NODE
18042: * (XL,WA,WB,WC,IA) DESTROYED
18043: *
18044: PATIN PRC N,2 ENTRY POINT
18045: MOV WA,XL PRESERVE EXPRESSION ARG PCODE
18046: JSR GTSMI TRY TO CONVERT ARG AS SMALL INTEGER
18047: PPM PTIN2 JUMP IF NOT INTEGER
18048: PPM PTIN3 JUMP IF OUT OF RANGE
18049: *
18050: * COMMON SUCCESSFUL EXIT POINT
18051: *
18052: PTIN1 JSR PBILD BUILD PATTERN NODE
18053: EXI RETURN TO CALLER
18054: *
18055: * HERE IF ARGUMENT IS NOT AN INTEGER
18056: *
18057: PTIN2 MOV XL,WB COPY EXPR ARG CASE PCODE
18058: BLO (XR),=B$E$$,PTIN1 ALL OK IF EXPRESSION ARG
18059: EXI 1 ELSE TAKE ERROR EXIT FOR WRONG TYPE
18060: *
18061: * HERE FOR ERROR OF OUT OF RANGE INTEGER ARGUMENT
18062: *
18063: PTIN3 EXI 2 TAKE OUT-OF-RANGE ERROR EXIT
18064: ENP END PROCEDURE PATIN
18065: EJC
18066: *
18067: * PATST -- PATTERN CONSTRUCTION FOR ANY,NOTANY,
18068: * BREAK,SPAN AND BREAKX PATTERN FUNCTIONS.
18069: *
18070: * THESE PATTERN FUNCTIONS BUILD SIMILAR TYPES OF NODES AND
18071: * THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION
18072: * FOR ACTUAL ENTRY POINTS FOR THESE FIVE PATTERN FUNCTIONS.
18073: *
18074: * 0(XS) STRING ARGUMENT
18075: * (WB) PCODE FOR ONE CHAR ARGUMENT
18076: * (XL) PCODE FOR MULTI-CHAR ARGUMENT
18077: * (WC) PCODE FOR EXPRESSION ARGUMENT
18078: * JSR PATST CALL TO BUILD NODE
18079: * PPM LOC TRANSFER LOC IF NOT STRING OR EXPR
18080: * (XS) POPPED PAST STRING ARGUMENT
18081: * (XR) POINTER TO CONSTRUCTED NODE
18082: * (XL) DESTROYED
18083: * (WA,WB,WC,RA) DESTROYED
18084: *
18085: * NOTE THAT THERE IS A SPECIAL CALL TO PATST IN THE EVALS
18086: * PROCEDURE WITH A SLIGHTLY DIFFERENT FORM. SEE EVALS
18087: * FOR DETAILS OF THE FORM OF THIS CALL.
18088: *
18089: PATST PRC N,1 ENTRY POINT
18090: JSR GTSTG CONVERT ARGUMENT AS STRING
18091: PPM PATS7 JUMP IF NOT STRING
18092: BNE WA,=NUM01,PATS2 JUMP IF NOT ONE CHAR STRING
18093: *
18094: * HERE FOR ONE CHAR STRING CASE
18095: *
18096: BZE WB,PATS2 TREAT AS MULTI-CHAR IF EVALS CALL
18097: PLC XR POINT TO CHARACTER
18098: LCH XR,(XR) LOAD CHARACTER
18099: *
18100: * COMMON EXIT POINT AFTER SUCCESSFUL CONSTRUCTION
18101: *
18102: PATS1 JSR PBILD CALL ROUTINE TO BUILD NODE
18103: EXI RETURN TO PATST CALLER
18104: EJC
18105: *
18106: * PATST (CONTINUED)
18107: *
18108: * HERE FOR MULTI-CHARACTER STRING CASE
18109: *
18110: PATS2 MOV XL,-(XS) SAVE MULTI-CHAR PCODE
18111: MOV XR,-(XS) SAVE STRING POINTER
18112: MOV CTMSK,WC LOAD CURRENT MASK BIT
18113: LSH WC,1 SHIFT TO NEXT POSITION
18114: NZB WC,PATS4 SKIP IF POSITION LEFT IN THIS TBL
18115: *
18116: * HERE WE MUST ALLOCATE A NEW CHARACTER TABLE
18117: *
18118: MOV *CTSI$,WA SET SIZE OF CTBLK
18119: JSR ALLOC ALLOCATE CTBLK
18120: MOV XR,R$CTP STORE PTR TO NEW CTBLK
18121: MOV =B$CTT,(XR)+ STORE TYPE CODE, BUMP PTR
18122: LCT WB,=CFP$A SET NUMBER OF WORDS TO CLEAR
18123: MOV BITS0,WC LOAD ALL ZERO BITS
18124: *
18125: * LOOP TO CLEAR ALL BITS IN TABLE TO ZEROS
18126: *
18127: PATS3 MOV WC,(XR)+ MOVE WORD OF ZERO BITS
18128: BCT WB,PATS3 LOOP TILL ALL CLEARED
18129: MOV BITS1,WC SET INITIAL BIT POSITION
18130: *
18131: * MERGE HERE WITH BIT POSITION AVAILABLE
18132: *
18133: PATS4 MOV WC,CTMSK SAVE PARM2 (NEW BIT POSITION)
18134: MOV (XS)+,XL RESTORE POINTER TO ARGUMENT STRING
18135: MOV SCLEN(XL),WB LOAD STRING LENGTH
18136: BZE WB,PATS6 JUMP IF NULL STRING CASE
18137: LCT WB,WB ELSE SET LOOP COUNTER
18138: PLC XL POINT TO CHARACTERS IN ARGUMENT
18139: EJC
18140: *
18141: * PATST (CONTINUED)
18142: *
18143: * LOOP TO SET BITS IN COLUMN OF TABLE
18144: *
18145: PATS5 LCH WA,(XL)+ LOAD NEXT CHARACTER
18146: WTB WA CONVERT TO BAU OFFSET
18147: MOV R$CTP,XR POINT TO CTBLK
18148: ADD WA,XR POINT TO CTBLK ENTRY
18149: MOV WC,WA COPY BIT MASK
18150: ORB CTCHS(XR),WA OR IN BITS ALREADY SET
18151: MOV WA,CTCHS(XR) STORE RESULTING BIT STRING
18152: BCT WB,PATS5 LOOP TILL ALL BITS SET
18153: *
18154: * COMPLETE PROCESSING FOR MUTI-CHAR STRING CASE
18155: *
18156: PATS6 MOV R$CTP,XR LOAD CTBLK PTR AS PARM1 FOR PBILD
18157: ZER XL CLEAR GARBAGE PTR IN XL
18158: MOV (XS)+,WB LOAD PCODE FOR MULTI-CHAR STR CASE
18159: BRN PATS1 BACK TO EXIT (WC=BITSTRING=PARM2)
18160: *
18161: * HERE IF ARGUMENT IS NOT A STRING
18162: *
18163: * NOTE THAT THE CALL FROM EVALS CANNOT PASS AN EXPRESSION
18164: * SINCE EVALP ALWAYS REEVALUATES EXPRESSIONS.
18165: *
18166: PATS7 MOV WC,WB SET PCODE FOR EXPRESSION ARGUMENT
18167: BLO (XR),=B$E$$,PATS1 JUMP TO EXIT IF EXPRESSION ARG
18168: EXI 1 ELSE TAKE WRONG TYPE ERROR EXIT
18169: ENP END PROCEDURE PATST
18170: EJC
18171: *
18172: * PBILD -- BUILD PATTERN NODE
18173: *
18174: * (XR) PARM1 (ONLY IF REQUIRED)
18175: * (WB) PCODE FOR NODE
18176: * (WC) PARM2 (ONLY IF REQUIRED)
18177: * JSR PBILD CALL TO BUILD NODE
18178: * (XR) POINTER TO CONSTRUCTED NODE
18179: * (WA) DESTROYED
18180: *
18181: PBILD PRC E,0 ENTRY POINT
18182: MOV XR,-(XS) STACK POSSIBLE PARM1
18183: MOV WB,XR COPY PCODE
18184: LEI XR LOAD ENTRY POINT ID (BL$PX)
18185: BEQ XR,=BL$P1,PBLD1 JUMP IF ONE PARAMETER
18186: BEQ XR,=BL$P0,PBLD3 JUMP IF NO PARAMETERS
18187: *
18188: * HERE FOR TWO PARAMETER CASE
18189: *
18190: MOV *PCSI$,WA SET SIZE OF P2BLK
18191: JSR ALLOC ALLOCATE BLOCK
18192: MOV WC,PARM2(XR) STORE SECOND PARAMETER
18193: BRN PBLD2 MERGE WITH ONE PARM CASE
18194: *
18195: * HERE FOR ONE PARAMETER CASE
18196: *
18197: PBLD1 MOV *PBSI$,WA SET SIZE OF P1BLK
18198: JSR ALLOC ALLOCATE NODE
18199: *
18200: * MERGE HERE FROM TWO PARM CASE
18201: *
18202: PBLD2 MOV (XS),PARM1(XR) STORE FIRST PARAMETER
18203: BRN PBLD4 MERGE WITH NO PARAMETER CASE
18204: *
18205: * HERE FOR CASE OF NO PARAMETERS
18206: *
18207: PBLD3 MOV *PASI$,WA SET SIZE OF P0BLK
18208: JSR ALLOC ALLOCATE NODE
18209: *
18210: * MERGE HERE FROM OTHER CASES
18211: *
18212: PBLD4 MOV WB,(XR) STORE PCODE
18213: ICA XS POP FIRST PARAMETER
18214: MOV =NDNTH,PTHEN(XR) SET NOTHEN SUCCESSOR POINTER
18215: EXI RETURN TO PBILD CALLER
18216: ENP END PROCEDURE PBILD
18217: EJC
18218: *
18219: * PCONC -- CONCATENATE TWO PATTERNS
18220: *
18221: * (XL) PTR TO RIGHT PATTERN
18222: * (XR) PTR TO LEFT PATTERN
18223: * JSR PCONC CALL TO CONCATENATE PATTERNS
18224: * (XR) PTR TO CONCATENATED PATTERN
18225: * (XL,WA,WB,WC) DESTROYED
18226: *
18227: *
18228: * TO CONCATENATE TWO PATTERNS, ALL SUCCESSORS IN THE LEFT
18229: * PATTERN WHICH POINT TO THE NOTHEN NODE MUST BE CHANGED TO
18230: * POINT TO THE RIGHT PATTERN. HOWEVER, THIS MODIFICATION
18231: * MUST BE PERFORMED ON A COPY OF THE LEFT ARGUMENT RATHER
18232: * THAN THE LEFT ARGUMENT ITSELF, SINCE THE LEFT ARGUMENT
18233: * MAY BE POINTED TO BY SOME OTHER VARIABLE VALUE.
18234: *
18235: * ACCORDINGLY, IT IS NECESSARY TO COPY THE LEFT ARGUMENT.
18236: * THIS IS NOT A TRIVIAL PROCESS SINCE WE MUST AVOID COPYING
18237: * NODES MORE THAN ONCE AND THE PATTERN IS A GRAPH STRUCTURE
18238: * THE FOLLOWING ALGORITHM IS EMPLOYED.
18239: *
18240: * THE STACK IS USED TO STORE A LIST OF NODES WHICH
18241: * HAVE ALREADY BEEN COPIED. THE FORMAT OF THE ENTRIES ON
18242: * THIS LIST CONSISTS OF A TWO WORD BLOCK. THE FIRST WORD
18243: * IS THE OLD ADDRESS AND THE SECOND WORD IS THE ADDRESS
18244: * OF THE COPY. THIS LIST IS SEARCHED BY THE PCOPY
18245: * ROUTINE TO AVOID MAKING DUPLICATE COPIES. A TRICK IS
18246: * USED TO ACCOMPLISH THE CONCATENATION AT THE SAME TIME.
18247: * A SPECIAL ENTRY IS MADE TO START WITH ON THE STACK. THIS
18248: * ENTRY RECORDS THAT THE NOTHEN NODE HAS BEEN COPIED
18249: * ALREADY AND THE ADDRESS OF ITS COPY IS THE RIGHT PATTERN.
18250: * THIS AUTOMATICALLY PERFORMS THE CORRECT REPLACEMENTS.
18251: *
18252: PCONC PRC E,0 ENTRY POINT
18253: ZER -(XS) MAKE ROOM FOR ONE ENTRY AT BOTTOM
18254: MOV XS,WC STORE POINTER TO START OF LIST
18255: MOV =NDNTH,-(XS) STACK NOTHEN NODE AS OLD NODE
18256: MOV XL,-(XS) STORE RIGHT ARG AS COPY OF NOTHEN
18257: MOV XS,XT INITIALIZE POINTER TO STACK ENTRIES
18258: JSR PCOPY COPY FIRST NODE OF LEFT ARG
18259: MOV WA,2(XT) STORE AS RESULT UNDER LIST
18260: EJC
18261: *
18262: * PCONC (CONTINUED)
18263: *
18264: * THE FOLLOWING LOOP SCANS ENTRIES IN THE LIST AND MAKES
18265: * SURE THAT THEIR SUCCESSORS HAVE BEEN COPIED.
18266: *
18267: PCNC1 BEQ XT,XS,PCNC2 JUMP IF ALL ENTRIES PROCESSED
18268: MOV -(XT),XR ELSE LOAD NEXT OLD ADDRESS
18269: MOV PTHEN(XR),XR LOAD POINTER TO SUCCESSOR
18270: JSR PCOPY COPY SUCCESSOR NODE
18271: MOV -(XT),XR LOAD POINTER TO NEW NODE (COPY)
18272: MOV WA,PTHEN(XR) STORE PTR TO NEW SUCCESSOR
18273: *
18274: * NOW CHECK FOR SPECIAL CASE OF ALTERNATION NODE WHERE
18275: * PARM1 POINTS TO A NODE AND MUST BE COPIED LIKE PTHEN.
18276: *
18277: BNE (XR),=P$ALT,PCNC1 LOOP BACK IF NOT
18278: MOV PARM1(XR),XR ELSE LOAD POINTER TO ALTERNATIVE
18279: JSR PCOPY COPY IT
18280: MOV (XT),XR RESTORE PTR TO NEW NODE
18281: MOV WA,PARM1(XR) STORE PTR TO COPIED ALTERNATIVE
18282: BRN PCNC1 LOOP BACK FOR NEXT ENTRY
18283: *
18284: * HERE AT END OF COPY PROCESS
18285: *
18286: PCNC2 MOV WC,XS RESTORE STACK POINTER
18287: MOV (XS)+,XR LOAD POINTER TO COPY
18288: EXI RETURN TO PCONC CALLER
18289: ENP END PROCEDURE PCONC
18290: EJC
18291: *
18292: * PCOPY -- COPY A PATTERN NODE
18293: *
18294: * PCOPY IS CALLED FROM THE PCONC PROCEDURE TO COPY A SINGLE
18295: * PATTERN NODE. THE COPY IS ONLY CARRIED OUT IF THE NODE
18296: * HAS NOT BEEN COPIED ALREADY.
18297: *
18298: * (XR) POINTER TO NODE TO BE COPIED
18299: * (XT) PTR TO CURRENT LOC IN COPY LIST
18300: * (WC) POINTER TO LIST OF COPIED NODES
18301: * JSR PCOPY CALL TO COPY A NODE
18302: * (WA) POINTER TO COPY
18303: * (WB,XR) DESTROYED
18304: *
18305: PCOPY PRC N,0 ENTRY POINT
18306: MOV XT,WB SAVE XT
18307: MOV WC,XT POINT TO START OF LIST
18308: *
18309: * LOOP TO SEARCH LIST OF NODES COPIED ALREADY
18310: *
18311: PCOP1 DCA XT POINT TO NEXT ENTRY ON LIST
18312: BEQ XR,(XT),PCOP2 JUMP IF MATCH
18313: DCA XT ELSE SKIP OVER COPIED ADDRESS
18314: BNE XT,XS,PCOP1 LOOP BACK IF MORE TO TEST
18315: *
18316: * HERE IF NOT IN LIST, PERFORM COPY
18317: *
18318: MOV (XR),WA LOAD FIRST WORD OF BLOCK
18319: JSR BLKLN GET LENGTH OF BLOCK
18320: MOV XR,XL SAVE POINTER TO OLD NODE
18321: JSR ALLOC ALLOCATE SPACE FOR COPY
18322: MOV XL,-(XS) STORE OLD ADDRESS ON LIST
18323: MOV XR,-(XS) STORE NEW ADDRESS ON LIST
18324: CHK CHECK FOR STACK OVERFLOW
18325: MVW MOVE WORDS FROM OLD BLOCK TO COPY
18326: MOV (XS),WA LOAD POINTER TO COPY
18327: BRN PCOP3 JUMP TO EXIT
18328: *
18329: * HERE IF WE FIND ENTRY IN LIST
18330: *
18331: PCOP2 MOV -(XT),WA LOAD ADDRESS OF COPY FROM LIST
18332: *
18333: * COMMON EXIT POINT
18334: *
18335: PCOP3 MOV WB,XT RESTORE XT
18336: EXI RETURN TO PCOPY CALLER
18337: ENP END PROCEDURE PCOPY
18338: .IF .CNPF
18339: .ELSE
18340: EJC
18341: *
18342: * PRFLR -- PRINT PROFILE
18343: * PRFLR IS CALLED TO PRINT THE CONTENTS OF THE PROFILE
18344: * TABLE IN A FAIRLY READABLE TABULAR FORMAT.
18345: *
18346: * JSR PRFLR CALL TO PRINT PROFILE
18347: * (WA,IA) DESTROYED
18348: *
18349: PRFLR PRC E,0
18350: BZE PFDMP,PRFL4 NO PRINTING IF NO PROFILING DONE
18351: MOV XR,-(XS) PRESERVE ENTRY XR
18352: MOV WB,PFSVW AND ALSO WB
18353: JSR PRTPG EJECT
18354: MOV =PFMS1,XR LOAD MSG /PROGRAM PROFILE/
18355: JSR PRTFB AND PRINT IT
18356: MOV =PFMS2,XR POINT TO FIRST HDR
18357: JSR PRTSF PRINT IT
18358: MOV =PFMS3,XR SECOND HDR
18359: JSR PRTFB
18360: ZER WB INITIAL STMT COUNT
18361: MOV PFTBL,XR POINT TO TABLE ORIGIN
18362: ADD *NUM02,XR BIASS PAST XNBLK HEADER
18363: EJC
18364: *
18365: * PRFLR (CONTINUED)
18366: *
18367: * LOOP FOR PRINTING TABLE ENTRIES
18368: *
18369: PRFL1 ICV WB BUMP STMT NR
18370: LDI (XR) LOAD NR OF EXECUTIONS
18371: IEQ PRFL3 NO PRINTING IF ZERO
18372: MOV =PFPD1,PROFS POINT WHERE TO PRINT
18373: JSR PRTIN AND PRINT IT
18374: ZER PROFS BACK TO START OF LINE
18375: MTI WB LOAD STMT NR
18376: JSR PRTIN PRINT IT THERE
18377: MOV =PFPD2,PROFS AND PAD PAST COUNT
18378: LDI CFP$I(XR) LOAD TOTAL EXEC TIME
18379: JSR PRTIN PRINT THAT TOO
18380: LDI CFP$I(XR) RELOAD TIME
18381: MLI INTTH CONVERT TO MICROSEC
18382: IOV PRFL2 OMIT NEXT BIT IF OVERFLOW
18383: DVI (XR) DIVIDE BY EXECUTIONS
18384: MOV =PFPD3,PROFS PAD LAST PRINT
18385: JSR PRTIN AND PRINT MCSEC/EXECN
18386: *
18387: * PRINT A BLANK
18388: *
18389: PRFL2 JSR PRTFH THATS ANOTHER LINE
18390: *
18391: * TEST TO SEE IF LOOP FINISHED
18392: *
18393: PRFL3 ADD *PF$I2,XR BUMP INDEX POINTER
18394: BLT WB,PFNTE,PRFL1 LOOP IF MORE STMTS
18395: MOV (XS)+,XR RESTORE CALLERS XR
18396: MOV PFSVW,WB AND WB TOO
18397: *
18398: * RETURN POINT
18399: *
18400: PRFL4 EXI RETURN
18401: ENP END OF PRFLR
18402: EJC
18403: *
18404: * PRFLU -- UPDATE AN ENTRY IN THE PROFILE TABLE
18405: *
18406: * ON ENTRY, KVSTN CONTAINS NR OF STMT TO PROFILE
18407: *
18408: * JSR PRFLU CALL TO UPDATE ENTRY
18409: * (IA) DESTROYED
18410: *
18411: PRFLU PRC E,0
18412: BNZ PFFNC,PFLU4 SKIP IF JUST ENTERED FUNCTION
18413: MOV XR,-(XS) PRESERVE ENTRY XR
18414: MOV WA,PFSVW SAVE WA
18415: BNZ PFTBL,PFLU2 BRANCH IF TABLE ALLOCATED
18416: *
18417: * HERE IF SPACE FOR PROFILE TABLE NOT YET ALLOCATED.
18418: * CALCULATE SIZE NEEDED, ALLOCATE A STATIC XNBLK, AND
18419: * INITIALIZE IT ALL TO ZERO.
18420: * THE TIME TAKEN FOR THIS WILL BE ATTRIBUTED TO THE CURRENT
18421: * STATEMENT (ASSIGNMENT TO KEYWD PROFILE), BUT SINCE THE
18422: * TIMING FOR THIS STATEMENT IS UP THE POLE ANYWAY, THIS
18423: * DOESNT REALLY MATTER...
18424: *
18425: SUB =NUM01,PFNTE ADJUST FOR EXTRA COUNT
18426: MTI PFI2A CONVRT ENTRY SIZE TO INT
18427: STI PFSTE AND STORE SAFELY FOR LATER
18428: MTI PFNTE LOAD TABLE LENGTH AS INTEGER
18429: MLI PFSTE MULTIPLY BY ENTRY SIZE
18430: MFI WA GET BACK ADDRESS-STYLE
18431: ADD =NUM02,WA ADD ON 2 WORD OVERHEAD
18432: WTB WA CONVERT THE WHOLE LOT TO BYTES
18433: JSR ALOST GIMME THE SPACE
18434: MOV XR,PFTBL SAVE BLOCK POINTER
18435: MOV =B$XNT,(XR)+ PUT BLOCK TYPE AND ...
18436: MOV WA,(XR)+ ... LENGTH INTO HEADER
18437: MFI WA GET BACK NR OF WDS IN DATA AREA
18438: LCT WA,WA LOAD THE COUNTER
18439: *
18440: * LOOP HERE TO ZERO THE BLOCK DATA
18441: *
18442: PFLU1 ZER (XR)+ BLANK A WORD
18443: BCT WA,PFLU1 AND ALL THE REST
18444: EJC
18445: *
18446: * PRFLU (CONTINUED)
18447: *
18448: * END OF ALLOCATION. MERGE BACK INTO ROUTINE
18449: *
18450: PFLU2 MTI KVSTN LOAD NR OF STMT JUST ENDED
18451: SBI INTV1 MAKE INTO INDEX OFFSET
18452: MLI PFSTE MAKE OFFSET OF TABLE ENTRY
18453: MFI WA CONVERT TO ADDRESS
18454: WTB WA GET AS BAUS
18455: ADD *NUM02,WA OFFSET INCLUDES TABLE HEADER
18456: MOV PFTBL,XR GET TABLE START
18457: BGE WA,NUM01(XR),PFLU3 IF OUT OF TABLE, SKIP IT
18458: ADD WA,XR ELSE POINT TO ENTRY
18459: LDI (XR) GET NR OF EXECUTIONS SO FAR
18460: ADI INTV1 NUDGE UP ONE
18461: STI (XR) AND PUT BACK
18462: JSR SYSTM GET TIME NOW
18463: STI PFETM STASH ENDING TIME
18464: SBI PFSTM SUBTRACT START TIME
18465: ADI CFP$I(XR) ADD CUMULATIVE TIME SO FAR
18466: STI CFP$I(XR) AND PUT BACK NEW TOTAL
18467: LDI PFETM LOAD END TIME OF THIS STMT ...
18468: STI PFSTM ... WHICH IS START TIME OF NEXT
18469: *
18470: * RETURN POINT
18471: *
18472: PFLU3 MOV (XS)+,XR RESTORE CALLERS XR
18473: MOV PFSVW,WA RESTORE WA
18474: EXI AND RETURN
18475: *
18476: * HERE IF PROFILE IS SUPPRESSED BECAUSE A PROGRAM DEFINED
18477: * FUNCTION IS ABOUT TO BE ENTERED, AND SO THE CURRENT STMT
18478: * HAS NOT YET FINISHED
18479: *
18480: PFLU4 ZER PFFNC RESET THE CONDITION FLAG
18481: EXI AND IMMEDIATE RETURN
18482: ENP END OF PROCEDURE PRFLU
18483: .FI
18484: EJC
18485: *
18486: * PRPAR -- PROCESS PRINT PARAMETERS
18487: *
18488: * JSR PRPAR CALL TO PROCESS PRINT PARAMETERS
18489: * (XR,WA,WB,WC) DESTROYED
18490: *
18491: PRPAR PRC E,0 ENTRY POINT
18492: MOV XL,-(XS) SAVE XL
18493: JSR SYSPP GET PRINT PARAMETERS
18494: BNZ WB,PRPA1 JUMP IF LINES/PAGE SPECIFIED
18495: MOV =CFP$M,WB ELSE USE A LARGE VALUE
18496: RSH WB,1 BUT NOT TOO LARGE
18497: *
18498: * STORE LINE COUNT/PAGE
18499: *
18500: PRPA1 MOV WB,LSTNP STORE NUMBER OF LINES/PAGE
18501: MOV WB,LSTLC PRETEND PAGE IS FULL INITIALLY
18502: ZER LSTPG CLEAR PAGE NUMBER
18503: BZE PRLEN,PRPA2 SKIP IF NOT SYSXI RESUMPTION
18504: BHI WA,PRLEN,PRPA3 SKIP IF BIGGER THAN PRIOR BFRS
18505: *
18506: * STORE PRINT BUFFER LENGTH
18507: *
18508: PRPA2 MOV WA,PRLEN STORE VALUE
18509: *
18510: * CHECK TERMINAL BUFFER SIZE
18511: *
18512: PRPA3 BZE TTLEN,PRPA4 SKIP IF NOT SYSXI RESUMPTION
18513: BHI XL,TTLEN,PRPA5 SKIP IF TOO BIG
18514: *
18515: * STORE TERMINAL BUFFER LENGTH
18516: *
18517: PRPA4 MOV XL,TTLEN BFR LENGTH
18518: *
18519: * PROCESS BITS OPTIONS
18520: *
18521: PRPA5 MOV BITS1,WB BIT 1 MASK
18522: ANB WC,WB GET BIT
18523: MOV WB,TTINS INPUT FROM TERMINAL FLAG
18524: MOV BITS2,WB BIT 2 MASK
18525: ANB WC,WB GET BIT
18526: MOV WB,TTOUS STD OUTPUT TO TERMINAL FLAG
18527: MOV TTLEN,TTERL ERRORS TO TERML IF AVAILABLE
18528: MOV PRLEN,PRAVL NOTE IF A PRINT FILE IS AVAILABLE
18529: ZRB WB,PRPA6 IF FLAG SET, CLEAR TTERL SINCE ...
18530: ZER TTERL ... TERML GETS ALL OUTPUT ALREADY
18531: MOV TTLEN,TTOUS REGULAR O/P TO TERML IF AVAILABLE
18532: MOV TTLEN,PRLEN REVISED PRINT BUFFER LENGTH
18533: ZER TTLEN DONT NEED SEPARATE TERML BUFFER
18534: EJC
18535: *
18536: * PRPAR (CONTINUED)
18537: *
18538: * GET OFFSET TO /PAGE NN/ PART OF HEADER
18539: *
18540: PRPA6 MOV PRLEN,WA STD BFR LENGTH
18541: BNZ WA,PRPA7 USE IF NON-ZERO
18542: MOV TTLEN,WA ELSE TRY TERMINAL
18543: BZE WA,PRPA8 GIVE UP IF ZERO ALSO
18544: *
18545: * GET OFFSET
18546: *
18547: PRPA7 MOV WA,PRLEN STORE AS BUFFER LENGTH
18548: SUB =NUM08,WA JUST BEFORE END OF LINE
18549: MOV WA,LSTPO KEEP IT
18550: MOV TTOUS,WB CONSTRUCT VALUE FOR ...
18551: ORB PRAVL,WB ... USE IN DECIDING WHETHER TO ...
18552: MOV WB,PRPUT ... PUT STRINGS IN OUTPUT BUFFER
18553: *
18554: * MORE BITS
18555: *
18556: PRPA8 MOV BITS3,WB BIT 3 MASK
18557: ANB WC,WB GET -NOLIST BIT
18558: ZRB WB,PRPA9 SKIP IF CLEAR
18559: ZER CSWLS SET -NOLIST
18560: *
18561: * MORE BITS
18562: *
18563: PRPA9 MOV BITS4,WB BIT 4 MASK
18564: ANB WC,WB GET BIT
18565: MOV WB,CPSTS FLAG FOR COMPILE STATS SUPPRESSN.
18566: MOV BITS5,WB BIT 5 MASK
18567: ANB WC,WB GET BIT
18568: MOV WB,EXSTS FLAG FOR EXEC STATS SUPPRESSION
18569: MOV BITS6,WB BIT 6 MASK
18570: ANB WC,WB GET BIT
18571: MOV WB,NOXEQ SET NOEXECUTE IF NON-ZERO
18572: MOV BITS7,WB BIT 7 MASK
18573: ANB WC,WB GET BIT
18574: ZRB WB,PRP10 SKIP IF NOT SET
18575: ZER TTERL CLEAR ERRORS TO TERML IF SET
18576: *
18577: * MORE BITS
18578: *
18579: PRP10 MOV BITS8,WB BIT 8 MASK
18580: ANB WC,WB GET BIT
18581: MOV WB,HEADN SYSID HEADERS INCLUDE/OMIT FLAG
18582: MOV BITS9,WB BIT 9 MASK
18583: ANB WC,WB GET BIT
18584: MOV WB,PRSTO STANDARD LISTING FLAG
18585: MOV BIT10,WB BIT 10 MASK
18586: ANB WC,WB GET BIT
18587: MOV WB,PRECL EXTENDED LISTING OPTION
18588: MOV (XS)+,XL RESTORE XL
18589: EXI RETURN
18590: ENP END PROCEDURE PRPAR
18591: EJC
18592: *
18593: * PRTCF -- PRINT CHAR TO STD PRINTER AND FLUSH BFR
18594: *
18595: * (WA) CHAR TO PRINT
18596: * JSR PRTCF CALL TO PRINT AND FLUSH
18597: *
18598: PRTCF PRC E,0 ENTRY POINT
18599: JSR PRTCH PRINT CHARACTER
18600: JSR PRTFH FLUSH BUFFER
18601: EXI RETURN TO CALLER
18602: ENP END PROCEDURE PRTCF
18603: *
18604: * PRTCH -- PRINT A CHARACTER ON STANDARD PRINTER
18605: *
18606: * PRTCH IS USED TO PRINT A SINGLE CHARACTER
18607: *
18608: * (WA) CHARACTER TO BE PRINTED
18609: * JSR PRTCH CALL TO PRINT CHARACTER
18610: *
18611: PRTCH PRC E,0 ENTRY POINT
18612: BZE PRLEN,PTCH2 SKIP IF NO PRINT FILE
18613: MOV XR,-(XS) SAVE XR
18614: BNE PROFS,PRLEN,PTCH1 JUMP IF ROOM IN BUFFER
18615: JSR PRTFH ELSE PRINT THIS LINE
18616: *
18617: * HERE AFTER MAKING SURE WE HAVE ROOM
18618: *
18619: PTCH1 MOV PRBUF,XR POINT TO PRINT BUFFER
18620: PSC XR,PROFS POINT TO NEXT CHARACTER LOCATION
18621: SCH WA,(XR) STORE NEW CHARACTER
18622: CSC XR COMPLETE STORE CHARACTERS
18623: ICV PROFS BUMP POINTER
18624: MOV (XS)+,XR RESTORE ENTRY XR
18625: *
18626: * RETURN POINT
18627: *
18628: PTCH2 EXI RETURN TO PRTCH CALLER
18629: ENP END PROCEDURE PRTCH
18630: *
18631: * PRTFB -- PRINT STRING, FLUSH BFR AND PRINT BLANK LINE
18632: *
18633: * (XR) STRING TO PRINT
18634: * JSR PRTFB CALL FOR PRINT FLUSH AND BLANK
18635: *
18636: PRTFB PRC E,0 ENTRY POINT
18637: JSR PRTSF PRINT AND FLUSH
18638: JSR PRTFH PRINT BLANK
18639: EXI RETURN TO CALLER
18640: ENP END PROCEDURE PRTFB
18641: EJC
18642: *
18643: * PRTFH -- FLUSH STANDARD PRINT BUFFER
18644: *
18645: * PRTFH PRINTS THE CONTENTS OF THE PRINT BUFFER, RESETS
18646: * THE BUFFER TO ALL BLANKS AND RESETS THE PRINT POINTER.
18647: * ON ITS FIRST CALL IT MAY PRINT LISTING HEADERS.
18648: * IF TTLST IS NON-ZERO, IT COPIES PRINT BUFFER TO
18649: * TERMINAL AND FLUSHES THIS ALSO.
18650: *
18651: * JSR PRTFH CALL TO FLUSH BUFFER
18652: *
18653: PRTFH PRC R,0 ENTRY POINT
18654: BNZ HEADP,PTFH1 WERE HEADERS PRINTED
18655: JSR PRTPS NO - PRINT THEM
18656: *
18657: * HEADERS DONE
18658: *
18659: PTFH1 BZE PRLEN,PTFH4 SKIP IF NO OUTPUT POSSIBLE
18660: MOV XL,-(XS) SAVE XL
18661: MOV XR,-(XS) SAVE XR
18662: MOV WA,-(XS) SAVE WA
18663: MOV WC,-(XS) SAVE WC
18664: MOV PRBUF,XR LOAD POINTER TO BUFFER
18665: MOV PROFS,WC LOAD NUMBER OF CHARS IN BUFFER
18666: BNZ PRAVL,PTFH5 SKIP IF PRINT FILE AVAILABLE
18667: BNZ TTOUS,PTFH2 SKIP IF STD OUTPUT TO TERML
18668: BZE TTLST,PTFH3 LAST POSSIBILITY IS ERROR TO TERML
18669: *
18670: * SEND TO TERMINAL
18671: *
18672: PTFH2 JSR SYSPI PRINT TO TERMINAL
18673: PPM PTFH6 FAIL
18674: PPM EROSI ERROR
18675: EJC
18676: * PRTFH (CONTINUED)
18677: *
18678: * BLANK BUFFER
18679: *
18680: PTFH3 MOV PRBLK,XL POINT TO BLANKING STRING
18681: MOV PRCHS,XR POINT TO BUFFER
18682: MOV PRCMV,WA COUNT OF BAUS TO MOVE
18683: MVW MOVE BLANKS INTO BUFFER
18684: ZER PROFS RESET OFFSET
18685: MOV (XS)+,WC RESTORE WC
18686: MOV (XS)+,WA RECOVER WA
18687: MOV (XS)+,XR RESTORE XR
18688: MOV (XS)+,XL RESTORE XL
18689: *
18690: * RETURN POINT
18691: *
18692: PTFH4 EXI RETURN TO CALLER
18693: *
18694: * HERE FOR REGULAR PRINT FILE
18695: *
18696: PTFH5 JSR SYSPR CALL SYSTEM PRINT ROUTINE
18697: PPM PTFH6 JUMP IF FAILED
18698: PPM EROSI STOP IF ERROR
18699: BZE TTLST,PTFH3 SKIP IF NO COPY TO TERMINAL
18700: MOV PROFS,SCLEN(XR) SET STRING LENGTH FOR PTTST
18701: JSR PTTST COPY STD BUFFER TO TERML BFR
18702: JSR PTTFH FLUSH IT
18703: MOV PRLEN,SCLEN(XR) RESTORE BUFFER LENGTH
18704: BRN PTFH3 MERGE
18705: *
18706: * A FAILURE SUCH AS FILE OVERFILLED OCCURRED
18707: *
18708: PTFH6 BZE STAGX,PTFH3 IGNORE IF COMPILE TIME
18709: BRN EXFAL ELSE CAUSE STMT FAILURE
18710: ENP END PROCEDURE PRTFH
18711: EJC
18712: *
18713: * PRTIN -- PRINT AN INTEGER
18714: *
18715: * PRTIN PRINTS THE INTEGER VALUE WHICH IS IN THE INTEGER
18716: * ACCUMULATOR. BLOCKS BUILT IN DYNAMIC STORAGE
18717: * DURING THIS PROCESS ARE IMMEDIATELY DELETED.
18718: *
18719: * (IA) INTEGER VALUE TO BE PRINTED
18720: * JSR PRTIN CALL TO PRINT INTEGER
18721: * (IA,RA) DESTROYED
18722: *
18723: PRTIN PRC E,0 ENTRY POINT
18724: MOV XR,-(XS) SAVE XR
18725: JSR ICBLD BUILD INTEGER BLOCK
18726: BLO XR,DNAMB,PRTI1 JUMP IF ICBLK BELOW DYNAMIC
18727: BHI XR,DNAMP,PRTI1 JUMP IF ABOVE DYNAMIC
18728: MOV XR,DNAMP IMMEDIATELY DELETE IT
18729: *
18730: * DELETE ICBLK FROM DYNAMIC STORE
18731: *
18732: PRTI1 MOV XR,-(XS) STACK PTR FOR GTSTG
18733: JSR GTSTG CONVERT TO STRING
18734: PPM CONVERT ERROR IS IMPOSSIBLE
18735: MOV XR,DNAMP RESET POINTER TO DELETE SCBLK
18736: JSR PRTST PRINT INTEGER STRING
18737: MOV (XS)+,XR RESTORE ENTRY XR
18738: EXI RETURN TO PRTIN CALLER
18739: ENP END PROCEDURE PRTIN
18740: *
18741: * PRTMI -- PRINT MESSAGE AND INTEGER
18742: *
18743: * PRTMI IS USED TO PRINT MESSAGES TOGETHER WITH AN INTEGER
18744: * VALUE STARTING IN COLUMN 15 (USED BY THE ROUTINES AT
18745: * THE END OF COMPILATION).
18746: *
18747: * JSR PRTMI CALL TO PRINT MESSAGE AND INTEGER
18748: *
18749: PRTMI PRC E,0 ENTRY POINT
18750: JSR PRTST PRINT STRING MESSAGE
18751: MOV =PRTMF,PROFS SET OFFSET TO COL 15
18752: JSR PRTIN PRINT INTEGER
18753: JSR PRTFH PRINT LINE
18754: EXI RETURN TO PRTMI CALLER
18755: ENP END PROCEDURE PRTMI
18756: EJC
18757: *
18758: * PRTNM -- PRINT VARIABLE NAME
18759: *
18760: * PRTNM IS USED TO PRINT A CHARACTER REPRESENTATION OF THE
18761: * NAME OF A VARIABLE (NOT A VALUE OF DATATYPE NAME)
18762: * NAMES OF PSEUDO-VARIABLES MAY NOT BE PASSED TO PRTNM.
18763: *
18764: * (XL) NAME BASE
18765: * (WA) NAME OFFSET
18766: * JSR PRTNM CALL TO PRINT NAME
18767: * (WB,WC,RA) DESTROYED
18768: *
18769: PRTNM PRC R,0 ENTRY POINT (RECURSIVE, SEE PRTVL)
18770: MOV WA,-(XS) SAVE WA (OFFSET IS COLLECTABLE)
18771: MOV XR,-(XS) SAVE ENTRY XR
18772: MOV XL,-(XS) SAVE NAME BASE
18773: BHI XL,STATE,PRN02 JUMP IF NOT NATURAL VARIABLE
18774: *
18775: * HERE FOR NATURAL VARIABLE NAME, RECOGNIZED BY THE FACT
18776: * THAT THE NAME BASE POINTS INTO THE STATIC AREA.
18777: *
18778: MOV XL,XR POINT TO VRBLK
18779: JSR PRTVN PRINT NAME OF VARIABLE
18780: *
18781: * COMMON EXIT POINT
18782: *
18783: PRN01 MOV (XS)+,XL RESTORE NAME BASE
18784: MOV (XS)+,XR RESTORE ENTRY VALUE OF XR
18785: MOV (XS)+,WA RESTORE WA
18786: EXI RETURN TO PRTNM CALLER
18787: *
18788: * HERE FOR CASE OF NON-NATURAL VARIABLE
18789: *
18790: PRN02 MOV WA,WB COPY NAME OFFSET
18791: BNE (XL),=B$PDT,PRN03 JUMP IF ARRAY OR TABLE
18792: *
18793: * FOR PROGRAM DEFINED DATATYPE, PRT FLD NAME, LEFT PAREN
18794: *
18795: MOV PDDFP(XL),XR LOAD POINTER TO DFBLK
18796: ADD WA,XR ADD NAME OFFSET
18797: MOV PDFOF(XR),XR LOAD VRBLK POINTER FOR FIELD
18798: JSR PRTVN PRINT FIELD NAME
18799: MOV =CH$PP,WA LOAD LEFT PAREN
18800: JSR PRTCH PRINT CHARACTER
18801: EJC
18802: *
18803: * PRTNM (CONTINUED)
18804: *
18805: * NOW WE PRINT AN IDENTIFYING NAME FOR THE OBJECT IF ONE
18806: * CAN BE FOUND. THE FOLLOWING CODE SEARCHES FOR A NATURAL
18807: * VARIABLE WHICH CONTAINS THIS OBJECT AS VALUE. IF SUCH A
18808: * VARIABLE IS FOUND, ITS NAME IS PRINTED, ELSE THE VALUE
18809: * OF THE OBJECT (AS PRINTED BY PRTVL) IS USED INSTEAD.
18810: *
18811: * FIRST WE POINT TO THE PARENT TBBLK IF THIS IS THE CASE OF
18812: * A TABLE ELEMENT. TO DO THIS, CHASE DOWN THE TRNXT CHAIN.
18813: *
18814: PRN03 BNE (XL),=B$TET,PRN04 JUMP IF WE GOT THERE (OR NOT TE)
18815: MOV TENXT(XL),XL ELSE MOVE OUT ON CHAIN
18816: BRN PRN03 AND LOOP BACK
18817: *
18818: * NOW WE ARE READY FOR THE SEARCH. TO SPEED THINGS UP IN
18819: * THE CASE OF CALLS FROM DUMP WHERE THE SAME NAME BASE
18820: * WILL OCCUR REPEATEDLY WHILE DUMPING AN ARRAY OR TABLE,
18821: * WE REMEMBER THE LAST VRBLK POINTER FOUND IN PRNMV. SO
18822: * FIRST CHECK TO SEE IF WE HAVE THIS ONE AGAIN.
18823: *
18824: PRN04 MOV PRNMV,XR POINT TO VRBLK WE FOUND LAST TIME
18825: MOV HSHTB,WA POINT TO HASH TABLE IN CASE NOT
18826: BRN PRN07 JUMP INTO SEARCH FOR SPECIAL CHECK
18827: *
18828: * LOOP THROUGH HASH SLOTS
18829: *
18830: PRN05 MOV WA,XR COPY SLOT POINTER
18831: ICA WA BUMP SLOT POINTER
18832: SUB *VRNXT,XR INTRODUCE STANDARD VRBLK OFFSET
18833: *
18834: * LOOP THROUGH VRBLKS ON ONE HASH CHAIN
18835: *
18836: PRN06 MOV VRNXT(XR),XR POINT TO NEXT VRBLK ON HASH CHAIN
18837: *
18838: * MERGE HERE FIRST TIME TO CHECK BLOCK WE FOUND LAST TIME
18839: *
18840: PRN07 MOV XR,WC COPY VRBLK POINTER
18841: BZE WC,PRN09 JUMP IF CHAIN END (OR PRNMV ZERO)
18842: EJC
18843: *
18844: * PRTNM (CONTINUED)
18845: *
18846: * LOOP TO FIND VALUE (CHASE DOWN POSSIBLE TRBLK CHAIN)
18847: *
18848: PRN08 MOV VRVAL(XR),XR LOAD VALUE
18849: BEQ (XR),=B$TRT,PRN08 LOOP IF THAT WAS A TRBLK
18850: *
18851: * NOW WE HAVE THE VALUE, IS THIS THE BLOCK WE WANT
18852: *
18853: BEQ XR,XL,PRN10 JUMP IF THIS MATCHES THE NAME BASE
18854: MOV WC,XR ELSE POINT BACK TO THAT VRBLK
18855: BRN PRN06 AND LOOP BACK
18856: *
18857: * HERE TO MOVE TO NEXT HASH SLOT
18858: *
18859: PRN09 BLT WA,HSHTE,PRN05 LOOP BACK IF MORE TO GO
18860: MOV XL,XR ELSE NOT FOUND, COPY VALUE POINTER
18861: JSR PRTVL PRINT VALUE
18862: BRN PRN11 AND MERGE AHEAD
18863: *
18864: * HERE WHEN WE FIND A MATCHING ENTRY
18865: *
18866: PRN10 MOV WC,XR COPY VRBLK POINTER
18867: MOV XR,PRNMV SAVE FOR NEXT TIME IN
18868: JSR PRTVN PRINT VARIABLE NAME
18869: *
18870: * MERGE HERE IF NO ENTRY FOUND
18871: *
18872: PRN11 MOV (XL),WC LOAD FIRST WORD OF NAME BASE
18873: BNE WC,=B$PDT,PRN13 JUMP IF NOT PROGRAM DEFINED
18874: *
18875: * FOR PROGRAM DEFINED DATATYPE, ADD RIGHT PAREN AND EXIT
18876: *
18877: MOV =CH$RP,WA LOAD RIGHT PAREN, MERGE
18878: *
18879: * MERGE HERE TO PRINT FINAL RIGHT PAREN OR BRACKET
18880: *
18881: PRN12 JSR PRTCH PRINT FINAL CHARACTER
18882: MOV WB,WA RESTORE NAME OFFSET
18883: BRN PRN01 MERGE BACK TO EXIT
18884: EJC
18885: *
18886: * PRTNM (CONTINUED)
18887: *
18888: * HERE FOR ARRAY OR TABLE
18889: *
18890: PRN13 MOV =CH$BB,WA LOAD LEFT BRACKET
18891: JSR PRTCH AND PRINT IT
18892: MOV (XS),XL RESTORE BLOCK POINTER
18893: MOV (XL),WC LOAD TYPE WORD AGAIN
18894: BNE WC,=B$TET,PRN15 JUMP IF NOT TABLE
18895: *
18896: * HERE FOR TABLE, PRINT SUBSCRIPT VALUE
18897: *
18898: MOV TESUB(XL),XR LOAD SUBSCRIPT VALUE
18899: MOV WB,XL SAVE NAME OFFSET
18900: JSR PRTVL PRINT SUBSCRIPT VALUE
18901: MOV XL,WB RESTORE NAME OFFSET
18902: *
18903: * MERGE HERE FROM ARRAY CASE TO PRINT RIGHT BRACKET
18904: *
18905: PRN14 MOV =CH$RB,WA LOAD RIGHT BRACKET
18906: BRN PRN12 MERGE BACK TO PRINT IT
18907: *
18908: * HERE FOR ARRAY OR VECTOR, TO PRINT SUBSCRIPT(S)
18909: *
18910: PRN15 MOV WB,WA COPY NAME OFFSET
18911: BTW WA CONVERT TO WORDS
18912: BEQ WC,=B$ART,PRN16 JUMP IF ARBLK
18913: *
18914: * HERE FOR VECTOR
18915: *
18916: SUB =VCVLB,WA ADJUST FOR STANDARD FIELDS
18917: MTI WA MOVE TO INTEGER ACCUM
18918: JSR PRTIN PRINT LINEAR SUBSCRIPT
18919: BRN PRN14 MERGE BACK FOR RIGHT BRACKET
18920: EJC
18921: *
18922: * PRTNM (CONTINUED)
18923: *
18924: * HERE FOR ARRAY. FIRST CALCULATE ABSOLUTE SUBSCRIPT
18925: * OFFSETS BY SUCCESSIVE DIVISIONS BY THE DIMENSION VALUES.
18926: * THIS MUST BE DONE RIGHT TO LEFT SINCE THE ELEMENTS ARE
18927: * STORED ROW-WISE. THE SUBSCRIPTS ARE STACKED AS INTEGERS.
18928: *
18929: PRN16 MOV AROFS(XL),WC LOAD LENGTH OF BOUNDS INFO
18930: ICA WC ADJUST FOR ARPRO FIELD
18931: BTW WC CONVERT TO WORDS
18932: SUB WC,WA GET LINEAR ZERO-ORIGIN SUBSCRIPT
18933: MTI WA GET INTEGER VALUE
18934: LCT WA,ARNDM(XL) SET NUM OF DIMENSIONS AS LOOP COUNT
18935: ADD AROFS(XL),XL POINT PAST BOUNDS INFORMATION
18936: SUB *ARLBD,XL SET OK OFFSET FOR PROPER PTR LATER
18937: *
18938: * LOOP TO STACK SUBSCRIPT OFFSETS
18939: *
18940: PRN17 SUB *ARDMS,XL POINT TO NEXT SET OF BOUNDS
18941: STI PRNSI SAVE CURRENT OFFSET
18942: RMI ARDIM(XL) GET REMAINDER ON DIVIDING BY DIMENS
18943: MFI -(XS) STORE ON STACK (ONE WORD)
18944: LDI PRNSI RELOAD ARGUMENT
18945: DVI ARDIM(XL) DIVIDE TO GET QUOTIENT
18946: BCT WA,PRN17 LOOP TILL ALL STACKED
18947: ZER XR SET OFFSET TO FIRST SET OF BOUNDS
18948: LCT WB,ARNDM(XL) LOAD COUNT OF DIMS TO CONTROL LOOP
18949: BRN PRN19 JUMP INTO PRINT LOOP
18950: *
18951: * LOOP TO PRINT SUBSCRIPTS FROM STACK ADJUSTING BY ADDING
18952: * THE APPROPRIATE LOW BOUND VALUE FROM THE ARBLK
18953: *
18954: PRN18 MOV =CH$CM,WA LOAD A COMMA
18955: JSR PRTCH PRINT IT
18956: *
18957: * MERGE HERE FIRST TIME IN (NO COMMA REQUIRED)
18958: *
18959: PRN19 MTI (XS)+ LOAD SUBSCRIPT OFFSET AS INTEGER
18960: ADD XR,XL POINT TO CURRENT LBD
18961: ADI ARLBD(XL) ADD LBD TO GET SIGNED SUBSCRIPT
18962: SUB XR,XL POINT BACK TO START OF ARBLK
18963: JSR PRTIN PRINT SUBSCRIPT
18964: ADD *ARDMS,XR BUMP OFFSET TO NEXT BOUNDS
18965: BCT WB,PRN18 LOOP BACK TILL ALL PRINTED
18966: BRN PRN14 MERGE BACK TO PRINT RIGHT BRACKET
18967: ENP END PROCEDURE PRTNM
18968: EJC
18969: *
18970: * PRTNV -- PRINT NAME VALUE
18971: *
18972: * PRTNV IS USED BY THE TRACE AND DUMP ROUTINES TO PRINT
18973: * A LINE OF THE FORM
18974: *
18975: * NAME = VALUE
18976: *
18977: * NOTE THAT THE NAME INVOLVED CAN NEVER BE A PSEUDO-VAR
18978: *
18979: * (XL) NAME BASE
18980: * (WA) NAME OFFSET
18981: * JSR PRTNV CALL TO PRINT NAME = VALUE
18982: * (WB,WC,RA) DESTROYED
18983: *
18984: PRTNV PRC E,0 ENTRY POINT
18985: JSR PRTNM PRINT ARGUMENT NAME
18986: MOV XR,-(XS) SAVE ENTRY XR
18987: MOV WA,-(XS) SAVE NAME OFFSET (COLLECTABLE)
18988: MOV =TMBEB,XR POINT TO BLANK EQUAL BLANK
18989: JSR PRTST PRINT IT
18990: MOV XL,XR COPY NAME BASE
18991: ADD WA,XR POINT TO VALUE
18992: MOV (XR),XR LOAD VALUE POINTER
18993: JSR PRTVF PRINT VALUE
18994: MOV (XS)+,WA RESTORE NAME OFFSET
18995: MOV (XS)+,XR RESTORE ENTRY XR
18996: EXI RETURN TO CALLER
18997: ENP END PROCEDURE PRTNV
18998: EJC
18999: *
19000: * PRTPG -- PRINT A PAGE THROW
19001: *
19002: * PRINTS A PAGE THROW OR A FEW BLANK LINES ON THE STANDARD
19003: * LISTING FILE DEPENDING ON THE LISTING OPTIONS CHOSEN.
19004: *
19005: * JSR PRTPG CALL FOR PAGE EJECT
19006: *
19007: PRTPG PRC E,0 ENTRY POINT
19008: BNZ STAGX,PTPG1 SKIP IF EXECUTION TIME
19009: BZE LSTLC,PTPG6 RETURN IF TOP OF PAGE ALREADY
19010: ZER LSTLC CLEAR LINE COUNT
19011: *
19012: * CHECK TYPE OF LISTING
19013: *
19014: PTPG1 MOV XR,-(XS) PRESERVE XR
19015: BNZ PRECL,PTPG2 EJECT IF EXTENDED LISTING
19016: BZE PRSTD,PTPG3 SKIP IF COMPACT LISTING
19017: BNZ TTOUS,PTPG3 SKIP IF LISTING TO TERMINAL
19018: *
19019: * PERFORM AN EJECT
19020: *
19021: PTPG2 JSR SYSEP EJECT
19022: PPM PTPG4 IGNORE FAILURE
19023: PPM EROSI ERROR
19024: BRN PTPG4 MERGE
19025: *
19026: * COMPACT LISTING.
19027: *
19028: PTPG3 BNZ HEADN,PTPG4 SKIP IF HEADERS OMITTED
19029: MOV HEADP,XR REMEMBER HEADP
19030: MNZ HEADP SET TO AVOID RECURSIVE PRTPG CALLS
19031: JSR PRTFH PRINT BLANK LINE
19032: JSR PRTFH PRINT BLANK LINE
19033: JSR PRTFH PRINT BLANK LINE
19034: MOV =NUM03,LSTLC COUNT BLANK LINES
19035: MOV XR,HEADP RESTORE HEADER FLAG
19036: EJC
19037: *
19038: * PRPTG (CONTINUED)
19039: *
19040: * PRINT THE HEADING
19041: *
19042: PTPG4 BNZ HEADP,PTPG5 JUMP IF HEADER LISTED
19043: MNZ HEADP MARK HEADERS PRINTED
19044: BNZ HEADN,PTPG5 SKIP IF HEADERS OMITTED
19045: MOV XL,-(XS) KEEP XL
19046: MOV =HEADR,XR POINT TO LISTING HEADER
19047: JSR PRTST PLACE IT
19048: JSR SYSID GET SYSTEM IDENTIFICATION
19049: JSR PRTSF APPEND EXTRA CHARS AND PRINT
19050: MOV XL,XR EXTRA HEADER LINE
19051: JSR PRTFB PLACE IT AND A BLANK
19052: JSR PRTFH AND ANOTHER
19053: ADD =NUM04,LSTLC FOUR HEADER LINES PRINTED
19054: MOV (XS)+,XL RESTORE XL
19055: *
19056: * MERGE IF HEADER NOT PRINTED
19057: *
19058: PTPG5 MOV (XS)+,XR RESTORE XR
19059: *
19060: * RETURN
19061: *
19062: PTPG6 EXI RETURN
19063: ENP END PROCEDURE PRTPG
19064: EJC
19065: *
19066: * PRTPS -- PRINT PAGE WITH TEST FOR STANDARD LISTING OPTION
19067: *
19068: * IF THE STANDARD LISTING OPTION IS SELECTED, INSIST THAT
19069: * AN EJECT BE DONE
19070: *
19071: * JSR PRTPS CALL FOR EJECT
19072: *
19073: PRTPS PRC E,0 ENTRY POINT
19074: MOV PRSTO,PRSTD COPY OPTION FLAG
19075: JSR PRTPG PRINT PAGE
19076: ZER PRSTD CLEAR FLAG
19077: EXI RETURN
19078: ENP END PROCEDURE PRTPS
19079: *
19080: * PRTSF -- PRINT STRING TO STD PRINTER AND FLUSH BFR
19081: *
19082: * (XR) STRING TO PRINT
19083: * JSR PRTSF CALL TO PRINT AND FLUSH
19084: *
19085: PRTSF PRC E,0 ENTRY POINT
19086: JSR PRTST PRINT STRING
19087: JSR PRTFH FLUSH BUFFER
19088: EXI RETURN TO CALLER
19089: ENP END PROCEDURE PRTSF
19090: EJC
19091: *
19092: * PRTSN -- PRINT STATEMENT NUMBER
19093: *
19094: * PRTSN IS USED TO INITIATE A PRINT TRACE LINE BY PRINTING
19095: * ASTERISKS AND THE CURRENT STATEMENT NUMBER. THE ACTUAL
19096: * FORMAT OF THE OUTPUT GENERATED IS.
19097: *
19098: * ***NNNNN**** III.....IIII
19099: *
19100: * NNNNN IS THE STATEMENT NUMBER WITH LEADING ZEROS REPLACED
19101: * BY ASTERISKS (E.G. *******9****)
19102: *
19103: * III...III REPRESENTS A VARIABLE LENGTH OUTPUT CONSISTING
19104: * OF A NUMBER OF LETTER I CHARACTERS EQUAL TO FNCLEVEL.
19105: *
19106: * JSR PRTSN CALL TO PRINT STATEMENT NUMBER
19107: * (WC) DESTROYED
19108: *
19109: PRTSN PRC E,0 ENTRY POINT
19110: MOV XR,-(XS) SAVE ENTRY XR
19111: MOV WA,PRSNA SAVE ENTRY WA
19112: MOV =TMASB,XR POINT TO ASTERISKS
19113: JSR PRTST PRINT ASTERISKS
19114: MOV =NUM04,PROFS POINT INTO MIDDLE OF ASTERISKS
19115: MTI KVSTN LOAD STATEMENT NUMBER AS INTEGER
19116: JSR PRTIN PRINT INTEGER STATEMENT NUMBER
19117: MOV =PRSNF,PROFS POINT PAST ASTERISKS PLUS BLANK
19118: MOV KVFNC,XR GET FNCLEVEL
19119: MOV =CH$LI,WA SET LETTER I
19120: *
19121: * LOOP TO GENERATE LETTER I FNCLEVEL TIMES
19122: *
19123: PRSN1 BZE XR,PRSN2 JUMP IF ALL SET
19124: JSR PRTCH ELSE PRINT AN I
19125: DCV XR DECREMENT COUNTER
19126: BRN PRSN1 LOOP BACK
19127: *
19128: * MERRE WITH ALL LETTER I CHARACTERS GENERATED
19129: *
19130: PRSN2 MOV =CH$BL,WA GET BLANK
19131: JSR PRTCH PRINT BLANK
19132: MOV PRSNA,WA RESTORE ENTRY WA
19133: MOV (XS)+,XR RESTORE ENTRY XR
19134: EXI RETURN TO PRTSN CALLER
19135: ENP END PROCEDURE PRTSN
19136: EJC
19137: *
19138: * PRTST -- PRINT STRING TO STANDARD FILE
19139: *
19140: * PLACE A STRING OF CHARACTERS IN THE STANDARD PRINT BUFFER
19141: *
19142: * NOTE THAT THE FIRST WORD OF THE BLOCK (NORMALLY B$SCL)
19143: * IS NOT USED AND NEED NOT BE SET CORRECTLY (SEE PRTVN)
19144: * IF GLOBAL TTOUS IS NON-ZERO, STRING IS SENT TO TERMINAL
19145: * INSTEAD OF STANDARD OUTPUT FILE.
19146: * IF GLOBAL TTLST IS NON-ZERO, STRING IS SENT TO
19147: * TERMINAL AS WELL AS STANDARD OUTPUT FILE
19148: *
19149: * (XR) STRING TO BE PRINTED
19150: * JSR PRTST CALL TO PRINT STRING
19151: * (PROFS) UPDATED PAST CHARS PLACED
19152: *
19153: PRTST PRC R,0 ENTRY POINT
19154: BNZ HEADP,PTST1 WERE HEADERS PRINTED
19155: JSR PRTPS NO - PRINT THEM
19156: *
19157: * HEADERS DEALT WITH
19158: *
19159: PTST1 BZE PRLEN,PTST7 SKIP IF NO O/P POSSIBLE
19160: BNZ PRPUT,PTST2 SKIP IF PUTTING IS OK
19161: BZE TTLST,PTST7 SKIP OUT IF NOT ERROR TO TERML
19162: *
19163: * KEEP REGISTERS
19164: *
19165: PTST2 MOV WA,PRSVA SAVE WA
19166: MOV WB,PRSVB SAVE WB
19167: ZER WB SET CHARS PRINTED COUNT TO ZERO
19168: *
19169: * LOOP TO PRINT SUCCESSIVE LINES FOR LONG STRING
19170: *
19171: PTST3 MOV SCLEN(XR),WA LOAD STRING LENGTH
19172: SUB WB,WA SUBTRACT COUNT OF CHARS ALREADY OUT
19173: BZE WA,PTST6 JUMP TO EXIT IF NONE LEFT
19174: MOV XL,-(XS) ELSE STACK ENTRY XL
19175: MOV XR,-(XS) SAVE ARGUMENT
19176: MOV XR,XL COPY FOR EVENTUAL MOVE
19177: MOV PRLEN,XR LOAD PRINT BUFFER LENGTH
19178: SUB PROFS,XR GET CHARS LEFT IN PRINT BUFFER
19179: BNZ XR,PTST4 SKIP IF ROOM LEFT ON THIS LINE
19180: JSR PRTFH PRINT THIS LINE
19181: MOV PRLEN,XR AND SET FULL WIDTH AVAILABLE
19182: EJC
19183: *
19184: * PRTST (CONTINUED)
19185: *
19186: * HERE WITH CHARS TO PRINT AND SOME ROOM IN BUFFER
19187: *
19188: PTST4 BLO WA,XR,PTST5 JUMP IF ROOM FOR REST OF STRING
19189: MOV XR,WA ELSE SET TO FILL LINE
19190: *
19191: * MERGE HERE WITH CHARACTER COUNT IN WA
19192: *
19193: PTST5 MOV PRBUF,XR POINT TO PRINT BUFFER
19194: PLC XL,WB POINT TO LOCATION IN STRING
19195: PSC XR,PROFS POINT TO LOCATION IN BUFFER
19196: ADD WA,WB BUMP STRING CHARS COUNT
19197: ADD WA,PROFS BUMP BUFFER POINTER
19198: MVC MOVE CHARACTERS TO BUFFER
19199: MOV (XS)+,XR RESTORE ARGUMENT POINTER
19200: MOV (XS)+,XL RESTORE ENTRY XL
19201: BRN PTST3 LOOP BACK TO TEST FOR MORE
19202: *
19203: * HERE TO EXIT AFTER PRINTING STRING
19204: *
19205: PTST6 MOV PRSVB,WB RESTORE ENTRY WB
19206: MOV PRSVA,WA RESTORE ENTRY WA
19207: *
19208: * RETURN POINT
19209: *
19210: PTST7 EXI RETURN TO PRTST CALLER
19211: ENP END PROCEDURE PRTST
19212: *
19213: * PRTVF -- PLACE A VALUE AND FLUSH STANDARD BUFFER
19214: *
19215: * (XR) VALUE TO PRINT
19216: * JSR PRTVF CALL TO PRINT AND FLUSH
19217: *
19218: PRTVF PRC E,0 ENTRY POINT
19219: JSR PRTVL PLACE VALUE
19220: JSR PRTFH FLUSH BUFFER
19221: EXI RETURN TO CALLER
19222: ENP END PROCEDURE PRTVF
19223: EJC
19224: *
19225: * PRTVL -- PRINT A VALUE
19226: *
19227: * PRTVL PLACES AN APPROPRIATE CHARACTER REPRESENTATION OF
19228: * A DATA VALUE IN THE PRINT BUFFER FOR DUMP/TRACE USE.
19229: *
19230: * (XR) VALUE TO BE PRINTED
19231: * JSR PRTVL CALL TO PRINT VALUE
19232: * (WA,WB,WC,RA) DESTROYED
19233: *
19234: PRTVL PRC R,0 ENTRY POINT, RECURSIVE
19235: MOV XL,-(XS) SAVE ENTRY XL
19236: MOV XR,-(XS) SAVE ARGUMENT
19237: CHK CHECK FOR STACK OVERFLOW
19238: *
19239: * LOOP BACK HERE AFTER FINDING A TRAP BLOCK (TRBLK)
19240: *
19241: PRV01 MOV IDVAL(XR),PRVSI COPY IDVAL (IF ANY)
19242: MOV (XR),XL LOAD FIRST WORD OF BLOCK
19243: LEI XL LOAD ENTRY POINT ID
19244: BSW XL,BL$$T,PRV02 SWITCH ON BLOCK TYPE
19245: IFF BL$TR,PRV04 TRBLK
19246: IFF BL$AR,PRV05 ARBLK
19247: IFF BL$IC,PRV08 ICBLK
19248: IFF BL$NM,PRV09 NMBLK
19249: IFF BL$PD,PRV10 PDBLK
19250: .IF .CNRA
19251: .ELSE
19252: IFF BL$RC,PRV08 RCBLK
19253: .FI
19254: IFF BL$SC,PRV11 SCBLK
19255: IFF BL$SE,PRV12 SEBLK
19256: IFF BL$TB,PRV13 TBBLK
19257: IFF BL$VC,PRV13 VCBLK
19258: .IF .CNBF
19259: .ELSE
19260: IFF BL$BC,PRV15 BCBLK
19261: .FI
19262: ESW END OF SWITCH ON BLOCK TYPE
19263: *
19264: * HERE FOR BLOCKS FOR WHICH WE JUST PRINT DATATYPE NAME
19265: *
19266: PRV02 JSR DTYPE GET DATATYPE NAME
19267: JSR PRTST PRINT DATATYPE NAME
19268: *
19269: * COMMON EXIT POINT
19270: *
19271: PRV03 MOV (XS)+,XR RELOAD ARGUMENT
19272: MOV (XS)+,XL RESTORE XL
19273: EXI RETURN TO PRTVL CALLER
19274: *
19275: * HERE FOR TRBLK
19276: *
19277: PRV04 MOV TRVAL(XR),XR LOAD REAL VALUE
19278: BRN PRV01 AND LOOP BACK
19279: EJC
19280: *
19281: * PRTVL (CONTINUED)
19282: *
19283: * HERE FOR ARRAY (ARBLK)
19284: *
19285: * PRINT ARRAY ( PROTOTYPE ) BLANK NUMBER IDVAL
19286: *
19287: PRV05 MOV XR,XL PRESERVE ARGUMENT
19288: MOV =SCARR,XR POINT TO DATATYPE NAME (ARRAY)
19289: JSR PRTST PRINT IT
19290: MOV =CH$PP,WA LOAD LEFT PAREN
19291: JSR PRTCH PRINT LEFT PAREN
19292: ADD AROFS(XL),XL POINT TO PROTOTYPE
19293: MOV (XL),XR LOAD PROTOTYPE
19294: JSR PRTST PRINT PROTOTYPE
19295: *
19296: * VCBLK, TBBLK MERGE HERE FOR ) BLANK NUMBER IDVAL
19297: *
19298: PRV06 MOV =CH$RP,WA LOAD RIGHT PAREN
19299: JSR PRTCH PRINT RIGHT PAREN
19300: *
19301: * PDBLK MERGES HERE TO PRINT BLANK NUMBER IDVAL
19302: *
19303: PRV07 MOV =CH$BL,WA LOAD BLANK
19304: JSR PRTCH PRINT IT
19305: MOV =CH$NM,WA LOAD NUMBER SIGN
19306: JSR PRTCH PRINT IT
19307: MTI PRVSI GET IDVAL
19308: JSR PRTIN PRINT ID NUMBER
19309: BRN PRV03 BACK TO EXIT
19310: *
19311: * HERE FOR INTEGER (ICBLK), REAL (RCBLK)
19312: *
19313: * PRINT CHARACTER REPRESENTATION OF VALUE
19314: *
19315: PRV08 MOV XR,-(XS) STACK ARGUMENT FOR GTSTG
19316: JSR GTSTG CONVERT TO STRING
19317: PPM ERROR RETURN IS IMPOSSIBLE
19318: JSR PRTST PRINT THE STRING
19319: MOV XR,DNAMP DELETE GARBAGE STRING FROM STORAGE
19320: BRN PRV03 BACK TO EXIT
19321: EJC
19322: *
19323: * PRTVL (CONTINUED)
19324: *
19325: * NAME (NMBLK)
19326: *
19327: * FOR PSEUDO-VARIABLE, JUST PRINT DATATYPE NAME (NAME)
19328: * FOR ALL OTHER NAMES, PRINT DOT FOLLOWED BY NAME REP
19329: *
19330: PRV09 MOV NMBAS(XR),XL LOAD NAME BASE
19331: MOV (XL),WA LOAD FIRST WORD OF BLOCK
19332: BEQ WA,=B$KVT,PRV02 JUST PRINT NAME IF KEYWORD
19333: BEQ WA,=B$EVT,PRV02 JUST PRINT NAME IF EXPRESSION VAR
19334: MOV =CH$DT,WA ELSE GET DOT
19335: JSR PRTCH AND PRINT IT
19336: MOV NMOFS(XR),WA LOAD NAME OFFSET
19337: JSR PRTNM PRINT NAME
19338: BRN PRV03 BACK TO EXIT
19339: *
19340: * PROGRAM DATATYPE (PDBLK)
19341: *
19342: * PRINT DATATYPE NAME CH$BL CH$NM IDVAL
19343: *
19344: PRV10 JSR DTYPE GET DATATYPE NAME
19345: JSR PRTST PRINT DATATYPE NAME
19346: BRN PRV07 MERGE BACK TO PRINT ID
19347: *
19348: * HERE FOR STRING (SCBLK)
19349: *
19350: * PRINT QUOTE STRING-CHARACTERS QUOTE
19351: *
19352: PRV11 MOV =CH$SQ,WA LOAD SINGLE QUOTE
19353: JSR PRTCH PRINT QUOTE
19354: JSR PRTST PRINT STRING VALUE
19355: JSR PRTCH PRINT ANOTHER QUOTE
19356: BRN PRV03 BACK TO EXIT
19357: EJC
19358: *
19359: * PRTVL (CONTINUED)
19360: *
19361: * HERE FOR SIMPLE EXPRESSION (SEBLK)
19362: *
19363: * PRINT ASTERISK VARIABLE-NAME
19364: *
19365: PRV12 MOV =CH$AS,WA LOAD ASTERISK
19366: JSR PRTCH PRINT ASTERISK
19367: MOV SEVAR(XR),XR LOAD VARIABLE POINTER
19368: JSR PRTVN PRINT VARIABLE NAME
19369: BRN PRV03 JUMP BACK TO EXIT
19370: *
19371: * HERE FOR TABLE (TBBLK) AND ARRAY (VCBLK)
19372: *
19373: * PRINT DATATYPE ( PROTOTYPE ) BLANK NUMBER IDVAL
19374: *
19375: PRV13 MOV XR,XL PRESERVE ARGUMENT
19376: JSR DTYPE GET DATATYPE NAME
19377: JSR PRTST PRINT DATATYPE NAME
19378: MOV =CH$PP,WA LOAD LEFT PAREN
19379: JSR PRTCH PRINT LEFT PAREN
19380: MOV TBLEN(XL),WA LOAD LENGTH OF BLOCK (=VCLEN)
19381: BTW WA CONVERT TO WORD COUNT
19382: SUB =TBSI$,WA ALLOW FOR STANDARD FIELDS
19383: BEQ (XL),=B$TBT,PRV14 JUMP IF TABLE
19384: ADD =VCTBD,WA FOR VCBLK, ADJUST SIZE
19385: *
19386: * PRINT PROTOTYPE
19387: *
19388: PRV14 MTI WA MOVE AS INTEGER
19389: JSR PRTIN PRINT INTEGER PROTOTYPE
19390: BRN PRV06 MERGE BACK FOR REST
19391: .IF .CNBF
19392: .ELSE
19393: EJC
19394: *
19395: * PRTVL (CONTINUED)
19396: *
19397: * HERE FOR BUFFER (BCBLK)
19398: *
19399: PRV15 MOV XR,XL PRESERVE ARGUMENT
19400: MOV =SCBUF,XR POINT TO DATATYPE NAME (BUFFER)
19401: JSR PRTST PRINT IT
19402: MOV =CH$PP,WA LOAD LEFT PAREN
19403: JSR PRTCH PRINT LEFT PAREN
19404: MOV BCBUF(XL),XR POINT TO BFBLK
19405: MTI BFALC(XR) LOAD ALLOCATION SIZE
19406: JSR PRTIN PRINT IT
19407: MOV =CH$CM,WA LOAD COMMA
19408: JSR PRTCH PRINT IT
19409: MTI BCLEN(XL) LOAD DEFINED LENGTH
19410: JSR PRTIN PRINT IT
19411: BRN PRV06 MERGE TO FINISH UP
19412: .FI
19413: ENP END PROCEDURE PRTVL
19414: EJC
19415: *
19416: * PRTVN -- PRINT NATURAL VARIABLE NAME
19417: *
19418: * PRTVN PRINTS THE NAME OF A NATURAL VARIABLE
19419: *
19420: * (XR) POINTER TO VRBLK
19421: * JSR PRTVN CALL TO PRINT VARIABLE NAME
19422: *
19423: PRTVN PRC E,0 ENTRY POINT
19424: MOV XR,-(XS) STACK VRBLK POINTER
19425: ADD *VRSOF,XR POINT TO POSSIBLE STRING NAME
19426: BNZ SCLEN(XR),PRVN1 JUMP IF NOT SYSTEM VARIABLE
19427: MOV VRSVO(XR),XR POINT TO SVBLK WITH NAME
19428: *
19429: * MERGE HERE WITH DUMMY SCBLK POINTER IN XR
19430: *
19431: PRVN1 JSR PRTST PRINT STRING NAME OF VARIABLE
19432: MOV (XS)+,XR RESTORE VRBLK POINTER
19433: EXI RETURN TO PRTVN CALLER
19434: ENP END PROCEDURE PRTVN
19435: EJC
19436: *
19437: * PTTFH -- FLUSH TERMINAL BUFFER
19438: *
19439: * PRINTS THE CONTENTS OF THE TTY BUFFER, RESETS
19440: * THE BUFFER TO ALL BLANKS AND RESETS THE POINTER.
19441: *
19442: * JSR PTTFH CALL TO FLUSH BUFFER
19443: *
19444: PTTFH PRC E,0 ENTRY POINT
19445: BZE TTLEN,PTTF2 SKIP IF NO TERMINAL
19446: MOV XL,-(XS) SAVE XL
19447: MOV XR,-(XS) SAVE XR
19448: MOV WA,-(XS) SAVE WA
19449: MOV WC,-(XS) SAVE WC
19450: MOV TTBUF,XR LOAD POINTER TO BUFFER
19451: MOV TTOFS,WC LOAD NUMBER OF CHARS IN BUFFER
19452: JSR SYSPI CALL SYSTEM PRINT ROUTINE
19453: PPM PTTF3 JUMP IF FAILED
19454: PPM EROSI STOP IF ERROR
19455: *
19456: * BLANK BUFFER
19457: *
19458: PTTF1 MOV TTBLK,XL POINT TO BLANKING STRING
19459: MOV TTCHS,XR POINT TO BUFFER
19460: MOV TTCMV,WA COUNT OF BAUS TO MOVE
19461: MVW MOVE BLANKS INTO BUFFER
19462: ZER TTOFS RESET OFFSET
19463: MOV (XS)+,WC RESTORE WC
19464: MOV (XS)+,WA RECOVER WA
19465: MOV (XS)+,XR RESTORE XR
19466: MOV (XS)+,XL RESTORE XL
19467: *
19468: * RETURN POINT
19469: *
19470: PTTF2 EXI RETURN TO CALLER
19471: *
19472: * A FAILURE SUCH AS FILE OVERFILLED OCCURRED
19473: *
19474: PTTF3 BZE STAGX,PTTF1 IGNORE IF COMPILE TIME
19475: BRN EXFAL ELSE CAUSE STMT FAILURE
19476: ENP END PROCEDURE
19477: EJC
19478: *
19479: * PTTST -- PRINT STRING TO TERMINAL
19480: *
19481: * PLACE A STRING OF CHARACTERS IN THE TERMINAL BUFFER
19482: *
19483: * NOTE THAT THE FIRST WORD OF THE BLOCK (NORMALLY B$SCL)
19484: * IS NOT USED AND NEED NOT BE SET CORRECTLY (SEE PRTVN)
19485: *
19486: * (XR) STRING TO BE PRINTED
19487: * JSR PTTST CALL TO PRINT STRING
19488: * (TTOFS) UPDATED PAST CHARS PLACED
19489: *
19490: PTTST PRC E,0 ENTRY POINT
19491: BZE TTLEN,PTTS5 SKIP IF NO TERMINAL
19492: MOV WA,PRTVA SAVE WA
19493: MOV WB,PRTVB SAVE WB
19494: ZER WB SET CHARS PRINTED COUNT TO ZERO
19495: *
19496: * LOOP TO PRINT SUCCESSIVE LINES FOR LONG STRING
19497: *
19498: PTTS1 MOV SCLEN(XR),WA LOAD STRING LENGTH
19499: SUB WB,WA SUBTRACT COUNT OF CHARS ALREADY OUT
19500: BZE WA,PTTS4 JUMP TO EXIT IF NONE LEFT
19501: MOV XL,-(XS) ELSE STACK ENTRY XL
19502: MOV XR,-(XS) SAVE ARGUMENT
19503: MOV XR,XL COPY FOR EVENTUAL MOVE
19504: MOV TTLEN,XR LOAD BUFFER LENGTH
19505: SUB TTOFS,XR GET CHARS LEFT IN BUFFER
19506: BNZ XR,PTTS2 SKIP IF ROOM LEFT ON THIS LINE
19507: JSR PTTFH ELSE PRINT THIS LINE
19508: MOV TTLEN,XR AND SET FULL WIDTH AVAILABLE
19509: *
19510: * HERE WITH CHARS TO PRINT AND SOME ROOM IN BUFFER
19511: *
19512: PTTS2 BLO WA,XR,PTTS3 JUMP IF ROOM FOR REST OF STRING
19513: MOV XR,WA ELSE SET TO FILL LINE
19514: *
19515: * MERGE HERE WITH CHARACTER COUNT IN WA
19516: *
19517: PTTS3 MOV TTBUF,XR POINT TO PRINT BUFFER
19518: PLC XL,WB POINT TO LOCATION IN STRING
19519: PSC XR,TTOFS POINT TO LOCATION IN BUFFER
19520: ADD WA,WB BUMP STRING CHARS COUNT
19521: ADD WA,TTOFS BUMP BUFFER POINTER
19522: MVC MOVE CHARACTERS TO BUFFER
19523: MOV (XS)+,XR RESTORE ARGUMENT POINTER
19524: MOV (XS)+,XL RESTORE ENTRY XL
19525: BRN PTTS1 LOOP BACK TO TEST FOR MORE
19526: EJC
19527: *
19528: * HERE TO EXIT AFTER PRINTING STRING
19529: *
19530: PTTS4 MOV PRTVB,WB RESTORE ENTRY WB
19531: MOV PRTVA,WA RESTORE ENTRY WA
19532: *
19533: * RETURN POINT
19534: *
19535: PTTS5 EXI RETURN TO PTTST CALLER
19536: ENP END PROCEDURE PTTST
19537: .IF .CNRA
19538: .ELSE
19539: EJC
19540: *
19541: * RCBLD -- BUILD A REAL BLOCK
19542: *
19543: * (RA) REAL VALUE FOR RCBLK
19544: * JSR RCBLD CALL TO BUILD REAL BLOCK
19545: * (XR) POINTER TO RESULT RCBLK
19546: * (WA) DESTROYED
19547: *
19548: RCBLD PRC E,0 ENTRY POINT
19549: MOV DNAMP,XR LOAD POINTER TO NEXT AVAILABLE LOC
19550: ADD *RCSI$,XR POINT PAST NEW RCBLK
19551: BLO XR,DNAME,RCBL1 JUMP IF THERE IS ROOM
19552: MOV *RCSI$,WA ELSE LOAD RCBLK LENGTH
19553: JSR ALLOC USE STANDARD ALLOCATOR TO GET BLOCK
19554: ADD WA,XR POINT PAST BLOCK TO MERGE
19555: *
19556: * MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED
19557: *
19558: RCBL1 MOV XR,DNAMP SET NEW POINTER
19559: SUB *RCSI$,XR POINT BACK TO START OF BLOCK
19560: MOV =B$RCL,(XR) STORE TYPE WORD
19561: STR RCVAL(XR) STORE REAL VALUE IN RCBLK
19562: EXI RETURN TO RCBLD CALLER
19563: ENP END PROCEDURE RCBLD
19564: .FI
19565: EJC
19566: *
19567: * READR -- READ NEXT SOURCE IMAGE AT COMPILE TIME
19568: *
19569: * READR IS USED TO READ THE NEXT SOURCE IMAGE. TO PROCESS
19570: * CONTINUATION CARDS PROPERLY, THE COMPILER MUST READ ONE
19571: * LINE AHEAD. THUS READR DOES NOT DESTROY THE CURRENT IMAGE
19572: * SEE ALSO THE NEXTS ROUTINE WHICH ACTUALLY GETS THE IMAGE.
19573: *
19574: * THE GLOBAL FLAG RDRER IS SET JUST BEFORE THE READ, AND
19575: * CLEARED AFTER IT. THIS IS SO THAT IN THE EVENT SYSRD
19576: * OR SYSRI TAKE AN EROSI EXIT, THE ERROR APPENDAGE CAN
19577: * RECOGNIZE THE SITUATION AND TAKE APPROPRIATE ACTION.
19578: *
19579: * JSR READR CALL TO READ NEXT IMAGE
19580: * (XR) PTR TO NEXT IMAGE (0 IF NONE)
19581: * (R$CNI) COPY OF POINTER
19582: * (WA,WB,WC,XL) DESTROYED
19583: *
19584: READR PRC E,0 ENTRY POINT
19585: MOV R$CNI,XR GET PTR TO NEXT IMAGE
19586: BNZ XR,READ5 EXIT IF ALREADY READ
19587: *
19588: * MERGE FROM -COPY EOF TO TRY READ
19589: *
19590: READ0 BEQ STAGE,=STGIC,READ1 READ IF INITIAL COMPILE
19591: BZE R$COP,READ6 ELSE EXIT IF NO -COPY IN FORCE
19592: *
19593: * ATTEMPT READ
19594: *
19595: READ1 MOV CSWIN,WA MAX READ LENGTH
19596: MNZ RDRER NOTE IN-READR IN CASE EROSI
19597: JSR ALOCS ALLOCATE BUFFER
19598: BZE TTINS,READ2 SKIP IF STANDARD INPUT FILE
19599: JSR SYSRI READ FROM TERMINAL
19600: PPM READ7 FAIL
19601: PPM EROSI ERROR
19602: BRN READ3 MERGE
19603: *
19604: * READ FROM STANDARD FILE
19605: *
19606: READ2 JSR SYSRD READ INPUT IMAGE
19607: PPM READ7 JUMP IF END OF FILE
19608: PPM EROSI ERROR RETURN
19609: *
19610: * MERGE
19611: *
19612: READ3 ZER RDRER NOTE NOT-IN-READR FOR ERROR RTN
19613: MNZ WB SET TRIMR TO PERFORM TRIM
19614: BLE SCLEN(XR),CSWIN,READ4 USE SMALLER OF STRING LNTH..
19615: MOV CSWIN,SCLEN(XR) ... AND XXX OF -INXXX
19616: *
19617: * PERFORM THE TRIM
19618: *
19619: READ4 JSR TRIMR TRIM TRAILING BLANKS
19620: *
19621: * MERGE HERE AFTER READ
19622: *
19623: READ5 MOV XR,R$CNI STORE COPY OF POINTER
19624: *
19625: * MERGE HERE IF NO READ ATTEMPTED
19626: *
19627: READ6 EXI RETURN TO READR CALLER
19628: *
19629: * HERE ON END OF FILE
19630: *
19631: READ7 ZER RDRER NOTE NOT-IN-READR FOR ERR
19632: MOV XR,DNAMP POP UNUSED SCBLK
19633: ZER XR ZERO PTR AS RESULT
19634: BZE R$COP,READ5 SKIP IF NO -COPY IN FORCE
19635: JSR COPND CALL TO END THIS -COPY (EOF)
19636: BRN READ0 TRY AGAIN
19637: ENP END PROCEDURE READR
19638: .IF .CASL
19639: EJC
19640: *
19641: * SBSCC -- BUILD SUBSTRING WITH CASE CONVERSION
19642: *
19643: * (XL) PTR TO SCBLK CONTAINING CHARS
19644: * (WA) CHAR COUNT
19645: * (WB) OFFSET TO FIRST CHAR IN SCBLK
19646: * JSR SBSCC CALL TO BUILD SUBSTRING
19647: * (XR) PTR TO NEW SCBLK WITH SUBSTRING
19648: * (WA,WB,WC,XL,IA) DESTROYED
19649: *
19650: * IF OPTION .CPLC IS SELECTED (PREFER LOWER CASE), TARGET
19651: * CASE IS LOWER CASE, OTHERWISE IT IS UPPER CASE.
19652: *
19653: SBSCC PRC E,0 ENTRY POINT
19654: BZE WA,SBSC4 JUMP IF NULL SUBSTRING
19655: JSR ALOCS ELSE ALLOCATE SCBLK
19656: MOV WC,WA MOVE NUMBER OF CHARACTERS
19657: MOV XR,WC SAVE PTR TO NEW SCBLK
19658: PLC XL,WB PREPARE TO LOAD CHARS FROM OLD BLK
19659: PSC XR PREPARE TO STORE CHARS IN NEW BLK
19660: LCT WA,WA TO COUNT ROUND LOOP
19661: *
19662: * LOOP TO COPY AND TRANSLATE CHARS
19663: *
19664: SBSC1 LCH WB,(XL)+ GET CHAR
19665: .IF .CPLC
19666: BGT WB,=CH$L$,SBSC2 SKIP IF NOT UC LETTER
19667: BLT WB,=CH$LA,SBSC2 SKIP IF NOT UC LETTER
19668: .IF .CSCV
19669: CUL WB CONVERT FROM UC TO LC
19670: .ELSE
19671: ADD =DFA$A,WB CONVERT FROM UC TO LC
19672: .FI
19673: .ELSE
19674: BGT WB,=CH$$$,SBSC2 SKIP IF NOT A LC LETTER
19675: BLT WB,=CH$$A,SBSC2 SKIP IF NOT A LC LETTER
19676: .IF .CSCV
19677: CLU WB CONVERT FROM LC TO UC
19678: .ELSE
19679: SUB =DFA$A,WB CONVERT FROM LC TO UC
19680: .FI
19681: .FI
19682: *
19683: * STORE CHAR IN NEW SUBSTRING
19684: *
19685: SBSC2 SCH WB,(XR)+ STORE CHAR
19686: BCT WA,SBSC1 LOOP
19687: MOV WC,XR RESTORE SCBLK POINTER
19688: *
19689: * RETURN POINT
19690: *
19691: SBSC3 ZER XL CLEAR GARBAGE POINTER IN XL
19692: EXI RETURN TO SBSCC CALLER
19693: *
19694: * HERE FOR NULL SUBSTRING
19695: *
19696: SBSC4 MOV =NULLS,XR SET NULL STRING AS RESULT
19697: BRN SBSC3 RETURN
19698: ENP END PROCEDURE SBSCC
19699: EJC
19700: *
19701: * SBSTG -- BUILD SUBSTRING POSSIBLY CONVERTING CASE
19702: *
19703: * (XL) PTR TO SCBLK CONTAINING CHARS
19704: * (WA) CHAR COUNT
19705: * (WB) OFFSET TO FIRST CHAR IN SCBLK
19706: * JSR SBSTG CALL TO BUILD SUBSTRING
19707: * (XR) PTR TO NEW SCBLK WITH SUBSTRING
19708: * (WA,WB,WC,XL,IA) DESTROYED
19709: *
19710: * IF CASE IS TO BE IGNORED (-CASEIG OR .CSIG), SUBSTRING
19711: * IS CONVERTED TO PREFERRED CASE (DEFAULT UPPER),
19712: * OTHERWISE CASE IS LEFT ALONE.
19713: *
19714: SBSTG PRC E,0 ENTRY POINT
19715: BZE CSWCI,SBSG1 SKIP IF CASE NOT IGNORED
19716: JSR SBSCC CONVERT TO IGNORE CASE
19717: EXI RETURN TO CALLER
19718: *
19719: SBSG1 JSR SBSTR READ SUBSTRING IN MIXED CASE
19720: EXI RETURN TO CALLER
19721: ENP END PROCEDURE SBSTG
19722: .FI
19723: EJC
19724: *
19725: * SBSTR -- BUILD A SUBSTRING
19726: *
19727: * (XL) PTR TO SCBLK CONTAINING CHARS
19728: * (WA) NUMBER OF CHARS IN SUBSTRING
19729: * (WB) OFFSET TO FIRST CHAR IN SCBLK
19730: * JSR SBSTR CALL TO BUILD SUBSTRING
19731: * (XR) PTR TO NEW SCBLK WITH SUBSTRING
19732: * (WA,WB,WC,XL,IA) DESTROYED
19733: *
19734: * NOTE THAT SBSTR IS CALLED WITH A DUMMY STRING POINTER
19735: * (POINTING INTO A VRBLK OR SVBLK) TO COPY THE NAME OF A
19736: * VARIABLE AS A STANDARD STRING VALUE.
19737: *
19738: SBSTR PRC E,0 ENTRY POINT
19739: BZE WA,SBST2 JUMP IF NULL SUBSTRING
19740: JSR ALOCS ELSE ALLOCATE SCBLK
19741: MOV WC,WA MOVE NUMBER OF CHARACTERS
19742: MOV XR,WC SAVE PTR TO NEW SCBLK
19743: PLC XL,WB PREPARE TO LOAD CHARS FROM OLD BLK
19744: PSC XR PREPARE TO STORE CHARS IN NEW BLK
19745: MVC MOVE CHARACTERS TO NEW STRING
19746: MOV WC,XR THEN RESTORE SCBLK POINTER
19747: *
19748: * RETURN POINT
19749: *
19750: SBST1 ZER XL CLEAR GARBAGE POINTER IN XL
19751: EXI RETURN TO SBSTR CALLER
19752: *
19753: * HERE FOR NULL SUBSTRING
19754: *
19755: SBST2 MOV =NULLS,XR SET NULL STRING AS RESULT
19756: BRN SBST1 RETURN
19757: ENP END PROCEDURE SBSTR
19758: EJC
19759: *
19760: * SCANE -- SCAN AN ELEMENT
19761: *
19762: * SCANE IS CALLED AT COMPILE TIME (BY EXPAN ,CMPIL,CNCRD)
19763: * TO SCAN ONE ELEMENT FROM THE INPUT IMAGE.
19764: *
19765: * (SCNCC) NON-ZERO IF CALLED FROM CNCRD
19766: * JSR SCANE CALL TO SCAN ELEMENT
19767: * (XR) RESULT POINTER (SEE BELOW)
19768: * (XL) SYNTAX TYPE CODE (T$XXX)
19769: *
19770: * THE FOLLOWING GLOBAL LOCATIONS ARE USED.
19771: *
19772: * R$CIM POINTER TO STRING BLOCK (SCBLK)
19773: * FOR CURRENT INPUT IMAGE.
19774: *
19775: * R$CNI POINTER TO NEXT INPUT IMAGE STRING
19776: * POINTER (ZERO IF NONE).
19777: *
19778: * R$SCP SAVE POINTER (EXIT XR) FROM LAST
19779: * CALL IN CASE RESCAN IS SET.
19780: *
19781: * SCNBL THIS LOCATION IS SET NON-ZERO ON
19782: * EXIT IF SCANE SCANNED PAST BLANKS
19783: * BEFORE LOCATING THE CURRENT ELEMENT
19784: * THE END OF A LINE COUNTS AS BLANKS.
19785: *
19786: * SCNCC CNCRD SETS THIS NON-ZERO TO SCAN
19787: * CONTROL CARD NAMES AND CLEARS IT
19788: * ON RETURN
19789: *
19790: * SCNIL LENGTH OF CURRENT INPUT IMAGE
19791: *
19792: * SCNGO IF SET NON-ZERO ON ENTRY, F AND S
19793: * ARE RETURNED AS SEPARATE SYNTAX
19794: * TYPES (NOT LETTERS) (GOTO PRO-
19795: * CESSING). SCNGO IS RESET ON EXIT.
19796: *
19797: * SCNPT OFFSET TO CURRENT LOC IN R$CIM
19798: *
19799: * SCNRS IF SET NON-ZERO ON ENTRY, SCANE
19800: * RETURNS THE SAME RESULT AS ON THE
19801: * LAST CALL (RESCAN). SCNRS IS RESET
19802: * ON EXIT FROM ANY CALL TO SCANE.
19803: *
19804: * SCNTP SAVE SYNTAX TYPE FROM LAST
19805: * CALL (IN CASE RESCAN IS SET).
19806: EJC
19807: *
19808: * SCANE (CONTINUED)
19809: *
19810: *
19811: *
19812: * ELEMENT SCANNED XL XR
19813: * --------------- -- --
19814: *
19815: * CONTROL CARD NAME 0 POINTER TO SCBLK FOR NAME
19816: *
19817: * UNARY OPERATOR T$UOP PTR TO OPERATOR DVBLK
19818: *
19819: * LEFT PAREN T$LPR T$LPR
19820: *
19821: * LEFT BRACKET T$LBR T$LBR
19822: *
19823: * COMMA T$CMA T$CMA
19824: *
19825: * FUNCTION CALL T$FNC PTR TO FUNCTION VRBLK
19826: *
19827: * VARIABLE T$VAR PTR TO VRBLK
19828: *
19829: * STRING CONSTANT T$CON PTR TO SCBLK
19830: *
19831: * INTEGER CONSTANT T$CON PTR TO ICBLK
19832: *
19833: .IF .CNRA
19834: .ELSE
19835: * REAL CONSTANT T$CON PTR TO RCBLK
19836: *
19837: .FI
19838: * BINARY OPERATOR T$BOP PTR TO OPERATOR DVBLK
19839: *
19840: * RIGHT PAREN T$RPR T$RPR
19841: *
19842: * RIGHT BRACKET T$RBR T$RBR
19843: *
19844: * COLON T$COL T$COL
19845: *
19846: * SEMI-COLON T$SMC T$SMC
19847: *
19848: * F (SCNGO NE 0) T$FGO T$FGO
19849: *
19850: * S (SCNGO NE 0) T$SGO T$SGO
19851: EJC
19852: *
19853: * SCANE (CONTINUED)
19854: *
19855: * ENTRY POINT
19856: *
19857: SCANE PRC E,0 ENTRY POINT
19858: ZER SCNBL RESET BLANKS FLAG
19859: MOV WA,SCNSA SAVE WA
19860: MOV WB,SCNSB SAVE WB
19861: MOV WC,SCNSC SAVE WC
19862: BZE SCNRS,SCN03 JUMP IF NO RESCAN
19863: *
19864: * HERE FOR RESCAN REQUEST
19865: *
19866: MOV SCNTP,XL SET PREVIOUS RETURNED SCAN TYPE
19867: MOV R$SCP,XR SET PREVIOUS RETURNED POINTER
19868: ZER SCNRS RESET RESCAN SWITCH
19869: BRN SCN13 JUMP TO EXIT
19870: *
19871: * COME HERE TO READ NEW IMAGE TO TEST FOR CONTINUATION
19872: *
19873: SCN01 JSR READR READ NEXT IMAGE
19874: MOV *DVUBS,WB SET WB FOR NOT READING NAME
19875: BZE XR,SCN30 TREAT AS SEMI-COLON IF NONE
19876: PLC XR ELSE POINT TO FIRST CHARACTER
19877: LCH WC,(XR) LOAD FIRST CHARACTER
19878: BEQ WC,=CH$DT,SCN02 JUMP IF DOT FOR CONTINUATION
19879: BNE WC,=CH$PL,SCN30 ELSE TREAT AS SEMICOLON UNLESS PLUS
19880: *
19881: * HERE FOR CONTINUATION LINE
19882: *
19883: SCN02 JSR NEXTS ACQUIRE NEXT SOURCE IMAGE
19884: MOV =NUM01,SCNPT SET SCAN POINTER PAST CONTINUATION
19885: MNZ SCNBL SET BLANKS FLAG
19886: EJC
19887: *
19888: * SCANE (CONTINUED)
19889: *
19890: * MERGE HERE TO SCAN NEXT ELEMENT ON CURRENT LINE
19891: *
19892: SCN03 MOV SCNPT,WA LOAD CURRENT OFFSET
19893: BEQ WA,SCNIL,SCN01 CHECK CONTINUATION IF END
19894: MOV R$CIM,XL POINT TO CURRENT LINE
19895: PLC XL,WA POINT TO CURRENT CHARACTER
19896: MOV WA,SCNSE SET START OF ELEMENT LOCATION
19897: MOV =OPDVS,WC POINT TO OPERATOR DV LIST
19898: MOV *DVUBS,WB SET CONSTANT FOR OPERATOR CIRCUIT
19899: BRN SCN06 START SCANNING
19900: *
19901: * LOOP HERE TO IGNORE LEADING BLANKS AND TABS
19902: *
19903: SCN05 BZE WB,SCN10 JUMP IF TRAILING
19904: ICV SCNSE INCREMENT START OF ELEMENT
19905: BEQ WA,SCNIL,SCN01 JUMP IF END OF IMAGE
19906: MNZ SCNBL NOTE BLANKS SEEN
19907: *
19908: * THE FOLLOWING JUMP IS USED REPEATEDLY FOR SCANNING OUT
19909: * THE CHARACTERS OF A NUMERIC CONSTANT OR VARIABLE NAME.
19910: * THE REGISTERS ARE USED AS FOLLOWS.
19911: *
19912: * (XR) SCRATCH
19913: * (XL) PTR TO NEXT CHARACTER
19914: * (WA) CURRENT SCAN OFFSET
19915: * (WB) *DVUBS (0 IF SCANNING NAME,CONST)
19916: * (WC) =OPDVS (0 IF SCANNING CONSTANT)
19917: *
19918: SCN06 LCH XR,(XL)+ GET NEXT CHARACTER
19919: ICV WA BUMP SCAN OFFSET
19920: MOV WA,SCNPT STORE OFFSET PAST CHAR SCANNED
19921: BGE XR,=CFP$U,SCN07 QUICK CHECK FOR OTHER CHAR
19922: BSW XR,CFP$U,SCN07 SWITCH ON SCANNED CHARACTER
19923: *
19924: * SWITCH TABLE FOR SWITCH ON CHARACTER
19925: *
19926: IFF CH$BL,SCN05 BLANK
19927: .IF .CAHT
19928: IFF CH$HT,SCN05 HORIZONTAL TAB
19929: .FI
19930: .IF .CAVT
19931: IFF CH$VT,SCN05 VERTICAL TAB
19932: .FI
19933: IFF CH$D0,SCN08 DIGIT 0
19934: IFF CH$D1,SCN08 DIGIT 1
19935: IFF CH$D2,SCN08 DIGIT 2
19936: IFF CH$D3,SCN08 DIGIT 3
19937: IFF CH$D4,SCN08 DIGIT 4
19938: IFF CH$D5,SCN08 DIGIT 5
19939: IFF CH$D6,SCN08 DIGIT 6
19940: IFF CH$D7,SCN08 DIGIT 7
19941: IFF CH$D8,SCN08 DIGIT 8
19942: IFF CH$D9,SCN08 DIGIT 9
19943: EJC
19944: *
19945: * SCANE (CONTINUED)
19946: *
19947: IFF CH$LA,SCN09 LETTER A
19948: IFF CH$LB,SCN09 LETTER B
19949: IFF CH$LC,SCN09 LETTER C
19950: IFF CH$LD,SCN09 LETTER D
19951: IFF CH$LE,SCN09 LETTER E
19952: IFF CH$LG,SCN09 LETTER G
19953: IFF CH$LH,SCN09 LETTER H
19954: IFF CH$LI,SCN09 LETTER I
19955: IFF CH$LJ,SCN09 LETTER J
19956: IFF CH$LK,SCN09 LETTER K
19957: IFF CH$LL,SCN09 LETTER L
19958: IFF CH$LM,SCN09 LETTER M
19959: IFF CH$LN,SCN09 LETTER N
19960: IFF CH$LO,SCN09 LETTER O
19961: IFF CH$LP,SCN09 LETTER P
19962: IFF CH$LQ,SCN09 LETTER Q
19963: IFF CH$LR,SCN09 LETTER R
19964: IFF CH$LT,SCN09 LETTER T
19965: IFF CH$LU,SCN09 LETTER U
19966: IFF CH$LV,SCN09 LETTER V
19967: IFF CH$LW,SCN09 LETTER W
19968: IFF CH$LX,SCN09 LETTER X
19969: IFF CH$LY,SCN09 LETTER Y
19970: IFF CH$L$,SCN09 LETTER Z
19971: .IF .CASL
19972: IFF CH$$A,SCN09 SHIFTED A
19973: IFF CH$$B,SCN09 SHIFTED B
19974: IFF CH$$C,SCN09 SHIFTED C
19975: IFF CH$$D,SCN09 SHIFTED D
19976: IFF CH$$E,SCN09 SHIFTED E
19977: IFF CH$$F,SCN20 SHIFTED F
19978: IFF CH$$G,SCN09 SHIFTED G
19979: IFF CH$$H,SCN09 SHIFTED H
19980: IFF CH$$I,SCN09 SHIFTED I
19981: IFF CH$$J,SCN09 SHIFTED J
19982: IFF CH$$K,SCN09 SHIFTED K
19983: IFF CH$$L,SCN09 SHIFTED L
19984: IFF CH$$M,SCN09 SHIFTED M
19985: IFF CH$$N,SCN09 SHIFTED N
19986: IFF CH$$O,SCN09 SHIFTED O
19987: IFF CH$$P,SCN09 SHIFTED P
19988: IFF CH$$Q,SCN09 SHIFTED Q
19989: IFF CH$$R,SCN09 SHIFTED R
19990: IFF CH$$S,SCN21 SHIFTED S
19991: IFF CH$$T,SCN09 SHIFTED T
19992: IFF CH$$U,SCN09 SHIFTED U
19993: IFF CH$$V,SCN09 SHIFTED V
19994: IFF CH$$W,SCN09 SHIFTED W
19995: IFF CH$$X,SCN09 SHIFTED X
19996: IFF CH$$Y,SCN09 SHIFTED Y
19997: IFF CH$$$,SCN09 SHIFTED Z
19998: .FI
19999: EJC
20000: *
20001: * SCANE (CONTINUED)
20002: *
20003: IFF CH$SQ,SCN16 SINGLE QUOTE
20004: IFF CH$DQ,SCN17 DOUBLE QUOTE
20005: IFF CH$LF,SCN20 LETTER F
20006: IFF CH$LS,SCN21 LETTER S
20007: IFF CH$UN,SCN24 UNDERLINE
20008: IFF CH$PP,SCN25 LEFT PAREN
20009: IFF CH$RP,SCN26 RIGHT PAREN
20010: IFF CH$RB,SCN27 RIGHT BRACKET
20011: IFF CH$BB,SCN28 LEFT BRACKET
20012: IFF CH$CB,SCN27 RIGHT BRACKET
20013: IFF CH$OB,SCN28 LEFT BRACKET
20014: IFF CH$CL,SCN29 COLON
20015: IFF CH$SM,SCN30 SEMI-COLON
20016: IFF CH$CM,SCN31 COMMA
20017: IFF CH$DT,SCN32 DOT
20018: IFF CH$PL,SCN34 PLUS
20019: IFF CH$MN,SCN35 MINUS
20020: IFF CH$NT,SCN36 NOT
20021: IFF CH$DL,SCN33 DOLLAR
20022: IFF CH$EX,SCN37 EXCLAMATION MARK
20023: IFF CH$PC,SCN38 PERCENT
20024: IFF CH$SL,SCN40 SLASH
20025: IFF CH$NM,SCN41 NUMBER SIGN
20026: IFF CH$AT,SCN42 AT
20027: IFF CH$BR,SCN43 VERTICAL BAR
20028: IFF CH$AM,SCN44 AMPERSAND
20029: IFF CH$QU,SCN45 QUESTION MARK
20030: IFF CH$EQ,SCN46 EQUAL
20031: IFF CH$AS,SCN49 ASTERISK
20032: ESW END SWITCH ON CHARACTER
20033: *
20034: * HERE FOR ILLEGAL CHARACTER (UNDERLINE MERGES)
20035: *
20036: SCN07 BZE WB,SCN10 JUMP IF SCANNING NAME OR CONSTANT
20037: ERB 232,SYNTAX ERROR. ILLEGAL CHARACTER
20038: EJC
20039: *
20040: * SCANE (CONTINUED)
20041: *
20042: * HERE FOR DIGITS 0-9
20043: *
20044: SCN08 BZE WB,SCN09 KEEP SCANNING IF NAME/CONSTANT
20045: ZER WC ELSE SET FLAG FOR SCANNING CONSTANT
20046: *
20047: * HERE FOR LETTER. LOOP HERE WHEN SCANNING NAME/CONSTANT
20048: *
20049: SCN09 BEQ WA,SCNIL,SCN11 JUMP IF END OF IMAGE
20050: ZER WB SET FLAG FOR SCANNING NAME/CONST
20051: BRN SCN06 MERGE BACK TO CONTINUE SCAN
20052: *
20053: * COME HERE FOR DELIMITER ENDING NAME OR CONSTANT
20054: *
20055: SCN10 DCV WA RESET OFFSET TO POINT TO DELIMITER
20056: *
20057: * COME HERE AFTER FINISHING SCAN OF NAME OR CONSTANT
20058: *
20059: SCN11 MOV WA,SCNPT STORE UPDATED SCAN OFFSET
20060: MOV SCNSE,WB POINT TO START OF ELEMENT
20061: SUB WB,WA GET NUMBER OF CHARACTERS
20062: MOV R$CIM,XL POINT TO LINE IMAGE
20063: BNZ WC,SCN15 JUMP IF NAME
20064: *
20065: * HERE AFTER SCANNING OUT NUMERIC CONSTANT
20066: *
20067: JSR SBSTR GET STRING FOR CONSTANT
20068: MOV XR,DNAMP DELETE FROM STORAGE (NOT NEEDED)
20069: JSR GTNUM CONVERT TO NUMERIC
20070: PPM SCN14 JUMP IF CONVERSION FAILURE
20071: *
20072: * MERGE HERE TO EXIT WITH CONSTANT
20073: *
20074: SCN12 MOV =T$CON,XL SET RESULT TYPE OF CONSTANT
20075: EJC
20076: *
20077: * SCANE (CONTINUED)
20078: *
20079: * COMMON EXIT POINT (XR,XL) SET
20080: *
20081: SCN13 MOV SCNSA,WA RESTORE WA
20082: MOV SCNSB,WB RESTORE WB
20083: MOV SCNSC,WC RESTORE WC
20084: MOV XR,R$SCP SAVE XR IN CASE RESCAN
20085: MOV XL,SCNTP SAVE XL IN CASE RESCAN
20086: ZER SCNGO RESET POSSIBLE GOTO FLAG
20087: EXI RETURN TO SCANE CALLER
20088: *
20089: * HERE IF CONVERSION ERROR ON NUMERIC ITEM
20090: *
20091: SCN14 ERB 233,SYNTAX ERROR. INVALID NUMERIC ITEM
20092: *
20093: * HERE AFTER SCANNING OUT VARIABLE NAME
20094: *
20095: .IF .CASL
20096: SCN15 JSR SBSTG BUILD STRING NAME OF VARIABLE
20097: .ELSE
20098: SCN15 JSR SBSTR BUILD STRING NAME OF VARIABLE
20099: .FI
20100: BNZ SCNCC,SCN13 RETURN IF CNCRD CALL
20101: JSR GTNVR LOCATE/BUILD VRBLK
20102: PPM DUMMY (UNUSED) ERROR RETURN
20103: MOV =T$VAR,XL SET TYPE AS VARIABLE
20104: BRN SCN13 BACK TO EXIT
20105: *
20106: * HERE FOR SINGLE QUOTE (START OF STRING CONSTANT)
20107: *
20108: SCN16 BZE WB,SCN10 TERMINATOR IF SCANNING NAME OR CNST
20109: MOV =CH$SQ,WB SET TERMINATOR AS SINGLE QUOTE
20110: BRN SCN18 MERGE
20111: *
20112: * HERE FOR DOUBLE QUOTE (START OF STRING CONSTANT)
20113: *
20114: SCN17 BZE WB,SCN10 TERMINATOR IF SCANNING NAME OR CNST
20115: MOV =CH$DQ,WB SET DOUBLE QUOTE TERMINATOR, MERGE
20116: *
20117: * LOOP TO SCAN OUT STRING CONSTANT
20118: *
20119: SCN18 BEQ WA,SCNIL,SCN19 ERROR IF END OF IMAGE
20120: LCH WC,(XL)+ ELSE LOAD NEXT CHARACTER
20121: ICV WA BUMP OFFSET
20122: BNE WC,WB,SCN18 LOOP BACK IF NOT TERMINATOR
20123: EJC
20124: *
20125: * SCANE (CONTINUED)
20126: *
20127: * HERE AFTER SCANNING OUT STRING CONSTANT
20128: *
20129: MOV SCNPT,WB POINT TO FIRST CHARACTER
20130: MOV WA,SCNPT SAVE OFFSET PAST FINAL QUOTE
20131: DCV WA POINT BACK PAST LAST CHARACTER
20132: SUB WB,WA GET NUMBER OF CHARACTERS
20133: MOV R$CIM,XL POINT TO INPUT IMAGE
20134: JSR SBSTR BUILD SUBSTRING VALUE
20135: BRN SCN12 BACK TO EXIT WITH CONSTANT RESULT
20136: *
20137: * HERE IF NO MATCHING QUOTE FOUND
20138: *
20139: SCN19 MOV WA,SCNPT SET UPDATED SCAN POINTER
20140: ERB 234,SYNTAX ERROR. UNMATCHED STRING QUOTE
20141: *
20142: * HERE FOR F (POSSIBLE FAILURE GOTO)
20143: *
20144: SCN20 MOV =T$FGO,XR SET RETURN CODE FOR FAIL GOTO
20145: BRN SCN22 JUMP TO MERGE
20146: *
20147: * HERE FOR S (POSSIBLE SUCCESS GOTO)
20148: *
20149: SCN21 MOV =T$SGO,XR SET SUCCESS GOTO AS RETURN CODE
20150: *
20151: * SPECIAL GOTO CASES MERGE HERE
20152: *
20153: SCN22 BZE SCNGO,SCN09 TREAT AS NORMAL LETTER IF NOT GOTO
20154: *
20155: * MERGE HERE FOR SPECIAL CHARACTER EXIT
20156: *
20157: SCN23 BZE WB,SCN10 JUMP IF END OF NAME/CONSTANT
20158: MOV XR,XL ELSE COPY CODE
20159: BRN SCN13 AND JUMP TO EXIT
20160: *
20161: * HERE FOR UNDERLINE
20162: *
20163: SCN24 BZE WB,SCN09 PART OF NAME IF SCANNING NAME
20164: BRN SCN07 ELSE ILLEGAL
20165: EJC
20166: *
20167: * SCANE (CONTINUED)
20168: *
20169: * HERE FOR LEFT PAREN
20170: *
20171: SCN25 MOV =T$LPR,XR SET LEFT PAREN RETURN CODE
20172: BNZ WB,SCN23 RETURN LEFT PAREN UNLESS NAME
20173: BZE WC,SCN10 DELIMITER IF SCANNING CONSTANT
20174: *
20175: * HERE FOR LEFT PAREN AFTER NAME (FUNCTION CALL)
20176: *
20177: MOV SCNSE,WB POINT TO START OF NAME
20178: MOV WA,SCNPT SET POINTER PAST LEFT PAREN
20179: DCV WA POINT BACK PAST LAST CHAR OF NAME
20180: SUB WB,WA GET NAME LENGTH
20181: MOV R$CIM,XL POINT TO INPUT IMAGE
20182: JSR SBSTR GET STRING NAME FOR FUNCTION
20183: JSR GTNVR LOCATE/BUILD VRBLK
20184: PPM DUMMY (UNUSED) ERROR RETURN
20185: MOV =T$FNC,XL SET CODE FOR FUNCTION CALL
20186: BRN SCN13 BACK TO EXIT
20187: *
20188: * PROCESSING FOR SPECIAL CHARACTERS
20189: *
20190: SCN26 MOV =T$RPR,XR RIGHT PAREN, SET CODE
20191: BRN SCN23 TAKE SPECIAL CHARACTER EXIT
20192: *
20193: SCN27 MOV =T$RBR,XR RIGHT BRACKET, SET CODE
20194: BRN SCN23 TAKE SPECIAL CHARACTER EXIT
20195: *
20196: SCN28 MOV =T$LBR,XR LEFT BRACKET, SET CODE
20197: BRN SCN23 TAKE SPECIAL CHARACTER EXIT
20198: *
20199: SCN29 MOV =T$COL,XR COLON, SET CODE
20200: BRN SCN23 TAKE SPECIAL CHARACTER EXIT
20201: *
20202: SCN30 MOV =T$SMC,XR SEMI-COLON, SET CODE
20203: BRN SCN23 TAKE SPECIAL CHARACTER EXIT
20204: *
20205: SCN31 MOV =T$CMA,XR COMMA, SET CODE
20206: BRN SCN23 TAKE SPECIAL CHARACTER EXIT
20207: EJC
20208: *
20209: * SCANE (CONTINUED)
20210: *
20211: * HERE FOR OPERATORS. ON ENTRY, WC POINTS TO THE TABLE OF
20212: * OPERATOR DOPE VECTORS AND WB IS THE INCREMENT TO STEP
20213: * TO THE NEXT PAIR (BINARY/UNARY) OF DOPE VECTORS IN THE
20214: * LIST. ON REACHING SCN46, THE POINTER HAS BEEN ADJUSTED TO
20215: * POINT TO THE APPROPRIATE PAIR OF DOPE VECTORS.
20216: * THE FIRST FOUR ENTRIES ARE SPECIAL SINCE THEY CAN OCCUR
20217: * AS PART OF A VARIABLE NAME (.$) OR CONSTANT (.+-).
20218: *
20219: SCN32 BZE WB,SCN09 DOT CAN BE PART OF NAME OR CONSTANT
20220: ADD WB,WC ELSE BUMP POINTER
20221: *
20222: SCN33 BZE WB,SCN09 DOLLAR CAN BE PART OF NAME
20223: ADD WB,WC ELSE BUMP POINTER
20224: *
20225: SCN34 BZE WC,SCN09 PLUS CAN BE PART OF CONSTANT
20226: BZE WB,SCN48 PLUS CANNOT BE PART OF NAME
20227: ADD WB,WC ELSE BUMP POINTER
20228: *
20229: SCN35 BZE WC,SCN09 MINUS CAN BE PART OF CONSTANT
20230: BZE WB,SCN48 MINUS CANNOT BE PART OF NAME
20231: ADD WB,WC ELSE BUMP POINTER
20232: LCH XR,(XL) GET NEXT CHARACTER
20233: BLT XR,=CH$D0,SCN36 SKIP IF NOT DIGIT
20234: BLE XR,=CH$D9,SCN08 JUMP IF DIGIT
20235: *
20236: SCN36 ADD WB,WC NOT
20237: SCN37 ADD WB,WC EXCLAMATION
20238: SCN38 ADD WB,WC PERCENT
20239: SCN39 ADD WB,WC ASTERISK
20240: SCN40 ADD WB,WC SLASH
20241: SCN41 ADD WB,WC NUMBER SIGN
20242: SCN42 ADD WB,WC AT SIGN
20243: SCN43 ADD WB,WC VERTICAL BAR
20244: SCN44 ADD WB,WC AMPERSAND
20245: SCN45 ADD WB,WC QUESTION MARK
20246: EJC
20247: *
20248: * SCANE (CONTINUED)
20249: *
20250: * ALL OPERATORS COME HERE (EQUAL MERGES DIRECTLY)
20251: * (WC) POINTS TO THE BINARY/UNARY PAIR OF OPERATOR DVBLKS.
20252: *
20253: SCN46 BZE WB,SCN10 OPERATOR TERMINATES NAME/CONSTANT
20254: MOV WC,XR ELSE COPY DV POINTER
20255: LCH WC,(XL) LOAD NEXT CHARACTER
20256: MOV =T$BOP,XL SET BINARY OP IN CASE
20257: BEQ WA,SCNIL,SCN47 SHOULD BE BINARY IF IMAGE END
20258: BEQ WC,=CH$BL,SCN47 SHOULD BE BINARY IF FOLLOWED BY BLK
20259: .IF .CAHT
20260: BEQ WC,=CH$HT,SCN47 JUMP IF HORIZONTAL TAB
20261: .FI
20262: .IF .CAVT
20263: BEQ WC,=CH$VT,SCN47 JUMP IF VERTICAL TAB
20264: .FI
20265: BEQ WC,=CH$SM,SCN47 SEMICOLON CAN IMMEDIATELY FOLLOW =
20266: *
20267: * HERE FOR UNARY OPERATOR
20268: *
20269: ADD *DVBS$,XR POINT TO DV FOR UNARY OP
20270: MOV =T$UOP,XL SET TYPE FOR UNARY OPERATOR
20271: BLE SCNTP,=T$UOK,SCN13 OK UNARY IF OK PRECEDING ELEMENT
20272: EJC
20273: *
20274: * SCANE (CONTINUED)
20275: *
20276: * MERGE HERE TO REQUIRE PRECEDING BLANKS
20277: *
20278: SCN47 BNZ SCNBL,SCN13 ALL OK IF PRECEDING BLANKS, EXIT
20279: *
20280: * FAIL OPERATOR IN THIS POSITION
20281: *
20282: SCN48 ERB 235,SYNTAX ERROR. INVALID USE OF OPERATOR
20283: *
20284: * HERE FOR ASTERISK, COULD BE ** SUBSTITUTE FOR EXCLAMATION
20285: *
20286: SCN49 BZE WB,SCN10 END OF NAME IF SCANNING NAME
20287: BEQ WA,SCNIL,SCN39 NOT ** IF * AT IMAGE END
20288: MOV WA,XR ELSE SAVE OFFSET PAST FIRST *
20289: MOV WA,SCNOF SAVE ANOTHER COPY
20290: LCH WA,(XL)+ LOAD NEXT CHARACTER
20291: BNE WA,=CH$AS,SCN50 NOT ** IF NEXT CHAR NOT *
20292: ICV XR ELSE STEP OFFSET PAST SECOND *
20293: BEQ XR,SCNIL,SCN51 OK EXCLAM IF END OF IMAGE
20294: LCH WA,(XL) ELSE LOAD NEXT CHARACTER
20295: BEQ WA,=CH$BL,SCN51 EXCLAMATION IF BLANK
20296: .IF .CAHT
20297: BEQ WA,=CH$HT,SCN51 EXCLAMATION IF HORIZONTAL TAB
20298: .FI
20299: .IF .CAVT
20300: BEQ WA,=CH$VT,SCN51 EXCLAMATION IF VERTICAL TAB
20301: .FI
20302: *
20303: * UNARY *
20304: *
20305: SCN50 MOV SCNOF,WA RECOVER STORED OFFSET
20306: MOV R$CIM,XL POINT TO LINE AGAIN
20307: PLC XL,WA POINT TO CURRENT CHAR
20308: BRN SCN39 MERGE WITH UNARY *
20309: *
20310: * HERE FOR ** AS SUBSTITUTE FOR EXCLAMATION
20311: *
20312: SCN51 MOV XR,SCNPT SAVE SCAN POINTER PAST 2ND *
20313: MOV XR,WA COPY SCAN POINTER
20314: BRN SCN37 MERGE WITH EXCLAMATION
20315: ENP END PROCEDURE SCANE
20316: EJC
20317: *
20318: * SCNGF -- SCAN GOTO FIELD
20319: *
20320: * SCNGF IS CALLED FROM CMPIL TO SCAN AND ANALYZE A GOTO
20321: * FIELD INCLUDING THE SURROUNDING BRACKETS OR PARENTHESES.
20322: * FOR A NORMAL GOTO, THE RESULT RETURNED IS EITHER A VRBLK
20323: * POINTER FOR A SIMPLE LABEL OPERAND, OR A POINTER TO AN
20324: * EXPRESSION TREE WITH A SPECIAL OUTER UNARY OPERATOR
20325: * (O$GOC). FOR A DIRECT GOTO, THE RESULT RETURNED IS A
20326: * POINTER TO AN EXPRESSION TREE WITH THE SPECIAL OUTER
20327: * UNARY OPERATOR O$GOD.
20328: *
20329: * JSR SCNGF CALL TO SCAN GOTO FIELD
20330: * (XR) RESULT (SEE ABOVE)
20331: * (XL,WA,WB,WC) DESTROYED
20332: *
20333: SCNGF PRC E,0 ENTRY POINT
20334: JSR SCANE SCAN INITIAL ELEMENT
20335: BEQ XL,=T$LPR,SCNG1 SKIP IF LEFT PAREN (NORMAL GOTO)
20336: BEQ XL,=T$LBR,SCNG2 SKIP IF LEFT BRACKET (DIRECT GOTO)
20337: ERB 236,SYNTAX ERROR. GOTO FIELD INCORRECT
20338: *
20339: * HERE FOR LEFT PAREN (NORMAL GOTO)
20340: *
20341: SCNG1 MOV =NUM01,WB SET EXPAN FLAG FOR NORMAL GOTO
20342: JSR EXPAN ANALYZE GOTO FIELD
20343: MOV =OPDVN,WA ELSE POINT TO OPDV FOR COMPLEX GOTO
20344: BLE XR,STATB,SCNG3 JUMP IF NOT IN STATIC
20345: BLO XR,STATE,SCNG4 JUMP TO EXIT IF SIMPLE LABEL NAME
20346: BRN SCNG3 AND MERGE
20347: *
20348: * HERE FOR LEFT BRACKET (DIRECT GOTO)
20349: *
20350: SCNG2 MOV =NUM02,WB SET EXPAN FLAG FOR DIRECT GOTO
20351: JSR EXPAN SCAN GOTO FIELD
20352: MOV =OPDVD,WA SET OPDV POINTER FOR DIRECT GOTO
20353: EJC
20354: *
20355: * SCNGF (CONTINUED)
20356: *
20357: * MERGE HERE TO BUILD OUTER UNARY OPERATOR BLOCK
20358: *
20359: SCNG3 MOV WA,-(XS) STACK OPERATOR DV POINTER
20360: MOV XR,-(XS) STACK POINTER TO EXPRESSION TREE
20361: JSR EXPOP POP OPERATOR OFF
20362: MOV (XS)+,XR RELOAD NEW EXPRESSION TREE POINTER
20363: *
20364: * COMMON EXIT POINT
20365: *
20366: SCNG4 EXI RETURN TO CALLER
20367: ENP END PROCEDURE SCNGF
20368: EJC
20369: *
20370: * SETVR -- SET VRGET,VRSTO FIELDS OF VRBLK
20371: *
20372: * SETVR SETS THE PROPER VALUES IN THE VRGET AND VRSTO
20373: * FIELDS OF A VRBLK. IT IS CALLED WHENEVER TRBLKS ARE
20374: * ADDED OR SUBTRACTED (TRACE,STOPTR,INPUT,OUTPUT,DETACH)
20375: *
20376: * (XR) POINTER TO VRBLK
20377: * JSR SETVR CALL TO SET FIELDS
20378: * (XL,WA) DESTROYED
20379: *
20380: * NOTE THAT SETVR IGNORES THE CALL IF XR DOES NOT POINT
20381: * INTO THE STATIC REGION (I.E. IS SOME OTHER NAME BASE)
20382: *
20383: SETVR PRC E,0 ENTRY POINT
20384: BHI XR,STATE,SETV1 EXIT IF NOT NATURAL VARIABLE
20385: *
20386: * HERE IF WE HAVE A VRBLK
20387: *
20388: MOV XR,XL COPY VRBLK POINTER
20389: MOV =B$VRL,VRGET(XR) STORE NORMAL GET VALUE
20390: BEQ VRSTO(XR),=B$VRE,SETV1 SKIP IF PROTECTED VARIABLE
20391: MOV =B$VRS,VRSTO(XR) STORE NORMAL STORE VALUE
20392: MOV VRVAL(XL),XL POINT TO NEXT ENTRY ON CHAIN
20393: BNE (XL),=B$TRT,SETV1 JUMP IF END OF TRBLK CHAIN
20394: MOV =B$VRA,VRGET(XR) STORE TRAPPED ROUTINE ADDRESS
20395: MOV =B$VRV,VRSTO(XR) SET TRAPPED ROUTINE ADDRESS
20396: *
20397: * MERGE HERE TO EXIT TO CALLER
20398: *
20399: SETV1 EXI RETURN TO SETVR CALLER
20400: ENP END PROCEDURE SETVR
20401: .IF .CNSR
20402: .ELSE
20403: EJC
20404: *
20405: * SORTA -- SORT ARRAY
20406: *
20407: * ROUTINE TO SORT AN ARRAY OR TABLE ON SAME BASIS AS IN
20408: * SITBOL. A TABLE IS CONVERTED TO AN ARRAY, LEAVING TWO
20409: * DIMENSIONAL ARRAYS AND VECTORS AS CASES TO BE CONSIDERED.
20410: * WHOLE ROWS OF ARRAYS ARE PERMUTED ACCORDING TO THE
20411: * ORDERING OF THE KEYS THEY CONTAIN, AND THE STRIDE
20412: * REFERRED TO, IS THE THE LENGTH OF A ROW. IT IS ONE
20413: * FOR A VECTOR.
20414: * THE SORT USED IS HEAPSORT, FUNDAMENTALS OF DATA STRUCTURES,
20415: * HOROWITZ AND SAHNI, PITMAN 1977, PAGE 347.
20416: * IT IS AN ORDER N*LOG(N) ALGORITHM. IN ORDER
20417: * TO MAKE IT STABLE, COMPARANDS MAY NOT COMPARE EQUAL. THIS
20418: * IS ACHIEVED BY SORTING A COPY ARRAY (REFERRED TO AS THE
20419: * SORT ARRAY) CONTAINING AT ITS HIGH ADDRESS END, BAU
20420: * OFFSETS TO THE ROWS TO BE SORTED HELD IN THE ORIGINAL
20421: * ARRAY (REFERRED TO AS THE KEY ARRAY). SORTC, THE
20422: * COMPARISON ROUTINE, ACCESSES THE KEYS THROUGH THESE
20423: * OFFSETS AND IN THE CASE OF EQUALITY, RESOLVES IT BY
20424: * COMPARING THE OFFSETS THEMSELVES. THE SORT PERMUTES THE
20425: * OFFSETS WHICH ARE THEN USED IN A FINAL OPERATION TO COPY
20426: * THE ACTUAL ITEMS INTO THE NEW ARRAY IN SORTED ORDER.
20427: * REFERENCES TO ZEROTH ITEM ARE TO NOTIONAL ITEM
20428: * PRECEDING FIRST ACTUAL ITEM.
20429: * REVERSE SORTING FOR RSORT IS DONE BY HAVING THE LESS THAN
20430: * TEST FOR KEYS EFFECTIVELY BE REPLACED BY A
20431: * GREATER THAN TEST.
20432: * GIVES ERROR MESSAGES FOR INCORRECT ARGS, RETURNS EXI 1
20433: * FOR EMPTY TABLE.
20434: *
20435: * 1(XS) FIRST ARG - ARRAY OR TABLE
20436: * 0(XS) 2ND ARG - INDEX OR PDTYPE NAME
20437: * (WA) 0 , NON-ZERO FOR SORT , RSORT
20438: * JSR SORTA CALL TO SORT ARRAY
20439: * PPM LOC FAIL RETURN FOR EMPTY TABLE
20440: * (XR) SORTED ARRAY
20441: * (XL,WA,WB,WC) DESTROYED
20442: EJC
20443: *
20444: * SORTA (CONTINUED)
20445: *
20446: SORTA PRC N,1 ENTRY POINT
20447: MOV WA,SRTSR SORT/RSORT INDICATOR
20448: MOV *NUM01,SRTST DEFAULT STRIDE OF 1
20449: ZER SRTOF DEFAULT ZERO OFFSET TO SORT KEY
20450: MOV =NULLS,SRTDF CLEAR DATATYPE FIELD NAME
20451: MOV (XS)+,R$SXR UNSTACK ARGUMENT 2
20452: MOV (XS)+,XR GET FIRST ARGUMENT
20453: MOV (XR),WA GET ARG TYPE
20454: BEQ WA,=B$ART,SRT00 SKIP IF ARRAY
20455: BNE WA,=B$TBT,SRT16 ERROR IF NOT TABLE
20456: JSR GTARR CONVERT TO ARRAY
20457: PPM SRT18 FAIL
20458: *
20459: * MAKE COPY OF ARRAY
20460: *
20461: SRT00 MOV XR,-(XS) STACK PTR TO RESULTING KEY ARRAY
20462: MOV XR,-(XS) ANOTHER COPY FOR CBLCK
20463: JSR CBLCK GET COPY ARRAY FOR SORTING INTO
20464: PPM CANT FAIL
20465: MOV XR,-(XS) STACK POINTER TO SORT ARRAY
20466: MOV R$SXR,XR GET SECOND ARG
20467: MOV 1(XS),XL GET PTR TO KEY ARRAY
20468: BNE (XL),=B$VCT,SRT02 JUMP IF ARBLK
20469: BEQ XR,=NULLS,SRT01 JUMP IF NULL SECOND ARG
20470: JSR GTNVR GET VRBLK PTR FOR IT
20471: ERR 237,ERRONEOUS 2ND ARG IN SORT/RSORT OF VECTOR
20472: MOV XR,SRTDF STORE DATATYPE FIELD NAME VRBLK
20473: *
20474: * COMPUTE N AND OFFSET TO ITEM A(0) IN VECTOR CASE
20475: *
20476: SRT01 MOV *VCLEN,WC OFFSET TO A(0)
20477: MOV *VCVLS,WB OFFSET TO FIRST ITEM
20478: MOV VCLEN(XL),WA GET BLOCK LENGTH
20479: SUB *VCSI$,WA GET NO. OF ENTRIES, N (IN BAUS)
20480: BRN SRT04 MERGE
20481: *
20482: * HERE FOR ARRAY
20483: *
20484: SRT02 LDI ARDIM(XL) GET POSSIBLE DIMENSION
20485: MFI WA CONVERT TO SHORT INTEGER
20486: WTB WA FURTHER CONVERT TO BAUS
20487: MOV *ARVLS,WB OFFSET TO FIRST VALUE IF ONE DIM.
20488: MOV *ARPRO,WC OFFSET BEFORE VALUES IF ONE DIM.
20489: BEQ ARNDM(XL),=NUM01,SRT04 JUMP IF IN FACT ONE DIMENSION
20490: BNE ARNDM(XL),=NUM02,SRT16 FAIL UNLESS TWO DIMENSIONAL
20491: LDI ARLB2(XL) GET LOWER BOUND 2 AS DEFAULT COLUMN
20492: BEQ XR,=NULLS,SRT03 JUMP IF DEFAULT SECOND ARG
20493: JSR GTINT CONVERT TO INTEGER
20494: PPM SRT17 FAIL
20495: LDI ICVAL(XR) GET ACTUAL INTEGER VALUE
20496: EJC
20497: *
20498: * SORTA (CONTINUED)
20499: *
20500: * HERE WITH SORT COLUMN INDEX IN IA IN ARRAY CASE
20501: *
20502: SRT03 SBI ARLB2(XL) SUBTRACT LOW BOUND
20503: IOV SRT17 FAIL IF OVERFLOW
20504: ILT SRT17 FAIL IF BELOW LOW BOUND
20505: SBI ARDM2(XL) CHECK AGAINST DIMENSION
20506: IGE SRT17 FAIL IF TOO LARGE
20507: ADI ARDM2(XL) RESTORE VALUE
20508: MFI WA GET AS SMALL INTEGER
20509: WTB WA OFFSET WITHIN ROW TO KEY
20510: MOV WA,SRTOF KEEP OFFSET
20511: LDI ARDM2(XL) SECOND DIMENSION IS ROW LENGTH
20512: MFI WA CONVERT TO SHORT INTEGER
20513: MOV WA,XR COPY ROW LENGTH
20514: WTB WA CONVERT TO BAUS
20515: MOV WA,SRTST STORE AS STRIDE
20516: LDI ARDIM(XL) GET NUMBER OF ROWS
20517: MFI WA AS A SHORT INTEGER
20518: WTB WA CONVERT N TO BAUS
20519: MOV ARLEN(XL),WC OFFSET PAST ARRAY END
20520: SUB WA,WC ADJUST, GIVING SPACE FOR N OFFSETS
20521: DCA WC POINT TO A(0)
20522: MOV AROFS(XL),WB OFFSET TO WORD BEFORE FIRST ITEM
20523: ICA WB OFFSET TO FIRST ITEM
20524: *
20525: * SEPARATE PRE-PROCESSING FOR ARRAYS AND VECTORS DONE.
20526: * TO SIMPLIFY LATER KEY COMPARISONS, REMOVAL OF ANY TRBLK
20527: * TRAP BLOCKS FROM ENTRIES IN KEY ARRAY IS EFFECTED.
20528: *
20529: * (XL) = 1(XS) = POINTER TO KEY ARRAY
20530: * (XS) = POINTER TO SORT ARRAY
20531: * WA = NUMBER OF ITEMS, N (CONVERTED TO BAUS).
20532: * WB = OFFSET TO FIRST ITEM OF ARRAYS.
20533: * WC = OFFSET TO A(0)
20534: *
20535: SRT04 BLE WA,*NUM01,SRT15 RETURN IF ONLY A SINGLE ITEM
20536: MOV WA,SRTSN STORE NUMBER OF ITEMS (IN BAUS)
20537: MOV WC,SRTSO STORE OFFSET TO A(0)
20538: MOV ARLEN(XL),WC LENGTH OF ARRAY OR VEC (=VCLEN)
20539: ADD XL,WC POINT PAST END OF ARRAY OR VECTOR
20540: MOV WB,SRTSF STORE OFFSET TO FIRST ROW
20541: ADD WB,XL POINT TO FIRST ITEM IN KEY ARRAY
20542: *
20543: * LOOP THROUGH ARRAY
20544: *
20545: SRT05 MOV (XL),XR GET AN ENTRY
20546: *
20547: * HUNT ALONG TRBLK CHAIN
20548: *
20549: SRT06 BNE (XR),=B$TRT,SRT07 JUMP OUT IF NOT TRBLK
20550: MOV TRVAL(XR),XR GET VALUE FIELD
20551: BRN SRT06 LOOP
20552: EJC
20553: *
20554: * SORTA (CONTINUED)
20555: *
20556: * XR IS VALUE FROM END OF CHAIN
20557: *
20558: SRT07 MOV XR,(XL)+ STORE AS ARRAY ENTRY
20559: BLT XL,WC,SRT05 LOOP IF NOT DONE
20560: MOV (XS),XL GET ADRS OF SORT ARRAY
20561: MOV SRTSF,XR INITIAL OFFSET TO FIRST KEY
20562: MOV SRTST,WB GET STRIDE
20563: ADD SRTSO,XL OFFSET TO A(0)
20564: ICA XL POINT TO A(1)
20565: MOV SRTSN,WC GET N
20566: BTW WC CONVERT FROM BAUS
20567: MOV WC,SRTNR STORE AS ROW COUNT
20568: LCT WC,WC LOOP COUNTER
20569: *
20570: * STORE KEY OFFSETS AT TOP OF SORT ARRAY
20571: *
20572: SRT08 MOV XR,(XL)+ STORE AN OFFSET
20573: ADD WB,XR BUMP OFFSET BY STRIDE
20574: BCT WC,SRT08 LOOP THROUGH ROWS
20575: *
20576: * PERFORM THE SORT ON OFFSETS IN SORT ARRAY.
20577: *
20578: * (SRTSN) NUMBER OF ITEMS TO SORT, N (BAUS)
20579: * (SRTSO) OFFSET TO A(0)
20580: *
20581: SRT09 MOV SRTSN,WA GET N
20582: MOV SRTNR,WC GET NUMBER OF ROWS
20583: RSH WC,1 I = N / 2 (WC=I, INDEX INTO ARRAY)
20584: WTB WC CONVERT BACK TO BAUS
20585: *
20586: * LOOP TO FORM INITIAL HEAP
20587: *
20588: SRT10 JSR SORTH SORTH(I,N)
20589: DCA WC I = I - 1
20590: BNZ WC,SRT10 LOOP IF I GT 0
20591: MOV WA,WC I = N
20592: *
20593: * SORTING LOOP. AT THIS POINT, A(1) IS THE LARGEST
20594: * ITEM, SINCE ALGORITHM INITIALISES IT AS, AND THEN MAINTAINS
20595: * IT AS, ROOT OF TREE.
20596: *
20597: SRT11 DCA WC I = I - 1 (N - 1 INITIALLY)
20598: BZE WC,SRT12 JUMP IF DONE
20599: MOV (XS),XR GET SORT ARRAY ADDRESS
20600: ADD SRTSO,XR POINT TO A(0)
20601: MOV XR,XL A(0) ADDRESS
20602: ADD WC,XL A(I) ADDRESS
20603: MOV 1(XL),WB COPY A(I+1)
20604: MOV 1(XR),1(XL) MOVE A(1) TO A(I+1)
20605: MOV WB,1(XR) COMPLETE EXCHANGE OF A(1), A(I+1)
20606: MOV WC,WA N = I FOR SORTH
20607: MOV *NUM01,WC I = 1 FOR SORTH
20608: JSR SORTH SORTH(1,N)
20609: MOV WA,WC RESTORE WC
20610: BRN SRT11 LOOP
20611: EJC
20612: *
20613: * SORTA (CONTINUED)
20614: *
20615: * OFFSETS HAVE BEEN PERMUTED INTO REQUIRED ORDER BY SORT.
20616: * COPY ARRAY ELEMENTS OVER THEM.
20617: *
20618: SRT12 MOV (XS),XL BASE ADRS OF KEY ARRAY
20619: MOV XL,WC COPY IT
20620: ADD SRTSO,WC OFFSET OF A(0)
20621: ADD SRTSF,XL ADRS OF FIRST ROW OF SORT ARRAY
20622: MOV SRTST,WB GET STRIDE
20623: BTW WB CONVERT TO WORDS
20624: *
20625: * COPYING LOOP FOR SUCCESSIVE ITEMS. SORTED OFFSETS ARE
20626: * HELD AT END OF SORT ARRAY.
20627: *
20628: SRT13 ICA WC ADRS OF NEXT OF SORTED OFFSETS
20629: MOV WC,XR COPY IT FOR ACCESS
20630: MOV (XR),XR GET OFFSET
20631: ADD 1(XS),XR ADD KEY ARRAY BASE ADRS
20632: LCT WA,WB GET COUNT OF WORDS IN ROW
20633: *
20634: * COPY A COMPLETE ROW
20635: *
20636: SRT14 MOV (XR)+,(XL)+ MOVE A WORD
20637: BCT WA,SRT14 LOOP
20638: DCV SRTNR DECREMENT ROW COUNT
20639: BNZ SRTNR,SRT13 REPEAT TILL ALL ROWS DONE
20640: *
20641: * RETURN POINT
20642: *
20643: SRT15 MOV (XS)+,XR POP RESULT ARRAY PTR
20644: ICA XS POP KEY ARRAY PTR
20645: ZER R$SXL CLEAR JUNK
20646: ZER R$SXR CLEAR JUNK
20647: EXI RETURN
20648: *
20649: * ERROR POINT
20650: *
20651: SRT16 ERB 238,SORT/RSORT 1ST ARG NOT SUITABLE ARRAY OR TABLE
20652: SRT17 ERB 239,SORT/RSORT 2ND ARG OUT OF RANGE OR NON-INTEGER
20653: *
20654: * SOFT FAIL RETURN
20655: *
20656: SRT18 EXI 1 RETURN
20657: ENP END PROCUDURE SORTA
20658: EJC
20659: *
20660: * SORTC -- COMPARE SORT KEYS
20661: *
20662: * COMPARE TWO SORT KEYS GIVEN THEIR OFFSETS. IF
20663: * EQUAL, COMPARE KEY OFFSETS TO GIVE STABLE SORT.
20664: * NOTE THAT IF SRTSR IS NON-ZERO (REQUEST FOR REVERSE
20665: * SORT), THE QUOTED RETURNS ARE INVERTED.
20666: * FOR OBJECTS OF DIFFERING DATATYPES, THE ENTRY POINT
20667: * IDENTIFICATIONS ARE COMPARED.
20668: *
20669: * (XL) BASE ADRS FOR KEYS
20670: * (WA) OFFSET TO KEY 1 ITEM
20671: * (WB) OFFSET TO KEY 2 ITEM
20672: * (SRTSR) ZERO/NON-ZERO FOR SORT/RSORT
20673: * (SRTOF) OFFSET WITHIN ROW TO COMPARANDS
20674: * JSR SORTC CALL TO COMPARE KEYS
20675: * PPM LOC KEY1 LESS THAN KEY2
20676: * NORMAL RETURN, KEY1 GT THAN KEY2
20677: * (XL,XR,WA,WB) DESTROYED
20678: *
20679: SORTC PRC E,1 ENTRY POINT
20680: MOV WA,SRTS1 SAVE OFFSET 1
20681: MOV WB,SRTS2 SAVE OFFSET 2
20682: MOV WC,SRTSC SAVE WC
20683: ADD SRTOF,XL ADD OFFSET TO COMPARAND FIELD
20684: MOV XL,XR COPY BASE + OFFSET
20685: ADD WA,XL ADD KEY1 OFFSET
20686: ADD WB,XR ADD KEY2 OFFSET
20687: MOV (XL),XL GET KEY1
20688: MOV (XR),XR GET KEY2
20689: BNE SRTDF,=NULLS,SRC11 JUMP IF DATATYPE FIELD NAME USED
20690: EJC
20691: *
20692: * SORTC (CONTINUED)
20693: *
20694: * MERGE AFTER DEALING WITH FIELD NAME. TRY FOR STRINGS.
20695: *
20696: SRC01 MOV (XL),WC GET TYPE CODE
20697: BNE WC,(XR),SRC02 SKIP IF NOT SAME DATATYPE
20698: BEQ WC,=B$SCL,SRC09 JUMP IF BOTH STRINGS
20699: *
20700: * NOW TRY FOR NUMERIC
20701: *
20702: SRC02 MOV XL,R$SXL KEEP ARG1
20703: MOV XR,R$SXR KEEP ARG2
20704: MOV XL,-(XS) STACK
20705: MOV XR,-(XS) ARGS
20706: JSR ACOMP COMPARE OBJECTS
20707: PPM SRC10 NOT NUMERIC
20708: PPM SRC10 NOT NUMERIC
20709: PPM SRC03 KEY1 LESS
20710: PPM SRC08 KEYS EQUAL
20711: PPM SRC05 KEY1 GREATER
20712: *
20713: * RETURN IF KEY1 SMALLER (SORT), GREATER (RSORT)
20714: *
20715: SRC03 BNZ SRTSR,SRC06 JUMP IF RSORT
20716: *
20717: SRC04 MOV SRTSC,WC RESTORE WC
20718: EXI 1 RETURN
20719: *
20720: * RETURN IF KEY1 GREATER (SORT), SMALLER (RSORT)
20721: *
20722: SRC05 BNZ SRTSR,SRC04 JUMP IF RSORT
20723: *
20724: SRC06 MOV SRTSC,WC RESTORE WC
20725: EXI RETURN
20726: *
20727: * KEYS ARE OF SAME DATATYPE
20728: *
20729: SRC07 BLT XL,XR,SRC03 ITEM FIRST CREATED IS LESS
20730: BGT XL,XR,SRC05 ADDRESSES RISE IN ORDER OF CREATION
20731: *
20732: * DROP THROUGH OR MERGE FOR IDENTICAL OR EQUAL OBJECTS
20733: *
20734: SRC08 BLT SRTS1,SRTS2,SRC04 TEST OFFSETS OR KEY ADDRSS INSTEAD
20735: BRN SRC06 OFFSET 1 GREATER
20736: EJC
20737: *
20738: * SORTC (CONTINUED)
20739: *
20740: * STRINGS
20741: *
20742: SRC09 MOV XL,-(XS) STACK
20743: MOV XR,-(XS) ARGS
20744: JSR LCOMP COMPARE OBJECTS
20745: PPM CANT
20746: PPM FAIL
20747: PPM SRC03 KEY1 LESS
20748: PPM SRC08 KEYS EQUAL
20749: PPM SRC05 KEY1 GREATER
20750: *
20751: * ARITHMETIC COMPARISON FAILED - RECOVER ARGS
20752: *
20753: SRC10 MOV R$SXL,XL GET ARG1
20754: MOV R$SXR,XR GET ARG2
20755: MOV (XL),WC GET TYPE OF KEY1
20756: BEQ WC,(XR),SRC07 JUMP IF KEYS OF SAME TYPE
20757: MOV WC,XL GET BLOCK TYPE WORD
20758: MOV (XR),XR GET BLOCK TYPE WORD
20759: LEI XL ENTRY POINT ID FOR KEY1
20760: LEI XR ENTRY POINT ID FOR KEY2
20761: BGT XL,XR,SRC05 JUMP IF KEY1 GT KEY2
20762: BRN SRC03 KEY1 LT KEY2
20763: *
20764: * DATATYPE FIELD NAME USED
20765: *
20766: SRC11 JSR SORTF CALL ROUTINE TO FIND FIELD 1
20767: MOV XL,-(XS) STACK ITEM POINTER
20768: MOV XR,XL GET KEY2
20769: JSR SORTF FIND FIELD 2
20770: MOV XL,XR PLACE AS KEY2
20771: MOV (XS)+,XL RECOVER KEY1
20772: BRN SRC01 MERGE
20773: ENP PROCEDURE SORTC
20774: EJC
20775: *
20776: * SORTF -- FIND FIELD FOR SORTC
20777: *
20778: * ROUTINE USED BY SORTC TO OBTAIN ITEM CORRESPONDING
20779: * TO A GIVEN FIELD NAME, IF THIS EXISTS, IN A PROGRAMMER
20780: * DEFINED OBJECT PASSED AS ARGUMENT.
20781: * IF SUCH A MATCH OCCURS, RECORD IS KEPT OF DATATYPE
20782: * NAME, FIELD NAME AND OFFSET TO FIELD IN ORDER TO
20783: * SHORT-CIRCUIT LATER SEARCHES ON SAME TYPE. NOTE THAT
20784: * DFBLKS ARE STORED IN STATIC AND HENCE CANNOT BE MOVED.
20785: *
20786: * (SRTDF) VRBLK POINTER OF FIELD NAME
20787: * (XL) POSSIBLE PDBLK POINTER
20788: * JSR SORTF CALL TO SEARCH FOR FIELD NAME
20789: * (XL) ITEM FOUND OR ORIGINAL PDBLK PTR
20790: * (WC) DESTROYED
20791: *
20792: SORTF PRC E,0 ENTRY POINT
20793: BNE (XL),=B$PDT,SRTF3 RETURN IF NOT PDBLK
20794: MOV XR,-(XS) KEEP XR
20795: MOV SRTFD,XR GET POSSIBLE FORMER DFBLK PTR
20796: BZE XR,SRTF4 JUMP IF NOT
20797: BNE XR,PDDFP(XL),SRTF4 JUMP IF NOT RIGHT DATATYPE
20798: BNE SRTDF,SRTFF,SRTF4 JUMP IF NOT RIGHT FIELD NAME
20799: ADD SRTFO,XL ADD OFFSET TO REQUIRED FIELD
20800: *
20801: * HERE WITH XL POINTING TO FOUND FIELD
20802: *
20803: SRTF1 MOV (XL),XL GET ITEM FROM FIELD
20804: *
20805: * RETURN POINT
20806: *
20807: SRTF2 MOV (XS)+,XR RESTORE XR
20808: *
20809: SRTF3 EXI RETURN
20810: EJC
20811: *
20812: * SORTF (CONTINUED)
20813: *
20814: * CONDUCT A SEARCH
20815: *
20816: SRTF4 MOV XL,XR COPY ORIGINAL POINTER
20817: MOV PDDFP(XR),XR POINT TO DFBLK
20818: MOV XR,SRTFD KEEP A COPY
20819: MOV FARGS(XR),WC GET NUMBER OF FIELDS
20820: WTB WC CONVERT TO BAUS
20821: ADD DFLEN(XR),XR POINT PAST LAST FIELD
20822: *
20823: * LOOP TO FIND NAME IN PDFBLK
20824: *
20825: SRTF5 DCA WC COUNT DOWN
20826: DCA XR POINT IN FRONT
20827: BEQ (XR),SRTDF,SRTF6 SKIP OUT IF FOUND
20828: BNZ WC,SRTF5 LOOP
20829: BRN SRTF2 RETURN - NOT FOUND
20830: *
20831: * FOUND
20832: *
20833: SRTF6 MOV (XR),SRTFF KEEP FIELD NAME PTR
20834: ADD *PDFLD,WC ADD OFFSET TO FIRST FIELD
20835: MOV WC,SRTFO STORE AS FIELD OFFSET
20836: ADD WC,XL POINT TO FIELD
20837: BRN SRTF1 RETURN
20838: ENP PROCEDURE SORTF
20839: EJC
20840: *
20841: * SORTH -- HEAP ROUTINE FOR SORTA
20842: *
20843: * THIS ROUTINE CONSTRUCTS A HEAP FROM ELEMENTS OF ARRAY, A.
20844: * IN THIS APPLICATION, THE ELEMENTS ARE OFFSETS TO KEYS IN
20845: * A KEY ARRAY.
20846: *
20847: * (XS) POINTER TO SORT ARRAY BASE
20848: * 1(XS) POINTER TO KEY ARRAY BASE
20849: * (WA) MAX ARRAY INDEX, N (IN BAUS)
20850: * (WC) OFFSET J IN A TO ROOT (IN *1 TO *N)
20851: * JSR SORTH CALL SORTH(J,N) TO MAKE HEAP
20852: * (XL,XR,WB) DESTROYED
20853: *
20854: SORTH PRC N,0 ENTRY POINT
20855: MOV WA,SRTSN SAVE N
20856: MOV WC,SRTWC KEEP WC
20857: MOV (XS),XL SORT ARRAY BASE ADRS
20858: ADD SRTSO,XL ADD OFFSET TO A(0)
20859: ADD WC,XL POINT TO A(J)
20860: MOV (XL),SRTRT GET OFFSET TO ROOT
20861: ADD WC,WC DOUBLE J - CANT EXCEED N
20862: *
20863: * LOOP TO MOVE DOWN TREE USING DOUBLED INDEX J
20864: *
20865: SRH01 BGT WC,SRTSN,SRH03 DONE IF J GT N
20866: BEQ WC,SRTSN,SRH02 SKIP IF J EQUALS N
20867: MOV (XS),XR SORT ARRAY BASE ADRS
20868: MOV 1(XS),XL KEY ARRAY BASE ADRS
20869: ADD SRTSO,XR POINT TO A(0)
20870: ADD WC,XR ADRS OF A(J)
20871: MOV 1(XR),WA GET A(J+1)
20872: MOV (XR),WB GET A(J)
20873: *
20874: * COMPARE SONS. (WA) RIGHT SON, (WB) LEFT SON
20875: *
20876: JSR SORTC COMPARE KEYS - LT(A(J+1),A(J))
20877: PPM SRH02 A(J+1) LT A(J)
20878: ICA WC POINT TO GREATER SON, A(J+1)
20879: EJC
20880: *
20881: * SORTH (CONTINUED)
20882: *
20883: * COMPARE ROOT WITH GREATER SON
20884: *
20885: SRH02 MOV 1(XS),XL KEY ARRAY BASE ADRS
20886: MOV (XS),XR GET SORT ARRAY ADDRESS
20887: ADD SRTSO,XR ADRS OF A(0)
20888: MOV XR,WB COPY THIS ADRS
20889: ADD WC,XR ADRS OF GREATER SON, A(J)
20890: MOV (XR),WA GET A(J)
20891: MOV WB,XR POINT BACK TO A(0)
20892: MOV SRTRT,WB GET ROOT
20893: JSR SORTC COMPARE THEM - LT(A(J),ROOT)
20894: PPM SRH03 FATHER EXCEEDS SONS - DONE
20895: MOV (XS),XR GET SORT ARRAY ADRS
20896: ADD SRTSO,XR POINT TO A(0)
20897: MOV XR,XL COPY IT
20898: MOV WC,WA COPY J
20899: BTW WC CONVERT TO WORDS
20900: RSH WC,1 GET J/2
20901: WTB WC CONVERT BACK TO BAUS
20902: ADD WA,XL POINT TO A(J)
20903: ADD WC,XR ADRS OF A(J/2)
20904: MOV (XL),(XR) A(J/2) = A(J)
20905: MOV WA,WC RECOVER J
20906: AOV WC,WC,SRH03 J = J*2. DONE IF TOO BIG
20907: BRN SRH01 LOOP
20908: *
20909: * FINISH BY COPYING ROOT OFFSET BACK INTO ARRAY
20910: *
20911: SRH03 BTW WC CONVERT TO WORDS
20912: RSH WC,1 J = J/2
20913: WTB WC CONVERT BACK TO BAUS
20914: MOV (XS),XR SORT ARRAY ADRS
20915: ADD SRTSO,XR ADRS OF A(0)
20916: ADD WC,XR ADRS OF A(J/2)
20917: MOV SRTRT,(XR) A(J/2) = ROOT
20918: MOV SRTSN,WA RESTORE WA
20919: MOV SRTWC,WC RESTORE WC
20920: EXI RETURN
20921: ENP END PROCEDURE SORTH
20922: EJC
20923: .FI
20924: EJC
20925: *
20926: * TFIND -- LOCATE TABLE ELEMENT
20927: *
20928: * (XR) SUBSCRIPT VALUE FOR ELEMENT
20929: * (XL) POINTER TO TABLE
20930: * (WB) ZERO BY VALUE, NON-ZERO BY NAME
20931: * JSR TFIND CALL TO LOCATE ELEMENT
20932: * PPM LOC TRANSFER LOCATION IF ACCESS FAILS
20933: * (XR) ELEMENT VALUE (IF BY VALUE)
20934: * (XR) DESTROYED (IF BY NAME)
20935: * (XL,WA) TEBLK NAME (IF BY NAME)
20936: * (XL,WA) DESTROYED (IF BY VALUE)
20937: * (WC,RA) DESTROYED
20938: *
20939: * NOTE THAT IF A CALL BY VALUE SPECIFIES A NON-EXISTENT
20940: * SUBSCRIPT, NULL IS RETURNED WITHOUT BUILDING A NEW TEBLK.
20941: *
20942: TFIND PRC E,1 ENTRY POINT
20943: MOV WB,-(XS) SAVE NAME/VALUE INDICATOR
20944: MOV XR,-(XS) SAVE SUBSCRIPT VALUE
20945: MOV XL,-(XS) SAVE TABLE POINTER
20946: MOV TBLEN(XL),WA LOAD LENGTH OF TBBLK
20947: BTW WA CONVERT TO WORD COUNT
20948: SUB =TBBUK,WA GET NUMBER OF BUCKETS
20949: MTI WA CONVERT TO INTEGER VALUE
20950: STI TFNSI SAVE FOR LATER
20951: MOV (XR),XL LOAD FIRST WORD OF SUBSCRIPT
20952: LEI XL LOAD BLOCK ENTRY ID (BL$XX)
20953: BSW XL,BL$$D,TFN00 SWITCH ON BLOCK TYPE
20954: IFF BL$IC,TFN02 JUMP IF INTEGER
20955: .IF .CNRA
20956: .ELSE
20957: IFF BL$RC,TFN02 REAL
20958: .FI
20959: IFF BL$P0,TFN03 JUMP IF PATTERN
20960: IFF BL$P1,TFN03 JUMP IF PATTERN
20961: IFF BL$P2,TFN03 JUMP IF PATTERN
20962: IFF BL$NM,TFN04 JUMP IF NAME
20963: IFF BL$SC,TFN05 JUMP IF STRING
20964: ESW END SWITCH ON BLOCK TYPE
20965: *
20966: * HERE FOR BLOCKS FOR WHICH WE USE THE SECOND WORD OF THE
20967: * BLOCK AS THE HASH SOURCE (SEE BLOCK FORMATS FOR DETAILS).
20968: *
20969: TFN00 MOV 1(XR),WA LOAD SECOND WORD
20970: *
20971: * MERGE HERE WITH ONE WORD HASH SOURCE IN WA
20972: *
20973: TFN01 MTI WA CONVERT TO INTEGER
20974: BRN TFN06 JUMP TO MERGE
20975: EJC
20976: *
20977: * TFIND (CONTINUED)
20978: *
20979: * HERE FOR INTEGER OR REAL
20980: * POSSIBILITY OF OVERFLOW EXIST ON TWOS COMPLEMENT
20981: * MACHINE IF HASH SOURCE IS MOST NEGATIVE INTEGER OR IS
20982: * A REAL HAVING THE SAME BIT PATTERN.
20983: *
20984: TFN02 LDI 1(XR) LOAD VALUE AS HASH SOURCE
20985: IGE TFN06 OK IF POSITIVE OR ZERO
20986: NGI MAKE POSITIVE
20987: IOV TFN06 CLEAR POSSIBLE OVERFLOW
20988: BRN TFN06 MERGE
20989: *
20990: * FOR PATTERN, USE FIRST WORD (PCODE) AS SOURCE
20991: *
20992: TFN03 MOV (XR),WA LOAD FIRST WORD AS HASH SOURCE
20993: BRN TFN01 MERGE BACK
20994: *
20995: * FOR NAME, USE OFFSET AS HASH SOURCE
20996: *
20997: TFN04 MOV NMOFS(XR),WA LOAD OFFSET AS HASH SOURCE
20998: BRN TFN01 MERGE BACK
20999: *
21000: * HERE FOR STRING
21001: *
21002: TFN05 JSR HASHS CALL ROUTINE TO COMPUTE HASH
21003: *
21004: * MERGE HERE WITH HASH SOURCE IN (IA)
21005: *
21006: TFN06 RMI TFNSI COMPUTE HASH INDEX BY REMAINDERING
21007: MFI WC GET AS ONE WORD INTEGER
21008: WTB WC CONVERT TO BAU OFFSET
21009: MOV (XS),XL GET TABLE PTR AGAIN
21010: ADD WC,XL POINT TO PROPER BUCKET
21011: MOV TBBUK(XL),XR LOAD FIRST TEBLK POINTER
21012: BEQ XR,(XS),TFN10 JUMP IF NO TEBLKS ON CHAIN
21013: *
21014: * LOOP THROUGH TEBLKS ON HASH CHAIN
21015: *
21016: TFN07 MOV XR,WB SAVE TEBLK POINTER
21017: MOV TESUB(XR),XR LOAD SUBSCRIPT VALUE
21018: MOV 1(XS),XL LOAD INPUT ARGUMENT SUBSCRIPT VAL
21019: JSR IDENT COMPARE THEM
21020: PPM TFN08 JUMP IF EQUAL (IDENT)
21021: *
21022: * HERE IF NO MATCH WITH THAT TEBLK
21023: *
21024: MOV WB,XL RESTORE TEBLK POINTER
21025: MOV TENXT(XL),XR POINT TO NEXT TEBLK ON CHAIN
21026: BNE XR,(XS),TFN07 JUMP IF THERE IS ONE
21027: *
21028: * HERE IF NO MATCH WITH ANY TEBLK ON CHAIN
21029: *
21030: MOV *TENXT,WC SET OFFSET TO LINK FIELD (XL BASE)
21031: BRN TFN11 JUMP TO MERGE
21032: EJC
21033: *
21034: * TFIND (CONTINUED)
21035: *
21036: * HERE WE HAVE FOUND A MATCHING ELEMENT
21037: *
21038: TFN08 MOV WB,XL RESTORE TEBLK POINTER
21039: MOV *TEVAL,WA SET TEBLK NAME OFFSET
21040: MOV 2(XS),WB RESTORE NAME/VALUE INDICATOR
21041: BNZ WB,TFN09 JUMP IF CALLED BY NAME
21042: JSR ACESS ELSE GET VALUE
21043: PPM TFN12 JUMP IF REFERENCE FAILS
21044: ZER WB RESTORE NAME/VALUE INDICATOR
21045: *
21046: * COMMON EXIT FOR ENTRY FOUND
21047: *
21048: TFN09 ADD *NUM03,XS POP STACK ENTRIES
21049: EXI RETURN TO TFIND CALLER
21050: *
21051: * HERE IF NO TEBLKS ON THE HASH CHAIN
21052: *
21053: TFN10 ADD *TBBUK,WC GET OFFSET TO BUCKET PTR
21054: MOV (XS),XL SET TBBLK PTR AS BASE
21055: *
21056: * MERGE HERE WITH (XL,WC) BASE,OFFSET OF FINAL LINK
21057: *
21058: TFN11 MOV (XS),XR TBBLK POINTER
21059: MOV TBINV(XR),XR LOAD DEFAULT VALUE IN CASE
21060: MOV 2(XS),WB LOAD NAME/VALUE INDICATOR
21061: BZE WB,TFN09 EXIT WITH DEFAULT IF VALUE CALL
21062: MOV XR,WB COPY DEFAULT VALUE
21063: *
21064: * HERE WE MUST BUILD A NEW TEBLK
21065: *
21066: MOV *TESI$,WA SET SIZE OF TEBLK
21067: JSR ALLOC ALLOCATE TEBLK
21068: ADD WC,XL POINT TO HASH LINK
21069: MOV XR,(XL) LINK NEW TEBLK AT END OF CHAIN
21070: MOV =B$TET,(XR) STORE TYPE WORD
21071: MOV WB,TEVAL(XR) SET DEFAULT AS INITIAL VALUE
21072: MOV (XS)+,TENXT(XR) SET TBBLK PTR TO MARK END OF CHAIN
21073: MOV (XS)+,TESUB(XR) STORE SUBSCRIPT VALUE
21074: MOV (XS)+,WB RESTORE NAME/VALUE INDICATOR
21075: MOV XR,XL COPY TEBLK POINTER (NAME BASE)
21076: MOV *TEVAL,WA SET OFFSET
21077: EXI RETURN TO CALLER WITH NEW TEBLK
21078: *
21079: * ACESS FAIL RETURN
21080: *
21081: TFN12 EXI 1 ALTERNATIVE RETURN
21082: ENP END PROCEDURE TFIND
21083: EJC
21084: *
21085: * TRACE -- SET/RESET A TRACE ASSOCIATION
21086: *
21087: * THIS PROCEDURE IS SHARED BY TRACE AND STOPTR TO
21088: * EITHER INITIATE OR STOP A TRACE RESPECTIVELY.
21089: *
21090: * (XL) TRBLK PTR (TRACE) OR ZERO (STOPTR)
21091: * 1(XS) FIRST ARGUMENT (NAME)
21092: * 0(XS) SECOND ARGUMENT (TRACE TYPE)
21093: * JSR TRACE CALL TO SET/RESET TRACE
21094: * PPM LOC TRANSFER LOC IF 1ST ARG IS BAD NAME
21095: * PPM LOC TRANSFER LOC IF 2ND ARG IS BAD TYPE
21096: * PPM LOC FAIL STOPTR IF NON-EXISTENT TRACE
21097: * (XS) POPPED
21098: * (XL,XR,WA,WB,WC,IA) DESTROYED
21099: *
21100: TRACE PRC N,3 ENTRY POINT
21101: JSR GTSTG GET TRACE TYPE STRING
21102: PPM TRC15 JUMP IF NOT STRING
21103: PLC XR ELSE POINT TO STRING
21104: LCH WA,(XR) LOAD FIRST CHARACTER
21105: .IF .CASL
21106: BLT WA,=CH$$A,TRC00 SKIP IF NOT LOWER CASE
21107: SUB =DFA$A,WA CONVERT LOWER TO UPPER CASE
21108: *
21109: * HERE WITH UPPER CASE TRACE TYPE CODE
21110: *
21111: TRC00 MOV (XS),XR LOAD NAME ARGUMENT
21112: .ELSE
21113: MOV (XS),XR LOAD NAME ARGUMENT
21114: .FI
21115: MOV XL,(XS) STACK TRBLK PTR OR ZERO
21116: MOV =TRTAC,WC SET TRTYP FOR ACCESS TRACE
21117: BEQ WA,=CH$LA,TRC10 JUMP IF A (ACCESS)
21118: MOV =TRTVL,WC SET TRTYP FOR VALUE TRACE
21119: BEQ WA,=CH$LV,TRC10 JUMP IF V (VALUE)
21120: BEQ WA,=CH$BL,TRC10 JUMP IF BLANK (VALUE)
21121: *
21122: * HERE FOR L,K,F,C,R
21123: *
21124: BEQ WA,=CH$LF,TRC01 JUMP IF F (FUNCTION)
21125: BEQ WA,=CH$LR,TRC01 JUMP IF R (RETURN)
21126: BEQ WA,=CH$LL,TRC03 JUMP IF L (LABEL)
21127: BEQ WA,=CH$LK,TRC06 JUMP IF K (KEYWORD)
21128: BNE WA,=CH$LC,TRC15 ELSE ERROR IF NOT C (CALL)
21129: *
21130: * HERE FOR F,C,R
21131: *
21132: TRC01 JSR GTNVR POINT TO VRBLK FOR NAME
21133: PPM TRC16 JUMP IF BAD NAME
21134: ICA XS POP STACK
21135: MOV VRFNC(XR),XR POINT TO FUNCTION BLOCK
21136: BNE (XR),=B$PFC,TRC17 ERROR IF NOT PROGRAM FUNCTION
21137: MOV XL,WB COPY TRBLK PTR OR 0
21138: BEQ WA,=CH$LR,TRC02 JUMP IF R (RETURN)
21139: EJC
21140: *
21141: * TRACE (CONTINUED)
21142: *
21143: * HERE FOR F,C TO SET/RESET CALL TRACE
21144: *
21145: ORB PFCTR(XR),WB STOPTR FAIL CHECK
21146: MOV XL,PFCTR(XR) SET/RESET CALL TRACE
21147: BEQ WA,=CH$LC,TRC11 RETURN IF LETTER C
21148: *
21149: * HERE FOR F,R TO SET/RESET RETURN TRACE
21150: *
21151: TRC02 ORB PFRTR(XR),WB STOPTR FAIL CHECK
21152: MOV XL,PFRTR(XR) SET/RESET RETURN TRACE
21153: BRN TRC11 RETURN
21154: *
21155: * HERE FOR L TO SET/RESET LABEL TRACE
21156: *
21157: TRC03 JSR GTNVR POINT TO VRBLK
21158: PPM TRC16 JUMP IF BAD NAME
21159: MOV (XS)+,WB GET TRBLK OR ZERO
21160: MOV VRLBL(XR),XL LOAD LABEL POINTER
21161: BNE (XL),=B$TRT,TRC04 JUMP IF NO OLD TRACE
21162: MOV TRLBL(XL),XL ELSE DELETE OLD TRACE ASSOCIATION
21163: BRN TRCA4 MERGE
21164: *
21165: * HERE WITH OLD LABEL TRACE ASSOCIATION DELETED
21166: *
21167: TRC04 BZE WB,TRC12 FAIL IF STOPTR OF UNTRACED LABEL
21168: *
21169: * TEST FOR UNDEFINED LABEL
21170: *
21171: TRCA4 BEQ XL,=STNDL,TRC17 ERROR IF UNDEFINED LABEL
21172: BZE WB,TRC05 JUMP IF STOPTR CASE
21173: MOV WB,VRLBL(XR) ELSE SET NEW TRBLK POINTER
21174: MOV =B$VRT,VRTRA(XR) SET LABEL TRACE ROUTINE ADDRESS
21175: MOV WB,XR COPY TRBLK POINTER
21176: MOV XL,TRLBL(XR) STORE REAL LABEL IN TRBLK
21177: EXI RETURN
21178: *
21179: * HERE FOR STOPTR CASE FOR LABEL
21180: *
21181: TRC05 MOV XL,VRLBL(XR) STORE LABEL PTR BACK IN VRBLK
21182: MOV =B$VRG,VRTRA(XR) STORE NORMAL TRANSFER ADDRESS
21183: EXI RETURN
21184: EJC
21185: *
21186: * TRACE (CONTINUED)
21187: *
21188: * HERE FOR K (KEYWORD)
21189: *
21190: TRC06 JSR GTNVR POINT TO VRBLK
21191: PPM TRC16 ERROR IF NOT NATURAL VAR
21192: BNZ VRLEN(XR),TRC16 ERROR IF NOT SYSTEM VAR
21193: ICA XS POP STACK
21194: BZE XL,TRC07 JUMP IF STOPTR CASE
21195: MOV XR,TRKVR(XL) STORE VRBLK PTR IN TRBLK FOR KTREX
21196: *
21197: * MERGE HERE WITH TRBLK SET UP IN XL (OR ZERO)
21198: *
21199: TRC07 MOV VRSVP(XR),XR POINT TO SVBLK
21200: MOV XL,WB COPY TRBLK PR OR 0
21201: BEQ XR,=V$ERT,TRC08 JUMP IF ERRTYPE
21202: BEQ XR,=V$STC,TRC09 JUMP IF STCOUNT
21203: BNE XR,=V$FNC,TRC17 ELSE ERROR IF NOT FNCLEVEL
21204: *
21205: * FNCLEVEL
21206: *
21207: ORB R$FNC,WB STOPTR FAIL CHECK
21208: MOV XL,R$FNC SET/RESET FNCLEVEL TRACE
21209: BRN TRC11 RETURN
21210: *
21211: * ERRTYPE
21212: *
21213: TRC08 ORB R$ERT,WB STOPTR FAIL CHECK
21214: MOV XL,R$ERT SET/RESET ERRTYPE TRACE
21215: BRN TRC11 RETURN
21216: *
21217: * STCOUNT
21218: *
21219: TRC09 ORB R$STC,WB STOPTR FAIL CHECK
21220: MOV XL,R$STC SET/RESET STCOUNT TRACE
21221: BRN TRC11 RETURN
21222: EJC
21223: *
21224: * TRACE (CONTINUED)
21225: *
21226: * A,V MERGE HERE WITH TRTYP VALUE IN WC
21227: *
21228: TRC10 JSR GTVAR LOCATE VARIABLE
21229: PPM TRC16 ERROR IF NOT APPROPRIATE NAME
21230: MOV (XS)+,XR GET NEW TRBLK PTR AGAIN
21231: MOV WC,WB COPY TRACE TYPE
21232: JSR TRCHN UPDATE TRACE CHAIN
21233: PPM TRC12 FAIL
21234: EXI RETURN
21235: *
21236: * RETURN AFTER CHECKING STOPTR FAIL CONDITION (WB = 0)
21237: *
21238: TRC11 ZRB WB,TRC12 FAIL IF NECESSARY
21239: EXI ELSE RETURN
21240: *
21241: * FAIL STOPTR
21242: *
21243: TRC12 EXI 3 FAIL RETURN
21244: *
21245: * HERE FOR BAD TRACE TYPE
21246: *
21247: TRC15 EXI 2 TAKE BAD TRACE TYPE ERROR EXIT
21248: *
21249: * POP STACK BEFORE FAILING
21250: *
21251: TRC16 ICA XS POP STACK
21252: *
21253: * HERE FOR BAD NAME ARGUMENT
21254: *
21255: TRC17 EXI 1 TAKE BAD NAME ERROR EXIT
21256: ENP END PROCEDURE TRACE
21257: EJC
21258: *
21259: * TRBLD -- BUILD TRBLK
21260: *
21261: * TRBLK IS USED BY THE INPUT, OUTPUT AND TRACE FUNCTIONS
21262: * TO CONSTRUCT A TRBLK (TRAP BLOCK)
21263: *
21264: * (XR) TRTAG OR TRTER
21265: * (XL) TRFNC OR TRTRI
21266: * (WB) TRTYP
21267: * JSR TRBLD CALL TO BUILD TRBLK
21268: * (XR) POINTER TO TRBLK
21269: * (WA) DESTROYED
21270: *
21271: TRBLD PRC E,0 ENTRY POINT
21272: MOV XR,-(XS) STACK TRTAG (OR TRFNM)
21273: MOV *TRSI$,WA SET SIZE OF TRBLK
21274: JSR ALLOC ALLOCATE TRBLK
21275: MOV =B$TRT,(XR) STORE FIRST WORD
21276: MOV XL,TRFNC(XR) STORE TRFNC (OR TRTRI)
21277: MOV (XS)+,TRTAG(XR) STORE TRTAG (OR TRTER)
21278: MOV WB,TRTYP(XR) STORE TYPE
21279: MOV =NULLS,TRVAL(XR) FOR NOW, A NULL VALUE
21280: EXI RETURN TO CALLER
21281: ENP END PROCEDURE TRBLD
21282: EJC
21283: *
21284: * TRCHN -- UPDATE TRACE BLOCK CHAIN
21285: *
21286: * CALLED WHEN A TRACE BLOCK CHAIN IS TO BE UPDATED BY
21287: * ADDITION OR REMOVAL OF A TRBLK.
21288: * IF A TRBLK OF THE SAME TYPE AS AN ADDITION IS ALREADY
21289: * PRESENT IT IS DELETED. THE TRTAG FIELD OF ANY DELETED
21290: * TRBLK IS CLEARED AS REQUIRED BY S$ENF.
21291: *
21292: * (XL,WA) POINTER, OFFSET TO TRACED VARIABLE
21293: * (XR) PTR TO NEW TRBLK OR 0 FOR REMOVAL
21294: * (WB) TRACE TYPE (TRTYP)
21295: * JSR TRCHN CALL TO UPDATE TRACE CHAIN
21296: * PPM LOC NO TRACE BLK OF REQD DELETION TYPE
21297: * (WA,WC) DESTROYED
21298: *
21299: TRCHN PRC E,1 ENTRY POINT
21300: ADD XL,WA KEEP POINTER TO TRACED LOCATION
21301: MOV WA,XL COPY POINTER
21302: SUB *TRNXT,XL ADJUST OFFSET BEFORE ENTERING LOOP
21303: MOV XR,WC COPY TRBLK PTR
21304: *
21305: * LOOP TO FIND TRACE BLOCK
21306: *
21307: TRCH1 MOV XL,XR COPY SO XR POINTS TO PREDECESSOR
21308: MOV TRNXT(XL),XL POINT TO POSSIBLE TRACE BLOCK
21309: BNE (XL),=B$TRT,TRCH2 SKIP OUT AT CHAIN END
21310: BLT WB,TRTYP(XL),TRCH2 SKIP IF TOO FAR OUT ON CHAIN
21311: BNE WB,TRTYP(XL),TRCH1 LOOP UNLESS TYPE MATCHES
21312: MOV TRNXT(XL),TRNXT(XR) REMOVE LINK TO OLD TRBLK
21313: ZER TRTAG(XL) CLEAR IOTAG FIELD OF DELETED BLOCK
21314: BZE WC,TRCH3 DONE IF NO NEW TRBLK
21315: *
21316: * OLD TRBLK REMOVED AND/OR END OF CHAIN REACHED
21317: *
21318: TRCH2 BZE WC,TRCH4 FAIL IF REQD BLOCK TYPE NOT FOUND
21319: MOV WC,XL POINT TO NEW TRBLK
21320: MOV TRNXT(XR),TRNXT(XL) ATTACH TAIL OF CHAIN TO IT
21321: MOV WC,TRNXT(XR) LINK NEW BLOCK IN
21322: MOV WB,TRTYP(XL) ENSURE TRTYP FIELD SET UP
21323: *
21324: * UPDATE ACCESS FIELDS OF NAME IF IT IS A VRBLK
21325: *
21326: TRCH3 MOV WA,XR POINT TO VBL
21327: SUB *VRVAL,XR ADJUST TO POSSIBLE VRBLK NAME BASE
21328: JSR SETVR UPDATE ACCESS FIELDS
21329: MOV WA,XL RECOVER XL
21330: MOV WC,XR RECOVER XR
21331: EXI RETURN TO CALLER
21332: *
21333: * FAIL RETURN
21334: *
21335: TRCH4 MOV WA,XL RECOVER XL
21336: MOV WC,XR RECOVER XR
21337: EXI 1 FAIL
21338: ENP END PROCEDURE TRCHN
21339: EJC
21340: *
21341: * TRIMR -- TRIM TRAILING BLANKS
21342: *
21343: * TRIMR IS PASSED A POINTER TO AN SCBLK WHICH MUST BE THE
21344: * LAST BLOCK IN DYNAMIC STORAGE. TRAILING BLANKS ARE
21345: * TRIMMED OFF AND THE DYNAMIC STORAGE POINTER RESET TO
21346: * THE END OF THE (POSSIBLY) SHORTENED BLOCK.
21347: *
21348: * (WB) NON-ZERO TO TRIM TRAILING BLANKS
21349: * (XR) POINTER TO STRING TO TRIM
21350: * JSR TRIMR CALL TO TRIM STRING
21351: * (XR) POINTER TO TRIMMED STRING
21352: * (XL,WA,WB,WC) DESTROYED
21353: *
21354: * THE CALL WITH WB ZERO STILL PERFORMS THE END ZERO PAD
21355: * AND DNAMP READJUSTMENT. IT IS USED FROM ACESS IF KVTRM=0.
21356: *
21357: TRIMR PRC E,0 ENTRY POINT
21358: MOV XR,XL COPY STRING POINTER
21359: MOV SCLEN(XR),WA LOAD STRING LENGTH
21360: BZE WA,TRIM2 JUMP IF NULL INPUT
21361: PLC XL,WA ELSE POINT PAST LAST CHARACTER
21362: BZE WB,TRIM3 JUMP IF NO TRIM
21363: MOV =CH$BL,WC LOAD BLANK CHARACTER
21364: *
21365: * LOOP THROUGH CHARACTERS FROM RIGHT TO LEFT
21366: *
21367: TRIM0 LCH WB,-(XL) LOAD NEXT CHARACTER
21368: .IF .CAHT
21369: BEQ WB,=CH$HT,TRIM1 JUMP IF HORIZONTAL TAB
21370: .FI
21371: BNE WB,WC,TRIM3 JUMP IF NON-BLANK FOUND
21372: TRIM1 DCV WA ELSE DECREMENT CHARACTER COUNT
21373: BNZ WA,TRIM0 LOOP BACK IF MORE TO CHECK
21374: *
21375: * HERE IF RESULT IS NULL (NULL OR ALL-BLANK INPUT)
21376: *
21377: TRIM2 MOV XR,DNAMP WIPE OUT INPUT STRING BLOCK
21378: MOV =NULLS,XR LOAD NULL RESULT
21379: BRN TRIM5 MERGE TO EXIT
21380: EJC
21381: *
21382: * TRIMR (CONTINUED)
21383: *
21384: * HERE WITH NON-BLANK FOUND (MERGE FOR NO TRIM)
21385: *
21386: TRIM3 MOV WA,SCLEN(XR) SET NEW LENGTH
21387: MOV XR,XL COPY STRING POINTER
21388: PSC XL,WA READY FOR STORING ZEROES
21389: CTB WA,SCHAR GET LENGTH OF BLOCK IN BAUS
21390: ADD XR,WA POINT PAST NEW BLOCK
21391: MOV WA,DNAMP SET NEW TOP OF STORAGE POINTER
21392: LCT WA,=CFP$C GET COUNT OF CHARS IN WORD
21393: ZER WC SET ZERO CHAR
21394: *
21395: * LOOP TO ZERO PAD LAST WORD OF CHARACTERS
21396: *
21397: TRIM4 SCH WC,(XL)+ STORE ZERO CHARACTER
21398: BCT WA,TRIM4 LOOP BACK TILL ALL STORED
21399: CSC XL COMPLETE STORE CHARACTERS
21400: *
21401: * COMMON EXIT POINT
21402: *
21403: TRIM5 ZER XL CLEAR GARBAGE XL POINTER
21404: EXI RETURN TO CALLER
21405: ENP END PROCEDURE TRIMR
21406: EJC
21407: *
21408: * TRXEQ -- EXECUTE FUNCTION TYPE TRACE
21409: *
21410: * TRXEQ IS USED TO EXECUTE A TRACE WHEN A FOURTH ARGUMENT
21411: * HAS BEEN SUPPLIED. TRACE HAS ALREADY BEEN DECREMENTED.
21412: *
21413: * (XR) POINTER TO TRBLK
21414: * (XL,WA) NAME BASE,OFFSET FOR VARIABLE
21415: * JSR TRXEQ CALL TO EXECUTE TRACE
21416: * (WB,WC,RA) DESTROYED
21417: *
21418: * THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING
21419: * CONTROL TO THE TRACE FUNCTION USING THE CFUNC ROUTINE.
21420: *
21421: * TRXEQ RETURN POINT WORD(S)
21422: * SAVED VALUE OF TRACE KEYWORD
21423: * TRBLK POINTER
21424: * NAME BASE
21425: * NAME OFFSET
21426: * SAVED VALUE OF R$COD
21427: * SAVED CODE PTR (-R$COD)
21428: * SAVED VALUE OF FLPTR
21429: * FLPTR --------------- ZERO (DUMMY FAIL OFFSET)
21430: * NMBLK FOR VARIABLE NAME
21431: * XS ------------------ TRACE TAG
21432: *
21433: * R$COD AND THE CODE PTR ARE SET TO DUMMY VALUES WHICH
21434: * CAUSE CONTROL TO RETURN TO THE TRXEQ PROCEDURE ON SUCCESS
21435: * OR FAILURE (TRXEQ IGNORES A FAILURE CONDITION).
21436: *
21437: TRXEQ PRC R,0 ENTRY POINT (RECURSIVE)
21438: MOV R$COD,WC LOAD CODE BLOCK POINTER
21439: SCP WB GET CURRENT CODE POINTER
21440: SUB WC,WB MAKE CODE POINTER INTO OFFSET
21441: MOV KVTRA,-(XS) STACK TRACE KEYWORD VALUE
21442: MOV XR,-(XS) STACK TRBLK POINTER
21443: MOV XL,-(XS) STACK NAME BASE
21444: MOV WA,-(XS) STACK NAME OFFSET
21445: MOV WC,-(XS) STACK CODE BLOCK POINTER
21446: MOV WB,-(XS) STACK CODE POINTER OFFSET
21447: MOV FLPTR,-(XS) STACK OLD FAILURE POINTER
21448: ZER -(XS) SET DUMMY FAIL OFFSET
21449: MOV XS,FLPTR SET NEW FAILURE POINTER
21450: ZER KVTRA RESET TRACE KEYWORD TO ZERO
21451: MOV =TRXDC,WC LOAD NEW (DUMMY) CODE BLK POINTER
21452: MOV WC,R$COD SET AS CODE BLOCK POINTER
21453: LCP WC AND NEW CODE POINTER
21454: EJC
21455: *
21456: * TRXEQ (CONTINUED)
21457: *
21458: * NOW PREPARE ARGUMENTS FOR FUNCTION
21459: *
21460: MOV WA,WB SAVE NAME OFFSET
21461: MOV *NMSI$,WA LOAD NMBLK SIZE
21462: JSR ALLOC ALLOCATE SPACE FOR NMBLK
21463: MOV =B$NML,(XR) SET TYPE WORD
21464: MOV XL,NMBAS(XR) STORE NAME BASE
21465: MOV WB,NMOFS(XR) STORE NAME OFFSET
21466: MOV 6(XS),XL RELOAD POINTER TO TRBLK
21467: MOV XR,-(XS) STACK NMBLK POINTER (1ST ARGUMENT)
21468: MOV TRTAG(XL),-(XS) STACK TRACE TAG (2ND ARGUMENT)
21469: MOV TRFNC(XL),XL LOAD TRACE FUNCTION POINTER
21470: MOV =NUM02,WA SET NUMBER OF ARGUMENTS TO TWO
21471: BRN CFUNC JUMP TO CALL FUNCTION
21472: *
21473: * SEE O$TXR FOR DETAILS OF RETURN TO THIS POINT
21474: *
21475: TRXQR MOV FLPTR,XS POINT BACK TO OUR STACK ENTRIES
21476: ICA XS POP OFF GARBAGE FAIL OFFSET
21477: MOV (XS)+,FLPTR RESTORE OLD FAILURE POINTER
21478: MOV (XS)+,WB RELOAD CODE OFFSET
21479: MOV (XS)+,WC LOAD OLD CODE BASE POINTER
21480: MOV WC,XR COPY CDBLK POINTER
21481: MOV CDSTM(XR),KVSTN RESTORE STMNT NO
21482: MOV (XS)+,WA RELOAD NAME OFFSET
21483: MOV (XS)+,XL RELOAD NAME BASE
21484: MOV (XS)+,XR RELOAD TRBLK POINTER
21485: MOV (XS)+,KVTRA RESTORE TRACE KEYWORD VALUE
21486: ADD WC,WB RECOMPUTE ABSOLUTE CODE POINTER
21487: LCP WB RESTORE CODE POINTER
21488: MOV WC,R$COD AND CODE BLOCK POINTER
21489: EXI RETURN TO TRXEQ CALLER
21490: ENP END PROCEDURE TRXEQ
21491: EJC
21492: *
21493: * XSCAN -- EXECUTION FUNCTION ARGUMENT SCAN
21494: *
21495: * XSCAN SCANS OUT ONE TOKEN IN A PROTOTYPE ARGUMENT IN
21496: * ARRAY,CLEAR,DATA,DEFINE,LOAD FUNCTION CALLS. XSCAN
21497: * CALLS MUST BE PRECEDED BY A CALL TO THE INITIALIZATION
21498: * PROCEDURE XSCNI. THE FOLLOWING VARIABLES ARE USED.
21499: *
21500: * R$XSC POINTER TO SCBLK FOR FUNCTION ARG
21501: * XSOFS OFFSET (NUM CHARS SCANNED SO FAR)
21502: *
21503: * (WC) DELIMITER ONE (CH$XX)
21504: * (XL) DELIMITER TWO (CH$XX)
21505: * JSR XSCAN CALL TO SCAN NEXT ITEM
21506: * (XR) POINTER TO SCBLK FOR TOKEN SCANNED
21507: * (WA) COMPLETION CODE (SEE BELOW)
21508: * (WC,XL) DESTROYED
21509: * (XSCNB) ERROR INDICATOR - SEE 4) BELOW
21510: *
21511: * LEADING BLANKS AND TRAILING BLANKS POSITIONED BEFORE A
21512: * DELIMITER OR AT THE END OF THE ARGUMENT STRING ARE
21513: * IGNORED. OTHER BLANKS ARE ILLEGAL.
21514: * THE SCAN STARTS FROM THE CURRENT POSITION AND CONTINUES
21515: * UNTIL ONE OF THE FOLLOWING CONDITIONS OCCURS.
21516: *
21517: * 1) DELIMITER ONE IS ENCOUNTERED (WA SET TO 1)
21518: *
21519: * 2) DELIMITER TWO ENCOUNTERED (WA SET TO 2)
21520: *
21521: * 3) END OF STRING ENCOUNTERED (WA AND XSCNB SET TO 0)
21522: *
21523: * 4) ILLEGAL BLANK (WA 0, XSCNB NON-ZERO)
21524: *
21525: * THE RESULT IS A STRING CONTAINING ALL CHARACTERS SCANNED
21526: * UP TO BUT NOT INCLUDING ANY DELIMITER CHARACTER.
21527: * THE POINTER IS LEFT POINTING PAST THE DELIMITER.
21528: *
21529: * IF ONLY ONE DELIMITER IS TO BE DETECTED, DELIMITER ONE
21530: * AND DELIMITER TWO SHOULD BE SET TO THE SAME VALUE.
21531: *
21532: * IN THE CASE WHERE THE END OF STRING IS ENCOUNTERED, THE
21533: * STRING INCLUDES ALL THE CHARACTERS TO THE END OF THE
21534: * STRING. NO FURTHER CALLS CAN BE MADE TO XSCAN UNTIL
21535: * XSCNI IS CALLED TO INITIALIZE A NEW ARGUMENT SCAN
21536: EJC
21537: *
21538: * XSCAN (CONTINUED)
21539: *
21540: XSCAN PRC E,0 ENTRY POINT
21541: MOV WB,XSCWB PRESERVE WB
21542: ZER XSCBL CLEAR COUNT OF TRAILING BLANKS
21543: ZER XSCNB CLEAR NON-BLANK SEEN FLAG
21544: MOV R$XSC,XR POINT TO ARGUMENT STRING
21545: MOV SCLEN(XR),WA LOAD STRING LENGTH
21546: MOV XSOFS,WB LOAD CURRENT OFFSET
21547: SUB WB,WA GET NUMBER OF REMAINING CHARACTERS
21548: BZE WA,XSCN2 JUMP IF NO CHARACTERS LEFT
21549: PLC XR,WB POINT TO CURRENT CHARACTER
21550: *
21551: * LOOP TO SEARCH FOR DELIMITER
21552: *
21553: XSCN0 LCH WB,(XR)+ LOAD NEXT CHARACTER
21554: BEQ WB,WC,XSCN3 JUMP IF DELIMITER ONE FOUND
21555: BEQ WB,XL,XSCN4 JUMP IF DELIMITER TWO FOUND
21556: BEQ WB,=CH$BL,XSCN7 SKIP IF IT IS A BLANK
21557: .IF .CAHT
21558: BEQ WB,=CH$HT,XSCN7 SKIP IF IT IS A TAB
21559: .FI
21560: BNZ XSCBL,XSCN2 FAIL CHAR AFTER TRAILING BLANK
21561: MNZ XSCNB NOTE A NON-BLANK SEEN
21562: *
21563: * COUNT CHARS DONE
21564: *
21565: XSCN1 DCV WA DECREMENT COUNT OF CHARS LEFT
21566: BNZ WA,XSCN0 LOOP BACK IF MORE CHARS TO GO
21567: ZER XSCNB CLEAR ERRONEOUS BLANKS FLAG
21568: *
21569: * HERE FOR RUNOUT
21570: *
21571: XSCN2 MOV R$XSC,XL POINT TO STRING BLOCK
21572: MOV SCLEN(XL),WA GET STRING LENGTH
21573: MOV XSOFS,WB LOAD OFFSET
21574: SUB WB,WA GET SUBSTRING LENGTH
21575: SUB XSCBL,WA ADJUST FOR TRAILING BLANKS
21576: ZER R$XSC CLEAR STRING PTR FOR COLLECTOR
21577: ZER XSCRT SET ZERO (RUNOUT) RETURN CODE
21578: BRN XSCN6 JUMP TO EXIT
21579: EJC
21580: *
21581: * XSCAN (CONTINUED)
21582: *
21583: * HERE IF DELIMITER ONE FOUND
21584: *
21585: XSCN3 MOV =NUM01,XSCRT SET RETURN CODE
21586: BRN XSCN5 JUMP TO MERGE
21587: *
21588: * HERE IF DELIMITER TWO FOUND
21589: *
21590: XSCN4 MOV =NUM02,XSCRT SET RETURN CODE
21591: *
21592: * MERGE HERE AFTER DETECTING A DELIMITER
21593: *
21594: XSCN5 MOV R$XSC,XL RELOAD POINTER TO STRING
21595: MOV SCLEN(XL),WC GET ORIGINAL LENGTH OF STRING
21596: SUB WA,WC MINUS CHARS LEFT = CHARS SCANNED
21597: MOV WC,WA MOVE TO REG FOR SBSTR
21598: SUB XSCBL,WA ADJUST FOR TRAILING BLANKS
21599: MOV XSOFS,WB SET OFFSET
21600: SUB WB,WA COMPUTE LENGTH FOR SBSTR
21601: ICV WC ADJUST NEW CURSOR PAST DELIMITER
21602: MOV WC,XSOFS STORE NEW OFFSET
21603: *
21604: * COMMON EXIT POINT
21605: *
21606: XSCN6 ZER XR CLEAR GARBAGE CHARACTER PTR IN XR
21607: .IF .CASL
21608: JSR SBSTG BUILD SUBSTRING
21609: .ELSE
21610: JSR SBSTR BUILD SUB-STRING
21611: .FI
21612: MOV XSCRT,WA LOAD RETURN CODE
21613: MOV XSCWB,WB RESTORE WB
21614: EXI RETURN TO XSCAN CALLER
21615: *
21616: * DEAL WITH BLANK
21617: *
21618: XSCN7 BZE XSCNB,XSCN8 SKIP IF LEADING BLANK
21619: ICV XSCBL ELSE COUNT TRAILING BLANK
21620: BRN XSCN1 LOOP
21621: *
21622: * LEADING BLANK
21623: *
21624: XSCN8 ICV XSOFS PUSH OFFSET PAST BLANK
21625: BRN XSCN1 LOOP
21626: ENP END PROCEDURE XSCAN
21627: EJC
21628: *
21629: * XSCNI -- EXECUTION FUNCTION ARGUMENT SCAN
21630: *
21631: * XSCNI INITIALIZES THE SCAN USED FOR PROTOTYPE ARGUMENTS
21632: * IN THE CLEAR, DEFINE, LOAD, DATA, ARRAY FUNCTIONS. SEE
21633: * XSCAN FOR THE PROCEDURE WHICH IS USED AFTER THIS CALL.
21634: *
21635: * -(XS) ARGUMENT TO BE SCANNED (ON STACK)
21636: * JSR XSCNI CALL TO SCAN ARGUMENT
21637: * PPM LOC TRANSFER LOC IF ARG IS NOT STRING
21638: * PPM LOC TRANSFER LOC IF ARGUMENT IS NULL
21639: * (XS) POPPED
21640: * (XR,R$XSC) ARGUMENT (SCBLK PTR)
21641: * (WA) ARGUMENT LENGTH
21642: * (IA,RA) DESTROYED
21643: *
21644: XSCNI PRC N,2 ENTRY POINT
21645: JSR GTSTG FETCH ARGUMENT AS STRING
21646: PPM XSCI1 JUMP IF NOT CONVERTIBLE
21647: MOV XR,R$XSC ELSE STORE SCBLK PTR FOR XSCAN
21648: ZER XSOFS SET OFFSET TO ZERO
21649: BZE WA,XSCI2 JUMP IF NULL STRING
21650: EXI RETURN TO XSCNI CALLER
21651: *
21652: * HERE IF ARGUMENT IS NOT A STRING
21653: *
21654: XSCI1 EXI 1 TAKE NOT-STRING ERROR EXIT
21655: *
21656: * HERE FOR NULL STRING
21657: *
21658: XSCI2 EXI 2 TAKE NULL-STRING ERROR EXIT
21659: ENP END PROCEDURE XSCNI
21660: TTL S P I T B O L -- UTILITY ROUTINES
21661: *
21662: * THE FOLLOWING SECTION CONTAINS UTILITY ROUTINES USED FOR
21663: * VARIOUS PURPOSES THROUGHOUT THE SYSTEM. THESE DIFFER
21664: * FROM THE PROCEDURES IN THE UTILITY PROCEDURES SECTION IN
21665: * THEY ARE NOT IN PROCEDURE FORM AND THEY DO NOT RETURN
21666: * TO THEIR CALLERS. THEY ARE ACCESSED WITH A BRANCH TYPE
21667: * INSTRUCTION AFTER SETTING THE REGISTERS TO APPROPRIATE
21668: * PARAMETER VALUES.
21669: *
21670: * THE REGISTER VALUES REQUIRED FOR EACH ROUTINE ARE
21671: * DOCUMENTED AT THE START OF EACH ROUTINE. REGISTERS NOT
21672: * MENTIONED MAY CONTAIN ANY VALUES EXCEPT THAT XR,XL
21673: * CAN ONLY CONTAIN PROPER COLLECTABLE POINTERS.
21674: *
21675: * SOME OF THESE ROUTINES WILL TOLERATE GARBAGE POINTERS
21676: * IN XL,XR ON ENTRY. THIS IS ALWAYS DOCUMENTED AND IN
21677: * EACH CASE, THE ROUTINE CLEARS THESE GARBAGE VALUES BEFORE
21678: * EXITING AFTER COMPLETING ITS TASK.
21679: *
21680: * THE ROUTINES HAVE NAMES CONSISTING OF FIVE LETTERS
21681: * AND ARE ASSEMBLED IN ALPHABETICAL ORDER.
21682: EJC
21683: * ARREF -- ARRAY REFERENCE
21684: *
21685: * (XL) MAY BE NON-COLLECTABLE
21686: * (XR) NUMBER OF SUBSCRIPTS
21687: * (WB) SET ZERO/NONZERO FOR VALUE/NAME
21688: * THE VALUE IN WB MUST BE COLLECTABLE
21689: * STACK SUBSCRIPTS AND ARRAY OPERAND
21690: * BRN ARREF JUMP TO CALL FUNCTION
21691: *
21692: * ARREF CONTINUES BY EXECUTING THE NEXT CODE WORD WITH
21693: * THE RESULT NAME OR VALUE PLACED ON TOP OF THE STACK.
21694: * TO DEAL WITH THE PROBLEM OF ACCESSING SUBSCRIPTS IN THE
21695: * ORDER OF STACKING, XL IS USED AS A SUBSCRIPT POINTER
21696: * WORKING BELOW THE STACK POINTER.
21697: *
21698: ARREF RTN
21699: MOV XR,WA COPY NUMBER OF SUBSCRIPTS
21700: MOV XS,XT POINT TO STACK FRONT
21701: WTB XR CONVERT TO BAU OFFSET
21702: ADD XR,XT POINT TO ARRAY OPERAND ON STACK
21703: ICA XT FINAL VALUE FOR STACK POPPING
21704: MOV XT,ARFXS KEEP FOR LATER
21705: MOV -(XT),XR LOAD ARRAY OPERAND POINTER
21706: MOV XR,R$ARF KEEP ARRAY POINTER
21707: MOV XT,XR SAVE POINTER TO SUBSCRIPTS
21708: MOV R$ARF,XL POINT XL TO POSSIBLE VCBLK OR TBBLK
21709: MOV (XL),WC LOAD FIRST WORD
21710: BEQ WC,=B$ART,ARF01 JUMP IF ARBLK
21711: BEQ WC,=B$VCT,ARF07 JUMP IF VCBLK
21712: BEQ WC,=B$TBT,ARF10 JUMP IF TBBLK
21713: ERB 240,SUBSCRIPTED OPERAND IS NOT TABLE OR ARRAY
21714: *
21715: * HERE FOR ARRAY (ARBLK)
21716: *
21717: ARF01 BNE WA,ARNDM(XL),ARF09 JUMP IF WRONG NUMBER OF DIMS
21718: LDI INTV0 GET INITIAL SUBSCRIPT OF ZERO
21719: MOV XR,XT POINT BEFORE SUBSCRIPTS
21720: ZER WA INITIAL OFFSET TO BOUNDS
21721: BRN ARF03 JUMP INTO LOOP
21722: *
21723: * LOOP TO COMPUTE SUBSCRIPTS BY MULTIPLICATIONS
21724: *
21725: ARF02 MLI ARDM2(XR) MULTIPLY TOTAL BY NEXT DIMENSION
21726: *
21727: * MERGE HERE FIRST TIME
21728: *
21729: ARF03 MOV -(XT),XR LOAD NEXT SUBSCRIPT
21730: STI ARFSI SAVE CURRENT SUBSCRIPT
21731: LDI ICVAL(XR) LOAD INTEGER VALUE IN CASE
21732: BEQ (XR),=B$ICL,ARF04 JUMP IF IT WAS AN INTEGER
21733: EJC
21734: *
21735: * ARREF (CONTINUED)
21736: *
21737: *
21738: JSR GTINT CONVERT TO INTEGER
21739: PPM ARF12 JUMP IF NOT INTEGER
21740: LDI ICVAL(XR) IF OK, LOAD INTEGER VALUE
21741: *
21742: * HERE WITH INTEGER SUBSCRIPT IN (IA)
21743: *
21744: ARF04 MOV R$ARF,XR POINT TO ARRAY
21745: ADD WA,XR OFFSET TO NEXT BOUNDS
21746: SBI ARLBD(XR) SUBTRACT LOW BOUND TO COMPARE
21747: IOV ARF13 OUT OF RANGE FAIL IF OVERFLOW
21748: ILT ARF13 OUT OF RANGE FAIL IF TOO SMALL
21749: SBI ARDIM(XR) SUBTRACT DIMENSION
21750: IGE ARF13 OUT OF RANGE FAIL IF TOO LARGE
21751: ADI ARDIM(XR) ELSE RESTORE SUBSCRIPT OFFSET
21752: ADI ARFSI ADD TO CURRENT TOTAL
21753: ADD *ARDMS,WA POINT TO NEXT BOUNDS
21754: BNE XT,XS,ARF02 LOOP BACK IF MORE TO GO
21755: *
21756: * HERE WITH INTEGER SUBSCRIPT COMPUTED
21757: *
21758: MFI WA GET AS ONE WORD INTEGER
21759: WTB WA CONVERT TO OFFSET
21760: MOV R$ARF,XL POINT TO ARBLK
21761: ADD AROFS(XL),WA ADD OFFSET PAST BOUNDS
21762: ICA WA ADJUST FOR ARPRO FIELD
21763: BNZ WB,ARF08 EXIT WITH NAME IF NAME CALL
21764: *
21765: * MERGE HERE TO GET VALUE FOR VALUE CALL
21766: *
21767: ARF05 JSR ACESS GET VALUE
21768: PPM ARF13 FAIL IF ACESS FAILS
21769: *
21770: * RETURN VALUE
21771: *
21772: ARF06 MOV ARFXS,XS POP STACK ENTRIES
21773: ZER R$ARF FINISHED WITH ARRAY POINTER
21774: BRN EXIXR EXIT WITH VALUE IN XR
21775: EJC
21776: *
21777: * ARREF (CONTINUED)
21778: *
21779: * HERE FOR VECTOR
21780: *
21781: ARF07 BNE WA,=NUM01,ARF09 ERROR IF MORE THAN 1 SUBSCRIPT
21782: MOV (XS),XR ELSE LOAD SUBSCRIPT
21783: JSR GTINT CONVERT TO INTEGER
21784: PPM ARF12 ERROR IF NOT INTEGER
21785: LDI ICVAL(XR) ELSE LOAD INTEGER VALUE
21786: SBI INTV1 SUBTRACT FOR ONES OFFSET
21787: MFI WA,ARF13 GET SUBSCRIPT AS ONE WORD
21788: ADD =VCVLS,WA ADD OFFSET FOR STANDARD FIELDS
21789: WTB WA CONVERT OFFSET TO BAUS
21790: BGE WA,VCLEN(XL),ARF13 FAIL IF OUT OF RANGE SUBSCRIPT
21791: BZE WB,ARF05 BACK TO GET VALUE IF VALUE CALL
21792: *
21793: * RETURN NAME
21794: *
21795: ARF08 MOV ARFXS,XS POP STACK ENTRIES
21796: ZER R$ARF FINISHED WITH ARRAY POINTER
21797: BRN EXNAM ELSE EXIT WITH NAME
21798: *
21799: * HERE IF SUBSCRIPT COUNT IS WRONG
21800: *
21801: ARF09 ERB 241,ARRAY REFERENCED WITH WRONG NUMBER OF SUBSCRIPTS
21802: *
21803: * TABLE
21804: *
21805: ARF10 BNE WA,=NUM01,ARF11 ERROR IF MORE THAN 1 SUBSCRIPT
21806: MOV (XS),XR ELSE LOAD SUBSCRIPT
21807: JSR TFIND CALL TABLE SEARCH ROUTINE
21808: PPM ARF13 FAIL IF FAILED
21809: BNZ WB,ARF08 EXIT WITH NAME IF NAME CALL
21810: BRN ARF06 ELSE EXIT WITH VALUE
21811: *
21812: * HERE FOR BAD TABLE REFERENCE
21813: *
21814: ARF11 ERB 242,TABLE REFERENCED WITH MORE THAN ONE SUBSCRIPT
21815: *
21816: * HERE FOR BAD SUBSCRIPT
21817: *
21818: ARF12 ERB 243,ARRAY SUBSCRIPT IS NOT INTEGER
21819: *
21820: * HERE TO SIGNAL FAILURE
21821: *
21822: ARF13 ZER R$ARF FINISHED WITH ARRAY POINTER
21823: BRN EXFAL FAIL
21824: EJC
21825: *
21826: * CFUNC -- CALL A FUNCTION
21827: *
21828: * CFUNC IS USED TO CALL A SNOBOL LEVEL FUNCTION. IT IS
21829: * USED BY THE APPLY FUNCTION (S$APP), THE FUNCTION
21830: * TRACE ROUTINE (TRXEQ) AND THE MAIN FUNCTION CALL ENTRY
21831: * (O$FNC, O$FNS). IN THE LATTER CASES, CFUNC IS USED ONLY
21832: * IF THE NUMBER OF ARGUMENTS IS INCORRECT.
21833: *
21834: * (XL) POINTER TO FUNCTION BLOCK
21835: * (WA) ACTUAL NUMBER OF ARGUMENTS
21836: * (XS) POINTS TO STACKED ARGUMENTS
21837: * BRN CFUNC JUMP TO CALL FUNCTION
21838: *
21839: * CFUNC CONTINUES BY EXECUTING THE FUNCTION
21840: *
21841: CFUNC RTN
21842: BLT WA,FARGS(XL),CFNC1 JUMP IF TOO FEW ARGUMENTS
21843: BEQ WA,FARGS(XL),CFNC3 JUMP IF CORRECT NUMBER OF ARGS
21844: *
21845: * HERE IF TOO MANY ARGUMENTS SUPPLIED, POP THEM OFF
21846: *
21847: MOV WA,WB COPY ACTUAL NUMBER
21848: SUB FARGS(XL),WB GET NUMBER OF EXTRA ARGS
21849: WTB WB CONVERT TO BAUS
21850: ADD WB,XS POP OFF UNWANTED ARGUMENTS
21851: BRN CFNC3 JUMP TO GO OFF TO FUNCTION
21852: *
21853: * HERE IF TOO FEW ARGUMENTS
21854: *
21855: CFNC1 MOV FARGS(XL),WB LOAD REQUIRED NUMBER OF ARGUMENTS
21856: BEQ WB,=NINI9,CFNC3 JUMP IF CASE OF VAR NUM OF ARGS
21857: SUB WA,WB CALCULATE NUMBER MISSING
21858: LCT WB,WB SET COUNTER TO CONTROL LOOP
21859: *
21860: * LOOP TO SUPPLY EXTRA NULL ARGUMENTS
21861: *
21862: CFNC2 MOV =NULLS,-(XS) STACK A NULL ARGUMENT
21863: BCT WB,CFNC2 LOOP TILL PROPER NUMBER STACKED
21864: *
21865: * MERGE HERE TO JUMP TO FUNCTION
21866: *
21867: CFNC3 BRI (XL) JUMP THROUGH FCODE FIELD
21868: EJC
21869: *
21870: * EROSI -- PROCESS ERROR RETURN FROM OSINT
21871: *
21872: * (WA) 0 OR ERROR CODE IN 256 TO 998
21873: * (XL) 0 OR PSEUDO SCBLK FOR ERROR MESSAGE
21874: * (IA) NEW VALUE FOR CODE KEYWORD
21875: * BRN EROSI JUMP TO PROCESS ERROR
21876: *
21877: EROSI RTN
21878: STI KVCOD STORE NEW CODE KEYWORD VALUE
21879: MOV WA,KVERT STORE ERROR CODE
21880: BZE XL,ERROR FAIL AT ONCE IF NO ERROR MSG TEXT
21881: MOV SCLEN(XL),WA STRING LENGTH
21882: ZER WB ZERO OFFSET
21883: JSR SBSTR COPY ERROR MESSAGE STRING
21884: MOV XR,R$ETX AND STORE IT
21885: MNZ EROSN NOTE NO CALL OF SYSEM
21886: MOV KVERT,WA RECALL ERROR CODE
21887: BRN ERROR ENTER ERROR SECTION
21888: *
21889: * EXFAL -- EXIT SIGNALLING SNOBOL FAILURE
21890: *
21891: * (XL,XR) MAY BE NON-COLLECTABLE
21892: * BRN EXFAL JUMP TO FAIL
21893: *
21894: * EXFAL CONTINUES BY EXECUTING THE APPROPRIATE FAIL GOTO
21895: *
21896: EXFAL RTN
21897: MOV FLPTR,XS POP STACK
21898: MOV (XS),XR LOAD FAILURE OFFSET
21899: ADD R$COD,XR POINT TO FAILURE CODE LOCATION
21900: LCP XR SET CODE POINTER
21901: BRN EXITS DO NEXT CODE WORD
21902: *
21903: * EXINT -- EXIT WITH INTEGER RESULT
21904: *
21905: * (XL,XR) MAY BE NONCOLLECTABLE
21906: * (IA) INTEGER VALUE
21907: * BRN EXINT JUMP TO EXIT WITH INTEGER
21908: *
21909: * EXINT CONTINUES BY EXECUTING THE NEXT CODE WORD
21910: * WHICH IT DOES BY FALLING THROUGH TO EXIXR
21911: *
21912: EXINT RTN
21913: JSR ICBLD BUILD ICBLK
21914: EJC
21915: * EXIXR -- EXIT WITH RESULT IN (XR)
21916: *
21917: * (XR) RESULT
21918: * (XL) MAY BE NON-COLLECTABLE
21919: * BRN EXIXR JUMP TO EXIT WITH RESULT IN (XR)
21920: *
21921: * EXIXR CONTINUES BY EXECUTING THE NEXT CODE WORD
21922: * WHICH IT DOES BY FALLING THROUGH TO EXITS.
21923: EXIXR RTN
21924: *
21925: MOV XR,-(XS) STACK RESULT
21926: *
21927: *
21928: * EXITS -- EXIT WITH RESULT IF ANY STACKED
21929: *
21930: * (XR,XL) MAY BE NON-COLLECTABLE
21931: *
21932: * BRN EXITS ENTER EXITS ROUTINE
21933: *
21934: EXITS RTN
21935: LCW XR LOAD NEXT CODE WORD
21936: MOV (XR),XL LOAD ENTRY ADDRESS
21937: BRI XL JUMP TO EXECUTE NEXT CODE WORD
21938: *
21939: * EXNAM -- EXIT WITH NAME IN (XL,WA)
21940: *
21941: * (XL) NAME BASE
21942: * (WA) NAME OFFSET
21943: * (XR) MAY BE NON-COLLECTABLE
21944: * BRN EXNAM JUMP TO EXIT WITH NAME IN (XL,WA)
21945: *
21946: * EXNAM CONTINUES BY EXECUTING THE NEXT CODE WORD
21947: *
21948: EXNAM RTN
21949: MOV XL,-(XS) STACK NAME BASE
21950: MOV WA,-(XS) STACK NAME OFFSET
21951: BRN EXITS DO NEXT CODE WORD
21952: EJC
21953: *
21954: * EXNUL -- EXIT WITH NULL RESULT
21955: *
21956: * (XL,XR) MAY BE NON-COLLECTABLE
21957: * BRN EXNUL JUMP TO EXIT WITH NULL VALUE
21958: *
21959: * EXNUL CONTINUES BY EXECUTING THE NEXT CODE WORD
21960: *
21961: EXNUL RTN
21962: MOV =NULLS,-(XS) STACK NULL VALUE
21963: BRN EXITS DO NEXT CODE WORD
21964: .IF .CNRA
21965: .ELSE
21966: *
21967: * EXREA -- EXIT WITH REAL RESULT
21968: *
21969: * (XL,XR) MAY BE NON-COLLECTABLE
21970: * (RA) REAL VALUE
21971: * BRN EXREA JUMP TO EXIT WITH REAL VALUE
21972: *
21973: * EXREA CONTINUES BY EXECUTING THE NEXT CODE WORD
21974: *
21975: EXREA RTN
21976: JSR RCBLD BUILD RCBLK
21977: BRN EXIXR JUMP TO EXIT WITH RESULT IN XR
21978: .FI
21979: *
21980: * EXSID -- EXIT SETTING ID FIELD
21981: *
21982: * EXSID IS USED TO EXIT AFTER BUILDING ANY OF THE FOLLOWING
21983: * BLOCKS (ARBLK, TBBLK, PDBLK, VCBLK). IT SETS THE IDVAL.
21984: *
21985: * (XR) PTR TO BLOCK WITH IDVAL FIELD
21986: * (XL) MAY BE NON-COLLECTABLE
21987: * BRN EXSID JUMP TO EXIT AFTER SETTING ID FIELD
21988: *
21989: * EXSID CONTINUES BY EXECUTING THE NEXT CODE WORD
21990: *
21991: EXSID RTN
21992: MOV CURID,WA LOAD CURRENT ID VALUE
21993: BNE WA,=CFP$M,EXSI1 JUMP IF NO OVERFLOW
21994: ZER WA ELSE RESET FOR WRAPAROUND
21995: *
21996: * HERE WITH OLD IDVAL IN WA
21997: *
21998: EXSI1 ICV WA BUMP ID VALUE
21999: MOV WA,CURID STORE FOR NEXT TIME
22000: MOV WA,IDVAL(XR) STORE ID VALUE
22001: BRN EXIXR EXIT WITH RESULT IN (XR)
22002: EJC
22003: *
22004: * EXVNM -- EXIT WITH NAME OF VARIABLE
22005: *
22006: * EXVNM EXITS AFTER STACKING A VALUE WHICH IS A NMBLK
22007: * REFERENCING THE NAME OF A GIVEN NATURAL VARIABLE.
22008: *
22009: * (XR) VRBLK POINTER
22010: * (XL) MAY BE NON-COLLECTABLE
22011: * BRN EXVNM EXIT WITH VRBLK POINTER IN XR
22012: *
22013: EXVNM RTN
22014: MOV XR,XL COPY NAME BASE POINTER
22015: MOV *NMSI$,WA SET SIZE OF NMBLK
22016: JSR ALLOC ALLOCATE NMBLK
22017: MOV =B$NML,(XR) STORE TYPE WORD
22018: MOV XL,NMBAS(XR) STORE NAME BASE
22019: MOV *VRVAL,NMOFS(XR) STORE NAME OFFSET
22020: BRN EXIXR EXIT WITH RESULT IN XR
22021: *
22022: * FLPOP -- FAIL AND POP IN PATTERN MATCHING
22023: *
22024: * FLPOP POPS THE NODE AND CURSOR ON THE STACK AND THEN
22025: * DROPS THROUGH INTO FAILP TO CAUSE PATTERN FAILURE
22026: *
22027: * (XL,XR) MAY BE NON-COLLECTABLE
22028: * BRN FLPOP JUMP TO FAIL AND POP STACK
22029: *
22030: FLPOP RTN
22031: ADD *NUM02,XS POP TWO ENTRIES OFF STACK
22032: *
22033: * FAILP -- FAILURE IN MATCHING PATTERN NODE
22034: *
22035: * FAILP IS USED AFTER FAILING TO MATCH A PATTERN NODE.
22036: * SEE PATTERN MATCH ROUTINES FOR DETAILS OF USE.
22037: *
22038: * (XL,XR) MAY BE NON-COLLECTABLE
22039: * BRN FAILP SIGNAL FAILURE TO MATCH
22040: *
22041: * FAILP CONTINUES BY MATCHING AN ALTERNATIVE FROM THE STACK
22042: *
22043: FAILP RTN
22044: MOV (XS)+,XR LOAD ALTERNATIVE NODE POINTER
22045: MOV (XS)+,WB RESTORE OLD CURSOR
22046: MOV (XR),XL LOAD PCODE ENTRY POINTER
22047: BRI XL JUMP TO EXECUTE CODE FOR NODE
22048: EJC
22049: *
22050: * INDIR -- COMPUTE INDIRECT REFERENCE
22051: *
22052: * (WB) NONZERO/ZERO FOR BY NAME/VALUE
22053: * BRN INDIR JUMP TO GET INDIRECT REF ON STACK
22054: *
22055: * INDIR CONTINUES BY EXECUTING THE NEXT CODE WORD
22056: *
22057: INDIR RTN
22058: MOV (XS)+,XR LOAD ARGUMENT
22059: BEQ (XR),=B$NML,INDR2 JUMP IF A NAME
22060: JSR GTNVR ELSE CONVERT TO VARIABLE
22061: ERR 244,INDIRECTION OPERAND IS NOT NAME
22062: BZE WB,INDR1 SKIP IF BY VALUE
22063: MOV XR,-(XS) ELSE STACK VRBLK PTR
22064: MOV *VRVAL,-(XS) STACK NAME OFFSET
22065: BRN EXITS EXIT WITH RESULT ON STACK
22066: *
22067: * HERE TO GET VALUE OF NATURAL VARIABLE
22068: *
22069: INDR1 BRI (XR) JUMP THROUGH VRGET FIELD OF VRBLK
22070: *
22071: * HERE IF OPERAND IS A NAME
22072: *
22073: INDR2 MOV NMBAS(XR),XL LOAD NAME BASE
22074: MOV NMOFS(XR),WA LOAD NAME OFFSET
22075: BNZ WB,EXNAM EXIT IF CALLED BY NAME
22076: JSR ACESS ELSE GET VALUE FIRST
22077: PPM EXFAL FAIL IF ACCESS FAILS
22078: BRN EXIXR ELSE RETURN WITH VALUE IN XR
22079: EJC
22080: *
22081: * MATCH -- INITIATE PATTERN MATCH
22082: *
22083: * (WB) MATCH TYPE CODE
22084: * BRN MATCH JUMP TO INITIATE PATTERN MATCH
22085: *
22086: * MATCH CONTINUES BY EXECUTING THE PATTERN MATCH. SEE
22087: * PATTERN MATCH ROUTINES (P$XXX) FOR FULL DETAILS.
22088: *
22089: MATCH RTN
22090: MOV (XS)+,XR LOAD PATTERN OPERAND
22091: JSR GTPAT CONVERT TO PATTERN
22092: ERR 245,PATTERN MATCH RIGHT OPERAND IS NOT PATTERN
22093: MOV XR,XL IF OK, SAVE PATTERN POINTER
22094: BNZ WB,MTCH1 JUMP IF NOT MATCH BY NAME
22095: MOV (XS),WA ELSE LOAD NAME OFFSET
22096: MOV XL,-(XS) SAVE PATTERN POINTER
22097: MOV 2(XS),XL LOAD NAME BASE
22098: JSR ACESS ACCESS SUBJECT VALUE
22099: PPM EXFAL FAIL IF ACCESS FAILS
22100: MOV (XS),XL RESTORE PATTERN POINTER
22101: MOV XR,(XS) STACK SUBJECT STRING VAL FOR MERGE
22102: ZER WB RESTORE TYPE CODE
22103: *
22104: * MERGE HERE WITH SUBJECT VALUE ON STACK
22105: *
22106: .IF .CNBF
22107: MTCH1 JSR GTSTG CONVERT SUBJECT TO STRING
22108: .ELSE
22109: MTCH1 MOV (XS),XR LOAD SUBJECT VALUE
22110: ZER R$PMB ASSUME NOT A BUFFER
22111: BNE (XR),=B$BCT,MTCHA BRANCH IF NOT
22112: ICA XS ELSE POP VALUE
22113: MOV XR,R$PMB SAVE POINTER
22114: MOV BCLEN(XR),WA GET DEFINED LENGTH
22115: MOV BCBUF(XR),XR POINT TO BFBLK
22116: BRN MTCHB
22117: *
22118: * HERE IF NOT BUFFER TO CONVERT TO STRING
22119: *
22120: MTCHA JSR GTSTG NOT BUFFER - CONVERT TO STRING
22121: .FI
22122: ERR 246,PATTERN MATCH LEFT OPERAND IS NOT STRING
22123: .IF .CNBF
22124: MOV XR,R$PMS IF OK, STORE SUBJECT STRING POINTER
22125: .ELSE
22126: *
22127: * MERGE WITH NULL STRING OR BUFFER
22128: *
22129: MTCHB MOV XR,R$PMS IF OK, STORE SUBJECT STRING POINTER
22130: .FI
22131: MOV WA,PMSSL AND LENGTH
22132: MOV WB,-(XS) STACK MATCH TYPE CODE
22133: ZER -(XS) STACK INITIAL CURSOR (ZERO)
22134: ZER WB SET INITIAL CURSOR
22135: MOV XS,PMHBS SET HISTORY STACK BASE PTR
22136: ZER PMDFL RESET PATTERN ASSIGNMENT FLAG
22137: MOV XL,XR SET INITIAL NODE POINTER
22138: BNZ KVANC,MTCH2 JUMP IF ANCHORED
22139: EJC
22140: *
22141: * MATCH (CONTINUED)
22142: *
22143: * HERE FOR UNANCHORED
22144: *
22145: MOV XR,-(XS) STACK INITIAL NODE POINTER
22146: MOV =NDUNA,-(XS) STACK POINTER TO ANCHOR MOVE NODE
22147: BRI (XR) START MATCH OF FIRST NODE
22148: *
22149: * HERE IN ANCHORED MODE
22150: *
22151: MTCH2 ZER -(XS) DUMMY CURSOR VALUE
22152: MOV =NDABO,-(XS) STACK POINTER TO ABORT NODE
22153: BRI (XR) START MATCH OF FIRST NODE
22154: EJC
22155: *
22156: * RETRN -- RETURN FROM FUNCTION
22157: *
22158: * (WA) STRING POINTER FOR RETURN TYPE
22159: * BRN RETRN JUMP TO RETURN FROM (SNOBOL) FUNC
22160: *
22161: * RETRN CONTINUES BY EXECUTING THE CODE AT THE RETURN POINT
22162: * THE STACK IS CLEANED OF ANY GARBAGE LEFT BY OTHER
22163: * ROUTINES WHICH MAY HAVE ALTERED FLPTR SINCE FUNCTION
22164: * ENTRY BY USING FLPRT, RESERVED FOR USE ONLY BY
22165: * FUNCTION CALL AND RETURN.
22166: *
22167: RETRN RTN
22168: BNZ KVFNC,RTN01 JUMP IF NOT LEVEL ZERO
22169: ERB 247,FUNCTION RETURN FROM LEVEL ZERO
22170: *
22171: * HERE IF NOT LEVEL ZERO RETURN
22172: *
22173: RTN01 MOV FLPRT,XS POP STACK
22174: ICA XS REMOVE FAILURE OFFSET
22175: MOV (XS)+,XR POP PFBLK POINTER
22176: MOV (XS)+,FLPTR POP FAILURE POINTER
22177: MOV (XS)+,FLPRT POP OLD FLPRT
22178: MOV (XS)+,WB POP CODE POINTER OFFSET
22179: MOV (XS)+,WC POP OLD CODE BLOCK POINTER
22180: ADD WC,WB MAKE OLD CODE POINTER ABSOLUTE
22181: LCP WB RESTORE OLD CODE POINTER
22182: MOV WC,R$COD RESTORE OLD CODE BLOCK POINTER
22183: DCV KVFNC DECREMENT FUNCTION LEVEL
22184: MOV KVTRA,WB LOAD TRACE
22185: ADD KVFTR,WB ADD FTRACE
22186: BZE WB,RTN06 JUMP IF NO TRACING POSSIBLE
22187: *
22188: * HERE IF THERE MAY BE A TRACE
22189: *
22190: MOV WA,-(XS) SAVE FUNCTION RETURN TYPE
22191: MOV XR,-(XS) SAVE PFBLK POINTER
22192: MOV WA,KVRTN SET RTNTYPE FOR TRACE FUNCTION
22193: MOV R$FNC,XL LOAD FNCLEVEL TRBLK PTR (IF ANY)
22194: JSR KTREX EXECUTE POSSIBLE FNCLEVEL TRACE
22195: MOV PFVBL(XR),XL LOAD VRBLK POINTER
22196: BZE KVTRA,RTN02 JUMP IF TRACE IS OFF
22197: MOV PFRTR(XR),XR ELSE LOAD RETURN TRACE TRBLK PTR
22198: BZE XR,RTN02 JUMP IF NOT RETURN TRACED
22199: DCV KVTRA ELSE DECREMENT TRACE COUNT
22200: BZE TRFNC(XR),RTN03 JUMP IF PRINT TRACE
22201: MOV *VRVAL,WA ELSE SET NAME OFFSET
22202: MOV 1(XS),KVRTN MAKE SURE RTNTYPE IS SET RIGHT
22203: JSR TRXEQ EXECUTE FULL TRACE
22204: EJC
22205: *
22206: * RETRN (CONTINUED)
22207: *
22208: * HERE TO TEST FOR FTRACE
22209: *
22210: RTN02 BZE KVFTR,RTN05 JUMP IF FTRACE IS OFF
22211: DCV KVFTR ELSE DECREMENT FTRACE
22212: *
22213: * HERE FOR PRINT TRACE OF FUNCTION RETURN
22214: *
22215: RTN03 JSR PRTSN PRINT STATEMENT NUMBER
22216: MOV 1(XS),XR LOAD RETURN TYPE
22217: JSR PRTST PRINT IT
22218: MOV =CH$BL,WA LOAD BLANK
22219: JSR PRTCH PRINT IT
22220: MOV 0(XS),XL LOAD PFBLK PTR
22221: MOV PFVBL(XL),XL LOAD FUNCTION VRBLK PTR
22222: MOV *VRVAL,WA SET VRBLK NAME OFFSET
22223: BNE XR,=SCFRT,RTN04 JUMP IF NOT FRETURN CASE
22224: *
22225: * FOR FRETURN, JUST PRINT FUNCTION NAME
22226: *
22227: JSR PRTNM PRINT NAME
22228: JSR PRTFH TERMINATE PRINT LINE
22229: BRN RTN05 MERGE
22230: *
22231: * HERE FOR RETURN OR NRETURN, PRINT FUNCTION NAME = VALUE
22232: *
22233: RTN04 JSR PRTNV PRINT NAME = VALUE
22234: *
22235: * HERE AFTER COMPLETING TRACE
22236: *
22237: RTN05 MOV (XS)+,XR POP PFBLK POINTER
22238: MOV (XS)+,WA POP RETURN TYPE STRING
22239: *
22240: * MERGE HERE IF NO TRACE REQUIRED
22241: *
22242: RTN06 MOV WA,KVRTN SET RTNTYPE KEYWORD
22243: MOV PFVBL(XR),XL LOAD POINTER TO FN VRBLK
22244: EJC
22245: * RETRN (CONTINUED)
22246: *
22247: * GET VALUE OF FUNCTION
22248: *
22249: RTN07 MOV XL,RTNBP SAVE BLOCK POINTER
22250: MOV VRVAL(XL),XL LOAD VALUE
22251: BEQ (XL),=B$TRT,RTN07 LOOP BACK IF TRAPPED
22252: MOV XL,RTNFV ELSE SAVE FUNCTION RESULT VALUE
22253: MOV (XS)+,RTNSV SAVE ORIGINAL FUNCTION VALUE
22254: .IF .CNPF
22255: MOV FARGS(XR),WB GET NUMBER OF ARGUMENTS
22256: .ELSE
22257: MOV (XS)+,XL POP SAVED POINTER
22258: BZE XL,RTN7C NO ACTION IF NONE
22259: BZE KVPFL,RTN7C JUMP IF NO PROFILING
22260: JSR PRFLU ELSE PROFILE LAST FUNC STMT
22261: BEQ KVPFL,=NUM02,RTN7A BRANCH ON VALUE OF PROFILE KEYWD
22262: *
22263: * HERE IF PROFILE = 1. START TIME MUST BE FRIGGED TO
22264: * APPEAR EARLIER THAN IT ACTUALLY IS, BY AMOUNT USED BEFORE
22265: * THE CALL.
22266: *
22267: LDI PFSTM LOAD CURRENT TIME
22268: SBI ICVAL(XL) FRIG BY SUBTRACTING SAVED AMOUNT
22269: BRN RTN7B AND MERGE
22270: *
22271: * HERE IF PROFILE = 2
22272: *
22273: RTN7A LDI ICVAL(XL) LOAD SAVED TIME
22274: *
22275: * BOTH PROFILE TYPES MERGE HERE
22276: *
22277: RTN7B STI PFSTM STORE BACK CORRECT START TIME
22278: *
22279: * MERGE HERE IF NO PROFILING
22280: *
22281: RTN7C MOV FARGS(XR),WB GET NUMBER OF ARGS
22282: .FI
22283: ADD PFNLO(XR),WB ADD NUMBER OF LOCALS
22284: BZE WB,RTN10 JUMP IF NO ARGS/LOCALS
22285: LCT WB,WB ELSE SET LOOP COUNTER
22286: ADD PFLEN(XR),XR AND POINT TO END OF PFBLK
22287: *
22288: * LOOP TO RESTORE FUNCTIONS AND LOCALS
22289: *
22290: RTN08 MOV -(XR),XL LOAD NEXT VRBLK POINTER
22291: *
22292: * LOOP TO FIND VALUE BLOCK
22293: *
22294: RTN09 MOV XL,WA SAVE BLOCK POINTER
22295: MOV VRVAL(XL),XL LOAD POINTER TO NEXT VALUE
22296: BEQ (XL),=B$TRT,RTN09 LOOP BACK IF TRAPPED
22297: MOV WA,XL ELSE RESTORE LAST BLOCK POINTER
22298: MOV (XS)+,VRVAL(XL) RESTORE OLD VARIABLE VALUE
22299: BCT WB,RTN08 LOOP TILL ALL PROCESSED
22300: EJC
22301: *
22302: * RETRN (CONTINUED)
22303: *
22304: * NOW RESTORE FUNCTION VALUE AND EXIT
22305: *
22306: RTN10 MOV RTNBP,XL RESTORE PTR TO LAST FUNCTION BLOCK
22307: MOV RTNSV,VRVAL(XL) RESTORE OLD FUNCTION VALUE
22308: MOV RTNFV,XR RELOAD FUNCTION RESULT
22309: MOV R$COD,XL POINT TO NEW CODE BLOCK
22310: MOV KVSTN,KVLST SET LASTNO FROM STNO
22311: MOV CDSTM(XL),KVSTN RESET PROPER STNO VALUE
22312: MOV KVRTN,WA LOAD RETURN TYPE
22313: BEQ WA,=SCRTN,EXIXR EXIT WITH RESULT IN XR IF RETURN
22314: BEQ WA,=SCFRT,EXFAL FAIL IF FRETURN
22315: *
22316: * HERE FOR NRETURN
22317: *
22318: BEQ (XR),=B$NML,RTN11 JUMP IF IS A NAME
22319: JSR GTNVR ELSE TRY CONVERT TO VARIABLE NAME
22320: ERR 248,FUNCTION RESULT IN NRETURN IS NOT NAME
22321: MOV XR,XL IF OK, COPY VRBLK (NAME BASE) PTR
22322: MOV *VRVAL,WA SET NAME OFFSET
22323: BRN RTN12 AND MERGE
22324: *
22325: * HERE IF RETURNED RESULT IS A NAME
22326: *
22327: RTN11 MOV NMBAS(XR),XL LOAD NAME BASE
22328: MOV NMOFS(XR),WA LOAD NAME OFFSET
22329: *
22330: * MERGE HERE WITH RETURNED NAME IN (XL,WA)
22331: *
22332: RTN12 MOV XL,XR PRESERVE XL
22333: LCW WB LOAD NEXT WORD
22334: MOV XR,XL RESTORE XL
22335: BEQ WB,=OFNE$,EXNAM EXIT IF CALLED BY NAME
22336: MOV WB,-(XS) ELSE SAVE CODE WORD
22337: JSR ACESS GET VALUE
22338: PPM EXFAL FAIL IF ACCESS FAILS
22339: MOV XR,XL IF OK, COPY RESULT
22340: MOV (XS),XR RELOAD NEXT CODE WORD
22341: MOV XL,(XS) STORE RESULT ON STACK
22342: MOV (XR),XL LOAD ROUTINE ADDRESS
22343: BRI XL JUMP TO EXECUTE NEXT CODE WORD
22344: EJC
22345: *
22346: * STCOV -- SIGNAL STATEMENT COUNTER OVERFLOW
22347: *
22348: * BRN STCOV JUMP TO SIGNAL STATEMENT COUNT OFLO
22349: *
22350: * PERMIT UP TO 10 MORE STATEMENTS TO BE OBEYED SO THAT
22351: * SETEXIT TRAP CAN REGAIN CONTROL.
22352: * STCOV CONTINUES BY ISSUING THE ERROR MESSAGE
22353: *
22354: STCOV RTN
22355: ICV ERRFT FATAL ERROR
22356: LDI INTVT GET 10
22357: ADI KVSTL ADD TO FORMER LIMIT
22358: STI KVSTL STORE AS NEW STLIMIT
22359: LDI INTVT GET 10
22360: STI KVSTC SET AS NEW COUNT
22361: ERB 249,STATEMENT COUNT EXCEEDS VALUE OF STLIMIT KEYWORD
22362: EJC
22363: *
22364: * STMGO -- START EXECUTION OF NEW STATEMENT
22365: *
22366: * (XR) POINTER TO CDBLK FOR NEW STATEMENT
22367: * BRN STMGO JUMP TO EXECUTE NEW STATEMENT
22368: *
22369: * STMGO CONTINUES BY EXECUTING THE NEXT STATEMENT
22370: *
22371: STMGO RTN
22372: MOV XR,R$COD SET NEW CODE BLOCK POINTER
22373: .IF .CNPF
22374: MOV KVSTN,KVLST SET LASTNO
22375: .ELSE
22376: BZE KVPFL,STGO1 SKIP IF NO PROFILING
22377: JSR PRFLU ELSE PROFILE THE STATEMENT
22378: *
22379: * MERGE PROFILE, NO-PROFILE CASES
22380: *
22381: STGO1 MOV KVSTN,KVLST SET LASTNO
22382: .FI
22383: MOV CDSTM(XR),KVSTN SET STNO
22384: ADD *CDCOD,XR POINT TO FIRST CODE WORD
22385: LCP XR SET CODE POINTER
22386: LDI KVSTC GET STMT COUNT
22387: ILT EXITS OMIT COUNTING IF NEGATIVE
22388: IEQ STCOV FAIL IF STLIMIT REACHED
22389: SBI INTV1 DECREMENT
22390: STI KVSTC REPLACE IT
22391: BZE R$STC,EXITS EXIT IF NO STCOUNT TRACE
22392: *
22393: * HERE FOR STCOUNT TRACE
22394: *
22395: ZER XR CLEAR GARBAGE VALUE IN XR
22396: MOV R$STC,XL LOAD POINTER TO STCOUNT TRBLK
22397: JSR KTREX EXECUTE KEYWORD TRACE
22398: BRN EXITS AND THEN EXIT FOR NEXT CODE WORD
22399: EJC
22400: *
22401: * STOPR -- TERMINATE RUN
22402: *
22403: * (WA) 0 OR ERROR MESSAGE CODE
22404: * (XR) 0 OR ENDING MESSAGE POINTER
22405: * BRN STOPR JUMP TO TERMINATE RUN
22406: *
22407: * TERMINATE RUN AND PRINT STATISTICS. ON ENTRY XR POINTS
22408: * TO ENDING MESSAGE OR IS ZERO IF MESSAGE PRINTED ALREADY.
22409: * (WA) AND (XR) ARE BOTH NON-ZERO ONLY IN THE CASE OF FATAL
22410: * ERRORS DURING INITIAL COMPILE.
22411: *
22412: STOPR RTN
22413: .IF .CSAX
22414: JSR SYSAX CALL AFTER EXECUTION PROC
22415: .ELSE
22416: .FI
22417: ADD RSMEM,DNAME USE THE RESERVE MEMORY
22418: BZE WA,STPR1 SKIP IF NO ERROR MESSAGE
22419: MOV XR,STPXR KEEP 0 OR ENDING MESSAGE
22420: MOV TTERL,TTLST SEND ERROR AND STATS TO TERML
22421: JSR PRTPG PAGE THROW
22422: JSR ERMSG PRINT ERROR MESSAGE
22423: MOV STPXR,XR RECOVER 0 OR ENDING MESSAGE
22424: ZER EXSTS TO FORCE ENDING STATS OUT FOR ERROR
22425: *
22426: * PROCESS ENDING STATISTICS
22427: *
22428: STPR1 MTI KVSTN GET STATEMENT NUMBER
22429: IEQ STPR6 SKIP IF COMPILE TIME
22430: BNZ EXSTS,STPR4 SKIP IF NO STATS TO BE PRINTED
22431: JSR PRTPG EJECT PRINTER
22432: BZE XR,STPR2 SKIP IF NO MESSAGE
22433: JSR PRTFB PRINT MESSAGE
22434: *
22435: * MERGE HERE IF NO MESSAGE TO PRINT
22436: *
22437: STPR2 JSR PRTFH PRINT BLANK LINE
22438: MOV =STPM1,XR POINT TO MESSAGE /IN STATEMENT XXX/
22439: JSR PRTMI PRINT IT
22440: JSR SYSTM GET CURRENT TIME
22441: SBI TIMSX MINUS START TIME = ELAPSED EXEC TIM
22442: STI STPTI SAVE FOR LATER
22443: MOV =STPM3,XR POINT TO MSG /EXECUTION TIME MSEC /
22444: JSR PRTMI PRINT IT
22445: LDI KVSTL GET STATEMENT LIMIT
22446: ILT STPR3 SKIP IF NEGATIVE
22447: SBI KVSTC MINUS COUNTER = COUNT
22448: STI STPSI SAVE
22449: MOV =STPM2,XR POINT TO MESSAGE /STMTS EXECUTED/
22450: JSR PRTMI PRINT IT
22451: .IF .CTMD
22452: .ELSE
22453: LDI STPTI RELOAD ELAPSED TIME
22454: MLI INTTH *1000 (MICROSECS)
22455: IOV STPR3 JUMP IF WE CANNOT COMPUTE
22456: DVI STPSI DIVIDE BY STATEMENT COUNT
22457: IOV STPR3 JUMP IF OVERFLOW
22458: MOV =STPM4,XR POINT TO MSG (MCSEC PER STATEMENT /
22459: JSR PRTMI PRINT IT
22460: .FI
22461: EJC
22462: *
22463: * STOPR (CONTINUED)
22464: *
22465: * MERGE TO SKIP MESSAGE (OVERFLOW OR NEGATIVE STLIMIT)
22466: *
22467: STPR3 MTI GBCNT LOAD COUNT OF COLLECTIONS
22468: MOV =STPM5,XR POINT TO MESSAGE /REGENERATIONS /
22469: JSR PRTMI PRINT IT
22470: JSR PRTFH ONE MORE BLANK FOR LUCK
22471: *
22472: * CHECK IF DUMP REQUESTED
22473: *
22474: .IF .CNPF
22475: STPR4 MOV KVDMP,XR LOAD DUMP KEYWORD
22476: .ELSE
22477: STPR4 JSR PRFLR PRINT PROFILE IF WANTED
22478: MOV KVDMP,XR LOAD DUMP KEYWORD
22479: .FI
22480: JSR DUMPR EXECUTE DUMP IF REQUESTED
22481: *
22482: * MERGE TO END RUN FOR SEVERE COMPILATION ERRORS
22483: *
22484: STPR5 MOV =KVCOD,WA LOAD CODE VALUE
22485: JSR SYSEJ EXIT TO SYSTEM
22486: *
22487: * TERMINATION DURING COMPILE
22488: *
22489: STPR6 BZE XR,STPR7 SKIP IF NO MESSAGE
22490: JSR PRTSF ELSE PRINT IT
22491: *
22492: * NOTIFICATION THAT IT IS COMPILE TIME
22493: *
22494: STPR7 MOV =ENDIC,XR NOTIFY USER
22495: JSR PRTSF SEND IT
22496: BRN STPR5 END
22497: EJC
22498: *
22499: * SUCCP -- SIGNAL SUCCESSFUL MATCH OF A PATTERN NODE
22500: *
22501: * SEE PATTERN MATCH ROUTINES FOR DETAILS
22502: *
22503: * (XR) CURRENT NODE
22504: * (WB) CURRENT CURSOR
22505: * (XL) MAY BE NON-COLLECTABLE
22506: * BRN SUCCP SIGNAL SUCCESSFUL PATTERN MATCH
22507: *
22508: * SUCCP CONTINUES BY MATCHING THE SUCCESSOR NODE
22509: *
22510: SUCCP RTN
22511: MOV PTHEN(XR),XR LOAD SUCCESSOR NODE
22512: MOV (XR),XL LOAD NODE CODE ENTRY ADDRESS
22513: BRI XL JUMP TO MATCH SUCCESSOR NODE
22514: TTL S P I T B O L -- STACK OVERFLOW SECTION
22515: *
22516: * CONTROL COMES HERE IF THE MAIN STACK OVERFLOWS
22517: *
22518: SEC START OF STACK OVERFLOW SECTION
22519: *
22520: STAKV RTN ENTRY POINT FOR STACK OVERFLOW
22521: ICV ERRFT FATAL ERROR
22522: MOV FLPTR,XS POP STACK TO AVOID MORE FAILS
22523: BNZ GBCFL,STAK1 JUMP IF GARBAGE COLLECTING
22524: ERB 250,STACK OVERFLOW
22525: *
22526: * NO CHANCE OF RECOVERY IN MID GARBAGE COLLECTION
22527: *
22528: STAK1 MOV =ENDSO,XR POINT TO MESSAGE
22529: ZER KVDMP MEMORY IS UNDUMPABLE
22530: ZER WA NO ERROR MESSAGE
22531: MOV TTERL,TTLST SEND MESSAGE TO TERML IF POSSIBLE
22532: BRN STOPR GIVE UP
22533: TTL S P I T B O L -- ERROR SECTION
22534: *
22535: * THIS SECTION OF CODE IS ENTERED WHENEVER A PROCEDURE
22536: * RETURN VIA AN ERR PARAMETER OR AN ERB OPCODE IS OBEYED.
22537: *
22538: * (WA) IS THE ERROR CODE
22539: *
22540: * THE GLOBAL VARIABLE STAGE INDICATES THE POINT AT WHICH
22541: * THE ERROR OCCURED AS FOLLOWS.
22542: *
22543: * STAGE=STGIC ERROR DURING INITIAL COMPILE
22544: *
22545: * STAGE=STGXC ERROR DURING COMPILE AT EXECUTE
22546: * TIME (CODE, CONVERT FUNCTION CALLS)
22547: *
22548: * STAGE=STGEV ERROR DURING COMPILATION OF
22549: * EXPRESSION AT EXECUTION TIME
22550: * (EVAL, CONVERT FUNCTION CALL).
22551: *
22552: * STAGE=STGXT ERROR AT EXECUTE TIME. COMPILER
22553: * NOT ACTIVE.
22554: *
22555: * STAGE=STGCE ERROR DURING INITIAL COMPILE AFTER
22556: * SCANNING OUT THE END LINE.
22557: *
22558: * STAGE=STGXE ERROR DURING COMPILE AT EXECUTE
22559: * TIME AFTER SCANNING END LINE.
22560: *
22561: * STAGE=STGEE ERROR DURING EXPRESSION EVALUATION
22562: *
22563: SEC START OF ERROR SECTION
22564: *
22565: ERROR RTN ERROR CODE ENTRY POINT
22566: BGE ERRFT,=NUM03,ERR16 SKIP IF TOO MANY FATALS
22567: BEQ R$CIM,=CMLAB,ERRG1 JUMP IF ERROR IN LABEL SCAN
22568: MOV WA,KVERT SAVE ERROR CODE
22569: ZER SCNRS RESET RESCAN SWITCH FOR SCANE
22570: ZER SCNGO RESET GOTO SWITCH FOR SCANE
22571: MOV STAGE,XR LOAD CURRENT STAGE
22572: BSW XR,STGNO JUMP TO APPROPRIATE ERROR CIRCUIT
22573: IFF STGIC,ERR01 INITIAL COMPILE
22574: IFF STGXC,ERR08 EXECUTE TIME COMPILE
22575: IFF STGEV,ERR08 EVAL COMPILING EXPR.
22576: IFF STGEE,ERR08 EVAL EVALUATING EXPR
22577: IFF STGXT,ERR12 EXECUTE TIME
22578: IFF STGCE,ERR01 COMPILE - AFTER END
22579: IFF STGXE,ERR08 XEQ COMPILE-PAST END
22580: ESW END SWITCH ON ERROR TYPE
22581: *
22582: * ERROR DURING INITIAL COMPILE
22583: * THE ERROR MESSAGE IS PRINTED AS PART OF THE COMPILER
22584: * OUTPUT. THIS PRINTOUT INCLUDES THE OFFENDING LINE (IF NOT
22585: * PRINTED ALREADY) AND AN ERROR FLAG UNDER THE APPROPRIATE
22586: * COLUMN AS INDICATED BY SCNSE UNLESS SCNSE IS SET TO ZERO.
22587: * AFTER PRINTING THE MESSAGE, THE GENERATED CODE IS
22588: * MODIFIED TO AN ERROR CALL AND CONTROL IS RETURNED TO
22589: * THE CMPIL PROCEDURE AFTER RESETTING THE STACK POINTER.
22590: * IF THE ERROR OCCURS AFTER THE END LINE, CONTROL RETURNS
22591: * IN A SLIGHTLY DIFFERENT MANNER TO ENSURE PROPER CLEANUP.
22592: EJC
22593: *
22594: ERR01 MOV CMPXS,XS RESET STACK POINTER
22595: SSL CMPSS RESTORE S-R STACK PTR FOR CMPIL
22596: BNZ ERRSP,ERR06 JUMP IF ERROR SUPPRESS FLAG SET
22597: JSR PRTFH PRINT A BLANK
22598: MOV TTERL,TTLST SET FLAG FOR LISTR
22599: ADD =NUM03,LSTLC CAUSE EJECT IF BELOW 4 LINES LEFT
22600: MOV LSTLC,-(XS) KEEP LINE COUNT
22601: JSR LISTR LIST LINE
22602: JSR PRTFH TERMINATE LISTING
22603: MOV (XS)+,WA RECOVER LINE COUNT
22604: BGT LSTLC,WA,ERR02 SKIP IF NOT NEW PAGE
22605: ADD =NUM04,LSTLC BUMP FOR LINES PRINTED
22606: *
22607: * PRINT FLAG UNDER BAD ELEMENT
22608: *
22609: ERR02 MOV SCNSE,WA LOAD SCAN ELEMENT OFFSET
22610: .IF .CAHT
22611: MOV WA,WB COPY OFFSET
22612: ICV WA INCREASE FOR CH$EX
22613: JSR ALOCS STRING BLOCK FOR ERROR FLAG
22614: MOV XR,WA REMEMBER STRING PTR
22615: PSC XR READY FOR CHARACTER STORING
22616: BZE WB,ERR05 SKIP IF NO BLANKS BEFORE ERROR FLAG
22617: MOV R$CIM,XL POINT TO BAD STATEMENT
22618: PLC XL READY TO GET CHARS
22619: LCT WB,WB LOOP COUNTER
22620: *
22621: * LOOP TO REPLACE ALL CHARS BUT TABS BY BLANKS
22622: *
22623: ERR03 LCH WC,(XL)+ GET NEXT CHAR
22624: BEQ WC,=CH$HT,ERR04 SKIP IF TAB
22625: MOV =CH$BL,WC GET A BLANK
22626: EJC
22627: *
22628: * MERGE TO STORE BLANK OR TAB IN ERROR LINE
22629: *
22630: ERR04 SCH WC,(XR)+ STORE CHAR
22631: BCT WB,ERR03 LOOP
22632: EJC
22633: *
22634: * MERGE IN CASE OF NO PRECEDING BLANKS
22635: *
22636: ERR05 MOV =CH$EX,XL EXCLAMATION MARK
22637: SCH XL,(XR) STORE AT END OF ERROR LINE
22638: CSC XR END OF SCH LOOP
22639: MOV =STNPD,PROFS ALLOW FOR STATEMENT NUMBER
22640: MOV WA,XR POINT TO ERROR LINE
22641: JSR PRTST PRINT ERROR LINE
22642: .ELSE
22643: MTI PRLEN GET PRINT BUFFER LENGTH
22644: STI GTNSI STORE AS SIGNED INTEGER
22645: ADD =STNPD,WA ADJUST FOR STATEMENT NUMBER
22646: MTI WA COPY TO INTEGER ACCUMULATOR
22647: RMI GTNSI REMAINDER MODULO PRINT BFR LENGTH
22648: MFI PROFS USE AS CHARACTER OFFSET
22649: MOV =CH$EX,WA GET EXCLAMATION MARK
22650: JSR PRTCH GENERATE UNDER BAD COLUMN
22651: .FI
22652: *
22653: * HERE AFTER PLACING ERROR FLAG AS REQUIRED
22654: *
22655: JSR ERMSG GENERATE FLAG AND ERROR MESSAGE
22656: ZER TTLST REVERT TO REGULAR LISTING
22657: ZER XR IN CASE OF FATAL ERROR
22658: ICV CMERC BUMP ERROR COUNT
22659: BNE STAGE,=STGIC,ERRG2 SPECIAL RETURN IF AFTER END LINE
22660: *
22661: * IF ERROR IN READR THEN EITHER CLOSE OUT
22662: * CURRENT -COPY LEVEL, OR IF AT TOP THEN ABORT
22663: *
22664: BZE RDRER,ERR06 SKIP IF NOT ERROR WHILE READING
22665: BZE R$COP,ERR16 ABORT IF AT TOP LEVEL INPUT FILE
22666: ZER RDRER ELSE CLEAR READR ERROR FLAG
22667: JSR COPND AND CLOSE OUT THIS COPY LEVEL
22668: *
22669: * LOOP TO SCAN TO END OF STATEMENT
22670: *
22671: ERR06 MOV R$CIM,XR POINT TO START OF IMAGE
22672: BZE XR,ERR07 SKIP IF NO INPUT IMAGE
22673: PLC XR POINT TO FIRST CHAR
22674: LCH XR,(XR) GET FIRST CHAR
22675: BEQ XR,=CH$MN,ERRG3 JUMP IF ERROR IN CONTROL CARD
22676: ZER SCNRS CLEAR RESCAN FLAG
22677: MNZ ERRSP SET ERROR SUPPRESS FLAG
22678: JSR SCANE SCAN NEXT ELEMENT
22679: BNE XL,=T$SMC,ERR06 LOOP BACK IF NOT STATEMENT END
22680: ZER ERRSP CLEAR ERROR SUPPRESS FLAG
22681: EJC
22682: *
22683: * GENERATE ERROR CALL IN CODE AND RETURN TO CMPIL
22684: *
22685: ERR07 MOV *CDCOD,CWCOF RESET OFFSET IN CCBLK
22686: MOV =OCER$,WA LOAD COMPILE ERROR CALL
22687: JSR CDWRD GENERATE IT
22688: MOV CWCOF,CMSOC(XS) SET SUCCESS FILL IN OFFSET
22689: MNZ CMFFC(XS) SET FAILURE FILL IN FLAG
22690: JSR CDWRD GENERATE SUCC. FILL IN WORD
22691: JMG CMPSE MERGE TO GENERATE ERROR AS CDFAL
22692: EJC
22693: *
22694: * ERROR DURING EXECUTE TIME COMPILE OR EXPRESSION EVALUATION.
22695: *
22696: * EXECUTE TIME COMPILATION IS INITIATED THROUGH GTCOD OR
22697: * GTEXP WHICH ARE CALLED BY COMPILE, CODE OR EVAL.
22698: * BEFORE CAUSING STATEMENT FAILURE THROUGH EXFAL IT IS
22699: * HELPFUL TO SET KEYWORD ERRTEXT AND FOR GENERALITY
22700: * THESE ERRORS MAY BE HANDLED BY THE SETEXIT MECHANISM.
22701: *
22702: ERR08 JSR COPND CALL TO CLOSE OFF THIS LEVEL
22703: BNZ R$COP,ERR08 LOOP IF NOT ALL -COPYS CLOSED
22704: ZER R$CCB FORGET GARBAGE CODE BLOCK
22705: SSL INISS RESTORE MAIN PROG S-R STACK PTR
22706: JSR ERTEX GET FAIL MESSAGE TEXT
22707: DCA XS ENSURE STACK OK ON LOOP START
22708: *
22709: * POP STACK UNTIL FIND FLPTR FOR MOST DEEPLY NESTED PROG.
22710: * DEFINED FUNCTION CALL OR CALL OF EVAL / CODE.
22711: *
22712: ERR09 ICA XS POP STACK
22713: BEQ XS,FLPRT,ERR11 JUMP IF PROG DEFINED FN CALL FOUND
22714: BNE XS,GTCEF,ERR09 LOOP IF NOT EVAL OR CODE CALL YET
22715: MOV =STGXT,STAGE RE-SET STAGE FOR EXECUTE
22716: MOV R$GTC,R$COD RECOVER CODE PTR
22717: MOV XS,FLPTR RESTORE FAIL POINTER
22718: ZER R$CIM FORGET POSSIBLE IMAGE
22719: *
22720: * TEST ERRLIMIT
22721: *
22722: ERR10 BNZ KVERL,ERR14 JUMP IF ERRLIMIT NON-ZERO
22723: BRN EXFAL FAIL
22724: *
22725: * RETURN FROM PROG. DEFINED FUNCTION IS OUTSTANDING
22726: *
22727: ERR11 MOV FLPTR,XS RESTORE STACK FROM FLPTR
22728: BRN ERR10 MERGE
22729: *
22730: * ERROR AT EXECUTE TIME.
22731: *
22732: * THE ACTION TAKEN ON AN ERROR IS AS FOLLOWS.
22733: *
22734: * IF ERRLIMIT KEYWORD IS ZERO, THE RUN IS ABORTED.
22735: * OTHERWISE, ERRLIMIT IS DECREMENTED AND AN ERRTYPE TRACE
22736: * GENERATED IF REQUIRED. CONTROL RETURNS EITHER VIA A JUMP
22737: * TO CONTINUE (TO TAKE THE FAILURE EXIT) OR A SPECIFIED
22738: * SETEXIT TRAP IS EXECUTED AND CONTROL PASSES TO THE TRAP.
22739: * IF 3 OR MORE FATAL ERRORS OCCUR AN ABORT OCCURS
22740: * REGARDLESS OF ERRLIMIT AND SETEXIT - LOOPING IS ALL TOO
22741: * PROBABLE OTHERWISE. FATAL ERRORS INCLUDE STACK OVERFLOW
22742: * AND EXCEEDING STLIMIT.
22743: EJC
22744: *
22745: ERR12 SSL INISS RESTORE MAIN PROG S-R STACK PTR
22746: BNZ DMVCH,ERR15 JUMP IF IN MID-DUMP
22747: *
22748: * MERGE HERE AFTER DUMP TIDY UP
22749: *
22750: ERR13 ZER XR CLEAR XR FLAG
22751: BZE KVERL,STOPR ABORT IF ERRLIMIT IS ZERO
22752: JSR ERTEX GET FAIL MESSAGE TEXT
22753: *
22754: * MERGE AFTER ERRLIMIT TEST
22755: *
22756: ERR14 DCV KVERL DECREMENT ERRLIMIT
22757: MOV R$ERT,XL LOAD ERRTYPE TRACE POINTER
22758: JSR KTREX GENERATE ERRTYPE TRACE IF REQUIRED
22759: MOV R$COD,R$CNT SET CDBLK PTR FOR CONTINUATION
22760: MOV FLPTR,XR SET PTR TO FAILURE OFFSET
22761: MOV (XR),STXOF SAVE FAILURE OFFSET FOR CONTINUE
22762: MOV R$SXC,XR LOAD SETEXIT CDBLK POINTER
22763: BZE XR,ERRG4 CONTINUE IF NO SETEXIT TRAP
22764: ZER R$SXC ELSE RESET TRAP
22765: MOV =NULLS,STXVR RESET SETEXIT ARG TO NULL
22766: MOV (XR),XL LOAD PTR TO CODE BLOCK ROUTINE
22767: BRI XL EXECUTE FIRST TRAP STATEMENT
22768: *
22769: * INTERRUPTED PARTLY THROUGH A DUMP WHILST STORE IS IN A
22770: * MESS SO DO A TIDY UP OPERATION. SEE DUMPR FOR DETAILS.
22771: *
22772: ERR15 MOV DMVCH,XR CHAIN HEAD FOR AFFECTED VRBLKS
22773: BZE XR,ERR13 DONE IF ZERO
22774: MOV (XR),DMVCH SET NEXT LINK AS CHAIN HEAD
22775: JSR SETVR RESTORE VRGET FIELD
22776: BRN ERR15 LOOP THROUGH CHAIN
22777: *
22778: * TAKE DRACONIAN STEPS FOR REPEATED FATAL ERRORS
22779: *
22780: ERR16 MOV ERRTF,WA ERROR CODE
22781: MOV WA,KVERT PLACE ERROR CODE FOR ERMSG
22782: MNZ XR IN CASE COMPILE TIME
22783: BEQ STAGE,=STGIC,STOPR JUMP IF SO
22784: BEQ STAGE,=STGCE,STOPR ALSO COMPILE TIME
22785: ZER XR INDICATE EXECUTION
22786: BRN STOPR TERMINATE RUN
22787: *
22788: ERRAF ERB 251,TOO MANY FATAL ERRORS
22789: *
22790: * HERE FOR GLOBAL ERROR JUMPS
22791: *
22792: ERRG1 JMG CMPLE
22793: ERRG2 JMG CMPEE
22794: ERRG3 JMG CMPCE
22795: ERRG4 JMG LCNXE
22796: TTL S P I T B O L -- HERE ENDETH THE CODE
22797: *
22798: * END OF ASSEMBLY
22799: *
22800: END END MACRO-SPITBOL ASSEMBLY
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.